2016-02-15 17:42:39 +01:00

1073 lines
49 KiB
Plaintext

; 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
;------------------------------------------------------------------