atarionline.pl wstawka asm działa pod atari basic, nie działa pod TB - 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: CommentAuthorMaciek
      • CommentTime23 Sep 2011 20:09 zmieniony
       
      Po kilkugodzinnym debugowaniu mojego podprogramu w ASM (sporo iteracji, płakałem jak to robiłem) odkryłem przedziwną rzecz, otóż moja wstawka działa pod Atari Basic, a nie działa pod Turbo Basic XL. Udało mi się wyodrębić fragment kodu który powoduje freeza:

      pla
      zmienna equ 1536
      ldy zmienna
      tutaj dey
      bmi koniec
      jmp tutaj
      koniec rts



      O co chodzi? W TBXL dla zmiennej=0 program się wykona, dla zmiennej=1 mam freeza. Pod oryginalnym bazylem wykonuje się dla każdej wartości zmiennej (0-255).

      Pomożecie?
      Przepraszam, ale nie wiem jak sformatować tekst kodu żeby był bardziej czytelny.

      Właśnie próbowałem z "ldy #1" i wówczas w TBXL dstaję Error-9.
      • 2:
         
        CommentAuthorPecus
      • CommentTime23 Sep 2011 22:09
       
      Hm..
      A czy program jest w stałym miejscu pamięci ??
      Bo widzę, że nierelokowalny. TBasic ma bardziej skomplikowane zarzadzanie pamięcią i zmiennymi... ale nie wiedząc gdzie go trzymasz i jak wywołujesz ciężko się ustosunkować.
      zamiast bmi koniec daj bpl tutaj i wyrzuć jmp.... jeśli chodzi o czas wykoniania wstaw po dey pare NOPow dodatkowo i bedzie relokowalne.
      • 3: CommentAuthorMaciek
      • CommentTime23 Sep 2011 22:09
       
      No więc, wrzuciłem ten program za memhi, wrzuciłem na szóstą stronę i zawsze dostaję freeza. To jest oczywiście fragment dosyć długiego programu i sporo się dzieje między "bmi koniec", a "jmp tutaj", potrzebuję takiej struktury. Nie spałem ze dwie noce, żeby wyłuszczyć te kilka bajtów z całego kodu, które powodują freeza. Nie mam pojęcia czemu TBXL się tak zachowuje :(

      Spróbujcie sobie ten kod asemblować na szóstą stronę (od $601 bo $600 to zmianna) i uruchomić spod TBXL. Sprawdzałem na emulatorze i z różnymi wersjami TBXL. DUPA!
      • 4: CommentAuthorxxl
      • CommentTime23 Sep 2011 22:09
       
      daj zrzut z emulatora
      • 5: CommentAuthorMaciek
      • CommentTime23 Sep 2011 23:09
       
      tzn. co mam zrobić w Atari800Win Plus?
      Słabo się znam na emulatorach, nie widzę tam opcji zrzutu czegokolwiek :/
      • 6: CommentAuthorxxl
      • CommentTime23 Sep 2011 23:09
       
      w monitorze napisz write 600 6ff plik.mem
      i ten plik.mem podeslij lub menu file save state.
      • 7: CommentAuthorMaciek
      • CommentTime23 Sep 2011 23:09
       
      Załączam savestate'a
      zmienna jest w $600, program zaczyna się od $601
      dla 0 się wykona, dla 1 nie
      • 8: CommentAuthorxxl
      • CommentTime23 Sep 2011 23:09
       
      <code>
      0600 BRK ; 7cyc ; 00
      0601 PLA ; 4cyc ; 68
      0602 LDY $0600 ; 4cyc ; AC 00 06
      0605 DEY ; 2cyc ; 88
      0606 BMI $060B ; 2cyc ; 30 03
      0608 JMP $0004 ;RAMLO ; 3cyc ; 4C 04 00
      060B RTS ; 6cyc ; 60
      </code>

      widzisz juz problem?
      • 9: CommentAuthorMaciek
      • CommentTime23 Sep 2011 23:09 zmieniony
       
      nie
      (co to są te cyce :P ?)

      ten skok jest na w złe miejsce? QA źle wygenerował kod?
      • 10: CommentAuthorxxl
      • CommentTime23 Sep 2011 23:09
       
      0608 JMP $0004

      skaczesz w maliny
      • 11:
         
        CommentAuthorjhusak
      • CommentTime23 Sep 2011 23:09 zmieniony
       
      Z czego wynika, że kompilujesz np. bez org (ustalenie adresu początku kodu), a następnie wrzucasz, gdzie popadnie.

      Kod może być relokowalny (na 6502 trudne, ale wykonalne) i wtedy umieszczasz go gdzie bądź.

      Może też być nierelokowalny (działa tylko pod adresem, pod który został zassemblowany) - i wtedy jak go przeniesiesz choćby o bajt - wywali się na pierwszym skoku lub jsr do siebie.

      Assembler nie wybacza błędów, posłusznie i bez zająknięcia tworzy kod wynikowy ze źródłowego - to jego główna wada.
      • 12: CommentAuthorMaciek
      • CommentTime23 Sep 2011 23:09 zmieniony
       
      ok, dzięki za wyjaśnienie, faktycznie robiłem bez org
      • 13:
         
        CommentAuthorjhusak
      • CommentTime23 Sep 2011 23:09
       
      Ja tam się na QA nie znam (się znam ogólnie), więc tu nie pomogę. Ogólnie, jeśli już się używa optów, to trzeba doskonale wiedzieć, co się robi. Ja nie używam i jestem hepi.
      • 14:
         
        CommentAuthorjhusak
      • CommentTime23 Sep 2011 23:09 zmieniony
       
      ok, dzięki za wyjaśnienie, faktycznie robiłem bez org

      To kliknij "pomógł" :)
      • 15:
         
        CommentAuthorKaz
      • CommentTime8 Oct 2011 03:10 zmieniony
       
      Offtopic edukacyjny:

      Maciek:

      Przepraszam, ale nie wiem jak sformatować tekst kodu żeby był bardziej czytelny.


      Do prezentacji fragmentow kodu sluza:

      [ code ] [ /code ] pozwala wstawić listing dowolnego programu. Program wyświetlony w ramce, z użyciem odpowiedniej czcionki jest oczywiście czytelniejszy niż gdyby był wstawiony jako zwykły tekst. Nie ma podkolorowania słów kluczowych.

      [ code basic ] [ /code ] również przeznaczone do wstawiania listingów, ale tym razem dla programów w Atari Basic i Turbo Basic XL. Wszystkie słowa kluczowe obu tych języków oraz użyte cyfry są wyróżniane kolorem, co ogromnie zwiększa czytelność listingu.

      [ code php ] [ /code ] podobnie jak powyższe pary znaczników, do wstawiania listingów, ale w językach „pecetowskich“. Kolorami wyróżnione są poszczególne elementy listingu.

      Twoj kod wygladalby tak (i nizej jest mozliwosc zgrania go do pliku):

      pla         
      zmienna equ 1536
      ldy zmienna
      tutaj dey
      bmi koniec
      jmp tutaj
      koniec rts