So-net無料ブログ作成
English Version

3チップ構成Pic24CPMマイコン(その4)ZSIDで小文字のシンボルを使う方法その2 [Z80]

 「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>



 それでは解析過程の概要を簡単に記録しておきます。

  1. 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



  1. コマンド入力処理
     下記がコマンド入力内容を大文字変換しているところで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



  1. シンボル処理
     次にシンボル処理の箇所はシンボル入力時に使う'.'(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



  1. パッチ適用箇所
     上記の'.'と'@'の場合にコールされている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] [ 前へ ] 連載記事 [ 次へ ]

nice!(1)  コメント(1) 

nice! 1

コメント 1

skyriver

 ZSIDのdump表示はヘキサ表示の下にASCIIが表示されるのでデータとの対応は取りやすいのですが表示する行が2倍になるので賛否両論(DDTのように1行表示を好む人が多い?)かと思います。
 ZSIDのdump表示を1行化するパッチを見つけたので貼っておきます。

****************************************************************

PATCH TO MAKE ZSID.COM THE SAME DUMP DISPLAY AS DDT AND SID

RESEARCH BY DATAFACS SYSTEMS, INC.

****************************************************************


DO THE FOLLOWING:

ZSID ZSID.COM

S125F 5F AF <--- PUT THIS IN HIT RETURN
1260 ?? . ""

S12C0 CD 00 <---- PUT THIS IN HIT RETURN
12C1 ?? 00 ""
12C2 ?? 00 ""
12C3 06 ?? <---- LEAVE THIS ALONE
12C4 06 01 <---- PUT THIS IN HIT RETURN
12C5 ?? . ""

* S12E1 CD 00 <---- PUT THIS IN HIT RETURN
* 12E2 ?? 00 ""
* 12E3 ?? 00 ""
* 12E4 CD 00 ""
* 12E5 ?? 00 ""
* 12E6 ?? 00 ""
12E7 13 . <-- **** DONE ****

CONTROL C OR G0 ZERO AND SAVE THE PROPER AMOUNT


IF YOU DON'T TRUST THIS SAVE IT AS A DIFFERENT NAME FIRST

******* HAVE FUN AND ENJOY ******

* CALLS THE SAME ADDRESS

-----------------------------------------------------------------

Addendum by Bob Fisher - De Paul University

The above patch MAY work, but it depends on what address your cpm
runs at. Try instead the following:

S125F
125F 5F AF (SAME AS ABOVE)
1260 ?? .

S12C0 CD 18 (PUT IN A RELATIVE JUMP)
12C1 ?? 01
12C2 ?? 00 (THIS DOESN'T MATTER)
12C3 06 06 (DON'T CHANGE)
12C4 06 01
12C5 ?? .

S12E1
12E1 CD 18 (ANOTHER RELATIVE JUMP)
12E2 ?? 04
12E3 ?? ??
12E4 CD 18 (YET ANOTHER RELATIVE JUMP)
12E5 ?? 01
12E6 ?? .

When ZSID relocates itself an offset is added to bytes 12c2, 12e3, and
12e6. The previous patch left this offset to be interpreted as an opcode.
The result can be benign or disastrous depending on the size of your
cpm.
by skyriver (2018-07-23 22:37) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。