:ram0Start w $2000 ; Start of free RAM bank0
:ram0End w $9000 ; End "
:ram1Start w $0400 ; Start of free RAM bank1
:ram1End w $6000 ; End "
:vdcStart w $2000 ; Start of VDCRAM
:vdcEnd w $4000 ; End "
:firstREUBank b $00
:lastREUBank b $00
:ramListStart w $0000 ; Start of List for free RAM
:ramListEnd w $0000 ; End "
:ramListHead w $0000 ; Head of free List
:ramTab b 0,3,6,13 ; no/41/71/81
:DymaInit ;Set parameters for RAM0
lda r0L ;r0 = Start of free RAM0
sta ram0Start
clc
adc r1L ;r1 = Length of free RAM0
sta ram0End
lda r0H
sta ram0Start+1
adc r1H
sta ram0End+1
;Set parameters for RAM1
lda r2L ;r2 = Start of free RAM1
sta ram1Start
clc
adc r3L ;r3 = Length of free RAM1
sta ram1End
lda r2H
sta ram1Start+1
adc r3H
sta ram1End+1
;Set parameters for VDCRAM
lda r4L ;r4 = Start of free VDCRAM
sta vdcStart
clc
adc r5L ;r5 = Length of free VDCRAM
sta vdcEnd
lda r4H
sta vdcStart+1
adc r5H
sta vdcEnd+1
;Set parameters for REURAM
ldy ramExpSize ;Size in banks
beq :noreu
iny ; -1 (we count from 0)
sty lastREUBank ; = last
lda #1 ; if we have a REU
sta firstREUBank ; GEOS uses bank 0
ldx #3 ; look for 4 drives
::loop lda #%11111111
bit driveType,x ; is it RD or shadowed ?
bmi :ramdisk
bvc :nextdrive
inc lastREUBank ; shadow is in the last bank !
bne :nextdrive
::ramdisk and #%00000011 ; get type
tay
lda firstREUBank
clc
adc ramTab,y ; add size of RD to first bank
sta firstREUBank
::nextdrive dex
bpl :loop
aslWn r7,3 ; * 8 (size of entry)
lda r6L
sta ramListStart
sta ramListHead
clc
adc r7L
sta ramListEnd
lda r6H
sta ramListStart+1
sta ramListStart+1
adc r7H
sta ramListEnd
; install list
; nextL/nextH/startL/startH/endL/endH/banknr/NULL
MoveW ramListHead,r9
; fill with REU space
lda firstRAMBank
ora #%10000000 ; REU = $8x
tax
::loop3 ldy #7
sta (r9),y ; NULL
dey
txa
sta (r9),y ; REUbank
dey
lda #0
::loop2 sta (r9),y ; Start/End = 0 (64kB)
dey
cpy #1
bne :loop2
jsr CheckIfEnd
inx
txa
and #%01111111 ; clear REU bit 7
cmp lastREUBank
ble :loop3
; fill with RAM 1/0 space
ldy #7
lda #0
sta (r9),y ; NULL
dey
lda #1
sta (r9),y ; RAMbank
LoadW r8,ram1Start-2
dey
::loop4 lda (r8),y ; End/Start of free RAM1
sta (r9),y
dey
cpy #1
bne :loop4
jsr CheckIfEnd
ldy #7
lda #0
sta (r9),y ; NULL
dey
lda #0
sta (r9),y ; RAMbank
LoadW r8,ram0Start-2
dey
::loop5 lda (r8),y ; End/Start of free RAM1
sta (r9),y
dey
cpy #1
bne :loop5
jsr CheckIfEnd