; Defaults: 57600,8,N,1 ; ; Lynx Scoreboard Script Version 2.0 ; ; Copyright (c) 1995-2023 Lynx System Developers, Inc. ; ; Updated by Hugues Lacroix 04/18/2023, Steve Polus 04/21/2023 ; ; Notes: ; + Empty lines and lines that start with a semicolon are ignored. ; ; + Lines that start with two semicolons indicate a section header. ; Sections may be omitted, appear in any order, and occur more than once. ; The current section headers and their valid group codes are: ; ;;Initialization ; \10 \13 \17 ; ;;TimeRunning ; ;;TimeStopped ; ;;TimeGun ; ;;TimeBreak ; ;;TimeUpdate ; ;;TimeOfDay ; \11 \13 \17 ; ;;Wind ; \12 \13 \17 ; ;;StartListHeader ; ;;StartListTrailer ; ;;StartedHeader ; ;;StartedTrailer ; ;;ResultsHeader ; ;;ResultsTrailer ; \13 \17 ; ;;StartList ; ;;Started ; ;;Results (or ;;Result) ; \13 \14 \17 ; ;;MessageHeader ; ;;MessageTrailer ; \13 \15 \17 ; ;;Message ; \13 \15 \16 \17 ; The StartList*, Started*, and Results* sections may have an optional ; page number contained in square brackets immediately following the ; section name. If more than one page is defined for a section then each ; page will be shown, in order, when paging is enabled. Note that page ; numbers do not need to be contiguous; they are simply used to establish ; the order of pages. If a page number is omitted then a 0 (zero) is ; assumed. ; Some sections can be omitted and they will "fall back" to other ; sections. TimeOfDay falls back to TimeRunning. The StartList* sections ; fall back to the Results* sections. The Started* sections fall back ; to the StartList* sections (after the StartList* sections have fallen ; back to the Results* sections if necessary). ; ; + Format lines must begin with a one byte group code and a one byte ; variable code. The special variable code \00 indicates that no variable ; is being requested. If a variable is requested it will be inserted where ; a '%s' printf style format specifier appears. There can only be one '%s' ; specifier in lines requesting a variable and no other printf format ; specifiers may appear. Remember, lines requesting a variable are used as ; a printf format string and therefore must behave as such. Lines not ; requesting a variable (variable code \00) can do whatever they want as ; these lines are not fed to a printf statement. ; The current group codes and their variable codes are: ; \10 Initialize ; \00 No variable ; \11 Time ; \00 No variable ; \01 Formatted time ; \02 Binary time in milliseconds (4 byte little endian integer) ; \12 Wind ; \00 No variable ; \01 Formatted wind ; \02 Binary wind in hundredths of units (4 byte little endian integer) ; \13 Results Header/Trailer ; \00 No variable ; \01 OFFICIAL/UNOFFICIAL string ; \02 Event name ; \03 Wind ; \04 Event number ; \05 Round number ; \06 Heat number ; \07 AUTO/MANUAL start type ; \08 Number of participants ; \14 Result ; \00 No variable ; \01 Place ; \02 Lane ; \03 Id ; \04 Name ; \05 Affiliation ; \06 Time ; \07 Delta Time ; \08 Cumulative Split Time ; \09 Last Split Time ; \0a Laps To Go ; \0b License ; \0c ReacTime ; \0d Speed ; \0e Pace ; \0f Best Split Time ; \10 User1 ; \11 User2 ; \12 User3 ; \13 "From Image" Cumulative Split Time ; \14 "From Image" Window Number ; \15 Delta Time 2 ; \16 Delta Time 3 ; \17 First Name ; \18 Last Name ; \19 Start Time (default behavior) ; \1a Start Time (Time Trial key match only) ; \15 Message Header/Trailer ; \00 No variable ; \16 Message ; \00 No variable ; \01 Text ; \17 Break Time ; \00 No variable ; \nn Formatted break time nn ; ; + Arbitrary 8 bit values are entered as \hh where h is a lowercase hex ; digit. Note that h must be lowercase. ; ; + Format lines can have the following commands embedded in them. ; Note that only 10 registers (indexed 0-9) are currently implemented. ; \U\hh Set the 'U' value to hh. It is reset after the next command. ; \Ui\hh Set the 'U' value to register[hh]. ; \X\hh Set the 'X' value to hh. It is reset after the next command. ; \Xi\hh Set the 'X' value to register[hh]. ; \=\hh register[hh] = {register[U]|X|1} (assign) ; \*\hh register[hh] = register[hh] * {register[U]|X|1} (multiply) ; \/\hh register[hh] = register[hh] / {register[U]|X|1} (divide) ; \#\hh register[hh] = register[hh] # {register[U]|X|1} (modulus) ; \+\hh register[hh] = register[hh] + {register[U]|X|1} (add) ; \-\hh register[hh] = register[hh] - {register[U]|X|1} (subtract) ; \<\hh register[hh] = register[hh] << {register[U]|X|1} (shift left) ; \>\hh register[hh] = register[hh] >> {register[U]|X|1} (shift right) ; \&\hh register[hh] = register[hh] & {register[U]|X|1} (bit and) ; \|\hh register[hh] = register[hh] | {register[U]|X|1} (bit or) ; \^\hh register[hh] = register[hh] ^ {register[U]|X|1} (bit xor) ; \~\hh register[hh] = ~register[hh] (bit invert) ; \!\hh register[hh] = !register[hh] (logical invert) ; \F\hh register[hh] = The result of running Function {U|0} on the ; next {X|} characters. ; \U\00 IDS checksum. ; \U\01 XOR checksum. register[hh] is used as the seed value. ; \U\02 ADD checksum. register[hh] is used as the seed value. ; \U\03 CRC-16. register[hh] is used as the seed value ; and register[hh+1] is the polynomial. ; \U\04 CRC-32. register[hh] is used as the seed value ; and register[hh+1] is the polynomial. ; \O\hh Output register[hh] as an {X|1} byte value using method {U|0}. ; \U\00 Binary little-endian (Intel byte order). ; \U\01 Binary big-endian (Motorola byte order). ; \U\02 ASCII text right justified space padded. ; \U\03 ASCII text right justified zero padded. ; \U\04 ASCII text left justified space padded. ; \U\05 ASCII text left justified zero padded. ; \S\hh Scan the next {X|1} bytes into register[hh] using method {U|0}. ; \U\00 ASCII text base 10. ; \U\01 Binary little-endian (Intel byte order). ; \U\02 Binary big-endian (Motorola byte order). ; \P\hh Run Procedure hh on the next {X|} characters. ; \P\00 Reverse characters. ; \P\01 Convert characters to Colorado Time format. Register[1] ; is the current character position on entry and the ; next character position on exit. ; \P\02 Convert characters to Daktronics AllSport format. ; \B\hh Delete {register[U]|hh} (to beginning of line if zero) characters ; before the cursor or until the string contains X characters. ; \D\hh Delete {register[U]|hh} (to end of line if zero) characters ; at the cursor or until the string contains X characters. ; \I\hh Insert {register[U]|hh} spaces at the cursor or until the string ; contains X characters. ; \Ic\hh Insert {register[U]|hh} {X's|spaces} at the cursor. ; \L\hh Move the cursor {register[U]|hh} positions to the left (to the ; beginning of the line if zero). ; \R\hh Move the cursor {register[U]|hh} positions to the right (to the ; end of the line if zero). ; \He\hh Halt if register[hh] == {register[U]|X|0}. ; \Hn\hh Halt if register[hh] != {register[U]|X|0}. ; \Hl\hh Halt if register[hh] < {register[U]|X|0}. ; \Hm\hh Halt if register[hh] <= {register[U]|X|0}. ; \Hg\hh Halt if register[hh] > {register[U]|X|0}. ; \Hh\hh Halt if register[hh] >= {register[U]|X|0}. ; Note that numbers 0 thru 9 can be entered directly for single character ; embedded commands. For example, '\U\04' is the same as '\U4' and ; '\=\01' is the same as '\=1'. ; ; + Be very careful about whitespace in each format line. Characters other ; than '%s' specifiers and embedded commands and values will be sent ; exactly as they appear on the line. This means, for instance, that using ; tabs to make a line 'look right' in your favorite editor will cause ; tabs to be sent to the scoreboard instead of the equivalent number of ; spaces (probably not what you wanted). ; ; The format lines follow. ;****************************************************************************** ;;Initialization ;****************************************************************************** ; Header \10\00\3a\3a\3a\03 \00\X0\=1 ; Data 0 - Heat \00\X\37\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 1 - Round \00\X\22\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 2 - Event \00\X\90\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 3 - Constant \00\X\ff\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 4 - Minutes \00\X\f0\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 5 - Seconds \00\X\00\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 6 - 0.11 Seconds \00\X\00\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 7 - Constant \00\X\ff\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 8 - Constant \00\X\ff\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 9 - Constant \00\X\ff\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 10 - Bitmask 1, 2 \00\X\10\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 11 - Bitmask 3, 4 \00\X\40\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 12 - Constant \00\X\ff\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 13 - Runner/0.001 Seconds \00\X\ff\=8 \00\X\0f\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 14 - Lane \00\X\ff\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 15 - Place \00\X\ff\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Checksum \00\U0\O1 ;****************************************************************************** ;****************************************************************************** ;;TimeRunning ;****************************************************************************** ; Header \10\00\3a\3a\3a\03 \00\X0\=1 ; Data 0 - Heat \00\X\37\=8 \00\X0\=2\X0\=9 \13\06%2.2s\L1\S2\L0\D0 \13\06%2.2s\L2\S9\X\10\*9\U2\|9\L0\D0 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 1 - Place \00\X\2f\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 2 - Round \00\X\90\=8 \00\X0\=2\X0\=9 \13\05%2.2s\L1\S2\L0\D0 \13\05%2.2s\L2\S9\X\10\*9\U2\|9\L0\D0 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 3 - Constant \00\X\ff\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 4 - Minutes \00\X0\=9\X0\=8\X0\=6\X0\=5\X0\=4\X0\=3 \00\X\ff\=7 \11\01%12.12s\L8\S8\L1\U1\S6\U0\S9\L0\D0 \00\X4\>6\~6\&6 \00\U6\=3\U6\=4\U6\=5 \00\X1\<3\X2\<4\X3\<5 \00\U5\|6\U4\|6\U3\|6 \00\U6\|9 \00\X4\<9\Xi8\|9 \00\U0\O9\U0\O7 \00\U7\-1\U9\-1 ; Data 5 - Seconds \00\X0\=9\X0\=8 \00\X\ff\=7 \11\01%12.12s\L5\S8\L1\S9\L0\D0 \00\X4\<9\Xi8\|9 \00\U0\O9\U0\O7 \00\U7\-1\U9\-1 ; Data 6 - .11 Seconds \00\X0\=9 \00\X\0f\=8 \00\X\ff\=7 \11\01%12.12s\L3\S9\L0\D0 \00\X4\<9\Xi8\|9 \00\U0\O9\U0\O7 \00\U7\-1\U9\-1 ; Data 7 - Constant \00\X\ff\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 8 - Constant \00\X\ff\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 9 - Constant \00\X\ff\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 10 - Bitmask 1, 2 \00\X\10\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 11 - Bitmask 3, 4 \00\X\40\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 12 - Constant \00\X\ff\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 13 - .001 Seconds \00\X\ff\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 14 - Lane \00\X\ff\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 15 - Event \00\X\22\=8 \00\X0\=2\X0\=9 \13\04%2.2s\L1\S2\L0\D0 \13\04%2.2s\L2\S9\X\10\*9\U2\|9\L0\D0 \00\U0\O9\U0\O8 \00\U8\-1\U9\-1 ; Checksum \00\U0\O1 ;****************************************************************************** ;****************************************************************************** ;;TimeStopped ;****************************************************************************** ; Header \10\00\3a\3a\3a\03 \00\X0\=1 ; Data 0 - Heat \00\X\b0\=8 \00\X0\=2\X0\=9 \13\06%2.2s\L1\S2\L0\D0 \13\06%2.2s\L2\S9\X\10\*9\U2\|9\L0\D0 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 1 - Place \00\X\22\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 2 - Round \00\X\90\=8 \00\X0\=2\X0\=9 \13\05%2.2s\L1\S2\L0\D0 \13\05%2.2s\L2\S9\X\10\*9\U2\|9\L0\D0 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 3 - Constant \00\X\ff\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 4 - Minutes \00\X0\=9\X0\=8\X0\=6\X0\=5\X0\=4\X0\=3 \00\X\ff\=7 \11\01%12.12s\L8\S8\L1\U1\S6\U0\S9\L0\D0 \00\X4\>6\~6\&6 \00\U6\=3\U6\=4\U6\=5 \00\X1\<3\X2\<4\X3\<5 \00\U5\|6\U4\|6\U3\|6 \00\U6\|9 \00\X4\<9\Xi8\|9 \00\U0\O9\U0\O7 \00\U7\-1\U9\-1 ; Data 5 - Seconds \00\X0\=9\X0\=8 \00\X\ff\=7 \11\01%12.12s\L5\S8\L1\S9\L0\D0 \00\X4\<9\Xi8\|9 \00\U0\O9\U0\O7 \00\U7\-1\U9\-1 ; Data 6 - .11 Seconds \00\X0\=9\X0\=8 \00\X\ff\=7 \11\01%12.12s\L3\S8\L1\S9\L0\D0 \00\X4\<9\Xi8\|9 \00\U0\O9\U0\O7 \00\U7\-1\U9\-1 ; Data 7 - Constant \00\X\ff\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 8 - Constant \00\X\ff\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 9 - Constant \00\X\ff\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 10 - Bitmask 1, 2 \00\X\10\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 11 - Bitmask 3, 4 \00\X\40\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 12 - Constant \00\X\ff\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 13 - .001 Seconds \00\X0\=2\X0\=8 \00\X0\=9 \00\X\0f\=3 \14\03%2.2s\L1\S2\L0\D0 \14\03%2.2s\L2\S8\X\10\*9\U2\|8\L0\D0 \11\01%12.12s\L1\S9\L0\D0 \00\X4\<9\Xi3\|9 \00\U0\O9\U0\O8 \00\U8\-1\U9\-1 ; Data 14 - Lane \00\X\ff\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 15 - Event \00\X\22\=8 \00\X0\=2\X0\=9 \13\04%2.2s\L1\S2\L0\D0 \13\04%2.2s\L2\S9\X\10\*9\U2\|9\L0\D0 \00\U0\O9\U0\O8 \00\U8\-1\U9\-1 ; Checksum \00\U0\O1 ;****************************************************************************** ;****************************************************************************** ;;TimeOfDay ;****************************************************************************** ; Header \10\00\3a\3a\3a\03 \00\X0\=1 ; Data 0 - Heat \00\X\37\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 1 - Place \00\X\2f\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 2 - Round \00\X\90\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 3 - Constant \00\X\ff\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 4 - Minutes \00\X0\=9\X0\=8\X0\=6\X0\=5\X0\=4\X0\=3 \00\X\ff\=7 \11\01%12.12s\L\0b\S8\L1\U1\S6\U0\S9\L0\D0 \00\X4\>6\~6\&6 \00\U6\=3\U6\=4\U6\=5 \00\X1\<3\X2\<4\X3\<5 \00\U5\|6\U4\|6\U3\|6 \00\U6\|9 \00\X4\<9\Xi8\|9 \00\U0\O9\U0\O7 \00\U7\-1\U9\-1 ; Data 5 - Seconds \00\X0\=9\X0\=8 \00\X\ff\=7 \11\01%12.12s\L8\S8\L1\S9\L0\D0 \00\X4\<9\Xi8\|9 \00\U0\O9\U0\O7 \00\U7\-1\U9\-1 ; Data 6 - .11 Seconds \00\X\ff\=9 \00\X\ff\=7 \00\U0\O9\U0\O7 \00\U7\-1\U9\-1 ; Data 7 - Constant \00\X\ff\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 8 - Constant \00\X\ff\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 9 - Constant \00\X\ff\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 10 - Bitmask 1, 2 \00\X\10\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 11 - Bitmask 3, 4 \00\X\00\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 12 - Constant \00\X\ff\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 13 - .001 Seconds \00\X\ff\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 14 - Lane \00\X\ff\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Data 15 - Event \00\X\ff\=8 \00\X\ff\=9 \00\U0\O8\U0\O9 \00\U8\-1\U9\-1 ; Checksum \00\U0\O1 ;****************************************************************************** ;****************************************************************************** ;;Results ;****************************************************************************** ; SANE Packet: ; 36 bytes: 3-byte header, 1-byte packet type, 32-bytes SANE data, 1-byte checksum ; Registers: 1=checksum, 2=temp, 8=high byte, 9=low byte ; Header (send \3a\3a\3a\03) ; checksum: header not included in checksum \10\00\3a\3a\3a\03 ; reset checksum reg[1] \00\X0\=1 ; SANE 0 - Heat (HH)([b7]\13\06) ; Sync | Page | Heat 10's | Heat 1's ; set/reset registers[2/8/9] \00\X\00\=2 ; hardcode sync/page \00\X\b7\=8 \00\X\00\=9 ; encode heat ; 1. get heat len=2, move full left, move right 1, scan 1 char into reg[2], move full left, delete to end ; 2. get heat len=2, move full left, scan 1 char into reg[9], reg[9]=0x10*reg[9], reg[9]=reg[2]|reg[9], move full left, delete to end \13\06%2.2s\L0\R1\S2\L0\D0 \13\06%2.2s\L0\S9\X\10\*9\U2\|9\L0\D0 ; send out SANE 0, reg[8/9] \00\U0\O8\U0\O9 ; checksum: reg[1]=reg[1]-reg[8], reg[1]=reg[1]-reg[9] \00\U8\-1\U9\-1 ; SANE 1 - Round (RR)([22]\13\05) ; Sport | Caption Set | Round 10's | Round 1's ; set/reset registers[2/8/9] \00\X\00\=2 ; hardcode sport/caption set \00\X\22\=8 \00\X\00\=9 ; encode round ; 1. get round len=2, move full left, move right 1, scan 1 char into reg[2], move full left, delete to end ; 2. get round len=2, move full left, scan 1 char into reg[9], reg[9]=0x10*reg[9], reg[9]=reg[2]|reg[9], move full left, delete to end \13\05%2.2s\L0\R1\S2\L0\D0 \13\05%2.2s\L0\S9\X\10\*9\U2\|9\L0\D0 ; send out SANE 1, reg[8/9] \00\U0\O8\U0\O9 ; checksum: reg[1]=reg[1]-reg[8], reg[1]=reg[1]-reg[9] \00\U8\-1\U9\-1 ; SANE 2 - Event (EE)([90]\13\04) ; Volume | Tone | Event 10's | Event 1's ; set/reset registers[2/8/9] \00\X\00\=2 ; hardcode volume/tone \00\X\90\=8 \00\X\00\=9 ; encode event ; 1. get event len=2, move full left, move right 1, scan 1 char into reg[2], move full left, delete to end ; 2. get event len=2, move full left, scan 1 char into reg[9], reg[9]=0x10*reg[9], reg[9]=reg[2]|reg[9], move full left, delete to end \13\04%2.2s\L0\R1\S2\L0\D0 \13\04%2.2s\L0\S9\X\10\*9\U2\|9\L0\D0 ; send out SANE 2, reg[8/9] \00\U0\O8\U0\O9 ; checksum: reg[1]=reg[1]-reg[8], reg[1]=reg[1]-reg[9] \00\U8\-1\U9\-1 ; SANE 3 - Constant ([ffff]) - not used ; EOP | Dimming | Unused | Unused ; set/reset registers[2/8/9] \00\X\00\=2 ; hardcode eop/dimming \00\X\ff\=8 ; hardcode unused/unused \00\X\ff\=9 ; send out SANE 3, reg[8/9] \00\U0\O8\U0\O9 ; checksum: reg[1]=reg[1]-reg[8], reg[1]=reg[1]-reg[9] \00\U8\-1\U9\-1 ; SANE 4 - Minutes (HH:MM:SS.sss)(\14\06[ff]) ; Minutes 10's | Minutes 1's | Unused | Unused ; set/reset registers[2/8/9] \00\X\00\=2 \00\X\00\=8 \00\X\ff\=9 ; encode minutes ; 1. get time len=12, move full left, move right 4, scan 1 char into reg[2], move full left, delete to end ; 2. get time len=12, move full left, move right 3, scan 1 char into reg[8], reg[8]=0x10*reg[8], reg[8]=reg[2]|reg[8], move full left, delete to end \14\06%12.12s\L0\R4\S2\L0\D0 \14\06%12.12s\L0\R3\S8\X\10\*8\U2\|8\L0\D0 ; send out SANE 4, reg[8/9] \00\U0\O8\U0\O9 ; checksum: reg[1]=reg[1]-reg[8], reg[1]=reg[1]-reg[9] \00\U8\-1\U9\-1 ; SANE 5 - Seconds (HH:MM:SS.sss)(\14\06[ff]) ; Seconds 10's | Seconds 1's | Unused | Unused ; set/reset registers[2/8/9] \00\X\00\=2 \00\X\00\=8 \00\X\ff\=9 ; encode seconds ; 1. get time len=12, move full left, move right 7, scan 1 char into reg[2], move full left, delete to end ; 2. get time len=12, move full left, move right 6, scan 1 char into reg[8], reg[8]=0x10*reg[8], reg[8]=reg[2]|reg[8], move full left, delete to end \14\06%12.12s\L0\R7\S2\L0\D0 \14\06%12.12s\L0\R6\S8\X\10\*8\U2\|8\L0\D0 ; send out SANE 5, reg[8/9] \00\U0\O8\U0\O9 ; checksum: reg[1]=reg[1]-reg[8], reg[1]=reg[1]-reg[9] \00\U8\-1\U9\-1 ; SANE 6 - 0.11 Seconds (HH:MM:SS.sss)(\14\06[ff]) ; Seconds 0.1's | Seconds 0.01's | Unused | Unused ; set/reset registers[2/8/9] \00\X\00\=2 \00\X\00\=8 \00\X\ff\=9 ; encode 0.11 seconds ; 1. get time len=12, move full left, move right 0x0a(10), scan 1 char into reg[2], move full left, delete to end ; 2. get time len=12, move full left, move right 9, scan 1 char into reg[8], reg[8]=0x10*reg[8], reg[8]=reg[2]|reg[8], move full left, delete to end \14\06%12.12s\L0\R\0a\S2\L0\D0 \14\06%12.12s\L0\R9\S8\X\10\*8\U2\|8\L0\D0 ; send out SANE 6, reg[8/9] \00\U0\O8\U0\O9 ; checksum: reg[1]=reg[1]-reg[8], reg[1]=reg[1]-reg[9] \00\U8\-1\U9\-1 ; SANE 7 - Constant ([ffff]) - not used ; Aux Minutes 10's | Aux Minutes 1's | Unused | Unused ; set/reset registers[2/8/9] \00\X\00\=2 ; hardcode aux minutes \00\X\ff\=8 ; hardcode unused \00\X\ff\=9 ; send out SANE 7, reg[8/9] \00\U0\O8\U0\O9 ; checksum: reg[1]=reg[1]-reg[8], reg[1]=reg[1]-reg[9] \00\U8\-1\U9\-1 ; SANE 8 - Constant ([ffff]) - not used ; Aux Seconds 10's | Aux Seconds 1's | Unused | Unused ; set/reset registers[2/8/9] \00\X\00\=2 ; hardcode aux seconds \00\X\ff\=8 ; hardcode unused \00\X\ff\=9 ; send out SANE 8, reg[8/9] \00\U0\O8\U0\O9 ; checksum: reg[1]=reg[1]-reg[8], reg[1]=reg[1]-reg[9] \00\U8\-1\U9\-1 ; SANE 9 - Constant ([ffff]) - not used ; Seconds Timer 10's | Seconds Timer 1's | Unused | Unused ; set/reset registers[2/8/9] \00\X\00\=2 ; hardcode seconds timer \00\X\ff\=8 ; hardcode unused \00\X\ff\=9 ; send out SANE 9, reg[8/9] \00\U0\O8\U0\O9 ; checksum: reg[1]=reg[1]-reg[8], reg[1]=reg[1]-reg[9] \00\U8\-1\U9\-1 ; SANE 10 - Bitmask 1, 2 ([30ff]) ; Bitmask 1 | Bitmask 2 | Unused | Unused ; set/reset registers[2/8/9] \00\X\00\=2 ; hardcode bitmask \00\X\30\=8 ; hardcode unused \00\X\ff\=9 ; send out SANE 10, reg[8/9] \00\U0\O8\U0\O9 ; checksum: reg[1]=reg[1]-reg[8], reg[1]=reg[1]-reg[9] \00\U8\-1\U9\-1 ; SANE 11 - Bitmask 3, 4 ([40ff]) ; Bitmask 3 | Bitmask 4 | Unused | Unused ; set/reset registers[2/8/9] \00\X\00\=2 ; hardcode bitmask \00\X\40\=8 ; hardcode unused \00\X\ff\=9 ; send out SANE 11, reg[8/9] \00\U0\O8\U0\O9 ; checksum: reg[1]=reg[1]-reg[8], reg[1]=reg[1]-reg[9] \00\U8\-1\U9\-1 ; SANE 12 - Constant ([ffff]) - not used ; Unused | Qtr Single Digit | Used | Used ; set/reset registers[2/8/9] \00\X\00\=2 ; hardcode unused/qtr 1 digit \00\X\ff\=8 ; hardcode used \00\X\ff\=9 ; send out SANE 12, reg[8/9] \00\U0\O8\U0\O9 ; checksum: reg[1]=reg[1]-reg[8], reg[1]=reg[1]-reg[9] \00\U8\-1\U9\-1 ; SANE 13 - Runner (RR), .001 Seconds (HH:MM:SS.sss)(\14\03, \14\06[f]) ; Runner 10's | Runner 1's | 0.001 Seconds | Unused ; set/reset registers[2/8/9] \00\X\00\=2 \00\X\00\=8 \00\X\00\=9 ; encode runner ; 1. get runner len=2, move left 1, move right 2, scan 1 char into reg[2], move full left, delete to end ; 2. get runner len=2, move full left, move right 1, scan 1 char into reg[8], reg[8]=0x10*reg[8], reg[8]=reg[2]|reg[8], move full left, delete to end \14\03%s\L1\S2\L0\D0 \14\03%s\L2\S8\X\10\*8\U2\|8\L0\D0 ; encode 0.001 seconds ; 3. get time len=12, move full left, move right 0x0b(11), scan 1 char into reg[9], reg[9]=0x10*reg[9], reg[9]=0x0f|reg[9], move full left, delete to end \14\06%12.12s\L0\R\0b\S9\X\10\*9\X\0f\|9\L0\D0 ; send out SANE 13, reg[8/9] \00\U0\O8\U0\O9 ; checksum: reg[1]=reg[1]-reg[8], reg[1]=reg[1]-reg[9] \00\U8\-1\U9\-1 ; SANE 14 - Lane (LL)(\14\02[ff]) ; Lane 10's | Lane 1's | Unused | Unused ; set/reset registers[2/8/9] \00\X\00\=2 ; hardcode unused \00\X\00\=8 \00\X\ff\=9 ; encode lane ; 1. get lane len=2, move full left, move right 1, scan 1 char into reg[2], move full left, delete to end ; 2. get lane len=2, move full left, scan 1 char into reg[8], reg[8]=0x10*reg[8], reg[8]=reg[2]|reg[8], move full left, delete to end \14\02%2.2s\L0\R1\S2\L0\D0 \14\02%2.2s\L0\S8\X\10\*8\U2\|8\L0\D0 ; send out SANE 14, reg[8/9] \00\U0\O8\U0\O9 ; checksum: reg[1]=reg[1]-reg[8], reg[1]=reg[1]-reg[9] \00\U8\-1\U9\-1 ; SANE 15 - Place (PP)(\14\01[ff]) ; Place 10's | Place 1's | Checksum | Checksum ; set/reset registers[2/8/9] \00\X\00\=2 ; hardcode checksum (unused, sent below) \00\X\00\=8 \00\X\ff\=9 ; encode place ; 1. get place len=2, move full left, move right 1, scan 1 char into reg[2], move full left, delete to end ; 2. get place len=2, move full left, scan 1 char into reg[8], reg[8]=0x10*reg[8], reg[8]=reg[2]|reg[8], move full left, delete to end \14\01%2.2s\L0\R1\S2\L0\D0 \14\01%2.2s\L0\S8\X\10\*8\U2\|8\L0\D0 ; send out SANE 15, reg[8/9] \00\U0\O8\U0\O9 ; checksum: reg[1]=reg[1]-reg[8], reg[1]=reg[1]-reg[9] \00\U8\-1\U9\-1 ; SANE Checksum Byte (negated sum of all bytes) ; send out SANE checksum, reg[1] \00\U0\O1 ;******************************************************************************