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