mov ds, ax
mov es, ax
mov fs, ax ; this will store the original real mode segment
- mov ss, ax
; modify the return to real mode jump segment
mov [.jmpcs16 + 3], ax
- xor ax, ax
+ ; put the stack on the next segment, should be free
+ add ax, 1000h
+ mov ss, ax
+ mov ax, 0xfffe
mov sp, ax
%ifdef BUG_WARNING
mov ax, 13h
int 10h
+ cli ; paranoid
lgdt [gdt_lim]
mov eax, cr0
mov ss, ax
; restore real-mode IVT
- lidt [rmidt]
+ o32 lidt [rmidt]
; switch back to text mode
mov ax, 3
mov ax, 1
call far [vmswitch]
; broadcast windows exit
+ xor ax, ax
+ mov bx, ax
+ mov si, ax
+ mov es, ax
+ mov ds, ax
+ mov cx, ax
+ mov dx, ax
mov ax, 1606h
- xor dx, dx
int 2fh
exit: mov ax, 4c00h
str_errvm86 db 'Error: memory manager running. Stop it and try again (e.g. emm386 off)',10,0
str_enterpm db 'Entering 32bit protected mode ...',10,0
+ align 4
vmswitch:
vmswitch_off dw 0
vmswitch_seg dw 0
str_ok db 'OK',10,0
str_fail db 'failed',10,0
memdet_fail_msg db 'Failed to detect available memory!',10,0
-memdet_detram db 'Detecting RAM '
+memdet_detram db 'Detecting RAM ',0
memdet_e820_msg db '(BIOS 15h/0xe820)... ',0
memdet_e801_msg db '(BIOS 15h/0xe801)... ',0
memdet_88_msg db '(BIOS 15h/0x88, max 64mb)... ',0
rmidt: dw 3ffh ; IVT limit (1kb / 256 entries)
dd 0 ; IVT base 0
+
+; --- debug ---
+newline:
+ push ax
+ mov al, 13
+ call ser_putchar
+ mov al, 10
+ call ser_putchar
+ pop ax
+ ret
+
+printhex:
+ rol ax, 4
+ call print_hexdigit
+ rol ax, 4
+ call print_hexdigit
+ rol ax, 4
+ call print_hexdigit
+ rol ax, 4
+ call print_hexdigit
+ ret
+
+print_hexdigit:
+ push ax
+ and ax, 0xf
+ cmp al, 0xa
+ jae .hexdig
+ add al, '0'
+ call ser_putchar
+ pop ax
+ ret
+.hexdig:add al, 'a' - 10
+ call ser_putchar
+ pop ax
+ ret
+
; vi:set ts=8 sts=8 sw=8 ft=nasm: