C64Power Forum
Software => Programowanie => Wątek zaczęty przez: siudym w 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" ?
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.
-
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.
-
Czyli chyba wszystko jasne:
(https://i.postimg.cc/gcRPbQzW/Bez-tytu-u2.jpg)
(https://i.postimg.cc/xNTFnCSD/Bez-tytu-u.jpg) (https://postimg.cc/xNTFnCSD)
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.
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"
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?
-
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
-
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.
-
Tu jest wszystko czego potrzebujesz: https://codebase64.org/doku.php
polecam zintegrowane srodowiska (c64studio, cbmprgstudio) z wpieciem w debugowanie w VICE (remote monitor)
-
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 ?
-
Kopiowanie znaków z ROM do RAM oraz dodanie polskich "ogonków" jest podane w książce "Przygody z komputerem i bez komputera" (http://www.filety.net/index.php?strona=arty/literatura/literatura) (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.