Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Assembler 6502 - Konwersja liczby 8 bitowej na hex.

agata93 19 Dec 2014 12:52 2754 13
  • #1
    agata93
    Level 9  
    Mam oto taki kod ale nie działa poprawnie czy ktoś mógłby znaleźć błąd i wytłumaczyć dlaczego nie działa. Zadanie jest na procesor 6502, dopiero poznaje assemblera jest to dla mnie czarna magia dodam jeszcze że przy uruchomieniu programu na emulatorze nie otrzymuje wyniku a taki jest cel tego zadania :D
    Code: asm
    Log in, to see the code
  • #2
    szelus
    Level 34  
    Pod etykietą "text" ma wylądować wynik, tak? Ale gdzie to się dzieje? "phex" liczy dwie cyfry szestnastkowe, ale ich nigdzie nie zapisuje.
  • #3
    phanick
    Level 28  
    Moim zdaniem w instrukcjach, gdzie ładujesz do rejestru mlodszy (starszy) bit adresu, pod którym jest etykieta text brakuje znaku #, aby załadować faktyczną wartość. W obecnym rozwiązaniu masz indeksowanie bezpośrednie, zamiast natychmiastowego.

    Dodano po 30 [sekundy]:

    Czyli zamiast lda <text powinno być lda #<text, itp.
  • #5
    agata93
    Level 9  
    Ok, poprawię i sprawdzę czy mi to zadziała
  • #6
    szelus
    Level 34  
    Nie wydaje mi się.
    Wprawdzie minęło ze 30 lat od kiedy ostatnio coś programowałem na 6502, ale o ile skleroza mnie jeszcze nie dopadła :wink: to składnia "<label" oznacza wartość bezpośrednią młodszych bitów wartości etykiety i dodatkowe używanie znaku "#" nie jest potrzebne.
    Natomiast nie spotkałem się nigdy ze składnią "lsr @". Co to za dialekt/system? Nie powinno być raczej "lsr a"?
    Natomiast pod etykietą "pr" powinno być chyba jeszcze zapamiętanie obliczonej cyfry, coś na kształt
    Code: asm
    Log in, to see the code

    I jeszcze rejestr Y nie jest raczej zainicjowany poprawną wartością...
  • #7
    phanick
    Level 28  
    <label to tylko dyrektywa asemblera, której wynikiem jest młodszy bajt etykiety label.
    Czyli jeśli label jest pod adresem $abcd, to
    lda <label jest równoznaczne z lda $cd czyli wczytanie do akumulatora komórki pamięci spod adresu $cd.

    Niech potwierdzeniem moich słów będzie poniższy zrzut z symulatora:
    Assembler 6502 - Konwersja liczby 8 bitowej na hex.
  • #8
    kasjo
    Level 25  
    Wydaje mi się, że ktoś w tym emulatorze po prostu dał ciała z < oraz >. Powinno być jak pisze kolega szelus, wtedy by to miało jakiś sens. Chyba, że przyjmuje też taki mnemonik: LDA #<etykieta
    To samo zadanie można zrobić prościej i czytelniej (mój ulubiony quick assembler na małym atari) :)
    
                      org $0600
                      lda #73     ;wartość jaką chcemy przekonwertować
                      tax
                      and #%11110000
                      lsr @
                      lsr @
                      lsr @
                      lsr @
                      tay
                      lda tablica,y
                      sta text
                      txa
                      and #%00001111
                      tay
                      lda tablica,y
                      sta text+1                  
                      brk
    tablica           equ *
                      dta c'0123456789ABCDEF'
                      
                      org $2000     ;pod tym adresem będzie zapisana wartość w HEX (jako znaki ascii)
    text              equ *
    

    Mam nadzieję, że niczego nie sknociłem bo dawno już w tym piałem :)
  • #9
    szelus
    Level 34  
    W moim poście powyżej poprawiłem brakującą instrukcję; może być, że jednak początki sklerozy :wink:. Nie upieram się też przy "#" vs. "<".
  • Helpful post
    #10
    kasjo
    Level 25  
    Autorka tematu mogła podać pod jakim to emulatorem to ma działać bo to jakiś skok do procedury tego emulatora (pewnie wyświetlanie wyniku).
    @szlus masz rację z tym
    sta ($80),y
    a ja od siebie dodam, że na początku zamiast powinno być chyba
  • #11
    agata93
    Level 9  
    Aktualnie korzystam z emulatora emu6502 pod Windowsem. Próbowałam pracować na Easy 6502 ale tam cały czas jakieś błędy mi wyskakują i "krzyczy" prawie o każdą linijkę

    @kasjo próbowałam uruchomić twój kod ale dalej nic mi się nie wyświetla i nie wiem dlaczego mi to nie działa
  • #12
    szelus
    Level 34  
    Tego emu6502? :arrow: http://sourceforge.net/projects/emu6502/
    Jakoś nie jestem przekonany co do kompletności. W każdym razie, na pewno nie ma wbudowanych żadnych procedur "wyświetlających".
    Kod od kasjo też nie zawiera wyświetlania, wynik konwersji ląduje w pamięci pod etykietą text. Ten skok do procedury wyświetlającej (jsr $ff80) to skąd wzięłaś?
  • #14
    agata93
    Level 9  
    Już sobie poradziłam wystarczyło zmienić w ldy#0 na ldy#1 i w adc #'a'-'9'-1 na adc #'a'-'9'-2 i program działa