「
3チップ構成Pic24CPMマイコン(その3)ZSIDで小文字のシンボルを使う方法」の記事でCP/M上で
HI-TECH Cを使い ZSID でシンボリックデバッグする上で ZSID がコマンド内の小文字のシンボルを解釈できないという問題があることを書きました。
その解決方法として ZSID 内部のコマンド入力部の大文字変換する処理を無効にするパッチを提案しました。
しかし、
前回の記事の最後に書いたようにコマンドを小文字で入力するとエラーになるという制限がありました。その他にもヘキサ入力時も大文字にする必要がある等、色々使い勝手がよくないのでもう少しきちんと対処することにしました。
結果から先に書くと下記のパッチ(2ヶ所の書換え)でコマンド入力のシンボル部のみ大文字変換しないようにすることに成功しました (^^)/
ZSIDへの小文字シンボル対応パッチ適用手順
a>ddt zsid.com
DDT VERS 2.2
NEXT PC
2900 0100
-s1b6f
1B6F CD
1B70 90 9c
1B71 18 .
-s1b9a
1B9A CD
1B9B 90 9c
1B9C 18 .
-g0
a>save 40 zsidd.com
a>b:
b>a:zsidd hello.com hello.sym
ZSID VERS 1.4
SYMBOLS
NEXT PC END
1100 0100 C72E
#l._main
_main:
013D CALL 0EAA .ncsv
0140 NOP
0141 NOP
0142 LD HL,0EBF
0145 PUSH HL
0146 CALL 0151 ._printf
0149 LD HL,0002
014C ADD HL,SP
014D LD SP,HL
014E JP 0EA2 .cret
_printf:
0151 CALL 0E96 .csv
#g0
b>
|
それでは解析過程の概要を簡単に記録しておきます。
- ZSIDの自己コード移動処理
ZSIDはCP/M上で動作する実行ファイルをディバッグするので初期化処理で自身のコードをメモリの最後の方に移動しています。
今回使用したCP/Mのメモリサイズは64KBですが、この場合、ZSID自身の0200H以降をA800Hへコピーしていました。
なので0200H以降のコードについてはディスアセンブルでのアドレスに+A600H(=A800H-0200H)加えたものが実行アドレスになります。
また、「CALL」や「JP」などのニーモニック内のアドレスから0200H引いたアドレスがディスアセンブルリスト上のコードアドレスとなり、少々ヤヤコシイ状態になりますw
この辺りは ZSID で ZSID 自身をステップ動作等させて確かめましたw
ZSIDのコード移動処理
0155 210002 LD HL,T0200
0158 78 A0158: LD A,B
0159 B1 OR C
015A CA6501 JP Z,A0165
015D 0B DEC BC
015E 7E LD A,(HL)
015F 12 A015F: LD (DE),A
0160 13 INC DE
0161 23 INC HL
0162 C35801 JP A0158
|
- コマンド入力処理
下記がコマンド入力内容を大文字変換しているところで1A90Hがコマンド入力文字を1文字取得する処理のエントリです。
前回の記事では「AND 05FH」部分の05FHを0FFHに変更することで大文字変変換を無効にしました。
先頭の"CALL A189C"は直下の1A9Cをコールしています(0200H分のオフセットが付くので)
このことからA189Cをコールすれば大文字変換無しのコマンド1文字入力に使えそうです。
ZSIDのコマンド入力処理
1A90 CD9C18 CALL A189C
1A93 FE7F CP 07FH
1A95 C8 A1A95: RET Z
1A96 FE61 CP 061H
1A98 D8 A1A98: RET C
1A99 E65F AND 05FH
1A9B C9 RET
;
1A9C E5 PUSH HL
1A9D 216D21 A1A9D: LD HL,D216D
1AA0 7E LD A,(HL)
1AA1 B7 OR A
1AA2 3E0D LD A,00DH
1AA4 CAB018 JP Z,A18B0
1AA7 35 DEC (HL)
1AA8 2A6A21 LD HL,(D216A)
1AAB 7E A1AAB: LD A,(HL)
1AAC 23 INC HL
1AAD 226A21 LD (D216A),HL
1AB0 E1 POP HL
1AB1 C9 RET
|
- シンボル処理
次にシンボル処理の箇所はシンボル入力時に使う'.'(02EH)記号のコンペア命令を目印に探したところ下記の部分を見つけました。
すぐ下にシンボル表現で使用するもう一つの記号'@'(040H)の比較部分もあるのでシンボル処理である可能大です。
試しに'.'を'''に変更するパッチを入れたところ、'''でシンボル参照できたのでシンボル処理であることが確定です。
ZSIDのシンボル処理
1BD3 EB EX DE,HL
1BD4 210000 LD HL,00000H
1BD7 FE2E CP 02EH ;シンボル記号'.'
1BD9 CA6E19 JP Z,A196E
1BDC FE40 CP 040H ;シンボル記号'@'
1BDE C2EB19 JP NZ,A19EB
1BE1 CD6E19 CALL A196E
1BE4 E5 PUSH HL
1BE5 EB EX DE,HL
1BE6 5E LD E,(HL)
1BE7 23 INC HL
1BE8 56 LD D,(HL)
1BE9 E1 POP HL
1BEA C9 RET
|
- パッチ適用箇所
上記の'.'と'@'の場合にコールされている1B6EH(0200Hオフセットが掛かる)がコマンド内のシンボル文字列を実際の値に変換する処理ということになります。
コマンド文字入力(1890Hをコール)は2ヶ所あり、これを189CHの大文字変換無しの処理をコールするように変更すればシンボル処理だけ大文字変換が掛からず、小文字のシンボルも使えるということになります。
ZSIDのコマンド内のシンボル文字列処理
1B6E D5 PUSH DE
1B6F CD9018 CALL A1890 ;change to 189CH
1B72 2AB221 LD HL,(D21B2)
1B75 F5 PUSH AF
1B76 4E LD C,(HL)
1B77 79 LD A,C
1B78 FE10 CP 010H
1B7A D25D18 JP NC,A185D
1B7D F1 A1B7D: POP AF
1B7E EB EX DE,HL
1B7F D5 PUSH DE
1B80 F5 PUSH AF
1B81 2A6A21 LD HL,(D216A)
1B84 E5 PUSH HL
1B85 2A6C21 LD HL,(D216C)
1B88 E5 PUSH HL
1B89 EB EX DE,HL
1B8A 0C INC C
1B8B CD4519 A1B8B: CALL A1945
1B8E CAA019 JP Z,A19A0
1B91 0D A1B91: DEC C
1B92 CABA19 JP Z,A19BA
1B95 2B DEC HL
1B96 BE CP (HL)
1B97 C2BA19 JP NZ,A19BA
1B9A CD9018 CALL A1890 ;change to 189CH
1B9D C38B19 JP A198B
|
[TOP] [ 前へ ] 連載記事
[ 次へ ]