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 16:12 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 16:12
       
      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 16:12 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 16:12 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 16:12
       
      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 16:12
       
      A jak masz najstarszy bit zawsze 0, to i clc można opuścić.
      • 7: CommentAuthortebe
      • CommentTime21 Dec 2020 16:12
       
      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 16:12 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 17:12
       
      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 17:12 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 20:12
       
      .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)
    1.  
      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 21:12
       
      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 21:12 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 :).