2014.9.7

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

MYCPU80でCP/Mを!
超巨大基板の8080互換HCMOS・CPUでCP/Mを走らせてしまおうという、なんとも狂気なプロジェクトです!


[第32回]


●MYCPU80命令回路テストプログラム

前回説明しましたように修理依頼品のMYCPU80がやっと修理完了したと思い、念のためにと思って移植作業途中のZB3BASICをロードして実行しましたところ、関数演算の平方根や三角関数でまさかのエラーが発生してしまいました。

並みの処理プログラムではありません。
なんたって浮動小数点演算の、しかも平方根や三角関数(!)なのですから、これは弱りました。
どう攻めていったらよいものやら。
しばし考え込んでしまいました。

ええ。
平方根だって三角関数だって全部自分で書いたプログラムですから、そりゃあ解析できないわけはありませんです。
ちゃんと覚えておれば、ですけれど。
そんなもの覚えているわけはないです。
ND80Z3.5(ND80ZV)用のZB3BASICシステムはまだ4年ほど前に書いたものですけれど、そのもとになったプログラムはもう30年近くも前に書いたプログラムなんですから。
もう露ほども記憶に残っておりませぬ。

何かよい方法はないものかとMYCPU80の書類の山をひっかきまわしていましたら、表に「MYCPU80テストプログラム」と書いた紙袋が見つかりました。
なんじゃこりゃ。
中を見てみましたら、MYCPU80の命令回路ごとにテストをするテストプログラムのリストが出てきました。

おお。
こんなものいいものを書いておったのだ。
完全に忘れておりました。
過去記事を調べてみましたら。
「CPUをつくろう」[第256回]以降でTEST1からTEST12までのプログラムを作って解説しておりました。

これですよ、これ。
これを使えば、どの命令回路でエラーになっているのかがたちどころにわかってしまうではないか。
そうそう。
修理が完全に完了しているかどうかを確認するためにもこれは全部実行しておくにこしたことはありません。
さっそくTEST1から順に全部テストをしてみることにしました。

ただ、「CPUをつくろう」[第256回]以降で説明しておりますテストプログラムはTK−80モニタ上で実行するように書いたものですが、せっかく不完全ながらもZB3BASICがMYCPU80上で動くところまで出来ているのですから、ZB3BASICシステム上で動作するプログラムにしたほうがなにかと便利です。
ちゃんとログだってとれますから、そのほうがはるかに便利です。
そこでTEST1からTEST12までをそのようにするためにそれぞれ一部ですけれど書き換えました。
下はそのように書き換えたTEST1のリストです。

2014/8/30  11:34  test1b.txt
END=80F1
              ;;; MYCPU80 TEST1
              ;;; MVI r,MOV r,r'
              ;;; 09/06/09 6/11 6/12
              ;14/8/30
              ;
              	ORG $8000
              ;
              	STCK=$A000
              	ERBF=$B000
              	REENT=$1033
              	PA=$F440
              ;
8000 3100A0   	LXI SP,STCK
8003 0E00     	MVI C,00
8005 C5       	PUSH B
8006 F1       	POP PSW;CLEAR FLAG REGISTER
              ;	
              ; MVI
8007 CDAB80   	CALL MVI
800A C5       	PUSH B
800B D5       	PUSH D
800C E5       	PUSH H
800D F5       	PUSH PSW
              ;MOV r,r
800E 40       	MOV B,B
800F 49       	MOV C,C
8010 52       	MOV D,D
8011 5B       	MOV E,E
8012 64       	MOV H,H
8013 6D       	MOV L,L
8014 7F       	MOV A,A
8015 C5       	PUSH B
8016 D5       	PUSH D
8017 E5       	PUSH H
8018 F5       	PUSH PSW
              ;MOV1
8019 41       	MOV B,C
801A 4A       	MOV C,D
801B 53       	MOV D,E
801C 5C       	MOV E,H
801D 65       	MOV H,L
801E 6F       	MOV L,A
801F 78       	MOV A,B;=C
8020 C5       	PUSH B
8021 D5       	PUSH D
8022 E5       	PUSH H
8023 F5       	PUSH PSW
              ;MOV2
8024 CDAB80   	CALL MVI
8027 7D       	MOV A,L
8028 6C       	MOV L,H
8029 63       	MOV H,E
802A 5A       	MOV E,D
802B 51       	MOV D,C
802C 48       	MOV C,B
802D 47       	MOV B,A;=L
802E C5       	PUSH B
802F D5       	PUSH D
8030 E5       	PUSH H
8031 F5       	PUSH PSW
              ;MOV3
8032 CDAB80   	CALL MVI
8035 68       	MOV L,B
8036 42       	MOV B,D
8037 54       	MOV D,H
8038 67       	MOV H,A
8039 79       	MOV A,C
803A 4B       	MOV C,E
803B 5D       	MOV E,L;=B
803C C5       	PUSH B
803D D5       	PUSH D
803E E5       	PUSH H
803F F5       	PUSH PSW
              ;MOV4
8040 CDAB80   	CALL MVI
8043 5F       	MOV E,A
8044 7A       	MOV A,D
8045 55       	MOV D,L
8046 69       	MOV L,C
8047 4C       	MOV C,H
8048 60       	MOV H,B
8049 43       	MOV B,E;=A
804A C5       	PUSH B
804B D5       	PUSH D
804C E5       	PUSH H
804D F5       	PUSH PSW
              ;MOV5
804E CDAB80   	CALL MVI
8051 61       	MOV H,C
8052 4D       	MOV C,L
8053 6A       	MOV L,D
8054 57       	MOV D,A
8055 7B       	MOV A,E
8056 58       	MOV E,B
8057 44       	MOV B,H;=C
8058 C5       	PUSH B
8059 D5       	PUSH D
805A E5       	PUSH H
805B F5       	PUSH PSW
              ;MOV6
805C CDAB80   	CALL MVI
805F 50       	MOV D,B
8060 45       	MOV B,L
8061 6B       	MOV L,E
8062 59       	MOV E,C
8063 4F       	MOV C,A
8064 7C       	MOV A,H
8065 62       	MOV H,D;=B
8066 C5       	PUSH B
8067 D5       	PUSH D
8068 E5       	PUSH H
8069 F5       	PUSH PSW
              ;;;
              ; CHECK MVI
806A 3100B0   	LXI SP,ERBF
806D 2100A0   	LXI H,STCK
8070 2B       	DCX H
8071 11C180   	LXI D,TBL1END
8074 D5       	PUSH D
8075 0608     	MVI B,08
8077 1A       LOOP0:LDAX D
8078 BE       	CMP M
8079 CA7D80   	JZ LOOP0_2
807C E5       	PUSH H;ERR
807D 2B       LOOP0_2:DCX H
807E 1B       	DCX D
807F 05       	DCR B
8080 C27780   	JNZ LOOP0
8083 D1       	POP D
              ;CHECK MOV
8084 0E07     	MVI C,07
8086 0608     LOOP1:MVI B,08
8088 1A       LOOP2:LDAX D
8089 BE       	CMP M
808A CA8E80   	JZ LOOP2_2
808D E5       	PUSH H;ERR
808E 2B       LOOP2_2:DCX H
808F 1B       	DCX D
8090 05       	DCR B
8091 C28880   	JNZ LOOP2
8094 E5       	PUSH H
8095 211000   	LXI H,$0010
8098 19       	DAD D
8099 EB       	XCHG
809A E1       	POP H
809B 0D       	DCR C
809C C28680   	JNZ LOOP1
809F E5       	PUSH H
80A0 210000   	LXI H,$0000
80A3 E5       	PUSH H
80A4 39       	DAD SP
80A5 2240F4   	SHLD PA
80A8 C33310   	JMP REENT
              ;
              ;SUBROUTINE
80AB 0612     MVI:MVI B,12
80AD 0E34     	MVI C,34
80AF 1656     	MVI D,56
80B1 1E78     	MVI E,78
80B3 269A     	MVI H,9A
80B5 2EBC     	MVI L,BC
80B7 3EDE     	MVI A,DE
80B9 C9       	RET
              ;
              ;COMPARE DATA TABLE
              ;MVI
80BA 00       TBL1:DB 00;F
80BB DE       	DB DE;A
80BC BC       	DB BC;L
80BD 9A       	DB 9A;H
80BE 78       	DB 78;E
80BF 56       	DB 56;D
80C0 34       	DB 34;C
80C1 12       TBL1END:DB 12;B
              ;MOV1
80C2 00       	DB 00;F
80C3 34       	DB 34;A
80C4 DE       	DB DE;L
80C5 BC       	DB BC;H
80C6 9A       	DB 9A;E
80C7 78       	DB 78;D
80C8 56       	DB 56;C
80C9 34       	DB 34;B
              ;MOV2
80CA 00       	DB 00;F
80CB BC       	DB BC;A
80CC 9A       	DB 9A;L
80CD 78       	DB 78;H
80CE 56       	DB 56;E
80CF 34       	DB 34;D
80D0 12       	DB 12;C
80D1 BC       	DB BC;B;
              ;MOV3
80D2 00       	DB 00;F
80D3 34       	DB 34;A
80D4 12       	DB 12;L
80D5 DE       	DB DE;H
80D6 12       	DB 12;E
80D7 9A       	DB 9A;D
80D8 78       	DB 78;C
80D9 56       	DB 56;B
              ;MOV4
80DA 00       	DB 00;F
80DB 56       	DB 56;A
80DC 34       	DB 34;L
80DD 12       	DB 12;H
80DE DE       	DB DE;E
80DF BC       	DB BC;D
80E0 9A       	DB 9A;C
80E1 DE       	DB DE;B;	
              ;MOV5
80E2 00       	DB 00;F
80E3 78       	DB 78;A
80E4 56       	DB 56;L
80E5 34       	DB 34;H
80E6 12       	DB 12;E
80E7 DE       	DB DE;D
80E8 BC       	DB BC;C
80E9 34       	DB 34;B
              ;MOV6
80EA 00       	DB 00;F
80EB 9A       	DB 9A;A
80EC 78       	DB 78;L
80ED 12       	DB 12;H
80EE 34       	DB 34;E
80EF 12       	DB 12;D
80F0 DE       	DB DE;C
80F1 BC       	DB BC;B;
              ;
ERBF         =B000  LOOP0        =8077  LOOP0_2      =807D  
LOOP1        =8086  LOOP2        =8088  LOOP2_2      =808E  
MVI          =80AB  PA           =F440  REENT        =1033  
STCK         =A000  TBL1         =80BA  TBL1END      =80C1  

下はテストプログラムを実行したときのログです。

logfile nd80zlog\08301128.txt open
zb3dos3m 2014.3.31 by Chunichidenko

MYCPU80に接続しました

*** nd80z3 basic ****
>/ld test1b.bin,8000
loading TEST1B.BIN ...00f2(242)bytes loaded,from 8000 to 80F1
>jp 8000
>p.hex$(a%)
AFFC

>dm aff0,afff
AFF0  00 0B 08 28 FF FF FF FF-00 00 00 00 00 00 BF 9F  ...(..........ソ.
>/ld test2b.bin,8000
loading TEST2B.BIN ...0089(137)bytes loaded,from 8000 to 8088
>jp 8000
>p.hex$(a%)
AFFA

>dm aff0,afff
AFF0  00 0B 08 28 FF FF FF FF-00 00 00 00 EF 9F FB 9F  ...(............
>dm 9ff0,9fff
9FF0  00 12 DE BC 9A 78 56 34-00 DE FA 9F 78 56 34 12  ..゙シ.xV4.゙..xV4.
>dm 8070,808f
8070  1E 78 26 9A 2E BC 3E DE-C9 00 DE FA 4F 78 56 34  .x&..シ>゙ノ.゙.OxV4
8080  12 00 12 DE BC 9A 78 56-34 BE CA 8E 80 E5 2B 1B  ...゙シ.xV4セハ...+.

>/ld test3b.bin,8000
loading TEST3B.BIN ...00ec(236)bytes loaded,from 8000 to 80EB
>jp 8000
>p.hex$(a%)
AFFC

>/ld test4b.bin,8000
loading TEST4B.BIN ...00d9(217)bytes loaded,from 8000 to 80D8
>jp 8000
>p.hex$(a%)
AFFC

>/ld test5b.bin,8000
loading TEST5B.BIN ...00dc(220)bytes loaded,from 8000 to 80DB
>jp 8000
>p.hex$(a%)
AFFC

>/ld test6b.bin,8000
loading TEST6B.BIN ...0128(296)bytes loaded,from 8000 to 8127
>jp 8000
>p.hex$(a%)
AFFC

>/ld test7b.bin,8000
loading TEST7B.BIN ...012d(301)bytes loaded,from 8000 to 812C
>jp 8000
>p.hex$(a%)
AFFC

>/ld test8b.bin,8000
loading TEST8B.BIN ...0093(147)bytes loaded,from 8000 to 8092
>jp 8000
>p.hex$(a%)
AFFC

>/ld test9b.bin,8000
loading TEST9B.BIN ...01fd(509)bytes loaded,from 8000 to 81FC
>jp 8000
>p.hex$(a%)
AF9C

>dm af90,afff
AF90  D6 93 20 61 FF FF FF 7F-00 02 00 08 00 00 7F 9F  ヨ. a..........
AFA0  91 9F 93 9F 95 9F 97 9F-99 9F 9B 9F 9D 9F 9F 9F  ................
AFB0  A1 9F A3 9F A5 9F A7 9F-A9 9F AB 9F AD 9F AF 9F  。.」.・.ァ.ゥ.ォ.ュ.ッ.
AFC0  B1 9F B3 9F B5 9F B7 9F-B9 9F BB 9F BD 9F BF 9F  ア.ウ.オ.キ.ケ.サ.ス.ソ.
AFD0  D1 9F D3 9F D5 9F D7 9F-D9 9F DB 9F DD 9F DF 9F  ム.モ.ユ.ラ.ル.ロ.ン.゚.
AFE0  E1 9F E3 9F E5 9F E7 9F-E9 9F EB 9F ED 9F EF 9F  ................
AFF0  F1 9F F3 9F F5 9F F7 9F-F9 9F FB 9F FD 9F FF 9F  ................
>dm 8170,81ff
8170  13 D5 E9 E1 13 D5 E5 E0-E1 D1 13 D5 E9 0C 00 0A  .ユ...ユ...ム.ユ....
8180  00 09 00 08 00 06 00 04-00 03 00 01 00 E3 41 E0  ..............A.
8190  41 DD 41 DA 41 D7 41 D1-41 CB 41 C8 41 C5 41 BF  AンAレAラAムAヒAネAナAソ
81A0  41 BC 41 B9 41 B3 41 B0-41 AD 41 AA 41 A7 41 A1  AシAケAウAーAュAェAァA。
81B0  41 9B 41 98 41 95 41 8F-41 8C 41 89 41 0C 00 0B  A.A.A.A.A.A.A...
81C0  00 09 00 07 00 06 00 05-00 03 00 02 00 67 41 64  .............gAd
81D0  41 5E 41 58 41 55 41 52-41 4F 41 4C 41 46 41 43  A^AXAUARAOALAFAC
81E0  41 40 41 3A 41 37 41 34-41 2E 41 28 41 25 41 22  A@A:A7A4A.A(A%A"
81F0  41 1F 41 1C 41 16 41 13-41 10 41 0A 41 00 00 00  A.A.A.A.A.A.A...
>dm 9f70,9fff
9F70  AD F9 EE 6A FF FF FF FF-FF FF FF FF EA CF 01 81  ュ..j.........マ..
9F80  0C 00 0A 00 09 00 08 00-06 00 04 00 03 00 01 00  ................
9F90  E3 80 E0 80 DD 80 DA 80-D7 80 D1 80 CB 80 C8 80  ....ン.レ.ラ.ム.ヒ.ネ.
9FA0  C5 80 BF 80 BC 80 B9 80-B3 80 B0 80 AD 80 AA 80  ナ.ソ.シ.ケ.ウ.ー.ュ.ェ.
9FB0  A7 80 A1 80 9B 80 98 80-95 80 8F 80 8C 80 89 80  ァ.。.............
9FC0  0C 00 0B 00 09 00 07 00-06 00 05 00 03 00 02 00  ................
9FD0  67 80 64 80 5E 80 58 80-55 80 52 80 4F 80 4C 80  g.d.^.X.U.R.O.L.
9FE0  46 80 43 80 40 80 3A 80-37 80 34 80 2E 80 28 80  F.C.@.:.7.4...(.
9FF0  25 80 22 80 1F 80 1C 80-16 80 13 80 10 80 0A 80  %.".............
>/ld test9b.bin,8000
loading TEST9B.BIN ...01fd(509)bytes loaded,from 8000 to 81FC
>jp 8000
>p.hex$(a%)
AFFC

>/ld test10b.bin,8000
loading TEST10B.BIN ...008e(142)bytes loaded,from 8000 to 808D
>jp 8000
>p.hex$(a%)
AFF4

>dm aff0,afff
AFF0  F1 9F F3 9F 00 00 D7 9F-DD 9F E3 9F E9 9F F1 9F  ......ラ.ン.......
>dm 9fd0,9fff
9FD0  67 80 64 80 5E 80 58 80-44 55 44 00 F3 9F 00 EF  g.d.^.X.DUD.....
9FE0  78 56 F3 9F 00 EF 79 56-F4 9F 01 EF 78 56 00 EF  xV....yV....xV..
9FF0  F3 9F 00 EF 68 C0 01 EF-34 E0 10 EF BC 89 11 EF  ....hタ..4...シ...
>dm 8060,808f
8060  22 40 F4 C3 33 10 44 55-44 00 F3 4F 00 EF 78 56  "@.テ3.DUD..O..xV
8070  F3 4F 00 EF 79 56 F4 4F-01 EF 78 56 00 EF F3 4F  .O..yV.O..xV...O
8080  00 EF 68 C0 01 EF 34 E0-10 EF BC 89 11 EF 6F FF  ..hタ..4...シ...o.
>/ld test11b.bin,8000
loading TEST11B.BIN ...006a(106)bytes loaded,from 8000 to 8069
>jp 8000
>p.hex$(a%)
AFFC

>/ld test12b.bin,8000
loading TEST12B.BIN ...0091(145)bytes loaded,from 8000 to 8090
>jp 8000
>p.hex$(a%)
9FFE

>dm 9ff0,9fff
9FF0  34 12 01 34 00 34 01 34-94 00 95 00 44 00 00 00  4..4.4.4....D...
>dm 9ff0,a00f
9FF0  34 12 01 34 00 34 01 34-94 00 95 00 44 00 00 00  4..4.4.4....D...
A000  12 00 BA 13 78 56 22 04-C2 E5 90 CC 00 01 00 00  ..コ.xV".ツ..フ....
>/ld test122b.bin,8000
loading TEST122B.BIN ...0098(152)bytes loaded,from 8000 to 8097
>jp 8000
>p.hex$(a%)
9FFE

>dm 9ff0,a00f
9FF0  34 12 01 34 00 34 01 34-94 00 95 00 44 00 00 00  4..4.4.4....D...
A000  12 00 BA 13 78 56 22 04-C2 E5 90 CC 00 01 00 00  ..コ.xV".ツ..フ....
>/exit

リモート接続を終了しました
logfile closed at Sat Aug 30 20:44:43 2014

これを見ただけではなんだかお分かりいただけないかもしれません。
プログラムの動作につきましては「CPUをつくろう」[第256回]以降の各プログラムのところで説明しておりますのでそちらを参照してください。

実は上のログではTEST2B、TEST9B、TEST10Bでエラーが発生しています。
しかしその原因について確認してみましたところ、いずれももとのプログラムのロードアドレスをZB3BASICにあわせるために変更したためであることがわかりました。
いずれも比較データにプログラムのアドレス情報が使われていることに気が付かずにプログラムのロードアドレスを変更してしまったことによるエラーでした。
そのうちTEST9Bについてはその場でエラーの原因がそういうことであることに気が付きましたので、すぐにそのようにプログラムを変更して再実行しています。

TEST2B、TEST10Bについても同じ原因であることがわかりましたので、後でプログラムを変更したうえで再実行しました。
下が再実行したときのログです。

logfile nd80zlog\08310842.txt open
zb3dos3m 2014.3.31 by Chunichidenko

MYCPU80に接続しました

*** nd80z3 basic ****
>/ld test2b.bin,8000
loading TEST2B.BIN ...0089(137)bytes loaded,from 8000 to 8088
>jp 8000
>p.hex$(a%)
AFFC

>/ld test10b.bin,8000
loading TEST10B.BIN ...008e(142)bytes loaded,from 8000 to 808D
>jp 8000
>p.hex$(a%)
AFFC

>/load sqrtest.txt
    10 FOR A=0 TO 10
    20 PRINT "a=";A,"sqr(a)=";SQR(A)
    30 NEXT A
    40 PRINT "end"
data end
>r.
a= 0         sqr(a)= 0
a= 1         sqr(a)= 1
a= 2         sqr(a)= 1
a= 3         sqr(a)= 2
a= 4         sqr(a)= 2
a= 5         sqr(a)= 2
a= 6         sqr(a)= 2
a= 7         sqr(a)= 2
a= 8         sqr(a)= 2
a= 9         sqr(a)= 2
a= 10        sqr(a)= 4
end

>/exit

リモート接続を終了しました
logfile closed at Sun Aug 31 09:15:13 2014

結局。
全てのテストプログラムを実行してみた結果、全て正常であるという結果が出てしまいました。
しかし。
にもかかわらず、上のログにありますように、相変わらず平方根の計算は狂っています。
これって、どういうこと?

謎は依然として残ったままでありました。

MYCPU80でCP/Mを![第32回]
2014.9.7upload

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