Poglavlje 5: Operativni sustav Commodore-64 u asemblerskom jeziku

Poglavlje 5 Operativni Sustav Commodore 64 U Asemblerskom Jeziku



5.1 Uvod

Operativni sustav za računalo Commodore-64 dolazi s računalom u memoriji samo za čitanje (ROM). Broj memorijskih bajt lokacija za Commodore-64 kreće se od $0000 do $FFFF (tj. 000016 do FFFF16 što je 010 do 65,53510). Operativni sustav je od $E000 do $FFFF (tj. 57,34410 do 65,53610).

Zašto proučavati operativni sustav Commodore-64
Zašto danas proučavati operativni sustav Commodore-64 kada je to bio operativni sustav računala koji je objavljen 1982.? Pa, računalo Commodore-64 koristi središnju procesorsku jedinicu 6510 koja je nadogradnja (iako ne velika nadogradnja) 6502 µP.







6502 µP se i danas proizvodi u velikom broju; više nije za kućna ili uredska računala već za električne i elektroničke uređaje (uređaje). 6502 µP također je jednostavan za razumijevanje i rukovanje u usporedbi s ostalim mikroprocesorima tog vremena. Kao rezultat toga, to je jedan od najboljih (ako ne i najbolji) mikroprocesora koji se koristi za podučavanje asemblerskog jezika.



65C02 µP, još uvijek iz klase mikroprocesora 6502, ima 66 uputa za asemblerski jezik, a sve se čak mogu naučiti napamet. Moderni mikroprocesori imaju mnogo instrukcija asemblerskog jezika i ne mogu se naučiti napamet. Svaki µP ima svoj asemblerski jezik za sebe. Svaki operacijski sustav, bio on novi ili stari, ima asemblerski jezik. Uz to, asemblerski jezik 6502 je dobar za korištenje za podučavanje operativnog sustava za početnike. Nakon učenja operativnog sustava, kao što je onaj za Commodore-64, moderan operativni sustav može se lako naučiti koristeći to kao osnovu.



Ovo nije samo mišljenje autora (ja). To je sve veći trend u svijetu. Na Internetu se piše sve više članaka za poboljšani operativni sustav Commodore-64 kako bi izgledao kao moderan operativni sustav. Moderni operativni sustavi objašnjeni su u poglavlju nakon sljedećeg.





Bilješka : OS Commodore-64 (Kernal) i dalje dobro radi s modernim ulaznim i izlaznim uređajima (ne sa svim).

Osmobitno računalo
U osmobitnom mikroračunalu kao što je Commodore 64, informacije se pohranjuju, prenose i njima se manipulira u obliku osmobitnih binarnih kodova.



Mapa memorije
Mapa memorije je ljestvica koja cijeli raspon memorije dijeli na manje raspone različitih veličina i pokazuje što (podrutina i/ili varijabla) pripada kojem rasponu. Varijabla je oznaka koja odgovara određenoj memorijskoj adresi koja ima vrijednost. Oznake se također koriste za identifikaciju početka potprograma. Ali u ovom slučaju, oni su poznati kao nazivi potprograma. Potprogram se jednostavno može nazvati rutinom.

Mapa memorije (izgled) u prethodnom poglavlju nije dovoljno detaljna. Vrlo je jednostavno. Memorijska karta računala Commodore-64 može se prikazati s tri razine detalja. Kada se prikaže na srednjoj razini, računalo Commodore-64 ima različite memorijske karte. Zadana mapa memorije Commodore-64 računala na srednjoj razini je:


Slika 5.11 Memorijska karta Commodore-64

U to je vrijeme postojao popularan računalni jezik koji se zvao BASIC. Mnogi korisnici računala trebali su znati neke minimalne naredbe BASIC jezika kao što su učitavanje programa s diskete (diska) u memoriju, pokretanje (izvršavanje) programa u memoriji i izlazak (zatvaranje) programa. Kada je BASIC program pokrenut, korisnik mora unijeti podatke, red po red. Nije kao danas kada je aplikacija (više programa koji čine aplikaciju) napisana na jeziku visoke razine s prozorima i korisnik samo mora uklopiti različite podatke na specijalizirana mjesta u prozoru. U nekim slučajevima upotrijebite miš za odabir unaprijed naručenih podataka. BASIC je u to vrijeme bio jezik visoke razine, ali je prilično blizak asemblerskom jeziku.

Primijetite da većinu memorije zauzima BASIC u zadanoj mapi memorije. BASIC ima naredbe (instrukcije) koje se izvršavaju pomoću onoga što je poznato kao BASIC Interpreter. Zapravo, BASIC tumač je u ROM-u od $A000 lokacije do $BFFF (uključujući) što je navodno RAM područje. Ovo je 8 Kbajta prilično veliko u to vrijeme! Zapravo je u ROM-u na tom mjestu cijele memorije. Ima istu veličinu kao operativni sustav od $E000 do $FFFF (uključujući). Programi koji su napisani u BASIC-u također se nalaze u rasponu od $0200 do $BFFF.

RAM za korisnički asemblerski program je od $C000 do $CFFF, samo 4 Kbajta od 64 Kbajta. Dakle, zašto koristimo ili učimo asemblerski jezik? Novi i stari operativni sustavi su asemblerski jezici. Operativni sustav Commodore-64 je u ROM-u, od $E000 do $FFFF. Napisan je u asemblerskom jeziku 65C02 µP (6510 µP). Sastoji se od potprograma. Korisnički program u asemblerskom jeziku treba pozvati ove potprograme kako bi mogao komunicirati s periferijama (ulazni i izlazni uređaji). Razumijevanje operativnog sustava Commodore-64 u asemblerskom jeziku omogućuje učeniku brzo razumijevanje operativnih sustava, na mnogo manje zamoran način. Opet, u to vrijeme, mnogi korisnički programi za Commodore-64 bili su napisani u BASIC-u, a ne u asemblerskom jeziku. Asemblerske jezike u to su vrijeme više koristili sami programeri u tehničke svrhe.

Kernal, napisan kao K-e-r-n-a-l, operativni je sustav Commodore-64. Dolazi uz računalo Commodore-64 u ROM-u, a ne na disku (ili disketi). Kernal se sastoji od potprograma. Kako bi pristupio periferiji, korisnički program u asemblerskom jeziku (strojni jezik) mora koristiti ove potprograme. Kernal ne treba brkati s kernelom koji se u modernim operativnim sustavima piše kao K-e-r-n-e-l, iako je riječ o gotovo istoj stvari.

Memorijsko područje od $C000 (49,15210) do $CFFF (6324810) od 4 Kbajta10 memorije je RAM ili ROM. Kada je RAM, koristi se za pristup periferiji. Kada je ROM, koristi se za ispis znakova na ekranu (monitoru). To znači da se ili znakovi ispisuju na ekranu ili se perifernim uređajima pristupa korištenjem ovog dijela memorije. Postoji banka ROM-a (character ROM) u sistemskoj jedinici (matična ploča) koja se uključuje i isključuje iz cijelog memorijskog prostora da bi se to postiglo. Korisnik možda neće primijetiti prebacivanje.

Područje memorije od $0100 (256 10 ) na 01 USD (511 10 ) je stog. Koriste ga i operativni sustav i korisnički programi. Uloga stoga objašnjena je u prethodnom poglavlju ovog online tečaja za karijeru. Područje memorije od $0000 (0 10 ) na 00 USD (255 10 ) koristi operativni sustav. Tamo su dodijeljeni mnogi pokazivači.

Kernal Jump Table
Kernal ima rutine koje poziva korisnički program. Kako su izlazile nove verzije OS-a, adrese tih rutina su se mijenjale. To znači da korisnički programi više nisu mogli raditi s novim verzijama OS-a. To se nije dogodilo jer je Commodore-64 osigurao stol za skok. Tablica skokova je popis od 39 unosa. Svaki unos u tablici ima tri adrese (osim zadnjih 6 bajtova) koje se nikada nisu promijenile čak ni s promjenom verzije operativnog sustava.

Prva adresa unosa ima JSR instrukciju. Sljedeće dvije adrese sastoje se od dvobajtnog pokazivača. Ovaj dvobajtni pokazivač je adresa (ili nova adresa) stvarne rutine koja je još uvijek u OS ROM-u. Sadržaj pokazivača mogao bi se promijeniti s novim verzijama OS-a, ali tri adrese za svaki unos tablice skokova nikada se ne mijenjaju. Na primjer, razmotrite adrese $FF81, $FF82 i $FF83. Ove tri adrese služe rutini za inicijalizaciju sklopova (registra) zaslona i tipkovnice matične ploče. Adresa $FF81 uvijek ima operativni kod (jedan bajt) JSR-a. Adrese $FF82 i $FF83 imaju staru ili novu adresu potprograma (još uvijek u OS ROM-u) za inicijalizaciju. Jedno vrijeme su adrese $FF82 i $FF83 imale sadržaj (adresu) $FF5B koji se mogao promijeniti sa sljedećom verzijom OS-a. Međutim, adrese $FF81, $FF82 i $FF83 tablice skokova nikada se ne mijenjaju.

Za svaki unos od tri adrese, prva adresa s JSR ima oznaku (ime). Oznaka za $FF81 je PCINT. PCINT se nikada ne mijenja. Dakle, za inicijalizaciju registara zaslona i tipkovnice, programer može jednostavno upisati “JSR PCINT” što radi za sve verzije OS-a Commodore-64. Lokacija (početna adresa) stvarne potprograma, npr. $FF5B, može se promijeniti tijekom vremena s različitim operativnim sustavima. Da, postoje najmanje dvije JSR instrukcije uključene u korisnički program koji koristi ROM OS. U korisničkom programu postoji JSR instrukcija koja skače na unos u tablici skokova. S izuzetkom zadnjih šest adresa u tablici skokova, prva adresa unosa u tablici skokova ima JSR instrukciju. U Kernalu, neke potprograme mogu pozvati druge potprograme.

Kernalna tablica skokova počinje od $FF81 (uključivo) idući prema gore u grupama od tri, osim zadnjih šest bajtova koji su tri pokazivača s nižim adresama bajtova: $FFFA, $FFFC i $FFFE. Sve rutine ROM OS-a su kodovi za višekratnu upotrebu. Dakle, korisnik ih ne mora ponovno pisati.

Blok dijagram jedinice sustava Commodore-64
Sljedeći dijagram je detaljniji od onog u prethodnom poglavlju:


Slika 5.12 Blok dijagram jedinice sustava Commodore_64

ROM i RAM ovdje su prikazani kao jedan blok. Čip video sučelja (IC) za rukovanje informacijama na ekranu, koji nije prikazan u prethodnom poglavlju, prikazan je ovdje. Jedan blok za ulazno/izlazne uređaje, koji je prikazan u prethodnom poglavlju, ovdje je prikazan kao dva bloka: CIA #1 i CIA #2. CIA je kratica za Complex Interface Adapter. Svaki od njih ima dva paralelna osmobitna priključka (ne treba ih brkati s vanjskim priključcima na okomitoj površini jedinice sustava) koji se zovu priključak A i priključak B. CIA-e su u ovoj situaciji spojene na pet vanjskih uređaja. Uređaji su tipkovnica, joystick, disk jedinica/pisač i modem. Pisač je spojen na stražnju stranu pogona diska. Tu su i krug uređaja zvučnog sučelja i krug programabilnog logičkog niza koji nisu prikazani.

Ipak, postoji Character ROM koji se može zamijeniti s oba CIA-a kada je znak poslan na zaslon, a nije prikazan u blok dijagramu.

RAM adrese od $D000 do $DFFF za ulazno/izlazne sklopove u nedostatku znakovnog ROM-a imaju sljedeću detaljnu mapu memorije:

Tablica 5.11
Detaljna karta memorije od $D000 do $DFFF
Raspon podadresa krug Veličina (bajtovi)
D000 – D3FF VIC (kontroler video sučelja (čip)) 1K
D400 – D7FF SID (zvučni krug) 1K
D800 – DBFF RAM u boji 1K grickalice
DC00 – DCFF CIA #1 (tipkovnica, joystick) 256
DD00 – DDFF CIA #2 (Serijska sabirnica, korisnički priključak/RS-232) 256
DE00 – DEF Otvorite I/O utor #1 256
DF00 – DFFF Otvorite I/O utor #2 256

5.2 Dva složena adaptera sučelja

Postoje dva posebna integrirana kruga (IC) u jedinici sustava Commodore-64, a svaki od njih se zove Adapter složenog sučelja. Ova dva čipa koriste se za povezivanje tipkovnice i drugih perifernih uređaja s mikroprocesorom. Uz izuzetak VIC-a i zaslona, ​​svi ulazni/izlazni signali između mikroprocesora i perifernih uređaja prolaze kroz ova dva IC-a. Kod Commodore-64 ne postoji izravna komunikacija između memorije i bilo koje periferije. Komunikacija između memorije i bilo koje periferije prolazi kroz mikroprocesorski akumulator, a jedan od njih su CIA adapteri (IC). IC-ovi se nazivaju CIA #1 i CIA #2. CIA je kratica za Complex Interface Adapter.

Svaka CIA ima 16 registara. Uz iznimku registara mjerača vremena/brojača u CIA-i, svaki registar je širok 8 bita i ima memorijsku adresu. Adrese memorijskih registara za CIA #1 su od $DC00 (56320 10 ) na $DC0F (56335 10 ). Adrese memorijskih registara za CIA #2 su od $DD00 (56576 10 ) na $DD0F (56591 10 ). Iako ti registri nisu u memoriji IC-a, oni su dio memorije. U srednjoj memorijskoj mapi, I/O područje od $D000 do $DFFF uključuje CIA adrese od $DC00 do $DC0F i od $DD00 do $DD0F. Većina RAM I/O memorijskog područja od $D000 do $DFFF može se zamijeniti s memorijskom bankom ROM-a znakova za znakove na ekranu. Zato kada se znakovi šalju na ekran, periferni uređaji ne mogu raditi; iako korisnik to možda neće primijetiti jer je izmjena naprijed-natrag brza.

Postoje dva registra u CIA-i #1 koji se nazivaju Port A i Port B. Njihove adrese su $DC00 i $DC01. Također postoje dva registra u CIA-i #2 koji se zovu Port A i Port B. Naravno, njihove adrese su različite; oni su $DD00 odnosno $DD01.

Port A ili Port B u CIA-i je paralelni port. To znači da može poslati podatke periferiji u osam bitova odjednom ili primiti podatke od mikroprocesora u osam bitova odjednom.

Priključku A ili priključku B pridružen je Data Direction Register (DDR). Registar smjera podataka za priključak A CIA #1 (DDRA1) nalazi se na lokaciji memorijskog bajta $DC02. Registar smjera podataka za priključak B CIA #1 (DDRB1) nalazi se na lokaciji memorijskog bajta $DC03. Registar smjera podataka za priključak A CIA #2 (DDRA2) nalazi se na lokaciji memorijskog bajta $DD02. Registar smjera podataka za priključak B CIA #2 (DDRB2) nalazi se na lokaciji memorijskog bajta $DD03.

Sada se svaki bit za priključak A ili priključak B može postaviti pomoću odgovarajućeg registra smjera podataka da bude ulaz ili izlaz. Ulaz znači da informacije idu od periferije do mikroprocesora kroz CIA. Izlaz znači da informacija ide od mikroprocesora do periferije kroz CIA.

Ako treba unijeti ćeliju porta (registra), odgovarajući bit u registru smjera podataka je 0. Ako ćeliju porta (registra) treba unijeti, odgovarajući bit u registru smjera podataka je 1. U većini slučajeva, svih 8 bitova porta je programirano da bude ili ulaz ili izlaz. Kada je računalo uključeno, priključak A je programiran za izlaz, a priključak B za ulaz. Sljedeći kod čini CIA #1 port A kao izlaz i CIA #1 port B kao ulaz:

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

DDRA1 je oznaka (naziv varijable) za memorijsku lokaciju bajta $DC02, a DDRB1 je oznaka (naziv varijable) za memorijsku lokaciju bajta $DC03. Prva instrukcija učitava 11111111 u akumulator µP. Druga instrukcija kopira ovo u registar smjera podataka porta A CIA br. 1. Treća instrukcija učitava 00000000 u akumulator µP. Četvrta instrukcija kopira ovo u registar smjera podataka priključka B CIA-e br. 1. Ovaj se kod nalazi u jednoj od potprograma u operativnom sustavu koji obavlja ovu inicijalizaciju pri uključivanju računala.

Svaka CIA ima liniju zahtjeva za uslugu prekida prema mikroprocesoru. Onaj iz CIA-e broj 1 ide u IRQ igla µP. Onaj iz CIA-e broj 2 ide u NMI igla µP. Zapamti to NMI ima veći prioritet od IRQ .

5.3 Programiranje u asemblerskom jeziku tipkovnice

Postoje samo tri moguća prekida za Commodore-64: IRQ , BRK i NMI . Pokazivač tablice skokova za IRQ nalazi se na adresama $FFFE i $FFFF u ROM-u (operativnom sustavu) što odgovara potprogramu koji je još uvijek u OS-u (ROM). Pokazivač tablice skokova za BRK nalazi se na adresama $FFFC i $FFFD u OS-u što odgovara potprogramu koji je još uvijek u OS-u (ROM). Pokazivač tablice skokova za NMI nalazi se na adresama $FFFA i $FFFB u OS-u što odgovara potprogramu koji je još uvijek u OS-u (ROM). Za IRQ , zapravo postoje dvije potprograme. Dakle, BRK softverski prekid (instrukcija) ima svoj pokazivač tablice skokova. Pokazivač tablice skokova za IRQ vodi do koda koji odlučuje je li uključen hardverski ili softverski prekid. Ako je to hardverski prekid, rutina za IRQ Zove se. Ako je softverski prekid (BRK), poziva se rutina za BRK. U jednoj od verzija OS-a, potprogram za IRQ je na $EA31, a potprogram za BRK je na $FE66. Ove adrese su ispod $FF81, tako da nisu unosi u tablicu skokova i mogu se promijeniti s verzijom OS-a. Tri su rutine od interesa za ovu temu: ona koja provjerava je li pritisnuta tipka ili BRK, ona koja je na $FE43 i ona koja se također može promijeniti s verzijom OS-a.

Računalo Commodore-64 izgleda poput ogromnog pisaćeg stroja (prema gore) bez dijela za ispis (glava i papir). Tipkovnica je spojena na CIA #1. CIA #1 samostalno skenira tipkovnicu svake 1/60 sekunde bez ikakvih programskih smetnji, prema zadanim postavkama. Dakle, svake 1/60 sekunde, CIA #1 šalje IRQ na µP. Postoji samo jedan IRQ pin na µP koji dolazi samo od CIA-e #1. Jedan ulazni pin od NMI od µP, koji se razlikuje od IRQ , dolazi samo od CIA-e #2 (pogledajte sljedeću ilustraciju). BRK je zapravo instrukcija asemblerskog jezika koja je kodirana u korisničkom programu.

Dakle, svake 1/60 sekunde, IRQ poziva se rutina na koju ukazuju $FFFE i $FFFF. Rutina provjerava je li pritisnuta tipka ili je naišla na instrukciju BRK. Ako je tipka pritisnuta, poziva se rutina za rukovanje pritiskom na tipku. Ako se radi o BRK instrukciji, poziva se rutina za rukovanje BRK-om. Ako nije ni jedno ni drugo, ništa se ne događa. Nijedno se možda neće dogoditi, ali CIA #1 šalje IRQ na µP svake 1/60 sekunde.

Red čekanja tipkovnice, također poznat kao međuspremnik tipkovnice, je raspon lokacija RAM bajtova od $0277 do $0280, uključivo; Ukupno 1010 bajtova. Ovo je prvi-ušao-prvi-vani međuspremnik. To znači da prvi lik koji dođe prvi odlazi. Zapadnoeuropski znak uzima jedan bajt.

Dakle, dok program ne troši nijedan znak kada se pritisne tipka, šifra tipke ide u ovaj međuspremnik (red). Međuspremnik se puni sve dok ne bude deset znakova. Svaki znak koji se pritisne nakon desetog znaka se ne snima. Zanemaruje se dok se barem jedan znak ne dobije (potroši) iz reda čekanja. Tablica skokova ima unos za potprogram koji mikroprocesoru šalje prvi znak iz reda čekanja. To znači da uzima taj prvi znak koji ide u red i stavlja ga u akumulator µP. Podprogram tablice skokova za ovo se zove GETIN (za Get-In). Prvi bajt za trobajtni unos u tablici skokova označen je kao GETIN (adresa $FFE4). Sljedeća dva bajta su pokazivač (adresa) koji pokazuje na stvarnu rutinu u ROM-u (OS). Programerova je odgovornost da pozove ovu rutinu. Inače će međuspremnik tipkovnice ostati pun i sve nedavno pritisnute tipke bit će zanemarene. Vrijednost koja ulazi u akumulator je odgovarajuća ključna ASCII vrijednost.

Kako ključni kodovi uopće dospijevaju u red čekanja? Postoji rutina tablice skokova koja se zove SCNKEY (za ključ za skeniranje). Ovu rutinu mogu pozvati i softver i hardver. U ovom slučaju, poziva ga elektronički (fizički) krug u mikroprocesoru kada električni signal IRQ je nisko. Kako se to točno radi ne govori se u ovom mrežnom tečaju za karijeru.

Kod za dobivanje prvog koda tipke iz međuspremnika tipkovnice u akumulator A je samo jedan redak:

UĐI

Ako je međuspremnik tipkovnice prazan, $00 se stavlja u akumulator. Zapamtite da ASCII kod za nulu nije $00; to je 30 dolara. 00 USD znači Null. U programu može postojati točka u kojoj program mora čekati na pritisak tipke. Kod za ovo je:

ČEKAJ JSR GETIN
CMP #$00
ŽABA ČEKAJ

U prvom retku, 'WAIT' je oznaka koja identificira RAM adresu na koju se stavlja (upisuje) JSR instrukcija. GETIN je također adresa. To je adresa prvog od odgovarajuća tri bajta u tablici skokova. Unos GETIN, kao i svi unosi u tablici skokova (osim posljednja tri), sastoji se od tri bajta. Prvi bajt unosa je JSR instrukcija. Sljedeća dva bajta su adresa tijela stvarne GETIN podrutine koja je još uvijek u ROM-u (OS), ali ispod tablice skokova. Dakle, unos kaže da skočite na potprogram GETIN. Ako red čekanja na tipkovnici nije prazan, GETIN stavlja ASCII šifru tipke reda Prvi-Ušao-Prvi-Out u akumulator. Ako je red prazan, Null ($00) se stavlja u akumulator.

Druga instrukcija uspoređuje vrijednost akumulatora s 00 USD. Ako je $00, to znači da je red čekanja na tipkovnici prazan, a CMP instrukcija šalje 1 u Z oznaku statusnog registra procesora (jednostavno nazvan statusni registar). Ako vrijednost u A nije $00, CMP instrukcija šalje 0 u Z oznaku statusnog registra.

Treća instrukcija koja je 'BEQ WAIT' šalje program natrag na prvu instrukciju ako je zastavica Z statusnog registra 1. Prva, druga i treća instrukcija se ponavljaju redom dok se ne pritisne tipka na tipkovnici. . Ako se tipka nikada ne pritisne, ciklus se ponavlja unedogled. Segment koda kao što je ovaj obično se piše sa segmentom vremenskog koda koji izlazi iz petlje nakon nekog vremena ako se tipka nikad ne pritisne (pogledajte sljedeću raspravu).

Bilješka : Tipkovnica je zadani ulazni uređaj, a zaslon je zadani izlazni uređaj.

5.4 Kanal, broj uređaja i broj logičke datoteke

Periferije koje ovo poglavlje koristi za objašnjenje operativnog sustava Commodore-64 su tipkovnica, ekran (monitor), pogon diska s disketom, pisač i modem koji se povezuje preko RS-232C sučelja. Za komunikaciju između ovih uređaja i sistemske jedinice (mikroprocesora i memorije) potrebno je uspostaviti kanal.

Kanal se sastoji od međuspremnika, broja uređaja, logičkog broja datoteke i po izboru sekundarne adrese. Objašnjenje ovih pojmova je sljedeće:

Međuspremnik
Primijetite iz prethodnog odjeljka da kada se pritisne tipka, njen kod mora ići na mjesto bajta u RAM-u od niza od deset uzastopnih mjesta. Ovaj niz od deset lokacija je međuspremnik tipkovnice. Svaki ulazni ili izlazni uređaj (periferija) ima niz uzastopnih mjesta u RAM-u koji se nazivaju međuspremnik.

Broj uređaja
Kod Commodore-64 svaki periferni uređaj dobiva broj uređaja. Sljedeća tablica prikazuje različite uređaje i njihove brojeve:

Tablica 5.41
Commodore 64 brojevi uređaja i njihovi uređaji
Broj Uređaj
0 Tipkovnica
1 Pogon trake
2 RS 232C sučelje za npr. modem
3 Zaslon
4 Pisač #1
5 Pisač #2
6 Crtač #1
7 Ploter #2
8 Disk
9
¦
¦
¦
30
Od 8 (uključujući) do 22 dodatna uređaja za pohranu

Postoje dvije vrste priključaka za računalo. Jedna vrsta je vanjska, na okomitoj površini jedinice sustava. Druga vrsta je interna. Ovaj interni port je registar. Commodore-64 ima četiri unutarnja priključka: priključak A i priključak B za CIA 1 te priključak A i priključak B za CIA 2. Postoji jedan vanjski priključak za Commodore-64 koji se naziva serijski priključak. Uređaji s brojem 3 naviše spojeni su na serijski priključak. Povezani su lančano (jedan koji je povezan iza drugog), od kojih se svaki može identificirati svojim brojem uređaja. Uređaji s brojem 8 naviše općenito su uređaji za pohranu.

Bilješka : Zadani ulazni uređaj je tipkovnica s brojem uređaja 0. Zadani izlazni uređaj je zaslon s brojem uređaja 3.

Logički broj datoteke
Logički broj datoteke je broj dodijeljen uređaju (periferiji) redoslijedom kojim su otvoreni za pristup. Oni se kreću od 010 do 255 10 .

Sekundarna adresa
Zamislite da su dvije datoteke (ili više od jedne datoteke) otvorene na disku. Za razlikovanje ove dvije datoteke koriste se sekundarne adrese. Sekundarne adrese su brojevi koji se razlikuju od uređaja do uređaja. Značenje 3 kao sekundarne adrese za pisač razlikuje se od značenja 3 kao sekundarne adrese za pogon diska. Značenje ovisi o značajkama kao što je kada je datoteka otvorena za čitanje ili kada je datoteka otvorena za pisanje. Mogući sekundarni brojevi su od 0 10 do 15 10 za svaki uređaj. Za mnoge uređaje broj 15 koristi se za slanje naredbi.

Bilješka : Broj uređaja poznat je i kao adresa uređaja, a sekundarni broj također je poznat kao sekundarna adresa.

Identificiranje periferne mete
Za zadanu memorijsku mapu Commodorea, memorijske adrese od $0200 do $02FF (stranica 2) koristi isključivo operativni sustav u ROM-u (Kernal), a ne operativni sustav plus BASIC jezik. Iako BASIC i dalje može koristiti lokacije putem ROM OS-a.

Modem i pisač dvije su različite periferne mete. Ako se s diska otvore dvije datoteke, to su dvije različite mete. Uz zadanu mapu memorije, postoje tri uzastopne tablice (liste) koje se mogu vidjeti kao jedna velika tablica. Ove tri tablice sadrže odnos između logičkih brojeva datoteka, brojeva uređaja i sekundarnih adresa. Na taj način određeni kanal ili cilj ulaza/izlaza postaje prepoznatljiv. Tri tablice nazivaju se tablicama datoteka. RAM adrese i ono što imaju su:

$0259 — $0262: Tablica s oznakom, LAT, do deset aktivnih logičkih brojeva datoteka.
$0263 — $026C: Tablica s oznakom, FAT, do deset odgovarajućih brojeva uređaja.
$026D — $0276: Tablica s oznakom, SAT, deset odgovarajućih sekundarnih adresa.

Ovdje '—' znači 'do', a broj zauzima jedan bajt.

Čitatelj se može pitati: 'Zašto međuspremnik za svaki uređaj nije uključen u identifikaciju kanala?' Pa, odgovor je da kod commodore-64 svaki vanjski uređaj (periferija) ima fiksni niz bajtova u RAM-u (memorijska mapa). Bez ikakvog otvorenog kanala, njihove pozicije su još uvijek tamo unutar memorije. Međuspremnik za tipkovnicu, na primjer, fiksiran je od $0277 do $0280 (uključujući) za zadanu mapu memorije.

Kernalni SETLFS i SETNAM potprogrami
SETLFS i SETNAM su kernalne rutine. Kanal se može vidjeti kao logička datoteka. Da bi se kanal otvorio, moraju se proizvesti logički broj datoteke, broj uređaja i izborna sekundarna adresa. Također može biti potreban izborni naziv datoteke (tekst). SETLFS rutina postavlja logički broj datoteke, broj uređaja i izbornu sekundarnu adresu. Ovi brojevi stavljeni su u odgovarajuće tablice. Rutina SETNAM postavlja naziv niza za datoteku koji može biti obavezan za jedan kanal i izboran za drugi kanal. Sastoji se od pokazivača (dvobajtne adrese) u memoriji. Pokazivač pokazuje na početak niza (ime) koji može biti na drugom mjestu u memoriji. Naziv niza počinje bajtom koji ima duljinu niza, nakon čega slijedi tekst (ime). Ime je maksimalno šesnaest bajtova (dugo).

Za pozivanje SETLFS rutine, korisnički program mora skočiti (JSR) na $FFBA adresu tablice skokova OS-a u ROM-u za zadanu memorijsku mapu. Zapamtite da se svaki unos sastoji od tri bajta, osim zadnjih šest bajtova tablice skokova. Prvi bajt je JSR instrukcija, koja zatim skače na potprogram, počinje na adresi u sljedeća dva bajta. Za pozivanje SETNAM rutine, korisnički program mora skočiti (JSR) na $FFBD adresu tablice skokova OS-a u ROM-u. Korištenje ove dvije rutine prikazano je u sljedećoj raspravi.

5.5 Otvaranje kanala, otvaranje logičke datoteke, zatvaranje logičke datoteke i zatvaranje svih I/O kanala

Kanal se sastoji od međuspremnika memorije, logičkog broja datoteke, broja uređaja (adresa uređaja) i dodatne sekundarne adrese (broj). Logička datoteka (apstrakcija) koja je identificirana logičkim brojem datoteke može se odnositi na periferni uređaj kao što je pisač, modem, diskovni pogon itd. Svaki od ovih različitih uređaja trebao bi imati različite logičke brojeve datoteka. Na disku ima mnogo datoteka. Logička datoteka također se može odnositi na određenu datoteku na disku. Ta određena datoteka također ima logički broj datoteke koji se razlikuje od onih perifernih uređaja kao što su pisač ili modem. Logički broj datoteke daje programer. To može biti bilo koji broj od 010 ($00) do 25510 ($FF).

Rutina OS SETLFS
Rutina OS SETLFS kojoj se pristupa skokom (JSR) na tablicu skokova OS ROM na $FFBA postavlja kanal. Treba staviti logički broj datoteke u tablicu datoteka koja je LAT ($0259 — $0262). Treba staviti odgovarajući broj uređaja u tablicu datoteka koja je FAT ($0263 — $026C). Ako pristup datoteci (uređaju) treba sekundarni broj, potrebno je staviti odgovarajuću sekundarnu adresu (broj) u tablicu datoteka koja je SAT ($026D — $0276).

Kako bi radio, SETLFS potprogram treba dobiti logički broj datoteke od µP akumulatora; treba dobiti broj uređaja iz µP X registra. Ako je potrebno kanalu, treba dobiti sekundarnu adresu iz µP Y registra.

O logičkom broju datoteke odlučuje programer. Logički brojevi datoteka koji se odnose na različite uređaje su različiti. Sada, prije pozivanja SETLFS rutine, programer bi trebao staviti broj za logičku datoteku u µP akumulator. Broj uređaja se čita iz tablice (dokumenta) kao što je u Tablici 5.41. Programer bi također trebao staviti broj uređaja u µP X registar. Dobavljač uređaja kao što je pisač, diskovni pogon itd. daje moguće sekundarne adrese i njihova značenja za uređaj. Ako kanal treba sekundarnu adresu, programer je treba dobiti iz dokumenta koji se isporučuje s uređajem (periferijom). Ako je sekundarna adresa (broj) neophodna, programer je mora staviti u µP Y registar prije poziva SETLFS potprograma. Ako nema potrebe za sekundarnom adresom, programer mora staviti $FF broj u µP Y registar prije poziva SETLFS potprograma.

Potprogram SETLFS poziva se bez ikakvih argumenata. Njegovi argumenti su već u tri registra 6502 µP. Nakon stavljanja odgovarajućih brojeva u registre, rutina se jednostavno poziva u programu sa sljedećim u zasebnom retku:

JSR SETLFS

Rutina stavlja različite brojeve na odgovarajući način u njihove tablice datoteka.

Rutina OS SETNAM
Rutini OS SETNAM se pristupa skokom (JSR) na tablicu skokova OS ROM-a na $FFBD. Nemaju sva odredišta nazive datoteka. Za one koji imaju odredišta (poput datoteka na disku), treba postaviti naziv datoteke. Pretpostavimo da je naziv datoteke “mydocum” koji se sastoji od 7 bajtova bez navodnika. Pretpostavimo da je ovo ime na lokacijama od $C101 do $C107 (uključujući), a duljina od $07 je na lokaciji $C100. Početna adresa znakova niza je $C101. Niži bajt početne adrese je $01, a viši bajt je $C1.

Prije pozivanja SETNAM rutine, programer mora staviti $07 (duljina niza) broj u µP akumulator. Donji bajt početne adrese niza od $01 stavlja se u µP X registar. Viši bajt početne adrese niza $C1 stavlja se u µP Y registar. Potprogram se jednostavno poziva sa sljedećim:

JSR SETNAM

SETNAM rutina pridružuje vrijednosti iz tri registra kanalu. Vrijednosti nakon toga ne moraju ostati u upisnicima. Ako kanal ne treba naziv datoteke, programer mora staviti 00 $ u µP akumulator. U ovom slučaju, vrijednosti koje se nalaze u registrima X i Y se zanemaruju.

Rutina OS OPEN
Rutini OS OPEN se pristupa skakanjem (JSR) na tablicu skokova OS ROM-a na $FFC0. Ova rutina koristi logički broj datoteke, broj uređaja (i međuspremnik), moguću sekundarnu adresu i mogući naziv datoteke, kako bi omogućila vezu između commodore računala i datoteke u vanjskom uređaju ili samog vanjskog uređaja.

Ova rutina, kao i sve ostale Commodore OS ROM rutine, ne prihvaća argumente. Iako koristi µP registre, nijedan od registara nije morao biti unaprijed učitan s argumentima (vrijednostima) za njega. Za kodiranje samo upišite sljedeće nakon poziva SETLFS i SETNAM:

JSR OTVORENO

Mogu se pojaviti pogreške s rutinom OPEN. Na primjer, datoteka možda neće biti pronađena za čitanje. Kada se pojavi greška, rutina ne uspije i stavlja odgovarajući broj greške u µP akumulator, i postavlja oznaku prijenosa (na 1) registra statusa µP. Sljedeća tablica prikazuje brojeve grešaka i njihova značenja:

Tablica 5.51
Kernalni brojevi pogrešaka i njihova značenja za OS ROM OPEN rutinu
Broj greške Opis Primjer
1 PREVIŠE DATOTEKA OTVORI kada se već otvori deset datoteka
2 DATOTEKA OTVORENA OTVORENO 1,3: OTVORENO 1,4
3 DATOTEKA NIJE OTVORENA ISPIS#5 bez OTVORA
4 DATOTEKA NIJE PRONAĐENA UČITAJ “NONEEXISTENF”,8
5 UREĐAJ NIJE PRISUTAN OTVORENO 11,11: ISPIS#11
6 NIJE ULAZNA DATOTEKA OTVORI “SEQ,S,W”: GET#8,X$
7 NIJE IZLAZNA DATOTEKA OTVORENO 1,0: ISPIS#1
8 NEDOSTAJE NAZIV DATOTEKE OPTEREĆENJE “”,8
9 NELEGALNI UREĐAJ BR. UČITAJ “PROGRAM”,3

Ova je tablica predstavljena na način koji će čitatelj vjerojatno vidjeti na mnogim drugim mjestima.

Rutina OS CHKIN
Rutini OS CHKIN se pristupa skokom (JSR) na tablicu skokova OS ROM-a na $FFC6. Nakon otvaranja datoteke (logičke datoteke) potrebno je odlučiti je li otvaranje za ulaz ili izlaz. CHKIN rutina čini otvaranje ulaznim kanalom. Ova rutina treba pročitati logički broj datoteke iz µP X registra. Dakle, programer mora staviti logički broj datoteke u X registar prije poziva ove rutine. Zove se jednostavno kao:

JSR CHKIN

Rutina OS CHKOUT
Rutini OS CHKOUT pristupa se skokom (JSR) na tablicu skokova OS ROM-a na $FFC9. Nakon otvaranja datoteke (logičke datoteke) potrebno je odlučiti je li otvaranje za ulaz ili izlaz. CHKOUT rutina čini otvaranje izlaznim kanalom. Ova rutina treba pročitati logički broj datoteke iz µP X registra. Dakle, programer mora staviti logički broj datoteke u X registar prije poziva ove rutine. Zove se jednostavno kao:

JSR CHKOUT

Rutina OS CLOSE
Rutini OS CLOSE pristupa se skakanjem (JSR) na OS ROM tablicu skokova na $FFC3. Nakon otvaranja logičke datoteke i prijenosa bajtova, logička datoteka se mora zatvoriti. Zatvaranjem logičke datoteke oslobađa se međuspremnik u sistemskoj jedinici da bi ga koristila neka druga logička datoteka koju tek treba otvoriti. Brišu se i odgovarajući parametri u tri tablice datoteka. RAM lokacija za broj otvorenih datoteka smanjuje se za 1.

Kada se računalo uključi, dolazi do resetiranja hardvera za mikroprocesor i druge glavne čipove (integrirane sklopove) na matičnoj ploči. Nakon toga slijedi inicijalizacija nekih mjesta RAM memorije i nekih registara u nekim čipovima na matičnoj ploči. U procesu inicijalizacije, bajtna memorijska lokacija adrese $0098 na nultoj stranici daje se s oznakom NFILES ili LDTND, ovisno o verziji operativnog sustava. Dok računalo radi, ova jednobajtna lokacija od 8 bita sadrži broj logičkih datoteka koje su otvorene i indeks početne adrese tri uzastopne tablice datoteka. Drugim riječima, ovaj bajt ima broj otvorenih datoteka koji se smanjuje za 1 kada se logička datoteka zatvori. Kada se logička datoteka zatvori, pristup terminalnom (odredišnom) uređaju ili stvarnoj datoteci na disku više nije moguć.

Kako bi zatvorio logičku datoteku, programer mora staviti broj logičke datoteke u µP akumulator. Ovo je isti logički broj datoteke koji se koristi za otvaranje datoteke. CLOSE rutina ga treba kako bi zatvorila tu određenu datoteku. Kao i druge OS ROM rutine, CLOSE rutina ne uzima argument, iako je vrijednost koja se koristi iz akumulatora donekle argument. Redak instrukcija asemblerskog jezika je jednostavno:

JSR ZATVORI

Prilagođene ili unaprijed definirane 6502 potprograme asemblerskog jezika (rutine) ne primaju argumente. Međutim, argumenti dolaze neformalno stavljanjem vrijednosti koje će potprogram koristiti u registre mikroprocesora.

CLRCHN rutina
OS CLRCHN rutini se pristupa skokom (JSR) na OS ROM tablicu skokova na $FFCC. CLRCHN je kratica za CLeaR kanal. Kada se logička datoteka zatvori, njeni parametri logičkog broja datoteke, broja uređaja i moguće sekundarne adrese se brišu. Dakle, kanal za logičku datoteku je očišćen.

Priručnik kaže da OS CLRCHN rutina briše sve otvorene kanale i vraća zadane brojeve uređaja i druge zadane postavke. Znači li to da se broj uređaja za periferiju može promijeniti? Pa, ne baš. Tijekom inicijalizacije operativnog sustava, lokacija bajta adrese $0099 daje se s oznakom DFLTI za držanje trenutnog broja ulaznog uređaja kada računalo radi. Commodore-64 može pristupiti samo jednom perifernom uređaju u isto vrijeme. Tijekom inicijalizacije operativnog sustava, lokacija bajta adrese $009A daje se s oznakom DFLTO za držanje trenutnog broja izlaznog uređaja kada računalo radi.

Kada se pozove potprogram CLRCHN, on postavlja varijablu DFLTI na 0 ($00) što je zadani broj uređaja za unos (tipkovnica). Postavlja varijablu DFLTO na 3 ($03) što je zadani broj izlaznog uređaja (ekran). Druge varijable broja uređaja se na sličan način resetiraju. To je značenje resetiranja (ili vraćanja) ulazno/izlaznih uređaja na normalne (zadane vrijednosti).

Commodore-64 priručnik kaže da nakon poziva CLRCHN rutine, otvorene logičke datoteke ostaju otvorene i još uvijek mogu prenositi bajtove (podatke). To znači da CLRCHN rutina ne briše odgovarajuće unose u tablicama datoteka. Ime CLRCHN prilično je dvosmisleno u smislu svog značenja.

5.6 Slanje lika na zaslon

Glavni integrirani sklop (IC) koji upravlja prikazom znakova i grafike na ekranu naziva se Video Interface Controller (čip) koji je skraćeno VIC u Commodore-64 (zapravo VIC II za VIC verziju 2). Da bi informacija (vrijednosti) išla na ekran, mora proći kroz VIC II prije nego što stigne na ekran.

Zaslon se sastoji od 25 redaka i 40 stupaca znakovnih ćelija. To čini 40 x 25 = 1000 znakova koji se mogu prikazati na ekranu. VIC II čita odgovarajućih 1000 memorijskih RAM uzastopnih lokacija bajtova za znakove. Tih 1000 lokacija zajedno poznato je kao memorija zaslona. Ono što ulazi u ovih 1000 mjesta su kodovi znakova. Za Commodore-64, kodovi znakova razlikuju se od ASCII kodova.

Kôd znakova nije uzorak znakova. Postoji i ono što je poznato kao ROM znakova. ROM znakova sastoji se od svih vrsta znakovnih uzoraka, od kojih neki odgovaraju uzorcima znakova na tipkovnici. ROM znakova razlikuje se od memorije zaslona. Kada se znak treba prikazati na zaslonu, kod znaka se šalje na mjesto među 1000 mjesta u memoriji zaslona. Odatle se odabire odgovarajući uzorak iz ROM-a znakova koji će se prikazati na zaslonu. Odabir ispravnog uzorka u ROM-u znakova iz koda znakova obavlja VIC II (hardver).

Mnoge memorijske lokacije između $D000 i $DFFF imaju dvije svrhe: koriste se za rukovanje ulazno/izlaznim operacijama koje nisu ekran ili se koriste kao ROM znakova za ekran. U pitanju su dva bloka memorije. Jedan je RAM, a drugi je ROM za znakovni ROM. Zamjena banaka za rukovanje ulazom/izlazom ili obrascima znakova (ROM znakova) obavlja se softverom (rutina OS-a u ROM-u od $F000 do $FFFF).

Bilješka : VIC ima registre koji su adresirani s adresama memorijskog prostora unutar raspona od $D000 i $DFFF.

Rutina CHROUT
Rutini OS CHROUT pristupa se skokom (JSR) na tablicu skokova OS ROM-a na $FFD2. Ova rutina, kada se pozove, uzima bajt koji je programer stavio u µP akumulator i ispisuje na ekranu gdje je kursor. Segment koda za ispis znaka 'E', na primjer, je:

LDA #$05
CHROUT

0516 nije ASCII kod za 'E'. Commodore-64 ima vlastite kodove znakova za zaslon gdje $05 znači 'E'. Broj #$05 smješta se u memoriju zaslona prije nego što ga VIC pošalje na zaslon. Ove dvije linije kodiranja trebale bi doći nakon postavljanja kanala, otvaranja logičke datoteke i pozivanja CHKOUT rutine za izlaz. Kompletan kod je:

; Postavljanje kanala
LDA #$40 ; logički broj datoteke
LDX #$03 ; broj uređaja za ekran je $03
LDY #$FF ; nema sekundarne adrese
JSR SETLFS; ispravno postavljanje kanala
; nema SETNAM jer zaslon ne treba naziv
;
; Otvori logičku datoteku
JSR OTVORENO
; Postavite kanal za izlaz
LDX #$40 ; logički broj datoteke
JSR CHKOUT
;
; Izlaz znakova na ekran
LDA #$05
JSR CHROUT
; Zatvori logičku datoteku
LDA #40 dolara
JSR ZATVORI

Otvor treba zatvoriti prije pokretanja drugog programa. Pretpostavimo da korisnik računala utipka znak na tipkovnici kada se očekuje. Sljedeći program ispisuje znak s tipkovnice na ekran:

; Postavljanje kanala
LDA #$40 ; logički broj datoteke
LDX #$03 ; broj uređaja za zaslon je $03
LDY #$FF ; nema sekundarne adrese
JSR SETLFS; ispravno postavljanje kanala
; nema SETNAM jer zaslon ne treba naziv
;
; Otvori logičku datoteku
JSR OTVORENO
; Postavite kanal za izlaz
LDX #$40 ; logički broj datoteke
JSR CHKOUT
;
; Unos znakova s ​​tipkovnice
PRIČEKAJ JSR GETIN ; stavlja $00 u A ako je red čekanja na tipkovnici prazan
CMP #$00 ; Ako je 00 USD otišlo A, tada je Z 1 s usporedbom
BEQ ČEKAJ ; GETIN ponovno iz reda čekanja ako je 0 otišla u akumulator
BNE PRNSCRN ; idite na PRNSCRN ako je Z 0, jer A više nema 00 USD
; Izlaz znakova na ekran
PRNSCRN JSR CHROUT ; pošalji znak u A na ekran
; Zatvori logičku datoteku
LDA #40 dolara
JSR ZATVORI

Bilješka : WAIT i PRNSCRN su oznake koje identificiraju adrese. Bajt s tipkovnice koji stiže u µP akumulator je ASCII kod. Odgovarajući kod koji Commodore-64 šalje na ekran mora biti drugačiji. To nije uzeto u obzir u prethodnom programu radi jednostavnosti.

5.7 Slanje i primanje bajtova za diskovni pogon

Postoje dva adaptera za složeno sučelje u sistemskoj jedinici (matičnoj ploči) Commodore-64 pod nazivom VIA #1 i CIA #2. Svaka CIA ima dva paralelna porta koji se nazivaju Port A i Port B. Postoji vanjski port na okomitoj površini na stražnjoj strani sistemske jedinice Commodre-64 koji se naziva serijski port. Ovaj priključak ima 6 pinova, od kojih je jedan za podatke. Podaci ulaze ili izlaze iz sistemske jedinice u seriji, jedan bit po bit.

Osam paralelnih bitova iz unutarnjeg priključka A CIA-e #2, na primjer, može izaći iz sistemske jedinice kroz vanjski serijski priključak nakon što ih registar pomaka u CIA-i pretvori u serijske podatke. Osmobitni serijski podaci iz vanjskog serijskog porta mogu ići u interni port A CIA-e #2 nakon što ih registar pomaka u CIA-i pretvori u paralelne podatke.

Jedinica sustava Commodore-64 (osnovna jedinica) koristi vanjski disk s disketom. Pisač se može spojiti na ovaj diskovni pogon u lančanom načinu (povezivanje uređaja u seriju kao niz). Podatkovni kabel za pogon diska spojen je na vanjski serijski priključak jedinice sustava Commodore-64. To znači da je lančano povezan pisač također spojen na isti serijski priključak. Ova dva uređaja identificirana su s dva različita broja uređaja (obično 8 i 4).

Slanje ili primanje podataka za disk jedinicu slijedi isti postupak kao što je prethodno opisano. To je:

  • Postavljanje naziva logičke datoteke (broja) koji je isti kao onaj stvarne diskovne datoteke korištenjem SETNAM rutine.
  • Otvaranje logičke datoteke korištenjem OPEN rutine.
  • Odlučivanje je li to ulaz ili izlaz korištenjem CHKOUT ili CHKIN rutine.
  • Slanje ili primanje podataka pomoću STA i/ili LDA instrukcije.
  • Zatvaranje logičke datoteke korištenjem CLOSE rutine.

Logička datoteka mora biti zatvorena. Zatvaranje logičke datoteke učinkovito zatvara taj određeni kanal. Prilikom postavljanja kanala za disk jedinicu, o logičkom broju datoteke odlučuje programer. To je broj između 00 USD i FF (uključujući). To ne bi trebao biti broj koji je već odabran za bilo koji drugi uređaj (ili stvarnu datoteku). Broj uređaja je 8 ako postoji samo jedan disk. Sekundarna adresa (broj) dobiva se iz priručnika pogona diska. Sljedeći program koristi 2. Program zapisuje slovo “E” (ASCII) u datoteku na disku pod nazivom “mydoc.doc”. Pretpostavlja se da ovo ime počinje na memorijskoj adresi $C101. Dakle, niži bajt od $01 mora biti u registru X, a viši bajt od $C1 mora biti u registru Y prije nego što se pozove SETNAM rutina. Registar A također bi trebao imati broj $09 prije nego što se pozove rutina SETNAM.

; Postavljanje kanala
LDA #$40 ; logički broj datoteke
LDX #$08 ; broj uređaja za prvi disk
LDY #$02 ; sekundarna adresa
JSR SETLFS; ispravno postavljanje kanala
;
; Datoteci na disku potrebno je ime (već je u memoriji)
LDA #$09
LDX #$01
LDY#$C1
JSR SETNAM
; Otvori logičku datoteku
JSR OTVORENO
; Postavite kanal za izlaz
LDX #$40 ; logički broj datoteke
JSR CHKOUT ;za pisanje
;
; Izlaz char na disk
LDA #45 dolara
JSR CHROUT
; Zatvori logičku datoteku
LDA #40 dolara
JSR ZATVORI

Kako biste pročitali bajt s diska u µP Y registar, ponovite prethodni program sa sljedećim promjenama: Umjesto “JSR CHKOUT ; za pisanje”, koristite “JSR CHKIN ; za čitanje”. Zamijenite segment koda za “; Izlaz char na disk” sa sljedećim:

; Unos znakova s ​​diska
JSR CHRIS

Rutini OS CHRIN se pristupa skokom (JSR) na tablicu skokova OS ROM-a na $FFCF. Ova rutina, kada se pozove, dobiva bajt od kanala koji je već postavljen kao ulazni kanal i stavlja ga u µP A registar. Rutina GETIN ROM OS također se može koristiti umjesto CHRIN.

Slanje bajta na pisač
Slanje bajta na pisač se vrši na sličan način kao slanje bajta u datoteku na disku.

5.8 Rutina OS SAVE

Rutini OS SAVE pristupa se skokom (JSR) na OS ROM tablicu skokova na $FFD8. Rutina OS SAVE u ROM sprema (ispisuje) dio memorije na disk kao datoteku (s imenom). Početna adresa odjeljka u memoriji mora biti poznata. Krajnja adresa odjeljka također mora biti poznata. Donji bajt početne adrese smješten je u nultu stranicu u RAM-u na adresi $002B. Viši bajt početne adrese smješta se u memorijsku lokaciju sljedećeg bajta na adresi $002C. Na nultoj stranici, oznaka TXTTAB odnosi se na ove dvije adrese, iako TXTTAB zapravo znači adresu $002B. Donji bajt krajnje adrese smješta se u µP X registar. Viši bajt krajnje adrese plus 1 stavlja se u µP Y registar. µP A registar uzima vrijednost od $2B za TXTTAB ($002B). Uz to, SAVE rutina se može pozvati sa sljedećim:

JSR SAVE

Dio memorije koji se sprema može biti program na asemblerskom jeziku ili dokument. Primjer dokumenta može biti pismo ili esej. Za korištenje rutine spremanja potrebno je slijediti sljedeći postupak:

  • Postavite kanal koristeći SETLFS rutinu.
  • Postavite naziv logičke datoteke (broj) koji je isti kao onaj stvarne diskovne datoteke pomoću SETNAM rutine.
  • Otvorite logičku datoteku koristeći OPEN rutinu.
  • Napravite datoteku za izlaz koristeći CHKOUT.
  • Ovdje ide kod za spremanje datoteke koji završava sa “JSR SAVE”.
  • Zatvorite logičku datoteku koristeći CLOSE rutinu.

Sljedeći program sprema datoteku koja počinje od memorijskih lokacija od $C101 do $C200:

; Postavljanje kanala
LDA #$40 ; logički broj datoteke
LDX #$08 ; broj uređaja za prvi disk
LDY #$02 ; sekundarna adresa
JSR SETLFS; ispravno postavljanje kanala
;
; Naziv datoteke na disku (već u memoriji na $C301)
LDA #$09 ; duljina naziva datoteke
LDX #$01
LDY#$C3
JSR SETNAM
; Otvori logičku datoteku
JSR OTVORENO
; Postavite kanal za izlaz
LDX #$40 ; logički broj datoteke
JSR CHKOUT ; za pisanje
;
; Izlazna datoteka na disk
LDA #$01
STA 2 milijarde dolara; TXTTAB
LDA #$C1
STA $2C
LDX #$00
LDY#$C2
LDA #2 milijarde dolara
JSR SAVE
; Zatvori logičku datoteku
LDA #40 dolara
JSR ZATVORI

Imajte na umu da je ovo program koji sprema drugi dio memorije (ne programski dio) na disk (disketa za Commodore-64).

5.9 Rutina OS LOAD

Rutini OS LOAD se pristupa skokom (JSR) na OS ROM tablicu skokova na $FFD5. Kada se odjeljak (veliko područje) memorije sprema na disk, sprema se sa zaglavljem koje ima početnu adresu odjeljka u memoriji. Podrutina OS LOAD učitava bajtove datoteke u memoriju. S ovom operacijom LOAD, vrijednost akumulatora mora biti 010 ($00). Da bi operacija LOAD pročitala početnu adresu u zaglavlju datoteke na disku i stavila bajtove datoteke u RAM počevši od te adrese, sekundarna adresa za kanal mora biti 1 ili 2 (sljedeći program koristi 2). Ova rutina vraća adresu plus 1 najviše RAM lokacije koja je učitana. To znači da se niži bajt posljednje adrese datoteke u RAM plus 1 stavlja u µP X registar, a visoki bajt posljednje adrese datoteke u RAM plus 1 u µP Y registar.

Ako je učitavanje neuspješno, registar µP A sadrži broj pogreške (moguće 4, 5, 8 ili 9). Zastavica C statusnog registra mikroprocesora je također postavljena (napravljena 1). Ako je učitavanje uspješno, zadnja vrijednost registra A nije važna.

Sada, u prethodnom poglavlju ovog mrežnog tečaja za karijeru, prva uputa programa asemblerskog jezika nalazi se na adresi u RAM-u gdje je program započeo. Ne mora biti tako. To znači da prva instrukcija programa ne mora biti na početku programa u RAM-u. Uputa za pokretanje programa može biti bilo gdje unutar datoteke u RAM-u. Programeru se savjetuje da tu početnu instrukciju asemblerskog jezika označi s START. Pri tome, nakon što se program učita, on se ponovno pokreće (izvršava) sa sljedećim uputama asemblerskog jezika:

JSR START

“JSR START” je u programu asemblerskog jezika koji učitava program koji treba pokrenuti. Asemblerski jezik koji učitava drugu datoteku asemblerskog jezika i pokreće učitanu datoteku ima sljedeću proceduru koda:

  • Postavite kanal koristeći SETLFS rutinu.
  • Postavite naziv logičke datoteke (broj) koji je isti kao onaj stvarne diskovne datoteke pomoću SETNAM rutine.
  • Otvorite logičku datoteku koristeći OPEN rutinu.
  • Učinite to datotekom za unos koristeći CHKIN.
  • Kod za učitavanje datoteke ide ovdje i završava s 'JSR LOAD'.
  • Zatvorite logičku datoteku koristeći CLOSE rutinu.

Sljedeći program učitava datoteku s diska i pokreće je:

; Postavljanje kanala
LDA #$40 ; logički broj datoteke
LDX #$08 ; broj uređaja za prvi disk
LDY #$02 ; sekundarna adresa
JSR SETLFS; ispravno postavljanje kanala
;
; Naziv datoteke na disku (već u memoriji na $C301)
LDA #$09 ; duljina naziva datoteke
LDX #$01
LDY#$C3
JSR SETNAM
; Otvori logičku datoteku
JSR OTVORENO
; Postavite kanal za ulaz
LDX #$40 ; logički broj datoteke
JSR CHKIN ; za čitanje
;
; Ulazna datoteka s diska
LDA #$00
JSR OPTEREĆENJE
; Zatvori logičku datoteku
LDA #40 dolara
JSR ZATVORI
; Pokrenite učitani program
JSR START

5.10 Modem i RS-232 standard

Modem je uređaj (periferni) koji pretvara bitove iz računala u odgovarajuće električne audio signale koji se prenose preko telefonske linije. Na prijemnom kraju nalazi se modem prije prijemnog računala. Ovaj drugi modem pretvara električne audio signale u bitove za prijemno računalo.

Modem je potrebno spojiti na računalo na vanjski priključak (na okomitoj površini računala). RS-232 standard odnosi se na određenu vrstu konektora koji povezuje modem s računalom (u prošlosti). Drugim riječima, mnoga su računala u prošlosti imala vanjski priključak koji je bio RS-232 konektor ili RS-232 kompatibilni konektor.

Sustavna jedinica Commodore-64 (računalo) ima vanjski priključak na stražnjoj okomitoj površini koji se naziva korisnički priključak. Ovaj korisnički priključak je RS-232 kompatibilan. Tu se može spojiti modemski uređaj. Commodore-64 komunicira s modemom preko ovog korisničkog priključka. ROM operativni sustav za Commodore-64 ima potprograme za komunikaciju s modemom koji se nazivaju RS-232 rutine. Ove rutine imaju unose u tablici skokova.

Brzina prijenosa podataka
Osmobitni bajt iz računala pretvara se u niz od osam bitova prije slanja modemu. Obrnuto se radi od modema do računala. Brzina prijenosa je broj bitova koji se prenose u sekundi, u seriji.

Dno memorije
Pojam 'Dno memorije' ne odnosi se na memorijsku lokaciju bajta adrese $0000. Odnosi se na najnižu RAM lokaciju gdje korisnik može početi stavljati svoje podatke i programe. Prema zadanim postavkama, to je 0800 USD. Prisjetite se iz prethodne rasprave da mnoge lokacije između $0800 i $BFFF koriste računalni jezik BASIC i njegovi programeri (korisnici). Samo lokacije adresa od $C000 do $CFFF su ostavljene za korištenje za programe i podatke na asemblerskom jeziku; ovo je 4 Kbajta od 64 Kbajta memorije.

Vrh sjećanja
U to vrijeme, kada su klijenti kupovali računala Commodore-64, neka nisu dolazila sa svim memorijskim lokacijama. Takva su računala imala ROM sa svojim operativnim sustavom od $E000 do $FFFF. Imali su RAM od $0000 do limita, koji nije $DFFF, pored $E000. Ograničenje je bilo ispod $DFFF i to se ograničenje naziva 'Vrh memorije'. Dakle, top-of-memory se ne odnosi na $FFFF lokaciju.

Commodore-64 međuspremnici za RS-232 komunikaciju
Međuspremnik za prijenos
Međuspremnik za RS-232 prijenos (izlaz) zauzima 256 bajtova od vrha memorije prema dolje. Pokazivač za ovaj prijenosni međuspremnik označen je kao ROBUF. Ovaj se pokazivač nalazi na nultoj stranici s adresama $00F9 iza kojih slijedi $00FA. ROBUF zapravo identificira $00F9. Dakle, ako je adresa za početak međuspremnika $BE00, niži bajt od $BE00, koji je $00, nalazi se na lokaciji $00F9, a viši bajt od $BE00, koji je $BE, nalazi se u $00FA mjesto.

Prijemni međuspremnik
Međuspremnik za primanje RS-232 bajtova (ulaz) zauzima 256 bajtova od dna međuspremnika za slanje. Pokazivač za ovaj prijemni međuspremnik označen je kao RIBUF. Ovaj pokazivač je na nultoj stranici s adresama $00F7 iza kojih slijedi $00F8. RIBUF zapravo identificira $00F7. Dakle, ako je adresa za početak međuspremnika $BF00, niži bajt od $BF00, koji je $00, nalazi se na lokaciji $00F7, a viši bajt od $BF00, koji je $BF, nalazi se u $00F8 mjesto. Dakle, 512 bajtova s ​​vrha memorije koristi se kao ukupni RS-232 RAM međuspremnik.

RS-232 kanal
Kada je modem spojen na (vanjski) korisnički priključak, komunikacija s modemom je samo RS-232 komunikacija. Procedura za kompletan RS-232 kanal je gotovo ista kao u prethodnoj raspravi, ali s jednom važnom razlikom: naziv datoteke je kod, a ne niz u memoriji. Šifra $0610 je dobar izbor. To znači brzinu prijenosa podataka od 300 bita/s i neke druge tehničke parametre. Također, ne postoji sekundarna adresa. Imajte na umu da je broj uređaja 2. Postupak za postavljanje kompletnog RS-232 kanala je:

  • Postavljanje kanala korištenjem SETLFS rutine.
  • Postavljanje naziva logičke datoteke, $0610.
  • Otvaranje logičke datoteke korištenjem OPEN rutine.
  • Pretvoriti ga u datoteku za izlaz koristeći CHKOUT ili datoteku za unos pomoću CHKIN.
  • Slanje pojedinačnih bajtova s ​​CHROUT ili primanje pojedinačnih bajtova s ​​GETIN.
  • Zatvaranje logičke datoteke korištenjem CLOSE rutine.

Rutini OS GETIN pristupa se skakanjem (JSR) na tablicu skokova OS ROM na $FFE4. Ova rutina, kada se pozove, uzima bajt koji je poslan u međuspremnik prijemnika i stavlja ga (vraća) u µP akumulator.

Sljedeći program šalje bajt “E” (ASCII) modemu koji je spojen na korisnički RS-232 kompatibilni port:

; Postavljanje kanala
LDA #$40 ; logički broj datoteke
LDX #$02 ; broj uređaja za RS-232
LDY #$FF ; nema sekundarne adrese
JSR SETLFS; ispravno postavljanje kanala
;
; Naziv za RS-232 je šifra, npr. 0610 dolara
LDA #$02 ; duljina koda je 2 bajta
LDX #$10
LDY#$06
JSR SETNAM
;
; Otvori logičku datoteku
JSR OTVORENO
; Postavite kanal za izlaz
LDX #$40 ; logički broj datoteke
JSR CHKOUT
;
; Izlazni char na RS-232 npr. modem
LDA #45 dolara
JSR CHROUT
; Zatvori logičku datoteku
LDA #40 dolara
JSR ZATVORI

Za primanje bajta, kod je vrlo sličan, osim što je 'JSR CHKOUT' zamijenjen s 'JSR CHKIN' i:

LDA #45 dolara
JSR CHROUT

zamjenjuje se s 'JSR GETIN', a rezultat se stavlja u registar A.

Kontinuirano slanje ili primanje bajtova obavlja se petljom za slanje odnosno primanje segmenta koda.

Imajte na umu da su ulaz i izlaz kod Commodorea slični u većini slučajeva, osim za tipkovnicu gdje neke od rutina ne poziva programer, ali ih poziva operativni sustav.

5.11 Brojanje i mjerenje vremena

Razmotrite slijed odbrojavanja koji je:

2, 1, 0

Ovo je odbrojavanje od 2 do 0. Sada razmislite o nizu ponavljanja odbrojavanja:

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

Ovo je ponavljanje odbrojavanja istog niza. Sekvenca se ponavlja četiri puta. Četiri puta znači da je vrijeme 4. Broji se unutar jedne sekvence. Ponavljanje istog niza je mjerenje vremena.

U sistemskoj jedinici Commodore-64 postoje dva adaptera za složeno sučelje. Svaka CIA ima dva kruga brojača/tajmera nazvana Timer A (TA) i Timer B (TB). Krug brojanja se ne razlikuje od kruga za mjerenje vremena. Brojač ili mjerač vremena u Commodore-64 odnosi se na istu stvar. Zapravo, bilo koji od njih se u biti odnosi na jedan 16-bitni registar koji uvijek odbrojava do 0 u impulsima takta sustava. U 16-bitni registar mogu se postaviti različite vrijednosti. Što je vrijednost veća, to je duže potrebno za odbrojavanje do nule. Svaki put kada jedan od mjerača vremena prijeđe nulu, IRQ signal prekida šalje se mikroprocesoru. Kada brojanje padne ispod nule, to se naziva nedostatkom.

Ovisno o tome kako je programiran vremenski krug, mjerač vremena može raditi u jednokratnom ili kontinuiranom načinu rada. S prethodnom ilustracijom, jednokratni način rada znači 'izvršiti 2, 1, 0' i zaustaviti se dok se taktni impulsi nastavljaju. Kontinuirani način rada je poput '2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1, 0, itd.' koji se nastavlja sa taktnim impulsima. To znači da kada prijeđe nulu, ako se ne daju nikakve instrukcije, niz odbrojavanja se ponavlja. Najveći broj je obično mnogo veći od 2.

Mjerač vremena A (TA) CIA #1 generira IRQ u redovitim intervalima (trajanja) za servisiranje tipkovnice. Zapravo, to je zapravo svaka 1/60 sekunde prema zadanim postavkama. IRQ šalje se mikroprocesoru svake 1/60 sekunde. To je samo kada IRQ šalje se da program može pročitati vrijednost ključa iz reda čekanja (međuspremnika) tipkovnice. Upamtite da mikroprocesor ima samo jedan pin za IRQ signal. Mikroprocesor također ima samo jedan pin za NMI signal. ¯NMI signal mikroprocesoru uvijek dolazi iz CIA-e #2.

16-bitni vremenski registar ima dvije memorijske adrese: jednu za niži bajt i jednu za viši bajt. Svaka CIA ima dva vremenska kruga. Dvije CIA-e su identične. Za CIA #1, adrese za dva mjerača vremena su: DC04 i DC05 za TA i DC06 i DC07 za TB. Za CIA #2, adrese za dva mjerača vremena su: DD04 i DD05 za TA i DD06 i DD07 za TB.

Pretpostavimo da broj 25510 treba poslati TA timeru CIA-e #2 na odbrojavanje. 25510 = 00000000111111112 je u šesnaest bitova. 00000000111111112 = $000FFF je u heksadecimalnom obliku. U ovom slučaju, $FF se šalje u registar na adresu $DD04, a $00 se šalje u registar na adresu $DD05 – mali redosljed. Sljedeći segment koda šalje broj u registar:

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

Iako registri u CIA-i imaju RAM adrese, oni su fizički u CIA-i, a CIA je IC odvojen od RAM-a ili ROM-a.

To nije sve! Kada mjerač vremena dobije broj za odbrojavanje, kao kod prethodnog koda, odbrojavanje ne počinje. Odbrojavanje počinje kada je osam-bitni bajt poslan u odgovarajući kontrolni registar za tajmer. Prvi bit ovog bajta za kontrolni registar označava treba li ili ne započeti odbrojavanje. Vrijednost 0 za ovaj prvi bit znači prestanak odbrojavanja, dok vrijednost 1 znači početak odbrojavanja. Također, bajt mora označavati je li odbrojavanje u načinu jednog udarca (jednokratno) ili u načinu rada slobodnog kretanja (kontinuirani način). Jednokratni način rada odbrojava i zaustavlja se kada vrijednost registra mjerača vremena postane nula. Kod slobodnog načina rada, odbrojavanje se ponavlja nakon što se dostigne 0. Četvrti (indeks 3) bit bajta koji se šalje u kontrolni registar označava način rada: 0 znači način slobodnog rada, a 1 znači način rada s jednim udarcem.

Prikladan broj za početak brojanja u načinu jednog udarca je 000010012 = $09 u heksadecimalnom obliku. Prikladan broj za početak brojanja u slobodnom načinu rada je 000000012 = $01 u heksadecimalnom obliku. Svaki vremenski registar ima svoj kontrolni registar. U CIA #1, kontrolni registar za tajmer A ima RAM adresu DC0E16, a kontrolni registar za tajmer B ima RAM adresu DC0F16. U CIA #2, kontrolni registar za tajmer A ima RAM adresu DD0E16, a kontrolni registar za tajmer B ima RAM adresu DD0F16. Za početak odbrojavanja šesnaestobitnog broja u TA CIA-e #2, u jednokratnom načinu rada, upotrijebite sljedeći kod:

LDA #$09
STA $DD0E

Za početak odbrojavanja šesnaest-bitnog broja u TA CIA-e #2, u slobodnom načinu rada, koristite sljedeći kod:

LDA #$01
STA $DD0E

5.12 IRQ i NMI Zahtjevi

Mikroprocesor 6502 ima IRQ i NMI linije (igle). I CIA #1 i CIA #2 imaju IRQ pin za mikroprocesor. The IRQ pin CIA-e #2 spojen je na NMI igla µP. The IRQ pin CIA-e #1 spojen je na IRQ igla µP. To su jedine dvije linije prekida koje povezuju mikroprocesor. Dakle, IRQ igla CIA-e #2 je NMI izvor i također se može vidjeti kao linija ¯NMI.

CIA #1 ima pet mogućih neposrednih izvora generiranja IRQ signal za µP. CIA #2 je iste strukture kao CIA #1. Dakle, CIA #2 ima istih pet mogućih neposrednih izvora generiranja signala prekida ovaj put, a to je NMI signal. Zapamtite da kada µP primi NMI signal, ako upravlja IRQ zahtjev, obustavlja ga i obrađuje NMI zahtjev. Kada završi s rukovanjem NMI zahtjev, zatim nastavlja s rukovanjem IRQ zahtjev.

CIA #1 obično se eksterno povezuje s tipkovnicom i uređajem za igre kao što je joystick. Tipkovnica koristi više priključka A CIA #1 nego priključka B. Uređaj za igrice koristi više CIA #1 priključka B nego svog priključka A. CIA #2 obično je eksterno spojena na pogon diska (lančano povezan s pisačem) i modem. Disk pogon koristi više porta A CIA #2 (iako kroz vanjski serijski port) nego svoj port B. Modem (RS-232) koristi više CIA #2 porta B nego svoj port A.

Uz sve to, kako jedinica sustava zna što uzrokuje IRQ ili NMI prekinuti? CIA #1 i CIA #2 imaju pet neposrednih izvora prekida. Ako je signal prekida prema µP NMI , izvor je jedan od neposrednih pet izvora iz CIA-e #2. Ako je signal prekida prema µP IRQ , izvor je jedan od neposrednih pet izvora iz CIA-e #1.

Sljedeće pitanje je: 'Kako jedinica sustava razlikuje pet neposrednih izvora svake CIA-e?' Svaka CIA ima osmobitni registar koji se naziva Interrupt Control Register (ICR). ICR služi objema lukama CIA-e. Sljedeća tablica prikazuje značenja osam bitova registra kontrole prekida, počevši od bita 0:

Tablica 5.13
Kontrolni registar prekida
Indeks bitova Značenje
0 Postavljeno (napravljeno 1) donje strane mjerača vremena A
1 Postavljeno donje strane mjerača vremena B
2 Postavite kada sat za vrijeme dana bude jednak alarmu
3 Postavite kada je serijski port pun
4 Postavlja vanjski uređaj
5 Ne koristi se (napravljeno 0)
6 Ne koristi se (napravljeno 0)
7 Postavite kada je postavljen bilo koji od prvih pet bitova

Kao što se može vidjeti iz tablice, svaki od neposrednih izvora predstavljen je jednim od prvih pet bitova. Dakle, kada se signal prekida primi na µP, mora se izvršiti kod za čitanje sadržaja registra kontrole prekida kako bi se znao točan izvor prekida. RAM adresa za ICR CIA-e #1 je DC0D16. RAM adresa za ICR CIA-e #2 je DD0D16. Za čitanje (vraćanje) sadržaja ICR-a CIA #1 u µP akumulator, upišite sljedeću uputu:

LDA$DC0D

Za čitanje (vraćanje) sadržaja ICR-a CIA #2 u µP akumulator, upišite sljedeću uputu:

LDA $DD0D

5.13 Pozadinski program pokretan prekidom

Tipkovnica obično prekida mikroprocesor svake 1/60 sekunde. Zamislite da se program izvodi i dođe u poziciju da čeka tipku s tipkovnice prije nego što može nastaviti sa segmentima koda ispod. Pretpostavimo da ako se na tipkovnici ne pritisne nijedna tipka, program radi samo malu petlju, čekajući tipku. Zamislite da je program pokrenut i da očekuje tipku s tipkovnice neposredno nakon prekida tipkovnice. U tom trenutku cijelo računalo neizravno staje i ne radi ništa osim petlje čekanja. Zamislite da je tipka tipkovnice pritisnuta neposredno prije sljedećeg izdanja sljedećeg prekida tipkovnice. To znači da računalo nije učinilo ništa otprilike jednu šezdesetinu sekunde! To je dugo vremena da računalo ne radi ništa, čak ni u danima Commodore-64. Računalo je moglo raditi nešto drugo u tom vremenu (trajanju). Postoji mnogo takvih trajanja u programu.

Drugi program se može napisati da radi u takvim trajanjima 'mirovanja'. Za takav program se kaže da radi u pozadini glavnog (ili prvog) programa. Jednostavan način da to učinite je jednostavno forsirati modificirano rukovanje BRK prekidom kada se od tipkovnice očekuje tipka.

Pokazivač za BRK instrukciju
Na uzastopnim lokacijama RAM-a adresa $0316 i $0317 nalazi se pokazivač (vektor) za stvarnu rutinu BRK instrukcija. Zadani pokazivač tamo se postavlja kada računalo uključi operativni sustav u ROM-u. Ovaj zadani pokazivač je adresa koja još uvijek pokazuje na zadani rukovatelj BRK instrukcija u OS ROM-u. Pokazivač je 16-bitna adresa. Donji bajt pokazivača smješten je na mjesto bajta adrese $0306, a viši bajt pokazivača smješten je na mjesto bajta $0317.

Drugi program se može napisati tako da kada je sustav 'miruje', sustav izvršava neke kodove drugog programa. To znači da drugi program mora biti sastavljen od potprograma. Kada je sustav u mirovanju i čeka tipku s tipkovnice, izvršava se sljedeća podrutina za drugi program. Ljudska interakcija s računalom spora je u usporedbi s radom jedinice sustava.

Lako je riješiti ovaj problem: Svaki put kada računalo mora čekati tipku s tipkovnice, umetnite BRK instrukciju u kod i zamijenite pokazivač na $0316 (i $0317) s pokazivačem sljedeće potprograma drugog ( prilagođeni) program. Na taj bi se način oba programa izvodila u trajanju koje nije puno dulje od trajanja glavnog programa koji radi samostalno.

5.14 Sastavljanje i kompilacija

Asembler zamjenjuje sve oznake adresama. Program na asemblerskom jeziku obično je napisan za početak na određenoj adresi. Rezultat asemblera (nakon asemblera) naziva se 'objektni kod' sa svim u binarnom obliku. Taj rezultat je izvršna datoteka ako je datoteka program, a ne dokument. Dokument nije izvršn.

Aplikacija se sastoji od više od jednog programa (na asemblerskom jeziku). Obično postoji glavni program. Ovu situaciju ne treba miješati sa situacijom za pozadinske programe vođene prekidima. Svi programi ovdje su programi u prvom planu, ali postoji prvi ili glavni program.

Kompajler je potreban umjesto asemblera kada postoji više od jednog programa u prvom planu. Kompajler sastavlja svaki od programa u objektni kod. Međutim, pojavio bi se problem: neki segmenti koda će se preklapati jer su programe vjerojatno napisali različiti ljudi. Rješenje prevoditelja je prebaciti sve programe koji se preklapaju osim prvog na memorijski prostor, tako da se programi ne preklapaju. Sada, kada je u pitanju pohranjivanje varijabli, neke adrese varijabli bi se i dalje preklapale. Ovdje je rješenje zamijeniti preklapajuće adrese novim adresama (osim za prvi program) tako da se više ne preklapaju. Na taj će način različiti programi stati u različite dijelove (područja) memorije.

Uz sve to, moguće je da jedna rutina u jednom programu pozove rutinu u drugom programu. Dakle, kompajler radi povezivanje. Povezivanje se odnosi na početnu adresu potprograma u jednom programu i njeno pozivanje u drugom programu; oba su dio aplikacije. Oba programa za to moraju koristiti istu adresu. Krajnji rezultat je jedan veliki objektni kod sa svim u binarnom obliku (bitovi).

5.15 Spremanje, učitavanje i pokretanje programa

Asemblerski jezik je obično napisan u nekom uređivaču (koji može biti isporučen s asemblerskim programom). Program za uređivanje pokazuje gdje program počinje i gdje završava u memoriji (RAM). Kernal SAVE rutina OS ROM-a Commodore-64 može spremiti program iz memorije na disk. On samo izbacuje odjeljak (blok) memorije koji može sadržavati njegov poziv instrukcija na disk. Preporučljivo je imati pozivnu instrukciju SAVE, odvojenu od programa koji se sprema, tako da kada se program učita u memoriju s diska, ne bi sam sebe spremio kada se pokrene. Učitavanje programa na asemblerskom jeziku s diska drugačija je vrsta izazova jer se program ne može sam učitati.

Program se ne može učitati s diska na mjesto gdje počinje i završava u RAM-u. U to vrijeme Commodore-64 je obično bio isporučen s BASIC tumačem za pokretanje programa na BASIC jeziku. Kada je stroj (računalo) uključen, rješava se s naredbenim redkom: READY. Odatle se OSNOVNE naredbe ili upute mogu upisati pritiskom na tipku 'Enter' nakon upisivanja. BASIC naredba (uputa) za učitavanje datoteke je:

LOAD “filename”,8,1

Naredba počinje BASIC rezerviranom riječi koja je LOAD. Nakon toga slijedi razmak, a zatim naziv datoteke u dvostrukim navodnicima. Slijedi broj uređaja 8 kojem prethodi zarez. Slijedi sekundarna adresa za disk koja je 1, a ispred nje stoji zarez. Kod takve datoteke početna adresa programa asemblerskog jezika nalazi se u zaglavlju datoteke na disku. Kada BASIC završi s učitavanjem programa, vraća se zadnja RAM adresa plus 1 programa. Riječ 'vraćeno' ovdje znači da se niži bajt posljednje adrese plus 1 stavlja u registar µP X, a viši bajt posljednje adrese plus 1 stavlja se u registar µP Y.

Nakon učitavanja programa potrebno ga je pokrenuti (izvršiti). Korisnik programa mora znati početnu adresu za izvođenje u memoriji. Opet, ovdje je potreban još jedan BASIC program. To je naredba SYS. Nakon izvršenja naredbe SYS, program na asemblerskom jeziku će se pokrenuti (i zaustaviti). Tijekom rada, ako je potreban bilo kakav unos s tipkovnice, program na asemblerskom jeziku bi to trebao pokazati korisniku. Nakon što korisnik upiše podatke na tipkovnici i pritisne tipku 'Enter', program na asemblerskom jeziku nastavit će raditi korištenjem unosa s tipkovnice bez ometanja BASIC interpretera.

Pod pretpostavkom da je početak izvršne (pokrenute) RAM adrese za program asemblerskog jezika C12316, C123 se pretvara u bazu deset prije nego što se koristi sa SYS naredbom. Pretvaranje C12316 u bazu deset je kako slijedi:

Dakle, naredba BASIC SYS je:

SYS 49443

5.16 Dizanje Commodore-64

Dizanje Commodore-64 sastoji se od dvije faze: faze resetiranja hardvera i faze inicijalizacije operativnog sustava. Operativni sustav je Kernal u ROM-u (a ne na disku). Postoji linija za resetiranje (zapravo RES ) koji se spaja na pin na 6502 µP i na isti naziv pina na svim posebnim brodovima kao što su CIA 1, CIA 2 i VIC II. U fazi resetiranja, zahvaljujući ovoj liniji, svi registri u µP iu posebnim čipovima se resetiraju na 0 (napravljeni su na nuli za svaki bit). Zatim, pomoću hardvera mikroprocesora, pokazivač steka i registar statusa procesora daju se sa svojim početnim vrijednostima u mikroprocesoru. Zatim se daje programski brojač s vrijednošću (adresom) na lokacijama $FFFC i $FFFD. Podsjetimo se da programski brojač sadrži adresu sljedeće instrukcije. Sadržaj (adresa) koji se ovdje nalazi je za potprogram koji započinje inicijalizaciju softvera. Sve do sada radi mikroprocesorski hardver. Cjelokupno sjećanje nije dotaknuto u ovoj fazi. Tada počinje sljedeća faza inicijalizacije.

Inicijalizacija se vrši pomoću nekih rutina u ROM OS-u. Inicijalizacija znači davanje početnih ili zadanih vrijednosti nekim registrima u posebnim čipovima. Inicijalizacija počinje davanjem početnih ili zadanih vrijednosti nekim registrima u posebnim čipovima. IRQ , na primjer, mora početi izdavati svake 1/60 sekunde. Dakle, njegov odgovarajući mjerač vremena u CIA #1 mora biti postavljen na zadanu vrijednost.

Zatim Kernal izvodi RAM test. Testira svaku lokaciju slanjem bajta na lokaciju i čitanjem. Ako postoji razlika, barem je ta lokacija loša. Kernal također identificira vrh memorije i dno memorije i postavlja odgovarajuće pokazivače na stranici 2. Ako je vrh memorije $DFFF, $FF se stavlja na lokaciju $0283, a $DF se stavlja na lokaciju $0284 bajta. I $0283 i $0284 imaju oznaku HIRAM. Ako je dno memorije $0800, $00 se stavlja na $0281 lokaciju, a $08 se stavlja na $0282 lokaciju. I $0281 i $0282 imaju oznaku LORAM. Test RAM-a zapravo počinje od 0300 USD do vrha memorije (RAM).

Konačno, ulazno/izlazni vektori (pokazivači) postavljaju se na svoje zadane vrijednosti. Test RAM-a zapravo počinje od 0300 USD do vrha memorije (RAM). To znači da su stranica 0, stranica 1 i stranica 2 inicijalizirane. Konkretno, stranica 0 ima puno pokazivača na OS ROM, a stranica 2 ima puno pokazivača na BASIC. Ovi se pokazivači nazivaju varijablama. Zapamtite da je stranica 1 hrpa. Pokazivači se nazivaju varijablama jer imaju imena (oznake). U ovoj fazi briše se memorija ekrana za ekran (monitor). To znači slanje koda od 20 USD za prostor (koji je slučajno isti kao ASCII 20 USD) na lokacije zaslona od 1000 RAM-a. Na kraju, Kernal pokreće BASIC tumač za prikaz BASIC naredbenog retka koji je SPREMAN na vrhu monitora (zaslona).

5.17 Problemi

Čitatelju se savjetuje da riješi sve probleme u poglavlju prije nego prijeđe na sljedeće poglavlje.

  1. Napišite kod asemblerskog jezika koji čini sve bitove CIA #2 porta A kao izlaz i CIA #2 porta B kao ulaz.
  2. Napišite kod jezika 6502 koji čeka tipku na tipkovnici dok se ne pritisne.
  3. Napišite program na asemblerskom jeziku 6502 koji šalje znak 'E' na zaslon Commodore-64.
  4. Napišite program na asemblerskom jeziku 6502 koji uzima znak s tipkovnice i šalje ga na zaslon Commodore-64, zanemarujući kod tipke i vrijeme.
  5. Napišite program na jeziku 6502 koji prima bajt s diskete Commodore-64.
  6. Napišite program na jeziku 6502 koji sprema datoteku na disketu Commodore-64.
  7. Napišite program na jeziku 6502 koji učitava programsku datoteku s diskete Commodore-64 i pokreće je.
  8. Napišite program na 6502 asemblerskom jeziku koji šalje bajt “E” (ASCII) modemu koji je spojen na korisnički RS-232 kompatibilni port Commodore-64.
  9. Objasnite kako se vrši brojanje i mjerenje vremena u računalu Commodore-64.
  10. Objasnite kako sistemska jedinica Commodore-64 može identificirati 10 različitih izvora zahtjeva za trenutni prekid uključujući zahtjeve za prekid koji se ne mogu maskirati.
  11. Objasnite kako se program u pozadini može pokrenuti s programom u prvom planu u računalu Commodore-64.
  12. Ukratko objasnite kako se programi na asemblerskom jeziku mogu prevesti u jednu aplikaciju za računalo Commodore-64.
  13. Ukratko objasnite proces dizanja Commodore-64 računala.