ff3:ff3us:doc:asm:ram:sound_music_ram

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

ff3:ff3us:doc:asm:ram:sound_music_ram [2016/03/12 22:47]
everything created
ff3:ff3us:doc:asm:ram:sound_music_ram [2019/02/12 10:04]
Line 1: Line 1:
-====== Sound/Music RAM ====== 
- 
-This is a list of the RAM locations used by the sound/music program. The code that uses this data is in bank C5. This page also lists RAM locations used by the SPC-700 sound chip. 
- 
-==== $1300-$1400: Sound/Music RAM ==== 
- 
-        $1300 SPC Command (byte 0) 
-        $1301 SPC Command (byte 1) 
-        $1302 SPC Command (byte 2) 
-        $1303 SPC Command (byte 3) 
-        $1304 Current Song Command (byte 0) 
-        $1305 Current Song Command (byte 1) 
-        $1306 Current Song Command (byte 2) 
-        $1307 Current Song Command (byte 3) 
-        $1308 Previous Song Command (byte 0) 
-        $1309 Previous Song Command (byte 1) 
-        $130A Previous Song Command (byte 2) 
-        $130B Previous Song Command (byte 3) 
-   
-      ++$1310 Pointer to instrument brr data 
-       +$131C Pointer to next instrument (brr data) in SPC 
- 
-===== SPC-700 RAM Map ===== 
- 
-==== $0000-$00FF: SPC Direct Page 0 ==== 
- 
-     +$00 Song Script Offset 
-     +$02 Song Script Pointer (2 bytes per voice) 
-     +$12 Sound Effect Song Script Pointer (2 bytes per voice) 
-      $22 Key On (bitmask) -> DSP $4C 
-      $23 Key On (for paused song, bitmask) 
-      $24 Key Off (bitmask) -> DSP $5C (set when note duration counter is $02) 
-      $25 Note Duration Counter 
-      $26 Pointer to Loop Count (+$F920/+$F940) 
-      $35 Voice Duration Counter (sound effect) 
-      $36 Pointer to Loop Count (sound effect, +$F920/+$F940) 
-     +$45 Current Tempo in beats per minute (high byte active) 
-      $47 Tempo Counter 
-      $48 Sound Effect Tempo Counter (always 120) 
-      $49 Tempo Envelope Counter 
-     +$4A Tempo Envelope Change Rate 
-     +$4C Echo Volume (high byte active) -> DSP $2C & $3C 
-     +$4E Echo Volume Envelope Change Rate 
-      $50 Echo Volume Envelope Counter 
-      $51 Song Volume 
-      $52 Enabled Voices (bitmask, cleared if voice has no song script) 
-      $53 Enable Echo (bitmask) 
-      $54 Enable Echo (bitmask, sound effect) 
-      $55 Enable Noise (bitmask) 
-      $56 Enable Noise (bitmask, sound effect) 
-      $57 Enable Pitch Mod (bitmask) 
-      $58 Enable Pitch Mod (bitmask, sound effect) 
-      $59 Disable Key Off at End of Note (bitmask, used for ties, slurs, and drum rolls) 
-      $5A Disable Key Off at End of Note (bitmask, sound effect) 
-      $5B Enable Slur (bitmask, set before first slurred note) 
-      $5C Enable Slur (bitmask, sound effect) 
-      $5D Activate Slur (bitmask, set after first slurred note) 
-      $5E Activate Slur (bitmask, sound effect) 
-      $5F Enable Drum Roll (bitmask, disables key off at end of note) 
-      $60 Enable Drum Roll (bitmask, sound effect) 
-      $61 Ignore Song Volume (bitmask) 
-      $62 Noise Clock Value 
-      $63 Noise Clock Value (sound effect) 
-      $64 - 
-  $65-$74 Filter Data (8 values, 2 bytes each, high bytes active) -> DSP $0F-$7F 
-     +$75 Echo Feedback (signed, high byte active) -> DSP $0D 
-      $77 Filter Envelope Counter 
-      $78 Echo Feedback Envelope Counter 
-     +$79 Echo Feedback Envelope Change Rate 
-      $7B Output Code 
-      $7C - 
-      $7D - 
-      $7E - 
-      $7F - 
-      $80 new echo delay value 
-      $81 echo buffer wait time 
-      $82 - 
-      $83 Game Sound effect (type 2) voices (bitmask) 
-      $84 System sound effect (type 1) voices (bitmask) 
-      $85 ----v??m 
-          v: enable master volume envelope output mode (interrupt command $80/$81) 
-          m: enable mono mode (interrupt command $F3) 
-      $86 weft---- 
-          w: enable waveform output mode (interrupt command $FF/$01) 
-          e: disable echo (interrupt command $FF/$02) 
-          f: fast forward 
-          t: update first/last 4 voices for waveform output mode (toggles every frame) 
-      $87 Enable Echo (bitmask) -> DSP $4D 
-      $88 Enable Noise (bitmask) -> DSP $3D 
-      $89 Enable Pitch Mod (bitmask) -> DSP $2D 
-      $8A DSP Flags -> DSP $6C 
-          rmennnnn 
-          r: DSP reset 
-          m: mute all 
-          e: echo disable 
-          n: noise generator frequency 
-  $8B-$93 scratchpad 
-      $8B interrupt command b0 
-      $8C interrupt command b1 
-      $8D interrupt command b2 
-      $8E interrupt command b3 
-      $8F bitmask for current voice 
-      
-  $98-$9B scratchpad 
-   
-      $A0 Active Voices 
-      $A1 current octave 
-      $A2 Current Op Code/Note 
-      $A3 Voice Pointer 
-      $A4 Muted Voices (bitmask) 
-   
-  $A5-$BF Master Envelope Data (counters decrement every 39ms, 25.64 Hz) 
-  ------- 
-     +$A5 Master Volume (high byte active) 
-     +$A7 Sound Effect Volume (high byte active, affects game sound effects only) 
-     +$A9 Master volume envelope change rate 
-     +$AB Sound Effect volume envelop change rate 
-      $AD Master volume envelope counter 
-      $AE - 
-      $AF Sound effect volume envelope counter 
-      $B0 - 
-     +$B1 Sound Effect Pan (high byte active) 
-     +$B3 Sound Effect Pan envelope change rate 
-      $B5 Sound Effect Pan envelope counter 
-     +$B7 Tempo Ratio (interrupt command $84, high byte active) 
-     +$B8 Tempo Ratio Envelope Change Rate 
-      $BA Tempo Ratio Envelope Counter 
-     +$BB Master Pitch Multiplier (high byte active) 
-     +$BD Master Pitch Multiplier envelope change rate 
-      $BF Master Pitch Multiplier envelope counter 
-      
-  $C0-$C3 Pitch Calculation Data 
-  ------- 
-     +$C0 Calculated Frequency Value 
-     +$C2 Note Pitch Multiplier 
-      $C3  
-      $C4 Pointer to Song Start Offsets (+$1C02) 
-      $C6 Paused Song Index 
-      $C7 Current Song Index 
-      $C8 Master Envelope Frame Counter (8 * 4.875 milliseconds, clears every 39 milliseconds/25.64 Hz) 
-  $C9-$D8 Calculated volume for each voice (2 bytes each, left then right, used for waveform output mode) 
-      $D9 Paused Voices (bitmask) 
-      $DA Paused Game Sound Effects (bitmask) 
-      $DB Enable volume update in DSP (bitmask) 
-      $DC Enable pitch update in DSP (bitmask) 
-      $DD Enable Conditional Jump (bitmask) 
-  $DE-$EF - 
-   
-  $F0-$FF Hardware Registers 
-  ------- 
-      $F0 (test) 
-      $F1 --ab-xyz 
-          a: clear port-0 and port-1 
-          b: clear port-2 and port-3 
-          x: start timer-0 
-          y: start timer-1 
-          z: start timer-2 
-      $F2 DSP Address 
-      $F3 DSP Data 
-      $F4 Port-0 
-      $F5 Port-1 
-      $F6 Port-2 
-      $F7 Port-3 
-      $F8 - 
-      $F9 - 
-      $FA Timer-0 
-      $FB Timer-1 
-      $FC Timer-2 
-      $FD Counter-0 (4.875 milliseconds) 
-      $FE Counter-1 (16 milliseconds) 
-      $FF Counter-2 (78.125 microseconds) 
- 
-==== $0100-$01FF: SPC Direct Page 1 ==== 
- 
-  $00-$0F Filter Envelope Change Rate 
-      $10 Vibrato Delay (in ticks) 
-      $11 Vibrato Delay Counter 
-      $30 Tremolo Delay (in ticks) 
-      $31 Tremolo Delay Counter 
-      $50 Pitch Envelope Target (signed, in half steps, clears when a new note is played) 
-      $51 Vibrato Amplitude (unsigned fraction, low 6 bits active) 
-      $70 mmaaaaaa 
-          m: tremolo mode (0/1 = positive, 2 = negative, 3 = balanced) 
-          a: tremolo amplitude (unsigned fraction, low 6 bits active) 
-      $71 (pansweep) 
-      $90 -ttt-vvv 
-          t: tremolo gain counter (doesn't work because of a bug) 
-          v: vibrato gain counter (linear envelope lasting 4 cycles when vibrato begins, unused if vibrato delay is 0) 
-      $91 - 
-  $B0-$FF CPU Stack 
-   
-==== $0200-$19FF: SPC Code ==== 
- 
-  $178F-$17A8 Note Pitch Multipliers ($1000 * 2 ^ ((x - 12) / 12)) 
-  $17A9-$17D0 Filter Data (8 bytes each) 
-  $17D1-$17DE Note Durations 
-  $17DF-$17FE Pointers to System Sound Effect Scripts 
-  $17FF-$1880 System Sound Effect Data 
-  $1881-$18F8 Jump Table for Op Codes 
-  $18F9-$1934 Number of Bytes for each Op Code 
-  $1935-$1954 Jump Table for Interrupts $10-$1F 
-  $1955-$1974 Jump Table for Interrupts $80-$8F 
-  $1975-$1994 Jump Table for Interrupts $F0-$FF 
-  $1995-$19A5 Pointers to DSP Registers 
-  $19A6-$19B6 Pointers to DSP Data in dp 0 
-  $19B7-$19FF - 
-   
-==== $1A00-$F5FF: Misc. Data ==== 
- 
-  $1A00-$1A7F Instrument Pitch Multipliers (2 bytes each, high byte then low byte) 
-  $1A80-$1AFF ADSR Data (2 bytes each, gdddaaa then sssrrrrr) 
-  $1B00-$1BFF Pointers to BRR Waveform Data (4 bytes each, start then loop start) 
-  $1C00-$2BFF Song Scripts 
-  $2C00-$2FFF Pointers to Game Sound Effects (4 bytes each, voice A then voice B) 
-  $3000-$47FF Game Sound Effect Data 
-  $4800-$7CFF BRR Data 
-  $7D00-$F5FF Echo Buffer (assuming max echo delay value of 15, 240ms) 
-   
-==== $F600-$FFBF: Voice Data ==== 
- 
-        $F600 Octave 
-        $F601 Instrument 
-       +$F620 Voice Volume (upper byte active) 
-       +$F640 Voice Envelope Change Rate 
-       +$F660 Pan (0100 = left, 8000 = center, FF00 = right, upper byte active) 
-       +$F680 Pan Envelope Change Rate 
-        $F6A0 Volume Envelope Counter (crescendo/decrescendo) 
-        $F6A1 Pan Envelope Counter (panslide) 
-        $F6C0 Vibrato Cycle Duration (wave period = 4.875ms * this value * 2) 
-        $F6C1 Vibrato Cycle Counter 
-        $F6E0 Tremolo Cycle Duration 
-        $F6E1 Tremolo Cycle Counter 
-        $F700 (pansweep) 
-        $F701 (pansweep) 
-        $F720 Pitch Envelope Duration 
-        $F721 Transpose (in half steps, signed) 
-       +$F740 Instrument Pitch Multiplier 
-        $F760 Detune 
-        $F761 Absolute Pitch 
-       +$F780 (pansweep) 
-       +$F7A0 (pansweep) 
-       +$F7C0 Maximum Vibrato Change Rate (amplitude / cycle duration) 
-       +$F7E0 Vibrato Change Rate (signed) 
-       +$F800 Maximum Tremolo Change Rate (amplitude / cycle duration) 
-       +$F820 Tremolo Change Rate (signed) 
-       +$F840 Vibrato Value (signed fraction, high byte active) 
-       +$F860 Tremolo Value (signed fraction, high byte active) 
-       +$F880 (pansweep) 
-       +$F8A0 (pansweep) 
-       +$F8C0 Calculated Vibrato Value (added directly to frequency) 
-       +$F8E0 Calculated Frequency Value 
-       +$F900 ADSR Data 
-        $F920 Repeat Count (8 voices, 4 bytes per voice, counts up) 
-        $F940 Loop Counter (16 voices, 4 bytes per voice, counts down) 
-       +$F980 Loop Start Script Pointer (16 voices, 8 bytes per voice) 
-  $FA00-$FDFF Voice Data for Paused Song 
-  $FE00-$FEFF Saved dp 0 (first $80 bytes) 
-  $FF00-$FF9F Saved dp 1 (first $A0 bytes) 
- 
-==== $FFC0-$FFFF: SPC IPL-ROM ==== 
- 
-===== Other SPC Data ===== 
- 
-==== Note Lengths ==== 
- 
-  0: Whole Note                   C0 
-  1: Half Note                    60 
-  2: Half Note Triplet            40 
-  3: Dotted Quarter Note          48 
-  4: Quarter Note                 30 
-  5: Quarter Note Triplet         20 
-  6: Dotted Eighth Note           24 
-  7: Eighth Note                  18 
-  8: Triplet                      10 
-  9: Sixteenth Note               0C 
-  A: Sixteenth Note Triplet       08 
-  B: Thirty-second Note           06 
-  C: Thirty-second Note Tripet    04 
-  D: Sixty-fourth Note            03 
-   
-==== Note Names ==== 
- 
-  0: C       00-0D 
-  1: C#/Db   0E-1B 
-  2: D       1C-29 
-  3: D#/Eb   2A-37 
-  4: E       38-45 
-  5: F       46-53 
-  6: F#/Gb   54-61 
-  7: G       62-6F 
-  8: G#/Ab   70-7D 
-  9: A       7E-8B 
-  A: A#/Bb   8C-99 
-  B: B       9A-A7 
-  C: Tie     A8-B5 
-  D: Rest    B6-C3 
-   
-==== SPC Command Codes ==== 
- 
-  C4: xx       $11D3 Set Voice Volume to xx (00-7F) 
-  C5: xx yy    $11E4 Set Voice Volume w/ Envelope (yy: volume, xx: envelope duration) 
-  C6: xx       $1236 Set Voice Pan to (xx: 01 = Left, 40 = Center, 7F = Right, top bit inactive) 
-  C7: xx yy    $1246 Set Voice Pan w/ Envelope (yy: 01 = Left, 40 = Center, 7F = Right, top bit inactive, xx = envelope duration) 
-  C8: xx yy    $1266 Change Pitch w/ Envelope (xx: envelope duration, yy: change in pitch, signed) 
-  C9: xx yy zz $12E3 Enable Vibrato (xx: delay in ticks, yy: cycle duration, ??zzzzzz: amplitude, max 1/4 step) 
-  CA:          $138C Disable Vibrato 
-  CB: xx yy zz $1396 Enable Tremolo (xx: delay in ticks, yy: cycle duration, ??zzzzzz: amplitude, max 50%) 
-  CC:          $13EA Disable Tremolo 
-  CD: xx yy    $13F4 Enable Pansweep (xx: delay in ticks, yy: cycle duration) 
-  CE:          $144A Disable Pansweep 
-  CF: xx       $14CB Set Noise Clock (00-1F) 
-  D0:          $148D Enable Noise 
-  D1:          $14BB Disable Noise 
-  D2:          $14D9 Enable Pitch Modulation 
-  D3:          $14F2 Disable Pitch Modulation 
-  D4:          $1464 Enable Echo 
-  D5:          $147D Disable Echo 
-  D6: xx       $1460 Set Octave to xx 
-  D7:          $1456 Increment Octave 
-  D8:          $145C Decrement Octave 
-  D9: xx       $1275 Set Transpose 
-  DA: xx       $1271 Add to Transpose 
-  DB: xx       $174E Set Detune 
-  DC: xx       $1502 Set Instrument 
-  DD: xx       $1538 Set ADSR Attack Value (0-15) 
-  DE: xx       $1568 Set ADSR Decay Value (0-7) 
-  DF: xx       $157B Set ADSR Sustain Value (0-7) 
-  E0: xx       $158D Set ADSR Release Value (0-31) 
-  E1:          $159D Reset ADSR Default Values 
-  E2: xx       $16C0 Loop Start (loop xx+1 times) 
-  E3:          $16F0 Loop End 
-  E4:          $15B4 Enable Slur (key on at beginning of first note only, no key off at end of note unless the next note is a rest) 
-  E5:          $0FD3 Disable Slur 
-  E6:          $15DE Enable Drum Roll (no key off at end of note unless the next note is a rest) 
-  E7:          $0FD3 Disable Drum Roll 
-  E8: xx       $174B Add to Note Duration (xx = duration in ticks) 
-  E9: xx       $1602 Play Game Sound Effect (voice A) 
-  EA: xx       $1606 Play Game Sound Effect (voice B) 
-  EB:          $1770 End of Script 
-  EC:          $1770 End of Script 
-  ED:          $1770 End of Script 
-  EE:          $1770 End of Script 
-  EF:          $1770 End of Script 
-  F0: xx       $11AF Set Tempo 
-  F1: xx yy    $11B8 Set Tempo w/ Envelope 
-  F2: xx       $1205 Set Song Echo Volume 
-  F3: xx yy    $1212 Set Song Echo Volume w/ Envelope 
-  F4: xx       $11D0 Set Song Volume 
-  F5: xx yyyy  $1665 Jump to yyyy When Loop Count Reaches xx 
-  F6: xxxx     $164A Jump to xxxx 
-  F7: xx yy    $1279 Set Echo Feedback to yy over xx frames 
-  F8: xx yy    $129B Set Filter ------yy 
-  F9:          $1752 Increment Output Code 
-  FA:          $1755 Clear Output Code 
-  FB:          $15B0 Ignore Song Volume 
-  FC: xxxx     $1759 Conditional Jump to xxxx 
-  FD:          $1770 End of Script 
-  FE:          $1770 End of Script 
-  FF:          $1770 End of Script 
-   
-==== SPC Interrupt Codes ==== 
- 
-  00:                No Interrupt 
-  10: xx yy    $0A1E Load New Song (x: song number, y: master volume) 
-  11: xx yy    $0A26 Load New Song (pause current song) 
-  14: xx yy    $0A1B Long New Song (alternate start position) 
-  15: xx yy    $0A23 Long New Song (alternate start position, pause current song) 
-  18: xx yy    $0B3D Game Sound Effect (x: sound effect number, y: pan value [$80 = center]) 
-  20:                Cursor (select) 
-  21:                Cursor (move/cancel) 
-  22:                Error 
-  23:                Ring (Success) 
-  24:                Delete/Erase 
-  28:                Ba-ding high (character becomes active in battle) 
-  29:                Ba-ding low (character controlled by player 2 becomes active in battle) 
-  2C:                Ching 
-  30-3F              Quick Load Song $00-$0F at full volume (scpu commands, no effect in spc) 
-  80: xx yy    $0C6A Set master/sound effect volume to yy (w/ envelope xx) 
-  81: xx yy    $0C6A Set master volume to yy (w/ envelope xx) 
-  82: xx yy    $0C6A Set sound effect volume to yy (w/ envelope xx) 
-  83: xx yy    $0CE5 Set sound effect pan to yy (w/ envelope xx) 
-  84: xx yy    $0D09 Set Tempo Ratio (yy = envelope duration, xx = tempo ratio, signed fraction) 
-  85: xx yy    $0D35 Change Pitch 
-  89:          $0F9C Enable Conditional Jump (used by Phantom Train and Dancing Mad) 
-  F0:          $0D6F Stop song & sound effect 
-  F1:          $0D6F Stop song 
-  F2:          $0D6F Stop sound effect 
-  F3: xx       $0D61 Enable/Disable Mono Mode (x: 0 = disable mono mode, 1 = enable mono mode) 
-  F4: xx       $0DC3 Mute Voices (x: voices to mute, bitmask) 
-  F5: xx       $0DCA Pause/Unpause music (0 = unpause, 1 = pause) 
-  F6: xx       $0F83 Enable/Disable Fast Forward (0 = disable, 1 = enable) 
-  FC: xx       $1002 Set Echo Delay to xx 
-  FD: xx yy    $0FE8 Set DSP Register xx with data yy 
-  FE: xx       $0E38 Transfer Data from SCPU 
-                     00: no transfer 
-                     01: transfer one byte at a time 
-                     02: transfer two bytes at a time 
-                     03: transfer three bytes at a time 
-                     07: move chunk 
-  FF: xx yy    $0FA3 Reset Codes 
-                     01: enable/disable waveform output mode (y: 0 = disable, 1 = enable) 
-                     02: enable/disable echo (y: 0 = disable, 1 = enable) 
-                     F0: reset spc 
-   
-==== Signed Fractions ==== 
- 
-  $80: 1/2x 
-  $A0: 5/8x 
-  $C0: 3/4x 
-  $E0: 7/8x 
-  $00:   1x 
-  $20: 5/4x 
-  $40: 3/2x 
-  $60: 7/4x 
-  $7F:   2x 
-   
-==== Song Format ==== 
- 
-  2 bytes preceding data in the ROM are the length of the song 
-     +$00 Song Start Address (HiROM) 
-     +$02 Song End Address (HiROM) 
-  $04-$13 Voice Start Addresses (HiROM) 
-  $14-$23 Voice Start Addresses (HiROM, alternate start position) 
-  $24-EOF Song Data 
  
  • ff3/ff3us/doc/asm/ram/sound_music_ram.txt
  • Last modified: 5 years ago
  • (external edit)