トランジスタでCPUをつくろう!
トランジスタで8080をつくってしまおうというまさにびっくり仰天、狂気のプロジェクトです!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
見事にできましたら、もちろんTK−80モニタを乗せて、それからBASIC、CP/Mを走らせましょう!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
[第224回]
●REGISTER_SELECT_WR回路(3)テストプログラム
今回はREGISTER_SELECT_WR試作基板の動作テストです。
今までと同様BASICプログラムを作ってテストします。
プログラムの理解を助けるために前回お見せしたコネクタ接続図を再掲します。
上の接続図のように82C55を2個使って増設I/Oボードの82C55(I/Oアドレスは84−87に設定)のCポートとBポートからWR_信号とd0−d3を出力し、ND80Z3.5上の82C55(I/Oアドレスは80−83)のCポートで出力結果(W0−W7)を読んで結果を表示します。
下が作成したテストプログラムのプログラムリストです。
10 OUT $87,$80 20 OUT $86,$FF 40 OUT $83,$9B 50 OUT $86,$40:'wr=0,rd=1,c3=0,c2=0 60 OUT $85,0:'b6=0,b7=0 70 C%=IN($82) 80 GOSUB 460 90 PRINT "000",HEX$(C%),HEX$(E%),BI$(E%) 100 OUT $86,$48:'wr=0,rd=1,c3=1,c2=0 110 OUT $85,0:'b6=0,b7=0 120 C%=IN($82) 130 GOSUB 460 140 PRINT "001",HEX$(C%),HEX$(E%),BI$(E%) 150 OUT $86,$44:'wr=0,rd=1,c3=0,c2=1 160 OUT $85,0:'b6=0,b7=0 170 C%=IN($82) 180 GOSUB 460 190 PRINT "010",HEX$(C%),HEX$(E%),BI$(E%) 200 OUT $86,$4C:'wr=0,rd=1,c3=1,c2=1 210 OUT $85,0:'b6=0,b7=0 220 C%=IN($82) 230 GOSUB 460 240 PRINT "011",HEX$(C%),HEX$(E%),BI$(E%) 250 OUT $86,$40:'wr=0,rd=1,c3=0,c2=0 260 OUT $85,$40:'b6=1,b7=0 270 C%=IN($82) 280 GOSUB 460 290 PRINT "100",HEX$(C%),HEX$(E%),BI$(E%) 300 OUT $86,$48:'wr=0,rd=1,c3=1,c2=0 310 OUT $85,$40:'b6=1,b7=0 320 C%=IN($82) 330 GOSUB 460 340 PRINT "101",HEX$(C%),HEX$(E%),BI$(E%) 350 OUT $86,$44:'wr=0,rd=1,c3=0,c2=1 360 OUT $85,$40:'b6=1,b7=0 370 C%=IN($82) 380 GOSUB 460 390 PRINT "110",HEX$(C%),HEX$(E%),BI$(E%) 400 OUT $86,$4C:'wr=0,rd=1,c3=1,c2=1 410 OUT $85,$40:'b6=1,b7=0 420 C%=IN($82) 430 GOSUB 460 440 PRINT "111",HEX$(C%),HEX$(E%),BI$(E%) 450 STOP 460 'code change PC to w7-w0 470 E%=0 480 IF BIT(C%,2)=1 THEN E%=E%+1 490 IF BIT(C%,3)=1 THEN E%=E%+2 500 IF BIT(C%,0)=1 THEN E%=E%+4 510 IF BIT(C%,1)=1 THEN E%=E%+8 520 IF BIT(C%,5)=1 THEN E%=E%+16 530 IF BIT(C%,4)=1 THEN E%=E%+32 540 IF BIT(C%,7)=1 THEN E%=E%+64 550 IF BIT(C%,6)=1 THEN E%=E%+128 560 RETURN |
Cポートのビットの並びとREGISTER_SELECT_WR基板の16pinコネクタ(CN2)のビットの並びは異なっています(上のコネクタ接続図参照)。
CN2に配置されているW7−W0のビットの並び順に表示するために460−560の変換サブルーチンをCALLしています。
C%が入力データでE%が変換後のデータです。
下が実行結果です。
>r. 000 FB FE 11111110 001 F7 FD 11111101 010 FE FB 11111011 011 FD F7 11110111 100 DF EF 11101111 101 EF DF 11011111 110 7F BF 10111111 111 BF 7F 01111111 break in 450 |
REGISTER_SELECT_WR基板はW0−W7の出力をモニタするために8個のLED表示回路を実装しています。
しかし上のプログラムでは速過ぎてその表示を確認することができません。
そこで表示するごとに少しの間そのままで待つためのウェイトルーチンを追加しました。
下はそのように追加を行なったプログラムリストです。
10 OUT $87,$80 20 OUT $86,$FF 40 OUT $83,$9B 50 OUT $86,$40:'wr=0,rd=1,c3=0,c2=0 60 OUT $85,0:'b6=0,b7=0 70 C%=IN($82) 80 GOSUB 460 90 PRINT "000",HEX$(C%),HEX$(E%),BI$(E%) 95 FOR A=0 TO 1000:NEXT A 100 OUT $86,$48:'wr=0,rd=1,c3=1,c2=0 110 OUT $85,0:'b6=0,b7=0 120 C%=IN($82) 130 GOSUB 460 140 PRINT "001",HEX$(C%),HEX$(E%),BI$(E%) 145 FOR A=0 TO 1000:NEXT A 150 OUT $86,$44:'wr=0,rd=1,c3=0,c2=1 160 OUT $85,0:'b6=0,b7=0 170 C%=IN($82) 180 GOSUB 460 190 PRINT "010",HEX$(C%),HEX$(E%),BI$(E%) 195 FOR A=0 TO 1000:NEXT A 200 OUT $86,$4C:'wr=0,rd=1,c3=1,c2=1 210 OUT $85,0:'b6=0,b7=0 220 C%=IN($82) 230 GOSUB 460 240 PRINT "011",HEX$(C%),HEX$(E%),BI$(E%) 245 FOR A=0 TO 1000:NEXT A 250 OUT $86,$40:'wr=0,rd=1,c3=0,c2=0 260 OUT $85,$40:'b6=1,b7=0 270 C%=IN($82) 280 GOSUB 460 290 PRINT "100",HEX$(C%),HEX$(E%),BI$(E%) 295 FOR A=0 TO 1000:NEXT A 300 OUT $86,$48:'wr=0,rd=1,c3=1,c2=0 310 OUT $85,$40:'b6=1,b7=0 320 C%=IN($82) 330 GOSUB 460 340 PRINT "101",HEX$(C%),HEX$(E%),BI$(E%) 345 FOR A=0 TO 1000:NEXT A 350 OUT $86,$44:'wr=0,rd=1,c3=0,c2=1 360 OUT $85,$40:'b6=1,b7=0 370 C%=IN($82) 380 GOSUB 460 390 PRINT "110",HEX$(C%),HEX$(E%),BI$(E%) 395 FOR A=0 TO 1000:NEXT A 400 OUT $86,$4C:'wr=0,rd=1,c3=1,c2=1 410 OUT $85,$40:'b6=1,b7=0 420 C%=IN($82) 430 GOSUB 460 440 PRINT "111",HEX$(C%),HEX$(E%),BI$(E%) 450 STOP 460 'code change PC to w7-w0 470 E%=0 480 IF BIT(C%,2)=1 THEN E%=E%+1 490 IF BIT(C%,3)=1 THEN E%=E%+2 500 IF BIT(C%,0)=1 THEN E%=E%+4 510 IF BIT(C%,1)=1 THEN E%=E%+8 520 IF BIT(C%,5)=1 THEN E%=E%+16 530 IF BIT(C%,4)=1 THEN E%=E%+32 540 IF BIT(C%,7)=1 THEN E%=E%+64 550 IF BIT(C%,6)=1 THEN E%=E%+128 560 RETURN |
95、145、195、245、295、345、395がウェイトルーチンです。
LEDの表示が0.5秒ほど止まって見えます。
ウェイトルーチンを追加しただけですからWindows画面に表示される結果は変わりませんが1行表示するごとに0.5秒ほど停止しながら表示されます。
>r. 000 FB FE 11111110 001 F7 FD 11111101 010 FE FB 11111011 011 FD F7 11110111 100 DF EF 11101111 101 EF DF 11011111 110 7F BF 10111111 111 BF 7F 01111111 break in 450 |
REGISTER_SELECT_WR回路の出力はd3=0の入力に対してはW0〜W7出力とし、d3=1に対してはW8〜W15の出力とするためにd3の入力をジャンパーピンで切り換えて設定します([第222回]回路図参照)。
下の写真ではジャンパーピンをLOWアドレス側にセットしています。
この設定にするとd0=0のときに出力がアクティブになります。
上のテストプログラムはこの設定の時に有効になるプログラムです。
下の写真ではジャンパーピンをHIGHアドレス側にセットしています。
この設定にするとd0=1のときに出力がアクティブになります。
上のテストプログラムはd0=0を前提にしているので、この設定の時にはREGISTER_SELECT_WR基板からの出力は得られません。
下はジャンパーピンをHIGHにしたときのプログラムの実行結果です。
>r. 000 FF FF 11111111 001 FF FF 11111111 010 FF FF 11111111 011 FF FF 11111111 100 FF FF 11111111 101 FF FF 11111111 110 FF FF 11111111 111 FF FF 11111111 break in 450 |
d0=1の時に基板から正しい出力が得られるようにプログラムを変更しました。
下はそのように変更したプログラムリストです。
10 OUT $87,$80 20 OUT $86,$FF 40 OUT $83,$9B 50 OUT $86,$40:'wr=0,rd=1,c3=0,c2=0 60 OUT $85,$80:'b6=0,b7=1 70 C%=IN($82) 80 GOSUB 460 90 PRINT "000",HEX$(C%),HEX$(E%),BI$(E%) 100 OUT $86,$48:'wr=0,rd=1,c3=1,c2=0 110 OUT $85,$80:'b6=0,b7=1 120 C%=IN($82) 130 GOSUB 460 140 PRINT "001",HEX$(C%),HEX$(E%),BI$(E%) 150 OUT $86,$44:'wr=0,rd=1,c3=0,c2=1 160 OUT $85,$80:'b6=0,b7=1 170 C%=IN($82) 180 GOSUB 460 190 PRINT "010",HEX$(C%),HEX$(E%),BI$(E%) 200 OUT $86,$4C:'wr=0,rd=1,c3=1,c2=1 210 OUT $85,$80:'b6=0,b7=1 220 C%=IN($82) 230 GOSUB 460 240 PRINT "011",HEX$(C%),HEX$(E%),BI$(E%) 250 OUT $86,$40:'wr=0,rd=1,c3=0,c2=0 260 OUT $85,$C0:'b6=1,b7=1 270 C%=IN($82) 280 GOSUB 460 290 PRINT "100",HEX$(C%),HEX$(E%),BI$(E%) 300 OUT $86,$48:'wr=0,rd=1,c3=1,c2=0 310 OUT $85,$C0:'b6=1,b7=1 320 C%=IN($82) 330 GOSUB 460 340 PRINT "101",HEX$(C%),HEX$(E%),BI$(E%) 350 OUT $86,$44:'wr=0,rd=1,c3=0,c2=1 360 OUT $85,$C0:'b6=1,b7=1 370 C%=IN($82) 380 GOSUB 460 390 PRINT "110",HEX$(C%),HEX$(E%),BI$(E%) 400 OUT $86,$4C:'wr=0,rd=1,c3=1,c2=1 410 OUT $85,$C0:'b6=1,b7=1 420 C%=IN($82) 430 GOSUB 460 440 PRINT "111",HEX$(C%),HEX$(E%),BI$(E%) 450 STOP 460 'code change PC to w7-w0 470 E%=0 480 IF BIT(C%,2)=1 THEN E%=E%+1 490 IF BIT(C%,3)=1 THEN E%=E%+2 500 IF BIT(C%,0)=1 THEN E%=E%+4 510 IF BIT(C%,1)=1 THEN E%=E%+8 520 IF BIT(C%,5)=1 THEN E%=E%+16 530 IF BIT(C%,4)=1 THEN E%=E%+32 540 IF BIT(C%,7)=1 THEN E%=E%+64 550 IF BIT(C%,6)=1 THEN E%=E%+128 560 RETURN |
今までのプログラムでは基板に与えるデータのd3(PB7)を0にしていました。
変更後のプログラムではd3(PB7)=1にしています。
下が実行結果です。
>r. 000 FB FE 11111110 001 F7 FD 11111101 010 FE FB 11111011 011 FD F7 11110111 100 DF EF 11101111 101 EF DF 11011111 110 7F BF 10111111 111 BF 7F 01111111 break in 450 |
以上でREGISTER_SELECT_WR試作基板のとりあえずの動作テストが完了しました。
トランジスタでCPUをつくろう![第224回]
2020.4.19upload
前へ
次へ
ホームページトップへ戻る