backported fixes from 256boss:
[bootcensus] / src / boot / boot.s
index 7f8ee68..4f0023a 100644 (file)
@@ -1,5 +1,21 @@
+# pcboot - bootable PC demo/game kernel
+# Copyright (C) 2018-2019  John Tsiombikas <nuclear@member.fsf.org>
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
        .code16
-       .section .boot,"a"
+       .section .boot,"ax"
 
        .set stack_top, 0x7be0
        .set read_retries, 0x7be8
@@ -21,8 +37,6 @@ boot:
 
        mov %dl, drive_number
 
-       call setup_serial
-
        call get_drive_chs
 
        mov $loading_msg, %si
@@ -32,6 +46,7 @@ boot:
        mov $_boot2_size, %eax
        call print_num
 
+       mov $_boot2_size, %eax
        mov %eax, %ebx
        shr $9, %eax
        and $0x1ff, %ebx
@@ -48,15 +63,16 @@ boot:
        call read_sectors
        jmp boot2_addr
 
-       .set ARG_NSECT, 6
-       .set ARG_SIDX, 4
-
 loading_msg: .asciz "\nLoad "
-driveno_msg: .asciz "Drive: "
+driveno_msg: .asciz "Drv:"
 
+       .global sect_per_track
 sect_per_track: .short 18
+       .global num_cylinders
 num_cylinders: .short 80
+       .global num_heads
 num_heads: .short 2
+       .global heads_mask
 heads_mask: .byte 1
 
 get_drive_chs:
@@ -71,10 +87,10 @@ get_drive_chs:
 
        mov $8, %ah
        int $0x13
-       jnc .Lok
+       jnc ok
        ret
 
-.Lok:  xor %eax, %eax
+ok:    xor %eax, %eax
        mov %ch, %al
        mov %cl, %ah
        rol $2, %ah
@@ -101,6 +117,10 @@ get_drive_chs:
        call print_num
        ret
 
+
+       .set ARG_NSECT, 6
+       .set ARG_SIDX, 4
+
 # read_sectors(first, num)
 read_sectors:
        push %bp
@@ -130,7 +150,7 @@ read_sector:
 
        movw $3, read_retries
 
-.Lread_try:
+read_try:
        # calculate the track (sidx / sectors_per_track)
        mov 4(%bp), %ax
 
@@ -162,22 +182,22 @@ read_sector:
        mov $0x0201, %ax
        movb drive_number, %dl
        int $0x13
-       jnc .Lread_ok
+       jnc read_ok
 
        # abort after 3 attempts
        decw read_retries
-       jz .Lread_fail
+       jz read_fail
 
        # error detected, reset controller and retry
        xor %ah, %ah
        int $0x13
-       jmp .Lread_try
+       jmp read_try
 
-.Lread_fail:
+read_fail:
        mov 4(%bp), %ax
        jmp abort_read
 
-.Lread_ok:
+read_ok:
        mov $46, %ax
        call print_char
 
@@ -193,7 +213,7 @@ read_sector:
        pop %bp
        ret
 
-str_read_error: .asciz "rderr: "
+str_read_error: .asciz "rderr:"
 
 abort_read:
        mov $str_read_error, %si
@@ -210,18 +230,23 @@ print_str:
 
 0:     mov (%si), %al
        cmp $0, %al
-       jz .Lend
+       jz end
        call print_char
        inc %si
        jmp 0b
 
-.Lend: popa
+end:   popa
        ret
 
        # expects character in al
 print_char:
        push %es
-       pushw $0xb800
+
+       cmp $10, %ax
+       jnz 0f
+       mov $32, %ax
+
+0:     pushw $0xb800
        pop %es
        movw cursor_x, %di
        shl $1, %di
@@ -230,7 +255,6 @@ print_char:
        movb $7, %es:1(%di)
        incw cursor_x
 
-       call ser_putchar
        pop %es
        ret
 
@@ -243,14 +267,14 @@ print_num:
        movw $scratchbuf + scratchbuf_size, %si
        movb $0, (%si)
        mov $10, %ebx
-.Lconvloop:
+convloop:
        xor %edx, %edx
        div %ebx
        add $48, %dl
        dec %si
        mov %dl, (%si)
        cmp $0, %eax
-       jnz .Lconvloop
+       jnz convloop
 
        call print_str
 
@@ -258,78 +282,6 @@ print_num:
        popa
        ret
 
-       .set UART_DATA, 0x3f8
-       .set UART_DIVLO, 0x3f8
-       .set UART_DIVHI, 0x3f9
-       .set UART_FIFO, 0x3fa
-       .set UART_LCTL, 0x3fb
-       .set UART_MCTL, 0x3fc
-       .set UART_LSTAT, 0x3fd
-       .set DIV_9600, 115200 / 9600
-       .set LCTL_8N1, 0x03
-       .set LCTL_DLAB, 0x80
-       .set FIFO_ENABLE, 0x01
-       .set FIFO_SEND_CLEAR, 0x04
-       .set FIFO_RECV_CLEAR, 0x02
-       .set MCTL_DTR, 0x01
-       .set MCTL_RTS, 0x02
-       .set MCTL_OUT2, 0x08
-       .set LST_TREG_EMPTY, 0x20
-
-setup_serial:
-       # set clock divisor
-       mov $LCTL_DLAB, %al
-       mov $UART_LCTL, %dx
-       out %al, %dx
-       mov $DIV_9600, %ax
-       mov $UART_DIVLO, %dx
-       out %al, %dx
-       shr $8, %ax
-       mov $UART_DIVHI, %dx
-       out %al, %dx
-       # set format 8n1
-       mov $LCTL_8N1, %al
-       mov $UART_LCTL, %dx
-       out %al, %dx
-       # clear and enable fifo
-       mov $FIFO_ENABLE, %al
-       or $FIFO_SEND_CLEAR, %al
-       or $FIFO_RECV_CLEAR, %al
-       mov $UART_FIFO, %dx
-       out %al, %dx
-       # assert RTS and DTR
-       mov $MCTL_DTR, %al
-       or $MCTL_RTS, %al
-       or $MCTL_OUT2, %al
-       mov $UART_MCTL, %dx
-       out %al, %dx
-       ret
-
-       # expects a character in al
-       .global ser_putchar
-ser_putchar:
-       push %dx
-
-       cmp $10, %al
-       jnz 0f
-       push %ax
-       mov $13, %al
-       call ser_putchar
-       pop %ax
-
-0:     mov %al, %ah
-       # wait until the transmit register is empty
-       mov $UART_LSTAT, %dx
-.Lwait:        in %dx, %al
-       and $LST_TREG_EMPTY, %al
-       jz .Lwait
-       mov $UART_DATA, %dx
-       mov %ah, %al
-       out %al, %dx
-
-       pop %dx
-       ret
-       
        .org 510
        .byte 0x55
        .byte 0xaa