ハンドアセンブル
2024.11.27
昔、いまのような便利な開発環境は無かったから、紙にプログラムを書いて手作業でマシン語に変換していた。これをハンドアセンブルと呼んでいた。

Z80の命令表を下敷き(カードケース)に挟んで、いつも身近に置いて活用していた。8080と互換性のある命令だけなら1ページにおさまるし、十分足りる。

できればシフト命令の動きなど書いてあると便利。ややこしくて、今まで全然覚えきれなかった。
えーと、キャリーフラグを巻き込んでローテートシフトするのは何だっけ・・・ってな具合。
RLCAの動きは・・・とか。

マシン語は、自然に覚えてしまった。

特によく使う命令だけだが・・・いまでもJPとくればC3、LDIRはED B0で、LD A,nは3Eとか、OUT(E8H),AはD3 E8、HALTは76、LD B,nは06、とか。

プログラムのある番地から別の番地へ移動したい場合、
LD HL,元の番地
LD DE,先の番地
LD BC,バイト数
LDIR
RET

これを 21 00 80 11 00 90 01 00 01 ED B0 C9 と直接打ち込んだりしていた。
マシン語を始めた時
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バイト増える。もったいない。(という考え方があった)
逆アセンブラ
2024.11.27
逆アセンブラ とは、バイナリ(マシン語)からニーモニックに変換するプログラム。
たとえばROMの内容を読み出して、ソースを再現したり解析したりする時に使う。

今ではネットからフリーソフトをダウンロードしてくれば済むが、

昔、具体的に言うと'80年代は買うか、雑誌に載っていたら打ち込むか、自作するぐらいしかなかった。

私の場合は自作しか選択肢が無く、とりあえずBASICで作り始めた。

思い出すと恥ずかしいが、当初はバカ正直に IF A=&H00 THEN PRINT "NOP" の羅列で、あまりにも工夫がなかった。
まあ、でもとりあえず動けば良いという勢いは大事だ。難しい事はあとから考える。

そのうち命令コードの規則性に気づいて、少しずつ整理していった。

たとえば 01 XXX YYY はレジスタ同士のLD命令(一部は違う)
LD X,Y
XXX YYYの部分は下記の通り。
000:B
001:C
010:D
011:E
100:H
101:L
110:(HL)
111:A

但し、LD (HL),(HL)に相当する命令は無く、01 110 110 は 76h (HALT)

余談だが LD A,A などの命令は無駄じゃないかと思う。なんで存在するのだろう。規則上、できてしまっただけ。

こんなふうにBASICで逆アセンブラを作っていたが、マシン語のCB、DD、EDで始まる命令までは手が回らず、8080と互換性のある命令ぐらいまでで終わった。BASICだとあまりにもメモリが足りなかった。当時MZ-2000のHu-BASIC上で作っていたけど、フリーエリアが確か24Kぐらいしか無かった。

遅いのは全然構わなかった。ほっといて忘れた頃に出来上がっていればよいのだから。

あと、ラベルを付ける機能まではできなかったな。ラベルを付けると見やすいけれど、それなりの処理が必要だし、そのためのワークエリアも。

バイナリレベルだと命令なのかデータなのか、逆アセンブラで判断させるのは難しい。人間だったらダンプを見て、文字に変換されているところをみれば、ああ、このへんはメッセージが入ってるとか、BASICの中間言語のテーブルだろう、キャラクタの形状だろうって推測できるけれど。
いまPC98がアツい
2024.11.23
PC98に限らず、MZもMSXもSC/SGも相変わらずアツいのだが、
どうもこれら古いパソコン(マイコン)をいじると、脳が活性化するような気がする。(当社比)

それに気づいたのはキーボードを久しぶりに叩いた時。DOSコマンドを打ち込んだ時。

昔取った杵柄というぐらいだ。
こうなったら、当時を再現せねばなるまい。

一日の始まりはピポに限る。

いまはPC-9801BX/U2を修理中で、これを含めてうちのPC98は(互換機含む)、
PC-486SE2
PC-9821AS/U2
PC-9801BX/U2
の3台となった。

キーボードをバラしてキートップを洗い、よく乾かしてスッキリした。


いまはPC-9801BX/U2の電解コンデンサを交換中。


電源ユニットも修理中。今日の時点では部品入荷待ち。

それからFDDだけど、開けてみるまでもなくゴムベルトがベタベタだろうから交換は必須。

最後にCFを取り付けてMS-DOSのインストール。こんな流れです。

----------追記
修理作業完了
まず電源単独で通電し、各出力が正常である事を確認(5V,+12V,-12V)してから本体へ取り付け。
中古入手時に内蔵HDDが入っていたけれど、異音を出して読み込まないので撤去
メモリチェックOK
まずフロッピーから起動OK
FDDはゴムベルトではなくダイレクトドライブ

CFを取り付け、フロッピーから起動してDOSをインストールしている途中(フロッピー3枚目)でエラーが出て読み込まなくなった。
フロッピーではなくドライブの不調
Bドライブに変えてみるが、やはりエラー
どちらもクリーナーをかけてみるがNG

インストールは中途半端だが、最低限の外部コマンドは入ったし起動できる状態
Bドライブは先程駄目だったが今度は読み込めた。
リモートドライブのソフトをフロッピーからCFへ移した。

再起動し、リモートドライブを使ってもう1台のPC98から必要なファイル等を移してくる作業。とても時間がかかる。何しろRS-232Cで送っているから。

そのほか、今のところ問題なし。
PC98で元気になる
2024.11.21
なぜだろう、うまく説明できないけれど、
PC98のキーボードを叩いていると、指が軽やかに動くというか、
ワクワクしてくるんですよ。

実際、このキーボードは打ちやすい。今どき出回っている安物とは全然違う。

そして若返ったような感じもします。元気になります。

そして、数十年のブランク(たまに操作した事もあったけれど)が有りながら、いじっているうちに手が思い出してきた。

FD(フロッピーじゃなくてファイル操作の方)さえ有れば何でもできたのでした。

さあ、あなたもピポりませんか?(笑)

- CafeLog -