Luku 5: Commodore-64-käyttöjärjestelmä Assembly Language

Luku 5 Commodore 64 Kayttojarjestelma Assembly Language



5.1 Johdanto

Commodore-64-tietokoneen käyttöjärjestelmä tulee tietokoneen mukana lukumuistissa (ROM). Commodore-64:n muistitavupaikkojen määrä vaihtelee välillä $ 0000 - $FFFF (eli 000016 - FFFF16, joka on 010 - 65 53510). Käyttöjärjestelmä on välillä E000 - $FFFF (eli 57 34410 - 65 53610).

Miksi opiskella Commodore-64-käyttöjärjestelmää
Miksi tutkia Commodore-64-käyttöjärjestelmää nykyään, kun se oli vuonna 1982 julkaistun tietokoneen käyttöjärjestelmä? No, Commodore-64-tietokone käyttää Central Processing Unit 6510:tä, joka on päivitys (joskaan ei suuri päivitys) 6502 µP:stä.







6502 µP:tä tuotetaan edelleen suuria määriä; se ei ole enää koti- tai toimistotietokoneille vaan sähkö- ja elektroniikkalaitteille (laitteille). 6502 µP on myös helppo ymmärtää ja käyttää verrattuna muihin aikansa mikroprosessoreihin. Näiden seurauksena se on yksi parhaista (ellei paras) mikroprosessoreista, jota käytetään kokoonpanokielen opettamiseen.



Edelleen 6502-mikroprosessoriluokan 65C02 µP:ssä on 66 assembly-kieliohjetta, jotka kaikki voidaan jopa opetella ulkoa. Nykyaikaisissa mikroprosessoreissa on monia kokoonpanokielisiä ohjeita, eikä niitä voi oppia ulkoa. Jokaisella µP:llä on oma kokoonpanokielinsä itselleen. Mikä tahansa käyttöjärjestelmä, olipa se uusi tai vanha, on konekielinen. Sen ansiosta 6502 assembly-kieltä on hyvä käyttää aloittelijan käyttöjärjestelmän opettamiseen. Kun olet oppinut käyttöjärjestelmän, kuten Commodore-64:n, nykyaikainen käyttöjärjestelmä voidaan helposti oppia käyttämällä sitä perustana.



Tämä ei ole vain kirjoittajan (minun) mielipide. Se on kasvava trendi maailmassa. Internetissä kirjoitetaan yhä enemmän artikkeleita parannetusta Commodore-64-käyttöjärjestelmästä, jotta se näyttäisi nykyaikaiselta käyttöjärjestelmältä. Nykyaikaiset käyttöjärjestelmät selostetaan seuraavan luvun jälkeisessä luvussa.





Huomautus : Commodore-64 OS (Kernal) toimii edelleen hyvin nykyaikaisten syöttö- ja tulostuslaitteiden (ei kaikkien) kanssa.

Kahdeksan bitin tietokone
Kahdeksanbittisessä mikrotietokoneessa, kuten Commodore 64:ssä, tiedot tallennetaan, siirretään ja manipuloidaan kahdeksanbittisten binäärikoodien muodossa.



Muistikartta
Muistikartta on mittakaava, joka jakaa koko muistialueen pienempiin erikokoisiin alueisiin ja näyttää mikä (alirutiini ja/tai muuttuja) kuuluu mille alueelle. Muuttuja on nimiö, joka vastaa tiettyä muistiosoitetta, jolla on arvo. Tunnisteita käytetään myös aliohjelmien alun tunnistamiseen. Mutta tässä tapauksessa ne tunnetaan aliohjelmien niminä. Aliohjelmaa voidaan yksinkertaisesti kutsua rutiiniksi.

Edellisen luvun muistikartta (layout) ei ole tarpeeksi yksityiskohtainen. Se on melko yksinkertainen. Commodore-64-tietokoneen muistikartta voidaan näyttää kolmella tasolla. Keskitasolla esitettynä Commodore-64-tietokoneessa on erilaisia ​​muistikarttoja. Commodore-64-tietokoneen oletusmuistikartta keskitasolla on:


Kuva 5.11 Commodore-64-muistikartta

Tuohon aikaan oli suosittu tietokonekieli nimeltä BASIC. Monien tietokoneen käyttäjien täytyi osata joitain BASIC-kielen vähimmäiskomentoja, kuten ohjelman lataaminen levykkeeltä (levyltä) muistiin, muistissa olevan ohjelman suorittaminen (suoritus) ja ohjelman sulkeminen. Kun BASIC-ohjelma on käynnissä, käyttäjän on syötettävä tiedot rivi riviltä. Ei ole niin kuin nykyään, kun sovellus (useita ohjelmia muodostavat sovelluksen) kirjoitetaan korkeatasoisella kielellä ikkunoiden kanssa ja käyttäjän on vain sovitettava eri tiedot ikkunan erityisiin paikkoihin. Joissakin tapauksissa käytä me hiirtä valitaksesi ennakkoon tilatut tiedot. BASIC oli tuolloin korkean tason kieli, mutta on melko lähellä assembly-kieltä.

Huomaa, että oletusmuistikartan BASIC vie suurimman osan muistista. BASIC:ssa on komentoja (käskyjä), jotka suoritetaan niin kutsutulla BASIC Interpreterillä. Itse asiassa BASIC-tulkki on ROM-muistissa $A000 sijainnista $BFFF:hen (mukaan lukien), joka on oletettavasti RAM-alue. Tämä on 8 kilotavua, joka on melko suuri tuolloin! Se on itse asiassa ROM-muistissa koko muistin siinä kohdassa. Se on samankokoinen kuin käyttöjärjestelmä $E000 - $FFFF (mukaan lukien). BASIC-kielellä kirjoitetut ohjelmat sijoitetaan myös alueelle 0200–$BFFF.

Käyttäjän kokoonpanokieliohjelman RAM-muisti on 000 dollarista CFFF dollariin, vain 4 kilotavua 64 kilotavusta. Joten miksi käytämme tai opimme kokoonpanokieltä? Uudet ja vanhat käyttöjärjestelmät ovat assembly-kielisiä. Commodore-64:n käyttöjärjestelmä on ROM-muodossa, välillä $E000 - $FFFF. Se on kirjoitettu 65C02 µP (6510 µP) kokoonpanokielellä. Se koostuu aliohjelmista. Assembly-kielisen käyttäjäohjelman on kutsuttava näitä aliohjelmia voidakseen olla vuorovaikutuksessa oheislaitteiden (syöttö- ja tulostuslaitteiden) kanssa. Commodore-64-käyttöjärjestelmän ymmärtäminen assembly-kielellä antaa opiskelijalle mahdollisuuden ymmärtää käyttöjärjestelmät nopeasti, paljon vähemmän työläämmällä tavalla. Jälleen, niinä päivinä monet Commodore-64:n käyttäjäohjelmat kirjoitettiin BASIC-kielellä eikä assembly-kielellä. Assembly-kieliä käyttivät siihen aikaan enemmän ohjelmoijat itse teknisiin tarkoituksiin.

Kernal, kirjoitettu K-e-r-n-a-l, on Commodore-64:n käyttöjärjestelmä. Se tulee Commodore-64-tietokoneen mukana ROM-muistissa eikä levykkeessä (tai levykkeessä). Kernal koostuu aliohjelmista. Oheislaitteiden pääsyä varten konekielisen käyttäjäohjelman on käytettävä näitä aliohjelmia. Ydintä ei pidä sekoittaa ytimeen, joka on kirjoitettu K-e-r-n-e-l nykyaikaisissa käyttöjärjestelmissä, vaikka ne ovat melkein sama asia.

Muistin 4 kilotavun 10 muistialue välillä $C000 (49 15210) - $CFFF (6324810) on joko RAM tai ROM. Kun se on RAM-muistia, sitä käytetään oheislaitteiden käyttämiseen. Kun se on ROM, sitä käytetään merkkien tulostamiseen näytölle (näytölle). Tämä tarkoittaa, että joko merkit tulostetaan näytölle tai oheislaitteita käytetään tämän muistin osan avulla. Järjestelmäyksikössä (emolevyssä) on ROM-pankki (character ROM), joka kytketään sisään ja ulos koko muistitilasta tämän saavuttamiseksi. Käyttäjä ei välttämättä huomaa vaihtoa.

Muistialue alkaen 0100 dollaria (256 10 ) $01FF (511 10 ) on pino. Sitä käyttävät sekä käyttöjärjestelmä että käyttäjäohjelmat. Pinon rooli selitettiin tämän online-urakurssin edellisessä luvussa. Muistin pinta-ala alkaen 0000 dollaria (0 10 ) - 00 FF (255 10 ) on käyttöjärjestelmän käytössä. Siellä on monia osoittimia.

Kernal Jump Table
Kernalissa on rutiineja, joita käyttäjäohjelma kutsuu. Kun käyttöjärjestelmästä ilmestyi uusia versioita, näiden rutiinien osoitteet muuttuivat. Tämä tarkoittaa, että käyttäjäohjelmat eivät enää toimineet uusien käyttöjärjestelmäversioiden kanssa. Näin ei tapahtunut, koska Commodore-64 tarjosi hyppypöydän. Hyppytaulukko on 39 merkinnän luettelo. Jokaisella taulukon tiedolla on kolme osoitetta (lukuun ottamatta viimeistä 6 tavua), jotka eivät koskaan muuttuneet käyttöjärjestelmän versiomuutoksen myötä.

Merkinnän ensimmäisessä osoitteessa on JSR-käsky. Seuraavat kaksi osoitetta koostuvat kaksitavuisesta osoittimesta. Tämä kaksitavuinen osoitin on todellisen rutiinin osoite (tai uusi osoite), joka on edelleen käyttöjärjestelmän ROM-muistissa. Osoittimen sisältö saattaa muuttua uusien käyttöjärjestelmäversioiden myötä, mutta kunkin hyppytaulukon merkinnän kolme osoitetta eivät koskaan muutu. Harkitse esimerkiksi $FF81-, $FF82- ja $FF83-osoitteita. Nämä kolme osoitetta ovat rutiinia varten, jolla alustetaan emolevyn näytön ja näppäimistön piirit (rekisterit). $FF81-osoitteessa on aina JSR:n operaatiokoodi (yksi tavu). $FF82- ja $FF83-osoitteilla on aliohjelman vanha tai uusi osoite (vielä käyttöjärjestelmän ROM-muistissa) alustusta varten. Kerran $FF82- ja $FF83-osoitteilla oli $FF5B:n sisältö (osoite), joka voi muuttua seuraavan käyttöjärjestelmän version myötä. Hyppytaulukon $FF81-, $FF82- ja $FF83-osoitteet eivät kuitenkaan koskaan muutu.

Jokaisessa kolmen osoitteen syötössä ensimmäisellä JSR-osoitteella on tunniste (nimi). FF81 dollarin etiketti on PCINT. PCINT ei muutu koskaan. Joten alustaakseen näytön ja näppäimistön rekisterit, ohjelmoija voi yksinkertaisesti kirjoittaa 'JSR PCINT', joka toimii kaikissa Commodore-64 OS -versioissa. Varsinaisen aliohjelman sijainti (aloitusosoite), esim. $FF5B, voi muuttua ajan myötä eri käyttöjärjestelmissä. Kyllä, ROM-käyttöjärjestelmää käyttävässä käyttäjäohjelmassa on vähintään kaksi JSR-ohjetta. Käyttäjäohjelmassa on JSR-käsky, joka hyppää merkintään hyppytaulukossa. Lukuun ottamatta kuutta viimeistä osoitetta hyppytaulukossa, hyppytaulukon merkinnän ensimmäisessä osoitteessa on JSR-käsky. Kernalissa jotkin aliohjelmat voivat kutsua muita aliohjelmia.

Kernal-hyppytaulukko alkaa $FF81:stä (mukaan lukien) ja nousee ylöspäin kolmen ryhmissä, paitsi viimeiset kuusi tavua, jotka ovat kolme osoitinta pienemmillä tavuosoitteilla: $FFFA, $FFFC ja $FFFE. Kaikki ROM-käyttöjärjestelmän rutiinit ovat uudelleenkäytettäviä koodeja. Käyttäjän ei siis tarvitse kirjoittaa niitä uudelleen.

Commodore-64-järjestelmäyksikön lohkokaavio
Seuraava kaavio on yksityiskohtaisempi kuin edellisen luvun kaavio:


Kuva 5.12 Commodore_64-järjestelmäyksikön lohkokaavio

ROM ja RAM näkyvät tässä yhtenä lohkona. Video Interface Chip (IC) näytön tietojen käsittelemiseksi, jota ei esitetty edellisessä luvussa, näytetään tässä. Edellisessä luvussa esitetty yksittäinen tulo-/tulostuslaitteiden lohko näytetään tässä kahtena lohkona: CIA #1 ja CIA #2. CIA tulee sanoista Complex Interface Adapter. Kummassakin on kaksi rinnakkaista kahdeksanbitistä porttia (jota ei pidä sekoittaa ulkoisiin portteihin järjestelmäyksikön pystypinnalla), joita kutsutaan portiksi A ja portiksi B. CIA:t on kytketty viiteen ulkoiseen laitteeseen tässä tilanteessa. Laitteet ovat näppäimistö, ohjaussauva, levyasema/tulostin ja modeemi. Tulostin on kytketty levyaseman takaosaan. Siellä on myös ääniliitäntälaitepiiri ja ohjelmoitava logiikkapiiri, joita ei näytetä.

Silti on olemassa merkki-ROM, joka voidaan vaihtaa molempien CIA:iden kanssa, kun merkki lähetetään näytölle, eikä sitä näytetä lohkokaaviossa.

RAM-osoitteilla $D000 - $DFFF tulo-/lähtöpiirien ROM-merkkien puuttuessa on seuraava muistikartta:

Taulukko 5.11
Yksityiskohtainen muistikartta $D000 - $DFFF
Aliosoitealue Piiri Koko (tavuina)
D000 – D3FF VIC (Video Interface Controller (Chip)) 1K
D400 – D7FF SID (äänipiiri) 1K
D800 – DBFF Väri RAM 1K Nibbles
DC00 – DCFF CIA #1 (näppäimistö, joystick) 256
DD00 – DDFF CIA #2 (sarjaväylä, käyttäjäportti/RS-232) 256
DE00 – DEF Avaa I/O-paikka #1 256
DF00 – DFFF Avaa I/O-paikka 2 256

5.2 Kaksi monimutkaista liitäntäsovitinta

Commodore-64-järjestelmäyksikössä on kaksi erityistä integroitua piiriä (ICs), ja kutakin niistä kutsutaan Complex Interface Adapteriksi. Näitä kahta sirua käytetään näppäimistön ja muiden oheislaitteiden liittämiseen mikroprosessoriin. VIC:tä ja näyttöä lukuun ottamatta kaikki mikroprosessorin ja oheislaitteiden väliset tulo-/lähtösignaalit kulkevat näiden kahden IC:n läpi. Commodore-64:ssä ei ole suoraa yhteyttä muistin ja oheislaitteiden välillä. Viestintä muistin ja oheislaitteiden välillä kulkee mikroprosessorin akun kautta, ja yksi niistä on CIA-sovittimet (ICs). IC:itä kutsutaan CIA #1:ksi ja CIA #2:ksi. CIA tulee sanoista Complex Interface Adapter.

Jokaisella CIA:lla on 16 rekisteriä. Lukuun ottamatta CIA:n ajastin/laskurirekisterejä, jokainen rekisteri on 8-bittinen ja sillä on muistiosoite. CIA #1:n muistirekisteriosoitteet ovat alkaen $DC00 (56320 10 ) DC0F dollariin (56335 10 ). CIA #2:n muistirekisteriosoitteet ovat alkaen $DD00 (56576 10 ) $DD0F (56591 10 ). Vaikka nämä rekisterit eivät ole IC:n muistissa, ne ovat osa muistia. Välimuistikartassa I/O-alue $D000 - $DFFF sisältää CIA-osoitteet välillä $DC00 - $DC0F ja $DD00 - $DD0F. Suurin osa RAM-I/O-muistialueesta $D000 - $DFFF voidaan vaihtaa merkki-ROM-muistipankilla näytön merkkejä varten. Siksi oheislaitteet eivät voi toimia, kun hahmot lähetetään näytölle; vaikka käyttäjä ei ehkä huomaa tätä, koska vaihtaminen edestakaisin on nopeaa.

CIA #1:ssä on kaksi rekisteriä, nimeltään portti A ja portti B. Niiden osoitteet ovat $DC00 ja $DC01. CIA #2:ssa on myös kaksi rekisteriä nimeltään Port A ja Port B. Tietenkin niiden osoitteet ovat erilaiset; ne ovat DD00 dollaria ja DD01 dollaria.

Portti A tai portti B kummassakin CIA:ssa on rinnakkaisportti. Tämä tarkoittaa, että se voi lähettää tiedot oheislaitteelle kahdeksassa bitissä kerralla tai vastaanottaa tietoja mikroprosessorilta kahdeksassa bitissä kerralla.

Porttiin A tai porttiin B liittyy Data Direction Register (DDR). CIA #1:n (DDRA1) portin A datasuuntarekisteri on $DC02:n muistitavupaikassa. CIA #1:n (DDRB1) portin B datasuuntarekisteri on $DC03:n muistitavupaikassa. CIA #2:n (DDRA2) portin A datasuuntarekisteri on muistitavun sijainnissa $DD02. CIA #2:n (DDRB2) portin B datasuuntarekisteri on $DD03:n muistitavupaikassa.

Nyt jokainen bitti portille A tai portille B voidaan asettaa vastaavalla datasuuntarekisterillä tuloksi tai ulostuloksi. Syöttö tarkoittaa, että tiedot kulkevat oheislaitteesta mikroprosessoriin CIA:n kautta. Lähtö tarkoittaa, että tiedot kulkevat mikroprosessorista oheislaitteeseen CIA:n kautta.

Jos syötetään portin (rekisterin) solu, vastaava bitti datasuuntarekisterissä on 0. Jos tulostetaan portin (rekisterin) solu, vastaava bitti datasuuntarekisterissä on 1. Useimmissa tapauksissa kaikki portin 8-bitit on ohjelmoitu joko tuloksi tai ulostuloksi. Kun tietokoneeseen kytketään virta, portti A ohjelmoidaan lähtöä varten ja portti B tuloa varten. Seuraava koodi tekee CIA #1 -portin A ulostuloksi ja CIA #1 -portin B tuloksi:

LDA #$FF
STA DDRA1 ; $DC00 on ohjannut $DC02
LDA #$00
STA DDRB1 ; $DC01 on ohjannut $DC03

DDRA1 on tunniste (muuttujan nimi) muistitavulle $DC02:lle ja DDRB1 on tunniste (muuttujan nimi) muistitavun sijainnille $DC03. Ensimmäinen käsky lataa 11111111 µP:n akkuun. Toinen käsky kopioi tämän CIA:n nro. 1. Kolmas käsky lataa 00000000 µP:n akkuun. Neljäs käsky kopioi tämän CIA:n nro. 1. Tämä koodi on yhdessä käyttöjärjestelmän alirutiineista, joka suorittaa tämän alustuksen tietokoneen käynnistyksen yhteydessä.

Jokaisella CIA:lla on keskeytyspalvelupyyntölinja mikroprosessorille. CIA #1:n yksi menee IRQ µP:n tappi. CIA nro 2:n yksi menee NMI µP:n tappi. Muista se NMI on korkeampi prioriteetti kuin IRQ .

5.3 Näppäimistökokoonpanon kieliohjelmointi

Commodore-64:lle on vain kolme mahdollista keskeytystä: IRQ , BRK ja NMI . Hyppypöydän osoitin IRQ on $FFFE- ja $FFFF-osoitteissa ROM:ssa (käyttöjärjestelmä), mikä vastaa käyttöjärjestelmässä (ROM) edelleen olevaa aliohjelmaa. BRK:n hyppytaulukon osoitin on käyttöjärjestelmän $FFFC- ja $FFFD-osoitteissa, mikä vastaa käyttöjärjestelmässä (ROM) edelleen olevaa aliohjelmaa. Hyppypöydän osoitin NMI on käyttöjärjestelmän $FFFA- ja $FFFB-osoitteissa, mikä vastaa käyttöjärjestelmässä (ROM) edelleen olevaa aliohjelmaa. Varten IRQ , itse asiassa on kaksi aliohjelmaa. Joten BRK-ohjelmistokeskeytyksellä (käskyllä) on oma hyppytaulukon osoitin. Hyppypöydän osoitin IRQ johtaa koodiin, joka päättää, onko kyseessä laitteistokeskeytys vai ohjelmistokeskeytys. Jos se on laitteistokeskeytys, rutiini IRQ kutsutaan. Jos kyseessä on ohjelmistokeskeytys (BRK), BRK:n rutiini kutsutaan. Yhdessä käyttöjärjestelmäversiossa aliohjelma for IRQ on $EA31 ja BRK:n aliohjelma $FE66. Nämä osoitteet ovat alle $FF81, joten ne eivät ole hyppytaulukon merkintöjä ja ne voivat muuttua käyttöjärjestelmän version mukaan. Tässä aiheessa on kolme kiinnostavaa rutiinia: se, joka tarkistaa, onko kyseessä näppäin painettuna vai BRK, se, jonka arvo on $FE43, ja se, joka voi myös muuttua käyttöjärjestelmän version mukaan.

Commodore-64-tietokone on kuin valtava kirjoituskone (ylöspäin) ilman tulostusosaa (pää ja paperi). Näppäimistö on kytketty CIA 1:een. CIA #1 skannaa näppäimistön 1/60 sekunnin välein ilman ohjelmointihäiriöitä oletusarvoisesti. Joten joka 1/60 sekunnissa, CIA #1 lähettää IRQ µP:hen. On vain yksi ainoa IRQ nasta µP:ssä, joka tulee vain CIA:lta #1. Yhden tulon pinni NMI µP:stä, joka on erilainen kuin IRQ , tulee vain CIA #2:lta (katso seuraava kuva). BRK on itse asiassa asennuskieliohje, joka on koodattu käyttäjäohjelmassa.

Joten joka 1/60 sekunti, IRQ rutiini, johon $FFFE ja $FFFF osoittavat, kutsutaan. Rutiini tarkistaa, painetaanko näppäintä tai havaitaanko BRK-käsky. Jos näppäintä painetaan, näppäinpainalluksen käsittelyrutiini kutsutaan. Jos se on BRK-käsky, BRK:n käsittelyrutiini kutsutaan. Jos ei ole kumpaakaan, mitään ei tapahdu. Kumpaakaan ei ehkä tapahdu, mutta CIA #1 lähettää IRQ µP:hen 1/60 sekunnin välein.

Näppäimistöjono, joka tunnetaan myös nimellä näppäimistöpuskuri, on RAM-tavujen sijaintialue 0277–0280 dollaria; Yhteensä 1010 tavua. Tämä on First-IN-First-Out-puskuri. Tämä tarkoittaa, että ensimmäinen hahmo, joka tulee, on ensimmäinen, joka lähtee. Länsieurooppalainen merkki vie yhden tavun.

Joten vaikka ohjelma ei kuluta yhtään merkkiä näppäintä painettaessa, avainkoodi menee tähän puskuriin (jonoon). Puskuri täyttyy, kunnes siinä on kymmenen merkkiä. Mitään merkkiä, jota painetaan kymmenennen merkin jälkeen, ei tallenneta. Sitä ei huomioida, kunnes vähintään yksi merkki on saatu (käytetty) jonosta. Hyppytaulukossa on merkintä aliohjelmalle, joka saa ensimmäisen merkin jonosta mikroprosessorille. Tämä tarkoittaa, että se ottaa ensimmäisen merkin, joka menee jonoon, ja laittaa sen µP:n varaajaan. Hyppytaulukon aliohjelma tämän tekemiseen on nimeltään GETIN (for Get-In). Kolmetavuisen merkinnän ensimmäinen tavu hyppytaulukossa on merkitty nimellä GETIN (osoite $FFE4). Seuraavat kaksi tavua ovat osoitin (osoite), joka osoittaa ROM:n (OS) varsinaiseen rutiiniin. Ohjelmoijan vastuulla on kutsua tämä rutiini. Muussa tapauksessa näppäimistön puskuri pysyy täynnä ja kaikki äskettäin painetut näppäimet ohitetaan. Varaajaan menevä arvo on vastaava avain ASCII-arvo.

Miten avainkoodit päätyvät jonoon? On olemassa hyppytaulukkorutiini nimeltä SCNKEY (skannausavaimelle). Tämä rutiini voidaan kutsua sekä ohjelmistolla että laitteistolla. Tässä tapauksessa sitä kutsutaan mikroprosessorin elektroniikka (fysiikka) piiri, kun sähköinen signaali IRQ on matala. Tässä online-urakurssissa ei käsitellä sitä, miten se tarkalleen tehdään.

Koodi ensimmäisen näppäinkoodin saamiseksi näppäimistöpuskurista akkuun A on vain yksi rivi:

PÄÄSTÄ SISÄÄN

Jos näppäimistön puskuri on tyhjä, 00 dollaria sijoitetaan akkuun. Muista, että nollan ASCII-koodi ei ole $00; se on 30 dollaria. 00 dollaria tarkoittaa nollaa. Ohjelmassa voi olla kohta, jossa ohjelman on odotettava näppäinpainallusta. Koodi tälle on:

ODOTA JSR GETIN
CMP #$00
SAMMAKKO ODOTA

Ensimmäisellä rivillä 'WAIT' on tarra, joka tunnistaa RAM-osoitteen, johon JSR-käsky laitetaan (kirjoitetaan). GETIN on myös osoite. Se on hyppytaulukon vastaavan kolmen tavun ensimmäisen osoite. GETIN-merkintä, samoin kuin kaikki hyppytaulukon merkinnät (paitsi kolme viimeistä), koostuu kolmesta tavusta. Merkinnän ensimmäinen tavu on JSR-käsky. Seuraavat kaksi tavua ovat todellisen GETIN-aliohjelman rungon osoite, joka on edelleen ROM:ssa (OS), mutta hyppytaulukon alapuolella. Joten merkintä käskee hypätä GETIN-aliohjelmaan. Jos näppäimistöjono ei ole tyhjä, GETIN asettaa First-In-First-Out-jonon ASCII-avainkoodin akkuun. Jos jono on tyhjä, Null ($00) laitetaan varaajaan.

Toinen ohje vertaa akun arvoa 00 dollariin. Jos se on $00, se tarkoittaa, että näppäimistöjono on tyhjä ja CMP-käsky lähettää 1:n prosessorin tilarekisterin Z-lipulle (jota kutsutaan yksinkertaisesti tilarekisteriksi). Jos A:n arvo ei ole $00, CMP-käsky lähettää 0:n tilarekisterin Z-lippuun.

Kolmas käsky, joka on 'BEQ WAIT', lähettää ohjelman takaisin ensimmäiseen käskyyn, jos tilarekisterin Z-lippu on 1. Ensimmäinen, toinen ja kolmas käsky suoritetaan toistuvasti järjestyksessä, kunnes näppäimistön näppäintä painetaan. . Jos näppäintä ei koskaan paineta, sykli toistuu loputtomasti. Tällainen koodisegmentti kirjoitetaan tavallisesti ajoituskoodisegmentillä, joka sulkee silmukan jonkin ajan kuluttua, jos näppäintä ei koskaan paineta (katso seuraava keskustelu).

Huomautus : Näppäimistö on oletussyöttölaite ja näyttö on oletustulostuslaite.

5.4 Kanava, laitenumero ja looginen tiedostonumero

Oheislaitteet, joita tässä luvussa käytetään Commodore-64-käyttöjärjestelmän selittämiseen, ovat näppäimistö, näyttö (näyttö), levykeasema, tulostin ja modeemi, joka yhdistetään RS-232C-liitännän kautta. Jotta tiedonsiirto tapahtuisi näiden laitteiden ja järjestelmäyksikön (mikroprosessori ja muisti) välillä, on muodostettava kanava.

Kanava koostuu puskurista, laitenumerosta, loogisesta tiedostonumerosta ja valinnaisesti toissijaisesta osoitteesta. Näiden termien selitys on seuraava:

Puskuri
Huomaa edellisestä osiosta, että kun näppäintä painetaan, sen koodin on mentävä tavupaikkaan RAM-muistissa kymmenen peräkkäisen sijainnin sarjassa. Tämä kymmenen paikan sarja on näppäimistöpuskuri. Jokaisella tulo- tai tulostuslaitteella (oheislaitteella) on sarja peräkkäisiä paikkoja RAM-muistissa, joita kutsutaan puskuriksi.

Laitteen numero
Commodore-64:ssä kaikki oheislaitteet annetaan laitenumerolla. Seuraavassa taulukossa näkyvät eri laitteet ja niiden numerot:

Taulukko 5.41
Commodore 64 -laitenumerot ja niiden laitteet
Määrä Laite
0 Näppäimistö
1 Nauha-asema
2 RS 232C -liitäntä esim. modeemi
3 Näyttö
4 Tulostin #1
5 Tulostin #2
6 Piirturi nro 1
7 Piirturi nro 2
8 Levyasema
9
¦
¦
¦
30
8 (mukaan lukien) jopa 22 tallennuslaitetta lisää

Tietokoneille on olemassa kahdenlaisia ​​portteja. Yksi tyyppi on ulkoinen, järjestelmäyksikön pystypinnalla. Toinen tyyppi on sisäinen. Tämä sisäinen portti on rekisteri. Commodore-64:ssä on neljä sisäistä porttia: portti A ja portti B CIA 1:lle ja portti A ja portti B CIA 2:lle. Commodore-64:lle on yksi ulkoinen portti, jota kutsutaan sarjaportiksi. Laitteet, joiden numero on 3 ylöspäin, on kytketty sarjaporttiin. Ne on yhdistetty ketjutettuna (joka on kytketty toistensa taakse), ja jokainen niistä on tunnistettavissa sen laitenumerosta. Laitteet, joiden numero on 8 ylöspäin, ovat yleensä tallennuslaitteita.

Huomautus : Oletussyöttölaite on näppäimistö, jonka laitenumero on 0. Oletustulostuslaite on näyttö, jonka laitenumero on 3.

Looginen tiedostonumero
Looginen tiedostonumero on numero, joka annetaan laitteelle (oheislaitteelle) siinä järjestyksessä, jossa ne avataan pääsyä varten. Ne vaihtelevat välillä 010-255 10 .

Toissijainen osoite
Kuvittele, että kaksi tiedostoa (tai useampi kuin yksi tiedosto) avataan levyllä. Näiden kahden tiedoston erottamiseksi käytetään toissijaisia ​​osoitteita. Toissijaiset osoitteet ovat numeroita, jotka vaihtelevat laitteittain. 3:n merkitys tulostimen toissijaisena osoitteena on erilainen kuin 3:n merkitys levyaseman toissijaisena osoitteena. Merkitys riippuu ominaisuuksista, kuten siitä, milloin tiedosto avataan lukemista varten tai milloin tiedosto avataan kirjoittamista varten. Mahdolliset toissijaiset numerot ovat alkaen 0 10 15 asti 10 jokaiselle laitteelle. Monissa laitteissa numeroa 15 käytetään komentojen lähettämiseen.

Huomautus : Laitenumero tunnetaan myös laiteosoitteena ja toissijainen numero myös toissijaisena osoitteena.

Perfeerisen kohteen tunnistaminen
Commodore-oletusmuistikartassa muistiosoitteita $0200 - $02FF (sivu 2) käyttää vain käyttöjärjestelmä ROM-muistissa (Kernal), ei käyttöjärjestelmä ja PERUSkieli. Vaikka BASIC voi silti käyttää sijainteja ROM-käyttöjärjestelmän kautta.

Modeemi ja tulostin ovat kaksi eri oheislaitetta. Jos levyltä avataan kaksi tiedostoa, ne ovat kaksi eri kohdetta. Oletusmuistikartalla on kolme peräkkäistä taulukkoa (listaa), jotka voidaan nähdä yhtenä suurena taulukkona. Nämä kolme taulukkoa sisältävät loogisten tiedostonumeroiden, laitenumeroiden ja toissijaisten osoitteiden välisen suhteen. Tämän avulla tietty kanava tai tulo/lähtökohde tulee tunnistettavaksi. Näitä kolmea taulukkoa kutsutaan tiedostotaulukoiksi. RAM-osoitteet ja mitä niillä on:

$0259 – $0262: Taulukko etiketillä, LAT, jossa on enintään kymmenen aktiivista loogista tiedostonumeroa.
$0263 – $026C: Taulukko etiketillä, FAT, jopa kymmenen vastaavaa laitenumeroa.
$026D — $0276: Taulukko etiketillä, SAT, kymmenen vastaavaa toissijaista osoitetta.

Tässä '-' tarkoittaa 'vastaanottaja', ja numero vie yhden tavun.

Lukija voi kysyä: 'Miksi kunkin laitteen puskuri ei sisälly kanavan tunnistamiseen?' No, vastaus on, että commodore-64:ssä jokaisella ulkoisella laitteella (oheislaitteella) on kiinteä tavusarja RAM-muistissa (muistikartta). Ilman avattua kanavaa heidän asemansa ovat edelleen siellä muistissa. Esimerkiksi näppäimistön puskuri on kiinteä 0277–0280 dollaria (mukaan lukien) oletusmuistikartalle.

Kernalin SETLFS- ja SETNAM-alirutiinit
SETLFS ja SETNAM ovat ytimen rutiineja. Kanava voidaan nähdä loogisena tiedostona. Kanavan avaamiseksi on tuotettava looginen tiedostonumero, laitenumero ja valinnainen toissijainen osoite. Myös valinnainen tiedostonimi (teksti) voi olla tarpeen. SETLFS-rutiini määrittää loogisen tiedostonumeron, laitenumeron ja valinnaisen toissijaisen osoitteen. Nämä luvut on merkitty vastaaviin taulukoihinsa. SETNAM-rutiini asettaa tiedostolle merkkijonon nimen, joka voi olla pakollinen yhdelle kanavalle ja valinnainen toiselle kanavalle. Tämä koostuu muistissa olevasta osoittimesta (kaksitavuinen osoite). Osoitin osoittaa merkkijonon (nimen) alkuun, joka voi olla jossain muussa paikassa muistissa. Merkkijonon nimi alkaa tavulla, jolla on merkkijonon pituus, jota seuraa teksti (nimi). Nimen enimmäispituus on kuusitoista tavua (pitkä).

SETLFS-rutiinin kutsumiseksi käyttäjäohjelman on hypättävä (JSR) ROM-muistissa olevan käyttöjärjestelmän hyppytaulukon $FFBA-osoitteeseen oletusmuistikartalle. Muista, että hyppytaulukon viimeisiä kuutta tavua lukuun ottamatta jokainen merkintä koostuu kolmesta tavusta. Ensimmäinen tavu on JSR-käsky, joka sitten hyppää aliohjelmaan ja alkaa kahden seuraavan tavun osoitteesta. Kutsuakseen SETNAM-rutiinia käyttäjäohjelman on hypättävä (JSR) ROM-käyttöjärjestelmän hyppytaulukon $FFBD-osoitteeseen. Näiden kahden rutiinin käyttö esitetään seuraavassa keskustelussa.

5.5 Kanavan avaaminen, loogisen tiedoston avaaminen, loogisen tiedoston sulkeminen ja kaikkien I/O-kanavien sulkeminen

Kanava koostuu muistipuskurista, loogisesta tiedostonumerosta, laitenumerosta (laiteosoite) ja valinnaisesta toissijaisesta osoitteesta (numero). Looginen tiedosto (abstraktio), joka tunnistetaan loogisella tiedostonumerolla, voi viitata oheislaitteeseen, kuten tulostimeen, modeemiin, levyasemaan jne. Jokaisella näistä eri laitteista tulee olla eri looginen tiedostonumero. Levyllä on monia tiedostoja. Looginen tiedosto voi viitata myös tiettyyn levyllä olevaan tiedostoon. Tällä tietyllä tiedostolla on myös looginen tiedostonumero, joka eroaa oheislaitteiden, kuten tulostimen tai modeemin, numeroista. Loogisen tiedostonumeron antaa ohjelmoija. Se voi olla mikä tahansa numero väliltä 010 (00 dollaria) - 25 510 ($ FF).

Käyttöjärjestelmän SETLFS-rutiini
OS SETLFS -rutiini, johon päästään hyppäämällä (JSR) käyttöjärjestelmän ROM-hyppytaulukkoon osoitteessa $FFBA, määrittää kanavan. Sen on lisättävä looginen tiedostonumero tiedostotaulukkoon, joka on LAT ($0259 - $0262). Sen on lisättävä vastaava laitenumero tiedostotaulukkoon, joka on FAT ($0263 - $026C). Jos tiedoston (laitteen) käyttöoikeus tarvitsee toissijaisen numeron, sen on lisättävä vastaava toissijainen osoite (numero) tiedostotaulukkoon, joka on SAT ($026D - $0276).

Toimiakseen SETLFS-alirutiinin on hankittava looginen tiedostonumero µP-akulta; sen on hankittava laitenumero µP X -rekisteristä. Jos kanava tarvitsee, sen on hankittava toissijainen osoite µP Y -rekisteristä.

Loogisen tiedoston numeron päättää ohjelmoija. Eri laitteisiin viittaavat loogiset tiedostonumerot ovat erilaisia. Nyt, ennen kuin se kutsuu SETLFS-rutiinia, ohjelmoijan tulee laittaa loogisen tiedoston numero µP-akkuun. Laitenumero luetaan taulukosta (asiakirjasta), kuten Taulukko 5.41. Ohjelmoijan tulee myös laittaa laitenumero µP X -rekisteriin. Laitteen, kuten tulostimen, levyaseman jne., toimittaja toimittaa laitteen mahdolliset toissijaiset osoitteet ja niiden merkitykset. Jos kanava tarvitsee toissijaisen osoitteen, ohjelmoijan on hankittava se laitteen mukana toimitetusta asiakirjasta (oheislaite). Jos toissijainen osoite (numero) on tarpeen, ohjelmoijan on tallennettava se µP Y -rekisteriin ennen SETLFS-aliohjelman kutsumista. Jos toissijaista osoitetta ei tarvita, ohjelmoijan on syötettävä $FF-numero µP Y -rekisteriin ennen SETLFS-aliohjelman kutsumista.

SETLFS-alirutiini kutsutaan ilman argumentteja. Sen argumentit ovat jo 6502 µP:n kolmessa rekisterissä. Kun oikeat numerot on asetettu rekistereihin, rutiini kutsutaan ohjelmassa yksinkertaisesti seuraavalla erillisellä rivillä:

JSR SETLFS

Rutiini sijoittaa eri numerot asianmukaisesti tiedostotaulukoihinsa.

OS SETNAM -rutiini
OS SETNAM -rutiiniin päästään hyppäämällä (JSR) käyttöjärjestelmän ROM-hyppytaulukkoon osoitteessa $FFBD. Kaikilla kohteilla ei ole tiedostonimiä. Niille, joilla on kohteita (kuten levyllä olevat tiedostot), tiedostonimi tulee määrittää. Oletetaan, että tiedoston nimi on 'mydocum', joka koostuu 7 tavusta ilman lainausmerkkejä. Oletetaan, että tämä nimi on $C101–$C107 sijainneissa (mukaan lukien) ja $07:n pituus on sijainnissa $C100. Merkkijonomerkkien aloitusosoite on $C101. Aloitusosoitteen alempi tavu on $01 ja ylempi tavu $C1.

Ennen SETNAM-rutiinin kutsumista ohjelmoijan on asetettava $07 (merkkijonon pituus) numero µP-akkuun. Merkkijonon aloitusosoitteen $01 alempi tavu laitetaan µP X -rekisteriin. $C1:n merkkijonon aloitusosoitteen korkeampi tavu laitetaan µP Y -rekisteriin. Aliohjelmaa kutsutaan yksinkertaisesti seuraavasti:

JSR SETNAM

SETNAM-rutiini yhdistää arvot kolmesta rekisteristä kanavaan. Arvojen ei tarvitse jäädä rekistereihin sen jälkeen. Jos kanava ei tarvitse tiedostonimeä, ohjelmoijan on laitettava $00 µP-akkuun. Tässä tapauksessa X- ja Y-rekistereissä olevat arvot ohitetaan.

OS OPEN -rutiini
OS OPEN -rutiiniin päästään hyppäämällä (JSR) käyttöjärjestelmän ROM-hyppytaulukkoon $FFC0:ssa. Tämä rutiini käyttää loogista tiedostonumeroa, laitenumeroa (ja puskuria), mahdollista toissijaista osoitetta ja mahdollista tiedostonimeä yhteyden muodostamiseen Commodore-tietokoneen ja ulkoisessa laitteessa olevan tiedoston tai itse ulkoisen laitteen välille.

Tämä rutiini, kuten kaikki muut Commodore OS ROM -rutiinit, ei kestä argumentteja. Vaikka se käyttää µP-rekistereitä, mitään rekistereistä ei tarvinnut esiladata argumenteilla (arvoilla) sitä varten. Koodataksesi sen kirjoittamalla seuraava teksti SETLFS- ja SETNAM-kutsujen jälkeen:

JSR AVOIN

OPEN-rutiinissa saattaa ilmetä virheitä. Esimerkiksi tiedostoa ei ehkä löydy luettavaksi. Kun virhe tapahtuu, rutiini epäonnistuu ja asettaa vastaavan virhenumeron µP-akkuihin ja asettaa µP-tilarekisterin siirtolipun (1). Seuraavassa taulukossa on virhenumerot ja niiden merkitykset:

Taulukko 5.51
Kernalin virhenumerot ja niiden merkitykset käyttöjärjestelmän ROM OPEN -rutiinissa
Virhenumero Kuvaus Esimerkki
1 LIIAN monta tiedostoa AVAA kun kymmenen tiedostoa on jo avattu
2 TIEDOSTO AUKI AUKI 1,3: AUKI 1,4
3 TIEDOSTO EI AVAA TULOSTUS#5 ilman AUKI
4 TIEDOSTOA EI LÖYTYNYT LATAA “NONEEXISTENF”,8
5 LAITE EI OLE LÄHELLÄ AUKI 11,11: PRINT#11
6 EI Syötetiedostoa AVAA ”SEQ,S,W”: GET#8,X$
7 EI OUTPUT TIEDOSTO AUKI 1,0: TULOSTUS#1
8 TIEDOSTO NIMI PUUTUU LATAA '',8
9 LAITON LAITE NO. LATAA 'OHJELMA',3

Tämä taulukko on esitetty tavalla, jonka lukija todennäköisesti näkee monissa muissa paikoissa.

OS CHKIN -rutiini
OS CHKIN -rutiiniin päästään hyppäämällä (JSR) OS ROM -hyppytaulukkoon osoitteessa $FFC6. Tiedoston (loogisen tiedoston) avaamisen jälkeen on päätettävä, onko avaus syötettä vai tulostusta varten. CHKIN-rutiini tekee avaamisesta tulokanavan. Tämän rutiinin on luettava looginen tiedostonumero µP X -rekisteristä. Joten ohjelmoijan on laitettava looginen tiedostonumero X-rekisteriin ennen tämän rutiinin kutsumista. Sitä kutsutaan yksinkertaisesti seuraavasti:

JSR CHKIN

OS CHKOUT -rutiini
OS CHKOUT -rutiiniin päästään hyppäämällä (JSR) OS ROM -hyppytaulukkoon hintaan $FFC9. Tiedoston (loogisen tiedoston) avaamisen jälkeen on päätettävä, onko avaus syötettä vai tulostusta varten. CHKOUT-rutiini tekee avaamisesta lähtökanavan. Tämän rutiinin on luettava looginen tiedostonumero µP X -rekisteristä. Joten ohjelmoijan on laitettava looginen tiedostonumero X-rekisteriin ennen tämän rutiinin kutsumista. Sitä kutsutaan yksinkertaisesti seuraavasti:

JSR CHKOUT

OS CLOSE -ohjelma
OS CLOSE -rutiiniin päästään hyppäämällä (JSR) käyttöjärjestelmän ROM-hyppytaulukkoon osoitteessa $FFC3. Kun looginen tiedosto on avattu ja tavut on lähetetty, looginen tiedosto on suljettava. Loogisen tiedoston sulkeminen vapauttaa järjestelmäyksikön puskurin käytettäväksi jollekin muulle loogiselle tiedostolle, joka on vielä avaamatta. Myös vastaavat parametrit kolmesta tiedostotaulukosta poistetaan. Avattujen tiedostojen lukumäärän RAM-sijaintia vähennetään yhdellä.

Kun tietokoneeseen kytketään virta, emolevyn mikroprosessorin ja muiden pääsirujen (integroitujen piirien) laitteisto nollataan. Tätä seuraa joidenkin RAM-muistipaikkojen ja joidenkin rekisterien alustaminen joissakin emolevyn siruissa. Alustusprosessissa $0098-osoitteen tavumuistipaikka sivulla nolla annetaan NFILES- tai LDTND-tunnisteella käyttöjärjestelmän versiosta riippuen. Kun tietokone on toiminnassa, tämä 8 bitin yksitavuinen sijainti sisältää avattujen loogisten tiedostojen määrän ja kolmen peräkkäisen tiedostotaulukon aloitusosoiteindeksin. Toisin sanoen tällä tavulla on auki olevien tiedostojen lukumäärä, joka pienenee 1:llä, kun looginen tiedosto suljetaan. Kun looginen tiedosto suljetaan, pääsy päätelaitteeseen (kohdelaitteeseen) tai varsinaiseen levyllä olevaan tiedostoon ei ole enää mahdollista.

Loogisen tiedoston sulkemiseksi ohjelmoijan on asetettava looginen tiedostonumero µP-akkuun. Tämä on sama looginen tiedostonumero, jota käytetään tiedoston avaamisessa. SULJE-rutiini tarvitsee sitä kyseisen tiedoston sulkemiseen. Kuten muutkin käyttöjärjestelmän ROM-rutiinit, CLOSE-rutiini ei ota argumenttia, vaikka akusta käytetty arvo on jossain määrin argumentti. Assembly-kielen ohjerivi on yksinkertaisesti:

JSR SULJETTU

Mukautetut tai ennalta määritetyt 6502-kokoonpanokielen alirutiinit (rutiinit) eivät ota argumentteja. Argumentit tulevat kuitenkin epävirallisesti laittamalla arvot, joita aliohjelma käyttää mikroprosessorirekistereihin.

CLRCHN-rutiini
OS CLRCHN -rutiiniin päästään hyppäämällä (JSR) käyttöjärjestelmän ROM-hyppytaulukkoon osoitteessa $FFCC. CLRCHN on lyhenne sanoista CLEaR CHanneL. Kun looginen tiedosto suljetaan, sen parametrit, kuten loogisen tiedoston numero, laitenumero ja mahdollinen toissijainen osoite, poistetaan. Joten loogisen tiedoston kanava tyhjennetään.

Käsikirja sanoo, että OS CLRCHN -rutiini tyhjentää kaikki avatut kanavat ja palauttaa oletusarvoiset laitenumerot ja muut oletusasetukset. Tarkoittaako tämä, että oheislaitteen laitenumeroa voidaan muuttaa? No ei aivan. Käyttöjärjestelmän alustuksen aikana $0099-osoitteen tavusijainti annetaan DFLTI-tarralla, joka sisältää nykyisen syöttölaitteen numeron tietokoneen ollessa käynnissä. Commodore-64 voi käyttää vain yhtä oheislaitetta kerrallaan. Käyttöjärjestelmän alustuksen aikana $009A-osoitteen tavusijainti annetaan DFLTO-tunnisteella, joka sisältää nykyisen tulostuslaitteen numeron, kun tietokone on käynnissä.

Kun CLRCHN-alirutiini kutsutaan, se asettaa DFLTI-muuttujaksi 0 ($00), joka on oletussyöttölaitteen numero (näppäimistö). Se asettaa DFLTO-muuttujaksi 3 ($03), joka on oletuslähtölaitteen numero (näyttö). Muut laitenumeromuuttujat nollataan samalla tavalla. Tämä tarkoittaa syöttö-/tulostuslaitteiden nollaamista (tai palauttamista) normaaleihin (oletusarvoihin).

Commodore-64-käsikirja sanoo, että CLRCHN-rutiinin kutsun jälkeen avatut loogiset tiedostot pysyvät avoimina ja voivat silti lähettää tavuja (dataa). Tämä tarkoittaa, että CLRCHN-rutiini ei poista vastaavia merkintöjä tiedostotaulukoista. CLRCHN-nimi on merkityksensä suhteen melko moniselitteinen.

5.6 Hahmon lähettäminen näytölle

Pääintegroitua piiriä (IC), joka käsittelee merkkien ja grafiikan näyttöä näytölle, kutsutaan Video Interface Controlleriksi (siruksi), josta käytetään lyhennettä VIC Commodore-64:ssä (itse asiassa VIC II VIC-versiolle 2). Jotta tieto (arvot) pääsisi näytölle, sen on läpäistävä VIC II ennen kuin se saavuttaa näytön.

Näyttö koostuu 25 rivistä ja 40 sarakkeesta merkkisoluja. Tämä tekee 40 x 25 = 1000 merkkiä, jotka voidaan näyttää näytöllä. VIC II lukee vastaavasti 1000 RAM-muistin peräkkäistä tavupaikkaa merkkejä varten. Näitä 1000 sijaintia yhdessä kutsutaan näyttömuistiksi. Näihin 1000 paikkaan menee merkkikoodit. Commodore-64:n merkkikoodit eroavat ASCII-koodeista.

Merkkikoodi ei ole merkkikuvio. On myös niin kutsuttu merkki-ROM. Merkki-ROM koostuu kaikenlaisista merkkikuvioista, joista osa vastaa näppäimistön merkkikuvioita. Merkki-ROM eroaa näytön muistista. Kun merkki näytetään näytöllä, merkkikoodi lähetetään johonkin kohtaan näytön muistin 1000 paikan joukossa. Sieltä vastaava kuvio valitaan ruudulla näytettävästä merkki-ROM-muistista. VIC II (laitteisto) valitsee oikean kuvion merkki-ROM-muistista merkkikoodista.

Monilla muistipaikoilla välillä $D000 ja $DFFF on kaksi tarkoitusta: niitä käytetään käsittelemään muita syöttö-/tulostustoimintoja kuin näyttöä tai niitä käytetään näytön merkki-ROMina. Kyseessä on kaksi muistilohkoa. Toinen on RAM-muisti ja toinen ROM merkki-ROMille. Pankkien vaihtaminen joko syötteen/tulostuksen tai merkkikuvioiden (merkki-ROM) käsittelemiseksi tapahtuu ohjelmistolla (ROM-muistissa olevan käyttöjärjestelmän rutiini arvosta $F000 - $FFFF).

Huomautus : VIC:ssä on rekistereitä, jotka on osoitettu muistitilan osoitteilla välillä $D000 ja $DFFF.

CHROUT-rutiini
OS CHROUT -rutiiniin päästään hyppäämällä (JSR) OS ROM -hyppytaulukkoon kohdassa $FFD2. Tämä rutiini, kun sitä kutsutaan, ottaa tavun, jonka ohjelmoija on laittanut µP-akkuun ja tulostaa näytölle, jossa kohdistin on. Koodisegmentti esimerkiksi 'E'-merkin tulostamiseksi on:

LDA #$05
CHROUT

0516 ei ole 'E':n ASCII-koodi. Commodore-64:ssä on omat merkkikoodinsa näytölle, jossa $05 tarkoittaa 'E'. #$05 numero sijoitetaan näytön muistiin ennen kuin VIC lähettää sen näytölle. Näiden kahden koodausrivin pitäisi tulla sen jälkeen, kun kanava on asetettu, looginen tiedosto avataan ja CHKOUT-rutiini kutsutaan ulostuloksi. Täydellinen koodi on:

; Aseta kanava
LDA #$40 ; looginen tiedostonumero
LDX #$03 ; näytön laitenumero on 03 dollaria
LDY #$FF ; ei toissijaista osoitetta
JSR SETLFS ; aseta oikea kanava
; ei SETNAM, koska näyttö ei tarvitse nimeä
;
; Avaa looginen tiedosto
JSR AUKI
; Aseta kanava ulostulolle
LDX #$40 ; looginen tiedostonumero
JSR CHKOUT
;
; Tuo merkki näytölle
LDA #$05
JSR CHROUT
; Sulje looginen tiedosto
LDA #$40
JSR SULJETTU

Aukko tulee sulkea ennen kuin toinen ohjelma suoritetaan. Oletetaan, että tietokoneen käyttäjä kirjoittaa merkin näppäimistölle odotetusti. Seuraava ohjelma tulostaa merkin näppäimistöltä näytölle:

; Aseta kanava
LDA #$40 ; looginen tiedostonumero
LDX #$03 ; näytön laitenumero on 03 dollaria
LDY #$FF ; ei toissijaista osoitetta
JSR SETLFS ; aseta oikea kanava
; ei SETNAM, koska näyttö ei tarvitse nimeä
;
; Avaa looginen tiedosto
JSR AVOIN
; Aseta kanava ulostulolle
LDX #$40 ; looginen tiedostonumero
JSR CHKOUT
;
; Syötä merkki näppäimistöltä
ODOTA JSR GETIN ; asettaa 00 dollaria A:han, jos näppäimistöjono on tyhjä
CMP #$00 ; Jos 00 dollaria meni A:lle, niin Z on 1 vertailussa
BEQ ODOTA ; GETIN uudelleen jonosta, jos 0 meni varaajaan
BNE PRNSCRN ; siirry PRNSCRN:ään, jos Z on 0, koska A:lla ei ole enää 00 dollaria
; Tuo merkki näytölle
PRNSCRN JSR CHROUT ; lähetä merkki kohdassa A näytölle
; Sulje looginen tiedosto
LDA #$40
JSR SULJETTU

Huomautus : WAIT ja PRNSCRN ovat tarrat, jotka tunnistavat osoitteet. Näppäimistön tavu, joka saapuu µP-akulle, on ASCII-koodi. Commodore-64:n näytölle lähettämän vastaavan koodin on oltava erilainen. Sitä ei ole otettu huomioon edellisessä ohjelmassa yksinkertaisuuden vuoksi.

5.7 Levyaseman tavujen lähettäminen ja vastaanottaminen

Commodore-64:n järjestelmäyksikössä (emolevyssä) on kaksi monimutkaista liitäntäsovitinta nimeltä VIA #1 ja CIA #2. Jokaisella CIA:lla on kaksi rinnakkaisporttia, joita kutsutaan portteiksi A ja portiksi B. Commodre-64-järjestelmäyksikön takaosassa on ulkoinen portti, jota kutsutaan sarjaportiksi. Tässä portissa on 6 nastaa, joista yksi on dataa varten. Data tulee järjestelmäyksikköön tai lähtee siitä sarjassa bitti kerrallaan.

Esimerkiksi kahdeksan rinnakkaista bittiä CIA #2:n sisäisestä portista A voi mennä ulos järjestelmäyksiköstä ulkoisen sarjaportin kautta sen jälkeen kun ne on muunnettu sarjatiedoiksi CIA:n siirtorekisterillä. Kahdeksan bitin sarjadata ulkoisesta sarjaportista voi mennä CIA #2:n sisäiseen porttiin A sen jälkeen kun ne on muunnettu rinnakkaistiedoiksi CIA:n siirtorekisterillä.

Commodore-64-järjestelmäyksikkö (perusyksikkö) käyttää ulkoista levyasemaa, jossa on levyke. Tulostin voidaan liittää tähän levyasemaan ketjutettuna (kytkemällä laitteet sarjaan merkkijonona). Levyaseman datakaapeli on kytketty Commodore-64-järjestelmäyksikön ulkoiseen sarjaporttiin. Tämä tarkoittaa, että samaan sarjaporttiin on kytketty myös ketjutettu tulostin. Nämä kaksi laitetta tunnistetaan kahdella eri laitenumerolla (tyypillisesti 8 ja 4, vastaavasti).

Levyaseman tietojen lähettäminen tai vastaanottaminen noudattaa samaa menettelyä kuin aiemmin on kuvattu. Tuo on:

  • Loogisen tiedoston nimen (numeron) asettaminen, joka on sama kuin todellisen levytiedoston nimi SETNAM-rutiinilla.
  • Loogisen tiedoston avaaminen OPEN-rutiinilla.
  • Päätetään, syötetäänkö vai tulostetaanko se CHKOUT- tai CHKIN-rutiinilla.
  • Tietojen lähettäminen tai vastaanottaminen STA- ja/tai LDA-käskyn avulla.
  • Loogisen tiedoston sulkeminen CLOSE-rutiinilla.

Looginen tiedosto on suljettava. Loogisen tiedoston sulkeminen sulkee tehokkaasti kyseisen kanavan. Kun määrität kanavaa levyasemalle, ohjelmoija päättää loogisen tiedostonumeron. Se on luku välillä $ 00 ja $ FF (mukaan lukien). Se ei saa olla numero, joka on jo valittu toiselle laitteelle (tai tiedostolle). Laitenumero on 8, jos levyasemaa on vain yksi. Toissijainen osoite (numero) saadaan levyaseman käsikirjasta. Seuraava ohjelma käyttää 2. Ohjelma kirjoittaa kirjaimen “E” (ASCII) levyllä olevaan tiedostoon nimeltä “mydoc.doc”. Tämän nimen oletetaan alkavan muistiosoitteesta $C101. Joten $01:n alemman tavun on oltava X-rekisterissä ja $C1:n ylemmän tavun on oltava Y-rekisterissä ennen kuin SETNAM-rutiini kutsutaan. A-rekisterissä tulee olla myös $09-numero ennen SETNAM-rutiinin kutsumista.

; Aseta kanava
LDA #$40 ; looginen tiedostonumero
LDX #$08 ; ensimmäisen levyaseman laitenumero
LDY #$02 ; toissijainen osoite
JSR SETLFS ; aseta oikea kanava
;
; Levyasemassa oleva tiedosto tarvitsee nimen (jo muistissa)
LDA #$09
LDX #$01
LDY#$C1
JSR SETNAM
; Avaa looginen tiedosto
JSR AUKI
; Aseta kanava ulostulolle
LDX #$40 ; looginen tiedostonumero
JSR CHKOUT ;kirjoittamiseen
;
; Tuo char levylle
LDA #$45
JSR CHROUT
; Sulje looginen tiedosto
LDA #$40
JSR SULJETTU

Jos haluat lukea tavun levyltä µP Y -rekisteriin, toista edellinen ohjelma seuraavin muutoksin: 'JSR CHKOUT ; kirjoittamiseen', käytä 'JSR CHKIN ; lukemista varten”. Korvaa koodisegmentti '; Tuo char levylle' seuraavasti:

; Syötä char levyltä
JSR CHRIS

OS CHRIN -rutiiniin päästään hyppäämällä (JSR) OS ROM -hyppytaulukkoon osoitteessa $FFCF. Tämä rutiini, kun sitä kutsutaan, saa tavun kanavalta, joka on jo asetettu tulokanavaksi, ja sijoittaa sen µP A -rekisteriin. GETIN ROM OS -rutiinia voidaan käyttää myös CHRIN:n sijaan.

Tavun lähettäminen tulostimeen
Tavun lähettäminen tulostimelle tapahtuu samalla tavalla kuin tavun lähettäminen levyllä olevaan tiedostoon.

5.8 OS SAVE -rutiini

OS SAVE -rutiiniin päästään hyppäämällä (JSR) OS ROM -hyppytaulukkoon hintaan $FFD8. OS SAVE -rutiini ROM-muistissa tallentaa (vedättää) osan muistista levylle tiedostona (nimellä). Muistissa olevan osan aloitusosoite on tiedettävä. Jakson loppuosoite on myös tiedettävä. Aloitusosoitteen alempi tavu sijoitetaan sivun nollaan RAM-muistissa $002B-osoitteeseen. Aloitusosoitteen suurempi tavu sijoitetaan seuraavan tavun muistipaikkaan $002C-osoitteessa. Sivulla nolla TXTTAB-tunniste viittaa näihin kahteen osoitteeseen, vaikka TXTTAB tarkoittaa itse asiassa $002B-osoitetta. Loppuosoitteen alempi tavu sijoitetaan µP X -rekisteriin. Loppuosoitteen korkeampi tavu plus 1 sijoitetaan µP Y -rekisteriin. µP A -rekisteri saa arvon $2B TXTTAB:lle ($002B). Sen avulla SAVE-rutiini voidaan kutsua seuraavilla tavoilla:

JSR SAVE

Tallennettava muistin osa voi olla assembly-kieliohjelma tai dokumentti. Esimerkki asiakirjasta voi olla kirje tai essee. Jotta voit käyttää tallennusrutiinia, sinun tulee noudattaa seuraavaa menettelyä:

  • Aseta kanava SETLFS-rutiinilla.
  • Aseta loogisen tiedoston nimi (numero), joka on sama kuin todellisen levytiedoston nimi SETNAM-rutiinilla.
  • Avaa looginen tiedosto OPEN-rutiinilla.
  • Tee siitä tiedosto tulosteelle CHKOUT-toiminnolla.
  • Tiedoston tallennuskoodi menee tähän, joka päättyy 'JSR SAVE'.
  • Sulje looginen tiedosto CLOSE-rutiinilla.

Seuraava ohjelma tallentaa tiedoston, joka alkaa muistipaikoista $C101 - $C200:

; Aseta kanava
LDA #$40 ; looginen tiedostonumero
LDX #$08 ; ensimmäisen levyaseman laitenumero
LDY #$02 ; toissijainen osoite
JSR SETLFS ; aseta oikea kanava
;
; Levyasemassa olevan tiedoston nimi (jo muistissa $C301)
LDA #$09 ; tiedostonimen pituus
LDX #$01
LDY#$C3
JSR SETNAM
; Avaa looginen tiedosto
JSR AVOIN
; Aseta kanava ulostulolle
LDX #$40 ; looginen tiedostonumero
JSR CHKOUT ; kirjoittamista varten
;
; Tulosta tiedosto levylle
LDA #$01
STA $2B ; TXTTAB
LDA #$C1
STA $2C
LDX #$00
LDY#$C2
LDA #$2B
JSR SAVE
; Sulje looginen tiedosto
LDA #$40
JSR SULJETTU

Huomaa, että tämä on ohjelma, joka tallentaa toisen osan muistista (ei ohjelmaosan) levylle (Commodore-64:n levykkeelle).

5.9 OS LOAD -rutiini

OS LOAD -rutiiniin päästään hyppäämällä (JSR) käyttöjärjestelmän ROM-hyppytaulukkoon $FFD5:ssä. Kun osa (suuri alue) muistista tallennetaan levylle, se tallennetaan otsikolla, jossa on muistissa olevan osan aloitusosoite. OS LOAD -alirutiini lataa tiedoston tavut muistiin. Tällä LOAD-toiminnolla akun arvon on oltava 010 ($00). Jotta LOAD-toiminto voisi lukea aloitusosoitteen levyn tiedoston otsikosta ja sijoittaa tiedostotavut RAM-muistiin tästä osoitteesta alkaen, kanavan toissijaisen osoitteen on oltava 1 tai 2 (seuraava ohjelma käyttää numeroa 2). Tämä rutiini palauttaa osoitteen plus 1 korkeimmasta ladatusta RAM-sijainnista. Tämä tarkoittaa, että RAM-muistissa olevan tiedoston viimeisen osoitteen alempi tavu plus 1 sijoitetaan µP X -rekisteriin ja RAM plus 1:n tiedoston viimeisen osoitteen ylempi tavu µP Y -rekisteriin.

Jos lataus ei onnistu, µP A -rekisterissä on virhenumero (mahdollisesti 4, 5, 8 tai 9). Myös mikroprosessorin tilarekisterin C-lippu on asetettu (tehty 1). Jos lataus onnistuu, A-rekisterin viimeisellä arvolla ei ole merkitystä.

Nyt tämän online-urakurssin edellisessä luvussa asennuskieliohjelman ensimmäinen ohje on siinä RAM-osoitteessa, josta ohjelma aloitettiin. Sen ei tarvitse olla sellaista. Tämä tarkoittaa, että ohjelman ensimmäisen käskyn ei tarvitse olla ohjelman alussa RAM-muistissa. Ohjelman aloitusohje voi olla missä tahansa RAM-muistin tiedostossa. Ohjelmoijaa kehotetaan merkitsemään asennuskielen aloitusohjeet merkillä START. Sen jälkeen, kun ohjelma on ladattu, se suoritetaan (suoritetaan) uudelleen seuraavilla kokoonpanokielen ohjeilla:

JSR START

'JSR START' on konekieliohjelmassa, joka lataa ajettavan ohjelman. Kokoonpanokielellä, joka lataa toisen kokoonpanokielitiedoston ja ajaa ladatun tiedoston, on seuraava koodimenettely:

  • Aseta kanava SETLFS-rutiinilla.
  • Aseta loogisen tiedoston nimi (numero), joka on sama kuin todellisen levytiedoston nimi SETNAM-rutiinilla.
  • Avaa looginen tiedosto OPEN-rutiinilla.
  • Tee siitä syötettävä tiedosto CHKIN-koodilla.
  • Tiedoston latauskoodi menee tähän ja päättyy 'JSR LOAD'.
  • Sulje looginen tiedosto CLOSE-rutiinilla.

Seuraava ohjelma lataa tiedoston levyltä ja suorittaa sen:

; Aseta kanava
LDA #$40 ; looginen tiedostonumero
LDX #$08 ; ensimmäisen levyaseman laitenumero
LDY #$02 ; toissijainen osoite
JSR SETLFS ; aseta oikea kanava
;
; Levyasemassa olevan tiedoston nimi (jo muistissa $C301)
LDA #$09 ; tiedostonimen pituus
LDX #$01
LDY #$C3
JSR SETNAM
; Avaa looginen tiedosto
JSR AVOIN
; Aseta kanava tuloa varten
LDX #$40 ; looginen tiedostonumero
JSR CHKIN ; lukemista varten
;
; Syötä tiedosto levyltä
LDA #$00
JSR LOAD
; Sulje looginen tiedosto
LDA #$40
JSR SULJETTU
; Käynnistä ladattu ohjelma
JSR START

5.10 Modeemi ja RS-232-standardi

Modeemi on laite (oheislaite), joka muuntaa tietokoneen bitit vastaaviksi sähköisiksi äänisignaaleiksi, jotka lähetetään puhelinlinjan kautta. Vastaanottopäässä on modeemi ennen vastaanottavaa tietokonetta. Tämä toinen modeemi muuntaa sähköiset äänisignaalit biteiksi vastaanottavaa tietokonetta varten.

Modeemi on liitettävä tietokoneeseen ulkoiseen porttiin (tietokoneen pystypinnalla). RS-232-standardi viittaa tietyntyyppiseen liittimeen, joka yhdistää modeemin tietokoneeseen (aiemmin). Toisin sanoen monissa tietokoneissa aiemmin oli ulkoinen portti, joka oli RS-232-liitin tai RS-232-yhteensopiva liitin.

Commodore-64-järjestelmäyksikön (tietokoneen) pystysuorassa takapinnassa on ulkoinen portti, jota kutsutaan käyttäjäportiksi. Tämä käyttäjäportti on RS-232-yhteensopiva. Sinne voidaan liittää modeemilaite. Commodore-64 kommunikoi modeemin kanssa tämän käyttäjäportin kautta. Commodore-64:n ROM-käyttöjärjestelmässä on alirutiinit kommunikoidakseen modeemin kanssa, nimeltään RS-232-rutiinit. Näillä rutiineilla on merkinnät hyppytaulukossa.

Tiedonsiirtonopeus
Tietokoneen kahdeksan bitin tavu muunnetaan kahdeksan bitin sarjaksi ennen kuin se lähetetään modeemiin. Käänteinen tapahtuu modeemista tietokoneeseen. Tiedonsiirtonopeus on sekunnissa sarjassa lähetettyjen bittien määrä.

Muistin pohja
Termi 'Muistin pohja' ei tarkoita $0000-osoitteen muistitavun sijaintia. Se viittaa alhaisimpaan RAM-paikkaan, johon käyttäjä voi alkaa sijoittaa tietojaan ja ohjelmiaan. Oletuksena se on 0800 dollaria. Muista edellisestä keskustelusta, että BASIC-tietokonekieli ja sen ohjelmoijat (käyttäjät) käyttävät monia paikkoja välillä $0800 - $BFFF. Vain $C000 - $CFFF osoitepaikat jätetään käytettäväksi assembly-kieliohjelmia ja -tietoja varten; tämä on 4 kilotavua muistin 64 kilotavusta.

Muistin yläosa
Siihen aikaan, kun asiakkaat ostivat Commodore-64-tietokoneita, joissakin ei ollut kaikkia muistipaikkoja mukana. Tällaisissa tietokoneissa oli ROM käyttöjärjestelmällään välillä $E000 - $FFFF. Heillä oli RAM-muistia 0000 dollarista rajaan, joka ei ole DFFF dollaria, E000 dollarin vieressä. Raja oli alle $DFFF ja sitä kutsutaan 'Muistin yläpuolelle'. Joten muistin yläosa ei viittaa $FFFF-sijaintiin.

Commodore-64 puskurit RS-232-tiedonsiirtoa varten
Lähetetään puskuria
RS-232-lähetyksen puskuri (lähtö) vie 256 tavua muistin yläosasta alaspäin. Tämän lähetyspuskurin osoitin on merkitty nimellä ROBUF. Tämä osoitin on sivulla nolla ja $00F9-osoitteita seuraa $00FA. ROBUF todella tunnistaa $00F9. Joten jos puskurin aloitusosoite on $BE00, $BE00:n alempi tavu, joka on $00, on paikassa $00F9 ja ylempi tavu $BE00, joka on $BE, on $00FA:ssa. sijainti.

Vastaanottopuskuri
Puskuri RS-232 tavun (tulon) vastaanottamiseksi ottaa 256 tavua lähetyspuskurin pohjalta. Tämän vastaanottopuskurin osoitin on merkitty nimellä RIBUF. Tämä osoitin on sivulla nolla $00F7-osoitteilla, joita seuraa $00F8. RIBUF todella tunnistaa $00F7. Joten jos puskurin aloitusosoite on $BF00, $BF00:n alempi tavu, joka on $00, on paikassa $00F7 ja $BF00:n ylempi tavu, joka on $BF, on $00F8:ssa. sijainti. Joten 512 tavua muistin yläosasta käytetään RS-232-RAM-puskurina.

RS-232 kanava
Kun modeemi on kytketty (ulkoiseen) käyttäjäporttiin, viestintä modeemiin on vain RS-232-tietoliikennettä. Menettely täydellisen RS-232-kanavan saamiseksi on melkein sama kuin edellisessä keskustelussa, mutta yhdellä tärkeällä erolla: tiedostonimi on koodi eikä merkkijono muistissa. Koodi $0610 on hyvä valinta. Se tarkoittaa siirtonopeutta 300 bittiä/s ja joitain muita teknisiä parametreja. Lisäksi ei ole toissijaista osoitetta. Huomaa, että laitenumero on 2. Täydellinen RS-232-kanava määritetään seuraavasti:

  • Kanavan asettaminen SETLFS-rutiinilla.
  • Loogisen tiedoston nimen asettaminen, $0610.
  • Loogisen tiedoston avaaminen OPEN-rutiinilla.
  • Muutetaan tiedosto tulostettavaksi CHKOUT-komennolla tai tiedosto syötettäväksi CHKIN-komennolla.
  • Yksittäisten tavujen lähettäminen CHROUTilla tai yksittäisten tavujen vastaanottaminen GETINillä.
  • Loogisen tiedoston sulkeminen CLOSE-rutiinilla.

OS GETIN -rutiiniin päästään hyppäämällä (JSR) OS ROM -hyppytaulukkoon osoitteessa $FFE4. Tämä rutiini, kun sitä kutsutaan, ottaa tavun, joka lähetetään vastaanotinpuskuriin ja laittaa (palauttaa) sen µP-akkuihin.

Seuraava ohjelma lähettää tavun “E” (ASCII) modeemiin, joka on kytketty käyttäjän RS-232-yhteensopivaan porttiin:

; Aseta kanava
LDA #$40 ; looginen tiedostonumero
LDX #$02 ; laitenumero RS-232:lle
LDY #$FF ; ei toissijaista osoitetta
JSR SETLFS ; aseta oikea kanava
;
; RS-232:n nimi on koodi esim. 0610 dollaria
LDA #$02 ; koodin pituus on 2 tavua
LDX #10 dollaria
LDY#$06
JSR SETNAM
;
; Avaa looginen tiedosto
JSR AVOIN
; Aseta kanava ulostulolle
LDX #$40 ; looginen tiedostonumero
JSR CHKOUT
;
; Lähtömerkki RS-232:lle esim. modeemi
LDA #$45
JSR CHROUT
; Sulje looginen tiedosto
LDA #$40
JSR SULJETTU

Tavun vastaanottamiseksi koodi on hyvin samanlainen, paitsi että 'JSR CHKOUT' korvataan 'JSR CHKIN' ja:

LDA #$45
JSR CHROUT

korvataan sanalla 'JSR GETIN' ja tulos sijoitetaan A-rekisteriin.

Jatkuva tavujen lähetys tai vastaanotto tapahtuu silmukalla koodisegmentin lähettämistä tai vastaanottamista varten.

Huomaa, että Commodoren syöttö ja lähtö ovat samanlaiset useimmissa tapauksissa paitsi näppäimistössä, jossa ohjelmoija ei kutsu kaikkia rutiineja, mutta käyttöjärjestelmä kutsuu niitä.

5.11 Laskenta ja ajoitus

Harkitse laskurisarjaa, joka on:

2, 1, 0

Tämä laskee alas 2:sta nollaan. Harkitse nyt toistuvaa alaslaskentasekvenssiä:

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

Tämä on saman sarjan toistuva laskenta alaspäin. Sarja toistetaan neljä kertaa. Neljä kertaa tarkoittaa, että ajoitus on 4. Yhden sekvenssin sisällä on laskenta. Saman sarjan toistaminen on ajoitusta.

Commodore-64:n järjestelmäyksikössä on kaksi monimutkaista liitäntäsovitinta. Jokaisella CIA:lla on kaksi laskuri/ajastinpiiriä, nimeltään Timer A (TA) ja Timer B (TB). Laskentapiiri ei eroa ajastuspiiristä. Commodore-64:n laskuri tai ajastin viittaa samaan asiaan. Itse asiassa jompikumpi niistä viittaa olennaisesti yhteen 16-bittiseen rekisteriin, joka laskee aina nollaan järjestelmän kellopulsseilla. 16-bittiseen rekisteriin voidaan asettaa erilaisia ​​arvoja. Mitä suurempi arvo, sitä kauemmin kestää laskea alas nollaan. Joka kerta kun yksi ajastimista ylittää nollan, IRQ keskeytyssignaali lähetetään mikroprosessorille. Kun laskenta laskee nollan yli, sitä kutsutaan alivuotoksi.

Riippuen siitä, miten ajastinpiiri on ohjelmoitu, ajastin voi toimia kerta- tai jatkuvassa tilassa. Edellisessä kuvassa kertatila tarkoittaa 'tee 2, 1, 0' ja lopeta kellon pulssien jatkuvan. Jatkuva tila on kuin '2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0 jne.' joka jatkuu kellon sykeillä. Tämä tarkoittaa, että kun se ylittää nollan, jos käskyä ei anneta, lähtölaskenta toistuu. Suurin luku on yleensä paljon suurempi kuin 2.

CIA #1:n ajastin A (TA) luo IRQ säännöllisin väliajoin (kestoina) huoltaaksesi näppäimistöä. Itse asiassa tämä on itse asiassa oletuksena 1/60 sekunnin välein. IRQ lähetetään mikroprosessorille 1/60 sekunnin välein. Se on vain kun IRQ lähetetään, että ohjelma voi lukea avainarvon näppäimistöjonosta (puskurista). Muista, että mikroprosessorissa on vain yksi nasta IRQ signaali. Mikroprosessorissa on myös vain yksi nasta NMI signaali. ¯NMI-signaali mikroprosessorille tulee aina CIA:lta #2.

16-bittisessä ajastinrekisterissä on kaksi muistiosoitetta: yksi alemmalle tavulle ja toinen korkeammalle tavulle. Jokaisella CIA:lla on kaksi ajastinpiiriä. Nämä kaksi CIA:ta ovat identtisiä. CIA #1:ssä näiden kahden ajastimen osoitteet ovat: DC04 ja DC05 TA:lle ja DC06 ja DC07 TB:lle. CIA #2:ssa näiden kahden ajastimen osoitteet ovat: DD04 ja DD05 TA:lle ja DD06 ja DD07 TB:lle.

Oletetaan, että numero 25510 lähetetään CIA #2:n TA-ajastimeen alaslaskentaa varten. 25510 = 00000000111111112 on kuusitoista bittiä. 00000000111111112 = $000FFF on heksadesimaaliluku. Tässä tapauksessa $FF lähetetään rekisteriin $DD04-osoitteeseen ja $00 lähetetään rekisteriin $DD05-osoitteeseen - vähän endiannessa. Seuraava koodisegmentti lähettää numeron rekisteriin:

LDA #$FF
VALTIO $ DD04
LDA #$00
VALTA DD05 $

Vaikka CIA:n rekistereillä on RAM-osoitteet, ne ovat fyysisesti CIA:ssa ja CIA on erillinen IC RAM:ista tai ROM:ista.

Siinä ei vielä kaikki! Kun ajastimelle on annettu numero alaslaskua varten, kuten edellisellä koodilla, alaslaskenta ei ala. Alaslaskenta alkaa, kun kahdeksan bitin tavu on lähetetty vastaavaan ajastimen ohjausrekisteriin. Tämän tavun ensimmäinen bitti ohjausrekisteriä varten osoittaa, pitäisikö alaslaskenta alkaa vai ei. Tämän ensimmäisen bitin arvo 0 tarkoittaa alaslaskemisen lopettamista, kun taas arvo 1 tarkoittaa alaslaskennan aloittamista. Lisäksi tavun tulee osoittaa, onko alaslaskeminen yhden laukauksen (kertaluonteinen) tilassa vai vapaassa juoksutilassa (jatkuva tila). Kertakuvaustila laskee alaspäin ja pysähtyy, kun ajastinrekisterin arvo on nolla. Vapaakäyntitilassa laskenta toistuu nollan saavuttamisen jälkeen. Ohjausrekisteriin lähetettävän tavun neljäs (indeksi 3) bitti ilmaisee tilan: 0 tarkoittaa vapaata käyntiä ja 1 yhden laukauksen tilaa.

Sopiva numero laskemisen aloittamiseen yhden laukauksen tilassa on 000010012 = 09 dollaria heksadesimaalimuodossa. Sopiva numero laskennan aloittamiseen vapaassa juoksutilassa on 000000012 = $01 heksadesimaalimuodossa. Jokaisella ajastinrekisterillä on oma ohjausrekisteri. CIA #1:ssä ajastimen A ohjausrekisterin RAM-osoite on DC0E16 ja ajastimen B ohjausrekisterin RAM-osoite DC0F16. CIA #2:ssa ajastimen A ohjausrekisterin RAM-osoite on DD0E16 ja ajastimen B ohjausrekisterin RAM-osoite on DD0F16. Käytä seuraavaa koodia aloittaaksesi 16-bittisen luvun alaslaskemisen CIA #2:n TA:ssa kertaluonteisessa tilassa:

LDA #$09
STA $DD0E

Käytä seuraavaa koodia aloittaaksesi 16-bittisen luvun alaslaskemisen CIA #2:n TA:ssa vapaassa toimintatilassa:

LDA #$01
STA $DD0E

5.12 IRQ ja NMI Pyynnöt

6502-mikroprosessorissa on IRQ ja NMI viivat (nastat). Sekä CIA #1 että CIA #2 ovat kummallakin IRQ nasta mikroprosessorille. The IRQ CIA #2 -nasta on kytketty NMI µP:n tappi. The IRQ CIA #1 -nasta on kytketty IRQ µP:n tappi. Nämä ovat ainoat kaksi keskeytyslinjaa, jotka yhdistävät mikroprosessorin. Joten IRQ CIA #2 pinni on NMI lähde ja voidaan nähdä myös ¯NMI-linjana.

CIA #1:llä on viisi mahdollista välitöntä lähdettä IRQ signaali µP:lle. CIA #2 on rakenteeltaan sama kuin CIA #1. Joten CIA #2:lla on samat viisi mahdollista välitöntä lähdettä keskeytyssignaalin generoimiseksi tällä kertaa, mikä on NMI signaali. Muista, että kun µP vastaanottaa NMI signaali, jos se käsittelee IRQ pyynnöstä, se keskeyttää sen ja käsittelee NMI pyyntö. Kun se on käsitellyt NMI pyyntöä, se jatkaa sitten tiedoston käsittelyä IRQ pyyntö.

CIA #1 on tavallisesti kytketty ulkoisesti näppäimistöön ja pelilaitteeseen, kuten ohjaussauvaan. Näppäimistö käyttää enemmän CIA #1:n porttia A kuin porttia B. Pelilaite käyttää enemmän CIA #1 -porttia B kuin sen portti A. CIA #2 on normaalisti kytketty ulkoisesti levyasemaan (ketjutettu tulostimeen) ja modeemi. Levyasema käyttää enemmän CIA #2 -porttia A (tosin ulkoisen sarjaportin kautta) kuin porttiaan B. Modeemi (RS-232) käyttää enemmän CIA #2 -porttia B kuin porttiaan A.

Kaiken tämän kanssa, mistä järjestelmäyksikkö tietää, mikä aiheuttaa IRQ tai NMI keskeyttää? CIA #1:llä ja CIA #2:lla on viisi välitöntä keskeytyslähdettä. Jos keskeytyssignaali µP:lle on NMI , lähde on yksi viidestä CIA #2:n välittömästä lähteestä. Jos keskeytyssignaali µP:lle on IRQ , lähde on yksi viidestä CIA #1:n välittömästä lähteestä.

Seuraava kysymys on: 'Miten järjestelmäyksikkö erottaa kunkin CIA:n viisi välitöntä lähdettä?' Jokaisella CIA:lla on kahdeksan bitin rekisteri, jota kutsutaan keskeytysrekisteriksi (ICR). ICR palvelee molempia CIA:n satamia. Seuraavassa taulukossa on esitetty keskeytysohjausrekisterin kahdeksan bitin merkitykset alkaen bitistä 0:

Taulukko 5.13
Keskeytysohjausrekisteri
Bittiindeksi Merkitys
0 Aseta (tehty 1) ajastimen A alivirtauksella
1 Asetettu ajastimen B alivuodon mukaan
2 Aseta, milloin kellonaika on yhtä suuri kuin herätys
3 Aseta, kun sarjaportti on täynnä
4 Ulkoisen laitteen asetus
5 Ei käytetty (valmistettu 0)
6 Ei käytetty (valmistettu 0)
7 Aseta, kun jokin ensimmäisistä viidestä bitistä on asetettu

Kuten taulukosta voidaan nähdä, kutakin välitöntä lähdettä edustaa yksi viidestä ensimmäisestä bitistä. Joten kun keskeytyssignaali vastaanotetaan µP:ssä, koodi on suoritettava keskeytyksen ohjausrekisterin sisällön lukemiseksi, jotta keskeytyksen tarkka lähde tiedetään. CIA #1:n ICR:n RAM-osoite on DC0D16. CIA #2:n ICR:n RAM-osoite on DD0D16. Voit lukea (palauttaa) CIA #1:n ICR:n sisällön µP-akkuun kirjoittamalla seuraavan ohjeen:

LDA$DC0D

Voit lukea (palauttaa) CIA #2:n ICR:n sisällön µP-akkuun kirjoittamalla seuraavan ohjeen:

LDA $DD0D

5.13 Keskeytä taustaohjelma

Näppäimistö katkaisee normaalisti mikroprosessorin 1/60 sekunnin välein. Kuvittele, että ohjelma on käynnissä ja se saavuttaa paikan odottaa näppäintä näppäimistöltä ennen kuin se voi jatkaa alla olevien koodiosien kanssa. Oletetaan, että jos mitään näppäintä ei paineta näppäimistöltä, ohjelma tekee vain pienen silmukan, joka odottaa näppäintä. Kuvittele, että ohjelma on käynnissä ja odotti juuri näppäintä näppäimistöltä heti näppäimistön keskeytyksen jälkeen. Siinä vaiheessa koko tietokone pysähtyy epäsuorasti eikä tee muuta kuin odotussilmukan. Kuvittele, että näppäimistön näppäintä painetaan juuri ennen seuraavan näppäimistökeskeytyksen seuraavaa numeroa. Tämä tarkoittaa, että tietokone ei ole tehnyt mitään noin kuudeskymmenesosaan sekunnissa! Se on pitkä aika, jotta tietokone ei tee mitään, edes Commodore-64:n päivinä. Tietokone olisi voinut tehdä jotain muuta tuona aikana (kesto). Ohjelmassa on monia tällaisia ​​kestoja.

Toinen ohjelma voidaan kirjoittaa toimimaan tällaisilla 'tyhjäkäynnillä'. Sellaisen ohjelman sanotaan toimivan pääohjelman (tai ensimmäisen) taustalla. Helppo tapa tehdä tämä on vain pakottaa muutettu BRK-keskeytyskäsittely, kun näppäimistöltä odotetaan näppäintä.

Osoitin BRK-ohjeisiin
$0316- ja $0317-osoitteiden peräkkäisissä RAM-paikoissa on osoitin (vektori) varsinaiselle BRK-käskyrutiinille. Oletusosoitin asetetaan sinne, kun tietokoneeseen kytketään virta ROM-käyttöjärjestelmästä. Tämä oletusosoitin on osoite, joka osoittaa edelleen käyttöjärjestelmän ROM:n oletusarvoiseen BRK-käskykäsittelijään. Osoitin on 16-bittinen osoite. Osoittimen alempi tavu sijoitetaan $0306-osoitteen tavusijaintiin ja osoittimen korkeampi tavu $0317-tavun sijaintiin.

Toinen ohjelma voidaan kirjoittaa siten, että kun järjestelmä on 'lepotilassa', järjestelmä suorittaa joitakin toisen ohjelman koodeja. Tämä tarkoittaa, että toisen ohjelman on koostuttava aliohjelmista. Kun järjestelmä on 'lepotilassa', joka odottaa näppäintä näppäimistöltä, suoritetaan seuraava alirutiini toiselle ohjelmalle. Ihmisten vuorovaikutus tietokoneen kanssa on hidasta verrattuna järjestelmäyksikön toimintaan.

Tämä ongelma on helppo ratkaista: Aina kun tietokoneen on odotettava näppäintä näppäimistöltä, lisää koodiin BRK-käsky ja korvaa osoitin kohdassa $0316 (ja $0317) toisen aliohjelman osoittimella ( mukautettu) ohjelma. Tällä tavalla molemmat ohjelmat toimisivat keston, joka ei ole paljon pidempi kuin yksin käynnissä oleva pääohjelma.

5.14 Kokoaminen ja kokoaminen

Kokoonpanija korvaa kaikki tarrat osoitteilla. Assembly-kieliohjelma kirjoitetaan yleensä alkamaan tietystä osoitteesta. Kokoonpanon tulosta (kokoonpanon jälkeen) kutsutaan 'objektikoodiksi', jossa kaikki on binäärissä. Tämä tulos on suoritettava tiedosto, jos tiedosto on ohjelma eikä asiakirja. Asiakirja ei ole suoritettava.

Sovellus koostuu useammasta (assembly language) -ohjelmasta. Yleensä on pääohjelma. Tätä tilannetta ei pidä sekoittaa keskeytysohjattujen taustaohjelmien tilanteeseen. Kaikki tässä olevat ohjelmat ovat etualan ohjelmia, mutta siellä on ensimmäinen tai pääohjelma.

Kääntäjä tarvitaan assemblerin sijasta, kun etualan ohjelmia on useampi kuin yksi. Kääntäjä kokoaa jokaisen ohjelman objektikoodiksi. Siinä olisi kuitenkin ongelma: jotkin koodisegmentit menevät päällekkäin, koska ohjelmat ovat todennäköisesti eri ihmisten kirjoittamia. Kääntäjän ratkaisuna on siirtää kaikki päällekkäiset ohjelmat paitsi ensimmäinen muistitilassa, jotta ohjelmat eivät mene päällekkäin. Nyt, kun on kyse muuttujien tallentamisesta, jotkin muuttujien osoitteet olisivat edelleen päällekkäisiä. Ratkaisu tähän on korvata päällekkäiset osoitteet uusilla osoitteilla (lukuun ottamatta ensimmäistä ohjelmaa), jotta ne eivät enää mene päällekkäin. Tällä tavalla eri ohjelmat mahtuvat muistin eri osiin (alueisiin).

Kaiken tämän ansiosta on mahdollista, että yksi rutiini yhdessä ohjelmassa kutsuu rutiinia toisessa ohjelmassa. Joten kääntäjä tekee linkityksen. Linkittäminen tarkoittaa aliohjelman aloitusosoitetta yhdessä ohjelmassa ja sen kutsumista toisessa ohjelmassa; molemmat ovat osa sovellusta. Molempien ohjelmien on käytettävä tätä varten samaa osoitetta. Lopputuloksena on yksi iso objektikoodi, jossa kaikki on binäärissä (bittejä).

5.15 Ohjelman tallentaminen, lataaminen ja suorittaminen

Assembly-kieli kirjoitetaan yleensä jossain muokkausohjelmassa (joka voidaan toimittaa assembler-ohjelman mukana). Editointiohjelma osoittaa, missä ohjelma alkaa ja missä muistissa (RAM) päättyy. Commodore-64:n käyttöjärjestelmän ROM:n Kernal SAVE -rutiini voi tallentaa ohjelman muistiin levylle. Se vain tyhjentää muistin osan (lohkon), joka saattaa sisältää sen käskykutsun levylle. Kutsuva SAVE-käsky kannattaa olla erotettuna tallennettavasta ohjelmasta, jotta kun ohjelma ladataan levyltä muistiin, se ei tallenna itseään uudelleen ajettaessa. Assembly-kieliohjelman lataaminen levyltä on erilainen haaste, koska ohjelma ei voi ladata itseään.

Ohjelma ei voi ladata itseään levyltä RAM-muistiin, jossa se alkaa ja päättyy. Commodore-64:ssä tuohon aikaan tavallisesti toimitettiin BASIC-tulkki BASIC-kieliohjelmien suorittamista varten. Kun koneen (tietokoneen) virta kytketään päälle, se selviää komentokehotteella: VALMIS. Sieltä BASIC-komennot tai -ohjeet voidaan kirjoittaa painamalla “Enter”-näppäintä kirjoittamisen jälkeen. BASIC-komento (ohje) tiedoston lataamiseksi on:

LATAA “tiedostonimi”,8,1

Komento alkaa BASIC varatulla sanalla, joka on LOAD. Tätä seuraa välilyönti ja sitten tiedoston nimi lainausmerkeissä. Laitenumeroa 8 seuraa, jota edeltää pilkku. Levyn toissijaista osoitetta, joka on 1, seuraa pilkku. Tällaisella tiedostolla konekieliohjelman aloitusosoite on levyllä olevan tiedoston otsikossa. Kun BASIC lopettaa ohjelman lataamisen, ohjelman viimeinen RAM-osoite plus 1 palautetaan. Sana 'palautti' tarkoittaa tässä sitä, että viimeisen osoitteen alempi tavu plus 1 laitetaan µP X -rekisteriin ja viimeisen osoitteen suurempi tavu plus 1 µP Y -rekisteriin.

Ohjelman lataamisen jälkeen se on ajettava (suoritettava). Ohjelman käyttäjän tulee tietää suorituksen aloitusosoite muistissa. Tässä tarvitaan jälleen toinen BASIC-ohjelma. Se on SYS-komento. SYS-komennon suorittamisen jälkeen kokoonpanokieliohjelma käynnistyy (ja pysähtyy). Jos näppäimistöltä tarvitaan syötettä, kokoonpanokieliohjelman tulee ajon aikana ilmoittaa siitä käyttäjälle. Kun käyttäjä on syöttänyt tiedot näppäimistöllä ja painanut “Enter”-näppäintä, kokoonpanokieliohjelma jatkaa toimintaansa käyttämällä näppäimistön syöttöä ilman BASIC-tulkin häiriöitä.

Olettaen, että Assembly Language -ohjelman suorituksen (ajon) RAM-osoitteen alku on C12316, C123 muunnetaan peruskymmeneksi ennen kuin sitä käytetään SYS-komennon kanssa. C12316:n muuntaminen peruskymmeneksi tapahtuu seuraavasti:

Joten BASIC SYS -komento on:

SYS 49443

5.16 Käynnistys Commodore-64:lle

Commodore-64:n käynnistys koostuu kahdesta vaiheesta: laitteiston palautusvaiheesta ja käyttöjärjestelmän alustusvaiheesta. Käyttöjärjestelmä on Kernal ROMissa (eikä levyllä). Siellä on nollauslinja (itse asiassa RES ), joka liitetään nastaan ​​6502 µP:ssä ja samaan nastan nimeen kaikissa erikoisaluksissa, kuten CIA 1, CIA 2 ja VIC II. Nollausvaiheessa tämän linjan ansiosta kaikki rekisterit µP:ssä ja erityisissä siruissa nollataan nollaan (nollataan jokaiselle bitille). Seuraavaksi mikroprosessorin laitteisto antaa pinoosoittimen ja prosessorin tilarekisterin alkuarvoineen mikroprosessorissa. Ohjelmalaskuri annetaan sitten arvolla (osoitteella) $FFFC- ja $FFFD-paikoissa. Muista, että ohjelmalaskuri pitää sisällään seuraavan käskyn osoitteen. Tässä oleva sisältö (osoite) on aliohjelmalle, joka aloittaa ohjelmiston alustuksen. Kaikki tähän mennessä on tehty mikroprosessorilaitteistolla. Koko muistiin ei puututa tässä vaiheessa. Seuraava alustusvaihe alkaa sitten.

Alustus suoritetaan joillakin ROM-käyttöjärjestelmän rutiineilla. Alustus tarkoittaa alku- tai oletusarvojen antamista joillekin rekistereille erikoissiruissa. Alustus alkaa antamalla aloitus- tai oletusarvot joillekin rekistereille erikoissiruissa. IRQ Esimerkiksi, on alettava antaa 1/60 sekunnin välein. Joten sen vastaava ajastin CIA #1:ssä on asetettava oletusarvoonsa.

Seuraavaksi Kernal suorittaa RAM-testin. Se testaa jokaista sijaintia lähettämällä tavun sijaintiin ja lukemalla sen takaisin. Jos on eroa, ainakin sijainti on huono. Kernal tunnistaa myös muistin yläosan ja muistin alaosan ja asettaa vastaavat osoittimet sivulla 2. Jos muistin yläreuna on $DFFF, $FF sijoitetaan kohtaan $0283 ja $DF sijoitetaan $0284 tavun sijaintiin. Sekä 0283 dollarilla että 0284 dollarilla on HIRAM-merkki. Jos muistin alaosa on $0800, $00 laitetaan $0281-sijaintiin ja $08 asetetaan $0282-sijaintiin. Sekä $0281 että $0282 on merkitty LORAM. RAM-testi alkaa itse asiassa 0300 dollarista muistin (RAM) yläosaan.

Lopuksi tulo/tulostusvektorit (osoittimet) asetetaan oletusarvoihinsa. RAM-testi alkaa itse asiassa 0300 dollarista muistin (RAM) yläosaan. Tämä tarkoittaa, että sivu 0, sivu 1 ja sivu 2 alustetaan. Erityisesti sivulla 0 on paljon käyttöjärjestelmän ROM-osoittimia ja sivulla 2 on paljon PERUSosoittimia. Näitä osoittimia kutsutaan muuttujiksi. Muista, että sivu 1 on pino. Osoittimia kutsutaan muuttujiksi, koska niillä on nimet (tunnisteet). Tässä vaiheessa näytön muisti tyhjennetään näytölle (näytölle). Tämä tarkoittaa 20 dollarin koodin lähettämistä tilaa varten (joka on sama kuin ASCII 20 dollaria) 1000 RAM-näytön sijaintiin. Lopuksi Kernal käynnistää BASIC-tulkin näyttämään PERUS-komentokehotteen, joka on VALMIS näytön (näytön) yläosassa.

5.17 Ongelmia

Lukijaa kehotetaan ratkaisemaan kaikki luvun ongelmat ennen siirtymistä seuraavaan lukuun.

  1. Kirjoita kokoonpanokielikoodi, joka tekee kaikki CIA #2 -portin A bitit ulostuloksi ja CIA #2 -portin B tuloksi.
  2. Kirjoita 6502-kokoonpanokielikoodi, joka odottaa näppäimistön näppäintä, kunnes sitä painetaan.
  3. Kirjoita 6502-kokoonpanokieliohjelma, joka lähettää 'E'-merkin Commodore-64:n näyttöön.
  4. Kirjoita 6502-kokoonpanokieliohjelma, joka ottaa merkin näppäimistöltä ja lähettää sen Commodore-64-näyttöön jättäen huomioimatta näppäinkoodin ja ajoituksen.
  5. Kirjoita 6502-kokoonpanokieliohjelma, joka vastaanottaa tavun Commodore-64-levykkeeltä.
  6. Kirjoita 6502-kokoonpanokieliohjelma, joka tallentaa tiedoston Commodore-64-levykkeelle.
  7. Kirjoita 6502-assembly-ohjelma, joka lataa ohjelmatiedoston Commodore-64-levykkeeltä ja käynnistää sen.
  8. Kirjoita 6502-kokoonpanokieliohjelma, joka lähettää tavun 'E' (ASCII) modeemiin, joka on kytketty Commodore-64:n käyttäjän RS-232-yhteensopivaan porttiin.
  9. Selitä kuinka laskenta ja ajoitus tehdään Commodore-64-tietokoneessa.
  10. Selitä, kuinka Commodore-64-järjestelmäyksikkö voi tunnistaa 10 erilaista välitöntä keskeytyspyyntölähdettä, mukaan lukien ei-maskattavat keskeytyspyynnöt.
  11. Selitä, kuinka taustaohjelma voi toimia etualan ohjelman kanssa Commodore-64-tietokoneessa.
  12. Selitä lyhyesti, kuinka konekieliohjelmat voidaan koota yhdeksi sovellukseksi Commodore-64-tietokoneelle.
  13. Selitä lyhyesti Commodore-64-tietokoneen käynnistysprosessi.