atarionline.pl Mnozenie w MADS - Forum Atarum

Jeśli chcesz wziąć udział w dyskusjach na forum - zaloguj się. Jeżeli nie masz loginu - poproś o członkostwo.

  • :
  • :

Vanilla 1.1.4 jest produktem Lussumo. Więcej informacji: Dokumentacja, Forum.

    • 1: CommentAuthorMaterion
    • CommentTime21 Dec 2020 zmieniony
     
    Hej,

    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

    run start
    • 2: CommentAuthorbob_er
    • CommentTime21 Dec 2020
     
    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'.
    • 3: CommentAuthorMaterion
    • CommentTime21 Dec 2020 zmieniony
     
    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.
    • 4:
       
      CommentAuthormgr_inz_rafal
    • CommentTime21 Dec 2020 zmieniony
     
    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.
    • 5: CommentAuthorbob_er
    • CommentTime21 Dec 2020
     
    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
    • 6:
       
      CommentAuthorjhusak
    • CommentTime21 Dec 2020
     
    A jak masz najstarszy bit zawsze 0, to i clc można opuścić.
    • 7: CommentAuthortebe
    • CommentTime21 Dec 2020
     
    lda L3 -> załaduj zawartość komórki spod adresu L3 do A-kumulatora

    asl @ -> przesuń w lewo bity A-kumulatora (mnoży *2)

    clc -> skasuj rejestr C (C = bit 0)

    adc L3 -> dodaj do A-kumulatora zawartość komórki spod adresu L3

    sta L3 -> prześlij zawartość A-kumulatora pod adres komórki L3
    • 8: CommentAuthorMaterion
    • CommentTime21 Dec 2020 zmieniony
     
    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 ?
    • 9: CommentAuthorbob_er
    • CommentTime21 Dec 2020
     
    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.
    • 10: CommentAuthorMaterion
    • CommentTime21 Dec 2020 zmieniony
     
    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.
    • 11: CommentAuthorpirx
    • CommentTime21 Dec 2020
     
    .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 ":"
    :40 .by 0

    (40 razy wstaw bajt 0)
    • 12:
       
      CommentAuthormgr_inz_rafal
    • CommentTime21 Dec 2020 zmieniony
     
    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<-

    albo w Tensorze, o tutaj:
    ->link<-

    Mega ułatwia to generowanie powtarzalnego kodu.
    • 13: CommentAuthorilmenit
    • CommentTime21 Dec 2020
     
    tak, używam .proc, .local i .rept - jak pirx też używam WUDSN (i bardzo polecam) automatyczne wczytywanie symboli do debugowania to mega rzecz.
    • 14: CommentAuthorMaterion
    • CommentTime21 Dec 2020 zmieniony
     
    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 :).