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