<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>https://mirror.atariki.pl/w/index.php?action=history&amp;feed=atom&amp;title=Skoki_do_adres%C3%B3w_w_tablicy</id>
	<title>Skoki do adresów w tablicy - Historia wersji</title>
	<link rel="self" type="application/atom+xml" href="https://mirror.atariki.pl/w/index.php?action=history&amp;feed=atom&amp;title=Skoki_do_adres%C3%B3w_w_tablicy"/>
	<link rel="alternate" type="text/html" href="https://mirror.atariki.pl/w/index.php?title=Skoki_do_adres%C3%B3w_w_tablicy&amp;action=history"/>
	<updated>2026-10-02T15:07:21Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://mirror.atariki.pl/w/index.php?title=Skoki_do_adres%C3%B3w_w_tablicy&amp;diff=3678&amp;oldid=prev</id>
		<title>imported&gt;Atariki recovery: Reconstructed from archived HTML; see provenance manifest</title>
		<link rel="alternate" type="text/html" href="https://mirror.atariki.pl/w/index.php?title=Skoki_do_adres%C3%B3w_w_tablicy&amp;diff=3678&amp;oldid=prev"/>
		<updated>2026-10-01T08:51:48Z</updated>

		<summary type="html">&lt;p&gt;Reconstructed from archived HTML; see provenance manifest&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nowa strona&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Są sytuacje, gdzie chcemy skoczyć pod różny adres w zależności np od wartości rejestru Y.&lt;br /&gt;
Przykładowym rozwiązaniem jest trzymanie tablicy adresów, podzielonych na lo/hi adres i użycie automodyfikacji kodu (ten sam kod dla JSR i JMP):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  lda skoki_lo,y  ; 4 cykle&lt;br /&gt;
  sta _skok+1     ; 4&lt;br /&gt;
  lda skoki_hi,y  ; 4&lt;br /&gt;
  sta _skok+2     ; 4&lt;br /&gt;
_skok jsr adres   ; 6, lub JMP, 3 cykle&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Innym sposobem na wykonanie skoku jest wykorzystanie właściwości rozkazu RTS. Nadal potrzebujemy tablic adresów, podzielonych na lo/hi adres-1 (koniecznie adres pomniejszony o 1). Takie rozwiązanie użyteczne jest w przypadku programów na karcie gdzie nie mamy możliwości automodyfikacji kodu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 lda skoki_hi,y   ; 4 cykle&lt;br /&gt;
 pha              ; 3&lt;br /&gt;
 lda skoki_lo,y   ; 4&lt;br /&gt;
 pha              ; 3&lt;br /&gt;
 rts              ; 6 = 20 cykli&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dla JSR, w sytuacji, gdy liczba skoków jest ograniczona do 86, możemy stworzyć specjalną dodatkową tablicę, zawierającą nie adresy skoków, ale rozkazy JMP, tzn:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
skoki&lt;br /&gt;
  jmp skok1  ; 3 cykle&lt;br /&gt;
  jmp skok2&lt;br /&gt;
  ...&lt;br /&gt;
  jmp skokN  ; max N to 86&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli ten kod umieścimy tak, że &amp;lt;code&amp;gt;skoki&amp;lt;/code&amp;gt; rozpoczynają się na początku strony, możemy użyć następującej konstrukcji:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  lda mul3,y      ; 4 cykle&lt;br /&gt;
  sta _skok+1     ; 4&lt;br /&gt;
_skok jsr skoki   ; 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W ten sposób zaoszczędzamy 5 cykli, bo unikamy lda/sta (-8 cykli) ale dodajemy pośredni jmp (+3), kosztem dodatkowej pamięci.&lt;br /&gt;
&lt;br /&gt;
Dla JMP, możemy to zrobić jeszcze inaczej, używając rozkazu JMP (adres). Nasza tablica &amp;lt;code&amp;gt;skoki&amp;lt;/code&amp;gt; powinna zawierać po kolei adresy docelowe, czyli:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
skoki&lt;br /&gt;
  dta a(skok1)&lt;br /&gt;
  dta a(skok2)&lt;br /&gt;
  ...&lt;br /&gt;
  dta a(skokN)     ; max N to 128&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I teraz nasz kod zamieniamy na&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  tya             ; 2 cykle&lt;br /&gt;
  asl @           ; 2, mnożymy przez 2&lt;br /&gt;
  sta _skok+1     ; 4&lt;br /&gt;
_skok jmp (skoki) ; 5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oszczędzamy 6 cykli, bo usuwamy lda/sta (-8 cykli), ale zwiększamy koszt JMP z 3 do 5 (+2).&lt;br /&gt;
&lt;br /&gt;
Można także użyć rozkazu BNE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  lda mul3,y      ; 4 cykle&lt;br /&gt;
  sta _skok+1     ; 4&lt;br /&gt;
_skok bne $FF     ; 3&lt;br /&gt;
  jmp skok0       ; 3 cykle&lt;br /&gt;
  jmp skok1&lt;br /&gt;
  ...&lt;br /&gt;
  jmp skokN       ; max N to 42&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategoria:Niezbędnik kodera]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Atariki recovery</name></author>
	</entry>
</feed>