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 19:05
       
      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 20:05
       
      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 21:05
       
      grelbus - poczatki z asemblerem 6502 czy w ogole z asemblerem?
      • 4: CommentAuthorgreblus
      • CommentTime31 May 2012 22:05
       
      @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 22:05 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 23:05 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 00:06 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 08:06
       
      @jhusak: Powiem krótko, o ja głupia pi...

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


      pi = 3,14159265...
      • 10: CommentAuthorgreblus
      • CommentTime3 May 2013 16:05
       
      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 16:05 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 18:05
       
      @willy: thnks za wyjaśnienie. Faktycznie, zjadłem # przed $9b :) czyli jak przypuszczałem, głupota własna.
      • 13: CommentAuthorbob_er
      • CommentTime3 May 2013 18:05
       
      A co do pytania, dlaczego zamiast ' ' (spacji) jest '@' to polecam: ->link<- oraz ->link<-
      • 14: CommentAuthorgreblus
      • CommentTime3 May 2013 21:05 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 21:05
       
      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 21:05
       
      Dla ułatwienia dodam, że zawsze Carry przed odejmowaniem SBC musi być tak ustawione, jak przy ADC wyzerowane.
      • 17: CommentAuthorxxl
      • CommentTime3 May 2013 22:05
       
      oczywiscie jest wyjatek... przed operacja odejmowania od rejestru X znacznik C nie ma znaczenia.
      • 18: CommentAuthorgreblus
      • CommentTime3 May 2013 22:05
       
      @xxl&jhusak: jak zwykle Panowie, dzięki za wskazówki. Coś mi z tym odejmowaniem o jeden nie grało, teraz już wiem dlaczego :)