blob: 414170e5738c072d58d7f1bfb704eab2a7ec386d [file] [log] [blame]
;
; Contiki kernel file system (Apple2 version)
;
; int __fastcall__ kfs_open(const char* name);
; int __fastcall__ kfs_read(int fd, void* buf, unsigned count);
; int __fastcall__ kfs_close(int fd);
; char* kfs_getdir(void);
;
.constructor init_kfs
.destructor done_kfs
.export _kfs_open, _kfs_read, _kfs_close, _kfs_getdir
.import _uip_buf, popax
.importzp ptr1
PATHNAME := $0280
MLI := $BF00
GET_PREFIX_CALL = $C7
OPEN_CALL = $C8
READ_CALL = $CA
CLOSE_CALL = $CC
; ------------------------------------------------------------------------
.bss
PREFIX: .res 1
; ------------------------------------------------------------------------
.data
OPEN_PARAM:
.byte $03 ;PARAM_COUNT
.addr PATHNAME ;PATHNAME
.addr _uip_buf ;IO_BUFFER
OPEN_FD: .byte $00 ;REF_NUM
READ_PARAM:
.byte $04 ;PARAM_COUNT
READ_FD: .byte $00 ;REF_NUM
READ_BUFFER: .addr $0000 ;DATA_BUFFER
READ_COUNT_IN: .word $0000 ;REQUEST_COUNT
READ_COUNT_OUT: .word $0000 ;TRANS_COUNT
CLOSE_PARAM:
.byte $01 ;PARAM_COUNT
CLOSE_FD: .byte $00 ;REF_NUM
; ------------------------------------------------------------------------
.segment "INIT"
init_kfs:
; Check for full pathname
lda PATHNAME+1
cmp #'/'
beq prefix
; Save name incl. length
ldx PATHNAME
: lda PATHNAME,x
sta _uip_buf,x
dex
bpl :-
jsr MLI
.byte GET_PREFIX_CALL
.addr GET_PREFIX_PARAM
; Append name to prefix
lda PATHNAME
clc
adc _uip_buf
sta PATHNAME
tax
ldy _uip_buf
: lda _uip_buf,y
sta PATHNAME,x
dex
dey
bne :-
prefix: lda PATHNAME
sec
sbc #.strlen("CONTIKI")
sta PREFIX
rts
GET_PREFIX_PARAM:
.byte $01 ; PARAM_COUNT
.addr PATHNAME ; DATA_BUFFER
; ------------------------------------------------------------------------
.segment "CONTIKI"
_kfs_open:
; Append name to prefix
sta ptr1
stx ptr1+1
ldy #$00
ldx PREFIX
: lda (ptr1),y
beq :+
sta PATHNAME+1,x
iny
inx
bne :- ; bra
: stx PATHNAME
jsr MLI
.byte OPEN_CALL
.addr OPEN_PARAM
bcs ERROR
; Return fd
lda OPEN_FD
ldx #$00
rts
_kfs_read:
; Store count
sta READ_COUNT_IN
stx READ_COUNT_IN+1
; Pop and store buf
jsr popax
sta READ_BUFFER
stx READ_BUFFER+1
; Pop and store fd
jsr popax
sta READ_FD
jsr MLI
.byte READ_CALL
.addr READ_PARAM
bcs ERROR
; Return bytes transfered
lda READ_COUNT_OUT
ldx READ_COUNT_OUT+1
rts
done_kfs:
lda #$00
_kfs_close:
; Store fd
sta CLOSE_FD
jsr MLI
.byte CLOSE_CALL
.addr CLOSE_PARAM
bcs ERROR
; Return 0
tax
rts
_kfs_getdir:
; Append '\0' to prefix
lda #$00
ldx PREFIX
sta PATHNAME+1,x
; Return prefix
lda #<(PATHNAME+1)
ldx #>(PATHNAME+1)
rts
ERROR:
; Return -1
lda #$FF
tax
rts