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解析:その他 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
2)のLD HL,(37C1H)とかは、Z80でよく使われるコード領域節約テクニックの一つじゃないでしょうか。
コードに直すと、2AH,C1H,37Hになりますが、別の場所から途中のC1Hのアドレスへジャンプするようなコードになっているのではないかと思われます。そうすると、POP BC:SCFになるのですが、1バイト2AHを追加してHLに代入することで無効化しているのです。JRだと2バイト必要ですからROM全体だと数十バイトの節約に繋がります。
全くP6に関係ない話でスミマセン
Posted by Thunderbolt at 2014年05月26日 23:39
あー、なるほど。

と思ったのですが、今回はそのパターンではないようです。

この後に、HLを操作する命令が続くので、普通に37C1Hを読んでいるようです。

このパターンは、P6の場合はエラーコードを代入するルーチンでありますね。最初何の事か分からなかった記憶があります。


Posted by えすび at 2014年05月26日 23:50
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

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


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