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

トランジスタで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

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