November 23, 2024, 02:14:21 PM

News:

Be sure to checkout our Vixen interfaces in the Library forum -- if you want PC automation at near zero cost, EFX-TEK and Vixen is a great combination of tools.


Converting Haunted House Program from Prop-1 to a Prop-2

Started by Spooky Dad, September 13, 2011, 09:05:42 PM

Previous topic - Next topic

Spooky Dad

    I've attached the Prop - 1 program that presently executes with a Prop-1 Controller, a DC-16, an AP-8 and a RC-4.  The design goals I am looking to accomplish with the upgrade are listed below.  I have attached my start of the program, which I admit needs a lot of work.  One of the pieces to work on is the proper naming of variables.  The variables supporting the MIB are not properly declared due to lack of memory in the Prop-1.


    • Replace the Prop-1 with the Prop-2 as the main controller
    • Replace the AP-8 with the AP-16 as the audio controller
    • Have two different program modes - Spooky (Input 14 shows closed loop) and Non-Spooky (Input 14 shows open loop)
    • Have each prop activate in a specific order, but allow for the next in line to interrupt the previous prop, if the victims are moving quickly through the haunt
    • Create a random timer for each prop so that the prop activates from 0.5 to 2 seconds after being tripped
    • While the program is waiting for an input, randomly play the sound on the AP-16 titled "scream".
    --------------------------------------------------------------------------------

    Input 0 for telling HC-8+ whether the tour should be Spooky or Non-Spooky
    Input 1 for Prop 1 - MIB (resuse random code)
    Input 2 for Prop 2 - Cook Pot Trauma (CPT)
    Input 3 for Prop 3 - Door Prop from Hi-Rez Design
    Input 4 for Prop 4 - Ghost
    Input 5 for Prop 5 - Owl
    Input 6 for Prop 6 - Air Cannon
    Input 7 for Prop 7 - Snakes (Ankle Tickler)
    Input 8 for Prop 8 - Chandelier

JonnyMac

September 14, 2011, 07:39:13 AM #1 Last Edit: September 16, 2011, 06:20:43 AM by JonnyMac
We'll start with the way symbols are handled in PBASIC2.  IO pins, constants, and variables get different definitions.  Here's how we define IO pins.  Note that you had Spooky listed twice, so please correct this list per your actual prop.

Sio             PIN     15                      ' SETUP = UP, no ULN
Spooky          PIN     14                      ' SETUP = DN
NC13            PIN     13
NC12            PIN     12
NC11            PIN     11
NC10            PIN     10
NC09            PIN      9
NC08            PIN      8

NC07            PIN      7
NC06            PIN      6
NC05            PIN      5
Ghost           PIN      4
Graveyard       PIN      3
CPT             PIN      2
Snakes          PIN      1
MIB             PIN      0


Notice, too, that I separated the pins into groups of eight, just as on the controller.  Every program has two clients: the device being programmed and other programmers.  Make sure that the second client can understand things, too.  Being obvious is a good idea.
Jon McPhalen
EFX-TEK Hollywood Office

Spooky Dad

Inputs are fixed (including duplications), including putting them into the proper order.  Since I am going to be lurking around the haunted house, I have changed my mind in that the props must only activate in the prescribed order (I updated the program description accordingly).  I also took a stab at implementing the Spooky or Non-Spooky mode, which includes the creation of 32 additional EEPROM memory pointers for non-spooky (the values in the EEPROM memory has not been updated yet as I have to make sure the output is pulling from the right board, either Prop-2 or DC-16, based on the required voltage needed).  See attached file. 

Spooky Dad

OK.  I got another update (see revision history in attached program).  Things I will keep working on are:  1) Updating output values in EEPROM memory to trip the right output (based on voltage required), relay and audio track (need to investigate how to store DOS file names into a variable and store in EEPROM memory)  2) The other nuances for the CPT, AirCannon and Door like I have set up for the MIB and 3) Adding in a whole lot of DEBUG statements so I can tell what the heck is going on.  3) Checking the sampling rate and storing my *.wav files on the AP-16 (assuming once AMBIENT.wav is on there, it will always be playing until it receives another command.

What I would like assistance with is the verification of:  1) The approach to choose between Spooky and Non-Spooky 2) A lesson in the proper set up and use of memory variables  3) Eventually help in figuring out how to allow a prop to be tripped multiple times while in non-spooky mode.

JonnyMac

September 16, 2011, 06:58:20 AM #4 Last Edit: September 16, 2011, 07:16:06 AM by JonnyMac
Part of the problem with the way you're trying to do the conversion is like trying to mix two colors of paint on a wall trying to get to a unified color.  You might get there, but it's going to be a lot of work, and messy getting there.

Two things:

1) I'm having a hard time following your notes embedded into the source code.  Please copy these to a word processor and reformat them in something that's easier to read -- you can attache PDFs or ZIPs.  One of the toughest things for a client to do is communicate requirements to an engineer.  It's like making sausage at time; not pretty in the process, but the results are tasty when all done! ;)

2) We should start with a BS2 framework and add things one piece at a time so that the conversion makes sense.  This process will, at times, feel slow but it allows you to test section-by-section. If you load your program and try the memory map you get all kinds of errors; the code below compiles without problems.  Now you have a starting point.  Add a bit of code and compile.  The lesson is not to write big programs in one fell swoop; like eating an elephant, you have to take them one bite at a time.

Here's a starter program with some of the core elements that your show needs.

' =========================================================================
'
'   File...... Spooky_Dad_Halloween_2011.BS2
'   Purpose...
'   Author....
'   E-mail....
'   Started...
'   Updated...
'
'   {$STAMP BS2}
'   {$PBASIC 2.5}
'
' =========================================================================


' -----[ Program Description ]---------------------------------------------


' -----[ Revision History ]------------------------------------------------


' -----[ I/O Definitions ]-------------------------------------------------

Sio             PIN     15
Spooky          PIN     14
NC13            PIN     13
NC12            PIN     12
NC11            PIN     11
NC10            PIN     10
NC09            PIN      9
NC08            PIN      8

Snakes          PIN      7
AirCannon       PIN      6
Graveyard       PIN      5
CPT             PIN      4
MIB             PIN      3
Chandelier      PIN      2
Door            PIN      1
Ghost           PIN      0


' -----[ Constants ]-------------------------------------------------------

IsOn            CON     1
IsOff           CON     0

MIBRun          CON     2500
MinJump         CON      500
MaxJump         CON      750
MinPropDelay    CON      250
MaxPropDelay    CON     1500


T2400           CON     396
T38K4           CON     6
Inverted        CON     $4000
Open            CON     $8000

Baud            CON     Open | T38K4


' -----[ Variables ]-------------------------------------------------------

outBits         VAR     Word
outBitsH       VAR      outBits.HIGHBYTE
outBitsL       VAR      outBits.LOWBYTE

pntr            VAR     Word
lottery         VAR     Word
timer           VAR     Word
delay           VAR     Word

relays          VAR     Byte
K4             VAR      relays.BIT3
K3             VAR      relays.BIT2
K2             VAR      relays.BIT1
K1             VAR      relays.BIT0

triggers        VAR     Byte
db              VAR     Byte
sfx             VAR     Byte
rpts            VAR     Byte


' -----[ Initialization ]--------------------------------------------------

Power_Up:
  PAUSE 30000
  lottery = 1031                                ' seed random#

Reset:
  OUTH = %00000000 : OUTL = %00000000           ' clear all
  DIRH = %00000000 : DIRL = %00000000           ' set outputs


' -----[ Program Code ]----------------------------------------------------

Main:
  triggers = %11111111                          ' enable all
  FOR db = 1 TO 20
    PAUSE 5                                     ' debounce delay
    triggers = triggers & INL                   ' scan inputs
    RANDOM lottery                              ' stir random #
  NEXT


  ' program code here

  GOTO Reset

' -----[ Subroutines ]-----------------------------------------------------

Set_DC16:
  SEROUT Sio, Baud, ["!DC16", %00, "S", outBitsL, outBitsH]
  RETURN

' -------------------------------------------------------------------------

Set_RC4:
  SEROUT Sio, Baud, ["!RC4", %00, "S", relays]
  RETURN

' -------------------------------------------------------------------------

' Play SFXnn.WAV, rpts times

Play_AP16:
  SEROUT Sio, Baud, ["!AP16", %00, "PS", sfx, rpts]
  RETURN

' -------------------------------------------------------------------------

Stop_AP16:
  SEROUT Sio, Baud, ["!AP16", %00, "X"]
  RETURN

' -------------------------------------------------------------------------

Read_Record:
  READ pntr, outBitsH, outBitsL, relays, sfx, rpts
  RETURN

' -----[ User Data ]-------------------------------------------------------

                '       DC16-H     DC16-L     RC4  sfx, rpts

SpookyShow      DATA    %00000000, %00000000, %0000, 0, 1
                DATA    %00000001, %00000000, %0001, 1, 1
                DATA    %00001000, %00000000, %0100, 2, 1
                DATA    %00000100, %00000000, %0010, 3, 1
                DATA    %00001000, %00000000, %0100, 4, 1
                DATA    %00100000, %00000000, %0000, 5, 1
                DATA    %00100000, %00000000, %0000, 6, 1
                DATA    %00010000, %00000000, %1000, 7, 1

NonSpooky       DATA    %00000000, %00000000, %0000, 0, 1
                DATA    %00000001, %00000000, %0001, 1, 1
                DATA    %00001000, %00000000, %0100, 2, 1
                DATA    %00000100, %00000000, %0010, 3, 1
                DATA    %00001000, %00000000, %0100, 4, 1
                DATA    %00100000, %00000000, %0000, 5, 1
                DATA    %00100000, %00000000, %0000, 6, 1
                DATA    %00010000, %00000000, %1000, 7, 1


Jon McPhalen
EFX-TEK Hollywood Office

Spooky Dad

Here is the file I posted in PDF.  I will get take a fresh start with the template tonight after work.  Thanks JonnyMac!

JonnyMac

Sorry, I wasn't clear.

Using a fixed-pitch font is great for writing and reading sparse program listings, but HORRIBLE for lots of detailed information.  What I'm asking you to do is create a new document that is easy on the eyes -- the notes in the listing are not and the PDF is exactly what one sees in the editor.

I'm forcing you to do this for two reasons: 1) so that I and others can read it without our eyeballs bleeding and, 2) it gives you another opportunity to refine what you mean in your spec.
Jon McPhalen
EFX-TEK Hollywood Office

Spooky Dad

September 16, 2011, 03:20:14 PM #7 Last Edit: September 19, 2011, 10:53:21 AM by Spooky Dad
Here is a file with just the detailed description of how I would like the final program to operate.  Is this what you are looking for?

JonnyMac

Oi... I was hoping for a document as neatly formatted as the code you will get from me.  At least the font is easier on my eyes.   ;D
Jon McPhalen
EFX-TEK Hollywood Office

Spooky Dad

September 17, 2011, 12:43:29 PM #9 Last Edit: September 19, 2011, 10:55:23 AM by Spooky Dad
Updated Show Control Description

Spooky Dad

September 17, 2011, 12:45:46 PM #10 Last Edit: September 21, 2011, 12:49:28 PM by Spooky Dad
Updated Program File based on the Prop-2 template that I was provided.  Thank you for inserting the power up sequence and I saw the "rpts" part of the data set, which I am assuming will allow for the prop to be tripped multiple times in non-spooky mode.  Hopefully I am back on track with these updates.

Spooky Dad

September 22, 2011, 04:32:03 PM #11 Last Edit: September 23, 2011, 12:22:50 PM by Spooky Dad
I have a couple of questions and I have made an attempt to convert my existing code into the template you provided.

1.  In the RESET section, do I no longer need to send a reset signal to the AP-16+, DC-16 and/or the RC-4 to make sure the relays are inactive?  I reinserted the call to the subroutines at the end of the RESET section and at the very beginning of the MAIN section to shut down the AP-16+, DC-16 and RC-4 relay code.  I've also readded the code to initially set the IDX and MASK variables in the RESET section (see red text below)

Reset:
  OUTH = %00000000 : OUTL = %00000000           ' clear all
  DIRH = %00000000 : DIRL = %00000000           ' set outputs
  GOSUB Stop_AP16
  idx = Ghost
  mask = %00000001                              ' mask for idx = 0

' -----[ Program Code ]----------------------------------------------------

Main:
  outBits = 0                                   ' Added to ensure that DC-16 and RC-4 outputs and relays, respectively, are reset
  relays = 0
  GOSUB Set_DC16
  GOSUB Set_RC4
  triggers = %11111111                          ' enable all

2.  I've added another set of pointers for EEPROM memory for the upper outbits (OUTH) for the Prop-2.  I've also adjusted the program code to now jump 6.  Is that OK?

3.  Do I just put the name of the wave file (eg. COUNT.WAV) in the EEPROM table.  See example below.  If no wave file is provided will the AP-16+ just keep playing the AMBIENT.WAV file?

                '       OUTH       DC16-H     DC16-L     RC4  sfx, rpts

SpookyShow      DATA    %00000000, %00000000, %00000000, %0000, GHOST.WAV, 1
                DATA    %00000000, %00000001, %00000000, %0001, "", 1
                DATA    %00000000, %00001000, %00000000, %0100, CHILD.WAV, 1
                DATA    %00000000, %00000100, %00000000, %0010, AWAKE.WAV, 1
                DATA    %00000000, %00001000, %00000000, %0100, SHRIEK.WAV, 1
                DATA    %00000000, %00100000, %00000000, %0000, OWL.WAV, 1
                DATA    %00000000, %00100000, %00000000, %0000, "", 1
                DATA    %00000000, %00010000, %00000000, %1000, SNAKES.WAV, 1

NonSpooky       DATA    %00000000, %00000000, %00000000, %0000, COUNT.WAV, 1
                DATA    %00000000, %00000001, %00000000, %0001, COUNT.WAV, 1
                DATA    %00000000, %00001000, %00000000, %0100, COUNT.WAV, 1
                DATA    %00000000, %00000100, %00000000, %0010, COUNT.WAV, 1
                DATA    %00000000, %00001000, %00000000, %0100, COUNT.WAV, 1
                DATA    %00000000, %00100000, %00000000, %0000, COUNT.WAV, 1
                DATA    %00000000, %00100000, %00000000, %0000, COUNT.WAV, 1
                DATA    %00000000, %00010000, %00000000, %1000, COUNT.WAV, 1

4.  Also, I am not sure about how the READ_RECORD subroutine works, even after reading the Basic Stamp Programming Manual, but I am going to go with it. 

5.  I just inserted the logic to flow between Spooky and Non-Spooky (not sure if I am checking Input 14 correctly) and then wanted to get your opinion about using the SELECT CASE function to ensure the right actions are being triggered, for MIB, CPT, the AirCannon and DOOR.

6.  Added a number of debug statements to tell how the flow is going so I can test.

After that, I am ready for adding in the rest of the code for each prop, if required.

Spooky Dad

One more question (other than the ones above) and the posting of another version of the program code.  In this version, I have made the following updates:


  • Updated EEPROM memory section to correspond to the right outputs
  • Added logic at the very beginning to check whether or not the tour is Spooky
  • Added logic at the very beginning to determine if "Go Light" should be turned off


My additional question concerns the setting of direction in Reset section.  Based upon the show description, I was not sure where in the existing code declarations for inputs have been compared.  I have attached the existing and modified code to see which one is correct.

Existing code

Reset:
  OUTH = %00000000 : OUTL = %00000000           ' clear all
  DIRH = %00000000 : DIRL = %00000000           ' set outputs
  GOSUB Stop_AP16
  idx = Ghost
  mask = %00000001                              ' mask for idx = 0


Modified code

Reset:
  OUTH = %00000000 : OUTL = %00000000           ' clear all
  DIRH = %11000000 : DIRL = %11111111           ' set outputs
  GOSUB Stop_AP16
  idx = Ghost
  mask = %00000001                              ' mask for idx = 0

Spooky Dad

Here is my latest program.  The good news is that I got all of the syntax errors corrected so that I could load the program into the Prop-2.  The bad news is that it is not responding at all when I trip the input pins.  Someone please help a brother out!

' =========================================================================
'
'   File...... Spooky_Dad_Halloween_2011.BS2
'   Purpose... Automate the Haunted House on Two Jacks Trail
'   Author.... Karlen Alexander
'   E-mail.... karlen_alexander@dell.com
'   Started... 9/13/2011 (original prop-1 program started in August 2009
'   Updated... 9/29/2011
'
'   {$STAMP BS2}
'   {$PBASIC 2.5}
'
' =========================================================================


' -----[ Program Description ]---------------------------------------------


' -----[ Revision History ]------------------------------------------------


' -----[ I/O Definitions ]-------------------------------------------------

Sio             PIN     15
Spooky          PIN     14
NC13            PIN     13
NC12            PIN     12
NC11            PIN     11
NC10            PIN     10
NC09            PIN      9
NC08            PIN      8

Snakes          PIN      7
AirCannon       PIN      6
Graveyard       PIN      5
CPT             PIN      4
MIB             PIN      3
Chandelier      PIN      2
Door            PIN      1
Ghost           PIN      0


' -----[ Constants ]-------------------------------------------------------

IsOn            CON     1
IsOff           CON     0

MIBRun          CON     2500
MinJump         CON      500
MaxJump         CON      750
MinPropDelay    CON      250
MaxPropDelay    CON     1500


T2400           CON     396
T38K4           CON     6
Inverted        CON     $4000
Open            CON     $8000

Baud            CON     Open | T38K4


' -----[ Variables ]-------------------------------------------------------

outBits         VAR     Word                    ' Memory space for setting DC-16
outBitsH       VAR      outBits.HIGHBYTE
outBitsL       VAR      outBits.LOWBYTE

idx             VAR     Word                    ' Variable added in to understand what prop has been activated
mask            VAR     Word                    ' Variable added in to set input mask for specific prop
pntr            VAR     Word
lottery         VAR     Word
timer           VAR     Word                    ' Variable used for MIB variable jump timer?
delay           VAR     Word                    ' Variable used for Random Prop Delay

relays          VAR     Byte
K4             VAR      relays.BIT3
K3             VAR      relays.BIT2
K2             VAR      relays.BIT1
K1             VAR      relays.BIT0

triggers        VAR     Byte                    ' Used to determine what input (motion) is currently active
db              VAR     Byte                    ' Motion debounce timer
sfx             VAR     Byte                    ' Sound effects memory variable
rpts            VAR     Byte                    ' Repeats memory variable


' -----[ Initialization ]--------------------------------------------------

Power_Up:
  PAUSE 30000
  lottery = 1031                                ' seed random#

Reset:
  DIRH = %00111111 : DIRL = %00000000           ' set outputs
  OUTH = %00000000 : OUTL = %00000000           ' clear all
  GOSUB Stop_AP16
  idx = Ghost
  mask = %00000001                              ' mask for idx = 0

' -----[ Program Code ]----------------------------------------------------

Main:
  IF idx = Ghost THEN
     outBitsH = %00000001                       ' Turn Go Light On until first prop is tripped
  ELSE
     outBitsH = %00000000
  ENDIF

  IF idx = Ghost AND Spooky = 1 THEN            ' Tunr on Chicken Lights while the haunt is waiting for victim to trip first prop
    outbitsL = %01000000
  ELSE
    outbitsL = %00000000
  ENDIF

  relays = 0
  GOSUB Set_DC16                                ' Added to ensure that DC-16 and RC-4 outputs and relays, respectively, are reset
  GOSUB Set_RC4
  triggers = %11111111                          ' enable all
  FOR db = 1 TO 20
    PAUSE 5                                     ' debounce delay
    triggers = triggers & INL                   ' scan inputs
    RANDOM lottery                              ' stir random #
  NEXT

  triggers = triggers & mask                    ' isolate current sensor

  DEBUG idx, triggers

  IF triggers = %00000000 THEN Main              ' try again if not active
  GOTO Random_Prop_Delay

Set_Mode:                                       ' Figure out whether the tour is Spooky or Non-Spooky

IF Spooky = 1 THEN
  pntr = 6 * idx                                ' point to data for idx for Spooky
  DEBUG CR, CR, Spooky, idx, pntr

GOSUB Read_Record

    SELECT idx
      CASE MIB
          DEBUG CR, CR, "MIB SELECT CASE", idx, OUTH, OutBitsL, OutBitsH, relays, sfx, rpts
      CASE CPT
          DEBUG CR, CR, "CPT SELECT CASE", idx, OUTH, OutBitsL, OutBitsH, relays, sfx, rpts
      CASE Door
          DEBUG CR, CR, "DOOR SELECT CASE", idx, OUTH, OutBitsL, OutBitsH, relays, sfx, rpts
      CASE AirCannon
          DEBUG CR, CR, "AIRCANNON SELECT CASE", idx, OUTH, OutBitsL, OutBitsH, relays, sfx, rpts
      CASE ELSE
          DEBUG CR, CR, "ELSE SELECT CASE", idx, OUTH, OutBitsL, OutBitsH, relays, sfx, rpts
          GOTO Wrap_up
    ENDSELECT

ELSE
  pntr = (6 * idx) + 48      ' point to data for idx for Spooky
  DEBUG CR, CR, Spooky, idx, pntr

GOSUB Read_Record

Start_Non_Spooky:
    GOSUB Play_AP16
'  Need to wait until COUNT.WAV finishes before activating prop
    GOSUB Set_DC16
    GOSUB Set_RC4

    SELECT idx
      CASE MIB
          DEBUG CR, CR, "MIB SELECT CASE", idx, OUTH, OutBitsL, OutBitsH, relays, sfx, rpts
      CASE CPT
          DEBUG CR, CR, "CPT SELECT CASE", idx, OUTH, OutBitsL, OutBitsH, relays, sfx, rpts
      CASE Door
          DEBUG CR, CR, "DOOR SELECT CASE", idx, OUTH, OutBitsL, OutBitsH, relays, sfx, rpts
      CASE AirCannon
          DEBUG CR, CR, "AIRCANNON SELECT CASE", idx, OUTH, OutBitsL, OutBitsH, relays, sfx, rpts
      CASE ELSE
          DEBUG CR, CR, "ELSE SELECT CASE", idx, OUTH, OutBitsL, OutBitsH, relays, sfx, rpts
          GOTO Wrap_up
    ENDSELECT

ENDIF

Wrap_up:
    IF idx = Snakes THEN Reset
    idx = idx + 1                                 ' next sensor #
    mask = mask * 2                               ' update sensor mask
    GOTO Main

' -----[ Subroutines ]-----------------------------------------------------

Set_DC16:
  SEROUT Sio, Baud, ["!DC16", %00, "S", outBitsL, outBitsH]
  RETURN

' -------------------------------------------------------------------------

Set_RC4:
  SEROUT Sio, Baud, ["!RC4", %00, "S", relays]
  RETURN

' -------------------------------------------------------------------------

' Play SFXnn.WAV, rpts times

Play_AP16:
  SEROUT Sio, Baud, ["!AP16", %00, "PS", sfx, rpts]
  RETURN

' -------------------------------------------------------------------------

Stop_AP16:
  SEROUT Sio, Baud, ["!AP16", %00, "X"]
  RETURN

' -------------------------------------------------------------------------

Random_Prop_Delay:
    RANDOM lottery                                ' re-stir
    delay = MaxPropDelay - MinPropDelay + 1       ' get span
    delay = lottery // delay + MinPropDelay       ' calc jump timing
    PAUSE delay
    RETURN

' -------------------------------------------------------------------------

Read_Record:
  READ pntr, OUTH, outBitsH, outBitsL, relays, sfx, rpts
  RETURN

' -----[ User Data ]-------------------------------------------------------

                '       OUTH       DC16-H     DC16-L     RC4  sfx, rpts

SpookyShow      DATA    %00000000, %00000000, %10000011, %0000, "GHOST.WAV", 1           ' Ghost
                DATA    %00000000, %00000000, %10000100, %0001, "NONE.WAV", 1                  ' Door
                DATA    %00000000, %00000000, %10000000, %0010, "CHILD.WAV", 1           ' Chandelier
                DATA    %00000011, %00000000, %10000000, %0100, "AWAKE.WAV", 1           ' MIB
                DATA    %00011100, %00000000, %10000000, %1000, "SHRIEK.WAV", 1          ' CPT
                DATA    %00000100, %00000000, %10001000, %0000, "OWL.WAV", 1             ' Graveyard
                DATA    %00001000, %00000000, %10010000, %0000, "NONE.WAV", 1                  ' Air Cannon
                DATA    %00010000, %00000000, %10100000, %0000, "SNAKES.WAV", 1          ' Snakes

NonSpooky       DATA    %00000000, %00000000, %11000011, %0000, "COUNTDOWN.WAV", 1           ' Ghost
                DATA    %00000000, %00000000, %11000100, %0001, "COUNTDOWN.WAV", 1           ' Door
                DATA    %00000000, %00000000, %11000000, %0010, "COUNTDOWN.WAV", 1           ' Chandelier
                DATA    %00000011, %00000000, %11000000, %0100, "COUNTDOWN.WAV", 1           ' MIB
                DATA    %00011100, %00000000, %11000000, %1000, "COUNTDOWN.WAV", 1           ' CPT
                DATA    %00000000, %00000000, %11001000, %0000, "COUNTDOWN.WAV", 1           ' Graveyard
                DATA    %00000000, %00000000, %11010000, %0000, "COUNTDOWN.WAV", 1           ' Air Cannon
                DATA    %00000000, %00000000, %11100000, %0000, "COUNTDOWN.WAV", 1           ' Snakes

JonnyMac

I've printed out your docs (nicely done, by the way) and am just looking for a concentrated block of time to write you a bunch of code.  Should get some time this weekend.
Jon McPhalen
EFX-TEK Hollywood Office