KERNAL
| KERNAL | ||
|---|---|---|
|
| ||
| Allmän information | ||
| programtyp | kärna | |
| utvecklaren | Commodore International | |
| Utvecklingsmodell | stängd källa | |
| Faktiskt tillstånd | diskontinuerlig | |
| Teknisk information | ||
| Plattformar som stöds | ||
KERNAL [ 1 ] är Commodores namn för den ROM - baserade operativsystemkärnan på dess 8 - bitars hemdatorer ; från den ursprungliga PET från 1977 , följt av de närbesläktade men utökade versionerna som användes i dess efterföljare: VIC-20 , Commodore 64 , Plus/4 , C16 och C128 .
Beskrivning
KERNAL av 8-bitars Commodore-maskiner består av lågnivå, nästan hårdvaruoperativsystemrutiner som ungefär motsvarar BIOS på IBM - kompatibla datorer (i motsats till BASIC-tolkrutinerna, som också finns i ROM), samt högre- nivå enhetsoberoende I/O-funktionalitet, och kan anropas av användaren via en hopptabell vars mellersta (äldsta) del, av bakåtkompatibilitetsskäl, [ 2 ] den förblir i stort sett identisk genom hela 8-bitarsserien. KERNAL ROM upptar de sista 8 KB av 8-bitars CPU:ns 64 KB adressutrymme ($E000-$FFFF).
Hopptabellen kan modifieras för att peka på användarskrivna rutiner, till exempel genom att skriva om skärmvisningsrutinerna för att visa animerad grafik eller genom att kopiera teckenuppsättningen till RAM. Denna användning av ett hoppbord var nytt för små datorer på den tiden. [ 3 ]
Adventure International - spel som släppts för VIC-20 på kassett är ett exempel på programvara som använder KERNAL. Eftersom de bara använder hopptabellen kan spel laddas ner till diskminnet , laddas på en Commodore 64 och köras utan modifiering. [ 4 ]
KERNAL skrevs ursprungligen för Commodore PET av John Feagans, som introducerade idén om att separera BASIC-rutinerna från operativsystemet. Det utvecklades av olika personer, framför allt Robert Russell som lade till många av funktionerna för VIC-20 och C64.
Exempel
Följande 6502 assemblerspråksubrutin [ 5 ] (skriven i ca65 assemblerformat/syntax) ger ett enkelt men karakteristiskt exempel på användning av KERNAL:
CHROUT = $ffd2 ; CHROUT är adressen till teckenutmatningsrutinen
CR = $0d ; PETSCII-kod för returfrakt
;
Hallå:
ldx #0 ; börja med tecknet 0 genom att ladda 0 i x-indexregistret
Nästa:
lda meddelande , x ; ladda byte från adressmeddelande+x till ackumulatorn
beq gjort ; om ackumulatorn håller noll är vi klara och vill förgrena oss ur slingan
jsr CHROUT ; anrop CHROUT för att mata ut char till nuvarande utenhet (standard till skärmen)
i x ; öka x för att gå till nästa tecken
b ne nästa ; gå tillbaka medan det sista tecknet inte är noll (max stränglängd 255 byte)
donera:
rts ; tillbaka från subrutinen
;
meddelande:
.byte "Hej världen"
.byte CR , 0 ; Carriage Return och nollmarkering slutet av strängen
Den här stubben använder rutinen CHROUT, vars adress är på adressen $FFD2(65490), för att skicka en textsträng till standardutgångsenheten (till exempel bildskärmen).
Namnet
KERNAL var känd som kärnan [ 6 ] inom Commodore sedan PET:s dagar, men 1980 stavade Robert Russell ordet som kärnan i sina anteckningsböcker. När Commodores tekniska skribenter Neil Harris och Andy Finkel plockade upp Russells anteckningar och använde dem som grund för VIC-20-programmerarens manual, följde felstavningen dem och förblev som den var. [ 7 ]
Enligt den gamla Commodore-myten, och rapporterad av bland annat författaren/programmeraren Jim Butterfield, är " ordet " KERNAL en akronym (eller kanske mer troligt, en retro-akronym ) som står för Keyboard Entry Read , Network , A nd L bläck. , vilket faktiskt är vettigt med tanke på hans roll. Berkeley Softworks använde det senare när de namngav kärnrutinerna i sitt GUI-operativsystem för 8-bitars hemdatorer: GEOS KERNAL.
På enhetsoberoende I/O
Överraskande nog implementerade KERNAL ett enhetsoberoende I/O API som inte skiljer sig helt från Unix eller Plan-9 , som ingen utnyttjade, så vitt det är allmänt känt. Medan man rimligen skulle kunna hävda att "allt är en fil" i de senare systemen, kan andra lätt hävda att "allt är en GPIB- enhet " i det förra.
På grund av begränsningar med 6502-arkitekturen vid den tiden kräver öppning av en I/O-kanal tre systemanrop. Den förra anger vanligtvis det logiska filnamnet via SETNAM. Det andra anropet, SETLFS, ställer in adressen till GPIB/IEEE-488 "enheten" att kommunicera med. Slutligen kallas för att OPENutföra den faktiska transaktionen. Applikationen använder sedan systemanropen CHKINoch för att CHKOUTkonfigurera applikationens aktuella in- respektive utgångskanaler. Applikationer kan ha valfritt antal filer öppna samtidigt (upp till en viss systemberoende gräns; till exempel tillåter C64 att tio filer öppnas samtidigt). Därefter CHRINoch CHROUTär användbara för input respektive output. CLOSEstäng sedan en kanal.
Observera att det inte finns något systemanrop för att "skapa" en I/O-kanal, eftersom enheter inte kan skapas dynamiskt eller förstöras under normala omständigheter. På samma sätt finns det inga sätt att hämta eller utföra "I/O-kontroll"-funktioner som ioctl () på Unix. Faktum är att KERNAL visar mycket närmare Plan-9-filosofin här, där en applikation skulle öppna en speciell " kommando "-kanal till den indikerade enheten för att utföra sådana " meta "- eller " utanför band "-transaktioner. Till exempel, för att " skrapa " en fil från en disk, skulle användaren normalt "öppna" den namngivna resursen S0:THE-FILE-TO-RMVpå enhet 8 eller 9, kanal 15. Enligt konvention etablerad i 8-bitars Commodore-världen representerar kanal 15 "kommandokanalen " för kringutrustning, att förlita sig på meddelandetekniker för att kommunicera kommandon och resultat, inklusive sällsynta fall. Till exempel, i Commodore BASIC , kan du hitta programvara som liknar följande:
70 ...
80 REM ROTERA LOGGAR ÖPPNADE PÅ LOGISK KANAL #1.
90 STÄNG 1
100 ÖPPEN 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 LÄS FEL KANAL
120 STÄNG 15
130 OM A = 0 GÅ TILL 200
140 SKRIV UT "FEL BYT DAMN LOGGFIL:"
150 SKRIV UT " KOD: " + A
160 PRINT " MSG : " + B$
170 SLUTA
200 PROCEM. SKAPA NY LOGGFIL SOM VI GÅR...
210 OPEN 1 , 8 , 1 , "0:ERROR.0,S,W"
220 ...
Enhetsnummer, enligt etablerad dokumentation, är begränsade till intervallet [0,16]. Denna begränsning härrör dock från den specifika anpassningen av IEEE-488-protokollet och gäller i själva verket endast extern kringutrustning. Med alla relevanta KERNAL-systemanrop vektoriserade kan programmerare avlyssna systemanrop för att implementera virtuella enheter med vilken adress som helst inom intervallet 32 256). Man skulle möjligen kunna ladda en binär enhetsdrivrutin i minnet, patcha KERNAL I/O-vektorerna och från och med då skulle en ny (virtuell) enhet kunna adresseras. Hittills har denna förmåga aldrig varit allmänt känd för att användas, antagligen av två skäl: (1) KERNAL tillhandahåller inget sätt att dynamiskt tilldela enhets-ID:n och (2) KERNAL tillhandahåller inget sätt att ladda en omlokaliserbar binär bild. Därför faller bördan av kollisioner i både I/O-utrymme och minnesutrymme på användaren, medan plattformskompatibilitet över ett brett spektrum av maskiner faller på mjukvaruförfattaren. Stödmjukvara för dessa funktioner kan dock enkelt implementeras om så önskas.
Logiska filnamnsformat tenderar att bero på den specifika enheten som adresseras. Den vanligaste enheten som används är naturligtvis diskettsystemet, som använder ett format som liknar MD:NAME,ATTRS, där M är någon slags flagga ($ för kataloglistning, @ för att indikera en önskan att skriva över en fil om den redan finns, annars oanvänd ), D är det fysiska disknumret (valfritt) (0: eller 1: för system med dubbla diskar, endast 0: för endiskenheter som 1541, et al., som är standard på 0: om det inte anges) , NAMEär ett resursnamn upp till 16 tecken långt (de flesta tecken tillåtna, förutom vissa specialtecken), och ATTRSär en valfri kommaseparerad lista med attribut eller flaggor. Om användaren till exempel vill skriva över en programfil med namnet PRGFILE, kan de se ett filnamn som @0:PRGFILE,Panvänds i kombination med enhet 8 eller 9. Under tiden består ett filnamn för RS-232-styrenheten (enhet 2) helt enkelt av fyra tecken , kodad i binärt format. [ 8 ]
Andra enheter, som tangentbordet (enhet 0), kassetten (enhet 1), displaygränssnittet (enhet 3) och skrivaren (enhet 4 och 5), kräver inte filnamn för att fungera, förutsatt att de antar rimliga standardinställningar eller bara de behöver dem inte. absolut.
Referenser
- ↑ Commodore 64 programmerares referensguide . Commodore Business Machines, Inc., 1982, sid. 268
- ↑ KERNAL-hopptabellen, som används för att komma åt alla subrutiner i KERNAL, är en samling JMP-instruktioner (hopp) som leder till de faktiska subrutinerna. Denna funktion säkerställer kompatibilitet med användarskriven programvara i händelse av att koden i KERNAL ROM behöver flyttas i en senare version.
- ^ "Utforska VIC-20" .
- ↑ Kevelson, Morton (januari 1986). "Talsyntes för Commodore-datorerna / Del II" . sid. 32 . Hämtad 17 juli 2014 .
- ↑ Många av KERNAL-subrutinerna (t.ex. ÖPPNA och STÄNG) vektoriserades genom sida tre i RAM, vilket gjorde det möjligt för en programmerare att avlyssna de associerade KERNAL-anropen och lägga till eller ersätta de ursprungliga funktionerna.
- ↑ Kärnan är den mest grundläggande delen av ett program, vanligtvis ett operativsystem, som alltid finns i minnet och tillhandahåller de grundläggande tjänsterna . Det är den del av operativsystemet som är närmast maskinen och kan aktivera hårdvaran direkt eller gränssnitt till ett annat mjukvarulager som driver hårdvaran
- ↑ On The Edge: The Spectacular Rise and Fall of Commodore , sida 202.
- ↑ Commodore 128 Programmers Referensguide , Commodore Business Machines, Inc., 1986, sid. 382
Se även
- GEOS , grafiskt operativsystem för Commodore 64 och 128.