LEGO Mindstorms EV3


Brick Program Source Code

//**********************************************************************
define appv 'Brick Program V1.02'                                     //
//**********************************************************************
                                                                      //
define    MAX_NO_OF_BLOCKS    19                                      //  Max number of blocks (inc. File, Start and loop)
                                                                      //
define    TEMPLATE_FILE       'template.rbf'                          //
define    RUN_FILE            'run.rbf'                               //
                                                                      //
define    BPRG_FILE           'BrkProg_'                              //
                                                                      //
define    FILEBLOCK_FILENO    'fileno.rtf'                            //
                                                                      //
define    OBP_CENTER_X        ((LCD_WIDTH / 2) - 1)                   //  Center of Programming window  
define    OBP_MIN_X           (0)                                     //
define    OBP_MAX_X           (LCD_WIDTH)                             //
                                                                      //
define    BROWSER_STARTX      8                                       //
define    BROWSER_STARTY      40                                      //
define    BROWSER_WIDTH       166                                     //
define    BROWSER_HEIGHT      85                                      //
                                                                      //
define    BLOCKS              ((MAX_NO_OF_BLOCKS * 2) - 1)            //  Max number of blocks (inc. separators)
define    LIBBLOCKS           20                                      //
                                                                      //
define    STARTBLOCK          2                                       //  Start block
define    LOOPBLOCK           3                                       //  Loop block
define    EMPTYBLOCK          4                                       //  Empty block
define    DOUBLEMOTORBLOCK    5                                       //  Double motor block
define    SINGLEMOTORBLOCK    6                                       //  Single motor block
define    MEDIUMMOTORBLOCK    7                                       //  Medium motor block
define    SOUNDBLOCK          8                                       //  Sound playback
define    DISPLAYBLOCK        9                                       //  Display image
define    LEDBLOCK            10                                      //  Button light
define    TOUCHBLOCK          11                                      //  Wait for touch
define    REFLECTEDBLOCK      12                                      //  Wait for reflected light
define    COLORBLOCK          13                                      //  Wait for color
define    BEACONBLOCK         14                                      //  Wait for beacon button
define    PROXIMITYBLOCK      15                                      //  Wait for proximity
define    TEMPERATUREBLOCK    16                                      //  Wait for temperature
define    ULTRASONICBLOCK     17                                      //  Wait for ultrasonic
define    ANGLEBLOCK          18                                      //  Wait for angle
define    ENCODERBLOCK        19                                      //  Wait for generic encoder
define    BUTTONBLOCK         20                                      //  Wait for brick button
define    DELAYBLOCK          21                                      //  Delay block
                                                                      //
define    TRASHBIN            29                                      //  Trash bin
define    FILEBLOCK           30                                      //  File block
define    SEPARATOR           31                                      //  Separator block
                                                                      //
define    INIT                0                                       //  Initialise (parameters)
define    GET_WIDTH           1                                       //  Get block width
define    REFRESH             2                                       //  Refresh graphics
define    ACTIVATE            3                                       //  Activate block
define    DRAW_ICON           4                                       //  Draw icon
                                                                      //
DATA16    hBlockLib                                                   //  Block library
DATA16    hBlockStream                                                //  Block stream (program)
DATA16    hBlockPar1                                                  //  Par1 array
DATA16    hBlockPar2                                                  //  Par2 array
                                                                      //
DATA8     Changed                                                     //  Changes in program flag
                                                                      //
// MAIN ************************************************************************************************
                                                                      //
                                                                      //
vmthread  MAIN                                                        //  void MAIN(void)
{                                                                     //  {
  DATA32  Index                                                       //
  DATA16  Cursor                                                      //
  DATA16  Block                                                       //
  DATA16  Tmp16                                                       //
  DATA16  Start                                                       //
  DATA16  End                                                         //
  DATA8   Run                                                         //
  DATA8   Update                                                      //
  DATA8   Status                                                      //
  DATA8   State                                                       //
  DATA8   Stat                                                        //
  DATA8   Volume                                                      //
  DATA8   Exist                                                       //
  DATA8   ShowVersion                                                 //
                                                                      //
  UI_BUTTON(PRESSED,RIGHT_BUTTON,ShowVersion)                         //    UI_BUTTON(PRESSED,RIGHT_BUTTON,ShowVersion)
  JR_FALSE(ShowVersion,DontShowVersion)                               //    if (ShowVersion)
                                                                      //    {
  UI_DRAW(FILLRECT,BG_COLOR,4,50,170,28)                              //      UI_DRAW(FILLRECT,BG_COLOR,4,50,170,28)
  UI_DRAW(RECT,FG_COLOR,6,52,166,24)                                  //      UI_DRAW(RECT,FG_COLOR,6,52,166,24)
  UI_DRAW(TEXT,FG_COLOR,13,60,appv)                                   //      UI_DRAW(TEXT,FG_COLOR,13,60,appv)
  UI_DRAW(UPDATE)                                                     //      UI_DRAW(UPDATE)
                                                                      //
ShowVersionWait:                                                      //      do
                                                                      //      {  
  UI_BUTTON(PRESSED,RIGHT_BUTTON,ShowVersion)                         //        UI_BUTTON(PRESSED,RIGHT_BUTTON,ShowVersion)
                                                                      //      }
  JR_TRUE(ShowVersion,ShowVersionWait)                                //      while (ShowVersion)
                                                                      //
  UI_BUTTON(FLUSH)                                                    //      UI_BUTTON(FLUSH)
DontShowVersion:                                                      //    }  
                                                                      //
  UI_DRAW(RESTORE,0)                                                  //    UI_DRAW(RESTORE,0)
  UI_DRAW(TOPLINE,1)                                                  //    UI_DRAW(TOPLINE,1)
  UI_BUTTON(SET_BACK_BLOCK,1)                                         //    UI_BUTTON(SET_BACK_BLOCK,1)
  UI_WRITE(LED,LED_GREEN)                                             //    UI_WRITE(LED,LED_GREEN)
                                                                      //
  FILENAME(EXIST,PROGRAM_FOLDER,Exist)                                //    FILENAME(EXIST,PROGRAM_FOLDER,Exist)
  JR_TRUE(Exist,FolderExist)                                          //    if (!Exist)
                                                                      //    {
  FILE(MAKE_FOLDER,PROGRAM_FOLDER,Exist)                              //      FILE(MAKE_FOLDER,PROGRAM_FOLDER,Exist)
                                                                      //
FolderExist:                                                          //    }
                                                                      //
  // Create hBlockLib                                                 //
  ARRAY(CREATE16,LIBBLOCKS,hBlockLib)                                 //    ARRAY(CREATE16,LIBBLOCKS,hBlockLib)
                                                                      //
  // Create hBlockStream                                              //
  ARRAY(CREATE16,BLOCKS,hBlockStream)                                 //    ARRAY(CREATE16,BLOCKS,hBlockStream)
                                                                      //
  // Create hBlockPar1                                                //
  ARRAY(CREATE16,BLOCKS,hBlockPar1)                                   //    ARRAY(CREATE16,BLOCKS,hBlockPar1)
                                                                      //
  // Create hBlockPar2                                                //
  ARRAY(CREATE16,BLOCKS,hBlockPar2)                                   //    ARRAY(CREATE16,BLOCKS,hBlockPar2)
                                                                      //
  // Init hBlockLib                                                   //
  CALL(InitBlockLib)                                                  //    CALL(InitBlockLib)
                                                                      //
  // Init hBlockStream                                                //
  CALL(InitBlockStream)                                               //    CALL(InitBlockStream)
                                                                      // 
  // Init Cursor                                                      //                                                                    
  CALL(FindBlockType,STARTBLOCK,Cursor)                               //    CALL(FindBlockType,hBlockStream,STARTBLOCK,Cursor)                                                                
                                                                      //
  ADD16(Cursor,1,Cursor)                                              //    Cursor++                                                                      
                                                                      // 
  MOVE8_8(1,Update)                                                   //    Update  =  1                                                                     
                                                                      // 
  MOVE8_8(0,Changed)                                                  //    Changed =  0
                                                                      //
  MOVE8_8(1,Run)                                                      //    Run     =  1
                                                                      //
                                                                      //    do
Loop:                                                                 //    {
                                                                      // 
  JR_FALSE(Update,NotUpdate)                                          //      if (Update)
                                                                      //      {
  // Update graphics                                                  //
  CALL(UpdateStreamGraphics,Cursor)                                   //        CALL(UpdateStreamGraphics,Cursor)                                                                                                                                                                                                              
                                                                      // 
  MOVE8_8(0,Update)                                                   //        Update  =  0
                                                                      //
  // Test for file block selected                                     //
  JR_NEQ16(Cursor,0,NotZero)                                          //        if (Cursor == 0)
                                                                      //        {
  CALL(ActivateBlock,Cursor)                                          //          CALL(ActivateBlock,Cursor)
  CALL(UpdateStreamGraphics,Cursor)                                   //          CALL(UpdateStreamGraphics,Cursor)
NotZero:                                                              //        }
                                                                      // 
NotUpdate:                                                            //      }
                                                                      // 
  UI_BUTTON(WAIT_FOR_PRESS)                                           //      UI_BUTTON(WAIT_FOR_PRESS)
                                                                      // 
  MOVE8_8(1,Update)                                                   //      Update  =  1                                                                     
                                                                      // 
  UI_BUTTON(GET_HORZ,Tmp16)                                           //      UI_BUTTON(GET_HORZ,Tmp16)
  JR_EQ16(Tmp16,0,NotHorz)                                            //      if (Tmp16)
                                                                      //      {
  UI_BUTTON(FLUSH)                                                    //        UI_BUTTON(FLUSH)
  ADD16(Cursor,Tmp16,Cursor)                                          //        Cursor +=  Tmp16
  CALL(FindBlockType,LOOPBLOCK,Tmp16)                                 //        CALL(FindBlockType,LOOPBLOCK,Tmp16)                                                                
  JR_LTEQ16(Cursor,Tmp16,NotTooHigh)                                  //        if (Cursor > Tmp16)
                                                                      //        {
  MOVE16_16(Tmp16,Cursor)                                             //          Cursor  =  Tmp16
  MOVE8_8(0,Update)                                                   //          Update  =  0                                                                     
NotTooHigh:                                                           //        }
  CALL(FindBlockType,FILEBLOCK,Tmp16)                                 //        CALL(FindBlockType,FILEBLOCK,Tmp16)                                                                
  JR_GTEQ16(Cursor,Tmp16,NotTooLow)                                   //        if (Cursor < Tmp16)
                                                                      //        {
  MOVE16_16(Tmp16,Cursor)                                             //          Cursor  =  Tmp16
  MOVE8_8(0,Update)                                                   //          Update  =  0                                                                     
NotTooLow:                                                            //        }
NotHorz:                                                              //      }
  UI_BUTTON(SHORTPRESS,ENTER_BUTTON,State)                            //      UI_BUTTON(SHORTPRESS,ENTER_BUTTON,State) 
  JR_FALSE(State,NotEnter)                                            //      if (State)
                                                                      //      {
  UI_BUTTON(FLUSH)                                                    //        UI_BUTTON(FLUSH)
  // Activate block                                                   //
  CALL(ActivateBlock,Cursor)                                          //        CALL(ActivateBlock,Cursor)                                                                                                                                                                                                              
                                                                      // 
NotEnter:                                                             //      }  
  UI_BUTTON(SHORTPRESS,UP_BUTTON,State)                               //      UI_BUTTON(SHORTPRESS,UP_BUTTON,State) 
  JR_FALSE(State,NotUp)                                               //      if (State)
                                                                      //      {
  UI_BUTTON(FLUSH)                                                    //        UI_BUTTON(FLUSH)
  CALL(FindBlockType,STARTBLOCK,Start)                                //        CALL(FindBlockType,STARTBLOCK,Start)
  CALL(FindBlockType,LOOPBLOCK,End)                                   //        CALL(FindBlockType,LOOPBLOCK,End)
  JR_LTEQ16(Cursor,Start,Outside)                                     //        if ((Cursor > Start) &&
  JR_GTEQ16(Cursor,End,Outside)                                       //            (Cursor < End)
                                                                      //        {
  ADD16(End,2,End)                                                    //          End   +=  2
  MOVE16_32(Cursor,Index)                                             //          Index  =  Cursor
  ARRAY_READ(hBlockStream,Index,Block)                                //          Block  =  hBlockStream[Index]
  JR_NEQ16(Block,SEPARATOR,Ok)                                        //          if ((Block != SEPARATOR) ||
  JR_GTEQ16(End,BLOCKS,Full)                                          //               (End < BLOCKS))
Ok:                                                                   //          {
  // Block library                                                    //
  CALL(BlockLibrary,Cursor)                                           //            CALL(BlockLibrary,Cursor)
                                                                      // 
Full:                                                                 //          }
Outside:                                                              //        }
NotUp:                                                                //      }  
  UI_BUTTON(SHORTPRESS,BACK_BUTTON,State)                             //      UI_BUTTON(SHORTPRESS,BACK_BUTTON,State) 
  JR_FALSE(State,NotBack)                                             //      if (State)
                                                                      //      {
  CALL(FindBlockType,STARTBLOCK,Start)                                //        CALL(FindBlockType,STARTBLOCK,Start)
  UI_BUTTON(FLUSH)                                                    //        UI_BUTTON(FLUSH)
  JR_NEQ16(Cursor,Start,NotStart)                                     //        if (Cursor == Start)
                                                                      //        {
  JR_FALSE(Changed,NoChanges)                                         //          if (Changed)
                                                                      //          {
                                                                      //
  INFO(GET_VOLUME,Volume)                                             //            INFO(GET_VOLUME,Volume)
  SOUND(PLAY,Volume,'GeneralAlarm')                                   //            SOUND(PLAY,Volume,'GeneralAlarm')
                                                                      //
  MOVE8_8(0,Stat)                                                     //            Stat    =  0
  MOVE8_8(1,Status)                                                   //            Status  =  1
  UI_DRAW(QUESTION,FG_COLOR,16,50,WARNSIGN,TO_FILE,'',Stat,Status)    //            UI_DRAW(QUESTION,FG_COLOR,16,50,WARNSIGN,TO_FILE,'',Stat,Status)
  JR_NEQ8(Status,1,DontSave)                                          //            if (Status == 1)
                                                                      //            {
  CALL(SaveFilename)                                                  //              CALL(SaveFilename)
  MOVE8_8(0,Run)                                                      //              Run   =  0
                                                                      //
DontSave:                                                             //            }
  JR_NEQ8(Status,0,DontQuit)                                          //            if (Status == 0)
                                                                      //            {
  MOVE8_8(0,Run)                                                      //              Run   =  0
                                                                      //
DontQuit:                                                             //            }
  JR(EndChanges)                                                      //          }
                                                                      //          else
NoChanges:                                                            //          {
                                                                      //
  MOVE8_8(0,Run)                                                      //            Run   =  0
                                                                      //
EndChanges:                                                           //          }
  JR(EndBack)                                                         //        }
                                                                      //        else
NotStart:                                                             //        {
  JR_LTEQ16(Cursor,Start,GreatherThanStart)                           //          if (Cursor > Start)
                                                                      //          {
  MOVE16_16(Start,Cursor)                                             //            Cursor  =  Start
                                                                      //
GreatherThanStart:                                                    //          }
EndBack:                                                              //        }
NotBack:                                                              //      }  
                                                                      //    }
  JR_TRUE(Run,Loop)                                                   //    while (Run)
                                                                      //
  // Delete hBlockPar2                                                //
  ARRAY(DELETE,hBlockPar2)                                            //    ARRAY(DELETE,hBlockPar2)
                                                                      //
  // Delete hBlockPar1                                                //
  ARRAY(DELETE,hBlockPar1)                                            //    ARRAY(DELETE,hBlockPar1)
                                                                      //
  // Delete hBlockStream                                              //
  ARRAY(DELETE,hBlockStream)                                          //    ARRAY(DELETE,hBlockStream)
                                                                      //
  // Delete hBlockLib                                                 //
  ARRAY(DELETE,hBlockLib)                                             //    ARRAY(DELETE,hBlockLib)
                                                                      //
  UI_BUTTON(SET_BACK_BLOCK,0)                                         //
                                                                      //                                                                      
  UI_BUTTON(FLUSH)                                                    //    UI_BUTTON(FLUSH)
}                                                                     //  }
                                                                      //
                                                                      //
// InitBlockLib ****************************************************************************************
                                                                      //
                                                                      //
subcall   InitBlockLib                                                //  InitBlockLib
{                                                                     //  {
                                                                      //
  ARRAY(FILL,hBlockLib,EMPTYBLOCK)                                    //    ARRAY(FILL,hBlockLib,EMPTYBLOCK)
                                                                      //
  ARRAY_WRITE(hBlockLib,0,TRASHBIN)                                   //    hBlockLib[0]  =  TRASHBIN
  ARRAY_WRITE(hBlockLib,1,MEDIUMMOTORBLOCK)                           //    hBlockLib[0]  =  MEDIUMMOTORBLOCK
  ARRAY_WRITE(hBlockLib,2,SINGLEMOTORBLOCK)                           //    hBlockLib[0]  =  SINGLEMOTORBLOCK
  ARRAY_WRITE(hBlockLib,3,DOUBLEMOTORBLOCK)                           //    hBlockLib[0]  =  DOUBLEMOTORBLOCK
                                                                      //
  ARRAY_WRITE(hBlockLib,5,DISPLAYBLOCK)                               //    hBlockLib[0]  =  DISPLAYBLOCK
  ARRAY_WRITE(hBlockLib,6,SOUNDBLOCK)                                 //    hBlockLib[0]  =  SOUNDBLOCK
  ARRAY_WRITE(hBlockLib,7,LEDBLOCK)                                   //    hBlockLib[0]  =  LEDBLOCK
  ARRAY_WRITE(hBlockLib,8,TOUCHBLOCK)                                 //    hBlockLib[0]  =  TOUCHBLOCK
  ARRAY_WRITE(hBlockLib,9,REFLECTEDBLOCK)                             //    hBlockLib[0]  =  REFLECTEDBLOCK
  ARRAY_WRITE(hBlockLib,10,COLORBLOCK)                                //    hBlockLib[0]  =  COLORBLOCK
                                                                      //
  ARRAY_WRITE(hBlockLib,12,ULTRASONICBLOCK)                           //    hBlockLib[0]  =  ULTRASONICBLOCK
  ARRAY_WRITE(hBlockLib,13,PROXIMITYBLOCK)                            //    hBlockLib[0]  =  PROXIMITYBLOCK
  ARRAY_WRITE(hBlockLib,14,BEACONBLOCK)                               //    hBlockLib[0]  =  BEACONBLOCK
  ARRAY_WRITE(hBlockLib,15,ANGLEBLOCK)                                //    hBlockLib[0]  =  ANGLEBLOCK
  ARRAY_WRITE(hBlockLib,16,TEMPERATUREBLOCK)                          //    hBlockLib[0]  =  TEMPERATUREBLOCK
  ARRAY_WRITE(hBlockLib,17,ENCODERBLOCK)                              //    hBlockLib[0]  =  ENCODERBLOCK
  ARRAY_WRITE(hBlockLib,18,BUTTONBLOCK)                               //    hBlockLib[0]  =  BUTTONBLOCK
  ARRAY_WRITE(hBlockLib,19,DELAYBLOCK)                                //    hBlockLib[0]  =  DELAYBLOCK
                                                                      //
}                                                                     //  }
                                                                      //
                                                                      //
// InitBlockStream *************************************************************************************
                                                                      //
                                                                      //
subcall   InitBlockStream                                             //  InitBlockStream
{                                                                     //  {
                                                                      //
  ARRAY(FILL,hBlockStream,EMPTYBLOCK)                                 //    ARRAY(FILL,hBlockStream,EMPTYBLOCK)
                                                                      //    
  ARRAY_WRITE(hBlockStream,0,FILEBLOCK)                               //    hBlockStream[0]     =  FILEBLOCK                                                                     
  CALL(UpdateBlock,FILEBLOCK,INIT,0,0,0)                              //    CALL(UpdateBlock,FILEBLOCK,INIT,0,0,0)
                                                                      //    
  ARRAY_WRITE(hBlockStream,1,STARTBLOCK)                              //    hBlockStream[1]     =  STARTBLOCK                                                                     
  CALL(UpdateBlock,STARTBLOCK,INIT,1,0,0)                             //    CALL(UpdateBlock,STARTBLOCK,INIT,1,0,0)
                                                                      //    
  ARRAY_WRITE(hBlockStream,2,SEPARATOR)                               //    hBlockStream[2]     =  SEPARATOR                                                                     
  CALL(UpdateBlock,SEPARATOR,INIT,2,0,0)                              //    CALL(UpdateBlock,SEPARATOR,INIT,2,0,0)
                                                                      //    
  ARRAY_WRITE(hBlockStream,3,LOOPBLOCK)                               //    hBlockStream[3]     =  LOOPBLOCK                                                                     
  CALL(UpdateBlock,LOOPBLOCK,INIT,3,0,0)                              //    CALL(UpdateBlock,LOOPBLOCK,INIT,3,0,0)
                                                                      //    
}                                                                     //  }
                                                                      //
                                                                      //
// InsertBlockInStream *********************************************************************************
                                                                      //
                                                                      //
subcall   InsertBlockInStream                                         //  InsertBlockInStream
{                                                                     //  {
  IN_16   BlockType                                                   //
  IO_16   Place                                                       //
  OUT_8   Status                                                      //
                                                                      //
  DATA8   Align                                                       //
  DATA16  Pointer                                                     //
  DATA32  Index1                                                      //
  DATA32  Index2                                                      //
  DATA16  Pointer                                                     //
  DATA16  Block                                                       //
  DATA16  Tmp                                                         //
  DATA16  Par1                                                        //
  DATA16  Par2                                                        //
                                                                      //
  MOVE8_8(0,Status)                                                   //    Status  =  0
  // Find end of block stream                                         //                                                                      
  CALL(FindBlockType,LOOPBLOCK,Pointer)                               //    CALL(FindBlockType,LOOPBLOCK,Pointer)
                                                                      //
  // Check for room for insertion                                     //
  ADD16(Pointer,2,Tmp)                                                //    Tmp  =  Pointer + 2
  JR_GTEQ16(Tmp,BLOCKS,BlockStreamFull)                               //    if (Tmp < BLOCKS)
                                                                      //    {
  ADD16(Pointer,2,Pointer)                                            //      Pointer +=  2
  // Move all blocks from Pointer to Place 2 places forward           //     
MakeRoom:                                                             //      while (Pointer > Place)                                       
  JR_LTEQ16(Pointer,Place,Done)                                       //                                                                      
                                                                      //      {
  MOVE16_32(Pointer,Index1)                                           //        Index1  =  Pointer
  SUB32(Index1,2,Index2)                                              //        Index2  =  Index1 - 2                                                                      
  ARRAY_READ(hBlockStream,Index2,Block)                               //        Block  =  hBlockStream[Index2]
  ARRAY_WRITE(hBlockStream,Index1,Block)                              //        hBlockStream[Index1]  =  Block                                                                     
  ARRAY_READ(hBlockPar1,Index2,Par1)                                  //        Par1   =  hBlockPar1[Index2]
  ARRAY_WRITE(hBlockPar1,Index1,Par1)                                 //        hBlockPar1[Index1]  =  Par1                                                                     
  ARRAY_READ(hBlockPar2,Index2,Par2)                                  //        Par2   =  hBlockPar2[Index2]
  ARRAY_WRITE(hBlockPar2,Index1,Par2)                                 //        hBlockPar2[Index1]  =  Par2                                                                     
  SUB16(Pointer,1,Pointer)                                            //        Pointer--
  JR(MakeRoom)                                                        //      }
Done:                                                                 //                                                                    
                                                                      //
  // Insert separator and BlockType                                   //
  MOVE16_32(Place,Index1)                                             //      Index1  =  Place
  ARRAY_WRITE(hBlockStream,Index1,SEPARATOR)                          //      hBlockStream[Index1]  =  SEPARATOR                                                                     
  ADD32(Index1,1,Index1)                                              //      Index1++                                                                          
  ARRAY_WRITE(hBlockStream,Index1,BlockType)                          //      hBlockStream[Index1]  =  BlockType                                                                     
                                                                      //
  MOVE8_8(1,Status)                                                   //      Status  =  1
BlockStreamFull:                                                      //    }                                                                      
                                                                      //
}                                                                     //  }
                                                                      //
                                                                      //
// RemoveBlockInStream *********************************************************************************
                                                                      //
                                                                      //
subcall   RemoveBlockInStream                                         //  RemoveBlockInStream
{                                                                     //  {
  IO_16   Place                                                       //
                                                                      //
  DATA32  Index1                                                      //
  DATA32  Index2                                                      //
  DATA16  Pointer                                                     //
  DATA16  End                                                         //
  DATA16  Block                                                       //
  DATA16  Par1                                                        //
  DATA16  Par2                                                        //
                                                                      //
  // Find end of block stream                                         //
  CALL(FindBlockType,LOOPBLOCK,End)                                   //    CALL(FindBlockType,LOOPBLOCK,End)
                                                                      //
  MOVE16_16(Place,Pointer)                                            //    Pointer  =  Place
Move:                                                                 //    while (Pointer < End)
  JR_GTEQ16(Pointer,End,Done)                                         //
                                                                      //    {
  MOVE16_32(Pointer,Index1)                                           //        Index1  =  Pointer
  ADD32(Index1,2,Index2)                                              //        Index2  =  Index1 + 2
  ARRAY_READ(hBlockStream,Index2,Block)                               //        Block  =  hBlockStream[Index2]
  ARRAY_WRITE(hBlockStream,Index1,Block)                              //        hBlockStream[Index1]  =  Block
  ARRAY_READ(hBlockPar1,Index2,Par1)                                  //        Par1   =  hBlockPar1[Index2]
  ARRAY_WRITE(hBlockPar1,Index1,Par1)                                 //        hBlockPar1[Index1]  =  Par1
  ARRAY_READ(hBlockPar2,Index2,Par2)                                  //        Par2   =  hBlockPar2[Index2]
  ARRAY_WRITE(hBlockPar2,Index1,Par2)                                 //        hBlockPar2[Index1]  =  Par2
  ADD16(Pointer,1,Pointer)                                            //        Pointer++
  JR(Move)                                                            //    }
Done:                                                                 //
                                                                      //
  // Insert empty block                                               //
  MOVE16_32(End,Index1)                                               //    Index1  =  End
  SUB32(Index1,1,Index1)                                              //    Index1 -=  1
  ARRAY_WRITE(hBlockStream,Index1,EMPTYBLOCK)                         //    hBlockStream[Index1]  =  EMPTYBLOCK
  ADD32(Index1,1,Index1)                                              //    Index1++
  ARRAY_WRITE(hBlockStream,Index1,EMPTYBLOCK)                         //    hBlockStream[Index1]  =  EMPTYBLOCK
  SUB16(Place,1,Place)                                                //    Place--
}                                                                     //  }
                                                                      //
                                                                      //
// FindBlockType ***************************************************************************************
                                                                      //
                                                                      //
subcall   FindBlockType                                               //  FindBlockType
{                                                                     //  {
  IN_16   BlockType                                                   //
  OUT_16  Place                                                       //
                                                                      //
  DATA16  Block                                                       //
  DATA32  Index                                                       //
                                                                      //
  MOVE8_16(0,Place)                                                   //    Place  =  0
FindBlock:                                                            //    while (Block != BlockType)
  // Get block type                                                   //
  MOVE16_32(Place,Index)                                              //    Index  =  Place                                                                          
  ARRAY_READ(hBlockStream,Index,Block)                                //    Block  =  hBlockStream[Index]
  JR_EQ16(Block,BlockType,BlockFound)                                 //    {                                                                                                                                            
                                                                      //
  // Next block                                                       //                                                                      
  ADD16(1,Place,Place)                                                //      Place++
                                                                      //
  JR(FindBlock)                                                       //    }
BlockFound:                                                           //  
}                                                                     //  }
                                                                      //
                                                                      //
// UpdateStreamGraphics ********************************************************************************
                                                                      //
                                                                      //
subcall   UpdateStreamGraphics                                        //  UpdateStreamGraphics
{                                                                     //  {
  IN_16   Cursor                                                      //
                                                                      //
  DATA16  X                                                           //
                                                                      //
  UI_DRAW(FILLWINDOW,BG_COLOR,TOPLINE_HEIGHT,0)                       //    UI_DRAW(FILLWINDOW,BG_COLOR,TOPLINE_HEIGHT,0)
  CALL(UpdateBlockStreamGraphics,Cursor)                              //    CALL(UpdateBlockStreamGraphics,Cursor)
                                                                      //
  CALL(FindBlockType,STARTBLOCK,X)                                    //    CALL(FindBlockType,STARTBLOCK,X)
  JR_GTEQ16(Cursor,X,Fileblock)                                       //    if (Cursor < X)
                                                                      //    {
  MOVE16_16(X,Cursor)                                                 //      Cursor  =  X
                                                                      //
Fileblock:                                                            //    }
                                                                      //
  SUB16(Cursor,X,X)                                                   //    X        -=  Cursor
  MUL16(X,4,X)                                                        //    X        *=  4
  ADD16(X,20,X)                                                       //    X        +=  17
  UI_DRAW(BMPFILE,FG_COLOR,18,13,'ProgNav')                           //    Draw bitmap
  UI_DRAW(BMPFILE,FG_COLOR,X,13,'ProgNavdot')                         //    Draw bitmap
                                                                      //
  UI_DRAW(UPDATE)                                                     //    UI_DRAW(UPDATE)
}                                                                     //  }
                                                                      //
                                                                      //
// UpdateBlockStreamGraphics ***************************************************************************
                                                                      //
                                                                      //
subcall   UpdateBlockStreamGraphics                                   //  UpdateBlockStreamGraphics
{                                                                     //  {
  IN_16   Cursor                                                      //
                                                                      //
  DATA32  Index                                                       //                                                                           
  DATA16  Block                                                       //
  DATA16  Pointer                                                     //
  DATA16  Start                                                       //
  DATA16  End                                                         //
  DATA16  Width                                                       //
  DATA16  Height                                                      //
  DATA16  X1                                                          //
  DATA16  X2                                                          //
                                                                      //
  // Find start of block stream                                       //                                                                      
  CALL(FindBlockType,FILEBLOCK,Start)                                 //    CALL(FindBlockType,FILEBLOCK,Start)
                                                                      //
  // Find end of block stream                                         //                                                                      
  CALL(FindBlockType,LOOPBLOCK,End)                                   //    CALL(FindBlockType,LOOPBLOCK,End)
                                                                      //
  // Get block width at cursor                                        //
  MOVE16_16(Cursor,Pointer)                                           //    Pointer =  Cursor
  MOVE16_32(Pointer,Index)                                            //    Index   =  Pointer                                  
  ARRAY_READ(hBlockStream,Index,Block)                                //    Block   =  hBlockStream[Index]
  CALL(UpdateBlock,Block,GET_WIDTH,Pointer,Width,Height)              //    CALL(UpdateBlock,Block,GET_WIDTH,Pointer,Width,Height)
  DIV16(Width,2,X1)                                                   //    X1      =  Width / 2                                                                      
  SUB16(OBP_CENTER_X,X1,X1)                                           //    X1      =  OBP_CENTER_X - X1                                                                      
                                                                      //
  // Refresh block                                                    //
  CALL(RefreshBlock,Pointer,X1,1)                                     //    CALL(RefreshBlock,Pointer,X1,1)
                                                                      //
  ADD16(X1,Width,X2)                                                  //    X2      =  X1 + Width
                                                                      //
  // Process blocks to the left of the cursor                         //                                                                       
                                                                      //    
  MOVE16_16(Cursor,Pointer)                                           //    Pointer =  Cursor
                                                                      //    
ProcessLeft:                                                          //    while ((Pointer > Start) && (X1 >= OBP_MIN_X)) 
  JR_LTEQ16(Pointer,Start,ProcessLeftEnd)                             //
  JR_LT16(X1,OBP_MIN_X,ProcessLeftEnd)                                //
                                                                      //    {
  SUB16(Pointer,1,Pointer)                                            //      Pointer--
  MOVE16_32(Pointer,Index)                                            //      Index   =  Pointer                                  
  ARRAY_READ(hBlockStream,Index,Block)                                //      Block   =  hBlockStream[Index]
  CALL(UpdateBlock,Block,GET_WIDTH,Pointer,Width,Height)              //      CALL(UpdateBlock,Block,GET_WIDTH,Pointer,Width,Height)
  SUB16(X1,Width,X1)                                                  //      X1     -=  Width
                                                                      //    
  // Refresh block                                                    //
  CALL(RefreshBlock,Pointer,X1,0)                                     //      CALL(RefreshBlock,Pointer,X1,0)                                                         
                                                                      //    
  JR(ProcessLeft)                                                     //    }
ProcessLeftEnd:                                                       //                                                                          
                                                                      //    
  MOVE16_16(X2,X1)                                                    //    X1      =  X2
                                                                      //
  // Process blocks to the right of the cursor                        //                                                                       
                                                                      //    
  MOVE16_16(Cursor,Pointer)                                           //    Pointer =  Cursor
                                                                      //    
ProcessRight:                                                         //    while ((Pointer < End) && (X1 < OBP_MAX_X)) 
  JR_GTEQ16(Pointer,End,ProcessRightEnd)                              //
  JR_GTEQ16(X1,OBP_MAX_X,ProcessRightEnd)                             //
                                                                      //    {
  ADD16(Pointer,1,Pointer)                                            //      Pointer++
  MOVE16_32(Pointer,Index)                                            //      Index   =  Pointer                                  
  ARRAY_READ(hBlockStream,Index,Block)                                //      Block   =  hBlockStream[Index]
  CALL(UpdateBlock,Block,GET_WIDTH,Pointer,Width,Height)              //      CALL(UpdateBlock,Block,GET_WIDTH,Pointer,Width,Height)
                                                                      //    
  // Refresh block                                                    //
  CALL(RefreshBlock,Pointer,X1,0)                                     //      CALL(RefreshBlock,Pointer,X1,0)                                                         
                                                                      //    
  ADD16(X1,Width,X1)                                                  //      X1     +=  Width
                                                                      //    
  JR(ProcessRight)                                                    //    }
ProcessRightEnd:                                                      //                                                                          
}                                                                     //  }
                                                                      //
                                                                      //
// RefreshBlock ****************************************************************************************
                                                                      //
                                                                      //
subcall   RefreshBlock                                                //  RefreshBlock
{                                                                     //  {
  IN_16   Pointer                                                     //
  IO_16   X1                                                          //
  IO_16   X2                                                          //
                                                                      //
  DATA32  Index                                                       //                                                                                
  DATA16  Block                                                       //
                                                                      //
  MOVE16_32(Pointer,Index)                                            //    Index   =  Pointer
                                                                      //                                                                        
  // Get block type                                                   //                                                                      
  ARRAY_READ(hBlockStream,Index,Block)                                //    Block   =  hBlockStream[Index]
                                                                      //
  // Activate block                                                   //
  CALL(UpdateBlock,Block,REFRESH,Pointer,X1,X2)                       //    CALL(UpdateBlock,Block,REFRESH,Pointer,X1,X2)                                                           
                                                                      //
}                                                                     //  }
                                                                      //
                                                                      //
// BlockLibrary ****************************************************************************************
                                                                      //
define    LIB_MAX_HORZ        3                                       //
define    LIB_MAX_VERT        4                                       //
define    LIB_MAX_VISIBLE     2                                       //
                                                                      //
                                                                      //
subcall   BlockLibrary                                                //  BlockLibrary
{                                                                     //  {
  IO_16   Cursor                                                      //
                                                                      //
  DATA16  Block                                                       //
  DATA32  Index                                                       //
  DATAF   DataF                                                       //
  DATA16  Horz                                                        //    Horisontal pointer  (X)
  DATA16  Vert                                                        //    Vertical pointer    (Y)
  DATA16  X0                                                          //
  DATA16  Y0                                                          //
  DATA16  Tmp                                                         //
  DATA16  Tmp2                                                        //
  DATA16  Tmp3                                                        //
  DATA16  Pointer                                                     //
  DATA16  TmpPointer                                                  //
  DATA16  VertShow                                                    //
  DATA16  VertCount                                                   //
  DATA16  HorzCount                                                   //
  DATA16  Start                                                       //
  DATA8   State                                                       //
  DATA8   Update                                                      //
  DATA8   Run                                                         //
  DATA8   Status                                                      //
                                                                      //
  // Initialise pointers                                              //
  MOVE16_16(2,Horz)                                                   //    Horz            =  2
  MOVE16_16(LIB_MAX_VERT,Vert)                                        //    Vert            =  0
  SUB16(LIB_MAX_VERT,1,Start)                                         //    Start           =  LIB_MAX_VERT - 1
                                                                      //
  // Initialise variables                                             //
  MOVE8_8(1,Run)                                                      //    Run             =  1
  MOVE8_8(1,Update)                                                   //    Update          =  1
                                                                      //
                                                                      //    do
Loop:                                                                 //    {
  JR_FALSE(Update,DoNotRefresh)                                       //      if (Update)
                                                                      //      {
  MOVE8_8(0,Update)                                                   //        Update      =  0
                                                                      //
  // Calculate library block number                                   //
  ADD16(LIB_MAX_HORZ,1,Tmp)                                           //        Tmp         =  LIB_MAX_HORZ + 1
  SUB16(LIB_MAX_VERT,Vert,Tmp2)                                       //        Tmp2        =  LIB_MAX_VERT - Vert
  MUL16(Tmp2,Tmp,Tmp)                                                 //        Tmp        *=  Tmp2
  ADD16(Tmp,Horz,Pointer)                                             //        Pointer     =  Horz + Tmp
                                                                      //
  UI_DRAW(FILLWINDOW,BG_COLOR,TOPLINE_HEIGHT,0)                       //        UI_DRAW(FILLWINDOW,BG_COLOR,TOPLINE_HEIGHT,0)
                                                                      //
  // Show library items                                               //
  MOVE16_16(Start,VertShow)                                           //        VertShow    =  Start
  MOVE16_16(0,VertCount)                                              //        VertCount   =  0
WhileVertCount:                                                       //        while (VertCount < LIB_MAX_VISIBLE)
  JR_GTEQ16(VertCount,LIB_MAX_VISIBLE,EndWhileVertCount)              //
                                                                      //        {
  MOVE16_16(0,HorzCount)                                              //          HorzCount =  0
WhileHorzCount:                                                       //          while (HorzCount < LIB_MAX_HORZ)
  JR_GT16(HorzCount,LIB_MAX_HORZ,EndWhileHorzCount)                   //
                                                                      //          {
  ADD16(LIB_MAX_HORZ,1,Tmp)                                           //            Tmp         =  LIB_MAX_HORZ + 1
  SUB16(LIB_MAX_VERT,VertShow,Tmp2)                                   //            Tmp2        =  LIB_MAX_VERT - VertShow
  MUL16(Tmp2,Tmp,Tmp)                                                 //            Tmp        *=  Tmp2
  ADD16(Tmp,HorzCount,TmpPointer)                                     //            TmpPointer  =  Horz + Tmp
                                                                      //
  MOVE16_32(TmpPointer,Index)                                         //            Index       =  TmpPointer
  ARRAY_READ(hBlockLib,Index,Block)                                   //            ARRAY_READ(hBlockLib,Index,Block)
                                                                      //
  JR_EQ16(Block,EMPTYBLOCK,Empty)                                     //            if (Block != EMPTYBLOCK)
                                                                      //            {
  MUL16(52,VertCount,Y0)                                              //              Y0        =  VertCount * 52
  ADD16(21,Y0,Y0)                                                     //              Y0       +=  21
                                                                      //
  MUL16(42,HorzCount,X0)                                              //              X0        =  HorzCount * 42
  ADD16(3,X0,X0)                                                      //              X0       +=  3
                                                                      //
  CALL(UpdateBlock,Block,DRAW_ICON,Cursor,X0,Y0)                      //              CALL(UpdateBlock,Block,DRAW_ICON,Cursor,X0,Y0)
                                                                      //
  MUL16(52,VertCount,Y0)                                              //              Y0        =  VertCount * 52
  ADD16(20,Y0,Y0)                                                     //              Y0       +=  20
                                                                      //
  MUL16(42,HorzCount,X0)                                              //              X0        =  HorzCount * 40
  ADD16(2,X0,X0)                                                      //              X0       +=  2
                                                                      //
  UI_DRAW(RECT,FG_COLOR,X0,Y0,40,48)                                  //              UI_DRAW(RECT,FG_COLOR,X0,Y0,38,48
Empty:                                                                //            }
                                                                      //
  SUB16(LIB_MAX_VERT,Start,Tmp3)                                      //            Tmp3  =  LIB_MAX_VERT - Start
                                                                      //
  JR_NEQ16(VertCount,0,EndBottom)                                     //            if (VertCount == 0)
                                                                      //            {
                                                                      //
  JR_LTEQ16(Tmp3,1,Bottom)                                            //              if (Tmp3 > 1)
                                                                      //              { // show bottom blocks
                                                                      //
  MUL16(42,HorzCount,X0)                                              //                X0        =  HorzCount * 40
  ADD16(2,X0,X0)                                                      //                X0       +=  2
  UI_DRAW(RECT,FG_COLOR,X0,124,40,5)                                  //                UI_DRAW(RECT,FG_COLOR,X0,Y0,38,48
                                                                      //
Bottom:                                                               //              }
EndBottom:                                                            //            }
                                                                      //
  JR_NEQ16(VertCount,0,EndTop)                                        //            if (VertCount == 0)
                                                                      //            {
  JR_GTEQ16(Tmp3,LIB_MAX_VERT,Top)                                    //              if (Tmp3 < LIB_MAX_VERT)
                                                                      //              { // show top blocks
                                                                      //
  MUL16(42,HorzCount,X0)                                              //                X0        =  HorzCount * 40
  ADD16(2,X0,X0)                                                      //                X0       +=  2
  UI_DRAW(RECT,FG_COLOR,X0,11,40,5)                                   //                UI_DRAW(RECT,FG_COLOR,X0,Y0,38,48
  UI_DRAW(LINE,BG_COLOR,0,11,175,11)                                  //                UI_DRAW(LINE,BG_COLOR,0,11,175,11)
                                                                      //
Top:                                                                  //              }
EndTop:                                                               //            }
                                                                      //
  ADD16(HorzCount,1,HorzCount)                                        //            HorzCount++
  JR(WhileHorzCount)                                                  //          }
EndWhileHorzCount:                                                    //
  ADD16(VertShow,1,VertShow)                                          //          VertShow++
  ADD16(VertCount,1,VertCount)                                        //          VertCount++
  JR(WhileVertCount)                                                  //        }
EndWhileVertCount:                                                    //
                                                                      //
  JR_GT16(Tmp3,1,NotProg)                                             //        if (Tmp3 <= 1)
                                                                      //        { // show lib to prog
                                                                      //
  UI_DRAW(BMPFILE,FG_COLOR,74,122,'LibToProg')                        //          Draw bitmap
                                                                      //
NotProg:                                                              //        }
  // Draw separator line                                              //
  JR_NEQ16(Start,3,Not3)                                              //        if (Start == 3)
                                                                      //        {
  UI_DRAW(DOTLINE,FG_COLOR,2,17,167,17,1,1)                           //          UI_DRAW(DOTLINE,FG_COLOR,2,17,167,17,1,1)
  UI_DRAW(DOTLINE,FG_COLOR,3,18,167,18,1,1)                           //          UI_DRAW(DOTLINE,FG_COLOR,3,18,167,18,1,1)
                                                                      //
Not3:                                                                 //        }
                                                                      //
  JR_NEQ16(Start,2,Not2)                                              //        if (Start == 2)
                                                                      //        {
  UI_DRAW(DOTLINE,FG_COLOR,2,69,167,69,1,1)                           //          UI_DRAW(DOTLINE,FG_COLOR,2,69,167,69,1,1)
  UI_DRAW(DOTLINE,FG_COLOR,3,70,167,70,1,1)                           //          UI_DRAW(DOTLINE,FG_COLOR,3,70,167,70,1,1)
                                                                      //
Not2:                                                                 //        }
                                                                      //
  JR_NEQ16(Start,1,Not1)                                              //        if (Start == 1)
                                                                      //        {
  UI_DRAW(DOTLINE,FG_COLOR,2,121,167,121,1,1)                         //          UI_DRAW(DOTLINE,FG_COLOR,2,121,167,121,1,1)
  UI_DRAW(DOTLINE,FG_COLOR,3,122,167,122,1,1)                         //          UI_DRAW(DOTLINE,FG_COLOR,3,122,167,122,1,1)
                                                                      //
Not1:                                                                 //        }
                                                                      //
  // Draw bar                                                         //
  ADD16(Vert,1,Y0)                                                    //        Y0  =  Vert + 1
  UI_DRAW(VERTBAR,FG_COLOR,170,20,6,100,0,5,Y0)                       //        UI_DRAW(VERTBAR,FG_COLOR,170,20,6,100,0,5,Y0)
                                                                      //
  MOVE16_32(Pointer,Index)                                            //        Index       =  Pointer
  ARRAY_READ(hBlockLib,Index,Block)                                   //        ARRAY_READ(hBlockLib,Index,Block)
                                                                      //
  SUB16(Vert,Start,VertShow)                                          //        VertShow    =  Vert - Start
                                                                      //
  MUL16(52,VertShow,Y0)                                               //        Y0          =  VertShow * 52
  ADD16(14,Y0,Y0)                                                     //        Y0         +=  14
                                                                      //
  MUL16(42,Horz,X0)                                                   //        X0          =  Horz * 40
                                                                      //
  JR_NEQ16(X0,0,NotZero)                                              //        if (X0 == 0)
                                                                      //        {
  UI_DRAW(BMPFILE,FG_COLOR,X0,Y0,'LIBH2')                             //          Draw bitmap
                                                                      //
  JR(EndZero)                                                         //        }
                                                                      //        else
NotZero:                                                              //        {
                                                                      //
  ADD16(-4,X0,X0)                                                     //          X0         +=  -4
  UI_DRAW(BMPFILE,FG_COLOR,X0,Y0,'LIBH1')                             //          Draw bitmap
                                                                      //
EndZero:                                                              //        }
                                                                      //
  MUL16(52,VertShow,Y0)                                               //        Y0          =  VertShow * 52
  ADD16(23,Y0,Y0)                                                     //        Y0         +=  21
                                                                      //
  MUL16(42,Horz,X0)                                                   //        X0          =  Horz * 42
  ADD16(5,X0,X0)                                                      //        X0         +=  3
                                                                      //
  CALL(UpdateBlock,Block,DRAW_ICON,Cursor,X0,Y0)                      //        CALL(UpdateBlock,Block,DRAW_ICON,Cursor,X0,Y0)
                                                                      //
  UI_DRAW(UPDATE)                                                     //        UI_DRAW(UPDATE)
DoNotRefresh:                                                         //      }
  UI_BUTTON(FLUSH)                                                    //      UI_BUTTON(FLUSH)
  UI_BUTTON(WAIT_FOR_PRESS)                                           //      UI_BUTTON(WAIT_FOR_PRESS)
                                                                      //
  UI_BUTTON(GET_VERT,Tmp)                                             //      UI_BUTTON(GET_VERT,Tmp)
                                                                      //
  JR_NEQ16(Vert,LIB_MAX_VERT,NotEnd)                                  //      if ((Vert == LIB_MAX_VERT) &&
  JR_NEQ16(Tmp,1,NotEnd)                                              //      (Tmp == 1))
                                                                      //      {
  MOVE8_8(0,Run)                                                      //        Run  =  0
                                                                      //
NotEnd:                                                               //      }
                                                                      //
  CALL(ControlPointer,0,LIB_MAX_VERT,LIB_MAX_VISIBLE,Tmp,Vert,Start,Update) // CALL(ControlPointer,0,LIB_MAX_VERT,LIB_MAX_VISIBLE,Tmp,Vert,Start,Update)
  UI_BUTTON(GET_HORZ,Tmp)                                             //      UI_BUTTON(GET_HORZ,Tmp)
  CALL(ControlPointer,0,LIB_MAX_HORZ,0,Tmp,Horz,Tmp,Update)           //      CALL(ControlPointer,0,LIB_MAX_HORZ,0,Tmp,Horz,Tmp,Update)
                                                                      //
  UI_BUTTON(SHORTPRESS,ENTER_BUTTON,State)                            //      UI_BUTTON(SHORTPRESS,ENTER_BUTTON,State)
  JR_FALSE(State,NotEnter)                                            //      if (State)
                                                                      //      {
  // Get block type                                                   //                                                                      
  MOVE16_32(Cursor,Index)                                             //        Index   =  Cursor
  ARRAY_READ(hBlockStream,Index,Block)                                //        Block   =  hBlockStream[Index]
                                                                      //
  JR_NEQ16(Block,SEPARATOR,NotSeparator)                              //        if (Block == SEPARATOR)
                                                                      //        {
  // Insert new block in stream                                       //
  MOVE16_32(Pointer,Index)                                            //          Index   =  Pointer
  ARRAY_READ(hBlockLib,Index,Block)                                   //          Block   =  hBlockLib[Index]
                                                                      //
  JR_EQ16(Block,EMPTYBLOCK,EmptyBlock1)                               //          if (Block != EMPTYBLOCK)
                                                                      //          {
  JR_EQ16(Block,TRASHBIN,SkipTrashBin)                                //            if (Block != TRASHBIN)
                                                                      //            {
  MOVE8_8(1,Changed)                                                  //              Changed  =  1
  CALL(InsertBlockInStream,Block,Cursor,Status)                       //              CALL(InsertBlockInStream,Block,Cursor,Status)
  JR_FALSE(Status,Full1)                                              //              if (Status)
                                                                      //              {
  ADD16(Cursor,1,Cursor)                                              //                Cursor++
Full1:                                                                //              }
  CALL(UpdateBlock,Block,INIT,Cursor,0,0)                             //              CALL(UpdateBlock,Block,INIT,Cursor,0,0)
SkipTrashBin:                                                         //            }
  MOVE8_8(0,Run)                                                      //            Run  =  0
EmptyBlock1:                                                          //          }
  JR(EndSeparator)                                                    //
                                                                      //        }
                                                                      //        else
NotSeparator:                                                         //        {
                                                                      //
  MOVE16_32(Pointer,Index)                                            //          Index   =  Pointer
  ARRAY_READ(hBlockLib,Index,Block)                                   //          Block   =  hBlockLib[Index]
                                                                      //
  JR_EQ16(Block,EMPTYBLOCK,EmptyBlock2)                               //          if (Block != EMPTYBLOCK)
                                                                      //          {
  MOVE8_8(1,Changed)                                                  //            Changed  =  1
  CALL(RemoveBlockInStream,Cursor)                                    //            CALL(RemoveBlockInStream,Cursor)
  JR_EQ16(Block,TRASHBIN,EndInsert)                                   //            if (Block != TRASHBIN)
                                                                      //            {
  CALL(InsertBlockInStream,Block,Cursor,Status)                       //              CALL(InsertBlockInStream,Block,Cursor,Status)
  JR_FALSE(Status,Full2)                                              //              if (Status)
                                                                      //              {
  ADD16(Cursor,1,Cursor)                                              //                Cursor++
Full2:                                                                //              }
  CALL(UpdateBlock,Block,INIT,Cursor,0,0)                             //              CALL(UpdateBlock,Block,INIT,Cursor,0,0)
EndInsert:                                                            //            }
  MOVE8_8(0,Run)                                                      //            Run  =  0
EmptyBlock2:                                                          //          }
EndSeparator:                                                         //        }
NotEnter:                                                             //      }
  UI_BUTTON(SHORTPRESS,BACK_BUTTON,State)                             //      UI_BUTTON(SHORTPRESS,BACK_BUTTON,State)
  JR_FALSE(State,NotBack)                                             //      if (State)
                                                                      //      {
  MOVE8_8(0,Run)                                                      //        Run  =  0
NotBack:                                                              //      }
                                                                      //    }
  JR_TRUE(Run,Loop)                                                   //    while (Run)
  UI_BUTTON(FLUSH)                                                    //    UI_BUTTON(FLUSH)
}                                                                     //  }
                                                                      //
                                                                      //
// ActivateBlock ***************************************************************************************
                                                                      //
                                                                      //
subcall   ActivateBlock                                               //  ActivateBlock
{                                                                     //  {
  IO_16   Cursor                                                      //
                                                                      //
  DATA32  Index                                                       //                                                                                
  DATA16  Block                                                       //
  DATA16  Width                                                       //
  DATA16  Height                                                      //
  DATA16  X1                                                          //
  DATA16  X2                                                          //
                                                                      //
  // Get block type                                                   //                                                                      
  MOVE16_32(Cursor,Index)                                             //    Index  =  Cursor
  ARRAY_READ(hBlockStream,Index,Block)                                //    Block   =  hBlockStream[Index]
  CALL(UpdateBlock,Block,GET_WIDTH,Cursor,Width,Height)               //    CALL(UpdateBlock,Block,GET_WIDTH,Cursor,Width,Height)
  DIV16(Width,2,X1)                                                   //    X1      =  Width / 2                                                                      
  SUB16(OBP_CENTER_X,X1,X1)                                           //    X1      =  OBP_CENTER_X - X1                                                                      
                                                                      //
  // Activate block                                                   //
  MOVE16_16(0,X2)                                                     //    X2      =  0
  CALL(UpdateBlock,Block,ACTIVATE,Cursor,X1,X2)                       //    CALL(UpdateBlock,Block,ACTIVATE,Cursor,X1,X2)
  JR_NEQ16(Block,SEPARATOR,NotSeparator)                              //    if (Block != SEPARATOR)
                                                                      //    {
  JR_EQ16(X2,0,NotInsert)                                             //      if (X2)
                                                                      //      {
  MOVE16_32(Cursor,Index)                                             //        Index  =  Cursor
  ARRAY_READ(hBlockStream,Index,Block)                                //        Block   =  hBlockStream[Index]
  CALL(UpdateBlock,Block,INIT,Cursor,X1,X2)                           //        CALL(UpdateBlock,Block,INIT,Cursor,X1,X2)
                                                                      //
NotInsert:                                                            //      }
NotSeparator:                                                         //    }
}                                                                     //  }
                                                                      //
                                                                      //
// UpdateBlock *****************************************************************************************
                                                                      //
                                                                      //
subcall   UpdateBlock                                                 //  UpdateBlock
{                                                                     //  {
  IN_16   Block                                                       //
  IN_16   Function                                                    //
  IO_16   Pointer                                                     //
  IO_16   X1                                                          //
  IO_16   X2                                                          //
                                                                      //
  JR_NEQ16(Block,TRASHBIN,NotTrashBin)                                //    if (Block == TRASHBIN)
                                                                      //    {
  CALL(TrashBin,Function,Pointer,X1,X2)                               //      CALL(TrashBin,Function,Pointer,X1,X2)
NotTrashBin:                                                          //    }
                                                                      //
  JR_NEQ16(Block,FILEBLOCK,NotFileBlock)                              //    if (Block == FILEBLOCK)
                                                                      //    {
  CALL(FileBlock,Function,Pointer,X1,X2)                              //      CALL(FileBlock,Function,Pointer,X1,X2)                                                                      
NotFileBlock:                                                         //    }                                                                                                                                              
                                                                      //
  JR_NEQ16(Block,STARTBLOCK,NotStartBlock)                            //    if (Block == STARTBLOCK)
                                                                      //    {
  CALL(StartBlock,Function,Pointer,X1,X2)                             //      CALL(StartBlock,Function,Pointer,X1,X2)                                                                      
NotStartBlock:                                                        //    }                                                                                                                                              
                                                                      //
  JR_NEQ16(Block,SEPARATOR,NotSeparator)                              //    if (Block == SEPARATOR)
                                                                      //    {
  CALL(Separator,Function,Pointer,X1,X2)                              //      CALL(Separator,Function,Pointer,X1,X2)
NotSeparator:                                                         //    }                                                                                                                                              
                                                                      //
  JR_NEQ16(Block,LOOPBLOCK,NotLoopBlock)                              //    if (Block == LOOPBLOCK)
                                                                      //    {
  CALL(LoopBlock,Function,Pointer,X1,X2)                              //      CALL(LoopBlock,Function,Pointer,X1,X2)                                                                      
NotLoopBlock:                                                         //    }                                                                                                                                              
                                                                      //
  JR_NEQ16(Block,DOUBLEMOTORBLOCK,NotDoubleMotorBlock)                //    if (Block == DOUBLEMOTORBLOCK)
                                                                      //    {
  CALL(DoubleMotorBlock,Function,Pointer,X1,X2)                       //      CALL(DoubleMotorBlock,Function,Pointer,X1,X2)
NotDoubleMotorBlock:                                                  //    }
                                                                      //
  JR_NEQ16(Block,SINGLEMOTORBLOCK,NotSingleMotorBlock)                //    if (Block == SINGLEMOTORBLOCK)
                                                                      //    {
  CALL(SingleMotorBlock,Function,Pointer,X1,X2)                       //      CALL(SingleMotorBlock,Function,Pointer,X1,X2)
NotSingleMotorBlock:                                                  //    }
                                                                      //
  JR_NEQ16(Block,MEDIUMMOTORBLOCK,NotMediumMotorBlock)                //    if (Block == MEDIUMMOTORBLOCK)
                                                                      //    {
  CALL(MediumMotorBlock,Function,Pointer,X1,X2)                       //      CALL(MediumMotorBlock,Function,Pointer,X1,X2)
NotMediumMotorBlock:                                                  //    }
                                                                      //
  JR_NEQ16(Block,LEDBLOCK,NotLedBlock)                                //    if (Block == LEDBLOCK)
                                                                      //    {
  CALL(LedBlock,Function,Pointer,X1,X2)                               //      CALL(LedBlock,Function,Pointer,X1,X2)
NotLedBlock:                                                          //    }
                                                                      //
  JR_NEQ16(Block,SOUNDBLOCK,NotSoundBlock)                            //    if (Block == SOUNDBLOCK)
                                                                      //    {
  CALL(SoundBlock,Function,Pointer,X1,X2)                             //      CALL(SoundBlock,Function,Pointer,X1,X2)
NotSoundBlock:                                                        //    }
                                                                      //
  JR_NEQ16(Block,DISPLAYBLOCK,NotDisplayBlock)                        //    if (Block == DISPLAYBLOCK)
                                                                      //    {
  CALL(DisplayBlock,Function,Pointer,X1,X2)                           //      CALL(DisplayBlock,Function,Pointer,X1,X2)
NotDisplayBlock:                                                      //    }
                                                                      //
  JR_NEQ16(Block,TOUCHBLOCK,NotTouchBlock)                            //    if (Block == TOUCHBLOCK)
                                                                      //    {
  CALL(TouchBlock,Function,Pointer,X1,X2)                             //      CALL(TouchBlock,Function,Pointer,X1,X2)
NotTouchBlock:                                                        //    }
                                                                      //
  JR_NEQ16(Block,REFLECTEDBLOCK,NotReflectedBlock)                    //    if (Block == REFLECTEDBLOCK)
                                                                      //    {
  CALL(ReflectedBlock,Function,Pointer,X1,X2)                         //      CALL(ColorBlock,Function,Pointer,X1,X2)
NotReflectedBlock:                                                    //    }
                                                                      //
  JR_NEQ16(Block,COLORBLOCK,NotColorBlock)                            //    if (Block == COLORBLOCK)
                                                                      //    {
  CALL(ColorBlock,Function,Pointer,X1,X2)                             //      CALL(ColorBlock,Function,Pointer,X1,X2)
NotColorBlock:                                                        //    }
                                                                      //
  JR_NEQ16(Block,TEMPERATUREBLOCK,NotTemperatureBlock)                //    if (Block == TEMPERATUREBLOCK)
                                                                      //    {
  CALL(TemperatureBlock,Function,Pointer,X1,X2)                       //      CALL(TemperatureBlock,Function,Pointer,X1,X2)
NotTemperatureBlock:                                                  //    }
                                                                      //
  JR_NEQ16(Block,ULTRASONICBLOCK,NotUltrasonicBlock)                  //    if (Block == ULTRASONICBLOCK)
                                                                      //    {
  CALL(UltrasonicBlock,Function,Pointer,X1,X2)                        //      CALL(UltrasonicBlock,Function,Pointer,X1,X2)
NotUltrasonicBlock:                                                   //    }
                                                                      //
  JR_NEQ16(Block,PROXIMITYBLOCK,NotProximityBlock)                    //    if (Block == PROXIMITYBLOCK)
                                                                      //    {
  CALL(ProximityBlock,Function,Pointer,X1,X2)                         //      CALL(ProximityBlock,Function,Pointer,X1,X2)
NotProximityBlock:                                                    //    }
                                                                      //
  JR_NEQ16(Block,BEACONBLOCK,NotBeaconBlock)                          //    if (Block == BEACONBLOCK)
                                                                      //    {
  CALL(BeaconBlock,Function,Pointer,X1,X2)                            //      CALL(BeaconBlock,Function,Pointer,X1,X2)
NotBeaconBlock:                                                       //    }
                                                                      //
  JR_NEQ16(Block,ANGLEBLOCK,NotAngleBlock)                            //    if (Block == ANGLEBLOCK)
                                                                      //    {
  CALL(AngleBlock,Function,Pointer,X1,X2)                             //      CALL(AngleBlock,Function,Pointer,X1,X2)
NotAngleBlock:                                                        //    }
                                                                      //
  JR_NEQ16(Block,ENCODERBLOCK,NotEncoderBlock)                        //    if (Block == ENCODERBLOCK)
                                                                      //    {
  CALL(EncoderBlock,Function,Pointer,X1,X2)                           //      CALL(EncoderBlock,Function,Pointer,X1,X2)
NotEncoderBlock:                                                      //    }
                                                                      //
  JR_NEQ16(Block,BUTTONBLOCK,NotButtonBlock)                          //    if (Block == BUTTONBLOCK)
                                                                      //    {
  CALL(ButtonBlock,Function,Pointer,X1,X2)                            //      CALL(ButtonBlock,Function,Pointer,X1,X2)
NotButtonBlock:                                                       //    }
                                                                      //
  JR_NEQ16(Block,DELAYBLOCK,NotDelayBlock)                            //    if (Block == DELAYBLOCK)
                                                                      //    {
  CALL(DelayBlock,Function,Pointer,X1,X2)                             //      CALL(DelayBlock,Function,Pointer,X1,X2)
NotDelayBlock:                                                        //    }
                                                                      //
}                                                                     //  }
                                                                      //
                                                                      //
// SaveFilename ****************************************************************************************
                                                                      //
define    FILEBLOCK_WIDTH           62                                //
define    FILEBLOCK_PAR1_MIN        1                                 //
define    FILEBLOCK_PAR1_DEFAULT    2                                 //
define    FILEBLOCK_PAR1_MAX        2                                 //
                                                                      //
subcall   SaveFilename                                                //  SaveFilename
{                                                                     //  {
  DATAF   Tmp                                                         //
  DATA32  Size                                                        //
  DATA16  hFile                                                       //
  DATA16  FileNo                                                      //
  DATA8   State                                                       //
  DATAS   String FILENAMESIZE                                         //
  DATAS   Name FILENAMESIZE                                           //
  DATAS   Filename FILENAMESIZE                                       //
                                                                      //
  // Find file name suggestion                                        //
  MOVE16_16(0,FileNo)                                                 //    FileNo  =  0
  FILE(OPEN_READ,FILEBLOCK_FILENO,hFile,Size)                         //    FILE(OPEN_READ,FILEBLOCK_FILENO,hFile,Size)
  JR_EQ32(Size,0,NotFound)                                            //    if (Size != 0)
                                                                      //    {
  FILE(READ_VALUE,hFile,DEL_TAB,Tmp)                                  //      FILE(READ_VALUE,hFile,DEL_TAB,Tmp)
  FILE(CLOSE,hFile)                                                   //      FILE(CLOSE,hFile)
  MOVEF_16(Tmp,FileNo)                                                //      FileNo  =  Tmp
NotFound:                                                             //    }
  ADD16(FileNo,1,FileNo)                                              //    FileNo++
  STRINGS(NUMBER_TO_STRING,FileNo,3,String)                           //    STRINGS(NUMBER_TO_STRING,FileNo,3,String)
                                                                      //
  STRINGS(ADD,BPRG_FILE,String,Name)                                  //    STRINGS(ADD,BPRG_FILE,String,Name)
                                                                      //
  // Save name for compare                                            //
  STRINGS(DUPLICATE,Name,String)                                      //    STRINGS(DUPLICATE,Name,String)
                                                                      //
  // Get file name from user                                          //
  MOVE8_8(CHARSET_NAME,State)                                         //    State  =  CHARSET_NAME
  UI_DRAW(KEYBOARD,FG_COLOR,16,26,ICON_DISC,NAMESIZE,'',State,Name)   //    UI_DRAW(KEYBOARD,FG_COLOR,16,26,ICON_DISC,NAMESIZE,'',State,Name)
  UI_BUTTON(FLUSH)                                                    //    UI_BUTTON(FLUSH)
                                                                      //
  JR_FALSE(Name,NoName)                                               //    if (Name[0])
                                                                      //    {
  STRINGS(COMPARE,Name,String,State)                                  //      STRINGS(COMPARE,Name,String,State)
  JR_FALSE(State,NotSuggested)                                        //      if (State)
                                                                      //      {
  MOVE16_F(FileNo,Tmp)                                                //        Tmp  =  FileNo
  FILE(OPEN_WRITE,FILEBLOCK_FILENO,hFile)                             //        FILE(OPEN_WRITE,FILEBLOCK_FILENO,hFile)
  FILE(WRITE_VALUE,hFile,DEL_TAB,Tmp,3,0)                             //        FILE(WRITE_VALUE,hFile,DEL_TAB,Tmp,3,0)
  FILE(CLOSE,hFile)                                                   //        FILE(CLOSE,hFile)
                                                                      //
NotSuggested:                                                         //      }
                                                                      //
  // Save file                                                        //
  STRINGS(ADD,PROGRAM_FOLDER,'/',String)                              //      STRINGS(ADD,PROGRAM_FOLDER,'/',String)
  STRINGS(ADD,String,Name,Filename)                                   //      STRINGS(ADD,String,Name,Filename)
  STRINGS(ADD,Filename,EXT_PROGRAM,Name)                              //      STRINGS(ADD,Filename,EXT_PROGRAM,Name)
  CALL(SaveFile,Name)                                                 //      CALL(SaveFile,Name)
  MOVE8_8(0,Changed)                                                  //      Changed  =  0
                                                                      //
NoName:                                                               //    }
}                                                                     //  }
                                                                      //
                                                                      //
// FileBlock *******************************************************************************************
                                                                      //
define    FILEBLOCK_WIDTH           62                                //
define    FILEBLOCK_PAR1_MIN        1                                 //  Save
define    FILEBLOCK_PAR1_DEFAULT    2                                 //
define    FILEBLOCK_PAR1_MAX        2                                 //  Load
                                                                      //
subcall   FileBlock                                                   //  FileBlock
{                                                                     //  {
  IN_16   Function                                                    //    Function
  IO_16   Pointer                                                     //    Pointer (Cursor)
  IO_16   X1                                                          //    X coord
  IO_16   X2                                                          //    Y variable
                                                                      //
  DATA32  Index                                                       //    Array index
  DATA32  Size                                                        //
  DATA16  hFile                                                       //
  DATA16  Par1                                                        //    Local parameter 1
  DATA16  Par2                                                        //    Local parameter 2
  DATA16  X3                                                          //
  DATA16  Y3                                                          //
  DATA16  Tmp16                                                       //
  DATA8   Status                                                      //
  DATA8   Stat                                                        //
  DATA8   Stay                                                        //
  DATA8   State                                                       //
  DATA8   Flag                                                        //
  DATA8   Type                                                        //
  DATA8   Volume                                                      //
  DATAS   String FILENAMESIZE                                         //
  DATAS   Name FILENAMESIZE                                           //
                                                                      //
  MOVE16_32(Pointer,Index)                                            //
  ARRAY_READ(hBlockPar1,Index,Par1)                                   //
  ARRAY_READ(hBlockPar2,Index,Par2)                                   //
                                                                      //
  JR_NEQ16(Function,INIT,NotInit)                                     //    if (Function == INIT)
                                                                      //    {
  MOVE16_16(FILEBLOCK_PAR1_DEFAULT,Par1)                              //      Par1      =  FILEBLOCK_PAR1_DEFAULT
  MOVE16_16(0,Par2)                                                   //      Par2      =  0
  ARRAY_WRITE(hBlockPar1,Index,Par1)                                  //
  ARRAY_WRITE(hBlockPar2,Index,Par2)                                  //
NotInit:                                                              //    }
                                                                      //
  JR_NEQ16(Function,GET_WIDTH,NotGetWidth)                            //    if (Function == GET_WIDTH)
                                                                      //    {
  MOVE16_16(FILEBLOCK_WIDTH,X1)                                       //      X1        =  FILEBLOCK_WIDTH
                                                                      //
NotGetWidth:                                                          //    }
                                                                      //
  JR_NEQ16(Function,ACTIVATE,NotActivate)                             //    if (Function == ACTIVATE)
                                                                      //    {
  MOVE16_16(FILEBLOCK_PAR1_DEFAULT,Par1)                              //      Par1      =  FILEBLOCK_PAR1_DEFAULT
  MOVE8_8(1,Stay)                                                     //      Stay      =  1
  MOVE16_16(REFRESH,Function)                                         //      Function  =  REFRESH
NotActivate:                                                          //    }
                                                                      //
  JR_NEQ16(Function,REFRESH,NotRefresh)                               //    if (Function == REFRESH)
                                                                      //    {
                                                                      //      do
Refresh:                                                              //      {
  JR_FALSE(Stay,NotStay)                                              //        if (Stay)
                                                                      //        {
  JR_NEQ16(Par1,FILEBLOCK_PAR1_MIN,NotMax)                            //          if (Par1  == FILEBLOCK_PAR1_MIN)
                                                                      //          {
  ADD16(X1,20,X3)                                                     //            X3  =  X1 + 20
                                                                      //
  UI_DRAW(BMPFILE,FG_COLOR,X3,76,'PrgSaveH')                          //            Draw bitmap
  UI_DRAW(BMPFILE,FG_COLOR,X3,49,'PrgOpen')                           //            Draw bitmap
                                                                      //
  JR(EndMax)                                                          //          }
                                                                      //          else
NotMax:                                                               //          {
  ADD16(X1,20,X3)                                                     //            X3  =  X1 + 20
                                                                      //
  UI_DRAW(BMPFILE,FG_COLOR,X3,76,'PrgSave')                           //            Draw bitmap
  UI_DRAW(BMPFILE,FG_COLOR,X3,49,'PrgOpenH')                          //            Draw bitmap
                                                                      //
EndMax:                                                               //          }
                                                                      //
  JR(EndStay)                                                         //        }
                                                                      //        else
NotStay:                                                              //        {
  ADD16(X1,20,X3)                                                     //          X3  =  X1 + 20
                                                                      //
  UI_DRAW(BMPFILE,FG_COLOR,X3,76,'PrgSave')                           //          Draw bitmap
  UI_DRAW(BMPFILE,FG_COLOR,X3,49,'PrgOpen')                           //          Draw bitmap
EndStay:                                                              //        }
                                                                      //
  ADD16(X1,51,X3)                                                     //        X3  =  X1 + 51
  UI_DRAW(DOTLINE,FG_COLOR,X3,37,X3,109,1,1)                          //        UI_DRAW(DOTLINE,FG_COLOR,X3,37,X3,109,1,1)
                                                                      //
  JR_FALSE(Stay,DoNotWait)                                            //        if (Stay)
                                                                      //        {
  UI_DRAW(UPDATE)                                                     //          UI_DRAW(UPDATE)
  UI_BUTTON(FLUSH)                                                    //          UI_BUTTON(FLUSH)
  UI_BUTTON(WAIT_FOR_PRESS)                                           //          UI_BUTTON(WAIT_FOR_PRESS)
                                                                      //
  UI_BUTTON(GET_VERT,Tmp16)                                           //          UI_BUTTON(GET_VERT,Tmp16)
  JR_EQ16(Tmp16,0,NotVert)                                            //          if (Tmp16)
                                                                      //          {
  SUB16(0,Tmp16,Tmp16)                                                //            Tmp16   =  0 - Tmp16
  ADD16(Par1,Tmp16,Par1)                                              //            Par1 +=  Tmp16
  JR_LTEQ16(Par1,FILEBLOCK_PAR1_MAX,NotTooHigh)                       //            if (Par1 > FILEBLOCK_PAR1_MAX)
                                                                      //            {
  MOVE16_16(FILEBLOCK_PAR1_MAX,Par1)                                  //              Par1  =  FILEBLOCK_PAR1_MAX
NotTooHigh:                                                           //            }
  JR_GTEQ16(Par1,FILEBLOCK_PAR1_MIN,NotTooLow)                        //            if (Par1 < FILEBLOCK_PAR1_MIN)
                                                                      //            {
  MOVE16_16(FILEBLOCK_PAR1_MIN,Par1)                                  //              Par1  =  FILEBLOCK_PAR1_MIN
NotTooLow:                                                            //            }
NotVert:                                                              //          }
                                                                      //
  UI_BUTTON(SHORTPRESS,ENTER_BUTTON,State)                            //          UI_BUTTON(SHORTPRESS,ENTER_BUTTON,State)
  JR_FALSE(State,NotEnter)                                            //          if (State)
                                                                      //          {
  JR_NEQ16(Par1,FILEBLOCK_PAR1_MIN,NotSave)                           //            if (Par1  == FILEBLOCK_PAR1_MIN)
                                                                      //            {
  CALL(SaveFilename)                                                  //              CALL(SaveFilename)
                                                                      //
  JR(EndSave)                                                         //            }
                                                                      //            else
NotSave:                                                              //            {
                                                                      //
  MOVE8_8(1,Status)                                                   //              Status  =  1
  JR_FALSE(Changed,NoChanges)                                         //              if (Changed)
                                                                      //              {
  INFO(GET_VOLUME,Volume)                                             //                INFO(GET_VOLUME,Volume)
  SOUND(PLAY,Volume,'GeneralAlarm')                                   //                SOUND(PLAY,Volume,'GeneralAlarm')
                                                                      //
  MOVE8_8(0,Stat)                                                     //                Stat    =  0
  UI_DRAW(QUESTION,FG_COLOR,16,50,WARNSIGN,TO_FILE,'',Stat,Status)    //                UI_DRAW(QUESTION,FG_COLOR,16,50,WARNSIGN,TO_FILE,'',Stat,Status)
  JR_NEQ8(Status,1,DontSave)                                          //                if (Status == 1)
                                                                      //                {
  CALL(SaveFilename)                                                  //                  CALL(SaveFilename)
DontSave:                                                             //                }         
NoChanges:                                                            //              }                                                                      
                                                                      //
  JR_EQ8(Status,-1,EndSave)                                           //              if (Status != -1)
                                                                      //              {                           
  UI_BUTTON(FLUSH)                                                    //                UI_BUTTON(FLUSH)
  UI_DRAW(BMPFILE,FG_COLOR,17,11,'144x116_POP6')                      //                Draw bitmap
  UI_DRAW(ICON,FG_COLOR,32,16,NORMAL_ICON,ICON_OPENFOLDER)            //                UI_DRAW(ICON,FG_COLOR,24,16,NORMAL_ICON,ICON_OPENFOLDER)
  UI_DRAW(SELECT_FONT,1)                                              //                UI_DRAW(SELECT_FONT,1)
  UI_DRAW(TEXT,FG_COLOR,56,18,'Open')                                 //                UI_DRAW(TEXT,FG_COLOR,56,18,'Open')
  UI_DRAW(SELECT_FONT,0)                                              //                UI_DRAW(SELECT_FONT,0)
  UI_DRAW(LINE,FG_COLOR,22,29,155,29)                                 //                UI_DRAW(LINE,FG_COLOR,22,29,155,29)
  UI_DRAW(UPDATE)                                                     //                UI_DRAW(UPDATE)
                                                                      //
  MOVE8_8(TYPE_RESTART_BROWSER,Type)                                  //                Type = TYPE_RESTART_BROWSER
  STRINGS(DUPLICATE,PROGRAM_FOLDER,String)                            //                STRINGS(DUPLICATE,PROGRAM_FOLDER,String)
  UI_DRAW(BROWSE,BROWSE_FILES,24,33,130,88,FILENAMESIZE,Type,String)  //                UI_DRAW(BROWSE,BROWSE_FILES,24,33,130,88,FILENAMESIZE,Type,String)
  UI_BUTTON(FLUSH)                                                    //                UI_BUTTON(FLUSH)
                                                                      //
                                                                      //
  CP_EQ8(Type,TYPE_PROGRAM,Flag)                                      //                if (Type == TYPE_PROGRAM)
  JR_FALSE(Flag,NotProgram)                                           //                {
                                                                      //
  STRINGS(ADD,String,EXT_PROGRAM,Name)                                //                  STRINGS(ADD,String,EXT_PROGRAM,Name)
  // Load file                                                        //
  CALL(LoadFile,Name)                                                 //                  CALL(LoadFile,Name)
  MOVE8_8(0,Changed)                                                  //                  Changed  =  0
                                                                      //
NotProgram:                                                           //                }
                                                                      //              }
EndSave:                                                              //            }
  ADD16(Pointer,1,Pointer)                                            //            Pointer++
  ARRAY_WRITE(hBlockPar1,Index,Par1)                                  //
  ARRAY_WRITE(hBlockPar2,Index,Par2)                                  //
  MOVE8_8(0,Stay)                                                     //            Stay    =  0
  MOVE16_16(0,X2)                                                     //            X2      =  0
                                                                      //
NotEnter:                                                             //          }
  UI_BUTTON(SHORTPRESS,RIGHT_BUTTON,State)                            //          UI_BUTTON(SHORTPRESS,RIGHT_BUTTON,State)
  JR_FALSE(State,NotRight)                                            //          if (State)
                                                                      //          {
  ADD16(Pointer,1,Pointer)                                            //            Pointer++
  ARRAY_WRITE(hBlockPar1,Index,Par1)                                  //
  ARRAY_WRITE(hBlockPar2,Index,Par2)                                  //
  MOVE8_8(0,Stay)                                                     //            Stay    =  0
  MOVE16_16(0,X2)                                                     //            X2      =  0
                                                                      //
NotRight:                                                             //          }
  UI_BUTTON(SHORTPRESS,BACK_BUTTON,State)                             //          UI_BUTTON(SHORTPRESS,BACK_BUTTON,State)
  JR_FALSE(State,NotBack)                                             //          if (State)
                                                                      //          {
  ADD16(Pointer,1,Pointer)                                            //            Pointer++
  MOVE8_8(0,Stay)                                                     //            Stay    =  0
  MOVE16_16(0,X2)                                                     //            X2      =  0
                                                                      //
NotBack:                                                              //          }
DoNotWait:                                                            //        }
                                                                      //      }
  JR_TRUE(Stay,Refresh)                                               //      while(Stay)
NotRefresh:                                                           //    }
}                                                                     //  }
                                                                      //
                                                                      //
// TrashBin ********************************************************************************************
                                                                      //
define    STARTBLOCK_WIDTH      24                                    //
                                                                      //
subcall   TrashBin                                                    //  TrashBin
{                                                                     //  {
  IN_16   Function                                                    //    Function
  IO_16   Pointer                                                     //    Pointer (Cursor)
  IO_16   X1                                                          //    X coord
  IO_16   X2                                                          //    Y variable
                                                                      //
  JR_NEQ16(Function,DRAW_ICON,NotDrawIcon)                            //    if (Function == DRAW_ICON)
                                                                      //    {
  UI_DRAW(BMPFILE,FG_COLOR,X1,X2,'block_bin')                         //      Draw bitmap
                                                                      //
NotDrawIcon:                                                          //    }
                                                                      //
}                                                                     //  }
                                                                      //
                                                                      //
// GetData32 *******************************************************************************************
                                                                      //
                                                                      //
subcall   GetData32                                                   //  GetData32
{                                                                     //  {
  IN_32   Index                                                       //
  OUT_32  Result                                                      //
  IN_16   hProgram                                                    //
                                                                      //
  DATA8   Data8                                                       //
  DATA8   Align                                                       //
  DATA32  Data32                                                      //
                                                                      //
  ARRAY_READ(hProgram,Index,Data8)                                    //    Data8   =  hProgram[Index]
  MOVE8_32(Data8,Result)                                              //    Result  =  Data8
  ADD32(Index,1,Index)                                                //    Index++
  ARRAY_READ(hProgram,Index,Data8)                                    //    Data8   =  hProgram[Index]
  MOVE8_32(Data8,Data32)                                              //    Data32  =  Data8
  MUL32(Data32,0x100,Data32)                                          //    Data32 *=  0x100
  ADD32(Result,Data32,Result)                                         //    Result +=  Data32
                                                                      //
  ADD32(Index,1,Index)                                                //    Index++
  ARRAY_READ(hProgram,Index,Data8)                                    //    Data8   =  hProgram[Index]
  MOVE8_32(Data8,Data32)                                              //    Data32  =  Data8
  MUL32(Data32,0x10000,Data32)                                        //    Data32 *=  0x10000
  ADD32(Result,Data32,Result)                                         //    Result +=  Data32
  ADD32(Index,1,Index)                                                //    Index++
  ARRAY_READ(hProgram,Index,Data8)                                    //    Data8   =  hProgram[Index]
  MOVE8_32(Data8,Data32)                                              //    Data32  =  Data8
  MUL32(Data32,0x1000000,Data32)                                      //    Data32 *=  0x1000000
  ADD32(Result,Data32,Result)                                         //    Result +=  Data32
}                                                                     //  }
                                                                      //
                                                                      //
// GetData16 *******************************************************************************************
                                                                      //
                                                                      //
subcall   GetData16                                                   //  GetData16
{                                                                     //  {
  IN_32   Index                                                       //
  OUT_16  Result                                                      //
  IN_16   hProgram                                                    //
                                                                      //
  DATA16  Data16                                                      //
  DATA8   Data8                                                       //
                                                                      //
  ARRAY_READ(hProgram,Index,Data8)                                    //    Data8   =  hProgram[Index]
  MOVE8_16(Data8,Result)                                              //    Result  =  Data8
  ADD32(Index,1,Index)                                                //    Index++
  ARRAY_READ(hProgram,Index,Data8)                                    //    Data8   =  hProgram[Index]
  MOVE8_16(Data8,Data16)                                              //    Data16  =  Data8
  MUL16(Data16,0x100,Data16)                                          //    Data16 *=  0x100
  ADD16(Result,Data16,Result)                                         //    Result +=  Data16
}                                                                     //  }
                                                                      //
                                                                      //
// PutData16 *******************************************************************************************
                                                                      //
                                                                      //
subcall   PutData16                                                   //  PutData16
{                                                                     //  {
  IN_32   Index                                                       //
  IN_16   Data                                                        //
  IN_16   hProgram                                                    //
                                                                      //
  DATA16  Data16                                                      //
  DATA8   Data8                                                       //
                                                                      //
  AND16(Data,0xFF,Data16)                                             //
  MOVE16_8(Data16,Data8)                                              //
  ARRAY_WRITE(hProgram,Index,Data8)                                   //    hProgram[Index]  =  Data8
  ADD32(Index,1,Index)                                                //    Index++
  DIV16(Data,0x100,Data16)                                            //
  MOVE16_8(Data16,Data8)                                              //
  ARRAY_WRITE(hProgram,Index,Data8)                                   //    hProgram[Index]  =  Data8
}                                                                     //  }
                                                                      //
                                                                      //
// GetData8 ********************************************************************************************
                                                                      //
                                                                      //
subcall   GetData8                                                    //  GetData8
{                                                                     //  {
  IN_32   Index                                                       //
  OUT_16  Result                                                      //
  IN_16   hProgram                                                    //
                                                                      //
  DATA8   Data8                                                       //
                                                                      //
  ARRAY_READ(hProgram,Index,Data8)                                    //    Data8   =  hProgram[Index]
  MOVE8_16(Data8,Result)                                              //    Result  =  Data8
}                                                                     //  }
                                                                      //
                                                                      //
// PutData8 ********************************************************************************************
                                                                      //
                                                                      //
subcall   PutData8                                                    //  PutData8
{                                                                     //  {
  IN_32   Index                                                       //
  IN_16   Data                                                        //
  IN_16   hProgram                                                    //
                                                                      //
  DATA8   Data8                                                       //
                                                                      //
  MOVE16_8(Data,Data8)                                                //
  ARRAY_WRITE(hProgram,Index,Data8)                                   //    hProgram[Index]  =  Data8
}                                                                     //  }
                                                                      //
                                                                      //
// LoadFile ********************************************************************************************
                                                                      //
                                                                      //
subcall   LoadFile                                                    //  void LoadFile(Name)
{                                                                     //  {
  IN_S    Name FILENAMESIZE                                           //
                                                                      //
  DATA32  Size                                                        //
  DATA32  Index                                                       //    Array index
  DATA16  hFile                                                       //
  DATA16  hProgram                                                    //
  DATA32  StartOfCalls                                                //    Offset to start of calls
  DATA16  NoOfObjects                                                 //    Number of objects
  DATA16  Start                                                       //
  DATA16  Point                                                       //
  DATA16  Pc                                                          //
  DATA16  Block                                                       //
  DATA16  Par                                                         //
                                                                      //
  // Read file for OBP                                                //
  FILE(OPEN_READ,Name,hFile,Size)                                     //      FILE(OPEN_READ,Name,hFile,Size)
  ARRAY(CREATE8,Size,hProgram)                                        //      ARRAY(CREATE8,Size,hProgram)
  FILE(READ_BYTES,hFile,Size,@hProgram)                               //      FILE(READ_BYTES,hFile,Size,@hProgram)
  FILE(CLOSE,hFile)                                                   //      FILE(CLOSE,hFile)
                                                                      //
  // Get header info                                                  //
  CALL(GetData16,10,NoOfObjects,hProgram)                             //      CALL(GetData16,10,NoOfObjects,hProgram)
  CALL(GetData32,16,StartOfCalls,hProgram)                            //
  // Find start block in BlockStream                                  //
  CALL(FindBlockType,STARTBLOCK,Start)                                //      CALL(FindBlockType,STARTBLOCK,Start)
                                                                      //
  MOVE16_16(Start,Point)                                              //      Point  =  Start
                                                                      //
  MOVE16_16(StartOfCalls,Pc)                                          //      Pc  =  StartOfCalls
                                                                      //
                                                                      //      do
Insert:                                                               //      {
  ADD16(Pc,1,Pc)                                                      //        Pc++
  MOVE16_32(Pc,Index)                                                 //        Index  =  Pc
  CALL(GetData8,Index,Block,hProgram)                                 //        CALL(GetData8,Index,Block,hProgram)
  MOVE16_32(Point,Index)                                              //        Index  =  Point
  ARRAY_WRITE(hBlockStream,Index,Block)                               //        hBlockStream[Index]   =  Block
                                                                      //
  // Insert par 1 in program                                          //
  ADD16(Pc,3,Pc)                                                      //        Pc    +=  3
  MOVE16_32(Pc,Index)                                                 //        Index  =  Pc
  CALL(GetData16,Index,Par,hProgram)                                  //        CALL(GetData16,Index,Par,hProgram)
  MOVE16_32(Point,Index)                                              //        Index  =  Point
  ARRAY_WRITE(hBlockPar1,Index,Par)                                   //        hBlockPar1[Index]     =  Par
                                                                      //
  // Insert par 2 in program                                          //
  ADD16(Pc,3,Pc)                                                      //        Pc    +=  3
  MOVE16_32(Pc,Index)                                                 //        Index  =  Pc
  CALL(GetData16,Index,Par,hProgram)                                  //        CALL(GetData16,Index,Par,hProgram)
  MOVE16_32(Point,Index)                                              //        Index  =  Point
  ARRAY_WRITE(hBlockPar2,Index,Par)                                   //        hBlockPar2[Index]     =  Par
                                                                      //
  // Point at next call opcode                                        //
  ADD16(Pc,2,Pc)                                                      //        Pc    +=  2
                                                                      //
  JR_EQ16(Block,LOOPBLOCK,NoSeparator)                                //        if (Block != LOOPBLOCK)
                                                                      //        {
  ADD16(Point,1,Point)                                                //          Point++
                                                                      //
  MOVE16_32(Point,Index)                                              //          Index  =  Point
  ARRAY_WRITE(hBlockStream,Index,SEPARATOR)                           //          hBlockStream[Index] =  SEPARATOR
  ARRAY_WRITE(hBlockPar1,Index,0)                                     //          hBlockPar1[Index]   =  0
  ARRAY_WRITE(hBlockPar2,Index,0)                                     //          hBlockPar2[Index]   =  0
                                                                      //
  ADD16(Point,1,Point)                                                //          Point++
NoSeparator:                                                          //        }
                                                                      //      }
  JR_NEQ16(Block,LOOPBLOCK,Insert)                                    //      while (Block != LOOPBLOCK)
                                                                      //
}                                                                     //  }
                                                                      //
                                                                      //
// SaveFile ********************************************************************************************
                                                                      //
                                                                      //
subcall   SaveFile                                                    //  void SaveFile(Name)
{                                                                     //  {
  IO_S    Name FILENAMESIZE                                           //
                                                                      //
  DATA32  Size                                                        //
  DATA32  Index                                                       //    Array index
  DATA16  hFile                                                       //
  DATA16  hProgram                                                    //
  DATA32  StartOfCalls                                                //
  DATA16  NoOfObjects                                                 //
  DATA16  Start                                                       //
  DATA16  End                                                         //
  DATA16  Point                                                       //
  DATA16  Pc                                                          //
  DATA16  Block                                                       //
  DATA16  Par                                                         //
                                                                      //
  // Read template for OBP                                            //
  FILE(OPEN_READ,TEMPLATE_FILE,hFile,Size)                            //      FILE(OPEN_READ,TEMPLATE_FILE,hFile,Size)
  ARRAY(CREATE8,Size,hProgram)                                        //      ARRAY(CREATE8,Size,hProgram)
  FILE(READ_BYTES,hFile,Size,@hProgram)                               //      FILE(READ_BYTES,hFile,Size,@hProgram)
  FILE(CLOSE,hFile)                                                   //      FILE(CLOSE,hFile)
                                                                      //
  // Adjust template for run                                          //
  CALL(GetData16,10,NoOfObjects,hProgram)                             //      CALL(GetData16,10,NoOfObjects,hProgram)
  CALL(GetData32,16,StartOfCalls,hProgram)                            //
                                                                      //
  CALL(FindBlockType,STARTBLOCK,Start)                                //      CALL(FindBlockType,STARTBLOCK,Start)
  CALL(FindBlockType,LOOPBLOCK,End)                                   //      CALL(FindBlockType,LOOPBLOCK,End)
                                                                      //
  MOVE16_16(Start,Point)                                              //      Point  =  Start
                                                                      //
  MOVE16_16(StartOfCalls,Pc)                                          //      Pc  =  StartOfCalls
                                                                      //
Insert:                                                               //      while (Point <= End)
  JR_GT16(Point,End,EndInsert)                                        //                                                                    //
                                                                      //      {
  MOVE16_32(Point,Index)                                              //        Index  =  Point
  ARRAY_READ(hBlockStream,Index,Block)                                //        Block  =  hBlockStream[Index]
  JR_EQ16(Block,SEPARATOR,NotBlock)                                   //        if (Block != SEPARATOR)
                                                                      //        {
  // Insert block call in program                                     //
  ADD16(Pc,1,Pc)                                                      //          Pc++
  MOVE16_32(Pc,Index)                                                 //          Index  =  Pc
  CALL(PutData8,Index,Block,hProgram)                                 //          CALL(PutData8,Index,Block,hProgram)
                                                                      //
  // Insert par 1 in program                                          //
  MOVE16_32(Point,Index)                                              //          Index  =  Point
  ARRAY_READ(hBlockPar1,Index,Par)                                    //          Par    =  hBlockPar1[Index]
  ADD16(Pc,3,Pc)                                                      //          Pc    +=  3
  MOVE16_32(Pc,Index)                                                 //          Index  =  Pc
  CALL(PutData16,Index,Par,hProgram)                                  //          CALL(PutData16,Index,Par,hProgram)
                                                                      //
  // Insert par 2 in program                                          //
  MOVE16_32(Point,Index)                                              //          Index  =  Point
  ARRAY_READ(hBlockPar2,Index,Par)                                    //          Par    =  hBlockPar1[Index]
  ADD16(Pc,3,Pc)                                                      //          Pc    +=  3
  MOVE16_32(Pc,Index)                                                 //          Index  =  Pc
  CALL(PutData16,Index,Par,hProgram)                                  //          CALL(PutData16,Index,Par,hProgram)
                                                                      //
  // Point at next call opcode                                        //
  ADD16(Pc,2,Pc)                                                      //          Pc    +=  2
                                                                      //
NotBlock:                                                             //        }
  ADD16(Point,1,Point)                                                //        Point++
  JR(Insert)                                                          //      }
EndInsert:                                                            //
                                                                      //
  // Save run file                                                    //
  FILE(OPEN_WRITE,Name,hFile)                                         //      FILE(OPEN_WRITE,Name,hFile)
  FILE(WRITE_BYTES,hFile,Size,@hProgram)                              //      FILE(WRITE_BYTES,hFile,Size,@hProgram)
  FILE(CLOSE,hFile)                                                   //      FILE(CLOSE,hFile)
  ARRAY(DELETE,hProgram)                                              //      ARRAY(DELETE,hProgram)
                                                                      //
}                                                                     //  }
                                                                      //
                                                                      //
// StartBlock ******************************************************************************************
                                                                      //
define    STARTBLOCK_WIDTH      24                                    //                                                                      
                                                                      //
subcall   StartBlock                                                  //  StartBlock
{                                                                     //  {
  IN_16   Function                                                    //    Function
  IO_16   Pointer                                                     //    Pointer (Cursor)
  IO_16   X1                                                          //    X coord
  IO_16   X2                                                          //    Y variable
                                                                      //  
  DATAF   Tmp                                                         //    
  DATA32  Timer                                                       //
  DATA32  Size                                                        //
  DATA32  Index                                                       //    Array index
  DATA16  hFile                                                       //
  DATA16  Par1                                                        //    Local parameter 1
  DATA16  Par2                                                        //    Local parameter 2
  DATA16  X3                                                          //  
  DATA16  Y3                                                          //
  DATA8   Icon                                                        //
  DATA8   Stop                                                        //
  DATA8   Flag                                                        //
  DATA8   Status                                                      //    DATA8   Status
  DATAS   Name FILENAMESIZE                                           //
                                                                      //
  MOVE16_32(Pointer,Index)                                            //
  ARRAY_READ(hBlockPar1,Index,Par1)                                   //                                                                      
  ARRAY_READ(hBlockPar2,Index,Par2)                                   //                                                                      
                                                                      //
  JR_NEQ16(Function,INIT,NotInit)                                     //    if (Function == INIT)
                                                                      //    {
  MOVE16_16(0,Par1)                                                   //      Par1      =  0
  MOVE16_16(0,Par2)                                                   //      Par2      =  0
NotInit:                                                              //    }
                                                                      //
  JR_NEQ16(Function,GET_WIDTH,NotGetWidth)                            //    if (Function == GET_WIDTH)
                                                                      //    {
  MOVE16_16(STARTBLOCK_WIDTH,X1)                                      //      X1        =   STARTBLOCK_WIDTH
                                                                      //
NotGetWidth:                                                          //    }
                                                                      //
  JR_NEQ16(Function,ACTIVATE,NotActivate)                             //    if (Function == ACTIVATE)
                                                                      //    {
                                                                      //
  // Save file                                                        //
  STRINGS(ADD,'../apps/Brick Program/',RUN_FILE,Name)                 //      STRINGS(ADD,'../apps/Brick Program/',RUN_FILE,Name)
  CALL(SaveFile,Name)                                                 //      CALL(SaveFile,Name)
  // Run file                                                         //
  FILE(LOAD_IMAGE,USER_SLOT,Name,Size,hFile)                          //      FILE(LOAD_IMAGE,USER_SLOT,Name,Size,hFile)
  PROGRAM_START(USER_SLOT,0,hFile,0)                                  //      PROGRAM_START(USER_SLOT,0,hFile,0)
                                                                      //
  MOVE8_8(0,Stop)                                                     //      Stop  =  0
                                                                      //      do
FileRunning:                                                          //      {
                                                                      //
  UI_BUTTON(SHORTPRESS,BACK_BUTTON,Stop)                              //        UI_BUTTON(SHORTPRESS,BACK_BUTTON,Stop)
  PROGRAM_INFO(GET_STATUS,USER_SLOT,Status)                           //        PROGRAM_INFO(GET_STATUS,USER,Status)
                                                                      //
  CP_EQ8(Status,STOPPED,Flag)                                         //        if (Status == STOPPED)
  JR_FALSE(Flag,FileNotStopped)                                       //        {
                                                                      //
  MOVE8_8(1,Stop)                                                     //          Stop = 1
                                                                      //
FileNotStopped:                                                       //        }
                                                                      //      }
  JR_FALSE(Stop,FileRunning)                                          //      while (Stop == 0)
                                                                      //
  PROGRAM_STOP(USER_SLOT)                                             //      PROGRAM_STOP(USER_SLOT)
  UI_BUTTON(FLUSH)                                                    //      UI_BUTTON(FLUSH)
                                                                      //
  UI_BUTTON(SET_BACK_BLOCK,1)                                         //
  UI_DRAW(TOPLINE,1)                                                  //      UI_DRAW(TOPLINE,1)
  UI_WRITE(LED,LED_GREEN)                                             //      UI_WRITE(LED,LED_GREEN)
                                                                      //
NotActivate:                                                          //    }
                                                                      //
  JR_NEQ16(Function,REFRESH,NotRefresh)                               //    if (Function == REFRESH)
                                                                      //    {
  JR_NEQ16(X2,1,NotSelected)                                          //      if (X2)
                                                                      //      {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'StartBLKs')                         //        Draw bitmap
                                                                      //
  JR(EndSelected)                                                     //      }
                                                                      //      else  
NotSelected:                                                          //      {                                                                                                                                            
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'StartBLKn')                         //        Draw bitmap
                                                                      //
EndSelected:                                                          //      }                                                                        
NotRefresh:                                                           //    }
  MOVE16_32(Pointer,Index)                                            //
  ARRAY_WRITE(hBlockPar1,Index,Par1)                                  //                                                                      
  ARRAY_WRITE(hBlockPar2,Index,Par2)                                  //                                                                      
}                                                                     //  }
                                                                      //
                                                                      //
// Separator *******************************************************************************************
                                                                      //
define    SEPARATOR_WIDTH      11                                     //                                                                      
                                                                      //
subcall   Separator                                                   //  Separator
{                                                                     //  {
  IN_16   Function                                                    //    Function
  IO_16   Pointer                                                     //    Pointer (Cursor)
  IO_16   X1                                                          //    X coord
  IO_16   X2                                                          //    Y variable
                                                                      //  
  DATAF   Tmp                                                         //    
  DATA32  Index                                                       //    Array index
  DATA16  Par1                                                        //    Local parameter 1
  DATA16  Par2                                                        //    Local parameter 2
  DATA16  X3                                                          //  
  DATA16  X4                                                          //
  DATA16  Y3                                                          //
                                                                      //
  MOVE16_32(Pointer,Index)                                            //
  ARRAY_READ(hBlockPar1,Index,Par1)                                   //                                                                      
  ARRAY_READ(hBlockPar2,Index,Par2)                                   //                                                                      
                                                                      //
  JR_NEQ16(Function,INIT,NotInit)                                     //    if (Function == INIT)
                                                                      //    {
  MOVE16_16(4,Par1)                                                   //      Par1      =  0                                                                      
  MOVE16_16(3,Par2)                                                   //      Par2      =  0                                                                      
NotInit:                                                              //    }
                                                                      //
  JR_NEQ16(Function,GET_WIDTH,NotGetWidth)                            //    if (Function == GET_WIDTH)
                                                                      //    {
  MOVE16_16(SEPARATOR_WIDTH,X1)                                       //      X1        =   SEPARATOR_WIDTH
                                                                      //
NotGetWidth:                                                          //    }
                                                                      //
  JR_NEQ16(Function,ACTIVATE,NotActivate)                             //    if (Function == ACTIVATE)
                                                                      //    {
NotActivate:                                                          //    }
                                                                      //
  JR_NEQ16(Function,REFRESH,NotRefresh)                               //    if (Function == REFRESH)
                                                                      //    {
  // Find end of block stream                                         //
  CALL(FindBlockType,LOOPBLOCK,X4)                                    //    CALL(FindBlockType,LOOPBLOCK,Pointer)
  ADD16(X4,2,X4)                                                      //    X4 +=  2
  JR_GTEQ16(X4,BLOCKS,NotSelected)                                    //    if (X4 < BLOCKS) &&
  JR_NEQ16(X2,1,NotSelected)                                          //        (X2))
                                                                      //      {
  UI_DRAW(BMPFILE,FG_COLOR,X1,34,'BlockAdd')                          //        Draw bitmap
                                                                      //
  SUB16(X1,10,X3)                                                     //        X3  =  X1 + 10
                                                                      //
  UI_DRAW(BMPFILE,FG_COLOR,X3,23,'ToLib')                             //        Draw bitmap
                                                                      //
  JR(EndSelected)                                                     //      }
                                                                      //      else  
NotSelected:                                                          //      {                                                                                                                                            
  UI_DRAW(BMPFILE,FG_COLOR,X1,68,'Blocklink')                         //        Draw bitmap
                                                                      //
EndSelected:                                                          //      }                                                                        
NotRefresh:                                                           //    }
  ARRAY_WRITE(hBlockPar1,Index,Par1)                                  //                                                                      
  ARRAY_WRITE(hBlockPar2,Index,Par2)                                  //                                                                      
}                                                                     //  }
                                                                      //
                                                                      //
// ControlPar ******************************************************************************************
                                                                      //
                                                                      //
subcall   ControlPar                                                  //  ControlPar
{                                                                     //  {
  IN_32   Index                                                       //
  IO_16   Par1                                                        //
  IO_16   Par2                                                        //
  IN_16   Min                                                         //
  IN_16   Max                                                         //
  IO_8    Stay                                                        //
                                                                      //
  DATA8   State                                                       //
  DATA16  Inc                                                         //
  DATA8   ChangeSave                                                  //
                                                                      //
  MOVE8_8(Changed,ChangeSave)                                         //    ChangeSave  =  Changed
                                                                      //
  UI_BUTTON(GET_VERT,Inc)                                             //    UI_BUTTON(GET_VERT,Inc)
  JR_EQ16(Inc,0,NotVert)                                              //    if (Inc)
                                                                      //    {
  SUB16(0,Inc,Inc)                                                    //      Inc   =  0 - Inc
  ADD16(Par1,Inc,Par1)                                                //      Par1 +=  Inc
  JR_LTEQ16(Par1,Max,NotTooHigh)                                      //      if (Par1 > Max)
                                                                      //      {
  MOVE16_16(Max,Par1)                                                 //        Par1  =  MAx
NotTooHigh:                                                           //      }
  JR_GTEQ16(Par1,Min,NotTooLow)                                       //      if (Par1 < Min)
                                                                      //      {
  MOVE16_16(Min,Par1)                                                 //        Par1  =  Min
NotTooLow:                                                            //      }
  MOVE8_8(1,Changed)                                                  //      Changed  =  1
NotVert:                                                              //    }
                                                                      //
  UI_BUTTON(SHORTPRESS,ENTER_BUTTON,State)                            //    UI_BUTTON(SHORTPRESS,ENTER_BUTTON,State)
  JR_FALSE(State,NotEnter)                                            //    if (State)
                                                                      //    {
  ARRAY_WRITE(hBlockPar1,Index,Par1)                                  //      hBlockPar1[Index]  =  Par1
  ARRAY_WRITE(hBlockPar2,Index,Par2)                                  //      hBlockPar2[Index]  =  Par2
  MOVE8_8(0,Stay)                                                     //      Stay      =  0
                                                                      //
NotEnter:                                                             //    }
  UI_BUTTON(TESTSHORTPRESS,LEFT_BUTTON,State)                         //    UI_BUTTON(TESTSHORTPRESS,LEFT_BUTTON,State)
  JR_FALSE(State,NotLeft)                                             //    if (State)
                                                                      //    {
  ARRAY_WRITE(hBlockPar1,Index,Par1)                                  //      hBlockPar1[Index]  =  Par1
  ARRAY_WRITE(hBlockPar2,Index,Par2)                                  //      hBlockPar2[Index]  =  Par2
  MOVE8_8(0,Stay)                                                     //      Stay      =  0
                                                                      //
NotLeft:                                                              //    }
  UI_BUTTON(TESTSHORTPRESS,RIGHT_BUTTON,State)                        //    UI_BUTTON(TESTSHORTPRESS,RIGHT_BUTTON,State)
  JR_FALSE(State,NotRight)                                            //    if (State)
                                                                      //    {
  ARRAY_WRITE(hBlockPar1,Index,Par1)                                  //      hBlockPar1[Index]  =  Par1
  ARRAY_WRITE(hBlockPar2,Index,Par2)                                  //      hBlockPar2[Index]  =  Par2
  MOVE8_8(0,Stay)                                                     //      Stay      =  0
                                                                      //
NotRight:                                                             //    }
  UI_BUTTON(SHORTPRESS,BACK_BUTTON,State)                             //    UI_BUTTON(SHORTPRESS,BACK_BUTTON,State)
  JR_FALSE(State,NotBack)                                             //    if (State)
                                                                      //    {
  MOVE8_8(ChangeSave,Changed)                                         //      Changed   =  ChangeSave
  MOVE8_8(0,Stay)                                                     //      Stay      =  0
                                                                      //
NotBack:                                                              //    }
}                                                                     //  }
                                                                      //
                                                                      //
// LoopBlock *******************************************************************************************
                                                                      //
define    LOOPBLOCK_WIDTH                 24                          //
define    LOOPBLOCK_PAR1_MIN              1                           //
define    LOOPBLOCK_PAR1_DEFAULT          1                           //
define    LOOPBLOCK_PAR1_MAX              7                           //
                                                                      //
subcall   LoopBlock                                                   //  LoopBlock
{                                                                     //  {
  IN_16   Function                                                    //    Function
  IO_16   Pointer                                                     //    Pointer (Cursor)
  IO_16   X1                                                          //    X coord
  IO_16   X2                                                          //    Y variable
                                                                      //  
  DATAF   Tmp                                                         //    
  DATA32  Index                                                       //    Array index
  DATA16  Par1                                                        //    Local parameter 1
  DATA16  Par2                                                        //    Local parameter 2
  DATA16  X3                                                          //  
  DATA16  Y3                                                          //
  DATA16  Tmp16                                                       //
  DATA8   Stay                                                        //
  DATA8   State                                                       //
  DATAS   Name 32                                                     //
  DATAS   No 6                                                        //
                                                                      //
  MOVE16_32(Pointer,Index)                                            //
  ARRAY_READ(hBlockPar1,Index,Par1)                                   //                                                                      
  ARRAY_READ(hBlockPar2,Index,Par2)                                   //                                                                      
                                                                      //
  MOVE8_8(0,Stay)                                                     //    Stay        =  0
                                                                      //
  JR_NEQ16(Function,INIT,NotInit)                                     //    if (Function == INIT)
                                                                      //    {
  MOVE16_16(LOOPBLOCK_PAR1_DEFAULT,Par1)                              //      Par1      =  LOOPBLOCK_PAR1_DEFAULT
  MOVE16_16(0,Par2)                                                   //      Par2      =  0
  ARRAY_WRITE(hBlockPar1,Index,Par1)                                  //
  ARRAY_WRITE(hBlockPar2,Index,Par2)                                  //
NotInit:                                                              //    }
                                                                      //
  JR_NEQ16(Function,GET_WIDTH,NotGetWidth)                            //    if (Function == GET_WIDTH)
                                                                      //    {
  MOVE16_16(LOOPBLOCK_WIDTH,X1)                                       //      X1        =  LOOPBLOCK_WIDTH
                                                                      //
NotGetWidth:                                                          //    }
                                                                      //
  JR_NEQ16(Function,ACTIVATE,NotActivate)                             //    if (Function == ACTIVATE)
                                                                      //    {
  MOVE8_8(1,Stay)                                                     //      Stay      =  1
  MOVE16_16(1,X2)                                                     //      X2        =  1
  MOVE16_16(REFRESH,Function)                                         //      Function  =  REFRESH
NotActivate:                                                          //    }
                                                                      //
  JR_NEQ16(Function,REFRESH,NotRefresh)                               //    if (Function == REFRESH)
                                                                      //    {
  ADD16(X1,25,X3)                                                     //      X3  =  X1 + 25
  UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)                              //      UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)
                                                                      //      do
Refresh:                                                              //      {
  JR_NEQ16(X2,1,NotSelected)                                          //        if (X2)
                                                                      //        {
  JR_FALSE(Stay,NotStay)                                              //          if (Stay)
                                                                      //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'RepBlkh')                           //            Draw bitmap
                                                                      //
  JR(EndStay)                                                         //          }
                                                                      //          else
NotStay:                                                              //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'RepBlks')                           //            Draw bitmap
                                                                      //
EndStay:                                                              //          }
  JR(EndSelected)                                                     //        }
                                                                      //        else
NotSelected:                                                          //        {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'RepBlkn')                           //          Draw bitmap
                                                                      //
EndSelected:                                                          //        }
  STRINGS(NUMBER_TO_STRING,Par1,1,No)                                 //
  STRINGS(ADD,'A_LoopP',No,Name)                                      //
                                                                      //
  ADD16(X1,4,X3)                                                      //        X3  =  X1 + 4
  UI_DRAW(BMPFILE,FG_COLOR,X3,78,Name)                                //        Draw bitmap
                                                                      //
  JR_FALSE(Stay,DoNotWait)                                            //        if (Stay)
                                                                      //        {
  UI_DRAW(UPDATE)                                                     //          UI_DRAW(UPDATE)
  UI_BUTTON(FLUSH)                                                    //          UI_BUTTON(FLUSH)
  UI_BUTTON(WAIT_FOR_PRESS)                                           //          UI_BUTTON(WAIT_FOR_PRESS)
                                                                      //
  CALL(ControlPar,Index,Par1,Par2,LOOPBLOCK_PAR1_MIN,LOOPBLOCK_PAR1_MAX,Stay) //
DoNotWait:                                                            //        }
                                                                      //      }
  JR_TRUE(Stay,Refresh)                                               //      while(Stay)
NotRefresh:                                                           //    }
}                                                                     //  }
                                                                      //
// DoubleMotorBlock ************************************************************************************
                                                                      //
define    DOUBLEMOTORBLOCK_WIDTH          80                          //
define    DOUBLEMOTORBLOCK_PAR1_MIN       1                           //
define    DOUBLEMOTORBLOCK_PAR1_DEFAULT   5                           //
define    DOUBLEMOTORBLOCK_PAR1_MAX       9                           //
                                                                      //
subcall   DoubleMotorBlock                                            //  DoubleMotorBlock
{                                                                     //  {
  IN_16   Function                                                    //    Function
  IO_16   Pointer                                                     //    Pointer (Cursor)
  IO_16   X1                                                          //    X coord
  IO_16   X2                                                          //    Y variable
                                                                      //  
  DATAF   Tmp                                                         //    
  DATA32  Index                                                       //    Array index
  DATA16  Par1                                                        //    Local parameter 1
  DATA16  Par2                                                        //    Local parameter 2
  DATA16  X3                                                          //  
  DATA16  Y3                                                          //
  DATA16  Tmp16                                                       //
  DATA8   Stay                                                        //
  DATA8   State                                                       //
  DATAS   Name 32                                                     //
  DATAS   No 6                                                        //
                                                                      //
  MOVE16_32(Pointer,Index)                                            //
  ARRAY_READ(hBlockPar1,Index,Par1)                                   //                                                                      
  ARRAY_READ(hBlockPar2,Index,Par2)                                   //                                                                      
                                                                      //
  MOVE8_8(0,Stay)                                                     //    Stay        =  0                                                                       
                                                                      //
  JR_NEQ16(Function,INIT,NotInit)                                     //    if (Function == INIT)
                                                                      //    {
  MOVE16_16(DOUBLEMOTORBLOCK_PAR1_DEFAULT,Par1)                       //      Par1      =  DOUBLEMOTORBLOCK_PAR1_DEFAULT
  MOVE16_16(0,Par2)                                                   //      Par2      =  0                                                                      
  ARRAY_WRITE(hBlockPar1,Index,Par1)                                  //                                                                      
  ARRAY_WRITE(hBlockPar2,Index,Par2)                                  //                                                                      
NotInit:                                                              //    }
                                                                      //
  JR_NEQ16(Function,GET_WIDTH,NotGetWidth)                            //    if (Function == GET_WIDTH)
                                                                      //    {
  MOVE16_16(DOUBLEMOTORBLOCK_WIDTH,X1)                                //      X1        =  DOUBLEMOTORBLOCK_WIDTH
                                                                      //
NotGetWidth:                                                          //    }
                                                                      //
  JR_NEQ16(Function,DRAW_ICON,NotDrawIcon)                            //    if (Function == DRAW_ICON)
                                                                      //    {
  UI_DRAW(BMPFILE,FG_COLOR,X1,X2,'A_Move')                            //      Draw bitmap
                                                                      //
NotDrawIcon:                                                          //    }
                                                                      //
  JR_NEQ16(Function,ACTIVATE,NotActivate)                             //    if (Function == ACTIVATE)
                                                                      //    {
  MOVE8_8(1,Stay)                                                     //      Stay      =  1
  MOVE16_16(1,X2)                                                     //      X2        =  1
  MOVE16_16(REFRESH,Function)                                         //      Function  =  REFRESH                                                                       
NotActivate:                                                          //    }
                                                                      //
  JR_NEQ16(Function,REFRESH,NotRefresh)                               //    if (Function == REFRESH)
                                                                      //    {
  ADD16(X1,25,X3)                                                     //      X3  =  X1 + 25
  UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)                              //      UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)
                                                                      //      do
Refresh:                                                              //      {  
  JR_NEQ16(X2,1,NotSelected)                                          //        if (X2)
                                                                      //        {
  JR_FALSE(Stay,NotStay)                                              //          if (Stay)
                                                                      //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKh')                              //            Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //            X3  =  X1 + 44  
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Ph_bc')                             //            Draw bitmap
                                                                      // 
  JR(EndStay)                                                         //          }
                                                                      //          else  
NotStay:                                                              //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKs')                              //            Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //            X3  =  X1 + 44  
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Ps_bc')                             //            Draw bitmap
                                                                      //
  ADD16(X1,25,X3)                                                     //            X3  =  X1 + 25
                                                                      //
  UI_DRAW(BMPFILE,FG_COLOR,X3,23,'ToLib')                             //            Draw bitmap
                                                                      //
EndStay:                                                              //          }
  JR(EndSelected)                                                     //        }
                                                                      //        else  
NotSelected:                                                          //        {                                                                                                                                            
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKn')                              //          Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //          X3  =  X1 + 44  
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Pn_bc')                             //          Draw bitmap
                                                                      //
EndSelected:                                                          //        }
  ADD16(X1,2,X3)                                                      //        X3  =  X1 + 2  
  UI_DRAW(BMPFILE,FG_COLOR,X3,60,'A_Move')                            //        Draw bitmap
                                                                      //
  STRINGS(NUMBER_TO_STRING,Par1,1,No)                                 //
  STRINGS(ADD,'A_MoveP',No,Name)                                      //
                                                                      //
  ADD16(X1,46,X3)                                                     //        X3  =  X1 + 46  
  UI_DRAW(BMPFILE,FG_COLOR,X3,66,Name)                                //        Draw bitmap
                                                                      //
  JR_FALSE(Stay,DoNotWait)                                            //        if (Stay)
                                                                      //        {
  UI_DRAW(UPDATE)                                                     //          UI_DRAW(UPDATE)                                                                      
  UI_BUTTON(FLUSH)                                                    //          UI_BUTTON(FLUSH)
  UI_BUTTON(WAIT_FOR_PRESS)                                           //          UI_BUTTON(WAIT_FOR_PRESS)
                                                                      //  
  CALL(ControlPar,Index,Par1,Par2,DOUBLEMOTORBLOCK_PAR1_MIN,DOUBLEMOTORBLOCK_PAR1_MAX,Stay) //
DoNotWait:                                                            //        }
                                                                      //      }
  JR_TRUE(Stay,Refresh)                                               //      while(Stay)
NotRefresh:                                                           //    }
}                                                                     //  }
                                                                      //
// SingleMotorBlock ************************************************************************************
                                                                      //
define    SINGLEMOTORBLOCK_WIDTH          80                          //
define    SINGLEMOTORBLOCK_PAR1_MIN       1                           //
define    SINGLEMOTORBLOCK_PAR1_DEFAULT   7                           //
define    SINGLEMOTORBLOCK_PAR1_MAX       9                           //
                                                                      //
subcall   SingleMotorBlock                                            //  SingleMotorBlock
{                                                                     //  {
  IN_16   Function                                                    //    Function
  IO_16   Pointer                                                     //    Pointer (Cursor)
  IO_16   X1                                                          //    X coord
  IO_16   X2                                                          //    Y variable
                                                                      //
  DATAF   Tmp                                                         //
  DATA32  Index                                                       //    Array index
  DATA16  Par1                                                        //    Local parameter 1
  DATA16  Par2                                                        //    Local parameter 2
  DATA16  X3                                                          //
  DATA16  Y3                                                          //
  DATA16  Tmp16                                                       //
  DATA8   Stay                                                        //
  DATA8   State                                                       //
  DATAS   Name 32                                                     //
  DATAS   No 6                                                        //
                                                                      //
  MOVE16_32(Pointer,Index)                                            //
  ARRAY_READ(hBlockPar1,Index,Par1)                                   //
  ARRAY_READ(hBlockPar2,Index,Par2)                                   //
                                                                      //
  MOVE8_8(0,Stay)                                                     //    Stay        =  0
                                                                      //
  JR_NEQ16(Function,INIT,NotInit)                                     //    if (Function == INIT)
                                                                      //    {
  MOVE16_16(SINGLEMOTORBLOCK_PAR1_DEFAULT,Par1)                       //      Par1      =  SINGLEMOTORBLOCK_PAR1_DEFAULT
  MOVE16_16(0,Par2)                                                   //      Par2      =  0
  ARRAY_WRITE(hBlockPar1,Index,Par1)                                  //
  ARRAY_WRITE(hBlockPar2,Index,Par2)                                  //
NotInit:                                                              //    }
                                                                      //
  JR_NEQ16(Function,GET_WIDTH,NotGetWidth)                            //    if (Function == GET_WIDTH)
                                                                      //    {
  MOVE16_16(SINGLEMOTORBLOCK_WIDTH,X1)                                //      X1        =  SINGLEMOTORBLOCK_WIDTH
                                                                      //
NotGetWidth:                                                          //    }
                                                                      //
  JR_NEQ16(Function,DRAW_ICON,NotDrawIcon)                            //    if (Function == DRAW_ICON)
                                                                      //    {
  UI_DRAW(BMPFILE,FG_COLOR,X1,X2,'A_Lmot')                            //      Draw bitmap
                                                                      //
NotDrawIcon:                                                          //    }
                                                                      //
  JR_NEQ16(Function,ACTIVATE,NotActivate)                             //    if (Function == ACTIVATE)
                                                                      //    {
  MOVE8_8(1,Stay)                                                     //      Stay      =  1
  MOVE16_16(1,X2)                                                     //      X2        =  1
  MOVE16_16(REFRESH,Function)                                         //      Function  =  REFRESH
NotActivate:                                                          //    }
                                                                      //
  JR_NEQ16(Function,REFRESH,NotRefresh)                               //    if (Function == REFRESH)
                                                                      //    {
  ADD16(X1,25,X3)                                                     //      X3  =  X1 + 25
  UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)                              //      UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)
                                                                      //      do
Refresh:                                                              //      {
  JR_NEQ16(X2,1,NotSelected)                                          //        if (X2)
                                                                      //        {
  JR_FALSE(Stay,NotStay)                                              //          if (Stay)
                                                                      //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKh')                              //            Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //            X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Ph_d')                              //            Draw bitmap
                                                                      //
  JR(EndStay)                                                         //          }
                                                                      //          else
NotStay:                                                              //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKs')                              //            Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //            X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Ps_d')                              //            Draw bitmap
                                                                      //
  ADD16(X1,25,X3)                                                     //            X3  =  X1 + 25
                                                                      //
  UI_DRAW(BMPFILE,FG_COLOR,X3,23,'ToLib')                             //            Draw bitmap
                                                                      //
EndStay:                                                              //          }
  JR(EndSelected)                                                     //        }
                                                                      //        else
NotSelected:                                                          //        {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKn')                              //          Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //          X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Pn_d')                              //          Draw bitmap
                                                                      //
EndSelected:                                                          //        }
  ADD16(X1,2,X3)                                                      //        X3  =  X1 + 2
  UI_DRAW(BMPFILE,FG_COLOR,X3,60,'A_Lmot')                            //        Draw bitmap
                                                                      //
  STRINGS(NUMBER_TO_STRING,Par1,1,No)                                 //
  STRINGS(ADD,'A_motP',No,Name)                                       //
                                                                      //
  ADD16(X1,46,X3)                                                     //        X3  =  X1 + 46
  UI_DRAW(BMPFILE,FG_COLOR,X3,66,Name)                                //        Draw bitmap
                                                                      //
  JR_FALSE(Stay,DoNotWait)                                            //        if (Stay)
                                                                      //        {
  UI_DRAW(UPDATE)                                                     //          UI_DRAW(UPDATE)
  UI_BUTTON(FLUSH)                                                    //          UI_BUTTON(FLUSH)
  UI_BUTTON(WAIT_FOR_PRESS)                                           //          UI_BUTTON(WAIT_FOR_PRESS)
                                                                      //
  CALL(ControlPar,Index,Par1,Par2,SINGLEMOTORBLOCK_PAR1_MIN,SINGLEMOTORBLOCK_PAR1_MAX,Stay) //
DoNotWait:                                                            //        }
                                                                      //      }
  JR_TRUE(Stay,Refresh)                                               //      while(Stay)
NotRefresh:                                                           //    }
}                                                                     //  }
                                                                      //
// MediumMotorBlock ************************************************************************************
                                                                      //
define    MEDIUMMOTORBLOCK_WIDTH          80                          //
define    MEDIUMMOTORBLOCK_PAR1_MIN       1                           //
define    MEDIUMMOTORBLOCK_PAR1_DEFAULT   7                           //
define    MEDIUMMOTORBLOCK_PAR1_MAX       9                           //
                                                                      //
subcall   MediumMotorBlock                                            //  MediumMotorBlock
{                                                                     //  {
  IN_16   Function                                                    //    Function
  IO_16   Pointer                                                     //    Pointer (Cursor)
  IO_16   X1                                                          //    X coord
  IO_16   X2                                                          //    Y variable
                                                                      //
  DATAF   Tmp                                                         //
  DATA32  Index                                                       //    Array index
  DATA16  Par1                                                        //    Local parameter 1
  DATA16  Par2                                                        //    Local parameter 2
  DATA16  X3                                                          //
  DATA16  Y3                                                          //
  DATA16  Tmp16                                                       //
  DATA8   Stay                                                        //
  DATA8   State                                                       //
  DATAS   Name 32                                                     //
  DATAS   No 6                                                        //
                                                                      //
  MOVE16_32(Pointer,Index)                                            //
  ARRAY_READ(hBlockPar1,Index,Par1)                                   //
  ARRAY_READ(hBlockPar2,Index,Par2)                                   //
                                                                      //
  MOVE8_8(0,Stay)                                                     //    Stay        =  0
                                                                      //
  JR_NEQ16(Function,INIT,NotInit)                                     //    if (Function == INIT)
                                                                      //    {
  MOVE16_16(MEDIUMMOTORBLOCK_PAR1_DEFAULT,Par1)                       //      Par1      =  MEDIUMMOTORBLOCK_PAR1_DEFAULT
  MOVE16_16(0,Par2)                                                   //      Par2      =  0
  ARRAY_WRITE(hBlockPar1,Index,Par1)                                  //
  ARRAY_WRITE(hBlockPar2,Index,Par2)                                  //
NotInit:                                                              //    }
                                                                      //
  JR_NEQ16(Function,GET_WIDTH,NotGetWidth)                            //    if (Function == GET_WIDTH)
                                                                      //    {
  MOVE16_16(MEDIUMMOTORBLOCK_WIDTH,X1)                                //      X1        =  MEDIUMMOTORBLOCK_WIDTH
                                                                      //
NotGetWidth:                                                          //    }
                                                                      //
  JR_NEQ16(Function,DRAW_ICON,NotDrawIcon)                            //    if (Function == DRAW_ICON)
                                                                      //    {
  UI_DRAW(BMPFILE,FG_COLOR,X1,X2,'A_Mmot')                            //      Draw bitmap
                                                                      //
NotDrawIcon:                                                          //    }
                                                                      //
  JR_NEQ16(Function,ACTIVATE,NotActivate)                             //    if (Function == ACTIVATE)
                                                                      //    {
  MOVE8_8(1,Stay)                                                     //      Stay      =  1
  MOVE16_16(1,X2)                                                     //      X2        =  1
  MOVE16_16(REFRESH,Function)                                         //      Function  =  REFRESH
NotActivate:                                                          //    }
                                                                      //
  JR_NEQ16(Function,REFRESH,NotRefresh)                               //    if (Function == REFRESH)
                                                                      //    {
  ADD16(X1,25,X3)                                                     //      X3  =  X1 + 25
  UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)                              //      UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)
                                                                      //      do
Refresh:                                                              //      {
  JR_NEQ16(X2,1,NotSelected)                                          //        if (X2)
                                                                      //        {
  JR_FALSE(Stay,NotStay)                                              //          if (Stay)
                                                                      //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKh')                              //            Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //            X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Ph_a')                              //            Draw bitmap
                                                                      //
  JR(EndStay)                                                         //          }
                                                                      //          else
NotStay:                                                              //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKs')                              //            Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //            X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Ps_a')                              //            Draw bitmap
                                                                      //
  ADD16(X1,25,X3)                                                     //            X3  =  X1 + 25
                                                                      //
  UI_DRAW(BMPFILE,FG_COLOR,X3,23,'ToLib')                             //            Draw bitmap
                                                                      //
EndStay:                                                              //          }
  JR(EndSelected)                                                     //        }
                                                                      //        else
NotSelected:                                                          //        {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKn')                              //          Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //          X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Pn_a')                              //          Draw bitmap
                                                                      //
EndSelected:                                                          //        }
  ADD16(X1,2,X3)                                                      //        X3  =  X1 + 2
  UI_DRAW(BMPFILE,FG_COLOR,X3,60,'A_Mmot')                            //        Draw bitmap
                                                                      //
  STRINGS(NUMBER_TO_STRING,Par1,1,No)                                 //
  STRINGS(ADD,'A_motP',No,Name)                                       //
                                                                      //
  ADD16(X1,46,X3)                                                     //        X3  =  X1 + 46
  UI_DRAW(BMPFILE,FG_COLOR,X3,66,Name)                                //        Draw bitmap
                                                                      //
  JR_FALSE(Stay,DoNotWait)                                            //        if (Stay)
                                                                      //        {
  UI_DRAW(UPDATE)                                                     //          UI_DRAW(UPDATE)
  UI_BUTTON(FLUSH)                                                    //          UI_BUTTON(FLUSH)
  UI_BUTTON(WAIT_FOR_PRESS)                                           //          UI_BUTTON(WAIT_FOR_PRESS)
                                                                      //
  CALL(ControlPar,Index,Par1,Par2,MEDIUMMOTORBLOCK_PAR1_MIN,MEDIUMMOTORBLOCK_PAR1_MAX,Stay) //
DoNotWait:                                                            //        }
                                                                      //      }
  JR_TRUE(Stay,Refresh)                                               //      while(Stay)
NotRefresh:                                                           //    }
}                                                                     //  }
                                                                      //
// SoundBlock ******************************************************************************************
                                                                      //
define    SOUNDBLOCK_WIDTH              80                            //
define    SOUNDBLOCK_PAR1_MIN           1                             //
define    SOUNDBLOCK_PAR1_DEFAULT       2                             //
define    SOUNDBLOCK_PAR1_MAX           13                            //
                                                                      //
subcall   SoundBlock                                                  //  SoundBlock
{                                                                     //  {
  IN_16   Function                                                    //    Function
  IO_16   Pointer                                                     //    Pointer (Cursor)
  IO_16   X1                                                          //    X coord
  IO_16   X2                                                          //    Y variable
                                                                      //
  DATAF   Tmp                                                         //
  DATA32  Index                                                       //    Array index
  DATA16  Par1                                                        //    Local parameter 1
  DATA16  Par2                                                        //    Local parameter 2
  DATA16  X3                                                          //
  DATA16  Y3                                                          //
  DATA16  Tmp16                                                       //
  DATA8   Stay                                                        //
  DATA8   State                                                       //
  DATAS   Name 32                                                     //
  DATAS   No 6                                                        //
                                                                      //
  MOVE16_32(Pointer,Index)                                            //
  ARRAY_READ(hBlockPar1,Index,Par1)                                   //
  ARRAY_READ(hBlockPar2,Index,Par2)                                   //
                                                                      //
  MOVE8_8(0,Stay)                                                     //    Stay        =  0
                                                                      //
  JR_NEQ16(Function,INIT,NotInit)                                     //    if (Function == INIT)
                                                                      //    {
  MOVE16_16(SOUNDBLOCK_PAR1_DEFAULT,Par1)                             //      Par1      =  SOUNDBLOCK_PAR1_DEFAULT
  MOVE16_16(0,Par2)                                                   //      Par2      =  0
  ARRAY_WRITE(hBlockPar1,Index,Par1)                                  //
  ARRAY_WRITE(hBlockPar2,Index,Par2)                                  //
NotInit:                                                              //    }
                                                                      //
  JR_NEQ16(Function,GET_WIDTH,NotGetWidth)                            //    if (Function == GET_WIDTH)
                                                                      //    {
  MOVE16_16(SOUNDBLOCK_WIDTH,X1)                                      //      X1        =  SOUNDBLOCK_WIDTH
                                                                      //
NotGetWidth:                                                          //    }
                                                                      //
  JR_NEQ16(Function,DRAW_ICON,NotDrawIcon)                            //    if (Function == DRAW_ICON)
                                                                      //    {
  UI_DRAW(BMPFILE,FG_COLOR,X1,X2,'A_Snd')                             //      Draw bitmap
                                                                      //
NotDrawIcon:                                                          //    }
                                                                      //
  JR_NEQ16(Function,ACTIVATE,NotActivate)                             //    if (Function == ACTIVATE)
                                                                      //    {
  MOVE8_8(1,Stay)                                                     //      Stay      =  1
  MOVE16_16(1,X2)                                                     //      X2        =  1
  MOVE16_16(REFRESH,Function)                                         //      Function  =  REFRESH
NotActivate:                                                          //    }
                                                                      //
  JR_NEQ16(Function,REFRESH,NotRefresh)                               //    if (Function == REFRESH)
                                                                      //    {
  ADD16(X1,25,X3)                                                     //      X3  =  X1 + 25
  UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)                              //      UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)
                                                                      //      do
Refresh:                                                              //      {
  JR_NEQ16(X2,1,NotSelected)                                          //        if (X2)
                                                                      //        {
  JR_FALSE(Stay,NotStay)                                              //          if (Stay)
                                                                      //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKh')                              //            Draw bitmap
                                                                      //
  JR(EndStay)                                                         //          }
                                                                      //          else
NotStay:                                                              //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKs')                              //            Draw bitmap
                                                                      //
  ADD16(X1,25,X3)                                                     //            X3  =  X1 + 25
                                                                      //
  UI_DRAW(BMPFILE,FG_COLOR,X3,23,'ToLib')                             //            Draw bitmap
                                                                      //
EndStay:                                                              //          }
  JR(EndSelected)                                                     //        }
                                                                      //        else
NotSelected:                                                          //        {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKn')                              //          Draw bitmap
                                                                      //
EndSelected:                                                          //        }
  ADD16(X1,2,X3)                                                      //        X3  =  X1 + 2
  UI_DRAW(BMPFILE,FG_COLOR,X3,60,'A_Snd')                             //        Draw bitmap
                                                                      //
  STRINGS(NUMBER_TO_STRING,Par1,2,No)                                 //
  STRINGS(ADD,'A_numP',No,Name)                                       //
                                                                      //
  ADD16(X1,46,X3)                                                     //        X3  =  X1 + 46
  UI_DRAW(BMPFILE,FG_COLOR,X3,66,Name)                                //        Draw bitmap
                                                                      //
  JR_FALSE(Stay,DoNotWait)                                            //        if (Stay)
                                                                      //        {
  UI_DRAW(UPDATE)                                                     //          UI_DRAW(UPDATE)
  UI_BUTTON(FLUSH)                                                    //          UI_BUTTON(FLUSH)
  UI_BUTTON(WAIT_FOR_PRESS)                                           //          UI_BUTTON(WAIT_FOR_PRESS)
                                                                      //
  CALL(ControlPar,Index,Par1,Par2,SOUNDBLOCK_PAR1_MIN,SOUNDBLOCK_PAR1_MAX,Stay) //
DoNotWait:                                                            //        }
                                                                      //      }
  JR_TRUE(Stay,Refresh)                                               //      while(Stay)
NotRefresh:                                                           //    }
}                                                                     //  }
                                                                      //
// DisplayBlock ****************************************************************************************
                                                                      //
define    DISPLAYBLOCK_WIDTH            80                            //
define    DISPLAYBLOCK_PAR1_MIN         1                             //
define    DISPLAYBLOCK_PAR1_DEFAULT     2                             //
define    DISPLAYBLOCK_PAR1_MAX         13                            //
                                                                      //
subcall   DisplayBlock                                                //  DisplayBlock
{                                                                     //  {
  IN_16   Function                                                    //    Function
  IO_16   Pointer                                                     //    Pointer (Cursor)
  IO_16   X1                                                          //    X coord
  IO_16   X2                                                          //    Y variable
                                                                      //
  DATAF   Tmp                                                         //
  DATA32  Index                                                       //    Array index
  DATA16  Par1                                                        //    Local parameter 1
  DATA16  Par2                                                        //    Local parameter 2
  DATA16  X3                                                          //
  DATA16  Y3                                                          //
  DATA16  Tmp16                                                       //
  DATA8   Stay                                                        //
  DATA8   State                                                       //
  DATAS   Name 32                                                     //
  DATAS   No 6                                                        //
                                                                      //
  MOVE16_32(Pointer,Index)                                            //
  ARRAY_READ(hBlockPar1,Index,Par1)                                   //
  ARRAY_READ(hBlockPar2,Index,Par2)                                   //
                                                                      //
  MOVE8_8(0,Stay)                                                     //    Stay        =  0
                                                                      //
  JR_NEQ16(Function,INIT,NotInit)                                     //    if (Function == INIT)
                                                                      //    {
  MOVE16_16(DISPLAYBLOCK_PAR1_DEFAULT,Par1)                           //      Par1      =  DISPLAYBLOCK_PAR1_DEFAULT
  MOVE16_16(0,Par2)                                                   //      Par2      =  0
  ARRAY_WRITE(hBlockPar1,Index,Par1)                                  //
  ARRAY_WRITE(hBlockPar2,Index,Par2)                                  //
NotInit:                                                              //    }
                                                                      //
  JR_NEQ16(Function,GET_WIDTH,NotGetWidth)                            //    if (Function == GET_WIDTH)
                                                                      //    {
  MOVE16_16(DISPLAYBLOCK_WIDTH,X1)                                    //      X1        =  DISPLAYBLOCK_WIDTH
                                                                      //
NotGetWidth:                                                          //    }
                                                                      //
  JR_NEQ16(Function,DRAW_ICON,NotDrawIcon)                            //    if (Function == DRAW_ICON)
                                                                      //    {
  UI_DRAW(BMPFILE,FG_COLOR,X1,X2,'A_Disp')                            //      Draw bitmap
                                                                      //
NotDrawIcon:                                                          //    }
                                                                      //
  JR_NEQ16(Function,ACTIVATE,NotActivate)                             //    if (Function == ACTIVATE)
                                                                      //    {
  MOVE8_8(1,Stay)                                                     //      Stay      =  1
  MOVE16_16(1,X2)                                                     //      X2        =  1
  MOVE16_16(REFRESH,Function)                                         //      Function  =  REFRESH
NotActivate:                                                          //    }
                                                                      //
  JR_NEQ16(Function,REFRESH,NotRefresh)                               //    if (Function == REFRESH)
                                                                      //    {
  ADD16(X1,25,X3)                                                     //      X3  =  X1 + 25
  UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)                              //      UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)
                                                                      //      do
Refresh:                                                              //      {
  JR_NEQ16(X2,1,NotSelected)                                          //        if (X2)
                                                                      //        {
  JR_FALSE(Stay,NotStay)                                              //          if (Stay)
                                                                      //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKh')                              //            Draw bitmap
                                                                      //
  JR(EndStay)                                                         //          }
                                                                      //          else
NotStay:                                                              //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKs')                              //            Draw bitmap
                                                                      //
  ADD16(X1,25,X3)                                                     //            X3  =  X1 + 25
                                                                      //
  UI_DRAW(BMPFILE,FG_COLOR,X3,23,'ToLib')                             //            Draw bitmap
                                                                      //
EndStay:                                                              //          }
  JR(EndSelected)                                                     //        }
                                                                      //        else
NotSelected:                                                          //        {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKn')                              //          Draw bitmap
                                                                      //
EndSelected:                                                          //        }
  ADD16(X1,2,X3)                                                      //        X3  =  X1 + 2
  UI_DRAW(BMPFILE,FG_COLOR,X3,60,'A_Disp')                            //        Draw bitmap
                                                                      //
  STRINGS(NUMBER_TO_STRING,Par1,2,No)                                 //
  STRINGS(ADD,'A_numP',No,Name)                                       //
                                                                      //
  ADD16(X1,46,X3)                                                     //        X3  =  X1 + 46
  UI_DRAW(BMPFILE,FG_COLOR,X3,66,Name)                                //        Draw bitmap
                                                                      //
  JR_FALSE(Stay,DoNotWait)                                            //        if (Stay)
                                                                      //        {
  UI_DRAW(UPDATE)                                                     //          UI_DRAW(UPDATE)
  UI_BUTTON(FLUSH)                                                    //          UI_BUTTON(FLUSH)
  UI_BUTTON(WAIT_FOR_PRESS)                                           //          UI_BUTTON(WAIT_FOR_PRESS)
                                                                      //
  CALL(ControlPar,Index,Par1,Par2,DISPLAYBLOCK_PAR1_MIN,DISPLAYBLOCK_PAR1_MAX,Stay) //
DoNotWait:                                                            //        }
                                                                      //      }
  JR_TRUE(Stay,Refresh)                                               //      while(Stay)
NotRefresh:                                                           //    }
}                                                                     //  }
                                                                      //
// LedBlock ********************************************************************************************
                                                                      //
define    LEDBLOCK_WIDTH            80                                //
define    LEDBLOCK_PAR1_MIN         1                                 //
define    LEDBLOCK_PAR1_DEFAULT     6                                 //
define    LEDBLOCK_PAR1_MAX         7                                 //
                                                                      //
subcall   LedBlock                                                    //  LedBlock
{                                                                     //  {
  IN_16   Function                                                    //    Function
  IO_16   Pointer                                                     //    Pointer (Cursor)
  IO_16   X1                                                          //    X coord
  IO_16   X2                                                          //    Y variable
                                                                      //
  DATAF   Tmp                                                         //
  DATA32  Index                                                       //    Array index
  DATA16  Par1                                                        //    Local parameter 1
  DATA16  Par2                                                        //    Local parameter 2
  DATA16  X3                                                          //
  DATA16  Y3                                                          //
  DATA16  Tmp16                                                       //
  DATA8   Stay                                                        //
  DATA8   State                                                       //
  DATAS   Name 32                                                     //
  DATAS   No 6                                                        //
                                                                      //
  MOVE16_32(Pointer,Index)                                            //
  ARRAY_READ(hBlockPar1,Index,Par1)                                   //
  ARRAY_READ(hBlockPar2,Index,Par2)                                   //
                                                                      //
  MOVE8_8(0,Stay)                                                     //    Stay        =  0
                                                                      //
  JR_NEQ16(Function,INIT,NotInit)                                     //    if (Function == INIT)
                                                                      //    {
  MOVE16_16(LEDBLOCK_PAR1_DEFAULT,Par1)                               //      Par1      =  LEDBLOCK_PAR1_DEFAULT
  MOVE16_16(0,Par2)                                                   //      Par2      =  0
  ARRAY_WRITE(hBlockPar1,Index,Par1)                                  //
  ARRAY_WRITE(hBlockPar2,Index,Par2)                                  //
NotInit:                                                              //    }
                                                                      //
  JR_NEQ16(Function,GET_WIDTH,NotGetWidth)                            //    if (Function == GET_WIDTH)
                                                                      //    {
  MOVE16_16(LEDBLOCK_WIDTH,X1)                                        //      X1        =  LEDBLOCK_WIDTH
                                                                      //
NotGetWidth:                                                          //    }
                                                                      //
  JR_NEQ16(Function,DRAW_ICON,NotDrawIcon)                            //    if (Function == DRAW_ICON)
                                                                      //    {
  UI_DRAW(BMPFILE,FG_COLOR,X1,X2,'A_BLit')                            //      Draw bitmap
                                                                      //
NotDrawIcon:                                                          //    }
                                                                      //
  JR_NEQ16(Function,ACTIVATE,NotActivate)                             //    if (Function == ACTIVATE)
                                                                      //    {
  MOVE8_8(1,Stay)                                                     //      Stay      =  1
  MOVE16_16(1,X2)                                                     //      X2        =  1
  MOVE16_16(REFRESH,Function)                                         //      Function  =  REFRESH
NotActivate:                                                          //    }
                                                                      //
  JR_NEQ16(Function,REFRESH,NotRefresh)                               //    if (Function == REFRESH)
                                                                      //    {
  ADD16(X1,25,X3)                                                     //      X3  =  X1 + 25
  UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)                              //      UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)
                                                                      //      do
Refresh:                                                              //      {
  JR_NEQ16(X2,1,NotSelected)                                          //        if (X2)
                                                                      //        {
  JR_FALSE(Stay,NotStay)                                              //          if (Stay)
                                                                      //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKh')                              //            Draw bitmap
                                                                      //
  JR(EndStay)                                                         //          }
                                                                      //          else
NotStay:                                                              //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKs')                              //            Draw bitmap
                                                                      //
  ADD16(X1,25,X3)                                                     //            X3  =  X1 + 25
                                                                      //
  UI_DRAW(BMPFILE,FG_COLOR,X3,23,'ToLib')                             //            Draw bitmap
                                                                      //
EndStay:                                                              //          }
  JR(EndSelected)                                                     //        }
                                                                      //        else
NotSelected:                                                          //        {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKn')                              //          Draw bitmap
                                                                      //
EndSelected:                                                          //        }
  ADD16(X1,2,X3)                                                      //        X3  =  X1 + 2
  UI_DRAW(BMPFILE,FG_COLOR,X3,60,'A_BLit')                            //        Draw bitmap
                                                                      //
  STRINGS(NUMBER_TO_STRING,Par1,1,No)                                 //
  STRINGS(ADD,'A_BLitP',No,Name)                                      //
                                                                      //
  ADD16(X1,46,X3)                                                     //        X3  =  X1 + 46
  UI_DRAW(BMPFILE,FG_COLOR,X3,66,Name)                                //        Draw bitmap
                                                                      //
  JR_FALSE(Stay,DoNotWait)                                            //        if (Stay)
                                                                      //        {
  UI_DRAW(UPDATE)                                                     //          UI_DRAW(UPDATE)
  UI_BUTTON(FLUSH)                                                    //          UI_BUTTON(FLUSH)
  UI_BUTTON(WAIT_FOR_PRESS)                                           //          UI_BUTTON(WAIT_FOR_PRESS)
                                                                      //
  CALL(ControlPar,Index,Par1,Par2,LEDBLOCK_PAR1_MIN,LEDBLOCK_PAR1_MAX,Stay) //
DoNotWait:                                                            //        }
                                                                      //      }
  JR_TRUE(Stay,Refresh)                                               //      while(Stay)
NotRefresh:                                                           //    }
}                                                                     //  }
                                                                      //
// TouchBlock ******************************************************************************************
                                                                      //
define    TOUCHBLOCK_WIDTH          80                                //
define    TOUCHBLOCK_PAR1_MIN       1                                 //
define    TOUCHBLOCK_PAR1_DEFAULT   1                                 //
define    TOUCHBLOCK_PAR1_MAX       3                                 //
                                                                      //
subcall   TouchBlock                                                  //  TouchBlock
{                                                                     //  {
  IN_16   Function                                                    //    Function
  IO_16   Pointer                                                     //    Pointer (Cursor)
  IO_16   X1                                                          //    X coord
  IO_16   X2                                                          //    Y variable
                                                                      //
  DATAF   Tmp                                                         //
  DATA32  Index                                                       //    Array index
  DATA16  Par1                                                        //    Local parameter 1
  DATA16  Par2                                                        //    Local parameter 2
  DATA16  X3                                                          //
  DATA16  Y3                                                          //
  DATA16  Tmp16                                                       //
  DATA8   Stay                                                        //
  DATA8   State                                                       //
  DATAS   Name 32                                                     //
  DATAS   No 6                                                        //
                                                                      //
  MOVE16_32(Pointer,Index)                                            //
  ARRAY_READ(hBlockPar1,Index,Par1)                                   //
  ARRAY_READ(hBlockPar2,Index,Par2)                                   //
                                                                      //
  MOVE8_8(0,Stay)                                                     //    Stay        =  0
                                                                      //
  JR_NEQ16(Function,INIT,NotInit)                                     //    if (Function == INIT)
                                                                      //    {
  MOVE16_16(TOUCHBLOCK_PAR1_DEFAULT,Par1)                             //      Par1      =  TOUCHBLOCK_PAR1_DEFAULT
  MOVE16_16(0,Par2)                                                   //      Par2      =  0
  ARRAY_WRITE(hBlockPar1,Index,Par1)                                  //
  ARRAY_WRITE(hBlockPar2,Index,Par2)                                  //
NotInit:                                                              //    }
                                                                      //
  JR_NEQ16(Function,GET_WIDTH,NotGetWidth)                            //    if (Function == GET_WIDTH)
                                                                      //    {
  MOVE16_16(TOUCHBLOCK_WIDTH,X1)                                      //      X1        =  TOUCHBLOCK_WIDTH
                                                                      //
NotGetWidth:                                                          //    }
                                                                      //
  JR_NEQ16(Function,DRAW_ICON,NotDrawIcon)                            //    if (Function == DRAW_ICON)
                                                                      //    {
  UI_DRAW(BMPFILE,FG_COLOR,X1,X2,'W_Touch')                           //      Draw bitmap
                                                                      //
NotDrawIcon:                                                          //    }
                                                                      //
  JR_NEQ16(Function,ACTIVATE,NotActivate)                             //    if (Function == ACTIVATE)
                                                                      //    {
  MOVE8_8(1,Stay)                                                     //      Stay      =  1
  MOVE16_16(1,X2)                                                     //      X2        =  1
  MOVE16_16(REFRESH,Function)                                         //      Function  =  REFRESH
NotActivate:                                                          //    }
                                                                      //
  JR_NEQ16(Function,REFRESH,NotRefresh)                               //    if (Function == REFRESH)
                                                                      //    {
  ADD16(X1,25,X3)                                                     //      X3  =  X1 + 25
  UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)                              //      UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)
                                                                      //      do
Refresh:                                                              //      {
  JR_NEQ16(X2,1,NotSelected)                                          //        if (X2)
                                                                      //        {
  JR_FALSE(Stay,NotStay)                                              //          if (Stay)
                                                                      //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKh')                              //            Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //            X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Ph_1')                              //            Draw bitmap
                                                                      //
  JR(EndStay)                                                         //          }
                                                                      //          else
NotStay:                                                              //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKs')                              //            Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //            X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Ps_1')                              //            Draw bitmap
                                                                      //
  ADD16(X1,25,X3)                                                     //            X3  =  X1 + 25
                                                                      //
  UI_DRAW(BMPFILE,FG_COLOR,X3,23,'ToLib')                             //            Draw bitmap
                                                                      //
EndStay:                                                              //          }
  JR(EndSelected)                                                     //        }
                                                                      //        else
NotSelected:                                                          //        {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKn')                              //          Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //          X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Pn_1')                              //          Draw bitmap
                                                                      //
EndSelected:                                                          //        }
  ADD16(X1,2,X3)                                                      //        X3  =  X1 + 2
  UI_DRAW(BMPFILE,FG_COLOR,X3,60,'W_Touch')                           //        Draw bitmap
                                                                      //
  STRINGS(NUMBER_TO_STRING,Par1,1,No)                                 //
  STRINGS(ADD,'W_TouchP',No,Name)                                     //
                                                                      //
  ADD16(X1,46,X3)                                                     //        X3  =  X1 + 46
  UI_DRAW(BMPFILE,FG_COLOR,X3,66,Name)                                //        Draw bitmap
                                                                      //
  JR_FALSE(Stay,DoNotWait)                                            //        if (Stay)
                                                                      //        {
  UI_DRAW(UPDATE)                                                     //          UI_DRAW(UPDATE)
  UI_BUTTON(FLUSH)                                                    //          UI_BUTTON(FLUSH)
  UI_BUTTON(WAIT_FOR_PRESS)                                           //          UI_BUTTON(WAIT_FOR_PRESS)
                                                                      //
  CALL(ControlPar,Index,Par1,Par2,TOUCHBLOCK_PAR1_MIN,TOUCHBLOCK_PAR1_MAX,Stay) //
DoNotWait:                                                            //        }
                                                                      //      }
  JR_TRUE(Stay,Refresh)                                               //      while(Stay)
NotRefresh:                                                           //    }
}                                                                     //  }
                                                                      //
// ReflectedBlock **************************************************************************************
                                                                      //
define    REFLECTEDBLOCK_WIDTH          80                            //
define    REFLECTEDBLOCK_PAR1_MIN       1                             //
define    REFLECTEDBLOCK_PAR1_DEFAULT   5                             //
define    REFLECTEDBLOCK_PAR1_MAX       16                            //
                                                                      //
subcall   ReflectedBlock                                              //  ReflectedBlock
{                                                                     //  {
  IN_16   Function                                                    //    Function
  IO_16   Pointer                                                     //    Pointer (Cursor)
  IO_16   X1                                                          //    X coord
  IO_16   X2                                                          //    Y variable
                                                                      //
  DATAF   Tmp                                                         //
  DATA32  Index                                                       //    Array index
  DATA16  Par1                                                        //    Local parameter 1
  DATA16  Par2                                                        //    Local parameter 2
  DATA16  X3                                                          //
  DATA16  Y3                                                          //
  DATA16  Tmp16                                                       //
  DATA8   Stay                                                        //
  DATA8   State                                                       //
  DATAS   Name 32                                                     //
  DATAS   No 6                                                        //
                                                                      //
  MOVE16_32(Pointer,Index)                                            //
  ARRAY_READ(hBlockPar1,Index,Par1)                                   //
  ARRAY_READ(hBlockPar2,Index,Par2)                                   //
                                                                      //
  MOVE8_8(0,Stay)                                                     //    Stay        =  0
                                                                      //
  JR_NEQ16(Function,INIT,NotInit)                                     //    if (Function == INIT)
                                                                      //    {
  MOVE16_16(REFLECTEDBLOCK_PAR1_DEFAULT,Par1)                         //      Par1      =  REFLECTEDBLOCK_PAR1_DEFAULT
  MOVE16_16(0,Par2)                                                   //      Par2      =  0
  ARRAY_WRITE(hBlockPar1,Index,Par1)                                  //
  ARRAY_WRITE(hBlockPar2,Index,Par2)                                  //
NotInit:                                                              //    }
                                                                      //
  JR_NEQ16(Function,GET_WIDTH,NotGetWidth)                            //    if (Function == GET_WIDTH)
                                                                      //    {
  MOVE16_16(REFLECTEDBLOCK_WIDTH,X1)                                  //      X1        =  REFLECTEDBLOCK_WIDTH
                                                                      //
NotGetWidth:                                                          //    }
                                                                      //
  JR_NEQ16(Function,DRAW_ICON,NotDrawIcon)                            //    if (Function == DRAW_ICON)
                                                                      //    {
  UI_DRAW(BMPFILE,FG_COLOR,X1,X2,'W_colref')                          //      Draw bitmap
                                                                      //
NotDrawIcon:                                                          //    }
                                                                      //
  JR_NEQ16(Function,ACTIVATE,NotActivate)                             //    if (Function == ACTIVATE)
                                                                      //    {
  MOVE8_8(1,Stay)                                                     //      Stay      =  1
  MOVE16_16(1,X2)                                                     //      X2        =  1
  MOVE16_16(REFRESH,Function)                                         //      Function  =  REFRESH
NotActivate:                                                          //    }
                                                                      //
  JR_NEQ16(Function,REFRESH,NotRefresh)                               //    if (Function == REFRESH)
                                                                      //    {
  ADD16(X1,25,X3)                                                     //      X3  =  X1 + 25
  UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)                              //      UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)
                                                                      //      do
Refresh:                                                              //      {
  JR_NEQ16(X2,1,NotSelected)                                          //        if (X2)
                                                                      //        {
  JR_FALSE(Stay,NotStay)                                              //          if (Stay)
                                                                      //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKh')                              //            Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //            X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Ph_3')                              //            Draw bitmap
                                                                      //
  JR(EndStay)                                                         //          }
                                                                      //          else
NotStay:                                                              //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKs')                              //            Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //            X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Ps_3')                              //            Draw bitmap
                                                                      //
  ADD16(X1,25,X3)                                                     //            X3  =  X1 + 25
                                                                      //
  UI_DRAW(BMPFILE,FG_COLOR,X3,23,'ToLib')                             //            Draw bitmap
                                                                      //
EndStay:                                                              //          }
  JR(EndSelected)                                                     //        }
                                                                      //        else
NotSelected:                                                          //        {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKn')                              //          Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //          X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Pn_3')                              //          Draw bitmap
                                                                      //
EndSelected:                                                          //        }
  ADD16(X1,2,X3)                                                      //        X3  =  X1 + 2
  UI_DRAW(BMPFILE,FG_COLOR,X3,60,'W_colref')                          //        Draw bitmap
                                                                      //
  STRINGS(NUMBER_TO_STRING,Par1,2,No)                                 //
  STRINGS(ADD,'W_colrefP',No,Name)                                    //
                                                                      //
  ADD16(X1,46,X3)                                                     //        X3  =  X1 + 46
  UI_DRAW(BMPFILE,FG_COLOR,X3,66,Name)                                //        Draw bitmap
                                                                      //
  JR_FALSE(Stay,DoNotWait)                                            //        if (Stay)
                                                                      //        {
  UI_DRAW(UPDATE)                                                     //          UI_DRAW(UPDATE)
  UI_BUTTON(FLUSH)                                                    //          UI_BUTTON(FLUSH)
  UI_BUTTON(WAIT_FOR_PRESS)                                           //          UI_BUTTON(WAIT_FOR_PRESS)
                                                                      //
  CALL(ControlPar,Index,Par1,Par2,REFLECTEDBLOCK_PAR1_MIN,REFLECTEDBLOCK_PAR1_MAX,Stay) //
DoNotWait:                                                            //        }
                                                                      //      }
  JR_TRUE(Stay,Refresh)                                               //      while(Stay)
NotRefresh:                                                           //    }
}                                                                     //  }
                                                                      //
// BeaconBlock *****************************************************************************************
                                                                      //
define    BEACONBLOCK_WIDTH          80                               //
define    BEACONBLOCK_PAR1_MIN       1                                //
define    BEACONBLOCK_PAR1_DEFAULT   2                                //
define    BEACONBLOCK_PAR1_MAX       6                                //
                                                                      //
subcall   BeaconBlock                                                 //  BeaconBlock
{                                                                     //  {
  IN_16   Function                                                    //    Function
  IO_16   Pointer                                                     //    Pointer (Cursor)
  IO_16   X1                                                          //    X coord
  IO_16   X2                                                          //    Y variable
                                                                      //
  DATAF   Tmp                                                         //
  DATA32  Index                                                       //    Array index
  DATA16  Par1                                                        //    Local parameter 1
  DATA16  Par2                                                        //    Local parameter 2
  DATA16  X3                                                          //
  DATA16  Y3                                                          //
  DATA16  Tmp16                                                       //
  DATA8   Stay                                                        //
  DATA8   State                                                       //
  DATAS   Name 32                                                     //
  DATAS   No 6                                                        //
                                                                      //
  MOVE16_32(Pointer,Index)                                            //
  ARRAY_READ(hBlockPar1,Index,Par1)                                   //
  ARRAY_READ(hBlockPar2,Index,Par2)                                   //
                                                                      //
  MOVE8_8(0,Stay)                                                     //    Stay        =  0
                                                                      //
  JR_NEQ16(Function,INIT,NotInit)                                     //    if (Function == INIT)
                                                                      //    {
  MOVE16_16(BEACONBLOCK_PAR1_DEFAULT,Par1)                            //      Par1      =  BEACONBLOCK_PAR1_DEFAULT
  MOVE16_16(0,Par2)                                                   //      Par2      =  0
  ARRAY_WRITE(hBlockPar1,Index,Par1)                                  //
  ARRAY_WRITE(hBlockPar2,Index,Par2)                                  //
NotInit:                                                              //    }
                                                                      //
  JR_NEQ16(Function,GET_WIDTH,NotGetWidth)                            //    if (Function == GET_WIDTH)
                                                                      //    {
  MOVE16_16(BEACONBLOCK_WIDTH,X1)                                     //      X1        =  BEACONBLOCK_WIDTH
                                                                      //
NotGetWidth:                                                          //    }
                                                                      //
  JR_NEQ16(Function,DRAW_ICON,NotDrawIcon)                            //    if (Function == DRAW_ICON)
                                                                      //    {
  UI_DRAW(BMPFILE,FG_COLOR,X1,X2,'W_irrem')                           //      Draw bitmap
                                                                      //
NotDrawIcon:                                                          //    }
                                                                      //
  JR_NEQ16(Function,ACTIVATE,NotActivate)                             //    if (Function == ACTIVATE)
                                                                      //    {
  MOVE8_8(1,Stay)                                                     //      Stay      =  1
  MOVE16_16(1,X2)                                                     //      X2        =  1
  MOVE16_16(REFRESH,Function)                                         //      Function  =  REFRESH
NotActivate:                                                          //    }
                                                                      //
  JR_NEQ16(Function,REFRESH,NotRefresh)                               //    if (Function == REFRESH)
                                                                      //    {
  ADD16(X1,25,X3)                                                     //      X3  =  X1 + 25
  UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)                              //      UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)
                                                                      //      do
Refresh:                                                              //      {
  JR_NEQ16(X2,1,NotSelected)                                          //        if (X2)
                                                                      //        {
  JR_FALSE(Stay,NotStay)                                              //          if (Stay)
                                                                      //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKh')                              //            Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //            X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Ph_4')                              //            Draw bitmap
                                                                      //
  JR(EndStay)                                                         //          }
                                                                      //          else
NotStay:                                                              //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKs')                              //            Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //            X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Ps_4')                              //            Draw bitmap
                                                                      //
  ADD16(X1,25,X3)                                                     //            X3  =  X1 + 25
                                                                      //
  UI_DRAW(BMPFILE,FG_COLOR,X3,23,'ToLib')                             //            Draw bitmap
                                                                      //
EndStay:                                                              //          }
  JR(EndSelected)                                                     //        }
                                                                      //        else
NotSelected:                                                          //        {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKn')                              //          Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //          X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Pn_4')                              //          Draw bitmap
                                                                      //
EndSelected:                                                          //        }
  ADD16(X1,2,X3)                                                      //        X3  =  X1 + 2
  UI_DRAW(BMPFILE,FG_COLOR,X3,60,'W_irrem')                           //        Draw bitmap
                                                                      //
  STRINGS(NUMBER_TO_STRING,Par1,2,No)                                 //
  STRINGS(ADD,'W_irremP',No,Name)                                     //
                                                                      //
  ADD16(X1,46,X3)                                                     //        X3  =  X1 + 46
  UI_DRAW(BMPFILE,FG_COLOR,X3,66,Name)                                //        Draw bitmap
                                                                      //
  JR_FALSE(Stay,DoNotWait)                                            //        if (Stay)
                                                                      //        {
  UI_DRAW(UPDATE)                                                     //          UI_DRAW(UPDATE)
  UI_BUTTON(FLUSH)                                                    //          UI_BUTTON(FLUSH)
  UI_BUTTON(WAIT_FOR_PRESS)                                           //          UI_BUTTON(WAIT_FOR_PRESS)
                                                                      //
  CALL(ControlPar,Index,Par1,Par2,BEACONBLOCK_PAR1_MIN,BEACONBLOCK_PAR1_MAX,Stay) //
DoNotWait:                                                            //        }
                                                                      //      }
  JR_TRUE(Stay,Refresh)                                               //      while(Stay)
NotRefresh:                                                           //    }
}                                                                     //  }
                                                                      //
// EncoderBlock ****************************************************************************************
                                                                      //
define    ENCODERBLOCK_WIDTH          80                              //
define    ENCODERBLOCK_PAR1_MIN       1                               //
define    ENCODERBLOCK_PAR1_DEFAULT   8                               //
define    ENCODERBLOCK_PAR1_MAX       12                              //
                                                                      //
subcall   EncoderBlock                                                //  EncoderBlock
{                                                                     //  {
  IN_16   Function                                                    //    Function
  IO_16   Pointer                                                     //    Pointer (Cursor)
  IO_16   X1                                                          //    X coord
  IO_16   X2                                                          //    Y variable
                                                                      //
  DATAF   Tmp                                                         //
  DATA32  Index                                                       //    Array index
  DATA16  Par1                                                        //    Local parameter 1
  DATA16  Par2                                                        //    Local parameter 2
  DATA16  X3                                                          //
  DATA16  Y3                                                          //
  DATA16  Tmp16                                                       //
  DATA8   Stay                                                        //
  DATA8   State                                                       //
  DATAS   Name 32                                                     //
  DATAS   No 6                                                        //
                                                                      //
  MOVE16_32(Pointer,Index)                                            //
  ARRAY_READ(hBlockPar1,Index,Par1)                                   //
  ARRAY_READ(hBlockPar2,Index,Par2)                                   //
                                                                      //
  MOVE8_8(0,Stay)                                                     //    Stay        =  0
                                                                      //
  JR_NEQ16(Function,INIT,NotInit)                                     //    if (Function == INIT)
                                                                      //    {
  MOVE16_16(ENCODERBLOCK_PAR1_DEFAULT,Par1)                           //      Par1      =  ENCODERBLOCK_PAR1_DEFAULT
  MOVE16_16(0,Par2)                                                   //      Par2      =  0
  ARRAY_WRITE(hBlockPar1,Index,Par1)                                  //
  ARRAY_WRITE(hBlockPar2,Index,Par2)                                  //
NotInit:                                                              //    }
                                                                      //
  JR_NEQ16(Function,GET_WIDTH,NotGetWidth)                            //    if (Function == GET_WIDTH)
                                                                      //    {
  MOVE16_16(ENCODERBLOCK_WIDTH,X1)                                    //      X1        =  ENCODERBLOCK_WIDTH
                                                                      //
NotGetWidth:                                                          //    }
                                                                      //
  JR_NEQ16(Function,DRAW_ICON,NotDrawIcon)                            //    if (Function == DRAW_ICON)
                                                                      //    {
  UI_DRAW(BMPFILE,FG_COLOR,X1,X2,'W_mmot')                            //      Draw bitmap
                                                                      //
NotDrawIcon:                                                          //    }
                                                                      //
  JR_NEQ16(Function,ACTIVATE,NotActivate)                             //    if (Function == ACTIVATE)
                                                                      //    {
  MOVE8_8(1,Stay)                                                     //      Stay      =  1
  MOVE16_16(1,X2)                                                     //      X2        =  1
  MOVE16_16(REFRESH,Function)                                         //      Function  =  REFRESH
NotActivate:                                                          //    }
                                                                      //
  JR_NEQ16(Function,REFRESH,NotRefresh)                               //    if (Function == REFRESH)
                                                                      //    {
  ADD16(X1,25,X3)                                                     //      X3  =  X1 + 25
  UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)                              //      UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)
                                                                      //      do
Refresh:                                                              //      {
  JR_NEQ16(X2,1,NotSelected)                                          //        if (X2)
                                                                      //        {
  JR_FALSE(Stay,NotStay)                                              //          if (Stay)
                                                                      //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKh')                              //            Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //            X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Ph_a')                              //            Draw bitmap
                                                                      //
  JR(EndStay)                                                         //          }
                                                                      //          else
NotStay:                                                              //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKs')                              //            Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //            X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Ps_a')                              //            Draw bitmap
                                                                      //
  ADD16(X1,25,X3)                                                     //            X3  =  X1 + 25
                                                                      //
  UI_DRAW(BMPFILE,FG_COLOR,X3,23,'ToLib')                             //            Draw bitmap
                                                                      //
EndStay:                                                              //          }
  JR(EndSelected)                                                     //        }
                                                                      //        else
NotSelected:                                                          //        {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKn')                              //          Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //          X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Pn_a')                              //          Draw bitmap
                                                                      //
EndSelected:                                                          //        }
  ADD16(X1,2,X3)                                                      //        X3  =  X1 + 2
  UI_DRAW(BMPFILE,FG_COLOR,X3,60,'W_mmot')                            //        Draw bitmap
                                                                      //
  STRINGS(NUMBER_TO_STRING,Par1,2,No)                                 //
  STRINGS(ADD,'W_angP',No,Name)                                       //
                                                                      //
  ADD16(X1,46,X3)                                                     //        X3  =  X1 + 46
  UI_DRAW(BMPFILE,FG_COLOR,X3,66,Name)                                //        Draw bitmap
                                                                      //
  JR_FALSE(Stay,DoNotWait)                                            //        if (Stay)
                                                                      //        {
  UI_DRAW(UPDATE)                                                     //          UI_DRAW(UPDATE)
  UI_BUTTON(FLUSH)                                                    //          UI_BUTTON(FLUSH)
  UI_BUTTON(WAIT_FOR_PRESS)                                           //          UI_BUTTON(WAIT_FOR_PRESS)
                                                                      //
  CALL(ControlPar,Index,Par1,Par2,ENCODERBLOCK_PAR1_MIN,ENCODERBLOCK_PAR1_MAX,Stay) //
DoNotWait:                                                            //        }
                                                                      //      }
  JR_TRUE(Stay,Refresh)                                               //      while(Stay)
NotRefresh:                                                           //    }
}                                                                     //  }
                                                                      //
// AngleBlock ******************************************************************************************
                                                                      //
define    ANGLEBLOCK_WIDTH          80                                //
define    ANGLEBLOCK_PAR1_MIN       1                                 //
define    ANGLEBLOCK_PAR1_DEFAULT   8                                 //
define    ANGLEBLOCK_PAR1_MAX       12                                //
                                                                      //
subcall   AngleBlock                                                  //  AngleBlock
{                                                                     //  {
  IN_16   Function                                                    //    Function
  IO_16   Pointer                                                     //    Pointer (Cursor)
  IO_16   X1                                                          //    X coord
  IO_16   X2                                                          //    Y variable
                                                                      //
  DATAF   Tmp                                                         //
  DATA32  Index                                                       //    Array index
  DATA16  Par1                                                        //    Local parameter 1
  DATA16  Par2                                                        //    Local parameter 2
  DATA16  X3                                                          //
  DATA16  Y3                                                          //
  DATA16  Tmp16                                                       //
  DATA8   Stay                                                        //
  DATA8   State                                                       //
  DATAS   Name 32                                                     //
  DATAS   No 6                                                        //
                                                                      //
  MOVE16_32(Pointer,Index)                                            //
  ARRAY_READ(hBlockPar1,Index,Par1)                                   //
  ARRAY_READ(hBlockPar2,Index,Par2)                                   //
                                                                      //
  MOVE8_8(0,Stay)                                                     //    Stay        =  0
                                                                      //
  JR_NEQ16(Function,INIT,NotInit)                                     //    if (Function == INIT)
                                                                      //    {
  MOVE16_16(ANGLEBLOCK_PAR1_DEFAULT,Par1)                             //      Par1      =  ANGLEBLOCK_PAR1_DEFAULT
  MOVE16_16(0,Par2)                                                   //      Par2      =  0
  ARRAY_WRITE(hBlockPar1,Index,Par1)                                  //
  ARRAY_WRITE(hBlockPar2,Index,Par2)                                  //
NotInit:                                                              //    }
                                                                      //
  JR_NEQ16(Function,GET_WIDTH,NotGetWidth)                            //    if (Function == GET_WIDTH)
                                                                      //    {
  MOVE16_16(ANGLEBLOCK_WIDTH,X1)                                      //      X1        =  ANGLEBLOCK_WIDTH
                                                                      //
NotGetWidth:                                                          //    }
                                                                      //
  JR_NEQ16(Function,DRAW_ICON,NotDrawIcon)                            //    if (Function == DRAW_ICON)
                                                                      //    {
  UI_DRAW(BMPFILE,FG_COLOR,X1,X2,'W_gyro')                            //      Draw bitmap
                                                                      //
NotDrawIcon:                                                          //    }
                                                                      //
  JR_NEQ16(Function,ACTIVATE,NotActivate)                             //    if (Function == ACTIVATE)
                                                                      //    {
  MOVE8_8(1,Stay)                                                     //      Stay      =  1
  MOVE16_16(1,X2)                                                     //      X2        =  1
  MOVE16_16(REFRESH,Function)                                         //      Function  =  REFRESH
NotActivate:                                                          //    }
                                                                      //
  JR_NEQ16(Function,REFRESH,NotRefresh)                               //    if (Function == REFRESH)
                                                                      //    {
  ADD16(X1,25,X3)                                                     //      X3  =  X1 + 25
  UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)                              //      UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)
                                                                      //      do
Refresh:                                                              //      {
  JR_NEQ16(X2,1,NotSelected)                                          //        if (X2)
                                                                      //        {
  JR_FALSE(Stay,NotStay)                                              //          if (Stay)
                                                                      //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKh')                              //            Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //            X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Ph_2')                              //            Draw bitmap
                                                                      //
  JR(EndStay)                                                         //          }
                                                                      //          else
NotStay:                                                              //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKs')                              //            Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //            X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Ps_2')                              //            Draw bitmap
                                                                      //
  ADD16(X1,25,X3)                                                     //            X3  =  X1 + 25
                                                                      //
  UI_DRAW(BMPFILE,FG_COLOR,X3,23,'ToLib')                             //            Draw bitmap
                                                                      //
EndStay:                                                              //          }
  JR(EndSelected)                                                     //        }
                                                                      //        else
NotSelected:                                                          //        {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKn')                              //          Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //          X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Pn_2')                              //          Draw bitmap
                                                                      //
EndSelected:                                                          //        }
  ADD16(X1,2,X3)                                                      //        X3  =  X1 + 2
  UI_DRAW(BMPFILE,FG_COLOR,X3,60,'W_gyro')                            //        Draw bitmap
                                                                      //
  STRINGS(NUMBER_TO_STRING,Par1,2,No)                                 //
  STRINGS(ADD,'W_angP',No,Name)                                       //
                                                                      //
  ADD16(X1,46,X3)                                                     //        X3  =  X1 + 46
  UI_DRAW(BMPFILE,FG_COLOR,X3,66,Name)                                //        Draw bitmap
                                                                      //
  JR_FALSE(Stay,DoNotWait)                                            //        if (Stay)
                                                                      //        {
  UI_DRAW(UPDATE)                                                     //          UI_DRAW(UPDATE)
  UI_BUTTON(FLUSH)                                                    //          UI_BUTTON(FLUSH)
  UI_BUTTON(WAIT_FOR_PRESS)                                           //          UI_BUTTON(WAIT_FOR_PRESS)
                                                                      //
  CALL(ControlPar,Index,Par1,Par2,ANGLEBLOCK_PAR1_MIN,ANGLEBLOCK_PAR1_MAX,Stay) //
DoNotWait:                                                            //        }
                                                                      //      }
  JR_TRUE(Stay,Refresh)                                               //      while(Stay)
NotRefresh:                                                           //    }
}                                                                     //  }
                                                                      //
// ColorBlock ******************************************************************************************
                                                                      //
define    COLORBLOCK_WIDTH          80                                //
define    COLORBLOCK_PAR1_MIN       1                                 //
define    COLORBLOCK_PAR1_DEFAULT   2                                 //
define    COLORBLOCK_PAR1_MAX       8                                 //
                                                                      //
subcall   ColorBlock                                                  //  ColorBlock
{                                                                     //  {
  IN_16   Function                                                    //    Function
  IO_16   Pointer                                                     //    Pointer (Cursor)
  IO_16   X1                                                          //    X coord
  IO_16   X2                                                          //    Y variable
                                                                      //
  DATAF   Tmp                                                         //
  DATA32  Index                                                       //    Array index
  DATA16  Par1                                                        //    Local parameter 1
  DATA16  Par2                                                        //    Local parameter 2
  DATA16  X3                                                          //
  DATA16  Y3                                                          //
  DATA16  Tmp16                                                       //
  DATA8   Stay                                                        //
  DATA8   State                                                       //
  DATAS   Name 32                                                     //
  DATAS   No 6                                                        //
                                                                      //
  MOVE16_32(Pointer,Index)                                            //
  ARRAY_READ(hBlockPar1,Index,Par1)                                   //
  ARRAY_READ(hBlockPar2,Index,Par2)                                   //
                                                                      //
  MOVE8_8(0,Stay)                                                     //    Stay        =  0
                                                                      //
  JR_NEQ16(Function,INIT,NotInit)                                     //    if (Function == INIT)
                                                                      //    {
  MOVE16_16(COLORBLOCK_PAR1_DEFAULT,Par1)                             //      Par1      =  COLORBLOCK_PAR1_DEFAULT
  MOVE16_16(0,Par2)                                                   //      Par2      =  0
  ARRAY_WRITE(hBlockPar1,Index,Par1)                                  //
  ARRAY_WRITE(hBlockPar2,Index,Par2)                                  //
NotInit:                                                              //    }
                                                                      //
  JR_NEQ16(Function,GET_WIDTH,NotGetWidth)                            //    if (Function == GET_WIDTH)
                                                                      //    {
  MOVE16_16(COLORBLOCK_WIDTH,X1)                                      //      X1        =  COLORBLOCK_WIDTH
                                                                      //
NotGetWidth:                                                          //    }
                                                                      //
  JR_NEQ16(Function,DRAW_ICON,NotDrawIcon)                            //    if (Function == DRAW_ICON)
                                                                      //    {
  UI_DRAW(BMPFILE,FG_COLOR,X1,X2,'W_colcol')                          //      Draw bitmap
                                                                      //
NotDrawIcon:                                                          //    }
                                                                      //
  JR_NEQ16(Function,ACTIVATE,NotActivate)                             //    if (Function == ACTIVATE)
                                                                      //    {
  MOVE8_8(1,Stay)                                                     //      Stay      =  1
  MOVE16_16(1,X2)                                                     //      X2        =  1
  MOVE16_16(REFRESH,Function)                                         //      Function  =  REFRESH
NotActivate:                                                          //    }
                                                                      //
  JR_NEQ16(Function,REFRESH,NotRefresh)                               //    if (Function == REFRESH)
                                                                      //    {
  ADD16(X1,25,X3)                                                     //      X3  =  X1 + 25
  UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)                              //      UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)
                                                                      //      do
Refresh:                                                              //      {
  JR_NEQ16(X2,1,NotSelected)                                          //        if (X2)
                                                                      //        {
  JR_FALSE(Stay,NotStay)                                              //          if (Stay)
                                                                      //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKh')                              //            Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //            X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Ph_3')                              //            Draw bitmap
                                                                      //
  JR(EndStay)                                                         //          }
                                                                      //          else
NotStay:                                                              //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKs')                              //            Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //            X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Ps_3')                              //            Draw bitmap
                                                                      //
  ADD16(X1,25,X3)                                                     //            X3  =  X1 + 25
                                                                      //
  UI_DRAW(BMPFILE,FG_COLOR,X3,23,'ToLib')                             //            Draw bitmap
                                                                      //
EndStay:                                                              //          }
  JR(EndSelected)                                                     //        }
                                                                      //        else
NotSelected:                                                          //        {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKn')                              //          Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //          X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Pn_3')                              //          Draw bitmap
                                                                      //
EndSelected:                                                          //        }
  ADD16(X1,2,X3)                                                      //        X3  =  X1 + 2
  UI_DRAW(BMPFILE,FG_COLOR,X3,60,'W_colcol')                          //        Draw bitmap
                                                                      //
  STRINGS(NUMBER_TO_STRING,Par1,1,No)                                 //
  STRINGS(ADD,'W_colcolP',No,Name)                                    //
                                                                      //
  ADD16(X1,46,X3)                                                     //        X3  =  X1 + 46
  UI_DRAW(BMPFILE,FG_COLOR,X3,66,Name)                                //        Draw bitmap
                                                                      //
  JR_FALSE(Stay,DoNotWait)                                            //        if (Stay)
                                                                      //        {
  UI_DRAW(UPDATE)                                                     //          UI_DRAW(UPDATE)
  UI_BUTTON(FLUSH)                                                    //          UI_BUTTON(FLUSH)
  UI_BUTTON(WAIT_FOR_PRESS)                                           //          UI_BUTTON(WAIT_FOR_PRESS)
                                                                      //
  CALL(ControlPar,Index,Par1,Par2,COLORBLOCK_PAR1_MIN,COLORBLOCK_PAR1_MAX,Stay) //
DoNotWait:                                                            //        }
                                                                      //      }
  JR_TRUE(Stay,Refresh)                                               //      while(Stay)
NotRefresh:                                                           //    }
}                                                                     //  }
                                                                      //
// TemperatureBlock ************************************************************************************
                                                                      //
define    TEMPERATUREBLOCK_WIDTH          80                          //
define    TEMPERATUREBLOCK_PAR1_MIN       1                           //
define    TEMPERATUREBLOCK_PAR1_DEFAULT   4                           //
define    TEMPERATUREBLOCK_PAR1_MAX       16                          //
                                                                      //
subcall   TemperatureBlock                                            //  TemperatureBlock
{                                                                     //  {
  IN_16   Function                                                    //    Function
  IO_16   Pointer                                                     //    Pointer (Cursor)
  IO_16   X1                                                          //    X coord
  IO_16   X2                                                          //    Y variable
                                                                      //
  DATAF   Tmp                                                         //
  DATA32  Index                                                       //    Array index
  DATA16  Par1                                                        //    Local parameter 1
  DATA16  Par2                                                        //    Local parameter 2
  DATA16  X3                                                          //
  DATA16  Y3                                                          //
  DATA16  Tmp16                                                       //
  DATA8   Stay                                                        //
  DATA8   State                                                       //
  DATAS   Name 32                                                     //
  DATAS   No 6                                                        //
                                                                      //
  MOVE16_32(Pointer,Index)                                            //
  ARRAY_READ(hBlockPar1,Index,Par1)                                   //
  ARRAY_READ(hBlockPar2,Index,Par2)                                   //
                                                                      //
  MOVE8_8(0,Stay)                                                     //    Stay        =  0
                                                                      //
  JR_NEQ16(Function,INIT,NotInit)                                     //    if (Function == INIT)
                                                                      //    {
  MOVE16_16(TEMPERATUREBLOCK_PAR1_DEFAULT,Par1)                       //      Par1      =  TEMPERATUREBLOCK_PAR1_DEFAULT
  MOVE16_16(0,Par2)                                                   //      Par2      =  0
  ARRAY_WRITE(hBlockPar1,Index,Par1)                                  //
  ARRAY_WRITE(hBlockPar2,Index,Par2)                                  //
NotInit:                                                              //    }
                                                                      //
  JR_NEQ16(Function,GET_WIDTH,NotGetWidth)                            //    if (Function == GET_WIDTH)
                                                                      //    {
  MOVE16_16(TEMPERATUREBLOCK_WIDTH,X1)                                //      X1        =  TEMPERATUREBLOCK_WIDTH
                                                                      //
NotGetWidth:                                                          //    }
                                                                      //
  JR_NEQ16(Function,DRAW_ICON,NotDrawIcon)                            //    if (Function == DRAW_ICON)
                                                                      //    {
  UI_DRAW(BMPFILE,FG_COLOR,X1,X2,'W_temp')                            //      Draw bitmap
                                                                      //
NotDrawIcon:                                                          //    }
                                                                      //
  JR_NEQ16(Function,ACTIVATE,NotActivate)                             //    if (Function == ACTIVATE)
                                                                      //    {
  MOVE8_8(1,Stay)                                                     //      Stay      =  1
  MOVE16_16(1,X2)                                                     //      X2        =  1
  MOVE16_16(REFRESH,Function)                                         //      Function  =  REFRESH
NotActivate:                                                          //    }
                                                                      //
  JR_NEQ16(Function,REFRESH,NotRefresh)                               //    if (Function == REFRESH)
                                                                      //    {
  ADD16(X1,25,X3)                                                     //      X3  =  X1 + 25
  UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)                              //      UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)
                                                                      //      do
Refresh:                                                              //      {
  JR_NEQ16(X2,1,NotSelected)                                          //        if (X2)
                                                                      //        {
  JR_FALSE(Stay,NotStay)                                              //          if (Stay)
                                                                      //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKh')                              //            Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //            X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Ph_2')                              //            Draw bitmap
                                                                      //
  JR(EndStay)                                                         //          }
                                                                      //          else
NotStay:                                                              //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKs')                              //            Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //            X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Ps_2')                              //            Draw bitmap
                                                                      //
  ADD16(X1,25,X3)                                                     //            X3  =  X1 + 25
                                                                      //
  UI_DRAW(BMPFILE,FG_COLOR,X3,23,'ToLib')                             //            Draw bitmap
                                                                      //
EndStay:                                                              //          }
  JR(EndSelected)                                                     //        }
                                                                      //        else
NotSelected:                                                          //        {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKn')                              //          Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //          X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Pn_2')                              //          Draw bitmap
                                                                      //
EndSelected:                                                          //        }
  ADD16(X1,2,X3)                                                      //        X3  =  X1 + 2
  UI_DRAW(BMPFILE,FG_COLOR,X3,60,'W_temp')                            //        Draw bitmap
                                                                      //
  STRINGS(NUMBER_TO_STRING,Par1,2,No)                                 //
  STRINGS(ADD,'W_tempP',No,Name)                                      //
                                                                      //
  ADD16(X1,46,X3)                                                     //        X3  =  X1 + 46
  UI_DRAW(BMPFILE,FG_COLOR,X3,66,Name)                                //        Draw bitmap
                                                                      //
  JR_FALSE(Stay,DoNotWait)                                            //        if (Stay)
                                                                      //        {
  UI_DRAW(UPDATE)                                                     //          UI_DRAW(UPDATE)
  UI_BUTTON(FLUSH)                                                    //          UI_BUTTON(FLUSH)
  UI_BUTTON(WAIT_FOR_PRESS)                                           //          UI_BUTTON(WAIT_FOR_PRESS)
                                                                      //
  CALL(ControlPar,Index,Par1,Par2,TEMPERATUREBLOCK_PAR1_MIN,TEMPERATUREBLOCK_PAR1_MAX,Stay) //
DoNotWait:                                                            //        }
                                                                      //      }
  JR_TRUE(Stay,Refresh)                                               //      while(Stay)
NotRefresh:                                                           //    }
}                                                                     //  }
                                                                      //
// UltrasonicBlock *************************************************************************************
                                                                      //
define    ULTRASONICBLOCK_WIDTH          80                           //
define    ULTRASONICBLOCK_PAR1_MIN       1                            //
define    ULTRASONICBLOCK_PAR1_DEFAULT   5                            //
define    ULTRASONICBLOCK_PAR1_MAX       16                           //
                                                                      //
subcall   UltrasonicBlock                                             //  UltrasonicBlock
{                                                                     //  {
  IN_16   Function                                                    //    Function
  IO_16   Pointer                                                     //    Pointer (Cursor)
  IO_16   X1                                                          //    X coord
  IO_16   X2                                                          //    Y variable
                                                                      //
  DATAF   Tmp                                                         //
  DATA32  Index                                                       //    Array index
  DATA16  Par1                                                        //    Local parameter 1
  DATA16  Par2                                                        //    Local parameter 2
  DATA16  X3                                                          //
  DATA16  Y3                                                          //
  DATA16  Tmp16                                                       //
  DATA8   Stay                                                        //
  DATA8   State                                                       //
  DATAS   Name 32                                                     //
  DATAS   No 6                                                        //
                                                                      //
  MOVE16_32(Pointer,Index)                                            //
  ARRAY_READ(hBlockPar1,Index,Par1)                                   //
  ARRAY_READ(hBlockPar2,Index,Par2)                                   //
                                                                      //
  MOVE8_8(0,Stay)                                                     //    Stay        =  0
                                                                      //
  JR_NEQ16(Function,INIT,NotInit)                                     //    if (Function == INIT)
                                                                      //    {
  MOVE16_16(ULTRASONICBLOCK_PAR1_DEFAULT,Par1)                        //      Par1      =  ULTRASONICBLOCK_PAR1_DEFAULT
  MOVE16_16(0,Par2)                                                   //      Par2      =  0
  ARRAY_WRITE(hBlockPar1,Index,Par1)                                  //
  ARRAY_WRITE(hBlockPar2,Index,Par2)                                  //
NotInit:                                                              //    }
                                                                      //
  JR_NEQ16(Function,GET_WIDTH,NotGetWidth)                            //    if (Function == GET_WIDTH)
                                                                      //    {
  MOVE16_16(ULTRASONICBLOCK_WIDTH,X1)                                 //      X1        =  ULTRASONICBLOCK_WIDTH
                                                                      //
NotGetWidth:                                                          //    }
                                                                      //
  JR_NEQ16(Function,DRAW_ICON,NotDrawIcon)                            //    if (Function == DRAW_ICON)
                                                                      //    {
  UI_DRAW(BMPFILE,FG_COLOR,X1,X2,'W_us')                              //      Draw bitmap
                                                                      //
NotDrawIcon:                                                          //    }
                                                                      //
  JR_NEQ16(Function,ACTIVATE,NotActivate)                             //    if (Function == ACTIVATE)
                                                                      //    {
  MOVE8_8(1,Stay)                                                     //      Stay      =  1
  MOVE16_16(1,X2)                                                     //      X2        =  1
  MOVE16_16(REFRESH,Function)                                         //      Function  =  REFRESH
NotActivate:                                                          //    }
                                                                      //
  JR_NEQ16(Function,REFRESH,NotRefresh)                               //    if (Function == REFRESH)
                                                                      //    {
  ADD16(X1,25,X3)                                                     //      X3  =  X1 + 25
  UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)                              //      UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)
                                                                      //      do
Refresh:                                                              //      {
  JR_NEQ16(X2,1,NotSelected)                                          //        if (X2)
                                                                      //        {
  JR_FALSE(Stay,NotStay)                                              //          if (Stay)
                                                                      //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKh')                              //            Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //            X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Ph_4')                              //            Draw bitmap
                                                                      //
  JR(EndStay)                                                         //          }
                                                                      //          else
NotStay:                                                              //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKs')                              //            Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //            X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Ps_4')                              //            Draw bitmap
                                                                      //
  ADD16(X1,25,X3)                                                     //            X3  =  X1 + 25
                                                                      //
  UI_DRAW(BMPFILE,FG_COLOR,X3,23,'ToLib')                             //            Draw bitmap
                                                                      //
EndStay:                                                              //          }
  JR(EndSelected)                                                     //        }
                                                                      //        else
NotSelected:                                                          //        {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKn')                              //          Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //          X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Pn_4')                              //          Draw bitmap
                                                                      //
EndSelected:                                                          //        }
  ADD16(X1,2,X3)                                                      //        X3  =  X1 + 2
  UI_DRAW(BMPFILE,FG_COLOR,X3,60,'W_us')                              //        Draw bitmap
                                                                      //
  STRINGS(NUMBER_TO_STRING,Par1,2,No)                                 //
  STRINGS(ADD,'W_usP',No,Name)                                        //
                                                                      //
  ADD16(X1,46,X3)                                                     //        X3  =  X1 + 46
  UI_DRAW(BMPFILE,FG_COLOR,X3,66,Name)                                //        Draw bitmap
                                                                      //
  JR_FALSE(Stay,DoNotWait)                                            //        if (Stay)
                                                                      //        {
  UI_DRAW(UPDATE)                                                     //          UI_DRAW(UPDATE)
  UI_BUTTON(FLUSH)                                                    //          UI_BUTTON(FLUSH)
  UI_BUTTON(WAIT_FOR_PRESS)                                           //          UI_BUTTON(WAIT_FOR_PRESS)
                                                                      //
  CALL(ControlPar,Index,Par1,Par2,ULTRASONICBLOCK_PAR1_MIN,ULTRASONICBLOCK_PAR1_MAX,Stay) //
DoNotWait:                                                            //        }
                                                                      //      }
  JR_TRUE(Stay,Refresh)                                               //      while(Stay)
NotRefresh:                                                           //    }
}                                                                     //  }
                                                                      //
// ProximityBlock **************************************************************************************
                                                                      //
define    PROXIMITYBLOCK_WIDTH          80                            //
define    PROXIMITYBLOCK_PAR1_MIN       1                             //
define    PROXIMITYBLOCK_PAR1_DEFAULT   3                             //
define    PROXIMITYBLOCK_PAR1_MAX       8                             //
                                                                      //
subcall   ProximityBlock                                              //  ProximityBlock
{                                                                     //  {
  IN_16   Function                                                    //    Function
  IO_16   Pointer                                                     //    Pointer (Cursor)
  IO_16   X1                                                          //    X coord
  IO_16   X2                                                          //    Y variable
                                                                      //
  DATAF   Tmp                                                         //
  DATA32  Index                                                       //    Array index
  DATA16  Par1                                                        //    Local parameter 1
  DATA16  Par2                                                        //    Local parameter 2
  DATA16  X3                                                          //
  DATA16  Y3                                                          //
  DATA16  Tmp16                                                       //
  DATA8   Stay                                                        //
  DATA8   State                                                       //
  DATAS   Name 32                                                     //
  DATAS   No 6                                                        //
                                                                      //
  MOVE16_32(Pointer,Index)                                            //
  ARRAY_READ(hBlockPar1,Index,Par1)                                   //
  ARRAY_READ(hBlockPar2,Index,Par2)                                   //
                                                                      //
  MOVE8_8(0,Stay)                                                     //    Stay        =  0
                                                                      //
  JR_NEQ16(Function,INIT,NotInit)                                     //    if (Function == INIT)
                                                                      //    {
  MOVE16_16(PROXIMITYBLOCK_PAR1_DEFAULT,Par1)                         //      Par1      =  PROXIMITYBLOCK_PAR1_DEFAULT
  MOVE16_16(0,Par2)                                                   //      Par2      =  0
  ARRAY_WRITE(hBlockPar1,Index,Par1)                                  //
  ARRAY_WRITE(hBlockPar2,Index,Par2)                                  //
NotInit:                                                              //    }
                                                                      //
  JR_NEQ16(Function,GET_WIDTH,NotGetWidth)                            //    if (Function == GET_WIDTH)
                                                                      //    {
  MOVE16_16(PROXIMITYBLOCK_WIDTH,X1)                                  //      X1        =  PROXIMITYBLOCK_WIDTH
                                                                      //
NotGetWidth:                                                          //    }
                                                                      //
  JR_NEQ16(Function,DRAW_ICON,NotDrawIcon)                            //    if (Function == DRAW_ICON)
                                                                      //    {
  UI_DRAW(BMPFILE,FG_COLOR,X1,X2,'W_irprox')                          //      Draw bitmap
                                                                      //
NotDrawIcon:                                                          //    }
                                                                      //
  JR_NEQ16(Function,ACTIVATE,NotActivate)                             //    if (Function == ACTIVATE)
                                                                      //    {
  MOVE8_8(1,Stay)                                                     //      Stay      =  1
  MOVE16_16(1,X2)                                                     //      X2        =  1
  MOVE16_16(REFRESH,Function)                                         //      Function  =  REFRESH
NotActivate:                                                          //    }
                                                                      //
  JR_NEQ16(Function,REFRESH,NotRefresh)                               //    if (Function == REFRESH)
                                                                      //    {
  ADD16(X1,25,X3)                                                     //      X3  =  X1 + 25
  UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)                              //      UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)
                                                                      //      do
Refresh:                                                              //      {
  JR_NEQ16(X2,1,NotSelected)                                          //        if (X2)
                                                                      //        {
  JR_FALSE(Stay,NotStay)                                              //          if (Stay)
                                                                      //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKh')                              //            Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //            X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Ph_4')                              //            Draw bitmap
                                                                      //
  JR(EndStay)                                                         //          }
                                                                      //          else
NotStay:                                                              //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKs')                              //            Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //            X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Ps_4')                              //            Draw bitmap
                                                                      //
  ADD16(X1,25,X3)                                                     //            X3  =  X1 + 25
                                                                      //
  UI_DRAW(BMPFILE,FG_COLOR,X3,23,'ToLib')                             //            Draw bitmap
                                                                      //
EndStay:                                                              //          }
  JR(EndSelected)                                                     //        }
                                                                      //        else
NotSelected:                                                          //        {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKn')                              //          Draw bitmap
                                                                      //
  ADD16(X1,44,X3)                                                     //          X3  =  X1 + 44
  UI_DRAW(BMPFILE,FG_COLOR,X3,36,'Pn_4')                              //          Draw bitmap
                                                                      //
EndSelected:                                                          //        }
  ADD16(X1,2,X3)                                                      //        X3  =  X1 + 2
  UI_DRAW(BMPFILE,FG_COLOR,X3,60,'W_irprox')                          //        Draw bitmap
                                                                      //
  STRINGS(NUMBER_TO_STRING,Par1,2,No)                                 //
  STRINGS(ADD,'W_irproxP',No,Name)                                    //
                                                                      //
  ADD16(X1,46,X3)                                                     //        X3  =  X1 + 46
  UI_DRAW(BMPFILE,FG_COLOR,X3,66,Name)                                //        Draw bitmap
                                                                      //
  JR_FALSE(Stay,DoNotWait)                                            //        if (Stay)
                                                                      //        {
  UI_DRAW(UPDATE)                                                     //          UI_DRAW(UPDATE)
  UI_BUTTON(FLUSH)                                                    //          UI_BUTTON(FLUSH)
  UI_BUTTON(WAIT_FOR_PRESS)                                           //          UI_BUTTON(WAIT_FOR_PRESS)
                                                                      //
  CALL(ControlPar,Index,Par1,Par2,PROXIMITYBLOCK_PAR1_MIN,PROXIMITYBLOCK_PAR1_MAX,Stay) //
DoNotWait:                                                            //        }
                                                                      //      }
  JR_TRUE(Stay,Refresh)                                               //      while(Stay)
NotRefresh:                                                           //    }
}                                                                     //  }
                                                                      //
// ButtonBlock *****************************************************************************************
                                                                      //
define    BUTTONBLOCK_WIDTH          80                               //
define    BUTTONBLOCK_PAR1_MIN       1                                //
define    BUTTONBLOCK_PAR1_DEFAULT   1                                //
define    BUTTONBLOCK_PAR1_MAX       5                                //
                                                                      //
subcall   ButtonBlock                                                 //  ButtonBlock
{                                                                     //  {
  IN_16   Function                                                    //    Function
  IO_16   Pointer                                                     //    Pointer (Cursor)
  IO_16   X1                                                          //    X coord
  IO_16   X2                                                          //    Y variable
                                                                      //
  DATAF   Tmp                                                         //
  DATA32  Index                                                       //    Array index
  DATA16  Par1                                                        //    Local parameter 1
  DATA16  Par2                                                        //    Local parameter 2
  DATA16  X3                                                          //
  DATA16  Y3                                                          //
  DATA16  Tmp16                                                       //
  DATA8   Stay                                                        //
  DATA8   State                                                       //
  DATAS   Name 32                                                     //
  DATAS   No 6                                                        //
                                                                      //
  MOVE16_32(Pointer,Index)                                            //
  ARRAY_READ(hBlockPar1,Index,Par1)                                   //
  ARRAY_READ(hBlockPar2,Index,Par2)                                   //
                                                                      //
  MOVE8_8(0,Stay)                                                     //    Stay        =  0
                                                                      //
  JR_NEQ16(Function,INIT,NotInit)                                     //    if (Function == INIT)
                                                                      //    {
  MOVE16_16(BUTTONBLOCK_PAR1_DEFAULT,Par1)                            //      Par1      =  BUTTONBLOCK_PAR1_DEFAULT
  MOVE16_16(0,Par2)                                                   //      Par2      =  0
  ARRAY_WRITE(hBlockPar1,Index,Par1)                                  //
  ARRAY_WRITE(hBlockPar2,Index,Par2)                                  //
NotInit:                                                              //    }
                                                                      //
  JR_NEQ16(Function,GET_WIDTH,NotGetWidth)                            //    if (Function == GET_WIDTH)
                                                                      //    {
  MOVE16_16(BUTTONBLOCK_WIDTH,X1)                                     //      X1        =  BUTTONBLOCK_WIDTH
                                                                      //
NotGetWidth:                                                          //    }
                                                                      //
  JR_NEQ16(Function,DRAW_ICON,NotDrawIcon)                            //    if (Function == DRAW_ICON)
                                                                      //    {
  UI_DRAW(BMPFILE,FG_COLOR,X1,X2,'W_bbut')                            //      Draw bitmap
                                                                      //
NotDrawIcon:                                                          //    }
                                                                      //
  JR_NEQ16(Function,ACTIVATE,NotActivate)                             //    if (Function == ACTIVATE)
                                                                      //    {
  MOVE8_8(1,Stay)                                                     //      Stay      =  1
  MOVE16_16(1,X2)                                                     //      X2        =  1
  MOVE16_16(REFRESH,Function)                                         //      Function  =  REFRESH
NotActivate:                                                          //    }
                                                                      //
  JR_NEQ16(Function,REFRESH,NotRefresh)                               //    if (Function == REFRESH)
                                                                      //    {
  ADD16(X1,25,X3)                                                     //      X3  =  X1 + 25
  UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)                              //      UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)
                                                                      //      do
Refresh:                                                              //      {
  JR_NEQ16(X2,1,NotSelected)                                          //        if (X2)
                                                                      //        {
  JR_FALSE(Stay,NotStay)                                              //          if (Stay)
                                                                      //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKh')                              //            Draw bitmap
                                                                      //
  JR(EndStay)                                                         //          }
                                                                      //          else
NotStay:                                                              //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKs')                              //            Draw bitmap
                                                                      //
  ADD16(X1,25,X3)                                                     //            X3  =  X1 + 25
                                                                      //
  UI_DRAW(BMPFILE,FG_COLOR,X3,23,'ToLib')                             //            Draw bitmap
                                                                      //
EndStay:                                                              //          }
  JR(EndSelected)                                                     //        }
                                                                      //        else
NotSelected:                                                          //        {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKn')                              //          Draw bitmap
                                                                      //
EndSelected:                                                          //        }
  ADD16(X1,2,X3)                                                      //        X3  =  X1 + 2
  UI_DRAW(BMPFILE,FG_COLOR,X3,60,'W_bbut')                            //        Draw bitmap
                                                                      //
  STRINGS(NUMBER_TO_STRING,Par1,1,No)                                 //
  STRINGS(ADD,'W_bbutP',No,Name)                                      //
                                                                      //
  ADD16(X1,46,X3)                                                     //        X3  =  X1 + 46
  UI_DRAW(BMPFILE,FG_COLOR,X3,66,Name)                                //        Draw bitmap
                                                                      //
  JR_FALSE(Stay,DoNotWait)                                            //        if (Stay)
                                                                      //        {
  UI_DRAW(UPDATE)                                                     //          UI_DRAW(UPDATE)
  UI_BUTTON(FLUSH)                                                    //          UI_BUTTON(FLUSH)
  UI_BUTTON(WAIT_FOR_PRESS)                                           //          UI_BUTTON(WAIT_FOR_PRESS)
                                                                      //
  CALL(ControlPar,Index,Par1,Par2,BUTTONBLOCK_PAR1_MIN,BUTTONBLOCK_PAR1_MAX,Stay) //
DoNotWait:                                                            //        }
                                                                      //      }
  JR_TRUE(Stay,Refresh)                                               //      while(Stay)
NotRefresh:                                                           //    }
}                                                                     //  }
                                                                      //
// DelayBlock ******************************************************************************************
                                                                      //
define    DELAYBLOCK_WIDTH          80                                //
define    DELAYBLOCK_PAR1_MIN       1                                 //
define    DELAYBLOCK_PAR1_DEFAULT   4                                 //
define    DELAYBLOCK_PAR1_MAX       8                                 //
                                                                      //
subcall   DelayBlock                                                  //  DelayBlock
{                                                                     //  {
  IN_16   Function                                                    //    Function
  IO_16   Pointer                                                     //    Pointer (Cursor)
  IO_16   X1                                                          //    X coord
  IO_16   X2                                                          //    Y variable
                                                                      //
  DATAF   Tmp                                                         //
  DATA32  Index                                                       //    Array index
  DATA16  Par1                                                        //    Local parameter 1
  DATA16  Par2                                                        //    Local parameter 2
  DATA16  X3                                                          //
  DATA16  Y3                                                          //
  DATA16  Tmp16                                                       //
  DATA8   Stay                                                        //
  DATA8   State                                                       //
  DATAS   Name 32                                                     //
  DATAS   No 6                                                        //
                                                                      //
  MOVE16_32(Pointer,Index)                                            //
  ARRAY_READ(hBlockPar1,Index,Par1)                                   //
  ARRAY_READ(hBlockPar2,Index,Par2)                                   //
                                                                      //
  MOVE8_8(0,Stay)                                                     //    Stay        =  0
                                                                      //
  JR_NEQ16(Function,INIT,NotInit)                                     //    if (Function == INIT)
                                                                      //    {
  MOVE16_16(DELAYBLOCK_PAR1_DEFAULT,Par1)                             //      Par1      =  DELAYBLOCK_PAR1_DEFAULT
  MOVE16_16(0,Par2)                                                   //      Par2      =  0
  ARRAY_WRITE(hBlockPar1,Index,Par1)                                  //
  ARRAY_WRITE(hBlockPar2,Index,Par2)                                  //
NotInit:                                                              //    }
                                                                      //
  JR_NEQ16(Function,GET_WIDTH,NotGetWidth)                            //    if (Function == GET_WIDTH)
                                                                      //    {
  MOVE16_16(DELAYBLOCK_WIDTH,X1)                                      //      X1        =  DELAYBLOCK_WIDTH
                                                                      //
NotGetWidth:                                                          //    }
                                                                      //
  JR_NEQ16(Function,DRAW_ICON,NotDrawIcon)                            //    if (Function == DRAW_ICON)
                                                                      //    {
  UI_DRAW(BMPFILE,FG_COLOR,X1,X2,'W_time')                            //      Draw bitmap
                                                                      //
NotDrawIcon:                                                          //    }
                                                                      //
  JR_NEQ16(Function,ACTIVATE,NotActivate)                             //    if (Function == ACTIVATE)
                                                                      //    {
  MOVE8_8(1,Stay)                                                     //      Stay      =  1
  MOVE16_16(1,X2)                                                     //      X2        =  1
  MOVE16_16(REFRESH,Function)                                         //      Function  =  REFRESH
NotActivate:                                                          //    }
                                                                      //
  JR_NEQ16(Function,REFRESH,NotRefresh)                               //    if (Function == REFRESH)
                                                                      //    {
  ADD16(X1,25,X3)                                                     //      X3  =  X1 + 25
  UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)                              //      UI_DRAW(FILLRECT,BG_COLOR,X3,23,30,11)
                                                                      //      do
Refresh:                                                              //      {
  JR_NEQ16(X2,1,NotSelected)                                          //        if (X2)
                                                                      //        {
  JR_FALSE(Stay,NotStay)                                              //          if (Stay)
                                                                      //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKh')                              //            Draw bitmap
                                                                      //
  JR(EndStay)                                                         //          }
                                                                      //          else
NotStay:                                                              //          {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKs')                              //            Draw bitmap
                                                                      //
  ADD16(X1,25,X3)                                                     //            X3  =  X1 + 25
                                                                      //
  UI_DRAW(BMPFILE,FG_COLOR,X3,23,'ToLib')                             //            Draw bitmap
                                                                      //
EndStay:                                                              //          }
  JR(EndSelected)                                                     //        }
                                                                      //        else
NotSelected:                                                          //        {
  UI_DRAW(BMPFILE,FG_COLOR,X1,36,'BLKn')                              //          Draw bitmap
                                                                      //
EndSelected:                                                          //        }
  ADD16(X1,2,X3)                                                      //        X3  =  X1 + 2
  UI_DRAW(BMPFILE,FG_COLOR,X3,60,'W_time')                            //        Draw bitmap
                                                                      //
  STRINGS(NUMBER_TO_STRING,Par1,1,No)                                 //
  STRINGS(ADD,'W_timeP',No,Name)                                      //
                                                                      //
  ADD16(X1,46,X3)                                                     //        X3  =  X1 + 46
  UI_DRAW(BMPFILE,FG_COLOR,X3,66,Name)                                //        Draw bitmap
                                                                      //
  JR_FALSE(Stay,DoNotWait)                                            //        if (Stay)
                                                                      //        {
  UI_DRAW(UPDATE)                                                     //          UI_DRAW(UPDATE)
  UI_BUTTON(FLUSH)                                                    //          UI_BUTTON(FLUSH)
  UI_BUTTON(WAIT_FOR_PRESS)                                           //          UI_BUTTON(WAIT_FOR_PRESS)
                                                                      //
  CALL(ControlPar,Index,Par1,Par2,DELAYBLOCK_PAR1_MIN,DELAYBLOCK_PAR1_MAX,Stay) //
DoNotWait:                                                            //        }
                                                                      //      }
  JR_TRUE(Stay,Refresh)                                               //      while(Stay)
NotRefresh:                                                           //    }
}                                                                     //  }
                                                                      //
// ControlPointer **************************************************************************************
                                                                      //
                                                                      //
subcall   ControlPointer                                              //  ControlPointer
{                                                                     //  {
  IN_16   Min                                                         //    Lowest pointer value
  IN_16   Max                                                         //    Highest pointer value
  IN_16   Span                                                        //    No of visible items
  IN_16   Inc                                                         //    Inc / dec
  IO_16   Pointer                                                     //    Pointer
  IO_16   Start                                                       //    Start of visible
  OUT_8   Update                                                      //    Update flag
                                                                      //
  DATA16  Tmp                                                         //
                                                                      //
  MOVE8_8(1,Update)                                                   //    Update  =  1
                                                                      //
  ADD16(Pointer,Inc,Pointer)                                          //    Pointer +=  Inc
                                                                      //
  JR_GTEQ16(Pointer,Min,HighEnough)                                   //    if (Pointer < Min)
                                                                      //    {
  MOVE16_16(Min,Pointer)                                              //      Pointer  =  Min
  MOVE8_8(0,Update)                                                   //      Update  =  0
HighEnough:                                                           //    }
  JR_LTEQ16(Pointer,Max,LowEnough)                                    //    if (Pointer > Max)
                                                                      //    {
  MOVE16_16(Max,Pointer)                                              //      Pointer  =  Max
  MOVE8_8(0,Update)                                                   //      Update  =  0
LowEnough:                                                            //    }
                                                                      //
  JR_GTEQ16(Pointer,Start,DoNotLower)                                 //    if (Pointer < Start)
                                                                      //    {
  JR_LT16(Pointer,Min,Label1)                                         //      if (Pointer >= Min)
                                                                      //      {
  MOVE16_16(Pointer,Start)                                            //        Start  =  Pointer
Label1:                                                               //      }
DoNotLower:                                                           //    }
                                                                      //
  ADD16(Start,Span,Tmp)                                               //    Tmp  =  Start + Span
  JR_LT16(Pointer,Tmp,Label2)                                         //    if (Pointer >= Tmp)
                                                                      //    {
  SUB16(Pointer,Span,Tmp)                                             //      Tmp  =  Pointer - Span
  ADD16(Start,1,Start)                                                //      Start++
Label2:                                                               //    }
                                                                      //
}                                                                     //  }
                                                                      //
                                                                      //
//! 

LEGO® Robotics Firmware Documentation
Confidential Information © 2013 The LEGO Group