;Code by roticv
;Many thanks to Sentient since this is based on his NEXU OS

format binary
use16
org 7c00h

	jmp	start
	nop

BS_OEMName		DB "MSWIN4.1"
BPB_BytsPerSec		DW 512
BPB_SecPerClus		DB 1
BPB_RsvdSecCnt		DW 1
BPB_NumFATs		DB 2
BPB_RootEntCnt		DW 224
BPB_TotSec16		DW 2880
BPB_Media		DB 0F0h
BPB_FATSz16		DW 9
BPB_SecPerTrk		DW 18
BPB_NumHeads		DW 02
BPB_HiddSec		DD 0
BPB_TotSec32		DD 0

BS_DrvNum		DB 0
BS_Reserved1		DB 0
BS_BootSig		DB 29h
BS_VolID		DD 061746f69h	      ;Iota in hex
BS_VolLab		DB "IOTA       "
BS_FilSysType		DB "FAT12   "

    start:
	cli
	mov	[BS_DrvNum],dl
	xor	ax, ax
	mov	es, ax
	mov	ds, ax
;=======================
;Reset FDD (ah = 0)
;=======================
	int	13h
;=======================
;Load FAT sectors
;=======================
	mov	si, floppyerror
	mov	bx, 7e00h
	mov	dl, [BS_DrvNum]
	mov	dh, 0
	mov	cl, 2
	mov	ch, 0
	mov	ah, 2
	mov	al, 9
	int	13h
	jc	PrintString
;=======================
;Load Root Directory
;=======================
	mov	bx, 9000h
	mov	dl, [BS_DrvNum]
	mov	dh, 1
	mov	cl, 2
	mov	ch, 0
	mov	ah, 2
	mov	al, 14
	int	13h
	jc	PrintString
;========================
;Find kernel
;========================
	mov	di, 9000h
   .next:
	mov	si, Kernel
	mov	dx, di
	mov	cx, stringlen
	rep	cmpsb
	mov	di, dx
	jz	.found
	add	di, 32
	dec	[BPB_RootEntCnt]
	jnz	.next
	mov	si, kernelerror
	jmp	PrintString

    .found:
	mov	ax, [di+1ah]
	mov	[readcluster],ax
    .read:
	mov	si, floppyerror
	mov	ax,[readcluster]
	add	ax, 31
	xor	dx, dx
	div	[BPB_SecPerTrk]
	inc	dl
	mov	cl, dl
	xor	dx, dx
	div	[BPB_NumHeads]
	mov	dh, dl
	mov	ch, al
	mov	bx, 0ac00h
	mov	dl, [BS_DrvNum]
	mov	ah, 2
	mov	al, 1
	int	13h
	jc	PrintString
	add	bx, 200h
	mov	ax, [readcluster]
	mov	di, ax
	shr	di, 1
	add	di, ax		   ;di *= 3
	add	di, 7e00h
	mov	bx, [es:di]
	and	[readcluster], 1
	jnz	.oddcluster
    .evencluster:
	and	bx, 0fffh	   ;12 bits
	mov	[readcluster],bx
	cmp	bx, 0ff0h
	jc	.read
	jmp	.end
    .oddcluster:
	shr	bx, 4
	mov	[readcluster],bx
	cmp	bx, 0ff0h
	jc	.read
    .end:
;==========================
;Check RAM size
;==========================
	mov	ax, 0e801h
	int	15h
	test	ax, ax
	jnz	.good
	test	bx, bx
	jnz	.good
	mov	ax, cx
	mov	bx, dx
    .good:
	shr	bx, 10
	shl	dx, 6
	add	cx, dx
	adc	bx, 0
	mov	[600h],cx	       ;600h = ram size in kb
	mov	[600h+2],bx
;==========================
;Enable A20
;==========================
	call	Empty8024
	in	al, 0d1h
	out	64h, al
	call	Empty8024
	in	al, 0dfh
	out	60h, al
;===================================
;Set up gdt and switch to protected
;===================================
	lgdt	[gdt]
	mov	eax, cr0
	or	eax, 1
	mov	cr0, eax
	db 67h
	db 66h
	db 0eah
	dd 0ac00h
	dw 08h		;code segment

Empty8024:
	in	al, 64h
	test	al, 1
	jz	.empty1
	in	al, 60h
	jmp	Empty8024
    .empty1:
	test	al, 2
	jnz	Empty8024
	retn	4

PrintString:
	mov	ah, 0eh
    @@:
	lodsb
	test	al ,al
	jz	@F
	int	10h
	jmp	@B
    @@:
	cli
	hlt

;print:
;        mov     dx, si
;        mov     si, di
;        mov     ah, 0eh
;     @@:
;        lodsb
;        test    al ,al
;        jz      @F
;        int     10h
;        jmp     @B
;     @@:
;        mov     si, dx
;        retn 4
;printhex:
;                mov   cx, 4
;PrintDigit:
;                rol   dx, 4
;                mov   ax, 0E0Fh
;                and   al, dl
;                add   al, 90h
;                daa
;                adc   al, 40h
;                daa
;                int   10h
;                loop  PrintDigit
;                ret

readcluster dw 0
floppyerror db "[Error] Disk Read Error",0
kernelerror db "[Error] Kernel Not Found",0
Kernel db "LOAD32"
stringlen = $-Kernel

gdt:
	dw 4*8-1	      ;4 entries
	dd .base
.base:
	dd 0		      ;empty entry
	dd 0
;========================
;Code Segment (4GB) 8h
;========================
	dw 0ffffh
	dw 0
	db 0
	db 9ah
	db 0cfh
	db 0
;========================
;Data Segment (4GB) 10h
;========================
	dw 0ffffh
	dw 0
	db 0
	db 92h
	db 0cfh
	db 0
;========================
;Stack Segment (4GB) 14h
;========================
	dw 0ffffh
	dw 0
	db 0
	db 92h
	db 0cfh
	db 0

times 510+7c00h-$ db 0
db 55h,0aah ; boot signature


