; Author: Pawel Jablonski
; E-mail: pj@xirx.net
; WWW: xirx.net
; GIT: git.xirx.net
;
; License: You can use this code however you like
; but leave information about the original author.
; Code is free for non-commercial and commercial use.

include io.asm

; Arguments:
; 	X - low address
;	Y - high address
; No return
external .xFSSetName:
	push A
	push B
	push X
	push Y
	mov 0, B
.xFSSetName_loop:
	; Check if it is a max length of name
	; 11 < B
	cmp 11, B
	jl .xFSSetName_end
	; Load char from RAM
	ldr A
	push A
	; Select low address register
	mov 2, A
	call .xIOSetRegister
	; Write offset of name
	mov B, A
	call .xIOWrite
	; Select fs name register
	mov 13, A
	call .xIOSetRegister
	; Write char of name
	pop A
	call .xIOWrite
	; Check if it is end of string
	cmp 0, A
	je .xFSSetName_end
	; Incrementing address
	inc X
	incc Y
	; Increment offset of name
	inc B
	jmp .xFSSetName_loop
.xFSSetName_end:
	pop Y
	pop X
	pop B
	pop A
	ret

; No arguments
; Return:
; 	A - success (0 - error, 1 - ok)
global .xFSOpenApp:
	; Select low address register
	mov 2, A
	call .xIOSetRegister
	; Select open app command
	mov 0, A
	call .xIOWrite
	; Select fs command register
	mov 15, A
	call .xIOSetRegister
	; Clear value in A
	mov 0, A
	; Open app and get success status
	call .xIOReadLowHalf
	ret
	
; No arguments
; Return:
; 	A - success (0 - error, 1 - ok)
external .xFSOpenFile:
	; Select low address register
	mov 2, A
	call .xIOSetRegister
	; Select open file command
	mov 1, A
	call .xIOWrite
	; Select fs command register
	mov 15, A
	call .xIOSetRegister
	; Clear value in A
	mov 0, A
	; Open app and get success status
	call .xIOReadLowHalf
	ret

; No arguments
; Return:
; 	A - success (0 - error, 1 - ok)
external .xFSListApp:
	; Select low address register
	mov 2, A
	call .xIOSetRegister
	; Select list app dir command
	mov 2, A
	call .xIOWrite
	; Select fs command register
	mov 15, A
	call .xIOSetRegister
	; Clear value in A
	mov 0, A
	; Open app and get success status
	call .xIOReadLowHalf
	ret

; No arguments
; Return:
; 	A - success (0 - error, 1 - ok)
external .xFSListFile:
	; Select low address register
	mov 2, A
	call .xIOSetRegister
	; Select list file dir command
	mov 3, A
	call .xIOWrite
	; Select fs command register
	mov 15, A
	call .xIOSetRegister
	; Clear value in A
	mov 0, A
	; Open app and get success status
	call .xIOReadLowHalf
	ret

; No arguments
; Return:
; 	A - low byte
;	B - high byte
external .xFSSize:
	; Select low address register
	mov 2, A
	call .xIOSetRegister
	; Select size command
	mov 4, A
	call .xIOWrite
	; Select high address register
	mov 3, A
	call .xIOSetRegister
	; Select high byte of size
	mov 1, A
	call .xIOWrite
	; Select fs command register
	mov 15, A
	call .xIOSetRegister
	; Read high byte
	call .xIORead
	mov A, B
	; Select high address register
	mov 3, A
	call .xIOSetRegister
	; Select low byte of size
	mov 0, A
	call .xIOWrite
	; Select fs command register
	mov 15, A
	call .xIOSetRegister
	; Read low byte
	call .xIORead
	ret

; Arguments:
; 	A - block number
;	X - low address
;	Y - high address
; No return
external .xFSReadBlock:
	push A
	push B
	push X
	push Y
	push A
	; Select low address register
	mov 2, A
	call .xIOSetRegister
	; Write block number
	pop A
	call .xIOWrite
	; Select fs command register
	mov 15, A
	call .xIOSetRegister
	; Write read block command
	mov 5, A
	call .xIOWriteLowHalf
	; Select low address register
	mov 2, A
	call .xIOSetRegister
	; Write byte number
	clr A
	call .xIOWrite
	; Select fs data register
	mov 14, A
	call .xIOSetRegister
	clr B
.xFSReadBlock_loop:	
	; Read byte from fs data
	call .xIORead
	; Copy byte to memory
	str A
	; Increment buffer address
	inc X
	incc Y
	loope 255, B, .xFSReadBlock_loop
	pop Y
	pop X
	pop B
	pop A
	ret