
BITS   16
jmp    MAIN

convert_sector:
push    bx
push    ax
mov bx, ax
mov dx, 0
div WORD  [SectorsPerTrack]
add dl, 01h
mov cl, dl
mov ax, bx
mov dx, 0
div WORD  [Sides]
mov dh, dl
mov ch, al
pop ax
pop bx
mov dl, BYTE [bootdrive]
ret

SectorsPerTrack dw  18
Sides   dw 0

reset_floppy:
mov ah, 0
mov dl, BYTE [bootdrive]
int 13h
ret

;IN= AH = 2, AL = CHAR, OUT = CHARACTER SCREEN
PRINT:
lodsb
cmp    al, 0
je     Done
mov    ah, 0eh
int    10h
jmp    PRINT

Done:
ret

MAIN:
cli 
mov ax, 0x0000
mov ss, ax
mov sp, 0xFFFF
sti

mov ax, 07C0h
mov ds, ax
mov es, ax

mov [bootdrive], dl

mov bx, buffer
mov cl, 2
mov ch, 0
mov dh, 1
mov ah, 2
mov al, 16
pusha
load_root:
int 13h
jnc loaded_root
call    reset_floppy
jmp load_root


loaded_root:
popa
;cmpsb ds:si with es:di
mov di, buffer
mov cx, 224
mov ax, 0
search_loop:
push    cx
pop dx
mov si, filename
mov cx, 11
rep cmpsb
je  found_file
add ax, 32
mov di, buffer
add di, ax
push    dx
pop cx
loop    search_loop
int 16h

found_file:
mov ax, WORD [di+16]
mov WORD [FirstSector], ax

mov bx, buffer
call    convert_sector
mov ah, 2
mov al, 9
pusha
load_fat:
int 13h
jnc loaded_fat

loaded_fat:
mov ah, 2
mov al, 1
push    ax

load_file_sector:
mov ax, WORD [FirstSector]
add ax, 31
call    convert_sector
mov ax, 2000h
mov es, ax
mov bx, WORD [Pointer]

pop ax
push   ax

int 13h
jnc calculate_next_sector
call    reset_floppy
jmp load_file_sector

calculate_next_sector:
mov ax, [FirstSector]
mov dx, 0
mov bx, 6
mul bx
mov bx, 4
div bx
mov si, buffer
add si, ax
mov ax, WORD [si]

or  dx, dx
jz even

odd:
shr ax, 4
jmp short  next_sector_calculated

even:
and ax, 0FFFh

next_sector_calculated:
mov WORD [FirstSector], ax
cmp ax, 0FF8h
jae end
add WORD [Pointer], 512
jmp load_file_sector

end:
pop ax
mov dl, BYTE [bootdrive]
jmp 0050h:0000h

bootdrive   db     0
msg         db     "Welcome to the TB-DOS prompt!", 0
filename    db     "KERNEL  BIN"
FirstSector dw     0
Pointer dw  0

times 510 - ($-$$) db 0

dw 0xAA55

buffer: 