home *** CD-ROM | disk | FTP | other *** search
- ;-----------------------------------------------------------------------------
- ;SNES MUSIC TEST PROGRAM - (c) Martin Walker/Richard Joseph 1992/1993
- ;-----------------------------------------------------------------------------
-
- ;VERSION DETAILS
- ;4.6 - Mute added
- ;4.5 - Status added
- ;4.4 - SNES_CLR added/Globoffset added to readout
- ;4.3 - callnum acknowledge
- ;4.2 - 04/08/93 SNES anti-hang bug added in Boot_APU
- ; new Sound_Init & Send_Data
- ;4.1 - 26/07/93 External Volume added
- ;4.0 - 18/05/93 ClockSync added
- ;3.4 - 25/03/93 joy up and #$3f removed
- ;3.2 - 04/03/93 upload ReceiveData routine added
- ;3.0 - 03/03/93 improved single byte download
- ;2.1 - 15/02/93 updated for 2 sample banks
-
- ;EQUATES
- APU_PORT0 equ $2140
- APU_PORT1 equ $2141
- APU_PORT2 equ $2142
- APU_PORT3 equ $2143
-
- SonyAddr equ $10 ;24 bit address (4 bytes used)
- callnum equ $14 ;inc's every call to confirm a new call
-
- ;-----------------------------------------------------------------------------
- PCsndcall equ $15 ;$FF=no call/ any other = call from PC
- PCsonybank equ $16 ;$FF=no call/ 0=PC forces SONY download
- PCsonybyte equ $17 ;$FF=no call/ 0=PC forces SONY download
- PCsonyvalue equ $18 ;value to send to SONY RAM
- PCsonyaddr equ $19 ;word address to send to SONY driver
- ;-----------------------------------------------------------------------------
-
- editnum equ $1B
- stick equ $1C
- ;-----------------------------------------------------------------------------
- SONYbuffer equ $1D ;start of 60 byte buffer for SONY upload
- SONYclock equ $56 ;bytes58/59 Internal SONY tick timer
- globoffset equ $58 ;byte 60
- trk0call equ $59 ;byte 61
- ;-----------------------------------------------------------------------------
- PCactive equ $5A ;set to $FF on 1st PC call
- ;-----------------------------------------------------------------------------
- SONYstatus equ $5B ;word read by ReceiveStatus from PORT1
- SONYtrk0call equ $5C ;& PORT2
-
- PCparameter equ $5D ;sony port1 value from PC
- ;-----------------------------------------------------------------------------
-
- COMPTR equ $7E ;ESYS buffer (2 bytes in page zero)
- COMBUF equ $80 ;ESYS buffer (length is COMLEN/about 70 bytes)
- RESTRT equ $8000 ;Main program start address
- COMAD equ $8028 ;The address of the comms interface
-
- ;Start of COMBUF is 16 bytes for header
- COMCTR equ COMBUF+16 ;Counter
- COMSUM equ COMCTR+2 ;Checksum
- COMVAL equ COMSUM+1 ;Temp reg
- COMINP equ COMVAL+1 ;Temp reg
-
-
- ;-----------------------------------------------------------------------------
- ;Macro Definitions
- ;-----------------------------------------------------------------------------
-
- SET16 MACRO
- rep %00110000 ;Enable 16-bit mode ie clear M&X
- ENDM
-
- CLR16 MACRO
- sep %00110000 ;Disable 16-bit mode ie set M&X
- ENDM
-
- SETLONGA MACRO
- rep %100000 ;16 Bit Accumulator
- ENDM
-
- CLRLONGA MACRO
- sep %100000 ;8 bit Accumulator
- ENDM
-
-
- ;-------------------------------------------------------------------------------
- ;INITIALISE SNES
- ;-----------------------------------------------------------------------------
- ORG $8000 ;Bank 0 (sent to ESYS @ $0000)
-
- CLR16 ;Hardware setup
-
- BEGIN: cld
- sei ;disable interrupts
- clc ;clc for 65816/sec for 6502
- xce ;set emulation mode
-
- lda #$8F
- sta $2100 ;forced blank
-
- jsr ClearRegisters
- jsr InitRegisters
- jmp BEGIN2
-
- ORG $8020
- db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
- db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF ;COMAD AREA
-
- ;-----------------------------------------------------------------------------
- ;Start of Debugger routines
- ;-----------------------------------------------------------------------------
- COMMS: ;Enter debugger if host PC waiting to transfer
- PHP
- PHA
- ASM10: LDA |COMAD ;'Read' port of comms link
- EOR #$C0 ;Bits 4-6 are used to determine if the comms is
- AND #$F0 ;enabled. Bit 7 set indicates that the host
- BNE ASM20 ;is waiting to transfer
- LDA #$C0 ;Breakpoint type
- STA <COMTYP
- JSR COMRT ;Enter debugger if host PC waiting
- ASM20: PLA
- PLP
- RTS ;Return to main program
- ;All regs preserved unless changed by host PC command
-
-
- ;-----------------------------------------------------------------------------
- ;This is the debugger.
- ;If a new bank was paged in, the previous value should be in the A
- ;reg. This can be read by the 'transfer registers' command.
- ;COMTYP holds the breakpoint type ($41-BRKPNT, $42-TRACE AND $C0-COMMS).
- ;-----------------------------------------------------------------------------
- COMRT: PHA ;Previous bank
- TXA
- PHA
- TYA
- PHA
- TSX
- TXA
- CLC
- ADC #10
- PHA ;Stack value
- COM10: LDA <COMTYP
- PHA
- CLD
- COM20: LDA |COMAD
- AND #$F0
- CMP #$40
- BEQ COM20 ;Wait for host PC (for DEBUG entry)
- LDA |COMAD+6 ;Reset port
- LDA |COMAD+4
- COM30: LDA |COMAD+3
- COM40: JSR COMRX ;Read first byte of header
- BCS COM70 ;Enter ram or exit
- CMP #0
- BEQ COM80 ;This command not used
- JSR COMCMD ;Execute command
- BCC COM30 ;If no error loop back for next command
- LDA |COMAD+2 ;Signal error to host PC
- LDA |COMAD+4
- LDA |COMAD+7
- COM60: LDA |COMAD ;Wait for host PC to disable comms with COMOFF
- AND #$F0
- CMP #$C0
- BEQ COM60
- JMP COM90 ;Exit
- COM70: BNE COM80 ;Jump if exit
- LDA |COMAD+6
- lda #$8F
- sta |$2100 ;forced blank
- lda #0
- sta |$4200 ;disable all NMI
- LDX #<CWTLN-1
- COM75: LDA |COMWT,X ;Copy routine into buffer
- STA COMBUF,X
- DEX
- BPL COM75
- JMP COMBUF ;Enter ram
-
- ;-----------------------------------------------------------------------------
- COMCT: LDA COMAD+2 ;Continue here after exiting ram
- lda #$01
- sta $4200 ;JOY-C Enable
- lda #$0F
- sta $2100 ;Release forced blank
- COM78: LDA COMAD ;Wait for acknowledgement from host PC
- AND #$F2
- CMP #$C0
- BEQ COM78
- JMP COM30
- COM80: LDA COMAD+6 ;Prepare for exit
- LDA COMAD+2
- COM90: PLA ;Get type
- PLA ;Clear SP value
- PLA
- TAY
- PLA
- TAX
- PLA ;Get bank
- RTS ;Exit
-
-
- ;-----------------------------------------------------------------------------
- TXACK: ;Wait for acknowledgement from host PC
- LDA COMAD
- AND #$F2
- CMP #$C0
- BEQ TXACK
- LDA COMAD+2
- CMD5: LDA COMAD
- AND #$F1
- EOR #$C0
- BEQ CMD5
- CMD7: CLC
- CMD8: RTS
-
- ;-----------------------------------------------------------------------------
- ;Execute command, A is command number
- ;-----------------------------------------------------------------------------
- COMCMD: TAY
- AND #$0F
- BEQ CMD7 ;Single byte command
- STA COMCTR
- LDA #0
- STA COMCTR+1
- LDA #COMBUF AND 255 ;& FOR KASM
- STA COMPTR
- LDA #COMBUF/256
- STA COMPTR+1
- TYA
- PHA
- JSR CRXB ;Load rest of header
- PLA
- BCS CMD8 ;Error
- TAY
- AND #$EF
- CMP #$02
- BNE CMD20 ;Jump if not transfer regs command
- TSX
- INX ;Allow for COMCMD return addr
- SEC ;Allow for COMCMD return addr
- ADC COMBUF
- STA COMPTR ;Offset
- LDA #$01 ;Stack addr
- STA COMPTR+1 ;Point to regs list on stack
- LDX COMBUF+1 ;Length
- LDA #0
- JMP CMD30
- CMD20: CMP #$05
- BNE CMD7 ;Return if not transfer memory command
- LDA COMBUF
- STA COMPTR
- LDA COMBUF+1
- STA COMPTR+1
- LDX COMBUF+3
- LDA COMBUF+4
- CMD30: STX COMCTR
- STA COMCTR+1
- TYA
- AND #$10
- BEQ CMD40
- JSR CTXBUF ;Send data
- BCS CMD50 ;Jump if error
- JSR TXACK ;Wait for acknowledgement
- JMP CMD50
- CMD40: JSR CRXBUF ;Load data
- CMD50: RTS
-
-
- ;-----------------------------------------------------------------------------
- ;This routine is copied into ram to allow the host PC access to the ESYS
- ;-----------------------------------------------------------------------------
- COMWT: LDA COMAD+2
- CWT10: LDX #0 ;Wait for command
- CWT20: DEX
- BNE CWT20
- LDA COMAD
- AND #$F0
- CMP #$C0
- BEQ CWT30 ;Jump if host PC waiting to send command
- CMP #$40
- BEQ CWT10
- BNE CWT50 ;Jump if comms disabled
- CWT30: LDA COMAD+3 ;Send acknowledgement
- CWT40: LDA COMAD
- AND #$F2
- CMP #$C0
- BEQ CWT60
- CMP #$C2
- BEQ CWT40
- LDA COMAD+2
- CWT50: JMP RESTRT ;Jump to start if comms disabled or ENDTRN called
- CWT60: JMP COMCT ;Jump back to debugger
-
- CWTLN EQU $-COMWT ;PC FOR KASM
- COMTYP EQU COMBUF+CWTLN ;Breakpoint type
- DBUGFL EQU COMTYP+1 ;Debug flag/counter
- COMLEN EQU CWTLN+2 ;Total length of buffer
-
-
- ;-----------------------------------------------------------------------------
- ;Transmit data to host PC
- ;HL points to data, BC is the length
- ;-----------------------------------------------------------------------------
- CTXBUF:
- LDA #0
- STA COMSUM
- CTX10: LDY #0
- LDA (COMPTR),Y
- INC COMPTR
- BNE CTX12
- INC COMPTR+1
- CTX12: TAY
- CLC
- ADC COMSUM ;Checksum
- STA COMSUM
- TYA
- JSR COMTX ;Send byte
- BCS CTX50 ;Error
- LDA COMCTR
- BNE CTX14
- DEC COMCTR+1
- CTX14: DEC COMCTR
- BNE CTX10
- LDA COMCTR+1
- BNE CTX10
- LDA COMSUM ;Send checksum
- ;Send a byte (in A)
- COMTX: STA COMVAL
- LDA #$C2
- STA COMINP
- LDX #2/2
- LDY #4
- SEC
- ROL COMVAL
- TXA
- CTX20: ROL A
- TAX
- CTX30: LDA COMAD ;Wait for handshake
- EOR COMINP
- AND #$F2
- BEQ CTX40
- EOR #$02
- BEQ CTX30
- AND #$70
- SEC
- BNE CTX50 ;Exit if comms disabled
- LDA COMINP
- AND #$08
- BNE CTX30
- CTX40: LDA COMINP ;Send first bit even if host PC is not ready
- ORA #$08
- STA COMINP
- LDA COMAD,X
- TYA
- EOR #$01
- TAY
- LDA COMINP
- EOR #$02
- STA COMINP
- LDA COMAD,Y
- TXA
- ROR A
- CLC
- ROL COMVAL
- BNE CTX20
- CLC
- CTX50: RTS
- ;On exit NC=send OK, C=comms disabled
-
-
- ;-----------------------------------------------------------------------------
- ;Receive data from host PC
- ;HL points to data, BC is the length
- ;-----------------------------------------------------------------------------
- CRXBUF:
- LDA #0
- CRXB: STA COMSUM
- CRXLP: JSR COMRX ;Load byte
- BCS CRX6 ;Error
- LDY #0
- STA (COMPTR),Y
- INC COMPTR
- BNE CRX2
- INC COMPTR+1
- CRX2: CLC
- ADC COMSUM
- STA COMSUM
- LDA COMCTR
- BNE CRX4
- DEC COMCTR+1
- CRX4: DEC COMCTR
- BNE CRXLP
- LDA COMCTR+1
- BNE CRXLP
- JSR COMRX ;Load checksum
- BCS CRX6 ;Error
- EOR COMSUM
- CLC
- ADC #$FF ;Signal error if checksums do not match
- CRX6: RTS
- ;On exit NC=load OK, C=comms disabled or error
-
-
- ;-----------------------------------------------------------------------------
- ;Receive a byte from host PC
- ;-----------------------------------------------------------------------------
- COMRX:
- LDX #6
- LDA #$01
- STA COMVAL
- LDA #$C0
- STA COMINP
- CRX10: LDA COMAD ;Wait for handshake
- AND #$F2
- EOR COMINP
- BEQ CRX20
- EOR #$02
- BEQ CRX10
- EOR COMINP
- EOR #$42
- BNE CRX15 ;Jump if comms disabled
- LDA COMVAL ;Check for 'enter ram' command
- EOR #3
- CRX15: SEC
- RTS
- CRX20:
- TXA
- EOR #$01
- TAX
- LDA COMINP
- EOR #$02
- STA COMINP
- LDA COMAD
- CMP COMAD,X
- ROR A
- ROL COMVAL
- BCC CRX10
- LDA COMVAL
- CLC
- RTS
- ;On exit NC=load OK, value in A
- ; C and A=0 - Enter ram command
- ; C and A<>0 - Comms transfer ended
-
-
-
-
- ;-----------------------------------------------------------------------------
- BEGIN2: jsr Sound_Init
- CLR16
- lda #0
- sta <editnum
- sta <PCparameter
- lda #$FF
- sta <PCsndcall
- sta <PCsonybank
- sta <PCsonybyte
- sta <PCsonyvalue
- sta <PCactive
-
- ;-----------------------------------------------------------------------------
- ;JOYSTICK READ LOOP
- ;-------------------------------------------------------------------------------
- MAINLOOP:
- CLRLONGA ;1st ensure full 6502 mode
- CLR16
- jsr COMMS
-
- CALLchk lda <PCsndcall ;check for sound call from PC
- cmp #$FF
- beq ROMchk
- sta <PCactive ;start 'ReceiveData'
- ldx <PCparameter ;#$FF ;full volume
- jsr SendSound ;sound call from PC
- lda #$FF
- sta <PCsndcall ;cancel flag
- jmp JOYchk
-
-
- ROMchk lda <PCsonybank ;check for download call from PC
- cmp #$FF
- beq SONYchk
- sta <PCactive ;start 'ReceiveData'
- jsr Send_Data
- lda #$FF
- sta <PCsonybank ;cancel flag
-
-
- SONYchk lda <PCsonybyte ;check for byte edit from PC
- cmp #$FF
- beq JOYchk
- jsr SendByte
- lda #$FF
- sta <PCsonybyte ;cancel flag
-
-
- JOYchk jsr ReadJoy ;full brightness (1 Vblank)
- ldx <stick
- txa
- and #8
- bne UPKEY
- txa
- and #4
- bne DNKEY
- txa
- and #$20
- bne SELECT
- txa
- and #$10
- bne STRTBUT
- txa
- and #$40
- bne YBUT
- bra RELEASE
-
- UPKEY lda <editnum
- inc a
- sta <editnum
- bra KEYEND
-
- DNKEY lda <editnum
- dec a
- bpl down2
- lda #0
- down2: sta <editnum
- bra KEYEND
-
- SELECT lda #$80
- jsr SendSound
- bra KEYEND
-
- YBUT lda #$81
- jsr SendSound
- bra KEYEND
-
-
- STRTBUT lda <editnum
- ldx #$FF ;full volume
- jsr SendSound
- bra KEYEND
-
-
- KEYEND jsr ReadJoy ;full brightness
- lda <stick
- cmp #0
- bne KEYEND ;wait for key release
-
-
- RELEASE ldx #$08
- stx $2100 ;set to half brightness
- lda <PCactive
- cmp #$FF
- beq RDskip ;ignore 'ReceiveData' until any PC call
- ; jsr Info_Mode
- jsr ReceiveStatus
- jsr ReceiveData ;1 upload per 40mS (2 Vblanks)
- ; lda <SONYstatus ;add these 2 lines for checking status
- ; sta <globoffset
- lda <SONYtrk0call ;add these 2 lines for checking trk0call
- sta <trk0call ;move value to end of SONY buffer
- RDskip jsr WaitVB
- jmp MAINLOOP ;i.e. every 5 ReadAllChannels @ 8mS
-
-
-
-
- ;-------------------------------------------------------------------------------
- ;SUBROUTINES
- ;-------------------------------------------------------------------------------
- Info_Mode: CLR16
- php
- sei ;disable any other interrupts
- I_M0: lda >APU_PORT0 ;latest value sent by SOUND CPU
- cmp <callnum
- bne I_M0 ;previous call still not finished
-
- lda #$83 ;INFOMODE
- sta >APU_PORT0
- lda #0 ;0=status(default)/1=clock
- sta >APU_PORT1
- inc <callnum
- lda <callnum
- sta >APU_PORT3 ;forces a new call
- plp ;restore any interrupts
- rts
-
-
-
- ;-----------------------------------------------------------------------------
- ReceiveClock: SETLONGA ;clock is waiting in PORT1 & 2
- lda >APU_PORT1 ;16 bit (get data word)
- sta <SONYclock ;PORT1=low byte/PORT2=high byte
- CLRLONGA ;top bit of PORT2='0' (running)
- rts ;='1' (all sound stopped)
-
- ReceiveStatus: SETLONGA
- lda >APU_PORT1 ;bits 0-7 are '0' (channel active)
- sta <SONYstatus
- CLRLONGA
- rts ;'1' (channel stopped)
-
- ;-----------------------------------------------------------------------------
- ReceiveData: CLR16
- php
- sei ;disable any other interrupts
- RD_0: lda >APU_PORT0 ;latest value sent by SOUND CPU
- cmp <callnum
- bne RD_0 ;previous call still not finished
-
- lda #$85 ;RECEIVE data
- sta >APU_PORT0
- inc <callnum
- lda <callnum
- sta >APU_PORT3 ;confirms a new call
-
- ldy #0
- RD_wait: lda >APU_PORT0
- cmp <callnum
- bne RD_wait ;wait for SOUND CPU 'READY'
-
- lda >APU_PORT1
- sta SONYbuffer,y ;store data byte
- inc <callnum
- lda <callnum
- sta >APU_PORT3 ;confirms byte received
-
- iny
- cpy #60
- bcc RD_wait
-
- plp
- rts
-
-
- ;-------------------------------------------------------------------------------
- SendByte: CLR16
- php
- sei ;disable any other interrupts
- SB_0: lda >APU_PORT0 ;latest value sent by SOUND CPU
- cmp <callnum
- bne SB_0 ;previous call still not finished
-
- lda #$84 ;DOWNLOAD byte (music)
- sta >APU_PORT0
- lda <PCsonyaddr
- sta >APU_PORT1
- lda <PCsonyaddr+1
- sta >APU_PORT2 ;place address on PORTs 1 & 2
- inc <callnum
- lda <callnum
- sta >APU_PORT3 ;confirms a new call
-
- SB_wait lda >APU_PORT0
- cmp <callnum
- bne SB_wait ;'address received' acknowledge
-
- lda <PCsonyvalue ;now place edited byte on PORT1
- sta >APU_PORT1
- inc <callnum
- lda <callnum
- sta >APU_PORT3 ;confirms byte ready
- plp ;restore any interrupts
- rts
-
-
- ;-----------------------------------------------------------------------------
- SendSound: CLR16
- pha ;save call number
- lda >APU_PORT0 ;latest value sent by SOUND CPU
- cmp <callnum
- bne SoundAbort ;previous call still not finished
- pla
- sta >APU_PORT0 ;store new call
- txa
- sta >APU_PORT1 ;store new volume
- inc <callnum
- lda <callnum
- sta >APU_PORT3 ;confirms a new call
- rts
- SoundAbort: pla
- rts
-
-
- ;-----------------------------------------------------------------------------
- Send_Data: CLR16
- php
- sei ;disable any other interrupts
- S_D0: lda >APU_PORT0 ;latest value sent by SOUND CPU
- cmp <callnum
- bne S_D0 ;previous call still not finished
-
- lda #$82 ;DOWNLOAD data (music)
- sta >APU_PORT0
- inc <callnum
- lda <callnum
- sta >APU_PORT3 ;forces a new call
- SET16
- lda #Musicdata
- sta <SonyAddr
- lda #Musicdata>>16
- sta <SonyAddr+2
- jsr SONY_send
-
- sta >APU_PORT3
- plp ;restore any interrupts
- rts
-
- ;-----------------------------------------------------------------------------
- Send_Mute: CLR16
- php
- sei ;disable any other interrupts
- S_M0: lda >APU_PORT0 ;latest value sent by SOUND CPU
- cmp <callnum
- bne S_M0 ;previous call still not finished
-
- lda #$86 ;MUTE
- sta >APU_PORT0
- txa
- sta >APU_PORT1 ;store new mute value
- inc <callnum
- lda <callnum
- sta >APU_PORT3 ;forces a new call
- plp ;restore any interrupts
- rts
-
- ;-----------------------------------------------------------------------------
- Sound_Init: php
- sei ;disable any other interrupts
- SET16
- lda #MusicInit ;download SNES_CLR.BIN (24 bit address)
- sta <SonyAddr lda #RamII
- lda #MusicInit>>16
- sta <SonyAddr+2
- jsr Boot_APU ;exits straight to IPLROM
-
- SET16
- lda #MusicDriver ;download driver (24 bit address)
- sta <SonyAddr lda #RamII
- lda #MusicDriver>>16
- sta <SonyAddr+2
- jsr SONY_send
-
- lda #$82 ;DOWNLOAD data (music)
- sta >APU_PORT0
- SET16
- lda #Musicdata
- sta <SonyAddr
- lda #Musicdata>>16
- sta <SonyAddr+2
- jsr SONY_send
-
- lda #$82 ;DOWNLOAD data (samples)
- sta >APU_PORT0
- SET16
- lda #Samples1
- sta <SonyAddr
- lda #Samples1>>16
- sta <SonyAddr+2
- jsr SONY_send
-
- lda #$82 ;DOWNLOAD data (samples)
- sta >APU_PORT0
- SET16
- lda #Samples2
- sta <SonyAddr
- lda #Samples2>>16
- sta <SonyAddr+2
- jsr SONY_send
- sta >APU_PORT3 ;init PORT3 to $FF
- plp ;restore any interrupts
- rts
-
- ;-----------------------------------------------------------------------------
- SONY_send: jsr Boot_APU
- CLR16
- @wait0: lda >APU_PORT0 ;wait for handshake
- bne @wait0
- dec a
- sta >APU_PORT2 ;acknowledge handshake
- sta <callnum ;init call number to $FF
- rts
-
- ;-------------------------------------------------------------------------------
- ;SOUND BOOT LOADER V1.1 (from Appendix D of the SNES manual)
- ;-------------------------------------------------------------------------------
- Boot_APU: php
- SET16
- ldy #|$0000 ;16 bit
- lda #$bbaa
- boot_initial: cmp >APU_PORT0 ;16 bit (i.e. check PORT0 & PORT1)
- bne boot_initial ;wait for SONY init state
- CLRLONGA
- lda #$cc
- bra boot_entry1
-
- boot_repeat: lda [SonyAddr],y
- iny
- xba
- lda #0
- bra boot_entry2
- boot_loop: xba
- lda [SonyAddr],y
- iny
- xba
- boot_wait1: cmp >APU_PORT0
- bne boot_wait1 ;wait till accepted
- inc a
- boot_entry2: SETLONGA
- sta >APU_PORT0 ;16 bit (i.e. to PORT0 & PORT1)
- CLRLONGA
- dex ;16 bit data quantity
- bne boot_loop
- boot_wait2: cmp >APU_PORT0
- bne boot_wait2
- boot_zero: adc #3
- beq boot_zero
- boot_entry1: pha
- SETLONGA
- lda [SonyAddr],y ;16 bit (get data quantity word)
- iny
- iny ;skip past word
- tax ;& save data quantity word in x
- lda [SonyAddr],y ;16 bit (get transfer address)
- iny
- iny
- sta >APU_PORT2 ;16 bit (store to PORT2 & PORT3)
- CLRLONGA
- cpx #|0001 ;set carry if >=1 (16 bits)
- lda #00
- rol a ;a=1 (if quantity is 1 or more)
- sta >APU_PORT1 ;PORT1 = 1 (more) or 0 (end)
- adc #$7f ;A=$80 (more) or $7F (end)
- pla
- sta >APU_PORT0
- ; cpx #|0001 ;REV.D anti-hang mod
- ; bcc boot_ret ;REV.D anti-hang mod
- boot_wait3: cmp >APU_PORT0
- bne boot_wait3
- bvs boot_repeat ;if more
- boot_ret: plp
- rts
-
-
- ;-----------------------------------------------------------------------------
- ClearRegisters: jsr ClearMod
- jsr ClearMod
- rts
-
- ClearMod SET16
- ldy #|0000
- lda #|0000
- ClearLoop sta |$2100,y
- iny
- iny
- cpy #$210c
- bcc Clearloop
- CLR16
- rts
-
- ;-----------------------------------------------------------------------------
- InitRegisters: CLR16
- lda #$00 ;Mode 0
- sta $2105
- stz $2106 ;Mosaic off
- stz $2107
- stz $2108
- stz $2109
- stz $210A ; Screen size (Four 2x2)
-
- lda #$02
- sta $210B
- stz $210C ; Character address. (Null)
-
- lda #$30
- sta $2130
- lda #$e0
- sta $2132
-
- stz $2133 ; SetIn
- lda #$01
- sta $212c ; Main Screen Destination
- sta $212d
-
- lda #$01
- sta $211e
- stz $211e
- lda #01
- sta $211b
- stz $211b
-
- stz $2106 ;Turn off Mosaic
-
- lda #$ff
- sta $4201
- lda #$01
- sta $4200 ; JOY-C Enable
- lda #$01
- sta $4212 ; Automatic Joystick?
- lda $4016
- and #$fe
- sta $4016 ; Standard NES Joystick Registers
-
- stz $2121 ;WRITE COLOURS TO COLOUR REGISTERS
- lda #$00
- ldx #$00
- colour: clc
- adc #$12
- sta $2122
- sta $2122
- dex
- bne colour
-
-
- lda #$80 ;Fill VRAM with rubbish
- sta $2115
- lda #$00
- sta $2116
- stz $2117
- lda #$0f
- ldy #$00
- rubbishfill ldx #$00
- smallfill sta $2118
- sta $2119
- dex
- bne smallfill
- dey
- bne rubbishfill
-
-
- stz |$0044
- stz $2116
- stz $2117
- ldy #$00
- tloop1 ldx #$00
- tloop2 lda $2139
- cmp #$0f
- bne hang
- dex
- bne tloop2
- dey
- bne tloop1
- jmp missem
- hang lda #$44
- sta |$0044 ;needed?
-
- missem: CLR16
- lda #$0F
- sta $2100 ;Release forced blank
- rts
-
- ;-------------------------------------------------------------------------------
- ReadJoy: CLR16
- ldx #$0f
- stx $2100 ;full brightness
- jsr WaitVB
- ReadJ2: lda $4212
- and #$80
- bne ReadJ2 ;wait for non-blanking period
- ReadJ3: lda $4212
- and #$01
- bne ReadJ3
- lda $4219
- sta <stick
- rts
-
- ;-----------------------------------------------------------------------------
- WaitVB: pha
- VB_Loop1: lda $4212
- and #$80
- bne VB_Loop1 ; Wait for Non Blanking period
- VB_Loop2: lda $4212
- and #$80
- beq VB_Loop2 ; Now, wait for Blanking Period.
- pla
- rts
-
-
- ;-------------------------------------------------------------------------------
- ;Binary data file section
- ;-------------------------------------------------------------------------------
- MusicDriver: include C:\martin\snes\D-SNES34.BIN (bin)
- DriverEnd:
-
- ORG $9300
- MusicData: include c:\martin\snes\spawn1sn.snd (bin)
- Bank1end:
-
- ORG $FF00
- MusicInit: include C:\martin\snes\SONY-CLR.BIN (bin)
-
- ORG $FFE6
- DW BEGIN ;65C816 BRK vector
- ORG $FFFC
- DW BEGIN ;6502 reset button jump vector
- ;-----------------------------------------------------------------------------
- ORG $10000 ;BANK 1 ESYS ROM address
- ; include INTRO_1.BIN (bin)
- ; include IGNIT_1.BIN (bin)
- ; include STEEL_1.BIN (bin)
- ; include c:\martin\snes\BEAT_1.BIN (bin)
- include c:\martin\snes\spawn1.bin (bin)
-
- ORG $18000 ;BANK 1 assembly address
- Samples1:
- ;-----------------------------------------------------------------------------
- ORG $18000 ;BANK 2 ESYS ROM address
- ; include INTRO_2.BIN (bin)
- ; include IGNIT_2.BIN (bin)
- ; include STEEL_2.BIN (bin)
- ; include c:\martin\snes\BEAT_2.BIN (bin)
- include c:\martin\snes\spawn1a.bin (bin)
-
- ORG $28000 ;BANK 2 assembly address
- Samples2:
- ;-----------------------------------------------------------------------------
-