HELP Contents

1 PMLエミュレータ使用ガイド

2 エミュレータの機能

3 PML言語リファレンス

4 外部入出力機器リファレンス

4.1 仮想モニタ

4.1.1 仮想モニタの概要

4.1.2 モニタで使用するポート

4.1.3 画面をクリアする

4.1.4 文字を表示する

4.1.5 文字色や背景色を設定する

4.1.6 文字の向きを変える

4.1.7 カーソルの操作をする

4.1.8 画面スクロールをする

4.1.9 画面描画との同期をする

4.2 キーボード

4.2.1 キーボードで使用するポート

4.2.2 キーボード情報を得る

4.2.3 キーコード

4.3 マウス

4.3.1 マウスで使用するポート

4.3.2 マウスボタン状態の取得

4.3.3 マウスカーソル位置の取得

4.4 タイマー

5 高度な機能

6 汎用ルーチンリファレンス

Top Menu

4 外部入出力機器リファレンス

このPML仮想コンピューターにはマウス、キーボード、仮想モニタ、それとタイマーがつながっていますが、この章ではこれらの機器を操作するためのI/Oポートの仕様を説明します。

ちなみにポート割り振りや入出力する値の仕様は、そのコンピューターや外部機器の設計者が好きに決めていい項目です。このPMLコンピューターは筆者がでっち上げた物なので、この入出力ポートの仕様もこの世に実際に存在するものではありません。だからこれを覚えたところで、何の役にも立ちません。I/Oポートを使って外部入出力機器を操作する例とでも考えておいて下さい。

実際のコンピューターでは外部入出力機器はI/Oポート以外でも操作されます。詳しくは7章の[補足:もう少し突っ込んだハードウェアの話]を見てみて下さい。

4.1 仮想モニタ

Page Top

4.1.1 仮想モニタの概要

Page Top

仮想モニタとはPMLエミュレータが起動したときに現れる真っ白なウインドウで、PML仮想コンピュータで何か画面表示を行いたい場合は、この画面に出力することになります。

仮想モニタは皆さんが通常使っているモニタと違って文字しか出せないという仕様になっています。

モニタ画面は以下のように48行×64桁のマス目に分割されていて、各マス(これを以後セルと呼びます)に以下のような通し番号が付いています。このセルに1つの文字を表示することができるので、このモニタは1行64文字で48行が表示できることになります。

行\桁012345960616263
0012345960616263
16465666768123124125126127
2128129130131132187188189190191
3192193194195196251252253254255
4256257258259260315316317318319
5320321322323324379380381382383
422688268926902691269227472748274927502751
432752275327542755275628112812281328142815
442816281728182819282028752876287728782879
452880288128822883288429392940294129422943
462944294529462947294830033004300530063007
473008300930103011301230673068306930703071

―――ここからは少し余談になりますが、こういうモニターをキャラクターディスプレイといって、コンピューターの草創期にはごく普通の存在でした。でもそういう時代でもモニターに文字を出すにはこのモニタの仕様のようにI/Oポートに出力するのではなく、VRAMという仕組みが使われました。

これはメインメモリの一部を直接モニタが読み出せるようにしておいて、コンピュータの方はその領域に表示したい情報を書いておいて、一定時間ごとにモニタはCPUを介さずにそこを読み取って画面に表示するという仕組みです。

その理由はいろいろありますが、まず最大の理由がI/Oポートへのデータ入出力がすごく遅いということが挙げられます―――実はこのPML仮想コンピュータのI/Oポートは少々インチキで、INもしくはOUT命令を発したら即座に結果が戻ってきます。

ところが実際の機器の場合そういうことはあり得ません。なぜなら本物のCPUの場合、メモリアクセスでさえもすごく遅いのでCPU内にレジスタという機構を備えているということを本書内でもちょっと説明しました。ところが外部入出力機器の遅さはそれどころではないのです。外部機器は一般にコンピューターの外側にケーブルでつながっていて、機器が反応する速度もまったくまちまちです。

だからIN命令を使う際にはほぼ確実に「データを寄こせ!」と指示してから実際にデータが来るまで、CPU的には永劫とでもいうべき時間を待っていなければなりません。またOUT命令を出してからその機器が実際にその命令を反映するのも同様です。

すなわちこの偽モニタのようにI/Oポートのみで画面描画制御するととんでもなく非効率なことになってしまうのです。そこで考え出されたのがVRAMという仕組みだったわけです。

ではなんでPML仮想コンピュータでVRAMを使ってないかというと―――(以下省略されました)

4.1.2 モニタで使用するポート

Page Top

このモニタを操作するためには以下のポートが使われます。

PORTINOUT備考
10hなしモニタのクリア値はShiftJisコード
11hセルの値を取得セルの値を設定して描画値はShiftJisコード
12hカーソル表示状態の取得カーソル表示状態の設定0でOff,0以外でOn
13h描画モード取得描画モード設定0:カーソルと描画位置は独立 1:描画位置にカーソルを移動 2:カーソル位置に描画位置を移動
14hなしハードウェアスクロールを行う値を±47で指定する 
15hフレームカウントフレームカウント初期化現在のフレームカウントを取得・設定する
20h指定されているセル番号の取得セル番号の指定値は0〜3,071
21h指定されているセル行の取得セル行の指定値は0〜47
22h指定されているセル桁の取得セル桁の指定値は0〜63
23h文字色(赤)の値取得文字色(赤)の設定値は0〜255
24h文字色(緑)の値取得文字色(緑)の設定値は0〜255
25h文字色(青)の値取得文字色(青)の設定値は0〜255
26hセル背景色(赤)の値取得セル背景色(赤)の設定値は0〜255
27hセル背景色(緑)の値取得セル背景色(緑)の設定値は0〜255
28hセル背景色(青)の値取得セル背景色(青)の設定値は0〜255
29h文字方向の取得文字描画方向の設定値は0,1,2,3でそれぞれ上向き、右向き、下向き、左向き。それ以上の値の場合、4で割った余りが文字方向になる。
30hカーソル位置のセル番号の取得カーソル位置のセル番号の指定値は0〜3,071
31hカーソル行の取得カーソル行の指定値は0〜47
32hカーソル桁の取得カーソル桁の指定値は0〜63

4.1.3 画面をクリアする

Page Top

ポート10hに出力を行うと指定された文字、文字色、背景色、文字の向きで画面を埋め尽くします。文字番号を0にしておけばこれは画面消去と同じです。

OUT	#10h	#41h	;'A'という文字で画面を埋め尽くす

4.1.4 文字を表示する

Page Top

モニタに文字を表示するためには以下のように出力します。

<セル番号で場所を指定する場合>

OUT	#20h	セル番号
OUT	#11h	表示する文字コード

<画面の行・桁で場所を指定する場合>

OUT	#21h	表示行
OUT	#22h	表示桁
OUT	#11h	表示する文字コード

以下は66番のセルに"A"という文字を表示させる例です。

<セル番号で場所を指定する場合>

OUT	#20h	#66	;66番のセル(画面2行3桁目)を指定
OUT	#11h	#41h	;'A'という文字(文字コード41h)を書き込む
OUT	#11h	#42h	;'B'という文字(文字コード41h)を書き込む
OUT	#11h	#43h	;'C'という文字(文字コード41h)を書き込む

<画面の行・桁で場所を指定する場合>

OUT	#21h	#1	;画面2行目を指定
OUT	#22h	#2	;画面3桁目を指定
OUT	#11h	#41h	;'A'という文字(文字コード41h)を書き込む
OUT	#11h	#42h	;'B'という文字(文字コード41h)を書き込む
OUT	#11h	#43h	;'C'という文字(文字コード41h)を書き込む

§文字を調べる

#11hポートから入力を行うと、現在の描画位置のセルに現在どんな文字が書かれているか知ることができます。

<66番のセルにどんな文字が書かれているか調べる例>

OUT	#10h	#66	;66番のセル(画面2行3桁目)を指定
IN	X	#11h	;66番のセルに書かれている文字コードがX番地に保管される

4.1.5 文字色や背景色を設定する

Page Top

文字の色やセルの背景色を変えたい場合は、ポート23h〜28hを使います。

例えば文字の色を赤、すなわちRGBが(255,0,0)にしたければ、

OUT	#23h	#255	;文字の赤の輝度を指定
OUT	#24h	#0	;文字の緑の輝度を指定
OUT	#25h	#0	;文字の青の輝度を指定
OUT	#11h	#41h	;'A'という文字(文字コード41h)を書き込む

といったように指定します。上の例だとAという文字が赤色で表示されます。

この場合も23h〜25hポートに値を設定しただけでは色は変わらず、11hに値を出力したとき初めて色が変わります。

文字の背景色を変更するには26h〜28hのポートを使用します。

OUT	#26h	#255	;背景色の赤の輝度を指定
OUT	#26h	#0	;背景色の緑の輝度を指定
OUT	#28h	#0	;背景色の青の輝度を指定
OUT	#11h	#41h	;'A'という文字(文字コード41h)を書き込む

4.1.6 文字の向きを変える

Page Top

文字の表示方向を変えるにはポート29hを使います。

OUT	#29h	#2	;文字の向きを下向きにする
OUT	#11h	#41h	;'A'という文字(文字コード41h)を書き込む

4.1.7 カーソルの操作をする

Page Top

疑似モニタにはテキストカーソル(キャレット)を表示する機能があります。これはあるセルが点滅するようにしたもので文字入力の際のガイドとして使われます。

カーソルを表示したり、今表示されているかどうかを取得するにはポート12hを使用します。

OUT	#12h	#1	;カーソルを表示する

カーソルの場所を設定するにはポート30h〜32hを使用します。

<セル番号で指定する場合>

OUT	#30h	#66	;66番のセル(画面2行3桁目)を指定

<画面の行・桁で場所を指定する場合>

OUT	#31h	#2	;カーソル行を2行目に設定
OUT	#32h	#3	;カーソル桁を3桁目を設定
§カーソルと文字描画位置の関係

カーソルは一般的に文字の入力位置を指定するために表示されますが、プログラムの都合によっては文字の表示位置とカーソル位置が連動してもらったら困る場合もあります。

そこでカーソルと文字描画位置については以下の描画モードが設定できます。

OUT	#13h	描画モード

描画モードには以下の意味があります。

描画モードその意味
0カーソル位置と描画位置は独立です。
1描画位置に自動的にカーソルが移動します。
2カーソル位置に自動的に描画位置が移動します。

4.1.8 画面スクロールをする

Page Top

ポート14hを利用することで画面をスクロールさせることができます。

OUT	#14h	#1	;画面を上に1行スクロールさせる

4.1.9 画面描画との同期をする

Page Top

ポート15hを読むと、現在のモニタのフレームカウントが取得できます。

疑似モニタはPCのグラフィック能力にも依存しますが、1秒間に約20回画面を書き換えます。アニメーションなどを行いたい場合、この描画フレームと処理を同期したいことがありますが、そういった場合にこのポートを使います。

OUT	#15h	0	;フレームカウントを初期化する
IN	X	#15h	;X番地にフレームカウントを読み込む

INで読み込むとフレームカウントを初期化してから現在何フレームが描画されたかの値が返ってきます。そこで例えば以下のようなコードを書くことで、フレームに同期した処理を行うことができます。

	OUT	#15h	#0	;フレームカウントを初期化する
>L:
	IN	X	#15h	;フレームカウントを読んで
	JPT	>L	X	;0だったらループする
	...続きの処理

4.2 キーボード

Page Top

4.2.1 キーボードで使用するポート

Page Top

キーボードの状態を取得するには以下のポートを使います。

PORTINOUT返り値
100hキーコード00h〜0Fhの状態取得なし下位ビットより00h〜0Fhのキー状態
101hキーコード10h〜1Fhの状態取得なし下位ビットより10h〜1Fhのキー状態
102hキーコード20h〜2Fhの状態取得なし下位ビットより20h〜2Fhのキー状態
103hキーコード30h〜3Fhの状態取得なし下位ビットより30h〜3Fhのキー状態
104hキーコード40h〜4Fhの状態取得なし下位ビットより40h〜4Fhのキー状態
105hキーコード50h〜5Fhの状態取得なし下位ビットより50h〜5Fhのキー状態
106hキーコード60h〜6Fhの状態取得なし下位ビットより60h〜6Fhのキー状態
107hキーコード70h〜7Fhの状態取得なし下位ビットより70h〜7Fhのキー状態
108hキーコード80h〜8Fhの状態取得なし下位ビットより80h〜8Fhのキー状態
109hキーコード90h〜9Fhの状態取得なし下位ビットより90h〜9Fhのキー状態
10AhキーコードA0h〜AFhの状態取得なし下位ビットよりA0h〜AFhのキー状態
10BhキーコードB0h〜BFhの状態取得なし下位ビットよりB0h〜BFhのキー状態
10ChキーコードC0h〜CFhの状態取得なし下位ビットよりC0h〜CFhのキー状態
10DhキーコードD0h〜DFhの状態取得なし下位ビットよりD0h〜DFhのキー状態
10EhキーコードE0h〜EFhの状態取得なし下位ビットよりE0h〜EFhのキー状態
10FhキーコードF0h〜FFhの状態取得なし下位ビットよりF0h〜FFhのキー状態
110h設定されたキーコードのキー状態キーコードの設定読込時は0か1,書込時は0〜255

4.2.2 キーボード情報を得る

Page Top

キーボードの情報を得るためのポートはやたらたくさんありますが、まず通常の利用では110hポートを使います。このポートは調べたいキーのキーコードを出力してから読み込むと、そのキーが今押されていれば1、押されていなければ0が返ります。

OUT	#110h	#20h	;スペースキーのキーコードを送る
IN	X	#110h	;X番地にキーの状態が返る

このポートを利用した場合、二つのキーが同時押しされているかどうかは分かりません。そこで複数のキーが同時押しされているかどうかを調べたい場合は以下のように面倒なことにはなりますが、10xhのポートを使用します。

IN	X	#101h	;X番地にキーコード10h〜1Fhまでのキー情報がセットされる。

こうやって読んだXには以下のようにキーコードに対応するビットに値が設定されます。

ビット1514131211109876543210
キーコード1F1E1D1C1B1A19181716151413121110

例えば得られたデータが3hだったとします。するとこの値は二進数で表すと 0000000000000011 となりますが、これは第0ビットと第1ビットが1になっていて、それに対応するキー10hはシフトキー、11hはコントロールキーなので、要するにコントロールキーとシフトキーが同時に押されていることを示します。

4.2.3 キーコード

Page Top

キーボードのキーをコンピュータが区別できるように割り振られた値をキーコードといいます。PML仮想コンピュータでは以下のキーコードが使えます。

コードキー名称コードキー名称コードキー名称コードキー名称
08hBackspace37h757hW76hF7
09hTab38h858hX77hF8
0DhEnter39h959hY78hF9
10hShift41hA5AhZ7AhF11
11hCtrl42hB60hNum 07BhF12
1BhEsc43hC61hNum 1BAh:
20hSpace44hD62hNum 2BBh;
21hPageup45hE63hNum 3BCh,
22hPagedown46hF64hNum 4BDh-
23hEnd47hG65hNum 5BEh.
24hHome48hH66hNum 6BFh/
25hLeft49hI67hNum 7C0h@
26hUp4AhJ68hNum 8DBh[
27hRight4BhK69hNum 9DCh\
28hDown4ChL6AhNum *DDh]
2ChPrintscreen4DhM6BhNum +DEh^
2DhInsert4EhN6DhNum -
2EhDelete4FhO6EhNum .
30h050hP6FhNum /
31h151hQ70hF1
32h252hR71hF2
33h353hS72hF3
34h454hT73hF4
35h555hU74hF5
36h656hV75hF6

4.3 マウス

Page Top

4.3.1 マウスで使用するポート

Page Top

マウスの情報を取得するには以下のポートを使います。

PORTINOUT備考
200hマウスボタン状態取得なし値は0〜3
201hマウス位置取得なし値は0〜3,071
202hマウス行位置取得なし値は0〜47
203hマウス桁位置取得なし値は0〜63

4.3.2 マウスボタン状態の取得

Page Top

以下の例のようにポート200hを読み込むことで、現在のマウスボタンの状態を取得できます。

IN	X	#200h	;X番地に現在のマウスの状態を読み込む

読まれた状態の値は以下の意味を持っています。

2進法の値意味
0000押されていない
1001左ボタンが押されている
2010右ボタンが押されている
3011左ボタンと右ボタンが押されている
4100中央ボタンが押されている
5101中央ボタンと左ボタンが押されている
6110中央ボタンと右ボタンが押されている
7111すべてのボタンが押されている

4.3.3 マウスカーソル位置の取得

Page Top

以下のように201hポートを読むことで、現在マウスカーソルがあるモニタのセル番号を取得できます。

IN	C	#201	;C番地にマウスカーソルのあるセル番号を得る

また以下のように202hポートと203hポートを読むことでマウス位置の行、桁を取得できます。

IN	Y	#202	;Y番地にマウスカーソルのある行番号を得る
IN	X	#203	;X番地にマウスカーソルのある桁番号を得る

4.4 タイマー

Page Top

ポート300hにはタイマーがつながっていて以下のように使用します。

PORTINOUT備考
300hタイマー取得タイマー設定値は0〜65535

これはストップウォッチのようなもので、使うにはまずポート300hに1以上の値を設定します。

続いてポート300hを読むと設定してから経過した時間が取得できます。

時間の単位は“ミリ秒*設定時にセットした値”となります。

例えば以下のように10と設定すると10ミリ秒単位の値が戻ってきます。

OUT	#300h	#10	;10ms単位のタイマー設定
IN	X	#300h	;タイマーの値を取得する