]> git.sur5r.net Git - cc65/commitdiff
Added alternative implementation for ProDOS 8 I/O buffer management. The purpose...
authorol.sc <ol.sc@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 22 Sep 2009 17:29:49 +0000 (17:29 +0000)
committerol.sc <ol.sc@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 22 Sep 2009 17:29:49 +0000 (17:29 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@4210 b7a2c559-68d2-44c3-8de9-860c34a00d81

libsrc/apple2/extra/iobuf-0800.s [new file with mode: 0644]

diff --git a/libsrc/apple2/extra/iobuf-0800.s b/libsrc/apple2/extra/iobuf-0800.s
new file mode 100644 (file)
index 0000000..386d919
--- /dev/null
@@ -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