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

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

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