]> git.sur5r.net Git - cc65/commitdiff
fd_table functions around getfd; used by startup code
authorcpg <cpg@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 29 Oct 2000 00:05:47 +0000 (00:05 +0000)
committercpg <cpg@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sun, 29 Oct 2000 00:05:47 +0000 (00:05 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@401 b7a2c559-68d2-44c3-8de9-860c34a00d81

libsrc/atari/getfd.s [new file with mode: 0644]

diff --git a/libsrc/atari/getfd.s b/libsrc/atari/getfd.s
new file mode 100644 (file)
index 0000000..6fb38e9
--- /dev/null
@@ -0,0 +1,84 @@
+;
+; Christian Groessler, Oct-2000
+;
+; allocates a new fd in the indirection table
+; the fdtable itself is defined here
+;
+
+       .include "atari.inc"
+       .include "fd.inc"
+       .importzp tmp1
+
+       .export fdt_to_fdi,getfd
+       .export fd_table,fd_index
+       .export ___fd_table,___fd_index ; for test(debug purposes only
+
+       .data
+
+___fd_index:
+fd_index:      ; fd number is index into this table, entry's value specifies the fd_table entry
+       .res    MAX_FD_INDEX,$ff
+
+___fd_table:
+fd_table:      ; each entry represents an open iocb
+       .byte   0,0,'E',0       ; system console, app starts with opened iocb #0 for E:
+       .byte   0,$ff,0,0
+       .byte   0,$ff,0,0
+       .byte   0,$ff,0,0
+       .byte   0,$ff,0,0
+       .byte   0,$ff,0,0
+       .byte   0,$ff,0,0
+       .byte   0,$ff,0,0
+
+       .code
+
+; fdt_to_fdi
+; returns a fd_index entry pointing to the given ft_table entry
+; get fd_table entry in A
+; return C = 0/1 for OK/error
+; return fd_index entry in A if OK
+; registers destroyed
+.proc  fdt_to_fdi
+
+       tay
+       lda     #$ff
+       tax
+       inx
+loop:  cmp     fd_index,x
+       beq     found
+       inx
+       cpx     #MAX_FD_INDEX
+       bcc     loop
+       rts
+
+found: tya
+       sta     fd_index,x
+       txa
+       clc
+       rts
+
+.endproc
+
+; getfd
+; get a new fd pointing to a ft_table entry
+; usage counter of ft_table entry incremented
+; A - fd_table entry
+; return C = 0/1 for OK/error
+; returns fd in A if OK
+; registers destroyed, tmp1 destroyed
+.proc  getfd
+
+       sta     tmp1            ; save fd_table entry
+       jsr     fdt_to_fdi
+       bcs     error
+
+       pha
+       lda     tmp1
+       asl     a
+       asl     a                       ; also clears C
+       tax
+       inc     fd_table+ft_usa,x       ; increment usage counter
+       pla
+error: rts
+
+.endproc