porting over pcboot codebase
[com32] / src / loader.asm
index b0c13d6..68504f8 100644 (file)
@@ -1,11 +1,12 @@
        section .loader
 
        extern startup
-
        extern _ldr_main_start
        extern _main_start
        extern _main_size
 
+%include 'macros.inc'
+
        [bits 16]
        global _start
 _start:
@@ -31,6 +32,7 @@ _start:
        jmp exit
 
 .notvm86:
+       call setup_serial
        call enable_a20
 
        ; calculate GDT linear address
@@ -84,6 +86,14 @@ _start:
 
        call 8:startup
 
+       PMPRINT 'X'
+       PMPRINT 'Y'
+       PMPRINT 'Z'
+       PMPRINT 'Z'
+       PMPRINT 'Y'
+       PMPRINT 13
+       PMPRINT 10
+
        ; return to real mode
        jmp 28h:.rm
 
@@ -102,6 +112,9 @@ _start:
 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
 
@@ -189,6 +202,45 @@ kbc_wait_write:
        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
@@ -196,17 +248,39 @@ printstr:
        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