2012年02月08日

DOORDOORの改造

 DOORDOOR ですが、PC-6001用、mk2用とも、CMT の加速モードが使用できません。

 DOORDOOR では、メインプログラムを読むためのローダが、音楽も一緒に鳴らしています。
 この音楽を鳴らすサブルーチンが格納されている場所が、実はメインプログラムと重なっています。

 通常のロード時には、音楽が終了した後でその場所にメインプログラムが上書きされるため、問題はありません。

 しかし、CMT の加速モードでは、音楽が終了する前にメインプログラムで上書きされ、結果としてローダが暴走する事になります。


 DOORDOOR のロード時間が長いためにあまり遊ばないのももったいないので、ローダを改造して加速モードでも動作できるようにする方法を以下に示します。


DOORDOORの改造



 単純に音楽ルーチンに飛ばないようにしているので、ロード中は音楽が鳴りません。


この記事へのコメント
いろいろ参考になる情報ありがとうございます。

DOOR DOOR mkIIが起動しないとご報告しましたが、実施したのはREAD ACC OFFの状態です。
にわか知識で作ったテープイメージなんで、あまり出来に自信が持てませんが、とりあえず、いままでPC6001VW3では動いていました。
事象としては、ブルーの"D"が表示されて止まります。

ACCの問題ではないので、BGMのルーチンをスキップする改造(mkII版)もやってみましたが、これでもうまくいきませんでした。この改造イメージは、PC6001VW3で起動できることは確認しています。
※この改造は、PC6001VWで高速ロードが使えるだけでも、便利です。ありがとうございます。

たとえば、P6DatRecでイメージを作る際、BASIC部分とマシン語部分の間に普通にwavからp6ファイルを作るとごみが入るとか、DOOR DOOR mkIIのイメージを作るのは少々独特ですね。
その辺注意点があるのでしょうか?

また、PC-6601のBIOSでの起動も1度試みてみましたが、メニュー画面が表示されませんでした。(;_;
こちらは、今のところ、mkIIで遊んでいるので問題なしです。

PC-6601対応は、気長に待たせていただきます。
Posted by aliceteabreak at 2012年02月08日 22:18
 >aliceteabreakさん

 うーん、うちのドアドアはちゃんと動いているんだけどなぁ...

 wav から p6 に変換する時には、一度にせずに分割した方がいいようです。

 ドアドアだと、ファイルが2つ分かれているので、wav レベルでファイルを2つに分けて、それぞれを p6 に変換して、それを繋ぎ合わせるといいかと思います。

 ただし、この時にゴミが入ったりするので、それを取り除く必要があります。
 特にドアドアの場合は、2本目のファイルの先頭にヘッダがないため、1バイトでもずれると動作しません。

 ちなみに、ドアドアmk2の場合だと、BASIC の終わり〜メインプログラムの間は、

00001820: 18ff dd40 18ff 18ff cdd6 40fb c920 0000
00001830: 0000 0000 0000 0000 0000 0000 6000 5a00
00001840: fa00 00aa 00aa 0f00 aa00 aa50 005f 00ff

 です。BASIC の終わりが 0x00 が10個で、メインプログラムの始まりが、0x60 0x00 0x5a 0x00 ... です。

Posted by えすび at 2012年02月08日 22:57
 >aliceteabreakさん

 あ、そういえば、高速改造をしなくても、PC-6001VW で『HighSpeed TapeReading』を ON にしても動くと思うんですが。

 また、マスターテープからならば、A面とB面の両方から P6 ファイルを作って、内容を比較するといいかも知れません。
Posted by えすび at 2012年02月08日 23:03
 >aliceteabreakさん

 書き忘れです。

 PC-6601 の方は、こちらでも確認しましたが動きませんね。
 多分、ドライブ数=0、という情報を与えないとダメなようです。


 無責任な事を書いてすみませんでした。

Posted by えすび at 2012年02月08日 23:12
自己レス。

マスターテープのB面は、P6用でした。内容比較できないですね...
Posted by えすび at 2012年02月08日 23:44
> ちなみに、ドアドアmk2の場合だと、BASIC の終わり〜メインプログラムの間は、
>
> 00001820: 18ff dd40 18ff 18ff cdd6 40fb c920 0000
> 00001830: 0000 0000 0000 0000 0000 0000 6000 5a00
> 00001840: fa00 00aa 00aa 0f00 aa00 aa50 005f 00ff
>
> です。BASIC の終わりが 0x00 が10個で、メインプログラムの始まりが、0x60 0x00 0x5a 0x00 ... です。

... c920 <0x00が10個> 6000 ... でよろしいのですよね。
※提示頂いたダンプは、14個になっているようですが。
これは以前はまったところなので、大丈夫です。
0x00の数がかわるとそもそもロード時の画像も崩れますよね。
今回の事象は画像が崩れることはないです。

ちなみにイメージ末尾は、

00011730: 00 FE FC 00 00 00 00

でよいのでしょうか?

後、PC6001VWで通常イメージでも高速ロードできるのでは?とのご指摘ですが、確かに普通にロードできました。
以前は高確率で失敗していたのに・・・ PC6001VWのバージョンの問題なのか??? 気のせいだったのか???
Posted by aliceteabreak at 2012年02月10日 00:56
 >aliceteabreak さん

 00 は10個です(違うファイルを貼り付けたみたいです)。

00001820: 18ff dd40 18ff 18ff cdd6 40fb c920 0000
00001830: 0000 0000 0000 0000 6000 5a00 fa00 00aa
00001840: 00aa 0f00 aa00 aa50 005f 00ff 0000 5b00

 こっちが正解です。


 ファイルの最後は、

00011720: 0fef 0faa 00af 0ffe fcaa 00ef cfef cfaa
00011730: 00fe fc00 0000 0000 0000

 です。後ろの1バイトに関しては、ゴミでしょう(削除しても変わりません)。




Posted by えすび at 2012年02月10日 08:21
 >aliceteabreakさん

 ドアドアmk2 の件ですが、多分以下の箇所で問題が起こっていると思います。

 ローダのBASIC と メインプログラムを合わせた p6 のファイルで、ファイルの先頭から60512バイト目辺りからです。


0000ec60: 3afb 90d3 063e 93d3 093e f428 80e6 92db
0000ec70: fa28 08e6 92db 93d3 083e 6fa7 32ff 3ec9


 この辺りのデータが化けていると思われます。



 上記の部分ですが、サブCPU に対して1バイト出力するプログラムです(p6 ファイル上では、ローダの関係で、逆から格納されています)。

 ちなみに、この箇所はPC-6001 のBASIC-ROM の 0x0E8F〜 と全く同じです。


 で、PC-6001VW では、8255のモード2のエミュレートを厳密さに行っていないようなので(厳密に行う必要もない)、暴走しないようです。


 ここじゃなかったら...どこだろ?
Posted by えすび at 2012年02月10日 12:58
 >aliceteabreakさん

 上記の簡単な(?)確認方法です。

 PC-6001VW を起動。起動して、ALT+F6 でモニタモードに入ります。

 モニタモードで、

b pc 0x7ab8

 でブレークポイントを設定して、

g

 で、エミュレータに戻り、その後ドアドアをCLOAD、RUN し、面を選んでメインプログラムをロードさせます。

 ロードが完了すると、自動的にモニタに戻るので、

 u

 で、0x7ab8 からの内容をディスアセンブルします。

 この中で、

7ABD 3E08 LD A,08H
7ABF D393 OUT (93H),A

7ACD 3E09 LD A,09H
7ACF D393 OUT (93H),A

 のどちらが化けているのではないかと思います。


 私の予想が当たっているのなら、ですが。
Posted by えすび at 2012年02月10日 13:15
えすびさん

いろいろ情報提供ありがとうございます。

ブレイクポイントを0x7ab8にしてもモニタモードに戻らないので、ブレイクポイントまで処理がいっていないように思います。

ちなみに該当のアドレス0x7ABD,7ABF,7ACD,7ACFは
7ABD 111110 LD DE,1011H
7ACD 40 LD B,B
7ACF 00 NOP

ご提示頂いた内容と相当ちがうのでどこかのアドレスからずれているかもしれまん。

また、ブレイクポイントまで行かないので、ブレイクポイントを変えてみました。
0x7716にするとPC-6001Fで停止するポイントと同じ状況(ブルーの"D"が表示されて止まる状態です)が再現できました。

ちなみにこんな感じです。
7716#1 C31277 JP 7712H
7719 2A475F LD HL,(5F47H)
771C 11CB00 LD DE,00CBH
771F 19 ADD HL,DE
7720 7E LD A,(HL)
7721 FEE8 CP E8H
7723 C2C877 JP NZ,77C8H
7726 23 INC HL
7727 23 INC HL
7728 7E LD A,(HL)
7729 FEA8 CP A8H
772B 200B JR NZ,7738H
772D 11E5FE LD DE,FEE5H
7730 19 ADD HL,DE
7731 EB EX DE,HL
7732 21B97E LD HL,7EB9H

何かここで止まる理由はあるのでしょか?
Posted by aliceteabreak at 2012年02月11日 12:18
 >aliceteabreakさん

 ドアドアmk2ですが、バージョンが複数存在しています(SR対応版とか呼ばれているバージョン)。


 私のがどちらか調べた事はないんですが、aliceteabreak さんの持っているバージョンと違うようです。

 アドレスなどが全然違うんですが、コンパイルしてる元ファイルは殆ど変わっていないようで、挙げられたルーチンがある事も確認しました。


 ちなみに、aliceteabreak さんがブレークポイントで引っ掛けた所は、時間待ちのルーチンです。


 私が持っているドアドアの起動後の所は以下の通りです。


 :
 :
9772 23 INC HL
9773 0C INC C
9774 D9 EXX
9775 210030 LD HL,3000H
9778 CDE289 CALL 89E2H  ←時間待ち
977B CD0A7B CALL 7B0AH  ←ゲームキー入力検査
977E D9 EXX
 :
 :

時間待ちルーチン
89E2 2B DEC HL
89E3 7D LD A,L
89E4 B4 OR H
89E5 C8 RET Z
89E6 C3E289 JP 89E2H  ←ブレークポイント


ゲームキー入力検査
7B0A CDB87A CALL 7AB8H


7AB8 3EFF LD A,FFH
7ABA 32A76F LD (6FA7H),A
7ABD 3E08 LD A,08H    ←
7ABF D393 OUT (93H),A   ←
7AC1 DB92 IN A.(92H)
7AC3 E608 AND 08H
7AC5 28FA JR Z,7AC1H
7AC7 DB92 IN A.(92H)
7AC9 E680 AND 80H
7ACB 28F4 JR Z,7AC1H
7ACD 3E09 LD A,09H    ←
7ACF D393 OUT (93H),A   ←
7AD1 3E06 LD A,06H
7AD3 D390 OUT (90H),A
7AD5 FB EI





 ここの『 89E6 番地』が、aliceteabreak さんがブレークポイントで引っ掛けた『 7716 番地』に相当します。

 問題を起こしている箇所は、多分ゲームキー入力検査のルーチンだと思いますので、その箇所を探します。


1)0x7716 にブレークポイントを設定する。

 b pc 0x7716

2)通常通り、CLOAD、RUN、してプログラムを読み込ませる。

3)ブレークポイントで止まるので、その時の(SP) の値を読む。
  [REGISTERS] の右の方のカッコが付いている方です。

4)(SP) の値のアドレスをディスアセンブルする。
  上の場合だと (SP):7B,97 となっているはず。よって、0x977B からディスアセンブル(u 0x977B)

5)4)の一番最初に実行されている命令が CALL のはずなので、その先の番地をディスアセンブルする。
  上の場合だと、

  977B CD0A7B CALL 7B0AH
     :

  となっているので、0x7B0AH からディスアセンブル(u 0x7B0A)

6)5)の一番最初に実行されている命令が CALL のはずなので、その先の番地をディスアセンブルする。
  上の場合だと、

  7B0A CDB87A CALL 7AB8H
     :

  となっているので、0x7B0AH からディスアセンブル(u 0x7B0A)

7)6)の結果を上の場合(7AB8〜7AD5)と比較する(0x7ABA は無視)。

  多分、矢印が付いている箇所が化けているんだと思います。




  場所が特定できたら、そのアドレスに書き込み時のブレークポイントを設定して、テープカウンタの値から、p6 のファイルの場所が特定できます。

  例えば、0x7ACD のアドレスがを探したい場合は、

  b write 0x7ACD

  として、最初からCLOAD、RUN して、止まった時のテープカウンタを見ます。



  これで解決するといいですねー。


Posted by えすび at 2012年02月11日 15:11
えすびさん

長々付き合って頂いて申し訳ございません。
それっぽいところをルーチンを見つけたのですが、特に化けていることはないようです。
確かに、えすびさんがお持ちのイメージとは違うようで番地は全然違います。

P6VW>u 0x9b73
9B73 CD819B CALL 9B81H
9B76 FE16 CP 16H
9B78 20F9 JR NZ,9B73H
9B7A CD819B CALL 9B81H
9B7D 323E5F LD (5F3EH),A
9B80 C9 RET
9B81 3E08 LD A,08H
9B83 D393 OUT (93H),A
9B85 DB92 IN A,(92H)
9B87 E608 AND 08H
9B89 28FA JR Z,9B85H
9B8B DB92 IN A,(92H)
9B8D E680 AND 80H
9B8F 28F4 JR Z,9B85H
9B91 3E09 LD A,09H
9B93 D393 OUT (93H),A
P6VW>u
9B95 3E06 LD A,06H
9B97 D390 OUT (90H),A
9B99 3E0C LD A,0CH
9B9B D393 OUT (93H),A
9B9D DB92 IN A,(92H)
9B9F E608 AND 08H
9BA1 28FA JR Z,9B9DH
9BA3 DB92 IN A,(92H)
9BA5 E620 AND 20H
9BA7 28F4 JR Z,9B9DH
9BA9 3E0D LD A,0DH
9BAB D393 OUT (93H),A
9BAD DB90 IN A,(90H)
9BAF C9 RET
9BB0 3E07 LD A,07H
9BB2 D3A0 OUT (A0H),A
Posted by aliceteabreak at 2012年02月11日 16:23
 >aliceteabreakさん

 上記の手順で、3)を実行した結果、つまり(SP) のアドレスで指している箇所の内容が、

 CD739B CALL 9B73H

 という認識で合っているでしょうか?


Posted by えすび at 2012年02月11日 18:06
>上記の手順で、3)を実行した結果、つまり(SP) のアドレスで指している箇所の内容が、
>
> CD739B CALL 9B73H
>
> という認識で合っているでしょうか?

違っています。

P6VW> b pc 0x7716

とすると、(SP)は、45,97なので、

P6VW>u 0x9745
9745 CDD99B CALL 9BD9H

となっています。
Posted by aliceteabreak at 2012年02月12日 10:48
 >aliceteabreakさん

 すみません。

 0x9bd9 以降のルーチンはどんな感じでしょう?

 多分、スペースキー、JOYSTICKのトリガを押したかどうかの判断ルーチンだと思うんですが。


 また、挙げられている 0x9b73 や 0x9b81 は、どこから呼ばれているか分かりませんか?

 お手数ですが、よろしくお願いします。
Posted by えすび at 2012年02月12日 12:03
0x9745以降のルーチンとCALLされているルーチンは以下の通りです。よろしくお願いします。

9745 CDD99B CALL 9BD9H
9748 D9 EXX
9749 CD469E CALL 9E46H
974C 23 INC HL
974D 0C INC C
974E D9 EXX
974F 210030 LD HL,3000H
9752 CD1277 CALL 7712H
9755 CDD99B CALL 9BD9H
9758 D9 EXX
9759 3A355F LD A,(5F35H)
975C 3D DEC A
975D 20D7 JR NZ,9736H
975F CDFF9D CALL 9DFFH
9762 D9 EXX
9763 210030 LD HL,3000H

9B73 CD819B CALL 9B81H
9B76 FE16 CP 16H
9B78 20F9 JR NZ,9B73H
9B7A CD819B CALL 9B81H
9B7D 323E5F LD (5F3EH),A
9B80 C9 RET

9B81 3E08 LD A,08H
9B83 D393 OUT (93H),A
9B85 DB92 IN A,(92H)
9B87 E608 AND 08H
9B89 28FA JR Z,9B85H
9B8B DB92 IN A,(92H)
9B8D E680 AND 80H
9B8F 28F4 JR Z,9B85H
9B91 3E09 LD A,09H
9B93 D393 OUT (93H),A
9B95 3E06 LD A,06H
9B97 D390 OUT (90H),A
9B99 3E0C LD A,0CH
9B9B D393 OUT (93H),A
9B9D DB92 IN A,(92H)
9B9F E608 AND 08H
9BA1 28FA JR Z,9B9DH
9BA3 DB92 IN A,(92H)
9BA5 E620 AND 20H
9BA7 28F4 JR Z,9B9DH
9BA9 3E0D LD A,0DH
9BAB D393 OUT (93H),A
9BAD DB90 IN A,(90H)
9BAF C9 RET

9BB0 3E07 LD A,07H
9BB2 D3A0 OUT (A0H),A
9BB4 C5 PUSH BC
9BB5 DBA2 IN A,(A2H)
9BB7 4F LD C,A
9BB8 3E80 LD A,80H
9BBA B1 OR C
9BBB D3A1 OUT (A1H),A
9BBD 3E0F LD A,0FH
9BBF D3A0 OUT (A0H),A
9BC1 3EC0 LD A,C0H
9BC3 D3A1 OUT (A1H),A
9BC5 3E0E LD A,0EH
9BC7 D3A0 OUT (A0H),A
9BC9 DBA2 IN A,(A2H)
9BCB 323E5F LD (5F3EH),A
9BCE 47 LD B,A
9BCF 3E07 LD A,07H
9BD1 D3A0 OUT (A0H),A
9BD3 79 LD A,C
9BD4 D3A1 OUT (A1H),A
9BD6 78 LD A,B
9BD7 C1 POP BC
9BD8 C9 RET

9BD9 CD739B CALL 9B73H
9BDC E680 AND 80H
9BDE 2808 JR Z,9BE8H
9BE0 AF XOR A
9BE1 323D5F LD (5F3DH),A
9BE4 E1 POP HL
9BE5 C3B955 JP 55B9H
9BE8 CDB09B CALL 9BB0H
9BEB E610 AND 10H
9BED C0 RET NZ
Posted by aliceteabreak at 2012年02月12日 14:53
 >aliceteabreakさん

 お手数お掛けしています。

 ざっと見て問題なさそうです。こちらのバージョンと大体同じです。
 (キー検出ルーチンだけは全然違いますが)


 すみませんが、リリース(8)の方も試してみて下さい。

 止まっているアドレスが判明すれば、かなり状況が分かると思いますので。

 よろしくお願いします。




Posted by えすび at 2012年02月12日 17:32
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。