Page 146 - The Unofficial Guide to Lego Mindstorms Robots
P. 146

135


          (table continued from previous page)

          Table 6-11. SOUND_PLAY Sounds (continued)

          Sound Number     Description

          2                D escending  arpeggio

          3                Ascending  arpeggio

          4                Long  low note

          5                  Quick ascending arpeggio (same as 3 but faster)

              The sounds can be either  unqueued  or  q ueued.  Unqueued sounds  will be played  right away if no sound is currently
              playing. If a sound i s currently playing (i.e., the sound system is already busy), then the unqueued sound will not be
              play ed at all. A queued sound, on the other hand, waits for the sound system to finish whatever it's doing and then plays.
              The value of code determines if a sound is queu ed (4003) or unqueued (4004).

          SOUND_GET (address --)
          This word returns the  curr ent state of the sound system to the given variable. You can use the pbFORTH-supplied variable
          RCX_SOUND   for this word . A zero indicates that the sound system is not busy. Any other value means that the sound system
          is busy playing another sound .

          Cooperative Multitasking

          pbFORTH version 1. 0.5 introduced words that support  cooperative multitasking.  Cooperative multitasking allows multiple
          tasks to appear to run simultaneously. In rea lity, each task must voluntarily yield control to the next task in line. The other kind
          of multitasking, wh ich you've seen in NQ C and will see again in legOS, is called preemptive multitasking. With preemptive
          multitasking, the system gives litt le bits of time to each task, interrupting each task to give control to the next task. Cooperative
          multitasking is a little tricky to pro gram because each task needs to explicitly yield control to the other tasks. If your robot has
          a task that is going to do any lengthy pro cessing, the task needs to be structured so that it can yield control frequently.

          The pbFORTH w eb page has more information on cooperative multitasking. Take a look at the tortask.txt example, which is a
          good dem onstratio n of the use of multiple tasks in pbFORTH.

          The basic procedure for running a multitasking program has four steps:

          1 . First, you need to a llocate space for each task using the ALLOT_TASK word. This includes space for user variables and
          space for a parameter and return stack. Here's a sample from tortask.txt:

              0 32 CELLS 32 CELLS ALLOT_TASK MOTOR_TASK
   141   142   143   144   145   146   147   148   149   150   151