mirror of
https://github.com/cc65/cc65.git
synced 2024-12-24 11:31:31 +00:00
1d1ba3ed3b
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.
96 lines
1.9 KiB
ArmAsm
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
|