ワンボードマイコンをつくろう!(パソコンの原点はここから始まった)
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 |
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 |