Kapitola 5: Operačný systém Commodore-64 v assembleri

Kapitola 5 Operacny System Commodore 64 V Assembleri



5.1 Úvod

Operačný systém pre počítač Commodore-64 sa dodáva s počítačom v pamäti iba na čítanie (ROM). Počet miest v bajtoch pamäte pre Commodore-64 sa pohybuje od 0000 $ do $FFFF (t.j. 000016 až FFFF16, čo je 010 až 65 53510). Operačný systém je od $E000 do $FFFF (t.j. 57,34410 až 65,53610).

Prečo študovať operačný systém Commodore-64
Prečo dnes študovať operačný systém Commodore-64, keď to bol operačný systém počítača, ktorý bol vydaný v roku 1982? Počítač Commodore-64 používa centrálnu procesorovú jednotku 6510, čo je upgrade (aj keď nie veľký upgrade) 6502 µP.







6502 µP sa dodnes vyrába vo veľkých množstvách; už to nie je pre domáce alebo kancelárske počítače, ale pre elektrické a elektronické zariadenia (zariadenia). 6502 µP je tiež jednoduchý na pochopenie a ovládanie v porovnaní s inými mikroprocesormi svojej doby. V dôsledku toho je to jeden z najlepších (ak nie najlepší) mikroprocesor, ktorý sa používa na výučbu jazyka symbolických inštancií.



65C02 µP, stále z triedy mikroprocesorov 6502, má 66 inštrukcií v jazyku symbolických inštrukcií, z ktorých všetky sa dokonca dajú naučiť naspamäť. Moderné mikroprocesory majú veľa inštrukcií v jazyku symbolických inštrukcií a nedajú sa naučiť naspamäť. Každý µP má pre seba svoj vlastný montážny jazyk. Akýkoľvek operačný systém, či už nový alebo starý, je v jazyku symbolických inštrukcií. Vďaka tomu je assembler 6502 vhodný na výučbu operačného systému pre začiatočníkov. Po naučení operačného systému, akým je napríklad Commodore-64, sa dá ľahko naučiť moderný operačný systém, ktorý použije ako základ.



Toto nie je len názor autora (mňa). Vo svete ide o rastúci trend. Na internete sa píše čoraz viac článkov o vylepšenom operačnom systéme Commodore-64, aby vyzeral ako moderný operačný systém. Moderné operačné systémy sú vysvetlené v nasledujúcej kapitole.





Poznámka : Commodore-64 OS (Kernal) stále dobre funguje s modernými vstupnými a výstupnými zariadeniami (nie so všetkými).

Osembitový počítač
V osembitovom mikropočítači, akým je Commodore 64, sa informácie ukladajú, prenášajú a manipulujú vo forme osembitových binárnych kódov.



Pamäťová mapa
Pamäťová mapa je mierka, ktorá rozdeľuje celý rozsah pamäte na menšie rozsahy rôznych veľkostí a ukazuje, čo (podprogram a/alebo premenná) patrí do akého rozsahu. Premenná je označenie, ktoré zodpovedá konkrétnej adrese pamäte, ktorá má hodnotu. Štítky sa tiež používajú na identifikáciu začiatku podprogramov. Ale v tomto prípade sú známe ako názvy podprogramov. Podprogram možno jednoducho označiť ako rutina.

Mapa pamäte (rozloženie) v predchádzajúcej kapitole nie je dostatočne podrobná. Je to celkom jednoduché. Pamäťovú mapu počítača Commodore-64 je možné zobraziť s tromi úrovňami detailov. Pri zobrazení na strednej úrovni má počítač Commodore-64 rôzne pamäťové mapy. Predvolená mapa pamäte počítača Commodore-64 na strednej úrovni je:


Obr. 5.11 Mapa pamäte Commodore-64

V tých časoch bol populárny počítačový jazyk s názvom BASIC. Mnoho používateľov počítačov potrebovalo poznať niektoré minimálne príkazy jazyka BASIC, ako napríklad načítanie programu z diskety (disku) do pamäte, spustenie (spustenie) programu v pamäti a ukončenie (zatvorenie) programu. Keď je spustený program BASIC, používateľ musí vkladať údaje riadok po riadku. Nie je to ako dnes, keď je aplikácia (niekoľko programov tvoriacich aplikáciu) napísaná vo vysokoúrovňovom jazyku s oknami a používateľ sa musí vtesnať do rôznych údajov na špecializované miesta v okne. V niektorých prípadoch použite na výber predobjednaných údajov myš. BASIC bol v tom čase jazyk na vysokej úrovni, ale je dosť blízky jazyku symbolických inštrukcií.

Všimnite si, že väčšinu pamäte zaberá BASIC v predvolenej mape pamäte. BASIC má príkazy (inštrukcie), ktoré sú vykonávané tým, čo je známe ako BASIC Interpreter. V skutočnosti je tlmočník BASIC v ROM od miesta $ A000 po $ BFFF (vrátane), čo je údajne oblasť RAM. To je 8 Kbajtov, čo je na tú dobu dosť veľké! Je to vlastne v ROM na tom mieste celej pamäte. Má rovnakú veľkosť ako operačný systém od 000 $ do FFFF $ (vrátane). Programy, ktoré sú napísané v BASICu, sú tiež umiestnené v rozmedzí od 0200 $ do $ BFFF.

RAM pre program používateľského assembleru je od 000 $ do $ CFFF, len 4 kB zo 64 kB. Prečo teda používame alebo sa učíme jazyk montáže? Nové a staré operačné systémy sú asemblery. Operačný systém Commodore-64 je v ROM, od $E000 do $FFFF. Je napísaný v assembleri 65C02 µP (6510 µP). Pozostáva z podprogramov. Používateľský program v jazyku symbolických inštancií musí volať tieto podprogramy, aby mohol interagovať s periférnymi zariadeniami (vstupnými a výstupnými zariadeniami). Pochopenie operačného systému Commodore-64 v jazyku symbolických inštrukcií umožňuje študentovi porozumieť operačným systémom rýchlo a oveľa menej únavným spôsobom. Opäť, v tých časoch bolo veľa užívateľských programov pre Commodore-64 napísaných v BASICu a nie v assembleri. Assemblerské jazyky v tých časoch používali skôr samotní programátori na technické účely.

Kernal, napísaný ako K-e-r-n-a-l, je operačný systém Commodore-64. Dodáva sa s počítačom Commodore-64 v ROM a nie na disku (alebo diskete). Kernal pozostáva z podprogramov. Na prístup k periférnym zariadeniam musí používateľský program v jazyku symbolických inštrukcií (strojový jazyk) použiť tieto podprogramy. Kernal by sa nemal zamieňať s jadrom, ktoré sa v moderných operačných systémoch píše ako K-e-r-n-e-l, hoci ide takmer o to isté.

Oblasť pamäte od 000 $ (49 15210) do 6324 810 $ 4 kB10 pamäte je buď RAM alebo ROM. Keď je to RAM, používa sa na prístup k periférnym zariadeniam. Keď je to ROM, používa sa na tlač znakov na obrazovku (monitor). To znamená, že buď sa znaky tlačia na obrazovku, alebo sa pristupuje k periférnym zariadeniam pomocou tejto časti pamäte. V systémovej jednotke (základnej doske) je banka ROM (charakter ROM), ktorá sa zapína a vypína z celého pamäťového priestoru, aby sa to dosiahlo. Používateľ si prepínanie nemusí všimnúť.

Oblasť pamäte od 0100 $ (256 10 ) na $01FF (511 10 ) je zásobník. Používa ho operačný systém aj používateľské programy. Úloha zásobníka bola vysvetlená v predchádzajúcej kapitole tohto online kariérneho kurzu. Oblasť pamäte od 0 000 $ (0 10 ) na $ 00FF (255 10 ) používa operačný systém. Je tam priradených veľa ukazovateľov.

Kernal Jump Table
Kernal má rutiny, ktoré volá užívateľský program. Keď vyšli nové verzie OS, adresy týchto rutín sa zmenili. To znamená, že používateľské programy už nemohli pracovať s novými verziami OS. To sa nestalo, pretože Commodore-64 poskytol tabuľku skokov. Tabuľka skokov je zoznam 39 záznamov. Každá položka v tabuľke má tri adresy (okrem posledných 6 bajtov), ​​ktoré sa nikdy nezmenili ani pri zmene verzie operačného systému.

Prvá adresa záznamu má inštrukciu JSR. Ďalšie dve adresy pozostávajú z dvojbajtového ukazovateľa. Tento dvojbajtový ukazovateľ je adresa (alebo nová adresa) aktuálnej rutiny, ktorá je stále v OS ROM. Obsah ukazovateľa sa môže zmeniť s novými verziami OS, ale tri adresy pre každú položku tabuľky skokov sa nikdy nemenia. Vezmime si napríklad adresy $FF81, $FF82 a $FF83. Tieto tri adresy sú pre rutinu na inicializáciu obvodov obrazovky a klávesnice (registrov) základnej dosky. Adresa $FF81 má vždy operačný kód (jeden bajt) JSR. Adresy $FF82 a $FF83 majú starú alebo novú adresu podprogramu (stále v OS ROM) na vykonanie inicializácie. Kedysi mali adresy $ FF82 a $ FF83 obsah (adresu) $ FF5B, čo sa mohlo zmeniť s ďalšou verziou operačného systému. Adresy $FF81, $FF82 a $FF83 tabuľky skokov sa však nikdy nemenia.

Pre každý záznam troch adries má prvá adresa s JSR štítok (názov). Štítok pre $ FF81 je PCINT. PCINT sa nikdy nemení. Takže na inicializáciu registrov obrazovky a klávesnice môže programátor jednoducho napísať „JSR PCINT“, ktorý funguje pre všetky verzie OS Commodore-64. Umiestnenie (začiatočná adresa) aktuálneho podprogramu, napr. $FF5B, sa môže časom meniť s rôznymi operačnými systémami. Áno, v používateľskom programe, ktorý používa OS ROM, sú zahrnuté aspoň dve inštrukcie JSR. V užívateľskom programe je inštrukcia JSR, ktorá preskočí na záznam v tabuľke skokov. S výnimkou posledných šiestich adries v tabuľke skokov má prvá adresa záznamu v tabuľke skokov inštrukciu JSR. V jadre môžu niektoré podprogramy volať ostatné podprogramy.

Kernalova tabuľka skokov začína od $FF81 (vrátane) smerom nahor v skupinách po troch, s výnimkou posledných šiestich bajtov, čo sú tri ukazovatele s nižšími bajtovými adresami: $FFFA, $FFFC a $FFFE. Všetky rutiny ROM OS sú opakovane použiteľné kódy. Používateľ ich teda nemusí prepisovať.

Bloková schéma systémovej jednotky Commodore-64
Nasledujúci diagram je podrobnejší ako ten v predchádzajúcej kapitole:


Obr. 5.12 Bloková schéma systémovej jednotky Commodore_64

ROM a RAM sú tu zobrazené ako jeden blok. Tu je zobrazený čip video rozhrania (IC) na spracovanie informácií na obrazovke, ktorý nebol zobrazený v predchádzajúcej kapitole. Jediný blok pre vstupno/výstupné zariadenia, ktorý je zobrazený v predchádzajúcej kapitole, je tu znázornený ako dva bloky: CIA #1 a CIA #2. CIA je skratka pre Complex Interface Adapter. Každý z nich má dva paralelné osembitové porty (nezamieňajte s externými portami na vertikálnom povrchu systémovej jednotky) nazývané port A a port B. V tejto situácii sú CIA pripojené k piatim externým zariadeniam. Zariadeniami sú klávesnica, joystick, disková jednotka/tlačiareň a modem. Tlačiareň je pripojená na zadnej strane diskovej jednotky. K dispozícii je tiež obvod zariadenia zvukového rozhrania a obvod programovateľného logického poľa, ktoré nie sú zobrazené.

Napriek tomu existuje Character ROM, ktorú možno vymeniť za obe CIA, keď je postava odoslaná na obrazovku a nie je zobrazená v blokovom diagrame.

Adresy RAM od $ D000 do $ DFFF pre vstupné/výstupné obvody pri absencii znakovej ROM majú nasledujúcu podrobnú mapu pamäte:

Tabuľka 5.11
Podrobná mapa pamäte od 000 $ do DFFF $
Rozsah podadresy Okruh Veľkosť (bajty)
D000 – D3FF VIC (ovládač grafického rozhrania (čip)) 1K
D400 – D7FF SID (zvukový obvod) 1K
D800 – DBFF Farebná RAM 1K Nibbles
DC00 – DCFF CIA #1 (klávesnica, joystick) 256
DD00 – DDFF CIA #2 (sériová zbernica, užívateľský port/RS-232) 256
DE00 – DEF Otvorte I/O slot #1 256
DF00 – DFFF Otvorte I/O slot #2 256

5.2 Dva komplexné adaptéry rozhrania

V systémovej jednotke Commodore-64 sú dva konkrétne integrované obvody (IC) a každý z nich sa nazýva Complex Interface Adapter. Tieto dva čipy sa používajú na prepojenie klávesnice a iných periférnych zariadení s mikroprocesorom. S výnimkou VIC a obrazovky prechádzajú všetky vstupné/výstupné signály medzi mikroprocesorom a periférnymi zariadeniami cez tieto dva integrované obvody. Pri Commodore-64 neexistuje priama komunikácia medzi pamäťou a akoukoľvek perifériou. Komunikácia medzi pamäťou a akoukoľvek perifériou prechádza cez mikroprocesorový akumulátor a jedným z nich sú adaptéry CIA (IC). IC sa označujú ako CIA #1 a CIA #2. CIA je skratka pre Complex Interface Adapter.

Každá CIA má 16 registrov. S výnimkou registrov časovača/počítadla v CIA je každý register široký 8 bitov a má pamäťovú adresu. Adresy pamäťových registrov pre CIA #1 sú od $ DC00 (56320 10 ) na $ DC0F (56335 10 ). Adresy pamäťových registrov pre CIA #2 sú od DD00 $ (56576 10 ) na $DD0F (56591 10 ). Hoci tieto registre nie sú v pamäti IC, sú súčasťou pamäte. V intermediárnej pamäťovej mape zahŕňa I/O oblasť od $ D000 do $ DFFF adresy CIA od $ DC00 do $ DC0F a od $ DD00 do $ DD0F. Väčšinu oblasti I/O pamäte RAM od $ D000 do $ DFFF je možné vymeniť s pamäťovou bankou znakovej ROM za znaky obrazovky. To je dôvod, prečo, keď sú znaky odoslané na obrazovku, periférne zariadenia nemôžu fungovať; aj keď si to používateľ nemusí všimnúť, pretože prepínanie tam a späť je rýchle.

V CIA č. 1 sú dva registre s názvom Port A a Port B. Ich adresy sú $ DC00 a $ DC01. V CIA č. 2 sú tiež dva registre s názvom Port A a Port B. Samozrejme, ich adresy sú odlišné; sú to DD00 USD a DD01 USD.

Port A alebo Port B v oboch CIA je paralelný port. To znamená, že môže odosielať dáta do periférie v ôsmich bitoch naraz alebo prijímať dáta z mikroprocesora v ôsmich bitoch naraz.

S portom A alebo B je spojený Data Direction Register (DDR). Register smeru údajov pre port A CIA #1 (DDRA1) je na mieste bajtu pamäte $DC02. Register smeru údajov pre port B CIA č. 1 (DDRB1) je na mieste bajtu pamäte $DC03. Register smeru údajov pre port A CIA č. 2 (DDRA2) je na mieste bajtu pamäte $ DD02. Dátový smerový register pre port B CIA #2 (DDRB2) je na mieste bajtu pamäte $DD03.

Teraz môže byť každý bit pre port A alebo port B nastavený zodpovedajúcim registrom smeru údajov ako vstup alebo výstup. Vstup znamená, že informácie idú z periférneho zariadenia do mikroprocesora cez CIA. Výstup znamená, že informácie idú z mikroprocesora do periférneho zariadenia cez CIA.

Ak sa má vložiť bunka portu (register), zodpovedajúci bit v registri smeru údajov je 0. Ak sa má odoslať bunka portu (register), zodpovedajúci bit v registri smeru údajov je 1. Vo väčšine prípadov je všetkých 8 bitov portu naprogramovaných ako vstup alebo výstup. Keď je počítač zapnutý, port A je naprogramovaný na výstup a port B je naprogramovaný na vstup. Nasledujúci kód robí z portu A CIA #1 výstup a port CIA #1 B ako vstup:

LDA # $ FF
STA DDRA1; $DC00 je v réžii $DC02
LDA # 00 USD
STA DDRB1; $DC01 režíruje $DC03

DDRA1 je označenie (názov premennej) pre umiestnenie bajtu pamäte $DC02 a DDRB1 je označenie (názov premennej) pre umiestnenie bajtu pamäte $DC03. Prvá inštrukcia načíta 11111111 do akumulátora µP. Druhá inštrukcia to skopíruje do dátového smerového registra portu A CIA č. 1. Tretia inštrukcia načíta 00000000 do akumulátora µP. Štvrtá inštrukcia to skopíruje do dátového smerového registra portu B CIA č. 1. Tento kód je v jednom z podprogramov v operačnom systéme, ktorý vykonáva túto inicializáciu pri zapnutí počítača.

Každá CIA má linku so žiadosťou o prerušenie do mikroprocesora. Ten od CIA #1 ide do IRQ kolík µP. Ten od CIA #2 ide do NMI kolík µP. Zapamätaj si to NMI má vyššiu prioritu ako IRQ .

5.3 Programovanie v assembleri klávesnice

Pre Commodore-64 existujú iba tri možné prerušenia: IRQ , BRK a NMI . Ukazovateľ tabuľky skokov pre IRQ je na adresách $FFFE a $FFFF v ROM (operačnom systéme), čo zodpovedá podprogramu, ktorý je stále v OS (ROM). Ukazovateľ tabuľky skokov pre BRK je na adresách $FFFC a $FFFD v OS, čo zodpovedá podprogramu, ktorý je stále v OS (ROM). Ukazovateľ tabuľky skokov pre NMI je na adresách $FFFA a $FFFB v OS, čo zodpovedá podprogramu, ktorý je stále v OS (ROM). Pre IRQ , existujú vlastne dva podprogramy. Takže softvérové ​​prerušenie (inštrukcia) BRK má svoj vlastný ukazovateľ tabuľky skokov. Ukazovateľ tabuľky skokov pre IRQ vedie ku kódu, ktorý rozhoduje, či ide o hardvérové ​​alebo softvérové ​​prerušenie. Ak ide o hardvérové ​​prerušenie, rutina pre IRQ sa volá. Ak ide o softvérové ​​prerušenie (BRK), volá sa rutina pre BRK. V jednej z verzií OS je podprogram pre IRQ je na EA31 $ a podprogram pre BRK je na 66 $. Tieto adresy sú nižšie ako FF81 $, takže nejde o položky tabuľky skokov a môžu sa meniť podľa verzie operačného systému. V tejto téme sú zaujímavé tri rutiny: rutina, ktorá kontroluje, či ide o stlačený kláves alebo BRK, rutina za 43 USD a rutina, ktorá sa môže meniť aj s verziou operačného systému.

Počítač Commodore-64 vyzerá ako obrovský písací stroj (nahor) bez tlačovej časti (hlava a papier). Klávesnica je pripojená k CIA #1. CIA #1 skenuje klávesnicu každú 1/60 sekundy sama o sebe bez akéhokoľvek zásahu do programovania, štandardne. Takže každú 1/60 sekundy CIA #1 pošle IRQ na uP. Je tu iba jeden IRQ kolík na uP, ktorý pochádza iba od CIA #1. Jeden vstupný kolík NMI µP, ktorý je odlišný od IRQ , pochádza iba od CIA #2 (pozrite si nasledujúci obrázok). BRK je vlastne inštrukcia v jazyku symbolických inštrukcií, ktorá je zakódovaná v používateľskom programe.

Takže každých 1/60 sekundy, IRQ volá sa rutina, na ktorú ukazuje $FFFE a $FFFF. Rutina skontroluje, či bol stlačený kláves alebo či bola nájdená inštrukcia BRK. Ak sa stlačí kláves, zavolá sa rutina na spracovanie stlačenia klávesu. Ak ide o inštrukciu BRK, zavolá sa rutina na obsluhu BRK. Ak nie je ani jedno, nič sa nedeje. Ani jedno nemusí nastať, ale CIA #1 posiela IRQ na µP každých 1/60 sekundy.

Front klávesnice, tiež známy ako vyrovnávacia pamäť klávesnice, predstavuje rozsah umiestnení bajtov RAM od 0277 do 0280 $ vrátane; Celkovo 1010 bajtov. Toto je vyrovnávacia pamäť First-In-First-Out. To znamená, že prvá postava, ktorá príde, prvá odíde. Západoeurópsky znak zaberá jeden bajt.

Takže zatiaľ čo program pri stlačení klávesu nespotrebováva žiadny znak, kód klávesu prechádza do tejto vyrovnávacej pamäte (fronty). Vyrovnávacia pamäť sa zapĺňa, až kým nezostane desať znakov. Žiadny znak, ktorý sa stlačí po desiatom znaku, sa nezaznamená. Ignoruje sa, kým sa nezíska (spotrebuje) aspoň jeden znak z frontu. Tabuľka skokov má záznam pre podprogram, ktorý dostane prvý znak z frontu do mikroprocesora. To znamená, že vezme prvý znak, ktorý ide do fronty a vloží ho do akumulátora µP. Podprogram tabuľky skokov na tento účel sa nazýva GETIN (pre Get-In). Prvý bajt pre trojbajtový záznam v tabuľke skokov je označený ako GETIN (adresa $FFE4). Nasledujúce dva bajty sú ukazovateľom (adresou), ktorý ukazuje na skutočnú rutinu v ROM (OS). Je zodpovednosťou programátora zavolať túto rutinu. V opačnom prípade zostane vyrovnávacia pamäť klávesnice plná a všetky nedávno stlačené klávesy budú ignorované. Hodnota, ktorá ide do akumulátora, je zodpovedajúca kľúčová hodnota ASCII.

Ako sa kódy kľúčov dostanú do frontu? Existuje rutina tabuľky skokov s názvom SCNKEY (pre skenovací kľúč). Túto rutinu môže vyvolať softvér aj hardvér. V tomto prípade je volaný elektronickým (fyzikálnym) obvodom v mikroprocesore, keď je elektrický signál IRQ je nízky. Ako sa to presne robí, nie je riešené v tomto online kariérnom kurze.

Kód na získanie prvého kódu klávesu z vyrovnávacej pamäte klávesnice do akumulátora A je len jeden riadok:

NASTÚPIŤ

Ak je vyrovnávacia pamäť klávesnice prázdna, do akumulátora sa vloží 00 USD. Pamätajte, že ASCII kód ​​pre nulu nie je 00 $; je to 30 dolárov. 00 dolárov znamená Null. V programe môže nastať bod, v ktorom musí program čakať na stlačenie klávesu. Kód na to je:

POČKAJ JSR GETIN
CMP # 00 USD
ŽABIE ČEKAJTE

V prvom riadku je „WAIT“ označenie, ktoré identifikuje adresu RAM, do ktorej je vložená (zapísaná) inštrukcia JSR. GETIN je tiež adresa. Je to adresa prvého zo zodpovedajúcich troch bajtov v tabuľke skokov. Položka GETIN, ako aj všetky položky v tabuľke skokov (okrem posledných troch), pozostávajú z troch bajtov. Prvý bajt položky je inštrukcia JSR. Ďalšie dva bajty sú adresou tela aktuálneho podprogramu GETIN, ktorý je stále v ROM (OS), ale pod tabuľkou skokov. Záznam hovorí, že treba prejsť na podprogram GETIN. Ak nie je rad klávesnice prázdny, GETIN vloží kód ASCII kľúča z radu First-In-First-Out do akumulátora. Ak je rad prázdny, do akumulátora sa vloží Null (00 USD).

Druhá inštrukcia porovnáva hodnotu akumulátora s 00 USD. Ak je to $00, znamená to, že rad klávesnice je prázdny a inštrukcia CMP pošle 1 do príznaku Z registra stavu procesora (jednoducho nazývaného stavový register). Ak hodnota v A nie je $00, inštrukcia CMP pošle 0 do príznaku Z stavového registra.

Tretia inštrukcia, ktorá je „BEQ WAIT“ pošle program späť na prvú inštrukciu, ak príznak Z stavového registra je 1. Prvá, druhá a tretia inštrukcia sa vykonávajú opakovane v poradí, kým sa nestlačí kláves na klávesnici. . Ak sa kláves nikdy nestlačí, cyklus sa opakuje donekonečna. Segment kódu, ako je tento, sa normálne zapisuje segmentom časovacieho kódu, ktorý po určitom čase opustí slučku, ak sa nikdy nestlačí kláves (pozri nasledujúcu diskusiu).

Poznámka : Klávesnica je predvolené vstupné zariadenie a obrazovka je predvolené výstupné zariadenie.

5.4 Kanál, Číslo zariadenia a Číslo logického súboru

Periférne zariadenia, ktoré táto kapitola používa na vysvetlenie operačného systému Commodore-64, sú klávesnica, obrazovka (monitor), disková jednotka s disketou, tlačiareň a modem, ktorý sa pripája cez rozhranie RS-232C. Aby komunikácia prebiehala medzi týmito zariadeniami a systémovou jednotkou (mikroprocesorom a pamäťou), musí byť vytvorený kanál.

Kanál pozostáva z vyrovnávacej pamäte, čísla zariadenia, čísla logického súboru a voliteľne sekundárnej adresy. Vysvetlenie týchto pojmov je nasledovné:

Buffer
Všimnite si z predchádzajúcej časti, že keď sa stlačí kláves, jeho kód musí prejsť na bajtové miesto v RAM v sérii desiatich po sebe nasledujúcich umiestnení. Táto séria desiatich umiestnení je vyrovnávacia pamäť klávesnice. Každé vstupné alebo výstupné zariadenie (periférne zariadenie) má v RAM sériu po sebe idúcich umiestnení nazývaných vyrovnávacia pamäť.

Číslo zariadenia
Pri Commodore-64 je každé periférne zariadenie označené číslom zariadenia. Nasledujúca tabuľka zobrazuje rôzne zariadenia a ich čísla:

Tabuľka 5.41
Čísla zariadení Commodore 64 a ich zariadenia
číslo Zariadenie
0 Klávesnica
1 Pásková jednotka
2 Rozhranie RS 232C napr. modem
3 Obrazovka
4 Tlačiareň #1
5 Tlačiareň #2
6 Plotter #1
7 Plotter #2
8 Disková jednotka
9
¦
¦
¦
30
Od 8 (vrátane) až po 22 ďalších úložných zariadení

Existujú dva typy portov pre počítač. Jeden typ je externý, na vertikálnom povrchu systémovej jednotky. Ďalší typ je interný. Tento interný port je register. Commodore-64 má štyri interné porty: port A a port B pre CIA 1 a port A a port B pre CIA 2. Existuje jeden externý port pre Commodore-64, ktorý sa nazýva sériový port. Zariadenia s číslom 3 vyššie sú pripojené k sériovému portu. Sú prepojené reťazovým spôsobom (jeden, ktorý je prepojený za druhým), pričom každý z nich je identifikovateľný podľa čísla zariadenia. Zariadenia s číslom 8 vyššie sú vo všeobecnosti úložné zariadenia.

Poznámka : Predvolené vstupné zariadenie je klávesnica s číslom zariadenia 0. Predvoleným výstupným zariadením je obrazovka s číslom zariadenia 3.

Logické číslo súboru
Logické číslo súboru je číslo priradené zariadeniu (periférnemu zariadeniu) v poradí, v akom sú otvorené pre prístup. Pohybujú sa od 010 do 255 10 .

Sekundárna adresa
Predstavte si, že na disku sú otvorené dva súbory (alebo viac súborov). Na rozlíšenie medzi týmito dvoma súbormi sa používajú sekundárne adresy. Sekundárne adresy sú čísla, ktoré sa líšia od zariadenia k zariadeniu. Význam 3 ako sekundárnej adresy pre tlačiareň je odlišný od významu 3 ako sekundárnej adresy pre diskovú jednotku. Význam závisí od funkcií, ako je napríklad otvorenie súboru na čítanie alebo otvorenie súboru na zápis. Možné sekundárne čísla sú od 0 10 do 15 10 pre každé zariadenie. Pre mnohé zariadenia sa číslo 15 používa na odosielanie príkazov.

Poznámka : Číslo zariadenia je známe aj ako adresa zariadenia a sekundárne číslo je tiež známe ako sekundárna adresa.

Identifikácia periférneho cieľa
Pre predvolenú pamäťovú mapu Commodore sú adresy pamäte od $0200 do $02FF (strana 2) používané výhradne operačným systémom v ROM (Kernal) a nie operačným systémom plus jazyk BASIC. BASIC však môže stále používať miesta prostredníctvom operačného systému ROM.

Modem a tlačiareň sú dva rôzne periférne ciele. Ak sa z disku otvoria dva súbory, ide o dva rôzne ciele. S predvolenou pamäťovou mapou existujú tri po sebe idúce tabuľky (zoznamy), ktoré možno považovať za jednu veľkú tabuľku. Tieto tri tabuľky obsahujú vzťah medzi číslami logických súborov, číslami zariadení a sekundárnymi adresami. Vďaka tomu sa konkrétny kanál alebo vstupný/výstupný cieľ stane identifikovateľným. Tieto tri tabuľky sa nazývajú tabuľky súborov. Adresy RAM a ich obsah sú:

$0259 — $0262: Tabuľka s označením, LAT, až desiatich aktívnych čísiel logických súborov.
$0263 — $026C: Tabuľka s označením, FAT, až s desiatimi zodpovedajúcimi číslami zariadení.
$026D — $0276: Tabuľka s označením, SAT, desiatich zodpovedajúcich sekundárnych adries.

Tu „-“ znamená „do“ a číslo zaberá jeden bajt.

Čitateľ sa môže opýtať: 'Prečo nie je vyrovnávacia pamäť pre každé zariadenie zahrnutá do identifikácie kanála?' Odpoveď je, že pri commodore-64 má každé externé zariadenie (periférne zariadenie) pevnú sériu bajtov v RAM (mapa pamäte). Bez akéhokoľvek otvoreného kanála sú ich pozície stále v pamäti. Napríklad vyrovnávacia pamäť pre klávesnicu je pevne stanovená od 0277 do 0280 USD (vrátane) pre predvolenú pamäťovú mapu.

Kernal podprogramy SETLFS a SETNAM
SETLFS a SETNAM sú rutiny jadra. Kanál možno považovať za logický súbor. Na otvorenie kanála je potrebné zadať číslo logického súboru, číslo zariadenia a voliteľnú sekundárnu adresu. Môže byť potrebný aj voliteľný názov súboru (text). Rutina SETLFS nastavuje číslo logického súboru, číslo zariadenia a voliteľnú sekundárnu adresu. Tieto čísla sú uvedené v príslušných tabuľkách. Rutina SETNAM nastaví názov reťazca pre súbor, ktorý môže byť povinný pre jeden kanál a voliteľný pre iný kanál. Ten pozostáva z ukazovateľa (dvojbajtovej adresy) v pamäti. Ukazovateľ ukazuje na začiatok reťazca (názov), ktorý môže byť na inom mieste v pamäti. Názov reťazca začína bajtom, ktorý má dĺžku reťazca, za ktorým nasleduje text (názov). Názov má maximálne šestnásť bajtov (dlhý).

Na zavolanie rutiny SETLFS musí používateľský program skočiť (JSR) na adresu $FFBA tabuľky skokov operačného systému v ROM pre predvolenú pamäťovú mapu. Pamätajte, že s výnimkou posledných šiestich bajtov tabuľky skokov sa každá položka skladá z troch bajtov. Prvý bajt je inštrukcia JSR, ktorá potom skočí do podprogramu a začína na adrese v nasledujúcich dvoch bajtoch. Na zavolanie rutiny SETNAM musí užívateľský program skočiť (JSR) na adresu $FFBD tabuľky skokov operačného systému v ROM. Použitie týchto dvoch rutín je uvedené v nasledujúcej diskusii.

5.5 Otvorenie kanála, otvorenie logického súboru, zatvorenie logického súboru a zatvorenie všetkých I/O kanálov

Kanál pozostáva z vyrovnávacej pamäte, čísla logického súboru, čísla zariadenia (adresa zariadenia) a voliteľnej sekundárnej adresy (číslo). Logický súbor (abstrakcia), ktorý je identifikovaný číslom logického súboru, môže odkazovať na periférne zariadenie, ako je tlačiareň, modem, disková jednotka atď. Každé z týchto rôznych zariadení by malo mať rôzne čísla logických súborov. Na disku je veľa súborov. Logický súbor môže odkazovať aj na konkrétny súbor na disku. Tento konkrétny súbor má tiež logické číslo súboru, ktoré sa líši od čísla periférnych zariadení, ako je tlačiareň alebo modem. Logické číslo súboru je dané programátorom. Môže to byť ľubovoľné číslo od 010 (00 USD) do 25510 (FF USD).

Rutina OS SETLFS
Rutina OS SETLFS, ku ktorej sa pristupuje skokom (JSR) do tabuľky skokov OS ROM v $FFBA, nastaví kanál. Do tabuľky súborov musí vložiť číslo logického súboru, čo je LAT (0259 $ – 0262 $). Do tabuľky súborov musí vložiť príslušné číslo zariadenia, ktoré je FAT (0263 $ – 026C). Ak prístup k súboru (zariadeniu) potrebuje sekundárne číslo, musí do tabuľky súborov vložiť zodpovedajúcu sekundárnu adresu (číslo), ktorá je SAT ($026D — $0276).

Aby mohol podprogram SETLFS fungovať, potrebuje získať číslo logického súboru z µP akumulátora; potrebuje získať číslo zariadenia z registra µP X. Ak to kanál potrebuje, potrebuje získať sekundárnu adresu z registra µP Y.

O logickom čísle súboru rozhoduje programátor. Čísla logických súborov, ktoré odkazujú na rôzne zariadenia, sa líšia. Teraz, pred volaním rutiny SETLFS, by mal programátor vložiť číslo logického súboru do µP akumulátora. Číslo zariadenia sa načíta z tabuľky (dokumentu), ako napríklad v tabuľke 5.41. Programátor by mal tiež vložiť číslo zariadenia do registra µP X. Dodávateľ zariadenia, ako je tlačiareň, disková jednotka atď., poskytuje možné sekundárne adresy a ich význam pre zariadenie. Ak kanál potrebuje sekundárnu adresu, programátor ju potrebuje získať z dokumentu, ktorý sa dodáva so zariadením (periférne zariadenie). Ak je potrebná sekundárna adresa (číslo), programátor ju musí vložiť do registra µP Y pred volaním podprogramu SETLFS. Ak nie je potrebná sekundárna adresa, programátor musí pred volaním podprogramu SETLFS vložiť číslo $FF do registra µP Y.

Podprogram SETLFS sa volá bez akéhokoľvek argumentu. Jeho argumenty sú už v troch registroch 6502 µP. Po vložení príslušných čísel do registrov sa rutina zavolá v programe jednoducho s nasledujúcim v samostatnom riadku:

JSR SETLFS

Rutina vloží rôzne čísla vhodne do svojich tabuliek súborov.

Rutina OS SETNAM
K rutine OS SETNAM sa pristupuje skokom (JSR) do tabuľky skokov OS ROM na $FFBD. Nie všetky miesta určenia majú názvy súborov. Pre tie, ktoré majú ciele (ako sú súbory na disku), by mal byť nastavený názov súboru. Predpokladajme, že názov súboru je „mydocum“, ktorý pozostáva zo 7 bajtov bez úvodzoviek. Predpokladajme, že tento názov je na miestach 101 až 107 USD (vrátane) a dĺžka 07 USD je na mieste 100 USD. Počiatočná adresa znakov reťazca je $ C101. Spodný bajt počiatočnej adresy je $01 a vyšší bajt je $C1.

Pred volaním rutiny SETNAM musí programátor vložiť číslo $07 (dĺžka reťazca) do µP akumulátora. Dolný bajt počiatočnej adresy reťazca $01 sa vloží do registra µP X. Vyšší bajt počiatočnej adresy reťazca $C1 sa vloží do registra µP Y. Podprogram sa volá jednoducho nasledujúcim spôsobom:

JSR SETNAM

Rutina SETNAM spája hodnoty z troch registrov s kanálom. Potom už hodnoty nemusia zostať v registroch. Ak kanál nepotrebuje názov súboru, programátor musí do µP akumulátora vložiť $00. V tomto prípade sa ignorujú hodnoty, ktoré sú v registroch X a Y.

Rutina OPEN OS
K rutine OS OPEN sa pristupuje skokom (JSR) do tabuľky skokov OS ROM na $FFC0. Táto rutina používa číslo logického súboru, číslo zariadenia (a vyrovnávaciu pamäť), možnú sekundárnu adresu a možný názov súboru na zabezpečenie spojenia medzi počítačom commodore a súborom v externom zariadení alebo samotným externým zariadením.

Táto rutina, rovnako ako všetky ostatné rutiny Commodore OS ROM, neprijíma žiadne argumenty. Hoci používa registre µP, žiadny z registrov nemusel byť vopred načítaný argumentmi (hodnotami). Ak ho chcete nakódovať, po zavolaní SETLFS a SETNAM napíšte nasledovné:

JSR OTVORENÉ

Pri rutine OPEN sa môžu vyskytnúť chyby. Súbor sa napríklad nemusí nájsť na čítanie. Keď sa vyskytne chyba, rutina zlyhá a vloží zodpovedajúce číslo chyby do akumulátora µP a nastaví príznak prenosu (na 1) stavového registra µP. V nasledujúcej tabuľke sú uvedené čísla chýb a ich význam:

Tabuľka 5.51
Čísla jadrových chýb a ich význam pre rutinu OPEN OS ROM
Číslo chyby Popis Príklad
1 PRÍLIŠ VEĽA SÚBOROV OPEN, keď je už otvorených desať súborov
2 SÚBOR OTVORENÝ OTVORENÉ 1,3: OTVORENÉ 1,4
3 SÚBOR NIE JE OTVORENÝ PRINT#5 bez OPEN
4 SÚBOR NENÁJDENÝ ZAŤAŽENIE „NEEXISTUJE“,8
5 ZARIADENIE NEPRÍTOMNÉ OPEN 11,11: PRINT#11
6 NIE JE VSTUPNÝ SÚBOR OTVORIŤ „SEQ,S,W“: GET#8,X$
7 NIE JE VÝSTUPNÝ SÚBOR OPEN 1,0: PRINT#1
8 CHYBÍ NÁZOV SÚBORU LOAD “”,8
9 NEZÁKONNÉ ZARIADENIE Č. NAČÍTAJTE „PROGRAM“, 3

Táto tabuľka je prezentovaná spôsobom, ktorý čitateľ pravdepodobne uvidí na mnohých iných miestach.

Rutina OS CHKIN
K rutine OS CHKIN sa pristupuje skokom (JSR) do tabuľky skokov OS ROM na $FFC6. Po otvorení súboru (logického súboru) je potrebné rozhodnúť, či je otvorenie pre vstup alebo výstup. Rutina CHKIN robí z otvorenia vstupný kanál. Táto rutina potrebuje prečítať číslo logického súboru z registra µP X. Takže programátor musí vložiť číslo logického súboru do registra X pred volaním tejto rutiny. Volá sa jednoducho takto:

JSR CHKIN

Rutina OS CHKOUT
K rutine OS CHKOUT sa pristupuje skokom (JSR) do tabuľky skokov OS ROM na $FFC9. Po otvorení súboru (logického súboru) sa treba rozhodnúť, či je otvorenie pre vstup alebo výstup. Rutina CHKOUT robí z otvorenia výstupný kanál. Táto rutina potrebuje prečítať číslo logického súboru z registra µP X. Takže programátor musí pred volaním tejto rutiny vložiť číslo logického súboru do registra X. Volá sa jednoducho takto:

JSR CHKOUT

Rutina ZATVORENIE OS
K rutine OS CLOSE sa pristupuje skokom (JSR) do tabuľky skokov OS ROM na $FFC3. Po otvorení logického súboru a prenose bajtov sa musí logický súbor zatvoriť. Zatvorením logického súboru sa uvoľní vyrovnávacia pamäť v systémovej jednotke, aby ju mohol použiť iný logický súbor, ktorý sa ešte len má otvoriť. Zodpovedajúce parametre v troch tabuľkách súborov sa tiež vymažú. Umiestnenie RAM pre počet otvorených súborov sa zníži o 1.

Po zapnutí napájania počítača dôjde k hardvérovému resetu mikroprocesora a ďalších hlavných čipov (integrovaných obvodov) na základnej doske. Nasleduje inicializácia niektorých miest pamäte RAM a niektorých registrov v niektorých čipoch základnej dosky. V procese inicializácie je umiestnenie bajtovej pamäte adresy $0098 na stránke nula uvedené s označením NFILES alebo LDTND v závislosti od verzie operačného systému. Kým je počítač v prevádzke, toto jednobajtové umiestnenie s 8 bitmi obsahuje počet logických súborov, ktoré sú otvorené, a index počiatočnej adresy troch po sebe nasledujúcich tabuliek súborov. Inými slovami, tento bajt má počet otvorených súborov, ktorý sa pri zatvorení logického súboru zníži o 1. Po zatvorení logického súboru už nie je možný prístup k terminálovému (cieľovému) zariadeniu alebo aktuálnemu súboru na disku.

Na zatvorenie logického súboru musí programátor vložiť číslo logického súboru do µP akumulátora. Toto je rovnaké logické číslo súboru, aké sa používa pri otváraní súboru. Rutina CLOSE to potrebuje na zatvorenie konkrétneho súboru. Podobne ako iné rutiny OS ROM, rutina CLOSE neberie argument, hoci hodnota, ktorá sa používa z akumulátora, je do istej miery argument. Riadok s pokynmi v jazyku symbolických inštrukcií je jednoducho:

JSR ZATVORENÉ

Vlastné alebo preddefinované podprogramy jazyka symbolických adries (rutiny) 6502 neberú argumenty. Argumenty však prichádzajú neformálne vložením hodnôt, ktoré bude podprogram používať, do registrov mikroprocesora.

Rutina CLRCHN
K rutine OS CLRCHN sa pristupuje skokom (JSR) do tabuľky skokov OS ROM na $FFCC. CLRCHN znamená CLEAR CHanneL. Po zatvorení logického súboru sa vymažú jeho parametre číslo logického súboru, číslo zariadenia a možná sekundárna adresa. Kanál pre logický súbor je teda vyčistený.

Manuál hovorí, že rutina OS CLRCHN vymaže všetky otvorené kanály a obnoví predvolené čísla zariadení a iné predvolené hodnoty. Znamená to, že číslo zariadenia pre periférne zariadenie je možné zmeniť? No nie tak celkom. Počas inicializácie operačného systému je bajtové umiestnenie adresy $0099 označené štítkom DFLTI, ktorý obsahuje aktuálne číslo vstupného zariadenia, keď je počítač v prevádzke. Commodore-64 môže naraz pristupovať iba k jednej periférii. Počas inicializácie operačného systému je umiestnenie bajtu adresy $009A označené štítkom DFLTO, ktorý obsahuje aktuálne číslo výstupného zariadenia, keď je počítač v prevádzke.

Keď je volaný podprogram CLRCHN, nastaví premennú DFLTI na 0 ($00), čo je predvolené číslo vstupného zariadenia (klávesnica). Nastaví premennú DFLTO na 3 (03 USD), čo je predvolené číslo výstupného zariadenia (obrazovka). Ostatné premenné čísla zariadenia sa vynulujú podobne. To je význam resetovania (alebo obnovy) vstupných/výstupných zariadení do normálu (predvolené hodnoty).

Manuál Commodore-64 hovorí, že po zavolaní rutiny CLRCHN zostávajú otvorené logické súbory otvorené a stále môžu prenášať bajty (údaje). To znamená, že rutina CLRCHN nevymaže zodpovedajúce položky v tabuľkách súborov. Názov CLRCHN je pre svoj význam dosť nejednoznačný.

5.6 Odoslanie postavy na obrazovku

Hlavný integrovaný obvod (IC) na obsluhu zobrazovania znakov a grafiky na obrazovke sa nazýva Video Interface Controller (čip), ktorý je v Commodore-64 skrátený ako VIC (v skutočnosti VIC II pre VIC verzie 2). Aby sa informácia (hodnoty) dostala na obrazovku, musí prejsť cez VIC II, kým sa dostane na obrazovku.

Obrazovka pozostáva z 25 riadkov a 40 stĺpcov buniek so znakmi. Na obrazovke tak možno zobraziť 40 x 25 = 1 000 znakov. VIC II číta zodpovedajúcim spôsobom 1000 pamäťových RAM po sebe idúcich miest bajtov pre znaky. Týchto 1000 miest spolu je známych ako pamäť obrazovky. To, čo ide do týchto 1000 miest, sú kódy znakov. Pre Commodore-64 sa kódy znakov líšia od kódov ASCII.

Znakový kód nie je znakový vzor. Existuje aj to, čo je známe ako charakter ROM. Znaková ROM pozostáva zo všetkých druhov vzorov znakov, z ktorých niektoré zodpovedajú vzorom znakov na klávesnici. Znaková ROM sa líši od pamäte obrazovky. Keď sa má na obrazovke zobraziť znak, kód znaku sa odošle na pozíciu medzi 1000 pozíciami v pamäti obrazovky. Odtiaľ sa vyberie zodpovedajúci vzor zo znakovej ROM, ktorý sa má zobraziť na obrazovke. Výber správneho vzoru v znakovej ROM zo znakového kódu vykonáva VIC II (hardvér).

Mnoho pamäťových miest medzi $ D000 a $ DFFF má dva účely: používajú sa na spracovanie vstupných/výstupných operácií iných ako obrazovka alebo sa používajú ako znaková ROM pre obrazovku. Ide o dva bloky pamäte. Jedna je RAM a druhá je ROM pre ROM pre postavy. Výmena bánk na spracovanie buď vstupu/výstupu alebo vzorov znakov (znaková ROM) sa vykonáva softvérom (rutina operačného systému v ROM od $ F000 do $ FFFF).

Poznámka : VIC má registre, ktoré sú adresované adresami pamäťového priestoru v rozsahu $ D000 a $ DFFF.

Rutina CHROUT
K rutine OS CHROUT sa pristupuje skokom (JSR) do tabuľky skokov OS ROM na $FFD2. Táto rutina, keď je zavolaná, vezme bajt, ktorý programátor vložil do µP akumulátora a vytlačí ho na obrazovke, kde je kurzor. Segment kódu na vytlačenie znaku „E“ je napríklad:

LDA # 05 USD
CHROUT

0516 nie je kód ASCII pre „E“. Commodore-64 má svoje vlastné kódy znakov pre obrazovku, kde $05 znamená „E“. Číslo #$05 sa uloží do pamäte obrazovky predtým, ako ho VIC odošle na obrazovku. Tieto dva kódovacie riadky by mali prísť po nastavení kanála, otvorení logického súboru a vyvolaní rutiny CHKOUT pre výstup. Kompletný kód je:

; Nastavte kanál
LDA # 40 USD ; logické číslo súboru
LDX # 03 USD ; číslo zariadenia pre obrazovku je 03 USD
LDY #$FF ; žiadna sekundárna adresa
JSR SETLFS ; správne nastavenie kanála
; nie SETNAM, pretože obrazovka nepotrebuje názov
;
; Otvorte logický súbor
JSR OTVORENÉ
; Nastavte kanál pre výstup
LDX #40 $; logické číslo súboru
JSR CHKOUT
;
; Výstup znaku na obrazovku
LDA # 05 USD
JSR CHROUT
; Zatvorte logický súbor
LDA # 40 dolárov
JSR ZATVORENÉ

Pred spustením iného programu by mal byť otvor zatvorený. Predpokladajme, že používateľ počítača zadá znak na klávesnici podľa očakávania. Nasledujúci program vytlačí znak z klávesnice na obrazovku:

; Nastavte kanál
LDA # 40 USD ; logické číslo súboru
LDX # 03 USD ; číslo zariadenia pre obrazovku je 03 USD
LDY #$FF ; žiadna sekundárna adresa
JSR SETLFS ; správne nastavenie kanála
; nie SETNAM, pretože obrazovka nepotrebuje názov
;
; Otvorte logický súbor
JSR OTVORENÉ
; Nastavte kanál pre výstup
LDX #40 $; logické číslo súboru
JSR CHKOUT
;
; Zadajte znak z klávesnice
POČKAJ JSR GETIN ; vloží 00 USD do A, ak je front na klávesnici prázdny
CMP # 00 USD ; Ak 00 USD pripadlo na A, potom Z je pri porovnaní 1
BEQ POČKAŤ ; ZÍSKAŤ z fronty znova, ak 0 prešla do akumulátora
BNE PRNSCRN ; prejdite na PRNSCRN, ak Z je 0, pretože A už nemá 00 USD
; Výstup znaku na obrazovku
PRNSCRN JSR CHROUT ; pošlite znak v A na obrazovku
; Zatvorte logický súbor
LDA # 40 dolárov
JSR ZATVORENÉ

Poznámka : WAIT a PRNSCRN sú štítky, ktoré identifikujú adresy. Bajt z klávesnice, ktorý prichádza do µP akumulátora, je kód ASCII. Zodpovedajúci kód, ktorý má Commodore-64 odoslať na obrazovku, sa musí líšiť. V predchádzajúcom programe sa to kvôli jednoduchosti neberie do úvahy.

5.7 Odosielanie a prijímanie bajtov pre diskovú jednotku

V systémovej jednotke (základnej doske) Commodore-64 sú dva komplexné adaptéry rozhrania s názvom VIA #1 a CIA #2. Každá CIA má dva paralelné porty, ktoré sa nazývajú Port A a Port B. Na vertikálnom povrchu na zadnej strane systémovej jednotky Commodre-64 je externý port, ktorý sa nazýva sériový port. Tento port má 6 pinov, z ktorých jeden je pre dáta. Dáta vstupujú alebo opúšťajú systémovú jednotku v sérii, jeden bit po druhom.

Napríklad osem paralelných bitov z interného portu A CIA #2 môže vyjsť zo systémovej jednotky cez externý sériový port po prevedení na sériové dáta posuvným registrom v CIA. Osembitové sériové dáta z externého sériového portu môžu ísť do interného portu A CIA #2 potom, čo sú prevedené na paralelné dáta posuvným registrom v CIA.

Systémová jednotka Commodore-64 (základná jednotka) používa externý disk s disketou. K tejto diskovej jednotke je možné pripojiť tlačiareň reťazovým spôsobom (zariadenia spájajúce do série ako reťazec). Dátový kábel pre diskovú jednotku je pripojený k externému sériovému portu systémovej jednotky Commodore-64. To znamená, že k rovnakému sériovému portu je pripojená aj tlačiareň. Tieto dve zariadenia sú označené dvoma rôznymi číslami zariadení (zvyčajne 8 a 4).

Pri odosielaní alebo prijímaní údajov pre diskovú jednotku prebieha rovnaký postup, ako bol popísaný vyššie. To je:

  • Nastavenie názvu logického súboru (čísla), ktorý je rovnaký ako skutočný diskový súbor pomocou rutiny SETNAM.
  • Otvorenie logického súboru pomocou rutiny OPEN.
  • Rozhodovanie, či ide o vstup alebo výstup pomocou rutiny CHKOUT alebo CHKIN.
  • Odosielanie alebo prijímanie údajov pomocou inštrukcie STA a/alebo LDA.
  • Zatvorenie logického súboru pomocou rutiny CLOSE.

Logický súbor musí byť zatvorený. Zatvorením logického súboru efektívne zatvoríte daný kanál. Pri nastavovaní kanála pre diskovú jednotku rozhoduje o logickom čísle súboru programátor. Je to číslo medzi 00 $ a FF $ (vrátane). Nemalo by to byť číslo, ktoré už bolo zvolené pre akékoľvek iné zariadenie (alebo skutočný súbor). Číslo zariadenia je 8, ak existuje iba jedna disková jednotka. Sekundárnu adresu (číslo) získate v príručke k diskovej jednotke. Nasledujúci program používa 2. Program zapíše písmeno „E“ (ASCII) do súboru na disku s názvom „mydoc.doc“. Predpokladá sa, že tento názov začína na adrese pamäte $ C101. Takže nižší bajt $01 musí byť v registri X a vyšší bajt $C1 musí byť v registri Y pred volaním rutiny SETNAM. Register A by mal mať pred volaním rutiny SETNAM aj číslo $09.

; Nastavte kanál
LDA # 40 USD ; logické číslo súboru
LDX # 08 USD ; číslo zariadenia pre prvú diskovú jednotku
LDY # 02 $; sekundárna adresa
JSR SETLFS ; správne nastavenie kanála
;
; Súbor na disku potrebuje názov (už je v pamäti)
LDA # 09 USD
LDX # 01 USD
LDY#$C1
JSR SETNAM
; Otvorte logický súbor
JSR OTVORENÉ
; Nastavte kanál pre výstup
LDX #40 $; logické číslo súboru
JSR CHKOUT ;na písanie
;
; Výstupný znak na disk
LDA # 45 USD
JSR CHROUT
; Zatvorte logický súbor
LDA # 40 dolárov
JSR ZATVORENÉ

Ak chcete načítať bajt z disku do registra µP Y, zopakujte predchádzajúci program s nasledujúcimi zmenami: Namiesto „JSR CHKOUT ; na písanie“, použite „JSR CHKIN ; na čítanie“. Nahraďte segment kódu za „; Výstupný znak na disk“ s nasledujúcim:

; Zadajte znak z disku
JSR CHRIS

K rutine OS CHRIN sa pristupuje skokom (JSR) do tabuľky skokov OS ROM na $FFCF. Táto rutina, keď je volaná, získa bajt z kanála, ktorý je už nastavený ako vstupný kanál, a vloží ho do registra µP A. Namiesto CHRIN možno použiť aj rutinu GETIN ROM OS.

Odoslanie bajtu do tlačiarne
Odoslanie bajtu do tlačiarne sa vykonáva podobným spôsobom ako odoslanie bajtu do súboru na disku.

5.8 Rutina ULOŽENIE OS

K rutine OS SAVE sa pristupuje skokom (JSR) do tabuľky skokov OS ROM na $FFD8. Rutina OS SAVE v ROM uloží (vypíše) časť pamäte na disk ako súbor (s názvom). Počiatočná adresa sekcie v pamäti musí byť známa. Musí byť známa aj koncová adresa sekcie. Spodný bajt počiatočnej adresy je umiestnený na stránke nula v RAM na adrese $002B. Vyšší bajt počiatočnej adresy sa umiestni na nasledujúce miesto v pamäti bajtov na adrese $002C. Na stránke nula sa označenie TXTTAB vzťahuje na tieto dve adresy, hoci TXTTAB v skutočnosti znamená adresu $002B. Spodný bajt koncovej adresy je umiestnený v registri µP X. Vyšší bajt koncovej adresy plus 1 sa umiestni do registra µP Y. Register µP A má hodnotu 2 miliardy dolárov pre TXTTAB (002 miliárd dolárov). Pomocou toho možno rutinu SAVE volať s nasledujúcim:

JSR ULOŽIŤ

Časť pamäte, ktorá sa má uložiť, môže byť program v jazyku symbolických inštancií alebo dokument. Príkladom dokumentu môže byť list alebo esej. Ak chcete použiť rutinu ukladania, je potrebné dodržať nasledujúci postup:

  • Nastavte kanál pomocou rutiny SETLFS.
  • Pomocou rutiny SETNAM nastavte názov logického súboru (číslo), ktorý je rovnaký ako skutočný diskový súbor.
  • Otvorte logický súbor pomocou rutiny OPEN.
  • Vytvorte súbor pre výstup pomocou CHKOUT.
  • Sem sa nachádza kód na uloženie súboru, ktorý končí „JSR SAVE“.
  • Zatvorte logický súbor pomocou rutiny CLOSE.

Nasledujúci program uloží súbor, ktorý začína na pamäťových miestach $ C101 až $ C200:

; Nastavte kanál
LDA # 40 USD ; logické číslo súboru
LDX # 08 USD ; číslo zariadenia pre prvú diskovú jednotku
LDY # 02 $; sekundárna adresa
JSR SETLFS ; správne nastavenie kanála
;
; Názov súboru na disku (už v pamäti za 301 $)
LDA # 09 USD ; dĺžka názvu súboru
LDX # 01 USD
LDY#$C3
JSR SETNAM
; Otvorte logický súbor
JSR OTVORENÉ
; Nastavte kanál pre výstup
LDX #40 $; logické číslo súboru
JSR CHKOUT ; na písanie
;
; Výstupný súbor na disk
LDA # 01 USD
STA $ 2 miliardy ; TXTTAB
LDA # $ C1
STA $ 2C
LDX # 00 USD
LDY#$C2
LDA # 2 miliardy USD
JSR ULOŽIŤ
; Zatvorte logický súbor
LDA # 40 dolárov
JSR ZATVORENÉ

Všimnite si, že toto je program, ktorý ukladá inú časť pamäte (nie časť programu) na disk (disketa pre Commodore-64).

5.9 Rutina NAČÍTANIE OS

K rutine OS LOAD sa pristupuje skokom (JSR) do tabuľky skokov OS ROM na $FFD5. Keď sa časť (veľká oblasť) pamäte uloží na disk, uloží sa s hlavičkou, ktorá má počiatočnú adresu časti v pamäti. Podprogram OS LOAD načíta bajty súboru do pamäte. Pri tejto operácii LOAD musí byť hodnota akumulátora 010 (00 USD). Aby operácia LOAD prečítala počiatočnú adresu v hlavičke súboru na disku a vložila bajty súboru do pamäte RAM počnúc od tejto adresy, sekundárna adresa pre kanál musí byť 1 alebo 2 (nasledujúci program používa 2). Táto rutina vráti adresu plus 1 najvyššieho načítaného miesta RAM. To znamená, že dolný bajt poslednej adresy súboru v RAM plus 1 sa vloží do registra µP X a horný bajt poslednej adresy súboru v RAM plus 1 sa vloží do registra µP Y.

Ak je načítanie neúspešné, register µP A obsahuje číslo chyby (možno 4, 5, 8 alebo 9). Nastaví sa aj príznak C stavového registra mikroprocesora (vyrobený 1). Ak je načítanie úspešné, posledná hodnota registra A nie je dôležitá.

Teraz, v predchádzajúcej kapitole tohto online kariérneho kurzu, je prvá inštrukcia programu v assembleri na adrese v RAM, kde sa program spustil. Nemusí to tak byť. To znamená, že prvá inštrukcia programu nemusí byť na začiatku programu v RAM. Inštrukcia na spustenie programu môže byť kdekoľvek v súbore v pamäti RAM. Programátorovi sa odporúča označiť začiatok inštrukcie v jazyku symbolických inštrukcií START. Potom sa program po načítaní znova spustí (spustí) s nasledujúcou inštrukciou jazyka symbolických inštrukcií:

JSR START

„JSR START“ je v programe assembler, ktorý načíta program, ktorý sa má spustiť. Assembler, ktorý načíta iný súbor v assembleri a spustí načítaný súbor, má nasledujúci kódový postup:

  • Nastavte kanál pomocou rutiny SETLFS.
  • Pomocou rutiny SETNAM nastavte názov logického súboru (číslo), ktorý je rovnaký ako skutočný diskový súbor.
  • Otvorte logický súbor pomocou rutiny OPEN.
  • Urobte z neho súbor pre vstup pomocou CHKIN.
  • Kód na načítanie súboru ide sem a končí „JSR LOAD“.
  • Zatvorte logický súbor pomocou rutiny CLOSE.

Nasledujúci program načíta súbor z disku a spustí ho:

; Nastavte kanál
LDA # 40 USD ; logické číslo súboru
LDX # 08 USD ; číslo zariadenia pre prvú diskovú jednotku
LDY # 02 $; sekundárna adresa
JSR SETLFS ; správne nastavenie kanála
;
; Názov súboru na disku (už v pamäti za 301 $)
LDA # 09 USD ; dĺžka názvu súboru
LDX # 01 USD
LDY#$C3
JSR SETNAM
; Otvorte logický súbor
JSR OTVORENÉ
; Nastavte kanál pre vstup
LDX #40 $; logické číslo súboru
JSR CHKIN ; na čítanie
;
; Vstupný súbor z disku
LDA # 00 USD
JSR LOAD
; Zatvorte logický súbor
LDA # 40 dolárov
JSR ZATVORENÉ
; Spustite načítaný program
JSR START

5.10 Modem a štandard RS-232

Modem je zariadenie (periférne zariadenie), ktoré konvertuje bity z počítača na zodpovedajúce elektrické zvukové signály, ktoré sa majú prenášať cez telefónnu linku. Na prijímacom konci je modem pred prijímacím počítačom. Tento druhý modem prevádza elektrické zvukové signály na bity pre prijímajúci počítač.

Modem musí byť pripojený k počítaču na externom porte (na vertikálnom povrchu počítača). Štandard RS-232 sa vzťahuje na konkrétny typ konektora, ktorý spája modem s počítačom (v minulosti). Inými slovami, mnoho počítačov v minulosti malo externý port, ktorým bol konektor RS-232 alebo konektor kompatibilný s RS-232.

Systémová jednotka Commodore-64 (počítač) má na svojej zadnej zvislej ploche externý port, ktorý sa nazýva užívateľský port. Tento užívateľský port je kompatibilný s RS-232. Dá sa tam pripojiť modemové zariadenie. Commodore-64 komunikuje s modemom cez tento užívateľský port. Operačný systém ROM pre Commodore-64 má podprogramy na komunikáciu s modemom nazývané rutiny RS-232. Tieto rutiny majú položky v tabuľke skokov.

prenosová rýchlosť
Osembitový bajt z počítača sa pred odoslaním do modemu skonvertuje na sériu ôsmich bitov. Opačný postup sa vykonáva z modemu do počítača. Prenosová rýchlosť je počet bitov, ktoré sa prenesú za sekundu v sérii.

Spodná časť pamäte
Pojem „Spodná časť pamäte“ sa nevzťahuje na umiestnenie bajtov pamäte adresy 0000 USD. Vzťahuje sa na najnižšie umiestnenie pamäte RAM, kde môže používateľ začať ukladať svoje údaje a programy. V predvolenom nastavení je to 0 800 USD. Pripomeňme si z predchádzajúcej diskusie, že veľa miest medzi $ 0800 a $ BFFF používa počítačový jazyk BASIC a jeho programátori (používatelia). Na použitie pre programy a údaje v jazyku symbolických adries sú ponechané len adresy $ C000 až $ CFFF; to sú 4 kB zo 64 kB pamäte.

Začiatok pamäte
V tých časoch, keď si klienti kúpili počítače Commodore-64, niektoré neprišli so všetkými pamäťovými miestami. Takéto počítače mali ROM s operačným systémom od $ 000 do $ FFFF. Mali RAM od 0 000 $ do limitu, ktorý nie je $ DFFF, vedľa E 000 $. Limit bol pod $ DFFF a tento limit sa nazýva „Top of Memory“. Horná časť pamäte sa teda nevzťahuje na umiestnenie $FFFF.

Commodore-64 Buffer pre komunikáciu RS-232
Vysielacia vyrovnávacia pamäť
Vyrovnávacia pamäť pre prenos RS-232 (výstup) zaberá 256 bajtov od hornej časti pamäte smerom nadol. Ukazovateľ pre túto vysielaciu vyrovnávaciu pamäť je označený ako ROBUF. Tento ukazovateľ je na stránke nula s adresami $00F9, za ktorými nasleduje $00FA. ROBUF v skutočnosti identifikuje $00F9. Ak je teda adresa začiatku vyrovnávacej pamäte $BE00, nižší bajt $BE00, čo je $00, je v umiestnení $00F9 a vyšší bajt $BE00, čo je $BE, je v $00FA umiestnenie.

Príjem vyrovnávacej pamäte
Vyrovnávacia pamäť na príjem RS-232 bajtov (vstup) zaberá 256 bajtov zo spodnej časti vysielacej vyrovnávacej pamäte. Ukazovateľ pre túto prijímaciu vyrovnávaciu pamäť je označený ako RIBUF. Tento ukazovateľ je na stránke nula s adresami $00F7, za ktorými nasleduje $00F8. RIBUF v skutočnosti identifikuje $00F7. Ak je teda adresa začiatku vyrovnávacej pamäte $BF00, nižší bajt $BF00, čo je $00, je v umiestnení $00F7 a vyšší bajt $BF00, čo je $BF, je v $00F8. umiestnenie. Takže 512 bajtov z hornej časti pamäte sa používa ako celková vyrovnávacia pamäť RAM RS-232.

RS-232 kanál
Keď je modem pripojený k (externému) užívateľskému portu, komunikácia s modemom je len komunikácia RS-232. Postup na získanie kompletného kanála RS-232 je takmer rovnaký ako v predchádzajúcej diskusii, ale s jedným dôležitým rozdielom: názov súboru je kód a nie reťazec v pamäti. Kód $0610 je dobrá voľba. Znamená to prenosovú rýchlosť 300 bitov/s a niektoré ďalšie technické parametre. Tiež neexistuje žiadna sekundárna adresa. Všimnite si, že číslo zariadenia je 2. Postup nastavenia kompletného kanála RS-232 je:

  • Nastavenie kanálu pomocou rutiny SETLFS.
  • Nastavenie názvu logického súboru, $0610.
  • Otvorenie logického súboru pomocou rutiny OPEN.
  • Vytvorenie súboru pre výstup pomocou CHKOUT alebo súboru pre vstup pomocou CHKIN.
  • Odosielanie jednotlivých bajtov pomocou CHROUT alebo prijímanie jednotlivých bajtov pomocou GETIN.
  • Zatvorenie logického súboru pomocou rutiny CLOSE.

K rutine OS GETIN sa pristupuje skokom (JSR) do tabuľky skokov OS ROM na $FFE4. Táto rutina, keď je zavolaná, vezme bajt odoslaný do vyrovnávacej pamäte prijímača a vloží (vráti) ho do µP akumulátora.

Nasledujúci program odošle bajt „E“ (ASCII) do modemu, ktorý je pripojený k používateľskému portu kompatibilnému s RS-232:

; Nastavte kanál
LDA # 40 USD ; logické číslo súboru
LDX # 02 USD ; číslo zariadenia pre RS-232
LDY #$FF ; žiadna sekundárna adresa
JSR SETLFS ; správne nastavenie kanála
;
; Názov pre RS-232 je kód napr. 0610 dolárov
LDA # 02 USD ; dĺžka kódu je 2 bajty
LDX #10 dolárov
LDY # 06 USD
JSR SETNAM
;
; Otvorte logický súbor
JSR OTVORENÉ
; Nastavte kanál pre výstup
LDX #40 $; logické číslo súboru
JSR CHKOUT
;
; Výstupný znak na RS-232 napr. modem
LDA # 45 USD
JSR CHROUT
; Zatvorte logický súbor
LDA # 40 dolárov
JSR ZATVORENÉ

Na prijatie bajtu je kód veľmi podobný, až na to, že „JSR CHKOUT“ je nahradené „JSR CHKIN“ a:

LDA # 45 USD
JSR CHROUT

sa nahrádza „JSR GETIN“, pričom výsledok sa zapíše do registra A.

Nepretržité odosielanie alebo prijímanie bajtov sa uskutočňuje slučkou na odosielanie alebo prijímanie segmentu kódu, resp.

Všimnite si, že vstup a výstup v Commodore je vo väčšine prípadov podobný, s výnimkou klávesnice, kde niektoré rutiny nevolá programátor, ale volá ich operačný systém.

5.11 Počítanie a časovanie

Zvážte postupnosť odpočítavania, ktorá je:

2, 1, 0

Toto je odpočítavanie od 2 do 0. Teraz zvážte opakujúcu sa postupnosť odpočítavania:

2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0

Toto je opakované odpočítavanie rovnakej sekvencie. Postupnosť sa opakuje štyrikrát. Štyrikrát znamená, že čas je 4. V rámci jednej sekvencie sa počíta. Opakovaním rovnakej sekvencie je načasovanie.

V systémovej jednotke Commodore-64 sú dva komplexné adaptéry rozhrania. Každá CIA má dva obvody počítadla/časovača pomenované Timer A (TA) a Timer B (TB). Počítací obvod sa nelíši od časovacieho obvodu. Počítadlo alebo časovač v Commodore-64 odkazuje na to isté. V skutočnosti každý z nich v podstate odkazuje na jeden 16-bitový register, ktorý vždy odpočítava do 0 pri impulzoch systémových hodín. Do 16-bitového registra je možné nastaviť rôzne hodnoty. Čím väčšia je hodnota, tým dlhšie trvá odpočítavanie do nuly. Zakaždým, keď jeden z časovačov prekročí nulu, IRQ signál prerušenia sa odošle do mikroprocesora. Keď počítanie klesne pod nulu, nazýva sa to podtečenie.

V závislosti od toho, ako je naprogramovaný obvod časovača, môže časovač bežať v jednorazovom režime alebo v nepretržitom režime. Podľa predchádzajúcej ilustrácie jednorazový režim znamená „urobte 2, 1, 0“ a zastavte sa, kým budú pokračovať hodinové impulzy. Nepretržitý režim je ako „2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0 atď. ktorý pokračuje s hodinovými impulzmi. To znamená, že keď prekročí nulu, ak nie je zadaný žiadny pokyn, sekvencia odpočítavania sa zopakuje. Najväčšie číslo je zvyčajne oveľa väčšie ako 2.

Generuje sa časovač A (TA) CIA #1 IRQ v pravidelných intervaloch (trvaní) vykonávať servis klávesnice. V skutočnosti je to štandardne každú 1/60 sekundy. IRQ sa odosiela do mikroprocesora každú 1/60 sekundy. Je to len vtedy, keď IRQ sa odošle, že program dokáže prečítať hodnotu kľúča z frontu klávesnice (buffer). Pamätajte, že mikroprocesor má iba jeden kolík pre IRQ signál. Mikroprocesor má tiež iba jeden pin pre NMI signál. Signál ¯NMI do mikroprocesora vždy pochádza z CIA #2.

16-bitový register časovača má dve adresy pamäte: jednu pre nižší bajt a jednu pre vyšší bajt. Každá CIA má dva časové obvody. Tieto dve CIA sú totožné. Pre CIA #1 sú adresy pre dva časovače: DC04 a DC05 pre TA a DC06 a DC07 pre TB. Pre CIA #2 sú adresy pre dva časovače: DD04 a DD05 pre TA a DD06 a DD07 pre TB.

Predpokladajme, že číslo 25510 sa má odoslať do časovača TA CIA #2 na odpočítavanie. 25510 = 00000000111111112 je v šestnástich bitoch. 00000000111111112 = $000FFF je v šestnástkovej sústave. V tomto prípade sa $FF odošle do registra na adresu $DD04 a $00 sa odošle do registra na adresu $DD05 – little endianness. Nasledujúci segment kódu odošle číslo do registra:

LDA # $ FF
ŠTÁT DD04 USD
LDA # 00 USD
ŠTÁT DD05 USD

Hoci registre v CIA majú adresy RAM, fyzicky sú v CIA a CIA je samostatný IC od RAM alebo ROM.

To nie je všetko! Keď je časovaču pridelené číslo na odpočítavanie, ako napríklad pri predchádzajúcom kóde, odpočítavanie sa nezačne. Odpočítavanie začína, keď bol do príslušného riadiaceho registra pre časovač odoslaný osembitový bajt. Prvý bit tohto bajtu pre riadiaci register udáva, či má alebo nemá začať odpočítavanie. Hodnota 0 pre tento prvý bit znamená zastavenie odpočítavania, kým hodnota 1 znamená spustenie odpočítavania. Bajt musí tiež udávať, či je odpočítavanie v režime jedného záberu (jednorazový) alebo v režime voľného chodu (nepretržitý režim). Jednorázový režim odpočítava a zastaví sa, keď hodnota registra časovača klesne na nulu. V režime voľného chodu sa odpočítavanie opakuje po dosiahnutí 0. Štvrtý (index 3) bit bajtu, ktorý je odoslaný do riadiaceho registra, označuje režim: 0 znamená režim voľného chodu a 1 znamená jednorazový režim.

Vhodné číslo na začatie počítania v režime jedného výstrelu je 000010012 = 09 $ v hexadecimálnej sústave. Vhodné číslo na začatie počítania v režime voľného chodu je 000000012 = 01 $ v šestnástkovej sústave. Každý register časovača má svoj vlastný riadiaci register. V CIA #1 má riadiaci register pre časovač A adresu RAM DC0E16 a riadiaci register pre časovač B má adresu RAM DC0F16. V CIA #2 má riadiaci register pre časovač A adresu RAM DD0E16 a riadiaci register pre časovač B má adresu RAM DD0F16. Ak chcete začať odpočítavať šestnásťbitové číslo v TA CIA #2, v jednorazovom režime, použite nasledujúci kód:

LDA # 09 USD
STA $ DD0E

Ak chcete začať odpočítavať šestnásťbitové číslo v TA CIA #2, v režime voľnej prevádzky použite nasledujúci kód:

LDA # 01 USD
STA $ DD0E

5.12 IRQ a NMI Žiadosti

Mikroprocesor 6502 má tzv IRQ a NMI čiary (špendlíky). CIA č. 1 aj CIA č. 2 má každý IRQ pin pre mikroprocesor. The IRQ kolík CIA #2 je pripojený k NMI kolík µP. The IRQ kolík CIA #1 je pripojený k IRQ kolík µP. Toto sú jediné dve prerušovacie linky, ktoré spájajú mikroprocesor. Takže IRQ špendlík CIA #2 je NMI zdroj a môže byť tiež videný ako čiara ¯NMI.

CIA #1 má päť možných bezprostredných zdrojov generovania IRQ signál pre µP. CIA #2 má rovnakú štruktúru ako CIA #1. Takže CIA #2 má rovnakých päť možných bezprostredných zdrojov generovania signálu prerušenia tentoraz, ktorým je NMI signál. Pamätajte, že keď µP prijme NMI signál, ak obsluhuje IRQ žiadosť pozastaví a spracuje NMI žiadosť. Keď dokončí manipuláciu s NMI žiadosť, potom pokračuje vo vybavovaní IRQ žiadosť.

CIA #1 je normálne pripojená externe ku klávesnici a hernému zariadeniu, ako je joystick. Klávesnica využíva viac portu A CIA #1 ako port B. Herné zariadenie využíva viac CIA #1 portu B ako jeho portu A. CIA #2 je normálne pripojená externe k diskovej jednotke (za sebou pripojená k tlačiarni) a modem. Disková jednotka využíva viac portu A CIA #2 (hoci cez externý sériový port) ako jeho port B. Modem (RS-232) využíva viac CIA #2 portu B ako jeho port A.

S tým všetkým, ako systémová jednotka vie, čo spôsobuje IRQ alebo NMI prerušiť? CIA #1 a CIA #2 majú päť bezprostredných zdrojov prerušenia. Ak je signál prerušenia do µP NMI , zdroj je jedným z bezprostredných piatich zdrojov od CIA #2. Ak je signál prerušenia do µP IRQ , zdroj je jedným z bezprostredných piatich zdrojov od CIA #1.

Ďalšia otázka znie: 'Ako systémová jednotka rozlišuje medzi piatimi bezprostrednými zdrojmi každej CIA?' Každá CIA má osembitový register, ktorý sa nazýva Interrupt Control Register (ICR). ICR obsluhuje oba prístavy CIA. Nasledujúca tabuľka ukazuje významy ôsmich bitov riadiaceho registra prerušení, počnúc bitom 0:

Tabuľka 5.13
Register riadenia prerušení
Bitový index Význam
0 Nastavte (vykonané 1) pretečením časovača A
1 Nastavuje sa podbehnutím časovača B
2 Nastavte, kedy sa hodiny denného času rovnajú budíku
3 Nastavte, keď je sériový port plný
4 Nastavené externým zariadením
5 Nepoužité (vyrobené 0)
6 Nepoužité (vyrobené 0)
7 Nastavte, keď je nastavený ktorýkoľvek z prvých piatich bitov

Ako je možné vidieť z tabuľky, každý z bezprostredných zdrojov je reprezentovaný jedným z prvých piatich bitov. Takže, keď je signál prerušenia prijatý na µP, kód sa musí vykonať, aby sa načítal obsah riadiaceho registra prerušenia, aby sa poznal presný zdroj prerušenia. Adresa RAM pre ICR CIA #1 je DC0D16. Adresa RAM pre ICR CIA #2 je DD0D16. Ak chcete prečítať (vrátiť) obsah ICR CIA #1 do µP akumulátora, zadajte nasledujúcu inštrukciu:

LDA $ DC0D

Ak chcete prečítať (vrátiť) obsah ICR CIA #2 do µP akumulátora, zadajte nasledujúcu inštrukciu:

LDA DD0D USD

5.13 Program na pozadí riadený prerušením

Klávesnica normálne preruší mikroprocesor každú 1/60 sekundy. Predstavte si, že program je spustený a dostane sa do pozície, v ktorej čaká na kláves z klávesnice a až potom bude môcť pokračovať so segmentmi kódu nižšie. Predpokladajme, že ak sa na klávesnici nestlačí žiadna klávesa, program urobí iba malú slučku a čaká na kláves. Predstavte si, že program beží a práve po prerušení klávesnice očakáva kláves z klávesnice. V tom momente sa celý počítač nepriamo zastaví a nerobí nič iné ako čakaciu slučku. Predstavte si, že kláves na klávesnici je stlačený tesne pred ďalším vydaním nasledujúceho prerušenia klávesnice. To znamená, že počítač nerobil asi jednu šesťdesiatinu sekundy nič! To je dlhý čas na to, aby počítač nerobil nič, dokonca ani v časoch Commodore-64. Počítač mohol za ten čas (trvanie) robiť niečo iné. V programe je veľa takýchto dĺžok.

Druhý program môže byť napísaný tak, aby pracoval v takýchto „nečinných“ časoch. O takomto programe sa hovorí, že funguje na pozadí hlavného (alebo prvého) programu. Jednoduchý spôsob, ako to urobiť, je vynútiť modifikované spracovanie prerušenia BRK, keď sa kláves očakáva od klávesnice.

Ukazovateľ pre inštrukciu BRK
Na po sebe idúcich miestach RAM adries $0316 a $0317 je ukazovateľ (vektor) pre aktuálnu inštrukčnú rutinu BRK. Predvolený ukazovateľ sa tam umiestni, keď je počítač zapnutý operačným systémom v ROM. Tento predvolený ukazovateľ je adresa, ktorá stále ukazuje na predvolenú obsluhu inštrukcie BRK v OS ROM. Ukazovateľ je 16-bitová adresa. Spodný bajt ukazovateľa sa umiestni na bajtové umiestnenie adresy $0306 a vyšší bajt ukazovateľa sa umiestni do bajtového umiestnenia $0317.

Druhý program môže byť napísaný tak, že keď je systém „nečinný“, niektoré kódy druhého programu sú vykonávané systémom. To znamená, že druhý program musí pozostávať z podprogramov. Keď je systém „nečinný“, ktorý čaká na kláves z klávesnice, vykoná sa ďalší podprogram pre druhý program. Interakcia človeka s počítačom je pomalá v porovnaní s prevádzkou systémovej jednotky.

Tento problém je jednoduché vyriešiť: Zakaždým, keď musí počítač čakať na kláves z klávesnice, vložte do kódu inštrukciu BRK a nahraďte ukazovateľ na $0316 (a $0317) ukazovateľom ďalšieho podprogramu druhého ( vlastný) program. Týmto spôsobom by oba programy bežali v trvaní, ktoré nie je oveľa dlhšie ako trvanie hlavného programu, ktorý beží samostatne.

5.14 Zostavenie a zostavenie

Assembler nahradí všetky štítky adresami. Program v jazyku symbolických inštancií je zvyčajne napísaný tak, aby začínal na konkrétnej adrese. Výsledok z assemblera (po zložení) sa nazýva „objektový kód“ so všetkým binárnym. Výsledkom je spustiteľný súbor, ak je súborom program a nie dokument. Dokument nie je spustiteľný.

Aplikácia pozostáva z viac ako jedného programu (jazyk zostavy). Zvyčajne existuje hlavný program. Táto situácia by sa nemala zamieňať so situáciou pre programy na pozadí riadené prerušením. Všetky programy tu sú programy v popredí, ale existuje prvý alebo hlavný program.

Ak existuje viac ako jeden program v popredí, namiesto assembleru je potrebný kompilátor. Kompilátor zostaví každý z programov do objektového kódu. Nastal by však problém: niektoré segmenty kódu sa budú prekrývať, pretože programy pravdepodobne píšu rôzni ľudia. Riešením kompilátora je presunúť všetky prekrývajúce sa programy okrem prvého na pamäťový priestor, aby sa programy neprekrývali. Teraz, keď príde na ukladanie premenných, niektoré adresy premenných by sa stále prekrývali. Riešením je tu nahradiť prekrývajúce sa adresy novými adresami (okrem prvého programu), aby sa už neprekrývali. Týmto spôsobom sa rôzne programy zmestia do rôznych častí (oblastí) pamäte.

Pri tom všetkom je možné, že jedna rutina v jednom programe vyvolá rutinu v inom programe. Takže kompilátor urobí prepojenie. Prepojenie sa týka štartovacej adresy podprogramu v jednom programe a jej následného volania v inom programe; oba sú súčasťou aplikácie. Oba programy na to musia používať rovnakú adresu. Konečným výsledkom je jeden veľký objektový kód so všetkým v binárnom (bitoch).

5.15 Uloženie, načítanie a spustenie programu

Assembler je normálne napísaný v nejakom editorovom programe (ktorý môže byť poskytnutý s programom assembler). Editor program udáva, kde program začína a končí v pamäti (RAM). Rutina Kernal SAVE OS ROM Commodore-64 môže uložiť program z pamäte na disk. Len vypíše časť (blok) pamäte, ktorá môže obsahovať volanie jej inštrukcie na disk. Volaciu inštrukciu na SAVE je vhodné mať oddelenú od programu, ktorý sa ukladá, aby sa program pri načítaní do pamäte z disku znova neuložil pri spustení. Načítanie programu v assembleri z disku je iný druh výzvy, pretože program sa nemôže načítať sám.

Program sa nemôže načítať z disku tam, kde začína a končí v RAM. Commodore-64 sa v tých časoch bežne dodával s tlmočníkom BASIC na spustenie programov jazyka BASIC. Keď je stroj (počítač) zapnutý, nastaví sa príkazový riadok: READY. Odtiaľ je možné zadávať príkazy alebo inštrukcie BASIC stlačením klávesu „Enter“ po napísaní. BASIC príkaz (inštrukcia) na načítanie súboru je:

LOAD “názov súboru”,8,1

Príkaz začína BASIC rezervovaným slovom, ktorým je LOAD. Za ním nasleduje medzera a potom názov súboru v úvodzovkách. Za číslom zariadenia 8 nasleduje čiarka. Za sekundárnou adresou disku, ktorá je 1, nasleduje čiarka. Pri takomto súbore je počiatočná adresa programu v assembleri v hlavičke súboru na disku. Keď BASIC dokončí načítanie programu, vráti sa posledná adresa RAM plus 1 programu. Slovo „vrátené“ tu znamená, že dolný bajt poslednej adresy plus 1 sa vloží do registra µP X a vyšší bajt poslednej adresy plus 1 sa vloží do registra µP Y.

Po načítaní programu je potrebné ho spustiť (vykonať). Používateľ programu musí poznať počiatočnú adresu na vykonanie v pamäti. Opäť je tu potrebný ďalší BASIC program. Je to príkaz SYS. Po vykonaní príkazu SYS sa program v jazyku assembler spustí (a zastaví). Ak je počas behu potrebný nejaký vstup z klávesnice, program v jazyku symbolických inštancií by to mal používateľovi oznámiť. Potom, čo používateľ zadá údaje na klávesnici a stlačí klávesu „Enter“, program v jazyku symbolických inštancií bude pokračovať v práci s použitím zadávania klávesnice bez zásahu tlmočníka BASIC.

Za predpokladu, že začiatok vykonávacej (spustenej) adresy RAM pre program v assembleri je C12316, C123 sa pred použitím s príkazom SYS skonvertuje na základnú desiatku. Konverzia C12316 na základnú desiatku je nasledovná:

Takže príkaz BASIC SYS je:

SYS 49443

5.16 Zavedenie systému Commodore-64

Zavedenie systému Commodore-64 pozostáva z dvoch fáz: fázy resetovania hardvéru a fázy inicializácie operačného systému. Operačným systémom je jadro v ROM (a nie na disku). Existuje resetovacia linka (v skutočnosti OZE ), ktorý sa pripája na kolík na 6502 µP a na rovnaký názov kolíka vo všetkých špeciálnych lodiach, ako sú CIA 1, CIA 2 a VIC II. Vo fáze resetu sa vďaka tomuto riadku všetky registre v µP a v špeciálnych čipoch nastavia na 0 (vynulujú sa pre každý bit). Ďalej, hardvérom mikroprocesora, ukazovateľ zásobníka a register stavu procesora sú dané ich počiatočnými hodnotami v mikroprocesore. Počítadlo programu je potom uvedené s hodnotou (adresou) v miestach $FFFC a $FFFD. Pripomeňme si, že počítadlo programu obsahuje adresu nasledujúcej inštrukcie. Obsah (adresa), ktorý sa tu nachádza, je pre podprogram, ktorý začína inicializáciu softvéru. Všetko zatiaľ robí hardvér mikroprocesora. V tejto fáze nie je dotknutá celá pamäť. Potom začne ďalšia fáza inicializácie.

Inicializáciu vykonávajú niektoré rutiny v ROM OS. Inicializácia znamená pridanie počiatočných alebo predvolených hodnôt niektorým registrom v špeciálnych čipoch. Inicializácia začína zadaním počiatočných alebo predvolených hodnôt niektorým registrom v špeciálnych čipoch. IRQ , napríklad musí začať vydávať každú 1/60 sekundy. Takže jeho zodpovedajúci časovač v CIA #1 musí byť nastavený na predvolenú hodnotu.

Potom Kernal vykoná test RAM. Testuje každé miesto odoslaním bajtu na miesto a jeho spätným prečítaním. Ak je rozdiel, aspoň to umiestnenie je zlé. Kernal tiež identifikuje hornú časť pamäte a spodnú časť pamäte a nastavuje zodpovedajúce ukazovatele na strane 2. Ak je horná časť pamäte $ DFFF, $ FF sa vloží do umiestnenia $ 0283 a $ DF sa vloží do umiestnenia $ 0284 bajtov. 0283 $ aj 0284 $ majú označenie HIRAM. Ak je spodná časť pamäte $0800, $00 sa vloží do pozície $0281 a $08 sa vloží do pozície $0282. Oba $0281 a $0282 majú označenie LORAM. Test RAM v skutočnosti začína od 0300 USD po hornú časť pamäte (RAM).

Nakoniec sa vstupné/výstupné vektory (ukazovatele) nastavia na predvolené hodnoty. Test RAM v skutočnosti začína od 0300 USD po hornú časť pamäte (RAM). To znamená, že strana 0, strana 1 a strana 2 sú inicializované. Najmä stránka 0 má veľa ukazovateľov OS ROM a stránka 2 má veľa ukazovateľov BASIC. Tieto ukazovatele sa označujú ako premenné. Pamätajte, že strana 1 je zásobník. Ukazovatele sa označujú ako premenné, pretože majú názvy (návestia). V tejto fáze sa vymaže pamäť obrazovky pre obrazovku (monitor). To znamená odoslanie kódu 20 USD za priestor (ktorý je zhodou okolností rovnaký ako 20 USD ASCII) do 1000 umiestnení na obrazovke RAM. Nakoniec Kernal spustí interpret BASIC, aby zobrazil príkazový riadok BASIC, ktorý je READY v hornej časti monitora (obrazovky).

5.17 Problémy

Čitateľovi sa odporúča, aby pred prechodom na ďalšiu kapitolu vyriešil všetky problémy v kapitole.

  1. Napíšte kód assembleru, ktorý vytvorí všetky bity CIA #2 portu A ako výstup a CIA #2 portu B ako vstup.
  2. Napíšte kód jazyka zostavy 6502, ktorý čaká na kláves na klávesnici, kým sa nestlačí.
  3. Napíšte program v jazyku zostavy 6502, ktorý odošle znak „E“ na obrazovku Commodore-64.
  4. Napíšte program v jazyku zostavy 6502, ktorý prevezme znak z klávesnice a odošle ho na obrazovku Commodore-64, pričom bude ignorovať kód kľúča a načasovanie.
  5. Napíšte program v jazyku zostavy 6502, ktorý dostane bajt z diskety Commodore-64.
  6. Napíšte program v jazyku zostavy 6502, ktorý uloží súbor na disketu Commodore-64.
  7. Napíšte program v jazyku zostavy 6502, ktorý načíta programový súbor z diskety Commodore-64 a spustí ho.
  8. Napíšte program v jazyku zostavy 6502, ktorý odošle bajt „E“ (ASCII) do modemu, ktorý je pripojený k používateľskému portu kompatibilnému s RS-232 Commodore-64.
  9. Vysvetlite, ako sa v počítači Commodore-64 vykonáva počítanie a meranie času.
  10. Vysvetlite, ako systémová jednotka Commodore-64 dokáže identifikovať 10 rôznych zdrojov okamžitých žiadostí o prerušenie vrátane nemaskovateľných žiadostí o prerušenie.
  11. Vysvetlite, ako môže bežať program na pozadí s programom v popredí v počítači Commodore-64.
  12. Stručne vysvetlite, ako je možné skompilovať programy v assembleri do jednej aplikácie pre počítač Commodore-64.
  13. Stručne vysvetlite proces zavádzania počítača Commodore-64.