1
0
mirror of https://github.com/cc65/cc65.git synced 2024-12-24 11:31:31 +00:00
cc65/libsrc/apple2/extra/iobuf-0800.s
Oliver Schmidt 1d1ba3ed3b Adjusted constructors.
The constructors are _NOT_ allowed anymore to access the BSS. Rather they must use the DATA segment or the INIT segment. The latter isn't cleared at any point so the constructors may use it to expose values to the main program. However they must make sure to always write the values as they are not pre-initialized.
2016-03-16 16:28:32 +01:00

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
; ------------------------------------------------------------------------
.data
table: .res MAX_FDS