機械語の世界へようこそ - ミニアセンブラとSWEET16
CPUが実行するのは、機械語とかマシン語と呼ばれる0と1で出来た数字の塊です。メモリに格納された値をプログラムと解釈して命令を実行するか、データと解釈して演算するかは、置かれ方次第です。数字はただの数字です。
無印Apple][で、リセットした時に現れるアスタリスク(“*”)のプロンプトは、マシン語を扱うモニタと呼ばれるプログラムが動いていることを示します。ここで使うことのできるコマンドは、メモリの値を読み書きしたり、マシン語のプログラムを実行することです。
とはいえ、この状態でいきなりプログラムを書くことはしません。既にあるマシン語のプログラムを、必要なデータをメモリに用意して呼び出すのが普通です。
機械語モニタ
自分でマイコンボードを作った場合などは、このマシン語モニタまで書いて出来上がりです。BASICなどの高級言語などという「素人」向けの実装は、他から持ってくれば良いのです。これは売られているマイコンボードでも似たり寄ったりでしたが。
値は16進数のみ。コマンドは(16進数で使われていない)英字1文字またはCTRL文字ひとつ。いろいろな記号にも役割が割り当てられています。
Summary of Apple II Monitor Commands
Apple][のマシン語モニタには、単なる読み書き実行以外に便利な機能も含まれています。代表的なのはミニアセンブラとSWEET16です。
モニタコマンドである”L”で、メモリ上にあるコードを6502の命令だと解釈してアセンブラ表記で表示してくれます(逆アセンブラとかディスアセンブラと呼ばれる)。
*0L
0000- FF ???
0001- FF ???
0002- AD 30 C0 LDA $C030
0005- 88 DEY
0006- D0 04 BNE $000C
0008- C6 01 DEC $01
000A- F0 08 BEQ $0014
000C- CA DEX
000D- D0 F6 BNE $0005
000F- A6 00 LDX $00
0011- 4C 02 00 JMP $0002
0014- 60 RTS
6502の命令コードは必ず1バイト、1命令は1~3バイトしかなく、命令コードを人間に読みやすく表現するニーモニックも3文字固定ですので、読みやすいです(命令コードとして解釈できないと???と表示される)。
逆アセンブラがあるのですから、アセンブラも欲しくなります。ROMに積まれているのは「ミニアセンブラ」と呼ばれる機能で、これはサブルーチンなので、モニタのGコマンドで呼び出します。ミニアセンブラは「ミニ」なので、アドレスにラベルを付けることも出来ず、1行づつニーモニックをマシン語に変換するのみです。
*F666G
!0: INX
0000- E8 INX
! TXA
0001- 8A TXA
! JSR $FDED
0002- 20 ED FD JSR $FDED
! JMP $0
0005- 4C 00 00 JMP $0000
! BRK
0008-00 BRK
※ミニアセンブラを起動すると、プロンプトが”!”に変わります。覚えやすい開始アドレスを選んだのでしょう。ミニアセンブラを抜けるコマンドはあったような気もしますが、単にリセットしてしまうことも多かったかも。iie以降では”!”コマンドで起動できるようになっています。
Apple ][ Mini Assembler
https://www.callapple.org/vintage-apple-computers/apple-ii/apple-mini-assembler/
6502には8ビットのレジスタしか無く、16ビットを扱うにはコードをいちいち書かなくてはならず、同じようなコードを何度も書かなくてはなりません。おそらくWozはBASICインタプリタを書くにあたって、この問題に痛いほど直面したものと思われます。また元になるコードとしてミニコンで使われていたコードを参照することも多かったものと思われるので、移植を楽にするためにもミニコンのアーキテクチャに近い16ビットの仮想マシンを用意したんだと思います。これがSWEET16と呼ばれるサブルーチンです。
Sweet16
思い出したのは1980年頃の月刊アスキーの特集で、馴染みのなかった仮想マシンというものを説明するために、トグルスイッチをパチパチするレトロなマイコンの雰囲気をグラフィック画面で再現するSWETT16マシンのプログラムを取り上げていました(1979年10月号でしたね)。
確かに、ある程度の規模のコードを書かないと、わざわざ仮想マシンを使わないで、都度、コードを書いてしまいます。そのため名前を聞いたことがあってもSWEET16を使っている人は見たことがありませんでした。
Sweet 16: The 6502 Dream Machine
他のいろいろなサブルーチンであるとか、それらが使うメモリなどは、機会をあらためて。
Apple][は拡張スロットにCPUカードを挿すことで、CPUをすげ替えられるのですが、モニタはCPU毎になるのですが、使い方は似たりよったりでした。
ヘッダ写真は https://ja.m.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:Apple_II_Monitor.png から使いました。