From 6345e4b0cd48e7c2653dca74ff5ae4dc6939462d Mon Sep 17 00:00:00 2001
From: "ol.sc" 
Date: Tue, 22 Sep 2009 17:29:49 +0000
Subject: [PATCH] Added alternative implementation for ProDOS 8 I/O buffer
 management. The purpose of this implementation is to avoid pulling in the
 heap stuff (and especially the C-written posix_memalign() function) into
 small file utility-like applications. It saves in this scenario > 1400 Bytes.
 It manages memory blocks between $0800 and the cc65 start address. This is
 especially usefull for the now supported "native" SYS programs starting at
 $2000.
git-svn-id: svn://svn.cc65.org/cc65/trunk@4210 b7a2c559-68d2-44c3-8de9-860c34a00d81
---
 libsrc/apple2/extra/iobuf-0800.s | 94 ++++++++++++++++++++++++++++++++
 1 file changed, 94 insertions(+)
 create mode 100644 libsrc/apple2/extra/iobuf-0800.s
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
-- 
2.39.5