101

Odp: Mads Assembler

Właściwie to patrząc na mój poprzedni post sprzed 2 lat, to masz rację :) Nie ma tematu.

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

102

Odp: Mads Assembler

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.

Ostatnio edytowany przez mono (2021-12-10 03:11:15)

Post's attachments

align.asx 367 b, nikt jeszcze nie pobierał tego pliku. 

Tylko zalogowani mogą pobierać załączniki.
hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

103

Odp: Mads Assembler

Można to rozwiązać stosując sekcje:

        opt f-
        org $8000
        opt f+
        nmb
bank1:
        nop

.if * > $A000
        .print =*,":",*
        .error *
.elseif * < $A000
        .align $9FFF,$FF
        .byte $FF
.endif

i tak dalej aż do ostatniego banku (w pierwszym i ostatnim nie trzeba). Ale ten opt f- opt f+ i .align $9FFF,$FF .byte $FF nie wygląda ani elegancko, ani ładnie.

Da się to jednak ładniej rozwiązać? Zdecydowanie ładniej wyglądałoby n.p.:

        org $8000
        nmb
bank1:
        nop

.if * > $A000
        .error =*,":",*
.else
        .align $A000
.endif

Edit: Nie można by od razu przy .align generować bajtów jeśli f+?

Ostatnio edytowany przez mono (2021-12-10 14:10:33)

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

104

Odp: Mads Assembler

    lmb #1
    org $8000

    .pages 32

    nop

    .endpg


    lmb #2
    org $a000

    .pages 32

    nop

    .endpg
*- TeBe/Madteam
3x Atari 130XE, SDX, CPU 65816, 2x VBXE, 2x IDE Plus rev. C

105

Odp: Mads Assembler

Tak. Dziękuję. Nadal nie działa.

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje