マイコン独立大作戦
CRT/VGAIF+KEYIF+SDCARDIFボードの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
WindowsパソコンにUSB接続して使う現行方式はそれなりに便利ではありますが、ときとしてWindows
のしがらみから開放されて、小さいながらも独立した一個のパソコンとして機能したいと思うこともあります。
昔はそれが普通のことだったのですが、安価なCRTディスプレイが生産中止となって久しい今日ではそれ
は叶わぬことと諦めていたのですが…。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[総合第127回]
●8080プログラムに苦戦しています
新独立化セットの最後の仕上げとして、ND8080(およびMYCPU80)用のシステムプログラムの作成にかかっております。
いままではND80Z3.5(ND80ZV)用のシステムプログラムを作成してきましたが、それはZ80用のプログラムですので、8080ではそれをそのまま実行することができません。
8080では実行できないZ80固有の命令も多用していますので(なにしろ便利なのでつい使ってしまいます)、それを全部8080用に書き直さなければなりません。
これがなかなかに大変な作業なのです。
たとえばZ80で追加された命令にLDIR、LDDRがあります。
データのブロック転送を1命令でできるとても便利な命令なのですが、もちろんこれは8080では実行できません。
LDIRはマシン語ではEDB0、LDDRはEDB8とともにわずか2バイトですが、この命令と同じ働きを8080にさせようとするとこうなります。
0DFE F5 LDIR:PUSH PSW
0DFF 7E LDIR2:MOV A,M
0E00 12 STAX D
0E01 23 INX H
0E02 13 INX D
0E03 0B DCX B
0E04 78 MOV A,B
0E05 B1 ORA C
0E06 C2FF0D JNZ LDIR2
0E09 F1 POP PSW
0E0A C9 RET
;
0E0B F5 LDDR:PUSH PSW
0E0C 7E LDDR2:MOV A,M
0E0D 12 STAX D
0E0E 2B DCX H
0E0F 1B DCX D
0E10 0B DCX B
0E11 78 MOV A,B
0E12 B1 ORA C
0E13 C20C0E JNZ LDDR2
0E16 F1 POP PSW
0E17 C9 RET
|
これなどはまだよいほうで、もっと大変なものもあります。
SBC HL,BC(マシン語ED42)、SBC HL,DE(マシン語ED52)はともにマシン語ではわずか2バイトなのですが、これを8080で実行できるように書き直そうとすると大変です。
8080には16ビットの加算命令はありますが減算命令はありません。
Z80では16ビットの減算命令もいくつか追加されました。
SBC HL,BCはHL−BC−CF(キャリーフラグ)、SBC HL,DEはHL−DE−CFという計算を行なう命令です。
これもとても便利な命令なのでしっかり使ってしまっています。
8080の命令で書くとこうなってしまいます。
0E18 D5 SBCHLBC:PUSH D
0E19 57 MOV D,A
0E1A 7D MOV A,L;SBC HL,BC
0E1B 99 SBB C
0E1C 6F MOV L,A
0E1D 7C MOV A,H
0E1E 98 SBB B
0E1F 67 MOV H,A
0E20 DA2A0E JC SBCHLBC1
0E23 FA2A0E JM SBCHLBC1
0E26 B5 ORA L
0E27 C22D0E JNZ SBCHLBC2
0E2A 7A SBCHLBC1:MOV A,D
0E2B D1 POP D
0E2C C9 RET
0E2D 3E01 SBCHLBC2:MVI A,01
0E2F B7 ORA A;clear sf
0E30 7A MOV A,D
0E31 D1 POP D
0E32 C9 RET
0E33 06E7 SOUTSB2:MVI B,E7
0E35 C37C06 JMP SOUTSB
;
0E38 C5 SBCHLDE:PUSH B
0E39 47 MOV B,A
0E3A 7D MOV A,L
0E3B 9B SBB E
0E3C 6F MOV L,A
0E3D 7C MOV A,H
0E3E 9A SBB D
0E3F 67 MOV H,A
0E40 DA4A0E JC SBCHLDE1
0E43 FA4A0E JM SBCHLDE1
0E46 B5 ORA L
0E47 C24D0E JNZ SBCHLDE2
0E4A 78 SBCHLDE1:MOV A,B
0E4B C1 POP B
0E4C C9 RET
0E4D 3E01 SBCHLDE2:MVI A,01
0E4F B7 ORA A;clear sf
0E50 78 MOV A,B
0E51 C1 POP B
0E52 C9 RET
|
(注記)上のリストには別のプログラムも入り込んでいます(SOUTSUB2:とその次の行です)。
もちろんただHL−BC−CFを計算するだけならこんなに面倒なことをしなくてもよいのですが、場所によってはこの命令を使った結果のフラグによって分岐させているところなどもありますから、結果のフラグについても同じようにしようとするとこういうことになってしまいます。
まあ、しかし、このように一度サブルーチンを作ってしまえば、それをコールすればよいので、それほど大変なことはないのですが…。
問題はプログラムが大きくなってしまうのです。
今回はそこが苦戦しているところです。
なにしろZ80で27C256のサイズぎりぎりに近いところまでプログラムを大きくしてきてしまいましたので、よいかなあとうすうす心配していたのですが。
やっぱりオーバーしてしまいました。
本日は時間がなくなってしまいました。
この問題について次回にもう少し続きを書くことにします。
CRT/VGAIF+KEYIF+SDCARDIFボードの製作[総合第127回]
2017.11.25upload
前へ
次へ
ホームページトップへ戻る