; 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