Poglavje 5: Operacijski sistem Commodore-64 v zbirnem jeziku

Poglavje 5 Operacijski Sistem Commodore 64 V Zbirnem Jeziku



5.1 Uvod

Operacijski sistem za računalnik Commodore-64 je priložen računalniku v pomnilniku samo za branje (ROM). Število lokacij pomnilniških bajtov za Commodore-64 se giblje od $0000 do $FFFF (tj. 000016 do FFFF16, kar je od 010 do 65,53510). Operacijski sistem je od $E000 do $FFFF (tj. 57,34410 do 65,53610).

Zakaj preučevati operacijski sistem Commodore-64
Zakaj bi danes preučevali operacijski sistem Commodore-64, ko je bil to operacijski sistem računalnika, ki je bil izdan leta 1982? No, računalnik Commodore-64 uporablja centralno procesno enoto 6510, ki je nadgradnja (čeprav ne velika nadgradnja) 6502 µP.







6502 µP se še danes proizvaja v velikih količinah; ni več za domače ali pisarniške računalnike, temveč za električne in elektronske naprave (naprave). 6502 µP je tudi enostaven za razumevanje in upravljanje v primerjavi z drugimi mikroprocesorji njegovega časa. Zaradi tega je eden najboljših (če ne najboljši) mikroprocesor, ki se uporablja za poučevanje zbirnega jezika.



65C02 µP, ki je še vedno mikroprocesorskega razreda 6502, ima 66 navodil za zbirni jezik, ki se jih je mogoče naučiti celo na pamet. Sodobni mikroprocesorji imajo veliko navodil za zbirni jezik in se jih ni mogoče naučiti na pamet. Vsak µP ima zase svoj zbirni jezik. Vsak operacijski sistem, pa naj bo nov ali star, ima zbirni jezik. S tem je zbirni jezik 6502 dober za uporabo pri poučevanju operacijskega sistema za začetnike. Po učenju operacijskega sistema, kot je tisti za Commodore-64, se je mogoče z lahkoto naučiti sodobnega operacijskega sistema, če to uporabimo kot osnovo.



To ni samo mnenje avtorja (mene). Gre za trend v porastu v svetu. Na internetu je napisanih vedno več člankov za izboljšan operacijski sistem Commodore-64, da bi izgledal kot sodoben operacijski sistem. Sodobni operacijski sistemi so razloženi v naslednjem poglavju.





Opomba : OS Commodore-64 (Kernal) še vedno dobro deluje s sodobnimi vhodnimi in izhodnimi napravami (ne z vsemi).

Osem-bitni računalnik
V osembitnem mikroračunalniku, kot je Commodore 64, se informacije shranjujejo, prenašajo in manipulirajo v obliki osembitnih binarnih kod.



Zemljevid spomina
Zemljevid pomnilnika je lestvica, ki razdeli celoten obseg pomnilnika na manjše obsege različnih velikosti in pokaže, kaj (podprogram in/ali spremenljivka) pripada kateremu obsegu. Spremenljivka je oznaka, ki ustreza določenemu pomnilniškemu naslovu, ki ima vrednost. Oznake se uporabljajo tudi za identifikacijo začetka podprogramov. Toda v tem primeru so znani kot imena podprogramov. Podprogram lahko preprosto imenujemo rutina.

Pomnilniška karta (postavitev) v prejšnjem poglavju ni dovolj podrobna. Preprosto je. Zemljevid pomnilnika računalnika Commodore-64 je mogoče prikazati s tremi nivoji podrobnosti. Ko je prikazan na srednji ravni, ima računalnik Commodore-64 različne pomnilniške zemljevide. Privzeti zemljevid pomnilnika računalnika Commodore-64 na srednji ravni je:


Slika 5.11 Zemljevid pomnilnika Commodore-64

V tistih časih je bil priljubljen računalniški jezik, imenovan BASIC. Mnogi uporabniki računalnikov so morali poznati nekaj minimalnih jezikovnih ukazov BASIC, kot so nalaganje programa z diskete (diska) v pomnilnik, zagon (izvajanje) programa v pomnilniku in izhod (zapiranje) programa. Ko se program BASIC izvaja, mora uporabnik podajati podatke vrstico za vrstico. Ni tako kot danes, ko je aplikacija (število programov tvori aplikacijo) napisana v visokonivojskem jeziku z okni in mora uporabnik samo vstaviti različne podatke na specializirana mesta v oknu. V nekaterih primerih lahko z miško izberete prednaročene podatke. BASIC je bil takrat jezik na visoki ravni, vendar je precej blizu zbirnemu jeziku.

Upoštevajte, da večino pomnilnika zasede BASIC v privzetem zemljevidu pomnilnika. BASIC ima ukaze (navodila), ki jih izvaja tako imenovani BASIC Interpreter. Pravzaprav je tolmač BASIC v ROM-u od lokacije $A000 do $BFFF (vključno), ki je domnevno območje RAM-a. Takrat je to 8 Kbajtov precej veliko! Pravzaprav je v ROM-u na tem mestu celotnega pomnilnika. Ima enako velikost kot operacijski sistem od $E000 do $FFFF (vključno). Programi, ki so napisani v BASIC-u, so prav tako umeščeni v razpon od $0200 do $BFFF.

RAM za program uporabniškega zbirnega jezika je od $C000 do $CFFF, samo 4 Kbajti od 64 Kbajtov. Zakaj torej uporabljamo ali se učimo zbirni jezik? Novi in ​​stari operacijski sistemi so zbirni jeziki. Operacijski sistem Commodore-64 je v ROM-u, od $E000 do $FFFF. Napisan je v zbirnem jeziku 65C02 µP (6510 µP). Sestavljen je iz podprogramov. Uporabniški program v zbirnem jeziku mora poklicati te podprograme za interakcijo s perifernimi napravami (vhodne in izhodne naprave). Razumevanje operacijskega sistema Commodore-64 v zbirnem jeziku študentu omogoča hitro razumevanje operacijskih sistemov na veliko manj dolgočasen način. Še enkrat, v tistih dneh je bilo veliko uporabniških programov za Commodore-64 napisanih v BASIC-u in ne v zbirnem jeziku. Zbirne jezike so v tistih časih bolj uporabljali programerji sami za tehnične namene.

Kernal, napisan kot K-e-r-n-a-l, je operacijski sistem Commodore-64. Priložen je računalniku Commodore-64 v ROM-u in ne na disku (ali disketi). Kernal je sestavljen iz podprogramov. Za dostop do zunanjih naprav mora uporabniški program v zbirnem jeziku (strojni jezik) uporabljati te podprograme. Jedra ne smemo zamenjevati z jedrom, ki se v sodobnih operacijskih sistemih piše kot K-e-r-n-e-l, čeprav sta skoraj ista stvar.

Območje pomnilnika od $C000 (49,15210) do $CFFF (6324810) 4 Kbajtov10 pomnilnika je RAM ali ROM. Ko je RAM, se uporablja za dostop do zunanjih naprav. Ko je ROM, se uporablja za tiskanje znakov na zaslonu (monitorju). To pomeni, da se znaki natisnejo na zaslon ali pa se z uporabo tega dela pomnilnika dostopa do zunanjih naprav. V sistemski enoti (matični plošči) je banka ROM (znakovni ROM), ki se preklaplja in izklaplja iz celotnega pomnilniškega prostora, da se to doseže. Uporabnik morda ne bo opazil preklopa.

Območje pomnilnika od $0100 (256 10 ) na 01 USD (511 10 ) je sklad. Uporabljajo ga tako operacijski sistem kot uporabniški programi. Vloga sklada je bila razložena v prejšnjem poglavju tega spletnega kariernega tečaja. Območje pomnilnika od $0000 (0 10 ) na 00 USD (255 10 ) uporablja operacijski sistem. Tam je dodeljenih veliko kazalcev.

Kernal Jump Table
Kernal ima rutine, ki jih kliče uporabniški program. Ko so izšle nove različice operacijskega sistema, so se naslovi teh rutin spremenili. To pomeni, da uporabniški programi niso mogli več delovati z novimi različicami OS. To se ni zgodilo, ker je Commodore-64 zagotovil skakalno mizo. Preskočna tabela je seznam 39 vnosov. Vsak vnos v tabeli ima tri naslove (razen zadnjih 6 bajtov), ​​ki se niso nikoli spremenili niti s spremembo različice operacijskega sistema.

Prvi naslov vnosa ima navodilo JSR. Naslednja dva naslova sta sestavljena iz dvobajtnega kazalca. Ta dvobajtni kazalec je naslov (ali nov naslov) dejanske rutine, ki je še vedno v OS ROM. Vsebina kazalca bi se lahko spremenila z novimi različicami operacijskega sistema, vendar se trije naslovi za vsak vnos skočne tabele nikoli ne spremenijo. Na primer, upoštevajte naslove $FF81, $FF82 in $FF83. Ti trije naslovi so namenjeni rutini za inicializacijo vezij zaslona in tipkovnice (registrov) matične plošče. Naslov $FF81 ima vedno operacijsko kodo (en bajt) JSR. Naslova $FF82 in $FF83 imata stari ali novi naslov podprograma (še vedno v OS ROM) za izvedbo inicializacije. Nekoč sta imela naslova $FF82 in $FF83 vsebino (naslov) $FF5B, ki se lahko spremeni z naslednjo različico OS. Vendar se naslovi $FF81, $FF82 in $FF83 skočne tabele nikoli ne spremenijo.

Za vsak vnos treh naslovov ima prvi naslov z JSR oznako (ime). Oznaka za $FF81 je PCINT. PCINT se nikoli ne spremeni. Za inicializacijo registrov zaslona in tipkovnice lahko programer preprosto vnese »JSR PCINT«, kar deluje za vse različice operacijskega sistema Commodore-64. Lokacija (začetni naslov) dejanskega podprograma, npr. $FF5B, se lahko sčasoma spremeni z različnimi operacijskimi sistemi. Da, v uporabniški program, ki uporablja OS ROM, sta vključeni vsaj dve navodili JSR. V uporabniškem programu je navodilo JSR, ki skoči na vnos v tabeli skokov. Z izjemo zadnjih šestih naslovov v preskočni tabeli ima prvi naslov vnosa v preskočni tabeli navodilo JSR. V Kernalu lahko nekateri podprogrami pokličejo druge podprograme.

Preskočna tabela jedra se začne od $FF81 (vključno) navzgor v skupinah treh, razen zadnjih šestih bajtov, ki so trije kazalci z nižjimi naslovi bajtov: $FFFA, $FFFC in $FFFE. Vse rutine ROM OS so kode za večkratno uporabo. Uporabniku jih torej ni treba prepisati.

Blok diagram sistemske enote Commodore-64
Naslednji diagram je podrobnejši od tistega v prejšnjem poglavju:


Slika 5.12 Blok diagram sistemske enote Commodore_64

ROM in RAM sta tukaj prikazana kot en blok. Tukaj je prikazan videovmesniški čip (IC) za obdelavo informacij na zaslonu, ki ni bil prikazan v prejšnjem poglavju. En sam blok za vhodno/izhodne naprave, ki je prikazan v prejšnjem poglavju, je tukaj prikazan kot dva bloka: CIA #1 in CIA #2. CIA je kratica za Complex Interface Adapter. Vsak ima dve vzporedni osembitni vrati (ne smemo jih zamenjevati z zunanjimi vrati na navpični površini sistemske enote), imenovani vrata A in vrata B. CIA-ji so v tej situaciji povezani s petimi zunanjimi napravami. Naprave so tipkovnica, krmilna palica, diskovni pogon/tiskalnik in modem. Tiskalnik je priključen na zadnji strani diskovnega pogona. Obstajata tudi vezje zvočne vmesniške naprave in programirljivo logično vezje, ki ni prikazano.

Kljub temu obstaja ROM znakov, ki ga je mogoče zamenjati z obema CIA, ko je znak poslan na zaslon in ni prikazan v blokovnem diagramu.

Naslovi RAM-a od $D000 do $DFFF za vhodno/izhodna vezja v odsotnosti znakovnega ROM-a imajo naslednjo podrobno preslikavo pomnilnika:

Tabela 5.11
Podroben pomnilniški zemljevid od $D000 do $DFFF
Obseg podnaslovov vezje Velikost (bajti)
D000 – D3FF VIC (krmilnik video vmesnika (čip)) 1K
D400 – D7FF SID (zvočni krog) 1K
D800 – DBFF Barvni RAM 1K grickalic
DC00 – DCFF CIA #1 (tipkovnica, igralna palica) 256
DD00 – DDFF CIA #2 (serijsko vodilo, uporabniška vrata/RS-232) 256
DE00 – DEF Odprite V/I režo #1 256
DF00 – DFFF Odprite V/I režo #2 256

5.2 Dva zapletena vmesniška adapterja

V sistemski enoti Commodore-64 sta dve posebni integrirani vezji (IC) in vsako od njiju se imenuje kompleksni vmesnik vmesnika. Ta dva čipa se uporabljata za povezovanje tipkovnice in drugih zunanjih naprav z mikroprocesorjem. Z izjemo VIC in zaslona gredo vsi vhodno/izhodni signali med mikroprocesorjem in perifernimi napravami skozi ta dva IC. Pri Commodore-64 ni neposredne komunikacije med pomnilnikom in katero koli periferijo. Komunikacija med pomnilnikom in katero koli periferijo poteka prek mikroprocesorskega akumulatorja in eden od teh so adapterji CIA (IC). IC-ji se imenujejo CIA #1 in CIA #2. CIA je kratica za Complex Interface Adapter.

Vsaka CIA ima 16 registrov. Z izjemo registrov časovnika/števca v CIA je vsak register širok 8 bitov in ima pomnilniški naslov. Naslovi pomnilniškega registra za CIA #1 so od $DC00 (56320 10 ) na $DC0F (56335 10 ). Naslovi pomnilniškega registra za CIA #2 so od $DD00 (56576 10 ) na $DD0F (56591 10 ). Čeprav ti registri niso v pomnilniku IC, so del pomnilnika. V vmesnem pomnilniškem zemljevidu V/I območje od $D000 do $DFFF vključuje naslove CIA od $DC00 do $DC0F in od $DD00 do $DD0F. Večino območja V/I pomnilnika RAM od $D000 do $DFFF je mogoče zamenjati s pomnilniško banko ROM-a znakov za zaslonske znake. Zato, ko so znaki poslani na zaslon, zunanje naprave ne morejo delovati; čeprav uporabnik tega morda ne bo opazil, saj je menjava naprej in nazaj hitra.

V CIA #1 obstajata dva registra, imenovana Port A in Port B. Njuna naslova sta $DC00 oziroma $DC01. V CIA #2 obstajata tudi dva registra, imenovana Port A in Port B. Seveda sta njuna naslova različna; sta $DD00 oziroma $DD01.

Vrata A ali vrata B v obeh CIA so vzporedna vrata. To pomeni, da lahko pošlje podatke zunanji napravi v osmih bitih hkrati ali sprejme podatke iz mikroprocesorja v osmih bitih hkrati.

Z vrati A ali B je povezan Data Direction Register (DDR). Register usmerjanja podatkov za vrata A CIA #1 (DDRA1) je na lokaciji pomnilniškega bajta $DC02. Register usmerjanja podatkov za vrata B CIA #1 (DDRB1) je na lokaciji pomnilniškega bajta $DC03. Register usmerjanja podatkov za vrata A CIA #2 (DDRA2) je na lokaciji pomnilniškega bajta $DD02. Register usmerjanja podatkov za vrata B CIA #2 (DDRB2) je na lokaciji pomnilniškega bajta $DD03.

Zdaj lahko vsak bit za vrata A ali vrata B nastavi ustrezni register za usmerjanje podatkov kot vhod ali izhod. Vnos pomeni, da gredo informacije od periferne enote do mikroprocesorja prek CIA. Izhod pomeni, da gredo informacije od mikroprocesorja do periferije prek CIA.

Če je treba vnesti celico vrat (registra), je ustrezen bit v registru za usmerjanje podatkov 0. Če je treba celico vrat (registra) vnesti, je ustrezen bit v registru za usmerjanje podatkov 1. V večini primerov je vseh 8 bitov vrat programiranih za vhod ali izhod. Ko je računalnik vklopljen, so vrata A programirana za izhod, vrata B pa za vhod. Naslednja koda naredi vrata CIA #1 A kot izhod in vrata CIA #1 B kot vhod:

LDA #$FF
STA DDRA1 ; $DC00 režira $DC02
LDA #$00
STA DDRB1 ; $DC01 režira $DC03

DDRA1 je oznaka (ime spremenljivke) za lokacijo pomnilniškega bajta $DC02, DDRB1 pa je oznaka (ime spremenljivke) za lokacijo pomnilniškega bajta $DC03. Prvo navodilo naloži 11111111 v akumulator µP. Drugo navodilo kopira to v register usmerjanja podatkov vrat A CIA št. 1. Tretje navodilo naloži 00000000 v akumulator µP. Četrto navodilo kopira to v register usmerjanja podatkov vrat B CIA št. 1. Ta koda je v enem od podprogramov v operacijskem sistemu, ki izvede to inicializacijo ob vklopu računalnika.

Vsaka CIA ima linijo zahteve za storitev prekinitve do mikroprocesorja. Tisti iz CIE št. 1 gre k IRQ zatič µP. Tisti iz CIE št. 2 gre k NMI zatič µP. Zapomni si to NMI ima višjo prednost kot IRQ .

5.3 Programiranje v zbirnem jeziku tipkovnice

Za Commodore-64 so možne samo tri prekinitve: IRQ , BRK in NMI . Kazalec skočne tabele za IRQ je na naslovih $FFFE in $FFFF v ROM-u (operacijski sistem), kar ustreza podprogramu, ki je še vedno v OS (ROM). Kazalec skočne tabele za BRK je na naslovih $FFFC in $FFFD v OS, kar ustreza podprogramu, ki je še vedno v OS (ROM). Kazalec skočne tabele za NMI je na naslovih $FFFA in $FFFB v OS, kar ustreza podprogramu, ki je še vedno v OS (ROM). Za IRQ , dejansko obstajata dva podprograma. Programska prekinitev (navodilo) BRK ima torej svoj kazalec tabele skokov. Kazalec skočne tabele za IRQ vodi do kode, ki se odloči, ali je uporabljena strojna ali programska prekinitev. Če je prekinitev strojne opreme, rutina za IRQ je poklican. Če gre za programsko prekinitev (BRK), se pokliče rutina za BRK. V eni od različic OS je podprogram za IRQ znaša EA31 $, podprogram za BRK pa 66 $ FE. Ti naslovi so pod $FF81, zato niso vnosi v preskočno tabelo in se lahko spremenijo z različico OS. V tej temi so zanimive tri rutine: tista, ki preverja, ali je pritisnjena tipka ali BRK, tista, ki je na $FE43, in tista, ki se lahko tudi spremeni z različico OS.

Računalnik Commodore-64 je po videzu kot ogromen pisalni stroj (navzgor) brez tiskalnega dela (glava in papir). Tipkovnica je povezana s CIA #1. CIA #1 privzeto pregleda tipkovnico vsako 1/60 sekunde brez kakršnih koli programskih motenj. Vsako 1/60 sekunde CIA #1 pošlje sporočilo IRQ na µP. Samo eden je IRQ zatič na µP, ki prihaja samo od CIA #1. En vhodni pin NMI µP, ki se razlikuje od IRQ , prihaja samo iz CIA #2 (glejte naslednjo sliko). BRK je pravzaprav navodilo zbirnega jezika, ki je kodirano v uporabniškem programu.

Torej, vsako 1/60 sekunde, IRQ kliče se rutina, na katero kažeta $FFFE in $FFFF. Rutina preveri, ali je pritisnjena tipka ali naleti na ukaz BRK. Če je tipka pritisnjena, se pokliče rutina za obravnavo pritiska na tipko. Če gre za ukaz BRK, se pokliče rutina za obdelavo BRK. Če ni ne eno ne drugo, se ne zgodi nič. Niti eno se ne sme zgoditi, a CIA #1 pošlje IRQ na µP vsake 1/60 sekunde.

Čakalna vrsta tipkovnice, znana tudi kot medpomnilnik tipkovnice, je obseg lokacij bajtov RAM-a od 0277 $ do vključno 0280 $; Skupaj 1010 bajtov. To je vmesni pomnilnik First-In-First-Out. To pomeni, da prvi lik, ki pride, prvi odide. Zahodnoevropski znak zavzame en bajt.

Torej, medtem ko program ob pritisku tipke ne porabi nobenega znaka, gre koda tipke v ta medpomnilnik (čakalno vrsto). Medpomnilnik se polni, dokler ni deset znakov. Znak, ki ga pritisnete po desetem znaku, se ne zabeleži. Prezrt je, dokler ni vsaj en znak pridobljen (porabljen) iz čakalne vrste. Preskočna tabela ima vnos za podprogram, ki dobi prvi znak iz čakalne vrste v mikroprocesor. To pomeni, da vzame tisti prvi znak, ki gre v čakalno vrsto, in ga postavi v akumulator µP. Podprogram preskočne tabele za to se imenuje GETIN (za Get-In). Prvi bajt za tribajtni vnos v skočni tabeli je označen kot GETIN (naslov $FFE4). Naslednja dva bajta sta kazalec (naslov), ki kaže na dejansko rutino v ROM-u (OS). Za priklic te rutine je odgovoren programer. V nasprotnem primeru bo medpomnilnik tipkovnice ostal poln in vse nedavno pritisnjene tipke bodo prezrte. Vrednost, ki gre v akumulator, je ustrezna ključna vrednost ASCII.

Kako kode ključev sploh pridejo v čakalno vrsto? Obstaja rutina skokovite tabele, imenovana SCNKEY (za tipko za skeniranje). To rutino lahko kliče tako programska kot strojna oprema. V tem primeru ga pokliče elektronsko (fizikalno) vezje v mikroprocesorju, ko električni signal IRQ je nizka. Kako natančno se to naredi, ta spletni karierni tečaj ne obravnava.

Koda za pridobitev prve kode tipke iz medpomnilnika tipkovnice v akumulator A je samo ena vrstica:

GETIN

Če je medpomnilnik tipkovnice prazen, se 00 $ namesti v akumulator. Ne pozabite, da koda ASCII za nič ni $00; je 30 $. 00 $ pomeni nič. V programu lahko obstaja točka, kjer mora program počakati na pritisk tipke. Koda za to je:

POČAKAJ JSR GETIN
CMP #$00
ŽABA POČAKAJ

V prvi vrstici je »WAIT« oznaka, ki identificira naslov RAM-a, kamor je vstavljen (vtipkan) ukaz JSR. GETIN je tudi naslov. To je naslov prvega od ustreznih treh bajtov v tabeli skokov. Vnos GETIN, kot tudi vsi vnosi v preskočni tabeli (razen zadnjih treh), je sestavljen iz treh bajtov. Prvi bajt vnosa je navodilo JSR. Naslednja dva bajta sta naslov telesa dejanskega podprograma GETIN, ki je še vedno v ROM-u (OS), vendar pod skočno tabelo. Torej, vnos pravi, da skočite na podprogram GETIN. Če čakalna vrsta na tipkovnici ni prazna, GETIN postavi kodo tipke ASCII čakalne vrste prvi-v-prvi-ven v zbiralnik. Če je čakalna vrsta prazna, se Null ($00) vnese v akumulator.

Drugo navodilo primerja vrednost akumulatorja z 00 USD. Če je $00, to pomeni, da je čakalna vrsta na tipkovnici prazna in ukaz CMP pošlje 1 zastavici Z statusnega registra procesorja (preprosto imenovan statusni register). Če vrednost v A ni $00, pošlje ukaz CMP 0 zastavici Z statusnega registra.

Tretje navodilo, ki je »BEQ WAIT«, pošlje program nazaj na prvo navodilo, če je zastavica Z statusnega registra 1. Prvo, drugo in tretje navodilo se izvajajo večkrat po vrstnem redu, dokler ne pritisnete tipke na tipkovnici. . Če tipke nikoli ne pritisnete, se cikel ponavlja v nedogled. Segment kode, kot je ta, je običajno zapisan s segmentom časovne kode, ki po določenem času zapusti zanko, če tipka ni nikoli pritisnjena (glejte naslednjo razpravo).

Opomba : Tipkovnica je privzeta vhodna naprava, zaslon pa privzeta izhodna naprava.

5.4 Kanal, številka naprave in številka logične datoteke

Zunanje naprave, ki jih to poglavje uporablja za razlago operacijskega sistema Commodore-64, so tipkovnica, zaslon (monitor), diskovni pogon z disketo, tiskalnik in modem, ki se povezuje prek vmesnika RS-232C. Za komunikacijo med temi napravami in sistemsko enoto (mikroprocesor in pomnilnik) je treba vzpostaviti kanal.

Kanal je sestavljen iz vmesnega pomnilnika, številke naprave, številke logične datoteke in po izbiri sekundarnega naslova. Razlaga teh izrazov je naslednja:

Medpomnilnik
Opazite iz prejšnjega razdelka, da se mora ob pritisku na tipko njena koda premakniti na bajtno lokacijo v RAM-u v seriji desetih zaporednih lokacij. Ta serija desetih lokacij je medpomnilnik tipkovnice. Vsaka vhodna ali izhodna naprava (periferna naprava) ima niz zaporednih lokacij v RAM-u, imenovanih medpomnilnik.

Številka naprave
Pri Commodore-64 je vsaka zunanja naprava podana s številko naprave. Naslednja tabela prikazuje različne naprave in njihove številke:

Tabela 5.41
Številke naprav Commodore 64 in njihove naprave
številka Naprava
0 Tipkovnica
1 Tračni pogon
2 Vmesnik RS 232C do npr. modem
3 zaslon
4 Tiskalnik #1
5 Tiskalnik #2
6 Ploter #1
7 Ploter #2
8 Diskovni pogon
9
¦
¦
¦
30
Od 8 (vključno) do 22 dodatnih naprav za shranjevanje

Obstajata dve vrsti vrat za računalnik. Ena vrsta je zunanja, na navpični površini sistemske enote. Druga vrsta je notranja. Ta notranja vrata so register. Commodore-64 ima štiri notranja vrata: vrata A in vrata B za CIA 1 ter vrata A in vrata B za CIA 2. Obstaja ena zunanja vrata za Commodore-64, ki se imenujejo serijska vrata. Naprave s številko 3 navzgor so priključene na serijska vrata. Povezani so verižno (eden je povezan za drugim), pri čemer je vsak prepoznaven po številki svoje naprave. Naprave s številko 8 navzgor so običajno naprave za shranjevanje.

Opomba : Privzeta vhodna naprava je tipkovnica s številko naprave 0. Privzeta izhodna naprava je zaslon s številko naprave 3.

Logična številka datoteke
Logična številka datoteke je številka, podana za napravo (periferno) v vrstnem redu, v katerem so odprte za dostop. Razpon so od 010 do 255 10 .

Sekundarni naslov
Predstavljajte si, da sta na disku odprti dve datoteki (ali več kot ena datoteka). Za razlikovanje med tema dvema datotekama se uporabljajo sekundarni naslovi. Sekundarni naslovi so številke, ki se razlikujejo od naprave do naprave. Pomen 3 kot sekundarnega naslova za tiskalnik se razlikuje od pomena 3 kot sekundarnega naslova za diskovni pogon. Pomen je odvisen od funkcij, kot je, kdaj je datoteka odprta za branje ali kdaj je datoteka odprta za pisanje. Možna sekundarna števila so od 0 10 do 15 10 za vsako napravo. Za mnoge naprave se številka 15 uporablja za pošiljanje ukazov.

Opomba : Številka naprave je znana tudi kot naslov naprave, sekundarna številka pa je znana tudi kot sekundarni naslov.

Identifikacija periferne tarče
Za privzeti zemljevid pomnilnika Commodore pomnilniške naslove od $0200 do $02FF (stran 2) uporablja izključno operacijski sistem v ROM-u (Kernal) in ne operacijski sistem in jezik BASIC. Čeprav lahko BASIC še vedno uporablja lokacije prek OS ROM.

Modem in tiskalnik sta dva različna periferna cilja. Če sta na disku odprti dve datoteki, sta to dva različna cilja. Pri privzetem zemljevidu pomnilnika obstajajo tri zaporedne tabele (seznami), ki jih je mogoče videti kot eno veliko tabelo. Te tri tabele vsebujejo razmerje med številkami logičnih datotek, številkami naprav in sekundarnimi naslovi. S tem postane določen kanal ali vhodno/izhodni cilj prepoznaven. Tri tabele se imenujejo Datotečne tabele. Naslovi RAM in kaj imajo so:

$0259 — $0262: Tabela z oznako, LAT, do desetih številk aktivnih logičnih datotek.
$0263 — $026C: tabela z oznako, FAT, do desetih ustreznih številk naprav.
$026D — $0276: Tabela z oznako, SAT, desetih ustreznih sekundarnih naslovov.

Tukaj '—' pomeni 'do', številka pa ima en bajt.

Bralec se lahko vpraša: 'Zakaj medpomnilnik za vsako napravo ni vključen v identifikacijo kanala?' No, odgovor je, da ima pri commodore-64 vsaka zunanja naprava (periferija) fiksno serijo bajtov v RAM-u (pomnilniški zemljevid). Brez odprtega kanala so njihovi položaji še vedno v pomnilniku. Medpomnilnik za tipkovnico je na primer popravljen z 0277 $ na 0280 $ (vključno) za privzeti zemljevid pomnilnika.

Podprograma Kernal SETLFS in SETNAM
SETLFS in SETNAM sta jedrni rutini. Kanal je mogoče videti kot logično datoteko. Za odpiranje kanala je treba ustvariti številko logične datoteke, številko naprave in izbirni sekundarni naslov. Morda bo potrebno tudi neobvezno ime datoteke (besedilo). Rutina SETLFS nastavi logično številko datoteke, številko naprave in izbirni sekundarni naslov. Te številke so vnesene v ustrezne tabele. Rutina SETNAM nastavi ime niza za datoteko, ki je lahko obvezno za en kanal in neobvezno za drug kanal. Ta je sestavljen iz kazalca (dvobajtnega naslova) v pomnilniku. Kazalec kaže na začetek niza (ime), ki je lahko na drugem mestu v pomnilniku. Ime niza se začne z bajtom, ki ima dolžino niza, ki mu sledi besedilo (ime). Ime je dolgo največ šestnajst bajtov.

Za klic rutine SETLFS mora uporabniški program skočiti (JSR) na naslov $FFBA tabele skokov operacijskega sistema v ROM-u za privzeti pomnilniški zemljevid. Ne pozabite, da je vsak vnos sestavljen iz treh bajtov, razen zadnjih šestih bajtov tabele skokov. Prvi bajt je navodilo JSR, ki nato skoči na podprogram, se začne na naslovu v naslednjih dveh bajtih. Za klic rutine SETNAM mora uporabniški program skočiti (JSR) na naslov $FFBD tabele skokov OS v ROM-u. Uporaba teh dveh rutin je prikazana v naslednji razpravi.

5.5 Odpiranje kanala, odpiranje logične datoteke, zapiranje logične datoteke in zapiranje vseh V/I kanalov

Kanal je sestavljen iz pomnilniškega medpomnilnika, številke logične datoteke, številke naprave (naslov naprave) in neobveznega sekundarnega naslova (številka). Logična datoteka (abstrakcija), ki je identificirana z logično številko datoteke, se lahko nanaša na periferno napravo, kot je tiskalnik, modem, diskovni pogon itd. Vsaka od teh različnih naprav bi morala imeti različne številke logične datoteke. Na disku je veliko datotek. Logična datoteka se lahko nanaša tudi na določeno datoteko na disku. Ta določena datoteka ima tudi logično številko datoteke, ki se razlikuje od številk zunanjih naprav, kot sta tiskalnik ali modem. Logično številko datoteke poda programer. To je lahko poljubna številka od 010 ($00) do 25510 ($FF).

Rutina OS SETLFS
Rutina OS SETLFS, do katere se dostopa s skokom (JSR) na tabelo skokov OS ROM na $FFBA, nastavi kanal. V tabelo datotek mora vnesti logično številko datoteke, ki je LAT ($0259 — $0262). V tabelo datotek, ki je FAT ($0263 — $026C), mora dati ustrezno številko naprave. Če dostop do datoteke (naprave) potrebuje sekundarno številko, mora dati ustrezen sekundarni naslov (številko) v tabelo datotek, ki je SAT ($026D — $0276).

Za delovanje mora podprogram SETLFS pridobiti številko logične datoteke iz akumulatorja µP; pridobiti mora številko naprave iz registra µP X. Če ga kanal potrebuje, mora pridobiti sekundarni naslov iz registra µP Y.

Logično številko datoteke določi programer. Logične številke datotek, ki se nanašajo na različne naprave, so različne. Zdaj, preden pokliče rutino SETLFS, mora programer številko za logično datoteko vstaviti v akumulator µP. Številka naprave se prebere iz tabele (dokumenta), kot je v tabeli 5.41. Programer bi moral tudi vnesti številko naprave v register µP X. Dobavitelj naprave, kot je tiskalnik, diskovni pogon itd., zagotovi možne sekundarne naslove in njihove pomene za napravo. Če kanal potrebuje sekundarni naslov, ga mora programer pridobiti iz dokumenta, ki je priložen napravi (periferiji). Če je sekundarni naslov (številka) potreben, ga mora programer dati v register µP Y, preden pokliče podprogram SETLFS. Če ni potrebe po sekundarnem naslovu, mora programer vnesti številko $FF v register µP Y, preden pokliče podprogram SETLFS.

Podprogram SETLFS se pokliče brez argumentov. Njegovi argumenti so že v treh registrih 6502 µP. Po vnosu ustreznih številk v registre se rutina v programu preprosto pokliče z naslednjim v ločeni vrstici:

JSR SETLFS

Rutina ustrezno postavi različne številke v njihove tabele datotek.

Rutina OS SETNAM
Do rutine OS SETNAM se dostopa s skokom (JSR) na tabelo skokov OS ROM na $FFBD. Vsi cilji nimajo imen datotek. Za tiste, ki imajo cilje (kot so datoteke na disku), je treba nastaviti ime datoteke. Predpostavimo, da je ime datoteke 'mydocum', ki je sestavljeno iz 7 bajtov brez narekovajev. Predpostavimo, da je to ime na lokacijah od $C101 do $C107 (vključno), dolžina $07 pa na lokaciji $C100. Začetni naslov znakov niza je $C101. Nižji bajt začetnega naslova je $01 in višji bajt je $C1.

Preden pokliče rutino SETNAM, mora programer številko $07 (dolžina niza) vstaviti v akumulator µP. Spodnji bajt začetnega naslova niza $01 se vnese v register µP X. Višji bajt začetnega naslova niza $C1 se vnese v register µP Y. Podprogram preprosto pokličemo z naslednjim:

JSR SETNAM

Rutina SETNAM poveže vrednosti iz treh registrov s kanalom. Po tem vrednostim ni treba ostati v registrih. Če kanal ne potrebuje imena datoteke, mora programer dati $00 v akumulator µP. V tem primeru so vrednosti, ki so v registrih X in Y, prezrte.

Rutina OS OPEN
Do rutine OS OPEN se dostopa s skokom (JSR) na tabelo skokov OS ROM na $FFC0. Ta rutina uporablja logično številko datoteke, številko naprave (in medpomnilnik), možen sekundarni naslov in možno ime datoteke, da zagotovi povezavo med računalnikom commodore in datoteko v zunanji napravi ali samo zunanjo napravo.

Ta rutina, tako kot vse druge rutine Commodore OS ROM, ne sprejema argumentov. Čeprav uporablja registre µP, nobenemu od registrov ni bilo treba vnaprej naložiti argumentov (vrednosti) zanj. Če ga želite kodirati, po klicu SETLFS in SETNAM vnesite naslednje:

JSR ODPRTO

Pri rutini OPEN lahko pride do napak. Na primer, datoteke morda ni mogoče najti za branje. Ko pride do napake, rutina ne uspe in vnese ustrezno številko napake v akumulator µP ter nastavi zastavico za prenos (na 1) statusnega registra µP. V naslednji tabeli so številke napak in njihovi pomeni:

Tabela 5.51
Številke napak jedra in njihov pomen za rutino OPEN OS ROM
Številka napake Opis Primer
1 PREVEČ DATOTEK OPEN, ko se odpre že deset datotek
2 DATOTEKA ODPRTA ODPRTO 1,3: ODPRTO 1,4
3 DATOTEKA NI ODPRTA PRINT#5 brez OPEN
4 DATOTEKA NI NAJDENA NALOŽI “NONEXISTENF”,8
5 NAPRAVA NI PRISOTNA ODPRTO 11,11: PRINT#11
6 NI VHODNA DATOTEKA ODPRI “SEQ,S,W”: GET#8,X$
7 NI IZHODNA DATOTEKA OPEN 1,0: PRINT#1
8 MANJKAJO IME DATOTEKE NALOŽITEV “”,8
9 NELEGALNA NAPRAVA ŠT. NALOŽI “PROGRAM”,3

Ta tabela je predstavljena na način, ki ga bo bralec verjetno videl na mnogih drugih mestih.

Rutina OS CHKIN
Do rutine OS CHKIN dostopate s skokom (JSR) na tabelo skokov OS ROM na $FFC6. Po odprtju datoteke (logične datoteke) se je treba odločiti, ali je odprtje za vhod ali izhod. Rutina CHKIN naredi odpiranje vhodnega kanala. Ta rutina mora prebrati številko logične datoteke iz registra µP X. Torej mora programer vnesti številko logične datoteke v register X, preden pokliče to rutino. Imenuje se preprosto kot:

JSR CHKIN

Rutina OS CHKOUT
Do rutine OS CHKOUT dostopate s skokom (JSR) na tabelo skokov OS ROM na $FFC9. Po odprtju datoteke (logične datoteke) se je treba odločiti, ali je odprtje za vhod ali izhod. Rutina CHKOUT naredi odpiranje izhodni kanal. Ta rutina mora prebrati številko logične datoteke iz registra µP X. Torej mora programer vnesti številko logične datoteke v register X, preden pokliče to rutino. Imenuje se preprosto kot:

JSR CHKOUT

Rutina OS CLOSE
Do rutine OS CLOSE dostopate s skokom (JSR) na tabelo skokov OS ROM na $FFC3. Ko se odpre logična datoteka in se prenesejo bajti, je treba logično datoteko zapreti. Zapiranje logične datoteke sprosti vmesni pomnilnik v sistemski enoti, da ga lahko uporabi neka druga logična datoteka, ki jo je treba še odpreti. Izbrisani so tudi ustrezni parametri v treh tabelah datotek. Lokacija RAM-a za število odprtih datotek se zmanjša za 1.

Ko je računalnik vklopljen, pride do ponastavitve strojne opreme za mikroprocesor in druge glavne čipe (integrirana vezja) na matični plošči. Temu sledi inicializacija nekaterih lokacij pomnilnika RAM in nekaterih registrov v nekaterih čipih na matični plošči. V procesu inicializacije je bajtna pomnilniška lokacija naslova $0098 na ničelni strani podana z oznako NFILES ali LDTND, odvisno od različice operacijskega sistema. Medtem ko računalnik deluje, ta enobajtna lokacija 8 bitov vsebuje število logičnih datotek, ki so odprte, in indeks začetnega naslova zaporednih treh tabel datotek. Z drugimi besedami, ta bajt ima število odprtih datotek, ki se zmanjša za 1, ko je logična datoteka zaprta. Ko je logična datoteka zaprta, dostop do terminalske (ciljne) naprave ali dejanske datoteke na disku ni več mogoč.

Če želite zapreti logično datoteko, mora programer številko logične datoteke vnesti v akumulator µP. To je ista logična številka datoteke, ki se uporablja pri odpiranju datoteke. Rutina CLOSE ga potrebuje, da zapre določeno datoteko. Tako kot druge rutine OS ROM rutina CLOSE ne sprejema argumenta, čeprav je vrednost, ki je uporabljena iz akumulatorja, nekoliko argument. Učna vrstica zbirnega jezika je preprosto:

JSR ZAPRTO

Podprogrami (rutine) zbirnega jezika po meri ali vnaprej določeni 6502 ne sprejemajo argumentov. Vendar pa argumenti prihajajo neformalno z vnosom vrednosti, ki jih bo podprogram uporabil, v registre mikroprocesorja.

Rutina CLRCHN
Do rutine OS CLRCHN se dostopa s skokom (JSR) na tabelo skokov OS ROM na $FFCC. CLRCHN pomeni CleaR kanal. Ko je logična datoteka zaprta, se njeni parametri številke logične datoteke, številke naprave in možnega sekundarnega naslova izbrišejo. Torej je kanal za logično datoteko počiščen.

V priročniku piše, da rutina OS CLRCHN počisti vse odprte kanale in obnovi privzete številke naprav in druge privzete nastavitve. Ali to pomeni, da je mogoče spremeniti številko naprave za periferno napravo? No, ne povsem. Med inicializacijo operacijskega sistema je lokacija bajta naslova $0099 podana z oznako DFLTI, da zadrži trenutno številko vhodne naprave, ko računalnik deluje. Commodore-64 lahko dostopa samo do ene periferne enote hkrati. Med inicializacijo operacijskega sistema je lokacija bajta naslova $009A podana z oznako DFLTO za shranjevanje trenutne številke izhodne naprave, ko računalnik deluje.

Ko se pokliče podprogram CLRCHN, nastavi spremenljivko DFLTI na 0 ($00), kar je privzeta številka vhodne naprave (tipkovnica). Nastavi spremenljivko DFLTO na 3 ($03), kar je privzeta številka izhodne naprave (zaslon). Podobno se ponastavijo tudi druge spremenljivke številke naprave. To je pomen ponastavitve (ali obnovitve) vhodno/izhodnih naprav na normalne (privzete vrednosti).

Priročnik Commodore-64 pravi, da po klicu rutine CLRCHN ostanejo odprte logične datoteke odprte in lahko še vedno prenašajo bajte (podatke). To pomeni, da rutina CLRCHN ne izbriše ustreznih vnosov v tabelah datotek. Ime CLRCHN je glede na pomen precej dvoumno.

5.6 Pošiljanje znaka na zaslon

Glavno integrirano vezje (IC), ki skrbi za prikaz znakov in grafike na zaslonu, se imenuje Video Interface Controller (čip), ki je v Commodore-64 skrajšano VIC (pravzaprav VIC II za VIC različico 2). Da gre informacija (vrednosti) na zaslon, mora iti skozi VIC II, preden doseže zaslon.

Zaslon je sestavljen iz 25 vrstic in 40 stolpcev znakovnih celic. To pomeni 40 x 25 = 1000 znakov, ki jih je mogoče prikazati na zaslonu. VIC II prebere ustreznih 1000 zaporednih bajtnih lokacij pomnilnika RAM za znake. Teh 1000 lokacij skupaj je znanih kot pomnilnik zaslona. Kar gre v teh 1000 lokacij, so kode znakov. Za Commodore-64 se kode znakov razlikujejo od kod ASCII.

Koda znakov ni vzorec znakov. Obstaja tudi tisto, kar je znano kot znakovni ROM. Znakovni ROM je sestavljen iz vseh vrst vzorcev znakov, od katerih nekateri ustrezajo vzorcem znakov na tipkovnici. Znakovni ROM se razlikuje od pomnilnika zaslona. Ko naj bo znak prikazan na zaslonu, se koda znaka pošlje na mesto med 1000 položaji pomnilnika zaslona. Od tam se iz ROM-a znakov izbere ustrezen vzorec, ki naj bo prikazan na zaslonu. Izbira pravilnega vzorca v ROM-u znakov iz kode znakov izvede VIC II (strojna oprema).

Številne pomnilniške lokacije med $D000 in $DFFF imajo dva namena: uporabljajo se za upravljanje vhodno/izhodnih operacij, ki niso zaslon, ali se uporabljajo kot ROM znakov za zaslon. Zadevna sta dva bloka pomnilnika. Eden je RAM, drugi pa ROM za znakovni ROM. Zamenjava bank za obdelavo vhoda/izhoda ali znakovnih vzorcev (znakovni ROM) poteka s programsko opremo (rutina OS v ROM-u od $F000 do $FFFF).

Opomba : VIC ima registre, ki so naslovljeni z naslovi pomnilniškega prostora znotraj območja $D000 in $DFFF.

Rutina CHROUT
Do rutine OS CHROUT se dostopa s skokom (JSR) na tabelo skokov OS ROM na $FFD2. Ta rutina ob klicu vzame bajt, ki ga je programer vnesel v akumulator µP, in natisne na zaslonu, kjer je kazalec. Segment kode za tiskanje znaka »E« je na primer:

LDA #$05
CHROUT

0516 ni koda ASCII za 'E'. Commodore-64 ima lastne kode znakov za zaslon, kjer $05 pomeni 'E'. Številka #$05 se shrani v pomnilnik zaslona, ​​preden jo VIC pošlje na zaslon. Ti dve kodirni vrstici bi morali priti po nastavitvi kanala, odprtju logične datoteke in klicu rutine CHKOUT za izhod. Celotna koda je:

; Nastavitev kanala
LDA #$40 ; logično številko datoteke
LDX #$03 ; številka naprave za zaslon je $03
LDY #$FF ; brez sekundarnega naslova
JSR SETLFS ; pravilno nastavite kanal
; brez SETNAM, ker zaslon ne potrebuje imena
;
; Odprite logično datoteko
JSR ODPRTO
; Nastavite kanal za izhod
LDX #$40 ; logično številko datoteke
JSR CHKOUT
;
; Izhodni znak na zaslon
LDA #$05
JSR CHROUT
; Zapri logično datoteko
LDA #40 $
JSR ZAPRTO

Odprtino je treba zapreti, preden se zažene drug program. Predpostavimo, da uporabnik računalnika vnese znak na tipkovnico, ko je pričakovan. Naslednji program natisne znak s tipkovnice na zaslon:

; Nastavitev kanala
LDA #$40 ; logično številko datoteke
LDX #$03 ; številka naprave za zaslon je $03
LDY #$FF ; brez sekundarnega naslova
JSR SETLFS ; pravilno nastavite kanal
; brez SETNAM, ker zaslon ne potrebuje imena
;
; Odprite logično datoteko
JSR ODPRTO
; Nastavite kanal za izhod
LDX #$40 ; logično številko datoteke
JSR CHKOUT
;
; Vnos znakov s tipkovnice
POČAKAJ JSR GETIN ; postavi $00 v A, če je čakalna vrsta na tipkovnici prazna
CMP #$00 ; Če je 00 $ šlo k A, potem je Z 1 s primerjavo
BEQ POČAKAJ ; Ponovno GETIN iz čakalne vrste, če je 0 šla v akumulator
BNE PRNSCRN ; pojdite na PRNSCRN, če je Z 0, ker A nima več 00 $
; Izhodni znak na zaslon
PRNSCRN JSR CHROUT ; pošljite znak v A na zaslon
; Zapri logično datoteko
LDA #40 $
JSR ZAPRTO

Opomba : WAIT in PRNSCRN sta oznaki, ki identificirata naslove. Bajt s tipkovnice, ki prispe v akumulator µP, je koda ASCII. Ustrezna koda, ki jo Commodore-64 pošlje na zaslon, mora biti drugačna. Tega prejšnji program zaradi poenostavitve ni upošteval.

5.7 Pošiljanje in prejemanje bajtov za diskovni pogon

V sistemski enoti (matični plošči) Commodore-64 sta dva kompleksna vmesniška adapterja, imenovana VIA #1 in CIA #2. Vsaka CIA ima dve vzporedni vrati, ki se imenujeta vrata A in vrata B. Obstajajo zunanja vrata na navpični površini na zadnji strani sistemske enote Commodre-64, ki se imenujejo serijska vrata. Ta vrata imajo 6 nožic, od katerih je ena za podatke. Podatki vstopajo ali zapuščajo sistemsko enoto zaporedno, en bit naenkrat.

Osem vzporednih bitov iz notranjih vrat A CIA #2, na primer, lahko gre ven iz sistemske enote skozi zunanja serijska vrata, potem ko jih preklopni register v CIA pretvori v serijske podatke. Osembitni serijski podatki iz zunanjih serijskih vrat lahko gredo v notranja vrata A CIA #2, potem ko jih pretvori v vzporedne podatke s premičnim registrom v CIA.

Sistemska enota Commodore-64 (osnovna enota) uporablja zunanji diskovni pogon z disketo. Tiskalnik lahko na ta diskovni pogon povežete verižno (povezovanje naprav zaporedno kot niz). Podatkovni kabel za diskovni pogon je priključen na zunanja serijska vrata sistemske enote Commodore-64. To pomeni, da je na ista serijska vrata priključen tudi verižno vezan tiskalnik. Ti dve napravi sta označeni z dvema različnima številkama naprav (običajno 8 oziroma 4).

Pošiljanje ali prejemanje podatkov za diskovni pogon sledi istemu postopku, kot je opisano prej. To je:

  • Nastavitev imena logične datoteke (številka), ki je enaka imenu dejanske diskovne datoteke z uporabo rutine SETNAM.
  • Odpiranje logične datoteke z uporabo rutine OPEN.
  • Odločanje, ali je vhod ali izhod z uporabo rutine CHKOUT ali CHKIN.
  • Pošiljanje ali prejemanje podatkov z uporabo ukaza STA in/ali LDA.
  • Zapiranje logične datoteke z uporabo rutine CLOSE.

Logična datoteka mora biti zaprta. Zapiranje logične datoteke dejansko zapre ta določen kanal. Pri nastavitvi kanala za diskovno enoto logično številko datoteke določi programer. To je število med 00 $ in $FF (vključno). To ne sme biti številka, ki je že bila izbrana za katero koli drugo napravo (ali dejansko datoteko). Številka naprave je 8, če obstaja samo en diskovni pogon. Sekundarni naslov (številko) dobite v priročniku diskovnega pogona. Naslednji program uporablja 2. Program zapiše črko 'E' (ASCII) v datoteko na disku z imenom 'mydoc.doc'. Predpostavlja se, da se to ime začne na pomnilniškem naslovu $C101. Torej, nižji bajt $01 mora biti v registru X in višji bajt $C1 mora biti v registru Y, preden se pokliče rutina SETNAM. Register A mora imeti tudi številko $09, preden se pokliče rutina SETNAM.

; Nastavitev kanala
LDA #$40 ; logično številko datoteke
LDX #$08 ; številko naprave za prvi diskovni pogon
LDY #$02 ; sekundarni naslov
JSR SETLFS ; pravilno nastavite kanal
;
; Datoteka na disku potrebuje ime (že v pomnilniku)
LDA #$09
LDX #$01
LDY #$C1
JSR SETNAM
; Odprite logično datoteko
JSR ODPRTO
; Nastavite kanal za izhod
LDX #$40 ; logično številko datoteke
JSR CHKOUT ;za pisanje
;
; Izhodni char na disk
LDA #45 $
JSR CHROUT
; Zapri logično datoteko
LDA #40 $
JSR ZAPRTO

Če želite prebrati bajt z diska v register µP Y, ponovite prejšnji program z naslednjimi spremembami: Namesto “JSR CHKOUT ; za pisanje«, uporabite »JSR CHKIN ; za branje«. Zamenjajte segment kode za “; Izhodni char na disk' z naslednjim:

; Vnos char z diska
JSR CHRIS

Do rutine OS CHRIN dostopate s skokom (JSR) na tabelo skokov OS ROM na $FFCF. Ta rutina ob klicu pridobi bajt iz kanala, ki je že nastavljen kot vhodni kanal, in ga vnese v register µP A. Rutino GETIN ROM OS lahko uporabite tudi namesto CHRIN.

Pošiljanje bajta tiskalniku
Pošiljanje bajta v tiskalnik poteka na podoben način kot pošiljanje bajta v datoteko na disku.

5.8 Rutina OS SAVE

Do rutine OS SAVE dostopate tako, da skočite (JSR) na tabelo skokov OS ROM na $FFD8. Rutina OS SAVE v ROM shrani (izpiše) del pomnilnika na disk kot datoteko (z imenom). Začetni naslov odseka v pomnilniku mora biti znan. Prav tako mora biti znan končni naslov odseka. Spodnji bajt začetnega naslova je postavljen na stran nič v RAM-u na naslov $002B. Višji bajt začetnega naslova se postavi na pomnilniško lokacijo naslednjega bajta na naslov $002C. Na ničelni strani se oznaka TXTTAB nanaša na ta dva naslova, čeprav TXTTAB dejansko pomeni naslov $002B. Spodnji bajt končnega naslova se postavi v register µP X. Višji bajt končnega naslova plus 1 se postavi v register µP Y. Register µP A sprejme vrednost 2B $ za TXTTAB (002B$). S tem lahko pokličete rutino SAVE z naslednjim:

JSR SHRANI

Del pomnilnika, ki ga želite shraniti, je lahko program v zbirnem jeziku ali dokument. Primer dokumenta je lahko pismo ali esej. Če želite uporabiti rutino shranjevanja, morate slediti naslednjemu postopku:

  • Nastavite kanal z uporabo rutine SETLFS.
  • Z rutino SETNAM nastavite ime logične datoteke (številko), ki je enako dejanski datoteki diska.
  • Odprite logično datoteko z rutino OPEN.
  • Naredite datoteko za izhod z uporabo CHKOUT.
  • Tukaj je koda za shranjevanje datoteke, ki se konča z 'JSR SAVE'.
  • Zaprite logično datoteko z rutino CLOSE.

Naslednji program shrani datoteko, ki se začne s pomnilniškimi lokacijami od $C101 do $C200:

; Nastavitev kanala
LDA #$40 ; logično številko datoteke
LDX #$08 ; številko naprave za prvi diskovni pogon
LDY #$02 ; sekundarni naslov
JSR SETLFS ; pravilno nastavite kanal
;
; Ime datoteke na disku (že v pomnilniku pri $C301)
LDA #$09 ; dolžina imena datoteke
LDX #$01
LDY#$C3
JSR SETNAM
; Odprite logično datoteko
JSR ODPRTO
; Nastavite kanal za izhod
LDX #$40 ; logično številko datoteke
JSR CHKOUT ; za pisanje
;
; Izhodna datoteka na disk
LDA #$01
STA 2 milijarde dolarjev; TXTTAB
LDA #$C1
STA $2C
LDX #$00
LDY#$C2
LDA #$2B
JSR SHRANI
; Zapri logično datoteko
LDA #40 $
JSR ZAPRTO

Upoštevajte, da je to program, ki shrani drug del pomnilnika (ne programskega dela) na disk (disketo za Commodore-64).

5.9 Rutina OS LOAD

Do rutine OS LOAD se dostopa s skokom (JSR) na tabelo skokov OS ROM na $FFD5. Ko se odsek (veliko območje) pomnilnika shrani na disk, se shrani z glavo, ki ima začetni naslov odseka v pomnilniku. Podprogram OS LOAD naloži bajte datoteke v pomnilnik. Pri tej operaciji LOAD mora biti vrednost akumulatorja 010 ($00). Da operacija LOAD prebere začetni naslov v glavi datoteke na disku in postavi bajte datoteke v RAM, začenši s tem naslovom, mora biti sekundarni naslov za kanal 1 ali 2 (naslednji program uporablja 2). Ta rutina vrne naslov plus 1 najvišje naložene lokacije RAM. To pomeni, da se nizki bajt zadnjega naslova datoteke v RAM plus 1 vnese v register µP X, visoki bajt zadnjega naslova datoteke v RAM plus 1 pa v register µP Y.

Če je nalaganje neuspešno, register µP A vsebuje številko napake (možno 4, 5, 8 ali 9). Nastavljena je tudi zastavica C statusnega registra mikroprocesorja (nastavljena na 1). Če je nalaganje uspešno, zadnja vrednost registra A ni pomembna.

Zdaj, v prejšnjem poglavju tega spletnega kariernega tečaja, je prvo navodilo programa za zbirni jezik na naslovu v RAM-u, kjer se je program začel. Ni nujno, da je tako. To pomeni, da ni nujno, da je prvo navodilo programa na začetku programa v RAM-u. Navodilo za zagon programa je lahko kjer koli znotraj datoteke v RAM-u. Programerju svetujemo, da ta začetni ukaz zbirnega jezika označi s START. S tem se program po nalaganju ponovno zažene (izvede) z naslednjimi navodili zbirnega jezika:

JSR START

“JSR START” je v programu zbirnega jezika, ki naloži program, ki ga je treba zagnati. Zbiralni jezik, ki naloži drugo datoteko zbirnega jezika in zažene naloženo datoteko, ima naslednji postopek kode:

  • Nastavite kanal z uporabo rutine SETLFS.
  • Z rutino SETNAM nastavite ime logične datoteke (številko), ki je enako dejanski datoteki diska.
  • Odprite logično datoteko z rutino OPEN.
  • Naj bo datoteka za vnos s CHKIN.
  • Koda za nalaganje datoteke gre tukaj in se konča z 'JSR LOAD'.
  • Zaprite logično datoteko z rutino CLOSE.

Naslednji program naloži datoteko z diska in jo zažene:

; Nastavitev kanala
LDA #$40 ; logično številko datoteke
LDX #$08 ; številko naprave za prvi diskovni pogon
LDY #$02 ; sekundarni naslov
JSR SETLFS ; pravilno nastavite kanal
;
; Ime datoteke na disku (že v pomnilniku pri $C301)
LDA #$09 ; dolžina imena datoteke
LDX #$01
LDY#$C3
JSR SETNAM
; Odprite logično datoteko
JSR ODPRTO
; Nastavite kanal za vhod
LDX #$40 ; logično številko datoteke
JSR CHKIN ; za branje
;
; Vhodna datoteka z diska
LDA #$00
JSR NALOŽ
; Zapri logično datoteko
LDA #40 $
JSR ZAPRTO
; Zagon naloženega programa
JSR START

5.10 Modem in standard RS-232

Modem je naprava (periferna), ki pretvarja bite iz računalnika v ustrezne električne zvočne signale, ki se prenašajo po telefonski liniji. Na sprejemnem koncu je modem pred sprejemnim računalnikom. Ta drugi modem pretvori električne zvočne signale v bite za sprejemni računalnik.

Modem mora biti priključen na računalnik na zunanjih vratih (na navpični površini računalnika). Standard RS-232 se nanaša na posebno vrsto konektorja, ki povezuje modem z računalnikom (v preteklosti). Z drugimi besedami, veliko računalnikov v preteklosti je imelo zunanja vrata, ki so bila priključek RS-232 ali priključek, združljiv z RS-232.

Sistemska enota (računalnik) Commodore-64 ima zunanja vrata na zadnji navpični površini, ki se imenujejo uporabniška vrata. Ta uporabniška vrata so združljiva z RS-232. Tja lahko priključite modemsko napravo. Commodore-64 komunicira z modemom prek teh uporabniških vrat. Operacijski sistem ROM za Commodore-64 ima podprograme za komunikacijo z modemom, imenovane rutine RS-232. Te rutine imajo vnose v tabeli skokov.

Hitrost prenosa
Osem-bitni bajt iz računalnika se pretvori v niz osmih bitov, preden se pošlje modemu. Obratno se izvede od modema do računalnika. Hitrost prenosa je število bitov, ki se prenašajo na sekundo v seriji.

Dno pomnilnika
Izraz »Dno pomnilnika« se ne nanaša na pomnilniško bajtno lokacijo naslova $0000. Nanaša se na najnižjo lokacijo RAM-a, kamor lahko uporabnik začne postavljati svoje podatke in programe. Privzeto je 0800 USD. Spomnite se iz prejšnje razprave, da veliko lokacij med $0800 in $BFFF uporabljajo računalniški jezik BASIC in njegovi programerji (uporabniki). Samo lokacije naslovov od $C000 do $CFFF so ostale za uporabo za programe in podatke v zbirnem jeziku; to je 4 Kbajtov od 64 Kbajtov pomnilnika.

Vrh spomina
V tistih časih, ko so kupci kupovali računalnike Commodore-64, nekateri niso imeli vseh pomnilniških lokacij. Takšni računalniki so imeli ROM s svojim operacijskim sistemom od $E000 do $FFFF. Imeli so RAM od $0000 do limita, ki ni $DFFF, poleg $E000. Omejitev je bila pod $DFFF in ta omejitev se imenuje »vrh pomnilnika«. Torej se top-of-memory ne nanaša na lokacijo $FFFF.

Medpomnilniki Commodore-64 za komunikacijo RS-232
Oddajni medpomnilnik
Medpomnilnik za prenos RS-232 (izhod) zavzame 256 bajtov od vrha pomnilnika navzdol. Kazalec za ta oddajni medpomnilnik je označen kot ROBUF. Ta kazalec je na ničelni strani z naslovi $00F9, ki jim sledi $00FA. ROBUF dejansko identificira $00F9. Torej, če je naslov za začetek vmesnega pomnilnika $BE00, je spodnji bajt $BE00, ki je $00, na lokaciji $00F9, višji bajt $BE00, ki je $BE, pa je na lokaciji $00FA lokacijo.

Sprejemni medpomnilnik
Medpomnilnik za sprejem bajtov RS-232 (vhod) zavzame 256 bajtov od dna oddajnega medpomnilnika. Kazalec za ta sprejemni medpomnilnik je označen kot RIBUF. Ta kazalec je na ničelni strani z naslovi $00F7, ki jim sledi $00F8. RIBUF dejansko identificira $00F7. Torej, če je naslov za začetek vmesnega pomnilnika $BF00, je spodnji bajt $BF00, ki je $00, na lokaciji $00F7, višji bajt $BF00, ki je $BF, pa je na lokaciji $00F8 lokacijo. Torej se 512 bajtov z vrha pomnilnika uporablja kot skupni vmesni pomnilnik RS-232 RAM.

Kanal RS-232
Ko je modem priključen na (zunanja) uporabniška vrata, je komunikacija z modemom le komunikacija RS-232. Postopek za popoln kanal RS-232 je skoraj enak kot v prejšnji razpravi, vendar z eno pomembno razliko: ime datoteke je koda in ne niz v pomnilniku. Koda $0610 je dobra izbira. Pomeni hitrost prenosa 300 bitov/s in nekatere druge tehnične parametre. Prav tako ni sekundarnega naslova. Upoštevajte, da je številka naprave 2. Postopek za nastavitev celotnega kanala RS-232 je:

  • Nastavitev kanala z uporabo SETLFS rutine.
  • Nastavitev imena logične datoteke, $0610.
  • Odpiranje logične datoteke z uporabo rutine OPEN.
  • Naredite datoteko za izhod s CHKOUT ali datoteko za vnos s CHKIN.
  • Pošiljanje posameznih bajtov s CHROUT ali prejemanje posameznih bajtov z GETIN.
  • Zapiranje logične datoteke z uporabo rutine CLOSE.

Do rutine OS GETIN se dostopa s skokom (JSR) na tabelo skokov OS ROM na $FFE4. Ta rutina ob klicu vzame bajt, ki je poslan v medpomnilnik sprejemnika, in ga postavi (vrne) v akumulator µP.

Naslednji program pošlje bajt 'E' (ASCII) modemu, ki je povezan z uporabniškimi vrati, združljivimi z RS-232:

; Nastavitev kanala
LDA #$40 ; logično številko datoteke
LDX #$02 ; številko naprave za RS-232
LDY #$FF ; brez sekundarnega naslova
JSR SETLFS ; pravilno nastavite kanal
;
; Ime za RS-232 je koda, npr. 0610 dolarjev
LDA #$02 ; dolžina kode je 2 bajta
LDX #10 $
LDY #$06
JSR SETNAM
;
; Odprite logično datoteko
JSR ODPRTO
; Nastavite kanal za izhod
LDX #$40 ; logično številko datoteke
JSR CHKOUT
;
; Izhodni znak v RS-232, npr. modem
LDA #45 $
JSR CHROUT
; Zapri logično datoteko
LDA #40 $
JSR ZAPRTO

Za sprejem bajta je koda zelo podobna, le da se »JSR CHKOUT« nadomesti z »JSR CHKIN« in:

LDA #45 $
JSR CHROUT

se nadomesti z 'JSR GETIN', rezultat pa se vnese v register A.

Neprekinjeno pošiljanje ali prejemanje bajtov poteka z zanko za pošiljanje oziroma prejemanje segmenta kode.

Upoštevajte, da sta vnos in izhod pri Commodoreju v večini primerov podobna, razen pri tipkovnici, kjer nekaterih rutin ne pokliče programer, ampak jih pokliče operacijski sistem.

5.11 Štetje in merjenje časa

Razmislite o zaporedju odštevanja, ki je:

2, 1, 0

To je odštevanje od 2 do 0. Zdaj razmislite o ponavljajočem se zaporedju odštevanja:

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

To je ponavljajoče se odštevanje istega zaporedja. Zaporedje se ponovi štirikrat. Štirikrat pomeni, da je čas 4. Šteje se znotraj enega zaporedja. Ponavljanje istega zaporedja je merjenje časa.

V sistemski enoti Commodore-64 sta dva kompleksna vmesnika. Vsak CIA ima dve vezji števca/časovnika, imenovani Timer A (TA) in Timer B (TB). Tokokrog za štetje se ne razlikuje od tokokroga za merjenje časa. Števec ali časovnik v Commodore-64 se nanaša na isto stvar. Pravzaprav se kateri koli od njiju v bistvu nanaša na en 16-bitni register, ki vedno odšteva do 0 pri impulzih sistemske ure. V 16-bitni register lahko nastavite različne vrednosti. Večja kot je vrednost, dlje traja odštevanje do ničle. Vsakič, ko gre eden od časovnikov čez ničlo, se IRQ prekinitveni signal se pošlje mikroprocesorju. Ko gre štetje čez ničlo, se to imenuje podtok.

Odvisno od tega, kako je časovno vezje programirano, lahko časovnik deluje v enkratnem ali neprekinjenem načinu. Pri prejšnji ilustraciji enkratni način pomeni 'naredi 2, 1, 0' in se ustavi, medtem ko se urni impulzi nadaljujejo. Neprekinjeni način je podoben »2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0 itd.« ki se nadaljuje z urnimi impulzi. To pomeni, da se zaporedje odštevanja ponovi, ko gre čez ničlo, če ni podanega nobenega navodila. Največje število je običajno veliko večje od 2.

Ureja časovnik A (TA) CIA #1 IRQ v rednih intervalih (trajanja) za servisiranje tipkovnice. Pravzaprav je to privzeto vsako 1/60 sekunde. IRQ se pošlje mikroprocesorju vsako 1/60 sekunde. Je šele, ko IRQ se pošlje, da lahko program prebere vrednost ključa iz čakalne vrste tipkovnice (medpomnilnika). Ne pozabite, da ima mikroprocesor samo en pin za IRQ signal. Mikroprocesor ima tudi samo en pin za NMI signal. Signal ¯NMI do mikroprocesorja vedno prihaja iz CIA #2.

16-bitni časovni register ima dva pomnilniška naslova: enega za nižji bajt in enega za višji bajt. Vsak CIA ima dve časovni vezji. CIA sta enaki. Za CIA #1 sta naslova za dva časovnika: DC04 in DC05 za TA ter DC06 in DC07 za TB. Za CIA #2 sta naslova za dva časovnika: DD04 in DD05 za TA ter DD06 in DD07 za TB.

Predpostavimo, da je treba številko 25510 poslati časovniku TA CIA #2 za odštevanje. 25510 = 00000000111111112 je v šestnajstih bitih. 00000000111111112 = $000FFF je v šestnajstiški obliki. V tem primeru se $FF pošlje v register na naslov $DD04, $00 pa se pošlje v register na naslov $DD05 – majhna endianija. Naslednji segment kode pošlje številko v register:

LDA #$FF
STANJE $DD04
LDA #$00
STANJE $DD05

Čeprav imajo registri v CIA naslove RAM, so fizično v CIA in CIA je ločen IC od RAM-a ali ROM-a.

To še ni vse! Ko časovnik prejme številko za odštevanje, na primer pri prejšnji kodi, se odštevanje ne začne. Odštevanje se začne, ko je osem-bitni bajt poslan v ustrezen kontrolni register za časovnik. Prvi bit tega bajta za kontrolni register označuje, ali naj se odštevanje začne ali ne. Vrednost 0 za ta prvi bit pomeni ustavitev odštevanja, medtem ko vrednost 1 pomeni začetek odštevanja. Poleg tega mora bajt navesti, ali je odštevanje v načinu enega strela (enkrat) ali v načinu prostega teka (neprekinjen način). Enkratni način odšteva in se ustavi, ko vrednost časovnega registra postane nič. Pri načinu prostega teka se odštevanje ponovi, ko doseže 0. Četrti (indeks 3) bit bajta, ki se pošlje v krmilni register, označuje način: 0 pomeni način prostega teka in 1 pomeni način enkratnega teka.

Primerno število za začetek štetja v načinu enega posnetka je 000010012 = 09 $ v šestnajstiški obliki. Primerno število za začetek štetja v načinu prostega teka je 000000012 = $01 v šestnajstiški obliki. Vsak časovni register ima svoj kontrolni register. V CIA št. 1 ima kontrolni register za časovnik A naslov RAM DC0E16, kontrolni register za časovnik B pa naslov RAM DC0F16. V CIA št. 2 ima kontrolni register za časovnik A naslov RAM DD0E16, kontrolni register za časovnik B pa naslov RAM DD0F16. Če želite začeti odštevati šestnajstbitno število v TA CIA #2, v enkratnem načinu, uporabite naslednjo kodo:

LDA #$09
STA $DD0E

Če želite začeti odštevati šestnajstbitno število v TA CIA #2, v prostem teku, uporabite naslednjo kodo:

LDA #$01
STA $DD0E

5.12 The IRQ in NMI Zahteve

Mikroprocesor 6502 ima IRQ in NMI črte (zatiči). Oba CIA #1 in CIA #2 imata vsaka IRQ pin za mikroprocesor. The IRQ pin CIA #2 je povezan z NMI zatič µP. The IRQ pin CIA #1 je povezan z IRQ zatič µP. To sta edini dve prekinitveni liniji, ki povezujeta mikroprocesor. Torej IRQ pin CIA #2 je NMI vir in jo lahko vidimo tudi kot črto ¯NMI.

CIA #1 ima pet možnih neposrednih virov ustvarjanja IRQ signal za µP. CIA #2 je po strukturi enaka CIA #1. Torej, CIA št. 2 ima tokrat istih pet možnih neposrednih virov generiranja prekinitvenega signala, ki je NMI signal. Ne pozabite, da ko µP prejme NMI signal, če obravnava IRQ zahtevo, jo prekine in obravnava NMI prošnja. Ko konča z obdelavo NMI zahteva, nato nadaljuje z obravnavo IRQ prošnja.

CIA #1 je običajno priključena zunaj na tipkovnico in igralno napravo, kot je igralna palica. Tipkovnica uporablja več vrat A CIA št. 1 kot vrata B. Igralna naprava uporablja več vrat CIA št. 1 B kot vrata A. CIA št. 2 je običajno povezana zunaj diskovnega pogona (verižno povezana s tiskalnikom) in modem. Diskovni pogon uporablja več vrat A CIA #2 (čeprav prek zunanjih serijskih vrat) kot svoja vrata B. Modem (RS-232) uporablja več CIA #2 vrat B kot svoja vrata A.

Ob vsem tem, kako sistemska enota ve, kaj povzroča IRQ oz NMI prekiniti? CIA #1 in CIA #2 imata pet neposrednih virov prekinitev. Če je prekinitveni signal µP NMI , vir je eden od neposrednih petih virov iz Cie #2. Če je prekinitveni signal µP IRQ , vir je eden od neposrednih petih virov iz Cie #1.

Naslednje vprašanje je: 'Kako sistemska enota razlikuje med petimi neposrednimi viri vsake Cie?' Vsak CIA ima osembitni register, ki se imenuje register za nadzor prekinitev (ICR). ICR služi obema pristaniščema Cie. Naslednja tabela prikazuje pomene osmih bitov registra za nadzor prekinitve, začenši z bitom 0:

Tabela 5.13
Nadzorni register prekinitev
Bitni indeks Pomen
0 Nastavljen (narejen 1) s spodnjim tokom časovnika A
1 Nastavljeno s spodnjim tokom časovnika B
2 Nastavite, kdaj je ura za dnevni čas enaka alarmu
3 Nastavite, ko so serijska vrata polna
4 Nastavljeno z zunanjo napravo
5 Ni uporabljeno (izdelano 0)
6 Ni uporabljeno (izdelano 0)
7 Nastavi se, ko je nastavljen kateri koli od prvih petih bitov

Kot je razvidno iz tabele, je vsak od neposrednih virov predstavljen z enim od prvih petih bitov. Torej, ko je prekinitveni signal prejet na µP, je treba izvesti kodo za branje vsebine registra za nadzor prekinitev, da se pozna natančen izvor prekinitve. Naslov RAM za ICR CIA #1 je DC0D16. Naslov RAM za ICR CIA #2 je DD0D16. Če želite prebrati (vrniti) vsebino ICR CIA #1 v akumulator µP, vnesite naslednje navodilo:

LDA$DC0D

Če želite prebrati (vrniti) vsebino ICR CIA #2 v akumulator µP, vnesite naslednje navodilo:

LDA $DD0D

5.13 Program v ozadju, ki ga poganja prekinitev

Tipkovnica običajno prekine mikroprocesor vsako 1/60 sekunde. Predstavljajte si, da se program izvaja in doseže položaj, v katerem čaka na tipko s tipkovnice, preden lahko nadaljuje s spodnjimi segmenti kode. Predpostavimo, da če na tipkovnici ne pritisnete nobene tipke, program izvede le majhno zanko in čaka na tipko. Predstavljajte si, da se program izvaja in je ravnokar pričakoval tipko s tipkovnice takoj po izdani prekinitvi tipkovnice. Na tej točki se celoten računalnik posredno ustavi in ​​ne počne nič drugega kot zankanje čakalne zanke. Predstavljajte si, da je tipka na tipkovnici pritisnjena tik pred naslednjo izdajo naslednje prekinitve tipkovnice. To pomeni, da računalnik približno eno šestdesetinko sekunde ni naredil ničesar! To je dolgo časa, da računalnik ne naredi ničesar, tudi v dneh Commodore-64. Računalnik bi lahko v tem času (trajanju) počel kaj drugega. V programu je veliko takih trajanj.

Drugi program je mogoče napisati tako, da deluje v takšnih časih »prostega teka«. Za tak program pravimo, da deluje v ozadju glavnega (ali prvega) programa. Enostaven način za to je, da vsilite spremenjeno obravnavo prekinitve BRK, ko se od tipkovnice pričakuje tipka.

Kazalec za navodilo BRK
Na zaporednih lokacijah RAM-a naslovov $0316 in $0317 je kazalec (vektor) za dejansko rutino ukazov BRK. Privzeti kazalec se tam postavi, ko računalnik zažene operacijski sistem v ROM-u. Ta privzeti kazalec je naslov, ki še vedno kaže na privzeti upravljalnik navodil BRK v OS ROM. Kazalec je 16-bitni naslov. Nižji bajt kazalca je postavljen na mesto bajta naslova $0306, višji bajt kazalca pa na mesto bajta $0317.

Drugi program je mogoče napisati tako, da ko je sistem 'mirujoč', sistem izvaja nekatere kode drugega programa. To pomeni, da mora biti drugi program sestavljen iz podprogramov. Ko je sistem v mirovanju in čaka na tipko s tipkovnice, se izvede naslednji podprogram za drugi program. Interakcija človeka z računalnikom je počasna v primerjavi z delovanjem sistemske enote.

To težavo je enostavno rešiti: vsakič, ko mora računalnik čakati na tipko s tipkovnice, v kodo vstavite navodilo BRK in zamenjajte kazalec na $0316 (in $0317) s kazalcem naslednjega podprograma drugega ( program po meri. Na ta način bi se oba programa izvajala v času, ki ni veliko daljši od trajanja glavnega programa, ki se izvaja sam.

5.14 Sestavljanje in prevajanje

Sestavljalnik zamenja vse oznake z naslovi. Program v zbirnem jeziku je običajno napisan tako, da se začne na določenem naslovu. Rezultat asemblerja (po sestavljanju) se imenuje 'objektna koda', pri čemer je vse v dvojiški obliki. Ta rezultat je izvršljiva datoteka, če je datoteka program in ne dokument. Dokument ni izvedljiv.

Aplikacija je sestavljena iz več kot enega programa (v zbirnem jeziku). Običajno obstaja glavni program. Te situacije ne smemo zamenjevati s situacijo za programe v ozadju, ki jih poganjajo prekinitve. Vsi programi tukaj so programi v ospredju, vendar obstaja prvi ali glavni program.

Namesto asemblerja je potreben prevajalnik, če obstaja več kot en program v ospredju. Prevajalnik sestavi vsakega od programov v objektno kodo. Vendar pa bi prišlo do težave: nekateri segmenti kode se bodo prekrivali, ker programe verjetno pišejo različni ljudje. Rešitev prevajalnika je, da vse prekrivajoče se programe razen prvega premakne v pomnilniški prostor, tako da se programi ne prekrivajo. Zdaj, ko gre za shranjevanje spremenljivk, bi se nekateri naslovi spremenljivk še vedno prekrivali. Rešitev tukaj je zamenjava prekrivajočih se naslovov z novimi naslovi (razen za prvi program), tako da se ne prekrivajo več. Na ta način se bodo različni programi prilegali različnim delom (območjem) pomnilnika.

Ob vsem tem je možno, da ena rutina v enem programu kliče rutino v drugem programu. Torej prevajalnik naredi povezovanje. Povezovanje se nanaša na začetni naslov podprograma v enem programu in nato njegov klic v drugem programu; oba sta del aplikacije. Za to morata oba programa uporabiti isti naslov. Končni rezultat je ena velika objektna koda z vsem v binarni obliki (biti).

5.15 Shranjevanje, nalaganje in izvajanje programa

Zbirni jezik je običajno napisan v nekem urejevalniku (ki je lahko priložen programu za montažo). Program urejevalnika označuje, kje se program začne in konča v pomnilniku (RAM). Kernal SAVE rutina OS ROM-a Commodore-64 lahko shrani program iz pomnilnika na disk. Na disk samo odlaga del (blok) pomnilnika, ki morda vsebuje njegov klic navodil. Priporočljivo je, da je klicno navodilo SAVE ločeno od programa, ki ga shranjujemo, tako da se program, ko se z diska naloži v pomnilnik, ob zagonu ne bo ponovno shranil. Nalaganje programa v zbirnem jeziku z diska je drugačen izziv, ker se program ne more naložiti sam.

Program se ne more naložiti z diska na mesto, kjer se začne in konča v RAM-u. Commodore-64 je bil v tistih časih običajno opremljen s tolmačem BASIC za izvajanje programov v jeziku BASIC. Ko je stroj (računalnik) vklopljen, se poravna z ukazno vrstico: READY. Od tam lahko OSNOVNE ukaze ali navodila vnesete tako, da po vnosu pritisnete tipko 'Enter'. OSNOVNI ukaz (navodilo) za nalaganje datoteke je:

NALOŽI “ime datoteke”,8,1

Ukaz se začne z rezervirano besedo BASIC, ki je LOAD. Temu sledi presledek in nato ime datoteke v dvojnih narekovajih. Sledi številka naprave 8, pred katero je vejica. Sledi sekundarni naslov za disk, ki je 1, pred njim pa vejica. Pri takšni datoteki je začetni naslov programa v zbirnem jeziku v glavi datoteke na disku. Ko BASIC konča nalaganje programa, se vrne zadnji naslov RAM plus 1 programa. Beseda 'vrnjeno' tukaj pomeni, da je spodnji bajt zadnjega naslova plus 1 vstavljen v register µP X, višji bajt zadnjega naslova plus 1 pa v register µP Y.

Ko se program naloži, ga je treba zagnati (izvesti). Uporabnik programa mora poznati začetni naslov za izvajanje v pomnilniku. Tudi tu je potreben drug BASIC program. To je ukaz SYS. Po izvedbi ukaza SYS se program v zbirnem jeziku zažene (in ustavi). Če je med izvajanjem potreben kakršen koli vnos s tipkovnice, mora program za zbirni jezik to uporabniku sporočiti. Ko uporabnik vnese podatke na tipkovnici in pritisne tipko 'Enter', bo program v zbirnem jeziku nadaljeval z uporabo vnosa s tipkovnice brez motenj tolmača BASIC.

Ob predpostavki, da je začetek izvajalnega (izvajalskega) naslova RAM za program zbirnega jezika C12316, se C123 pretvori v osnovo deset, preden se uporabi z ukazom SYS. Pretvorba C12316 v osnovo deset je naslednja:

Torej, ukaz BASIC SYS je:

SYS 49443

5.16 Zagon za Commodore-64

Zagon Commodore-64 je sestavljen iz dveh faz: faze ponastavitve strojne opreme in faze inicializacije operacijskega sistema. Operacijski sistem je Kernal v ROM-u (in ne na disku). Obstaja vrstica za ponastavitev (pravzaprav RES ), ki se poveže z zatičem pri 6502 µP in z istim imenom zatiča v vseh posebnih ladjah, kot so CIA 1, CIA 2 in VIC II. V fazi ponastavitve se zaradi te vrstice vsi registri v µP in v posebnih čipih ponastavijo na 0 (naredi nič za vsak bit). Nato strojna oprema mikroprocesorja poda kazalec sklada in register statusa procesorja s svojimi začetnimi vrednostmi v mikroprocesorju. Programski števec je nato podan z vrednostjo (naslovom) na lokacijah $FFFC in $FFFD. Spomnimo se, da programski števec vsebuje naslov naslednjega ukaza. Vsebina (naslov), ki je tukaj, je za podprogram, ki začne inicializacijo programske opreme. Vse do sedaj opravlja strojna oprema mikroprocesorjev. V tej fazi se ne dotakne celotnega spomina. Nato se začne naslednja faza inicializacije.

Inicializacijo izvedejo nekatere rutine v OS ROM. Inicializacija pomeni dajanje začetnih ali privzetih vrednosti nekaterim registrom v posebnih čipih. Inicializacija se začne z dodelitvijo začetnih ali privzetih vrednosti nekaterim registrom v posebnih čipih. IRQ , na primer, mora začeti izdajati vsako 1/60 sekunde. Torej mora biti njegov ustrezni časovnik v CIA #1 nastavljen na privzeto vrednost.

Nato Kernal izvede preizkus RAM-a. Vsako lokacijo preizkusi tako, da pošlje bajt na lokacijo in ga prebere nazaj. Če je razlika, je vsaj ta lokacija slaba. Kernal identificira tudi vrh pomnilnika in dno pomnilnika ter nastavi ustrezne kazalce na strani 2. Če je vrh pomnilnika $DFFF, se $FF postavi na lokacijo $0283, $DF pa na lokacijo bajta $0284. Tako $0283 kot $0284 imata oznako HIRAM. Če je spodnji del pomnilnika 0800 $, se 00 $ postavi na lokacijo $0281, 08 $ pa na lokacijo $0282. Tako $0281 kot $0282 imata oznako LORAM. Test RAM-a se dejansko začne od 0300 $ do vrha pomnilnika (RAM).

Končno se vhodno/izhodni vektorji (kazalci) nastavijo na privzete vrednosti. Test RAM-a se dejansko začne od 0300 $ do vrha pomnilnika (RAM). To pomeni, da so strani 0, stran 1 in stran 2 inicializirane. Predvsem stran 0 ima veliko kazalcev OS ROM, stran 2 pa veliko kazalcev BASIC. Ti kazalci se imenujejo spremenljivke. Ne pozabite, da je stran 1 sklad. Kazalci se imenujejo spremenljivke, ker imajo imena (oznake). Na tej stopnji se počisti pomnilnik zaslona za zaslon (monitor). To pomeni pošiljanje kode 20 USD za prostor (kar je enako kot ASCII 20 USD) na lokacije zaslona s 1000 RAM-i. Nazadnje Kernal zažene tolmač BASIC, da prikaže ukazni poziv BASIC, ki je PRIPRAVLJEN na vrhu monitorja (zaslona).

5.17 Težave

Bralcu svetujemo, da reši vse težave v poglavju, preden se premakne na naslednje poglavje.

  1. Napišite kodo zbirnega jezika, ki naredi vse bite vrat CIA #2 A kot izhod in CIA #2 vrat B kot vhod.
  2. Napišite jezikovno kodo 6502, ki čaka na tipko na tipkovnici, dokler je ne pritisnete.
  3. Napišite program v zbirnem jeziku 6502, ki pošlje znak 'E' na zaslon Commodore-64.
  4. Napišite program v zbirnem jeziku 6502, ki vzame znak s tipkovnice in ga pošlje na zaslon Commodore-64, pri tem pa ne upošteva kode tipk in časa.
  5. Napišite program v zbirnem jeziku 6502, ki prejme bajt z diskete Commodore-64.
  6. Napišite program v zbirnem jeziku 6502, ki shrani datoteko na disketo Commodore-64.
  7. Napišite program v zbirnem jeziku 6502, ki naloži programsko datoteko z diskete Commodore-64 in jo zažene.
  8. Napišite program v zbirnem jeziku 6502, ki pošlje bajt 'E' (ASCII) modemu, ki je povezan z uporabniškimi RS-232 združljivimi vrati Commodore-64.
  9. Pojasnite, kako poteka štetje in merjenje časa v računalniku Commodore-64.
  10. Pojasnite, kako lahko sistemska enota Commodore-64 identificira 10 različnih virov zahtev za takojšnjo prekinitev, vključno z zahtevami za prekinitve, ki jih ni mogoče maskirati.
  11. Pojasnite, kako lahko program v ozadju deluje s programom v ospredju v računalniku Commodore-64.
  12. Na kratko pojasnite, kako je mogoče programe v zbirnem jeziku prevesti v eno aplikacijo za računalnik Commodore-64.
  13. Na kratko razložite postopek zagona za računalnik Commodore-64.