23. Strojový kód: USR
Na čo to je
Procesor Atari rozumie len strojovému kódu – radu bajtov, z ktorých každý je jednoduchý pokyn. Je stokrát rýchlejší než BASIC v interpreteri, ale píše sa ťažko. Dobové programy ním robili to, čo BASIC nestíhal: rýchly presun obrazovky, hudbu, pohyb postavičiek.
USR je most: funkcia BASICu, ktorá zavolá strojový kód na danej adrese a vráti, čo jej kód odovzdá.
Túto kapitolu nemusíš vedieť naspamäť. Stačí, keď USR v cudzom programe spoznáš a vieš, že taký program sa dá preložiť tiež.
Ako sa to píše
výsledok=USR(adresa)
výsledok=USR(adresa,hodnota,hodnota)| Časť | Význam |
|---|---|
adresa | kde v pamäti strojový kód začína |
hodnota | čísla 0–65535, ktoré kód dostane; môže ich byť viac alebo žiadne |
výsledok | číslo 0–65535, ktoré kód vráti |
USR je funkcia, takže musí stáť vo výraze. Keď výsledok nepotrebuješ, píše sa X=USR(1536) a X sa jednoducho nepoužije.
Celý program
Súbor examples/usr.abas má v DATA krátku rutinu, ktorá sčíta dve čísla:
10 REM USR: calling machine code
20 FOR I=0 TO 20:READ B:POKE 1536+I,B:NEXT I
30 PRINT "5 + 7 = ";USR(1536,5,7)
40 PRINT "1000 + 234 = ";USR(1536,1000,234)
50 END
1000 REM A routine that adds two numbers
1010 DATA 104,104,133,213,104,133,212
1020 DATA 104,170,104,24,101,212,133,212
1030 DATA 138,101,213,133,213,96Preklad a spustenie
Basic26 usr.abas --simČo uvidíš
5 + 7 = 12
1000 + 234 = 1234Ako to funguje
- Riadok 20: 21 bajtov z
DATAsa cezPOKEuloží do pamäte od adresy 1536. Adresy 1536 až 1791 (šestnástkovo$0600–$06FF, „šiesta stránka“) Atari necháva voľné práve na takéto krátke rutiny. - Riadok 30:
USR(1536,5,7)rutinu zavolá a odovzdá jej čísla 5 a 7. - Čo rutina robí (pre zvedavých): BASIC jej pripraví na zásobník procesora počet hodnôt a potom každú hodnotu ako dva bajty. Rutina si ich musí všetky vyzdvihnúť – pokynom
PLA, bajt 104. Súčet uloží na adresy 212 a 213; čo tam nájde BASIC po návrate (pokynRTS, bajt 96), to je výsledokUSR.
Rutina, ktorá si hodnoty zo zásobníka nevyzdvihne, sa nevráti tam, kam má, a počítač zamrzne. Na skutočnom Atari rovnako ako v preloženom programe.
Strojový kód v reťazci
Druhý obľúbený spôsob: bajty rutiny sú znaky reťazca a volá sa USR(ADR(M$)). Vo výpise takého programu vidíš v úvodzovkách zhluk čudných znakov – to je strojový kód. Prekladač taký reťazec nechá bajt po bajte tak, ako je.
Čo s tým robí prekladač
Preložený program volá USR rovnako ako interpreter, takže rutiny z dobových programov fungujú. Niektoré z nich však čítajú veci, ktoré patria interpreteru – napríklad text programu v riadkoch REM, alebo čakajú strojový kód či znakovú sadu nahraté z iného súboru. Na to má prekladač voľby --keep-rem, --embed a --reserve (kapitoly 42 a 43).
Časté chyby
| Čo sa stalo | Čo sa stane |
|---|---|
preklep v DATA strojového kódu | zamrznutie alebo nezmysly; chybu nehlási nikto |
| iný počet hodnôt, než rutina čaká | rutina sa vráti na zlé miesto – zamrznutie |
USR ako príkaz (USR(1536) bez X=) | error B26017 – je to funkcia |
| hodnota nad 65535 alebo záporná | ERROR- 3 |
| rutina na adrese, kde leží niečo iné | prepíše to; šiesta stránka je bezpečná |
Vyskúšaj si
- Zavolaj rutinu s inými číslami. Čo vráti
USR(1536,65535,1)? (Výsledok sa do dvoch bajtov nezmestí a „pretečie“.) - Nájdi v priečinku
examplesprogram, ktorý používaUSR, a pozri, odkiaľ berie strojový kód – zDATA, z reťazca, alebo zREM.
Zhrnutie
USR(adresa,…)zavolá strojový kód a vráti jeho výsledok.- Kód sa do pamäte dostane z
DATAcezPOKE, alebo je v reťazci. - Šiesta stránka (1536–1791) je miesto na krátke rutiny.
- Preložený program volá
USRtak isto ako interpreter.
Späť: 22. Joystick a klávesy · Ďalej: 24. Súbory