KERNAL
| KERNAL | ||
|---|---|---|
|
| ||
| Algemene informatie | ||
| programmatype: | kern | |
| ontwikkelaar | Commodore Internationaal | |
| Ontwikkelingsmodel | gesloten bron | |
| Werkelijke staat | discontinu | |
| Technische informatie | ||
| Ondersteunde platforms | ||
KERNAL [ 1 ] is Commodore 's aangewezen naam voor de ROM - ingezeten besturingssysteemkernel op zijn 8 - bits thuiscomputers ; van de originele PET uit 1977 , gevolgd door de nauw verwante maar uitgebreide versies die in zijn opvolgers werden gebruikt: de VIC-20 , Commodore 64 , Plus/4 , C16 en C128 .
Beschrijving
De KERNAL van 8-bits Commodore-machines bestaat uit low-level, bijna-hardware besturingssysteemroutines die ongeveer gelijk zijn aan het BIOS op IBM - compatibele pc's (in tegenstelling tot de BASIC-interpreterroutines, die zich ook in ROM bevinden), evenals hogere niveau apparaatonafhankelijke I/O-functionaliteit, en kan door de gebruiker worden aangeroepen via een hoptabel waarvan het middelste (oudste) deel, om redenen van achterwaartse compatibiliteit [ 2 ] grotendeels identiek blijft in de 8-bit-serie. De KERNAL ROM neemt de laatste 8 KB in beslag van de 64 KB adresruimte van de 8-bit CPU ($E000-$FFFF).
De springtabel kan worden aangepast om te verwijzen naar door de gebruiker geschreven routines, bijvoorbeeld door de schermweergaveroutines te herschrijven om geanimeerde afbeeldingen weer te geven of door de tekenset in RAM te kopiëren. Dit gebruik van een springtafel was destijds nieuw voor kleine computers. [ 3 ]
Adventure International - spellen die voor de VIC-20 op cartridge zijn uitgebracht, zijn een voorbeeld van software die KERNAL gebruikt. Omdat ze alleen de springtafel gebruiken, kunnen games worden gedownload naar het schijfgeheugen , op een Commodore 64 worden geladen en zonder aanpassingen worden uitgevoerd. [ 4 ]
De KERNAL is in eerste instantie geschreven voor de Commodore PET door John Feagans, die het idee introduceerde om de BASIC-routines te scheiden van het besturingssysteem. Het is ontwikkeld door verschillende mensen, met name Robert Russell die veel van de functies voor de VIC-20 en C64 heeft toegevoegd.
Voorbeeld
De volgende 6502 assembler- subroutine [ 5 ] (geschreven in ca65 assembler-formaat/syntaxis) biedt een eenvoudig maar kenmerkend voorbeeld van het gebruik van KERNAL:
CHROUT = $ffd2 ; CHROUT is het adres van de tekenuitvoerroutine
CR = $0d ; PETSCII-code voor koetsretour
;
Hallo:
ldx #0 ; begin met teken 0 door 0 in het x-indexregister te laden
De volgende:
lda- bericht , x ; laad byte van adresbericht+x in de accumulator
beq gedaan ; als de accumulator nul bevat, zijn we klaar en willen we uit de lus vertakken
jsr CHROUT ; bel CHROUT om char uit te voeren naar het huidige uitvoerapparaat (standaard naar scherm)
in x ; verhoog x om naar het volgende teken te gaan
b ne volgende ; loop terug terwijl het laatste teken niet nul is (max. stringlengte 255 bytes)
doneren:
rts ; terugkeer van subroutine
;
bericht:
.byte "Hallo wereld"
.byte CR , 0 ; Carriage Return en nulmarkering einde van string
Deze stub gebruikt de routine CHROUT, waarvan het adres op adres $FFD2(65490) is, om een tekstreeks naar het standaarduitvoerapparaat te sturen (bijvoorbeeld het weergavescherm).
De naam
De KERNAL stond bekend als de kernel [ 6 ] binnen Commodore sinds de dagen van PET, maar in 1980 heeft Robert Russell het woord verkeerd gespeld als kernal in zijn notitieboekjes. Toen de technische schrijvers van Commodore Neil Harris en Andy Finkel Russell's aantekeningen oppikten en ze gebruikten als basis voor de VIC-20 programmeurshandleiding, volgde de spelfout ze en bleef zoals het was. [ 7 ]
Volgens de oude Commodore-mythe, en onder andere gerapporteerd door schrijver/programmeur Jim Butterfield, is het " woord " KERNAL een acroniem (of waarschijnlijker een retro-acroniem ) dat staat voor Keyboard Entry Read , Network , A nd L inkt. , wat eigenlijk logisch is gezien zijn rol. Berkeley Softworks gebruikte het later bij het benoemen van de kernroutines van zijn GUI-besturingssysteem voor 8-bits thuiscomputers: de GEOS KERNAL.
Op apparaatonafhankelijke I/O
Verrassend genoeg implementeerde de KERNAL een apparaatonafhankelijke I/O-API die niet geheel verschilt van Unix of Plan-9 , die niemand heeft uitgebuit, voor zover publiek bekend. Terwijl men redelijkerwijs zou kunnen beweren dat "alles een bestand is" in de laatste systemen, zouden anderen gemakkelijk kunnen beweren dat "alles een GPIB -apparaat is " in de eerste.
Vanwege beperkingen met de 6502-architectuur op dat moment, vereist het openen van een I/O-kanaal drie systeemaanroepen. De eerste stelt meestal de logische bestandsnaam in via de SETNAM. De tweede oproep, SETLFS, stelt het adres in van het GPIB/IEEE-488 "apparaat" om mee te communiceren. Ten slotte wordt geroepen OPENom de daadwerkelijke transactie uit te voeren. De toepassing gebruikt vervolgens de systeemaanroepen CHKINen om CHKOUTrespectievelijk de huidige invoer- en uitvoerkanalen van de toepassing te configureren. Toepassingen kunnen een willekeurig aantal bestanden tegelijk hebben geopend (tot een systeemafhankelijke limiet; de C64 staat bijvoorbeeld toe dat tien bestanden tegelijk worden geopend). Daarna, CHRINen CHROUTzijn nuttig voor respectievelijk invoer en uitvoer. CLOSEsluit vervolgens een kanaal.
Merk op dat er geen systeemaanroep is om een I/O-kanaal te "creëren", aangezien apparaten onder normale omstandigheden niet dynamisch kunnen worden gemaakt of vernietigd. Evenzo is er geen manier om "I/O-besturings"-functies zoals ioctl () op Unix op te halen of uit te voeren . In feite demonstreert de KERNAL hier veel dichter bij de Plan-9-filosofie, waar een toepassing een speciaal " commando "-kanaal naar het aangegeven apparaat zou openen om dergelijke " meta "- of " out-of-band "-transacties uit te voeren. Om bijvoorbeeld een bestand van een schijf te " krabben ", zou de gebruiker normaal gesproken de genoemde bron S0:THE-FILE-TO-RMVop apparaat 8 of 9, kanaal 15 "openen". " voor randapparatuur, vertrouwend op berichttechnieken om opdrachten en resultaten te communiceren, ook in zeldzame gevallen. In Commodore BASIC vindt u bijvoorbeeld software die lijkt op de volgende:
70 ...
80 REM DRAAIEN LOGBOEKEN MOMENTEEL GEOPEND OP LOGISCH KANAAL #1.
90 CLOSE 1
100 OPEN 15 , 8 , 15 , "R0:ERROR.1=0:ERROR.0" : REM RENAME FILE ERROR.0 TO ERROR.1
110 INPUT# 15 , A , B$ , C , D : REM LEES FOUT KANAAL
120 SLUIT 15
130 IF A = 0 DAN GA 200
140 PRINT "ERROR RESAMING LOG FILE:"
150 PRINT " CODE: " + A
160 PRINT " MSG : " + B$
170 EIND
200 REM HIER VERDER MET DE VERWERKING, NIEUW LOGBESTAND MAKEN ALS WE GAAN...
210 OPEN 1 , 8 , 1 , "0:ERROR.0,S,W"
220 ...
Apparaatnummers zijn, volgens vastgestelde documentatie, beperkt tot het bereik [0,16]. Deze beperking komt echter voort uit de specifieke aanpassing van het IEEE-488-protocol en is in feite alleen van toepassing op externe randapparatuur. Met alle relevante KERNAL-systeemaanroepen vectored, kunnen programmeurs systeemaanroepen onderscheppen om virtuele apparaten met elk adres in het bereik van 32.256 te implementeren. Men zou eventueel een binair apparaatstuurprogramma in het geheugen kunnen laden, de KERNAL I/O-vectoren kunnen patchen en vanaf dat moment zou een nieuw (virtueel) apparaat kunnen worden geadresseerd. Tot nu toe is het nooit publiekelijk bekend geweest dat deze mogelijkheid wordt gebruikt, vermoedelijk om twee redenen: (1) KERNAL biedt geen mogelijkheid om dynamisch apparaat-ID's toe te wijzen, en (2) KERNAL biedt geen mogelijkheid om een verplaatsbare binaire afbeelding te laden. De last van botsingen in zowel de I/O-ruimte als de geheugenruimte ligt dus bij de gebruiker, terwijl de platformcompatibiliteit op een groot aantal machines bij de auteur van de software ligt. Ondersteunende software voor deze functies kan desgewenst echter eenvoudig worden geïmplementeerd.
Logische bestandsnaamindelingen zijn meestal afhankelijk van het specifieke geadresseerde apparaat. Het meest gebruikte apparaat is natuurlijk het diskettesysteem, dat een formaat gebruikt dat lijkt op MD:NAME,ATTRS, waarbij M een soort vlag is ($ voor directorylijst, @ om de wens aan te geven om een bestand te overschrijven als het al bestaat, anders ongebruikt ), D is het nummer van de fysieke schijf (optioneel) (0: of 1: voor systemen met twee schijven, alleen 0: voor schijven met één schijf zoals de 1541, et al., die standaard 0 is: indien niet gespecificeerd) , NAMEis een resourcenaam van maximaal 16 tekens lang (de meeste tekens zijn toegestaan, behalve bepaalde speciale tekens), en ATTRSis een optionele door komma's gescheiden lijst met kenmerken of vlaggen. Als de gebruiker bijvoorbeeld een programmabestand met de naam wil overschrijven PRGFILE, kan hij een bestandsnaam zien zoals @0:PRGFILE,Pgebruikt in combinatie met apparaat 8 of 9. Ondertussen bestaat een bestandsnaam voor de RS-232-controller (apparaat 2) gewoon uit vier tekens , gecodeerd in binair formaat. [ 8 ]
Andere apparaten, zoals het toetsenbord (apparaat 0), de cassette (apparaat 1), de display-interface (apparaat 3) en de printer (apparaat 4 en 5), vereisen geen bestandsnamen om te werken, ervan uitgaande dat redelijke standaardinstellingen heb ze niet nodig. Absoluut.
Referenties
- ↑ Commodore 64 programmeerhandleiding . Commodore Business Machines, Inc., 1982, p. 268
- ↑ De KERNAL-sprongtabel, die wordt gebruikt om toegang te krijgen tot alle subroutines in de KERNAL, is een reeks JMP-instructies (jump) die naar de eigenlijke subroutines leiden. Deze functie zorgt voor compatibiliteit met door de gebruiker geschreven software in het geval dat code binnen de KERNAL ROM moet worden verplaatst in een latere revisie.
- ^ "Het verkennen van de VIC-20" .
- ^ Kevelson, Morton (januari 1986). "Spraaksynthesizers voor de Commodore Computers / Part II" . p. 32 . Ontvangen op 17 juli 2014 .
- ↑ Veel van de KERNAL-subroutines (bijv. OPEN en CLOSE) werden via pagina drie in RAM gevectoriseerd, waardoor een programmeur de bijbehorende KERNAL-aanroepen kon onderscheppen en de oorspronkelijke functies kon toevoegen of vervangen.
- ↑ De kernel is het meest fundamentele onderdeel van een programma, meestal een besturingssysteem, dat zich altijd in het geheugen bevindt en de basisdiensten levert. Het is het deel van het besturingssysteem dat zich het dichtst bij de machine bevindt en kan de hardware rechtstreeks activeren of een interface vormen met een andere softwarelaag die de hardware aanstuurt
- ^ Aan de rand: de spectaculaire opkomst en ondergang van Commodore , pagina 202.
- ↑ Commodore 128 Programmeurs Reference Guide , Commodore Business Machines, Inc., 1986, p. 382
Zie ook
- GEOS , grafisch besturingssysteem voor de Commodore 64 en 128.