X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=libsrc%2Fatari%2Ffdtable.s;h=14b9ff17d4db88afee733c8b60a6a6faa8654efc;hb=1075d1e193448b3234ffd07361fa23b6039451cb;hp=700cabed9b54debc5d3ebe4c4866289afdfa5b4f;hpb=eec01763c429b9110f8db5cea48fd215ab1d88ac;p=cc65 diff --git a/libsrc/atari/fdtable.s b/libsrc/atari/fdtable.s index 700cabed9..14b9ff17d 100644 --- a/libsrc/atari/fdtable.s +++ b/libsrc/atari/fdtable.s @@ -9,8 +9,10 @@ .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 @@ -61,14 +63,32 @@ 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 @@ -90,7 +110,31 @@ inval: ldx #$ff ; sets N 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 @@ -123,7 +167,7 @@ inval: ldx #$ff ; sets N sta fd_table+ft_iocb,x ; clear table entry ret: rts -.endproc +.endproc ; fddecusage ; newfd ; @@ -334,5 +378,5 @@ finish: lda ptr4 pla rts -.endproc +.endproc ; newfd