現在地

ソフトウェア

何のルーチンでしょう?

ふと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. 1,2行目は開始番地とエントリポイントのラベルです。
  2. 3行目でHLレジスタの指すメモリを読んでAレジスタに入れます。
  3. 4行目でもHLレジスタの指すメモリを読み、Aレジスタの内容とXOR演算をします。結果はAレジスタに入ります
  4. 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)を書くことはほぼ不可能です。

これらのプロセッサが現役だった頃、リロケータブルなコードといえば現在のPIC (Position Independent Code)の事を指していました。好きなアドレスにロードすればそのまま(書き換えたりせずに)実行できるコードです。
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進定数として処理されているのだとか。結果は変わらないですが。

    今ではアセンブラもこの記述方法が多いです。

私のプログラミング言語遍歴

カテゴリー:

いつもモノのことばかり書いているので、時には「私」についても書いてみようかと思っています。
題して「私の~遍歴」、第1回はプログラミング言語についてです。

これまでに個人的にも業務としてもいろいろなプログラミング言語を使ってきました。既存のプログラムをちょっと修正したようなものまで含めるとかなりの数になってしまうので、ある程度使い込んだものを並べて見ました。

  1. BASIC
  2. 私が初めてパソコンに接したのは1982年のことですから、BASICから入ったのはごく自然な流れでした。一部の例外を除いてパソコンを買えばBASICは入っている時代でしたから、まずはそれを使ってみることになります。

EPSON ソフトウェア・インストレーション・プログラム

テーマ:

EPSON製のPC-9801互換機を購入すると付いてきたものです。


NEC製のパソコンPC-9801シリーズは一時期日本で絶大なシェアを誇っていました。それに便乗しようとEPSONは互換機を発売したわけですが、当然NECとしては面白くありません。そこで自社のソフトウェアに互換機かどうか判別して動作させなくする細工を施しました。
それに対しEPSONは互換機チェックを無効化するパッチを作成し、パッチをあてるツールとしてこのソフトウェア・インストレーション・プログラム(略してSIP)をパソコン本体に付属させたのです。

MC68kボード (ソフトウェア編)

テーマ:

今回はMC68kボード (概要編)で紹介したボードに搭載したソフトウェアの話です。
CP/M-68K上で動作させたソフトウェアまで含めるとキリが無いので、ボード上のROMに書き込んだものに限定します。そうするとモニタ、Tiny BASIC、CP/M-68Kの3つになります。

【モニタ】は最初に動かしたもの(ハードウェアのテスト用の無限ループ等を除いて)になります。ベースは「トランジスタ技術」誌の1985年4月号にアセンブラソースが掲載されたものです。その後少しずつ機能を追加して行き、MPUをMC68010に変更したときは対応するための修正をしています。
ただMC68kはバイナリを見ながらデバッグするような代物ではないので、もっぱらハードウェアの確認用に使用することが多かったです。後述のTiny BASICのデバッグ時も机上で行ってROMを書き換えてしまうことが多かったです。

ページ