トランジスタでCPUをつくろう!
トランジスタで8080をつくってしまおうというまさにびっくり仰天、狂気のプロジェクトです!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
見事にできましたら、もちろんTK−80モニタを乗せて、それからBASIC、CP/Mを走らせましょう!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
[第227回]
●REGISTER_SELECT_RD回路(3)テストプログラム
今回はREGISTER_SELECT_RD試作基板の動作テストです。
今までと同様BASICプログラムを作ってテストします。
プログラムの理解を助けるために前回お見せしたコネクタ接続図を再掲します。
上の接続図のように82C55を2個使って増設I/Oボードの82C55(I/Oアドレスは84−87に設定)のCポートからRD_信号とs0−s3を出力し、ND80Z3.5上の82C55(I/Oアドレスは80−83)のBポートで出力結果(R0−R7)を読んで結果を表示します。
下が作成したテストプログラムのプログラムリストです。
10 OUT $87,$80 20 OUT $86,$FF 40 OUT $83,$9B 50 OUT $86,$80:'wr=1,rd=0,c4=0,c5=0,c1=0,c0=0 70 B%=IN($81) 80 GOSUB 460 90 PRINT "000",HEX$(B%),HEX$(E%),BI$(E%) 100 OUT $86,$90:'wr=1,rd=0,c4=1,c5=0,c1=0,c0=0 120 B%=IN($81) 130 GOSUB 460 140 PRINT "001",HEX$(B%),HEX$(E%),BI$(E%) 150 OUT $86,$A0:'wr=1,rd=0,c4=0,c5=1,c1=0,c0=0 170 B%=IN($81) 180 GOSUB 460 190 PRINT "010",HEX$(B%),HEX$(E%),BI$(E%) 200 OUT $86,$B0:'wr=1,rd=0,c4=1,c5=1,c1=0,c0=0 220 B%=IN($81) 230 GOSUB 460 240 PRINT "011",HEX$(B%),HEX$(E%),BI$(E%) 250 OUT $86,$82:'wr=1,rd=0,c4=0,c5=0,c1=1,c0=0 270 B%=IN($81) 280 GOSUB 460 290 PRINT "100",HEX$(B%),HEX$(E%),BI$(E%) 300 OUT $86,$92:'wr=1,rd=0,c4=1,c5=0,c1=1,c0=0 320 B%=IN($81) 330 GOSUB 460 340 PRINT "101",HEX$(B%),HEX$(E%),BI$(E%) 350 OUT $86,$A2:'wr=1,rd=0,c4=0,c5=1,c1=1,c0=0 370 B%=IN($81) 380 GOSUB 460 390 PRINT "110",HEX$(B%),HEX$(E%),BI$(E%) 400 OUT $86,$B2:'wr=1,rd=0,c4=1,c5=1,c1=1,c0=0 420 B%=IN($81) 430 GOSUB 460 440 PRINT "111",HEX$(B%),HEX$(E%),BI$(E%) 450 STOP 460 'code change PB to r7-r0 470 E%=0 480 IF BIT(B%,1)=1 THEN E%=E%+1 490 IF BIT(B%,0)=1 THEN E%=E%+2 500 IF BIT(B%,3)=1 THEN E%=E%+4 510 IF BIT(B%,2)=1 THEN E%=E%+8 520 IF BIT(B%,5)=1 THEN E%=E%+16 530 IF BIT(B%,4)=1 THEN E%=E%+32 540 IF BIT(B%,7)=1 THEN E%=E%+64 550 IF BIT(B%,6)=1 THEN E%=E%+128 560 RETURN |
Bポートのビットの並びとREGISTER_SELECT_RD基板の16pinコネクタ(CN2)のビットの並びは異なっています(上のコネクタ接続図参照)。
CN2に配置されているR7−R0のビットの並び順に表示するために460−560の変換サブルーチンをCALLしています。
B%が入力データでE%が変換後のデータです。
下が実行結果です。
>r. 000 FD FE 11111110 001 FE FD 11111101 010 F7 FB 11111011 011 FB F7 11110111 100 DF EF 11101111 101 EF DF 11011111 110 7F BF 10111111 111 BF 7F 01111111 break in 450 |
REGISTER_SELECT_RD基板もR0−R7の出力をモニタするために8個のLED表示回路を実装しています。
その表示を確認するためにウェイトルーチンを追加しました。
下はそのように追加を行なったプログラムリストです。
10 OUT $87,$80 20 OUT $86,$FF 40 OUT $83,$9B 50 OUT $86,$80:'wr=1,rd=0,c4=0,c5=0,c1=0,c0=0 70 B%=IN($81) 80 GOSUB 460 90 PRINT "000",HEX$(B%),HEX$(E%),BI$(E%) 95 FOR A=0 TO 1000:NEXT A 100 OUT $86,$90:'wr=1,rd=0,c4=1,c5=0,c1=0,c0=0 120 B%=IN($81) 130 GOSUB 460 140 PRINT "001",HEX$(B%),HEX$(E%),BI$(E%) 145 FOR A=0 TO 1000:NEXT A 150 OUT $86,$A0:'wr=1,rd=0,c4=0,c5=1,c1=0,c0=0 170 B%=IN($81) 180 GOSUB 460 190 PRINT "010",HEX$(B%),HEX$(E%),BI$(E%) 195 FOR A=0 TO 1000:NEXT A 200 OUT $86,$B0:'wr=1,rd=0,c4=1,c5=1,c1=0,c0=0 220 B%=IN($81) 230 GOSUB 460 240 PRINT "011",HEX$(B%),HEX$(E%),BI$(E%) 245 FOR A=0 TO 1000:NEXT A 250 OUT $86,$82:'wr=1,rd=0,c4=0,c5=0,c1=1,c0=0 270 B%=IN($81) 280 GOSUB 460 290 PRINT "100",HEX$(B%),HEX$(E%),BI$(E%) 295 FOR A=0 TO 1000:NEXT A 300 OUT $86,$92:'wr=1,rd=0,c4=1,c5=0,c1=1,c0=0 320 B%=IN($81) 330 GOSUB 460 340 PRINT "101",HEX$(B%),HEX$(E%),BI$(E%) 345 FOR A=0 TO 1000:NEXT A 350 OUT $86,$A2:'wr=1,rd=0,c4=0,c5=1,c1=1,c0=0 370 B%=IN($81) 380 GOSUB 460 390 PRINT "110",HEX$(B%),HEX$(E%),BI$(E%) 395 FOR A=0 TO 1000:NEXT A 400 OUT $86,$B2:'wr=1,rd=0,c4=1,c5=1,c1=1,c0=0 420 B%=IN($81) 430 GOSUB 460 440 PRINT "111",HEX$(B%),HEX$(E%),BI$(E%) 450 STOP 460 'code change PB to r7-r0 470 E%=0 480 IF BIT(B%,1)=1 THEN E%=E%+1 490 IF BIT(B%,0)=1 THEN E%=E%+2 500 IF BIT(B%,3)=1 THEN E%=E%+4 510 IF BIT(B%,2)=1 THEN E%=E%+8 520 IF BIT(B%,5)=1 THEN E%=E%+16 530 IF BIT(B%,4)=1 THEN E%=E%+32 540 IF BIT(B%,7)=1 THEN E%=E%+64 550 IF BIT(B%,6)=1 THEN E%=E%+128 560 RETURN |
95、145、195、245、295、345、395がウェイトルーチンです。
REGISTER_SELECT_WR基板のテストのときと同じですから、実行結果は省略します。
REGISTER_SELECT_WR基板と同じように、回路の出力はs3=0の入力に対してはR0〜R7出力とし、s3=1に対してはR8〜R15の出力とするためにs3の入力をジャンパーピンで切り換えて設定します([第222回]回路図参照)。
ジャンパーピンをLOW側にセットするとs3=0のときに出力がアクティブになります。
ジャンパーピンをHIGH側にセットするとs0=1のときに出力がアクティブになります。
上のテストプログラムはs0=0を前提にしているので、HIGH側にセットするとREGISTER_SELECT_RD基板からの出力は得られません。
下はジャンパーピンを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 |
s0=1の時に基板から正しい出力が得られるようにプログラムを変更しました。
下はそのように変更したプログラムリストです。
10 OUT $87,$80 20 OUT $86,$FF 40 OUT $83,$9B 50 OUT $86,$81:'wr=1,rd=0,c4=0,c5=0,c1=0,c0=1 70 B%=IN($81) 80 GOSUB 460 90 PRINT "000",HEX$(B%),HEX$(E%),BI$(E%) 100 OUT $86,$91:'wr=1,rd=0,c4=1,c5=0,c1=0,c0=1 120 B%=IN($81) 130 GOSUB 460 140 PRINT "001",HEX$(B%),HEX$(E%),BI$(E%) 150 OUT $86,$A1:'wr=1,rd=0,c4=0,c5=1,c1=0,c0=1 170 B%=IN($81) 180 GOSUB 460 190 PRINT "010",HEX$(B%),HEX$(E%),BI$(E%) 200 OUT $86,$B1:'wr=1,rd=0,c4=1,c5=1,c1=0,c0=1 220 B%=IN($81) 230 GOSUB 460 240 PRINT "011",HEX$(B%),HEX$(E%),BI$(E%) 250 OUT $86,$83:'wr=1,rd=0,c4=0,c5=0,c1=1,c0=1 270 B%=IN($81) 280 GOSUB 460 290 PRINT "100",HEX$(B%),HEX$(E%),BI$(E%) 300 OUT $86,$93:'wr=1,rd=0,c4=1,c5=0,c1=1,c0=1 320 B%=IN($81) 330 GOSUB 460 340 PRINT "101",HEX$(B%),HEX$(E%),BI$(E%) 350 OUT $86,$A3:'wr=1,rd=0,c4=0,c5=1,c1=1,c0=1 370 B%=IN($81) 380 GOSUB 460 390 PRINT "110",HEX$(B%),HEX$(E%),BI$(E%) 400 OUT $86,$B3:'wr=1,rd=0,c4=1,c5=1,c1=1,c0=1 420 B%=IN($81) 430 GOSUB 460 440 PRINT "111",HEX$(B%),HEX$(E%),BI$(E%) 450 STOP 460 'code change PB to r7-r0 470 E%=0 480 IF BIT(B%,1)=1 THEN E%=E%+1 490 IF BIT(B%,0)=1 THEN E%=E%+2 500 IF BIT(B%,3)=1 THEN E%=E%+4 510 IF BIT(B%,2)=1 THEN E%=E%+8 520 IF BIT(B%,5)=1 THEN E%=E%+16 530 IF BIT(B%,4)=1 THEN E%=E%+32 540 IF BIT(B%,7)=1 THEN E%=E%+64 550 IF BIT(B%,6)=1 THEN E%=E%+128 560 RETURN |
今までのプログラムでは基板に与えるデータのs3(PC0)を0にしていました。
変更後のプログラムではs3(PC0)=1にしています。
下が実行結果です。
>r. 000 FD FE 11111110 001 FE FD 11111101 010 F7 FB 11111011 011 FB F7 11110111 100 DF EF 11101111 101 EF DF 11011111 110 7F BF 10111111 111 BF 7F 01111111 break in 450 |
以上でREGISTER_SELECT_RD試作基板のとりあえずの動作テストが完了しました。
トランジスタでCPUをつくろう![第227回]
2020.4.22upload
前へ
次へ
ホームページトップへ戻る