Aktualności: C64 Power - online od stycznia 2000 !

Autor Wątek: Asembler 6502 - Skoki i znacznik na stosie dla RTS  (Przeczytany 1439 razy)

0 użytkowników i 2 Gości przegląda ten wątek.

Offline siudym

  • Level 1
  • *
  • Wiadomości: 29
Asembler 6502 - Skoki i znacznik na stosie dla RTS
« dnia: 25 Marca 2019, 08:49 »
Niestety będąc zawsze głąbem z matmy mam zawsze jakieś zagwosdki związane z asemblerem. Zastanawia mnie zasada działania skoku długiego JSR i powrotu RTS. Wiem, że wykonując skok na stos leci adres powrotu dla RTS, ale nie wiem czy gdy w między czasie wystąpi jakiś inny JSR/RTS w środku danego skoku, to czy adres powrotu jest "nadpisany" ?

Cytuj
How JSR and RTS work. When you call a subroutine using JSR, two things happen:

the address of the last byte of the JSR (that is, the next instruction minus 1) is pushed onto the stack
the program counter jumps to the subroutine indicated.
When the program encounters an RTS instruction, this happens:

an address is popped off the stack.
the program counter jumps to this address + 1

Pytanie zobrazowane na tym obrazku:

https://postimg.cc/218czvpJ

W pętli pseudo-nieskończonej mam skok JSR Kod1, w którym jest kolejny skok JSR SkaczeZarazWracam, potem mamy sprawdzenie pewnej zmiennej, porównanie i skok krótki BEQ. Gdy on się wykona czyli SkoczCosZmien na koncu mam RTS, który nie zadziała z BEQ, bo ten skok nie działa w parze z RTS.
Pytanie gdzie wróci RTS po wykonaniu się tego Skoku BEQ ? Jaki adres powrotu będzie na stosie? Bo nie czaje czy na stosie zapamiętany dalej jest adres powrotu JSR Kod1, który przecież ma "w sobie" skok JSR SkaczeZarazWracam i jego RTS jakby zakończył swoje zadanie czyli wrocił w miejsce JSR. Czy teraz JSR Kod1 dalej ma swój adres na stosie dla "swojego" RTS ? Wtedy rozumiem, że RTS będące na koncu SkoczCosZmien wykona powrót na adres zostawiony przez JSR Kod1. ? :)

Wiem, że namieszane.



Offline wegi

  • Level 7
  • *******
  • Wiadomości: 2588
Re: Asembler 6502 - Skoki i znacznik na stosie dla RTS
« Odpowiedź #1 dnia: 25 Marca 2019, 08:58 »
ZAWSZE JSR zmniejszy wskaźnik stosu o 2 i odłoży adres powrotu-1.
Po beq nic na stosie się nie odkłada ani nie zmienia się wskaźnik stosu.
Więc po beq w końcu i tak wykonasz rts, które zdejmie ze stosu adres powrotu i zmniejszy o 2 wskaźnik stosu.
Polecam VICE monitor, breakpointy i praca krokowa.
Gdy po wynalezieniu komputera kwantowego jedni pytali o sposób wytwarzania prądu, kisiel pytał jak wytwarzać świeczki...

NIECH NIE BĘDZIE NICZEGO !!!

CZY RAF PIŁ Z JERICHA KUBECZKA ???

Offline siudym

  • Level 1
  • *
  • Wiadomości: 29
Re: Asembler 6502 - Skoki i znacznik na stosie dla RTS
« Odpowiedź #2 dnia: 25 Marca 2019, 09:03 »
Czyli chyba wszystko jasne:







Ale jeszcze jedno zwiazane z powyzszym pytaniem:

Mamy kawalek tego kodu z obrazka,
gdy lda pozycja ma wartosc hex 33
skok beq wykona sie zrobic SkoczCosZmien
tam jest RTS ale nie wroci juz "za" BEQ wykonac
kod opisany ";jakis kod" bo RTS nie wroci tu.

Cytuj
Kod1:

   jsr SkaczeZarazWracam

   lda pozycja
   cmp #$33
   beq SkoczCosZmien

   ;jakis kod

   RTS

Aby zrobic to tak, aby po powrocie z SkoczCosZmien
wykonal sie dalej kod ";jakis kod" mozna zrobic tak:
wtedy gdy nie bedzie #$33 w pozycja SkoczCosZmien
pominie sie wykonujac ";jakis kod" a nawet jak 33
bedzie zgadzac sie, to nizej JSR wykona sie i wroci
wykonac nizej ";jakis kod"

Cytuj
Kod1:

   jsr SkaczeZarazWracam

   lda pozycja
   cmp #$33
   bne Kod1_Skip

   jsr SkoczCosZmien

   Kod1_Skip:

   ;jakis kod

   RTS

;---------

SkoczCosZmien:

   ;cow wyliczam

   RTS

Czy robie to poprawnie czy mozna jakos inaczej taka
sytuacje ogarnac?
« Ostatnia zmiana: 25 Marca 2019, 09:05 wysłana przez siudym »

Offline wegi

  • Level 7
  • *******
  • Wiadomości: 2588
Re: Asembler 6502 - Skoki i znacznik na stosie dla RTS
« Odpowiedź #3 dnia: 25 Marca 2019, 09:18 »

Kod1:

   jsr SkaczeZarazWracam

   lda pozycja
   cmp #$33
   bne Kod1_Skip

   jsr SkoczCosZmien

   Kod1_Skip:

   ;jakis kod

   RTS

;---------

SkoczCosZmien:

   ;cow wyliczam

   RTS



w tym wypadku skok WARUNKOWY pozwoli ominąć (moze pozwolic w zaleznosci od wartosc w ACC)
   jsr SkoczCosZmien

(tym samym nie odłoży się nic na stos i nic nie trzeba z niego zdejmowac)

  Kod1_Skip:
wykona się zawsze


« Ostatnia zmiana: 25 Marca 2019, 09:21 wysłana przez wegi »
Gdy po wynalezieniu komputera kwantowego jedni pytali o sposób wytwarzania prądu, kisiel pytał jak wytwarzać świeczki...

NIECH NIE BĘDZIE NICZEGO !!!

CZY RAF PIŁ Z JERICHA KUBECZKA ???

Offline siudym

  • Level 1
  • *
  • Wiadomości: 29
Odp: Asembler 6502 - Skoki i znacznik na stosie dla RTS
« Odpowiedź #4 dnia: 30 Marca 2022, 12:54 »
Nie będe już zakładał osobnego tematu dlatego zapytam tutaj.

Chciałbym coś zacząć na C64. Jakie asemblery są najpopularniejsze? Chciałbym pierwsze "coś" napisać z użyciem cartridge'a więc jakies podstawowe informacje by się przydały. Z tego co widzę CRT jest mapowany od $8000 w górę, czyli ma 32KB wielkości. Czy są jakieś standardowe mappery używane do przełączania banków gdy ROM w cartridge będziemy chcieć większy ?

Są jakieś przykładowe źródła np. Hello World z użyciem cartridge? Coś do analizy.

C64 ma sprzętowe sprites to spora zaleta, a jak jest z ekranem czy istnieje tryb bazujący na tilesach czyli tak jak jest często w konsolach ? Wcześniej pierwsza styczność z programowaniem na komputery to był MSX1, który jest banalny i prosty. Sprites sprzętowe, ekran 256x192 (768 bajtów) gdzie każdy bajt to numer grafiki CHR 00-FF + Tablica kolorów. Bardzo proste, ciekawe jak jest z C64 pod tym wzgędem.
« Ostatnia zmiana: 30 Marca 2022, 12:57 wysłana przez siudym »

Offline Raf

  • Master of disaster
  • Administrator
  • Level 7
  • **********
  • Wiadomości: 7333
  • Wolność, własność, sprawiedliwość
Odp: Asembler 6502 - Skoki i znacznik na stosie dla RTS
« Odpowiedź #5 dnia: 30 Marca 2022, 13:55 »
Tu jest wszystko czego potrzebujesz: https://codebase64.org/doku.php

polecam zintegrowane srodowiska (c64studio, cbmprgstudio) z wpieciem w debugowanie w VICE (remote monitor)
"Cokolwiek powiesz albo napiszesz, znajdzie się ktoś, kto słyszy lub czyta coś zupełnie innego i jeszcze bezczelnie wmawia Ci to"

Offline siudym

  • Level 1
  • *
  • Wiadomości: 29
Odp: Asembler 6502 - Skoki i znacznik na stosie dla RTS
« Odpowiedź #6 dnia: 18 Grudnia 2022, 22:02 »
Dopiero zaczalem cos dlubac w ASM na C64.
Mam pytanko aby upewnic sie - Multikolor 1 i 2 ustawiac mozna dla wszystkich Sprites? Nie da sie osobno?
Oraz w jaki sposob zmienic znaki w ROM aby mozna bylo uzywac swoich, zmienionych graficznie? Cos nie moge doszukac sie informacji. Jest jakis rejestr, do ktorego mozna zapisac nowy adres w RAM z ktorego beda pobierane Znaki/CHR ?

Offline Mikra_Lbn

  • Level 3
  • ***
  • Wiadomości: 220
    • http://www.lubus.info
Odp: Asembler 6502 - Skoki i znacznik na stosie dla RTS
« Odpowiedź #7 dnia: 22 Grudnia 2022, 17:28 »
Kopiowanie znaków z ROM do RAM oraz dodanie polskich "ogonków" jest podane w książce "Przygody z komputerem i bez komputera" (ostatnia pozycja na liście, listing na ostatniej stronie skanu). Program nie działał u mnie z włączonym kartridżem Final 3.

O sposobach wyświetlania własnych znaków pisał też Bohdan Frelek w książce "Commodore 64". Tę pozycję polecam też m.in. do nauki assemblera.