Yamamoto's Laboratory
 
Lesson
 3.システム
     コール
 
 

Lesson 3CP/M のシステムコールシステムコールを利用したアセンブリ言語プログラム

CP/M 上で動作するプログラムは,システムコール を介して CP/M が提供するシステムサービスを利用できます.ここでは,システムコールとその使い方について説明します.

目次


システムコールについて

システムコールは,CP/M がユーザー提供するサービスプログラムです.主に,CPU から見た外部の機器を操作するときに使います.ユーザーが作成したプログラムが外部デバイスとのデータの送信/受信等を行うときに,システムコールを呼び出します.こうすることにより,外部デバイスの低レベルの操作を意識することなく,外部機器の操作ができます.Lesson 2 の「HELLO WORLD」のプログラム (リスト 1) を使い,システムコールの具体的な内容を示します.このプログラムは,スクリーンに「HELLO WORLD」を表示する操作でシステムコールを使っています.

アセンブリ言語での HELLO WORLD (HELLO.ASM)

01   ;---------------------------------------------------
02   ; "HELLO WORLD" PROGRAM USING BDOS
03   ;---------------------------------------------------
04           ORG     100H
05   START:
06           MVI     C,09H
07           LXI     D,TEXT
08           CALL    0005H
09           RET
10   TEXT:   DB      0DH,0AH,'HELLO WORLD',0DH,0AH,'$'
11           END

このプログラムの 01 – 03 はコメント文なので,動作には影響しません.マクロアセンブラでは,セミコロン「;」が現れると,そこから行末までがコメントになります.04 行目は実行時に機械語のプログラムが格納される先頭アドレスを示しています.CP/Mのプログラムは,アドレス 100H からメモリーに格納されなくてはなりません.05 行目は実行命令の開始を示しています.おまじないみたいなもので,あまり意味はありません.06 – 08 がシステムコールのための命令です.これについては,後で詳細に説明します.09 行目はプログラムの実行を OS に戻すためのリターン命令です.10 行目は,スクリーンに表示するデータを表しています.実行時に,命令と共にここに書かれているデータがメモリーロードされます.データの先頭アドレスは,シンボル「TEXT」で参照できます.11 行目のシンボル 「END」はプログラムの終了行を示してます.

Lesson 2 で示したとおり,このプログラムを実行すると,スクリーン上に「HELLO WORLD」と文字列が表示されます.これを,CPU が持っている命令のみで記述することは骨の折れる作業です.CPU は,スクリーンに文字を表示をするレジスターにプロトコルに従いデータを送る必要があります.普通に考えると,(1)スクリーンのレジスターに接続,(2)データ送付のための初期処理,(3)データの送付,(4)終了処理が必要になります.システムコールは,このような面倒な作業を引き受けてくれます.そのため,リスト 1 に示したような単純なプログラムでも,システムコールを用いることにより,本来複雑な作業であるスクリーンへの文字の表示ができます.

リスト1のシステムコールの動作を説明します.06 行目でシステムコールの機能を選択します.レジスター C の値を 09H にすることで,9番の機能である「文字列のプリントアウト」を選択します.プリントアウトとなっていますが,スクリーンに表示されます.07 行目で,プリントアウトする文字列の先頭アドレスを DE レジスターに設定します.マクロアセンブラーがシンボル TEXT をアドレスに変換します.プリントアウトされる文字列は,この先頭アドレスにある文字から順に,「$」(アスキーコード:24H) の文字が現れるまでです.08 行目で,実行を 0005H番地へ移すことによりシステムコールが実行されます.システムコールの処理後,実行は 09 行目の RET の命令に移ります.

システムコールに加えて,10 行目に書かれているスクリーンに表示するデータについても説明しておいた方がよいでしょう.最初の「ODH」はアスキーコードで,制御文字「CR」を表します.「0AH」は制御文字「LF」です.CP/M は「CR+LF」で改行になります.つぎは,「HELLO WORLD」の文字列です.再び「CR+LF」が現れて,表示するデータの終わりを表す「$」が書かれています.このデータにより,前後に改行のある「HELLO WORLD」が表示されることが理解できるでしょう.

システムコールのプログラム自体は,BDOSの領域に書かれています.0005H を CALL すると,Cレジスターの値に従い,BDOS のプログラムルーチンが実行されます.その際,BIOS を通して外部デバイスとの処理が行われます.このようにすることで,コンピューター毎のハードウェアーの違いは BIOS のプログラムで吸収できます.ハードウェアーが異なっても,BDOS は同一です.メーカーは BDOS に合わせた BIOS さえ書き直せば CP/M が動作するコンピューターを供給できます.プログラマーは,ハードウェアーの違いを気にすることなく,システムコールを使うことができます.したがって,CP/M の流儀にしたがって書かれたプログラムは,メーカーが異なったコンピューターでも同じように動作します.

システムコールの一覧

CP/M 2.2 は 38 個のサービス機能 (Service Fucntion) を提供しています.英文ですが詳しい情報は「CPM BDOS」から得られます.この説は,それをまとめたものです.

システムサービス

CP/M の BDOS のサービス機能.第二列の C-reg は呼び出す機能を決める C レジスターの値.引数 or 戻り値が「—」となっている欄は,値が無いことを示している.
機能 C-reg 引数(入力) 戻り値
システムリセット 00H
バージョン 0CH HL:バージョン番号
ファイルのオープン 0FH DE:FCBアドレス A:ディレクトリーコード
ファイルのクローズ 10H DE:FCBアドレス A:ディレクトリーコード
ファイルの検索 11H DE:FCBアドレス A:ディレクトリーコード
次の検索 12H A:ディレクトリーコード
ファイルの削除 13H DE:FCBアドレス A:ディレクトリーコード
シーケンシャル読み込み 14H DE:FCBアドレス A:ディレクトリーコード
シーケンシャル書き込み 15H DE:FCBアドレス A:ディレクトリーコード
ファイル作成 16H DE:FCBアドレス A:ディレクトリーコード
ファイル名の変更 17H DE:FCBアドレス A:ディレクトリーコード
ファイル属性の設定 1EH DE:FCBアドレス A:ディレクトリーコード
ユーザーコードの設定/取得 20H E:0FFH(取得) or コード(設定) A:コード or no value(?)
コンソールインプット 01H A:アスキーコード
コンソールアウトプット 02H E:アスキー文字
リーダーインプット 03H A:アスキーコード
パンチアウトプット 04H E:アスキー文字
リストアウトプット 05H E:アスキー文字
ダイレクトコンソール I/O 06H E:0FFH(入力) or 文字(出力) 文字 or ステータス
I/O バイトの取得 07H A:I/Oバイト
I/O バイトの設定 08H E:I/Oバイト
文字列のプリントアウト 09H DE:文字列のアドレス
コンソールバッファーの読み込み 0AH DE:バッファーアドレス コンソール文字
コンソールステータスの取得 0BH A:コンソールステータス
DMAアドレスの設定 1AH DE:DMAアドレス
ランダム書き込み 22H DE:FCBアドレス A:リターンコード
ファイルサイズの計算 23H DE:FCBアドレス ????
ランダムレコードの設定 24H DE:FCBアドレス ????
ゼロ書き込み 28H DE:FCBアドレス A:リターンコード
ディスクシステムのリセット 0DH
ディスクの選択 0EH E:選択されたディスク
ログインベクター 18H HL:ログインベクター
カレントディスク 19H A:カレントディスク
DMAアドレスの設定 1AH DE:DMAアドレス
ALLOC(??) 1BH HL:ALLOCアドレス
書き込み禁止 1CH
リードオンリーベクターの取得 1DH HL:リードオンリベクターの値
DISKPARMS(??) 1FH HL:DPBアドレス

ページ作成情報

参考資料

  1. CP/M の BDOS (システムコール) については,英文ですが「 CPM BDOS」に詳しい説明があります.
  2. 本 WEB ページのシステムコールについては,村瀬康治 著「応用 CP/M」を参考にしました.
  3. YAZE の WEB サイト

更新履歴

2014年10月24日 ページの新規作成


no counter