section .loader
extern startup
-
extern _ldr_main_start
extern _main_start
extern _main_size
+%include 'macros.inc'
+
[bits 16]
global _start
_start:
jmp exit
.notvm86:
+ call setup_serial
call enable_a20
; calculate GDT linear address
call 8:startup
+ PMPRINT 'X'
+ PMPRINT 'Y'
+ PMPRINT 'Z'
+ PMPRINT 'Z'
+ PMPRINT 'Y'
+ PMPRINT 13
+ PMPRINT 10
+
; return to real mode
jmp 28h:.rm
exit: mov ax, 4c00h
int 21h
+dbg_inpm db 'DBG: in pmode',10,0
+dbg_retrm db 'DBG: returning to real mode...',10,0
+
str_errvm86 db 'Error: memory manager detected! Stop it and try again (e.g. emm386 off)',10,0
str_enterpm db 'Entering 32bit protected mode ...',10,0
jnz kbc_wait_write
ret
+UART_BASE equ 2f8h ; COM1: 3f8, COM2: 2f8
+UART_DIVISOR equ 115200 / 9600 ; 9600 baud
+setup_serial:
+ ; set clock divisor
+ mov dx, UART_BASE + 3 ; LCTL
+ mov al, 80h ; DLAB
+ out dx, al
+ mov dx, UART_BASE ; DIVLO
+ mov al, UART_DIVISOR & 0xff
+ out dx, al
+ inc dx ; DIVHI
+ mov al, UART_DIVISOR >> 8
+ out dx, al
+ mov dx, UART_BASE + 3 ; LCTL
+ mov al, 3 ; 8n1
+ out dx, al
+ inc dx ; MCTL
+ mov al, 0xb ; DTR/RTS/OUT2
+ out dx, al
+ ret
+
+ser_putchar:
+ SER_PUTCHAR
+ ret
+
+ser_printstr:
+ lodsb
+ test al, al
+ jz .end
+ cmp al, 10
+ jnz .nolf
+ push ax
+ mov al, 13
+ call ser_putchar
+ pop ax
+.nolf: call ser_putchar
+ jmp ser_printstr
+.end: ret
+
printstr:
lodsb
test al, al
cmp al, 10 ; check for line-feed and insert CR before it
jnz .nolf
push ax
+ mov al, 13
+ call ser_putchar
mov dl, 13
mov ah, 2
int 21h
pop ax
-.nolf: mov ah, 2
+.nolf: call ser_putchar
+ mov ah, 2
mov dl, al
int 21h
jmp printstr
.end: ret
+ [bits 32]
+ser_putchar_pmode:
+ SER_PUTCHAR
+ ret
+
+ser_putstr_pmode:
+ lodsb
+ test al, al
+ jz .end
+ cmp al, 10
+ jnz .nolf
+ push ax
+ mov al, 13
+ call ser_putchar_pmode
+ pop ax
+.nolf: call ser_putchar_pmode
+ jmp ser_putstr_pmode
+.end: ret
+
align 4
enterpm dd 0xbad00d ; space for linear address for far jump to pmode
enterpm_sel dw 8 ; selector for far jump to protected mode