mirror of
https://github.com/cc65/cc65.git
synced 2024-07-05 21:29:03 +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:
parent
cb688729af
commit
6345e4b0cd
94
libsrc/apple2/extra/iobuf-0800.s
Normal file
94
libsrc/apple2/extra/iobuf-0800.s
Normal 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
|
Loading…
Reference in New Issue
Block a user