home *** CD-ROM | disk | FTP | other *** search
/ Dave Lowe: IFF Samples File Conversion / Lowe_IFFSamplesFileConversion.img / TEST46.ASM < prev    next >
Encoding:
Assembly Source File  |  1994-09-15  |  22.7 KB  |  1,018 lines

  1. ;-----------------------------------------------------------------------------
  2. ;SNES MUSIC TEST PROGRAM - (c) Martin Walker/Richard Joseph 1992/1993
  3. ;-----------------------------------------------------------------------------
  4.  
  5. ;VERSION DETAILS
  6. ;4.6 - Mute added
  7. ;4.5 - Status added
  8. ;4.4 - SNES_CLR added/Globoffset added to readout
  9. ;4.3 - callnum acknowledge
  10. ;4.2 - 04/08/93 SNES anti-hang bug added in Boot_APU
  11. ;            new Sound_Init & Send_Data
  12. ;4.1 - 26/07/93 External Volume added
  13. ;4.0 - 18/05/93 ClockSync added
  14. ;3.4 - 25/03/93 joy up and #$3f removed
  15. ;3.2 - 04/03/93 upload ReceiveData routine added
  16. ;3.0 - 03/03/93 improved single byte download
  17. ;2.1 - 15/02/93 updated for 2 sample banks
  18.  
  19. ;EQUATES
  20. APU_PORT0    equ    $2140
  21. APU_PORT1    equ    $2141
  22. APU_PORT2    equ    $2142
  23. APU_PORT3    equ    $2143
  24.  
  25. SonyAddr    equ    $10    ;24 bit address (4 bytes used)
  26. callnum        equ    $14    ;inc's every call to confirm a new call
  27.  
  28. ;-----------------------------------------------------------------------------
  29. PCsndcall    equ    $15    ;$FF=no call/ any other = call from PC
  30. PCsonybank    equ    $16    ;$FF=no call/ 0=PC forces SONY download
  31. PCsonybyte    equ    $17    ;$FF=no call/ 0=PC forces SONY download
  32. PCsonyvalue    equ    $18    ;value to send to SONY RAM
  33. PCsonyaddr    equ    $19    ;word address to send to SONY driver
  34. ;-----------------------------------------------------------------------------
  35.  
  36. editnum        equ    $1B
  37. stick        equ    $1C
  38. ;-----------------------------------------------------------------------------
  39. SONYbuffer    equ    $1D    ;start of 60 byte buffer for SONY upload
  40. SONYclock    equ    $56    ;bytes58/59 Internal SONY tick timer
  41. globoffset    equ    $58    ;byte 60
  42. trk0call    equ    $59    ;byte 61
  43. ;-----------------------------------------------------------------------------
  44. PCactive    equ    $5A    ;set to $FF on 1st PC call
  45. ;-----------------------------------------------------------------------------
  46. SONYstatus    equ    $5B    ;word read by ReceiveStatus from PORT1
  47. SONYtrk0call    equ    $5C    ;& PORT2
  48.  
  49. PCparameter    equ    $5D    ;sony port1 value from PC
  50. ;-----------------------------------------------------------------------------
  51.  
  52. COMPTR        equ    $7E     ;ESYS buffer (2 bytes in page zero)
  53. COMBUF        equ    $80     ;ESYS buffer (length is COMLEN/about 70 bytes)
  54. RESTRT        equ    $8000    ;Main program start address
  55. COMAD        equ    $8028    ;The address of the comms interface
  56.  
  57. ;Start of COMBUF is 16 bytes for header
  58. COMCTR        equ    COMBUF+16 ;Counter
  59. COMSUM        equ    COMCTR+2    ;Checksum
  60. COMVAL        equ    COMSUM+1    ;Temp reg
  61. COMINP        equ    COMVAL+1    ;Temp reg
  62.  
  63.  
  64. ;-----------------------------------------------------------------------------
  65. ;Macro Definitions
  66. ;-----------------------------------------------------------------------------
  67.  
  68. SET16    MACRO
  69.     rep    %00110000    ;Enable 16-bit mode ie clear M&X
  70.     ENDM
  71.  
  72. CLR16    MACRO
  73.     sep    %00110000    ;Disable 16-bit mode ie set M&X
  74.     ENDM
  75.  
  76. SETLONGA MACRO
  77.     rep    %100000        ;16 Bit Accumulator
  78.     ENDM
  79.  
  80. CLRLONGA MACRO
  81.     sep    %100000        ;8 bit Accumulator
  82.     ENDM
  83.  
  84.  
  85. ;-------------------------------------------------------------------------------
  86. ;INITIALISE SNES
  87. ;-----------------------------------------------------------------------------
  88.     ORG    $8000        ;Bank 0 (sent to ESYS @ $0000)
  89.  
  90.     CLR16            ;Hardware setup
  91.  
  92. BEGIN:    cld
  93.     sei            ;disable interrupts
  94.     clc            ;clc for 65816/sec for 6502
  95.     xce            ;set emulation mode
  96.  
  97.     lda    #$8F
  98.     sta    $2100        ;forced blank
  99.  
  100.     jsr    ClearRegisters
  101.     jsr    InitRegisters
  102.     jmp    BEGIN2
  103.  
  104.     ORG $8020
  105.     db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
  106.     db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF ;COMAD AREA
  107.  
  108. ;-----------------------------------------------------------------------------
  109. ;Start of Debugger routines
  110. ;-----------------------------------------------------------------------------
  111. COMMS:    ;Enter debugger if host PC waiting to transfer
  112.     PHP
  113.     PHA
  114. ASM10:    LDA    |COMAD        ;'Read' port of comms link
  115.     EOR    #$C0        ;Bits 4-6 are used to determine if the comms is
  116.     AND    #$F0        ;enabled. Bit 7 set indicates that the host
  117.     BNE    ASM20        ;is waiting to transfer
  118.     LDA    #$C0        ;Breakpoint type
  119.     STA    <COMTYP
  120.     JSR    COMRT        ;Enter debugger if host PC waiting
  121. ASM20:    PLA
  122.     PLP
  123.     RTS            ;Return to main program
  124.     ;All regs preserved unless changed by host PC command
  125.  
  126.  
  127. ;-----------------------------------------------------------------------------
  128. ;This is the debugger.
  129. ;If a new bank was paged in, the previous value should be in the A
  130. ;reg. This can be read by the 'transfer registers' command.
  131. ;COMTYP holds the breakpoint type ($41-BRKPNT, $42-TRACE AND $C0-COMMS).
  132. ;-----------------------------------------------------------------------------
  133. COMRT:    PHA            ;Previous bank
  134.     TXA
  135.     PHA
  136.     TYA
  137.     PHA
  138.     TSX
  139.     TXA
  140.     CLC
  141.     ADC    #10
  142.     PHA            ;Stack value
  143. COM10:    LDA    <COMTYP
  144.     PHA
  145.     CLD
  146. COM20:    LDA    |COMAD
  147.     AND    #$F0
  148.     CMP    #$40
  149.     BEQ    COM20        ;Wait for host PC (for DEBUG entry)
  150.     LDA    |COMAD+6        ;Reset port
  151.     LDA    |COMAD+4
  152. COM30:    LDA    |COMAD+3
  153. COM40:    JSR    COMRX        ;Read first byte of header
  154.     BCS    COM70        ;Enter ram or exit
  155.     CMP    #0
  156.     BEQ    COM80        ;This command not used
  157.     JSR    COMCMD        ;Execute command
  158.     BCC    COM30        ;If no error loop back for next command
  159.     LDA    |COMAD+2        ;Signal error to host PC
  160.     LDA    |COMAD+4
  161.     LDA    |COMAD+7
  162. COM60:    LDA    |COMAD        ;Wait for host PC to disable comms with COMOFF
  163.     AND    #$F0
  164.     CMP    #$C0
  165.     BEQ    COM60
  166.     JMP    COM90        ;Exit
  167. COM70:    BNE    COM80        ;Jump if exit
  168.     LDA    |COMAD+6
  169.     lda    #$8F
  170.     sta    |$2100        ;forced blank
  171.     lda    #0
  172.     sta    |$4200        ;disable all NMI
  173.     LDX    #<CWTLN-1
  174. COM75:    LDA    |COMWT,X        ;Copy routine into buffer
  175.     STA    COMBUF,X
  176.     DEX
  177.     BPL    COM75
  178.     JMP    COMBUF        ;Enter ram
  179.  
  180. ;-----------------------------------------------------------------------------
  181. COMCT:    LDA    COMAD+2        ;Continue here after exiting ram
  182.     lda    #$01
  183.     sta    $4200        ;JOY-C Enable
  184.     lda    #$0F
  185.     sta    $2100        ;Release forced blank
  186. COM78:    LDA    COMAD        ;Wait for acknowledgement from host PC
  187.     AND    #$F2
  188.     CMP    #$C0
  189.     BEQ    COM78
  190.     JMP    COM30
  191. COM80:    LDA    COMAD+6        ;Prepare for exit
  192.     LDA    COMAD+2
  193. COM90:    PLA            ;Get type
  194.     PLA            ;Clear SP value
  195.     PLA
  196.     TAY
  197.     PLA
  198.     TAX
  199.     PLA            ;Get bank
  200.     RTS            ;Exit
  201.  
  202.  
  203. ;-----------------------------------------------------------------------------
  204. TXACK:    ;Wait for acknowledgement from host PC
  205.     LDA COMAD
  206.     AND #$F2
  207.     CMP #$C0
  208.     BEQ TXACK
  209.     LDA COMAD+2
  210. CMD5:    LDA COMAD
  211.     AND #$F1
  212.     EOR #$C0
  213.     BEQ CMD5
  214. CMD7:    CLC
  215. CMD8:    RTS
  216.  
  217. ;-----------------------------------------------------------------------------
  218. ;Execute command, A is command number
  219. ;-----------------------------------------------------------------------------
  220. COMCMD:    TAY
  221.     AND #$0F
  222.     BEQ CMD7    ;Single byte command
  223.     STA COMCTR
  224.     LDA #0
  225.     STA COMCTR+1
  226.     LDA #COMBUF AND 255    ;& FOR KASM
  227.     STA COMPTR
  228.     LDA #COMBUF/256
  229.     STA COMPTR+1
  230.     TYA
  231.     PHA
  232.     JSR CRXB    ;Load rest of header
  233.     PLA
  234.     BCS CMD8    ;Error
  235.     TAY
  236.     AND #$EF
  237.     CMP #$02
  238.     BNE CMD20    ;Jump if not transfer regs command
  239.     TSX
  240.     INX    ;Allow for COMCMD return addr
  241.     SEC    ;Allow for COMCMD return addr
  242.     ADC COMBUF
  243.     STA COMPTR    ;Offset
  244.     LDA #$01    ;Stack addr
  245.     STA COMPTR+1    ;Point to regs list on stack
  246.     LDX COMBUF+1    ;Length
  247.     LDA #0
  248.     JMP CMD30
  249. CMD20:    CMP #$05
  250.     BNE CMD7    ;Return if not transfer memory command
  251.     LDA COMBUF
  252.     STA COMPTR
  253.     LDA COMBUF+1
  254.     STA COMPTR+1
  255.     LDX COMBUF+3
  256.     LDA COMBUF+4
  257. CMD30:    STX COMCTR
  258.     STA COMCTR+1
  259.     TYA
  260.     AND #$10
  261.     BEQ CMD40
  262.     JSR CTXBUF    ;Send data
  263.     BCS CMD50    ;Jump if error
  264.     JSR TXACK    ;Wait for acknowledgement
  265.     JMP CMD50
  266. CMD40:    JSR CRXBUF    ;Load data
  267. CMD50:    RTS
  268.  
  269.  
  270. ;-----------------------------------------------------------------------------
  271. ;This routine is copied into ram to allow the host PC access to the ESYS
  272. ;-----------------------------------------------------------------------------
  273. COMWT:    LDA COMAD+2
  274. CWT10:    LDX #0    ;Wait for command
  275. CWT20:    DEX
  276.     BNE CWT20
  277.     LDA COMAD
  278.     AND #$F0
  279.     CMP #$C0
  280.     BEQ CWT30    ;Jump if host PC waiting to send command
  281.     CMP #$40
  282.     BEQ CWT10
  283.     BNE CWT50    ;Jump if comms disabled
  284. CWT30:    LDA COMAD+3    ;Send acknowledgement
  285. CWT40:    LDA COMAD
  286.     AND #$F2
  287.     CMP #$C0
  288.     BEQ CWT60
  289.     CMP #$C2
  290.     BEQ CWT40
  291.     LDA COMAD+2
  292. CWT50:    JMP RESTRT    ;Jump to start if comms disabled or ENDTRN called
  293. CWT60:    JMP COMCT    ;Jump back to debugger
  294.  
  295. CWTLN    EQU $-COMWT    ;PC FOR KASM
  296. COMTYP    EQU COMBUF+CWTLN    ;Breakpoint type
  297. DBUGFL    EQU COMTYP+1    ;Debug flag/counter
  298. COMLEN    EQU CWTLN+2    ;Total length of buffer
  299.  
  300.  
  301. ;-----------------------------------------------------------------------------
  302. ;Transmit data to host PC
  303. ;HL points to data, BC is the length
  304. ;-----------------------------------------------------------------------------
  305. CTXBUF:
  306.     LDA #0
  307.     STA COMSUM
  308. CTX10:    LDY #0
  309.     LDA (COMPTR),Y
  310.     INC COMPTR
  311.     BNE CTX12
  312.     INC COMPTR+1
  313. CTX12:    TAY
  314.     CLC
  315.     ADC COMSUM    ;Checksum
  316.     STA COMSUM
  317.     TYA
  318.     JSR COMTX    ;Send byte
  319.     BCS CTX50    ;Error
  320.     LDA COMCTR
  321.     BNE CTX14
  322.     DEC COMCTR+1
  323. CTX14:    DEC COMCTR
  324.     BNE CTX10
  325.     LDA COMCTR+1
  326.     BNE CTX10
  327.     LDA COMSUM    ;Send checksum
  328.     ;Send a byte (in A)
  329. COMTX:    STA COMVAL
  330.     LDA #$C2
  331.     STA COMINP
  332.     LDX #2/2
  333.     LDY #4
  334.     SEC
  335.     ROL COMVAL
  336.     TXA
  337. CTX20:    ROL A
  338.     TAX
  339. CTX30:    LDA COMAD    ;Wait for handshake
  340.     EOR COMINP
  341.     AND #$F2
  342.     BEQ CTX40
  343.     EOR #$02
  344.     BEQ CTX30
  345.     AND #$70
  346.     SEC
  347.     BNE CTX50    ;Exit if comms disabled
  348.     LDA COMINP
  349.     AND #$08
  350.     BNE CTX30
  351. CTX40:    LDA COMINP    ;Send first bit even if host PC is not ready
  352.     ORA #$08
  353.     STA COMINP
  354.     LDA COMAD,X
  355.     TYA
  356.     EOR #$01
  357.     TAY
  358.     LDA COMINP
  359.     EOR #$02
  360.     STA COMINP
  361.     LDA COMAD,Y
  362.     TXA
  363.     ROR A
  364.     CLC
  365.     ROL COMVAL
  366.     BNE CTX20
  367.     CLC
  368. CTX50:    RTS
  369.     ;On exit NC=send OK, C=comms disabled
  370.  
  371.  
  372. ;-----------------------------------------------------------------------------
  373. ;Receive data from host PC
  374. ;HL points to data, BC is the length
  375. ;-----------------------------------------------------------------------------
  376. CRXBUF:
  377.     LDA    #0
  378. CRXB:    STA    COMSUM
  379. CRXLP:    JSR    COMRX        ;Load byte
  380.     BCS    CRX6        ;Error
  381.     LDY    #0
  382.     STA    (COMPTR),Y
  383.     INC    COMPTR
  384.     BNE    CRX2
  385.     INC    COMPTR+1
  386. CRX2:    CLC
  387.     ADC    COMSUM
  388.     STA    COMSUM
  389.     LDA    COMCTR
  390.     BNE    CRX4
  391.     DEC    COMCTR+1
  392. CRX4:    DEC    COMCTR
  393.     BNE    CRXLP
  394.     LDA    COMCTR+1
  395.     BNE    CRXLP
  396.     JSR    COMRX        ;Load checksum
  397.     BCS    CRX6        ;Error
  398.     EOR    COMSUM
  399.     CLC
  400.     ADC    #$FF        ;Signal error if checksums do not match
  401. CRX6:    RTS
  402.     ;On exit NC=load OK, C=comms disabled or error
  403.  
  404.  
  405. ;-----------------------------------------------------------------------------
  406. ;Receive a byte from host PC
  407. ;-----------------------------------------------------------------------------
  408. COMRX:
  409.     LDX #6
  410.     LDA #$01
  411.     STA COMVAL
  412.     LDA #$C0
  413.     STA COMINP
  414. CRX10:    LDA COMAD    ;Wait for handshake
  415.     AND #$F2
  416.     EOR COMINP
  417.     BEQ CRX20
  418.     EOR #$02
  419.     BEQ CRX10
  420.     EOR COMINP
  421.     EOR #$42
  422.     BNE CRX15    ;Jump if comms disabled
  423.     LDA COMVAL    ;Check for 'enter ram' command
  424.     EOR #3
  425. CRX15:    SEC
  426.     RTS
  427. CRX20:
  428.     TXA
  429.     EOR #$01
  430.     TAX
  431.     LDA COMINP
  432.     EOR #$02
  433.     STA COMINP
  434.     LDA COMAD
  435.     CMP COMAD,X
  436.     ROR A
  437.     ROL COMVAL
  438.     BCC CRX10
  439.     LDA COMVAL
  440.     CLC
  441.     RTS
  442.     ;On exit NC=load OK, value in A
  443.     ;        C and A=0 - Enter ram command
  444.     ;        C and A<>0 - Comms transfer ended
  445.  
  446.  
  447.  
  448.  
  449. ;-----------------------------------------------------------------------------
  450. BEGIN2:    jsr    Sound_Init
  451.     CLR16
  452.     lda    #0
  453.     sta    <editnum
  454.     sta    <PCparameter
  455.     lda    #$FF
  456.     sta    <PCsndcall
  457.     sta    <PCsonybank
  458.     sta    <PCsonybyte
  459.     sta    <PCsonyvalue
  460.     sta    <PCactive
  461.     
  462. ;-----------------------------------------------------------------------------
  463. ;JOYSTICK READ LOOP
  464. ;-------------------------------------------------------------------------------
  465. MAINLOOP:
  466.     CLRLONGA            ;1st ensure full 6502 mode
  467.     CLR16
  468.     jsr    COMMS
  469.  
  470. CALLchk    lda    <PCsndcall    ;check for sound call from PC
  471.     cmp    #$FF
  472.     beq    ROMchk
  473.     sta    <PCactive    ;start 'ReceiveData'
  474.     ldx    <PCparameter    ;#$FF        ;full volume
  475.     jsr    SendSound    ;sound call from PC
  476.     lda    #$FF
  477.     sta    <PCsndcall    ;cancel flag
  478.     jmp    JOYchk
  479.  
  480.  
  481. ROMchk    lda    <PCsonybank    ;check for download call from PC
  482.     cmp    #$FF
  483.     beq    SONYchk
  484.     sta    <PCactive    ;start 'ReceiveData'
  485.     jsr    Send_Data
  486.     lda    #$FF
  487.     sta    <PCsonybank    ;cancel flag
  488.  
  489.  
  490. SONYchk    lda    <PCsonybyte    ;check for byte edit from PC
  491.     cmp    #$FF
  492.     beq    JOYchk
  493.     jsr    SendByte
  494.     lda    #$FF
  495.     sta    <PCsonybyte    ;cancel flag
  496.  
  497.  
  498. JOYchk    jsr    ReadJoy        ;full brightness (1 Vblank)
  499.     ldx    <stick
  500.     txa
  501.     and    #8
  502.     bne    UPKEY
  503.     txa
  504.     and    #4
  505.     bne    DNKEY
  506.     txa
  507.     and    #$20
  508.     bne    SELECT
  509.     txa
  510.     and    #$10
  511.     bne    STRTBUT
  512.     txa
  513.     and    #$40
  514.     bne    YBUT
  515.     bra    RELEASE
  516.  
  517. UPKEY    lda    <editnum
  518.     inc    a
  519.     sta    <editnum
  520.     bra    KEYEND
  521.  
  522. DNKEY    lda    <editnum
  523.     dec    a
  524.     bpl    down2
  525.     lda    #0
  526. down2:    sta    <editnum
  527.     bra    KEYEND
  528.  
  529. SELECT    lda    #$80
  530.     jsr    SendSound
  531.     bra    KEYEND
  532.  
  533. YBUT    lda    #$81
  534.     jsr    SendSound
  535.     bra    KEYEND
  536.  
  537.  
  538. STRTBUT    lda    <editnum
  539.     ldx    #$FF        ;full volume
  540.     jsr    SendSound
  541.     bra    KEYEND
  542.  
  543.  
  544. KEYEND    jsr    ReadJoy        ;full brightness
  545.     lda    <stick
  546.     cmp    #0
  547.     bne    KEYEND        ;wait for key release
  548.  
  549.  
  550. RELEASE    ldx    #$08
  551.     stx     $2100        ;set to half brightness
  552.     lda    <PCactive
  553.     cmp    #$FF
  554.     beq    RDskip        ;ignore 'ReceiveData' until any PC call
  555. ;    jsr    Info_Mode
  556.     jsr    ReceiveStatus
  557.     jsr    ReceiveData    ;1 upload per 40mS (2 Vblanks)
  558. ;    lda    <SONYstatus    ;add these 2 lines for checking status
  559. ;    sta    <globoffset
  560.     lda    <SONYtrk0call    ;add these 2 lines for checking trk0call
  561.     sta    <trk0call    ;move value to end of SONY buffer
  562. RDskip    jsr    WaitVB
  563.     jmp    MAINLOOP        ;i.e. every 5 ReadAllChannels @ 8mS
  564.  
  565.  
  566.  
  567.  
  568. ;-------------------------------------------------------------------------------
  569. ;SUBROUTINES
  570. ;-------------------------------------------------------------------------------
  571. Info_Mode:    CLR16
  572.         php
  573.         sei            ;disable any other interrupts
  574. I_M0:        lda    >APU_PORT0    ;latest value sent by SOUND CPU
  575.         cmp    <callnum
  576.         bne    I_M0        ;previous call still not finished
  577.  
  578.         lda    #$83        ;INFOMODE
  579.         sta    >APU_PORT0
  580.         lda    #0        ;0=status(default)/1=clock
  581.         sta    >APU_PORT1
  582.         inc    <callnum
  583.         lda    <callnum
  584.         sta    >APU_PORT3    ;forces a new call
  585.         plp            ;restore any interrupts
  586.         rts
  587.  
  588.  
  589.  
  590. ;-----------------------------------------------------------------------------
  591. ReceiveClock:    SETLONGA            ;clock is waiting in PORT1 & 2
  592.         lda    >APU_PORT1    ;16 bit (get data word)
  593.         sta    <SONYclock    ;PORT1=low byte/PORT2=high byte
  594.         CLRLONGA            ;top bit of PORT2='0' (running)
  595.         rts            ;='1' (all sound stopped)
  596.  
  597. ReceiveStatus:    SETLONGA
  598.         lda    >APU_PORT1    ;bits 0-7 are '0' (channel active)
  599.         sta    <SONYstatus
  600.         CLRLONGA
  601.         rts            ;'1' (channel stopped)
  602.  
  603. ;-----------------------------------------------------------------------------
  604. ReceiveData:    CLR16
  605.         php
  606.         sei            ;disable any other interrupts
  607. RD_0:        lda    >APU_PORT0    ;latest value sent by SOUND CPU
  608.         cmp    <callnum
  609.         bne    RD_0        ;previous call still not finished
  610.  
  611.         lda    #$85        ;RECEIVE data
  612.         sta    >APU_PORT0
  613.         inc    <callnum
  614.         lda    <callnum
  615.         sta    >APU_PORT3    ;confirms a new call
  616.  
  617.         ldy    #0
  618. RD_wait:    lda    >APU_PORT0
  619.         cmp    <callnum
  620.         bne    RD_wait        ;wait for SOUND CPU 'READY'
  621.  
  622.         lda    >APU_PORT1
  623.         sta    SONYbuffer,y    ;store data byte
  624.         inc    <callnum
  625.         lda    <callnum
  626.         sta    >APU_PORT3    ;confirms byte received
  627.  
  628.         iny
  629.         cpy    #60
  630.         bcc    RD_wait
  631.  
  632.         plp
  633.         rts
  634.  
  635.  
  636. ;-------------------------------------------------------------------------------
  637. SendByte:    CLR16
  638.         php
  639.         sei            ;disable any other interrupts
  640. SB_0:        lda    >APU_PORT0    ;latest value sent by SOUND CPU
  641.         cmp    <callnum
  642.         bne    SB_0        ;previous call still not finished
  643.  
  644.         lda    #$84        ;DOWNLOAD byte (music)
  645.         sta    >APU_PORT0
  646.         lda    <PCsonyaddr
  647.         sta    >APU_PORT1
  648.         lda    <PCsonyaddr+1
  649.         sta    >APU_PORT2    ;place address on PORTs 1 & 2
  650.         inc    <callnum
  651.         lda    <callnum
  652.         sta    >APU_PORT3    ;confirms a new call
  653.  
  654. SB_wait        lda    >APU_PORT0
  655.         cmp    <callnum    
  656.         bne    SB_wait        ;'address received' acknowledge
  657.     
  658.         lda    <PCsonyvalue    ;now place edited byte on PORT1
  659.         sta    >APU_PORT1
  660.         inc    <callnum
  661.         lda    <callnum
  662.         sta    >APU_PORT3    ;confirms byte ready
  663.         plp            ;restore any interrupts
  664.         rts
  665.  
  666.  
  667. ;-----------------------------------------------------------------------------
  668. SendSound:    CLR16
  669.         pha            ;save call number
  670.         lda    >APU_PORT0    ;latest value sent by SOUND CPU
  671.         cmp    <callnum
  672.         bne    SoundAbort    ;previous call still not finished
  673.         pla
  674.         sta    >APU_PORT0    ;store new call
  675.         txa
  676.         sta    >APU_PORT1    ;store new volume
  677.         inc    <callnum
  678.         lda    <callnum
  679.         sta    >APU_PORT3    ;confirms a new call
  680.         rts
  681. SoundAbort:    pla
  682.         rts
  683.  
  684.  
  685. ;-----------------------------------------------------------------------------
  686. Send_Data:    CLR16
  687.         php
  688.         sei            ;disable any other interrupts
  689. S_D0:        lda    >APU_PORT0    ;latest value sent by SOUND CPU
  690.         cmp    <callnum
  691.         bne    S_D0        ;previous call still not finished
  692.  
  693.         lda    #$82        ;DOWNLOAD data (music)
  694.         sta    >APU_PORT0
  695.         inc    <callnum
  696.         lda    <callnum
  697.         sta    >APU_PORT3    ;forces a new call
  698.         SET16
  699.         lda    #Musicdata
  700.         sta    <SonyAddr
  701.         lda    #Musicdata>>16
  702.         sta    <SonyAddr+2
  703.         jsr    SONY_send
  704.  
  705.         sta    >APU_PORT3    
  706.         plp            ;restore any interrupts
  707.         rts
  708.  
  709. ;-----------------------------------------------------------------------------
  710. Send_Mute:    CLR16
  711.         php
  712.         sei            ;disable any other interrupts
  713. S_M0:        lda    >APU_PORT0    ;latest value sent by SOUND CPU
  714.         cmp    <callnum
  715.         bne    S_M0        ;previous call still not finished
  716.  
  717.         lda    #$86        ;MUTE
  718.         sta    >APU_PORT0
  719.         txa
  720.         sta    >APU_PORT1    ;store new mute value
  721.         inc    <callnum
  722.         lda    <callnum
  723.         sta    >APU_PORT3    ;forces a new call
  724.         plp            ;restore any interrupts
  725.         rts
  726.  
  727. ;-----------------------------------------------------------------------------
  728. Sound_Init:    php
  729.         sei            ;disable any other interrupts
  730.         SET16
  731.           lda    #MusicInit    ;download SNES_CLR.BIN (24 bit address)
  732.         sta    <SonyAddr                                    lda    #RamII
  733.         lda    #MusicInit>>16
  734.         sta    <SonyAddr+2
  735.         jsr    Boot_APU        ;exits straight to IPLROM
  736.  
  737.         SET16
  738.         lda    #MusicDriver    ;download driver (24 bit address)
  739.         sta    <SonyAddr                                    lda    #RamII
  740.         lda    #MusicDriver>>16
  741.         sta    <SonyAddr+2
  742.         jsr    SONY_send
  743.  
  744.         lda    #$82        ;DOWNLOAD data (music)
  745.         sta    >APU_PORT0
  746.         SET16
  747.         lda    #Musicdata
  748.         sta    <SonyAddr
  749.         lda    #Musicdata>>16
  750.         sta    <SonyAddr+2
  751.         jsr    SONY_send
  752.  
  753.         lda    #$82        ;DOWNLOAD data (samples)
  754.         sta    >APU_PORT0
  755.         SET16
  756.         lda    #Samples1
  757.         sta    <SonyAddr
  758.         lda    #Samples1>>16
  759.         sta    <SonyAddr+2
  760.         jsr    SONY_send
  761.  
  762.         lda    #$82        ;DOWNLOAD data (samples)
  763.         sta    >APU_PORT0
  764.         SET16
  765.         lda    #Samples2
  766.         sta    <SonyAddr
  767.         lda    #Samples2>>16
  768.         sta    <SonyAddr+2
  769.         jsr    SONY_send
  770.         sta    >APU_PORT3    ;init PORT3 to $FF
  771.         plp            ;restore any interrupts
  772.         rts
  773.  
  774. ;-----------------------------------------------------------------------------
  775. SONY_send:    jsr    Boot_APU
  776.         CLR16
  777. @wait0:        lda    >APU_PORT0    ;wait for handshake
  778.         bne    @wait0
  779.         dec    a
  780.         sta    >APU_PORT2    ;acknowledge handshake
  781.         sta    <callnum        ;init call number to $FF
  782.         rts
  783.  
  784. ;-------------------------------------------------------------------------------
  785. ;SOUND BOOT LOADER V1.1 (from Appendix D of the SNES manual)
  786. ;-------------------------------------------------------------------------------
  787. Boot_APU:    php
  788.         SET16
  789.         ldy    #|$0000        ;16 bit
  790.         lda    #$bbaa
  791. boot_initial:    cmp    >APU_PORT0    ;16 bit (i.e. check PORT0 & PORT1)
  792.         bne    boot_initial    ;wait for SONY init state
  793.         CLRLONGA
  794.         lda    #$cc
  795.         bra    boot_entry1
  796.  
  797. boot_repeat:    lda    [SonyAddr],y
  798.         iny
  799.         xba
  800.         lda    #0
  801.         bra    boot_entry2
  802. boot_loop:    xba
  803.         lda    [SonyAddr],y
  804.         iny
  805.         xba
  806. boot_wait1:    cmp    >APU_PORT0
  807.         bne    boot_wait1    ;wait till accepted
  808.         inc    a
  809. boot_entry2:    SETLONGA
  810.         sta    >APU_PORT0    ;16 bit (i.e. to PORT0 & PORT1)
  811.         CLRLONGA
  812.         dex            ;16 bit data quantity
  813.         bne    boot_loop
  814. boot_wait2:    cmp    >APU_PORT0
  815.         bne    boot_wait2
  816. boot_zero:    adc    #3
  817.         beq    boot_zero
  818. boot_entry1:    pha
  819.         SETLONGA
  820.         lda    [SonyAddr],y    ;16 bit (get data quantity word)
  821.         iny
  822.         iny            ;skip past word
  823.         tax            ;& save data quantity word in x
  824.         lda    [SonyAddr],y    ;16 bit (get transfer address)
  825.         iny
  826.         iny
  827.         sta    >APU_PORT2    ;16 bit (store to PORT2 & PORT3)
  828.         CLRLONGA
  829.         cpx    #|0001        ;set carry if >=1 (16 bits)
  830.         lda    #00
  831.         rol    a        ;a=1 (if quantity is 1 or more)
  832.         sta    >APU_PORT1    ;PORT1 = 1 (more) or 0 (end)
  833.         adc    #$7f        ;A=$80 (more) or $7F (end)
  834.         pla
  835.         sta    >APU_PORT0
  836. ;        cpx    #|0001        ;REV.D anti-hang mod
  837. ;        bcc    boot_ret        ;REV.D anti-hang mod
  838. boot_wait3:    cmp    >APU_PORT0
  839.         bne    boot_wait3
  840.         bvs    boot_repeat    ;if more
  841. boot_ret:    plp
  842.         rts
  843.  
  844.  
  845. ;-----------------------------------------------------------------------------
  846. ClearRegisters:    jsr    ClearMod
  847.         jsr    ClearMod
  848.         rts
  849.  
  850. ClearMod    SET16
  851.         ldy    #|0000
  852.         lda    #|0000
  853. ClearLoop    sta    |$2100,y
  854.         iny
  855.         iny
  856.         cpy    #$210c
  857.         bcc    Clearloop
  858.         CLR16
  859.         rts
  860.  
  861. ;-----------------------------------------------------------------------------
  862. InitRegisters:    CLR16
  863.         lda    #$00        ;Mode 0
  864.         sta    $2105
  865.         stz    $2106        ;Mosaic off
  866.         stz    $2107
  867.         stz    $2108
  868.         stz    $2109
  869.         stz    $210A        ; Screen size (Four 2x2)
  870.  
  871.         lda    #$02
  872.         sta    $210B
  873.         stz    $210C        ; Character address. (Null)
  874.  
  875.         lda    #$30
  876.         sta    $2130
  877.         lda    #$e0
  878.         sta    $2132
  879.  
  880.         stz    $2133        ; SetIn
  881.         lda    #$01
  882.         sta    $212c        ; Main Screen Destination
  883.         sta    $212d
  884.  
  885.         lda    #$01
  886.         sta    $211e
  887.         stz    $211e
  888.         lda    #01
  889.         sta    $211b
  890.         stz    $211b
  891.  
  892.         stz    $2106        ;Turn off Mosaic
  893.  
  894.         lda    #$ff
  895.         sta    $4201
  896.         lda    #$01
  897.         sta    $4200        ; JOY-C Enable
  898.         lda    #$01
  899.         sta    $4212        ; Automatic Joystick?
  900.         lda    $4016
  901.         and    #$fe
  902.         sta     $4016        ; Standard NES Joystick Registers
  903.  
  904.         stz    $2121        ;WRITE COLOURS TO COLOUR REGISTERS
  905.         lda    #$00
  906.         ldx    #$00
  907. colour:        clc
  908.         adc    #$12
  909.         sta    $2122
  910.         sta    $2122
  911.         dex
  912.         bne    colour
  913.  
  914.  
  915.         lda    #$80        ;Fill VRAM with rubbish
  916.         sta    $2115
  917.         lda    #$00
  918.         sta    $2116
  919.         stz    $2117
  920.         lda    #$0f
  921.         ldy    #$00
  922. rubbishfill    ldx    #$00
  923. smallfill    sta    $2118
  924.         sta    $2119
  925.         dex
  926.         bne    smallfill
  927.         dey
  928.         bne    rubbishfill
  929.  
  930.  
  931.         stz    |$0044
  932.         stz    $2116
  933.         stz    $2117
  934.         ldy    #$00
  935. tloop1        ldx    #$00
  936. tloop2        lda    $2139
  937.         cmp    #$0f
  938.         bne    hang
  939.         dex
  940.         bne    tloop2
  941.         dey
  942.         bne    tloop1
  943.         jmp    missem
  944. hang        lda    #$44
  945.         sta    |$0044    ;needed?
  946.  
  947. missem:        CLR16
  948.         lda    #$0F
  949.         sta    $2100    ;Release forced blank
  950.         rts
  951.  
  952. ;-------------------------------------------------------------------------------
  953. ReadJoy:    CLR16
  954.         ldx    #$0f
  955.         stx     $2100    ;full brightness
  956.         jsr    WaitVB
  957. ReadJ2:        lda    $4212
  958.         and    #$80
  959.         bne    ReadJ2    ;wait for non-blanking period
  960. ReadJ3:        lda    $4212
  961.         and    #$01
  962.         bne    ReadJ3
  963.         lda    $4219
  964.         sta    <stick
  965.         rts
  966.  
  967. ;-----------------------------------------------------------------------------
  968. WaitVB:        pha
  969. VB_Loop1:    lda    $4212
  970.         and    #$80
  971.         bne    VB_Loop1    ; Wait for Non Blanking period
  972. VB_Loop2:    lda     $4212
  973.         and    #$80
  974.         beq    VB_Loop2    ; Now, wait for Blanking Period.
  975.         pla
  976.         rts
  977.  
  978.  
  979. ;-------------------------------------------------------------------------------
  980. ;Binary data file section
  981. ;-------------------------------------------------------------------------------
  982. MusicDriver:    include C:\martin\snes\D-SNES34.BIN (bin)
  983. DriverEnd:
  984.  
  985.         ORG    $9300
  986. MusicData:    include    c:\martin\snes\spawn1sn.snd (bin)
  987. Bank1end:
  988.  
  989.         ORG    $FF00
  990. MusicInit:    include    C:\martin\snes\SONY-CLR.BIN (bin)
  991.  
  992.         ORG    $FFE6
  993.         DW    BEGIN        ;65C816 BRK vector
  994.         ORG    $FFFC
  995.         DW    BEGIN        ;6502 reset button jump vector
  996. ;-----------------------------------------------------------------------------
  997.         ORG    $10000        ;BANK 1 ESYS ROM address
  998. ;        include INTRO_1.BIN (bin)
  999. ;        include IGNIT_1.BIN (bin)
  1000. ;        include STEEL_1.BIN (bin)
  1001. ;        include c:\martin\snes\BEAT_1.BIN (bin)
  1002.         include c:\martin\snes\spawn1.bin (bin)
  1003.  
  1004.         ORG    $18000        ;BANK 1 assembly address
  1005. Samples1:
  1006. ;-----------------------------------------------------------------------------
  1007.         ORG    $18000        ;BANK 2 ESYS ROM address
  1008. ;        include INTRO_2.BIN (bin)
  1009. ;        include IGNIT_2.BIN (bin)
  1010. ;        include STEEL_2.BIN (bin)
  1011. ;        include c:\martin\snes\BEAT_2.BIN (bin)
  1012.         include c:\martin\snes\spawn1a.bin (bin)
  1013.  
  1014.         ORG    $28000        ;BANK 2 assembly address
  1015. Samples2:
  1016. ;-----------------------------------------------------------------------------
  1017.  
  1018.