diff --git a/libsrc/apple2/extra/iobuf-0800.s b/libsrc/apple2/extra/iobuf-0800.s new file mode 100644 index 000000000..386d91988 --- /dev/null +++ b/libsrc/apple2/extra/iobuf-0800.s @@ -0,0 +1,94 @@ +; +; Oliver Schmidt, 15.09.2009 +; +; ProDOS 8 I/O buffer management for memory between +; location $0800 and the cc65 program start address +; + + .constructor initiobuf + .export iobuf_alloc, iobuf_free + .import __RAM_START__ + .import incsp2, popax + + .include "zeropage.inc" + .include "errno.inc" + .include "filedes.inc" + + .segment "INIT" + +initiobuf: + ; Convert end address highbyte to table index + lda #>__RAM_START__ + sec + sbc #>$0800 + lsr + lsr + + ; Mark all remaining table entries as used + tax + lda #$FF +: sta table,x + inx + cpx #MAX_FDS + bcc :- + rts + +; ------------------------------------------------------------------------ + + .code + +iobuf_alloc: + ; Get and save "memptr" + jsr incsp2 + jsr popax + sta ptr1 + stx ptr1+1 + + ; Search table for free entry + ldx #$00 +: lda table,x + beq :+ + inx + cpx #MAX_FDS + bcc :- + lda #ENOMEM + rts + + ; Mark table entry as used +: lda #$FF + sta table,x + + ; Convert table index to address hibyte + txa + asl + asl + clc + adc #>$0800 + + ; Store address in "memptr" + ldy #$01 + sta (ptr1),y + dey + lda #$00 + sta (ptr1),y + rts + +iobuf_free: + ; Convert address hibyte to table index + txa + sec + sbc #>$0800 + lsr + lsr + + ; Mark table entry as free + tax + lda #$00 + sta table,x + rts + +; ------------------------------------------------------------------------ + + .bss + +table: .res MAX_FDS