; The following program is a reassembly of the c64-soundchip emulation routines
; written by Alfatech/Triad ooops I mean Alfatech/Censor. I have tried to make
; this code as readable as possible in order to help people get started with
; snes SPC700 sound programming.

Ŀ
 THANKS TO ABSOLUTELY EVERYONE FOR BEING SUCH A LACK OF A HELP!!!!  (grrrr) 


; especially you guys on #snes, #snes!, famidev; Corsair, Pothead, Sir Jinx,
; and the rest of the Internet!
; or in other words, i had to find out everything myself again.  :(
; And no, I still dont have an assembler for the spc700, just a disassembler :(
; thats why you will notice the big lack of pseudoopcodes, macros etc.   :((

;----------------------------------------------------------------------------

; Well first let us remember how a sound usually works on the C64. The C64
; sound chip is located at memory $d400 to $d41b, with these memory locations
; having the following (registers) meaning:

hexadec.
address     meaning;  /bit7/bit6/bit5/bit4/bit3/bit2/bit1/bit0/

d400        frequency to play lobyte      voice 1
d401        frequency to play hibyte      voice 1
d402        pulsewidth        lobyte
d403        pulsewidth        hibyte bit 7-4 unused: max width:=$07ff
d404        Waveform: noise/pulse/sawtooth/triangle/test/ringmod/syncmod/gate
d405        attack decay    (4 bit attack,  4bit decay)
d406        sustain release (4 bit sustain, 4bit release)

d407        frequency to play lobyte      voice 2
d408        frequency to play hibyte      voice 2
d409        pulsewidth        lobyte
d40a        pulsewidth        hibyte bit 7-4 unused: max width:=$07ff
d40b        Waveform: noise/pulse/sawtooth/triangle/test/ringmod/syncmod/gate
d40c        attack decay    (4 bit attack,  4bit decay)
d40d        sustain release (4 bit sustain, 4bit release)

d40e        frequency to play lobyte      voice 3
d40f        frequency to play hibyte      voice 3
d410        pulsewidth        lobyte
d411        pulsewidth        hibyte bit 7-4 unused: max width:=$07ff
d412        Waveform: noise/pulse/sawtooth/triangle/test/ringmod/syncmod/gate
d413        attack decay    (4 bit attack,  4bit decay)
d414        sustain release (4 bit sustain, 4bit release)

d415        filter frequency lowbyte. bit 7-3 unused...
d416        filter frequency highbyte
d417        filter resonance upper 4 bits/filtex/filt3,2,1 (=select filter type)
d418        3off/highpass/medpass/lowpass/vol3/vol2/vol1/vol0
d419        unused
d41a        unused
d41b        unused too for this case ;)
d41c        unused too for this case ;)


A typical C64 sound routine consist of two parts, an INIT subroutine and a
PLAYER subroutine. The INIT routine clears the sound chip registers and
initializes all kind of pointers and variables for the PLAYER routine.
The PLAYER routine is typically being called once every time the screen makes
the vertical blank (VBL), thus, once the 24th part of a second.

SO, if one emulates the c64 SID, he has at least to do the following:

- move the C64 sound routine to ram at $7f0000  (64 k ram)
- call the C64 sound PLAYER routine every VBL. The NMI of the SNES is
  perfectly suitable to do this, but you can also do an IRQ routine of
  your own.
- Immidately afterwards, you should send the memory loactions $7fd400 to $7fd418
  from SNES RAM memory to SPC RAM memory, using send (65c18) and receive
  (spc700) routines of your own.
- After receiving and putting in his own RAM memory, the SPC700 shall
  evaluate the new RAM data, set its own DSP registers accordingly and
  start playing, if appropriate.


; Before you jump at the supposedly source code, let me warn that my
; SPC disassembler seems to have some slight bugs, as well as my SPC manual.
; the opcode $8f (mov $xx, #$yy) seems, accordingly to this sourcecode
; move the value xx into the mem location yy. Thus the real syntax of this
; command should be:  mov #$xx, $yy
; e.g  8f 00 f6   mov #$00, $f6  ; move the value "00" into memory location $f6.
; take note of this when reading this source code.



;-------------------------------------------------
;SPC700 Disassembler v0.1
;Loading Blocks
;Block 00: start $0400 length $07DB
;Execution Address: $0400
;-------------------------------------------------



;------------------------------------------------------------------
; Reassembly work (c) Antitrack Oct-17-1994
;------------------------------------------------------------------



0400 20         CLRP                  ;  clear direct page flag
0401 CD CF      MOV     X,#$CF        ;  x:=$cf
0403 BD         MOV     SP,X          ;  stack pointer := x
0404 8F FF F4   MOV     $FF,#$F4      ;  2140 = ff
0407 E8 00      MOV     A,#$00        ;  a := 0
0409 5D         MOV     X,A           ;  x := 0
040A AF         MOV     (X)+,A        ; Ŀ   clear 0000-00ef
040B C8 F0      CMP     X,#$F0        ;  
040D D0 FB      BNE     $040A         ; 
040F 5D         MOV     X,A           ;  x := 0
0410 D5 00 01   MOV     $0100+X,A     ; Ŀ  clear 0100-03ff
0413 D5 00 02   MOV     $0200+X,A     ;   
0416 D5 00 03   MOV     $0300+X,A     ;   
0419 3D         INC     X             ;   
041A D0 F4      BNE     $0410         ; 
041C 8F 00 F1   MOV     $00,#$F1      ;  port clear reg: do not clear ports.
041F 8F 30 F1   MOV     $30,#$F1      ;  clear 2140-2143 aka 00f4-00f7
0422 3F 4C 0A   CALL    $0A4C         ;  init and clear all dsp registers

; if you have read the comments at $0a4c , you remembered I had told you we
will have some very important data at $0200 real soon now. This data is the
table of pointers to the start of each sample, so indeed its important. :)
The following loop below will move the table from $09fc to $0200 and make
it more appropriate, that is, if you consider the bytes at $09fc being:

09fc:    $ww $xx $yy $zz

the table at $0200 will be like the following:

0200:    $ww $xx $ww $xx $yy $zz $yy $zz   and so on.

or in other words, each 16 bit that appreared at $09fc (a word) will now
appear twice at 0200:

09fc:  dc.w  word1, word2, word3, word4....

0200:  dc.w  word1, word1, word2, word2, word3, word3, word4, word4


This table at $09fc contains the start pointers of all samples.  When you
e.g. use sample 10, the DSP now looks at $0200+10 and finds the pointer to
the sample. Neat innit?


0425 CD 00      MOV     X,#$00        ;  I think this is understood now. :)
0427 8D 00      MOV     Y,#$00        ;
0429 F5 FC 09   MOV     A,$09FC+X     ;
042C D6 00 02   MOV     $0200+Y,A     ;
042F D6 02 02   MOV     $0202+Y,A     ;
0432 3D         INC     X             ;
0433 FC         INC     Y             ;
0434 F5 FC 09   MOV     A,$09FC+X     ;
0437 D6 00 02   MOV     $0200+Y,A     ;
043A D6 02 02   MOV     $0202+Y,A     ;
043D 3D         INC     X             ;
043E FC         INC     Y             ;
043F FC         INC     Y             ;
0440 FC         INC     Y             ;
0441 C8 50      CMP     X,#$50        ; this means we have got $25 samples,
0443 D0 E4      BNE     $0429         ; which is decimal 37 samples. Makes
                                      ; perfect sense if you look at the
                                      ; sample table where we start at
                                      ; sample 0 and end with sample 36.

;-----------------------------------------------------------------
; Anyway now we really have finished initializing a lot. We initialized
; the DSP, we set up the sample pointer table, etc. etc.  now its time
; for the real action.... hopefully (bleugh, sweat, cough, etc....)
; The real action is: First we have to get the SID data from the 65c816 to
; the SPC's ram; we will receive the data through the ports 2140-43 (from
; the 65c816's point of view) and $f4-f7 (from the spc700's point).
;-----------------------------------------------------------------


0445 8F 00 F6   MOV     $00,#$F6      ;  00 into 2142

; At 0448 is the (endless) main loop. Endless, that is, except a reset code
; was received through the ports.

0448 8F FD F4   MOV     $FD,#$F4      ;  fd into 2140
044B 78 FE F4   CMP     $FE,#$F4      ;  wait till 2140=fe
044E D0 FB      BNE     $044B         ;
0450 8F FE F4   MOV     $FE,#$F4      ;  answer to the 65c816 by returning $fe
0453 CD 00      MOV     X,#$00        ;  X:=0
0455 3E F4      CMP     X,$F4         ;  wait for $00 in 2140 from the 65816
0457 D0 FC      BNE     $0455         ;
0459 E4 F5      MOV     A,$F5         ;  data ready in 2141
045B D4 80      MOV     $80+X,A       ;  poke $d400-$d414 into $0080-$0095
045D 3D         INC     X             ;     (7fd400/65c816)    (spc700)
045E D8 F4      MOV     $F4,X         ; I guess this also means he doesnt emu-
0460 C8 15      CMP     X,#$15        ; late the filter of the 64 soundchip !!
0462 D0 F1      BNE     $0455         ;

:----------------------------voice one emulation start here-----------------


0464 E4 84      MOV     A,$84         ; $d404: check waveform
0466 28 7F      AND     A,#$7F        ; mask out the 7th bit (noise waveform)
0468 68 24      CMP     A,#$24        ; check for SAWTOOTH+RINGMODULATION wave
046A D0 07      BNE     $0473         ; if no SAWTOOTH+RING, jmp to 0473
046C 8F 34 F2   MOV     $34,#$F2      ; DSP register 34: voice 3, SAMPLE.
046F C4 F3      MOV     $F3,A         ; we select sample $24 for SAWT+RING
0471 2F 48      BRA     $04BB         ; sample $24 (36 dec.) is empty, SAW+RING is
                                      ; thus not implemented here!!!

0473 5D         MOV     X,A           ; This code is exec if NO SAW+RING.
                                      ; X=A=actual waveform.
0474 28 20      AND     A,#$20        ; check for waveform=SAWTOOTH.
0476 F0 16      BEQ     $048E         ; NO sawtooth, continue at 048e
0478 E4 84      MOV     A,$84         ; get voice1 waveform register again(d404)
047A 8F 90 72   MOV     $90,#$72      ; 72/73 now point to $0990 ! which is the
047D 8F 09 73   MOV     $09,#$73      ; sample #37's memory location.
0480 FA 83 7A   MOV     $83<d>,$7A<s> ; well this seems to be another bug of
                                      ; either the disassembler or the manual,
; or both. Let me explain. The only thing that makes sense and that happens
; here is: the contents of ram location $0083 is being moved to
; 007a. or to speak BASIC: poke $7a, peek($83) / poke $7b, peek 84 (not sure)

; This implies the <d> and <s> should be vice versa, shoudnt they.
; Explanation: 83 contains the pulseHI width value, a backup of the pulse
; width value is being made to mem loc 7a - the subroutine that will
; be called soon (0b61) needs it that way. Akku still contains the waveform
; register, d404.


0483 3F 61 0B   CALL    $0B61         ;  calculate sample 37 (see there)
0486 8F 34 F2   MOV     $34,#$F2      ;  voice 3, byte 4, source number: select
0489 8F 25 F3   MOV     $25,#$F3      ;  sample #37, much to noones surprise :)
048C 2F 1E      BRA     $04AC         ;  and go to 04ac

;
; Here we go if there is no sawtooth to play...
;

048E 7D         MOV     A,X           ;  a=x=d404=(waveform and #$7f) (bit7=0)
048F 68 03      CMP     A,#$03        ;  all wave off, sync+gate on?
0491 D0 09      BNE     $049C         ;  if not, goto 049c

;
; This is the code we execute if there is no(?) waveform to play but the
; gate and syncronisation bits are both set....
;

0493 18 08 7B   OR      $08,#$7B     ; if sync+gate on, select random wave-
                                     ; form for the DSP and lower the volume
                                     ; by shifting SID's sustain/release.



0496 4B 86      LSR     $86           ; shifting c64's sustain/release
0498 4B 86      LSR     $86           ; right by two.
                                      ; if the old bits were ssssrrrr, they
                                      ; are now      00ssssrr.
                                      ; (2 zerobits, 4 bit sustain , 2 release)
049A 2F 1F      BRA     $04BB         ; jmp to 04bb


049C 68 02      CMP     A,#$02        ; Syncronsisation on , gate off, ?
049E D0 03      BNE     $04A3         ; no, goto 04a3
04A0 60         CLRC                  ;
04A1 84 83      ADC     A,$83         ; YES: add pulseHIbyte  to accu



; remember here we also jump if the sync bit is not set at all. (bit1 of wave)
04A3 8F 34 F2   MOV     $34,#$F2      ; voice 3, byte 4: source number
04A6 1C         ASL     A             ; multiply accu by 2
04A7 60         CLRC                  ;
04A8 84 82      ADC     A,$82         ; add pulselow byte to accu
04AA C4 F3      MOV     $F3,A         ; resulting in the Selected sample value.

; now I really wonder if there could go something wrong. Imagine a tune
; playing waveform $41: (pulse wave + gate bit on); lets say its pulse low is
; $01. This would make us play sample ($41*2)+$01 = $83.
; This is a nonexistant sample value coz we have only got samples from $00
; to 50. I wonder if this is an actual bug in the routine here or
; if I am wrong.   :-)




04AC 8F 32 F2   MOV     $32,#$F2      ; voice 3, byte 2: pitch low!
04AF E4 80      MOV     A,$80         ; get d400: frequency low
04B1 28 F0      AND     A,#$F0        ; and it w $f0
04B3 C4 F3      MOV     $F3,A         ; resulting in the pitch low value!
04B5 8F 33 F2   MOV     $33,#$F2      ; voice 3, byte 3: pitch hi!
04B8 FA 81 F3   MOV     $81<d>,$F3<s> ; poke $f3, peek($81): pitch hi=d401!!!



04BB 8F 30 F2   MOV     $30,#$F2      ; voice 3, volume left:
04BE FA 86 F3   MOV     $86<d>,$F3<s> ; set volume left to c64 Sustain/Release?!
04C1 8F 31 F2   MOV     $31,#$F2      ; voice 3, volume right:
04C4 FA 86 F3   MOV     $86<d>,$F3<s> ; set volume right to c64 Sus/Release ??!!

; We seem to be finished w the emulation of voice1 of the 64's SID chip here.
; If SAWTOOTH was selected, the precalculated sample #37 is played.

; Whatever waveform it was anyway, we will use
; the same frequency that the c64 uses, except they dont call it frequency,
; they call it pitch.  :-)
; Puzzling things happen to the sustain/release bytes of the 64, they are
; nearly directly being poked into the _volume_ registers of the DSP.
; I am still speaking what should happen most of the time, i am not talking
; about syncronisation effect.
; The sync effect is obvioulsy included whilst the RINGMODULATION seems
; not to be included at all, which is a pity.

;-----------------------voice 2 emulation start here --------------------


04C7 E4 8B      MOV     A,$8B         ; accu=$8b=$d40b=waveform voice 2
04C9 28 7F      AND     A,#$7F        ; mask out noise bit
04CB 68 24      CMP     A,#$24        ; sawtooth+ringmod selected?
04CD D0 07      BNE     $04D6         ; if no, goto 04d6
04CF 8F 44 F2   MOV     $44,#$F2      ; voice 4, source number:
04D2 C4 F3      MOV     $F3,A         ; play sample #$24 = 36 = empty
                                ; thus we can see SAWT+RING is not implemented.
04D4 2F 48      BRA     $051E         ;  jmp to end of routine


04D6 5D         MOV     X,A           ; X=a, note that noise (bit7)=0    ?!!
04D7 28 20      AND     A,#$20        ; is the sawtooth bit on?
04D9 F0 16      BEQ     $04F1         ; NO, goto 04f1

04DB E4 8B      MOV     A,$8B         ; get $d40b (waveform reg) again into acc
04DD 8F B4 72   MOV     $B4,#$72      ; 72/73 point to 09b4: sample #38
04E0 8F 09 73   MOV     $09,#$73      ;
04E3 FA 8A 7A   MOV     $8A<d>,$7A<s> ; poke 7a, peek(8a): pulse hi voice 2
04E6 3F 61 0B   CALL    $0B61         ; calculate sample 38
04E9 8F 44 F2   MOV     $44,#$F2      ; voice 2 , source sample number
04EC 8F 26 F3   MOV     $26,#$F3      ; is #38, no surprise .
04EF 2F 1E      BRA     $050F         ; play sawtooth sample #38, end of routine

04F1 7D         MOV     A,X           ; no sawtooth
04F2 68 03      CMP     A,#$03        ; sync and gate on?
04F4 D0 09      BNE     $04FF         ; if no sync+gate, goto 04ff
04F6 18 10 7B   OR      $10,#$7B      ; Select Random samples YES
04F9 4B 8D      LSR     $8D           ; shift right sustain/release
04FB 4B 8D      LSR     $8D           ; ssssrrrr -> 00ssssrr
04FD 2F 1F      BRA     $051E         ; end of routine

04FF 68 02      CMP     A,#$02        ; sync on, gate off?`
0501 D0 03      BNE     $0506         ; no, goto 0506
0503 60         CLRC                  ;
0504 84 8A      ADC     A,$8A         ; add pulse hi to accu (to 02)
0506 8F 44 F2   MOV     $44,#$F2      ; voice 4 source number
0509 1C         ASL     A             ; multiply (pulsehi+2) * 2
050A 60         CLRC                  ;
050B 84 89      ADC     A,$89         ; add pulse low
050D C4 F3      MOV     $F3,A         ; and select it as sample # to play
050F 8F 42 F2   MOV     $42,#$F2      ; volume left
0512 E4 87      MOV     A,$87         ; frequency low
0514 28 F0      AND     A,#$F0        ; and freq low w %11110000
0516 C4 F3      MOV     $F3,A         ; put frequency low into pitch of voice4
0518 8F 43 F2   MOV     $43,#$F2      ; select voice 4, pitch high
051B FA 88 F3   MOV     $88<d>,$F3<s> ; put frequency hi into pitchhi of voice4
051E 8F 40 F2   MOV     $40,#$F2      ; select voice 4 volume left
0521 FA 8D F3   MOV     $8D<d>,$F3<s> ; put sustain/rel into voice 4 vol left
0524 8F 41 F2   MOV     $41,#$F2      ; select volume right voice 4
0527 FA 8D F3   MOV     $8D<d>,$F3<s> ; put sustain/rel into voice 4 vol right


;------------------------------------------voice 3 emulation start here


052A E4 92      MOV     A,$92         ; accu=$92=$d412=waveform voice 3
052C 28 7F      AND     A,#$7F        ; mask out noise bit (bit 7)
052E 68 24      CMP     A,#$24        ; sawtooth+ringmod selected?
0530 D0 07      BNE     $0539         ; if no, goto 0539
0532 8F 24 F2   MOV     $24,#$F2      ; voice 4, source number:
0535 C4 F3      MOV     $F3,A         ; play sample #$24 = 36 = empty
0537 2F 4A      BRA     $0583         ; we can see SAWT+RING is not implemented.
0539 5D         MOV     X,A           ; X=a, note that noise (bit7)=0    ?!!
053A 28 20      AND     A,#$20        ; is the sawtooth bit on?
053C F0 16      BEQ     $0554         ; NO, goto 04f1
053E E4 92      MOV     A,$92         ; get waveform of SIDvoice3 again
0540 8F D8 72   MOV     $D8,#$72      ; set 0072/0073 to point to 09d8
0543 8F 09 73   MOV     $09,#$73      ; 09d8 is sample #39
0546 FA 91 7A   MOV     $91<d>,$7A<s> ; make a backup of pulse hi in $007a
0549 3F 61 0B   CALL    $0B61         ; calculate sample #39
054C 8F 24 F2   MOV     $24,#$F2      ; select DSPvoice2, source number:
054F 8F 27 F3   MOV     $27,#$F3      ; set source number to #39, sample #39
0552 2F 20      BRA     $0574         ; end of routine
0554 7D         MOV     A,X           ; a=x=waveform SIDvoice3 and #$7f(bit7=0)
0555 68 03      CMP     A,#$03        ; is the gatebit and sync on?
0557 D0 09      BNE     $0562         ; no, end of routine
0559 18 04 7B   OR      $04,#$7B      ; yes: select NOISE for this voice and...
055C 4B 94      LSR     $94           ; change SID's sustain release bits from
055E 4B 94      LSR     $94           ; ssssrrrr to 00ssssrr by shifting, thus
                                      ; lowering the volume!
0560 2F 21      BRA     $0583         ; end of routine
0562 68 02      CMP     A,#$02        ; gatebit off, sync on?
0564 D0 04      BNE     $056A         ; no, end of routine
0566 60         CLRC                  ;
0567 84 91      ADC     A,$91         ; add SID pulse hi to accu (which=01)
0569 00         NOP                   ;
056A 1C         ASL     A             ; multiply by 2
056B 60         CLRC                  ;
056C 84 90      ADC     A,$90         ; add SID's pulse low
056E 5D         MOV     X,A           ; and store it in x register
056F 8F 24 F2   MOV     $24,#$F2      ; select DSPvoice2, sample #
0572 C4 F3      MOV     $F3,A         ; akku=sample #
0574 8F 22 F2   MOV     $22,#$F2      ; select DSPvoice2, reg2: pitch low
0577 E4 8E      MOV     A,$8E         ; SID frequency low
0579 28 F0      AND     A,#$F0        ; is anded with %11110000, and gives....
057B C4 F3      MOV     $F3,A         ; ...the value for DSPvoice2 pitch low
057D 8F 23 F2   MOV     $23,#$F2      ; select DSP voice 2 reg3: pitch hi
0580 FA 8F F3   MOV     $8F<d>,$F3<s> ; DSP pitch hi := SID freq hi
0583 8F 20 F2   MOV     $20,#$F2      ; select DSP voice 2 reg 0: volume left
0586 FA 94 F3   MOV     $94<d>,$F3<s> ; DSP vol left := SID Sustain/Release
0589 8F 21 F2   MOV     $21,#$F2      ; select DSP voice 2 reg 1: volume right
058C FA 94 F3   MOV     $94<d>,$F3<s> ; DSP vol right := SID Sustain/Release
058F 8F 3D F2   MOV     $3D,#$F2      ; !!! DSP noise on/off register

; now i understand! $7b is a ram memory location that is zeroed at the
; beginning. Some bits of $7b will contain either 0 or 1 , depending if
; a NOISE (random) waveform shall be played or not. These bits
; are being set during the emulation routines, watch for  "or xx, $7b".


0592 FA 7B F3   MOV     $7B<d>,$F3<s> ; set SID noise emulation if necessary
0595 FA 92 F6   MOV     $92<d>,$F6<s> ; DSP f6=2142, send a signal to 65c816
0598 D8 F7      MOV     $F7,X         ; send signal to 2143 / 65c816
059A 8F 00 7B   MOV     $00,#$7B      ; clear noise emulation bits
059D E4 F6      MOV     A,$F6         ; get a value from port 2142
059F 68 40      CMP     A,#$40        ; is it $40 ?
05A1 D0 15      BNE     $05B8         ; no, goto main loop
05A3 C4 F6      MOV     $F6,A         ; send value #$40 back to 2142/65c816
05A5 3F 4C 0A   CALL    $0A4C         ; init the sound chip registers!
05A8 CD 00      MOV     X,#$00        ;
05AA F5 9B 0B   MOV     A,$0B9B+X     ; move the reset routine to $ffc0
05AD D5 C0 FF   MOV     $FFC0+X,A     ; (needless coz its ROM and should
05B0 3D         INC     X             ; stay ROM anyway?!)
05B1 C8 40      CMP     X,#$40        ; move $40 bytes
05B3 D0 F5      BNE     $05AA         ;
05B5 5F C0 FF   JMP     $FFC0         ; make sound chip reset.
05B8 5F 48 04   JMP     $0448         ; main endless loop here

;-------------------------------------------------------------------------
;-------------------------------------------------------------------------
;------------------------THE SAMPLE DATA----------------------------------
;-------------------------------------------------------------------------
;-------------------------------------------------------------------------

; Here is the data area where all the samples start. They are grouped to-
; gether in groups of nine bytes, where the first byte contains header
; information, which is, in the following cases, either $b0 or $b3.
; It is $b0 all the time at the start of each sample, and $b3 to indicate
; that it is the last 9-byte-group of sample data.
; I dont know too much myself about the samples, so look up your manual
; will you  :)

; take note, below you will find sample 5 , sample 7, sample 9 etc up to
; sample 35 (giving 15 samples) and the difference between them is the
; amount of "$88" sample values instead of "$77" sample values. If you
; look at them you will easily see how each sample gets more and more
; $88 bytes instead of $77 bytes. The meaning ? I dunno.  :-)


;------------------------------------------------------------------
; Reassembly work (c) Antitrack Oct-17-1994
;------------------------------------------------------------------



;--------------------------------------------------------------------------
;--------------------------------------------------------------------------
;--------------------------------------------------------------------------


; 05bb is sample 5
05BB                                               B0   ....=.@.._.._H..
05BC  77 77 77 77 77 77 77 77-B3 77 77 77 77 77 77 77   wwwwwwww.wwwwwww
05CC  77


; 05cd is sample #7
05cd     B0 88 77 77 77 77 77-77 77 B3 77 77 77 77 77   w..wwwwwww.wwwww
05DC  77 77 77


; 05df is sample #9
05df           B0 88 88 77 77-77 77 77 77 B3 77 77 77   www...wwwwww.www
05EC  77 77 77 77 77


; 05f1 is sample #11
05f1                 B0 88 88-88 77 77 77 77 77 B3 77   wwwww....wwwww.w
05FC  77 77 77 77 77 77 77

; 0603 is sample #13
0603                       B0-88 88 88 88 77 77 77 77   wwwwwww.....wwww
060C  B3 77 77 77 77 77 77 77-77

; 0615 is sample #15
0615                             B0 88 88 88 88 88 77   .wwwwwwww......w
061C  77 77 B3 77 77 77 77 77-77 77 77

; 0627 is sample #17
0627                                   B0 88 88 88 88   ww.wwwwwwww.....
062C  88 88 77 77 B3 77 77 77-77 77 77 77 77

; 0639 is sample #19
0639                                         B0 88 88   ..ww.wwwwwwww...
063C  88 88 88 88 88 77 B3 77-77 77 77 77 77 77 77

; 064b is sample #21
064b                                               B0   .....w.wwwwwwww.
064C  88 88 88 88 88 88 88 88-B3 77 77 77 77 77 77 77   .........wwwwwww
065C  77

; 065d is sample #23
065d     B0 88 88 88 88 88 88-88 88 B3 88 77 77 77 77   w...........wwww
066C  77 77 77

; sample #25
066f           B0 88 88 88 88-88 88 88 88 B3 88 88 77   www............w
067C  77 77 77 77 77

; sample#27
0681                 B0 88 88-88 88 88 88 88 88 B3 88   wwwww...........
068C  88 88 77 77 77 77 77

; sample#29
0693                       B0-88 88 88 88 88 88 88 88   ..wwwww.........
069C  B3 88 88 88 88 77 77 77-77

; sample#31
06a5                             B0 88 88 88 88 88 88   .....wwww.......
06AC  88 88 B3 88 88 88 88 88-77 77 77

; sample#33
06b7                                   B0 88 88 88 88   ........www.....
06BC  88 88 88 88 B3 88 88 88-88 88 88 77 77

; sample#35
06c9                                         B0 88 88   ...........ww...
06CC  88 88 88 88 88 88 B3 88-88 88 88 88 88 88 77

;------------------------------------------------------------------------
; this was sample 5 to sample 35, a kinda important sequence of samples or so
; i think it might emulate one effect only but dont ask which one.
; -----------------------------------------------------------------------
;--------------------------------------------------------------------------
;--------------------------------------------------------------------------
;--------------------------------------------------------------------------



; 06db is sample #3
06db                                               B0   ..............w.
06DC  00 11 22 33 44 55 66 77-B3 88 99 AA BB CC DD EE   .."3DUfw........
06EC  FF


; 06ed is the sample #1 data according to the table at $09fd...
06ed     B0 01 23 45 67 65 43-21 0F B3 FE DC BA 98 89   ...#EgeC!.......
06FC  AB CD EF

;--------------------------------------------------------------------------
;--------------------------------------------------------------------------
;--------------------------------------------------------------------------

; here is sample 4 up to sample 34. very much like in sample 5 to sample
; 35, the samples here are quite similar to each other. This is another
; indicator for my theory that sample 4 up to sample 35 (31 samples alltoge-
; ther!) are being used to emulate one effect only.  (Or one waveform, or
; one  WHATEVER. I will still have to figure....)

; 06ff is sample #4
06ff           B0 77 77 77 77-77 77 77 77 B0 77 77 77   ....wwwwwwww.www
070C  77 77 77 77 77 B0 77 77-77 77 77 77 77 77 B3 77   wwwww.wwwwwwww.w
071C  77 77 77 77 77 77 77


; 0723 is sample #6
0723                       B0-88 88 77 77 77 77 77 77   wwwwwww...wwwwww
072C  B0 77 77 77 77 77 77 77-77 B0 77 77 77 77 77 77   .wwwwwwww.wwwwww
073C  77 77 B3 77 77 77 77 77-77 77 77

; 0747 is sample #8
0747                                   B0 88 88 88 88   ww.wwwwwwww.....
074C  77 77 77 77 B0 77 77 77-77 77 77 77 77 B0 77 77   wwww.wwwwwwww.ww
075C  77 77 77 77 77 77 B3 77-77 77 77 77 77 77 77

; 076b is sample #10
076b                                               B0   wwwwww.wwwwwwww.
076C  88 88 88 88 88 88 77 77-B0 77 77 77 77 77 77 77   ......ww.wwwwwww
077C  77 B0 77 77 77 77 77 77-77 77 B3 77 77 77 77 77   w.wwwwwwww.wwwww
078C  77 77 77

; 078f is sample #12
078f           B0 88 88 88 88-88 88 88 88 B0 77 77 77   www..........www
079C  77 77 77 77 77 B0 77 77-77 77 77 77 77 77 B3 77   wwwww.wwwwwwww.w
07AC  77 77 77 77 77 77 77


; 07b3 is sample #14
07b3                       B0-88 88 88 88 88 88 88 88   wwwwwww.........
07BC  B0 88 88 77 77 77 77 77-77 B0 77 77 77 77 77 77   ...wwwwww.wwwwww
07CC  77 77 B3 77 77 77 77 77-77 77 77


; 07d7 is sample #16
07d7                                   B0 88 88 88 88   ww.wwwwwwww.....
07DC  88 88 88 88 B0 88 88 88-88 77 77 77 77 B0 77 77   .........wwww.ww
07EC  77 77 77 77 77 77 B3 77-77 77 77 77 77 77 77

; 07fb is sample #18
07fb                                               B0   wwwwww.wwwwwwww.
07FC  88 88 88 88 88 88 88 88-B0 88 88 88 88 88 88 77   ...............w
080C  77 B0 77 77 77 77 77 77-77 77 B3 77 77 77 77 77   w.wwwwwwww.wwwww
081C  77 77 77

; 081f is sample #20
081f           B0 88 88 88 88-88 88 88 88 B0 88 88 88   www.............
082C  88 88 88 88 88 B0 77 77-77 77 77 77 77 77 B3 77   ......wwwwwwww.w
083C  77 77 77 77 77 77 77

; 0843 is sample #22
0843                       B0-88 88 88 88 88 88 88 88   wwwwwww.........
084C  B0 88 88 88 88 88 88 88-88 B0 88 88 77 77 77 77   ............wwww
085C  77 77 B3 77 77 77 77 77-77 77 77

; 0867 is sample #24
0867                                   B0 88 88 88 88   ww.wwwwwwww.....
086C  88 88 88 88 B0 88 88 88-88 88 88 88 88 B0 88 88   ................
087C  88 88 77 77 77 77 B3 77-77 77 77 77 77 77 77

; 088b is sample #26
088b                                               B0   ..wwww.wwwwwwww.
088C  88 88 88 88 88 88 88 88-B0 88 88 88 88 88 88 88   ................
089C  88 B0 88 88 88 88 88 88-77 77 B3 77 77 77 77 77   ........ww.wwwww
08AC  77 77 77

; 08af is sample #28
08af           B0 88 88 88 88-88 88 88 88 B0 88 88 88   www.............
08BC  88 88 88 88 88 B0 88 88-88 88 88 88 88 88 B3 77   ...............w
08CC  77 77 77 77 77 77 77

; 08d3 is sample #30
08d3                       B0-88 88 88 88 88 88 88 88   wwwwwww.........
08DC  B0 88 88 88 88 88 88 88-88 B0 88 88 88 88 88 88   ................
08EC  88 88 B3 88 88 77 77 77-77 77 77


; 08f7 is sample #32
08f7                                   B0 88 88 88 88   .....wwwwww.....
08FC  88 88 88 88 B0 88 88 88-88 88 88 88 88 B0 88 88   ................
090C  88 88 88 88 88 88 B3 88-88 88 88 77 77 77 77

; 091b  is sample #34
091b                                               B0   ...........wwww.
091C  88 88 88 88 88 88 88 88-B0 88 88 88 88 88 88 88   ................
092C  88 B0 88 88 88 88 88 88-88 88 B3 88 88 88 88 88   ................
093C  88 77 77


;--------------------------------------------------------------------------
;--------------------------------------------------------------------------
;--------------------------------------------------------------------------



; 093f is sample #2...

               B0 00 00 11 11-22 22 33 33 B0 44 44 55   .ww.....""33.DDU
094C  55 66 66 77 77 B0 88 88-99 99 AA AA BB BB B3 CC   Uffww...........
095C  CC DD DD EE EE FF FF


; 0963 seems to be sample 0.

                           B0-00 11 22 33 44 55 66 77   .........."3DUfw
096C  B0 77 66 55 44 33 22 11-00 B0 FF EE DD CC BB AA   .wfUD3".........
097C  99 88 B3 88 99 AA BB CC-DD EE FF 03


;--------------------------------------------------------------------------
;--------------------------------------------------------------------------
;--------------------------------------------------------------------------
;------------------------------------------------------------------
; Reassembly work (c) Antitrack Oct-17-1994
;------------------------------------------------------------------



0987 is either sample #36 or i am mistaken?  :-)
0987                                      00 00 00 00   ................
098C  00 00 00 00

; well this IS sample 36 and should be sawtooth+ring modulation. Something
; that *is* actually very rarely used together on the 64, coz it sounds
; so faint that its nearly not there (if you ever tried it on the 64).
;



0990 is either sample #37 . it is getting calculated in realtime.... (voice1)
0990              00 00 00 00-00 00 00 00 00 00 00 00   ................
099C  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
09AC  00 00 00 00 00 00 00 00-

09b4 seems to be sample #38. its real values are being calculated in realtime
; it is used to emulate the 64's voice 2.
09b4                          00 00 00 00 00 00 00 00   ................
09BC  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
09CC  00 00 00 00 00 00 00 00-00 00 00 00

09d8 is sample #39. calculated in realtime, used for voice3 emulation.
09d8                                      00 00 00 00   ................
09DC  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
09EC  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

;--------------------------------------------------------------------------
;--------------------------------------------------------------------------
;--------------------------------------------------------------------------
;------------------------------------------------------------------
; Reassembly work (c) Antitrack Oct-17-1994
;------------------------------------------------------------------



; let us do a little summary of the samples here. If you recall,
; sample 0,1,2,3 seem to be independent. Sample 4 up to sample 35 (31 samples)
; are very similar to each other. Sample 36 is not being
; used for the obvious reason that it consists of zerobytes only and doesn't
; make too much sense.

; Sample 37, 38 and 39 are being calculated in realtime before being played.

; My guess is that samples 0,1,2,3 emulate noise, sawtooth, pulse and
; triangle, and the rest of the samples (31 of them, sample4 to sample35)
; are trying to emulate the ring modulation, or the sync modulation, or
; some special effect like that.

; Well lets look again at sample 0, 1, 2, 3 here:

; 0963 seems to be sample 0.

                           B0-00 11 22 33 44 55 66 77   .........."3DUfw
096C  B0 77 66 55 44 33 22 11-00 B0 FF EE DD CC BB AA   .wfUD3".........
097C  99 88 B3 88 99 AA BB CC-DD EE FF 03

; 06ed is the sample #1..
06ed     B0 01 23 45 67 65 43-21 0F B3 FE DC BA 98 89   ...#EgeC!.......
06FC  AB CD EF

; 093f is sample #2...

               B0 00 00 11 11-22 22 33 33 B0 44 44 55   .ww.....""33.DDU
094C  55 66 66 77 77 B0 88 88-99 99 AA AA BB BB B3 CC   Uffww...........
095C  CC DD DD EE EE FF FF

; 06db is sample #3
06db                                               B0   ..............w.
06DC  00 11 22 33 44 55 66 77-B3 88 99 AA BB CC DD EE   .."3DUfw........
06EC  FF

; damn they are similar to each other too! ..... ?? Dunno what to say
; about it. If thats one effect only too, then the SID got two
; effects only, yea rite?  ;-)
; I am not getting smart out of it...at the moment. Sorry....

;--------------------------------------------------------------------------
;--------------------------------------------------------------------------
;--------------------------------------------------------------------------


; here at 09fc is the pointer table for the samples. they point to the
; start of each sample.


09FC  63 09 ED 06 3F 09 DB 06-FF 06 BB 05 23 07 CD 05   c...?.......#...
0A0C  47 07 DF 05 6B 07 F1 05-8F 07 03 06 B3 07 15 06   G...k...........
0A1C  D7 07 27 06 FB 07 39 06-1F 08 4B 06 43 08 5D 06   ..'...9...K.C.].
0A2c  67 08 6F 06 8B 08 81 06-AF 08 93 06 D3 08 A5 06   g.o.............
0A3c  F7 08 B7 06 1B 09 C9 06-87 09 90 09 B4 09 D8 09   ................

;--------------------------------------------------------------------------
;--------------------------------------------------------------------------
;--------------------------------------------------------------------------

;------------------------------------------------------------------
; Reassembly work (c) Antitrack Oct-17-1994
;------------------------------------------------------------------

;--------------------------------------------------------------------------
;--------------------------------------------------------------------------
;--------------------------------------------------------------------------

;
;  init all DSP sound chip registers
;

0A4C CD 00      MOV     X,#$00        ; ***init dsp registers***
0A4E 60         CLRC                  ; clear carry
0A4F 7D         MOV     A,X           ; a=x=0
0A50 C4 F2      MOV     $F2,A         ; dsp register 0, VOL Left voice 0
0A52 8F 00 F3   MOV     $00,#$F3      ; dsp register VALUE, e.g VOL left = 0
0A55 88 10      ADC     A,#$10        ; a= 10 : dsp register $10, vol left
0A57 C4 F2      MOV     $F2,A         ; ../of voice 1  !
0A59 8F 00 F3   MOV     $00,#$F3      ; voice 1 VOL left = 0
0A5C 88 10      ADC     A,#$10        ; a= 10 : dsp register $20, vol left
0A5E C4 F2      MOV     $F2,A         ; ../of voice 2  !
0A60 8F 00 F3   MOV     $00,#$F3      ; voice 2 VOL left = 0
0A63 88 10      ADC     A,#$10        ; a= 10 : dsp register $30, vol left
0A65 C4 F2      MOV     $F2,A         ; ../of voice 3  !
0A67 8F 00 F3   MOV     $00,#$F3      ; voice 3 VOL left = 0
0A6A 88 10      ADC     A,#$10        ; a= 10 : dsp register $40, vol left
0A6C C4 F2      MOV     $F2,A         ; ../of voice 4  !
0A6E 8F 00 F3   MOV     $00,#$F3      ; voice 4 VOL left = 0
0A71 88 10      ADC     A,#$10        ; a= 10 : dsp register $50, vol left
0A73 C4 F2      MOV     $F2,A         ; ../of voice 5  !
0A75 8F 00 F3   MOV     $00,#$F3      ; voice 5 VOL left = 0
0A78 88 10      ADC     A,#$10        ; a= 10 : dsp register $60, vol left
0A7A C4 F2      MOV     $F2,A         ; ../of voice 6  !
0A7C 8F 00 F3   MOV     $00,#$F3      ; voice 6 VOL left = 0
0A7F 88 10      ADC     A,#$10        ; a= 10 : dsp register $70, vol left
0A81 C4 F2      MOV     $F2,A         ; ../of voice 7  !
0A83 8F 00 F3   MOV     $00,#$F3      ; voice 7 VOL left = 0
0A86 3D         INC     X             ; since this is a loop , we hereby
0A87 C8 0A      CMP     X,#$0A        ; clear all DSP registers (00-09)
0A89 D0 C4      BNE     $0A4F         ; of all voices!
0A8B CD 0C      MOV     X,#$0C        ;
0A8D 60         CLRC                  ;
0A8E 7D         MOV     A,X           ; akku=x=$0c
0A8F C4 F2      MOV     $F2,A         ;
0A91 8F 00 F3   MOV     $00,#$F3      ; clear $0c, 0d, 0e, 0f
0A94 88 10      ADC     A,#$10        ;
0A96 C4 F2      MOV     $F2,A         ;
0A98 8F 00 F3   MOV     $00,#$F3      ; clear $1c, 1d, 1e, 1f
0A9B 88 10      ADC     A,#$10        ;
0A9D C4 F2      MOV     $F2,A         ;
0A9F 8F 00 F3   MOV     $00,#$F3      ; clear $2c, 2d, 2e, 2f
0AA2 88 10      ADC     A,#$10        ;
0AA4 C4 F2      MOV     $F2,A         ;
0AA6 8F 00 F3   MOV     $00,#$F3      ; clear $3c, 3d, 3e, 3f
0AA9 88 10      ADC     A,#$10        ;
0AAB C4 F2      MOV     $F2,A         ;
0AAD 8F 00 F3   MOV     $00,#$F3      ; clear $4c, 4d, 4e, 4f
0AB0 88 10      ADC     A,#$10        ;
0AB2 C4 F2      MOV     $F2,A         ;
0AB4 8F 00 F3   MOV     $00,#$F3      ; clear $5c, 5d, 5e, 5f
0AB7 88 10      ADC     A,#$10        ;
0AB9 C4 F2      MOV     $F2,A         ;
0ABB 8F 00 F3   MOV     $00,#$F3      ; clear $6c, 6d, 6e, 6f
0ABE 88 10      ADC     A,#$10        ;
0AC0 C4 F2      MOV     $F2,A         ;
0AC2 8F 00 F3   MOV     $00,#$F3      ; clear $7c, 7d, 7e, 7f
0AC5 3D         INC     X             ;
0AC6 C8 10      CMP     X,#$10        ;
0AC8 D0 C4      BNE     $0A8E         ; loop.
0ACA 8F 3D F2   MOV     $3D,#$F2      ; register 3d: noise on/off.
0ACD 8F 00 F3   MOV     $00,#$F3      ; in this case: noise for all voices off
0AD0 8F 4D F2   MOV     $4D,#$F2      ; register 4d: echo on/off.
0AD3 8F 00 F3   MOV     $00,#$F3      ; in this case: echo for all voices off
0AD6 8F 6C F2   MOV     $6C,#$F2      ; reg 6c: ECEN: d5=0 means echo enable,
0AD9 8F 20 F3   MOV     $20,#$F3      ; so d5=1 means echo disable, yea rite?
0ADC 8F 0C F2   MOV     $0C,#$F2      ; main volume left = 7f
0ADF 8F 7F F3   MOV     $7F,#$F3      ;
0AE2 8F 1C F2   MOV     $1C,#$F2      ; main volume right = 7f
0AE5 8F 7F F3   MOV     $7F,#$F3      ;
0AE8 8F 5D F2   MOV     $5D,#$F2      ; this is tricky, its called "offset
0AEB 8F 02 F3   MOV     $02,#$F3      ; address of source directory".

; Basically it means that we have an important table at $0200 in this case
; and i will describe the table: each table entry at $0200 contains a pointer
; to the sampled data that your voice should play! The sampled data must be
; in a special format called "BRR" (bit rate reductio) format, which I will
; describe whenever we discuss the samples .

0AEE 8F 30 F2   MOV     $30,#$F2      ;  voice 3 volume left = 7f
0AF1 8F 7F F3   MOV     $7F,#$F3      ;
0AF4 8F 31 F2   MOV     $31,#$F2      ;  voice 3 volume right = 7f
0AF7 8F 7F F3   MOV     $7F,#$F3      ;
0AFA 8F 35 F2   MOV     $35,#$F2      ;  ADSR(1) voice 3 = 67  (bit7=0 !!!)

; bit7 = 0 of adsr(1) is very important. it tells us that the GAIN byte
; gets operable. The gain byte is byte 7 of each voice, which will be used
; soon... watch out... :-) Anyway I dont feel like typing in so much , but,

            bit7  bit6  bit5  bit4  bit3  bit2  bit1  bit0

ADSR(1) :   GAIN  DR2   DR1   DR0   AR3   AR2   AR1   AR0
ADSR(2) :   SL2   SL1   SL0   SR4   SR3   SR2   SR1   SR0

AR3-0 is Attack time,  DR0-2 is Decay time, SL0-2 Sustain low(?), SR0-4
is Sustain/Release. (Hopefully. You gotta play around with these for quite
a while till you get results, believe me...)


0AFD 8F 67 F3   MOV     $67,#$F3      ;   67=01100111; DR=110, AR=0111
0B00 8F 36 F2   MOV     $36,#$F2      ;  ADSR(2) voice 3 = 18
0B03 8F 18 F3   MOV     $18,#$F3      ;  18=00011000  ratio=000, SR=11000=180ms
0B06 8F 37 F2   MOV     $37,#$F2      ;  voice 3 gain!
0B09 8F 7F F3   MOV     $7F,#$F3      ;  the GAIN value is set to %1111111

; Now this was the gain stuff. Since bit 7 of reg 7, voice 3, is zero, it means
; "direct designation": the value of GAIN is set directly according to
; the rest of the bits in this byte. Thus, all to 1. Thus, maximum GAIN. What
; ever GAIN was.

0B0C 8F 40 F2   MOV     $40,#$F2      ; volume left voice 4 = 7f
0B0F 8F 7F F3   MOV     $7F,#$F3      ;
0B12 8F 41 F2   MOV     $41,#$F2      ; volume rite voice 4 = 7f
0B15 8F 7F F3   MOV     $7F,#$F3      ;
0B18 8F 45 F2   MOV     $45,#$F2      ; adsr voice 4 same like voice 3
0B1B 8F 67 F3   MOV     $67,#$F3      ; adsr voice 4 same like voice 3
0B1E 8F 46 F2   MOV     $46,#$F2      ; adsr voice 4 same like voice 3
0B21 8F 18 F3   MOV     $18,#$F3      ; adsr voice 4 same like voice 3
0B24 8F 47 F2   MOV     $47,#$F2      ; gain voice 4 7f , same like voice 3
0B27 8F 7F F3   MOV     $7F,#$F3      ;
0B2A 8F 20 F2   MOV     $20,#$F2      ; volume voice 2 left = 7f
0B2D 8F 7F F3   MOV     $7F,#$F3      ;
0B30 8F 21 F2   MOV     $21,#$F2      ; volume voice 2 rite = 7f (max, eh)
0B33 8F 7F F3   MOV     $7F,#$F3      ;
0B36 8F 25 F2   MOV     $25,#$F2      ; adsr voice 2 same like voice 3
0B39 8F 67 F3   MOV     $67,#$F3      ; adsr voice 2 same like voice 3
0B3C 8F 26 F2   MOV     $26,#$F2      ; adsr voice 2 same like voice 3
0B3F 8F 18 F3   MOV     $18,#$F3      ; adsr voice 2 same like voice 3
0B42 8F 27 F2   MOV     $27,#$F2      ; gain voice 4 same like voice 3
0B45 8F 7F F3   MOV     $7F,#$F3      ; ----- end of DSP init
0B48 8F 00 7C   MOV     $00,#$7C      ; clear mem 7c-7f of spc RAM memory
0B4B 8F 00 7D   MOV     $00,#$7D      ;
0B4E 8F 00 7E   MOV     $00,#$7E      ;
0B51 8F 00 7F   MOV     $00,#$7F      ;
0B54 8F 6C F2   MOV     $6C,#$F2      ; DSP register 6c:
0B57 8F 38 F3   MOV     $38,#$F3      ;

; 38: = %01101100  bit 7: soft reset is off, DSP ready to play or so
                       6: =1  "MUTE" is turned on
                       5: =1  ECEN (echo enable)   =1, means echo disabled
                       4-0: 01100: Noise clock generator speed. Impessive, huh



0B5A 8F 4C F2   MOV     $4C,#$F2      ; DSP register 4c, KEY ON
0B5D 8F 1C F3   MOV     $1C,#$F3      ;

; Now this is the important part, its the KEY ON thingie. :-) $1c is
; binary %11100 and what does this tell you? It tells you that they use voice
; 2, 3 and 4 for the emulation. Oh yeah! :)

0B60 6F         RET                   ;

;-------------------------------------------------------------------------
;-------------------------------------------------------------------------
;-------------------------------------------------------------------------

The following routine calculates a new sample and puts it at sample #37's
memory location (0990-09b4), or into sample #38's memory location if
we are currently calculating for voice2, or into sample #39's memory location
if we are calculating the data for voice3.

The calculations are based on whatever waveform bits are set or not.


0B61 8F FC 78   MOV     $FC,#$78      ; 78/79 points to 09fc which is the
0B64 8F 09 79   MOV     $09,#$79      ; array of sample pointers
0B67 5D         MOV     X,A           ; x=a=actual waveform
0B68 5C         LSR     A             ; shift waveform left 4 bits
0B69 5C         LSR     A             ; noise, pulse, sawtooth and triangle
0B6A 5C         LSR     A             ; will now be at bit 3, bit 2, bit 1 and
0B6B 5C         LSR     A             ; bit 0 of the akku
0B6C C4 7C      MOV     $7C,A         ; 007c now gets the val of akku
0B6E 7D         MOV     A,X           ; akku gets old val back
0B6F 28 03      AND     A,#$03        ; check for bit 0/1: bit0:gate on/off,
0B71 60         CLRC                  ; ...bit1: sync modulation bit
0B72 84 7A      ADC     A,$7A         ; we add 00-03 (depending if the gate
                                      ; and the sync bit are set) to the pulse
                                      ; hi value.

0B74 1C         ASL     A             ; and multiply by 4.
0B75 1C         ASL     A             ; this value now is the index of which
0B76 FD         MOV     Y,A           ; sample pointer to grab from the sample
0B77 F7 78      MOV     A,[$78]+Y     ; pointer table!
0B79 C4 74      MOV     $74,A         ; 74/75=pointer to acual sample
0B7B FC         INC     Y             ; actual sample=[samplearray+index]
0B7C F7 78      MOV     A,[$78]+Y     ;
0B7E C4 75      MOV     $75,A         ;
0B80 E4 7C      MOV     A,$7C         ; noise/pulse/saw/triangl  (bits3-0)
                                      ; this command seems to be useless since
                                      ; the accu soon gets a completely new
                                      ; value.
0B82 8D 00      MOV     Y,#$00        ;
0B84 F7 78      MOV     A,[$78]+Y     ; put address of sample 0 into 76/77
0B86 C4 76      MOV     $76,A         ;
0B88 FC         INC     Y             ;
0B89 F7 78      MOV     A,[$78]+Y     ;
0B8B C4 77      MOV     $77,A         ;
0B8D 8D 00      MOV     Y,#$00        ;
0B8F F7 74      MOV     A,[$74]+Y     ;the 1stbyte of the actual sample 74/75...
0B91 37 76      AND     A,[$76]+Y     ;..is ANDED w/ the first byte of sample 0
0B93 D7 72      MOV     [$72]+Y,A     ;the RESULTING SAMPLE is being moved
0B95 FC         INC     Y             ;to sample 37+x (72/73 point to it, they
0B96 AD 24      CMP     Y,#$24        ;point to 0990 ....)
                                      ; "sample 37+x" where x is voice number
                                      ; -1 of the 64

; let me sum up and recall here what happened. An *acutal sample* was being
; chosen and calculated from the waveform bits noise/pulse/saw and triangle,
; as well as from the wave bits SYNC and GATE. A pointer, 74/75, is set to this
; calculated actual sample. Another pointer, 72/73, points to the very first
; sample always. The *actual sample*'s bytes are ANDed with all the bytes from
; sample 0, the resulting sample is located at sample #37/8/9's memory location,
; from 0990-09b4 ($24 bytes as the loop says).

; Its my guess that this resulting sample #37/8/9 is gonna be played sooner or
; later!  :-)



0B98 D0 F5      BNE     $0B8F         ;
0B9A 6F         RET                   ;

;-------------------------------------------------------------------------
;-------------------------------------------------------------------------
;-------------------------------------------------------------------------


; this routine is a copy of the SPC700's RESET routine, which was discussed
; in the famidev development group intensely already.
; It basically gets the SPC data from the CPU (65c816)'s RAM into the
; SPC700's ram.


0B9B CD EF      MOV     X,#$EF        ;  normal start is $ffc0
0B9D BD         MOV     SP,X          ;
0B9E E8 00      MOV     A,#$00        ;
0BA0 C6         MOV     (X),A         ;
0BA1 1D         DEC     X             ;
0BA2 D0 FC      BNE     $0BA0         ;
0BA4 8F AA F4   MOV     $AA,#$F4      ;
0BA7 8F BB F5   MOV     $BB,#$F5      ;
0BAA 78 CC F4   CMP     $CC,#$F4      ;
0BAD D0 FB      BNE     $0BAA         ;
0BAF 2F 19      BRA     $0BCA         ;
0BB1 EB F4      MOV     Y,$F4         ;
0BB3 D0 FC      BNE     $0BB1         ;
0BB5 7E F4      CMP     Y,$F4         ;
0BB7 D0 0B      BNE     $0BC4         ;
0BB9 E4 F5      MOV     A,$F5         ;
0BBB CB F4      MOV     $F4,Y         ;
0BBD D7 00      MOV     [$00]+Y,A     ;
0BBF FC         INC     Y             ;
0BC0 D0 F3      BNE     $0BB5         ;
0BC2 AB 01      INC     $01           ;
0BC4 10 EF      BPL     $0BB5         ;
0BC6 7E F4      CMP     Y,$F4         ;
0BC8 10 EB      BPL     $0BB5         ;
0BCA BA F6      MOVW    YA,$F6        ;
0BCC DA 00      MOVW    $00,YA        ;
0BCE BA F4      MOVW    YA,$F4        ;
0BD0 C4 F4      MOV     $F4,A         ;
0BD2 DD         MOV     A,Y           ;
0BD3 5D         MOV     X,A           ;
0BD4 D0 DB      BNE     $0BB1         ;
0BD6 1F 00 00   JMP     [$0000+X]     ;
0BD9 C0         DI                    ;   reset vector
0BDA FF         STOP                  ;


;------------------------------------------------------------------
; Reassembly work (c) Antitrack Oct-17-1994
;------------------------------------------------------------------


