]> git.sur5r.net Git - cc65/commitdiff
first hack at newfd function: compiles but doesn't work yet
authorcpg <cpg@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 28 May 2000 21:53:09 +0000 (21:53 +0000)
committercpg <cpg@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 28 May 2000 21:53:09 +0000 (21:53 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@10 b7a2c559-68d2-44c3-8de9-860c34a00d81

libsrc/atari/fdtable.s

index 547681e12384976786a495f1bd79ef65e5086015..9c0ad844417069662877825fc45c41257e583afb 100644 (file)
@@ -5,9 +5,13 @@
 ;
 
        .include "atari.inc"
+       .importzp tmp2,ptr4,sp
+       .import subysp,addysp
        .export fdtoiocb
        .export fdtoiocb_down
        .export fd_table
+       .export fddecusage
+       .export newfd
 
        .data
 
@@ -31,6 +35,7 @@ ft_usa  = 0   ; usage counter
 ft_iocb        = 1     ; iocb index (0,$10,$20,etc.), $ff for empty entry
 ft_dev  = 2    ; device of open iocb
 ft_flag = 3    ; flags
+               ; lower 3 bits: device number (for R: and D:)
 
        .code
 
@@ -101,3 +106,124 @@ inval:    ldx     #$ff                    ; sets N
        rts
 
 .endproc
+
+; decrements usage counter for fd
+; if 0 reached, it's marked as unused
+; get fd index in tmp2
+; Y register preserved
+.proc  fddecusage
+
+       lda     tmp2                    ; get fd
+       cmp     #MAX_FD_VAL
+       bcs     ret                     ; invalid index, do nothing
+       asl     a                       ; create index into fd table
+       asl     a
+       tax
+       lda     #$ff
+       cmp     fd_table+ft_iocb,x      ; entry in use?
+       beq     ret                     ; no, do nothing
+       lda     fd_table+ft_usa,x       ; get usage counter
+       beq     ret                     ; 0? should not happen
+       sec
+       sbc     #1                      ; decrement by one
+       sta     fd_table+ft_usa,x
+       bne     ret                     ; not 0
+       lda     #$ff                    ; 0, table entry unused now
+       sta     fd_table+ft_iocb,y      ; clear table entry
+ret:   rts
+
+.endproc
+
+; newfd
+;
+; called from open() function
+; finds a fd to use for an open request
+; checks whether it's a device or file (file: characters following the ':')
+; files always get an exclusive slot
+; for devices it is checked whether the device is already open, and if yes,
+; a link to this open device is returned
+;
+; Calling paramteter:
+;      AX   - points to filename
+;      Y    - iocb to use (if we need a new open)
+; Return parameters:
+;      tmp2 - fd num
+;      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
+
+loc_A      = 0
+loc_X      = 1
+loc_Y      = 2
+loc_ptr4_l = 3
+loc_ptr4_h = 4
+loc_devnum = 5
+loc_size   = 6
+
+.proc  newfd
+
+       pha
+       txa
+       pha
+       tya
+       pha
+
+       ldy     #loc_size
+       jsr     subysp
+       ldy     #loc_devnum
+       lda     #0
+       sta     (sp),y          ; loc_devnum
+       dey
+       lda     ptr4+1
+       sta     (sp),y          ; loc_ptr4_h
+       dey
+       lda     ptr4
+       sta     (sp),y          ; loc_ptr4_l
+       dey
+       pla
+       sta     (sp),y          ; loc_Y
+       dey
+       pla
+       sta     (sp),y          ; loc_X
+       sta     ptr4+1
+       dey
+       pla
+       sta     (sp),y          ; loc_A
+       sta     ptr4
+
+       ; ptr4 points to filename
+
+       ldy     #1
+       lda     #':'
+       cmp     (ptr4),y        ; "X:"
+       beq     colon1
+       iny
+       cmp     (ptr4),y        ; "Xn:"
+       beq     colon2
+
+       ; no colon there!? OK, then we use a fresh iocb....
+
+do_open:nop                    ; @@@TODO
+       ldy     #loc_size
+       jsr     addysp
+       rts
+
+colon2:        dey
+       tya
+       pha
+       lda     (ptr4),y        ; get device number
+       sec
+       sbc     #'0'
+       ldy     #loc_devnum
+       sta     (sp),y          ; save it
+       pla
+       tay
+colon1:
+
+.endproc
+