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

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第192回]


●MACRO−80(4)

前回からの続きです。
CP/M2.2のテストプログラムをMACRO−80用に一部を書き換えて作成したMVFTST1C.MACをMACRO−80でアセンブルしたところ、やっとNo Fatal error(s)と表示されました。
次に、最後の仕上げにマシン語のオブジクトファイルを作成するべく、L80(Link−80)を実行したところ、これもエラー無く終了しました。
そこで、作成されたはずのMVFTST1C.COMを実行するために、
MVFTST1C[Enter]
と入力したところ、まさかのハングアップをしてしまいました。

ひょっとしてMVFTST1C.COMは作成されなかったのか?
DIRコマンドで確認してみましたが、MVFTST1C.COMはちゃんと作成されていました。

A>dir
A: F80      COM : HELL1    FOR : HELL1    REL : HELLO    FOR
A: HELLO    REL : HELL2    FOR : HELL2    REL : HELL3    FOR
A: HELL3    REL : M80      COM : MVFTST1  MAC : MVFTST1  REL
A: MVFTST1B MAC : MVFTST1B PRN : MVFTST1B REL : MVFTST1C MAC
A: MVFTST1C PRN : MVFTST1C REL : L80      COM : MVFTST1C COM

A>

ひょっとして、MACRO−80でアセンブルするときに、何らかの理由で誤変換されたりしているかも、と思ってアセンブル時に作成されたリストファイルを参照してみました。
MACRO−80の実行時に’/L’スイッチをつけると、リストファイルが作成されます。
ファイル名はMVFTST1C.PRNです。
中味はテキストファイルですから、TYPEコマンドで開けます。

A>type mvftst1c.prn
        MACRO-80 3.44   09-Dec-81       PAGE    1


                                ; BDOS function 1 & 2 test for ZBDOS
                                ;for MACRO-80
                                ;12/8/4
                                ;
                                     ORG 0100H
  0005                               FCALL EQU 0005H
                                ;
  0100'   1E 3F                 LOOP:LD E,3FH;?
  0102'   0E 02                         LD C,02
  0104'   CD 0005                       CALL FCALL          
  0107'   0E 01                         LD C,01
  0109'   CD 0005                       CALL FCALL
  010C'   FE 1A                         CP 1AH;^z?
  010E'   C8                            RET Z
  010F'   F5                            PUSH AF
  0110'   1E 3D                         LD E,3DH;=
  0112'   0E 02                         LD C,02
  0114'   CD 0005                       CALL FCALL
  0117'   F1                            POP AF
  0118'   57                            LD D,A
  0119'   CD 0143'                      CALL HEX1
  011C'   5F                            LD E,A
  011D'   7A                            LD A,D
  011E'   0F                            RRCA
  011F'   0F                            RRCA
  0120'   0F                            RRCA
  0121'   0F                            RRCA
  0122'   CD 0143'                      CALL HEX1
  0125'   D5                            PUSH DE
  0126'   5F                            LD E,A
  0127'   0E 02                         LD C,02
  0129'   CD 0005                       CALL FCALL
  012C'   D1                            POP DE
  012D'   0E 02                         LD C,02
  012F'   CD 0005                       CALL FCALL
  0132'   1E 0D                         LD E,0DH
  0134'   0E 02                         LD C,02
  0136'   CD 0005                       CALL FCALL
  0139'   1E 0A                         LD E,0AH
  013B'   0E 02                         LD C,02
  013D'   CD 0005                       CALL FCALL
  0140'   C3 0100'                      JP LOOP
  0143'   E6 0F                 HEX1:AND 0FH
  0145'   C6 30                         ADD A,30H
  0147'   FE 3A                         CP 3AH
  0149'   D8                            RET C;0-9
  014A'   C6 07                         ADD A,07;A-F
  014C'   C9                            RET     
                                ;
                                        END
        MACRO-80 3.44   09-Dec-81       PAGE    S


Macros:

Symbols:
0005    FCALL           0143'   HEX1            0100'   LOOP            



No Fatal error(s)

うーん。
見たところ異常は無さそうですねえ。
ただCALL、JPのアドレス部が気になります。
CD0500になるべきところが、CD 0005になっています。
もっともここはこのあとリンカー(L80)にかければ正しく置き換えられるのかもしれませんが。

こうなってくると、やっぱり最終的なマシン語コードがどうなっているのかを確認してみるしかないようです。
そのためには、MVFTST1C[Enter]を実行して、マシン語プログラムが0100Hにロードされた直後にブレークして、0100Hからのメモリ内容をDM@コマンドで確かめてみるのがよさそうです。

トランジェントプログラムをロードした直後にブレークさせる方法については、[第181回]で説明をいたしました。
そこではCCPプログラムのアドレスC238Hにブレークポイントを設定しました。
C238Hは0100Hにトランジェントプログラムをロードしたあと、その0100HへのCALL命令が書かれているアドレスです。

[第181回]の時点ではその方法でよかったのですが、その後にCP/Mではメモリサイズの大きなプログラムをロード、実行する場合に、CCP部分を上書きすることもある、ということがわかったため、BIOSのブート部分を修正して、ブート時にはCCPを再ロードするように変更しました。
うーん。
ちょっと説明がわかりにくいかもしれませんが。
ZB3BASICからJP D233[Enter]でCP/M互換DOSを起動するとき、そのブートが行なわれます。
つまり、JP D233の実行後にCCPプログラムがロードされるため、それ以前にCCPプログラムにブレークポイントを設定しても無意味、ということです。

新しく変更したBIOSのブートプログラム部分です。
アドレスD2B7Hで、CCPのロードプログラムがCALLされています。

              ;
              ;BIOS ROUTINE
              ;
D277 3100F8   SETENTRY:LD SP,SPTOP
D27A AF       	XOR A
D27B 3204D6   	LD (CURDRV),A
              ;here,dos system reload
D27E 3100F8   WBOOTJ:LD SP,SPTOP
D281 3EFF     	LD A,FF
D283 D39C     	OUT (9C),A
D285 213800   	LD HL,RST7
D288 3EC3     	LD A,C3
D28A 77       	LD (HL),A
D28B 23       	INC HL
D28C 11CAD2   	LD DE,RST7BRK
D28F 73       	LD (HL),E
D290 23       	INC HL
D291 72       	LD (HL),D
              ;
D292 210000   	LD HL,REENT
D295 3EC3     	LD A,C3
D297 77       	LD (HL),A
D298 23       	INC HL
D299 1103D2   	LD DE,BOOT
D29C 73       	LD (HL),E
D29D 23       	INC HL
D29E 72       	LD (HL),D
D29F 210300   	LD HL,IOBYTE
D2A2 AF       	XOR A
D2A3 77       	LD (HL),A
D2A4 23       	INC HL
D2A5 77       	LD (HL),A
D2A6 23       	INC HL
D2A7 3EC3     	LD A,C3
D2A9 77       	LD (HL),A
D2AA 23       	INC HL
D2AB 1106C7   	LD DE,FBASE
D2AE 73       	LD (HL),E
D2AF 23       	INC HL
D2B0 72       	LD (HL),D
D2B1 11E9D4   	LD DE,ZCCP
D2B4 2100BF   	LD HL,CBASE
D2B7 CD87D4   	CALL LOADZ
D2BA DAC4D2   	JP C,SETEN2
D2BD 3A04D6   	LD A,(CURDRV)
D2C0 4F       	LD C,A
D2C1 C300BF   	JP CBASE
D2C4 AF       SETEN2:XOR A
D2C5 D39C     	OUT (9C),A
D2C7 C33310   	JP ZB3MON

そこでトランジェントプログラムのロード直後にブレークするための手続きはちょっと複雑になりますが、2段階で行なうことになります。
下のログファイルが実際にそれを行なっているところです。

まず最初はCCPのロード直後にブレークするため、アドレスD2C1Hにブレークポイントを設定します。
CCPをロード後にCCPにエントリする直前のアドレスでブレークするためです。

あ。
CCPのロードアドレスも、当初はBC00Hだったのですが、少し後に下げて、BF00Hに変更しました。
できるだけトランジェントエリアを大きくするためです。

logfile nd80zlog\08041655.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
can't open D.vfd
>bp d2c1
>jp d233

A F  B C  D E  H L  A'F' B'C' D'E' H'L'  PC   SP   IX   IY  I  SZ H PNC
0044 0700 D4C7 C65C 0000 0000 0000 0000 D2C1 F800 0000 0000 FF 01000100
>bp c541
>rt@

BP D2C1[Enter]を実行してD2C1Hにブレークポイントを設定したあと、JP D233[Enter]で、CP/M互換DOSを起動すると、CCPをロード直後にブレークします。
そこであらためて、CCPのトランジェントプログラムのコール直前のアドレスC541Hにブレークポイントを設定します。
そしてそのあとRT@で、ブレークしたところから続きを再開します。

トランジェントプログラムをコールするところのアドレスも変更になっています。
[第181回]の時点ではC238Hでしたが、上のログではC541Hになっています。
下は新しいCCPプログラムの、トランジェントプログラムのコール部分のリストです。
[第181回]のリストと同じプログラムですが、アドレスが移動しています。

              ;
C52A 218000   	LD HL,DMABF
C52D 2262D6   	LD (DIRBFADRS),HL
C530 2206D6   	LD (DMABFADRS),HL
C533 3A05D6   	LD A,(CDRV_DIRWK)
C536 2104D6   	LD HL,CURDRV
C539 BE       	CP (HL)
C53A CA41C5   	JP Z,USRCMD722
C53D 5F       	LD E,A
C53E CD33C7   	CALL DRVNOSET
C541 CD0001   USRCMD722:CALL TRNS0
C544 3A05D6   USRCMD73:LD A,(CDRV_DIRWK)
C547 3204D6   	LD (CURDRV),A
C54A C32EBF   	JP CCPENTRY
              ;

説明があちこち飛んでしまいましたので、理解しにくいかもしれません。
ともかくそのように最終的にトランジェントプログラムのロード直後に(つまり、今回はMVFTST1C.COMを0100Hにロードした直後に)ブレークするように、
BP C541[Enter]
を実行してから
RT@[Enter]
で、ブレークしたところから実行を再開しました。

するとCP/M互換DOSにエントリして、
A>
が表示されましたから、まずはDIRコマンドでAドライブのディレクトリを表示させました。
ここでディレクトリを表示させたことに深い意味はありません。

そのあと、
MVFTST1C[Enter]を入力しました。


A>dir
A: F80      COM : HELL1    FOR : HELL1    REL : HELLO    FOR
A: HELLO    REL : HELL2    FOR : HELL2    REL : HELL3    FOR
A: HELL3    REL : M80      COM : MVFTST1  MAC : MVFTST1  REL
A: MVFTST1B MAC : MVFTST1B PRN : MVFTST1B REL : MVFTST1C MAC
A: MVFTST1C PRN : MVFTST1C REL : L80      COM : MVFTST1C COM
A: VFTST1   COM
A>mvftst1c

A F  B C  D E  H L  A'F' B'C' D'E' H'L'  PC   SP   IX   IY  I  SZ H PNC
0042 0001 D709 D604 0000 0000 0000 0000 C541 F800 0000 0000 FF 01000010
>dm@0100,017f
0100  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
0110  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
0120  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
0130  00 00 1A 29 0B FE 29 C4-9D 04 C3 40 0B 3E 01 32  ...)..)ト..テ@.>.2
0140  2F 3D C3 59 2B AF 32 2F-3D C3 59 2B AF 32 2D 3D  /=テY+ッ2/=テY+ッ2-=
0150  C3 59 2B CD 55 0B C2 47-2B 0C 0D CA 47 2B F5 CD  テY+ヘU.ツG+..ハG+.ヘ
0160  0E 0C C4 24 0C C2 3A 2B-7E F6 40 77 F1 FE 2C C0  ..ト$.ツ:+~.@w..,タ
0170  CD 55 0B C2 C1 04 C3 2C-2B 3E 01 32 2D 3D C9 3E  ヘU.ツチ.テ,+>.2-=ノ>
>0000 00C3 - 
リモート接続を終了しました
logfile closed at Sat Aug 04 17:02:05 2012

するとC541Hでブレークしました。
MVFTST1Cを0100Hにロードした直後のブレークですから、0100HからのメモリエリアをDMコマンドで確認してみれば、そこにロードされたマシン語コードが見えるはずです。

DM@0100,017F[Enter]
を実行しました。

むむむ?
なんだか様子が変です。
これは?
MVFTST1.COMのマシン語プログラムとは似ても似つかぬ代物です。

これは一体どうしたことでありましょうか?
追求はさらに続きます。
毎度のことながら、なかなかにつらい人生であります。

ワンボードマイコンでCP/Mを![第192回]
2012.8.8upload

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