2013年06月02日

タイマ割り込みの違い

  オフで話題になった件です。


  コナミのスクランブル(カートリッジ版)を実行させた場合、開始時に鳴る音楽のテンポが違うというものです。
  確かに、PC-6001初代機と、mk2ではテンポが違って、初代機に比べてmk2のテンポがかなり遅く感じます。

  BASIC-ROM の違いかとも思いましたが、エミュレータでは同じテンポで鳴ります(mk2と同じ、遅い方のテンポ)。
  FPGA版ではどうかと調べると、実機と同じように鳴りました。

  ただ、心当たりがないので、調べてみました。


  結論は、2ms タイマの割り込み間隔が違う(時がある)のが原因です。

  初代機で、スクランブルを動かした場合、通常 2ms 周期の割り込みタイマが 1ms 周期になります(多分、意図的に 1ms にしているんだと思います)、


  では、なぜこうなるか、ですが...

  実は、PC-6001初代機と、PC-6001mk2以降では、タイマOFF からタイマON にした直後の、最初の割り込みタイミングが違います。

2msタイマ


  mk2以降では、タイマON にした直後でも 2ms 後に割り込みが発生します。

  しかし、PC-6001初代機では、タイマON にした直後は、1ms 後に割り込みが発生します。
  回路のバグというか仕様というか...ディスクリート部品で回路を組んでいる関係上、簡略化した副作用です。


  スクランブルですが、割り込みルーチンは以下のようになっています。

 4AE0 PUSH AF
 4AE1 PUSH BC
 :
 4B1B LD A,03H
 4B1D OUT (0B0H),A
 4B1F DEC A
 4B20 OUT (0B0H),A
 4B22 EI
 4B23 POP AF
 4B24 RET

  割り込みの最後で、タイマON → OFF → ON として、タイマの再起動をしています。

  このため、大体1msの間隔で割り込みが入るようになっています。
 (実際には、割り込みルーチンの最後の方でタイマOFF/ON をしているため、もうちょっと長いです)


  mk2以降で同じようにするには、ポート0xF6 に、03H の代わりに 01H or 02H を出力すると、大体同じになるはずです(ソフトによります。スクランブルなら、02H ぐらいが適当なようです)。

posted by えすび at 15:10| Comment(6) | P6解析:CPU周り | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
なんと!そんな現象が起こっていたとは!
解析お見事です。感服致しました。
エミュレータでは常に2msでぐるぐる回してるだけなので
On/Offのタイミングに関係なく一定の間隔で割込みが発生するのです。
実装を見なおす必要がありますね。
貴重な情報をありがとうございました。
Posted by ゆみたろ at 2013年06月02日 22:12
 FPGA版は初代機は回路通りに実装、mk2の方はカスタムLSIなので、多分こうだろうなー、という回路を実装していました。

 実装の差異で、ちゃんとFPGA版は差異が出たようです。

 ...ただ、その違いは忘れていましたが(^^;
Posted by えすび at 2013年06月02日 22:26
お疲れ様です。解析ありがとうございました。

しかし影響範囲が大きそうなそうでもないような
面白い差異ですね。^^;

拡張RAMの件もありがとうございました。
パーツ買っていろいろやってみようと思います。
カートリッジコネクタの解決が一番大変な気がします。(笑
Posted by onda at 2013年06月03日 17:58
 割り込みの話は、割と影響がありそうです。

 積極的に 2ms割り込みを短く出来るので、やっているソフトは他にもありそうです。

Posted by えすび at 2013年06月03日 18:16
やっとカラクリが理解出来ました!
タイマ割込みはパルスの立ち上がり時に割込み発生となりますが
割込みパルス=カウンタ出力の初期値が L なので
1周期の半分に到達した所でパルスが立ち上がってしまうということですね。
インバータを入れて反転させておくのが正しいのでしょうが
普通は実害がないので省略しちゃったのでしょう。
回路図見てただけでは全く気が付きませんでした。

エミュレータに実装して実機と比較してみたらピッタリ!
mk2も試してみましたが,こちらもちょっと短くなるようです。
フロッガーを例に調べてみた結果,初回は88%くらいでした。
ただ非常に中途半端な数字なので別要因かもしれません。

Posted by ゆみたろ at 2013年06月20日 22:44
↑そーゆー事です。

 カウンタで分周された出力は、リセット解除後、L→H→L→H… となりますが、カウンタが満了するのは、H→L の時なので、立ち下がりが正解です。

 通常は、タイマON/OFF を頻繁に変更する事はないので、大丈夫だと考えたんでしょう(もしくは気付いてない)。
Posted by えすび at 2013年06月20日 23:06
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

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


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