collapseos/apps/ed/io.asm

95 lines
1.4 KiB
NASM
Raw Normal View History

2019-07-14 01:29:06 +10:00
; 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 IO_FILE_HDL+FS_HANDLE_SIZE
2019-07-14 01:29:06 +10:00
; Buffer for lines read from I/O.
.equ IO_LINE IO_BLK+BLOCKDEV_SIZE
2019-07-14 01:29:06 +10:00
.equ IO_RAMEND IO_LINE+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
.fsGetC:
ld ix, IO_FILE_HDL
jp fsGetC
.fsPutC:
ld ix, IO_FILE_HDL
jp fsPutC
.blkdev:
.dw .fsGetC, .fsPutC
ioGetC:
push ix
ld ix, IO_BLK
call _blkGetC
pop ix
ret
ioPutC:
push ix
ld ix, IO_BLK
call _blkPutC
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
2019-07-14 01:29:06 +10:00
; Given an offset HL, read the line in IO_LINE, without LF and null terminates
; it. Make HL point to IO_LINE.
ioGetLine:
push af
push de
push bc
ld de, 0 ; limit ourselves to 16-bit for now
xor a ; absolute seek
call ioSeek
2019-07-14 01:29:06 +10:00
ld hl, IO_LINE
ld b, IO_MAXLEN
.loop:
call ioGetC
2019-07-14 01:29:06 +10:00
jr nz, .loopend
or a ; null? hum, weird. same as LF
jr z, .loopend
cp 0x0a
jr z, .loopend
ld (hl), a
inc hl
djnz .loop
.loopend:
; null-terminate the string
xor a
ld (hl), a
ld hl, IO_LINE
pop bc
pop de
pop af
ret