2014.8.15

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

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


[第15回]


●MYCPU80自動STEPプログラム(BASIC)

前回でやっとハードウェアの準備が整いましたので、次はいよいよプログラムの作成です。
と言いましても今回は当社のBASIC制御ボードZB28Kを使ってのプログラム作成です。
なにしろ昔ながらの簡単BASICですから即席であっという間に作り上げてしまいました。
下がそのプログラムリストです。

    10 A=0
    20 OUT $83,$9B
    30 OUT $87,$80
    40 OUT $84,$FF
    50 A%=IN($80)
    60 B%=IN($81)
    70 C%=IN($82)
    80 A15%=BIT(B%,3)
    90 A14%=BIT(B%,2)
   100 A13%=BIT(B%,5)
   110 A12%=BIT(B%,4)
   120 A11%=BIT(B%,7)
   130 A10%=BIT(B%,6)
   140 A9%=BIT(C%,2)
   150 A8%=BIT(C%,3)
   160 A7%=BIT(C%,0)
   170 A6%=BIT(C%,1)
   180 A5%=BIT(C%,5)
   190 A4%=BIT(C%,4)
   200 A3%=BIT(C%,7)
   210 A2%=BIT(C%,6)
   220 A1%=BIT(B%,1)
   230 A0%=BIT(B%,0)
   240 D7%=BIT(A%,1)
   250 D6%=BIT(A%,0)
   260 D5%=BIT(A%,3)
   270 D4%=BIT(A%,2)
   280 D3%=BIT(A%,6)
   290 D2%=BIT(A%,7)
   300 D1%=BIT(A%,4)
   310 D0%=BIT(A%,5)
   320 AH%=A15%*128+A14%*64+A13%*32+A12%*16+A11%*8+A10%*4+A9%*2+A8%
   330 AL%=A7%*128+A6%*64+A5%*32+A4%*16+A3%*8+A2%*4+A1%*2+A0%
   340 D%=D7%*128+D6%*64+D5%*32+D4%*16+D3%*8+D2%*4+D1%*2+D0%
   350 PRINT HEX$(AH%,2);HEX$(AL%,2);" ";HEX$(D%,2)
   360 OUT $84,0
   370 GOTO 40

たったこれだけの簡単なものです。
行番号10は電源を切ってもプログラムをバックアップしておいてHELPコマンドで復活させるための「おまじない」です。
今回はI/Oアドレス80〜83、84〜87の2つの82C55を使います。
行番号20、30はその初期設定です。
50〜370がMYCPU80をSTEP動作させながらそのときのアドレスバス、データバスの値を表示させている部分です。
なんだかややこしいことをやっていますが、前回も書きましたようにMYCPU80のシステムバスコネクタとZB28KのI/Oポートコネクタとのビットの並び順が異なっているところをプログラムで補正しているためにややこしくなっているだけで(80〜340がその部分)、コアな部分はといえば40〜70と350〜370だけの簡単なプログラムです。
ZB28KはND80Z3.5(ND80ZV)と同じく、画面に表示されたものをそのままログファイルとして記録しますから、このようにPRINT文で画面に表示するだけで、ログファイルがそのままデータの記録ファイルになってしまいます。

ちょいと自慢と宣伝なのですが。
これ以上簡単なツールはありますでしょうか?

●自動STEPのデータです(問題の箇所が明らかになりました)

下がそのようにして記録したログファイル(自動STEPの記録)です。
本当はめちゃめちゃ長いのですが、参考として見ていただくために途中をバッサリ省略してあります。

ええ。
でも私はもちろん、その長い長い記録データを最初から全部チェックいたしました。
大変な労働でありますが、まあしかし開発などのテストを行なっている方たちは皆様膨大なデータと日夜格闘してみえるはずでありますから、問題解決のためには手間を惜しむことは許されません、
おかげで問題箇所を発見することができました。

>R.
0000 C3
FFF9 CF
FFFD F2
0001 3B
0001 3B
0002 00
0002 00
FFFF FF
FFFF FF
FFFF FF
FFFF FF
003B 21
003B 21
FFFF FD
FFFB FF
003C EC
003C EC
003D FF
003D FF
003E 06
003E 06
FFFD F2
FFF9 CF
003F 0C
003F 0C
0040 AF
0040 AF
FFFB FF
FFFF FD
FFFF FF
FFFF FF
FFFF FF
FFFF FF
FFFF FF
FFFF FF
0041 77
0041 77
FFF9 CF
FFFD FE
FFEC 00
FFEC 00
0042 23
0042 23
FFFF FD
FFFB FF
FFFF FF
FFFF FF
FFFF FF
FFFF FF
0043 05
0043 05
FFFD F2
FFF9 CF
FFFF FF
FFFF FF
FFFF FF
FFFF FF
0044 C2
0044 C2
FFFB FF
FFFF FD
0045 41
0045 41
0046 00
0046 00
FFFF FF
FFFF FF
FFFF FF
FFFF FF
0041 77
0041 77
FFF8 FF
FFFC FE
FFED 00
FFED 00
0042 23
0042 23
FFFF FC
FFFA 57
FFFF FF
FFFF FF
FFFF FF
FFFF FF
0043 05
0043 05
FFFD FE
FFF8 FF
FFFF FF
FFFF FF
FFFF FF
FFFF FF
0044 C2
0044 C2
FFFA 57
FFFE FC
0045 41
0045 41
0046 00
0046 00
FFFF FF
FFFF FF
FFFF FF
FFFF FF
0041 77
0041 77
 :
 :
 :
 :
004D C3
004D C3
FFFC FE
FFF8 FF
004E 51
004E 51
004F 00
004F 00
FFFF FF
FFFF FF
FFFF FF
FFFF FF
0051 3E
0051 3E
FFF9 CF
FFFD F2
0052 F7
0052 F7
0053 D3
0053 D3
FFFF FD
FFFB FF
0054 98
0054 98
0098 F7
0098 F7
0055 31
0055 31
FFFD F2
FFF9 CF
0056 D1
0056 D1
0057 FF
0057 FF
0058 CD
0058 CD
FFFB FF
FFFF FD
0059 C0
0059 C0
005A 01
005A 01
FFFF FF
FFFF FF
FFD0 00 -----(1)
FFD0 00
FFCF 5B -----(2)
FFCF 5B
FFFF FF
FFFF FF
FFFF FF
FFFF FF
01C0 21
01C0 21
FFFF FD
FFFA 57
01C1 F4
01C1 F4
01C2 FF
01C2 FF
01C3 11
01C3 11
FFFD F2
FFF8 FF
01C4 F8
01C4 F8
01C5 FF
01C5 FF
01C6 01
01C6 01
FFFB 57
FFFE FC
 :
 :
 :
 :
01E5 C2
01E5 C2
FFFC FE
FFF8 FF
01E6 C9
01E6 C9
01E7 01
01E7 01
01E8 C9 ----(3)
01E8 C9
FFFA 57
FFFE F2
FFCF B7 ----(4)
FFCF B7
FFD0 00 ----(5)
FFD0 00
00B7 C9 ----(6)
00B7 C9
FFF8 FF
FFFC FF
FFD1 2A ----(7)
FFD1 2A
FFD2 FB ----(8)
FFD2 FB
FB2A FF ----(9)
FB2A FF
FFFE FC 
FFFA 57
FFD2 FB
FFD2 FB
FFD1 2B
break in 360

ちょっとはてな?と思うのですが、データが二度連続して表示されているところが多くあります。
多分STEP信号の与え方に理由があると思いますが、今はそこにはこだわらないことにしました。
解析ツールを完成させることが目的ではなくて、今はとにかく動作異常をおこしているMYCPU80の誤動作の原因を解明することが第一の目的です。
また各STEPでアドレスバスにFFFF〜FFF8が表示されていますがこれは7セグメントLED表示のためDMAが行なわれているためです。
ちょっとわずらわしいですが無視してください。

MYCPU80はTK−80モードのときはパワーオンまたはリセット後はROMの0000番地からTK−80プログラムの実行を開始します。
上の記録データはそのスタートの時点からCPUがROMに書かれた命令を読み込んで実行していくままを記録しています。

●TK−80モニタプログラムリスト(部分)

参考までに、MYCPU80のROMに書かれているTK−80モニタプログラムのうち、上の記録データに該当する部分を下にお見せします。
上のデータと、このプログラムリストとを見比べて命令が実行されていく様子を確認してみてください。
まずは上のリストの前半部分に対応するプログラム部分です。

2009/6/5  17:51  TK80MON4.TXT
END=02F3
              ;;; TK80 MONITOR PROGRAM FOR MC80
              ; 09/5/28 09/6/1 6/3 6/5
              ;
                ORG $0000
              ;
                USRSP=$FFC7
              ;
                MONSP=$FFD1
                RST2=$FFD1
                RST3=$FFD4
                RST4=$FFD7
                RST5=$FFDA
                RST6=$FFDD
                PSAVE=$FFE0
                SSAVE=$FFE2
                LSAVE=$FFE4
                HSAVE=$FFE5
                ESAVE=$FFE6
                DSAVE=$FFE7
                CSAVE=$FFE8
                BSAVE=$FFE9
                FSAVE=$FFEA
                DATA=$FFEC
                DATA1=$FFED
                ADRES=$FFEE
                ADRES1=$FFEF
                BRKAD=$FFF0
                BRKCT=$FFF2
                KFLAG=$FFF3
                DISP=$FFF4
                DIG=$FFF8
              ; 
              
0000 C33B00     JMP MONST
              ;
                ORG $0008
0008 C35100     JMP START
              ;
                ORG $0010
0010 C3D1FF     JMP RST2
              ;
                ORG $0018
0018 C3D4FF     JMP RST3
              ;
                ORG $0020
0020 C3D7FF     JMP RST4
              ;
                ORG $0028
0028 C3DAFF     JMP RST5
              ;
                ORG $0030
0030 C3DDFF     JMP RST6
              ;
                ORG $0038
0038 C35101     JMP BRENT
              ;
              ; INITIALIZE ROUTINE
              ;
003B 21ECFF   MONST:LXI H,DATA
003E 060C       MVI B,0C
0040 AF         XRA A
0041 77       MONST2:MOV M,A
0042 23         INX H
0043 05         DCR B
0044 C24100     JNZ MONST2
0047 21C7FF     LXI H,USRSP
004A 22E2FF     SHLD SSAVE
004D C35100     JMP START
0050 00         NOP
              ;
              ; MONITOR START
              ;
0051 3EF7     START:MVI A,F7
0053 D398       OUT 98;PIC reset
0055 31D1FF     LXI SP,MONSP
0058 CDC001     CALL SEGCG
005B CD1602     CALL KEYIN
005E 47         MOV B,A
005F E610       ANI 10
0061 CA8400     JZ DIGIT

アドレス0058のCALL命令 CDC001の実行に注意してください。
先のSTEPリストで(1)(2)のところです。
CALL命令の実行によって、リターン先アドレス(次の005B)がスタックに保存されています。
ここが後に重要になってきます。

下がそこでCALLされている7セグメント表示ルーチンです。

              ;
              ; SEGMENT CONVERT SUB
              ;
01C0 21F4FF   SEGCG:LXI H,DISP
01C3 11F8FF     LXI D,DIG
01C6 01E901     LXI B,SEGD
01C9 7E       SEGCG2:MOV A,M
01CA 23         INX H
01CB E5         PUSH H
01CC F5         PUSH PSW
01CD E6F0       ANI F0
01CF 0F         RRC
01D0 0F         RRC
01D1 0F         RRC
01D2 0F         RRC
01D3 2600       MVI H,00
01D5 6F         MOV L,A
01D6 09         DAD B
01D7 7E         MOV A,M
01D8 12         STAX D
01D9 13         INX D
01DA F1         POP PSW
01DB E60F       ANI 0F
01DD 2600       MVI H,00
01DF 6F         MOV L,A
01E0 09         DAD B
01E1 7E         MOV A,M
01E2 12         STAX D
01E3 E1         POP H
01E4 1C         INR E
01E5 C2C901     JNZ SEGCG2
01E8 C9         RET
              ;
              ; SEGMENT DATA
              ;
01E9 5C       SEGD:DB 5C
01EA 06         DB 06
01EB 5B         DB 5B
01EC 4F         DB 4F
01ED 66         DB 66
01EE 6D         DB 6D
01EF 7D         DB 7D
01F0 27         DB 27
01F1 7F         DB 7F
01F2 6F         DB 6F
01F3 77         DB 77
01F4 7C         DB 7C
01F5 39         DB 39
01F6 5E         DB 5E
01F7 79         DB 79
01F8 71         DB 71
              ;

問題はこの表示ルーチンの終わり、アドレス01E8のリターン命令(C9)の実行時に現れました。
先にお見せしたSTEPデータリストで(3)で示したところです。
RET命令の実行によってスタックからリターン先のアドレスが取り出されてプログラムカウンタにセットされます。
(4)(5)のところです。

でもよく見てください。
値が異なっています。
(1)(2)ではスタック(RAMのFFD0、FFCF)に005Bを保存しているのに、(4)(5)で同じRAMアドレスから取り出した値は00B7です。
いつの間にかリターン先アドレスが化けてしまっています。

ROMの00B7近辺のプログラムリストです。

              ;
00AD 3AECFF   MEMR:LDA DATA
00B0 32EDFF     STA DATA1
00B3 7E         MOV A,M
00B4 32ECFF     STA DATA
00B7 C9         RET
              ;
              ; MEMORY READ & ADDRESS DECREMENT
              ;
00B8 2AEEFF   ADDCX:LHLD ADRES
00BB 2B         DCX H
00BC CDAD00     CALL MEMR
00BF C3A400     JMP ADSTR
              ;

7セグメント表示ルーチンとは全く関係はありませんし、このリストを見ても分かりますとおり、00B7はどこからも戻るところではありません。
ですがとにかくプログラムカウンタに00B7がセットされてしまったために、次は00B7のC9(RET)が実行されてしまいました。
(6)のところです。
するとまたスタックからリターン先のアドレスがプログラムカウンタに読み込まれます。
(7)(8)です。
これはもう完全に暴走です。
プログラムカウンタにはFB2Aというとんでもないアドレスがセットされてしまいました。
ですので次はFB2Aの命令が実行されてしまいます。
(9)です。
FB2Aの命令はFF(RST7)です。
ここまで進んだところで暴走していることに気が付きましたので、とりあえずSTEP動作を打ち切りました。

ということで、やっと誤動作している現場を押さえました。
さてそうなると、次は誤動作の原因の追究です。
まだまたホットな日々は続きます。

MYCPU80でCP/Mを![第15回]
2014.8.15upload

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