Jedynym znanym mi asemblerem posiadającym jakieś ograniczenia jest Quick Assembler. W pozostałych jakie znam jedynym ograniczeniem jest pamięć, ew. długość nazw etykiet (na ogół 15 i więcej znaków, czyli wystarczająca).
Przykład z LDA $0445F2, gdzie najstarsze $04 oznacza numer banku asembler powinien zamienić na większy kawałek kodu, bo procesor naprawdę nie wie, że najstaszy bajt adresu oznacza bank pamięci. Poza tym, Twój przykład należałoby rozumieć jako odwołanie do 4-go elementu tablicy kodów banków. Inaczej, gdyby oznaczał konkretny bank, Twój program musiałby modyfikować cały swój kod pod rozszerzenie, na którym jest uruchamiany (z tablicą byłoby dużo prościej). Jednym słowem asembler musiałby dorzuać, gdzieś na początku procedurę inicjującą i modyfikującą program. Zauważ, że w tym momencie odchodzimy już od asemblera i zmierzamy w kierunku wysokiego poziomu, gdyż pewne rzeczy robi za nas automatycznie kompilator. Nawet jeśli coś takiego zrobisz, to zawsze znajdzie się ktoś, komu nie sodoba się Twoje rozwiązanie i zacznie kombinować po swojemu (w ostateczności napisze nowy asembler :twisted: ).
Kombinacje typu LDA.W zaporzyczone zostały z asemblera MC680xx. W przypadku oryginału ma to sens, gdyż rozmmiar danej zapisany jst w kodzie rozkazu. W przypadku 65816 musiałbyś zamieniać odwołania typu LDA.w #$ffff na coś takiego:
xce ; zapamieujemy tryb pracy (emu/nat)
php
clc
xce ; przełączamy w tryb natywny (konieczny dla operacji 16-bit)
rep #$20 ; przełączamy akumulator i pamięć na 16-bit
lda #$ffff
plp ; przywracamy stan procesora na poprzedni (emu/nat)
xce
Sam widzisz, że to co proponujesz przestaje być asmem, tylko jakąś hybrydą asemblera i języka wysokiego poziomu.
Powyższy przykład można zrobić jeszcze inaczej bez używania trybu 16-bitowego:
Lepiej nie dawać możliwości wyboru trybu pracy asemblerowi, bo będzisz musiał implementować takie cuda jak powyżej. W MAE są pseudo rozkazy: .816, .02, .AB, .AW, .IB, .IW, które przełączają asembler we właściwy tryb. Przełączanie procesora pozostawione zostało użytkownikowi.
Sprawdzałeś co podany przez Ciebie asm wyprawia z takim CPX.W #$7C00. Ja sprawdziłem:
org $8000
lda.w #$1234
ldx.b #$12
sta.b $80
end
Łącznie 7 bajtów zamienił na plik o wielkości ponad 32kB! Mnemoniki pozamieniał na ciąg bajtów:
LDA.w # LDX.b # STA.b
$A9, $34, $12, $A7, $12, $85, $80
A gdzie przełączanie wielkości rejestrów? Bez tego, powyższy kod można o kant potłuc.