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