Navigátorposledních 10 z diskuze |
Ilegální instrukce C64Po letech jsme se s Sadem vyheverovali a stvořili malý společný produkt - příspěvek do soutěže, kde produkty měly nevázaně prezentovat použití ilegálních instrukcí na C64. Na tuto problematiku jsem párkrát nahlédl a tak se rozhodl napsat o tom i pár řádků. Ta je celkem detailně zpracována a dostupná na internetu (v angličtině), např. na stránkách německé demoskupiny The Dreams, nebo na studnici kódování C64 Codebase. Ovšem pro ty zástupy českých C64 koderů snad ani žádný článek v češtině nikdy nevyšel, proto jsem přišel se svojí troškou na haldu. Nemám ambice toto téma obsáhle zpracovat, nýbrž jen popsat několik technik, kde je použití těchto instrukcí možné. Nejedná se o efekty, které jsou bez ilegálních instrukcí nedostupné, ale využití je například v 1.kilových intrech, kde se v paměti vyskytuje napnelismus (ušetří se pár Bytů), nebo u precizních raster efektů (a podobně časově kritických rutin), kde tak lze ušetřit nějaký cyklus. Na začátek připomenu dvojici instrukcí, které nepatří mezi ilegální, ale opomíjené regulérní. Bez problémů je možný tento zápis: LDX $2000,Y Stejně tak i tento: LDY $2000,X Není nutné tedy psát něco takového: LDA $2000,Y TAX Bohužel, takováto instrukce již neexistuje, ani mezi ilegálními: STX $2000,Y Mezi nejpoužitelnější ilegální instrukce se řadí ALR, která udělá AND a poté LSR. Zde je příklad použití, jak to může vypadat bez a se zmíněnou instrukcí:
Velmi podobná instrukce ARR dělá AND a ROR. Obdobného ražení (kombinace logické funkce a bitového posunu) je několik dalších instrukcí, například jedna z těch použitelnějších je ASO, která dělá ASL a ORA. Šikovná instrukce je také LAX, která dělá to stejné, jako LDA a TAX (tedy naplní A a X stejnou hodnotou - najednou). Pokud tato instrukce přistupuje do paměti, např. takto, je její používání bez problémů: LAX $2000 Dokonce jí lze indexovat pomocí Y. Ale pokud má přímo naplnit registry procesoru A a X, jedná se o nestabilní instrukci. Tento zápis je možný, ale s nepředvídatelným výsledkem: LAX #$05 Instrukcí, ke které je možné také najít využití, je i SBX. Provede AND mezi A a X a poté od X odečte zadanou hodnotu. Pokud potřebujeme od X odečíst nějakou hodnotu, můžeme to zapsat dvěma způsoby:
Nebo pokud prostě potřebujeme udělat s hodnotou v X logický AND, můžeme napsat toto: LDA #%00000111 SBX #$00 SBX lze vhodně kombinovat s LAX, např.:
Instrukce DCP dělá DEC a po něm CMP. Využít se dá tam, kde potřebujeme snižovat hodnotu a kontrolovat, zda doběhla do konkrétní hodnoty (jiné než 0):
Instrukce ISC dělá INC a s jeho výsledkem SBC. To je možné využít tam, kde potřebujeme od nějaké hodnoty jednomu číslu přičítat jedničku a druhému jí odečítat. V tomto příkladu pojede jeden sprite doleva a druhý stejně rychle doprava: - LDA #$50 SEC ISC $D002 STA $D000 JMP - Jako poslední použitelnou zmíním instrukci SAX. Ta zapíše do paměti hodnotu AND mezi A a X. Údajně dělá to, že na sběrnici v jeden moment zapíše A i X a pouze bity s hodnotou 1 v obou registrech mají i ve výsledku hodnotu 1. Zápis je možný např. takto: SAX $2000 Použitelná je například pro nějaké jednoduché textury, kdy se v registru A uchovává podklad a přes X se dělá maskování. Bohužel není možné použít u této instrukce dvě nejběžnější indexování - přímé, ani nepřímé Y přes nulovou stránku. Tento potencionálně velmi zajímavý zápis není možný: SAX $2000,Y Možný je pouze s jednobytovou adresou (v zeropage), existuje také verze s nepřímým indexováním X:
Na C64 existuje několik ilegálních instrukcí, které jsou popisovány jako nestabilní. Např. instrukce XAA, která kdyby pořádně fungovala, by do A uložila výsledek AND mezi X, A a zadanou hodnotou: XAA #$50 Při pátrání, co je vlastně míněno jako nestabilní instrukce, jsem narazil na tuto stránku, kde je XAA podrobena zkoumání, včetně testu na různých verzích procesoru (nejen C64). S výslednou hodnotou této instrukce se ještě nakonec provede AND s číslem, které je na té stránce pojmenováno jako "magic". Toto magické číslo se liší dle verze procesoru a navíc na některých procesorech není pokaždé stejné. Takže zhruba toto je možné si představit pod pojmem "nestabilní instrukce". LHS Nový příspěvek k článku
06.06.2016 - Ray
Moje oblibena je $fc, xskip 2 bajtyx (resp. neco ala lda/bit ale neulozit vysledek). Zatim se mi nestalo, ze by nekde nefungovala, narozdil od jinych, ktery nebehaji vsude. Typuju, z podobnosti s bit ($2c), ze to bude prave bit bez vysledku. Nekdy se to hodi :) 04.06.2016 - LHS
Ten obrázek je z filmu Karate Cop (neviděl jsem ho). 03.06.2016 - F6
Instrukce JAM je opravdu delikátní. Jinak co znamená vyheverovat? Nějaké kladenské nářečí? A z čeho je ten obrázek v článku? |
Poslední recenzereakce na článkyTOP 10 HRY
|