.import fd_table,fd_index
.import fdt_to_fdi
.export clriocb
- .export fdtoiocb
.export fdtoiocb_down
.export findfreeiocb
.export fddecusage
.endproc
-; gets fd in ax
-; return iocb index in A, fd_table index in X
-; return N bit set for invalid fd
-; all registers destroyed
-.proc fdtoiocb
-
- cpx #0
- bne inval
- cmp #MAX_FD_INDEX
- bcs inval
- tax
- lda fd_index,x
- asl a ; create index into fd table
- asl a
- tax
- lda #$ff
- cmp fd_table+ft_iocb,x ; entry in use?
- beq inval ; no, return error
- lda fd_table+ft_usa,x ; get usage counter
- beq inval ; 0? should not happen
- lda fd_table+ft_iocb,x ; get iocb
- rts
-
-.endproc ; fdtoiocb
-
; find a free iocb
; no entry parameters
; return ZF = 0/1 for not found/found
.endproc ; findfreeiocb
+
; decrements usage counter for fd
; if 0 reached, it's marked as unused
; get fd index in tmp2
.endproc ; fddecusage
+
; newfd
;
; called from open() function
sta fd_table+ft_flag,x
lda tmp2
jsr fdt_to_fdi ; get new index
- bcs noslot ; no one available
+noslot1:bcs noslot ; no one available (noslot1: helper label for branch out of range)
;cmp #$ff ; no one available
;beq noslot ;@@@ cleanup needed
sta tmp2 ; return index
; not found, open new iocb
jmp do_open
-; helper for branch out of range
-noslot1:jmp noslot
-
; found device in table, check device number (e.g R0 - R3)
fnddev: lda fd_table+ft_flag,x
and #7