.importzp tmp1,tmp2,tmp3,ptr4,sp
.import fd_table,fd_index
.import fdt_to_fdi
+ .export clriocb
.export fdtoiocb
.export fdtoiocb_down
+ .export findfreeiocb
.export fddecusage
.export newfd
cmp fd_table+ft_iocb,x ; entry in use?
beq inval ; no, return error
lda fd_table+ft_usa,x ; get usage counter
- beq ok_notlast ; 0?
+ beq ok_notlast ; 0? (shouldn't happen)
sec
sbc #1 ; decr usage counter
sta fd_table+ft_usa,x
tax
plp
bne cont
- php
lda #$ff
sta fd_table+ft_iocb,y ; clear table entry
- plp
+ lda fd_table+ft_flag,y
+ and #16 ; opened by app?
+ eor #16 ; return set Z if yes
cont: rts
ok_notlast:
lda #1 ; clears Z
jmp retiocb
-.endproc
+.endproc ; fdtoiocb_down
inval: ldx #$ff ; sets N
rts
+; clear iocb except for ICHID field
+; expects X to be index to IOCB (0,$10,$20,etc.)
+; all registers destroyed
+
+.proc clriocb
+
+ inx ; don't clear ICHID
+ ldy #15
+ lda #0
+loop: sta ICHID,x
+ inx
+ dey
+ bne loop
+ rts
+
+.endproc
+
+
; gets fd in ax
-; return iocb index in X
+; return iocb index in A, fd_table index in X
; return N bit set for invalid fd
; all registers destroyed
.proc fdtoiocb
lda fd_table+ft_iocb,x ; get iocb
rts
-.endproc
+.endproc ; fdtoiocb
+
+; find a free iocb
+; no entry parameters
+; return ZF = 0/1 for not found/found
+; index in X if found
+; all registers destroyed
+
+.proc findfreeiocb
+
+ ldx #0
+ ldy #$FF
+loop: tya
+ cmp ICHID,x
+ beq found
+ txa
+ clc
+ adc #$10
+ tax
+ cmp #$80
+ bcc loop
+ inx ; return ZF cleared
+found: rts
+
+.endproc ; findfreeiocb
; decrements usage counter for fd
; if 0 reached, it's marked as unused
sta fd_table+ft_iocb,x ; clear table entry
ret: rts
-.endproc
+.endproc ; fddecusage
; newfd
;
; C - 0/1 for no open needed/open should be performed
; all registers preserved!
-; local variables:
-; AX - 0 (A-0,X-1)
-; Y - 2
-; ptr4 - 3,4 (backup)
-; devnum - 5
-
.bss
+
+; local variables:
loc_Y: .res 1
loc_ptr4_l: .res 1
loc_ptr4_h: .res 1
ldy #$ff
srchfree:
tya
- cmp fd_table,x
+ cmp fd_table,x ; check ft_iocb field for $ff
beq freefnd ; found a free slot
txa
clc
lda loc_Y
sta fd_table+ft_iocb,x ; set iocb index
lda loc_devnum
- and #7 ; only 3 bits
+ and #7 ; device number is 3 bits
+ ora #16 ; indicated a fd actively opened by the app
sta fd_table+ft_flag,x
lda tmp2
jsr fdt_to_fdi ; get new index
pla
rts
-.endproc
+.endproc ; newfd