カーネル
KERNALは、8ビットホームコンピューターのROM常駐オペレーティングシステムコアのコモドールの名前です。 1977年の元のPETに続き、その後継で使用されている拡張された関連性の高いバージョン(VIC-20、Commodore 64、Plus / 4、C16、およびC128)が続きます。
説明
Commodore 8ビットマシンのKERNALは、IBM PC互換のBIOS(ROMにあるBASICインタープリタールーチンとは対照的)とほぼ同等の低レベルでハードウェアに近いOSルーチンと、上位レベルのデバイスに依存しないI / O機能、および下位互換性の理由から中央(最も古い)部分が8ビットシリーズ全体でほぼ同じままであるジャンプテーブルを介してユーザー呼び出し可能です。 KERNAL ROMは、8ビットCPUの64 KBアドレス空間の最後の8 KB($ E000- $ FFFF)を占有します。
ジャンプテーブルは、ユーザーが作成したルーチンを指すように変更できます。たとえば、画面表示ルーチンを書き換えてアニメーショングラフィックスを表示したり、文字セットをRAMにコピーしたりできます。このジャンプテーブルの使用は、当時の小型コンピューターでは初めてでした。
カートリッジのVIC-20用に公開されたAdventure Internationalゲームは、KERNALを使用するソフトウェアの例です。ジャンプテーブルのみを使用しているため、ゲームはディスクにメモリダンプされ、Commodore 64にロードされ、修正なしで実行できます。
KERNALは当初、John FeagansによってCommodore PET用に書かれました。JohnFeagansは、BASICルーチンをオペレーティングシステムから分離するというアイデアを導入しました。 VIC-20とC64の多くの機能を追加したロバートラッセルをはじめとする複数の人々によってさらに開発されました。
例
KERNALを使用したシンプルでありながら特徴的な例は、次の6502アセンブリ言語サブルーチン(ca65アセンブラー形式/構文で記述されています)によって提供されます。
CHROUT = $ ffd2; CHROUTは、文字出力ルーチンCR = $ 0dのアドレスです。キャリッジリターンのPETSCIIコード。こんにちは:ldx#0;次に0をxインデックスレジスタにロードして、文字0から開始します:lda message、x;アドレスmessage + xからアキュムレータbeq doneにバイトをロードします。アキュムレータがゼロを保持している場合、完了し、ループjsr CHROUTから分岐する必要があります。 CHROUTを呼び出して、charを現在の出力デバイス(デフォルトは画面)inxに出力します。 xをインクリメントして、次の文字bne nextに移動します。最後の文字がゼロ(最大文字列長255バイト)でない間にループバックします:rts;サブルーチンから戻る;メッセージ:.byte "Hello、world!" .byte CR、0;キャリッジリターンと文字列のゼロマーキング終了このコードスタブは、アドレスが$ FFD2(65490)のアドレスにあるCHROUTルーチンを使用して、テキスト文字列をデフォルトの出力デバイス(ディスプレイ画面など)に送信します。
名前
KERNALは、PETの時代からコモドール内部のカーネルとして知られていましたが、1980年にロバートラッセルはノートブックの単語をスペルとして間違っていました。コモドールのテクニカルライターであるニールハリスとアンディフィンケルがラッセルのメモを収集し、VIC-20プログラマーズマニュアルの基礎として使用したとき、ミススペルがそれに続いて行き詰まりました。
早期コモドールの神話によると、中でもライター/プログラマジム・バターフィールドによって報告された、「言葉」カーネルは、頭字語(または多分可能性が高い、バクロニム)であるが、K eyboard E ntry Rの EADのために立って、Nの etwork、番目のLインク 、それは実際にその役割を考慮すると理にかなっています。 Berkeley Softworksは後に、8ビットホームコンピューター用のGUI OSのコアルーチンであるGEOS KERNALに名前を付ける際に使用しました。
デバイスに依存しないI / O
驚いたことに、KERNALは、UnixやPlan-9と完全に類似していない、デバイスに依存しないI / O APIを実装しました。後者のシステムでは「すべてがファイル」であると合理的に主張できるのに対し、前者では「すべてがGPIBデバイス」であると簡単に主張できる人もいます。
当時の6502アーキテクチャの制限により、I / Oチャネルを開くには3つのシステムコールが必要です。最初の例では、通常、SETNAMシステムコールを使用して論理ファイル名を設定します。 2番目の呼び出しであるSETLFSは、通信するGPIB / IEEE-488「デバイス」アドレスを確立します。最後に、実際のトランザクションを実行するためにOPENが呼び出されます。次に、アプリケーションはCHKINおよびCHKOUTシステムコールを使用して、アプリケーションの現在の入力チャネルと出力チャネルをそれぞれ設定しました。アプリケーションには、同時に開くことができるファイルの数に制限はありません(システムに依存する制限まで。たとえば、C64では一度に10個のファイルを開くことができます)。その後、CHRINとCHROUTは、それぞれ実際に入力と出力を行うのに役立ちます。 CLOSEはチャネルを閉じます。
I / Oチャネルを「作成」するシステムコールが存在しないことに注意してください。通常の状況では、デバイスを動的に作成または破棄することはできません。同様に、Unixのioctl()などの「I / O制御」機能をシークする手段も実行する手段も存在しません。実際、KERNALは、アプリケーションがこのような「メタ」または「帯域外」トランザクションを実行するために、指定されたデバイスへの特別な「コマンド」チャネルを開くPlan-9哲学にはるかに近いことを証明します。たとえば、ディスクからファイルを削除(「スクラッチ」)するには、ユーザーは通常、デバイス8または9、チャネル15のS0:THE-FILE-TO-RMVというリソースを「オープン」します。 8ビットの世界では、チャネル15は周辺機器の「コマンドチャネル」を表し、例外的な場合を含め、コマンドと結果の両方を通信するためにメッセージパッシングテクニックに依存しています。たとえば、Commodore BASICでは、次のようなソフトウェアが見つかる場合があります。
確立されたドキュメントによると、デバイス番号は範囲に制限されています。ただし、この制限はIEEE-488プロトコルの特定の適応に起因しており、実際には外部周辺機器にのみ適用されます。関連するすべてのKERNALシステムコールがベクトル化されると、プログラマはシステムコールをインターセプトして、32,256の範囲の任意のアドレスを持つ仮想デバイスを実装できます。おそらく、デバイスドライバーバイナリをメモリにロードし、KERNAL I / Oベクトルにパッチを適用し、その瞬間から新しい(仮想)デバイスに対処することができます。これまでのところ、この機能は、おそらく次の2つの理由により、利用されていることは一般に知られていません:(1)KERNALは、デバイスIDを動的に割り当てる手段を提供しません。したがって、I / O空間とメモリ空間の両方での衝突の負担はユーザーにありますが、広範なマシンにわたるプラットフォームの互換性はソフトウェアの作成者にあります。それでも、これらの機能のサポートソフトウェアは、必要に応じて簡単に実装できます。
論理ファイル名の形式は、アドレス指定された特定のデバイスに依存する傾向があります。もちろん、使用される最も一般的なデバイスはフロッピーディスクシステムで、MD:NAME、ATTRSに似た形式を使用します。Mは並べ替えのフラグです(ディレクトリリストの場合は$、ファイルを上書きする場合は@それは既に存在し、それ以外は未使用です。)、Dは(オプションの)物理ディスク装置番号です(0:または1:デュアルドライブシステムの場合、0:1541などの単一ディスク装置の場合、デフォルトは0:指定しない場合、NAMEは最大16文字のリソース名(特定の特殊文字を除くほとんどの文字が許可されます)、ATTRSは属性またはフラグのオプションのコンマ区切りリストです。たとえば、ユーザーがPRGFILEというプログラムファイルを上書きする場合、デバイス8または9と共に使用される@ 0:PRGFILE、Pなどのファイル名が表示される場合があります。一方、RS-232ドライバー(デバイス2)のファイル名バイナリ形式でエンコードされた4文字で構成されます。
キーボード(デバイス0)、カセット(デバイス1)、ディスプレイインターフェイス(デバイス3)、プリンター(デバイス4および5)などの他のデバイスでは、機能するためにファイル名を必要としません。まったく。
ノート
- ^ Commodore 64プログラマーズリファレンスガイド 。 Commodore Business Machines、Inc.、1982、p。 268
- ^ KERNAL内のすべてのサブルーチンにアクセスするために使用されるKERNALジャンプテーブルは、実際のサブルーチンにつながるJMP(ジャンプ)命令の配列です。この機能により、KERNAL ROM内のコードを後のリビジョンで再配置する必要がある場合に、ユーザー作成ソフトウェアとの互換性が確保されます。
- ^ 「VIC-20の探索」。
- ^ Kevelson、モートン(1986年1月)。 「コモドールコンピューター用の音声合成装置/パートII」。 アホイ! 。 p。 32. 2014年7月17日検索。
- ^ KERNALサブルーチン(OPENやCLOSEなど)の多くはRAMの3ページ目でベクトル化され、プログラマは関連するKERNAL呼び出しをインターセプトし、元の関数を追加または置換できます。
- ^カーネルは、プログラムの最も基本的な部分であり、通常はメモリに常駐し、基本的なサービスを提供するオペレーティングシステムです。マシンに最も近いのはオペレーティングシステムの一部であり、ハードウェアを直接アクティブにするか、ハードウェアを駆動する別のソフトウェア層に接続することができます
- ^ エッジで:コモドールの壮大な上昇と下降 、202ページ。
- ^ Commodore 128 Programmers Reference Guide 、Commodore Business Machines、Inc.、1986、p。 382
外部リンク
- 提督KERNALの歴史