Potrzebuję zorganizować sobie kod dla carta bankowanego.
1. Banki są w obszarze $8000..$9FFF, bank stały (ostatni n.p. 3) jest w $A000..$BFFF.
2. Idea jest taka, że plik wynikowy ma zawierać cięgiem kolejne dynamicznie przełączane banki aż do ostatniego stałego (łączenie 4 w tym wypadku), więc używam bankowania wirtualnego i ustawiam opt h- f+ b-.
3. Dodatkowo, ponieważ nie chcę na piechotę wypełniać resztek banku, to używam .align (nie wiem czy dobrze, bo czytając dokumentację nie wiem czy to .align mówi mi do jakiego adresu będzie wyrównywany kod, czy też do jakiej wielokrotności bajtów będzie równany kod - dajmy na to .align $400 równałoby do najbliższego kilobajta, choć wtedy rodzi się pytanie gdzie jest baza dla obliczania tej wielokrotności - zawsze 0? założyłem że to jednak adres).
4. A na koniec chciałbym jeszcze żeby etykiety we wszystkich bankach były globalne, bo potrzebuję ich używać nie tylko z poziomu banku stałego, ale też i z poziomu tych przełączanych.
Więc robię sobie tak:
opt o+ h- ?+ c- f+ b-
CARTCTRL = $D500
org $8000
rmb
bank0:
nop
.align $A000
org $8000
nmb
bank1:
nop
.align $A000
org $8000
nmb
bank2:
nop
.align $A000
org $A000
nmb
bank3:
start:
nop
rts
.align $BFF0
initialize:
sta CARTCTRL+[=bank0]
rts
.align $BFFA
.word start
.byte $00
.byte %00000100
.word initialize
end
Ładnie, elegancko, równo i z wdziękiem.
Lecz, o zgrozo, próba kompilacji tego za pomocą MADS 2.1.3 kończy się tak:
org $8000
align.asx (11) ERROR: Can't fill from higher ($A000) to lower memory location ($8000)
align.asx (17) ERROR: Can't fill from higher ($A000) to lower memory location ($8000)
I co to się tu stanęło? I czemu nie mogę?
Jeśli ograniczę ilość banków do 2 (czyli zakomentuję banki 1 i 2) to wszystko jest w porządku i generowany jest ładny plik.