atarionline.pl MAD Assembler i procedury - 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: CommentAuthoriSiek
      • CommentTime30 Sep 2026 18:35
       
      Czesc,
      nadal uczę sie programować i potrzebuje waszej pomocy. Za nic nie mogę zrozumieć procedur w MAD Assembler bo nijak nie chcą mi dzialac. W instrukcji zostało napisane, ze powinno działać z automatu i u innych w kodzie tez widzę, ze jest OK.

      Wiec:

      .proc ZrobCos (.byte mojeID) .var

      .endp


      Kompiluje sie i dziala, choć oczywiście nic nie robi. To dziala ale:

      .proc ZrobCos (.byte mojeID) .var

      LDA mojeID

      RTS

      .endp


      Wywala błąd, nieznana etykieta MOJEID

      Co robię nie tak? Z opisu wynika, ze to ma działać

      Z góry dziękuję za pomoc
      • 2: CommentAuthortebe
      • CommentTime30 Sep 2026 18:57 zmieniony
       
      to jest assembler a nie język wysokiego poziomu

      jest wiele sposobów w jaki zdefiniujesz swoją zmienną 'mojeID', ale musisz to zrobić w jakiś sposób

      .proc ZrobCos (.byte mojeID) .var

      LDA mojeID

      RTS

      mojeID brk
      .endp


      .proc ZrobCos (.byte mojeID) .var

      LDA mojeID: #$00

      RTS

      .endp


      .proc ZrobCos (.byte mojeID) .var

      .var mojeID .byte

      LDA mojeID

      RTS

      .endp


      .proc ZrobCos (.byte mojeID+1) .var

      mojeID LDA #$00

      RTS

      .endp


      mojeID = $a000

      .proc ZrobCos (.byte mojeID) .var

      LDA mojeID

      RTS

      .endp
      • 3: CommentAuthoriSiek
      • CommentTime30 Sep 2026 20:18
       
      A widzisz! Dziękuję Ci bardzo @tebe to bardzo trafna uwaga i bardzo pomocne fragmenty kodu.
      Super, to wracam kodować dalej ;)
      • 4:
         
        CommentAuthorjhusak
      • CommentTime1 Oct 2026 10:37
       
      Dodam, że wg mnie kolejność nieprzypadkowa, pierwsze dwa przykłady na zmienną lokalną, trzeci to zmienna alokowana bez kontroli, czwarty to już lekki hack, bo pozwala zaoszczędzić bajt, a piąty w przypadku zmiennej globalnej, ew. zmiennej oderwanej od miejsca (co się przydaje pisaniu kodu działającego z ROM).
      • 5:
         
        CommentAuthorpirx
      • CommentTime1 Oct 2026 17:44
       
      a 2 i 4 to nie to samo, tylko w przyp. 2 zapisanie idiomatycznie a 4 klasycznie?
      • 6: CommentAuthortebe
      • CommentTime1 Oct 2026 18:22
       
      dokładnie Pirx
      • 7: CommentAuthoriSiek
      • CommentTime2 Oct 2026 15:40 (7 dni temu)
       
      @jhusak a widzisz, nie dostrzegłbym sam takich szczegółów, dziękuję za komentarz z Twojej strony.

      Przyznam, że przykłady 2 i 5 najbardziej mi pasują i do mnie przemawiają. Właśnie staram się zrozumieć nr 4, bo też wizualnie mi się podoba ale nie wiem dlaczego w deklaracji procedury używamy (.byte mojeID+1) porównując ją do pozostałych wariantów?
      • 8: CommentAuthortebe
      • CommentTime2 Oct 2026 16:30 (7 dni temu)
       
      etykieta 'mojeID' wskazuje konkretne miejsce w pamięci, w tym przypadku wskazuje na instrukcje 'LDA #$00'

      jeśli zapiszesz to bez '+1' czyli '.proc ZrobCos (.byte mojeID) .var' to nadpiszesz rozkaz 'LDA #'

      a ciebie interesuje argument '#$00' więc musisz przesunąć się o jeden bajt, pominąć kod rozkazu i nadpisać bajt argumentu

      no ale najpierw powinieneś zapoznać się z rozkazami 6502 i wiedzieć jakie bajty są generowane dla każdego rozkazu, bez tego to znaczy że podchodzisz do sprawy "od dupy strony" ;)

      .proc ZrobCos (.byte mojeID+1) .var

      mojeID LDA #$00

      RTS

      .endp
      • 9: CommentAuthoriSiek
      • CommentTime2 Oct 2026 17:26 (7 dni temu)
       
      Dzięki jeszcze raz za wyjaśnienia. Jestem aktualnie na etapie zapoznawania się z rozkazami. Pewnie jeszcze nie raz tutaj do Was z głupimi pytaniami powrócę :)