機械語でHello,World

ポケコンの機械語でHello,worldを表示する方法です。
BASICなどのプログラミングが出来、機械語をさわったことが無い・わからない方を対象にしています。

機械語(またはマシン語)とはポケコンの中のCPUが直接理解できるプログラミング言語のことで、いわゆる0,1の世界です。
これだと人間には非常にわかりづらいので、アセンブリ言語という機械語の代理言語を使います。
このアセンブリ言語というのは0,1の世界を簡単な英単語でわかりやすく表記することができるものです。
そして、アセンブリ言語で記述したものはアセンブラというソフトウェアにより機械語に変換されます。
ここでは、アセンブリ言語で記述したコードをアセンブリコード(または単にコード)と言うことにします。

ポケコンで機械語開発をするにあたっての必要なポイントです。

まずはじめに使えるメモリを確保します。RUNモードで「MON」と打ってENTERキーを押すと、MACHINE LANGUAGE MONITOR(機械語モニタ)のモードになります。
ここで、「USER 200」と入力してください。そうすると、100h〜200hのメモリを自由に使えることができるようになります。(この作業を怠ると、後で困ります)

その次にアセンブリコードを記述します。
TEXTモードで「E」を押し、ここにBASICと同じように行番号付きで記述していくことになります。

打ち込みが終わったら、今度はSHIFT+BASICキーを押すとASSEMBLERモードになります。
ここで「A」を2回押すと、TEXTモードで記述したアセンブリコードが機械語に変換されてメモリ上に展開されます。エラーがあればここで表示されます。

うまくアセンブルできれば、BASICのCALL命令で「CALL &H100」などを実行すれば動作します。

注意:機械語はデリケートです。1つでも間違いがあればポケコン内部のデータをつぶしてしてしまう恐れがあります。大切なデータのないポケコンでするか、自信がある人がやってください。
また、データが消えたといった責任は自己でお願いします。

それでは、Hello,worldを実際に表示するまでを順に追って説明したいと思います。

・メモリを確保する。
RUNモードで「MON」、その次の画面で「USER 200」と入力。
(解説:MONは機械語モニタのモードにするコマンドです。このモードでは機械語に関するさまざまな処理が行えます。USER 200はメモリを100h~200h確保することを意味しています。よくわからない方はおまじないだと思ってください。また、機械語のサイズが大きくなるとこの値も大きく していかなければなりません。)

・アセンブリコードを記述する。
TEXTキー(画面の右上の青いボタンの右)を押して、「E」を押します。
そこに以下を記述します。

10 ORG 100H
20 LD B,11
30 LD DE,0204H
40 LD HL,WORD
50 CALL 0BFF1H
60 RET
70WORD:DB 'Hello,world'

間違いがないか何度も確かめてください。ここで誤りがあると、データが破損する可能性があります。
特に50行目のCALLにご注意。

・アセンブルする
SHIFT+BASICキーを押して「A」を2回押します。
ここでエラーメッセージが表示されればアセンブリコードの文法かメモリ確保に間違いがあるので、上に戻って確認しなおしてください。
complete !というメッセージが表示されていればオッケーです。

・実行する
BASICキーを押してRUN MODEにしてください。
ここで「CALL &H100」と入力してENTERを押すと、実行されます。
やっと「Hello,world」が表示されたはずです。それ以外のものが表示されていたりフリーズしてしまった場合は間違いがあります。初めからやり直してください。データが壊れてしまったら、リセットを行ってからやり直してください。

コードの説明です。日本語部分が説明です。

10 ORG 100H
; 機械語を100hから展開することを意味します。
; 実行時のCALL &H100の100はこれです。

20 LD B,11
; Bレジスタに11を入れています。ここでは表示したい文字列の長さを意味しています。

30 LD DE,0204H
; DEレジスタに0204hを入れています。
; ここでは座標(4,2)の位置から文字列を表示することを意味しています。

40 LD HL,WORD
; HLレジスタにポインタWORDを入れています。
; ポインタWORDとはここでは文字列の確保されているアドレスです。
; つまり、"Hello,world"のアドレスということです。

50 CALL 0BFF1H
; 機械語のBFF1h番地を実行します。ここで文字列を表示しています。
; 今まで入力してきた文字列の長さ・座標・アドレスの3つの要素を元に文字列を表示させます。

60 RET
; 呼び出し元へ戻ります。ここでは呼び出し元はBASICなので、BASICに戻ります。
; つまり、プログラムの終了を意味しています。

70WORD:DB 'Hello,world'
; Hello,worldという文字列を展開します。また、この行のアドレスの代理にWORDという
; 言葉を使えるように定義しています。(50行目で使っています。)

できましたか?ポケコンはIOCS(CALL *** などのBIOSコールルーチン)を使うことで簡単に文字を表示できるようになっているので簡単でしょ?

Copyright(C) tosik
E-Mail:
Weblog: Tosikの雑記