[BITS 16]
SEGMENT START

;-------------------------------------------------------------------------------
; Share API
;-------------------------------------------------------------------------------

GLOBAL _oldses
GLOBAL _exit
GLOBAL _printf
GLOBAL _pause
GLOBAL _reboot
GLOBAL _graph
GLOBAL _text
GLOBAL _plot
GLOBAL _scanf
GLOBAL _cls
GLOBAL _runraw
GLOBAL _read
GLOBAL _strdef

EXTERN _main
EXTERN _splash

jmp normal

_oldses: jmp _main

normal:  cmp byte [firstboot],0
	 je _oldses
	 mov byte [firstboot],1
	 jmp _splash

;-------------------------------------------------------------------------------
; MINIT API
;-------------------------------------------------------------------------------

_graph:  mov ah,0x00		       ;GRAPH COMMAND
	 mov al,12h
	 int 0x10
	 ret

_text:	 mov ah,0x00		       ;TEXT COMMAND
	 mov al,3h
	 int 0x10
	 ret

_plot:	 push bp		       ;PLOT COMMAND
	 mov bp,sp
	 sub sp,0x40
	 mov ah,0x0C
	 mov al,[bp+4]
	 mov cx,[bp+6]
	 mov dx,[bp+8]
	 int 0x10
	 mov sp,bp
	 pop bp
	 ret

_printf: push bp		       ;PRINTF COMMAND
	 mov bp,sp
	 mov bl,3
	 sub sp,0x40
	 mov bx,[bp+4]
	 mov si, bx
	 call print
	 mov sp,bp
	 pop bp
	 ret

_pause:  mov ah, 0		       ;PAUSE COMMAND
	 int 0x16
	 mov sp,bp
	 pop bp
	 ret

_reboot: jmp 0xffff:0x0000	       ;REBOOT COMMAND

_scanf: 			       ;SCANF COMMAND
	mov di,scanfbuf
	mov cx,64
	mov dx, di
nextkey:
	xor ax, ax
	int 16h
	cmp al, 13
	je endscan
	cmp al, 8
	je backspace
	mov bx, di
	sub bx, dx
	cmp bx, cx
	jae nextkey
	mov ah, 0Eh
	mov bx, 0001h
	int 10h
	cmp al, 65
	jb putscrn
	cmp al, 90
	ja putscrn
	add al, 32
putscrn:stosb
	jmp nextkey
backspace:
	dec di
	mov al, 8
	mov ah, 0Eh
	mov bx, 0001h
	int 10h
	mov al, 32
	mov ah, 0Eh
	mov bx, 0001h
	int 10h
	mov al, 8
	mov ah, 0Eh
	mov bx, 0001h
	int 10h
	jmp nextkey
endscan:mov cx, di
	sub cx, dx
	xor al,al
	stosb
	xor ax, ax
	mov si,scanfbuf
	mov ax,si
	mov dx,si
	ret

_cls:	mov ah,0x00		       ;CLEAR COMMAND
	mov al,0x03
	int 0x10
	ret

_runraw:push bp 		       ;RUN COMMAND
	mov bp,sp
	sub sp,0x40
	mov bx,[bp+4]
	mov si,fname
	mov si, bx
	mov [cs:lfv_dseg], es
	mov [cs:lfv_dofs], di
	mov ax, cs
	mov es, ax
	mov di, lfv_fname
	mov cx, 11
	repe movsb
.reset: mov ah, 0
	mov dl, 0
	int 13h
	jc .reset
	mov ax, [cs:lfv_dseg]
	mov es, ax
	mov bx, [cs:lfv_dofs]
	mov di, bx
.read:	mov ah, 2
	mov al, 6
	mov ch, 0
	mov cl, 2
	mov dh, 1
	mov dl, 0
	int 13h
	jc.read
.next:	add di, 32
	push di
	mov si, lfv_fname
	mov cx, 11
	repe cmpsb
	pop di
	jnz .next
	add di, 26
	mov ax, [ES:DI]
	add ax, 31
	mov bl, 36
	div bl
	mov ch, al
	shr ax, 8
	mov bl, 18
	div bl
	mov dh, al
	inc ah
	mov cl, ah
	mov ah, 2
	mov al, 1
	mov bx,0x1000
	mov es,bx
	mov bx,0x200
	mov dl, 0
	int 13h
	jmp 1000h:200h
.exit:	retn

_exit:	MOV AX,CS		       ;EXIT COMMAND
	PUSH AX
	XOR AX,AX
	PUSH AX
	IRET

_strdef:push bp 		       ;STRDEF COMMAND
	mov bp,sp
	sub sp,0x40
	mov bx,[bp+4]
	mov si,bx
	mov ax,si
	mov dx,si
	mov sp,bp
	pop bp
	ret

_read:	push bp 		       ;READ COMMAND
	mov bp,sp
	sub sp,0x40
	mov bx,[bp+4]
	mov si,fname
	mov si, bx
	mov [cs:lfv_dseg], es
	mov [cs:lfv_dofs], di
	mov ax, cs
	mov es, ax
	mov di, lfv_fname
	mov cx, 11
	repe movsb
.reset: mov ah, 0
	mov dl, 0
	int 13h
	jc .reset
	mov ax, [cs:lfv_dseg]
	mov es, ax
	mov bx, [cs:lfv_dofs]
	mov di, bx
.read:	mov ah, 2
	mov al, 6
	mov ch, 0
	mov cl, 2
	mov dh, 1
	mov dl, 0
	int 13h
	jc .read
.next:	add di, 32
	push di
	mov si, lfv_fname
	mov cx, 11 ;
	repe cmpsb
	pop di
	jnz .next
	add di, 26
	mov ax, [ES:DI]
	add ax, 31
	mov bl, 36
	div bl
	mov ch, al
	shr ax, 8
	mov bl, 18
	div bl
	mov dh, al
	inc ah
	mov cl, ah
	mov ah, 2
	mov al, 1
	mov bx,0x1000
	mov es,bx
	mov bx,0x200
	mov dl, 0
	int 13h
	mov si,[es:bx]
	mov ax,si
	mov dx,si
	pop bp
.exit:	ret

;-------------------------------------------------------------------------------
; Internal Functions
;-------------------------------------------------------------------------------

print:	 cld
	 lodsb
	 cmp al, 0
	 jz pret
	 mov ah, 0x0E
	 int 0x10
	 jmp print
pret:	 ret

;-------------------------------------------------------------------------------
; Data
;-------------------------------------------------------------------------------

lfv_fname db ' '
lfv_dseg dw 0
lfv_dofs dw 0
fname db 'LOADER  BIN'
scanfbuf db 64
firstboot db 1

