某ハドソン系ゲームの解析

通常、キーがおされたとき、Sub CPUから、CPUへ、キー割り込みがかかってくるので、CPUが割り込みルーチンで、Sub CPUから、キーコードを受け取る。


しかし、割り込み禁止期間中は、割り込みが使えないので、CPUが、Sub CPUに、押されてないか聞きに行くことが出来るらしい。


押されていると、まず、発生するはずだった割り込みの、ベクタアドレスを返し、次にキーコードを返してくる。


ということなんだけど、
制御用のビット操作が、ちょっとややこしいな。。(汗)

最初は、b5 が0→1になるのを待ち、
次は、b5と、b3 がともに 0->1 に鳴るのをまつらしい。


ちなみに、CPUと、Sub CPUは、以下のようにしてつながっている。

CPU ------- 8255 --------- Sub CPU

  1. 8255にデータが来るまで待つ
  2. Sub CPU側から、データ(ベクタアドレス)を受け取る
  3. Sub CPUへ受信許可を申請する
  4. 8255にデータが来るまで待つ
  5. Sub CPUへ受信準備完了を知らせる
  6. Sub CPUから、キーコードを受け取る

というかんじなのかな?


聞くところによると、単純にビットを操作して、高速で受け渡しをしてもだめらしい。。
何回か、INPさせて、もったいぶらせてから、このタイミングというところで、ビット操作しないと行けないらしいですね。。(´・ω・`)

; -----------------------------------------------------------------
;       CPU <-  SUB CPU データ受信
; -----------------------------------------------------------------
        ; ----------- 8255 にデータがくるまで待つ -----------
Z0739:  IN      A,(092H)        ;35B3   DB 92           ロ.受信許可?
        AND     020H            ;35B5   E6 20           . 
        JR      Z,Z0739         ;35B7   28 FA           (. 8255 にデータが来るまで待つ
        
        IN      A,(090H)        ;35B9   DB 90           ロ. SUB CPUからデータ受けとり
        LD      B,A             ;35BB   47              G  (CODE=16h(ゲーム用割り込み、02h 一般キー割り込み) 入るかも)

        ; ----------- 8049への受信許可申請 --------------------
        ; ----------  (PORT Cの  B6 をリセット
        LD      A,0CH           ;35BC   3E 0C           >.
        OUT     (093H),A        ;35BE   D3 93           モ.受信許可申請

        ; ----------- 8255 にデータがくるまで待つ -----------
Z0745:  IN      A,(092H)        ;35C0   DB 92           ロ.
        XOR     028H            ;35C2   EE 28           .(
        AND     028H            ;35C4   E6 28           .(
        JR      NZ,Z0745        ;35C6   20 F8            . b5 b3 が両方1になるまで待つ
        
        ; ---------- 受信準備完了 -----------------------
        ; ---------- PORT C の B6をセット RD?
        LD      A,0DH           ;35C8   3E 0D           >.受信準備完了
        OUT     (093H),A        ;35CA   D3 93           モ.

        IN      A,(090H)        ;35CC   DB 90           ロ. SUB CPUから、キーデータを受け取る
        LD      C,A             ;35CE   4F              O
        LD      A,B             ;35CF   78              x
        CP      02H             ;35D0   FE 02           .. CODE 02H (一般のキー割り込み)でなければ、ret
        RET     NZ              ;35D2   C0              タ
        
        LD      A,C             ;35D3   79              y  CODE 02H (一般のキー割り込み)なら、キーデータを格納
        LD      (Z0744),A       ;35D4   32 12 37        2.7
        RET                     ;35D7   C9              ノ