napisalem taki maly kod w MADS. Chcialem zrobic by wartosc z L3 trzy razy pomnozylo i zapisalo w L3. Nie wiem tylko jak to zapisac. Dziala jak np zrobie LDA #5 * 3 i STA L3. Ale nie wiem jak powiedziec mu zeby pomnozyl wartosc z L3 wlozyl do akumulatora i potem zapisal w L3. Tak samo nie wiem dlaczego jak zrobie #if .byte L2 > #0 to nie dziala. Przeciez wartosc w L2 jest wielkosci bajta wiec powinno dzialac. Z jakiegos powodu jak wpisalem #if .word L2 > #0 to zadzialalo.
L1 = $0508 L2 = $0509 L3 = $052A
org $04F8
start LDA #27 STA L1 STA L2 INC L2 #if .word L2 > #0 LDA #5 STA L3 LDA L3*3 STA L3 #end
Z cyklu - nie znam się to się wypowiem: Na MADSie znam się słabo, więc to, że piszę głupoty jest proawdpodobne, ale na czuja: 1. 'LDA L3*3' - czyta z komórki o adresie $052a*3, nie mnoży natomiast jej zawartości. Po prostu adres pomnożyłeś razy trzy a nie to, co siedzi pod tym adresem. 2. '#if .word L2 > #0' - sprawdza _wartość_etykiety_ a nie zawartość pamięci o tym adresie. L2 zdefiniowałeś jako '$0509', a to jest większe od 0. Generalnie - musisz odróżniać pojęcia 'adresu' oraz 'zawartości'.
W takim razie jak zapisac by dzialalo na wartosciach a nie na adresach ? Rzeczywiscie w tym moze byc problem. Zaczalem wlasnie w MADS cos probowac raczkowac i czytam wlasnie dokumentacje i staram sie zrozumiec i uzywac roznych polecen.
Chcialem zrobic by wartosc z L3 trzy razy pomnozylo i zapisalo w L3
Możliwe, że jest w MADS jakiś trik, który to robi (jak np. INW do inkrementacji słów - sam unikam tych "rozszerzeń" więc nie znam ich za dobrze), ale...
...jeśli dobrze zrozumiałem, to chcesz odczytać wartość z adresu $052A, pomnożyć razy 3 i zapisać z powrotem. To mnożenie zachodzi w runtime, a nie w czasie kompilacji, więc musisz to sobie jednak ręcznie okodzić (6502 nie umie mnożyć), obsłużyć sytuację gdy wynik mnożenia nie zmieści się w bajcie, itp.
Moja ulubiona odpowiedź to 'to zależy' :). Jeśli interesuje Cię _tylko_ mnożenie przez 3, to zauważ, że takie mnożenie równa się 'razy dwa i dodać raz'. Mnożenie przez dwa zrobisz poprzez 'asl', zatem finalnie: 'LDA L3*3' napisz tak: LDA L3 ASL @ CLC ADC L3 STA L3
Dzieki za odpowiedzi - po prostu widzac ile ulatwien juz jest w MADS to pomyslalem, ze w MADS jest juz jakies takie uproszczenie by zrobic to tak jak chcialem :D. To rozumiem, ze w przypadku if tez nie mozna zrobic ze #if .byte L3 > #0 bo wtedy porownuje adres z 0 a nie wartosc i nie mozna w taki sposob prownywac wartosci spod adresu z jakas wartoscia ?
Chodzi generalnie o to, że te wszystkie '#if' działają w momencie asemblacji (czyli taki odpowiednik kompilacji). To, o co pytasz to porównanie w czasie wykonywania programu. Do tego służą CMP, CPX oraz CPY (działają tak samo, ale z różnymi rejestrami). Porównanie do 0 można lekko uprościć znacznikiem Z procesora. On jest ustawiany na 1, jeśli wynik ostatniej operacji był równy 0.
Oki - wszystko rozjasnione - dzieki bob_er :). Wy uzywacie takich wynalazkow jak procedury czy petle ktore sa w MADS ? Np. .REPT .PROC itd. ? Czy piszecie wszystko sami w ASM i najwyzej swoje wlasne makra recznie pisane tez uzywacie.
.proc jest bardzo przydatne, jeśli się dłubie w WUDSN (edytor to rozpoznaje i ułatwia życie), dodatkowo bardzo fajnie używa się zmiennych lokalnych.
.rept jest super przydatne do generowania różnych tabel, ma super fajne możliwości wyliczania kolejnych wartości, itp. bardzo przydatna jest też konstrukcja ":"
Ja używam wybiórczo, np. stosuję .rept, .macro, ale już .proc jakoś mi nie leży. Przydaje się też mva, czasem #if, ale rzadko. Szukam złotego środka między czytelnością kodu a świadomością tego, co dokładnie dzieje się pod spodem.
W .rept np. można robić fajne myki z counterem, takie jak np. w Wytycznych Rybnych o tu: ->link<-
Ja sobie pierw klasycznego asemblera przejade a dopiero potem bral sie za dobrodziejstwa MADSa bo na razie to widze, ze brakuje mi podstawowej wiedzy i zrozumienia by ogarniac ale chetnie dowiem sie z czego Wy korzystacie i polecacie by w przyszlosci sobie to ogarnac :).