--- /dev/null
+;
+; 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