現在地
ソフトウェア
EPSONの超小型PC (インストール編 その2)
前回、どうやらキーボードが起動の邪魔をしているということだったのでキーボードを外して試してみます。
すると今回は/etc/rc
までたどり着きました。先頭のパーティション(/dev/wd0a)は問題無さそうです。ところが2つ目の/dev/wd0eの整合性チェック(fsck)が失敗しています。それもスーパーブロック(管理領域)が読めないという致命的なエラーです。少々のエラーなら修復してくれるのですが、これはどうにもなりません。しかもキーボードを接続していないので何もできません。
仕方が無いのでまたHDDを外してX60に接続して内容を確認しました。
すると/dev/sd0aは正常だったものの、/dev/sd0e~/dev/sd0gは全てエラーとなってしまいました。
EPSONの超小型PC (インストール編 その1)
中を一通り見たところでインストール開始したのですが、実はまだ完了していません。
前回書いたようにSO-DIMMは手持ちの4GBに交換し、HDDはそのまま320GBのものを使用することにします。キーボードはちょうど手元にあったHappy Hacking Keyboard ProfessionalをUSB接続して、ディスプレイはVGA (アナログ)での接続です。
インストール方法はUSBでCD-ROM/DVD-ROMを繋いで行なうのが一般的ですが、その後の環境構築まで考えると結構面倒です。幸いNetBSDを使用中の環境があるのでそのクローンを作ることにしました。
候補となる環境は一つはこのサイトを運用しているPC、もう一つはLenovo ThinkPad X60です。どちらからでもできないことはありませんが、構成の近い後者を採用することにします。
何のルーチンでしょう?
ふとZ80ボード 3号機で遊んでいたときに考えたルーチンを思い出しました。
1: 8000 ORG 8000H
2: 8000 check:
3: 8000 7E LD A,(HL)
4: 8001 AE XOR (HL)
5: 8002 C9 RET
ルーチンと呼ぶのもおかしいほどの短いコードです。何をするものでしょうか?
Z80のコードがわからない人のために簡単に解説するとこんな感じです。
- 1,2行目は開始番地とエントリポイントのラベルです。
- 3行目でHLレジスタの指すメモリを読んでAレジスタに入れます。
- 4行目でもHLレジスタの指すメモリを読み、Aレジスタの内容とXOR演算をします。結果はAレジスタに入ります
- 5行目でメインルーチンへ帰ります。
簡単ですね。
Z80 IX,IYのテクニック
カテゴリー:
8080からZ80になってありがたいことはいろいろありますが(ハード屋なら5V単一電源になったことが一番ありがたいかも)、IX,IYレジスタが追加されたこともその1つです。でもIX,IY関係の命令って意外と使いにくいのです。
まずHLレジスタと併用できないこと。これはHLレジスタを使う命令にプレフィックスとして0DDH, 0FDHを付けることでHLの部分がそれぞれIX, IYに替わり、(HL)は(IX+d),(IY+d)に替わるようになっているためです。ですから
ADD IX,BC
はできても
ADD IX,HL
はできないのです。
例外的に
LD H,(IX+4)
のようにHまたはLと(IX+d)または(IY+d)の間のLD命令は使えます。
80系でリロケータブルを実現する
カテゴリー:
80系(8080,Z80,8085)で真のリロケータブルコード(PIC)を書くことはほぼ不可能です。
MC6809では普通に可能だったので、6809ファンの友人によく馬鹿にされたものです。
PICであるためには何が必要で80系では何が欠けているのか考えて見ましょう。必要なのはコード内のアドレスを正しく求め、参照できることです。
80系アセンブラのテクニック
カテゴリー:
2日目の今日は80系(8080, Z80, 8085など)のちょっと懐かしいテクニックです。
今こんな書き方をすると、わかりにくいと怒られるか、パイプラインなどに悪影響が出たり技術的にもデメリットになったりしますので避けるべきですが、当時はそれなりにメリットもあってよく使われていました。
一つは命令の途中に飛び込むというものです。例えばこんな感じです。
1: 8000 ORG 8000H
2: 8000 entry1:
3: 8000 3EAF LD A,0AFH
4: 8002 3200FF LD (0FF00H),A
5: 8005 C9 RET
3行目でAレジスタに0AFHを入れ、4行目で0FF00H番地のメモリに書き込んで、リターンするだけのものです。
ここでは8000Hがエントリポイントですが、8001Hもエントリポイントと考えると以下のようになります。オブジェクトは上と一緒です。
16進の表記方法について
カテゴリー:
今回からしばらくはちょっと趣向を変え、ソフトウェアについて書いてみたいと思います。1回目は「ソースコード等に16進を記述する際の記述方法」です。
- (F300)16
コンピュータを離れるとこれが一般的でしょうか。
ただコンピュータ以外で16進表記を使うことはあまり無いので、昔数学か何かでやったはずですが完全に忘れていました。さすがに当時の教科書は残していないと思うので、当時の表記方法が同じだったのかはわかりません。 - 0xF300
C言語をはじめ最近の言語では一般的な記述方法ですね。
「x」をつけずに「0」で始まると8進だとみなされます。私は8進なんて使わないという人でもこれは知っておく必要があります。桁をそろえるなどの理由で「012」などと書くと(12)10ではなく(12)8=(10)10と解釈されるからです。定数「0」は実は8進定数として処理されているのだとか。結果は変わらないですが。今ではアセンブラもこの記述方法が多いです。