Home Journal Contact Me Tools Comments

Sound Scripts
Background Music Start Music Congrats Music
End Music Goal Music Space Plant
UFO Flying UFO Explosion Missile from Buggy
Buggy Jump Buggy Explosion Passing a Point
Insert Coin
General Code
Memory Map DAC Explosion Samples Explosion Command Table
Script Command Table Start of code Main sound loop
NMI clock handler Command request IRQ 6803 vectors
Code Bugs
Sweep voice pair Useless OR Disable sounds
Script Processor
Simple Commands STOP CALL
RETURN C_REGISTER_SAMPLES C_TOGGLE_REGISTER
C_SWEEP_VOICE_REGISTER C_SWEEP_VOICE_PAIR
Process Commands
Command 00 Commands 01 - 0F Commands 10 - 13
Command 14 Commands 15 - 17 Commands 18 - 1F
; Dissassembly comments by Chris Cantrell 2009
; For detailed discussion of code visit http://www.computerarcheology.com


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

; MemoryMap
;  Memory Map
;  ** Internal hardware I/O registers **
;  00 DDR1
;  01 DDR2
;  02 PORT1
;  03 PORT2

;  ** Samples-player chip hardware **
;  0801
;  0802

;  ** RAM **
;  80    Sequence voice 0 on AY0 (FF for off, count down to 0=process)
;  81    Sequence voice 1 on AY0
;  82    Sequence voice 2 on AY1
;  83    Sequence voice 3

;  84:85 Sequence pointer voice 0
;  86:87 Sequence pointer voice 1
;  88:89 Sequence pointer voice 2
;  8A:8B Sequence pointer voice 3

;  8C Type of command being processed on sequencer 1
;  8D
;  8E
;  8F

;  90 Count of commands of the current type (if not 0). Resets to type 0 when done.
;  91
;  92
;  93

;  These eight bytes (2 per sequencer) are parameters for any complex commands.
;  The actual content depends on which complex command is being played.
;  Mode parameters (number 1)
;  94
;  95
;  96
;  97

;  Mode parameters (number 2)
;  98
;  99
;  9A
;  9B

;  9C MSB of return address for script sequencer 0
;  9D MSB of return address for script sequencer 1
;  9E MSB of return address for script sequencer 2
;  9F MSB of return address for script sequencer 3

;  A0 LSB of return address for script sequencer 0
;  A1 LSB of return address for script sequencer 1
;  A2 LSB of return address for script sequencer 2
;  A3 LSB of return address for script sequencer 3

;  A4 Sound command running on sequencer 0
;  A5 Sound command running on sequencer 1
;  A6 Sound command running on sequencer 2
;  A7 Sound command running on sequencer 3

;  A8 not-zero to decrement volume on AY0-0
;  A9 not-zero to decrement volume on AY0-1
;  AA not-zero to decrement volume on AY0-2
;  AB not-zero to decrement volume on AY1-0
;  AC not-zero to decrement volume on AY1-1
;  AD not-zero to decrement volume on AY1-2

;  AE counter to decrement volume on AY0-0
;  AF counter to decrement volume on AY0-1
;  B0 counter to decrement volume on AY0-2
;  B1 counter to decrement volume on AY1-0
;  B2 counter to decrement volume on AY1-1
;  B3 counter to decrement volume on AY1-2

;  B4 counter reload for decrement volume on AY0-0
;  B5 counter reload for decrement volume on AY0-1
;  B6 counter reload for decrement volume on AY0-2
;  B7 counter reload for decrement volume on AY1-0
;  B8 counter reload for decrement volume on AY1-1
;  B9 counter reload for decrement volume on AY1-2

;  BA current mixer value for AY0
;  BB current mixer value for AY1

;  BC sound command (FF for none)
;  BD NMI tick counter for non-NMI users

;  BE status of sample streamers. 000000_AB 
;     A=801 (1=stopped)
;     B=802 (1=stopped)

;  BF NMI tick counter

;  C0 timer for AY sound processing (0 means not time)

;  C1 current value of sampler 801
;  C2 current value of sampler 802
;  C3:C4 counter to bytes to play out 801
;  C5:C6 counter for bytes to play out 802
;  C7:C8 pointer to bytes to play out 801
;  C9:CA pointer for bytes to play out 802

;  CB last requested sound command

;  CC *NOT*USED*

;  CD:CE temporary storage: current sequence pointer
;  CF:D0 temporary storage: used in frequency sweeper
;  D1:D2 temporary storage: current voice for sequence processing

;  D3, D4, D5, D6, D7  *NOT*USED*

;  D8 board status to return to main board. Set to $13 at start. Bit 0 is the status of the sample player.

;  80 - CF cleared at startup (doesn't get all temporaries)

;  Stack build to lower memory from FF

;  ----------------------------------------------------------------------------------------------------
; DACExplosionSamples
; Interesting. This explosion effect lasting 1/2 second consumes 1/4th of the ROM.
; Each byte contains 2 4-bit samples that are played one after the other.
;
; 1024 bytes = 2048 samples / 4000Hz = 0.512 seconds
;
F000: 88 08 14 3F 8D 51 0C 24 E0 91 00 F9 3A 1A 80 C2 F1 35 00 D1 59 88 89 D4 2B B0 52 8D 84 A1 2B 84
F020: A9 03 F0 88 21 30 BF 02 B9 B3 40 42 1D 98 B2 0C 8A 02 80 09 7F 91 12 88 23 23 98 D9 C3 42 3B 8E
F040: C2 00 0A A1 9C 33 38 89 C7 8A 10 02 F9 12 81 22 2A 9B E9 B2 0F 19 B9 63 9A 20 A0 08 9A 88 2F A4
F060: 35 20 A8 83 40 AA C9 89 8B 90 BD 92 35 18 C9 52 33 29 03 38 9B FD 82 AA 18 11 0B F9 13 19 92 62
F080: 3A CB D8 32 1A AB 83 49 B4 39 B9 AD CC A2 72 89 11 09 82 28 88 99 0E 05 21 89 BC CA 02 99 80 2A
F0A0: EB 13 33 25 42 43 10 36 09 B9 CE 90 14 31 10 9D D9 80 99 B8 8A AB A8 9B B2 76 34 22 18 09 BB 98
F0C0: 33 1B DA 89 92 0A BA BD 47 20 9B E9 01 18 88 25 41 32 33 52 CD 98 08 09 82 31 AF 99 90 89 9C CB
F0E0: CA 00 A0 11 10 B8 44 64 23 10 9C 99 C9 01 20 05 28 26 22 00 38 DB B0 8A A0 43 53 18 CD D8 03 19
F100: AA 9A A9 AC B2 76 22 AA 99 9A 90 0C CA AB 99 37 61 00 89 02 09 22 81 BD CB C9 05 54 20 08 99 A9
F120: 22 18 01 18 AE B9 04 48 BC 88 8A EC 80 11 9A 99 93 75 08 98 88 91 89 12 02 9A DB 04 33 82 39 FA
F140: 24 10 9A DD 91 35 33 10 19 A1 99 AB C3 77 1A AB CC 90 08 AC A0 23 33 22 05 31 31 13 09 BA 91 24
F160: 10 2C FC DC A8 99 99 88 BE 92 43 14 31 12 34 35 31 13 42 AA CC BD CA BA 01 00 99 9B A0 82 34 63
F180: 20 81 17 52 00 8A 9A 03 32 8C CB CD BC AB DA 8A 04 53 21 8A 81 45 42 28 AD BB A9 82 62 21 21 88
F1A0: 88 02 00 AD AA 92 70 8A CC CB BA A8 37 42 00 8A 99 AA B8 02 11 0A CA 13 23 75 41 08 99 82 54 32
F1C0: 98 A9 9A A9 9A 82 54 1D EB CB 99 03 53 10 99 89 BC 92 10 33 65 20 99 AA A1 00 32 1B EE BA 01 44
F1E0: 32 80 13 36 89 A9 ED B9 88 09 A0 31 18 07 31 14 08 80 31 20 09 DB 98 89 DD 90 03 82 50 9C A9 12
F200: 9C D8 88 34 83 63 32 12 08 32 AF BB FC 9A CC A0 13 42 08 81 11 35 32 42 22 0C CD 98 98 02 08 22
F220: 2A DA 8A 11 89 DC 99 B0 34 9D C8 12 1A EA 99 01 00 9A 37 42 36 23 21 98 10 9A CB AB B3 73 53 10
F240: AA FA 01 28 AA 88 90 9E DA A0 98 AC E9 82 11 10 22 81 47 53 22 09 90 89 12 8C FB AA 98 9A AB 90
F260: 32 1B D9 45 22 62 22 42 9C BB BB 99 02 45 34 23 9B B9 9C BB C8 02 63 39 91 44 30 01 48 BB FC BA
F280: CC A8 10 11 11 89 11 9D B8 03 74 34 20 88 01 23 20 88 BF B9 9A 01 08 AD 05 38 9B DA 93 48 AB AB
F2A0: 8B DB 99 82 37 29 CB A0 41 53 23 48 12 22 DD C9 81 34 32 28 9A 98 39 D9 8B 83 53 0F A9 9E B9 8A
F2C0: 88 88 25 12 32 BA 09 27 3A 9A 14 53 01 41 10 89 DC BB 83 52 9B DC 90 10 10 13 12 11 25 40 00 C8
F2E0: 8A B1 18 BC B4 34 09 9D CC BA AC 82 26 32 89 BC DA 98 21 32 37 31 00 11 A9 01 8F 98 00 23 1A A9
F300: 34 03 53 43 32 AD DB CB A9 BC 98 0B 00 61 24 20 88 35 23 50 08 CD B9 82 64 20 9A BB B9 9D DB 90
F320: 10 24 31 31 18 03 38 10 1A 1B FD CA 80 12 33 64 20 9A 88 88 98 03 30 BE 90 09 98 40 0A A4 53 19
F340: 13 9C FD AA A8 80 19 82 24 22 AD 90 56 20 99 20 8B BB 12 1B 85 30 EE B9 02 42 12 15 22 20 88 11
F360: 88 90 09 BF BC EA A8 88 9A 90 09 00 11 32 36 08 00 05 08 12 33 95 33 13 10 BC EC 99 21 11 33 63
F380: 31 00 AA FC AA 80 00 23 40 AC B9 90 92 53 89 FA A0 02 8A 91 2B DE 99 81 23 62 30 21 23 28 DC BC
F3A0: 81 10 99 08 14 72 20 9A A9 99 BE B9 24 18 AC 03 10 AB A9 02 34 35 42 00 08 88 29 9D A0 53 2A FB
F3C0: BB 01 00 8A A8 01 90 00 A1 36 32 02 3A AB 9C BB 89 8A CC AA 32 32 28 32 21 00 25 52 18 8A AA 11
F3E0: 28 08 20 32 AD EB A9 81 42 89 08 99 01 99 99 88 80 0A 08 33 52 37 10 AB D9 00 98 01 08 A8 03 42

; 0     
; 1     Half-second explosion played with samples on DAC-0 (Player shoots rocks)
; 2     Very, very short explosion with same samples (Missiles hitting ground)
; 3     Slightly shorter version of 1 (code plays 3 after 2 automatically)
;
; 4-15  Unused (perhaps slots for other DAC sounds)


; ExplosionCommands
;  Sample table for 801-played sample stream. First word is pointer to samples. Second
;  word is number of samples.
F400: 00 00 00 01      ;   00 (Not used ... gap in jump table for Reinitialize RAM and disable all sounds)
F404: F0 00 04 00      ;   01  $400 bytes at F000 Explosion: Car shooting rocks
F408: F0 04 00 E0      ;   02   $E0 bytes at F004 Explosion: Missiles hitting ground
F40C: F0 04 03 FC      ;   03  $3FC bytes at F004 Explosion: code plays 3 right after 2
F410: 00 00 00 01      ;   04
F414: 00 00 00 01      ;   05
F418: 00 00 00 01      ;   06
F41C: 00 00 00 01      ;   07
F420: 00 00 00 01      ;   08  Reserved slots for other DAC effects
F424: 00 00 00 01      ;   09
F428: 00 00 00 01      ;   0A
F42C: 00 00 00 01      ;   0B
F430: 00 00 00 01      ;   0C
F434: 00 00 00 01      ;   0D
F438: 00 00 00 01      ;   0E
F43C: 00 00 00 01      ;   0F
F440: 00 00 00 01      ;       I bet the original goal was to not include 00 and make 16 DAC's from 01 through 10

; CommandScripts
F444: F7 E1            ;   10 Passing one point (test 2)  AY1:A Sequencer2. If same ...
F446: F7 B9            ;   11 UFO explosion (test 3)      AY1:A ... restart. If higher ...
F448: F7 AB            ;   12 Missile from car (test 4)   AY1:A ... command number ...
F44A: F7 F1            ;   13 Coin (test 5)               AY1:A ... ignore.
F44C: F8 03            ;   14 Car jump (test 6)           AY1:BC  Force sequencer3
F44E: F4 F2            ;   15 Channel AY0:0 off and STOP  ---     Force sequencer1
F450: F4 F5            ;   16 Space plant (test 7)        AY0:A   Force sequencer1
F452: F5 16            ;   17 UFO flying (test 8)         AY0:A   Force sequencer1
F454: F5 6C            ;   18 Background music (test 9)   AY0:Bc  Force sequencer0
F456: F4 A7            ;   19 STOP                        ---     Force sequencer0
F458: F4 A7            ;   1A STOP                        ---     Force sequencer0
F45A: F4 64            ;   1B Ending music (test 10)      AY0:ABC Force sequencer0
F45C: F8 4D            ;   1C Opening music (test 11)     AY0:ABC Force sequencer0
F45E: F4 A8            ;   1D Reaching goal (test 12)     AY0:ABC Force sequencer0
F460: F8 EC            ;   1E Congratulations (test 13)   AY0:ABC Force sequencer0
F462: F9 5F            ;   1F Car explosion (test 14)     AY0:abc Force sequencer0

; EndMusic
;  Script for command $1B - Ending music (test 10)
F464: 66 F8                            ; MIXER_AND AY0 11_111_000 ...
F466: 48 10                            ; REGISTER AY0:08 10 ...
F468: 49 10                            ; REGISTER AY0:09 10 ...
F46A: 4A 10                            ; REGISTER AY0:0A 10 ...
F46C: 4B 00                            ; REGISTER AY0:0B 00 ...
F46E: 4C 10                            ; REGISTER AY0:0C 10 ...
F470: 20 EE 00 28                      ; THREETONE AY0:00 fine=EE coarse=00 (28)
F474: 20 BD 00 28                      ; THREETONE AY0:00 fine=BD coarse=00 (28)
F478: 20 9F 00 28                      ; THREETONE AY0:00 fine=9F coarse=00 (28)
F47C: 20 86 00 28                      ; THREETONE AY0:00 fine=86 coarse=00 (28)
F480: 27 07 28                         ; MIXER_OR AY0 00_000_111 (28)
F483: 66 F8                            ; MIXER_AND AY0 11_111_000 ...
F485: 20 86 00 28                      ; THREETONE AY0:00 fine=86 coarse=00 (28)
F489: 20 8E 00 28                      ; THREETONE AY0:00 fine=8E coarse=00 (28)
F48D: 20 9F 00 28                      ; THREETONE AY0:00 fine=9F coarse=00 (28)
F491: 20 0C 01 28                      ; THREETONE AY0:00 fine=0C coarse=01 (28)
F495: 20 86 00 28                      ; THREETONE AY0:00 fine=86 coarse=00 (28)
F499: 20 FD 00 28                      ; THREETONE AY0:00 fine=FD coarse=00 (28)
F49D: 20 7E 00 28                      ; THREETONE AY0:00 fine=7E coarse=00 (28)
F4A1: 20 EE 00 A0                      ; THREETONE AY0:00 fine=EE coarse=00 (A0)
F4A5: 67 07                            ; MIXER_OR AY0 00_000_111 ...

;  Script for command $19, $1A
F4A7: FF                               ; STOP

; ReachingGoal
;  Script for command $1D - Reaching goal (test 12)
F4A8: 66 F8                            ; MIXER_AND AY0 11_111_000 ...
F4AA: 48 10                            ; REGISTER AY0:08 10 ...
F4AC: 49 10                            ; REGISTER AY0:09 10 ...
F4AE: 4A 10                            ; REGISTER AY0:0A 10 ...
F4B0: 4B 00                            ; REGISTER AY0:0B 00 ...
F4B2: 4C 10                            ; REGISTER AY0:0C 10 ...
F4B4: FE F4 CD                         ; CALL F4CD(1)
F4B7: 20 77 00 24                      ; THREETONE AY0:00 fine=77 coarse=00 (24)
F4BB: 20 7E 00 24                      ; THREETONE AY0:00 fine=7E coarse=00 (24)
F4BF: 20 9F 00 24                      ; THREETONE AY0:00 fine=9F coarse=00 (24)
F4C3: FE F4 CD                         ; CALL F4CD(1)
F4C6: 20 EE 00 60                      ; THREETONE AY0:00 fine=EE coarse=00 (60)
F4CA: 67 07                            ; MIXER_OR AY0 00_000_111 ...
F4CC: FF                               ; STOP
F4CD: 20 EE 00 24                      ; THREETONE AY0:00 fine=EE coarse=00 (24)
F4D1: 20 9F 00 24                      ; THREETONE AY0:00 fine=9F coarse=00 (24)
F4D5: 20 77 00 24                      ; THREETONE AY0:00 fine=77 coarse=00 (24)
F4D9: 20 B3 00 24                      ; THREETONE AY0:00 fine=B3 coarse=00 (24)
F4DD: 20 8E 00 24                      ; THREETONE AY0:00 fine=8E coarse=00 (24)
F4E1: 20 77 00 24                      ; THREETONE AY0:00 fine=77 coarse=00 (24)
F4E5: 20 9F 00 24                      ; THREETONE AY0:00 fine=9F coarse=00 (24)
F4E9: 20 7E 00 24                      ; THREETONE AY0:00 fine=7E coarse=00 (24)
F4ED: 20 6A 00 24                      ; THREETONE AY0:00 fine=6A coarse=00 (24)
F4F1: FD                               ; RETURN (1)

;  Script for command $15
F4F2: 67 01                            ; MIXER_OR AY0 00_000_001 ...
F4F4: FF                               ; STOP

; SpacePlant
;  Script for command $16 - Space plant (test 7)
F4F5: 66 FE                            ; MIXER_AND AY0 11_111_110 ...
F4F7: 48 0F                            ; REGISTER AY0:08 0F ...
F4F9: 41 02                            ; REGISTER AY0:01 02 ...
F4FB: 00 CE 24                         ; REGISTER AY0:00 CE (24)
F4FE: 00 A7 24                         ; REGISTER AY0:00 A7 (24)
F501: 00 7D 24                         ; REGISTER AY0:00 7D (24)
F504: 00 A7 24                         ; REGISTER AY0:00 A7 (24)
F507: 00 58 24                         ; REGISTER AY0:00 58 (24)
F50A: 00 A7 24                         ; REGISTER AY0:00 A7 (24)
F50D: 00 7D 24                         ; REGISTER AY0:00 7D (24)
F510: 00 A7 24                         ; REGISTER AY0:00 A7 (24)
F513: FE F4 FB                         ; CALL F4FB(1)

; UFOFlying
;  Script for command $17 - UFO flying (test 8)
F516: 66 FE                            ; MIXER_AND AY0 11_111_110 ...
F518: 41 00                            ; REGISTER AY0:01 00 ...
F51A: 48 0D                            ; REGISTER AY0:08 0D ...
F51C: C0 10 30 01 06                   ;  C_SWEEP_VOICE_REGISTER retister=00 numSteps=10 initFreq=30 deltaFreq=01 timeBetween=06
F521: 48 0D                            ; REGISTER AY0:08 0D ...
F523: C0 18 40 01 04                   ;  C_SWEEP_VOICE_REGISTER retister=00 numSteps=18 initFreq=40 deltaFreq=01 timeBetween=04
F528: C0 14 58 FF 04                   ;  C_SWEEP_VOICE_REGISTER retister=00 numSteps=14 initFreq=58 deltaFreq=FF timeBetween=04
F52D: 48 0C                            ; REGISTER AY0:08 0C ...
F52F: C0 18 44 01 04                   ;  C_SWEEP_VOICE_REGISTER retister=00 numSteps=18 initFreq=44 deltaFreq=01 timeBetween=04
F534: C0 14 5C FF 04                   ;  C_SWEEP_VOICE_REGISTER retister=00 numSteps=14 initFreq=5C deltaFreq=FF timeBetween=04
F539: 48 0B                            ; REGISTER AY0:08 0B ...
F53B: C0 18 48 01 04                   ;  C_SWEEP_VOICE_REGISTER retister=00 numSteps=18 initFreq=48 deltaFreq=01 timeBetween=04
F540: C0 14 60 FF 04                   ;  C_SWEEP_VOICE_REGISTER retister=00 numSteps=14 initFreq=60 deltaFreq=FF timeBetween=04
F545: 48 0A                            ; REGISTER AY0:08 0A ...
F547: C0 14 4C 01 04                   ;  C_SWEEP_VOICE_REGISTER retister=00 numSteps=14 initFreq=4C deltaFreq=01 timeBetween=04
F54C: C0 18 60 FF 04                   ;  C_SWEEP_VOICE_REGISTER retister=00 numSteps=18 initFreq=60 deltaFreq=FF timeBetween=04
F551: 48 0B                            ; REGISTER AY0:08 0B ...
F553: C0 14 48 01 04                   ;  C_SWEEP_VOICE_REGISTER retister=00 numSteps=14 initFreq=48 deltaFreq=01 timeBetween=04
F558: C0 18 5C FF 04                   ;  C_SWEEP_VOICE_REGISTER retister=00 numSteps=18 initFreq=5C deltaFreq=FF timeBetween=04
F55D: 48 0C                            ; REGISTER AY0:08 0C ...
F55F: C0 14 44 01 04                   ;  C_SWEEP_VOICE_REGISTER retister=00 numSteps=14 initFreq=44 deltaFreq=01 timeBetween=04
F564: C0 18 58 FF 04                   ;  C_SWEEP_VOICE_REGISTER retister=00 numSteps=18 initFreq=58 deltaFreq=FF timeBetween=04
F569: FE F5 21                         ; CALL F521(1)

; BackgroundMusic
;  Script for command $18 - Background music (test 9)
;
;  Sound processing divides the NMI clock (4KHz) by 16. The sound tick thus runs at
;  4000/16 = 250Hz (each tick lasts 0.004 seconds ... 4Ms).
;
;  The song loop is defined by 12 fragments. Each fragment has 16 delays of (20) ticks, (32 decimal).
;  The CALL and RETURN for each fragment take 1 tick each.
;  Thus the song takes 12*(32*16+2) = 6168 ticks.
;
;  6168 * 4Ms = 24.672 seconds to play entire song through once
;
F56C: 6D 10        ; 1 VOLUME_DECAY_SPEED voice=1 10 ...
F56E: 46 00        ; 2 REGISTER AY0:06 00 ...
F570: 4B 00        ; 3 REGISTER AY0:0B 00 ...
F572: 4C 02        ; 4 REGISTER AY0:0C 02 ...
F574: 4A 10        ; 5 REGISTER AY0:0A 10 ...
F576: 66 DD        ; 6 MIXER_AND AY0 11_011_101 ...
;
F578: FE F5 9F     ; 7 CALL F59F(1)   - Fragment A
F57B: FE F5 F4     ; 8 CALL F5F4(1)   - Fragment B
F57E: FE F5 9F     ; 9 CALL F59F(1)   - Fragment A
F581: FE F5 F4     ; 10 CALL F5F4(1)  - Fragment B
F584: FE F6 A2     ; 11 CALL F6A2(1)  - Fragment C
F587: FE F6 F9     ; 12 CALL F6F9(1)  - Fragment D
F58A: FE F5 9F     ; 13 CALL F59F(1)  - Fragment A
F58D: FE F5 F4     ; 14 CALL F5F4(1)  - Fragment B
F590: FE F7 54     ; 15 CALL F754(1)  - Fragment E
F593: FE F6 A2     ; 16 CALL F6A2(1)  - Fragment C
F596: FE F5 9F     ; 17 CALL F59F(1)  - Fragment A
F599: FE F6 4B     ; 18 CALL F64B(1)  - Fragment F
;
F59C: FE F5 6C     ; 19 CALL F56C(1) (GOTO)
;
F59F: 42 A7        ; 20 REGISTER AY0:02 A7 ...
F5A1: 43 02        ; 21 REGISTER AY0:03 02 ...                      
F5A3: 69 0E        ; 22 SET_VOLUME_AND_RESET_DECAY voice=1 0D ... 
F5A5: 0D 09 20     ; 23 REGISTER AY0:0D 09 (20)                   * E2  82.37168630338734
F5A8: 0D 09 20     ; 24 REGISTER AY0:0D 09 (20)                   * 
F5AB: 69 0E        ; 25 SET_VOLUME_AND_RESET_DECAY voice=1 0D ... 
F5AD: 0D 09 20     ; 26 REGISTER AY0:0D 09 (20)                   * E2  82.37168630338734
F5B0: 0D 09 20     ; 27 REGISTER AY0:0D 09 (20)                   * 
F5B3: 42 51        ; 28 REGISTER AY0:02 51 ...
F5B5: 43 01        ; 29 REGISTER AY0:03 01 ...                    
F5B7: 69 0E        ; 30 SET_VOLUME_AND_RESET_DECAY voice=1 0D ... 
F5B9: 0D 09 20     ; 31 REGISTER AY0:0D 09 (20)                   * E3  165.96550445103858
F5BC: 0D 09 20     ; 32 REGISTER AY0:0D 09 (20)                   * 
F5BF: 69 0E        ; 33 SET_VOLUME_AND_RESET_DECAY voice=1 0D ... 
F5C1: 0D 09 20     ; 34 REGISTER AY0:0D 09 (20)                   * E3  165.96550445103858
F5C4: 42 7A        ; 35 REGISTER AY0:02 7A ...                    
F5C6: 69 0E        ; 36 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F5C8: 0D 09 20     ; 37 REGISTER AY0:0D 09 (20)                   * D3  147.96395502645504
F5CB: 0D 09 20     ; 38 REGISTER AY0:0D 09 (20)                   * 
F5CE: 69 0E        ; 39 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F5D0: 0D 09 20     ; 40 REGISTER AY0:0D 09 (20)                   * D3  147.96395502645504
F5D3: 42 C1        ; 41 REGISTER AY0:02 C1 ...                    
F5D5: 69 0E        ; 42 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F5D7: 0D 09 20     ; 43 REGISTER AY0:0D 09 (20)                   * B2  124.56653674832963
F5DA: 0D 09 20     ; 44 REGISTER AY0:0D 09 (20)                   * 
F5DD: 42 7A        ; 45 REGISTER AY0:02 7A ...                     
F5DF: 69 0E        ; 46 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F5E1: 0D 09 20     ; 47 REGISTER AY0:0D 09 (20)                   * D3  147.96395502645504
F5E4: 0D 09 20     ; 48 REGISTER AY0:0D 09 (20)                   * 
F5E7: 42 51        ; 49 REGISTER AY0:02 51 ...
F5E9: 43 01        ; 50 REGISTER AY0:03 01 ...                      
F5EB: 69 0E        ; 51 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F5ED: 0D 09 20     ; 52 REGISTER AY0:0D 09 (20)                   * E3  165.96550445103858
F5F0: 0D 09 20     ; 53 REGISTER AY0:0D 09 (20)                   * 
F5F3: FD           ; 54 RETURN (1)
;
F5F4: 42 A7        ; 55 REGISTER AY0:02 A7 ...
F5F6: 43 02        ; 56 REGISTER AY0:03 02 ...
F5F8: 69 0E        ; 57 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F5FA: 0D 09 20     ; 58 REGISTER AY0:0D 09 (20)                  * E2  82.37168630338734
F5FD: 0D 09 20     ; 59 REGISTER AY0:0D 09 (20)                  * 
F600: 69 0E        ; 60 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F602: 0D 09 20     ; 61 REGISTER AY0:0D 09 (20)                  * E2  82.37168630338734
F605: 0D 09 20     ; 62 REGISTER AY0:0D 09 (20)                  * 
F608: 42 51        ; 63 REGISTER AY0:02 51 ...
F60A: 43 01        ; 64 REGISTER AY0:03 01 ...
F60C: 69 0E        ; 65 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F60E: 0D 09 20     ; 66 REGISTER AY0:0D 09 (20)                  * E3  165.96550445103858
F611: 0D 09 20     ; 67 REGISTER AY0:0D 09 (20)                  * 
F614: 69 0E        ; 68 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F616: 0D 09 20     ; 69 REGISTER AY0:0D 09 (20)                  * E3  165.96550445103858
F619: 42 7A        ; 70 REGISTER AY0:02 7A ...
F61B: 69 0E        ; 71 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F61D: 0D 09 20     ; 72 REGISTER AY0:0D 09 (20)                  * D3  147.96395502645504
F620: 0D 09 20     ; 73 REGISTER AY0:0D 09 (20)                  * 
F623: 69 0E        ; 74 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F625: 0D 09 20     ; 75 REGISTER AY0:0D 09 (20)                  * D3  147.96395502645504
F628: 42 C1        ; 76 REGISTER AY0:02 C1 ...
F62A: 69 0E        ; 77 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F62C: 0D 09 20     ; 78 REGISTER AY0:0D 09 (20)                  * B2  124.56653674832963
F62F: 0D 09 20     ; 79 REGISTER AY0:0D 09 (20)                  * 
F632: 42 FC        ; 80 REGISTER AY0:02 FC ...
F634: 69 0E        ; 81 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F636: 0D 09 20     ; 82 REGISTER AY0:0D 09 (20)                  * A2  110.09916338582677
F639: 42 DD        ; 83 REGISTER AY0:02 DD ...
F63B: 69 0E        ; 84 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F63D: 0D 09 20     ; 85 REGISTER AY0:0D 09 (20)                  * A#2 117.25445492662473
F640: 42 C1        ; 86 REGISTER AY0:02 C1 ...
F642: 69 0E        ; 87 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F644: 0D 09 20     ; 88 REGISTER AY0:0D 09 (20)                  * B2  124.56653674832963
F647: 0D 09 20     ; 89 REGISTER AY0:0D 09 (20)                  * 
F64A: FD           ; 90 RETURN (1)
;
F64B: 42 A7        ; 91 REGISTER AY0:02 A7 ...
F64D: 43 02        ; 92 REGISTER AY0:03 02 ...
F64F: 69 0E        ; 93 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F651: 0D 09 20     ; 94 REGISTER AY0:0D 09 (20)                  * E2  82.37168630338734
F654: 69 0E        ; 95 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F656: 0D 09 20     ; 96 REGISTER AY0:0D 09 (20)                  * E2  82.37168630338734
F659: 0D 09 20     ; 97 REGISTER AY0:0D 09 (20)                  * 
F65C: 69 0E        ; 98 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F65E: 0D 09 20     ; 99 REGISTER AY0:0D 09 (20)                  * E2  82.37168630338734
F661: 42 16        ; 100 REGISTER AY0:02 16 ...
F663: 69 0E        ; 101 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F665: 0D 09 20     ; 102 REGISTER AY0:0D 09 (20)                 * G#2 104.73852996254682
F668: 69 0E        ; 103 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F66A: 0D 09 20     ; 104 REGISTER AY0:0D 09 (20)                 * G#2 104.73852996254682
F66D: 0D 09 20     ; 105 REGISTER AY0:0D 09 (20)                 * 
F670: 69 0E        ; 106 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F672: 0D 09 20     ; 107 REGISTER AY0:0D 09 (20)                 * G#2 104.73852996254682
F675: 42 FC        ; 108 REGISTER AY0:02 FC ...
F677: 43 01        ; 109 REGISTER AY0:03 01 ...
F679: 69 0E        ; 110 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F67B: 0D 09 20     ; 111 REGISTER AY0:0D 09 (20)                 * A2  110.09916338582677
F67E: 69 0E        ; 112 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F680: 0D 09 20     ; 113 REGISTER AY0:0D 09 (20)                 * A2  110.09916338582677
F683: 0D 09 20     ; 114 REGISTER AY0:0D 09 (20)                 * 
F686: 69 0E        ; 115 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F688: 0D 09 20     ; 116 REGISTER AY0:0D 09 (20)                 * A2  110.09916338582677
F68B: 42 DD        ; 117 REGISTER AY0:02 DD ...
F68D: 69 0E        ; 118 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F68F: 0D 09 20     ; 119 REGISTER AY0:0D 09 (20)                 * A#2 117.25445492662473
F692: 69 0E        ; 120 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F694: 0D 09 20     ; 121 REGISTER AY0:0D 09 (20)                 * A#2 117.25445492662473
F697: 0D 09 20     ; 122 REGISTER AY0:0D 09 (20)                 * 
F69A: 42 C1        ; 123 REGISTER AY0:02 C1 ...
F69C: 69 0E        ; 124 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F69E: 0D 09 20     ; 125 REGISTER AY0:0D 09 (20)                 * B2  124.56653674832963
F6A1: FD           ; 126 RETURN (1)
;
F6A2: 42 FC        ; 127 REGISTER AY0:02 FC ...
F6A4: 43 01        ; 128 REGISTER AY0:03 01 ...
F6A6: 69 0E        ; 129 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F6A8: 0D 09 20     ; 130 REGISTER AY0:0D 09 (20)                 * A2  110.09916338582677
F6AB: 0D 09 20     ; 131 REGISTER AY0:0D 09 (20)                 * 
F6AE: 69 0E        ; 132 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F6B0: 0D 09 20     ; 133 REGISTER AY0:0D 09 (20)                 * A2  110.09916338582677
F6B3: 0D 09 20     ; 134 REGISTER AY0:0D 09 (20)                 * 
F6B6: 42 FD        ; 135 REGISTER AY0:02 FD ...
F6B8: 43 00        ; 136 REGISTER AY0:03 00 ...
F6BA: 69 0E        ; 137 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F6BC: 0D 09 20     ; 138 REGISTER AY0:0D 09 (20)                 * A3  221.06867588932806
F6BF: 0D 09 20     ; 139 REGISTER AY0:0D 09 (20)                 * 
F6C2: 69 0E        ; 140 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F6C4: 0D 09 20     ; 141 REGISTER AY0:0D 09 (20)                 * A3  221.06867588932806
F6C7: 42 1C        ; 142 REGISTER AY0:02 1C ...
F6C9: 43 01        ; 143 REGISTER AY0:03 01 ...
F6CB: 69 0E        ; 144 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F6CD: 0D 09 20     ; 145 REGISTER AY0:0D 09 (20)                 * G3  196.93794014084506
F6D0: 0D 09 20     ; 146 REGISTER AY0:0D 09 (20)                 * 
F6D3: 69 0E        ; 147 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F6D5: 0D 09 20     ; 148 REGISTER AY0:0D 09 (20)                 * G3  196.93794014084506
F6D8: 42 51        ; 149 REGISTER AY0:02 51 ...
F6DA: 69 0E        ; 150 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F6DC: 0D 09 20     ; 151 REGISTER AY0:0D 09 (20)                 * E3  165.96550445103858
F6DF: 0D 09 20     ; 152 REGISTER AY0:0D 09 (20)                 * 
F6E2: 42 1C        ; 153 REGISTER AY0:02 1C ...
F6E4: 69 0E        ; 154 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F6E6: 0D 09 20     ; 155 REGISTER AY0:0D 09 (20)                 * G3  196.93794014084506
F6E9: 0D 09 20     ; 156 REGISTER AY0:0D 09 (20)                 * 
F6EC: 42 FD        ; 157 REGISTER AY0:02 FD ...
F6EE: 43 00        ; 158 REGISTER AY0:03 00 ...
F6F0: 69 0E        ; 159 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F6F2: 0D 09 20     ; 160 REGISTER AY0:0D 09 (20)                 * A3  221.06867588932806
F6F5: 0D 09 20     ; 161 REGISTER AY0:0D 09 (20)                 * 
F6F8: FD           ; 162 RETURN (1)
;
F6F9: 42 FC        ; 163 REGISTER AY0:02 FC ...
F6FB: 43 01        ; 164 REGISTER AY0:03 01 ...
F6FD: 69 0E        ; 165 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F6FF: 0D 09 20     ; 166 REGISTER AY0:0D 09 (20)                 * A2  110.09916338582677
F702: 0D 09 20     ; 167 REGISTER AY0:0D 09 (20)                 * 
F705: 69 0E        ; 168 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F707: 0D 09 20     ; 169 REGISTER AY0:0D 09 (20)                 * A2  110.09916338582677
F70A: 0D 09 20     ; 170 REGISTER AY0:0D 09 (20)                 * 
F70D: 42 FD        ; 171 REGISTER AY0:02 FD ...
F70F: 43 00        ; 172 REGISTER AY0:03 00 ...
F711: 69 0E        ; 173 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F713: 0D 09 20     ; 174 REGISTER AY0:0D 09 (20)                 * A3  221.06867588932806
F716: 0D 09 20     ; 175 REGISTER AY0:0D 09 (20)                 * 
F719: 69 0E        ; 176 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F71B: 0D 09 20     ; 177 REGISTER AY0:0D 09 (20)                 * A3  221.06867588932806
F71E: 42 1C        ; 178 REGISTER AY0:02 1C ...
F720: 43 01        ; 179 REGISTER AY0:03 01 ...
F722: 69 0E        ; 180 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F724: 0D 09 20     ; 181 REGISTER AY0:0D 09 (20)                 * G3  196.93794014084506
F727: 0D 09 20     ; 182 REGISTER AY0:0D 09 (20)                 * 
F72A: 69 0E        ; 183 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F72C: 0D 09 20     ; 184 REGISTER AY0:0D 09 (20)                 * G3  196.93794014084506
F72F: 42 51        ; 185 REGISTER AY0:02 51 ...
F731: 69 0E        ; 186 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F733: 0D 09 20     ; 187 REGISTER AY0:0D 09 (20)                 * E3  165.96550445103858
F736: 0D 09 20     ; 188 REGISTER AY0:0D 09 (20)                 * 
F739: 42 7A        ; 189 REGISTER AY0:02 7A ...
F73B: 43 01        ; 190 REGISTER AY0:03 01 ...
F73D: 69 0E        ; 191 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F73F: 0D 09 20     ; 192 REGISTER AY0:0D 09 (20)                 * D3  147.96395502645504
F742: 42 65        ; 193 REGISTER AY0:02 65 ...
F744: 69 0E        ; 194 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F746: 0D 09 20     ; 195 REGISTER AY0:0D 09 (20)                 * D#3 156.66771708683473
F749: 42 51        ; 196 REGISTER AY0:02 51 ...
F74B: 69 0E        ; 197 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F74D: 0D 09 20     ; 198 REGISTER AY0:0D 09 (20)                 * E3  165.96550445103858
F750: 0D 09 20     ; 199 REGISTER AY0:0D 09 (20)                 * 
F753: FD           ; 200 RETURN (1)
;
F754: 42 C1        ; 201 REGISTER AY0:02 C1 ...
F756: 43 01        ; 202 REGISTER AY0:03 01 ...
F758: 69 0E        ; 203 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F75A: 0D 09 20     ; 204 REGISTER AY0:0D 09 (20)                 * B2  124.56653674832963
F75D: 0D 09 20     ; 205 REGISTER AY0:0D 09 (20)                 * 
F760: 69 0E        ; 206 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F762: 0D 09 20     ; 207 REGISTER AY0:0D 09 (20)                 * B2  124.56653674832963
F765: 0D 09 20     ; 208 REGISTER AY0:0D 09 (20)                 * 
F768: 42 E1        ; 209 REGISTER AY0:02 E1 ...
F76A: 43 00        ; 210 REGISTER AY0:03 00 ...
F76C: 69 0E        ; 211 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F76E: 0D 09 20     ; 212 REGISTER AY0:0D 09 (20)                 * B3  248.57944444444445
F771: 0D 09 20     ; 213 REGISTER AY0:0D 09 (20)                 * 
F774: 69 0E        ; 214 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F776: 0D 09 20     ; 215 REGISTER AY0:0D 09 (20)                 * B3  248.57944444444445
F779: 42 FD        ; 216 REGISTER AY0:02 FD ...
F77B: 69 0E        ; 217 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F77D: 0D 09 20     ; 218 REGISTER AY0:0D 09 (20)                 * A3  221.06867588932806
F780: 0D 09 20     ; 219 REGISTER AY0:0D 09 (20)                 * 
F783: 69 0E        ; 220 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F785: 0D 09 20     ; 221 REGISTER AY0:0D 09 (20)                 * A3  221.06867588932806
F788: 42 2C        ; 222 REGISTER AY0:02 2C ...
F78A: 43 01        ; 223 REGISTER AY0:03 01 ...
F78C: 69 0E        ; 224 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F78E: 0D 09 20     ; 225 REGISTER AY0:0D 09 (20)                 * F#3 186.43458333333334
F791: 0D 09 20     ; 226 REGISTER AY0:0D 09 (20)                 * 
F794: 42 FD        ; 227 REGISTER AY0:02 FD ...
F796: 43 00        ; 228 REGISTER AY0:03 00 ...
F798: 69 0E        ; 229 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F79A: 0D 09 20     ; 230 REGISTER AY0:0D 09 (20)                 * A3  221.06867588932806
F79D: 0D 09 20     ; 231 REGISTER AY0:0D 09 (20)                 * 
F7A0: 42 E1        ; 232 REGISTER AY0:02 E1 ...
F7A2: 69 0E        ; 233 SET_VOLUME_AND_RESET_DECAY voice=1 0D ...
F7A4: 0D 09 20     ; 234 REGISTER AY0:0D 09 (20)                 * B3  248.57944444444445
F7A7: 0D 09 20     ; 235 REGISTER AY0:0D 09 (20)                 * 
F7AA: FD           ; 246 RETURN (1)

; Missile
;  Script for command $12 - Missile from car (test 4)
F7AB: 76 FE                            ; MIXER_AND AY1 11_111_110 ...
F7AD: 51 00                            ; REGISTER AY1:01 00 ...
F7AF: 58 0D                            ; REGISTER AY1:08 0D ...
F7B1: D0 0B 20 FF 04                   ;  C_SWEEP_VOICE_REGISTER retister=10 numSteps=0B initFreq=20 deltaFreq=FF timeBetween=04
F7B6: 77 01                            ; MIXER_OR AY1 00_000_001 ...
F7B8: FF                               ; STOP

; UFOExplosion
;  Script for command $11 - UFO explosion (test 3)
F7B9: 76 FE                            ; MIXER_AND AY1 11_111_110 ...
F7BB: 58 10                            ; REGISTER AY1:08 10 ...
F7BD: 51 00                            ; REGISTER AY1:01 00 ...
F7BF: 5C 18                            ; REGISTER AY1:0C 18 ...
F7C1: 5D 09                            ; REGISTER AY1:0D 09 ...
F7C3: 90 18 0E                         ;  C_REGISTER_SAMPLES register=10 numSamples=18 timeBetween=0E
F7C6: 60 50 60 72 60 50 60 72 60 50 60 72 60 50 60 72 60 50 60 72 60 50 60 72
F7DE: 77 01                            ; MIXER_OR AY1 00_000_001 ...
F7E0: FF                               ; STOP

; PassPoint
;  Script for command $10 - Passing one point (test 2)
F7E1: 76 FE                            ; MIXER_AND AY1 11_111_110 ...
F7E3: 58 10                            ; REGISTER AY1:08 10 ...
F7E5: 50 4C                            ; REGISTER AY1:00 4C ...
F7E7: 51 00                            ; REGISTER AY1:01 00 ...
F7E9: 5C 14                            ; REGISTER AY1:0C 14 ...
F7EB: 1D 09 E0                         ; REGISTER AY1:0D 09 (E0)
F7EE: 77 01                            ; MIXER_OR AY1 00_000_001 ...
F7F0: FF                               ; STOP

; Coin
;  Script for command $13 - Coin (test 5)
F7F1: 50 70                            ; REGISTER AY1:00 70 ...
F7F3: 51 00                            ; REGISTER AY1:01 00 ...
F7F5: 76 FE                            ; MIXER_AND AY1 11_111_110 ...
F7F7: 58 10                            ; REGISTER AY1:08 10 ...
F7F9: 5B 00                            ; REGISTER AY1:0B 00 ...
F7FB: 5C 10                            ; REGISTER AY1:0C 10 ...
F7FD: 1D 09 E0                         ; REGISTER AY1:0D 09 (E0)
F800: 77 01                            ; MIXER_OR AY1 00_000_001 ...
F802: FF                               ; STOP

; Jump
;  Script for command $14 - Car jump (test 6)
F803: 52 00                            ; REGISTER AY1:02 00 ...
F805: 53 05                            ; REGISTER AY1:03 05 ...
F807: 55 00                            ; REGISTER AY1:05 00 ...
F809: 76 F9                            ; MIXER_AND AY1 11_111_001 ...
F80B: 59 0F                            ; REGISTER AY1:09 0F ...
F80D: 5A 0F                            ; REGISTER AY1:0A 0F ...
F80F: D4 08 60 01 04                   ;   C_SWEEP_VOICE_REGISTER retister=14 numSteps=08 initFreq=60 deltaFreq=01 timeBetween=04
F814: 59 0E                            ; REGISTER AY1:09 0E ...
F816: 5A 0E                            ; REGISTER AY1:0A 0E ...
F818: D4 08 68 01 04                   ;   C_SWEEP_VOICE_REGISTER retister=14 numSteps=08 initFreq=68 deltaFreq=01 timeBetween=04
F81D: 59 0D                            ; REGISTER AY1:09 0D ...
F81F: 5A 0D                            ; REGISTER AY1:0A 0D ...
F821: D4 08 70 01 04                   ;   C_SWEEP_VOICE_REGISTER retister=14 numSteps=08 initFreq=70 deltaFreq=01 timeBetween=04
F826: 59 0C                            ; REGISTER AY1:09 0C ...
F828: 5A 0C                            ; REGISTER AY1:0A 0C ...
F82A: D4 08 78 01 04                   ;   C_SWEEP_VOICE_REGISTER retister=14 numSteps=08 initFreq=78 deltaFreq=01 timeBetween=04
F82F: 59 0B                            ; REGISTER AY1:09 0B ...
F831: 5A 0B                            ; REGISTER AY1:0A 0B ...
F833: D4 08 80 01 04                   ;   C_SWEEP_VOICE_REGISTER retister=14 numSteps=08 initFreq=80 deltaFreq=01 timeBetween=04
F838: 59 0A                            ; REGISTER AY1:09 0A ...
F83A: 5A 0A                            ; REGISTER AY1:0A 0A ...
F83C: D4 08 88 01 04                   ;   C_SWEEP_VOICE_REGISTER retister=14 numSteps=08 initFreq=88 deltaFreq=01 timeBetween=04
F841: 59 09                            ; REGISTER AY1:09 09 ...
F843: 5A 09                            ; REGISTER AY1:0A 09 ...
F845: D4 08 90 01 04                   ;   C_SWEEP_VOICE_REGISTER retister=14 numSteps=08 initFreq=90 deltaFreq=01 timeBetween=04
F84A: 77 06                            ; MIXER_OR AY1 00_000_110 ...
F84C: FF                               ; STOP

; StartMusic
;  Script for command $1C - Opening music (test 11)
F84D: 6C 14                            ; VOLUME_DECAY_SPEED voice=0 14 ...
F84F: 6D 14                            ; VOLUME_DECAY_SPEED voice=1 14 ...
F851: 6E 0A                            ; VOLUME_DECAY_SPEED voice=2 0A ...
F853: 42 DD                            ; REGISTER AY0:02 DD ...
F855: 43 01                            ; REGISTER AY0:03 01 ...
F857: 4A 10                            ; REGISTER AY0:0A 10 ...
F859: 46 00                            ; REGISTER AY0:06 00 ...
F85B: 4B 00                            ; REGISTER AY0:0B 00 ...
F85D: 4C 04                            ; REGISTER AY0:0C 04 ...
F85F: 47 9C                            ; REGISTER AY0:07 9C ...
F861: FE F8 79                         ; CALL F879(1)
F864: FE F8 79                         ; CALL F879(1)
F867: 47 B8                            ; REGISTER AY0:07 B8 ...
F869: 40 EE                            ; REGISTER AY0:00 EE ...
F86B: 44 77                            ; REGISTER AY0:04 77 ...
F86D: 45 00                            ; REGISTER AY0:05 00 ...
F86F: 68 0F                            ; SET_VOLUME_AND_RESET_DECAY voice=0 0F ...
F871: 69 0F                            ; SET_VOLUME_AND_RESET_DECAY voice=1 0F ...
F873: 2A 0F 40                         ; SET_VOLUME_AND_RESET_DECAY voice=2 0F (40)
F876: 47 BF                            ; REGISTER AY0:07 BF ...
F878: FF                               ; STOP
F879: 40 EE                            ; REGISTER AY0:00 EE ...
F87B: 41 00                            ; REGISTER AY0:01 00 ...
F87D: 68 0F                            ; SET_VOLUME_AND_RESET_DECAY voice=0 0F ...
F87F: 49 00                            ; REGISTER AY0:09 00 ...
F881: 0D 09 20                         ; REGISTER AY0:0D 09 (20)
F884: 0D 09 20                         ; REGISTER AY0:0D 09 (20)
F887: 68 0F                            ; SET_VOLUME_AND_RESET_DECAY voice=0 0F ...
F889: 0D 09 20                         ; REGISTER AY0:0D 09 (20)
F88C: 0D 09 20                         ; REGISTER AY0:0D 09 (20)
F88F: 40 86                            ; REGISTER AY0:00 86 ...
F891: 68 0F                            ; SET_VOLUME_AND_RESET_DECAY voice=0 0F ...
F893: 69 0F                            ; SET_VOLUME_AND_RESET_DECAY voice=1 0F ...
F895: 0D 09 20                         ; REGISTER AY0:0D 09 (20)
F898: 68 0F                            ; SET_VOLUME_AND_RESET_DECAY voice=0 0F ...
F89A: 0D 09 20                         ; REGISTER AY0:0D 09 (20)
F89D: 48 00                            ; REGISTER AY0:08 00 ...
F89F: 49 00                            ; REGISTER AY0:09 00 ...
F8A1: 0D 09 20                         ; REGISTER AY0:0D 09 (20)
F8A4: 40 9F                            ; REGISTER AY0:00 9F ...
F8A6: 69 0F                            ; SET_VOLUME_AND_RESET_DECAY voice=1 0F ...
F8A8: 68 0F                            ; SET_VOLUME_AND_RESET_DECAY voice=0 0F ...
F8AA: 0D 09 20                         ; REGISTER AY0:0D 09 (20)
F8AD: 48 00                            ; REGISTER AY0:08 00 ...
F8AF: 0D 09 20                         ; REGISTER AY0:0D 09 (20)
F8B2: 49 00                            ; REGISTER AY0:09 00 ...
F8B4: 0D 09 20                         ; REGISTER AY0:0D 09 (20)
F8B7: 40 1C                            ; REGISTER AY0:00 1C ...
F8B9: 41 01                            ; REGISTER AY0:01 01 ...
F8BB: 68 0F                            ; SET_VOLUME_AND_RESET_DECAY voice=0 0F ...
F8BD: 0D 09 20                         ; REGISTER AY0:0D 09 (20)
F8C0: 40 86                            ; REGISTER AY0:00 86 ...
F8C2: 41 00                            ; REGISTER AY0:01 00 ...
F8C4: 0D 09 20                         ; REGISTER AY0:0D 09 (20)
F8C7: 40 0C                            ; REGISTER AY0:00 0C ...
F8C9: 41 01                            ; REGISTER AY0:01 01 ...
F8CB: 68 0F                            ; SET_VOLUME_AND_RESET_DECAY voice=0 0F ...
F8CD: 69 0F                            ; SET_VOLUME_AND_RESET_DECAY voice=1 0F ...
F8CF: 0D 09 20                         ; REGISTER AY0:0D 09 (20)
F8D2: 40 86                            ; REGISTER AY0:00 86 ...
F8D4: 41 00                            ; REGISTER AY0:01 00 ...
F8D6: 68 0F                            ; SET_VOLUME_AND_RESET_DECAY voice=0 0F ...
F8D8: 0D 09 20                         ; REGISTER AY0:0D 09 (20)
F8DB: 40 FD                            ; REGISTER AY0:00 FD ...
F8DD: 68 0F                            ; SET_VOLUME_AND_RESET_DECAY voice=0 0F ...
F8DF: 49 00                            ; REGISTER AY0:09 00 ...
F8E1: 0D 09 20                         ; REGISTER AY0:0D 09 (20)
F8E4: 40 7E                            ; REGISTER AY0:00 7E ...
F8E6: 68 0F                            ; SET_VOLUME_AND_RESET_DECAY voice=0 0F ...
F8E8: 0D 09 20                         ; REGISTER AY0:0D 09 (20)
F8EB: FD                               ; RETURN (1)

; Congratulations
;  Script for command $1E - Congratulations (test 13)
F8EC: 66 F8                            ; MIXER_AND AY0 11_111_000 ...
F8EE: 48 10                            ; REGISTER AY0:08 10 ...
F8F0: 49 10                            ; REGISTER AY0:09 10 ...
F8F2: 4A 10                            ; REGISTER AY0:0A 10 ...
F8F4: 4B 00                            ; REGISTER AY0:0B 00 ...
F8F6: 4C 10                            ; REGISTER AY0:0C 10 ...
F8F8: FE F9 2D                         ; CALL F92D(1)
F8FB: FE F9 46                         ; CALL F946(1)
F8FE: FE F9 2D                         ; CALL F92D(1)
F901: 20 77 00 28                      ; THREETONE AY0:00 fine=77 coarse=00 (28)
F905: 20 7E 00 28                      ; THREETONE AY0:00 fine=7E coarse=00 (28)
F909: 20 8E 00 28                      ; THREETONE AY0:00 fine=8E coarse=00 (28)
F90D: 20 9F 00 78                      ; THREETONE AY0:00 fine=9F coarse=00 (78)
F911: FE F9 2D                         ; CALL F92D(1)
F914: FE F9 46                         ; CALL F946(1)
F917: FE F9 2D                         ; CALL F92D(1)
F91A: 20 3E 01 28                      ; THREETONE AY0:00 fine=3E coarse=01 (28)
F91E: 20 1C 01 28                      ; THREETONE AY0:00 fine=1C coarse=01 (28)
F922: 20 FD 00 28                      ; THREETONE AY0:00 fine=FD coarse=00 (28)
F926: 20 EE 00 78                      ; THREETONE AY0:00 fine=EE coarse=00 (78)
F92A: 67 07                            ; MIXER_OR AY0 00_000_111 ...
F92C: FF                               ; STOP
F92D: 20 EE 00 28                      ; THREETONE AY0:00 fine=EE coarse=00 (28)
F931: 20 9F 00 28                      ; THREETONE AY0:00 fine=9F coarse=00 (28)
F935: 20 77 00 28                      ; THREETONE AY0:00 fine=77 coarse=00 (28)
F939: 20 5E 00 28                      ; THREETONE AY0:00 fine=5E coarse=00 (28)
F93D: 20 77 00 28                      ; THREETONE AY0:00 fine=77 coarse=00 (28)
F941: 20 9F 00 28                      ; THREETONE AY0:00 fine=9F coarse=00 (28)
F945: FD                               ; RETURN (1)
F946: 20 59 00 28                      ; THREETONE AY0:00 fine=59 coarse=00 (28)
F94A: 20 77 00 28                      ; THREETONE AY0:00 fine=77 coarse=00 (28)
F94E: 20 9F 00 28                      ; THREETONE AY0:00 fine=9F coarse=00 (28)
F952: 20 4F 00 28                      ; THREETONE AY0:00 fine=4F coarse=00 (28)
F956: 20 6A 00 28                      ; THREETONE AY0:00 fine=6A coarse=00 (28)
F95A: 20 9F 00 28                      ; THREETONE AY0:00 fine=9F coarse=00 (28)
F95E: FD                               ; RETURN (1)

; CarExplosion
;  Script for command $1F - Car explosion (test 14)
F95F: 46 10                            ; REGISTER AY0:06 10 ...
F961: 66 C7                            ; MIXER_AND AY0 11_000_111 ...
F963: 48 10                            ; REGISTER AY0:08 10 ...
F965: 49 10                            ; REGISTER AY0:09 10 ...
F967: 4A 10                            ; REGISTER AY0:0A 10 ...
F969: 4B 00                            ; REGISTER AY0:0B 00 ...
F96B: 4C 0A                            ; REGISTER AY0:0C 0A ...
F96D: 0D 09 20                         ; REGISTER AY0:0D 09 (20)
F970: 0D 09 20                         ; REGISTER AY0:0D 09 (20)
F973: 0D 09 20                         ; REGISTER AY0:0D 09 (20)
F976: 4C 20                            ; REGISTER AY0:0C 20 ...
F978: 0D 09 FE                         ; REGISTER AY0:0D 09 (FE)
F97B: 00 00 00                         ; REGISTER AY0:00 00 (00)
F97E: 00 00 FE                         ; REGISTER AY0:00 00 (FE)
F981: 00 00 FE                         ; REGISTER AY0:00 00 (FE)
F984: 67 38                            ; MIXER_OR AY0 00_111_000 ...
F986: FF                               ; STOP

F987: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
F9A7: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
F9C7: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
F9E7: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
FA07: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
FA27: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
FA47: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
FA67: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
FA87: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
FAA7: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
FAC7: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
FAE7: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

; START
;  IRQ2, SWI, and RESET
; 
FB00: 0F          SEI                             ;  Turn interrupts off
FB01: 8E 00 FF    LDS     #$00FF                  ;  Set stack pointer
FB04: BD FC 98    JSR     $FC98                   ;  Clear memory and configure internal ports
FB07: 86 BF       LDA     #$BF                    ;  10_111_111 (no tones, no noise)
FB09: C6 07       LDB     #$07                    ;  Configure I/O and all sound off
FB0B: BD FC D8    JSR     $FCD8                   ;  Write value A to AY register B (no delay during write)
FB0E: 86 13       LDA     #$13                    ;  0001_0011 (Chip status)
FB10: C6 0F       LDB     #$0F                    ;  Ouput port
FB12: BD FC D8    JSR     $FCD8                   ;  Write value A to AY register B (no delay during write)
FB15: BD FC AD    JSR     $FCAD                   ;  Reset all sounds/scripts
FB18: 7F 90 00    CLR     $9000                   ;  ??watchdog??

; SoundLoop
;  * Main sound loop
; 
FB1B: 0F          SEI                             ;  Turn interrupts off
FB1C: BD FC 48    JSR     $FC48                   ;  Count down script times and volumes
FB1F: 96 BC       LDA     $BC                     ;  Sound command read by IRQ1
FB21: 2B 07       BMI     $FB2A                   ;  Nothing to do ... skip

FB23: BD FE E1    JSR     $FEE1                   ;  Handle sound command from main program
FB26: 86 FF       LDA     #$FF                    ;  Command ...
FB28: 97 BC       STA     $BC                     ;  ... processed

FB2A: 0E          CLI                             ;  Turn interrupts on

FB2B: CE 00 00    LDX     #$0000                  ;  Voice number 0
FB2E: DF D1       STX     $D1                     ;  Start with voice 0
FB30: 96 80       LDA     $80                     ;  Time for voice 0?
FB32: 26 0B       BNE     $FB3F                   ;  No ... move on
FB34: DE 84       LDX     $84                     ;  Get sequence 0 pointer
FB36: D6 8C       LDB     $8C                     ;  Command type running on sequencer 0
FB38: BD FD DC    JSR     $FDDC                   ;  Process sequence 0
FB3B: DF 84       STX     $84                     ;  Store new sequence pointer
FB3D: 97 80       STA     $80                     ;  Store new countdown timer

FB3F: 7C 00 D2    INC     $00D2                   ;  For Voice 1
FB42: 96 81       LDA     $81                     ;
FB44: 26 0B       BNE     $FB51                   ;
FB46: DE 86       LDX     $86                     ;
FB48: D6 8D       LDB     $8D                     ;
FB4A: BD FD DC    JSR     $FDDC                   ;
FB4D: DF 86       STX     $86                     ;
FB4F: 97 81       STA     $81                     ;

FB51: 7C 00 D2    INC     $00D2                   ;  For Voice 2
FB54: 96 82       LDA     $82                     ;
FB56: 26 0B       BNE     $FB63                   ;
FB58: DE 88       LDX     $88                     ;
FB5A: D6 8E       LDB     $8E                     ;
FB5C: BD FD DC    JSR     $FDDC                   ;
FB5F: DF 88       STX     $88                     ;
FB61: 97 82       STA     $82                     ;

FB63: 7C 00 D2    INC     $00D2                   ;  For Voice 3
FB66: 96 83       LDA     $83                     ;
FB68: 26 0B       BNE     $FB75                   ;
FB6A: DE 8A       LDX     $8A                     ;
FB6C: D6 8F       LDB     $8F                     ;
FB6E: BD FD DC    JSR     $FDDC                   ;
FB71: DF 8A       STX     $8A                     ;
FB73: 97 83       STA     $83                     ;

FB75: 96 A8       LDA     $A8                     ;  Decrement volume 0-0 command
FB77: 27 08       BEQ     $FB81                   ;  Nothing ... skip
FB79: 7F 00 A8    CLR     $00A8                   ;  Command taken
FB7C: C6 08       LDB     #$08                    ;  Decrement volume register 1-0
FB7E: BD FD 3A    JSR     $FD3A                   ;  Do it
FB81: 96 A9       LDA     $A9                     ;  Decrement volume 0-1 command
FB83: 27 08       BEQ     $FB8D                   ;
FB85: 7F 00 A9    CLR     $00A9                   ;
FB88: C6 09       LDB     #$09                    ;
FB8A: BD FD 3A    JSR     $FD3A                   ;
FB8D: 96 AA       LDA     $AA                     ;  Decrement volume 0-2 command
FB8F: 27 08       BEQ     $FB99                   ;
FB91: 7F 00 AA    CLR     $00AA                   ;
FB94: C6 0A       LDB     #$0A                    ;
FB96: BD FD 3A    JSR     $FD3A                   ;
FB99: 96 AB       LDA     $AB                     ;  Decrement volume 1-0 command
FB9B: 27 08       BEQ     $FBA5                   ;
FB9D: 7F 00 AB    CLR     $00AB                   ;
FBA0: C6 18       LDB     #$18                    ;
FBA2: BD FD 53    JSR     $FD53                   ;
FBA5: 96 AC       LDA     $AC                     ;  Decrement volume 1-1 command
FBA7: 27 08       BEQ     $FBB1                   ;
FBA9: 7F 00 AC    CLR     $00AC                   ;
FBAC: C6 19       LDB     #$19                    ;
FBAE: BD FD 53    JSR     $FD53                   ;
FBB1: 96 AD       LDA     $AD                     ;  Decrement volume 1-2 command
FBB3: 27 08       BEQ     $FBBD                   ;
FBB5: 7F 00 AD    CLR     $00AD                   ;
FBB8: C6 1A       LDB     #$1A                    ;
FBBA: BD FD 53    JSR     $FD53                   ;

FBBD: 96 BE       LDA     $BE                     ;  Status of samplers
FBBF: 16          TAB                             ;  Hold it
FBC0: 9A D8       ORA     $D8                     ;  OR into board status
FBC2: 0F          SEI                             ;  Disable interrupts
FBC3: 97 D8       STA     $D8                     ;  New chip status
FBC5: 54          LSRB                            ;  Is sampler 801 done?
FBC6: 24 09       BCC     $FBD1                   ;  No ... let it run
FBC8: D6 CB       LDB     $CB                     ;  Last sound command
FBCA: C1 02       CMPB    #$02                    ;  Did we finish sound #2 ?
FBCC: 26 03       BNE     $FBD1                   ;  No ... carry on
FBCE: 5C          INCB                            ;  Fall into ...
FBCF: D7 BC       STB     $BC                     ;  ... Sound command = 3

FBD1: C6 0F       LDB     #$0F                    ;  AY0 Output B
FBD3: BD FC DE    JSR     $FCDE                   ;  Send back board status
FBD6: 7E FB 1B    JMP     $FB1B                   ;  Back to top of music loop

; NMITimer
; NMI
; Play samples out 801 and 802. On tick ZZZ0000 enable AY sound script processing.
; This clock is driven by the MSM5205 chip requesting data. The MSM5205 is wired
; to pull samples at 4000Hz. This NMI handler runs at 4000Hz.
; 
FBD9: 96 C1       LDA     $C1                     ;  Current value for 801
FBDB: B7 08 01    STA     $0801                   ;  4-bit sample
FBDE: 96 C2       LDA     $C2                     ;  Current value for 802
FBE0: B7 08 02    STA     $0802                   ;  4-bit sample
FBE3: 7C 00 BD    INC     $00BD                   ;  NMI counter
FBE6: 96 BF       LDA     $BF                     ;
FBE8: 4C          INCA                            ;  Why not "INC BF" then "LDA BF" ? ...
FBE9: 97 BF       STA     $BF                     ;  ... Same number of bytes!
FBEB: 44          LSRA                            ;  Odd or even?
FBEC: 24 32       BCC     $FC20                   ;  Do this on even ticks

;  Odd NMI ticks
FBEE: DE C3       LDX     $C3                     ;  Decrement ...
FBF0: 09          DEX                             ;  ... 801 counter
FBF1: 27 1E       BEQ     $FC11                   ;  All done ... set bit 0 of BE and continue
FBF3: DF C3       STX     $C3                     ;  New counter
FBF5: DE C7       LDX     $C7                     ;  Pointer to bytes
FBF7: A6 00       LDA     $00,X                   ;  Get next byte
FBF9: 44          LSRA                            ;  Upper 4 bits
FBFA: 44          LSRA                            ;
FBFB: 44          LSRA                            ;
FBFC: 44          LSRA                            ;
FBFD: 97 C1       STA     $C1                     ;  Next value for 801

FBFF: DE C5       LDX     $C5                     ;  Decrement ...
FC01: 09          DEX                             ;  802 counter
FC02: 27 15       BEQ     $FC19                   ;  All done ... set bit 1 of BE and out
FC04: DF C5       STX     $C5                     ;  New counter
FC06: DE C9       LDX     $C9                     ;  Pointer to bytes
FC08: A6 00       LDA     $00,X                   ;  Get next byte
FC0A: 44          LSRA                            ;  Upper 4 bits
FC0B: 44          LSRA                            ;
FC0C: 44          LSRA                            ;
FC0D: 44          LSRA                            ;
FC0E: 97 C2       STA     $C2                     ;  Next value for 802
FC10: 3B          RTI                             

FC11: 86 01       LDA     #$01                    ;  Set bit 0 ...
FC13: 9A BE       ORA     $BE                     ;  ... of ...
FC15: 97 BE       STA     $BE                     ;  ... BE
FC17: 20 E6       BRA     $FBFF                   ;  Continue with bit 1

FC19: 86 02       LDA     #$02                    ;  Set bit 1 ...
FC1B: 9A BE       ORA     $BE                     ;  ... of ...
FC1D: 97 BE       STA     $BE                     ;  ... BE
FC1F: 3B          RTI                             ;  NMI out

;  Even NMI ticks
FC20: 96 C7       LDA     $C7                     ;  801 pointer
FC22: 81 A0       CMPA    #$A0                    ;  Pointer less than A0xx? (Hardware supports up to 24K ROM)
FC24: 25 09       BCS     $FC2F                   ;  Yes ... hold last value (Invalid pointer)
FC26: DE C7       LDX     $C7                     ;  801 pointer
FC28: A6 00       LDA     $00,X                   ;  Get value
FC2A: 97 C1       STA     $C1                     ;  Next value for 801 (lower 4 bits)
FC2C: 08          INX                             ;  Next sample
FC2D: DF C7       STX     $C7                     ;  Save pointer

FC2F: 96 C9       LDA     $C9                     ;  802 pointer
FC31: 81 A0       CMPA    #$A0                    ;  Pointer less than A0xx?
FC33: 25 09       BCS     $FC3E                   ;  Yes ... hold last value
FC35: DE C9       LDX     $C9                     ;  802 pointer
FC37: A6 00       LDA     $00,X                   ;  Get value
FC39: 97 C2       STA     $C2                     ;  Next value for 802
FC3B: 08          INX                             ;  Next sample
FC3C: DF C9       STX     $C9                     ;  Save pointer

FC3E: 96 BF       LDA     $BF                     ;  On tick zzzz0000 ...
FC40: 84 0E       ANDA    #$0E                    ;  ... process AY sound
FC42: 26 CC       BNE     $FC10                   ;  ...
FC44: 7C 00 C0    INC     $00C0                   ;  ...
FC47: 3B          RTI                             ;  NMI out


; The C0 flag gets set by the NMI handler at 4000/16 = 250Hz
;  * If processing sequence scripts, DECrement counters on each voice sequence
;    and lower the volume on the voices as requested.
; 
FC48: 96 C0       LDA     $C0                     ;  Time for scripts?
FC4A: 27 3E       BEQ     $FC8A                   ;  No ... skip
FC4C: 7A 00 C0    DEC     $00C0                   ;  Script pass made
FC4F: 96 80       LDA     $80                     ;  Decrement 80 (voice 0 sequence counter) if active
FC51: 27 06       BEQ     $FC59                   ;  0 ...
FC53: 4C          INCA                            ;  ... or FF ...
FC54: 27 03       BEQ     $FC59                   ;  ... don't DECrement
FC56: 7A 00 80    DEC     $0080                   ;
FC59: 96 81       LDA     $81                     ;  Decrement 81 (voice 1 sequence counter) if active
FC5B: 27 06       BEQ     $FC63                   ;
FC5D: 4C          INCA                            ;
FC5E: 27 03       BEQ     $FC63                   ;
FC60: 7A 00 81    DEC     $0081                   ;
FC63: 96 82       LDA     $82                     ;  Decrement 82 (voice 2 sequence counter) if active
FC65: 27 06       BEQ     $FC6D                   ;
FC67: 4C          INCA                            ;
FC68: 27 03       BEQ     $FC6D                   ;
FC6A: 7A 00 82    DEC     $0082                   ;
FC6D: 96 83       LDA     $83                     ;  Decrement 83 (voice 3 sequence counter) if active
FC6F: 27 06       BEQ     $FC77                   ;
FC71: 4C          INCA                            ;
FC72: 27 03       BEQ     $FC77                   ;
FC74: 7A 00 83    DEC     $0083                   ;
FC77: CE 00 06    LDX     #$0006                  ;  6 voices
FC7A: A6 AD       LDA     $AD,X                   ;  Countdown timer for volume DECrease
FC7C: 27 09       BEQ     $FC87                   ;  Not active ... skip
FC7E: 4A          DECA                            ;  Time to DECrease volume?
FC7F: 26 04       BNE     $FC85                   ;  No ... skip
FC81: 6C A7       INC     $A7,X                   ;  Flag DECrement volume for voice
FC83: A6 B3       LDA     $B3,X                   ;  Restore volume counter
FC85: A7 AD       STA     $AD,X                   ;  Current counter
FC87: 09          DEX                             ;  All voices?
FC88: 26 F0       BNE     $FC7A                   ;  No ... do all
FC8A: 39          RTS                             ;  Done

; IRQ1CommandRequest
;  IRQ1
; 
FC8B: B7 90 00    STA     $9000                   ;  ??watchdog??
FC8E: C6 0E       LDB     #$0E                    ;  Read from ...
FC90: BD FD 20    JSR     $FD20                   ;  ... I/O port A on AY chip 0
FC93: 84 1F       ANDA    #$1F                    ;  Ony lower 5 bits
FC95: 97 BC       STA     $BC                     ;  Store sound command
FC97: 3B          RTI                             

FC98: CE FF FF    LDX     #$FFFF                  ;  Set DDR ...
FC9B: DF 00       STX     $00                     ;  ... ports 1 and 2 (outputs)
FC9D: C6 4F       LDB     #$4F                    ;  4F bytes
FC9F: 08          INX                             ;  0
FCA0: 86 00       LDA     #$00                    ;  clear value
FCA2: A7 80       STA     $80,X                   ;  Write byte to memory
FCA4: 08          INX                             ;  Next in memory
FCA5: 5A          DECB                            ;  All bytes
FCA6: 26 FA       BNE     $FCA2                   ;  Do all bytes
FCA8: 86 13       LDA     #$13                    ;  Initial chip status ...
FCAA: 97 D8       STA     $D8                     ;  ... for return from command
FCAC: 39          RTS                             ;  Done

;  * Disable all sounds
; 
FCAD: BD FC C3    JSR     $FCC3                   ;  All sounds on AY0
FCB0: 86 BF       LDA     #$BF                    ;  10_111_111
FCB2: 97 BB       STA     $BB                     ;  Mixer ... all sounds turned off
FCB4: C6 FF       LDB     #$FF                    ;  FF
; BUG3
; What about seqnecer 3? It is tied to AY1 too.
FCB6: D7 82       STB     $82                     ;  Voice sequence 2 off
FCB8: D7 B1       STB     $B1                     ;  Volume DEC counter AY1-0
FCBA: D7 B2       STB     $B2                     ;  Volume DEC counter AY1-1
FCBC: D7 B3       STB     $B3                     ;  Volume DEC counter AY1-2
FCBE: C6 17       LDB     #$17                    ;  10_111_111
FCC0: 7E FC DE    JMP     $FCDE                   ;  Write value A to AY register B
; 
FCC3: 86 BF       LDA     #$BF                    ;  10_111_111
FCC5: 97 BA       STA     $BA                     ;  Mixer ... all sounds turned off
FCC7: C6 FF       LDB     #$FF                    ;  FF
FCC9: D7 80       STB     $80                     ;  Voice sequence 0 off
FCCB: D7 81       STB     $81                     ;  Voice sequence 1 off
FCCD: D7 AE       STB     $AE                     ;  Volume DEC counter AY0-0
FCCF: D7 AF       STB     $AF                     ;  Volume DEC counter AY0-1
FCD1: D7 B0       STB     $B0                     ;  Volume DEC counter AY0-2
FCD3: C6 07       LDB     #$07                    ;  10_111_111 (all channels off)
FCD5: 7E FC DE    JMP     $FCDE                   ;  Write value A to AY register B and return

;  * Write value A to AY register B (no delay during write)
; 
FCD8: 7C 00 BD    INC     $00BD                   ;  Set NMI counter (bypass waiting)
FCDB: 20 04       BRA     $FCE1                   ;  Continue with write

; * Write value A to AY register B (turn off interrupts)
; 
FCDD: 0F          SEI                             ;  Disable interrupts

; * Write value A to AY register B
; 
FCDE: 7F 00 BD    CLR     $00BD                   ;  Clear NMI counter
FCE1: 37          PSHB                            ;  Save B ... (address)
FCE2: 36          PSHA                            ;  ... and A  (value)
FCE3: C1 10       CMPB    #$10                    ;  2nd chip?
FCE5: 2A 19       BPL     $FD00                   ;  Yes ... go
FCE7: 86 0D       LDA     #$0D                    ;  0000_1011
FCE9: 97 03       STA     $03                     ;  Control lines
FCEB: D7 02       STB     $02                     ;  Address
FCED: C6 08       LDB     #$08                    ;  0000_1000
FCEF: D7 03       STB     $03                     ;  Control lines
FCF1: 5C          INCB                            ;  Bit 0 on
FCF2: 32          PULA                            ;  Value
FCF3: 97 02       STA     $02                     ;  Write value
FCF5: 96 BD       LDA     $BD                     ;  Wait ...
FCF7: 27 FC       BEQ     $FCF5                   ;  ... for NMI counter
FCF9: D7 03       STB     $03                     ;  Store control
FCFB: 5A          DECB                            ;  Clear bit 0
FCFC: D7 03       STB     $03                     ;  Store control
FCFE: 33          PULB                            ;  Restore B
FCFF: 39          RTS                             ;  Done
FD00: 86 15       LDA     #$15                    ;  0001_0101
FD02: 97 03       STA     $03                     ;  Control lines
FD04: C4 0F       ANDB    #$0F                    ;  Address 0-15
FD06: D7 02       STB     $02                     ;  Store address
FD08: C6 10       LDB     #$10                    ;  0001_0000
FD0A: 20 E3       BRA     $FCEF                   ;  Write value
FD0C: 37          PSHB                            ;  Chip already selected
FD0D: 20 E4       BRA     $FCF3                   ;  Wrie value to selected chip
FD0F: 37          PSHB                            ;  Save B
FD10: 86 15       LDA     #$15                    ;  0001_0101
FD12: 97 03       STA     $03                     ;  Chip 2 control lines
FD14: C4 0F       ANDB    #$0F                    ;  Address 0-15
FD16: D7 02       STB     $02                     ;  Store address
FD18: C6 14       LDB     #$14                    ;  0001_0100
FD1A: 20 0D       BRA     $FD29                   ;  Continue read

; * Read AY register B into A
; 
FD1C: C1 10       CMPB    #$10                    ;  Second chip?
FD1E: 2A EF       BPL     $FD0F                   ;  Yes ... go handle
FD20: 37          PSHB                            ;  Save B
FD21: 86 0D       LDA     #$0D                    ;  0000_1011
FD23: 97 03       STA     $03                     ;  Chip 1 control lines
FD25: D7 02       STB     $02                     ;  Store address
FD27: C6 0C       LDB     #$0C                    ;  0000_1010
FD29: 4F          CLRA                            ;  0
FD2A: 97 03       STA     $03                     ;  Control lines
FD2C: 97 00       STA     $00                     ;  Port 2 now INPUTS
FD2E: D7 03       STB     $03                     ;  Control lines
FD30: 96 02       LDA     $02                     ;  Read from register
FD32: 5F          CLRB                            ;  0
FD33: D7 03       STB     $03                     ;  Control lines
FD35: 5A          DECB                            ;  FF
FD36: D7 00       STB     $00                     ;  Port 2 now OUTPUTS
FD38: 33          PULB                            ;  Restore B
FD39: 39          RTS                             ;  Done

; * Decrement AY chip 0 volume register B
; 
FD3A: 0F          SEI                             ;  Disable interrupts
FD3B: BD FD 20    JSR     $FD20                   ;  Read from port
FD3E: C6 09       LDB     #$09                    ;  0000_1001 control
FD40: 7F 00 BD    CLR     $00BD                   ;  Clear NMI counter
FD43: 84 1F       ANDA    #$1F                    ;  Only 5 bits used in volume register
FD45: 81 10       CMPA    #$10                    ;  M bit set? Auto-volume?
FD47: 2A 08       BPL     $FD51                   ;  Yes ... ignore this request
FD49: 4A          DECA                            ;  Decrement the volume
FD4A: 81 07       CMPA    #$07                    ;  Less than 7?
FD4C: 2B 03       BMI     $FD51                   ;  Yes ... low as we get. Ignore
FD4E: BD FD 0C    JSR     $FD0C                   ;  Write the new volume value
FD51: 0E          CLI                             ;  Enable interrupts
FD52: 39          RTS                             ;  Done

; * Decrement AY chip 1 volue register B
; 
FD53: 0F          SEI                             ;  Disable interrupts
FD54: BD FD 0F    JSR     $FD0F                   ;  Read Reg(B)->A
FD57: C6 11       LDB     #$11                    ;  0001_0001 control
FD59: 20 E5       BRA     $FD40                   ;  Continue with write volume value


;  Script command C0 - EF ( 5 or 6 bytes)
FD5B: 17          TBA                             ;  Check lower ...
FD5C: 84 0F       ANDA    #$0F                    ;  ... nibble
FD5E: 81 08       CMPA    #$08                    ;  Greater or equal to 8?
FD60: 2A 08       BPL     $FD6A                   ;  Yes ... go sweep register-pair

; C_SWEEP_VOICE_REGISTER
;  Add delta (I98) to current value (I94) and set-register
;  C0 - EF   110_r_0rrr CNT I94 I98 RVAL   
FD62: A6 94       LDA     $94,X                   ;  Get current tone value
FD64: AB 98       ADDA    $98,X                   ;  Add delta
FD66: A7 94       STA     $94,X                   ;  Store current
FD68: 20 67       BRA     $FDD1                   ;  Write current to register B (0-6) and return 4,x

; C_SWEEP_VOICE_PAIR
; (Bug in code ... this function is never used)
;  Add delta (DELTA) to fine/coarse pair r0rrr and r0rrr+1. 
;  C0 - EF   110_r_1rrr CNT I94 I98 RVAL DELTA
FD6A: CB 38       ADDB    #$38                    ;  Confusing way of getting rid of bit 3 in register value
FD6C: DE CD       LDX     $CD                     ;  Script pointer
FD6E: A6 05       LDA     $05,X                   ;  Delta value from script
FD70: 36          PSHA                            ;  Hold delta (sign-check shortly)
FD71: DE D1       LDX     $D1                     ;  Voice number
FD73: AB 94       ADDA    $94,X                   ;  Adjust ...
FD75: A7 94       STA     $94,X                   ;  ... fine tone value
FD77: 32          PULA                            ;  Original delta
FD78: 2B 0C       BMI     $FD86                   ;  Handle decrementing
FD7A: 24 02       BCC     $FD7E                   ;  No carry
FD7C: 6C 98       INC     $98,X                   ;  Increment coarse tone

; BUG1
; BUG IN CODE
; We did the math above on $94 and $98 as if they were FINE/COARSE. But we write the
; values as if they are COARSE/FINE. Actually, the FINE value in $94 is never written
; to the fine register ... the DELTA value is always the FINE value.
; Good thing this command was never used!
;
FD7E: BD FC DD    JSR     $FCDD                   ;  Write fine value to register B
FD81: 5C          INCB                            ;  To coarse register
FD82: A6 94       LDA     $94,X                   ;  Coarse value (SHOULD BE $98)
FD84: 20 4B       BRA     $FDD1                   ;  Write coarse value to register B and return 4,x

FD86: 25 F6       BCS     $FD7E                   ;  Yes carry (we should get a carry until underflow)
FD88: 6A 98       DEC     $98,X                   ;  Decrement coarse value
FD8A: 20 F2       BRA     $FD7E                   ;  Do it

;  Skip over data of current series command and switch to command 0
FD8C: 6F 8C       CLR     $8C,X                   ;  Script command 0
FD8E: DE CD       LDX     $CD                     ;  Get the current sequence pointer
FD90: C1 A0       CMPB    #$A0                    ;
FD92: 2B 02       BMI     $FD96                   ;
FD94: 08          INX                             ;  IF B>=A0 ... X=X+2
FD95: 08          INX                             ;
FD96: 08          INX                             ;  X=X+3
FD97: 08          INX                             ;
FD98: 08          INX                             ;
FD99: C1 C0       CMPB    #$C0                    ;
FD9B: 2B 08       BMI     $FDA5                   ;  IF B>=C0 && (A&0F>=8) ... X=X+1
FD9D: 17          TBA                             ;
FD9E: 84 0F       ANDA    #$0F                    ;
FDA0: 81 08       CMPA    #$08                    ;
FDA2: 2B 01       BMI     $FDA5                   ;
FDA4: 08          INX                             ;
FDA5: 86 01       LDA     #$01                    ;  Process again on next sequencer tick
FDA7: 39          RTS                             ;  Done

;  Counted series commands
FDA8: DF CD       STX     $CD                     ;  Hold the pointer
FDAA: DE D1       LDX     $D1                     ;  Get the voice number
FDAC: 6A 90       DEC     $90,X                   ;  All done with this type of command?
FDAE: 27 DC       BEQ     $FD8C                   ;  Yes ... move to next
FDB0: C1 A0       CMPB    #$A0                    ;  Go if ...
FDB2: 2A 10       BPL     $FDC4                   ;  ... A0 or above

; C_REGISTER_SAMPLES
;  Set the value of rrrrr to sI at regular intervals. CNT is the number of samples.
;  Always return RVAL.
;  80 - 9F   100_r_rrrr CNT RVAL s0 s1 s2 ... sN
FDB4: C4 1F       ANDB    #$1F                    ;  Mask off register number
FDB6: A6 94       LDA     $94,X                   ;  Get return value (time till next process)
FDB8: 36          PSHA                            ;  Hold return
FDB9: DE CD       LDX     $CD                     ;  Get back the pointer
FDBB: A6 03       LDA     $03,X                   ;  Get value to write
FDBD: BD FC DD    JSR     $FCDD                   ;  Write value A to AY register B (turn off interrupts)
FDC0: 0E          CLI                             ;  Interrupts back on
FDC1: 32          PULA                            ;  Restore A
FDC2: 08          INX                             ;  Next in sample list
FDC3: 39          RTS                             ;  Out

FDC4: C1 C0       CMPB    #$C0                    ;  Go if ...
FDC6: 2A 93       BPL     $FD5B                   ;  ... C0 or above

; C_TOGGLE_REGISTER
; (Never used)
;  Alternate writing I94 and I98.
;  Always return RVAL;
;  A0 - BF   101_r_rrrr CNT I94 I98 RVAL
FDC8: A6 90       LDA     $90,X                   ;  Current count of commands
FDCA: 44          LSRA                            ;  Lowest bit
FDCB: A6 94       LDA     $94,X                   ;  Value
FDCD: 25 02       BCS     $FDD1                   ;  Odd ... use value from 94
FDCF: A6 98       LDA     $98,X                   ;  Even ... use value from 98
FDD1: C4 1F       ANDB    #$1F                    ;  Mask off register number
FDD3: BD FC DD    JSR     $FCDD                   ;  Write value A to AY register B (turn off interrupts)
FDD6: 0E          CLI                             ;  Enable interrupts
FDD7: DE CD       LDX     $CD                     ;  Restore X
FDD9: A6 04       LDA     $04,X                   ;  Return value (count to next process)
FDDB: 39          RTS                             ;  Out
; 
;  * Process voice sequence. X=script pointer. B is ??process type??
;    Return X=new script pointer, A=count till next process
; 
FDDC: 26 CA       BNE     $FDA8                   ;  Not script command zero

FDDE: DF CD       STX     $CD                     ;  Store new sequence pointer
FDE0: E6 00       LDB     $00,X                   ;  Register number
FDE2: 2A 03       BPL     $FDE7                   ;  Go handle ...
FDE4: 7E FE 93    JMP     $FE93                   ;  ... COMPLEX, STOP, CALL, RETURN

; SimpleCommands
;  For all following commands, bit 6 is the multi-bit. If set, the parser is run again and again
;  until the bit is clear. Then the return value RV is loaded from the end of the sequence.
;
; REGISTER
;   0m0r_rrrr VV     *RV    Store single register value REGISTER(r)=VV
;
; THREEVOICE
;   0m1c_0000 FF CC  *RV    ThreeVoices FF=fine, CC=coarse
;
; MIXER
;   0m1c_011o VV     *RV    Mixer AND (o=0) or OR (o=1) AYc with VV
;
; SET_VOLUME_AND_RESET_DECAY
;   0m1c_10vv NN     *RV    Set volume reload value and volume register to NN
;
; VOLUME_DECAY_SPEED
;   0m1c_11vv NN     *RV    Set volume counter to reload value NN
FDE7: C4 3F       ANDB    #$3F                    ;  Mask off the "multi" bit
FDE9: C1 20       CMPB    #$20                    ;  Is it a single register command?
FDEB: 2A 11       BPL     $FDFE                   ;  No ... go handle 3-voice command

FDED: A6 01       LDA     $01,X                   ;  Get value
FDEF: BD FC DD    JSR     $FCDD                   ;  Write value A to AY register B (turn off interrupts)
FDF2: 0E          CLI                             ;  Interrupts on
FDF3: E6 00       LDB     $00,X                   ;  Restore register value
FDF5: 08          INX                             ;  Skip ...
FDF6: 08          INX                             ;  ... two byte command
FDF7: 58          ASLB                            ;  Repeat bit set?
FDF8: 2B E4       BMI     $FDDE                   ;  Yes ... do another
FDFA: A6 00       LDA     $00,X                   ;  Get return value
FDFC: 08          INX                             ;  Point to next command
FDFD: 39          RTS                             ;  Out

FDFE: C4 1F       ANDB    #$1F                    ;  Register value (0,16 or mixer)
FE00: 17          TBA                             ;  To A
FE01: 84 0F       ANDA    #$0F                    ;  Is it a valid chip register 0 (0 or 16)
FE03: 26 31       BNE     $FE36                   ;  No ... MIXER or VOLUME
;  3-tone note
FE05: A6 01       LDA     $01,X                   ;  Get the fine tone
FE07: 97 CE       STA     $CE                     ;  Store it
FE09: A6 02       LDA     $02,X                   ;  Get the coarse tone
FE0B: 97 CD       STA     $CD                     ;  Store it
FE0D: BD FE D4    JSR     $FED4                   ;  Write channel A tone
FE10: DC CD       LDD     $CD                     ;  CE,CD ...
FE12: 04          LSRD                            ;  ... divided by ...
FE13: DD CD       STD     $CD                     ;  ... 2
FE15: E6 00       LDB     $00,X                   ;  Original ...
FE17: C4 1F       ANDB    #$1F                    ;  ... register
FE19: 5C          INCB                            ;  Next ...
FE1A: 5C          INCB                            ;  ... pair
FE1B: BD FE D4    JSR     $FED4                   ;  Write channel B tone
FE1E: 7C 00 CE    INC     $00CE                   ;  Increment ...
FE21: 26 03       BNE     $FE26                   ;  ... word in ...
FE23: 7C 00 CD    INC     $00CD                   ;  ... CE, CD
FE26: BD FE D4    JSR     $FED4                   ;  Write channel C tone
FE29: CB 07       ADDB    #$07                    ;  Envelope shape register
FE2B: 86 09       LDA     #$09                    ;  Envelope shape cycle (CONT+HOLD)
FE2D: BD FC DE    JSR     $FCDE                   ;  Write envelope shape
FE30: 0E          CLI                             ;  Interrupts on
FE31: E6 00       LDB     $00,X                   ;  Restore command (for repeats)
FE33: 08          INX                             ;  Skip extra byte
FE34: 20 BF       BRA     $FDF5                   ;  Skip 2 bytes and done

FE36: 80 08       SUBA    #$08                    ;  <8
FE38: 2B 29       BMI     $FE63                   ;  Yes ... go to mixer command
;  Volume control
FE3A: DD CF       STD     $CF                     ;  Hold n&1F and (n&0F-8)
FE3C: 84 03       ANDA    #$03                    ;  Complex encoding ...
FE3E: C1 30       CMPB    #$30                    ;  ... for ...
FE40: 2B 02       BMI     $FE44                   ;  ... sequencer ...
FE42: 8B 03       ADDA    #$03                    ;  ... number
FE44: 16          TAB                             ;  Sequencer number to B
FE45: A6 01       LDA     $01,X                   ;  Get value
FE47: CE 00 00    LDX     #$0000                  ;  Sequence number ...
FE4A: 3A          ABX                             ;  ... to X
FE4B: D6 CF       LDB     $CF                     ;  Original A (remember already-8)
FE4D: C1 04       CMPB    #$04                    ;  Set counter?
FE4F: 2A 0B       BPL     $FE5C                   ;  Yes ... go set counter
;  Reset volume dec counter and actual volume volume
FE51: A6 B4       LDA     $B4,X                   ;  Get counter reload for volume on voice
FE53: A7 AE       STA     $AE,X                   ;  Reset volume DEC counter
FE55: DE CD       LDX     $CD                     ;  Restore script pointer
FE57: D6 D0       LDB     $D0                     ;  Original B (register)
FE59: 7E FD ED    JMP     $FDED                   ;  Write from script to register and continue script
;  Set countreload for volume
FE5C: A7 B4       STA     $B4,X                   ;  Counter reload for volume DEC on voice
FE5E: DE CD       LDX     $CD                     ;  Restore script pointer
FE60: 7E FD F3    JMP     $FDF3                   ;  Continue script

;  Mixer control (AND or OR)
FE63: 4C          INCA                            ;  FF = OR bits in mixer value
FE64: 27 17       BEQ     $FE7D                   ;  Go OR
FE66: 5C          INCB                            ;  6 becomes 7 ... mixer register
FE67: C1 10       CMPB    #$10                    ;  AY1 chip?
FE69: 2A 09       BPL     $FE74                   ;  Yes ... go
FE6B: 96 BA       LDA     $BA                     ;  Mixer value for AY0
FE6D: A4 01       ANDA    $01,X                   ;  Turn bits off
FE6F: 97 BA       STA     $BA                     ;  New value
FE71: 7E FD EF    JMP     $FDEF                   ;  Write mixer and continue script
; 
FE74: 96 BB       LDA     $BB                     ;  Mixer value for AY1
FE76: A4 01       ANDA    $01,X                   ;  Turn bits off
FE78: 97 BB       STA     $BB                     ;  New value
FE7A: 7E FD EF    JMP     $FDEF                   ;  Write mixer and continue script
; 
FE7D: C1 10       CMPB    #$10                    ;  AY1 chip?
FE7F: 2A 09       BPL     $FE8A                   ;  Yes ... go
FE81: 96 BA       LDA     $BA                     ;  Mixer value for AY0
FE83: AA 01       ORA     $01,X                   ;  Turn bits on
FE85: 97 BA       STA     $BA                     ;  New value
FE87: 7E FD EF    JMP     $FDEF                   ;  Write mixer and continue script
; 
FE8A: 96 BB       LDA     $BB                     ;  Mixer value for AY1
FE8C: AA 01       ORA     $01,X                   ;  Turn bits on
FE8E: 97 BB       STA     $BB                     ;  New value
FE90: 7E FD EF    JMP     $FDEF                   ;  Write mixer and continue script

FE93: C1 F0       CMPB    #$F0                    ;  STOP or CALL or RETURN ?
FE95: 2A 17       BPL     $FEAE                   ;  Yes ... go handle

;  Start new series of commands
;  1ccccccc AA BB CC  c->commandType    (AA+1)->seriesCount    94,X<-BB     98,X<-CC
FE97: A6 01       LDA     $01,X                   ;  Get ...
FE99: EE 02       LDX     $02,X                   ;  ... params for series
FE9B: 3C          PSHX                            ;  Hold
FE9C: DE D1       LDX     $D1                     ;  Current sequencer
FE9E: E7 8C       STB     $8C,X                   ;  Store series type
FEA0: 4C          INCA                            ;  Series count (always +1)
FEA1: A7 90       STA     $90,X                   ;
FEA3: 32          PULA                            ;  Store ...
FEA4: A7 94       STA     $94,X                   ;  ... series ...
FEA6: 32          PULA                            ;  ... parameters
FEA7: A7 98       STA     $98,X                   ;
FEA9: DE CD       LDX     $CD                     ;  Restore script pointer
FEAB: 86 01       LDA     #$01                    ;  Process again next tick
FEAD: 39          RTS                             ;  Done

FEAE: 5C          INCB                            ;  FF=STOP?
FEAF: 27 12       BEQ     $FEC3                   ;  Yes ... return FF.
FEB1: DE D1       LDX     $D1                     ;  Voice number
FEB3: 5C          INCB                            ;  FE=CALL?
FEB4: 26 10       BNE     $FEC6                   ;  No ... process return

; CALL
;  FE MM LL  - CALL MMLL 
FEB6: DC CD       LDD     $CD                     ;  Sequence pointer
FEB8: A7 9C       STA     $9C,X                   ;  Store ...
FEBA: E7 A0       STB     $A0,X                   ;  ... return LSB and MSB
FEBC: DE CD       LDX     $CD                     ;  Sequence pointer
FEBE: EE 01       LDX     $01,X                   ;  Get jump address
FEC0: 86 01       LDA     #$01                    ;  Return 1 (processes again next step)
FEC2: 39          RTS                             ;  Done

; STOP
;  FF        - STOP  
FEC3: 86 FF       LDA     #$FF                    ;  END OF SEQUENCE
FEC5: 39          RTS                             ;  Done

; RETURN
;  F0-FD     - RETURN
FEC6: A6 9C       LDA     $9C,X                   ;  Restore ..
FEC8: E6 A0       LDB     $A0,X                   ;  ... sequence ...
FECA: DD CD       STD     $CD                     ;  ... pointer
FECC: DE CD       LDX     $CD                     ;  Sequence pointer
FECE: 08          INX                             ;  Skip over ...
FECF: 08          INX                             ;  ... CALL ...
FED0: 08          INX                             ;  ... command
FED1: 86 01       LDA     #$01                    ;  Return 1 (processes again next step)
FED3: 39          RTS                             ;  Done

;  Write CE to consecutive registers pointed to by B
;  Leave with B pointing to next register.
; 
FED4: 96 CE       LDA     $CE                     ;  Fine value
FED6: BD FC DD    JSR     $FCDD                   ;  Write value A to AY register B (turn off interrupts)
FED9: 5C          INCB                            ;  Coarse register
FEDA: 96 CD       LDA     $CD                     ;  Coarse value
FEDC: BD FC DE    JSR     $FCDE                   ;  Write value A to AY register B
FEDF: 5C          INCB                            ;  Next register
FEE0: 39          RTS                             ;  Done


; ALL sound command start here
; 
FEE1: 26 06       BNE     $FEE9                   ;  Zero means ...

; ProcessCommand0
; Sound command $00
; Reinitialize RAM and disable all sounds
FEE3: BD FC 98    JSR     $FC98                   ;  ... reinit RAM and hardware
FEE6: 7E FC AD    JMP     $FCAD                   ;  Disable all scripts/sounds and return

FEE9: 81 10       CMPA    #$10                    ;  Vector to ...
FEEB: 2B 03       BMI     $FEF0                   ;  ... 01-0F or ...
FEED: 7E FF 25    JMP     $FF25                   ;  ... 10-1F

; ProcessCommands01-0F
; Sound commands $01 - $0F (samplers played out 801)
FEF0: 97 CB       STA     $CB                     ;  Hold command
FEF2: 96 D8       LDA     $D8                     ;  Get chip status
FEF4: 8A 01       ORA     #$01                    ;  Set bit 0 in A
FEF6: 16          TAB                             ;  To B
FEF7: C4 FE       ANDB    #$FE                    ;  Clear bit 0 in B
FEF9: D7 D8       STB     $D8                     ;  Store value back with bit 0 clear
FEFB: C6 0F       LDB     #$0F                    ;  AY I/O register chip 0 B
FEFD: BD FC DE    JSR     $FCDE                   ;  Write value D8 with bit 0 set to output port
FF00: 86 05       LDA     #$05                    ;  Wait for 5 NMI counts
FF02: 7F 00 BD    CLR     $00BD                   ;  Clear NMI counter
FF05: D6 BD       LDB     $BD                     ;  Wait on ...
FF07: 27 FC       BEQ     $FF05                   ;  ... NMI counter ...
FF09: 4A          DECA                            ;  Wait for ...
FF0A: 26 F6       BNE     $FF02                   ;  ... specified time
FF0C: D6 CB       LDB     $CB                     ;  Command ...
FF0E: 58          ASLB                            ;  ... times ...
FF0F: 58          ASLB                            ;  .... 4
FF10: CE F4 00    LDX     #$F400                  ;  Sample table
FF13: 3A          ABX                             ;  Offset in table
FF14: 3C          PSHX                            ;  Remember the offset
FF15: EE 00       LDX     $00,X                   ;  Wouldn't it be great to have a Y register?
FF17: DF C7       STX     $C7                     ;  Sample pointer
FF19: 38          PULX                            ;  Descriptor
FF1A: EE 02       LDX     $02,X                   ;  Get ...
FF1C: DF C3       STX     $C3                     ;  ... number of samples
FF1E: 96 BE       LDA     $BE                     ;  Enable sample ...
FF20: 84 02       ANDA    #$02                    ;  ... player ...
FF22: 97 BE       STA     $BE                     ;  ... on 801
FF24: 39          RTS                             ;  Done

FF25: 16          TAB                             ;  Script number
FF26: 58          ASLB                            ;  *2
FF27: CE F4 24    LDX     #$F424                  ;  Script pointer table ($10 -> $F444)
FF2A: 3A          ABX                             ;  Offset to start of script
FF2B: EE 00       LDX     $00,X                   ;  Script start
FF2D: 81 14       CMPA    #$14                    ;  $10 - $14
FF2F: 2A 1C       BPL     $FF4D                   ;  $14 or above ... go

; ProcessCommands10-13
; Commands $10, $11, $12, $13
; Start script in mode 0 on sequencer 2 if available
FF31: D6 82       LDB     $82                     ;  Is sequencer 2 ...
FF33: 5C          INCB                            ;  ... available?
FF34: 27 06       BEQ     $FF3C                   ;  Yes ... use sequencer 2
FF36: 91 A6       CMPA    $A6                     ;  Already running on sequencer 2?
FF38: 27 02       BEQ     $FF3C                   ;  Yes ... restart sequencer 2
FF3A: 2A 10       BPL     $FF4C                   ;  Higher priority command running (lower number)? Ignore.
FF3C: 97 A6       STA     $A6                     ;  Sound command for sequence 2
FF3E: DF 88       STX     $88                     ;  Script pointer for sequence 2
FF40: 7F 00 82    CLR     $0082                   ;  Process seqence 2 next tick
FF43: 7F 00 8E    CLR     $008E                   ;  Mode 0 for sequencer 2
FF46: C6 89       LDB     #$89                    ;  10_001_001
FF48: DA BB       ORB     $BB                     ;  Sequencer tied to voice A ...
FF4A: D7 BB       STB     $BB                     ;  ... turn it off (for now)
FF4C: 39          RTS                             

FF4D: 26 11       BNE     $FF60                   ;  Go if not exactly $14

; ProcessCommand14
; Command $14
; Force script in mode 0 on seqencer 3 no matter what
FF4F: DF 8A       STX     $8A                     ;  Script pointer for sequence 3
FF51: 97 A7       STA     $A7                     ;  Sound command for sequencer 3
FF53: 7F 00 83    CLR     $0083                   ;  Process sequence 3 next tick
FF56: 7F 00 8F    CLR     $008F                   ;  Mode 0 for sequencer 3
FF59: 86 B6       LDA     #$B6                    ;  10_110_110
FF5B: 9A BB       ORA     $BB                     ;  Sequencer 3 tied to voice BC ...
FF5D: 97 BB       STA     $BB                     ;  ... turn them off (for now)
FF5F: 39          RTS                             

FF60: 81 18       CMPA    #$18                    ;  $18 or above?
FF62: 2A 0B       BPL     $FF6F                   ;  Yes ...

; ProcessCommands15-17
; Command $15, $16, $17
; For script in mode 0 on sequencer 1 no matter what
FF64: DF 86       STX     $86                     ;  Script pointer for sequencer 1
FF66: 97 A5       STA     $A5                     ;  Sound command for sequencer 1
FF68: 7F 00 81    CLR     $0081                   ;  Process sequence 1 next tick
FF6B: 7F 00 8D    CLR     $008D                   ;  Mode 0 for sequencer 1
FF6E: 39          RTS                             ;  Done

; ProcessCommands18-1F
; Command $18, 19, 1A, 1B, 1C, 1D, 1E, 1F
; Turn off all sounds and start command/script A/X on sequencer 0
FF6F: 3C          PSHX                            ;  Hold script pointer
FF70: 36          PSHA                            ;  Hold sound command
FF71: BD FC 98    JSR     $FC98                   ;  Initialize RAM and hardware
FF74: BD FC AD    JSR     $FCAD                   ;  Stop all sounds
FF77: 32          PULA                            ;  Restore sound command
FF78: 38          PULX                            ;  Restore script pointer
FF79: DF 84       STX     $84                     ;  Script pointer for sequencer 0
FF7B: 97 A4       STA     $A4                     ;  Sound command for sequencer 0
FF7D: 7F 00 80    CLR     $0080                   ;  Process sequence 0 next tick
FF80: 7F 00 8C    CLR     $008C                   ;  Force 0 sequencer 0
FF83: 86 BE       LDA     #$BE                    ;  10_111_110
; BUG2
; The initialization at FCAD sets BA to 10_111_111. The OR here with a 0 is pointless.
FF85: 9A BA       ORA     $BA                     ;  Flag off all but ...
FF87: 97 BA       STA     $BA                     ;  ... AY0 tone A (THIS DOESN'T REALLY DO ANYTHING)
FF89: 39          RTS                             ;  Done

FF8A: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
FFAA: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
FFCA: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
FFEA: 00 00 00 00 00 00

; Vectors
; Vectors
FFF0: FB 00                            ;  IRQ2 Serial I/O vector
FFF2: FB 00                            ;  IRQ2 timer overflow vector
FFF4: FB 00                            ;  IRQ2 timer output capture vector
FFF6: FB 00                            ;  IRQ2 timer input capture vector
FFF8: FC 8B                            ;  IRQ1 interrupt strobe 3 vector
FFFA: FB 00                            ;  SWI vector
FFFC: FB D9                            ;  Non-maskable (NMI) vector
FFFE: FB 00                            ;  RESET vector