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

マイコン独立大作戦
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

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