;****************************************************************************
; Hardware addresses
;****************************************************************************
Sona_Z80Ram: equ $A00000 ; Z80 RAM start
Sona_Z80RamEnd: equ $A02000 ; Z80 RAM end
Sona_Z80BusReq: equ $A11100 ; Z80 bus request
Sona_Z80Reset: equ $A11200 ; Z80 reset line
;****************************************************************************
; Driver addresses used to communicate with the 68000 and such
;****************************************************************************
Sona_InstrList: equ Sona_Z80Ram+$1C00 ; Instrument list
; $1C00..$1CFF = address low
; $1D00..$1DFF = address high
; $1E00..$1EFF = bank
Sona_VmVars: equ Sona_Z80Ram+$1F00 ; Location of VM variables
Sona_QueueMutex: equ Sona_Z80Ram+$1FC0 ; Command queue mutex
; 0 if 68000 can touch the queue
Sona_QueueSlotSize: equ 12
Sona_QueueSlot1: equ Sona_Z80RamEnd-Sona_QueueSlotSize ; Slot #1
Sona_QueueSlot2: equ Sona_QueueSlot1-Sona_QueueSlotSize ; Slot #2
Sona_QueueSlot3: equ Sona_QueueSlot2-Sona_QueueSlotSize ; Slot #3
Sona_CpuMeter: equ Sona_Z80Ram+$1FC1 ; Z80 CPU meter
Sona_StatusFlags: equ Sona_Z80Ram+$1FC2 ; Playback status flags
;****************************************************************************
; Status flags returned by Sona_GetStatus
; These are for use with the BTST instruction
;****************************************************************************
SONA_STATUS_BGM: equ 4 ; BGM playing
SONA_STATUS_SFX1: equ 5 ; SFX stream #1 playing
SONA_STATUS_SFX2: equ 6 ; SFX stream #2 playing
SONA_STATUS_SFX3: equ 7 ; SFX stream #3 playing
SONA_STATUS_PCM1: equ 0 ; PCM ch1 playing
SONA_STATUS_PCM2: equ 1 ; PCM ch2 playing
;****************************************************************************
; Command types to pass to Sona_SendCmd_* functions
;****************************************************************************
SONA_CMD_PLAYPCM1: equ 1 ; Play directly over PCM1
SONA_CMD_PLAYPCM2: equ 2 ; Play directly over PCM2
SONA_CMD_STOPPCM1: equ 3 ; Stop directly PCM1
SONA_CMD_STOPPCM2: equ 4 ; Stop directly PCM2
SONA_CMD_PLAYBGM: equ 5 ; Play BGM
SONA_CMD_PLAYSFX: equ 6 ; Play SFX
SONA_CMD_STOPALL: equ 7 ; Stop all sound
SONA_CMD_PAUSE: equ 8 ; Pause playback
SONA_CMD_UNPAUSE: equ 9 ; Resume playback
SONA_CMD_SETSTEREO: equ 10 ; Toggle stereo/mono
SONA_CMD_SETSSGEG: equ 11 ; Toggle SSG-EG
;****************************************************************************
; List of stream opcodes
;****************************************************************************
SONA_OP_LOAD_FM1: equ $00 ; Load instrument FM1
SONA_OP_LOAD_FM2: equ $01 ; Load instrument FM2
SONA_OP_LOAD_FM3: equ $02 ; Load instrument FM3
SONA_OP_LOAD_FM3SP: equ $03 ; Load instrument FM3
SONA_OP_LOAD_FM4: equ $04 ; Load instrument FM4
SONA_OP_LOAD_FM5: equ $05 ; Load instrument FM5
SONA_OP_LOAD_FM6: equ $06 ; Load instrument FM6
SONA_OP_LOAD_PSG1: equ $08 ; Load instrument PSG1
SONA_OP_LOAD_PSG2: equ $09 ; Load instrument PSG2
SONA_OP_LOAD_PSG3: equ $0A ; Load instrument PSG3
SONA_OP_LOAD_PSG4: equ $0B ; Load instrument PSG4
SONA_OP_KEYON_FM1: equ $10 ; Key-on FM1
SONA_OP_KEYON_FM2: equ $11 ; Key-on FM2
SONA_OP_KEYON_FM3: equ $12 ; Key-on FM3 (normal)
SONA_OP_KEYON_FM3SP: equ $13 ; Key-on FM3 (special)
SONA_OP_KEYON_FM4: equ $14 ; Key-on FM4
SONA_OP_KEYON_FM5: equ $15 ; Key-on FM5
SONA_OP_KEYON_FM6: equ $16 ; Key-on FM6
SONA_OP_KEYON_PSG1: equ $18 ; Key-on PSG1
SONA_OP_KEYON_PSG2: equ $19 ; Key-on PSG2
SONA_OP_KEYON_PSG3: equ $1A ; Key-on PSG3
SONA_OP_KEYON_PSG4: equ $1B ; Key-on PSG4
SONA_OP_KEYON_PCM1: equ $1E ; Play PCM1
SONA_OP_KEYON_PCM2: equ $1F ; Play PCM2
SONA_OP_KEYOFF_FM1: equ $20 ; Key-off FM1
SONA_OP_KEYOFF_FM2: equ $21 ; Key-off FM2
SONA_OP_KEYOFF_FM3: equ $22 ; Key-off FM3
SONA_OP_KEYOFF_FM3SP: equ $23 ; Key-off FM3
SONA_OP_KEYOFF_FM4: equ $24 ; Key-off FM4
SONA_OP_KEYOFF_FM5: equ $25 ; Key-off FM5
SONA_OP_KEYOFF_FM6: equ $26 ; Key-off FM6
SONA_OP_KEYOFF_PSG1: equ $28 ; Key-off PSG1
SONA_OP_KEYOFF_PSG2: equ $29 ; Key-off PSG2
SONA_OP_KEYOFF_PSG3: equ $2A ; Key-off PSG3
SONA_OP_KEYOFF_PSG4: equ $2B ; Key-off PSG4
SONA_OP_KEYOFF_PCM1: equ $2E ; Stop PCM1
SONA_OP_KEYOFF_PCM2: equ $2F ; Stop PCM2
SONA_OP_PITCH_FM1: equ $30 ; Set pitch FM1
SONA_OP_PITCH_FM2: equ $31 ; Set pitch FM2
SONA_OP_PITCH_FM3: equ $32 ; Set pitch FM3 (normal)
SONA_OP_PITCH_FM3SP: equ $33 ; Set pitch FM3 (special)
SONA_OP_PITCH_FM4: equ $34 ; Set pitch FM4
SONA_OP_PITCH_FM5: equ $35 ; Set pitch FM5
SONA_OP_PITCH_FM6: equ $36 ; Set pitch FM6
SONA_OP_PITCH_PSG1: equ $38 ; Set pitch PSG1
SONA_OP_PITCH_PSG2: equ $39 ; Set pitch PSG2
SONA_OP_PITCH_PSG3: equ $3A ; Set pitch PSG3
SONA_OP_PITCH_PSG4: equ $3B ; Set pitch PSG4
SONA_OP_VOLUME_FM1: equ $40 ; Set volume FM1
SONA_OP_VOLUME_FM2: equ $41 ; Set volume FM2
SONA_OP_VOLUME_FM3: equ $42 ; Set volume FM3
SONA_OP_VOLUME_FM3SP: equ $43 ; Set volume FM3
SONA_OP_VOLUME_FM4: equ $44 ; Set volume FM4
SONA_OP_VOLUME_FM5: equ $45 ; Set volume FM5
SONA_OP_VOLUME_FM6: equ $46 ; Set volume FM6
SONA_OP_VOLUME_PSG1: equ $48 ; Set volume PSG1
SONA_OP_VOLUME_PSG2: equ $49 ; Set volume PSG2
SONA_OP_VOLUME_PSG3: equ $4A ; Set volume PSG3
SONA_OP_VOLUME_PSG4: equ $4B ; Set volume PSG4
SONA_OP_PAN_FM1: equ $50 ; Set panning FM1
SONA_OP_PAN_FM2: equ $51 ; Set panning FM2
SONA_OP_PAN_FM3: equ $52 ; Set panning FM3
SONA_OP_PAN_FM3SP: equ $53 ; Set panning FM3
SONA_OP_PAN_FM4: equ $54 ; Set panning FM4
SONA_OP_PAN_FM5: equ $55 ; Set panning FM5
SONA_OP_PAN_FM6: equ $56 ; Set panning FM6
SONA_OP_PMSAMS_FM1: equ $58 ; Set PMS/AMS FM1
SONA_OP_PMSAMS_FM2: equ $59 ; Set PMS/AMS FM2
SONA_OP_PMSAMS_FM3: equ $5A ; Set PMS/AMS FM3
SONA_OP_PMSAMS_FM3SP: equ $5B ; Set PMS/AMS FM3
SONA_OP_PMSAMS_FM4: equ $5C ; Set PMS/AMS FM4
SONA_OP_PMSAMS_FM5: equ $5D ; Set PMS/AMS FM5
SONA_OP_PMSAMS_FM6: equ $5E ; Set PMS/AMS FM6
SONA_OP_VMMOVE_IMM: equ $C0 ; VM: var[dest] ← src
SONA_OP_VMMOVE_VAR: equ $C1 ; VM: var[dest] ← var[src]
SONA_OP_VMADD_IMM: equ $C2 ; VM: var[dest] ← var[dest] + src
SONA_OP_VMADD_VAR: equ $C3 ; VM: var[dest] ← var[dest] + var[src]
SONA_OP_VMSUB_IMM: equ $C4 ; VM: var[dest] ← var[dest] - src
SONA_OP_VMSUB_VAR: equ $C5 ; VM: var[dest] ← var[dest] - var[src]
SONA_OP_VMAND_IMM: equ $C6 ; VM: var[dest] ← var[dest] & src
SONA_OP_VMAND_VAR: equ $C7 ; VM: var[dest] ← var[dest] & var[src]
SONA_OP_VMOR_IMM: equ $C8 ; VM: var[dest] ← var[dest] | src
SONA_OP_VMOR_VAR: equ $C9 ; VM: var[dest] ← var[dest] | var[src]
SONA_OP_VMXOR_IMM: equ $CA ; VM: var[dest] ← var[dest] ^ src
SONA_OP_VMXOR_VAR: equ $CB ; VM: var[dest] ← var[dest] ^ var[src]
SONA_OP_VMNEG: equ $CC ; VM: var[dest] ← -var[dest]
SONA_OP_VMNOT: equ $CD ; VM: var[dest] ← ~var[dest]
SONA_OP_VMINC: equ $CE ; VM: var[dest] ← var[dest] + 1
SONA_OP_VMDEC: equ $CF ; VM: var[dest] ← var[dest] - 1
SONA_OP_QDELAY_1: equ $D0 ; Delay 1 tick
SONA_OP_QDELAY_2: equ $D1 ; Delay 2 ticks
SONA_OP_QDELAY_3: equ $D2 ; Delay 3 ticks
SONA_OP_QDELAY_4: equ $D3 ; Delay 4 ticks
SONA_OP_QDELAY_5: equ $D4 ; Delay 5 ticks
SONA_OP_QDELAY_6: equ $D5 ; Delay 6 ticks
SONA_OP_QDELAY_7: equ $D6 ; Delay 7 ticks
SONA_OP_QDELAY_8: equ $D7 ; Delay 8 ticks
SONA_OP_QDELAY_9: equ $D8 ; Delay 9 ticks
SONA_OP_QDELAY_10: equ $D9 ; Delay 10 ticks
SONA_OP_QDELAY_11: equ $DA ; Delay 11 ticks
SONA_OP_QDELAY_12: equ $DB ; Delay 12 ticks
SONA_OP_QDELAY_13: equ $DC ; Delay 13 ticks
SONA_OP_QDELAY_14: equ $DD ; Delay 14 ticks
SONA_OP_QDELAY_15: equ $DE ; Delay 15 ticks
SONA_OP_QDELAY_16: equ $DF ; Delay 16 ticks
SONA_OP_VARARG: equ $F7 ; Arguments come from VM variables
SONA_OP_YMREG1: equ $F8 ; Write YM2612 register (bank 1)
SONA_OP_YMREG2: equ $F9 ; Write YM2612 register (bank 2)
SONA_OP_TEMPO: equ $FA ; Set BGM tempo
SONA_OP_LFO: equ $FB ; Set LFO setting
SONA_OP_SETLOOP: equ $FC ; Set loop point
SONA_OP_GOTOLOOP: equ $FD ; Go to loop point
SONA_OP_DELAY: equ $FE ; Long delay
SONA_OP_STOP: equ $FF ; End of stream
;****************************************************************************
; Pitch values for SONA_KEYON_* and SONA_PITCH_*
;****************************************************************************
SONA_C: equ $00 ; C semitone
SONA_CS: equ $08 ; C# semitone
SONA_D: equ $10 ; D semitone
SONA_DS: equ $18 ; D# semitone
SONA_E: equ $20 ; E semitone
SONA_F: equ $28 ; F semitone
SONA_FS: equ $30 ; F# semitone
SONA_G: equ $38 ; G semitone
SONA_GS: equ $40 ; G# semitone
SONA_A: equ $48 ; A semitone
SONA_AS: equ $50 ; A# semitone
SONA_B: equ $58 ; B semitone
SONA_FRAC: equ $70 ; Semitone fraction
;****************************************************************************
; Panning values for SONA_OP_PAN_FM*
;****************************************************************************
SONA_PAN_NONE: equ $00 ; Muted
SONA_PAN_LEFT: equ $80 ; Left speaker only
SONA_PAN_RIGHT: equ $40 ; Right speaker only
SONA_PAN_BOTH: equ $C0 ; Both speakers
;****************************************************************************
; Sona_PadTo32 [macro]
; Pads to the next 32 byte boundary.
;****************************************************************************
Sona_PadTo32 macro
dcb.b (-(*&$1F))&$1F, 0
endm
;****************************************************************************
; Sona_RequestBus [macro]
; Requests the Z80 bus and waits until the Z80 stays off the bus.
;****************************************************************************
Sona_RequestBus macro
move.w #$100, (Sona_Z80BusReq)
btst #0, (Sona_Z80BusReq)
bne.s *-8
endm
;****************************************************************************
; Sona_ReleaseBus [macro]
; Releases the Z80 bus.
;****************************************************************************
Sona_ReleaseBus macro
move.w #$000, (Sona_Z80BusReq)
endm