1
0
mirror of https://github.com/cc65/cc65.git synced 2024-07-01 08:29:37 +00:00

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
This commit is contained in:
ol.sc 2009-09-22 17:29:49 +00:00
parent cb688729af
commit 6345e4b0cd

View File

@ -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