close

KERNAL

Gå till navigering Gå till sök
KERNAL
Cbm kernal jmp table3.jpeg
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 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 BIOSIBM - 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   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

  1. Commodore 64 programmerares referensguide . Commodore Business Machines, Inc., 1982, sid. 268
  2. 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.
  3. ^ "Utforska VIC-20" . 
  4. Kevelson, Morton (januari 1986). "Talsyntes för Commodore-datorerna / Del II" . sid. 32 . Hämtad 17 juli 2014 . 
  5. 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.
  6. 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
  7. On The Edge: The Spectacular Rise and Fall of Commodore , sida 202.
  8. Commodore 128 Programmers Referensguide , Commodore Business Machines, Inc., 1986, sid. 382

Se även

  • GEOS , grafiskt operativsystem för Commodore 64 och 128.

Externa länkar