the cutting room mirror

P-47 Aces

This page contains no introduction.
What makes this game notable or what is it about? Are you a bad enough dude to save this article?

Sound Driver#

Programmer Credit#

A small credit for the sound driver programmer can be seen at 0x98 in p47-21.bin:

SOUND DRIVER VERSION 1.04 for MEGA System 32
Programmed by N.M.K.Co.,Ltd. K.Hideya
1994.11.22 (TUE)

Uncompiled Source Code#

Two fragments for a sound driver were included in this game and both of them are in p47-21.bin. Both of these were written in Z80 assembly. They can be found at the hex addresses listed below:

0x227DD:

                                                               ========
;======================================================================
;======================================================================
MODE    EQU 1   ; 0 : for V70 / 1 : for DEBBUGER
MONO    EQU 0   ; 0 : STEREO  / 1 : MONO


    ASEG

    INCLUDE SDRV.INC
    INCLUDE SMACRO.INC

ATREQ   EQU 0

;================================================================
;=                              =
;=  HOT START                           =
;=                              =
;================================================================
    ORG $0000
RESET:
    IM  0
    LD  (WAT_DOG),A ; WATCH DOG CLEAR
    JP  START


;================================================================
;=                              =
;=  WAIT                            =
;=                              =
;================================================================
    ORG $0008
OPXWAIT:
    LD  A,(OPX_ST0)
    RLCA            ; OPN Busy ?
    JR  C,OPXWAIT   ; Yes !
    RET


;================================================================
;=                              =
;=  YMF271 REGSTER SET                      =
;=  A  : LOW ADDRESS                    =
;=  D  : REGSTER                        =
;=  E  : DATA                       =
;=                              =
;================================================================
    ORG $0010
REGST:
    PUSH    HL
    LD  H,$3F
    LD  L,A
;   RST $08
    LD  (HL),D
    INC HL
;   RST $08
    LD  (HL),E
    POP HL
    RET


;================================================================
;=                              =
;=  OPX SET by TABLE                        =
;=  HL : TABLE ADDRESS                  =
;=                              =
;================================================================
    ORG $20
OPX_SET_TBL:
1$:
    LD  A,(HL)
    INC HL
    CP  $FF
    RET Z
    LD  D,(HL)
    INC HL
    LD  E,(HL)
    INC HL
    RST $10
    JR  1$


;================================================================
;=                              =
;=  MASKABLE INTERRUPT                      =
;=                              =
;================================================================
    ORG $0038
    RETI


;================================================================
;=                              =
;=  NON MASKABLE INTERRUPT                  =
;=                              =
;================================================================
    ORG $0066
    PUSH    AF
    PUSH    HL
    LD  A,(NMIFLAG)
    OR  A
    JR  Z,5$
    LD  A,$FE
    XOR $FF
    LD  (OUTPUT),A
20$:    JR  20$
5$:
    LD  A,$FF
    LD  (NMIFLAG),A
    LD  A,(INPUT)
    XOR $FF         ;メインからのリクエストは反転している
    OR  A
    JR  Z,10$
    CP  $FF
    JR  Z,10$
    LD  HL,(REQCEWAD)
    LD  (HL),A
    INC L
    LD  (REQCEWAD),HL
10$:
    XOR A
    LD  (NMIFLAG),A
    POP HL
    POP AF
    RETN


;================================================================
;================================================================
    DB  ' SOUND DRIVER VERSION 1.04 for MEGA System 32 '
    DB  ' Programmed by N.M.K.Co.,Ltd. K.Hideya '
    DB  ' 1994.11.22 (TUE) '
;================================================================
;================================================================


;================================================================
;=                              =
;=  START                           =
;=                              =
;================================================================
    ORG $0100
START:
    LD  SP,STACK
    CALL    INITIAL
    CALL    PORT_INIT
    LD  HL,INITTBL
    RST $20

;================================================================
;=                              =
;=  IDLE                            =
;=                              =
;================================================================
IDLE:
    EI

    IF  MODE
    LD  A,(INPUT)
    LD  HL,OLDREQ
    CP  (HL)
    JR  Z,10$
    OR  A
    JR  Z,10$
    CP  0FFH
    JR  Z,10$
    LD  (HL),A
    LD  HL,(REQCEWAD)
    LD  (HL),A
    INC L
    LD  (REQCEWAD),HL
10$:
    ENDIF

    LD  (WAT_DOG),A ; WATCH DOG CLEAR
    CALL    CHKREQ
    LD  (WAT_DOG),A ; WATCH DOG CLEAR
    CALL    TIMER_INT
    LD  (WAT_DOG),A ; WATCH DOG CLEAR
    CALL    CHK_PCMOFF
    JR  IDLE


;================================================================
;=                              =
;=  TIMER CHECK                         =
;=                              =
;================================================================
TIMER_INT:
;   DI
    LD  A,(OPX_ST1)
    LD  (OPX_SF1),A
    LD  A,(OPX_ST0)
    LD  (OPX_SF0),A
    BIT 0,A     ; TIMER-A  On ?
    CALL    NZ,INTA
    LD  A,(OPX_SF0)
    BIT 1,A     ; TIMER-B  On ?
    CALL    NZ,INTB
;   EI
    RET


;================================================================
;=                              =
;=  INT A                           =
;=                              =
;================================================================
INTA:
    LD  D,$13
    LD  E,00011111B
    LD  A,$0C
    RST $10
    ;-------------- ゲートタイムチェック --------------
    LD  IY,WRKCH0
    LD  DE,WRKCHL
    LD  B,FMCHAN
10$:
    BIT 7,(IY+CTRLTR)
    JR  NZ,20$
    XOR A
    CP  (IY+GATETM)
    JR  Z,20$
    DEC (IY+GATETM)
    JR  Z,25$
20$:
    ADD IY,DE
    DJNZ    10$
    LD  B,PCMCHAN
    JR  30$
25$:
    LD  A,FMCHAN
    SUB B
    LD  (JOBCHAN),A
    CALL    INC_CHSTAT
    LD  A,$FF
    LD  (IY+CTRLTR),A
    CALL    KEYOFF
    JR  20$
30$:
    BIT 7,(IY+CTRLTR)
    JR  NZ,40$
    XOR A
    CP  (IY+GATETM)
    JR  Z,40$
    DEC (IY+GATETM)
    JR  Z,50$
40$:
    ADD IY,DE
    DJNZ    30$
    JR  60$
50$:
    LD  A,FMCHAN+PCMCHAN
    SUB B
    LD  (JOBCHAN),A
    CALL    INC_CHSTAT
    LD  A,$FF
    LD  (IY+CTRLTR),A
    CALL    KEYOFF
    JR  40$
    ;--------------------------------------------------
60$:
    ;------------- ステップタイムチェック -------------
    LD  IX,WRKTR0
    LD  DE,WRKTRL
    LD  HL,JOBTRK
    XOR A
    LD  (HL),A
INTA_LOOP:
    LD  A,(IX+TRKPTR+0)
    OR  (IX+TRKPTR+1)
    JR  Z,100$
    DEC (IX+STEPT)
    CALL    Z,ANAJOB
100$:
    INC (HL)
    LD  A,(HL)
    CP  FMTRK+PCMTRK
    RET Z           ;<- EXIT
    ADD IX,DE
    JR  INTA_LOOP
    ;--------------------------------------------------


;================================================================
;=                              =
;=  INT B                           =
;=                              =
;================================================================
INTB:
    LD  D,$13
    LD  E,00101111B
    LD  A,$0C
    RST $10
    CALL    CHK_PCMOFFL
    IF  ATREQ
    CALL    AUTOREQ
    ENDIF
;--- フェイドアウト処理 -------------------------------------
    LD  A,(FADEOUT)
    OR  A
    RET Z       ;<-EXIT
    LD  A,(FMMVOL)
    LD  C,A
    LD  A,(PCMMVOL)
    OR  C
    RET Z       ;<-EXIT
INTB_FADE:
    LD  A,(FADEOUT)
    LD  C,A
    LD  A,(FADEWRK)
    ADD A,C
    LD  C,A
    AND $1F
    LD  (FADEWRK),A ;少数部を保存
    LD  A,C
    AND $E0     ;正数部を取り出し、0なら帰る
    RET Z       ;↑
    RRA         ;↑
    RRA         ;↑
    RRA         ;↑
    RRA         ;↑
;--- フェイドアウト処理の準備 -------------------------------
    LD  C,A
    LD  A,(FMMVOL)
    SUB C
    JR  NC,10$
    XOR A
10$:
    LD  (FMMVOL),A
    LD  A,(PCMMVOL)
    SUB C
    JR  NC,20$
    XOR A
20$:
    LD  (PCMMVOL),A

;--- フェイドアウトの処理の実行部 ---

0x26319:

=
;=                              =
;=  REQUEST FUNCTION AC~AF <<DIRECT PCM VOLUME DOWN>>       =
;=                              =
;================================================================
REQ_FUNC_AC:
    SUB $AC
    LD  (SEREQ_TBL),A
    INC HL
    LD  A,(HL)
    LD  (SEREQ_NO),A
    CALL    SEREQ_VOLUME_DOWN2
    RET


;================================================================
;=                              =
;=  REQUEST FUNCTION A8~AB <<DIRECT PCM VOLUME UP>>     =
;=                              =
;================================================================
REQ_FUNC_A8:
    SUB $A8
    LD  (SEREQ_TBL),A
    INC HL
    LD  A,(HL)
    LD  (SEREQ_NO),A
    CALL    SEREQ_VOLUME_UP2
    RET


;================================================================
;=                              =
;=  REQUEST FUNCTION A4~A7 <<DIRECT

References#


  1. Domestic and Overseas Arcade Game List 1971-2005↩︎