ワンボードマイコンをつくろう!(パソコンの原点はここから始まった)
TK80ソフトコンパチブル!8080、Z80マシン語からBASICまでこれ1台でこなせます
当記事は2009年11月から「TTLでCPUをつくろう!」というタイトルの もとにほとんど毎日連載をしてきたものを再編集したものです。 2011.7.1
前へ
次へ
目次へ戻る
ホームページトップへ戻る
☆8080アセンブラ
TK80の時代にはプログラムはマシン語のまま入力しました。そのマシン語のプログラムは、命令コード表を見ながら1命令ずつニーモニックからマシン語に翻訳して作りました。パソコンのなかった時代にはそうするしかなかったのです。
今はパソコンが使えますから、アセンブラを使えば効率のよいプログラム作りができます。
ND80ZVには8080アセンブラとZ80アセンブラが附属しています。

[第73回]

●8080アセンブラ

前回はND80ZVのリモートプログラムについて、USB経由でパソコンと接続する手順などについて説明を致しました。
ほんとうは、そのあと、Z80BASICの起動についての説明もするつもりだったのですが、時間がなくなってしまいましたので、それについては次回に説明いたします、とお伝えして終わりました。

で、当然今回は前回からの続きで、Z80BASICの起動や終了のシーケンスについて書かなければならないのですけれど、実はこの間からなんとかしたい、と思っていたことがありまして、本日は、まずそれを片付けてしまってから、のつもりでスタートしたのですけれど。

なに、あそこをちょいちょいと直して、まあ、昼飯までには片付くわな、と思いきや、なかなかそういうわけにはいかないものなのですよね。
しっかり夕刻までかかってしまいました。

そういうようなわけで、Z80BASICにつきましては、説明のための画像ですとか、その他いろいろの準備ができませんでしたので、またまた次回に、ということにさせていただきます。

何をやっておったか、といいますと、アセンブラをいじくっていたのです。

ああ、そういえば、ND80ZVの組立説明書もやっとできあがりまして、先週、その説明書にしたがってとりあえず見本用に1台、完成しているのですけれど、それも最後の写真を撮るところで止まっておりますので、まだ皆様にご披露することができません。

あれもこれもと、これから整理しながら皆様にお見せするものが目白押しで、なかなか作業がはかどりません。

それはともかく、アセンブラのお話です。
もともとずっと以前に開発したZ80アセンブラがあって、それをもとにして、昨年MYCPU80キットのためにということで、8080アセンブラを作りました。
Z80アセンブラも8080アセンブラもともにWindowsパソコンのDOSプロンプトで使います。
ちょっとややこしいのですが、両アセンブラのソースは8086アセンブラで書いてあります。
今までDOSプロンプトで動作するプログラムはBorland C++で書いたものを紹介してきました。
けれど、Z80アセンブラもそれから8080アセンブラもC++で書いたものではありません。

Z80アセンブラは、なんと自作のZ80ボードの上で動作する、Z80のマシン語で書いたオリジナルのアセンブラがもとになっているのです。
鶏が先か卵が先かというお話のようですけれど、その昔の時代はなんでも自分で作ったものだったのです。
ですから、まずマシン語で動作するTK80互換のボードを自作して、次にそれに、ディスプレイインターフェースやフルキーボードのインターフェースを追加して、画面上でプログラムが編集できる機能を構築して、それからその上で働く、マシンランゲージやアセンブラをまず低レベル低機能なものを作って、それを使って自分自身を高機能なものに作り上げていく、というまあ、なんとも面倒で気の遠くなるような作業を経て作りあげてきたのです。

やがてパソコンが徐々に普及してくるにつれて、もとはZ80で書いたZ80アセンブラを、今度は8086アセンブラを使って書き直したものが、今回お話しております、Z80アセンブラです。
あ。その8086アセンブラも自作のアセンブラなのです。

なんだかお話がずれてきてしまいました。
お話を元に戻します。

で、そのようにして作って使っております、Z80アセンブラと8080アセンブラなのですが、これも今回のND80ZV組立キットの附属ソフトウェアとしてつけてしまおう、と思っております。
自分で使っております分には、現行の機能で十分、と思っているのですけれど、いざ皆様に使ってもらおう、ということになりますと、ちょっと気になるところがあります。

そのことにつきましては、昨年MYCPU80の附属ソフトウェアとして、8080アセンブラを作った当初から気にはなっていたのですけれど、なにしろ時間がないところにもってきて、PICのUSBに首をつっこんでしまったものですから、ずっとそのままできてしまいました。

ええ。ええ。
アセンブラそのものの機能としては、ごく基本的な機能しかありませんが、まあ、こんなもんじゃありませんか、という感じで、なんとか使っていただける程度のものになっていると思います。
気になっていましたのは、出力ファイルなのです。

MYCPU80に添付しました8080アセンブラは、拡張子BINのバイナリファイルと、それを16進数のASCIIコード表現にしたHTXファイルの2つのファイルを出力します。
HTXファイルは、MYCPU80のUSBシリアル接続経由でTK80モニタに送るために、先頭にアドレス情報4バイトがつけられています。

MYCPU80もパソコンとUSBで接続するのですが、その通信は232C方式で行っています。
その関係で、MYCPU80用の送受信データはバイナリデータではなくてASCIIコードで表した、TXTデータになっていました。
そういう理由から、8080アセンブラの出力ファイルもBINファイルと、MYCPU80にUSB経由でそのまま送信できる、16進数をASCIIで表したヘキサファイルになっていたのです。

しかし今回のND80ZVのUSB接続はHIDで行いますから、RS232Cとは関係がありません。
それなら、ということで、バイナリのまま送受信するようにしてあります。
ただ、やはりもとになっているTK80のモニタのSTORE、LOADの方式はそのまま踏襲することにしましたから、ただのバイナリファイルではなくて、ファイルの先頭には、LOAD(またはSTORE)開始アドレスと終了アドレスの各2バイトが付加されます。

そこで今回ND80ZVに附属の予定の8080アセンブラは、2種類のバイナリファイルを出力するようにしました。
ひとつは純粋なバイナリファイルで、拡張子はBINです。
もうひとつもバイナリデータなのですが、先頭に開始アドレスと終了アドレスの各2バイトが付加されます。
拡張子はBTKとしました。Bynary of TK80の意味です。

今回はもうひとつ出力ファイルを増やしました。
今までの8080アセンブラは(Z80アセンブラも同じですが)、アセンブルの結果出力されるアセンブルリストが画面に表示されていました。
その昔のオリジナルのZ80システムの上で動作していたZ80アセンブラは、画面にリストを表示するとともに、プリンタへの出力も行えました。
その機能の名残です。

ですけれど、長いプログラムはリストがスクロールして画面から消えてしまって、確認することができません。
ただ、DOSのパイプ出力機能を利用して、
ASM80 TEST.TXT>TEST.WK
のようにすると、画面に表示する代わりに、その出力イメージのまま、ファイルに出力することができますから、私自身、そのようにして、ずっと使ってきました。

まあ、しかし。
これは、不便といえば不便ですし。
なんとかならないかなあ、といわれてしまいそうです。

いやあ。つい長々と書いてしまいましたが、そこで、本日は朝からそのようなあたりの改良を行っていたのです。
アセンブルリストが画面に表示されていたのを、ファイルに出力するようにアセンブラプログラムを変更しました。
出力されるリストファイルの拡張子は、LSTです。
8080アセンブラだけではなくて、Z80アセンブラも同じように直してしまいました。

以上のように改良した8080アセンブラを実行してみました。
ASM80.COMです。
8086のマシン語で書かれていますから、拡張子はCOMになります。

TK80用のサンプルプログラムsound6.txtをアセンブルしました。
asm80を実行したフォルダにバイナリファイルsound6.binとTK80用バイナリファイルsound6.btkとアセンブルリストファイルsound6.lstができています。

sound6.txtは、ND80ZVのキーボードを押すとスピーカーからそのキーに割り当てられた高さの音を出力する、「電子オルガンプログラム」です。

これがソースファイルです。

;;;SOUND6.TXT
;;; sound for ND80Z3 clock=6MHz
;;; 10/3/18 10/6/15 7/20
;;;
	ORG $8000
;
	KEY=$0247
;
SND:CALL KEY
	INR A
	JZ SND
	DCR A
	CALL SNDSB
	JMP SND
;
SNDSB:PUSH PSW
	PUSH H
	PUSH D
	PUSH B
	LXI H,SNDTBL
	ADD L
	MOV L,A
	MOV B,M
	MVI E,1A
SNDS1:MOV D,B
	MVI A,EF;sp out=H,DMAoff
	OUT 98
SNDS2:PUSH H;11---------
	PUSH H;11       | 11+11+10+10+4+4+10=60
	POP H;10        | 60/6=10
	POP H;10        |
	NOP;4;          | 10microsec
	DCR D;4         |
	JNZ SNDS2;10----
	MOV D,B
	MVI A,CF;sp out=L,DMAoff
	OUT 98
SNDS3:PUSH H;11---------
	PUSH H;11       | 11+11+10+10+4+4+10=60
	POP H;10        | 60/6=10
	POP H;10        |
	NOP;4;          | 10microsec
	DCR D;4         |
	JNZ SNDS3;10----
	DCR E
	JNZ SNDS1
	POP B
	POP D
	POP H
	POP PSW
	RET
;
; SOUND TABLE
SNDTBL:DB 7F;so4
	DB 77;so#4
	DB 71;ra4
	DB 6A;ra#4
	DB 5F;do5
	DB 59;do#5
	DB 54;re5
	DB 4F;re#5
	DB 47;fa5
	DB 43;fa#5
	DB 3F;so5
	DB 3B;so#5
	DB 35;ra#5
	DB 32;si5
	DB 2F;do6
	DB 2C;do#6
	DB 25;mi6
	DB 27;re#6
	DB 2A;re6
	DB 4B;mi5
	DB 38;ra5
	DB 64;si4
	DB 23;fa6
	DB 21;fa#6
;END

もとはMYCPU80用に作ったプログラムですが、MYCPU80はCPUクロックが2MHzでした。
ND80ZVは6MHzですから、クロックが直接影響する、このsoundプログラムのようなプログラムはその部分を書き直さなければなりません。
resetを除く24個のキーにドレミの音階が割り当ててあります。
ちなみに[READ INC]はラbTの音で880Hzです。

これがアセンブルリストsound6.lstです。

2010/7/20  21:25  sound6.txt
END=8056
              ;;;SOUND6.TXT
              ;;; sound for ND80Z3 clock=6MHz
              ;;; 10/3/18 10/6/15 7/20
              ;;;
              	ORG $8000
              ;
              	KEY=$0247
              ;
8000 CD4702   SND:CALL KEY
8003 3C       	INR A
8004 CA0080   	JZ SND
8007 3D       	DCR A
8008 CD0E80   	CALL SNDSB
800B C30080   	JMP SND
              ;
800E F5       SNDSB:PUSH PSW
800F E5       	PUSH H
8010 D5       	PUSH D
8011 C5       	PUSH B
8012 213F80   	LXI H,SNDTBL
8015 85       	ADD L
8016 6F       	MOV L,A
8017 46       	MOV B,M
8018 1E1A     	MVI E,1A
801A 50       SNDS1:MOV D,B
801B 3EEF     	MVI A,EF;sp out=H,DMAoff
801D D398     	OUT 98
801F E5       SNDS2:PUSH H;11---------
8020 E5       	PUSH H;11       | 11+11+10+10+4+4+10=60
8021 E1       	POP H;10        | 60/6=10
8022 E1       	POP H;10        |
8023 00       	NOP;4;          | 10microsec
8024 15       	DCR D;4         |
8025 C21F80   	JNZ SNDS2;10----
8028 50       	MOV D,B
8029 3ECF     	MVI A,CF;sp out=L,DMAoff
802B D398     	OUT 98
802D E5       SNDS3:PUSH H;11---------
802E E5       	PUSH H;11       | 11+11+10+10+4+4+10=60
802F E1       	POP H;10        | 60/6=10
8030 E1       	POP H;10        |
8031 00       	NOP;4;          | 10microsec
8032 15       	DCR D;4         |
8033 C22D80   	JNZ SNDS3;10----
8036 1D       	DCR E
8037 C21A80   	JNZ SNDS1
803A C1       	POP B
803B D1       	POP D
803C E1       	POP H
803D F1       	POP PSW
803E C9       	RET
              ;
              ; SOUND TABLE
803F 7F       SNDTBL:DB 7F;so4
8040 77       	DB 77;so#4
8041 71       	DB 71;ra4
8042 6A       	DB 6A;ra#4
8043 5F       	DB 5F;do5
8044 59       	DB 59;do#5
8045 54       	DB 54;re5
8046 4F       	DB 4F;re#5
8047 47       	DB 47;fa5
8048 43       	DB 43;fa#5
8049 3F       	DB 3F;so5
804A 3B       	DB 3B;so#5
804B 35       	DB 35;ra#5
804C 32       	DB 32;si5
804D 2F       	DB 2F;do6
804E 2C       	DB 2C;do#6
804F 25       	DB 25;mi6
8050 27       	DB 27;re#6
8051 2A       	DB 2A;re6
8052 4B       	DB 4B;mi5
8053 38       	DB 38;ra5
8054 64       	DB 64;si4
8055 23       	DB 23;fa6
8056 21       	DB 21;fa#6
              ;END
KEY          =0247  SND          =8000  SNDS1        =801A  
SNDS2        =801F  SNDS3        =802D  SNDSB        =800E  
SNDTBL       =803F  

ところで、バイナリファイルの中身はどうなっているのでしょうか。
バイナリファイルはWindowsの普通のアプリケーションでは開くことはできません。
MSDOSのDEBUGコマンドを使うと簡単に確認することができます。


DOSプロンプト画面の上がsound6.bin、下がsound6.btkのファイルの先頭から128バイトを表示させています。
といっても、もともとsound6.binは8000〜8056の87バイトですから、その全部が表示されています。
さきほどのsound6.lstをもとにして比較してみてください。
sound6.btkはファイルの先頭に開始アドレス8000と終了アドレスの8056が置かれています。
CPUをつくろう!第558回(2010.7.20upload)を再編集

ワンボードマイコンをつくろう![第73回]
2011.7.1upload

前へ
次へ
目次へ戻る
ホームページトップへ戻る