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

Atari BASIC
výsledok=USR(adresa)
výsledok=USR(adresa,hodnota,hodnota)
ČasťVýznam
adresakde 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:

Atari BASIC
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,96

Preklad a spustenie

Basic26 usr.abas --sim

Čo uvidíš

5 + 7 = 12
1000 + 234 = 1234

Ako to funguje

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óduzamrznutie 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

  1. Zavolaj rutinu s inými číslami. Čo vráti USR(1536,65535,1)? (Výsledok sa do dvoch bajtov nezmestí a „pretečie“.)
  2. Nájdi v priečinku examples program, ktorý používa USR, a pozri, odkiaľ berie strojový kód – z DATA, z reťazca, alebo z REM.

Zhrnutie

Späť: 22. Joystick a klávesy · Ďalej: 24. Súbory