close

Kernel

Zur Navigation gehen Zur Suche gehen
Kernel
Cbm kernal jmptable3.jpeg
Allgemeine Information
Programmtyp Kern
Entwickler Commodore International
Entwicklungsmodell geschlossene Quelle
Tatsächlicher Zustand diskontinuierlich
Technische Information
Unterstützte Plattformen

KERNAL [ 1 ] ist Commodores designierter Name für den ROM - residenten Betriebssystem- Kernel auf seinen 8 - Bit -Heimcomputern ; aus dem ursprünglichen PET von 1977 , gefolgt von den eng verwandten, aber erweiterten Versionen, die in seinen Nachfolgern verwendet werden: VIC-20 , Commodore 64 , Plus/4 , C16 und C128 .

Beschreibung

Der KERNAL von 8-Bit-Commodore-Maschinen besteht aus systemnahen, hardwarenahen Betriebssystemroutinen, die ungefähr dem BIOS auf IBM - kompatiblen PCs entsprechen (im Gegensatz zu den BASIC-Interpreterroutinen, die sich ebenfalls im ROM befinden), sowie aus höheren Ebene geräteunabhängige I/O-Funktionalität und kann vom Benutzer über eine Hop-Tabelle aufgerufen werden, deren mittlerer (ältester) Teil aus Gründen der Abwärtskompatibilität [ 2 ] in der gesamten 8-Bit-Serie weitgehend identisch bleibt. Das KERNAL-ROM belegt die letzten 8 KB des 64-KB-Adressraums der 8-Bit-CPU ($E000-$FFFF).

Die Sprungtabelle kann so modifiziert werden, dass sie auf vom Benutzer geschriebene Routinen zeigt, beispielsweise durch Umschreiben der Bildschirmanzeigeroutinen, um animierte Grafiken anzuzeigen, oder durch Kopieren des Zeichensatzes in den RAM. Diese Verwendung einer Sprungtabelle war damals für kleine Computer neu. [ 3 ]

Adventure International - Spiele , die für den VIC-20 auf Kassette veröffentlicht wurden, sind ein Beispiel für Software, die KERNAL verwendet. Da sie nur die Sprungtabelle verwenden, können Spiele in den Festplattenspeicher heruntergeladen, auf einen Commodore 64 geladen und ohne Änderung ausgeführt werden. [ 4 ]

Der KERNAL wurde ursprünglich für den Commodore PET von John Feagans geschrieben, der die Idee einführte, die BASIC-Routinen vom Betriebssystem zu trennen. Es wurde von verschiedenen Leuten entwickelt, insbesondere von Robert Russell, der viele der Funktionen für den VIC-20 und den C64 hinzufügte.

Beispiel

Die folgende 6502 - Assemblersprachen- Subroutine [ 5 ]​ (geschrieben im ca65-Assembler-Format/Syntax) liefert ein einfaches, aber charakteristisches Beispiel für die Verwendung von KERNAL:

CHROUT   =  $ffd2           ; CHROUT ist die Adresse der Zeichenausgaberoutine
  CR       =  $0d             ; PETSCII-Code für Carriage Return
  ;
  Hallo:
          ldx  #0            ; Beginnen Sie mit dem Zeichen 0, indem Sie 0 in das x-Indexregister laden
  nächste:
          lda  Nachricht , x     ; Byte von Adresse Message+x in den Akku laden
          fertig  ; _          Wenn der Akkumulator null enthält, sind wir fertig und wollen aus der Schleife heraus verzweigen
          jsr  CHROUT        ; Rufen Sie CHROUT auf, um Zeichen auf dem aktuellen Ausgabegerät auszugeben (standardmäßig Bildschirm)
          in x               ; Erhöhen Sie x, um zum nächsten Zeichen zu wechseln
          bne  weiter          ; Schleife zurück, während das letzte Zeichen nicht Null ist (maximale Zeichenfolgenlänge 255 Bytes)
  spenden:
          rts               ; Rückkehr vom Unterprogramm
  ;
  Botschaft:
          .byte  "Hallo Welt"
          .byte  CR ,  0       ; Wagenrücklauf und Nullmarkierung am Ende der Zeichenfolge

Dieser Stub verwendet die Routine CHROUT, deren Adresse die Adresse $FFD2(65490) ist, um eine Textzeichenfolge an das Standardausgabegerät (z. B. den Anzeigebildschirm) zu senden.

Der Name

Der KERNAL war in Commodore seit den Tagen von PET als Kernel [ 6 ] bekannt , aber 1980 schrieb Robert Russell das Wort Kernal in seinen Notizbüchern falsch. Als die technischen Redakteure von Commodore, Neil Harris und Andy Finkel, Russells Notizen aufgriffen und sie als Grundlage für das VIC-20-Programmierhandbuch verwendeten, folgten ihnen die Rechtschreibfehler und blieben, wie sie waren. [ 7 ]

Gemäß dem alten Commodore-Mythos, der unter anderem von dem Autor/Programmierer Jim Butterfield berichtet wurde, ist das „ Wort “ KERNAL ein Akronym (oder vielleicht eher ein Retro-Akronym ) , das für Keyboard Entry Read , Network , A nd L steht Tinte. , was in Anbetracht seiner Rolle eigentlich Sinn macht. Berkeley Softworks verwendete es später bei der Benennung der Kernroutinen seines GUI-Betriebssystems für 8-Bit-Heimcomputer: GEOS KERNAL.

Auf geräteunabhängiger E/A

Überraschenderweise implementierte der KERNAL eine geräteunabhängige E/A-API, die sich nicht vollständig von Unix oder Plan-9 unterscheidet, die, soweit öffentlich bekannt, niemand ausgenutzt hat. Während man vernünftigerweise argumentieren könnte, dass in den letzteren Systemen „alles eine Datei ist“, könnten andere leicht behaupten, dass in ersterem „alles ein GPIB -Gerät ist“.

Aufgrund von Beschränkungen der damaligen 6502-Architektur erfordert das Öffnen eines E/A-Kanals drei Systemaufrufe. Ersteres setzt normalerweise den logischen Dateinamen über die SETNAM. Der zweite Aufruf, SETLFS, legt die Adresse des GPIB/IEEE-488-„Geräts“ fest, mit dem kommuniziert werden soll. Schließlich wird aufgerufen, OPENum die eigentliche Transaktion durchzuführen. Die Anwendung verwendet dann die Systemaufrufe CHKINund , um CHKOUTdie aktuellen Eingabe- bzw. Ausgabekanäle der Anwendung zu konfigurieren. Anwendungen können eine beliebige Anzahl von Dateien gleichzeitig geöffnet haben (bis zu einer systemabhängigen Grenze; ​​zum Beispiel erlaubt der C64 das gleichzeitige Öffnen von zehn Dateien). Danach sind CHRINund CHROUTfür die Eingabe bzw. Ausgabe nützlich. CLOSEDann schließe einen Kanal.

Beachten Sie, dass es keinen Systemaufruf zum „Erstellen“ eines E/A-Kanals gibt, da Geräte unter normalen Umständen nicht dynamisch erstellt oder zerstört werden können. Ebenso gibt es keine Möglichkeit, "E/A-Steuerungs"-Funktionen wie ioctl () unter Unix abzurufen oder auszuführen. Tatsächlich demonstriert der KERNAL hier viel näher an der Plan-9-Philosophie, wo eine Anwendung einen speziellen „ Befehls “-Kanal zum angegebenen Gerät öffnen würde, um solche „ Meta “- oder „ Out-of-Band “-Transaktionen durchzuführen. Um beispielsweise eine Datei von einer Festplatte zu " kratzen ", würde der Benutzer normalerweise die benannte Ressource S0:THE-FILE-TO-RMVauf Gerät 8 oder 9, Kanal 15, "öffnen". Gemäß der in der 8-Bit-Commodore-Welt etablierten Konvention repräsentiert Kanal 15 den "Befehlskanal". " für Peripheriegeräte, die sich auf Messaging-Techniken verlassen, um Befehle und Ergebnisse zu kommunizieren, einschließlich seltener Fälle. Beispielsweise finden Sie in Commodore BASIC möglicherweise Software ähnlich der folgenden:

  70  ... 
  80  REM ROTATE PROTOKOLLE DERZEIT GEÖFFNET AUF LOGISCHEM KANAL #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 READ ERROR CHANNEL 
  120  CLOSE  15 
  130  IF  A = ​​​​0  THEN  GOTO  200 
  140  PRINT  "ERROR RENAMING LOG FILE:" 
  150  PRINT  " CODE: " + A 
  160  PRINT  " MSG : " + B$ 
  170  END 
  200  REM FORTE VERARBEITUNG HIER, ERSTELLEN EINER NEUEN LOG-DATEI WÄHREND ... 
  210  ÖFFNEN  1 , 8 , 1 , "0:ERROR.0,S,W" 
  220  ...

Gerätenummern sind gemäß etablierter Dokumentation auf den Bereich [0,16] beschränkt. Diese Einschränkung ergibt sich jedoch aus der spezifischen Anpassung des IEEE-488-Protokolls und gilt tatsächlich nur für externe Peripheriegeräte. Da alle relevanten KERNAL-Systemaufrufe vektorisiert sind, können Programmierer Systemaufrufe abfangen, um virtuelle Geräte mit einer beliebigen Adresse im Bereich von 32.256 zu implementieren). Man könnte möglicherweise einen binären Gerätetreiber in den Speicher laden, die KERNAL-E/A-Vektoren patchen und von da an könnte ein neues (virtuelles) Gerät angesprochen werden. Bisher war diese Fähigkeit noch nie öffentlich bekannt, vermutlich aus zwei Gründen: (1) KERNAL bietet keine Mittel zum dynamischen Zuweisen von Geräte-IDs, und (2) KERNAL bietet keine Mittel zum Laden eines verschiebbaren Binärabbilds. Somit liegt die Last von Kollisionen sowohl im E/A-Raum als auch im Speicherplatz beim Benutzer, während die Plattformkompatibilität über eine breite Palette von Maschinen beim Softwareautor liegt. Falls gewünscht, könnte jedoch unterstützende Software für diese Funktionen leicht implementiert werden.

Logische Dateinamenformate hängen in der Regel von dem spezifischen adressierten Gerät ab. Das am häufigsten verwendete Gerät ist natürlich das Diskettensystem, das ein ähnliches Format verwendet wie MD:NAME,ATTRS, wobei M eine Art Flag ist ($ für die Verzeichnisliste, @, um anzuzeigen, dass eine Datei überschrieben werden soll, wenn sie bereits existiert und ansonsten nicht verwendet wird ), D ist die physische Laufwerksnummer (optional) (0: oder 1: für Systeme mit zwei Laufwerken, nur 0: für Laufwerke mit einem Laufwerk wie dem 1541 usw., die standardmäßig 0 ist: wenn nicht angegeben) , NAMEist ein Ressourcenname mit einer Länge von bis zu 16 Zeichen (die meisten Zeichen sind zulässig, außer bestimmten Sonderzeichen) und ATTRSist eine optionale, durch Kommas getrennte Liste von Attributen oder Flags. Wenn der Benutzer beispielsweise eine Programmdatei mit dem Namen überschreiben möchte, PRGFILEsieht er möglicherweise einen Dateinamen, wie @0:PRGFILE,Per in Verbindung mit Gerät 8 oder 9 verwendet wird. Dagegen besteht ein Dateiname für den RS-232-Controller (Gerät 2) einfach aus vier Zeichen , im Binärformat codiert. [ 8 ]

Andere Geräte wie die Tastatur (Gerät 0), die Kassette (Gerät 1), die Anzeigeschnittstelle (Gerät 3) und der Drucker (Gerät 4 und 5) benötigen keine Dateinamen, um zu funktionieren, vorausgesetzt, vernünftige Standardwerte oder nur sie brauche sie nicht. unbedingt.

Referenzen

  1. Referenzhandbuch für Commodore 64-Programmierer . Commodore Business Machines, Inc., 1982, p. 268
  2. Die KERNAL-Sprungtabelle, die verwendet wird, um auf alle Subroutinen im KERNAL zuzugreifen, ist ein Array von JMP-(Sprung-)Anweisungen, die zu den eigentlichen Subroutinen führen. Diese Funktion gewährleistet die Kompatibilität mit benutzergeschriebener Software für den Fall, dass Code innerhalb des KERNAL-ROM in einer späteren Revision verschoben werden muss.
  3. ^ "Erkundung des VIC-20" . 
  4. Kevelson, Morton (Januar 1986). "Sprachsynthesizer für Commodore-Computer / Teil II" . p. 32 . Abgerufen am 17. Juli 2014 . 
  5. Viele der KERNAL-Subroutinen (z. B. OPEN und CLOSE) wurden durch Seite drei im RAM geleitet, wodurch ein Programmierer die zugehörigen KERNAL-Aufrufe abfangen und die ursprünglichen Funktionen ergänzen oder ersetzen konnte.
  6. Der Kernel ist der grundlegendste Teil eines Programms, typischerweise eines Betriebssystems, das sich ständig im Speicher befindet und die grundlegenden Dienste bereitstellt. Es ist der Teil des Betriebssystems, der der Maschine am nächsten ist, und kann die Hardware direkt aktivieren oder eine Schnittstelle zu einer anderen Softwareschicht bilden, die die Hardware antreibt
  7. On The Edge: Der spektakuläre Aufstieg und Fall von Commodore , Seite 202.
  8. Commodore 128 Programmers Reference Guide , Commodore Business Machines, Inc., 1986, p. 382

Siehe auch

  • GEOS , grafisches Betriebssystem für Commodore 64 und 128.

Externe Links