: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