2015年11月07日

151107_03_テクノウ3草案(能書き)

  最近、P6へのソフトウエア移植ばっかりやっていて、解析記事などがおろそかになっていました。テクノウ Vol.2(回路図篇)も発行してしまったので、次のテクノウvol.3をそろそろ作っていこうかと思います。

  テクノウvol.3をいきなり作っていくのは結構大変なので(挫折が見えている)、あんまりまとまらない感じでブログに書き溜めていき、それを編集するような格好にしたいと思います。

  過去に書いた内容など、重複した部分も出てきますがご容赦を。



posted by えすび at 15:56| Comment(0) | P6解析:その他 | このブログの読者になる | 更新情報をチェックする

2014年05月26日

SRのピギーバックROMについて

  ツイッターで話題になっていたのを調べました(^^;)


  初期の、というか大抵のmk2SR、66SRに搭載されているROMで、なぜか2階建てのROMがあります。
  親子亀みたいに、ROMの上にROMを実装しているものです(ピギーバックという)。

  mk2SR だと IC6、66SRだと IC9 です。


  なぜわざわざこういう事をしているかですが、どうも不具合対応のようです。
  ROMなのでプログラムが入っているワケですが、そのプログラムに致命的なバグがあったので、急遽EPROMを使って改修したのだと思います。


  ちゃんとバグなしの、普通のROMのmk2SR/66SRも存在するようです(うちのmk2SR/66SRは、両方とも親子亀でした)。


  バグありの方は、型番が HN613256 N63 で、バグなしの方は、HN613256 N95 です。
  N63とかN95とかいうのはマスク番号と呼ばれるもので、マスクROMの場合はROMのバージョン番号のようなものです。


  で、面白そうなので、どんなバグだったのかを調べてみました。


  そのままでは調べられないので、ちょっと加工します。

  これがその親子亀のROMです。見づらいですが2階建てです。

piggy1.jpg



  さらにソケットに挿して3階建てにします。そして、上のマスクROMからのみ出力がるように加工します。

piggy2.jpg



  後は通常通り、saver3で吸い出し、普通のROMと比較しました。


  修正された箇所は、音声合成のルーチンです(SYSROM2.64の0x4000〜)。
  FD周りが修正されたのかと思ったのですが、音声合成のルーチンが変更されています。

  比較した結果ですが、処理が増えている場所があり、その影響でアドレスがずれたりしていました。
  しかし、本質的には、5箇所のようです。


 1)66-BASIC と SR-BASIC の区別方法の修正(0x4016〜0x401C)
  音声合成ルーチンは、66-BASICでもSR-BASICでも、同じものが使われるようです。この際、どちらのBASICで動いているかの区別をしているような

のですが、その判別方法に問題があったようです。

  修正前は、アドレス0x0000のデータが0xC3ならばSR-BASICと判断してます。完全に間違いですが(^^;)...


 2)0x40D5〜0x40FFが0x00に変更されている
  修正前は何かのプログラムが入っています。

  CALL 0x0ADC とか、LD HL,(37C1H) とかあるので、どうもROMではない他のソフトのルーチンが入っているように思えます。
  CP/Mのプログラムかなぁ...


 3)何かのルーチンで分岐条件が一つ削除されている(0x42D5〜0x42D8)
  詳細はよく分かりません。


 4)0x43A8の後に処理が追加されている
  追加されている処理は、66-BASICの時のリード側のバンク切り替え処理です。

  SR-BASICでは、リード側のバンク切り替えは、ポート0x60〜0x67で行いますが、66-BASICでは、ポート0xF0、0xF1で行います。
  66-BASICでの、リードのバンク切り替え処理を追加しているみたいです。


 5)0x56B2〜0x56BFが0x00に変更されている。
  修正前は何かのプログラムが入っています。

  こっちは音声合成処理の一部のようなんですが、未使用なので上記4)の処理を追加するために削除されたようですね。



  多分...66-BASICでの音声合成のテストが不十分だったのか、工程的に後回しだったために、かなり後に発見されたバグのようですね...

posted by えすび at 22:18| Comment(2) | P6解析:その他 | このブログの読者になる | 更新情報をチェックする

2014年05月17日

mk2SRで66SRのメニュー画面を出す

  タイトル通りです(^^;)


  66SRとmk2SRのROM内容は、キャラクタROMやBASIC-ROMなど、全て同じです。

  じゃあ、という事で、mk2SR上で、66SRの起動メニューを表示させてみます。


・やり方

  1)SR-BASICを起動します(MODE=6)。
  2)mon コマンドでモニタに入ります。
  3)SA000 で、A000から以下のデータを入力します。

   FD 21 03 E2 DD 21 53 62 AF 3C C3 76 E6

  4)B でモニタを抜けて、EXEC&HA000 を実行します。


LD IY,0E203H
LD IX,06253H
XOR A
INC A
JP 0E607H ; ポート0x63=0xE2にして、JP 6253Hをする




  当然、66SRでmk2SRの起動メニューも出せます。

  1)SR-BASICを起動します(MODE=6)。
  2)mon コマンドでモニタに入ります。
  3)SA000 で、A000から以下のデータを入力します。

   FD 21 03 E2 DD 21 53 62 AF C3 76 E6

  4)B でモニタを抜けて、CLS:EXEC&HA000 を実行します。


LD IY,0E203H
LD IX,06253H
XOR A
JP 0E607H ; ポート0x63=0xE2にして、JP 6253Hをする



  一発ネタですね(^^;)

posted by えすび at 19:10| Comment(2) | P6解析:その他 | このブログの読者になる | 更新情報をチェックする

2014年04月12日

ROMカートリッジユーティリティ

  ROMカートリッジのユーティリティを作りました。

 ・ROMカートリッジからデータを読み出して、ディスクにセーブする。
 ・ディスクにセーブしたデータを読み出し、立ち上げる。

  が出来ます。


exrom.zip


  ただし、ROMカートリッジからデータを読み出すためには、P6の改造が一部必要になる場合があります。
  詳しくは同梱のマニュアルを参照して下さい。


  制御プログラム(BASIC)の方は手抜きのため、ファイル名などのチェックは行っていません。
  単純にBLOAD/BSAVEをしているだけです。



  BASICに返ってこないゲームなどは特に問題なく起動しますが、起動した後にBASICが起動するようなものは、BASICが起動してから不安定になる事があります(原因不明)。

  動作機種がmk2以降対応のため、初代機専用の画面モードを使用しているもの(ex:GHOST HUNTER)や、初代機専用のもの(ex:EXAS-BASICコンパイラ)は、うまく動作しません。


140412_01_exrom改造部分.JPG

  mk2に簡易版の改造回路を組み込んだ写真です。下の基板のキズが入っている箇所がパターンカットした部分です。

posted by えすび at 13:49| Comment(0) | P6解析:その他 | このブログの読者になる | 更新情報をチェックする

2014年04月09日

ROMカートリッジについて

  ROMカートリッジについてまとめました。結構知らないことがありました。


1.ROMカートリッジの種類
  プログラムの動き方から分類すると、以下の3つになります。

 1)本体BASICの起動時に、自動的にROM内のプログラムに移り、そのまま帰ってこないもの。ほとんどのROMカートリッジのゲームがこれに当たります。
 2)本体BASICの起動時に、ROM内の初期設定ルーチンだけが走り、BASICに戻ってくるもの。拡張BASICなどがこれに当たります。
 3)本体BASICの起動時には、ROM内のルーチンは全く通らないもの。EXAS-BASICコンパイラなどがこれに当たります。

 また、ROMには、初代PC-6001用、初代PC-6001+拡張BASIC用、mk2/66用、mk2SR/66SR用があります。

 基本的に、先発の機種対応のものは、後発の機種で動作させる事が可能です。
 しかし、特定の起動方法があったり、バグがあったりします(後述します)。

 以下、1)2)についてです。3)は起動時にMODEを適切に選択すれば、普通に使用できます。



2.初代PC-6001用カートリッジ

 本体BASIC起動時にROM内プログラムが走るROMの先頭には、以下の特定の情報が書かれています。

 0x4000=0x41("A")、0x4001=0x42("B")
 0x4002、0x4003 に書かれたアドレスをCALLします。

 例えば、0x4000〜のデータが、

 0x41、0x42、0x00、0x41、・・・

 となっている場合、BASIC起動時、CALL 0x4100 が実行されます。

 ゲームなどでは、そのままBASICに帰らずにプログラムが実行されますが、ツールなどの場合は、起動時の初期設定の後、RET 命令で、元のBASICに戻ります。

 カートリッジ内のプログラムからRETURNしたら、BASIC起動の続きを行います。”How Many Pages?”のページ設定やワークエリアの設定などが行われます。

 ROMカートリッジ内にRAMがある場合や、ROM/RAMカートリッジにROMを挿して使う場合は、RAMが32Kで起動します。



3.初代PC-6001用カートリッジをmk2/66/mk2SR/66SRで使用する

 初代PC-6001用カートリッジをmk2以降で使用した場合、以下のような動作になります。

 BASIC初期設定
 ↓
 RAMサイズの設定
 ↓
 ROM内ルーチンのチェック(0x4000、0x4001="AB"の時、CALL (4002H) )
 ↓
 ページ設定(”How Many Pages?”)
 ↓
 BASIC起動


 0x4000、0x4001="AB"になっている場合は、RETURNした後には、N60m/N66-BASICには戻りません。そのため、MODEを選択するメニュー表示がありません。

 デフォルトでは、RAMは16Kになります。RAMを32Kにしたい場合は、"2"キーを押したまま、リセットを押して再起動させます(mk2のマニュアルに記載があります)。

 エミュレータで実行する場合は、一度16Kで起動した後に、BASIC上で

 FOR I=0 TO 999:NEXT:EXEC 0

 と直接実行して、すぐに"2"キーを押しっぱなしにするといいでしょう。



4.初代PC-6001+拡張BASIC用カートリッジ

 拡張BASIC起動時にROM内プログラムが走るROMの先頭には、以下の特定の情報が書かれています。

 0x6000=0x41("A")、0x6001=0x42("B")
 0x6002、0x6003 に書かれたアドレスをCALLします。

 上記2.のは、アドレスが違うだけです。


 カートリッジ内のプログラムからRETURNしたら、BASIC起動の続きを行います。フロッピー関連の初期設定(フロッピーからの起動や”How Many Files?”など)、”How Many Pages?”のページ設定やワークエリアの設定などが行われます。

 ROMカートリッジ内にRAMがある場合や、ROM/RAMカートリッジにROMを挿して使う場合は、RAMが32Kで起動します。



5.初代PC-6001+拡張BASIC用カートリッジをmk2/66/mk2SR/66SRで使用する

 初代PC-6001+拡張BASIC用カートリッジをmk2以降で使用した場合、以下のような動作になります。

 BASIC初期設定
 ↓
 RAMサイズの設定
 ↓
 ROM内ルーチンのチェック1(0x4000、0x4001のチェック。ここでは"AB"ではないはず)
 ↓
 ROM内ルーチンのチェック2(0x6000、0x6001="AB"の時、CALL (6002H) )
 ↓
 フロッピー関連の初期設定
 ↓
 ページ設定(”How Many Pages?”)
 ↓
 BASIC起動


 0x6000、0x6001="AB"になっている場合は、RETURNした後には、N60m/N66-BASICには戻りません。そのため、MODEを選択するメニュー表示がありません。

 拡張BASICカートリッジの代わりに、N60m/N66-BASICの拡張BASIC部分を使用します。
 拡張BASICカートリッジとN60m/N66-BASICの拡張BASIC部分では、アドレスがずれているため、ROM内ルーチンを使っているものは使用できません。

 デフォルトでは、RAMは16Kになります。RAMを32Kにしたい場合は、"2"キーか"4"キーを押したまま、リセットを押して再起動させます。



6.mk2/66用カートリッジ

 本体BASIC起動時にROM内プログラムが走るROMの先頭には、以下の特定の情報が書かれています。

 0x4000=0x43("C")、0x4001=0x44("D")
 この時は、0x4002、0x4003 に書かれたアドレスをCALLします。

 0x6000=0x43("C")、0x6001=0x44("D")
 この時は、0x6002、0x6003 に書かれたアドレスをCALLします。


 ゲームなどでは、そのままBASICに帰らずにプログラムが実行されますが、ツールなどの場合は、起動時の初期設定の後、RET 命令で、元のBASIC初期設定に戻ります。

 戻ったら、フロッピーの初期設定の後、モード設定、ページ設定やワークエリアの設定などが行われます。

 モード設定(MODE1〜5)は、通常はメニュー画面が出ますが、ROM内ルーチンやフロッピー起動の時、メニューをスキップする事が可能です。

 0xFF4E に『MODE - 1』を書き込むと、RETURNした時にそのモードを選択した状態になって、BASICが起動します。


 例えば、ROMの0x4000〜

 0x43、0x44、0x04、0x40、0x3E、0x04、0x32、0x4E、0xFF、0xC9

 とした場合、MODE5で起動します。ただし、ページ設定は別に設定する必要があります。



7.mk2/66用カートリッジをmk2SR/66SRで使用する

 mk2/66用カートリッジをmk2SR/66SRで使用した場合、以下のような動作になります。

 SR-BASIC初期設定
 ↓
 ROM内ルーチンのチェック(0x4000、0x4001と0x6000、0x6001のチェック)
 ↓
 (※)SR-BASICのモード選択
 ↓
 N66-BASICの初期設定
 ↓
 ROM内ルーチンのチェック(0x4000、0x4001と0x6000、0x6001のチェック)
 ↓
 フロッピー関連の初期設定
 ↓
 モード選択(MODE1〜5)
 ↓
 ページ設定(”How Many Pages?”)
 ↓
 BASIC起動


 mk2/66用カートリッジなので、本来はSR-BASICのモード選択はスキップするべきなのですが、SR-BASICのバグによりモード選択画面が出てしまいます(上記※)。

 ※バグ内容:SR-BASICの0x1D9B〜で、(4000H)、(6000H)と"AB"、"CD"、の比較を行っているんですが、"CD"の方の比較を行っていません( RST 20Hが抜けている)。


 そのため、モード選択画面では、使用する1〜5のMODEを選択します。
 ROM内でモード設定を行っているもの(0xFF4Eに『MODE - 1』を書き込んでいるもの)に関しては、1〜5のどのMODEを選択しても、そのMODEになります(上書きされる)。



8.mk2SR/66SR用カートリッジ

 本体BASIC起動時にROM内プログラムが走るROMの先頭には、以下の特定の情報が書かれています。

 0x4000=0x45("E")、0x4001=0x46("F")
 この時は、0x4002、0x4003 に書かれたアドレスをCALLします。

 0x6000=0x45("E")、0x6001=0x46("F")
 この時は、0x6002、0x6003 に書かれたアドレスをCALLします。


 ゲームなどでは、そのままBASICに帰らずにプログラムが実行されますが、ツールなどの場合は、起動時の初期設定の後、RET 命令で、元のBASIC初期設定に戻ります。

 戻ったら、フロッピーの初期設定の後、SR-BASICモード設定、ページ設定やワークエリアの設定などが行われます。

 SR-BASICモード設定は、普通ではスキップする事ができません(BASICの初期設定の一部をROM内ルーチンに書くことで実現はできますが...)


posted by えすび at 19:16| Comment(0) | P6解析:その他 | このブログの読者になる | 更新情報をチェックする