マシン語を始めた時
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バイト増える。もったいない。(という考え方があった)
逆アセンブラ
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の中間言語のテーブルだろう、キャラクタの形状だろうって推測できるけれど。
たとえば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で送っているから。
そのほか、今のところ問題なし。
どうもこれら古いパソコン(マイコン)をいじると、脳が活性化するような気がする。(当社比)
それに気づいたのはキーボードを久しぶりに叩いた時。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(フロッピーじゃなくてファイル操作の方)さえ有れば何でもできたのでした。
さあ、あなたもピポりませんか?(笑)
PC98のキーボードを叩いていると、指が軽やかに動くというか、
ワクワクしてくるんですよ。
実際、このキーボードは打ちやすい。今どき出回っている安物とは全然違う。
そして若返ったような感じもします。元気になります。
そして、数十年のブランク(たまに操作した事もあったけれど)が有りながら、いじっているうちに手が思い出してきた。
FD(フロッピーじゃなくてファイル操作の方)さえ有れば何でもできたのでした。
さあ、あなたもピポりませんか?(笑)
PC98元気になる
2024.11.21
5年前か7年前か忘れたけれど、不動品を直して一応動くようにしたものだったが、なぜか時計がクルッたように猛烈な勢いで回るという難点があった。なんとか解決したい。
HDDに関しては先日CF化を完了した。
そこで、RTC(時計IC)とその周辺をこの際に直してしまおうと決めた。
これはそのICを取り外した後。汚い。

確か過去には一度はずして基板を掃除してからICを戻したと思うのだが、今回はこのICを新品に交換した。記憶が曖昧で、ひょっとしたら過去は周辺の清掃とはんだ付けのやり直しだけで手抜きしていたかもしれない。
さらに、その周辺を良く見直してみる。
どうもトリマーコンデンサ(緑)が怪しい。電解コンデンサの液体が染み込んでいるのではないか。
はんだごてを当てて加熱すると、あの独特の臭いがしたので当たり。
さっきのICだって、内部に液体が浸透していた可能性がある。
あんな樹脂封止で液体が入るわけないと思うだろう?じつは入るのだ。それで焼けたと思われるICも最近の修理事例がある。
湿気を吸うのは確かで、パッケージが吸湿するとリフローで加熱した時に水分の膨張で破裂する場合がある。そのため、SMD部品のICやLSIを代理店から買うと銀色のパックに乾燥剤入りで届く。

それにしても、このPC-9821As/U2は分解・組み立てが面倒だ。
中身は色々パズルみたいに詰め込まれており、はずす順番と取り付ける順番が決まっている。たとえば、あるユニットを先につけると、その隣のやつが付けられなくなったりする。
先に基板のビスを締めてしまうと、じつはその上に載るユニットの足をのせてから締めないといけなかったと気づいたりする。
また今日もそれでやらかしてしまい、付け外しをやり直したりした。
めんどくさー、とかブツブツ言いながらも手は休みなく動いて、あっという間に分解・組み立ててしまうところはさすがプロだと自画自賛する。
ようやく全体を組み立て、さて見てみようか。
まず、DOSでDATEとTIMEを実行して日付・時刻をあわせる。NTPなんか無い。
そしてTIMEを複数回実行し、時刻を確認すると・・・おおっ、正常に進んでいるようだ。良かった。

これで草の根パソコン通信ネットのホスト局が再開できるぞ(笑)
当然、アナログのモデム専用(笑)
HDDに関しては先日CF化を完了した。
そこで、RTC(時計IC)とその周辺をこの際に直してしまおうと決めた。
これはそのICを取り外した後。汚い。

確か過去には一度はずして基板を掃除してからICを戻したと思うのだが、今回はこのICを新品に交換した。記憶が曖昧で、ひょっとしたら過去は周辺の清掃とはんだ付けのやり直しだけで手抜きしていたかもしれない。
さらに、その周辺を良く見直してみる。
どうもトリマーコンデンサ(緑)が怪しい。電解コンデンサの液体が染み込んでいるのではないか。
はんだごてを当てて加熱すると、あの独特の臭いがしたので当たり。
さっきのICだって、内部に液体が浸透していた可能性がある。
あんな樹脂封止で液体が入るわけないと思うだろう?じつは入るのだ。それで焼けたと思われるICも最近の修理事例がある。
湿気を吸うのは確かで、パッケージが吸湿するとリフローで加熱した時に水分の膨張で破裂する場合がある。そのため、SMD部品のICやLSIを代理店から買うと銀色のパックに乾燥剤入りで届く。

それにしても、このPC-9821As/U2は分解・組み立てが面倒だ。
中身は色々パズルみたいに詰め込まれており、はずす順番と取り付ける順番が決まっている。たとえば、あるユニットを先につけると、その隣のやつが付けられなくなったりする。
先に基板のビスを締めてしまうと、じつはその上に載るユニットの足をのせてから締めないといけなかったと気づいたりする。
また今日もそれでやらかしてしまい、付け外しをやり直したりした。
めんどくさー、とかブツブツ言いながらも手は休みなく動いて、あっという間に分解・組み立ててしまうところはさすがプロだと自画自賛する。
ようやく全体を組み立て、さて見てみようか。
まず、DOSでDATEとTIMEを実行して日付・時刻をあわせる。NTPなんか無い。
そしてTIMEを複数回実行し、時刻を確認すると・・・おおっ、正常に進んでいるようだ。良かった。

これで草の根パソコン通信ネットのホスト局が再開できるぞ(笑)
当然、アナログのモデム専用(笑)