マシン語を始めた時
2024.11.27
確か高校生になってからマシン語の勉強を始めた。(Z80)
図書館でMSX用のマシン語の本を借りてきて、まずは画面にAという文字を表示させてみた。
次にループを作って、これを画面いっぱいに表示させてみてBASICと比べてみたらどうか。当たり前だけどBASICより速い。一瞬で出た。こんなに速いんだ、と。
こんなところからのスタートでした。
何を作ろうという目標はなかったけど、たとえば結果が画面に出るのはわかりやすかった。
マシン語に詳しい同級生から色々指導を受けた事もある。
たとえば、グラフィック画面を白黒反転するプログラムを作れ、とか。
画面の指定した範囲を、行き先の座標を指定して移動させろ、とか。
持ち帰って考えてみて、わからなかったら翌日聞いてみて、ああ、こんなふうにすればよかったのか、と。
そもそも最初はループを作るにはどうしたらいいか、というレベル。
DJNZはわかった。
でもグラフィックだったらアドレス空間だから8bitのDJNZでは足りない。16ビットのカウントはどうしたらよいか。
LD HL,0C000H
LD BC,02000H
LOOP:
LD A,(HL)
CPL
LD (HL),A
INC HL
DEC BC
LD A,B
OR C
JR NZ,LOOP
たとえば、こんなふうに書く。
OR C とか JR NZ, なんかは最初わからなかった。
フラグというものを利用する。
たとえば計算結果がゼロになったらZフラグが立つ。
ゼロか、ゼロでないか、という判断ができる。
そのほかに、キャリーというフラグもある。
上記では、BもCもゼロになるまでループするわけだ。つまり、2000H回繰り返す。
それなら、BとCを直接ORすればいいのにという疑問が出てくるけど、そういう命令はZ80には存在しない。Aと他のレジスタとの演算になるので、Bを一旦Aに入れてからCとORして、その結果のフラグを見る。
結果ゼロでなければ(NZ:ノンゼロ) LOOPへジャンプする。
プログラムの最後もきちんとしないといけない。たとえばBASICから呼び出しているならRETにするだろう。
何らかの止める命令を入れておかないと、これ以後も命令を実行し続けてしまい暴走する。
止めて良いならHALTとか、STOP: JR STOP のようにする。
JR命令は相対アドレスのジャンプ命令で、ハンドアセンブルの時はFF FE FD FC FB FA...と逆方向にジャンプ先まで数えていた。
絶対アドレスでも良いけど、1バイト増える。もったいない。(という考え方があった)
図書館でMSX用のマシン語の本を借りてきて、まずは画面にAという文字を表示させてみた。
次にループを作って、これを画面いっぱいに表示させてみてBASICと比べてみたらどうか。当たり前だけどBASICより速い。一瞬で出た。こんなに速いんだ、と。
こんなところからのスタートでした。
何を作ろうという目標はなかったけど、たとえば結果が画面に出るのはわかりやすかった。
マシン語に詳しい同級生から色々指導を受けた事もある。
たとえば、グラフィック画面を白黒反転するプログラムを作れ、とか。
画面の指定した範囲を、行き先の座標を指定して移動させろ、とか。
持ち帰って考えてみて、わからなかったら翌日聞いてみて、ああ、こんなふうにすればよかったのか、と。
そもそも最初はループを作るにはどうしたらいいか、というレベル。
DJNZはわかった。
でもグラフィックだったらアドレス空間だから8bitのDJNZでは足りない。16ビットのカウントはどうしたらよいか。
LD HL,0C000H
LD BC,02000H
LOOP:
LD A,(HL)
CPL
LD (HL),A
INC HL
DEC BC
LD A,B
OR C
JR NZ,LOOP
たとえば、こんなふうに書く。
OR C とか JR NZ, なんかは最初わからなかった。
フラグというものを利用する。
たとえば計算結果がゼロになったらZフラグが立つ。
ゼロか、ゼロでないか、という判断ができる。
そのほかに、キャリーというフラグもある。
上記では、BもCもゼロになるまでループするわけだ。つまり、2000H回繰り返す。
それなら、BとCを直接ORすればいいのにという疑問が出てくるけど、そういう命令はZ80には存在しない。Aと他のレジスタとの演算になるので、Bを一旦Aに入れてからCとORして、その結果のフラグを見る。
結果ゼロでなければ(NZ:ノンゼロ) LOOPへジャンプする。
プログラムの最後もきちんとしないといけない。たとえばBASICから呼び出しているならRETにするだろう。
何らかの止める命令を入れておかないと、これ以後も命令を実行し続けてしまい暴走する。
止めて良いならHALTとか、STOP: JR STOP のようにする。
JR命令は相対アドレスのジャンプ命令で、ハンドアセンブルの時はFF FE FD FC FB FA...と逆方向にジャンプ先まで数えていた。
絶対アドレスでも良いけど、1バイト増える。もったいない。(という考え方があった)
トラックバックURL
トラックバック一覧
コメント一覧
コメント投稿