From: ol.sc 
Date: Tue, 22 Sep 2009 17:29:49 +0000 (+0000)
Subject: Added alternative implementation for ProDOS 8 I/O buffer management. The purpose... 
X-Git-Tag: V2.13.0rc1~46
X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=6345e4b0cd48e7c2653dca74ff5ae4dc6939462d;p=cc65
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
---
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