[extern _meminfo_loc] detect_arch: ; detect CPUID pushfd pushfd xor dword [esp], 0x00200000 pop eax xor eax, [esp] popfd and eax, 0x00200000 jz .print_cpuid_error ; detect long mode mov eax, 0x80000001 cpuid and edx, 0x0020000000 jz .print_long_error ; APIC mov eax, 0x00000001 cpuid test edx, 0x00000200 jz .print_apic_error ; SSE (you might be able to remove this, I think it's a standard requirement) test edx, 0x2000000 jz .print_sse_error mov bx, .no_error mov cx, 0 call bios_print ; get memory mappings mov ax, 0 mov es, ax mov ax, _meminfo_loc mov di, ax mov eax, 0xe820 mov ebx, 0 mov ecx, 24 mov edx, 0x534d4150 int 0x15 jc .print_mem_error cmp eax, 0x534D4150 jne .print_mem_error .mem_detect_loop: add di, 24 mov [di + 20], dword 1 mov eax, 0xe820 mov ecx, 24 int 0x15 jc .mem_detected cmp ebx, 0 je .mem_detected jmp .mem_detect_loop .mem_detected: ret .print_cpuid_error: mov bx, .cpuid_error mov cx, 0 call bios_print jmp $ .print_long_error: mov bx, .arch_error mov cx, 0 call bios_print jmp $ .print_apic_error: mov bx, .apic_error mov cx, 0 call bios_print jmp $ .print_mem_error: mov bx, .mem_error mov cx, 0 call bios_print jmp $ .print_sse_error: mov bx, .sse_error mov cx, 0 call bios_print jmp $ .cpuid_error: db "No CPUID capabilitity", 0x0 .arch_error: db "This operating system was compiled to run in 64 bit mode!", 0x0 .apic_error: db "No apic support", 0x0 .mem_error: db "Could not get information on memory!", 0x0 .sse_error: db "This OS requires SSE", 0x0 .no_error: db "CPU info gathered!", 0x0