<?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=Wielobajtowe_NOP-y</id>
	<title>Wielobajtowe NOP-y - 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=Wielobajtowe_NOP-y"/>
	<link rel="alternate" type="text/html" href="https://mirror.atariki.pl/w/index.php?title=Wielobajtowe_NOP-y&amp;action=history"/>
	<updated>2026-10-03T12:13:04Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://mirror.atariki.pl/w/index.php?title=Wielobajtowe_NOP-y&amp;diff=4227&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=Wielobajtowe_NOP-y&amp;diff=4227&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;== Rozkaz BIT ==&lt;br /&gt;
&lt;br /&gt;
Rozkazy &amp;#039;&amp;#039;BIT abs&amp;#039;&amp;#039; (trzybajtowy: $2C ll hh) i &amp;#039;&amp;#039;BIT zp&amp;#039;&amp;#039; (dwubajtowy: $24 hh) nie modyfikują zawartości pamięci ani rejestrów (z wyjątkiem rejestru statusu 6502), więc mogą być użyte jako legalne, wielobajtowe NOP-y do zamaskowania (przeskoczenia) dowolnego rozkazu jedno- lub dwubajtowego.&lt;br /&gt;
&lt;br /&gt;
Na ogół maskowane są w ten sposób rozkazy ładujące ośmiobitowe stałe do rejestrów. Technikę tę stosuje się najczęściej w podprogramach, w których kod główny spełnia różne funkcje w zależności od stałego parametru przekazanego w akumulatorze, a punkty wejścia wywoływane są za pośrednictwem jakiejś tablicy adresów. Zamiast:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
E0   LDA #$00&lt;br /&gt;
     BEQ EXEC&lt;br /&gt;
E1   LDA #$01&lt;br /&gt;
     BNE EXEC&lt;br /&gt;
EFF  LDA #$FF&lt;br /&gt;
EXEC ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
piszemy:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
E0   LDA #$00&lt;br /&gt;
     .BYTE $2C&lt;br /&gt;
E1   LDA #$01&lt;br /&gt;
     .BYTE $2C&lt;br /&gt;
EFF  LDA #$FF&lt;br /&gt;
EXEC ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dzięki pozbyciu się skoków w tym przykładzie zaoszczędzono dwa bajty. Z tego prostego triku nagminnie korzysta kod [[SpartaDOS X]] celem zaoszczędzenia pamięci RAM.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Stosując ten trik trzeba pamiętać, że maskowany rozkaz wraz z argumentem stanowi adres dla rozkazu BIT, a ten generuje odczyt. Np. użyta w powyższym przykładzie sekwencja &amp;#039;&amp;#039;.BYTE $2C / LDA #$FF&amp;#039;&amp;#039; ($2C, $A9, $FF) w przypadku wykonania w całości zostanie zinterpretowana przez procesor jako &amp;#039;&amp;#039;BIT $FFA9&amp;#039;&amp;#039; powodując odczytanie bajtu spod wymienionego adresu. W przypadku trafienia w ten sposób w rejestr sprzętowy wrażliwy na odczyt będą kłopoty. Takie rejestry mogą się znajdować na stronie $D5 (obszar przeznaczony dla kartridży)&amp;#039;&amp;#039;&amp;#039;. Z tego względu trzeba unikać maskowania rozkazów, których drugi bajt (argument) ma wartość z zakresu $D0-$D7, zwłaszcza $D1 i $D5.&lt;br /&gt;
&lt;br /&gt;
Inne zastosowanie to załadowanie rejestru stałą w zależności od zmiennego parametru (gdy nie opłaca się zastosowanie tabeli). Przykład w pseudokodzie: &amp;#039;&amp;#039;IF zmienna=dana THEN A=dana1 ELSE A=dana2&amp;#039;&amp;#039; - badane mogą być inne relacje zmienna - dana.&lt;br /&gt;
&lt;br /&gt;
Zamiast:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     LDA zmienna&lt;br /&gt;
     CMP dana&lt;br /&gt;
     BNE _1&lt;br /&gt;
     LDA #dana1&lt;br /&gt;
     BNE _2      ; lub BEQ&lt;br /&gt;
_1   LDA #dana2&lt;br /&gt;
_2   ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
można zapisać tak:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     LDA zmienna&lt;br /&gt;
     CMP dana&lt;br /&gt;
     BNE _1&lt;br /&gt;
     LDA #dana1&lt;br /&gt;
     .BYTE $2C&lt;br /&gt;
_1   LDA #dana2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rozkazy odgałęzień ==&lt;br /&gt;
&lt;br /&gt;
W rzadkich przypadkach, kiedy w danym miejscu programu konkretne znaczniki CPU są ustalone, można w opisany powyżej sposób użyć rozkazu odgałęzienia Bxx zamiast rozkazu &amp;#039;&amp;#039;BIT zp&amp;#039;&amp;#039; do zamaskowania następującego rozkazu jednobajtowego. Zysk polega na zaoszczędzeniu 1 cyklu pracy CPU (przez uniknięcie zbędnego dostępu do pamięci) oraz uniknięciu modyfikacji stanu jego rejestrów (poza, oczywiście, PC).&lt;br /&gt;
&lt;br /&gt;
Zamiast:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ON   SEC&lt;br /&gt;
     .BYTE $24   ;BIT&lt;br /&gt;
OFF  CLC&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
można napisać:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ON   SEC&lt;br /&gt;
     .BYTE $90   ;BCC&lt;br /&gt;
OFF  CLC&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>