やってみましょうZ80マシン語=第3改訂版=


マシン語は誰でもプログラムできます!体験してみてください。

 *やってみましょうZ80マシン語 初心者でマシン 語を始めたい人向けです

 MSXマシン語適当講座その1 マシン語からBASICの変数を取得、LD、CALL、INC

 MSXマシン語適当講座その2 SUPER-X、実行、アセンブラ、ソースを書く

 MSXマシン語適当講座その3 一時的にレジスタを使う、フラグ、レジスタ、転送

 MSXでマシン語BASIC 中級編 ハンド アセンブルから開発環境の話題です。

 命令セット一覧:Z80マシン語/MSX-DOS上級編 Z80、モニタアセンブラ、テキストエディタ


■MSXパソコンはBASICよりマシン語?

これはMSX2の初期の時代になりますが、
MSXBASICのマニュアルに「迷路」というサンプルプログラムがありました。
この迷路はメモリに迷路を作成するような感じと記憶しています。
そういうプログラムはMSX1には多くありました。

MSXBASICが苦手とするのはブロック転送です。数分かかります。
マシン語が得意とするのはブロック転送です。数秒で終わります。

配列変数である程度は作れますが、わかってくるとメモリの読み書きにするとラクたぶん。
昔はD00H、D008H、D010Hと8ステップか16ステップで書いていましたね。
要するにExcelで16×16のセルにデータを入れていた感じです。
MSXゲームをよく見ると面パーツが16×16ブロック以下になっていますね?
やはりMSX1のBASICではマシン語に近い使い方だった感じです。

でも、使いにくいところがあります。それはレジスタです。
レジスタはB,C,D,E,H,L,(HL),Aとありますが、レジスタによって特殊だったり
PUSHしたりPOPしたりと入っている数値を一時的に退避させたり
アドレスに数値を読み書きと、変数がないのでそのアドレスのデータは何か?
わかっている必要がありますが、

マシン語のニーモニックは一つの命令で長いものは5文字とPC言語に比べると短いです。
主要のコードはだいたい4文字くらいです。
また、CでもBASICでもないのでアセンブラはちょっと格好いいです。
プログラムはメモリに00,CD,3E,FF,C9という具合に書き込まれていきます。
16進数の並びでプログラムがわかるのは難しいのですが、
まず、アセンブラソースのパターンを知ることです。
「LD Aの後にCALL ED3AHだったらあの処理かな。」
と覚えていけば…何となくわかってきます。^^;
横にオペコードが並んでいるエディタもありますので
ハンドアセンブルできなくはないです。

■プログラミングは簡単?

MSXBASICでは
MSXBASICインタプリタが使っているマシン語プログラムと
MSXBASICが処理のために使っている文字、数字…
いわゆる、BIOSとワークエリアの2つの利用方法です。

・ファンクションキーの初期化(BIOS)

DEFUSR=62:A=USR(0)

62というのはアドレスの番号です。実行アドレスを62番地に設定した命令です。

これをBIOSと呼びますがBASIC言語のI/Oシステムで
Aレジスタなどに数値を入れて実行すると機能します。
BIOSについては次項で説明します。

・ワークエリアの書き換え(CALL SYSTEMを有効にする)

POKE&HF346,1:CALL SYSTEM

MSXBASICインタプリタはマシン語です。
サブプログラムを実行したり、状態を変えたりできます。
これはMSXBASICでマシン語プログラムをアドレスに読み込んだ場合にも使います。
次にその指定アドレスを実行します。

ワークエリアの書き換えはMSXBASICが実行している数値などの情報の
書き換えをします。
アドレスがF346Hに1を書き込みMSX-DOSを有効状態にします。
有効にしたりと設定情報を書き換えることができます。

■MSXの3文字を表示と解析

もうちょっとプログラムらしくMSXの3文字を表示させるようにする事を考えてみましょうか。
3文字ですから、アドレスは1バイトごとなので、メモリ(RAM)のアドレスは3つ必要です。
C300Hとかはナシにして、アドレスは単に1、2、3とします。
そこにMSXという文字をメモリ(RAM)に入れます。
次にMSXという順番に表示させるので、VRAMに読み込むMのアドレスの1を指定します。
1,2,3と加算していきます。最後にXを表示させて終わりですが、
あらかじめBIOSというMSXBASICのマシン語プログラムを使って手抜きするなら、

CHPUT EQU   00A2H
           ORG   D000H
           LD     A,'M'
           CALL CHPUT
           LD     A,'S'
           CALL CHPUT
           LD     A,'X'
           CALL CHPUT
           RET

CHPUTは00A2Hです。書き込み開始アドレスはD000Hからです。
AレジスタにASC("M")を入れます。CHPUT(キャラクタプット)を実行します。
EQUで00A2と定義されていますから00A2Hへ飛びます

00A2:  JP 0919H

0919:   PUSH HL
091A:   PUSH DE
091B:   PUSH BC
091C:   PUSH AF
091D:   CALL 0FDA4H

まず、Aレジスタの内容は一時的に置いておきます。

FDA4:  RET

0920:    CALL 0B4EH

0B4E:   LD    A,(0FCAFH)
0B51:   CP    02H
0B53:   RET

FCAFHからAレジスタに書き込みます。

0923:   JR    NC,0937H

Aレジスタの内容が02Hより-1の場合はそのまま次へ飛びます。
ほとんどのコードは0937Hへジャンプします。
と、まぁBIOSになるとこのように長くなってしまうので、
CHPUTというふうにBASICに表示は任せているのです^^;

3回繰り返して、RETでMSXBASICへ戻ります。

一般的にはDEFMですが…
BASICのようにPRINT"MSX"とはいきませんが、
考えればできそうなところではないでしょうか?

私らの小学校の図書館に「マシン語なんてこわくない」という本がありましたよ。
ロボットの挿し絵でレジスタに数を入れるような絵がありましたねぇ。
今の児童書はWindowsでペイントしましょう、音楽を聴きましょうと解説本じゃないですかね。
これでは、どう考えてもダメ教育でしょうか?
そう考えると学校ならばPC9801程度でよかったように思います。

■VBAとかAPIとかライブラリとか便利になったが原点に戻る?

ROMBASICのパソコンは外部記憶装置がなくても動かせる程度のものです。
安心してください。当分はセーブする必要はありません。
数時間かけてC++をマスターするとか、そんな事もしなくていいです。
Z80はマシン語ですから、
何度も似たオペコードをLD A,03HとかLD A,0DHとか何度も入力します。
打ち込みの反復練習で自然にマスターしていくと思います。
アドレスの意味がわかればレジスタ、フラグなど最初はわからなくてもいいです。
だから誰でもできる!
毎日やればZ80のハンドアセンブルなんてビックリする事ではないです。
C9はRET。オペコードは多少前後になることがありますが
いくらなんでも00〜FFまでの全部は無理ですが、
主要コードを覚えれば少しずつわかってきます。

Z80マシン語ニーモニック変換表:msx-mac1.html

■どうやって覚える?

マシン語はニーモニックを覚えるより
オペコードを覚えていったほうが応用がきく場合もあります。
こうすれば将来的にマシン語コードでCD90D3の場合、
D390Hをコールしていると一目でわかるでしょう。
しかも、オペコードは16進なので左手をABCDEFの英数、
右手を01234566789のテンキーとして打っていけば
経理の計算のように素早い打ち込みもできます。
とかっこいい事を書きましたが、
漢字の読み書きができないで日本語変換を使うとどうなるか?
漢字を書けなくなる。それに似たことがパソコンにもあります。
一目で16進のコードを見てもわかりません。
こういうアセンブラはどうでしょうか?
CFと打つとRST 08Hと表示されてBSキーで間違えを直し
CDと打ち直してCALLと表示されればいい勉強にもなります。
普通のアセンブラはCALLとニーモニックを打ち込み
CDとマシン語コードされるのが
一般的ですが、MSXBASICを使うならば、この方がいいでしょう。
このアセンブラは暇を見て作ってみたいです。

■こういうやり方でゲームはできる

マシン語のゲームはプログラムはRAM、グラフィックをVRAM
入れます。データを使わない簡単なゲームといえば
シューティングではないでしょうか?
MSXではVRAMにスプライトアトリビュートテーブルがあって
8×8ドットのスプライトは表示座標を動かすだけで移動できます。
まず、スプライトを作ったらVRAMに入れましょう。
これはBASICでもいいですよ。そして、BSAVEします。
あとはVRAMをBLOADすればスプライト、キャラクタなどがロードされます。
あとはマシン語プログラムでスプライトの移動処理だけをすればいいです。
BASICではVPOKE、VPEEKでしたがRDVRM 004AH、WRTVRM 004DH
で最初にHLレジスタにVRAMアドレス、AはVRAM送り値、返り値となります。
変化するレジスタはAFです。

メモリマップを見て1機目のデータなどのエリアを作っていきます。
その後に判定とかスコア計算とか背景とかやってできればゲームはできます。
0だからシューティングがマシン語で作りやすいゲームなんですね。
そうなってくるとやっぱり「MSX2テクニカルハンドブック」が必要でしょうね。
MSX2テクニカルハンドブック wiki:
http://ngs.no.coocan.jp/doc/wiki.cgi/TechHan

■MSXBASICより速い?

マシン語はコード化されたPCのプログラムです。
 MSXにはMSXBASICが備わっており、起動すればすぐにBASICになります。
これもマシン語による処理でこのようになります。
マシン語はプログラミング言語を必要としないので今まで使われてきましたが、
現在のPCでは複雑な処理になりプログラミング言語のC++などに環境が進化しました。
 MSXはZ80というCPUが備わっており、
多くのハードウェア機能を使うことでクリエイティブなマシンとして親しまれています。

■MSXパソコンだからできるパソコンのリセット

今のパソコンは電源ボタン長押しでリセットできますが、通常は再起動の処理をさせます。
リセットしてもPCが動かない事はないですが、OSの不具合が生じます。
MSXは動かなくなったらリセットしてもMSXが動かないことはありませんし、
MSX−DOS(2)が起動しないこともありません。
マシン語で動かなくなる事があればリセットしましょう。

さいごに★

ということで難しいのは嫌いですが、
一日でも早くマシン語がわかりたい人向けに
MSXマシン語適当講座」を3回にわたって特設しました。
この程度は知って欲しい最低限に抑えたものですが
ハンドアセンブラからモニタアセンブラの操作、アセンブルまで説明しています!

MSX:マシン語

本を買って使うよりも早く使えるようになると思いますよ。
ぷいにゅう!(ARIA風)