mirror of
https://github.com/cc65/cc65.git
synced 2025-01-11 11:30:13 +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…
x
Reference in New Issue
Block a user