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