atarionline.pl Adresowanie - STA do wartości zmiennej. - 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: CommentAuthorgreblus
    • CommentTime31 May 2012
     
    Hej.

    Przepraszam za pytanie totalnego newbie, ale każdy kiedyś zaczynał przygodę z asm, więc może mnie nikt nie wyśmieje:

    adres=1160

    lda #712&255
    sta adres
    lda #712/256
    sta adres+1

    lda #43
    sta adres

    Mam adres poskładany z low-byte i high-byte. W jaki sposób zapisać do adresu, przykładowo #712 poskładanego jak wyżej zawartość akumulatora? Kod powyżej zapisuje #43 pod pierwotnym adresem 1160, sta #adres nie możet byt, to jak?
    • 2: CommentAuthorbob_er
    • CommentTime31 May 2012
     
    może nie rozumiem, o co ci chodzi, ale jeśli chcesz coś zapisać pod adresem zapisanym w słowie 1160, to:
    1. to się da zrobić tylko na stronie zerowej (adres od 0 do 254 (bo to dwa kolejne bajty są) włącznie)
    2. pisze się to tak:
    adres=128
    lda <712
    sta adres
    lda >712
    sta adres+1
    ldy #0 (*)
    lda #43
    sta (adres),y
    (*) y jest potrzebny, bo 6502 nie ma trybu adresowania (zp) dla sta.
    • 3:
       
      CommentAuthorKaz
    • CommentTime31 May 2012
     
    grelbus - poczatki z asemblerem 6502 czy w ogole z asemblerem?
    • 4: CommentAuthorgreblus
    • CommentTime31 May 2012
     
    @Kaz: i jedno i drugie. Kiedyś, lata temu, byłem za młody i za głupi na asm. Teraz przy dwójce dzieci mam w sam raz dość czasu żeby po godzinie 24 chwile poeksperymentować :)

    @bob_er: mało precyzyjnie opisałem o co mi chodzi. Aktualnie czytam sobie Assembly Language Programming for Atari Computers i przeskoczyłem tam do rozdziału o Display List i DLI. Większość potencjalnie działających przykładów, które tam znalazłem to programy w Basicu zawierające przykładowe assemblerowe procedury obsługi przerwań w DATA. Chciałem zrobić tylko w asm, bo niby czemu nie.

    No i zacząłem się zastanawiać jak odwołać się w asm do adresu zapisanego w postaci młodszego i starszego bajtu:

    DL=PEEK(560)+256*PEEK(561)

    a potem zrobić to:

    POKE DL+12,PEEK(DL +12) +128 :REM Set display list bit 7

    No i gdzieś w trakcie empirycznego szału ok. godziny 2 nad ranem postanowiłem zrobić prostą rzecz: zapisać adres np. 712 w postaci LSB/MSB, a następnie zamienić go z powrotem przez sta adres/sta adres+1 no, a reszta jest już powyżej :P

    Wiem, beznadziejny przypadek. Ale ile przy tym frajdy :)
    • 5:
       
      CommentAuthorjhusak
    • CommentTime31 May 2012 zmieniony
     
    Mniej więcej tak się to powinno robić:
    lda 560
    sta $80
    lda 561
    sta $81
    ldy #12
    lda ($80),Y
    ora #$80
    sta ($80),Y

    Gdyby było jedno odwołanie pośrednie do pamięci i bez przesunięcia, to można by zapamiętać bezpośrednio jako operand następnego rozkazu:
    lda 560
    sta op+1
    lda 561
    sta op+2
    op:
    lda $ffff ; zostanie podmienione
    ...


    ale tak naprawdę jak się pisze własny program, to w pamięci ma się dl pod określonym adresem. Pod określonym adresem jest też również ten bajt, co się zmienia, ma on stały adres. Więc wystaczy go załadować, zorować i zapamiętać.

    No dobra, teraz przeczytałem wątek od początku, ale to co napisałem, już jest napisane, więc nie kasuję.
    • 6: CommentAuthorgreblus
    • CommentTime31 May 2012 zmieniony
     
    @bob_er, @jhusak: dzięki Panowie. Dziś będę mógł normalnie iść spać.

    Nie rozumiem tylko w przykładzie Jakuba ora #$80, ale ustawiłem bit 7 przez ora #128 i działa jak powinno :)
    • 7:
       
      CommentAuthorjhusak
    • CommentTime1 Jun 2012 zmieniony
     
    Bo $80 = 128. Jeśli chcesz się posługiwać biegle asm, to w hex powinieneś się poruszać tak samo biegle, jak w dec. Nie chodzi mi o mnożenie, ale raczej o myślenie typu: $4000, $A000, strona pamięci ma $100 bajtów, Rozmiar pamięci to $10000 bajtów ( od $0000 do $ffff). $1000 to 4 kb, 1 kb to $400 bajtów, takie tam działania. Wszystko jest prostsze, niż 16384, 40960 itp. Pomijając fakt, że od razu widać nibblesy, łatwo się mnoży/dzieli przez 2,4,8,16 itd, maskuje, łatwo stwierdzić na podstawie postaci adresu, czy dlist nie przekracza bloku 1kb, a obraz 4kb itd.

    Przypomnę:
    Dlaczego informatycy obchodzą pierwszy dzień świąt BN w Halloween?

    Bo 31 oct = 25 dec ;)
    • 8: CommentAuthorgreblus
    • CommentTime1 Jun 2012
     
    @jhusak: Powiem krótko, o ja głupia pi...

    Dzięki jeszcze raz.
    • 9:
       
      CommentAuthorKaz
    • CommentTime1 Jun 2012
     
    o ja głupia pi...


    pi = 3,14159265...
    • 10: CommentAuthorgreblus
    • CommentTime3 May 2013
     
    Hej.

    Nie zakładam nowego wątku, bo pytanie proste:

    Dlaczego poniższy przykład z madsowym .sb ma problem ze spacją? (wyświetla się tylko Hello).

    org $600
    cld
    clc
    lda 660
    sbc #31
    sta $80
    lda 661
    sbc #3
    sta $81

    ldy #0
    loop lda txt,y
    sta ($80),y
    cmp $9b
    beq end
    iny
    jmp loop

    end jmp end

    txt .sb 'Hello World!'

    jak txt zapiszę tak:

    txt .sb 'Hello'
    .by $20
    .sb 'World!'

    to zamiast spacji jest @.

    To pewnie jakiś objaw mojej głupoty, ale w czym problem?
    • 11: CommentAuthorwilly
    • CommentTime3 May 2013 zmieniony
     
    .by umieszcza dane w pamięci (tu o wartości $20) co jest odpowiednikiem kodu ekranowego znaku właśnie @
    .sb umieszcza dane w pamięci uprzednio konwertując je do kodów ekranowych
    ---
    edit już widzę gdzie jest problem.

    tutaj:

    ldy #0
    loop lda txt,y
    sta ($80),y
    cmp $9b
    beq end
    iny
    jmp loop

    ładujesz do aku fragment tekstu

    wstawiasz go do pamięci

    i porownujesz zawartosc aku do zawartosci komórki $9b <- i to jest chyba twoim problemem.
    Zamysłem było pewnie cmp #$9b .. ale ten znak na końcu tekstu też zapomniałeś umieścić.
    • 12: CommentAuthorgreblus
    • CommentTime3 May 2013
     
    @willy: thnks za wyjaśnienie. Faktycznie, zjadłem # przed $9b :) czyli jak przypuszczałem, głupota własna.
    • 13: CommentAuthorbob_er
    • CommentTime3 May 2013
     
    A co do pytania, dlaczego zamiast ' ' (spacji) jest '@' to polecam: ->link<- oraz ->link<-
    • 14: CommentAuthorgreblus
    • CommentTime3 May 2013 zmieniony
     
    @bober: tego właśnie mi brakowało (zwłaszcza tabelka z mapowaniem na kody ekranowe pomogła).

    Działa taki przykładowy kod:

    org $600
    cld
    clc
    lda 660
    sbc #31
    sta $80
    lda 661
    sbc #3
    sta $81
    ldy #0
    loop lda txt,y
    cmp #$db
    beq end
    sta ($80),y
    iny
    jmp loop

    end jmp end

    txt .sb 'Hello World!' $9b

    Wg sugestii dołożyłem do txt zapomniany eol $9b, ale wyłapuje go przy kopiowaniu do pamięci tekstu już po zmianie przez .sb na wartość $db (wg tabelki z linka bob_er-a eol=155 mapuje się dodając 64) i tu dokumentacja mads jest dla mnie niejasna: .sb: "it will convert all bytes into ATASCII screen codes before storing them".

    Zacząłęm się zastanawiać dlaczego skopiowane do pamięci ekranu kody ATASCII działają. Ale "screen codes" to już nie ATASCII :) tylko właśnie kody ekranowe.
    • 15: CommentAuthorxxl
    • CommentTime3 May 2013
     
    zwroc uwage jak dziala odejmowanie. kasujesz C, czyli tak naprawde dodatkowo odejmujesz 1. nie wiem jak wyglada caly program, mam nadzieje przemyslales uzywanie adresu TXTMSC. sprawdz co sie stanie jesli drukowany tekst bedzie dluzszy od 256 znakow.
    • 16:
       
      CommentAuthorjhusak
    • CommentTime3 May 2013
     
    Dla ułatwienia dodam, że zawsze Carry przed odejmowaniem SBC musi być tak ustawione, jak przy ADC wyzerowane.
    • 17: CommentAuthorxxl
    • CommentTime3 May 2013
     
    oczywiscie jest wyjatek... przed operacja odejmowania od rejestru X znacznik C nie ma znaczenia.
    • 18: CommentAuthorgreblus
    • CommentTime3 May 2013
     
    @xxl&jhusak: jak zwykle Panowie, dzięki za wskazówki. Coś mi z tym odejmowaniem o jeden nie grało, teraz już wiem dlaczego :)