cc65/libsrc/apple2/extra/iobuf-0800.s

96 lines
1.9 KiB
ArmAsm

;
; 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 __STARTUP_RUN__
.import incsp2, popax
.include "zeropage.inc"
.include "errno.inc"
.include "../filedes.inc"
.segment "ONCE"
initiobuf:
; Convert end address highbyte to table index
lda #>__STARTUP_RUN__
sec
sbc #>$0800
lsr
lsr
; Mark all remaining table entries as used
tax
lda #$FF
: cpx #MAX_FDS
bcc :+
rts
: sta table,x
inx
bne :-- ; Branch always
; ------------------------------------------------------------------------
.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
tya
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