; io - handle ed's I/O

; *** Consts ***
;
; Max length of a line
.equ	IO_MAXLEN	0x7f

; *** Variables ***
; Handle of the target file
.equ	IO_FILE_HDL	IO_RAMSTART
; block device targeting IO_FILE_HDL
.equ	IO_BLK		@+FS_HANDLE_SIZE
; Buffer for lines read from I/O.
.equ	IO_LINE		@+BLOCKDEV_SIZE
.equ	IO_RAMEND	@+IO_MAXLEN+1	; +1 for null
; *** Code ***

; Given a file name in (HL), open that file in (IO_FILE_HDL) and open a blkdev
; on it at (IO_BLK).
ioInit:
	call	fsFindFN
	ret	nz
	ld	ix, IO_FILE_HDL
	call	fsOpen
	ld	de, IO_BLK
	ld	hl, .blkdev
	jp	blkSet
.fsGetB:
	ld	ix, IO_FILE_HDL
	jp	fsGetB
.fsPutB:
	ld	ix, IO_FILE_HDL
	jp	fsPutB
.blkdev:
	.dw	.fsGetB, .fsPutB

ioGetB:
	push	ix
	ld	ix, IO_BLK
	call	_blkGetB
	pop	ix
	ret

ioPutB:
	push	ix
	ld	ix, IO_BLK
	call	_blkPutB
	pop	ix
	ret

ioSeek:
	push	ix
	ld	ix, IO_BLK
	call	_blkSeek
	pop	ix
	ret

ioTell:
	push	ix
	ld	ix, IO_BLK
	call	_blkTell
	pop	ix
	ret

ioSetSize:
	push	ix
	ld	ix, IO_FILE_HDL
	call	fsSetSize
	pop	ix
	ret

; Write string (HL) in current file. Ends line with LF.
ioPutLine:
	push	hl
.loop:
	ld	a, (hl)
	or	a
	jr	z, .loopend		; null, we're finished
	call	ioPutB
	jr	nz, .error
	inc	hl
	jr	.loop
.loopend:
	; Wrote the whole line, write ending LF
	ld	a, 0x0a
	call	ioPutB
	jr	z, .end		; success
	; continue to error
.error:
	call	unsetZ
.end:
	pop	hl
	ret