]> git.sur5r.net Git - cc65/blobdiff - libsrc/atari/fdtable.s
Changed the solution for the PLOT problem with old -02 kernals to that used
[cc65] / libsrc / atari / fdtable.s
index 700cabed9b54debc5d3ebe4c4866289afdfa5b4f..56dbff01afbe68a61349c0425d5f04b0d1c1d01c 100644 (file)
@@ -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
 
@@ -40,7 +42,7 @@
        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
@@ -51,24 +53,43 @@ retiocb:php
        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
@@ -90,7 +111,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 +168,7 @@ inval:      ldx     #$ff                    ; sets N
        sta     fd_table+ft_iocb,x      ; clear table entry
 ret:   rts
 
-.endproc
+.endproc       ; fddecusage
 
 ; newfd
 ;
@@ -143,13 +188,9 @@ ret:       rts
 ;      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
@@ -207,7 +248,7 @@ do_open:lda tmp1
        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
@@ -245,7 +286,8 @@ l2: sta     fd_table+ft_dev,x       ; set device
        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
@@ -334,5 +376,5 @@ finish:     lda     ptr4
        pla
        rts
 
-.endproc
+.endproc       ; newfd