HELP Contents
この章はPMLエミュレータの基本的な使用方法を解説します。
今このHELPを見ている方はこのソフトウェアをインストールできて起動もできているはずだと思います。そしてなぜこのHELPを見ているかというとほぼ間違いなく―――
それでどうすればいいんだ?
と途方にくれているからなのではないでしょうか。
PMLエミュレータが起動したらおおむね以下のような画面になっていると思いますが―――
えーっとこのままでは―――
何もできません!
「コンピューター、ソフトなければただの箱」ということわざをこれ以上もなく体現している存在と言えるでしょう。そこでまずソフトウェアをどうにかしなければならないわけですが、その前にちょっとこれから使おうとしている物がどういう代物かということを解説しておきます。
PMLエミュレータとは、PC上に仮想的なPMLコンピューターを作成したものです。
まずPML仮想コンピュータというのが中心にあって、それにマウス、キーボード、仮想モニタというのがつながっています。これは以前世界で最も手抜きで書いたコンピューターの図に似ていますが、それにさらにPMLアセンブラというのがつながっています。
仮想モニタというのが起動したらいきなりでてきた真っ白なウインドウです。これはPML仮想コンピュータ用のディスプレイで、ここにデータを出力することで色々な表示をすることができます。マウス・キーボードはみなさんのPCにつながっているものそのままです。
このマウス、キーボード、仮想モニタがPML仮想コンピュータの外部入出力機器です。
しかしPMLアセンブラというのは外部入出力機器ではありません。なぜなら、マウス、キーボード、仮想モニタについてはは仮想コンピュータからINやOUTといった機械語命令で情報を読んだり指令を出したりできますが、アセンブラに対してはいっさい何もできないからです。そういう意味で矢印が一方向になっています。
PMLアセンブラにはウインドウズ上で作ったPMLアセンブリプログラムをアセンブルして、できた機械語を仮想コンピューターに送り込む機能があります。またコンピュータの動作の制御(実行させたり、一時中断させたりなど)することもできます。PML仮想コンピュータを制御するための専用の機器がつながっていると思ってもらったらOKです。そしてみなさんが見ているPMLエミュレータと出ている画面はこの専用機器の画面なのでした。
さて、それではとにもかくにもプログラムを入力してやらなければ話が始まりません。
そこで画面下の数字がたくさん並んでいる画面に注目します。
この画面はメモリビューといってPML仮想コンピュータのメモリを0番地からずっと見ることのできる画面です。これはみんな16進数で表示されていますが、必要に応じて表示(V)メニューから、10進数表示に切り替えることができます。以下は表示が16進数だということでいろいろ説明していきます。
この画面は1行が16ワードで全部で4096行あります。すなわち総計65536個のメモリの中身をここですべて見ることができます。
起動直後は0ばっかりですが一つだけ例外としてSP(FFFEh番地)の値がFFEFhになっています。
ではここで0番地から5105h 0011h 82a0h FFF0hと値を入力してみましょう。
入力できましたか? できたなら以下のような画面になっていると思います。
では今度こそ実行ボタンを押してみて下さい。
するとどうですか? 左上の表示欄に実行終了:2steps(Total:2steps)と表示されてモニタの一番左上に「あ」という文字が現れたはずです。
この"5105h 0011h 82a0h FFF0h"という値の列は機械語で仮想モニタに「あ」という文字を表示して終了するプログラムでした。このようにして機械語プログラムを入力していくことで、PML仮想コンピュータに様々な作業をさせることができます。END。
―――とか言ったら怒られますね。当然です。こんなこと生身の人間にはとてもじゃありませんがやってられない作業です。
しかも、もう一度やってみようとして実行ボタンを押してもなぜか動きません。なぜなら"FFF0h"という命令を実行したためにコンピュータは動作停止状態になっているからです。そこで最初からやろうと思って
リセットボタンを押してみたら―――今度はきれいさっぱり入力したデータが消えてしまいました!
これは嫌がらせではなくリセットをしたときの仕様です。状態を保存しておく方法はありますが(ファイル(F)/現在の環境を保存(S)を使います)そこまでしてこんな呪文を入力し続けたい人はあまりいないでしょう。そこでPMLアセンブラの登場となるわけです。
ちなみにパソコン草創期はみんなこういった方法でプログラムを入力していました。1980年代に少年だった、今ではおじさんのプログラマーが「ベーマガ片手に打ち込んでたら誤植があってさ〜」なんて昔話をしてくれることがあるかもしれませんが、その打ち込みというのがまさに今あなたが行ったことです。
うげ〜って思ったと思いますが、でもさらにその昔は1ビットを表すスイッチをパチパチON/OFFして二進数を入力したり、さらにその前はワイヤーを直接つなぎ替えてプログラムをしていたと聞きますから、これでもものすごく親切になっているんですが……
そこで今度はPMLアセンブラを使ってプログラムを読み込むことにしましょう。
まず左上のファイルメーニューを開いてファイル(F)/読み込み(L)を選択します。するとファイル読み込みのダイアログボックスが開いて、その中にサンプルプログラムが幾つか入っていると思います。そこからまず[4-09-1]とりあえずの掛け算.pasmというのを選んでみましょう。
プログラムを読み込むと次のような画面になっていると思います。
右上の画面はソースビューと称し、ここにプログラムソースが表示されています。そこに現れた内容は本書内でも見たことがあるはずです。何をしているのか忘れてしまったのなら、もう一度本書の4-9節を見直してみてして下さい。
画面左上にはロード&アセンブル完了と出ています。ここにエラーが出ていなければ、プログラムは正常にアセンブルされてPML仮想コンピュータのメモリ内にロードされています。
メモリビューを見てみると何やら数値が書かれています。4002 0064 0000〜とあとはずっと0ですが、これは最初に100番地までジャンプしろという命令です。
実は本書内でこのプログラムは100番地以降に書き込まれている設定になっているので、本体は100番地以降に書き込まれているんですが、PML仮想コンピュータはまず0番地から実行を始めます。そこでサンプルプログラムの冒頭に100番地までジャンプしろという命令を入れているのです。だからメモリビューの画面を64h番地(10進数の100は16進数では64hです)までスクロールさせればとりあえずのかけ算の機械語命令が見えてきます。
さあこれで実行する準備ができました。
と、ここでいきなり動かす前に左上の画面がわりと重要なのでその説明をしておきましょう。
左上の画面はラベルビューといってその名の通りラベルを表示した画面です。ラベルとは5-1節で説明したとおり、数値に適当な文字列を割りあてた物でした。起動時には以下の6つが表示されています
PC | プログラムカウンタ(プログラムの現在の実行アドレスを示す) |
SP | スタックポインタ(現在のスタックのアドレスを示す) |
VF | オーバーフローフラグ(符号付き計算結果のオーバーフローを示す) |
SF | サインフラグ(符号付き計算結果がマイナスになったことを示す) |
ZF | ゼロフラグ(計算結果がゼロになったことを示す) |
CF | キャリーフラグ(符号なし計算結果の桁あふれが発生したことを示す) |
以上は本書内でも説明したと思いますが、さらにその下にResult, X, Yといういうのが現れていると思います。
これはサンプルプログラム内でEQUをつかって1000h,1001h,1002hを割りあてているラベルです。なぜそうしたかというとソース内で計算にその番地を使っているのですが、こうしてラベル化しておくことでラベルビューにその値を表示することができるからです。
下のメモリビューでも見ることができますが、1000h番地まで画面をスクロールさせるのも面倒だし、プログラムを実行したら表示が変わってしまうこともあるので、ラベルビューに表示させているのが一番見やすいのです。
ラベルの横には数値を表示する桁が3つあります。
値 | ラベルのそもそもの値です。 Resultの例なら1002hという値を持っています。 |
参照値 | ラベルの値を番地とみなしてその番地に入っている値です。 Resultの例ならば1002h番地に入っている値のことです。 |
間接値 | 間接参照値、すなわち参照値を番地とみなしてその番地に入っている値です。 Resultの例ならば1002h番地に入っている値の0番地に入っている値(最初は4002h)になります。 |
ここを見ていれば各値がどう変化していくかがわかるわけです。
さて、右上にいろいろあるボタンが、先ほども少し使いましたが、プログラムを実行させたり停止させたりするボタンです。
メニュー項目 | 機能 |
---|---|
![]() | プログラムを一気に実行します。停止ボタンを押すか、HALT命令で止まるまでエミュレータ画面は再描画されません。 |
![]() | エミュレータ画面上に現在実行されている命令を表示しながら実行します。 |
![]() | ボタンを押したら1行実行して止まります。 |
![]() | 実行中のプログラムを停止させます。 |
![]() | ロード直後の状態に戻して最初からやり直します。 |
ではまず一番左の実行ボタンを押してみましょう。
………………
………
一瞬で何かが終わってしまったと思います。
でもよく見てみると左上に実行終了:446steps(Total:446steps)と出ていて、Resultの参照値が、さっきは0000だったのが、6946になっていると思います。これは245×110の答えを16進数で表したものです。たった今の一瞬でコンピューターは245を110回足してくれたわけです。
さて実行ではちょっと速すぎる、という場合のためにあるのが
トレース実行機能です。こちらのボタンを使えばもっとゆっくりと動きを見ることができます。でも今行った計算のためにコンピュータは終了状態になっています。そのためまた
リセットボタンを押す必要があります。
リセットしたらトレース実行ボタンを押してみます。すると、今度はコンピューターが一生懸命何かを始めた様子が分かると思います。
ここでラベルビューのResultの項とYの項に注目して下さい。値が変動していくのが分かるでしょう。そしてYが0になったら終了します。
実行では一瞬で終わった間に実はこれだけの作業が行われていたわけです。
実行中に停止ボタンを押せば実行が停止します。停止させた後、また
トレース実行や
実行を行うと、止まった場所から実行が再開します。
ここで一つ注意事項として、トレース実行中にはプログラムの進行と共にソースビューの選択行が動いていったのが分かると思いますが、この選択行がマウスやカーソルキーなどで動かせることに気づいた方もいると思います。でもそうした場合表示が動くだけで実際のプログラムの実行位置は動きません。実行を途中で止めて別の行を選択して再開しても、選択した場所ではなくプログラムが止まった場所から再開します。
選択行を動かせるようにしている理由は、本をとてもじっくり読むときなどに指でなぞりながら読むといいように、目でソースを追いかけるときに便利だからです。
またソースビューには選択行のジャンプ機能というのがあります。例えばあるところにサブルーチンへのCALL命令があって、その場所が知りたくなったとします。でもサブルーチンというのは普通ソースのどこか遠くにあります。前か後かも分かりません。でもそういうときに慌てずにCALL命令のある行を選択して文字キーのJを押すと、サブルーチンのラベルに選択行が一発で移ります。
さてもしトレース実行でもやっていることが速すぎてよく分からないという場合は、ステップ実行ができます。このボタンを押したらプログラムが1ステップだけ実行されます。じっくりと動きを確かめたいときはこれが便利です。
でもこの程度の小さなプログラムならともかく、迷宮脱出プログラムのような大きなプログラムだと、途中をすっ飛ばしてあるところまで一気に実行して、そこで一時停止してほしい場合も出てきます。
そういうときに便利なのがブレークポイントです。
これはプログラムを中断したい行を右クリックしてメニューから選ぶか、その行をダブルクリックすると設定することができます。ブレークポイントの設定された行は下図のように番地の欄が黄色くなります。
あともう一点、トレース実行とステップ実行はサブルーチン呼び出しがあった場合、そのままではサブルーチンの中には入って行かずスルーしていきます。サブルーチンの中まで動きを見たい場合その瞬間にCTRLキーを押している必要があります。
なぜこんな仕様かというと、ちょっと大きめのプログラムとかを作っていると、やたらとサブルーチンの呼び出しが増えてきます。例えばかけ算や割り算などもサブルーチンになっていますが、そんなサブルーチンにまでいちいち入って行かれたら逆に鬱陶しいというのは想像がつくでしょう。なので必要なときにだけ入っていけるようにしているのです。
プログラムの実行に関してはだいたい以上のような感じです。そうやってある程度プログラムの動きを見終わったら、今度はプログラムの変更をしてみたくなると思います。このかけ算の例でですが、かける数が245×110固定になっていますが、他の数に変えても正しく動くか見てみたくなったとします。するとそのためにはプログラムのソースファイルを変更する必要が出てきます。
プログラムのソースファイルは初期状態であれば、PMLエミュレータがインストールされているフォルダの中にPASMという名前のフォルダがあって、その中にpasmとい拡張子のテキストファイルとして保存されています。
しかしそこでエクスプローラーを使ってファイルを捜しに行かなくとも、以下の2種類の方法でソースファイルを開くことができます。
両者には重要な機能の違いがありますが、今の状況ではどちらでも同じです。好きな方を選択してもらえばプログラムのソースファイルがメモ帳で開かれたことと思います。
そこでソースの、3行目、4行目(赤い○の場所です)の計算する数を変更してメモ帳の上で上書き保存します。上記の例では365×80に変更しています。
修正が終わればPMLエミュレータに戻ってファイル(F)/読み込み直す(R)を実行します。
画面上に変更が反映されてメニューの下に「ロード&アセンブル正常終了」と出れば大成功です。
もしなんらかのエラーがあれば以下のようにアセンブルエラーが赤字で表示されます。エラー行にはエラーのあったファイル名と行番号(ファイル名の後のカッコの中の数値)が表示されていますので、該当の場所を修正して下さい。下記の例では、#80と書こうとして#8Oと書いてしまいました(数字の0とアルファベットのOは実際よく間違えます)。
ここまでくればあなたは曲がりなりにもプログラムを読み込んで実行させ、さらにそれの修正ができたということです。なにかまだ心許ないとは思いますが、こういったツールの使い方を覚える際はマニュアルを読んでいるだけではなくまずはいじってみるのが基本です。何が何やら分からなくなったらとりあえずリセットして最初からやり直せば何とかなるものです。
そんなわけでまずは同梱しているサンプルソースを動かして、適当に修正してみて下さい。そうしているうちになんとなく使い方は飲み込めてくるものです。
修正して壊したらどうしようとか悩む必要はありません。所詮偽機械語です。どうしても不安ならソースファイルのオリジナルのバックアップをとっておけば完璧です。
そして実は修正したらエラーが出てきてしまったとき、どうしてそんなエラーが出たのか? どうしたらそのエラーがなくなるのかと考えることこそが、実は一番プログラムの勉強になるのです。
以下は同梱されているサンプルプログラムについての簡単な解説です。
サンプルプログラムは初回起動時にマイドキュメントのPMLソースファイルというフォルダにコピーしますが、何かで消してしまってもう一度入れ直したいような場合は、インストールしたフォルダ(通常はC:\Program Files\PMLEmulatorとかC:\Program Files(x86)\PMLEmulatorなど)のなかにpasmというフォルダがあって、その中に入っています。そこから適当な場所にコピーして下さい。
ファイル名 | 内容 |
---|---|
[4-09-1]とりあえずの掛け算.pasm | 本書4-9節にあるサンプルプログラム |
[4-09-2]お馬鹿な割り算.pasm | 本書4-9節にあるサンプルプログラム |
[4-09-3]64ビット整数の足し算.pasm | 本書4-9節にあるサンプルプログラム |
[4-10-1]迷宮脱出.pasm | 本書4-10節の迷宮脱出プログラム |
[4-補足-1]賢い掛け算.pasm | 4章補足にあるサンプルプログラム |
[4-補足-2]賢い割り算.pasm | 4章補足にあるサンプルプログラム |
[4-補足-3]算術演算命令を使わない足し算.pasm | 4章補足にあるサンプルプログラム |
以上は本書内にあるサンプルプログラムです。
100番地から始まる、というようなものには冒頭に100番地にジャンプする命令を挿入していますが、それ以外は本書内にあるサンプルプログラムそのままです。
ファイル名 | 内容 |
---|---|
ビジュアル迷宮脱出(左手の法則).pasm | 脱出過程をモニタに表示し、初期位置設定もできるようにしたもの |
ビジュアル迷宮脱出(あてどなき彷徨).pasm | 脱出アルゴリズムを左手の法則から3章補足にあるサイコロを振って道を選ぶ方法に変えたもの |
迷宮脱出サブルーチン.pasm | 迷路の表示や位置設定などの共通サブルーチン(なのでこれだけ実行しようとしても動きません) |
MaizData.pasm | 迷路データ。3種類の迷路が入っています。 |
本書内のサンプルはとても見かけが地味なので、モニタに実際に冒険者が迷路から脱出する様子が分かるように表示を加えたものです。
本書内のサンプルはアドレスや色々な値すべて数字で記されていましたが、こちらはラベルを使って表記しなおしています。見かけはかなり違いますがアルゴリズムそのものは全く同じです。
さらに以下の追加機能が入っています。
ランダムウォークは、本書の補足でちょっと言及した、左手の法則で抜けられない迷路から抜ける方法の一つ、サイコロでも振って適当に道を決める、というので実際に抜けられることを示すサンプルです。
ファイル名 | 内容 |
---|---|
GeneralSub.pasm | 汎用的なサブルーチンと呼び出しマクロなど |
CalcSub.pasm | 算術演算用のサブルーチン集 |
StrSub.pasm | 文字列処理用のサブルーチン集 |
本書の新装版が出るというので、それじゃもうちょっとサンプルプログラムを拡充しようかと思って作り始めたところ、まずかけ算と割り算のルーチンが必要になって、さらには疑似乱数ルーチンを作るにはマルチワード数が扱えないとどうも十分ではないということになって、結局作ってしまったサブルーチン集です。内容の詳細は6章の汎用ルーチンリファレンスの方を見て下さい。