HCS-II Firmware Operand ByteCodes
Last Updated 6/15/00
Current to Firmware version 4.01
Green indicates proposed bytecodes for the Statlink in v4.1.  The Flexible command section may be moved from 0xA0 to 0xC0 to give the fixed commands some breathing room.  We currently have 5 fixed action bytecodes left.
The list below outlines the bytecodes used to control the HCS-II system board.  Any compiler written for the HCS-II must use these bytecodes in the order and length specificed.  This document may not be 100% complete and will be updated as I dive further into how the compiler and XPRESS work.  If you have suggestions or updates/corrections, send them to me at baptiste@cc-concepts.com
XPRESS Programs are made up of a variety of command types.  The main types are Condition Checks (IF/THEN) and actions which are the commands executed after a THEN or ELSE.  There are three types of actions outlined below
X-10 Commands < 0x80
Fixed Action >= 0x80
< 0xA0
Flexible Action >= 0xA0
< 0xAC
Byte Code XPRESS Routine Associated
Program Markers
These codes outline the structure of the XPRESS Bytecodes
0x0f0 ifa IF Always
0x0f1 ifn IF
0x0f2 elseop ELSE (If present - goes before 0xFE END)
0x0fc stopm End of Math Equation (to right of action assignment)
0x0fd stop End of IF Condition Evaluation
0x0fe last End of actions in THEN/ELSE
0x0ef endcont End of Continuous Section
Start of Sequential Section
0x0ee endpgm End of Program
0x0ff endtbl End of Events Offset Table
N/A domath Evaluate math expression in an assignment statement
Evaluation Parameters in IF conditions
An IF THEN statement in XPRESS is translated into a number of bytecodes.  These bytecodes represent things like math operators, comparison operands, system values (ie ADCs, time, etc), parentheses, etc.
AN IF starts with 0xF1 with eval bytecodes in between, ending with 0xFD and 3 0x00s. The then starts after that with action bytecodes and ends with 0xFE.  If an else is encountered, a 0xF2 is inserted with the ELSE action codes BEFORE the 0xFE.  AN IF offset table is compiled to point to each IF statement's actions.
0x30 var
0x31 adc
0x32 tmr
0x33 irc
0x34 c8
0x35 c16
0x36 tru
0x37 fls
0x38 rnd
0x39 month
0x3A day
0x3B year
0x3C week
0x3D hour
0x3E min
0x3F sec
0x40 getdig
0x41 getnum
0x42 rings
0x43 dtone
0x44 cprog
0x45 cidnew
0x46 cidmon
0x47 cidday
0x48 cidhour
0x49 cidmin
0x4A cidarea
0x4B cidexch
0x4C cidnum
0x4D logsize
0x4E netbyte
0x4F acp
0x50 acf
0x51 freq
0x52 total
0x53 getkey
0x54 getknum
0x55   HVACSetPoint(xx) Current Thermostat Set Point
0x56   HVACFan(xx) Current Fan Switch Mode
0x57   HVACMode(xx) Current Thermostat Mode
0x58   HVACStatus(xx) Current HVAC Operating Status
0x59   HVACTemp(xx) Current Thermostat Temp Reading
Generic Math and Logic Operators
0x00 noop Evaluate single operand for True/False
0x01 eq Check if Operand 1 = Operand 2
0x02 ne Check if Operand 1 != Operand 2
0x03 gt Check if Operand 1 > Operand 2
0x04 lt Check if Operand 1 < Operand 2
0x05 ge Check if Operand 1 >= Operand 2
0x06 le Check if Operand 1 <= Operand 2
0x70 oparen Open Paren
0x71 cparen Close Paren
0x72 andf AND Operator
0x73 orf OR Operator
0x74 notf NOT Operator
0x75 addf ADD Operator
0x76 subf Subtract Operator
0x77 mulf Multiply Operator
0x78 divf Divide Operator
Action Command Bytecodes
These are bytecodes included in THEN and ELSE sections of an XPRESS program
X-10 Commands
0x00 - 0x7F
1st Bytecode is the Housecode in ASCII ('A' to 'P' which is 0x41 - 0x50)
2nd Bytecode is the Module Number in hex (1 - 16 which is 0x01 - 0x10)
3rd Bytecode is the Function
0x01 All OFF
0x02 All ON
0x03 On
0x04 Off
0x05 Dim
0x06 Bright
0x83 ONA
4th Bytecode is the Repeat Count for Dim & Bright.  No range checking means you can send 0-255 (0x00 to 0xFF)
0x80 - 0x9E
These routines are fixed in nature.  A constant value or resource is assigned.  No math equation can be to the right of the =
0x80 incvar Inc(variable_id) Increment a variable
0x81 decvar Dec(variable_id) Decrement a variable
0x82 onout Output(output_num)= Turn a local output on
0x83 offout Turn a local output off
0x84 ontmr Timer(timer_id) Reset and activate a timer
0x85 offtmr Turn a timer off
0x86 onnetb NetBit(netbit_id)= Turn on a network output
0x87 offnetb Turn off a network output
0x88 lcdmsg LCD(net_addr)="" Send a message/string to LCD-Link
0x89 diomsg LPT(net_addr)="" Send a message/string via a DIO-Link like to a printer
0x8A tvmsg TV(net_addr)="" Send a message/string to a TV-Link (NOT a PIC-TV!)
0X8B rstio ResetIO Clear local I/O bits
0X8C clrvar ClearVariables Clear all variables
0X8D clrtmr ClearTimers Clear all timers
0X8E clrlogm ClearLog Clear LOG memory
0X8F wait Wait
0X90 offhk OffHook Take phoneline offhook via HCS-DTMF
0X91 onhk OnHook Put phoneline onhook via HCS-DTMF (hangup)
0X92 dials DialString("") Dial digits in string
0X93 diald DialDigit(variable_id) Dial single digit stored in a variable. Variable must be between 0-15 correspondign to a given digit
0X94 dialn DialNumber(variable_id) Dial 1-4 digits based on variable value of 0-9999
0X95 say Say="" Send string to Voice board
0X96 sayw SayW="" Send string to Voice board and wait for board to finish speaking string.
0X97 conmsg Console="" Send message to HOST console
0X98 setinit ModemInit="" Store new init string for modem
0X99 netmsg Network="" Send raw network message with checksum
0X9A clrtot ClearTotal(aman_addr) Clear totalizer on an AMAN-Link network module
0x9B hvacled HVACLed(stat,led_number)=ON/OFF Turn a Statnet LED on or Off
0x9C hvacfan HVACFan(stat)=AUTO/ON Set the fan mode of a thermostat to AUTO (0) or ON (1)
0x9D hvacnet HVACNet = "" Send RAW string to HVAC network
0x9E hvacmode HVACMode(stat)= Set the mode of a thermostat to OFF, Heat, Cooling, or Auto (0-3)
0xA0 - 0xAC
These actions are commands which take a byte value and assign them to a given resource.  They can have math equations to the right, unlike fixed commands
0xA0 setvr Variable= Set a variable to a given value
0xA1 setdaco Set DAC Output on AMAN-Link
0xA2 setref Set PL-Link refresh level
0xA3 setmcir Send IR code via MCIR-Link
0xA4 logdat Store Log Value to Log memory
0xA5 rcrings Set number of rings before answering modem
0xA6 cidenb Turn CID feature On/Off
0xA7 setnetb Set NetByte on DIO-Link
0xA8 pwmtot Set PWM Total Period on AMAN-Link
0xA9 pwmhi Set PWM Hi Period on AMAN-Link
0xAA bitdir Set I/O bit direction on AMAN-Link
0xAB keypto Set keypad timeout value on AMAN-Link
0xAC hvacssp HVACSetPoint(stat) = byte Set the setpoint of the specified thermostat to a given value