# 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
mov %dl, drive_number
- call setup_serial
-
call get_drive_chs
mov $loading_msg, %si
print_char:
push %es
- push %ax
cmp $10, %ax
jnz 0f
mov $32, %ax
movb $7, %es:1(%di)
incw cursor_x
- pop %ax
- call ser_putchar
pop %es
ret
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_CLEAR, 0x07
- .set MCTL_DTR_RTS_OUT2, 0x0b
- .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_CLEAR, %al
- mov $UART_FIFO, %dx
- out %al, %dx
- # assert RTS and DTR
- mov $MCTL_DTR_RTS_OUT2, %al
- mov $UART_MCTL, %dx
- out %al, %dx
- ret
-
- # expects a character in al
-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
-wait: in %dx, %al
- and $LST_TREG_EMPTY, %al
- jz wait
- mov $UART_DATA, %dx
- mov %ah, %al
- out %al, %dx
-
- pop %dx
- ret
-
.org 510
.byte 0x55
.byte 0xaa