2023-07-10 03:05:34 -07:00
|
|
|
; Set up the segment registers
|
2023-10-10 01:12:56 -07:00
|
|
|
xor ax, ax
|
|
|
|
mov ds, ax
|
|
|
|
mov es, ax
|
|
|
|
|
|
|
|
; Set up stack and jump to main
|
|
|
|
mov ss, ax
|
|
|
|
mov sp, 0x7c00
|
|
|
|
jmp main
|
|
|
|
|
|
|
|
; Print 'Booting ClassicOS!' to the screen
|
|
|
|
print:
|
|
|
|
mov si, message
|
|
|
|
mov ah, 0x0e
|
|
|
|
.loop:
|
|
|
|
lodsb
|
|
|
|
test al, al
|
|
|
|
jz .done
|
|
|
|
int 0x10
|
|
|
|
jmp .loop
|
|
|
|
.done:
|
|
|
|
ret
|
|
|
|
|
|
|
|
; Set the video mode to a 40 column text mode
|
|
|
|
set_video_mode:
|
|
|
|
mov ax, 0x0003 ; Set up a 80x25 text mode
|
|
|
|
int 0x10
|
|
|
|
|
|
|
|
; Set the number of columns to 40
|
|
|
|
mov ax, 0x1112
|
|
|
|
mov bx, 0x0007
|
|
|
|
int 0x10
|
|
|
|
|
|
|
|
ret
|
|
|
|
|
|
|
|
; Detect floppy disk drive
|
|
|
|
detect_disk:
|
|
|
|
mov ah, 0x08
|
|
|
|
int 0x13
|
|
|
|
cmp ah, 0
|
|
|
|
jne .error
|
|
|
|
ret
|
|
|
|
|
|
|
|
.error:
|
|
|
|
; Handle disk detection error
|
|
|
|
; Display error message or take appropriate action
|
|
|
|
ret
|
|
|
|
|
|
|
|
; Read sectors from floppy disk
|
|
|
|
read_sectors:
|
|
|
|
mov ah, 0x02
|
|
|
|
mov al, 1 ; Number of sectors to read
|
|
|
|
mov ch, 0 ; Cylinder/Track number
|
|
|
|
mov cl, 2 ; Sector number (starting from 1)
|
|
|
|
mov dh, 0 ; Head number
|
|
|
|
mov dl, 0 ; Drive number (0 for floppy disk)
|
|
|
|
|
|
|
|
mov bx, buffer ; Destination buffer
|
|
|
|
mov es, bx
|
|
|
|
xor bx, bx
|
|
|
|
|
|
|
|
int 0x13
|
|
|
|
|
|
|
|
jc .error ; Check carry flag for error
|
|
|
|
ret
|
|
|
|
|
|
|
|
.error:
|
|
|
|
; Handle read error
|
|
|
|
; Display error message or take appropriate action
|
|
|
|
ret
|
|
|
|
|
|
|
|
; Bootloader entry point
|
|
|
|
main:
|
|
|
|
; Call the set_video_mode function
|
|
|
|
call set_video_mode
|
|
|
|
|
|
|
|
; Clear the screen
|
|
|
|
mov ah, 0x06
|
|
|
|
mov al, 0
|
|
|
|
xor bx, bx
|
|
|
|
xor cx, cx
|
|
|
|
mov dh, 24
|
|
|
|
mov dl, 39
|
|
|
|
int 0x10
|
|
|
|
|
|
|
|
; Call the print function
|
|
|
|
call print
|
|
|
|
|
|
|
|
; Wait for a key press to exit the loop
|
|
|
|
mov ah, 0x00
|
|
|
|
int 0x16
|
|
|
|
|
|
|
|
; Call the detect_disk function
|
|
|
|
call detect_disk
|
|
|
|
|
|
|
|
; Call the read_sectors function
|
|
|
|
call read_sectors
|
|
|
|
|
|
|
|
; Infinite loop
|
|
|
|
.loop:
|
|
|
|
jmp .loop
|
|
|
|
|
|
|
|
; Message to print
|
|
|
|
message db 'Booting ClassicOS!', 0
|
|
|
|
|
|
|
|
; Buffer to store read sectors
|
|
|
|
buffer times 512 db 0
|
|
|
|
|
|
|
|
times 510-($-$$) db 0
|
|
|
|
dw 0xaa55
|