5. nodaļa: Commodore-64 operētājsistēma montāžas valodā

5 Nodala Commodore 64 Operetajsistema Montazas Valoda



5.1. Ievads

Commodore-64 datora operētājsistēma tiek piegādāta kopā ar datoru lasāmatmiņā (ROM). Commodore-64 atmiņas baitu vietu skaits svārstās no USD 0000 līdz USD FFFF (t.i., no 000016 līdz FFFF16, kas ir no 010 līdz 65 53510). Operētājsistēmas cena ir no USD E000 līdz USD FFFF (t.i., no 57 34410 līdz 65 53610).

Kāpēc izpētīt Commodore-64 operētājsistēmu
Kāpēc šodien pētīt operētājsistēmu Commodore-64, jo tā bija 1982. gadā izlaista datora operētājsistēma? Commodore-64 dators izmanto centrālo procesoru 6510, kas ir 6502 µP jauninājums (lai gan tas nav liels jauninājums).







6502 µP joprojām tiek ražoti lielā skaitā; tas vairs nav paredzēts mājas vai biroja datoriem, bet gan elektriskām un elektroniskām ierīcēm (ierīcēm). 6502 µP ir arī vienkārši saprotams un lietojams salīdzinājumā ar citiem tā laika mikroprocesoriem. Tā rezultātā tas ir viens no labākajiem (ja ne labākajiem) mikroprocesoriem, ko izmantot montāžas valodas mācīšanai.



65C02 µP, kas joprojām ir 6502 mikroprocesoru klase, ir 66 montāžas valodu instrukcijas, kuras visas var iemācīties pat no galvas. Mūsdienu mikroprocesoros ir daudz montāžas valodas instrukciju, un tos nevar iemācīties no galvas. Katram µP ir sava montāžas valoda. Jebkura operētājsistēma, neatkarīgi no tā, vai tā ir jauna vai veca, ir montāžas valodas. Tādējādi 6502 montāžas valoda ir piemērota, lai mācītu operētājsistēmu iesācējiem. Pēc operētājsistēmas apguves, piemēram, Commodore-64, modernu operētājsistēmu var viegli apgūt, izmantojot to kā pamatu.



Tas nav tikai autora (mana) viedoklis. Tā ir pieaugoša tendence pasaulē. Internetā tiek rakstīts arvien vairāk rakstu par uzlabotu Commodore-64 operētājsistēmu, lai tā izskatītos pēc modernas operētājsistēmas. Mūsdienu operētājsistēmas ir izskaidrotas nodaļā pēc nākamās.





Piezīme : Commodore-64 OS (Kernal) joprojām labi darbojas ar modernām ievades un izvades ierīcēm (ne visām).

Astoņu bitu dators
Astoņu bitu mikrodatorā, piemēram, Commodore 64, informācija tiek glabāta, pārsūtīta un manipulēta astoņu bitu bināro kodu veidā.



Atmiņas karte
Atmiņas karte ir skala, kas sadala visu atmiņas diapazonu mazākos dažāda lieluma diapazonos un parāda, kas (apakšprogramma un/vai mainīgais) pieder kādam diapazonam. Mainīgais ir etiķete, kas atbilst noteiktai atmiņas adresei, kurai ir vērtība. Etiķetes tiek izmantotas arī, lai identificētu apakšprogrammu sākumu. Bet šajā gadījumā tie ir zināmi kā apakšprogrammu nosaukumi. Apakšprogrammu var vienkārši saukt par rutīnu.

Atmiņas karte (izkārtojums) iepriekšējā nodaļā nav pietiekami detalizēta. Tas ir pavisam vienkārši. Commodore-64 datora atmiņas karti var parādīt ar trīs detaļu līmeņiem. Ja tiek rādīts vidējā līmenī, datoram Commodore-64 ir dažādas atmiņas kartes. Commodore-64 datora noklusējuma atmiņas karte vidējā līmenī ir:


5.11. att. Commodore-64 atmiņas karte

Tajos laikos bija populāra datorvaloda ar nosaukumu BASIC. Daudziem datoru lietotājiem bija jāzina dažas minimālās BASIC valodas komandas, piemēram, lai ielādētu programmu no disketes (diska) atmiņā, palaistu (izpildītu) programmu atmiņā un izietu (aizvērtu) programmu. Kad darbojas BASIC programma, lietotājam ir jāievada dati pa rindiņai. Nav tā, kā mūsdienās, kad lietojumprogramma (vairākas programmas veido aplikāciju) tiek uzrakstīta augsta līmeņa valodā ar logiem un lietotājam ir tikai jāiekļauj dažādi dati specializētās loga vietās. Dažos gadījumos izmantojiet peli, lai atlasītu iepriekš pasūtītos datus. BASIC tajā laikā bija augsta līmeņa valoda, taču ir diezgan tuvu montāžas valodai.

Ņemiet vērā, ka lielāko daļu atmiņas aizņem BASIC noklusējuma atmiņas kartē. BASIC ir komandas (instrukcijas), kuras izpilda tā sauktais BASIC tulks. Faktiski BASIC tulks atrodas ROM no $A000 atrašanās vietas līdz $ BFFF (ieskaitot), kas it kā ir RAM apgabals. Tas ir 8 kbaiti, kas tajā laikā ir diezgan liels! Tas faktiski atrodas ROM tajā visas atmiņas vietā. Tam ir tāds pats izmērs kā operētājsistēmai no USD E000 līdz USD FFFF (ieskaitot). Programmas, kas ir rakstītas BASIC, arī ir novietotas diapazonā no USD 0200 līdz USD BFFF.

Lietotāja montāžas valodas programmas operatīvā atmiņa ir no USD C000 līdz USD CFFF, tikai 4 KB no 64 KB. Tātad, kāpēc mēs lietojam vai apgūstam montāžas valodu? Jaunās un vecās operētājsistēmas ir montāžas valodās. Commodore-64 operētājsistēma ir ROM, no $E000 līdz $FFFF. Tas ir uzrakstīts 65C02 µP (6510 µP) montāžas valodā. Tas sastāv no apakšprogrammām. Lietotāja programmai montāžas valodā ir jāizsauc šīs apakšprogrammas, lai mijiedarbotos ar perifērijas ierīcēm (ievades un izvades ierīcēm). Izpratne par Commodore-64 operētājsistēmu montāžas valodā ļauj studentam saprast operētājsistēmas ātri un daudz mazāk nogurdinošā veidā. Atkal, tajos laikos daudzas Commodore-64 lietotāju programmas tika rakstītas BASIC, nevis montāžas valodā. Asamblejas valodas tajos laikos tehniskiem nolūkiem vairāk izmantoja paši programmētāji.

Kernal, kas rakstīts kā K-e-r-n-a-l, ir Commodore-64 operētājsistēma. Tas tiek piegādāts Commodore-64 datoram ROM, nevis diskā (vai disketē). Kernal sastāv no apakšprogrammām. Lai piekļūtu perifērijas ierīcēm, lietotāja programmai montāžas valodā (mašīnas valodā) ir jāizmanto šīs apakšprogrammas. Kodolu nevajadzētu sajaukt ar kodolu, kas mūsdienu operētājsistēmās tiek rakstīts kā K-e-r-n-e-l, lai gan tie ir gandrīz viens un tas pats.

Atmiņas apgabals no USD C000 (49 15210) līdz USD CFFF (6324810) no 4 KB 10 atmiņas ir RAM vai ROM. Ja tā ir RAM, to izmanto, lai piekļūtu perifērijas ierīcēm. Ja tas ir ROM, to izmanto, lai drukātu rakstzīmes uz ekrāna (monitora). Tas nozīmē, ka vai nu rakstzīmes tiek drukātas uz ekrāna, vai perifērijas ierīcēm tiek piekļūts, izmantojot šo atmiņas daļu. Sistēmas blokā (mātesplatē) ir ROM (rakstzīmju ROM) banka, kas tiek ieslēgta un izslēgta no visas atmiņas vietas, lai to panāktu. Lietotājs var nepamanīt pārslēgšanos.

Atmiņas apgabals no 0100 USD (256 10 ) līdz $ 01FF (511 10 ) ir kaudze. To izmanto gan operētājsistēma, gan lietotāja programmas. Kaudzītes loma tika izskaidrota šī tiešsaistes karjeras kursa iepriekšējā nodaļā. Atmiņas laukums no 0000 USD (0 10 ) līdz $ 00FF (255 10 ) izmanto operētājsistēma. Tur ir piešķirtas daudzas norādes.

Kernal Jump Table
Kernal ir rutīnas, kuras izsauc lietotāja programma. Iznākot jaunām OS versijām, šo rutīnu adreses mainījās. Tas nozīmē, ka lietotāju programmas vairs nevarēja darboties ar jaunajām OS versijām. Tas nenotika, jo Commodore-64 nodrošināja lēciena galdu. Pārlēkšanas tabula ir 39 ierakstu saraksts. Katram tabulas ierakstam ir trīs adreses (izņemot pēdējos 6 baitus), kas nekad nav mainījušās, pat mainoties operētājsistēmas versijai.

Ieraksta pirmajā adresē ir JSR instrukcija. Nākamās divas adreses sastāv no divu baitu rādītāja. Šis divu baitu rādītājs ir faktiskās rutīnas adrese (vai jaunā adrese), kas joprojām atrodas OS ROM. Rādītāja saturs var mainīties līdz ar jaunajām OS versijām, taču trīs adreses katram pārejas tabulas ierakstam nekad nemainās. Piemēram, ņemiet vērā $FF81, $FF82 un $FF83 adreses. Šīs trīs adreses ir paredzētas mātesplates ekrāna un tastatūras ķēžu (reģistru) inicializācijai. $FF81 adresei vienmēr ir JSR operācijas kods (viens baits). Adresēm $FF82 un $FF83 ir vecā vai jaunā apakšprogrammas adrese (joprojām ir OS ROM), lai veiktu inicializāciju. Vienā reizē adresēm $FF82 un $FF83 saturs (adrese) bija $FF5B, kas varēja mainīties līdz ar nākamo OS versiju. Tomēr pārejas tabulas adreses $FF81, $FF82 un $FF83 nekad nemainās.

Katram trīs adrešu ierakstam pirmajai adresei ar JSR ir etiķete (nosaukums). USD FF81 etiķete ir PCINT. PCINT nekad nemainās. Tātad, lai inicializētu ekrāna un tastatūras reģistrus, programmētājs var vienkārši ierakstīt “JSR PCINT”, kas darbojas visās Commodore-64 OS versijās. Faktiskās apakšprogrammas atrašanās vieta (sākuma adrese), piemēram, $FF5B, laika gaitā var mainīties dažādās operētājsistēmās. Jā, lietotāja programmā, kas izmanto ROM OS, ir iesaistītas vismaz divas JSR instrukcijas. Lietotāja programmā ir JSR instrukcija, kas pāriet uz ierakstu lēciena tabulā. Izņemot pēdējās sešas adreses pārejas tabulā, pirmajā ieraksta adresē lēciena tabulā ir JSR instrukcija. Kernalā dažas apakšprogrammas var izsaukt citas apakšprogrammas.

Kernal lēciena tabula sākas no $ FF81 (ieskaitot), kas iet uz augšu pa trim grupām, izņemot pēdējos sešus baitus, kas ir trīs norādes ar zemākām baitu adresēm: $FFFA, $FFFC un $FFFE. Visas ROM OS rutīnas ir atkārtoti lietojami kodi. Tātad lietotājam tie nav jāpārraksta.

Commodore-64 sistēmas vienības blokshēma
Šī diagramma ir detalizētāka nekā iepriekšējā nodaļā:


5.12. att. Sistēmas vienības Commodore_64 blokshēma

ROM un RAM šeit tiek parādīti kā viens bloks. Šeit ir parādīts video interfeisa mikroshēma (IC) ekrānā esošās informācijas apstrādei, kas netika parādīta iepriekšējā nodaļā. Atsevišķs ievades/izvades ierīču bloks, kas ir parādīts iepriekšējā nodaļā, šeit ir parādīts kā divi bloki: CIA #1 un CIA #2. CIA ir saīsinājums no Complex Interface Adapter. Katram no tiem ir divi paralēli astoņu bitu porti (nejaukt ar ārējiem portiem sistēmas vienības vertikālajā virsmā), ko sauc par portu A un portu B. Šādā situācijā CIP ir savienotas ar piecām ārējām ierīcēm. Ierīces ir tastatūra, kursorsvira, diskdzinis/printeris un modems. Printeris ir pievienots diskdziņa aizmugurē. Ir arī skaņas interfeisa ierīces shēma un programmējamā loģiskā masīva shēma, kas nav parādīta.

Tomēr ir rakstzīmju ROM, kuru var apmainīt ar abiem CIA, kad rakstzīme tiek nosūtīta uz ekrānu un tā nav parādīta blokshēmā.

RAM adresēm no $D000 līdz $DFFF ievades/izvades shēmām, ja nav rakstzīmju ROM, ir šāda detalizēta atmiņas karte:

5.11. tabula
Detalizēta atmiņas karte no USD 000 līdz USD DFFF
Apakšadreses diapazons Ķēde Izmērs (baiti)
D000 – D3FF VIC (video interfeisa kontrolleris (mikroshēma)) 1 tūkst
D400 – D7FF SID (skaņas shēma) 1 tūkst
D800 – DBFF Krāsu RAM 1K Nibbles
DC00 – DCFF CIP #1 (tastatūra, kursorsvira) 256
DD00 – DDFF CIA #2 (seriālā kopne, lietotāja ports/RS-232) 256
DE00 – DEF Atveriet I/O slotu Nr. 1 256
DF00 – DFFF Atveriet I/O slotu Nr. 2 256

5.2. Divi kompleksie interfeisa adapteri

Commodore-64 sistēmas vienībā ir divas noteiktas integrētās shēmas (IC), un katru no tām sauc par kompleksās saskarnes adapteri. Šīs divas mikroshēmas tiek izmantotas, lai savienotu tastatūru un citas perifērijas ierīces ar mikroprocesoru. Izņemot VIC un ekrānu, visi ievades/izejas signāli starp mikroprocesoru un perifērijas ierīcēm iet caur šiem diviem IC. Izmantojot Commodore-64, nav tiešas saziņas starp atmiņu un jebkuru perifērijas ierīci. Saziņa starp atmiņu un jebkuru perifērijas ierīci iet caur mikroprocesora akumulatoru, un viens no tiem ir CIA adapteri (IC). IC tiek saukti par CIP #1 un CIA #2. CIA ir saīsinājums no Complex Interface Adapter.

Katrai CIP ir 16 reģistri. Izņemot CIP taimeru/skaitītāju reģistrus, katrs reģistrs ir 8 bitu plats un tam ir atmiņas adrese. CIP #1 atmiņas reģistra adreses ir no $ DC00 (56320 10 ) uz $DC0F (56335 10 ). CIP #2 atmiņas reģistra adreses ir no $ DD00 (56576 10 ) uz $ DD0F (56591 10 ). Lai gan šie reģistri nav IC atmiņā, tie ir daļa no atmiņas. Starpposma atmiņas kartē I/O apgabals no $D000 līdz $DFFF ietver CIP adreses no $DC00 līdz $DC0F un no $DD00 līdz $DD0F. Lielāko daļu RAM I/O atmiņas apgabala no $D000 līdz $DFFF var nomainīt ar rakstzīmju ROM atmiņas banku pret ekrāna rakstzīmēm. Tāpēc, kad rakstzīmes tiek nosūtītas uz ekrānu, perifērijas ierīces nevar darboties; lai gan lietotājs to var nepamanīt, jo maiņa uz priekšu un atpakaļ ir ātra.

CIP #1 ir divi reģistri, ko sauc par portu A un portu B. To adreses ir attiecīgi $ DC00 un $ DC01. CIP #2 ir arī divi reģistri ar nosaukumu Port A un Port B. Protams, to adreses atšķiras; tie ir attiecīgi $ DD00 un $ DD01.

Ports A vai Ports B jebkurā CIP ir paralēlais ports. Tas nozīmē, ka tā var nosūtīt datus uz perifērijas ierīci astoņos bitos vienlaikus vai saņemt datus no mikroprocesora astoņos bitos vienlaikus.

Ar portu A vai B ir saistīts datu virzienu reģistrs (DDR). Datu virzienu reģistrs CIA #1 portam A (DDRA1) atrodas $DC02 atmiņas baita vietā. Datu virzienu reģistrs CIA #1 portam B (DDRB1) atrodas $DC03 atmiņas baita vietā. Datu virzienu reģistrs CIA #2 portam (DDRA2) atrodas atmiņas baita vietā $DD02. Datu virzienu reģistrs CIA #2 portam B (DDRB2) atrodas atmiņas baita vietā $DD03.

Tagad katru bitu portam A vai portam B var iestatīt atbilstošais datu virziena reģistrs kā ievadi vai izvadi. Ievade nozīmē, ka informācija tiek nosūtīta no perifērijas uz mikroprocesoru caur CIP. Izvade nozīmē, ka informācija tiek nosūtīta no mikroprocesora uz perifērijas ierīci caur CIP.

Ja jāievada porta (reģistra) šūna, attiecīgais bits datu virzienu reģistrā ir 0. Ja jāizvada porta (reģistra) šūna, datu virzienu reģistrā atbilstošais bits ir 1. Vairumā gadījumu visi porta 8 biti ir ieprogrammēti kā ievade vai izvade. Kad dators ir ieslēgts, ports A ir ieprogrammēts izvadei un ports B ir ieprogrammēts ievadei. Šis kods padara CIA #1 portu A par izvadi un CIA #1 portu B par ieeju:

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

DDRA1 ir etiķete (mainīgā nosaukums) atmiņas baita vietai $DC02, un DDRB1 ir etiķete (mainīgā nosaukums) atmiņas baita vietai $DC03. Pirmā instrukcija ielādē 11111111 µP akumulatorā. Otrā instrukcija to iekopē CIP ostas A datu virzienu reģistrā Nr. 1. Trešā instrukcija ielādē 00000000 µP akumulatorā. Ceturtā instrukcija to iekopē CIP ostas B datu virzienu reģistrā Nr. 1. Šis kods atrodas vienā no operētājsistēmas apakšprogrammām, kas veic šo inicializāciju datora ieslēgšanas laikā.

Katrai CIP ir pārtraukšanas pakalpojuma pieprasījuma līnija mikroprocesoram. Viens no CIP #1 iet uz IRQ µP tapa. Viens no CIP #2 iet uz NMI µP tapa. Atcerieties, ka NMI ir augstāka prioritāte nekā IRQ .

5.3. Tastatūras montāžas valodas programmēšana

Commodore-64 ir tikai trīs iespējamie pārtraukumi: IRQ , BRK un NMI . Pārlēkšanas tabulas rādītājs IRQ atrodas $FFFE un $FFFF adresēs ROM (operētājsistēmā), kas atbilst apakšprogrammai, kas joprojām atrodas OS (ROM). BRK lēciena tabulas rādītājs atrodas $FFFC un $FFFD adresēs operētājsistēmā, kas atbilst apakšprogrammai, kas joprojām atrodas OS (ROM). Pārlēkšanas tabulas rādītājs NMI atrodas $FFFA un $FFFB adresēs operētājsistēmā, kas atbilst apakšprogrammai, kas joprojām atrodas OS (ROM). Priekš IRQ , patiesībā ir divas apakšprogrammas. Tātad BRK programmatūras pārtraukumam (instrukcijai) ir savs lēciena tabulas rādītājs. Pārlēkšanas tabulas rādītājs IRQ noved pie koda, kas izlemj, vai tas ir aparatūras pārtraukums vai programmatūras pārtraukums. Ja tas ir aparatūras pārtraukums, rutīna IRQ tiek saukts. Ja tas ir programmatūras pārtraukums (BRK), tiek izsaukta BRK rutīna. Vienā no OS versijām apakšprogramma priekš IRQ ir USD EA31, un BRK apakšprogramma ir USD FE66. Šīs adreses ir zemākas par USD FF81, tāpēc tās nav lēciena tabulas ieraksti un tās var mainīties atkarībā no OS versijas. Šajā tēmā ir trīs interesējošas rutīnas: tā, kas pārbauda, ​​vai tas ir nospiests taustiņš vai BRK, tā, kuras cena ir USD 43, un tā, kas var mainīties atkarībā no OS versijas.

Commodore-64 dators pēc izskata ir kā milzīga rakstāmmašīna (uz augšu) bez drukas sadaļas (galvas un papīra). Tastatūra ir savienota ar CIP #1. CIA #1 pēc noklusējuma skenē tastatūru ik pēc 1/60 sekundes bez jebkādiem programmēšanas traucējumiem. Tātad, ik pēc 1/60 sekundes CIP #1 nosūta ziņojumu IRQ uz µP. Ir tikai viens IRQ tapa pie µP, kas nāk tikai no CIP #1. Viena ievades tapa no NMI µP, kas atšķiras no IRQ , nāk tikai no CIP #2 (skatiet tālāk redzamo attēlu). BRK faktiski ir montāžas valodas instrukcija, kas ir kodēta lietotāja programmā.

Tātad, ik pēc 1/60 sekundes, IRQ tiek izsaukta rutīna, uz kuru norāda $FFFE un $FFFF. Rutīna pārbauda, ​​vai ir nospiests taustiņš vai tiek parādīta BRK instrukcija. Ja tiek nospiests taustiņš, tiek izsaukta taustiņa nospiešanas procedūra. Ja tā ir BRK instrukcija, tiek izsaukta BRK apstrādes rutīna. Ja tā nav, nekas nenotiek. Var nenotikt ne viens, ne otrs, bet CIP #1 sūta IRQ līdz µP ik pēc 1/60 sekundēm.

Tastatūras rinda, kas pazīstama arī kā tastatūras buferis, ir RAM baitu atrašanās vietu diapazons no USD 0277 līdz USD 0280, ieskaitot; Kopā 1010 baiti. Šis ir buferis First-IN-First-Out. Tas nozīmē, ka pirmais varonis, kas nāk, ir pirmais, kas aiziet. Rietumeiropas rakstzīme aizņem vienu baitu.

Tātad, kamēr programma nepatērē nevienu rakstzīmi, kad tiek nospiests taustiņš, atslēgas kods nonāk šajā buferī (rindā). Buferis tiek aizpildīts, līdz ir desmit rakstzīmes. Neviena rakstzīme, kas tiek nospiesta pēc desmitās rakstzīmes, netiek ierakstīta. Tas tiek ignorēts, līdz no rindas tiek iegūta (iztērēta) vismaz viena rakstzīme. Pārlēkšanas tabulā ir apakšprogrammas ieraksts, kas mikroprocesoram saņem pirmo rakstzīmi no rindas. Tas nozīmē, ka tas aizņem pirmo rakstzīmi, kas nonāk rindā, un ievieto to µP akumulatorā. Pārlēkšanas tabulas apakšprogramma, lai to izdarītu, tiek saukta par GETIN (for Get-In). Pirmais baits trīs baitu ierakstam lēciena tabulā ir apzīmēts kā GETIN (adrese $FFE4). Nākamie divi baiti ir rādītājs (adrese), kas norāda uz faktisko rutīnu ROM (OS). Programmētājs ir atbildīgs par šīs rutīnas izsaukšanu. Pretējā gadījumā tastatūras buferis paliks pilns un visi nesen nospiestie taustiņi tiks ignorēti. Vērtība, kas tiek ievadīta akumulatorā, ir atbilstošā atslēgas ASCII vērtība.

Kā atslēgu kodi vispār nonāk rindā? Ir pārlēkšanas tabulas rutīna ar nosaukumu SCNKEY (skenēšanas atslēgai). Šo rutīnu var izsaukt gan programmatūra, gan aparatūra. Šajā gadījumā to sauc par elektronikas (fizikas) ķēdi mikroprocesorā, kad elektriskais signāls IRQ ir zems. Šajā tiešsaistes karjeras kursā nav apskatīts, kā tieši tas tiek darīts.

Kods pirmā atslēgas koda iegūšanai no tastatūras bufera akumulatorā A ir tikai viena rindiņa:

IEKĻŪT

Ja tastatūras buferis ir tukšs, akumulatorā tiek ievietoti USD 00. Atcerieties, ka nulles ASCII kods nav 00 USD; tas ir 30 USD. 00 $ nozīmē Null. Programmā var būt brīdis, kad programmai jāgaida taustiņu nospiešana. Kods šim ir:

GAIDIET JSR GETIN
CMP # $00
VARDE GAIDIET

Pirmajā rindā “WAIT” ir etiķete, kas identificē RAM adresi, kurā tiek ievietota (ierakstīta) JSR instrukcija. GETIN ir arī adrese. Tā ir pirmā no atbilstošajiem trim baitiem lēciena tabulā. GETIN ieraksts, kā arī visi ieraksti lēciena tabulā (izņemot pēdējos trīs) sastāv no trim baitiem. Ieraksta pirmais baits ir JSR instrukcija. Nākamie divi baiti ir faktiskās GETIN apakšprogrammas pamatteksta adrese, kas joprojām atrodas ROM (OS), bet zem pārejas tabulas. Tātad, ieraksts saka pāriet uz GETIN apakšprogrammu. Ja tastatūras rinda nav tukša, GETIN ievieto rindas First-In-First-Out ASCII atslēgas kodu akumulatorā. Ja rinda ir tukša, akumulatorā tiek ievietots Null ($ 00).

Otrajā instrukcijā akumulatora vērtība tiek salīdzināta ar 00 USD. Ja tas ir 00 USD, tas nozīmē, ka tastatūras rinda ir tukša, un CMP instrukcija nosūta 1 procesora statusa reģistra Z karogam (to vienkārši sauc par statusa reģistru). Ja vērtība A nav 00 $, CMP instrukcija nosūta 0 statusa reģistra karogam Z.

Trešā instrukcija, kas ir “BEQ WAIT”, nosūta programmu atpakaļ uz pirmo instrukciju, ja statusa reģistra Z karodziņš ir 1. Pirmā, otrā un trešā instrukcija tiek izpildīta atkārtoti, līdz tiek nospiests tastatūras taustiņš. . Ja taustiņš nekad netiek nospiests, cikls atkārtojas bezgalīgi. Šāds koda segments parasti tiek rakstīts ar laika koda segmentu, kas pēc kāda laika aizver cilpu, ja taustiņš nekad netiek nospiests (skatiet šo diskusiju).

Piezīme : tastatūra ir noklusējuma ievades ierīce, un ekrāns ir noklusējuma izvades ierīce.

5.4. kanāls, ierīces numurs un loģiskā faila numurs

Perifērijas ierīces, kas šajā nodaļā tiek izmantotas, lai izskaidrotu Commodore-64 operētājsistēmu, ir tastatūra, ekrāns (monitors), diskdzinis ar disketi, printeris un modems, kas savienojas, izmantojot RS-232C interfeisu. Lai saziņa notiktu starp šīm ierīcēm un sistēmas bloku (mikroprocesoru un atmiņu), ir jāizveido kanāls.

Kanāls sastāv no bufera, ierīces numura, loģiskā faila numura un pēc izvēles sekundārās adreses. Šo terminu skaidrojums ir šāds:

Buferis
No iepriekšējās sadaļas ņemiet vērā, ka, nospiežot taustiņu, tā kodam jāiet uz baitu vietu RAM no desmit secīgām vietām. Šī desmit atrašanās vietu sērija ir tastatūras buferis. Katrai ievades vai izvades ierīcei (perifērai) ir vairākas secīgas vietas RAM, ko sauc par buferi.

Ierīces numurs
Izmantojot Commodore-64, jebkura perifērijas ierīce tiek norādīta ar ierīces numuru. Šajā tabulā ir parādītas dažādas ierīces un to numuri:

5.41. tabula
Commodore 64 ierīču numuri un to ierīces
Numurs Ierīce
0 Tastatūra
1 Lentes diskdzinis
2 RS 232C interfeiss piem. modems
3 Ekrāns
4 Printeris #1
5 Printeris #2
6 Ploteris #1
7 Ploteris #2
8 Diskdzinis
9
¦
¦
¦
30
No 8 (ieskaitot) līdz 22 vairāk atmiņas ierīcēm

Datoram ir divu veidu porti. Viens veids ir ārējs, uz sistēmas vienības vertikālās virsmas. Otrs veids ir iekšējs. Šis iekšējais ports ir reģistrs. Commodore-64 ir četri iekšējie porti: ports A un ports B CIA 1 un ports A un ports B CIA 2. Commodore-64 ir viens ārējais ports, ko sauc par seriālo portu. Ierīces, kuru numurs ir lielāks par 3, ir pievienotas seriālajam portam. Tie ir savienoti margrietiņu ķēdes veidā (viena, kas ir savienota aiz otra), un katru no tiem var identificēt pēc ierīces numura. Ierīces, kuru numurs ir lielāks par 8, parasti ir atmiņas ierīces.

Piezīme : noklusējuma ievades ierīce ir tastatūra ar ierīces numuru 0. Noklusējuma izvades ierīce ir ekrāns ar ierīces numuru 3.

Loģiskais faila numurs
Loģiskais faila numurs ir ierīcei (perifērai) piešķirts numurs tādā secībā, kādā tie tiek atvērti, lai piekļūtu tiem. Tie svārstās no 010 līdz 255 10 .

Sekundārā adrese
Iedomājieties, ka diskā tiek atvērti divi faili (vai vairāk nekā viens fails). Lai atšķirtu šos divus failus, tiek izmantotas sekundārās adreses. Sekundārās adreses ir skaitļi, kas dažādās ierīcēs atšķiras. Nozīme 3 kā printera sekundārā adrese atšķiras no 3 nozīmes kā diskdziņa sekundārā adrese. Nozīme ir atkarīga no funkcijām, piemēram, kad fails tiek atvērts lasīšanai vai kad fails tiek atvērts rakstīšanai. Iespējamie sekundārie skaitļi ir no 0 10 līdz 15 10 katrai ierīcei. Daudzām ierīcēm komandu nosūtīšanai tiek izmantots skaitlis 15.

Piezīme : ierīces numuru sauc arī par ierīces adresi, un sekundāro numuru sauc arī par sekundāro adresi.

Perifērijas mērķa identificēšana
Noklusējuma Commodore atmiņas kartei atmiņas adreses no $0200 līdz $02FF (2. lpp.) izmanto tikai operētājsistēma ROM (Kernal), nevis operētājsistēma plus BASIC valoda. Lai gan BASIC joprojām var izmantot atrašanās vietas, izmantojot ROM OS.

Modems un printeris ir divi dažādi perifērijas mērķi. Ja no diska tiek atvērti divi faili, tie ir divi dažādi mērķi. Izmantojot noklusējuma atmiņas karti, ir trīs secīgas tabulas (saraksti), kuras var redzēt kā vienu lielu tabulu. Šīs trīs tabulas satur attiecības starp loģiskajiem failu numuriem, ierīču numuriem un sekundārajām adresēm. Tādējādi konkrēts kanāls vai ievades/izvades mērķis kļūst identificējams. Trīs tabulas sauc par failu tabulām. RAM adreses un tās ir:

$ 0259 — $ 0262: tabula ar etiķeti, LAT, līdz pat desmit aktīviem loģisko failu numuriem.
0263 $ — 026 C $: tabula ar etiķeti, FAT, līdz pat desmit atbilstošiem ierīču numuriem.
$026D — $0276: tabula ar etiķeti, SAT, no desmit atbilstošām sekundārajām adresēm.

Šeit “-” nozīmē “uz”, un skaitlis aizņem vienu baitu.

Lasītājs var jautāt: 'Kāpēc katras ierīces buferis nav iekļauts kanāla identificēšanā?' Nu, atbilde ir tāda, ka ar commodore-64 katrai ārējai ierīcei (perifērijai) ir noteikta baitu sērija RAM (atmiņas karte). Bez neviena atvērta kanāla viņu pozīcijas joprojām ir atmiņā. Piemēram, tastatūras buferis ir fiksēts no 0277 USD līdz 0280 USD (ieskaitot) noklusējuma atmiņas kartei.

Kernal SETLFS un SETNAM apakšprogrammas
SETLFS un SETNAM ir kodola rutīnas. Kanālu var uzskatīt par loģisku failu. Lai kanālu varētu atvērt, ir jāievada loģiskais faila numurs, ierīces numurs un izvēles sekundārā adrese. Var būt nepieciešams arī neobligāts faila nosaukums (teksts). SETLFS rutīna iestata loģiskā faila numuru, ierīces numuru un papildu sekundāro adresi. Šie skaitļi ir ievietoti attiecīgajās tabulās. SETNAM rutīna iestata faila virknes nosaukumu, kas var būt obligāts vienam kanālam un neobligāts citam kanālam. Tas sastāv no rādītāja (divu baitu adrese) atmiņā. Rādītājs norāda uz virknes (nosaukuma) sākumu, kas var būt citā vietā atmiņā. Virknes nosaukums sākas ar baitu, kuram ir norādīts virknes garums, kam seko teksts (nosaukums). Nosaukums ir ne vairāk kā sešpadsmit baiti (garš).

Lai izsauktu SETLFS rutīnu, lietotāja programmai ir jāpāriet (JSR) uz OS lēciena tabulas $FFBA adresi ROM noklusējuma atmiņas kartei. Atcerieties, ka, izņemot lēciena tabulas pēdējos sešus baitus, katrs ieraksts sastāv no trim baitiem. Pirmais baits ir JSR instrukcija, kas pēc tam pāriet uz apakšprogrammu, sākas ar adresi nākamajos divos baitos. Lai izsauktu SETNAM rutīnu, lietotāja programmai ir jāpāriet (JSR) uz ROM OS pārlēkšanas tabulas $FFBD adresi. Šo divu rutīnu izmantošana ir parādīta nākamajā diskusijā.

5.5 Kanāla atvēršana, loģiskā faila atvēršana, loģiskā faila aizvēršana un visu I/O kanālu aizvēršana

Kanāls sastāv no atmiņas bufera, loģiskā faila numura, ierīces numura (ierīces adreses) un izvēles sekundārās adreses (cipara). Loģisks fails (abstrakcija), kas tiek identificēts ar loģisku faila numuru, var attiekties uz perifērijas ierīci, piemēram, printeri, modemu, diskdzini utt. Katrai no šīm dažādajām ierīcēm ir jābūt atšķirīgiem loģisko failu numuriem. Diskā ir daudz failu. Loģisks fails var attiekties arī uz konkrētu failu diskā. Šim konkrētajam failam ir arī loģisks faila numurs, kas atšķiras no perifērijas ierīču, piemēram, printera vai modema, numura. Loģisko faila numuru piešķir programmētājs. Tas var būt jebkurš skaitlis no 010 ($ 00) līdz 25510 ($ FF).

OS SETLFS rutīna
OS SETLFS rutīna, kurai var piekļūt, pārejot (JSR) uz OS ROM pārejas tabulu vietnē $FFBA, iestata kanālu. Tam faila tabulā jāievieto loģiskais faila numurs, kas ir LAT ($ 0259 — $ 0262). Tam faila tabulā jāievieto atbilstošais ierīces numurs, kas ir FAT ($ 0263 — $ 026C). Ja faila (ierīces) piekļuvei ir nepieciešams sekundārais numurs, faila tabulā ir jāievieto atbilstošā sekundārā adrese (numurs), kas ir SAT ($026D — $0276).

Lai SETLFS apakšprogramma darbotos, no µP akumulatora jāiegūst loģiskais faila numurs; tai ir jāiegūst ierīces numurs no µP X reģistra. Ja kanālam nepieciešams, tam ir jāiegūst sekundārā adrese no µP Y reģistra.

Loģisko faila numuru nosaka programmētājs. Loģiskie failu numuri, kas attiecas uz dažādām ierīcēm, ir atšķirīgi. Tagad, pirms izsaukt SETLFS rutīnu, programmētājam jāievieto loģiskā faila numurs µP akumulatorā. Ierīces numurs tiek nolasīts no tabulas (dokumenta), piemēram, 5.41. tabulā. Programmētājam arī jāievieto ierīces numurs µP X reģistrā. Ierīces, piemēram, printera, diskdziņa utt., piegādātājs nodrošina ierīces iespējamās sekundārās adreses un to nozīmi. Ja kanālam ir nepieciešama sekundārā adrese, programmētājam tā jāiegūst no dokumenta, kas tiek piegādāts kopā ar ierīci (perifēro ierīci). Ja ir nepieciešama sekundārā adrese (numurs), programmētājam tā jāievieto µP Y reģistrā pirms SETLFS apakšprogrammas izsaukšanas. Ja nav nepieciešama sekundārā adrese, programmētājam pirms SETLFS apakšprogrammas izsaukšanas ir jāievieto $FF numurs µP Y reģistrā.

SETLFS apakšprogramma tiek izsaukta bez argumentiem. Tās argumenti jau ir trīs 6502 µP reģistros. Pēc atbilstošo skaitļu ievietošanas reģistros rutīna tiek izsaukta programmā vienkārši ar sekojošo atsevišķā rindā:

JSR SETLFS

Rutīna atbilstoši ievieto dažādus skaitļus to failu tabulās.

OS SETNAM rutīna
OS SETNAM rutīnai var piekļūt, pārejot (JSR) uz OS ROM pārejas tabulu pie $FFBD. Ne visiem adresātiem ir failu nosaukumi. Tiem, kuriem ir adresāti (piemēram, diskā esošie faili), ir jāiestata faila nosaukums. Pieņemsim, ka faila nosaukums ir “mydocum”, kas sastāv no 7 baitiem bez pēdiņām. Pieņemsim, ka šis nosaukums ir no $C101 līdz $C107 (ieskaitot) un garums $07 ir atrašanās vietā $C100. Virknes rakstzīmju sākuma adrese ir $C101. Sākuma adreses apakšējais baits ir $01 un augstākais baits ir $C1.

Pirms SETNAM rutīnas izsaukšanas programmētājam ir jāievieto $07 (virknes garums) numurs µP akumulatorā. Virknes sākuma adreses $01 apakšējais baits tiek ievietots µP X reģistrā. Virknes sākuma adreses $C1 augstākais baits tiek ievietots µP Y reģistrā. Apakšprogramma tiek izsaukta vienkārši ar šādu:

JSR SETNAM

SETNAM rutīna saista vērtības no trim reģistriem ar kanālu. Pēc tam vērtībām nav jāpaliek reģistros. Ja kanālam nav nepieciešams faila nosaukums, programmētājam µP akumulatorā jāievieto 00 $. Šajā gadījumā X un Y reģistros esošās vērtības tiek ignorētas.

OS OPEN rutīna
OS OPEN rutīnai var piekļūt, pārejot (JSR) uz OS ROM pārejas tabulu ar cenu $FFC0. Šī rutīna izmanto loģiskā faila numuru, ierīces numuru (un buferi), iespējamo sekundāro adresi un iespējamo faila nosaukumu, lai nodrošinātu savienojumu starp Commodore datoru un failu ārējā ierīcē vai pašā ārējā ierīcē.

Šī rutīna, tāpat kā visas citas Commodore OS ROM rutīnas, neņem vērā argumentus. Lai gan tas izmanto µP reģistrus, neviens no reģistriem nebija iepriekš jāielādē ar argumentiem (vērtībām). Lai to kodētu, pēc SETLFS un SETNAM izsaukšanas vienkārši ierakstiet:

JSR OPEN

Ar OPEN rutīnu var rasties kļūdas. Piemēram, fails var netikt atrasts lasīšanai. Ja rodas kļūda, rutīna neizdodas un ievieto atbilstošo kļūdas numuru µP akumulatorā un iestata µP statusa reģistra pārnēsāšanas karogu (uz 1). Šajā tabulā ir norādīti kļūdu numuri un to nozīme:

5.51. tabula
Kodola kļūdu numuri un to nozīme OS ROM OPEN rutīnā
Kļūdas numurs Apraksts Piemērs
1 PĀRĀK DAUDZ FAILU ATVĒRT, kad jau ir atvērti desmit faili
2 FAILS ATVĒRTS OPEN 1,3: OPEN 1,4
3 FAILS NAV ATVĒRTS PRINT#5 bez OPEN
4 FAILS NAV ATRASTS LOAD “NONEEXISTENF”,8
5 IERĪCE NAV KLĀT ATVĒRTS 11,11: DRUKĀŠANA Nr. 11
6 NAV IEVADES FAILS ATVĒRT “SEQ,S,W”: GET#8,X$
7 NAV IZvades datne OPEN 1,0: PRINT#1
8 TRŪKST FAILA NOSAUKUMA LOAD '',8
9 NELEGĀLA IERĪCE NR. IElādēt “PROGRAMMU”,3

Šī tabula ir parādīta tā, kā lasītājs, visticamāk, redzēs daudzās citās vietās.

OS CHKIN rutīna
OS CHKIN rutīnai var piekļūt, pārejot (JSR) uz OS ROM pārejas tabulu par USD FFC6. Pēc faila (loģiskā faila) atvēršanas ir jāizlemj, vai atvēršana ir paredzēta ievadei vai izvadei. CHKIN rutīna padara atvēršanu par ievades kanālu. Šai rutīnai ir jānolasa loģiskais faila numurs no µP X reģistra. Tātad, programmētājam pirms šīs rutīnas izsaukšanas X reģistrā jāievieto loģiskais faila numurs. To sauc vienkārši šādi:

JSR ČKIN

OS CHKOUT rutīna
OS CHKOUT rutīnai var piekļūt, pārejot (JSR) uz OS ROM pārejas tabulu par USD FFC9. Pēc faila (loģiskā faila) atvēršanas ir jāizlemj, vai atvēršana ir paredzēta ievadei vai izvadei. CHKOUT rutīna padara atvēršanu par izvades kanālu. Šai rutīnai ir jānolasa loģiskais faila numurs no µP X reģistra. Tātad, programmētājam pirms šīs rutīnas izsaukšanas X reģistrā jāievieto loģiskais faila numurs. To sauc vienkārši šādi:

JSR CHKOUT

OS CLOSE rutīna
OS CLOSE rutīnai var piekļūt, pārejot (JSR) uz OS ROM pārejas tabulu pie $FFC3. Pēc loģiskā faila atvēršanas un baitu pārsūtīšanas loģiskais fails ir jāaizver. Loģiskā faila aizvēršana atbrīvo sistēmas vienībā esošo buferi, ko var izmantot kāds cits loģiskais fails, kas vēl ir jāatver. Tiek dzēsti arī atbilstošie parametri trīs failu tabulās. RAM atrašanās vieta atvērto failu skaitam tiek samazināta par 1.

Kad datoram ir ieslēgta barošana, tiek veikta mikroprocesora un citu galveno mikroshēmu (integrēto shēmu) aparatūras atiestatīšana uz mātesplates. Tam seko dažu RAM atmiņas vietu un dažu reģistru inicializācija dažās mātesplates mikroshēmās. Inicializācijas procesā $0098 adreses baitu atmiņas vieta nulles lapā tiek norādīta ar NFILES vai LDTND etiķeti atkarībā no operētājsistēmas versijas. Kamēr dators darbojas, šajā viena baita 8 bitu atrašanās vietā ir atvērto loģisko failu skaits un trīs secīgo failu tabulu sākuma adreses indekss. Citiem vārdiem sakot, šim baitam ir atvērto failu skaits, kas tiek samazināts par 1, kad loģiskais fails tiek aizvērts. Kad loģiskais fails ir aizvērts, piekļuve termināla (galamērķa) ierīcei vai faktiskajam failam diskā vairs nav iespējama.

Lai aizvērtu loģisko failu, programmētājam ir jāievieto loģiskā faila numurs µP akumulatorā. Šis ir tas pats faila loģiskais numurs, kas tiek izmantots faila atvēršanai. Rutīnai CLOSE tas ir nepieciešams, lai aizvērtu konkrēto failu. Tāpat kā citas OS ROM rutīnas, arī CLOSE rutīnai nav argumentu, lai gan vērtība, kas tiek izmantota no akumulatora, ir zināmā mērā arguments. Montāžas valodas instrukciju rinda ir vienkārša:

JSR Aizvērt

Pielāgotās vai iepriekš definētās 6502 montāžas valodas apakšprogrammas (rutīnas) neņem argumentus. Tomēr argumenti tiek sniegti neoficiāli, mikroprocesoru reģistros ievietojot vērtības, kuras apakšprogramma izmantos.

CLRCHN rutīna
OS CLRCHN rutīnai var piekļūt, pārejot (JSR) uz OS ROM pārejas tabulu vietnē $FFCC. CLRCHN apzīmē CLEaR CHanneL. Kad loģiskais fails tiek aizvērts, tiek dzēsti tā parametri: loģiskā faila numurs, ierīces numurs un iespējamā sekundārā adrese. Tātad loģiskā faila kanāls ir notīrīts.

Rokasgrāmatā teikts, ka OS CLRCHN rutīna notīra visus atvērtos kanālus un atjauno noklusējuma ierīču numurus un citus noklusējuma iestatījumus. Vai tas nozīmē, ka var mainīt perifērijas ierīces numuru? Nu ne gluži. Operētājsistēmas inicializācijas laikā 0099 $ adreses baita atrašanās vieta tiek norādīta ar DFLTI etiķeti, lai saglabātu pašreizējo ievades ierīces numuru, kad dators darbojas. Commodore-64 vienlaikus var piekļūt tikai vienai perifērijas ierīcei. Operētājsistēmas inicializācijas laikā $009A adreses baita atrašanās vieta tiek norādīta ar DFLTO etiķeti, lai saglabātu pašreizējo izvadierīces numuru, kad dators darbojas.

Kad tiek izsaukta CLRCHN apakšprogramma, tā iestata DFLTI mainīgo uz 0 ($ 00), kas ir noklusējuma ievades ierīces numurs (tastatūra). Tas iestata DFLTO mainīgo uz 3 ($ 03), kas ir noklusējuma izvadierīces numurs (ekrāns). Līdzīgi tiek atiestatīti arī citi ierīces numuru mainīgie. Tas nozīmē ievades/izvades ierīču atiestatīšanu (vai atjaunošanu) uz normālu (noklusējuma vērtībām).

Commodore-64 rokasgrāmatā teikts, ka pēc CLRCHN rutīnas izsaukšanas atvērtie loģiskie faili paliek atvērti un joprojām var pārsūtīt baitus (datus). Tas nozīmē, ka CLRCHN rutīna neizdzēš atbilstošos ierakstus failu tabulās. CLRCHN nosaukumam tā nozīme ir diezgan neskaidra.

5.6. Rakstzīmes nosūtīšana uz ekrānu

Galvenā integrētā shēma (IC), kas nodrošina rakstzīmju un grafikas rādīšanu ekrānā, tiek saukta par video interfeisa kontrolieri (mikroshēmu), kas Commodore-64 ir saīsināts kā VIC (faktiski VIC II VIC versijai 2). Lai informācija (vērtības) nonāktu ekrānā, tai pirms ekrāna sasniegšanas ir jāiziet cauri VIC II.

Ekrāns sastāv no 25 rindām un 40 kolonnām ar rakstzīmju šūnām. Tas veido 40 x 25 = 1000 rakstzīmes, kuras var parādīt ekrānā. VIC II nolasa attiecīgi 1000 atmiņas RAM secīgās rakstzīmju baitu vietas. Šīs 1000 atrašanās vietas kopā ir pazīstamas kā ekrāna atmiņa. Šajās 1000 vietās ir rakstzīmju kodi. Commodore-64 rakstzīmju kodi atšķiras no ASCII kodiem.

Rakstzīmju kods nav rakstzīmju paraugs. Ir arī tas, kas pazīstams kā rakstzīmju ROM. Rakstzīmju ROM sastāv no visa veida rakstzīmju rakstiem, no kuriem daži atbilst tastatūras rakstzīmju shēmām. Rakstzīmju ROM atšķiras no ekrāna atmiņas. Kad ekrānā ir jāparāda rakstzīme, rakstzīmes kods tiek nosūtīts uz vietu starp 1000 ekrāna atmiņas pozīcijām. Pēc tam no rakstzīmju ROM, kas jāparāda ekrānā, tiek atlasīts atbilstošais raksts. Pareizā rakstzīmju ROM modeļa izvēli no rakstzīmju koda veic VIC II (aparatūra).

Daudzām atmiņas vietām no $D000 līdz $DFFF ir divi mērķi: tās tiek izmantotas, lai apstrādātu ievades/izvades darbības, kas nav ekrāns, vai tiek izmantotas kā ekrāna rakstzīmju ROM. Attiecas uz diviem atmiņas blokiem. Viens ir RAM, bet otrs ir ROM rakstzīmju ROM. Banku maiņa, lai apstrādātu ievadi/izeju vai rakstzīmju modeļus (rakstzīmju ROM), tiek veikta, izmantojot programmatūru (OS ROM kārtējā rutīna no USD F000 līdz USD FFFF).

Piezīme : VIC ir reģistri, kas ir adresēti ar atmiņas vietas adresēm diapazonā no $D000 un $DFFF.

CHROUT rutīna
OS CHROUT rutīnai var piekļūt, pārejot (JSR) uz OS ROM pārejas tabulu pie $FFD2. Šī rutīna, kad tiek izsaukta, paņem baitu, ko programmētājs ir ievietojis µP akumulatorā, un izdrukā ekrānā, kur atrodas kursors. Koda segments, lai izdrukātu, piemēram, “E” rakstzīmi, ir:

LDA # $05
CHROUT

0516 nav “E” ASCII kods. Commodore-64 ekrānam ir savi rakstzīmju kodi, kur $ 05 nozīmē 'E'. #$05 numurs tiek ievietots ekrāna atmiņā, pirms VIC to nosūta uz ekrānu. Šīm divām kodēšanas rindām vajadzētu būt pēc kanāla iestatīšanas, loģiskā faila atvēršanas un izvadei tiek izsaukta CHKOUT rutīna. Pilns kods ir:

; Iestatīt kanālu
LDA #$40 ; loģiskais faila numurs
LDX #$03 ; ierīces numurs ekrānam ir 03 USD
LDY #$FF ; nav sekundārās adreses
JSR SETLFS ; iestatiet pareizo kanālu
; nav SETNAM, jo ekrānam nav nepieciešams nosaukums
;
; Atveriet loģisko failu
JSR OPEN
; Iestatiet izvades kanālu
LDX # 40 $; loģiskais faila numurs
JSR CHKOUT
;
; Izvadīt char uz ekrānu
LDA # 05 $
JSR CHROUT
; Aizveriet loģisko failu
LDA # 40 $
JSR Aizvērt

Pirms citas programmas palaišanas atvere ir jāaizver. Pieņemsim, ka datora lietotājs ievada tastatūrā rakstzīmi, kad tas ir paredzēts. Šī programma drukā rakstzīmi no tastatūras uz ekrānu:

; Iestatīt kanālu
LDA #$40 ; loģiskais faila numurs
LDX #$03 ; ierīces numurs ekrānam ir 03 USD
LDY #$FF ; nav sekundārās adreses
JSR SETLFS ; iestatiet pareizo kanālu
; nav SETNAM, jo ekrānam nav nepieciešams nosaukums
;
; Atveriet loģisko failu
JSR OPEN
; Iestatiet izvades kanālu
LDX # 40 $; loģiskais faila numurs
JSR CHKOUT
;
; Ievadiet zīmi no tastatūras
GAIDIET JSR GETIN ; ievieto 00 ASV dolārus A, ja tastatūras rinda ir tukša
CMP # $ 00 ; Ja 00 $ tika uz A, tad Z ir 1 ar salīdzinājumu
BEQ GAIDĪT ; GETIN vēlreiz no rindas, ja 0 pārgāja uz akumulatoru
BNE PRNSCRN ; dodieties uz PRNSCRN, ja Z ir 0, jo A vairs nav 00 USD
; Izvadīt char uz ekrānu
PRNSCRN JSR CHROUT ; nosūtiet simbolu A uz ekrānu
; Aizveriet loģisko failu
LDA # 40 $
JSR Aizvērt

Piezīme : WAIT un PRNSCRN ir etiķetes, kas identificē adreses. Tastatūras baits, kas nonāk µP akumulatorā, ir ASCII kods. Atbilstošajam kodam, kas Commodore-64 jānosūta uz ekrānu, ir jābūt citam. Tas nav ņemts vērā iepriekšējā programmā vienkāršības labad.

5.7. Diska diskdziņa baitu sūtīšana un saņemšana

Commodore-64 sistēmas blokā (mātesplatē) ir divi kompleksie interfeisa adapteri, ko sauc par VIA #1 un CIA #2. Katrai CIP ir divi paralēli porti, kurus sauc par portu A un portu B. Commodre-64 sistēmas vienības aizmugurē vertikālajā virsmā ir ārējais ports, ko sauc par seriālo portu. Šim portam ir 6 tapas, no kurām viena ir paredzēta datiem. Dati tiek ievadīti vai iziet no sistēmas bloka virknē, pa vienam bitam.

Piemēram, astoņi paralēlie biti no CIA #2 iekšējā porta A var iziet no sistēmas vienības caur ārējo seriālo portu pēc tam, kad CIP maiņu reģistrs ir konvertējuši tos seriālajos datos. Astoņu bitu seriālie dati no ārējā seriālā porta var nonākt CIA #2 iekšējā portā A pēc tam, kad tie ir pārveidoti paralēlajos datos, izmantojot CIP maiņu reģistru.

Commodore-64 sistēmas bloks (bāzes bloks) izmanto ārējo diskdzini ar disketi. Šim diskdzinim var pievienot printeri ķēdes veidā (savienojot ierīces virknē kā virkni). Diska diskdziņa datu kabelis ir savienots ar Commodore-64 sistēmas vienības ārējo seriālo portu. Tas nozīmē, ka tam pašam seriālajam portam ir pievienots arī printeris, kas savienots ar ķēdi. Šīs divas ierīces identificē ar diviem dažādiem ierīču numuriem (parasti attiecīgi 8 un 4).

Datu nosūtīšanai vai saņemšanai diskdzinī notiek tā pati procedūra, kas aprakstīta iepriekš. Tas ir:

  • Loģiskā faila nosaukuma (numura) iestatīšana, kas ir tāds pats kā faktiskā diska faila nosaukumam, izmantojot SETNAM rutīnu.
  • Loģiskā faila atvēršana, izmantojot OPEN rutīnu.
  • Izlemšana, vai tā ir ievade vai izvade, izmantojot CHKOUT vai CHKIN rutīnu.
  • Datu nosūtīšana vai saņemšana, izmantojot STA un/vai LDA instrukciju.
  • Loģiskā faila aizvēršana, izmantojot CLOSE rutīnu.

Loģiskais fails ir jāaizver. Loģiskā faila aizvēršana efektīvi aizver konkrēto kanālu. Iestatot kanālu diskdziņam, loģiskā faila numuru nosaka programmētājs. Tas ir skaitlis no $ 00 līdz $ FF (ieskaitot). Tas nedrīkst būt numurs, kas jau ir izvēlēts kādai citai ierīcei (vai faktiskajam failam). Ierīces numurs ir 8, ja ir tikai viens diskdzinis. Sekundārā adrese (numurs) tiek iegūta no diskdziņa rokasgrāmatas. Sekojošā programma izmanto 2. Programma ieraksta burtu “E” (ASCII) failā diskā ar nosaukumu “mydoc.doc”. Tiek pieņemts, ka šis nosaukums sākas ar atmiņas adresi $C101. Tātad, pirms tiek izsaukta SETNAM rutīna, zemākajam $01 baitam ir jābūt X reģistrā un augstākajam $C1 baitam jābūt Y reģistrā. Pirms SETNAM rutīnas izsaukšanas A reģistrā jābūt arī $09 numuram.

; Iestatīt kanālu
LDA #$40 ; loģiskais faila numurs
LDX #$08 ; pirmā diskdziņa ierīces numurs
LDY #$02 ; sekundārā adrese
JSR SETLFS ; iestatiet pareizo kanālu
;
; Failam diskdzinī ir nepieciešams nosaukums (jau atmiņā)
LDA # 09 $
LDX #$01
LDY#$C1
JSR SETNAM
; Atveriet loģisko failu
JSR OPEN
; Iestatiet izvades kanālu
LDX # 40 $; loģiskais faila numurs
JSR CHKOUT ;rakstīšanai
;
; Izvadiet char diskā
LDA # 45 $
JSR CHROUT
; Aizveriet loģisko failu
LDA # 40 $
JSR Aizvērt

Lai nolasītu baitu no diska µP Y reģistrā, atkārtojiet iepriekšējo programmu ar šādām izmaiņām: “JSR CHKOUT ; rakstīšanai”, izmantojiet “JSR CHKIN ; lasīšanai”. Aizstāt koda segmentu ar “; Izvadīt char uz disku” ar šādu:

; Ievadiet char no diska
JSR CHRIS

OS CHRIN rutīnai var piekļūt, pārejot (JSR) uz OS ROM pārejas tabulu pie $FFCF. Šī rutīna, kad tā tiek izsaukta, saņem baitu no kanāla, kas jau ir iestatīts kā ievades kanāls, un ievieto to µP A reģistrā. GETIN ROM OS rutīnu var izmantot arī CHRIN vietā.

Baita nosūtīšana uz printeri
Baita nosūtīšana uz printeri tiek veikta līdzīgi kā baita nosūtīšana failam diskā.

5.8 OS SAVE rutīna

OS SAVE rutīnai var piekļūt, pārejot (JSR) uz OS ROM pārejas tabulu par 8 $ FFD. OS SAVE rutīna ROM saglabā (izmet) daļu no atmiņas diskā kā failu (ar nosaukumu). Atmiņā esošās sadaļas sākuma adresei ir jābūt zināmai. Ir jāzina arī sadaļas beigu adrese. Sākuma adreses apakšējais baits tiek ievietots RAM 002 B dolāra adresē 0 lapā. Sākuma adreses augstākais baits tiek ievietots nākamā baita atmiņas vietā $002C adresē. Nulles lappusē TXTTAB etiķete attiecas uz šīm divām adresēm, lai gan TXTTAB faktiski nozīmē 002 B $ adresi. Beigu adreses apakšējais baits tiek ievietots µP X reģistrā. Gala adreses augstākais baits plus 1 tiek ievietots µP Y reģistrā. µP A reģistrā ir TXTTAB vērtība 2 B $ (002 B $). Līdz ar to SAVE rutīnu var izsaukt ar sekojošo:

JSR SAGLABĀT

Saglabājamā atmiņas sadaļa var būt montāžas valodas programma vai dokuments. Dokumenta piemērs var būt vēstule vai eseja. Lai izmantotu saglabāšanas rutīnu, ir jāievēro šāda procedūra:

  • Iestatiet kanālu, izmantojot SETLFS rutīnu.
  • Iestatiet loģiskā faila nosaukumu (numuru), kas ir tāds pats kā faktiskā diska faila nosaukums, izmantojot SETNAM rutīnu.
  • Atveriet loģisko failu, izmantojot OPEN rutīnu.
  • Padariet to par failu izvadei, izmantojot CHKOUT.
  • Šeit atrodas faila saglabāšanas kods, kas beidzas ar “JSR SAVE”.
  • Aizveriet loģisko failu, izmantojot CLOSE rutīnu.

Šī programma saglabā failu, kas sākas no $C101 līdz $C200 atmiņas vietām:

; Iestatīt kanālu
LDA #$40 ; loģiskais faila numurs
LDX #$08 ; pirmā diskdziņa ierīces numurs
LDY #$02 ; sekundārā adrese
JSR SETLFS ; iestatiet pareizo kanālu
;
; Diska diskdzinī esošā faila nosaukums (jau ir atmiņā USD C301)
LDA #$09 ; faila nosaukuma garums
LDX #$01
LDY #$C3
JSR SETNAM
; Atveriet loģisko failu
JSR OPEN
; Iestatiet izvades kanālu
LDX # 40 $; loģiskais faila numurs
JSR CHKOUT ; rakstīšanai
;
; Izvadīt failu diskā
LDA #$01
STA $ 2B ; TXTTAB
LDA #$C1
STA $ 2C
LDX # $00
LDY #$C2
LDA #$2B
JSR SAGLABĀT
; Aizveriet loģisko failu
LDA # 40 $
JSR Aizvērt

Ņemiet vērā, ka šī ir programma, kas saglabā citu atmiņas sadaļu (nevis programmas sadaļu) diskā (disketē Commodore-64).

5.9. OS LOAD rutīna

OS LOAD rutīnai var piekļūt, pārejot (JSR) uz OS ROM lēciena tabulu par FFD5. Kad diskā tiek saglabāta atmiņas sadaļa (liels laukums), tā tiek saglabāta ar galveni, kurā ir sadaļas sākuma adrese atmiņā. OS LOAD apakšprogramma ielādē faila baitus atmiņā. Izmantojot šo LOAD darbību, akumulatora vērtībai ir jābūt 010 ($ 00). Lai operācija LOAD nolasītu sākuma adresi diska faila galvenē un ievietotu faila baitus RAM, sākot no šīs adreses, kanāla sekundārajai adresei ir jābūt 1 vai 2 (turpmāk programma izmanto 2). Šī rutīna atgriež adresi plus 1 no augstākās ielādētās RAM vietas. Tas nozīmē, ka faila pēdējās adreses zemais baits RAM plus 1 tiek ievietots µP X reģistrā, bet faila pēdējās adreses augstākais baits RAM plus 1 tiek ievietots µP Y reģistrā.

Ja ielāde ir neveiksmīga, µP A reģistrā ir kļūdas numurs (iespējams, 4, 5, 8 vai 9). Ir iestatīts arī mikroprocesora statusa reģistra C karodziņš (izgatavots 1). Ja ielāde ir veiksmīga, A reģistra pēdējā vērtība nav svarīga.

Tagad šī tiešsaistes karjeras kursa iepriekšējā nodaļā pirmā montāžas valodas programmas instrukcija ir RAM adresē, kurā programma tika sākta. Tam tā nav jābūt. Tas nozīmē, ka pirmajai programmas instrukcijai nav jābūt programmas sākumā RAM. Programmas sākuma instrukcija var atrasties jebkurā RAM failā. Programmētājam ieteicams marķēt montāžas valodas instrukciju ar START. Tādējādi pēc programmas ielādes tā tiek atkārtoti palaists (izpildīts) ar šādu montāžas valodas instrukciju:

JSR START

“JSR START” ir montāžas valodas programmā, kas ielādē izpildāmo programmu. Montāžas valodai, kas ielādē citu montāžas valodas failu un palaiž ielādēto failu, ir šāda koda procedūra:

  • Iestatiet kanālu, izmantojot SETLFS rutīnu.
  • Iestatiet loģiskā faila nosaukumu (numuru), kas ir tāds pats kā faktiskā diska faila nosaukums, izmantojot SETNAM rutīnu.
  • Atveriet loģisko failu, izmantojot OPEN rutīnu.
  • Padariet to par failu ievadei, izmantojot CHKIN.
  • Faila ielādes kods atrodas šeit un beidzas ar “JSR LOAD”.
  • Aizveriet loģisko failu, izmantojot CLOSE rutīnu.

Šī programma ielādē failu no diska un palaiž to:

; Iestatīt kanālu
LDA #$40 ; loģiskais faila numurs
LDX #$08 ; pirmā diskdziņa ierīces numurs
LDY #$02 ; sekundārā adrese
JSR SETLFS ; iestatiet pareizo kanālu
;
; Diska diskdzinī esošā faila nosaukums (jau ir atmiņā USD C301)
LDA #$09 ; faila nosaukuma garums
LDX #$01
LDY #$C3
JSR SETNAM
; Atveriet loģisko failu
JSR OPEN
; Iestatiet ievades kanālu
LDX # 40 $; loģiskais faila numurs
JSR CHKIN ; lasīšanai
;
; Ievadiet failu no diska
LDA # 00 $
JSR LOAD
; Aizveriet loģisko failu
LDA # 40 $
JSR Aizvērt
; Sāciet ielādēto programmu
JSR START

5.10. Modems un RS-232 standarts

Modems ir ierīce (perifēra), kas pārveido bitus no datora atbilstošos elektriskos audio signālos, kas tiek pārraidīti pa tālruņa līniju. Uztvērēja galā pirms uztverošā datora atrodas modems. Šis otrais modems pārvērš elektriskos audio signālus uztverošā datora bitos.

Modemam jābūt savienotam ar datoru ārējā portā (datora vertikālajā virsmā). RS-232 standarts attiecas uz noteikta veida savienotāju, kas savieno modemu ar datoru (agrāk). Citiem vārdiem sakot, daudziem datoriem agrāk bija ārējais ports, kas bija RS-232 savienotājs vai ar RS-232 saderīgs savienotājs.

Commodore-64 sistēmas blokam (datoram) aizmugurējā vertikālajā virsmā ir ārējs ports, ko sauc par lietotāja portu. Šis lietotāja ports ir saderīgs ar RS-232. Tur var pieslēgt modema ierīci. Commodore-64 sazinās ar modemu, izmantojot šo lietotāja portu. Commodore-64 ROM operētājsistēmai ir apakšprogrammas, lai sazinātos ar modemu, ko sauc par RS-232 rutīnām. Šīm rutīnām ir ieraksti lēcienu tabulā.

Pārraides ātrumu
Astoņu bitu baits no datora tiek pārveidots astoņu bitu sērijā, pirms tiek nosūtīts uz modemu. Apgrieztā darbība tiek veikta no modema uz datoru. Pārraides ātrums ir bitu skaits, kas tiek pārraidīti sekundē, sērijveidā.

Atmiņas apakšdaļa
Termins “atmiņas apakšdaļa” neattiecas uz 0000 $ adreses atmiņas baitu atrašanās vietu. Tas attiecas uz zemāko RAM vietu, kur lietotājs var sākt ievietot savus datus un programmas. Pēc noklusējuma tas ir 0800 USD. Atgādiniet no iepriekšējās diskusijas, ka daudzas atrašanās vietas no $ 0800 līdz $ BFFF izmanto BASIC datorvaloda un tās programmētāji (lietotāji). Tikai no $C000 līdz $CFFF adrešu atrašanās vietas ir atstātas lietošanai montāžas valodas programmām un datiem; tas ir 4 Kbaiti no 64 KB atmiņas.

Atmiņas augšdaļa
Tajos laikos, kad klienti iegādājās Commodore-64 datorus, dažiem līdzi nebija visas atmiņas vietas. Šādiem datoriem bija ROM ar operētājsistēmu no $E000 līdz $FFFF. Viņiem bija RAM no 0000 USD līdz limitam, kas nav USD DFFF, blakus USD E000. Ierobežojums bija mazāks par DFFF $, un šo ierobežojumu sauc par “atmiņas augšējo daļu”. Tātad atmiņas augšdaļa neattiecas uz $FFFF atrašanās vietu.

Commodore-64 buferi RS-232 komunikācijai
Pārraides buferis
Buferis RS-232 pārraidei (izejai) aizņem 256 baitus no atmiņas augšdaļas uz leju. Šī pārraides bufera rādītājs ir apzīmēts kā ROBUF. Šis rādītājs atrodas nulles lapā ar $00F9 adresēm, kam seko $00FA. ROBUF faktiski identificē $00F9. Tātad, ja bufera sākuma adrese ir $BE00, zemākais $BE00 baits, kas ir $00, atrodas $00F9 vietā un augstākais $BE00 baits, kas ir $BE, atrodas $00FA. atrašanās vieta.

Saņemšanas buferis
Buferis RS-232 baitu (ievades) saņemšanai aizņem 256 baitus no pārraides bufera apakšas. Šī saņemšanas bufera rādītājs ir apzīmēts kā RIBUF. Šis rādītājs atrodas nulles lapā ar $00F7 adresēm, kam seko $00F8. RIBUF faktiski identificē $00F7. Tātad, ja bufera sākuma adrese ir $BF00, zemākais $BF00 baits, kas ir $00, atrodas $00F7 vietā un augstākais $BF00 baits, kas ir $BF, atrodas $00F8. atrašanās vieta. Tātad 512 baiti no augšējās atmiņas tiek izmantoti kā kopējais RS-232 RAM buferis.

RS-232 kanāls
Kad modems ir pievienots (ārējam) lietotāja portam, saziņa ar modemu ir tikai RS-232 komunikācija. Pilnīga RS-232 kanāla izveides procedūra ir gandrīz tāda pati kā iepriekšējā diskusijā, taču ar vienu būtisku atšķirību: faila nosaukums ir kods, nevis virkne atmiņā. Kods $0610 ir laba izvēle. Tas nozīmē bodu ātrumu 300 biti/s un dažus citus tehniskos parametrus. Tāpat nav sekundārās adreses. Ņemiet vērā, ka ierīces numurs ir 2. Pilna RS-232 kanāla iestatīšanas procedūra ir šāda:

  • Kanāla iestatīšana, izmantojot SETLFS rutīnu.
  • Loģiskā faila nosaukuma iestatīšana, $0610.
  • Loģiskā faila atvēršana, izmantojot OPEN rutīnu.
  • Padarot to par failu izvadei, izmantojot CHKOUT, vai failu ievadei, izmantojot CHKIN.
  • Atsevišķu baitu nosūtīšana ar CHROUT vai atsevišķu baitu saņemšana ar GETIN.
  • Loģiskā faila aizvēršana, izmantojot CLOSE rutīnu.

OS GETIN rutīnai var piekļūt, pārejot (JSR) uz OS ROM pārejas tabulu pie $FFE4. Šī rutīna, kad tiek izsaukta, paņem baitu, kas tiek nosūtīts uztvērēja buferī, un ievieto (atgriež) to µP akumulatorā.

Sekojošā programma nosūta baitu “E” (ASCII) modemam, kas ir pievienots lietotāja RS-232 saderīgajam portam:

; Iestatīt kanālu
LDA #$40 ; loģiskais faila numurs
LDX #$02 ; ierīces numurs RS-232
LDY #$FF ; nav sekundārās adreses
JSR SETLFS ; iestatiet pareizo kanālu
;
; RS-232 nosaukums ir kods, piemēram, 0610 ASV dolāri
LDA #$02 ; koda garums ir 2 baiti
LDX # 10 $
LDY#06 $
JSR SETNAM
;
; Atveriet loģisko failu
JSR OPEN
; Iestatiet izvades kanālu
LDX # 40 $; loģiskais faila numurs
JSR CHKOUT
;
; Izvades char uz RS-232 piem. modems
LDA # 45 $
JSR CHROUT
; Aizveriet loģisko failu
LDA # 40 $
JSR Aizvērt

Lai saņemtu baitu, kods ir ļoti līdzīgs, izņemot to, ka “JSR CHKOUT” tiek aizstāts ar “JSR CHKIN” un:

LDA # 45 $
JSR CHROUT

tiek aizstāts ar “JSR GETIN”, rezultāts tiek ievietots A reģistrā.

Nepārtraukta baitu sūtīšana vai saņemšana tiek veikta, izmantojot cilpu attiecīgi koda segmenta nosūtīšanai vai saņemšanai.

Ņemiet vērā, ka Commodore ievade un izvade lielākajā daļā gadījumu ir līdzīga, izņemot tastatūru, kur dažas rutīnas neizsauc programmētājs, bet tās izsauc operētājsistēma.

5.11. Skaitīšana un laika noteikšana

Apsveriet skaitīšanas secību, kas ir:

2, 1, 0

Tā ir skaitīšana no 2 līdz 0. Tagad apsveriet atkārtotu skaitīšanas secību:

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

Šī ir vienas un tās pašas secības atkārtota atpakaļskaitīšana. Secība tiek atkārtota četras reizes. Četras reizes nozīmē, ka laiks ir 4. Vienā secībā notiek skaitīšana. Tās pašas secības atkārtošana ir laiks.

Commodore-64 sistēmas blokā ir divi kompleksās saskarnes adapteri. Katrai CIP ir divas skaitītāja/taimera shēmas ar nosaukumu Taimeris A (TA) un taimeris B (TB). Skaitīšanas ķēde neatšķiras no laika ķēdes. Skaitītājs vai taimeris Commodore-64 attiecas uz to pašu. Faktiski jebkurš no tiem būtībā attiecas uz vienu 16 bitu reģistru, kas sistēmas pulksteņa impulsos vienmēr tiek skaitīts līdz 0. 16 bitu reģistrā var iestatīt dažādas vērtības. Jo lielāka vērtība, jo ilgāks laiks nepieciešams, lai skaitītu līdz nullei. Katru reizi, kad viens no taimeriem pāriet pāri nullei, IRQ pārtraukuma signāls tiek nosūtīts uz mikroprocesoru. Kad skaitīšana samazinās pāri nullei, to sauc par nepietiekamu plūsmu.

Atkarībā no taimera shēmas ieprogrammēšanas taimeris var darboties vienreizējā režīmā vai nepārtrauktā režīmā. Iepriekšējā attēlā vienreizējais režīms nozīmē “darīt 2, 1, 0” un apturēt, kamēr pulksteņa impulsi turpinās. Nepārtrauktais režīms ir kā '2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0 utt.' kas turpinās ar pulksteņa impulsiem. Tas nozīmē, ka tad, kad tas pārsniedz nulli, ja netiek dota neviena instrukcija, atpakaļskaitīšanas secība atkārtojas. Lielākais skaitlis parasti ir daudz lielāks par 2.

CIA #1 taimeris A (TA) ģenerē IRQ regulāri (laikā), lai apkoptu tastatūru. Faktiski pēc noklusējuma tas ir ik pēc 1/60 sekundes. IRQ tiek nosūtīts uz mikroprocesoru ik pēc 1/60 sekundes. Tas ir tikai tad, kad IRQ tiek nosūtīts, ka programma var nolasīt atslēgas vērtību no tastatūras rindas (bufera). Atcerieties, ka mikroprocesoram ir tikai viena tapa IRQ signāls. Mikroprocesoram ir arī tikai viena tapa NMI signāls. ¯NMI signāls uz mikroprocesoru vienmēr nāk no CIP #2.

16 bitu taimera reģistrā ir divas atmiņas adreses: viena zemākajam baitam un viena augstākajam baitam. Katrai CIP ir divas taimera shēmas. Abas CIP ir identiskas. CIA #1 divu taimeru adreses ir: DC04 un DC05 TA un DC06 un DC07 TB. CIA #2 divu taimeru adreses ir: DD04 un DD05 TA un DD06 un DD07 TB.

Pieņemsim, ka skaitlis 25510 ir jānosūta uz CIP #2 TA taimeri atpakaļskaitīšanai. 25510 = 00000000111111112 ir sešpadsmit bitos. 00000000111111112 = 000 FFF $ ir heksadecimālā. Šajā gadījumā $FF tiek nosūtīts uz reģistru pēc adreses $DD04, un $00 tiek nosūtīts uz reģistru pēc adreses $DD05 - maz endianness. Šis koda segments nosūta numuru uz reģistru:

LDA #$FF
VALSTS DD04 $
LDA # 00 $
VALSTS $ DD05

Lai gan CIP reģistriem ir RAM adreses, tie fiziski atrodas CIP, un CIP ir atsevišķa IC no RAM vai ROM.

Tas vēl nav viss! Kad taimeram ir piešķirts atpakaļskaitīšanas skaitlis, piemēram, ar iepriekšējo kodu, atpakaļskaitīšana nesākas. Atpakaļskaitīšana sākas, kad astoņu bitu baits ir nosūtīts attiecīgajā taimera vadības reģistrā. Pirmais šī baita bits vadības reģistram norāda, vai jāsāk atpakaļskaitīšana. Vērtība 0 šim pirmajam bitam nozīmē pārtraukt atpakaļskaitīšanu, bet vērtība 1 nozīmē sākt atpakaļskaitīšanu. Tāpat baitam ir jānorāda, vai atpakaļskaitīšana notiek viena šāviena (vienreizēja) režīmā vai brīvas darbības režīmā (nepārtrauktā režīmā). Viena kadra režīms skaita atpakaļ un apstājas, kad taimera reģistra vērtība kļūst nulle. Brīvās darbības režīmā skaitīšana atkārtojas pēc 0 sasniegšanas. Ceturtais (indekss 3) baita bits, kas tiek nosūtīts uz vadības reģistru, norāda režīmu: 0 nozīmē brīvas darbības režīmu un 1 nozīmē viena kadra režīmu.

Piemērots skaitlis, lai sāktu skaitīšanu viena šāviena režīmā, ir 000010012 = 09 $ heksadecimālā. Piemērots skaitlis, lai sāktu skaitīšanu brīvas darbības režīmā, ir 000000012 = 01 $ heksadecimālā. Katram taimera reģistram ir savs kontroles reģistrs. CIP #1, taimera A vadības reģistra RAM adrese ir DC0E16, bet taimera B vadības reģistra RAM adrese ir DC0F16. CIP #2 taimera A vadības reģistra RAM adrese ir DD0E16, bet taimera B vadības reģistra RAM adrese ir DD0F16. Lai sāktu skaitīt sešpadsmit bitu skaitli CIP #2 TA vienreizējā režīmā, izmantojiet šādu kodu:

LDA # 09 $
STA $DD0E

Lai sāktu skaitīt sešpadsmit bitu skaitli CIA #2 TA brīvas darbības režīmā, izmantojiet šādu kodu:

LDA #$01
STA $DD0E

5.12 IRQ un NMI Pieprasījumi

6502 mikroprocesoram ir IRQ un NMI līnijas (tapas). Gan CIP #1, gan CIP #2 katram ir IRQ tapa mikroprocesoram. The IRQ CIP #2 tapa ir savienota ar NMI µP tapa. The IRQ CIP #1 tapa ir savienota ar IRQ µP tapa. Tās ir vienīgās divas pārtraukumu līnijas, kas savieno mikroprocesoru. Tātad, IRQ CIP #2 tapa ir NMI avots, un to var uzskatīt arī par ¯NMI līniju.

CIP #1 ir pieci iespējamie tūlītējie avoti, lai radītu IRQ signāls µP. CIP #2 struktūra ir tāda pati kā CIP #1. Tātad CIP #2 ir tie paši pieci iespējamie tūlītējie avoti, kas šoreiz rada pārtraukuma signālu, kas ir NMI signāls. Atcerieties, ka tad, kad µP saņem NMI signālu, ja tas apstrādā IRQ pieprasījumu, tas aptur to un apstrādā NMI pieprasījumu. Kad tas ir pabeidzis rīkoties ar NMI pieprasījumu, tas atsāk apstrādāt IRQ pieprasījumu.

CIA #1 parasti ir ārēji savienots ar tastatūru un spēļu ierīci, piemēram, kursorsviru. Tastatūra izmanto vairāk CIA #1 porta A nekā porta B. Spēles ierīce izmanto vairāk CIA #1 porta B nekā tās ports A. CIA #2 parasti ir ārēji savienots ar diskdzini (pieslēgts pie printera). un modems. Diska diskdzinis izmanto vairāk CIA #2 porta A (lai gan caur ārējo seriālo portu) nekā tā portu B. Modems (RS-232) izmanto vairāk CIA #2 porta B nekā tā ports A.

Ar visu to, kā sistēmas vienība zina, kas izraisa IRQ vai NMI pārtraukt? CIP #1 un CIP #2 ir pieci tūlītēji pārtraukumu avoti. Ja pārtraukuma signāls uz µP ir NMI , avots ir viens no pieciem tuvākajiem avotiem no CIP #2. Ja pārtraukuma signāls uz µP ir IRQ , avots ir viens no pieciem tuvākajiem avotiem no CIP #1.

Nākamais jautājums ir: 'Kā sistēmas vienība atšķir piecus katras CIP tūlītējos avotus?' Katrai CIP ir astoņu bitu reģistrs, ko sauc par pārtraukumu kontroles reģistru (ICR). ICR apkalpo abas CIP ostas. Nākamajā tabulā parādītas pārtraukuma vadības reģistra astoņu bitu nozīmes, sākot no bita 0:

5.13. tabula
Pārtraukumu kontroles reģistrs
Bitu indekss Nozīme
0 Iestatīts (izgatavots 1) ar taimera A nepietiekamu plūsmu
1 Iestatīts ar taimera B nepietiekamību
2 Iestatiet, kad dienas laika pulkstenis ir vienāds ar modinātāju
3 Iestatīt, kad seriālais ports ir pilns
4 Iestatīta ārējā ierīce
5 Nav lietots (izgatavots 0)
6 Nav lietots (izgatavots 0)
7 Iestatīt, kad ir iestatīts kāds no pirmajiem pieciem bitiem

Kā redzams tabulā, katrs no tiešajiem avotiem ir attēlots ar vienu no pirmajiem pieciem bitiem. Tātad, kad pārtraukuma signāls tiek saņemts pie µP, kods ir jāizpilda, lai nolasītu pārtraukuma vadības reģistra saturu, lai uzzinātu precīzu pārtraukuma avotu. CIP #1 ICR RAM adrese ir DC0D16. CIP #2 ICR RAM adrese ir DD0D16. Lai nolasītu (atgrieztu) CIA #1 ICR saturu µP akumulatorā, ierakstiet šādu instrukciju:

LDA$DC0D

Lai nolasītu (atgrieztu) CIA #2 ICR saturu µP akumulatorā, ierakstiet šādu instrukciju:

LDA $ DD0D

5.13. Pārtraukšanas vadīta fona programma

Tastatūra parasti pārtrauc mikroprocesora darbību ik pēc 1/60 sekundes. Iedomājieties, ka programma darbojas un sasniedz pozīciju, lai gaidītu taustiņu no tastatūras, pirms tā var turpināt ar tālāk norādītajiem koda segmentiem. Pieņemsim, ka, ja no tastatūras netiek nospiests neviens taustiņš, programma veic tikai nelielu cilpu, gaidot taustiņu. Iedomājieties, ka programma darbojas un tikko gaidīja taustiņu no tastatūras tūlīt pēc tastatūras pārtraukuma. Tajā brīdī viss dators netieši apstājas un nedara neko citu kā tikai gaidīšanas cilpu. Iedomājieties, ka tastatūras taustiņš tiek nospiests tieši pirms nākamā tastatūras pārtraukuma nākamā numura. Tas nozīmē, ka dators neko nav darījis apmēram vienu sekundes sešdesmito daļu! Tas ir ilgs laiks, lai dators neko nedarītu, pat Commodore-64 laikā. Dators tajā laikā (ilgums) varēja darīt kaut ko citu. Programmā ir daudz šādu ilgumu.

Otru programmu var uzrakstīt, lai tā darbotos ar šādu “dīkstāves” ilgumu. Tiek uzskatīts, ka šāda programma darbojas galvenās (vai pirmās) programmas fonā. Vienkāršs veids, kā to izdarīt, ir tikai piespiest modificētu BRK pārtraukumu apstrādi, kad tiek gaidīts taustiņš no tastatūras.

Rādītājs BRK instrukcijai
$0316 un $0317 adrešu RAM secīgajās vietās ir rādītājs (vektors) faktiskajai BRK instrukciju rutīnai. Noklusējuma rādītājs tiek ievietots tur, kad datoru ieslēdz ROM operētājsistēma. Šis noklusējuma rādītājs ir adrese, kas joprojām norāda uz noklusējuma BRK instrukciju apstrādātāju OS ROM. Rādītājs ir 16 bitu adrese. Rādītāja apakšējais baits tiek novietots $0306 adreses baita vietā, bet augstākais rādītāja baits tiek novietots $0317 baitu vietā.

Otru programmu var uzrakstīt tā, ka, sistēmai esot “dīkstāvē”, sistēma izpilda dažus otrās programmas kodus. Tas nozīmē, ka otrā programma ir jāveido no apakšprogrammām. Kad sistēma ir “dīkstāvē”, gaidot taustiņu no tastatūras, tiek izpildīta nākamā otrās programmas apakšprogramma. Cilvēka mijiedarbība ar datoru ir lēna, salīdzinot ar sistēmas vienības darbību.

Šo problēmu ir viegli atrisināt: katru reizi, kad datoram ir jāgaida tastatūras taustiņš, kodā ievietojiet BRK instrukciju un nomainiet rādītāju pie $0316 (un $0317) ar otrās apakšprogrammas nākamās apakšprogrammas rādītāju ( pielāgota) programma. Tādā veidā abas programmas darbotos tādā laikā, kas nav daudz ilgāks par galveno programmu, kas darbojas atsevišķi.

5.14. Salikšana un apkopošana

Montētājs visas etiķetes aizstāj ar adresēm. Asamblejas valodas programma parasti tiek rakstīta, lai sāktu ar noteiktu adresi. Rezultāts no montētāja (pēc montāžas) tiek saukts par “objekta kodu”, kurā viss ir binārs. Šis rezultāts ir izpildāmais fails, ja fails ir programma, nevis dokuments. Dokuments nav izpildāms.

Lietojumprogramma sastāv no vairāk nekā vienas (montāžas valodas) programmām. Parasti ir galvenā programma. Situāciju šeit nevajadzētu jaukt ar situāciju saistībā ar pārtraukšanas vadītajām fona programmām. Visas šeit esošās programmas ir priekšplāna programmas, taču ir arī pirmā vai galvenā programma.

Kompilators ir nepieciešams montētāja vietā, ja ir vairāk nekā viena priekšplāna programmas. Kompilators katru programmu apkopo objekta kodā. Tomēr radīsies problēma: daži koda segmenti pārklājas, jo programmas, iespējams, ir rakstījuši dažādi cilvēki. Kompilatora risinājums ir pārvietot visas programmas, kas pārklājas, izņemot pirmo, atmiņas vietā, lai programmas nepārklātos. Tagad, kad runa ir par mainīgo lielumu saglabāšanu, dažas mainīgo adreses joprojām pārklājas. Risinājums šeit ir aizstāt adreses, kas pārklājas ar jaunajām adresēm (izņemot pirmo programmu), lai tās vairs nepārklātos. Tādā veidā dažādas programmas iederēsies dažādās atmiņas daļās (apgabalos).

Ar visu to ir iespējams, ka viena rutīna vienā programmā var izsaukt rutīnu citā programmā. Tātad, kompilators veic saiti. Saistīšana attiecas uz apakšprogrammas sākuma adresi vienā programmā un pēc tam tās izsaukšanu citā programmā; abi ir daļa no pieteikuma. Abām programmām šim nolūkam ir jāizmanto viena un tā pati adrese. Gala rezultāts ir viens liels objekta kods ar visu bināro (bitu).

5.15. Programmas saglabāšana, ielāde un palaišana

Asamblejas valoda parasti tiek rakstīta kādā redaktora programmā (kas var būt nodrošināta kopā ar montāžas programmu). Redaktora programma norāda, kur programma sākas un beidzas atmiņā (RAM). Commodore-64 OS ROM Kernal SAVE rutīna var saglabāt programmu atmiņā diskā. Tas vienkārši izgāž atmiņas sadaļu (bloku), kurā var būt tā instrukciju izsaukums uz disku. Vēlams, lai izsaukšanas instrukcija SAVE būtu atdalīta no programmas, kas tiek saglabāta, lai tad, kad programma tiek ielādēta atmiņā no diska, tā pati sevi vairs nesaglabātos, kad to palaiž. Asamblejas valodas programmas ielāde no diska ir cita veida izaicinājums, jo programma nevar ielādēt pati sevi.

Programma nevar ielādēt sevi no diska vietā, kur tā sākas un beidzas RAM. Commodore-64 tajos laikos parasti tika piegādāts ar BASIC tulku, lai palaistu BASIC valodas programmas. Kad iekārta (dators) ir ieslēgta, tas tiek izpildīts ar komandu uzvedni: READY. No turienes BASIC komandas vai instrukcijas var ierakstīt, pēc ievadīšanas nospiežot taustiņu “Enter”. BASIC komanda (instrukcija), lai ielādētu failu, ir:

LOAD “faila nosaukums”,8,1

Komanda sākas ar BASIC rezervēto vārdu, kas ir LOAD. Tam seko atstarpe un pēc tam faila nosaukums dubultpēdiņās. Aiz ierīces numura 8, kura priekšā ir komats. Pēc diska sekundārās adreses, kas ir 1, seko komats. Izmantojot šādu failu, montāžas valodas programmas sākuma adrese ir diskā esošā faila galvenē. Kad BASIC pabeidz programmas ielādi, tiek atgriezta pēdējā programmas RAM adrese plus 1. Vārds “atgriezts” šeit nozīmē, ka pēdējās adreses zemākais baits plus 1 tiek ievietots µP X reģistrā, bet pēdējās adreses augstākais baits plus 1 tiek ievietots µP Y reģistrā.

Pēc programmas ielādes tā ir jāpalaiž (jāizpilda). Programmas lietotājam atmiņā ir jāzina izpildes sākuma adrese. Šeit atkal ir nepieciešama cita BASIC programma. Tā ir SYS komanda. Pēc SYS komandas izpildes montāžas valodas programma darbosies (un apstāsies). Ja darbības laikā ir nepieciešama ievade no tastatūras, montāžas valodas programmai tas jānorāda lietotājam. Pēc tam, kad lietotājs ir ievadījis datus uz tastatūras un nospiedis taustiņu “Enter”, montāžas valodas programma turpinās darboties, izmantojot tastatūras ievadi bez BASIC tulka iejaukšanās.

Pieņemot, ka Assembly Language programmas izpildes (darbošanās) RAM adreses sākums ir C12316, C123 tiek pārveidots par bāzes desmit, pirms to izmanto ar komandu SYS. C12316 pārveidošana par bāzi desmit ir šāda:

Tātad, BASIC SYS komanda ir:

SYS 49443

5.16 Commodore-64 sāknēšana

Commodore-64 sāknēšana sastāv no divām fāzēm: aparatūras atiestatīšanas fāzes un operētājsistēmas inicializācijas fāzes. Operētājsistēma ir kodols ROM (nevis diskā). Ir atiestatīšanas līnija (faktiski RES ), kas savienojas ar tapu pie 6502 µP un ar to pašu tapas nosaukumu visos īpašajos kuģos, piemēram, CIA 1, CIA 2 un VIC II. Atiestatīšanas fāzē, pateicoties šai līnijai, visi µP un speciālo mikroshēmu reģistri tiek atiestatīti uz 0 (katram bitam ir nulle). Pēc tam mikroprocesora aparatūra nodrošina steka rādītāju un procesora statusa reģistru ar to sākotnējām vērtībām mikroprocesorā. Programmas skaitītājs tiek norādīts ar vērtību (adresi) $FFFC un $FFFD vietās. Atcerieties, ka programmas skaitītājā ir nākamās instrukcijas adrese. Šeit esošais saturs (adrese) ir paredzēts apakšprogrammai, kas sāk programmatūras inicializāciju. Visu līdz šim dara mikroprocesora aparatūra. Šajā fāzē netiek aizskarta visa atmiņa. Pēc tam sākas nākamais inicializācijas posms.

Inicializāciju veic dažas darbības ROM OS. Inicializācija nozīmē sākotnējo vai noklusējuma vērtību piešķiršanu dažiem reģistriem īpašajās mikroshēmās. Inicializācija sākas, piešķirot sākotnējās vai noklusējuma vērtības dažiem reģistriem īpašajās mikroshēmās. IRQ , piemēram, jāsāk izdot ik pēc 1/60 sekundes. Tātad tā atbilstošajam taimeram CIA #1 ir jāiestata noklusējuma vērtība.

Pēc tam Kernal veic RAM pārbaudi. Tā pārbauda katru atrašanās vietu, nosūtot uz vietu baitu un nolasot to atpakaļ. Ja ir atšķirība, tad vismaz šī vieta ir slikta. Kernal arī identificē atmiņas augšdaļu un atmiņas apakšdaļu un iestata atbilstošās norādes 2. lappusē. Ja atmiņas augšdaļa ir $DFFF, $FF tiek ievietota $0283 vietā un $DF tiek ievietota $0284 baitu vietā. Gan USD 0283, gan USD 0284 ir HIRAM etiķete. Ja atmiņas apakšējā daļa ir $0800, $00 tiek ievietota $0281 vietā un $08 tiek ievietota $0282 vietā. Gan USD 0281, gan USD 0282 ir LORAM etiķete. RAM pārbaude faktiski sākas no 0300 USD līdz atmiņas (RAM) augšējai daļai.

Visbeidzot, ievades/izvades vektoriem (rādītājiem) ir iestatītas to noklusējuma vērtības. RAM pārbaude faktiski sākas no 0300 USD līdz atmiņas (RAM) augšējai daļai. Tas nozīmē, ka tiek inicializēta 0., 1. un 2. lapa. Jo īpaši 0. lapā ir daudz OS ROM norādes, bet 2. lapā ir daudz BASIC norādes. Šīs norādes tiek sauktas par mainīgajiem. Atcerieties, ka 1. lapa ir kaudze. Rādītāji tiek saukti par mainīgajiem, jo ​​tiem ir nosaukumi (iezīmes). Šajā posmā ekrāna atmiņa tiek iztīrīta ekrānam (monitoram). Tas nozīmē, ka ir jānosūta kods 20 ASV dolāri par vietu (kas ir tāds pats kā ASCII $ 20) uz 1000 RAM ekrāna vietām. Visbeidzot, kodols palaiž BASIC tulku, lai parādītu BASIC komandu uzvedni, kas ir READY monitora (ekrāna) augšdaļā.

5.17 Problēmas

Pirms pāriet uz nākamo nodaļu lasītājam ir ieteicams atrisināt visas nodaļas problēmas.

  1. Uzrakstiet montāžas valodas kodu, kas visus CIA #2 porta A bitus padara par izvadi un CIA #2 porta B kā ievadi.
  2. Uzrakstiet 6502 montāžas valodas kodu, kas gaida tastatūras taustiņu, līdz tas tiek nospiests.
  3. Uzrakstiet 6502 montāžas valodas programmu, kas nosūta “E” rakstzīmi Commodore-64 ekrānam.
  4. Uzrakstiet 6502 montāžas valodas programmu, kas paņem rakstzīmi no tastatūras un nosūta to uz Commodore-64 ekrānu, ignorējot atslēgas kodu un laiku.
  5. Uzrakstiet 6502 montāžas valodas programmu, kas saņem baitu no Commodore-64 disketes.
  6. Uzrakstiet 6502 montāžas valodas programmu, kas saglabā failu Commodore-64 disketē.
  7. Uzrakstiet 6502 montāžas valodas programmu, kas ielādē programmas failu no Commodore-64 disketes un palaiž to.
  8. Uzrakstiet 6502 montāžas valodas programmu, kas nosūta baitu “E” (ASCII) modemam, kas ir savienots ar Commodore-64 lietotāja RS-232 saderīgo portu.
  9. Paskaidrojiet, kā Commodore-64 datorā tiek veikta skaitīšana un laika noteikšana.
  10. Paskaidrojiet, kā Commodore-64 sistēmas vienība var identificēt 10 dažādus tūlītēju pārtraukumu pieprasījumu avotus, tostarp nemaskējamos pārtraukumu pieprasījumus.
  11. Paskaidrojiet, kā fona programma var darboties kopā ar priekšplāna programmu datorā Commodore-64.
  12. Īsi paskaidrojiet, kā montāžas valodas programmas var apkopot vienā Commodore-64 datora lietojumprogrammā.
  13. Īsi izskaidrojiet Commodore-64 datora sāknēšanas procesu.