// *++
//
// Copyright (c) 2006, Intel Corporation                                                         
// All rights reserved. This program and the accompanying materials                          
// are licensed and made available under the terms and conditions of the BSD License         
// which accompanies this distribution.  The full text of the license may be found at        
// http://opensource.org/licenses/bsd-license.php                                            
//                                                                                           
// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
// 
// Module Name:
//
//   Vfr.vfr 
// 
// Abstract:
// 
//   Sample Setup formset
// 
// Revision History: 
// 
// --*/


#include "DriverSampleStrDefs.h" 
 
#include "NVDataStruc.h"


typedef struct {
  UINT8         Field8;
  UINT16        Field16;
  UINT8         OrderedList[3];
} MyIfrNVData2;

typedef struct {
  UINT8         Field8;
  UINT16        Field16;
  UINT8         OrderedList[3];
} MyIfrNVData3;

#define MY_TEXT_KEY                 0x100 

#define LABEL_1_VALUE               0x01
#define LABEL_2_VALUE               0x1000
#define LABEL_UPDATE_BBS            0x2222
#define LABEL_END_UPDATE_BBS        0x2223

formset 
  guid     = FORMSET_GUID,
  title    = STRING_TOKEN(STR_FORM_SET_TITLE),  
  help     = STRING_TOKEN(STR_FORM_SET_TITLE_HELP), 
  class    = 0x10,      
  subclass = 0,

  varstore MyIfrNVData2, key = 0x1234, name = MY_DATA2, guid = FORMSET_GUID;


  varstore MyIfrNVData3, key = 0x4321, name = MY_DATA3, guid = FORMSET_GUID;

  form formid = 1,
       title  = STRING_TOKEN(STR_FORM1_TITLE);  // note formid is a variable (for readability) (UINT16) - also added Form to the line to signify the Op-Code
  
    subtitle text = STRING_TOKEN(STR_SUBTITLE_TEXT);

    subtitle text = STRING_TOKEN(STR_SUBTITLE_TEXT2);

    banner 
      title = STRING_TOKEN(STR_BANNER_TITLE),
      line  1,
      align center;
    
    banner 
      title = STRING_TOKEN(STR_BANNER_TITLE),
      line  2,
      align left;

    banner 
      title = STRING_TOKEN(STR_BANNER_TITLE),
      line  2,
      align right;

  	text 
      help   = STRING_TOKEN(STR_TEXT_HELP),  
      text   = STRING_TOKEN(STR_CPU_STRING),
	    text   = STRING_TOKEN(STR_CPU_STRING2),
      flags  = 0,
      key    = 0;

  	text 
      help   = STRING_TOKEN(STR_EXIT_TEXT),  
      text   = STRING_TOKEN(STR_EXIT_TEXT), 
	    text   = STRING_TOKEN(STR_EXIT_TEXT),
      flags  = INTERACTIVE,
      key    = 0x1237;

    oneof varid  = MyIfrNVData.SuppressGrayOutSomething,
      prompt      = STRING_TOKEN(STR_ONE_OF_PROMPT),
      help        = STRING_TOKEN(STR_ONE_OF_HELP),  
      option text = STRING_TOKEN(STR_ONE_OF_TEXT4), value = 0x0, flags = 0; 
      option text = STRING_TOKEN(STR_ONE_OF_TEXT5), value = 0x1, flags = 0;
      option text = STRING_TOKEN(STR_ONE_OF_TEXT6), value = 0x2, flags = DEFAULT;
    endoneof;

    oneof varid  = MyIfrNVData.BootOrderLarge,
      prompt      = STRING_TOKEN(STR_ONE_OF_PROMPT),
      help        = STRING_TOKEN(STR_ONE_OF_HELP),  
      option text = STRING_TOKEN(STR_BOOT_ORDER1), value = 0x0, flags = INTERACTIVE, key = 1; 
      option text = STRING_TOKEN(STR_BOOT_ORDER2), value = 0x1, flags = INTERACTIVE | DEFAULT, key = 2;
    endoneof;

    grayoutif  ideqval MyIfrNVData.SuppressGrayOutSomething == 0x1;
    suppressif ideqval MyIfrNVData.SuppressGrayOutSomething == 0x0;
      label 0;
      checkbox varid    = MyIfrNVData.ChooseToActivateNuclearWeaponry,
              prompt   = STRING_TOKEN(STR_CHECK_BOX_PROMPT),
              help     = STRING_TOKEN(STR_CHECK_BOX_HELP),  
              flags    = 1,                  // Flags behavior for checkbox is overloaded so that it equals a DEFAULT value.  1 = ON, 0 = off
              key      = 0,
      endcheckbox;
    endif;


    //
    // Ordered list: 
    //   sizeof(MyIfrNVData) storage must be UINT8 array, and
    //   size written for the variable must be size of the entire
    //   variable.
    //
    //
    suppressif ideqval MyIfrNVData.SuppressGrayOutSomething == 0x0;
      label LABEL_UPDATE_BBS;
      orderedlist
                varid       = MyIfrNVData.BootOrder,
                prompt      = STRING_TOKEN(STR_BOOT_OPTIONS),
                help        = STRING_TOKEN(STR_NULL_STRING),
                option text = STRING_TOKEN(STR_BOOT_OPTION2), value = 2, flags = RESET_REQUIRED;
                option text = STRING_TOKEN(STR_BOOT_OPTION1), value = 1, flags = RESET_REQUIRED;
                option text = STRING_TOKEN(STR_BOOT_OPTION3), value = 3, flags = RESET_REQUIRED;
                option text = STRING_TOKEN(STR_BOOT_OPTION4), value = 4, flags = RESET_REQUIRED;
      endlist;      
      label LABEL_END_UPDATE_BBS;
    endif;
 
    suppressif ideqval MyIfrNVData.SuppressGrayOutSomething == 0x2;
      orderedlist    
        varid       = MyIfrNVData.OrderedList,
        prompt      = STRING_TOKEN(STR_TEST_OPCODE),
        help        = STRING_TOKEN(STR_TEXT_HELP),  
        option text = STRING_TOKEN(STR_ONE_OF_TEXT1), value = 4, flags = RESET_REQUIRED;
        option text = STRING_TOKEN(STR_ONE_OF_TEXT2), value = 3, flags = RESET_REQUIRED;
        option text = STRING_TOKEN(STR_ONE_OF_TEXT3), value = 2, flags = RESET_REQUIRED;
        option text = STRING_TOKEN(STR_TEXT_HELP),    value = 1, flags = RESET_REQUIRED;
      endlist;
    endif;
     
    label 100;

    goto 0x1234, 
      prompt  = STRING_TOKEN(STR_GOTO_DYNAMIC), 
      help    = STRING_TOKEN(STR_GOTO_HELP),
      flags   = INTERACTIVE, 
      key     = 0x1234;

    goto 0x1234, 
      prompt  = STRING_TOKEN(STR_GOTO_DYNAMIC2), 
      help    = STRING_TOKEN(STR_GOTO_HELP),
      flags   = INTERACTIVE, 
      key     = 0x1235;
    
    //
    // VARSTORE tests
    //
    // Till now, been using variable NvData (must be reserved)
    // now we do a varselect for variable NvData3
    inconsistentif prompt = STRING_TOKEN(STR_ERROR_POPUP),
      ideqid MyIfrNVData3.Field16 == MyIfrNVData3.Field16
    endif;
    // now we do a varselect_pair for variable NvData2 and NvData3
    inconsistentif prompt = STRING_TOKEN(STR_ERROR_POPUP),
      ideqid MyIfrNVData2.Field16 == MyIfrNVData3.Field16
    endif;


    // now we do a varselect_pair for variable NvData and NvData2
//    inconsistentif prompt = STRING_TOKEN(STR_ERROR_POPUP),
//      ideqid MyIfrNVData2.Field16 == MyIfrNVData.TestLateCheck
//    endif;

    inconsistentif prompt = STRING_TOKEN(STR_ERROR_POPUP),
      ideqid MyIfrNVData.TestLateCheck == MyIfrNVData.TestLateCheck2
    endif;

    oneof varid  = MyIfrNVData.TestLateCheck,
      prompt      = STRING_TOKEN(STR_TEST_OPCODE),
      help        = STRING_TOKEN(STR_ONE_OF_HELP),  
      option text = STRING_TOKEN(STR_ONE_OF_TEXT1), value = 0, flags = LATE_CHECK | RESET_REQUIRED;
      option text = STRING_TOKEN(STR_ONE_OF_TEXT2), value = 1, flags = LATE_CHECK | DEFAULT | RESET_REQUIRED;
    endoneof;

    oneof varid  = MyIfrNVData.TestLateCheck2,
      prompt      = STRING_TOKEN(STR_TEST_OPCODE2),
      help        = STRING_TOKEN(STR_ONE_OF_HELP),  
      option text = STRING_TOKEN(STR_ONE_OF_TEXT1), value = 0, flags = LATE_CHECK | DEFAULT | RESET_REQUIRED;
      option text = STRING_TOKEN(STR_ONE_OF_TEXT2), value = 1, flags = LATE_CHECK | RESET_REQUIRED;

    endoneof;

    oneof varid  = MyIfrNVData.QuestionAboutTreeHugging,
      prompt      = STRING_TOKEN(STR_ONE_OF_PROMPT),
      help        = STRING_TOKEN(STR_ONE_OF_HELP),  
      option text = STRING_TOKEN(STR_ONE_OF_TEXT1), value = 0, flags = RESET_REQUIRED;
      option text = STRING_TOKEN(STR_ONE_OF_TEXT2), value = 1, flags = DEFAULT | RESET_REQUIRED;
      option text = STRING_TOKEN(STR_ONE_OF_TEXT3), value = 0x03, flags = RESET_REQUIRED;

    endoneof;

    string    varid    = MyIfrNVData.MyStringData,
              prompt   = STRING_TOKEN(STR_MY_STRING_PROMPT2),
              help     = STRING_TOKEN(STR_MY_STRING_HELP2),
              flags    = INTERACTIVE,
              key      = 0x1234,
              minsize  = 6,
              maxsize  = 0x14,
    endstring; 

  	text 
      help   = STRING_TOKEN(STR_GRAYOUT_TEST),  
      text   = STRING_TOKEN(STR_GRAYOUT_TEST),
	    text   = STRING_TOKEN(STR_GRAYOUT_TEST),
      flags  = INTERACTIVE,
      key    = 0x1555;

  	text 
      help   = STRING_TOKEN(STR_SUPPRESS_TEST),  
      text   = STRING_TOKEN(STR_SUPPRESS_TEST),
	    text   = STRING_TOKEN(STR_SUPPRESS_TEST),
      flags  = INTERACTIVE,
      key    = 0x1556;

  	text 
      help   = STRING_TOKEN(STR_CLEAR_TEST),  
      text   = STRING_TOKEN(STR_CLEAR_TEST),
	    text   = STRING_TOKEN(STR_CLEAR_TEST),
      flags  = INTERACTIVE,
      key    = 0x1557;

    grayoutif  vareqval var(VAR_EQ_TEST_NAME) == 0x1;
    suppressif vareqval var(VAR_EQ_TEST_NAME) == 0x1000; 
      label 30;
      checkbox varid    = MyIfrNVData.ChooseToActivateNuclearWeaponry,
              prompt   = STRING_TOKEN(STR_CHECK_BOX_PROMPT),
              help     = STRING_TOKEN(STR_CHECK_BOX_HELP),  
              flags    = 1,
              key      = 0,
      endcheckbox;
    endif;


    numeric varid   = MyIfrNVData.HowOldAreYouInYearsManual, 
            prompt  = STRING_TOKEN(STR_NUMERIC_MANUAL_PROMPT),
            help    = STRING_TOKEN(STR_NUMERIC_HELP0),
            minimum = 0,
            maximum = 0xf0,      // 0xf0 = 240 in decimal
            step    = 0,         // Stepping of 0 equates to a manual entering
                                 // of a value, otherwise it will auto-increment
                                 // with a left/right arrow
            default = 21, 

    endnumeric;

    numeric varid   = MyIfrNVData.HowTallAreYouManual, 
            prompt  = STRING_TOKEN(STR_TALL_MANUAL_PROMPT),
            help    = STRING_TOKEN(STR_NUMERIC_HELP1),
            minimum = 0,
            maximum = 300,
            step    = 0,         // Stepping of 0 equates to a manual entering
                                 // of a value, otherwise it will auto-increment
                                 // with a left/right arrow
            default = 175, 

    endnumeric;

    inventory
      help    = STRING_TOKEN(STR_INVENTORY_HELP),
      text    = STRING_TOKEN(STR_INVENTORY_TEXT1),
      text    = STRING_TOKEN(STR_INVENTORY_TEXT2);

      
    restore defaults,
      formid  = 4,
      prompt  = STRING_TOKEN(STR_RESTORE_DEFAULTS_PROMPT),
      help    = STRING_TOKEN(STR_RESTORE_DEFAULTS_HELP),
      flags   = 0,
      key     = 0;

    save defaults,
      formid  = 4,
      prompt  = STRING_TOKEN(STR_SAVE_DEFAULTS_PROMPT),
      help    = STRING_TOKEN(STR_SAVE_DEFAULTS_HELP),
      flags   = 0,
      key     = 0;

    // 
    // Case with no flags or key
    //
    save defaults,
      formid  = 4,
      prompt  = STRING_TOKEN(STR_SAVE_DEFAULTS_PROMPT),
      help    = STRING_TOKEN(STR_SAVE_DEFAULTS_HELP);
    //
    // Case with no key
    //
    save defaults,
      formid  = 4,
      prompt  = STRING_TOKEN(STR_SAVE_DEFAULTS_PROMPT),
      help    = STRING_TOKEN(STR_SAVE_DEFAULTS_HELP),
      flags   = 0;
    //
    // Case with no flags
    //
    save defaults,
      formid  = 4,
      prompt  = STRING_TOKEN(STR_SAVE_DEFAULTS_PROMPT),
      help    = STRING_TOKEN(STR_SAVE_DEFAULTS_HELP),
      key     = 0;

    label LABEL_2_VALUE;

    grayoutif  ideqval MyIfrNVData.HowOldAreYouInYearsManual == 23 AND ideqval MyIfrNVData.SuppressGrayOutSomething == 0x1;
    numeric varid   = MyIfrNVData.HowOldAreYouInYears,   
            prompt  = STRING_TOKEN(STR_NUMERIC_PROMPT),
            help    = STRING_TOKEN(STR_NUMERIC_HELP2),
            minimum = 0,
            maximum = 243,
            step    = 3,
            default = 18,

    endnumeric;

    label LABEL_1_VALUE;

    //
    // Numeric with no step or default specified
    //
    numeric varid   = MyIfrNVData.HowTallAreYou, 
            prompt  = STRING_TOKEN(STR_NUMERIC_PROMPT1),
            help    = STRING_TOKEN(STR_NUMERIC_HELP3),
            minimum = 0,
            maximum = 190,
    //        step    = 1,       // Stepping of 1 if not specified
    //        default = minimum; // if not specified
    endnumeric;
    endif;

    string    varid    = MyIfrNVData.MyStringData,
              prompt   = STRING_TOKEN(STR_MY_STRING_PROMPT),
              help     = STRING_TOKEN(STR_MY_STRING_HELP),
              minsize  = 6,
              maxsize  = 0x14,
    endstring; 
        
    password  varid    = MyIfrNVData.WhatIsThePassword,
              prompt   = STRING_TOKEN(STR_PASSWORD_PROMPT),
              help     = STRING_TOKEN(STR_PASSWORD_HELP),
              minsize  = 6,
              maxsize  = 20, // new opcode 
              encoding = 1,
    endpassword; 
    password  varid    = MyIfrNVData.WhatIsThePassword2,
              prompt   = STRING_TOKEN(STR_PASSWORD_PROMPT),
              help     = STRING_TOKEN(STR_PASSWORD_HELP),
              minsize  = 6,
              maxsize  = 20, // new opcode 
              encoding = 1,
    endpassword; 
    //
    // Test with flags and key fields
    //
    password  varid    = MyIfrNVData.WhatIsThePassword,
              prompt   = STRING_TOKEN(STR_PASSWORD_PROMPT),
              help     = STRING_TOKEN(STR_PASSWORD_HELP),
              flags    = INTERACTIVE,
              key      = 0x2000,
              minsize  = 6,
              maxsize  = 20, // new opcode 
              encoding = 1,
    endpassword;

    goto 2, 
      prompt = STRING_TOKEN(STR_GOTO_FORM2), //SecondSetupPage  // this too has no end-op and basically it's a jump to a form ONLY
      help   = STRING_TOKEN(STR_GOTO_HELP);

    goto 3, 
      prompt = STRING_TOKEN(STR_GOTO_FORM3), //ThirdSetupPage  // this too has no end-op and basically it's a jump to a form ONLY
      help   = STRING_TOKEN(STR_GOTO_HELP);

  endform;

  form formid = 2,               // SecondSetupPage, 
       title = STRING_TOKEN(STR_FORM2_TITLE);  // note formid is a variable (for readability) (UINT16) - also added Form to the line to signify the Op-Code


    date    year varid  = Date.Year,    // Note that it is a member of NULL, so the RTC will be the system resource to retrieve and save from
            prompt      = STRING_TOKEN(STR_DATE_PROMPT),
            help        = STRING_TOKEN(STR_DATE_YEAR_HELP),
            minimum     = 1998,
            maximum     = 2099,
            step        = 1,
            default     = 2004,

            month varid = Date.Month,    // Note that it is a member of NULL, so the RTC will be the system resource to retrieve and save from
            prompt      = STRING_TOKEN(STR_DATE_PROMPT),
            help        = STRING_TOKEN(STR_DATE_MONTH_HELP),
            minimum     = 1,
            maximum     = 12,
            step        = 1,
            default     = 1,

            day varid   = Date.Day,          // Note that it is a member of NULL, so the RTC will be the system resource to retrieve and save from
            prompt      = STRING_TOKEN(STR_DATE_PROMPT),
            help        = STRING_TOKEN(STR_DATE_DAY_HELP),
            minimum     = 1,
            maximum     = 31,
            step        = 0x1,
            default     = 1,

    enddate;

    time    hour varid  = Time.Hours,         // Note that it is a member of NULL, so the RTC will be the system resource to retrieve and save from
            prompt      = STRING_TOKEN(STR_TIME_PROMPT),
            help        = STRING_TOKEN(STR_TIME_HOUR_HELP),
            minimum     = 0,
            maximum     = 23,
            step        = 1,
            default     = 0,

            minute varid  = Time.Minutes,       // Note that it is a member of NULL, so the RTC will be the system resource to retrieve and save from
            prompt        = STRING_TOKEN(STR_TIME_PROMPT),
            help          = STRING_TOKEN(STR_TIME_MINUTE_HELP),
            minimum       = 0,
            maximum       = 59,
            step          = 1,
            default       = 0,

            second varid  = Time.Seconds,       // Note that it is a member of NULL, so the RTC will be the system resource to retrieve and save from
            prompt        = STRING_TOKEN(STR_TIME_PROMPT),
            help          = STRING_TOKEN(STR_TIME_SECOND_HELP),
            minimum       = 0,
            maximum       = 59,
            step          = 1,
            default       = 0,

    endtime;

    date    year varid  = Date.Year,    // Note that it is a member of NULL, so the RTC will be the system resource to retrieve and save from
            prompt      = STRING_TOKEN(STR_DATE_PROMPT),
            help        = STRING_TOKEN(STR_DATE_YEAR_HELP),
            minimum     = 1939,
            maximum     = 2101,
            step        = 1,
            default     = 1964,

            month varid = Date.Month,    // Note that it is a member of NULL, so the RTC will be the system resource to retrieve and save from
            prompt      = STRING_TOKEN(STR_DATE_PROMPT),
            help        = STRING_TOKEN(STR_DATE_MONTH_HELP),
            minimum     = 1,
            maximum     = 12,
            step        = 1,
            default     = 1,

            day varid   = Date.Day,          // Note that it is a member of NULL, so the RTC will be the system resource to retrieve and save from
            prompt      = STRING_TOKEN(STR_DATE_PROMPT),
            help        = STRING_TOKEN(STR_DATE_DAY_HELP),
            minimum     = 1,
            maximum     = 31,
            step        = 0x1,
            default     = 1,

    enddate;

    time    hour varid  = Time.Hours,         // Note that it is a member of NULL, so the RTC will be the system resource to retrieve and save from
            prompt      = STRING_TOKEN(STR_TIME_PROMPT),
            help        = STRING_TOKEN(STR_TIME_HOUR_HELP),
            minimum     = 0,
            maximum     = 23,
            step        = 1,
            default     = 0,

            minute varid  = Time.Minutes,       // Note that it is a member of NULL, so the RTC will be the system resource to retrieve and save from
            prompt        = STRING_TOKEN(STR_TIME_PROMPT),
            help          = STRING_TOKEN(STR_TIME_MINUTE_HELP),
            minimum       = 0,
            maximum       = 59,
            step          = 1,
            default       = 0,

            second varid  = Time.Seconds,       // Note that it is a member of NULL, so the RTC will be the system resource to retrieve and save from
            prompt        = STRING_TOKEN(STR_TIME_PROMPT),
            help          = STRING_TOKEN(STR_TIME_SECOND_HELP),
            minimum       = 0,
            maximum       = 59,
            step          = 1,
            default       = 0,

    endtime;

    grayoutif 
      ideqval Date.Day == 21
      AND
      ideqval Date.Month == 8;
    
    hidden  value = 32, key = 0x7777;

    endif; // grayoutif

    suppressif
      ideqval Date.Day == 8
      AND
      ideqval Date.Month == 21; 
    
    hidden  value = 32, key = 0x7777;

    endif; // suppressif


    hidden  value = 32, key = 0x1234;

    inconsistentif prompt = STRING_TOKEN(STR_ERROR_POPUP),
      ideqval MyIfrNVData.HowOldAreYouInYearsManual == 4
    endif;
     
    inconsistentif prompt = STRING_TOKEN(STR_ERROR_POPUP),
      ideqvallist MyIfrNVData.HowOldAreYouInYearsManual == 1 2 3 4
    endif;

    inconsistentif prompt = STRING_TOKEN(STR_ERROR_POPUP),
      ideqid MyIfrNVData.HowOldAreYouInYearsManual == MyIfrNVData.MyFavoriteNumber
    endif;

//    grayoutif 
//
// If the day is 31 AND months is any of the following 2, 4, 6, 9, 11
//
    inconsistentif prompt = STRING_TOKEN(STR_ERROR_POPUP),
      ideqval Date.Day == 31 
      AND
      ideqvallist Date.Month == 2 4 6 9 11
    endif;

//
// If the day is 30 AND month is 2
//
    inconsistentif prompt = STRING_TOKEN(STR_ERROR_POPUP),
      ideqval Date.Day == 30
      AND
      ideqval Date.Month == 2
    endif;

//
// If the day is 29 AND month is 2 AND it year is NOT a leapyear
//
    inconsistentif prompt = STRING_TOKEN(STR_ERROR_POPUP),
      ideqval Date.Day == 0x1D
      AND
      ideqval Date.Month == 2 
      AND
      NOT
      ideqvallist Date.Year == 2004 2008 20012 20016 2020 2024 2028 2032 2036
    endif;

    checkbox varid    = MyIfrNVData.ChooseToActivateNuclearWeaponry,
            prompt   = STRING_TOKEN(STR_CHECK_BOX_PROMPT),
            help     = STRING_TOKEN(STR_CHECK_BOX_HELP),  
            flags    = 1,
            key      = 0,
    endcheckbox;

    text  
      help = STRING_TOKEN(STR_TEXT_HELP),  
      text = STRING_TOKEN(STR_TEXT_TEXT_1);
    
    text 
      help   = STRING_TOKEN(STR_TEXT_HELP),  
      text   = STRING_TOKEN(STR_TEXT_TEXT_1),
      text   = STRING_TOKEN(STR_TEXT_TEXT_2),
      flags  = 0,
      key    = MY_TEXT_KEY;
         
    goto 1, 
      prompt = STRING_TOKEN(STR_GOTO_FORM1), //MainSetupPage  // this too has no end-op and basically it's a jump to a form ONLY
      help   = STRING_TOKEN(STR_GOTO_HELP);

  endform;

  form formid = 3, title = STRING_TOKEN(STR_FORM3_TITLE);  // note formid is a variable (for readability) (UINT16) - also added Form to the line to signify the Op-Code

    grayoutif  ideqval MyIfrNVData.SuppressGrayOutSomething == 0x1;
      text  
        help = STRING_TOKEN(STR_TEXT_HELP),  
        text = STRING_TOKEN(STR_TEXT_TEXT_1);
        
    endif; //end grayoutif
    
    text  
      help = STRING_TOKEN(STR_TEXT_HELP),  
      text = STRING_TOKEN(STR_TEXT_TEXT_1);
    
  endform;
  
  form formid = 4, title = STRING_TOKEN(STR_FORM3_TITLE);

  endform;

  form formid = 0x1234,            // Dynamically created page, 
       title = STRING_TOKEN(STR_DYNAMIC_TITLE);  // note formid is a variable (for readability) (UINT16) - also added Form to the line to signify the Op-Code

    label 0x1234;

  endform;

endformset;
