; You should have received a copy of the GNU General Public License
; along with this program. If not, see <http://www.gnu.org/licenses/>.
-
;https://forth-standard.org/standard/core/ALIGNED
;C ALIGNED addr -- a-addr align given addr
FORTHWORD "ALIGNED"
; along with this program. If not, see <http://www.gnu.org/licenses/>.
- .IFNDEF ALIGNMENT
- .include "ADDON\ALIGNMENT.asm"
- .ENDIF
+ FORTHWORD "{ANS_COMP}"
+ mNEXT
+
.IFNDEF ARITHMETIC
.include "ADDON\ARITHMETIC.asm"
.ENDIF
+ .IFNDEF ALIGNMENT
+ .include "ADDON\ALIGNMENT.asm"
+ .ENDIF
.IFNDEF PORTABILITY
.include "ADDON\PORTABILITY.asm"
.ENDIF
;https://forth-standard.org/standard/core/OnePlus
;C 1+ n1/u1 -- n2/u2 add 1 to TOS
FORTHWORD "1+"
-ONEPLUS ADD #1,TOS
+ ADD #1,TOS
mNEXT
;https://forth-standard.org/standard/core/OneMinus
; along with this program. If not, see <http://www.gnu.org/licenses/>.
-;https://forth-standard.org/standard/core/NIP
-;CE NIP x1 x2 -- x2
- FORTHWORD "NIP"
-NIP ADD #2,PSP ; 1
- mNEXT ; 4
-
-;https://forth-standard.org/standard/core/StoD
-;C S>D n -- d single -> double prec.
- FORTHWORD "S>D"
-STOD: SUB #2,PSP
- MOV TOS,0(PSP)
- JMP ZEROLESS
-
.IFDEF MPY
;https://forth-standard.org/standard/core/UMTimes
--- /dev/null
+
+
+ .IFNDEF LOWERCASE
+ .WARNING "uncomment LOWERCASE ADD-ON to pass coretest COMPARE ADD-ON !"
+ .ENDIF
+
+
+;COMPARE ( c-addr1 u1 c-addr2 u2 -- n )
+;https://forth-standard.org/standard/string/COMPARE
+;Compare the string specified by c-addr1 u1 to the string specified by c-addr2 u2.
+;The strings are compared, beginning at the given addresses, character by character,
+;up to the length of the shorter string or until a difference is found.
+;If the two strings are identical, n is zero.
+;If the two strings are identical up to the length of the shorter string,
+; n is minus-one (-1) if u1 is less than u2 and one (1) otherwise.
+;If the two strings are not identical up to the length of the shorter string,
+; n is minus-one (-1) if the first non-matching character in the string specified by c-addr1 u1
+; has a lesser numeric value than the corresponding character in the string specified by c-addr2 u2 and one (1) otherwise.
+ FORTHWORD "COMPARE"
+COMPARE
+ MOV TOS,S ;1 u2 = S
+ MOV @PSP+,Y ;2 addr2 = Y
+ MOV @PSP+,T ;2 u1 = T
+ MOV @PSP+,X ;2 addr1 = X
+COMPAR1 MOV T,TOS ;1
+ ADD S,TOS ;1
+ JZ COMPEQUAL ;2 end of all successfull comparisons
+ SUB #1,T ;1
+ JN COMPLESS ;2 u1<u2
+ SUB #1,S ;1
+ JN COMPGREATER ;2 u2<u1
+ ADD #1,X ;1
+ CMP.B @Y+,-1(X) ;4 char1-char2
+ JZ COMPAR1 ;2 char1=char2 17~ loop
+ JHS COMPGREATER ;2 char1>char2
+COMPLESS ; char1<char2
+ MOV #-1,TOS ;1
+ MOV @IP+,PC ;4
+COMPGREATER
+ MOV #1,TOS ;1
+COMPEQUAL
+ MOV @IP+,PC ;4 20 words
+
+;[THEN]
+;https://forth-standard.org/standard/tools/BracketTHEN
+ FORTHWORDIMM "[THEN]" ; do nothing
+ mNEXT
+
+ONEMIN
+ SUB #1,TOS
+ mNEXT
+
+;[ELSE]
+;Compilation:
+;Perform the execution semantics given below.
+;Execution:
+;( "<spaces>name ..." -- )
+;Skipping leading spaces, parse and discard space-delimited words from the parse area,
+;including nested occurrences of [IF] ... [THEN] and [IF] ... [ELSE] ... [THEN],
+;until the word [THEN] has been parsed and discarded.
+;If the parse area becomes exhausted, it is refilled as with REFILL.
+ FORTHWORDIMM "[ELSE]"
+BRACKETELSE
+ mDOCOL
+ .word lit,1 ; 1
+BRACKETELSE1 ; BEGIN
+BRACKETELSE2 ; BEGIN
+ .word FBLANK,WORDD,COUNT ; BL WORD COUNT
+ .word DUP,QBRAN,BRACKETELSE10 ; DUP WHILE
+ .word OVER,OVER ; 2DUP
+ .word XSQUOTE ; S" [IF]"
+ .byte 4,"[IF]" ;
+ .word COMPARE ; COMPARE
+ .word QZBRAN,BRACKETELSE3 ; 0= IF
+ .word TWODROP,ONEPLUS ; 2DROP 1+
+ .word BRAN,BRACKETELSE8 ; (ENDIF)
+BRACKETELSE3 ; ELSE
+ .word OVER,OVER ; OVER OVER
+ .word XSQUOTE ; S" [ELSE]"
+ .byte 6,"[ELSE]" ;
+ .word COMPARE ; COMPARE
+ .word QZBRAN,BRACKETELSE5 ; 0= IF
+ .word TWODROP,ONEMIN ; 2DROP 1-
+ .word DUP,QBRAN,BRACKETELSE4 ; DUP IF
+ .word ONEPLUS ; 1+
+BRACKETELSE4 ; THEN
+ .word BRAN,BRACKETELSE7 ; (ENDIF)
+BRACKETELSE5 ; ELSE
+ .word XSQUOTE ; S" [THEN]"
+ .byte 6,"[THEN]" ;
+ .word COMPARE ; COMPARE
+ .word QZBRAN,BRACKETELSE6 ; 0= IF
+ .word ONEMIN ; 1-
+BRACKETELSE6 ; THEN
+BRACKETELSE7 ; THEN
+BRACKETELSE8 ; THEN
+ .word QDUP ; ?DUP
+ .word QZBRAN,BRACKETELSE9 ; 0= IF
+ .word EXIT ; EXIT
+BRACKETELSE9 ; THEN
+ .word BRAN,BRACKETELSE2 ; REPEAT
+BRACKETELSE10 ;
+ .word TWODROP ; 2DROP
+ .word XSQUOTE ; CR ." ko " to show false branch of conditionnal compilation
+ .byte 4,13,107,111,32 ;
+ .word TYPE ;
+ .word FTIB,DUP,lit,TIB_SIZE ; REFILL
+ .word ACCEPT ; -- StringOrg len' (len' <= TIB_SIZE)
+ FORTHtoASM ;
+ MOV TOS,&SOURCE_LEN ; -- StringOrg len'
+ MOV @PSP+,&SOURCE_ADR ; -- len'
+ MOV @PSP+,TOS ;
+ MOV #0,&TOIN ;
+ MOV #BRACKETELSE1,IP ; AGAIN
+ mNEXT ; 78 words
+
+
+;[IF]
+;https://forth-standard.org/standard/tools/BracketIF
+;Compilation:
+;Perform the execution semantics given below.
+;Execution: ;( flag | flag "<spaces>name ..." -- )
+;If flag is true, do nothing. Otherwise, skipping leading spaces,
+; parse and discard space-delimited words from the parse area,
+; including nested occurrences of [IF] ... [THEN] and [IF] ... [ELSE] ... [THEN],
+; until either the word [ELSE] or the word [THEN] has been parsed and discarded.
+;If the parse area becomes exhausted, it is refilled as with REFILL. [IF] is an immediate word.
+;An ambiguous condition exists if [IF] is POSTPONEd,
+; or if the end of the input buffer is reached and cannot be refilled before the terminating [ELSE] or [THEN] is parsed.
+ FORTHWORDIMM "[IF]" ; flag --
+ CMP #0,TOS
+ MOV @PSP+,TOS
+ JZ BRACKETELSE
+ mNEXT
+
+;[UNDEFINED]
+;https://forth-standard.org/standard/tools/BracketUNDEFINED
+;Compilation:
+;Perform the execution semantics given below.
+;Execution: ( "<spaces>name ..." -- flag )
+;Skip leading space delimiters. Parse name delimited by a space.
+;Return a false flag if name is the name of a word that can be found,
+;otherwise return a true flag.
+ FORTHWORDIMM "[UNDEFINED]"
+ mDOCOL
+ .word FBLANK,WORDD,FIND,NIP,ZEROEQUAL,EXIT
+
+;[DEFINED]
+;https://forth-standard.org/standard/tools/BracketDEFINED
+;Compilation:
+;Perform the execution semantics given below.
+;Execution:
+;( "<spaces>name ..." -- flag )
+;Skip leading space delimiters. Parse name delimited by a space.
+;Return a true flag if name is the name of a word that can be found,
+;otherwise return a false flag. [DEFINED] is an immediate word.
+
+ FORTHWORDIMM "[DEFINED]"
+ mDOCOL
+ .word FBLANK,WORDD,FIND,NIP,EXIT
+
+
+
+;;[THEN]
+;;https://forth-standard.org/standard/tools/BracketTHEN
+; FORTHWORDIMM ".ENDIF" ; do nothing
+; mNEXT
+;
+;ONEMIN
+; SUB #1,TOS
+; mNEXT
+;
+;;[ELSE]
+;;Compilation:
+;;Perform the execution semantics given below.
+;;Execution:
+;;( "<spaces>name ..." -- )
+;;Skipping leading spaces, parse and discard space-delimited words from the parse area,
+;;including nested occurrences of [IF] ... [THEN] and [IF] ... [ELSE] ... [THEN],
+;;until the word [THEN] has been parsed and discarded.
+;;If the parse area becomes exhausted, it is refilled as with REFILL.
+; FORTHWORDIMM ".ELSE"
+;;BRACKETELSE
+; mDOCOL
+;BRACKETELSE
+; .word lit,1 ; 1
+;BRACKETELSE1 ; BEGIN
+;BRACKETELSE2 ; BEGIN
+; .word FBLANK,WORDD,COUNT ; BL WORD COUNT
+; .word DUP,QBRAN,BRACKETELSE10 ; DUP WHILE
+; .word OVER,OVER ; 2DUP
+; .word XSQUOTE ; S" [IF]"
+; .byte 6,".IFDEF" ;
+; .word COMPARE ; COMPARE
+; .word QZBRAN,BRACKETELSE21 ; 0= IF
+; .word TWODROP,ONEPLUS ; 2DROP 1+
+; .word BRAN,BRACKETELSE8 ; (ENDIF)
+;BRACKETELSE21
+; .word OVER,OVER ; 2DUP
+; .word XSQUOTE ; S" [IF]"
+; .byte 7,".IFNDEF" ;
+; .word COMPARE ; COMPARE
+; .word QZBRAN,BRACKETELSE3 ; 0= IF
+; .word TWODROP,ONEPLUS ; 2DROP 1+
+; .word BRAN,BRACKETELSE8 ; (ENDIF)
+;BRACKETELSE3 ; ELSE
+; .word OVER,OVER ; OVER OVER
+; .word XSQUOTE ; S" [ELSE]"
+; .byte 5,".ELSE" ;
+; .word COMPARE ; COMPARE
+; .word QZBRAN,BRACKETELSE5 ; 0= IF
+; .word TWODROP,ONEMIN ; 2DROP 1-
+; .word DUP,QBRAN,BRACKETELSE4 ; DUP IF
+; .word ONEPLUS ; 1+
+;BRACKETELSE4 ; THEN
+; .word BRAN,BRACKETELSE7 ; (ENDIF)
+;BRACKETELSE5 ; ELSE
+; .word XSQUOTE ; S" [THEN]"
+; .byte 6,".ENDIF" ;
+; .word COMPARE ; COMPARE
+; .word QZBRAN,BRACKETELSE6 ; 0= IF
+; .word ONEMIN ; 1-
+;BRACKETELSE6 ; THEN
+;BRACKETELSE7 ; THEN
+;BRACKETELSE8 ; THEN
+; .word QDUP ; ?DUP
+; .word QZBRAN,BRACKETELSE9 ; 0= IF
+; .word EXIT ; EXIT
+;BRACKETELSE9 ; THEN
+; .word BRAN,BRACKETELSE2 ; REPEAT
+;BRACKETELSE10 ;
+; .word TWODROP ; 2DROP
+; .word XSQUOTE ; CR ." ko " to show false branch of conditionnal compilation
+; .byte 4,13,"ko " ;
+; .word TYPE ;
+; .word FTIB,DUP,lit,TIB_SIZE ; REFILL
+; .word ACCEPT ; -- StringOrg len' (len' <= TIB_SIZE)
+; FORTHtoASM ;
+; MOV TOS,&SOURCE_LEN ; -- StringOrg len'
+; MOV @PSP+,&SOURCE_ADR ; -- len'
+; MOV @PSP+,TOS ;
+; MOV #0,&TOIN ;
+; MOV #BRACKETELSE1,IP ; AGAIN
+; mNEXT ; 78 words
+;
+;
+; FORTHWORDIMM ".IFDEF"
+; mDOCOL
+; .word FBLANK,WORDD,FIND,NIP
+; .WORD QBRAN,BRACKETELSE
+; .WORD EXIT
+;
+; FORTHWORDIMM ".IFNDEF"
+; mDOCOL
+; .word FBLANK,WORDD,FIND,NIP
+; .WORD QZBRAN,BRACKETELSE
+; .WORD EXIT
+
+
\ No newline at end of file
--- /dev/null
+; -*- coding: utf-8 -*-
+; http://patorjk.com/software/taag/#p=display&f=Banner&t=Fast Forth
+
+; Fast Forth For Texas Instrument MSP430FRxxxx FRAM devices
+; Copyright (C) <2015> <J.M. THOORENS>
+;
+; This program is free software: you can redistribute it and/or modify
+; it under the terms of the GNU General Public License as published by
+; the Free Software Foundation, either version 3 of the License, or
+; (at your option) any later version.
+;
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+; GNU General Public License for more details.
+;
+; You should have received a copy of the GNU General Public License
+; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;https://forth-standard.org/standard/core/DotR
+;CE .R
+
+;https://forth-standard.org/standard/core/Zerone
+;CE 0<>
+
+;https://forth-standard.org/standard/core/Zeromore
+;CE 0>
+
+;https://forth-standard.org/standard/core/TwotoR
+;CE 2>R
+
+;https://forth-standard.org/standard/core/TwoRfrom
+;CE 2R>
+
+;https://forth-standard.org/standard/core/TwoRFetch
+;CE 2R@
+
+;https://forth-standard.org/standard/core/ColonNONAME
+;CE :NONAME
+
+;https://forth-standard.org/standard/core/ne
+;CE <>
+
+;https://forth-standard.org/standard/core/qDO
+;CE ?DO
+
+;https://forth-standard.org/standard/core/ACTION-OF
+;CE ACTION-OF
+; STATE @ IF
+; POSTPONE ['] POSTPONE DEFER@
+; ELSE
+; ' DEFER@
+; THEN ; IMMEDIATE
+
+ FORTHWORDIMM "ACTION-OF"
+ mDOCOL
+ .word STATE,FETCH,QBRAN,AOF1
+ .word BRACKETTICK,COMMA,DEFER@,COMMA,EXIT
+AOF1 .word TICK,DEFER@,EXIT
+
+;https://forth-standard.org/standard/core/BUFFERColon
+;CE BUFFER:
+ FORTHWORD "BUFFER" ; ( u "<name>" -- ; -- addr )
+ mDOCOL
+ .word CREATE,ALLOT,EXIT
+
+;Z (C") -- c-addr run-time code for C"
+; get address and length of string.
+XCQUOTE: SUB #2,PSP ; 1 -- x TOS ; push old TOS on stack
+ MOV TOS,0(PSP) ; 3 -- TOS x ; and reserve one cell on stack
+ MOV IP,TOS ; 2 -- c-addr ;
+ MOV.B @IP+,W
+ ADD W,IP ; 1 -- addr u IP=addr+u=addr(end_of_string)
+ BIT #1,IP ; 1 -- addr u IP=addr+u Carry set/clear if odd/even
+ ADDC #0,IP ; 1 -- addr u IP=addr+u aligned
+ mNEXT ; 4 16~
+
+;https://forth-standard.org/standard/core/Cq
+;CE C"
+ FORTHWORDIMM "C\34" ; immediate
+CQUOTE: mDOCOL
+ .word lit,XCQUOTE,COMMA
+ .word BRAN,SQUOTE1
+
+;https://forth-standard.org/standard/core/CASE
+; CE CASE
+
+;https://forth-standard.org/standard/core/COMPILEComma
+;CE COMPILE,
+ FORTHWORD "COMPILE,"
+ MOV #COMMA,PC
+
+;https://forth-standard.org/standard/core/DEFERStore
+;C DEFER! xt CFA_DEFER -- ; store xt to the address after DODEFER
+ FORTHWORD "DEFER!"
+DEFERSTORE: MOV @PSP+,2(TOS) ; -- CFA_DEFER xt --> [CFA_DEFER+2]
+ MOV @PSP+,TOS ; --
+ mNEXT
+
+;https://forth-standard.org/standard/core/DEFERFetch
+;CE DEFER@
+ FORTHWORD "DEFER@"
+DEFER@ ADD #2,TOS
+ MNEXT
+
+;https://forth-standard.org/standard/core/ENDCASE
+;CE ENDCASE
+
+;https://forth-standard.org/standard/core/ENDOF
+;CE ENDOF
+
+;https://forth-standard.org/standard/core/HOLDS
+;CE HOLDS
+
+;https://forth-standard.org/standard/core/MARKER
+;CE MARKER
+
+;https://forth-standard.org/standard/core/OF
+;CE OF
+
+;https://forth-standard.org/standard/core/PARSE
+;CE PARSE
+
+;https://forth-standard.org/standard/core/PARSE-NAME
+;CE PARSE-NAME
+
+;https://forth-standard.org/standard/core/PICK
+;CE PICK
+
+;https://forth-standard.org/standard/core/REFILL
+;CE REFILL
+
+;https://forth-standard.org/standard/core/RESTORE-INPUT
+;CE RESTORE-INPUT
+
+;https://forth-standard.org/standard/core/ROLL
+;CE ROLL
+
+;https://forth-standard.org/standard/core/SAVE-INPUT
+;CE SAVE-INPUT
+
+;https://forth-standard.org/standard/core/SOURCE-ID
+;CE SOURCE-ID
+
+;https://forth-standard.org/standard/core/Seq
+;CE S\"
+
+;https://forth-standard.org/standard/core/TO
+;CE TO
+ FORTHWORD "TO"
+ MOV #IS,PC
+
+;https://forth-standard.org/standard/core/TRUE
+;CE TRUE
+
+;https://forth-standard.org/standard/core/TUCK
+;CE TUCK
+
+;https://forth-standard.org/standard/core/UDotR
+;CE U.R
+
+;https://forth-standard.org/standard/core/Umore
+;CE U>
+
+;https://forth-standard.org/standard/core/UNUSED
+;CE UNUSED
+
+;https://forth-standard.org/standard/core/VALUE
+;CE VALUE
+ FORTHWORD "VALUE"
+ MOV #CONSTANT,PC
+
+;https://forth-standard.org/standard/core/WITHIN
+;CE WITHIN
+
+;https://forth-standard.org/standard/core/BracketCOMPILE
+;CE [COMPILE]
+
+
; along with this program. If not, see <http://www.gnu.org/licenses/>.
+;https://forth-standard.org/standard/core/StoD
+;C S>D n -- d single -> double prec.
+ FORTHWORD "S>D"
+STOD: SUB #2,PSP
+ MOV TOS,0(PSP)
+ JMP ZEROLESS
+
;https://forth-standard.org/standard/core/TwoFetch
;C 2@ a-addr -- x1 x2 fetch 2 cells ; the lower address will appear on top of stack
FORTHWORD "2@"
; along with this program. If not, see <http://www.gnu.org/licenses/>.
+ .IFNDEF UTILITY
+
+ .IFNDEF ANS_CORE_COMPLIANT
+
+;https://forth-standard.org/standard/core/MAX
+;C MAX n1 n2 -- n3 signed maximum
+ FORTHWORD "MAX"
+MAX: CMP @PSP,TOS ; n2-n1
+ JL SELn1 ; n2<n1
+SELn2: ADD #2,PSP
+ mNEXT
+
+;https://forth-standard.org/standard/core/MIN
+;C MIN n1 n2 -- n3 signed minimum
+ FORTHWORD "MIN"
+MIN: CMP @PSP,TOS ; n2-n1
+ JL SELn2 ; n2<n1
+SELn1: MOV @PSP+,TOS
+ mNEXT
+
+ .ENDIF ; ANS_CORE_COMPLIANT
+
+;https://forth-standard.org/standard/core/UDotR
+;X U.R u n -- display u unsigned in n width
+ FORTHWORD "U.R"
+UDOTR mDOCOL
+ .word TOR,LESSNUM,lit,0,NUM,NUMS,NUMGREATER
+ .word RFROM,OVER,MINUS,lit,0,MAX,SPACES,TYPE
+ .word EXIT
+
+;https://forth-standard.org/standard/tools/DUMP
+ FORTHWORD "DUMP"
+DUMP PUSH IP
+ PUSH &BASE
+ MOV #10h,&BASE
+ ADD @PSP,TOS ; compute end address
+ AND #0FFF0h,0(PSP) ; compute start address
+ ASMtoFORTH
+ .word SWAP,xdo ; generate line
+DUMP1 .word CR
+ .word II,lit,7,UDOTR,SPACE ; generate address
+ .word II,lit,10h,PLUS,II,xdo ; display 16 bytes
+DUMP2 .word II,CFETCH,lit,3,UDOTR
+ .word xloop,DUMP2
+ .word SPACE,SPACE
+ .word II,lit,10h,PLUS,II,xdo ; display 16 chars
+DUMP3 .word II,CFETCH
+ .word lit,7Eh,MIN,FBLANK,MAX,EMIT
+ .word xloop,DUMP3
+ .word lit,10h,xploop,DUMP1
+ .word RFROM,FBASE,STORE
+ .word EXIT
+
+ .ENDIF ; UTILITY
+
+ FORTHWORD "{SD_TOOLS}"
+ mNEXT
; read logical sector and dump it
; ----------------------------------;
- FORTHWORD "SECT_D" ; sector. -- don't forget to add decimal point to your sector number (if < 65536)
+ FORTHWORD "SECTOR" ; sector. -- don't forget to add decimal point to your sector number (if < 65536)
; ----------------------------------;
-SECT_D
+SECTOR
MOV TOS,X ; X = SectorH
MOV @PSP,W ; W = sectorL
CALL #readSectorWX ; W = SectorLO X = SectorHI
DisplaySector
mDOCOL ;
- .word UDDOT ; ud -- display the double number
+ .word LESSNUM,NUMS,NUMGREATER ; ud -- display the double number
+ .word TYPE,SPACE ;
.word lit,BUFFER,lit,200h,DUMP;
.word EXIT ;
; ----------------------------------;
; ----------------------------------;
; read first sector of Cluster and dump it
; ----------------------------------;
- FORTHWORD "CLUST_D" ; cluster. -- don't forget to add decimal point to your sector number (if < 65536)
+ FORTHWORD "CLUSTER" ; cluster. -- don't forget to add decimal point to your sector number (if < 65536)
; ----------------------------------;
MOV TOS,&ClusterH ;
MOV @PSP,&ClusterL ;
CALL #ComputeClusFrstSect ;
MOV &SectorL,0(PSP) ;
MOV &SectorH,TOS ;
- JMP SECT_D ;
+ JMP SECTOR ;
; ----------------------------------;
; dump FAT1 sector of last entry
; ----------------------------------;
- FORTHWORD "FAT_D" ;VWXY Display first FATsector
+ FORTHWORD "FAT" ;VWXY Display first FATsector
; ----------------------------------;
SUB #4,PSP ;
MOV TOS,2(PSP) ;
MOV &OrgFAT1,0(PSP) ;
MOV #0,TOS ; FATsectorHI = 0
- JMP SECT_D ;
+ JMP SECTOR ;
; ----------------------------------;
;; dump FAT1 sector of last entry
;; ----------------------------------;
-; FORTHWORD "FAT1_D" ; Display FATsector
+; FORTHWORD "FAT" ; Display FATsector
;; ----------------------------------;
; MOV &OrgFAT1,Y ;
-;FAT1_D_Next ;
+;FAT1_Next ;
; SUB #4,PSP ;
; MOV TOS,2(PSP) ; save TOS
; MOV Y,0(PSP) ;
; MOV #0,TOS ; FATsectorHI = 0
-; JMP SECT_D ;
+; JMP SECTOR ;
;; ----------------------------------;
;
;; dump FAT1 sector of last entry
;; ----------------------------------;
-; FORTHWORD "FAT2_D" ; Display FATsector
+; FORTHWORD "FAT2" ; Display FATsector
;; ----------------------------------;
; MOV &OrgFAT2,Y ;
-; JMP FAT1_D_Next ;
+; JMP FAT1_Next ;
;; ----------------------------------;
; dump DIR sector of opened file or first sector of current DIR by default
; ----------------------------------;
- FORTHWORD "DIR_D" ; Display DIR sector of CurrentHdl or CurrentDir sector by default
+ FORTHWORD "DIR" ; Display DIR sector of CurrentHdl or CurrentDir sector by default
; ----------------------------------;
SUB #4,PSP ;
MOV TOS,2(PSP) ; save TOS
; along with this program. If not, see <http://www.gnu.org/licenses/>.
+ FORTHWORD "{UTILITY}"
+ mNEXT
+
;https://forth-standard.org/standard/tools/DotS
-;X .S -- print <number> of cells and stack contents if not empty
- FORTHWORD ".S"
-DOTS mDOCOL
+ FORTHWORD ".S" ; -- print <depth> of Param Stack and stack contents if not empty
+DOTS MOV TOS,-2(PSP) ; -- TOS ( tos x x )
+ MOV PSP,TOS
+ SUB #2,TOS ; to take count that TOS is first cell
+ MOV TOS,-6(PSP) ; -- TOS ( tos x PSP )
+ MOV #PSTACK,TOS ; -- P0 ( tos x PSP )
+ SUB #2,TOS ; to take count that TOS is first cell
+DOTS1 MOV TOS,-4(PSP) ; -- S0 ( tos S0 SP )
+ SUB #6,PSP ; -- S0 SP S0
+ SUB @PSP,TOS ; -- S0 SP S0-SP
+ RRA TOS ; -- S0 SP #cells
+ mDOCOL
.word lit,'<',EMIT
- .word DEPTH,DOT
+ .word DOT ; display #cells
.word lit,08h,EMIT ; backspace
.word lit,'>',EMIT,SPACE
- .word SPFETCH,lit,PSTACK,ULESS
- .word QBRAN,DOTS2
- .word SPFETCH,lit,PSTACK-2,xdo
-DOTS1: .word II,FETCH,UDOT
- .word lit,-2
- .word xploop,DOTS1
-DOTS2: .word EXIT
+ .word OVER,OVER,GREATER
+ .word QZBRAN,STKDISPL1
+ .word DROP,DROP,EXIT
+STKDISPL1 .word xdo
+STKDISPL2 .word II,FETCH,UDOT
+ .word lit,2,xploop,STKDISPL2
+ .word EXIT
+
+
+ FORTHWORD ".RS" ; -- print <depth> of Return Stack and stack contents if not empty
+ MOV TOS,-2(PSP) ; -- TOS ( tos x x )
+ MOV RSP,-6(PSP) ; -- TOS ( tos x RSP )
+ MOV #RSTACK,TOS ; -- R0 ( tos x RSP )
+ JMP DOTS1
;https://forth-standard.org/standard/tools/q
;Z ? adr -- display the content of adr
MOV #UDOT,PC
;https://forth-standard.org/standard/tools/WORDS
-;X WORDS -- list all words in all dicts. 53 words
+;X WORDS -- list all words in first vocabulary in CONTEXT. 38 words
FORTHWORD "WORDS"
WORDS mDOCOL
+ .word CR
+ .word lit,3,SPACES
.SWITCH THREADS
.CASE 1
-; vvvvvvvv may be skipped vvvvvvvv
- .word CR ; type # of threads in vocabularies
- .word lit,3,SPACES
- .word XSQUOTE
- .byte 23,"monothread vocabularies"
- .word TYPE
-; ^^^^^^^^ may be skipped ^^^^^^^^
-
- .word LIT,CONTEXT
-WORDS1 .word DUP,CELLPLUS,SWAP
- .word FETCH,QDUP
- .word QBRAN,WORDS5
- .word CR
- .word lit,3,SPACES
-WORDS3 .word FETCH,QDUP
- .word QBRAN,WORDS4
- .word DUP,DUP,COUNT
- .word lit,07Fh,ANDD,TYPE
+;; vvvvvvvv may be skipped vvvvvvvv
+; .word XSQUOTE ; type # of threads in vocabularies
+; .byte 23,"monothread vocabularies"
+; .word TYPE
+; .word CR
+; .word lit,3,SPACES
+;; ^^^^^^^^ may be skipped ^^^^^^^^
+
+ .word LIT,CONTEXT,FETCH ; -- VOC_BODY
+WORDS1 .word FETCH ; -- NFA
+ .word QDUP ; -- 0 | -- NFA NFA
+ .word QBRAN,WORDS2 ; -- NFA
+ .word DUP,DUP,COUNT ; -- NFA NFA addr count
+ .word lit,07Fh,ANDD,TYPE ; -- NFA NFA
.word CFETCH,lit,0Fh,ANDD
.word lit,10h,SWAP,MINUS
- .word SPACES,lit,2,MINUS
- .word BRAN,WORDS3
-WORDS4 .word CR
+ .word SPACES
+ .word lit,2,MINUS ; NFA -- LFA
.word BRAN,WORDS1
-WORDS5 .word DROP
- .word EXIT
+WORDS2 .word EXIT ; --
.ELSECASE
-; vvvvvvvv may be skipped vvvvvvvv
- .word FBASE,FETCH
- .word LIT,0Ah,FBASE,STORE
- .word CR ; type # of threads in vocabularies
- .word lit,3,SPACES
- .word LIT,THREADS,DOT
- .word XSQUOTE
- .byte 20,"threads vocabularies"
- .word TYPE
- .word FBASE,STORE
-; ^^^^^^^^ may be skipped ^^^^^^^^
-
- .word LIT,CONTEXT
- ; BEGIN
-WORDS1 .word DUP,CELLPLUS,SWAP
- .word FETCH,QDUP
- .word QBRAN,WORDS6 ;
- .word CR
- .word lit,3,SPACES
-
- .word DUP,LIT,PAD ;
- .word LIT,THREADS,DUP,PLUS
+;; vvvvvvvv may be skipped vvvvvvvv
+; .word FBASE,FETCH
+; .word LIT,0Ah,FBASE,STORE
+; .word LIT,THREADS,DOT
+; .word XSQUOTE ; type # of threads in vocabularies
+; .byte 20,"threads vocabularies"
+; .word TYPE
+; .word FBASE,STORE
+; .word CR
+; .word lit,3,SPACES
+;; ^^^^^^^^ may be skipped ^^^^^^^^
+
+ .word LIT,CONTEXT,FETCH
+ .word PAD,LIT,THREADS,DUP,PLUS
.word MOVE
; BEGIN
WORDS2 .word LIT,0,DUP
- .word LIT,THREADS,DUP,PLUS ; I = ptr = thread*2
+ .word LIT,THREADS,DUP,PLUS ; I = ptr = thread*2
.word LIT,0
- .word xdo ; DO
+ .word xdo ; DO
WORDS3 .word DUP
- .word II,LIT,PAD,PLUS,FETCH ; old MAX NFA U< NFA ?
- .word ULESS,QBRAN,WORDS4 ; no
- .word DROP,DROP,II ; yes, replace old MAX of NFA by new MAX of NFA
- .word DUP,LIT,PAD,PLUS,FETCH ;
-WORDS4 .word LIT,2,xploop,WORDS3 ; 2 +LOOP
- .word QDUP ; MAX of NFA = 0 ?
+ .word II,PAD,PLUS,FETCH ; old MAX NFA U< NFA ?
+ .word ULESS,QBRAN,WORDS4 ; no
+ .word DROP,DROP,II ; yes, replace old MAX of NFA by new MAX of NFA
+ .word DUP,PAD,PLUS,FETCH ;
+WORDS4 .word LIT,2,xploop,WORDS3 ; 2 +LOOP
+ .word QDUP ; MAX of NFA = 0 ?
.word QBRAN,WORDS5 ; WHILE
- .word DUP,LIT,2,MINUS,FETCH ; replace NFA MAX by its [LFA]
- .word ROT,LIT,PAD,PLUS,STORE
- .word DUP,COUNT ; display NFA MAX in 10 chars format
+ .word DUP,LIT,2,MINUS,FETCH ; replace NFA MAX by its [LFA]
+ .word ROT,PAD,PLUS,STORE
+ .word DUP,COUNT ; display NFA MAX in 10 chars format
.word lit,07Fh,ANDD,TYPE
.word CFETCH,lit,0Fh,ANDD
.word lit,10h,SWAP,MINUS
.word SPACES
.word BRAN,WORDS2 ; REPEAT
-WORDS5 .word DROP,DROP
- .word CR
- .word BRAN,WORDS1 ; REPEAT
-WORDS6 .word DROP
+WORDS5 .word DROP
.word EXIT
.ENDCASE
@1800
-10 00 6A C8 80 3E 80 04 FD FF 18 00 2E DB E4 D3
-2A C8 3C C8 00 00 00 00
+10 00 92 C8 80 3E 80 04 05 00 18 00 9C DC 54 D5
+52 C8 64 C8 00 00 00 00
@21AA
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 C4
03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
44 55 50 00 0E 93 F6 23 30 4D 40 C4 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 C4 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E C4 02 3E 52 00 0E 12 3E 4F 30 4D 8E C4
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 C4
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C C4 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 20 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 C4 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 C5
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 C4 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA C4 03 41 4E 44 3E FF 30 4D 7A C4 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E C5 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 C5 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E C5 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 C5 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 C4 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
+50 00 3E 4F 30 4D 00 00 03 4E 49 50 2F 53 30 4D
+00 00 04 53 57 41 50 00 2A 4F 8F 4E 00 00 0E 4A
+30 4D 68 C4 04 4F 56 45 52 00 8F 4E FE FF 2E 4F
+2F 83 30 4D 72 C4 03 52 4F 54 2A 4F 8F 4E 00 00
+1E 4F 02 00 8F 4A 02 00 30 4D 4E C4 02 3E 52 00
+0E 12 3E 4F 30 4D 96 C4 02 52 3E 00 2F 83 8F 4E
+00 00 3E 41 30 4D B8 C4 02 52 40 00 2F 83 8F 4E
+00 00 2E 41 30 4D 5C C4 05 44 45 50 54 48 8F 4E
+FE FF 3E 40 80 20 0E 8F 2F 83 0E 11 30 4D 00 00
+01 40 2E 4E 30 4D F0 C4 01 21 BE 4F 00 00 3E 4F
+30 4D 00 00 02 43 40 00 6E 4E 30 4D 04 C5 02 43
+21 00 FE 4F 00 00 1F 53 3E 4F 30 4D 00 00 01 2B
+3E 5F 30 4D 30 C4 01 2D 3E 8F 3E E3 1E 53 30 4D
+F8 C4 03 41 4E 44 3E FF 30 4D 84 C4 02 4F 52 00
+3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D 3C C5
+06 4E 45 47 41 54 45 00 E8 3F 32 C5 03 41 42 53
+0E 93 E3 33 30 4D D8 C4 04 44 41 42 53 00 3E F3
+06 34 BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D
+00 00 02 30 3D 00 1E 83 0E 7E 30 4D 82 C5 02 30
+3C 00 0E 5E 0E 7E 3E E3 30 4D 8E C5 02 30 3E 00
+1E 93 05 34 0B 3C 00 00 01 3D 3E 8F 07 20 3E 43
+30 4D A8 C5 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
+AC C4 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE C5 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 C5 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 C5 03 3E 49 4E 85 12 C2 21 10 C5
-04 42 41 53 45 00 85 12 DA 21 C0 C4 05 53 54 41
-54 45 85 12 B6 21 30 C6 02 42 4C 00 85 12 20 00
-94 C5 02 3C 23 00 B2 40 AA 21 AA 21 30 4D 1E 15
-0E 43 3D 40 20 00 0A 93 04 20 0D 11 0A 4C 0C 43
-09 43 0E 9B 01 28 0E 8B 09 69 08 68 1D 83 07 30
-0C 5C 0A 6A 0E 6E F5 2B 0E 8B 12 D3 F5 3F 0A 4E
-1D 17 30 41 48 C6 01 23 1B 42 DA 21 2C 4F 0A 4E
-B0 12 5E C6 8F 49 00 00 0E 48 7A 90 0A 00 02 28
-3A 50 07 00 3A 50 30 00 92 83 AA 21 18 42 AA 21
-C8 4A 00 00 30 4D 96 C6 02 23 53 00 87 12 98 C6
-D2 C6 2D 83 09 93 E0 23 0E 93 DE 23 3D 41 30 4D
-C8 C6 02 23 3E 00 9F 42 AA 21 00 00 3E 40 AA 21
-2E 8F 30 4D 00 C6 04 48 4F 4C 44 00 0A 4E 3E 4F
-DB 3F 3C C6 04 53 49 47 4E 00 0E 93 3E 4F 3A 40
-2D 00 D2 33 30 4D F4 C5 03 55 44 2E 87 12 56 C6
-CC C6 E6 C6 50 C9 18 C9 2A C4 18 C7 02 55 2E 00
-2F 83 8F 4E 00 00 0E 43 F1 3F 3E B0 00 80 06 24
-BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D DA C4
-02 44 2E 00 87 12 56 C6 6E C4 80 C4 3A C7 CC C6
-92 C4 0A C7 E6 C6 50 C9 18 C9 2A C4 52 C5 01 2E
-3E B0 00 80 DD 27 2F 83 3E 43 EC 3F F6 C6 04 48
-45 52 45 00 2F 83 8F 4E 00 00 1E 42 C4 21 30 4D
-62 C5 05 41 4C 4C 4F 54 82 5E C4 21 3E 4F 30 4D
-E2 C6 02 43 2C 00 1A 42 C4 21 CA 4E 00 00 92 53
-C4 21 3E 4F 30 4D 2F 83 8F 4E 00 00 B0 12 2A C8
-92 B3 1C 05 FD 27 1E 42 0C 05 B0 12 3C C8 30 4D
-30 40 B6 C7 7E C7 05 28 4B 45 59 29 18 42 0C 05
-EA 3F 12 C6 03 4B 45 59 30 40 DC C7 92 C7 06 41
-43 43 45 50 54 00 3C 40 A8 C8 3B 40 72 C8 2D 15
-0A 4E 2E 4F 0A 5E 3B 40 0D 00 3C 40 20 00 3D 40
-9C C8 92 B3 1C 05 05 24 18 42 0C 05 38 90 0A 00
-04 20 21 53 39 40 56 C8 4D 15 B2 40 11 00 0E 05
-A2 B3 1C 05 FD 27 E2 C2 22 02 30 41 B2 40 13 00
-0E 05 A2 B3 1C 05 FD 27 E2 D2 22 02 30 41 00 00
-05 53 4C 45 45 50 30 40 64 C8 00 00 07 28 53 4C
-45 45 50 29 12 D2 0A 18 F6 3F 21 52 3A 17 58 42
-0C 05 48 9B E3 27 48 9C 06 2C 78 92 11 20 2E 9F
-0F 24 1E 83 05 3C 0E 9A 03 24 CE 48 00 00 1E 53
-82 48 0E 05 A2 B3 1C 05 FD 27 30 4D 9E C8 2D 83
-92 B3 1C 05 FD 27 E3 23 B2 40 18 00 0A 18 3E 8F
-3D 41 30 4D D6 C7 06 28 45 4D 49 54 29 00 08 4E
-3E 4F E6 3F 50 C7 04 45 4D 49 54 00 30 40 BE C8
-C6 C8 04 45 43 48 4F 00 B2 40 82 48 90 C8 30 4D
-6E C7 06 4E 4F 45 43 48 4F 00 B2 40 30 4D 90 C8
-30 4D B6 C8 04 28 43 52 29 00 2F 83 8F 4E 00 00
-3E 40 0D 00 E3 3F A2 C7 02 43 52 00 30 40 FA C8
-04 C7 05 53 50 41 43 45 2F 83 8F 4E 00 00 3E 40
-20 00 D4 3F 12 C9 06 53 50 41 43 45 53 00 0E 93
-09 24 0D 12 3D 40 3A C9 EF 3F 3C C9 2D 83 1E 83
-EB 23 3D 41 3E 4F 30 4D 2C C7 04 54 59 50 45 00
-0E 93 95 24 2A 4F 8F 5E 00 00 0E 4A 87 12 CA C5
-02 C6 0A C5 CC C8 EC C5 60 C9 2A C4 2F 82 8F 4E
-02 00 7E 4D 8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D
-26 C9 82 53 22 00 87 12 34 C4 6C C9 A2 CB 34 C4
-22 00 C6 C9 96 C9 3D 41 6E 4E 1E 83 82 5E C4 21
-3E 4F 92 B3 C4 21 A2 63 C4 21 30 4D E2 C8 82 2E
-22 00 87 12 86 C9 34 C4 50 C9 A2 CB 2A C4 00 00
-04 57 4F 52 44 00 3C 40 BE 21 39 4C 3A 4C 09 5A
-3A 5C 28 4C 09 9A 19 24 7E 9A FC 27 1A 83 3B 40
-60 00 C8 4C 00 00 09 9A 0C 24 7C 4A 4E 9C 09 24
-18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F 7C 80 20 00
-F0 3F 1A 82 C0 21 82 4A C2 21 1E 42 C4 21 08 8E
-CE 48 00 00 30 4D 00 00 04 46 49 4E 44 00 2F 83
-0C 4E 65 4C 74 40 80 00 3B 40 CA 21 3E 4B 0E 93
-1E 24 58 4C 01 00 78 F0 1E 00 0E 58 2E 53 1E 4E
-FE FF 0E 93 F3 27 09 4E 78 49 48 C4 48 95 F7 23
-0A 4C 1A 53 FA 99 00 00 F2 23 58 83 FA 23 19 B3
-09 63 0C 49 6A 4E 1E 43 4A 93 01 30 2E 83 8F 4C
-00 00 35 40 08 C4 34 40 14 C4 30 4D 2F 53 2F 53
-3E 4F 30 4D 26 C6 07 3E 4E 55 4D 42 45 52 3C 4F
-38 4F 29 4F 2F 82 1B 42 DA 21 6A 4C 7A 80 30 00
-7A 90 0A 00 02 28 7A 80 07 00 0A 9B 13 2C 82 49
-D0 04 82 48 D2 04 82 4B C8 04 19 42 E4 04 18 42
-E6 04 09 5A 08 63 1C 53 1E 83 E7 23 8F 49 04 00
-8F 48 02 00 8F 4C 00 00 30 4D 03 12 0D 12 1B 42
-DA 21 0B 12 32 C0 00 02 6D 4E 0D 5E 0C 4E 7A 40
-2E 00 0D 9C 0A 28 7A 9C FC 23 32 D0 00 02 FC 4C
-FE FF 0D 9C FC 2F DE 83 00 00 09 43 08 43 3D 40
-50 CB 3F 82 8F 4E 06 00 0C 4E 7E 4C 6A 4C 7A 90
-2D 00 10 2C 3B 40 10 00 7A 80 24 00 06 24 2B 43
-5A 83 03 24 3B 52 6A 53 B0 23 1C 53 1E 83 6A 4C
-7A 90 2D 00 AA 23 1C 53 1E 83 B1 43 04 00 A5 3F
-52 CB 2F 53 0E 93 2C 17 82 4C DA 21 03 24 2F 52
-0E F3 30 4D 9F 4F 02 00 04 00 BF 4F 00 00 3E E3
-09 20 3E E3 BF E3 02 00 BF E3 00 00 9F 53 02 00
-8F 63 00 00 32 B0 00 02 01 20 2F 53 30 4D D2 C8
-07 45 58 45 43 55 54 45 0A 4E 3E 4F 00 4A 28 C5
-01 2C 1A 42 C4 21 A2 53 C4 21 8A 4E 00 00 3E 4F
-30 4D A0 CB 87 4C 49 54 45 52 41 4C 82 93 B6 21
-16 24 32 B0 00 02 09 24 1A 42 C4 21 A2 52 C4 21
-BA 40 34 C4 00 00 BA 4F 02 00 1A 42 C4 21 A2 52
-C4 21 BA 40 34 C4 00 00 8A 4E 02 00 3E 4F 30 4D
-08 C9 05 43 4F 55 4E 54 2F 83 1E 53 8F 4E 00 00
-5E 4E FF FF 30 4D 82 4E BE 21 B2 4F C0 21 3E 4F
-82 43 C2 21 87 12 4C C6 C6 C9 1C CC 3D 40 28 CC
-FE 22 3D 41 3E 4F 30 4D 2A CC 0A 4E 3E 4F 3D 40
-40 CC 53 27 3D 40 16 CC 1A E2 B6 21 B2 27 AC 23
-42 CC 3E 4F 3D 40 16 CC B9 23 DE 53 00 00 68 4E
-08 5E F8 40 3F 00 00 00 3D 40 0C CE CD 3F 90 CB
-08 45 56 41 4C 55 41 54 45 00 39 40 BE 21 39 12
-39 12 39 12 0D 12 B0 12 2A C4 06 CC 7E CC 3D 41
-B2 41 C2 21 B2 41 C0 21 B2 41 BE 21 30 4D 7A C5
-04 51 55 49 54 00 31 40 E0 20 B2 40 00 20 00 20
-82 43 B6 21 82 43 08 18 B0 12 2A C4 6C C9 04 0D
-6F 6B 20 00 50 C9 34 C4 38 21 44 C4 34 C4 50 00
-F6 C7 18 C9 06 CC 34 C4 7E 20 CE C4 B2 C5 6C C9
-0D 73 74 61 63 6B 20 65 6D 70 74 79 20 21 1A CD
-34 C4 30 FF 84 C7 B2 C5 6C C9 0B 46 52 41 4D 20
-66 75 6C 6C 20 21 1A CD 42 C6 F4 C4 C0 C5 AC CC
-6C C9 04 0D 20 20 20 00 BC C5 B4 CC EE C7 05 41
-42 4F 52 54 3F 40 80 20 BE 3F 8F 93 02 00 AE 26
-B2 40 82 48 90 C8 B0 12 0C D2 82 43 A8 DA 82 43
-B4 DA 82 43 C0 DA 82 43 F0 DA 82 43 FC DA 82 43
-08 DB A2 B3 1C 05 FD 27 B2 40 11 00 0E 05 E2 C2
-22 02 92 C3 1C 05 38 40 A0 AA 39 42 19 83 FE 23
-18 83 FB 23 92 B3 1C 05 F4 23 87 12 6C C9 04 1B
-5B 37 6D 00 50 C9 50 C9 6C C9 04 1B 5B 30 6D 00
-50 C9 4E D1 90 D1 96 D1 14 CD 0E CD 86 41 42 4F
-52 54 22 00 87 12 86 C9 34 C4 1A CD A2 CB 2A C4
-18 CA 01 27 87 12 4C C6 C6 C9 1E CA C0 C5 B2 CD
-2A C4 4A CC 52 C6 81 5C 92 42 BE 21 C2 21 30 4D
-87 12 A2 C9 4C C6 C6 C9 CA CD 08 4E 7A 4E 5A D3
-5A 53 0A 58 19 42 C8 21 6E 4E 3E F0 1E 00 09 5E
-82 48 AE 21 82 49 B0 21 82 4A B2 21 2A 52 82 4A
-C4 21 3E 4F 3D 41 30 41 87 12 6C C9 0F 73 74 61
-63 6B 20 6D 69 73 6D 61 74 63 68 21 20 CD 82 9F
-B4 21 F2 23 18 42 AE 21 19 42 B0 21 A8 49 FE FF
-89 48 00 00 30 4D C0 C9 08 56 41 52 49 41 42 4C
-45 00 B0 12 C0 CD BA 40 86 12 FC FF EF 3F F2 CB
-08 43 4F 4E 53 54 41 4E 54 00 B0 12 C0 CD BA 40
-85 12 FC FF 8A 4E FE FF 3E 4F E0 3F 40 CE 06 43
-52 45 41 54 45 00 B0 12 C0 CD BA 40 85 12 FC FF
-8A 4A FE FF D3 3F 60 CC 05 44 4F 45 53 3E 1A 42
-B2 21 BA 40 84 12 00 00 8A 4D 02 00 3D 41 30 4D
-78 CE 05 44 45 46 45 52 B0 12 C0 CD BA 40 30 40
-FC FF BA 40 8E CE FE FF B9 3F 00 00 81 5B 82 43
-B6 21 30 4D B6 CD 01 5D B2 43 B6 21 30 4D 82 C9
-87 52 45 43 55 52 53 45 19 42 C4 21 99 42 B2 21
-00 00 A2 53 C4 21 30 4D AC CE 01 3A B0 12 C0 CD
-BA 40 87 12 FC FF A2 83 C4 21 B2 43 B6 21 82 4F
-B4 21 30 4D DA CE 81 3B 82 93 B6 21 5D 27 87 12
-34 C4 2A C4 A2 CB 0E CE AE CE 2A C4 F4 C8 09 49
+0E 93 3E 4F FB 27 2D 53 30 4D 1E 83 0E 7E F9 3F
+39 40 00 80 39 8F 08 4E 3E 4F 08 59 19 15 30 4D
+81 5E 00 00 3E 4F 32 B0 00 01 E8 27 2D 53 21 52
+30 4D 91 53 00 00 F7 3F CE C5 06 55 4E 4C 4F 4F
+50 00 F5 3F 00 00 01 49 2F 83 8F 4E 00 00 2E 41
+1E 81 02 00 30 4D 1E C5 01 4A 2F 83 8F 4E 00 00
+1E 41 04 00 1E 81 06 00 30 4D 9C C5 03 50 41 44
+85 12 E2 20 1A C6 03 54 49 42 85 12 38 21 0E C5
+03 43 50 4C 85 12 50 00 C2 C5 03 3E 49 4E 85 12
+C2 21 60 C6 04 42 41 53 45 00 85 12 DA 21 C8 C4
+05 53 54 41 54 45 85 12 B6 21 74 C6 02 42 4C 00
+85 12 20 00 B4 C5 02 3C 23 00 B2 40 AA 21 AA 21
+30 4D 8C C6 01 23 2C 4F 5B 42 DA 21 0A 43 34 40
+20 00 0E 93 04 20 04 11 0E 4C 0C 43 09 43 0A 9B
+01 28 0A 8B 09 69 08 68 14 83 07 30 0C 5C 0E 6E
+0A 6A F5 2B 0A 8B 12 D3 F5 3F 34 40 14 C4 8F 49
+00 00 0E 48 7A 90 0A 00 02 28 3A 50 07 00 3A 50
+30 00 92 83 AA 21 18 42 AA 21 C8 4A 00 00 30 4D
+A4 C6 02 23 53 00 87 12 A6 C6 0C C7 2D 83 09 93
+CA 23 0E 93 C8 23 3D 41 30 4D 02 C7 02 23 3E 00
+9F 42 AA 21 00 00 3E 40 AA 21 2E 8F 30 4D 26 C6
+04 48 4F 4C 44 00 0A 4E 3E 4F DB 3F 80 C6 04 53
+49 47 4E 00 0E 93 3E 4F 3A 40 2D 00 D2 33 30 4D
+56 C6 02 55 2E 00 87 12 9A C6 34 C4 00 00 06 C7
+20 C7 78 C9 40 C9 2A C4 68 C5 02 44 2E 00 87 12
+9A C6 78 C4 8A C4 6E C5 06 C7 9A C4 44 C7 20 C7
+78 C9 40 C9 2A C4 50 C5 01 2E 0E 93 E4 37 2F 83
+8F 4E 00 00 3E 43 EB 3F 30 C7 04 48 45 52 45 00
+2F 83 8F 4E 00 00 1E 42 C4 21 30 4D 5C C5 05 41
+4C 4C 4F 54 82 5E C4 21 3E 4F 30 4D 1C C7 02 43
+2C 00 1A 42 C4 21 CA 4E 00 00 92 53 C4 21 3E 4F
+30 4D 2F 83 8F 4E 00 00 B0 12 52 C8 92 B3 1C 05
+FD 27 1E 42 0C 05 B0 12 64 C8 30 4D 9A C7 05 28
+4B 45 59 29 18 42 0C 05 EC 3F 38 C6 03 4B 45 59
+30 40 F4 C7 AE C7 06 41 43 43 45 50 54 00 30 40
+1E C8 EE C7 08 28 41 43 43 45 50 54 29 00 3C 40
+D0 C8 3B 40 9A C8 2D 15 0A 4E 2E 4F 0A 5E 3B 40
+0D 00 3C 40 20 00 3D 40 C4 C8 92 B3 1C 05 05 24
+18 42 0C 05 38 90 0A 00 04 20 21 53 39 40 7E C8
+4D 15 B2 40 11 00 0E 05 E2 C2 22 02 A2 B3 1C 05
+FD 27 30 41 B2 40 13 00 0E 05 E2 D2 22 02 A2 B3
+1C 05 FD 27 30 41 00 00 05 53 4C 45 45 50 30 40
+8C C8 00 00 07 28 53 4C 45 45 50 29 12 D2 0A 18
+F6 3F 21 52 3A 17 58 42 0C 05 48 9B E3 27 48 9C
+06 2C 78 92 11 20 2E 9F 0F 24 1E 83 05 3C 0E 9A
+03 24 CE 48 00 00 1E 53 82 48 0E 05 A2 B3 1C 05
+FD 27 30 4D C6 C8 2D 83 92 B3 1C 05 FD 27 E3 23
+B2 40 18 00 0A 18 3E 8F 3D 41 30 4D 14 C8 06 28
+45 4D 49 54 29 00 08 4E 3E 4F E6 3F 6A C7 04 45
+4D 49 54 00 30 40 E6 C8 EE C8 04 45 43 48 4F 00
+B2 40 82 48 B8 C8 30 4D 88 C7 06 4E 4F 45 43 48
+4F 00 B2 40 30 4D B8 C8 30 4D DE C8 04 28 43 52
+29 00 2F 83 8F 4E 00 00 3E 40 0D 00 E3 3F BE C7
+02 43 52 00 30 40 22 C9 3E C7 05 53 50 41 43 45
+2F 83 8F 4E 00 00 3E 40 20 00 D4 3F 3A C9 06 53
+50 41 43 45 53 00 0E 93 09 24 0D 12 3D 40 62 C9
+EF 3F 64 C9 2D 83 1E 83 EB 23 3D 41 3E 4F 30 4D
+52 C7 04 54 59 50 45 00 0E 93 95 24 2A 4F 8F 5E
+00 00 0E 4A 87 12 F0 C5 28 C6 08 C5 F4 C8 12 C6
+88 C9 2A C4 2F 82 8F 4E 02 00 7E 4D 8F 4D 00 00
+0D 5E 1D B3 0D 63 30 4D 4E C9 82 53 22 00 87 12
+34 C4 94 C9 CA CB 34 C4 22 00 EE C9 BE C9 3D 41
+6E 4E 1E 83 82 5E C4 21 3E 4F 92 B3 C4 21 A2 63
+C4 21 30 4D 0A C9 82 2E 22 00 87 12 AE C9 34 C4
+78 C9 CA CB 2A C4 00 00 04 57 4F 52 44 00 3C 40
+BE 21 39 4C 3A 4C 09 5A 3A 5C 28 4C 09 9A 19 24
+7E 9A FC 27 1A 83 3B 40 60 00 C8 4C 00 00 09 9A
+0C 24 7C 4A 4E 9C 09 24 18 53 4B 9C F6 2F 7C 90
+7B 00 F3 2F 7C 80 20 00 F0 3F 1A 82 C0 21 82 4A
+C2 21 1E 42 C4 21 08 8E CE 48 00 00 30 4D 00 00
+04 46 49 4E 44 00 2F 83 0C 4E 65 4C 74 40 80 00
+3B 40 CA 21 3E 4B 0E 93 1E 24 58 4C 01 00 78 F0
+1E 00 0E 58 2E 53 1E 4E FE FF 0E 93 F3 27 09 4E
+78 49 48 C4 48 95 F7 23 0A 4C 1A 53 FA 99 00 00
+F2 23 58 83 FA 23 19 B3 09 63 0C 49 6A 4E 1E 43
+4A 93 01 30 2E 83 8F 4C 00 00 35 40 08 C4 34 40
+14 C4 30 4D 2F 53 2F 53 3E 4F 30 4D 6A C6 07 3E
+4E 55 4D 42 45 52 3C 4F 38 4F 29 4F 2F 82 1B 42
+DA 21 6A 4C 7A 80 30 00 7A 90 0A 00 02 28 7A 80
+07 00 0A 9B 13 2C 82 49 D0 04 82 48 D2 04 82 4B
+C8 04 19 42 E4 04 18 42 E6 04 09 5A 08 63 1C 53
+1E 83 E7 23 8F 49 04 00 8F 48 02 00 8F 4C 00 00
+30 4D 03 12 0D 12 1B 42 DA 21 0B 12 32 C0 00 02
+6D 4E 0D 5E 0C 4E 7A 40 2E 00 0D 9C 0A 28 7A 9C
+FC 23 32 D0 00 02 FC 4C FE FF 0D 9C FC 2F DE 83
+00 00 09 43 08 43 3D 40 78 CB 3F 82 8F 4E 06 00
+0C 4E 7E 4C 6A 4C 7A 90 2D 00 10 2C 3B 40 10 00
+7A 80 24 00 06 24 2B 43 5A 83 03 24 3B 52 6A 53
+B0 23 1C 53 1E 83 6A 4C 7A 90 2D 00 AA 23 1C 53
+1E 83 B1 43 04 00 A5 3F 7A CB 2F 53 0E 93 2C 17
+82 4C DA 21 03 24 2F 52 0E F3 30 4D 9F 4F 02 00
+04 00 BF 4F 00 00 3E E3 09 20 3E E3 BF E3 02 00
+BF E3 00 00 9F 53 02 00 8F 63 00 00 32 B0 00 02
+01 20 2F 53 30 4D FA C8 07 45 58 45 43 55 54 45
+0A 4E 3E 4F 00 4A 26 C5 01 2C 1A 42 C4 21 A2 53
+C4 21 8A 4E 00 00 3E 4F 30 4D C8 CB 87 4C 49 54
+45 52 41 4C 82 93 B6 21 0F 24 1A 42 C4 21 A2 52
+C4 21 BA 40 34 C4 00 00 8A 4E 02 00 3E 4F 32 B0
+00 02 32 C0 00 02 F1 23 30 4D 30 C9 05 43 4F 55
+4E 54 2F 83 1E 53 8F 4E 00 00 5E 4E FF FF 30 4D
+82 4E BE 21 B2 4F C0 21 3E 4F 82 43 C2 21 87 12
+90 C6 EE C9 36 CC 3D 40 42 CC 05 23 3D 41 3E 4F
+30 4D 44 CC 0A 4E 3E 4F 3D 40 5A CC 5A 27 3D 40
+30 CC 1A E2 B6 21 B9 27 B3 23 5C CC 3E 4F 3D 40
+30 CC C0 23 DE 53 00 00 68 4E 08 5E F8 40 3F 00
+00 00 3D 40 88 CE CD 3F B8 CB 08 45 56 41 4C 55
+41 54 45 00 39 40 BE 21 3C 49 3B 49 3A 49 3D 15
+B0 12 2A C4 20 CC 98 CC B2 41 C2 21 B2 41 C0 21
+B2 41 BE 21 3D 41 30 4D 4C C6 04 51 55 49 54 00
+31 40 E0 20 B2 40 00 20 00 20 82 43 B6 21 82 43
+08 18 B0 12 2A C4 94 C9 03 0D 6F 6B 78 C9 40 C9
+5A C6 44 C4 64 C6 0E C8 40 C9 20 CC DE C4 92 C5
+94 C9 0D 73 74 61 63 6B 20 65 6D 70 74 79 21 20
+2A CD 34 C4 30 FF A0 C7 D2 C5 94 C9 0B 46 52 41
+4D 20 66 75 6C 6C 21 20 2A CD 86 C6 F2 C4 E0 C5
+C6 CC 94 C9 03 0D 20 20 DC C5 CC CC 06 C8 05 41
+42 4F 52 54 3F 40 80 20 C3 3F 8F 93 02 00 BA 26
+B2 40 82 48 B8 C8 B0 12 3C D2 A2 B3 1C 05 FD 27
+B2 40 11 00 0E 05 E2 C2 22 02 92 C3 1C 05 38 40
+A0 AA 39 42 03 43 19 83 FD 23 18 83 FA 23 92 B3
+1C 05 F3 23 87 12 94 C9 04 1B 5B 37 6D 00 78 C9
+78 C9 94 C9 04 1B 5B 30 6D 00 78 C9 4A D1 8C D1
+92 D1 DA D1 24 CD 1E CD 86 41 42 4F 52 54 22 00
+87 12 AE C9 34 C4 2A CD CA CB 2A C4 40 CA 01 27
+87 12 90 C6 EE C9 46 CA E0 C5 AE CD 2A C4 64 CC
+96 C6 81 5C 92 42 BE 21 C2 21 30 4D 00 00 81 5B
+82 43 B6 21 30 4D B2 CD 01 5D B2 43 B6 21 30 4D
+BE CD 83 5B 27 5D 87 12 A0 CD 34 C4 34 C4 CA CB
+CA CB 2A C4 BE 4F 02 00 3E 4F 30 4D 1C C9 82 49
+53 00 87 12 86 C6 F2 C4 E0 C5 06 CE D6 CD 34 C4
+E4 CD CA CB 2A C4 A0 CD E4 CD 2A C4 EE CD 09 49
4D 4D 45 44 49 41 54 45 1A 42 AE 21 FA D0 80 00
-00 00 30 4D BE 4F 02 00 3E 4F 30 4D 0E CF 82 49
-53 00 87 12 42 C6 F4 C4 C0 C5 46 CF 52 CF 34 C4
-24 CF A2 CB 2A C4 A4 CD 24 CF 2A C4 F6 CE 83 5B
-27 5D 87 12 A4 CD 34 C4 34 C4 A2 CB A2 CB 2A C4
-90 CC 88 50 4F 53 54 50 4F 4E 45 00 87 12 4C C6
-C6 C9 1E CA 54 C4 C0 C5 B2 CD 7E C5 C0 C5 8C CF
-34 C4 34 C4 A2 CB A2 CB 34 C4 A2 CB A2 CB 2A C4
-92 CF 3A 4E 82 4A C6 21 2E 4E 82 4E C4 21 3D 40
-10 00 09 4A 08 49 29 83 18 48 FE FF 0E 98 FC 2B
-89 48 00 00 1D 83 F6 23 2A 4A 0A 93 F0 23 3E 4F
-3D 41 30 4D 2E CF 82 49 46 00 2F 83 8F 4E 00 00
-1E 42 C4 21 BE 40 C0 C5 00 00 A2 52 C4 21 2E 53
-30 4D 92 CE 84 45 4C 53 45 00 1A 42 C4 21 BA 40
-BC C5 00 00 2A 52 82 4A C4 21 8E 4A 00 00 2A 83
-0E 4A 30 4D 4A C9 84 54 48 45 4E 00 9E 42 C4 21
-00 00 3E 4F 30 4D 5E CE 85 42 45 47 49 4E 30 40
-84 C7 06 D0 85 55 4E 54 49 4C 39 40 C0 C5 1A 42
-C4 21 A2 52 C4 21 8A 49 00 00 8A 4E 02 00 3E 4F
-30 4D 8C CD 85 41 47 41 49 4E 39 40 BC C5 EF 3F
-28 CE 85 57 48 49 4C 45 87 12 CA CF 6E C4 2A C4
-C0 CE 86 52 45 50 45 41 54 00 87 12 4A D0 0C D0
-2A C4 E4 CF 82 44 4F 00 2F 83 8F 4E 00 00 1E 42
-C4 21 BE 40 CA C5 00 00 2E 53 82 4E C4 21 A2 53
-00 20 1A 42 00 20 8A 43 00 00 30 4D B4 CB 84 4C
-4F 4F 50 00 39 40 EC C5 1A 42 C4 21 A2 52 C4 21
-8A 49 00 00 8A 4E 02 00 1E 42 00 20 A2 83 00 20
-2E 4E 0E 93 04 24 9E 42 C4 21 00 00 F5 3F 3E 4F
-30 4D E4 C7 85 2B 4C 4F 4F 50 39 40 DA C5 E4 3F
-9E D0 85 4C 45 41 56 45 1A 42 C4 21 BA 40 FC C5
-00 00 BA 40 BC C5 02 00 B2 50 06 00 C4 21 A2 53
-00 20 2A 52 19 42 00 20 89 4A 00 00 30 4D E2 D0
-04 4D 4F 56 45 00 0A 4E 38 4F 39 4F 3E 4F 0A 93
-11 24 08 99 0F 24 06 2C F8 49 00 00 18 53 1A 83
-FB 23 30 4D 08 5A 09 5A 19 83 18 83 E8 49 00 00
-1A 83 FA 23 30 4D 34 C4 CA 21 FC C4 2A C4 84 12
-46 D1 2A D4 00 D4 74 D0 A2 CD E8 D3 D4 D0 10 D1
-AE C9 B4 D1 E8 D1 24 D0 AE D2 48 C5 4E CF B6 CE
-86 CA 00 00 3A 40 0C 00 39 40 CA 21 38 40 CC 21
-D9 3F 3A 40 0E 00 39 40 CC 21 38 40 CA 21 CC 3F
-82 43 CC 21 30 4D 92 42 CA 21 C8 21 30 4D 62 CF
-09 50 57 52 5F 53 54 41 54 45 84 12 90 CF E4 D3
-2E DB A0 D1 08 50 57 52 5F 48 45 52 45 00 92 42
-C4 21 B0 D1 92 42 C6 21 AE D1 EF 3F 62 D0 09 52
-53 54 5F 53 54 41 54 45 92 42 0C 18 B0 D1 92 42
-0E 18 AE D1 E2 3F CE D1 08 52 53 54 5F 48 45 52
-45 00 92 42 C4 21 0C 18 92 42 C6 21 0E 18 DF 3F
-B2 40 54 D2 B6 D2 B2 40 64 C8 58 C8 B2 40 BE C8
-CE C8 B2 40 FA C8 0E C9 B2 40 DC C7 EA C7 30 41
-52 D0 04 57 49 50 45 00 39 40 80 FF B9 43 00 00
-29 53 39 90 DA FF FA 23 B0 12 00 D2 B2 40 2E DB
-C4 21 B2 40 E4 D3 C6 21 D4 3F C6 CF 06 28 57 41
-52 4D 29 00 1E 42 08 18 87 12 6C C9 05 0D 1B 5B
-37 6D 50 C9 70 C7 6C C9 27 20 46 61 73 74 46 6F
-72 74 68 20 56 31 36 30 20 31 36 4D 48 7A 20 28
+00 00 30 4D AA C9 87 52 45 43 55 52 53 45 19 42
+C4 21 99 42 B2 21 00 00 A2 53 C4 21 30 4D AA CC
+88 50 4F 53 54 50 4F 4E 45 00 87 12 90 C6 EE C9
+46 CA 54 C4 E0 C5 AE CD 92 C5 E0 C5 6A CE 34 C4
+34 C4 CA CB CA CB 34 C4 CA CB CA CB 2A C4 82 9F
+B4 21 A0 24 87 12 94 C9 0F 73 74 61 63 6B 20 6D
+69 73 6D 61 74 63 68 21 30 CD 87 12 CA C9 90 C6
+EE C9 94 CE 08 4E 7A 4E 5A D3 5A 53 0A 58 19 42
+C8 21 6E 4E 3E F0 1E 00 09 5E 82 48 AE 21 82 49
+B0 21 82 4A B2 21 2A 52 82 4A C4 21 3E 4F 3D 41
+30 41 E8 C9 08 56 41 52 49 41 42 4C 45 00 B0 12
+8A CE BA 40 86 12 FC FF 71 3C 0C CC 08 43 4F 4E
+53 54 41 4E 54 00 B0 12 8A CE BA 40 85 12 FC FF
+8A 4E FE FF 3E 4F 62 3C DC CE 06 43 52 45 41 54
+45 00 B0 12 8A CE BA 40 85 12 FC FF 8A 4A FE FF
+55 3C 7A CC 05 44 4F 45 53 3E 1A 42 B2 21 BA 40
+84 12 00 00 8A 4D 02 00 3D 41 30 4D 14 CF 05 44
+45 46 45 52 B0 12 8A CE BA 40 30 40 FC FF BA 40
+2A CF FE FF 3B 3C D2 CD 01 3A B0 12 8A CE BA 40
+87 12 FC FF A2 83 C4 21 B2 43 B6 21 82 4F B4 21
+30 4D 48 CF 81 3B 82 93 B6 21 24 27 87 12 34 C4
+2A C4 CA CB 6E CE C0 CD 2A C4 7C CF 3D 41 B2 4E
+0E 18 A2 4E 0C 18 3E 4F 32 3D DC CB 06 4D 41 52
+4B 45 52 00 B0 12 8A CE BA 40 84 12 FC FF BA 40
+7A CF FE FF 9A 42 C6 21 00 00 28 83 8A 48 02 00
+A2 52 C4 21 18 42 AE 21 19 42 B0 21 A8 49 FE FF
+89 48 00 00 30 4D 0E CE 82 49 46 00 2F 83 8F 4E
+00 00 1E 42 C4 21 A2 52 C4 21 BE 40 E0 C5 00 00
+2E 53 30 4D 2E CF 84 45 4C 53 45 00 A2 52 C4 21
+1A 42 C4 21 BA 40 DC C5 FC FF 8E 4A 00 00 2A 83
+0E 4A 30 4D 72 C9 84 54 48 45 4E 00 9E 42 C4 21
+00 00 3E 4F 30 4D FA CE 85 42 45 47 49 4E 30 40
+A0 C7 06 D0 85 55 4E 54 49 4C 39 40 E0 C5 A2 52
+C4 21 1A 42 C4 21 8A 49 FC FF 8A 4E FE FF 3E 4F
+30 4D 88 CD 85 41 47 41 49 4E 39 40 DC C5 EF 3F
+C4 CE 85 57 48 49 4C 45 87 12 CC CF 78 C4 2A C4
+26 CE 86 52 45 50 45 41 54 00 87 12 4A D0 0C D0
+2A C4 E6 CF 82 44 4F 00 2F 83 8F 4E 00 00 A2 53
+C4 21 1E 42 C4 21 BE 40 F0 C5 FE FF A2 53 00 20
+1A 42 00 20 8A 43 00 00 30 4D 8C CF 84 4C 4F 4F
+50 00 39 40 12 C6 A2 52 C4 21 1A 42 C4 21 8A 49
+FC FF 8A 4E FE FF 1E 42 00 20 A2 83 00 20 2E 4E
+0E 93 03 24 8E 4A 00 00 F6 3F 3E 4F 30 4D FC C7
+85 2B 4C 4F 4F 50 39 40 00 C6 E5 3F 9C D0 85 4C
+45 41 56 45 1A 42 C4 21 BA 40 22 C6 00 00 BA 40
+DC C5 02 00 B2 50 06 00 C4 21 A2 53 00 20 2A 52
+19 42 00 20 89 4A 00 00 30 4D DE D0 04 4D 4F 56
+45 00 0A 4E 38 4F 39 4F 3E 4F 0A 93 11 24 08 99
+0F 24 06 2C F8 49 00 00 18 53 1A 83 FB 23 30 4D
+08 5A 09 5A 19 83 18 83 E8 49 00 00 1A 83 FA 23
+30 4D 34 C4 CA 21 FA C4 2A C4 84 12 42 D1 9A D5
+70 D5 74 D0 9E CD 58 D5 D0 D0 0C D1 D6 C9 FE D1
+18 D2 24 D0 1E D4 46 C5 A4 D3 C8 CD AE CA 00 00
+3A 40 0E 00 39 40 CA 21 38 40 CC 21 D9 3F 3A 40
+0E 00 39 40 CC 21 38 40 CA 21 CC 3F 82 43 CC 21
+30 4D 92 42 CA 21 C8 21 30 4D 9C D1 3A 4E 82 4A
+C6 21 2E 4E 82 4E C4 21 3D 40 10 00 09 4A 08 49
+29 83 18 48 FE FF 0E 98 FC 2B 89 48 00 00 1D 83
+F6 23 2A 4A 0A 93 F0 23 3E 4F 3D 41 30 4D 40 CE
+09 50 57 52 5F 53 54 41 54 45 84 12 9A D1 54 D5
+9C DC 62 D0 09 52 53 54 5F 53 54 41 54 45 92 42
+0E 18 DE D1 92 42 0C 18 E0 D1 EF 3F D0 D1 08 50
+57 52 5F 48 45 52 45 00 92 42 C6 21 DE D1 92 42
+C4 21 E0 D1 30 4D E4 D1 08 52 53 54 5F 48 45 52
+45 00 92 42 C6 21 0E 18 92 42 C4 21 0C 18 EC 3F
+B2 40 C4 D3 26 D4 B2 40 8C C8 80 C8 B2 40 E6 C8
+F6 C8 B2 40 22 C9 36 C9 B2 40 F4 C7 02 C8 82 43
+16 DC 82 43 22 DC 82 43 2E DC 82 43 5E DC 82 43
+6A DC 82 43 76 DC 30 41 52 D0 04 57 49 50 45 00
+39 40 80 FF B9 43 00 00 29 53 39 90 DA FF FA 23
+B0 12 30 D2 B2 40 9C DC 0C 18 B2 40 54 D5 0E 18
+AE 3F 18 D0 07 43 4F 4D 50 41 52 45 0C 4E 38 4F
+3B 4F 39 4F 0E 4B 0E 5C 0C 24 1B 83 07 30 1C 83
+07 30 19 53 F9 98 FF FF F5 27 02 2C 3E 43 30 4D
+1E 43 30 4D 64 CF 86 5B 54 48 45 4E 5D 00 30 4D
+1E 83 30 4D C6 D2 86 5B 45 4C 53 45 5D 00 87 12
+34 C4 01 00 90 C6 EE C9 12 CC 44 C4 E0 C5 4C D3
+8A C4 8A C4 94 C9 04 5B 49 46 5D 00 9C D2 EA C5
+0A D3 A6 CA 2C C5 DC C5 40 D3 8A C4 8A C4 94 C9
+06 5B 45 4C 53 45 5D 00 9C D2 EA C5 2E D3 A6 CA
+D0 D2 44 C4 E0 C5 2A D3 2C C5 DC C5 40 D3 94 C9
+06 5B 54 48 45 4E 5D 00 9C D2 EA C5 40 D3 D0 D2
+54 C4 EA C5 48 D3 2A C4 DC C5 E4 D2 A6 CA 94 C9
+03 0D 6B 6F 78 C9 40 C9 5A C6 44 C4 64 C6 0E C8
+62 D3 82 43 C2 21 82 4E BE 21 B2 4F C0 21 3E 4F
+3D 40 E4 D2 30 4D D6 D2 84 5B 49 46 5D 00 0E 93
+3E 4F AD 27 30 4D 78 D3 8B 5B 55 4E 44 45 46 49
+4E 45 44 5D 87 12 90 C6 EE C9 46 CA 6C C4 86 C5
+2A C4 88 D3 89 5B 44 45 46 49 4E 45 44 5D 87 12
+90 C6 EE C9 46 CA 6C C4 2A C4 C8 CF 06 28 57 41
+52 4D 29 00 1E 42 08 18 87 12 94 C9 05 0D 1B 5B
+37 6D 78 C9 8A C7 94 C9 27 20 46 61 73 74 46 6F
+72 74 68 20 56 31 36 32 20 31 36 4D 48 7A 20 28
43 29 20 4A 2E 4D 2E 54 68 6F 6F 72 65 6E 73 20
-50 C9 34 C4 30 FF 84 C7 2A C5 30 C7 6C C9 0B 62
-79 74 65 73 20 66 72 65 65 20 26 CD 22 D2 04 57
-41 52 4D 00 30 40 54 D2 18 D0 04 43 4F 4C 44 00
+78 C9 34 C4 30 FF A0 C7 28 C5 56 C7 94 C9 0B 62
+79 74 65 73 20 66 72 65 65 20 36 CD 6A D2 04 57
+41 52 4D 00 30 40 C4 D3 94 D2 04 43 4F 4C 44 00
B2 40 04 A5 20 01 B2 40 88 5A CC 01 B2 43 02 02
B2 D3 06 02 F2 D0 06 00 24 02 F2 D3 26 02 F2 40
FD 00 22 02 F2 40 A5 00 A1 01 F2 40 10 00 A0 01
B2 40 0B 00 82 01 B2 40 E9 01 84 01 39 40 40 00
B2 D0 10 00 86 01 92 D2 5E 01 08 18 A2 93 08 18
01 24 59 03 38 40 50 C3 18 83 FE 23 19 83 FA 23
-3A 40 C6 D2 39 40 DA FF 89 4A 00 00 29 53 FC 23
+3A 40 36 D4 39 40 DA FF 89 4A 00 00 29 53 FC 23
92 42 02 18 E4 FF B2 40 18 00 0A 18 31 40 E0 20
-3F 40 80 20 37 40 00 C4 36 40 B4 C4 35 40 08 C4
+3F 40 80 20 37 40 00 C4 36 40 BC C4 35 40 08 C4
34 40 14 C4 B2 40 0A 00 DA 21 B2 43 AC 21 92 C3
30 01 18 42 08 18 F2 B0 10 00 00 02 04 20 38 E3
18 53 82 48 08 18 B2 40 81 00 00 05 B2 42 06 05
B2 40 A1 F7 08 05 F2 D0 30 00 0A 02 92 C3 00 05
-92 D3 1A 05 3D 40 BE D3 18 42 08 18 38 90 0A 00
-3B 27 38 90 16 00 38 2F 28 93 0E 23 F6 26 B4 D2
-84 12 46 D1 0C DA B8 DA C0 D9 0C DB 86 D9 40 DA
-8A D6 00 00 7C D9 2C DA DE D9 1C DA 9A D7 00 00
-00 00 1E DB 72 D1 4C D2 85 48 49 32 4C 4F 87 12
-84 C7 DE CF A2 CB AE CE 74 D1 C0 D3 2A C4 BA D2
-04 43 4F 44 45 00 B0 12 C0 CD A2 82 C4 21 87 12
-EE CE BC C5 F8 D3 00 00 07 45 4E 44 43 4F 44 45
-87 12 82 D1 0E CE 2A C4 44 D0 03 41 53 4D 92 42
-C8 21 B8 21 B2 40 C4 D3 C8 21 E5 3F 18 D4 06 45
+92 D3 1A 05 3D 40 2E D5 18 42 08 18 38 90 0A 00
+A7 26 38 90 16 00 A4 2E 28 93 61 22 56 26 24 D4
+84 12 42 D1 7A DB 26 DC 2E DB 7A DC F4 DA AE DB
+F8 D7 00 00 EA DA 9A DB 4C DB 8A DB 08 D9 00 00
+00 00 8C DC 6E D1 BC D3 85 48 49 32 4C 4F 87 12
+A0 C7 E0 CF CA CB C0 CD 70 D1 30 D5 2A C4 2A D4
+04 43 4F 44 45 00 B0 12 8A CE A2 82 C4 21 87 12
+5C CF DC C5 68 D5 00 00 07 45 4E 44 43 4F 44 45
+87 12 7E D1 6E CE 2A C4 44 D0 03 41 53 4D 92 42
+C8 21 B8 21 B2 40 34 D5 C8 21 E5 3F 88 D5 06 45
4E 44 41 53 4D 00 92 42 B8 21 C8 21 E9 3F 00 00
05 43 4F 4C 4F 4E 1A 42 C4 21 BA 40 87 12 00 00
-A2 53 C4 21 B2 43 B6 21 30 40 82 D1 00 00 05 4C
+A2 53 C4 21 B2 43 B6 21 30 40 7E D1 00 00 05 4C
4F 32 48 49 1A 42 C4 21 BA 40 B0 12 00 00 BA 40
2A C4 02 00 A2 52 C4 21 ED 3F 38 40 BE 21 39 48
2A 48 09 5A 1A 52 C2 21 09 9A 03 24 7E 9A FC 27
1A 83 0E 4A 2A 88 82 4A C2 21 30 4D B0 12 2A C4
-C6 C9 1E CA 72 C5 C0 C5 C2 D4 DA CA C0 C5 B2 CD
-E4 D4 C4 D4 29 4E 39 90 86 12 02 20 2E 53 30 41
-39 90 85 12 03 20 1E 4E 02 00 30 41 39 90 84 12
-01 20 2E 52 30 41 19 42 C4 21 A2 53 C4 21 89 4E
-00 00 3E 40 29 00 12 12 C2 21 92 53 C2 21 B0 12
-2A C4 C6 C9 DA CA C0 C5 16 D5 0C D5 21 53 3E 90
-10 00 BB 2D 30 41 18 D5 B2 41 C2 21 22 D3 30 41
-87 12 4C C6 8A D4 28 D5 82 43 BC 21 92 42 C4 21
-BA 21 A2 53 C4 21 0A 4E 3E 4F FA 90 23 00 00 00
-34 20 92 53 C2 21 B0 12 AC D4 0E 93 04 20 B2 40
-00 03 BC 21 27 3C 1E 93 04 20 B2 40 10 03 BC 21
-21 3C 2E 93 04 20 B2 40 20 03 BC 21 1B 3C 2E 92
-04 20 B2 40 20 02 BC 21 15 3C 3E 92 04 20 B2 40
-30 02 BC 21 0F 3C 3E 93 04 20 B2 40 30 03 BC 21
-09 3C B2 40 30 00 BC 21 19 42 C4 21 A2 53 C4 21
-89 4E 00 00 3E 4F 3D 41 30 4D FA 90 26 00 00 00
-08 20 B2 40 10 02 BC 21 92 53 C2 21 30 12 98 D5
-75 3F FA 90 40 00 00 00 1A 20 B2 40 20 00 BC 21
-92 53 C2 21 B0 12 F6 D4 0E 20 B2 50 10 00 BC 21
-3E 40 2B 00 B0 12 F6 D4 32 24 92 92 BE 21 C2 21
-02 24 92 53 C2 21 8E 10 82 5E BC 21 D3 3F B0 12
-F6 D4 F9 23 B2 50 10 00 BC 21 3E 40 28 00 B0 12
-AC D4 30 12 E8 D5 67 3F 87 12 4C C6 8A D4 20 D6
-FE 90 26 00 00 00 3E 40 20 00 04 20 B2 50 82 00
-BC 21 C2 3F B0 12 F6 D4 DF 23 B2 50 80 00 BC 21
-3E 40 28 00 B0 12 AC D4 B0 12 E6 D4 D5 23 3D 40
-B2 CD 30 4D 50 C8 04 52 45 54 49 00 87 12 34 C4
-00 13 A2 CB 2A C4 34 C4 2C 00 20 D5 18 D6 70 D6
-2E 4E 1E D2 BC 21 19 42 BA 21 92 3F 6E D4 03 4D
-4F 56 84 12 66 D6 00 40 7E D6 05 4D 4F 56 2E 42
-84 12 66 D6 40 40 00 00 03 41 44 44 84 12 66 D6
-00 50 98 D6 05 41 44 44 2E 42 84 12 66 D6 40 50
-A4 D6 04 41 44 44 43 00 84 12 66 D6 00 60 B2 D6
-06 41 44 44 43 2E 42 00 84 12 66 D6 40 60 56 D6
-04 53 55 42 43 00 84 12 66 D6 00 70 D0 D6 06 53
-55 42 43 2E 42 00 84 12 66 D6 40 70 DE D6 03 53
-55 42 84 12 66 D6 00 80 EE D6 05 53 55 42 2E 42
-84 12 66 D6 40 80 50 D4 03 43 4D 50 84 12 66 D6
-00 90 08 D7 05 43 4D 50 2E 42 84 12 66 D6 40 90
-3E D4 04 44 41 44 44 00 84 12 66 D6 00 A0 22 D7
-06 44 41 44 44 2E 42 00 84 12 66 D6 40 A0 14 D7
-03 42 49 54 84 12 66 D6 00 B0 40 D7 05 42 49 54
-2E 42 84 12 66 D6 40 B0 4C D7 03 42 49 43 84 12
-66 D6 00 C0 5A D7 05 42 49 43 2E 42 84 12 66 D6
-40 C0 66 D7 03 42 49 53 84 12 66 D6 00 D0 74 D7
-05 42 49 53 2E 42 84 12 66 D6 40 D0 00 00 03 58
-4F 52 84 12 66 D6 00 E0 8E D7 05 58 4F 52 2E 42
-84 12 66 D6 40 E0 C0 D6 03 41 4E 44 84 12 66 D6
-00 F0 A8 D7 05 41 4E 44 2E 42 84 12 66 D6 40 F0
-4C C6 20 D5 C6 D7 1A 42 BC 21 B2 F0 70 00 BC 21
-8A 10 3A F0 0F 00 82 DA BC 21 4A 3F FA D6 03 52
-52 43 84 12 C0 D7 00 10 DE D7 05 52 52 43 2E 42
-84 12 C0 D7 40 10 EA D7 04 53 57 50 42 00 84 12
-C0 D7 80 10 F8 D7 03 52 52 41 84 12 C0 D7 00 11
-06 D8 05 52 52 41 2E 42 84 12 C0 D7 40 11 12 D8
-03 53 58 54 84 12 C0 D7 80 11 00 00 04 50 55 53
-48 00 84 12 C0 D7 00 12 2C D8 06 50 55 53 48 2E
-42 00 84 12 C0 D7 40 12 80 D7 04 43 41 4C 4C 00
-84 12 C0 D7 80 12 34 C4 2C 00 20 D5 18 D6 60 D8
-59 42 BC 21 5A 42 BD 21 82 4A BC 21 BE 90 00 15
-00 00 02 20 0A 89 02 3C 09 8A 0A 49 3A 90 10 00
-03 2C 5A 0E A8 3F 1A 53 0E 4A 87 12 70 C7 6C C9
-0D 6F 75 74 20 6F 66 20 62 6F 75 6E 64 73 20 CD
-3A D8 05 50 55 53 48 4D 84 12 56 D8 00 15 A2 D8
-04 50 4F 50 4D 00 84 12 56 D8 00 17 4C C6 8A D4
-C2 D8 82 43 BC 21 92 42 C4 21 BA 21 A2 53 C4 21
-92 53 C2 21 3E 40 2C 00 B0 12 2A C4 C6 C9 DA CA
-C0 C5 B2 CD 18 D6 E8 D8 0A 4E 3E 4F 1A 83 2A 92
-CA 2F 8A 10 5A 06 6F 3F 20 D8 04 52 52 43 4D 00
-84 12 BC D8 50 00 FA D8 04 52 52 41 4D 00 84 12
-BC D8 50 01 08 D9 04 52 4C 41 4D 00 84 12 BC D8
-50 02 16 D9 04 52 52 55 4D 00 84 12 BC D8 50 03
-85 12 00 3C 24 D9 03 53 3E 3D 85 12 00 38 36 D9
-02 53 3C 00 85 12 00 34 B0 D8 03 30 3E 3D 85 12
-00 30 4A D9 02 30 3C 00 85 12 00 30 00 00 02 55
-3C 00 85 12 00 2C 5E D9 03 55 3E 3D 85 12 00 28
-54 D9 03 30 3C 3E 85 12 00 24 72 D9 02 30 3D 00
-85 12 00 20 5C C8 02 49 46 00 1A 42 C4 21 8A 4E
-00 00 A2 53 C4 21 0E 4A 30 4D 68 D9 04 54 48 45
-4E 00 1A 42 C4 21 08 4E 3E 4F 09 48 29 53 0A 89
-0A 11 3A 90 00 02 68 2F 88 DA 00 00 30 4D 30 D7
-04 45 4C 53 45 00 1A 42 C4 21 BA 40 00 3C 00 00
-A2 53 C4 21 2F 83 8F 4A 00 00 E3 3F 9C D9 05 55
-4E 54 49 4C 3A 4F 08 4E 3E 4F 19 42 C4 21 2A 83
-0A 89 0A 11 3A 90 00 FE 47 3B 3A F0 FF 03 08 DA
-89 48 00 00 A2 53 C4 21 30 4D B4 D7 05 41 47 41
-49 4E 87 12 30 D9 E4 D9 2A C4 00 00 05 57 48 49
-4C 45 87 12 8A D9 6E C4 2A C4 40 D9 06 52 45 50
-45 41 54 00 87 12 30 D9 E4 D9 A2 D9 2A C4 00 00
-03 4A 4D 50 87 12 A4 CD 30 D9 E4 D9 2A C4 3E B0
-00 10 03 20 3E E0 00 04 30 4D 3E 90 00 34 06 28
-03 24 3E 40 00 34 30 4D 3E 40 00 38 30 4D 00 00
-04 3F 4A 4D 50 00 87 12 4E DA A4 CD 6E C4 E4 D9
-2A C4 84 DA 3D 41 08 4E 3E 4F 2A 48 0A 93 04 20
-98 42 C4 21 00 00 30 4D 88 43 00 00 A4 3F 4A D8
-03 42 57 31 84 12 82 DA 00 00 A0 DA 03 42 57 32
-84 12 82 DA 00 00 AC DA 03 42 57 33 84 12 82 DA
-00 00 C4 DA 3D 41 1A 42 C4 21 28 4E 08 93 08 20
-BA 4F 00 00 A2 53 C4 21 8E 4A 00 00 3E 4F 30 4D
-8E 43 00 00 61 3F 00 00 03 46 57 31 84 12 C2 DA
-00 00 E8 DA 03 46 57 32 84 12 C2 DA 00 00 F4 DA
-03 46 57 33 84 12 C2 DA 00 00 00 DB 04 47 4F 54
-4F 00 87 12 30 D9 A4 CD 98 CB 2A C4 70 DA 05 3F
-47 4F 54 4F 87 12 4E DA A4 CD 98 CB 2A C4
+EE C9 46 CA EA C5 30 D6 02 CB E0 C5 AE CD 52 D6
+32 D6 29 4E 39 90 86 12 02 20 2E 53 30 41 39 90
+85 12 03 20 1E 4E 02 00 30 41 39 90 84 12 01 20
+2E 52 30 41 19 42 C4 21 A2 53 C4 21 89 4E 00 00
+3E 40 29 00 12 12 C2 21 92 53 C2 21 B0 12 2A C4
+EE C9 02 CB E0 C5 84 D6 7A D6 21 53 3E 90 10 00
+BB 2D 30 41 86 D6 B2 41 C2 21 22 D3 30 41 87 12
+90 C6 FA D5 96 D6 82 43 BC 21 92 42 C4 21 BA 21
+A2 53 C4 21 0A 4E 3E 4F FA 90 23 00 00 00 34 20
+92 53 C2 21 B0 12 1C D6 0E 93 04 20 B2 40 00 03
+BC 21 27 3C 1E 93 04 20 B2 40 10 03 BC 21 21 3C
+2E 93 04 20 B2 40 20 03 BC 21 1B 3C 2E 92 04 20
+B2 40 20 02 BC 21 15 3C 3E 92 04 20 B2 40 30 02
+BC 21 0F 3C 3E 93 04 20 B2 40 30 03 BC 21 09 3C
+B2 40 30 00 BC 21 19 42 C4 21 A2 53 C4 21 89 4E
+00 00 3E 4F 3D 41 30 4D FA 90 26 00 00 00 08 20
+B2 40 10 02 BC 21 92 53 C2 21 30 12 06 D7 76 3F
+FA 90 40 00 00 00 1A 20 B2 40 20 00 BC 21 92 53
+C2 21 B0 12 64 D6 0E 20 B2 50 10 00 BC 21 3E 40
+2B 00 B0 12 64 D6 32 24 92 92 BE 21 C2 21 02 24
+92 53 C2 21 8E 10 82 5E BC 21 D3 3F B0 12 64 D6
+F9 23 B2 50 10 00 BC 21 3E 40 28 00 B0 12 1C D6
+30 12 56 D7 67 3F 87 12 90 C6 FA D5 8E D7 FE 90
+26 00 00 00 3E 40 20 00 04 20 B2 50 82 00 BC 21
+C2 3F B0 12 64 D6 DF 23 B2 50 80 00 BC 21 3E 40
+28 00 B0 12 1C D6 B0 12 54 D6 D5 23 3D 40 AE CD
+30 4D 78 C8 04 52 45 54 49 00 87 12 34 C4 00 13
+CA CB 2A C4 34 C4 2C 00 8E D6 86 D7 DE D7 2E 4E
+1E D2 BC 21 19 42 BA 21 92 3F DE D5 03 4D 4F 56
+84 12 D4 D7 00 40 EC D7 05 4D 4F 56 2E 42 84 12
+D4 D7 40 40 00 00 03 41 44 44 84 12 D4 D7 00 50
+06 D8 05 41 44 44 2E 42 84 12 D4 D7 40 50 12 D8
+04 41 44 44 43 00 84 12 D4 D7 00 60 20 D8 06 41
+44 44 43 2E 42 00 84 12 D4 D7 40 60 C4 D7 04 53
+55 42 43 00 84 12 D4 D7 00 70 3E D8 06 53 55 42
+43 2E 42 00 84 12 D4 D7 40 70 4C D8 03 53 55 42
+84 12 D4 D7 00 80 5C D8 05 53 55 42 2E 42 84 12
+D4 D7 40 80 C0 D5 03 43 4D 50 84 12 D4 D7 00 90
+76 D8 05 43 4D 50 2E 42 84 12 D4 D7 40 90 AE D5
+04 44 41 44 44 00 84 12 D4 D7 00 A0 90 D8 06 44
+41 44 44 2E 42 00 84 12 D4 D7 40 A0 82 D8 03 42
+49 54 84 12 D4 D7 00 B0 AE D8 05 42 49 54 2E 42
+84 12 D4 D7 40 B0 BA D8 03 42 49 43 84 12 D4 D7
+00 C0 C8 D8 05 42 49 43 2E 42 84 12 D4 D7 40 C0
+D4 D8 03 42 49 53 84 12 D4 D7 00 D0 E2 D8 05 42
+49 53 2E 42 84 12 D4 D7 40 D0 00 00 03 58 4F 52
+84 12 D4 D7 00 E0 FC D8 05 58 4F 52 2E 42 84 12
+D4 D7 40 E0 2E D8 03 41 4E 44 84 12 D4 D7 00 F0
+16 D9 05 41 4E 44 2E 42 84 12 D4 D7 40 F0 90 C6
+8E D6 34 D9 1A 42 BC 21 B2 F0 70 00 BC 21 8A 10
+3A F0 0F 00 82 DA BC 21 4A 3F 68 D8 03 52 52 43
+84 12 2E D9 00 10 4C D9 05 52 52 43 2E 42 84 12
+2E D9 40 10 58 D9 04 53 57 50 42 00 84 12 2E D9
+80 10 66 D9 03 52 52 41 84 12 2E D9 00 11 74 D9
+05 52 52 41 2E 42 84 12 2E D9 40 11 80 D9 03 53
+58 54 84 12 2E D9 80 11 00 00 04 50 55 53 48 00
+84 12 2E D9 00 12 9A D9 06 50 55 53 48 2E 42 00
+84 12 2E D9 40 12 EE D8 04 43 41 4C 4C 00 84 12
+2E D9 80 12 34 C4 2C 00 8E D6 86 D7 CE D9 59 42
+BC 21 5A 42 BD 21 82 4A BC 21 BE 90 00 15 00 00
+02 20 0A 89 02 3C 09 8A 0A 49 3A 90 10 00 03 2C
+5A 0E A8 3F 1A 53 0E 4A 87 12 8A C7 94 C9 0D 6F
+75 74 20 6F 66 20 62 6F 75 6E 64 73 30 CD A8 D9
+05 50 55 53 48 4D 84 12 C4 D9 00 15 10 DA 04 50
+4F 50 4D 00 84 12 C4 D9 00 17 90 C6 FA D5 30 DA
+82 43 BC 21 92 42 C4 21 BA 21 A2 53 C4 21 92 53
+C2 21 3E 40 2C 00 B0 12 2A C4 EE C9 02 CB E0 C5
+AE CD 86 D7 56 DA 0A 4E 3E 4F 1A 83 2A 92 CA 2F
+8A 10 5A 06 6F 3F 8E D9 04 52 52 43 4D 00 84 12
+2A DA 50 00 68 DA 04 52 52 41 4D 00 84 12 2A DA
+50 01 76 DA 04 52 4C 41 4D 00 84 12 2A DA 50 02
+84 DA 04 52 52 55 4D 00 84 12 2A DA 50 03 85 12
+00 3C 92 DA 03 53 3E 3D 85 12 00 38 A4 DA 02 53
+3C 00 85 12 00 34 1E DA 03 30 3E 3D 85 12 00 30
+B8 DA 02 30 3C 00 85 12 00 30 00 00 02 55 3C 00
+85 12 00 2C CC DA 03 55 3E 3D 85 12 00 28 C2 DA
+03 30 3C 3E 85 12 00 24 E0 DA 02 30 3D 00 85 12
+00 20 84 C8 02 49 46 00 1A 42 C4 21 8A 4E 00 00
+A2 53 C4 21 0E 4A 30 4D D6 DA 04 54 48 45 4E 00
+1A 42 C4 21 08 4E 3E 4F 09 48 29 53 0A 89 0A 11
+3A 90 00 02 68 2F 88 DA 00 00 30 4D 9E D8 04 45
+4C 53 45 00 1A 42 C4 21 BA 40 00 3C 00 00 A2 53
+C4 21 2F 83 8F 4A 00 00 E3 3F 0A DB 05 55 4E 54
+49 4C 3A 4F 08 4E 3E 4F 19 42 C4 21 2A 83 0A 89
+0A 11 3A 90 00 FE 47 3B 3A F0 FF 03 08 DA 89 48
+00 00 A2 53 C4 21 30 4D 22 D9 05 41 47 41 49 4E
+87 12 9E DA 52 DB 2A C4 00 00 05 57 48 49 4C 45
+87 12 F8 DA 78 C4 2A C4 AE DA 06 52 45 50 45 41
+54 00 87 12 9E DA 52 DB 10 DB 2A C4 00 00 03 4A
+4D 50 87 12 A0 CD 9E DA 52 DB 2A C4 3E B0 00 10
+03 20 3E E0 00 04 30 4D 3E 90 00 34 06 28 03 24
+3E 40 00 34 30 4D 3E 40 00 38 30 4D 00 00 04 3F
+4A 4D 50 00 87 12 BC DB A0 CD 78 C4 52 DB 2A C4
+F2 DB 3D 41 08 4E 3E 4F 2A 48 0A 93 04 20 98 42
+C4 21 00 00 30 4D 88 43 00 00 A4 3F B8 D9 03 42
+57 31 84 12 F0 DB 00 00 0E DC 03 42 57 32 84 12
+F0 DB 00 00 1A DC 03 42 57 33 84 12 F0 DB 00 00
+32 DC 3D 41 1A 42 C4 21 28 4E 08 93 08 20 BA 4F
+00 00 A2 53 C4 21 8E 4A 00 00 3E 4F 30 4D 8E 43
+00 00 61 3F 00 00 03 46 57 31 84 12 30 DC 00 00
+56 DC 03 46 57 32 84 12 30 DC 00 00 62 DC 03 46
+57 33 84 12 30 DC 00 00 6E DC 04 47 4F 54 4F 00
+87 12 9E DA A0 CD C0 CB 2A C4 DE DB 05 3F 47 4F
+54 4F 87 12 BC DB A0 CD C0 CB 2A C4
@FFDA
-C6 D2 C6 D2 C6 D2 C6 D2 C6 D2 6A C8 C6 D2 C6 D2
-C6 D2 C6 D2 C6 D2 C6 D2 C6 D2 C6 D2 C6 D2 C6 D2
-C6 D2 C6 D2 C6 D2
+36 D4 36 D4 36 D4 36 D4 36 D4 92 C8 36 D4 36 D4
+36 D4 36 D4 36 D4 36 D4 36 D4 36 D4 36 D4 36 D4
+36 D4 36 D4 36 D4
q
+++ /dev/null
-@1800
-10 00 6A C8 80 3E 30 75 FD FF 18 00 30 DB E6 D3
-2A C8 3C C8 00 00 00 00
-@21AA
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00
-@C400
-3A 41 0D 12 0D 4A 30 4D 2F 83 8F 4E 00 00 3E 41
-2E 4E 30 4D 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E
-30 4D 00 00 04 45 58 49 54 00 3D 41 30 4D 00 00
-03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 C4
-03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
-44 55 50 00 0E 93 F6 23 30 4D 40 C4 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 C4 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E C4 02 3E 52 00 0E 12 3E 4F 30 4D 8E C4
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 C4
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C C4 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 20 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 C4 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 C5
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 C4 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA C4 03 41 4E 44 3E FF 30 4D 7A C4 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E C5 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 C5 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E C5 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 C5 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 C4 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
-3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE C5 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 C5 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 C5 03 3E 49 4E 85 12 C2 21 10 C5
-04 42 41 53 45 00 85 12 DA 21 C0 C4 05 53 54 41
-54 45 85 12 B6 21 30 C6 02 42 4C 00 85 12 20 00
-94 C5 02 3C 23 00 B2 40 AA 21 AA 21 30 4D 1E 15
-0E 43 3D 40 20 00 0A 93 04 20 0D 11 0A 4C 0C 43
-09 43 0E 9B 01 28 0E 8B 09 69 08 68 1D 83 07 30
-0C 5C 0A 6A 0E 6E F5 2B 0E 8B 12 D3 F5 3F 0A 4E
-1D 17 30 41 48 C6 01 23 1B 42 DA 21 2C 4F 0A 4E
-B0 12 5E C6 8F 49 00 00 0E 48 7A 90 0A 00 02 28
-3A 50 07 00 3A 50 30 00 92 83 AA 21 18 42 AA 21
-C8 4A 00 00 30 4D 96 C6 02 23 53 00 87 12 98 C6
-D2 C6 2D 83 09 93 E0 23 0E 93 DE 23 3D 41 30 4D
-C8 C6 02 23 3E 00 9F 42 AA 21 00 00 3E 40 AA 21
-2E 8F 30 4D 00 C6 04 48 4F 4C 44 00 0A 4E 3E 4F
-DB 3F 3C C6 04 53 49 47 4E 00 0E 93 3E 4F 3A 40
-2D 00 D2 33 30 4D F4 C5 03 55 44 2E 87 12 56 C6
-CC C6 E6 C6 50 C9 18 C9 2A C4 18 C7 02 55 2E 00
-2F 83 8F 4E 00 00 0E 43 F1 3F 3E B0 00 80 06 24
-BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D DA C4
-02 44 2E 00 87 12 56 C6 6E C4 80 C4 3A C7 CC C6
-92 C4 0A C7 E6 C6 50 C9 18 C9 2A C4 52 C5 01 2E
-3E B0 00 80 DD 27 2F 83 3E 43 EC 3F F6 C6 04 48
-45 52 45 00 2F 83 8F 4E 00 00 1E 42 C4 21 30 4D
-62 C5 05 41 4C 4C 4F 54 82 5E C4 21 3E 4F 30 4D
-E2 C6 02 43 2C 00 1A 42 C4 21 CA 4E 00 00 92 53
-C4 21 3E 4F 30 4D 2F 83 8F 4E 00 00 B0 12 2A C8
-92 B3 1C 05 FD 27 1E 42 0C 05 B0 12 3C C8 30 4D
-30 40 B6 C7 7E C7 05 28 4B 45 59 29 18 42 0C 05
-EA 3F 12 C6 03 4B 45 59 30 40 DC C7 92 C7 06 41
-43 43 45 50 54 00 3C 40 A8 C8 3B 40 72 C8 2D 15
-0A 4E 2E 4F 0A 5E 3B 40 0D 00 3C 40 20 00 3D 40
-9C C8 92 B3 1C 05 05 24 18 42 0C 05 38 90 0A 00
-04 20 21 53 39 40 56 C8 4D 15 B2 40 11 00 0E 05
-A2 B3 1C 05 FD 27 E2 C2 22 02 30 41 B2 40 13 00
-0E 05 A2 B3 1C 05 FD 27 E2 D2 22 02 30 41 00 00
-05 53 4C 45 45 50 30 40 64 C8 00 00 07 28 53 4C
-45 45 50 29 12 D2 0A 18 F6 3F 21 52 3A 17 58 42
-0C 05 48 9B E3 27 48 9C 06 2C 78 92 11 20 2E 9F
-0F 24 1E 83 05 3C 0E 9A 03 24 CE 48 00 00 1E 53
-82 48 0E 05 A2 B3 1C 05 FD 27 30 4D 9E C8 2D 83
-92 B3 1C 05 FD 27 E3 23 B2 40 18 00 0A 18 3E 8F
-3D 41 30 4D D6 C7 06 28 45 4D 49 54 29 00 08 4E
-3E 4F E6 3F 50 C7 04 45 4D 49 54 00 30 40 BE C8
-C6 C8 04 45 43 48 4F 00 B2 40 82 48 90 C8 30 4D
-6E C7 06 4E 4F 45 43 48 4F 00 B2 40 30 4D 90 C8
-30 4D B6 C8 04 28 43 52 29 00 2F 83 8F 4E 00 00
-3E 40 0D 00 E3 3F A2 C7 02 43 52 00 30 40 FA C8
-04 C7 05 53 50 41 43 45 2F 83 8F 4E 00 00 3E 40
-20 00 D4 3F 12 C9 06 53 50 41 43 45 53 00 0E 93
-09 24 0D 12 3D 40 3A C9 EF 3F 3C C9 2D 83 1E 83
-EB 23 3D 41 3E 4F 30 4D 2C C7 04 54 59 50 45 00
-0E 93 95 24 2A 4F 8F 5E 00 00 0E 4A 87 12 CA C5
-02 C6 0A C5 CC C8 EC C5 60 C9 2A C4 2F 82 8F 4E
-02 00 7E 4D 8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D
-26 C9 82 53 22 00 87 12 34 C4 6C C9 A2 CB 34 C4
-22 00 C6 C9 96 C9 3D 41 6E 4E 1E 83 82 5E C4 21
-3E 4F 92 B3 C4 21 A2 63 C4 21 30 4D E2 C8 82 2E
-22 00 87 12 86 C9 34 C4 50 C9 A2 CB 2A C4 00 00
-04 57 4F 52 44 00 3C 40 BE 21 39 4C 3A 4C 09 5A
-3A 5C 28 4C 09 9A 19 24 7E 9A FC 27 1A 83 3B 40
-60 00 C8 4C 00 00 09 9A 0C 24 7C 4A 4E 9C 09 24
-18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F 7C 80 20 00
-F0 3F 1A 82 C0 21 82 4A C2 21 1E 42 C4 21 08 8E
-CE 48 00 00 30 4D 00 00 04 46 49 4E 44 00 2F 83
-0C 4E 65 4C 74 40 80 00 3B 40 CA 21 3E 4B 0E 93
-1E 24 58 4C 01 00 78 F0 1E 00 0E 58 2E 53 1E 4E
-FE FF 0E 93 F3 27 09 4E 78 49 48 C4 48 95 F7 23
-0A 4C 1A 53 FA 99 00 00 F2 23 58 83 FA 23 19 B3
-09 63 0C 49 6A 4E 1E 43 4A 93 01 30 2E 83 8F 4C
-00 00 35 40 08 C4 34 40 14 C4 30 4D 2F 53 2F 53
-3E 4F 30 4D 26 C6 07 3E 4E 55 4D 42 45 52 3C 4F
-38 4F 29 4F 2F 82 1B 42 DA 21 6A 4C 7A 80 30 00
-7A 90 0A 00 02 28 7A 80 07 00 0A 9B 13 2C 82 49
-D0 04 82 48 D2 04 82 4B C8 04 19 42 E4 04 18 42
-E6 04 09 5A 08 63 1C 53 1E 83 E7 23 8F 49 04 00
-8F 48 02 00 8F 4C 00 00 30 4D 03 12 0D 12 1B 42
-DA 21 0B 12 32 C0 00 02 6D 4E 0D 5E 0C 4E 7A 40
-2E 00 0D 9C 0A 28 7A 9C FC 23 32 D0 00 02 FC 4C
-FE FF 0D 9C FC 2F DE 83 00 00 09 43 08 43 3D 40
-50 CB 3F 82 8F 4E 06 00 0C 4E 7E 4C 6A 4C 7A 90
-2D 00 10 2C 3B 40 10 00 7A 80 24 00 06 24 2B 43
-5A 83 03 24 3B 52 6A 53 B0 23 1C 53 1E 83 6A 4C
-7A 90 2D 00 AA 23 1C 53 1E 83 B1 43 04 00 A5 3F
-52 CB 2F 53 0E 93 2C 17 82 4C DA 21 03 24 2F 52
-0E F3 30 4D 9F 4F 02 00 04 00 BF 4F 00 00 3E E3
-09 20 3E E3 BF E3 02 00 BF E3 00 00 9F 53 02 00
-8F 63 00 00 32 B0 00 02 01 20 2F 53 30 4D D2 C8
-07 45 58 45 43 55 54 45 0A 4E 3E 4F 00 4A 28 C5
-01 2C 1A 42 C4 21 A2 53 C4 21 8A 4E 00 00 3E 4F
-30 4D A0 CB 87 4C 49 54 45 52 41 4C 82 93 B6 21
-16 24 32 B0 00 02 09 24 1A 42 C4 21 A2 52 C4 21
-BA 40 34 C4 00 00 BA 4F 02 00 1A 42 C4 21 A2 52
-C4 21 BA 40 34 C4 00 00 8A 4E 02 00 3E 4F 30 4D
-08 C9 05 43 4F 55 4E 54 2F 83 1E 53 8F 4E 00 00
-5E 4E FF FF 30 4D 82 4E BE 21 B2 4F C0 21 3E 4F
-82 43 C2 21 87 12 4C C6 C6 C9 1C CC 3D 40 28 CC
-FE 22 3D 41 3E 4F 30 4D 2A CC 0A 4E 3E 4F 3D 40
-40 CC 53 27 3D 40 16 CC 1A E2 B6 21 B2 27 AC 23
-42 CC 3E 4F 3D 40 16 CC B9 23 DE 53 00 00 68 4E
-08 5E F8 40 3F 00 00 00 3D 40 0C CE CD 3F 90 CB
-08 45 56 41 4C 55 41 54 45 00 39 40 BE 21 39 12
-39 12 39 12 0D 12 B0 12 2A C4 06 CC 7E CC 3D 41
-B2 41 C2 21 B2 41 C0 21 B2 41 BE 21 30 4D 7A C5
-04 51 55 49 54 00 31 40 E0 20 B2 40 00 20 00 20
-82 43 B6 21 82 43 08 18 B0 12 2A C4 6C C9 04 0D
-6F 6B 20 00 50 C9 34 C4 38 21 44 C4 34 C4 50 00
-F6 C7 18 C9 06 CC 34 C4 7E 20 CE C4 B2 C5 6C C9
-0D 73 74 61 63 6B 20 65 6D 70 74 79 20 21 1A CD
-34 C4 30 FF 84 C7 B2 C5 6C C9 0B 46 52 41 4D 20
-66 75 6C 6C 20 21 1A CD 42 C6 F4 C4 C0 C5 AC CC
-6C C9 04 0D 20 20 20 00 BC C5 B4 CC EE C7 05 41
-42 4F 52 54 3F 40 80 20 BE 3F 8F 93 02 00 AE 26
-B2 40 82 48 90 C8 B0 12 0C D2 82 43 AA DA 82 43
-B6 DA 82 43 C2 DA 82 43 F2 DA 82 43 FE DA 82 43
-0A DB A2 B3 1C 05 FD 27 B2 40 11 00 0E 05 E2 C2
-22 02 92 C3 1C 05 38 40 A0 AA 39 42 19 83 FE 23
-18 83 FB 23 92 B3 1C 05 F4 23 87 12 6C C9 04 1B
-5B 37 6D 00 50 C9 50 C9 6C C9 04 1B 5B 30 6D 00
-50 C9 4E D1 90 D1 96 D1 14 CD 0E CD 86 41 42 4F
-52 54 22 00 87 12 86 C9 34 C4 1A CD A2 CB 2A C4
-18 CA 01 27 87 12 4C C6 C6 C9 1E CA C0 C5 B2 CD
-2A C4 4A CC 52 C6 81 5C 92 42 BE 21 C2 21 30 4D
-87 12 A2 C9 4C C6 C6 C9 CA CD 08 4E 7A 4E 5A D3
-5A 53 0A 58 19 42 C8 21 6E 4E 3E F0 1E 00 09 5E
-82 48 AE 21 82 49 B0 21 82 4A B2 21 2A 52 82 4A
-C4 21 3E 4F 3D 41 30 41 87 12 6C C9 0F 73 74 61
-63 6B 20 6D 69 73 6D 61 74 63 68 21 20 CD 82 9F
-B4 21 F2 23 18 42 AE 21 19 42 B0 21 A8 49 FE FF
-89 48 00 00 30 4D C0 C9 08 56 41 52 49 41 42 4C
-45 00 B0 12 C0 CD BA 40 86 12 FC FF EF 3F F2 CB
-08 43 4F 4E 53 54 41 4E 54 00 B0 12 C0 CD BA 40
-85 12 FC FF 8A 4E FE FF 3E 4F E0 3F 40 CE 06 43
-52 45 41 54 45 00 B0 12 C0 CD BA 40 85 12 FC FF
-8A 4A FE FF D3 3F 60 CC 05 44 4F 45 53 3E 1A 42
-B2 21 BA 40 84 12 00 00 8A 4D 02 00 3D 41 30 4D
-78 CE 05 44 45 46 45 52 B0 12 C0 CD BA 40 30 40
-FC FF BA 40 8E CE FE FF B9 3F 00 00 81 5B 82 43
-B6 21 30 4D B6 CD 01 5D B2 43 B6 21 30 4D 82 C9
-87 52 45 43 55 52 53 45 19 42 C4 21 99 42 B2 21
-00 00 A2 53 C4 21 30 4D AC CE 01 3A B0 12 C0 CD
-BA 40 87 12 FC FF A2 83 C4 21 B2 43 B6 21 82 4F
-B4 21 30 4D DA CE 81 3B 82 93 B6 21 5D 27 87 12
-34 C4 2A C4 A2 CB 0E CE AE CE 2A C4 F4 C8 09 49
-4D 4D 45 44 49 41 54 45 1A 42 AE 21 FA D0 80 00
-00 00 30 4D BE 4F 02 00 3E 4F 30 4D 0E CF 82 49
-53 00 87 12 42 C6 F4 C4 C0 C5 46 CF 52 CF 34 C4
-24 CF A2 CB 2A C4 A4 CD 24 CF 2A C4 F6 CE 83 5B
-27 5D 87 12 A4 CD 34 C4 34 C4 A2 CB A2 CB 2A C4
-90 CC 88 50 4F 53 54 50 4F 4E 45 00 87 12 4C C6
-C6 C9 1E CA 54 C4 C0 C5 B2 CD 7E C5 C0 C5 8C CF
-34 C4 34 C4 A2 CB A2 CB 34 C4 A2 CB A2 CB 2A C4
-92 CF 3A 4E 82 4A C6 21 2E 4E 82 4E C4 21 3D 40
-10 00 09 4A 08 49 29 83 18 48 FE FF 0E 98 FC 2B
-89 48 00 00 1D 83 F6 23 2A 4A 0A 93 F0 23 3E 4F
-3D 41 30 4D 2E CF 82 49 46 00 2F 83 8F 4E 00 00
-1E 42 C4 21 BE 40 C0 C5 00 00 A2 52 C4 21 2E 53
-30 4D 92 CE 84 45 4C 53 45 00 1A 42 C4 21 BA 40
-BC C5 00 00 2A 52 82 4A C4 21 8E 4A 00 00 2A 83
-0E 4A 30 4D 4A C9 84 54 48 45 4E 00 9E 42 C4 21
-00 00 3E 4F 30 4D 5E CE 85 42 45 47 49 4E 30 40
-84 C7 06 D0 85 55 4E 54 49 4C 39 40 C0 C5 1A 42
-C4 21 A2 52 C4 21 8A 49 00 00 8A 4E 02 00 3E 4F
-30 4D 8C CD 85 41 47 41 49 4E 39 40 BC C5 EF 3F
-28 CE 85 57 48 49 4C 45 87 12 CA CF 6E C4 2A C4
-C0 CE 86 52 45 50 45 41 54 00 87 12 4A D0 0C D0
-2A C4 E4 CF 82 44 4F 00 2F 83 8F 4E 00 00 1E 42
-C4 21 BE 40 CA C5 00 00 2E 53 82 4E C4 21 A2 53
-00 20 1A 42 00 20 8A 43 00 00 30 4D B4 CB 84 4C
-4F 4F 50 00 39 40 EC C5 1A 42 C4 21 A2 52 C4 21
-8A 49 00 00 8A 4E 02 00 1E 42 00 20 A2 83 00 20
-2E 4E 0E 93 04 24 9E 42 C4 21 00 00 F5 3F 3E 4F
-30 4D E4 C7 85 2B 4C 4F 4F 50 39 40 DA C5 E4 3F
-9E D0 85 4C 45 41 56 45 1A 42 C4 21 BA 40 FC C5
-00 00 BA 40 BC C5 02 00 B2 50 06 00 C4 21 A2 53
-00 20 2A 52 19 42 00 20 89 4A 00 00 30 4D E2 D0
-04 4D 4F 56 45 00 0A 4E 38 4F 39 4F 3E 4F 0A 93
-11 24 08 99 0F 24 06 2C F8 49 00 00 18 53 1A 83
-FB 23 30 4D 08 5A 09 5A 19 83 18 83 E8 49 00 00
-1A 83 FA 23 30 4D 34 C4 CA 21 FC C4 2A C4 84 12
-46 D1 2C D4 02 D4 74 D0 A2 CD EA D3 D4 D0 10 D1
-AE C9 B4 D1 E8 D1 24 D0 AE D2 48 C5 4E CF B6 CE
-86 CA 00 00 3A 40 0C 00 39 40 CA 21 38 40 CC 21
-D9 3F 3A 40 0E 00 39 40 CC 21 38 40 CA 21 CC 3F
-82 43 CC 21 30 4D 92 42 CA 21 C8 21 30 4D 62 CF
-09 50 57 52 5F 53 54 41 54 45 84 12 90 CF E6 D3
-30 DB A0 D1 08 50 57 52 5F 48 45 52 45 00 92 42
-C4 21 B0 D1 92 42 C6 21 AE D1 EF 3F 62 D0 09 52
-53 54 5F 53 54 41 54 45 92 42 0C 18 B0 D1 92 42
-0E 18 AE D1 E2 3F CE D1 08 52 53 54 5F 48 45 52
-45 00 92 42 C4 21 0C 18 92 42 C6 21 0E 18 DF 3F
-B2 40 54 D2 B6 D2 B2 40 64 C8 58 C8 B2 40 BE C8
-CE C8 B2 40 FA C8 0E C9 B2 40 DC C7 EA C7 30 41
-52 D0 04 57 49 50 45 00 39 40 80 FF B9 43 00 00
-29 53 39 90 DA FF FA 23 B0 12 00 D2 B2 40 30 DB
-C4 21 B2 40 E6 D3 C6 21 D4 3F C6 CF 06 28 57 41
-52 4D 29 00 1E 42 08 18 87 12 6C C9 05 0D 1B 5B
-37 6D 50 C9 70 C7 6C C9 27 20 46 61 73 74 46 6F
-72 74 68 20 56 31 36 30 20 31 36 4D 48 7A 20 28
-43 29 20 4A 2E 4D 2E 54 68 6F 6F 72 65 6E 73 20
-50 C9 34 C4 30 FF 84 C7 2A C5 30 C7 6C C9 0B 62
-79 74 65 73 20 66 72 65 65 20 26 CD 22 D2 04 57
-41 52 4D 00 30 40 54 D2 18 D0 04 43 4F 4C 44 00
-B2 40 04 A5 20 01 B2 40 88 5A CC 01 B2 43 02 02
-B2 D3 06 02 F2 D0 06 00 24 02 F2 D3 26 02 F2 40
-FD 00 22 02 F2 40 A5 00 A1 01 F2 40 10 00 A0 01
-D2 43 A1 01 B2 40 00 A5 60 01 B2 40 29 01 80 01
-B2 40 0B 00 82 01 B2 40 E9 01 84 01 39 40 40 00
-B2 D0 10 00 86 01 92 D2 5E 01 08 18 A2 93 08 18
-01 24 59 03 38 40 50 C3 18 83 FE 23 19 83 FA 23
-3A 40 C6 D2 39 40 DA FF 89 4A 00 00 29 53 FC 23
-92 42 02 18 E4 FF B2 40 18 00 0A 18 31 40 E0 20
-3F 40 80 20 37 40 00 C4 36 40 B4 C4 35 40 08 C4
-34 40 14 C4 B2 40 0A 00 DA 21 B2 43 AC 21 92 C3
-30 01 18 42 08 18 F2 B0 10 00 00 02 04 20 38 E3
-18 53 82 48 08 18 B2 40 81 00 00 05 B2 40 05 00
-06 05 B2 40 00 49 08 05 F2 D0 30 00 0A 02 92 C3
-00 05 92 D3 1A 05 3D 40 C0 D3 18 42 08 18 38 90
-0A 00 3A 27 38 90 16 00 37 2F 28 93 0D 23 F5 26
-B4 D2 84 12 46 D1 0E DA BA DA C2 D9 0E DB 88 D9
-42 DA 8C D6 00 00 7E D9 2E DA E0 D9 1E DA 9C D7
-00 00 00 00 20 DB 72 D1 4C D2 85 48 49 32 4C 4F
-87 12 84 C7 DE CF A2 CB AE CE 74 D1 C2 D3 2A C4
-BA D2 04 43 4F 44 45 00 B0 12 C0 CD A2 82 C4 21
-87 12 EE CE BC C5 FA D3 00 00 07 45 4E 44 43 4F
-44 45 87 12 82 D1 0E CE 2A C4 44 D0 03 41 53 4D
-92 42 C8 21 B8 21 B2 40 C6 D3 C8 21 E5 3F 1A D4
-06 45 4E 44 41 53 4D 00 92 42 B8 21 C8 21 E9 3F
-00 00 05 43 4F 4C 4F 4E 1A 42 C4 21 BA 40 87 12
-00 00 A2 53 C4 21 B2 43 B6 21 30 40 82 D1 00 00
-05 4C 4F 32 48 49 1A 42 C4 21 BA 40 B0 12 00 00
-BA 40 2A C4 02 00 A2 52 C4 21 ED 3F 38 40 BE 21
-39 48 2A 48 09 5A 1A 52 C2 21 09 9A 03 24 7E 9A
-FC 27 1A 83 0E 4A 2A 88 82 4A C2 21 30 4D B0 12
-2A C4 C6 C9 1E CA 72 C5 C0 C5 C4 D4 DA CA C0 C5
-B2 CD E6 D4 C6 D4 29 4E 39 90 86 12 02 20 2E 53
-30 41 39 90 85 12 03 20 1E 4E 02 00 30 41 39 90
-84 12 01 20 2E 52 30 41 19 42 C4 21 A2 53 C4 21
-89 4E 00 00 3E 40 29 00 12 12 C2 21 92 53 C2 21
-B0 12 2A C4 C6 C9 DA CA C0 C5 18 D5 0E D5 21 53
-3E 90 10 00 BB 2D 30 41 1A D5 B2 41 C2 21 22 D3
-30 41 87 12 4C C6 8C D4 2A D5 82 43 BC 21 92 42
-C4 21 BA 21 A2 53 C4 21 0A 4E 3E 4F FA 90 23 00
-00 00 34 20 92 53 C2 21 B0 12 AE D4 0E 93 04 20
-B2 40 00 03 BC 21 27 3C 1E 93 04 20 B2 40 10 03
-BC 21 21 3C 2E 93 04 20 B2 40 20 03 BC 21 1B 3C
-2E 92 04 20 B2 40 20 02 BC 21 15 3C 3E 92 04 20
-B2 40 30 02 BC 21 0F 3C 3E 93 04 20 B2 40 30 03
-BC 21 09 3C B2 40 30 00 BC 21 19 42 C4 21 A2 53
-C4 21 89 4E 00 00 3E 4F 3D 41 30 4D FA 90 26 00
-00 00 08 20 B2 40 10 02 BC 21 92 53 C2 21 30 12
-9A D5 75 3F FA 90 40 00 00 00 1A 20 B2 40 20 00
-BC 21 92 53 C2 21 B0 12 F8 D4 0E 20 B2 50 10 00
-BC 21 3E 40 2B 00 B0 12 F8 D4 32 24 92 92 BE 21
-C2 21 02 24 92 53 C2 21 8E 10 82 5E BC 21 D3 3F
-B0 12 F8 D4 F9 23 B2 50 10 00 BC 21 3E 40 28 00
-B0 12 AE D4 30 12 EA D5 67 3F 87 12 4C C6 8C D4
-22 D6 FE 90 26 00 00 00 3E 40 20 00 04 20 B2 50
-82 00 BC 21 C2 3F B0 12 F8 D4 DF 23 B2 50 80 00
-BC 21 3E 40 28 00 B0 12 AE D4 B0 12 E8 D4 D5 23
-3D 40 B2 CD 30 4D 50 C8 04 52 45 54 49 00 87 12
-34 C4 00 13 A2 CB 2A C4 34 C4 2C 00 22 D5 1A D6
-72 D6 2E 4E 1E D2 BC 21 19 42 BA 21 92 3F 70 D4
-03 4D 4F 56 84 12 68 D6 00 40 80 D6 05 4D 4F 56
-2E 42 84 12 68 D6 40 40 00 00 03 41 44 44 84 12
-68 D6 00 50 9A D6 05 41 44 44 2E 42 84 12 68 D6
-40 50 A6 D6 04 41 44 44 43 00 84 12 68 D6 00 60
-B4 D6 06 41 44 44 43 2E 42 00 84 12 68 D6 40 60
-58 D6 04 53 55 42 43 00 84 12 68 D6 00 70 D2 D6
-06 53 55 42 43 2E 42 00 84 12 68 D6 40 70 E0 D6
-03 53 55 42 84 12 68 D6 00 80 F0 D6 05 53 55 42
-2E 42 84 12 68 D6 40 80 52 D4 03 43 4D 50 84 12
-68 D6 00 90 0A D7 05 43 4D 50 2E 42 84 12 68 D6
-40 90 40 D4 04 44 41 44 44 00 84 12 68 D6 00 A0
-24 D7 06 44 41 44 44 2E 42 00 84 12 68 D6 40 A0
-16 D7 03 42 49 54 84 12 68 D6 00 B0 42 D7 05 42
-49 54 2E 42 84 12 68 D6 40 B0 4E D7 03 42 49 43
-84 12 68 D6 00 C0 5C D7 05 42 49 43 2E 42 84 12
-68 D6 40 C0 68 D7 03 42 49 53 84 12 68 D6 00 D0
-76 D7 05 42 49 53 2E 42 84 12 68 D6 40 D0 00 00
-03 58 4F 52 84 12 68 D6 00 E0 90 D7 05 58 4F 52
-2E 42 84 12 68 D6 40 E0 C2 D6 03 41 4E 44 84 12
-68 D6 00 F0 AA D7 05 41 4E 44 2E 42 84 12 68 D6
-40 F0 4C C6 22 D5 C8 D7 1A 42 BC 21 B2 F0 70 00
-BC 21 8A 10 3A F0 0F 00 82 DA BC 21 4A 3F FC D6
-03 52 52 43 84 12 C2 D7 00 10 E0 D7 05 52 52 43
-2E 42 84 12 C2 D7 40 10 EC D7 04 53 57 50 42 00
-84 12 C2 D7 80 10 FA D7 03 52 52 41 84 12 C2 D7
-00 11 08 D8 05 52 52 41 2E 42 84 12 C2 D7 40 11
-14 D8 03 53 58 54 84 12 C2 D7 80 11 00 00 04 50
-55 53 48 00 84 12 C2 D7 00 12 2E D8 06 50 55 53
-48 2E 42 00 84 12 C2 D7 40 12 82 D7 04 43 41 4C
-4C 00 84 12 C2 D7 80 12 34 C4 2C 00 22 D5 1A D6
-62 D8 59 42 BC 21 5A 42 BD 21 82 4A BC 21 BE 90
-00 15 00 00 02 20 0A 89 02 3C 09 8A 0A 49 3A 90
-10 00 03 2C 5A 0E A8 3F 1A 53 0E 4A 87 12 70 C7
-6C C9 0D 6F 75 74 20 6F 66 20 62 6F 75 6E 64 73
-20 CD 3C D8 05 50 55 53 48 4D 84 12 58 D8 00 15
-A4 D8 04 50 4F 50 4D 00 84 12 58 D8 00 17 4C C6
-8C D4 C4 D8 82 43 BC 21 92 42 C4 21 BA 21 A2 53
-C4 21 92 53 C2 21 3E 40 2C 00 B0 12 2A C4 C6 C9
-DA CA C0 C5 B2 CD 1A D6 EA D8 0A 4E 3E 4F 1A 83
-2A 92 CA 2F 8A 10 5A 06 6F 3F 22 D8 04 52 52 43
-4D 00 84 12 BE D8 50 00 FC D8 04 52 52 41 4D 00
-84 12 BE D8 50 01 0A D9 04 52 4C 41 4D 00 84 12
-BE D8 50 02 18 D9 04 52 52 55 4D 00 84 12 BE D8
-50 03 85 12 00 3C 26 D9 03 53 3E 3D 85 12 00 38
-38 D9 02 53 3C 00 85 12 00 34 B2 D8 03 30 3E 3D
-85 12 00 30 4C D9 02 30 3C 00 85 12 00 30 00 00
-02 55 3C 00 85 12 00 2C 60 D9 03 55 3E 3D 85 12
-00 28 56 D9 03 30 3C 3E 85 12 00 24 74 D9 02 30
-3D 00 85 12 00 20 5C C8 02 49 46 00 1A 42 C4 21
-8A 4E 00 00 A2 53 C4 21 0E 4A 30 4D 6A D9 04 54
-48 45 4E 00 1A 42 C4 21 08 4E 3E 4F 09 48 29 53
-0A 89 0A 11 3A 90 00 02 68 2F 88 DA 00 00 30 4D
-32 D7 04 45 4C 53 45 00 1A 42 C4 21 BA 40 00 3C
-00 00 A2 53 C4 21 2F 83 8F 4A 00 00 E3 3F 9E D9
-05 55 4E 54 49 4C 3A 4F 08 4E 3E 4F 19 42 C4 21
-2A 83 0A 89 0A 11 3A 90 00 FE 47 3B 3A F0 FF 03
-08 DA 89 48 00 00 A2 53 C4 21 30 4D B6 D7 05 41
-47 41 49 4E 87 12 32 D9 E6 D9 2A C4 00 00 05 57
-48 49 4C 45 87 12 8C D9 6E C4 2A C4 42 D9 06 52
-45 50 45 41 54 00 87 12 32 D9 E6 D9 A4 D9 2A C4
-00 00 03 4A 4D 50 87 12 A4 CD 32 D9 E6 D9 2A C4
-3E B0 00 10 03 20 3E E0 00 04 30 4D 3E 90 00 34
-06 28 03 24 3E 40 00 34 30 4D 3E 40 00 38 30 4D
-00 00 04 3F 4A 4D 50 00 87 12 50 DA A4 CD 6E C4
-E6 D9 2A C4 86 DA 3D 41 08 4E 3E 4F 2A 48 0A 93
-04 20 98 42 C4 21 00 00 30 4D 88 43 00 00 A4 3F
-4C D8 03 42 57 31 84 12 84 DA 00 00 A2 DA 03 42
-57 32 84 12 84 DA 00 00 AE DA 03 42 57 33 84 12
-84 DA 00 00 C6 DA 3D 41 1A 42 C4 21 28 4E 08 93
-08 20 BA 4F 00 00 A2 53 C4 21 8E 4A 00 00 3E 4F
-30 4D 8E 43 00 00 61 3F 00 00 03 46 57 31 84 12
-C4 DA 00 00 EA DA 03 46 57 32 84 12 C4 DA 00 00
-F6 DA 03 46 57 33 84 12 C4 DA 00 00 02 DB 04 47
-4F 54 4F 00 87 12 32 D9 A4 CD 98 CB 2A C4 72 DA
-05 3F 47 4F 54 4F 87 12 50 DA A4 CD 98 CB 2A C4
-@FFDA
-C6 D2 C6 D2 C6 D2 C6 D2 C6 D2 6A C8 C6 D2 C6 D2
-C6 D2 C6 D2 C6 D2 C6 D2 C6 D2 C6 D2 C6 D2 C6 D2
-C6 D2 C6 D2 C6 D2
-q
+++ /dev/null
-@1800
-10 00 5E C8 F4 01 80 04 FD FF 18 00 0E DB C4 D3
-2A C8 36 C8 00 00 00 00
-@21AA
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00
-@C400
-3A 41 0D 12 0D 4A 30 4D 2F 83 8F 4E 00 00 3E 41
-2E 4E 30 4D 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E
-30 4D 00 00 04 45 58 49 54 00 3D 41 30 4D 00 00
-03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 C4
-03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
-44 55 50 00 0E 93 F6 23 30 4D 40 C4 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 C4 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E C4 02 3E 52 00 0E 12 3E 4F 30 4D 8E C4
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 C4
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C C4 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 20 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 C4 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 C5
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 C4 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA C4 03 41 4E 44 3E FF 30 4D 7A C4 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E C5 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 C5 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E C5 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 C5 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 C4 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
-3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE C5 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 C5 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 C5 03 3E 49 4E 85 12 C2 21 10 C5
-04 42 41 53 45 00 85 12 DA 21 C0 C4 05 53 54 41
-54 45 85 12 B6 21 30 C6 02 42 4C 00 85 12 20 00
-94 C5 02 3C 23 00 B2 40 AA 21 AA 21 30 4D 1E 15
-0E 43 3D 40 20 00 0A 93 04 20 0D 11 0A 4C 0C 43
-09 43 0E 9B 01 28 0E 8B 09 69 08 68 1D 83 07 30
-0C 5C 0A 6A 0E 6E F5 2B 0E 8B 12 D3 F5 3F 0A 4E
-1D 17 30 41 48 C6 01 23 1B 42 DA 21 2C 4F 0A 4E
-B0 12 5E C6 8F 49 00 00 0E 48 7A 90 0A 00 02 28
-3A 50 07 00 3A 50 30 00 92 83 AA 21 18 42 AA 21
-C8 4A 00 00 30 4D 96 C6 02 23 53 00 87 12 98 C6
-D2 C6 2D 83 09 93 E0 23 0E 93 DE 23 3D 41 30 4D
-C8 C6 02 23 3E 00 9F 42 AA 21 00 00 3E 40 AA 21
-2E 8F 30 4D 00 C6 04 48 4F 4C 44 00 0A 4E 3E 4F
-DB 3F 3C C6 04 53 49 47 4E 00 0E 93 3E 4F 3A 40
-2D 00 D2 33 30 4D F4 C5 03 55 44 2E 87 12 56 C6
-CC C6 E6 C6 44 C9 0C C9 2A C4 18 C7 02 55 2E 00
-2F 83 8F 4E 00 00 0E 43 F1 3F 3E B0 00 80 06 24
-BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D DA C4
-02 44 2E 00 87 12 56 C6 6E C4 80 C4 3A C7 CC C6
-92 C4 0A C7 E6 C6 44 C9 0C C9 2A C4 52 C5 01 2E
-3E B0 00 80 DD 27 2F 83 3E 43 EC 3F F6 C6 04 48
-45 52 45 00 2F 83 8F 4E 00 00 1E 42 C4 21 30 4D
-62 C5 05 41 4C 4C 4F 54 82 5E C4 21 3E 4F 30 4D
-E2 C6 02 43 2C 00 1A 42 C4 21 CA 4E 00 00 92 53
-C4 21 3E 4F 30 4D 2F 83 8F 4E 00 00 B0 12 2A C8
-92 B3 1C 05 FD 27 1E 42 0C 05 B0 12 36 C8 30 4D
-30 40 B6 C7 7E C7 05 28 4B 45 59 29 18 42 0C 05
-EA 3F 12 C6 03 4B 45 59 30 40 DC C7 92 C7 06 41
-43 43 45 50 54 00 3C 40 96 C8 3B 40 66 C8 2D 15
-0A 4E 2E 4F 0A 5E 3B 40 0D 00 3C 40 20 00 3D 40
-8A C8 92 B3 1C 05 05 24 18 42 0C 05 38 90 0A 00
-04 20 21 53 39 40 4A C8 4D 15 B2 40 11 00 0E 05
-E2 C2 22 02 30 41 B2 40 13 00 0E 05 E2 D2 22 02
-30 41 00 00 05 53 4C 45 45 50 30 40 58 C8 00 00
-07 28 53 4C 45 45 50 29 12 D2 0A 18 F6 3F 21 52
-3A 17 58 42 0C 05 48 9B E6 27 48 9C 06 2C 78 92
-0E 20 2E 9F 0C 24 1E 83 05 3C 0E 9A 03 24 CE 48
-00 00 1E 53 82 48 0E 05 30 4D 8C C8 2D 83 92 B3
-1C 05 FD 27 E6 23 B2 40 18 00 0A 18 3E 8F 3D 41
-30 4D D6 C7 06 28 45 4D 49 54 29 00 08 4E 3E 4F
-A2 B3 1C 05 FD 27 E6 3F 50 C7 04 45 4D 49 54 00
-30 40 AC C8 BA C8 04 45 43 48 4F 00 B2 40 82 48
-84 C8 30 4D 6E C7 06 4E 4F 45 43 48 4F 00 B2 40
-30 4D 84 C8 30 4D A4 C8 04 28 43 52 29 00 2F 83
-8F 4E 00 00 3E 40 0D 00 E3 3F A2 C7 02 43 52 00
-30 40 EE C8 04 C7 05 53 50 41 43 45 2F 83 8F 4E
-00 00 3E 40 20 00 D4 3F 06 C9 06 53 50 41 43 45
-53 00 0E 93 09 24 0D 12 3D 40 2E C9 EF 3F 30 C9
-2D 83 1E 83 EB 23 3D 41 3E 4F 30 4D 2C C7 04 54
-59 50 45 00 0E 93 95 24 2A 4F 8F 5E 00 00 0E 4A
-87 12 CA C5 02 C6 0A C5 C0 C8 EC C5 54 C9 2A C4
-2F 82 8F 4E 02 00 7E 4D 8F 4D 00 00 0D 5E 1D B3
-0D 63 30 4D 1A C9 82 53 22 00 87 12 34 C4 60 C9
-96 CB 34 C4 22 00 BA C9 8A C9 3D 41 6E 4E 1E 83
-82 5E C4 21 3E 4F 92 B3 C4 21 A2 63 C4 21 30 4D
-D6 C8 82 2E 22 00 87 12 7A C9 34 C4 44 C9 96 CB
-2A C4 00 00 04 57 4F 52 44 00 3C 40 BE 21 39 4C
-3A 4C 09 5A 3A 5C 28 4C 09 9A 19 24 7E 9A FC 27
-1A 83 3B 40 60 00 C8 4C 00 00 09 9A 0C 24 7C 4A
-4E 9C 09 24 18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F
-7C 80 20 00 F0 3F 1A 82 C0 21 82 4A C2 21 1E 42
-C4 21 08 8E CE 48 00 00 30 4D 00 00 04 46 49 4E
-44 00 2F 83 0C 4E 65 4C 74 40 80 00 3B 40 CA 21
-3E 4B 0E 93 1E 24 58 4C 01 00 78 F0 1E 00 0E 58
-2E 53 1E 4E FE FF 0E 93 F3 27 09 4E 78 49 48 C4
-48 95 F7 23 0A 4C 1A 53 FA 99 00 00 F2 23 58 83
-FA 23 19 B3 09 63 0C 49 6A 4E 1E 43 4A 93 01 30
-2E 83 8F 4C 00 00 35 40 08 C4 34 40 14 C4 30 4D
-2F 53 2F 53 3E 4F 30 4D 26 C6 07 3E 4E 55 4D 42
-45 52 3C 4F 38 4F 29 4F 2F 82 1B 42 DA 21 6A 4C
-7A 80 30 00 7A 90 0A 00 02 28 7A 80 07 00 0A 9B
-13 2C 82 49 D0 04 82 48 D2 04 82 4B C8 04 19 42
-E4 04 18 42 E6 04 09 5A 08 63 1C 53 1E 83 E7 23
-8F 49 04 00 8F 48 02 00 8F 4C 00 00 30 4D 03 12
-0D 12 1B 42 DA 21 0B 12 32 C0 00 02 6D 4E 0D 5E
-0C 4E 7A 40 2E 00 0D 9C 0A 28 7A 9C FC 23 32 D0
-00 02 FC 4C FE FF 0D 9C FC 2F DE 83 00 00 09 43
-08 43 3D 40 44 CB 3F 82 8F 4E 06 00 0C 4E 7E 4C
-6A 4C 7A 90 2D 00 10 2C 3B 40 10 00 7A 80 24 00
-06 24 2B 43 5A 83 03 24 3B 52 6A 53 B0 23 1C 53
-1E 83 6A 4C 7A 90 2D 00 AA 23 1C 53 1E 83 B1 43
-04 00 A5 3F 46 CB 2F 53 0E 93 2C 17 82 4C DA 21
-03 24 2F 52 0E F3 30 4D 9F 4F 02 00 04 00 BF 4F
-00 00 3E E3 09 20 3E E3 BF E3 02 00 BF E3 00 00
-9F 53 02 00 8F 63 00 00 32 B0 00 02 01 20 2F 53
-30 4D C6 C8 07 45 58 45 43 55 54 45 0A 4E 3E 4F
-00 4A 28 C5 01 2C 1A 42 C4 21 A2 53 C4 21 8A 4E
-00 00 3E 4F 30 4D 94 CB 87 4C 49 54 45 52 41 4C
-82 93 B6 21 16 24 32 B0 00 02 09 24 1A 42 C4 21
-A2 52 C4 21 BA 40 34 C4 00 00 BA 4F 02 00 1A 42
-C4 21 A2 52 C4 21 BA 40 34 C4 00 00 8A 4E 02 00
-3E 4F 30 4D FC C8 05 43 4F 55 4E 54 2F 83 1E 53
-8F 4E 00 00 5E 4E FF FF 30 4D 82 4E BE 21 B2 4F
-C0 21 3E 4F 82 43 C2 21 87 12 4C C6 BA C9 10 CC
-3D 40 1C CC FE 22 3D 41 3E 4F 30 4D 1E CC 0A 4E
-3E 4F 3D 40 34 CC 53 27 3D 40 0A CC 1A E2 B6 21
-B2 27 AC 23 36 CC 3E 4F 3D 40 0A CC B9 23 DE 53
-00 00 68 4E 08 5E F8 40 3F 00 00 00 3D 40 00 CE
-CD 3F 84 CB 08 45 56 41 4C 55 41 54 45 00 39 40
-BE 21 39 12 39 12 39 12 0D 12 B0 12 2A C4 FA CB
-72 CC 3D 41 B2 41 C2 21 B2 41 C0 21 B2 41 BE 21
-30 4D 7A C5 04 51 55 49 54 00 31 40 E0 20 B2 40
-00 20 00 20 82 43 B6 21 82 43 08 18 B0 12 2A C4
-60 C9 04 0D 6F 6B 20 00 44 C9 34 C4 38 21 44 C4
-34 C4 50 00 F6 C7 0C C9 FA CB 34 C4 7E 20 CE C4
-B2 C5 60 C9 0D 73 74 61 63 6B 20 65 6D 70 74 79
-20 21 0E CD 34 C4 30 FF 84 C7 B2 C5 60 C9 0B 46
-52 41 4D 20 66 75 6C 6C 20 21 0E CD 42 C6 F4 C4
-C0 C5 A0 CC 60 C9 04 0D 20 20 20 00 BC C5 A8 CC
-EE C7 05 41 42 4F 52 54 3F 40 80 20 BE 3F 8F 93
-02 00 AE 26 B2 40 82 48 84 C8 B0 12 00 D2 82 43
-88 DA 82 43 94 DA 82 43 A0 DA 82 43 D0 DA 82 43
-DC DA 82 43 E8 DA A2 B3 1C 05 FD 27 B2 40 11 00
-0E 05 E2 C2 22 02 92 C3 1C 05 38 40 55 05 39 42
-19 83 FE 23 18 83 FB 23 92 B3 1C 05 F4 23 87 12
-60 C9 04 1B 5B 37 6D 00 44 C9 44 C9 60 C9 04 1B
-5B 30 6D 00 44 C9 42 D1 84 D1 8A D1 08 CD 02 CD
-86 41 42 4F 52 54 22 00 87 12 7A C9 34 C4 0E CD
-96 CB 2A C4 0C CA 01 27 87 12 4C C6 BA C9 12 CA
-C0 C5 A6 CD 2A C4 3E CC 52 C6 81 5C 92 42 BE 21
-C2 21 30 4D 87 12 96 C9 4C C6 BA C9 BE CD 08 4E
-7A 4E 5A D3 5A 53 0A 58 19 42 C8 21 6E 4E 3E F0
-1E 00 09 5E 82 48 AE 21 82 49 B0 21 82 4A B2 21
-2A 52 82 4A C4 21 3E 4F 3D 41 30 41 87 12 60 C9
-0F 73 74 61 63 6B 20 6D 69 73 6D 61 74 63 68 21
-14 CD 82 9F B4 21 F2 23 18 42 AE 21 19 42 B0 21
-A8 49 FE FF 89 48 00 00 30 4D B4 C9 08 56 41 52
-49 41 42 4C 45 00 B0 12 B4 CD BA 40 86 12 FC FF
-EF 3F E6 CB 08 43 4F 4E 53 54 41 4E 54 00 B0 12
-B4 CD BA 40 85 12 FC FF 8A 4E FE FF 3E 4F E0 3F
-34 CE 06 43 52 45 41 54 45 00 B0 12 B4 CD BA 40
-85 12 FC FF 8A 4A FE FF D3 3F 54 CC 05 44 4F 45
-53 3E 1A 42 B2 21 BA 40 84 12 00 00 8A 4D 02 00
-3D 41 30 4D 6C CE 05 44 45 46 45 52 B0 12 B4 CD
-BA 40 30 40 FC FF BA 40 82 CE FE FF B9 3F 00 00
-81 5B 82 43 B6 21 30 4D AA CD 01 5D B2 43 B6 21
-30 4D 76 C9 87 52 45 43 55 52 53 45 19 42 C4 21
-99 42 B2 21 00 00 A2 53 C4 21 30 4D A0 CE 01 3A
-B0 12 B4 CD BA 40 87 12 FC FF A2 83 C4 21 B2 43
-B6 21 82 4F B4 21 30 4D CE CE 81 3B 82 93 B6 21
-5D 27 87 12 34 C4 2A C4 96 CB 02 CE A2 CE 2A C4
-E8 C8 09 49 4D 4D 45 44 49 41 54 45 1A 42 AE 21
-FA D0 80 00 00 00 30 4D BE 4F 02 00 3E 4F 30 4D
-02 CF 82 49 53 00 87 12 42 C6 F4 C4 C0 C5 3A CF
-46 CF 34 C4 18 CF 96 CB 2A C4 98 CD 18 CF 2A C4
-EA CE 83 5B 27 5D 87 12 98 CD 34 C4 34 C4 96 CB
-96 CB 2A C4 84 CC 88 50 4F 53 54 50 4F 4E 45 00
-87 12 4C C6 BA C9 12 CA 54 C4 C0 C5 A6 CD 7E C5
-C0 C5 80 CF 34 C4 34 C4 96 CB 96 CB 34 C4 96 CB
-96 CB 2A C4 86 CF 3A 4E 82 4A C6 21 2E 4E 82 4E
-C4 21 3D 40 10 00 09 4A 08 49 29 83 18 48 FE FF
-0E 98 FC 2B 89 48 00 00 1D 83 F6 23 2A 4A 0A 93
-F0 23 3E 4F 3D 41 30 4D 22 CF 82 49 46 00 2F 83
-8F 4E 00 00 1E 42 C4 21 BE 40 C0 C5 00 00 A2 52
-C4 21 2E 53 30 4D 86 CE 84 45 4C 53 45 00 1A 42
-C4 21 BA 40 BC C5 00 00 2A 52 82 4A C4 21 8E 4A
-00 00 2A 83 0E 4A 30 4D 3E C9 84 54 48 45 4E 00
-9E 42 C4 21 00 00 3E 4F 30 4D 52 CE 85 42 45 47
-49 4E 30 40 84 C7 FA CF 85 55 4E 54 49 4C 39 40
-C0 C5 1A 42 C4 21 A2 52 C4 21 8A 49 00 00 8A 4E
-02 00 3E 4F 30 4D 80 CD 85 41 47 41 49 4E 39 40
-BC C5 EF 3F 1C CE 85 57 48 49 4C 45 87 12 BE CF
-6E C4 2A C4 B4 CE 86 52 45 50 45 41 54 00 87 12
-3E D0 00 D0 2A C4 D8 CF 82 44 4F 00 2F 83 8F 4E
-00 00 1E 42 C4 21 BE 40 CA C5 00 00 2E 53 82 4E
-C4 21 A2 53 00 20 1A 42 00 20 8A 43 00 00 30 4D
-A8 CB 84 4C 4F 4F 50 00 39 40 EC C5 1A 42 C4 21
-A2 52 C4 21 8A 49 00 00 8A 4E 02 00 1E 42 00 20
-A2 83 00 20 2E 4E 0E 93 04 24 9E 42 C4 21 00 00
-F5 3F 3E 4F 30 4D E4 C7 85 2B 4C 4F 4F 50 39 40
-DA C5 E4 3F 92 D0 85 4C 45 41 56 45 1A 42 C4 21
-BA 40 FC C5 00 00 BA 40 BC C5 02 00 B2 50 06 00
-C4 21 A2 53 00 20 2A 52 19 42 00 20 89 4A 00 00
-30 4D D6 D0 04 4D 4F 56 45 00 0A 4E 38 4F 39 4F
-3E 4F 0A 93 11 24 08 99 0F 24 06 2C F8 49 00 00
-18 53 1A 83 FB 23 30 4D 08 5A 09 5A 19 83 18 83
-E8 49 00 00 1A 83 FA 23 30 4D 34 C4 CA 21 FC C4
-2A C4 84 12 3A D1 0A D4 E0 D3 68 D0 96 CD C8 D3
-C8 D0 04 D1 A2 C9 A8 D1 DC D1 18 D0 A2 D2 48 C5
-42 CF AA CE 7A CA 00 00 3A 40 0C 00 39 40 CA 21
-38 40 CC 21 D9 3F 3A 40 0E 00 39 40 CC 21 38 40
-CA 21 CC 3F 82 43 CC 21 30 4D 92 42 CA 21 C8 21
-30 4D 56 CF 09 50 57 52 5F 53 54 41 54 45 84 12
-84 CF C4 D3 0E DB 94 D1 08 50 57 52 5F 48 45 52
-45 00 92 42 C4 21 A4 D1 92 42 C6 21 A2 D1 EF 3F
-56 D0 09 52 53 54 5F 53 54 41 54 45 92 42 0C 18
-A4 D1 92 42 0E 18 A2 D1 E2 3F C2 D1 08 52 53 54
-5F 48 45 52 45 00 92 42 C4 21 0C 18 92 42 C6 21
-0E 18 DF 3F B2 40 48 D2 AA D2 B2 40 58 C8 4C C8
-B2 40 AC C8 C2 C8 B2 40 EE C8 02 C9 B2 40 DC C7
-EA C7 30 41 46 D0 04 57 49 50 45 00 39 40 80 FF
-B9 43 00 00 29 53 39 90 DA FF FA 23 B0 12 F4 D1
-B2 40 0E DB C4 21 B2 40 C4 D3 C6 21 D4 3F BA CF
-06 28 57 41 52 4D 29 00 1E 42 08 18 87 12 60 C9
-05 0D 1B 5B 37 6D 44 C9 70 C7 60 C9 27 20 46 61
-73 74 46 6F 72 74 68 20 56 31 36 30 20 2E 35 4D
-48 7A 20 28 43 29 20 4A 2E 4D 2E 54 68 6F 6F 72
-65 6E 73 20 44 C9 34 C4 30 FF 84 C7 2A C5 30 C7
-60 C9 0B 62 79 74 65 73 20 66 72 65 65 20 1A CD
-16 D2 04 57 41 52 4D 00 30 40 48 D2 0C D0 04 43
-4F 4C 44 00 B2 40 04 A5 20 01 B2 40 88 5A CC 01
-B2 43 02 02 B2 D3 06 02 F2 D0 06 00 24 02 F2 D3
-26 02 F2 40 FD 00 22 02 B2 40 00 A5 60 01 B2 40
-D6 00 80 01 92 43 82 01 B2 40 0F 10 84 01 29 43
-B2 D0 10 00 86 01 92 D2 5E 01 08 18 A2 93 08 18
-01 24 59 03 38 40 50 C3 18 83 FE 23 19 83 FA 23
-3A 40 BA D2 39 40 DA FF 89 4A 00 00 29 53 FC 23
-92 42 02 18 E4 FF B2 40 18 00 0A 18 31 40 E0 20
-3F 40 80 20 37 40 00 C4 36 40 B4 C4 35 40 08 C4
-34 40 14 C4 B2 40 0A 00 DA 21 B2 43 AC 21 92 C3
-30 01 18 42 08 18 F2 B0 10 00 00 02 04 20 38 E3
-18 53 82 48 08 18 B2 40 81 00 00 05 A2 42 06 05
-B2 40 00 49 08 05 F2 D0 30 00 0A 02 92 C3 00 05
-92 D3 1A 05 3D 40 9E D3 18 42 08 18 38 90 0A 00
-45 27 38 90 16 00 42 2F 28 93 18 23 00 27 A8 D2
-84 12 3A D1 EC D9 98 DA A0 D9 EC DA 66 D9 20 DA
-6A D6 00 00 5C D9 0C DA BE D9 FC D9 7A D7 00 00
-00 00 FE DA 66 D1 40 D2 85 48 49 32 4C 4F 87 12
-84 C7 D2 CF 96 CB A2 CE 68 D1 A0 D3 2A C4 AE D2
-04 43 4F 44 45 00 B0 12 B4 CD A2 82 C4 21 87 12
-E2 CE BC C5 D8 D3 00 00 07 45 4E 44 43 4F 44 45
-87 12 76 D1 02 CE 2A C4 38 D0 03 41 53 4D 92 42
-C8 21 B8 21 B2 40 A4 D3 C8 21 E5 3F F8 D3 06 45
-4E 44 41 53 4D 00 92 42 B8 21 C8 21 E9 3F 00 00
-05 43 4F 4C 4F 4E 1A 42 C4 21 BA 40 87 12 00 00
-A2 53 C4 21 B2 43 B6 21 30 40 76 D1 00 00 05 4C
-4F 32 48 49 1A 42 C4 21 BA 40 B0 12 00 00 BA 40
-2A C4 02 00 A2 52 C4 21 ED 3F 38 40 BE 21 39 48
-2A 48 09 5A 1A 52 C2 21 09 9A 03 24 7E 9A FC 27
-1A 83 0E 4A 2A 88 82 4A C2 21 30 4D B0 12 2A C4
-BA C9 12 CA 72 C5 C0 C5 A2 D4 CE CA C0 C5 A6 CD
-C4 D4 A4 D4 29 4E 39 90 86 12 02 20 2E 53 30 41
-39 90 85 12 03 20 1E 4E 02 00 30 41 39 90 84 12
-01 20 2E 52 30 41 19 42 C4 21 A2 53 C4 21 89 4E
-00 00 3E 40 29 00 12 12 C2 21 92 53 C2 21 B0 12
-2A C4 BA C9 CE CA C0 C5 F6 D4 EC D4 21 53 3E 90
-10 00 BB 2D 30 41 F8 D4 B2 41 C2 21 22 D3 30 41
-87 12 4C C6 6A D4 08 D5 82 43 BC 21 92 42 C4 21
-BA 21 A2 53 C4 21 0A 4E 3E 4F FA 90 23 00 00 00
-34 20 92 53 C2 21 B0 12 8C D4 0E 93 04 20 B2 40
-00 03 BC 21 27 3C 1E 93 04 20 B2 40 10 03 BC 21
-21 3C 2E 93 04 20 B2 40 20 03 BC 21 1B 3C 2E 92
-04 20 B2 40 20 02 BC 21 15 3C 3E 92 04 20 B2 40
-30 02 BC 21 0F 3C 3E 93 04 20 B2 40 30 03 BC 21
-09 3C B2 40 30 00 BC 21 19 42 C4 21 A2 53 C4 21
-89 4E 00 00 3E 4F 3D 41 30 4D FA 90 26 00 00 00
-08 20 B2 40 10 02 BC 21 92 53 C2 21 30 12 78 D5
-75 3F FA 90 40 00 00 00 1A 20 B2 40 20 00 BC 21
-92 53 C2 21 B0 12 D6 D4 0E 20 B2 50 10 00 BC 21
-3E 40 2B 00 B0 12 D6 D4 32 24 92 92 BE 21 C2 21
-02 24 92 53 C2 21 8E 10 82 5E BC 21 D3 3F B0 12
-D6 D4 F9 23 B2 50 10 00 BC 21 3E 40 28 00 B0 12
-8C D4 30 12 C8 D5 67 3F 87 12 4C C6 6A D4 00 D6
-FE 90 26 00 00 00 3E 40 20 00 04 20 B2 50 82 00
-BC 21 C2 3F B0 12 D6 D4 DF 23 B2 50 80 00 BC 21
-3E 40 28 00 B0 12 8C D4 B0 12 C6 D4 D5 23 3D 40
-A6 CD 30 4D 44 C8 04 52 45 54 49 00 87 12 34 C4
-00 13 96 CB 2A C4 34 C4 2C 00 00 D5 F8 D5 50 D6
-2E 4E 1E D2 BC 21 19 42 BA 21 92 3F 4E D4 03 4D
-4F 56 84 12 46 D6 00 40 5E D6 05 4D 4F 56 2E 42
-84 12 46 D6 40 40 00 00 03 41 44 44 84 12 46 D6
-00 50 78 D6 05 41 44 44 2E 42 84 12 46 D6 40 50
-84 D6 04 41 44 44 43 00 84 12 46 D6 00 60 92 D6
-06 41 44 44 43 2E 42 00 84 12 46 D6 40 60 36 D6
-04 53 55 42 43 00 84 12 46 D6 00 70 B0 D6 06 53
-55 42 43 2E 42 00 84 12 46 D6 40 70 BE D6 03 53
-55 42 84 12 46 D6 00 80 CE D6 05 53 55 42 2E 42
-84 12 46 D6 40 80 30 D4 03 43 4D 50 84 12 46 D6
-00 90 E8 D6 05 43 4D 50 2E 42 84 12 46 D6 40 90
-1E D4 04 44 41 44 44 00 84 12 46 D6 00 A0 02 D7
-06 44 41 44 44 2E 42 00 84 12 46 D6 40 A0 F4 D6
-03 42 49 54 84 12 46 D6 00 B0 20 D7 05 42 49 54
-2E 42 84 12 46 D6 40 B0 2C D7 03 42 49 43 84 12
-46 D6 00 C0 3A D7 05 42 49 43 2E 42 84 12 46 D6
-40 C0 46 D7 03 42 49 53 84 12 46 D6 00 D0 54 D7
-05 42 49 53 2E 42 84 12 46 D6 40 D0 00 00 03 58
-4F 52 84 12 46 D6 00 E0 6E D7 05 58 4F 52 2E 42
-84 12 46 D6 40 E0 A0 D6 03 41 4E 44 84 12 46 D6
-00 F0 88 D7 05 41 4E 44 2E 42 84 12 46 D6 40 F0
-4C C6 00 D5 A6 D7 1A 42 BC 21 B2 F0 70 00 BC 21
-8A 10 3A F0 0F 00 82 DA BC 21 4A 3F DA D6 03 52
-52 43 84 12 A0 D7 00 10 BE D7 05 52 52 43 2E 42
-84 12 A0 D7 40 10 CA D7 04 53 57 50 42 00 84 12
-A0 D7 80 10 D8 D7 03 52 52 41 84 12 A0 D7 00 11
-E6 D7 05 52 52 41 2E 42 84 12 A0 D7 40 11 F2 D7
-03 53 58 54 84 12 A0 D7 80 11 00 00 04 50 55 53
-48 00 84 12 A0 D7 00 12 0C D8 06 50 55 53 48 2E
-42 00 84 12 A0 D7 40 12 60 D7 04 43 41 4C 4C 00
-84 12 A0 D7 80 12 34 C4 2C 00 00 D5 F8 D5 40 D8
-59 42 BC 21 5A 42 BD 21 82 4A BC 21 BE 90 00 15
-00 00 02 20 0A 89 02 3C 09 8A 0A 49 3A 90 10 00
-03 2C 5A 0E A8 3F 1A 53 0E 4A 87 12 70 C7 60 C9
-0D 6F 75 74 20 6F 66 20 62 6F 75 6E 64 73 14 CD
-1A D8 05 50 55 53 48 4D 84 12 36 D8 00 15 82 D8
-04 50 4F 50 4D 00 84 12 36 D8 00 17 4C C6 6A D4
-A2 D8 82 43 BC 21 92 42 C4 21 BA 21 A2 53 C4 21
-92 53 C2 21 3E 40 2C 00 B0 12 2A C4 BA C9 CE CA
-C0 C5 A6 CD F8 D5 C8 D8 0A 4E 3E 4F 1A 83 2A 92
-CA 2F 8A 10 5A 06 6F 3F 00 D8 04 52 52 43 4D 00
-84 12 9C D8 50 00 DA D8 04 52 52 41 4D 00 84 12
-9C D8 50 01 E8 D8 04 52 4C 41 4D 00 84 12 9C D8
-50 02 F6 D8 04 52 52 55 4D 00 84 12 9C D8 50 03
-85 12 00 3C 04 D9 03 53 3E 3D 85 12 00 38 16 D9
-02 53 3C 00 85 12 00 34 90 D8 03 30 3E 3D 85 12
-00 30 2A D9 02 30 3C 00 85 12 00 30 00 00 02 55
-3C 00 85 12 00 2C 3E D9 03 55 3E 3D 85 12 00 28
-34 D9 03 30 3C 3E 85 12 00 24 52 D9 02 30 3D 00
-85 12 00 20 50 C8 02 49 46 00 1A 42 C4 21 8A 4E
-00 00 A2 53 C4 21 0E 4A 30 4D 48 D9 04 54 48 45
-4E 00 1A 42 C4 21 08 4E 3E 4F 09 48 29 53 0A 89
-0A 11 3A 90 00 02 68 2F 88 DA 00 00 30 4D 10 D7
-04 45 4C 53 45 00 1A 42 C4 21 BA 40 00 3C 00 00
-A2 53 C4 21 2F 83 8F 4A 00 00 E3 3F 7C D9 05 55
-4E 54 49 4C 3A 4F 08 4E 3E 4F 19 42 C4 21 2A 83
-0A 89 0A 11 3A 90 00 FE 47 3B 3A F0 FF 03 08 DA
-89 48 00 00 A2 53 C4 21 30 4D 94 D7 05 41 47 41
-49 4E 87 12 10 D9 C4 D9 2A C4 00 00 05 57 48 49
-4C 45 87 12 6A D9 6E C4 2A C4 20 D9 06 52 45 50
-45 41 54 00 87 12 10 D9 C4 D9 82 D9 2A C4 00 00
-03 4A 4D 50 87 12 98 CD 10 D9 C4 D9 2A C4 3E B0
-00 10 03 20 3E E0 00 04 30 4D 3E 90 00 34 06 28
-03 24 3E 40 00 34 30 4D 3E 40 00 38 30 4D 00 00
-04 3F 4A 4D 50 00 87 12 2E DA 98 CD 6E C4 C4 D9
-2A C4 64 DA 3D 41 08 4E 3E 4F 2A 48 0A 93 04 20
-98 42 C4 21 00 00 30 4D 88 43 00 00 A4 3F 2A D8
-03 42 57 31 84 12 62 DA 00 00 80 DA 03 42 57 32
-84 12 62 DA 00 00 8C DA 03 42 57 33 84 12 62 DA
-00 00 A4 DA 3D 41 1A 42 C4 21 28 4E 08 93 08 20
-BA 4F 00 00 A2 53 C4 21 8E 4A 00 00 3E 4F 30 4D
-8E 43 00 00 61 3F 00 00 03 46 57 31 84 12 A2 DA
-00 00 C8 DA 03 46 57 32 84 12 A2 DA 00 00 D4 DA
-03 46 57 33 84 12 A2 DA 00 00 E0 DA 04 47 4F 54
-4F 00 87 12 10 D9 98 CD 8C CB 2A C4 50 DA 05 3F
-47 4F 54 4F 87 12 2E DA 98 CD 8C CB 2A C4
-@FFDA
-BA D2 BA D2 BA D2 BA D2 BA D2 5E C8 BA D2 BA D2
-BA D2 BA D2 BA D2 BA D2 BA D2 BA D2 BA D2 BA D2
-BA D2 BA D2 BA D2
-q
@1800
-10 00 6A C8 80 3E 00 24 FD FF 18 00 30 DB E6 D3
-2A C8 3C C8 00 00 00 00
+10 00 92 C8 80 3E 00 24 05 00 18 00 9E DC 56 D5
+52 C8 64 C8 00 00 00 00
@21AA
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 C4
03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
44 55 50 00 0E 93 F6 23 30 4D 40 C4 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 C4 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E C4 02 3E 52 00 0E 12 3E 4F 30 4D 8E C4
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 C4
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C C4 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 20 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 C4 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 C5
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 C4 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA C4 03 41 4E 44 3E FF 30 4D 7A C4 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E C5 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 C5 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E C5 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 C5 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 C4 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
+50 00 3E 4F 30 4D 00 00 03 4E 49 50 2F 53 30 4D
+00 00 04 53 57 41 50 00 2A 4F 8F 4E 00 00 0E 4A
+30 4D 68 C4 04 4F 56 45 52 00 8F 4E FE FF 2E 4F
+2F 83 30 4D 72 C4 03 52 4F 54 2A 4F 8F 4E 00 00
+1E 4F 02 00 8F 4A 02 00 30 4D 4E C4 02 3E 52 00
+0E 12 3E 4F 30 4D 96 C4 02 52 3E 00 2F 83 8F 4E
+00 00 3E 41 30 4D B8 C4 02 52 40 00 2F 83 8F 4E
+00 00 2E 41 30 4D 5C C4 05 44 45 50 54 48 8F 4E
+FE FF 3E 40 80 20 0E 8F 2F 83 0E 11 30 4D 00 00
+01 40 2E 4E 30 4D F0 C4 01 21 BE 4F 00 00 3E 4F
+30 4D 00 00 02 43 40 00 6E 4E 30 4D 04 C5 02 43
+21 00 FE 4F 00 00 1F 53 3E 4F 30 4D 00 00 01 2B
+3E 5F 30 4D 30 C4 01 2D 3E 8F 3E E3 1E 53 30 4D
+F8 C4 03 41 4E 44 3E FF 30 4D 84 C4 02 4F 52 00
+3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D 3C C5
+06 4E 45 47 41 54 45 00 E8 3F 32 C5 03 41 42 53
+0E 93 E3 33 30 4D D8 C4 04 44 41 42 53 00 3E F3
+06 34 BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D
+00 00 02 30 3D 00 1E 83 0E 7E 30 4D 82 C5 02 30
+3C 00 0E 5E 0E 7E 3E E3 30 4D 8E C5 02 30 3E 00
+1E 93 05 34 0B 3C 00 00 01 3D 3E 8F 07 20 3E 43
+30 4D A8 C5 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
+AC C4 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE C5 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 C5 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 C5 03 3E 49 4E 85 12 C2 21 10 C5
-04 42 41 53 45 00 85 12 DA 21 C0 C4 05 53 54 41
-54 45 85 12 B6 21 30 C6 02 42 4C 00 85 12 20 00
-94 C5 02 3C 23 00 B2 40 AA 21 AA 21 30 4D 1E 15
-0E 43 3D 40 20 00 0A 93 04 20 0D 11 0A 4C 0C 43
-09 43 0E 9B 01 28 0E 8B 09 69 08 68 1D 83 07 30
-0C 5C 0A 6A 0E 6E F5 2B 0E 8B 12 D3 F5 3F 0A 4E
-1D 17 30 41 48 C6 01 23 1B 42 DA 21 2C 4F 0A 4E
-B0 12 5E C6 8F 49 00 00 0E 48 7A 90 0A 00 02 28
-3A 50 07 00 3A 50 30 00 92 83 AA 21 18 42 AA 21
-C8 4A 00 00 30 4D 96 C6 02 23 53 00 87 12 98 C6
-D2 C6 2D 83 09 93 E0 23 0E 93 DE 23 3D 41 30 4D
-C8 C6 02 23 3E 00 9F 42 AA 21 00 00 3E 40 AA 21
-2E 8F 30 4D 00 C6 04 48 4F 4C 44 00 0A 4E 3E 4F
-DB 3F 3C C6 04 53 49 47 4E 00 0E 93 3E 4F 3A 40
-2D 00 D2 33 30 4D F4 C5 03 55 44 2E 87 12 56 C6
-CC C6 E6 C6 50 C9 18 C9 2A C4 18 C7 02 55 2E 00
-2F 83 8F 4E 00 00 0E 43 F1 3F 3E B0 00 80 06 24
-BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D DA C4
-02 44 2E 00 87 12 56 C6 6E C4 80 C4 3A C7 CC C6
-92 C4 0A C7 E6 C6 50 C9 18 C9 2A C4 52 C5 01 2E
-3E B0 00 80 DD 27 2F 83 3E 43 EC 3F F6 C6 04 48
-45 52 45 00 2F 83 8F 4E 00 00 1E 42 C4 21 30 4D
-62 C5 05 41 4C 4C 4F 54 82 5E C4 21 3E 4F 30 4D
-E2 C6 02 43 2C 00 1A 42 C4 21 CA 4E 00 00 92 53
-C4 21 3E 4F 30 4D 2F 83 8F 4E 00 00 B0 12 2A C8
-92 B3 1C 05 FD 27 1E 42 0C 05 B0 12 3C C8 30 4D
-30 40 B6 C7 7E C7 05 28 4B 45 59 29 18 42 0C 05
-EA 3F 12 C6 03 4B 45 59 30 40 DC C7 92 C7 06 41
-43 43 45 50 54 00 3C 40 A8 C8 3B 40 72 C8 2D 15
-0A 4E 2E 4F 0A 5E 3B 40 0D 00 3C 40 20 00 3D 40
-9C C8 92 B3 1C 05 05 24 18 42 0C 05 38 90 0A 00
-04 20 21 53 39 40 56 C8 4D 15 B2 40 11 00 0E 05
-A2 B3 1C 05 FD 27 E2 C2 22 02 30 41 B2 40 13 00
-0E 05 A2 B3 1C 05 FD 27 E2 D2 22 02 30 41 00 00
-05 53 4C 45 45 50 30 40 64 C8 00 00 07 28 53 4C
-45 45 50 29 12 D2 0A 18 F6 3F 21 52 3A 17 58 42
-0C 05 48 9B E3 27 48 9C 06 2C 78 92 11 20 2E 9F
-0F 24 1E 83 05 3C 0E 9A 03 24 CE 48 00 00 1E 53
-82 48 0E 05 A2 B3 1C 05 FD 27 30 4D 9E C8 2D 83
-92 B3 1C 05 FD 27 E3 23 B2 40 18 00 0A 18 3E 8F
-3D 41 30 4D D6 C7 06 28 45 4D 49 54 29 00 08 4E
-3E 4F E6 3F 50 C7 04 45 4D 49 54 00 30 40 BE C8
-C6 C8 04 45 43 48 4F 00 B2 40 82 48 90 C8 30 4D
-6E C7 06 4E 4F 45 43 48 4F 00 B2 40 30 4D 90 C8
-30 4D B6 C8 04 28 43 52 29 00 2F 83 8F 4E 00 00
-3E 40 0D 00 E3 3F A2 C7 02 43 52 00 30 40 FA C8
-04 C7 05 53 50 41 43 45 2F 83 8F 4E 00 00 3E 40
-20 00 D4 3F 12 C9 06 53 50 41 43 45 53 00 0E 93
-09 24 0D 12 3D 40 3A C9 EF 3F 3C C9 2D 83 1E 83
-EB 23 3D 41 3E 4F 30 4D 2C C7 04 54 59 50 45 00
-0E 93 95 24 2A 4F 8F 5E 00 00 0E 4A 87 12 CA C5
-02 C6 0A C5 CC C8 EC C5 60 C9 2A C4 2F 82 8F 4E
-02 00 7E 4D 8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D
-26 C9 82 53 22 00 87 12 34 C4 6C C9 A2 CB 34 C4
-22 00 C6 C9 96 C9 3D 41 6E 4E 1E 83 82 5E C4 21
-3E 4F 92 B3 C4 21 A2 63 C4 21 30 4D E2 C8 82 2E
-22 00 87 12 86 C9 34 C4 50 C9 A2 CB 2A C4 00 00
-04 57 4F 52 44 00 3C 40 BE 21 39 4C 3A 4C 09 5A
-3A 5C 28 4C 09 9A 19 24 7E 9A FC 27 1A 83 3B 40
-60 00 C8 4C 00 00 09 9A 0C 24 7C 4A 4E 9C 09 24
-18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F 7C 80 20 00
-F0 3F 1A 82 C0 21 82 4A C2 21 1E 42 C4 21 08 8E
-CE 48 00 00 30 4D 00 00 04 46 49 4E 44 00 2F 83
-0C 4E 65 4C 74 40 80 00 3B 40 CA 21 3E 4B 0E 93
-1E 24 58 4C 01 00 78 F0 1E 00 0E 58 2E 53 1E 4E
-FE FF 0E 93 F3 27 09 4E 78 49 48 C4 48 95 F7 23
-0A 4C 1A 53 FA 99 00 00 F2 23 58 83 FA 23 19 B3
-09 63 0C 49 6A 4E 1E 43 4A 93 01 30 2E 83 8F 4C
-00 00 35 40 08 C4 34 40 14 C4 30 4D 2F 53 2F 53
-3E 4F 30 4D 26 C6 07 3E 4E 55 4D 42 45 52 3C 4F
-38 4F 29 4F 2F 82 1B 42 DA 21 6A 4C 7A 80 30 00
-7A 90 0A 00 02 28 7A 80 07 00 0A 9B 13 2C 82 49
-D0 04 82 48 D2 04 82 4B C8 04 19 42 E4 04 18 42
-E6 04 09 5A 08 63 1C 53 1E 83 E7 23 8F 49 04 00
-8F 48 02 00 8F 4C 00 00 30 4D 03 12 0D 12 1B 42
-DA 21 0B 12 32 C0 00 02 6D 4E 0D 5E 0C 4E 7A 40
-2E 00 0D 9C 0A 28 7A 9C FC 23 32 D0 00 02 FC 4C
-FE FF 0D 9C FC 2F DE 83 00 00 09 43 08 43 3D 40
-50 CB 3F 82 8F 4E 06 00 0C 4E 7E 4C 6A 4C 7A 90
-2D 00 10 2C 3B 40 10 00 7A 80 24 00 06 24 2B 43
-5A 83 03 24 3B 52 6A 53 B0 23 1C 53 1E 83 6A 4C
-7A 90 2D 00 AA 23 1C 53 1E 83 B1 43 04 00 A5 3F
-52 CB 2F 53 0E 93 2C 17 82 4C DA 21 03 24 2F 52
-0E F3 30 4D 9F 4F 02 00 04 00 BF 4F 00 00 3E E3
-09 20 3E E3 BF E3 02 00 BF E3 00 00 9F 53 02 00
-8F 63 00 00 32 B0 00 02 01 20 2F 53 30 4D D2 C8
-07 45 58 45 43 55 54 45 0A 4E 3E 4F 00 4A 28 C5
-01 2C 1A 42 C4 21 A2 53 C4 21 8A 4E 00 00 3E 4F
-30 4D A0 CB 87 4C 49 54 45 52 41 4C 82 93 B6 21
-16 24 32 B0 00 02 09 24 1A 42 C4 21 A2 52 C4 21
-BA 40 34 C4 00 00 BA 4F 02 00 1A 42 C4 21 A2 52
-C4 21 BA 40 34 C4 00 00 8A 4E 02 00 3E 4F 30 4D
-08 C9 05 43 4F 55 4E 54 2F 83 1E 53 8F 4E 00 00
-5E 4E FF FF 30 4D 82 4E BE 21 B2 4F C0 21 3E 4F
-82 43 C2 21 87 12 4C C6 C6 C9 1C CC 3D 40 28 CC
-FE 22 3D 41 3E 4F 30 4D 2A CC 0A 4E 3E 4F 3D 40
-40 CC 53 27 3D 40 16 CC 1A E2 B6 21 B2 27 AC 23
-42 CC 3E 4F 3D 40 16 CC B9 23 DE 53 00 00 68 4E
-08 5E F8 40 3F 00 00 00 3D 40 0C CE CD 3F 90 CB
-08 45 56 41 4C 55 41 54 45 00 39 40 BE 21 39 12
-39 12 39 12 0D 12 B0 12 2A C4 06 CC 7E CC 3D 41
-B2 41 C2 21 B2 41 C0 21 B2 41 BE 21 30 4D 7A C5
-04 51 55 49 54 00 31 40 E0 20 B2 40 00 20 00 20
-82 43 B6 21 82 43 08 18 B0 12 2A C4 6C C9 04 0D
-6F 6B 20 00 50 C9 34 C4 38 21 44 C4 34 C4 50 00
-F6 C7 18 C9 06 CC 34 C4 7E 20 CE C4 B2 C5 6C C9
-0D 73 74 61 63 6B 20 65 6D 70 74 79 20 21 1A CD
-34 C4 30 FF 84 C7 B2 C5 6C C9 0B 46 52 41 4D 20
-66 75 6C 6C 20 21 1A CD 42 C6 F4 C4 C0 C5 AC CC
-6C C9 04 0D 20 20 20 00 BC C5 B4 CC EE C7 05 41
-42 4F 52 54 3F 40 80 20 BE 3F 8F 93 02 00 AE 26
-B2 40 82 48 90 C8 B0 12 0C D2 82 43 AA DA 82 43
-B6 DA 82 43 C2 DA 82 43 F2 DA 82 43 FE DA 82 43
-0A DB A2 B3 1C 05 FD 27 B2 40 11 00 0E 05 E2 C2
-22 02 92 C3 1C 05 38 40 A0 AA 39 42 19 83 FE 23
-18 83 FB 23 92 B3 1C 05 F4 23 87 12 6C C9 04 1B
-5B 37 6D 00 50 C9 50 C9 6C C9 04 1B 5B 30 6D 00
-50 C9 4E D1 90 D1 96 D1 14 CD 0E CD 86 41 42 4F
-52 54 22 00 87 12 86 C9 34 C4 1A CD A2 CB 2A C4
-18 CA 01 27 87 12 4C C6 C6 C9 1E CA C0 C5 B2 CD
-2A C4 4A CC 52 C6 81 5C 92 42 BE 21 C2 21 30 4D
-87 12 A2 C9 4C C6 C6 C9 CA CD 08 4E 7A 4E 5A D3
-5A 53 0A 58 19 42 C8 21 6E 4E 3E F0 1E 00 09 5E
-82 48 AE 21 82 49 B0 21 82 4A B2 21 2A 52 82 4A
-C4 21 3E 4F 3D 41 30 41 87 12 6C C9 0F 73 74 61
-63 6B 20 6D 69 73 6D 61 74 63 68 21 20 CD 82 9F
-B4 21 F2 23 18 42 AE 21 19 42 B0 21 A8 49 FE FF
-89 48 00 00 30 4D C0 C9 08 56 41 52 49 41 42 4C
-45 00 B0 12 C0 CD BA 40 86 12 FC FF EF 3F F2 CB
-08 43 4F 4E 53 54 41 4E 54 00 B0 12 C0 CD BA 40
-85 12 FC FF 8A 4E FE FF 3E 4F E0 3F 40 CE 06 43
-52 45 41 54 45 00 B0 12 C0 CD BA 40 85 12 FC FF
-8A 4A FE FF D3 3F 60 CC 05 44 4F 45 53 3E 1A 42
-B2 21 BA 40 84 12 00 00 8A 4D 02 00 3D 41 30 4D
-78 CE 05 44 45 46 45 52 B0 12 C0 CD BA 40 30 40
-FC FF BA 40 8E CE FE FF B9 3F 00 00 81 5B 82 43
-B6 21 30 4D B6 CD 01 5D B2 43 B6 21 30 4D 82 C9
-87 52 45 43 55 52 53 45 19 42 C4 21 99 42 B2 21
-00 00 A2 53 C4 21 30 4D AC CE 01 3A B0 12 C0 CD
-BA 40 87 12 FC FF A2 83 C4 21 B2 43 B6 21 82 4F
-B4 21 30 4D DA CE 81 3B 82 93 B6 21 5D 27 87 12
-34 C4 2A C4 A2 CB 0E CE AE CE 2A C4 F4 C8 09 49
+0E 93 3E 4F FB 27 2D 53 30 4D 1E 83 0E 7E F9 3F
+39 40 00 80 39 8F 08 4E 3E 4F 08 59 19 15 30 4D
+81 5E 00 00 3E 4F 32 B0 00 01 E8 27 2D 53 21 52
+30 4D 91 53 00 00 F7 3F CE C5 06 55 4E 4C 4F 4F
+50 00 F5 3F 00 00 01 49 2F 83 8F 4E 00 00 2E 41
+1E 81 02 00 30 4D 1E C5 01 4A 2F 83 8F 4E 00 00
+1E 41 04 00 1E 81 06 00 30 4D 9C C5 03 50 41 44
+85 12 E2 20 1A C6 03 54 49 42 85 12 38 21 0E C5
+03 43 50 4C 85 12 50 00 C2 C5 03 3E 49 4E 85 12
+C2 21 60 C6 04 42 41 53 45 00 85 12 DA 21 C8 C4
+05 53 54 41 54 45 85 12 B6 21 74 C6 02 42 4C 00
+85 12 20 00 B4 C5 02 3C 23 00 B2 40 AA 21 AA 21
+30 4D 8C C6 01 23 2C 4F 5B 42 DA 21 0A 43 34 40
+20 00 0E 93 04 20 04 11 0E 4C 0C 43 09 43 0A 9B
+01 28 0A 8B 09 69 08 68 14 83 07 30 0C 5C 0E 6E
+0A 6A F5 2B 0A 8B 12 D3 F5 3F 34 40 14 C4 8F 49
+00 00 0E 48 7A 90 0A 00 02 28 3A 50 07 00 3A 50
+30 00 92 83 AA 21 18 42 AA 21 C8 4A 00 00 30 4D
+A4 C6 02 23 53 00 87 12 A6 C6 0C C7 2D 83 09 93
+CA 23 0E 93 C8 23 3D 41 30 4D 02 C7 02 23 3E 00
+9F 42 AA 21 00 00 3E 40 AA 21 2E 8F 30 4D 26 C6
+04 48 4F 4C 44 00 0A 4E 3E 4F DB 3F 80 C6 04 53
+49 47 4E 00 0E 93 3E 4F 3A 40 2D 00 D2 33 30 4D
+56 C6 02 55 2E 00 87 12 9A C6 34 C4 00 00 06 C7
+20 C7 78 C9 40 C9 2A C4 68 C5 02 44 2E 00 87 12
+9A C6 78 C4 8A C4 6E C5 06 C7 9A C4 44 C7 20 C7
+78 C9 40 C9 2A C4 50 C5 01 2E 0E 93 E4 37 2F 83
+8F 4E 00 00 3E 43 EB 3F 30 C7 04 48 45 52 45 00
+2F 83 8F 4E 00 00 1E 42 C4 21 30 4D 5C C5 05 41
+4C 4C 4F 54 82 5E C4 21 3E 4F 30 4D 1C C7 02 43
+2C 00 1A 42 C4 21 CA 4E 00 00 92 53 C4 21 3E 4F
+30 4D 2F 83 8F 4E 00 00 B0 12 52 C8 92 B3 1C 05
+FD 27 1E 42 0C 05 B0 12 64 C8 30 4D 9A C7 05 28
+4B 45 59 29 18 42 0C 05 EC 3F 38 C6 03 4B 45 59
+30 40 F4 C7 AE C7 06 41 43 43 45 50 54 00 30 40
+1E C8 EE C7 08 28 41 43 43 45 50 54 29 00 3C 40
+D0 C8 3B 40 9A C8 2D 15 0A 4E 2E 4F 0A 5E 3B 40
+0D 00 3C 40 20 00 3D 40 C4 C8 92 B3 1C 05 05 24
+18 42 0C 05 38 90 0A 00 04 20 21 53 39 40 7E C8
+4D 15 B2 40 11 00 0E 05 E2 C2 22 02 A2 B3 1C 05
+FD 27 30 41 B2 40 13 00 0E 05 E2 D2 22 02 A2 B3
+1C 05 FD 27 30 41 00 00 05 53 4C 45 45 50 30 40
+8C C8 00 00 07 28 53 4C 45 45 50 29 12 D2 0A 18
+F6 3F 21 52 3A 17 58 42 0C 05 48 9B E3 27 48 9C
+06 2C 78 92 11 20 2E 9F 0F 24 1E 83 05 3C 0E 9A
+03 24 CE 48 00 00 1E 53 82 48 0E 05 A2 B3 1C 05
+FD 27 30 4D C6 C8 2D 83 92 B3 1C 05 FD 27 E3 23
+B2 40 18 00 0A 18 3E 8F 3D 41 30 4D 14 C8 06 28
+45 4D 49 54 29 00 08 4E 3E 4F E6 3F 6A C7 04 45
+4D 49 54 00 30 40 E6 C8 EE C8 04 45 43 48 4F 00
+B2 40 82 48 B8 C8 30 4D 88 C7 06 4E 4F 45 43 48
+4F 00 B2 40 30 4D B8 C8 30 4D DE C8 04 28 43 52
+29 00 2F 83 8F 4E 00 00 3E 40 0D 00 E3 3F BE C7
+02 43 52 00 30 40 22 C9 3E C7 05 53 50 41 43 45
+2F 83 8F 4E 00 00 3E 40 20 00 D4 3F 3A C9 06 53
+50 41 43 45 53 00 0E 93 09 24 0D 12 3D 40 62 C9
+EF 3F 64 C9 2D 83 1E 83 EB 23 3D 41 3E 4F 30 4D
+52 C7 04 54 59 50 45 00 0E 93 95 24 2A 4F 8F 5E
+00 00 0E 4A 87 12 F0 C5 28 C6 08 C5 F4 C8 12 C6
+88 C9 2A C4 2F 82 8F 4E 02 00 7E 4D 8F 4D 00 00
+0D 5E 1D B3 0D 63 30 4D 4E C9 82 53 22 00 87 12
+34 C4 94 C9 CA CB 34 C4 22 00 EE C9 BE C9 3D 41
+6E 4E 1E 83 82 5E C4 21 3E 4F 92 B3 C4 21 A2 63
+C4 21 30 4D 0A C9 82 2E 22 00 87 12 AE C9 34 C4
+78 C9 CA CB 2A C4 00 00 04 57 4F 52 44 00 3C 40
+BE 21 39 4C 3A 4C 09 5A 3A 5C 28 4C 09 9A 19 24
+7E 9A FC 27 1A 83 3B 40 60 00 C8 4C 00 00 09 9A
+0C 24 7C 4A 4E 9C 09 24 18 53 4B 9C F6 2F 7C 90
+7B 00 F3 2F 7C 80 20 00 F0 3F 1A 82 C0 21 82 4A
+C2 21 1E 42 C4 21 08 8E CE 48 00 00 30 4D 00 00
+04 46 49 4E 44 00 2F 83 0C 4E 65 4C 74 40 80 00
+3B 40 CA 21 3E 4B 0E 93 1E 24 58 4C 01 00 78 F0
+1E 00 0E 58 2E 53 1E 4E FE FF 0E 93 F3 27 09 4E
+78 49 48 C4 48 95 F7 23 0A 4C 1A 53 FA 99 00 00
+F2 23 58 83 FA 23 19 B3 09 63 0C 49 6A 4E 1E 43
+4A 93 01 30 2E 83 8F 4C 00 00 35 40 08 C4 34 40
+14 C4 30 4D 2F 53 2F 53 3E 4F 30 4D 6A C6 07 3E
+4E 55 4D 42 45 52 3C 4F 38 4F 29 4F 2F 82 1B 42
+DA 21 6A 4C 7A 80 30 00 7A 90 0A 00 02 28 7A 80
+07 00 0A 9B 13 2C 82 49 D0 04 82 48 D2 04 82 4B
+C8 04 19 42 E4 04 18 42 E6 04 09 5A 08 63 1C 53
+1E 83 E7 23 8F 49 04 00 8F 48 02 00 8F 4C 00 00
+30 4D 03 12 0D 12 1B 42 DA 21 0B 12 32 C0 00 02
+6D 4E 0D 5E 0C 4E 7A 40 2E 00 0D 9C 0A 28 7A 9C
+FC 23 32 D0 00 02 FC 4C FE FF 0D 9C FC 2F DE 83
+00 00 09 43 08 43 3D 40 78 CB 3F 82 8F 4E 06 00
+0C 4E 7E 4C 6A 4C 7A 90 2D 00 10 2C 3B 40 10 00
+7A 80 24 00 06 24 2B 43 5A 83 03 24 3B 52 6A 53
+B0 23 1C 53 1E 83 6A 4C 7A 90 2D 00 AA 23 1C 53
+1E 83 B1 43 04 00 A5 3F 7A CB 2F 53 0E 93 2C 17
+82 4C DA 21 03 24 2F 52 0E F3 30 4D 9F 4F 02 00
+04 00 BF 4F 00 00 3E E3 09 20 3E E3 BF E3 02 00
+BF E3 00 00 9F 53 02 00 8F 63 00 00 32 B0 00 02
+01 20 2F 53 30 4D FA C8 07 45 58 45 43 55 54 45
+0A 4E 3E 4F 00 4A 26 C5 01 2C 1A 42 C4 21 A2 53
+C4 21 8A 4E 00 00 3E 4F 30 4D C8 CB 87 4C 49 54
+45 52 41 4C 82 93 B6 21 0F 24 1A 42 C4 21 A2 52
+C4 21 BA 40 34 C4 00 00 8A 4E 02 00 3E 4F 32 B0
+00 02 32 C0 00 02 F1 23 30 4D 30 C9 05 43 4F 55
+4E 54 2F 83 1E 53 8F 4E 00 00 5E 4E FF FF 30 4D
+82 4E BE 21 B2 4F C0 21 3E 4F 82 43 C2 21 87 12
+90 C6 EE C9 36 CC 3D 40 42 CC 05 23 3D 41 3E 4F
+30 4D 44 CC 0A 4E 3E 4F 3D 40 5A CC 5A 27 3D 40
+30 CC 1A E2 B6 21 B9 27 B3 23 5C CC 3E 4F 3D 40
+30 CC C0 23 DE 53 00 00 68 4E 08 5E F8 40 3F 00
+00 00 3D 40 88 CE CD 3F B8 CB 08 45 56 41 4C 55
+41 54 45 00 39 40 BE 21 3C 49 3B 49 3A 49 3D 15
+B0 12 2A C4 20 CC 98 CC B2 41 C2 21 B2 41 C0 21
+B2 41 BE 21 3D 41 30 4D 4C C6 04 51 55 49 54 00
+31 40 E0 20 B2 40 00 20 00 20 82 43 B6 21 82 43
+08 18 B0 12 2A C4 94 C9 03 0D 6F 6B 78 C9 40 C9
+5A C6 44 C4 64 C6 0E C8 40 C9 20 CC DE C4 92 C5
+94 C9 0D 73 74 61 63 6B 20 65 6D 70 74 79 21 20
+2A CD 34 C4 30 FF A0 C7 D2 C5 94 C9 0B 46 52 41
+4D 20 66 75 6C 6C 21 20 2A CD 86 C6 F2 C4 E0 C5
+C6 CC 94 C9 03 0D 20 20 DC C5 CC CC 06 C8 05 41
+42 4F 52 54 3F 40 80 20 C3 3F 8F 93 02 00 BA 26
+B2 40 82 48 B8 C8 B0 12 3C D2 A2 B3 1C 05 FD 27
+B2 40 11 00 0E 05 E2 C2 22 02 92 C3 1C 05 38 40
+A0 AA 39 42 03 43 19 83 FD 23 18 83 FA 23 92 B3
+1C 05 F3 23 87 12 94 C9 04 1B 5B 37 6D 00 78 C9
+78 C9 94 C9 04 1B 5B 30 6D 00 78 C9 4A D1 8C D1
+92 D1 DA D1 24 CD 1E CD 86 41 42 4F 52 54 22 00
+87 12 AE C9 34 C4 2A CD CA CB 2A C4 40 CA 01 27
+87 12 90 C6 EE C9 46 CA E0 C5 AE CD 2A C4 64 CC
+96 C6 81 5C 92 42 BE 21 C2 21 30 4D 00 00 81 5B
+82 43 B6 21 30 4D B2 CD 01 5D B2 43 B6 21 30 4D
+BE CD 83 5B 27 5D 87 12 A0 CD 34 C4 34 C4 CA CB
+CA CB 2A C4 BE 4F 02 00 3E 4F 30 4D 1C C9 82 49
+53 00 87 12 86 C6 F2 C4 E0 C5 06 CE D6 CD 34 C4
+E4 CD CA CB 2A C4 A0 CD E4 CD 2A C4 EE CD 09 49
4D 4D 45 44 49 41 54 45 1A 42 AE 21 FA D0 80 00
-00 00 30 4D BE 4F 02 00 3E 4F 30 4D 0E CF 82 49
-53 00 87 12 42 C6 F4 C4 C0 C5 46 CF 52 CF 34 C4
-24 CF A2 CB 2A C4 A4 CD 24 CF 2A C4 F6 CE 83 5B
-27 5D 87 12 A4 CD 34 C4 34 C4 A2 CB A2 CB 2A C4
-90 CC 88 50 4F 53 54 50 4F 4E 45 00 87 12 4C C6
-C6 C9 1E CA 54 C4 C0 C5 B2 CD 7E C5 C0 C5 8C CF
-34 C4 34 C4 A2 CB A2 CB 34 C4 A2 CB A2 CB 2A C4
-92 CF 3A 4E 82 4A C6 21 2E 4E 82 4E C4 21 3D 40
-10 00 09 4A 08 49 29 83 18 48 FE FF 0E 98 FC 2B
-89 48 00 00 1D 83 F6 23 2A 4A 0A 93 F0 23 3E 4F
-3D 41 30 4D 2E CF 82 49 46 00 2F 83 8F 4E 00 00
-1E 42 C4 21 BE 40 C0 C5 00 00 A2 52 C4 21 2E 53
-30 4D 92 CE 84 45 4C 53 45 00 1A 42 C4 21 BA 40
-BC C5 00 00 2A 52 82 4A C4 21 8E 4A 00 00 2A 83
-0E 4A 30 4D 4A C9 84 54 48 45 4E 00 9E 42 C4 21
-00 00 3E 4F 30 4D 5E CE 85 42 45 47 49 4E 30 40
-84 C7 06 D0 85 55 4E 54 49 4C 39 40 C0 C5 1A 42
-C4 21 A2 52 C4 21 8A 49 00 00 8A 4E 02 00 3E 4F
-30 4D 8C CD 85 41 47 41 49 4E 39 40 BC C5 EF 3F
-28 CE 85 57 48 49 4C 45 87 12 CA CF 6E C4 2A C4
-C0 CE 86 52 45 50 45 41 54 00 87 12 4A D0 0C D0
-2A C4 E4 CF 82 44 4F 00 2F 83 8F 4E 00 00 1E 42
-C4 21 BE 40 CA C5 00 00 2E 53 82 4E C4 21 A2 53
-00 20 1A 42 00 20 8A 43 00 00 30 4D B4 CB 84 4C
-4F 4F 50 00 39 40 EC C5 1A 42 C4 21 A2 52 C4 21
-8A 49 00 00 8A 4E 02 00 1E 42 00 20 A2 83 00 20
-2E 4E 0E 93 04 24 9E 42 C4 21 00 00 F5 3F 3E 4F
-30 4D E4 C7 85 2B 4C 4F 4F 50 39 40 DA C5 E4 3F
-9E D0 85 4C 45 41 56 45 1A 42 C4 21 BA 40 FC C5
-00 00 BA 40 BC C5 02 00 B2 50 06 00 C4 21 A2 53
-00 20 2A 52 19 42 00 20 89 4A 00 00 30 4D E2 D0
-04 4D 4F 56 45 00 0A 4E 38 4F 39 4F 3E 4F 0A 93
-11 24 08 99 0F 24 06 2C F8 49 00 00 18 53 1A 83
-FB 23 30 4D 08 5A 09 5A 19 83 18 83 E8 49 00 00
-1A 83 FA 23 30 4D 34 C4 CA 21 FC C4 2A C4 84 12
-46 D1 2C D4 02 D4 74 D0 A2 CD EA D3 D4 D0 10 D1
-AE C9 B4 D1 E8 D1 24 D0 AE D2 48 C5 4E CF B6 CE
-86 CA 00 00 3A 40 0C 00 39 40 CA 21 38 40 CC 21
-D9 3F 3A 40 0E 00 39 40 CC 21 38 40 CA 21 CC 3F
-82 43 CC 21 30 4D 92 42 CA 21 C8 21 30 4D 62 CF
-09 50 57 52 5F 53 54 41 54 45 84 12 90 CF E6 D3
-30 DB A0 D1 08 50 57 52 5F 48 45 52 45 00 92 42
-C4 21 B0 D1 92 42 C6 21 AE D1 EF 3F 62 D0 09 52
-53 54 5F 53 54 41 54 45 92 42 0C 18 B0 D1 92 42
-0E 18 AE D1 E2 3F CE D1 08 52 53 54 5F 48 45 52
-45 00 92 42 C4 21 0C 18 92 42 C6 21 0E 18 DF 3F
-B2 40 54 D2 B6 D2 B2 40 64 C8 58 C8 B2 40 BE C8
-CE C8 B2 40 FA C8 0E C9 B2 40 DC C7 EA C7 30 41
-52 D0 04 57 49 50 45 00 39 40 80 FF B9 43 00 00
-29 53 39 90 DA FF FA 23 B0 12 00 D2 B2 40 30 DB
-C4 21 B2 40 E6 D3 C6 21 D4 3F C6 CF 06 28 57 41
-52 4D 29 00 1E 42 08 18 87 12 6C C9 05 0D 1B 5B
-37 6D 50 C9 70 C7 6C C9 27 20 46 61 73 74 46 6F
-72 74 68 20 56 31 36 30 20 31 36 4D 48 7A 20 28
+00 00 30 4D AA C9 87 52 45 43 55 52 53 45 19 42
+C4 21 99 42 B2 21 00 00 A2 53 C4 21 30 4D AA CC
+88 50 4F 53 54 50 4F 4E 45 00 87 12 90 C6 EE C9
+46 CA 54 C4 E0 C5 AE CD 92 C5 E0 C5 6A CE 34 C4
+34 C4 CA CB CA CB 34 C4 CA CB CA CB 2A C4 82 9F
+B4 21 A0 24 87 12 94 C9 0F 73 74 61 63 6B 20 6D
+69 73 6D 61 74 63 68 21 30 CD 87 12 CA C9 90 C6
+EE C9 94 CE 08 4E 7A 4E 5A D3 5A 53 0A 58 19 42
+C8 21 6E 4E 3E F0 1E 00 09 5E 82 48 AE 21 82 49
+B0 21 82 4A B2 21 2A 52 82 4A C4 21 3E 4F 3D 41
+30 41 E8 C9 08 56 41 52 49 41 42 4C 45 00 B0 12
+8A CE BA 40 86 12 FC FF 71 3C 0C CC 08 43 4F 4E
+53 54 41 4E 54 00 B0 12 8A CE BA 40 85 12 FC FF
+8A 4E FE FF 3E 4F 62 3C DC CE 06 43 52 45 41 54
+45 00 B0 12 8A CE BA 40 85 12 FC FF 8A 4A FE FF
+55 3C 7A CC 05 44 4F 45 53 3E 1A 42 B2 21 BA 40
+84 12 00 00 8A 4D 02 00 3D 41 30 4D 14 CF 05 44
+45 46 45 52 B0 12 8A CE BA 40 30 40 FC FF BA 40
+2A CF FE FF 3B 3C D2 CD 01 3A B0 12 8A CE BA 40
+87 12 FC FF A2 83 C4 21 B2 43 B6 21 82 4F B4 21
+30 4D 48 CF 81 3B 82 93 B6 21 24 27 87 12 34 C4
+2A C4 CA CB 6E CE C0 CD 2A C4 7C CF 3D 41 B2 4E
+0E 18 A2 4E 0C 18 3E 4F 32 3D DC CB 06 4D 41 52
+4B 45 52 00 B0 12 8A CE BA 40 84 12 FC FF BA 40
+7A CF FE FF 9A 42 C6 21 00 00 28 83 8A 48 02 00
+A2 52 C4 21 18 42 AE 21 19 42 B0 21 A8 49 FE FF
+89 48 00 00 30 4D 0E CE 82 49 46 00 2F 83 8F 4E
+00 00 1E 42 C4 21 A2 52 C4 21 BE 40 E0 C5 00 00
+2E 53 30 4D 2E CF 84 45 4C 53 45 00 A2 52 C4 21
+1A 42 C4 21 BA 40 DC C5 FC FF 8E 4A 00 00 2A 83
+0E 4A 30 4D 72 C9 84 54 48 45 4E 00 9E 42 C4 21
+00 00 3E 4F 30 4D FA CE 85 42 45 47 49 4E 30 40
+A0 C7 06 D0 85 55 4E 54 49 4C 39 40 E0 C5 A2 52
+C4 21 1A 42 C4 21 8A 49 FC FF 8A 4E FE FF 3E 4F
+30 4D 88 CD 85 41 47 41 49 4E 39 40 DC C5 EF 3F
+C4 CE 85 57 48 49 4C 45 87 12 CC CF 78 C4 2A C4
+26 CE 86 52 45 50 45 41 54 00 87 12 4A D0 0C D0
+2A C4 E6 CF 82 44 4F 00 2F 83 8F 4E 00 00 A2 53
+C4 21 1E 42 C4 21 BE 40 F0 C5 FE FF A2 53 00 20
+1A 42 00 20 8A 43 00 00 30 4D 8C CF 84 4C 4F 4F
+50 00 39 40 12 C6 A2 52 C4 21 1A 42 C4 21 8A 49
+FC FF 8A 4E FE FF 1E 42 00 20 A2 83 00 20 2E 4E
+0E 93 03 24 8E 4A 00 00 F6 3F 3E 4F 30 4D FC C7
+85 2B 4C 4F 4F 50 39 40 00 C6 E5 3F 9C D0 85 4C
+45 41 56 45 1A 42 C4 21 BA 40 22 C6 00 00 BA 40
+DC C5 02 00 B2 50 06 00 C4 21 A2 53 00 20 2A 52
+19 42 00 20 89 4A 00 00 30 4D DE D0 04 4D 4F 56
+45 00 0A 4E 38 4F 39 4F 3E 4F 0A 93 11 24 08 99
+0F 24 06 2C F8 49 00 00 18 53 1A 83 FB 23 30 4D
+08 5A 09 5A 19 83 18 83 E8 49 00 00 1A 83 FA 23
+30 4D 34 C4 CA 21 FA C4 2A C4 84 12 42 D1 9C D5
+72 D5 74 D0 9E CD 5A D5 D0 D0 0C D1 D6 C9 FE D1
+18 D2 24 D0 1E D4 46 C5 A4 D3 C8 CD AE CA 00 00
+3A 40 0E 00 39 40 CA 21 38 40 CC 21 D9 3F 3A 40
+0E 00 39 40 CC 21 38 40 CA 21 CC 3F 82 43 CC 21
+30 4D 92 42 CA 21 C8 21 30 4D 9C D1 3A 4E 82 4A
+C6 21 2E 4E 82 4E C4 21 3D 40 10 00 09 4A 08 49
+29 83 18 48 FE FF 0E 98 FC 2B 89 48 00 00 1D 83
+F6 23 2A 4A 0A 93 F0 23 3E 4F 3D 41 30 4D 40 CE
+09 50 57 52 5F 53 54 41 54 45 84 12 9A D1 56 D5
+9E DC 62 D0 09 52 53 54 5F 53 54 41 54 45 92 42
+0E 18 DE D1 92 42 0C 18 E0 D1 EF 3F D0 D1 08 50
+57 52 5F 48 45 52 45 00 92 42 C6 21 DE D1 92 42
+C4 21 E0 D1 30 4D E4 D1 08 52 53 54 5F 48 45 52
+45 00 92 42 C6 21 0E 18 92 42 C4 21 0C 18 EC 3F
+B2 40 C4 D3 26 D4 B2 40 8C C8 80 C8 B2 40 E6 C8
+F6 C8 B2 40 22 C9 36 C9 B2 40 F4 C7 02 C8 82 43
+18 DC 82 43 24 DC 82 43 30 DC 82 43 60 DC 82 43
+6C DC 82 43 78 DC 30 41 52 D0 04 57 49 50 45 00
+39 40 80 FF B9 43 00 00 29 53 39 90 DA FF FA 23
+B0 12 30 D2 B2 40 9E DC 0C 18 B2 40 56 D5 0E 18
+AE 3F 18 D0 07 43 4F 4D 50 41 52 45 0C 4E 38 4F
+3B 4F 39 4F 0E 4B 0E 5C 0C 24 1B 83 07 30 1C 83
+07 30 19 53 F9 98 FF FF F5 27 02 2C 3E 43 30 4D
+1E 43 30 4D 64 CF 86 5B 54 48 45 4E 5D 00 30 4D
+1E 83 30 4D C6 D2 86 5B 45 4C 53 45 5D 00 87 12
+34 C4 01 00 90 C6 EE C9 12 CC 44 C4 E0 C5 4C D3
+8A C4 8A C4 94 C9 04 5B 49 46 5D 00 9C D2 EA C5
+0A D3 A6 CA 2C C5 DC C5 40 D3 8A C4 8A C4 94 C9
+06 5B 45 4C 53 45 5D 00 9C D2 EA C5 2E D3 A6 CA
+D0 D2 44 C4 E0 C5 2A D3 2C C5 DC C5 40 D3 94 C9
+06 5B 54 48 45 4E 5D 00 9C D2 EA C5 40 D3 D0 D2
+54 C4 EA C5 48 D3 2A C4 DC C5 E4 D2 A6 CA 94 C9
+03 0D 6B 6F 78 C9 40 C9 5A C6 44 C4 64 C6 0E C8
+62 D3 82 43 C2 21 82 4E BE 21 B2 4F C0 21 3E 4F
+3D 40 E4 D2 30 4D D6 D2 84 5B 49 46 5D 00 0E 93
+3E 4F AD 27 30 4D 78 D3 8B 5B 55 4E 44 45 46 49
+4E 45 44 5D 87 12 90 C6 EE C9 46 CA 6C C4 86 C5
+2A C4 88 D3 89 5B 44 45 46 49 4E 45 44 5D 87 12
+90 C6 EE C9 46 CA 6C C4 2A C4 C8 CF 06 28 57 41
+52 4D 29 00 1E 42 08 18 87 12 94 C9 05 0D 1B 5B
+37 6D 78 C9 8A C7 94 C9 27 20 46 61 73 74 46 6F
+72 74 68 20 56 31 36 32 20 31 36 4D 48 7A 20 28
43 29 20 4A 2E 4D 2E 54 68 6F 6F 72 65 6E 73 20
-50 C9 34 C4 30 FF 84 C7 2A C5 30 C7 6C C9 0B 62
-79 74 65 73 20 66 72 65 65 20 26 CD 22 D2 04 57
-41 52 4D 00 30 40 54 D2 18 D0 04 43 4F 4C 44 00
+78 C9 34 C4 30 FF A0 C7 28 C5 56 C7 94 C9 0B 62
+79 74 65 73 20 66 72 65 65 20 36 CD 6A D2 04 57
+41 52 4D 00 30 40 C4 D3 94 D2 04 43 4F 4C 44 00
B2 40 04 A5 20 01 B2 40 88 5A CC 01 B2 43 02 02
B2 D3 06 02 F2 D0 06 00 24 02 F2 D3 26 02 F2 40
FD 00 22 02 F2 40 A5 00 A1 01 F2 40 10 00 A0 01
B2 40 0B 00 82 01 B2 40 E9 01 84 01 39 40 40 00
B2 D0 10 00 86 01 92 D2 5E 01 08 18 A2 93 08 18
01 24 59 03 38 40 50 C3 18 83 FE 23 19 83 FA 23
-3A 40 C6 D2 39 40 DA FF 89 4A 00 00 29 53 FC 23
+3A 40 36 D4 39 40 DA FF 89 4A 00 00 29 53 FC 23
92 42 02 18 E4 FF B2 40 18 00 0A 18 31 40 E0 20
-3F 40 80 20 37 40 00 C4 36 40 B4 C4 35 40 08 C4
+3F 40 80 20 37 40 00 C4 36 40 BC C4 35 40 08 C4
34 40 14 C4 B2 40 0A 00 DA 21 B2 43 AC 21 92 C3
30 01 18 42 08 18 F2 B0 10 00 00 02 04 20 38 E3
18 53 82 48 08 18 B2 40 81 00 00 05 B2 40 11 00
06 05 B2 40 00 4A 08 05 F2 D0 30 00 0A 02 92 C3
-00 05 92 D3 1A 05 3D 40 C0 D3 18 42 08 18 38 90
-0A 00 3A 27 38 90 16 00 37 2F 28 93 0D 23 F5 26
-B4 D2 84 12 46 D1 0E DA BA DA C2 D9 0E DB 88 D9
-42 DA 8C D6 00 00 7E D9 2E DA E0 D9 1E DA 9C D7
-00 00 00 00 20 DB 72 D1 4C D2 85 48 49 32 4C 4F
-87 12 84 C7 DE CF A2 CB AE CE 74 D1 C2 D3 2A C4
-BA D2 04 43 4F 44 45 00 B0 12 C0 CD A2 82 C4 21
-87 12 EE CE BC C5 FA D3 00 00 07 45 4E 44 43 4F
-44 45 87 12 82 D1 0E CE 2A C4 44 D0 03 41 53 4D
-92 42 C8 21 B8 21 B2 40 C6 D3 C8 21 E5 3F 1A D4
+00 05 92 D3 1A 05 3D 40 30 D5 18 42 08 18 38 90
+0A 00 A6 26 38 90 16 00 A3 2E 28 93 60 22 55 26
+24 D4 84 12 42 D1 7C DB 28 DC 30 DB 7C DC F6 DA
+B0 DB FA D7 00 00 EC DA 9C DB 4E DB 8C DB 0A D9
+00 00 00 00 8E DC 6E D1 BC D3 85 48 49 32 4C 4F
+87 12 A0 C7 E0 CF CA CB C0 CD 70 D1 32 D5 2A C4
+2A D4 04 43 4F 44 45 00 B0 12 8A CE A2 82 C4 21
+87 12 5C CF DC C5 6A D5 00 00 07 45 4E 44 43 4F
+44 45 87 12 7E D1 6E CE 2A C4 44 D0 03 41 53 4D
+92 42 C8 21 B8 21 B2 40 36 D5 C8 21 E5 3F 8A D5
06 45 4E 44 41 53 4D 00 92 42 B8 21 C8 21 E9 3F
00 00 05 43 4F 4C 4F 4E 1A 42 C4 21 BA 40 87 12
-00 00 A2 53 C4 21 B2 43 B6 21 30 40 82 D1 00 00
+00 00 A2 53 C4 21 B2 43 B6 21 30 40 7E D1 00 00
05 4C 4F 32 48 49 1A 42 C4 21 BA 40 B0 12 00 00
BA 40 2A C4 02 00 A2 52 C4 21 ED 3F 38 40 BE 21
39 48 2A 48 09 5A 1A 52 C2 21 09 9A 03 24 7E 9A
FC 27 1A 83 0E 4A 2A 88 82 4A C2 21 30 4D B0 12
-2A C4 C6 C9 1E CA 72 C5 C0 C5 C4 D4 DA CA C0 C5
-B2 CD E6 D4 C6 D4 29 4E 39 90 86 12 02 20 2E 53
-30 41 39 90 85 12 03 20 1E 4E 02 00 30 41 39 90
-84 12 01 20 2E 52 30 41 19 42 C4 21 A2 53 C4 21
-89 4E 00 00 3E 40 29 00 12 12 C2 21 92 53 C2 21
-B0 12 2A C4 C6 C9 DA CA C0 C5 18 D5 0E D5 21 53
-3E 90 10 00 BB 2D 30 41 1A D5 B2 41 C2 21 22 D3
-30 41 87 12 4C C6 8C D4 2A D5 82 43 BC 21 92 42
-C4 21 BA 21 A2 53 C4 21 0A 4E 3E 4F FA 90 23 00
-00 00 34 20 92 53 C2 21 B0 12 AE D4 0E 93 04 20
-B2 40 00 03 BC 21 27 3C 1E 93 04 20 B2 40 10 03
-BC 21 21 3C 2E 93 04 20 B2 40 20 03 BC 21 1B 3C
-2E 92 04 20 B2 40 20 02 BC 21 15 3C 3E 92 04 20
-B2 40 30 02 BC 21 0F 3C 3E 93 04 20 B2 40 30 03
-BC 21 09 3C B2 40 30 00 BC 21 19 42 C4 21 A2 53
-C4 21 89 4E 00 00 3E 4F 3D 41 30 4D FA 90 26 00
-00 00 08 20 B2 40 10 02 BC 21 92 53 C2 21 30 12
-9A D5 75 3F FA 90 40 00 00 00 1A 20 B2 40 20 00
-BC 21 92 53 C2 21 B0 12 F8 D4 0E 20 B2 50 10 00
-BC 21 3E 40 2B 00 B0 12 F8 D4 32 24 92 92 BE 21
-C2 21 02 24 92 53 C2 21 8E 10 82 5E BC 21 D3 3F
-B0 12 F8 D4 F9 23 B2 50 10 00 BC 21 3E 40 28 00
-B0 12 AE D4 30 12 EA D5 67 3F 87 12 4C C6 8C D4
-22 D6 FE 90 26 00 00 00 3E 40 20 00 04 20 B2 50
-82 00 BC 21 C2 3F B0 12 F8 D4 DF 23 B2 50 80 00
-BC 21 3E 40 28 00 B0 12 AE D4 B0 12 E8 D4 D5 23
-3D 40 B2 CD 30 4D 50 C8 04 52 45 54 49 00 87 12
-34 C4 00 13 A2 CB 2A C4 34 C4 2C 00 22 D5 1A D6
-72 D6 2E 4E 1E D2 BC 21 19 42 BA 21 92 3F 70 D4
-03 4D 4F 56 84 12 68 D6 00 40 80 D6 05 4D 4F 56
-2E 42 84 12 68 D6 40 40 00 00 03 41 44 44 84 12
-68 D6 00 50 9A D6 05 41 44 44 2E 42 84 12 68 D6
-40 50 A6 D6 04 41 44 44 43 00 84 12 68 D6 00 60
-B4 D6 06 41 44 44 43 2E 42 00 84 12 68 D6 40 60
-58 D6 04 53 55 42 43 00 84 12 68 D6 00 70 D2 D6
-06 53 55 42 43 2E 42 00 84 12 68 D6 40 70 E0 D6
-03 53 55 42 84 12 68 D6 00 80 F0 D6 05 53 55 42
-2E 42 84 12 68 D6 40 80 52 D4 03 43 4D 50 84 12
-68 D6 00 90 0A D7 05 43 4D 50 2E 42 84 12 68 D6
-40 90 40 D4 04 44 41 44 44 00 84 12 68 D6 00 A0
-24 D7 06 44 41 44 44 2E 42 00 84 12 68 D6 40 A0
-16 D7 03 42 49 54 84 12 68 D6 00 B0 42 D7 05 42
-49 54 2E 42 84 12 68 D6 40 B0 4E D7 03 42 49 43
-84 12 68 D6 00 C0 5C D7 05 42 49 43 2E 42 84 12
-68 D6 40 C0 68 D7 03 42 49 53 84 12 68 D6 00 D0
-76 D7 05 42 49 53 2E 42 84 12 68 D6 40 D0 00 00
-03 58 4F 52 84 12 68 D6 00 E0 90 D7 05 58 4F 52
-2E 42 84 12 68 D6 40 E0 C2 D6 03 41 4E 44 84 12
-68 D6 00 F0 AA D7 05 41 4E 44 2E 42 84 12 68 D6
-40 F0 4C C6 22 D5 C8 D7 1A 42 BC 21 B2 F0 70 00
-BC 21 8A 10 3A F0 0F 00 82 DA BC 21 4A 3F FC D6
-03 52 52 43 84 12 C2 D7 00 10 E0 D7 05 52 52 43
-2E 42 84 12 C2 D7 40 10 EC D7 04 53 57 50 42 00
-84 12 C2 D7 80 10 FA D7 03 52 52 41 84 12 C2 D7
-00 11 08 D8 05 52 52 41 2E 42 84 12 C2 D7 40 11
-14 D8 03 53 58 54 84 12 C2 D7 80 11 00 00 04 50
-55 53 48 00 84 12 C2 D7 00 12 2E D8 06 50 55 53
-48 2E 42 00 84 12 C2 D7 40 12 82 D7 04 43 41 4C
-4C 00 84 12 C2 D7 80 12 34 C4 2C 00 22 D5 1A D6
-62 D8 59 42 BC 21 5A 42 BD 21 82 4A BC 21 BE 90
-00 15 00 00 02 20 0A 89 02 3C 09 8A 0A 49 3A 90
-10 00 03 2C 5A 0E A8 3F 1A 53 0E 4A 87 12 70 C7
-6C C9 0D 6F 75 74 20 6F 66 20 62 6F 75 6E 64 73
-20 CD 3C D8 05 50 55 53 48 4D 84 12 58 D8 00 15
-A4 D8 04 50 4F 50 4D 00 84 12 58 D8 00 17 4C C6
-8C D4 C4 D8 82 43 BC 21 92 42 C4 21 BA 21 A2 53
-C4 21 92 53 C2 21 3E 40 2C 00 B0 12 2A C4 C6 C9
-DA CA C0 C5 B2 CD 1A D6 EA D8 0A 4E 3E 4F 1A 83
-2A 92 CA 2F 8A 10 5A 06 6F 3F 22 D8 04 52 52 43
-4D 00 84 12 BE D8 50 00 FC D8 04 52 52 41 4D 00
-84 12 BE D8 50 01 0A D9 04 52 4C 41 4D 00 84 12
-BE D8 50 02 18 D9 04 52 52 55 4D 00 84 12 BE D8
-50 03 85 12 00 3C 26 D9 03 53 3E 3D 85 12 00 38
-38 D9 02 53 3C 00 85 12 00 34 B2 D8 03 30 3E 3D
-85 12 00 30 4C D9 02 30 3C 00 85 12 00 30 00 00
-02 55 3C 00 85 12 00 2C 60 D9 03 55 3E 3D 85 12
-00 28 56 D9 03 30 3C 3E 85 12 00 24 74 D9 02 30
-3D 00 85 12 00 20 5C C8 02 49 46 00 1A 42 C4 21
-8A 4E 00 00 A2 53 C4 21 0E 4A 30 4D 6A D9 04 54
-48 45 4E 00 1A 42 C4 21 08 4E 3E 4F 09 48 29 53
-0A 89 0A 11 3A 90 00 02 68 2F 88 DA 00 00 30 4D
-32 D7 04 45 4C 53 45 00 1A 42 C4 21 BA 40 00 3C
-00 00 A2 53 C4 21 2F 83 8F 4A 00 00 E3 3F 9E D9
-05 55 4E 54 49 4C 3A 4F 08 4E 3E 4F 19 42 C4 21
-2A 83 0A 89 0A 11 3A 90 00 FE 47 3B 3A F0 FF 03
-08 DA 89 48 00 00 A2 53 C4 21 30 4D B6 D7 05 41
-47 41 49 4E 87 12 32 D9 E6 D9 2A C4 00 00 05 57
-48 49 4C 45 87 12 8C D9 6E C4 2A C4 42 D9 06 52
-45 50 45 41 54 00 87 12 32 D9 E6 D9 A4 D9 2A C4
-00 00 03 4A 4D 50 87 12 A4 CD 32 D9 E6 D9 2A C4
-3E B0 00 10 03 20 3E E0 00 04 30 4D 3E 90 00 34
-06 28 03 24 3E 40 00 34 30 4D 3E 40 00 38 30 4D
-00 00 04 3F 4A 4D 50 00 87 12 50 DA A4 CD 6E C4
-E6 D9 2A C4 86 DA 3D 41 08 4E 3E 4F 2A 48 0A 93
-04 20 98 42 C4 21 00 00 30 4D 88 43 00 00 A4 3F
-4C D8 03 42 57 31 84 12 84 DA 00 00 A2 DA 03 42
-57 32 84 12 84 DA 00 00 AE DA 03 42 57 33 84 12
-84 DA 00 00 C6 DA 3D 41 1A 42 C4 21 28 4E 08 93
-08 20 BA 4F 00 00 A2 53 C4 21 8E 4A 00 00 3E 4F
-30 4D 8E 43 00 00 61 3F 00 00 03 46 57 31 84 12
-C4 DA 00 00 EA DA 03 46 57 32 84 12 C4 DA 00 00
-F6 DA 03 46 57 33 84 12 C4 DA 00 00 02 DB 04 47
-4F 54 4F 00 87 12 32 D9 A4 CD 98 CB 2A C4 72 DA
-05 3F 47 4F 54 4F 87 12 50 DA A4 CD 98 CB 2A C4
+2A C4 EE C9 46 CA EA C5 32 D6 02 CB E0 C5 AE CD
+54 D6 34 D6 29 4E 39 90 86 12 02 20 2E 53 30 41
+39 90 85 12 03 20 1E 4E 02 00 30 41 39 90 84 12
+01 20 2E 52 30 41 19 42 C4 21 A2 53 C4 21 89 4E
+00 00 3E 40 29 00 12 12 C2 21 92 53 C2 21 B0 12
+2A C4 EE C9 02 CB E0 C5 86 D6 7C D6 21 53 3E 90
+10 00 BB 2D 30 41 88 D6 B2 41 C2 21 22 D3 30 41
+87 12 90 C6 FC D5 98 D6 82 43 BC 21 92 42 C4 21
+BA 21 A2 53 C4 21 0A 4E 3E 4F FA 90 23 00 00 00
+34 20 92 53 C2 21 B0 12 1E D6 0E 93 04 20 B2 40
+00 03 BC 21 27 3C 1E 93 04 20 B2 40 10 03 BC 21
+21 3C 2E 93 04 20 B2 40 20 03 BC 21 1B 3C 2E 92
+04 20 B2 40 20 02 BC 21 15 3C 3E 92 04 20 B2 40
+30 02 BC 21 0F 3C 3E 93 04 20 B2 40 30 03 BC 21
+09 3C B2 40 30 00 BC 21 19 42 C4 21 A2 53 C4 21
+89 4E 00 00 3E 4F 3D 41 30 4D FA 90 26 00 00 00
+08 20 B2 40 10 02 BC 21 92 53 C2 21 30 12 08 D7
+76 3F FA 90 40 00 00 00 1A 20 B2 40 20 00 BC 21
+92 53 C2 21 B0 12 66 D6 0E 20 B2 50 10 00 BC 21
+3E 40 2B 00 B0 12 66 D6 32 24 92 92 BE 21 C2 21
+02 24 92 53 C2 21 8E 10 82 5E BC 21 D3 3F B0 12
+66 D6 F9 23 B2 50 10 00 BC 21 3E 40 28 00 B0 12
+1E D6 30 12 58 D7 67 3F 87 12 90 C6 FC D5 90 D7
+FE 90 26 00 00 00 3E 40 20 00 04 20 B2 50 82 00
+BC 21 C2 3F B0 12 66 D6 DF 23 B2 50 80 00 BC 21
+3E 40 28 00 B0 12 1E D6 B0 12 56 D6 D5 23 3D 40
+AE CD 30 4D 78 C8 04 52 45 54 49 00 87 12 34 C4
+00 13 CA CB 2A C4 34 C4 2C 00 90 D6 88 D7 E0 D7
+2E 4E 1E D2 BC 21 19 42 BA 21 92 3F E0 D5 03 4D
+4F 56 84 12 D6 D7 00 40 EE D7 05 4D 4F 56 2E 42
+84 12 D6 D7 40 40 00 00 03 41 44 44 84 12 D6 D7
+00 50 08 D8 05 41 44 44 2E 42 84 12 D6 D7 40 50
+14 D8 04 41 44 44 43 00 84 12 D6 D7 00 60 22 D8
+06 41 44 44 43 2E 42 00 84 12 D6 D7 40 60 C6 D7
+04 53 55 42 43 00 84 12 D6 D7 00 70 40 D8 06 53
+55 42 43 2E 42 00 84 12 D6 D7 40 70 4E D8 03 53
+55 42 84 12 D6 D7 00 80 5E D8 05 53 55 42 2E 42
+84 12 D6 D7 40 80 C2 D5 03 43 4D 50 84 12 D6 D7
+00 90 78 D8 05 43 4D 50 2E 42 84 12 D6 D7 40 90
+B0 D5 04 44 41 44 44 00 84 12 D6 D7 00 A0 92 D8
+06 44 41 44 44 2E 42 00 84 12 D6 D7 40 A0 84 D8
+03 42 49 54 84 12 D6 D7 00 B0 B0 D8 05 42 49 54
+2E 42 84 12 D6 D7 40 B0 BC D8 03 42 49 43 84 12
+D6 D7 00 C0 CA D8 05 42 49 43 2E 42 84 12 D6 D7
+40 C0 D6 D8 03 42 49 53 84 12 D6 D7 00 D0 E4 D8
+05 42 49 53 2E 42 84 12 D6 D7 40 D0 00 00 03 58
+4F 52 84 12 D6 D7 00 E0 FE D8 05 58 4F 52 2E 42
+84 12 D6 D7 40 E0 30 D8 03 41 4E 44 84 12 D6 D7
+00 F0 18 D9 05 41 4E 44 2E 42 84 12 D6 D7 40 F0
+90 C6 90 D6 36 D9 1A 42 BC 21 B2 F0 70 00 BC 21
+8A 10 3A F0 0F 00 82 DA BC 21 4A 3F 6A D8 03 52
+52 43 84 12 30 D9 00 10 4E D9 05 52 52 43 2E 42
+84 12 30 D9 40 10 5A D9 04 53 57 50 42 00 84 12
+30 D9 80 10 68 D9 03 52 52 41 84 12 30 D9 00 11
+76 D9 05 52 52 41 2E 42 84 12 30 D9 40 11 82 D9
+03 53 58 54 84 12 30 D9 80 11 00 00 04 50 55 53
+48 00 84 12 30 D9 00 12 9C D9 06 50 55 53 48 2E
+42 00 84 12 30 D9 40 12 F0 D8 04 43 41 4C 4C 00
+84 12 30 D9 80 12 34 C4 2C 00 90 D6 88 D7 D0 D9
+59 42 BC 21 5A 42 BD 21 82 4A BC 21 BE 90 00 15
+00 00 02 20 0A 89 02 3C 09 8A 0A 49 3A 90 10 00
+03 2C 5A 0E A8 3F 1A 53 0E 4A 87 12 8A C7 94 C9
+0D 6F 75 74 20 6F 66 20 62 6F 75 6E 64 73 30 CD
+AA D9 05 50 55 53 48 4D 84 12 C6 D9 00 15 12 DA
+04 50 4F 50 4D 00 84 12 C6 D9 00 17 90 C6 FC D5
+32 DA 82 43 BC 21 92 42 C4 21 BA 21 A2 53 C4 21
+92 53 C2 21 3E 40 2C 00 B0 12 2A C4 EE C9 02 CB
+E0 C5 AE CD 88 D7 58 DA 0A 4E 3E 4F 1A 83 2A 92
+CA 2F 8A 10 5A 06 6F 3F 90 D9 04 52 52 43 4D 00
+84 12 2C DA 50 00 6A DA 04 52 52 41 4D 00 84 12
+2C DA 50 01 78 DA 04 52 4C 41 4D 00 84 12 2C DA
+50 02 86 DA 04 52 52 55 4D 00 84 12 2C DA 50 03
+85 12 00 3C 94 DA 03 53 3E 3D 85 12 00 38 A6 DA
+02 53 3C 00 85 12 00 34 20 DA 03 30 3E 3D 85 12
+00 30 BA DA 02 30 3C 00 85 12 00 30 00 00 02 55
+3C 00 85 12 00 2C CE DA 03 55 3E 3D 85 12 00 28
+C4 DA 03 30 3C 3E 85 12 00 24 E2 DA 02 30 3D 00
+85 12 00 20 84 C8 02 49 46 00 1A 42 C4 21 8A 4E
+00 00 A2 53 C4 21 0E 4A 30 4D D8 DA 04 54 48 45
+4E 00 1A 42 C4 21 08 4E 3E 4F 09 48 29 53 0A 89
+0A 11 3A 90 00 02 68 2F 88 DA 00 00 30 4D A0 D8
+04 45 4C 53 45 00 1A 42 C4 21 BA 40 00 3C 00 00
+A2 53 C4 21 2F 83 8F 4A 00 00 E3 3F 0C DB 05 55
+4E 54 49 4C 3A 4F 08 4E 3E 4F 19 42 C4 21 2A 83
+0A 89 0A 11 3A 90 00 FE 47 3B 3A F0 FF 03 08 DA
+89 48 00 00 A2 53 C4 21 30 4D 24 D9 05 41 47 41
+49 4E 87 12 A0 DA 54 DB 2A C4 00 00 05 57 48 49
+4C 45 87 12 FA DA 78 C4 2A C4 B0 DA 06 52 45 50
+45 41 54 00 87 12 A0 DA 54 DB 12 DB 2A C4 00 00
+03 4A 4D 50 87 12 A0 CD A0 DA 54 DB 2A C4 3E B0
+00 10 03 20 3E E0 00 04 30 4D 3E 90 00 34 06 28
+03 24 3E 40 00 34 30 4D 3E 40 00 38 30 4D 00 00
+04 3F 4A 4D 50 00 87 12 BE DB A0 CD 78 C4 54 DB
+2A C4 F4 DB 3D 41 08 4E 3E 4F 2A 48 0A 93 04 20
+98 42 C4 21 00 00 30 4D 88 43 00 00 A4 3F BA D9
+03 42 57 31 84 12 F2 DB 00 00 10 DC 03 42 57 32
+84 12 F2 DB 00 00 1C DC 03 42 57 33 84 12 F2 DB
+00 00 34 DC 3D 41 1A 42 C4 21 28 4E 08 93 08 20
+BA 4F 00 00 A2 53 C4 21 8E 4A 00 00 3E 4F 30 4D
+8E 43 00 00 61 3F 00 00 03 46 57 31 84 12 32 DC
+00 00 58 DC 03 46 57 32 84 12 32 DC 00 00 64 DC
+03 46 57 33 84 12 32 DC 00 00 70 DC 04 47 4F 54
+4F 00 87 12 A0 DA A0 CD C0 CB 2A C4 E0 DB 05 3F
+47 4F 54 4F 87 12 BE DB A0 CD C0 CB 2A C4
@FFDA
-C6 D2 C6 D2 C6 D2 C6 D2 C6 D2 6A C8 C6 D2 C6 D2
-C6 D2 C6 D2 C6 D2 C6 D2 C6 D2 C6 D2 C6 D2 C6 D2
-C6 D2 C6 D2 C6 D2
+36 D4 36 D4 36 D4 36 D4 36 D4 92 C8 36 D4 36 D4
+36 D4 36 D4 36 D4 36 D4 36 D4 36 D4 36 D4 36 D4
+36 D4 36 D4 36 D4
q
+++ /dev/null
-\prog\MSP430Flasher\msp430flasher -m SBW2 -n MSP430fr2433 -v -w %1 -z [VCC=3000]
-exit
-
-tip : how to calculate MAIN program lenght ?
-
-open the prog.txt file with your editor, select MAIN section
-in status bar, keep the number of selected chars
-if lines are ended with CR+LF, substract the number of lines selected
-then divide by 3.
+++ /dev/null
-
-FORTH vocabulary
- COLD WARM (WARM) WIPE RST_HERE RST_STATE PWR_HERE PWR_STATE
- MOVE LEAVE +LOOP LOOP DO REPEAT WHILE AGAIN
- UNTIL BEGIN THEN ELSE IF POSTPONE ['] IS
- IMMEDIATE ; : RECURSE ] [ DEFER DOES>
- CREATE CONSTANT VARIABLE \ ' ABORT" ABORT QUIT
- EVALUATE COUNT LITERAL , EXECUTE >NUMBER FIND WORD
- ." S" TYPE SPACES SPACE CR (CR) NOECHO
- ECHO EMIT (EMIT) ACCEPT KEY (KEY) C, ALLOT
- HERE . D. U. UD. SIGN HOLD #>
- #S # <# BL STATE BASE >IN J
- I UNLOOP U< > < = 0< 0=
- ABS NEGATE XOR OR AND - + C!
- C@ ! @ DEPTH R@ R> >R ROT
- OVER SWAP DROP ?DUP DUP LIT EXIT
-
-ASSEMBLER vocabulary
- ?GOTO GOTO FW3 FW2 FW1 BW3 BW2 BW1
- ?JMP JMP REPEAT WHILE AGAIN UNTIL ELSE THEN
- IF 0= 0<> U>= U< 0< 0>= S<
- S>= RRUM RLAM RRAM RRCM POPM PUSHM CALL
- PUSH.B PUSH SXT RRA.B RRA SWPB RRC.B RRC
- AND.B AND XOR.B XOR BIS.B BIS BIC.B BIC
- BIT.B BIT DADD.B DADD CMP.B CMP SUB.B SUB
- SUBC.B SUBC ADDC.B ADDC ADD.B ADD MOV.B MOV
- RETI LO2HI COLON ENDASM ENDCODE ASM CODE HI2LO
- ASSEMBLER
-
-VOCABULARY ADD-ON
- DEFINITIONS ONLY PREVIOUS ALSO FORTH VOCABULARY
-
-ANS_COMPLEMENT ADD-ON
- >BODY SOURCE .( ( DECIMAL HEX FILL +!
- [CHAR] CHAR CELL+ CELLS CHAR+ CHARS ALIGN ALIGNED
- 2OVER 2SWAP 2DROP 2DUP 2! 2@ */ */MOD
- MOD / /MOD * FM/MOD SM/REM UM/MOD M*
- UM* S>D NIP 2/ 2* MIN MAX 1-
- 1+ RSHIFT LSHIFT INVERT
-
-SD_CARD_LOADER ADD-ON
- LOAD" (ACCEPT)
-
-SD_CARD_READ_WRITE ADD-ON
- TERM2SD" SD_EMIT WRITE WRITE" READ READ" CLOSE DEL"
- CD"
-
-SD_TOOLS ADD-ON
- DIR_D FAT_D CLUST_D SECT_D DUMP U.R MIN
- MAX WORDS .S SP@ ?
-
--- /dev/null
+
+FORTH vocabulary
+----------------
+ASM CODE HI2LO COLD WARM (WARM) WIPE RST_HERE
+PWR_HERE RST_STATE PWR_STATE MOVE LEAVE +LOOP LOOP DO
+REPEAT WHILE AGAIN UNTIL BEGIN THEN ELSE IF
+; : DEFER DOES> CREATE CONSTANT VARIABLE POSTPONE
+RECURSE IMMEDIATE IS ['] ] [ \ '
+ABORT" ABORT QUIT EVALUATE COUNT LITERAL , EXECUTE
+>NUMBER FIND WORD ." S" TYPE SPACES SPACE
+CR (CR) NOECHO ECHO EMIT (EMIT) (ACCEPT) ACCEPT
+KEY (KEY) C, ALLOT HERE . D. U.
+SIGN HOLD #> #S # <# BL STATE
+BASE >IN CPL TIB PAD J I UNLOOP
+U< > < = 0> 0< 0= DABS
+ABS NEGATE XOR OR AND - + C!
+C@ ! @ DEPTH R@ R> >R ROT
+OVER SWAP NIP DROP ?DUP DUP LIT EXIT
+
+
+ASSEMBLER vocabulary
+--------------------
+?GOTO GOTO FW3 FW2 FW1 BW3 BW2 BW1
+?JMP JMP REPEAT WHILE AGAIN UNTIL ELSE THEN
+IF 0= 0<> U>= U< 0< 0>= S<
+S>= RRUM RLAM RRAM RRCM POPM PUSHM CALL
+PUSH.B PUSH SXT RRA.B RRA SWPB RRC.B RRC
+AND.B AND XOR.B XOR BIS.B BIS BIC.B BIC
+BIT.B BIT DADD.B DADD CMP.B CMP SUB.B SUB
+SUBC.B SUBC ADDC.B ADDC ADD.B ADD MOV.B MOV
+RETI LO2HI COLON ENDASM ENDCODE (SLEEP) SLEEP
+
+
+CONDCOMP ADD-ON
+---------------
+[DEFINED] [UNDEFINED] [IF] [ELSE] [THEN] COMPARE MARKER
+
+
+VOCABULARY ADD-ON
+-----------------
+DEFINITIONS ONLY PREVIOUS ALSO ASSEMBLER FORTH VOCABULARY
+
+
+ANS_COMPLEMENT ADD-ON
+---------------------
+>BODY SOURCE .( ( DECIMAL HEX FILL [CHAR]
+CHAR +! MIN MAX 2/ 2* 1- 1+
+RSHIFT LSHIFT INVERT 2OVER 2SWAP 2DROP 2DUP 2!
+2@ S>D CELL+ CELLS CHAR+ CHARS ALIGN ALIGNED
+*/ */MOD MOD / /MOD * FM/MOD SM/REM
+UM/MOD M* UM* {ANS_COMP}
+
+
+SD_CARD_LOADER ADD-ON
+---------------------
+LOAD" {SD_LOAD}
+
+
+SD_CARD_READ_WRITE ADD-ON
+-------------------------
+TERM2SD" SD_EMIT WRITE READ CLOSE DEL" WRITE" READ"
+
+
+UTILITY ADD-ON
+--------------
+DUMP U.R WORDS ? .RS .S {UTILITY}
+
+
+SD_TOOLS ADD-ON
+---------------
+DIR FAT CLUSTER SECTOR {SD_TOOLS}
+
+
+; a word within brackets [] is an immediate word. (other words may also be immediate)
+; a word doubled with another word between parentheses () is a DEFERred word, the first being initialised with the second.
+; when ADD-ONs are compiled into the kernel, their respective MARKER word identified with braces {} does nothing.
+
+; the words that are not commented are ANS94 compliant; search for their definition here: https://forth-standard.org/search
+
+
+FORTH WORDS
+
+ASM <word> -- used to begin an assembler word which is not interpretable by FORTH (because use of CALL ... RET).
+ this defined <word> must be ended with ENDASM.
+
+CODE <word> -- begins an assembler word interpretable by FORTH (MOV @IP+,PC instead of CALL ... RET)
+ this defined <word> must be ended with ENDCODE.
+
+HI2LO -- used to switch from a high level (FORTH) to low level (assembler) modes.
+
+COLD -- Software reset
+
+WARM -- DEFERred word initialized by default with (WARM)
+
+(WARM) -- performs a hot start
+
+WIPE -- resets the program memory to its original state before any add.
+
+RST_HERE -- defines the bound of the program memory protected against COLD or hardware reset.
+
+PWR_HERE -- defines the bound of the program memory protected against ON/OFF.
+
+RST_STATE -- remove all words defined after RST_HERE
+
+PWR_STATE -- remove all words defined after PWR_HERE
+
+MOVE
+LEAVE
++LOOP
+LOOP
+DO
+REPEAT
+WHILE
+AGAIN
+UNTIL
+BEGIN
+THEN
+ELSE
+IF
+;
+:
+DEFER
+DOES>
+CREATE
+CONSTANT
+VARIABLE
+POSTPONE
+RECURSE
+IMMEDIATE
+IS
+[']
+]
+[
+\
+'
+ABORT"
+ABORT
+QUIT
+EVALUATE
+COUNT
+LITERAL
+,
+EXECUTE
+>NUMBER
+FIND
+WORD
+."
+S"
+TYPE
+SPACES
+SPACE
+CR
+(CR)
+NOECHO
+ECHO
+EMIT
+(EMIT)
+(ACCEPT)
+ACCEPT
+KEY
+(KEY)
+C,
+ALLOT
+HERE
+.
+D.
+U.
+SIGN
+HOLD
+#>
+#S
+#
+<#
+BL
+STATE
+BASE
+>IN
+CPL -- size of terminal input buffer TIB
+TIB -- addr of terminal input buffer TIB
+PAD -- addr of PAD
+J
+I
+UNLOOP
+U<
+>
+<
+=
+0>
+0<
+0=
+DABS
+ABS
+NEGATE
+XOR
+OR
+AND
+-
++
+C!
+C@
+!
+@
+DEPTH
+R@
+R>
+>R
+ROT
+OVER
+SWAP
+NIP
+DROP
+?DUP
+DUP
+LIT -- execution part of LITERAL
+EXIT
+
+
+
+ASSEMBLER WORDS see: http://www.ece.utep.edu/courses/web3376/Notes_files/ee3376-isa.pdf
+ http://www.ti.com/lit/ug/slau367n/slau367n.pdf#page=158
+ howto.md for symbolic alias of registers, symbolic jumps (IF ELSE THEN...),..
+
+
+
+?GOTO used after a conditionnal to branch to a label FWx or BWx
+GOTO used as unconditionnal branch to a label FWx or BWx
+
+FW3 FORWARD branch destination n°3
+FW2
+FW1
+
+BW3 BACKWARD branch destination n°3
+BW2
+BW1
+
+?JMP used after a conditionnal to jump to a defined word
+JMP unconditionnal jump to a defined word
+
+REPEAT assembler version of the FORTH word REPEAT
+WHILE idem
+AGAIN idem
+UNTIL idem
+ELSE idem
+THEN idem
+IF idem
+
+0= conditionnal
+0<> conditionnal
+U>= conditionnal
+U< conditionnal
+0< conditionnal, to use only with ?JMP ?GOTO
+0>= conditionnal, to use only with IF UNTIL WHILE
+S< conditionnal
+S>= conditionnal
+
+RRUM used as : RRUM n,REG with 0 < n < 5
+RLAM same syntax
+RRAM same syntax
+RRCM same syntax
+POPM POP multiple registers, used as : POPM X,S to pop X,W,T,S
+PUSHM PUSH multiple registers, used as : PUSHM S,X to push S,T,W,X
+
+CALL see TI assembler
+PUSH.B
+PUSH
+SXT
+RRA.B
+RRA
+SWPB
+RRC.B
+RRC
+AND.B
+AND
+XOR.B
+XOR
+BIS.B
+BIS
+BIC.B
+BIC
+BIT.B
+BIT
+DADD.B
+DADD
+CMP.B
+CMP
+SUB.B
+SUB
+SUBC.B
+SUBC
+ADDC.B
+ADDC
+ADD.B
+ADD
+MOV.B
+MOV
+RETI
+
+LO2HI switch between low level and high level interpretation mode (counterpart of HI2LO), without saving IP.
+COLON PUSH IP then performs LO2HI, used as CODE <word> ... assembler cmd ... COLON ... FORTH words ... ;
+ENDASM to end an ASM definition
+ENDCODE to end a CODE definition
+(SLEEP) the default SLEEP definition
+SLEEP DEFERred word initialised with (SLEEP), which enables to create a background task.
+
+
+CONDCOMP ADD-ON
+---------------
+[DEFINED]
+[UNDEFINED]
+[IF]
+[ELSE]
+[THEN]
+COMPARE
+MARKER
.endcase
.byte STRLEN(name),name
- .align 2
+; .align 2
.ENDM
.endcase
.byte STRLEN(name)+128,name
- .align 2
+; .align 2
.ENDM
.endcase
.byte STRLEN(name),name
- .align 2
+; .align 2
.ENDM
; -------------------------------------------------------------------------------
; ANS complement for MSP430FRxxxx devices with hardware_MPY, to pass CORETEST.4th
+; when downloading to SD_CARD target, truncate filename ANS_COMP_HMPY.4th to ANS_COMP.4th
; -------------------------------------------------------------------------------
\ REGISTERS USAGE
-\ R4 to R7 must be saved before use and restored after
+\ rDODOES to rEXIT must be saved before use and restored after
\ scratch registers Y to S are free for use
\ under interrupt, IP is free for use
-\ PUSHM order : PSP,TOS, IP, S, T, W, X, Y, R7, R6, R5, R4
+\ PUSHM order : PSP,TOS, IP, S, T, W, X, Y, rEXIT, rDOVAR, rDOCON, rDODOES
\ example : PUSHM IP,Y
\
-\ POPM order : R4, R5, R6, R7, Y, X, W, T, S, IP,TOS,PSP
+\ POPM order : rDODOES, rDOCON, rDOVAR, rEXIT, Y, X, W, T, S, IP,TOS,PSP
\ example : POPM Y,IP
\ ASSEMBLER conditionnal usage before IF UNTIL WHILE : S< S>= U< U>= 0= 0<> 0>=
-\ ECHO ; if an error occurs, uncomment this line before new download to find it.
- \
-
CODE INVERT \ x1 -- x2 bitwise inversion
XOR #-1,TOS
MOV @IP+,PC
ENDCODE
\
-CODE RSHIFT \ x1 u -- x2 logical R shift u places
+CODE RSHIFT \ x1 u -- x2 logical rEXIT shift u places
MOV @PSP+,W
AND #$1F,TOS \ no need to shift more than 16
0<> IF
\ ARITHMETIC OPERATORS
\ --------------------
-CODE NIP \ a b c -- a c
-ADD #2,PSP
-MOV @IP+,PC
-ENDCODE
- \
-
-: S>D \ n -- d single -> double
- DUP 0<
-;
- \
-
CODE UM* \ u1 u2 -- udlo udhi unsigned 16x16->32 mult.
MOV @PSP,&MPY \ Load 1st operand
\ DOUBLE OPERATORS
\ ----------------------------------------------------------------------
+: S>D \ n -- d single -> double
+ DUP 0<
+;
+ \
+
CODE 2@ \ a-addr -- x1 x2 fetch 2 cells \ the lower address will appear on top of stack
SUB #2, PSP
MOV 2(TOS),0(PSP)
ENDCODE
\
-ECHO
; added ANS_COMPLEMENT: INVERT LSHIFT RSHIFT 1+ 1- MAX MIN 2* 2/ CHAR [CHAR] +! FILL HEX DECIMAL ( .( SOURCE >BODY
- ; ARITHMETIC: NIP S>D UM* M* UM/MOD SM/REM FM/MOD * /MOD / MOD */MOD */
+ ; ARITHMETIC: S>D UM* M* UM/MOD SM/REM FM/MOD * /MOD / MOD */MOD */
; DOUBLE: 2@ 2! 2DUP 2DROP 2SWAP 2OVER
; ALIGMENT: ALIGNED ALIGN
; PORTABIITY: CHARS CHAR+ CELLS CELL+
- \
-PWR_HERE ; to protect this app against a RESET, type: RST_HERE
+
+ ; v--- use backspaces before hit "CR" if you want decrease level of app protection
+PWR_HERE RST_HERE
\ No newline at end of file
; ----------------------------------------------------------------------------------
; ANS complement for MSP430FR4xxx devices without hardware_MPY, to pass CORETEST.4th
+; when downloading to SD_CARD target, truncate filename ANS_COMP_SMPY.4th to ANS_COMP.4th
; ----------------------------------------------------------------------------------
\ REGISTERS USAGE
-\ ECHO ; if an error occurs, uncomment this line before new download to find it.
- \
-
CODE INVERT \ x1 -- x2 bitwise inversion
XOR #-1,TOS
MOV @IP+,PC
\ ARITHMETIC OPERATORS
\ --------------------
-CODE NIP \ a b c -- a c
-ADD #2,PSP
-MOV @IP+,PC
-ENDCODE
- \
-
: S>D \ n -- d single -> double
DUP 0<
;
ENDCODE
\
-ECHO
-PWR_HERE ; to protect this app against a RESET, type: RST_HERE
+ ; added ANS_COMPLEMENT: INVERT LSHIFT RSHIFT 1+ 1- MAX MIN 2* 2/ CHAR [CHAR] +! FILL HEX DECIMAL ( .( SOURCE >BODY
+ ; ARITHMETIC: S>D UM* M* UM/MOD SM/REM FM/MOD * /MOD / MOD */MOD */
+ ; DOUBLE: 2@ 2! 2DUP 2DROP 2SWAP 2OVER
+ ; ALIGMENT: ALIGNED ALIGN
+ ; PORTABIITY: CHARS CHAR+ CELLS CELL+
- ; added : INVERT LSHIFT RSHIFT 1+ 1- MAX MIN 2* 2/ CHAR [CHAR] +! FILL HEX DECIMAL ( .( SOURCE >BODY
- ; added ARITHMETIC : NIP S>D M* UM/MOD SM/REM FM/MOD * /MOD / MOD */MOD */
- ; added DOUBLE : 2@ 2! 2DUP 2DROP 2SWAP 2OVER
- ; added ALIGMENT : ALIGNED ALIGN
- ; added PORTABIITY : CHARS CHAR+ CELLS CELL+
+ ; v--- use backspaces before hit "CR" if you want decrease level of app protection
+PWR_HERE RST_HERE
\ No newline at end of file
; ANS complement for MSP430FRxxxx devices with hardware_MPY, to pass CORETEST.4th
; -------------------------------------------------------------------------------
+PWR_STATE
+
CODE INVERT
XOR #-1,R14
MOV @R13+,R0
MOV @R13+,R0
ENDCODE
+[UNDEFINED] MAX [IF]
CODE MAX
CMP @R15,R14
S< ?GOTO FW1
FW1 MOV @R15+,R14
MOV @R13+,R0
ENDCODE
+[THEN]
CODE 2*
ADD R14,R14
MOV @R13+,R0
ENDCODE
-CODE NIP
-ADD #2,R15
-MOV @R13+,R0
-ENDCODE
-
: S>D
DUP 0<
;
ENDCODE
CODE HEX
-MOV #$10,&$1DDA
+MOV #$10,&BASE
MOV @R13+,R0
ENDCODE
+ \
CODE DECIMAL
-MOV #$0A,&$1DDA
+MOV #$0A,&BASE
MOV @R13+,R0
ENDCODE
-
+ \
: (
$29 WORD DROP
; IMMEDIATE
MOV @R13+,R0
ENDCODE
+PWR_HERE
ECHO
CR .( End of Core word set tests) CR
+\ \ ------------------------------------------------------------------------
+\ \ you must set ON compilation switch LOWERCASE to pass this test
+\ TESTING COMPARE
+\ : CMOVE MOVE ;
+\ : s1 S" abcdefghijklmnopqrstuvwxyz" ;
+\ : s6 S" 123456" ;
+\
+\ T{ s1 s1 COMPARE -> 0 }T
+\ T{ s1 PAD SWAP CMOVE -> }T \ Copy s1 to PAD
+\ T{ s1 PAD OVER COMPARE -> 0 }T
+\ T{ s1 PAD 6 COMPARE -> 1 }T
+\ T{ PAD 10 s1 COMPARE -> -1 }T
+\ T{ s1 PAD 0 COMPARE -> 1 }T
+\ T{ PAD 0 s1 COMPARE -> -1 }T
+\ T{ s1 s6 COMPARE -> 1 }T
+\ T{ s6 s1 COMPARE -> -1 }T
+\ : "abdde" S" abdde" ;
+\ : "abbde" S" abbde" ;
+\ : "abcdf" S" abcdf" ;
+\ : "abcdee" S" abcdee" ;
+\
+\ T{ s1 "abdde" COMPARE -> -1 }T
+\ T{ s1 "abbde" COMPARE -> 1 }T
+\ T{ s1 "abcdf" COMPARE -> -1 }T
+\ T{ s1 "abcdee" COMPARE -> 1 }T
+\
+\ : s11 S" 0abc" ;
+\ : s12 S" 0aBc" ;
+\
+\ T{ s11 s12 COMPARE -> 1 }T
+\ T{ s12 s11 COMPARE -> -1 }T
+
$0A BASE !
; ANS complement for MSP430FR4xxx devices without hardware_MPY, to pass CORETEST.4th
; ----------------------------------------------------------------------------------
+PWR_STATE
+
CODE INVERT
XOR #-1,R14
MOV @R13+,R0
MOV @R13+,R0
ENDCODE
+[UNDEFINED] MAX [IF]
CODE MAX
CMP @R15,R14
S< ?GOTO FW1
FW1 MOV @R15+,R14
MOV @R13+,R0
ENDCODE
+[THEN]
CODE 2*
ADD R14,R14
MOV @R13+,R0
ENDCODE
-CODE NIP
-ADD #2,R15
-MOV @R13+,R0
-ENDCODE
-
: S>D
DUP 0<
;
ENDCODE
CODE HEX
-MOV #$10,&$21DA
+MOV #$10,&BASE
MOV @R13+,R0
ENDCODE
CODE DECIMAL
-MOV #$0A,&$21DA
+MOV #$0A,&BASE
MOV @R13+,R0
ENDCODE
ENDCODE
+PWR_HERE
+
ECHO
; ===============================================================
CR .( End of Core word set tests) CR
-$0A BASE !
+\ ------------------------------------------------------------------------
+\ you must set ON compilation switch LOWERCASE to pass this test
+TESTING COMPARE
+: CMOVE MOVE ;
+: s1 S" abcdefghijklmnopqrstuvwxyz" ;
+: s6 S" 123456" ;
+
+T{ s1 s1 COMPARE -> 0 }T
+T{ s1 PAD SWAP CMOVE -> }T \ Copy s1 to PAD
+T{ s1 PAD OVER COMPARE -> 0 }T
+T{ s1 PAD 6 COMPARE -> 1 }T
+T{ PAD 10 s1 COMPARE -> -1 }T
+T{ s1 PAD 0 COMPARE -> 1 }T
+T{ PAD 0 s1 COMPARE -> -1 }T
+T{ s1 s6 COMPARE -> 1 }T
+T{ s6 s1 COMPARE -> -1 }T
+: "abdde" S" abdde" ;
+: "abbde" S" abbde" ;
+: "abcdf" S" abcdf" ;
+: "abcdee" S" abcdee" ;
+
+T{ s1 "abdde" COMPARE -> -1 }T
+T{ s1 "abbde" COMPARE -> 1 }T
+T{ s1 "abcdf" COMPARE -> -1 }T
+T{ s1 "abcdee" COMPARE -> 1 }T
+
+: s11 S" 0abc" ;
+: s12 S" 0aBc" ;
+
+T{ s11 s12 COMPARE -> 1 }T
+T{ s12 s11 COMPARE -> -1 }T
+$0A BASE !
+ECHO
; happy end of core test
+++ /dev/null
-; ------------------------
-; file name : coretest.4th
-; ------------------------
-
-RST_STATE ; so ANS_COMPLEMENT_xx_MPY is conserved
-\ NOECHO ; if an error occurs, comment this line before new download to find it.
-
-
-\ From: John Hayes S1I
-\ Subject: tester.fr
-\ Date: Mon, 27 Nov 95 13:10:09 PST
-
-\ (C) 1995 JOHNS HOPKINS UNIVERSITY / APPLIED PHYSICS LABORATORY
-\ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS.
-\ VERSION 1.1
-
-\ 22/1/09 The words { and } have been changed to T{ and }T respectively to
-\ agree with the Forth 200X file ttester.fs. This avoids clashes with
-\ locals using { ... } and the FSL use of }
-
-
-\ 13/05/14 jmt. added colorised error messages.
-
-
-
- 0 CONSTANT FALSE
--1 CONSTANT TRUE
-
-\ SET THE FOLLOWING FLAG TO TRUE FOR MORE VERBOSE OUTPUT; THIS MAY
-\ ALLOW YOU TO TELL WHICH TEST CAUSED YOUR SYSTEM TO HANG.
-VARIABLE VERBOSE
- FALSE VERBOSE !
-\ TRUE VERBOSE !
-
-\ : EMPTY-STACK ( ... -- ) \ EMPTY STACK: HANDLES UNDERFLOWED STACK TOO.
-\ DEPTH ?DUP
-\ IF DUP 0< IF NEGATE 0
-\ DO 0 LOOP
-\ ELSE 0 DO DROP LOOP THEN
-\ THEN ;
-\
-\ : ERROR \ ( C-ADDR U -- ) DISPLAY AN ERROR MESSAGE FOLLOWED BY
-\ \ THE LINE THAT HAD THE ERROR.
-\ TYPE SOURCE TYPE CR \ DISPLAY LINE CORRESPONDING TO ERROR
-\ EMPTY-STACK \ THROW AWAY EVERY THING ELSE
-\ QUIT \ *** Uncomment this line to QUIT on an error
-\ ;
-
-VARIABLE ACTUAL-DEPTH \ STACK RECORD
-CREATE ACTUAL-RESULTS 20 CELLS ALLOT
-
-: T{ \ ( -- ) SYNTACTIC SUGAR.
- ;
-
-: -> \ ( ... -- ) RECORD DEPTH AND CONTENT OF STACK.
- DEPTH DUP ACTUAL-DEPTH ! \ RECORD DEPTH
- ?DUP IF \ IF THERE IS SOMETHING ON STACK
- 0 DO ACTUAL-RESULTS I CELLS + ! LOOP \ SAVE THEM
- THEN ;
-
-: }T \ ( ... -- ) COMPARE STACK (EXPECTED) CONTENTS WITH SAVED
- \ (ACTUAL) CONTENTS.
- DEPTH ACTUAL-DEPTH @ = IF \ IF DEPTHS MATCH
- DEPTH ?DUP IF \ IF THERE IS SOMETHING ON THE STACK
- 0 DO \ FOR EACH STACK ITEM
- ACTUAL-RESULTS I CELLS + @ \ COMPARE ACTUAL WITH EXPECTED
-\ = 0= IF S" INCORRECT RESULT: " ERROR LEAVE THEN \ jmt
- = 0= IF ABORT" INCORRECT RESULT: " THEN \ jmt : colorised message
- LOOP
- THEN
- ELSE \ DEPTH MISMATCH
-\ S" WRONG NUMBER OF RESULTS: " ERROR \ jmt
- ABORT" WRONG NUMBER OF RESULTS: " \ jmt : colorised message
- THEN ;
-
-: TESTING \ ( -- ) TALKING COMMENT.
- SOURCE VERBOSE @
- IF DUP >R TYPE CR R> >IN !
- ELSE >IN ! DROP [CHAR] * EMIT
- THEN ;
-
-\ From: John Hayes S1I
-\ Subject: core.fr
-\ Date: Mon, 27 Nov 95 13:10
-
-\ (C) 1995 JOHNS HOPKINS UNIVERSITY / APPLIED PHYSICS LABORATORY
-\ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS.
-\ VERSION 1.2
-\ THIS PROGRAM TESTS THE CORE WORDS OF AN ANS FORTH SYSTEM.
-\ THE PROGRAM ASSUMES A TWO'S COMPLEMENT IMPLEMENTATION WHERE
-\ THE RANGE OF SIGNED NUMBERS IS -2^(N-1) ... 2^(N-1)-1 AND
-\ THE RANGE OF UNSIGNED NUMBERS IS 0 ... 2^(N)-1.
-\ I HAVEN'T FIGURED OUT HOW TO TEST KEY, QUIT, ABORT, OR ABORT"...
-\ I ALSO HAVEN'T THOUGHT OF A WAY TO TEST ENVIRONMENT?...
-
-CR
-TESTING CORE WORDS
-HEX
-
-\ ------------------------------------------------------------------------
-TESTING BASIC ASSUMPTIONS
-
-T{ -> }T \ START WITH CLEAN SLATE
-( TEST IF ANY BITS ARE SET; ANSWER IN BASE 1 )
-T{ : BITSSET? IF 0 0 ELSE 0 THEN ; -> }T
-T{ 0 BITSSET? -> 0 }T ( ZERO IS ALL BITS CLEAR )
-T{ 1 BITSSET? -> 0 0 }T ( OTHER NUMBER HAVE AT LEAST ONE BIT )
-T{ -1 BITSSET? -> 0 0 }T
-
-\ ------------------------------------------------------------------------
-TESTING BOOLEANS: INVERT AND OR XOR
-
-T{ 0 0 AND -> 0 }T
-T{ 0 1 AND -> 0 }T
-T{ 1 0 AND -> 0 }T
-T{ 1 1 AND -> 1 }T
-
-T{ 0 INVERT 1 AND -> 1 }T
-T{ 1 INVERT 1 AND -> 0 }T
-
-0 CONSTANT 0S
-0 INVERT CONSTANT 1S
-
-T{ 0S INVERT -> 1S }T
-T{ 1S INVERT -> 0S }T
-
-T{ 0S 0S AND -> 0S }T
-T{ 0S 1S AND -> 0S }T
-T{ 1S 0S AND -> 0S }T
-T{ 1S 1S AND -> 1S }T
-
-T{ 0S 0S OR -> 0S }T
-T{ 0S 1S OR -> 1S }T
-T{ 1S 0S OR -> 1S }T
-T{ 1S 1S OR -> 1S }T
-
-T{ 0S 0S XOR -> 0S }T
-T{ 0S 1S XOR -> 1S }T
-T{ 1S 0S XOR -> 1S }T
-T{ 1S 1S XOR -> 0S }T
-
-\ ------------------------------------------------------------------------
-TESTING 2* 2/ LSHIFT RSHIFT
-
-( WE TRUST 1S, INVERT, AND BITSSET?; WE WILL CONFIRM RSHIFT LATER )
-1S 1 RSHIFT INVERT CONSTANT MSB
-T{ MSB BITSSET? -> 0 0 }T
-
-T{ 0S 2* -> 0S }T
-T{ 1 2* -> 2 }T
-T{ 4000 2* -> 8000 }T
-T{ 1S 2* 1 XOR -> 1S }T
-T{ MSB 2* -> 0S }T
-
-T{ 0S 2/ -> 0S }T
-T{ 1 2/ -> 0 }T
-T{ 4000 2/ -> 2000 }T
-T{ 1S 2/ -> 1S }T \ MSB PROPOGATED
-T{ 1S 1 XOR 2/ -> 1S }T
-T{ MSB 2/ MSB AND -> MSB }T
-
-T{ 1 0 LSHIFT -> 1 }T
-T{ 1 1 LSHIFT -> 2 }T
-T{ 1 2 LSHIFT -> 4 }T
-T{ 1 F LSHIFT -> 8000 }T \ BIGGEST GUARANTEED SHIFT
-T{ 1S 1 LSHIFT 1 XOR -> 1S }T
-T{ MSB 1 LSHIFT -> 0 }T
-
-T{ 1 0 RSHIFT -> 1 }T
-T{ 1 1 RSHIFT -> 0 }T
-T{ 2 1 RSHIFT -> 1 }T
-T{ 4 2 RSHIFT -> 1 }T
-T{ 8000 F RSHIFT -> 1 }T \ BIGGEST
-T{ MSB 1 RSHIFT MSB AND -> 0 }T \ RSHIFT ZERO FILLS MSBS
-T{ MSB 1 RSHIFT 2* -> MSB }T
-
-\ ------------------------------------------------------------------------
-TESTING COMPARISONS: 0= = 0< < > U< MIN MAX
-0 INVERT CONSTANT MAX-UINT
-0 INVERT 1 RSHIFT CONSTANT MAX-INT
-0 INVERT 1 RSHIFT INVERT CONSTANT MIN-INT
-0 INVERT 1 RSHIFT CONSTANT MID-UINT
-0 INVERT 1 RSHIFT INVERT CONSTANT MID-UINT+1
-
-0S CONSTANT <FALSE>
-1S CONSTANT <TRUE>
-
-T{ 0 0= -> <TRUE> }T
-T{ 1 0= -> <FALSE> }T
-T{ 2 0= -> <FALSE> }T
-T{ -1 0= -> <FALSE> }T
-T{ MAX-UINT 0= -> <FALSE> }T
-T{ MIN-INT 0= -> <FALSE> }T
-T{ MAX-INT 0= -> <FALSE> }T
-
-T{ 0 0 = -> <TRUE> }T
-T{ 1 1 = -> <TRUE> }T
-T{ -1 -1 = -> <TRUE> }T
-T{ 1 0 = -> <FALSE> }T
-T{ -1 0 = -> <FALSE> }T
-T{ 0 1 = -> <FALSE> }T
-T{ 0 -1 = -> <FALSE> }T
-
-T{ 0 0< -> <FALSE> }T
-T{ -1 0< -> <TRUE> }T
-T{ MIN-INT 0< -> <TRUE> }T
-T{ 1 0< -> <FALSE> }T
-T{ MAX-INT 0< -> <FALSE> }T
-
-T{ 0 1 < -> <TRUE> }T
-T{ 1 2 < -> <TRUE> }T
-T{ -1 0 < -> <TRUE> }T
-T{ -1 1 < -> <TRUE> }T
-T{ MIN-INT 0 < -> <TRUE> }T
-T{ MIN-INT MAX-INT < -> <TRUE> }T
-T{ 0 MAX-INT < -> <TRUE> }T
-T{ 0 0 < -> <FALSE> }T
-T{ 1 1 < -> <FALSE> }T
-T{ 1 0 < -> <FALSE> }T
-T{ 2 1 < -> <FALSE> }T
-T{ 0 -1 < -> <FALSE> }T
-T{ 1 -1 < -> <FALSE> }T
-T{ 0 MIN-INT < -> <FALSE> }T
-T{ MAX-INT MIN-INT < -> <FALSE> }T
-T{ MAX-INT 0 < -> <FALSE> }T
-
-T{ 0 1 > -> <FALSE> }T
-T{ 1 2 > -> <FALSE> }T
-T{ -1 0 > -> <FALSE> }T
-T{ -1 1 > -> <FALSE> }T
-T{ MIN-INT 0 > -> <FALSE> }T
-T{ MIN-INT MAX-INT > -> <FALSE> }T
-T{ 0 MAX-INT > -> <FALSE> }T
-T{ 0 0 > -> <FALSE> }T
-T{ 1 1 > -> <FALSE> }T
-T{ 1 0 > -> <TRUE> }T
-T{ 2 1 > -> <TRUE> }T
-T{ 0 -1 > -> <TRUE> }T
-T{ 1 -1 > -> <TRUE> }T
-T{ 0 MIN-INT > -> <TRUE> }T
-T{ MAX-INT MIN-INT > -> <TRUE> }T
-T{ MAX-INT 0 > -> <TRUE> }T
-
-T{ 0 1 U< -> <TRUE> }T
-T{ 1 2 U< -> <TRUE> }T
-T{ 0 MID-UINT U< -> <TRUE> }T
-T{ 0 MAX-UINT U< -> <TRUE> }T
-T{ MID-UINT MAX-UINT U< -> <TRUE> }T
-T{ 0 0 U< -> <FALSE> }T
-T{ 1 1 U< -> <FALSE> }T
-T{ 1 0 U< -> <FALSE> }T
-T{ 2 1 U< -> <FALSE> }T
-T{ MID-UINT 0 U< -> <FALSE> }T
-T{ MAX-UINT 0 U< -> <FALSE> }T
-T{ MAX-UINT MID-UINT U< -> <FALSE> }T
-
-T{ 0 1 MIN -> 0 }T
-T{ 1 2 MIN -> 1 }T
-T{ -1 0 MIN -> -1 }T
-T{ -1 1 MIN -> -1 }T
-T{ MIN-INT 0 MIN -> MIN-INT }T
-T{ MIN-INT MAX-INT MIN -> MIN-INT }T
-T{ 0 MAX-INT MIN -> 0 }T
-T{ 0 0 MIN -> 0 }T
-T{ 1 1 MIN -> 1 }T
-T{ 1 0 MIN -> 0 }T
-T{ 2 1 MIN -> 1 }T
-T{ 0 -1 MIN -> -1 }T
-T{ 1 -1 MIN -> -1 }T
-T{ 0 MIN-INT MIN -> MIN-INT }T
-T{ MAX-INT MIN-INT MIN -> MIN-INT }T
-T{ MAX-INT 0 MIN -> 0 }T
-
-T{ 0 1 MAX -> 1 }T
-T{ 1 2 MAX -> 2 }T
-T{ -1 0 MAX -> 0 }T
-T{ -1 1 MAX -> 1 }T
-T{ MIN-INT 0 MAX -> 0 }T
-T{ MIN-INT MAX-INT MAX -> MAX-INT }T
-T{ 0 MAX-INT MAX -> MAX-INT }T
-T{ 0 0 MAX -> 0 }T
-T{ 1 1 MAX -> 1 }T
-T{ 1 0 MAX -> 1 }T
-T{ 2 1 MAX -> 2 }T
-T{ 0 -1 MAX -> 0 }T
-T{ 1 -1 MAX -> 1 }T
-T{ 0 MIN-INT MAX -> 0 }T
-T{ MAX-INT MIN-INT MAX -> MAX-INT }T
-T{ MAX-INT 0 MAX -> MAX-INT }T
-
-\ ------------------------------------------------------------------------
-TESTING STACK OPS: 2DROP 2DUP 2OVER 2SWAP ?DUP DEPTH DROP DUP OVER ROT SWAP
-
-T{ 1 2 2DROP -> }T
-T{ 1 2 2DUP -> 1 2 1 2 }T
-T{ 1 2 3 4 2OVER -> 1 2 3 4 1 2 }T
-T{ 1 2 3 4 2SWAP -> 3 4 1 2 }T
-T{ 0 ?DUP -> 0 }T
-T{ 1 ?DUP -> 1 1 }T
-T{ -1 ?DUP -> -1 -1 }T
-T{ DEPTH -> 0 }T
-T{ 0 DEPTH -> 0 1 }T
-T{ 0 1 DEPTH -> 0 1 2 }T
-T{ 0 DROP -> }T
-T{ 1 2 DROP -> 1 }T
-T{ 1 DUP -> 1 1 }T
-T{ 1 2 OVER -> 1 2 1 }T
-T{ 1 2 3 ROT -> 2 3 1 }T
-T{ 1 2 SWAP -> 2 1 }T
-
-\ ------------------------------------------------------------------------
-TESTING >R R> R@
-
-T{ : GR1 >R R> ; -> }T
-T{ : GR2 >R R@ R> DROP ; -> }T
-T{ 123 GR1 -> 123 }T
-T{ 123 GR2 -> 123 }T
-T{ 1S GR1 -> 1S }T ( RETURN STACK HOLDS CELLS )
-
-\ ------------------------------------------------------------------------
-TESTING ADD/SUBTRACT: + - 1+ 1- ABS NEGATE
-
-T{ 0 5 + -> 5 }T
-T{ 5 0 + -> 5 }T
-T{ 0 -5 + -> -5 }T
-T{ -5 0 + -> -5 }T
-T{ 1 2 + -> 3 }T
-T{ 1 -2 + -> -1 }T
-T{ -1 2 + -> 1 }T
-T{ -1 -2 + -> -3 }T
-T{ -1 1 + -> 0 }T
-T{ MID-UINT 1 + -> MID-UINT+1 }T
-
-T{ 0 5 - -> -5 }T
-T{ 5 0 - -> 5 }T
-T{ 0 -5 - -> 5 }T
-T{ -5 0 - -> -5 }T
-T{ 1 2 - -> -1 }T
-T{ 1 -2 - -> 3 }T
-T{ -1 2 - -> -3 }T
-T{ -1 -2 - -> 1 }T
-T{ 0 1 - -> -1 }T
-T{ MID-UINT+1 1 - -> MID-UINT }T
-
-T{ 0 1+ -> 1 }T
-T{ -1 1+ -> 0 }T
-T{ 1 1+ -> 2 }T
-T{ MID-UINT 1+ -> MID-UINT+1 }T
-
-T{ 2 1- -> 1 }T
-T{ 1 1- -> 0 }T
-T{ 0 1- -> -1 }T
-T{ MID-UINT+1 1- -> MID-UINT }T
-
-T{ 0 NEGATE -> 0 }T
-T{ 1 NEGATE -> -1 }T
-T{ -1 NEGATE -> 1 }T
-T{ 2 NEGATE -> -2 }T
-T{ -2 NEGATE -> 2 }T
-
-T{ 0 ABS -> 0 }T
-T{ 1 ABS -> 1 }T
-T{ -1 ABS -> 1 }T
-T{ MIN-INT ABS -> MID-UINT+1 }T
-
-\ ------------------------------------------------------------------------
-TESTING MULTIPLY: S>D * M* UM*
-
-T{ 0 S>D -> 0 0 }T
-T{ 1 S>D -> 1 0 }T
-T{ 2 S>D -> 2 0 }T
-T{ -1 S>D -> -1 -1 }T
-T{ -2 S>D -> -2 -1 }T
-T{ MIN-INT S>D -> MIN-INT -1 }T
-T{ MAX-INT S>D -> MAX-INT 0 }T
-
-T{ 0 0 M* -> 0 S>D }T
-T{ 0 1 M* -> 0 S>D }T
-T{ 1 0 M* -> 0 S>D }T
-T{ 1 2 M* -> 2 S>D }T
-T{ 2 1 M* -> 2 S>D }T
-T{ 3 3 M* -> 9 S>D }T
-T{ -3 3 M* -> -9 S>D }T
-T{ 3 -3 M* -> -9 S>D }T
-T{ -3 -3 M* -> 9 S>D }T
-T{ 0 MIN-INT M* -> 0 S>D }T
-T{ 1 MIN-INT M* -> MIN-INT S>D }T
-T{ 2 MIN-INT M* -> 0 1S }T
-T{ 0 MAX-INT M* -> 0 S>D }T
-T{ 1 MAX-INT M* -> MAX-INT S>D }T
-T{ 2 MAX-INT M* -> MAX-INT 1 LSHIFT 0 }T
-T{ MIN-INT MIN-INT M* -> 0 MSB 1 RSHIFT }T
-T{ MAX-INT MIN-INT M* -> MSB MSB 2/ }T
-T{ MAX-INT MAX-INT M* -> 1 MSB 2/ INVERT }T
-
-T{ 0 0 * -> 0 }T \ TEST IDENTITIES
-T{ 0 1 * -> 0 }T
-T{ 1 0 * -> 0 }T
-T{ 1 2 * -> 2 }T
-T{ 2 1 * -> 2 }T
-T{ 3 3 * -> 9 }T
-T{ -3 3 * -> -9 }T
-T{ 3 -3 * -> -9 }T
-T{ -3 -3 * -> 9 }T
-
-T{ MID-UINT+1 1 RSHIFT 2 * -> MID-UINT+1 }T
-T{ MID-UINT+1 2 RSHIFT 4 * -> MID-UINT+1 }T
-T{ MID-UINT+1 1 RSHIFT MID-UINT+1 OR 2 * -> MID-UINT+1 }T
-
-T{ 0 0 UM* -> 0 0 }T
-T{ 0 1 UM* -> 0 0 }T
-T{ 1 0 UM* -> 0 0 }T
-T{ 1 2 UM* -> 2 0 }T
-T{ 2 1 UM* -> 2 0 }T
-T{ 3 3 UM* -> 9 0 }T
-
-T{ MID-UINT+1 1 RSHIFT 2 UM* -> MID-UINT+1 0 }T
-T{ MID-UINT+1 2 UM* -> 0 1 }T
-T{ MID-UINT+1 4 UM* -> 0 2 }T
-T{ 1S 2 UM* -> 1S 1 LSHIFT 1 }T
-T{ MAX-UINT MAX-UINT UM* -> 1 1 INVERT }T
-
-\ ------------------------------------------------------------------------
-TESTING DIVIDE: FM/MOD SM/REM UM/MOD */ */MOD / /MOD MOD
-
-T{ 0 S>D 1 FM/MOD -> 0 0 }T
-T{ 1 S>D 1 FM/MOD -> 0 1 }T
-T{ 2 S>D 1 FM/MOD -> 0 2 }T
-T{ -1 S>D 1 FM/MOD -> 0 -1 }T
-T{ -2 S>D 1 FM/MOD -> 0 -2 }T
-T{ 0 S>D -1 FM/MOD -> 0 0 }T
-T{ 1 S>D -1 FM/MOD -> 0 -1 }T
-T{ 2 S>D -1 FM/MOD -> 0 -2 }T
-T{ -1 S>D -1 FM/MOD -> 0 1 }T
-T{ -2 S>D -1 FM/MOD -> 0 2 }T
-T{ 2 S>D 2 FM/MOD -> 0 1 }T
-T{ -1 S>D -1 FM/MOD -> 0 1 }T
-T{ -2 S>D -2 FM/MOD -> 0 1 }T
-T{ 7 S>D 3 FM/MOD -> 1 2 }T
-T{ 7 S>D -3 FM/MOD -> -2 -3 }T
-T{ -7 S>D 3 FM/MOD -> 2 -3 }T
-T{ -7 S>D -3 FM/MOD -> -1 2 }T
-T{ MAX-INT S>D 1 FM/MOD -> 0 MAX-INT }T
-T{ MIN-INT S>D 1 FM/MOD -> 0 MIN-INT }T
-T{ MAX-INT S>D MAX-INT FM/MOD -> 0 1 }T
-T{ MIN-INT S>D MIN-INT FM/MOD -> 0 1 }T
-T{ 1S 1 4 FM/MOD -> 3 MAX-INT }T
-T{ 1 MIN-INT M* 1 FM/MOD -> 0 MIN-INT }T
-T{ 1 MIN-INT M* MIN-INT FM/MOD -> 0 1 }T
-T{ 2 MIN-INT M* 2 FM/MOD -> 0 MIN-INT }T
-T{ 2 MIN-INT M* MIN-INT FM/MOD -> 0 2 }T
-T{ 1 MAX-INT M* 1 FM/MOD -> 0 MAX-INT }T
-T{ 1 MAX-INT M* MAX-INT FM/MOD -> 0 1 }T
-T{ 2 MAX-INT M* 2 FM/MOD -> 0 MAX-INT }T
-T{ 2 MAX-INT M* MAX-INT FM/MOD -> 0 2 }T
-T{ MIN-INT MIN-INT M* MIN-INT FM/MOD -> 0 MIN-INT }T
-T{ MIN-INT MAX-INT M* MIN-INT FM/MOD -> 0 MAX-INT }T
-T{ MIN-INT MAX-INT M* MAX-INT FM/MOD -> 0 MIN-INT }T
-T{ MAX-INT MAX-INT M* MAX-INT FM/MOD -> 0 MAX-INT }T
-
-T{ 0 S>D 1 SM/REM -> 0 0 }T
-T{ 1 S>D 1 SM/REM -> 0 1 }T
-T{ 2 S>D 1 SM/REM -> 0 2 }T
-T{ -1 S>D 1 SM/REM -> 0 -1 }T
-T{ -2 S>D 1 SM/REM -> 0 -2 }T
-T{ 0 S>D -1 SM/REM -> 0 0 }T
-T{ 1 S>D -1 SM/REM -> 0 -1 }T
-T{ 2 S>D -1 SM/REM -> 0 -2 }T
-T{ -1 S>D -1 SM/REM -> 0 1 }T
-T{ -2 S>D -1 SM/REM -> 0 2 }T
-T{ 2 S>D 2 SM/REM -> 0 1 }T
-T{ -1 S>D -1 SM/REM -> 0 1 }T
-T{ -2 S>D -2 SM/REM -> 0 1 }T
-T{ 7 S>D 3 SM/REM -> 1 2 }T
-T{ 7 S>D -3 SM/REM -> 1 -2 }T
-T{ -7 S>D 3 SM/REM -> -1 -2 }T
-T{ -7 S>D -3 SM/REM -> -1 2 }T
-T{ MAX-INT S>D 1 SM/REM -> 0 MAX-INT }T
-T{ MIN-INT S>D 1 SM/REM -> 0 MIN-INT }T
-T{ MAX-INT S>D MAX-INT SM/REM -> 0 1 }T
-T{ MIN-INT S>D MIN-INT SM/REM -> 0 1 }T
-T{ 1S 1 4 SM/REM -> 3 MAX-INT }T
-T{ 2 MIN-INT M* 2 SM/REM -> 0 MIN-INT }T
-T{ 2 MIN-INT M* MIN-INT SM/REM -> 0 2 }T
-T{ 2 MAX-INT M* 2 SM/REM -> 0 MAX-INT }T
-T{ 2 MAX-INT M* MAX-INT SM/REM -> 0 2 }T
-T{ MIN-INT MIN-INT M* MIN-INT SM/REM -> 0 MIN-INT }T
-T{ MIN-INT MAX-INT M* MIN-INT SM/REM -> 0 MAX-INT }T
-T{ MIN-INT MAX-INT M* MAX-INT SM/REM -> 0 MIN-INT }T
-T{ MAX-INT MAX-INT M* MAX-INT SM/REM -> 0 MAX-INT }T
-
-T{ 0 0 1 UM/MOD -> 0 0 }T
-T{ 1 0 1 UM/MOD -> 0 1 }T
-T{ 1 0 2 UM/MOD -> 1 0 }T
-T{ 3 0 2 UM/MOD -> 1 1 }T
-T{ MAX-UINT 2 UM* 2 UM/MOD -> 0 MAX-UINT }T
-T{ MAX-UINT 2 UM* MAX-UINT UM/MOD -> 0 2 }T
-T{ MAX-UINT MAX-UINT UM* MAX-UINT UM/MOD -> 0 MAX-UINT }T
-
-: IFFLOORED
- [ -3 2 / -2 = INVERT ] LITERAL IF POSTPONE \ THEN ;
-
-: IFSYM
- [ -3 2 / -1 = INVERT ] LITERAL IF POSTPONE \ THEN ;
-
-\ THE SYSTEM MIGHT DO EITHER FLOORED OR SYMMETRIC DIVISION.
-\ SINCE WE HAVE ALREADY TESTED M*, FM/MOD, AND SM/REM WE CAN USE THEM IN TEST.
-
-IFFLOORED : T/MOD >R S>D R> FM/MOD ;
-IFFLOORED : T/ T/MOD SWAP DROP ;
-IFFLOORED : TMOD T/MOD DROP ;
-IFFLOORED : T*/MOD >R M* R> FM/MOD ;
-IFFLOORED : T*/ T*/MOD SWAP DROP ;
-IFSYM : T/MOD >R S>D R> SM/REM ;
-IFSYM : T/ T/MOD SWAP DROP ;
-IFSYM : TMOD T/MOD DROP ;
-IFSYM : T*/MOD >R M* R> SM/REM ;
-IFSYM : T*/ T*/MOD SWAP DROP ;
-
-T{ 0 1 /MOD -> 0 1 T/MOD }T
-T{ 1 1 /MOD -> 1 1 T/MOD }T
-T{ 2 1 /MOD -> 2 1 T/MOD }T
-T{ -1 1 /MOD -> -1 1 T/MOD }T
-T{ -2 1 /MOD -> -2 1 T/MOD }T
-T{ 0 -1 /MOD -> 0 -1 T/MOD }T
-T{ 1 -1 /MOD -> 1 -1 T/MOD }T
-T{ 2 -1 /MOD -> 2 -1 T/MOD }T
-T{ -1 -1 /MOD -> -1 -1 T/MOD }T
-T{ -2 -1 /MOD -> -2 -1 T/MOD }T
-T{ 2 2 /MOD -> 2 2 T/MOD }T
-T{ -1 -1 /MOD -> -1 -1 T/MOD }T
-T{ -2 -2 /MOD -> -2 -2 T/MOD }T
-T{ 7 3 /MOD -> 7 3 T/MOD }T
-T{ 7 -3 /MOD -> 7 -3 T/MOD }T
-T{ -7 3 /MOD -> -7 3 T/MOD }T
-T{ -7 -3 /MOD -> -7 -3 T/MOD }T
-T{ MAX-INT 1 /MOD -> MAX-INT 1 T/MOD }T
-T{ MIN-INT 1 /MOD -> MIN-INT 1 T/MOD }T
-T{ MAX-INT MAX-INT /MOD -> MAX-INT MAX-INT T/MOD }T
-T{ MIN-INT MIN-INT /MOD -> MIN-INT MIN-INT T/MOD }T
-
-T{ 0 1 / -> 0 1 T/ }T
-T{ 1 1 / -> 1 1 T/ }T
-T{ 2 1 / -> 2 1 T/ }T
-T{ -1 1 / -> -1 1 T/ }T
-T{ -2 1 / -> -2 1 T/ }T
-T{ 0 -1 / -> 0 -1 T/ }T
-T{ 1 -1 / -> 1 -1 T/ }T
-T{ 2 -1 / -> 2 -1 T/ }T
-T{ -1 -1 / -> -1 -1 T/ }T
-T{ -2 -1 / -> -2 -1 T/ }T
-T{ 2 2 / -> 2 2 T/ }T
-T{ -1 -1 / -> -1 -1 T/ }T
-T{ -2 -2 / -> -2 -2 T/ }T
-T{ 7 3 / -> 7 3 T/ }T
-T{ 7 -3 / -> 7 -3 T/ }T
-T{ -7 3 / -> -7 3 T/ }T
-T{ -7 -3 / -> -7 -3 T/ }T
-T{ MAX-INT 1 / -> MAX-INT 1 T/ }T
-T{ MIN-INT 1 / -> MIN-INT 1 T/ }T
-T{ MAX-INT MAX-INT / -> MAX-INT MAX-INT T/ }T
-T{ MIN-INT MIN-INT / -> MIN-INT MIN-INT T/ }T
-
-T{ 0 1 MOD -> 0 1 TMOD }T
-T{ 1 1 MOD -> 1 1 TMOD }T
-T{ 2 1 MOD -> 2 1 TMOD }T
-T{ -1 1 MOD -> -1 1 TMOD }T
-T{ -2 1 MOD -> -2 1 TMOD }T
-T{ 0 -1 MOD -> 0 -1 TMOD }T
-T{ 1 -1 MOD -> 1 -1 TMOD }T
-T{ 2 -1 MOD -> 2 -1 TMOD }T
-T{ -1 -1 MOD -> -1 -1 TMOD }T
-T{ -2 -1 MOD -> -2 -1 TMOD }T
-T{ 2 2 MOD -> 2 2 TMOD }T
-T{ -1 -1 MOD -> -1 -1 TMOD }T
-T{ -2 -2 MOD -> -2 -2 TMOD }T
-T{ 7 3 MOD -> 7 3 TMOD }T
-T{ 7 -3 MOD -> 7 -3 TMOD }T
-T{ -7 3 MOD -> -7 3 TMOD }T
-T{ -7 -3 MOD -> -7 -3 TMOD }T
-T{ MAX-INT 1 MOD -> MAX-INT 1 TMOD }T
-T{ MIN-INT 1 MOD -> MIN-INT 1 TMOD }T
-T{ MAX-INT MAX-INT MOD -> MAX-INT MAX-INT TMOD }T
-T{ MIN-INT MIN-INT MOD -> MIN-INT MIN-INT TMOD }T
-
-T{ 0 2 1 */ -> 0 2 1 T*/ }T
-T{ 1 2 1 */ -> 1 2 1 T*/ }T
-T{ 2 2 1 */ -> 2 2 1 T*/ }T
-T{ -1 2 1 */ -> -1 2 1 T*/ }T
-T{ -2 2 1 */ -> -2 2 1 T*/ }T
-T{ 0 2 -1 */ -> 0 2 -1 T*/ }T
-T{ 1 2 -1 */ -> 1 2 -1 T*/ }T
-T{ 2 2 -1 */ -> 2 2 -1 T*/ }T
-T{ -1 2 -1 */ -> -1 2 -1 T*/ }T
-T{ -2 2 -1 */ -> -2 2 -1 T*/ }T
-T{ 2 2 2 */ -> 2 2 2 T*/ }T
-T{ -1 2 -1 */ -> -1 2 -1 T*/ }T
-T{ -2 2 -2 */ -> -2 2 -2 T*/ }T
-T{ 7 2 3 */ -> 7 2 3 T*/ }T
-T{ 7 2 -3 */ -> 7 2 -3 T*/ }T
-T{ -7 2 3 */ -> -7 2 3 T*/ }T
-T{ -7 2 -3 */ -> -7 2 -3 T*/ }T
-T{ MAX-INT 2 MAX-INT */ -> MAX-INT 2 MAX-INT T*/ }T
-T{ MIN-INT 2 MIN-INT */ -> MIN-INT 2 MIN-INT T*/ }T
-
-T{ 0 2 1 */MOD -> 0 2 1 T*/MOD }T
-T{ 1 2 1 */MOD -> 1 2 1 T*/MOD }T
-T{ 2 2 1 */MOD -> 2 2 1 T*/MOD }T
-T{ -1 2 1 */MOD -> -1 2 1 T*/MOD }T
-T{ -2 2 1 */MOD -> -2 2 1 T*/MOD }T
-T{ 0 2 -1 */MOD -> 0 2 -1 T*/MOD }T
-T{ 1 2 -1 */MOD -> 1 2 -1 T*/MOD }T
-T{ 2 2 -1 */MOD -> 2 2 -1 T*/MOD }T
-T{ -1 2 -1 */MOD -> -1 2 -1 T*/MOD }T
-T{ -2 2 -1 */MOD -> -2 2 -1 T*/MOD }T
-T{ 2 2 2 */MOD -> 2 2 2 T*/MOD }T
-T{ -1 2 -1 */MOD -> -1 2 -1 T*/MOD }T
-T{ -2 2 -2 */MOD -> -2 2 -2 T*/MOD }T
-T{ 7 2 3 */MOD -> 7 2 3 T*/MOD }T
-T{ 7 2 -3 */MOD -> 7 2 -3 T*/MOD }T
-T{ -7 2 3 */MOD -> -7 2 3 T*/MOD }T
-T{ -7 2 -3 */MOD -> -7 2 -3 T*/MOD }T
-T{ MAX-INT 2 MAX-INT */MOD -> MAX-INT 2 MAX-INT T*/MOD }T
-T{ MIN-INT 2 MIN-INT */MOD -> MIN-INT 2 MIN-INT T*/MOD }T
-
-\ ------------------------------------------------------------------------
-TESTING HERE , @ ! CELL+ CELLS C, C@ C! CHARS 2@ 2! ALIGN ALIGNED +! ALLOT
-
-HERE 1 ALLOT
-HERE
-CONSTANT 2NDA
-CONSTANT 1STA
-T{ 1STA 2NDA U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT
-T{ 1STA 1+ -> 2NDA }T \ ... BY ONE ADDRESS UNIT
-( MISSING TEST: NEGATIVE ALLOT )
-
-HERE 1 ,
-HERE 2 ,
-CONSTANT 2ND
-CONSTANT 1ST
-T{ 1ST 2ND U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT
-T{ 1ST CELL+ -> 2ND }T \ ... BY ONE CELL
-T{ 1ST 1 CELLS + -> 2ND }T
-T{ 1ST @ 2ND @ -> 1 2 }T
-T{ 5 1ST ! -> }T
-T{ 1ST @ 2ND @ -> 5 2 }T
-T{ 6 2ND ! -> }T
-T{ 1ST @ 2ND @ -> 5 6 }T
-T{ 1ST 2@ -> 6 5 }T
-T{ 2 1 1ST 2! -> }T
-T{ 1ST 2@ -> 2 1 }T
-T{ 1S 1ST ! 1ST @ -> 1S }T \ CAN STORE CELL-WIDE VALUE
-
-HERE 1 C,
-HERE 2 C,
-CONSTANT 2NDC
-CONSTANT 1STC
-T{ 1STC 2NDC U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT
-T{ 1STC CHAR+ -> 2NDC }T \ ... BY ONE CHAR
-T{ 1STC 1 CHARS + -> 2NDC }T
-T{ 1STC C@ 2NDC C@ -> 1 2 }T
-T{ 3 1STC C! -> }T
-T{ 1STC C@ 2NDC C@ -> 3 2 }T
-T{ 4 2NDC C! -> }T
-T{ 1STC C@ 2NDC C@ -> 3 4 }T
-
-ALIGN 1 ALLOT HERE ALIGN HERE 3 CELLS ALLOT
-CONSTANT A-ADDR CONSTANT UA-ADDR
-T{ UA-ADDR ALIGNED -> A-ADDR }T
-T{ 1 A-ADDR C! A-ADDR C@ -> 1 }T
-T{ 1234 A-ADDR ! A-ADDR @ -> 1234 }T
-T{ 123 456 A-ADDR 2! A-ADDR 2@ -> 123 456 }T
-T{ 2 A-ADDR CHAR+ C! A-ADDR CHAR+ C@ -> 2 }T
-T{ 3 A-ADDR CELL+ C! A-ADDR CELL+ C@ -> 3 }T
-T{ 1234 A-ADDR CELL+ ! A-ADDR CELL+ @ -> 1234 }T
-T{ 123 456 A-ADDR CELL+ 2! A-ADDR CELL+ 2@ -> 123 456 }T
-
-: BITS ( X -- U )
- 0 SWAP BEGIN DUP WHILE DUP MSB AND IF >R 1+ R> THEN 2* REPEAT DROP ;
-( CHARACTERS >= 1 AU, <= SIZE OF CELL, >= 8 BITS )
-T{ 1 CHARS 1 < -> <FALSE> }T
-T{ 1 CHARS 1 CELLS > -> <FALSE> }T
-( TBD: HOW TO FIND NUMBER OF BITS? )
-
-( CELLS >= 1 AU, INTEGRAL MULTIPLE OF CHAR SIZE, >= 16 BITS )
-T{ 1 CELLS 1 < -> <FALSE> }T
-T{ 1 CELLS 1 CHARS MOD -> 0 }T
-T{ 1S BITS 10 < -> <FALSE> }T
-
-T{ 0 1ST ! -> }T
-T{ 1 1ST +! -> }T
-T{ 1ST @ -> 1 }T
-T{ -1 1ST +! 1ST @ -> 0 }T
-
-\ ------------------------------------------------------------------------
-TESTING CHAR [CHAR] [ ] BL S"
-
-T{ BL -> 20 }T
-T{ CHAR X -> 58 }T
-T{ CHAR HELLO -> 48 }T
-T{ : GC1 [CHAR] X ; -> }T
-T{ : GC2 [CHAR] HELLO ; -> }T
-T{ GC1 -> 58 }T
-T{ GC2 -> 48 }T
-T{ : GC3 [ GC1 ] LITERAL ; -> }T
-T{ GC3 -> 58 }T
-T{ : GC4 S" XY" ; -> }T
-T{ GC4 SWAP DROP -> 2 }T
-T{ GC4 DROP DUP C@ SWAP CHAR+ C@ -> 58 59 }T
-
-\ ------------------------------------------------------------------------
-TESTING ' ['] FIND EXECUTE IMMEDIATE COUNT LITERAL POSTPONE STATE
-
-T{ : GT1 123 ; -> }T
-T{ ' GT1 EXECUTE -> 123 }T
-T{ : GT2 ['] GT1 ; IMMEDIATE -> }T
-T{ GT2 EXECUTE -> 123 }T
-HERE 3 C, CHAR G C, CHAR T C, CHAR 1 C, CONSTANT GT1STRING
-HERE 3 C, CHAR G C, CHAR T C, CHAR 2 C, CONSTANT GT2STRING
-T{ GT1STRING FIND -> ' GT1 -1 }T
-T{ GT2STRING FIND -> ' GT2 1 }T
-( HOW TO SEARCH FOR NON-EXISTENT WORD? )
-T{ : GT3 GT2 LITERAL ; -> }T
-T{ GT3 -> ' GT1 }T
-T{ GT1STRING COUNT -> GT1STRING CHAR+ 3 }T
-
-T{ : GT4 POSTPONE GT1 ; IMMEDIATE -> }T
-T{ : GT5 GT4 ; -> }T
-T{ GT5 -> 123 }T
-T{ : GT6 345 ; IMMEDIATE -> }T
-T{ : GT7 POSTPONE GT6 ; -> }T
-T{ GT7 -> 345 }T
-
-T{ : GT8 STATE @ ; IMMEDIATE -> }T
-T{ GT8 -> 0 }T
-T{ : GT9 GT8 LITERAL ; -> }T
-T{ GT9 0= -> <FALSE> }T
-
-\ ------------------------------------------------------------------------
-TESTING IF ELSE THEN BEGIN WHILE REPEAT UNTIL RECURSE
-
-T{ : GI1 IF 123 THEN ; -> }T
-T{ : GI2 IF 123 ELSE 234 THEN ; -> }T
-T{ 0 GI1 -> }T
-T{ 1 GI1 -> 123 }T
-T{ -1 GI1 -> 123 }T
-T{ 0 GI2 -> 234 }T
-T{ 1 GI2 -> 123 }T
-T{ -1 GI1 -> 123 }T
-
-T{ : GI3 BEGIN DUP 5 < WHILE DUP 1+ REPEAT ; -> }T
-T{ 0 GI3 -> 0 1 2 3 4 5 }T
-T{ 4 GI3 -> 4 5 }T
-T{ 5 GI3 -> 5 }T
-T{ 6 GI3 -> 6 }T
-
-T{ : GI4 BEGIN DUP 1+ DUP 5 > UNTIL ; -> }T
-T{ 3 GI4 -> 3 4 5 6 }T
-T{ 5 GI4 -> 5 6 }T
-T{ 6 GI4 -> 6 7 }T
-
-T{ : GI5 BEGIN DUP 2 > WHILE DUP 5 < WHILE DUP 1+ REPEAT 123 ELSE 345 THEN ; -> }T
-T{ 1 GI5 -> 1 345 }T
-T{ 2 GI5 -> 2 345 }T
-T{ 3 GI5 -> 3 4 5 123 }T
-T{ 4 GI5 -> 4 5 123 }T
-T{ 5 GI5 -> 5 123 }T
-
-T{ : GI6 ( N -- 0,1,..N ) DUP IF DUP >R 1- RECURSE R> THEN ; -> }T
-T{ 0 GI6 -> 0 }T
-T{ 1 GI6 -> 0 1 }T
-T{ 2 GI6 -> 0 1 2 }T
-T{ 3 GI6 -> 0 1 2 3 }T
-T{ 4 GI6 -> 0 1 2 3 4 }T
-
-\ ------------------------------------------------------------------------
-TESTING DO LOOP +LOOP I J UNLOOP LEAVE EXIT
-
-T{ : GD1 DO I LOOP ; -> }T
-T{ 4 1 GD1 -> 1 2 3 }T
-T{ 2 -1 GD1 -> -1 0 1 }T
-T{ MID-UINT+1 MID-UINT GD1 -> MID-UINT }T
-
-T{ : GD2 DO I -1 +LOOP ; -> }T
-T{ 1 4 GD2 -> 4 3 2 1 }T
-T{ -1 2 GD2 -> 2 1 0 -1 }T
-T{ MID-UINT MID-UINT+1 GD2 -> MID-UINT+1 MID-UINT }T
-
-T{ : GD3 DO 1 0 DO J LOOP LOOP ; -> }T
-T{ 4 1 GD3 -> 1 2 3 }T
-T{ 2 -1 GD3 -> -1 0 1 }T
-T{ MID-UINT+1 MID-UINT GD3 -> MID-UINT }T
-
-T{ : GD4 DO 1 0 DO J LOOP -1 +LOOP ; -> }T
-T{ 1 4 GD4 -> 4 3 2 1 }T
-T{ -1 2 GD4 -> 2 1 0 -1 }T
-T{ MID-UINT MID-UINT+1 GD4 -> MID-UINT+1 MID-UINT }T
-
-T{ : GD5 123 SWAP 0 DO I 4 > IF DROP 234 LEAVE THEN LOOP ; -> }T
-T{ 1 GD5 -> 123 }T
-T{ 5 GD5 -> 123 }T
-T{ 6 GD5 -> 234 }T
-
-T{ : GD6 ( PAT: T{0 0}T,T{0 0}TT{1 0}TT{1 1}T,T{0 0}TT{1 0}TT{1 1}TT{2 0}TT{2 1}TT{2 2}T )
- 0 SWAP 0 DO
- I 1+ 0 DO I J + 3 = IF I UNLOOP I UNLOOP EXIT THEN 1+ LOOP
- LOOP ; -> }T
-T{ 1 GD6 -> 1 }T
-T{ 2 GD6 -> 3 }T
-T{ 3 GD6 -> 4 1 2 }T
-
-\ ------------------------------------------------------------------------
-TESTING DEFINING WORDS: : ; CONSTANT VARIABLE CREATE DOES> >BODY
-
-T{ 123 CONSTANT X123 -> }T
-T{ X123 -> 123 }T
-T{ : EQU CONSTANT ; -> }T
-T{ X123 EQU Y123 -> }T
-T{ Y123 -> 123 }T
-
-T{ VARIABLE V1 -> }T
-T{ 123 V1 ! -> }T
-T{ V1 @ -> 123 }T
-
-T{ : NOP : POSTPONE ; ; -> }T
-T{ NOP NOP1 NOP NOP2 -> }T
-T{ NOP1 -> }T
-T{ NOP2 -> }T
-
-T{ : DOES1 DOES> @ 1 + ; -> }T
-T{ : DOES2 DOES> @ 2 + ; -> }T
-T{ CREATE CR1 -> }T
-T{ CR1 -> HERE }T
-T{ ' CR1 >BODY -> HERE }T
-T{ 1 , -> }T
-T{ CR1 @ -> 1 }T
-T{ DOES1 -> }T
-T{ CR1 -> 2 }T
-T{ DOES2 -> }T
-T{ CR1 -> 3 }T
-
-T{ : WEIRD: CREATE DOES> 1 + DOES> 2 + ; -> }T
-T{ WEIRD: W1 -> }T
-T{ ' W1 >BODY -> HERE }T
-T{ W1 -> HERE 1 + }T
-T{ W1 -> HERE 2 + }T
-
-\ ------------------------------------------------------------------------
-TESTING EVALUATE
-
-: GE1 S" 123" ; IMMEDIATE
-: GE2 S" 123 1+" ; IMMEDIATE
-: GE3 S" : GE4 345 ;" ;
-: GE5 EVALUATE ; IMMEDIATE
-
-T{ GE1 EVALUATE -> 123 }T ( TEST EVALUATE IN INTERP. STATE )
-T{ GE2 EVALUATE -> 124 }T
-T{ GE3 EVALUATE -> }T
-T{ GE4 -> 345 }T
-
-T{ : GE6 GE1 GE5 ; -> }T ( TEST EVALUATE IN COMPILE STATE )
-T{ GE6 -> 123 }T
-T{ : GE7 GE2 GE5 ; -> }T
-T{ GE7 -> 124 }T
-
-\ ------------------------------------------------------------------------
-TESTING SOURCE >IN WORD
-
-: GS1 S" SOURCE" 2DUP EVALUATE
- >R SWAP >R = R> R> = ;
-T{ GS1 -> <TRUE> <TRUE> }T
-
-VARIABLE SCANS
-: RESCAN? -1 SCANS +! SCANS @ IF 0 >IN ! THEN ;
-
-T{ 2 SCANS !
-345 RESCAN?
--> 345 345 }T
-
-: GS2 5 SCANS ! S" 123 RESCAN?" EVALUATE ;
-T{ GS2 -> 123 123 123 123 123 }T
-
-: GS3 WORD COUNT SWAP C@ ;
-T{ BL GS3 HELLO -> 5 CHAR H }T
-T{ CHAR " GS3 GOODBYE" -> 7 CHAR G }T
-T{ BL GS3
-DROP -> 0 }T \ BLANK LINE RETURN ZERO-LENGTH STRING
-
-: GS4 SOURCE >IN ! DROP ;
-T{ GS4 123 456
--> }T
-
-\ ------------------------------------------------------------------------
-TESTING <# # #S #> HOLD SIGN BASE >NUMBER HEX DECIMAL
-
-: S= \ ( ADDR1 C1 ADDR2 C2 -- T/F ) COMPARE TWO STRINGS.
- >R SWAP R@ = IF \ MAKE SURE STRINGS HAVE SAME LENGTH
- R> ?DUP IF \ IF NON-EMPTY STRINGS
- 0 DO
- OVER C@ OVER C@ - IF
- 2DROP <FALSE> UNLOOP EXIT THEN
- SWAP CHAR+ SWAP CHAR+
- LOOP
- THEN
- 2DROP <TRUE> \ IF WE GET HERE, STRINGS MATCH
- ELSE
- R> DROP 2DROP <FALSE> \ LENGTHS MISMATCH
- THEN ;
-
-: GP1 <# 41 HOLD 42 HOLD 0 0 #> S" BA" S= ;
-T{ GP1 -> <TRUE> }T
-
-: GP2 <# -1 SIGN 0 SIGN -1 SIGN 0 0 #> S" --" S= ;
-T{ GP2 -> <TRUE> }T
-
-: GP3 <# 1 0 # # #> S" 01" S= ;
-T{ GP3 -> <TRUE> }T
-
-: GP4 <# 1 0 #S #> S" 1" S= ;
-T{ GP4 -> <TRUE> }T
-
-24 CONSTANT MAX-BASE \ BASE 2 .. 36
-: COUNT-BITS
- 0 0 INVERT BEGIN DUP WHILE >R 1+ R> 2* REPEAT DROP ;
-COUNT-BITS 2* CONSTANT #BITS-UD \ NUMBER OF BITS IN UD
-
-: GP5
- BASE @ <TRUE>
- MAX-BASE 1+ 2 DO \ FOR EACH POSSIBLE BASE
- I BASE ! \ TBD: ASSUMES BASE WORKS
- I 0 <# #S #> S" 10" S= AND
- LOOP
- SWAP BASE ! ;
-T{ GP5 -> <TRUE> }T
-
-: GP6
- BASE @ >R 2 BASE !
- MAX-UINT MAX-UINT <# #S #> \ MAXIMUM UD TO BINARY
- R> BASE ! \ S: C-ADDR U
- DUP #BITS-UD = SWAP
- 0 DO \ S: C-ADDR FLAG
- OVER C@ [CHAR] 1 = AND \ ALL ONES
- >R CHAR+ R>
- LOOP SWAP DROP ;
-T{ GP6 -> <TRUE> }T
-
-: GP7
- BASE @ >R MAX-BASE BASE !
- <TRUE>
- A 0 DO
- I 0 <# #S #>
- 1 = SWAP C@ I 30 + = AND AND
- LOOP
- MAX-BASE A DO
- I 0 <# #S #>
- 1 = SWAP C@ 41 I A - + = AND AND
- LOOP
- R> BASE ! ;
-
-T{ GP7 -> <TRUE> }T
-
-\ >NUMBER TESTS
-CREATE GN-BUF 0 C,
-: GN-STRING GN-BUF 1 ;
-: GN-CONSUMED GN-BUF CHAR+ 0 ;
-: GN' [CHAR] ' WORD CHAR+ C@ GN-BUF C! GN-STRING ;
-
-T{ 0 0 GN' 0' >NUMBER -> 0 0 GN-CONSUMED }T
-T{ 0 0 GN' 1' >NUMBER -> 1 0 GN-CONSUMED }T
-T{ 1 0 GN' 1' >NUMBER -> BASE @ 1+ 0 GN-CONSUMED }T
-T{ 0 0 GN' -' >NUMBER -> 0 0 GN-STRING }T \ SHOULD FAIL TO CONVERT THESE
-T{ 0 0 GN' +' >NUMBER -> 0 0 GN-STRING }T
-T{ 0 0 GN' .' >NUMBER -> 0 0 GN-STRING }T
-
-: >NUMBER-BASED
- BASE @ >R BASE ! >NUMBER R> BASE ! ;
-
-T{ 0 0 GN' 2' 10 >NUMBER-BASED -> 2 0 GN-CONSUMED }T
-T{ 0 0 GN' 2' 2 >NUMBER-BASED -> 0 0 GN-STRING }T
-T{ 0 0 GN' F' 10 >NUMBER-BASED -> F 0 GN-CONSUMED }T
-T{ 0 0 GN' G' 10 >NUMBER-BASED -> 0 0 GN-STRING }T
-T{ 0 0 GN' G' MAX-BASE >NUMBER-BASED -> 10 0 GN-CONSUMED }T
-T{ 0 0 GN' Z' MAX-BASE >NUMBER-BASED -> 23 0 GN-CONSUMED }T
-
-: GN1 \ ( UD BASE -- UD' LEN ) UD SHOULD EQUAL UD' AND LEN SHOULD BE ZERO.
- BASE @ >R BASE !
- <# #S #>
- 0 0 2SWAP >NUMBER SWAP DROP \ RETURN LENGTH ONLY
- R> BASE ! ;
-T{ 0 0 2 GN1 -> 0 0 0 }T
-T{ MAX-UINT 0 2 GN1 -> MAX-UINT 0 0 }T
-T{ MAX-UINT DUP 2 GN1 -> MAX-UINT DUP 0 }T
-T{ 0 0 MAX-BASE GN1 -> 0 0 0 }T
-T{ MAX-UINT 0 MAX-BASE GN1 -> MAX-UINT 0 0 }T
-T{ MAX-UINT DUP MAX-BASE GN1 -> MAX-UINT DUP 0 }T
-
-: GN2 \ ( -- 16 10 )
- BASE @ >R HEX BASE @ DECIMAL BASE @ R> BASE ! ;
-T{ GN2 -> 10 A }T
-
-\ ------------------------------------------------------------------------
-TESTING FILL MOVE
-
-CREATE FBUF 00 C, 00 C, 00 C,
-CREATE SBUF 12 C, 34 C, 56 C,
-: SEEBUF FBUF C@ FBUF CHAR+ C@ FBUF CHAR+ CHAR+ C@ ;
-
-T{ FBUF 0 20 FILL -> }T
-T{ SEEBUF -> 00 00 00 }T
-
-T{ FBUF 1 20 FILL -> }T
-T{ SEEBUF -> 20 00 00 }T
-
-T{ FBUF 3 20 FILL -> }T
-T{ SEEBUF -> 20 20 20 }T
-
-T{ FBUF FBUF 3 CHARS MOVE -> }T \ BIZARRE SPECIAL CASE
-T{ SEEBUF -> 20 20 20 }T
-
-T{ SBUF FBUF 0 CHARS MOVE -> }T
-T{ SEEBUF -> 20 20 20 }T
-
-T{ SBUF FBUF 1 CHARS MOVE -> }T
-T{ SEEBUF -> 12 20 20 }T
-
-T{ SBUF FBUF 3 CHARS MOVE -> }T
-T{ SEEBUF -> 12 34 56 }T
-
-T{ FBUF FBUF CHAR+ 2 CHARS MOVE -> }T
-T{ SEEBUF -> 12 12 34 }T
-
-T{ FBUF CHAR+ FBUF 2 CHARS MOVE -> }T
-T{ SEEBUF -> 12 34 34 }T
-
-\ ------------------------------------------------------------------------
-TESTING OUTPUT: . ." CR EMIT SPACE SPACES TYPE U.
-
-: OUTPUT-TEST
- ." YOU SHOULD SEE THE STANDARD GRAPHIC CHARACTERS:" CR
- 41 BL DO I EMIT LOOP CR
- 61 41 DO I EMIT LOOP CR
- 7F 61 DO I EMIT LOOP CR
- ." YOU SHOULD SEE 0-9 SEPARATED BY A SPACE:" CR
- 9 1+ 0 DO I . LOOP CR
- ." YOU SHOULD SEE 0-9 (WITH NO SPACES):" CR
- [CHAR] 9 1+ [CHAR] 0 DO I 0 SPACES EMIT LOOP CR
- ." YOU SHOULD SEE A-G SEPARATED BY A SPACE:" CR
- [CHAR] G 1+ [CHAR] A DO I EMIT SPACE LOOP CR
- ." YOU SHOULD SEE 0-5 SEPARATED BY TWO SPACES:" CR
- 5 1+ 0 DO I [CHAR] 0 + EMIT 2 SPACES LOOP CR
- ." YOU SHOULD SEE TWO SEPARATE LINES:" CR
- S" LINE 1" TYPE CR S" LINE 2" TYPE CR
- ." YOU SHOULD SEE THE NUMBER RANGES OF SIGNED AND UNSIGNED NUMBERS:" CR
- ." SIGNED: " MIN-INT . MAX-INT . CR
- ." UNSIGNED: " 0 U. MAX-UINT U. CR
-;
-
-T{ OUTPUT-TEST -> }T
-\ ------------------------------------------------------------------------
-TESTING INPUT: ACCEPT
-
-CREATE ABUF 80 CHARS ALLOT
-
-: ACCEPT-TEST
- CR ." PLEASE TYPE UP TO 80 CHARACTERS:" CR
- ABUF 80 ACCEPT
- CR ." RECEIVED: " [CHAR] " EMIT
- ABUF SWAP TYPE [CHAR] " EMIT CR
-;
-
-T{ ACCEPT-TEST -> }T
-Vingt fois sur le métier remettez votre ouvrage, ...
-\ ------------------------------------------------------------------------
-TESTING DICTIONARY SEARCH RULES
-
-T{ : GDX 123 ; : GDX GDX 234 ; -> }T
-
-T{ GDX -> 123 234 }T
-
-CR .( End of Core word set tests) CR
-
-
-
-RST_STATE ; so ANS_COMPLEMENT_xx_MPY is conserved ;
-\ NOECHO ; if an error occurs, comment this line before new download to find it.
-
-
-\ From: John Hayes S1I
-\ Subject: tester.fr
-\ Date: Mon, 27 Nov 95 13:10:09 PST
-
-\ (C) 1995 JOHNS HOPKINS UNIVERSITY / APPLIED PHYSICS LABORATORY
-\ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS.
-\ VERSION 1.1
-
-\ 22/1/09 The words { and } have been changed to T{ and }T respectively to
-\ agree with the Forth 200X file ttester.fs. This avoids clashes with
-\ locals using { ... } and the FSL use of }
-
-
-\ 13/05/14 jmt. added colorised error messages.
-
-
-
- 0 CONSTANT FALSE
--1 CONSTANT TRUE
-
-\ SET THE FOLLOWING FLAG TO TRUE FOR MORE VERBOSE OUTPUT; THIS MAY
-\ ALLOW YOU TO TELL WHICH TEST CAUSED YOUR SYSTEM TO HANG.
-VARIABLE VERBOSE
- FALSE VERBOSE !
-\ TRUE VERBOSE !
-
-\ : EMPTY-STACK ( ... -- ) \ EMPTY STACK: HANDLES UNDERFLOWED STACK TOO.
-\ DEPTH ?DUP
-\ IF DUP 0< IF NEGATE 0
-\ DO 0 LOOP
-\ ELSE 0 DO DROP LOOP THEN
-\ THEN ;
-\
-\ : ERROR \ ( C-ADDR U -- ) DISPLAY AN ERROR MESSAGE FOLLOWED BY
-\ \ THE LINE THAT HAD THE ERROR.
-\ TYPE SOURCE TYPE CR \ DISPLAY LINE CORRESPONDING TO ERROR
-\ EMPTY-STACK \ THROW AWAY EVERY THING ELSE
-\ QUIT \ *** Uncomment this line to QUIT on an error
-\ ;
-
-VARIABLE ACTUAL-DEPTH \ STACK RECORD
-CREATE ACTUAL-RESULTS 20 CELLS ALLOT
-
-: T{ \ ( -- ) SYNTACTIC SUGAR.
- ;
-
-: -> \ ( ... -- ) RECORD DEPTH AND CONTENT OF STACK.
- DEPTH DUP ACTUAL-DEPTH ! \ RECORD DEPTH
- ?DUP IF \ IF THERE IS SOMETHING ON STACK
- 0 DO ACTUAL-RESULTS I CELLS + ! LOOP \ SAVE THEM
- THEN ;
-
-: }T \ ( ... -- ) COMPARE STACK (EXPECTED) CONTENTS WITH SAVED
- \ (ACTUAL) CONTENTS.
- DEPTH ACTUAL-DEPTH @ = IF \ IF DEPTHS MATCH
- DEPTH ?DUP IF \ IF THERE IS SOMETHING ON THE STACK
- 0 DO \ FOR EACH STACK ITEM
- ACTUAL-RESULTS I CELLS + @ \ COMPARE ACTUAL WITH EXPECTED
-\ = 0= IF S" INCORRECT RESULT: " ERROR LEAVE THEN \ jmt
- = 0= IF ABORT" INCORRECT RESULT: " THEN \ jmt : colorised message
- LOOP
- THEN
- ELSE \ DEPTH MISMATCH
-\ S" WRONG NUMBER OF RESULTS: " ERROR \ jmt
- ABORT" WRONG NUMBER OF RESULTS: " \ jmt : colorised message
- THEN ;
-
-: TESTING \ ( -- ) TALKING COMMENT.
- SOURCE VERBOSE @
- IF DUP >R TYPE CR R> >IN !
- ELSE >IN ! DROP [CHAR] * EMIT
- THEN ;
-
-\ From: John Hayes S1I
-\ Subject: core.fr
-\ Date: Mon, 27 Nov 95 13:10
-
-\ (C) 1995 JOHNS HOPKINS UNIVERSITY / APPLIED PHYSICS LABORATORY
-\ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS.
-\ VERSION 1.2
-\ THIS PROGRAM TESTS THE CORE WORDS OF AN ANS FORTH SYSTEM.
-\ THE PROGRAM ASSUMES A TWO'S COMPLEMENT IMPLEMENTATION WHERE
-\ THE RANGE OF SIGNED NUMBERS IS -2^(N-1) ... 2^(N-1)-1 AND
-\ THE RANGE OF UNSIGNED NUMBERS IS 0 ... 2^(N)-1.
-\ I HAVEN'T FIGURED OUT HOW TO TEST KEY, QUIT, ABORT, OR ABORT"...
-\ I ALSO HAVEN'T THOUGHT OF A WAY TO TEST ENVIRONMENT?...
-
-CR
-TESTING CORE WORDS
-HEX
-
-\ ------------------------------------------------------------------------
-TESTING BASIC ASSUMPTIONS
-
-T{ -> }T \ START WITH CLEAN SLATE
-( TEST IF ANY BITS ARE SET; ANSWER IN BASE 1 )
-T{ : BITSSET? IF 0 0 ELSE 0 THEN ; -> }T
-T{ 0 BITSSET? -> 0 }T ( ZERO IS ALL BITS CLEAR )
-T{ 1 BITSSET? -> 0 0 }T ( OTHER NUMBER HAVE AT LEAST ONE BIT )
-T{ -1 BITSSET? -> 0 0 }T
-
-\ ------------------------------------------------------------------------
-TESTING BOOLEANS: INVERT AND OR XOR
-
-T{ 0 0 AND -> 0 }T
-T{ 0 1 AND -> 0 }T
-T{ 1 0 AND -> 0 }T
-T{ 1 1 AND -> 1 }T
-
-T{ 0 INVERT 1 AND -> 1 }T
-T{ 1 INVERT 1 AND -> 0 }T
-
-0 CONSTANT 0S
-0 INVERT CONSTANT 1S
-
-T{ 0S INVERT -> 1S }T
-T{ 1S INVERT -> 0S }T
-
-T{ 0S 0S AND -> 0S }T
-T{ 0S 1S AND -> 0S }T
-T{ 1S 0S AND -> 0S }T
-T{ 1S 1S AND -> 1S }T
-
-T{ 0S 0S OR -> 0S }T
-T{ 0S 1S OR -> 1S }T
-T{ 1S 0S OR -> 1S }T
-T{ 1S 1S OR -> 1S }T
-
-T{ 0S 0S XOR -> 0S }T
-T{ 0S 1S XOR -> 1S }T
-T{ 1S 0S XOR -> 1S }T
-T{ 1S 1S XOR -> 0S }T
-
-\ ------------------------------------------------------------------------
-TESTING 2* 2/ LSHIFT RSHIFT
-
-( WE TRUST 1S, INVERT, AND BITSSET?; WE WILL CONFIRM RSHIFT LATER )
-1S 1 RSHIFT INVERT CONSTANT MSB
-T{ MSB BITSSET? -> 0 0 }T
-
-T{ 0S 2* -> 0S }T
-T{ 1 2* -> 2 }T
-T{ 4000 2* -> 8000 }T
-T{ 1S 2* 1 XOR -> 1S }T
-T{ MSB 2* -> 0S }T
-
-T{ 0S 2/ -> 0S }T
-T{ 1 2/ -> 0 }T
-T{ 4000 2/ -> 2000 }T
-T{ 1S 2/ -> 1S }T \ MSB PROPOGATED
-T{ 1S 1 XOR 2/ -> 1S }T
-T{ MSB 2/ MSB AND -> MSB }T
-
-T{ 1 0 LSHIFT -> 1 }T
-T{ 1 1 LSHIFT -> 2 }T
-T{ 1 2 LSHIFT -> 4 }T
-T{ 1 F LSHIFT -> 8000 }T \ BIGGEST GUARANTEED SHIFT
-T{ 1S 1 LSHIFT 1 XOR -> 1S }T
-T{ MSB 1 LSHIFT -> 0 }T
-
-T{ 1 0 RSHIFT -> 1 }T
-T{ 1 1 RSHIFT -> 0 }T
-T{ 2 1 RSHIFT -> 1 }T
-T{ 4 2 RSHIFT -> 1 }T
-T{ 8000 F RSHIFT -> 1 }T \ BIGGEST
-T{ MSB 1 RSHIFT MSB AND -> 0 }T \ RSHIFT ZERO FILLS MSBS
-T{ MSB 1 RSHIFT 2* -> MSB }T
-
-\ ------------------------------------------------------------------------
-TESTING COMPARISONS: 0= = 0< < > U< MIN MAX
-0 INVERT CONSTANT MAX-UINT
-0 INVERT 1 RSHIFT CONSTANT MAX-INT
-0 INVERT 1 RSHIFT INVERT CONSTANT MIN-INT
-0 INVERT 1 RSHIFT CONSTANT MID-UINT
-0 INVERT 1 RSHIFT INVERT CONSTANT MID-UINT+1
-
-0S CONSTANT <FALSE>
-1S CONSTANT <TRUE>
-
-T{ 0 0= -> <TRUE> }T
-T{ 1 0= -> <FALSE> }T
-T{ 2 0= -> <FALSE> }T
-T{ -1 0= -> <FALSE> }T
-T{ MAX-UINT 0= -> <FALSE> }T
-T{ MIN-INT 0= -> <FALSE> }T
-T{ MAX-INT 0= -> <FALSE> }T
-
-T{ 0 0 = -> <TRUE> }T
-T{ 1 1 = -> <TRUE> }T
-T{ -1 -1 = -> <TRUE> }T
-T{ 1 0 = -> <FALSE> }T
-T{ -1 0 = -> <FALSE> }T
-T{ 0 1 = -> <FALSE> }T
-T{ 0 -1 = -> <FALSE> }T
-
-T{ 0 0< -> <FALSE> }T
-T{ -1 0< -> <TRUE> }T
-T{ MIN-INT 0< -> <TRUE> }T
-T{ 1 0< -> <FALSE> }T
-T{ MAX-INT 0< -> <FALSE> }T
-
-T{ 0 1 < -> <TRUE> }T
-T{ 1 2 < -> <TRUE> }T
-T{ -1 0 < -> <TRUE> }T
-T{ -1 1 < -> <TRUE> }T
-T{ MIN-INT 0 < -> <TRUE> }T
-T{ MIN-INT MAX-INT < -> <TRUE> }T
-T{ 0 MAX-INT < -> <TRUE> }T
-T{ 0 0 < -> <FALSE> }T
-T{ 1 1 < -> <FALSE> }T
-T{ 1 0 < -> <FALSE> }T
-T{ 2 1 < -> <FALSE> }T
-T{ 0 -1 < -> <FALSE> }T
-T{ 1 -1 < -> <FALSE> }T
-T{ 0 MIN-INT < -> <FALSE> }T
-T{ MAX-INT MIN-INT < -> <FALSE> }T
-T{ MAX-INT 0 < -> <FALSE> }T
-
-T{ 0 1 > -> <FALSE> }T
-T{ 1 2 > -> <FALSE> }T
-T{ -1 0 > -> <FALSE> }T
-T{ -1 1 > -> <FALSE> }T
-T{ MIN-INT 0 > -> <FALSE> }T
-T{ MIN-INT MAX-INT > -> <FALSE> }T
-T{ 0 MAX-INT > -> <FALSE> }T
-T{ 0 0 > -> <FALSE> }T
-T{ 1 1 > -> <FALSE> }T
-T{ 1 0 > -> <TRUE> }T
-T{ 2 1 > -> <TRUE> }T
-T{ 0 -1 > -> <TRUE> }T
-T{ 1 -1 > -> <TRUE> }T
-T{ 0 MIN-INT > -> <TRUE> }T
-T{ MAX-INT MIN-INT > -> <TRUE> }T
-T{ MAX-INT 0 > -> <TRUE> }T
-
-T{ 0 1 U< -> <TRUE> }T
-T{ 1 2 U< -> <TRUE> }T
-T{ 0 MID-UINT U< -> <TRUE> }T
-T{ 0 MAX-UINT U< -> <TRUE> }T
-T{ MID-UINT MAX-UINT U< -> <TRUE> }T
-T{ 0 0 U< -> <FALSE> }T
-T{ 1 1 U< -> <FALSE> }T
-T{ 1 0 U< -> <FALSE> }T
-T{ 2 1 U< -> <FALSE> }T
-T{ MID-UINT 0 U< -> <FALSE> }T
-T{ MAX-UINT 0 U< -> <FALSE> }T
-T{ MAX-UINT MID-UINT U< -> <FALSE> }T
-
-T{ 0 1 MIN -> 0 }T
-T{ 1 2 MIN -> 1 }T
-T{ -1 0 MIN -> -1 }T
-T{ -1 1 MIN -> -1 }T
-T{ MIN-INT 0 MIN -> MIN-INT }T
-T{ MIN-INT MAX-INT MIN -> MIN-INT }T
-T{ 0 MAX-INT MIN -> 0 }T
-T{ 0 0 MIN -> 0 }T
-T{ 1 1 MIN -> 1 }T
-T{ 1 0 MIN -> 0 }T
-T{ 2 1 MIN -> 1 }T
-T{ 0 -1 MIN -> -1 }T
-T{ 1 -1 MIN -> -1 }T
-T{ 0 MIN-INT MIN -> MIN-INT }T
-T{ MAX-INT MIN-INT MIN -> MIN-INT }T
-T{ MAX-INT 0 MIN -> 0 }T
-
-T{ 0 1 MAX -> 1 }T
-T{ 1 2 MAX -> 2 }T
-T{ -1 0 MAX -> 0 }T
-T{ -1 1 MAX -> 1 }T
-T{ MIN-INT 0 MAX -> 0 }T
-T{ MIN-INT MAX-INT MAX -> MAX-INT }T
-T{ 0 MAX-INT MAX -> MAX-INT }T
-T{ 0 0 MAX -> 0 }T
-T{ 1 1 MAX -> 1 }T
-T{ 1 0 MAX -> 1 }T
-T{ 2 1 MAX -> 2 }T
-T{ 0 -1 MAX -> 0 }T
-T{ 1 -1 MAX -> 1 }T
-T{ 0 MIN-INT MAX -> 0 }T
-T{ MAX-INT MIN-INT MAX -> MAX-INT }T
-T{ MAX-INT 0 MAX -> MAX-INT }T
-
-\ ------------------------------------------------------------------------
-TESTING STACK OPS: 2DROP 2DUP 2OVER 2SWAP ?DUP DEPTH DROP DUP OVER ROT SWAP
-
-T{ 1 2 2DROP -> }T
-T{ 1 2 2DUP -> 1 2 1 2 }T
-T{ 1 2 3 4 2OVER -> 1 2 3 4 1 2 }T
-T{ 1 2 3 4 2SWAP -> 3 4 1 2 }T
-T{ 0 ?DUP -> 0 }T
-T{ 1 ?DUP -> 1 1 }T
-T{ -1 ?DUP -> -1 -1 }T
-T{ DEPTH -> 0 }T
-T{ 0 DEPTH -> 0 1 }T
-T{ 0 1 DEPTH -> 0 1 2 }T
-T{ 0 DROP -> }T
-T{ 1 2 DROP -> 1 }T
-T{ 1 DUP -> 1 1 }T
-T{ 1 2 OVER -> 1 2 1 }T
-T{ 1 2 3 ROT -> 2 3 1 }T
-T{ 1 2 SWAP -> 2 1 }T
-
-\ ------------------------------------------------------------------------
-TESTING >R R> R@
-
-T{ : GR1 >R R> ; -> }T
-T{ : GR2 >R R@ R> DROP ; -> }T
-T{ 123 GR1 -> 123 }T
-T{ 123 GR2 -> 123 }T
-T{ 1S GR1 -> 1S }T ( RETURN STACK HOLDS CELLS )
-
-\ ------------------------------------------------------------------------
-TESTING ADD/SUBTRACT: + - 1+ 1- ABS NEGATE
-
-T{ 0 5 + -> 5 }T
-T{ 5 0 + -> 5 }T
-T{ 0 -5 + -> -5 }T
-T{ -5 0 + -> -5 }T
-T{ 1 2 + -> 3 }T
-T{ 1 -2 + -> -1 }T
-T{ -1 2 + -> 1 }T
-T{ -1 -2 + -> -3 }T
-T{ -1 1 + -> 0 }T
-T{ MID-UINT 1 + -> MID-UINT+1 }T
-
-T{ 0 5 - -> -5 }T
-T{ 5 0 - -> 5 }T
-T{ 0 -5 - -> 5 }T
-T{ -5 0 - -> -5 }T
-T{ 1 2 - -> -1 }T
-T{ 1 -2 - -> 3 }T
-T{ -1 2 - -> -3 }T
-T{ -1 -2 - -> 1 }T
-T{ 0 1 - -> -1 }T
-T{ MID-UINT+1 1 - -> MID-UINT }T
-
-T{ 0 1+ -> 1 }T
-T{ -1 1+ -> 0 }T
-T{ 1 1+ -> 2 }T
-T{ MID-UINT 1+ -> MID-UINT+1 }T
-
-T{ 2 1- -> 1 }T
-T{ 1 1- -> 0 }T
-T{ 0 1- -> -1 }T
-T{ MID-UINT+1 1- -> MID-UINT }T
-
-T{ 0 NEGATE -> 0 }T
-T{ 1 NEGATE -> -1 }T
-T{ -1 NEGATE -> 1 }T
-T{ 2 NEGATE -> -2 }T
-T{ -2 NEGATE -> 2 }T
-
-T{ 0 ABS -> 0 }T
-T{ 1 ABS -> 1 }T
-T{ -1 ABS -> 1 }T
-T{ MIN-INT ABS -> MID-UINT+1 }T
-
-\ ------------------------------------------------------------------------
-TESTING MULTIPLY: S>D * M* UM*
-
-T{ 0 S>D -> 0 0 }T
-T{ 1 S>D -> 1 0 }T
-T{ 2 S>D -> 2 0 }T
-T{ -1 S>D -> -1 -1 }T
-T{ -2 S>D -> -2 -1 }T
-T{ MIN-INT S>D -> MIN-INT -1 }T
-T{ MAX-INT S>D -> MAX-INT 0 }T
-
-T{ 0 0 M* -> 0 S>D }T
-T{ 0 1 M* -> 0 S>D }T
-T{ 1 0 M* -> 0 S>D }T
-T{ 1 2 M* -> 2 S>D }T
-T{ 2 1 M* -> 2 S>D }T
-T{ 3 3 M* -> 9 S>D }T
-T{ -3 3 M* -> -9 S>D }T
-T{ 3 -3 M* -> -9 S>D }T
-T{ -3 -3 M* -> 9 S>D }T
-T{ 0 MIN-INT M* -> 0 S>D }T
-T{ 1 MIN-INT M* -> MIN-INT S>D }T
-T{ 2 MIN-INT M* -> 0 1S }T
-T{ 0 MAX-INT M* -> 0 S>D }T
-T{ 1 MAX-INT M* -> MAX-INT S>D }T
-T{ 2 MAX-INT M* -> MAX-INT 1 LSHIFT 0 }T
-T{ MIN-INT MIN-INT M* -> 0 MSB 1 RSHIFT }T
-T{ MAX-INT MIN-INT M* -> MSB MSB 2/ }T
-T{ MAX-INT MAX-INT M* -> 1 MSB 2/ INVERT }T
-
-T{ 0 0 * -> 0 }T \ TEST IDENTITIES
-T{ 0 1 * -> 0 }T
-T{ 1 0 * -> 0 }T
-T{ 1 2 * -> 2 }T
-T{ 2 1 * -> 2 }T
-T{ 3 3 * -> 9 }T
-T{ -3 3 * -> -9 }T
-T{ 3 -3 * -> -9 }T
-T{ -3 -3 * -> 9 }T
-
-T{ MID-UINT+1 1 RSHIFT 2 * -> MID-UINT+1 }T
-T{ MID-UINT+1 2 RSHIFT 4 * -> MID-UINT+1 }T
-T{ MID-UINT+1 1 RSHIFT MID-UINT+1 OR 2 * -> MID-UINT+1 }T
-
-T{ 0 0 UM* -> 0 0 }T
-T{ 0 1 UM* -> 0 0 }T
-T{ 1 0 UM* -> 0 0 }T
-T{ 1 2 UM* -> 2 0 }T
-T{ 2 1 UM* -> 2 0 }T
-T{ 3 3 UM* -> 9 0 }T
-
-T{ MID-UINT+1 1 RSHIFT 2 UM* -> MID-UINT+1 0 }T
-T{ MID-UINT+1 2 UM* -> 0 1 }T
-T{ MID-UINT+1 4 UM* -> 0 2 }T
-T{ 1S 2 UM* -> 1S 1 LSHIFT 1 }T
-T{ MAX-UINT MAX-UINT UM* -> 1 1 INVERT }T
-
-\ ------------------------------------------------------------------------
-TESTING DIVIDE: FM/MOD SM/REM UM/MOD */ */MOD / /MOD MOD
-
-T{ 0 S>D 1 FM/MOD -> 0 0 }T
-T{ 1 S>D 1 FM/MOD -> 0 1 }T
-T{ 2 S>D 1 FM/MOD -> 0 2 }T
-T{ -1 S>D 1 FM/MOD -> 0 -1 }T
-T{ -2 S>D 1 FM/MOD -> 0 -2 }T
-T{ 0 S>D -1 FM/MOD -> 0 0 }T
-T{ 1 S>D -1 FM/MOD -> 0 -1 }T
-T{ 2 S>D -1 FM/MOD -> 0 -2 }T
-T{ -1 S>D -1 FM/MOD -> 0 1 }T
-T{ -2 S>D -1 FM/MOD -> 0 2 }T
-T{ 2 S>D 2 FM/MOD -> 0 1 }T
-T{ -1 S>D -1 FM/MOD -> 0 1 }T
-T{ -2 S>D -2 FM/MOD -> 0 1 }T
-T{ 7 S>D 3 FM/MOD -> 1 2 }T
-T{ 7 S>D -3 FM/MOD -> -2 -3 }T
-T{ -7 S>D 3 FM/MOD -> 2 -3 }T
-T{ -7 S>D -3 FM/MOD -> -1 2 }T
-T{ MAX-INT S>D 1 FM/MOD -> 0 MAX-INT }T
-T{ MIN-INT S>D 1 FM/MOD -> 0 MIN-INT }T
-T{ MAX-INT S>D MAX-INT FM/MOD -> 0 1 }T
-T{ MIN-INT S>D MIN-INT FM/MOD -> 0 1 }T
-T{ 1S 1 4 FM/MOD -> 3 MAX-INT }T
-T{ 1 MIN-INT M* 1 FM/MOD -> 0 MIN-INT }T
-T{ 1 MIN-INT M* MIN-INT FM/MOD -> 0 1 }T
-T{ 2 MIN-INT M* 2 FM/MOD -> 0 MIN-INT }T
-T{ 2 MIN-INT M* MIN-INT FM/MOD -> 0 2 }T
-T{ 1 MAX-INT M* 1 FM/MOD -> 0 MAX-INT }T
-T{ 1 MAX-INT M* MAX-INT FM/MOD -> 0 1 }T
-T{ 2 MAX-INT M* 2 FM/MOD -> 0 MAX-INT }T
-T{ 2 MAX-INT M* MAX-INT FM/MOD -> 0 2 }T
-T{ MIN-INT MIN-INT M* MIN-INT FM/MOD -> 0 MIN-INT }T
-T{ MIN-INT MAX-INT M* MIN-INT FM/MOD -> 0 MAX-INT }T
-T{ MIN-INT MAX-INT M* MAX-INT FM/MOD -> 0 MIN-INT }T
-T{ MAX-INT MAX-INT M* MAX-INT FM/MOD -> 0 MAX-INT }T
-
-T{ 0 S>D 1 SM/REM -> 0 0 }T
-T{ 1 S>D 1 SM/REM -> 0 1 }T
-T{ 2 S>D 1 SM/REM -> 0 2 }T
-T{ -1 S>D 1 SM/REM -> 0 -1 }T
-T{ -2 S>D 1 SM/REM -> 0 -2 }T
-T{ 0 S>D -1 SM/REM -> 0 0 }T
-T{ 1 S>D -1 SM/REM -> 0 -1 }T
-T{ 2 S>D -1 SM/REM -> 0 -2 }T
-T{ -1 S>D -1 SM/REM -> 0 1 }T
-T{ -2 S>D -1 SM/REM -> 0 2 }T
-T{ 2 S>D 2 SM/REM -> 0 1 }T
-T{ -1 S>D -1 SM/REM -> 0 1 }T
-T{ -2 S>D -2 SM/REM -> 0 1 }T
-T{ 7 S>D 3 SM/REM -> 1 2 }T
-T{ 7 S>D -3 SM/REM -> 1 -2 }T
-T{ -7 S>D 3 SM/REM -> -1 -2 }T
-T{ -7 S>D -3 SM/REM -> -1 2 }T
-T{ MAX-INT S>D 1 SM/REM -> 0 MAX-INT }T
-T{ MIN-INT S>D 1 SM/REM -> 0 MIN-INT }T
-T{ MAX-INT S>D MAX-INT SM/REM -> 0 1 }T
-T{ MIN-INT S>D MIN-INT SM/REM -> 0 1 }T
-T{ 1S 1 4 SM/REM -> 3 MAX-INT }T
-T{ 2 MIN-INT M* 2 SM/REM -> 0 MIN-INT }T
-T{ 2 MIN-INT M* MIN-INT SM/REM -> 0 2 }T
-T{ 2 MAX-INT M* 2 SM/REM -> 0 MAX-INT }T
-T{ 2 MAX-INT M* MAX-INT SM/REM -> 0 2 }T
-T{ MIN-INT MIN-INT M* MIN-INT SM/REM -> 0 MIN-INT }T
-T{ MIN-INT MAX-INT M* MIN-INT SM/REM -> 0 MAX-INT }T
-T{ MIN-INT MAX-INT M* MAX-INT SM/REM -> 0 MIN-INT }T
-T{ MAX-INT MAX-INT M* MAX-INT SM/REM -> 0 MAX-INT }T
-
-T{ 0 0 1 UM/MOD -> 0 0 }T
-T{ 1 0 1 UM/MOD -> 0 1 }T
-T{ 1 0 2 UM/MOD -> 1 0 }T
-T{ 3 0 2 UM/MOD -> 1 1 }T
-T{ MAX-UINT 2 UM* 2 UM/MOD -> 0 MAX-UINT }T
-T{ MAX-UINT 2 UM* MAX-UINT UM/MOD -> 0 2 }T
-T{ MAX-UINT MAX-UINT UM* MAX-UINT UM/MOD -> 0 MAX-UINT }T
-
-: IFFLOORED
- [ -3 2 / -2 = INVERT ] LITERAL IF POSTPONE \ THEN ;
-
-: IFSYM
- [ -3 2 / -1 = INVERT ] LITERAL IF POSTPONE \ THEN ;
-
-\ THE SYSTEM MIGHT DO EITHER FLOORED OR SYMMETRIC DIVISION.
-\ SINCE WE HAVE ALREADY TESTED M*, FM/MOD, AND SM/REM WE CAN USE THEM IN TEST.
-
-IFFLOORED : T/MOD >R S>D R> FM/MOD ;
-IFFLOORED : T/ T/MOD SWAP DROP ;
-IFFLOORED : TMOD T/MOD DROP ;
-IFFLOORED : T*/MOD >R M* R> FM/MOD ;
-IFFLOORED : T*/ T*/MOD SWAP DROP ;
-IFSYM : T/MOD >R S>D R> SM/REM ;
-IFSYM : T/ T/MOD SWAP DROP ;
-IFSYM : TMOD T/MOD DROP ;
-IFSYM : T*/MOD >R M* R> SM/REM ;
-IFSYM : T*/ T*/MOD SWAP DROP ;
-
-T{ 0 1 /MOD -> 0 1 T/MOD }T
-T{ 1 1 /MOD -> 1 1 T/MOD }T
-T{ 2 1 /MOD -> 2 1 T/MOD }T
-T{ -1 1 /MOD -> -1 1 T/MOD }T
-T{ -2 1 /MOD -> -2 1 T/MOD }T
-T{ 0 -1 /MOD -> 0 -1 T/MOD }T
-T{ 1 -1 /MOD -> 1 -1 T/MOD }T
-T{ 2 -1 /MOD -> 2 -1 T/MOD }T
-T{ -1 -1 /MOD -> -1 -1 T/MOD }T
-T{ -2 -1 /MOD -> -2 -1 T/MOD }T
-T{ 2 2 /MOD -> 2 2 T/MOD }T
-T{ -1 -1 /MOD -> -1 -1 T/MOD }T
-T{ -2 -2 /MOD -> -2 -2 T/MOD }T
-T{ 7 3 /MOD -> 7 3 T/MOD }T
-T{ 7 -3 /MOD -> 7 -3 T/MOD }T
-T{ -7 3 /MOD -> -7 3 T/MOD }T
-T{ -7 -3 /MOD -> -7 -3 T/MOD }T
-T{ MAX-INT 1 /MOD -> MAX-INT 1 T/MOD }T
-T{ MIN-INT 1 /MOD -> MIN-INT 1 T/MOD }T
-T{ MAX-INT MAX-INT /MOD -> MAX-INT MAX-INT T/MOD }T
-T{ MIN-INT MIN-INT /MOD -> MIN-INT MIN-INT T/MOD }T
-
-T{ 0 1 / -> 0 1 T/ }T
-T{ 1 1 / -> 1 1 T/ }T
-T{ 2 1 / -> 2 1 T/ }T
-T{ -1 1 / -> -1 1 T/ }T
-T{ -2 1 / -> -2 1 T/ }T
-T{ 0 -1 / -> 0 -1 T/ }T
-T{ 1 -1 / -> 1 -1 T/ }T
-T{ 2 -1 / -> 2 -1 T/ }T
-T{ -1 -1 / -> -1 -1 T/ }T
-T{ -2 -1 / -> -2 -1 T/ }T
-T{ 2 2 / -> 2 2 T/ }T
-T{ -1 -1 / -> -1 -1 T/ }T
-T{ -2 -2 / -> -2 -2 T/ }T
-T{ 7 3 / -> 7 3 T/ }T
-T{ 7 -3 / -> 7 -3 T/ }T
-T{ -7 3 / -> -7 3 T/ }T
-T{ -7 -3 / -> -7 -3 T/ }T
-T{ MAX-INT 1 / -> MAX-INT 1 T/ }T
-T{ MIN-INT 1 / -> MIN-INT 1 T/ }T
-T{ MAX-INT MAX-INT / -> MAX-INT MAX-INT T/ }T
-T{ MIN-INT MIN-INT / -> MIN-INT MIN-INT T/ }T
-
-T{ 0 1 MOD -> 0 1 TMOD }T
-T{ 1 1 MOD -> 1 1 TMOD }T
-T{ 2 1 MOD -> 2 1 TMOD }T
-T{ -1 1 MOD -> -1 1 TMOD }T
-T{ -2 1 MOD -> -2 1 TMOD }T
-T{ 0 -1 MOD -> 0 -1 TMOD }T
-T{ 1 -1 MOD -> 1 -1 TMOD }T
-T{ 2 -1 MOD -> 2 -1 TMOD }T
-T{ -1 -1 MOD -> -1 -1 TMOD }T
-T{ -2 -1 MOD -> -2 -1 TMOD }T
-T{ 2 2 MOD -> 2 2 TMOD }T
-T{ -1 -1 MOD -> -1 -1 TMOD }T
-T{ -2 -2 MOD -> -2 -2 TMOD }T
-T{ 7 3 MOD -> 7 3 TMOD }T
-T{ 7 -3 MOD -> 7 -3 TMOD }T
-T{ -7 3 MOD -> -7 3 TMOD }T
-T{ -7 -3 MOD -> -7 -3 TMOD }T
-T{ MAX-INT 1 MOD -> MAX-INT 1 TMOD }T
-T{ MIN-INT 1 MOD -> MIN-INT 1 TMOD }T
-T{ MAX-INT MAX-INT MOD -> MAX-INT MAX-INT TMOD }T
-T{ MIN-INT MIN-INT MOD -> MIN-INT MIN-INT TMOD }T
-
-T{ 0 2 1 */ -> 0 2 1 T*/ }T
-T{ 1 2 1 */ -> 1 2 1 T*/ }T
-T{ 2 2 1 */ -> 2 2 1 T*/ }T
-T{ -1 2 1 */ -> -1 2 1 T*/ }T
-T{ -2 2 1 */ -> -2 2 1 T*/ }T
-T{ 0 2 -1 */ -> 0 2 -1 T*/ }T
-T{ 1 2 -1 */ -> 1 2 -1 T*/ }T
-T{ 2 2 -1 */ -> 2 2 -1 T*/ }T
-T{ -1 2 -1 */ -> -1 2 -1 T*/ }T
-T{ -2 2 -1 */ -> -2 2 -1 T*/ }T
-T{ 2 2 2 */ -> 2 2 2 T*/ }T
-T{ -1 2 -1 */ -> -1 2 -1 T*/ }T
-T{ -2 2 -2 */ -> -2 2 -2 T*/ }T
-T{ 7 2 3 */ -> 7 2 3 T*/ }T
-T{ 7 2 -3 */ -> 7 2 -3 T*/ }T
-T{ -7 2 3 */ -> -7 2 3 T*/ }T
-T{ -7 2 -3 */ -> -7 2 -3 T*/ }T
-T{ MAX-INT 2 MAX-INT */ -> MAX-INT 2 MAX-INT T*/ }T
-T{ MIN-INT 2 MIN-INT */ -> MIN-INT 2 MIN-INT T*/ }T
-
-T{ 0 2 1 */MOD -> 0 2 1 T*/MOD }T
-T{ 1 2 1 */MOD -> 1 2 1 T*/MOD }T
-T{ 2 2 1 */MOD -> 2 2 1 T*/MOD }T
-T{ -1 2 1 */MOD -> -1 2 1 T*/MOD }T
-T{ -2 2 1 */MOD -> -2 2 1 T*/MOD }T
-T{ 0 2 -1 */MOD -> 0 2 -1 T*/MOD }T
-T{ 1 2 -1 */MOD -> 1 2 -1 T*/MOD }T
-T{ 2 2 -1 */MOD -> 2 2 -1 T*/MOD }T
-T{ -1 2 -1 */MOD -> -1 2 -1 T*/MOD }T
-T{ -2 2 -1 */MOD -> -2 2 -1 T*/MOD }T
-T{ 2 2 2 */MOD -> 2 2 2 T*/MOD }T
-T{ -1 2 -1 */MOD -> -1 2 -1 T*/MOD }T
-T{ -2 2 -2 */MOD -> -2 2 -2 T*/MOD }T
-T{ 7 2 3 */MOD -> 7 2 3 T*/MOD }T
-T{ 7 2 -3 */MOD -> 7 2 -3 T*/MOD }T
-T{ -7 2 3 */MOD -> -7 2 3 T*/MOD }T
-T{ -7 2 -3 */MOD -> -7 2 -3 T*/MOD }T
-T{ MAX-INT 2 MAX-INT */MOD -> MAX-INT 2 MAX-INT T*/MOD }T
-T{ MIN-INT 2 MIN-INT */MOD -> MIN-INT 2 MIN-INT T*/MOD }T
-
-\ ------------------------------------------------------------------------
-TESTING HERE , @ ! CELL+ CELLS C, C@ C! CHARS 2@ 2! ALIGN ALIGNED +! ALLOT
-
-HERE 1 ALLOT
-HERE
-CONSTANT 2NDA
-CONSTANT 1STA
-T{ 1STA 2NDA U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT
-T{ 1STA 1+ -> 2NDA }T \ ... BY ONE ADDRESS UNIT
-( MISSING TEST: NEGATIVE ALLOT )
-
-HERE 1 ,
-HERE 2 ,
-CONSTANT 2ND
-CONSTANT 1ST
-T{ 1ST 2ND U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT
-T{ 1ST CELL+ -> 2ND }T \ ... BY ONE CELL
-T{ 1ST 1 CELLS + -> 2ND }T
-T{ 1ST @ 2ND @ -> 1 2 }T
-T{ 5 1ST ! -> }T
-T{ 1ST @ 2ND @ -> 5 2 }T
-T{ 6 2ND ! -> }T
-T{ 1ST @ 2ND @ -> 5 6 }T
-T{ 1ST 2@ -> 6 5 }T
-T{ 2 1 1ST 2! -> }T
-T{ 1ST 2@ -> 2 1 }T
-T{ 1S 1ST ! 1ST @ -> 1S }T \ CAN STORE CELL-WIDE VALUE
-
-HERE 1 C,
-HERE 2 C,
-CONSTANT 2NDC
-CONSTANT 1STC
-T{ 1STC 2NDC U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT
-T{ 1STC CHAR+ -> 2NDC }T \ ... BY ONE CHAR
-T{ 1STC 1 CHARS + -> 2NDC }T
-T{ 1STC C@ 2NDC C@ -> 1 2 }T
-T{ 3 1STC C! -> }T
-T{ 1STC C@ 2NDC C@ -> 3 2 }T
-T{ 4 2NDC C! -> }T
-T{ 1STC C@ 2NDC C@ -> 3 4 }T
-
-ALIGN 1 ALLOT HERE ALIGN HERE 3 CELLS ALLOT
-CONSTANT A-ADDR CONSTANT UA-ADDR
-T{ UA-ADDR ALIGNED -> A-ADDR }T
-T{ 1 A-ADDR C! A-ADDR C@ -> 1 }T
-T{ 1234 A-ADDR ! A-ADDR @ -> 1234 }T
-T{ 123 456 A-ADDR 2! A-ADDR 2@ -> 123 456 }T
-T{ 2 A-ADDR CHAR+ C! A-ADDR CHAR+ C@ -> 2 }T
-T{ 3 A-ADDR CELL+ C! A-ADDR CELL+ C@ -> 3 }T
-T{ 1234 A-ADDR CELL+ ! A-ADDR CELL+ @ -> 1234 }T
-T{ 123 456 A-ADDR CELL+ 2! A-ADDR CELL+ 2@ -> 123 456 }T
-
-: BITS ( X -- U )
- 0 SWAP BEGIN DUP WHILE DUP MSB AND IF >R 1+ R> THEN 2* REPEAT DROP ;
-( CHARACTERS >= 1 AU, <= SIZE OF CELL, >= 8 BITS )
-T{ 1 CHARS 1 < -> <FALSE> }T
-T{ 1 CHARS 1 CELLS > -> <FALSE> }T
-( TBD: HOW TO FIND NUMBER OF BITS? )
-
-( CELLS >= 1 AU, INTEGRAL MULTIPLE OF CHAR SIZE, >= 16 BITS )
-T{ 1 CELLS 1 < -> <FALSE> }T
-T{ 1 CELLS 1 CHARS MOD -> 0 }T
-T{ 1S BITS 10 < -> <FALSE> }T
-
-T{ 0 1ST ! -> }T
-T{ 1 1ST +! -> }T
-T{ 1ST @ -> 1 }T
-T{ -1 1ST +! 1ST @ -> 0 }T
-
-\ ------------------------------------------------------------------------
-TESTING CHAR [CHAR] [ ] BL S"
-
-T{ BL -> 20 }T
-T{ CHAR X -> 58 }T
-T{ CHAR HELLO -> 48 }T
-T{ : GC1 [CHAR] X ; -> }T
-T{ : GC2 [CHAR] HELLO ; -> }T
-T{ GC1 -> 58 }T
-T{ GC2 -> 48 }T
-T{ : GC3 [ GC1 ] LITERAL ; -> }T
-T{ GC3 -> 58 }T
-T{ : GC4 S" XY" ; -> }T
-T{ GC4 SWAP DROP -> 2 }T
-T{ GC4 DROP DUP C@ SWAP CHAR+ C@ -> 58 59 }T
-
-\ ------------------------------------------------------------------------
-TESTING ' ['] FIND EXECUTE IMMEDIATE COUNT LITERAL POSTPONE STATE
-
-T{ : GT1 123 ; -> }T
-T{ ' GT1 EXECUTE -> 123 }T
-T{ : GT2 ['] GT1 ; IMMEDIATE -> }T
-T{ GT2 EXECUTE -> 123 }T
-HERE 3 C, CHAR G C, CHAR T C, CHAR 1 C, CONSTANT GT1STRING
-HERE 3 C, CHAR G C, CHAR T C, CHAR 2 C, CONSTANT GT2STRING
-T{ GT1STRING FIND -> ' GT1 -1 }T
-T{ GT2STRING FIND -> ' GT2 1 }T
-( HOW TO SEARCH FOR NON-EXISTENT WORD? )
-T{ : GT3 GT2 LITERAL ; -> }T
-T{ GT3 -> ' GT1 }T
-T{ GT1STRING COUNT -> GT1STRING CHAR+ 3 }T
-
-T{ : GT4 POSTPONE GT1 ; IMMEDIATE -> }T
-T{ : GT5 GT4 ; -> }T
-T{ GT5 -> 123 }T
-T{ : GT6 345 ; IMMEDIATE -> }T
-T{ : GT7 POSTPONE GT6 ; -> }T
-T{ GT7 -> 345 }T
-
-T{ : GT8 STATE @ ; IMMEDIATE -> }T
-T{ GT8 -> 0 }T
-T{ : GT9 GT8 LITERAL ; -> }T
-T{ GT9 0= -> <FALSE> }T
-
-\ ------------------------------------------------------------------------
-TESTING IF ELSE THEN BEGIN WHILE REPEAT UNTIL RECURSE
-
-T{ : GI1 IF 123 THEN ; -> }T
-T{ : GI2 IF 123 ELSE 234 THEN ; -> }T
-T{ 0 GI1 -> }T
-T{ 1 GI1 -> 123 }T
-T{ -1 GI1 -> 123 }T
-T{ 0 GI2 -> 234 }T
-T{ 1 GI2 -> 123 }T
-T{ -1 GI1 -> 123 }T
-
-T{ : GI3 BEGIN DUP 5 < WHILE DUP 1+ REPEAT ; -> }T
-T{ 0 GI3 -> 0 1 2 3 4 5 }T
-T{ 4 GI3 -> 4 5 }T
-T{ 5 GI3 -> 5 }T
-T{ 6 GI3 -> 6 }T
-
-T{ : GI4 BEGIN DUP 1+ DUP 5 > UNTIL ; -> }T
-T{ 3 GI4 -> 3 4 5 6 }T
-T{ 5 GI4 -> 5 6 }T
-T{ 6 GI4 -> 6 7 }T
-
-T{ : GI5 BEGIN DUP 2 > WHILE DUP 5 < WHILE DUP 1+ REPEAT 123 ELSE 345 THEN ; -> }T
-T{ 1 GI5 -> 1 345 }T
-T{ 2 GI5 -> 2 345 }T
-T{ 3 GI5 -> 3 4 5 123 }T
-T{ 4 GI5 -> 4 5 123 }T
-T{ 5 GI5 -> 5 123 }T
-
-T{ : GI6 ( N -- 0,1,..N ) DUP IF DUP >R 1- RECURSE R> THEN ; -> }T
-T{ 0 GI6 -> 0 }T
-T{ 1 GI6 -> 0 1 }T
-T{ 2 GI6 -> 0 1 2 }T
-T{ 3 GI6 -> 0 1 2 3 }T
-T{ 4 GI6 -> 0 1 2 3 4 }T
-
-\ ------------------------------------------------------------------------
-TESTING DO LOOP +LOOP I J UNLOOP LEAVE EXIT
-
-T{ : GD1 DO I LOOP ; -> }T
-T{ 4 1 GD1 -> 1 2 3 }T
-T{ 2 -1 GD1 -> -1 0 1 }T
-T{ MID-UINT+1 MID-UINT GD1 -> MID-UINT }T
-
-T{ : GD2 DO I -1 +LOOP ; -> }T
-T{ 1 4 GD2 -> 4 3 2 1 }T
-T{ -1 2 GD2 -> 2 1 0 -1 }T
-T{ MID-UINT MID-UINT+1 GD2 -> MID-UINT+1 MID-UINT }T
-
-T{ : GD3 DO 1 0 DO J LOOP LOOP ; -> }T
-T{ 4 1 GD3 -> 1 2 3 }T
-T{ 2 -1 GD3 -> -1 0 1 }T
-T{ MID-UINT+1 MID-UINT GD3 -> MID-UINT }T
-
-T{ : GD4 DO 1 0 DO J LOOP -1 +LOOP ; -> }T
-T{ 1 4 GD4 -> 4 3 2 1 }T
-T{ -1 2 GD4 -> 2 1 0 -1 }T
-T{ MID-UINT MID-UINT+1 GD4 -> MID-UINT+1 MID-UINT }T
-
-T{ : GD5 123 SWAP 0 DO I 4 > IF DROP 234 LEAVE THEN LOOP ; -> }T
-T{ 1 GD5 -> 123 }T
-T{ 5 GD5 -> 123 }T
-T{ 6 GD5 -> 234 }T
-
-T{ : GD6 ( PAT: T{0 0}T,T{0 0}TT{1 0}TT{1 1}T,T{0 0}TT{1 0}TT{1 1}TT{2 0}TT{2 1}TT{2 2}T )
- 0 SWAP 0 DO
- I 1+ 0 DO I J + 3 = IF I UNLOOP I UNLOOP EXIT THEN 1+ LOOP
- LOOP ; -> }T
-T{ 1 GD6 -> 1 }T
-T{ 2 GD6 -> 3 }T
-T{ 3 GD6 -> 4 1 2 }T
-
-\ ------------------------------------------------------------------------
-TESTING DEFINING WORDS: : ; CONSTANT VARIABLE CREATE DOES> >BODY
-
-T{ 123 CONSTANT X123 -> }T
-T{ X123 -> 123 }T
-T{ : EQU CONSTANT ; -> }T
-T{ X123 EQU Y123 -> }T
-T{ Y123 -> 123 }T
-
-T{ VARIABLE V1 -> }T
-T{ 123 V1 ! -> }T
-T{ V1 @ -> 123 }T
-
-T{ : NOP : POSTPONE ; ; -> }T
-T{ NOP NOP1 NOP NOP2 -> }T
-T{ NOP1 -> }T
-T{ NOP2 -> }T
-
-T{ : DOES1 DOES> @ 1 + ; -> }T
-T{ : DOES2 DOES> @ 2 + ; -> }T
-T{ CREATE CR1 -> }T
-T{ CR1 -> HERE }T
-T{ ' CR1 >BODY -> HERE }T
-T{ 1 , -> }T
-T{ CR1 @ -> 1 }T
-T{ DOES1 -> }T
-T{ CR1 -> 2 }T
-T{ DOES2 -> }T
-T{ CR1 -> 3 }T
-
-T{ : WEIRD: CREATE DOES> 1 + DOES> 2 + ; -> }T
-T{ WEIRD: W1 -> }T
-T{ ' W1 >BODY -> HERE }T
-T{ W1 -> HERE 1 + }T
-T{ W1 -> HERE 2 + }T
-
-\ ------------------------------------------------------------------------
-TESTING EVALUATE
-
-: GE1 S" 123" ; IMMEDIATE
-: GE2 S" 123 1+" ; IMMEDIATE
-: GE3 S" : GE4 345 ;" ;
-: GE5 EVALUATE ; IMMEDIATE
-
-T{ GE1 EVALUATE -> 123 }T ( TEST EVALUATE IN INTERP. STATE )
-T{ GE2 EVALUATE -> 124 }T
-T{ GE3 EVALUATE -> }T
-T{ GE4 -> 345 }T
-
-T{ : GE6 GE1 GE5 ; -> }T ( TEST EVALUATE IN COMPILE STATE )
-T{ GE6 -> 123 }T
-T{ : GE7 GE2 GE5 ; -> }T
-T{ GE7 -> 124 }T
-
-\ ------------------------------------------------------------------------
-TESTING SOURCE >IN WORD
-
-: GS1 S" SOURCE" 2DUP EVALUATE
- >R SWAP >R = R> R> = ;
-T{ GS1 -> <TRUE> <TRUE> }T
-
-VARIABLE SCANS
-: RESCAN? -1 SCANS +! SCANS @ IF 0 >IN ! THEN ;
-
-T{ 2 SCANS !
-345 RESCAN?
--> 345 345 }T
-
-: GS2 5 SCANS ! S" 123 RESCAN?" EVALUATE ;
-T{ GS2 -> 123 123 123 123 123 }T
-
-: GS3 WORD COUNT SWAP C@ ;
-T{ BL GS3 HELLO -> 5 CHAR H }T
-T{ CHAR " GS3 GOODBYE" -> 7 CHAR G }T
-T{ BL GS3
-DROP -> 0 }T \ BLANK LINE RETURN ZERO-LENGTH STRING
-
-: GS4 SOURCE >IN ! DROP ;
-T{ GS4 123 456
--> }T
-
-\ ------------------------------------------------------------------------
-TESTING <# # #S #> HOLD SIGN BASE >NUMBER HEX DECIMAL
-
-: S= \ ( ADDR1 C1 ADDR2 C2 -- T/F ) COMPARE TWO STRINGS.
- >R SWAP R@ = IF \ MAKE SURE STRINGS HAVE SAME LENGTH
- R> ?DUP IF \ IF NON-EMPTY STRINGS
- 0 DO
- OVER C@ OVER C@ - IF
- 2DROP <FALSE> UNLOOP EXIT THEN
- SWAP CHAR+ SWAP CHAR+
- LOOP
- THEN
- 2DROP <TRUE> \ IF WE GET HERE, STRINGS MATCH
- ELSE
- R> DROP 2DROP <FALSE> \ LENGTHS MISMATCH
- THEN ;
-
-: GP1 <# 41 HOLD 42 HOLD 0 0 #> S" BA" S= ;
-T{ GP1 -> <TRUE> }T
-
-: GP2 <# -1 SIGN 0 SIGN -1 SIGN 0 0 #> S" --" S= ;
-T{ GP2 -> <TRUE> }T
-
-: GP3 <# 1 0 # # #> S" 01" S= ;
-T{ GP3 -> <TRUE> }T
-
-: GP4 <# 1 0 #S #> S" 1" S= ;
-T{ GP4 -> <TRUE> }T
-
-24 CONSTANT MAX-BASE \ BASE 2 .. 36
-: COUNT-BITS
- 0 0 INVERT BEGIN DUP WHILE >R 1+ R> 2* REPEAT DROP ;
-COUNT-BITS 2* CONSTANT #BITS-UD \ NUMBER OF BITS IN UD
-
-: GP5
- BASE @ <TRUE>
- MAX-BASE 1+ 2 DO \ FOR EACH POSSIBLE BASE
- I BASE ! \ TBD: ASSUMES BASE WORKS
- I 0 <# #S #> S" 10" S= AND
- LOOP
- SWAP BASE ! ;
-T{ GP5 -> <TRUE> }T
-
-: GP6
- BASE @ >R 2 BASE !
- MAX-UINT MAX-UINT <# #S #> \ MAXIMUM UD TO BINARY
- R> BASE ! \ S: C-ADDR U
- DUP #BITS-UD = SWAP
- 0 DO \ S: C-ADDR FLAG
- OVER C@ [CHAR] 1 = AND \ ALL ONES
- >R CHAR+ R>
- LOOP SWAP DROP ;
-T{ GP6 -> <TRUE> }T
-
-: GP7
- BASE @ >R MAX-BASE BASE !
- <TRUE>
- A 0 DO
- I 0 <# #S #>
- 1 = SWAP C@ I 30 + = AND AND
- LOOP
- MAX-BASE A DO
- I 0 <# #S #>
- 1 = SWAP C@ 41 I A - + = AND AND
- LOOP
- R> BASE ! ;
-
-T{ GP7 -> <TRUE> }T
-
-\ >NUMBER TESTS
-CREATE GN-BUF 0 C,
-: GN-STRING GN-BUF 1 ;
-: GN-CONSUMED GN-BUF CHAR+ 0 ;
-: GN' [CHAR] ' WORD CHAR+ C@ GN-BUF C! GN-STRING ;
-
-T{ 0 0 GN' 0' >NUMBER -> 0 0 GN-CONSUMED }T
-T{ 0 0 GN' 1' >NUMBER -> 1 0 GN-CONSUMED }T
-T{ 1 0 GN' 1' >NUMBER -> BASE @ 1+ 0 GN-CONSUMED }T
-T{ 0 0 GN' -' >NUMBER -> 0 0 GN-STRING }T \ SHOULD FAIL TO CONVERT THESE
-T{ 0 0 GN' +' >NUMBER -> 0 0 GN-STRING }T
-T{ 0 0 GN' .' >NUMBER -> 0 0 GN-STRING }T
-
-: >NUMBER-BASED
- BASE @ >R BASE ! >NUMBER R> BASE ! ;
-
-T{ 0 0 GN' 2' 10 >NUMBER-BASED -> 2 0 GN-CONSUMED }T
-T{ 0 0 GN' 2' 2 >NUMBER-BASED -> 0 0 GN-STRING }T
-T{ 0 0 GN' F' 10 >NUMBER-BASED -> F 0 GN-CONSUMED }T
-T{ 0 0 GN' G' 10 >NUMBER-BASED -> 0 0 GN-STRING }T
-T{ 0 0 GN' G' MAX-BASE >NUMBER-BASED -> 10 0 GN-CONSUMED }T
-T{ 0 0 GN' Z' MAX-BASE >NUMBER-BASED -> 23 0 GN-CONSUMED }T
-
-: GN1 \ ( UD BASE -- UD' LEN ) UD SHOULD EQUAL UD' AND LEN SHOULD BE ZERO.
- BASE @ >R BASE !
- <# #S #>
- 0 0 2SWAP >NUMBER SWAP DROP \ RETURN LENGTH ONLY
- R> BASE ! ;
-T{ 0 0 2 GN1 -> 0 0 0 }T
-T{ MAX-UINT 0 2 GN1 -> MAX-UINT 0 0 }T
-T{ MAX-UINT DUP 2 GN1 -> MAX-UINT DUP 0 }T
-T{ 0 0 MAX-BASE GN1 -> 0 0 0 }T
-T{ MAX-UINT 0 MAX-BASE GN1 -> MAX-UINT 0 0 }T
-T{ MAX-UINT DUP MAX-BASE GN1 -> MAX-UINT DUP 0 }T
-
-: GN2 \ ( -- 16 10 )
- BASE @ >R HEX BASE @ DECIMAL BASE @ R> BASE ! ;
-T{ GN2 -> 10 A }T
-
-\ ------------------------------------------------------------------------
-TESTING FILL MOVE
-
-CREATE FBUF 00 C, 00 C, 00 C,
-CREATE SBUF 12 C, 34 C, 56 C,
-: SEEBUF FBUF C@ FBUF CHAR+ C@ FBUF CHAR+ CHAR+ C@ ;
-
-T{ FBUF 0 20 FILL -> }T
-T{ SEEBUF -> 00 00 00 }T
-
-T{ FBUF 1 20 FILL -> }T
-T{ SEEBUF -> 20 00 00 }T
-
-T{ FBUF 3 20 FILL -> }T
-T{ SEEBUF -> 20 20 20 }T
-
-T{ FBUF FBUF 3 CHARS MOVE -> }T \ BIZARRE SPECIAL CASE
-T{ SEEBUF -> 20 20 20 }T
-
-T{ SBUF FBUF 0 CHARS MOVE -> }T
-T{ SEEBUF -> 20 20 20 }T
-
-T{ SBUF FBUF 1 CHARS MOVE -> }T
-T{ SEEBUF -> 12 20 20 }T
-
-T{ SBUF FBUF 3 CHARS MOVE -> }T
-T{ SEEBUF -> 12 34 56 }T
-
-T{ FBUF FBUF CHAR+ 2 CHARS MOVE -> }T
-T{ SEEBUF -> 12 12 34 }T
-
-T{ FBUF CHAR+ FBUF 2 CHARS MOVE -> }T
-T{ SEEBUF -> 12 34 34 }T
-
-\ ------------------------------------------------------------------------
-TESTING OUTPUT: . ." CR EMIT SPACE SPACES TYPE U.
-
-: OUTPUT-TEST
- ." YOU SHOULD SEE THE STANDARD GRAPHIC CHARACTERS:" CR
- 41 BL DO I EMIT LOOP CR
- 61 41 DO I EMIT LOOP CR
- 7F 61 DO I EMIT LOOP CR
- ." YOU SHOULD SEE 0-9 SEPARATED BY A SPACE:" CR
- 9 1+ 0 DO I . LOOP CR
- ." YOU SHOULD SEE 0-9 (WITH NO SPACES):" CR
- [CHAR] 9 1+ [CHAR] 0 DO I 0 SPACES EMIT LOOP CR
- ." YOU SHOULD SEE A-G SEPARATED BY A SPACE:" CR
- [CHAR] G 1+ [CHAR] A DO I EMIT SPACE LOOP CR
- ." YOU SHOULD SEE 0-5 SEPARATED BY TWO SPACES:" CR
- 5 1+ 0 DO I [CHAR] 0 + EMIT 2 SPACES LOOP CR
- ." YOU SHOULD SEE TWO SEPARATE LINES:" CR
- S" LINE 1" TYPE CR S" LINE 2" TYPE CR
- ." YOU SHOULD SEE THE NUMBER RANGES OF SIGNED AND UNSIGNED NUMBERS:" CR
- ." SIGNED: " MIN-INT . MAX-INT . CR
- ." UNSIGNED: " 0 U. MAX-UINT U. CR
-;
-
-T{ OUTPUT-TEST -> }T
-\ ------------------------------------------------------------------------
-TESTING INPUT: ACCEPT
-
-CREATE ABUF 80 CHARS ALLOT
-
-: ACCEPT-TEST
- CR ." PLEASE TYPE UP TO 80 CHARACTERS:" CR
- ABUF 80 ACCEPT
- CR ." RECEIVED: " [CHAR] " EMIT
- ABUF SWAP TYPE [CHAR] " EMIT CR
-;
-
-T{ ACCEPT-TEST -> }T
-Vingt fois sur le métier remettez votre ouvrage, ...
-\ ------------------------------------------------------------------------
-TESTING DICTIONARY SEARCH RULES
-
-T{ : GDX 123 ; : GDX GDX 234 ; -> }T
-
-T{ GDX -> 123 234 }T
-
-CR .( End of Core word set tests) CR
-
-
-
-RST_STATE ; so ANS_COMPLEMENT_xx_MPY is conserved ;
-\ NOECHO ; if an error occurs, comment this line before new download to find it.
-
-
-\ From: John Hayes S1I
-\ Subject: tester.fr
-\ Date: Mon, 27 Nov 95 13:10:09 PST
-
-\ (C) 1995 JOHNS HOPKINS UNIVERSITY / APPLIED PHYSICS LABORATORY
-\ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS.
-\ VERSION 1.1
-
-\ 22/1/09 The words { and } have been changed to T{ and }T respectively to
-\ agree with the Forth 200X file ttester.fs. This avoids clashes with
-\ locals using { ... } and the FSL use of }
-
-
-\ 13/05/14 jmt. added colorised error messages.
-
-
-
- 0 CONSTANT FALSE
--1 CONSTANT TRUE
-
-\ SET THE FOLLOWING FLAG TO TRUE FOR MORE VERBOSE OUTPUT; THIS MAY
-\ ALLOW YOU TO TELL WHICH TEST CAUSED YOUR SYSTEM TO HANG.
-VARIABLE VERBOSE
- FALSE VERBOSE !
-\ TRUE VERBOSE !
-
-\ : EMPTY-STACK ( ... -- ) \ EMPTY STACK: HANDLES UNDERFLOWED STACK TOO.
-\ DEPTH ?DUP
-\ IF DUP 0< IF NEGATE 0
-\ DO 0 LOOP
-\ ELSE 0 DO DROP LOOP THEN
-\ THEN ;
-\
-\ : ERROR \ ( C-ADDR U -- ) DISPLAY AN ERROR MESSAGE FOLLOWED BY
-\ \ THE LINE THAT HAD THE ERROR.
-\ TYPE SOURCE TYPE CR \ DISPLAY LINE CORRESPONDING TO ERROR
-\ EMPTY-STACK \ THROW AWAY EVERY THING ELSE
-\ QUIT \ *** Uncomment this line to QUIT on an error
-\ ;
-
-VARIABLE ACTUAL-DEPTH \ STACK RECORD
-CREATE ACTUAL-RESULTS 20 CELLS ALLOT
-
-: T{ \ ( -- ) SYNTACTIC SUGAR.
- ;
-
-: -> \ ( ... -- ) RECORD DEPTH AND CONTENT OF STACK.
- DEPTH DUP ACTUAL-DEPTH ! \ RECORD DEPTH
- ?DUP IF \ IF THERE IS SOMETHING ON STACK
- 0 DO ACTUAL-RESULTS I CELLS + ! LOOP \ SAVE THEM
- THEN ;
-
-: }T \ ( ... -- ) COMPARE STACK (EXPECTED) CONTENTS WITH SAVED
- \ (ACTUAL) CONTENTS.
- DEPTH ACTUAL-DEPTH @ = IF \ IF DEPTHS MATCH
- DEPTH ?DUP IF \ IF THERE IS SOMETHING ON THE STACK
- 0 DO \ FOR EACH STACK ITEM
- ACTUAL-RESULTS I CELLS + @ \ COMPARE ACTUAL WITH EXPECTED
-\ = 0= IF S" INCORRECT RESULT: " ERROR LEAVE THEN \ jmt
- = 0= IF ABORT" INCORRECT RESULT: " THEN \ jmt : colorised message
- LOOP
- THEN
- ELSE \ DEPTH MISMATCH
-\ S" WRONG NUMBER OF RESULTS: " ERROR \ jmt
- ABORT" WRONG NUMBER OF RESULTS: " \ jmt : colorised message
- THEN ;
-
-: TESTING \ ( -- ) TALKING COMMENT.
- SOURCE VERBOSE @
- IF DUP >R TYPE CR R> >IN !
- ELSE >IN ! DROP [CHAR] * EMIT
- THEN ;
-
-\ From: John Hayes S1I
-\ Subject: core.fr
-\ Date: Mon, 27 Nov 95 13:10
-
-\ (C) 1995 JOHNS HOPKINS UNIVERSITY / APPLIED PHYSICS LABORATORY
-\ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS.
-\ VERSION 1.2
-\ THIS PROGRAM TESTS THE CORE WORDS OF AN ANS FORTH SYSTEM.
-\ THE PROGRAM ASSUMES A TWO'S COMPLEMENT IMPLEMENTATION WHERE
-\ THE RANGE OF SIGNED NUMBERS IS -2^(N-1) ... 2^(N-1)-1 AND
-\ THE RANGE OF UNSIGNED NUMBERS IS 0 ... 2^(N)-1.
-\ I HAVEN'T FIGURED OUT HOW TO TEST KEY, QUIT, ABORT, OR ABORT"...
-\ I ALSO HAVEN'T THOUGHT OF A WAY TO TEST ENVIRONMENT?...
-
-CR
-TESTING CORE WORDS
-HEX
-
-\ ------------------------------------------------------------------------
-TESTING BASIC ASSUMPTIONS
-
-T{ -> }T \ START WITH CLEAN SLATE
-( TEST IF ANY BITS ARE SET; ANSWER IN BASE 1 )
-T{ : BITSSET? IF 0 0 ELSE 0 THEN ; -> }T
-T{ 0 BITSSET? -> 0 }T ( ZERO IS ALL BITS CLEAR )
-T{ 1 BITSSET? -> 0 0 }T ( OTHER NUMBER HAVE AT LEAST ONE BIT )
-T{ -1 BITSSET? -> 0 0 }T
-
-\ ------------------------------------------------------------------------
-TESTING BOOLEANS: INVERT AND OR XOR
-
-T{ 0 0 AND -> 0 }T
-T{ 0 1 AND -> 0 }T
-T{ 1 0 AND -> 0 }T
-T{ 1 1 AND -> 1 }T
-
-T{ 0 INVERT 1 AND -> 1 }T
-T{ 1 INVERT 1 AND -> 0 }T
-
-0 CONSTANT 0S
-0 INVERT CONSTANT 1S
-
-T{ 0S INVERT -> 1S }T
-T{ 1S INVERT -> 0S }T
-
-T{ 0S 0S AND -> 0S }T
-T{ 0S 1S AND -> 0S }T
-T{ 1S 0S AND -> 0S }T
-T{ 1S 1S AND -> 1S }T
-
-T{ 0S 0S OR -> 0S }T
-T{ 0S 1S OR -> 1S }T
-T{ 1S 0S OR -> 1S }T
-T{ 1S 1S OR -> 1S }T
-
-T{ 0S 0S XOR -> 0S }T
-T{ 0S 1S XOR -> 1S }T
-T{ 1S 0S XOR -> 1S }T
-T{ 1S 1S XOR -> 0S }T
-
-\ ------------------------------------------------------------------------
-TESTING 2* 2/ LSHIFT RSHIFT
-
-( WE TRUST 1S, INVERT, AND BITSSET?; WE WILL CONFIRM RSHIFT LATER )
-1S 1 RSHIFT INVERT CONSTANT MSB
-T{ MSB BITSSET? -> 0 0 }T
-
-T{ 0S 2* -> 0S }T
-T{ 1 2* -> 2 }T
-T{ 4000 2* -> 8000 }T
-T{ 1S 2* 1 XOR -> 1S }T
-T{ MSB 2* -> 0S }T
-
-T{ 0S 2/ -> 0S }T
-T{ 1 2/ -> 0 }T
-T{ 4000 2/ -> 2000 }T
-T{ 1S 2/ -> 1S }T \ MSB PROPOGATED
-T{ 1S 1 XOR 2/ -> 1S }T
-T{ MSB 2/ MSB AND -> MSB }T
-
-T{ 1 0 LSHIFT -> 1 }T
-T{ 1 1 LSHIFT -> 2 }T
-T{ 1 2 LSHIFT -> 4 }T
-T{ 1 F LSHIFT -> 8000 }T \ BIGGEST GUARANTEED SHIFT
-T{ 1S 1 LSHIFT 1 XOR -> 1S }T
-T{ MSB 1 LSHIFT -> 0 }T
-
-T{ 1 0 RSHIFT -> 1 }T
-T{ 1 1 RSHIFT -> 0 }T
-T{ 2 1 RSHIFT -> 1 }T
-T{ 4 2 RSHIFT -> 1 }T
-T{ 8000 F RSHIFT -> 1 }T \ BIGGEST
-T{ MSB 1 RSHIFT MSB AND -> 0 }T \ RSHIFT ZERO FILLS MSBS
-T{ MSB 1 RSHIFT 2* -> MSB }T
-
-\ ------------------------------------------------------------------------
-TESTING COMPARISONS: 0= = 0< < > U< MIN MAX
-0 INVERT CONSTANT MAX-UINT
-0 INVERT 1 RSHIFT CONSTANT MAX-INT
-0 INVERT 1 RSHIFT INVERT CONSTANT MIN-INT
-0 INVERT 1 RSHIFT CONSTANT MID-UINT
-0 INVERT 1 RSHIFT INVERT CONSTANT MID-UINT+1
-
-0S CONSTANT <FALSE>
-1S CONSTANT <TRUE>
-
-T{ 0 0= -> <TRUE> }T
-T{ 1 0= -> <FALSE> }T
-T{ 2 0= -> <FALSE> }T
-T{ -1 0= -> <FALSE> }T
-T{ MAX-UINT 0= -> <FALSE> }T
-T{ MIN-INT 0= -> <FALSE> }T
-T{ MAX-INT 0= -> <FALSE> }T
-
-T{ 0 0 = -> <TRUE> }T
-T{ 1 1 = -> <TRUE> }T
-T{ -1 -1 = -> <TRUE> }T
-T{ 1 0 = -> <FALSE> }T
-T{ -1 0 = -> <FALSE> }T
-T{ 0 1 = -> <FALSE> }T
-T{ 0 -1 = -> <FALSE> }T
-
-T{ 0 0< -> <FALSE> }T
-T{ -1 0< -> <TRUE> }T
-T{ MIN-INT 0< -> <TRUE> }T
-T{ 1 0< -> <FALSE> }T
-T{ MAX-INT 0< -> <FALSE> }T
-
-T{ 0 1 < -> <TRUE> }T
-T{ 1 2 < -> <TRUE> }T
-T{ -1 0 < -> <TRUE> }T
-T{ -1 1 < -> <TRUE> }T
-T{ MIN-INT 0 < -> <TRUE> }T
-T{ MIN-INT MAX-INT < -> <TRUE> }T
-T{ 0 MAX-INT < -> <TRUE> }T
-T{ 0 0 < -> <FALSE> }T
-T{ 1 1 < -> <FALSE> }T
-T{ 1 0 < -> <FALSE> }T
-T{ 2 1 < -> <FALSE> }T
-T{ 0 -1 < -> <FALSE> }T
-T{ 1 -1 < -> <FALSE> }T
-T{ 0 MIN-INT < -> <FALSE> }T
-T{ MAX-INT MIN-INT < -> <FALSE> }T
-T{ MAX-INT 0 < -> <FALSE> }T
-
-T{ 0 1 > -> <FALSE> }T
-T{ 1 2 > -> <FALSE> }T
-T{ -1 0 > -> <FALSE> }T
-T{ -1 1 > -> <FALSE> }T
-T{ MIN-INT 0 > -> <FALSE> }T
-T{ MIN-INT MAX-INT > -> <FALSE> }T
-T{ 0 MAX-INT > -> <FALSE> }T
-T{ 0 0 > -> <FALSE> }T
-T{ 1 1 > -> <FALSE> }T
-T{ 1 0 > -> <TRUE> }T
-T{ 2 1 > -> <TRUE> }T
-T{ 0 -1 > -> <TRUE> }T
-T{ 1 -1 > -> <TRUE> }T
-T{ 0 MIN-INT > -> <TRUE> }T
-T{ MAX-INT MIN-INT > -> <TRUE> }T
-T{ MAX-INT 0 > -> <TRUE> }T
-
-T{ 0 1 U< -> <TRUE> }T
-T{ 1 2 U< -> <TRUE> }T
-T{ 0 MID-UINT U< -> <TRUE> }T
-T{ 0 MAX-UINT U< -> <TRUE> }T
-T{ MID-UINT MAX-UINT U< -> <TRUE> }T
-T{ 0 0 U< -> <FALSE> }T
-T{ 1 1 U< -> <FALSE> }T
-T{ 1 0 U< -> <FALSE> }T
-T{ 2 1 U< -> <FALSE> }T
-T{ MID-UINT 0 U< -> <FALSE> }T
-T{ MAX-UINT 0 U< -> <FALSE> }T
-T{ MAX-UINT MID-UINT U< -> <FALSE> }T
-
-T{ 0 1 MIN -> 0 }T
-T{ 1 2 MIN -> 1 }T
-T{ -1 0 MIN -> -1 }T
-T{ -1 1 MIN -> -1 }T
-T{ MIN-INT 0 MIN -> MIN-INT }T
-T{ MIN-INT MAX-INT MIN -> MIN-INT }T
-T{ 0 MAX-INT MIN -> 0 }T
-T{ 0 0 MIN -> 0 }T
-T{ 1 1 MIN -> 1 }T
-T{ 1 0 MIN -> 0 }T
-T{ 2 1 MIN -> 1 }T
-T{ 0 -1 MIN -> -1 }T
-T{ 1 -1 MIN -> -1 }T
-T{ 0 MIN-INT MIN -> MIN-INT }T
-T{ MAX-INT MIN-INT MIN -> MIN-INT }T
-T{ MAX-INT 0 MIN -> 0 }T
-
-T{ 0 1 MAX -> 1 }T
-T{ 1 2 MAX -> 2 }T
-T{ -1 0 MAX -> 0 }T
-T{ -1 1 MAX -> 1 }T
-T{ MIN-INT 0 MAX -> 0 }T
-T{ MIN-INT MAX-INT MAX -> MAX-INT }T
-T{ 0 MAX-INT MAX -> MAX-INT }T
-T{ 0 0 MAX -> 0 }T
-T{ 1 1 MAX -> 1 }T
-T{ 1 0 MAX -> 1 }T
-T{ 2 1 MAX -> 2 }T
-T{ 0 -1 MAX -> 0 }T
-T{ 1 -1 MAX -> 1 }T
-T{ 0 MIN-INT MAX -> 0 }T
-T{ MAX-INT MIN-INT MAX -> MAX-INT }T
-T{ MAX-INT 0 MAX -> MAX-INT }T
-
-\ ------------------------------------------------------------------------
-TESTING STACK OPS: 2DROP 2DUP 2OVER 2SWAP ?DUP DEPTH DROP DUP OVER ROT SWAP
-
-T{ 1 2 2DROP -> }T
-T{ 1 2 2DUP -> 1 2 1 2 }T
-T{ 1 2 3 4 2OVER -> 1 2 3 4 1 2 }T
-T{ 1 2 3 4 2SWAP -> 3 4 1 2 }T
-T{ 0 ?DUP -> 0 }T
-T{ 1 ?DUP -> 1 1 }T
-T{ -1 ?DUP -> -1 -1 }T
-T{ DEPTH -> 0 }T
-T{ 0 DEPTH -> 0 1 }T
-T{ 0 1 DEPTH -> 0 1 2 }T
-T{ 0 DROP -> }T
-T{ 1 2 DROP -> 1 }T
-T{ 1 DUP -> 1 1 }T
-T{ 1 2 OVER -> 1 2 1 }T
-T{ 1 2 3 ROT -> 2 3 1 }T
-T{ 1 2 SWAP -> 2 1 }T
-
-\ ------------------------------------------------------------------------
-TESTING >R R> R@
-
-T{ : GR1 >R R> ; -> }T
-T{ : GR2 >R R@ R> DROP ; -> }T
-T{ 123 GR1 -> 123 }T
-T{ 123 GR2 -> 123 }T
-T{ 1S GR1 -> 1S }T ( RETURN STACK HOLDS CELLS )
-
-\ ------------------------------------------------------------------------
-TESTING ADD/SUBTRACT: + - 1+ 1- ABS NEGATE
-
-T{ 0 5 + -> 5 }T
-T{ 5 0 + -> 5 }T
-T{ 0 -5 + -> -5 }T
-T{ -5 0 + -> -5 }T
-T{ 1 2 + -> 3 }T
-T{ 1 -2 + -> -1 }T
-T{ -1 2 + -> 1 }T
-T{ -1 -2 + -> -3 }T
-T{ -1 1 + -> 0 }T
-T{ MID-UINT 1 + -> MID-UINT+1 }T
-
-T{ 0 5 - -> -5 }T
-T{ 5 0 - -> 5 }T
-T{ 0 -5 - -> 5 }T
-T{ -5 0 - -> -5 }T
-T{ 1 2 - -> -1 }T
-T{ 1 -2 - -> 3 }T
-T{ -1 2 - -> -3 }T
-T{ -1 -2 - -> 1 }T
-T{ 0 1 - -> -1 }T
-T{ MID-UINT+1 1 - -> MID-UINT }T
-
-T{ 0 1+ -> 1 }T
-T{ -1 1+ -> 0 }T
-T{ 1 1+ -> 2 }T
-T{ MID-UINT 1+ -> MID-UINT+1 }T
-
-T{ 2 1- -> 1 }T
-T{ 1 1- -> 0 }T
-T{ 0 1- -> -1 }T
-T{ MID-UINT+1 1- -> MID-UINT }T
-
-T{ 0 NEGATE -> 0 }T
-T{ 1 NEGATE -> -1 }T
-T{ -1 NEGATE -> 1 }T
-T{ 2 NEGATE -> -2 }T
-T{ -2 NEGATE -> 2 }T
-
-T{ 0 ABS -> 0 }T
-T{ 1 ABS -> 1 }T
-T{ -1 ABS -> 1 }T
-T{ MIN-INT ABS -> MID-UINT+1 }T
-
-\ ------------------------------------------------------------------------
-TESTING MULTIPLY: S>D * M* UM*
-
-T{ 0 S>D -> 0 0 }T
-T{ 1 S>D -> 1 0 }T
-T{ 2 S>D -> 2 0 }T
-T{ -1 S>D -> -1 -1 }T
-T{ -2 S>D -> -2 -1 }T
-T{ MIN-INT S>D -> MIN-INT -1 }T
-T{ MAX-INT S>D -> MAX-INT 0 }T
-
-T{ 0 0 M* -> 0 S>D }T
-T{ 0 1 M* -> 0 S>D }T
-T{ 1 0 M* -> 0 S>D }T
-T{ 1 2 M* -> 2 S>D }T
-T{ 2 1 M* -> 2 S>D }T
-T{ 3 3 M* -> 9 S>D }T
-T{ -3 3 M* -> -9 S>D }T
-T{ 3 -3 M* -> -9 S>D }T
-T{ -3 -3 M* -> 9 S>D }T
-T{ 0 MIN-INT M* -> 0 S>D }T
-T{ 1 MIN-INT M* -> MIN-INT S>D }T
-T{ 2 MIN-INT M* -> 0 1S }T
-T{ 0 MAX-INT M* -> 0 S>D }T
-T{ 1 MAX-INT M* -> MAX-INT S>D }T
-T{ 2 MAX-INT M* -> MAX-INT 1 LSHIFT 0 }T
-T{ MIN-INT MIN-INT M* -> 0 MSB 1 RSHIFT }T
-T{ MAX-INT MIN-INT M* -> MSB MSB 2/ }T
-T{ MAX-INT MAX-INT M* -> 1 MSB 2/ INVERT }T
-
-T{ 0 0 * -> 0 }T \ TEST IDENTITIES
-T{ 0 1 * -> 0 }T
-T{ 1 0 * -> 0 }T
-T{ 1 2 * -> 2 }T
-T{ 2 1 * -> 2 }T
-T{ 3 3 * -> 9 }T
-T{ -3 3 * -> -9 }T
-T{ 3 -3 * -> -9 }T
-T{ -3 -3 * -> 9 }T
-
-T{ MID-UINT+1 1 RSHIFT 2 * -> MID-UINT+1 }T
-T{ MID-UINT+1 2 RSHIFT 4 * -> MID-UINT+1 }T
-T{ MID-UINT+1 1 RSHIFT MID-UINT+1 OR 2 * -> MID-UINT+1 }T
-
-T{ 0 0 UM* -> 0 0 }T
-T{ 0 1 UM* -> 0 0 }T
-T{ 1 0 UM* -> 0 0 }T
-T{ 1 2 UM* -> 2 0 }T
-T{ 2 1 UM* -> 2 0 }T
-T{ 3 3 UM* -> 9 0 }T
-
-T{ MID-UINT+1 1 RSHIFT 2 UM* -> MID-UINT+1 0 }T
-T{ MID-UINT+1 2 UM* -> 0 1 }T
-T{ MID-UINT+1 4 UM* -> 0 2 }T
-T{ 1S 2 UM* -> 1S 1 LSHIFT 1 }T
-T{ MAX-UINT MAX-UINT UM* -> 1 1 INVERT }T
-
-\ ------------------------------------------------------------------------
-TESTING DIVIDE: FM/MOD SM/REM UM/MOD */ */MOD / /MOD MOD
-
-T{ 0 S>D 1 FM/MOD -> 0 0 }T
-T{ 1 S>D 1 FM/MOD -> 0 1 }T
-T{ 2 S>D 1 FM/MOD -> 0 2 }T
-T{ -1 S>D 1 FM/MOD -> 0 -1 }T
-T{ -2 S>D 1 FM/MOD -> 0 -2 }T
-T{ 0 S>D -1 FM/MOD -> 0 0 }T
-T{ 1 S>D -1 FM/MOD -> 0 -1 }T
-T{ 2 S>D -1 FM/MOD -> 0 -2 }T
-T{ -1 S>D -1 FM/MOD -> 0 1 }T
-T{ -2 S>D -1 FM/MOD -> 0 2 }T
-T{ 2 S>D 2 FM/MOD -> 0 1 }T
-T{ -1 S>D -1 FM/MOD -> 0 1 }T
-T{ -2 S>D -2 FM/MOD -> 0 1 }T
-T{ 7 S>D 3 FM/MOD -> 1 2 }T
-T{ 7 S>D -3 FM/MOD -> -2 -3 }T
-T{ -7 S>D 3 FM/MOD -> 2 -3 }T
-T{ -7 S>D -3 FM/MOD -> -1 2 }T
-T{ MAX-INT S>D 1 FM/MOD -> 0 MAX-INT }T
-T{ MIN-INT S>D 1 FM/MOD -> 0 MIN-INT }T
-T{ MAX-INT S>D MAX-INT FM/MOD -> 0 1 }T
-T{ MIN-INT S>D MIN-INT FM/MOD -> 0 1 }T
-T{ 1S 1 4 FM/MOD -> 3 MAX-INT }T
-T{ 1 MIN-INT M* 1 FM/MOD -> 0 MIN-INT }T
-T{ 1 MIN-INT M* MIN-INT FM/MOD -> 0 1 }T
-T{ 2 MIN-INT M* 2 FM/MOD -> 0 MIN-INT }T
-T{ 2 MIN-INT M* MIN-INT FM/MOD -> 0 2 }T
-T{ 1 MAX-INT M* 1 FM/MOD -> 0 MAX-INT }T
-T{ 1 MAX-INT M* MAX-INT FM/MOD -> 0 1 }T
-T{ 2 MAX-INT M* 2 FM/MOD -> 0 MAX-INT }T
-T{ 2 MAX-INT M* MAX-INT FM/MOD -> 0 2 }T
-T{ MIN-INT MIN-INT M* MIN-INT FM/MOD -> 0 MIN-INT }T
-T{ MIN-INT MAX-INT M* MIN-INT FM/MOD -> 0 MAX-INT }T
-T{ MIN-INT MAX-INT M* MAX-INT FM/MOD -> 0 MIN-INT }T
-T{ MAX-INT MAX-INT M* MAX-INT FM/MOD -> 0 MAX-INT }T
-
-T{ 0 S>D 1 SM/REM -> 0 0 }T
-T{ 1 S>D 1 SM/REM -> 0 1 }T
-T{ 2 S>D 1 SM/REM -> 0 2 }T
-T{ -1 S>D 1 SM/REM -> 0 -1 }T
-T{ -2 S>D 1 SM/REM -> 0 -2 }T
-T{ 0 S>D -1 SM/REM -> 0 0 }T
-T{ 1 S>D -1 SM/REM -> 0 -1 }T
-T{ 2 S>D -1 SM/REM -> 0 -2 }T
-T{ -1 S>D -1 SM/REM -> 0 1 }T
-T{ -2 S>D -1 SM/REM -> 0 2 }T
-T{ 2 S>D 2 SM/REM -> 0 1 }T
-T{ -1 S>D -1 SM/REM -> 0 1 }T
-T{ -2 S>D -2 SM/REM -> 0 1 }T
-T{ 7 S>D 3 SM/REM -> 1 2 }T
-T{ 7 S>D -3 SM/REM -> 1 -2 }T
-T{ -7 S>D 3 SM/REM -> -1 -2 }T
-T{ -7 S>D -3 SM/REM -> -1 2 }T
-T{ MAX-INT S>D 1 SM/REM -> 0 MAX-INT }T
-T{ MIN-INT S>D 1 SM/REM -> 0 MIN-INT }T
-T{ MAX-INT S>D MAX-INT SM/REM -> 0 1 }T
-T{ MIN-INT S>D MIN-INT SM/REM -> 0 1 }T
-T{ 1S 1 4 SM/REM -> 3 MAX-INT }T
-T{ 2 MIN-INT M* 2 SM/REM -> 0 MIN-INT }T
-T{ 2 MIN-INT M* MIN-INT SM/REM -> 0 2 }T
-T{ 2 MAX-INT M* 2 SM/REM -> 0 MAX-INT }T
-T{ 2 MAX-INT M* MAX-INT SM/REM -> 0 2 }T
-T{ MIN-INT MIN-INT M* MIN-INT SM/REM -> 0 MIN-INT }T
-T{ MIN-INT MAX-INT M* MIN-INT SM/REM -> 0 MAX-INT }T
-T{ MIN-INT MAX-INT M* MAX-INT SM/REM -> 0 MIN-INT }T
-T{ MAX-INT MAX-INT M* MAX-INT SM/REM -> 0 MAX-INT }T
-
-T{ 0 0 1 UM/MOD -> 0 0 }T
-T{ 1 0 1 UM/MOD -> 0 1 }T
-T{ 1 0 2 UM/MOD -> 1 0 }T
-T{ 3 0 2 UM/MOD -> 1 1 }T
-T{ MAX-UINT 2 UM* 2 UM/MOD -> 0 MAX-UINT }T
-T{ MAX-UINT 2 UM* MAX-UINT UM/MOD -> 0 2 }T
-T{ MAX-UINT MAX-UINT UM* MAX-UINT UM/MOD -> 0 MAX-UINT }T
-
-: IFFLOORED
- [ -3 2 / -2 = INVERT ] LITERAL IF POSTPONE \ THEN ;
-
-: IFSYM
- [ -3 2 / -1 = INVERT ] LITERAL IF POSTPONE \ THEN ;
-
-\ THE SYSTEM MIGHT DO EITHER FLOORED OR SYMMETRIC DIVISION.
-\ SINCE WE HAVE ALREADY TESTED M*, FM/MOD, AND SM/REM WE CAN USE THEM IN TEST.
-
-IFFLOORED : T/MOD >R S>D R> FM/MOD ;
-IFFLOORED : T/ T/MOD SWAP DROP ;
-IFFLOORED : TMOD T/MOD DROP ;
-IFFLOORED : T*/MOD >R M* R> FM/MOD ;
-IFFLOORED : T*/ T*/MOD SWAP DROP ;
-IFSYM : T/MOD >R S>D R> SM/REM ;
-IFSYM : T/ T/MOD SWAP DROP ;
-IFSYM : TMOD T/MOD DROP ;
-IFSYM : T*/MOD >R M* R> SM/REM ;
-IFSYM : T*/ T*/MOD SWAP DROP ;
-
-T{ 0 1 /MOD -> 0 1 T/MOD }T
-T{ 1 1 /MOD -> 1 1 T/MOD }T
-T{ 2 1 /MOD -> 2 1 T/MOD }T
-T{ -1 1 /MOD -> -1 1 T/MOD }T
-T{ -2 1 /MOD -> -2 1 T/MOD }T
-T{ 0 -1 /MOD -> 0 -1 T/MOD }T
-T{ 1 -1 /MOD -> 1 -1 T/MOD }T
-T{ 2 -1 /MOD -> 2 -1 T/MOD }T
-T{ -1 -1 /MOD -> -1 -1 T/MOD }T
-T{ -2 -1 /MOD -> -2 -1 T/MOD }T
-T{ 2 2 /MOD -> 2 2 T/MOD }T
-T{ -1 -1 /MOD -> -1 -1 T/MOD }T
-T{ -2 -2 /MOD -> -2 -2 T/MOD }T
-T{ 7 3 /MOD -> 7 3 T/MOD }T
-T{ 7 -3 /MOD -> 7 -3 T/MOD }T
-T{ -7 3 /MOD -> -7 3 T/MOD }T
-T{ -7 -3 /MOD -> -7 -3 T/MOD }T
-T{ MAX-INT 1 /MOD -> MAX-INT 1 T/MOD }T
-T{ MIN-INT 1 /MOD -> MIN-INT 1 T/MOD }T
-T{ MAX-INT MAX-INT /MOD -> MAX-INT MAX-INT T/MOD }T
-T{ MIN-INT MIN-INT /MOD -> MIN-INT MIN-INT T/MOD }T
-
-T{ 0 1 / -> 0 1 T/ }T
-T{ 1 1 / -> 1 1 T/ }T
-T{ 2 1 / -> 2 1 T/ }T
-T{ -1 1 / -> -1 1 T/ }T
-T{ -2 1 / -> -2 1 T/ }T
-T{ 0 -1 / -> 0 -1 T/ }T
-T{ 1 -1 / -> 1 -1 T/ }T
-T{ 2 -1 / -> 2 -1 T/ }T
-T{ -1 -1 / -> -1 -1 T/ }T
-T{ -2 -1 / -> -2 -1 T/ }T
-T{ 2 2 / -> 2 2 T/ }T
-T{ -1 -1 / -> -1 -1 T/ }T
-T{ -2 -2 / -> -2 -2 T/ }T
-T{ 7 3 / -> 7 3 T/ }T
-T{ 7 -3 / -> 7 -3 T/ }T
-T{ -7 3 / -> -7 3 T/ }T
-T{ -7 -3 / -> -7 -3 T/ }T
-T{ MAX-INT 1 / -> MAX-INT 1 T/ }T
-T{ MIN-INT 1 / -> MIN-INT 1 T/ }T
-T{ MAX-INT MAX-INT / -> MAX-INT MAX-INT T/ }T
-T{ MIN-INT MIN-INT / -> MIN-INT MIN-INT T/ }T
-
-T{ 0 1 MOD -> 0 1 TMOD }T
-T{ 1 1 MOD -> 1 1 TMOD }T
-T{ 2 1 MOD -> 2 1 TMOD }T
-T{ -1 1 MOD -> -1 1 TMOD }T
-T{ -2 1 MOD -> -2 1 TMOD }T
-T{ 0 -1 MOD -> 0 -1 TMOD }T
-T{ 1 -1 MOD -> 1 -1 TMOD }T
-T{ 2 -1 MOD -> 2 -1 TMOD }T
-T{ -1 -1 MOD -> -1 -1 TMOD }T
-T{ -2 -1 MOD -> -2 -1 TMOD }T
-T{ 2 2 MOD -> 2 2 TMOD }T
-T{ -1 -1 MOD -> -1 -1 TMOD }T
-T{ -2 -2 MOD -> -2 -2 TMOD }T
-T{ 7 3 MOD -> 7 3 TMOD }T
-T{ 7 -3 MOD -> 7 -3 TMOD }T
-T{ -7 3 MOD -> -7 3 TMOD }T
-T{ -7 -3 MOD -> -7 -3 TMOD }T
-T{ MAX-INT 1 MOD -> MAX-INT 1 TMOD }T
-T{ MIN-INT 1 MOD -> MIN-INT 1 TMOD }T
-T{ MAX-INT MAX-INT MOD -> MAX-INT MAX-INT TMOD }T
-T{ MIN-INT MIN-INT MOD -> MIN-INT MIN-INT TMOD }T
-
-T{ 0 2 1 */ -> 0 2 1 T*/ }T
-T{ 1 2 1 */ -> 1 2 1 T*/ }T
-T{ 2 2 1 */ -> 2 2 1 T*/ }T
-T{ -1 2 1 */ -> -1 2 1 T*/ }T
-T{ -2 2 1 */ -> -2 2 1 T*/ }T
-T{ 0 2 -1 */ -> 0 2 -1 T*/ }T
-T{ 1 2 -1 */ -> 1 2 -1 T*/ }T
-T{ 2 2 -1 */ -> 2 2 -1 T*/ }T
-T{ -1 2 -1 */ -> -1 2 -1 T*/ }T
-T{ -2 2 -1 */ -> -2 2 -1 T*/ }T
-T{ 2 2 2 */ -> 2 2 2 T*/ }T
-T{ -1 2 -1 */ -> -1 2 -1 T*/ }T
-T{ -2 2 -2 */ -> -2 2 -2 T*/ }T
-T{ 7 2 3 */ -> 7 2 3 T*/ }T
-T{ 7 2 -3 */ -> 7 2 -3 T*/ }T
-T{ -7 2 3 */ -> -7 2 3 T*/ }T
-T{ -7 2 -3 */ -> -7 2 -3 T*/ }T
-T{ MAX-INT 2 MAX-INT */ -> MAX-INT 2 MAX-INT T*/ }T
-T{ MIN-INT 2 MIN-INT */ -> MIN-INT 2 MIN-INT T*/ }T
-
-T{ 0 2 1 */MOD -> 0 2 1 T*/MOD }T
-T{ 1 2 1 */MOD -> 1 2 1 T*/MOD }T
-T{ 2 2 1 */MOD -> 2 2 1 T*/MOD }T
-T{ -1 2 1 */MOD -> -1 2 1 T*/MOD }T
-T{ -2 2 1 */MOD -> -2 2 1 T*/MOD }T
-T{ 0 2 -1 */MOD -> 0 2 -1 T*/MOD }T
-T{ 1 2 -1 */MOD -> 1 2 -1 T*/MOD }T
-T{ 2 2 -1 */MOD -> 2 2 -1 T*/MOD }T
-T{ -1 2 -1 */MOD -> -1 2 -1 T*/MOD }T
-T{ -2 2 -1 */MOD -> -2 2 -1 T*/MOD }T
-T{ 2 2 2 */MOD -> 2 2 2 T*/MOD }T
-T{ -1 2 -1 */MOD -> -1 2 -1 T*/MOD }T
-T{ -2 2 -2 */MOD -> -2 2 -2 T*/MOD }T
-T{ 7 2 3 */MOD -> 7 2 3 T*/MOD }T
-T{ 7 2 -3 */MOD -> 7 2 -3 T*/MOD }T
-T{ -7 2 3 */MOD -> -7 2 3 T*/MOD }T
-T{ -7 2 -3 */MOD -> -7 2 -3 T*/MOD }T
-T{ MAX-INT 2 MAX-INT */MOD -> MAX-INT 2 MAX-INT T*/MOD }T
-T{ MIN-INT 2 MIN-INT */MOD -> MIN-INT 2 MIN-INT T*/MOD }T
-
-\ ------------------------------------------------------------------------
-TESTING HERE , @ ! CELL+ CELLS C, C@ C! CHARS 2@ 2! ALIGN ALIGNED +! ALLOT
-
-HERE 1 ALLOT
-HERE
-CONSTANT 2NDA
-CONSTANT 1STA
-T{ 1STA 2NDA U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT
-T{ 1STA 1+ -> 2NDA }T \ ... BY ONE ADDRESS UNIT
-( MISSING TEST: NEGATIVE ALLOT )
-
-HERE 1 ,
-HERE 2 ,
-CONSTANT 2ND
-CONSTANT 1ST
-T{ 1ST 2ND U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT
-T{ 1ST CELL+ -> 2ND }T \ ... BY ONE CELL
-T{ 1ST 1 CELLS + -> 2ND }T
-T{ 1ST @ 2ND @ -> 1 2 }T
-T{ 5 1ST ! -> }T
-T{ 1ST @ 2ND @ -> 5 2 }T
-T{ 6 2ND ! -> }T
-T{ 1ST @ 2ND @ -> 5 6 }T
-T{ 1ST 2@ -> 6 5 }T
-T{ 2 1 1ST 2! -> }T
-T{ 1ST 2@ -> 2 1 }T
-T{ 1S 1ST ! 1ST @ -> 1S }T \ CAN STORE CELL-WIDE VALUE
-
-HERE 1 C,
-HERE 2 C,
-CONSTANT 2NDC
-CONSTANT 1STC
-T{ 1STC 2NDC U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT
-T{ 1STC CHAR+ -> 2NDC }T \ ... BY ONE CHAR
-T{ 1STC 1 CHARS + -> 2NDC }T
-T{ 1STC C@ 2NDC C@ -> 1 2 }T
-T{ 3 1STC C! -> }T
-T{ 1STC C@ 2NDC C@ -> 3 2 }T
-T{ 4 2NDC C! -> }T
-T{ 1STC C@ 2NDC C@ -> 3 4 }T
-
-ALIGN 1 ALLOT HERE ALIGN HERE 3 CELLS ALLOT
-CONSTANT A-ADDR CONSTANT UA-ADDR
-T{ UA-ADDR ALIGNED -> A-ADDR }T
-T{ 1 A-ADDR C! A-ADDR C@ -> 1 }T
-T{ 1234 A-ADDR ! A-ADDR @ -> 1234 }T
-T{ 123 456 A-ADDR 2! A-ADDR 2@ -> 123 456 }T
-T{ 2 A-ADDR CHAR+ C! A-ADDR CHAR+ C@ -> 2 }T
-T{ 3 A-ADDR CELL+ C! A-ADDR CELL+ C@ -> 3 }T
-T{ 1234 A-ADDR CELL+ ! A-ADDR CELL+ @ -> 1234 }T
-T{ 123 456 A-ADDR CELL+ 2! A-ADDR CELL+ 2@ -> 123 456 }T
-
-: BITS ( X -- U )
- 0 SWAP BEGIN DUP WHILE DUP MSB AND IF >R 1+ R> THEN 2* REPEAT DROP ;
-( CHARACTERS >= 1 AU, <= SIZE OF CELL, >= 8 BITS )
-T{ 1 CHARS 1 < -> <FALSE> }T
-T{ 1 CHARS 1 CELLS > -> <FALSE> }T
-( TBD: HOW TO FIND NUMBER OF BITS? )
-
-( CELLS >= 1 AU, INTEGRAL MULTIPLE OF CHAR SIZE, >= 16 BITS )
-T{ 1 CELLS 1 < -> <FALSE> }T
-T{ 1 CELLS 1 CHARS MOD -> 0 }T
-T{ 1S BITS 10 < -> <FALSE> }T
-
-T{ 0 1ST ! -> }T
-T{ 1 1ST +! -> }T
-T{ 1ST @ -> 1 }T
-T{ -1 1ST +! 1ST @ -> 0 }T
-
-\ ------------------------------------------------------------------------
-TESTING CHAR [CHAR] [ ] BL S"
-
-T{ BL -> 20 }T
-T{ CHAR X -> 58 }T
-T{ CHAR HELLO -> 48 }T
-T{ : GC1 [CHAR] X ; -> }T
-T{ : GC2 [CHAR] HELLO ; -> }T
-T{ GC1 -> 58 }T
-T{ GC2 -> 48 }T
-T{ : GC3 [ GC1 ] LITERAL ; -> }T
-T{ GC3 -> 58 }T
-T{ : GC4 S" XY" ; -> }T
-T{ GC4 SWAP DROP -> 2 }T
-T{ GC4 DROP DUP C@ SWAP CHAR+ C@ -> 58 59 }T
-
-\ ------------------------------------------------------------------------
-TESTING ' ['] FIND EXECUTE IMMEDIATE COUNT LITERAL POSTPONE STATE
-
-T{ : GT1 123 ; -> }T
-T{ ' GT1 EXECUTE -> 123 }T
-T{ : GT2 ['] GT1 ; IMMEDIATE -> }T
-T{ GT2 EXECUTE -> 123 }T
-HERE 3 C, CHAR G C, CHAR T C, CHAR 1 C, CONSTANT GT1STRING
-HERE 3 C, CHAR G C, CHAR T C, CHAR 2 C, CONSTANT GT2STRING
-T{ GT1STRING FIND -> ' GT1 -1 }T
-T{ GT2STRING FIND -> ' GT2 1 }T
-( HOW TO SEARCH FOR NON-EXISTENT WORD? )
-T{ : GT3 GT2 LITERAL ; -> }T
-T{ GT3 -> ' GT1 }T
-T{ GT1STRING COUNT -> GT1STRING CHAR+ 3 }T
-
-T{ : GT4 POSTPONE GT1 ; IMMEDIATE -> }T
-T{ : GT5 GT4 ; -> }T
-T{ GT5 -> 123 }T
-T{ : GT6 345 ; IMMEDIATE -> }T
-T{ : GT7 POSTPONE GT6 ; -> }T
-T{ GT7 -> 345 }T
-
-T{ : GT8 STATE @ ; IMMEDIATE -> }T
-T{ GT8 -> 0 }T
-T{ : GT9 GT8 LITERAL ; -> }T
-T{ GT9 0= -> <FALSE> }T
-
-\ ------------------------------------------------------------------------
-TESTING IF ELSE THEN BEGIN WHILE REPEAT UNTIL RECURSE
-
-T{ : GI1 IF 123 THEN ; -> }T
-T{ : GI2 IF 123 ELSE 234 THEN ; -> }T
-T{ 0 GI1 -> }T
-T{ 1 GI1 -> 123 }T
-T{ -1 GI1 -> 123 }T
-T{ 0 GI2 -> 234 }T
-T{ 1 GI2 -> 123 }T
-T{ -1 GI1 -> 123 }T
-
-T{ : GI3 BEGIN DUP 5 < WHILE DUP 1+ REPEAT ; -> }T
-T{ 0 GI3 -> 0 1 2 3 4 5 }T
-T{ 4 GI3 -> 4 5 }T
-T{ 5 GI3 -> 5 }T
-T{ 6 GI3 -> 6 }T
-
-T{ : GI4 BEGIN DUP 1+ DUP 5 > UNTIL ; -> }T
-T{ 3 GI4 -> 3 4 5 6 }T
-T{ 5 GI4 -> 5 6 }T
-T{ 6 GI4 -> 6 7 }T
-
-T{ : GI5 BEGIN DUP 2 > WHILE DUP 5 < WHILE DUP 1+ REPEAT 123 ELSE 345 THEN ; -> }T
-T{ 1 GI5 -> 1 345 }T
-T{ 2 GI5 -> 2 345 }T
-T{ 3 GI5 -> 3 4 5 123 }T
-T{ 4 GI5 -> 4 5 123 }T
-T{ 5 GI5 -> 5 123 }T
-
-T{ : GI6 ( N -- 0,1,..N ) DUP IF DUP >R 1- RECURSE R> THEN ; -> }T
-T{ 0 GI6 -> 0 }T
-T{ 1 GI6 -> 0 1 }T
-T{ 2 GI6 -> 0 1 2 }T
-T{ 3 GI6 -> 0 1 2 3 }T
-T{ 4 GI6 -> 0 1 2 3 4 }T
-
-\ ------------------------------------------------------------------------
-TESTING DO LOOP +LOOP I J UNLOOP LEAVE EXIT
-
-T{ : GD1 DO I LOOP ; -> }T
-T{ 4 1 GD1 -> 1 2 3 }T
-T{ 2 -1 GD1 -> -1 0 1 }T
-T{ MID-UINT+1 MID-UINT GD1 -> MID-UINT }T
-
-T{ : GD2 DO I -1 +LOOP ; -> }T
-T{ 1 4 GD2 -> 4 3 2 1 }T
-T{ -1 2 GD2 -> 2 1 0 -1 }T
-T{ MID-UINT MID-UINT+1 GD2 -> MID-UINT+1 MID-UINT }T
-
-T{ : GD3 DO 1 0 DO J LOOP LOOP ; -> }T
-T{ 4 1 GD3 -> 1 2 3 }T
-T{ 2 -1 GD3 -> -1 0 1 }T
-T{ MID-UINT+1 MID-UINT GD3 -> MID-UINT }T
-
-T{ : GD4 DO 1 0 DO J LOOP -1 +LOOP ; -> }T
-T{ 1 4 GD4 -> 4 3 2 1 }T
-T{ -1 2 GD4 -> 2 1 0 -1 }T
-T{ MID-UINT MID-UINT+1 GD4 -> MID-UINT+1 MID-UINT }T
-
-T{ : GD5 123 SWAP 0 DO I 4 > IF DROP 234 LEAVE THEN LOOP ; -> }T
-T{ 1 GD5 -> 123 }T
-T{ 5 GD5 -> 123 }T
-T{ 6 GD5 -> 234 }T
-
-T{ : GD6 ( PAT: T{0 0}T,T{0 0}TT{1 0}TT{1 1}T,T{0 0}TT{1 0}TT{1 1}TT{2 0}TT{2 1}TT{2 2}T )
- 0 SWAP 0 DO
- I 1+ 0 DO I J + 3 = IF I UNLOOP I UNLOOP EXIT THEN 1+ LOOP
- LOOP ; -> }T
-T{ 1 GD6 -> 1 }T
-T{ 2 GD6 -> 3 }T
-T{ 3 GD6 -> 4 1 2 }T
-
-\ ------------------------------------------------------------------------
-TESTING DEFINING WORDS: : ; CONSTANT VARIABLE CREATE DOES> >BODY
-
-T{ 123 CONSTANT X123 -> }T
-T{ X123 -> 123 }T
-T{ : EQU CONSTANT ; -> }T
-T{ X123 EQU Y123 -> }T
-T{ Y123 -> 123 }T
-
-T{ VARIABLE V1 -> }T
-T{ 123 V1 ! -> }T
-T{ V1 @ -> 123 }T
-
-T{ : NOP : POSTPONE ; ; -> }T
-T{ NOP NOP1 NOP NOP2 -> }T
-T{ NOP1 -> }T
-T{ NOP2 -> }T
-
-T{ : DOES1 DOES> @ 1 + ; -> }T
-T{ : DOES2 DOES> @ 2 + ; -> }T
-T{ CREATE CR1 -> }T
-T{ CR1 -> HERE }T
-T{ ' CR1 >BODY -> HERE }T
-T{ 1 , -> }T
-T{ CR1 @ -> 1 }T
-T{ DOES1 -> }T
-T{ CR1 -> 2 }T
-T{ DOES2 -> }T
-T{ CR1 -> 3 }T
-
-T{ : WEIRD: CREATE DOES> 1 + DOES> 2 + ; -> }T
-T{ WEIRD: W1 -> }T
-T{ ' W1 >BODY -> HERE }T
-T{ W1 -> HERE 1 + }T
-T{ W1 -> HERE 2 + }T
-
-\ ------------------------------------------------------------------------
-TESTING EVALUATE
-
-: GE1 S" 123" ; IMMEDIATE
-: GE2 S" 123 1+" ; IMMEDIATE
-: GE3 S" : GE4 345 ;" ;
-: GE5 EVALUATE ; IMMEDIATE
-
-T{ GE1 EVALUATE -> 123 }T ( TEST EVALUATE IN INTERP. STATE )
-T{ GE2 EVALUATE -> 124 }T
-T{ GE3 EVALUATE -> }T
-T{ GE4 -> 345 }T
-
-T{ : GE6 GE1 GE5 ; -> }T ( TEST EVALUATE IN COMPILE STATE )
-T{ GE6 -> 123 }T
-T{ : GE7 GE2 GE5 ; -> }T
-T{ GE7 -> 124 }T
-
-\ ------------------------------------------------------------------------
-TESTING SOURCE >IN WORD
-
-: GS1 S" SOURCE" 2DUP EVALUATE
- >R SWAP >R = R> R> = ;
-T{ GS1 -> <TRUE> <TRUE> }T
-
-VARIABLE SCANS
-: RESCAN? -1 SCANS +! SCANS @ IF 0 >IN ! THEN ;
-
-T{ 2 SCANS !
-345 RESCAN?
--> 345 345 }T
-
-: GS2 5 SCANS ! S" 123 RESCAN?" EVALUATE ;
-T{ GS2 -> 123 123 123 123 123 }T
-
-: GS3 WORD COUNT SWAP C@ ;
-T{ BL GS3 HELLO -> 5 CHAR H }T
-T{ CHAR " GS3 GOODBYE" -> 7 CHAR G }T
-T{ BL GS3
-DROP -> 0 }T \ BLANK LINE RETURN ZERO-LENGTH STRING
-
-: GS4 SOURCE >IN ! DROP ;
-T{ GS4 123 456
--> }T
-
-\ ------------------------------------------------------------------------
-TESTING <# # #S #> HOLD SIGN BASE >NUMBER HEX DECIMAL
-
-: S= \ ( ADDR1 C1 ADDR2 C2 -- T/F ) COMPARE TWO STRINGS.
- >R SWAP R@ = IF \ MAKE SURE STRINGS HAVE SAME LENGTH
- R> ?DUP IF \ IF NON-EMPTY STRINGS
- 0 DO
- OVER C@ OVER C@ - IF
- 2DROP <FALSE> UNLOOP EXIT THEN
- SWAP CHAR+ SWAP CHAR+
- LOOP
- THEN
- 2DROP <TRUE> \ IF WE GET HERE, STRINGS MATCH
- ELSE
- R> DROP 2DROP <FALSE> \ LENGTHS MISMATCH
- THEN ;
-
-: GP1 <# 41 HOLD 42 HOLD 0 0 #> S" BA" S= ;
-T{ GP1 -> <TRUE> }T
-
-: GP2 <# -1 SIGN 0 SIGN -1 SIGN 0 0 #> S" --" S= ;
-T{ GP2 -> <TRUE> }T
-
-: GP3 <# 1 0 # # #> S" 01" S= ;
-T{ GP3 -> <TRUE> }T
-
-: GP4 <# 1 0 #S #> S" 1" S= ;
-T{ GP4 -> <TRUE> }T
-
-24 CONSTANT MAX-BASE \ BASE 2 .. 36
-: COUNT-BITS
- 0 0 INVERT BEGIN DUP WHILE >R 1+ R> 2* REPEAT DROP ;
-COUNT-BITS 2* CONSTANT #BITS-UD \ NUMBER OF BITS IN UD
-
-: GP5
- BASE @ <TRUE>
- MAX-BASE 1+ 2 DO \ FOR EACH POSSIBLE BASE
- I BASE ! \ TBD: ASSUMES BASE WORKS
- I 0 <# #S #> S" 10" S= AND
- LOOP
- SWAP BASE ! ;
-T{ GP5 -> <TRUE> }T
-
-: GP6
- BASE @ >R 2 BASE !
- MAX-UINT MAX-UINT <# #S #> \ MAXIMUM UD TO BINARY
- R> BASE ! \ S: C-ADDR U
- DUP #BITS-UD = SWAP
- 0 DO \ S: C-ADDR FLAG
- OVER C@ [CHAR] 1 = AND \ ALL ONES
- >R CHAR+ R>
- LOOP SWAP DROP ;
-T{ GP6 -> <TRUE> }T
-
-: GP7
- BASE @ >R MAX-BASE BASE !
- <TRUE>
- A 0 DO
- I 0 <# #S #>
- 1 = SWAP C@ I 30 + = AND AND
- LOOP
- MAX-BASE A DO
- I 0 <# #S #>
- 1 = SWAP C@ 41 I A - + = AND AND
- LOOP
- R> BASE ! ;
-
-T{ GP7 -> <TRUE> }T
-
-\ >NUMBER TESTS
-CREATE GN-BUF 0 C,
-: GN-STRING GN-BUF 1 ;
-: GN-CONSUMED GN-BUF CHAR+ 0 ;
-: GN' [CHAR] ' WORD CHAR+ C@ GN-BUF C! GN-STRING ;
-
-T{ 0 0 GN' 0' >NUMBER -> 0 0 GN-CONSUMED }T
-T{ 0 0 GN' 1' >NUMBER -> 1 0 GN-CONSUMED }T
-T{ 1 0 GN' 1' >NUMBER -> BASE @ 1+ 0 GN-CONSUMED }T
-T{ 0 0 GN' -' >NUMBER -> 0 0 GN-STRING }T \ SHOULD FAIL TO CONVERT THESE
-T{ 0 0 GN' +' >NUMBER -> 0 0 GN-STRING }T
-T{ 0 0 GN' .' >NUMBER -> 0 0 GN-STRING }T
-
-: >NUMBER-BASED
- BASE @ >R BASE ! >NUMBER R> BASE ! ;
-
-T{ 0 0 GN' 2' 10 >NUMBER-BASED -> 2 0 GN-CONSUMED }T
-T{ 0 0 GN' 2' 2 >NUMBER-BASED -> 0 0 GN-STRING }T
-T{ 0 0 GN' F' 10 >NUMBER-BASED -> F 0 GN-CONSUMED }T
-T{ 0 0 GN' G' 10 >NUMBER-BASED -> 0 0 GN-STRING }T
-T{ 0 0 GN' G' MAX-BASE >NUMBER-BASED -> 10 0 GN-CONSUMED }T
-T{ 0 0 GN' Z' MAX-BASE >NUMBER-BASED -> 23 0 GN-CONSUMED }T
-
-: GN1 \ ( UD BASE -- UD' LEN ) UD SHOULD EQUAL UD' AND LEN SHOULD BE ZERO.
- BASE @ >R BASE !
- <# #S #>
- 0 0 2SWAP >NUMBER SWAP DROP \ RETURN LENGTH ONLY
- R> BASE ! ;
-T{ 0 0 2 GN1 -> 0 0 0 }T
-T{ MAX-UINT 0 2 GN1 -> MAX-UINT 0 0 }T
-T{ MAX-UINT DUP 2 GN1 -> MAX-UINT DUP 0 }T
-T{ 0 0 MAX-BASE GN1 -> 0 0 0 }T
-T{ MAX-UINT 0 MAX-BASE GN1 -> MAX-UINT 0 0 }T
-T{ MAX-UINT DUP MAX-BASE GN1 -> MAX-UINT DUP 0 }T
-
-: GN2 \ ( -- 16 10 )
- BASE @ >R HEX BASE @ DECIMAL BASE @ R> BASE ! ;
-T{ GN2 -> 10 A }T
-
-\ ------------------------------------------------------------------------
-TESTING FILL MOVE
-
-CREATE FBUF 00 C, 00 C, 00 C,
-CREATE SBUF 12 C, 34 C, 56 C,
-: SEEBUF FBUF C@ FBUF CHAR+ C@ FBUF CHAR+ CHAR+ C@ ;
-
-T{ FBUF 0 20 FILL -> }T
-T{ SEEBUF -> 00 00 00 }T
-
-T{ FBUF 1 20 FILL -> }T
-T{ SEEBUF -> 20 00 00 }T
-
-T{ FBUF 3 20 FILL -> }T
-T{ SEEBUF -> 20 20 20 }T
-
-T{ FBUF FBUF 3 CHARS MOVE -> }T \ BIZARRE SPECIAL CASE
-T{ SEEBUF -> 20 20 20 }T
-
-T{ SBUF FBUF 0 CHARS MOVE -> }T
-T{ SEEBUF -> 20 20 20 }T
-
-T{ SBUF FBUF 1 CHARS MOVE -> }T
-T{ SEEBUF -> 12 20 20 }T
-
-T{ SBUF FBUF 3 CHARS MOVE -> }T
-T{ SEEBUF -> 12 34 56 }T
-
-T{ FBUF FBUF CHAR+ 2 CHARS MOVE -> }T
-T{ SEEBUF -> 12 12 34 }T
-
-T{ FBUF CHAR+ FBUF 2 CHARS MOVE -> }T
-T{ SEEBUF -> 12 34 34 }T
-
-\ ------------------------------------------------------------------------
-TESTING OUTPUT: . ." CR EMIT SPACE SPACES TYPE U.
-
-: OUTPUT-TEST
- ." YOU SHOULD SEE THE STANDARD GRAPHIC CHARACTERS:" CR
- 41 BL DO I EMIT LOOP CR
- 61 41 DO I EMIT LOOP CR
- 7F 61 DO I EMIT LOOP CR
- ." YOU SHOULD SEE 0-9 SEPARATED BY A SPACE:" CR
- 9 1+ 0 DO I . LOOP CR
- ." YOU SHOULD SEE 0-9 (WITH NO SPACES):" CR
- [CHAR] 9 1+ [CHAR] 0 DO I 0 SPACES EMIT LOOP CR
- ." YOU SHOULD SEE A-G SEPARATED BY A SPACE:" CR
- [CHAR] G 1+ [CHAR] A DO I EMIT SPACE LOOP CR
- ." YOU SHOULD SEE 0-5 SEPARATED BY TWO SPACES:" CR
- 5 1+ 0 DO I [CHAR] 0 + EMIT 2 SPACES LOOP CR
- ." YOU SHOULD SEE TWO SEPARATE LINES:" CR
- S" LINE 1" TYPE CR S" LINE 2" TYPE CR
- ." YOU SHOULD SEE THE NUMBER RANGES OF SIGNED AND UNSIGNED NUMBERS:" CR
- ." SIGNED: " MIN-INT . MAX-INT . CR
- ." UNSIGNED: " 0 U. MAX-UINT U. CR
-;
-
-T{ OUTPUT-TEST -> }T
-\ ------------------------------------------------------------------------
-TESTING INPUT: ACCEPT
-
-CREATE ABUF 80 CHARS ALLOT
-
-: ACCEPT-TEST
- CR ." PLEASE TYPE UP TO 80 CHARACTERS:" CR
- ABUF 80 ACCEPT
- CR ." RECEIVED: " [CHAR] " EMIT
- ABUF SWAP TYPE [CHAR] " EMIT CR
-;
-
-T{ ACCEPT-TEST -> }T
-Vingt fois sur le métier remettez votre ouvrage, ...
-\ ------------------------------------------------------------------------
-TESTING DICTIONARY SEARCH RULES
-
-T{ : GDX 123 ; : GDX GDX 234 ; -> }T
-
-T{ GDX -> 123 234 }T
-
-CR .( End of Core word set tests) CR
-
-
-
-RST_STATE ; so ANS_COMPLEMENT_xx_MPY is conserved ;
-\ NOECHO ; if an error occurs, comment this line before new download to find it.
-
-
-\ From: John Hayes S1I
-\ Subject: tester.fr
-\ Date: Mon, 27 Nov 95 13:10:09 PST
-
-\ (C) 1995 JOHNS HOPKINS UNIVERSITY / APPLIED PHYSICS LABORATORY
-\ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS.
-\ VERSION 1.1
-
-\ 22/1/09 The words { and } have been changed to T{ and }T respectively to
-\ agree with the Forth 200X file ttester.fs. This avoids clashes with
-\ locals using { ... } and the FSL use of }
-
-
-\ 13/05/14 jmt. added colorised error messages.
-
-
-
- 0 CONSTANT FALSE
--1 CONSTANT TRUE
-
-\ SET THE FOLLOWING FLAG TO TRUE FOR MORE VERBOSE OUTPUT; THIS MAY
-\ ALLOW YOU TO TELL WHICH TEST CAUSED YOUR SYSTEM TO HANG.
-VARIABLE VERBOSE
- FALSE VERBOSE !
-\ TRUE VERBOSE !
-
-\ : EMPTY-STACK ( ... -- ) \ EMPTY STACK: HANDLES UNDERFLOWED STACK TOO.
-\ DEPTH ?DUP
-\ IF DUP 0< IF NEGATE 0
-\ DO 0 LOOP
-\ ELSE 0 DO DROP LOOP THEN
-\ THEN ;
-\
-\ : ERROR \ ( C-ADDR U -- ) DISPLAY AN ERROR MESSAGE FOLLOWED BY
-\ \ THE LINE THAT HAD THE ERROR.
-\ TYPE SOURCE TYPE CR \ DISPLAY LINE CORRESPONDING TO ERROR
-\ EMPTY-STACK \ THROW AWAY EVERY THING ELSE
-\ QUIT \ *** Uncomment this line to QUIT on an error
-\ ;
-
-VARIABLE ACTUAL-DEPTH \ STACK RECORD
-CREATE ACTUAL-RESULTS 20 CELLS ALLOT
-
-: T{ \ ( -- ) SYNTACTIC SUGAR.
- ;
-
-: -> \ ( ... -- ) RECORD DEPTH AND CONTENT OF STACK.
- DEPTH DUP ACTUAL-DEPTH ! \ RECORD DEPTH
- ?DUP IF \ IF THERE IS SOMETHING ON STACK
- 0 DO ACTUAL-RESULTS I CELLS + ! LOOP \ SAVE THEM
- THEN ;
-
-: }T \ ( ... -- ) COMPARE STACK (EXPECTED) CONTENTS WITH SAVED
- \ (ACTUAL) CONTENTS.
- DEPTH ACTUAL-DEPTH @ = IF \ IF DEPTHS MATCH
- DEPTH ?DUP IF \ IF THERE IS SOMETHING ON THE STACK
- 0 DO \ FOR EACH STACK ITEM
- ACTUAL-RESULTS I CELLS + @ \ COMPARE ACTUAL WITH EXPECTED
-\ = 0= IF S" INCORRECT RESULT: " ERROR LEAVE THEN \ jmt
- = 0= IF ABORT" INCORRECT RESULT: " THEN \ jmt : colorised message
- LOOP
- THEN
- ELSE \ DEPTH MISMATCH
-\ S" WRONG NUMBER OF RESULTS: " ERROR \ jmt
- ABORT" WRONG NUMBER OF RESULTS: " \ jmt : colorised message
- THEN ;
-
-: TESTING \ ( -- ) TALKING COMMENT.
- SOURCE VERBOSE @
- IF DUP >R TYPE CR R> >IN !
- ELSE >IN ! DROP [CHAR] * EMIT
- THEN ;
-
-\ From: John Hayes S1I
-\ Subject: core.fr
-\ Date: Mon, 27 Nov 95 13:10
-
-\ (C) 1995 JOHNS HOPKINS UNIVERSITY / APPLIED PHYSICS LABORATORY
-\ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS.
-\ VERSION 1.2
-\ THIS PROGRAM TESTS THE CORE WORDS OF AN ANS FORTH SYSTEM.
-\ THE PROGRAM ASSUMES A TWO'S COMPLEMENT IMPLEMENTATION WHERE
-\ THE RANGE OF SIGNED NUMBERS IS -2^(N-1) ... 2^(N-1)-1 AND
-\ THE RANGE OF UNSIGNED NUMBERS IS 0 ... 2^(N)-1.
-\ I HAVEN'T FIGURED OUT HOW TO TEST KEY, QUIT, ABORT, OR ABORT"...
-\ I ALSO HAVEN'T THOUGHT OF A WAY TO TEST ENVIRONMENT?...
-
-CR
-TESTING CORE WORDS
-HEX
-
-\ ------------------------------------------------------------------------
-TESTING BASIC ASSUMPTIONS
-
-T{ -> }T \ START WITH CLEAN SLATE
-( TEST IF ANY BITS ARE SET; ANSWER IN BASE 1 )
-T{ : BITSSET? IF 0 0 ELSE 0 THEN ; -> }T
-T{ 0 BITSSET? -> 0 }T ( ZERO IS ALL BITS CLEAR )
-T{ 1 BITSSET? -> 0 0 }T ( OTHER NUMBER HAVE AT LEAST ONE BIT )
-T{ -1 BITSSET? -> 0 0 }T
-
-\ ------------------------------------------------------------------------
-TESTING BOOLEANS: INVERT AND OR XOR
-
-T{ 0 0 AND -> 0 }T
-T{ 0 1 AND -> 0 }T
-T{ 1 0 AND -> 0 }T
-T{ 1 1 AND -> 1 }T
-
-T{ 0 INVERT 1 AND -> 1 }T
-T{ 1 INVERT 1 AND -> 0 }T
-
-0 CONSTANT 0S
-0 INVERT CONSTANT 1S
-
-T{ 0S INVERT -> 1S }T
-T{ 1S INVERT -> 0S }T
-
-T{ 0S 0S AND -> 0S }T
-T{ 0S 1S AND -> 0S }T
-T{ 1S 0S AND -> 0S }T
-T{ 1S 1S AND -> 1S }T
-
-T{ 0S 0S OR -> 0S }T
-T{ 0S 1S OR -> 1S }T
-T{ 1S 0S OR -> 1S }T
-T{ 1S 1S OR -> 1S }T
-
-T{ 0S 0S XOR -> 0S }T
-T{ 0S 1S XOR -> 1S }T
-T{ 1S 0S XOR -> 1S }T
-T{ 1S 1S XOR -> 0S }T
-
-\ ------------------------------------------------------------------------
-TESTING 2* 2/ LSHIFT RSHIFT
-
-( WE TRUST 1S, INVERT, AND BITSSET?; WE WILL CONFIRM RSHIFT LATER )
-1S 1 RSHIFT INVERT CONSTANT MSB
-T{ MSB BITSSET? -> 0 0 }T
-
-T{ 0S 2* -> 0S }T
-T{ 1 2* -> 2 }T
-T{ 4000 2* -> 8000 }T
-T{ 1S 2* 1 XOR -> 1S }T
-T{ MSB 2* -> 0S }T
-
-T{ 0S 2/ -> 0S }T
-T{ 1 2/ -> 0 }T
-T{ 4000 2/ -> 2000 }T
-T{ 1S 2/ -> 1S }T \ MSB PROPOGATED
-T{ 1S 1 XOR 2/ -> 1S }T
-T{ MSB 2/ MSB AND -> MSB }T
-
-T{ 1 0 LSHIFT -> 1 }T
-T{ 1 1 LSHIFT -> 2 }T
-T{ 1 2 LSHIFT -> 4 }T
-T{ 1 F LSHIFT -> 8000 }T \ BIGGEST GUARANTEED SHIFT
-T{ 1S 1 LSHIFT 1 XOR -> 1S }T
-T{ MSB 1 LSHIFT -> 0 }T
-
-T{ 1 0 RSHIFT -> 1 }T
-T{ 1 1 RSHIFT -> 0 }T
-T{ 2 1 RSHIFT -> 1 }T
-T{ 4 2 RSHIFT -> 1 }T
-T{ 8000 F RSHIFT -> 1 }T \ BIGGEST
-T{ MSB 1 RSHIFT MSB AND -> 0 }T \ RSHIFT ZERO FILLS MSBS
-T{ MSB 1 RSHIFT 2* -> MSB }T
-
-\ ------------------------------------------------------------------------
-TESTING COMPARISONS: 0= = 0< < > U< MIN MAX
-0 INVERT CONSTANT MAX-UINT
-0 INVERT 1 RSHIFT CONSTANT MAX-INT
-0 INVERT 1 RSHIFT INVERT CONSTANT MIN-INT
-0 INVERT 1 RSHIFT CONSTANT MID-UINT
-0 INVERT 1 RSHIFT INVERT CONSTANT MID-UINT+1
-
-0S CONSTANT <FALSE>
-1S CONSTANT <TRUE>
-
-T{ 0 0= -> <TRUE> }T
-T{ 1 0= -> <FALSE> }T
-T{ 2 0= -> <FALSE> }T
-T{ -1 0= -> <FALSE> }T
-T{ MAX-UINT 0= -> <FALSE> }T
-T{ MIN-INT 0= -> <FALSE> }T
-T{ MAX-INT 0= -> <FALSE> }T
-
-T{ 0 0 = -> <TRUE> }T
-T{ 1 1 = -> <TRUE> }T
-T{ -1 -1 = -> <TRUE> }T
-T{ 1 0 = -> <FALSE> }T
-T{ -1 0 = -> <FALSE> }T
-T{ 0 1 = -> <FALSE> }T
-T{ 0 -1 = -> <FALSE> }T
-
-T{ 0 0< -> <FALSE> }T
-T{ -1 0< -> <TRUE> }T
-T{ MIN-INT 0< -> <TRUE> }T
-T{ 1 0< -> <FALSE> }T
-T{ MAX-INT 0< -> <FALSE> }T
-
-T{ 0 1 < -> <TRUE> }T
-T{ 1 2 < -> <TRUE> }T
-T{ -1 0 < -> <TRUE> }T
-T{ -1 1 < -> <TRUE> }T
-T{ MIN-INT 0 < -> <TRUE> }T
-T{ MIN-INT MAX-INT < -> <TRUE> }T
-T{ 0 MAX-INT < -> <TRUE> }T
-T{ 0 0 < -> <FALSE> }T
-T{ 1 1 < -> <FALSE> }T
-T{ 1 0 < -> <FALSE> }T
-T{ 2 1 < -> <FALSE> }T
-T{ 0 -1 < -> <FALSE> }T
-T{ 1 -1 < -> <FALSE> }T
-T{ 0 MIN-INT < -> <FALSE> }T
-T{ MAX-INT MIN-INT < -> <FALSE> }T
-T{ MAX-INT 0 < -> <FALSE> }T
-
-T{ 0 1 > -> <FALSE> }T
-T{ 1 2 > -> <FALSE> }T
-T{ -1 0 > -> <FALSE> }T
-T{ -1 1 > -> <FALSE> }T
-T{ MIN-INT 0 > -> <FALSE> }T
-T{ MIN-INT MAX-INT > -> <FALSE> }T
-T{ 0 MAX-INT > -> <FALSE> }T
-T{ 0 0 > -> <FALSE> }T
-T{ 1 1 > -> <FALSE> }T
-T{ 1 0 > -> <TRUE> }T
-T{ 2 1 > -> <TRUE> }T
-T{ 0 -1 > -> <TRUE> }T
-T{ 1 -1 > -> <TRUE> }T
-T{ 0 MIN-INT > -> <TRUE> }T
-T{ MAX-INT MIN-INT > -> <TRUE> }T
-T{ MAX-INT 0 > -> <TRUE> }T
-
-T{ 0 1 U< -> <TRUE> }T
-T{ 1 2 U< -> <TRUE> }T
-T{ 0 MID-UINT U< -> <TRUE> }T
-T{ 0 MAX-UINT U< -> <TRUE> }T
-T{ MID-UINT MAX-UINT U< -> <TRUE> }T
-T{ 0 0 U< -> <FALSE> }T
-T{ 1 1 U< -> <FALSE> }T
-T{ 1 0 U< -> <FALSE> }T
-T{ 2 1 U< -> <FALSE> }T
-T{ MID-UINT 0 U< -> <FALSE> }T
-T{ MAX-UINT 0 U< -> <FALSE> }T
-T{ MAX-UINT MID-UINT U< -> <FALSE> }T
-
-T{ 0 1 MIN -> 0 }T
-T{ 1 2 MIN -> 1 }T
-T{ -1 0 MIN -> -1 }T
-T{ -1 1 MIN -> -1 }T
-T{ MIN-INT 0 MIN -> MIN-INT }T
-T{ MIN-INT MAX-INT MIN -> MIN-INT }T
-T{ 0 MAX-INT MIN -> 0 }T
-T{ 0 0 MIN -> 0 }T
-T{ 1 1 MIN -> 1 }T
-T{ 1 0 MIN -> 0 }T
-T{ 2 1 MIN -> 1 }T
-T{ 0 -1 MIN -> -1 }T
-T{ 1 -1 MIN -> -1 }T
-T{ 0 MIN-INT MIN -> MIN-INT }T
-T{ MAX-INT MIN-INT MIN -> MIN-INT }T
-T{ MAX-INT 0 MIN -> 0 }T
-
-T{ 0 1 MAX -> 1 }T
-T{ 1 2 MAX -> 2 }T
-T{ -1 0 MAX -> 0 }T
-T{ -1 1 MAX -> 1 }T
-T{ MIN-INT 0 MAX -> 0 }T
-T{ MIN-INT MAX-INT MAX -> MAX-INT }T
-T{ 0 MAX-INT MAX -> MAX-INT }T
-T{ 0 0 MAX -> 0 }T
-T{ 1 1 MAX -> 1 }T
-T{ 1 0 MAX -> 1 }T
-T{ 2 1 MAX -> 2 }T
-T{ 0 -1 MAX -> 0 }T
-T{ 1 -1 MAX -> 1 }T
-T{ 0 MIN-INT MAX -> 0 }T
-T{ MAX-INT MIN-INT MAX -> MAX-INT }T
-T{ MAX-INT 0 MAX -> MAX-INT }T
-
-\ ------------------------------------------------------------------------
-TESTING STACK OPS: 2DROP 2DUP 2OVER 2SWAP ?DUP DEPTH DROP DUP OVER ROT SWAP
-
-T{ 1 2 2DROP -> }T
-T{ 1 2 2DUP -> 1 2 1 2 }T
-T{ 1 2 3 4 2OVER -> 1 2 3 4 1 2 }T
-T{ 1 2 3 4 2SWAP -> 3 4 1 2 }T
-T{ 0 ?DUP -> 0 }T
-T{ 1 ?DUP -> 1 1 }T
-T{ -1 ?DUP -> -1 -1 }T
-T{ DEPTH -> 0 }T
-T{ 0 DEPTH -> 0 1 }T
-T{ 0 1 DEPTH -> 0 1 2 }T
-T{ 0 DROP -> }T
-T{ 1 2 DROP -> 1 }T
-T{ 1 DUP -> 1 1 }T
-T{ 1 2 OVER -> 1 2 1 }T
-T{ 1 2 3 ROT -> 2 3 1 }T
-T{ 1 2 SWAP -> 2 1 }T
-
-\ ------------------------------------------------------------------------
-TESTING >R R> R@
-
-T{ : GR1 >R R> ; -> }T
-T{ : GR2 >R R@ R> DROP ; -> }T
-T{ 123 GR1 -> 123 }T
-T{ 123 GR2 -> 123 }T
-T{ 1S GR1 -> 1S }T ( RETURN STACK HOLDS CELLS )
-
-\ ------------------------------------------------------------------------
-TESTING ADD/SUBTRACT: + - 1+ 1- ABS NEGATE
-
-T{ 0 5 + -> 5 }T
-T{ 5 0 + -> 5 }T
-T{ 0 -5 + -> -5 }T
-T{ -5 0 + -> -5 }T
-T{ 1 2 + -> 3 }T
-T{ 1 -2 + -> -1 }T
-T{ -1 2 + -> 1 }T
-T{ -1 -2 + -> -3 }T
-T{ -1 1 + -> 0 }T
-T{ MID-UINT 1 + -> MID-UINT+1 }T
-
-T{ 0 5 - -> -5 }T
-T{ 5 0 - -> 5 }T
-T{ 0 -5 - -> 5 }T
-T{ -5 0 - -> -5 }T
-T{ 1 2 - -> -1 }T
-T{ 1 -2 - -> 3 }T
-T{ -1 2 - -> -3 }T
-T{ -1 -2 - -> 1 }T
-T{ 0 1 - -> -1 }T
-T{ MID-UINT+1 1 - -> MID-UINT }T
-
-T{ 0 1+ -> 1 }T
-T{ -1 1+ -> 0 }T
-T{ 1 1+ -> 2 }T
-T{ MID-UINT 1+ -> MID-UINT+1 }T
-
-T{ 2 1- -> 1 }T
-T{ 1 1- -> 0 }T
-T{ 0 1- -> -1 }T
-T{ MID-UINT+1 1- -> MID-UINT }T
-
-T{ 0 NEGATE -> 0 }T
-T{ 1 NEGATE -> -1 }T
-T{ -1 NEGATE -> 1 }T
-T{ 2 NEGATE -> -2 }T
-T{ -2 NEGATE -> 2 }T
-
-T{ 0 ABS -> 0 }T
-T{ 1 ABS -> 1 }T
-T{ -1 ABS -> 1 }T
-T{ MIN-INT ABS -> MID-UINT+1 }T
-
-\ ------------------------------------------------------------------------
-TESTING MULTIPLY: S>D * M* UM*
-
-T{ 0 S>D -> 0 0 }T
-T{ 1 S>D -> 1 0 }T
-T{ 2 S>D -> 2 0 }T
-T{ -1 S>D -> -1 -1 }T
-T{ -2 S>D -> -2 -1 }T
-T{ MIN-INT S>D -> MIN-INT -1 }T
-T{ MAX-INT S>D -> MAX-INT 0 }T
-
-T{ 0 0 M* -> 0 S>D }T
-T{ 0 1 M* -> 0 S>D }T
-T{ 1 0 M* -> 0 S>D }T
-T{ 1 2 M* -> 2 S>D }T
-T{ 2 1 M* -> 2 S>D }T
-T{ 3 3 M* -> 9 S>D }T
-T{ -3 3 M* -> -9 S>D }T
-T{ 3 -3 M* -> -9 S>D }T
-T{ -3 -3 M* -> 9 S>D }T
-T{ 0 MIN-INT M* -> 0 S>D }T
-T{ 1 MIN-INT M* -> MIN-INT S>D }T
-T{ 2 MIN-INT M* -> 0 1S }T
-T{ 0 MAX-INT M* -> 0 S>D }T
-T{ 1 MAX-INT M* -> MAX-INT S>D }T
-T{ 2 MAX-INT M* -> MAX-INT 1 LSHIFT 0 }T
-T{ MIN-INT MIN-INT M* -> 0 MSB 1 RSHIFT }T
-T{ MAX-INT MIN-INT M* -> MSB MSB 2/ }T
-T{ MAX-INT MAX-INT M* -> 1 MSB 2/ INVERT }T
-
-T{ 0 0 * -> 0 }T \ TEST IDENTITIES
-T{ 0 1 * -> 0 }T
-T{ 1 0 * -> 0 }T
-T{ 1 2 * -> 2 }T
-T{ 2 1 * -> 2 }T
-T{ 3 3 * -> 9 }T
-T{ -3 3 * -> -9 }T
-T{ 3 -3 * -> -9 }T
-T{ -3 -3 * -> 9 }T
-
-T{ MID-UINT+1 1 RSHIFT 2 * -> MID-UINT+1 }T
-T{ MID-UINT+1 2 RSHIFT 4 * -> MID-UINT+1 }T
-T{ MID-UINT+1 1 RSHIFT MID-UINT+1 OR 2 * -> MID-UINT+1 }T
-
-T{ 0 0 UM* -> 0 0 }T
-T{ 0 1 UM* -> 0 0 }T
-T{ 1 0 UM* -> 0 0 }T
-T{ 1 2 UM* -> 2 0 }T
-T{ 2 1 UM* -> 2 0 }T
-T{ 3 3 UM* -> 9 0 }T
-
-T{ MID-UINT+1 1 RSHIFT 2 UM* -> MID-UINT+1 0 }T
-T{ MID-UINT+1 2 UM* -> 0 1 }T
-T{ MID-UINT+1 4 UM* -> 0 2 }T
-T{ 1S 2 UM* -> 1S 1 LSHIFT 1 }T
-T{ MAX-UINT MAX-UINT UM* -> 1 1 INVERT }T
-
-\ ------------------------------------------------------------------------
-TESTING DIVIDE: FM/MOD SM/REM UM/MOD */ */MOD / /MOD MOD
-
-T{ 0 S>D 1 FM/MOD -> 0 0 }T
-T{ 1 S>D 1 FM/MOD -> 0 1 }T
-T{ 2 S>D 1 FM/MOD -> 0 2 }T
-T{ -1 S>D 1 FM/MOD -> 0 -1 }T
-T{ -2 S>D 1 FM/MOD -> 0 -2 }T
-T{ 0 S>D -1 FM/MOD -> 0 0 }T
-T{ 1 S>D -1 FM/MOD -> 0 -1 }T
-T{ 2 S>D -1 FM/MOD -> 0 -2 }T
-T{ -1 S>D -1 FM/MOD -> 0 1 }T
-T{ -2 S>D -1 FM/MOD -> 0 2 }T
-T{ 2 S>D 2 FM/MOD -> 0 1 }T
-T{ -1 S>D -1 FM/MOD -> 0 1 }T
-T{ -2 S>D -2 FM/MOD -> 0 1 }T
-T{ 7 S>D 3 FM/MOD -> 1 2 }T
-T{ 7 S>D -3 FM/MOD -> -2 -3 }T
-T{ -7 S>D 3 FM/MOD -> 2 -3 }T
-T{ -7 S>D -3 FM/MOD -> -1 2 }T
-T{ MAX-INT S>D 1 FM/MOD -> 0 MAX-INT }T
-T{ MIN-INT S>D 1 FM/MOD -> 0 MIN-INT }T
-T{ MAX-INT S>D MAX-INT FM/MOD -> 0 1 }T
-T{ MIN-INT S>D MIN-INT FM/MOD -> 0 1 }T
-T{ 1S 1 4 FM/MOD -> 3 MAX-INT }T
-T{ 1 MIN-INT M* 1 FM/MOD -> 0 MIN-INT }T
-T{ 1 MIN-INT M* MIN-INT FM/MOD -> 0 1 }T
-T{ 2 MIN-INT M* 2 FM/MOD -> 0 MIN-INT }T
-T{ 2 MIN-INT M* MIN-INT FM/MOD -> 0 2 }T
-T{ 1 MAX-INT M* 1 FM/MOD -> 0 MAX-INT }T
-T{ 1 MAX-INT M* MAX-INT FM/MOD -> 0 1 }T
-T{ 2 MAX-INT M* 2 FM/MOD -> 0 MAX-INT }T
-T{ 2 MAX-INT M* MAX-INT FM/MOD -> 0 2 }T
-T{ MIN-INT MIN-INT M* MIN-INT FM/MOD -> 0 MIN-INT }T
-T{ MIN-INT MAX-INT M* MIN-INT FM/MOD -> 0 MAX-INT }T
-T{ MIN-INT MAX-INT M* MAX-INT FM/MOD -> 0 MIN-INT }T
-T{ MAX-INT MAX-INT M* MAX-INT FM/MOD -> 0 MAX-INT }T
-
-T{ 0 S>D 1 SM/REM -> 0 0 }T
-T{ 1 S>D 1 SM/REM -> 0 1 }T
-T{ 2 S>D 1 SM/REM -> 0 2 }T
-T{ -1 S>D 1 SM/REM -> 0 -1 }T
-T{ -2 S>D 1 SM/REM -> 0 -2 }T
-T{ 0 S>D -1 SM/REM -> 0 0 }T
-T{ 1 S>D -1 SM/REM -> 0 -1 }T
-T{ 2 S>D -1 SM/REM -> 0 -2 }T
-T{ -1 S>D -1 SM/REM -> 0 1 }T
-T{ -2 S>D -1 SM/REM -> 0 2 }T
-T{ 2 S>D 2 SM/REM -> 0 1 }T
-T{ -1 S>D -1 SM/REM -> 0 1 }T
-T{ -2 S>D -2 SM/REM -> 0 1 }T
-T{ 7 S>D 3 SM/REM -> 1 2 }T
-T{ 7 S>D -3 SM/REM -> 1 -2 }T
-T{ -7 S>D 3 SM/REM -> -1 -2 }T
-T{ -7 S>D -3 SM/REM -> -1 2 }T
-T{ MAX-INT S>D 1 SM/REM -> 0 MAX-INT }T
-T{ MIN-INT S>D 1 SM/REM -> 0 MIN-INT }T
-T{ MAX-INT S>D MAX-INT SM/REM -> 0 1 }T
-T{ MIN-INT S>D MIN-INT SM/REM -> 0 1 }T
-T{ 1S 1 4 SM/REM -> 3 MAX-INT }T
-T{ 2 MIN-INT M* 2 SM/REM -> 0 MIN-INT }T
-T{ 2 MIN-INT M* MIN-INT SM/REM -> 0 2 }T
-T{ 2 MAX-INT M* 2 SM/REM -> 0 MAX-INT }T
-T{ 2 MAX-INT M* MAX-INT SM/REM -> 0 2 }T
-T{ MIN-INT MIN-INT M* MIN-INT SM/REM -> 0 MIN-INT }T
-T{ MIN-INT MAX-INT M* MIN-INT SM/REM -> 0 MAX-INT }T
-T{ MIN-INT MAX-INT M* MAX-INT SM/REM -> 0 MIN-INT }T
-T{ MAX-INT MAX-INT M* MAX-INT SM/REM -> 0 MAX-INT }T
-
-T{ 0 0 1 UM/MOD -> 0 0 }T
-T{ 1 0 1 UM/MOD -> 0 1 }T
-T{ 1 0 2 UM/MOD -> 1 0 }T
-T{ 3 0 2 UM/MOD -> 1 1 }T
-T{ MAX-UINT 2 UM* 2 UM/MOD -> 0 MAX-UINT }T
-T{ MAX-UINT 2 UM* MAX-UINT UM/MOD -> 0 2 }T
-T{ MAX-UINT MAX-UINT UM* MAX-UINT UM/MOD -> 0 MAX-UINT }T
-
-: IFFLOORED
- [ -3 2 / -2 = INVERT ] LITERAL IF POSTPONE \ THEN ;
-
-: IFSYM
- [ -3 2 / -1 = INVERT ] LITERAL IF POSTPONE \ THEN ;
-
-\ THE SYSTEM MIGHT DO EITHER FLOORED OR SYMMETRIC DIVISION.
-\ SINCE WE HAVE ALREADY TESTED M*, FM/MOD, AND SM/REM WE CAN USE THEM IN TEST.
-
-IFFLOORED : T/MOD >R S>D R> FM/MOD ;
-IFFLOORED : T/ T/MOD SWAP DROP ;
-IFFLOORED : TMOD T/MOD DROP ;
-IFFLOORED : T*/MOD >R M* R> FM/MOD ;
-IFFLOORED : T*/ T*/MOD SWAP DROP ;
-IFSYM : T/MOD >R S>D R> SM/REM ;
-IFSYM : T/ T/MOD SWAP DROP ;
-IFSYM : TMOD T/MOD DROP ;
-IFSYM : T*/MOD >R M* R> SM/REM ;
-IFSYM : T*/ T*/MOD SWAP DROP ;
-
-T{ 0 1 /MOD -> 0 1 T/MOD }T
-T{ 1 1 /MOD -> 1 1 T/MOD }T
-T{ 2 1 /MOD -> 2 1 T/MOD }T
-T{ -1 1 /MOD -> -1 1 T/MOD }T
-T{ -2 1 /MOD -> -2 1 T/MOD }T
-T{ 0 -1 /MOD -> 0 -1 T/MOD }T
-T{ 1 -1 /MOD -> 1 -1 T/MOD }T
-T{ 2 -1 /MOD -> 2 -1 T/MOD }T
-T{ -1 -1 /MOD -> -1 -1 T/MOD }T
-T{ -2 -1 /MOD -> -2 -1 T/MOD }T
-T{ 2 2 /MOD -> 2 2 T/MOD }T
-T{ -1 -1 /MOD -> -1 -1 T/MOD }T
-T{ -2 -2 /MOD -> -2 -2 T/MOD }T
-T{ 7 3 /MOD -> 7 3 T/MOD }T
-T{ 7 -3 /MOD -> 7 -3 T/MOD }T
-T{ -7 3 /MOD -> -7 3 T/MOD }T
-T{ -7 -3 /MOD -> -7 -3 T/MOD }T
-T{ MAX-INT 1 /MOD -> MAX-INT 1 T/MOD }T
-T{ MIN-INT 1 /MOD -> MIN-INT 1 T/MOD }T
-T{ MAX-INT MAX-INT /MOD -> MAX-INT MAX-INT T/MOD }T
-T{ MIN-INT MIN-INT /MOD -> MIN-INT MIN-INT T/MOD }T
-
-T{ 0 1 / -> 0 1 T/ }T
-T{ 1 1 / -> 1 1 T/ }T
-T{ 2 1 / -> 2 1 T/ }T
-T{ -1 1 / -> -1 1 T/ }T
-T{ -2 1 / -> -2 1 T/ }T
-T{ 0 -1 / -> 0 -1 T/ }T
-T{ 1 -1 / -> 1 -1 T/ }T
-T{ 2 -1 / -> 2 -1 T/ }T
-T{ -1 -1 / -> -1 -1 T/ }T
-T{ -2 -1 / -> -2 -1 T/ }T
-T{ 2 2 / -> 2 2 T/ }T
-T{ -1 -1 / -> -1 -1 T/ }T
-T{ -2 -2 / -> -2 -2 T/ }T
-T{ 7 3 / -> 7 3 T/ }T
-T{ 7 -3 / -> 7 -3 T/ }T
-T{ -7 3 / -> -7 3 T/ }T
-T{ -7 -3 / -> -7 -3 T/ }T
-T{ MAX-INT 1 / -> MAX-INT 1 T/ }T
-T{ MIN-INT 1 / -> MIN-INT 1 T/ }T
-T{ MAX-INT MAX-INT / -> MAX-INT MAX-INT T/ }T
-T{ MIN-INT MIN-INT / -> MIN-INT MIN-INT T/ }T
-
-T{ 0 1 MOD -> 0 1 TMOD }T
-T{ 1 1 MOD -> 1 1 TMOD }T
-T{ 2 1 MOD -> 2 1 TMOD }T
-T{ -1 1 MOD -> -1 1 TMOD }T
-T{ -2 1 MOD -> -2 1 TMOD }T
-T{ 0 -1 MOD -> 0 -1 TMOD }T
-T{ 1 -1 MOD -> 1 -1 TMOD }T
-T{ 2 -1 MOD -> 2 -1 TMOD }T
-T{ -1 -1 MOD -> -1 -1 TMOD }T
-T{ -2 -1 MOD -> -2 -1 TMOD }T
-T{ 2 2 MOD -> 2 2 TMOD }T
-T{ -1 -1 MOD -> -1 -1 TMOD }T
-T{ -2 -2 MOD -> -2 -2 TMOD }T
-T{ 7 3 MOD -> 7 3 TMOD }T
-T{ 7 -3 MOD -> 7 -3 TMOD }T
-T{ -7 3 MOD -> -7 3 TMOD }T
-T{ -7 -3 MOD -> -7 -3 TMOD }T
-T{ MAX-INT 1 MOD -> MAX-INT 1 TMOD }T
-T{ MIN-INT 1 MOD -> MIN-INT 1 TMOD }T
-T{ MAX-INT MAX-INT MOD -> MAX-INT MAX-INT TMOD }T
-T{ MIN-INT MIN-INT MOD -> MIN-INT MIN-INT TMOD }T
-
-T{ 0 2 1 */ -> 0 2 1 T*/ }T
-T{ 1 2 1 */ -> 1 2 1 T*/ }T
-T{ 2 2 1 */ -> 2 2 1 T*/ }T
-T{ -1 2 1 */ -> -1 2 1 T*/ }T
-T{ -2 2 1 */ -> -2 2 1 T*/ }T
-T{ 0 2 -1 */ -> 0 2 -1 T*/ }T
-T{ 1 2 -1 */ -> 1 2 -1 T*/ }T
-T{ 2 2 -1 */ -> 2 2 -1 T*/ }T
-T{ -1 2 -1 */ -> -1 2 -1 T*/ }T
-T{ -2 2 -1 */ -> -2 2 -1 T*/ }T
-T{ 2 2 2 */ -> 2 2 2 T*/ }T
-T{ -1 2 -1 */ -> -1 2 -1 T*/ }T
-T{ -2 2 -2 */ -> -2 2 -2 T*/ }T
-T{ 7 2 3 */ -> 7 2 3 T*/ }T
-T{ 7 2 -3 */ -> 7 2 -3 T*/ }T
-T{ -7 2 3 */ -> -7 2 3 T*/ }T
-T{ -7 2 -3 */ -> -7 2 -3 T*/ }T
-T{ MAX-INT 2 MAX-INT */ -> MAX-INT 2 MAX-INT T*/ }T
-T{ MIN-INT 2 MIN-INT */ -> MIN-INT 2 MIN-INT T*/ }T
-
-T{ 0 2 1 */MOD -> 0 2 1 T*/MOD }T
-T{ 1 2 1 */MOD -> 1 2 1 T*/MOD }T
-T{ 2 2 1 */MOD -> 2 2 1 T*/MOD }T
-T{ -1 2 1 */MOD -> -1 2 1 T*/MOD }T
-T{ -2 2 1 */MOD -> -2 2 1 T*/MOD }T
-T{ 0 2 -1 */MOD -> 0 2 -1 T*/MOD }T
-T{ 1 2 -1 */MOD -> 1 2 -1 T*/MOD }T
-T{ 2 2 -1 */MOD -> 2 2 -1 T*/MOD }T
-T{ -1 2 -1 */MOD -> -1 2 -1 T*/MOD }T
-T{ -2 2 -1 */MOD -> -2 2 -1 T*/MOD }T
-T{ 2 2 2 */MOD -> 2 2 2 T*/MOD }T
-T{ -1 2 -1 */MOD -> -1 2 -1 T*/MOD }T
-T{ -2 2 -2 */MOD -> -2 2 -2 T*/MOD }T
-T{ 7 2 3 */MOD -> 7 2 3 T*/MOD }T
-T{ 7 2 -3 */MOD -> 7 2 -3 T*/MOD }T
-T{ -7 2 3 */MOD -> -7 2 3 T*/MOD }T
-T{ -7 2 -3 */MOD -> -7 2 -3 T*/MOD }T
-T{ MAX-INT 2 MAX-INT */MOD -> MAX-INT 2 MAX-INT T*/MOD }T
-T{ MIN-INT 2 MIN-INT */MOD -> MIN-INT 2 MIN-INT T*/MOD }T
-
-\ ------------------------------------------------------------------------
-TESTING HERE , @ ! CELL+ CELLS C, C@ C! CHARS 2@ 2! ALIGN ALIGNED +! ALLOT
-
-HERE 1 ALLOT
-HERE
-CONSTANT 2NDA
-CONSTANT 1STA
-T{ 1STA 2NDA U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT
-T{ 1STA 1+ -> 2NDA }T \ ... BY ONE ADDRESS UNIT
-( MISSING TEST: NEGATIVE ALLOT )
-
-HERE 1 ,
-HERE 2 ,
-CONSTANT 2ND
-CONSTANT 1ST
-T{ 1ST 2ND U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT
-T{ 1ST CELL+ -> 2ND }T \ ... BY ONE CELL
-T{ 1ST 1 CELLS + -> 2ND }T
-T{ 1ST @ 2ND @ -> 1 2 }T
-T{ 5 1ST ! -> }T
-T{ 1ST @ 2ND @ -> 5 2 }T
-T{ 6 2ND ! -> }T
-T{ 1ST @ 2ND @ -> 5 6 }T
-T{ 1ST 2@ -> 6 5 }T
-T{ 2 1 1ST 2! -> }T
-T{ 1ST 2@ -> 2 1 }T
-T{ 1S 1ST ! 1ST @ -> 1S }T \ CAN STORE CELL-WIDE VALUE
-
-HERE 1 C,
-HERE 2 C,
-CONSTANT 2NDC
-CONSTANT 1STC
-T{ 1STC 2NDC U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT
-T{ 1STC CHAR+ -> 2NDC }T \ ... BY ONE CHAR
-T{ 1STC 1 CHARS + -> 2NDC }T
-T{ 1STC C@ 2NDC C@ -> 1 2 }T
-T{ 3 1STC C! -> }T
-T{ 1STC C@ 2NDC C@ -> 3 2 }T
-T{ 4 2NDC C! -> }T
-T{ 1STC C@ 2NDC C@ -> 3 4 }T
-
-ALIGN 1 ALLOT HERE ALIGN HERE 3 CELLS ALLOT
-CONSTANT A-ADDR CONSTANT UA-ADDR
-T{ UA-ADDR ALIGNED -> A-ADDR }T
-T{ 1 A-ADDR C! A-ADDR C@ -> 1 }T
-T{ 1234 A-ADDR ! A-ADDR @ -> 1234 }T
-T{ 123 456 A-ADDR 2! A-ADDR 2@ -> 123 456 }T
-T{ 2 A-ADDR CHAR+ C! A-ADDR CHAR+ C@ -> 2 }T
-T{ 3 A-ADDR CELL+ C! A-ADDR CELL+ C@ -> 3 }T
-T{ 1234 A-ADDR CELL+ ! A-ADDR CELL+ @ -> 1234 }T
-T{ 123 456 A-ADDR CELL+ 2! A-ADDR CELL+ 2@ -> 123 456 }T
-
-: BITS ( X -- U )
- 0 SWAP BEGIN DUP WHILE DUP MSB AND IF >R 1+ R> THEN 2* REPEAT DROP ;
-( CHARACTERS >= 1 AU, <= SIZE OF CELL, >= 8 BITS )
-T{ 1 CHARS 1 < -> <FALSE> }T
-T{ 1 CHARS 1 CELLS > -> <FALSE> }T
-( TBD: HOW TO FIND NUMBER OF BITS? )
-
-( CELLS >= 1 AU, INTEGRAL MULTIPLE OF CHAR SIZE, >= 16 BITS )
-T{ 1 CELLS 1 < -> <FALSE> }T
-T{ 1 CELLS 1 CHARS MOD -> 0 }T
-T{ 1S BITS 10 < -> <FALSE> }T
-
-T{ 0 1ST ! -> }T
-T{ 1 1ST +! -> }T
-T{ 1ST @ -> 1 }T
-T{ -1 1ST +! 1ST @ -> 0 }T
-
-\ ------------------------------------------------------------------------
-TESTING CHAR [CHAR] [ ] BL S"
-
-T{ BL -> 20 }T
-T{ CHAR X -> 58 }T
-T{ CHAR HELLO -> 48 }T
-T{ : GC1 [CHAR] X ; -> }T
-T{ : GC2 [CHAR] HELLO ; -> }T
-T{ GC1 -> 58 }T
-T{ GC2 -> 48 }T
-T{ : GC3 [ GC1 ] LITERAL ; -> }T
-T{ GC3 -> 58 }T
-T{ : GC4 S" XY" ; -> }T
-T{ GC4 SWAP DROP -> 2 }T
-T{ GC4 DROP DUP C@ SWAP CHAR+ C@ -> 58 59 }T
-
-\ ------------------------------------------------------------------------
-TESTING ' ['] FIND EXECUTE IMMEDIATE COUNT LITERAL POSTPONE STATE
-
-T{ : GT1 123 ; -> }T
-T{ ' GT1 EXECUTE -> 123 }T
-T{ : GT2 ['] GT1 ; IMMEDIATE -> }T
-T{ GT2 EXECUTE -> 123 }T
-HERE 3 C, CHAR G C, CHAR T C, CHAR 1 C, CONSTANT GT1STRING
-HERE 3 C, CHAR G C, CHAR T C, CHAR 2 C, CONSTANT GT2STRING
-T{ GT1STRING FIND -> ' GT1 -1 }T
-T{ GT2STRING FIND -> ' GT2 1 }T
-( HOW TO SEARCH FOR NON-EXISTENT WORD? )
-T{ : GT3 GT2 LITERAL ; -> }T
-T{ GT3 -> ' GT1 }T
-T{ GT1STRING COUNT -> GT1STRING CHAR+ 3 }T
-
-T{ : GT4 POSTPONE GT1 ; IMMEDIATE -> }T
-T{ : GT5 GT4 ; -> }T
-T{ GT5 -> 123 }T
-T{ : GT6 345 ; IMMEDIATE -> }T
-T{ : GT7 POSTPONE GT6 ; -> }T
-T{ GT7 -> 345 }T
-
-T{ : GT8 STATE @ ; IMMEDIATE -> }T
-T{ GT8 -> 0 }T
-T{ : GT9 GT8 LITERAL ; -> }T
-T{ GT9 0= -> <FALSE> }T
-
-\ ------------------------------------------------------------------------
-TESTING IF ELSE THEN BEGIN WHILE REPEAT UNTIL RECURSE
-
-T{ : GI1 IF 123 THEN ; -> }T
-T{ : GI2 IF 123 ELSE 234 THEN ; -> }T
-T{ 0 GI1 -> }T
-T{ 1 GI1 -> 123 }T
-T{ -1 GI1 -> 123 }T
-T{ 0 GI2 -> 234 }T
-T{ 1 GI2 -> 123 }T
-T{ -1 GI1 -> 123 }T
-
-T{ : GI3 BEGIN DUP 5 < WHILE DUP 1+ REPEAT ; -> }T
-T{ 0 GI3 -> 0 1 2 3 4 5 }T
-T{ 4 GI3 -> 4 5 }T
-T{ 5 GI3 -> 5 }T
-T{ 6 GI3 -> 6 }T
-
-T{ : GI4 BEGIN DUP 1+ DUP 5 > UNTIL ; -> }T
-T{ 3 GI4 -> 3 4 5 6 }T
-T{ 5 GI4 -> 5 6 }T
-T{ 6 GI4 -> 6 7 }T
-
-T{ : GI5 BEGIN DUP 2 > WHILE DUP 5 < WHILE DUP 1+ REPEAT 123 ELSE 345 THEN ; -> }T
-T{ 1 GI5 -> 1 345 }T
-T{ 2 GI5 -> 2 345 }T
-T{ 3 GI5 -> 3 4 5 123 }T
-T{ 4 GI5 -> 4 5 123 }T
-T{ 5 GI5 -> 5 123 }T
-
-T{ : GI6 ( N -- 0,1,..N ) DUP IF DUP >R 1- RECURSE R> THEN ; -> }T
-T{ 0 GI6 -> 0 }T
-T{ 1 GI6 -> 0 1 }T
-T{ 2 GI6 -> 0 1 2 }T
-T{ 3 GI6 -> 0 1 2 3 }T
-T{ 4 GI6 -> 0 1 2 3 4 }T
-
-\ ------------------------------------------------------------------------
-TESTING DO LOOP +LOOP I J UNLOOP LEAVE EXIT
-
-T{ : GD1 DO I LOOP ; -> }T
-T{ 4 1 GD1 -> 1 2 3 }T
-T{ 2 -1 GD1 -> -1 0 1 }T
-T{ MID-UINT+1 MID-UINT GD1 -> MID-UINT }T
-
-T{ : GD2 DO I -1 +LOOP ; -> }T
-T{ 1 4 GD2 -> 4 3 2 1 }T
-T{ -1 2 GD2 -> 2 1 0 -1 }T
-T{ MID-UINT MID-UINT+1 GD2 -> MID-UINT+1 MID-UINT }T
-
-T{ : GD3 DO 1 0 DO J LOOP LOOP ; -> }T
-T{ 4 1 GD3 -> 1 2 3 }T
-T{ 2 -1 GD3 -> -1 0 1 }T
-T{ MID-UINT+1 MID-UINT GD3 -> MID-UINT }T
-
-T{ : GD4 DO 1 0 DO J LOOP -1 +LOOP ; -> }T
-T{ 1 4 GD4 -> 4 3 2 1 }T
-T{ -1 2 GD4 -> 2 1 0 -1 }T
-T{ MID-UINT MID-UINT+1 GD4 -> MID-UINT+1 MID-UINT }T
-
-T{ : GD5 123 SWAP 0 DO I 4 > IF DROP 234 LEAVE THEN LOOP ; -> }T
-T{ 1 GD5 -> 123 }T
-T{ 5 GD5 -> 123 }T
-T{ 6 GD5 -> 234 }T
-
-T{ : GD6 ( PAT: T{0 0}T,T{0 0}TT{1 0}TT{1 1}T,T{0 0}TT{1 0}TT{1 1}TT{2 0}TT{2 1}TT{2 2}T )
- 0 SWAP 0 DO
- I 1+ 0 DO I J + 3 = IF I UNLOOP I UNLOOP EXIT THEN 1+ LOOP
- LOOP ; -> }T
-T{ 1 GD6 -> 1 }T
-T{ 2 GD6 -> 3 }T
-T{ 3 GD6 -> 4 1 2 }T
-
-\ ------------------------------------------------------------------------
-TESTING DEFINING WORDS: : ; CONSTANT VARIABLE CREATE DOES> >BODY
-
-T{ 123 CONSTANT X123 -> }T
-T{ X123 -> 123 }T
-T{ : EQU CONSTANT ; -> }T
-T{ X123 EQU Y123 -> }T
-T{ Y123 -> 123 }T
-
-T{ VARIABLE V1 -> }T
-T{ 123 V1 ! -> }T
-T{ V1 @ -> 123 }T
-
-T{ : NOP : POSTPONE ; ; -> }T
-T{ NOP NOP1 NOP NOP2 -> }T
-T{ NOP1 -> }T
-T{ NOP2 -> }T
-
-T{ : DOES1 DOES> @ 1 + ; -> }T
-T{ : DOES2 DOES> @ 2 + ; -> }T
-T{ CREATE CR1 -> }T
-T{ CR1 -> HERE }T
-T{ ' CR1 >BODY -> HERE }T
-T{ 1 , -> }T
-T{ CR1 @ -> 1 }T
-T{ DOES1 -> }T
-T{ CR1 -> 2 }T
-T{ DOES2 -> }T
-T{ CR1 -> 3 }T
-
-T{ : WEIRD: CREATE DOES> 1 + DOES> 2 + ; -> }T
-T{ WEIRD: W1 -> }T
-T{ ' W1 >BODY -> HERE }T
-T{ W1 -> HERE 1 + }T
-T{ W1 -> HERE 2 + }T
-
-\ ------------------------------------------------------------------------
-TESTING EVALUATE
-
-: GE1 S" 123" ; IMMEDIATE
-: GE2 S" 123 1+" ; IMMEDIATE
-: GE3 S" : GE4 345 ;" ;
-: GE5 EVALUATE ; IMMEDIATE
-
-T{ GE1 EVALUATE -> 123 }T ( TEST EVALUATE IN INTERP. STATE )
-T{ GE2 EVALUATE -> 124 }T
-T{ GE3 EVALUATE -> }T
-T{ GE4 -> 345 }T
-
-T{ : GE6 GE1 GE5 ; -> }T ( TEST EVALUATE IN COMPILE STATE )
-T{ GE6 -> 123 }T
-T{ : GE7 GE2 GE5 ; -> }T
-T{ GE7 -> 124 }T
-
-\ ------------------------------------------------------------------------
-TESTING SOURCE >IN WORD
-
-: GS1 S" SOURCE" 2DUP EVALUATE
- >R SWAP >R = R> R> = ;
-T{ GS1 -> <TRUE> <TRUE> }T
-
-VARIABLE SCANS
-: RESCAN? -1 SCANS +! SCANS @ IF 0 >IN ! THEN ;
-
-T{ 2 SCANS !
-345 RESCAN?
--> 345 345 }T
-
-: GS2 5 SCANS ! S" 123 RESCAN?" EVALUATE ;
-T{ GS2 -> 123 123 123 123 123 }T
-
-: GS3 WORD COUNT SWAP C@ ;
-T{ BL GS3 HELLO -> 5 CHAR H }T
-T{ CHAR " GS3 GOODBYE" -> 7 CHAR G }T
-T{ BL GS3
-DROP -> 0 }T \ BLANK LINE RETURN ZERO-LENGTH STRING
-
-: GS4 SOURCE >IN ! DROP ;
-T{ GS4 123 456
--> }T
-
-\ ------------------------------------------------------------------------
-TESTING <# # #S #> HOLD SIGN BASE >NUMBER HEX DECIMAL
-
-: S= \ ( ADDR1 C1 ADDR2 C2 -- T/F ) COMPARE TWO STRINGS.
- >R SWAP R@ = IF \ MAKE SURE STRINGS HAVE SAME LENGTH
- R> ?DUP IF \ IF NON-EMPTY STRINGS
- 0 DO
- OVER C@ OVER C@ - IF
- 2DROP <FALSE> UNLOOP EXIT THEN
- SWAP CHAR+ SWAP CHAR+
- LOOP
- THEN
- 2DROP <TRUE> \ IF WE GET HERE, STRINGS MATCH
- ELSE
- R> DROP 2DROP <FALSE> \ LENGTHS MISMATCH
- THEN ;
-
-: GP1 <# 41 HOLD 42 HOLD 0 0 #> S" BA" S= ;
-T{ GP1 -> <TRUE> }T
-
-: GP2 <# -1 SIGN 0 SIGN -1 SIGN 0 0 #> S" --" S= ;
-T{ GP2 -> <TRUE> }T
-
-: GP3 <# 1 0 # # #> S" 01" S= ;
-T{ GP3 -> <TRUE> }T
-
-: GP4 <# 1 0 #S #> S" 1" S= ;
-T{ GP4 -> <TRUE> }T
-
-24 CONSTANT MAX-BASE \ BASE 2 .. 36
-: COUNT-BITS
- 0 0 INVERT BEGIN DUP WHILE >R 1+ R> 2* REPEAT DROP ;
-COUNT-BITS 2* CONSTANT #BITS-UD \ NUMBER OF BITS IN UD
-
-: GP5
- BASE @ <TRUE>
- MAX-BASE 1+ 2 DO \ FOR EACH POSSIBLE BASE
- I BASE ! \ TBD: ASSUMES BASE WORKS
- I 0 <# #S #> S" 10" S= AND
- LOOP
- SWAP BASE ! ;
-T{ GP5 -> <TRUE> }T
-
-: GP6
- BASE @ >R 2 BASE !
- MAX-UINT MAX-UINT <# #S #> \ MAXIMUM UD TO BINARY
- R> BASE ! \ S: C-ADDR U
- DUP #BITS-UD = SWAP
- 0 DO \ S: C-ADDR FLAG
- OVER C@ [CHAR] 1 = AND \ ALL ONES
- >R CHAR+ R>
- LOOP SWAP DROP ;
-T{ GP6 -> <TRUE> }T
-
-: GP7
- BASE @ >R MAX-BASE BASE !
- <TRUE>
- A 0 DO
- I 0 <# #S #>
- 1 = SWAP C@ I 30 + = AND AND
- LOOP
- MAX-BASE A DO
- I 0 <# #S #>
- 1 = SWAP C@ 41 I A - + = AND AND
- LOOP
- R> BASE ! ;
-
-T{ GP7 -> <TRUE> }T
-
-\ >NUMBER TESTS
-CREATE GN-BUF 0 C,
-: GN-STRING GN-BUF 1 ;
-: GN-CONSUMED GN-BUF CHAR+ 0 ;
-: GN' [CHAR] ' WORD CHAR+ C@ GN-BUF C! GN-STRING ;
-
-T{ 0 0 GN' 0' >NUMBER -> 0 0 GN-CONSUMED }T
-T{ 0 0 GN' 1' >NUMBER -> 1 0 GN-CONSUMED }T
-T{ 1 0 GN' 1' >NUMBER -> BASE @ 1+ 0 GN-CONSUMED }T
-T{ 0 0 GN' -' >NUMBER -> 0 0 GN-STRING }T \ SHOULD FAIL TO CONVERT THESE
-T{ 0 0 GN' +' >NUMBER -> 0 0 GN-STRING }T
-T{ 0 0 GN' .' >NUMBER -> 0 0 GN-STRING }T
-
-: >NUMBER-BASED
- BASE @ >R BASE ! >NUMBER R> BASE ! ;
-
-T{ 0 0 GN' 2' 10 >NUMBER-BASED -> 2 0 GN-CONSUMED }T
-T{ 0 0 GN' 2' 2 >NUMBER-BASED -> 0 0 GN-STRING }T
-T{ 0 0 GN' F' 10 >NUMBER-BASED -> F 0 GN-CONSUMED }T
-T{ 0 0 GN' G' 10 >NUMBER-BASED -> 0 0 GN-STRING }T
-T{ 0 0 GN' G' MAX-BASE >NUMBER-BASED -> 10 0 GN-CONSUMED }T
-T{ 0 0 GN' Z' MAX-BASE >NUMBER-BASED -> 23 0 GN-CONSUMED }T
-
-: GN1 \ ( UD BASE -- UD' LEN ) UD SHOULD EQUAL UD' AND LEN SHOULD BE ZERO.
- BASE @ >R BASE !
- <# #S #>
- 0 0 2SWAP >NUMBER SWAP DROP \ RETURN LENGTH ONLY
- R> BASE ! ;
-T{ 0 0 2 GN1 -> 0 0 0 }T
-T{ MAX-UINT 0 2 GN1 -> MAX-UINT 0 0 }T
-T{ MAX-UINT DUP 2 GN1 -> MAX-UINT DUP 0 }T
-T{ 0 0 MAX-BASE GN1 -> 0 0 0 }T
-T{ MAX-UINT 0 MAX-BASE GN1 -> MAX-UINT 0 0 }T
-T{ MAX-UINT DUP MAX-BASE GN1 -> MAX-UINT DUP 0 }T
-
-: GN2 \ ( -- 16 10 )
- BASE @ >R HEX BASE @ DECIMAL BASE @ R> BASE ! ;
-T{ GN2 -> 10 A }T
-
-\ ------------------------------------------------------------------------
-TESTING FILL MOVE
-
-CREATE FBUF 00 C, 00 C, 00 C,
-CREATE SBUF 12 C, 34 C, 56 C,
-: SEEBUF FBUF C@ FBUF CHAR+ C@ FBUF CHAR+ CHAR+ C@ ;
-
-T{ FBUF 0 20 FILL -> }T
-T{ SEEBUF -> 00 00 00 }T
-
-T{ FBUF 1 20 FILL -> }T
-T{ SEEBUF -> 20 00 00 }T
-
-T{ FBUF 3 20 FILL -> }T
-T{ SEEBUF -> 20 20 20 }T
-
-T{ FBUF FBUF 3 CHARS MOVE -> }T \ BIZARRE SPECIAL CASE
-T{ SEEBUF -> 20 20 20 }T
-
-T{ SBUF FBUF 0 CHARS MOVE -> }T
-T{ SEEBUF -> 20 20 20 }T
-
-T{ SBUF FBUF 1 CHARS MOVE -> }T
-T{ SEEBUF -> 12 20 20 }T
-
-T{ SBUF FBUF 3 CHARS MOVE -> }T
-T{ SEEBUF -> 12 34 56 }T
-
-T{ FBUF FBUF CHAR+ 2 CHARS MOVE -> }T
-T{ SEEBUF -> 12 12 34 }T
-
-T{ FBUF CHAR+ FBUF 2 CHARS MOVE -> }T
-T{ SEEBUF -> 12 34 34 }T
-
-\ ------------------------------------------------------------------------
-TESTING OUTPUT: . ." CR EMIT SPACE SPACES TYPE U.
-
-: OUTPUT-TEST
- ." YOU SHOULD SEE THE STANDARD GRAPHIC CHARACTERS:" CR
- 41 BL DO I EMIT LOOP CR
- 61 41 DO I EMIT LOOP CR
- 7F 61 DO I EMIT LOOP CR
- ." YOU SHOULD SEE 0-9 SEPARATED BY A SPACE:" CR
- 9 1+ 0 DO I . LOOP CR
- ." YOU SHOULD SEE 0-9 (WITH NO SPACES):" CR
- [CHAR] 9 1+ [CHAR] 0 DO I 0 SPACES EMIT LOOP CR
- ." YOU SHOULD SEE A-G SEPARATED BY A SPACE:" CR
- [CHAR] G 1+ [CHAR] A DO I EMIT SPACE LOOP CR
- ." YOU SHOULD SEE 0-5 SEPARATED BY TWO SPACES:" CR
- 5 1+ 0 DO I [CHAR] 0 + EMIT 2 SPACES LOOP CR
- ." YOU SHOULD SEE TWO SEPARATE LINES:" CR
- S" LINE 1" TYPE CR S" LINE 2" TYPE CR
- ." YOU SHOULD SEE THE NUMBER RANGES OF SIGNED AND UNSIGNED NUMBERS:" CR
- ." SIGNED: " MIN-INT . MAX-INT . CR
- ." UNSIGNED: " 0 U. MAX-UINT U. CR
-;
-
-T{ OUTPUT-TEST -> }T
-\ ------------------------------------------------------------------------
-TESTING INPUT: ACCEPT
-
-CREATE ABUF 80 CHARS ALLOT
-
-: ACCEPT-TEST
- CR ." PLEASE TYPE UP TO 80 CHARACTERS:" CR
- ABUF 80 ACCEPT
- CR ." RECEIVED: " [CHAR] " EMIT
- ABUF SWAP TYPE [CHAR] " EMIT CR
-;
-
-T{ ACCEPT-TEST -> }T
-Vingt fois sur le métier remettez votre ouvrage, ...
-\ ------------------------------------------------------------------------
-TESTING DICTIONARY SEARCH RULES
-
-T{ : GDX 123 ; : GDX GDX 234 ; -> }T
-
-T{ GDX -> 123 234 }T
-
-CR .( End of Core word set tests) CR
-
-
-
-RST_STATE ; so ANS_COMPLEMENT_xx_MPY is conserved ;
-\ NOECHO ; if an error occurs, comment this line before new download to find it.
-
-
-\ From: John Hayes S1I
-\ Subject: tester.fr
-\ Date: Mon, 27 Nov 95 13:10:09 PST
-
-\ (C) 1995 JOHNS HOPKINS UNIVERSITY / APPLIED PHYSICS LABORATORY
-\ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS.
-\ VERSION 1.1
-
-\ 22/1/09 The words { and } have been changed to T{ and }T respectively to
-\ agree with the Forth 200X file ttester.fs. This avoids clashes with
-\ locals using { ... } and the FSL use of }
-
-
-\ 13/05/14 jmt. added colorised error messages.
-
-
-
- 0 CONSTANT FALSE
--1 CONSTANT TRUE
-
-\ SET THE FOLLOWING FLAG TO TRUE FOR MORE VERBOSE OUTPUT; THIS MAY
-\ ALLOW YOU TO TELL WHICH TEST CAUSED YOUR SYSTEM TO HANG.
-VARIABLE VERBOSE
- FALSE VERBOSE !
-\ TRUE VERBOSE !
-
-\ : EMPTY-STACK ( ... -- ) \ EMPTY STACK: HANDLES UNDERFLOWED STACK TOO.
-\ DEPTH ?DUP
-\ IF DUP 0< IF NEGATE 0
-\ DO 0 LOOP
-\ ELSE 0 DO DROP LOOP THEN
-\ THEN ;
-\
-\ : ERROR \ ( C-ADDR U -- ) DISPLAY AN ERROR MESSAGE FOLLOWED BY
-\ \ THE LINE THAT HAD THE ERROR.
-\ TYPE SOURCE TYPE CR \ DISPLAY LINE CORRESPONDING TO ERROR
-\ EMPTY-STACK \ THROW AWAY EVERY THING ELSE
-\ QUIT \ *** Uncomment this line to QUIT on an error
-\ ;
-
-VARIABLE ACTUAL-DEPTH \ STACK RECORD
-CREATE ACTUAL-RESULTS 20 CELLS ALLOT
-
-: T{ \ ( -- ) SYNTACTIC SUGAR.
- ;
-
-: -> \ ( ... -- ) RECORD DEPTH AND CONTENT OF STACK.
- DEPTH DUP ACTUAL-DEPTH ! \ RECORD DEPTH
- ?DUP IF \ IF THERE IS SOMETHING ON STACK
- 0 DO ACTUAL-RESULTS I CELLS + ! LOOP \ SAVE THEM
- THEN ;
-
-: }T \ ( ... -- ) COMPARE STACK (EXPECTED) CONTENTS WITH SAVED
- \ (ACTUAL) CONTENTS.
- DEPTH ACTUAL-DEPTH @ = IF \ IF DEPTHS MATCH
- DEPTH ?DUP IF \ IF THERE IS SOMETHING ON THE STACK
- 0 DO \ FOR EACH STACK ITEM
- ACTUAL-RESULTS I CELLS + @ \ COMPARE ACTUAL WITH EXPECTED
-\ = 0= IF S" INCORRECT RESULT: " ERROR LEAVE THEN \ jmt
- = 0= IF ABORT" INCORRECT RESULT: " THEN \ jmt : colorised message
- LOOP
- THEN
- ELSE \ DEPTH MISMATCH
-\ S" WRONG NUMBER OF RESULTS: " ERROR \ jmt
- ABORT" WRONG NUMBER OF RESULTS: " \ jmt : colorised message
- THEN ;
-
-: TESTING \ ( -- ) TALKING COMMENT.
- SOURCE VERBOSE @
- IF DUP >R TYPE CR R> >IN !
- ELSE >IN ! DROP [CHAR] * EMIT
- THEN ;
-
-\ From: John Hayes S1I
-\ Subject: core.fr
-\ Date: Mon, 27 Nov 95 13:10
-
-\ (C) 1995 JOHNS HOPKINS UNIVERSITY / APPLIED PHYSICS LABORATORY
-\ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS.
-\ VERSION 1.2
-\ THIS PROGRAM TESTS THE CORE WORDS OF AN ANS FORTH SYSTEM.
-\ THE PROGRAM ASSUMES A TWO'S COMPLEMENT IMPLEMENTATION WHERE
-\ THE RANGE OF SIGNED NUMBERS IS -2^(N-1) ... 2^(N-1)-1 AND
-\ THE RANGE OF UNSIGNED NUMBERS IS 0 ... 2^(N)-1.
-\ I HAVEN'T FIGURED OUT HOW TO TEST KEY, QUIT, ABORT, OR ABORT"...
-\ I ALSO HAVEN'T THOUGHT OF A WAY TO TEST ENVIRONMENT?...
-
-CR
-TESTING CORE WORDS
-HEX
-
-\ ------------------------------------------------------------------------
-TESTING BASIC ASSUMPTIONS
-
-T{ -> }T \ START WITH CLEAN SLATE
-( TEST IF ANY BITS ARE SET; ANSWER IN BASE 1 )
-T{ : BITSSET? IF 0 0 ELSE 0 THEN ; -> }T
-T{ 0 BITSSET? -> 0 }T ( ZERO IS ALL BITS CLEAR )
-T{ 1 BITSSET? -> 0 0 }T ( OTHER NUMBER HAVE AT LEAST ONE BIT )
-T{ -1 BITSSET? -> 0 0 }T
-
-\ ------------------------------------------------------------------------
-TESTING BOOLEANS: INVERT AND OR XOR
-
-T{ 0 0 AND -> 0 }T
-T{ 0 1 AND -> 0 }T
-T{ 1 0 AND -> 0 }T
-T{ 1 1 AND -> 1 }T
-
-T{ 0 INVERT 1 AND -> 1 }T
-T{ 1 INVERT 1 AND -> 0 }T
-
-0 CONSTANT 0S
-0 INVERT CONSTANT 1S
-
-T{ 0S INVERT -> 1S }T
-T{ 1S INVERT -> 0S }T
-
-T{ 0S 0S AND -> 0S }T
-T{ 0S 1S AND -> 0S }T
-T{ 1S 0S AND -> 0S }T
-T{ 1S 1S AND -> 1S }T
-
-T{ 0S 0S OR -> 0S }T
-T{ 0S 1S OR -> 1S }T
-T{ 1S 0S OR -> 1S }T
-T{ 1S 1S OR -> 1S }T
-
-T{ 0S 0S XOR -> 0S }T
-T{ 0S 1S XOR -> 1S }T
-T{ 1S 0S XOR -> 1S }T
-T{ 1S 1S XOR -> 0S }T
-
-\ ------------------------------------------------------------------------
-TESTING 2* 2/ LSHIFT RSHIFT
-
-( WE TRUST 1S, INVERT, AND BITSSET?; WE WILL CONFIRM RSHIFT LATER )
-1S 1 RSHIFT INVERT CONSTANT MSB
-T{ MSB BITSSET? -> 0 0 }T
-
-T{ 0S 2* -> 0S }T
-T{ 1 2* -> 2 }T
-T{ 4000 2* -> 8000 }T
-T{ 1S 2* 1 XOR -> 1S }T
-T{ MSB 2* -> 0S }T
-
-T{ 0S 2/ -> 0S }T
-T{ 1 2/ -> 0 }T
-T{ 4000 2/ -> 2000 }T
-T{ 1S 2/ -> 1S }T \ MSB PROPOGATED
-T{ 1S 1 XOR 2/ -> 1S }T
-T{ MSB 2/ MSB AND -> MSB }T
-
-T{ 1 0 LSHIFT -> 1 }T
-T{ 1 1 LSHIFT -> 2 }T
-T{ 1 2 LSHIFT -> 4 }T
-T{ 1 F LSHIFT -> 8000 }T \ BIGGEST GUARANTEED SHIFT
-T{ 1S 1 LSHIFT 1 XOR -> 1S }T
-T{ MSB 1 LSHIFT -> 0 }T
-
-T{ 1 0 RSHIFT -> 1 }T
-T{ 1 1 RSHIFT -> 0 }T
-T{ 2 1 RSHIFT -> 1 }T
-T{ 4 2 RSHIFT -> 1 }T
-T{ 8000 F RSHIFT -> 1 }T \ BIGGEST
-T{ MSB 1 RSHIFT MSB AND -> 0 }T \ RSHIFT ZERO FILLS MSBS
-T{ MSB 1 RSHIFT 2* -> MSB }T
-
-\ ------------------------------------------------------------------------
-TESTING COMPARISONS: 0= = 0< < > U< MIN MAX
-0 INVERT CONSTANT MAX-UINT
-0 INVERT 1 RSHIFT CONSTANT MAX-INT
-0 INVERT 1 RSHIFT INVERT CONSTANT MIN-INT
-0 INVERT 1 RSHIFT CONSTANT MID-UINT
-0 INVERT 1 RSHIFT INVERT CONSTANT MID-UINT+1
-
-0S CONSTANT <FALSE>
-1S CONSTANT <TRUE>
-
-T{ 0 0= -> <TRUE> }T
-T{ 1 0= -> <FALSE> }T
-T{ 2 0= -> <FALSE> }T
-T{ -1 0= -> <FALSE> }T
-T{ MAX-UINT 0= -> <FALSE> }T
-T{ MIN-INT 0= -> <FALSE> }T
-T{ MAX-INT 0= -> <FALSE> }T
-
-T{ 0 0 = -> <TRUE> }T
-T{ 1 1 = -> <TRUE> }T
-T{ -1 -1 = -> <TRUE> }T
-T{ 1 0 = -> <FALSE> }T
-T{ -1 0 = -> <FALSE> }T
-T{ 0 1 = -> <FALSE> }T
-T{ 0 -1 = -> <FALSE> }T
-
-T{ 0 0< -> <FALSE> }T
-T{ -1 0< -> <TRUE> }T
-T{ MIN-INT 0< -> <TRUE> }T
-T{ 1 0< -> <FALSE> }T
-T{ MAX-INT 0< -> <FALSE> }T
-
-T{ 0 1 < -> <TRUE> }T
-T{ 1 2 < -> <TRUE> }T
-T{ -1 0 < -> <TRUE> }T
-T{ -1 1 < -> <TRUE> }T
-T{ MIN-INT 0 < -> <TRUE> }T
-T{ MIN-INT MAX-INT < -> <TRUE> }T
-T{ 0 MAX-INT < -> <TRUE> }T
-T{ 0 0 < -> <FALSE> }T
-T{ 1 1 < -> <FALSE> }T
-T{ 1 0 < -> <FALSE> }T
-T{ 2 1 < -> <FALSE> }T
-T{ 0 -1 < -> <FALSE> }T
-T{ 1 -1 < -> <FALSE> }T
-T{ 0 MIN-INT < -> <FALSE> }T
-T{ MAX-INT MIN-INT < -> <FALSE> }T
-T{ MAX-INT 0 < -> <FALSE> }T
-
-T{ 0 1 > -> <FALSE> }T
-T{ 1 2 > -> <FALSE> }T
-T{ -1 0 > -> <FALSE> }T
-T{ -1 1 > -> <FALSE> }T
-T{ MIN-INT 0 > -> <FALSE> }T
-T{ MIN-INT MAX-INT > -> <FALSE> }T
-T{ 0 MAX-INT > -> <FALSE> }T
-T{ 0 0 > -> <FALSE> }T
-T{ 1 1 > -> <FALSE> }T
-T{ 1 0 > -> <TRUE> }T
-T{ 2 1 > -> <TRUE> }T
-T{ 0 -1 > -> <TRUE> }T
-T{ 1 -1 > -> <TRUE> }T
-T{ 0 MIN-INT > -> <TRUE> }T
-T{ MAX-INT MIN-INT > -> <TRUE> }T
-T{ MAX-INT 0 > -> <TRUE> }T
-
-T{ 0 1 U< -> <TRUE> }T
-T{ 1 2 U< -> <TRUE> }T
-T{ 0 MID-UINT U< -> <TRUE> }T
-T{ 0 MAX-UINT U< -> <TRUE> }T
-T{ MID-UINT MAX-UINT U< -> <TRUE> }T
-T{ 0 0 U< -> <FALSE> }T
-T{ 1 1 U< -> <FALSE> }T
-T{ 1 0 U< -> <FALSE> }T
-T{ 2 1 U< -> <FALSE> }T
-T{ MID-UINT 0 U< -> <FALSE> }T
-T{ MAX-UINT 0 U< -> <FALSE> }T
-T{ MAX-UINT MID-UINT U< -> <FALSE> }T
-
-T{ 0 1 MIN -> 0 }T
-T{ 1 2 MIN -> 1 }T
-T{ -1 0 MIN -> -1 }T
-T{ -1 1 MIN -> -1 }T
-T{ MIN-INT 0 MIN -> MIN-INT }T
-T{ MIN-INT MAX-INT MIN -> MIN-INT }T
-T{ 0 MAX-INT MIN -> 0 }T
-T{ 0 0 MIN -> 0 }T
-T{ 1 1 MIN -> 1 }T
-T{ 1 0 MIN -> 0 }T
-T{ 2 1 MIN -> 1 }T
-T{ 0 -1 MIN -> -1 }T
-T{ 1 -1 MIN -> -1 }T
-T{ 0 MIN-INT MIN -> MIN-INT }T
-T{ MAX-INT MIN-INT MIN -> MIN-INT }T
-T{ MAX-INT 0 MIN -> 0 }T
-
-T{ 0 1 MAX -> 1 }T
-T{ 1 2 MAX -> 2 }T
-T{ -1 0 MAX -> 0 }T
-T{ -1 1 MAX -> 1 }T
-T{ MIN-INT 0 MAX -> 0 }T
-T{ MIN-INT MAX-INT MAX -> MAX-INT }T
-T{ 0 MAX-INT MAX -> MAX-INT }T
-T{ 0 0 MAX -> 0 }T
-T{ 1 1 MAX -> 1 }T
-T{ 1 0 MAX -> 1 }T
-T{ 2 1 MAX -> 2 }T
-T{ 0 -1 MAX -> 0 }T
-T{ 1 -1 MAX -> 1 }T
-T{ 0 MIN-INT MAX -> 0 }T
-T{ MAX-INT MIN-INT MAX -> MAX-INT }T
-T{ MAX-INT 0 MAX -> MAX-INT }T
-
-\ ------------------------------------------------------------------------
-TESTING STACK OPS: 2DROP 2DUP 2OVER 2SWAP ?DUP DEPTH DROP DUP OVER ROT SWAP
-
-T{ 1 2 2DROP -> }T
-T{ 1 2 2DUP -> 1 2 1 2 }T
-T{ 1 2 3 4 2OVER -> 1 2 3 4 1 2 }T
-T{ 1 2 3 4 2SWAP -> 3 4 1 2 }T
-T{ 0 ?DUP -> 0 }T
-T{ 1 ?DUP -> 1 1 }T
-T{ -1 ?DUP -> -1 -1 }T
-T{ DEPTH -> 0 }T
-T{ 0 DEPTH -> 0 1 }T
-T{ 0 1 DEPTH -> 0 1 2 }T
-T{ 0 DROP -> }T
-T{ 1 2 DROP -> 1 }T
-T{ 1 DUP -> 1 1 }T
-T{ 1 2 OVER -> 1 2 1 }T
-T{ 1 2 3 ROT -> 2 3 1 }T
-T{ 1 2 SWAP -> 2 1 }T
-
-\ ------------------------------------------------------------------------
-TESTING >R R> R@
-
-T{ : GR1 >R R> ; -> }T
-T{ : GR2 >R R@ R> DROP ; -> }T
-T{ 123 GR1 -> 123 }T
-T{ 123 GR2 -> 123 }T
-T{ 1S GR1 -> 1S }T ( RETURN STACK HOLDS CELLS )
-
-\ ------------------------------------------------------------------------
-TESTING ADD/SUBTRACT: + - 1+ 1- ABS NEGATE
-
-T{ 0 5 + -> 5 }T
-T{ 5 0 + -> 5 }T
-T{ 0 -5 + -> -5 }T
-T{ -5 0 + -> -5 }T
-T{ 1 2 + -> 3 }T
-T{ 1 -2 + -> -1 }T
-T{ -1 2 + -> 1 }T
-T{ -1 -2 + -> -3 }T
-T{ -1 1 + -> 0 }T
-T{ MID-UINT 1 + -> MID-UINT+1 }T
-
-T{ 0 5 - -> -5 }T
-T{ 5 0 - -> 5 }T
-T{ 0 -5 - -> 5 }T
-T{ -5 0 - -> -5 }T
-T{ 1 2 - -> -1 }T
-T{ 1 -2 - -> 3 }T
-T{ -1 2 - -> -3 }T
-T{ -1 -2 - -> 1 }T
-T{ 0 1 - -> -1 }T
-T{ MID-UINT+1 1 - -> MID-UINT }T
-
-T{ 0 1+ -> 1 }T
-T{ -1 1+ -> 0 }T
-T{ 1 1+ -> 2 }T
-T{ MID-UINT 1+ -> MID-UINT+1 }T
-
-T{ 2 1- -> 1 }T
-T{ 1 1- -> 0 }T
-T{ 0 1- -> -1 }T
-T{ MID-UINT+1 1- -> MID-UINT }T
-
-T{ 0 NEGATE -> 0 }T
-T{ 1 NEGATE -> -1 }T
-T{ -1 NEGATE -> 1 }T
-T{ 2 NEGATE -> -2 }T
-T{ -2 NEGATE -> 2 }T
-
-T{ 0 ABS -> 0 }T
-T{ 1 ABS -> 1 }T
-T{ -1 ABS -> 1 }T
-T{ MIN-INT ABS -> MID-UINT+1 }T
-
-\ ------------------------------------------------------------------------
-TESTING MULTIPLY: S>D * M* UM*
-
-T{ 0 S>D -> 0 0 }T
-T{ 1 S>D -> 1 0 }T
-T{ 2 S>D -> 2 0 }T
-T{ -1 S>D -> -1 -1 }T
-T{ -2 S>D -> -2 -1 }T
-T{ MIN-INT S>D -> MIN-INT -1 }T
-T{ MAX-INT S>D -> MAX-INT 0 }T
-
-T{ 0 0 M* -> 0 S>D }T
-T{ 0 1 M* -> 0 S>D }T
-T{ 1 0 M* -> 0 S>D }T
-T{ 1 2 M* -> 2 S>D }T
-T{ 2 1 M* -> 2 S>D }T
-T{ 3 3 M* -> 9 S>D }T
-T{ -3 3 M* -> -9 S>D }T
-T{ 3 -3 M* -> -9 S>D }T
-T{ -3 -3 M* -> 9 S>D }T
-T{ 0 MIN-INT M* -> 0 S>D }T
-T{ 1 MIN-INT M* -> MIN-INT S>D }T
-T{ 2 MIN-INT M* -> 0 1S }T
-T{ 0 MAX-INT M* -> 0 S>D }T
-T{ 1 MAX-INT M* -> MAX-INT S>D }T
-T{ 2 MAX-INT M* -> MAX-INT 1 LSHIFT 0 }T
-T{ MIN-INT MIN-INT M* -> 0 MSB 1 RSHIFT }T
-T{ MAX-INT MIN-INT M* -> MSB MSB 2/ }T
-T{ MAX-INT MAX-INT M* -> 1 MSB 2/ INVERT }T
-
-T{ 0 0 * -> 0 }T \ TEST IDENTITIES
-T{ 0 1 * -> 0 }T
-T{ 1 0 * -> 0 }T
-T{ 1 2 * -> 2 }T
-T{ 2 1 * -> 2 }T
-T{ 3 3 * -> 9 }T
-T{ -3 3 * -> -9 }T
-T{ 3 -3 * -> -9 }T
-T{ -3 -3 * -> 9 }T
-
-T{ MID-UINT+1 1 RSHIFT 2 * -> MID-UINT+1 }T
-T{ MID-UINT+1 2 RSHIFT 4 * -> MID-UINT+1 }T
-T{ MID-UINT+1 1 RSHIFT MID-UINT+1 OR 2 * -> MID-UINT+1 }T
-
-T{ 0 0 UM* -> 0 0 }T
-T{ 0 1 UM* -> 0 0 }T
-T{ 1 0 UM* -> 0 0 }T
-T{ 1 2 UM* -> 2 0 }T
-T{ 2 1 UM* -> 2 0 }T
-T{ 3 3 UM* -> 9 0 }T
-
-T{ MID-UINT+1 1 RSHIFT 2 UM* -> MID-UINT+1 0 }T
-T{ MID-UINT+1 2 UM* -> 0 1 }T
-T{ MID-UINT+1 4 UM* -> 0 2 }T
-T{ 1S 2 UM* -> 1S 1 LSHIFT 1 }T
-T{ MAX-UINT MAX-UINT UM* -> 1 1 INVERT }T
-
-\ ------------------------------------------------------------------------
-TESTING DIVIDE: FM/MOD SM/REM UM/MOD */ */MOD / /MOD MOD
-
-T{ 0 S>D 1 FM/MOD -> 0 0 }T
-T{ 1 S>D 1 FM/MOD -> 0 1 }T
-T{ 2 S>D 1 FM/MOD -> 0 2 }T
-T{ -1 S>D 1 FM/MOD -> 0 -1 }T
-T{ -2 S>D 1 FM/MOD -> 0 -2 }T
-T{ 0 S>D -1 FM/MOD -> 0 0 }T
-T{ 1 S>D -1 FM/MOD -> 0 -1 }T
-T{ 2 S>D -1 FM/MOD -> 0 -2 }T
-T{ -1 S>D -1 FM/MOD -> 0 1 }T
-T{ -2 S>D -1 FM/MOD -> 0 2 }T
-T{ 2 S>D 2 FM/MOD -> 0 1 }T
-T{ -1 S>D -1 FM/MOD -> 0 1 }T
-T{ -2 S>D -2 FM/MOD -> 0 1 }T
-T{ 7 S>D 3 FM/MOD -> 1 2 }T
-T{ 7 S>D -3 FM/MOD -> -2 -3 }T
-T{ -7 S>D 3 FM/MOD -> 2 -3 }T
-T{ -7 S>D -3 FM/MOD -> -1 2 }T
-T{ MAX-INT S>D 1 FM/MOD -> 0 MAX-INT }T
-T{ MIN-INT S>D 1 FM/MOD -> 0 MIN-INT }T
-T{ MAX-INT S>D MAX-INT FM/MOD -> 0 1 }T
-T{ MIN-INT S>D MIN-INT FM/MOD -> 0 1 }T
-T{ 1S 1 4 FM/MOD -> 3 MAX-INT }T
-T{ 1 MIN-INT M* 1 FM/MOD -> 0 MIN-INT }T
-T{ 1 MIN-INT M* MIN-INT FM/MOD -> 0 1 }T
-T{ 2 MIN-INT M* 2 FM/MOD -> 0 MIN-INT }T
-T{ 2 MIN-INT M* MIN-INT FM/MOD -> 0 2 }T
-T{ 1 MAX-INT M* 1 FM/MOD -> 0 MAX-INT }T
-T{ 1 MAX-INT M* MAX-INT FM/MOD -> 0 1 }T
-T{ 2 MAX-INT M* 2 FM/MOD -> 0 MAX-INT }T
-T{ 2 MAX-INT M* MAX-INT FM/MOD -> 0 2 }T
-T{ MIN-INT MIN-INT M* MIN-INT FM/MOD -> 0 MIN-INT }T
-T{ MIN-INT MAX-INT M* MIN-INT FM/MOD -> 0 MAX-INT }T
-T{ MIN-INT MAX-INT M* MAX-INT FM/MOD -> 0 MIN-INT }T
-T{ MAX-INT MAX-INT M* MAX-INT FM/MOD -> 0 MAX-INT }T
-
-T{ 0 S>D 1 SM/REM -> 0 0 }T
-T{ 1 S>D 1 SM/REM -> 0 1 }T
-T{ 2 S>D 1 SM/REM -> 0 2 }T
-T{ -1 S>D 1 SM/REM -> 0 -1 }T
-T{ -2 S>D 1 SM/REM -> 0 -2 }T
-T{ 0 S>D -1 SM/REM -> 0 0 }T
-T{ 1 S>D -1 SM/REM -> 0 -1 }T
-T{ 2 S>D -1 SM/REM -> 0 -2 }T
-T{ -1 S>D -1 SM/REM -> 0 1 }T
-T{ -2 S>D -1 SM/REM -> 0 2 }T
-T{ 2 S>D 2 SM/REM -> 0 1 }T
-T{ -1 S>D -1 SM/REM -> 0 1 }T
-T{ -2 S>D -2 SM/REM -> 0 1 }T
-T{ 7 S>D 3 SM/REM -> 1 2 }T
-T{ 7 S>D -3 SM/REM -> 1 -2 }T
-T{ -7 S>D 3 SM/REM -> -1 -2 }T
-T{ -7 S>D -3 SM/REM -> -1 2 }T
-T{ MAX-INT S>D 1 SM/REM -> 0 MAX-INT }T
-T{ MIN-INT S>D 1 SM/REM -> 0 MIN-INT }T
-T{ MAX-INT S>D MAX-INT SM/REM -> 0 1 }T
-T{ MIN-INT S>D MIN-INT SM/REM -> 0 1 }T
-T{ 1S 1 4 SM/REM -> 3 MAX-INT }T
-T{ 2 MIN-INT M* 2 SM/REM -> 0 MIN-INT }T
-T{ 2 MIN-INT M* MIN-INT SM/REM -> 0 2 }T
-T{ 2 MAX-INT M* 2 SM/REM -> 0 MAX-INT }T
-T{ 2 MAX-INT M* MAX-INT SM/REM -> 0 2 }T
-T{ MIN-INT MIN-INT M* MIN-INT SM/REM -> 0 MIN-INT }T
-T{ MIN-INT MAX-INT M* MIN-INT SM/REM -> 0 MAX-INT }T
-T{ MIN-INT MAX-INT M* MAX-INT SM/REM -> 0 MIN-INT }T
-T{ MAX-INT MAX-INT M* MAX-INT SM/REM -> 0 MAX-INT }T
-
-T{ 0 0 1 UM/MOD -> 0 0 }T
-T{ 1 0 1 UM/MOD -> 0 1 }T
-T{ 1 0 2 UM/MOD -> 1 0 }T
-T{ 3 0 2 UM/MOD -> 1 1 }T
-T{ MAX-UINT 2 UM* 2 UM/MOD -> 0 MAX-UINT }T
-T{ MAX-UINT 2 UM* MAX-UINT UM/MOD -> 0 2 }T
-T{ MAX-UINT MAX-UINT UM* MAX-UINT UM/MOD -> 0 MAX-UINT }T
-
-: IFFLOORED
- [ -3 2 / -2 = INVERT ] LITERAL IF POSTPONE \ THEN ;
-
-: IFSYM
- [ -3 2 / -1 = INVERT ] LITERAL IF POSTPONE \ THEN ;
-
-\ THE SYSTEM MIGHT DO EITHER FLOORED OR SYMMETRIC DIVISION.
-\ SINCE WE HAVE ALREADY TESTED M*, FM/MOD, AND SM/REM WE CAN USE THEM IN TEST.
-
-IFFLOORED : T/MOD >R S>D R> FM/MOD ;
-IFFLOORED : T/ T/MOD SWAP DROP ;
-IFFLOORED : TMOD T/MOD DROP ;
-IFFLOORED : T*/MOD >R M* R> FM/MOD ;
-IFFLOORED : T*/ T*/MOD SWAP DROP ;
-IFSYM : T/MOD >R S>D R> SM/REM ;
-IFSYM : T/ T/MOD SWAP DROP ;
-IFSYM : TMOD T/MOD DROP ;
-IFSYM : T*/MOD >R M* R> SM/REM ;
-IFSYM : T*/ T*/MOD SWAP DROP ;
-
-T{ 0 1 /MOD -> 0 1 T/MOD }T
-T{ 1 1 /MOD -> 1 1 T/MOD }T
-T{ 2 1 /MOD -> 2 1 T/MOD }T
-T{ -1 1 /MOD -> -1 1 T/MOD }T
-T{ -2 1 /MOD -> -2 1 T/MOD }T
-T{ 0 -1 /MOD -> 0 -1 T/MOD }T
-T{ 1 -1 /MOD -> 1 -1 T/MOD }T
-T{ 2 -1 /MOD -> 2 -1 T/MOD }T
-T{ -1 -1 /MOD -> -1 -1 T/MOD }T
-T{ -2 -1 /MOD -> -2 -1 T/MOD }T
-T{ 2 2 /MOD -> 2 2 T/MOD }T
-T{ -1 -1 /MOD -> -1 -1 T/MOD }T
-T{ -2 -2 /MOD -> -2 -2 T/MOD }T
-T{ 7 3 /MOD -> 7 3 T/MOD }T
-T{ 7 -3 /MOD -> 7 -3 T/MOD }T
-T{ -7 3 /MOD -> -7 3 T/MOD }T
-T{ -7 -3 /MOD -> -7 -3 T/MOD }T
-T{ MAX-INT 1 /MOD -> MAX-INT 1 T/MOD }T
-T{ MIN-INT 1 /MOD -> MIN-INT 1 T/MOD }T
-T{ MAX-INT MAX-INT /MOD -> MAX-INT MAX-INT T/MOD }T
-T{ MIN-INT MIN-INT /MOD -> MIN-INT MIN-INT T/MOD }T
-
-T{ 0 1 / -> 0 1 T/ }T
-T{ 1 1 / -> 1 1 T/ }T
-T{ 2 1 / -> 2 1 T/ }T
-T{ -1 1 / -> -1 1 T/ }T
-T{ -2 1 / -> -2 1 T/ }T
-T{ 0 -1 / -> 0 -1 T/ }T
-T{ 1 -1 / -> 1 -1 T/ }T
-T{ 2 -1 / -> 2 -1 T/ }T
-T{ -1 -1 / -> -1 -1 T/ }T
-T{ -2 -1 / -> -2 -1 T/ }T
-T{ 2 2 / -> 2 2 T/ }T
-T{ -1 -1 / -> -1 -1 T/ }T
-T{ -2 -2 / -> -2 -2 T/ }T
-T{ 7 3 / -> 7 3 T/ }T
-T{ 7 -3 / -> 7 -3 T/ }T
-T{ -7 3 / -> -7 3 T/ }T
-T{ -7 -3 / -> -7 -3 T/ }T
-T{ MAX-INT 1 / -> MAX-INT 1 T/ }T
-T{ MIN-INT 1 / -> MIN-INT 1 T/ }T
-T{ MAX-INT MAX-INT / -> MAX-INT MAX-INT T/ }T
-T{ MIN-INT MIN-INT / -> MIN-INT MIN-INT T/ }T
-
-T{ 0 1 MOD -> 0 1 TMOD }T
-T{ 1 1 MOD -> 1 1 TMOD }T
-T{ 2 1 MOD -> 2 1 TMOD }T
-T{ -1 1 MOD -> -1 1 TMOD }T
-T{ -2 1 MOD -> -2 1 TMOD }T
-T{ 0 -1 MOD -> 0 -1 TMOD }T
-T{ 1 -1 MOD -> 1 -1 TMOD }T
-T{ 2 -1 MOD -> 2 -1 TMOD }T
-T{ -1 -1 MOD -> -1 -1 TMOD }T
-T{ -2 -1 MOD -> -2 -1 TMOD }T
-T{ 2 2 MOD -> 2 2 TMOD }T
-T{ -1 -1 MOD -> -1 -1 TMOD }T
-T{ -2 -2 MOD -> -2 -2 TMOD }T
-T{ 7 3 MOD -> 7 3 TMOD }T
-T{ 7 -3 MOD -> 7 -3 TMOD }T
-T{ -7 3 MOD -> -7 3 TMOD }T
-T{ -7 -3 MOD -> -7 -3 TMOD }T
-T{ MAX-INT 1 MOD -> MAX-INT 1 TMOD }T
-T{ MIN-INT 1 MOD -> MIN-INT 1 TMOD }T
-T{ MAX-INT MAX-INT MOD -> MAX-INT MAX-INT TMOD }T
-T{ MIN-INT MIN-INT MOD -> MIN-INT MIN-INT TMOD }T
-
-T{ 0 2 1 */ -> 0 2 1 T*/ }T
-T{ 1 2 1 */ -> 1 2 1 T*/ }T
-T{ 2 2 1 */ -> 2 2 1 T*/ }T
-T{ -1 2 1 */ -> -1 2 1 T*/ }T
-T{ -2 2 1 */ -> -2 2 1 T*/ }T
-T{ 0 2 -1 */ -> 0 2 -1 T*/ }T
-T{ 1 2 -1 */ -> 1 2 -1 T*/ }T
-T{ 2 2 -1 */ -> 2 2 -1 T*/ }T
-T{ -1 2 -1 */ -> -1 2 -1 T*/ }T
-T{ -2 2 -1 */ -> -2 2 -1 T*/ }T
-T{ 2 2 2 */ -> 2 2 2 T*/ }T
-T{ -1 2 -1 */ -> -1 2 -1 T*/ }T
-T{ -2 2 -2 */ -> -2 2 -2 T*/ }T
-T{ 7 2 3 */ -> 7 2 3 T*/ }T
-T{ 7 2 -3 */ -> 7 2 -3 T*/ }T
-T{ -7 2 3 */ -> -7 2 3 T*/ }T
-T{ -7 2 -3 */ -> -7 2 -3 T*/ }T
-T{ MAX-INT 2 MAX-INT */ -> MAX-INT 2 MAX-INT T*/ }T
-T{ MIN-INT 2 MIN-INT */ -> MIN-INT 2 MIN-INT T*/ }T
-
-T{ 0 2 1 */MOD -> 0 2 1 T*/MOD }T
-T{ 1 2 1 */MOD -> 1 2 1 T*/MOD }T
-T{ 2 2 1 */MOD -> 2 2 1 T*/MOD }T
-T{ -1 2 1 */MOD -> -1 2 1 T*/MOD }T
-T{ -2 2 1 */MOD -> -2 2 1 T*/MOD }T
-T{ 0 2 -1 */MOD -> 0 2 -1 T*/MOD }T
-T{ 1 2 -1 */MOD -> 1 2 -1 T*/MOD }T
-T{ 2 2 -1 */MOD -> 2 2 -1 T*/MOD }T
-T{ -1 2 -1 */MOD -> -1 2 -1 T*/MOD }T
-T{ -2 2 -1 */MOD -> -2 2 -1 T*/MOD }T
-T{ 2 2 2 */MOD -> 2 2 2 T*/MOD }T
-T{ -1 2 -1 */MOD -> -1 2 -1 T*/MOD }T
-T{ -2 2 -2 */MOD -> -2 2 -2 T*/MOD }T
-T{ 7 2 3 */MOD -> 7 2 3 T*/MOD }T
-T{ 7 2 -3 */MOD -> 7 2 -3 T*/MOD }T
-T{ -7 2 3 */MOD -> -7 2 3 T*/MOD }T
-T{ -7 2 -3 */MOD -> -7 2 -3 T*/MOD }T
-T{ MAX-INT 2 MAX-INT */MOD -> MAX-INT 2 MAX-INT T*/MOD }T
-T{ MIN-INT 2 MIN-INT */MOD -> MIN-INT 2 MIN-INT T*/MOD }T
-
-\ ------------------------------------------------------------------------
-TESTING HERE , @ ! CELL+ CELLS C, C@ C! CHARS 2@ 2! ALIGN ALIGNED +! ALLOT
-
-HERE 1 ALLOT
-HERE
-CONSTANT 2NDA
-CONSTANT 1STA
-T{ 1STA 2NDA U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT
-T{ 1STA 1+ -> 2NDA }T \ ... BY ONE ADDRESS UNIT
-( MISSING TEST: NEGATIVE ALLOT )
-
-HERE 1 ,
-HERE 2 ,
-CONSTANT 2ND
-CONSTANT 1ST
-T{ 1ST 2ND U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT
-T{ 1ST CELL+ -> 2ND }T \ ... BY ONE CELL
-T{ 1ST 1 CELLS + -> 2ND }T
-T{ 1ST @ 2ND @ -> 1 2 }T
-T{ 5 1ST ! -> }T
-T{ 1ST @ 2ND @ -> 5 2 }T
-T{ 6 2ND ! -> }T
-T{ 1ST @ 2ND @ -> 5 6 }T
-T{ 1ST 2@ -> 6 5 }T
-T{ 2 1 1ST 2! -> }T
-T{ 1ST 2@ -> 2 1 }T
-T{ 1S 1ST ! 1ST @ -> 1S }T \ CAN STORE CELL-WIDE VALUE
-
-HERE 1 C,
-HERE 2 C,
-CONSTANT 2NDC
-CONSTANT 1STC
-T{ 1STC 2NDC U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT
-T{ 1STC CHAR+ -> 2NDC }T \ ... BY ONE CHAR
-T{ 1STC 1 CHARS + -> 2NDC }T
-T{ 1STC C@ 2NDC C@ -> 1 2 }T
-T{ 3 1STC C! -> }T
-T{ 1STC C@ 2NDC C@ -> 3 2 }T
-T{ 4 2NDC C! -> }T
-T{ 1STC C@ 2NDC C@ -> 3 4 }T
-
-ALIGN 1 ALLOT HERE ALIGN HERE 3 CELLS ALLOT
-CONSTANT A-ADDR CONSTANT UA-ADDR
-T{ UA-ADDR ALIGNED -> A-ADDR }T
-T{ 1 A-ADDR C! A-ADDR C@ -> 1 }T
-T{ 1234 A-ADDR ! A-ADDR @ -> 1234 }T
-T{ 123 456 A-ADDR 2! A-ADDR 2@ -> 123 456 }T
-T{ 2 A-ADDR CHAR+ C! A-ADDR CHAR+ C@ -> 2 }T
-T{ 3 A-ADDR CELL+ C! A-ADDR CELL+ C@ -> 3 }T
-T{ 1234 A-ADDR CELL+ ! A-ADDR CELL+ @ -> 1234 }T
-T{ 123 456 A-ADDR CELL+ 2! A-ADDR CELL+ 2@ -> 123 456 }T
-
-: BITS ( X -- U )
- 0 SWAP BEGIN DUP WHILE DUP MSB AND IF >R 1+ R> THEN 2* REPEAT DROP ;
-( CHARACTERS >= 1 AU, <= SIZE OF CELL, >= 8 BITS )
-T{ 1 CHARS 1 < -> <FALSE> }T
-T{ 1 CHARS 1 CELLS > -> <FALSE> }T
-( TBD: HOW TO FIND NUMBER OF BITS? )
-
-( CELLS >= 1 AU, INTEGRAL MULTIPLE OF CHAR SIZE, >= 16 BITS )
-T{ 1 CELLS 1 < -> <FALSE> }T
-T{ 1 CELLS 1 CHARS MOD -> 0 }T
-T{ 1S BITS 10 < -> <FALSE> }T
-
-T{ 0 1ST ! -> }T
-T{ 1 1ST +! -> }T
-T{ 1ST @ -> 1 }T
-T{ -1 1ST +! 1ST @ -> 0 }T
-
-\ ------------------------------------------------------------------------
-TESTING CHAR [CHAR] [ ] BL S"
-
-T{ BL -> 20 }T
-T{ CHAR X -> 58 }T
-T{ CHAR HELLO -> 48 }T
-T{ : GC1 [CHAR] X ; -> }T
-T{ : GC2 [CHAR] HELLO ; -> }T
-T{ GC1 -> 58 }T
-T{ GC2 -> 48 }T
-T{ : GC3 [ GC1 ] LITERAL ; -> }T
-T{ GC3 -> 58 }T
-T{ : GC4 S" XY" ; -> }T
-T{ GC4 SWAP DROP -> 2 }T
-T{ GC4 DROP DUP C@ SWAP CHAR+ C@ -> 58 59 }T
-
-\ ------------------------------------------------------------------------
-TESTING ' ['] FIND EXECUTE IMMEDIATE COUNT LITERAL POSTPONE STATE
-
-T{ : GT1 123 ; -> }T
-T{ ' GT1 EXECUTE -> 123 }T
-T{ : GT2 ['] GT1 ; IMMEDIATE -> }T
-T{ GT2 EXECUTE -> 123 }T
-HERE 3 C, CHAR G C, CHAR T C, CHAR 1 C, CONSTANT GT1STRING
-HERE 3 C, CHAR G C, CHAR T C, CHAR 2 C, CONSTANT GT2STRING
-T{ GT1STRING FIND -> ' GT1 -1 }T
-T{ GT2STRING FIND -> ' GT2 1 }T
-( HOW TO SEARCH FOR NON-EXISTENT WORD? )
-T{ : GT3 GT2 LITERAL ; -> }T
-T{ GT3 -> ' GT1 }T
-T{ GT1STRING COUNT -> GT1STRING CHAR+ 3 }T
-
-T{ : GT4 POSTPONE GT1 ; IMMEDIATE -> }T
-T{ : GT5 GT4 ; -> }T
-T{ GT5 -> 123 }T
-T{ : GT6 345 ; IMMEDIATE -> }T
-T{ : GT7 POSTPONE GT6 ; -> }T
-T{ GT7 -> 345 }T
-
-T{ : GT8 STATE @ ; IMMEDIATE -> }T
-T{ GT8 -> 0 }T
-T{ : GT9 GT8 LITERAL ; -> }T
-T{ GT9 0= -> <FALSE> }T
-
-\ ------------------------------------------------------------------------
-TESTING IF ELSE THEN BEGIN WHILE REPEAT UNTIL RECURSE
-
-T{ : GI1 IF 123 THEN ; -> }T
-T{ : GI2 IF 123 ELSE 234 THEN ; -> }T
-T{ 0 GI1 -> }T
-T{ 1 GI1 -> 123 }T
-T{ -1 GI1 -> 123 }T
-T{ 0 GI2 -> 234 }T
-T{ 1 GI2 -> 123 }T
-T{ -1 GI1 -> 123 }T
-
-T{ : GI3 BEGIN DUP 5 < WHILE DUP 1+ REPEAT ; -> }T
-T{ 0 GI3 -> 0 1 2 3 4 5 }T
-T{ 4 GI3 -> 4 5 }T
-T{ 5 GI3 -> 5 }T
-T{ 6 GI3 -> 6 }T
-
-T{ : GI4 BEGIN DUP 1+ DUP 5 > UNTIL ; -> }T
-T{ 3 GI4 -> 3 4 5 6 }T
-T{ 5 GI4 -> 5 6 }T
-T{ 6 GI4 -> 6 7 }T
-
-T{ : GI5 BEGIN DUP 2 > WHILE DUP 5 < WHILE DUP 1+ REPEAT 123 ELSE 345 THEN ; -> }T
-T{ 1 GI5 -> 1 345 }T
-T{ 2 GI5 -> 2 345 }T
-T{ 3 GI5 -> 3 4 5 123 }T
-T{ 4 GI5 -> 4 5 123 }T
-T{ 5 GI5 -> 5 123 }T
-
-T{ : GI6 ( N -- 0,1,..N ) DUP IF DUP >R 1- RECURSE R> THEN ; -> }T
-T{ 0 GI6 -> 0 }T
-T{ 1 GI6 -> 0 1 }T
-T{ 2 GI6 -> 0 1 2 }T
-T{ 3 GI6 -> 0 1 2 3 }T
-T{ 4 GI6 -> 0 1 2 3 4 }T
-
-\ ------------------------------------------------------------------------
-TESTING DO LOOP +LOOP I J UNLOOP LEAVE EXIT
-
-T{ : GD1 DO I LOOP ; -> }T
-T{ 4 1 GD1 -> 1 2 3 }T
-T{ 2 -1 GD1 -> -1 0 1 }T
-T{ MID-UINT+1 MID-UINT GD1 -> MID-UINT }T
-
-T{ : GD2 DO I -1 +LOOP ; -> }T
-T{ 1 4 GD2 -> 4 3 2 1 }T
-T{ -1 2 GD2 -> 2 1 0 -1 }T
-T{ MID-UINT MID-UINT+1 GD2 -> MID-UINT+1 MID-UINT }T
-
-T{ : GD3 DO 1 0 DO J LOOP LOOP ; -> }T
-T{ 4 1 GD3 -> 1 2 3 }T
-T{ 2 -1 GD3 -> -1 0 1 }T
-T{ MID-UINT+1 MID-UINT GD3 -> MID-UINT }T
-
-T{ : GD4 DO 1 0 DO J LOOP -1 +LOOP ; -> }T
-T{ 1 4 GD4 -> 4 3 2 1 }T
-T{ -1 2 GD4 -> 2 1 0 -1 }T
-T{ MID-UINT MID-UINT+1 GD4 -> MID-UINT+1 MID-UINT }T
-
-T{ : GD5 123 SWAP 0 DO I 4 > IF DROP 234 LEAVE THEN LOOP ; -> }T
-T{ 1 GD5 -> 123 }T
-T{ 5 GD5 -> 123 }T
-T{ 6 GD5 -> 234 }T
-
-T{ : GD6 ( PAT: T{0 0}T,T{0 0}TT{1 0}TT{1 1}T,T{0 0}TT{1 0}TT{1 1}TT{2 0}TT{2 1}TT{2 2}T )
- 0 SWAP 0 DO
- I 1+ 0 DO I J + 3 = IF I UNLOOP I UNLOOP EXIT THEN 1+ LOOP
- LOOP ; -> }T
-T{ 1 GD6 -> 1 }T
-T{ 2 GD6 -> 3 }T
-T{ 3 GD6 -> 4 1 2 }T
-
-\ ------------------------------------------------------------------------
-TESTING DEFINING WORDS: : ; CONSTANT VARIABLE CREATE DOES> >BODY
-
-T{ 123 CONSTANT X123 -> }T
-T{ X123 -> 123 }T
-T{ : EQU CONSTANT ; -> }T
-T{ X123 EQU Y123 -> }T
-T{ Y123 -> 123 }T
-
-T{ VARIABLE V1 -> }T
-T{ 123 V1 ! -> }T
-T{ V1 @ -> 123 }T
-
-T{ : NOP : POSTPONE ; ; -> }T
-T{ NOP NOP1 NOP NOP2 -> }T
-T{ NOP1 -> }T
-T{ NOP2 -> }T
-
-T{ : DOES1 DOES> @ 1 + ; -> }T
-T{ : DOES2 DOES> @ 2 + ; -> }T
-T{ CREATE CR1 -> }T
-T{ CR1 -> HERE }T
-T{ ' CR1 >BODY -> HERE }T
-T{ 1 , -> }T
-T{ CR1 @ -> 1 }T
-T{ DOES1 -> }T
-T{ CR1 -> 2 }T
-T{ DOES2 -> }T
-T{ CR1 -> 3 }T
-
-T{ : WEIRD: CREATE DOES> 1 + DOES> 2 + ; -> }T
-T{ WEIRD: W1 -> }T
-T{ ' W1 >BODY -> HERE }T
-T{ W1 -> HERE 1 + }T
-T{ W1 -> HERE 2 + }T
-
-\ ------------------------------------------------------------------------
-TESTING EVALUATE
-
-: GE1 S" 123" ; IMMEDIATE
-: GE2 S" 123 1+" ; IMMEDIATE
-: GE3 S" : GE4 345 ;" ;
-: GE5 EVALUATE ; IMMEDIATE
-
-T{ GE1 EVALUATE -> 123 }T ( TEST EVALUATE IN INTERP. STATE )
-T{ GE2 EVALUATE -> 124 }T
-T{ GE3 EVALUATE -> }T
-T{ GE4 -> 345 }T
-
-T{ : GE6 GE1 GE5 ; -> }T ( TEST EVALUATE IN COMPILE STATE )
-T{ GE6 -> 123 }T
-T{ : GE7 GE2 GE5 ; -> }T
-T{ GE7 -> 124 }T
-
-\ ------------------------------------------------------------------------
-TESTING SOURCE >IN WORD
-
-: GS1 S" SOURCE" 2DUP EVALUATE
- >R SWAP >R = R> R> = ;
-T{ GS1 -> <TRUE> <TRUE> }T
-
-VARIABLE SCANS
-: RESCAN? -1 SCANS +! SCANS @ IF 0 >IN ! THEN ;
-
-T{ 2 SCANS !
-345 RESCAN?
--> 345 345 }T
-
-: GS2 5 SCANS ! S" 123 RESCAN?" EVALUATE ;
-T{ GS2 -> 123 123 123 123 123 }T
-
-: GS3 WORD COUNT SWAP C@ ;
-T{ BL GS3 HELLO -> 5 CHAR H }T
-T{ CHAR " GS3 GOODBYE" -> 7 CHAR G }T
-T{ BL GS3
-DROP -> 0 }T \ BLANK LINE RETURN ZERO-LENGTH STRING
-
-: GS4 SOURCE >IN ! DROP ;
-T{ GS4 123 456
--> }T
-
-\ ------------------------------------------------------------------------
-TESTING <# # #S #> HOLD SIGN BASE >NUMBER HEX DECIMAL
-
-: S= \ ( ADDR1 C1 ADDR2 C2 -- T/F ) COMPARE TWO STRINGS.
- >R SWAP R@ = IF \ MAKE SURE STRINGS HAVE SAME LENGTH
- R> ?DUP IF \ IF NON-EMPTY STRINGS
- 0 DO
- OVER C@ OVER C@ - IF
- 2DROP <FALSE> UNLOOP EXIT THEN
- SWAP CHAR+ SWAP CHAR+
- LOOP
- THEN
- 2DROP <TRUE> \ IF WE GET HERE, STRINGS MATCH
- ELSE
- R> DROP 2DROP <FALSE> \ LENGTHS MISMATCH
- THEN ;
-
-: GP1 <# 41 HOLD 42 HOLD 0 0 #> S" BA" S= ;
-T{ GP1 -> <TRUE> }T
-
-: GP2 <# -1 SIGN 0 SIGN -1 SIGN 0 0 #> S" --" S= ;
-T{ GP2 -> <TRUE> }T
-
-: GP3 <# 1 0 # # #> S" 01" S= ;
-T{ GP3 -> <TRUE> }T
-
-: GP4 <# 1 0 #S #> S" 1" S= ;
-T{ GP4 -> <TRUE> }T
-
-24 CONSTANT MAX-BASE \ BASE 2 .. 36
-: COUNT-BITS
- 0 0 INVERT BEGIN DUP WHILE >R 1+ R> 2* REPEAT DROP ;
-COUNT-BITS 2* CONSTANT #BITS-UD \ NUMBER OF BITS IN UD
-
-: GP5
- BASE @ <TRUE>
- MAX-BASE 1+ 2 DO \ FOR EACH POSSIBLE BASE
- I BASE ! \ TBD: ASSUMES BASE WORKS
- I 0 <# #S #> S" 10" S= AND
- LOOP
- SWAP BASE ! ;
-T{ GP5 -> <TRUE> }T
-
-: GP6
- BASE @ >R 2 BASE !
- MAX-UINT MAX-UINT <# #S #> \ MAXIMUM UD TO BINARY
- R> BASE ! \ S: C-ADDR U
- DUP #BITS-UD = SWAP
- 0 DO \ S: C-ADDR FLAG
- OVER C@ [CHAR] 1 = AND \ ALL ONES
- >R CHAR+ R>
- LOOP SWAP DROP ;
-T{ GP6 -> <TRUE> }T
-
-: GP7
- BASE @ >R MAX-BASE BASE !
- <TRUE>
- A 0 DO
- I 0 <# #S #>
- 1 = SWAP C@ I 30 + = AND AND
- LOOP
- MAX-BASE A DO
- I 0 <# #S #>
- 1 = SWAP C@ 41 I A - + = AND AND
- LOOP
- R> BASE ! ;
-
-T{ GP7 -> <TRUE> }T
-
-\ >NUMBER TESTS
-CREATE GN-BUF 0 C,
-: GN-STRING GN-BUF 1 ;
-: GN-CONSUMED GN-BUF CHAR+ 0 ;
-: GN' [CHAR] ' WORD CHAR+ C@ GN-BUF C! GN-STRING ;
-
-T{ 0 0 GN' 0' >NUMBER -> 0 0 GN-CONSUMED }T
-T{ 0 0 GN' 1' >NUMBER -> 1 0 GN-CONSUMED }T
-T{ 1 0 GN' 1' >NUMBER -> BASE @ 1+ 0 GN-CONSUMED }T
-T{ 0 0 GN' -' >NUMBER -> 0 0 GN-STRING }T \ SHOULD FAIL TO CONVERT THESE
-T{ 0 0 GN' +' >NUMBER -> 0 0 GN-STRING }T
-T{ 0 0 GN' .' >NUMBER -> 0 0 GN-STRING }T
-
-: >NUMBER-BASED
- BASE @ >R BASE ! >NUMBER R> BASE ! ;
-
-T{ 0 0 GN' 2' 10 >NUMBER-BASED -> 2 0 GN-CONSUMED }T
-T{ 0 0 GN' 2' 2 >NUMBER-BASED -> 0 0 GN-STRING }T
-T{ 0 0 GN' F' 10 >NUMBER-BASED -> F 0 GN-CONSUMED }T
-T{ 0 0 GN' G' 10 >NUMBER-BASED -> 0 0 GN-STRING }T
-T{ 0 0 GN' G' MAX-BASE >NUMBER-BASED -> 10 0 GN-CONSUMED }T
-T{ 0 0 GN' Z' MAX-BASE >NUMBER-BASED -> 23 0 GN-CONSUMED }T
-
-: GN1 \ ( UD BASE -- UD' LEN ) UD SHOULD EQUAL UD' AND LEN SHOULD BE ZERO.
- BASE @ >R BASE !
- <# #S #>
- 0 0 2SWAP >NUMBER SWAP DROP \ RETURN LENGTH ONLY
- R> BASE ! ;
-T{ 0 0 2 GN1 -> 0 0 0 }T
-T{ MAX-UINT 0 2 GN1 -> MAX-UINT 0 0 }T
-T{ MAX-UINT DUP 2 GN1 -> MAX-UINT DUP 0 }T
-T{ 0 0 MAX-BASE GN1 -> 0 0 0 }T
-T{ MAX-UINT 0 MAX-BASE GN1 -> MAX-UINT 0 0 }T
-T{ MAX-UINT DUP MAX-BASE GN1 -> MAX-UINT DUP 0 }T
-
-: GN2 \ ( -- 16 10 )
- BASE @ >R HEX BASE @ DECIMAL BASE @ R> BASE ! ;
-T{ GN2 -> 10 A }T
-
-\ ------------------------------------------------------------------------
-TESTING FILL MOVE
-
-CREATE FBUF 00 C, 00 C, 00 C,
-CREATE SBUF 12 C, 34 C, 56 C,
-: SEEBUF FBUF C@ FBUF CHAR+ C@ FBUF CHAR+ CHAR+ C@ ;
-
-T{ FBUF 0 20 FILL -> }T
-T{ SEEBUF -> 00 00 00 }T
-
-T{ FBUF 1 20 FILL -> }T
-T{ SEEBUF -> 20 00 00 }T
-
-T{ FBUF 3 20 FILL -> }T
-T{ SEEBUF -> 20 20 20 }T
-
-T{ FBUF FBUF 3 CHARS MOVE -> }T \ BIZARRE SPECIAL CASE
-T{ SEEBUF -> 20 20 20 }T
-
-T{ SBUF FBUF 0 CHARS MOVE -> }T
-T{ SEEBUF -> 20 20 20 }T
-
-T{ SBUF FBUF 1 CHARS MOVE -> }T
-T{ SEEBUF -> 12 20 20 }T
-
-T{ SBUF FBUF 3 CHARS MOVE -> }T
-T{ SEEBUF -> 12 34 56 }T
-
-T{ FBUF FBUF CHAR+ 2 CHARS MOVE -> }T
-T{ SEEBUF -> 12 12 34 }T
-
-T{ FBUF CHAR+ FBUF 2 CHARS MOVE -> }T
-T{ SEEBUF -> 12 34 34 }T
-
-\ ------------------------------------------------------------------------
-TESTING OUTPUT: . ." CR EMIT SPACE SPACES TYPE U.
-
-: OUTPUT-TEST
- ." YOU SHOULD SEE THE STANDARD GRAPHIC CHARACTERS:" CR
- 41 BL DO I EMIT LOOP CR
- 61 41 DO I EMIT LOOP CR
- 7F 61 DO I EMIT LOOP CR
- ." YOU SHOULD SEE 0-9 SEPARATED BY A SPACE:" CR
- 9 1+ 0 DO I . LOOP CR
- ." YOU SHOULD SEE 0-9 (WITH NO SPACES):" CR
- [CHAR] 9 1+ [CHAR] 0 DO I 0 SPACES EMIT LOOP CR
- ." YOU SHOULD SEE A-G SEPARATED BY A SPACE:" CR
- [CHAR] G 1+ [CHAR] A DO I EMIT SPACE LOOP CR
- ." YOU SHOULD SEE 0-5 SEPARATED BY TWO SPACES:" CR
- 5 1+ 0 DO I [CHAR] 0 + EMIT 2 SPACES LOOP CR
- ." YOU SHOULD SEE TWO SEPARATE LINES:" CR
- S" LINE 1" TYPE CR S" LINE 2" TYPE CR
- ." YOU SHOULD SEE THE NUMBER RANGES OF SIGNED AND UNSIGNED NUMBERS:" CR
- ." SIGNED: " MIN-INT . MAX-INT . CR
- ." UNSIGNED: " 0 U. MAX-UINT U. CR
-;
-
-T{ OUTPUT-TEST -> }T
-\ ------------------------------------------------------------------------
-TESTING INPUT: ACCEPT
-
-CREATE ABUF 80 CHARS ALLOT
-
-: ACCEPT-TEST
- CR ." PLEASE TYPE UP TO 80 CHARACTERS:" CR
- ABUF 80 ACCEPT
- CR ." RECEIVED: " [CHAR] " EMIT
- ABUF SWAP TYPE [CHAR] " EMIT CR
-;
-
-T{ ACCEPT-TEST -> }T
-Vingt fois sur le métier remettez votre ouvrage, ...
-\ ------------------------------------------------------------------------
-TESTING DICTIONARY SEARCH RULES
-
-T{ : GDX 123 ; : GDX GDX 234 ; -> }T
-
-T{ GDX -> 123 234 }T
-
-CR .( End of Core word set tests) CR
-
-
-
-RST_STATE ; so ANS_COMPLEMENT_xx_MPY is conserved ;
-\ NOECHO ; if an error occurs, comment this line before new download to find it.
-
-
-\ From: John Hayes S1I
-\ Subject: tester.fr
-\ Date: Mon, 27 Nov 95 13:10:09 PST
-
-\ (C) 1995 JOHNS HOPKINS UNIVERSITY / APPLIED PHYSICS LABORATORY
-\ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS.
-\ VERSION 1.1
-
-\ 22/1/09 The words { and } have been changed to T{ and }T respectively to
-\ agree with the Forth 200X file ttester.fs. This avoids clashes with
-\ locals using { ... } and the FSL use of }
-
-
-\ 13/05/14 jmt. added colorised error messages.
-
-
-
- 0 CONSTANT FALSE
--1 CONSTANT TRUE
-
-\ SET THE FOLLOWING FLAG TO TRUE FOR MORE VERBOSE OUTPUT; THIS MAY
-\ ALLOW YOU TO TELL WHICH TEST CAUSED YOUR SYSTEM TO HANG.
-VARIABLE VERBOSE
- FALSE VERBOSE !
-\ TRUE VERBOSE !
-
-\ : EMPTY-STACK ( ... -- ) \ EMPTY STACK: HANDLES UNDERFLOWED STACK TOO.
-\ DEPTH ?DUP
-\ IF DUP 0< IF NEGATE 0
-\ DO 0 LOOP
-\ ELSE 0 DO DROP LOOP THEN
-\ THEN ;
-\
-\ : ERROR \ ( C-ADDR U -- ) DISPLAY AN ERROR MESSAGE FOLLOWED BY
-\ \ THE LINE THAT HAD THE ERROR.
-\ TYPE SOURCE TYPE CR \ DISPLAY LINE CORRESPONDING TO ERROR
-\ EMPTY-STACK \ THROW AWAY EVERY THING ELSE
-\ QUIT \ *** Uncomment this line to QUIT on an error
-\ ;
-
-VARIABLE ACTUAL-DEPTH \ STACK RECORD
-CREATE ACTUAL-RESULTS 20 CELLS ALLOT
-
-: T{ \ ( -- ) SYNTACTIC SUGAR.
- ;
-
-: -> \ ( ... -- ) RECORD DEPTH AND CONTENT OF STACK.
- DEPTH DUP ACTUAL-DEPTH ! \ RECORD DEPTH
- ?DUP IF \ IF THERE IS SOMETHING ON STACK
- 0 DO ACTUAL-RESULTS I CELLS + ! LOOP \ SAVE THEM
- THEN ;
-
-: }T \ ( ... -- ) COMPARE STACK (EXPECTED) CONTENTS WITH SAVED
- \ (ACTUAL) CONTENTS.
- DEPTH ACTUAL-DEPTH @ = IF \ IF DEPTHS MATCH
- DEPTH ?DUP IF \ IF THERE IS SOMETHING ON THE STACK
- 0 DO \ FOR EACH STACK ITEM
- ACTUAL-RESULTS I CELLS + @ \ COMPARE ACTUAL WITH EXPECTED
-\ = 0= IF S" INCORRECT RESULT: " ERROR LEAVE THEN \ jmt
- = 0= IF ABORT" INCORRECT RESULT: " THEN \ jmt : colorised message
- LOOP
- THEN
- ELSE \ DEPTH MISMATCH
-\ S" WRONG NUMBER OF RESULTS: " ERROR \ jmt
- ABORT" WRONG NUMBER OF RESULTS: " \ jmt : colorised message
- THEN ;
-
-: TESTING \ ( -- ) TALKING COMMENT.
- SOURCE VERBOSE @
- IF DUP >R TYPE CR R> >IN !
- ELSE >IN ! DROP [CHAR] * EMIT
- THEN ;
-
-\ From: John Hayes S1I
-\ Subject: core.fr
-\ Date: Mon, 27 Nov 95 13:10
-
-\ (C) 1995 JOHNS HOPKINS UNIVERSITY / APPLIED PHYSICS LABORATORY
-\ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS.
-\ VERSION 1.2
-\ THIS PROGRAM TESTS THE CORE WORDS OF AN ANS FORTH SYSTEM.
-\ THE PROGRAM ASSUMES A TWO'S COMPLEMENT IMPLEMENTATION WHERE
-\ THE RANGE OF SIGNED NUMBERS IS -2^(N-1) ... 2^(N-1)-1 AND
-\ THE RANGE OF UNSIGNED NUMBERS IS 0 ... 2^(N)-1.
-\ I HAVEN'T FIGURED OUT HOW TO TEST KEY, QUIT, ABORT, OR ABORT"...
-\ I ALSO HAVEN'T THOUGHT OF A WAY TO TEST ENVIRONMENT?...
-
-CR
-TESTING CORE WORDS
-HEX
-
-\ ------------------------------------------------------------------------
-TESTING BASIC ASSUMPTIONS
-
-T{ -> }T \ START WITH CLEAN SLATE
-( TEST IF ANY BITS ARE SET; ANSWER IN BASE 1 )
-T{ : BITSSET? IF 0 0 ELSE 0 THEN ; -> }T
-T{ 0 BITSSET? -> 0 }T ( ZERO IS ALL BITS CLEAR )
-T{ 1 BITSSET? -> 0 0 }T ( OTHER NUMBER HAVE AT LEAST ONE BIT )
-T{ -1 BITSSET? -> 0 0 }T
-
-\ ------------------------------------------------------------------------
-TESTING BOOLEANS: INVERT AND OR XOR
-
-T{ 0 0 AND -> 0 }T
-T{ 0 1 AND -> 0 }T
-T{ 1 0 AND -> 0 }T
-T{ 1 1 AND -> 1 }T
-
-T{ 0 INVERT 1 AND -> 1 }T
-T{ 1 INVERT 1 AND -> 0 }T
-
-0 CONSTANT 0S
-0 INVERT CONSTANT 1S
-
-T{ 0S INVERT -> 1S }T
-T{ 1S INVERT -> 0S }T
-
-T{ 0S 0S AND -> 0S }T
-T{ 0S 1S AND -> 0S }T
-T{ 1S 0S AND -> 0S }T
-T{ 1S 1S AND -> 1S }T
-
-T{ 0S 0S OR -> 0S }T
-T{ 0S 1S OR -> 1S }T
-T{ 1S 0S OR -> 1S }T
-T{ 1S 1S OR -> 1S }T
-
-T{ 0S 0S XOR -> 0S }T
-T{ 0S 1S XOR -> 1S }T
-T{ 1S 0S XOR -> 1S }T
-T{ 1S 1S XOR -> 0S }T
-
-\ ------------------------------------------------------------------------
-TESTING 2* 2/ LSHIFT RSHIFT
-
-( WE TRUST 1S, INVERT, AND BITSSET?; WE WILL CONFIRM RSHIFT LATER )
-1S 1 RSHIFT INVERT CONSTANT MSB
-T{ MSB BITSSET? -> 0 0 }T
-
-T{ 0S 2* -> 0S }T
-T{ 1 2* -> 2 }T
-T{ 4000 2* -> 8000 }T
-T{ 1S 2* 1 XOR -> 1S }T
-T{ MSB 2* -> 0S }T
-
-T{ 0S 2/ -> 0S }T
-T{ 1 2/ -> 0 }T
-T{ 4000 2/ -> 2000 }T
-T{ 1S 2/ -> 1S }T \ MSB PROPOGATED
-T{ 1S 1 XOR 2/ -> 1S }T
-T{ MSB 2/ MSB AND -> MSB }T
-
-T{ 1 0 LSHIFT -> 1 }T
-T{ 1 1 LSHIFT -> 2 }T
-T{ 1 2 LSHIFT -> 4 }T
-T{ 1 F LSHIFT -> 8000 }T \ BIGGEST GUARANTEED SHIFT
-T{ 1S 1 LSHIFT 1 XOR -> 1S }T
-T{ MSB 1 LSHIFT -> 0 }T
-
-T{ 1 0 RSHIFT -> 1 }T
-T{ 1 1 RSHIFT -> 0 }T
-T{ 2 1 RSHIFT -> 1 }T
-T{ 4 2 RSHIFT -> 1 }T
-T{ 8000 F RSHIFT -> 1 }T \ BIGGEST
-T{ MSB 1 RSHIFT MSB AND -> 0 }T \ RSHIFT ZERO FILLS MSBS
-T{ MSB 1 RSHIFT 2* -> MSB }T
-
-\ ------------------------------------------------------------------------
-TESTING COMPARISONS: 0= = 0< < > U< MIN MAX
-0 INVERT CONSTANT MAX-UINT
-0 INVERT 1 RSHIFT CONSTANT MAX-INT
-0 INVERT 1 RSHIFT INVERT CONSTANT MIN-INT
-0 INVERT 1 RSHIFT CONSTANT MID-UINT
-0 INVERT 1 RSHIFT INVERT CONSTANT MID-UINT+1
-
-0S CONSTANT <FALSE>
-1S CONSTANT <TRUE>
-
-T{ 0 0= -> <TRUE> }T
-T{ 1 0= -> <FALSE> }T
-T{ 2 0= -> <FALSE> }T
-T{ -1 0= -> <FALSE> }T
-T{ MAX-UINT 0= -> <FALSE> }T
-T{ MIN-INT 0= -> <FALSE> }T
-T{ MAX-INT 0= -> <FALSE> }T
-
-T{ 0 0 = -> <TRUE> }T
-T{ 1 1 = -> <TRUE> }T
-T{ -1 -1 = -> <TRUE> }T
-T{ 1 0 = -> <FALSE> }T
-T{ -1 0 = -> <FALSE> }T
-T{ 0 1 = -> <FALSE> }T
-T{ 0 -1 = -> <FALSE> }T
-
-T{ 0 0< -> <FALSE> }T
-T{ -1 0< -> <TRUE> }T
-T{ MIN-INT 0< -> <TRUE> }T
-T{ 1 0< -> <FALSE> }T
-T{ MAX-INT 0< -> <FALSE> }T
-
-T{ 0 1 < -> <TRUE> }T
-T{ 1 2 < -> <TRUE> }T
-T{ -1 0 < -> <TRUE> }T
-T{ -1 1 < -> <TRUE> }T
-T{ MIN-INT 0 < -> <TRUE> }T
-T{ MIN-INT MAX-INT < -> <TRUE> }T
-T{ 0 MAX-INT < -> <TRUE> }T
-T{ 0 0 < -> <FALSE> }T
-T{ 1 1 < -> <FALSE> }T
-T{ 1 0 < -> <FALSE> }T
-T{ 2 1 < -> <FALSE> }T
-T{ 0 -1 < -> <FALSE> }T
-T{ 1 -1 < -> <FALSE> }T
-T{ 0 MIN-INT < -> <FALSE> }T
-T{ MAX-INT MIN-INT < -> <FALSE> }T
-T{ MAX-INT 0 < -> <FALSE> }T
-
-T{ 0 1 > -> <FALSE> }T
-T{ 1 2 > -> <FALSE> }T
-T{ -1 0 > -> <FALSE> }T
-T{ -1 1 > -> <FALSE> }T
-T{ MIN-INT 0 > -> <FALSE> }T
-T{ MIN-INT MAX-INT > -> <FALSE> }T
-T{ 0 MAX-INT > -> <FALSE> }T
-T{ 0 0 > -> <FALSE> }T
-T{ 1 1 > -> <FALSE> }T
-T{ 1 0 > -> <TRUE> }T
-T{ 2 1 > -> <TRUE> }T
-T{ 0 -1 > -> <TRUE> }T
-T{ 1 -1 > -> <TRUE> }T
-T{ 0 MIN-INT > -> <TRUE> }T
-T{ MAX-INT MIN-INT > -> <TRUE> }T
-T{ MAX-INT 0 > -> <TRUE> }T
-
-T{ 0 1 U< -> <TRUE> }T
-T{ 1 2 U< -> <TRUE> }T
-T{ 0 MID-UINT U< -> <TRUE> }T
-T{ 0 MAX-UINT U< -> <TRUE> }T
-T{ MID-UINT MAX-UINT U< -> <TRUE> }T
-T{ 0 0 U< -> <FALSE> }T
-T{ 1 1 U< -> <FALSE> }T
-T{ 1 0 U< -> <FALSE> }T
-T{ 2 1 U< -> <FALSE> }T
-T{ MID-UINT 0 U< -> <FALSE> }T
-T{ MAX-UINT 0 U< -> <FALSE> }T
-T{ MAX-UINT MID-UINT U< -> <FALSE> }T
-
-T{ 0 1 MIN -> 0 }T
-T{ 1 2 MIN -> 1 }T
-T{ -1 0 MIN -> -1 }T
-T{ -1 1 MIN -> -1 }T
-T{ MIN-INT 0 MIN -> MIN-INT }T
-T{ MIN-INT MAX-INT MIN -> MIN-INT }T
-T{ 0 MAX-INT MIN -> 0 }T
-T{ 0 0 MIN -> 0 }T
-T{ 1 1 MIN -> 1 }T
-T{ 1 0 MIN -> 0 }T
-T{ 2 1 MIN -> 1 }T
-T{ 0 -1 MIN -> -1 }T
-T{ 1 -1 MIN -> -1 }T
-T{ 0 MIN-INT MIN -> MIN-INT }T
-T{ MAX-INT MIN-INT MIN -> MIN-INT }T
-T{ MAX-INT 0 MIN -> 0 }T
-
-T{ 0 1 MAX -> 1 }T
-T{ 1 2 MAX -> 2 }T
-T{ -1 0 MAX -> 0 }T
-T{ -1 1 MAX -> 1 }T
-T{ MIN-INT 0 MAX -> 0 }T
-T{ MIN-INT MAX-INT MAX -> MAX-INT }T
-T{ 0 MAX-INT MAX -> MAX-INT }T
-T{ 0 0 MAX -> 0 }T
-T{ 1 1 MAX -> 1 }T
-T{ 1 0 MAX -> 1 }T
-T{ 2 1 MAX -> 2 }T
-T{ 0 -1 MAX -> 0 }T
-T{ 1 -1 MAX -> 1 }T
-T{ 0 MIN-INT MAX -> 0 }T
-T{ MAX-INT MIN-INT MAX -> MAX-INT }T
-T{ MAX-INT 0 MAX -> MAX-INT }T
-
-\ ------------------------------------------------------------------------
-TESTING STACK OPS: 2DROP 2DUP 2OVER 2SWAP ?DUP DEPTH DROP DUP OVER ROT SWAP
-
-T{ 1 2 2DROP -> }T
-T{ 1 2 2DUP -> 1 2 1 2 }T
-T{ 1 2 3 4 2OVER -> 1 2 3 4 1 2 }T
-T{ 1 2 3 4 2SWAP -> 3 4 1 2 }T
-T{ 0 ?DUP -> 0 }T
-T{ 1 ?DUP -> 1 1 }T
-T{ -1 ?DUP -> -1 -1 }T
-T{ DEPTH -> 0 }T
-T{ 0 DEPTH -> 0 1 }T
-T{ 0 1 DEPTH -> 0 1 2 }T
-T{ 0 DROP -> }T
-T{ 1 2 DROP -> 1 }T
-T{ 1 DUP -> 1 1 }T
-T{ 1 2 OVER -> 1 2 1 }T
-T{ 1 2 3 ROT -> 2 3 1 }T
-T{ 1 2 SWAP -> 2 1 }T
-
-\ ------------------------------------------------------------------------
-TESTING >R R> R@
-
-T{ : GR1 >R R> ; -> }T
-T{ : GR2 >R R@ R> DROP ; -> }T
-T{ 123 GR1 -> 123 }T
-T{ 123 GR2 -> 123 }T
-T{ 1S GR1 -> 1S }T ( RETURN STACK HOLDS CELLS )
-
-\ ------------------------------------------------------------------------
-TESTING ADD/SUBTRACT: + - 1+ 1- ABS NEGATE
-
-T{ 0 5 + -> 5 }T
-T{ 5 0 + -> 5 }T
-T{ 0 -5 + -> -5 }T
-T{ -5 0 + -> -5 }T
-T{ 1 2 + -> 3 }T
-T{ 1 -2 + -> -1 }T
-T{ -1 2 + -> 1 }T
-T{ -1 -2 + -> -3 }T
-T{ -1 1 + -> 0 }T
-T{ MID-UINT 1 + -> MID-UINT+1 }T
-
-T{ 0 5 - -> -5 }T
-T{ 5 0 - -> 5 }T
-T{ 0 -5 - -> 5 }T
-T{ -5 0 - -> -5 }T
-T{ 1 2 - -> -1 }T
-T{ 1 -2 - -> 3 }T
-T{ -1 2 - -> -3 }T
-T{ -1 -2 - -> 1 }T
-T{ 0 1 - -> -1 }T
-T{ MID-UINT+1 1 - -> MID-UINT }T
-
-T{ 0 1+ -> 1 }T
-T{ -1 1+ -> 0 }T
-T{ 1 1+ -> 2 }T
-T{ MID-UINT 1+ -> MID-UINT+1 }T
-
-T{ 2 1- -> 1 }T
-T{ 1 1- -> 0 }T
-T{ 0 1- -> -1 }T
-T{ MID-UINT+1 1- -> MID-UINT }T
-
-T{ 0 NEGATE -> 0 }T
-T{ 1 NEGATE -> -1 }T
-T{ -1 NEGATE -> 1 }T
-T{ 2 NEGATE -> -2 }T
-T{ -2 NEGATE -> 2 }T
-
-T{ 0 ABS -> 0 }T
-T{ 1 ABS -> 1 }T
-T{ -1 ABS -> 1 }T
-T{ MIN-INT ABS -> MID-UINT+1 }T
-
-\ ------------------------------------------------------------------------
-TESTING MULTIPLY: S>D * M* UM*
-
-T{ 0 S>D -> 0 0 }T
-T{ 1 S>D -> 1 0 }T
-T{ 2 S>D -> 2 0 }T
-T{ -1 S>D -> -1 -1 }T
-T{ -2 S>D -> -2 -1 }T
-T{ MIN-INT S>D -> MIN-INT -1 }T
-T{ MAX-INT S>D -> MAX-INT 0 }T
-
-T{ 0 0 M* -> 0 S>D }T
-T{ 0 1 M* -> 0 S>D }T
-T{ 1 0 M* -> 0 S>D }T
-T{ 1 2 M* -> 2 S>D }T
-T{ 2 1 M* -> 2 S>D }T
-T{ 3 3 M* -> 9 S>D }T
-T{ -3 3 M* -> -9 S>D }T
-T{ 3 -3 M* -> -9 S>D }T
-T{ -3 -3 M* -> 9 S>D }T
-T{ 0 MIN-INT M* -> 0 S>D }T
-T{ 1 MIN-INT M* -> MIN-INT S>D }T
-T{ 2 MIN-INT M* -> 0 1S }T
-T{ 0 MAX-INT M* -> 0 S>D }T
-T{ 1 MAX-INT M* -> MAX-INT S>D }T
-T{ 2 MAX-INT M* -> MAX-INT 1 LSHIFT 0 }T
-T{ MIN-INT MIN-INT M* -> 0 MSB 1 RSHIFT }T
-T{ MAX-INT MIN-INT M* -> MSB MSB 2/ }T
-T{ MAX-INT MAX-INT M* -> 1 MSB 2/ INVERT }T
-
-T{ 0 0 * -> 0 }T \ TEST IDENTITIES
-T{ 0 1 * -> 0 }T
-T{ 1 0 * -> 0 }T
-T{ 1 2 * -> 2 }T
-T{ 2 1 * -> 2 }T
-T{ 3 3 * -> 9 }T
-T{ -3 3 * -> -9 }T
-T{ 3 -3 * -> -9 }T
-T{ -3 -3 * -> 9 }T
-
-T{ MID-UINT+1 1 RSHIFT 2 * -> MID-UINT+1 }T
-T{ MID-UINT+1 2 RSHIFT 4 * -> MID-UINT+1 }T
-T{ MID-UINT+1 1 RSHIFT MID-UINT+1 OR 2 * -> MID-UINT+1 }T
-
-T{ 0 0 UM* -> 0 0 }T
-T{ 0 1 UM* -> 0 0 }T
-T{ 1 0 UM* -> 0 0 }T
-T{ 1 2 UM* -> 2 0 }T
-T{ 2 1 UM* -> 2 0 }T
-T{ 3 3 UM* -> 9 0 }T
-
-T{ MID-UINT+1 1 RSHIFT 2 UM* -> MID-UINT+1 0 }T
-T{ MID-UINT+1 2 UM* -> 0 1 }T
-T{ MID-UINT+1 4 UM* -> 0 2 }T
-T{ 1S 2 UM* -> 1S 1 LSHIFT 1 }T
-T{ MAX-UINT MAX-UINT UM* -> 1 1 INVERT }T
-
-\ ------------------------------------------------------------------------
-TESTING DIVIDE: FM/MOD SM/REM UM/MOD */ */MOD / /MOD MOD
-
-T{ 0 S>D 1 FM/MOD -> 0 0 }T
-T{ 1 S>D 1 FM/MOD -> 0 1 }T
-T{ 2 S>D 1 FM/MOD -> 0 2 }T
-T{ -1 S>D 1 FM/MOD -> 0 -1 }T
-T{ -2 S>D 1 FM/MOD -> 0 -2 }T
-T{ 0 S>D -1 FM/MOD -> 0 0 }T
-T{ 1 S>D -1 FM/MOD -> 0 -1 }T
-T{ 2 S>D -1 FM/MOD -> 0 -2 }T
-T{ -1 S>D -1 FM/MOD -> 0 1 }T
-T{ -2 S>D -1 FM/MOD -> 0 2 }T
-T{ 2 S>D 2 FM/MOD -> 0 1 }T
-T{ -1 S>D -1 FM/MOD -> 0 1 }T
-T{ -2 S>D -2 FM/MOD -> 0 1 }T
-T{ 7 S>D 3 FM/MOD -> 1 2 }T
-T{ 7 S>D -3 FM/MOD -> -2 -3 }T
-T{ -7 S>D 3 FM/MOD -> 2 -3 }T
-T{ -7 S>D -3 FM/MOD -> -1 2 }T
-T{ MAX-INT S>D 1 FM/MOD -> 0 MAX-INT }T
-T{ MIN-INT S>D 1 FM/MOD -> 0 MIN-INT }T
-T{ MAX-INT S>D MAX-INT FM/MOD -> 0 1 }T
-T{ MIN-INT S>D MIN-INT FM/MOD -> 0 1 }T
-T{ 1S 1 4 FM/MOD -> 3 MAX-INT }T
-T{ 1 MIN-INT M* 1 FM/MOD -> 0 MIN-INT }T
-T{ 1 MIN-INT M* MIN-INT FM/MOD -> 0 1 }T
-T{ 2 MIN-INT M* 2 FM/MOD -> 0 MIN-INT }T
-T{ 2 MIN-INT M* MIN-INT FM/MOD -> 0 2 }T
-T{ 1 MAX-INT M* 1 FM/MOD -> 0 MAX-INT }T
-T{ 1 MAX-INT M* MAX-INT FM/MOD -> 0 1 }T
-T{ 2 MAX-INT M* 2 FM/MOD -> 0 MAX-INT }T
-T{ 2 MAX-INT M* MAX-INT FM/MOD -> 0 2 }T
-T{ MIN-INT MIN-INT M* MIN-INT FM/MOD -> 0 MIN-INT }T
-T{ MIN-INT MAX-INT M* MIN-INT FM/MOD -> 0 MAX-INT }T
-T{ MIN-INT MAX-INT M* MAX-INT FM/MOD -> 0 MIN-INT }T
-T{ MAX-INT MAX-INT M* MAX-INT FM/MOD -> 0 MAX-INT }T
-
-T{ 0 S>D 1 SM/REM -> 0 0 }T
-T{ 1 S>D 1 SM/REM -> 0 1 }T
-T{ 2 S>D 1 SM/REM -> 0 2 }T
-T{ -1 S>D 1 SM/REM -> 0 -1 }T
-T{ -2 S>D 1 SM/REM -> 0 -2 }T
-T{ 0 S>D -1 SM/REM -> 0 0 }T
-T{ 1 S>D -1 SM/REM -> 0 -1 }T
-T{ 2 S>D -1 SM/REM -> 0 -2 }T
-T{ -1 S>D -1 SM/REM -> 0 1 }T
-T{ -2 S>D -1 SM/REM -> 0 2 }T
-T{ 2 S>D 2 SM/REM -> 0 1 }T
-T{ -1 S>D -1 SM/REM -> 0 1 }T
-T{ -2 S>D -2 SM/REM -> 0 1 }T
-T{ 7 S>D 3 SM/REM -> 1 2 }T
-T{ 7 S>D -3 SM/REM -> 1 -2 }T
-T{ -7 S>D 3 SM/REM -> -1 -2 }T
-T{ -7 S>D -3 SM/REM -> -1 2 }T
-T{ MAX-INT S>D 1 SM/REM -> 0 MAX-INT }T
-T{ MIN-INT S>D 1 SM/REM -> 0 MIN-INT }T
-T{ MAX-INT S>D MAX-INT SM/REM -> 0 1 }T
-T{ MIN-INT S>D MIN-INT SM/REM -> 0 1 }T
-T{ 1S 1 4 SM/REM -> 3 MAX-INT }T
-T{ 2 MIN-INT M* 2 SM/REM -> 0 MIN-INT }T
-T{ 2 MIN-INT M* MIN-INT SM/REM -> 0 2 }T
-T{ 2 MAX-INT M* 2 SM/REM -> 0 MAX-INT }T
-T{ 2 MAX-INT M* MAX-INT SM/REM -> 0 2 }T
-T{ MIN-INT MIN-INT M* MIN-INT SM/REM -> 0 MIN-INT }T
-T{ MIN-INT MAX-INT M* MIN-INT SM/REM -> 0 MAX-INT }T
-T{ MIN-INT MAX-INT M* MAX-INT SM/REM -> 0 MIN-INT }T
-T{ MAX-INT MAX-INT M* MAX-INT SM/REM -> 0 MAX-INT }T
-
-T{ 0 0 1 UM/MOD -> 0 0 }T
-T{ 1 0 1 UM/MOD -> 0 1 }T
-T{ 1 0 2 UM/MOD -> 1 0 }T
-T{ 3 0 2 UM/MOD -> 1 1 }T
-T{ MAX-UINT 2 UM* 2 UM/MOD -> 0 MAX-UINT }T
-T{ MAX-UINT 2 UM* MAX-UINT UM/MOD -> 0 2 }T
-T{ MAX-UINT MAX-UINT UM* MAX-UINT UM/MOD -> 0 MAX-UINT }T
-
-: IFFLOORED
- [ -3 2 / -2 = INVERT ] LITERAL IF POSTPONE \ THEN ;
-
-: IFSYM
- [ -3 2 / -1 = INVERT ] LITERAL IF POSTPONE \ THEN ;
-
-\ THE SYSTEM MIGHT DO EITHER FLOORED OR SYMMETRIC DIVISION.
-\ SINCE WE HAVE ALREADY TESTED M*, FM/MOD, AND SM/REM WE CAN USE THEM IN TEST.
-
-IFFLOORED : T/MOD >R S>D R> FM/MOD ;
-IFFLOORED : T/ T/MOD SWAP DROP ;
-IFFLOORED : TMOD T/MOD DROP ;
-IFFLOORED : T*/MOD >R M* R> FM/MOD ;
-IFFLOORED : T*/ T*/MOD SWAP DROP ;
-IFSYM : T/MOD >R S>D R> SM/REM ;
-IFSYM : T/ T/MOD SWAP DROP ;
-IFSYM : TMOD T/MOD DROP ;
-IFSYM : T*/MOD >R M* R> SM/REM ;
-IFSYM : T*/ T*/MOD SWAP DROP ;
-
-T{ 0 1 /MOD -> 0 1 T/MOD }T
-T{ 1 1 /MOD -> 1 1 T/MOD }T
-T{ 2 1 /MOD -> 2 1 T/MOD }T
-T{ -1 1 /MOD -> -1 1 T/MOD }T
-T{ -2 1 /MOD -> -2 1 T/MOD }T
-T{ 0 -1 /MOD -> 0 -1 T/MOD }T
-T{ 1 -1 /MOD -> 1 -1 T/MOD }T
-T{ 2 -1 /MOD -> 2 -1 T/MOD }T
-T{ -1 -1 /MOD -> -1 -1 T/MOD }T
-T{ -2 -1 /MOD -> -2 -1 T/MOD }T
-T{ 2 2 /MOD -> 2 2 T/MOD }T
-T{ -1 -1 /MOD -> -1 -1 T/MOD }T
-T{ -2 -2 /MOD -> -2 -2 T/MOD }T
-T{ 7 3 /MOD -> 7 3 T/MOD }T
-T{ 7 -3 /MOD -> 7 -3 T/MOD }T
-T{ -7 3 /MOD -> -7 3 T/MOD }T
-T{ -7 -3 /MOD -> -7 -3 T/MOD }T
-T{ MAX-INT 1 /MOD -> MAX-INT 1 T/MOD }T
-T{ MIN-INT 1 /MOD -> MIN-INT 1 T/MOD }T
-T{ MAX-INT MAX-INT /MOD -> MAX-INT MAX-INT T/MOD }T
-T{ MIN-INT MIN-INT /MOD -> MIN-INT MIN-INT T/MOD }T
-
-T{ 0 1 / -> 0 1 T/ }T
-T{ 1 1 / -> 1 1 T/ }T
-T{ 2 1 / -> 2 1 T/ }T
-T{ -1 1 / -> -1 1 T/ }T
-T{ -2 1 / -> -2 1 T/ }T
-T{ 0 -1 / -> 0 -1 T/ }T
-T{ 1 -1 / -> 1 -1 T/ }T
-T{ 2 -1 / -> 2 -1 T/ }T
-T{ -1 -1 / -> -1 -1 T/ }T
-T{ -2 -1 / -> -2 -1 T/ }T
-T{ 2 2 / -> 2 2 T/ }T
-T{ -1 -1 / -> -1 -1 T/ }T
-T{ -2 -2 / -> -2 -2 T/ }T
-T{ 7 3 / -> 7 3 T/ }T
-T{ 7 -3 / -> 7 -3 T/ }T
-T{ -7 3 / -> -7 3 T/ }T
-T{ -7 -3 / -> -7 -3 T/ }T
-T{ MAX-INT 1 / -> MAX-INT 1 T/ }T
-T{ MIN-INT 1 / -> MIN-INT 1 T/ }T
-T{ MAX-INT MAX-INT / -> MAX-INT MAX-INT T/ }T
-T{ MIN-INT MIN-INT / -> MIN-INT MIN-INT T/ }T
-
-T{ 0 1 MOD -> 0 1 TMOD }T
-T{ 1 1 MOD -> 1 1 TMOD }T
-T{ 2 1 MOD -> 2 1 TMOD }T
-T{ -1 1 MOD -> -1 1 TMOD }T
-T{ -2 1 MOD -> -2 1 TMOD }T
-T{ 0 -1 MOD -> 0 -1 TMOD }T
-T{ 1 -1 MOD -> 1 -1 TMOD }T
-T{ 2 -1 MOD -> 2 -1 TMOD }T
-T{ -1 -1 MOD -> -1 -1 TMOD }T
-T{ -2 -1 MOD -> -2 -1 TMOD }T
-T{ 2 2 MOD -> 2 2 TMOD }T
-T{ -1 -1 MOD -> -1 -1 TMOD }T
-T{ -2 -2 MOD -> -2 -2 TMOD }T
-T{ 7 3 MOD -> 7 3 TMOD }T
-T{ 7 -3 MOD -> 7 -3 TMOD }T
-T{ -7 3 MOD -> -7 3 TMOD }T
-T{ -7 -3 MOD -> -7 -3 TMOD }T
-T{ MAX-INT 1 MOD -> MAX-INT 1 TMOD }T
-T{ MIN-INT 1 MOD -> MIN-INT 1 TMOD }T
-T{ MAX-INT MAX-INT MOD -> MAX-INT MAX-INT TMOD }T
-T{ MIN-INT MIN-INT MOD -> MIN-INT MIN-INT TMOD }T
-
-T{ 0 2 1 */ -> 0 2 1 T*/ }T
-T{ 1 2 1 */ -> 1 2 1 T*/ }T
-T{ 2 2 1 */ -> 2 2 1 T*/ }T
-T{ -1 2 1 */ -> -1 2 1 T*/ }T
-T{ -2 2 1 */ -> -2 2 1 T*/ }T
-T{ 0 2 -1 */ -> 0 2 -1 T*/ }T
-T{ 1 2 -1 */ -> 1 2 -1 T*/ }T
-T{ 2 2 -1 */ -> 2 2 -1 T*/ }T
-T{ -1 2 -1 */ -> -1 2 -1 T*/ }T
-T{ -2 2 -1 */ -> -2 2 -1 T*/ }T
-T{ 2 2 2 */ -> 2 2 2 T*/ }T
-T{ -1 2 -1 */ -> -1 2 -1 T*/ }T
-T{ -2 2 -2 */ -> -2 2 -2 T*/ }T
-T{ 7 2 3 */ -> 7 2 3 T*/ }T
-T{ 7 2 -3 */ -> 7 2 -3 T*/ }T
-T{ -7 2 3 */ -> -7 2 3 T*/ }T
-T{ -7 2 -3 */ -> -7 2 -3 T*/ }T
-T{ MAX-INT 2 MAX-INT */ -> MAX-INT 2 MAX-INT T*/ }T
-T{ MIN-INT 2 MIN-INT */ -> MIN-INT 2 MIN-INT T*/ }T
-
-T{ 0 2 1 */MOD -> 0 2 1 T*/MOD }T
-T{ 1 2 1 */MOD -> 1 2 1 T*/MOD }T
-T{ 2 2 1 */MOD -> 2 2 1 T*/MOD }T
-T{ -1 2 1 */MOD -> -1 2 1 T*/MOD }T
-T{ -2 2 1 */MOD -> -2 2 1 T*/MOD }T
-T{ 0 2 -1 */MOD -> 0 2 -1 T*/MOD }T
-T{ 1 2 -1 */MOD -> 1 2 -1 T*/MOD }T
-T{ 2 2 -1 */MOD -> 2 2 -1 T*/MOD }T
-T{ -1 2 -1 */MOD -> -1 2 -1 T*/MOD }T
-T{ -2 2 -1 */MOD -> -2 2 -1 T*/MOD }T
-T{ 2 2 2 */MOD -> 2 2 2 T*/MOD }T
-T{ -1 2 -1 */MOD -> -1 2 -1 T*/MOD }T
-T{ -2 2 -2 */MOD -> -2 2 -2 T*/MOD }T
-T{ 7 2 3 */MOD -> 7 2 3 T*/MOD }T
-T{ 7 2 -3 */MOD -> 7 2 -3 T*/MOD }T
-T{ -7 2 3 */MOD -> -7 2 3 T*/MOD }T
-T{ -7 2 -3 */MOD -> -7 2 -3 T*/MOD }T
-T{ MAX-INT 2 MAX-INT */MOD -> MAX-INT 2 MAX-INT T*/MOD }T
-T{ MIN-INT 2 MIN-INT */MOD -> MIN-INT 2 MIN-INT T*/MOD }T
-
-\ ------------------------------------------------------------------------
-TESTING HERE , @ ! CELL+ CELLS C, C@ C! CHARS 2@ 2! ALIGN ALIGNED +! ALLOT
-
-HERE 1 ALLOT
-HERE
-CONSTANT 2NDA
-CONSTANT 1STA
-T{ 1STA 2NDA U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT
-T{ 1STA 1+ -> 2NDA }T \ ... BY ONE ADDRESS UNIT
-( MISSING TEST: NEGATIVE ALLOT )
-
-HERE 1 ,
-HERE 2 ,
-CONSTANT 2ND
-CONSTANT 1ST
-T{ 1ST 2ND U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT
-T{ 1ST CELL+ -> 2ND }T \ ... BY ONE CELL
-T{ 1ST 1 CELLS + -> 2ND }T
-T{ 1ST @ 2ND @ -> 1 2 }T
-T{ 5 1ST ! -> }T
-T{ 1ST @ 2ND @ -> 5 2 }T
-T{ 6 2ND ! -> }T
-T{ 1ST @ 2ND @ -> 5 6 }T
-T{ 1ST 2@ -> 6 5 }T
-T{ 2 1 1ST 2! -> }T
-T{ 1ST 2@ -> 2 1 }T
-T{ 1S 1ST ! 1ST @ -> 1S }T \ CAN STORE CELL-WIDE VALUE
-
-HERE 1 C,
-HERE 2 C,
-CONSTANT 2NDC
-CONSTANT 1STC
-T{ 1STC 2NDC U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT
-T{ 1STC CHAR+ -> 2NDC }T \ ... BY ONE CHAR
-T{ 1STC 1 CHARS + -> 2NDC }T
-T{ 1STC C@ 2NDC C@ -> 1 2 }T
-T{ 3 1STC C! -> }T
-T{ 1STC C@ 2NDC C@ -> 3 2 }T
-T{ 4 2NDC C! -> }T
-T{ 1STC C@ 2NDC C@ -> 3 4 }T
-
-ALIGN 1 ALLOT HERE ALIGN HERE 3 CELLS ALLOT
-CONSTANT A-ADDR CONSTANT UA-ADDR
-T{ UA-ADDR ALIGNED -> A-ADDR }T
-T{ 1 A-ADDR C! A-ADDR C@ -> 1 }T
-T{ 1234 A-ADDR ! A-ADDR @ -> 1234 }T
-T{ 123 456 A-ADDR 2! A-ADDR 2@ -> 123 456 }T
-T{ 2 A-ADDR CHAR+ C! A-ADDR CHAR+ C@ -> 2 }T
-T{ 3 A-ADDR CELL+ C! A-ADDR CELL+ C@ -> 3 }T
-T{ 1234 A-ADDR CELL+ ! A-ADDR CELL+ @ -> 1234 }T
-T{ 123 456 A-ADDR CELL+ 2! A-ADDR CELL+ 2@ -> 123 456 }T
-
-: BITS ( X -- U )
- 0 SWAP BEGIN DUP WHILE DUP MSB AND IF >R 1+ R> THEN 2* REPEAT DROP ;
-( CHARACTERS >= 1 AU, <= SIZE OF CELL, >= 8 BITS )
-T{ 1 CHARS 1 < -> <FALSE> }T
-T{ 1 CHARS 1 CELLS > -> <FALSE> }T
-( TBD: HOW TO FIND NUMBER OF BITS? )
-
-( CELLS >= 1 AU, INTEGRAL MULTIPLE OF CHAR SIZE, >= 16 BITS )
-T{ 1 CELLS 1 < -> <FALSE> }T
-T{ 1 CELLS 1 CHARS MOD -> 0 }T
-T{ 1S BITS 10 < -> <FALSE> }T
-
-T{ 0 1ST ! -> }T
-T{ 1 1ST +! -> }T
-T{ 1ST @ -> 1 }T
-T{ -1 1ST +! 1ST @ -> 0 }T
-
-\ ------------------------------------------------------------------------
-TESTING CHAR [CHAR] [ ] BL S"
-
-T{ BL -> 20 }T
-T{ CHAR X -> 58 }T
-T{ CHAR HELLO -> 48 }T
-T{ : GC1 [CHAR] X ; -> }T
-T{ : GC2 [CHAR] HELLO ; -> }T
-T{ GC1 -> 58 }T
-T{ GC2 -> 48 }T
-T{ : GC3 [ GC1 ] LITERAL ; -> }T
-T{ GC3 -> 58 }T
-T{ : GC4 S" XY" ; -> }T
-T{ GC4 SWAP DROP -> 2 }T
-T{ GC4 DROP DUP C@ SWAP CHAR+ C@ -> 58 59 }T
-
-\ ------------------------------------------------------------------------
-TESTING ' ['] FIND EXECUTE IMMEDIATE COUNT LITERAL POSTPONE STATE
-
-T{ : GT1 123 ; -> }T
-T{ ' GT1 EXECUTE -> 123 }T
-T{ : GT2 ['] GT1 ; IMMEDIATE -> }T
-T{ GT2 EXECUTE -> 123 }T
-HERE 3 C, CHAR G C, CHAR T C, CHAR 1 C, CONSTANT GT1STRING
-HERE 3 C, CHAR G C, CHAR T C, CHAR 2 C, CONSTANT GT2STRING
-T{ GT1STRING FIND -> ' GT1 -1 }T
-T{ GT2STRING FIND -> ' GT2 1 }T
-( HOW TO SEARCH FOR NON-EXISTENT WORD? )
-T{ : GT3 GT2 LITERAL ; -> }T
-T{ GT3 -> ' GT1 }T
-T{ GT1STRING COUNT -> GT1STRING CHAR+ 3 }T
-
-T{ : GT4 POSTPONE GT1 ; IMMEDIATE -> }T
-T{ : GT5 GT4 ; -> }T
-T{ GT5 -> 123 }T
-T{ : GT6 345 ; IMMEDIATE -> }T
-T{ : GT7 POSTPONE GT6 ; -> }T
-T{ GT7 -> 345 }T
-
-T{ : GT8 STATE @ ; IMMEDIATE -> }T
-T{ GT8 -> 0 }T
-T{ : GT9 GT8 LITERAL ; -> }T
-T{ GT9 0= -> <FALSE> }T
-
-\ ------------------------------------------------------------------------
-TESTING IF ELSE THEN BEGIN WHILE REPEAT UNTIL RECURSE
-
-T{ : GI1 IF 123 THEN ; -> }T
-T{ : GI2 IF 123 ELSE 234 THEN ; -> }T
-T{ 0 GI1 -> }T
-T{ 1 GI1 -> 123 }T
-T{ -1 GI1 -> 123 }T
-T{ 0 GI2 -> 234 }T
-T{ 1 GI2 -> 123 }T
-T{ -1 GI1 -> 123 }T
-
-T{ : GI3 BEGIN DUP 5 < WHILE DUP 1+ REPEAT ; -> }T
-T{ 0 GI3 -> 0 1 2 3 4 5 }T
-T{ 4 GI3 -> 4 5 }T
-T{ 5 GI3 -> 5 }T
-T{ 6 GI3 -> 6 }T
-
-T{ : GI4 BEGIN DUP 1+ DUP 5 > UNTIL ; -> }T
-T{ 3 GI4 -> 3 4 5 6 }T
-T{ 5 GI4 -> 5 6 }T
-T{ 6 GI4 -> 6 7 }T
-
-T{ : GI5 BEGIN DUP 2 > WHILE DUP 5 < WHILE DUP 1+ REPEAT 123 ELSE 345 THEN ; -> }T
-T{ 1 GI5 -> 1 345 }T
-T{ 2 GI5 -> 2 345 }T
-T{ 3 GI5 -> 3 4 5 123 }T
-T{ 4 GI5 -> 4 5 123 }T
-T{ 5 GI5 -> 5 123 }T
-
-T{ : GI6 ( N -- 0,1,..N ) DUP IF DUP >R 1- RECURSE R> THEN ; -> }T
-T{ 0 GI6 -> 0 }T
-T{ 1 GI6 -> 0 1 }T
-T{ 2 GI6 -> 0 1 2 }T
-T{ 3 GI6 -> 0 1 2 3 }T
-T{ 4 GI6 -> 0 1 2 3 4 }T
-
-\ ------------------------------------------------------------------------
-TESTING DO LOOP +LOOP I J UNLOOP LEAVE EXIT
-
-T{ : GD1 DO I LOOP ; -> }T
-T{ 4 1 GD1 -> 1 2 3 }T
-T{ 2 -1 GD1 -> -1 0 1 }T
-T{ MID-UINT+1 MID-UINT GD1 -> MID-UINT }T
-
-T{ : GD2 DO I -1 +LOOP ; -> }T
-T{ 1 4 GD2 -> 4 3 2 1 }T
-T{ -1 2 GD2 -> 2 1 0 -1 }T
-T{ MID-UINT MID-UINT+1 GD2 -> MID-UINT+1 MID-UINT }T
-
-T{ : GD3 DO 1 0 DO J LOOP LOOP ; -> }T
-T{ 4 1 GD3 -> 1 2 3 }T
-T{ 2 -1 GD3 -> -1 0 1 }T
-T{ MID-UINT+1 MID-UINT GD3 -> MID-UINT }T
-
-T{ : GD4 DO 1 0 DO J LOOP -1 +LOOP ; -> }T
-T{ 1 4 GD4 -> 4 3 2 1 }T
-T{ -1 2 GD4 -> 2 1 0 -1 }T
-T{ MID-UINT MID-UINT+1 GD4 -> MID-UINT+1 MID-UINT }T
-
-T{ : GD5 123 SWAP 0 DO I 4 > IF DROP 234 LEAVE THEN LOOP ; -> }T
-T{ 1 GD5 -> 123 }T
-T{ 5 GD5 -> 123 }T
-T{ 6 GD5 -> 234 }T
-
-T{ : GD6 ( PAT: T{0 0}T,T{0 0}TT{1 0}TT{1 1}T,T{0 0}TT{1 0}TT{1 1}TT{2 0}TT{2 1}TT{2 2}T )
- 0 SWAP 0 DO
- I 1+ 0 DO I J + 3 = IF I UNLOOP I UNLOOP EXIT THEN 1+ LOOP
- LOOP ; -> }T
-T{ 1 GD6 -> 1 }T
-T{ 2 GD6 -> 3 }T
-T{ 3 GD6 -> 4 1 2 }T
-
-\ ------------------------------------------------------------------------
-TESTING DEFINING WORDS: : ; CONSTANT VARIABLE CREATE DOES> >BODY
-
-T{ 123 CONSTANT X123 -> }T
-T{ X123 -> 123 }T
-T{ : EQU CONSTANT ; -> }T
-T{ X123 EQU Y123 -> }T
-T{ Y123 -> 123 }T
-
-T{ VARIABLE V1 -> }T
-T{ 123 V1 ! -> }T
-T{ V1 @ -> 123 }T
-
-T{ : NOP : POSTPONE ; ; -> }T
-T{ NOP NOP1 NOP NOP2 -> }T
-T{ NOP1 -> }T
-T{ NOP2 -> }T
-
-T{ : DOES1 DOES> @ 1 + ; -> }T
-T{ : DOES2 DOES> @ 2 + ; -> }T
-T{ CREATE CR1 -> }T
-T{ CR1 -> HERE }T
-T{ ' CR1 >BODY -> HERE }T
-T{ 1 , -> }T
-T{ CR1 @ -> 1 }T
-T{ DOES1 -> }T
-T{ CR1 -> 2 }T
-T{ DOES2 -> }T
-T{ CR1 -> 3 }T
-
-T{ : WEIRD: CREATE DOES> 1 + DOES> 2 + ; -> }T
-T{ WEIRD: W1 -> }T
-T{ ' W1 >BODY -> HERE }T
-T{ W1 -> HERE 1 + }T
-T{ W1 -> HERE 2 + }T
-
-\ ------------------------------------------------------------------------
-TESTING EVALUATE
-
-: GE1 S" 123" ; IMMEDIATE
-: GE2 S" 123 1+" ; IMMEDIATE
-: GE3 S" : GE4 345 ;" ;
-: GE5 EVALUATE ; IMMEDIATE
-
-T{ GE1 EVALUATE -> 123 }T ( TEST EVALUATE IN INTERP. STATE )
-T{ GE2 EVALUATE -> 124 }T
-T{ GE3 EVALUATE -> }T
-T{ GE4 -> 345 }T
-
-T{ : GE6 GE1 GE5 ; -> }T ( TEST EVALUATE IN COMPILE STATE )
-T{ GE6 -> 123 }T
-T{ : GE7 GE2 GE5 ; -> }T
-T{ GE7 -> 124 }T
-
-\ ------------------------------------------------------------------------
-TESTING SOURCE >IN WORD
-
-: GS1 S" SOURCE" 2DUP EVALUATE
- >R SWAP >R = R> R> = ;
-T{ GS1 -> <TRUE> <TRUE> }T
-
-VARIABLE SCANS
-: RESCAN? -1 SCANS +! SCANS @ IF 0 >IN ! THEN ;
-
-T{ 2 SCANS !
-345 RESCAN?
--> 345 345 }T
-
-: GS2 5 SCANS ! S" 123 RESCAN?" EVALUATE ;
-T{ GS2 -> 123 123 123 123 123 }T
-
-: GS3 WORD COUNT SWAP C@ ;
-T{ BL GS3 HELLO -> 5 CHAR H }T
-T{ CHAR " GS3 GOODBYE" -> 7 CHAR G }T
-T{ BL GS3
-DROP -> 0 }T \ BLANK LINE RETURN ZERO-LENGTH STRING
-
-: GS4 SOURCE >IN ! DROP ;
-T{ GS4 123 456
--> }T
-
-\ ------------------------------------------------------------------------
-TESTING <# # #S #> HOLD SIGN BASE >NUMBER HEX DECIMAL
-
-: S= \ ( ADDR1 C1 ADDR2 C2 -- T/F ) COMPARE TWO STRINGS.
- >R SWAP R@ = IF \ MAKE SURE STRINGS HAVE SAME LENGTH
- R> ?DUP IF \ IF NON-EMPTY STRINGS
- 0 DO
- OVER C@ OVER C@ - IF
- 2DROP <FALSE> UNLOOP EXIT THEN
- SWAP CHAR+ SWAP CHAR+
- LOOP
- THEN
- 2DROP <TRUE> \ IF WE GET HERE, STRINGS MATCH
- ELSE
- R> DROP 2DROP <FALSE> \ LENGTHS MISMATCH
- THEN ;
-
-: GP1 <# 41 HOLD 42 HOLD 0 0 #> S" BA" S= ;
-T{ GP1 -> <TRUE> }T
-
-: GP2 <# -1 SIGN 0 SIGN -1 SIGN 0 0 #> S" --" S= ;
-T{ GP2 -> <TRUE> }T
-
-: GP3 <# 1 0 # # #> S" 01" S= ;
-T{ GP3 -> <TRUE> }T
-
-: GP4 <# 1 0 #S #> S" 1" S= ;
-T{ GP4 -> <TRUE> }T
-
-24 CONSTANT MAX-BASE \ BASE 2 .. 36
-: COUNT-BITS
- 0 0 INVERT BEGIN DUP WHILE >R 1+ R> 2* REPEAT DROP ;
-COUNT-BITS 2* CONSTANT #BITS-UD \ NUMBER OF BITS IN UD
-
-: GP5
- BASE @ <TRUE>
- MAX-BASE 1+ 2 DO \ FOR EACH POSSIBLE BASE
- I BASE ! \ TBD: ASSUMES BASE WORKS
- I 0 <# #S #> S" 10" S= AND
- LOOP
- SWAP BASE ! ;
-T{ GP5 -> <TRUE> }T
-
-: GP6
- BASE @ >R 2 BASE !
- MAX-UINT MAX-UINT <# #S #> \ MAXIMUM UD TO BINARY
- R> BASE ! \ S: C-ADDR U
- DUP #BITS-UD = SWAP
- 0 DO \ S: C-ADDR FLAG
- OVER C@ [CHAR] 1 = AND \ ALL ONES
- >R CHAR+ R>
- LOOP SWAP DROP ;
-T{ GP6 -> <TRUE> }T
-
-: GP7
- BASE @ >R MAX-BASE BASE !
- <TRUE>
- A 0 DO
- I 0 <# #S #>
- 1 = SWAP C@ I 30 + = AND AND
- LOOP
- MAX-BASE A DO
- I 0 <# #S #>
- 1 = SWAP C@ 41 I A - + = AND AND
- LOOP
- R> BASE ! ;
-
-T{ GP7 -> <TRUE> }T
-
-\ >NUMBER TESTS
-CREATE GN-BUF 0 C,
-: GN-STRING GN-BUF 1 ;
-: GN-CONSUMED GN-BUF CHAR+ 0 ;
-: GN' [CHAR] ' WORD CHAR+ C@ GN-BUF C! GN-STRING ;
-
-T{ 0 0 GN' 0' >NUMBER -> 0 0 GN-CONSUMED }T
-T{ 0 0 GN' 1' >NUMBER -> 1 0 GN-CONSUMED }T
-T{ 1 0 GN' 1' >NUMBER -> BASE @ 1+ 0 GN-CONSUMED }T
-T{ 0 0 GN' -' >NUMBER -> 0 0 GN-STRING }T \ SHOULD FAIL TO CONVERT THESE
-T{ 0 0 GN' +' >NUMBER -> 0 0 GN-STRING }T
-T{ 0 0 GN' .' >NUMBER -> 0 0 GN-STRING }T
-
-: >NUMBER-BASED
- BASE @ >R BASE ! >NUMBER R> BASE ! ;
-
-T{ 0 0 GN' 2' 10 >NUMBER-BASED -> 2 0 GN-CONSUMED }T
-T{ 0 0 GN' 2' 2 >NUMBER-BASED -> 0 0 GN-STRING }T
-T{ 0 0 GN' F' 10 >NUMBER-BASED -> F 0 GN-CONSUMED }T
-T{ 0 0 GN' G' 10 >NUMBER-BASED -> 0 0 GN-STRING }T
-T{ 0 0 GN' G' MAX-BASE >NUMBER-BASED -> 10 0 GN-CONSUMED }T
-T{ 0 0 GN' Z' MAX-BASE >NUMBER-BASED -> 23 0 GN-CONSUMED }T
-
-: GN1 \ ( UD BASE -- UD' LEN ) UD SHOULD EQUAL UD' AND LEN SHOULD BE ZERO.
- BASE @ >R BASE !
- <# #S #>
- 0 0 2SWAP >NUMBER SWAP DROP \ RETURN LENGTH ONLY
- R> BASE ! ;
-T{ 0 0 2 GN1 -> 0 0 0 }T
-T{ MAX-UINT 0 2 GN1 -> MAX-UINT 0 0 }T
-T{ MAX-UINT DUP 2 GN1 -> MAX-UINT DUP 0 }T
-T{ 0 0 MAX-BASE GN1 -> 0 0 0 }T
-T{ MAX-UINT 0 MAX-BASE GN1 -> MAX-UINT 0 0 }T
-T{ MAX-UINT DUP MAX-BASE GN1 -> MAX-UINT DUP 0 }T
-
-: GN2 \ ( -- 16 10 )
- BASE @ >R HEX BASE @ DECIMAL BASE @ R> BASE ! ;
-T{ GN2 -> 10 A }T
-
-\ ------------------------------------------------------------------------
-TESTING FILL MOVE
-
-CREATE FBUF 00 C, 00 C, 00 C,
-CREATE SBUF 12 C, 34 C, 56 C,
-: SEEBUF FBUF C@ FBUF CHAR+ C@ FBUF CHAR+ CHAR+ C@ ;
-
-T{ FBUF 0 20 FILL -> }T
-T{ SEEBUF -> 00 00 00 }T
-
-T{ FBUF 1 20 FILL -> }T
-T{ SEEBUF -> 20 00 00 }T
-
-T{ FBUF 3 20 FILL -> }T
-T{ SEEBUF -> 20 20 20 }T
-
-T{ FBUF FBUF 3 CHARS MOVE -> }T \ BIZARRE SPECIAL CASE
-T{ SEEBUF -> 20 20 20 }T
-
-T{ SBUF FBUF 0 CHARS MOVE -> }T
-T{ SEEBUF -> 20 20 20 }T
-
-T{ SBUF FBUF 1 CHARS MOVE -> }T
-T{ SEEBUF -> 12 20 20 }T
-
-T{ SBUF FBUF 3 CHARS MOVE -> }T
-T{ SEEBUF -> 12 34 56 }T
-
-T{ FBUF FBUF CHAR+ 2 CHARS MOVE -> }T
-T{ SEEBUF -> 12 12 34 }T
-
-T{ FBUF CHAR+ FBUF 2 CHARS MOVE -> }T
-T{ SEEBUF -> 12 34 34 }T
-
-\ ------------------------------------------------------------------------
-TESTING OUTPUT: . ." CR EMIT SPACE SPACES TYPE U.
-
-: OUTPUT-TEST
- ." YOU SHOULD SEE THE STANDARD GRAPHIC CHARACTERS:" CR
- 41 BL DO I EMIT LOOP CR
- 61 41 DO I EMIT LOOP CR
- 7F 61 DO I EMIT LOOP CR
- ." YOU SHOULD SEE 0-9 SEPARATED BY A SPACE:" CR
- 9 1+ 0 DO I . LOOP CR
- ." YOU SHOULD SEE 0-9 (WITH NO SPACES):" CR
- [CHAR] 9 1+ [CHAR] 0 DO I 0 SPACES EMIT LOOP CR
- ." YOU SHOULD SEE A-G SEPARATED BY A SPACE:" CR
- [CHAR] G 1+ [CHAR] A DO I EMIT SPACE LOOP CR
- ." YOU SHOULD SEE 0-5 SEPARATED BY TWO SPACES:" CR
- 5 1+ 0 DO I [CHAR] 0 + EMIT 2 SPACES LOOP CR
- ." YOU SHOULD SEE TWO SEPARATE LINES:" CR
- S" LINE 1" TYPE CR S" LINE 2" TYPE CR
- ." YOU SHOULD SEE THE NUMBER RANGES OF SIGNED AND UNSIGNED NUMBERS:" CR
- ." SIGNED: " MIN-INT . MAX-INT . CR
- ." UNSIGNED: " 0 U. MAX-UINT U. CR
-;
-
-T{ OUTPUT-TEST -> }T
-\ ------------------------------------------------------------------------
-TESTING INPUT: ACCEPT
-
-CREATE ABUF 80 CHARS ALLOT
-
-: ACCEPT-TEST
- CR ." PLEASE TYPE UP TO 80 CHARACTERS:" CR
- ABUF 80 ACCEPT
- CR ." RECEIVED: " [CHAR] " EMIT
- ABUF SWAP TYPE [CHAR] " EMIT CR
-;
-
-T{ ACCEPT-TEST -> }T
-Vingt fois sur le métier remettez votre ouvrage, ...
-\ ------------------------------------------------------------------------
-TESTING DICTIONARY SEARCH RULES
-
-T{ : GDX 123 ; : GDX GDX 234 ; -> }T
-
-T{ GDX -> 123 234 }T
-
-CR .( End of Core word set tests) CR
-
-
-
-RST_STATE ; so ANS_COMPLEMENT_xx_MPY is conserved ;
-\ NOECHO ; if an error occurs, comment this line before new download to find it.
-
-
-\ From: John Hayes S1I
-\ Subject: tester.fr
-\ Date: Mon, 27 Nov 95 13:10:09 PST
-
-\ (C) 1995 JOHNS HOPKINS UNIVERSITY / APPLIED PHYSICS LABORATORY
-\ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS.
-\ VERSION 1.1
-
-\ 22/1/09 The words { and } have been changed to T{ and }T respectively to
-\ agree with the Forth 200X file ttester.fs. This avoids clashes with
-\ locals using { ... } and the FSL use of }
-
-
-\ 13/05/14 jmt. added colorised error messages.
-
-
-
- 0 CONSTANT FALSE
--1 CONSTANT TRUE
-
-\ SET THE FOLLOWING FLAG TO TRUE FOR MORE VERBOSE OUTPUT; THIS MAY
-\ ALLOW YOU TO TELL WHICH TEST CAUSED YOUR SYSTEM TO HANG.
-VARIABLE VERBOSE
- FALSE VERBOSE !
-\ TRUE VERBOSE !
-
-\ : EMPTY-STACK ( ... -- ) \ EMPTY STACK: HANDLES UNDERFLOWED STACK TOO.
-\ DEPTH ?DUP
-\ IF DUP 0< IF NEGATE 0
-\ DO 0 LOOP
-\ ELSE 0 DO DROP LOOP THEN
-\ THEN ;
-\
-\ : ERROR \ ( C-ADDR U -- ) DISPLAY AN ERROR MESSAGE FOLLOWED BY
-\ \ THE LINE THAT HAD THE ERROR.
-\ TYPE SOURCE TYPE CR \ DISPLAY LINE CORRESPONDING TO ERROR
-\ EMPTY-STACK \ THROW AWAY EVERY THING ELSE
-\ QUIT \ *** Uncomment this line to QUIT on an error
-\ ;
-
-VARIABLE ACTUAL-DEPTH \ STACK RECORD
-CREATE ACTUAL-RESULTS 20 CELLS ALLOT
-
-: T{ \ ( -- ) SYNTACTIC SUGAR.
- ;
-
-: -> \ ( ... -- ) RECORD DEPTH AND CONTENT OF STACK.
- DEPTH DUP ACTUAL-DEPTH ! \ RECORD DEPTH
- ?DUP IF \ IF THERE IS SOMETHING ON STACK
- 0 DO ACTUAL-RESULTS I CELLS + ! LOOP \ SAVE THEM
- THEN ;
-
-: }T \ ( ... -- ) COMPARE STACK (EXPECTED) CONTENTS WITH SAVED
- \ (ACTUAL) CONTENTS.
- DEPTH ACTUAL-DEPTH @ = IF \ IF DEPTHS MATCH
- DEPTH ?DUP IF \ IF THERE IS SOMETHING ON THE STACK
- 0 DO \ FOR EACH STACK ITEM
- ACTUAL-RESULTS I CELLS + @ \ COMPARE ACTUAL WITH EXPECTED
-\ = 0= IF S" INCORRECT RESULT: " ERROR LEAVE THEN \ jmt
- = 0= IF ABORT" INCORRECT RESULT: " THEN \ jmt : colorised message
- LOOP
- THEN
- ELSE \ DEPTH MISMATCH
-\ S" WRONG NUMBER OF RESULTS: " ERROR \ jmt
- ABORT" WRONG NUMBER OF RESULTS: " \ jmt : colorised message
- THEN ;
-
-: TESTING \ ( -- ) TALKING COMMENT.
- SOURCE VERBOSE @
- IF DUP >R TYPE CR R> >IN !
- ELSE >IN ! DROP [CHAR] * EMIT
- THEN ;
-
-\ From: John Hayes S1I
-\ Subject: core.fr
-\ Date: Mon, 27 Nov 95 13:10
-
-\ (C) 1995 JOHNS HOPKINS UNIVERSITY / APPLIED PHYSICS LABORATORY
-\ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS.
-\ VERSION 1.2
-\ THIS PROGRAM TESTS THE CORE WORDS OF AN ANS FORTH SYSTEM.
-\ THE PROGRAM ASSUMES A TWO'S COMPLEMENT IMPLEMENTATION WHERE
-\ THE RANGE OF SIGNED NUMBERS IS -2^(N-1) ... 2^(N-1)-1 AND
-\ THE RANGE OF UNSIGNED NUMBERS IS 0 ... 2^(N)-1.
-\ I HAVEN'T FIGURED OUT HOW TO TEST KEY, QUIT, ABORT, OR ABORT"...
-\ I ALSO HAVEN'T THOUGHT OF A WAY TO TEST ENVIRONMENT?...
-
-CR
-TESTING CORE WORDS
-HEX
-
-\ ------------------------------------------------------------------------
-TESTING BASIC ASSUMPTIONS
-
-T{ -> }T \ START WITH CLEAN SLATE
-( TEST IF ANY BITS ARE SET; ANSWER IN BASE 1 )
-T{ : BITSSET? IF 0 0 ELSE 0 THEN ; -> }T
-T{ 0 BITSSET? -> 0 }T ( ZERO IS ALL BITS CLEAR )
-T{ 1 BITSSET? -> 0 0 }T ( OTHER NUMBER HAVE AT LEAST ONE BIT )
-T{ -1 BITSSET? -> 0 0 }T
-
-\ ------------------------------------------------------------------------
-TESTING BOOLEANS: INVERT AND OR XOR
-
-T{ 0 0 AND -> 0 }T
-T{ 0 1 AND -> 0 }T
-T{ 1 0 AND -> 0 }T
-T{ 1 1 AND -> 1 }T
-
-T{ 0 INVERT 1 AND -> 1 }T
-T{ 1 INVERT 1 AND -> 0 }T
-
-0 CONSTANT 0S
-0 INVERT CONSTANT 1S
-
-T{ 0S INVERT -> 1S }T
-T{ 1S INVERT -> 0S }T
-
-T{ 0S 0S AND -> 0S }T
-T{ 0S 1S AND -> 0S }T
-T{ 1S 0S AND -> 0S }T
-T{ 1S 1S AND -> 1S }T
-
-T{ 0S 0S OR -> 0S }T
-T{ 0S 1S OR -> 1S }T
-T{ 1S 0S OR -> 1S }T
-T{ 1S 1S OR -> 1S }T
-
-T{ 0S 0S XOR -> 0S }T
-T{ 0S 1S XOR -> 1S }T
-T{ 1S 0S XOR -> 1S }T
-T{ 1S 1S XOR -> 0S }T
-
-\ ------------------------------------------------------------------------
-TESTING 2* 2/ LSHIFT RSHIFT
-
-( WE TRUST 1S, INVERT, AND BITSSET?; WE WILL CONFIRM RSHIFT LATER )
-1S 1 RSHIFT INVERT CONSTANT MSB
-T{ MSB BITSSET? -> 0 0 }T
-
-T{ 0S 2* -> 0S }T
-T{ 1 2* -> 2 }T
-T{ 4000 2* -> 8000 }T
-T{ 1S 2* 1 XOR -> 1S }T
-T{ MSB 2* -> 0S }T
-
-T{ 0S 2/ -> 0S }T
-T{ 1 2/ -> 0 }T
-T{ 4000 2/ -> 2000 }T
-T{ 1S 2/ -> 1S }T \ MSB PROPOGATED
-T{ 1S 1 XOR 2/ -> 1S }T
-T{ MSB 2/ MSB AND -> MSB }T
-
-T{ 1 0 LSHIFT -> 1 }T
-T{ 1 1 LSHIFT -> 2 }T
-T{ 1 2 LSHIFT -> 4 }T
-T{ 1 F LSHIFT -> 8000 }T \ BIGGEST GUARANTEED SHIFT
-T{ 1S 1 LSHIFT 1 XOR -> 1S }T
-T{ MSB 1 LSHIFT -> 0 }T
-
-T{ 1 0 RSHIFT -> 1 }T
-T{ 1 1 RSHIFT -> 0 }T
-T{ 2 1 RSHIFT -> 1 }T
-T{ 4 2 RSHIFT -> 1 }T
-T{ 8000 F RSHIFT -> 1 }T \ BIGGEST
-T{ MSB 1 RSHIFT MSB AND -> 0 }T \ RSHIFT ZERO FILLS MSBS
-T{ MSB 1 RSHIFT 2* -> MSB }T
-
-\ ------------------------------------------------------------------------
-TESTING COMPARISONS: 0= = 0< < > U< MIN MAX
-0 INVERT CONSTANT MAX-UINT
-0 INVERT 1 RSHIFT CONSTANT MAX-INT
-0 INVERT 1 RSHIFT INVERT CONSTANT MIN-INT
-0 INVERT 1 RSHIFT CONSTANT MID-UINT
-0 INVERT 1 RSHIFT INVERT CONSTANT MID-UINT+1
-
-0S CONSTANT <FALSE>
-1S CONSTANT <TRUE>
-
-T{ 0 0= -> <TRUE> }T
-T{ 1 0= -> <FALSE> }T
-T{ 2 0= -> <FALSE> }T
-T{ -1 0= -> <FALSE> }T
-T{ MAX-UINT 0= -> <FALSE> }T
-T{ MIN-INT 0= -> <FALSE> }T
-T{ MAX-INT 0= -> <FALSE> }T
-
-T{ 0 0 = -> <TRUE> }T
-T{ 1 1 = -> <TRUE> }T
-T{ -1 -1 = -> <TRUE> }T
-T{ 1 0 = -> <FALSE> }T
-T{ -1 0 = -> <FALSE> }T
-T{ 0 1 = -> <FALSE> }T
-T{ 0 -1 = -> <FALSE> }T
-
-T{ 0 0< -> <FALSE> }T
-T{ -1 0< -> <TRUE> }T
-T{ MIN-INT 0< -> <TRUE> }T
-T{ 1 0< -> <FALSE> }T
-T{ MAX-INT 0< -> <FALSE> }T
-
-T{ 0 1 < -> <TRUE> }T
-T{ 1 2 < -> <TRUE> }T
-T{ -1 0 < -> <TRUE> }T
-T{ -1 1 < -> <TRUE> }T
-T{ MIN-INT 0 < -> <TRUE> }T
-T{ MIN-INT MAX-INT < -> <TRUE> }T
-T{ 0 MAX-INT < -> <TRUE> }T
-T{ 0 0 < -> <FALSE> }T
-T{ 1 1 < -> <FALSE> }T
-T{ 1 0 < -> <FALSE> }T
-T{ 2 1 < -> <FALSE> }T
-T{ 0 -1 < -> <FALSE> }T
-T{ 1 -1 < -> <FALSE> }T
-T{ 0 MIN-INT < -> <FALSE> }T
-T{ MAX-INT MIN-INT < -> <FALSE> }T
-T{ MAX-INT 0 < -> <FALSE> }T
-
-T{ 0 1 > -> <FALSE> }T
-T{ 1 2 > -> <FALSE> }T
-T{ -1 0 > -> <FALSE> }T
-T{ -1 1 > -> <FALSE> }T
-T{ MIN-INT 0 > -> <FALSE> }T
-T{ MIN-INT MAX-INT > -> <FALSE> }T
-T{ 0 MAX-INT > -> <FALSE> }T
-T{ 0 0 > -> <FALSE> }T
-T{ 1 1 > -> <FALSE> }T
-T{ 1 0 > -> <TRUE> }T
-T{ 2 1 > -> <TRUE> }T
-T{ 0 -1 > -> <TRUE> }T
-T{ 1 -1 > -> <TRUE> }T
-T{ 0 MIN-INT > -> <TRUE> }T
-T{ MAX-INT MIN-INT > -> <TRUE> }T
-T{ MAX-INT 0 > -> <TRUE> }T
-
-T{ 0 1 U< -> <TRUE> }T
-T{ 1 2 U< -> <TRUE> }T
-T{ 0 MID-UINT U< -> <TRUE> }T
-T{ 0 MAX-UINT U< -> <TRUE> }T
-T{ MID-UINT MAX-UINT U< -> <TRUE> }T
-T{ 0 0 U< -> <FALSE> }T
-T{ 1 1 U< -> <FALSE> }T
-T{ 1 0 U< -> <FALSE> }T
-T{ 2 1 U< -> <FALSE> }T
-T{ MID-UINT 0 U< -> <FALSE> }T
-T{ MAX-UINT 0 U< -> <FALSE> }T
-T{ MAX-UINT MID-UINT U< -> <FALSE> }T
-
-T{ 0 1 MIN -> 0 }T
-T{ 1 2 MIN -> 1 }T
-T{ -1 0 MIN -> -1 }T
-T{ -1 1 MIN -> -1 }T
-T{ MIN-INT 0 MIN -> MIN-INT }T
-T{ MIN-INT MAX-INT MIN -> MIN-INT }T
-T{ 0 MAX-INT MIN -> 0 }T
-T{ 0 0 MIN -> 0 }T
-T{ 1 1 MIN -> 1 }T
-T{ 1 0 MIN -> 0 }T
-T{ 2 1 MIN -> 1 }T
-T{ 0 -1 MIN -> -1 }T
-T{ 1 -1 MIN -> -1 }T
-T{ 0 MIN-INT MIN -> MIN-INT }T
-T{ MAX-INT MIN-INT MIN -> MIN-INT }T
-T{ MAX-INT 0 MIN -> 0 }T
-
-T{ 0 1 MAX -> 1 }T
-T{ 1 2 MAX -> 2 }T
-T{ -1 0 MAX -> 0 }T
-T{ -1 1 MAX -> 1 }T
-T{ MIN-INT 0 MAX -> 0 }T
-T{ MIN-INT MAX-INT MAX -> MAX-INT }T
-T{ 0 MAX-INT MAX -> MAX-INT }T
-T{ 0 0 MAX -> 0 }T
-T{ 1 1 MAX -> 1 }T
-T{ 1 0 MAX -> 1 }T
-T{ 2 1 MAX -> 2 }T
-T{ 0 -1 MAX -> 0 }T
-T{ 1 -1 MAX -> 1 }T
-T{ 0 MIN-INT MAX -> 0 }T
-T{ MAX-INT MIN-INT MAX -> MAX-INT }T
-T{ MAX-INT 0 MAX -> MAX-INT }T
-
-\ ------------------------------------------------------------------------
-TESTING STACK OPS: 2DROP 2DUP 2OVER 2SWAP ?DUP DEPTH DROP DUP OVER ROT SWAP
-
-T{ 1 2 2DROP -> }T
-T{ 1 2 2DUP -> 1 2 1 2 }T
-T{ 1 2 3 4 2OVER -> 1 2 3 4 1 2 }T
-T{ 1 2 3 4 2SWAP -> 3 4 1 2 }T
-T{ 0 ?DUP -> 0 }T
-T{ 1 ?DUP -> 1 1 }T
-T{ -1 ?DUP -> -1 -1 }T
-T{ DEPTH -> 0 }T
-T{ 0 DEPTH -> 0 1 }T
-T{ 0 1 DEPTH -> 0 1 2 }T
-T{ 0 DROP -> }T
-T{ 1 2 DROP -> 1 }T
-T{ 1 DUP -> 1 1 }T
-T{ 1 2 OVER -> 1 2 1 }T
-T{ 1 2 3 ROT -> 2 3 1 }T
-T{ 1 2 SWAP -> 2 1 }T
-
-\ ------------------------------------------------------------------------
-TESTING >R R> R@
-
-T{ : GR1 >R R> ; -> }T
-T{ : GR2 >R R@ R> DROP ; -> }T
-T{ 123 GR1 -> 123 }T
-T{ 123 GR2 -> 123 }T
-T{ 1S GR1 -> 1S }T ( RETURN STACK HOLDS CELLS )
-
-\ ------------------------------------------------------------------------
-TESTING ADD/SUBTRACT: + - 1+ 1- ABS NEGATE
-
-T{ 0 5 + -> 5 }T
-T{ 5 0 + -> 5 }T
-T{ 0 -5 + -> -5 }T
-T{ -5 0 + -> -5 }T
-T{ 1 2 + -> 3 }T
-T{ 1 -2 + -> -1 }T
-T{ -1 2 + -> 1 }T
-T{ -1 -2 + -> -3 }T
-T{ -1 1 + -> 0 }T
-T{ MID-UINT 1 + -> MID-UINT+1 }T
-
-T{ 0 5 - -> -5 }T
-T{ 5 0 - -> 5 }T
-T{ 0 -5 - -> 5 }T
-T{ -5 0 - -> -5 }T
-T{ 1 2 - -> -1 }T
-T{ 1 -2 - -> 3 }T
-T{ -1 2 - -> -3 }T
-T{ -1 -2 - -> 1 }T
-T{ 0 1 - -> -1 }T
-T{ MID-UINT+1 1 - -> MID-UINT }T
-
-T{ 0 1+ -> 1 }T
-T{ -1 1+ -> 0 }T
-T{ 1 1+ -> 2 }T
-T{ MID-UINT 1+ -> MID-UINT+1 }T
-
-T{ 2 1- -> 1 }T
-T{ 1 1- -> 0 }T
-T{ 0 1- -> -1 }T
-T{ MID-UINT+1 1- -> MID-UINT }T
-
-T{ 0 NEGATE -> 0 }T
-T{ 1 NEGATE -> -1 }T
-T{ -1 NEGATE -> 1 }T
-T{ 2 NEGATE -> -2 }T
-T{ -2 NEGATE -> 2 }T
-
-T{ 0 ABS -> 0 }T
-T{ 1 ABS -> 1 }T
-T{ -1 ABS -> 1 }T
-T{ MIN-INT ABS -> MID-UINT+1 }T
-
-\ ------------------------------------------------------------------------
-TESTING MULTIPLY: S>D * M* UM*
-
-T{ 0 S>D -> 0 0 }T
-T{ 1 S>D -> 1 0 }T
-T{ 2 S>D -> 2 0 }T
-T{ -1 S>D -> -1 -1 }T
-T{ -2 S>D -> -2 -1 }T
-T{ MIN-INT S>D -> MIN-INT -1 }T
-T{ MAX-INT S>D -> MAX-INT 0 }T
-
-T{ 0 0 M* -> 0 S>D }T
-T{ 0 1 M* -> 0 S>D }T
-T{ 1 0 M* -> 0 S>D }T
-T{ 1 2 M* -> 2 S>D }T
-T{ 2 1 M* -> 2 S>D }T
-T{ 3 3 M* -> 9 S>D }T
-T{ -3 3 M* -> -9 S>D }T
-T{ 3 -3 M* -> -9 S>D }T
-T{ -3 -3 M* -> 9 S>D }T
-T{ 0 MIN-INT M* -> 0 S>D }T
-T{ 1 MIN-INT M* -> MIN-INT S>D }T
-T{ 2 MIN-INT M* -> 0 1S }T
-T{ 0 MAX-INT M* -> 0 S>D }T
-T{ 1 MAX-INT M* -> MAX-INT S>D }T
-T{ 2 MAX-INT M* -> MAX-INT 1 LSHIFT 0 }T
-T{ MIN-INT MIN-INT M* -> 0 MSB 1 RSHIFT }T
-T{ MAX-INT MIN-INT M* -> MSB MSB 2/ }T
-T{ MAX-INT MAX-INT M* -> 1 MSB 2/ INVERT }T
-
-T{ 0 0 * -> 0 }T \ TEST IDENTITIES
-T{ 0 1 * -> 0 }T
-T{ 1 0 * -> 0 }T
-T{ 1 2 * -> 2 }T
-T{ 2 1 * -> 2 }T
-T{ 3 3 * -> 9 }T
-T{ -3 3 * -> -9 }T
-T{ 3 -3 * -> -9 }T
-T{ -3 -3 * -> 9 }T
-
-T{ MID-UINT+1 1 RSHIFT 2 * -> MID-UINT+1 }T
-T{ MID-UINT+1 2 RSHIFT 4 * -> MID-UINT+1 }T
-T{ MID-UINT+1 1 RSHIFT MID-UINT+1 OR 2 * -> MID-UINT+1 }T
-
-T{ 0 0 UM* -> 0 0 }T
-T{ 0 1 UM* -> 0 0 }T
-T{ 1 0 UM* -> 0 0 }T
-T{ 1 2 UM* -> 2 0 }T
-T{ 2 1 UM* -> 2 0 }T
-T{ 3 3 UM* -> 9 0 }T
-
-T{ MID-UINT+1 1 RSHIFT 2 UM* -> MID-UINT+1 0 }T
-T{ MID-UINT+1 2 UM* -> 0 1 }T
-T{ MID-UINT+1 4 UM* -> 0 2 }T
-T{ 1S 2 UM* -> 1S 1 LSHIFT 1 }T
-T{ MAX-UINT MAX-UINT UM* -> 1 1 INVERT }T
-
-\ ------------------------------------------------------------------------
-TESTING DIVIDE: FM/MOD SM/REM UM/MOD */ */MOD / /MOD MOD
-
-T{ 0 S>D 1 FM/MOD -> 0 0 }T
-T{ 1 S>D 1 FM/MOD -> 0 1 }T
-T{ 2 S>D 1 FM/MOD -> 0 2 }T
-T{ -1 S>D 1 FM/MOD -> 0 -1 }T
-T{ -2 S>D 1 FM/MOD -> 0 -2 }T
-T{ 0 S>D -1 FM/MOD -> 0 0 }T
-T{ 1 S>D -1 FM/MOD -> 0 -1 }T
-T{ 2 S>D -1 FM/MOD -> 0 -2 }T
-T{ -1 S>D -1 FM/MOD -> 0 1 }T
-T{ -2 S>D -1 FM/MOD -> 0 2 }T
-T{ 2 S>D 2 FM/MOD -> 0 1 }T
-T{ -1 S>D -1 FM/MOD -> 0 1 }T
-T{ -2 S>D -2 FM/MOD -> 0 1 }T
-T{ 7 S>D 3 FM/MOD -> 1 2 }T
-T{ 7 S>D -3 FM/MOD -> -2 -3 }T
-T{ -7 S>D 3 FM/MOD -> 2 -3 }T
-T{ -7 S>D -3 FM/MOD -> -1 2 }T
-T{ MAX-INT S>D 1 FM/MOD -> 0 MAX-INT }T
-T{ MIN-INT S>D 1 FM/MOD -> 0 MIN-INT }T
-T{ MAX-INT S>D MAX-INT FM/MOD -> 0 1 }T
-T{ MIN-INT S>D MIN-INT FM/MOD -> 0 1 }T
-T{ 1S 1 4 FM/MOD -> 3 MAX-INT }T
-T{ 1 MIN-INT M* 1 FM/MOD -> 0 MIN-INT }T
-T{ 1 MIN-INT M* MIN-INT FM/MOD -> 0 1 }T
-T{ 2 MIN-INT M* 2 FM/MOD -> 0 MIN-INT }T
-T{ 2 MIN-INT M* MIN-INT FM/MOD -> 0 2 }T
-T{ 1 MAX-INT M* 1 FM/MOD -> 0 MAX-INT }T
-T{ 1 MAX-INT M* MAX-INT FM/MOD -> 0 1 }T
-T{ 2 MAX-INT M* 2 FM/MOD -> 0 MAX-INT }T
-T{ 2 MAX-INT M* MAX-INT FM/MOD -> 0 2 }T
-T{ MIN-INT MIN-INT M* MIN-INT FM/MOD -> 0 MIN-INT }T
-T{ MIN-INT MAX-INT M* MIN-INT FM/MOD -> 0 MAX-INT }T
-T{ MIN-INT MAX-INT M* MAX-INT FM/MOD -> 0 MIN-INT }T
-T{ MAX-INT MAX-INT M* MAX-INT FM/MOD -> 0 MAX-INT }T
-
-T{ 0 S>D 1 SM/REM -> 0 0 }T
-T{ 1 S>D 1 SM/REM -> 0 1 }T
-T{ 2 S>D 1 SM/REM -> 0 2 }T
-T{ -1 S>D 1 SM/REM -> 0 -1 }T
-T{ -2 S>D 1 SM/REM -> 0 -2 }T
-T{ 0 S>D -1 SM/REM -> 0 0 }T
-T{ 1 S>D -1 SM/REM -> 0 -1 }T
-T{ 2 S>D -1 SM/REM -> 0 -2 }T
-T{ -1 S>D -1 SM/REM -> 0 1 }T
-T{ -2 S>D -1 SM/REM -> 0 2 }T
-T{ 2 S>D 2 SM/REM -> 0 1 }T
-T{ -1 S>D -1 SM/REM -> 0 1 }T
-T{ -2 S>D -2 SM/REM -> 0 1 }T
-T{ 7 S>D 3 SM/REM -> 1 2 }T
-T{ 7 S>D -3 SM/REM -> 1 -2 }T
-T{ -7 S>D 3 SM/REM -> -1 -2 }T
-T{ -7 S>D -3 SM/REM -> -1 2 }T
-T{ MAX-INT S>D 1 SM/REM -> 0 MAX-INT }T
-T{ MIN-INT S>D 1 SM/REM -> 0 MIN-INT }T
-T{ MAX-INT S>D MAX-INT SM/REM -> 0 1 }T
-T{ MIN-INT S>D MIN-INT SM/REM -> 0 1 }T
-T{ 1S 1 4 SM/REM -> 3 MAX-INT }T
-T{ 2 MIN-INT M* 2 SM/REM -> 0 MIN-INT }T
-T{ 2 MIN-INT M* MIN-INT SM/REM -> 0 2 }T
-T{ 2 MAX-INT M* 2 SM/REM -> 0 MAX-INT }T
-T{ 2 MAX-INT M* MAX-INT SM/REM -> 0 2 }T
-T{ MIN-INT MIN-INT M* MIN-INT SM/REM -> 0 MIN-INT }T
-T{ MIN-INT MAX-INT M* MIN-INT SM/REM -> 0 MAX-INT }T
-T{ MIN-INT MAX-INT M* MAX-INT SM/REM -> 0 MIN-INT }T
-T{ MAX-INT MAX-INT M* MAX-INT SM/REM -> 0 MAX-INT }T
-
-T{ 0 0 1 UM/MOD -> 0 0 }T
-T{ 1 0 1 UM/MOD -> 0 1 }T
-T{ 1 0 2 UM/MOD -> 1 0 }T
-T{ 3 0 2 UM/MOD -> 1 1 }T
-T{ MAX-UINT 2 UM* 2 UM/MOD -> 0 MAX-UINT }T
-T{ MAX-UINT 2 UM* MAX-UINT UM/MOD -> 0 2 }T
-T{ MAX-UINT MAX-UINT UM* MAX-UINT UM/MOD -> 0 MAX-UINT }T
-
-: IFFLOORED
- [ -3 2 / -2 = INVERT ] LITERAL IF POSTPONE \ THEN ;
-
-: IFSYM
- [ -3 2 / -1 = INVERT ] LITERAL IF POSTPONE \ THEN ;
-
-\ THE SYSTEM MIGHT DO EITHER FLOORED OR SYMMETRIC DIVISION.
-\ SINCE WE HAVE ALREADY TESTED M*, FM/MOD, AND SM/REM WE CAN USE THEM IN TEST.
-
-IFFLOORED : T/MOD >R S>D R> FM/MOD ;
-IFFLOORED : T/ T/MOD SWAP DROP ;
-IFFLOORED : TMOD T/MOD DROP ;
-IFFLOORED : T*/MOD >R M* R> FM/MOD ;
-IFFLOORED : T*/ T*/MOD SWAP DROP ;
-IFSYM : T/MOD >R S>D R> SM/REM ;
-IFSYM : T/ T/MOD SWAP DROP ;
-IFSYM : TMOD T/MOD DROP ;
-IFSYM : T*/MOD >R M* R> SM/REM ;
-IFSYM : T*/ T*/MOD SWAP DROP ;
-
-T{ 0 1 /MOD -> 0 1 T/MOD }T
-T{ 1 1 /MOD -> 1 1 T/MOD }T
-T{ 2 1 /MOD -> 2 1 T/MOD }T
-T{ -1 1 /MOD -> -1 1 T/MOD }T
-T{ -2 1 /MOD -> -2 1 T/MOD }T
-T{ 0 -1 /MOD -> 0 -1 T/MOD }T
-T{ 1 -1 /MOD -> 1 -1 T/MOD }T
-T{ 2 -1 /MOD -> 2 -1 T/MOD }T
-T{ -1 -1 /MOD -> -1 -1 T/MOD }T
-T{ -2 -1 /MOD -> -2 -1 T/MOD }T
-T{ 2 2 /MOD -> 2 2 T/MOD }T
-T{ -1 -1 /MOD -> -1 -1 T/MOD }T
-T{ -2 -2 /MOD -> -2 -2 T/MOD }T
-T{ 7 3 /MOD -> 7 3 T/MOD }T
-T{ 7 -3 /MOD -> 7 -3 T/MOD }T
-T{ -7 3 /MOD -> -7 3 T/MOD }T
-T{ -7 -3 /MOD -> -7 -3 T/MOD }T
-T{ MAX-INT 1 /MOD -> MAX-INT 1 T/MOD }T
-T{ MIN-INT 1 /MOD -> MIN-INT 1 T/MOD }T
-T{ MAX-INT MAX-INT /MOD -> MAX-INT MAX-INT T/MOD }T
-T{ MIN-INT MIN-INT /MOD -> MIN-INT MIN-INT T/MOD }T
-
-T{ 0 1 / -> 0 1 T/ }T
-T{ 1 1 / -> 1 1 T/ }T
-T{ 2 1 / -> 2 1 T/ }T
-T{ -1 1 / -> -1 1 T/ }T
-T{ -2 1 / -> -2 1 T/ }T
-T{ 0 -1 / -> 0 -1 T/ }T
-T{ 1 -1 / -> 1 -1 T/ }T
-T{ 2 -1 / -> 2 -1 T/ }T
-T{ -1 -1 / -> -1 -1 T/ }T
-T{ -2 -1 / -> -2 -1 T/ }T
-T{ 2 2 / -> 2 2 T/ }T
-T{ -1 -1 / -> -1 -1 T/ }T
-T{ -2 -2 / -> -2 -2 T/ }T
-T{ 7 3 / -> 7 3 T/ }T
-T{ 7 -3 / -> 7 -3 T/ }T
-T{ -7 3 / -> -7 3 T/ }T
-T{ -7 -3 / -> -7 -3 T/ }T
-T{ MAX-INT 1 / -> MAX-INT 1 T/ }T
-T{ MIN-INT 1 / -> MIN-INT 1 T/ }T
-T{ MAX-INT MAX-INT / -> MAX-INT MAX-INT T/ }T
-T{ MIN-INT MIN-INT / -> MIN-INT MIN-INT T/ }T
-
-T{ 0 1 MOD -> 0 1 TMOD }T
-T{ 1 1 MOD -> 1 1 TMOD }T
-T{ 2 1 MOD -> 2 1 TMOD }T
-T{ -1 1 MOD -> -1 1 TMOD }T
-T{ -2 1 MOD -> -2 1 TMOD }T
-T{ 0 -1 MOD -> 0 -1 TMOD }T
-T{ 1 -1 MOD -> 1 -1 TMOD }T
-T{ 2 -1 MOD -> 2 -1 TMOD }T
-T{ -1 -1 MOD -> -1 -1 TMOD }T
-T{ -2 -1 MOD -> -2 -1 TMOD }T
-T{ 2 2 MOD -> 2 2 TMOD }T
-T{ -1 -1 MOD -> -1 -1 TMOD }T
-T{ -2 -2 MOD -> -2 -2 TMOD }T
-T{ 7 3 MOD -> 7 3 TMOD }T
-T{ 7 -3 MOD -> 7 -3 TMOD }T
-T{ -7 3 MOD -> -7 3 TMOD }T
-T{ -7 -3 MOD -> -7 -3 TMOD }T
-T{ MAX-INT 1 MOD -> MAX-INT 1 TMOD }T
-T{ MIN-INT 1 MOD -> MIN-INT 1 TMOD }T
-T{ MAX-INT MAX-INT MOD -> MAX-INT MAX-INT TMOD }T
-T{ MIN-INT MIN-INT MOD -> MIN-INT MIN-INT TMOD }T
-
-T{ 0 2 1 */ -> 0 2 1 T*/ }T
-T{ 1 2 1 */ -> 1 2 1 T*/ }T
-T{ 2 2 1 */ -> 2 2 1 T*/ }T
-T{ -1 2 1 */ -> -1 2 1 T*/ }T
-T{ -2 2 1 */ -> -2 2 1 T*/ }T
-T{ 0 2 -1 */ -> 0 2 -1 T*/ }T
-T{ 1 2 -1 */ -> 1 2 -1 T*/ }T
-T{ 2 2 -1 */ -> 2 2 -1 T*/ }T
-T{ -1 2 -1 */ -> -1 2 -1 T*/ }T
-T{ -2 2 -1 */ -> -2 2 -1 T*/ }T
-T{ 2 2 2 */ -> 2 2 2 T*/ }T
-T{ -1 2 -1 */ -> -1 2 -1 T*/ }T
-T{ -2 2 -2 */ -> -2 2 -2 T*/ }T
-T{ 7 2 3 */ -> 7 2 3 T*/ }T
-T{ 7 2 -3 */ -> 7 2 -3 T*/ }T
-T{ -7 2 3 */ -> -7 2 3 T*/ }T
-T{ -7 2 -3 */ -> -7 2 -3 T*/ }T
-T{ MAX-INT 2 MAX-INT */ -> MAX-INT 2 MAX-INT T*/ }T
-T{ MIN-INT 2 MIN-INT */ -> MIN-INT 2 MIN-INT T*/ }T
-
-T{ 0 2 1 */MOD -> 0 2 1 T*/MOD }T
-T{ 1 2 1 */MOD -> 1 2 1 T*/MOD }T
-T{ 2 2 1 */MOD -> 2 2 1 T*/MOD }T
-T{ -1 2 1 */MOD -> -1 2 1 T*/MOD }T
-T{ -2 2 1 */MOD -> -2 2 1 T*/MOD }T
-T{ 0 2 -1 */MOD -> 0 2 -1 T*/MOD }T
-T{ 1 2 -1 */MOD -> 1 2 -1 T*/MOD }T
-T{ 2 2 -1 */MOD -> 2 2 -1 T*/MOD }T
-T{ -1 2 -1 */MOD -> -1 2 -1 T*/MOD }T
-T{ -2 2 -1 */MOD -> -2 2 -1 T*/MOD }T
-T{ 2 2 2 */MOD -> 2 2 2 T*/MOD }T
-T{ -1 2 -1 */MOD -> -1 2 -1 T*/MOD }T
-T{ -2 2 -2 */MOD -> -2 2 -2 T*/MOD }T
-T{ 7 2 3 */MOD -> 7 2 3 T*/MOD }T
-T{ 7 2 -3 */MOD -> 7 2 -3 T*/MOD }T
-T{ -7 2 3 */MOD -> -7 2 3 T*/MOD }T
-T{ -7 2 -3 */MOD -> -7 2 -3 T*/MOD }T
-T{ MAX-INT 2 MAX-INT */MOD -> MAX-INT 2 MAX-INT T*/MOD }T
-T{ MIN-INT 2 MIN-INT */MOD -> MIN-INT 2 MIN-INT T*/MOD }T
-
-\ ------------------------------------------------------------------------
-TESTING HERE , @ ! CELL+ CELLS C, C@ C! CHARS 2@ 2! ALIGN ALIGNED +! ALLOT
-
-HERE 1 ALLOT
-HERE
-CONSTANT 2NDA
-CONSTANT 1STA
-T{ 1STA 2NDA U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT
-T{ 1STA 1+ -> 2NDA }T \ ... BY ONE ADDRESS UNIT
-( MISSING TEST: NEGATIVE ALLOT )
-
-HERE 1 ,
-HERE 2 ,
-CONSTANT 2ND
-CONSTANT 1ST
-T{ 1ST 2ND U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT
-T{ 1ST CELL+ -> 2ND }T \ ... BY ONE CELL
-T{ 1ST 1 CELLS + -> 2ND }T
-T{ 1ST @ 2ND @ -> 1 2 }T
-T{ 5 1ST ! -> }T
-T{ 1ST @ 2ND @ -> 5 2 }T
-T{ 6 2ND ! -> }T
-T{ 1ST @ 2ND @ -> 5 6 }T
-T{ 1ST 2@ -> 6 5 }T
-T{ 2 1 1ST 2! -> }T
-T{ 1ST 2@ -> 2 1 }T
-T{ 1S 1ST ! 1ST @ -> 1S }T \ CAN STORE CELL-WIDE VALUE
-
-HERE 1 C,
-HERE 2 C,
-CONSTANT 2NDC
-CONSTANT 1STC
-T{ 1STC 2NDC U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT
-T{ 1STC CHAR+ -> 2NDC }T \ ... BY ONE CHAR
-T{ 1STC 1 CHARS + -> 2NDC }T
-T{ 1STC C@ 2NDC C@ -> 1 2 }T
-T{ 3 1STC C! -> }T
-T{ 1STC C@ 2NDC C@ -> 3 2 }T
-T{ 4 2NDC C! -> }T
-T{ 1STC C@ 2NDC C@ -> 3 4 }T
-
-ALIGN 1 ALLOT HERE ALIGN HERE 3 CELLS ALLOT
-CONSTANT A-ADDR CONSTANT UA-ADDR
-T{ UA-ADDR ALIGNED -> A-ADDR }T
-T{ 1 A-ADDR C! A-ADDR C@ -> 1 }T
-T{ 1234 A-ADDR ! A-ADDR @ -> 1234 }T
-T{ 123 456 A-ADDR 2! A-ADDR 2@ -> 123 456 }T
-T{ 2 A-ADDR CHAR+ C! A-ADDR CHAR+ C@ -> 2 }T
-T{ 3 A-ADDR CELL+ C! A-ADDR CELL+ C@ -> 3 }T
-T{ 1234 A-ADDR CELL+ ! A-ADDR CELL+ @ -> 1234 }T
-T{ 123 456 A-ADDR CELL+ 2! A-ADDR CELL+ 2@ -> 123 456 }T
-
-: BITS ( X -- U )
- 0 SWAP BEGIN DUP WHILE DUP MSB AND IF >R 1+ R> THEN 2* REPEAT DROP ;
-( CHARACTERS >= 1 AU, <= SIZE OF CELL, >= 8 BITS )
-T{ 1 CHARS 1 < -> <FALSE> }T
-T{ 1 CHARS 1 CELLS > -> <FALSE> }T
-( TBD: HOW TO FIND NUMBER OF BITS? )
-
-( CELLS >= 1 AU, INTEGRAL MULTIPLE OF CHAR SIZE, >= 16 BITS )
-T{ 1 CELLS 1 < -> <FALSE> }T
-T{ 1 CELLS 1 CHARS MOD -> 0 }T
-T{ 1S BITS 10 < -> <FALSE> }T
-
-T{ 0 1ST ! -> }T
-T{ 1 1ST +! -> }T
-T{ 1ST @ -> 1 }T
-T{ -1 1ST +! 1ST @ -> 0 }T
-
-\ ------------------------------------------------------------------------
-TESTING CHAR [CHAR] [ ] BL S"
-
-T{ BL -> 20 }T
-T{ CHAR X -> 58 }T
-T{ CHAR HELLO -> 48 }T
-T{ : GC1 [CHAR] X ; -> }T
-T{ : GC2 [CHAR] HELLO ; -> }T
-T{ GC1 -> 58 }T
-T{ GC2 -> 48 }T
-T{ : GC3 [ GC1 ] LITERAL ; -> }T
-T{ GC3 -> 58 }T
-T{ : GC4 S" XY" ; -> }T
-T{ GC4 SWAP DROP -> 2 }T
-T{ GC4 DROP DUP C@ SWAP CHAR+ C@ -> 58 59 }T
-
-\ ------------------------------------------------------------------------
-TESTING ' ['] FIND EXECUTE IMMEDIATE COUNT LITERAL POSTPONE STATE
-
-T{ : GT1 123 ; -> }T
-T{ ' GT1 EXECUTE -> 123 }T
-T{ : GT2 ['] GT1 ; IMMEDIATE -> }T
-T{ GT2 EXECUTE -> 123 }T
-HERE 3 C, CHAR G C, CHAR T C, CHAR 1 C, CONSTANT GT1STRING
-HERE 3 C, CHAR G C, CHAR T C, CHAR 2 C, CONSTANT GT2STRING
-T{ GT1STRING FIND -> ' GT1 -1 }T
-T{ GT2STRING FIND -> ' GT2 1 }T
-( HOW TO SEARCH FOR NON-EXISTENT WORD? )
-T{ : GT3 GT2 LITERAL ; -> }T
-T{ GT3 -> ' GT1 }T
-T{ GT1STRING COUNT -> GT1STRING CHAR+ 3 }T
-
-T{ : GT4 POSTPONE GT1 ; IMMEDIATE -> }T
-T{ : GT5 GT4 ; -> }T
-T{ GT5 -> 123 }T
-T{ : GT6 345 ; IMMEDIATE -> }T
-T{ : GT7 POSTPONE GT6 ; -> }T
-T{ GT7 -> 345 }T
-
-T{ : GT8 STATE @ ; IMMEDIATE -> }T
-T{ GT8 -> 0 }T
-T{ : GT9 GT8 LITERAL ; -> }T
-T{ GT9 0= -> <FALSE> }T
-
-\ ------------------------------------------------------------------------
-TESTING IF ELSE THEN BEGIN WHILE REPEAT UNTIL RECURSE
-
-T{ : GI1 IF 123 THEN ; -> }T
-T{ : GI2 IF 123 ELSE 234 THEN ; -> }T
-T{ 0 GI1 -> }T
-T{ 1 GI1 -> 123 }T
-T{ -1 GI1 -> 123 }T
-T{ 0 GI2 -> 234 }T
-T{ 1 GI2 -> 123 }T
-T{ -1 GI1 -> 123 }T
-
-T{ : GI3 BEGIN DUP 5 < WHILE DUP 1+ REPEAT ; -> }T
-T{ 0 GI3 -> 0 1 2 3 4 5 }T
-T{ 4 GI3 -> 4 5 }T
-T{ 5 GI3 -> 5 }T
-T{ 6 GI3 -> 6 }T
-
-T{ : GI4 BEGIN DUP 1+ DUP 5 > UNTIL ; -> }T
-T{ 3 GI4 -> 3 4 5 6 }T
-T{ 5 GI4 -> 5 6 }T
-T{ 6 GI4 -> 6 7 }T
-
-T{ : GI5 BEGIN DUP 2 > WHILE DUP 5 < WHILE DUP 1+ REPEAT 123 ELSE 345 THEN ; -> }T
-T{ 1 GI5 -> 1 345 }T
-T{ 2 GI5 -> 2 345 }T
-T{ 3 GI5 -> 3 4 5 123 }T
-T{ 4 GI5 -> 4 5 123 }T
-T{ 5 GI5 -> 5 123 }T
-
-T{ : GI6 ( N -- 0,1,..N ) DUP IF DUP >R 1- RECURSE R> THEN ; -> }T
-T{ 0 GI6 -> 0 }T
-T{ 1 GI6 -> 0 1 }T
-T{ 2 GI6 -> 0 1 2 }T
-T{ 3 GI6 -> 0 1 2 3 }T
-T{ 4 GI6 -> 0 1 2 3 4 }T
-
-\ ------------------------------------------------------------------------
-TESTING DO LOOP +LOOP I J UNLOOP LEAVE EXIT
-
-T{ : GD1 DO I LOOP ; -> }T
-T{ 4 1 GD1 -> 1 2 3 }T
-T{ 2 -1 GD1 -> -1 0 1 }T
-T{ MID-UINT+1 MID-UINT GD1 -> MID-UINT }T
-
-T{ : GD2 DO I -1 +LOOP ; -> }T
-T{ 1 4 GD2 -> 4 3 2 1 }T
-T{ -1 2 GD2 -> 2 1 0 -1 }T
-T{ MID-UINT MID-UINT+1 GD2 -> MID-UINT+1 MID-UINT }T
-
-T{ : GD3 DO 1 0 DO J LOOP LOOP ; -> }T
-T{ 4 1 GD3 -> 1 2 3 }T
-T{ 2 -1 GD3 -> -1 0 1 }T
-T{ MID-UINT+1 MID-UINT GD3 -> MID-UINT }T
-
-T{ : GD4 DO 1 0 DO J LOOP -1 +LOOP ; -> }T
-T{ 1 4 GD4 -> 4 3 2 1 }T
-T{ -1 2 GD4 -> 2 1 0 -1 }T
-T{ MID-UINT MID-UINT+1 GD4 -> MID-UINT+1 MID-UINT }T
-
-T{ : GD5 123 SWAP 0 DO I 4 > IF DROP 234 LEAVE THEN LOOP ; -> }T
-T{ 1 GD5 -> 123 }T
-T{ 5 GD5 -> 123 }T
-T{ 6 GD5 -> 234 }T
-
-T{ : GD6 ( PAT: T{0 0}T,T{0 0}TT{1 0}TT{1 1}T,T{0 0}TT{1 0}TT{1 1}TT{2 0}TT{2 1}TT{2 2}T )
- 0 SWAP 0 DO
- I 1+ 0 DO I J + 3 = IF I UNLOOP I UNLOOP EXIT THEN 1+ LOOP
- LOOP ; -> }T
-T{ 1 GD6 -> 1 }T
-T{ 2 GD6 -> 3 }T
-T{ 3 GD6 -> 4 1 2 }T
-
-\ ------------------------------------------------------------------------
-TESTING DEFINING WORDS: : ; CONSTANT VARIABLE CREATE DOES> >BODY
-
-T{ 123 CONSTANT X123 -> }T
-T{ X123 -> 123 }T
-T{ : EQU CONSTANT ; -> }T
-T{ X123 EQU Y123 -> }T
-T{ Y123 -> 123 }T
-
-T{ VARIABLE V1 -> }T
-T{ 123 V1 ! -> }T
-T{ V1 @ -> 123 }T
-
-T{ : NOP : POSTPONE ; ; -> }T
-T{ NOP NOP1 NOP NOP2 -> }T
-T{ NOP1 -> }T
-T{ NOP2 -> }T
-
-T{ : DOES1 DOES> @ 1 + ; -> }T
-T{ : DOES2 DOES> @ 2 + ; -> }T
-T{ CREATE CR1 -> }T
-T{ CR1 -> HERE }T
-T{ ' CR1 >BODY -> HERE }T
-T{ 1 , -> }T
-T{ CR1 @ -> 1 }T
-T{ DOES1 -> }T
-T{ CR1 -> 2 }T
-T{ DOES2 -> }T
-T{ CR1 -> 3 }T
-
-T{ : WEIRD: CREATE DOES> 1 + DOES> 2 + ; -> }T
-T{ WEIRD: W1 -> }T
-T{ ' W1 >BODY -> HERE }T
-T{ W1 -> HERE 1 + }T
-T{ W1 -> HERE 2 + }T
-
-\ ------------------------------------------------------------------------
-TESTING EVALUATE
-
-: GE1 S" 123" ; IMMEDIATE
-: GE2 S" 123 1+" ; IMMEDIATE
-: GE3 S" : GE4 345 ;" ;
-: GE5 EVALUATE ; IMMEDIATE
-
-T{ GE1 EVALUATE -> 123 }T ( TEST EVALUATE IN INTERP. STATE )
-T{ GE2 EVALUATE -> 124 }T
-T{ GE3 EVALUATE -> }T
-T{ GE4 -> 345 }T
-
-T{ : GE6 GE1 GE5 ; -> }T ( TEST EVALUATE IN COMPILE STATE )
-T{ GE6 -> 123 }T
-T{ : GE7 GE2 GE5 ; -> }T
-T{ GE7 -> 124 }T
-
-\ ------------------------------------------------------------------------
-TESTING SOURCE >IN WORD
-
-: GS1 S" SOURCE" 2DUP EVALUATE
- >R SWAP >R = R> R> = ;
-T{ GS1 -> <TRUE> <TRUE> }T
-
-VARIABLE SCANS
-: RESCAN? -1 SCANS +! SCANS @ IF 0 >IN ! THEN ;
-
-T{ 2 SCANS !
-345 RESCAN?
--> 345 345 }T
-
-: GS2 5 SCANS ! S" 123 RESCAN?" EVALUATE ;
-T{ GS2 -> 123 123 123 123 123 }T
-
-: GS3 WORD COUNT SWAP C@ ;
-T{ BL GS3 HELLO -> 5 CHAR H }T
-T{ CHAR " GS3 GOODBYE" -> 7 CHAR G }T
-T{ BL GS3
-DROP -> 0 }T \ BLANK LINE RETURN ZERO-LENGTH STRING
-
-: GS4 SOURCE >IN ! DROP ;
-T{ GS4 123 456
--> }T
-
-\ ------------------------------------------------------------------------
-TESTING <# # #S #> HOLD SIGN BASE >NUMBER HEX DECIMAL
-
-: S= \ ( ADDR1 C1 ADDR2 C2 -- T/F ) COMPARE TWO STRINGS.
- >R SWAP R@ = IF \ MAKE SURE STRINGS HAVE SAME LENGTH
- R> ?DUP IF \ IF NON-EMPTY STRINGS
- 0 DO
- OVER C@ OVER C@ - IF
- 2DROP <FALSE> UNLOOP EXIT THEN
- SWAP CHAR+ SWAP CHAR+
- LOOP
- THEN
- 2DROP <TRUE> \ IF WE GET HERE, STRINGS MATCH
- ELSE
- R> DROP 2DROP <FALSE> \ LENGTHS MISMATCH
- THEN ;
-
-: GP1 <# 41 HOLD 42 HOLD 0 0 #> S" BA" S= ;
-T{ GP1 -> <TRUE> }T
-
-: GP2 <# -1 SIGN 0 SIGN -1 SIGN 0 0 #> S" --" S= ;
-T{ GP2 -> <TRUE> }T
-
-: GP3 <# 1 0 # # #> S" 01" S= ;
-T{ GP3 -> <TRUE> }T
-
-: GP4 <# 1 0 #S #> S" 1" S= ;
-T{ GP4 -> <TRUE> }T
-
-24 CONSTANT MAX-BASE \ BASE 2 .. 36
-: COUNT-BITS
- 0 0 INVERT BEGIN DUP WHILE >R 1+ R> 2* REPEAT DROP ;
-COUNT-BITS 2* CONSTANT #BITS-UD \ NUMBER OF BITS IN UD
-
-: GP5
- BASE @ <TRUE>
- MAX-BASE 1+ 2 DO \ FOR EACH POSSIBLE BASE
- I BASE ! \ TBD: ASSUMES BASE WORKS
- I 0 <# #S #> S" 10" S= AND
- LOOP
- SWAP BASE ! ;
-T{ GP5 -> <TRUE> }T
-
-: GP6
- BASE @ >R 2 BASE !
- MAX-UINT MAX-UINT <# #S #> \ MAXIMUM UD TO BINARY
- R> BASE ! \ S: C-ADDR U
- DUP #BITS-UD = SWAP
- 0 DO \ S: C-ADDR FLAG
- OVER C@ [CHAR] 1 = AND \ ALL ONES
- >R CHAR+ R>
- LOOP SWAP DROP ;
-T{ GP6 -> <TRUE> }T
-
-: GP7
- BASE @ >R MAX-BASE BASE !
- <TRUE>
- A 0 DO
- I 0 <# #S #>
- 1 = SWAP C@ I 30 + = AND AND
- LOOP
- MAX-BASE A DO
- I 0 <# #S #>
- 1 = SWAP C@ 41 I A - + = AND AND
- LOOP
- R> BASE ! ;
-
-T{ GP7 -> <TRUE> }T
-
-\ >NUMBER TESTS
-CREATE GN-BUF 0 C,
-: GN-STRING GN-BUF 1 ;
-: GN-CONSUMED GN-BUF CHAR+ 0 ;
-: GN' [CHAR] ' WORD CHAR+ C@ GN-BUF C! GN-STRING ;
-
-T{ 0 0 GN' 0' >NUMBER -> 0 0 GN-CONSUMED }T
-T{ 0 0 GN' 1' >NUMBER -> 1 0 GN-CONSUMED }T
-T{ 1 0 GN' 1' >NUMBER -> BASE @ 1+ 0 GN-CONSUMED }T
-T{ 0 0 GN' -' >NUMBER -> 0 0 GN-STRING }T \ SHOULD FAIL TO CONVERT THESE
-T{ 0 0 GN' +' >NUMBER -> 0 0 GN-STRING }T
-T{ 0 0 GN' .' >NUMBER -> 0 0 GN-STRING }T
-
-: >NUMBER-BASED
- BASE @ >R BASE ! >NUMBER R> BASE ! ;
-
-T{ 0 0 GN' 2' 10 >NUMBER-BASED -> 2 0 GN-CONSUMED }T
-T{ 0 0 GN' 2' 2 >NUMBER-BASED -> 0 0 GN-STRING }T
-T{ 0 0 GN' F' 10 >NUMBER-BASED -> F 0 GN-CONSUMED }T
-T{ 0 0 GN' G' 10 >NUMBER-BASED -> 0 0 GN-STRING }T
-T{ 0 0 GN' G' MAX-BASE >NUMBER-BASED -> 10 0 GN-CONSUMED }T
-T{ 0 0 GN' Z' MAX-BASE >NUMBER-BASED -> 23 0 GN-CONSUMED }T
-
-: GN1 \ ( UD BASE -- UD' LEN ) UD SHOULD EQUAL UD' AND LEN SHOULD BE ZERO.
- BASE @ >R BASE !
- <# #S #>
- 0 0 2SWAP >NUMBER SWAP DROP \ RETURN LENGTH ONLY
- R> BASE ! ;
-T{ 0 0 2 GN1 -> 0 0 0 }T
-T{ MAX-UINT 0 2 GN1 -> MAX-UINT 0 0 }T
-T{ MAX-UINT DUP 2 GN1 -> MAX-UINT DUP 0 }T
-T{ 0 0 MAX-BASE GN1 -> 0 0 0 }T
-T{ MAX-UINT 0 MAX-BASE GN1 -> MAX-UINT 0 0 }T
-T{ MAX-UINT DUP MAX-BASE GN1 -> MAX-UINT DUP 0 }T
-
-: GN2 \ ( -- 16 10 )
- BASE @ >R HEX BASE @ DECIMAL BASE @ R> BASE ! ;
-T{ GN2 -> 10 A }T
-
-\ ------------------------------------------------------------------------
-TESTING FILL MOVE
-
-CREATE FBUF 00 C, 00 C, 00 C,
-CREATE SBUF 12 C, 34 C, 56 C,
-: SEEBUF FBUF C@ FBUF CHAR+ C@ FBUF CHAR+ CHAR+ C@ ;
-
-T{ FBUF 0 20 FILL -> }T
-T{ SEEBUF -> 00 00 00 }T
-
-T{ FBUF 1 20 FILL -> }T
-T{ SEEBUF -> 20 00 00 }T
-
-T{ FBUF 3 20 FILL -> }T
-T{ SEEBUF -> 20 20 20 }T
-
-T{ FBUF FBUF 3 CHARS MOVE -> }T \ BIZARRE SPECIAL CASE
-T{ SEEBUF -> 20 20 20 }T
-
-T{ SBUF FBUF 0 CHARS MOVE -> }T
-T{ SEEBUF -> 20 20 20 }T
-
-T{ SBUF FBUF 1 CHARS MOVE -> }T
-T{ SEEBUF -> 12 20 20 }T
-
-T{ SBUF FBUF 3 CHARS MOVE -> }T
-T{ SEEBUF -> 12 34 56 }T
-
-T{ FBUF FBUF CHAR+ 2 CHARS MOVE -> }T
-T{ SEEBUF -> 12 12 34 }T
-
-T{ FBUF CHAR+ FBUF 2 CHARS MOVE -> }T
-T{ SEEBUF -> 12 34 34 }T
-
-\ ------------------------------------------------------------------------
-TESTING OUTPUT: . ." CR EMIT SPACE SPACES TYPE U.
-
-: OUTPUT-TEST
- ." YOU SHOULD SEE THE STANDARD GRAPHIC CHARACTERS:" CR
- 41 BL DO I EMIT LOOP CR
- 61 41 DO I EMIT LOOP CR
- 7F 61 DO I EMIT LOOP CR
- ." YOU SHOULD SEE 0-9 SEPARATED BY A SPACE:" CR
- 9 1+ 0 DO I . LOOP CR
- ." YOU SHOULD SEE 0-9 (WITH NO SPACES):" CR
- [CHAR] 9 1+ [CHAR] 0 DO I 0 SPACES EMIT LOOP CR
- ." YOU SHOULD SEE A-G SEPARATED BY A SPACE:" CR
- [CHAR] G 1+ [CHAR] A DO I EMIT SPACE LOOP CR
- ." YOU SHOULD SEE 0-5 SEPARATED BY TWO SPACES:" CR
- 5 1+ 0 DO I [CHAR] 0 + EMIT 2 SPACES LOOP CR
- ." YOU SHOULD SEE TWO SEPARATE LINES:" CR
- S" LINE 1" TYPE CR S" LINE 2" TYPE CR
- ." YOU SHOULD SEE THE NUMBER RANGES OF SIGNED AND UNSIGNED NUMBERS:" CR
- ." SIGNED: " MIN-INT . MAX-INT . CR
- ." UNSIGNED: " 0 U. MAX-UINT U. CR
-;
-
-T{ OUTPUT-TEST -> }T
-\ ------------------------------------------------------------------------
-TESTING INPUT: ACCEPT
-
-CREATE ABUF 80 CHARS ALLOT
-
-: ACCEPT-TEST
- CR ." PLEASE TYPE UP TO 80 CHARACTERS:" CR
- ABUF 80 ACCEPT
- CR ." RECEIVED: " [CHAR] " EMIT
- ABUF SWAP TYPE [CHAR] " EMIT CR
-;
-
-T{ ACCEPT-TEST -> }T
-Vingt fois sur le métier remettez votre ouvrage, ...
-\ ------------------------------------------------------------------------
-TESTING DICTIONARY SEARCH RULES
-
-T{ : GDX 123 ; : GDX GDX 234 ; -> }T
-
-T{ GDX -> 123 234 }T
-
-CR .( End of Core word set tests) CR
-
-
-
-RST_STATE ; so ANS_COMPLEMENT_xx_MPY is conserved ;
-\ NOECHO ; if an error occurs, comment this line before new download to find it.
-
-
-\ From: John Hayes S1I
-\ Subject: tester.fr
-\ Date: Mon, 27 Nov 95 13:10:09 PST
-
-\ (C) 1995 JOHNS HOPKINS UNIVERSITY / APPLIED PHYSICS LABORATORY
-\ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS.
-\ VERSION 1.1
-
-\ 22/1/09 The words { and } have been changed to T{ and }T respectively to
-\ agree with the Forth 200X file ttester.fs. This avoids clashes with
-\ locals using { ... } and the FSL use of }
-
-
-\ 13/05/14 jmt. added colorised error messages.
-
-
-
- 0 CONSTANT FALSE
--1 CONSTANT TRUE
-
-\ SET THE FOLLOWING FLAG TO TRUE FOR MORE VERBOSE OUTPUT; THIS MAY
-\ ALLOW YOU TO TELL WHICH TEST CAUSED YOUR SYSTEM TO HANG.
-VARIABLE VERBOSE
- FALSE VERBOSE !
-\ TRUE VERBOSE !
-
-\ : EMPTY-STACK ( ... -- ) \ EMPTY STACK: HANDLES UNDERFLOWED STACK TOO.
-\ DEPTH ?DUP
-\ IF DUP 0< IF NEGATE 0
-\ DO 0 LOOP
-\ ELSE 0 DO DROP LOOP THEN
-\ THEN ;
-\
-\ : ERROR \ ( C-ADDR U -- ) DISPLAY AN ERROR MESSAGE FOLLOWED BY
-\ \ THE LINE THAT HAD THE ERROR.
-\ TYPE SOURCE TYPE CR \ DISPLAY LINE CORRESPONDING TO ERROR
-\ EMPTY-STACK \ THROW AWAY EVERY THING ELSE
-\ QUIT \ *** Uncomment this line to QUIT on an error
-\ ;
-
-VARIABLE ACTUAL-DEPTH \ STACK RECORD
-CREATE ACTUAL-RESULTS 20 CELLS ALLOT
-
-: T{ \ ( -- ) SYNTACTIC SUGAR.
- ;
-
-: -> \ ( ... -- ) RECORD DEPTH AND CONTENT OF STACK.
- DEPTH DUP ACTUAL-DEPTH ! \ RECORD DEPTH
- ?DUP IF \ IF THERE IS SOMETHING ON STACK
- 0 DO ACTUAL-RESULTS I CELLS + ! LOOP \ SAVE THEM
- THEN ;
-
-: }T \ ( ... -- ) COMPARE STACK (EXPECTED) CONTENTS WITH SAVED
- \ (ACTUAL) CONTENTS.
- DEPTH ACTUAL-DEPTH @ = IF \ IF DEPTHS MATCH
- DEPTH ?DUP IF \ IF THERE IS SOMETHING ON THE STACK
- 0 DO \ FOR EACH STACK ITEM
- ACTUAL-RESULTS I CELLS + @ \ COMPARE ACTUAL WITH EXPECTED
-\ = 0= IF S" INCORRECT RESULT: " ERROR LEAVE THEN \ jmt
- = 0= IF ABORT" INCORRECT RESULT: " THEN \ jmt : colorised message
- LOOP
- THEN
- ELSE \ DEPTH MISMATCH
-\ S" WRONG NUMBER OF RESULTS: " ERROR \ jmt
- ABORT" WRONG NUMBER OF RESULTS: " \ jmt : colorised message
- THEN ;
-
-: TESTING \ ( -- ) TALKING COMMENT.
- SOURCE VERBOSE @
- IF DUP >R TYPE CR R> >IN !
- ELSE >IN ! DROP [CHAR] * EMIT
- THEN ;
-
-\ From: John Hayes S1I
-\ Subject: core.fr
-\ Date: Mon, 27 Nov 95 13:10
-
-\ (C) 1995 JOHNS HOPKINS UNIVERSITY / APPLIED PHYSICS LABORATORY
-\ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS.
-\ VERSION 1.2
-\ THIS PROGRAM TESTS THE CORE WORDS OF AN ANS FORTH SYSTEM.
-\ THE PROGRAM ASSUMES A TWO'S COMPLEMENT IMPLEMENTATION WHERE
-\ THE RANGE OF SIGNED NUMBERS IS -2^(N-1) ... 2^(N-1)-1 AND
-\ THE RANGE OF UNSIGNED NUMBERS IS 0 ... 2^(N)-1.
-\ I HAVEN'T FIGURED OUT HOW TO TEST KEY, QUIT, ABORT, OR ABORT"...
-\ I ALSO HAVEN'T THOUGHT OF A WAY TO TEST ENVIRONMENT?...
-
-CR
-TESTING CORE WORDS
-HEX
-
-\ ------------------------------------------------------------------------
-TESTING BASIC ASSUMPTIONS
-
-T{ -> }T \ START WITH CLEAN SLATE
-( TEST IF ANY BITS ARE SET; ANSWER IN BASE 1 )
-T{ : BITSSET? IF 0 0 ELSE 0 THEN ; -> }T
-T{ 0 BITSSET? -> 0 }T ( ZERO IS ALL BITS CLEAR )
-T{ 1 BITSSET? -> 0 0 }T ( OTHER NUMBER HAVE AT LEAST ONE BIT )
-T{ -1 BITSSET? -> 0 0 }T
-
-\ ------------------------------------------------------------------------
-TESTING BOOLEANS: INVERT AND OR XOR
-
-T{ 0 0 AND -> 0 }T
-T{ 0 1 AND -> 0 }T
-T{ 1 0 AND -> 0 }T
-T{ 1 1 AND -> 1 }T
-
-T{ 0 INVERT 1 AND -> 1 }T
-T{ 1 INVERT 1 AND -> 0 }T
-
-0 CONSTANT 0S
-0 INVERT CONSTANT 1S
-
-T{ 0S INVERT -> 1S }T
-T{ 1S INVERT -> 0S }T
-
-T{ 0S 0S AND -> 0S }T
-T{ 0S 1S AND -> 0S }T
-T{ 1S 0S AND -> 0S }T
-T{ 1S 1S AND -> 1S }T
-
-T{ 0S 0S OR -> 0S }T
-T{ 0S 1S OR -> 1S }T
-T{ 1S 0S OR -> 1S }T
-T{ 1S 1S OR -> 1S }T
-
-T{ 0S 0S XOR -> 0S }T
-T{ 0S 1S XOR -> 1S }T
-T{ 1S 0S XOR -> 1S }T
-T{ 1S 1S XOR -> 0S }T
-
-\ ------------------------------------------------------------------------
-TESTING 2* 2/ LSHIFT RSHIFT
-
-( WE TRUST 1S, INVERT, AND BITSSET?; WE WILL CONFIRM RSHIFT LATER )
-1S 1 RSHIFT INVERT CONSTANT MSB
-T{ MSB BITSSET? -> 0 0 }T
-
-T{ 0S 2* -> 0S }T
-T{ 1 2* -> 2 }T
-T{ 4000 2* -> 8000 }T
-T{ 1S 2* 1 XOR -> 1S }T
-T{ MSB 2* -> 0S }T
-
-T{ 0S 2/ -> 0S }T
-T{ 1 2/ -> 0 }T
-T{ 4000 2/ -> 2000 }T
-T{ 1S 2/ -> 1S }T \ MSB PROPOGATED
-T{ 1S 1 XOR 2/ -> 1S }T
-T{ MSB 2/ MSB AND -> MSB }T
-
-T{ 1 0 LSHIFT -> 1 }T
-T{ 1 1 LSHIFT -> 2 }T
-T{ 1 2 LSHIFT -> 4 }T
-T{ 1 F LSHIFT -> 8000 }T \ BIGGEST GUARANTEED SHIFT
-T{ 1S 1 LSHIFT 1 XOR -> 1S }T
-T{ MSB 1 LSHIFT -> 0 }T
-
-T{ 1 0 RSHIFT -> 1 }T
-T{ 1 1 RSHIFT -> 0 }T
-T{ 2 1 RSHIFT -> 1 }T
-T{ 4 2 RSHIFT -> 1 }T
-T{ 8000 F RSHIFT -> 1 }T \ BIGGEST
-T{ MSB 1 RSHIFT MSB AND -> 0 }T \ RSHIFT ZERO FILLS MSBS
-T{ MSB 1 RSHIFT 2* -> MSB }T
-
-\ ------------------------------------------------------------------------
-TESTING COMPARISONS: 0= = 0< < > U< MIN MAX
-0 INVERT CONSTANT MAX-UINT
-0 INVERT 1 RSHIFT CONSTANT MAX-INT
-0 INVERT 1 RSHIFT INVERT CONSTANT MIN-INT
-0 INVERT 1 RSHIFT CONSTANT MID-UINT
-0 INVERT 1 RSHIFT INVERT CONSTANT MID-UINT+1
-
-0S CONSTANT <FALSE>
-1S CONSTANT <TRUE>
-
-T{ 0 0= -> <TRUE> }T
-T{ 1 0= -> <FALSE> }T
-T{ 2 0= -> <FALSE> }T
-T{ -1 0= -> <FALSE> }T
-T{ MAX-UINT 0= -> <FALSE> }T
-T{ MIN-INT 0= -> <FALSE> }T
-T{ MAX-INT 0= -> <FALSE> }T
-
-T{ 0 0 = -> <TRUE> }T
-T{ 1 1 = -> <TRUE> }T
-T{ -1 -1 = -> <TRUE> }T
-T{ 1 0 = -> <FALSE> }T
-T{ -1 0 = -> <FALSE> }T
-T{ 0 1 = -> <FALSE> }T
-T{ 0 -1 = -> <FALSE> }T
-
-T{ 0 0< -> <FALSE> }T
-T{ -1 0< -> <TRUE> }T
-T{ MIN-INT 0< -> <TRUE> }T
-T{ 1 0< -> <FALSE> }T
-T{ MAX-INT 0< -> <FALSE> }T
-
-T{ 0 1 < -> <TRUE> }T
-T{ 1 2 < -> <TRUE> }T
-T{ -1 0 < -> <TRUE> }T
-T{ -1 1 < -> <TRUE> }T
-T{ MIN-INT 0 < -> <TRUE> }T
-T{ MIN-INT MAX-INT < -> <TRUE> }T
-T{ 0 MAX-INT < -> <TRUE> }T
-T{ 0 0 < -> <FALSE> }T
-T{ 1 1 < -> <FALSE> }T
-T{ 1 0 < -> <FALSE> }T
-T{ 2 1 < -> <FALSE> }T
-T{ 0 -1 < -> <FALSE> }T
-T{ 1 -1 < -> <FALSE> }T
-T{ 0 MIN-INT < -> <FALSE> }T
-T{ MAX-INT MIN-INT < -> <FALSE> }T
-T{ MAX-INT 0 < -> <FALSE> }T
-
-T{ 0 1 > -> <FALSE> }T
-T{ 1 2 > -> <FALSE> }T
-T{ -1 0 > -> <FALSE> }T
-T{ -1 1 > -> <FALSE> }T
-T{ MIN-INT 0 > -> <FALSE> }T
-T{ MIN-INT MAX-INT > -> <FALSE> }T
-T{ 0 MAX-INT > -> <FALSE> }T
-T{ 0 0 > -> <FALSE> }T
-T{ 1 1 > -> <FALSE> }T
-T{ 1 0 > -> <TRUE> }T
-T{ 2 1 > -> <TRUE> }T
-T{ 0 -1 > -> <TRUE> }T
-T{ 1 -1 > -> <TRUE> }T
-T{ 0 MIN-INT > -> <TRUE> }T
-T{ MAX-INT MIN-INT > -> <TRUE> }T
-T{ MAX-INT 0 > -> <TRUE> }T
-
-T{ 0 1 U< -> <TRUE> }T
-T{ 1 2 U< -> <TRUE> }T
-T{ 0 MID-UINT U< -> <TRUE> }T
-T{ 0 MAX-UINT U< -> <TRUE> }T
-T{ MID-UINT MAX-UINT U< -> <TRUE> }T
-T{ 0 0 U< -> <FALSE> }T
-T{ 1 1 U< -> <FALSE> }T
-T{ 1 0 U< -> <FALSE> }T
-T{ 2 1 U< -> <FALSE> }T
-T{ MID-UINT 0 U< -> <FALSE> }T
-T{ MAX-UINT 0 U< -> <FALSE> }T
-T{ MAX-UINT MID-UINT U< -> <FALSE> }T
-
-T{ 0 1 MIN -> 0 }T
-T{ 1 2 MIN -> 1 }T
-T{ -1 0 MIN -> -1 }T
-T{ -1 1 MIN -> -1 }T
-T{ MIN-INT 0 MIN -> MIN-INT }T
-T{ MIN-INT MAX-INT MIN -> MIN-INT }T
-T{ 0 MAX-INT MIN -> 0 }T
-T{ 0 0 MIN -> 0 }T
-T{ 1 1 MIN -> 1 }T
-T{ 1 0 MIN -> 0 }T
-T{ 2 1 MIN -> 1 }T
-T{ 0 -1 MIN -> -1 }T
-T{ 1 -1 MIN -> -1 }T
-T{ 0 MIN-INT MIN -> MIN-INT }T
-T{ MAX-INT MIN-INT MIN -> MIN-INT }T
-T{ MAX-INT 0 MIN -> 0 }T
-
-T{ 0 1 MAX -> 1 }T
-T{ 1 2 MAX -> 2 }T
-T{ -1 0 MAX -> 0 }T
-T{ -1 1 MAX -> 1 }T
-T{ MIN-INT 0 MAX -> 0 }T
-T{ MIN-INT MAX-INT MAX -> MAX-INT }T
-T{ 0 MAX-INT MAX -> MAX-INT }T
-T{ 0 0 MAX -> 0 }T
-T{ 1 1 MAX -> 1 }T
-T{ 1 0 MAX -> 1 }T
-T{ 2 1 MAX -> 2 }T
-T{ 0 -1 MAX -> 0 }T
-T{ 1 -1 MAX -> 1 }T
-T{ 0 MIN-INT MAX -> 0 }T
-T{ MAX-INT MIN-INT MAX -> MAX-INT }T
-T{ MAX-INT 0 MAX -> MAX-INT }T
-
-\ ------------------------------------------------------------------------
-TESTING STACK OPS: 2DROP 2DUP 2OVER 2SWAP ?DUP DEPTH DROP DUP OVER ROT SWAP
-
-T{ 1 2 2DROP -> }T
-T{ 1 2 2DUP -> 1 2 1 2 }T
-T{ 1 2 3 4 2OVER -> 1 2 3 4 1 2 }T
-T{ 1 2 3 4 2SWAP -> 3 4 1 2 }T
-T{ 0 ?DUP -> 0 }T
-T{ 1 ?DUP -> 1 1 }T
-T{ -1 ?DUP -> -1 -1 }T
-T{ DEPTH -> 0 }T
-T{ 0 DEPTH -> 0 1 }T
-T{ 0 1 DEPTH -> 0 1 2 }T
-T{ 0 DROP -> }T
-T{ 1 2 DROP -> 1 }T
-T{ 1 DUP -> 1 1 }T
-T{ 1 2 OVER -> 1 2 1 }T
-T{ 1 2 3 ROT -> 2 3 1 }T
-T{ 1 2 SWAP -> 2 1 }T
-
-\ ------------------------------------------------------------------------
-TESTING >R R> R@
-
-T{ : GR1 >R R> ; -> }T
-T{ : GR2 >R R@ R> DROP ; -> }T
-T{ 123 GR1 -> 123 }T
-T{ 123 GR2 -> 123 }T
-T{ 1S GR1 -> 1S }T ( RETURN STACK HOLDS CELLS )
-
-\ ------------------------------------------------------------------------
-TESTING ADD/SUBTRACT: + - 1+ 1- ABS NEGATE
-
-T{ 0 5 + -> 5 }T
-T{ 5 0 + -> 5 }T
-T{ 0 -5 + -> -5 }T
-T{ -5 0 + -> -5 }T
-T{ 1 2 + -> 3 }T
-T{ 1 -2 + -> -1 }T
-T{ -1 2 + -> 1 }T
-T{ -1 -2 + -> -3 }T
-T{ -1 1 + -> 0 }T
-T{ MID-UINT 1 + -> MID-UINT+1 }T
-
-T{ 0 5 - -> -5 }T
-T{ 5 0 - -> 5 }T
-T{ 0 -5 - -> 5 }T
-T{ -5 0 - -> -5 }T
-T{ 1 2 - -> -1 }T
-T{ 1 -2 - -> 3 }T
-T{ -1 2 - -> -3 }T
-T{ -1 -2 - -> 1 }T
-T{ 0 1 - -> -1 }T
-T{ MID-UINT+1 1 - -> MID-UINT }T
-
-T{ 0 1+ -> 1 }T
-T{ -1 1+ -> 0 }T
-T{ 1 1+ -> 2 }T
-T{ MID-UINT 1+ -> MID-UINT+1 }T
-
-T{ 2 1- -> 1 }T
-T{ 1 1- -> 0 }T
-T{ 0 1- -> -1 }T
-T{ MID-UINT+1 1- -> MID-UINT }T
-
-T{ 0 NEGATE -> 0 }T
-T{ 1 NEGATE -> -1 }T
-T{ -1 NEGATE -> 1 }T
-T{ 2 NEGATE -> -2 }T
-T{ -2 NEGATE -> 2 }T
-
-T{ 0 ABS -> 0 }T
-T{ 1 ABS -> 1 }T
-T{ -1 ABS -> 1 }T
-T{ MIN-INT ABS -> MID-UINT+1 }T
-
-\ ------------------------------------------------------------------------
-TESTING MULTIPLY: S>D * M* UM*
-
-T{ 0 S>D -> 0 0 }T
-T{ 1 S>D -> 1 0 }T
-T{ 2 S>D -> 2 0 }T
-T{ -1 S>D -> -1 -1 }T
-T{ -2 S>D -> -2 -1 }T
-T{ MIN-INT S>D -> MIN-INT -1 }T
-T{ MAX-INT S>D -> MAX-INT 0 }T
-
-T{ 0 0 M* -> 0 S>D }T
-T{ 0 1 M* -> 0 S>D }T
-T{ 1 0 M* -> 0 S>D }T
-T{ 1 2 M* -> 2 S>D }T
-T{ 2 1 M* -> 2 S>D }T
-T{ 3 3 M* -> 9 S>D }T
-T{ -3 3 M* -> -9 S>D }T
-T{ 3 -3 M* -> -9 S>D }T
-T{ -3 -3 M* -> 9 S>D }T
-T{ 0 MIN-INT M* -> 0 S>D }T
-T{ 1 MIN-INT M* -> MIN-INT S>D }T
-T{ 2 MIN-INT M* -> 0 1S }T
-T{ 0 MAX-INT M* -> 0 S>D }T
-T{ 1 MAX-INT M* -> MAX-INT S>D }T
-T{ 2 MAX-INT M* -> MAX-INT 1 LSHIFT 0 }T
-T{ MIN-INT MIN-INT M* -> 0 MSB 1 RSHIFT }T
-T{ MAX-INT MIN-INT M* -> MSB MSB 2/ }T
-T{ MAX-INT MAX-INT M* -> 1 MSB 2/ INVERT }T
-
-T{ 0 0 * -> 0 }T \ TEST IDENTITIES
-T{ 0 1 * -> 0 }T
-T{ 1 0 * -> 0 }T
-T{ 1 2 * -> 2 }T
-T{ 2 1 * -> 2 }T
-T{ 3 3 * -> 9 }T
-T{ -3 3 * -> -9 }T
-T{ 3 -3 * -> -9 }T
-T{ -3 -3 * -> 9 }T
-
-T{ MID-UINT+1 1 RSHIFT 2 * -> MID-UINT+1 }T
-T{ MID-UINT+1 2 RSHIFT 4 * -> MID-UINT+1 }T
-T{ MID-UINT+1 1 RSHIFT MID-UINT+1 OR 2 * -> MID-UINT+1 }T
-
-T{ 0 0 UM* -> 0 0 }T
-T{ 0 1 UM* -> 0 0 }T
-T{ 1 0 UM* -> 0 0 }T
-T{ 1 2 UM* -> 2 0 }T
-T{ 2 1 UM* -> 2 0 }T
-T{ 3 3 UM* -> 9 0 }T
-
-T{ MID-UINT+1 1 RSHIFT 2 UM* -> MID-UINT+1 0 }T
-T{ MID-UINT+1 2 UM* -> 0 1 }T
-T{ MID-UINT+1 4 UM* -> 0 2 }T
-T{ 1S 2 UM* -> 1S 1 LSHIFT 1 }T
-T{ MAX-UINT MAX-UINT UM* -> 1 1 INVERT }T
-
-\ ------------------------------------------------------------------------
-TESTING DIVIDE: FM/MOD SM/REM UM/MOD */ */MOD / /MOD MOD
-
-T{ 0 S>D 1 FM/MOD -> 0 0 }T
-T{ 1 S>D 1 FM/MOD -> 0 1 }T
-T{ 2 S>D 1 FM/MOD -> 0 2 }T
-T{ -1 S>D 1 FM/MOD -> 0 -1 }T
-T{ -2 S>D 1 FM/MOD -> 0 -2 }T
-T{ 0 S>D -1 FM/MOD -> 0 0 }T
-T{ 1 S>D -1 FM/MOD -> 0 -1 }T
-T{ 2 S>D -1 FM/MOD -> 0 -2 }T
-T{ -1 S>D -1 FM/MOD -> 0 1 }T
-T{ -2 S>D -1 FM/MOD -> 0 2 }T
-T{ 2 S>D 2 FM/MOD -> 0 1 }T
-T{ -1 S>D -1 FM/MOD -> 0 1 }T
-T{ -2 S>D -2 FM/MOD -> 0 1 }T
-T{ 7 S>D 3 FM/MOD -> 1 2 }T
-T{ 7 S>D -3 FM/MOD -> -2 -3 }T
-T{ -7 S>D 3 FM/MOD -> 2 -3 }T
-T{ -7 S>D -3 FM/MOD -> -1 2 }T
-T{ MAX-INT S>D 1 FM/MOD -> 0 MAX-INT }T
-T{ MIN-INT S>D 1 FM/MOD -> 0 MIN-INT }T
-T{ MAX-INT S>D MAX-INT FM/MOD -> 0 1 }T
-T{ MIN-INT S>D MIN-INT FM/MOD -> 0 1 }T
-T{ 1S 1 4 FM/MOD -> 3 MAX-INT }T
-T{ 1 MIN-INT M* 1 FM/MOD -> 0 MIN-INT }T
-T{ 1 MIN-INT M* MIN-INT FM/MOD -> 0 1 }T
-T{ 2 MIN-INT M* 2 FM/MOD -> 0 MIN-INT }T
-T{ 2 MIN-INT M* MIN-INT FM/MOD -> 0 2 }T
-T{ 1 MAX-INT M* 1 FM/MOD -> 0 MAX-INT }T
-T{ 1 MAX-INT M* MAX-INT FM/MOD -> 0 1 }T
-T{ 2 MAX-INT M* 2 FM/MOD -> 0 MAX-INT }T
-T{ 2 MAX-INT M* MAX-INT FM/MOD -> 0 2 }T
-T{ MIN-INT MIN-INT M* MIN-INT FM/MOD -> 0 MIN-INT }T
-T{ MIN-INT MAX-INT M* MIN-INT FM/MOD -> 0 MAX-INT }T
-T{ MIN-INT MAX-INT M* MAX-INT FM/MOD -> 0 MIN-INT }T
-T{ MAX-INT MAX-INT M* MAX-INT FM/MOD -> 0 MAX-INT }T
-
-T{ 0 S>D 1 SM/REM -> 0 0 }T
-T{ 1 S>D 1 SM/REM -> 0 1 }T
-T{ 2 S>D 1 SM/REM -> 0 2 }T
-T{ -1 S>D 1 SM/REM -> 0 -1 }T
-T{ -2 S>D 1 SM/REM -> 0 -2 }T
-T{ 0 S>D -1 SM/REM -> 0 0 }T
-T{ 1 S>D -1 SM/REM -> 0 -1 }T
-T{ 2 S>D -1 SM/REM -> 0 -2 }T
-T{ -1 S>D -1 SM/REM -> 0 1 }T
-T{ -2 S>D -1 SM/REM -> 0 2 }T
-T{ 2 S>D 2 SM/REM -> 0 1 }T
-T{ -1 S>D -1 SM/REM -> 0 1 }T
-T{ -2 S>D -2 SM/REM -> 0 1 }T
-T{ 7 S>D 3 SM/REM -> 1 2 }T
-T{ 7 S>D -3 SM/REM -> 1 -2 }T
-T{ -7 S>D 3 SM/REM -> -1 -2 }T
-T{ -7 S>D -3 SM/REM -> -1 2 }T
-T{ MAX-INT S>D 1 SM/REM -> 0 MAX-INT }T
-T{ MIN-INT S>D 1 SM/REM -> 0 MIN-INT }T
-T{ MAX-INT S>D MAX-INT SM/REM -> 0 1 }T
-T{ MIN-INT S>D MIN-INT SM/REM -> 0 1 }T
-T{ 1S 1 4 SM/REM -> 3 MAX-INT }T
-T{ 2 MIN-INT M* 2 SM/REM -> 0 MIN-INT }T
-T{ 2 MIN-INT M* MIN-INT SM/REM -> 0 2 }T
-T{ 2 MAX-INT M* 2 SM/REM -> 0 MAX-INT }T
-T{ 2 MAX-INT M* MAX-INT SM/REM -> 0 2 }T
-T{ MIN-INT MIN-INT M* MIN-INT SM/REM -> 0 MIN-INT }T
-T{ MIN-INT MAX-INT M* MIN-INT SM/REM -> 0 MAX-INT }T
-T{ MIN-INT MAX-INT M* MAX-INT SM/REM -> 0 MIN-INT }T
-T{ MAX-INT MAX-INT M* MAX-INT SM/REM -> 0 MAX-INT }T
-
-T{ 0 0 1 UM/MOD -> 0 0 }T
-T{ 1 0 1 UM/MOD -> 0 1 }T
-T{ 1 0 2 UM/MOD -> 1 0 }T
-T{ 3 0 2 UM/MOD -> 1 1 }T
-T{ MAX-UINT 2 UM* 2 UM/MOD -> 0 MAX-UINT }T
-T{ MAX-UINT 2 UM* MAX-UINT UM/MOD -> 0 2 }T
-T{ MAX-UINT MAX-UINT UM* MAX-UINT UM/MOD -> 0 MAX-UINT }T
-
-: IFFLOORED
- [ -3 2 / -2 = INVERT ] LITERAL IF POSTPONE \ THEN ;
-
-: IFSYM
- [ -3 2 / -1 = INVERT ] LITERAL IF POSTPONE \ THEN ;
-
-\ THE SYSTEM MIGHT DO EITHER FLOORED OR SYMMETRIC DIVISION.
-\ SINCE WE HAVE ALREADY TESTED M*, FM/MOD, AND SM/REM WE CAN USE THEM IN TEST.
-
-IFFLOORED : T/MOD >R S>D R> FM/MOD ;
-IFFLOORED : T/ T/MOD SWAP DROP ;
-IFFLOORED : TMOD T/MOD DROP ;
-IFFLOORED : T*/MOD >R M* R> FM/MOD ;
-IFFLOORED : T*/ T*/MOD SWAP DROP ;
-IFSYM : T/MOD >R S>D R> SM/REM ;
-IFSYM : T/ T/MOD SWAP DROP ;
-IFSYM : TMOD T/MOD DROP ;
-IFSYM : T*/MOD >R M* R> SM/REM ;
-IFSYM : T*/ T*/MOD SWAP DROP ;
-
-T{ 0 1 /MOD -> 0 1 T/MOD }T
-T{ 1 1 /MOD -> 1 1 T/MOD }T
-T{ 2 1 /MOD -> 2 1 T/MOD }T
-T{ -1 1 /MOD -> -1 1 T/MOD }T
-T{ -2 1 /MOD -> -2 1 T/MOD }T
-T{ 0 -1 /MOD -> 0 -1 T/MOD }T
-T{ 1 -1 /MOD -> 1 -1 T/MOD }T
-T{ 2 -1 /MOD -> 2 -1 T/MOD }T
-T{ -1 -1 /MOD -> -1 -1 T/MOD }T
-T{ -2 -1 /MOD -> -2 -1 T/MOD }T
-T{ 2 2 /MOD -> 2 2 T/MOD }T
-T{ -1 -1 /MOD -> -1 -1 T/MOD }T
-T{ -2 -2 /MOD -> -2 -2 T/MOD }T
-T{ 7 3 /MOD -> 7 3 T/MOD }T
-T{ 7 -3 /MOD -> 7 -3 T/MOD }T
-T{ -7 3 /MOD -> -7 3 T/MOD }T
-T{ -7 -3 /MOD -> -7 -3 T/MOD }T
-T{ MAX-INT 1 /MOD -> MAX-INT 1 T/MOD }T
-T{ MIN-INT 1 /MOD -> MIN-INT 1 T/MOD }T
-T{ MAX-INT MAX-INT /MOD -> MAX-INT MAX-INT T/MOD }T
-T{ MIN-INT MIN-INT /MOD -> MIN-INT MIN-INT T/MOD }T
-
-T{ 0 1 / -> 0 1 T/ }T
-T{ 1 1 / -> 1 1 T/ }T
-T{ 2 1 / -> 2 1 T/ }T
-T{ -1 1 / -> -1 1 T/ }T
-T{ -2 1 / -> -2 1 T/ }T
-T{ 0 -1 / -> 0 -1 T/ }T
-T{ 1 -1 / -> 1 -1 T/ }T
-T{ 2 -1 / -> 2 -1 T/ }T
-T{ -1 -1 / -> -1 -1 T/ }T
-T{ -2 -1 / -> -2 -1 T/ }T
-T{ 2 2 / -> 2 2 T/ }T
-T{ -1 -1 / -> -1 -1 T/ }T
-T{ -2 -2 / -> -2 -2 T/ }T
-T{ 7 3 / -> 7 3 T/ }T
-T{ 7 -3 / -> 7 -3 T/ }T
-T{ -7 3 / -> -7 3 T/ }T
-T{ -7 -3 / -> -7 -3 T/ }T
-T{ MAX-INT 1 / -> MAX-INT 1 T/ }T
-T{ MIN-INT 1 / -> MIN-INT 1 T/ }T
-T{ MAX-INT MAX-INT / -> MAX-INT MAX-INT T/ }T
-T{ MIN-INT MIN-INT / -> MIN-INT MIN-INT T/ }T
-
-T{ 0 1 MOD -> 0 1 TMOD }T
-T{ 1 1 MOD -> 1 1 TMOD }T
-T{ 2 1 MOD -> 2 1 TMOD }T
-T{ -1 1 MOD -> -1 1 TMOD }T
-T{ -2 1 MOD -> -2 1 TMOD }T
-T{ 0 -1 MOD -> 0 -1 TMOD }T
-T{ 1 -1 MOD -> 1 -1 TMOD }T
-T{ 2 -1 MOD -> 2 -1 TMOD }T
-T{ -1 -1 MOD -> -1 -1 TMOD }T
-T{ -2 -1 MOD -> -2 -1 TMOD }T
-T{ 2 2 MOD -> 2 2 TMOD }T
-T{ -1 -1 MOD -> -1 -1 TMOD }T
-T{ -2 -2 MOD -> -2 -2 TMOD }T
-T{ 7 3 MOD -> 7 3 TMOD }T
-T{ 7 -3 MOD -> 7 -3 TMOD }T
-T{ -7 3 MOD -> -7 3 TMOD }T
-T{ -7 -3 MOD -> -7 -3 TMOD }T
-T{ MAX-INT 1 MOD -> MAX-INT 1 TMOD }T
-T{ MIN-INT 1 MOD -> MIN-INT 1 TMOD }T
-T{ MAX-INT MAX-INT MOD -> MAX-INT MAX-INT TMOD }T
-T{ MIN-INT MIN-INT MOD -> MIN-INT MIN-INT TMOD }T
-
-T{ 0 2 1 */ -> 0 2 1 T*/ }T
-T{ 1 2 1 */ -> 1 2 1 T*/ }T
-T{ 2 2 1 */ -> 2 2 1 T*/ }T
-T{ -1 2 1 */ -> -1 2 1 T*/ }T
-T{ -2 2 1 */ -> -2 2 1 T*/ }T
-T{ 0 2 -1 */ -> 0 2 -1 T*/ }T
-T{ 1 2 -1 */ -> 1 2 -1 T*/ }T
-T{ 2 2 -1 */ -> 2 2 -1 T*/ }T
-T{ -1 2 -1 */ -> -1 2 -1 T*/ }T
-T{ -2 2 -1 */ -> -2 2 -1 T*/ }T
-T{ 2 2 2 */ -> 2 2 2 T*/ }T
-T{ -1 2 -1 */ -> -1 2 -1 T*/ }T
-T{ -2 2 -2 */ -> -2 2 -2 T*/ }T
-T{ 7 2 3 */ -> 7 2 3 T*/ }T
-T{ 7 2 -3 */ -> 7 2 -3 T*/ }T
-T{ -7 2 3 */ -> -7 2 3 T*/ }T
-T{ -7 2 -3 */ -> -7 2 -3 T*/ }T
-T{ MAX-INT 2 MAX-INT */ -> MAX-INT 2 MAX-INT T*/ }T
-T{ MIN-INT 2 MIN-INT */ -> MIN-INT 2 MIN-INT T*/ }T
-
-T{ 0 2 1 */MOD -> 0 2 1 T*/MOD }T
-T{ 1 2 1 */MOD -> 1 2 1 T*/MOD }T
-T{ 2 2 1 */MOD -> 2 2 1 T*/MOD }T
-T{ -1 2 1 */MOD -> -1 2 1 T*/MOD }T
-T{ -2 2 1 */MOD -> -2 2 1 T*/MOD }T
-T{ 0 2 -1 */MOD -> 0 2 -1 T*/MOD }T
-T{ 1 2 -1 */MOD -> 1 2 -1 T*/MOD }T
-T{ 2 2 -1 */MOD -> 2 2 -1 T*/MOD }T
-T{ -1 2 -1 */MOD -> -1 2 -1 T*/MOD }T
-T{ -2 2 -1 */MOD -> -2 2 -1 T*/MOD }T
-T{ 2 2 2 */MOD -> 2 2 2 T*/MOD }T
-T{ -1 2 -1 */MOD -> -1 2 -1 T*/MOD }T
-T{ -2 2 -2 */MOD -> -2 2 -2 T*/MOD }T
-T{ 7 2 3 */MOD -> 7 2 3 T*/MOD }T
-T{ 7 2 -3 */MOD -> 7 2 -3 T*/MOD }T
-T{ -7 2 3 */MOD -> -7 2 3 T*/MOD }T
-T{ -7 2 -3 */MOD -> -7 2 -3 T*/MOD }T
-T{ MAX-INT 2 MAX-INT */MOD -> MAX-INT 2 MAX-INT T*/MOD }T
-T{ MIN-INT 2 MIN-INT */MOD -> MIN-INT 2 MIN-INT T*/MOD }T
-
-\ ------------------------------------------------------------------------
-TESTING HERE , @ ! CELL+ CELLS C, C@ C! CHARS 2@ 2! ALIGN ALIGNED +! ALLOT
-
-HERE 1 ALLOT
-HERE
-CONSTANT 2NDA
-CONSTANT 1STA
-T{ 1STA 2NDA U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT
-T{ 1STA 1+ -> 2NDA }T \ ... BY ONE ADDRESS UNIT
-( MISSING TEST: NEGATIVE ALLOT )
-
-HERE 1 ,
-HERE 2 ,
-CONSTANT 2ND
-CONSTANT 1ST
-T{ 1ST 2ND U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT
-T{ 1ST CELL+ -> 2ND }T \ ... BY ONE CELL
-T{ 1ST 1 CELLS + -> 2ND }T
-T{ 1ST @ 2ND @ -> 1 2 }T
-T{ 5 1ST ! -> }T
-T{ 1ST @ 2ND @ -> 5 2 }T
-T{ 6 2ND ! -> }T
-T{ 1ST @ 2ND @ -> 5 6 }T
-T{ 1ST 2@ -> 6 5 }T
-T{ 2 1 1ST 2! -> }T
-T{ 1ST 2@ -> 2 1 }T
-T{ 1S 1ST ! 1ST @ -> 1S }T \ CAN STORE CELL-WIDE VALUE
-
-HERE 1 C,
-HERE 2 C,
-CONSTANT 2NDC
-CONSTANT 1STC
-T{ 1STC 2NDC U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT
-T{ 1STC CHAR+ -> 2NDC }T \ ... BY ONE CHAR
-T{ 1STC 1 CHARS + -> 2NDC }T
-T{ 1STC C@ 2NDC C@ -> 1 2 }T
-T{ 3 1STC C! -> }T
-T{ 1STC C@ 2NDC C@ -> 3 2 }T
-T{ 4 2NDC C! -> }T
-T{ 1STC C@ 2NDC C@ -> 3 4 }T
-
-ALIGN 1 ALLOT HERE ALIGN HERE 3 CELLS ALLOT
-CONSTANT A-ADDR CONSTANT UA-ADDR
-T{ UA-ADDR ALIGNED -> A-ADDR }T
-T{ 1 A-ADDR C! A-ADDR C@ -> 1 }T
-T{ 1234 A-ADDR ! A-ADDR @ -> 1234 }T
-T{ 123 456 A-ADDR 2! A-ADDR 2@ -> 123 456 }T
-T{ 2 A-ADDR CHAR+ C! A-ADDR CHAR+ C@ -> 2 }T
-T{ 3 A-ADDR CELL+ C! A-ADDR CELL+ C@ -> 3 }T
-T{ 1234 A-ADDR CELL+ ! A-ADDR CELL+ @ -> 1234 }T
-T{ 123 456 A-ADDR CELL+ 2! A-ADDR CELL+ 2@ -> 123 456 }T
-
-: BITS ( X -- U )
- 0 SWAP BEGIN DUP WHILE DUP MSB AND IF >R 1+ R> THEN 2* REPEAT DROP ;
-( CHARACTERS >= 1 AU, <= SIZE OF CELL, >= 8 BITS )
-T{ 1 CHARS 1 < -> <FALSE> }T
-T{ 1 CHARS 1 CELLS > -> <FALSE> }T
-( TBD: HOW TO FIND NUMBER OF BITS? )
-
-( CELLS >= 1 AU, INTEGRAL MULTIPLE OF CHAR SIZE, >= 16 BITS )
-T{ 1 CELLS 1 < -> <FALSE> }T
-T{ 1 CELLS 1 CHARS MOD -> 0 }T
-T{ 1S BITS 10 < -> <FALSE> }T
-
-T{ 0 1ST ! -> }T
-T{ 1 1ST +! -> }T
-T{ 1ST @ -> 1 }T
-T{ -1 1ST +! 1ST @ -> 0 }T
-
-\ ------------------------------------------------------------------------
-TESTING CHAR [CHAR] [ ] BL S"
-
-T{ BL -> 20 }T
-T{ CHAR X -> 58 }T
-T{ CHAR HELLO -> 48 }T
-T{ : GC1 [CHAR] X ; -> }T
-T{ : GC2 [CHAR] HELLO ; -> }T
-T{ GC1 -> 58 }T
-T{ GC2 -> 48 }T
-T{ : GC3 [ GC1 ] LITERAL ; -> }T
-T{ GC3 -> 58 }T
-T{ : GC4 S" XY" ; -> }T
-T{ GC4 SWAP DROP -> 2 }T
-T{ GC4 DROP DUP C@ SWAP CHAR+ C@ -> 58 59 }T
-
-\ ------------------------------------------------------------------------
-TESTING ' ['] FIND EXECUTE IMMEDIATE COUNT LITERAL POSTPONE STATE
-
-T{ : GT1 123 ; -> }T
-T{ ' GT1 EXECUTE -> 123 }T
-T{ : GT2 ['] GT1 ; IMMEDIATE -> }T
-T{ GT2 EXECUTE -> 123 }T
-HERE 3 C, CHAR G C, CHAR T C, CHAR 1 C, CONSTANT GT1STRING
-HERE 3 C, CHAR G C, CHAR T C, CHAR 2 C, CONSTANT GT2STRING
-T{ GT1STRING FIND -> ' GT1 -1 }T
-T{ GT2STRING FIND -> ' GT2 1 }T
-( HOW TO SEARCH FOR NON-EXISTENT WORD? )
-T{ : GT3 GT2 LITERAL ; -> }T
-T{ GT3 -> ' GT1 }T
-T{ GT1STRING COUNT -> GT1STRING CHAR+ 3 }T
-
-T{ : GT4 POSTPONE GT1 ; IMMEDIATE -> }T
-T{ : GT5 GT4 ; -> }T
-T{ GT5 -> 123 }T
-T{ : GT6 345 ; IMMEDIATE -> }T
-T{ : GT7 POSTPONE GT6 ; -> }T
-T{ GT7 -> 345 }T
-
-T{ : GT8 STATE @ ; IMMEDIATE -> }T
-T{ GT8 -> 0 }T
-T{ : GT9 GT8 LITERAL ; -> }T
-T{ GT9 0= -> <FALSE> }T
-
-\ ------------------------------------------------------------------------
-TESTING IF ELSE THEN BEGIN WHILE REPEAT UNTIL RECURSE
-
-T{ : GI1 IF 123 THEN ; -> }T
-T{ : GI2 IF 123 ELSE 234 THEN ; -> }T
-T{ 0 GI1 -> }T
-T{ 1 GI1 -> 123 }T
-T{ -1 GI1 -> 123 }T
-T{ 0 GI2 -> 234 }T
-T{ 1 GI2 -> 123 }T
-T{ -1 GI1 -> 123 }T
-
-T{ : GI3 BEGIN DUP 5 < WHILE DUP 1+ REPEAT ; -> }T
-T{ 0 GI3 -> 0 1 2 3 4 5 }T
-T{ 4 GI3 -> 4 5 }T
-T{ 5 GI3 -> 5 }T
-T{ 6 GI3 -> 6 }T
-
-T{ : GI4 BEGIN DUP 1+ DUP 5 > UNTIL ; -> }T
-T{ 3 GI4 -> 3 4 5 6 }T
-T{ 5 GI4 -> 5 6 }T
-T{ 6 GI4 -> 6 7 }T
-
-T{ : GI5 BEGIN DUP 2 > WHILE DUP 5 < WHILE DUP 1+ REPEAT 123 ELSE 345 THEN ; -> }T
-T{ 1 GI5 -> 1 345 }T
-T{ 2 GI5 -> 2 345 }T
-T{ 3 GI5 -> 3 4 5 123 }T
-T{ 4 GI5 -> 4 5 123 }T
-T{ 5 GI5 -> 5 123 }T
-
-T{ : GI6 ( N -- 0,1,..N ) DUP IF DUP >R 1- RECURSE R> THEN ; -> }T
-T{ 0 GI6 -> 0 }T
-T{ 1 GI6 -> 0 1 }T
-T{ 2 GI6 -> 0 1 2 }T
-T{ 3 GI6 -> 0 1 2 3 }T
-T{ 4 GI6 -> 0 1 2 3 4 }T
-
-\ ------------------------------------------------------------------------
-TESTING DO LOOP +LOOP I J UNLOOP LEAVE EXIT
-
-T{ : GD1 DO I LOOP ; -> }T
-T{ 4 1 GD1 -> 1 2 3 }T
-T{ 2 -1 GD1 -> -1 0 1 }T
-T{ MID-UINT+1 MID-UINT GD1 -> MID-UINT }T
-
-T{ : GD2 DO I -1 +LOOP ; -> }T
-T{ 1 4 GD2 -> 4 3 2 1 }T
-T{ -1 2 GD2 -> 2 1 0 -1 }T
-T{ MID-UINT MID-UINT+1 GD2 -> MID-UINT+1 MID-UINT }T
-
-T{ : GD3 DO 1 0 DO J LOOP LOOP ; -> }T
-T{ 4 1 GD3 -> 1 2 3 }T
-T{ 2 -1 GD3 -> -1 0 1 }T
-T{ MID-UINT+1 MID-UINT GD3 -> MID-UINT }T
-
-T{ : GD4 DO 1 0 DO J LOOP -1 +LOOP ; -> }T
-T{ 1 4 GD4 -> 4 3 2 1 }T
-T{ -1 2 GD4 -> 2 1 0 -1 }T
-T{ MID-UINT MID-UINT+1 GD4 -> MID-UINT+1 MID-UINT }T
-
-T{ : GD5 123 SWAP 0 DO I 4 > IF DROP 234 LEAVE THEN LOOP ; -> }T
-T{ 1 GD5 -> 123 }T
-T{ 5 GD5 -> 123 }T
-T{ 6 GD5 -> 234 }T
-
-T{ : GD6 ( PAT: T{0 0}T,T{0 0}TT{1 0}TT{1 1}T,T{0 0}TT{1 0}TT{1 1}TT{2 0}TT{2 1}TT{2 2}T )
- 0 SWAP 0 DO
- I 1+ 0 DO I J + 3 = IF I UNLOOP I UNLOOP EXIT THEN 1+ LOOP
- LOOP ; -> }T
-T{ 1 GD6 -> 1 }T
-T{ 2 GD6 -> 3 }T
-T{ 3 GD6 -> 4 1 2 }T
-
-\ ------------------------------------------------------------------------
-TESTING DEFINING WORDS: : ; CONSTANT VARIABLE CREATE DOES> >BODY
-
-T{ 123 CONSTANT X123 -> }T
-T{ X123 -> 123 }T
-T{ : EQU CONSTANT ; -> }T
-T{ X123 EQU Y123 -> }T
-T{ Y123 -> 123 }T
-
-T{ VARIABLE V1 -> }T
-T{ 123 V1 ! -> }T
-T{ V1 @ -> 123 }T
-
-T{ : NOP : POSTPONE ; ; -> }T
-T{ NOP NOP1 NOP NOP2 -> }T
-T{ NOP1 -> }T
-T{ NOP2 -> }T
-
-T{ : DOES1 DOES> @ 1 + ; -> }T
-T{ : DOES2 DOES> @ 2 + ; -> }T
-T{ CREATE CR1 -> }T
-T{ CR1 -> HERE }T
-T{ ' CR1 >BODY -> HERE }T
-T{ 1 , -> }T
-T{ CR1 @ -> 1 }T
-T{ DOES1 -> }T
-T{ CR1 -> 2 }T
-T{ DOES2 -> }T
-T{ CR1 -> 3 }T
-
-T{ : WEIRD: CREATE DOES> 1 + DOES> 2 + ; -> }T
-T{ WEIRD: W1 -> }T
-T{ ' W1 >BODY -> HERE }T
-T{ W1 -> HERE 1 + }T
-T{ W1 -> HERE 2 + }T
-
-\ ------------------------------------------------------------------------
-TESTING EVALUATE
-
-: GE1 S" 123" ; IMMEDIATE
-: GE2 S" 123 1+" ; IMMEDIATE
-: GE3 S" : GE4 345 ;" ;
-: GE5 EVALUATE ; IMMEDIATE
-
-T{ GE1 EVALUATE -> 123 }T ( TEST EVALUATE IN INTERP. STATE )
-T{ GE2 EVALUATE -> 124 }T
-T{ GE3 EVALUATE -> }T
-T{ GE4 -> 345 }T
-
-T{ : GE6 GE1 GE5 ; -> }T ( TEST EVALUATE IN COMPILE STATE )
-T{ GE6 -> 123 }T
-T{ : GE7 GE2 GE5 ; -> }T
-T{ GE7 -> 124 }T
-
-\ ------------------------------------------------------------------------
-TESTING SOURCE >IN WORD
-
-: GS1 S" SOURCE" 2DUP EVALUATE
- >R SWAP >R = R> R> = ;
-T{ GS1 -> <TRUE> <TRUE> }T
-
-VARIABLE SCANS
-: RESCAN? -1 SCANS +! SCANS @ IF 0 >IN ! THEN ;
-
-T{ 2 SCANS !
-345 RESCAN?
--> 345 345 }T
-
-: GS2 5 SCANS ! S" 123 RESCAN?" EVALUATE ;
-T{ GS2 -> 123 123 123 123 123 }T
-
-: GS3 WORD COUNT SWAP C@ ;
-T{ BL GS3 HELLO -> 5 CHAR H }T
-T{ CHAR " GS3 GOODBYE" -> 7 CHAR G }T
-T{ BL GS3
-DROP -> 0 }T \ BLANK LINE RETURN ZERO-LENGTH STRING
-
-: GS4 SOURCE >IN ! DROP ;
-T{ GS4 123 456
--> }T
-
-\ ------------------------------------------------------------------------
-TESTING <# # #S #> HOLD SIGN BASE >NUMBER HEX DECIMAL
-
-: S= \ ( ADDR1 C1 ADDR2 C2 -- T/F ) COMPARE TWO STRINGS.
- >R SWAP R@ = IF \ MAKE SURE STRINGS HAVE SAME LENGTH
- R> ?DUP IF \ IF NON-EMPTY STRINGS
- 0 DO
- OVER C@ OVER C@ - IF
- 2DROP <FALSE> UNLOOP EXIT THEN
- SWAP CHAR+ SWAP CHAR+
- LOOP
- THEN
- 2DROP <TRUE> \ IF WE GET HERE, STRINGS MATCH
- ELSE
- R> DROP 2DROP <FALSE> \ LENGTHS MISMATCH
- THEN ;
-
-: GP1 <# 41 HOLD 42 HOLD 0 0 #> S" BA" S= ;
-T{ GP1 -> <TRUE> }T
-
-: GP2 <# -1 SIGN 0 SIGN -1 SIGN 0 0 #> S" --" S= ;
-T{ GP2 -> <TRUE> }T
-
-: GP3 <# 1 0 # # #> S" 01" S= ;
-T{ GP3 -> <TRUE> }T
-
-: GP4 <# 1 0 #S #> S" 1" S= ;
-T{ GP4 -> <TRUE> }T
-
-24 CONSTANT MAX-BASE \ BASE 2 .. 36
-: COUNT-BITS
- 0 0 INVERT BEGIN DUP WHILE >R 1+ R> 2* REPEAT DROP ;
-COUNT-BITS 2* CONSTANT #BITS-UD \ NUMBER OF BITS IN UD
-
-: GP5
- BASE @ <TRUE>
- MAX-BASE 1+ 2 DO \ FOR EACH POSSIBLE BASE
- I BASE ! \ TBD: ASSUMES BASE WORKS
- I 0 <# #S #> S" 10" S= AND
- LOOP
- SWAP BASE ! ;
-T{ GP5 -> <TRUE> }T
-
-: GP6
- BASE @ >R 2 BASE !
- MAX-UINT MAX-UINT <# #S #> \ MAXIMUM UD TO BINARY
- R> BASE ! \ S: C-ADDR U
- DUP #BITS-UD = SWAP
- 0 DO \ S: C-ADDR FLAG
- OVER C@ [CHAR] 1 = AND \ ALL ONES
- >R CHAR+ R>
- LOOP SWAP DROP ;
-T{ GP6 -> <TRUE> }T
-
-: GP7
- BASE @ >R MAX-BASE BASE !
- <TRUE>
- A 0 DO
- I 0 <# #S #>
- 1 = SWAP C@ I 30 + = AND AND
- LOOP
- MAX-BASE A DO
- I 0 <# #S #>
- 1 = SWAP C@ 41 I A - + = AND AND
- LOOP
- R> BASE ! ;
-
-T{ GP7 -> <TRUE> }T
-
-\ >NUMBER TESTS
-CREATE GN-BUF 0 C,
-: GN-STRING GN-BUF 1 ;
-: GN-CONSUMED GN-BUF CHAR+ 0 ;
-: GN' [CHAR] ' WORD CHAR+ C@ GN-BUF C! GN-STRING ;
-
-T{ 0 0 GN' 0' >NUMBER -> 0 0 GN-CONSUMED }T
-T{ 0 0 GN' 1' >NUMBER -> 1 0 GN-CONSUMED }T
-T{ 1 0 GN' 1' >NUMBER -> BASE @ 1+ 0 GN-CONSUMED }T
-T{ 0 0 GN' -' >NUMBER -> 0 0 GN-STRING }T \ SHOULD FAIL TO CONVERT THESE
-T{ 0 0 GN' +' >NUMBER -> 0 0 GN-STRING }T
-T{ 0 0 GN' .' >NUMBER -> 0 0 GN-STRING }T
-
-: >NUMBER-BASED
- BASE @ >R BASE ! >NUMBER R> BASE ! ;
-
-T{ 0 0 GN' 2' 10 >NUMBER-BASED -> 2 0 GN-CONSUMED }T
-T{ 0 0 GN' 2' 2 >NUMBER-BASED -> 0 0 GN-STRING }T
-T{ 0 0 GN' F' 10 >NUMBER-BASED -> F 0 GN-CONSUMED }T
-T{ 0 0 GN' G' 10 >NUMBER-BASED -> 0 0 GN-STRING }T
-T{ 0 0 GN' G' MAX-BASE >NUMBER-BASED -> 10 0 GN-CONSUMED }T
-T{ 0 0 GN' Z' MAX-BASE >NUMBER-BASED -> 23 0 GN-CONSUMED }T
-
-: GN1 \ ( UD BASE -- UD' LEN ) UD SHOULD EQUAL UD' AND LEN SHOULD BE ZERO.
- BASE @ >R BASE !
- <# #S #>
- 0 0 2SWAP >NUMBER SWAP DROP \ RETURN LENGTH ONLY
- R> BASE ! ;
-T{ 0 0 2 GN1 -> 0 0 0 }T
-T{ MAX-UINT 0 2 GN1 -> MAX-UINT 0 0 }T
-T{ MAX-UINT DUP 2 GN1 -> MAX-UINT DUP 0 }T
-T{ 0 0 MAX-BASE GN1 -> 0 0 0 }T
-T{ MAX-UINT 0 MAX-BASE GN1 -> MAX-UINT 0 0 }T
-T{ MAX-UINT DUP MAX-BASE GN1 -> MAX-UINT DUP 0 }T
-
-: GN2 \ ( -- 16 10 )
- BASE @ >R HEX BASE @ DECIMAL BASE @ R> BASE ! ;
-T{ GN2 -> 10 A }T
-
-\ ------------------------------------------------------------------------
-TESTING FILL MOVE
-
-CREATE FBUF 00 C, 00 C, 00 C,
-CREATE SBUF 12 C, 34 C, 56 C,
-: SEEBUF FBUF C@ FBUF CHAR+ C@ FBUF CHAR+ CHAR+ C@ ;
-
-T{ FBUF 0 20 FILL -> }T
-T{ SEEBUF -> 00 00 00 }T
-
-T{ FBUF 1 20 FILL -> }T
-T{ SEEBUF -> 20 00 00 }T
-
-T{ FBUF 3 20 FILL -> }T
-T{ SEEBUF -> 20 20 20 }T
-
-T{ FBUF FBUF 3 CHARS MOVE -> }T \ BIZARRE SPECIAL CASE
-T{ SEEBUF -> 20 20 20 }T
-
-T{ SBUF FBUF 0 CHARS MOVE -> }T
-T{ SEEBUF -> 20 20 20 }T
-
-T{ SBUF FBUF 1 CHARS MOVE -> }T
-T{ SEEBUF -> 12 20 20 }T
-
-T{ SBUF FBUF 3 CHARS MOVE -> }T
-T{ SEEBUF -> 12 34 56 }T
-
-T{ FBUF FBUF CHAR+ 2 CHARS MOVE -> }T
-T{ SEEBUF -> 12 12 34 }T
-
-T{ FBUF CHAR+ FBUF 2 CHARS MOVE -> }T
-T{ SEEBUF -> 12 34 34 }T
-
-\ ------------------------------------------------------------------------
-TESTING OUTPUT: . ." CR EMIT SPACE SPACES TYPE U.
-
-: OUTPUT-TEST
- ." YOU SHOULD SEE THE STANDARD GRAPHIC CHARACTERS:" CR
- 41 BL DO I EMIT LOOP CR
- 61 41 DO I EMIT LOOP CR
- 7F 61 DO I EMIT LOOP CR
- ." YOU SHOULD SEE 0-9 SEPARATED BY A SPACE:" CR
- 9 1+ 0 DO I . LOOP CR
- ." YOU SHOULD SEE 0-9 (WITH NO SPACES):" CR
- [CHAR] 9 1+ [CHAR] 0 DO I 0 SPACES EMIT LOOP CR
- ." YOU SHOULD SEE A-G SEPARATED BY A SPACE:" CR
- [CHAR] G 1+ [CHAR] A DO I EMIT SPACE LOOP CR
- ." YOU SHOULD SEE 0-5 SEPARATED BY TWO SPACES:" CR
- 5 1+ 0 DO I [CHAR] 0 + EMIT 2 SPACES LOOP CR
- ." YOU SHOULD SEE TWO SEPARATE LINES:" CR
- S" LINE 1" TYPE CR S" LINE 2" TYPE CR
- ." YOU SHOULD SEE THE NUMBER RANGES OF SIGNED AND UNSIGNED NUMBERS:" CR
- ." SIGNED: " MIN-INT . MAX-INT . CR
- ." UNSIGNED: " 0 U. MAX-UINT U. CR
-;
-
-T{ OUTPUT-TEST -> }T
-\ ------------------------------------------------------------------------
-TESTING INPUT: ACCEPT
-
-CREATE ABUF 80 CHARS ALLOT
-
-: ACCEPT-TEST
- CR ." PLEASE TYPE UP TO 80 CHARACTERS:" CR
- ABUF 80 ACCEPT
- CR ." RECEIVED: " [CHAR] " EMIT
- ABUF SWAP TYPE [CHAR] " EMIT CR
-;
-
-T{ ACCEPT-TEST -> }T
-Vingt fois sur le métier remettez votre ouvrage, ...
-\ ------------------------------------------------------------------------
-TESTING DICTIONARY SEARCH RULES
-
-T{ : GDX 123 ; : GDX GDX 234 ; -> }T
-
-T{ GDX -> 123 234 }T
-
-CR .( End of Core word set tests) CR
-
-
-
-RST_STATE ; so ANS_COMPLEMENT_xx_MPY is conserved ;
-\ NOECHO ; if an error occurs, comment this line before new download to find it.
-
-
-\ From: John Hayes S1I
-\ Subject: tester.fr
-\ Date: Mon, 27 Nov 95 13:10:09 PST
-
-\ (C) 1995 JOHNS HOPKINS UNIVERSITY / APPLIED PHYSICS LABORATORY
-\ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS.
-\ VERSION 1.1
-
-\ 22/1/09 The words { and } have been changed to T{ and }T respectively to
-\ agree with the Forth 200X file ttester.fs. This avoids clashes with
-\ locals using { ... } and the FSL use of }
-
-
-\ 13/05/14 jmt. added colorised error messages.
-
-
-
- 0 CONSTANT FALSE
--1 CONSTANT TRUE
-
-\ SET THE FOLLOWING FLAG TO TRUE FOR MORE VERBOSE OUTPUT; THIS MAY
-\ ALLOW YOU TO TELL WHICH TEST CAUSED YOUR SYSTEM TO HANG.
-VARIABLE VERBOSE
- FALSE VERBOSE !
-\ TRUE VERBOSE !
-
-\ : EMPTY-STACK ( ... -- ) \ EMPTY STACK: HANDLES UNDERFLOWED STACK TOO.
-\ DEPTH ?DUP
-\ IF DUP 0< IF NEGATE 0
-\ DO 0 LOOP
-\ ELSE 0 DO DROP LOOP THEN
-\ THEN ;
-\
-\ : ERROR \ ( C-ADDR U -- ) DISPLAY AN ERROR MESSAGE FOLLOWED BY
-\ \ THE LINE THAT HAD THE ERROR.
-\ TYPE SOURCE TYPE CR \ DISPLAY LINE CORRESPONDING TO ERROR
-\ EMPTY-STACK \ THROW AWAY EVERY THING ELSE
-\ QUIT \ *** Uncomment this line to QUIT on an error
-\ ;
-
-VARIABLE ACTUAL-DEPTH \ STACK RECORD
-CREATE ACTUAL-RESULTS 20 CELLS ALLOT
-
-: T{ \ ( -- ) SYNTACTIC SUGAR.
- ;
-
-: -> \ ( ... -- ) RECORD DEPTH AND CONTENT OF STACK.
- DEPTH DUP ACTUAL-DEPTH ! \ RECORD DEPTH
- ?DUP IF \ IF THERE IS SOMETHING ON STACK
- 0 DO ACTUAL-RESULTS I CELLS + ! LOOP \ SAVE THEM
- THEN ;
-
-: }T \ ( ... -- ) COMPARE STACK (EXPECTED) CONTENTS WITH SAVED
- \ (ACTUAL) CONTENTS.
- DEPTH ACTUAL-DEPTH @ = IF \ IF DEPTHS MATCH
- DEPTH ?DUP IF \ IF THERE IS SOMETHING ON THE STACK
- 0 DO \ FOR EACH STACK ITEM
- ACTUAL-RESULTS I CELLS + @ \ COMPARE ACTUAL WITH EXPECTED
-\ = 0= IF S" INCORRECT RESULT: " ERROR LEAVE THEN \ jmt
- = 0= IF ABORT" INCORRECT RESULT: " THEN \ jmt : colorised message
- LOOP
- THEN
- ELSE \ DEPTH MISMATCH
-\ S" WRONG NUMBER OF RESULTS: " ERROR \ jmt
- ABORT" WRONG NUMBER OF RESULTS: " \ jmt : colorised message
- THEN ;
-
-: TESTING \ ( -- ) TALKING COMMENT.
- SOURCE VERBOSE @
- IF DUP >R TYPE CR R> >IN !
- ELSE >IN ! DROP [CHAR] * EMIT
- THEN ;
-
-\ From: John Hayes S1I
-\ Subject: core.fr
-\ Date: Mon, 27 Nov 95 13:10
-
-\ (C) 1995 JOHNS HOPKINS UNIVERSITY / APPLIED PHYSICS LABORATORY
-\ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS.
-\ VERSION 1.2
-\ THIS PROGRAM TESTS THE CORE WORDS OF AN ANS FORTH SYSTEM.
-\ THE PROGRAM ASSUMES A TWO'S COMPLEMENT IMPLEMENTATION WHERE
-\ THE RANGE OF SIGNED NUMBERS IS -2^(N-1) ... 2^(N-1)-1 AND
-\ THE RANGE OF UNSIGNED NUMBERS IS 0 ... 2^(N)-1.
-\ I HAVEN'T FIGURED OUT HOW TO TEST KEY, QUIT, ABORT, OR ABORT"...
-\ I ALSO HAVEN'T THOUGHT OF A WAY TO TEST ENVIRONMENT?...
-
-CR
-TESTING CORE WORDS
-HEX
-
-\ ------------------------------------------------------------------------
-TESTING BASIC ASSUMPTIONS
-
-T{ -> }T \ START WITH CLEAN SLATE
-( TEST IF ANY BITS ARE SET; ANSWER IN BASE 1 )
-T{ : BITSSET? IF 0 0 ELSE 0 THEN ; -> }T
-T{ 0 BITSSET? -> 0 }T ( ZERO IS ALL BITS CLEAR )
-T{ 1 BITSSET? -> 0 0 }T ( OTHER NUMBER HAVE AT LEAST ONE BIT )
-T{ -1 BITSSET? -> 0 0 }T
-
-\ ------------------------------------------------------------------------
-TESTING BOOLEANS: INVERT AND OR XOR
-
-T{ 0 0 AND -> 0 }T
-T{ 0 1 AND -> 0 }T
-T{ 1 0 AND -> 0 }T
-T{ 1 1 AND -> 1 }T
-
-T{ 0 INVERT 1 AND -> 1 }T
-T{ 1 INVERT 1 AND -> 0 }T
-
-0 CONSTANT 0S
-0 INVERT CONSTANT 1S
-
-T{ 0S INVERT -> 1S }T
-T{ 1S INVERT -> 0S }T
-
-T{ 0S 0S AND -> 0S }T
-T{ 0S 1S AND -> 0S }T
-T{ 1S 0S AND -> 0S }T
-T{ 1S 1S AND -> 1S }T
-
-T{ 0S 0S OR -> 0S }T
-T{ 0S 1S OR -> 1S }T
-T{ 1S 0S OR -> 1S }T
-T{ 1S 1S OR -> 1S }T
-
-T{ 0S 0S XOR -> 0S }T
-T{ 0S 1S XOR -> 1S }T
-T{ 1S 0S XOR -> 1S }T
-T{ 1S 1S XOR -> 0S }T
-
-\ ------------------------------------------------------------------------
-TESTING 2* 2/ LSHIFT RSHIFT
-
-( WE TRUST 1S, INVERT, AND BITSSET?; WE WILL CONFIRM RSHIFT LATER )
-1S 1 RSHIFT INVERT CONSTANT MSB
-T{ MSB BITSSET? -> 0 0 }T
-
-T{ 0S 2* -> 0S }T
-T{ 1 2* -> 2 }T
-T{ 4000 2* -> 8000 }T
-T{ 1S 2* 1 XOR -> 1S }T
-T{ MSB 2* -> 0S }T
-
-T{ 0S 2/ -> 0S }T
-T{ 1 2/ -> 0 }T
-T{ 4000 2/ -> 2000 }T
-T{ 1S 2/ -> 1S }T \ MSB PROPOGATED
-T{ 1S 1 XOR 2/ -> 1S }T
-T{ MSB 2/ MSB AND -> MSB }T
-
-T{ 1 0 LSHIFT -> 1 }T
-T{ 1 1 LSHIFT -> 2 }T
-T{ 1 2 LSHIFT -> 4 }T
-T{ 1 F LSHIFT -> 8000 }T \ BIGGEST GUARANTEED SHIFT
-T{ 1S 1 LSHIFT 1 XOR -> 1S }T
-T{ MSB 1 LSHIFT -> 0 }T
-
-T{ 1 0 RSHIFT -> 1 }T
-T{ 1 1 RSHIFT -> 0 }T
-T{ 2 1 RSHIFT -> 1 }T
-T{ 4 2 RSHIFT -> 1 }T
-T{ 8000 F RSHIFT -> 1 }T \ BIGGEST
-T{ MSB 1 RSHIFT MSB AND -> 0 }T \ RSHIFT ZERO FILLS MSBS
-T{ MSB 1 RSHIFT 2* -> MSB }T
-
-\ ------------------------------------------------------------------------
-TESTING COMPARISONS: 0= = 0< < > U< MIN MAX
-0 INVERT CONSTANT MAX-UINT
-0 INVERT 1 RSHIFT CONSTANT MAX-INT
-0 INVERT 1 RSHIFT INVERT CONSTANT MIN-INT
-0 INVERT 1 RSHIFT CONSTANT MID-UINT
-0 INVERT 1 RSHIFT INVERT CONSTANT MID-UINT+1
-
-0S CONSTANT <FALSE>
-1S CONSTANT <TRUE>
-
-T{ 0 0= -> <TRUE> }T
-T{ 1 0= -> <FALSE> }T
-T{ 2 0= -> <FALSE> }T
-T{ -1 0= -> <FALSE> }T
-T{ MAX-UINT 0= -> <FALSE> }T
-T{ MIN-INT 0= -> <FALSE> }T
-T{ MAX-INT 0= -> <FALSE> }T
-
-T{ 0 0 = -> <TRUE> }T
-T{ 1 1 = -> <TRUE> }T
-T{ -1 -1 = -> <TRUE> }T
-T{ 1 0 = -> <FALSE> }T
-T{ -1 0 = -> <FALSE> }T
-T{ 0 1 = -> <FALSE> }T
-T{ 0 -1 = -> <FALSE> }T
-
-T{ 0 0< -> <FALSE> }T
-T{ -1 0< -> <TRUE> }T
-T{ MIN-INT 0< -> <TRUE> }T
-T{ 1 0< -> <FALSE> }T
-T{ MAX-INT 0< -> <FALSE> }T
-
-T{ 0 1 < -> <TRUE> }T
-T{ 1 2 < -> <TRUE> }T
-T{ -1 0 < -> <TRUE> }T
-T{ -1 1 < -> <TRUE> }T
-T{ MIN-INT 0 < -> <TRUE> }T
-T{ MIN-INT MAX-INT < -> <TRUE> }T
-T{ 0 MAX-INT < -> <TRUE> }T
-T{ 0 0 < -> <FALSE> }T
-T{ 1 1 < -> <FALSE> }T
-T{ 1 0 < -> <FALSE> }T
-T{ 2 1 < -> <FALSE> }T
-T{ 0 -1 < -> <FALSE> }T
-T{ 1 -1 < -> <FALSE> }T
-T{ 0 MIN-INT < -> <FALSE> }T
-T{ MAX-INT MIN-INT < -> <FALSE> }T
-T{ MAX-INT 0 < -> <FALSE> }T
-
-T{ 0 1 > -> <FALSE> }T
-T{ 1 2 > -> <FALSE> }T
-T{ -1 0 > -> <FALSE> }T
-T{ -1 1 > -> <FALSE> }T
-T{ MIN-INT 0 > -> <FALSE> }T
-T{ MIN-INT MAX-INT > -> <FALSE> }T
-T{ 0 MAX-INT > -> <FALSE> }T
-T{ 0 0 > -> <FALSE> }T
-T{ 1 1 > -> <FALSE> }T
-T{ 1 0 > -> <TRUE> }T
-T{ 2 1 > -> <TRUE> }T
-T{ 0 -1 > -> <TRUE> }T
-T{ 1 -1 > -> <TRUE> }T
-T{ 0 MIN-INT > -> <TRUE> }T
-T{ MAX-INT MIN-INT > -> <TRUE> }T
-T{ MAX-INT 0 > -> <TRUE> }T
-
-T{ 0 1 U< -> <TRUE> }T
-T{ 1 2 U< -> <TRUE> }T
-T{ 0 MID-UINT U< -> <TRUE> }T
-T{ 0 MAX-UINT U< -> <TRUE> }T
-T{ MID-UINT MAX-UINT U< -> <TRUE> }T
-T{ 0 0 U< -> <FALSE> }T
-T{ 1 1 U< -> <FALSE> }T
-T{ 1 0 U< -> <FALSE> }T
-T{ 2 1 U< -> <FALSE> }T
-T{ MID-UINT 0 U< -> <FALSE> }T
-T{ MAX-UINT 0 U< -> <FALSE> }T
-T{ MAX-UINT MID-UINT U< -> <FALSE> }T
-
-T{ 0 1 MIN -> 0 }T
-T{ 1 2 MIN -> 1 }T
-T{ -1 0 MIN -> -1 }T
-T{ -1 1 MIN -> -1 }T
-T{ MIN-INT 0 MIN -> MIN-INT }T
-T{ MIN-INT MAX-INT MIN -> MIN-INT }T
-T{ 0 MAX-INT MIN -> 0 }T
-T{ 0 0 MIN -> 0 }T
-T{ 1 1 MIN -> 1 }T
-T{ 1 0 MIN -> 0 }T
-T{ 2 1 MIN -> 1 }T
-T{ 0 -1 MIN -> -1 }T
-T{ 1 -1 MIN -> -1 }T
-T{ 0 MIN-INT MIN -> MIN-INT }T
-T{ MAX-INT MIN-INT MIN -> MIN-INT }T
-T{ MAX-INT 0 MIN -> 0 }T
-
-T{ 0 1 MAX -> 1 }T
-T{ 1 2 MAX -> 2 }T
-T{ -1 0 MAX -> 0 }T
-T{ -1 1 MAX -> 1 }T
-T{ MIN-INT 0 MAX -> 0 }T
-T{ MIN-INT MAX-INT MAX -> MAX-INT }T
-T{ 0 MAX-INT MAX -> MAX-INT }T
-T{ 0 0 MAX -> 0 }T
-T{ 1 1 MAX -> 1 }T
-T{ 1 0 MAX -> 1 }T
-T{ 2 1 MAX -> 2 }T
-T{ 0 -1 MAX -> 0 }T
-T{ 1 -1 MAX -> 1 }T
-T{ 0 MIN-INT MAX -> 0 }T
-T{ MAX-INT MIN-INT MAX -> MAX-INT }T
-T{ MAX-INT 0 MAX -> MAX-INT }T
-
-\ ------------------------------------------------------------------------
-TESTING STACK OPS: 2DROP 2DUP 2OVER 2SWAP ?DUP DEPTH DROP DUP OVER ROT SWAP
-
-T{ 1 2 2DROP -> }T
-T{ 1 2 2DUP -> 1 2 1 2 }T
-T{ 1 2 3 4 2OVER -> 1 2 3 4 1 2 }T
-T{ 1 2 3 4 2SWAP -> 3 4 1 2 }T
-T{ 0 ?DUP -> 0 }T
-T{ 1 ?DUP -> 1 1 }T
-T{ -1 ?DUP -> -1 -1 }T
-T{ DEPTH -> 0 }T
-T{ 0 DEPTH -> 0 1 }T
-T{ 0 1 DEPTH -> 0 1 2 }T
-T{ 0 DROP -> }T
-T{ 1 2 DROP -> 1 }T
-T{ 1 DUP -> 1 1 }T
-T{ 1 2 OVER -> 1 2 1 }T
-T{ 1 2 3 ROT -> 2 3 1 }T
-T{ 1 2 SWAP -> 2 1 }T
-
-\ ------------------------------------------------------------------------
-TESTING >R R> R@
-
-T{ : GR1 >R R> ; -> }T
-T{ : GR2 >R R@ R> DROP ; -> }T
-T{ 123 GR1 -> 123 }T
-T{ 123 GR2 -> 123 }T
-T{ 1S GR1 -> 1S }T ( RETURN STACK HOLDS CELLS )
-
-\ ------------------------------------------------------------------------
-TESTING ADD/SUBTRACT: + - 1+ 1- ABS NEGATE
-
-T{ 0 5 + -> 5 }T
-T{ 5 0 + -> 5 }T
-T{ 0 -5 + -> -5 }T
-T{ -5 0 + -> -5 }T
-T{ 1 2 + -> 3 }T
-T{ 1 -2 + -> -1 }T
-T{ -1 2 + -> 1 }T
-T{ -1 -2 + -> -3 }T
-T{ -1 1 + -> 0 }T
-T{ MID-UINT 1 + -> MID-UINT+1 }T
-
-T{ 0 5 - -> -5 }T
-T{ 5 0 - -> 5 }T
-T{ 0 -5 - -> 5 }T
-T{ -5 0 - -> -5 }T
-T{ 1 2 - -> -1 }T
-T{ 1 -2 - -> 3 }T
-T{ -1 2 - -> -3 }T
-T{ -1 -2 - -> 1 }T
-T{ 0 1 - -> -1 }T
-T{ MID-UINT+1 1 - -> MID-UINT }T
-
-T{ 0 1+ -> 1 }T
-T{ -1 1+ -> 0 }T
-T{ 1 1+ -> 2 }T
-T{ MID-UINT 1+ -> MID-UINT+1 }T
-
-T{ 2 1- -> 1 }T
-T{ 1 1- -> 0 }T
-T{ 0 1- -> -1 }T
-T{ MID-UINT+1 1- -> MID-UINT }T
-
-T{ 0 NEGATE -> 0 }T
-T{ 1 NEGATE -> -1 }T
-T{ -1 NEGATE -> 1 }T
-T{ 2 NEGATE -> -2 }T
-T{ -2 NEGATE -> 2 }T
-
-T{ 0 ABS -> 0 }T
-T{ 1 ABS -> 1 }T
-T{ -1 ABS -> 1 }T
-T{ MIN-INT ABS -> MID-UINT+1 }T
-
-\ ------------------------------------------------------------------------
-TESTING MULTIPLY: S>D * M* UM*
-
-T{ 0 S>D -> 0 0 }T
-T{ 1 S>D -> 1 0 }T
-T{ 2 S>D -> 2 0 }T
-T{ -1 S>D -> -1 -1 }T
-T{ -2 S>D -> -2 -1 }T
-T{ MIN-INT S>D -> MIN-INT -1 }T
-T{ MAX-INT S>D -> MAX-INT 0 }T
-
-T{ 0 0 M* -> 0 S>D }T
-T{ 0 1 M* -> 0 S>D }T
-T{ 1 0 M* -> 0 S>D }T
-T{ 1 2 M* -> 2 S>D }T
-T{ 2 1 M* -> 2 S>D }T
-T{ 3 3 M* -> 9 S>D }T
-T{ -3 3 M* -> -9 S>D }T
-T{ 3 -3 M* -> -9 S>D }T
-T{ -3 -3 M* -> 9 S>D }T
-T{ 0 MIN-INT M* -> 0 S>D }T
-T{ 1 MIN-INT M* -> MIN-INT S>D }T
-T{ 2 MIN-INT M* -> 0 1S }T
-T{ 0 MAX-INT M* -> 0 S>D }T
-T{ 1 MAX-INT M* -> MAX-INT S>D }T
-T{ 2 MAX-INT M* -> MAX-INT 1 LSHIFT 0 }T
-T{ MIN-INT MIN-INT M* -> 0 MSB 1 RSHIFT }T
-T{ MAX-INT MIN-INT M* -> MSB MSB 2/ }T
-T{ MAX-INT MAX-INT M* -> 1 MSB 2/ INVERT }T
-
-T{ 0 0 * -> 0 }T \ TEST IDENTITIES
-T{ 0 1 * -> 0 }T
-T{ 1 0 * -> 0 }T
-T{ 1 2 * -> 2 }T
-T{ 2 1 * -> 2 }T
-T{ 3 3 * -> 9 }T
-T{ -3 3 * -> -9 }T
-T{ 3 -3 * -> -9 }T
-T{ -3 -3 * -> 9 }T
-
-T{ MID-UINT+1 1 RSHIFT 2 * -> MID-UINT+1 }T
-T{ MID-UINT+1 2 RSHIFT 4 * -> MID-UINT+1 }T
-T{ MID-UINT+1 1 RSHIFT MID-UINT+1 OR 2 * -> MID-UINT+1 }T
-
-T{ 0 0 UM* -> 0 0 }T
-T{ 0 1 UM* -> 0 0 }T
-T{ 1 0 UM* -> 0 0 }T
-T{ 1 2 UM* -> 2 0 }T
-T{ 2 1 UM* -> 2 0 }T
-T{ 3 3 UM* -> 9 0 }T
-
-T{ MID-UINT+1 1 RSHIFT 2 UM* -> MID-UINT+1 0 }T
-T{ MID-UINT+1 2 UM* -> 0 1 }T
-T{ MID-UINT+1 4 UM* -> 0 2 }T
-T{ 1S 2 UM* -> 1S 1 LSHIFT 1 }T
-T{ MAX-UINT MAX-UINT UM* -> 1 1 INVERT }T
-
-\ ------------------------------------------------------------------------
-TESTING DIVIDE: FM/MOD SM/REM UM/MOD */ */MOD / /MOD MOD
-
-T{ 0 S>D 1 FM/MOD -> 0 0 }T
-T{ 1 S>D 1 FM/MOD -> 0 1 }T
-T{ 2 S>D 1 FM/MOD -> 0 2 }T
-T{ -1 S>D 1 FM/MOD -> 0 -1 }T
-T{ -2 S>D 1 FM/MOD -> 0 -2 }T
-T{ 0 S>D -1 FM/MOD -> 0 0 }T
-T{ 1 S>D -1 FM/MOD -> 0 -1 }T
-T{ 2 S>D -1 FM/MOD -> 0 -2 }T
-T{ -1 S>D -1 FM/MOD -> 0 1 }T
-T{ -2 S>D -1 FM/MOD -> 0 2 }T
-T{ 2 S>D 2 FM/MOD -> 0 1 }T
-T{ -1 S>D -1 FM/MOD -> 0 1 }T
-T{ -2 S>D -2 FM/MOD -> 0 1 }T
-T{ 7 S>D 3 FM/MOD -> 1 2 }T
-T{ 7 S>D -3 FM/MOD -> -2 -3 }T
-T{ -7 S>D 3 FM/MOD -> 2 -3 }T
-T{ -7 S>D -3 FM/MOD -> -1 2 }T
-T{ MAX-INT S>D 1 FM/MOD -> 0 MAX-INT }T
-T{ MIN-INT S>D 1 FM/MOD -> 0 MIN-INT }T
-T{ MAX-INT S>D MAX-INT FM/MOD -> 0 1 }T
-T{ MIN-INT S>D MIN-INT FM/MOD -> 0 1 }T
-T{ 1S 1 4 FM/MOD -> 3 MAX-INT }T
-T{ 1 MIN-INT M* 1 FM/MOD -> 0 MIN-INT }T
-T{ 1 MIN-INT M* MIN-INT FM/MOD -> 0 1 }T
-T{ 2 MIN-INT M* 2 FM/MOD -> 0 MIN-INT }T
-T{ 2 MIN-INT M* MIN-INT FM/MOD -> 0 2 }T
-T{ 1 MAX-INT M* 1 FM/MOD -> 0 MAX-INT }T
-T{ 1 MAX-INT M* MAX-INT FM/MOD -> 0 1 }T
-T{ 2 MAX-INT M* 2 FM/MOD -> 0 MAX-INT }T
-T{ 2 MAX-INT M* MAX-INT FM/MOD -> 0 2 }T
-T{ MIN-INT MIN-INT M* MIN-INT FM/MOD -> 0 MIN-INT }T
-T{ MIN-INT MAX-INT M* MIN-INT FM/MOD -> 0 MAX-INT }T
-T{ MIN-INT MAX-INT M* MAX-INT FM/MOD -> 0 MIN-INT }T
-T{ MAX-INT MAX-INT M* MAX-INT FM/MOD -> 0 MAX-INT }T
-
-T{ 0 S>D 1 SM/REM -> 0 0 }T
-T{ 1 S>D 1 SM/REM -> 0 1 }T
-T{ 2 S>D 1 SM/REM -> 0 2 }T
-T{ -1 S>D 1 SM/REM -> 0 -1 }T
-T{ -2 S>D 1 SM/REM -> 0 -2 }T
-T{ 0 S>D -1 SM/REM -> 0 0 }T
-T{ 1 S>D -1 SM/REM -> 0 -1 }T
-T{ 2 S>D -1 SM/REM -> 0 -2 }T
-T{ -1 S>D -1 SM/REM -> 0 1 }T
-T{ -2 S>D -1 SM/REM -> 0 2 }T
-T{ 2 S>D 2 SM/REM -> 0 1 }T
-T{ -1 S>D -1 SM/REM -> 0 1 }T
-T{ -2 S>D -2 SM/REM -> 0 1 }T
-T{ 7 S>D 3 SM/REM -> 1 2 }T
-T{ 7 S>D -3 SM/REM -> 1 -2 }T
-T{ -7 S>D 3 SM/REM -> -1 -2 }T
-T{ -7 S>D -3 SM/REM -> -1 2 }T
-T{ MAX-INT S>D 1 SM/REM -> 0 MAX-INT }T
-T{ MIN-INT S>D 1 SM/REM -> 0 MIN-INT }T
-T{ MAX-INT S>D MAX-INT SM/REM -> 0 1 }T
-T{ MIN-INT S>D MIN-INT SM/REM -> 0 1 }T
-T{ 1S 1 4 SM/REM -> 3 MAX-INT }T
-T{ 2 MIN-INT M* 2 SM/REM -> 0 MIN-INT }T
-T{ 2 MIN-INT M* MIN-INT SM/REM -> 0 2 }T
-T{ 2 MAX-INT M* 2 SM/REM -> 0 MAX-INT }T
-T{ 2 MAX-INT M* MAX-INT SM/REM -> 0 2 }T
-T{ MIN-INT MIN-INT M* MIN-INT SM/REM -> 0 MIN-INT }T
-T{ MIN-INT MAX-INT M* MIN-INT SM/REM -> 0 MAX-INT }T
-T{ MIN-INT MAX-INT M* MAX-INT SM/REM -> 0 MIN-INT }T
-T{ MAX-INT MAX-INT M* MAX-INT SM/REM -> 0 MAX-INT }T
-
-T{ 0 0 1 UM/MOD -> 0 0 }T
-T{ 1 0 1 UM/MOD -> 0 1 }T
-T{ 1 0 2 UM/MOD -> 1 0 }T
-T{ 3 0 2 UM/MOD -> 1 1 }T
-T{ MAX-UINT 2 UM* 2 UM/MOD -> 0 MAX-UINT }T
-T{ MAX-UINT 2 UM* MAX-UINT UM/MOD -> 0 2 }T
-T{ MAX-UINT MAX-UINT UM* MAX-UINT UM/MOD -> 0 MAX-UINT }T
-
-: IFFLOORED
- [ -3 2 / -2 = INVERT ] LITERAL IF POSTPONE \ THEN ;
-
-: IFSYM
- [ -3 2 / -1 = INVERT ] LITERAL IF POSTPONE \ THEN ;
-
-\ THE SYSTEM MIGHT DO EITHER FLOORED OR SYMMETRIC DIVISION.
-\ SINCE WE HAVE ALREADY TESTED M*, FM/MOD, AND SM/REM WE CAN USE THEM IN TEST.
-
-IFFLOORED : T/MOD >R S>D R> FM/MOD ;
-IFFLOORED : T/ T/MOD SWAP DROP ;
-IFFLOORED : TMOD T/MOD DROP ;
-IFFLOORED : T*/MOD >R M* R> FM/MOD ;
-IFFLOORED : T*/ T*/MOD SWAP DROP ;
-IFSYM : T/MOD >R S>D R> SM/REM ;
-IFSYM : T/ T/MOD SWAP DROP ;
-IFSYM : TMOD T/MOD DROP ;
-IFSYM : T*/MOD >R M* R> SM/REM ;
-IFSYM : T*/ T*/MOD SWAP DROP ;
-
-T{ 0 1 /MOD -> 0 1 T/MOD }T
-T{ 1 1 /MOD -> 1 1 T/MOD }T
-T{ 2 1 /MOD -> 2 1 T/MOD }T
-T{ -1 1 /MOD -> -1 1 T/MOD }T
-T{ -2 1 /MOD -> -2 1 T/MOD }T
-T{ 0 -1 /MOD -> 0 -1 T/MOD }T
-T{ 1 -1 /MOD -> 1 -1 T/MOD }T
-T{ 2 -1 /MOD -> 2 -1 T/MOD }T
-T{ -1 -1 /MOD -> -1 -1 T/MOD }T
-T{ -2 -1 /MOD -> -2 -1 T/MOD }T
-T{ 2 2 /MOD -> 2 2 T/MOD }T
-T{ -1 -1 /MOD -> -1 -1 T/MOD }T
-T{ -2 -2 /MOD -> -2 -2 T/MOD }T
-T{ 7 3 /MOD -> 7 3 T/MOD }T
-T{ 7 -3 /MOD -> 7 -3 T/MOD }T
-T{ -7 3 /MOD -> -7 3 T/MOD }T
-T{ -7 -3 /MOD -> -7 -3 T/MOD }T
-T{ MAX-INT 1 /MOD -> MAX-INT 1 T/MOD }T
-T{ MIN-INT 1 /MOD -> MIN-INT 1 T/MOD }T
-T{ MAX-INT MAX-INT /MOD -> MAX-INT MAX-INT T/MOD }T
-T{ MIN-INT MIN-INT /MOD -> MIN-INT MIN-INT T/MOD }T
-
-T{ 0 1 / -> 0 1 T/ }T
-T{ 1 1 / -> 1 1 T/ }T
-T{ 2 1 / -> 2 1 T/ }T
-T{ -1 1 / -> -1 1 T/ }T
-T{ -2 1 / -> -2 1 T/ }T
-T{ 0 -1 / -> 0 -1 T/ }T
-T{ 1 -1 / -> 1 -1 T/ }T
-T{ 2 -1 / -> 2 -1 T/ }T
-T{ -1 -1 / -> -1 -1 T/ }T
-T{ -2 -1 / -> -2 -1 T/ }T
-T{ 2 2 / -> 2 2 T/ }T
-T{ -1 -1 / -> -1 -1 T/ }T
-T{ -2 -2 / -> -2 -2 T/ }T
-T{ 7 3 / -> 7 3 T/ }T
-T{ 7 -3 / -> 7 -3 T/ }T
-T{ -7 3 / -> -7 3 T/ }T
-T{ -7 -3 / -> -7 -3 T/ }T
-T{ MAX-INT 1 / -> MAX-INT 1 T/ }T
-T{ MIN-INT 1 / -> MIN-INT 1 T/ }T
-T{ MAX-INT MAX-INT / -> MAX-INT MAX-INT T/ }T
-T{ MIN-INT MIN-INT / -> MIN-INT MIN-INT T/ }T
-
-T{ 0 1 MOD -> 0 1 TMOD }T
-T{ 1 1 MOD -> 1 1 TMOD }T
-T{ 2 1 MOD -> 2 1 TMOD }T
-T{ -1 1 MOD -> -1 1 TMOD }T
-T{ -2 1 MOD -> -2 1 TMOD }T
-T{ 0 -1 MOD -> 0 -1 TMOD }T
-T{ 1 -1 MOD -> 1 -1 TMOD }T
-T{ 2 -1 MOD -> 2 -1 TMOD }T
-T{ -1 -1 MOD -> -1 -1 TMOD }T
-T{ -2 -1 MOD -> -2 -1 TMOD }T
-T{ 2 2 MOD -> 2 2 TMOD }T
-T{ -1 -1 MOD -> -1 -1 TMOD }T
-T{ -2 -2 MOD -> -2 -2 TMOD }T
-T{ 7 3 MOD -> 7 3 TMOD }T
-T{ 7 -3 MOD -> 7 -3 TMOD }T
-T{ -7 3 MOD -> -7 3 TMOD }T
-T{ -7 -3 MOD -> -7 -3 TMOD }T
-T{ MAX-INT 1 MOD -> MAX-INT 1 TMOD }T
-T{ MIN-INT 1 MOD -> MIN-INT 1 TMOD }T
-T{ MAX-INT MAX-INT MOD -> MAX-INT MAX-INT TMOD }T
-T{ MIN-INT MIN-INT MOD -> MIN-INT MIN-INT TMOD }T
-
-T{ 0 2 1 */ -> 0 2 1 T*/ }T
-T{ 1 2 1 */ -> 1 2 1 T*/ }T
-T{ 2 2 1 */ -> 2 2 1 T*/ }T
-T{ -1 2 1 */ -> -1 2 1 T*/ }T
-T{ -2 2 1 */ -> -2 2 1 T*/ }T
-T{ 0 2 -1 */ -> 0 2 -1 T*/ }T
-T{ 1 2 -1 */ -> 1 2 -1 T*/ }T
-T{ 2 2 -1 */ -> 2 2 -1 T*/ }T
-T{ -1 2 -1 */ -> -1 2 -1 T*/ }T
-T{ -2 2 -1 */ -> -2 2 -1 T*/ }T
-T{ 2 2 2 */ -> 2 2 2 T*/ }T
-T{ -1 2 -1 */ -> -1 2 -1 T*/ }T
-T{ -2 2 -2 */ -> -2 2 -2 T*/ }T
-T{ 7 2 3 */ -> 7 2 3 T*/ }T
-T{ 7 2 -3 */ -> 7 2 -3 T*/ }T
-T{ -7 2 3 */ -> -7 2 3 T*/ }T
-T{ -7 2 -3 */ -> -7 2 -3 T*/ }T
-T{ MAX-INT 2 MAX-INT */ -> MAX-INT 2 MAX-INT T*/ }T
-T{ MIN-INT 2 MIN-INT */ -> MIN-INT 2 MIN-INT T*/ }T
-
-T{ 0 2 1 */MOD -> 0 2 1 T*/MOD }T
-T{ 1 2 1 */MOD -> 1 2 1 T*/MOD }T
-T{ 2 2 1 */MOD -> 2 2 1 T*/MOD }T
-T{ -1 2 1 */MOD -> -1 2 1 T*/MOD }T
-T{ -2 2 1 */MOD -> -2 2 1 T*/MOD }T
-T{ 0 2 -1 */MOD -> 0 2 -1 T*/MOD }T
-T{ 1 2 -1 */MOD -> 1 2 -1 T*/MOD }T
-T{ 2 2 -1 */MOD -> 2 2 -1 T*/MOD }T
-T{ -1 2 -1 */MOD -> -1 2 -1 T*/MOD }T
-T{ -2 2 -1 */MOD -> -2 2 -1 T*/MOD }T
-T{ 2 2 2 */MOD -> 2 2 2 T*/MOD }T
-T{ -1 2 -1 */MOD -> -1 2 -1 T*/MOD }T
-T{ -2 2 -2 */MOD -> -2 2 -2 T*/MOD }T
-T{ 7 2 3 */MOD -> 7 2 3 T*/MOD }T
-T{ 7 2 -3 */MOD -> 7 2 -3 T*/MOD }T
-T{ -7 2 3 */MOD -> -7 2 3 T*/MOD }T
-T{ -7 2 -3 */MOD -> -7 2 -3 T*/MOD }T
-T{ MAX-INT 2 MAX-INT */MOD -> MAX-INT 2 MAX-INT T*/MOD }T
-T{ MIN-INT 2 MIN-INT */MOD -> MIN-INT 2 MIN-INT T*/MOD }T
-
-\ ------------------------------------------------------------------------
-TESTING HERE , @ ! CELL+ CELLS C, C@ C! CHARS 2@ 2! ALIGN ALIGNED +! ALLOT
-
-HERE 1 ALLOT
-HERE
-CONSTANT 2NDA
-CONSTANT 1STA
-T{ 1STA 2NDA U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT
-T{ 1STA 1+ -> 2NDA }T \ ... BY ONE ADDRESS UNIT
-( MISSING TEST: NEGATIVE ALLOT )
-
-HERE 1 ,
-HERE 2 ,
-CONSTANT 2ND
-CONSTANT 1ST
-T{ 1ST 2ND U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT
-T{ 1ST CELL+ -> 2ND }T \ ... BY ONE CELL
-T{ 1ST 1 CELLS + -> 2ND }T
-T{ 1ST @ 2ND @ -> 1 2 }T
-T{ 5 1ST ! -> }T
-T{ 1ST @ 2ND @ -> 5 2 }T
-T{ 6 2ND ! -> }T
-T{ 1ST @ 2ND @ -> 5 6 }T
-T{ 1ST 2@ -> 6 5 }T
-T{ 2 1 1ST 2! -> }T
-T{ 1ST 2@ -> 2 1 }T
-T{ 1S 1ST ! 1ST @ -> 1S }T \ CAN STORE CELL-WIDE VALUE
-
-HERE 1 C,
-HERE 2 C,
-CONSTANT 2NDC
-CONSTANT 1STC
-T{ 1STC 2NDC U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT
-T{ 1STC CHAR+ -> 2NDC }T \ ... BY ONE CHAR
-T{ 1STC 1 CHARS + -> 2NDC }T
-T{ 1STC C@ 2NDC C@ -> 1 2 }T
-T{ 3 1STC C! -> }T
-T{ 1STC C@ 2NDC C@ -> 3 2 }T
-T{ 4 2NDC C! -> }T
-T{ 1STC C@ 2NDC C@ -> 3 4 }T
-
-ALIGN 1 ALLOT HERE ALIGN HERE 3 CELLS ALLOT
-CONSTANT A-ADDR CONSTANT UA-ADDR
-T{ UA-ADDR ALIGNED -> A-ADDR }T
-T{ 1 A-ADDR C! A-ADDR C@ -> 1 }T
-T{ 1234 A-ADDR ! A-ADDR @ -> 1234 }T
-T{ 123 456 A-ADDR 2! A-ADDR 2@ -> 123 456 }T
-T{ 2 A-ADDR CHAR+ C! A-ADDR CHAR+ C@ -> 2 }T
-T{ 3 A-ADDR CELL+ C! A-ADDR CELL+ C@ -> 3 }T
-T{ 1234 A-ADDR CELL+ ! A-ADDR CELL+ @ -> 1234 }T
-T{ 123 456 A-ADDR CELL+ 2! A-ADDR CELL+ 2@ -> 123 456 }T
-
-: BITS ( X -- U )
- 0 SWAP BEGIN DUP WHILE DUP MSB AND IF >R 1+ R> THEN 2* REPEAT DROP ;
-( CHARACTERS >= 1 AU, <= SIZE OF CELL, >= 8 BITS )
-T{ 1 CHARS 1 < -> <FALSE> }T
-T{ 1 CHARS 1 CELLS > -> <FALSE> }T
-( TBD: HOW TO FIND NUMBER OF BITS? )
-
-( CELLS >= 1 AU, INTEGRAL MULTIPLE OF CHAR SIZE, >= 16 BITS )
-T{ 1 CELLS 1 < -> <FALSE> }T
-T{ 1 CELLS 1 CHARS MOD -> 0 }T
-T{ 1S BITS 10 < -> <FALSE> }T
-
-T{ 0 1ST ! -> }T
-T{ 1 1ST +! -> }T
-T{ 1ST @ -> 1 }T
-T{ -1 1ST +! 1ST @ -> 0 }T
-
-\ ------------------------------------------------------------------------
-TESTING CHAR [CHAR] [ ] BL S"
-
-T{ BL -> 20 }T
-T{ CHAR X -> 58 }T
-T{ CHAR HELLO -> 48 }T
-T{ : GC1 [CHAR] X ; -> }T
-T{ : GC2 [CHAR] HELLO ; -> }T
-T{ GC1 -> 58 }T
-T{ GC2 -> 48 }T
-T{ : GC3 [ GC1 ] LITERAL ; -> }T
-T{ GC3 -> 58 }T
-T{ : GC4 S" XY" ; -> }T
-T{ GC4 SWAP DROP -> 2 }T
-T{ GC4 DROP DUP C@ SWAP CHAR+ C@ -> 58 59 }T
-
-\ ------------------------------------------------------------------------
-TESTING ' ['] FIND EXECUTE IMMEDIATE COUNT LITERAL POSTPONE STATE
-
-T{ : GT1 123 ; -> }T
-T{ ' GT1 EXECUTE -> 123 }T
-T{ : GT2 ['] GT1 ; IMMEDIATE -> }T
-T{ GT2 EXECUTE -> 123 }T
-HERE 3 C, CHAR G C, CHAR T C, CHAR 1 C, CONSTANT GT1STRING
-HERE 3 C, CHAR G C, CHAR T C, CHAR 2 C, CONSTANT GT2STRING
-T{ GT1STRING FIND -> ' GT1 -1 }T
-T{ GT2STRING FIND -> ' GT2 1 }T
-( HOW TO SEARCH FOR NON-EXISTENT WORD? )
-T{ : GT3 GT2 LITERAL ; -> }T
-T{ GT3 -> ' GT1 }T
-T{ GT1STRING COUNT -> GT1STRING CHAR+ 3 }T
-
-T{ : GT4 POSTPONE GT1 ; IMMEDIATE -> }T
-T{ : GT5 GT4 ; -> }T
-T{ GT5 -> 123 }T
-T{ : GT6 345 ; IMMEDIATE -> }T
-T{ : GT7 POSTPONE GT6 ; -> }T
-T{ GT7 -> 345 }T
-
-T{ : GT8 STATE @ ; IMMEDIATE -> }T
-T{ GT8 -> 0 }T
-T{ : GT9 GT8 LITERAL ; -> }T
-T{ GT9 0= -> <FALSE> }T
-
-\ ------------------------------------------------------------------------
-TESTING IF ELSE THEN BEGIN WHILE REPEAT UNTIL RECURSE
-
-T{ : GI1 IF 123 THEN ; -> }T
-T{ : GI2 IF 123 ELSE 234 THEN ; -> }T
-T{ 0 GI1 -> }T
-T{ 1 GI1 -> 123 }T
-T{ -1 GI1 -> 123 }T
-T{ 0 GI2 -> 234 }T
-T{ 1 GI2 -> 123 }T
-T{ -1 GI1 -> 123 }T
-
-T{ : GI3 BEGIN DUP 5 < WHILE DUP 1+ REPEAT ; -> }T
-T{ 0 GI3 -> 0 1 2 3 4 5 }T
-T{ 4 GI3 -> 4 5 }T
-T{ 5 GI3 -> 5 }T
-T{ 6 GI3 -> 6 }T
-
-T{ : GI4 BEGIN DUP 1+ DUP 5 > UNTIL ; -> }T
-T{ 3 GI4 -> 3 4 5 6 }T
-T{ 5 GI4 -> 5 6 }T
-T{ 6 GI4 -> 6 7 }T
-
-T{ : GI5 BEGIN DUP 2 > WHILE DUP 5 < WHILE DUP 1+ REPEAT 123 ELSE 345 THEN ; -> }T
-T{ 1 GI5 -> 1 345 }T
-T{ 2 GI5 -> 2 345 }T
-T{ 3 GI5 -> 3 4 5 123 }T
-T{ 4 GI5 -> 4 5 123 }T
-T{ 5 GI5 -> 5 123 }T
-
-T{ : GI6 ( N -- 0,1,..N ) DUP IF DUP >R 1- RECURSE R> THEN ; -> }T
-T{ 0 GI6 -> 0 }T
-T{ 1 GI6 -> 0 1 }T
-T{ 2 GI6 -> 0 1 2 }T
-T{ 3 GI6 -> 0 1 2 3 }T
-T{ 4 GI6 -> 0 1 2 3 4 }T
-
-\ ------------------------------------------------------------------------
-TESTING DO LOOP +LOOP I J UNLOOP LEAVE EXIT
-
-T{ : GD1 DO I LOOP ; -> }T
-T{ 4 1 GD1 -> 1 2 3 }T
-T{ 2 -1 GD1 -> -1 0 1 }T
-T{ MID-UINT+1 MID-UINT GD1 -> MID-UINT }T
-
-T{ : GD2 DO I -1 +LOOP ; -> }T
-T{ 1 4 GD2 -> 4 3 2 1 }T
-T{ -1 2 GD2 -> 2 1 0 -1 }T
-T{ MID-UINT MID-UINT+1 GD2 -> MID-UINT+1 MID-UINT }T
-
-T{ : GD3 DO 1 0 DO J LOOP LOOP ; -> }T
-T{ 4 1 GD3 -> 1 2 3 }T
-T{ 2 -1 GD3 -> -1 0 1 }T
-T{ MID-UINT+1 MID-UINT GD3 -> MID-UINT }T
-
-T{ : GD4 DO 1 0 DO J LOOP -1 +LOOP ; -> }T
-T{ 1 4 GD4 -> 4 3 2 1 }T
-T{ -1 2 GD4 -> 2 1 0 -1 }T
-T{ MID-UINT MID-UINT+1 GD4 -> MID-UINT+1 MID-UINT }T
-
-T{ : GD5 123 SWAP 0 DO I 4 > IF DROP 234 LEAVE THEN LOOP ; -> }T
-T{ 1 GD5 -> 123 }T
-T{ 5 GD5 -> 123 }T
-T{ 6 GD5 -> 234 }T
-
-T{ : GD6 ( PAT: T{0 0}T,T{0 0}TT{1 0}TT{1 1}T,T{0 0}TT{1 0}TT{1 1}TT{2 0}TT{2 1}TT{2 2}T )
- 0 SWAP 0 DO
- I 1+ 0 DO I J + 3 = IF I UNLOOP I UNLOOP EXIT THEN 1+ LOOP
- LOOP ; -> }T
-T{ 1 GD6 -> 1 }T
-T{ 2 GD6 -> 3 }T
-T{ 3 GD6 -> 4 1 2 }T
-
-\ ------------------------------------------------------------------------
-TESTING DEFINING WORDS: : ; CONSTANT VARIABLE CREATE DOES> >BODY
-
-T{ 123 CONSTANT X123 -> }T
-T{ X123 -> 123 }T
-T{ : EQU CONSTANT ; -> }T
-T{ X123 EQU Y123 -> }T
-T{ Y123 -> 123 }T
-
-T{ VARIABLE V1 -> }T
-T{ 123 V1 ! -> }T
-T{ V1 @ -> 123 }T
-
-T{ : NOP : POSTPONE ; ; -> }T
-T{ NOP NOP1 NOP NOP2 -> }T
-T{ NOP1 -> }T
-T{ NOP2 -> }T
-
-T{ : DOES1 DOES> @ 1 + ; -> }T
-T{ : DOES2 DOES> @ 2 + ; -> }T
-T{ CREATE CR1 -> }T
-T{ CR1 -> HERE }T
-T{ ' CR1 >BODY -> HERE }T
-T{ 1 , -> }T
-T{ CR1 @ -> 1 }T
-T{ DOES1 -> }T
-T{ CR1 -> 2 }T
-T{ DOES2 -> }T
-T{ CR1 -> 3 }T
-
-T{ : WEIRD: CREATE DOES> 1 + DOES> 2 + ; -> }T
-T{ WEIRD: W1 -> }T
-T{ ' W1 >BODY -> HERE }T
-T{ W1 -> HERE 1 + }T
-T{ W1 -> HERE 2 + }T
-
-\ ------------------------------------------------------------------------
-TESTING EVALUATE
-
-: GE1 S" 123" ; IMMEDIATE
-: GE2 S" 123 1+" ; IMMEDIATE
-: GE3 S" : GE4 345 ;" ;
-: GE5 EVALUATE ; IMMEDIATE
-
-T{ GE1 EVALUATE -> 123 }T ( TEST EVALUATE IN INTERP. STATE )
-T{ GE2 EVALUATE -> 124 }T
-T{ GE3 EVALUATE -> }T
-T{ GE4 -> 345 }T
-
-T{ : GE6 GE1 GE5 ; -> }T ( TEST EVALUATE IN COMPILE STATE )
-T{ GE6 -> 123 }T
-T{ : GE7 GE2 GE5 ; -> }T
-T{ GE7 -> 124 }T
-
-\ ------------------------------------------------------------------------
-TESTING SOURCE >IN WORD
-
-: GS1 S" SOURCE" 2DUP EVALUATE
- >R SWAP >R = R> R> = ;
-T{ GS1 -> <TRUE> <TRUE> }T
-
-VARIABLE SCANS
-: RESCAN? -1 SCANS +! SCANS @ IF 0 >IN ! THEN ;
-
-T{ 2 SCANS !
-345 RESCAN?
--> 345 345 }T
-
-: GS2 5 SCANS ! S" 123 RESCAN?" EVALUATE ;
-T{ GS2 -> 123 123 123 123 123 }T
-
-: GS3 WORD COUNT SWAP C@ ;
-T{ BL GS3 HELLO -> 5 CHAR H }T
-T{ CHAR " GS3 GOODBYE" -> 7 CHAR G }T
-T{ BL GS3
-DROP -> 0 }T \ BLANK LINE RETURN ZERO-LENGTH STRING
-
-: GS4 SOURCE >IN ! DROP ;
-T{ GS4 123 456
--> }T
-
-\ ------------------------------------------------------------------------
-TESTING <# # #S #> HOLD SIGN BASE >NUMBER HEX DECIMAL
-
-: S= \ ( ADDR1 C1 ADDR2 C2 -- T/F ) COMPARE TWO STRINGS.
- >R SWAP R@ = IF \ MAKE SURE STRINGS HAVE SAME LENGTH
- R> ?DUP IF \ IF NON-EMPTY STRINGS
- 0 DO
- OVER C@ OVER C@ - IF
- 2DROP <FALSE> UNLOOP EXIT THEN
- SWAP CHAR+ SWAP CHAR+
- LOOP
- THEN
- 2DROP <TRUE> \ IF WE GET HERE, STRINGS MATCH
- ELSE
- R> DROP 2DROP <FALSE> \ LENGTHS MISMATCH
- THEN ;
-
-: GP1 <# 41 HOLD 42 HOLD 0 0 #> S" BA" S= ;
-T{ GP1 -> <TRUE> }T
-
-: GP2 <# -1 SIGN 0 SIGN -1 SIGN 0 0 #> S" --" S= ;
-T{ GP2 -> <TRUE> }T
-
-: GP3 <# 1 0 # # #> S" 01" S= ;
-T{ GP3 -> <TRUE> }T
-
-: GP4 <# 1 0 #S #> S" 1" S= ;
-T{ GP4 -> <TRUE> }T
-
-24 CONSTANT MAX-BASE \ BASE 2 .. 36
-: COUNT-BITS
- 0 0 INVERT BEGIN DUP WHILE >R 1+ R> 2* REPEAT DROP ;
-COUNT-BITS 2* CONSTANT #BITS-UD \ NUMBER OF BITS IN UD
-
-: GP5
- BASE @ <TRUE>
- MAX-BASE 1+ 2 DO \ FOR EACH POSSIBLE BASE
- I BASE ! \ TBD: ASSUMES BASE WORKS
- I 0 <# #S #> S" 10" S= AND
- LOOP
- SWAP BASE ! ;
-T{ GP5 -> <TRUE> }T
-
-: GP6
- BASE @ >R 2 BASE !
- MAX-UINT MAX-UINT <# #S #> \ MAXIMUM UD TO BINARY
- R> BASE ! \ S: C-ADDR U
- DUP #BITS-UD = SWAP
- 0 DO \ S: C-ADDR FLAG
- OVER C@ [CHAR] 1 = AND \ ALL ONES
- >R CHAR+ R>
- LOOP SWAP DROP ;
-T{ GP6 -> <TRUE> }T
-
-: GP7
- BASE @ >R MAX-BASE BASE !
- <TRUE>
- A 0 DO
- I 0 <# #S #>
- 1 = SWAP C@ I 30 + = AND AND
- LOOP
- MAX-BASE A DO
- I 0 <# #S #>
- 1 = SWAP C@ 41 I A - + = AND AND
- LOOP
- R> BASE ! ;
-
-T{ GP7 -> <TRUE> }T
-
-\ >NUMBER TESTS
-CREATE GN-BUF 0 C,
-: GN-STRING GN-BUF 1 ;
-: GN-CONSUMED GN-BUF CHAR+ 0 ;
-: GN' [CHAR] ' WORD CHAR+ C@ GN-BUF C! GN-STRING ;
-
-T{ 0 0 GN' 0' >NUMBER -> 0 0 GN-CONSUMED }T
-T{ 0 0 GN' 1' >NUMBER -> 1 0 GN-CONSUMED }T
-T{ 1 0 GN' 1' >NUMBER -> BASE @ 1+ 0 GN-CONSUMED }T
-T{ 0 0 GN' -' >NUMBER -> 0 0 GN-STRING }T \ SHOULD FAIL TO CONVERT THESE
-T{ 0 0 GN' +' >NUMBER -> 0 0 GN-STRING }T
-T{ 0 0 GN' .' >NUMBER -> 0 0 GN-STRING }T
-
-: >NUMBER-BASED
- BASE @ >R BASE ! >NUMBER R> BASE ! ;
-
-T{ 0 0 GN' 2' 10 >NUMBER-BASED -> 2 0 GN-CONSUMED }T
-T{ 0 0 GN' 2' 2 >NUMBER-BASED -> 0 0 GN-STRING }T
-T{ 0 0 GN' F' 10 >NUMBER-BASED -> F 0 GN-CONSUMED }T
-T{ 0 0 GN' G' 10 >NUMBER-BASED -> 0 0 GN-STRING }T
-T{ 0 0 GN' G' MAX-BASE >NUMBER-BASED -> 10 0 GN-CONSUMED }T
-T{ 0 0 GN' Z' MAX-BASE >NUMBER-BASED -> 23 0 GN-CONSUMED }T
-
-: GN1 \ ( UD BASE -- UD' LEN ) UD SHOULD EQUAL UD' AND LEN SHOULD BE ZERO.
- BASE @ >R BASE !
- <# #S #>
- 0 0 2SWAP >NUMBER SWAP DROP \ RETURN LENGTH ONLY
- R> BASE ! ;
-T{ 0 0 2 GN1 -> 0 0 0 }T
-T{ MAX-UINT 0 2 GN1 -> MAX-UINT 0 0 }T
-T{ MAX-UINT DUP 2 GN1 -> MAX-UINT DUP 0 }T
-T{ 0 0 MAX-BASE GN1 -> 0 0 0 }T
-T{ MAX-UINT 0 MAX-BASE GN1 -> MAX-UINT 0 0 }T
-T{ MAX-UINT DUP MAX-BASE GN1 -> MAX-UINT DUP 0 }T
-
-: GN2 \ ( -- 16 10 )
- BASE @ >R HEX BASE @ DECIMAL BASE @ R> BASE ! ;
-T{ GN2 -> 10 A }T
-
-\ ------------------------------------------------------------------------
-TESTING FILL MOVE
-
-CREATE FBUF 00 C, 00 C, 00 C,
-CREATE SBUF 12 C, 34 C, 56 C,
-: SEEBUF FBUF C@ FBUF CHAR+ C@ FBUF CHAR+ CHAR+ C@ ;
-
-T{ FBUF 0 20 FILL -> }T
-T{ SEEBUF -> 00 00 00 }T
-
-T{ FBUF 1 20 FILL -> }T
-T{ SEEBUF -> 20 00 00 }T
-
-T{ FBUF 3 20 FILL -> }T
-T{ SEEBUF -> 20 20 20 }T
-
-T{ FBUF FBUF 3 CHARS MOVE -> }T \ BIZARRE SPECIAL CASE
-T{ SEEBUF -> 20 20 20 }T
-
-T{ SBUF FBUF 0 CHARS MOVE -> }T
-T{ SEEBUF -> 20 20 20 }T
-
-T{ SBUF FBUF 1 CHARS MOVE -> }T
-T{ SEEBUF -> 12 20 20 }T
-
-T{ SBUF FBUF 3 CHARS MOVE -> }T
-T{ SEEBUF -> 12 34 56 }T
-
-T{ FBUF FBUF CHAR+ 2 CHARS MOVE -> }T
-T{ SEEBUF -> 12 12 34 }T
-
-T{ FBUF CHAR+ FBUF 2 CHARS MOVE -> }T
-T{ SEEBUF -> 12 34 34 }T
-
-\ ------------------------------------------------------------------------
-TESTING OUTPUT: . ." CR EMIT SPACE SPACES TYPE U.
-
-: OUTPUT-TEST
- ." YOU SHOULD SEE THE STANDARD GRAPHIC CHARACTERS:" CR
- 41 BL DO I EMIT LOOP CR
- 61 41 DO I EMIT LOOP CR
- 7F 61 DO I EMIT LOOP CR
- ." YOU SHOULD SEE 0-9 SEPARATED BY A SPACE:" CR
- 9 1+ 0 DO I . LOOP CR
- ." YOU SHOULD SEE 0-9 (WITH NO SPACES):" CR
- [CHAR] 9 1+ [CHAR] 0 DO I 0 SPACES EMIT LOOP CR
- ." YOU SHOULD SEE A-G SEPARATED BY A SPACE:" CR
- [CHAR] G 1+ [CHAR] A DO I EMIT SPACE LOOP CR
- ." YOU SHOULD SEE 0-5 SEPARATED BY TWO SPACES:" CR
- 5 1+ 0 DO I [CHAR] 0 + EMIT 2 SPACES LOOP CR
- ." YOU SHOULD SEE TWO SEPARATE LINES:" CR
- S" LINE 1" TYPE CR S" LINE 2" TYPE CR
- ." YOU SHOULD SEE THE NUMBER RANGES OF SIGNED AND UNSIGNED NUMBERS:" CR
- ." SIGNED: " MIN-INT . MAX-INT . CR
- ." UNSIGNED: " 0 U. MAX-UINT U. CR
-;
-
-T{ OUTPUT-TEST -> }T
-\ ------------------------------------------------------------------------
-TESTING INPUT: ACCEPT
-
-CREATE ABUF 80 CHARS ALLOT
-
-: ACCEPT-TEST
- CR ." PLEASE TYPE UP TO 80 CHARACTERS:" CR
- ABUF 80 ACCEPT
- CR ." RECEIVED: " [CHAR] " EMIT
- ABUF SWAP TYPE [CHAR] " EMIT CR
-;
-
-T{ ACCEPT-TEST -> }T
-Vingt fois sur le métier remettez votre ouvrage, ...
-\ ------------------------------------------------------------------------
-TESTING DICTIONARY SEARCH RULES
-
-T{ : GDX 123 ; : GDX GDX 234 ; -> }T
-
-T{ GDX -> 123 234 }T
-
-CR .( End of Core word set tests) CR
-
-
-
-RST_STATE ; so ANS_COMPLEMENT_xx_MPY is conserved ;
-\ NOECHO ; if an error occurs, comment this line before new download to find it.
-
-
-\ From: John Hayes S1I
-\ Subject: tester.fr
-\ Date: Mon, 27 Nov 95 13:10:09 PST
-
-\ (C) 1995 JOHNS HOPKINS UNIVERSITY / APPLIED PHYSICS LABORATORY
-\ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS.
-\ VERSION 1.1
-
-\ 22/1/09 The words { and } have been changed to T{ and }T respectively to
-\ agree with the Forth 200X file ttester.fs. This avoids clashes with
-\ locals using { ... } and the FSL use of }
-
-
-\ 13/05/14 jmt. added colorised error messages.
-
-
-
- 0 CONSTANT FALSE
--1 CONSTANT TRUE
-
-\ SET THE FOLLOWING FLAG TO TRUE FOR MORE VERBOSE OUTPUT; THIS MAY
-\ ALLOW YOU TO TELL WHICH TEST CAUSED YOUR SYSTEM TO HANG.
-VARIABLE VERBOSE
- FALSE VERBOSE !
-\ TRUE VERBOSE !
-
-\ : EMPTY-STACK ( ... -- ) \ EMPTY STACK: HANDLES UNDERFLOWED STACK TOO.
-\ DEPTH ?DUP
-\ IF DUP 0< IF NEGATE 0
-\ DO 0 LOOP
-\ ELSE 0 DO DROP LOOP THEN
-\ THEN ;
-\
-\ : ERROR \ ( C-ADDR U -- ) DISPLAY AN ERROR MESSAGE FOLLOWED BY
-\ \ THE LINE THAT HAD THE ERROR.
-\ TYPE SOURCE TYPE CR \ DISPLAY LINE CORRESPONDING TO ERROR
-\ EMPTY-STACK \ THROW AWAY EVERY THING ELSE
-\ QUIT \ *** Uncomment this line to QUIT on an error
-\ ;
-
-VARIABLE ACTUAL-DEPTH \ STACK RECORD
-CREATE ACTUAL-RESULTS 20 CELLS ALLOT
-
-: T{ \ ( -- ) SYNTACTIC SUGAR.
- ;
-
-: -> \ ( ... -- ) RECORD DEPTH AND CONTENT OF STACK.
- DEPTH DUP ACTUAL-DEPTH ! \ RECORD DEPTH
- ?DUP IF \ IF THERE IS SOMETHING ON STACK
- 0 DO ACTUAL-RESULTS I CELLS + ! LOOP \ SAVE THEM
- THEN ;
-
-: }T \ ( ... -- ) COMPARE STACK (EXPECTED) CONTENTS WITH SAVED
- \ (ACTUAL) CONTENTS.
- DEPTH ACTUAL-DEPTH @ = IF \ IF DEPTHS MATCH
- DEPTH ?DUP IF \ IF THERE IS SOMETHING ON THE STACK
- 0 DO \ FOR EACH STACK ITEM
- ACTUAL-RESULTS I CELLS + @ \ COMPARE ACTUAL WITH EXPECTED
-\ = 0= IF S" INCORRECT RESULT: " ERROR LEAVE THEN \ jmt
- = 0= IF ABORT" INCORRECT RESULT: " THEN \ jmt : colorised message
- LOOP
- THEN
- ELSE \ DEPTH MISMATCH
-\ S" WRONG NUMBER OF RESULTS: " ERROR \ jmt
- ABORT" WRONG NUMBER OF RESULTS: " \ jmt : colorised message
- THEN ;
-
-: TESTING \ ( -- ) TALKING COMMENT.
- SOURCE VERBOSE @
- IF DUP >R TYPE CR R> >IN !
- ELSE >IN ! DROP [CHAR] * EMIT
- THEN ;
-
-\ From: John Hayes S1I
-\ Subject: core.fr
-\ Date: Mon, 27 Nov 95 13:10
-
-\ (C) 1995 JOHNS HOPKINS UNIVERSITY / APPLIED PHYSICS LABORATORY
-\ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS.
-\ VERSION 1.2
-\ THIS PROGRAM TESTS THE CORE WORDS OF AN ANS FORTH SYSTEM.
-\ THE PROGRAM ASSUMES A TWO'S COMPLEMENT IMPLEMENTATION WHERE
-\ THE RANGE OF SIGNED NUMBERS IS -2^(N-1) ... 2^(N-1)-1 AND
-\ THE RANGE OF UNSIGNED NUMBERS IS 0 ... 2^(N)-1.
-\ I HAVEN'T FIGURED OUT HOW TO TEST KEY, QUIT, ABORT, OR ABORT"...
-\ I ALSO HAVEN'T THOUGHT OF A WAY TO TEST ENVIRONMENT?...
-
-CR
-TESTING CORE WORDS
-HEX
-
-\ ------------------------------------------------------------------------
-TESTING BASIC ASSUMPTIONS
-
-T{ -> }T \ START WITH CLEAN SLATE
-( TEST IF ANY BITS ARE SET; ANSWER IN BASE 1 )
-T{ : BITSSET? IF 0 0 ELSE 0 THEN ; -> }T
-T{ 0 BITSSET? -> 0 }T ( ZERO IS ALL BITS CLEAR )
-T{ 1 BITSSET? -> 0 0 }T ( OTHER NUMBER HAVE AT LEAST ONE BIT )
-T{ -1 BITSSET? -> 0 0 }T
-
-\ ------------------------------------------------------------------------
-TESTING BOOLEANS: INVERT AND OR XOR
-
-T{ 0 0 AND -> 0 }T
-T{ 0 1 AND -> 0 }T
-T{ 1 0 AND -> 0 }T
-T{ 1 1 AND -> 1 }T
-
-T{ 0 INVERT 1 AND -> 1 }T
-T{ 1 INVERT 1 AND -> 0 }T
-
-0 CONSTANT 0S
-0 INVERT CONSTANT 1S
-
-T{ 0S INVERT -> 1S }T
-T{ 1S INVERT -> 0S }T
-
-T{ 0S 0S AND -> 0S }T
-T{ 0S 1S AND -> 0S }T
-T{ 1S 0S AND -> 0S }T
-T{ 1S 1S AND -> 1S }T
-
-T{ 0S 0S OR -> 0S }T
-T{ 0S 1S OR -> 1S }T
-T{ 1S 0S OR -> 1S }T
-T{ 1S 1S OR -> 1S }T
-
-T{ 0S 0S XOR -> 0S }T
-T{ 0S 1S XOR -> 1S }T
-T{ 1S 0S XOR -> 1S }T
-T{ 1S 1S XOR -> 0S }T
-
-\ ------------------------------------------------------------------------
-TESTING 2* 2/ LSHIFT RSHIFT
-
-( WE TRUST 1S, INVERT, AND BITSSET?; WE WILL CONFIRM RSHIFT LATER )
-1S 1 RSHIFT INVERT CONSTANT MSB
-T{ MSB BITSSET? -> 0 0 }T
-
-T{ 0S 2* -> 0S }T
-T{ 1 2* -> 2 }T
-T{ 4000 2* -> 8000 }T
-T{ 1S 2* 1 XOR -> 1S }T
-T{ MSB 2* -> 0S }T
-
-T{ 0S 2/ -> 0S }T
-T{ 1 2/ -> 0 }T
-T{ 4000 2/ -> 2000 }T
-T{ 1S 2/ -> 1S }T \ MSB PROPOGATED
-T{ 1S 1 XOR 2/ -> 1S }T
-T{ MSB 2/ MSB AND -> MSB }T
-
-T{ 1 0 LSHIFT -> 1 }T
-T{ 1 1 LSHIFT -> 2 }T
-T{ 1 2 LSHIFT -> 4 }T
-T{ 1 F LSHIFT -> 8000 }T \ BIGGEST GUARANTEED SHIFT
-T{ 1S 1 LSHIFT 1 XOR -> 1S }T
-T{ MSB 1 LSHIFT -> 0 }T
-
-T{ 1 0 RSHIFT -> 1 }T
-T{ 1 1 RSHIFT -> 0 }T
-T{ 2 1 RSHIFT -> 1 }T
-T{ 4 2 RSHIFT -> 1 }T
-T{ 8000 F RSHIFT -> 1 }T \ BIGGEST
-T{ MSB 1 RSHIFT MSB AND -> 0 }T \ RSHIFT ZERO FILLS MSBS
-T{ MSB 1 RSHIFT 2* -> MSB }T
-
-\ ------------------------------------------------------------------------
-TESTING COMPARISONS: 0= = 0< < > U< MIN MAX
-0 INVERT CONSTANT MAX-UINT
-0 INVERT 1 RSHIFT CONSTANT MAX-INT
-0 INVERT 1 RSHIFT INVERT CONSTANT MIN-INT
-0 INVERT 1 RSHIFT CONSTANT MID-UINT
-0 INVERT 1 RSHIFT INVERT CONSTANT MID-UINT+1
-
-0S CONSTANT <FALSE>
-1S CONSTANT <TRUE>
-
-T{ 0 0= -> <TRUE> }T
-T{ 1 0= -> <FALSE> }T
-T{ 2 0= -> <FALSE> }T
-T{ -1 0= -> <FALSE> }T
-T{ MAX-UINT 0= -> <FALSE> }T
-T{ MIN-INT 0= -> <FALSE> }T
-T{ MAX-INT 0= -> <FALSE> }T
-
-T{ 0 0 = -> <TRUE> }T
-T{ 1 1 = -> <TRUE> }T
-T{ -1 -1 = -> <TRUE> }T
-T{ 1 0 = -> <FALSE> }T
-T{ -1 0 = -> <FALSE> }T
-T{ 0 1 = -> <FALSE> }T
-T{ 0 -1 = -> <FALSE> }T
-
-T{ 0 0< -> <FALSE> }T
-T{ -1 0< -> <TRUE> }T
-T{ MIN-INT 0< -> <TRUE> }T
-T{ 1 0< -> <FALSE> }T
-T{ MAX-INT 0< -> <FALSE> }T
-
-T{ 0 1 < -> <TRUE> }T
-T{ 1 2 < -> <TRUE> }T
-T{ -1 0 < -> <TRUE> }T
-T{ -1 1 < -> <TRUE> }T
-T{ MIN-INT 0 < -> <TRUE> }T
-T{ MIN-INT MAX-INT < -> <TRUE> }T
-T{ 0 MAX-INT < -> <TRUE> }T
-T{ 0 0 < -> <FALSE> }T
-T{ 1 1 < -> <FALSE> }T
-T{ 1 0 < -> <FALSE> }T
-T{ 2 1 < -> <FALSE> }T
-T{ 0 -1 < -> <FALSE> }T
-T{ 1 -1 < -> <FALSE> }T
-T{ 0 MIN-INT < -> <FALSE> }T
-T{ MAX-INT MIN-INT < -> <FALSE> }T
-T{ MAX-INT 0 < -> <FALSE> }T
-
-T{ 0 1 > -> <FALSE> }T
-T{ 1 2 > -> <FALSE> }T
-T{ -1 0 > -> <FALSE> }T
-T{ -1 1 > -> <FALSE> }T
-T{ MIN-INT 0 > -> <FALSE> }T
-T{ MIN-INT MAX-INT > -> <FALSE> }T
-T{ 0 MAX-INT > -> <FALSE> }T
-T{ 0 0 > -> <FALSE> }T
-T{ 1 1 > -> <FALSE> }T
-T{ 1 0 > -> <TRUE> }T
-T{ 2 1 > -> <TRUE> }T
-T{ 0 -1 > -> <TRUE> }T
-T{ 1 -1 > -> <TRUE> }T
-T{ 0 MIN-INT > -> <TRUE> }T
-T{ MAX-INT MIN-INT > -> <TRUE> }T
-T{ MAX-INT 0 > -> <TRUE> }T
-
-T{ 0 1 U< -> <TRUE> }T
-T{ 1 2 U< -> <TRUE> }T
-T{ 0 MID-UINT U< -> <TRUE> }T
-T{ 0 MAX-UINT U< -> <TRUE> }T
-T{ MID-UINT MAX-UINT U< -> <TRUE> }T
-T{ 0 0 U< -> <FALSE> }T
-T{ 1 1 U< -> <FALSE> }T
-T{ 1 0 U< -> <FALSE> }T
-T{ 2 1 U< -> <FALSE> }T
-T{ MID-UINT 0 U< -> <FALSE> }T
-T{ MAX-UINT 0 U< -> <FALSE> }T
-T{ MAX-UINT MID-UINT U< -> <FALSE> }T
-
-T{ 0 1 MIN -> 0 }T
-T{ 1 2 MIN -> 1 }T
-T{ -1 0 MIN -> -1 }T
-T{ -1 1 MIN -> -1 }T
-T{ MIN-INT 0 MIN -> MIN-INT }T
-T{ MIN-INT MAX-INT MIN -> MIN-INT }T
-T{ 0 MAX-INT MIN -> 0 }T
-T{ 0 0 MIN -> 0 }T
-T{ 1 1 MIN -> 1 }T
-T{ 1 0 MIN -> 0 }T
-T{ 2 1 MIN -> 1 }T
-T{ 0 -1 MIN -> -1 }T
-T{ 1 -1 MIN -> -1 }T
-T{ 0 MIN-INT MIN -> MIN-INT }T
-T{ MAX-INT MIN-INT MIN -> MIN-INT }T
-T{ MAX-INT 0 MIN -> 0 }T
-
-T{ 0 1 MAX -> 1 }T
-T{ 1 2 MAX -> 2 }T
-T{ -1 0 MAX -> 0 }T
-T{ -1 1 MAX -> 1 }T
-T{ MIN-INT 0 MAX -> 0 }T
-T{ MIN-INT MAX-INT MAX -> MAX-INT }T
-T{ 0 MAX-INT MAX -> MAX-INT }T
-T{ 0 0 MAX -> 0 }T
-T{ 1 1 MAX -> 1 }T
-T{ 1 0 MAX -> 1 }T
-T{ 2 1 MAX -> 2 }T
-T{ 0 -1 MAX -> 0 }T
-T{ 1 -1 MAX -> 1 }T
-T{ 0 MIN-INT MAX -> 0 }T
-T{ MAX-INT MIN-INT MAX -> MAX-INT }T
-T{ MAX-INT 0 MAX -> MAX-INT }T
-
-\ ------------------------------------------------------------------------
-TESTING STACK OPS: 2DROP 2DUP 2OVER 2SWAP ?DUP DEPTH DROP DUP OVER ROT SWAP
-
-T{ 1 2 2DROP -> }T
-T{ 1 2 2DUP -> 1 2 1 2 }T
-T{ 1 2 3 4 2OVER -> 1 2 3 4 1 2 }T
-T{ 1 2 3 4 2SWAP -> 3 4 1 2 }T
-T{ 0 ?DUP -> 0 }T
-T{ 1 ?DUP -> 1 1 }T
-T{ -1 ?DUP -> -1 -1 }T
-T{ DEPTH -> 0 }T
-T{ 0 DEPTH -> 0 1 }T
-T{ 0 1 DEPTH -> 0 1 2 }T
-T{ 0 DROP -> }T
-T{ 1 2 DROP -> 1 }T
-T{ 1 DUP -> 1 1 }T
-T{ 1 2 OVER -> 1 2 1 }T
-T{ 1 2 3 ROT -> 2 3 1 }T
-T{ 1 2 SWAP -> 2 1 }T
-
-\ ------------------------------------------------------------------------
-TESTING >R R> R@
-
-T{ : GR1 >R R> ; -> }T
-T{ : GR2 >R R@ R> DROP ; -> }T
-T{ 123 GR1 -> 123 }T
-T{ 123 GR2 -> 123 }T
-T{ 1S GR1 -> 1S }T ( RETURN STACK HOLDS CELLS )
-
-\ ------------------------------------------------------------------------
-TESTING ADD/SUBTRACT: + - 1+ 1- ABS NEGATE
-
-T{ 0 5 + -> 5 }T
-T{ 5 0 + -> 5 }T
-T{ 0 -5 + -> -5 }T
-T{ -5 0 + -> -5 }T
-T{ 1 2 + -> 3 }T
-T{ 1 -2 + -> -1 }T
-T{ -1 2 + -> 1 }T
-T{ -1 -2 + -> -3 }T
-T{ -1 1 + -> 0 }T
-T{ MID-UINT 1 + -> MID-UINT+1 }T
-
-T{ 0 5 - -> -5 }T
-T{ 5 0 - -> 5 }T
-T{ 0 -5 - -> 5 }T
-T{ -5 0 - -> -5 }T
-T{ 1 2 - -> -1 }T
-T{ 1 -2 - -> 3 }T
-T{ -1 2 - -> -3 }T
-T{ -1 -2 - -> 1 }T
-T{ 0 1 - -> -1 }T
-T{ MID-UINT+1 1 - -> MID-UINT }T
-
-T{ 0 1+ -> 1 }T
-T{ -1 1+ -> 0 }T
-T{ 1 1+ -> 2 }T
-T{ MID-UINT 1+ -> MID-UINT+1 }T
-
-T{ 2 1- -> 1 }T
-T{ 1 1- -> 0 }T
-T{ 0 1- -> -1 }T
-T{ MID-UINT+1 1- -> MID-UINT }T
-
-T{ 0 NEGATE -> 0 }T
-T{ 1 NEGATE -> -1 }T
-T{ -1 NEGATE -> 1 }T
-T{ 2 NEGATE -> -2 }T
-T{ -2 NEGATE -> 2 }T
-
-T{ 0 ABS -> 0 }T
-T{ 1 ABS -> 1 }T
-T{ -1 ABS -> 1 }T
-T{ MIN-INT ABS -> MID-UINT+1 }T
-
-\ ------------------------------------------------------------------------
-TESTING MULTIPLY: S>D * M* UM*
-
-T{ 0 S>D -> 0 0 }T
-T{ 1 S>D -> 1 0 }T
-T{ 2 S>D -> 2 0 }T
-T{ -1 S>D -> -1 -1 }T
-T{ -2 S>D -> -2 -1 }T
-T{ MIN-INT S>D -> MIN-INT -1 }T
-T{ MAX-INT S>D -> MAX-INT 0 }T
-
-T{ 0 0 M* -> 0 S>D }T
-T{ 0 1 M* -> 0 S>D }T
-T{ 1 0 M* -> 0 S>D }T
-T{ 1 2 M* -> 2 S>D }T
-T{ 2 1 M* -> 2 S>D }T
-T{ 3 3 M* -> 9 S>D }T
-T{ -3 3 M* -> -9 S>D }T
-T{ 3 -3 M* -> -9 S>D }T
-T{ -3 -3 M* -> 9 S>D }T
-T{ 0 MIN-INT M* -> 0 S>D }T
-T{ 1 MIN-INT M* -> MIN-INT S>D }T
-T{ 2 MIN-INT M* -> 0 1S }T
-T{ 0 MAX-INT M* -> 0 S>D }T
-T{ 1 MAX-INT M* -> MAX-INT S>D }T
-T{ 2 MAX-INT M* -> MAX-INT 1 LSHIFT 0 }T
-T{ MIN-INT MIN-INT M* -> 0 MSB 1 RSHIFT }T
-T{ MAX-INT MIN-INT M* -> MSB MSB 2/ }T
-T{ MAX-INT MAX-INT M* -> 1 MSB 2/ INVERT }T
-
-T{ 0 0 * -> 0 }T \ TEST IDENTITIES
-T{ 0 1 * -> 0 }T
-T{ 1 0 * -> 0 }T
-T{ 1 2 * -> 2 }T
-T{ 2 1 * -> 2 }T
-T{ 3 3 * -> 9 }T
-T{ -3 3 * -> -9 }T
-T{ 3 -3 * -> -9 }T
-T{ -3 -3 * -> 9 }T
-
-T{ MID-UINT+1 1 RSHIFT 2 * -> MID-UINT+1 }T
-T{ MID-UINT+1 2 RSHIFT 4 * -> MID-UINT+1 }T
-T{ MID-UINT+1 1 RSHIFT MID-UINT+1 OR 2 * -> MID-UINT+1 }T
-
-T{ 0 0 UM* -> 0 0 }T
-T{ 0 1 UM* -> 0 0 }T
-T{ 1 0 UM* -> 0 0 }T
-T{ 1 2 UM* -> 2 0 }T
-T{ 2 1 UM* -> 2 0 }T
-T{ 3 3 UM* -> 9 0 }T
-
-T{ MID-UINT+1 1 RSHIFT 2 UM* -> MID-UINT+1 0 }T
-T{ MID-UINT+1 2 UM* -> 0 1 }T
-T{ MID-UINT+1 4 UM* -> 0 2 }T
-T{ 1S 2 UM* -> 1S 1 LSHIFT 1 }T
-T{ MAX-UINT MAX-UINT UM* -> 1 1 INVERT }T
-
-\ ------------------------------------------------------------------------
-TESTING DIVIDE: FM/MOD SM/REM UM/MOD */ */MOD / /MOD MOD
-
-T{ 0 S>D 1 FM/MOD -> 0 0 }T
-T{ 1 S>D 1 FM/MOD -> 0 1 }T
-T{ 2 S>D 1 FM/MOD -> 0 2 }T
-T{ -1 S>D 1 FM/MOD -> 0 -1 }T
-T{ -2 S>D 1 FM/MOD -> 0 -2 }T
-T{ 0 S>D -1 FM/MOD -> 0 0 }T
-T{ 1 S>D -1 FM/MOD -> 0 -1 }T
-T{ 2 S>D -1 FM/MOD -> 0 -2 }T
-T{ -1 S>D -1 FM/MOD -> 0 1 }T
-T{ -2 S>D -1 FM/MOD -> 0 2 }T
-T{ 2 S>D 2 FM/MOD -> 0 1 }T
-T{ -1 S>D -1 FM/MOD -> 0 1 }T
-T{ -2 S>D -2 FM/MOD -> 0 1 }T
-T{ 7 S>D 3 FM/MOD -> 1 2 }T
-T{ 7 S>D -3 FM/MOD -> -2 -3 }T
-T{ -7 S>D 3 FM/MOD -> 2 -3 }T
-T{ -7 S>D -3 FM/MOD -> -1 2 }T
-T{ MAX-INT S>D 1 FM/MOD -> 0 MAX-INT }T
-T{ MIN-INT S>D 1 FM/MOD -> 0 MIN-INT }T
-T{ MAX-INT S>D MAX-INT FM/MOD -> 0 1 }T
-T{ MIN-INT S>D MIN-INT FM/MOD -> 0 1 }T
-T{ 1S 1 4 FM/MOD -> 3 MAX-INT }T
-T{ 1 MIN-INT M* 1 FM/MOD -> 0 MIN-INT }T
-T{ 1 MIN-INT M* MIN-INT FM/MOD -> 0 1 }T
-T{ 2 MIN-INT M* 2 FM/MOD -> 0 MIN-INT }T
-T{ 2 MIN-INT M* MIN-INT FM/MOD -> 0 2 }T
-T{ 1 MAX-INT M* 1 FM/MOD -> 0 MAX-INT }T
-T{ 1 MAX-INT M* MAX-INT FM/MOD -> 0 1 }T
-T{ 2 MAX-INT M* 2 FM/MOD -> 0 MAX-INT }T
-T{ 2 MAX-INT M* MAX-INT FM/MOD -> 0 2 }T
-T{ MIN-INT MIN-INT M* MIN-INT FM/MOD -> 0 MIN-INT }T
-T{ MIN-INT MAX-INT M* MIN-INT FM/MOD -> 0 MAX-INT }T
-T{ MIN-INT MAX-INT M* MAX-INT FM/MOD -> 0 MIN-INT }T
-T{ MAX-INT MAX-INT M* MAX-INT FM/MOD -> 0 MAX-INT }T
-
-T{ 0 S>D 1 SM/REM -> 0 0 }T
-T{ 1 S>D 1 SM/REM -> 0 1 }T
-T{ 2 S>D 1 SM/REM -> 0 2 }T
-T{ -1 S>D 1 SM/REM -> 0 -1 }T
-T{ -2 S>D 1 SM/REM -> 0 -2 }T
-T{ 0 S>D -1 SM/REM -> 0 0 }T
-T{ 1 S>D -1 SM/REM -> 0 -1 }T
-T{ 2 S>D -1 SM/REM -> 0 -2 }T
-T{ -1 S>D -1 SM/REM -> 0 1 }T
-T{ -2 S>D -1 SM/REM -> 0 2 }T
-T{ 2 S>D 2 SM/REM -> 0 1 }T
-T{ -1 S>D -1 SM/REM -> 0 1 }T
-T{ -2 S>D -2 SM/REM -> 0 1 }T
-T{ 7 S>D 3 SM/REM -> 1 2 }T
-T{ 7 S>D -3 SM/REM -> 1 -2 }T
-T{ -7 S>D 3 SM/REM -> -1 -2 }T
-T{ -7 S>D -3 SM/REM -> -1 2 }T
-T{ MAX-INT S>D 1 SM/REM -> 0 MAX-INT }T
-T{ MIN-INT S>D 1 SM/REM -> 0 MIN-INT }T
-T{ MAX-INT S>D MAX-INT SM/REM -> 0 1 }T
-T{ MIN-INT S>D MIN-INT SM/REM -> 0 1 }T
-T{ 1S 1 4 SM/REM -> 3 MAX-INT }T
-T{ 2 MIN-INT M* 2 SM/REM -> 0 MIN-INT }T
-T{ 2 MIN-INT M* MIN-INT SM/REM -> 0 2 }T
-T{ 2 MAX-INT M* 2 SM/REM -> 0 MAX-INT }T
-T{ 2 MAX-INT M* MAX-INT SM/REM -> 0 2 }T
-T{ MIN-INT MIN-INT M* MIN-INT SM/REM -> 0 MIN-INT }T
-T{ MIN-INT MAX-INT M* MIN-INT SM/REM -> 0 MAX-INT }T
-T{ MIN-INT MAX-INT M* MAX-INT SM/REM -> 0 MIN-INT }T
-T{ MAX-INT MAX-INT M* MAX-INT SM/REM -> 0 MAX-INT }T
-
-T{ 0 0 1 UM/MOD -> 0 0 }T
-T{ 1 0 1 UM/MOD -> 0 1 }T
-T{ 1 0 2 UM/MOD -> 1 0 }T
-T{ 3 0 2 UM/MOD -> 1 1 }T
-T{ MAX-UINT 2 UM* 2 UM/MOD -> 0 MAX-UINT }T
-T{ MAX-UINT 2 UM* MAX-UINT UM/MOD -> 0 2 }T
-T{ MAX-UINT MAX-UINT UM* MAX-UINT UM/MOD -> 0 MAX-UINT }T
-
-: IFFLOORED
- [ -3 2 / -2 = INVERT ] LITERAL IF POSTPONE \ THEN ;
-
-: IFSYM
- [ -3 2 / -1 = INVERT ] LITERAL IF POSTPONE \ THEN ;
-
-\ THE SYSTEM MIGHT DO EITHER FLOORED OR SYMMETRIC DIVISION.
-\ SINCE WE HAVE ALREADY TESTED M*, FM/MOD, AND SM/REM WE CAN USE THEM IN TEST.
-
-IFFLOORED : T/MOD >R S>D R> FM/MOD ;
-IFFLOORED : T/ T/MOD SWAP DROP ;
-IFFLOORED : TMOD T/MOD DROP ;
-IFFLOORED : T*/MOD >R M* R> FM/MOD ;
-IFFLOORED : T*/ T*/MOD SWAP DROP ;
-IFSYM : T/MOD >R S>D R> SM/REM ;
-IFSYM : T/ T/MOD SWAP DROP ;
-IFSYM : TMOD T/MOD DROP ;
-IFSYM : T*/MOD >R M* R> SM/REM ;
-IFSYM : T*/ T*/MOD SWAP DROP ;
-
-T{ 0 1 /MOD -> 0 1 T/MOD }T
-T{ 1 1 /MOD -> 1 1 T/MOD }T
-T{ 2 1 /MOD -> 2 1 T/MOD }T
-T{ -1 1 /MOD -> -1 1 T/MOD }T
-T{ -2 1 /MOD -> -2 1 T/MOD }T
-T{ 0 -1 /MOD -> 0 -1 T/MOD }T
-T{ 1 -1 /MOD -> 1 -1 T/MOD }T
-T{ 2 -1 /MOD -> 2 -1 T/MOD }T
-T{ -1 -1 /MOD -> -1 -1 T/MOD }T
-T{ -2 -1 /MOD -> -2 -1 T/MOD }T
-T{ 2 2 /MOD -> 2 2 T/MOD }T
-T{ -1 -1 /MOD -> -1 -1 T/MOD }T
-T{ -2 -2 /MOD -> -2 -2 T/MOD }T
-T{ 7 3 /MOD -> 7 3 T/MOD }T
-T{ 7 -3 /MOD -> 7 -3 T/MOD }T
-T{ -7 3 /MOD -> -7 3 T/MOD }T
-T{ -7 -3 /MOD -> -7 -3 T/MOD }T
-T{ MAX-INT 1 /MOD -> MAX-INT 1 T/MOD }T
-T{ MIN-INT 1 /MOD -> MIN-INT 1 T/MOD }T
-T{ MAX-INT MAX-INT /MOD -> MAX-INT MAX-INT T/MOD }T
-T{ MIN-INT MIN-INT /MOD -> MIN-INT MIN-INT T/MOD }T
-
-T{ 0 1 / -> 0 1 T/ }T
-T{ 1 1 / -> 1 1 T/ }T
-T{ 2 1 / -> 2 1 T/ }T
-T{ -1 1 / -> -1 1 T/ }T
-T{ -2 1 / -> -2 1 T/ }T
-T{ 0 -1 / -> 0 -1 T/ }T
-T{ 1 -1 / -> 1 -1 T/ }T
-T{ 2 -1 / -> 2 -1 T/ }T
-T{ -1 -1 / -> -1 -1 T/ }T
-T{ -2 -1 / -> -2 -1 T/ }T
-T{ 2 2 / -> 2 2 T/ }T
-T{ -1 -1 / -> -1 -1 T/ }T
-T{ -2 -2 / -> -2 -2 T/ }T
-T{ 7 3 / -> 7 3 T/ }T
-T{ 7 -3 / -> 7 -3 T/ }T
-T{ -7 3 / -> -7 3 T/ }T
-T{ -7 -3 / -> -7 -3 T/ }T
-T{ MAX-INT 1 / -> MAX-INT 1 T/ }T
-T{ MIN-INT 1 / -> MIN-INT 1 T/ }T
-T{ MAX-INT MAX-INT / -> MAX-INT MAX-INT T/ }T
-T{ MIN-INT MIN-INT / -> MIN-INT MIN-INT T/ }T
-
-T{ 0 1 MOD -> 0 1 TMOD }T
-T{ 1 1 MOD -> 1 1 TMOD }T
-T{ 2 1 MOD -> 2 1 TMOD }T
-T{ -1 1 MOD -> -1 1 TMOD }T
-T{ -2 1 MOD -> -2 1 TMOD }T
-T{ 0 -1 MOD -> 0 -1 TMOD }T
-T{ 1 -1 MOD -> 1 -1 TMOD }T
-T{ 2 -1 MOD -> 2 -1 TMOD }T
-T{ -1 -1 MOD -> -1 -1 TMOD }T
-T{ -2 -1 MOD -> -2 -1 TMOD }T
-T{ 2 2 MOD -> 2 2 TMOD }T
-T{ -1 -1 MOD -> -1 -1 TMOD }T
-T{ -2 -2 MOD -> -2 -2 TMOD }T
-T{ 7 3 MOD -> 7 3 TMOD }T
-T{ 7 -3 MOD -> 7 -3 TMOD }T
-T{ -7 3 MOD -> -7 3 TMOD }T
-T{ -7 -3 MOD -> -7 -3 TMOD }T
-T{ MAX-INT 1 MOD -> MAX-INT 1 TMOD }T
-T{ MIN-INT 1 MOD -> MIN-INT 1 TMOD }T
-T{ MAX-INT MAX-INT MOD -> MAX-INT MAX-INT TMOD }T
-T{ MIN-INT MIN-INT MOD -> MIN-INT MIN-INT TMOD }T
-
-T{ 0 2 1 */ -> 0 2 1 T*/ }T
-T{ 1 2 1 */ -> 1 2 1 T*/ }T
-T{ 2 2 1 */ -> 2 2 1 T*/ }T
-T{ -1 2 1 */ -> -1 2 1 T*/ }T
-T{ -2 2 1 */ -> -2 2 1 T*/ }T
-T{ 0 2 -1 */ -> 0 2 -1 T*/ }T
-T{ 1 2 -1 */ -> 1 2 -1 T*/ }T
-T{ 2 2 -1 */ -> 2 2 -1 T*/ }T
-T{ -1 2 -1 */ -> -1 2 -1 T*/ }T
-T{ -2 2 -1 */ -> -2 2 -1 T*/ }T
-T{ 2 2 2 */ -> 2 2 2 T*/ }T
-T{ -1 2 -1 */ -> -1 2 -1 T*/ }T
-T{ -2 2 -2 */ -> -2 2 -2 T*/ }T
-T{ 7 2 3 */ -> 7 2 3 T*/ }T
-T{ 7 2 -3 */ -> 7 2 -3 T*/ }T
-T{ -7 2 3 */ -> -7 2 3 T*/ }T
-T{ -7 2 -3 */ -> -7 2 -3 T*/ }T
-T{ MAX-INT 2 MAX-INT */ -> MAX-INT 2 MAX-INT T*/ }T
-T{ MIN-INT 2 MIN-INT */ -> MIN-INT 2 MIN-INT T*/ }T
-
-T{ 0 2 1 */MOD -> 0 2 1 T*/MOD }T
-T{ 1 2 1 */MOD -> 1 2 1 T*/MOD }T
-T{ 2 2 1 */MOD -> 2 2 1 T*/MOD }T
-T{ -1 2 1 */MOD -> -1 2 1 T*/MOD }T
-T{ -2 2 1 */MOD -> -2 2 1 T*/MOD }T
-T{ 0 2 -1 */MOD -> 0 2 -1 T*/MOD }T
-T{ 1 2 -1 */MOD -> 1 2 -1 T*/MOD }T
-T{ 2 2 -1 */MOD -> 2 2 -1 T*/MOD }T
-T{ -1 2 -1 */MOD -> -1 2 -1 T*/MOD }T
-T{ -2 2 -1 */MOD -> -2 2 -1 T*/MOD }T
-T{ 2 2 2 */MOD -> 2 2 2 T*/MOD }T
-T{ -1 2 -1 */MOD -> -1 2 -1 T*/MOD }T
-T{ -2 2 -2 */MOD -> -2 2 -2 T*/MOD }T
-T{ 7 2 3 */MOD -> 7 2 3 T*/MOD }T
-T{ 7 2 -3 */MOD -> 7 2 -3 T*/MOD }T
-T{ -7 2 3 */MOD -> -7 2 3 T*/MOD }T
-T{ -7 2 -3 */MOD -> -7 2 -3 T*/MOD }T
-T{ MAX-INT 2 MAX-INT */MOD -> MAX-INT 2 MAX-INT T*/MOD }T
-T{ MIN-INT 2 MIN-INT */MOD -> MIN-INT 2 MIN-INT T*/MOD }T
-
-\ ------------------------------------------------------------------------
-TESTING HERE , @ ! CELL+ CELLS C, C@ C! CHARS 2@ 2! ALIGN ALIGNED +! ALLOT
-
-HERE 1 ALLOT
-HERE
-CONSTANT 2NDA
-CONSTANT 1STA
-T{ 1STA 2NDA U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT
-T{ 1STA 1+ -> 2NDA }T \ ... BY ONE ADDRESS UNIT
-( MISSING TEST: NEGATIVE ALLOT )
-
-HERE 1 ,
-HERE 2 ,
-CONSTANT 2ND
-CONSTANT 1ST
-T{ 1ST 2ND U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT
-T{ 1ST CELL+ -> 2ND }T \ ... BY ONE CELL
-T{ 1ST 1 CELLS + -> 2ND }T
-T{ 1ST @ 2ND @ -> 1 2 }T
-T{ 5 1ST ! -> }T
-T{ 1ST @ 2ND @ -> 5 2 }T
-T{ 6 2ND ! -> }T
-T{ 1ST @ 2ND @ -> 5 6 }T
-T{ 1ST 2@ -> 6 5 }T
-T{ 2 1 1ST 2! -> }T
-T{ 1ST 2@ -> 2 1 }T
-T{ 1S 1ST ! 1ST @ -> 1S }T \ CAN STORE CELL-WIDE VALUE
-
-HERE 1 C,
-HERE 2 C,
-CONSTANT 2NDC
-CONSTANT 1STC
-T{ 1STC 2NDC U< -> <TRUE> }T \ HERE MUST GROW WITH ALLOT
-T{ 1STC CHAR+ -> 2NDC }T \ ... BY ONE CHAR
-T{ 1STC 1 CHARS + -> 2NDC }T
-T{ 1STC C@ 2NDC C@ -> 1 2 }T
-T{ 3 1STC C! -> }T
-T{ 1STC C@ 2NDC C@ -> 3 2 }T
-T{ 4 2NDC C! -> }T
-T{ 1STC C@ 2NDC C@ -> 3 4 }T
-
-ALIGN 1 ALLOT HERE ALIGN HERE 3 CELLS ALLOT
-CONSTANT A-ADDR CONSTANT UA-ADDR
-T{ UA-ADDR ALIGNED -> A-ADDR }T
-T{ 1 A-ADDR C! A-ADDR C@ -> 1 }T
-T{ 1234 A-ADDR ! A-ADDR @ -> 1234 }T
-T{ 123 456 A-ADDR 2! A-ADDR 2@ -> 123 456 }T
-T{ 2 A-ADDR CHAR+ C! A-ADDR CHAR+ C@ -> 2 }T
-T{ 3 A-ADDR CELL+ C! A-ADDR CELL+ C@ -> 3 }T
-T{ 1234 A-ADDR CELL+ ! A-ADDR CELL+ @ -> 1234 }T
-T{ 123 456 A-ADDR CELL+ 2! A-ADDR CELL+ 2@ -> 123 456 }T
-
-: BITS ( X -- U )
- 0 SWAP BEGIN DUP WHILE DUP MSB AND IF >R 1+ R> THEN 2* REPEAT DROP ;
-( CHARACTERS >= 1 AU, <= SIZE OF CELL, >= 8 BITS )
-T{ 1 CHARS 1 < -> <FALSE> }T
-T{ 1 CHARS 1 CELLS > -> <FALSE> }T
-( TBD: HOW TO FIND NUMBER OF BITS? )
-
-( CELLS >= 1 AU, INTEGRAL MULTIPLE OF CHAR SIZE, >= 16 BITS )
-T{ 1 CELLS 1 < -> <FALSE> }T
-T{ 1 CELLS 1 CHARS MOD -> 0 }T
-T{ 1S BITS 10 < -> <FALSE> }T
-
-T{ 0 1ST ! -> }T
-T{ 1 1ST +! -> }T
-T{ 1ST @ -> 1 }T
-T{ -1 1ST +! 1ST @ -> 0 }T
-
-\ ------------------------------------------------------------------------
-TESTING CHAR [CHAR] [ ] BL S"
-
-T{ BL -> 20 }T
-T{ CHAR X -> 58 }T
-T{ CHAR HELLO -> 48 }T
-T{ : GC1 [CHAR] X ; -> }T
-T{ : GC2 [CHAR] HELLO ; -> }T
-T{ GC1 -> 58 }T
-T{ GC2 -> 48 }T
-T{ : GC3 [ GC1 ] LITERAL ; -> }T
-T{ GC3 -> 58 }T
-T{ : GC4 S" XY" ; -> }T
-T{ GC4 SWAP DROP -> 2 }T
-T{ GC4 DROP DUP C@ SWAP CHAR+ C@ -> 58 59 }T
-
-\ ------------------------------------------------------------------------
-TESTING ' ['] FIND EXECUTE IMMEDIATE COUNT LITERAL POSTPONE STATE
-
-T{ : GT1 123 ; -> }T
-T{ ' GT1 EXECUTE -> 123 }T
-T{ : GT2 ['] GT1 ; IMMEDIATE -> }T
-T{ GT2 EXECUTE -> 123 }T
-HERE 3 C, CHAR G C, CHAR T C, CHAR 1 C, CONSTANT GT1STRING
-HERE 3 C, CHAR G C, CHAR T C, CHAR 2 C, CONSTANT GT2STRING
-T{ GT1STRING FIND -> ' GT1 -1 }T
-T{ GT2STRING FIND -> ' GT2 1 }T
-( HOW TO SEARCH FOR NON-EXISTENT WORD? )
-T{ : GT3 GT2 LITERAL ; -> }T
-T{ GT3 -> ' GT1 }T
-T{ GT1STRING COUNT -> GT1STRING CHAR+ 3 }T
-
-T{ : GT4 POSTPONE GT1 ; IMMEDIATE -> }T
-T{ : GT5 GT4 ; -> }T
-T{ GT5 -> 123 }T
-T{ : GT6 345 ; IMMEDIATE -> }T
-T{ : GT7 POSTPONE GT6 ; -> }T
-T{ GT7 -> 345 }T
-
-T{ : GT8 STATE @ ; IMMEDIATE -> }T
-T{ GT8 -> 0 }T
-T{ : GT9 GT8 LITERAL ; -> }T
-T{ GT9 0= -> <FALSE> }T
-
-\ ------------------------------------------------------------------------
-TESTING IF ELSE THEN BEGIN WHILE REPEAT UNTIL RECURSE
-
-T{ : GI1 IF 123 THEN ; -> }T
-T{ : GI2 IF 123 ELSE 234 THEN ; -> }T
-T{ 0 GI1 -> }T
-T{ 1 GI1 -> 123 }T
-T{ -1 GI1 -> 123 }T
-T{ 0 GI2 -> 234 }T
-T{ 1 GI2 -> 123 }T
-T{ -1 GI1 -> 123 }T
-
-T{ : GI3 BEGIN DUP 5 < WHILE DUP 1+ REPEAT ; -> }T
-T{ 0 GI3 -> 0 1 2 3 4 5 }T
-T{ 4 GI3 -> 4 5 }T
-T{ 5 GI3 -> 5 }T
-T{ 6 GI3 -> 6 }T
-
-T{ : GI4 BEGIN DUP 1+ DUP 5 > UNTIL ; -> }T
-T{ 3 GI4 -> 3 4 5 6 }T
-T{ 5 GI4 -> 5 6 }T
-T{ 6 GI4 -> 6 7 }T
-
-T{ : GI5 BEGIN DUP 2 > WHILE DUP 5 < WHILE DUP 1+ REPEAT 123 ELSE 345 THEN ; -> }T
-T{ 1 GI5 -> 1 345 }T
-T{ 2 GI5 -> 2 345 }T
-T{ 3 GI5 -> 3 4 5 123 }T
-T{ 4 GI5 -> 4 5 123 }T
-T{ 5 GI5 -> 5 123 }T
-
-T{ : GI6 ( N -- 0,1,..N ) DUP IF DUP >R 1- RECURSE R> THEN ; -> }T
-T{ 0 GI6 -> 0 }T
-T{ 1 GI6 -> 0 1 }T
-T{ 2 GI6 -> 0 1 2 }T
-T{ 3 GI6 -> 0 1 2 3 }T
-T{ 4 GI6 -> 0 1 2 3 4 }T
-
-\ ------------------------------------------------------------------------
-TESTING DO LOOP +LOOP I J UNLOOP LEAVE EXIT
-
-T{ : GD1 DO I LOOP ; -> }T
-T{ 4 1 GD1 -> 1 2 3 }T
-T{ 2 -1 GD1 -> -1 0 1 }T
-T{ MID-UINT+1 MID-UINT GD1 -> MID-UINT }T
-
-T{ : GD2 DO I -1 +LOOP ; -> }T
-T{ 1 4 GD2 -> 4 3 2 1 }T
-T{ -1 2 GD2 -> 2 1 0 -1 }T
-T{ MID-UINT MID-UINT+1 GD2 -> MID-UINT+1 MID-UINT }T
-
-T{ : GD3 DO 1 0 DO J LOOP LOOP ; -> }T
-T{ 4 1 GD3 -> 1 2 3 }T
-T{ 2 -1 GD3 -> -1 0 1 }T
-T{ MID-UINT+1 MID-UINT GD3 -> MID-UINT }T
-
-T{ : GD4 DO 1 0 DO J LOOP -1 +LOOP ; -> }T
-T{ 1 4 GD4 -> 4 3 2 1 }T
-T{ -1 2 GD4 -> 2 1 0 -1 }T
-T{ MID-UINT MID-UINT+1 GD4 -> MID-UINT+1 MID-UINT }T
-
-T{ : GD5 123 SWAP 0 DO I 4 > IF DROP 234 LEAVE THEN LOOP ; -> }T
-T{ 1 GD5 -> 123 }T
-T{ 5 GD5 -> 123 }T
-T{ 6 GD5 -> 234 }T
-
-T{ : GD6 ( PAT: T{0 0}T,T{0 0}TT{1 0}TT{1 1}T,T{0 0}TT{1 0}TT{1 1}TT{2 0}TT{2 1}TT{2 2}T )
- 0 SWAP 0 DO
- I 1+ 0 DO I J + 3 = IF I UNLOOP I UNLOOP EXIT THEN 1+ LOOP
- LOOP ; -> }T
-T{ 1 GD6 -> 1 }T
-T{ 2 GD6 -> 3 }T
-T{ 3 GD6 -> 4 1 2 }T
-
-\ ------------------------------------------------------------------------
-TESTING DEFINING WORDS: : ; CONSTANT VARIABLE CREATE DOES> >BODY
-
-T{ 123 CONSTANT X123 -> }T
-T{ X123 -> 123 }T
-T{ : EQU CONSTANT ; -> }T
-T{ X123 EQU Y123 -> }T
-T{ Y123 -> 123 }T
-
-T{ VARIABLE V1 -> }T
-T{ 123 V1 ! -> }T
-T{ V1 @ -> 123 }T
-
-T{ : NOP : POSTPONE ; ; -> }T
-T{ NOP NOP1 NOP NOP2 -> }T
-T{ NOP1 -> }T
-T{ NOP2 -> }T
-
-T{ : DOES1 DOES> @ 1 + ; -> }T
-T{ : DOES2 DOES> @ 2 + ; -> }T
-T{ CREATE CR1 -> }T
-T{ CR1 -> HERE }T
-T{ ' CR1 >BODY -> HERE }T
-T{ 1 , -> }T
-T{ CR1 @ -> 1 }T
-T{ DOES1 -> }T
-T{ CR1 -> 2 }T
-T{ DOES2 -> }T
-T{ CR1 -> 3 }T
-
-T{ : WEIRD: CREATE DOES> 1 + DOES> 2 + ; -> }T
-T{ WEIRD: W1 -> }T
-T{ ' W1 >BODY -> HERE }T
-T{ W1 -> HERE 1 + }T
-T{ W1 -> HERE 2 + }T
-
-\ ------------------------------------------------------------------------
-TESTING EVALUATE
-
-: GE1 S" 123" ; IMMEDIATE
-: GE2 S" 123 1+" ; IMMEDIATE
-: GE3 S" : GE4 345 ;" ;
-: GE5 EVALUATE ; IMMEDIATE
-
-T{ GE1 EVALUATE -> 123 }T ( TEST EVALUATE IN INTERP. STATE )
-T{ GE2 EVALUATE -> 124 }T
-T{ GE3 EVALUATE -> }T
-T{ GE4 -> 345 }T
-
-T{ : GE6 GE1 GE5 ; -> }T ( TEST EVALUATE IN COMPILE STATE )
-T{ GE6 -> 123 }T
-T{ : GE7 GE2 GE5 ; -> }T
-T{ GE7 -> 124 }T
-
-\ ------------------------------------------------------------------------
-TESTING SOURCE >IN WORD
-
-: GS1 S" SOURCE" 2DUP EVALUATE
- >R SWAP >R = R> R> = ;
-T{ GS1 -> <TRUE> <TRUE> }T
-
-VARIABLE SCANS
-: RESCAN? -1 SCANS +! SCANS @ IF 0 >IN ! THEN ;
-
-T{ 2 SCANS !
-345 RESCAN?
--> 345 345 }T
-
-: GS2 5 SCANS ! S" 123 RESCAN?" EVALUATE ;
-T{ GS2 -> 123 123 123 123 123 }T
-
-: GS3 WORD COUNT SWAP C@ ;
-T{ BL GS3 HELLO -> 5 CHAR H }T
-T{ CHAR " GS3 GOODBYE" -> 7 CHAR G }T
-T{ BL GS3
-DROP -> 0 }T \ BLANK LINE RETURN ZERO-LENGTH STRING
-
-: GS4 SOURCE >IN ! DROP ;
-T{ GS4 123 456
--> }T
-
-\ ------------------------------------------------------------------------
-TESTING <# # #S #> HOLD SIGN BASE >NUMBER HEX DECIMAL
-
-: S= \ ( ADDR1 C1 ADDR2 C2 -- T/F ) COMPARE TWO STRINGS.
- >R SWAP R@ = IF \ MAKE SURE STRINGS HAVE SAME LENGTH
- R> ?DUP IF \ IF NON-EMPTY STRINGS
- 0 DO
- OVER C@ OVER C@ - IF
- 2DROP <FALSE> UNLOOP EXIT THEN
- SWAP CHAR+ SWAP CHAR+
- LOOP
- THEN
- 2DROP <TRUE> \ IF WE GET HERE, STRINGS MATCH
- ELSE
- R> DROP 2DROP <FALSE> \ LENGTHS MISMATCH
- THEN ;
-
-: GP1 <# 41 HOLD 42 HOLD 0 0 #> S" BA" S= ;
-T{ GP1 -> <TRUE> }T
-
-: GP2 <# -1 SIGN 0 SIGN -1 SIGN 0 0 #> S" --" S= ;
-T{ GP2 -> <TRUE> }T
-
-: GP3 <# 1 0 # # #> S" 01" S= ;
-T{ GP3 -> <TRUE> }T
-
-: GP4 <# 1 0 #S #> S" 1" S= ;
-T{ GP4 -> <TRUE> }T
-
-24 CONSTANT MAX-BASE \ BASE 2 .. 36
-: COUNT-BITS
- 0 0 INVERT BEGIN DUP WHILE >R 1+ R> 2* REPEAT DROP ;
-COUNT-BITS 2* CONSTANT #BITS-UD \ NUMBER OF BITS IN UD
-
-: GP5
- BASE @ <TRUE>
- MAX-BASE 1+ 2 DO \ FOR EACH POSSIBLE BASE
- I BASE ! \ TBD: ASSUMES BASE WORKS
- I 0 <# #S #> S" 10" S= AND
- LOOP
- SWAP BASE ! ;
-T{ GP5 -> <TRUE> }T
-
-: GP6
- BASE @ >R 2 BASE !
- MAX-UINT MAX-UINT <# #S #> \ MAXIMUM UD TO BINARY
- R> BASE ! \ S: C-ADDR U
- DUP #BITS-UD = SWAP
- 0 DO \ S: C-ADDR FLAG
- OVER C@ [CHAR] 1 = AND \ ALL ONES
- >R CHAR+ R>
- LOOP SWAP DROP ;
-T{ GP6 -> <TRUE> }T
-
-: GP7
- BASE @ >R MAX-BASE BASE !
- <TRUE>
- A 0 DO
- I 0 <# #S #>
- 1 = SWAP C@ I 30 + = AND AND
- LOOP
- MAX-BASE A DO
- I 0 <# #S #>
- 1 = SWAP C@ 41 I A - + = AND AND
- LOOP
- R> BASE ! ;
-
-T{ GP7 -> <TRUE> }T
-
-\ >NUMBER TESTS
-CREATE GN-BUF 0 C,
-: GN-STRING GN-BUF 1 ;
-: GN-CONSUMED GN-BUF CHAR+ 0 ;
-: GN' [CHAR] ' WORD CHAR+ C@ GN-BUF C! GN-STRING ;
-
-T{ 0 0 GN' 0' >NUMBER -> 0 0 GN-CONSUMED }T
-T{ 0 0 GN' 1' >NUMBER -> 1 0 GN-CONSUMED }T
-T{ 1 0 GN' 1' >NUMBER -> BASE @ 1+ 0 GN-CONSUMED }T
-T{ 0 0 GN' -' >NUMBER -> 0 0 GN-STRING }T \ SHOULD FAIL TO CONVERT THESE
-T{ 0 0 GN' +' >NUMBER -> 0 0 GN-STRING }T
-T{ 0 0 GN' .' >NUMBER -> 0 0 GN-STRING }T
-
-: >NUMBER-BASED
- BASE @ >R BASE ! >NUMBER R> BASE ! ;
-
-T{ 0 0 GN' 2' 10 >NUMBER-BASED -> 2 0 GN-CONSUMED }T
-T{ 0 0 GN' 2' 2 >NUMBER-BASED -> 0 0 GN-STRING }T
-T{ 0 0 GN' F' 10 >NUMBER-BASED -> F 0 GN-CONSUMED }T
-T{ 0 0 GN' G' 10 >NUMBER-BASED -> 0 0 GN-STRING }T
-T{ 0 0 GN' G' MAX-BASE >NUMBER-BASED -> 10 0 GN-CONSUMED }T
-T{ 0 0 GN' Z' MAX-BASE >NUMBER-BASED -> 23 0 GN-CONSUMED }T
-
-: GN1 \ ( UD BASE -- UD' LEN ) UD SHOULD EQUAL UD' AND LEN SHOULD BE ZERO.
- BASE @ >R BASE !
- <# #S #>
- 0 0 2SWAP >NUMBER SWAP DROP \ RETURN LENGTH ONLY
- R> BASE ! ;
-T{ 0 0 2 GN1 -> 0 0 0 }T
-T{ MAX-UINT 0 2 GN1 -> MAX-UINT 0 0 }T
-T{ MAX-UINT DUP 2 GN1 -> MAX-UINT DUP 0 }T
-T{ 0 0 MAX-BASE GN1 -> 0 0 0 }T
-T{ MAX-UINT 0 MAX-BASE GN1 -> MAX-UINT 0 0 }T
-T{ MAX-UINT DUP MAX-BASE GN1 -> MAX-UINT DUP 0 }T
-
-: GN2 \ ( -- 16 10 )
- BASE @ >R HEX BASE @ DECIMAL BASE @ R> BASE ! ;
-T{ GN2 -> 10 A }T
-
-\ ------------------------------------------------------------------------
-TESTING FILL MOVE
-
-CREATE FBUF 00 C, 00 C, 00 C,
-CREATE SBUF 12 C, 34 C, 56 C,
-: SEEBUF FBUF C@ FBUF CHAR+ C@ FBUF CHAR+ CHAR+ C@ ;
-
-T{ FBUF 0 20 FILL -> }T
-T{ SEEBUF -> 00 00 00 }T
-
-T{ FBUF 1 20 FILL -> }T
-T{ SEEBUF -> 20 00 00 }T
-
-T{ FBUF 3 20 FILL -> }T
-T{ SEEBUF -> 20 20 20 }T
-
-T{ FBUF FBUF 3 CHARS MOVE -> }T \ BIZARRE SPECIAL CASE
-T{ SEEBUF -> 20 20 20 }T
-
-T{ SBUF FBUF 0 CHARS MOVE -> }T
-T{ SEEBUF -> 20 20 20 }T
-
-T{ SBUF FBUF 1 CHARS MOVE -> }T
-T{ SEEBUF -> 12 20 20 }T
-
-T{ SBUF FBUF 3 CHARS MOVE -> }T
-T{ SEEBUF -> 12 34 56 }T
-
-T{ FBUF FBUF CHAR+ 2 CHARS MOVE -> }T
-T{ SEEBUF -> 12 12 34 }T
-
-T{ FBUF CHAR+ FBUF 2 CHARS MOVE -> }T
-T{ SEEBUF -> 12 34 34 }T
-
-\ ------------------------------------------------------------------------
-TESTING OUTPUT: . ." CR EMIT SPACE SPACES TYPE U.
-
-: OUTPUT-TEST
- ." YOU SHOULD SEE THE STANDARD GRAPHIC CHARACTERS:" CR
- 41 BL DO I EMIT LOOP CR
- 61 41 DO I EMIT LOOP CR
- 7F 61 DO I EMIT LOOP CR
- ." YOU SHOULD SEE 0-9 SEPARATED BY A SPACE:" CR
- 9 1+ 0 DO I . LOOP CR
- ." YOU SHOULD SEE 0-9 (WITH NO SPACES):" CR
- [CHAR] 9 1+ [CHAR] 0 DO I 0 SPACES EMIT LOOP CR
- ." YOU SHOULD SEE A-G SEPARATED BY A SPACE:" CR
- [CHAR] G 1+ [CHAR] A DO I EMIT SPACE LOOP CR
- ." YOU SHOULD SEE 0-5 SEPARATED BY TWO SPACES:" CR
- 5 1+ 0 DO I [CHAR] 0 + EMIT 2 SPACES LOOP CR
- ." YOU SHOULD SEE TWO SEPARATE LINES:" CR
- S" LINE 1" TYPE CR S" LINE 2" TYPE CR
- ." YOU SHOULD SEE THE NUMBER RANGES OF SIGNED AND UNSIGNED NUMBERS:" CR
- ." SIGNED: " MIN-INT . MAX-INT . CR
- ." UNSIGNED: " 0 U. MAX-UINT U. CR
-;
-
-T{ OUTPUT-TEST -> }T
-\ ------------------------------------------------------------------------
-TESTING INPUT: ACCEPT
-
-CREATE ABUF 80 CHARS ALLOT
-
-: ACCEPT-TEST
- CR ." PLEASE TYPE UP TO 80 CHARACTERS:" CR
- ABUF 80 ACCEPT
- CR ." RECEIVED: " [CHAR] " EMIT
- ABUF SWAP TYPE [CHAR] " EMIT CR
-;
-
-T{ ACCEPT-TEST -> }T
-Vingt fois sur le métier remettez votre ouvrage, ... Boileau, L'Art poétique
-\ ------------------------------------------------------------------------
-TESTING DICTIONARY SEARCH RULES
-
-T{ : GDX 123 ; : GDX GDX 234 ; -> }T
-
-T{ GDX -> 123 234 }T
-
-CR .( End of Core word set tests) CR
-
-
-$0A BASE !
-ECHO
- ; end of core test
-PWR_HERE ; preserved against power OFF
! P2.6 - Switch SW2 <--- LCD contrast - (finger ;-)
!
!
-! GND - J1.2 <-------+---0V0----------> 1 LCD_Vss
-! VCC - J1.3 >------ | --3V6-----+----> 2 LCD_Vdd
+! GND - J2.1 <-------+---0V0----------> 1 LCD_Vss
+! VCC - J1.1 >------ | --3V6-----+----> 2 LCD_Vdd
! | |
! ___ 470n ---
! ^ ---
! P4.1 - LFXIN 32768Hz quartz
! P4.2 - LFXOUT 32768Hz quartz
!
+! VCC - J1.1 ----> VCC SD_CardAdapter
+! GND - J2.1 <---> GND SD_CardAdapter
+! P5.1 - UCB0 CLK J1.7 ----> CLK SD_CardAdapter (SCK)
+! P8.1 - J1.2 ----> CS SD_CardAdapter (Card Select)
+! P5.2 - UCB0 TXD/SIMO J2.15 ----> SDI SD_CardAdapter (MOSI)
+! P5.3 - UCB0 RXD/SOMI J2.14 <---- SDO SD_CardAdapter (MISO)
+! P8.0 - J1.6 <---- CD SD_CardAdapter (Card Detect)
+!
!
!
! P8.2 - Soft I2C_Master J1.9 ----> SDA software I2C Master
\ ******************************\
\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
\ ******************************\
-MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+MOV @RSP,X \ retiSR(9) = old UF9 = old RC5 toggle bit
RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
XOR IP,X \ (new XOR old) Toggle bit (13)
BIT #BIT13,X \ X(13) = New_RC5_command
0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
THEN \
-XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+XOR #UF9,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
\ ******************************\
\ RC5_ComputeNewRC5word \
\ ******************************\
\ ******************************\
\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
\ ******************************\
-MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+MOV @RSP,X \ retiSR(9) = old UF9 = old RC5 toggle bit
RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
XOR IP,X \ (new XOR old) Toggle bit (13)
BIT #BIT13,X \ X(13) = New_RC5_command
0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
THEN \
-XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+XOR #UF9,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
\ ******************************\
\ RC5_ComputeNewRC5word \
\ ******************************\
\ ******************************\
\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
\ ******************************\
-MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+MOV @RSP,X \ retiSR(9) = old UF9 = old RC5 toggle bit
RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
XOR IP,X \ (new XOR old) Toggle bit (13)
BIT #BIT13,X \ X(13) = New_RC5_command
0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
THEN \
-XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+XOR #UF9,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
\ ******************************\
\ RC5_ComputeNewRC5word \
\ ******************************\
\ ******************************\
\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
\ ******************************\
-MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+MOV @RSP,X \ retiSR(9) = old UF9 = old RC5 toggle bit
RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
XOR IP,X \ (new XOR old) Toggle bit (13)
BIT #BIT13,X \ X(13) = New_RC5_command
0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
THEN \
-XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+XOR #UF9,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
\ ******************************\
\ RC5_ComputeNewRC5word \
\ ******************************\
\ ******************************\
\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
\ ******************************\
-MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+MOV @RSP,X \ retiSR(9) = old UF9 = old RC5 toggle bit
RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
XOR IP,X \ (new XOR old) Toggle bit (13)
BIT #BIT13,X \ X(13) = New_RC5_command
0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
THEN \
-XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+XOR #UF9,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
\ ******************************\
\ RC5_ComputeNewRC5word \
\ ******************************\
\ ******************************\
\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
\ ******************************\
-MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+MOV @RSP,X \ retiSR(9) = old UF9 = old RC5 toggle bit
RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
XOR IP,X \ (new XOR old) Toggle bit (13)
BIT #BIT13,X \ X(13) = New_RC5_command
0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
THEN \
-XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+XOR #UF9,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
\ ******************************\
\ RC5_ComputeNewRC5word \
\ ******************************\
\ ******************************\
\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
\ ******************************\
-MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+MOV @RSP,X \ retiSR(9) = old UF9 = old RC5 toggle bit
RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
XOR IP,X \ (new XOR old) Toggle bit (13)
BIT #BIT13,X \ X(13) = New_RC5_command
0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
THEN \
-XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+XOR #UF9,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
\ ******************************\
\ RC5_ComputeNewRC5word \
\ ******************************\
\ ******************************\
\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
\ ******************************\
-MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+MOV @RSP,X \ retiSR(9) = old UF9 = old RC5 toggle bit
RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
XOR IP,X \ (new XOR old) Toggle bit (13)
BIT #BIT13,X \ X(13) = New_RC5_command
0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
THEN \
-XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+XOR #UF9,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
\ ******************************\
\ RC5_ComputeNewRC5word \
\ ******************************\
\ ******************************\
\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
\ ******************************\
-MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+MOV @RSP,X \ retiSR(9) = old UF9 = old RC5 toggle bit
RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
XOR IP,X \ (new XOR old) Toggle bit (13)
BIT #BIT13,X \ X(13) = New_RC5_command
0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
THEN \
-XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+XOR #UF9,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
\ ******************************\
\ RC5_ComputeNewRC5word \
\ ******************************\
\ ******************************\
\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
\ ******************************\
-MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+MOV @RSP,X \ retiSR(9) = old UF9 = old RC5 toggle bit
RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
XOR IP,X \ (new XOR old) Toggle bit (13)
BIT #BIT13,X \ X(13) = New_RC5_command
0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
THEN \
-XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+XOR #UF9,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
\ ******************************\
\ RC5_ComputeNewRC5word \
\ ******************************\
\ ******************************\
\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
\ ******************************\
-MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+MOV @RSP,X \ retiSR(9) = old UF9 = old RC5 toggle bit
RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
XOR IP,X \ (new XOR old) Toggle bit (13)
BIT #BIT13,X \ X(13) = New_RC5_command
0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
THEN \
-XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+XOR #UF9,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
\ ******************************\
\ RC5_ComputeNewRC5word \
\ ******************************\
SUB #6,PSP
MOV TOS,4(PSP)
BEGIN
- BIT #$1000,&RTCCTL0 \ test RTCRDY flag
+ BIT.B #RTCRDY,&RTCCTL1 \ test RTCRDY flag
0<> UNTIL \ wait until RTCRDY high
MOV &RTCYEARL,2(PSP) \ year
MOV.B &RTCMON,TOS
2 U.R $2F EMIT .
;
\
-CODE DATE!
+: DATE!
+DEPTH 2 > IF
+ HI2LO
MOV TOS,&RTCYEARL \ year
MOV.B @PSP,&RTCMON \ month \ @PSP+ don't work because byte format !
MOV.B 2(PSP),&RTCDAY \ day \ @PSP+ don't work because byte format !
ADD #4,PSP
MOV @PSP+,TOS \
-COLON
+ LO2HI
+THEN
." we are on " DATE?
;
\
CODE TIME?
SUB #6,PSP
- MOV TOS,4(PSP) \ save TOS
+ MOV TOS,4(PSP) \ save TOS
BEGIN
- BIT #$1000,&RTCCTL0 \ test RTCRDY flag
- 0<> UNTIL \ wait until RTCRDY high
+ BIT.B #RTCRDY,&RTCCTL1 \
+ 0<> UNTIL \ wait until RTCRDY high
MOV.B &RTCSEC,TOS
- MOV TOS,2(PSP) \ seconds
+ MOV TOS,2(PSP) \ seconds
MOV.B &RTCMIN,TOS
- MOV TOS,0(PSP) \ minutes
- MOV.B &RTCHOUR,TOS \ hours
+ MOV TOS,0(PSP) \ minutes
+ MOV.B &RTCHOUR,TOS \ hours
COLON
2 U.R $3A EMIT
2 U.R $3A EMIT 2 U.R
;
\
: TIME!
+DEPTH 1 > IF
DEPTH 2 = IF 0 THEN \ to allow "hour min TIME!" scheme
HI2LO
MOV TOS,&RTCSEC \ seconds
ADD #4,PSP
MOV @PSP+,TOS \
LO2HI
+THEN
." it is " TIME?
;
\
ABUF ABUF 20 (ACCEPT) EVALUATE CR 3 SPACES DATE!
CR CR ." TIME (HMS or HM): "
ABUF ABUF 20 (ACCEPT) EVALUATE CR 3 SPACES TIME!
- CR
- PWR_STATE \ auto remove all this application !
+ CR
HI2LO
MOV #PSTACK,PSP \ to avoid stack empty error if lack of typed values.
MOV @RSP+,IP
MOV @IP+,PC
ENDCODE
-
\
-GET_TIME \ all words created by RTC.f are removed
+PWR_HERE
+ \
+GET_TIME
-\ how to test SD_CARD driver on your target (excepted MSP-EXP430FR4133 without hardware multiplier) :
+\ how to test SD_CARD driver on your launchpad:
-\ connect the launchpad to your PC on a free USB port
-\ on the launchpad remove the jumpers GND, RX, TX of programming port (don't remove TST, RST and VCC jumpers)
+\ remove the jumpers RX, TX of programming port (don't remove GND, TST, RST and VCC)
+\ wire PL2303TA/HXD: GND <-> GND, RX <-- TX, TX --> RX
+\ connect it to your PC on a free USB port
\ connect the PL2303TA/HXD cable to your PC on another free USB port
-\ wire PL2303TA/HXD to the programming port of your launchpad : GND <-> GND, RX <-- TX, TX --> RX
-\ start TERATERM, select PL2303TA/HXD port
\ configure TERATERM as indicated in forthMSP430FR.asm
-\ if you have a MSP-EXP430FR5994, program your launchpad with MSP_EXP430FR5994_3Mbds_SD_CARD.txt via TI interface:
-\ to do, drag and drop this file onto MSP430FR5994prog.bat
-\ else edit forthMSP430FR.asm with scite editor
+\ if you have a MSP-EXP430FR5994 launchpad, program it with MSP_EXP430FR5994_3Mbds_SD_CARD.txt
+\ to do, drag and drop this file onto prog.bat
+\ nothing else to do!
+
-\ with (SHIFT+F8), set param1 as your DEVICE and param2 as your TARGET
-\ uncomment your target,
+\ else edit forthMSP430FR.asm with scite editor
+\ uncomment your target, copy it
+\ paste it into (SHIFT+F8) param1
\ set DTC .equ 1
\ FREQUENCY .equ 16
\ THREADS .equ 16
\ TERMINALBAUDRATE .equ 3000000
\
-\ uncomment TERMINALXONXOFF
-\ LF_XTAL
+\ uncomment: CONDCOMP
\ MSP430ASSEMBLER
\ SD_CARD_LOADER
\ SD_CARD_READ_WRITE
-
-\ compile for your target (CTRL+0)
-\ then program your target via TI interface (CTRL+1).
-
-
-\ format FAT16 or FAT32 a SD_CARD memory (max 64GB)
-\ create folder \MISC on this SD_CARD memory (FastForth don't do yet)
-\ put it in the target SD slot wired as described in MSP430-FORTH\target.pat,
-
-\ type COLD from the console input to reset FAST FORTH,
-
-
-\ with Send_File.4th_to_SD_CARD_target.bat (or from scite editor, menu tools), send to SD_CARD:
-\ CORETSTH.4th
-\ TSTWORDS.4th
-
-\ with Send_File.4th_to_SD_CARD_target.bat, send to SD_CARD\MISC:
-\ TESTASM.4TH (don't forget to add path \MISC on the 2th window opened by TERATERM)
+\
+\ compile for your target (CTRL+0)
+\
+\ program your target via TI interface (CTRL+1)
+\
+\ then wire your SD_Card module as described in your MSP430-FORTH\target.pat file
-\ and if don't know how to do, double clic on this bat file.
-\ with Send_file.f_to_SD_CARD_target.bat, send to SD_CARD: (on SD_CARD files will have 4th extension)
-\ SD_TOOLS.f
-\ SD_TEST.f
-\ PROG10k.f
-\ RTC.f
+\ format FAT16 or FAT32 a SD_CARD memory (max 64GB) with "FRxxxx" in the disk name
+\ drag and drop \CONDCOMP\MISC folder on the root of this SD_CARD memory (FastForth doesn't do yet)
+\ put it in your target SD slot
+\ if no reset, type COLD from the console input (teraterm) to reset FAST FORTH
+\ with MSP430FR5xxx or MSP430FR6xxx targets, you can first set RTC:
+\ by downloading RTC.f with SendSourceFileToTarget.bat
+\ then terminal input asks you to type (with spaces) (DMY), then (HMS) (or (HM)),
+\ So, subsequent copied files will be dated:
-\ then, from input terminal (TERATERM),
-\ LOAD" RTC.4th", type (with spaces) Day Month Year, then type Hours Minutes Seconds (or Hours Minutes),
-\ LOAD" SD_TEST.4TH" that load this file.
+\ with CopySourceFileToTarget_SD_Card.bat (or better, from scite editor, menu tools):
+\ copy TESTASM.4TH to \MISC\TESTASM.4TH (add path \MISC in the window opened by TERATERM)
+\ copy TSTWORDS.4TH to \TSTWORDS.4TH
+\ copy CORETEST_xMPY.4TH to \CORETEST.4TH (x=S for FR4133, else x=H; suppr _xMPY in the window opened by TERATERM)
+\ copy SD_TOOLS.f to \SD_TOOLS.4TH
+\ copy SD_TEST.f to \SD_TEST.4TH
+\ copy PROG10k.f to \PROG10k.4TH
+\ copy RTC.f to \RTC.4TH ( doesn't work with if FR2xxx or FR4xxx)
-LOAD" SD_TOOLS.4TH"
-RST_HERE
-NOECHO
-\ we can see interest of preprocessing that allows the use of the PROGRAMSTART address, not recognized by FASTFORTH
-\ in the preprocessed file SD_TEST.4th, PROGRAMSTART will be replaced by its value.
-\ PROGRAMSTART is defined in \config\gema\MSP430FR_FastForth.pat
: SD_TEST
ECHO CR
." 4 Write a dump of the FORTH kernel to yourfile.txt" CR
." 5 append a dump of the FORTH kernel to yourfile.txt" CR
." 6 Load truc (test error)" CR
+ ." 7 Set date and time" CR
." your choice : "
KEY
48 -
DUP 1 =
IF .
-\ LOAD" COMPHMPY.4TH" \ bug, bug, bug: only 2th line is executed
-\ LOAD" CORETST1.4TH" \ why ?
- LOAD" CORETSTH.4TH" \ so CORETSTH.4TH is the sum of two previous files
+ LOAD" CORETEST.4TH"
ELSE DUP 2 =
IF .
- LOAD" Prog10k.4th"
+ LOAD" PROG10K.4TH"
ELSE DUP 3 =
IF .
- READ" Prog10k.4th"
+ READ" PROG10K.4TH"
BEGIN
- READ
- UNTIL
+ READ \ sequentially read 512 bytes
+ UNTIL \ prog10k.4TH is closed
ELSE DUP 4 =
IF .
- DEL" yourfile.txt"
- WRITE" yourfile.txt"
+ DEL" YOURFILE.TXT"
+ WRITE" YOURFILE.TXT"
['] SD_EMIT IS EMIT
PROGRAMSTART HERE OVER - DUMP
['] (EMIT) IS EMIT
CLOSE
ELSE DUP 5 =
IF .
- WRITE" yourfile.txt"
+ WRITE" YOURFILE.TXT"
['] SD_EMIT IS EMIT
PROGRAMSTART HERE OVER - DUMP
['] (EMIT) IS EMIT
ELSE DUP 6 =
IF .
LOAD" truc"
- ELSE
- DROP ." ?"
- CR ." loading TSTWORDS.4th..."
- LOAD" TSTWORDS.4TH"
+ ELSE DUP 7 =
+ IF .
+ LOAD" RTC.4TH"
+ ELSE
+ DROP ." ?"
+ CR ." loading TSTWORDS.4TH..."
+ LOAD" TSTWORDS.4TH"
+ THEN
THEN
THEN
THEN
THEN
THEN
THEN
- CR ." It's done..."
;
-PWR_HERE
+; It's done..."
SD_TEST
+++ /dev/null
-you have downloaded your copy of gitlab fast forth onto a folder shared and connected as virtual drive (A: or B: or ... or Y: or Z:)
- so config files.pat for the preprocessor gema.exe are in the folder \config\gema\
- and batch file are in the folder \config\scite\msp430_as\,
-you have installed the last version of teraterm,
-you have installed the last version of gema.exe in the folder \prog\gema\.
-
-finally, edit properties of these three shortcuts "send_file.f_to_target.bat", "send_file.4th_to_target.bat file" and
-process_file.f_to_file.4th.bat to change the drive letter B: as yours.
-
-before sending a file :
-=====================
- teraterm must be well configured, and its config must be saved,
- i.e. you must see the FAST FORTH prompt "ok" when you type <return> on the teraterm terminal. (you can then close the teraterm window).
-
-
-to send a file.f to a specific target :
-=====================================
- 1 clic on the what_you_want.f file example : utility.f
- 2 ctrl+clic on the what_you_want.pat file example : MSP_EXP430FR5969.pat (target = MSP_EXP430FR5969 launchpad)
- 3 release ctrl and clic
- 4 then drag and drop the what_you_want.f file onto the send_file.f_to_target.bat file
- - -
-the *.pat files are used by the preprocesor GEMA.exe to translate symbolic labels from *.f files in their values to *.4th files.
-
-to send a file.4th to any target :
-================================
- drag and drop the what_you_want.4th file onto the send_file.4th_to_target.bat file example : coretest.4th
- --- ---
-
-to preprocess file.f to file.4th (debug) :
-========================================
-do same as to send a file.f, but with process_file.f_to_file.4th.bat
-
-
-To send a file to be written on SD_CARD target, process with the specific SD_CARD_target.bat.
-When TERATERM ask you for file to send, you can add a path to the file to be written on SD_CARD.
-
-
-
-
-As these bat files are in fact shortcuts, you can define them to execute with hidden window.
-
-
-
+++ /dev/null
-\prog\MSP430Flasher\msp430flasher -m SBW2 -n MSP430fr2433 -v -w %1 -z [VCC=3000]
-exit
-
-tip : how to calculate MAIN program lenght ?
-
-open the prog.txt file with your editor, select MAIN section
-in status bar, keep the number of selected chars
-if lines are ended with CR+LF, substract the number of lines selected
-then divide by 3.
+++ /dev/null
-\prog\MSP430Flasher\msp430flasher -m SBW2 -n MSP430fr4133 -v -w %1 -z [VCC=3000]
-exit
-
-tip : how to calculate MAIN program lenght ?
-
-open the prog.txt file with your editor, select MAIN section
-in status bar, keep the number of selected chars
-if lines are ended with CR+LF, substract the number of lines selected
-then divide by 3.
+++ /dev/null
-\prog\MSP430Flasher\msp430flasher -m SBW2 -n MSP430fr5739 -v -w %1 -z [VCC=3000]
-exit
-
-tip : how to calculate MAIN program lenght ?
-
-open the prog.txt file with your editor, select MAIN section
-in status bar, keep the number of selected chars
-if lines are ended with CR+LF, substract the number of lines selected
-then divide by 3.
+++ /dev/null
-\prog\MSP430Flasher\msp430flasher -m SBW2 -n MSP430fr5969 -v -w %1 -z [VCC=3000]
-exit
-
-tip : how to calculate MAIN program lenght ?
-
-open the prog.txt file with your editor, select MAIN section
-in status bar, keep the number of selected chars
-if lines are ended with CR+LF, substract the number of lines selected
-then divide by 3.
+++ /dev/null
-\prog\MSP430Flasher\msp430flasher -m SBW2 -n MSP430fr5994 -v -w %1 -z [VCC=3000]
-exit
-
-tip : how to calculate MAIN program lenght ?
-
-open the prog.txt file with your editor, select MAIN section
-in status bar, keep the number of selected chars
-if lines are ended with CR+LF, substract the number of lines selected
-then divide by 3.
-a:\prog\MSP430Flasher\msp430flasher -e ERASE_TOTAL
\ No newline at end of file
+a:\prog\MSP430Flasher\msp430flasher -e ERASE_TOTAL
+pause
+++ /dev/null
-\prog\MSP430Flasher\msp430flasher -m SBW2 -n MSP430fr6989 -v -w %1 -z [VCC=3000]
-exit
-
-tip : how to calculate MAIN program lenght ?
-
-open the prog.txt file with your editor, select MAIN section
-in status bar, keep the number of selected chars
-if lines are ended with CR+LF, substract the number of lines selected
-then divide by 3.
--- /dev/null
+\ BOOT.4th
+
+\ SYSRSTIV decimal values for MSP430FR5994
+\ ----------------------------------------
+\ 00 No interrupt pending
+\ 02 Brownout (BOR)
+\ 04 RSTIFG RST/NMI (BOR)
+\ 06 PMMSWBOR software BOR (BOR)
+\ 08 LPMx.5 wake up (BOR)
+\ 10 Security violation (BOR)
+\ 12 Reserved
+\ 14 SVSHIFG SVSH event (BOR)
+\ 16 Reserved
+\ 18 Reserved
+\ 20 PMMSWPOR software POR (POR)
+\ 22 WDTIFG watchdog timeout (PUC)
+\ 24 WDTPW password violation (PUC)
+\ 26 FRCTLPW password violation (PUC)
+\ 28 Uncorrectable FRAM bit error detection (PUC)
+\ 30 Peripheral area fetch (PUC)
+\ 32 PMMPW PMM password violation (PUC)
+\ 34 MPUPW MPU password violation (PUC)
+\ 36 CSPW CS password violation (PUC)
+\ 38 MPUSEGIPIFG encapsulated IP memory segment violation (PUC)
+\ 40 MPUSEGIIFG information memory segment violation (PUC)
+\ 42 MPUSEG1IFG segment 1 memory violation (PUC)
+\ 44 MPUSEG2IFG segment 2 memory violation (PUC)
+\ 46 MPUSEG3IFG segment 3 memory violation (PUC)
+
+\ values added by FAST FORTH
+\ --------------------------
+\ 05 reset after compilation of FAST FORTH kernel
+\ -1 hardware DEEP RESET
+
+; ================
+; BOOTSTRAP
+; ================
+
+\ Causes of reset is kept in SYSRSTIV register. Their values are device specific.
+\ WARM displays the content of SYSRSTIV register.
+\ When BOOT.4TH is called by the FastForth bootstrap, ths SYSRSTIV value is on
+\ the paramater stack, ready to test:
+
+$05 = [IF] ; test cause of reset
+LOAD" SD_TEST.4TH"
+[THEN]
+ECHO ; in all case, don't forget to set ECHO !
--- /dev/null
+\ -*- coding: utf-8 -*-
+\ http://patorjk.com/software/taag/#p=display&f=Banner&t=Fast Forth
+
+\ Fast Forth For Texas Instrument MSP430FRxxxx FRAM devices
+\ Copyright (C) <2015> <J.M. THOORENS>
+\
+\ This program is free software: you can redistribute it and/or modify
+\ it under the terms of the GNU General Public License as published by
+\ the Free Software Foundation, either version 3 of the License, or
+\ (at your option) any later version.
+\
+\ This program is distributed in the hope that it will be useful,
+\ but WITHOUT ANY WARRANTY; without even the implied warranty of
+\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+\ GNU General Public License for more details.
+\
+\ You should have received a copy of the GNU General Public License
+\ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+\ https://forth-standard.org/standard/core/HOLDS
+\ Adds the string represented by addr u to the pictured numeric output string
+\ compilation use: <# S" string" HOLDS #>
+\ free HOLDS chars space in the 32+2 bytes HOLD area = {24,21,0} chars with a 32 bits sized {hexa,decimal,binary} number.
+\ perfect to display all a line on LCD 2x20 chars...
+\ C HOLDS addr u --
+CODE HOLDS
+ MOV @PSP+,X \ 2
+ ADD TOS,X \ 1 src
+ MOV &HP,Y \ 3 dst
+BEGIN SUB #1,Y \ 1 dst-1
+ SUB #1,X \ 1 src-1
+ SUB #1,TOS \ 1 cnt-1
+U>= WHILE \ 2
+ MOV.B @X,0(Y) \ 4
+REPEAT \ 2
+ MOV Y,&HP \ 3
+ MOV @PSP+,TOS \ 2
+ NEXT \ 4 15 words
+ENDCODE
+
+
+\ https://forth-standard.org/standard/core/StoD
+\ Convert the number n to the double-cell number d with the same numerical value.
+CODE S>D \ n -- d
+SUB #2,PSP
+MOV TOS,0(PSP)
+BIT #$8000,TOS
+MOV #0,TOS
+0<> IF
+ SUB #1,TOS
+THEN
+NEXT
+ENDCODE
+ \
+
+\ https://forth-standard.org/standard/core/VALUE
+
+\ Skip leading space delimiters. Parse name delimited by a space.
+\ Create a definition for name with the execution semantics defined below,
+\ with an initial value equal to x.
+
+\ Place x on the stack. The value of x is that given when name was created,
+\ until the phrase x TO name is executed, causing a new value of x to be assigned to name.
+
+CODE VALUE
+ MOV #CONSTANT,PC
+ENDCODE
+
+CODE TO
+ MOV #IS,PC
+ENDCODE IMMEDIATE
+
+
+
+
+\ input: file size double word Sector_per_cluster {1,2,4,8,16,32,64}
+\ output cluster double word and cluster offset
+CODE SD_DIV \ SIZ_LO SIZ_HI SECPERCLU -- CLU_LO CLU_HI OFFSET
+MOV.B 3(PSP),Y \ Y = 0:CurSizeLOHi
+MOV.B @PSP,X \ X = 0:CurSizeHILo
+SWPB X \ X = CurSizeHIlo:0
+ADD Y,X \ X = CurSizeHIlo:CurSizeLOhi
+MOV.B 1(PSP),Y \ Y:X = CurSize / 256
+\ RRA Y \ Y = Sectors number_High
+\ RRC X \ X = Sectors number_Low
+
+MOV.B TOS,T \ T = divisor = SECPERCLU
+
+MOV #0,W \ 1 W = 0:REMlo = 0
+MOV #8,S \ 1 CNT
+\ RRA T \ 1 0>0:SPClo>C preshift one right DIVISOR
+BEGIN
+ RRA Y \ 1 0>SEC_HI>C
+ RRC X \ 1 C>SEC_LO>C
+ RRC.B W \ 1 C>REMlo>C
+ SUB #1,S \ CNT-1
+ RRA T \ 1 0>SPChi:SPClo>C
+U>= UNTIL
+BEGIN
+ RRA W \ 1 0>0:REMlo>C
+ SUB #1,S \ 1 CNT-1
+\ 0= UNTIL \ Y = OFFSET, S = CLU_LO, W = CLU_HI
+S< UNTIL \ Y = OFFSET, S = CLU_LO, W = CLU_HI
+MOV.B W,TOS \ -- xx xx REMlo
+MOV X,2(PSP) \ -- CLU_LO xx OFFSET
+MOV Y,0(PSP) \ -- CLU_LO CLU_HI OFFSET
+MOV @IP+,PC
+ENDCODE
+
+
+\ tests tools
+\ -----------
+ \
+
+VARIABLE >PAD \ declaration to do in start of source file
+PAD IS >PAD \ init >PAD, idem
+ \
+
+\ sample anything during an interrupt for example
+\ usage in ASSEMBLER WORD : ... LO2HI SAMPLE HI2LO ... if IP is already saved
+\ usage in ASSEMBLER WORD : ... PUSH IP LO2HI SAMPLE HI2LO MOV @RSP+,IP ... if IP is not already saved
+\ usage in FORTH WORD : ... SAMPLE ...
+
+CODE SAMPLE2PAD
+CMP #TIB,&>PAD \ 4 do nothing if [>PAD] = TIB
+0<> IF \ 2
+ MOV &>PAD,R6 \ 3 R6 = rDOVAR
+ MOV &TB0R,0(R6) \ 5 we want sample TB0R
+ MOV W,2(R6)
+ ADD #4,&>PAD \ 3
+ MOV #R>,R6 \ 2 RFROM ==> rDOVAR
+THEN \
+MOV @IP+,PC \ 4
+ENDCODE \ add LO2HI = 10 + 23 = 33 cycles ==> 4us @ 8MHz
+ \
+
+\ display samples, up to 42 samples
+CODE DISPLAY_S \ --
+CMP #PAD,&>PAD
+0= IF
+ NEXT
+THEN
+COLON
+CR
+>PAD @ PAD DO \ limit first --
+ I @ U.
+2 +LOOP
+PAD IS >PAD \ reset >PAD
+;
+ \
+
+
+
+
+DEFER TEST
+ \
+CODE NOOP \ compile MOV #NEXT,PC
+NEXT
+ENDCODE
+ \
+
+CODE SAMPLE. \ display what you want ( much slower than SAMPLE2PAD )
+ SUB #4,PSP
+ MOV TOS,2(PSP)
+ MOV &BASE,0(PSP)
+ MOV &GPFLAGS,TOS \ we want sample GPFLAGS
+ MOV #$10,&BASE
+ PUSHM S,Y
+ COLON
+ ." $" U.
+ BASE !
+ HI2LO
+ MOV @RSP+,IP
+ POPM Y,S
+ NEXT
+ENDCODE
+ \
+
+\ ' SAMPLE. IS TEST \ to start test
+\ ' NOOP IS TEST \ to stop test
+
+
--- /dev/null
+\ -*- coding: utf-8 -*-
+\
+\ Fast Forth For Texas Instrument MSP430FRxxxx FRAM devices
+\ Copyright (C) <2017> <J.M. THOORENS>
+\
+\ This program is free software: you can redistribute it and/or modify
+\ it under the terms of the GNU General Public License as published by
+\ the Free Software Foundation, either version 3 of the License, or
+\ (at your option) any later version.
+\
+\ This program is distributed in the hope that it will be useful,
+\ but WITHOUT ANY WARRANTY; without even the implied warranty of
+\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+\ GNU General Public License for more details.
+\
+\ You should have received a copy of the GNU General Public License
+\ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+MARKER {CONDCOMP}
+ \
+
+
+
+
+\ COMPARE ( c-addr1 u1 c-addr2 u2 -- n )
+\ https://forth-standard.org/standard/string/COMPARE
+\ Compare the string specified by c-addr1 u1 to the string specified by c-addr2 u2.
+\ The strings are compared, beginning at the given addresses, character by character,
+\ up to the length of the shorter string or until a difference is found.
+\ If the two strings are identical, n is zero.
+\ If the two strings are identical up to the length of the shorter string,
+\ n is minus-one (-1) if u1 is less than u2 and one (1) otherwise.
+\ If the two strings are not identical up to the length of the shorter string,
+\ n is minus-one (-1) if the first non-matching character in the string specified by c-addr1 u1
+\ has a lesser numeric value than the corresponding character in the string specified by c-addr2 u2 and one (1) otherwise.
+CODE COMPARE
+ MOV TOS,S \ 1 u2 = S
+ MOV @PSP+,Y \ 2 addr2 = Y
+ MOV @PSP+,T \ 2 u1 = T
+ MOV @PSP+,X \ 2 addr1 = X
+BEGIN MOV T,TOS \ 1
+ ADD S,TOS \ 1
+ 0= ?GOTO FW3 \ 2 end of all successfull comparisons
+ SUB #1,S \ 1
+ 0< ?GOTO FW2 \ 2 u2<u1 ==> u1>u2
+ SUB #1,T \ 1
+ 0< ?GOTO FW1 \ 2 u1<u2
+ ADD #1,X \ 1
+ CMP.B @Y+,-1(X) \ 4 char1-char2
+0<> UNTIL \ 2 char1=char2 17~ loop
+ U< IF \ char1<char2
+FW1 MOV #-1,TOS \ 1
+ MOV @IP+,PC \ 4
+ THEN \ 2 char1>char2
+FW2 MOV #1,TOS \ 1
+FW3 MOV @IP+,PC \ 4 20 words
+ENDCODE
+ \
+
+\ [THEN]
+\ https://forth-standard.org/standard/tools/BracketTHEN
+: [THEN]
+; IMMEDIATE
+ \
+
+\ [ELSE]
+\ Compilation:
+\ Perform the execution semantics given below.
+\ Execution:
+\ ( "<spaces>name ..." -- )
+\ Skipping leading spaces, parse and discard space-delimited words from the parse area,
+\ including nested occurrences of [IF] ... [THEN] and [IF] ... [ELSE] ... [THEN],
+\ until the word [THEN] has been parsed and discarded.
+\ If the parse area becomes exhausted, it is refilled as with REFILL.
+: [ELSE]
+1 \ -- level
+BEGIN
+ BEGIN BL WORD COUNT \ -- lvl adr len
+ DUP \ -- lvl adr len len
+ WHILE \ -- lvl adr len test len
+ OVER OVER \ -- lvl adr len adr len OVER OVER = 2DUP
+ S" [IF]" COMPARE \ -- lvl adr len flag
+ 0= IF \ -- lvl adr len
+ DROP DROP 1 + \ -- lvl+1
+ ELSE \ -- lvl adr len
+ OVER OVER \ -- lvl adr len adr len
+ S" [ELSE]" COMPARE
+ 0= IF \ -- lvl adr len
+ DROP DROP 1 - DUP \ -- lvl-1 lvl-1
+ IF 1 + \ -- lvl' = lvl
+ THEN \ -- lvl'
+ ELSE \ -- lvl adr len
+ S" [THEN]" COMPARE
+ 0= IF 1 - \ -- lvl' = lvl-1
+ THEN
+ THEN
+ THEN \ -- lvl'
+ ?DUP 0= IF
+ EXIT \ -- if lvl = 0
+ THEN \ -- lvl'
+ REPEAT
+ \ -- lvl adr len
+ DROP DROP \ -- lvl
+ CR ." ko "
+ TIB DUP TIB_SIZE \ refill TIB with next line
+ ACCEPT
+ HI2LO
+ MOV TOS,&SOURCE_LEN
+ MOV @PSP+,&SOURCE_ADR
+ MOV @PSP+,TOS
+ MOV #0,&>IN
+ LO2HI
+AGAIN \ -- lvl
+; IMMEDIATE
+ \
+
+\ [IF]
+\ https://forth-standard.org/standard/tools/BracketIF
+\ Compilation:
+\ Perform the execution semantics given below.
+\ Execution: ;( flag | flag "<spaces>name ..." -- )
+\ If flag is true, do nothing. Otherwise, skipping leading spaces,
+\ parse and discard space-delimited words from the parse area,
+\ including nested occurrences of [IF] ... [THEN] and [IF] ... [ELSE] ... [THEN],
+\ until either the word [ELSE] or the word [THEN] has been parsed and discarded.
+\ If the parse area becomes exhausted, it is refilled as with REFILL. [IF] is an immediate word.
+\ An ambiguous condition exists if [IF] is POSTPONEd,
+\ or if the end of the input buffer is reached and cannot be refilled before the terminating [ELSE] or [THEN] is parsed.
+: [IF]
+0= IF POSTPONE [ELSE]
+THEN
+; IMMEDIATE
+ \
+
+\ [UNDEFINED]
+\ https://forth-standard.org/standard/tools/BracketUNDEFINED
+\ Compilation:
+\ Perform the execution semantics given below.
+\ Execution: ( "<spaces>name ..." -- flag )
+\ Skip leading space delimiters. Parse name delimited by a space.
+\ Return a false flag if name is the name of a word that can be found,
+\ otherwise return a true flag.
+: [UNDEFINED]
+ BL WORD FIND NIP 0=
+; IMMEDIATE
+ \
+
+\ [DEFINED]
+\ https://forth-standard.org/standard/tools/BracketDEFINED
+\ Compilation:
+\ Perform the execution semantics given below.
+\ Execution:
+\ ( "<spaces>name ..." -- flag )
+\ Skip leading space delimiters. Parse name delimited by a space.
+\ Return a true flag if name is the name of a word that can be found,
+\ otherwise return a false flag. [DEFINED] is an immediate word.
+: [DEFINED]
+ BL WORD FIND NIP
+; IMMEDIATE
+ \
+
+RST_HERE
; ------------------------
-; file name : coretst1.4th
+; file name : coretest.4th
; ------------------------
-ECHO ; if an error occurs, uncomment this line before new download to find it.
+RST_STATE ; so ANS_COMPLEMENT_xx_MPY is conserved ;
\ From: John Hayes S1I
: ACCEPT-TEST
CR ." PLEASE TYPE UP TO 80 CHARACTERS:" CR
-\ ABUF 80 ACCEPT
- ABUF 80 (ACCEPT) \ JMT: because ACCEPT is DEFERred to SD_ACCEPT
+ ABUF 80 ACCEPT
CR ." RECEIVED: " [CHAR] " EMIT
ABUF SWAP TYPE [CHAR] " EMIT CR
;
T{ ACCEPT-TEST -> }T
+Vingt fois sur le métier remettez votre ouvrage, ... Boileau, L'Art poétique
\ ------------------------------------------------------------------------
TESTING DICTIONARY SEARCH RULES
CR .( End of Core word set tests) CR
-$0A BASE !
+\ ------------------------------------------------------------------------
+\ you must set ON compilation switch LOWERCASE to pass this test
+TESTING COMPARE
+: CMOVE MOVE ;
+: s1 S" abcdefghijklmnopqrstuvwxyz" ;
+: s6 S" 123456" ;
+
+T{ s1 s1 COMPARE -> 0 }T
+T{ s1 PAD SWAP CMOVE -> }T \ Copy s1 to PAD
+T{ s1 PAD OVER COMPARE -> 0 }T
+T{ s1 PAD 6 COMPARE -> 1 }T
+T{ PAD 10 s1 COMPARE -> -1 }T
+T{ s1 PAD 0 COMPARE -> 1 }T
+T{ PAD 0 s1 COMPARE -> -1 }T
+T{ s1 s6 COMPARE -> 1 }T
+T{ s6 s1 COMPARE -> -1 }T
+: "abdde" S" abdde" ;
+: "abbde" S" abbde" ;
+: "abcdf" S" abcdf" ;
+: "abcdee" S" abcdee" ;
+
+T{ s1 "abdde" COMPARE -> -1 }T
+T{ s1 "abbde" COMPARE -> 1 }T
+T{ s1 "abcdf" COMPARE -> -1 }T
+T{ s1 "abcdee" COMPARE -> 1 }T
+
+: s11 S" 0abc" ;
+: s12 S" 0aBc" ;
+
+T{ s11 s12 COMPARE -> 1 }T
+T{ s12 s11 COMPARE -> -1 }T
- ; happy end of core test
+$0A BASE !
+ECHO
+ ; end of core test
+PWR_HERE ; preserved against power OFF ;
--- /dev/null
+! -*- coding: utf-8 -*-
+! ChipStick_FR2433.pat
+!
+! Fast Forth For M. Ken Boak "ChipStick"
+!
+! Copyright (C) <2016> <J.M. THOORENS>
+!
+! This program is free software: you can redistribute it and/or modify
+! it under the terms of the GNU General Public License as published by
+! the Free Software Foundation, either version 3 of the License, or
+! (at your option) any later version.
+!
+! This program is distributed in the hope that it will be useful,
+! but WITHOUT ANY WARRANTY; without even the implied warranty of
+! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+! GNU General Public License for more details.
+!
+! You should have received a copy of the GNU General Public License
+! along with this program. If not, see <http://www.gnu.org/licenses/>.
+!
+!
+!
+! ======================================================================
+! MSP430FR2433 Config
+! ======================================================================
+
+@define{@read{/config/gema/MSP430FR2433.pat}}
+@define{@read{/config/gema/MSP430FR2x4x_FastForth.pat}}
+@define{@read{/config/gema/FastForthREGtoTI.pat}}
+@define{@read{/config/gema/RemoveComments.pat}}
+
+! ---------------------------------------------------
+! CHIPSTICK_FR2433 <--> OUTPUT WORLD
+! ---------------------------------------------------
+! P3.1 - LED1
+!
+! P2.1 - PL2.2 - SW1
+! P2.0 - PL2.3 - SW2
+!
+! +--4k7-< DeepRST <-- GND
+! |
+! P1.4 - UCA0 TXD PL1.4 - <-+-> RX UARTtoUSB bridge
+! P1.5 - UCA0 RXD PL1.3 - <---- TX UARTtoUSB bridge
+! P3.2 - RTS PL1.2 - ----> CTS UARTtoUSB bridge (if TERMINALCTSRTS option)
+! -
+! P3.0 - PL1.7 - ----> /CS SPI_RAM
+! P1.1 - UCB0 CLK PL1.9 - ----> CLK SPI_RAM
+! P1.2 - UCB0 SIMO PL1.10 - ----> SI SPI_RAM
+! P1.3 - UCB0 SOMI PL2.10 - <---- S0 SPI_RAM
+!
+!
+! P1.1 - UCB0 CLK PL1.9 - ----> SD_CLK
+! P1.2 - UCB0 SIMO PL1.10 - ----> SD_SDI
+! P1.3 - UCB0 SOMI PL2.10 - <---- SD_SDO
+! P2.3 - PL1.6 - <---- SD_CD (Card Detect)
+! P2.2 - PL2.9 - ----> SD_CS (Card Select)
+!
+! P1.2 - UCB0 SDA PL1.10 - <---> SDA I2C Slave
+! P1.3 - UCB0 SCL PL2.10 - ----> SCL I2C Slave
+!
+! P2.2 - PL2.9 - ----> SCL I2C SoftMaster
+! P2.0 - PL2.3 - <---> SDA I2C SoftMaster
+!
+! P1.0 - UCB0 STE PL1.8 - <---- TSSOP32236 (IR RC5)
+
+
+! ============================================
+! FORTH I/O :
+! ============================================
+TERM_TX=\$10! ; P1.4 = TX
+TERM_RX=\$20! ; P1.5 = RX
+TERM_TXRX=\$30!
+
+TERM_REN=\$206!
+TERM_SEL=\$20C!
+TERM_IE=\$21A!
+TERM_IFG=\$21C!
+Deep_RST=\$10! ; = TX pin
+Deep_RST_IN=\$200! ; TERMINAL TX pin as FORTH Deep_RST
+
+RTS=4! ; P3.2
+CTS=1! ; P3.0
+HANDSHAKIN=\$220!
+HANDSHAKOUT=\$222!
+
+SD_CD=8! ; P2.3 as SD_CD
+SD_CS=4! ; P2.2 as SD_CS
+SD_CDIN=\$201!
+SD_CSOUT=\$203!
+SD_CSDIR=\$205!
+
+SD_SEL1=\$20C! ; to configure UCB0
+SD_REN=\$206! ; to configure pullup resistors
+SD_BUS=\$0E! ; pins P1.1 as UCB0CLK, P1.2 as UCB0SIMO & P1.3 as UCB0SOMI
+
+
+! ============================================
+! APPLICATION I/O :
+! ============================================
+LED1_OUT=\$222!
+LED1=\$02! P3.1
+
+SW1_IN=\$201!
+SW1=\$02! P2.1
+
+SW2_IN=\$201!
+SW2=\$01! P2.0
+
+
+IR_IN=\$200!
+IR_OUT=\$202!
+IR_DIR=\$204!
+IR_REN=\$208!
+IR_IES=\$218!
+IR_IE=\$21A!
+IR_IFG=\$21C!
+IR_Vec=\$FFDC! P1 int
+RC5_=RC5_!
+RC5=\$01! P1.0
+
+I2CSM_IN=\$201!
+I2CSM_OUT=\$203!
+I2CSM_DIR=\$205!
+I2CSM_REN=\$207!
+SMSDA=\$01! P2.0
+SMSCL=\$04! P2.2
+SM_BUS=\$05!
+
+I2CSMM_IN=\$201!
+I2CSMM_OUT=\$203!
+I2CSMM_DIR=\$205!
+I2CSMM_REN=\$207!
+SMMSDA=\$01! P2.0
+SMMSCL=\$04! P2.2
+SMM_BUS=\$05!
+
+I2CMM_IN=\$200!
+I2CMM_OUT=\$202!
+I2CMM_DIR=\$204!
+I2CMM_REN=\$206!
+I2CMM_SEL1=\$20C!
+I2CMM_Vec=\$FFE0!
+MMSDA=\$04! P1.2
+MMSCL=\$08! P1.3
+MM_BUS=\$0C!
+
+I2CM_IN=\$200!
+I2CM_OUT=\$202!
+I2CM_DIR=\$204!
+I2CM_REN=\$206!
+I2CM_SEL1=\$20C!
+I2CM_Vec=\$FFE0!
+MSDA=\$04! P1.2
+MSCL=\$08! P1.3
+M_BUS=\$0C!
+
+I2CS_IN=\$200!
+I2CS_OUT=\$202!
+I2CS_DIR=\$204!
+I2CS_REN=\$206!
+I2CS_SEL1=\$20C!
+I2CS_Vec=\$FFE0!
+SSDA=\$40! P1.2
+SSCL=\$80! P1.3
+S_BUS=\$C0!
+
--- /dev/null
+-1 SAVE_SYSRSTIV ! COLD
+\ download to unlock JTAG and BSL, for example
--- /dev/null
+! -*- coding: utf-8 -*-
+! MSP_EXP430FR4133.pat
+!
+! Fast Forth For Texas Instrument MSP_EXP430FR4133
+!
+! Copyright (C) <2016> <J.M. THOORENS>
+!
+! This program is free software: you can redistribute it and/or modify
+! it under the terms of the GNU General Public License as published by
+! the Free Software Foundation, either version 3 of the License, or
+! (at your option) any later version.
+!
+! This program is distributed in the hope that it will be useful,
+! but WITHOUT ANY WARRANTY; without even the implied warranty of
+! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+! GNU General Public License for more details.
+!
+! You should have received a copy of the GNU General Public License
+! along with this program. If not, see <http://www.gnu.org/licenses/>.
+!
+!
+!
+! ======================================================================
+! MSP430FR4133 Config
+! ======================================================================
+
+@define{@read{/config/gema/MSP430FR4133.pat}}
+@define{@read{/config/gema/MSP430FR2x4x_FastForth.pat}}
+@define{@read{/config/gema/FastForthREGtoTI.pat}}
+@define{@read{/config/gema/RemoveComments.pat}}
+
+! ======================================================================
+! MSP_EXP430FR4133 board
+! ======================================================================
+!
+! J101 eZ-FET <-> target
+! -----------------------
+! P1 <-> P2 - NC
+! P3 <-> P4 - TEST - TEST
+! P5 <-> P6 - RST - RST
+! P7 <-> P8 - TX1 - P1.0 UCA0 TXD ---> RX UARTtoUSB module
+! P9 <->P10 - RX1 - P1.1 UCA0 RXD <--- TX UARTtoUSB module
+! P11<->P12 - CTS - P2.4
+! P13<->P14 - RTS - P2.3
+! P15<->P16 - VCC - 3V3
+! P17<->P18 - 5V
+! P19<->P20 - GND - VSS
+!
+! Launchpad Header Left J1
+! ------------------------
+! P1 - 3V3
+! P2 - P8.1 ACLK/A9
+! P3 - P1.1 UCA0 RXD
+! P4 - P1.0 UCA0 TXD
+! P5 - P2.7
+! P6 - P8.0 SMCLK/A8
+! P7 - P5.1 UCB0 CLK
+! P8 - P2.5
+! P9 - P8.2 TA1CLK
+! P10- P8.3 TA1.2
+!
+! Launchpad Header Right J2
+! -------------------------
+! P1 - GND
+! P2 - P1.7 TA0.1/TDO/A7
+! P3 - P1.6 TA0.2/TDI/TCLK/A6
+! P4 - P5.0 UCB0STE
+! P5 - RST
+! P6 - P5.2 UCB0SIMO/UCB0SDA
+! P7 - P5.3 UCB0SOMI/UCB0SCL
+! P8 - P1.3 UCA0STE/A3
+! P9 - P1.4 MCLK/TCK/A4
+! P10- P1.5 TA0CLK/TMS/A5
+!
+! switch-keys:
+! S1 - P1.2
+! S2 - P2.6
+! S3 - RST
+!
+! LEDS:
+! LED1 - P1.0/TXD
+! LED2 - P4.0
+!
+! XTAL LF 32768 Hz
+! Y4 - P4.1 XIN
+! Y4 - P4.2 XOUT
+!
+! LCD
+! L0 - P7.0
+! L1 - P7.1
+! L2 - P7.2
+! L3 - P7.3
+! L4 - P7.4
+! L5 - P7.5
+! L6 - P7.6
+! L7 - P7.7
+! L8 - P3.0
+! L9 - P3.1
+! L10 - P3.2
+! L11 - P3.3
+! L12 - P3.4
+! L13 - P3.5
+! L14 - P3.6
+! L15 - P3.7
+! L16 - P6.0
+! L17 - P6.1
+! L18 - P6.2
+! L19 - P6.3
+! L20 - P6.4
+! L21 - P6.5
+! L22 - P6.6
+! L23 - P6.7
+! L24 - P2.0
+! L25 - P2.1
+! L26 - P2.2
+! L36 - P5.4
+! L37 - P5.5
+! L38 - P5.6
+! L39 - P5.7
+!
+!
+!
+!
+!
+!
+! ===================================================================================
+! in case of 3.3V powered by UARTtoUSB bridge, open J13 straps {RST,TST,V+,5V} BEFORE
+! then wire VCC and GND of bridge onto J13 connector
+! ===================================================================================
+!
+! ---------------------------------------------------
+! MSP - MSP-EXP430FR4133 LAUNCHPAD <--> OUTPUT WORLD
+! ---------------------------------------------------
+!
+! +-4k7-< DeepRST <-- GND
+! |
+! P1.0 - UCA0 TXD J101.8 --+-> RX UARTtoUSB bridge
+! P1.1 - UCA0 RXD J101.10 <---- TX UARTtoUSB bridge
+! P2.3 - RTS J101.14 ----> CTS UARTtoUSB bridge (if TERMINALCTSRTS option)
+! VCC - J101.16 <---- VCC (optional supply from UARTtoUSB bridge - WARNING ! 3.3V !)
+! GND - J101.20 <---> GND (optional supply from UARTtoUSB bridge)
+!
+! P1.0 - STRAP JP1 MUST BE REMOVED (LED red)
+! =========================
+!
+! P4.0 - LED green
+!
+! P1.2 - Switch SW1 <--- LCD contrast + (finger :-)
+! P2.6 - Switch SW2 <--- LCD contrast - (finger ;-)
+!
+!
+! GND - J2.1 <-------+---0V0----------> 1 LCD_Vss
+! VCC - J1.1 >------ | --3V6-----+----> 2 LCD_Vdd
+! | |
+! ___ 470n ---
+! ^ ---
+! / \ 1n4148 |
+! --- |
+! 100n | 2k2 |
+! P1.6 - TA0.2 J2.18 >---||--+--^/\/\/v--+----> 3 LCD_Vo (=0V6 without modulation)
+! P1.3 - J2.13 -------------------------> 4 LCD_RS
+! P1.4 - J2.12 -------------------------> 5 LCD_R/W
+! P1.5 - J2.11 -------------------------> 6 LCD_EN
+! P5.0 - J2.17 <------------------------> 11 LCD_DB4
+! P5.1 - J1.7 <------------------------> 12 LCD_DB5
+! P5.2 - J2.15 <------------------------> 13 LCD_DB5
+! P5.3 - J2.14 <------------------------> 14 LCD_DB7
+!
+!
+! P1.7 - J2.19 <---- OUT IR_Receiver (1 TSOP32236)
+!
+! P4.1 - LFXIN 32768Hz quartz
+! P4.2 - LFXOUT 32768Hz quartz
+!
+! VCC - J1.1 ----> VCC SD_CardAdapter
+! GND - J2.1 <---> GND SD_CardAdapter
+! P5.1 - UCB0 CLK J1.7 ----> CLK SD_CardAdapter (SCK)
+! P8.1 - J1.2 ----> CS SD_CardAdapter (Card Select)
+! P5.2 - UCB0 TXD/SIMO J2.15 ----> SDI SD_CardAdapter (MOSI)
+! P5.3 - UCB0 RXD/SOMI J2.14 <---- SDO SD_CardAdapter (MISO)
+! P8.0 - J1.6 <---- CD SD_CardAdapter (Card Detect)
+!
+!
+!
+! P8.2 - Soft I2C_Master J1.9 ----> SDA software I2C Master
+! P8.3 - Soft I2C_Master J1.10 <---> SCL software I2C Master
+
+
+! ============================================
+! FORTH I/O :
+! ============================================
+TERM_TX=1! ; P1.0 = TX
+TERM_RX=2! ; P1.1 = RX
+TERM_TXRX=3!
+
+TERM_REN=\$206!
+TERM_SEL=\$20C!
+TERM_IE=\$21A!
+TERM_IFG=\$21C!
+Deep_RST=1! ; = TX pin
+Deep_RST_IN=\$200! ; TERMINAL TX pin as FORTH Deep_RST
+
+RTS=8! ; P2.3
+CTS=\$10! ; P2.4
+HANDSHAKIN=\$201!
+HANDSHAKOUT=\$203!
+
+
+SD_CS=2! ; P8.1 as SD_CS
+SD_CD=1! ; P8.0 as SD_CD
+SD_CDIN=\$261!
+SD_CSOUT=\$263!
+SD_CSDIR=\$265!
+
+SD_SEL1=\$24C! ; to configure UCB0
+SD_REN=\$246! ; to configure pullup resistors
+SD_BUS=\$0E! ; pins P5.1 as UCB0CLK, P5.2 as UCB0SIMO & P5.3 as UCB0SOMI
+
+
+! ============================================
+! APPLICATION I/O :
+! ============================================
+!LEDs
+!----
+invert LED numbers because LED1=TXD !
+LED2_OUT=\$202!
+LED2=\$01! P1.0 red LED
+LED1_OUT=\$223!
+LED1=\$01! P4.0 green LED
+
+!switches
+!--------
+SW1_IN=\$200!
+SW1=\$04! P1.2 SW1
+SW2_IN=\$201!
+SW2=\$40! P2.6 SW2
+
+!LCD Vo driver
+!-------------
+LCDVo_DIR=\$204! P1.6 = LCDVo
+LCDVo_SEL=\$20A! SEL0
+LCDVo=\$40!
+! FR4133 hasn't TB0: let TA0 addresses for TA0.2=LCDVo on P1.6
+TB0CTL=\$300!
+TB0CCTL2=\$306!
+TB0CCR0=\$312!
+TB0CCR2=\$316!
+TB0EX0=\$320!
+
+!LCD command bus
+!---------------
+LCD_CMD_IN=\$200!
+LCD_CMD_OUT=\$202!
+LCD_CMD_DIR=\$204!
+LCD_CMD_REN=\$206!
+LCD_RS=\$08! P1.3 LCD_RS
+LCD_RW=\$10! P1.4 LCD_RW
+LCD_EN=\$20! P1.5 LCD_EN
+LCD_CMD=\$38!
+
+!LCD data bus
+!------------
+LCD_DB_IN=\$240!
+LCD_DB_OUT=\$242!
+LCD_DB_DIR=\$244!
+LCD_DB_REN=\$246!
+LCD_DB=\$0F! P5.0-3 LCD_DATA_BUS
+
+!IR_RC5 input
+!------------
+IR_IN=\$200!
+IR_OUT=\$202!
+IR_DIR=\$204!
+IR_REN=\$206!
+IR_IES=\$218!
+IR_IE=\$21A!
+IR_IFG=\$21C!
+IR_Vec=\$FFE6! P1 int
+RC5=\$80! P1.7 IR_RC5
+! replace TA0 addrs by TA1 addrs because TA0 used for LCDVo
+TA0CTL=\$340!
+TA0CCTL2=\$346!
+TA0R=\$350!
+TA0CCR0=\$352!
+TA0CCR2=\$356!
+TA0EX0=\$360!
+
+
+I2CSM_IN=\$261!
+I2CSM_OUT=\$263!
+I2CSM_DIR=\$265!
+I2CSM_REN=\$267!
+SMSDA=\$04! P8.2 SDA software MASTER
+SMSCL=\$08! P8.3 SCL software MASTER
+SM_BUS=\$0C!
+
+I2CSMM_IN=\$261!
+I2CSMM_OUT=\$263!
+I2CSMM_DIR=\$265!
+I2CSMM_REN=\$267!
+SMMSDA=\$04! P8.2 SDA software MULTI_MASTER
+SMMSCL=\$08! P8.3 SCL software MULTI_MASTER
+SMM_BUS=\$0C!
+
+I2CMM_IN=\$240!
+I2CMM_OUT=\$242!
+I2CMM_DIR=\$244!
+I2CMM_REN=\$246!
+I2CMM_SEL=\$24A! SEL0
+I2CMM_Vec=\$FFEA!
+MMSDA=\$04! P5.2 SDA hadware MULTI_MASTER
+MMSCL=\$08! P5.3 SCL hadware MULTI_MASTER
+MM_BUS=\$0C!
+
+I2CM_IN=\$240!
+I2CM_OUT=\$242!
+I2CM_DIR=\$244!
+I2CM_REN=\$246!
+I2CM_SEL=\$24A! SEL0
+I2CM_Vec=\$FFEA!
+MSDA=\$04! P5.2 SDA hadware MASTER
+MSCL=\$08! P5.3 SCL hadware MASTER
+M_BUS=\$0C!
+
+I2CS_IN=\$240!
+I2CS_OUT=\$242!
+I2CS_DIR=\$244!
+I2CS_REN=\$246!
+I2CS_SEL=\$24A! SEL0
+I2CS_Vec=\$FFEA!
+SSDA=\$04! P5.2 SDA hadware SLAVE
+SSCL=\$08! P5.3 SCL hadware SLAVE
+S_BUS=\$0C!
+
--- /dev/null
+! -*- coding: utf-8 -*-
+! MSP_EXP430FR5739.pat
+!
+! Fast Forth For Texas Instrument MSP_EXP430FR5739
+!
+! Copyright (C) <2016> <J.M. THOORENS>
+!
+! This program is free software: you can redistribute it and/or modify
+! it under the terms of the GNU General Public License as published by
+! the Free Software Foundation, either version 3 of the License, or
+! (at your option) any later version.
+!
+! This program is distributed in the hope that it will be useful,
+! but WITHOUT ANY WARRANTY; without even the implied warranty of
+! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+! GNU General Public License for more details.
+!
+! You should have received a copy of the GNU General Public License
+! along with this program. If not, see <http://www.gnu.org/licenses/>.
+!
+!
+!
+! ======================================================================
+! MSP430FR5739 Config
+! ======================================================================
+
+@define{@read{/config/gema/MSP430FR5739.pat}}
+@define{@read{/config/gema/MSP430FR57xx_FastForth.pat}}
+@define{@read{/config/gema/FastForthREGtoTI.pat}}
+@define{@read{/config/gema/RemoveComments.pat}}
+
+! ======================================================================
+! MSP_EXP430FR5739 board
+! ======================================================================
+
+! blue LEDs (Px.y ---> resistor ---> LED ---> GND)
+! PJ.0 - LED1
+! PJ.1 - LED2
+! PJ.2 - LED3
+! PJ.3 - LED4
+! P3.4 - LED5
+! P3.5 - LED6
+! P3.6 - LED7
+! P3.7 - LED8
+!
+! I/O pins on SV1:
+! P1.0 - SV1.1
+! P1.1 - SV1.2
+! P1.2 - SV1.3
+! P3.0 - SV1.4
+! P3.1 - SV1.5
+! P3.2 - SV1.6
+! P3.3 - SV1.7
+! P1.3 - SV1.8
+! P1.4 - SV1.9
+! P1.5 - SV1.10
+! P4.0 - SV1.11
+! GND - SV1.12
+!
+! I/O pins on SV2:
+! P1.7 - SV2.1
+! P1.6 - SV2.2
+! P3.7 - SV2.3
+! P3.6 - SV2.4
+! P3.5 - SV2.5
+! P3.4 - SV2.6
+! P2.2 - SV2.7
+! P2.1 - SV2.8
+! P2.6 - SV2.9
+! P2.5 - SV2.10
+! P2.0 - SV2.11
+! VCC - SV2.12
+!
+! I/O pins on RF:
+! GND - RF.1
+! VCC - RF.2
+! P2.0 - RF.3
+! P1.0 - RF.4
+! P2.6 - RF.5
+! P1.1 - RF.6
+! P2.5 - RF.7
+! P1.2 - RF.8
+! P2.7 - RF.9
+! P2.3 - RF.10
+! P4.0 - RF.11
+! GND - RF.12
+! P4.1 - RF.13
+! P2.4 - RF.14
+! P1.7 - RF.15
+! P2.2 - RF.16
+! P1.3 - RF.17
+! P1.6 - RF.18
+!
+! Accelerometer:
+! P2.7 - VS
+! P3.0 - XOUT
+! P3.1 - YOUT
+! P3.2 - ZOUT
+!
+! LDR and NTC:
+! P2.7 - VS
+! P3.3 - LDR
+! P1.4 - NTC
+!
+! RST - reset
+!
+! ======================================================================
+! MSP-EXP430FR5739 LAUNCHPAD <--> OUTPUT WORLD
+! ======================================================================
+!
+! P4.0 - Switch S1 <--- LCD contrast + (finger :-)
+! P4.1 - Switch S2 <--- LCD contrast - (finger :-)
+!
+! GND <-------+---0V0----------> 1 LCD_Vss
+! VCC >------ | --3V6-----+----> 2 LCD_Vdd
+! | |
+! |___ 470n ---
+! ^ | ---
+! / \ BAT54 |
+! --- |
+! 100n | 2k2 |
+! P1.5 - UCB0 CLK TB0.2 SV1.10 >---||--+--^/\/\/v--+----> 3 LCD_Vo (=0V6 without modulation)
+! P3.4 - SV2.6 -------------------------> 4 LCD_RS
+! P3.5 - SV2.5 -------------------------> 5 LCD_R/W
+! P3.6 - SV2.4 -------------------------> 6 LCD_EN
+! P1.0 - SV1.1 <------------------------> 11 LCD_DB4
+! P1.1 - SV1.2 <------------------------> 12 LCD_DB5
+! P1.2 - SV1.3 <------------------------> 13 LCD_DB5
+! P1.3 - SV1.8 <------------------------> 14 LCD_DB7
+!
+! PJ.4 - LFXI 32768Hz quartz
+! PJ.5 - LFXO 32768Hz quartz
+! PJ.6 - HFXI
+! PJ.7 - HFXO
+! +--4k7-< DeepRST <-- GND
+! |
+! P2.0 - UCA0 TXD SV2.11 --+-> RX UARTtoUSB bridge
+! P2.1 - UCA0 RXD SV2.8 <---- TX UARTtoUSB bridge
+! VCC - <---- VCC (optional supply from UARTtoUSB bridge - WARNING ! 3.3V !)
+! GND - <---> GND (optional supply from UARTtoUSB bridge)
+!
+! VCC - RF.2
+! VSS - RF.1
+! P2.2 - RF.16 <---- CD SD_CardAdapter (Card Detect)
+! P2.3 - RF.10 ----> CS SD_CardAdapter (Card Select)
+! P2.4 - UCA1 CLK RF.14 ----> CLK SD_CardAdapter (SCK)
+! P2.5 - UCA1 TXD/SIMO RF.7 ----> SDI SD_CardAdapter (MOSI)
+! P2.6 - UCA1 RXD/SOMI RF.5 <---- SDO SD_CardAdapter (MISO)
+!
+! P2.7 - RF.9 <---- OUT IR_Receiver (1 TSOP32236)
+!
+! P1.7 - UCB0 SCL/SOMI SV2.1 <---> SCL I2C MASTER/SLAVE
+! P1.6 - UCB0 SDA/SIMO SV2.2 <---> SDA I2C MASTER/SLAVE
+
+! ============================================
+! FORTH I/O :
+! ============================================
+TERM_TX=1! ; P2.0 = TX
+TERM_RX=2! ; P2.1 = RX
+TERM_TXRX=3!
+
+TERM_REN=\$207!
+TERM_SEL=\$20D!
+TERM_IE=\$21B!
+TERM_IFG=\$21D!
+Deep_RST=1! ; = TX pin
+Deep_RST_IN=\$201! ; TERMINAL TX pin as FORTH Deep_RST
+
+RTS=4!
+CTS=8!
+HANDSHAKIN=\$201!
+HANDSHAKOUT=\$203!
+
+SD_CD=4! ; P2.2 as SD_CD
+SD_CS=8! ; P2.3 as SD_CS
+SD_CDIN=\$201!
+SD_CSOUT=\$203!
+SD_CSDIR=\$205!
+
+SD_SEL1=\$20D! ; to configure UCB0
+SD_REN=\$207! ; to configure pullup resistors
+SD_BUS=\$70! ; pins P2.4 as UCB0CLK, P2.5 as UCB0SIMO & P2.6 as UCB0SOMI
+
+
+! ============================================
+! APPLICATION I/O :
+! ============================================
+LED1_OUT=\$322!
+LED1=\$01! PJ.0
+
+LED2_OUT=\$322!
+LED2=\$02! PJ.1
+
+SW1_IN=\$221!
+SW1=\$01! P4.0
+
+SW2_IN=\$221!
+SW2=\$02! P4.1
+
+LCDVo_DIR=\$204!
+LCDVo_SEL=\$20A! SEL0
+LCDVo=\$20! P1.5
+
+LCD_CMD_IN=\$220!
+LCD_CMD_OUT=\$222!
+LCD_CMD_DIR=\$224!
+LCD_CMD_REN=\$226!
+LCD_RS=\$10! P3.4
+LCD_RW=\$20! P3.5
+LCD_EN=\$40! P3.6
+LCD_CMD=\$70!
+
+LCD_DB_IN=\$200!
+LCD_DB_OUT=\$202!
+LCD_DB_DIR=\$204!
+LCD_DB_REN=\$206!
+LCD_DB=\$0F! P1.0-3
+
+
+IR_IN=\$201!
+IR_OUT=\$203!
+IR_DIR=\$205!
+IR_REN=\$207!
+IR_IES=\$219!
+IR_IE=\$21B!
+IR_IFG=\$21D!
+RC5_=RC5_!
+RC5=\$40! P2.6
+IR_Vec=\$FFD8! P2 int
+
+I2CSM_IN=\$200!
+I2CSM_OUT=\$202!
+I2CSM_DIR=\$204!
+I2CSM_REN=\$206!
+SMSDA=\$40! P1.6
+SMSCL=\$80! P1.7
+SM_BUS=\$C0!
+
+I2CSMM_IN=\$200!
+I2CSMM_OUT=\$202!
+I2CSMM_DIR=\$204!
+I2CSMM_REN=\$206!
+SMMSDA=\$40! P1.6
+SMMSCL=\$80! P1.7
+SMM_BUS=\$C0!
+
+I2CMM_IN=\$200!
+I2CMM_OUT=\$202!
+I2CMM_DIR=\$204!
+I2CMM_REN=\$206!
+I2CMM_SEL=\$20C! SEL1
+I2CMM_Vec=\$FFEE!
+MMSDA=\$40! P1.6
+MMSCL=\$80! P1.7
+MM_BUS=\$C0!
+
+I2CM_IN=\$200!
+I2CM_OUT=\$202!
+I2CM_DIR=\$204!
+I2CM_REN=\$206!
+I2CM_SEL=\$20C!
+I2CM_Vec=\$FFEE!
+MSDA=\$40! P1.6
+MSCL=\$80! P1.7
+M_BUS=\$C0!
+
+I2CS_IN=\$200!
+I2CS_OUT=\$202!
+I2CS_DIR=\$204!
+I2CS_REN=\$206!
+I2CS_SEL=\$20C!
+I2CS_Vec=\$FFEE!
+SSDA=\$40! P1.6
+SSCL=\$80! P1.7
+S_BUS=\$C0!
+
--- /dev/null
+! -*- coding: utf-8 -*-
+! MSP_EXP430FR5969.pat
+!
+! Fast Forth For Texas Instrument MSP_EXP430FR5969
+!
+! Copyright (C) <2016> <J.M. THOORENS>
+!
+! This program is free software: you can redistribute it and/or modify
+! it under the terms of the GNU General Public License as published by
+! the Free Software Foundation, either version 3 of the License, or
+! (at your option) any later version.
+!
+! This program is distributed in the hope that it will be useful,
+! but WITHOUT ANY WARRANTY; without even the implied warranty of
+! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+! GNU General Public License for more details.
+!
+! You should have received a copy of the GNU General Public License
+! along with this program. If not, see <http://www.gnu.org/licenses/>.
+!
+!
+!
+! ======================================================================
+! MSP430FR5969 Config
+! ======================================================================
+
+@define{@read{/config/gema/MSP430FR5969.pat}}
+@define{@read{/config/gema/MSP430FR5x6x_FastForth.pat}}
+@define{@read{/config/gema/FastForthREGtoTI.pat}}
+@define{@read{/config/gema/RemoveComments.pat}}
+
+! ======================================================================
+! MSP_EXP430FR5969 board
+! ======================================================================
+
+! J3: JTAG
+! --------
+! P1 - TDO - PJ.0
+! P2 - V_debug
+! P3 - TDI - PJ.1
+! P4 - V_ext
+! P5 - TMS - PJ.2
+! P6 - NC
+! P7 - TCK - PJ.3
+! P8 - TEST - TEST
+! P9 - GND
+! P10- CTS - P4.0
+! P11- RST - RESET
+! P12- TX0 - P2.0
+! P13- RTS - P4.1
+! P14- RX0 - P2.1
+
+! Launchpad Header Left J4
+! ------------------------
+! P1 - VCC
+! P2 - P4.2
+! P3 - P2.6 UCA1 RX/SOMI
+! P4 - P2.5 UCA1 TX/SIMO
+! P5 - P4.3
+! P6 - P2.4 UCA1 CLK
+! P7 - P2.2 TB0.2 UCB0CLK
+! P8 - P3.4
+! P9 - P3.5
+! P10- P3.6
+
+! Launchpad Header Right J5
+! -------------------------
+! P11- P1.3
+! P12- P1.4
+! P13- P1.5
+! P14- P1.6 UCB0 SIMO/SDA
+! P15- P1.7 UCB0 SOMI/SCL
+! P16- RST
+! P17- NC
+! P18- P3.0
+! P19- P1.2
+! P20- GND
+
+! J13 eZ-FET <=> target
+! ---------------------------
+! P1 P2 NC NC
+! P3 <-> P4 TEST <-> TEST
+! P5 <-> P6 RST <-> RST
+! P7 P8 TX0 P2.0 (no strap)
+! P9 P10 RX0 P2.1 (no strap)
+! P11 P12 CTS P4.0 (no strap)
+! P13 P14 RTS P4.1 (no strap)
+! P15<->P16 V+ <-> VCC
+! P17 P18 5V (no strap)
+! P19---P20 GND-----VSS
+
+! J21 : external target
+! ---------------------
+! P1 - RX0 - P2.1
+! P2 - VCC
+! P3 - TEST - TEST
+! P4 - RST - RST
+! P5 - GND
+! P6 - TX0 - P2.0
+
+
+! -----------------------------------------------
+! MSP430FR5969 LAUNCHPAD <--> OUTPUT WORLD
+! -----------------------------------------------
+
+! J13 jumpers : device <-> eZ-FET
+! -------------------------------
+! P2 P1 NC NC
+! P4<->P3 TEST <-> TEST
+! P6<->P5 RST <-> RST
+! P8 P7 P2.0 TX0 (no jumper)
+! P10 P9 P2.1 RX0 (no jumper)
+! P12 P11 P4.0 CTS (no jumper)
+! P14 P13 P4.1 RTS (no jumper)
+! P16<->P15 VCC <-> V+
+! P18 P17 5V 5V (no jumper)
+! P20---P19 VSS-----GND
+
+! P4.6 - J6 - LED1 red
+! P1.0 - LED2 green
+!
+! P4.5 - Switch S1 <--- LCD contrast + (finger :-)
+! P1.1 - Switch S2 <--- LCD contrast - (finger ;-)
+!
+! GND - J1.2 <-------+---0V0----------> 1 LCD_Vss
+! VCC - J1.3 >------ | --3V6-----+----> 2 LCD_Vdd
+! | |
+! ___ 470n ---
+! ^ ---
+! / \ 1n4148 |
+! --- |
+! 100n | 2k2 |
+! P2.2 - UCB0 CLK TB0.2 J4.7 >---||--+--^/\/\/v--+----> 3 LCD_Vo (=0V6 without modulation)
+! P3.4 - J4.8 -------------------------> 4 LCD_RS
+! P3.5 - J4.9 -------------------------> 5 LCD_R/W
+! P3.6 - J4.10 -------------------------> 6 LCD_EN
+! PJ.0 - J3.1 <------------------------> 11 LCD_DB4
+! PJ.1 - J3.3 <------------------------> 12 LCD_DB5
+! PJ.2 - J3.5 <------------------------> 13 LCD_DB5
+! PJ.3 - J3.7 <------------------------> 14 LCD_DB7
+!
+! +--4k7-< DeepRST <-- GND
+! |
+! P2.0 - UCA0 TXD J13.8 <-+-> RX UARTtoUSB bridge
+! P2.1 - UCA0 RXD J13.10 <---- TX UARTtoUSB bridge
+! P4.1 - RTS J13.14 ----> CTS UARTtoUSB bridge (optional hardware control flow)
+! VCC - J13.16 <---- VCC (optional supply from UARTtoUSB bridge - WARNING ! 3.3V !)
+! GND - J13.20 <---> GND (optional supply from UARTtoUSB bridge)
+!
+! VCC - J11.1 ----> VCC SD_CardAdapter
+! GND - J12.3 <---> GND SD_CardAdapter
+! P2.4 - UCA1 CLK J4.6 ----> CLK SD_CardAdapter (SCK)
+! P4.3 - J4.5 ----> CS SD_CardAdapter (Card Select)
+! P2.5 - UCA1 TXD/SIMO J4.4 ----> SDI SD_CardAdapter (MOSI)
+! P2.6 - UCA1 RXD/SOMI J4.3 <---- SDO SD_CardAdapter (MISO)
+! P4.2 - J4.2 <---- CD SD_CardAdapter (Card Detect)
+!
+! P4.0 - J3.10 <---- OUT IR_Receiver (1 TSOP32236) ----┌───┐
+! VCC - J3.2 ----> VCC IR_Receiver (2 TSOP32236) ----│ ○ │
+! GND - J3.9 <---> GND IR_Receiver (3 TSOP32236) ----└───┘
+!
+! P1.2 - J5.19 <---> SDA I2C SOFTWARE MASTER
+! P1.3 - J5.11 <---> SCL I2C SOFTWARE MASTER
+! P1.4 - TB0.1 J5.12 <---> free
+! P1.5 - UCA0 CLK TB0.2 J5.13 <---> free
+! P1.7 - UCB0 SCL/SOMI J5.14 ----> SCL I2C MASTER/SLAVE
+! P1.6 - UCB0 SDA/SIMO J5.15 <---> SDA I2C MASTER/SLAVE
+! P3.0 - J5.7 <---- free
+!
+! PJ.4 - LFXI 32768Hz quartz
+! PJ.5 - LFXO 32768Hz quartz
+! PJ.6 - HFXI
+! PJ.7 - HFXO
+!
+! P2.3 - NC
+! P2.7 - NC
+! P3.1 - NC
+! P3.2 - NC
+! P3.3 - NC
+! P3.7 - NC
+! P4.4 - NC
+! P4.7 - NC
+
+! -------------+------+------+------+------++---+---+---+---+---------+
+! SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current | @ 8MHz
+! -------------+------+------+------+------++---+---+---+---+---------+
+! LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 160uA | default mode
+! LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | 115uA |
+! LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 0.9uA | 32768Hz XTAL is running
+! LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 0.6uA | 32768Hz XTAL is running
+! LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 0.5uA |
+! -------------+------+------+------+------++---+---+---+---+---------+
+
+! ============================================
+! FORTH I/O :
+! ============================================
+TERM_TX=1! ; P2.0 = TX
+TERM_RX=2! ; P2.1 = RX
+TERM_TXRX=3!
+
+TERM_REN=\$207!
+TERM_SEL=\$20D!
+TERM_IE=\$21B!
+TERM_IFG=\$21D!
+Deep_RST=1! ; = TX pin
+Deep_RST_IN=\$201! ; TERMINAL TX pin as FORTH Deep_RST
+
+RTS=2! ; P4.1
+CTS=1! ; P4.0
+HANDSHAKIN=\$221!
+HANDSHAKOUT=\$223!
+
+SD_CD=4! ; P4.2 as SD_CD
+SD_CS=8! ; P4.3 as SD_CS
+SD_CDIN=\$221!
+SD_CSOUT=\$223!
+SD_CSDIR=\$225!
+
+SD_SEL1=\$20D! ; to configure UCB0
+SD_REN=\$207! ; to configure pullup resistors
+SD_BUS=\$70! ; pins P2.4 as UCB0CLK, P2.5 as UCB0SIMO & P2.6 as UCB0SOMI
+
+
+! ============================================
+! APPLICATION I/O :
+! ============================================
+! init state : output low
+LED1_OUT=\$223
+LED1=\$40! P4.6
+
+! init state : output low
+LED2_OUT=\$202
+LED2=\$01! P1.0
+
+! init state : input with pullup resistor
+SW1_IN=\$221
+SW1=\$20! P4.5
+
+! init state : input with pullup resistor
+SW2_IN=\$200
+SW2=\$02! P1.1
+
+LCDVo_DIR=\$205! P2
+LCDVo_SEL=\$20B! SEL0
+LCDVo=\$04
+
+LCD_CMD_IN=\$220! P3
+LCD_CMD_OUT=\$222
+LCD_CMD_DIR=\$224
+LCD_CMD_REN=\$226
+LCD_RS=\$10
+LCD_RW=\$20
+LCD_EN=\$40
+LCD_CMD=\$70
+
+LCD_DB_IN=\$320! PJ
+LCD_DB_OUT=\$322
+LCD_DB_DIR=\$324
+LCD_DB_REN=\$326
+LCD_DB=\$0F
+
+
+IR_IN=\$221
+IR_OUT=\$223
+IR_DIR=\$225
+IR_REN=\$227
+IR_IES=\$239
+IR_IE=\$23B
+IR_IFG=\$23D
+IR_Vec=\$FFD0! P4 int
+RC5=\$01! P4.0
+
+I2CSM_IN=\$200
+I2CSM_OUT=\$202
+I2CSM_DIR=\$204
+I2CSM_REN=\$206
+SMSDA=\$04! P1.2
+SMSCL=\$08! P1.3
+SM_BUS=\$0C
+
+I2CSMM_IN=\$200
+I2CSMM_OUT=\$202
+I2CSMM_DIR=\$204
+I2CSMM_REN=\$206
+SMMSDA=\$04! P1.2
+SMMSCL=\$08! P1.3
+SMM_BUS=\$0C
+
+I2CMM_IN=\$200
+I2CMM_OUT=\$202
+I2CMM_DIR=\$204
+I2CMM_REN=\$206
+I2CMM_SEL=\$20C! SEL1
+I2CMM_Vec=\$FFEE! eUSCIB0_INT
+MMSDA=\$40! P1.6
+MMSCL=\$80! P1.7
+MM_BUS=\$C0
+
+I2CM_IN=\$200
+I2CM_OUT=\$202
+I2CM_DIR=\$204
+I2CM_REN=\$206
+I2CM_SEL=\$20C
+I2CM_Vec=\$FFEE! eUSCIB0_INT
+MSDA=\$40! P1.6
+MSCL=\$80! P1.7
+M_BUS=\$C0
+
+I2CS_IN=\$200
+I2CS_OUT=\$202
+I2CS_DIR=\$204
+I2CS_REN=\$206
+I2CS_SEL=\$20C
+I2CS_Vec=\$FFEE! eUSCIB0_INT
+SSDA=\$40! P1.6
+SSCL=\$80! P1.7
+S_BUS=\$C0
+
--- /dev/null
+! -*- coding: utf-8 -*-
+! MSP_EXP430FR5994.pat
+!
+! Fast Forth For Texas Instrument MSP_EXP430FR5994
+!
+! Copyright (C) <2016> <J.M. THOORENS>
+!
+! This program is free software: you can redistribute it and/or modify
+! it under the terms of the GNU General Public License as published by
+! the Free Software Foundation, either version 3 of the License, or
+! (at your option) any later version.
+!
+! This program is distributed in the hope that it will be useful,
+! but WITHOUT ANY WARRANTY; without even the implied warranty of
+! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+! GNU General Public License for more details.
+!
+! You should have received a copy of the GNU General Public License
+! along with this program. If not, see <http://www.gnu.org/licenses/>.
+!
+!
+!
+! ======================================================================
+! MSP430FR5994 Config
+! ======================================================================
+
+@define{@read{/config/gema/MSP430FR5994.pat}}
+@define{@read{/config/gema/MSP430FR5x6x_FastForth.pat}}
+@define{@read{/config/gema/FastForthREGtoTI.pat}}
+@define{@read{/config/gema/RemoveComments.pat}}
+
+! ======================================================================
+! MSP_EXP430FR5994 board
+! ======================================================================
+
+! J101 Target <---> eZ-FET
+! GND 14-13 GND
+! +5V 12-11
+! 3V3 10-9
+! P2.1 UCA0_RX 8-7 <---- TX UARTtoUSB bridge
+! +--4k7-< DeepRST <-- GND
+! |
+! P2.0 UCA0_TX 6-5 <-+-> RX UARTtoUSB bridge
+! /RST 4-3
+! TEST 2-1
+
+
+! P5.6 - sw1 <--- LCD contrast + (finger :-)
+! P5.5 - sw2 <--- LCD contrast - (finger ;-)
+! RST - sw3
+
+! P1.0 - led1 red
+! P1.1 - led2 green
+
+! J1 - left ext.
+! 3v3
+! P1.2/TA1.1/TA0CLK/COUT/A2/C2 <--- OUT IR_Receiver (1 TSOP32236)
+! P6.1/UCA3RXD/UCA3SOMI -------------------------> 4 LCD_RS
+! P6.0/UCA3TXD/UCA3SIMO -------------------------> 5 LCD_R/W
+! P6.2/UCA3CLK -------------------------> 6 LCD_EN0
+! P1.3/TA1.2/UCB0STE/A3/C3
+! P5.2/UCB1CLK/TA4CLK
+! P6.3/UCA3STE
+! P7.1/UCB2SOMI/UCB2SCL ---> SCL I2C MASTER/SLAVE
+! P7.0/UCB2SIMO/UCB2SDA <--> SDA I2C MASTER/SLAVE
+
+! J3 - left int.
+! 5V
+! GND
+! P3.0/A12/C12 <------------------------> 11 LCD_DB4
+! P3.1/A13/C13 <------------------------> 12 LCD_DB5
+! P3.2/A14/C14 <------------------------> 13 LCD_DB5
+! P3.3/A15/C15 <------------------------> 14 LCD_DB7
+! P1.4/TB0.1/UCA0STE/A4/C4
+! P1.5/TB0.2/UCA0CLK/A5/C5 >---||--+--^/\/\/v--+----> 3 LCD_Vo (=0V6 without modulation)
+! P4.7
+! P8.0
+
+! J4 - right int.
+! P3.7/TB0.6
+! P3.6/TB0.5
+! P3.5/TB0.4/COUT
+! P3.4/TB0.3/SMCLK
+! P7.3/UCB2STE/TA4.1 RTS ----> CTS UARTtoUSB bridge (optional hardware control flow)
+! P2.6/TB0.1/UCA1RXD/UCA1SOMI
+! P2.5/TB0.0/UCA1TXD/UCA1SIMO
+! P4.3/A11
+! P4.2/A10
+! P4.1/A9
+
+! J2 - right ext.
+! GND
+! P5.7/UCA2STE/TA4.1/MCLK
+! P4.4/TB0.5
+! P5.3/UCB1STE
+! /RST
+! P5.0/UCB1SIMO/UCB1SDA
+! P5.1/UCB1SOMI/UCB1SCL
+! P8.3
+! P8.2 <--> SDA I2C SOFTWARE MASTER
+! P8.1 <--> SCL I2C SOFTWARE MASTER
+
+
+! SD_CARD
+! P7.2/UCB2CLK <--- SD_CD
+! P1.6/TB0.3/UCB0SIMO/UCB0SDA/TA0.0 ---> SD_MOSI
+! P1.7/TB0.4/UCB0SOMI/UCB0SCL/TA1.0 <--- SD_MISO
+! P4.0/A8 ---> SD_CS
+! P2.2/TB0.2/UCB0CLK ---> SD_CLK
+
+
+
+! XTAL LF 32768 Hz
+! PJ.4/LFXIN
+! PJ.5/LFXOUT
+
+! XTAL HF
+! PJ.6/HFXIN
+! PJ.7/HFXOUT
+
+! -----------------------------------------------
+! LCD config
+! -----------------------------------------------
+
+! <-------+---0V0----------> 1 LCD_Vss
+! >------ | --3V6-----+----> 2 LCD_Vdd
+! | |
+! |___ 470n ---
+! ^ | ---
+! / \ BAT54 |
+! --- |
+! 100n | 2k2 |
+! TB0.2 >---||--+--^/\/\/v--+----> 3 LCD_Vo (=0V6 without modulation)
+! -------------------------> 4 LCD_RS
+! -------------------------> 5 LCD_R/W
+! -------------------------> 6 LCD_EN0
+! <------------------------> 11 LCD_DB4
+! <------------------------> 12 LCD_DB5
+! <------------------------> 13 LCD_DB5
+! <------------------------> 14 LCD_DB7
+
+
+
+
+! ============================================
+! FORTH I/O :
+! ============================================
+TERM_TX=1! ; P2.0 = TX
+TERM_RX=2! ; P2.1 = RX
+TERM_TXRX=3!
+
+TERM_REN=\$207!
+TERM_SEL=\$20D!
+TERM_IE=\$21B!
+TERM_IFG=\$21D!
+Deep_RST=1! ; = TX pin
+Deep_RST_IN=\$201! ; TERMINAL TX pin as FORTH Deep_RST
+
+RTS=4! ; P4.2
+CTS=2! ; P4.1
+HANDSHAKIN=\$221!
+HANDSHAKOUT=\$223!
+
+SD_CD=4! ; P7.2 as SD_CD
+SD_CDIN=\$260!
+
+SD_CS=1! ; P4.0 as SD_CS
+SD_CSOUT=\$223!
+SD_CSDIR=\$225!
+
+SD_SEL1=\$20C! ; word access, to configure UCB0
+SD_REN=\$206! ; word access, to configure pullup resistors
+SD_BUS=\$04C0! ; pins P2.2 as UCB0CLK, P1.6 as UCB0SIMO & P1.7 as UCB0SOMI
+
+
+! ============================================
+! APPLICATION I/O :
+! ============================================
+LED1_OUT=\$202!
+led1=1! P1.0
+
+LED2_OUT=\$202!
+led2=2! P1.1
+
+SW1_IN=\$240!
+SW1=\$40! P5.6
+
+SW2_IN=\$240!
+SW2=\$20! P5.5
+
+LCDVo_DIR=\$204!
+LCDVo_SEL=\$20A! SEL0
+LCDVo=\$20! P1.5
+
+LCD_CMD_IN=\$241!
+LCD_CMD_OUT=\$243!
+LCD_CMD_DIR=\$245!
+LCD_CMD_REN=\$247!
+LCD_RS=2! P6.1
+LCD_RW=1! P6.0
+LCD_EN=4! P6.2
+LCD_CMD=7!
+
+LCD_DB_IN=\$220!
+LCD_DB_OUT=\$222!
+LCD_DB_DIR=\$224!
+LCD_DB_REN=\$226!
+LCD_DB=\$0F! P3.3210
+
+
+IR_IN=\$200!
+IR_OUT=\$202!
+IR_DIR=\$204!
+IR_REN=\$206!
+IR_IES=\$208!
+IR_IE=\$20A!
+IR_IFG=\$20C!
+IR_Vec=\$FFDE! P1 int
+RC5_=RC5_!
+RC5=4! P1.2
+
+
+I2CSM_IN=\$261!
+I2CSM_OUT=\$263!
+I2CSM_DIR=\$265!
+I2CSM_REN=\$267!
+SMSDA=4! P8.2
+SMSCL=2! P8.1
+SM_BUS=6!
+
+I2CSMM_IN=\$261!
+I2CSMM_OUT=\$263!
+I2CSMM_DIR=\$265!
+I2CSMM_REN=\$267!
+SMMSDA=4! P8.2
+SMMSCL=2! P8.1
+SMM_BUS=6!
+
+I2CMM_IN=\$260!
+I2CMM_OUT=\$262!
+I2CMM_DIR=\$264!
+I2CMM_REN=\$266!
+I2CMM_SEL1=\$26C!
+I2CMM_Vec=\$FFBC! UCB2_Vec
+MMSDA=1! P7.0
+MMSCL=2! P7.1
+MM_BUS=3!
+
+I2CM_IN=\$260!
+I2CM_OUT=\$262!
+I2CM_DIR=\$264!
+I2CM_REN=\$266!
+I2CM_SEL1=\$26C!
+I2CM_Vec=\$FFBC!
+MSDA=1! P7.0
+MSCL=2! P7.1
+M_BUS=3!
+
+I2CS_IN=\$260!
+I2CS_OUT=\$262!
+I2CS_DIR=\$264!
+I2CS_REN=\$266!
+I2CS_SEL1=\$26C!
+I2CS_Vec=\$FFBC!
+SSDA=1! P7.0
+SSCL=2! P7.1
+S_BUS=3!
+
--- /dev/null
+! -*- coding: utf-8 -*-
+! MSP_EXP430FR6989.pat
+!
+! Fast Forth For Texas Instrument MSP_EXP430FR6989
+!
+! Copyright (C) <2016> <J.M. THOORENS>
+!
+! This program is free software: you can redistribute it and/or modify
+! it under the terms of the GNU General Public License as published by
+! the Free Software Foundation, either version 3 of the License, or
+! (at your option) any later version.
+!
+! This program is distributed in the hope that it will be useful,
+! but WITHOUT ANY WARRANTY; without even the implied warranty of
+! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+! GNU General Public License for more details.
+!
+! You should have received a copy of the GNU General Public License
+! along with this program. If not, see <http://www.gnu.org/licenses/>.
+!
+!
+!
+! ======================================================================
+! MSP430FR6989 Config
+! ======================================================================
+
+@define{@read{/config/gema/MSP430FR6989.pat}}
+@define{@read{/config/gema/MSP430FR5x6x_FastForth.pat}}
+@define{@read{/config/gema/FastForthREGtoTI.pat}}
+@define{@read{/config/gema/RemoveComments.pat}}
+
+! ======================================================================
+! MSP_EXP430FR6989 board
+! ======================================================================
+
+! ---------------------------------------------------
+! MSP - MSP-EXP430FR6989 LAUNCHPAD <--> OUTPUT WORLD
+! ---------------------------------------------------
+! P1.0 - LED1 red
+! P9.7 - LED2 green
+!
+! P1.1 - Switch S1 <--- LCD contrast + (finger :-)
+! P1.2 - Switch S2 <--- LCD contrast - (finger ;-)
+!
+! note : ESI1.1 = lowest left pin
+! note : ESI1.2 is not connected to 3.3V
+! GND J6.2 <-------+---0V0----------> 1 LCD_Vss
+! VCC J6.1 >------ | --3V3-----+----> 2 LCD_Vdd
+! | |
+! |___ 470n ---
+! ^ | ---
+! / \ BAT54 |
+! --- |
+! 100n | 2k2 |
+! P3.6 - UCA1 CLK TB0.2 J4.37 >---||--+--^/\/\/v--+----> 3 LCD_Vo (=0V6 without modulation)
+! P9.0/ESICH0 - ESI1.14 <------------------------> 11 LCD_DB4 brown
+! P9.1/ESICH1 - ESI1.13 <------------------------> 12 LCD_DB5 red
+! P9.2/ESICH2 - ESI1.12 <------------------------> 13 LCD_DB5 orange
+! P9.3/ESICH3 - ESI1.11 <------------------------> 14 LCD_DB7 yellow
+! P4.1 -------------------------> 4 LCD_RS yellow
+! P4.2 -------------------------> 5 LCD_R/W green
+! P4.3 -------------------------> 6 LCD_EN blue
+!
+! +--4k7-< DeepRST <-- GND
+! |
+! P3.4 - UCA1 TXD J101.8 <-+-> RX UARTtoUSB bridge
+! P3.5 - UCA1 RXD J101.10 <---- TX UARTtoUSB bridge
+! P3.0 - RTS J101.14 ----> CTS UARTtoUSB bridge (optional hardware control flow)
+! VCC - J101.16 <---- VCC (optional supply from UARTtoUSB bridge - WARNING ! 3.3V !)
+! GND - J101.20 <---> GND (optional supply from UARTtoUSB bridge)
+!
+! VCC - J1.1 ----> VCC SD_CardAdapter
+! GND - J2.20 <---> GND SD_CardAdapter
+! P2.2 - UCA0 CLK J4.35 ----> CLK SD_CardAdapter (SCK)
+! P2.6 - J4.39 ----> CS SD_CardAdapter (Card Select)
+! P2.0 - UCA0 TXD/SIMO J1.8 ----> SDI SD_CardAdapter (MOSI)
+! P2.1 - UCA0 RXD/SOMI J2.19 <---- SDO SD_CardAdapter (MISO)
+! P2.7 - J4.40 <---- CD SD_CardAdapter (Card Detect)
+!
+! P4.0 - J1.10 <---- OUT IR_Receiver (1 TSOP32236)
+! VCC - J1.1 ----> VCC IR_Receiver (2 TSOP32236)
+! GND - J2.20 <---> GND IR_Receiver (3 TSOP32236)
+!
+! P1.3 - J4.34 <---> SDA software I2C Master
+! P1.5 - J2.18 ----> SCL software I2C Master
+!
+! P1.4 -UCB0 CLK TA1.0 J1.7 <---> free
+!
+! P1.6 -UCB0 SDA/SIMO J2.15 <---> SDA hardware I2C Master or Slave
+! P1.7 -UCB0 SCL/SOMI J2.14 ----> SCL hardware I2C Master or Slave
+!
+! P3.0 -UCB1 CLK J4.33 ----> free (if UARTtoUSB with software control flow)
+! P3.1 -UCB1 SDA/SIMO J4.32 <---> free (if UARTtoUSB with software control flow)
+! P3.2 -UCB1 SCL/SOMI J1.5 ----> free
+! P3.3 - TA1.1 J1.5 <---> free
+!
+! PJ.4 - LFXI 32768Hz quartz
+! PJ.5 - LFXO 32768Hz quartz
+! PJ.6 - HFXI
+! PJ.7 - HFXO
+
+
+! ============================================
+! FORTH I/O :
+! ============================================
+TERM_TX=\$10! ; P3.4 = TX
+TERM_RX=\$20! ; P3.5 = RX
+TERM_TXRX=\$30!
+
+TERM_REN=\$226!
+TERM_SEL=\$22C!
+TERM_IE=\$23A!
+TERM_IFG=\$23C!
+Deep_RST=\$10! ; = TX pin
+Deep_RST_IN=\$220! ; TERMINAL TX pin as FORTH Deep_RST
+
+RTS=2! ; P3.1
+CTS=1! ; P3.0
+HANDSHAKIN=\$220!
+HANDSHAKOUT=\$222!
+
+
+SD_CS=\$40! ; P2.6 as SD_CS
+SD_CD=\$80! ; P2.7 as SD_CD
+SD_CDIN=\$201!
+SD_CSOUT=\$203!
+SD_CSDIR=\$205!
+
+SD_SEL1=\$20C! ; word access, to configure UCB0
+SD_REN=\$206! ; word access, to configure pullup resistors
+SD_BUS=\$07! ; pins P2.2 as UCB0CLK, P2.0 as UCB0SIMO & P2.1 as UCB0SOMI
+
+
+! ============================================
+! APPLICATION I/O :
+! ============================================
+LED1_OUT=\$202!
+LED1=1! P1.0
+
+LED2_OUT=\$282!
+LED2=\$80! P9.7
+
+SW1_IN=\$200!
+SW1=2! P1.1
+
+SW2_IN=\$200!
+SW2=4! P1.2
+
+LCDVo_DIR=\$224!
+LCDVo_SEL=\$22C! SEL1
+LCDVo=\$40! P3.6
+
+LCD_CMD_IN=\$221!
+LCD_CMD_OUT=\$223!
+LCD_CMD_DIR=\$225!
+LCD_CMD_REN=\$227!
+LCD_RS=2! P4.1
+LCD_RW=4! P4.2
+LCD_EN=8! P4.3
+LCD_CMD=\$0E!
+
+LCD_DB_IN=\$280!
+LCD_DB_OUT=\$282!
+LCD_DB_DIR=\$284!
+LCD_DB_REN=\$286!
+LCD_DB=\$0F! P9.3-0
+
+
+IR_IN=\$221!
+IR_OUT=\$223!
+IR_DIR=\$225!
+IR_REN=\$227!
+IR_IES=\$239!
+IR_IE=\$23B!
+IR_IFG=\$23D!
+RC5_=RC5_!
+RC5=1! P4.0
+IR_Vec=\$FFCC! P4 int
+
+I2CSM_IN=\$200!
+I2CSM_OUT=\$202!
+I2CSM_DIR=\$204!
+I2CSM_REN=\$206!
+SMSDA=8! P1.3
+SMSCL=\$20! P1.5
+SM_BUS=\$28!
+
+I2CSMM_IN=\$200!
+I2CSMM_OUT=\$202!
+I2CSMM_DIR=\$204!
+I2CSMM_REN=\$206!
+SMMSDA=8! P1.3
+SMMSCL=\$20! P1.5
+SMM_BUS=\$28!
+
+I2CMM_IN=\$200!
+I2CMM_OUT=\$202!
+I2CMM_DIR=\$204!
+I2CMM_REN=\$206!
+I2CMM_SEL=\$20C! SEL1
+I2CMM_Vec=\$FFEC!
+MMSDA=\$40! P1.6
+MMSCL=\$80! P1.7
+MM_BUS=\$C0!
+
+I2CM_IN=\$200!
+I2CM_OUT=\$202!
+I2CM_DIR=\$204!
+I2CM_REN=\$206!
+I2CM_SEL=\$20C!
+I2CM_Vec=\$FFEC!
+MSDA=\$40! P1.6
+MSCL=\$80! P1.7
+M_BUS=\$C0!
+
+I2CS_IN=\$200!
+I2CS_OUT=\$202!
+I2CS_DIR=\$204!
+I2CS_REN=\$206!
+I2CS_SEL=\$20C!
+I2CS_Vec=\$FFEC!
+SSDA=\$40! P1.6
+SSCL=\$80! P1.7
+S_BUS=\$C0!
+
--- /dev/null
+\ PRIMES.4th
+
+PWR_STATE
+: PRIMES
+\ 2 SWAP 2 . 3 . 5
+ 2 SWAP 2 4 U.R 3 4 U.R 5
+ DO DUP DUP * I
+ < IF 1+ THEN
+ 1 OVER 1+ 3
+ DO J I MOD
+ 0= IF 1- LEAVE THEN
+ 2 +LOOP
+\ IF I . THEN
+ IF I 4 U.R THEN
+ 2 +LOOP
+ DROP ;
+
+\ 1000 PRIMES : display prime numbers up to 1000
+\ FAST FORTH for MSP430FR5969 @16MHz + TERATERM @921600Bds : 0.13 s
+
+: TEST \ 1.3s @ 16 MHz
+10 0 DO
+ CR
+ 1000 PRIMES
+LOOP ;
+
+TEST
\ No newline at end of file
--- /dev/null
+; -----------------------------------
+; prog100k.4th, to test speed of downloading
+; -----------------------------------
+ \
+WIPE
+NOECHO ; if an error occurs during download, comment this line then download again
+ \
+\ Copyright (C) <2016> <J.M. THOORENS>
+\
+\ This program is free software: you can redistribute it and/or modify
+\ it under the terms of the GNU General Public License as published by
+\ the Free Software Foundation, either version 3 of the License, or
+\ (at your option) any later version.
+\
+\ This program is distributed in the hope that it will be useful,
+\ but WITHOUT ANY WARRANTY\ without even the implied warranty of
+\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+\ GNU General Public License for more details.
+\
+\ You should have received a copy of the GNU General Public License
+\ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+\ ===========================================================================
+\ remember: for good downloading to target, all lines must be ended with CR+LF !
+\ ===========================================================================
+
+
+\ REGISTERS USAGE
+\ R4 to R7 must be saved before use and restored after
+\ scratch registers Y to S are free for use
+\ under interrupt, IP is free for use
+
+\ PUSHM order : PSP,TOS, IP, S, T, W, X, Y, R7, R6, R5, R4
+\ example : PUSHM IP,Y
+\
+\ POPM order : R4, R5, R6, R7, Y, X, W, T, S, IP,TOS,PSP
+\ example : POPM Y,IP
+
+\ ASSEMBLER conditionnal usage after IF UNTIL WHILE : S< S>= U< U>= 0= 0<> 0>=
+\ ASSEMBLER conditionnal usage before ?JMP ?GOTO : S< S>= U< U>= 0= 0<> 0<
+
+\ FORTH conditionnal : 0= 0< = < > U<
+
+\ display on a LCD 2x20 CHAR the code sent by an IR remote under philips RC5 protocol
+\ target : any TI MSP-EXP430FRxxxx launchpad (FRAM)
+\ LPM_MODE = LPM0 because use SMCLK for LCDVo
+
+\ DEMO : driver for IR remote compatible with the PHILIPS RC5 protocol
+\ plus : driver for 5V LCD 2x20 characters display with 4 bits data interface
+\ without usage of an auxiliary 5V to feed the LCD_Vo
+\ and without potentiometer to adjust the LCD contrast :
+\ to adjust LCD contrast, just press S1 (-) or S2 (+)
+\ LCDVo current consumption ~ 500 uA.
+
+\ ===================================================================================
+\ notice : adjust TA0EX0,TB0CTL,TB0EX0 and 20_us to the target frequency if <> 8MHz !
+\ ===================================================================================
+
+
+\ layout : I/O are defined in the launchpad.pat file (don't work with ChipStick_FR2433)
+
+\ GND <-------+---0V0----------> 1 LCD_Vss
+\ VCC >------ | --3V6-----+----> 2 LCD_Vdd
+\ | |
+\ ___ 470n ---
+\ ^ ---
+\ / \ 1N4148 |
+\ --- |
+\ 100n | 2k2 |
+\ TB0.2 >---||--+--^/\/\/v--+----> 3 LCD_Vo (= 0V6 without modulation)
+\ -------------------------> 4 LCD_RW
+\ -------------------------> 5 LCD_RW
+\ -------------------------> 6 LCD_EN
+\ <------------------------> 11 LCD_DB4
+\ <------------------------> 12 LCD_DB5
+\ <------------------------> 13 LCD_DB5
+\ <------------------------> 14 LCD_DB7
+
+\ <----- LCD contrast + <--- Sw1 <--- (finger) :-)
+\ <----- LCD contrast - <--- Sw2 <--- (finger) :-)
+
+\ rc5 <--- OUT IR_Receiver (1 TSOP32236)
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+RST_STATE ;
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF1 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+
+ECHO
+ ; download is done
+RST_HERE ; this app is protected against <reset>,
+\ START
--- /dev/null
+; -----------------------------------
+; prog10k.4th
+; -----------------------------------
+ \
+PWR_STATE
+\ NOECHO ; if an error occurs during download, comment this line then download again
+ \
+\ Copyright (C) <2016> <J.M. THOORENS>
+\
+\ This program is free software: you can redistribute it and/or modify
+\ it under the terms of the GNU General Public License as published by
+\ the Free Software Foundation, either version 3 of the License, or
+\ (at your option) any later version.
+\
+\ This program is distributed in the hope that it will be useful,
+\ but WITHOUT ANY WARRANTY\ without even the implied warranty of
+\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+\ GNU General Public License for more details.
+\
+\ You should have received a copy of the GNU General Public License
+\ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+\ ===========================================================================
+\ remember: for good downloading to target, all lines must be ended with CR+LF !
+\ ===========================================================================
+
+
+\ REGISTERS USAGE
+\ R4 to R7 must be saved before use and restored after
+\ scratch registers Y to S are free for use
+\ under interrupt, IP is free for use
+
+\ PUSHM order : PSP,TOS, IP, S, T, W, X, Y, R7, R6, R5, R4
+\ example : PUSHM IP,Y
+\
+\ POPM order : R4, R5, R6, R7, Y, X, W, T, S, IP,TOS,PSP
+\ example : POPM Y,IP
+
+\ ASSEMBLER conditionnal usage after IF UNTIL WHILE : S< S>= U< U>= 0= 0<> 0>=
+\ ASSEMBLER conditionnal usage before ?JMP ?GOTO : S< S>= U< U>= 0= 0<> 0<
+
+\ FORTH conditionnal : 0= 0< = < > U<
+
+\ display on a LCD 2x20 CHAR the code sent by an IR remote under philips RC5 protocol
+\ target : any TI MSP-EXP430FRxxxx launchpad (FRAM)
+\ LPM_MODE = LPM0 because use SMCLK for LCDVo
+
+\ DEMO : driver for IR remote compatible with the PHILIPS RC5 protocol
+\ plus : driver for 5V LCD 2x20 characters display with 4 bits data interface
+\ without usage of an auxiliary 5V to feed the LCD_Vo
+\ and without potentiometer to adjust the LCD contrast :
+\ to adjust LCD contrast, just press S1 (-) or S2 (+)
+\ LCDVo current consumption ~ 500 uA.
+
+\ ===================================================================================
+\ notice : adjust TA0EX0,TB0CTL,TB0EX0 and 20_us to the target frequency if <> 8MHz !
+\ ===================================================================================
+
+
+\ layout : I/O are defined in the launchpad.pat file (don't work with ChipStick_FR2433)
+
+\ GND <-------+---0V0----------> 1 LCD_Vss
+\ VCC >------ | --3V6-----+----> 2 LCD_Vdd
+\ | |
+\ ___ 470n ---
+\ ^ ---
+\ / \ 1N4148 |
+\ --- |
+\ 100n | 2k2 |
+\ TB0.2 >---||--+--^/\/\/v--+----> 3 LCD_Vo (= 0V6 without modulation)
+\ -------------------------> 4 LCD_RW
+\ -------------------------> 5 LCD_RW
+\ -------------------------> 6 LCD_EN
+\ <------------------------> 11 LCD_DB4
+\ <------------------------> 12 LCD_DB5
+\ <------------------------> 13 LCD_DB5
+\ <------------------------> 14 LCD_DB7
+
+\ <----- LCD contrast + <--- Sw1 <--- (finger) :-)
+\ <----- LCD contrast - <--- Sw2 <--- (finger) :-)
+
+\ rc5 <--- OUT IR_Receiver (1 TSOP32236)
+
+
+PWR_STATE
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF9 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF9,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+PWR_STATE
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF9 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF9,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+
+PWR_STATE
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF9 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF9,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+
+PWR_STATE
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF9 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF9,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+
+PWR_STATE
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF9 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF9,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+
+PWR_STATE
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF9 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF9,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+
+PWR_STATE
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF9 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF9,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+
+PWR_STATE
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF9 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF9,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+
+PWR_STATE
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF9 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF9,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+
+PWR_STATE
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF9 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF9,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+
+PWR_STATE
+
+
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR to force fall down to LPM mode
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #38,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : BASE,TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+BIC #$F8,0(RSP) \ CPU is ON and GIE is OFF in retiSR to force fall down to LPM0_LOOP
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 1us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+BIC #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old UF9 = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF9,0(RSP) \ change Toggle bit memory, UserFlag1 = SR(9) = 1
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save variable BASE before use
+MOV TOS,0(PSP) \ save TOS before use
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #$4000,IP \ test /C6 bit in IP
+0= IF BIS #$40,TOS \ set C6 bit in S
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+
+\ ------------------------------\
+\ Display IR_RC5 code \
+\ ------------------------------\
+\ BIS.B #LED1,&LED1_OUT \ switch ON LED1, comment if no LED
+\ ------------------------------\
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ $10 BASE ! \ change BASE to hexadecimal
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+\ ------------------------------\
+\ BIC.B #LED1,&LED1_OUT \ switch OFF LED1, comment if no LED
+\ ------------------------------\
+MOV @PSP+,&BASE \ restore variable BASE
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+ MOV #$5A5E,&WDTCTL \ init WDT VLOCLK source ~10kHz /2^9 (50 ms), interval mode
+\ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init RC5_Int \
+\ ------------------------------\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_INT,&WDT_Vec \ init WDT interval vector interrupt
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM) (very, very usefull after COLD or RESET !:-)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+
+
+ECHO
+ ; download is done
+PWR_HERE ; this app is protected against power ON/OFF,
+\ START
--- /dev/null
+; -----------------------------------
+; RC5toLCD.4th
+; -----------------------------------
+ \
+\ Copyright (C) <2016> <J.M. THOORENS>
+\
+\ This program is free software: you can redistribute it and/or modify
+\ it under the terms of the GNU General Public License as published by
+\ the Free Software Foundation, either version 3 of the License, or
+\ (at your option) any later version.
+\
+\ This program is distributed in the hope that it will be useful,
+\ but WITHOUT ANY WARRANTY\ without even the implied warranty of
+\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+\ GNU General Public License for more details.
+\
+\ You should have received a copy of the GNU General Public License
+\ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+\ ===========================================================================
+\ remember: for good downloading to target, all lines must be ended with CR+LF !
+\ ===========================================================================
+
+
+\ REGISTERS USAGE
+\ R4 to R7 must be saved before use and restored after
+\ scratch registers Y to S are free for use
+\ under interrupt, IP is free for use
+\ interrupts reset SR register !
+
+\ PUSHM order : PSP,TOS, IP, S, T, W, X, Y, R7, R6, R5, R4
+\ example : PUSHM IP,Y
+\
+\ POPM order : R4, R5, R6, R7, Y, X, W, T, S, IP,TOS,PSP
+\ example : POPM Y,IP
+
+\ ASSEMBLER conditionnal usage after IF UNTIL WHILE : S< S>= U< U>= 0= 0<> 0>=
+\ ASSEMBLER conditionnal usage before ?JMP ?GOTO : S< S>= U< U>= 0= 0<> 0<
+
+\ FORTH conditionnal : 0= 0< = < > U<
+
+\ display on a LCD 2x20 CHAR the code sent by an IR remote under philips RC5 protocol
+\ target : any TI MSP-EXP430FRxxxx launchpad (FRAM)
+\ LPM_MODE = LPM0 because use SMCLK for LCDVo
+
+\ DEMO : driver for IR remote compatible with the PHILIPS RC5 protocol
+\ plus : driver for 5V LCD 2x20 characters display with 4 bits data interface
+\ without usage of an auxiliary 5V to feed the LCD_Vo
+\ and without potentiometer to adjust the LCD contrast :
+\ to adjust LCD contrast, just press S1 (-) or S2 (+)
+\ LCDVo current consumption ~ 500 uA.
+
+\ ===================================================================================
+\ notice : adjust TA0EX0,TB0CTL,TB0EX0 and 20_us to the target frequency if <> 8MHz !
+\ ===================================================================================
+
+
+\ layout : I/O are defined in the launchpad.pat file (don't work with ChipStick_FR2433)
+
+\ GND <-------+---0V0----------> 1 LCD_Vss
+\ VCC >------ | --3V6-----+----> 2 LCD_Vdd
+\ | |
+\ ___ 470n ---
+\ ^ ---
+\ / \ 1N4148 |
+\ --- |
+\ 100n | 2k2 |
+\ TB0.2 >---||--+--^/\/\/v--+----> 3 LCD_Vo (= 0V6 without modulation)
+\ -------------------------> 4 LCD_RW
+\ -------------------------> 5 LCD_RW
+\ -------------------------> 6 LCD_EN
+\ <------------------------> 11 LCD_DB4
+\ <------------------------> 12 LCD_DB5
+\ <------------------------> 13 LCD_DB5
+\ <------------------------> 14 LCD_DB7
+
+\ <----- LCD contrast + <--- Sw1 <--- (finger) :-)
+\ <----- LCD contrast - <--- Sw2 <--- (finger) :-)
+
+\ rc5 <--- OUT IR_Receiver (1 TSOP32236)
+
+
+
+[UNDEFINED] {RC5TOLCD} [IF]
+ \
+MARKER {RC5TOLCD}
+ \
+[UNDEFINED] MAX [IF] \ MAX and MIN are defined in {ANS_COMP}
+ \
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+
+[THEN]
+ \
+
+[UNDEFINED] U.R [IF] \ defined in {UTILITY}
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+[THEN]
+ \
+
+\ CODE 20_US \ n -- n * 20 us
+\ BEGIN \ 3 cycles loop + 6~
+\ \ MOV #5,W \ 3 MCLK = 1 MHz
+\ \ MOV #23,W \ 3 MCLK = 4 MHz
+\ \ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ \ MOV #158,W \ 3 MCLK = 24 MHz
+\ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+\ SUB #1,W \ 1
+\ 0= UNTIL \ 2
+\ SUB #1,TOS \ 1
+\ 0= UNTIL \ 2
+\ MOV @PSP+,TOS \ 2
+\ MOV @IP+,PC \ 4
+\ ENDCODE
+\ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ here we presume that TB0IFG = 1...
+ BEGIN
+ BIT #1,&TB0CTL \ 3
+ 0<> UNTIL \ 2 loop until TB0IFG set
+ BIC #1,&TB0CTL \ 3 clear TB0IFG
+ SUB #1,TOS \ 1
+U< UNTIL \ 2 ...so add a dummy loop with U< instead of 0=
+MOV @PSP+,TOS \ 2
+MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+: LCD_Entry_set $04 OR LCD_WrF ;
+ \
+: LCD_DSP_Ctrl $08 OR LCD_WrF ;
+ \
+: LCD_DSP_Shift $10 OR LCD_WrF ;
+ \
+: LCD_Fn_Set $20 OR LCD_WrF ;
+ \
+: LCD_CGRAM_Set $40 OR LCD_WrF ;
+ \
+: LCD_Goto $80 OR LCD_WrF ;
+ \
+CODE LCD_R \ -- byte read byte from LCD
+ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+COLON \ starts a FORTH word
+ TOP_LCD 2 20_us \ -- %0000HHHH
+ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+HI2LO \ switch from FORTH to assembler
+ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+ MOV @RSP+,IP \ restore IP saved by COLON
+ MOV @IP+,PC \
+ENDCODE
+ \
+
+CODE LCD_RdS \ -- status Read Status
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_R
+ENDCODE
+ \
+
+CODE LCD_RdC \ -- char Read Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_R
+ENDCODE
+ \
+
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+\ XOR.B #LED1,&LED1_OUT \ to visualise WDT
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #19,&TB0CCR2 \ maxi Ton = 19/20 & VDD=3V6 ==> LCD_Vo = -1V4
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 150 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #3,&TB0CCR2 \ mini Ton = 3/20 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -150 mV / decrement
+ THEN \
+ THEN \
+THEN \
+BW1 \ from quit on truncated RC5 message
+BW2 \ from repeated RC5 command
+BW3 \ from end of RC5_INT
+BIC #$78,0(RSP) \4 SCG1,SCG0,OSCOFF,CPUOFF and GIE are OFF in retiSR to force LPM0_LOOP despite pending interrupt
+RETI \5
+ENDASM
+ \
+
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : T,W,X,Y, TA1 timer, TA1R register
+\ \ out : X = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ******************************\
+\ RC5_FirstStartBitHalfCycle: \
+\ ******************************\ division in TA1CTL (SMCLK/1|SMCLK/1|SMCLK/2|SMCLK/4|SMCLK/8)
+\ MOV #0,&TA1EX0 \ predivide by 1 in TA1EX0 register ( 125kHz| 1MHz | 2MHZ | 4MHZ | 8MHZ ), reset value
+ MOV #1,&TA1EX0 \ predivide by 2 in TA1EX0 register ( 250kHZ| 2MHz | 4MHZ | 8MHZ | 16MHZ )
+\ MOV #2,&TA1EX0 \ predivide by 3 in TA1EX0 register ( 375kHz| 3MHz | 6MHZ | 12MHZ | 24MHZ )
+\ MOV #3,&TA1EX0 \ predivide by 4 in TA1EX0 register ( 500kHZ| 4MHz | 8MHZ | 16MHZ )
+\ MOV #4,&TA1EX0 \ predivide by 6 in TA1EX0 register ( 625kHz| 5MHz | 10MHZ | 20MHZ )
+\ MOV #5,&TA1EX0 \ predivide by 6 in TA1EX0 register ( 750kHz| 6MHz | 12MHZ | 24MHZ )
+\ MOV #6,&TA1EX0 \ predivide by 7 in TA1EX0 register ( 875kHz| 7MHz | 14MHZ | 28MHZ )
+\ MOV #7,&TA1EX0 \ predivide by 8 in TA1EX0 register ( 1MHz | 8MHz | 16MHZ | 32MHZ )
+MOV #1778,X \ RC5_Period * 1us
+\ MOV #222,X \ RC5_Period * 8us (SMCLK/1 and first column above)
+MOV #14,W \ count of loop
+BEGIN \
+\ ******************************\
+\ RC5_HalfCycle \ <--- loop back ---+ with readjusted RC5_Period
+\ ******************************\ |
+\ MOV #%1000100100,&TA1CTL \ (re)start timer_A | SMCLK/1 time interval,free running,clear TA1_IFG and TA1R
+\ MOV #%1002100100,&TA1CTL \ (re)start timer_A | SMCLK/2 time interval,free running,clear TA1_IFG and TA1R
+\ MOV #%1010100100,&TA1CTL \ (re)start timer_A | SMCLK/4 time interval,free running,clear TA1_IFG and TA1R
+ MOV #%1011100100,&TA1CTL \ (re)start timer_A | SMCLK/8 time interval,free running,clear TA1_IFG and TA1R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4 cycle
+ BEGIN CMP Y,&TA1R \3 wait 1/2 + 3/4 cycle = n+1/4 cycles
+ U>= UNTIL \2
+\ ******************************\
+\ RC5_SampleOnFirstQuarter \ at n+1/4 cycles, we sample RC5_input, ST2/C6 bit first
+\ ******************************\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC T,T \ C_flag <-- T(15):T(0) <-- C_flag
+ MOV.B &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> T = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> T = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+ ADD X,Y \ | Y = n+3/4 cycles = time out because n+1/2 cycles edge is always present
+ BEGIN \ |
+ MOV &TA1R,X \3 | X grows from n+1/4 up to n+3/4 cycles
+ CMP Y,X \1 | cycle time out of bound ?
+ U>= IF \2 ^ | yes:
+ BIC #$30,&TA1CTL \ | | stop timer
+ GOTO BW1 \ | | quit on truncated RC5 message
+ THEN \ | |
+ BIT.B #RC5,&IR_IFG \3 | | n+1/2 cycles edge is always present
+ 0<> UNTIL \2 | |
+REPEAT \ ----> loop back --+ | with X = new RC5_period value
+\ ******************************\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ******************************\
+BIC #$30,&TA1CTL \ stop timer
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+RLAM #1,T \ T = x /C6 Tg A4 A3 A2 A1 A0|C5 C4 C3 C2 C1 C0 1 0
+MOV.B T,X \ X = C5 C4 C3 C2 C1 C0 1 0
+RRUM #2,X \ X = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #BIT14,T \ test /C6 bit in T
+0= IF BIS #BIT6,X \ set C6 bit in X
+THEN \ X = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ -- BASE RC5_code
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+RRUM #3,T \ new toggle bit = T(13) ==> T(10)
+XOR @RSP,T \ (new XOR old) Toggle bits
+BIT #UF10,T \ repeated RC5_command ?
+0= ?GOTO BW2 \ yes, RETI without UF10 change and without action !
+XOR #UF10,0(RSP) \ 5 toggle bit memory
+\ ******************************\
+\ Display IR_RC5 code \ X = RC5 code
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save current base
+MOV #$0A,&BASE \ set hex base
+MOV TOS,0(PSP) \ save TOS
+MOV X,TOS \
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ CR ." $" 2 U.R \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+MOV @PSP+,&BASE \ restore current BASE
+\ ******************************\
+GOTO BW3
+\ ******************************\
+ENDASM
+ \
+
+\ ------------------------------\
+ASM BACKGROUND \
+\ ------------------------------\
+\ ... \ insert here your background task
+\ ... \
+\ ... \
+MOV #(SLEEP),PC \ Must be the last statement of BACKGROUND
+ENDASM \
+\ ------------------------------\
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ -------------------------------\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ -------------------------------\
+\ TB0CCRx \
+\ -------------------------------\
+\ TB0EX0 \
+\ ------------------------------\
+\ set TB0 to make 50kHz PWM \ for LCD_Vo, works without interrupt
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ)
+\ ------------------------------\
+\ MOV #%1001010100,&TB0CTL \ SMCLK/2, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (2 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+\ MOV #%1011010100,&TB0CTL \ SMCLK/8, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+ MOV #%1011010100,&TB0CTL \ SMCLK/8, up mode, clear timer, no int
+ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1011010100,&TB0CTL \ SMCLK/8, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #20,&TB0CCR0 \ 20*1us=20us
+\ ------------------------------\
+\ set TB0.2 to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+ MOV #10,&TB0CCR2 \ contrast adjust : 10/20 ==> LCD_Vo = -0V6|+3V6 (Vcc=3V6)
+\ MOV #12,&TB0CCR2 \ contrast adjust : 12/20 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ******************************\
+\ init RC5_Int \
+\ ******************************\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ******************************\
+\ init WatchDog TA0 \ eUSCI_A0 (FORTH terminal) has higher priority than TA0
+\ ******************************\
+\ %01 0001 0100 \ TAxCTL
+\ -- \ TASSEL CLK = ACLK = LFXT = 32768 Hz
+\ -- \ ID divided by 1
+\ -- \ MC MODE = up to TAxCCRn
+\ - \ TACLR clear timer count
+\ - \ TAIE
+\ - \ TAIFG
+\ ------------------------------\
+ MOV #%0100010100,&TA0CTL \ start TA0, ACLK, up mode, disable int,
+\ ------------------------------\
+\ 000 \ TAxEX0
+\ --- \ TAIDEX pre divisor
+\ ------------------------------\
+\ %0000 0000 0000 0101 \ TAxCCR0
+ MOV ##1638,&TA0CCR0 \ init WDT for LFXT: 32768/20=1638 ==> 50ms
+\ MOV ##400,&TA0CCR0 \ init WDT for VLO: 8000/20=400 ==> 50ms
+\ ------------------------------\
+\ %0000 0000 0001 0000 \ TAxCCTL0
+\ - \ CAP capture/compare mode = compare
+\ - \ CCIEn
+\ - \ CCIFGn
+ MOV #%10000,&TA0CCTL0 \ enable compare interrupt, clear CCIFG0
+\ ------------------------------\
+ MOV #WDT_INT,&TA0_0_Vec \ for only CCIFG0 int, this interrupt clears automatically CCIFG0
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+
+\ ------------------------------\
+\ redirects to background task \
+\ ------------------------------\
+ MOV #SLEEP,X \
+ MOV #BACKGROUND,2(X) \
+\ ------------------------------\
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ $03E8 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ $5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ $2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ $2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+\ NOECHO \ uncomment to run this app without terminal connexion
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM), must be the START last statement.
+;
+ \
+
+CODE STOP \ stops multitasking, must to be used before downloading app
+ MOV #SLEEP,X \
+ MOV #(SLEEP),2(X) \ restore the default background
+COLON
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+ECHO
+ ; downloading RC5toLCD.4th is done
+RST_HERE ; this app is protected against <reset>
+ \
+[THEN]
+ \
+START
\ No newline at end of file
; RTC_C.f
; --------------------
-\ Copyright (C) <2016> <J.M. THOORENS>
-\
-\ This program is free software: you can redistribute it and/or modify
-\ it under the terms of the GNU General Public License as published by
-\ the Free Software Foundation, either version 3 of the License, or
-\ (at your option) any later version.
-\
-\ This program is distributed in the hope that it will be useful,
-\ but WITHOUT ANY WARRANTY; without even the implied warranty of
-\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-\ GNU General Public License for more details.
-\
-\ You should have received a copy of the GNU General Public License
-\ along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-
\ REGISTERS USAGE
\ R4 to R7 must be saved before use and restored after
\ scratch registers Y to S are free for use
\ allow to write on a SD_Card file with a valid date and a valid time
-\ ECHO ; if an error occurs during download, uncomment this line then download again
-
+[UNDEFINED] {RTC} [IF]
\
+[UNDEFINED] MAX [IF]
+ \
CODE MAX \ n1 n2 -- n3 signed maximum
- CMP @PSP,TOS \ n2-n1
- S< ?GOTO FW1 \ n2<n1
-BW1 ADD #2,PSP
- MOV @IP+,PC
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
ENDCODE
\
CODE MIN \ n1 n2 -- n3 signed minimum
- CMP @PSP,TOS \ n2-n1
- S< ?GOTO BW1 \ n2<n1
-FW1 MOV @PSP+,TOS
- MOV @IP+,PC
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
ENDCODE
+
+[THEN]
\
-: U.R \ u n -- display u unsigned in n width
+[UNDEFINED] U.R [IF]
+: U.R \ u n -- display u unsigned in n width (n >= 2)
>R <# 0 # #S #>
R> OVER - 0 MAX SPACES TYPE
;
+[THEN]
\
+
CODE DATE?
SUB #6,PSP
MOV TOS,4(PSP)
BEGIN
- BIT.B #$10,&RTCCTL2 \ test RTCRDY flag
+ BIT.B #RTCRDY,&RTCCTL1 \ test RTCRDY flag
0<> UNTIL \ wait until RTCRDY high
MOV &RTCYEARL,2(PSP) \ year
MOV.B &RTCMON,TOS
2 U.R $2F EMIT .
;
\
-CODE DATE!
- MOV.B #$A5,&RTCCTL1
+: DATE!
+DEPTH 2 > IF
+ HI2LO
MOV TOS,&RTCYEARL \ year
MOV.B @PSP,&RTCMON \ month \ @PSP+ don't work because byte format !
MOV.B 2(PSP),&RTCDAY \ day \ @PSP+ don't work because byte format !
ADD #4,PSP
MOV @PSP+,TOS \
-COLON
+ LO2HI
+THEN
." we are on " DATE?
;
\
CODE TIME?
SUB #6,PSP
- MOV TOS,4(PSP) \ save TOS
+ MOV TOS,4(PSP) \ save TOS
BEGIN
- BIT.B #$10,&RTCCTL2 \ test RTCRDY flag
- 0<> UNTIL \ wait until RTCRDY high
+ BIT.B #RTCRDY,&RTCCTL1 \
+ 0<> UNTIL \ wait until RTCRDY high
MOV.B &RTCSEC,TOS
- MOV TOS,2(PSP) \ seconds
+ MOV TOS,2(PSP) \ seconds
MOV.B &RTCMIN,TOS
- MOV TOS,0(PSP) \ minutes
- MOV.B &RTCHOUR,TOS \ hours
+ MOV TOS,0(PSP) \ minutes
+ MOV.B &RTCHOUR,TOS \ hours
COLON
2 U.R $3A EMIT
2 U.R $3A EMIT 2 U.R
;
\
: TIME!
+DEPTH 1 > IF
DEPTH 2 = IF 0 THEN \ to allow "hour min TIME!" scheme
HI2LO
- MOV.B #$A5,&RTCCTL1
MOV TOS,&RTCSEC \ seconds
MOV.B @PSP,&RTCMIN \ minutes \ @PSP+ don't work because byte format !
MOV.B 2(PSP),&RTCHOUR \ hours \ @PSP+ don't work because byte format !
ADD #4,PSP
MOV @PSP+,TOS \
LO2HI
+THEN
." it is " TIME?
;
\
ABUF ABUF 20 (ACCEPT) EVALUATE CR 3 SPACES DATE!
CR CR ." TIME (HMS or HM): "
ABUF ABUF 20 (ACCEPT) EVALUATE CR 3 SPACES TIME!
- CR
- PWR_STATE \ auto remove all this application !
+ CR NOECHO
HI2LO
MOV #PSTACK,PSP \ to avoid stack empty error if lack of typed values.
MOV @RSP+,IP
MOV @IP+,PC
ENDCODE
-
\
-GET_TIME \ all words created by RTC.f are removed
+PWR_HERE
+[THEN]
+ \
+GET_TIME
--- /dev/null
+
+\ how to test SD_CARD driver on your launchpad:
+
+
+\ remove the jumpers RX, TX of programming port (don't remove GND, TST, RST and VCC)
+\ wire PL2303TA/HXD: GND <-> GND, RX <-- TX, TX --> RX
+\ connect it to your PC on a free USB port
+\ connect the PL2303TA/HXD cable to your PC on another free USB port
+\ configure TERATERM as indicated in forthMSP430FR.asm
+
+
+\ if you have a MSP-EXP430FR5994 launchpad, program it with MSP_EXP430FR5994_3Mbds_SD_CARD.txt
+\ to do, drag and drop this file onto prog.bat
+\ nothing else to do!
+
+
+\ else edit forthMSP430FR.asm with scite editor
+\ uncomment your target, copy it
+\ paste it into (SHIFT+F8) param1
+\ set DTC .equ 1
+\ FREQUENCY .equ 16
+\ THREADS .equ 16
+\ TERMINALBAUDRATE .equ 3000000
+\
+\ uncomment: CONDCOMP
+\ MSP430ASSEMBLER
+\ SD_CARD_LOADER
+\ SD_CARD_READ_WRITE
+\
+\ compile for your target (CTRL+0)
+\
+\ program your target via TI interface (CTRL+1)
+\
+\ then wire your SD_Card module as described in your MSP430-FORTH\target.pat file
+
+
+
+
+\ format FAT16 or FAT32 a SD_CARD memory (max 64GB) with "FRxxxx" in the disk name
+\ drag and drop \CONDCOMP\MISC folder on the root of this SD_CARD memory (FastForth doesn't do yet)
+\ put it in your target SD slot
+\ if no reset, type COLD from the console input (teraterm) to reset FAST FORTH
+
+\ with MSP430FR5xxx or MSP430FR6xxx targets, you can first set RTC:
+\ by downloading RTC.f with SendSourceFileToTarget.bat
+\ then terminal input asks you to type (with spaces) (DMY), then (HMS) (or (HM)),
+\ So, subsequent copied files will be dated:
+
+\ with CopySourceFileToTarget_SD_Card.bat (or better, from scite editor, menu tools):
+
+\ copy TESTASM.4TH to \MISC\TESTASM.4TH (add path \MISC in the window opened by TERATERM)
+\ copy TSTWORDS.4TH to \TSTWORDS.4TH
+\ copy CORETEST_xMPY.4TH to \CORETEST.4TH (x=S for FR4133, else x=H; suppr _xMPY in the window opened by TERATERM)
+\ copy SD_TOOLS.f to \SD_TOOLS.4TH
+\ copy SD_TEST.f to \SD_TEST.4TH
+\ copy PROG10k.f to \PROG10k.4TH
+\ copy RTC.f to \RTC.4TH ( doesn't work with if FR2xxx or FR4xxx)
+
+
+[UNDEFINED] MAX [IF] \ MAX and MIN are defined in {ANS_COMP}
+ CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+ BW1 ADD #2,PSP
+ MOV @IP+,PC
+ ENDCODE
+ \
+
+ CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+ FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ ENDCODE
+[THEN]
+ \
+
+
+[UNDEFINED] U.R [IF] \ defined in {UTILITY}
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+>R <# 0 # #S #>
+R> OVER - 0 MAX SPACES TYPE
+;
+[THEN]
+ \
+
+[UNDEFINED] DUMP [IF] \ defined in {UTILITY}
+\ https://forth-standard.org/standard/tools/DUMP
+: DUMP \ adr n -- dump memory
+ BASE @ >R $10 BASE !
+ SWAP $FFF0 AND SWAP
+ OVER + SWAP
+ DO CR \ generate line
+ I 7 U.R SPACE \ generate address
+ I $10 + I \ display 16 bytes
+ DO I C@ 3 U.R LOOP
+ SPACE SPACE
+ I $10 + I \ display 16 chars
+ DO I C@ $7E MIN BL MAX EMIT LOOP
+ $10 +LOOP
+ R> BASE !
+;
+[THEN]
+ \
+
+: SD_TEST
+ ECHO CR
+ ." 1 Load {UTILITY} words" CR
+ ." 2 Load ANS core tests" CR
+ ." 3 Load a 10k program " CR
+ ." 4 Read only this source file" CR
+ ." 5 Write a dump of FORTH to yourfile.txt" CR
+ ." 6 append a dump of FORTH to yourfile.txt" CR
+ ." 7 Load truc (test error)" CR
+ ." 8 Set date and time" CR
+ ." your choice : "
+ KEY
+ 48 -
+ DUP 1 =
+ IF .
+ NOECHO LOAD" UTILITY.4TH" \ quiet downloading...
+ ELSE DUP 2 =
+ IF .
+ LOAD" CORETEST.4TH"
+ ELSE DUP 3 =
+ IF .
+ LOAD" PROG10K.4TH"
+ ELSE DUP 4 =
+ IF .
+ READ" PROG10K.4TH"
+ BEGIN
+ READ \ sequentially read 512 bytes
+ UNTIL \ prog10k.4TH is closed
+ ELSE DUP 5 =
+ IF .
+ DEL" YOURFILE.TXT"
+ WRITE" YOURFILE.TXT"
+ ['] SD_EMIT IS EMIT
+ PROGRAMSTART HERE OVER - DUMP
+ ['] (EMIT) IS EMIT
+ CLOSE
+ ELSE DUP 6 =
+ IF .
+ WRITE" YOURFILE.TXT"
+ ['] SD_EMIT IS EMIT
+ PROGRAMSTART HERE OVER - DUMP
+ ['] (EMIT) IS EMIT
+ CLOSE
+ ELSE DUP 7 =
+ IF .
+ LOAD" truc"
+ ELSE DUP 8 =
+ IF .
+ NOECHO LOAD" RTC.4TH" \ quiet downloading...
+ ELSE
+ DROP ." ?"
+ CR ." loading TSTWORDS.4TH..."
+ LOAD" TSTWORDS.4TH"
+ THEN
+ THEN
+ THEN
+ THEN
+ THEN
+ THEN
+ THEN
+ THEN
+;
+
+SD_TEST
--- /dev/null
+; ------------------------------------------------
+; BASIC TOOLS for SD Card : DIR FAT SECTOR CLUSTER
+; ------------------------------------------------
+
+\ Fast Forth For Texas Instrument MSP430FRxxxx FRAM devices
+\ Copyright (C) <2017> <J.M. THOORENS>
+\
+\ This program is free software: you can redistribute it and/or modify
+\ it under the terms of the GNU General Public License as published by
+\ the Free Software Foundation, either version 3 of the License, or
+\ (at your option) any later version.
+\
+\ This program is distributed in the hope that it will be useful,
+\ but WITHOUT ANY WARRANTY; without even the implied warranty of
+\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+\ GNU General Public License for more details.
+\
+\ You should have received a copy of the GNU General Public License
+\ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+\ REGISTERS USAGE
+\ R4 to R7 must be saved before use and restored after
+\ scratch registers Y to S are free for use
+\ under interrupt, IP is free for use
+
+\ PUSHM order : PSP,TOS, IP, S, T, W, X, Y, R7, R6, R5, R4
+\ example : PUSHM IP,Y
+\
+\ POPM order : R4, R5, R6, R7, Y, X, W, T, S, IP,TOS,PSP
+\ example : POPM Y,IP
+
+\ ASSEMBLER conditionnal usage after IF UNTIL WHILE : S< S>= U< U>= 0= 0<> 0>=
+\ ASSEMBLER conditionnal usage before GOTO ?GOTO : S< S>= U< U>= 0= 0<> <0
+
+\ FORTH conditionnal usage after IF UNTIL WHILE : 0= 0< = < > U<
+ \
+[DEFINED] {SD_LOAD} [UNDEFINED] {SD_TOOLS} AND [IF]
+ \
+MARKER {SD_TOOLS}
+ \
+[UNDEFINED] MAX [IF] \ MAX and MIN are defined in {ANS_COMP}
+ \
+CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+BW1 ADD #2,PSP
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ENDCODE
+
+[THEN]
+ \
+
+[UNDEFINED] U.R [IF] \ defined in {UTILITY}
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+[THEN]
+ \
+
+[UNDEFINED] DUMP [IF] \ defined in {UTILITY}
+: DUMP \ adr n -- dump memory
+ BASE @ >R $10 BASE !
+ SWAP $FFF0 AND SWAP
+ OVER + SWAP
+ DO CR \ generate line
+ I 7 U.R SPACE \ generate address
+ I $10 + I \ display 16 bytes
+ DO I C@ 3 U.R LOOP
+ SPACE SPACE
+ I $10 + I \ display 16 chars
+ DO I C@ $7E MIN BL MAX EMIT LOOP
+ $10 +LOOP
+ R> BASE !
+;
+[THEN]
+ \
+
+
+\ display content of a sector
+\ ----------------------------------\
+CODE SECTOR \ sector. -- don't forget to add decimal point to your sector number
+\ ----------------------------------\
+ MOV TOS,X \ X = SectorH
+ MOV @PSP,W \ W = sectorL
+ CALL &ReadSectorWX \ W = SectorLO X = SectorHI
+COLON \
+ <# #S #> TYPE SPACE \ ud -- display the double number
+ BUFFER $200 DUMP CR ; \ then dump the sector
+\ ----------------------------------\
+ \
+
+\ ----------------------------------\
+CODE FAT \ Display CurFATsector
+\ ----------------------------------\
+ SUB #4,PSP \
+ MOV TOS,2(PSP) \
+ MOV &CurFATsector,0(PSP) \ FATsectorLO
+ ADD &OrgFAT1,0(PSP) \
+ MOV #0,TOS \ FATsectorHI = 0
+ JMP SECTOR \ jump to a defined word
+ENDCODE
+\ ----------------------------------\
+ \
+
+\ display first sector of a Cluster
+\ ----------------------------------\
+CODE CLUSTER \ cluster. -- don't forget to add decimal point to your cluster number
+\ ----------------------------------\
+ MOV.B &SecPerClus,W \ 3 SecPerClus(5-1) = multiplicator
+ MOV @PSP,X
+ RRA W \ 1
+ U< IF \ case of SecPerClus>1
+ BEGIN
+ ADD X,X \ 5 (RLA) shift one left MULTIPLICANDlo16
+ ADDC TOS,TOS \ 1 (RLC) shift one left MULTIPLICANDhi8
+ RRA W \ 1 shift one right multiplicator
+ U>= UNTIL \ carry set
+ THEN \
+ ADD &OrgClusters,X \ add OrgClusters = sector of virtual cluster 0 (word size)
+ MOV X,0(PSP)
+ ADDC #0,TOS \ don't forget carry
+ JMP SECTOR \ jump to a defined word
+ENDCODE
+\ ----------------------------------\
+ \
+
+\ ----------------------------------\
+CODE DIR \ Display CurrentDir first sector
+\ ----------------------------------\
+ SUB #4,PSP \
+ MOV TOS,2(PSP) \ save TOS
+ MOV &DIRclusterL,0(PSP) \
+ MOV &DIRclusterH,TOS \
+ JMP CLUSTER \
+ENDCODE
+\ ----------------------------------\
+ \
+ ; added : FAT to DUMP first sector of FAT1 and DIR for that of current DIRectory.
+ ; added : SECTOR to DUMP a sector and CLUSTER for first sector of a cluster
+ ; include a decimal point to force 32 bits number, example : .2 CLUSTER
+ \
+[THEN]
+ ; v--- use backspaces before hit "CR" to decrease application protection level
+PWR_HERE RST_HERE
\ No newline at end of file
--- /dev/null
+\ -----------------------------------------------------------------------
+\ File Name TestASM.4th
+\ -----------------------------------------------------------------------
+ECHO
+
+\ -----------------------------------------------------------------------
+\ test CPUx instructions PUSHM, POPM, RLAM, RRAM, RRCM, RRUM
+\ -----------------------------------------------------------------------
+CODE TESTPUSHM
+ MOV #22222,Y
+ MOV #3,X
+ MOV #2,W
+ MOV #1,T
+ MOV #0,S
+\ PUSHM Y,IP \ uncomment to test error (registers bad order)
+ PUSHM IP,W \ PUSHM order : PSP,TOS,IP,S,T,W,X,Y,rEXIT,rDOVAR,rDOCON,rDODOES
+ POPM W,IP \ POPM order : rDODOES,rDOCON,rDOVAR,rEXIT,Y,X,W,T,S,IP,TOS,PSP
+ SUB #10,PSP
+ MOV TOS,8(PSP) \ save old TOS
+ MOV S,6(PSP)
+ MOV T,4(PSP)
+ MOV W,2(PSP)
+ MOV X,0(PSP)
+ MOV Y,TOS
+\ RLAM #0,TOS \ uncomment to test error (bad shift value)
+ RRAM #1,TOS \ 0 < shift value < 5
+ RLAM #2,TOS
+ RRCM #1,TOS
+ RRUM #1,TOS
+ COLON \ high level part of the word starts here...
+ space . . . . .
+ ; \ and finishes here.
+ \
+TESTPUSHM ; you should see 11111 3 2 1 0 -->
+
+CODE TESTPOPM
+ MOV #22222,Y
+ MOV #3,X
+ MOV #2,W
+ MOV #1,T
+ MOV #0,S
+\ PUSHM W,IP \ uncomment to test error "out of bounds"
+ PUSHM IP,W \ PUSHM order : PSP,TOS,IP,S,T,W,X,Y,rEXIT,rDOVAR,rDOCON,rDODOES
+ POPM W,IP \ POPM order : rDODOES,rDOCON,rDOVAR,rEXIT,Y,X,W,T,S,IP,TOS,PSP
+ SUB #10,PSP
+ MOV TOS,8(PSP) \ save old TOS
+ MOV S,6(PSP)
+ MOV T,4(PSP)
+ MOV W,2(PSP)
+ MOV X,0(PSP)
+ MOV Y,TOS
+\ RLAM #0,TOS \ uncomment to test error "out of bounds"
+\ RLAM #5,TOS \ uncomment to test error "out of bounds"
+ RRAM #1,TOS \ 0 < shift value < 5
+ RLAM #2,TOS
+ RRCM #1,TOS
+ RRUM #1,TOS
+ COLON \ high level part of the word starts here...
+ space . . . . .
+ ; \ and finishes here.
+ \
+TESTPOPM ; you should see 11111 3 2 1 0 -->
+
+
+
+\ -----------------------------------------------------------------------
+\ test symbolic branch in assembler
+\ test a FORTH section encapsulated in an assembly word
+\ -----------------------------------------------------------------------
+CODE TEST1 \ the word "CODE" add ASSEMBLER as CONTEXT vocabulary...
+
+ MOV &BASE,&BASE \ to test &xxxx src operand
+ CMP #%10,&BASE
+0<> IF MOV #2,&BASE \ if base <> 2
+ELSE MOV #$0A,&BASE \ else base = 2
+THEN
+ COLON \ tips : no "ok" displayed in start of line <==> compilation mode
+ BASE @ U. \ always display 10 !
+ ;
+ \
+
+\ -----------------------------------------------------------------------
+\ test a word that starts as word FORTH and ends as assembly word
+\ -----------------------------------------------------------------------
+: TEST2 \ ":" starts compilation
+ BASE @ U. \ always display 10 !
+ HI2LO \ switch FORTH to ASM : compile one word (next address)
+ \ add vocabulary ASSEMBLER as CONTEXT vocabulary
+ \ switch in interpret mode
+ CMP #2, &BASE
+0<> IF MOV #2, &BASE \ if variable system BASE <> 2
+ELSE MOV #10,&BASE \ else (BASE = 2)
+THEN
+\ MOV #EXIT,PC \ to pair with ":" i.e. to restore IP saved by : then execute NEXT.
+\ but even compile two words, it's better to compile an inline EXIT :
+ MOV @RSP+,IP \ restore IP
+ MOV @IP+,PC \ = NEXT
+ENDCODE \ ends assembler : remove vocabulary ASSEMBLER from CONTEXT
+ \
+
+\ -----------------------------------------------------------------------
+\ test a word that starts as assembly word and ends as FORTH word
+\ -----------------------------------------------------------------------
+CODE TEST3 \ "CODE" starts assembler, i.e. add ASSEMBLER as CONTEXT vocabulary
+ CMP #2, &BASE
+0<> IF MOV #2, &BASE \ if variable system BASE <> 2
+ELSE MOV #10,&BASE \ else (BASE = 2)
+THEN COLON \
+ BASE @ U. \ always display 10 !
+; \
+ \
+
+
+\ -----------------------------------------------------------------------
+\ test an assembly jump spanning a section written in FORTH
+\ -----------------------------------------------------------------------
+: TEST5
+ SPACE
+ HI2LO
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ MOV #%1010,TOS \ init count = 10
+BEGIN SUB #$0001,TOS
+ LO2HI
+ \ IP is already saved by word ":"
+ DUP U. \ display count
+ HI2LO
+ CMP #0,TOS
+0= UNTIL MOV @PSP+,TOS
+\ MOV #EXIT,PC \ to pair with ":" i.e. to restore IP saved by : then execute NEXT.
+ MOV @RSP+,IP \ restore IP
+ MOV @IP+,PC \ = NEXT
+ENDCODE
+ \
+TEST5 ; you should see : 9 8 7 6 5 4 3 2 1 0 -->
+ \
+
+\ -----------------------------------------------------------------------
+\ tests indexing address
+\ -----------------------------------------------------------------------
+
+: TABLE
+CREATE
+0 DO I C,
+LOOP
+DOES>
++
+;
+
+8 TABLE BYTES_TABLE
+ \
+2 BYTES_TABLE C@ . ; you should see 2 -->
+\
+
+
+VARIABLE BYTES_TABLE1
+
+$0201 BYTES_TABLE1 ! \ words written in memory are little endian !
+
+CODE IDX_TEST1 \ index -- value
+ MOV.B BYTES_TABLE1(TOS),TOS \ -- value
+COLON
+ U.
+;
+
+0 IDX_TEST1 ; you should see 1 -->
+
+CODE TEST6
+ MOV 0(PSP),0(PSP) \
+ MOV @IP+,PC
+ENDCODE
+
+
+1 TEST6 . ; you should see 1 -->
+
+
+\ -----------------------------------------------------------------------
+\ tests behaviour of assembly error
+\ -----------------------------------------------------------------------
+\ R16 causes an error, assembler context is aborted and the word TEST7 is "hidden".
+
+; CODE TEST7
+; MOV 0(PSP),0(R16) ; display an error "out of bounds" -->
+
+
+
+
+
+
--- /dev/null
+; -----------------------------------
+; RC5toLCD.4th
+; -----------------------------------
+ \
+RST_STATE ; remove all previous downloading
+ \
+\ Copyright (C) <2016> <J.M. THOORENS>
+\
+\ This program is free software: you can redistribute it and/or modify
+\ it under the terms of the GNU General Public License as published by
+\ the Free Software Foundation, either version 3 of the License, or
+\ (at your option) any later version.
+\
+\ This program is distributed in the hope that it will be useful,
+\ but WITHOUT ANY WARRANTY\ without even the implied warranty of
+\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+\ GNU General Public License for more details.
+\
+\ You should have received a copy of the GNU General Public License
+\ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+\ ===========================================================================
+\ remember: for good downloading to target, all lines must be ended with CR+LF !
+\ ===========================================================================
+
+
+\ REGISTERS USAGE
+\ R4 to R7 must be saved before use and restored after
+\ scratch registers Y to S are free for use
+\ under interrupt, IP is free for use
+\ interrupts reset SR register !
+
+\ PUSHM order : PSP,TOS, IP, S, T, W, X, Y, R7, R6, R5, R4
+\ example : PUSHM IP,Y
+\
+\ POPM order : R4, R5, R6, R7, Y, X, W, T, S, IP,TOS,PSP
+\ example : POPM Y,IP
+
+\ ASSEMBLER conditionnal usage after IF UNTIL WHILE : S< S>= U< U>= 0= 0<> 0>=
+\ ASSEMBLER conditionnal usage before ?JMP ?GOTO : S< S>= U< U>= 0= 0<> 0<
+
+\ FORTH conditionnal : 0= 0< = < > U<
+
+\ display on a LCD 2x20 CHAR the code sent by an IR remote under philips RC5 protocol
+\ target : any TI MSP-EXP430FRxxxx launchpad (FRAM)
+\ LPM_MODE = LPM0 because use SMCLK for LCDVo
+
+\ DEMO : driver for IR remote compatible with the PHILIPS RC5 protocol
+\ plus : driver for 5V LCD 2x20 characters display with 4 bits data interface
+\ without usage of an auxiliary 5V to feed the LCD_Vo
+\ and without potentiometer to adjust the LCD contrast :
+\ to adjust LCD contrast, just press S1 (-) or S2 (+)
+\ LCDVo current consumption ~ 500 uA.
+
+\ ===================================================================================
+\ notice : adjust TA1EX0,TB0CTL,TB0EX0 and 20_us to the target frequency if <> 8MHz !
+\ ===================================================================================
+
+
+\ layout : I/O are defined in the launchpad.pat file (don't work with ChipStick_FR2433)
+
+\ GND <-------+---0V0----------> 1 LCD_Vss
+\ VCC >------ | --3V6-----+----> 2 LCD_Vdd
+\ | |
+\ ___ 470n ---
+\ ^ ---
+\ / \ 1N4148 |
+\ --- |
+\ 100n | 2k2 |
+\ TB0.2 >---||--+--^/\/\/v--+----> 3 LCD_Vo (= 0V6 without modulation)
+\ -------------------------> 4 LCD_RW
+\ -------------------------> 5 LCD_RW
+\ -------------------------> 6 LCD_EN
+\ <------------------------> 11 LCD_DB4
+\ <------------------------> 12 LCD_DB5
+\ <------------------------> 13 LCD_DB5
+\ <------------------------> 14 LCD_DB7
+
+\ <----- LCD contrast + <--- Sw1 <--- (finger) :-)
+\ <----- LCD contrast - <--- Sw2 <--- (finger) :-)
+
+\ rc5 <--- OUT IR_Receiver (1 TSOP32236)
+
+
+
+CREATE CGRAM \ LCD_CGRAM
+$00 C, $02 C, $06 C, $0E C, $06 C, $02 C, $00 C, $00 C, \ char 0 = left arrow
+$00 C, $08 C, $0C C, $0E C, $0C C, $08 C, $00 C, $00 C, \ char 1 = right arrow
+$00 C, $00 C, $04 C, $0E C, $1F C, $00 C, $00 C, $00 C, \ char 2 = up arrow
+$00 C, $00 C, $1F C, $0E C, $04 C, $00 C, $00 C, $00 C, \ char 3 = down arrow
+
+ \
+[UNDEFINED] MAX [UNDEFINED] MIN OR [IF]
+ CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+ BW1 ADD #2,PSP
+ MOV @IP+,PC
+ ENDCODE
+ \
+ CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+ FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ ENDCODE
+[THEN]
+ \
+
+[UNDEFINED] U.R [IF]
+ : U.R \ u n -- display u unsigned in n width (n >= 2)
+ >R <# 0 #S #>
+ R> OVER - 0 MAX SPACES TYPE
+ ;
+[THEN]
+ \
+
+[UNDEFINED] S>D [IF]
+ CODE S>D \ n -- d
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIT #$8000,TOS
+ MOV #0,TOS
+ 0<> IF
+ SUB #1,TOS
+ THEN
+ NEXT
+ ENDCODE
+[THEN]
+ \
+
+CODE #DABS \ d1 -- |d1| absolute value, sign in SR(UF9)
+BIC #UF9,SR
+BIT #$8000,TOS
+0<> IF
+ XOR #-1,0(PSP)
+ XOR #-1,TOS
+ ADD #1,0(PSP)
+ ADDC #0,TOS
+ BIS #UF9,SR
+THEN
+NEXT
+ENDCODE
+ \
+
+CODE #SIGN \ tests SR(UF9) and displays sign + or sign -
+SUB #2,PSP
+MOV TOS,0(PSP)
+MOV.B #43,TOS \ "+"
+BIT #UF9,SR
+0<> IF
+ ADD.B #2,TOS \ "-"
+ BIC #UF9,SR
+THEN
+COLON
+HOLD ;
+ \
+
+: SS. \ n -- display signed n in 2 digits
+<# S>D #DABS # #S #SIGN #> TYPE
+;
+ \
+
+: UU. \ u -- display unsigned u in 2 digits
+ <# 0 # #S #> TYPE
+;
+ \
+
+: U.UUU \ u -- display unsigned u in 1.3 digits
+ <# 0 # # # #44 HOLD #S #> TYPE
+;
+ \
+
+\ CODE 20_US \ n -- n * 20 us
+\ BEGIN \ 3 cycles loop + 6~
+\ \ MOV #5,W \ 3 MCLK = 1 MHz
+\ \ MOV #23,W \ 3 MCLK = 4 MHz
+\ \ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ \ MOV #158,W \ 3 MCLK = 24 MHz
+\ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+\ SUB #1,W \ 1
+\ 0= UNTIL \ 2
+\ SUB #1,TOS \ 1
+\ 0= UNTIL \ 2
+\ MOV @PSP+,TOS \ 2
+\ MOV @IP+,PC \ 4
+\ ENDCODE
+\ \
+
+CODE 20_US \ n -- n * 20 us
+BEGIN \ as no TB0 interrupt, TB0IFG is always 1 here, so add a dummy loop with U< instead of 0= UNTIL
+ BEGIN
+ BIT #1,&TB0CTL \ 3 TBI0FG ?
+ 0<> UNTIL \ 2
+ BIC #1,&TB0CTL \ 3 clear TB0IFG
+ SUB #1,TOS \ 1
+U< UNTIL \ 2
+BW1
+MOV @PSP+,TOS \ 2
+MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+CODE TOP_LCD \ LCD Sample
+\ \ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND.B #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ GOTO BW1
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+CODE LCD_W \ byte -- write byte to LCD
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+COLON \ high level word starts here
+ TOP_LCD 2 20_US \ write high nibble first
+ TOP_LCD 2 20_US
+;
+ \
+
+CODE LCD_WrC \ char -- Write Char
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+
+CODE LCD_WrF \ func -- Write Fonction
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+
+: LCD_Clear
+ $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init !
+;
+ \
+
+: LCD_Home
+ $02 LCD_WrF 100 20_us
+;
+ \
+
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+
+: LCD_Goto $80 OR LCD_WrF ;
+ \
+
+\ CODE LCD_R \ -- byte read byte from LCD
+\ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+\ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+\ COLON \ starts a FORTH word
+\ TOP_LCD 2 20_us \ -- %0000HHHH
+\ TOP_LCD 2 20_us \ -- %0000HHHH %0000LLLL
+\ HI2LO \ switch from FORTH to assembler
+\ RLAM #4,0(PSP) \ -- %HHHH0000 %0000LLLL
+\ ADD.B @PSP+,TOS \ -- %HHHHLLLL
+\ MOV @RSP+,IP \ restore IP saved by COLON
+\ MOV @IP+,PC \
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdS \ -- status Read Status
+\ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ CODE LCD_RdC \ -- char Read Char
+\ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+\ JMP LCD_R
+\ ENDCODE
+\ \
+
+\ ******************************\
+ASM WDT_INT \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+\ XOR.B #LED1,&LED1_OUT \ to visualise WDT
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #17,&TB0CCR2 \ maxi Ton = 17/20 & VDD=3V6 ==> LCD_Vo = -1V4
+\ CMP #19,&TB0CCR2 \ maxi Ton = 19/20 & VDD=3V3 ==> LCD_Vo = -1V5
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 7/20 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+BW1
+BW2
+BW3
+\ BIC #$78,0(RSP) \4 SCG1,SCG0,OSCOFF,CPUOFF and GIE are OFF in retiSR to force LPM0_LOOP despite pending interrupt
+\ MOV @RSP+,SR \2
+\ RET \4~ for system OFF / 1 sec. ==> 1mA * 5us = 5nC + 6,5uA
+\ ADD #2,RSP \2
+\ RET \5~ for system OFF / 1 sec. ==> 1mA * 5us = 5nC + 6,5uA
+BIC #$78,0(RSP) \4 SCG1,SCG0,OSCOFF,CPUOFF and GIE are OFF in retiSR to force LPM0_LOOP despite pending interrupt
+RETI \5~ for system OFF / 1 sec. ==> 1mA * 5us = 5nC + 6,5uA
+ENDASM
+ \
+
+
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : T,W,X,Y, TA1 timer, TA1R register
+\ \ out : X = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ******************************\
+\ RC5_FirstStartBitHalfCycle: \
+\ ******************************\ division in TA1CTL (SMCLK/1,SMCLK/1,SMCLK/2,SMCLK/4,SMCLK/8)
+\ MOV #0,&TA1EX0 \ predivide by 1 in TA1EX0 register ( 125kHz| 1MHz| 2MHZ| 4MHZ| 8MHZ), reset value
+ MOV #1,&TA1EX0 \ predivide by 2 in TA1EX0 register ( 250kHZ| 2MHz| 4MHZ| 8MHZ| 16MHZ)
+\ MOV #2,&TA1EX0 \ predivide by 3 in TA1EX0 register ( 375kHz| 3MHz| 6MHZ| 12MHZ| 24MHZ)
+\ MOV #3,&TA1EX0 \ predivide by 4 in TA1EX0 register ( 500kHZ| 4MHz| 8MHZ| 16MHZ)
+\ MOV #4,&TA1EX0 \ predivide by 6 in TA1EX0 register ( 625kHz| 5MHz| 10MHZ| 20MHZ)
+\ MOV #5,&TA1EX0 \ predivide by 6 in TA1EX0 register ( 750kHz| 6MHz| 12MHZ| 24MHZ)
+\ MOV #6,&TA1EX0 \ predivide by 7 in TA1EX0 register ( 875kHz| 7MHz| 14MHZ| 28MHZ)
+\ MOV #7,&TA1EX0 \ predivide by 8 in TA1EX0 register ( 1MHz| 8MHz| 16MHZ| 32MHZ)
+MOV #1778,X \ RC5_Period * 1us
+\ MOV #222,X \ RC5_Period * 8us (SMCLK/1 and first column above)
+MOV #14,W \ count of loop
+BEGIN \
+\ ******************************\
+\ RC5_HalfCycle \ <--- loop back ---+ with readjusted RC5_Period
+\ ******************************\ |
+\ MOV #%1000100100,&TA1CTL \ (re)start timer_A | SMCLK/1 time interval,free running,clear TA1_IFG and TA1R
+\ MOV #%1002100100,&TA1CTL \ (re)start timer_A | SMCLK/2 time interval,free running,clear TA1_IFG and TA1R
+\ MOV #%1010100100,&TA1CTL \ (re)start timer_A | SMCLK/4 time interval,free running,clear TA1_IFG and TA1R
+ MOV #%1011100100,&TA1CTL \ (re)start timer_A | SMCLK/8 time interval,free running,clear TA1_IFG and TA1R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4 cycle
+ BEGIN CMP Y,&TA1R \3 wait 1/2 + 3/4 cycle = n+1/4 cycles
+ U>= UNTIL \2
+\ ******************************\
+\ RC5_SampleOnFirstQuarter \ at n+1/4 cycles, we sample RC5_input, ST2/C6 bit first
+\ ******************************\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC T,T \ C_flag <-- T(15):T(0) <-- C_flag
+ MOV.B &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> T = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> T = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+ ADD X,Y \ | Y = n+3/4 cycles = time out because n+1/2 cycles edge is always present
+ BEGIN \ |
+ MOV &TA1R,X \3 | X grows from n+1/4 up to n+3/4 cycles
+ CMP Y,X \1 | cycle time out of bound ?
+ U>= IF \2 ^ | yes:
+ BIC #$30,&TA1CTL \ | | stop timer
+ GOTO BW1 \ | | quit on truncated RC5 message
+ THEN \ | |
+ BIT.B #RC5,&IR_IFG \3 | | n+1/2 cycles edge is always present
+ 0<> UNTIL \2 | |
+REPEAT \ ----> loop back --+ | with X = new RC5_period value
+\ ******************************\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ******************************\
+BIC #$30,&TA1CTL \ stop timer
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+RLAM #1,T \ T = x /C6 Tg A4 A3 A2 A1 A0|C5 C4 C3 C2 C1 C0 1 0
+MOV.B T,X \ X = C5 C4 C3 C2 C1 C0 1 0
+RRUM #2,X \ X = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #BIT14,T \ test /C6 bit in T
+0= IF BIS #BIT6,X \ set C6 bit in X
+THEN \ X = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ -- BASE RC5_code
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+RRUM #3,T \ new toggle bit = T(13) ==> T(10)
+XOR @RSP,T \ (new XOR old) Toggle bits
+BIT #UF10,T \ repeated RC5_command ?
+0= ?GOTO BW2 \ yes, RETI without UF10 change and without action !
+XOR #UF10,0(RSP) \ 5 toggle bit memory
+\ ******************************\
+\ Display IR_RC5 code \ X = RC5 code
+\ ******************************\
+SUB #4,PSP \
+MOV &BASE,2(PSP) \ save current base
+MOV #$10,&BASE \ set hex base
+MOV TOS,0(PSP) \ save TOS
+MOV X,TOS \
+LO2HI \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ CR ." $" UU. \ print IR_RC5 code
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+HI2LO \ switch from FORTH to assembler
+MOV @PSP+,&BASE \ restore current BASE
+\ ******************************\
+GOTO BW3
+\ ******************************\
+ENDASM
+ \
+
+
+\ ------------------------------\
+ASM BACKGROUND \
+\ ------------------------------\
+\ ... \ insert here your background task
+\ ... \
+\ ... \
+\ ------------------------------\
+\ define LPM mode \
+\ ------------------------------\
+ BIS #LPM4,SR \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+ MOV #(SLEEP),PC \ Must be the last statement of BACKGROUND
+ENDASM \
+\ ------------------------------\
+ \
+
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up to TB0CCR0
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ -------------------------------\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ -------------------------------\
+\ TB0CCRx \
+\ -------------------------------\
+\ TB0EX0 \
+\ ------------------------------\
+\ set TB0 to make 50kHz PWM \ for LCD_Vo, works without interrupt
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ)
+\ ------------------------------\
+\ MOV #%1001010100,&TB0CTL \ SMCLK/2, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (2 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+\ MOV #%1011010100,&TB0CTL \ SMCLK/8, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+ MOV #%1011010100,&TB0CTL \ SMCLK/8, up mode, clear timer, no int
+ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1011010100,&TB0CTL \ SMCLK/8, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #20,&TB0CCR0 \ 20*1us=20us
+\ ------------------------------\
+\ set TB0.2 to generate PWM for LCD_Vo
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+ MOV #12,&TB0CCR2 \ contrast adjust : 11/20 ==> LCD_Vo = -0V6|+3V6 (Vcc=3V6)
+\ MOV #14,&TB0CCR2 \ contrast adjust : 12/20 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL \ SEL.2 TB0.2
+\ ------------------------------\
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+ BIS.B #LCD_DB,&LCD_DB_DIR \ as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ LCD_Data pullup/down disable
+\ ******************************\
+\ init RC5_Int \
+\ ******************************\
+ BIS.B #RC5,&IR_IE \ enable RC5_Int
+ BIC.B #RC5,&IR_IFG \ reset RC5_Int flag
+ MOV #RC5_INT,&IR_Vec \ init interrupt vector
+\ ******************************\
+\ init WatchDog TA0 \ eUSCI_A0 (FORTH terminal) has higher priority than TA0
+\ ******************************\
+\ %01 0001 0100 \ TAxCTL
+\ -- \ TASSEL CLK = ACLK = LFXT = 32768 Hz
+\ -- \ ID divided by 1
+\ -- \ MC MODE = up to TAxCCRn
+\ - \ TACLR clear timer count
+\ - \ TAIE
+\ - \ TAIFG
+\ ------------------------------\
+ MOV #%0100010100,&TA0CTL \ start TA0, ACLK, up mode, disable int,
+\ ------------------------------\
+\ 000 \ TAxEX0
+\ --- \ TAIDEX pre divisor
+\ ------------------------------\
+ MOV ##1638,&TA0CCR0 \ init WDT for LFXT: 32768/20=1638 ==> 50ms
+\ MOV ##400,&TA0CCR0 \ init WDT for VLO: 8000/20=400 ==> 50ms
+\ ------------------------------\
+\ %0000 0000 0001 0000 \ TAxCCTL0
+\ - \ CAP capture/compare mode = compare
+\ - \ CCIEn
+\ - \ CCIFGn
+ MOV #%10000,&TA0CCTL0 \ enable compare interrupt, clear CCIFG0
+\ ------------------------------\
+ MOV #WDT_INT,&TA0_0_Vec \ for only CCIFG0 int, this interrupt clears automatically CCIFG0
+\ ------------------------------\
+\ redirects to background task \
+\ ------------------------------\
+ MOV #SLEEP,X \
+ MOV #BACKGROUND,2(X) \
+\ ------------------------------\
+
+LO2HI \ no need to push IP because (WARM) resets the Return Stack !
+
+\ ------------------------------\
+\ Init LCD 2x20 \
+\ ------------------------------\
+ #1000 20_US \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ #205 20_US \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ #5 20_US \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ #2 20_US \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ #2 20_US \ wait 40 us = LCD cycle
+ $28 LCD_WRF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WRF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WRF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+
+ $40 LCD_WrF \ LCD_CGRAM_Adr_Set at 0
+ CGRAM 32 0 \ -- addr limit index @ of table CGRAM in FRAM
+ DO DUP I + C@ \ -- @ byte
+ LCD_WrC \ -- @ write byte
+ LOOP DROP
+
+ $0C LCD_WRF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WRC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+\ NOECHO \ uncomment to run this app without terminal connexion
+ CR
+ ." RC5toLCD is running. Type STOP to quit"
+ LIT RECURSE IS WARM \ insert this START routine between WARM and (WARM)...
+ (WARM) \ ...and continue with (WARM), must be the last statement.
+;
+ \
+
+
+CODE SRD
+SUB #1,TOS
+MOV SR,TOS
+SUB #2,PSP
+MOV &BASE,0(PSP)
+MOV #2,&BASE
+COLON \ switch from assembler to FORTH
+ ['] LCD_CLEAR IS CR \ redirects CR
+ ['] LCD_WrC IS EMIT \ redirects EMIT
+ CR
+ <# 0 # # # # # # # #
+ 32 HOLD
+ # # # # # # # # #> TYPE \ print SR register
+ ['] (CR) IS CR \ restore CR
+ ['] (EMIT) IS EMIT \ restore EMIT
+ R> BASE !
+;
+
+
+: A_L 0 EMIT ; \ LEFT ARROW
+: A_R 1 EMIT ; \ RIGHT ARROW
+: A_U 2 EMIT ; \ UP ARROW
+: A_D 3 EMIT ; \ DOWN ARROW
+: A_P 43 EMIT ; \ PLUS SIGN
+: A_M 45 EMIT ; \ MINUS SIGN
+ \
+
+\ display ARROWs, PLUS MINUS
+\ to hide ARROW : ' SPACE IS D_L, for example
+\ or MOV #D_L,X
+\ MOV #SPACE,2(X)
+
+DEFER D_L ' A_L IS D_L
+DEFER D_U ' A_U IS D_U
+DEFER D_D ' A_D IS D_D
+DEFER D_R ' A_R IS D_R
+DEFER D_P ' A_P IS D_P
+DEFER D_M ' A_M IS D_M
+
+ \
+
+: ONOFF
+IF ." ON "
+ELSE ." OFF "
+THEN
+;
+
+: D_VOLUME
+D_M ." Volume : " SS. ." dBV " D_P
+;
+
+
+\ ===============================================
+
+: MENUDEF \ CHANNEL --
+LCD_HOME D_L ." MENU " D_U D_D ." InLive " D_R ." PASSWORD: "
+$40 LCD_GOTO
+;
+ \
+
+: OUTPUT \ PARAM(VALUE) CHANNEL --
+['] LCD_WRC IS EMIT
+MENUDEF
+D_M ." Output : " SS. ." dBV " D_P
+['] (EMIT) IS EMIT
+;
+ \
+
+: AUXCD1 \ PARAM(VALUE) CHANNEL --
+['] LCD_WRC IS EMIT
+MENUDEF
+D_M ." Chan 1 : " SS. ." dB " D_P
+['] (EMIT) IS EMIT
+;
+ \
+
+: AUXCD2 \ PARAM(VALUE) CHANNEL --
+['] LCD_WRC IS EMIT
+MENUDEF
+D_M ." Chan 2 : " SS. ." dB " D_P
+['] (EMIT) IS EMIT
+;
+ \
+
+\ ===============================================
+
+: MENUCHAN \ CHANNEL --
+LCD_HOME D_L ." MENU " D_U D_D ." Chan" UU. SPACE D_R
+$40 LCD_GOTO
+;
+ \
+
+: GAIN \ GAIN CHANNEL --
+['] LCD_WRC IS EMIT
+MENUCHAN
+D_M ." Gain : " SS. ." dB " D_P
+['] (EMIT) IS EMIT
+;
+ \
+
+: NGLVL \ NGLVL CHANNEL --
+['] LCD_WRC IS EMIT
+MENUCHAN
+D_M ." NGlevel: " SS. ." dB " D_P
+['] (EMIT) IS EMIT
+;
+ \
+
+: NGDLY \ NGDLY CHANNEL --
+['] LCD_WRC IS EMIT
+MENUCHAN
+D_M ." NGdelay: " U.UUU ." s " D_P
+['] (EMIT) IS EMIT
+;
+ \
+
+: HIPASS \ HIPASS CHANNEL --
+['] LCD_WRC IS EMIT
+MENUCHAN
+D_M ." HiPass : " 4 U.R ." Hz " D_P
+['] (EMIT) IS EMIT
+;
+ \
+
+: AMPOUT \ PARAM(VALUE) CHANNEL --
+['] LCD_WRC IS EMIT
+MENUCHAN
+D_M ." Chan. output " ONOFF D_P
+['] (EMIT) IS EMIT
+;
+ \
+
+: PHANTOM \ PARAM(VALUE) CHANNEL --
+['] LCD_WRC IS EMIT
+MENUCHAN
+D_M ." MIC Phantom " ONOFF D_P
+['] (EMIT) IS EMIT
+;
+ \
+
+: PTT \ PARAM(VALUE) CHANNEL --
+['] LCD_WRC IS EMIT
+MENUCHAN
+D_M ." Push To Talk " ONOFF D_P
+['] (EMIT) IS EMIT
+;
+ \
+
+: AUTO \ PARAM(VALUE) CHANNEL --
+['] LCD_WRC IS EMIT
+MENUCHAN
+D_M ." Auto Filter " ONOFF D_P
+['] (EMIT) IS EMIT
+;
+ \
+
+
+\ ===============================================
+
+: MENUAMP \ CHANNEL --
+LCD_HOME D_L ." MENU " D_U D_D ." COMMON " D_R
+$40 LCD_GOTO
+;
+ \
+
+: VOLUME \ PARAM(VALUE) CHANNEL --
+['] LCD_WRC IS EMIT
+MENUAMP
+D_VOLUME
+['] (EMIT) IS EMIT
+;
+ \
+
+: GRAVE \ PARAM(VALUE) CHANNEL --
+['] LCD_WRC IS EMIT
+MENUAMP
+D_M ." Graves : " SS. ." dB " D_P
+['] (EMIT) IS EMIT
+;
+ \
+
+: AIGUS \ PARAM(VALUE) CHANNEL --
+['] LCD_WRC IS EMIT
+MENUAMP
+D_M ." Aigus : " SS. ." dB " D_P
+['] (EMIT) IS EMIT
+;
+ \
+
+: VOLMAX \ PARAM(VALUE) CHANNEL --
+['] LCD_WRC IS EMIT
+MENUAMP
+D_M ." Vol Max : " SS. ." dB " D_P
+['] (EMIT) IS EMIT
+;
+ \
+
+: AUX1MAX \ PARAM(VALUE) CHANNEL --
+['] LCD_WRC IS EMIT
+MENUAMP
+D_M ." Chn1 Max: " SS. ." dB " D_P
+['] (EMIT) IS EMIT
+;
+ \
+
+: AUX2MAX \ PARAM(VALUE) CHANNEL --
+['] LCD_WRC IS EMIT
+MENUAMP
+D_M ." Chn2 Max: " SS. ." dB " D_P
+['] (EMIT) IS EMIT
+;
+ \
+
+: CONTRAST
+['] LCD_WRC IS EMIT
+MENUAMP
+D_M ." Contrast " UU. ." Incr " D_P
+['] (EMIT) IS EMIT
+;
+ \
+
+\ ===============================================
+
+
+CODE STOP \ stops multitasking, must to be used before downloading app
+ MOV #SLEEP,X \ restore the default background
+ MOV #(SLEEP),2(X) \
+COLON
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+
+
+ECHO
+ ; downloading RC5toLCD.4th is done
+RST_HERE ; this app is protected against <reset>
+\ START
--- /dev/null
+\ -----------------------------
+\ MSP-EXP430FR5969_TSTWORDS.4th
+\ -----------------------------
+
+PWR_HERE
+
+\ -----------------------------------------------------------------------
+\ test some assembler words and show how to mix FORTH/ASSEMBLER routines
+\ -----------------------------------------------------------------------
+LOAD" \misc\TestASM.4th"
+
+\ -------------------------------------
+\ here we returned in the TestWords.4th
+\ -------------------------------------
+
+\ ----------
+\ LOOP tests
+\ ----------
+: LOOP_TEST 8 0 DO I . LOOP
+;
+
+LOOP_TEST \ you should see 0 1 2 3 4 5 6 7 -->
+
+
+: LOOP_TEST1 \ n <LOOP_TEST1> ---
+
+ BEGIN DUP U. 1 -
+ ?DUP
+ 0= UNTIL
+;
+
+
+: LOOP_MAX \ FIND_NOTHING --
+ 0 0
+ DO
+ LOOP \ 14 cycles by loop
+ ABORT" 65536 LOOP "
+;
+
+
+
+ : FIND_TEST \ FIND_TEST <word> --
+ BL WORD \ -- c-addr
+ 50000 0
+ DO \ -- c-addr
+ DUP
+ FIND DROP DROP
+ LOOP
+ FIND
+ 0= IF ABORT" <-- not found !"
+ ELSE ABORT" <-- found !"
+ THEN
+ ;
+
+\ seeking $ word, FIND jumps all words on their first character so time of word loop is 20 cycles
+\ see FIND in the source file for more information
+
+\ FIND_TEST <lastword> result @ 8MHz, monothread : 1,2s
+
+\ FIND_TEST $ results @ 8MHz, monothread, 201 words in vocabulary FORTH :
+\ 27 seconds with only FORTH vocabulary in CONTEXT
+\ 540 us for one search ( which gives the delay for QNUMBER in INTERPRET routine)
+\ 2.6866 us / word, 21,49 cycles / word (for 20 cycles calculated (see FIND in source file)
+
+
+\ FIND_TEST $ results @ 8MHz, 2 threads, 201 words in vocabulary FORTH :
+\ 13 second with only FORTH vocabulary in CONTEXT
+\ 260 us for one search ( which gives the delay for QNUMBER in INTERPRET routine)
+\ 1,293 us / word, 10,34 cycles / word
+
+\ FIND_TEST $ results @ 8MHz, 4 threads, 201 words in vocabulary FORTH :
+\ 8 second with only FORTH vocabulary in CONTEXT
+\ 160 us for one search ( which gives the delay for QNUMBER in INTERPRET routine)
+\ 0,796 us / word, 6,37 cycles / word
+
+\ FIND_TEST $ results @ 8MHz, 8 threads, 201 words in vocabulary FORTH :
+\ 4.66 second with only FORTH vocabulary in CONTEXT
+\ 93 us for one search ( which gives the delay for QNUMBER in INTERPRET routine)
+\ 0,4463 us / word, 3,7 cycles / word
+
+\ FIND_TEST $ results @ 8MHz, 16 threads, 201 words in vocabulary FORTH :
+\ 2,8 second with only FORTH vocabulary in CONTEXT
+\ 56 us for one search ( which gives the delay for QNUMBER in INTERPRET routine)
+\ 0,278 us / word, 2,22 cycles / word
+
+
+\ --------
+\ KEY test
+\ --------
+: KEY_TEST
+ ECHO
+ ." type a key : "
+ KEY EMIT \ wait for a KEY, then emit it
+;
+\ KEY_TEST
--- /dev/null
+\ ------------------
+\ BOOT.f
+\ ------------------
+
+\ must be preprocessed with yourtarget.pat file
+
+\ REGISTERS USAGE
+\ R4 to R7 must be saved before use and restored after
+\ scratch registers Y to S are free for use
+\ under interrupt, IP is free for use
+
+\ PUSHM order : PSP,TOS, IP, S, T, W, X, Y, R7, R6, R5, R4
+\ example : PUSHM IP,Y
+\
+\ POPM order : R4, R5, R6, R7, Y, X, W, T, S, IP,TOS,PSP
+\ example : POPM Y,IP
+
+\ ASSEMBLER conditionnal usage after IF UNTIL WHILE : S< S>= U< U>= 0= 0<> 0>=
+\ ASSEMBLER conditionnal usage before GOTO ?GOTO : S< S>= U< U>= 0= 0<> <0
+
+\ FORTH conditionnal usage before IF UNTIL WHILE : 0= 0< = < > U<
+
+\ NOECHO ; if an error occurs, comment this line before new download to find it.
+
+
+\ This source is loaded when FastForth detects a SD_Card memory
+
+\ =======================================================
+\ then, start what you want FastForth to do
+\ =======================================================
+
+\ ECHO ; if an error occurs during download, uncomment this line then download again
+
+\ PWR_HERE ; uncomment if you really want to preserve all previous and volatile applications
+
+
+
+: BOOT
+ ECHO CR
+ ." 1 set RTC" CR
+ ." 2 add SD_TOOLS" CR
+ ." 3 Test ANS94" CR
+ ." your choice : "
+
+ KEY
+ $30 -
+ DUP 1 =
+ IF .
+ LOAD" RTC.4TH" \ perform (reset to) PWR_STATE ==> remove BOOT
+ ELSE DUP 2 =
+ IF .
+ LOAD" SD_TOOLS.4th" \ performs PWR_HERE
+ ELSE DUP 3 =
+ IF .
+ LOAD" CORETEST.4TH"
+ ELSE
+ DROP 0 .
+ THEN
+ THEN
+ THEN
+ CR
+;
+
+BOOT
--- /dev/null
+\ UTILITY.f
+\ must be preprocessed with yourtarget.pat file because PSTACK,CONTEXT,INI_THREAD
+
+\ REGISTERS USAGE
+\ R4 to R7 must be saved before use and restored after
+\ scratch registers Y to S are free for use
+\ under interrupt, IP is free for use
+
+\ PUSHM order : PSP,TOS, IP, S, T, W, X, Y, R7, R6, R5, R4
+\ example : PUSHM IP,Y
+\
+\ POPM order : R4, R5, R6, R7, Y, X, W, T, S, IP,TOS,PSP
+\ example : POPM Y,IP
+
+\ ASSEMBLER conditionnal usage after IF UNTIL WHILE : S< S>= U< U>= 0= 0<> 0>=
+\ ASSEMBLER conditionnal usage before GOTO ?GOTO : S< S>= U< U>= 0= 0<> <0
+
+\ FORTH conditionnal usage after IF UNTIL WHILE : 0= 0< = < > U<
+
+
+[UNDEFINED] {UTILITY} [IF]
+ \
+
+MARKER {UTILITY}
+ \
+
+[UNDEFINED] ? [IF] \
+\ https://forth-standard.org/standard/tools/q
+CODE ? \ adr -- display the content of adr
+ MOV @TOS,TOS
+ MOV #U.,PC \ goto U.
+ENDCODE
+[THEN]
+ \
+
+[UNDEFINED] .S [IF] \
+\ https://forth-standard.org/standard/tools/DotS
+CODE .S \ -- display <depth> of Param Stack and stack contents if not empty
+ MOV TOS,-2(PSP) \ -- TOS ( tos x x )
+ MOV PSP,TOS
+ SUB #2,TOS \ to take count that TOS is first cell
+ MOV TOS,-6(PSP) \ -- TOS ( tos x PSP )
+ MOV #PSTACK,TOS \ -- P0 ( tos x PSP )
+ SUB #2,TOS \ to take count that TOS is first cell
+BW1 MOV TOS,-4(PSP) \ -- S0 ( tos S0 SP )
+ SUB #6,PSP \ -- S0 SP S0
+ SUB @PSP,TOS \ -- S0 SP S0-SP
+ RRA TOS \ -- S0 SP #cells
+COLON
+ $3C EMIT \ char '<'
+ . \ display #cells
+ $08 EMIT \ backspace
+ $3E EMIT SPACE \ char '>' SPACE
+ OVER OVER > \
+ 0= IF
+ DROP DROP EXIT
+ THEN
+ DO
+ I @ U.
+ 2 +LOOP
+;
+[THEN]
+ \
+
+[UNDEFINED] .RS [IF] \
+CODE .RS \ -- display <depth> of Return Stack and stack contents if not empty
+ MOV TOS,-2(PSP) \ -- TOS ( tos x x )
+ MOV RSP,-6(PSP) \ -- TOS ( tos x RSP )
+ MOV #RSTACK,TOS \ -- R0 ( tos x RSP )
+ GOTO BW1
+ENDCODE
+[THEN]
+ \
+
+\ : WORDS \ -- list all words in all dicts in CONTEXT.
+\
+\ \ \ vvvvvvvv may be skipped vvvvvvvv
+\ \ BASE @ \ -- BASE
+\ \ #10 BASE !
+\ \ CR ." "
+\ \ INI_THREAD @ DUP
+\ \ 1 = IF DROP ." monothread"
+\ \ ELSE . ." threads"
+\ \ THEN ." vocabularies"
+\ \ BASE ! \ --
+\ \ \ ^^^^^^^^ may be skipped ^^^^^^^^
+\
+\ CONTEXT \ -- CONTEXT
+\ BEGIN \ search dictionnary
+\ DUP
+\ 2 + SWAP \ -- CONTEXT+2 CONTEXT
+\ @ ?DUP \ -- CONTEXT+2 (VOC_BODY VOC_BODY or 0)
+\ WHILE \ -- CONTEXT+2 VOC_BODY dictionnary found
+\ CR ." " \
+\ \ MOVE all threads of VOC_BODY in PAD
+\ DUP PAD INI_THREAD @ DUP + \ -- CONTEXT+2 VOC_BODY VOC_BODY PAD THREAD*2
+\ MOVE \ char MOVE
+\
+\ BEGIN \ -- CONTEXT+2 VOC_BODY
+\ 0 DUP \ -- CONTEXT+2 VOC_BODY ptr MAX
+\ \ select the MAX of NFA in threads
+\ INI_THREAD @ DUP + 0 DO \ ptr = threads*2
+\ DUP I PAD + @ \ -- CONTEXT+2 VOC_BODY ptr MAX MAX NFAx
+\ U< IF
+\ DROP DROP I DUP PAD + @ \ -- CONTEXT+2 VOC_BODY ptr MAX if MAX U< NFAx replace adr and MAX
+\ THEN \
+\ 2 +LOOP \ -- CONTEXT+2 VOC_BODY ptr MAX
+\ ?DUP \ -- CONTEXT+2 VOC_BODY ptr MAX max NFA = 0 ? end of vocabulary ?
+\ WHILE \ -- CONTEXT+2 VOC_BODY ptr MAX
+\ \ replace it by its LFA
+\ DUP \ -- CONTEXT+2 VOC_BODY ptr MAX MAX
+\ 2 - @ \ -- CONTEXT+2 VOC_BODY ptr MAX [LFA]
+\ ROT \ -- CONTEXT+2 VOC_BODY MAX [LFA] ptr
+\ PAD + \ -- CONTEXT+2 VOC_BODY MAX [LFA] thread
+\ ! \ -- CONTEXT+2 VOC_BODY MAX
+\ \ type it in 16 chars format
+\ DUP \ -- CONTEXT+2 VOC_BODY MAX MAX
+\ COUNT $7F AND TYPE \ -- CONTEXT+2 VOC_BODY MAX
+\ C@ $0F AND \ --
+\ $10 SWAP - SPACES \ -- CONTEXT+2 VOC_BODY
+\ \ search next MAX of NFA
+\ REPEAT
+\ \ -- CONTEXT+2 VOC_BODY 0
+\ DROP DROP \ -- CONTEXT+2
+\ CR
+\ \ repeat for each CONTEXT vocabulary
+\
+\ REPEAT \ -- 0
+\ DROP \ --
+\ ;
+ \
+
+
+[UNDEFINED] WORDS [IF] \
+\ https://forth-standard.org/standard/tools/WORDS
+: WORDS \ -- list all words in first vocabulary in CONTEXT.
+
+\ \ vvvvvvvv may be skipped vvvvvvvv
+\ BASE @ \ -- BASE
+\ #10 BASE !
+\ CR ." "
+\ INI_THREAD @ DUP
+\ 1 = IF DROP ." monothread"
+\ ELSE . ." threads"
+\ THEN ." vocabularies"
+\ BASE ! \ --
+\ \ ^^^^^^^^ may be skipped ^^^^^^^^
+
+CR ." " \
+CONTEXT @ \ -- VOC_BODY
+\ MOVE all threads of VOC_BODY in PAD
+ PAD INI_THREAD @ DUP + \ -- VOC_BODY PAD THREAD*2
+ MOVE \
+ BEGIN \ --
+ 0 DUP \ -- ptr MAX
+\ select the MAX of NFA in threads
+ INI_THREAD @ DUP + 0 DO \ ptr = threads*2
+ DUP I PAD + @ \ -- ptr MAX MAX NFAx
+ U< IF
+ DROP DROP I DUP PAD + @ \ -- ptr MAX if MAX U< NFAx replace adr and MAX
+ THEN \
+ 2 +LOOP \ -- ptr MAX
+ ?DUP \ -- ptr MAX MAX ( or -- ptr 0) max NFA = 0 ? end of vocabulary ?
+ WHILE \ -- ptr MAX
+\ replace it by its LFA
+ DUP \ -- ptr MAX MAX
+ 2 - @ \ -- ptr MAX [LFA]
+ ROT \ -- MAX [LFA] ptr
+ PAD + \ -- MAX [LFA] thread
+ ! \ -- MAX
+\ type it in 16 chars format
+ DUP \ -- MAX MAX
+ COUNT $7F AND \ -- MAX addr count
+ TYPE \ -- MAX
+ C@ $0F AND \ --
+ $10 SWAP - SPACES \ --
+\ search next MAX of NFA
+ REPEAT \ -- ptr
+ DROP \ --
+;
+[THEN]
+ \
+
+[UNDEFINED] MAX [IF] \ MAX and MIN are defined in {ANS_COMP}
+ CODE MAX \ n1 n2 -- n3 signed maximum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO FW1 \ n2<n1
+ BW1 ADD #2,PSP
+ MOV @IP+,PC
+ ENDCODE
+ \
+
+ CODE MIN \ n1 n2 -- n3 signed minimum
+ CMP @PSP,TOS \ n2-n1
+ S< ?GOTO BW1 \ n2<n1
+ FW1 MOV @PSP+,TOS
+ MOV @IP+,PC
+ ENDCODE
+[THEN]
+ \
+
+
+[UNDEFINED] U.R [IF] \ MAX and MIN are defined in {ANS_COMP}
+: U.R \ u n -- display u unsigned in n width (n >= 2)
+>R <# 0 # #S #>
+R> OVER - 0 MAX SPACES TYPE
+;
+[THEN]
+ \
+
+[UNDEFINED] DUMP [IF] \
+\ https://forth-standard.org/standard/tools/DUMP
+: DUMP \ adr n -- dump memory
+ BASE @ >R $10 BASE !
+ SWAP $FFF0 AND SWAP
+ OVER + SWAP
+ DO CR \ generate line
+ I 7 U.R SPACE \ generate address
+ I $10 + I \ display 16 bytes
+ DO I C@ 3 U.R LOOP
+ SPACE SPACE
+ I $10 + I \ display 16 chars
+ DO I C@ $7E MIN BL MAX EMIT LOOP
+ $10 +LOOP
+ R> BASE !
+;
+[THEN]
+ \
+
+[THEN]
+ECHO
+ ; added : ? .S .RS WORDS U.R MAX MIN DUMP
+ ; v--- use backspaces before hit "CR" to decrease application protection level
+PWR_HERE RST_HERE
\ No newline at end of file
--- /dev/null
+\ name : MSP430FR5xxx_I2CF_Soft_Master.asm
+
+WIPE
+\ NOECHO
+
+\ Copyright (C) <2015> <J.M. THOORENS>
+\
+\ This program is free software: you can redistribute it and/or modify
+\ it under the terms of the GNU General Public License as published by
+\ the Free Software Foundation, either version 3 of the License, or
+\ (at your option) any later version.
+\
+\ This program is distributed in the hope that it will be useful,
+\ but WITHOUT ANY WARRANTY\ without even the implied warranty of
+\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+\ GNU General Public License for more details.
+\
+\ You should have received a copy of the GNU General Public License
+\ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+\ version 2.0 2015-07-30
+\
+\
+\ -------------------------------------------------------------------------------------------------------------------\
+\ I2CF Soft MASTER, FAST MODE, 8MHz
+\ -------------------------------------------------------------------------------------------------------------------\
+
+\ ======================================================================================================
+\ ======================================================================================================
+
+\ ### ##### ##### ###### ##### # #
+\ # # # # # # # # #### ###### ##### ## ## ## #### ##### ###### #####
+\ # # # # # # # # # # # # # # # # # # # #
+\ # ##### # ##### ##### # # ##### # # # # # # #### # ##### # #
+\ # # # # # # # # # # # ###### # # # #####
+\ # # # # # # # # # # # # # # # # # # # # #
+\ ### ####### ##### # ##### #### # # # # # # #### # ###### # #
+
+\ ======================================================================================================
+\ ======================================================================================================
+
+\ use Px.0 to Px.3 pins as SCL and SDA pins to use immediate instruction in one byte (#1,#2,#4,#8)
+
+\ tested with P1.6 SDA, P1.7 SCL :
+\ Start + Adr + Write 3 bytes + Stop + Start + adr + read 2 bytes + stop = 300us ==> 210 kHz
+\ See MSP430FR5xxx_I2CF_Soft_Master.png
+
+VARIABLE I2CS_ADR \ low(I2CS_ADR) = slave I2C address with RW flag, high(I2CS_ADR) = RX buffer,data0
+2 ALLOT \ data1,data2
+VARIABLE I2CM_BUF \ low(I2CM_BUF) = RX or TX lentgh, high(I2CM_BUF) = TX buffer,data0
+2 ALLOT \ data1,data2
+ \
+
+\ ----------------------------------\
+AMS I2C_MTX \ MASTER TX \ shared code for address and TX data
+\ ----------------------------------\
+BEGIN \
+ ADD.B X,X \ 1 l shift one left
+ U>= IF \ 2 l carry set ?
+ BIC.B #MSDA,&I2CSM_DIR \ 4 l yes : SDA as input ==> SDA high because pull up resistor
+ ELSE \ 2 l
+ BIS.B #MSDA,&I2CSM_DIR \ 4 l no : SDA as output ==> SDA low
+ THEN \ l _
+ BIC.B #MSCL,&I2CSM_DIR \ 4 l _^ release SCL (high)
+ BEGIN \ 14/16~l
+ BIT.B #MSCL,&I2CSM_IN \ 3 h test if SCL is released
+ 0<> UNTIL \ 2 h _
+ BIS.B #MSCL,&I2CSM_DIR \ 4 h v_ SCL as output : force SCL low
+ SUB #1,W \ 1 l count of bits
+0= UNTIL \ 2 l
+BIC.B #MSDA,&I2CSM_DIR \ 5 l _ SDA as input : release SDA high to prepare read Ack/Nack
+MOV @RSP+,PC
+ENDASM \
+ \
+
+
+\ ==================================\
+ASM I2C_M \
+\ ==================================\
+\ \ in I2CS_ADR/I2CM_BUF as RX/TX buffer requested by I2CS_ADR(0(0))
+\ \ I2CS_ADR(0) = I2C_Slave_addr&R/w
+\ \ I2CM_BUF(0) = TX/RX count of datas
+\ \ I2CM_BUF(0) = 0 ==> send only I2C address
+\ \ used S BUF ptr
+\ \ T datas countdown
+\ \ W bits countdown
+\ \ X data
+\ \ out I2CSLA_ADR & (R/W) unCHNGd
+\ \ S = BUF PTR pointing on first data not exCHNGd
+\ \ T = count+1 of TX/RX datas exCHNGd
+\ \ I2CS_ADR(0) = unCHNGd
+\ \ I2CM_BUF(0) = count of data not exCHNGd (normally = 0)
+\ \ I2CM_BUF(0) = -1 <==> Nack on address
+\ ----------------------------------\
+\ I2C_Master_Start_Cond: \ here, SDA and SCL are in idle state
+\ ----------------------------------\
+BIS.B #MSDA,&I2CSM_DIR \ 4 l force SDA as output (low)
+MOV #I2CM_BUF,W \ 2 h W=buffer out
+MOV.B @W+,T \ 2 h T=datas countdown
+MOV #I2CS_ADR,S \ 2 h S=buffer in
+MOV.B @S+,X \ 2 h X=Slave address to TX
+BIT.B #1,X \ 1 h test I2C R/w flag
+0= IF \ 2 h if write
+ MOV W,S \ 2 h S= buffer out ptr
+THEN \ S= buffer ptr
+BIS.B #MSCL,&I2CSM_DIR \ 4 h force SCL as output (low)
+\ ----------------------------------\
+\ I2C_Master_Start_EndOf: \
+\ ----------------------------------\
+\ I2C_Master_Send_address \ may be SCL is held low by slave
+\ ----------------------------------\
+ADD #1,T \ 1 l to add address in count
+MOV #8,W \ 1 l prepare 8 bit Master writing
+CALL #I2C_MTX \ 21 l to send address
+\ ----------------------------------\
+\ I2C_Master_Loop_Data \
+\ ----------------------------------\
+BEGIN \ 4 l here ack/nack is received/transmitted
+\ --------------------------------\ l
+\ Master TX/RX ACK/NACK \
+\ --------------------------------\ l _
+ BIC.B #MSCL,&I2CSM_DIR \ 3 l _^ release SCL (high)
+ BEGIN \
+ BIT.B #MSCL,&I2CSM_IN \ 3 h test if SCL is released
+ 0<> UNTIL \ 2 h
+ BIT.B #MSDA,&I2CSM_IN \ 3 h _ get SDA
+ BIS.B #MSCL,&I2CSM_DIR \ 3 h v_ SCL as output : force SCL low
+\ --------------------------------\ l
+\ I2C_Master_Loop_Data \
+\ --------------------------------\
+ 0<> IF BIS #Z,SR \ 5 l if Nack (TX), force Z=1 ==> StopCond
+ ELSE SUB.B #1,T \ 3 l else dec count
+ THEN \ l
+\ --------------------------------\
+\ I2C_Master_CheckCountDown \ count=0 (TX) or Nack received
+\ --------------------------------\
+ 0= IF \ 2 l send stop
+\ ----------------------------\
+\ Send Stop \
+\ ----------------------------\ _
+ BIS.B #MSDA,&I2CSM_DIR \ 4 l v_ SDA as output ==> SDA low
+ SUB.B T,&I2CM_BUF \ 4 l _ refresh buffer length and reach tSU:STO
+ BIC.B #MSCL,&I2CSM_DIR \ 4 l _^ release SCL (high)
+ BEGIN \
+ BIT.B #MSCL,&I2CSM_IN \ 3 h SCL released ?
+ 0<> UNTIL \ 2 h
+ BIC.B #MSDA,&I2CSM_DIR \ 4 h _^ SDA as input ==> SDA high with pull up resistor
+ MOV @RSP+,PC \ RET ====>
+ THEN \
+ MOV.B #8,W \ 1 l prepare 8 bits transaction
+ BIT.B #1,&I2CS_ADR \ 3 l I2C_Master Read/write bit test
+ 0= IF \ 2 l write flag test
+\ ============================\
+\ I2C_Master_TX \
+\ ============================\
+ MOV.B @S+,X \ 2 l next byte to transmit
+ CALL #I2C_MTX \ l to send data
+ ELSE \ l
+\ ============================\
+\ I2C_Master_RX: \ here, SDA is indetermined, SCL is strech low by master
+\ ============================\
+ BIC.B #MSDA,&I2CSM_DIR \ 5 l After ACK we must release SDA
+ BEGIN \
+\ ------------------------\ _
+\ send bit \ SCL _| |_
+\ ------------------------\ _
+ BIC.B #MSCL,&I2CSM_DIR \ 4 l _^ release SCL (high)
+ BEGIN \ 14/16~l
+ BIT.B #MSCL,&I2CSM_IN \ 3 h test if SCL is released
+ 0<> UNTIL \ 2 h
+ BIT.B #MSDA,&I2CSM_IN \ 4 h _ get SDA
+ BIS.B #MSCL,&I2CSM_DIR \ 4 h v_ SCL as output : force SCL low 13~
+ ADDC.B X,X \ 1 l C <-- X <--- C
+ SUB #1,W \ 1 l count of bits
+ 0= UNTIL \ 2 l
+ MOV.B X,0(S) \ 3 l store byte in buffer
+ ADD #1,S \ 1 l
+\ ----------------------------\
+\ Compute Ack Or Nack \ here, SDA is released by slave, SCL is strech low by master
+\ ----------------------------\
+ CMP.B #1,T \
+ 0<> IF \ 2 l
+ BIS.B #MSDA,&I2CSM_DIR \ 5 l yes : send Ack
+ THEN \
+ THEN \
+AGAIN \ 2 l
+ENDASM \
+ \
+
+
+
+\ ==================================\
+\ reduced version for TX only
+\ ==================================\
+VARIABLE I2CS_ADR \ low(I2CS_ADR) = slave I2C address with RW flag
+VARIABLE I2CM_BUF \ low(I2CM_BUF) = RX or TX lentgh, high(I2CM_BUF) = TX buffer,data0
+2 ALLOT \ data1,data2
+ \
+\ ==================================\
+ASM I2C_M_TX \
+\ ==================================\
+\ \ in I2CS_ADR/I2CM_BUF as RX/TX buffer requested by I2CS_ADR(0(0))
+\ \ I2CS_ADR(0) = I2C_Slave_addr&R/w
+\ \ I2CM_BUF(0) = TX/RX count of datas
+\ \ I2CM_BUF(0) = 0 ==> send only I2C address
+\ \ used S BUF ptr
+\ \ T datas countdown
+\ \ W bits countdown
+\ \ X data
+\ \ out I2CSLA_ADR & (R/W) unCHNGd
+\ \ S = BUF PTR pointing on first data not exCHNGd
+\ \ T = count+1 of TX/RX datas exCHNGd
+\ \ I2CS_ADR(0) = unCHNGd
+\ \ I2CM_BUF(0) = count of data not exCHNGd (normally = 0)
+\ \ I2CM_BUF(0) = -1 <==> Nack on address
+\ ----------------------------------\
+\ I2C_Master_Start_Cond: \ here, SDA and SCL are in idle state
+\ ----------------------------------\
+BIS.B #MSDA,&PI2CMDIR \ 4 l force SDA as output (low)
+MOV #I2CM_BUF,W \ 2 h W=buffer out
+MOV.B @W+,T \ 2 h T=datas countdown
+MOV.B &I2CS_ADR,X \ 3 h X=Slave address to TX
+BIS.B #MSCL,&PI2CMDIR \ 4 h force SCL as output (low)
+\ ----------------------------------\
+\ I2C_Master_Start_EndOf: \
+\ ----------------------------------\
+\ I2C_Master_Send_address \ may be SCL is held low by slave
+\ ----------------------------------\
+ADD #1,T \ 1 l to add address in count
+\ ----------------------------------\
+\ I2C_Master_Loop_Data \
+\ ----------------------------------\
+BEGIN \ 2 l
+\ --------------------------------\
+\ I2C_MTX \
+\ --------------------------------\
+ MOV #8,W \ 1 l prepare 8 bit Master writing
+ BEGIN \
+ ADD.B X,X \ 1 l shift one left
+ U>= IF \ 2 l carry set ?
+ BIC.B #MSDA,&PI2CMDIR \ 4 l yes : SDA as input ==> SDA high because pull up resistor
+ ELSE \ 2 l
+ BIS.B #MSDA,&PI2CMDIR \ 4 l no : SDA as output ==> SDA low
+ THEN \ l
+ BIC.B #MSCL,&PI2CMDIR \ 4 l _^ release SCL (high)
+ BEGIN \ 14/16~l
+ BIT.B #MSCL,&PI2CMIN \ 3 h test if SCL is released
+ 0<> UNTIL \ 2 h _
+ BIS.B #MSCL,&PI2CMDIR \ 4 h v_ SCL as output : force SCL low
+ SUB #1,W \ 1 l count of bits
+ 0= UNTIL \ 2 l
+ BIC.B #MSDA,&PI2CMDIR \ 5 l _ SDA as input : release SDA high to prepare read Ack/Nack
+\ --------------------------------\ l
+\ Master TX/RX ACK/NACK \
+\ --------------------------------\ l _
+ BIC.B #MSCL,&PI2CMDIR \ 3 l _^ P1DIR.3 release SCL (high)
+ BEGIN \
+ BIT.B #MSCL,&PI2CMIN \ 3 h test if SCL is released
+ 0<> UNTIL \ 2 h
+ BIT.B #MSDA,&PI2CMIN \ 3 h _ get SDA
+ BIS.B #MSCL,&PI2CMDIR \ 3 h v_ SCL as output : force SCL low
+\ --------------------------------\ l
+ 0<> IF BIS #Z,SR \ 5 l if Nack (TX), force Z=1 ==> StopCond
+ ELSE SUB.B #1,T \ 3 l else dec count
+ THEN \ l
+\ --------------------------------\
+\ I2C_Master_CheckCountDown \ count=0 (TX) or Nack received
+\ --------------------------------\
+ 0= IF \ 2 l send stop
+\ ----------------------------\
+\ Send Stop \
+\ ----------------------------\ _
+ BIS.B #MSDA,&PI2CMDIR \ 4 l v_ SDA as output ==> SDA low
+ SUB.B T,&I2CM_BUF \ 4 l _ refresh buffer length and reach tSU:STO
+ BIC.B #MSCL,&PI2CMDIR \ 4 l _^ release SCL (high)
+ BEGIN \
+ BIT.B #MSCL,&PI2CMIN \ 3 h SCL released ?
+ 0<> UNTIL \ 2 h
+ BIC.B #MSDA,&PI2CMDIR \ 4 h _^ SDA as input ==> SDA high with pull up resistor
+ MOV @RSP+,PC \ RET ====>
+ THEN \
+ MOV.B @S+,X \ 2 l next byte to transmit
+AGAIN \ 2 l
+ENDASM \ 93 words
+ \
+
+
+
+\ ------------------------------\
+CODE START \
+\ ------------------------------\
+\ init PORTA (P2:P1) (complement) when reset occurs all I/O are set in input with resistors pullup
+BIC.B #M_BUS,&I2CSM_OUT \ preset SDA + SCL output low
+BIC.B #M_BUS,&I2CSM_REN \ SDA + SCL pullup/down disable
+\ ------------------------------\
+LO2HI
+." \ type stop to stop :-)"
+LIT recurse is WARM \ insert this starting routine between COLD and WARM...
+(WARM) \ ...and continue with (WARM)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+RST_HERE \ set here the reset dictionnary
+
+\ ---------------------------------------------------------------------------------------------------------------------\
+\ SCL clock generation, timing, and test of data(s) number are made by I2C_Master.
+\ slave can strech SCL low after Start Condition and after any bit.
+\
+\ address Ack/Nack is generated by the slave on SDA line (released by the master)
+\ Two groups of eight addresses (000xxxy and 1111xxxy) are not allowed (reserved)
+\ after address or data is sent, the transmitter (Master or Slave) must release SDA line to allow (N)Ack by the receiver
+\ data Ack/Nack are generated by the receiver (master or slave) on SDA line
+\ a master receiver must signal the end of data to the slave transmitter by sending a Nack bit
+\ Stop or restart conditions must be generated by master after a Nack bit.
+\ after Ack bit is sent, Slave must release SDA line to allow master to do stop or restart conditions.
+\
+\
+\ first byte = address + R/W flag | byte data (one, for example)
+\ __ _____ _____ _..._ _____ __R__ _NAK_ _____ _____ _..._ _____ _____ _NAK_ _
+\ SDA \____/_MSB_X_____X_..._X_LSB_X__W__x_ACK_x_MSB_X_____X_..._X_____X_LSB_X_ACK_X___/
+\ _____ _ _ _ _ _ _ _ _ _ _ ___
+\ SCL \___/1\___/2\___...___/7\___/8\___/9\___/1\___/2\___...___/7\___/8\___/9\___/
+\ ^ ^ ^ ^ ^ ^ ^
+\ | |SSL |SSL |SSL |SSL |SSL |
+\ | |
+\ |Start Condition |stoP Condition
+\
+\ first byte = address + R/W flag | byte data (one, for example)
+\ __ _____ _____ _..._ _____ __R__ _NAK_ _____ _____ _..._ _____ _____ _NAK_ ___
+\ SDA \____/_MSB_X_____X_..._X_LSB_X__W__x_ACK_x_MSB_X_____X_..._X_____X_LSB_X_ACK_X \____...
+\ _____ _ _ _ _ _ _ _ _ _ _ ____
+\ SCL \___/1\___/2\___...___/7\___/8\___/9\___/1\___/2\___...___/7\___/8\___/9\___/ \_...
+\ ^ ^ ^ ^ ^ ^ ^
+\ | |SSL |SSL |SSL |SSL |SSL |
+\ | |
+\ |Start Condition |reStart Condition
+\
+\ SSL : Slave can strech SCL low
+\ tHIGH : SCL high time
+\ tLOW : SCL low time
+\ tBUF : SDA high time between Stop and Start conditions
+\ tHD:STA : Start_Condition SCL high time after SDA is low
+\ tSU:STO : Stop_Condition SCL high time before SDA rise
+\ tSU:STA : Start_Condition SCL high time before SDA fall
+\ tHD:DAT : SDA data change time after SCL is low
+\ the SDA line must be strobe just after SCL is high
+\ the SDA data must be change just after SCL is low
+\ standard mode (up to 100 kHz) : tHIGH = tHD:STA = tSU:STO = 4µs
+\ tLOW = tSU:STA = tBUF = 4,7µs
+\ tHD:DAT <= 3,45 µs
+\ -------------------------------------------------------------------------------------------------------------------\
--- /dev/null
+\ name : msp430FR5xxx_I2CF_Soft_MultiMaster.asm
+
+\ Copyright (C) <2015> <J.M. THOORENS>
+\
+\ This program is free software: you can redistribute it and/or modify
+\ it under the terms of the GNU General Public License as published by
+\ the Free Software Foundation, either version 3 of the License, or
+\ (at your option) any later version.
+\
+\ This program is distributed in the hope that it will be useful,
+\ but WITHOUT ANY WARRANTY\ without even the implied warranty of
+\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+\ GNU General Public License for more details.
+\
+\ You should have received a copy of the GNU General Public License
+\ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+\ I2C MASTER Standard Mode software driver without interrupt, with detection collision
+\ Target: MSP430FR5xxx, tested @ 8,16,24 MHz and adjusted @ 16,24 MHz
+\ SDA = P1.2, SCL = P1.3, with 3k3 pullup resistors
+
+\ version 1.0 2015-03-24
+
+WIPE
+\ ==============================================================================================================
+\ ==============================================================================================================
+
+\ ### ##### ##### ###### ##### # # # #
+\ # # # # # # # # #### ###### ##### ## ## ## ## ## #### ##### ###### #####
+\ # # # # # # # # # # # # # # # # # # # # # # # #
+\ # ##### # ##### ##### # # ##### # # # # # # # # # #### # ##### # #
+\ # # # # # # # # # # # # # ###### # # # #####
+\ # # # # # # # # # # # # # # # # # # # # # # #
+\ ### ####### ##### # ##### #### # # # # # # # # #### # ###### # #
+
+\ ==============================================================================================================
+\ ==============================================================================================================
+
+\ use Px.0 to Px.3 for good timing at 8 MHz
+
+\ tested with P1.6 SDA, P1.7 SCL :
+\ Start + Adr + Write 3 bytes + Stop + Start + adr + read 2 bytes + stop = 310us ==> 200 kHz
+\ See MSP430FR5xxx_I2CF_Soft_MultiMaster.png
+
+VARIABLE I2CS_ADR \ low(I2CS_ADR) = slave I2C address with RW flag, high(I2CS_ADR) = RX buffer,data0
+2 ALLOT \ data1,data2
+VARIABLE I2CM_BUF \ low(I2CM_BUF) = RX or TX lentgh, high(I2CM_BUF) = TX buffer,data0
+2 ALLOT \ data1,data2
+ \
+
+\ ==================================\
+ASM I2C_MM \ soft I2C_MultiMaster driver
+\ ==================================\
+\ \ in : I2CS_ADR pointer
+\ \ : I2CM_BUF pointer
+\ \ used: S BUF_PTR
+\ \ T count of I2C datas exchanged
+\ \ W count of bits
+\ \ X data
+\ \ Y BUF_ORG
+\ \ SR(10) collision flag
+\ \ out : I2CS_ADR(0) unchanged
+\ \ I2CM_BUF(0) = count of data not exchanged (normally = 0)
+\ \ I2CM_BUF(0) = -1 <==> Nack on address
+\ ----------------------------------\
+\ I2CMM_Stop_UCBxI2CSlave \ if SDA SCL of I2C_MultiMaster are hard wired onto SDA SCL of I2C_Slave under interrupt...
+\ ----------------------------------\
+\ BIS #1,&UCB0CTLW0 \ set eUSCI_B0 in reset state, reset StartCond int in UCB0IFG
+\ BIC.B #SMM_BUS,&PI2CMSEL1 \ disable I2C I/O
+\ ----------------------------------\
+\ I2C_MR_DC_listenBeforeStart: \ test if SCL & SDA lines are idle (high)
+\ ----------------------------------\
+BEGIN \
+ BIC.B #SMM_BUS,&I2CSMM_DIR \ SDA & SCL pins as input
+ BIC.B #SMM_BUS,&I2CSMM_OUT \ preset output LOW for SDA & SCL pins
+ MOV #2,T \ I2C_MR_DC_Wait_Start_Loop = 3 µs @ 8 MHz
+ BEGIN \ 15~loop
+ BEGIN \
+ BEGIN \
+ BIT.B #SMMSCL,&I2CSMM_IN \ 4 SCL high ?
+ 0<> UNTIL \ 2
+ BIT.B #SMMSDA,&I2CSMM_IN \ 4 SDA high ?
+ 0<> UNTIL \ 2
+ SUB #1,T \ 1
+ 0= UNTIL \ 2 here the I2C bus is idle
+\ --------------------------------\
+\ I2C_Master_Start_Cond: \ here, SDA and SCL are in idle state
+\ --------------------------------\
+ BIS.B #SMMSDA,&I2CSMM_DIR \ 4 h force SDA output (low)
+ MOV #I2CS_ADR,S \ 2 l
+ MOV.B @S+,X \ 3 l X = slave address, S = RX buffer
+ MOV #I2CM_BUF,W \ 2 l
+ MOV.B @W+,T \ 2 l T = count of datas, W = TX buffer
+ ADD.B #1,T \ 1 l to add address in count
+ BIT.B #1,X \ 1 l test I2C R/w flag
+ 0= IF \ 2 l write flag ?
+ MOV W,S \ 3 l TX buffer
+ THEN \
+ BIS.B #SMMSCL,&I2CSMM_DIR \ 4 h force SCL output (low)
+\ --------------------------------\ l
+\ I2C_Master_Start_EndOf: \ l
+\ --------------------------------\
+\ I2C_Master_Send_address \ l SCL
+\ --------------------------------\
+ BIC #UF2,SR \ 2 reset detection collision SR(10) flag
+ MOV #8,W \ 1 l 8 bits TX
+ BEGIN \
+ ADD.B X,X \ 1 l shift one left
+ U>= IF \ 2 l carry set ?
+ BIC.B #SMMSDA,&I2CSMM_DIR \ 4 l yes : releas SDA high because pull up resistor
+ ELSE \ 2 l
+ BIS.B #SMMSDA,&I2CSMM_DIR \ 4 l no : set as output ==> SDA low
+ THEN \ l _
+ BIC.B #SMMSCL,&I2CSMM_DIR \ 4 l _^ release SCL (high)
+ BEGIN \
+ BIT.B #SMMSCL,&I2CSMM_IN \ 4 h test if SCL is released
+ 0<> UNTIL \ 2 h
+ MOV.B &I2CSMM_IN,Y \ 3 h _ get SDA in Y
+ BIS.B #SMMSCL,&I2CSMM_DIR \ 4 h v_ force SCL low
+\ ----------------------------\
+\ collision detection \ l
+\ ----------------------------\
+ XOR.B &I2CSMM_DIR,Y \ 3 normal : IN(SMMSDA) XOR DIR(SMMSDA) = 1
+ BIT.B #SMMSDA,Y \ 2 collision : IN(SMMSDA=0) XOR DIR(SMMSDA=0) = 0
+ 0= IF BIS #$0402,SR \ 6 set collision detection flag SR(10) and set Z=1 to force end of loop
+ ELSE SUB #1,W \ 3 dec count of bits
+ THEN \
+ 0= UNTIL \ 2
+ BIT #UF2,SR \ 2 collision ?
+0= UNTIL \ 2 loop back if collision during send address
+BIC.B #SMMSDA,&I2CSMM_DIR \ 5 release SDA high before 9th bit
+\ ----------------------------------\
+\ I2C_Master_Loop \
+\ ----------------------------------\
+BEGIN \ 4 l
+\ --------------------------------\ l
+\ Master TX/RX ACK/NACK \
+\ --------------------------------\ l _
+ BIC.B #SMMSCL,&I2CSMM_DIR \ 3 l _^ release SCL (high)
+ BEGIN \
+ BIT.B #SMMSCL,&I2CSMM_IN \ 3 h test if SCL is released
+ 0<> UNTIL \ 2 h
+ BIT.B #SMMSDA,&I2CSMM_IN \ 3 h _ get SDA
+ BIS.B #SMMSCL,&I2CSMM_DIR \ 3 h v_ force SCL low
+\ --------------------------------\ 4 l here ack/nack is received/transmitted
+\ I2C_Master_Loop_Data \
+\ --------------------------------\
+ 0<> IF BIS #Z,SR \ 5 if Nack (TX), force Z+1 ==> StopCond
+ ELSE SUB.B #1,T \ 3 else dec count
+ THEN \
+\ --------------------------------\
+\ I2C_Master_CheckCountDown \ count=0 or Nack received
+\ --------------------------------\
+ 0= IF \ count reached or Nack
+\ ----------------------------\
+\ I2C_Master_StopCond \
+\ ----------------------------\ _
+ BIS.B #SMMSDA,&I2CSMM_DIR \ 4 l v_ force SDA low
+ SUB.B T,&I2CM_BUF \ 4 l refresh buffer length and reach tSU:STO
+ BIC.B #SMMSCL,&I2CSMM_DIR \ 4 l _^ release SCL (high)
+ BEGIN \
+ BIT.B #SMMSCL,&I2CSMM_IN \ 3 h SCL released ?
+ 0<> UNTIL \ 2 h _
+ BIC.B #SMMSDA,&I2CSMM_DIR \ _| as input ==> SDA high with the hard wired pull up resistor
+\ ----------------------------\
+\ I2C_Master_Endof \
+\ ----------------------------\
+\ Restart I2C_Slave_Int \ if any
+\ ----------------------------\
+\ MOV #4,&UCB0IE \ enable StartCond interrupt in UCB0IE register
+\ BIC #1,&UCB0CTLW0 \ restart eUSCI_B
+\ BIS.B #SMM_BUS,&I2CSMM_SEL1 \ reenable I2C I/O
+\ ----------------------------\
+ MOV @RSP+,PC \ ====> out
+\ ----------------------------\
+ THEN \
+ MOV.B #8,W \ 1 l prepare 8 bits transaction
+ BIT #1,&I2CS_ADR \ 3 l I2C_Master Read/write bit test
+ 0= IF \ 2 l write flag test
+\ ----------------------------\
+\ I2C Master write \
+\ ----------------------------\
+ MOV.B @S+,X \ 2 l X = TX data
+ BEGIN \
+ ADD.B X,X \ 1 l shift one left
+ U>= IF \ 2 l carry set ?
+ BIC.B #SMMSDA,&I2CSMM_DIR \ 4 l yes : release SDA (high because pull up resistor)
+ ELSE \ 2 l
+ BIS.B #SMMSDA,&I2CSMM_DIR \ 4 l no : force SDA low
+ THEN \ l _
+ BIC.B #SMMSCL,&I2CSMM_DIR \ 4 l _^ release SCL (high)
+ BEGIN \
+ BIT.B #SMMSCL,&I2CSMM_IN \ 4 h test if SCL is released
+ 0<> UNTIL \ 2 h _
+ BIS.B #SMMSCL,&I2CSMM_DIR \ 4 h v_ force SCL low
+ SUB #1,W \ 1 l count of bits
+ 0= UNTIL \ 2 l
+ BIC.B #SMMSDA,&I2CSMM_DIR \ 4 l release SDA high
+ ELSE \ 2 l
+\ ============================\
+\ I2C_Master_RX: \ here, SDA is indetermined, SCL is strech low by master
+\ ============================\
+ BIC.B #SMMSDA,&I2CSMM_DIR \ 5 l _ After ACK we must release SDA
+ BEGIN \
+\ ------------------------\ _
+\ send bit \ SCL _| |_
+\ ------------------------\ _
+ BIC.B #SMMSCL,&I2CSMM_DIR \ 3 l _^ release SCL (high)
+ BEGIN \
+ BIT.B #SMMSCL,&I2CSMM_IN \ 3 h test if SCL is released
+ 0<> UNTIL \ 2 h
+ BIT.B #SMMSDA,&I2CSMM_IN \ 3 h _ get SDA
+ BIS.B #SMMSCL,&I2CSMM_DIR \ 3 h v_ force SCL low
+ ADDC.B X,X \ 1 l C <-- X <--- C
+ SUB #1,W \ 1 l count of bits
+ 0= UNTIL \ 2 l
+ MOV.B X,0(S) \ 3 l store byte @ BUF_PTR
+ ADD #1,S \ 1 l
+\ ----------------------------\
+\ I2C_MSendAckOrNack \ here, SDA is released by slave, SCL is strech low by master
+\ ----------------------------\
+ CMP.B #1,T \ bytes count = 1 ?
+ 0<> IF \ 2
+ BIS.B #SMMSDA,&I2CSMM_DIR \ 4 l prepare send Ack if byte count <> 1
+ THEN \
+ THEN \
+AGAIN \ 2 l
+ENDASM \
+ \
+
+\ ------------------------------\
+CODE START \
+\ ------------------------------\
+\ init PORTA (P2:P1) (complement) when reset occurs all I/O are set in input with resistors pullup
+BIC.B #SMM_BUS,&I2CSMM_OUT \ preset SDA + SCL output low
+BIC.B #SMM_BUS,&I2CSMM_REN \ SDA + SCL pullup/down disable
+\ ------------------------------\
+LO2HI
+." Type STOP to stop :-)"
+LIT RECURSE IS WARM \ insert this routine between COLD and WARM...
+(WARM) ; \ ...and continue with WARM
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+RST_HERE
+
+
+\ ---------------------------------------------------------------------------------------------------------------------\
+\ SCL clock generation, timing, and test of data(s) number are made by I2C_Master.
+\ slave can strech SCL low after Start Condition and after any bit.
+
+\ address Ack/Nack is generated by the slave on SDA line (released by the master)
+\ Two groups of eight addresses (000xxxy and 1111xxxy) are not allowed (reserved)
+\ after address or data is sent, the transmitter (Master or Slave) must release SDA line to allow (N)Ack by the receiver
+\ data Ack/Nack are generated by the receiver (master or slave) on SDA line
+\ a master receiver must signal the end of data to the slave transmitter by sending a Nack bit
+\ Stop or restart conditions must be generated by master after a Nack bit.
+\ after Ack bit is sent, Slave must release SDA line to allow master to do stop or restart conditions
+\
+\ __ _____ _____ _..._ _____ _____ _NACK _____ _____ _..._ _____ _____ _NACK _
+\ SDA \____/_MSB_X_____X_..._X_LSB_X_R/W_x_ACK_x_MSB_X_____X_..._X_____X_LSB_X_ACK_X___/
+\ _____ _ _ _ _ _ _ _ _ _ _ ___
+\ SCL \___/1\___/2\___...___/7\___/8\___/9\___/1\___/2\___...___/7\___/8\___/9\___/
+\ ^ ^ ^ ^ ^ ^ ^
+\ | |Slave Stretch Low |SSL |SSL |SSL |SSL |
+\ | |
+\ |Start Condition |stoP Condition
+\
+\ __ _____ _____ _..._ _____ _____ _NACK _____ _____ _..._ _____ _____ _NACK ___
+\ SDA \____/_MSB_X_____X_..._X_LSB_X_R/W_x_ACK_x_MSB_X_____X_..._X_____X_LSB_X_ACK_X \____...
+\ _____ _ _ _ _ _ _ _ _ _ _ ____
+\ SCL \___/1\___/2\___...___/7\___/8\___/9\___/1\___/2\___...___/7\___/8\___/9\___/ \_...
+\ ^ ^ ^ ^ ^ ^ ^
+\ | |Slave Stretch Low |SSL |SSL |SSL |SSL |
+\ | |
+\ |Start Condition |reStart Condition
+\
+\ tHIGH : SCL high time
+\ tLOW : SCL low time
+\ tBUF : SDA high time between Stop and Start conditions
+\ tHD:STA : Start_Condition SCL high time after SDA is low
+\ tSU:STO : Stop_Condition SCL high time before SDA rise
+\ tSU:STA : Start_Condition SCL high time before SDA fall
+\ tHD:DAT : SDA data change time after SCL is low
+\ the SDA line must be strobe just after SCL is high
+\ the SDA data must be change just after SCL is low
+\ standard mode (up to 100 kHz) : tHIGH = tHD:STA = tSU:STO = 4µs
+\ tLOW = tSU:STA = tBUF = 4,7µs
+\ tHD:DAT <= 3,45 µs
+\ -------------------------------------------------------------------------------------------------------------------\
--- /dev/null
+\ name : msp430FR5xxx_I2C_Master.asm
+\
+\ Copyright (C) <2016> <J.M. THOORENS>
+\
+\ This program is free software: you can redistribute it and/or modify
+\ it under the terms of the GNU General Public License as published by
+\ the Free Software Foundation, either version 3 of the License, or
+\ (at your option) any later version.
+\
+\ This program is distributed in the hope that it will be useful,
+\ but WITHOUT ANY WARRANTY; without even the implied warranty of
+\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+\ GNU General Public License for more details.
+\
+\ You should have received a copy of the GNU General Public License
+\ along with this program. If not, see <http://www.gnu.org/licenses/>.
+\
+\
+\ I2C MASTER Standard Mode software driver without interrupt
+\ Target: MSP-EXP430FR5969 @ 8,16MHz
+\ version 1.1 2016-03-18
+\
+\ ---------------------------------------------------------------------------------------------------------------------;
+\ SCL clock generation, timing, and test of data(s) number are made by I2C_Master.
+\ slave can strech SCL low after Start Condition and after any bit.
+\
+\ address Ack/Nack is generated by the slave on SDA line (released by the master)
+\ Two groups of eight addresses (000$xxy and 1111xxxy) are not allowed (reserved)
+\ after address or data is sent, the transmitter (Master or Slave) must release SDA line to allow (N)Ack by the receiver
+\ data Ack/Nack are generated by the receiver (master or slave) on SDA line
+\ a master receiver must signal the end of data to the slave transmitter by sending a Nack bit
+\ Stop or restart conditions must be generated by master after a Nack bit.
+\ after Ack bit is sent, Slave must release SDA line to allow master to do stop or restart conditions
+\
+\ __ _____ _____ _..._ _____ _____ _NACK _____ _____ _..._ _____ _____ _NACK _
+\ SDA \____/_MSB_X_____X_..._X_LSB_X_R/W_x_ACK_x_MSB_X_____X_..._X_____X_LSB_X_ACK_X___/
+\ _____ _ _ _ _ _ _ _ _ _ _ ___
+\ SCL \___/1\___/2\___...___/7\___/8\___/9\___/1\___/2\___...___/7\___/8\___/9\___/
+\ ^ ^ ^ ^ ^ ^ ^
+\ | |Slave Stretch Low |SSL |SSL |SSL |SSL |
+\ | |
+\ |Start Condition |stoP Condition
+\
+\ __ _____ _____ _..._ _____ _____ _NACK _____ _____ _..._ _____ _____ _NACK ___
+\ SDA \____/_MSB_X_____X_..._X_LSB_X_R/W_x_ACK_x_MSB_X_____X_..._X_____X_LSB_X_ACK_X \____...
+\ _____ _ _ _ _ _ _ _ _ _ _ ____
+\ SCL \___/1\___/2\___...___/7\___/8\___/9\___/1\___/2\___...___/7\___/8\___/9\___/ \_...
+\ ^ ^ ^ ^ ^ ^ ^
+\ | |Slave Stretch Low |SSL |SSL |SSL |SSL |
+\ | |
+\ |Start Condition |reStart Condition
+\
+\ tHIGH : SCL high time
+\ tLOW : SCL low time
+\ tBUF : SDA high time between Stop and Start conditions
+\ tHD:STA : Start_Condition SCL high time after SDA is low
+\ tSU:STO : Stop_Condition SCL high time before SDA rise
+\ tSU:STA : Start_Condition SCL high time before SDA fall
+\ tHD:DAT : SDA data change time after SCL is low
+\ the SDA line must be strobe just after SCL is high
+\ the SDA data must be change just after SCL is low
+\ standard mode (up to 100 kHz) : tHIGH = tHD:STA = tSU:STO = 4µs
+\ tLOW = tSU:STA = tBUF = 4,7µs
+\ tHD:DAT <= 3,45 µs
+\
+\ fast mode (up to 400 kHz) : tHIGH = tHD:STA = tSU:STO = 0,6µs
+\ tLOW = tSU:STA = tBUF = 1,3µs
+\ tHD:DAT <= 0,9 µs
+\ -------------------------------------------------------------------------------------------------------------------;
+
+\ =================================================================
+\ =================================================================
+
+\ ### ##### ##### # #
+\ # # # # # ## ## ## #### ##### ###### #####
+\ # # # # # # # # # # # # # #
+\ # ##### # # # # # # #### # ##### # #
+\ # # # # # ###### # # # #####
+\ # # # # # # # # # # # # # #
+\ ### ####### ##### # # # # #### # ###### # #
+
+\ =================================================================
+\ =================================================================
+
+\ tested with P1.6 SDA, P1.7 SCL :
+\ Start + Adr + Write 3 bytes + Stop + Start + adr + read 2 bytes + stop = 204us ==> 308 kHz (STOP=10us)
+\ See MSP430FR5xxx_I2C_Master.png
+
+
+
+VARIABLE I2CS_ADR \ low(I2CS_ADR) = slave I2C address with RW flag, high(I2CS_ADR) = RX buffer,data0
+2 ALLOT \ data1,data2
+VARIABLE I2CM_BUF \ low(I2CM_BUF) = RX or TX lentgh, high(I2CM_BUF) = TX buffer,data0
+2 ALLOT \ data1,data2
+ \
+
+
+
+\ ----------------------------------\
+ASM I2C_M \
+\ ----------------------------------\
+\ \ in I2CS_ADR/I2CM_BUF as RX/TX buffer requested by I2CS_ADR(0(0))
+\ \ I2CS_ADR(0) = I2C_Slave_addr&R/w
+\ \ I2CM_BUF(0) = TX/RX count of datas
+\ \ I2CM_BUF(0) = 0 ==> send only I2C address
+\ \ used S = BUF ptr
+\ \ T
+\ \ out I2CSLA_ADR & (R/W) unCHNGd
+\ \ S = BUF PTR pointing on first data not exCHNGd
+\ \ T = count of TX/RX datas exCHNGd
+\ \ T = -1 ==> NACK on address
+\ \ I2CS_ADR(0) = unCHNGd
+\ \ I2CM_BUF(0) = unCHNGd
+BIS #1,&UCB0CTLW0 \ SWRST
+MOV #$0FD3,&UCB0CTLW0 \ master mode + UCTR + START + SWRST, IFG=IE=0
+MOV #$00C8,&UCB0CTLW1 \ set automatic stop (count byte reached)
+MOV #$14,&UCB0BRW \ baudrate = SMCLK/20 = 400 kHz @8MHz ; 340 kHz measured
+MOV #I2CM_BUF,S \ count & TX buf
+MOV.B @S+,&UCB0TBCNT \
+CMP.B #0,&UCB0TBCNT \
+0= IF \ count = 0
+ BIS #4,&UCB0CTLW0 \ add Stop cmd to Start cmd ==> Master send only I2C address
+THEN
+MOV #I2CS_ADR,T \ I2Cadr & RX buf
+MOV.B @T+,&UCB0I2CSA \ UCB0I2CSA = slave_address & R/w bit
+RRA &UCB0I2CSA \ UCB0I2CSA = slave_address, C flag = R/w flag
+U>= IF \ C flag = 1
+ MOV T,S \ Master read : S = RX buffer
+ BIC #$10,&UCB0CTLW0 \ UCB0CTLW0 <-- UCTR=0
+THEN \
+\ ------------------------------ \
+\ Start \
+\ ------------------------------ \
+MOV.B #-1,T \ T=-1
+BIC #1,&UCB0CTLW0 \ UCB0CTLW0 : clear SWRST, start I2C MASTER
+BIT.B #1,&I2CS_ADR \ R/W test
+0= IF \
+\ ---------------------------- \
+\ MASTER TX \
+\ ---------------------------- \
+ BEGIN \
+ MOV.B &UCBCNT0,T \ store count of byte
+ BIT #8,&UCB0IFG \ test UCSTPIFG
+ 0<> IF \
+ MOV @RSP+,PC \ end of I2C_M TX driver
+ THEN \
+ BIT #$20,&UCB0IFG \ test UCNACKIFG
+ 0<> IF \
+ BIS #4,&UCB0CTLW0 \ generate stop bit
+ MOV @RSP+,PC \ end of I2C_M TX driver
+ THEN \
+ BIT #2,&UCB0IFG \ test UCTXIFG0
+ 0<> IF \
+ MOV.B @S+,&UCB0TXBUF \ load data into UCB0TXBUF
+ THEN \
+ AGAIN \
+THEN \
+\ ------------------------------ \
+\ MASTER RX \
+\ ------------------------------ \
+BEGIN \ of Master RX
+ MOV.B &UCBCNT0,T \ store count of byte
+ BIT #8,&UCB0IFG \ test UCSTPIFG
+ 0<> IF \
+ MOV @RSP+,PC \ end of I2C_M RX driver
+ THEN \
+ BIT #1,&UCB0IFG \ test UCRXIFG0
+ 0<> IF \
+ MOV.B &UCB0RXBUF,0(S) \ load data from UCB0RXBUF
+ ADD #1,S \
+ THEN \
+AGAIN \
+ENDASM \ 62 words + 9 init words
+ \
+
+\ ------------------------------\
+CODE START \ init
+\ ------------------------------\
+\ init I2C_Master \
+\ ------------------------------\
+\ %0000 1111 1101 0011 $640 = $0FD3
+\ - UCMM = 1 : multi master mode
+\ - UCMST = 1 : I2C_Master
+\ -- UCMODE = %11 = I2C
+\ _ USYNC=1 (always 1)
+\ -- UCSSEL=SMCLK=8MHz
+\ - UCTXACK=0 not auto ACK slave address
+\ - UCTR=1/0 : TX/RX modes
+\ - UCTXSTP
+\ - UCTXSTT send start
+\ - UCSWRST=1
+\ ------------------------------\
+\ %0000 0000 1100 1000 $642 = $00C8
+\ - UCETXINT=0 : UCTXIFG0 set address match UCxI2COAx and TX mode
+\ -- UCCLTO=%11 : SCL low time out = 34 ms
+\ - UCSWACK=1 : UCTXACK must be written to continue
+\ -- UCASTP0=%10 : automatic Stop when UCBxTBCNT is reached
+\ ------------------------------\
+\ PORTX (PORTx:y) default values\ DIR0,REN1,OUT1 (input with pullup resistors)
+\ ------------------------------\
+\ notice : UCB0 I2C driver seems to control only DIR register !!!
+BIC.B #M_BUS,&I2CM_REN \ REN0 : no_resistor
+BIC.B #M_BUS,&I2CM_OUT \ OUT0 : preset output low
+BIS.B #M_BUS,&I2CM_SEL1 \ SEL11 : enable I2C I/O
+COLON
+." type stop to stop :-)"
+LIT RECURSE IS WARM \ insert this starting routine between COLD and WARM...
+(WARM) \ ...and continue with (WARM)
+;
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
--- /dev/null
+\ name : msp430FR5xxx_I2C_MMultiMaster.f
+\
+\ Copyright (C) <2016> <J.M. THOORENS>
+\
+\ This program is free software: you can redistribute it and/or modify
+\ it under the terms of the GNU General Public License as published by
+\ the Free Software Foundation, either version 3 of the License, or
+\ (at your option) any later version.
+\
+\ This program is distributed in the hope that it will be useful,
+\ but WITHOUT ANY WARRANTY; without even the implied warranty of
+\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+\ GNU General Public License for more details.
+\
+\ You should have received a copy of the GNU General Public License
+\ along with this program. If not, see <http://www.gnu.org/licenses/>.
+\
+\
+\ I2C MASTER Standard Mode software driver without interrupt
+\ Target: MSP-EXP430FR5969 @ 8,16MHz
+\ version 1.1 2016-03-18
+\
+\ ---------------------------------------------------------------------------------------------------------------------;
+\ SCL clock generation, timing, and test of data(s) number are made by I2C_MMaster.
+\ slave can strech SCL low after Start Condition and after any bit.
+\
+\ address Ack/Nack is generated by the slave on SDA line (released by the master)
+\ Two groups of eight addresses (000$xxy and 1111xxxy) are not allowed (reserved)
+\ after address or data is sent, the transmitter (Master or Slave) must release SDA line to allow (N)Ack by the receiver
+\ data Ack/Nack are generated by the receiver (master or slave) on SDA line
+\ a master receiver must signal the end of data to the slave transmitter by sending a Nack bit
+\ Stop or restart conditions must be generated by master after a Nack bit.
+\ after Ack bit is sent, Slave must release SDA line to allow master to do stop or restart conditions
+\
+\ __ _____ _____ _..._ _____ _____ _NACK _____ _____ _..._ _____ _____ _NACK _
+\ SDA \____/_MSB_X_____X_..._X_LSB_X_R/W_x_ACK_x_MSB_X_____X_..._X_____X_LSB_X_ACK_X___/
+\ _____ _ _ _ _ _ _ _ _ _ _ ___
+\ SCL \___/1\___/2\___...___/7\___/8\___/9\___/1\___/2\___...___/7\___/8\___/9\___/
+\ ^ ^ ^ ^ ^ ^ ^
+\ | |Slave Stretch Low |SSL |SSL |SSL |SSL |
+\ | |
+\ |Start Condition |stoP Condition
+\
+\ __ _____ _____ _..._ _____ _____ _NACK _____ _____ _..._ _____ _____ _NACK ___
+\ SDA \____/_MSB_X_____X_..._X_LSB_X_R/W_x_ACK_x_MSB_X_____X_..._X_____X_LSB_X_ACK_X \____...
+\ _____ _ _ _ _ _ _ _ _ _ _ ____
+\ SCL \___/1\___/2\___...___/7\___/8\___/9\___/1\___/2\___...___/7\___/8\___/9\___/ \_...
+\ ^ ^ ^ ^ ^ ^ ^
+\ | |Slave Stretch Low |SSL |SSL |SSL |SSL |
+\ | |
+\ |Start Condition |reStart Condition
+\
+\ tHIGH : SCL high time
+\ tLOW : SCL low time
+\ tBUF : SDA high time between Stop and Start conditions
+\ tHD:STA : Start_Condition SCL high time after SDA is low
+\ tSU:STO : Stop_Condition SCL high time before SDA rise
+\ tSU:STA : Start_Condition SCL high time before SDA fall
+\ tHD:DAT : SDA data change time after SCL is low
+\ the SDA line must be strobe just after SCL is high
+\ the SDA data must be change just after SCL is low
+\ standard mode (up to 100 kHz) : tHIGH = tHD:STA = tSU:STO = 4µs
+\ tLOW = tSU:STA = tBUF = 4,7µs
+\ tHD:DAT <= 3,45 µs
+\
+\ fast mode (up to 400 kHz) : tHIGH = tHD:STA = tSU:STO = 0,6µs
+\ tLOW = tSU:STA = tBUF = 1,3µs
+\ tHD:DAT <= 0,9 µs
+\ -------------------------------------------------------------------------------------------------------------------;
+
+\ =========================================================================
+\ =========================================================================
+
+\ ### ##### ##### # ## #
+\ # # # # # ## ## ## ## ## #### ##### ###### #####
+\ # # # # # # # # # # # # # # # # # #
+\ # ##### # # # # # # # # # #### # ##### # #
+\ # # # # # # # ###### # # # #####
+\ # # # # # # # # # # # # # # # #
+\ ### ####### ##### # # # # # # #### # ###### # #
+
+\ =========================================================================
+\ =========================================================================
+
+\ tested with P1.6 SDA, P1.7 SCL :
+\ Start + Adr + Write 3 bytes + Stop + Start + adr + read 2 bytes + stop = 206us ==> 305 kHz (STOP=14us)
+\ See MSP430FR5xxx_I2C_MultiMaster.png
+
+
+CREATE I2CMS_ADR \ low(I2CMS_ADR) = slave I2C address with RW flag, high(I2CMS_ADR) = RX buffer,data0
+4 ALLOT \ data1,data2
+CREATE I2CMM_BUF \ low(I2CMM_BUF) = RX or TX lentgh, high(I2CMM_BUF) = TX buffer,data0
+4 ALLOT \ data1,data2
+ \
+VARIABLE MY_OWN_ADR
+
+
+\ ----------------------------------\
+ASM I2C_MM \
+\ ----------------------------------\
+\ \ in I2CMS_ADR/I2CMM_BUF as RX/TX buffer requested by I2CMS_ADR(0(0))
+\ \ I2CMS_ADR(0) = I2C_Slave_addr&R/w
+\ \ I2CMM_BUF(0) = TX/RX count of datas
+\ \ I2CMM_BUF(0) = 0 ==> send only I2C address
+\ \ used S = BUF ptr
+\ \ T
+\ \ out S = BUF PTR pointing on first data not exCHNGd
+\ \ T = count of TX/RX datas exCHNGd
+\ \ T = -1 ==> NACK on address
+\ \ I2CMS_ADR(0) = -1 ==> arbitration lost, else unchanged
+\ \ I2CMM_BUF(0) = unchanged
+\ ------------------------------ \
+\ Swap Slave to Master mode \
+\ ------------------------------ \
+BIS #1,&UCB0CTLW0 \ SWRST
+MOV #$2FD3,&UCB0CTLW0 \ master mode + UCMM + UCTR + START + SWRST, IFG=IE=0
+MOV #$00C8,&UCB0CTLW1 \ set automatic stop (count byte reached)
+MOV #$14,&UCB0BRW \ baudrate = SMCLK/20 = 400 kHz @8MHz ; 340 kHz measured
+MOV &MY_OWN_ADR,&UCB0I2COA0 \ (required by multimaster mode)
+BIS #$0400,&UCB0I2COA0 \ UCOAEN=1 enable UCB0I2COA0 with address slave
+\ ------------------------------ \
+MOV #I2CMM_BUF,S \ count & TX buf
+MOV.B @S+,&UCB0TBCNT \
+CMP.B #0,&UCB0TBCNT \
+0= IF \ count = 0
+ BIS #4,&UCB0CTLW0 \ add Stop to Start cmd ==> Master send only I2C address
+THEN
+MOV #I2CMS_ADR,T \ I2Cadr & RX buf
+MOV.B @T+,&UCB0I2CSA \ UCB0I2CSA = slave_address & R/w bit
+RRA &UCB0I2CSA \ UCB0I2CSA = slave_address, C flag = R/w flag
+U>= IF \ C flag = 1
+ MOV T,S \ Master read : S = RX buffer
+ BIC #$10,&UCB0CTLW0 \ UCB0CTLW0 <-- UCTR=0
+THEN \
+\ ------------------------------ \
+\ Start \
+\ ------------------------------ \
+MOV.B #-1,T \ T=-1
+BIC #1,&UCB0CTLW0 \ UCB0CTLW0 : clear SWRST, start I2C MASTER
+BIT.B #1,&I2CMS_ADR \ R/W test
+0= IF \
+\ ---------------------------- \
+\ MASTER TX \
+\ ---------------------------- \
+ BEGIN \
+ MOV.B &UCBCNT0,T \ store count of byte
+ BIT #$10,&UCB0IFG \ test UCALIFG : arbitration lost interrupt
+ 0<> ?GOTO FW1 \ eUSCI is already in Slave mode
+ BIT #8,&UCB0IFG \ test UCSTPIFG
+ 0<> ?GOTO FW2 \
+ BIT #$20,&UCB0IFG \ test UCNACKIFG
+ 0<> IF \
+ BIS #4,&UCB0CTLW0 \ generate stop bit
+ THEN \
+ BIT #2,&UCB0IFG \ test UCTXIFG0
+ 0<> IF \
+ MOV.B @S+,&UCB0TXBUF \ load data into UCB0TXBUF
+ THEN \
+ AGAIN \
+THEN \
+\ ------------------------------ \
+\ MASTER RX \
+\ ------------------------------ \
+BEGIN \ of Master RX
+ MOV.B &UCBCNT0,T \ store count of byte
+ BIT #8,&UCB0IFG \ test UCSTPIFG
+ 0<> IF \
+ MOV @RSP+,PC \ end of I2C_MM RX driver
+ THEN \
+ BIT #1,&UCB0IFG \ test UCRXIFG0
+ 0<> IF \
+ MOV.B &UCB0RXBUF,0(S) \ load data from UCB0RXBUF
+ ADD #1,S \
+ THEN \
+AGAIN \
+\ ------------------------------ \
+\ Swap Master to Slave mode \
+\ ------------------------------ \
+FW2 MOV #1,&UCB0CTLW0 \ set eUSCI_B in reset state, clear UCB0IE & UCB0IFG all flags
+ BIS #$07A0,&UCB0CTLW0 \
+\ BIS #$10,&UCB0CTLW1 \ set software ack address (UCSWACK=1)
+\ MOV #0,&UCB0ADDMSK \ enable address mask for all addresses i.e. software address
+ BIC #1,&UCB0CTLW0 \ activate eUSCI_B
+ MOV #4,&UCB0IE \ enable StartCond interrupt
+FW1 MOV @RSP+,PC \
+\ ------------------------------ \
+ENDASM \ 62 words + 9 init words
+ \
+
+\ ------------------------------\
+CODE START \ init
+\ ------------------------------\
+\ init I2C_MMaster \
+\ ------------------------------\
+\ %0000 1111 1101 0011 $640 = $0FD3
+\ - UCMM = 1 : multi master mode
+\ - UCMST = 1 : I2C_MMaster
+\ -- UCMODE = %11 = I2C
+\ _ USYNC=1 (always 1)
+\ -- UCSSEL=SMCLK=8MHz
+\ - UCTXACK=0 not auto ACK slave address
+\ - UCTR=1/0 : TX/RX modes
+\ - UCTXSTP
+\ - UCTXSTT send start
+\ - UCSWRST=1
+\ ------------------------------\
+\ %0000 0000 1100 1000 $642 = $00C8
+\ - UCETXINT=0 : UCTXIFG0 set address match UCxI2COAx and TX mode
+\ -- UCCLTO=%11 : SCL low time out = 34 ms
+\ - UCSWACK=1 : UCTXACK must be written to continue
+\ -- UCASTP0=%10 : automatic Stop when UCBxTBCNT is reached
+\ ------------------------------\
+\ PORTX (PORTx:y) default values\ DIR0,REN1,OUT1 (input with pullup resistors)
+\ ------------------------------\
+\ notice : UCB0 I2C driver seems to control only DIR register !!!
+BIC.B #MM_BUS,&I2CMM_REN \ REN0 : no_resistor
+BIC.B #MM_BUS,&I2CMM_OUT \ OUT0 : preset output low
+BIS.B #MM_BUS,&I2CMM_SEL1 \ SEL11 : enable I2C I/O
+COLON
+." ; type stop to stop :-)"
+LIT recurse is WARM \ insert this starting routine between COLD and WARM...
+(WARM) \ ...and continue with (WARM)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
--- /dev/null
+\ name : MSP430FR5xxx_I2C_Slave.f
+RST_STATE
+\ NOECHO
+
+\ Copyright (C) <2015> <J.M. THOORENS>
+\
+\ This program is free software: you can redistribute it and/or modify
+\ it under the terms of the GNU General Public License as published by
+\ the Free Software Foundation, either version 3 of the License, or
+\ (at your option) any later version.
+\
+\ This program is distributed in the hope that it will be useful,
+\ but WITHOUT ANY WARRANTY\ without even the implied warranty of
+\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+\ GNU General Public License for more details.
+\
+\ You should have received a copy of the GNU General Public License
+\ along with this program. If not, see <http://www.gnu.org/licenses/>.
+\
+\ driver I2C SLAVE with START interrupt only, for any I2C_Slave addresses
+\ Target: MSP430FR5xxx @ 8,16,24 MHz
+\ version 1.0 2015-03-17
+
+\ ---------------------------------------------------------------------------------------------------------------------;
+\ SCL clock generation, timing, and test of data(s) number are made by I2C_Master.
+\ slave can strech SCL low after Start Condition and after any bit.
+\
+\ address Ack/Nack is generated by the slave on SDA line (released by the master)
+\ Two groups of eight addresses (000$xxy and 1111xxxy) are not allowed (reserved)
+\ after address or data is sent, the transmitter (Master or Slave) must release SDA line to allow (N)Ack by the receiver
+\ data Ack/Nack are generated by the receiver (master or slave) on SDA line
+\ a master receiver must signal the end of data to the slave transmitter by sending a Nack bit
+\ Stop or restart conditions must be generated by master after a Nack bit.
+\ after Ack bit is sent, Slave must release SDA line to allow master to do stop or restart conditions
+\
+\ __ _____ _____ _..._ _____ _____ _NACK _____ _____ _..._ _____ _____ _NACK _
+\ SDA \____/_MSB_X_____X_..._X_LSB_X_R/W_x_ACK_x_MSB_X_____X_..._X_____X_LSB_X_ACK_X___/
+\ _____ _ _ _ _ _ _ _ _ _ _ ___
+\ SCL \___/1\___/2\___...___/7\___/8\___/9\___/1\___/2\___...___/7\___/8\___/9\___/
+\ ^ ^ ^ ^ ^ ^ ^
+\ | |Slave Stretch Low |SSL |SSL |SSL |SSL |
+\ | |
+\ |Start Condition |stoP Condition
+\
+\ __ _____ _____ _..._ _____ _____ _NACK _____ _____ _..._ _____ _____ _NACK ___
+\ SDA \____/_MSB_X_____X_..._X_LSB_X_R/W_x_ACK_x_MSB_X_____X_..._X_____X_LSB_X_ACK_X \____...
+\ _____ _ _ _ _ _ _ _ _ _ _ ____
+\ SCL \___/1\___/2\___...___/7\___/8\___/9\___/1\___/2\___...___/7\___/8\___/9\___/ \_...
+\ ^ ^ ^ ^ ^ ^ ^
+\ | |Slave Stretch Low |SSL |SSL |SSL |SSL |
+\ | |
+\ |Start Condition |reStart Condition
+\
+\ tHIGH : SCL high time
+\ tLOW : SCL low time
+\ tBUF : SDA high time between Stop and Start conditions
+\ tHD:STA : Start_Condition SCL high time after SDA is low
+\ tSU:STO : Stop_Condition SCL high time before SDA rise
+\ tSU:STA : Start_Condition SCL high time before SDA fall
+\ tHD:DAT : SDA data change time after SCL is low
+\ the SDA line must be strobe just after SCL is high
+\ the SDA data must be change just after SCL is low
+\ standard mode (up to 100 kHz) : tHIGH = tHD:STA = tSU:STO = 4µs
+\ tLOW = tSU:STA = tBUF = 4,7µs
+\ tHD:DAT <= 3,45 µs
+\
+\ fast mode (up to 400 kHz) : tHIGH = tHD:STA = tSU:STO = 0,6µs
+\ tLOW = tSU:STA = tBUF = 1,3µs
+\ tHD:DAT <= 0,9 µs
+\ -------------------------------------------------------------------------------------------------------------------;
+
+
+
+VARIABLE I2CS_OWN \ slave I2C address without RW flag (low byte) + DATA0 input (HIGH byte)
+\ 2 ALLOT \ next the low byte of I2CS_OWN word, it is the input buffer
+VARIABLE I2CS_BUF \ buffer output, lentgh (low byte),DATA0 output (HIGH byte)
+\ 2 ALLOT \ this byte lentgh is shared by input and output buffers
+
+\ ******************************\
+ASM I2CS_TX \ TX part of I2C_Slave
+\ ******************************\
+\ \ T = TX buffer_org
+\ \ use W = TX buffer_ptr
+\ \ out : low(I2CS_BUF) = RX or TX lentgh
+\ ------------------------------\
+MOV T,W \ W = TX_buf_ptr -1
+BEGIN \
+ ADD #1,W \ first reserve one byte for length then inc
+ MOV.B @W,&UCB0TXBUF \ +[W] --> UCB0TXBUF
+\ ----------------------------\
+\ slave send byte \
+\ ----------------------------\
+ BEGIN \
+ BIT #$0C,&UCB0IFG \ UCB0IFG(STP,STT) = 1 ?
+ 0<> IF \
+\ --------------------\
+\ stop or restart received
+\ --------------------\
+ SUB T,W \
+ SUB.B #1,W \ sub #1, because char +[W] is not sent
+ MOV.B W,0(T) \ store length in first byte of buffer output
+ BIC #UCTR,&UCB0CTLW0 \ reset UCTR R/W bit for next START
+ MOV @RSP+,PC \ ===> ret
+\ --------------------\
+ THEN \
+ BIT #2,&UCB0IFG \ UCB0IFG(TX0) = 1 ?
+ 0<> UNTIL \
+AGAIN \
+ENDASM \
+ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+\ **************************************\
+ASM I2C_S \ <== eUSCIB0 interrupt vector : i2c_addres&R/w sent by master is received
+\ **************************************\
+BIC #$F8,0(RSP) \ SCG1,SCG0,OSCOFF,CPUOFF and GIE are OFF in retiSR to force LPM0_LOOP with pending interrupt
+MOV #$98,&LPM_MODE \ to reenter in LPM2 mode. LPM3-4 don't work with MSP430FR57xx.
+\ --------------------------------------\
+MOV #I2CS_BUF,T \ T = buffer output address -1
+MOV #I2CS_OWN,S \ S = buffer input address -1
+MOV #0,&UCB0IFG \ write UCB0IFG to clear all int flags (STTIFG,TXIFG,..)
+CMP.B &UCB0I2COA0,&UCB0ADDRX \ UCB0ADDRX = own address ?
+0= IF \
+\ --------------------------------------\
+\ It's my own address \
+\ --------------------------------------\
+ BIS #UCTXACK,&UCB0CTLW0 \ send software Ack address
+ BIT #UCTR,&UCB0CTLW0 \ test UCB0CTLW0(UCTR) R/W bit
+ 0= IF \ I2C_Master Write
+\ --------------------------------\
+\ slave receive datas \ yes
+\ --------------------------------\
+ MOV S,W \ W = input buffer address - 1
+ BEGIN \
+\ ----------------------------\
+\ slave receive one byte \
+\ ----------------------------\
+ BEGIN \
+ BIT #$8C,&UCB0IFG \ UCB0IFG(STP,STT,CLTO) = 1 ? (STOP, START, SCL low timeout)
+ 0<> IF \
+\ --------------------\
+\ TX stop or restart \ from master
+\ --------------------\
+ SUB S,W \ W = Adr_end - Adr_start = length
+ MOV.B W,0(T) \ store length in first byte of buffer output
+\ --------------------\
+\ insert here post RX code
+\ --------------------\
+ RETI \
+ THEN \ if not (stop, restart, CLTO)
+ BIT #1,&UCB0IFG \ UCB0IFG(RX0) = 1 ?
+ 0<> UNTIL \
+ ADD #1,W \ reserve one byte for length first, then preincrement
+ MOV.B &UCB0RXBUF,0(W) \ [UCB0RXBUF] = data --> +[W]
+ AGAIN \ loop for new received data if any
+ THEN \ end of I2C_Master read
+\ ------------------------------------\
+\ slave transmit datas variant 1 \ to loop back after bad_own_address code
+\ ------------------------------------\
+ CALL #I2CS_TX \
+ RETI \
+\ ------------------------------------\
+\ slave transmit datas variant 2 \
+\ ------------------------------------\
+\ MOV T,W \ W = output buffer address -1
+\ BEGIN \
+\ ADD #1,W \ first reserve one byte for length
+\ MOV.B @W,&UCB0TXBUF \ +[W] --> UCB0TXBUF
+\ \ ----------------------------\
+\ \ slave send byte \
+\ \ ----------------------------\
+\ BEGIN \
+\ BIT.B #$0C,&UCB0IFG \ UCB0IFG(STP,STT) = 1 ?
+\ 0<> IF \
+\ \ ------------------------\
+\ \ RX stop or restart \ from master
+\ \ ------------------------\
+\ SUB T,W \ W = Adr_end - Adr_start = length
+\ SUB.B #1,W \ sub #1, because char +[W] is not sent
+\ MOV.B W,0(T) \ store length in first byte of buffer output
+\ BIC.B #UCTR,&UCB0CTLW0 \ reset UCTR R/W bit for next START
+\ RETI \
+\ THEN \
+\ BIT.B #$02,&UCB0IFG \ UCB0IFG(TX0) = 1 ?
+\ 0<> UNTIL \
+\ AGAIN \
+\ ------------------------------------\
+\ End of slave transmit datas variants\
+\ ------------------------------------\
+THEN \ if bad I2C address
+\ --------------------------------------\
+\ BAD I2C ADDRESS CaseOf \
+\ --------------------------------------\
+\ insert here post BAD I2C address code \
+\ ...that can loop back to I2CS_TX... \
+\ --------------------------------------\
+BIC #UCTXACK,&UCB0CTLW0 \ send Nack address
+RETI \
+ENDASM
+ \
+
+\ --------------------------------------\
+CODE START \ init I2C_slave
+\ --------------------------------------\
+\ UCB0CTLW0 = %0000 0111 1100 0001 $640
+\ - UCMST = 0 : I2C_Slave
+\ -- UCMODE = %11 = I2C
+\ _ USYNC=1 (always 1)
+\ -- UCSSEL=SMCLK (don't care in slave mode)
+\ - UCTXACK=0 not auto ACK slave address
+\ - UCTR=0 : RX (for RX address)
+\ - UCSWRST=1
+\ UCB0CTLW1 = %0000 0000 1101 0000 $642
+\ - UCETXINT=0 : UCTXIFG0 set address match UCxI2COAx and TX mode
+\ -- UCCLTO=%11 : SCL low time out = 34 ms
+\ - UCSWACK=1 : UCTXACK must be written to continue
+\ UCB0RXBUF $64C
+\ UCB0TXBUF $64E
+\ UCB0I2COA0 $654 must be written ? enabled ?
+\ UCB0ADDRX $65C
+\ UCB0ADDMSK $65E
+\ UCB0IE = %0000 0000 0000 0100 $66A
+\ - UCSTTIE : StartCond Interrupt only
+\ UCB0IFG $66C
+\ UCB0IV $66E : write it to clear all IFG
+
+\ ------------------------------\
+\ init I2C_slave \
+MOV #1,&UCB0CTLW0 \ set eUSCI_B in reset state, clear UCB0IE & UCB0IFG all flags
+BIS #$07A0,&UCB0CTLW0 \
+BIS #$10,&UCB0CTLW1 \ set software ack address (UCSWACK=1)
+MOV #%1010,&UCB0I2COA0 \ set my own address
+BIS #$0400,&UCB0I2COA0 \ UCOAEN=1 enable UCB0I2COA0 with address slave
+\ MOV #0,&UCB0ADDMSK \ enable address mask for all addresses i.e. software address
+BIC #1,&UCB0CTLW0 \ activate eUSCI_B
+MOV #4,&UCB0IE \ enable StartCond interrupt
+\ ------------------------------\
+\ init interrupt vectors
+MOV #I2C_S,&$FFEE \ eUSCIB0 interrupt vector
+\ ------------------------------\
+\ init PORTA (P2:P1) (complement)
+\ notice : UCB0 I2C driver seems to control only DIR register !!!
+BIC.B #S_BUS,&I2CS_REN \ SDA + SCL pullup/down disable
+BIC.B #S_BUS,&I2CS_OUT \ OUT0 : preset output low
+BIS.B #S_BUS,&I2CS_SEL1 \ enable I2C I/O
+\ ------------------------------\
+COLON
+." I2C_Slave is running. Type STOP to quit"
+LIT recurse is WARM \ insert this routine between COLD and WARM...
+(WARM) ; \ ...and continue with WARM
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+ECHO
+PWR_HERE
+\ START
--- /dev/null
+\ name : I2C_Slave_to_LCD_2x20.f
+
+\ Copyright (C) <2015> <J.M. THOORENS>
+\
+\ This program is free software: you can redistribute it and/or modify
+\ it under the terms of the GNU General Public License as published by
+\ the Free Software Foundation, either version 3 of the License, or
+\ (at your option) any later version.
+\
+\ This program is distributed in the hope that it will be useful,
+\ but WITHOUT ANY WARRANTY\ without even the implied warranty of
+\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+\ GNU General Public License for more details.
+\
+\ You should have received a copy of the GNU General Public License
+\ along with this program. If not, see <http://www.gnu.org/licenses/>.
+\
+
+\ --------------------------------------\
+\ example of App running under interrupt
+\ --------------------------------------\
+
+\ for MSP_EXP430FR5739, MSP_EXP430FR5969, MSP_EXP430FR6989, ... launchpads @ 8MHz
+\
+\ prerequisites : your launchpad is wired as described in launchpad.pat file : UART0, SDA, SCL, LCD parts
+\ and FastForth runs @ 8MHz
+\ usage : create a logical network drive ( a: b: as you want) from your local copy of Gitlab FAST FORTH
+\ with scite.exe open this file MSP430-FORTH\I2C_Slave_to_LCD_2x20.f,
+\ select "tools" menu, "preprocess" item 2 (CTRL+1),
+\ a dialog box asks you for 4 parameters $(1) to $(4),
+\ in the 2th param. field, type your launchpad to select the launchpad.pat to be used : for example MSP_EXP430FR5969,
+\ in the 3th param. field, type the COMx port of your USBtoUART device.
+\ result : a file.4th in which all symbolic addresses are resolved according to the rules described in the selected launchpad.pat
+\ the word START starts the app that runs under LPMx.
+\ to recover the console input (i.e. to quit LPMx), type a space. Then you can enter a command, for example STOP.
+
+WIPE
+ \
+
+: U.R \ u n -- display u unsigned in n width
+ >R <# 0 # #S #>
+ R> OVER - 0 MAX SPACES TYPE
+;
+ \
+
+CODE ? \ adr -- display the content of adr
+ MOV @TOS,TOS
+ MOV #U.,PC
+ENDCODE
+ \
+
+
+\ ------------------------------\
+CODE 20_us \ n -- n * 20 us
+\ ------------------------------\
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+\ ------------------------------\
+CODE TOP_LCD \ LCD Sample
+\ ------------------------------\ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+\ ------------------------------\
+CODE LCD_W \ byte -- write byte
+\ ------------------------------\
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+ COLON
+ TOP_LCD 2 20_us \ write high nibble first
+ TOP_LCD 2 20_us ;
+ \
+\ ------------------------------\
+CODE LCD_R \ -- byte read byte
+\ ------------------------------\
+ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+ COLON
+ TOP_LCD 2 20_us \ read high nibble first
+ TOP_LCD 2 20_us
+ HI2LO \ -- %0000HHHH %0000LLLL
+ MOV @RSP+,IP
+ MOV @PSP+,W \ W = high nibble
+ RLAM #4,W \ -- %0000LLLL W = %HHHH0000
+ ADD.B W,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+\ ------------------------------\
+CODE LCD_WrF \ func -- Write Fonction
+\ ------------------------------\
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+\ ------------------------------\
+CODE LCD_RdS \ -- status Read Status
+\ ------------------------------\
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_R
+ENDCODE
+ \
+\ ------------------------------\
+CODE LCD_WrC \ char -- Write Char
+\ ------------------------------\
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+\ ------------------------------\
+CODE LCD_RdC \ -- char Read Char
+\ ------------------------------\
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_R
+ENDCODE
+ \
+\ ------------------------------\
+\ : LCD_Clear $01 LCD_WrF 80 20_us \ bad init !
+: LCD_Clear $01 LCD_WrF 100 20_us ;
+ \
+\ ------------------------------\
+: LCD_Home $02 LCD_WrF 80 20_us ;
+ \
+\ ------------------------------\
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+\ ******************************\
+ASM WDT_Int \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+\ ------------------------------\
+\ define LPM mode for ACCEPT \ LPM0 is the default mode.
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0
+\ ------------------------------\
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #34,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+BIC #WDTIFG,&SFRIFG1 \ reset WDT_INT flag
+BIC #$78,0(RSP) \ set CPU ON and GIE OFF in retiSR
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+
+VARIABLE I2CS_OWN \ slave I2C address without RW flag (low byte) + DATA0 input (HIGH byte)
+\ 2 ALLOT \ next the low byte of I2CS_OWN word, it is the input buffer
+VARIABLE I2CS_BUF \ buffer output, lentgh (low byte),DATA0 output (HIGH byte)
+\ 2 ALLOT \ this byte lentgh is shared by input and output buffers
+
+\ ******************************\
+ASM I2CS_TX \ TX part of I2C_Slave
+\ ******************************\
+\ \ T = TX buffer_org
+\ \ use W = TX buffer_ptr
+\ \ out : low(I2CS_BUF) = RX or TX lentgh
+\ ------------------------------\
+MOV T,W \ W = TX_buf_ptr -1
+BEGIN \
+ ADD #1,W \ first reserve one byte for length then inc
+ MOV.B @W,&UCB0TXBUF \ +[W] --> UCB0TXBUF
+\ ----------------------------\
+\ slave send byte \
+\ ----------------------------\
+ BEGIN \
+ BIT #$0C,&UCB0IFG \ UCB0IFG(STP,STT) = 1 ?
+ 0<> IF \
+\ --------------------\
+\ stop or restart received
+\ --------------------\
+ SUB T,W \
+ SUB.B #1,W \ sub #1, because char +[W] is not sent
+ MOV.B W,0(T) \ store length in first byte of buffer output
+ BIC #UCTR,&UCB0CTLW0 \ reset UCTR R/W bit for next START
+ MOV @RSP+,PC \ ===> ret
+\ --------------------\
+ THEN \
+ BIT #2,&UCB0IFG \ UCB0IFG(TX0) = 1 ?
+ 0<> UNTIL \
+AGAIN \
+ENDASM \
+ \
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+\ **************************************\
+ASM I2C_S \ <== eUSCIB0 interrupt vector : i2c_addres&R/w sent by master is received
+\ **************************************\
+BIC #$78,0(RSP) \ SCG1,SCG0,OSCOFF,CPUOFF and GIE are OFF in retiSR to force LPM0_LOOP with pending interrupt
+\ --------------------------------------\
+\ define LPM mode for ACCEPT \ LPM0 is the default mode.
+\ --------------------------------------\
+\ MOV #LPM4,&LPM_MODE \ MSP430FR59xx family : LPM 0 to 4
+\ MOV #LPM2,&LPM_MODE \ MSP430FR57xx family : terminal input don't work for LPMx > 2
+\ \ MSP430FR2xxx family : terminal input don't work for LPMx > 0
+\ --------------------------------------\
+MOV #I2CS_BUF,T \ T = buffer output address -1
+MOV #I2CS_OWN,S \ S = buffer input address -1
+MOV #0,&UCB0IFG \ write UCB0IFG to clear all int flags (STTIFG,TXIFG,..)
+CMP.B &UCB0I2COA0,&UCB0ADDRX \ UCB0ADDRX = own address ?
+0= IF \
+ BIS #UCTXACK,&UCB0CTLW0 \ send software Ack address
+ BIT #UCTR,&UCB0CTLW0 \ test UCB0CTLW0(UCTR) R/W bit
+ 0= IF \ I2C_Master Write
+\ --------------------------------\
+\ slave receive datas \ yes
+\ --------------------------------\
+ MOV S,W \ W = input buffer address - 1
+ BEGIN \
+\ ----------------------------\
+\ slave receive one byte \
+\ ----------------------------\
+ BEGIN \
+ BIT #$8C,&UCB0IFG \ UCB0IFG(STP,STT,CLTO) = 1 ? (STOP, START, SCL low timeout)
+ 0<> IF \
+\ --------------------\
+\ TX stop or restart \ from master
+\ --------------------\
+ SUB S,W \ W = Adr_end - Adr_start = length
+ MOV.B W,0(T) \ store length in first byte of buffer output
+\ --------------------\
+\ insert here post RX code
+\ --------------------\
+\ BIS.B #LED1,&LED1_OUT \ OUT high ==> switch ON LED1 to test
+\ display IR_RC5 command
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \
+ MOV.B 1(X),TOS \ display RC6 command
+\ MOV.B 0(W),TOS \ display count
+ LO2HI \ IP is free
+ ['] LCD_Clear IS CR
+ ['] LCD_WrC IS EMIT
+ BASE @ HEX \ save BASE before change
+ CR ." $" 2 U.R SPACE \ display received byte
+ ." LPM = $" LPM_MODE ? \ display also LPM value
+ ['] (CR) IS CR
+ ['] (EMIT) IS EMIT
+ BASE ! \ restore BASE
+ HI2LO \ nice code, right ?
+\ ; endof display
+\ BIC.B #LED1,&LED1_OUT \ OUT low ==> switch OFF LED1 to test
+\ --------------------\
+ RETI \
+\ --------------------\
+ THEN \ if not (stop, restart, CLTO)
+ BIT #1,&UCB0IFG \ UCB0IFG(RX0) = 1 ?
+ 0<> UNTIL \
+ ADD #1,W \ reserve one byte for length first, then preincrement
+ MOV.B &UCB0RXBUF,0(W) \ [UCB0RXBUF] = data --> +[W]
+ AGAIN \ loop for new received data if any
+ THEN \ end of I2C_Master read
+\ ------------------------------------\
+\ slave transmit datas variant 1 \ to loop back after bad_own_address code
+\ ------------------------------------\
+ CALL #I2CS_TX \
+ RETI \
+\ ------------------------------------\
+\ slave transmit datas variant 2 \
+\ ------------------------------------\
+\ MOV T,W \ W = output buffer address -1
+\ BEGIN \
+\ ADD #1,W \ first reserve one byte for length
+\ MOV.B @W,&UCB0TXBUF \ +[W] --> UCB0TXBUF
+\ \ ----------------------------\
+\ \ slave send byte \
+\ \ ----------------------------\
+\ BEGIN \
+\ BIT.B #$0C,&UCB0IFG \ UCB0IFG(STP,STT) = 1 ?
+\ 0<> IF \
+\ \ ------------------------\
+\ \ RX stop or restart \ from master
+\ \ ------------------------\
+\ SUB T,W \ W = Adr_end - Adr_start = length
+\ SUB.B #1,W \ sub #1, because char +[W] is not sent
+\ MOV.B W,0(T) \ store length in first byte of buffer output
+\ BIC.B #UCTR,&UCB0CTLW0 \ reset UCTR R/W bit for next START
+\ RETI \
+\ THEN \
+\ BIT.B #$02,&UCB0IFG \ UCB0IFG(TX0) = 1 ?
+\ 0<> UNTIL \
+\ AGAIN \
+\ ------------------------------------\
+\ End of slave transmit datas variants\
+\ ------------------------------------\
+THEN \ if bad I2C address
+\ --------------------------------------\
+\ BAD I2C ADDRESS CaseOf \
+\ --------------------------------------\
+\ insert here post BAD I2C address code \
+\ ...that can loop back to I2CS_TX... \
+\ --------------------------------------\
+BIC #UCTXACK,&UCB0CTLW0 \ send Nack address
+RETI \
+ENDASM
+ \
+
+
+
+
+\ START performs a complementary initialisation of the FAST FORTH system to start your app.
+\ START is inserted COLD and ABORT via the fragment of code : LIT RECURSE IS WARM.
+\ --------------------------------------\
+CODE START \ init I2C_slave
+\ --------------------------------------\
+\ %0000 0111 1100 0001 UCB0CTLW0
+\ - UCMST = 0 : I2C_Slave
+\ -- UCMODE = %11 = I2C
+\ _ USYNC =1 (always 1)
+\ -- UCSSEL =SMCLK (don't care in slave mode)
+\ - UCTXACK =0 not auto ACK slave address
+\ - UCTR =0 : RX (for RX address)
+\ - UCSWRST =1
+\ --------------------------------------\
+\ %0000 0000 1101 0000 UCB0CTLW1
+\ - UCETXINT =0 : UCTXIFG0 set address match UCxI2COAx and TX mode
+\ -- UCCLTO =%11 : SCL low time out = 34 ms
+\ - UCSWACK =1 : UCTXACK must be written to continue
+\ --------------------------------------\
+\ UCB0RXBUF
+\ UCB0TXBUF
+\ UCB0I2COA0 must be written ? enabled ?
+\ UCB0ADDRX
+\ UCB0ADDMSK
+\ --------------------------------------\
+\ %0000 0000 0000 0100 UCB0IE
+\ - UCSTTIE : StartCond Interrupt only
+\ --------------------------------------\
+\ UCB0IFG
+\ UCB0IV : write it to clear all IFG
+
+\ ------------------------------\
+\ init I2C_slave \
+\ ------------------------------\
+MOV #1,&UCB0CTLW0 \ set eUSCI_B in reset state, clear UCB0IE & UCB0IFG all flags
+BIS #$07A0,&UCB0CTLW0 \
+BIS #$10,&UCB0CTLW1 \ set software ack address (UCSWACK=1)
+MOV #%1010,&UCB0I2COA0 \ set my own address
+BIS #$0400,&UCB0I2COA0 \ UCOAEN=1 enable UCB0I2COA0 with address slave
+\ MOV #0,&UCB0ADDMSK \ enable address mask for all addresses i.e. software address
+BIC #1,&UCB0CTLW0 \ activate eUSCI_B
+MOV #4,&UCB0IE \ enable StartCond interrupt
+MOV #%1010,&I2CS_OWN \ my slave address, without RW flag !
+\ ------------------------------\
+\ init PORT complement
+\ ------------------------------\
+\ notice : UCB0 I2C driver seems to control only DIR register !!!
+BIC.B #S_BUS,&I2CS_REN \ SDA + SCL pullup/down disable
+BIC.B #S_BUS,&I2CS_OUT \ OUT0 : preset output low
+BIS.B #S_BUS,&I2CS_SEL1 \ enable I2C I/O
+\ ------------------------------\
+BIS.B #LCDVo,&LCDVo_DIR \
+BIS.B #LCDVo,&LCDVo_SEL0 \ TB0.2
+\ ------------------------------\
+BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+BIS.B #LCD_DB,&LCD_DB_DIR \ lcd_db as output, wired to DB(4-7) LCD_Data
+BIC.B #LCD_DB,&LCD_DB_REN \ lcd_db pullup/down disable
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up mode
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate LCD_V0 via TB0.2 and P1.5/P2.2
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+\ MOV #$5A5E,&WDTCTL \ init WDT Vloclk source 10kHz /2^9 (50 ms), interval mode
+ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #I2C_S,&I2CS_Vec \ eUSCIB0 interrupt vector
+ MOV #WDT_Int,&WDT_Vec \ init WDT interval vector interrupt
+\ ------------------------------\
+\ define LPM mode for ACCEPT \ LPM0 is the default mode.
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0
+\ ------------------------------\
+\ Init LCD
+ COLON
+ $03E8 20_us \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_us \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ 5 20_us \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ 2 20_us \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ 2 20_us \ wait 40 us = LCD cycle
+ $28 LCD_WrF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WrF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WrF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WrF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+
+ ['] LCD_HOME IS CR \ CR redirected to LCD_HOME
+ ['] LCD_WrC IS EMIT \ EMIT redirected to LCD_WrC
+ CR ." I love you" \ display it on the LCD
+ ['] (EMIT) IS EMIT \ restore EMIT
+ ['] (CR) IS CR \ restore CR
+ ." I2C_Slave_to_LCD is running. Type STOP to quit" \ display on terminal
+\ NOECHO \ uncomment to run this app without terminal connexion
+ lit RECURSE IS WARM \ insert this starting routine between COLD and WARM...
+ (WARM) ; \ ...and continue with (WARM)
+ \
+
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+RST_HERE
+
+
+\ START runs your App.
+\ when downloading this file, all lines beyond the START command are ignored. Usefull to comment.
+
+\ driver for LCD 2x20 characters display with 4 bits data interface
+\ without usage of an auxiliary 5V to feed the Vo of LCD
+\ without potentiometer to adjust the LCD contrast
+\ LCD contrast software adjustable by 2 switches
+\ TB0.2 current consumption ~ 500 uA
+
+\ layout : see config.pat file for defining I/O
+
+\ GND <-------+---0V0----------> 1 LCD_Vss
+\ VCC >------ | --3V6-----+----> 2 LCD_Vdd
+\ | |
+\ |___ 470n ---
+\ ^ | ---
+\ / \ BAT54 |
+\ --- |
+\ 100n | 2k2 |
+\ TB0.2 >---||--+--^/\/\/v--+----> 3 LCD_Vo (=0V6 without modulation)
+\ -------------------------> 4 LCD_RW
+\ -------------------------> 5 LCD_RW
+\ -------------------------> 6 LCD_EN
+\ <------------------------> 11 LCD_DB4
+\ <------------------------> 12 LCD_DB5
+\ <------------------------> 13 LCD_DB5
+\ <------------------------> 14 LCD_DB7
+
+\ Sw1 <--- LCD contrast + (finger :-)
+\ Sw2 <--- LCD contrast - (finger \-)
+
--- /dev/null
+\ name : msp430FR5xxx_I2C_Soft_Master.asm
+
+WIPE
+
+\ Copyright (C) <2015> <J.M. THOORENS>
+\
+\ This program is free software: you can redistribute it and/or modify
+\ it under the terms of the GNU General Public License as published by
+\ the Free Software Foundation, either version 3 of the License, or
+\ (at your option) any later version.
+\
+\ This program is distributed in the hope that it will be useful,
+\ but WITHOUT ANY WARRANTY\ without even the implied warranty of
+\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+\ GNU General Public License for more details.
+\
+\ You should have received a copy of the GNU General Public License
+\ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+\ version 2.0 2015-07-30
+\ ---------------------------------------------------------------------------------------------------------------------\
+\ SCL clock generation, timing, and test of data(s) number are made by I2C_Master.
+\ slave can strech SCL low after Start Condition and after any bit.
+\
+\ address Ack/Nack is generated by the slave on SDA line (released by the master)
+\ Two groups of eight addresses (000xxxy and 1111xxxy) are not allowed (reserved)
+\ after address or data is sent, the transmitter (Master or Slave) must release SDA line to allow (N)Ack by the receiver
+\ data Ack/Nack are generated by the receiver (master or slave) on SDA line
+\ a master receiver must signal the end of data to the slave transmitter by sending a Nack bit
+\ Stop or restart conditions must be generated by master after a Nack bit.
+\ after Ack bit is sent, Slave must release SDA line to allow master to do stop or restart conditions.
+\
+\
+\ first byte = address + R/W flag | byte data (one, for example)
+\ __ _____ _____ _..._ _____ __R__ _NAK_ _____ _____ _..._ _____ _____ _NAK_ _
+\ SDA \____/_MSB_X_____X_..._X_LSB_X__W__x_ACK_x_MSB_X_____X_..._X_____X_LSB_X_ACK_X___/
+\ _____ _ _ _ _ _ _ _ _ _ _ ___
+\ SCL \___/1\___/2\___...___/7\___/8\___/9\___/1\___/2\___...___/7\___/8\___/9\___/
+\ ^ ^ ^ ^ ^ ^ ^
+\ | |SSL |SSL |SSL |SSL |SSL |
+\ | |
+\ |Start Condition |stoP Condition
+\
+\ first byte = address + R/W flag | byte data (one, for example)
+\ __ _____ _____ _..._ _____ __R__ _NAK_ _____ _____ _..._ _____ _____ _NAK_ ___
+\ SDA \____/_MSB_X_____X_..._X_LSB_X__W__x_ACK_x_MSB_X_____X_..._X_____X_LSB_X_ACK_X \____...
+\ _____ _ _ _ _ _ _ _ _ _ _ ____
+\ SCL \___/1\___/2\___...___/7\___/8\___/9\___/1\___/2\___...___/7\___/8\___/9\___/ \_...
+\ ^ ^ ^ ^ ^ ^ ^
+\ | |SSL |SSL |SSL |SSL |SSL |
+\ | |
+\ |Start Condition |reStart Condition
+\
+\ SSL : Slave can strech SCL low
+\ tHIGH : SCL high time
+\ tLOW : SCL low time
+\ tBUF : SDA high time between Stop and Start conditions
+\ tHD:STA : Start_Condition SCL high time after SDA is low
+\ tSU:STO : Stop_Condition SCL high time before SDA rise
+\ tSU:STA : Start_Condition SCL high time before SDA fall
+\ tHD:DAT : SDA data change time after SCL is low
+\ the SDA line must be strobe just after SCL is high
+\ the SDA data must be change just after SCL is low
+\ standard mode (up to 100 kHz) : tHIGH = tHD:STA = tSU:STO = 4µs
+\ tLOW = tSU:STA = tBUF = 4,7µs
+\ tHD:DAT <= 3,45 µs
+\ -------------------------------------------------------------------------------------------------------------------\
+\
+\
+\ -------------------------------------------------------------------------------------------------------------------\
+\ I2C Soft MASTER, Standard MODE, 8,16,24MHz
+\ -------------------------------------------------------------------------------------------------------------------\
+
+\ ===============================================================================================
+\ ===============================================================================================
+
+\ ### ##### ##### ##### # #
+\ # # # # # # # #### ###### ##### ## ## ## #### ##### ###### #####
+\ # # # # # # # # # # # # # # # # # # #
+\ # ##### # ##### # # ##### # # # # # # #### # ##### # #
+\ # # # # # # # # # # ###### # # # #####
+\ # # # # # # # # # # # # # # # # # # # #
+\ ### ####### ##### ##### #### # # # # # # #### # ###### # #
+
+\ ===============================================================================================
+\ ===============================================================================================
+
+\ use Px.0 to Px.3 pins as SCL and SDA pins to use immediate instruction in one byte (#1,#2,#4,#8)
+
+\ tested with P1.6 SDA, P1.7 SCL @8 MHZ :
+\ Start + Adr + Write 3 bytes + Stop + Start + adr + read 2 bytes + stop = 600us ==> 105 kHz
+\ See MSP430FR5xxx_I2C_Soft_Master.png
+
+VARIABLE I2CS_ADR \ low(I2CS_ADR) = slave I2C address with RW flag, high(I2CS_ADR) = RX buffer,data0
+2 ALLOT \ data1,data2
+VARIABLE I2CM_BUF \ low(I2CM_BUF) = RX or TX lentgh, high(I2CM_BUF) = TX buffer,data0
+2 ALLOT \ data1,data2
+ \
+
+\ ------------------------------\
+ASM T_I2C \ 4 init first once !!!
+\ ------------------------------\
+BEGIN \ 3~ loop
+ SUB #1,Y \ 1
+0= UNTIL \ 2
+ MOV #1,Y \ 2 set I2C tHIGH time @ 8MHz
+\ MOV #9,Y \ 2 set I2C tHIGH time @ 16MHz
+\ MOV #20,Y \ 2 set I2C tHIGH time @ 24MHz
+ MOV @RSP+,PC \ 4 ret
+ENDASM \
+ \
+
+\ ------------------------------\ _
+ASM I2C_PLS \ SCL _| |_ pulse
+\ ------------------------------\
+CALL #T_I2C \ _ wait tLOW
+BIC.B #SMSCL,&I2CSM_DIR \ _^ release SCL (high)
+BEGIN
+ BIT.B #SMSCL,&I2CSM_IN \ test if SCL is released
+0<> UNTIL
+CALL #T_I2C \ wait tHIGH
+BIT.B #SMSDA,&I2CSM_IN \ _ get SDA
+BIS.B #SMSCL,&I2CSM_DIR \ v_ force SCL low
+MOV @RSP+,PC \ ret
+ENDASM \
+ \
+
+\ ------------------------------\
+ASM I2C_MTX \ MASTER TX \ shared code for address and TX data
+\ ------------------------------\
+BEGIN \
+ ADD.B X,X \ 1 l shift one left
+ U>= IF \ 2 l carry set ?
+ BIC.B #SMSDA,&I2CSM_DIR \ 4 l yes : SDA as input ==> SDA high because pull up resistor
+ ELSE \ 2 l
+ BIS.B #SMSDA,&I2CSM_DIR \ 4 l no : SDA as output ==> SDA low
+ THEN \ l _
+ CALL I2C_PLS \ _| |_ SCL
+ SUB.B #1,W \ l count of bits
+0= UNTIL \ l
+BIC.B #SMSDA,&I2CSM_DIR \ 5 l _ SDA as input : release SDA high to prepare read Ack/Nack
+MOV @RSP+,PC \ ret
+ENDASM \
+ \
+
+\ ==================================\
+ASM I2C_M \
+\ ==================================\
+\ \ in I2CS_ADR/I2CM_BUF as RX/TX buffer requested by I2CS_ADR(0(0))
+\ \ I2CS_ADR(0) = I2C_Slave_addr&R/w
+\ \ I2CM_BUF(0) = TX/RX count of datas
+\ \ I2CM_BUF(0) = 0 ==> send only I2C address
+\ \ used S BUF ptr
+\ \ T datas countdown
+\ \ W bits countdown
+\ \ X dataI2CM_
+\ \ out I2CSLA_ADR & (R/W) unCHNGd
+\ \ S = BUF PTR pointing on first data not exCHNGd
+\ \ T = count+1 of TX/RX datas exCHNGd
+\ \ I2CS_ADR(0) = unCHNGd
+\ \ I2CM_BUF(0) = count of data not exCHNGd (normally = 0)
+\ \ I2CM_BUF(0) = -1 <==> Nack on address
+\ ----------------------------------\
+\ I2C_MR_DC_ListenBeforeStart: \ test if SCL & SDA lines are idle (high)
+\ ----------------------------------\
+ BIC.B #SM_BUS,&I2CSM_DIR \ SDA & SCL pins as input
+ BIC.B #SM_BUS,&I2CSM_OUT \ preset output LOW for SDA & SCL pins
+ MOV #2,T \ I2C_MR_DC_Wait_Start_Loop = 8 µs @ 8 MHz
+\ MOV #4,T \ I2C_MR_DC_Wait_Start_Loop = 8 µs @ 16 MHz
+\ MOV #6,T \ I2C_MR_DC_Wait_Start_Loop = 8 µs @ 24 MHz
+ BEGIN \
+ BEGIN \
+ BEGIN \
+ BIT.B #SMSCL,&I2CSM_IN \ 4 P1DIR.3 SCL high ?
+ 0<> UNTIL \ 2
+ BIT.B #SMSDA,&I2CSM_IN \ 4 P1IN.2 SDA high ?
+ 0<> UNTIL \ 2
+ SUB #1,T \ 1
+ 0= UNTIL \ 2 here the I2C bus is idle
+\ ------------------------------\
+\ I2C_Master_Start_Cond: \ here, SDA and SCL are in idle state
+\ ------------------------------\
+BIS.B #SMSDA,&I2CSM_DIR \ 4- P1DIR.2 force SDA output (low)
+MOV #5,Y \ 2 tHD\STA time 8 MHz
+\ MOV #15,Y \ 2 tHD\STA time 16MHz
+\ MOV #25,Y \ 2 tHD\STA time 24MHz
+CALL #T_I2C \ wait tHD\STA
+BIS.B #SMSCL,&I2CSM_DIR \ 4- P1DIR.3 force SCL output (low)
+\ ------------------------------\
+\ I2C_Master_Start_EndOf: \
+\ ------------------------------\
+MOV #I2CS_ADR,S \ 2 l
+MOV.B @S+,X \ 3 l X = slave address, S = RX buffer
+MOV #I2CM_BUF,W \ 2 l
+MOV.B @W+,T \ 2 l T = count of datas, W = TX buffer
+BIT.B #1,X \ 1 l test I2C R/w flag
+0= IF \ 2 l write flag
+ MOV W,S \ 3 l TX buffer
+THEN \
+\ ------------------------------\
+\ I2C_Master_Send_address \ SCL is held low by slave
+\ ------------------------------\
+ADD #1,T \ to add address in count
+MOV #8,W \ 1 l prepare 8 bit Master writing
+MOV #1,Y \ 2 tHD\STA time 8 MHz value
+\ MOV #5,Y \ 2 tHD\STA time 16MHz value
+\ MOV #15,Y \ 2 tHD\STA time 24MHz value
+CALL #I2C_MTX \ 4 to send address
+\ ------------------------------\
+\ I2C_Master_Loop_Data \
+\ ------------------------------\
+BEGIN \
+\ ----------------------------\
+\ Master TX/RX ACK/NACK \
+\ ----------------------------\
+ MOV #2,Y \ 2 tLOW time complement @ 8MHz
+\ MOV #15,Y \ 2 tLOW time complement @ 16MHz
+\ MOV #20,Y \ 2 tLOW time complement @ 24MHz
+ CALL #I2C_PLS \ _| |_ SCL with BIT SDA, then ret
+ 0<> IF BIS #2,SR \ l if Nack (TX), force Z=1 ==> StopCond
+ ELSE SUB.B #1,T \ else dec count
+ THEN \ l
+\ ----------------------------\
+\ I2C_Master_CheckCountDown \ count=0 or Nack received
+\ ----------------------------\
+ 0= IF \ count reached or Nack
+\ ----------------------------\
+\ I2C_Master_StopCond \
+\ ----------------------------\ before releasing SCL
+ BIS.B #SMSDA,&I2CSM_DIR \ l P1DIR.2 as output ==> SDA low
+ CALL #T_I2C \ l _ wait 4 us
+ BIC.B #SMSCL,&I2CSM_DIR \ _| P1DIR.2 release SCL (high)
+ MOV #5,Y \ 2 tSU:STO time 8 MHz value
+\ MOV #15,Y \ 2 tSU:STO time 16MHz value
+\ MOV #25,Y \ 2 tSU:STO time 24MHz value
+ CALL #T_I2C \ _ wait tSU:STO
+ BIC.B #SMSDA,&I2CSM_DIR \ _| P1DIR.2 as input ==> SDA high with pull up resistor
+ SUB.B T,&I2CM_BUF \ 4 l refresh buffer length and reach tSU:STO
+ MOV @RSP+,PC \ ====>
+\ ----------------------------\
+ THEN \
+\ ----------------------------\
+ MOV.B #8,W \ 1 l prepare 8 bits transaction
+ BIT.B #1,&I2CS_ADR \ 3 l I2C_Master Read/write bit test
+ 0= IF \ 2 l write flag test
+\ ------------------------\
+\ I2C write \
+\ ------------------------\
+ MOV.B @S+,X \ 2 l next byte to transmit
+ CALL #I2C_MTX \ 4 to send data + test ack
+ ELSE \ l
+\ ------------------------\
+\ I2C read \
+\ ========================\
+\ I2C_Master_RX: \ here, SDA is indetermined, SCL is strech low by master
+\ ========================\
+ BEGIN \
+ BIC.B #SMSDA,&I2CSM_DIR \ 4 l _ P1DIR.2 as input ==> release SDA high because pull up resistor
+ MOV #3,Y \ 2 tLOW time complement @ 8 MHz
+\ MOV #15,Y \ 2 tLOW time complement @ 16MHz
+\ MOV #24,Y \ 2 tLOW time complement @ 24MHz
+ CALL #I2C_PLS \ _| |_ SCL + BIT SDA input (SDA-->carry)
+ ADDC.B X,X \ 1 l C <-- X <--- C
+ SUB #1,W \ 1 l count of bits
+ 0= UNTIL \ 2 l
+ MOV.B X, 0(S) \ 3 l store byte in buffer
+ ADD #1,S \ 1 l
+\ ------------------------\
+\ Compute Ack Or Nack \ here, SDA is released by slave, SCL is strech low by master
+\ ------------------------\
+ CMP #1,T \ 1 l here, SDA is released by slave = Nack
+ 0<> IF \ 2
+ BIS.B #SMSDA,&I2CSM_DIR \ 4 l send Ack if byte count <> 1
+ THEN \ l
+ THEN \
+AGAIN \ l
+ENDASM \
+ \
+
+\ ------------------------------\
+CODE START \
+\ ------------------------------\
+\ init PORTA (P2:P1) (complement) when reset occurs all I/O are set in input with resistors pullup
+BIC.B #SM_BUS,&I2CSM_OUT \ P1OUT.32 preset SDA + SCL output low
+BIC.B #SM_BUS,&I2CSM_REN \ P1REN.32 SDA + SCL pullup/down disable
+\ ------------------------------\
+LO2HI
+." \ type stop to stop :-)"
+LIT recurse is WARM \ insert this starting routine between COLD and WARM...
+(WARM) \ ...and continue with (WARM)
+;
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
--- /dev/null
+\ name : msp430FR5xxx_I2C_Soft_MultiMaster.f
+
+\ Copyright (C) <2015> <J.M. THOORENS>
+\
+\ This program is free software: you can redistribute it and/or modify
+\ it under the terms of the GNU General Public License as published by
+\ the Free Software Foundation, either version 3 of the License, or
+\ (at your option) any later version.
+\
+\ This program is distributed in the hope that it will be useful,
+\ but WITHOUT ANY WARRANTY\ without even the implied warranty of
+\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+\ GNU General Public License for more details.
+\
+\ You should have received a copy of the GNU General Public License
+\ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+\ I2C MASTER Standard Mode software driver without interrupt, with detection collision
+\ Target: MSP430FR5xxx, tested @ 8,16,24 MHz and adjusted @ 16,24 MHz
+\ SDA = P1.2, SCL = P1.3, with 3k3 pullup resistors
+
+\ version 1.0 2016-04-10
+
+WIPE
+\ ========================================================================================================
+\ ========================================================================================================
+
+\ ### ##### ##### ##### # # # #
+\ # # # # # # # #### ###### ##### ## ## ## ## ## #### ##### ###### #####
+\ # # # # # # # # # # # # # # # # # # # # # # #
+\ # ##### # ##### # # ##### # # # # # # # # # #### # ##### # #
+\ # # # # # # # # # # # # ###### # # # #####
+\ # # # # # # # # # # # # # # # # # # # # # #
+\ ### ####### ##### ##### #### # # # # # # # # #### # ###### # #
+
+\ ========================================================================================================
+\ ========================================================================================================
+
+\ P1.2 = SDA, P1.3 = SCL
+\ use Px.0 to Px.3 for good timing at 8 MHz (immediate addressing is less of one cycle)
+
+\ tested with P1.6 SDA, P1.7 SCL @ 8MHz :
+\ Start + Adr + Write 3 bytes + Stop + Start + adr + read 2 bytes + stop = 628us ==> 100 kHz
+\ See MSP430FR5xxx_I2C_Soft_MultiMaster.png
+
+VARIABLE I2CS_ADR \ low(I2CS_ADR) = slave I2C address with RW flag, high(I2CS_ADR) = RX buffer,data0
+2 ALLOT \ data1,data2
+VARIABLE I2CM_BUF \ low(I2CM_BUF) = RX or TX lentgh, high(I2CM_BUF) = TX buffer,data0
+2 ALLOT \ data1,data2
+ \
+
+\ ------------------------------\
+ASM T_I2C \ 4 init first once !!!
+\ ------------------------------\
+BEGIN \ 3~ loop
+ SUB #1,Y \ 1
+0= UNTIL \ 2
+ MOV #1,Y \ 2 set I2C tHIGH time @ 8MHz
+\ MOV #9,Y \ 2 set I2C tHIGH time @ 16MHz
+\ MOV #20,Y \ 2 set I2C tHIGH time @ 24MHz
+ MOV @RSP+,PC \ 4 ret
+ENDASM \
+ \
+
+
+\ ------------------------------\
+ASM I2C_PLS \ SCL Pulse
+\ ------------------------------\
+ CALL #R11_I2C \ _ wait tLOW
+ BIC.B #SMMSCL,&I2CSMM_DIR \ _^ release SCL (high)
+ BEGIN
+ BIT.B #SMMSCL,&I2CSMM_IN \ test if SCL is released
+ 0<> UNTIL
+ CALL #R11_I2C \ wait tHIGH
+ MOV.B &I2CSMM_IN,Y \ 3
+ BIT.B #SMMSDA,Y \ _ get SDA
+ BIS.B #SMMSCL,&I2CSMM_DIR \ v_ force SCL low
+ MOV @RSP+,PC \ ret
+ENDASM \
+ \
+
+\ ------------------------------\
+ASM I2C_BTX \ MASTER TX \ one bit shared code for address and TX data
+\ ------------------------------\
+ ADD.B X,X \ 1 l shift one left
+ U>= IF \ 2 l carry set ?
+ BIC.B #SMMSDA,&I2CSMM_DIR \ 4 l yes : SDA as input ==> SDA high because pull up resistor
+ ELSE \ 2 l
+ BIS.B #SMMSDA,&I2CSMM_DIR \ 4 l no : SDA as output ==> SDA low
+ THEN \ l _
+ JMP I2C_PLS \ SCL _| |_ pulse
+ENDASM \
+ \
+
+\ ==================================\
+ASM I2C_MM \ soft I2C_MultiMaster driver
+\ ==================================\
+\ \ in : I2CS_ADR pointer
+\ \ : I2CM_BUF pointer
+\ \ used: S datas pointer
+\ \ T count of I2C datas exchanged
+\ \ W count of bits
+\ \ X data
+\ \ Y I2C_time
+\ \ SR(10) collision flag
+\ \ out : I2CS_ADR(0) unchanged
+\ \ I2CM_BUF(0) = count of data not exchanged (normally = 0)
+\ \ I2CM_BUF(0) = -1 <==> Nack on address
+\ ----------------------------------\
+\ I2CMM_Stop_UCBxI2CSlave \ if SDA SCL of I2C_MultiMaster are hard wired onto SDA SCL of I2C_Slave under interrupt...
+\ ----------------------------------\
+\ BIS #1,&UCB0CTLW0 \ set eUSCI_B0 in reset state, reset StartCond int in UCB0IFG
+\ BIC.B #I2CM_BUS,&I2CSMM_SEL1 \ disable I2C I/O
+\ ----------------------------------\
+\ I2C_MR_DC_ListenBeforeStart: \ test if SCL & SDA lines are idle (high)
+\ ----------------------------------\
+BEGIN \
+ BIC.B #SMM_BUS,&I2CSMM_DIR \ SDA & SCL pins as input
+ BIC.B #SMM_BUS,&I2CSMM_OUT \ preset output LOW for SDA & SCL pins
+ MOV #2,T \ I2C_MR_DC_Wait_Start_Loop = 8 µs @ 8 MHz
+\ MOV #4,T \ I2C_MR_DC_Wait_Start_Loop = 8 µs @ 16 MHz
+\ MOV #6,T \ I2C_MR_DC_Wait_Start_Loop = 8 µs @ 24 MHz
+ BEGIN \
+ BEGIN \
+ BEGIN \
+ BIT.B #SMMSCL,&I2CSMM_IN \ 4 P1DIR.3 SCL high ?
+ 0<> UNTIL \ 2
+ BIT.B #SMMSDA,&I2CSMM_IN \ 4 P1IN.2 SDA high ?
+ 0<> UNTIL \ 2
+ SUB #1,T \ 1
+ 0= UNTIL \ 2 here the I2C bus is idle
+\ --------------------------------\
+\ I2CMR_DC_Shutdown_Slave_Int \ if SDA SCL of I2C_MultiMaster are hard wired onto SDA SCL of I2C_Slave under interrupt...
+\ --------------------------------\
+\ BIS #1,&$640 \ ...set eUSCI_B0 in reset state, that allows I/O use for SDA & SCL...
+\ BIC.B #SMM_BUS,&PI2CSSEL1 \ disable I2C I/O
+\ --------------------------------\
+\ I2C_Master_Start_Cond: \ here, SDA and SCL are in idle state
+\ --------------------------------\
+ BIS.B #SMMSDA,&I2CSMM_DIR \ 4- force SDA output (low)
+ MOV #I2CS_ADR,S \ 2 l
+ MOV.B @S+,X \ 3 l X = slave address, S = RX buffer
+ MOV #I2CM_BUF,W \ 2 l
+ MOV.B @W+,T \ 2 l T = count of datas, W = TX buffer
+ ADD.B #1,T \ to include address in count
+ BIT.B #1,X \ 1 l test I2C R/w flag
+ 0= IF \ 2 l write flag
+ MOV W,S \ 3 l TX buffer
+ THEN \
+ MOV #5,Y \ 2 tHD\STA time 8 MHz complement
+\ MOV #14,Y \ 2 tHD\STA time 16MHz complement
+\ MOV #25,Y \ 2 tHD\STA time 24MHz complement
+ CALL #R11_I2C \ wait 4 us
+ BIS.B #SMMSCL,&I2CSMM_DIR \ 4- force SCL output (low)
+\ --------------------------------\
+\ I2C_Master_Start_EndOf: \
+\ --------------------------------\
+\ I2C_Master_Send_address \
+\ --------------------------------\
+ BIC #$0400,SR \ 2 reset detection collision SR(10) flag
+ MOV.B #8,W \ 1 l prepare 8 bit Master writing
+ BEGIN \
+ MOV #1,Y \ 2 tHD\STA time =8MHz complement
+\ MOV #2,Y \ 2 tHD\STA time =16MHz complement
+\ MOV #13,Y \ 2 tHD\STA time =24MHz complement
+ CALL #I2C_BTX \ l send one bit
+\ ----------------------------\
+\ collision detection \
+\ ----------------------------\
+ XOR.B &I2CSMM_DIR,Y \ 3 normal : IN(SMMSDA) XOR DIR(SMMSDA) = 1
+ BIT.B #SMMSDA,Y \ 2 collision : IN(SMMSDA=0) XOR DIR(SMMSDA=0) = 0
+ 0= IF BIS #$0402,SR \ 6 set collision detection flag SR(10) and set Z=1 to force end of loop
+ ELSE SUB #1,W \ 3 dec count of bits
+ THEN \
+ 0= UNTIL \ 2
+ BIT #$0400,SR \ 2 collision ?
+0= UNTIL \ 2 loop back if collision during send address
+BIC.B #SMMSDA,&I2CSMM_DIR \ 5 release SDA high before 9th bit
+\ ----------------------------------\
+\ I2C_Master_Loop \
+\ ----------------------------------\
+BEGIN
+\ --------------------------------\
+\ Master TX/RX ACK/NACK \
+\ --------------------------------\
+ MOV #1,Y \ 2 tLOW time complement @ 8MHz
+\ MOV #7,Y \ 2 tLOW time complement @ 16MHz
+\ MOV #18,Y \ 2 tLOW time complement @ 24MHz
+ CALL #I2C_PLS \ _| |_ SCL pulse with SDA bit test
+ 0<> IF BIS #2,SR \ l if Nack, force Z=1 ==> StopCond
+ ELSE SUB.B #1,T \ else dec count
+ THEN \ l
+\ --------------------------------\
+\ I2C_Master_CheckCountDown \ count=0 or Nack received
+\ --------------------------------\
+ 0= IF \ count reached or Nack
+\ --------------------------------\
+\ I2C_Master_StopCond \
+\ --------------------------------\ before releasing SCL
+ BIS.B #SMMSDA,&I2CSMM_DIR \ l force SDA low
+ MOV #1,Y \ 2 l tLOW time complement @ 8MHz
+\ MOV #7,Y \ 2 tLOW time complement @ 16MHz
+\ MOV #18,Y \ 2 tLOW time complement @ 24MHz
+ CALL #R11_I2C \ _ wait 4 us
+ BIC.B #SMMSCL,&I2CSMM_DIR \ _| release SCL (high with pull up resistor)
+ SUB.B T,&I2CM_BUF \ 4 refresh buffer length
+ MOV #5,Y \ 2 tSU:STO time 8 MHz complement
+\ MOV #15,Y \ 2 tSU:STO time 16MHz complement
+\ MOV #25,Y \ 2 tSU:STO time 24MHz complement
+ CALL #R11_I2C \ _ wait tSU:STO
+ BIC.B #SMMSDA,&I2CSMM_DIR \ _| release SDA (high with pull up resistor)
+\ ----------------------------\
+\ I2C_Master_Endof \
+\ ----------------------------\
+\ Restart I2C_Slave_Int \ if any
+\ ----------------------------\
+\ BIC #1,&UCB0CTLW0 \ restart eUSCI_B
+\ BIS.B #SMM_BUS,&I2CSMM_SEL1 \ reenable I2C I/O
+\ ----------------------------\
+ MOV @RSP+,PC \ ====>
+\ --------------------------------\
+ THEN \
+\ --------------------------------\
+ MOV.B #8,W \ 1 l prepare 8 bits transaction
+ BIT.B #1,&I2CS_ADR \ 3 l I2C_Master Read/write bit test
+ 0= IF \ 2 l write flag test
+\ ============================\
+\ I2C_Master_TX \
+\ ============================\
+ MOV.B @S+,X \ 2 l next byte to TX
+ BEGIN \
+ MOV #1,Y \ 2 tHD\STA time =8MHz complement
+\ MOV #2,Y \ 2 tHD\STA time =16MHz complement
+\ MOV #13,Y \ 2 tHD\STA time =24MHz complement
+ CALL #I2C_BTX \ l send one bit
+ SUB.B #1,W \ l count of bits
+ 0= UNTIL \ l
+ BIC.B #SMMSDA,&I2CSMM_DIR \ 5 l release SDA high before 9th bit
+ ELSE \ l
+\ ============================\
+\ I2C_Master_RX: \ here, SDA is indetermined, SCL is strech low by master
+\ ============================\
+ BIC.B #SMMSDA,&I2CSMM_DIR \ 5 l _ After ACK we must release SDA
+ BEGIN \
+ MOV #3,Y \ 2 tLOW time complement @ 8 MHz
+\ MOV #15,Y \ 2 tLOW time complement @ 16MHz
+\ MOV #24,Y \ 2 tLOW time complement @ 24MHz
+ CALL #I2C_PLS \ _| |_ SCL pulse with SDA bit test
+ ADDC.B X,X \ 1 l C <-- X <--- C ; C flag = SDA
+ SUB #1,W \ 1 l count of bits
+ 0= UNTIL \ 2 l
+ MOV.B X, 0(S) \ 3 l store RX byte in buffer
+ ADD #1,S \ 1 l
+\ ----------------------------\
+\ Compute RX Ack/Nack \
+\ ----------------------------\
+ CMP #1,T \ 1 l here, SDA is released by slave = Nack
+ 0<> IF \ 2
+ BIS.B #SMMSDA,&I2CSMM_DIR \ 4 l send Ack if byte count <> 1
+ THEN \ l
+ THEN \
+AGAIN \ l
+ENDASM \
+ \
+
+\ ------------------------------\
+CODE START \
+\ ------------------------------\
+\ init PORTA (P2:P1) (complement) when reset occurs all I/O are set in input with resistors pullup
+BIC.B #SMM_BUS,&I2CSMM_OUT \ preset SDA + SCL output low
+BIC.B #SMM_BUS,&I2CSMM_REN \ SDA + SCL pullup/down disable
+\ ------------------------------\
+ LO2HI
+ ." Type STOP to stop :-)"
+ LIT recurse is WARM \ insert this routine between COLD and WARM...
+ (WARM) ; \ ...and continue with WARM
+ \
+
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+RST_HERE
+
+\ ---------------------------------------------------------------------------------------------------------------------\
+\ SCL clock generation, timing, and test of data(s) number are made by I2C_Master.
+\ slave can strech SCL low after Start Condition and after any bit.
+
+\ address Ack/Nack is generated by the slave on SDA line (released by the master)
+\ Two groups of eight addresses (000xxxy and 1111xxxy) are not allowed (reserved)
+\ after address or data is sent, the transmitter (Master or Slave) must release SDA line to allow (N)Ack by the receiver
+\ data Ack/Nack are generated by the receiver (master or slave) on SDA line
+\ a master receiver must signal the end of data to the slave transmitter by sending a Nack bit
+\ Stop or restart conditions must be generated by master after a Nack bit.
+\ after Ack bit is sent, Slave must release SDA line to allow master to do stop or restart conditions
+\
+\ __ _____ _____ _..._ _____ _____ _NACK _____ _____ _..._ _____ _____ _NACK _
+\ SDA \____/_MSB_X_____X_..._X_LSB_X_R/Wx_ACK_x_MSB_X_____X_..._X_____X_LSB_X_ACK_X___/
+\ _____ _ _ _ _ _ _ _ _ _ _ ___
+\ SCL \___/1\___/2\___...___/7\___/8\___/9\___/1\___/2\___...___/7\___/8\___/9\___/
+\ ^ ^ ^ ^ ^ ^ ^
+\ | |Slave Stretch Low |SSL |SSL |SSL |SSL |
+\ | |
+\ |Start Condition |stoP Condition
+\
+\ __ _____ _____ _..._ _____ _____ _NACK _____ _____ _..._ _____ _____ _NACK ___
+\ SDA \____/_MSB_X_____X_..._X_LSB_X_R/W_x_ACK_x_MSB_X_____X_..._X_____X_LSB_X_ACK_X \____...
+\ _____ _ _ _ _ _ _ _ _ _ _ ____
+\ SCL \___/1\___/2\___...___/7\___/8\___/9\___/1\___/2\___...___/7\___/8\___/9\___/ \_...
+\ ^ ^ ^ ^ ^ ^ ^
+\ | |Slave Stretch Low |SSL |SSL |SSL |SSL |
+\ | |
+\ |Start Condition |reStart Condition
+\
+\ tHIGH : SCL high time
+\ tLOW : SCL low time
+\ tBUF : SDA high time between Stop and Start conditions
+\ tHD:STA : Start_Condition SCL high time after SDA is low
+\ tSU:STO : Stop_Condition SCL high time before SDA rise
+\ tSU:STA : Start_Condition SCL high time before SDA fall
+\ tHD:DAT : SDA data change time after SCL is low
+\ the SDA line must be strobe just after SCL is high
+\ the SDA data must be change just after SCL is low
+\ standard mode (up to 100 kHz) : tHIGH = tHD:STA = tSU:STO = 4µs
+\ tLOW = tSU:STA = tBUF = 4,7µs
+\ tHD:DAT <= 3,45 µs
+\ -------------------------------------------------------------------------------------------------------------------\
--- /dev/null
+\ ---------------
+\ IR_RC5_P1.2.f
+\ ---------------
+RST_STATE \ to rub out this test with <reset> or RST_STATE or COLD
+
+\ Copyright (C) <2014> <J.M. THOORENS>
+\
+\ This program is free software: you can redistribute it and/or modify
+\ it under the terms of the GNU General Public License as published by
+\ the Free Software Foundation, either version 3 of the License, or
+\ (at your option) any later version.
+\
+\ This program is distributed in the hope that it will be useful,
+\ but WITHOUT ANY WARRANTY\ without even the implied warranty of
+\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+\ GNU General Public License for more details.
+\
+\ You should have received a copy of the GNU General Public License
+\ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+\ FORTH driver for IR remote compatible with the PHILIPS RC5 protocol, with select new/repeated command
+\ target : see IR_RC5.pat
+
+\ Send to terminal the RC5 new command.
+\ Press S1 to send also RC5 repeated command.
+
+
+\ HERE \ general minidump, part 1
+
+\ --------------------------------------------------------------------------------------------
+\ MSP-EXP430FR5969 driver for IR_RC5 receiver TSOP32236 wired on Px.y input \ 65 words, 24.5ms
+\ --------------------------------------------------------------------------------------------
+
+\ layout : see config.pat file for defining I/O
+
+\ ******************************\
+ASM RC5_INT \ wake up on Px.RC5 change interrupt
+\ ******************************\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : TOS,IP,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ******************************\
+\ RC5_FirstStartBitHalfCycle: \
+\ ******************************\ division in TA0CTL (SMCLK/1,SMCLK/1,SMCLK/2,SMCLK/4,SMCLK/8)
+\ MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 125kHz, 1MHz, 2MHZ, 4MHZ, 8MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register ( 250kHZ, 2MHz, 4MHZ, 8MHZ, 16MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register ( 375kHz, 3MHz, 6MHZ, 12MHZ, 24MHZ)
+\ MOV #3,&TA0EX0 \ predivide by 4 in TA0EX0 register ( 500kHZ, 4MHz, 8MHZ, 16MHZ)
+\ MOV #4,&TA0EX0 \ predivide by 6 in TA0EX0 register ( 625kHz, 5MHz, 10MHZ, 20MHZ)
+\ MOV #5,&TA0EX0 \ predivide by 6 in TA0EX0 register ( 750kHz, 6MHz, 12MHZ, 24MHZ)
+\ MOV #6,&TA0EX0 \ predivide by 7 in TA0EX0 register ( 875kHz, 7MHz, 14MHZ, 28MHZ)
+\ MOV #7,&TA0EX0 \ predivide by 8 in TA0EX0 register ( 1MHz, 8MHz, 16MHZ, 32MHZ)
+MOV #1778,X \ RC5_Period * 1us
+\ MOV #222,X \ RC5_Period * 8us (SMCLK/1 and first column above)
+MOV #14,W \ count of loop
+BEGIN \
+\ ******************************\
+\ RC5_HalfCycle \ <--- loop back ---+ with readjusted RC5_Period
+\ ******************************\ |
+\ MOV #%1000100100,&TA0CTL \ (re)start timer_A | SMCLK/1 time interval,free running,clear TA0_IFG and TA0R
+\ MOV #%1002100100,&TA0CTL \ (re)start timer_A | SMCLK/2 time interval,free running,clear TA0_IFG and TA0R
+\ MOV #%1010100100,&TA0CTL \ (re)start timer_A | SMCLK/4 time interval,free running,clear TA0_IFG and TA0R
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4 cycle
+ BEGIN CMP Y,&TA0R \3 wait 1/2 + 3/4 cycle = n+1/4 cycles
+ U>= UNTIL \2
+\ ******************************\
+\ RC5_SampleOnFirstQuarter \ at n+1/4 cycles, we sample RC5_input, ST2/C6 bit first
+\ ******************************\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV.B &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+ ADD X,Y \ | Y = n+3/4 cycles = time out because n+1/2 cycles edge is always present
+ BEGIN \ |
+ MOV &TA0R,X \3 | X grows from n+1/4 up to n+3/4 cycles
+ CMP Y,X \1 | cycle time out of bound ?
+ U>= ?GOTO FW1 \2 ^ | yes: quit on truncated RC5 message
+ BIT.B #RC5,&IR_IFG \3 | | n+1/2 cycles edge is always present
+ 0<> UNTIL \2 | |
+REPEAT \ ----> loop back --+ | with X = new RC5_period value
+\ ******************************\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+SUB #2,PSP \
+MOV TOS,0(PSP) \ save TOS before use
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2 A1 A0|C5 C4 C3 C2 C1 C0 1 0
+MOV.B IP,TOS \ TOS = C5 C4 C3 C2 C1 C0 1 0
+RRUM #2,TOS \ TOS = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #BIT14,IP \ test /C6 bit in IP
+0= IF BIS #BIT6,TOS \ set C6 bit in TOS
+THEN \ TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ -- BASE RC5_code
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+RRUM #4,IP \5 new toggle bit = IP(13) ==> IP(9)
+XOR SR,IP \ (new XOR old) Toggle bits
+BIT #UF1,IP \ repeated RC5_command ?
+0= ?GOTO FW2 \ yes, RETI without UF1 change
+\ ******************************\
+XOR #UF1,0(RSP) \ 5 toggle bit memory
+FW2 \ endof repeated RC5_command : RETI without UF1 change
+FW1 \ endof truncated RC5 message
+BIC #$30,&TA0CTL \ stop timer_A0
+BIC #$F8,0(RSP) \ 4 SCG1,SCG0,OSCOFF,CPUOFF and GIE are OFF in retiSR to force LPM0_LOOP despite pending interrupt
+RETI \ 5 for system OFF / 1 sec. ==> 1mA * 5us = 5nC + 6,5uA
+ENDASM
+ \
+
+
+\ ------------------------------
+\ Start process RC5 part
+\ ------------------------------
+\ ------------------------------\
+CODE START \
+\ ------------------------------\
+\ init PORTX (P2:P1) (complement) default I/O are input with pullup resistors
+ BIC.B #RC5,&PIRIFG \ P1IFG.2 clear int flag for TSOP32236 (after IES select)
+ BIS.B #RC5,&PIRIE \ P1IE.2 enable interrupt for TSOP32236
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ init interrupt vectors \
+\ ------------------------------\
+ MOV #INT_RC5,&IR_Vec \ init Px vector interrupt
+\ ------------------------------\
+ LO2HI
+ ." RC5toLCD is running. Type STOP to quit"
+ LIT RECURSE IS WARM \ insert this starting routine between COLD and WARM...
+ (WARM) ; \ ...and continue with WARM (very, very usefull after COLD or RESET !:-)
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+\ HERE OVER - DUMP \ general minidump, part 2
+
+RST_HERE \
+
+
+
+\ --------------------------------------------------\
+\ PHILIPS IR REMOTE RC5/RC6 protocol \
+\ --------------------------------------------------\
+\ first half bit = no light, same as idle state
+\ second half bit : 32 IR-light pulses of 6,944us,light ON/off ratio = 1/3
+
+\ |<------32 IR light pulses = second half of first start bit ------->|
+\ |_ _ _ _ _ _ _ _ _ _ _ _|
+\ ...____| |___| |___| |___| |___| |___| |...| |___| |___| |___| |___| |___| |____________________________________...
+\ | |
+\
+
+
+\ at the output of IR receiver TSOPxxx during the first start bit :
+
+\ ...idle state ->|<----- first half bit ------>|<- second half bit (IR light) ->|
+\ ..._____________|_____________________________| |_________...
+\ | | |
+\ | | |
+\ | |________________________________|
+
+\ 32 cycles of 27,777us (36kHz) = 888,888 us
+\ one bit = 888,888 x 2 = 1778 us.
+
+
+
+\ 14 bits of active message = 24.889 ms
+\ + 50 bits of silent (idle) = 88.888 ms
+\ = RC5 message = 113.792 ms
+
+\
+\ RC5_message on IR LIGHT \ idle state = light off
+
+\ 89ms>|<--------------------------------------------------24.889 ms-------------------------------------------------->|<88,
+\ | |
+\ | | | | | | | | | | | | | | |
+\ | ST1 | ST2/C6| Tog | A4 | A3 | A2 | A1 | A0 | C5 | C4 | C3 | C2 | C1 | C0 |
+\ | | | | | | | | | | | | | | |
+\ 1 1 1 1 0 0 1 1 1 1 1 1 1 1
+\ ___ ___ ___ _______ ___ ___ ___ ___ ___ ___ ___ ___ ___
+\ ^ | ^ | ^ | ^ | | | ^ | ^ | ^ | ^ | ^ | ^ | ^ | ^ |
+\ idle____| |___| |___| |___| v___| v_______| |___| |___| |___| |___| |___| |___| |___| |____
+\
+\
+\ notice that each cycle contains its bit value preceded by its complement
+
+
+
+
+\ the same RC5_message inverted at the output of IR receiver : idle state = 1
+\
+\ | | | | | | | | | | | | | | |
+\ | ST1 | ST2/C6| Tog | A4 | A3 | A2 | A1 | A0 | C5 | C4 | C3 | C2 | C1 | C0 |
+\ | | | | | | | | | | | | | | |
+\ 1 1 1 1 0 0 1 1 1 1 1 1 1 1
+\ idle_____ ___ ___ ___ ___ _______ ___ ___ ___ ___ ___ ___ ___ __idle
+\ | | | | | | | ^ | ^ | | | | | | | | | | | | | | | |
+\ v___| v___| v___| v_______| |___| v___| v___| v___| v___| v___| v___| v___| v___|
+\ I R R R R R R R R R R R R R
+\
+\ notice that each cycle contains its bit value followed by its complement
+
+
+
+
+\ principe of the driver : 13 samples at 1/4 period and Resynchronise (R) on 1/2 period (two examples)
+
+\ 0,888 ms
+\ |<->|<--------------------------------routine time = 12 3/4 cycles = 22.644 ms--------------------------->|
+\ | | | | | | | | | | | | | | | |
+\ | ST1 | ST2/C6| Toggle| A4 | A3 | A2 | A1 | A0 | C5 | C4 | C3 | C2 | C1 | |C0 |
+\ | | | | | | | | | | | | | | | |
+\ 1 1 1 1 0 0 1 1 1 1 1 1 1 | 1
+\ idle_____ _s_ _s_ _s_ ___ _____s_ _s_ _s_ _s_ _s_ _s_ _s_ _s_ __idle
+\ | | | | | | | ^ | ^ | | | | | | | | | | | | | | | |
+\ v___| v___| v___| v_____s_| |_s_| v___| v___| v___| v___| v___| v___| v___| v___|
+\ I R R R R R R R R R R R R ^ ^
+\ samples : 1 2 3 4 5 6 4 8 9 10 11 12 13 | |
+\ | |
+\ I I
+\ 0,888 ms
+\ |<->|<--------------------------------routine time = 12 3/4 cycles = 22.644 ms--------------------------->|
+\ | | | | | | | | | | | | | | | |
+\ | ST1 | ST2/C6| Toggle| A4 | A3 | A2 | A1 | A0 | C5 | C4 | C3 | C2 | C1 | |C0 |
+\ | | | | | | | | | | | | | | | |
+\ 1 1 1 1 0 0 1 1 1 1 1 1 1 | 1
+\ idle_____ _s_ _s_ ___ _o_ _o___s_ _s_ _s_ _s_ _s_ _s_ _s_ ______idle
+\ | | | | | | | ^ | ^ | | | | | | | | | | | | | ^
+\ v___| v_o_| v_o_| v_o___s_| |_s_| v_o_| v_o_| v_o_| v_o_| v_o_| v_o_| v_o___s_|
+\ I R R R R R R R R R R R R ^
+\ samples : 1 2 3 4 5 6 7 8 9 10 11 12 13|
+\ |
+\ i !
+\ good ! but we have too many RC5_Int...
+
+
+
+
+\ So, to avoid these RC5_Int after end : 13+1=14 samples, then the result is shifted one to right (two examples)
+
+\ 0,888 ms
+\ |<->|<--------------------------------routine time = 13 3/4 cycles = 24.447 ms----------------------------------->|
+\ | | | | | | | | | | | | | | | |
+\ | ST1 | ST2/C6| Toggle| A4 | A3 | A2 | A1 | A0 | C5 | C4 | C3 | C2 | C1 | C0 | |
+\ | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | |
+\ | | | | | | | | | | | | | | | |
+\ idle_____ _s_ _s_ _s_ _o_ _o___s_ _s_ _s_ _s_ _s_ _s_ _s_ _s_ _s_idle
+\ | | | | | | | ^ | ^ | | | | | | | | | | | | | | | |
+\ v___| v_o_| v_o_| v_o___s_| |_s_| v_o_| v_o_| v_o_| v_o_| v_o_| v_o_| v_o_| v_o_|
+\ I i R i R i R R i R R i R i R i R i R i R i R i R i
+\ samples : 1 2 3 4 5 6 7 8 9 10 11 12 13 14
+\
+\
+\ 0,888 ms
+\ |<->|<--------------------------------routine time = 13 3/4 cycles = 24.447 ms----------------------------------->|
+\ | | | | | | | | | | | | | | | |
+\ | ST1 | ST2/C6| Toggle| A4 | A3 | A2 | A1 | A0 | C5 | C4 | C3 | C2 | C1 | C0 | |
+\ | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | |
+\ | | | | | | | | | | | | | | | |
+\ idle_____ _s_ _s_ _s_ _o_ _o___s_ _s_ _s_ _s_ _s_ _s_ _s_ _o___s_idle
+\ | | | | | | | ^ | ^ | | | | | | | | | | | | | ^
+\ v___| v_o_| v_o_| v_o___s_| |_s_| v_o_| v_o_| v_o_| v_o_| v_o_| v_o_| v_o___s_|
+\ I i R i R i R R i R R i R i R i R i R i R i R R
+\ samples : 1 2 3 4 5 6 7 8 9 10 11 12 13 14
+
+
+\ S = Wake up on RC5_Int at 1/2 cycle : clear and start timer
+\ I = first interruption
+\ i = useless RC5_Int (not periodic) at 4/4 cycle
+\ s = sample RC5_intput at (1/2+3/4) = 5/4 cycle = n+1/4 cycles and clear useless RC5_Int
+\ R = usefull (periodic) RC5_Int at 6/4 cycle = n+1/2 cycles : cycle value = timer value then clear it and restart it
+\ o = RC5_Int time out at 7/4 cycle = n+3/4 cycles, used to detect (samples<14) truncated RC5_message
+
+\ see also : http://www.sbprojects.com/knowledge/ir/rc5.php
+\ http://laurent.deschamps.free.fr/ir/rc5/rc5.htm
+\ Code RC5 : http://en.wikipedia.org/wiki/RC-5
+
--- /dev/null
+\ IR_RC5_to_I2CF_Soft_Master.f
+
+\ Copyright (C) <2016> <J.M. THOORENS>
+\
+\ This program is free software: you can redistribute it and/or modify
+\ it under the terms of the GNU General Public License as published by
+\ the Free Software Foundation, either version 3 of the License, or
+\ (at your option) any later version.
+\
+\ This program is distributed in the hope that it will be useful,
+\ but WITHOUT ANY WARRANTY\ without even the implied warranty of
+\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+\ GNU General Public License for more details.
+\
+\ You should have received a copy of the GNU General Public License
+\ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+\ --------------------------------------\
+\ example of App running under interrupt
+\ --------------------------------------\
+\ FORTH driver for IR remote compatible with the PHILIPS RC5 protocol, with select new/repeated command
+
+\ target : any MSP430FRxxxx @ 8Mhz
+
+\ prerequisites : your launchpad is wired as described in launchpad.pat file : UART0, Soft_Master(SDA,SCL), IR_RC5 parts.
+\ FastForth runs @ 8MHz
+\ add 3k3 pull up resistors on SDA and SCL lines.
+
+\ usage : create a logical network drive ( a: b: ...as you want) from your local copy of Gitlab FAST FORTH
+\ with scite.exe open this file MSP430-FORTH\IR_RC5_to_I2CF_Soft_Master.f,
+\ select "tools" menu, "preprocess" item 1 (CTRL+0),
+\ a dialog box asks you for 4 parameters $(1) to $(4),
+\ in the 2th param. field, type your launchpad to select the launchpad.pat to be used : for example MSP_EXP430FR5969,
+\ result : the word START starts the app that runs under LPMx.
+
+\ to recover the console input (i.e. to quit LPMx), type a space. Then you can enter a command, for example STOP.
+
+\ select one initial state :
+WIPE \ to suppress any previous app
+\ RST_STATE \ to conserve the previous app protected against <reset>
+\ PWR_STATE \ to conserve the previous app protected against POWER OFF
+NOECHO \ comment if an error occurs, to detect it with new download
+
+\ HERE \ uncomment for a dump, part 1
+ \
+
+
+
+\ -------------------------------------------------------------------------------------------------------------------\
+\ I2CF Soft MASTER driver, FAST MODE, 8MHz
+\ -------------------------------------------------------------------------------------------------------------------\
+
+VARIABLE I2CS_ADR \ low(I2CS_ADR) = slave I2C address with RW flag, high(I2CS_ADR) = RX buffer,data0
+2 ALLOT \ data1,data2
+VARIABLE I2CM_BUF \ low(I2CM_BUF) = RX or TX lentgh, high(I2CM_BUF) = TX buffer,data0
+2 ALLOT \ data1,data2
+ \
+
+\ ------------------------------\
+ASM I2C_MTX \ MASTER TX \ shared code for address and TX data
+\ ------------------------------\
+BEGIN \
+ ADD.B X,X \ 1 l shift one left
+ U>= IF \ 2 l carry set ?
+ BIC.B #MSDA,&I2CSM_DIR \ 4 l yes : SDA as input ==> SDA high because pull up resistor
+ ELSE \ 2 l
+ BIS.B #MSDA,&I2CSM_DIR \ 4 l no : SDA as output ==> SDA low
+ THEN \ l _
+ BIC.B #MSCL,&I2CSM_DIR \ 4 l _^ release SCL (high)
+ BEGIN \ 14/16~l
+ BIT.B #MSCL,&I2CSM_IN \ 3 h test if SCL is released
+ 0<> UNTIL \ 2 h _
+ BIS.B #MSCL,&I2CSM_DIR \ 4 h v_ SCL as output : force SCL low
+ SUB #1,W \ 1 l count of bits
+0= UNTIL \ 2 l
+BIC.B #MSDA,&I2CSM_DIR \ 5 l _ SDA as input : release SDA high to prepare read Ack/Nack
+RET
+ENDASM \
+ \
+
+\ ******************************\
+\ IR_RC5 driver \ IP,S,T,W,X,Y registers are free for use
+\ ******************************\
+ASM INT_RC5 \ wake up on P1.2 change interrupt \ IP,TOS,W,X,Y are free for use
+\ ------------------------------\
+BIC #$F8,0(RSP) \ SCG1,SCG0,OSCOFF,CPUOFF and GIE are OFF in retiSR to force LPMx_LOOP with pending interrupt
+\ BIC #$B8,0(RSP) \ {SCG1,OSCOFF,CPUOFF,GIE}=OFF after RETI to force goto label "LPMx_LOOP" with any pending interrupt
+\ ------------------------------\
+\ define LPM mode for ACCEPT \ uncomment a line
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ \ in : SR(9)=old Toggle bit memory (ADD on)
+\ \ SMclock = 8|16|24 MHz
+\ \ use : IP,TOS,W,X,Y, TA0 timer, TA0R register
+\ \ out : TOS = 0 C6 C5 C4 C3 C2 C1 C0
+\ \ SR(9)=new Toggle bit memory (ADD on)
+\ ------------------------------\
+\ RC5_FirstStartBitHalfCycle: \
+\ ------------------------------\
+MOV #0,&TA0EX0 \ predivide by 1 in TA0EX0 register ( 8 MHZ), reset value
+\ MOV #1,&TA0EX0 \ predivide by 2 in TA0EX0 register (16 MHZ)
+\ MOV #2,&TA0EX0 \ predivide by 3 in TA0EX0 register (24 MHZ)
+MOV #1778,X \ RC5_Period in us
+MOV #14,W \ count of loop
+BEGIN \
+\ ------------------------------\
+\ RC5_TopSynchro: \ <--- loop back ---+ with readjusted RC5_Period
+\ ------------------------------\ | here, we are just after 1/2 RC5_cycle
+ MOV #%1011100100,&TA0CTL \ (re)start timer_A | SMCLK/8 : 2us time interval,free running,clear TA0_IFG and TA0R
+\ RC5_Compute_3/4_Period: \ |
+ RRUM #1,X \ X=1/2 cycle |
+ MOV X,Y \ Y=1/2 ^
+ RRUM #1,Y \ Y=1/4
+ ADD X,Y \ Y=3/4
+\ RC5_Wait_1_1/4 \ wait 3/4 cycle after 1/2 cycle to sample RC5_Input at 1/4 cycle+1
+ BEGIN CMP Y,&TA0R \ CMP &TA0R with 3/4 cycle value
+ 0= UNTIL \
+\ ------------------------------\
+\ RC5_Sample: \ at 5/4 cycle, we can sample RC5_input, ST2/C6 bit first
+\ ------------------------------\
+ BIT.B #RC5,&IR_IN \ C_flag = IR bit
+ ADDC IP,IP \ C_flag <-- IP(15):IP(0) <-- C_flag
+ MOV &IR_IN,&IR_IES \ preset Px_IES.y state for next IFG
+ BIC.B #RC5,&IR_IFG \ clear Px_IFG.y after 4/4 cycle pin change
+ SUB #1,W \ decrement count loop
+\ \ count = 13 ==> IP = x x x x x x x x |x x x x x x x /C6
+\ \ count = 0 ==> IP = x x /C6 Tg A4 A3 A2 A1|A0 C5 C4 C3 C2 C1 C0 1
+0<> WHILE \ ----> out of loop ----+
+\ RC5_compute_7/4_Time_out: \ |
+ ADD X,Y \ | out of bound = 7/4 period
+\ RC5_WaitHalfCycleP1.2_IFG: \ |
+ BEGIN \ |
+ CMP Y,&TA0R \ | TA0R = 5/4 cycle test
+ 0>= IF \ | if cycle time out of bound
+ BIC #$30,&TA0CTL \ | stop timer_A0
+ RETI \ | then quit to do nothing
+ THEN \ |
+\ ------------------------------\ |
+ BIT.B #RC5,&IR_IFG \ ^ | test P1.2_IFG
+ 0<> UNTIL \ | |
+ MOV &TA0R,X \ | | get new RC5_period value
+REPEAT \ ----> loop back --+ |
+\ ------------------------------\ |
+\ RC5_SampleEndOf: \ <---------------------+
+\ ------------------------------\
+MOV #$30,&TA0CTL \ stop timer_A0
+RLAM #1,IP \ IP = x /C6 Tg A4 A3 A2|A1 A0 C5 C4 C3 C2 C1 C0 1 0
+\ ******************************\
+\ Only New_RC5_Command ADD_ON \ use SR(9) bit as toggle bit
+\ ******************************\
+MOV @RSP,X \ retiSR(9) = old RC5 toggle bit
+RLAM #4,X \ retiSR(11,10,9)= X(11,10,9) --> X(15,14,13)
+XOR IP,X \ (new XOR old) Toggle bit (13)
+BIT #BIT13,X \ X(13) = New_RC5_command
+0= IF
+ RETI \ case of repeated RC5_command : RETI without SR(9) change
+THEN \
+XOR #UF1,0(RSP) \ change Toggle bit memory, User Flag 1 = SR(9)
+\ ******************************\
+\ RC5_ComputeNewRC5word \
+\ ******************************\
+MOV.B IP,S \ S = C5 C4 C3 C2 C1 C0 0 0
+RRUM #2,S \ S = 0 0 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_ComputeC6bit \
+\ ******************************\
+BIT #BIT14,IP \ test /C6 bit in IP
+0= IF
+ BIS #BIT6,S \ set C6 bit in S
+THEN \ S = 0 C6 C5 C4 C3 C2 C1 C0
+\ ******************************\
+\ RC5_CommandByteIsDone \ RC5_code --
+\ ******************************\
+\ ------------------------------\
+\ Prepare I2C_MASTER \
+\ ------------------------------\
+SWPB S \ 1 high byte = data
+ADD #1,S \ 1 low byte = count
+MOV S,&I2CM_BUF \ 3
+MOV #%0010100,&I2CS_ADR \ MSP-EXP430FRxxx I2C slave address
+\ ------------------------------\
+\ echo code to terminal option \
+\ ------------------------------\
+\ SUB #2,PSP
+\ MOV TOS,0(PSP)
+\ MOV.B S,TOS
+\ LO2HI
+\ cr ." $" HEX 2 U.R
+\ HI2LO
+
+\ ==================================\
+\ CODE I2C_M \ fast I2C soft Master, only 8 MHz
+\ ==================================\
+\ \ in I2CS_ADR/I2CM_BUF as RX/TX buffer requested by I2CS_ADR(0(0))
+\ \ I2CS_ADR(0) = I2C_Slave_addr&R/w
+\ \ I2CM_BUF(0) = TX/RX count of datas
+\ \ I2CM_BUF(0) = 0 ==> send only I2C address
+\ \ used S BUF ptr
+\ \ T datas countdown
+\ \ W bits countdown
+\ \ X data
+\ \ out I2CSLA_ADR & (R/W) unCHNGd
+\ \ S = BUF PTR pointing on first data not exCHNGd
+\ \ T = count+1 of TX/RX datas exCHNGd
+\ \ I2CS_ADR(0) = unCHNGd
+\ \ I2CM_BUF(0) = count of data not exCHNGd (normally = 0)
+\ \ I2CM_BUF(0) = -1 <==> Nack on address
+\ ----------------------------------\
+\ I2C_MR_DC_ListenBeforeStart: \ test if SCL & SDA lines are idle (high)
+\ ----------------------------------\
+BIC.B #M_BUS,&I2CSM_DIR \ SDA & SCL pins as input
+BIC.B #M_BUS,&I2CSM_OUT \ preset output LOW for SDA & SCL pins
+MOV #2,T \ I2C_MR_DC_Wait_Start_Loop = 8 µs @ 8 MHz
+\ MOV #4,T \ I2C_MR_DC_Wait_Start_Loop = 8 µs @ 16 MHz
+\ MOV #6,T \ I2C_MR_DC_Wait_Start_Loop = 8 µs @ 24 MHz
+BEGIN \
+ BEGIN \
+ BEGIN \
+ BIT.B #MSCL,&I2CSM_IN \ 4 P1DIR.3 SCL high ?
+ 0<> UNTIL \ 2
+ BIT.B #MSDA,&I2CSM_IN \ 4 P1IN.2 SDA high ?
+ 0<> UNTIL \ 2
+ SUB #1,T \ 1
+0= UNTIL \ 2 here the I2C bus is idle
+\ ----------------------------------\
+\ I2C_Master_Start_Cond: \ here, SDA and SCL are in idle state
+\ ----------------------------------\
+BIS.B #MSDA,&I2CSM_DIR \ 4 l force SDA as output (low)
+MOV #I2CM_BUF,W \ 2 h W=buffer out
+MOV.B @W+,T \ 2 h T=datas countdown
+MOV #I2CS_ADR,S \ 2 h S=buffer in
+MOV.B @S+,X \ 2 h X=Slave address to TX
+BIT.B #1,X \ 1 h test I2C R/w flag
+0= IF \ 2 h if write
+ MOV W,S \ 2 h S= buffer out ptr
+THEN \ S= buffer ptr
+BIS.B #MSCL,&I2CSM_DIR \ 4 h force SCL as output (low)
+\ ----------------------------------\
+\ I2C_Master_Start_EndOf: \
+\ ----------------------------------\
+\ I2C_Master_Send_address \ may be SCL is held low by slave
+\ ----------------------------------\
+ADD #1,T \ 1 l to add address in count
+MOV #8,W \ 1 l prepare 8 bit Master writing
+CALL #I2C_MTX \ 21 l to send address
+\ ----------------------------------\
+\ I2C_Master_Loop_Data \
+\ ----------------------------------\
+BEGIN \ 4 l here ack/nack is received/transmitted
+\ --------------------------------\ l
+\ Master TX/RX ACK/NACK \
+\ --------------------------------\ l _
+ BIC.B #MSCL,&I2CSM_DIR \ 3 l _^ release SCL (high)
+ BEGIN \
+ BIT.B #MSCL,&I2CSM_IN \ 3 h test if SCL is released
+ 0<> UNTIL \ 2 h
+ BIT.B #MSDA,&I2CSM_IN \ 3 h _ get SDA
+ BIS.B #MSCL,&I2CSM_DIR \ 3 h v_ SCL as output : force SCL low
+\ --------------------------------\ l
+\ I2C_Master_Loop_Data \
+\ --------------------------------\
+ 0<> IF BIS #Z,SR \ 5 l if Nack (TX), force Z=1 ==> StopCond
+ ELSE SUB.B #1,T \ 3 l else dec count
+ THEN \ l
+\ --------------------------------\
+\ I2C_Master_CheckCountDown \ count=0 (TX) or Nack received
+\ --------------------------------\
+ 0= IF \ 2 l send stop
+\ ----------------------------\
+\ Send Stop \
+\ ----------------------------\ _
+ BIS.B #MSDA,&I2CSM_DIR \ 4 l v_ SDA as output ==> SDA low
+ SUB.B T,&I2CM_BUF \ 4 l _ refresh buffer length and reach tSU:STO
+ BIC.B #MSCL,&I2CSM_DIR \ 4 l _^ release SCL (high)
+ BEGIN \
+ BIT.B #MSCL,&I2CSM_IN \ 3 h SCL released ?
+ 0<> UNTIL \ 2 h
+ BIC.B #MSDA,&I2CSM_DIR \ 4 h _^ SDA as input ==> SDA high with pull up resistor
+\ MOV @RSP+,PC \ RET ====>
+ RETI \
+ THEN \
+ MOV.B #8,W \ 1 l prepare 8 bits transaction
+ BIT.B #1,&I2CS_ADR \ 3 l I2C_Master Read/write bit test
+ 0= IF \ 2 l write flag test
+\ ============================\
+\ I2C_Master_TX \
+\ ============================\
+ MOV.B @S+,X \ 2 l next byte to transmit
+ CALL #I2C_MTX \ l to send data
+ ELSE \ l
+\ ============================\
+\ I2C_Master_RX: \ here, SDA is indetermined, SCL is strech low by master
+\ ============================\
+ BIC.B #MSDA,&I2CSM_DIR \ 5 l _ After ACK we must release SDA
+ BEGIN \
+\ ------------------------\ _
+\ send bit \ SCL _| |_
+\ ------------------------\ _
+ BIC.B #MSCL,&I2CSM_DIR \ 4 l _^ release SCL (high)
+ BEGIN \ 14/16~l
+ BIT.B #MSCL,&I2CSM_IN \ 3 h test if SCL is released
+ 0<> UNTIL \ 2 h
+ BIT.B #MSDA,&I2CSM_IN \ 4 h _ get SDA
+ BIS.B #MSCL,&I2CSM_DIR \ 4 h v_ SCL as output : force SCL low 13~
+ ADDC.B X,X \ 1 l C <-- X <--- C
+ SUB #1,W \ 1 l count of bits
+ 0= UNTIL \ 2 l
+ MOV.B X,0(S) \ 3 l store byte in buffer
+ ADD #1,S \ 1 l
+\ ----------------------------\
+\ Compute Ack Or Nack \ here, SDA is released by slave, SCL is strech low by master
+\ ----------------------------\
+ CMP.B #1,T \
+ 0<> IF \ 2 l
+ BIS.B #MSDA,&I2CSM_DIR \ 5 l yes : send Ack
+ THEN \
+ THEN \
+AGAIN \ 2 l
+ENDASM \
+ \
+
+
+\ ------------------------------\
+CODE START \
+\ ------------------------------\
+\ init PORT M_BUS (complement) \ when reset occurs all I/O are set in input with resistors pullup
+BIC.B #M_BUS,&I2CSM_OUT \ preset SDA + SCL output low
+BIC.B #M_BUS,&I2CSM_REN \ SDA + SCL pullup/down disable
+\ ------------------------------\
+\ init PORT IR (complement) default I/O are input with pullup resistors
+BIS.B #RC5,&IR_IE \ enable interrupt for TSOP32236
+BIC.B #RC5,&IR_IFG \ clear int flag for TSOP32236
+\ ------------------------------\
+\ init interrupt vectors \
+\ ------------------------------\
+MOV #INT_RC5,&IR_Vec \ init IR vector interrupt
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+LO2HI
+." RC5toI2CF_Master is running. Type STOP to quit"
+\ NOECHO \ uncomment to run this app without terminal connexion
+LIT RECURSE IS WARM \ insert this starting routine between COLD and WARM...
+(WARM) ; \ ...and continue with WARM (very, very usefull after COLD or RESET !:-)
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+ECHO
+
+\ DUP HERE SWAP - DUMP \ uncomment for a dump, part 2
+ \
+
+\ select one end state :
+RST_HERE \ this app is protected against POWER OFF, <reset>, COLD, ...and STOP that executes COLD.
+\ PWR_HERE \ this app is protected only againt POWER OFF
+\ nothing \ this app is volatile !
+
+
+\ all lines beyond START command are ignored
+
+\ --------------------------------------------------\
+\ PHILIPS IR REMOTE RC5/RC6 protocol \
+\ --------------------------------------------------\
+\ first half bit = no light, same as idle state
+\ second half bit : 32 IR-light pulses of 6,944us,light ON/off ratio = 1/3
+
+\ |<------32 IR light pulses = second half of first start bit ------->|
+\ |_ _ _ _ _ _ _ _ _ _ _ _|
+\ ...____| |___| |___| |___| |___| |___| |...| |___| |___| |___| |___| |___| |____________________________________...
+\ | |
+\
+
+
+\ at the output of IR receiver TSOPxxx during the first start bit :
+
+\ ...idle state ->|<----- first half bit ------>|<- second half bit (IR light) ->|
+\ ..._____________|_____________________________| |_________...
+\ | | |
+\ | | |
+\ | |________________________________|
+
+\ 32 cycles of 27,777us (36kHz) = 888,888 us
+\ one bit = 888,888 x 2 = 1778 us.
+
+
+
+\ 14 bits of active message = 24.889 ms
+\ + 50 bits of silent (idle) = 88.888 ms
+\ = RC5 message = 113.792 ms
+
+\
+\ RC5_message on IR LIGHT \ idle state = light off
+
+\ 89ms>|<--------------------------------------------------24.889 ms-------------------------------------------------->|<88,
+\ | |
+\ | | | | | | | | | | | | | | |
+\ | ST1 | ST2/C6| Tog | A4 | A3 | A2 | A1 | A0 | C5 | C4 | C3 | C2 | C1 | C0 |
+\ | | | | | | | | | | | | | | |
+\ 1 1 1 1 0 0 1 1 1 1 1 1 1 1
+\ ___ ___ ___ _______ ___ ___ ___ ___ ___ ___ ___ ___ ___
+\ ^ | ^ | ^ | ^ | | | ^ | ^ | ^ | ^ | ^ | ^ | ^ | ^ |
+\ idle____| |___| |___| |___| v___| v_______| |___| |___| |___| |___| |___| |___| |___| |____
+\
+\
+\ notice that each cycle contains its bit value preceded by its complement
+
+
+
+
+\ the same RC5_message inverted at the output of IR receiver : idle state = 1
+\
+\ | | | | | | | | | | | | | | |
+\ | ST1 | ST2/C6| Tog | A4 | A3 | A2 | A1 | A0 | C5 | C4 | C3 | C2 | C1 | C0 |
+\ | | | | | | | | | | | | | | |
+\ 1 1 1 1 0 0 1 1 1 1 1 1 1 1
+\ idle_____ ___ ___ ___ ___ _______ ___ ___ ___ ___ ___ ___ ___ __idle
+\ | | | | | | | ^ | ^ | | | | | | | | | | | | | | | |
+\ v___| v___| v___| v_______| |___| v___| v___| v___| v___| v___| v___| v___| v___|
+\ I R R R R R R R R R R R R R
+\
+\ notice that each cycle contains its bit value followed by its complement
+
+
+
+
+\ principe of the driver : 13 samples at 1/4 period and Resynchronise (R) on 1/2 period (two examples)
+
+\ 0,888 ms
+\ |<->|<--------------------------------routine time = 12 3/4 cycles = 22.644 ms--------------------------->|
+\ | | | | | | | | | | | | | | | |
+\ | ST1 | ST2/C6| Toggle| A4 | A3 | A2 | A1 | A0 | C5 | C4 | C3 | C2 | C1 | |C0 |
+\ | | | | | | | | | | | | | | | |
+\ 1 1 1 1 0 0 1 1 1 1 1 1 1 | 1
+\ idle_____ _s_ _s_ _s_ ___ _____s_ _s_ _s_ _s_ _s_ _s_ _s_ _s_ __idle
+\ | | | | | | | ^ | ^ | | | | | | | | | | | | | | | |
+\ v___| v___| v___| v_____s_| |_s_| v___| v___| v___| v___| v___| v___| v___| v___|
+\ S R R R R R R R R R R R R ^ ^
+\ samples : 1 2 3 4 5 6 4 8 9 10 11 12 13 | |
+\ | |
+\ I I
+\ 0,888 ms
+\ |<->|<--------------------------------routine time = 12 3/4 cycles = 22.644 ms--------------------------->|
+\ | | | | | | | | | | | | | | | |
+\ | ST1 | ST2/C6| Toggle| A4 | A3 | A2 | A1 | A0 | C5 | C4 | C3 | C2 | C1 | |C0 |
+\ | | | | | | | | | | | | | | | |
+\ 1 1 1 1 0 0 1 1 1 1 1 1 1 | 1
+\ idle_____ _s_ _s_ ___ _o_ _o___s_ _s_ _s_ _s_ _s_ _s_ _s_ ______idle
+\ | | | | | | | ^ | ^ | | | | | | | | | | | | | ^
+\ v___| v_o_| v_o_| v_o___s_| |_s_| v_o_| v_o_| v_o_| v_o_| v_o_| v_o_| v_o___s_|
+\ S R R R R R R R R R R R R ^
+\ samples : 1 2 3 4 5 6 7 8 9 10 11 12 13|
+\ |
+\ I
+\ good ! but we have too many of RC5_Int...
+
+
+
+
+\ So, to avoid these RC5_Int after end : 13+1=14 samples, then the result is shifted one to right (two examples)
+
+\ 0,888 ms
+\ |<->|<--------------------------------routine time = 13 3/4 cycles = 24.447 ms----------------------------------->|
+\ | | | | | | | | | | | | | | | |
+\ | ST1 | ST2/C6| Toggle| A4 | A3 | A2 | A1 | A0 | C5 | C4 | C3 | C2 | C1 | C0 | |
+\ | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | |
+\ | | | | | | | | | | | | | | | |
+\ idle_____ _s_ _s_ _s_ _o_ _o___s_ _s_ _s_ _s_ _s_ _s_ _s_ _s_ _s_idle
+\ | | | | | | | ^ | ^ | | | | | | | | | | | | | | | |
+\ v___| v_o_| v_o_| v_o___s_| |_s_| v_o_| v_o_| v_o_| v_o_| v_o_| v_o_| v_o_| v_o_|
+\ S i R i R i R R i R R i R i R i R i R i R i R i R i
+\ samples : 1 2 3 4 5 6 7 8 9 10 11 12 13 14
+\
+\
+\ 0,888 ms
+\ |<->|<--------------------------------routine time = 13 3/4 cycles = 24.447 ms----------------------------------->|
+\ | | | | | | | | | | | | | | | |
+\ | ST1 | ST2/C6| Toggle| A4 | A3 | A2 | A1 | A0 | C5 | C4 | C3 | C2 | C1 | C0 | |
+\ | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | |
+\ | | | | | | | | | | | | | | | |
+\ idle_____ _s_ _s_ ___ _o_ _o___s_ _s_ _s_ _s_ _s_ _s_ _s_ _o___s_idle
+\ | | | | | | | ^ | ^ | | | | | | | | | | | | | ^
+\ v___| v_o_| v_o_| v_o___s_| |_s_| v_o_| v_o_| v_o_| v_o_| v_o_| v_o_| v_o___s_|
+\ S i R i R i R R i R R i R i R i R i R i R i R R
+\ samples : 1 2 3 4 5 6 7 8 9 10 11 12 13 14
+
+
+\ S = Wake up on RC5_Int at 1/2 cycle : clear and start timer
+\ i = useless RC5_Int (not periodic) at 4/4 cycle
+\ s = sample RC5_intput at (1/2+3/4) = 5/4 cycle = 1/4 cycle+1 and clear useless RC5_Int
+\ R = usefull (periodic) RC5_Int at 6/4 cycle = 1/2 cycle+1 : cycle value = timer value then clear it and restart it
+\ o = RC5_Int time out at 7/4 cycle = 3/4 cycle+1, used to detect (samples<14) truncated RC5_message
+
+\ see also : http://www.sbprojects.com/knowledge/ir/rc5.php
+\ http://laurent.deschamps.free.fr/ir/rc5/rc5.htm
+\ Code RC5 : http://en.wikipedia.org/wiki/RC-5
+
+
+\ ---------------------------------------------------------------------------------------------------------------------\
+\ SCL clock generation, timing, and test of data(s) number are made by I2C_Master.
+\ slave can strech SCL low after Start Condition and after any bit.
+\
+\ address Ack/Nack is generated by the slave on SDA line (released by the master)
+\ Two groups of eight addresses (000xxxy and 1111xxxy) are not allowed (reserved)
+\ after address or data is sent, the transmitter (Master or Slave) must release SDA line to allow (N)Ack by the receiver
+\ data Ack/Nack are generated by the receiver (master or slave) on SDA line
+\ a master receiver must signal the end of data to the slave transmitter by sending a Nack bit
+\ Stop or restart conditions must be generated by master after a Nack bit.
+\ after Ack bit is sent, Slave must release SDA line to allow master to do stop or restart conditions.
+\
+\
+\ first byte = address + R/W flag | byte data (one, for example)
+\ __ _____ _____ _..._ _____ __R__ _NAK_ _____ _____ _..._ _____ _____ _NAK_ _
+\ SDA \____/_MSB_R9_____R9_..._R9_LSB_R9__R10__x_ACK_x_MSB_R9_____R9_..._R9_____R9_LSB_R9_ACK_R9___/
+\ _____ _ _ _ _ _ _ _ _ _ _ ___
+\ SCL \___/1\___/2\___...___/7\___/8\___/9\___/1\___/2\___...___/7\___/8\___/9\___/
+\ ^ ^ ^ ^ ^ ^ ^
+\ | |SSL |SSL |SSL |SSL |SSL |
+\ | |
+\ |Start Condition |stoP Condition
+\
+\ first byte = address + R/W flag | byte data (one, for example)
+\ __ _____ _____ _..._ _____ __R__ _NAK_ _____ _____ _..._ _____ _____ _NAK_ ___
+\ SDA \____/_MSB_R9_____R9_..._R9_LSB_R9__R10__x_ACK_x_MSB_R9_____R9_..._R9_____R9_LSB_R9_ACK_R9 \____...
+\ _____ _ _ _ _ _ _ _ _ _ _ ____
+\ SCL \___/1\___/2\___...___/7\___/8\___/9\___/1\___/2\___...___/7\___/8\___/9\___/ \_...
+\ ^ ^ ^ ^ ^ ^ ^
+\ | |SSL |SSL |SSL |SSL |SSL |
+\ | |
+\ |Start Condition |reStart Condition
+\
+\ SSL : Slave can strech SCL low
+\ tHIGH : SCL high time
+\ tLOW : SCL low time
+\ tBUF : SDA high time between Stop and Start conditions
+\ tHD:STA : Start_Condition SCL high time after SDA is low
+\ tSU:STO : Stop_Condition SCL high time before SDA rise
+\ tSU:STA : Start_Condition SCL high time before SDA fall
+\ tHD:DAT : SDA data change time after SCL is low
+\ the SDA line must be strobe just after SCL is high
+\ the SDA data must be change just after SCL is low
+\ standard mode (up to 100 kHz) : tHIGH = tHD:STA = tSU:STO = 4µs
+\ tLOW = tSU:STA = tBUF = 4,7µs
+\ tHD:DAT <= 3,45 µs
+\ -------------------------------------------------------------------------------------------------------------------\
+
--- /dev/null
+\ ------------------------------
+\ MSP430FR5xxx_LCD_20.f
+\ ------------------------------
+RST_STATE
+\ NOECHO
+\ Copyright (C) <2014> <J.M. THOORENS>
+\
+\ This program is free software: you can redistribute it and/or modify
+\ it under the terms of the GNU General Public License as published by
+\ the Free Software Foundation, either version 3 of the License, or
+\ (at your option) any later version.
+\
+\ This program is distributed in the hope that it will be useful,
+\ but WITHOUT ANY WARRANTY\ without even the implied warranty of
+\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+\ GNU General Public License for more details.
+\
+\ You should have received a copy of the GNU General Public License
+\ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+
+\ driver for LCD 2x20 characters display with 4 bits data interface
+\ without usage of an auxiliary 5V to feed the Vo of LCD
+\ without potentiometer to adjust the LCD contrast
+\ LCD contrast software adjustable by 2 switches
+\ TB0.2 current consumption ~ 500 uA
+
+\ layout : see config.pat file for defining I/O
+
+\ GND <-------+---0V0----------> 1 LCD_Vss
+\ VCC >------ | --3V6-----+----> 2 LCD_Vdd
+\ | |
+\ |___ 470n ---
+\ ^ | ---
+\ / \ BAT54 |
+\ --- |
+\ 100n | 2k2 |
+\ TB0.2 >---||--+--^/\/\/v--+----> 3 LCD_Vo (=0V6 without modulation)
+\ -------------------------> 4 LCD_RW
+\ -------------------------> 5 LCD_RW
+\ -------------------------> 6 LCD_EN
+\ <------------------------> 11 LCD_DB4
+\ <------------------------> 12 LCD_DB5
+\ <------------------------> 13 LCD_DB5
+\ <------------------------> 14 LCD_DB7
+
+\ Sw1 <--- LCD contrast + (finger :-)
+\ Sw2 <--- LCD contrast - (finger \-)
+
+
+
+\ ------------------------------\
+CODE 20_us \ n -- n * 20 us
+\ ------------------------------\
+BEGIN \ 3 cycles loop + 6~
+\ MOV #5,W \ 3 MCLK = 1 MHz
+\ MOV #23,W \ 3 MCLK = 4 MHz
+ MOV #51,W \ 3 MCLK = 8 MHz
+\ MOV #104,W \ 3 MCLK = 16 MHz
+\ MOV #158,W \ 3 MCLK = 24 MHz
+ BEGIN \ 3 cycles loop ==> 3 * W / F us = 100 us - 1 @ 8 MHz
+ SUB #1,W \ 1
+ 0= UNTIL \ 2
+ SUB #1,TOS \ 1
+0= UNTIL \ 2
+ MOV @PSP+,TOS \ 2
+ MOV @IP+,PC \ 4
+ENDCODE
+ \
+
+\ ------------------------------\
+CODE TOP_LCD \ LCD Sample
+\ ------------------------------\ if write : %xxxxWWWW --
+\ \ if read : -- %0000RRRR
+ BIS.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 0-->1
+ BIT.B #LCD_RW,&LCD_CMD_IN \ lcd_rw test
+0= IF \ write LCD bits pattern
+ AND #LCD_DB,TOS \
+ MOV.B TOS,&LCD_DB_OUT \ send LCD_Data
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV @PSP+,TOS \
+ MOV @IP+,PC
+THEN \ read LCD bits pattern
+ SUB #2,PSP
+ MOV TOS,0(PSP)
+ BIC.B #LCD_EN,&LCD_CMD_OUT \ lcd_en 1-->0 ==> strobe data
+ MOV.B &LCD_DB_IN,TOS \ get LCD_Data
+ AND.B #LCD_DB,TOS \
+ MOV @IP+,PC
+ENDCODE
+ \
+
+\ ------------------------------\
+CODE LCD_W \ byte -- write byte
+\ ------------------------------\
+ SUB #2,PSP \
+ MOV TOS,0(PSP) \ -- %xxxxLLLL %HHHHLLLL
+ RRUM #4,TOS \ -- %xxxxLLLL %xxxxHHHH
+ BIC.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=0
+ BIS.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as output
+ COLON
+ TOP_LCD 2 20_us \ write high nibble first
+ TOP_LCD 2 20_us ;
+ \
+
+\ ------------------------------\
+CODE LCD_R \ -- byte read byte
+\ ------------------------------\
+ BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput
+ BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1
+ COLON
+ TOP_LCD 2 20_us \ read high nibble first
+ TOP_LCD 2 20_us
+ HI2LO \ -- %0000HHHH %0000LLLL
+ MOV @RSP+,IP
+ MOV @PSP+,W \ W = high nibble
+ RLAM #4,W \ -- %0000LLLL W = %HHHH0000
+ ADD.B W,TOS
+ MOV @IP+,PC
+ENDCODE
+ \
+\ ------------------------------\
+CODE LCD_WrF \ func -- Write Fonction
+\ ------------------------------\
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_W
+ENDCODE
+ \
+\ ------------------------------\
+CODE LCD_RdS \ -- status Read Status
+\ ------------------------------\
+ BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0
+ JMP LCD_R
+ENDCODE
+ \
+\ ------------------------------\
+CODE LCD_WrC \ char -- Write Char
+\ ------------------------------\
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_W
+ENDCODE
+ \
+\ ------------------------------\
+CODE LCD_RdC \ -- char Read Char
+\ ------------------------------\
+ BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1
+ JMP LCD_R
+ENDCODE
+ \
+\ ------------------------------\
+\ : LCD_Clear $01 LCD_WrF 80 20_us ; \ bad init !
+: LCD_Clear $01 LCD_WrF 100 20_us ;
+ \
+\ ------------------------------\
+: LCD_Home $02 LCD_WrF 80 20_us ;
+ \
+\ ------------------------------\
+\ : LCD_Entry_set $04 OR LCD_WrF ;
+\ : LCD_Display_Ctrl $08 OR LCD_WrF ;
+\ : LCD_Display_Shift $10 OR LCD_WrF ;
+\ : LCD_Fn_Set $20 OR LCD_WrF ;
+\ : LCD_CGRAM_Set $40 OR LCD_WrF ;
+\ : LCD_Goto $80 OR LCD_WrF ;
+
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ SR(low byte) | SCG1 | SCG0 |OSCOFF|CPUOFF||GIE| N | Z | C | current |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+\ LPM0 = $18 | 0 | 0 | 0 | 1 || 1 | x | x | x | 180uA | default mode
+\ LPM1 = $58 | 0 | 1 | 0 | 1 || 1 | x | x | x | | same mode as LPM0
+\ LPM2 = $98 | 1 | 0 | 0 | 1 || 1 | x | x | x | 60uA |
+\ LPM3 = $D8 | 1 | 1 | 0 | 1 || 1 | x | x | x | 10uA | 32768Hz XTAL is running
+\ LPM4 = $F8 | 1 | 1 | 1 | 1 || 1 | x | x | x | 6uA |
+\ -------------+------+------+------+------++---+---+---+---+---------+
+
+\ ******************************\
+ASM WDT_Int \ Watchdog interrupt routine, warning : not FORTH executable !
+\ ******************************\
+BIC #$F8,0(RSP) \ set CPU ON and GIE OFF in retiSR
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+BIT.B #SW2,&SW2_IN \ test switch S2
+0= IF \ case of switch S2 pressed
+ CMP #34,&TB0CCR2 \ maxi Ton = 34/40 & VDD=3V6 ==> LCD_Vo = -2V2
+ U< IF
+ ADD #1,&TB0CCR2 \ action for switch S2 (P2.5) : 78 mV / increment
+ THEN
+ELSE
+ BIT.B #SW1,&SW1_IN \ test switch S1 input
+ 0= IF \ case of Switch S1 pressed
+ CMP #7,&TB0CCR2 \ mini Ton = 6/40 & VDD=3V6 ==> LCD_Vo = 0V
+ U>= IF \
+ SUB #1,&TB0CCR2 \ action for switch S1 (P2.6) : -78 mV / decrement
+ THEN \
+ THEN \
+THEN \
+RETI \ CPU is ON, GIE is OFF
+ENDASM \
+ \
+
+
+\ ------------------------------\
+CODE START \
+\ ------------------------------\
+\ TB0CTL = %0000 0010 1001 0100\$3C0
+\ - - \CNTL Counter lentgh \ 00 = 16 bits
+\ -- \TBSSEL TimerB clock select \ 10 = SMCLK
+\ -- \ID input divider \ 10 = /4
+\ -- \MC Mode Control \ 01 = up mode
+\ - \TBCLR TimerB Clear
+\ - \TBIE
+\ -\TBIFG
+\ --------------------------------\\
+\ TB0CCTLx = %0000 0000 0110 0000\$3C{2,4,6,8,A,C,E}
+\ -- \CM Capture Mode
+\ -- \CCIS
+\ - \SCS
+\ -- \CLLD
+\ - \CAP
+\ --- \OUTMOD \ 011 = set/reset
+\ - \CCIE
+\ - \CCI
+\ - \OUT
+\ - \COV
+\ -\CCIFG
+\ TB0CCRx \$3D{2,4,6,8,A,C,E}
+\ TB0EX0 \$3E0
+\ ------------------------------\
+\ set TimerB to make 50kHz PWM \
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (1 MHZ) (25 kHz PWM)
+\ ------------------------------\
+\ MOV #%1000010100,&TB0CTL \ SMCLK/1, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (4 MHZ)
+\ ------------------------------\
+ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+ MOV #0,&TB0EX0 \ predivide by 1 in TB0EX0 register (8 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #1,&TB0EX0 \ predivide by 2 in TB0EX0 register (16 MHZ)
+\ ------------------------------\
+\ MOV #%1010010100,&TB0CTL \ SMCLK/4, up mode, clear timer, no int
+\ MOV #2,&TB0EX0 \ predivide by 3 in TB0EX0 register (24 MHZ)
+\ ------------------------------\
+ MOV #40,&TB0CCR0 \ 40*0.5us=20us (40us @ 1MHz)
+\ ------------------------------\
+\ set TimerB to generate LCD_V0 via TB0.2 and P1.5/P2.2
+\ ------------------------------\
+ MOV #%1100000,&TB0CCTL2 \ output mode = set/reset \ clear CCIFG
+\ MOV #20,&TB0CCR2 \ contrast adjust : 20/40 ==> LCD_Vo = -1V1|+3V6 (Vcc=3V6)
+ MOV #25,&TB0CCR2 \ contrast adjust : 25/40 ==> LCD_Vo = -1V4|+3V3 (Vcc=3V3)
+\ ------------------------------\
+\ ------------------------------\
+\ WDT interval init part \
+\ ------------------------------\
+\ MOV #$5A5E,&WDTCTL \ init WDT Vloclk source 10kHz /2^9 (50 ms), interval mode
+ MOV #$5A3D,&WDTCTL \ init WDT ACLK source 32.768kHz /2^13 (250 ms), interval mode
+\ MOV #$5A5D,&WDTCTL \ init WDT Vloclk source 10kHz /2^13 (800 ms), interval mode
+ BIS #1,&SFRIE1 \ enable WDT interval mode interrupt in SFRIE
+\ ------------------------------\
+\ init interrupt vectors
+\ ------------------------------\
+ MOV #WDT_Int,&WDT_Vec \ init WDT interval vector interrupt
+\ ------------------------------\
+\ init PORTA (P2:P1) (complement)
+ BIS.B #LCDVo,&LCDVo_DIR \
+ BIS.B #LCDVo,&LCDVo_SEL0 \ SEL0.2 TB0.2
+\ ------------------------------\
+\ init PORTB (P4:P3) (complement)
+ BIS.B #LCD_CMD,&LCD_CMD_DIR \ lcd_cmd as outputs
+ BIC.B #LCD_CMD,&LCD_CMD_REN \ lcd_cmd pullup/down disable
+\ ------------------------------\
+\ init PORTJ (PJ) (complement)
+ BIS.B #LCD_DB,&LCD_DB_DIR \ PJDIR.(0-3) as output, wired to DB(4-7) LCD_Data
+ BIC.B #LCD_DB,&LCD_DB_REN \ PJREN.(0-3) LCD_Data pullup/down disable
+\ ------------------------------\
+\ define LPM mode for ACCEPT \
+\ ------------------------------\
+\ MOV #LPM4,&LPM_MODE \ with MSP430FR59xx
+\ MOV #LPM2,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2
+\ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value
+\ ------------------------------\
+\ Init LCD
+ LO2HI
+ $3E8 20_us \ 1- wait 20 ms
+ $03 TOP_LCD \ 2- send DB5=DB4=1
+ $CD 20_us \ 3- wait 4,1 ms
+ $03 TOP_LCD \ 4- send again DB5=DB4=1
+ 5 20_us \ 5- wait 0,1 ms
+ $03 TOP_LCD \ 6- send again again DB5=DB4=1
+ 2 20_us \ wait 40 us = LCD cycle
+ $02 TOP_LCD \ 7- send DB5=1 DB4=0
+ 2 20_us \ wait 40 us = LCD cycle
+ $28 LCD_WrF \ 8- %001DNFxx "FonctionSet" D=8/4 DataBus width, Number of lines=2/1, Font bold/normal
+ $08 LCD_WrF \ 9- %1DCB "DisplayControl" : Display off, Cursor off, Blink off.
+ LCD_Clear \ 10- "LCD_Clear"
+ $06 LCD_WrF \ 11- %01xx "LCD_EntrySet" : address and cursor shift after writing in RAM
+ $0C LCD_WrF \ 12- %1DCB "DisplayControl" : Display on, Cursor off, Blink off.
+ ['] LCD_HOME IS CR \ ' CR redirected to LCD_HOME
+ ['] LCD_WrC IS EMIT \ ' EMIT redirected to LCD_WrC
+ CR ." I love you"
+ ['] (CR) IS CR \ ' (CR) is CR
+ ['] (EMIT) IS EMIT \ ' (EMIT) is EMIT
+ ." xxxx_to_LCD is running. Type STOP to quit"
+ LIT recurse is WARM \ insert this starting routine between COLD and WARM...
+\ NOECHO \ uncomment to run this app without terminal connexion
+ (WARM) ; \ ...and continue with WARM
+ \
+
+: STOP \ stops multitasking, must to be used before downloading app
+ ['] (WARM) IS WARM \ remove START app from FORTH init process
+ ECHO COLD \ reset CPU, interrupt vectors, and start FORTH
+;
+ \
+
+PWR_HERE \ set here the power_on dictionnary
set howtoread=%1
set readfile=%2
-if c%1==c set howtoread=MAIN
-if c%2==c set readfile=DUMP
+if "%1" == "" set howtoread=MAIN
+if "%2" == "" set readfile=DUMP
-A:\prog\MSP430Flasher\msp430flasher -m SBW2 -r [%readfile%_%howtoread%.hex,%howtoread%] -z [VCC=3000]
-A:\prog\srecord\srec_cat %readfile%_%howtoread%.HEX -intel -output %readfile%_%howtoread%.bin -Binary
-A:\prog\HxD\HxD.exe" %readfile%_%howtoread%.bin
\ No newline at end of file
+A:\prog\MSP430Flasher\msp430flasher -m SBW2 -r [%readfile%_%howtoread%.txt,%howtoread%] -z [VCC=3000]
+::A:\prog\srecord\srec_cat %readfile%_%howtoread%.HEX -intel -output %readfile%_%howtoread%.bin -Binary
+::A:\prog\HxD\HxD.exe" %readfile%_%howtoread%.bin
+
+pause
MOV #100Fh,&CSCTL2 ; Set FLLD=1 (DCOCLKCDIV=DCO/2),set FLLN=0Fh
; fCOCLKDIV = 32768 x (15+1) = 0.524 MHz ; measured : MHz
; =====================================
- MOV #2,X
+; MOV #2,X
.ELSEIF FREQUENCY = 1
; MOV #001Fh,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=1Fh
; fCOCLKDIV = 32768 x (31+1) = 1.049 MHz ; measured : 1.046MHz
; =====================================
- MOV #4,X
+; MOV #4,X
.ELSEIF FREQUENCY = 2
; MOV #003Dh,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=3Dh
; fCOCLKDIV = 32768 x (61+1) = 2.031 MHz ; measured : MHz
; =====================================
- MOV #8,X
+; MOV #8,X
.ELSEIF FREQUENCY = 4
; MOV #007Ah,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=7Ah
; fCOCLKDIV = 32768 x (122+1) = 4.030 MHz ; measured : 4.020MHz
; =====================================
- MOV #16,X
+; MOV #16,X
.ELSEIF FREQUENCY = 8
; fCOCLKDIV = 32768 x (245+1) = 8.061 MHz ; measured : 8.042MHz
; works with cp2102 and pl2303TA
; =====================================
- MOV #32,X
+; MOV #32,X
.ELSEIF FREQUENCY = 16
MOV #01E9h,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=1E9h
; fCOCLKDIV = 32768 x 489+1) = 16.056 MHz ; measured : 16.02MHz
; =====================================
- MOV #64,X
+; MOV #64,X
.ELSEIF
.error "bad frequency setting, only 0.5,1,2,4,8,16 MHz"
.ENDIF
.IFDEF LF_XTAL
-; MOV #0000h,&CSCTL3 ; FLL select XT1, FLLREFDIV=0 (default value)
+; LFXIN : P4.1, LFXOUT : P4.2
+ MOV #0600h,&PBSEL0 ; SEL0 for only P4.1,P4.2
+; MOV #0000h,&CSCTL3 ; FLL select XT1, FLLREFDIV=0 (default value)
MOV #0000h,&CSCTL4 ; ACLOCK select XT1, MCLK & SMCLK select DCOCLKDIV
.ELSE
MOV #0010h,&CSCTL3 ; FLL select REFCLOCK, FLLREFDIV=0
BIS &SYSRSTIV,&SAVE_SYSRSTIV; store volatile SYSRSTIV with preserving a pending request for DEEP_RST
- CMP #2,&SAVE_SYSRSTIV ; POWER ON ?
- JZ ClockWaitX ; yes : wait 600ms to stabilize power source
- .word 0359h ; no : RRUM #1,X --> wait still 300 ms...
- ; ...because FLL lock time = 280 ms
-
-ClockWaitX MOV #50000,Y ;
-ClockWaitY SUB #1,Y ; 3 cycles loop
- JNZ ClockWaitY ; 50000x3 = 150000 cycles delay = 150ms @ 1MHz
- SUB #1,X ;
- JNZ ClockWaitX ;
+; CMP #2,&SAVE_SYSRSTIV ; POWER ON ?
+; JZ ClockWaitX ; yes : wait 600ms to stabilize power source
+; .word 0359h ; no : RRUM #1,X --> wait still 300 ms...
+; ; ...because FLL lock time = 280 ms
+;
+; ClockWaitX MOV #50000,Y ;
+; ClockWaitY SUB #1,Y ; 3 cycles loop
+; JNZ ClockWaitY ; 50000x3 = 150000 cycles delay = 150ms @ 1MHz
+; SUB #1,X ;
+; JNZ ClockWaitX ;
+WAITFLL BIT #300,&CSCTL7 ; wait FLL lock
+ JNZ WAITFLL
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : RTC REGISTERS
-; ----------------------------------------------------------------------
-
- .IFDEF LF_XTAL
-; LFXIN : P4.1, LFXOUT : P4.2
- MOV #0600h,&PBSEL0 ; SEL0 for only P4.1,P4.2
- .ENDIF
+++ /dev/null
-@1800
-10 00 0E C9 80 3E 00 24 FD FF 18 00 D4 E6 36 D6
-CE C8 E0 C8 30 DE 6E DE
-@21AA
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00
-@2400
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-@C400
-3A 41 0D 12 0D 4A 30 4D 2F 83 8F 4E 00 00 3E 41
-2E 4E 30 4D 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E
-30 4D 00 00 04 45 58 49 54 00 3D 41 30 4D 00 00
-03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 C4
-03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
-44 55 50 00 0E 93 F6 23 30 4D 40 C4 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 C4 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E C4 02 3E 52 00 0E 12 3E 4F 30 4D 8E C4
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 C4
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C C4 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 20 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 C4 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 C5
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 C4 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA C4 03 41 4E 44 3E FF 30 4D 7A C4 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E C5 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 C5 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E C5 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 C5 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 C4 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
-3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE C5 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 C5 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 C5 03 3E 49 4E 85 12 C2 21 10 C5
-04 42 41 53 45 00 85 12 DA 21 C0 C4 05 53 54 41
-54 45 85 12 B6 21 30 C6 02 42 4C 00 85 12 20 00
-F4 C5 03 55 4D 2A 2C 4F 0A 43 08 43 0B 43 19 43
-0E B9 02 24 08 5C 0B 6A 0C 5C 0A 6A 09 59 F8 2B
-8F 48 00 00 0E 4B 30 4D 94 C5 02 3C 23 00 B2 40
-AA 21 AA 21 30 4D 1E 15 0E 43 3D 40 20 00 0A 93
-04 20 0D 11 0A 4C 0C 43 09 43 0E 9B 01 28 0E 8B
-09 69 08 68 1D 83 07 30 0C 5C 0A 6A 0E 6E F5 2B
-0E 8B 12 D3 F5 3F 0A 4E 1D 17 30 41 48 C6 01 23
-1B 42 DA 21 2C 4F 0A 4E B0 12 86 C6 8F 49 00 00
-0E 48 7A 90 0A 00 02 28 3A 50 07 00 3A 50 30 00
-92 83 AA 21 18 42 AA 21 C8 4A 00 00 30 4D BE C6
-02 23 53 00 87 12 C0 C6 FA C6 2D 83 09 93 E0 23
-0E 93 DE 23 3D 41 30 4D F0 C6 02 23 3E 00 9F 42
-AA 21 00 00 3E 40 AA 21 2E 8F 30 4D 00 C6 04 48
-4F 4C 44 00 0A 4E 3E 4F DB 3F 3C C6 04 53 49 47
-4E 00 0E 93 3E 4F 3A 40 2D 00 D2 33 30 4D 52 C6
-03 55 44 2E 87 12 7E C6 F4 C6 0E C7 F4 C9 BC C9
-2A C4 40 C7 02 55 2E 00 2F 83 8F 4E 00 00 0E 43
-F1 3F 3E B0 00 80 06 24 BF E3 00 00 3E E3 9F 53
-00 00 0E 63 30 4D DA C4 02 44 2E 00 87 12 7E C6
-6E C4 80 C4 62 C7 F4 C6 92 C4 32 C7 0E C7 F4 C9
-BC C9 2A C4 52 C5 01 2E 3E B0 00 80 DD 27 2F 83
-3E 43 EC 3F 1E C7 04 48 45 52 45 00 2F 83 8F 4E
-00 00 1E 42 C4 21 30 4D 62 C5 05 41 4C 4C 4F 54
-82 5E C4 21 3E 4F 30 4D 0A C7 02 43 2C 00 1A 42
-C4 21 CA 4E 00 00 92 53 C4 21 3E 4F 30 4D 2F 83
-8F 4E 00 00 B0 12 CE C8 92 B3 1C 05 FD 27 1E 42
-0C 05 B0 12 E0 C8 30 4D 30 40 DE C7 A6 C7 05 28
-4B 45 59 29 18 42 0C 05 EA 3F 12 C6 03 4B 45 59
-30 40 04 C8 0D 12 3D 40 40 C8 1B 42 34 24 9B 42
-1E 24 16 00 3A 40 00 25 BF 40 50 00 00 00 8F 4A
-02 00 0E 43 82 93 20 24 13 24 19 42 1E 24 02 3C
-42 C8 2D 83 19 92 20 24 16 2C 58 49 00 22 19 53
-78 90 20 00 08 2C 78 90 0A 00 F4 23 82 49 1E 24
-2F 53 3D 41 30 4D 8F 9E 00 00 64 24 CA 48 00 00
-1A 53 1E 53 5F 3C 0A 12 B0 12 9C DF 3A 41 DA 3F
-BA C7 06 41 43 43 45 50 54 00 30 40 9A C8 FE C7
-08 28 41 43 43 45 50 54 29 00 3C 40 4C C9 3B 40
-16 C9 2D 15 0A 4E 2E 4F 0A 5E 3B 40 0D 00 3C 40
-20 00 3D 40 40 C9 92 B3 1C 05 05 24 18 42 0C 05
-38 90 0A 00 04 20 21 53 39 40 FA C8 4D 15 B2 40
-11 00 0E 05 A2 B3 1C 05 FD 27 F2 C2 03 02 30 41
-B2 40 13 00 0E 05 A2 B3 1C 05 FD 27 F2 D2 03 02
-30 41 00 00 05 53 4C 45 45 50 30 40 08 C9 00 00
-07 28 53 4C 45 45 50 29 12 D2 0A 18 F6 3F 21 52
-3A 17 58 42 0C 05 48 9B E3 27 48 9C 06 2C 78 92
-11 20 2E 9F 0F 24 1E 83 05 3C 0E 9A 03 24 CE 48
-00 00 1E 53 82 48 0E 05 A2 B3 1C 05 FD 27 30 4D
-42 C9 2D 83 92 B3 1C 05 FD 27 E3 23 B2 40 18 00
-0A 18 3E 8F 3D 41 30 4D 90 C8 06 28 45 4D 49 54
-29 00 08 4E 3E 4F E6 3F 78 C7 04 45 4D 49 54 00
-30 40 62 C9 6A C9 04 45 43 48 4F 00 B2 40 82 48
-34 C9 30 4D 96 C7 06 4E 4F 45 43 48 4F 00 B2 40
-30 4D 34 C9 30 4D 5A C9 04 28 43 52 29 00 2F 83
-8F 4E 00 00 3E 40 0D 00 E3 3F CA C7 02 43 52 00
-30 40 9E C9 2C C7 05 53 50 41 43 45 2F 83 8F 4E
-00 00 3E 40 20 00 D4 3F B6 C9 06 53 50 41 43 45
-53 00 0E 93 09 24 0D 12 3D 40 DE C9 EF 3F E0 C9
-2D 83 1E 83 EB 23 3D 41 3E 4F 30 4D 54 C7 04 54
-59 50 45 00 0E 93 95 24 2A 4F 8F 5E 00 00 0E 4A
-87 12 CA C5 02 C6 0A C5 70 C9 EC C5 04 CA 2A C4
-2F 82 8F 4E 02 00 7E 4D 8F 4D 00 00 0D 5E 1D B3
-0D 63 30 4D CA C9 82 53 22 00 87 12 34 C4 10 CA
-74 CC 34 C4 22 00 6A CA 3A CA 3D 41 6E 4E 1E 83
-82 5E C4 21 3E 4F 92 B3 C4 21 A2 63 C4 21 30 4D
-86 C9 82 2E 22 00 87 12 2A CA 34 C4 F4 C9 74 CC
-2A C4 00 00 04 57 4F 52 44 00 3C 40 BE 21 39 4C
-3A 4C 09 5A 3A 5C 28 4C 09 9A 19 24 7E 9A FC 27
-1A 83 3B 40 60 00 C8 4C 00 00 09 9A 0C 24 7C 4A
-4E 9C 09 24 18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F
-7C 80 20 00 F0 3F 1A 82 C0 21 82 4A C2 21 1E 42
-C4 21 08 8E CE 48 00 00 30 4D 00 00 04 46 49 4E
-44 00 2F 83 0C 4E 65 4C 74 40 80 00 3B 40 CA 21
-3E 4B 0E 93 1E 24 58 4C 01 00 78 F0 1E 00 0E 58
-2E 53 1E 4E FE FF 0E 93 F3 27 09 4E 78 49 48 C4
-48 95 F7 23 0A 4C 1A 53 FA 99 00 00 F2 23 58 83
-FA 23 19 B3 09 63 0C 49 6A 4E 1E 43 4A 93 01 30
-2E 83 8F 4C 00 00 35 40 08 C4 34 40 14 C4 30 4D
-2F 53 2F 53 3E 4F 30 4D 26 C6 07 3E 4E 55 4D 42
-45 52 2C 4F 6C 4C 7C 80 30 00 7C 90 0A 00 02 28
-7C 80 07 00 1C 92 DA 21 25 2C 2E 15 2F 83 9F 4F
-04 00 00 00 1E 42 DA 21 3D 40 60 CB 30 40 56 C6
-62 CB 2F 12 9F 4F 06 00 00 00 1E 42 DA 21 3D 40
-76 CB 30 40 56 C6 78 CB 3E 51 BF 51 00 00 0E 63
-AF 4F 06 00 8F 4E 04 00 1D 17 2F 53 9F 53 00 00
-1E 83 CF 23 30 4D 03 12 0D 12 12 12 DA 21 32 C0
-00 02 6D 4E 0D 5E 0C 4E 7A 40 2E 00 0D 9C 0A 28
-7A 9C FC 23 32 D0 00 02 FC 4C FE FF 0D 9C FC 2F
-DE 83 00 00 3D 40 22 CC 3F 82 8F 4E 06 00 8F 43
-04 00 8F 43 02 00 0A 4E 7E 4A 8F 4A 00 00 79 4A
-79 90 2D 00 17 2C 79 80 24 00 04 20 B2 40 10 00
-DA 21 0A 3C 59 83 03 20 A2 43 DA 21 05 3C 69 53
-98 23 B2 40 0A 00 DA 21 8F 4A 00 00 1E 83 79 4A
-79 90 2D 00 8E 23 B1 43 04 00 8F 4A 00 00 1E 83
-88 3F 24 CC 2F 53 0E 93 2C 17 82 4C DA 21 03 24
-2F 52 0E F3 30 4D 9F 4F 02 00 04 00 BF 4F 00 00
-3E E3 09 20 3E E3 BF E3 02 00 BF E3 00 00 9F 53
-02 00 8F 63 00 00 32 B0 00 02 01 20 2F 53 30 4D
-76 C9 07 45 58 45 43 55 54 45 0A 4E 3E 4F 00 4A
-28 C5 01 2C 1A 42 C4 21 A2 53 C4 21 8A 4E 00 00
-3E 4F 30 4D 72 CC 87 4C 49 54 45 52 41 4C 82 93
-B6 21 16 24 32 B0 00 02 09 24 1A 42 C4 21 A2 52
-C4 21 BA 40 34 C4 00 00 BA 4F 02 00 1A 42 C4 21
-A2 52 C4 21 BA 40 34 C4 00 00 8A 4E 02 00 3E 4F
-30 4D AC C9 05 43 4F 55 4E 54 2F 83 1E 53 8F 4E
-00 00 5E 4E FF FF 30 4D 82 4E BE 21 B2 4F C0 21
-3E 4F 82 43 C2 21 87 12 4C C6 6A CA EE CC 3D 40
-FA CC E7 22 3D 41 3E 4F 30 4D FC CC 0A 4E 3E 4F
-3D 40 12 CD 48 27 3D 40 E8 CC 1A E2 B6 21 B2 27
-AC 23 14 CD 3E 4F 3D 40 E8 CC B9 23 DE 53 00 00
-68 4E 08 5E F8 40 3F 00 00 00 3D 40 EE CE CD 3F
-62 CC 08 45 56 41 4C 55 41 54 45 00 39 40 BE 21
-39 12 39 12 39 12 0D 12 B0 12 2A C4 D8 CC 50 CD
-3D 41 B2 41 C2 21 B2 41 C0 21 B2 41 BE 21 30 4D
-7A C5 04 51 55 49 54 00 31 40 E0 20 B2 40 00 20
-00 20 82 43 B6 21 82 43 08 18 B0 12 2A C4 10 CA
-04 0D 6F 6B 20 00 F4 C9 34 C4 38 21 44 C4 34 C4
-50 00 8A C8 BC C9 D8 CC 34 C4 7E 20 CE C4 B2 C5
-10 CA 0D 73 74 61 63 6B 20 65 6D 70 74 79 20 21
-EC CD 34 C4 30 FF AC C7 B2 C5 10 CA 0B 46 52 41
-4D 20 66 75 6C 6C 20 21 EC CD 42 C6 F4 C4 C0 C5
-7E CD 10 CA 04 0D 20 20 20 00 BC C5 86 CD 82 C8
-05 41 42 4F 52 54 3F 40 80 20 BE 3F 8F 93 02 00
-97 26 B2 40 82 48 34 C9 1B 42 34 24 0B 93 04 24
-CB 43 02 00 2B 4B FA 3F B0 12 EE D2 82 43 FA DC
-82 43 06 DD 82 43 12 DD 82 43 42 DD 82 43 4E DD
-82 43 5A DD A2 B3 1C 05 FD 27 B2 40 11 00 0E 05
-F2 C2 03 02 92 C3 1C 05 38 40 A0 AA 39 42 19 83
-FE 23 18 83 FB 23 92 B3 1C 05 F4 23 87 12 10 CA
-04 1B 5B 37 6D 00 F4 C9 F4 C9 10 CA 04 1B 5B 30
-6D 00 F4 C9 30 D2 72 D2 78 D2 E6 CD E0 CD 86 41
-42 4F 52 54 22 00 87 12 2A CA 34 C4 EC CD 74 CC
-2A C4 BC CA 01 27 87 12 4C C6 6A CA C2 CA C0 C5
-94 CE 2A C4 1C CD 7A C6 81 5C 92 42 BE 21 C2 21
-30 4D 87 12 46 CA 4C C6 6A CA AC CE 08 4E 7A 4E
-5A D3 5A 53 0A 58 19 42 C8 21 6E 4E 3E F0 1E 00
-09 5E 82 48 AE 21 82 49 B0 21 82 4A B2 21 2A 52
-82 4A C4 21 3E 4F 3D 41 30 41 87 12 10 CA 0F 73
-74 61 63 6B 20 6D 69 73 6D 61 74 63 68 21 F2 CD
-82 9F B4 21 F2 23 18 42 AE 21 19 42 B0 21 A8 49
-FE FF 89 48 00 00 30 4D 64 CA 08 56 41 52 49 41
-42 4C 45 00 B0 12 A2 CE BA 40 86 12 FC FF EF 3F
-C4 CC 08 43 4F 4E 53 54 41 4E 54 00 B0 12 A2 CE
-BA 40 85 12 FC FF 8A 4E FE FF 3E 4F E0 3F 22 CF
-06 43 52 45 41 54 45 00 B0 12 A2 CE BA 40 85 12
-FC FF 8A 4A FE FF D3 3F 32 CD 05 44 4F 45 53 3E
-1A 42 B2 21 BA 40 84 12 00 00 8A 4D 02 00 3D 41
-30 4D 5A CF 05 44 45 46 45 52 B0 12 A2 CE BA 40
-30 40 FC FF BA 40 70 CF FE FF B9 3F 00 00 81 5B
-82 43 B6 21 30 4D 98 CE 01 5D B2 43 B6 21 30 4D
-26 CA 87 52 45 43 55 52 53 45 19 42 C4 21 99 42
-B2 21 00 00 A2 53 C4 21 30 4D 8E CF 01 3A B0 12
-A2 CE BA 40 87 12 FC FF A2 83 C4 21 B2 43 B6 21
-82 4F B4 21 30 4D BC CF 81 3B 82 93 B6 21 5D 27
-87 12 34 C4 2A C4 74 CC F0 CE 90 CF 2A C4 98 C9
-09 49 4D 4D 45 44 49 41 54 45 1A 42 AE 21 FA D0
-80 00 00 00 30 4D BE 4F 02 00 3E 4F 30 4D F0 CF
-82 49 53 00 87 12 42 C6 F4 C4 C0 C5 28 D0 34 D0
-34 C4 06 D0 74 CC 2A C4 86 CE 06 D0 2A C4 D8 CF
-83 5B 27 5D 87 12 86 CE 34 C4 34 C4 74 CC 74 CC
-2A C4 62 CD 88 50 4F 53 54 50 4F 4E 45 00 87 12
-4C C6 6A CA C2 CA 54 C4 C0 C5 94 CE 7E C5 C0 C5
-6E D0 34 C4 34 C4 74 CC 74 CC 34 C4 74 CC 74 CC
-2A C4 74 D0 3A 4E 82 4A C6 21 2E 4E 82 4E C4 21
-3D 40 10 00 09 4A 08 49 29 83 18 48 FE FF 0E 98
-FC 2B 89 48 00 00 1D 83 F6 23 2A 4A 0A 93 F0 23
-3E 4F 3D 41 30 4D 10 D0 82 49 46 00 2F 83 8F 4E
-00 00 1E 42 C4 21 BE 40 C0 C5 00 00 A2 52 C4 21
-2E 53 30 4D 74 CF 84 45 4C 53 45 00 1A 42 C4 21
-BA 40 BC C5 00 00 2A 52 82 4A C4 21 8E 4A 00 00
-2A 83 0E 4A 30 4D EE C9 84 54 48 45 4E 00 9E 42
-C4 21 00 00 3E 4F 30 4D 40 CF 85 42 45 47 49 4E
-30 40 AC C7 E8 D0 85 55 4E 54 49 4C 39 40 C0 C5
-1A 42 C4 21 A2 52 C4 21 8A 49 00 00 8A 4E 02 00
-3E 4F 30 4D 6E CE 85 41 47 41 49 4E 39 40 BC C5
-EF 3F 0A CF 85 57 48 49 4C 45 87 12 AC D0 6E C4
-2A C4 A2 CF 86 52 45 50 45 41 54 00 87 12 2C D1
-EE D0 2A C4 C6 D0 82 44 4F 00 2F 83 8F 4E 00 00
-1E 42 C4 21 BE 40 CA C5 00 00 2E 53 82 4E C4 21
-A2 53 00 20 1A 42 00 20 8A 43 00 00 30 4D 86 CC
-84 4C 4F 4F 50 00 39 40 EC C5 1A 42 C4 21 A2 52
-C4 21 8A 49 00 00 8A 4E 02 00 1E 42 00 20 A2 83
-00 20 2E 4E 0E 93 04 24 9E 42 C4 21 00 00 F5 3F
-3E 4F 30 4D 0C C8 85 2B 4C 4F 4F 50 39 40 DA C5
-E4 3F 80 D1 85 4C 45 41 56 45 1A 42 C4 21 BA 40
-FC C5 00 00 BA 40 BC C5 02 00 B2 50 06 00 C4 21
-A2 53 00 20 2A 52 19 42 00 20 89 4A 00 00 30 4D
-C4 D1 04 4D 4F 56 45 00 0A 4E 38 4F 39 4F 3E 4F
-0A 93 11 24 08 99 0F 24 06 2C F8 49 00 00 18 53
-1A 83 FB 23 30 4D 08 5A 09 5A 19 83 18 83 E8 49
-00 00 1A 83 FA 23 30 4D 34 C4 CA 21 FC C4 2A C4
-84 12 28 D2 7C D6 50 E1 44 E1 84 CE 3A D6 B6 D1
-5E E1 52 CA 96 D2 86 E5 6E E6 78 E5 48 C5 30 D0
-98 CF 2A CB 00 00 3A 40 0C 00 39 40 CA 21 38 40
-CC 21 D9 3F 3A 40 0E 00 39 40 CC 21 38 40 CA 21
-CC 3F 82 43 CC 21 30 4D 92 42 CA 21 C8 21 30 4D
-44 D0 09 50 57 52 5F 53 54 41 54 45 84 12 72 D0
-36 D6 D4 E6 82 D2 08 50 57 52 5F 48 45 52 45 00
-92 42 C4 21 92 D2 92 42 C6 21 90 D2 EF 3F 44 D1
-09 52 53 54 5F 53 54 41 54 45 92 42 0C 18 92 D2
-92 42 0E 18 90 D2 E2 3F B0 D2 08 52 53 54 5F 48
-45 52 45 00 92 42 C4 21 0C 18 92 42 C6 21 0E 18
-DF 3F B2 40 3C D3 9E D3 B2 40 08 C9 FC C8 B2 40
-62 C9 72 C9 B2 40 9E C9 B2 C9 B2 40 04 C8 12 C8
-B2 40 9A C8 8C C8 30 41 34 D1 04 57 49 50 45 00
-39 40 80 FF B9 43 00 00 29 53 39 90 E2 FF FA 23
-B0 12 E2 D2 B2 40 D4 E6 C4 21 B2 40 36 D6 C6 21
-D1 3F A8 D0 06 28 57 41 52 4D 29 00 1E 42 08 18
-87 12 10 CA 05 0D 1B 5B 37 6D F4 C9 98 C7 10 CA
-27 20 46 61 73 74 46 6F 72 74 68 20 56 31 36 30
-20 31 36 4D 48 7A 20 28 43 29 20 4A 2E 4D 2E 54
-68 6F 6F 72 65 6E 73 20 F4 C9 34 C4 30 FF AC C7
-2A C5 58 C7 10 CA 0B 62 79 74 65 73 20 66 72 65
-65 20 08 CE 0A D3 04 57 41 52 4D 00 30 40 3C D3
-FA D0 04 43 4F 4C 44 00 B2 40 04 A5 20 01 B2 40
-88 5A CC 01 B2 D0 00 08 04 02 B2 D3 06 02 B2 43
-02 02 B2 40 00 01 24 02 B2 40 FF FE 22 02 B2 D0
-FF FE 26 02 B2 43 42 02 B2 D3 46 02 B2 43 62 02
-B2 D3 66 02 F2 40 A5 00 A1 01 F2 40 10 00 A0 01
-D2 43 A1 01 B2 40 00 A5 60 01 B2 40 29 01 80 01
-B2 40 0B 00 82 01 B2 40 E9 01 84 01 39 40 40 00
-82 43 88 01 92 D2 5E 01 08 18 A2 93 08 18 01 24
-59 03 38 40 50 C3 18 83 FE 23 19 83 FA 23 B2 40
-00 06 2A 02 3A 40 AE D3 39 40 E2 FF 89 4A 00 00
-29 53 FC 23 92 42 02 18 EC FF B2 40 18 00 0A 18
-31 40 E0 20 3F 40 80 20 37 40 00 C4 36 40 B4 C4
-35 40 08 C4 34 40 14 C4 B2 40 0A 00 DA 21 B2 43
-AC 21 92 C3 30 01 18 42 08 18 D2 B3 00 02 04 20
-38 E3 18 53 82 48 08 18 B2 40 81 00 00 05 B2 40
-11 00 06 05 B2 40 00 4A 08 05 F2 D0 03 00 0A 02
-92 C3 00 05 92 D3 1A 05 3D 40 C2 D4 18 42 08 18
-38 90 0A 00 2D 27 38 90 16 00 2A 2F 28 93 FD 22
-E5 26 C4 D4 D2 B3 61 02 69 23 B2 40 81 A9 40 05
-B2 40 30 00 46 05 E2 D3 65 02 F2 D0 0E 00 4A 02
-F2 C0 0E 00 46 02 92 C3 40 05 39 40 00 24 89 43
-00 00 29 53 39 90 54 25 FA 23 39 42 B0 12 08 DE
-E2 C3 63 02 2C 42 B2 40 95 00 14 24 B2 40 00 40
-18 24 1A 43 B0 12 CC DD 02 24 30 40 A6 DE B0 12
-06 DE 7A 93 FC 23 B2 40 87 AA 14 24 92 43 16 24
-B2 40 00 48 18 24 1A 43 B0 12 CC DD 29 42 B0 12
-08 DE 92 43 14 24 82 43 16 24 78 43 3C 42 B2 40
-00 77 18 24 1A 43 B0 12 CC DD B2 40 40 69 18 24
-B0 12 C2 DD 03 24 58 83 F2 23 D7 3F 0C 5C A2 43
-16 24 B2 40 00 50 18 24 B0 12 C2 DD CE 23 92 D3
-40 05 82 43 46 05 92 C3 40 05 B0 12 2E DE 38 40
-00 22 92 48 C6 01 04 24 92 48 C8 01 06 24 5A 48
-C2 01 92 43 02 24 7A 80 06 00 0D 24 7A 82 0B 24
-A2 43 02 24 6A 53 07 24 5A 53 05 24 3A 50 0B 20
-0C 4A 30 40 AC DE B0 12 2E DE D2 48 0D 00 12 24
-19 48 0E 00 82 49 08 24 1A 48 16 00 0A 93 02 20
-1A 48 24 00 82 4A 0A 24 09 5A 82 49 0C 24 09 5A
-A2 93 02 24 04 24 82 49 0E 24 39 50 20 00 19 82
-12 24 19 82 12 24 82 49 10 24 92 42 02 24 2C 24
-C5 3E 84 12 28 D2 5E DC 0A DD 12 DC 5E DD D8 DB
-92 DC DC D8 00 00 CE DB 7E DC 30 DC 6E DC EC D9
-00 00 00 00 70 DD 54 D2 34 D3 85 48 49 32 4C 4F
-87 12 AC C7 C0 D0 74 CC 90 CF 56 D2 12 D6 2A C4
-A2 D3 04 43 4F 44 45 00 B0 12 A2 CE A2 82 C4 21
-87 12 D0 CF BC C5 4A D6 00 00 07 45 4E 44 43 4F
-44 45 87 12 64 D2 F0 CE 2A C4 26 D1 03 41 53 4D
-92 42 C8 21 B8 21 B2 40 16 D6 C8 21 E5 3F 6A D6
-06 45 4E 44 41 53 4D 00 92 42 B8 21 C8 21 E9 3F
-00 00 05 43 4F 4C 4F 4E 1A 42 C4 21 BA 40 87 12
-00 00 A2 53 C4 21 B2 43 B6 21 30 40 64 D2 00 00
-05 4C 4F 32 48 49 1A 42 C4 21 BA 40 B0 12 00 00
-BA 40 2A C4 02 00 A2 52 C4 21 ED 3F 38 40 BE 21
-39 48 2A 48 09 5A 1A 52 C2 21 09 9A 03 24 7E 9A
-FC 27 1A 83 0E 4A 2A 88 82 4A C2 21 30 4D B0 12
-2A C4 6A CA C2 CA 72 C5 C0 C5 14 D7 96 CB C0 C5
-94 CE 36 D7 16 D7 29 4E 39 90 86 12 02 20 2E 53
-30 41 39 90 85 12 03 20 1E 4E 02 00 30 41 39 90
-84 12 01 20 2E 52 30 41 19 42 C4 21 A2 53 C4 21
-89 4E 00 00 3E 40 29 00 12 12 C2 21 92 53 C2 21
-B0 12 2A C4 6A CA 96 CB C0 C5 68 D7 5E D7 21 53
-3E 90 10 00 BB 2D 30 41 6A D7 B2 41 C2 21 22 D3
-30 41 87 12 4C C6 DC D6 7A D7 82 43 BC 21 92 42
-C4 21 BA 21 A2 53 C4 21 0A 4E 3E 4F FA 90 23 00
-00 00 34 20 92 53 C2 21 B0 12 FE D6 0E 93 04 20
-B2 40 00 03 BC 21 27 3C 1E 93 04 20 B2 40 10 03
-BC 21 21 3C 2E 93 04 20 B2 40 20 03 BC 21 1B 3C
-2E 92 04 20 B2 40 20 02 BC 21 15 3C 3E 92 04 20
-B2 40 30 02 BC 21 0F 3C 3E 93 04 20 B2 40 30 03
-BC 21 09 3C B2 40 30 00 BC 21 19 42 C4 21 A2 53
-C4 21 89 4E 00 00 3E 4F 3D 41 30 4D FA 90 26 00
-00 00 08 20 B2 40 10 02 BC 21 92 53 C2 21 30 12
-EA D7 75 3F FA 90 40 00 00 00 1A 20 B2 40 20 00
-BC 21 92 53 C2 21 B0 12 48 D7 0E 20 B2 50 10 00
-BC 21 3E 40 2B 00 B0 12 48 D7 32 24 92 92 BE 21
-C2 21 02 24 92 53 C2 21 8E 10 82 5E BC 21 D3 3F
-B0 12 48 D7 F9 23 B2 50 10 00 BC 21 3E 40 28 00
-B0 12 FE D6 30 12 3A D8 67 3F 87 12 4C C6 DC D6
-72 D8 FE 90 26 00 00 00 3E 40 20 00 04 20 B2 50
-82 00 BC 21 C2 3F B0 12 48 D7 DF 23 B2 50 80 00
-BC 21 3E 40 28 00 B0 12 FE D6 B0 12 38 D7 D5 23
-3D 40 94 CE 30 4D F4 C8 04 52 45 54 49 00 87 12
-34 C4 00 13 74 CC 2A C4 34 C4 2C 00 72 D7 6A D8
-C2 D8 2E 4E 1E D2 BC 21 19 42 BA 21 92 3F C0 D6
-03 4D 4F 56 84 12 B8 D8 00 40 D0 D8 05 4D 4F 56
-2E 42 84 12 B8 D8 40 40 00 00 03 41 44 44 84 12
-B8 D8 00 50 EA D8 05 41 44 44 2E 42 84 12 B8 D8
-40 50 F6 D8 04 41 44 44 43 00 84 12 B8 D8 00 60
-04 D9 06 41 44 44 43 2E 42 00 84 12 B8 D8 40 60
-A8 D8 04 53 55 42 43 00 84 12 B8 D8 00 70 22 D9
-06 53 55 42 43 2E 42 00 84 12 B8 D8 40 70 30 D9
-03 53 55 42 84 12 B8 D8 00 80 40 D9 05 53 55 42
-2E 42 84 12 B8 D8 40 80 A2 D6 03 43 4D 50 84 12
-B8 D8 00 90 5A D9 05 43 4D 50 2E 42 84 12 B8 D8
-40 90 90 D6 04 44 41 44 44 00 84 12 B8 D8 00 A0
-74 D9 06 44 41 44 44 2E 42 00 84 12 B8 D8 40 A0
-66 D9 03 42 49 54 84 12 B8 D8 00 B0 92 D9 05 42
-49 54 2E 42 84 12 B8 D8 40 B0 9E D9 03 42 49 43
-84 12 B8 D8 00 C0 AC D9 05 42 49 43 2E 42 84 12
-B8 D8 40 C0 B8 D9 03 42 49 53 84 12 B8 D8 00 D0
-C6 D9 05 42 49 53 2E 42 84 12 B8 D8 40 D0 00 00
-03 58 4F 52 84 12 B8 D8 00 E0 E0 D9 05 58 4F 52
-2E 42 84 12 B8 D8 40 E0 12 D9 03 41 4E 44 84 12
-B8 D8 00 F0 FA D9 05 41 4E 44 2E 42 84 12 B8 D8
-40 F0 4C C6 72 D7 18 DA 1A 42 BC 21 B2 F0 70 00
-BC 21 8A 10 3A F0 0F 00 82 DA BC 21 4A 3F 4C D9
-03 52 52 43 84 12 12 DA 00 10 30 DA 05 52 52 43
-2E 42 84 12 12 DA 40 10 3C DA 04 53 57 50 42 00
-84 12 12 DA 80 10 4A DA 03 52 52 41 84 12 12 DA
-00 11 58 DA 05 52 52 41 2E 42 84 12 12 DA 40 11
-64 DA 03 53 58 54 84 12 12 DA 80 11 00 00 04 50
-55 53 48 00 84 12 12 DA 00 12 7E DA 06 50 55 53
-48 2E 42 00 84 12 12 DA 40 12 D2 D9 04 43 41 4C
-4C 00 84 12 12 DA 80 12 34 C4 2C 00 72 D7 6A D8
-B2 DA 59 42 BC 21 5A 42 BD 21 82 4A BC 21 BE 90
-00 15 00 00 02 20 0A 89 02 3C 09 8A 0A 49 3A 90
-10 00 03 2C 5A 0E A8 3F 1A 53 0E 4A 87 12 98 C7
-10 CA 0D 6F 75 74 20 6F 66 20 62 6F 75 6E 64 73
-F2 CD 8C DA 05 50 55 53 48 4D 84 12 A8 DA 00 15
-F4 DA 04 50 4F 50 4D 00 84 12 A8 DA 00 17 4C C6
-DC D6 14 DB 82 43 BC 21 92 42 C4 21 BA 21 A2 53
-C4 21 92 53 C2 21 3E 40 2C 00 B0 12 2A C4 6A CA
-96 CB C0 C5 94 CE 6A D8 3A DB 0A 4E 3E 4F 1A 83
-2A 92 CA 2F 8A 10 5A 06 6F 3F 72 DA 04 52 52 43
-4D 00 84 12 0E DB 50 00 4C DB 04 52 52 41 4D 00
-84 12 0E DB 50 01 5A DB 04 52 4C 41 4D 00 84 12
-0E DB 50 02 68 DB 04 52 52 55 4D 00 84 12 0E DB
-50 03 85 12 00 3C 76 DB 03 53 3E 3D 85 12 00 38
-88 DB 02 53 3C 00 85 12 00 34 02 DB 03 30 3E 3D
-85 12 00 30 9C DB 02 30 3C 00 85 12 00 30 00 00
-02 55 3C 00 85 12 00 2C B0 DB 03 55 3E 3D 85 12
-00 28 A6 DB 03 30 3C 3E 85 12 00 24 C4 DB 02 30
-3D 00 85 12 00 20 00 C9 02 49 46 00 1A 42 C4 21
-8A 4E 00 00 A2 53 C4 21 0E 4A 30 4D BA DB 04 54
-48 45 4E 00 1A 42 C4 21 08 4E 3E 4F 09 48 29 53
-0A 89 0A 11 3A 90 00 02 68 2F 88 DA 00 00 30 4D
-82 D9 04 45 4C 53 45 00 1A 42 C4 21 BA 40 00 3C
-00 00 A2 53 C4 21 2F 83 8F 4A 00 00 E3 3F EE DB
-05 55 4E 54 49 4C 3A 4F 08 4E 3E 4F 19 42 C4 21
-2A 83 0A 89 0A 11 3A 90 00 FE 47 3B 3A F0 FF 03
-08 DA 89 48 00 00 A2 53 C4 21 30 4D 06 DA 05 41
-47 41 49 4E 87 12 82 DB 36 DC 2A C4 00 00 05 57
-48 49 4C 45 87 12 DC DB 6E C4 2A C4 92 DB 06 52
-45 50 45 41 54 00 87 12 82 DB 36 DC F4 DB 2A C4
-00 00 03 4A 4D 50 87 12 86 CE 82 DB 36 DC 2A C4
-3E B0 00 10 03 20 3E E0 00 04 30 4D 3E 90 00 34
-06 28 03 24 3E 40 00 34 30 4D 3E 40 00 38 30 4D
-00 00 04 3F 4A 4D 50 00 87 12 A0 DC 86 CE 6E C4
-36 DC 2A C4 D6 DC 3D 41 08 4E 3E 4F 2A 48 0A 93
-04 20 98 42 C4 21 00 00 30 4D 88 43 00 00 A4 3F
-9C DA 03 42 57 31 84 12 D4 DC 00 00 F2 DC 03 42
-57 32 84 12 D4 DC 00 00 FE DC 03 42 57 33 84 12
-D4 DC 00 00 16 DD 3D 41 1A 42 C4 21 28 4E 08 93
-08 20 BA 4F 00 00 A2 53 C4 21 8E 4A 00 00 3E 4F
-30 4D 8E 43 00 00 61 3F 00 00 03 46 57 31 84 12
-14 DD 00 00 3A DD 03 46 57 32 84 12 14 DD 00 00
-46 DD 03 46 57 33 84 12 14 DD 00 00 52 DD 04 47
-4F 54 4F 00 87 12 82 DB 86 CE 6A CC 2A C4 C2 DC
-05 3F 47 4F 54 4F 87 12 A0 DC 86 CE 6A CC 2A C4
-E2 C3 63 02 D2 B3 61 02 02 24 30 40 A8 D3 1A 52
-04 24 19 62 06 24 92 43 14 24 A2 93 02 24 07 24
-0A 5A 49 69 82 4A 16 24 C2 49 18 24 0A 3C C2 4A
-15 24 8A 10 C2 4A 16 24 C2 49 17 24 89 10 C2 49
-18 24 B0 12 06 DE 7A 93 FC 23 0A 43 39 40 05 00
-D2 49 14 24 4E 05 82 93 46 05 05 24 92 B3 6C 05
-FD 27 C2 93 4C 05 59 83 F3 2F 19 83 0B 30 F2 43
-4E 05 82 93 46 05 03 24 92 B3 6C 05 FD 27 5A 92
-4C 05 F3 23 30 41 19 43 3A 43 8A 10 C2 4A 4E 05
-82 93 46 05 05 24 92 B3 6C 05 FD 27 C2 93 4C 05
-19 83 F3 23 5A 42 4C 05 30 41 1A 52 08 24 09 43
-1C D3 F2 40 51 00 19 24 B0 12 80 DD 34 20 B0 12
-06 DE 7A 90 FE FF 04 24 FA 23 D9 42 4C 05 FF 21
-F2 43 4E 05 03 43 19 53 39 90 01 02 F6 23 F2 43
-4E 05 3C C0 03 00 E2 D3 63 02 30 41 09 43 2C D3
-F0 40 58 00 A5 45 B0 12 80 DD 15 20 3A 40 FE FF
-29 43 B0 12 0A DE D2 49 00 22 4E 05 03 43 19 53
-39 90 00 02 F8 23 39 40 03 00 B0 12 08 DE 7A C0
-E1 00 6A 92 DE 27 8C 10 1C 52 4C 05 E2 D3 63 02
-87 12 10 CA 0B 3C 20 53 44 20 45 72 72 6F 72 21
-C2 DE 2F 82 8F 4E 02 00 9F 42 DA 21 00 00 B2 40
-10 00 DA 21 0E 4C B0 12 2A C4 58 C7 36 C6 FC C4
-F2 CD 39 4F 18 42 C4 21 4A 4E 0E 48 C8 4A 00 00
-18 53 30 40 0A D2 92 4B 0E 00 22 24 92 4B 10 00
-24 24 5A 42 23 24 58 42 22 24 A2 93 02 24 02 24
-08 58 30 41 59 42 24 24 89 10 0A 59 88 10 08 58
-0A 6A 88 10 08 58 30 41 82 43 1C 24 92 42 0E 24
-1A 24 C2 93 24 24 03 20 92 93 22 24 15 24 2A 15
-5A 42 12 24 19 42 22 24 58 42 24 24 0A 11 04 2C
-09 59 08 68 0A 11 FC 2B 19 52 10 24 08 63 82 49
-1A 24 82 48 1C 24 28 17 30 41 92 4B 0E 00 22 24
-92 4B 10 00 24 24 B0 12 28 DF 5A 4B 03 00 82 5A
-1A 24 82 63 1C 24 30 41 09 93 07 24 F8 90 20 00
-00 22 03 20 18 53 19 83 F9 23 30 41 1B 42 34 24
-82 43 1E 24 B2 90 00 02 20 24 9A 20 BB 80 00 02
-12 00 8B 73 14 00 DB 53 03 00 DB 92 12 24 03 00
-11 28 CB 43 03 00 B0 12 F6 DE B0 12 2A DE 8B 43
-10 00 9B 48 00 22 0E 00 92 93 02 24 03 24 9B 48
-02 22 10 00 B2 40 00 02 20 24 8B 93 14 00 0B 20
-92 9B 12 00 1E 24 74 2C BB 90 00 02 12 00 03 2C
-92 4B 12 00 20 24 B0 12 6A DF 1A 42 1A 24 19 42
-1C 24 0E 3F 3C 42 3B 40 40 24 09 43 CB 93 02 00
-10 24 9B 92 24 24 0C 00 04 20 9B 92 22 24 0A 00
-07 24 09 4B 3B 50 18 00 3B 90 00 25 EF 23 0C 5C
-30 41 0C 43 82 4B 34 24 8B 49 00 00 4A 93 07 34
-49 93 05 24 C9 93 02 00 02 34 5A 59 02 00 CB 4A
-02 00 CB 43 03 00 9B 42 1A 24 04 00 9B 42 1C 24
-06 00 18 42 30 24 8B 48 08 00 9B 48 1A 22 0A 00
-9B 48 14 22 0C 00 9B 48 1A 22 0E 00 9B 48 14 22
-10 00 9B 48 1C 22 12 00 9B 48 1E 22 14 00 82 43
-1E 24 6A 93 62 27 CC 37 8B 43 16 00 7A 93 05 24
-99 37 99 52 C2 21 16 00 95 3F 92 42 BE 21 36 24
-92 82 C2 21 36 24 92 42 C0 21 38 24 92 52 C2 21
-38 24 B2 40 14 C8 8C C8 92 42 BE 21 C2 21 82 3F
-1B 42 34 24 82 43 20 24 0B 93 AA 27 EB 93 02 00
-04 20 B0 12 FA E4 B0 12 C2 E4 5A 4B 02 00 CB 43
-02 00 2B 4B 82 4B 34 24 5A 53 05 24 99 37 92 4B
-16 00 1E 24 67 3F 1E 42 36 24 9F 42 38 24 02 00
-B2 40 9A C8 8C C8 8C 3F CA D2 85 52 45 41 44 22
-5A 43 19 3C 96 D3 86 57 52 49 54 45 22 00 6A 43
-12 3C 56 D1 84 44 45 4C 22 00 6A 42 0C 3C 52 D6
-05 43 4C 4F 53 45 B0 12 E0 E0 30 4D F2 D1 85 4C
-4F 41 44 22 7A 43 2F 83 8F 4E 00 00 0E 4A 82 93
-B6 21 0D 24 87 12 34 C4 34 C4 74 CC 74 CC 2A CA
-34 C4 E2 DE 74 CC 34 C4 9A E1 74 CC 2A C4 87 12
-34 C4 22 00 6A CA 98 E1 3D 41 2F 83 78 4E 08 5E
-C8 43 00 00 1C 43 92 42 2C 24 22 24 92 42 2E 24
-24 24 CE 93 00 00 96 24 FE 90 3A 00 01 00 01 20
-2E 53 FE 90 5C 00 00 00 09 20 1E 53 92 42 02 24
-22 24 82 43 24 24 CE 93 00 00 76 24 82 4E 32 24
-B0 12 28 DF BF 40 20 00 00 00 A2 93 02 24 04 24
-92 92 22 24 02 24 03 24 9F 42 12 24 00 00 B0 12
-0A E0 2C 43 0A 43 08 4A 58 0E 08 58 82 48 30 24
-C8 93 00 22 67 24 39 42 F8 9E 00 22 04 20 18 53
-19 83 FA 23 1E 53 FE 90 2E 00 FF FF 1B 24 39 50
-03 00 B0 12 88 DF 07 20 FE 90 5C 00 FF FF 2C 24
-CE 93 FF FF 29 24 1E 42 32 24 1A 53 3A 90 10 00
-DA 23 92 53 1A 24 82 63 1C 24 9F 83 00 00 CF 23
-2C 42 40 3C FE 90 2E 00 FE FF ED 27 B0 12 88 DF
-EA 23 39 40 03 00 F8 9E 00 22 04 20 18 53 19 83
-FA 23 0A 3C CE 93 FF FF DE 23 FE 90 5C 00 FF FF
-DA 23 B0 12 88 DF D7 23 18 42 30 24 92 48 1A 22
-22 24 92 48 14 22 24 24 F8 B0 10 00 0B 22 16 24
-82 93 24 24 06 20 82 93 22 24 03 20 92 42 02 24
-22 24 CE 93 FF FF 87 23 92 42 22 24 2C 24 92 42
-24 24 2E 24 2F 52 3E 4F 3D 41 30 4D 1A 4F 02 00
-B0 12 14 E0 2F 53 3A 4F 3E 4F 7A 93 12 20 0C 93
-01 20 30 4D 87 12 10 CA 0B 3C 20 4F 70 65 6E 45
-72 72 6F 72 7C C9 AC C7 CA CC F4 C9 BC C9 BC C5
-C0 DE 1A 93 8A 20 0C 93 ED 23 30 4D 2A E1 04 52
-45 41 44 00 2F 83 8F 4E 00 00 1E 42 34 24 B0 12
-9C DF 1E 82 34 24 30 4D 2C 43 12 12 2A 24 18 42
-02 24 08 58 2A 41 82 9A 0A 24 75 24 B0 12 2A DE
-09 43 28 93 03 24 89 93 02 22 03 20 89 93 00 22
-07 24 09 58 39 90 00 02 F4 23 91 53 00 00 EA 3F
-0C 43 6A 41 B9 43 00 22 28 93 0F 24 B9 40 FF 0F
-02 22 09 11 8A 10 09 5A 5A 41 01 00 0A 11 09 10
-82 4A 28 24 82 49 26 24 07 3C 09 11 C2 49 26 24
-C2 4A 27 24 82 43 28 24 3A 41 82 4A 2A 24 30 41
-0A 12 1A 52 08 24 B0 12 6C DE 3A 41 1A 52 0C 24
-30 40 6C DE 09 43 0A 43 30 41 22 2A 2B 2C 2F 3A
-3B 3C 3D 3E 3F 5B 5C 5D 7C 2E 29 92 06 38 39 80
-03 00 B0 12 18 E4 39 40 03 00 7A 4B C8 4A 00 22
-0A 93 12 24 0D 12 3D 40 0F 00 3C 40 CA E3 7A 9C
-F4 27 1D 83 FC 23 3D 41 6A 9C E7 27 3A 80 21 00
-EC 3B 18 53 19 83 E9 23 09 93 06 24 F8 40 20 00
-00 22 18 53 19 83 FA 23 30 41 2A 93 E4 20 2C 93
-0D 24 0C 93 BA 24 87 12 10 CA 0C 3C 20 57 72 69
-74 65 45 72 72 6F 72 00 BC C5 04 E3 B0 12 38 E3
-92 42 26 24 22 24 92 42 28 24 24 24 B0 12 B0 E3
-B0 12 0A E0 18 42 30 24 F8 40 20 00 0B 22 B0 12
-C4 E3 88 43 0C 22 88 4A 0E 22 88 49 10 22 88 49
-12 22 98 42 24 24 14 22 98 42 22 24 1A 22 88 43
-1C 22 88 43 1E 22 1C 43 1B 42 32 24 CB 93 00 00
-CA 27 FB 90 2E 00 00 00 C6 27 39 40 0B 00 B0 12
-EA E3 B0 12 04 E5 2A 43 B0 12 14 E0 0C 93 BB 23
-30 4D 1A 4B 04 00 19 4B 06 00 B0 12 30 DE B0 12
-C4 E3 18 4B 08 00 88 49 12 22 88 4A 16 22 88 49
-18 22 98 4B 12 00 1C 22 98 4B 14 00 1E 22 1A 4B
-04 00 19 4B 06 00 30 40 6E DE 9B 52 1E 24 12 00
-8B 63 14 00 1A 42 1A 24 19 42 1C 24 30 40 6E DE
-B2 40 00 02 1E 24 1B 42 34 24 B0 12 FA E4 82 43
-1E 24 DB 53 03 00 DB 92 12 24 03 00 22 20 CB 43
-03 00 B0 12 F6 DE 08 12 0A 12 B0 12 38 E3 2A 91
-05 24 B0 12 B0 E3 2A 41 B0 12 2A DE 3A 41 38 41
-98 42 26 24 00 22 92 93 02 24 03 24 98 42 28 24
-02 22 B0 12 B0 E3 9B 42 26 24 0E 00 9B 42 28 24
-10 00 30 40 6A DF 36 E1 05 57 52 49 54 45 B0 12
-10 E5 30 4D 1E E3 07 53 44 5F 45 4D 49 54 B2 90
-00 02 1E 24 02 28 B0 12 10 E5 18 42 1E 24 C8 4E
-00 22 92 53 1E 24 3E 4F 30 4D 58 4B 13 00 5C 4B
-14 00 8C 10 0C 58 5A 4B 15 00 0A 11 0C 10 18 4B
-12 00 BB C0 FF 01 12 00 38 F0 FF 01 82 48 1E 24
-5B 42 12 24 B0 12 86 C6 1B 42 34 24 CB 4A 03 00
-19 5B 0A 00 18 6B 0C 00 8B 49 0E 00 8B 48 10 00
-B0 12 06 E0 30 4D 0C 93 38 20 38 90 E0 01 03 2C
-C8 93 20 22 02 24 7C 40 E5 00 C8 4C 00 22 B0 12
-04 E5 B0 12 02 DF 82 4A 2A 24 0B 4A B0 12 2A DE
-1A 48 00 22 88 43 00 22 92 93 02 24 09 24 19 48
-02 22 88 43 02 22 39 F0 FF 0F 39 90 FF 0F 02 20
-3A 93 0E 24 82 4A 22 24 82 49 24 24 B0 12 02 DF
-0B 9A E6 27 0A 12 0A 4B B0 12 B0 E3 3A 41 DD 3F
-0A 4B B0 12 B0 E3 B0 12 E0 E0 30 4D 06 D1 08 54
-45 52 4D 32 53 44 22 00 87 12 4A E1 AC C7 80 E6
-21 53 2F 83 AF 43 00 00 3D 40 90 E6 30 40 9A E1
-92 E6 92 C3 1C 05 08 43 B0 12 CE C8 92 B3 1C 05
-FD 27 59 42 0C 05 69 92 0D 24 C8 49 00 22 18 53
-38 90 FF 01 04 24 F2 2B B0 12 10 E5 EC 3F B0 12
-E0 C8 EC 3F B0 12 E0 C8 82 48 1E 24 B0 12 E0 E0
-3D 41 30 4D
-@FFE2
-AE D3 AE D3 AE D3 AE D3 AE D3 0E C9 AE D3 AE D3
-AE D3 AE D3 AE D3 AE D3 AE D3 AE D3 AE D3
-q
@1800
-10 00 92 C8 80 3E 80 04 FD FF 18 00 9E DB 54 D4
-52 C8 64 C8 00 00 00 00
+10 00 BA C8 80 3E 80 04 05 00 18 00 FC DC B4 D5
+7A C8 8C C8 00 00 00 00
@21AA
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 C4
03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
44 55 50 00 0E 93 F6 23 30 4D 40 C4 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 C4 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E C4 02 3E 52 00 0E 12 3E 4F 30 4D 8E C4
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 C4
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C C4 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 20 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 C4 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 C5
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 C4 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA C4 03 41 4E 44 3E FF 30 4D 7A C4 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E C5 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 C5 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E C5 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 C5 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 C4 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
+50 00 3E 4F 30 4D 00 00 03 4E 49 50 2F 53 30 4D
+00 00 04 53 57 41 50 00 2A 4F 8F 4E 00 00 0E 4A
+30 4D 68 C4 04 4F 56 45 52 00 8F 4E FE FF 2E 4F
+2F 83 30 4D 72 C4 03 52 4F 54 2A 4F 8F 4E 00 00
+1E 4F 02 00 8F 4A 02 00 30 4D 4E C4 02 3E 52 00
+0E 12 3E 4F 30 4D 96 C4 02 52 3E 00 2F 83 8F 4E
+00 00 3E 41 30 4D B8 C4 02 52 40 00 2F 83 8F 4E
+00 00 2E 41 30 4D 5C C4 05 44 45 50 54 48 8F 4E
+FE FF 3E 40 80 20 0E 8F 2F 83 0E 11 30 4D 00 00
+01 40 2E 4E 30 4D F0 C4 01 21 BE 4F 00 00 3E 4F
+30 4D 00 00 02 43 40 00 6E 4E 30 4D 04 C5 02 43
+21 00 FE 4F 00 00 1F 53 3E 4F 30 4D 00 00 01 2B
+3E 5F 30 4D 30 C4 01 2D 3E 8F 3E E3 1E 53 30 4D
+F8 C4 03 41 4E 44 3E FF 30 4D 84 C4 02 4F 52 00
+3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D 3C C5
+06 4E 45 47 41 54 45 00 E8 3F 32 C5 03 41 42 53
+0E 93 E3 33 30 4D D8 C4 04 44 41 42 53 00 3E F3
+06 34 BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D
+00 00 02 30 3D 00 1E 83 0E 7E 30 4D 82 C5 02 30
+3C 00 0E 5E 0E 7E 3E E3 30 4D 8E C5 02 30 3E 00
+1E 93 05 34 0B 3C 00 00 01 3D 3E 8F 07 20 3E 43
+30 4D A8 C5 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
+AC C4 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE C5 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 C5 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 C5 03 3E 49 4E 85 12 C2 21 10 C5
-04 42 41 53 45 00 85 12 DA 21 C0 C4 05 53 54 41
-54 45 85 12 B6 21 30 C6 02 42 4C 00 85 12 20 00
-F4 C5 03 55 4D 2A 2C 4F 0A 43 08 43 0B 43 19 43
-0E B9 02 24 08 5C 0B 6A 0C 5C 0A 6A 09 59 F8 2B
-8F 48 00 00 0E 4B 30 4D 94 C5 02 3C 23 00 B2 40
-AA 21 AA 21 30 4D 1E 15 0E 43 3D 40 20 00 0A 93
-04 20 0D 11 0A 4C 0C 43 09 43 0E 9B 01 28 0E 8B
-09 69 08 68 1D 83 07 30 0C 5C 0A 6A 0E 6E F5 2B
-0E 8B 12 D3 F5 3F 0A 4E 1D 17 30 41 48 C6 01 23
-1B 42 DA 21 2C 4F 0A 4E B0 12 86 C6 8F 49 00 00
-0E 48 7A 90 0A 00 02 28 3A 50 07 00 3A 50 30 00
-92 83 AA 21 18 42 AA 21 C8 4A 00 00 30 4D BE C6
-02 23 53 00 87 12 C0 C6 FA C6 2D 83 09 93 E0 23
-0E 93 DE 23 3D 41 30 4D F0 C6 02 23 3E 00 9F 42
-AA 21 00 00 3E 40 AA 21 2E 8F 30 4D 00 C6 04 48
-4F 4C 44 00 0A 4E 3E 4F DB 3F 3C C6 04 53 49 47
-4E 00 0E 93 3E 4F 3A 40 2D 00 D2 33 30 4D 52 C6
-03 55 44 2E 87 12 7E C6 F4 C6 0E C7 78 C9 40 C9
-2A C4 40 C7 02 55 2E 00 2F 83 8F 4E 00 00 0E 43
-F1 3F 3E B0 00 80 06 24 BF E3 00 00 3E E3 9F 53
-00 00 0E 63 30 4D DA C4 02 44 2E 00 87 12 7E C6
-6E C4 80 C4 62 C7 F4 C6 92 C4 32 C7 0E C7 78 C9
-40 C9 2A C4 52 C5 01 2E 3E B0 00 80 DD 27 2F 83
-3E 43 EC 3F 1E C7 04 48 45 52 45 00 2F 83 8F 4E
-00 00 1E 42 C4 21 30 4D 62 C5 05 41 4C 4C 4F 54
-82 5E C4 21 3E 4F 30 4D 0A C7 02 43 2C 00 1A 42
-C4 21 CA 4E 00 00 92 53 C4 21 3E 4F 30 4D 2F 83
-8F 4E 00 00 B0 12 52 C8 92 B3 1C 05 FD 27 1E 42
-0C 05 B0 12 64 C8 30 4D 30 40 DE C7 A6 C7 05 28
-4B 45 59 29 18 42 0C 05 EA 3F 12 C6 03 4B 45 59
-30 40 04 C8 BA C7 06 41 43 43 45 50 54 00 3C 40
-D0 C8 3B 40 9A C8 2D 15 0A 4E 2E 4F 0A 5E 3B 40
-0D 00 3C 40 20 00 3D 40 C4 C8 92 B3 1C 05 05 24
-18 42 0C 05 38 90 0A 00 04 20 21 53 39 40 7E C8
-4D 15 B2 40 11 00 0E 05 A2 B3 1C 05 FD 27 F2 C2
-03 02 30 41 B2 40 13 00 0E 05 A2 B3 1C 05 FD 27
-F2 D2 03 02 30 41 00 00 05 53 4C 45 45 50 30 40
-8C C8 00 00 07 28 53 4C 45 45 50 29 12 D2 0A 18
-F6 3F 21 52 3A 17 58 42 0C 05 48 9B E3 27 48 9C
-06 2C 78 92 11 20 2E 9F 0F 24 1E 83 05 3C 0E 9A
-03 24 CE 48 00 00 1E 53 82 48 0E 05 A2 B3 1C 05
-FD 27 30 4D C6 C8 2D 83 92 B3 1C 05 FD 27 E3 23
-B2 40 18 00 0A 18 3E 8F 3D 41 30 4D FE C7 06 28
-45 4D 49 54 29 00 08 4E 3E 4F E6 3F 78 C7 04 45
-4D 49 54 00 30 40 E6 C8 EE C8 04 45 43 48 4F 00
-B2 40 82 48 B8 C8 30 4D 96 C7 06 4E 4F 45 43 48
-4F 00 B2 40 30 4D B8 C8 30 4D DE C8 04 28 43 52
-29 00 2F 83 8F 4E 00 00 3E 40 0D 00 E3 3F CA C7
-02 43 52 00 30 40 22 C9 2C C7 05 53 50 41 43 45
-2F 83 8F 4E 00 00 3E 40 20 00 D4 3F 3A C9 06 53
-50 41 43 45 53 00 0E 93 09 24 0D 12 3D 40 62 C9
-EF 3F 64 C9 2D 83 1E 83 EB 23 3D 41 3E 4F 30 4D
-54 C7 04 54 59 50 45 00 0E 93 95 24 2A 4F 8F 5E
-00 00 0E 4A 87 12 CA C5 02 C6 0A C5 F4 C8 EC C5
-88 C9 2A C4 2F 82 8F 4E 02 00 7E 4D 8F 4D 00 00
-0D 5E 1D B3 0D 63 30 4D 4E C9 82 53 22 00 87 12
-34 C4 94 C9 F8 CB 34 C4 22 00 EE C9 BE C9 3D 41
-6E 4E 1E 83 82 5E C4 21 3E 4F 92 B3 C4 21 A2 63
-C4 21 30 4D 0A C9 82 2E 22 00 87 12 AE C9 34 C4
-78 C9 F8 CB 2A C4 00 00 04 57 4F 52 44 00 3C 40
-BE 21 39 4C 3A 4C 09 5A 3A 5C 28 4C 09 9A 19 24
-7E 9A FC 27 1A 83 3B 40 60 00 C8 4C 00 00 09 9A
-0C 24 7C 4A 4E 9C 09 24 18 53 4B 9C F6 2F 7C 90
-7B 00 F3 2F 7C 80 20 00 F0 3F 1A 82 C0 21 82 4A
-C2 21 1E 42 C4 21 08 8E CE 48 00 00 30 4D 00 00
-04 46 49 4E 44 00 2F 83 0C 4E 65 4C 74 40 80 00
-3B 40 CA 21 3E 4B 0E 93 1E 24 58 4C 01 00 78 F0
-1E 00 0E 58 2E 53 1E 4E FE FF 0E 93 F3 27 09 4E
-78 49 48 C4 48 95 F7 23 0A 4C 1A 53 FA 99 00 00
-F2 23 58 83 FA 23 19 B3 09 63 0C 49 6A 4E 1E 43
-4A 93 01 30 2E 83 8F 4C 00 00 35 40 08 C4 34 40
-14 C4 30 4D 2F 53 2F 53 3E 4F 30 4D 26 C6 07 3E
-4E 55 4D 42 45 52 2C 4F 6C 4C 7C 80 30 00 7C 90
-0A 00 02 28 7C 80 07 00 1C 92 DA 21 25 2C 2E 15
-2F 83 9F 4F 04 00 00 00 1E 42 DA 21 3D 40 E4 CA
-30 40 56 C6 E6 CA 2F 12 9F 4F 06 00 00 00 1E 42
-DA 21 3D 40 FA CA 30 40 56 C6 FC CA 3E 51 BF 51
-00 00 0E 63 AF 4F 06 00 8F 4E 04 00 1D 17 2F 53
-9F 53 00 00 1E 83 CF 23 30 4D 03 12 0D 12 12 12
-DA 21 32 C0 00 02 6D 4E 0D 5E 0C 4E 7A 40 2E 00
-0D 9C 0A 28 7A 9C FC 23 32 D0 00 02 FC 4C FE FF
-0D 9C FC 2F DE 83 00 00 3D 40 A6 CB 3F 82 8F 4E
-06 00 8F 43 04 00 8F 43 02 00 0A 4E 7E 4A 8F 4A
-00 00 79 4A 79 90 2D 00 17 2C 79 80 24 00 04 20
-B2 40 10 00 DA 21 0A 3C 59 83 03 20 A2 43 DA 21
-05 3C 69 53 98 23 B2 40 0A 00 DA 21 8F 4A 00 00
-1E 83 79 4A 79 90 2D 00 8E 23 B1 43 04 00 8F 4A
-00 00 1E 83 88 3F A8 CB 2F 53 0E 93 2C 17 82 4C
-DA 21 03 24 2F 52 0E F3 30 4D 9F 4F 02 00 04 00
-BF 4F 00 00 3E E3 09 20 3E E3 BF E3 02 00 BF E3
-00 00 9F 53 02 00 8F 63 00 00 32 B0 00 02 01 20
-2F 53 30 4D FA C8 07 45 58 45 43 55 54 45 0A 4E
-3E 4F 00 4A 28 C5 01 2C 1A 42 C4 21 A2 53 C4 21
-8A 4E 00 00 3E 4F 30 4D F6 CB 87 4C 49 54 45 52
-41 4C 82 93 B6 21 16 24 32 B0 00 02 09 24 1A 42
-C4 21 A2 52 C4 21 BA 40 34 C4 00 00 BA 4F 02 00
+0E 93 3E 4F FB 27 2D 53 30 4D 1E 83 0E 7E F9 3F
+39 40 00 80 39 8F 08 4E 3E 4F 08 59 19 15 30 4D
+81 5E 00 00 3E 4F 32 B0 00 01 E8 27 2D 53 21 52
+30 4D 91 53 00 00 F7 3F CE C5 06 55 4E 4C 4F 4F
+50 00 F5 3F 00 00 01 49 2F 83 8F 4E 00 00 2E 41
+1E 81 02 00 30 4D 1E C5 01 4A 2F 83 8F 4E 00 00
+1E 41 04 00 1E 81 06 00 30 4D 9C C5 03 50 41 44
+85 12 E2 20 1A C6 03 54 49 42 85 12 38 21 0E C5
+03 43 50 4C 85 12 50 00 C2 C5 03 3E 49 4E 85 12
+C2 21 60 C6 04 42 41 53 45 00 85 12 DA 21 C8 C4
+05 53 54 41 54 45 85 12 B6 21 74 C6 02 42 4C 00
+85 12 20 00 56 C6 03 55 4D 2A 2C 4F 0A 43 08 43
+0B 43 19 43 0E B9 02 24 08 5C 0B 6A 0C 5C 0A 6A
+09 59 F8 2B 8F 48 00 00 0E 4B 30 4D B4 C5 02 3C
+23 00 B2 40 AA 21 AA 21 30 4D 8C C6 01 23 2C 4F
+5B 42 DA 21 0A 43 34 40 20 00 0E 93 04 20 04 11
+0E 4C 0C 43 09 43 0A 9B 01 28 0A 8B 09 69 08 68
+14 83 07 30 0C 5C 0E 6E 0A 6A F5 2B 0A 8B 12 D3
+F5 3F 34 40 14 C4 8F 49 00 00 0E 48 7A 90 0A 00
+02 28 3A 50 07 00 3A 50 30 00 92 83 AA 21 18 42
+AA 21 C8 4A 00 00 30 4D CC C6 02 23 53 00 87 12
+CE C6 34 C7 2D 83 09 93 CA 23 0E 93 C8 23 3D 41
+30 4D 2A C7 02 23 3E 00 9F 42 AA 21 00 00 3E 40
+AA 21 2E 8F 30 4D 26 C6 04 48 4F 4C 44 00 0A 4E
+3E 4F DB 3F 80 C6 04 53 49 47 4E 00 0E 93 3E 4F
+3A 40 2D 00 D2 33 30 4D 96 C6 02 55 2E 00 87 12
+C2 C6 34 C4 00 00 2E C7 48 C7 A0 C9 68 C9 2A C4
+68 C5 02 44 2E 00 87 12 C2 C6 78 C4 8A C4 6E C5
+2E C7 9A C4 6C C7 48 C7 A0 C9 68 C9 2A C4 50 C5
+01 2E 0E 93 E4 37 2F 83 8F 4E 00 00 3E 43 EB 3F
+58 C7 04 48 45 52 45 00 2F 83 8F 4E 00 00 1E 42
+C4 21 30 4D 5C C5 05 41 4C 4C 4F 54 82 5E C4 21
+3E 4F 30 4D 44 C7 02 43 2C 00 1A 42 C4 21 CA 4E
+00 00 92 53 C4 21 3E 4F 30 4D 2F 83 8F 4E 00 00
+B0 12 7A C8 92 B3 1C 05 FD 27 1E 42 0C 05 B0 12
+8C C8 30 4D C2 C7 05 28 4B 45 59 29 18 42 0C 05
+EC 3F 38 C6 03 4B 45 59 30 40 1C C8 D6 C7 06 41
+43 43 45 50 54 00 30 40 46 C8 16 C8 08 28 41 43
+43 45 50 54 29 00 3C 40 F8 C8 3B 40 C2 C8 2D 15
+0A 4E 2E 4F 0A 5E 3B 40 0D 00 3C 40 20 00 3D 40
+EC C8 92 B3 1C 05 05 24 18 42 0C 05 38 90 0A 00
+04 20 21 53 39 40 A6 C8 4D 15 B2 40 11 00 0E 05
+F2 C2 03 02 A2 B3 1C 05 FD 27 30 41 B2 40 13 00
+0E 05 F2 D2 03 02 A2 B3 1C 05 FD 27 30 41 00 00
+05 53 4C 45 45 50 30 40 B4 C8 00 00 07 28 53 4C
+45 45 50 29 12 D2 0A 18 F6 3F 21 52 3A 17 58 42
+0C 05 48 9B E3 27 48 9C 06 2C 78 92 11 20 2E 9F
+0F 24 1E 83 05 3C 0E 9A 03 24 CE 48 00 00 1E 53
+82 48 0E 05 A2 B3 1C 05 FD 27 30 4D EE C8 2D 83
+92 B3 1C 05 FD 27 E3 23 B2 40 18 00 0A 18 3E 8F
+3D 41 30 4D 3C C8 06 28 45 4D 49 54 29 00 08 4E
+3E 4F E6 3F 92 C7 04 45 4D 49 54 00 30 40 0E C9
+16 C9 04 45 43 48 4F 00 B2 40 82 48 E0 C8 30 4D
+B0 C7 06 4E 4F 45 43 48 4F 00 B2 40 30 4D E0 C8
+30 4D 06 C9 04 28 43 52 29 00 2F 83 8F 4E 00 00
+3E 40 0D 00 E3 3F E6 C7 02 43 52 00 30 40 4A C9
+66 C7 05 53 50 41 43 45 2F 83 8F 4E 00 00 3E 40
+20 00 D4 3F 62 C9 06 53 50 41 43 45 53 00 0E 93
+09 24 0D 12 3D 40 8A C9 EF 3F 8C C9 2D 83 1E 83
+EB 23 3D 41 3E 4F 30 4D 7A C7 04 54 59 50 45 00
+0E 93 95 24 2A 4F 8F 5E 00 00 0E 4A 87 12 F0 C5
+28 C6 08 C5 1C C9 12 C6 B0 C9 2A C4 2F 82 8F 4E
+02 00 7E 4D 8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D
+76 C9 82 53 22 00 87 12 34 C4 BC C9 20 CC 34 C4
+22 00 16 CA E6 C9 3D 41 6E 4E 1E 83 82 5E C4 21
+3E 4F 92 B3 C4 21 A2 63 C4 21 30 4D 32 C9 82 2E
+22 00 87 12 D6 C9 34 C4 A0 C9 20 CC 2A C4 00 00
+04 57 4F 52 44 00 3C 40 BE 21 39 4C 3A 4C 09 5A
+3A 5C 28 4C 09 9A 19 24 7E 9A FC 27 1A 83 3B 40
+60 00 C8 4C 00 00 09 9A 0C 24 7C 4A 4E 9C 09 24
+18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F 7C 80 20 00
+F0 3F 1A 82 C0 21 82 4A C2 21 1E 42 C4 21 08 8E
+CE 48 00 00 30 4D 00 00 04 46 49 4E 44 00 2F 83
+0C 4E 65 4C 74 40 80 00 3B 40 CA 21 3E 4B 0E 93
+1E 24 58 4C 01 00 78 F0 1E 00 0E 58 2E 53 1E 4E
+FE FF 0E 93 F3 27 09 4E 78 49 48 C4 48 95 F7 23
+0A 4C 1A 53 FA 99 00 00 F2 23 58 83 FA 23 19 B3
+09 63 0C 49 6A 4E 1E 43 4A 93 01 30 2E 83 8F 4C
+00 00 35 40 08 C4 34 40 14 C4 30 4D 2F 53 2F 53
+3E 4F 30 4D 6A C6 07 3E 4E 55 4D 42 45 52 2C 4F
+6C 4C 7C 80 30 00 7C 90 0A 00 02 28 7C 80 07 00
+1C 92 DA 21 25 2C 2E 15 2F 83 9F 4F 04 00 00 00
+1E 42 DA 21 3D 40 0C CB 30 40 9A C6 0E CB 2F 12
+9F 4F 06 00 00 00 1E 42 DA 21 3D 40 22 CB 30 40
+9A C6 24 CB 3E 51 BF 51 00 00 0E 63 AF 4F 06 00
+8F 4E 04 00 1D 17 2F 53 9F 53 00 00 1E 83 CF 23
+30 4D 03 12 0D 12 12 12 DA 21 32 C0 00 02 6D 4E
+0D 5E 0C 4E 7A 40 2E 00 0D 9C 0A 28 7A 9C FC 23
+32 D0 00 02 FC 4C FE FF 0D 9C FC 2F DE 83 00 00
+3D 40 CE CB 3F 82 8F 4E 06 00 8F 43 04 00 8F 43
+02 00 0A 4E 7E 4A 8F 4A 00 00 79 4A 79 90 2D 00
+17 2C 79 80 24 00 04 20 B2 40 10 00 DA 21 0A 3C
+59 83 03 20 A2 43 DA 21 05 3C 69 53 98 23 B2 40
+0A 00 DA 21 8F 4A 00 00 1E 83 79 4A 79 90 2D 00
+8E 23 B1 43 04 00 8F 4A 00 00 1E 83 88 3F D0 CB
+2F 53 0E 93 2C 17 82 4C DA 21 03 24 2F 52 0E F3
+30 4D 9F 4F 02 00 04 00 BF 4F 00 00 3E E3 09 20
+3E E3 BF E3 02 00 BF E3 00 00 9F 53 02 00 8F 63
+00 00 32 B0 00 02 01 20 2F 53 30 4D 22 C9 07 45
+58 45 43 55 54 45 0A 4E 3E 4F 00 4A 26 C5 01 2C
+1A 42 C4 21 A2 53 C4 21 8A 4E 00 00 3E 4F 30 4D
+1E CC 87 4C 49 54 45 52 41 4C 82 93 B6 21 0F 24
1A 42 C4 21 A2 52 C4 21 BA 40 34 C4 00 00 8A 4E
-02 00 3E 4F 30 4D 30 C9 05 43 4F 55 4E 54 2F 83
-1E 53 8F 4E 00 00 5E 4E FF FF 30 4D 82 4E BE 21
-B2 4F C0 21 3E 4F 82 43 C2 21 87 12 4C C6 EE C9
-72 CC 3D 40 7E CC E7 22 3D 41 3E 4F 30 4D 80 CC
-0A 4E 3E 4F 3D 40 96 CC 48 27 3D 40 6C CC 1A E2
-B6 21 B2 27 AC 23 98 CC 3E 4F 3D 40 6C CC B9 23
-DE 53 00 00 68 4E 08 5E F8 40 3F 00 00 00 3D 40
-62 CE CD 3F E6 CB 08 45 56 41 4C 55 41 54 45 00
-39 40 BE 21 39 12 39 12 39 12 0D 12 B0 12 2A C4
-5C CC D4 CC 3D 41 B2 41 C2 21 B2 41 C0 21 B2 41
-BE 21 30 4D 7A C5 04 51 55 49 54 00 31 40 E0 20
-B2 40 00 20 00 20 82 43 B6 21 82 43 08 18 B0 12
-2A C4 94 C9 04 0D 6F 6B 20 00 78 C9 34 C4 38 21
-44 C4 34 C4 50 00 1E C8 40 C9 5C CC 34 C4 7E 20
-CE C4 B2 C5 94 C9 0D 73 74 61 63 6B 20 65 6D 70
-74 79 20 21 70 CD 34 C4 30 FF AC C7 B2 C5 94 C9
-0B 46 52 41 4D 20 66 75 6C 6C 20 21 70 CD 42 C6
-F4 C4 C0 C5 02 CD 94 C9 04 0D 20 20 20 00 BC C5
-0A CD 16 C8 05 41 42 4F 52 54 3F 40 80 20 BE 3F
-8F 93 02 00 97 26 B2 40 82 48 B8 C8 B0 12 62 D2
-82 43 18 DB 82 43 24 DB 82 43 30 DB 82 43 60 DB
-82 43 6C DB 82 43 78 DB A2 B3 1C 05 FD 27 B2 40
-11 00 0E 05 F2 C2 03 02 92 C3 1C 05 38 40 A0 AA
-39 42 19 83 FE 23 18 83 FB 23 92 B3 1C 05 F4 23
-87 12 94 C9 04 1B 5B 37 6D 00 78 C9 78 C9 94 C9
-04 1B 5B 30 6D 00 78 C9 A4 D1 E6 D1 EC D1 6A CD
-64 CD 86 41 42 4F 52 54 22 00 87 12 AE C9 34 C4
-70 CD F8 CB 2A C4 40 CA 01 27 87 12 4C C6 EE C9
-46 CA C0 C5 08 CE 2A C4 A0 CC 7A C6 81 5C 92 42
-BE 21 C2 21 30 4D 87 12 CA C9 4C C6 EE C9 20 CE
-08 4E 7A 4E 5A D3 5A 53 0A 58 19 42 C8 21 6E 4E
-3E F0 1E 00 09 5E 82 48 AE 21 82 49 B0 21 82 4A
-B2 21 2A 52 82 4A C4 21 3E 4F 3D 41 30 41 87 12
-94 C9 0F 73 74 61 63 6B 20 6D 69 73 6D 61 74 63
-68 21 76 CD 82 9F B4 21 F2 23 18 42 AE 21 19 42
-B0 21 A8 49 FE FF 89 48 00 00 30 4D E8 C9 08 56
-41 52 49 41 42 4C 45 00 B0 12 16 CE BA 40 86 12
-FC FF EF 3F 48 CC 08 43 4F 4E 53 54 41 4E 54 00
-B0 12 16 CE BA 40 85 12 FC FF 8A 4E FE FF 3E 4F
-E0 3F 96 CE 06 43 52 45 41 54 45 00 B0 12 16 CE
-BA 40 85 12 FC FF 8A 4A FE FF D3 3F B6 CC 05 44
-4F 45 53 3E 1A 42 B2 21 BA 40 84 12 00 00 8A 4D
-02 00 3D 41 30 4D CE CE 05 44 45 46 45 52 B0 12
-16 CE BA 40 30 40 FC FF BA 40 E4 CE FE FF B9 3F
-00 00 81 5B 82 43 B6 21 30 4D 0C CE 01 5D B2 43
-B6 21 30 4D AA C9 87 52 45 43 55 52 53 45 19 42
-C4 21 99 42 B2 21 00 00 A2 53 C4 21 30 4D 02 CF
-01 3A B0 12 16 CE BA 40 87 12 FC FF A2 83 C4 21
-B2 43 B6 21 82 4F B4 21 30 4D 30 CF 81 3B 82 93
-B6 21 5D 27 87 12 34 C4 2A C4 F8 CB 64 CE 04 CF
-2A C4 1C C9 09 49 4D 4D 45 44 49 41 54 45 1A 42
-AE 21 FA D0 80 00 00 00 30 4D BE 4F 02 00 3E 4F
-30 4D 64 CF 82 49 53 00 87 12 42 C6 F4 C4 C0 C5
-9C CF A8 CF 34 C4 7A CF F8 CB 2A C4 FA CD 7A CF
-2A C4 4C CF 83 5B 27 5D 87 12 FA CD 34 C4 34 C4
-F8 CB F8 CB 2A C4 E6 CC 88 50 4F 53 54 50 4F 4E
-45 00 87 12 4C C6 EE C9 46 CA 54 C4 C0 C5 08 CE
-7E C5 C0 C5 E2 CF 34 C4 34 C4 F8 CB F8 CB 34 C4
-F8 CB F8 CB 2A C4 E8 CF 3A 4E 82 4A C6 21 2E 4E
-82 4E C4 21 3D 40 10 00 09 4A 08 49 29 83 18 48
-FE FF 0E 98 FC 2B 89 48 00 00 1D 83 F6 23 2A 4A
-0A 93 F0 23 3E 4F 3D 41 30 4D 84 CF 82 49 46 00
-2F 83 8F 4E 00 00 1E 42 C4 21 BE 40 C0 C5 00 00
-A2 52 C4 21 2E 53 30 4D E8 CE 84 45 4C 53 45 00
-1A 42 C4 21 BA 40 BC C5 00 00 2A 52 82 4A C4 21
-8E 4A 00 00 2A 83 0E 4A 30 4D 72 C9 84 54 48 45
-4E 00 9E 42 C4 21 00 00 3E 4F 30 4D B4 CE 85 42
-45 47 49 4E 30 40 AC C7 5C D0 85 55 4E 54 49 4C
-39 40 C0 C5 1A 42 C4 21 A2 52 C4 21 8A 49 00 00
-8A 4E 02 00 3E 4F 30 4D E2 CD 85 41 47 41 49 4E
-39 40 BC C5 EF 3F 7E CE 85 57 48 49 4C 45 87 12
-20 D0 6E C4 2A C4 16 CF 86 52 45 50 45 41 54 00
-87 12 A0 D0 62 D0 2A C4 3A D0 82 44 4F 00 2F 83
-8F 4E 00 00 1E 42 C4 21 BE 40 CA C5 00 00 2E 53
-82 4E C4 21 A2 53 00 20 1A 42 00 20 8A 43 00 00
-30 4D 0A CC 84 4C 4F 4F 50 00 39 40 EC C5 1A 42
-C4 21 A2 52 C4 21 8A 49 00 00 8A 4E 02 00 1E 42
-00 20 A2 83 00 20 2E 4E 0E 93 04 24 9E 42 C4 21
-00 00 F5 3F 3E 4F 30 4D 0C C8 85 2B 4C 4F 4F 50
-39 40 DA C5 E4 3F F4 D0 85 4C 45 41 56 45 1A 42
-C4 21 BA 40 FC C5 00 00 BA 40 BC C5 02 00 B2 50
-06 00 C4 21 A2 53 00 20 2A 52 19 42 00 20 89 4A
-00 00 30 4D 38 D1 04 4D 4F 56 45 00 0A 4E 38 4F
-39 4F 3E 4F 0A 93 11 24 08 99 0F 24 06 2C F8 49
-00 00 18 53 1A 83 FB 23 30 4D 08 5A 09 5A 19 83
-18 83 E8 49 00 00 1A 83 FA 23 30 4D 34 C4 CA 21
-FC C4 2A C4 84 12 9C D1 9A D4 70 D4 CA D0 F8 CD
-58 D4 2A D1 66 D1 D6 C9 0A D2 3E D2 7A D0 04 D3
-48 C5 A4 CF 0C CF AE CA 00 00 3A 40 0C 00 39 40
-CA 21 38 40 CC 21 D9 3F 3A 40 0E 00 39 40 CC 21
-38 40 CA 21 CC 3F 82 43 CC 21 30 4D 92 42 CA 21
-C8 21 30 4D B8 CF 09 50 57 52 5F 53 54 41 54 45
-84 12 E6 CF 54 D4 9E DB F6 D1 08 50 57 52 5F 48
-45 52 45 00 92 42 C4 21 06 D2 92 42 C6 21 04 D2
-EF 3F B8 D0 09 52 53 54 5F 53 54 41 54 45 92 42
-0C 18 06 D2 92 42 0E 18 04 D2 E2 3F 24 D2 08 52
-53 54 5F 48 45 52 45 00 92 42 C4 21 0C 18 92 42
-C6 21 0E 18 DF 3F B2 40 AA D2 0C D3 B2 40 8C C8
-80 C8 B2 40 E6 C8 F6 C8 B2 40 22 C9 36 C9 B2 40
-04 C8 12 C8 30 41 A8 D0 04 57 49 50 45 00 39 40
-80 FF B9 43 00 00 29 53 39 90 E2 FF FA 23 B0 12
-56 D2 B2 40 9E DB C4 21 B2 40 54 D4 C6 21 D4 3F
-1C D0 06 28 57 41 52 4D 29 00 1E 42 08 18 87 12
-94 C9 05 0D 1B 5B 37 6D 78 C9 98 C7 94 C9 27 20
-46 61 73 74 46 6F 72 74 68 20 56 31 36 30 20 31
+02 00 3E 4F 32 B0 00 02 32 C0 00 02 F1 23 30 4D
+58 C9 05 43 4F 55 4E 54 2F 83 1E 53 8F 4E 00 00
+5E 4E FF FF 30 4D 82 4E BE 21 B2 4F C0 21 3E 4F
+82 43 C2 21 87 12 90 C6 16 CA 8C CC 3D 40 98 CC
+EE 22 3D 41 3E 4F 30 4D 9A CC 0A 4E 3E 4F 3D 40
+B0 CC 4F 27 3D 40 86 CC 1A E2 B6 21 B9 27 B3 23
+B2 CC 3E 4F 3D 40 86 CC C0 23 DE 53 00 00 68 4E
+08 5E F8 40 3F 00 00 00 3D 40 DE CE CD 3F 0E CC
+08 45 56 41 4C 55 41 54 45 00 39 40 BE 21 3C 49
+3B 49 3A 49 3D 15 B0 12 2A C4 76 CC EE CC B2 41
+C2 21 B2 41 C0 21 B2 41 BE 21 3D 41 30 4D 4C C6
+04 51 55 49 54 00 31 40 E0 20 B2 40 00 20 00 20
+82 43 B6 21 82 43 08 18 B0 12 2A C4 BC C9 03 0D
+6F 6B A0 C9 68 C9 5A C6 44 C4 64 C6 36 C8 68 C9
+76 CC DE C4 92 C5 BC C9 0D 73 74 61 63 6B 20 65
+6D 70 74 79 21 20 80 CD 34 C4 30 FF C8 C7 D2 C5
+BC C9 0B 46 52 41 4D 20 66 75 6C 6C 21 20 80 CD
+86 C6 F2 C4 E0 C5 1C CD BC C9 03 0D 20 20 DC C5
+22 CD 2E C8 05 41 42 4F 52 54 3F 40 80 20 C3 3F
+8F 93 02 00 A3 26 B2 40 82 48 E0 C8 B0 12 92 D2
+A2 B3 1C 05 FD 27 B2 40 11 00 0E 05 F2 C2 03 02
+92 C3 1C 05 38 40 A0 AA 39 42 03 43 19 83 FD 23
+18 83 FA 23 92 B3 1C 05 F3 23 87 12 BC C9 04 1B
+5B 37 6D 00 A0 C9 A0 C9 BC C9 04 1B 5B 30 6D 00
+A0 C9 A0 D1 E2 D1 E8 D1 30 D2 7A CD 74 CD 86 41
+42 4F 52 54 22 00 87 12 D6 C9 34 C4 80 CD 20 CC
+2A C4 68 CA 01 27 87 12 90 C6 16 CA 6E CA E0 C5
+04 CE 2A C4 BA CC BE C6 81 5C 92 42 BE 21 C2 21
+30 4D 00 00 81 5B 82 43 B6 21 30 4D 08 CE 01 5D
+B2 43 B6 21 30 4D 14 CE 83 5B 27 5D 87 12 F6 CD
+34 C4 34 C4 20 CC 20 CC 2A C4 BE 4F 02 00 3E 4F
+30 4D 44 C9 82 49 53 00 87 12 86 C6 F2 C4 E0 C5
+5C CE 2C CE 34 C4 3A CE 20 CC 2A C4 F6 CD 3A CE
+2A C4 44 CE 09 49 4D 4D 45 44 49 41 54 45 1A 42
+AE 21 FA D0 80 00 00 00 30 4D D2 C9 87 52 45 43
+55 52 53 45 19 42 C4 21 99 42 B2 21 00 00 A2 53
+C4 21 30 4D 00 CD 88 50 4F 53 54 50 4F 4E 45 00
+87 12 90 C6 16 CA 6E CA 54 C4 E0 C5 04 CE 92 C5
+E0 C5 C0 CE 34 C4 34 C4 20 CC 20 CC 34 C4 20 CC
+20 CC 2A C4 82 9F B4 21 A0 24 87 12 BC C9 0F 73
+74 61 63 6B 20 6D 69 73 6D 61 74 63 68 21 86 CD
+87 12 F2 C9 90 C6 16 CA EA CE 08 4E 7A 4E 5A D3
+5A 53 0A 58 19 42 C8 21 6E 4E 3E F0 1E 00 09 5E
+82 48 AE 21 82 49 B0 21 82 4A B2 21 2A 52 82 4A
+C4 21 3E 4F 3D 41 30 41 10 CA 08 56 41 52 49 41
+42 4C 45 00 B0 12 E0 CE BA 40 86 12 FC FF 71 3C
+62 CC 08 43 4F 4E 53 54 41 4E 54 00 B0 12 E0 CE
+BA 40 85 12 FC FF 8A 4E FE FF 3E 4F 62 3C 32 CF
+06 43 52 45 41 54 45 00 B0 12 E0 CE BA 40 85 12
+FC FF 8A 4A FE FF 55 3C D0 CC 05 44 4F 45 53 3E
+1A 42 B2 21 BA 40 84 12 00 00 8A 4D 02 00 3D 41
+30 4D 6A CF 05 44 45 46 45 52 B0 12 E0 CE BA 40
+30 40 FC FF BA 40 80 CF FE FF 3B 3C 28 CE 01 3A
+B0 12 E0 CE BA 40 87 12 FC FF A2 83 C4 21 B2 43
+B6 21 82 4F B4 21 30 4D 9E CF 81 3B 82 93 B6 21
+24 27 87 12 34 C4 2A C4 20 CC C4 CE 16 CE 2A C4
+D2 CF 3D 41 B2 4E 0E 18 A2 4E 0C 18 3E 4F 32 3D
+32 CC 06 4D 41 52 4B 45 52 00 B0 12 E0 CE BA 40
+84 12 FC FF BA 40 D0 CF FE FF 9A 42 C6 21 00 00
+28 83 8A 48 02 00 A2 52 C4 21 18 42 AE 21 19 42
+B0 21 A8 49 FE FF 89 48 00 00 30 4D 64 CE 82 49
+46 00 2F 83 8F 4E 00 00 1E 42 C4 21 A2 52 C4 21
+BE 40 E0 C5 00 00 2E 53 30 4D 84 CF 84 45 4C 53
+45 00 A2 52 C4 21 1A 42 C4 21 BA 40 DC C5 FC FF
+8E 4A 00 00 2A 83 0E 4A 30 4D 9A C9 84 54 48 45
+4E 00 9E 42 C4 21 00 00 3E 4F 30 4D 50 CF 85 42
+45 47 49 4E 30 40 C8 C7 5C D0 85 55 4E 54 49 4C
+39 40 E0 C5 A2 52 C4 21 1A 42 C4 21 8A 49 FC FF
+8A 4E FE FF 3E 4F 30 4D DE CD 85 41 47 41 49 4E
+39 40 DC C5 EF 3F 1A CF 85 57 48 49 4C 45 87 12
+22 D0 78 C4 2A C4 7C CE 86 52 45 50 45 41 54 00
+87 12 A0 D0 62 D0 2A C4 3C D0 82 44 4F 00 2F 83
+8F 4E 00 00 A2 53 C4 21 1E 42 C4 21 BE 40 F0 C5
+FE FF A2 53 00 20 1A 42 00 20 8A 43 00 00 30 4D
+E2 CF 84 4C 4F 4F 50 00 39 40 12 C6 A2 52 C4 21
+1A 42 C4 21 8A 49 FC FF 8A 4E FE FF 1E 42 00 20
+A2 83 00 20 2E 4E 0E 93 03 24 8E 4A 00 00 F6 3F
+3E 4F 30 4D 24 C8 85 2B 4C 4F 4F 50 39 40 00 C6
+E5 3F F2 D0 85 4C 45 41 56 45 1A 42 C4 21 BA 40
+22 C6 00 00 BA 40 DC C5 02 00 B2 50 06 00 C4 21
+A2 53 00 20 2A 52 19 42 00 20 89 4A 00 00 30 4D
+34 D1 04 4D 4F 56 45 00 0A 4E 38 4F 39 4F 3E 4F
+0A 93 11 24 08 99 0F 24 06 2C F8 49 00 00 18 53
+1A 83 FB 23 30 4D 08 5A 09 5A 19 83 18 83 E8 49
+00 00 1A 83 FA 23 30 4D 34 C4 CA 21 FA C4 2A C4
+84 12 98 D1 FA D5 D0 D5 CA D0 F4 CD B8 D5 26 D1
+62 D1 FE C9 54 D2 6E D2 7A D0 74 D4 46 C5 FA D3
+1E CE D6 CA 00 00 3A 40 0E 00 39 40 CA 21 38 40
+CC 21 D9 3F 3A 40 0E 00 39 40 CC 21 38 40 CA 21
+CC 3F 82 43 CC 21 30 4D 92 42 CA 21 C8 21 30 4D
+F2 D1 3A 4E 82 4A C6 21 2E 4E 82 4E C4 21 3D 40
+10 00 09 4A 08 49 29 83 18 48 FE FF 0E 98 FC 2B
+89 48 00 00 1D 83 F6 23 2A 4A 0A 93 F0 23 3E 4F
+3D 41 30 4D 96 CE 09 50 57 52 5F 53 54 41 54 45
+84 12 F0 D1 B4 D5 FC DC B8 D0 09 52 53 54 5F 53
+54 41 54 45 92 42 0E 18 34 D2 92 42 0C 18 36 D2
+EF 3F 26 D2 08 50 57 52 5F 48 45 52 45 00 92 42
+C6 21 34 D2 92 42 C4 21 36 D2 30 4D 3A D2 08 52
+53 54 5F 48 45 52 45 00 92 42 C6 21 0E 18 92 42
+C4 21 0C 18 EC 3F B2 40 1A D4 7C D4 B2 40 B4 C8
+A8 C8 B2 40 0E C9 1E C9 B2 40 4A C9 5E C9 B2 40
+1C C8 2A C8 82 43 76 DC 82 43 82 DC 82 43 8E DC
+82 43 BE DC 82 43 CA DC 82 43 D6 DC 30 41 A8 D0
+04 57 49 50 45 00 39 40 80 FF B9 43 00 00 29 53
+39 90 E2 FF FA 23 B0 12 86 D2 B2 40 FC DC 0C 18
+B2 40 B4 D5 0E 18 AE 3F 6E D0 07 43 4F 4D 50 41
+52 45 0C 4E 38 4F 3B 4F 39 4F 0E 4B 0E 5C 0C 24
+1B 83 07 30 1C 83 07 30 19 53 F9 98 FF FF F5 27
+02 2C 3E 43 30 4D 1E 43 30 4D BA CF 86 5B 54 48
+45 4E 5D 00 30 4D 1E 83 30 4D 1C D3 86 5B 45 4C
+53 45 5D 00 87 12 34 C4 01 00 90 C6 16 CA 68 CC
+44 C4 E0 C5 A2 D3 8A C4 8A C4 BC C9 04 5B 49 46
+5D 00 F2 D2 EA C5 60 D3 CE CA 2C C5 DC C5 96 D3
+8A C4 8A C4 BC C9 06 5B 45 4C 53 45 5D 00 F2 D2
+EA C5 84 D3 CE CA 26 D3 44 C4 E0 C5 80 D3 2C C5
+DC C5 96 D3 BC C9 06 5B 54 48 45 4E 5D 00 F2 D2
+EA C5 96 D3 26 D3 54 C4 EA C5 9E D3 2A C4 DC C5
+3A D3 CE CA BC C9 03 0D 6B 6F A0 C9 68 C9 5A C6
+44 C4 64 C6 36 C8 B8 D3 82 43 C2 21 82 4E BE 21
+B2 4F C0 21 3E 4F 3D 40 3A D3 30 4D 2C D3 84 5B
+49 46 5D 00 0E 93 3E 4F AD 27 30 4D CE D3 8B 5B
+55 4E 44 45 46 49 4E 45 44 5D 87 12 90 C6 16 CA
+6E CA 6C C4 86 C5 2A C4 DE D3 89 5B 44 45 46 49
+4E 45 44 5D 87 12 90 C6 16 CA 6E CA 6C C4 2A C4
+1E D0 06 28 57 41 52 4D 29 00 1E 42 08 18 87 12
+BC C9 05 0D 1B 5B 37 6D A0 C9 B2 C7 BC C9 27 20
+46 61 73 74 46 6F 72 74 68 20 56 31 36 32 20 31
36 4D 48 7A 20 28 43 29 20 4A 2E 4D 2E 54 68 6F
-6F 72 65 6E 73 20 78 C9 34 C4 30 FF AC C7 2A C5
-58 C7 94 C9 0B 62 79 74 65 73 20 66 72 65 65 20
-7C CD 78 D2 04 57 41 52 4D 00 30 40 AA D2 6E D0
+6F 72 65 6E 73 20 A0 C9 34 C4 30 FF C8 C7 28 C5
+7E C7 BC C9 0B 62 79 74 65 73 20 66 72 65 65 20
+8C CD C0 D2 04 57 41 52 4D 00 30 40 1A D4 EA D2
04 43 4F 4C 44 00 B2 40 04 A5 20 01 B2 40 88 5A
CC 01 B2 D0 00 08 04 02 B2 D3 06 02 B2 43 02 02
B2 40 00 01 24 02 B2 40 FF FE 22 02 B2 D0 FF FE
26 02 B2 43 42 02 B2 D3 46 02 B2 43 62 02 B2 D3
66 02 F2 40 A5 00 A1 01 F2 40 10 00 A0 01 D2 43
A1 01 B2 40 00 A5 60 01 B2 40 29 01 80 01 B2 40
-0B 00 82 01 B2 40 E9 01 84 01 39 40 40 00 82 43
-88 01 92 D2 5E 01 08 18 A2 93 08 18 01 24 59 03
-38 40 50 C3 18 83 FE 23 19 83 FA 23 B2 40 00 06
-2A 02 3A 40 1C D3 39 40 E2 FF 89 4A 00 00 29 53
+0B 00 82 01 B2 40 E9 01 84 01 B2 40 00 06 2A 02
+82 43 88 01 92 D2 5E 01 08 18 B2 B0 2C 01 8E 01
+FC 23 3A 40 8C D4 39 40 E2 FF 89 4A 00 00 29 53
FC 23 92 42 02 18 EC FF B2 40 18 00 0A 18 31 40
-E0 20 3F 40 80 20 37 40 00 C4 36 40 B4 C4 35 40
+E0 20 3F 40 80 20 37 40 00 C4 36 40 BC C4 35 40
08 C4 34 40 14 C4 B2 40 0A 00 DA 21 B2 43 AC 21
92 C3 30 01 18 42 08 18 D2 B3 00 02 04 20 38 E3
18 53 82 48 08 18 B2 40 81 00 00 05 B2 42 06 05
B2 40 A1 F7 08 05 F2 D0 03 00 0A 02 92 C3 00 05
-92 D3 1A 05 3D 40 2E D4 18 42 08 18 38 90 0A 00
-2E 27 38 90 16 00 2B 2F 28 93 01 23 E9 26 0A D3
-84 12 9C D1 7C DA 28 DB 30 DA 7C DB F6 D9 B0 DA
-FA D6 00 00 EC D9 9C DA 4E DA 8C DA 0A D8 00 00
-00 00 8E DB C8 D1 A2 D2 85 48 49 32 4C 4F 87 12
-AC C7 34 D0 F8 CB 04 CF CA D1 30 D4 2A C4 10 D3
-04 43 4F 44 45 00 B0 12 16 CE A2 82 C4 21 87 12
-44 CF BC C5 68 D4 00 00 07 45 4E 44 43 4F 44 45
-87 12 D8 D1 64 CE 2A C4 9A D0 03 41 53 4D 92 42
-C8 21 B8 21 B2 40 34 D4 C8 21 E5 3F 88 D4 06 45
+92 D3 1A 05 3D 40 8E D5 18 42 08 18 38 90 0A 00
+A2 26 38 90 16 00 9F 2E 28 93 5C 22 51 26 7A D4
+84 12 98 D1 DA DB 86 DC 8E DB DA DC 54 DB 0E DC
+58 D8 00 00 4A DB FA DB AC DB EA DB 68 D9 00 00
+00 00 EC DC C4 D1 12 D4 85 48 49 32 4C 4F 87 12
+C8 C7 36 D0 20 CC 16 CE C6 D1 90 D5 2A C4 80 D4
+04 43 4F 44 45 00 B0 12 E0 CE A2 82 C4 21 87 12
+B2 CF DC C5 C8 D5 00 00 07 45 4E 44 43 4F 44 45
+87 12 D4 D1 C4 CE 2A C4 9A D0 03 41 53 4D 92 42
+C8 21 B8 21 B2 40 94 D5 C8 21 E5 3F E8 D5 06 45
4E 44 41 53 4D 00 92 42 B8 21 C8 21 E9 3F 00 00
05 43 4F 4C 4F 4E 1A 42 C4 21 BA 40 87 12 00 00
-A2 53 C4 21 B2 43 B6 21 30 40 D8 D1 00 00 05 4C
+A2 53 C4 21 B2 43 B6 21 30 40 D4 D1 00 00 05 4C
4F 32 48 49 1A 42 C4 21 BA 40 B0 12 00 00 BA 40
2A C4 02 00 A2 52 C4 21 ED 3F 38 40 BE 21 39 48
2A 48 09 5A 1A 52 C2 21 09 9A 03 24 7E 9A FC 27
1A 83 0E 4A 2A 88 82 4A C2 21 30 4D B0 12 2A C4
-EE C9 46 CA 72 C5 C0 C5 32 D5 1A CB C0 C5 08 CE
-54 D5 34 D5 29 4E 39 90 86 12 02 20 2E 53 30 41
-39 90 85 12 03 20 1E 4E 02 00 30 41 39 90 84 12
-01 20 2E 52 30 41 19 42 C4 21 A2 53 C4 21 89 4E
-00 00 3E 40 29 00 12 12 C2 21 92 53 C2 21 B0 12
-2A C4 EE C9 1A CB C0 C5 86 D5 7C D5 21 53 3E 90
-10 00 BB 2D 30 41 88 D5 B2 41 C2 21 22 D3 30 41
-87 12 4C C6 FA D4 98 D5 82 43 BC 21 92 42 C4 21
-BA 21 A2 53 C4 21 0A 4E 3E 4F FA 90 23 00 00 00
-34 20 92 53 C2 21 B0 12 1C D5 0E 93 04 20 B2 40
-00 03 BC 21 27 3C 1E 93 04 20 B2 40 10 03 BC 21
-21 3C 2E 93 04 20 B2 40 20 03 BC 21 1B 3C 2E 92
-04 20 B2 40 20 02 BC 21 15 3C 3E 92 04 20 B2 40
-30 02 BC 21 0F 3C 3E 93 04 20 B2 40 30 03 BC 21
-09 3C B2 40 30 00 BC 21 19 42 C4 21 A2 53 C4 21
-89 4E 00 00 3E 4F 3D 41 30 4D FA 90 26 00 00 00
-08 20 B2 40 10 02 BC 21 92 53 C2 21 30 12 08 D6
-75 3F FA 90 40 00 00 00 1A 20 B2 40 20 00 BC 21
-92 53 C2 21 B0 12 66 D5 0E 20 B2 50 10 00 BC 21
-3E 40 2B 00 B0 12 66 D5 32 24 92 92 BE 21 C2 21
-02 24 92 53 C2 21 8E 10 82 5E BC 21 D3 3F B0 12
-66 D5 F9 23 B2 50 10 00 BC 21 3E 40 28 00 B0 12
-1C D5 30 12 58 D6 67 3F 87 12 4C C6 FA D4 90 D6
-FE 90 26 00 00 00 3E 40 20 00 04 20 B2 50 82 00
-BC 21 C2 3F B0 12 66 D5 DF 23 B2 50 80 00 BC 21
-3E 40 28 00 B0 12 1C D5 B0 12 56 D5 D5 23 3D 40
-08 CE 30 4D 78 C8 04 52 45 54 49 00 87 12 34 C4
-00 13 F8 CB 2A C4 34 C4 2C 00 90 D5 88 D6 E0 D6
-2E 4E 1E D2 BC 21 19 42 BA 21 92 3F DE D4 03 4D
-4F 56 84 12 D6 D6 00 40 EE D6 05 4D 4F 56 2E 42
-84 12 D6 D6 40 40 00 00 03 41 44 44 84 12 D6 D6
-00 50 08 D7 05 41 44 44 2E 42 84 12 D6 D6 40 50
-14 D7 04 41 44 44 43 00 84 12 D6 D6 00 60 22 D7
-06 41 44 44 43 2E 42 00 84 12 D6 D6 40 60 C6 D6
-04 53 55 42 43 00 84 12 D6 D6 00 70 40 D7 06 53
-55 42 43 2E 42 00 84 12 D6 D6 40 70 4E D7 03 53
-55 42 84 12 D6 D6 00 80 5E D7 05 53 55 42 2E 42
-84 12 D6 D6 40 80 C0 D4 03 43 4D 50 84 12 D6 D6
-00 90 78 D7 05 43 4D 50 2E 42 84 12 D6 D6 40 90
-AE D4 04 44 41 44 44 00 84 12 D6 D6 00 A0 92 D7
-06 44 41 44 44 2E 42 00 84 12 D6 D6 40 A0 84 D7
-03 42 49 54 84 12 D6 D6 00 B0 B0 D7 05 42 49 54
-2E 42 84 12 D6 D6 40 B0 BC D7 03 42 49 43 84 12
-D6 D6 00 C0 CA D7 05 42 49 43 2E 42 84 12 D6 D6
-40 C0 D6 D7 03 42 49 53 84 12 D6 D6 00 D0 E4 D7
-05 42 49 53 2E 42 84 12 D6 D6 40 D0 00 00 03 58
-4F 52 84 12 D6 D6 00 E0 FE D7 05 58 4F 52 2E 42
-84 12 D6 D6 40 E0 30 D7 03 41 4E 44 84 12 D6 D6
-00 F0 18 D8 05 41 4E 44 2E 42 84 12 D6 D6 40 F0
-4C C6 90 D5 36 D8 1A 42 BC 21 B2 F0 70 00 BC 21
-8A 10 3A F0 0F 00 82 DA BC 21 4A 3F 6A D7 03 52
-52 43 84 12 30 D8 00 10 4E D8 05 52 52 43 2E 42
-84 12 30 D8 40 10 5A D8 04 53 57 50 42 00 84 12
-30 D8 80 10 68 D8 03 52 52 41 84 12 30 D8 00 11
-76 D8 05 52 52 41 2E 42 84 12 30 D8 40 11 82 D8
-03 53 58 54 84 12 30 D8 80 11 00 00 04 50 55 53
-48 00 84 12 30 D8 00 12 9C D8 06 50 55 53 48 2E
-42 00 84 12 30 D8 40 12 F0 D7 04 43 41 4C 4C 00
-84 12 30 D8 80 12 34 C4 2C 00 90 D5 88 D6 D0 D8
-59 42 BC 21 5A 42 BD 21 82 4A BC 21 BE 90 00 15
-00 00 02 20 0A 89 02 3C 09 8A 0A 49 3A 90 10 00
-03 2C 5A 0E A8 3F 1A 53 0E 4A 87 12 98 C7 94 C9
-0D 6F 75 74 20 6F 66 20 62 6F 75 6E 64 73 76 CD
-AA D8 05 50 55 53 48 4D 84 12 C6 D8 00 15 12 D9
-04 50 4F 50 4D 00 84 12 C6 D8 00 17 4C C6 FA D4
-32 D9 82 43 BC 21 92 42 C4 21 BA 21 A2 53 C4 21
-92 53 C2 21 3E 40 2C 00 B0 12 2A C4 EE C9 1A CB
-C0 C5 08 CE 88 D6 58 D9 0A 4E 3E 4F 1A 83 2A 92
-CA 2F 8A 10 5A 06 6F 3F 90 D8 04 52 52 43 4D 00
-84 12 2C D9 50 00 6A D9 04 52 52 41 4D 00 84 12
-2C D9 50 01 78 D9 04 52 4C 41 4D 00 84 12 2C D9
-50 02 86 D9 04 52 52 55 4D 00 84 12 2C D9 50 03
-85 12 00 3C 94 D9 03 53 3E 3D 85 12 00 38 A6 D9
-02 53 3C 00 85 12 00 34 20 D9 03 30 3E 3D 85 12
-00 30 BA D9 02 30 3C 00 85 12 00 30 00 00 02 55
-3C 00 85 12 00 2C CE D9 03 55 3E 3D 85 12 00 28
-C4 D9 03 30 3C 3E 85 12 00 24 E2 D9 02 30 3D 00
-85 12 00 20 84 C8 02 49 46 00 1A 42 C4 21 8A 4E
-00 00 A2 53 C4 21 0E 4A 30 4D D8 D9 04 54 48 45
-4E 00 1A 42 C4 21 08 4E 3E 4F 09 48 29 53 0A 89
-0A 11 3A 90 00 02 68 2F 88 DA 00 00 30 4D A0 D7
-04 45 4C 53 45 00 1A 42 C4 21 BA 40 00 3C 00 00
-A2 53 C4 21 2F 83 8F 4A 00 00 E3 3F 0C DA 05 55
-4E 54 49 4C 3A 4F 08 4E 3E 4F 19 42 C4 21 2A 83
-0A 89 0A 11 3A 90 00 FE 47 3B 3A F0 FF 03 08 DA
-89 48 00 00 A2 53 C4 21 30 4D 24 D8 05 41 47 41
-49 4E 87 12 A0 D9 54 DA 2A C4 00 00 05 57 48 49
-4C 45 87 12 FA D9 6E C4 2A C4 B0 D9 06 52 45 50
-45 41 54 00 87 12 A0 D9 54 DA 12 DA 2A C4 00 00
-03 4A 4D 50 87 12 FA CD A0 D9 54 DA 2A C4 3E B0
-00 10 03 20 3E E0 00 04 30 4D 3E 90 00 34 06 28
-03 24 3E 40 00 34 30 4D 3E 40 00 38 30 4D 00 00
-04 3F 4A 4D 50 00 87 12 BE DA FA CD 6E C4 54 DA
-2A C4 F4 DA 3D 41 08 4E 3E 4F 2A 48 0A 93 04 20
-98 42 C4 21 00 00 30 4D 88 43 00 00 A4 3F BA D8
-03 42 57 31 84 12 F2 DA 00 00 10 DB 03 42 57 32
-84 12 F2 DA 00 00 1C DB 03 42 57 33 84 12 F2 DA
-00 00 34 DB 3D 41 1A 42 C4 21 28 4E 08 93 08 20
-BA 4F 00 00 A2 53 C4 21 8E 4A 00 00 3E 4F 30 4D
-8E 43 00 00 61 3F 00 00 03 46 57 31 84 12 32 DB
-00 00 58 DB 03 46 57 32 84 12 32 DB 00 00 64 DB
-03 46 57 33 84 12 32 DB 00 00 70 DB 04 47 4F 54
-4F 00 87 12 A0 D9 FA CD EE CB 2A C4 E0 DA 05 3F
-47 4F 54 4F 87 12 BE DA FA CD EE CB 2A C4
+16 CA 6E CA EA C5 90 D6 42 CB E0 C5 04 CE B2 D6
+92 D6 29 4E 39 90 86 12 02 20 2E 53 30 41 39 90
+85 12 03 20 1E 4E 02 00 30 41 39 90 84 12 01 20
+2E 52 30 41 19 42 C4 21 A2 53 C4 21 89 4E 00 00
+3E 40 29 00 12 12 C2 21 92 53 C2 21 B0 12 2A C4
+16 CA 42 CB E0 C5 E4 D6 DA D6 21 53 3E 90 10 00
+BB 2D 30 41 E6 D6 B2 41 C2 21 22 D3 30 41 87 12
+90 C6 5A D6 F6 D6 82 43 BC 21 92 42 C4 21 BA 21
+A2 53 C4 21 0A 4E 3E 4F FA 90 23 00 00 00 34 20
+92 53 C2 21 B0 12 7C D6 0E 93 04 20 B2 40 00 03
+BC 21 27 3C 1E 93 04 20 B2 40 10 03 BC 21 21 3C
+2E 93 04 20 B2 40 20 03 BC 21 1B 3C 2E 92 04 20
+B2 40 20 02 BC 21 15 3C 3E 92 04 20 B2 40 30 02
+BC 21 0F 3C 3E 93 04 20 B2 40 30 03 BC 21 09 3C
+B2 40 30 00 BC 21 19 42 C4 21 A2 53 C4 21 89 4E
+00 00 3E 4F 3D 41 30 4D FA 90 26 00 00 00 08 20
+B2 40 10 02 BC 21 92 53 C2 21 30 12 66 D7 76 3F
+FA 90 40 00 00 00 1A 20 B2 40 20 00 BC 21 92 53
+C2 21 B0 12 C4 D6 0E 20 B2 50 10 00 BC 21 3E 40
+2B 00 B0 12 C4 D6 32 24 92 92 BE 21 C2 21 02 24
+92 53 C2 21 8E 10 82 5E BC 21 D3 3F B0 12 C4 D6
+F9 23 B2 50 10 00 BC 21 3E 40 28 00 B0 12 7C D6
+30 12 B6 D7 67 3F 87 12 90 C6 5A D6 EE D7 FE 90
+26 00 00 00 3E 40 20 00 04 20 B2 50 82 00 BC 21
+C2 3F B0 12 C4 D6 DF 23 B2 50 80 00 BC 21 3E 40
+28 00 B0 12 7C D6 B0 12 B4 D6 D5 23 3D 40 04 CE
+30 4D A0 C8 04 52 45 54 49 00 87 12 34 C4 00 13
+20 CC 2A C4 34 C4 2C 00 EE D6 E6 D7 3E D8 2E 4E
+1E D2 BC 21 19 42 BA 21 92 3F 3E D6 03 4D 4F 56
+84 12 34 D8 00 40 4C D8 05 4D 4F 56 2E 42 84 12
+34 D8 40 40 00 00 03 41 44 44 84 12 34 D8 00 50
+66 D8 05 41 44 44 2E 42 84 12 34 D8 40 50 72 D8
+04 41 44 44 43 00 84 12 34 D8 00 60 80 D8 06 41
+44 44 43 2E 42 00 84 12 34 D8 40 60 24 D8 04 53
+55 42 43 00 84 12 34 D8 00 70 9E D8 06 53 55 42
+43 2E 42 00 84 12 34 D8 40 70 AC D8 03 53 55 42
+84 12 34 D8 00 80 BC D8 05 53 55 42 2E 42 84 12
+34 D8 40 80 20 D6 03 43 4D 50 84 12 34 D8 00 90
+D6 D8 05 43 4D 50 2E 42 84 12 34 D8 40 90 0E D6
+04 44 41 44 44 00 84 12 34 D8 00 A0 F0 D8 06 44
+41 44 44 2E 42 00 84 12 34 D8 40 A0 E2 D8 03 42
+49 54 84 12 34 D8 00 B0 0E D9 05 42 49 54 2E 42
+84 12 34 D8 40 B0 1A D9 03 42 49 43 84 12 34 D8
+00 C0 28 D9 05 42 49 43 2E 42 84 12 34 D8 40 C0
+34 D9 03 42 49 53 84 12 34 D8 00 D0 42 D9 05 42
+49 53 2E 42 84 12 34 D8 40 D0 00 00 03 58 4F 52
+84 12 34 D8 00 E0 5C D9 05 58 4F 52 2E 42 84 12
+34 D8 40 E0 8E D8 03 41 4E 44 84 12 34 D8 00 F0
+76 D9 05 41 4E 44 2E 42 84 12 34 D8 40 F0 90 C6
+EE D6 94 D9 1A 42 BC 21 B2 F0 70 00 BC 21 8A 10
+3A F0 0F 00 82 DA BC 21 4A 3F C8 D8 03 52 52 43
+84 12 8E D9 00 10 AC D9 05 52 52 43 2E 42 84 12
+8E D9 40 10 B8 D9 04 53 57 50 42 00 84 12 8E D9
+80 10 C6 D9 03 52 52 41 84 12 8E D9 00 11 D4 D9
+05 52 52 41 2E 42 84 12 8E D9 40 11 E0 D9 03 53
+58 54 84 12 8E D9 80 11 00 00 04 50 55 53 48 00
+84 12 8E D9 00 12 FA D9 06 50 55 53 48 2E 42 00
+84 12 8E D9 40 12 4E D9 04 43 41 4C 4C 00 84 12
+8E D9 80 12 34 C4 2C 00 EE D6 E6 D7 2E DA 59 42
+BC 21 5A 42 BD 21 82 4A BC 21 BE 90 00 15 00 00
+02 20 0A 89 02 3C 09 8A 0A 49 3A 90 10 00 03 2C
+5A 0E A8 3F 1A 53 0E 4A 87 12 B2 C7 BC C9 0D 6F
+75 74 20 6F 66 20 62 6F 75 6E 64 73 86 CD 08 DA
+05 50 55 53 48 4D 84 12 24 DA 00 15 70 DA 04 50
+4F 50 4D 00 84 12 24 DA 00 17 90 C6 5A D6 90 DA
+82 43 BC 21 92 42 C4 21 BA 21 A2 53 C4 21 92 53
+C2 21 3E 40 2C 00 B0 12 2A C4 16 CA 42 CB E0 C5
+04 CE E6 D7 B6 DA 0A 4E 3E 4F 1A 83 2A 92 CA 2F
+8A 10 5A 06 6F 3F EE D9 04 52 52 43 4D 00 84 12
+8A DA 50 00 C8 DA 04 52 52 41 4D 00 84 12 8A DA
+50 01 D6 DA 04 52 4C 41 4D 00 84 12 8A DA 50 02
+E4 DA 04 52 52 55 4D 00 84 12 8A DA 50 03 85 12
+00 3C F2 DA 03 53 3E 3D 85 12 00 38 04 DB 02 53
+3C 00 85 12 00 34 7E DA 03 30 3E 3D 85 12 00 30
+18 DB 02 30 3C 00 85 12 00 30 00 00 02 55 3C 00
+85 12 00 2C 2C DB 03 55 3E 3D 85 12 00 28 22 DB
+03 30 3C 3E 85 12 00 24 40 DB 02 30 3D 00 85 12
+00 20 AC C8 02 49 46 00 1A 42 C4 21 8A 4E 00 00
+A2 53 C4 21 0E 4A 30 4D 36 DB 04 54 48 45 4E 00
+1A 42 C4 21 08 4E 3E 4F 09 48 29 53 0A 89 0A 11
+3A 90 00 02 68 2F 88 DA 00 00 30 4D FE D8 04 45
+4C 53 45 00 1A 42 C4 21 BA 40 00 3C 00 00 A2 53
+C4 21 2F 83 8F 4A 00 00 E3 3F 6A DB 05 55 4E 54
+49 4C 3A 4F 08 4E 3E 4F 19 42 C4 21 2A 83 0A 89
+0A 11 3A 90 00 FE 47 3B 3A F0 FF 03 08 DA 89 48
+00 00 A2 53 C4 21 30 4D 82 D9 05 41 47 41 49 4E
+87 12 FE DA B2 DB 2A C4 00 00 05 57 48 49 4C 45
+87 12 58 DB 78 C4 2A C4 0E DB 06 52 45 50 45 41
+54 00 87 12 FE DA B2 DB 70 DB 2A C4 00 00 03 4A
+4D 50 87 12 F6 CD FE DA B2 DB 2A C4 3E B0 00 10
+03 20 3E E0 00 04 30 4D 3E 90 00 34 06 28 03 24
+3E 40 00 34 30 4D 3E 40 00 38 30 4D 00 00 04 3F
+4A 4D 50 00 87 12 1C DC F6 CD 78 C4 B2 DB 2A C4
+52 DC 3D 41 08 4E 3E 4F 2A 48 0A 93 04 20 98 42
+C4 21 00 00 30 4D 88 43 00 00 A4 3F 18 DA 03 42
+57 31 84 12 50 DC 00 00 6E DC 03 42 57 32 84 12
+50 DC 00 00 7A DC 03 42 57 33 84 12 50 DC 00 00
+92 DC 3D 41 1A 42 C4 21 28 4E 08 93 08 20 BA 4F
+00 00 A2 53 C4 21 8E 4A 00 00 3E 4F 30 4D 8E 43
+00 00 61 3F 00 00 03 46 57 31 84 12 90 DC 00 00
+B6 DC 03 46 57 32 84 12 90 DC 00 00 C2 DC 03 46
+57 33 84 12 90 DC 00 00 CE DC 04 47 4F 54 4F 00
+87 12 FE DA F6 CD 16 CC 2A C4 3E DC 05 3F 47 4F
+54 4F 87 12 1C DC F6 CD 16 CC 2A C4
@FFE2
-1C D3 1C D3 1C D3 1C D3 1C D3 92 C8 1C D3 1C D3
-1C D3 1C D3 1C D3 1C D3 1C D3 1C D3 1C D3
+8C D4 8C D4 8C D4 8C D4 8C D4 BA C8 8C D4 8C D4
+8C D4 8C D4 8C D4 8C D4 8C D4 8C D4 8C D4
q
+++ /dev/null
-@1800
-10 00 92 C8 80 3E 30 75 FD FF 18 00 A0 DB 56 D4
-52 C8 64 C8 00 00 00 00
-@21AA
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00
-@C400
-3A 41 0D 12 0D 4A 30 4D 2F 83 8F 4E 00 00 3E 41
-2E 4E 30 4D 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E
-30 4D 00 00 04 45 58 49 54 00 3D 41 30 4D 00 00
-03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 C4
-03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
-44 55 50 00 0E 93 F6 23 30 4D 40 C4 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 C4 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E C4 02 3E 52 00 0E 12 3E 4F 30 4D 8E C4
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 C4
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C C4 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 20 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 C4 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 C5
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 C4 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA C4 03 41 4E 44 3E FF 30 4D 7A C4 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E C5 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 C5 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E C5 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 C5 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 C4 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
-3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE C5 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 C5 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 C5 03 3E 49 4E 85 12 C2 21 10 C5
-04 42 41 53 45 00 85 12 DA 21 C0 C4 05 53 54 41
-54 45 85 12 B6 21 30 C6 02 42 4C 00 85 12 20 00
-F4 C5 03 55 4D 2A 2C 4F 0A 43 08 43 0B 43 19 43
-0E B9 02 24 08 5C 0B 6A 0C 5C 0A 6A 09 59 F8 2B
-8F 48 00 00 0E 4B 30 4D 94 C5 02 3C 23 00 B2 40
-AA 21 AA 21 30 4D 1E 15 0E 43 3D 40 20 00 0A 93
-04 20 0D 11 0A 4C 0C 43 09 43 0E 9B 01 28 0E 8B
-09 69 08 68 1D 83 07 30 0C 5C 0A 6A 0E 6E F5 2B
-0E 8B 12 D3 F5 3F 0A 4E 1D 17 30 41 48 C6 01 23
-1B 42 DA 21 2C 4F 0A 4E B0 12 86 C6 8F 49 00 00
-0E 48 7A 90 0A 00 02 28 3A 50 07 00 3A 50 30 00
-92 83 AA 21 18 42 AA 21 C8 4A 00 00 30 4D BE C6
-02 23 53 00 87 12 C0 C6 FA C6 2D 83 09 93 E0 23
-0E 93 DE 23 3D 41 30 4D F0 C6 02 23 3E 00 9F 42
-AA 21 00 00 3E 40 AA 21 2E 8F 30 4D 00 C6 04 48
-4F 4C 44 00 0A 4E 3E 4F DB 3F 3C C6 04 53 49 47
-4E 00 0E 93 3E 4F 3A 40 2D 00 D2 33 30 4D 52 C6
-03 55 44 2E 87 12 7E C6 F4 C6 0E C7 78 C9 40 C9
-2A C4 40 C7 02 55 2E 00 2F 83 8F 4E 00 00 0E 43
-F1 3F 3E B0 00 80 06 24 BF E3 00 00 3E E3 9F 53
-00 00 0E 63 30 4D DA C4 02 44 2E 00 87 12 7E C6
-6E C4 80 C4 62 C7 F4 C6 92 C4 32 C7 0E C7 78 C9
-40 C9 2A C4 52 C5 01 2E 3E B0 00 80 DD 27 2F 83
-3E 43 EC 3F 1E C7 04 48 45 52 45 00 2F 83 8F 4E
-00 00 1E 42 C4 21 30 4D 62 C5 05 41 4C 4C 4F 54
-82 5E C4 21 3E 4F 30 4D 0A C7 02 43 2C 00 1A 42
-C4 21 CA 4E 00 00 92 53 C4 21 3E 4F 30 4D 2F 83
-8F 4E 00 00 B0 12 52 C8 92 B3 1C 05 FD 27 1E 42
-0C 05 B0 12 64 C8 30 4D 30 40 DE C7 A6 C7 05 28
-4B 45 59 29 18 42 0C 05 EA 3F 12 C6 03 4B 45 59
-30 40 04 C8 BA C7 06 41 43 43 45 50 54 00 3C 40
-D0 C8 3B 40 9A C8 2D 15 0A 4E 2E 4F 0A 5E 3B 40
-0D 00 3C 40 20 00 3D 40 C4 C8 92 B3 1C 05 05 24
-18 42 0C 05 38 90 0A 00 04 20 21 53 39 40 7E C8
-4D 15 B2 40 11 00 0E 05 A2 B3 1C 05 FD 27 F2 C2
-03 02 30 41 B2 40 13 00 0E 05 A2 B3 1C 05 FD 27
-F2 D2 03 02 30 41 00 00 05 53 4C 45 45 50 30 40
-8C C8 00 00 07 28 53 4C 45 45 50 29 12 D2 0A 18
-F6 3F 21 52 3A 17 58 42 0C 05 48 9B E3 27 48 9C
-06 2C 78 92 11 20 2E 9F 0F 24 1E 83 05 3C 0E 9A
-03 24 CE 48 00 00 1E 53 82 48 0E 05 A2 B3 1C 05
-FD 27 30 4D C6 C8 2D 83 92 B3 1C 05 FD 27 E3 23
-B2 40 18 00 0A 18 3E 8F 3D 41 30 4D FE C7 06 28
-45 4D 49 54 29 00 08 4E 3E 4F E6 3F 78 C7 04 45
-4D 49 54 00 30 40 E6 C8 EE C8 04 45 43 48 4F 00
-B2 40 82 48 B8 C8 30 4D 96 C7 06 4E 4F 45 43 48
-4F 00 B2 40 30 4D B8 C8 30 4D DE C8 04 28 43 52
-29 00 2F 83 8F 4E 00 00 3E 40 0D 00 E3 3F CA C7
-02 43 52 00 30 40 22 C9 2C C7 05 53 50 41 43 45
-2F 83 8F 4E 00 00 3E 40 20 00 D4 3F 3A C9 06 53
-50 41 43 45 53 00 0E 93 09 24 0D 12 3D 40 62 C9
-EF 3F 64 C9 2D 83 1E 83 EB 23 3D 41 3E 4F 30 4D
-54 C7 04 54 59 50 45 00 0E 93 95 24 2A 4F 8F 5E
-00 00 0E 4A 87 12 CA C5 02 C6 0A C5 F4 C8 EC C5
-88 C9 2A C4 2F 82 8F 4E 02 00 7E 4D 8F 4D 00 00
-0D 5E 1D B3 0D 63 30 4D 4E C9 82 53 22 00 87 12
-34 C4 94 C9 F8 CB 34 C4 22 00 EE C9 BE C9 3D 41
-6E 4E 1E 83 82 5E C4 21 3E 4F 92 B3 C4 21 A2 63
-C4 21 30 4D 0A C9 82 2E 22 00 87 12 AE C9 34 C4
-78 C9 F8 CB 2A C4 00 00 04 57 4F 52 44 00 3C 40
-BE 21 39 4C 3A 4C 09 5A 3A 5C 28 4C 09 9A 19 24
-7E 9A FC 27 1A 83 3B 40 60 00 C8 4C 00 00 09 9A
-0C 24 7C 4A 4E 9C 09 24 18 53 4B 9C F6 2F 7C 90
-7B 00 F3 2F 7C 80 20 00 F0 3F 1A 82 C0 21 82 4A
-C2 21 1E 42 C4 21 08 8E CE 48 00 00 30 4D 00 00
-04 46 49 4E 44 00 2F 83 0C 4E 65 4C 74 40 80 00
-3B 40 CA 21 3E 4B 0E 93 1E 24 58 4C 01 00 78 F0
-1E 00 0E 58 2E 53 1E 4E FE FF 0E 93 F3 27 09 4E
-78 49 48 C4 48 95 F7 23 0A 4C 1A 53 FA 99 00 00
-F2 23 58 83 FA 23 19 B3 09 63 0C 49 6A 4E 1E 43
-4A 93 01 30 2E 83 8F 4C 00 00 35 40 08 C4 34 40
-14 C4 30 4D 2F 53 2F 53 3E 4F 30 4D 26 C6 07 3E
-4E 55 4D 42 45 52 2C 4F 6C 4C 7C 80 30 00 7C 90
-0A 00 02 28 7C 80 07 00 1C 92 DA 21 25 2C 2E 15
-2F 83 9F 4F 04 00 00 00 1E 42 DA 21 3D 40 E4 CA
-30 40 56 C6 E6 CA 2F 12 9F 4F 06 00 00 00 1E 42
-DA 21 3D 40 FA CA 30 40 56 C6 FC CA 3E 51 BF 51
-00 00 0E 63 AF 4F 06 00 8F 4E 04 00 1D 17 2F 53
-9F 53 00 00 1E 83 CF 23 30 4D 03 12 0D 12 12 12
-DA 21 32 C0 00 02 6D 4E 0D 5E 0C 4E 7A 40 2E 00
-0D 9C 0A 28 7A 9C FC 23 32 D0 00 02 FC 4C FE FF
-0D 9C FC 2F DE 83 00 00 3D 40 A6 CB 3F 82 8F 4E
-06 00 8F 43 04 00 8F 43 02 00 0A 4E 7E 4A 8F 4A
-00 00 79 4A 79 90 2D 00 17 2C 79 80 24 00 04 20
-B2 40 10 00 DA 21 0A 3C 59 83 03 20 A2 43 DA 21
-05 3C 69 53 98 23 B2 40 0A 00 DA 21 8F 4A 00 00
-1E 83 79 4A 79 90 2D 00 8E 23 B1 43 04 00 8F 4A
-00 00 1E 83 88 3F A8 CB 2F 53 0E 93 2C 17 82 4C
-DA 21 03 24 2F 52 0E F3 30 4D 9F 4F 02 00 04 00
-BF 4F 00 00 3E E3 09 20 3E E3 BF E3 02 00 BF E3
-00 00 9F 53 02 00 8F 63 00 00 32 B0 00 02 01 20
-2F 53 30 4D FA C8 07 45 58 45 43 55 54 45 0A 4E
-3E 4F 00 4A 28 C5 01 2C 1A 42 C4 21 A2 53 C4 21
-8A 4E 00 00 3E 4F 30 4D F6 CB 87 4C 49 54 45 52
-41 4C 82 93 B6 21 16 24 32 B0 00 02 09 24 1A 42
-C4 21 A2 52 C4 21 BA 40 34 C4 00 00 BA 4F 02 00
-1A 42 C4 21 A2 52 C4 21 BA 40 34 C4 00 00 8A 4E
-02 00 3E 4F 30 4D 30 C9 05 43 4F 55 4E 54 2F 83
-1E 53 8F 4E 00 00 5E 4E FF FF 30 4D 82 4E BE 21
-B2 4F C0 21 3E 4F 82 43 C2 21 87 12 4C C6 EE C9
-72 CC 3D 40 7E CC E7 22 3D 41 3E 4F 30 4D 80 CC
-0A 4E 3E 4F 3D 40 96 CC 48 27 3D 40 6C CC 1A E2
-B6 21 B2 27 AC 23 98 CC 3E 4F 3D 40 6C CC B9 23
-DE 53 00 00 68 4E 08 5E F8 40 3F 00 00 00 3D 40
-62 CE CD 3F E6 CB 08 45 56 41 4C 55 41 54 45 00
-39 40 BE 21 39 12 39 12 39 12 0D 12 B0 12 2A C4
-5C CC D4 CC 3D 41 B2 41 C2 21 B2 41 C0 21 B2 41
-BE 21 30 4D 7A C5 04 51 55 49 54 00 31 40 E0 20
-B2 40 00 20 00 20 82 43 B6 21 82 43 08 18 B0 12
-2A C4 94 C9 04 0D 6F 6B 20 00 78 C9 34 C4 38 21
-44 C4 34 C4 50 00 1E C8 40 C9 5C CC 34 C4 7E 20
-CE C4 B2 C5 94 C9 0D 73 74 61 63 6B 20 65 6D 70
-74 79 20 21 70 CD 34 C4 30 FF AC C7 B2 C5 94 C9
-0B 46 52 41 4D 20 66 75 6C 6C 20 21 70 CD 42 C6
-F4 C4 C0 C5 02 CD 94 C9 04 0D 20 20 20 00 BC C5
-0A CD 16 C8 05 41 42 4F 52 54 3F 40 80 20 BE 3F
-8F 93 02 00 97 26 B2 40 82 48 B8 C8 B0 12 62 D2
-82 43 1A DB 82 43 26 DB 82 43 32 DB 82 43 62 DB
-82 43 6E DB 82 43 7A DB A2 B3 1C 05 FD 27 B2 40
-11 00 0E 05 F2 C2 03 02 92 C3 1C 05 38 40 A0 AA
-39 42 19 83 FE 23 18 83 FB 23 92 B3 1C 05 F4 23
-87 12 94 C9 04 1B 5B 37 6D 00 78 C9 78 C9 94 C9
-04 1B 5B 30 6D 00 78 C9 A4 D1 E6 D1 EC D1 6A CD
-64 CD 86 41 42 4F 52 54 22 00 87 12 AE C9 34 C4
-70 CD F8 CB 2A C4 40 CA 01 27 87 12 4C C6 EE C9
-46 CA C0 C5 08 CE 2A C4 A0 CC 7A C6 81 5C 92 42
-BE 21 C2 21 30 4D 87 12 CA C9 4C C6 EE C9 20 CE
-08 4E 7A 4E 5A D3 5A 53 0A 58 19 42 C8 21 6E 4E
-3E F0 1E 00 09 5E 82 48 AE 21 82 49 B0 21 82 4A
-B2 21 2A 52 82 4A C4 21 3E 4F 3D 41 30 41 87 12
-94 C9 0F 73 74 61 63 6B 20 6D 69 73 6D 61 74 63
-68 21 76 CD 82 9F B4 21 F2 23 18 42 AE 21 19 42
-B0 21 A8 49 FE FF 89 48 00 00 30 4D E8 C9 08 56
-41 52 49 41 42 4C 45 00 B0 12 16 CE BA 40 86 12
-FC FF EF 3F 48 CC 08 43 4F 4E 53 54 41 4E 54 00
-B0 12 16 CE BA 40 85 12 FC FF 8A 4E FE FF 3E 4F
-E0 3F 96 CE 06 43 52 45 41 54 45 00 B0 12 16 CE
-BA 40 85 12 FC FF 8A 4A FE FF D3 3F B6 CC 05 44
-4F 45 53 3E 1A 42 B2 21 BA 40 84 12 00 00 8A 4D
-02 00 3D 41 30 4D CE CE 05 44 45 46 45 52 B0 12
-16 CE BA 40 30 40 FC FF BA 40 E4 CE FE FF B9 3F
-00 00 81 5B 82 43 B6 21 30 4D 0C CE 01 5D B2 43
-B6 21 30 4D AA C9 87 52 45 43 55 52 53 45 19 42
-C4 21 99 42 B2 21 00 00 A2 53 C4 21 30 4D 02 CF
-01 3A B0 12 16 CE BA 40 87 12 FC FF A2 83 C4 21
-B2 43 B6 21 82 4F B4 21 30 4D 30 CF 81 3B 82 93
-B6 21 5D 27 87 12 34 C4 2A C4 F8 CB 64 CE 04 CF
-2A C4 1C C9 09 49 4D 4D 45 44 49 41 54 45 1A 42
-AE 21 FA D0 80 00 00 00 30 4D BE 4F 02 00 3E 4F
-30 4D 64 CF 82 49 53 00 87 12 42 C6 F4 C4 C0 C5
-9C CF A8 CF 34 C4 7A CF F8 CB 2A C4 FA CD 7A CF
-2A C4 4C CF 83 5B 27 5D 87 12 FA CD 34 C4 34 C4
-F8 CB F8 CB 2A C4 E6 CC 88 50 4F 53 54 50 4F 4E
-45 00 87 12 4C C6 EE C9 46 CA 54 C4 C0 C5 08 CE
-7E C5 C0 C5 E2 CF 34 C4 34 C4 F8 CB F8 CB 34 C4
-F8 CB F8 CB 2A C4 E8 CF 3A 4E 82 4A C6 21 2E 4E
-82 4E C4 21 3D 40 10 00 09 4A 08 49 29 83 18 48
-FE FF 0E 98 FC 2B 89 48 00 00 1D 83 F6 23 2A 4A
-0A 93 F0 23 3E 4F 3D 41 30 4D 84 CF 82 49 46 00
-2F 83 8F 4E 00 00 1E 42 C4 21 BE 40 C0 C5 00 00
-A2 52 C4 21 2E 53 30 4D E8 CE 84 45 4C 53 45 00
-1A 42 C4 21 BA 40 BC C5 00 00 2A 52 82 4A C4 21
-8E 4A 00 00 2A 83 0E 4A 30 4D 72 C9 84 54 48 45
-4E 00 9E 42 C4 21 00 00 3E 4F 30 4D B4 CE 85 42
-45 47 49 4E 30 40 AC C7 5C D0 85 55 4E 54 49 4C
-39 40 C0 C5 1A 42 C4 21 A2 52 C4 21 8A 49 00 00
-8A 4E 02 00 3E 4F 30 4D E2 CD 85 41 47 41 49 4E
-39 40 BC C5 EF 3F 7E CE 85 57 48 49 4C 45 87 12
-20 D0 6E C4 2A C4 16 CF 86 52 45 50 45 41 54 00
-87 12 A0 D0 62 D0 2A C4 3A D0 82 44 4F 00 2F 83
-8F 4E 00 00 1E 42 C4 21 BE 40 CA C5 00 00 2E 53
-82 4E C4 21 A2 53 00 20 1A 42 00 20 8A 43 00 00
-30 4D 0A CC 84 4C 4F 4F 50 00 39 40 EC C5 1A 42
-C4 21 A2 52 C4 21 8A 49 00 00 8A 4E 02 00 1E 42
-00 20 A2 83 00 20 2E 4E 0E 93 04 24 9E 42 C4 21
-00 00 F5 3F 3E 4F 30 4D 0C C8 85 2B 4C 4F 4F 50
-39 40 DA C5 E4 3F F4 D0 85 4C 45 41 56 45 1A 42
-C4 21 BA 40 FC C5 00 00 BA 40 BC C5 02 00 B2 50
-06 00 C4 21 A2 53 00 20 2A 52 19 42 00 20 89 4A
-00 00 30 4D 38 D1 04 4D 4F 56 45 00 0A 4E 38 4F
-39 4F 3E 4F 0A 93 11 24 08 99 0F 24 06 2C F8 49
-00 00 18 53 1A 83 FB 23 30 4D 08 5A 09 5A 19 83
-18 83 E8 49 00 00 1A 83 FA 23 30 4D 34 C4 CA 21
-FC C4 2A C4 84 12 9C D1 9C D4 72 D4 CA D0 F8 CD
-5A D4 2A D1 66 D1 D6 C9 0A D2 3E D2 7A D0 04 D3
-48 C5 A4 CF 0C CF AE CA 00 00 3A 40 0C 00 39 40
-CA 21 38 40 CC 21 D9 3F 3A 40 0E 00 39 40 CC 21
-38 40 CA 21 CC 3F 82 43 CC 21 30 4D 92 42 CA 21
-C8 21 30 4D B8 CF 09 50 57 52 5F 53 54 41 54 45
-84 12 E6 CF 56 D4 A0 DB F6 D1 08 50 57 52 5F 48
-45 52 45 00 92 42 C4 21 06 D2 92 42 C6 21 04 D2
-EF 3F B8 D0 09 52 53 54 5F 53 54 41 54 45 92 42
-0C 18 06 D2 92 42 0E 18 04 D2 E2 3F 24 D2 08 52
-53 54 5F 48 45 52 45 00 92 42 C4 21 0C 18 92 42
-C6 21 0E 18 DF 3F B2 40 AA D2 0C D3 B2 40 8C C8
-80 C8 B2 40 E6 C8 F6 C8 B2 40 22 C9 36 C9 B2 40
-04 C8 12 C8 30 41 A8 D0 04 57 49 50 45 00 39 40
-80 FF B9 43 00 00 29 53 39 90 E2 FF FA 23 B0 12
-56 D2 B2 40 A0 DB C4 21 B2 40 56 D4 C6 21 D4 3F
-1C D0 06 28 57 41 52 4D 29 00 1E 42 08 18 87 12
-94 C9 05 0D 1B 5B 37 6D 78 C9 98 C7 94 C9 27 20
-46 61 73 74 46 6F 72 74 68 20 56 31 36 30 20 31
-36 4D 48 7A 20 28 43 29 20 4A 2E 4D 2E 54 68 6F
-6F 72 65 6E 73 20 78 C9 34 C4 30 FF AC C7 2A C5
-58 C7 94 C9 0B 62 79 74 65 73 20 66 72 65 65 20
-7C CD 78 D2 04 57 41 52 4D 00 30 40 AA D2 6E D0
-04 43 4F 4C 44 00 B2 40 04 A5 20 01 B2 40 88 5A
-CC 01 B2 D0 00 08 04 02 B2 D3 06 02 B2 43 02 02
-B2 40 00 01 24 02 B2 40 FF FE 22 02 B2 D0 FF FE
-26 02 B2 43 42 02 B2 D3 46 02 B2 43 62 02 B2 D3
-66 02 F2 40 A5 00 A1 01 F2 40 10 00 A0 01 D2 43
-A1 01 B2 40 00 A5 60 01 B2 40 29 01 80 01 B2 40
-0B 00 82 01 B2 40 E9 01 84 01 39 40 40 00 82 43
-88 01 92 D2 5E 01 08 18 A2 93 08 18 01 24 59 03
-38 40 50 C3 18 83 FE 23 19 83 FA 23 B2 40 00 06
-2A 02 3A 40 1C D3 39 40 E2 FF 89 4A 00 00 29 53
-FC 23 92 42 02 18 EC FF B2 40 18 00 0A 18 31 40
-E0 20 3F 40 80 20 37 40 00 C4 36 40 B4 C4 35 40
-08 C4 34 40 14 C4 B2 40 0A 00 DA 21 B2 43 AC 21
-92 C3 30 01 18 42 08 18 D2 B3 00 02 04 20 38 E3
-18 53 82 48 08 18 B2 40 81 00 00 05 B2 40 05 00
-06 05 B2 40 00 49 08 05 F2 D0 03 00 0A 02 92 C3
-00 05 92 D3 1A 05 3D 40 30 D4 18 42 08 18 38 90
-0A 00 2D 27 38 90 16 00 2A 2F 28 93 00 23 E8 26
-0A D3 84 12 9C D1 7E DA 2A DB 32 DA 7E DB F8 D9
-B2 DA FC D6 00 00 EE D9 9E DA 50 DA 8E DA 0C D8
-00 00 00 00 90 DB C8 D1 A2 D2 85 48 49 32 4C 4F
-87 12 AC C7 34 D0 F8 CB 04 CF CA D1 32 D4 2A C4
-10 D3 04 43 4F 44 45 00 B0 12 16 CE A2 82 C4 21
-87 12 44 CF BC C5 6A D4 00 00 07 45 4E 44 43 4F
-44 45 87 12 D8 D1 64 CE 2A C4 9A D0 03 41 53 4D
-92 42 C8 21 B8 21 B2 40 36 D4 C8 21 E5 3F 8A D4
-06 45 4E 44 41 53 4D 00 92 42 B8 21 C8 21 E9 3F
-00 00 05 43 4F 4C 4F 4E 1A 42 C4 21 BA 40 87 12
-00 00 A2 53 C4 21 B2 43 B6 21 30 40 D8 D1 00 00
-05 4C 4F 32 48 49 1A 42 C4 21 BA 40 B0 12 00 00
-BA 40 2A C4 02 00 A2 52 C4 21 ED 3F 38 40 BE 21
-39 48 2A 48 09 5A 1A 52 C2 21 09 9A 03 24 7E 9A
-FC 27 1A 83 0E 4A 2A 88 82 4A C2 21 30 4D B0 12
-2A C4 EE C9 46 CA 72 C5 C0 C5 34 D5 1A CB C0 C5
-08 CE 56 D5 36 D5 29 4E 39 90 86 12 02 20 2E 53
-30 41 39 90 85 12 03 20 1E 4E 02 00 30 41 39 90
-84 12 01 20 2E 52 30 41 19 42 C4 21 A2 53 C4 21
-89 4E 00 00 3E 40 29 00 12 12 C2 21 92 53 C2 21
-B0 12 2A C4 EE C9 1A CB C0 C5 88 D5 7E D5 21 53
-3E 90 10 00 BB 2D 30 41 8A D5 B2 41 C2 21 22 D3
-30 41 87 12 4C C6 FC D4 9A D5 82 43 BC 21 92 42
-C4 21 BA 21 A2 53 C4 21 0A 4E 3E 4F FA 90 23 00
-00 00 34 20 92 53 C2 21 B0 12 1E D5 0E 93 04 20
-B2 40 00 03 BC 21 27 3C 1E 93 04 20 B2 40 10 03
-BC 21 21 3C 2E 93 04 20 B2 40 20 03 BC 21 1B 3C
-2E 92 04 20 B2 40 20 02 BC 21 15 3C 3E 92 04 20
-B2 40 30 02 BC 21 0F 3C 3E 93 04 20 B2 40 30 03
-BC 21 09 3C B2 40 30 00 BC 21 19 42 C4 21 A2 53
-C4 21 89 4E 00 00 3E 4F 3D 41 30 4D FA 90 26 00
-00 00 08 20 B2 40 10 02 BC 21 92 53 C2 21 30 12
-0A D6 75 3F FA 90 40 00 00 00 1A 20 B2 40 20 00
-BC 21 92 53 C2 21 B0 12 68 D5 0E 20 B2 50 10 00
-BC 21 3E 40 2B 00 B0 12 68 D5 32 24 92 92 BE 21
-C2 21 02 24 92 53 C2 21 8E 10 82 5E BC 21 D3 3F
-B0 12 68 D5 F9 23 B2 50 10 00 BC 21 3E 40 28 00
-B0 12 1E D5 30 12 5A D6 67 3F 87 12 4C C6 FC D4
-92 D6 FE 90 26 00 00 00 3E 40 20 00 04 20 B2 50
-82 00 BC 21 C2 3F B0 12 68 D5 DF 23 B2 50 80 00
-BC 21 3E 40 28 00 B0 12 1E D5 B0 12 58 D5 D5 23
-3D 40 08 CE 30 4D 78 C8 04 52 45 54 49 00 87 12
-34 C4 00 13 F8 CB 2A C4 34 C4 2C 00 92 D5 8A D6
-E2 D6 2E 4E 1E D2 BC 21 19 42 BA 21 92 3F E0 D4
-03 4D 4F 56 84 12 D8 D6 00 40 F0 D6 05 4D 4F 56
-2E 42 84 12 D8 D6 40 40 00 00 03 41 44 44 84 12
-D8 D6 00 50 0A D7 05 41 44 44 2E 42 84 12 D8 D6
-40 50 16 D7 04 41 44 44 43 00 84 12 D8 D6 00 60
-24 D7 06 41 44 44 43 2E 42 00 84 12 D8 D6 40 60
-C8 D6 04 53 55 42 43 00 84 12 D8 D6 00 70 42 D7
-06 53 55 42 43 2E 42 00 84 12 D8 D6 40 70 50 D7
-03 53 55 42 84 12 D8 D6 00 80 60 D7 05 53 55 42
-2E 42 84 12 D8 D6 40 80 C2 D4 03 43 4D 50 84 12
-D8 D6 00 90 7A D7 05 43 4D 50 2E 42 84 12 D8 D6
-40 90 B0 D4 04 44 41 44 44 00 84 12 D8 D6 00 A0
-94 D7 06 44 41 44 44 2E 42 00 84 12 D8 D6 40 A0
-86 D7 03 42 49 54 84 12 D8 D6 00 B0 B2 D7 05 42
-49 54 2E 42 84 12 D8 D6 40 B0 BE D7 03 42 49 43
-84 12 D8 D6 00 C0 CC D7 05 42 49 43 2E 42 84 12
-D8 D6 40 C0 D8 D7 03 42 49 53 84 12 D8 D6 00 D0
-E6 D7 05 42 49 53 2E 42 84 12 D8 D6 40 D0 00 00
-03 58 4F 52 84 12 D8 D6 00 E0 00 D8 05 58 4F 52
-2E 42 84 12 D8 D6 40 E0 32 D7 03 41 4E 44 84 12
-D8 D6 00 F0 1A D8 05 41 4E 44 2E 42 84 12 D8 D6
-40 F0 4C C6 92 D5 38 D8 1A 42 BC 21 B2 F0 70 00
-BC 21 8A 10 3A F0 0F 00 82 DA BC 21 4A 3F 6C D7
-03 52 52 43 84 12 32 D8 00 10 50 D8 05 52 52 43
-2E 42 84 12 32 D8 40 10 5C D8 04 53 57 50 42 00
-84 12 32 D8 80 10 6A D8 03 52 52 41 84 12 32 D8
-00 11 78 D8 05 52 52 41 2E 42 84 12 32 D8 40 11
-84 D8 03 53 58 54 84 12 32 D8 80 11 00 00 04 50
-55 53 48 00 84 12 32 D8 00 12 9E D8 06 50 55 53
-48 2E 42 00 84 12 32 D8 40 12 F2 D7 04 43 41 4C
-4C 00 84 12 32 D8 80 12 34 C4 2C 00 92 D5 8A D6
-D2 D8 59 42 BC 21 5A 42 BD 21 82 4A BC 21 BE 90
-00 15 00 00 02 20 0A 89 02 3C 09 8A 0A 49 3A 90
-10 00 03 2C 5A 0E A8 3F 1A 53 0E 4A 87 12 98 C7
-94 C9 0D 6F 75 74 20 6F 66 20 62 6F 75 6E 64 73
-76 CD AC D8 05 50 55 53 48 4D 84 12 C8 D8 00 15
-14 D9 04 50 4F 50 4D 00 84 12 C8 D8 00 17 4C C6
-FC D4 34 D9 82 43 BC 21 92 42 C4 21 BA 21 A2 53
-C4 21 92 53 C2 21 3E 40 2C 00 B0 12 2A C4 EE C9
-1A CB C0 C5 08 CE 8A D6 5A D9 0A 4E 3E 4F 1A 83
-2A 92 CA 2F 8A 10 5A 06 6F 3F 92 D8 04 52 52 43
-4D 00 84 12 2E D9 50 00 6C D9 04 52 52 41 4D 00
-84 12 2E D9 50 01 7A D9 04 52 4C 41 4D 00 84 12
-2E D9 50 02 88 D9 04 52 52 55 4D 00 84 12 2E D9
-50 03 85 12 00 3C 96 D9 03 53 3E 3D 85 12 00 38
-A8 D9 02 53 3C 00 85 12 00 34 22 D9 03 30 3E 3D
-85 12 00 30 BC D9 02 30 3C 00 85 12 00 30 00 00
-02 55 3C 00 85 12 00 2C D0 D9 03 55 3E 3D 85 12
-00 28 C6 D9 03 30 3C 3E 85 12 00 24 E4 D9 02 30
-3D 00 85 12 00 20 84 C8 02 49 46 00 1A 42 C4 21
-8A 4E 00 00 A2 53 C4 21 0E 4A 30 4D DA D9 04 54
-48 45 4E 00 1A 42 C4 21 08 4E 3E 4F 09 48 29 53
-0A 89 0A 11 3A 90 00 02 68 2F 88 DA 00 00 30 4D
-A2 D7 04 45 4C 53 45 00 1A 42 C4 21 BA 40 00 3C
-00 00 A2 53 C4 21 2F 83 8F 4A 00 00 E3 3F 0E DA
-05 55 4E 54 49 4C 3A 4F 08 4E 3E 4F 19 42 C4 21
-2A 83 0A 89 0A 11 3A 90 00 FE 47 3B 3A F0 FF 03
-08 DA 89 48 00 00 A2 53 C4 21 30 4D 26 D8 05 41
-47 41 49 4E 87 12 A2 D9 56 DA 2A C4 00 00 05 57
-48 49 4C 45 87 12 FC D9 6E C4 2A C4 B2 D9 06 52
-45 50 45 41 54 00 87 12 A2 D9 56 DA 14 DA 2A C4
-00 00 03 4A 4D 50 87 12 FA CD A2 D9 56 DA 2A C4
-3E B0 00 10 03 20 3E E0 00 04 30 4D 3E 90 00 34
-06 28 03 24 3E 40 00 34 30 4D 3E 40 00 38 30 4D
-00 00 04 3F 4A 4D 50 00 87 12 C0 DA FA CD 6E C4
-56 DA 2A C4 F6 DA 3D 41 08 4E 3E 4F 2A 48 0A 93
-04 20 98 42 C4 21 00 00 30 4D 88 43 00 00 A4 3F
-BC D8 03 42 57 31 84 12 F4 DA 00 00 12 DB 03 42
-57 32 84 12 F4 DA 00 00 1E DB 03 42 57 33 84 12
-F4 DA 00 00 36 DB 3D 41 1A 42 C4 21 28 4E 08 93
-08 20 BA 4F 00 00 A2 53 C4 21 8E 4A 00 00 3E 4F
-30 4D 8E 43 00 00 61 3F 00 00 03 46 57 31 84 12
-34 DB 00 00 5A DB 03 46 57 32 84 12 34 DB 00 00
-66 DB 03 46 57 33 84 12 34 DB 00 00 72 DB 04 47
-4F 54 4F 00 87 12 A2 D9 FA CD EE CB 2A C4 E2 DA
-05 3F 47 4F 54 4F 87 12 C0 DA FA CD EE CB 2A C4
-@FFE2
-1C D3 1C D3 1C D3 1C D3 1C D3 92 C8 1C D3 1C D3
-1C D3 1C D3 1C D3 1C D3 1C D3 1C D3 1C D3
-q
+++ /dev/null
-@1800
-10 00 86 C8 F4 01 80 04 FD FF 18 00 7E DB 34 D4
-52 C8 5E C8 00 00 00 00
-@21AA
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00
-@C400
-3A 41 0D 12 0D 4A 30 4D 2F 83 8F 4E 00 00 3E 41
-2E 4E 30 4D 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E
-30 4D 00 00 04 45 58 49 54 00 3D 41 30 4D 00 00
-03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 C4
-03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
-44 55 50 00 0E 93 F6 23 30 4D 40 C4 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 C4 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E C4 02 3E 52 00 0E 12 3E 4F 30 4D 8E C4
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 C4
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C C4 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 20 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 C4 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 C5
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 C4 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA C4 03 41 4E 44 3E FF 30 4D 7A C4 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E C5 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 C5 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E C5 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 C5 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 C4 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
-3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE C5 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 C5 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 C5 03 3E 49 4E 85 12 C2 21 10 C5
-04 42 41 53 45 00 85 12 DA 21 C0 C4 05 53 54 41
-54 45 85 12 B6 21 30 C6 02 42 4C 00 85 12 20 00
-F4 C5 03 55 4D 2A 2C 4F 0A 43 08 43 0B 43 19 43
-0E B9 02 24 08 5C 0B 6A 0C 5C 0A 6A 09 59 F8 2B
-8F 48 00 00 0E 4B 30 4D 94 C5 02 3C 23 00 B2 40
-AA 21 AA 21 30 4D 1E 15 0E 43 3D 40 20 00 0A 93
-04 20 0D 11 0A 4C 0C 43 09 43 0E 9B 01 28 0E 8B
-09 69 08 68 1D 83 07 30 0C 5C 0A 6A 0E 6E F5 2B
-0E 8B 12 D3 F5 3F 0A 4E 1D 17 30 41 48 C6 01 23
-1B 42 DA 21 2C 4F 0A 4E B0 12 86 C6 8F 49 00 00
-0E 48 7A 90 0A 00 02 28 3A 50 07 00 3A 50 30 00
-92 83 AA 21 18 42 AA 21 C8 4A 00 00 30 4D BE C6
-02 23 53 00 87 12 C0 C6 FA C6 2D 83 09 93 E0 23
-0E 93 DE 23 3D 41 30 4D F0 C6 02 23 3E 00 9F 42
-AA 21 00 00 3E 40 AA 21 2E 8F 30 4D 00 C6 04 48
-4F 4C 44 00 0A 4E 3E 4F DB 3F 3C C6 04 53 49 47
-4E 00 0E 93 3E 4F 3A 40 2D 00 D2 33 30 4D 52 C6
-03 55 44 2E 87 12 7E C6 F4 C6 0E C7 6C C9 34 C9
-2A C4 40 C7 02 55 2E 00 2F 83 8F 4E 00 00 0E 43
-F1 3F 3E B0 00 80 06 24 BF E3 00 00 3E E3 9F 53
-00 00 0E 63 30 4D DA C4 02 44 2E 00 87 12 7E C6
-6E C4 80 C4 62 C7 F4 C6 92 C4 32 C7 0E C7 6C C9
-34 C9 2A C4 52 C5 01 2E 3E B0 00 80 DD 27 2F 83
-3E 43 EC 3F 1E C7 04 48 45 52 45 00 2F 83 8F 4E
-00 00 1E 42 C4 21 30 4D 62 C5 05 41 4C 4C 4F 54
-82 5E C4 21 3E 4F 30 4D 0A C7 02 43 2C 00 1A 42
-C4 21 CA 4E 00 00 92 53 C4 21 3E 4F 30 4D 2F 83
-8F 4E 00 00 B0 12 52 C8 92 B3 1C 05 FD 27 1E 42
-0C 05 B0 12 5E C8 30 4D 30 40 DE C7 A6 C7 05 28
-4B 45 59 29 18 42 0C 05 EA 3F 12 C6 03 4B 45 59
-30 40 04 C8 BA C7 06 41 43 43 45 50 54 00 3C 40
-BE C8 3B 40 8E C8 2D 15 0A 4E 2E 4F 0A 5E 3B 40
-0D 00 3C 40 20 00 3D 40 B2 C8 92 B3 1C 05 05 24
-18 42 0C 05 38 90 0A 00 04 20 21 53 39 40 72 C8
-4D 15 B2 40 11 00 0E 05 F2 C2 03 02 30 41 B2 40
-13 00 0E 05 F2 D2 03 02 30 41 00 00 05 53 4C 45
-45 50 30 40 80 C8 00 00 07 28 53 4C 45 45 50 29
-12 D2 0A 18 F6 3F 21 52 3A 17 58 42 0C 05 48 9B
-E6 27 48 9C 06 2C 78 92 0E 20 2E 9F 0C 24 1E 83
-05 3C 0E 9A 03 24 CE 48 00 00 1E 53 82 48 0E 05
-30 4D B4 C8 2D 83 92 B3 1C 05 FD 27 E6 23 B2 40
-18 00 0A 18 3E 8F 3D 41 30 4D FE C7 06 28 45 4D
-49 54 29 00 08 4E 3E 4F A2 B3 1C 05 FD 27 E6 3F
-78 C7 04 45 4D 49 54 00 30 40 D4 C8 E2 C8 04 45
-43 48 4F 00 B2 40 82 48 AC C8 30 4D 96 C7 06 4E
-4F 45 43 48 4F 00 B2 40 30 4D AC C8 30 4D CC C8
-04 28 43 52 29 00 2F 83 8F 4E 00 00 3E 40 0D 00
-E3 3F CA C7 02 43 52 00 30 40 16 C9 2C C7 05 53
-50 41 43 45 2F 83 8F 4E 00 00 3E 40 20 00 D4 3F
-2E C9 06 53 50 41 43 45 53 00 0E 93 09 24 0D 12
-3D 40 56 C9 EF 3F 58 C9 2D 83 1E 83 EB 23 3D 41
-3E 4F 30 4D 54 C7 04 54 59 50 45 00 0E 93 95 24
-2A 4F 8F 5E 00 00 0E 4A 87 12 CA C5 02 C6 0A C5
-E8 C8 EC C5 7C C9 2A C4 2F 82 8F 4E 02 00 7E 4D
-8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D 42 C9 82 53
-22 00 87 12 34 C4 88 C9 EC CB 34 C4 22 00 E2 C9
-B2 C9 3D 41 6E 4E 1E 83 82 5E C4 21 3E 4F 92 B3
-C4 21 A2 63 C4 21 30 4D FE C8 82 2E 22 00 87 12
-A2 C9 34 C4 6C C9 EC CB 2A C4 00 00 04 57 4F 52
-44 00 3C 40 BE 21 39 4C 3A 4C 09 5A 3A 5C 28 4C
-09 9A 19 24 7E 9A FC 27 1A 83 3B 40 60 00 C8 4C
-00 00 09 9A 0C 24 7C 4A 4E 9C 09 24 18 53 4B 9C
-F6 2F 7C 90 7B 00 F3 2F 7C 80 20 00 F0 3F 1A 82
-C0 21 82 4A C2 21 1E 42 C4 21 08 8E CE 48 00 00
-30 4D 00 00 04 46 49 4E 44 00 2F 83 0C 4E 65 4C
-74 40 80 00 3B 40 CA 21 3E 4B 0E 93 1E 24 58 4C
-01 00 78 F0 1E 00 0E 58 2E 53 1E 4E FE FF 0E 93
-F3 27 09 4E 78 49 48 C4 48 95 F7 23 0A 4C 1A 53
-FA 99 00 00 F2 23 58 83 FA 23 19 B3 09 63 0C 49
-6A 4E 1E 43 4A 93 01 30 2E 83 8F 4C 00 00 35 40
-08 C4 34 40 14 C4 30 4D 2F 53 2F 53 3E 4F 30 4D
-26 C6 07 3E 4E 55 4D 42 45 52 2C 4F 6C 4C 7C 80
-30 00 7C 90 0A 00 02 28 7C 80 07 00 1C 92 DA 21
-25 2C 2E 15 2F 83 9F 4F 04 00 00 00 1E 42 DA 21
-3D 40 D8 CA 30 40 56 C6 DA CA 2F 12 9F 4F 06 00
-00 00 1E 42 DA 21 3D 40 EE CA 30 40 56 C6 F0 CA
-3E 51 BF 51 00 00 0E 63 AF 4F 06 00 8F 4E 04 00
-1D 17 2F 53 9F 53 00 00 1E 83 CF 23 30 4D 03 12
-0D 12 12 12 DA 21 32 C0 00 02 6D 4E 0D 5E 0C 4E
-7A 40 2E 00 0D 9C 0A 28 7A 9C FC 23 32 D0 00 02
-FC 4C FE FF 0D 9C FC 2F DE 83 00 00 3D 40 9A CB
-3F 82 8F 4E 06 00 8F 43 04 00 8F 43 02 00 0A 4E
-7E 4A 8F 4A 00 00 79 4A 79 90 2D 00 17 2C 79 80
-24 00 04 20 B2 40 10 00 DA 21 0A 3C 59 83 03 20
-A2 43 DA 21 05 3C 69 53 98 23 B2 40 0A 00 DA 21
-8F 4A 00 00 1E 83 79 4A 79 90 2D 00 8E 23 B1 43
-04 00 8F 4A 00 00 1E 83 88 3F 9C CB 2F 53 0E 93
-2C 17 82 4C DA 21 03 24 2F 52 0E F3 30 4D 9F 4F
-02 00 04 00 BF 4F 00 00 3E E3 09 20 3E E3 BF E3
-02 00 BF E3 00 00 9F 53 02 00 8F 63 00 00 32 B0
-00 02 01 20 2F 53 30 4D EE C8 07 45 58 45 43 55
-54 45 0A 4E 3E 4F 00 4A 28 C5 01 2C 1A 42 C4 21
-A2 53 C4 21 8A 4E 00 00 3E 4F 30 4D EA CB 87 4C
-49 54 45 52 41 4C 82 93 B6 21 16 24 32 B0 00 02
-09 24 1A 42 C4 21 A2 52 C4 21 BA 40 34 C4 00 00
-BA 4F 02 00 1A 42 C4 21 A2 52 C4 21 BA 40 34 C4
-00 00 8A 4E 02 00 3E 4F 30 4D 24 C9 05 43 4F 55
-4E 54 2F 83 1E 53 8F 4E 00 00 5E 4E FF FF 30 4D
-82 4E BE 21 B2 4F C0 21 3E 4F 82 43 C2 21 87 12
-4C C6 E2 C9 66 CC 3D 40 72 CC E7 22 3D 41 3E 4F
-30 4D 74 CC 0A 4E 3E 4F 3D 40 8A CC 48 27 3D 40
-60 CC 1A E2 B6 21 B2 27 AC 23 8C CC 3E 4F 3D 40
-60 CC B9 23 DE 53 00 00 68 4E 08 5E F8 40 3F 00
-00 00 3D 40 56 CE CD 3F DA CB 08 45 56 41 4C 55
-41 54 45 00 39 40 BE 21 39 12 39 12 39 12 0D 12
-B0 12 2A C4 50 CC C8 CC 3D 41 B2 41 C2 21 B2 41
-C0 21 B2 41 BE 21 30 4D 7A C5 04 51 55 49 54 00
-31 40 E0 20 B2 40 00 20 00 20 82 43 B6 21 82 43
-08 18 B0 12 2A C4 88 C9 04 0D 6F 6B 20 00 6C C9
-34 C4 38 21 44 C4 34 C4 50 00 1E C8 34 C9 50 CC
-34 C4 7E 20 CE C4 B2 C5 88 C9 0D 73 74 61 63 6B
-20 65 6D 70 74 79 20 21 64 CD 34 C4 30 FF AC C7
-B2 C5 88 C9 0B 46 52 41 4D 20 66 75 6C 6C 20 21
-64 CD 42 C6 F4 C4 C0 C5 F6 CC 88 C9 04 0D 20 20
-20 00 BC C5 FE CC 16 C8 05 41 42 4F 52 54 3F 40
-80 20 BE 3F 8F 93 02 00 97 26 B2 40 82 48 AC C8
-B0 12 56 D2 82 43 F8 DA 82 43 04 DB 82 43 10 DB
-82 43 40 DB 82 43 4C DB 82 43 58 DB A2 B3 1C 05
-FD 27 B2 40 11 00 0E 05 F2 C2 03 02 92 C3 1C 05
-38 40 55 05 39 42 19 83 FE 23 18 83 FB 23 92 B3
-1C 05 F4 23 87 12 88 C9 04 1B 5B 37 6D 00 6C C9
-6C C9 88 C9 04 1B 5B 30 6D 00 6C C9 98 D1 DA D1
-E0 D1 5E CD 58 CD 86 41 42 4F 52 54 22 00 87 12
-A2 C9 34 C4 64 CD EC CB 2A C4 34 CA 01 27 87 12
-4C C6 E2 C9 3A CA C0 C5 FC CD 2A C4 94 CC 7A C6
-81 5C 92 42 BE 21 C2 21 30 4D 87 12 BE C9 4C C6
-E2 C9 14 CE 08 4E 7A 4E 5A D3 5A 53 0A 58 19 42
-C8 21 6E 4E 3E F0 1E 00 09 5E 82 48 AE 21 82 49
-B0 21 82 4A B2 21 2A 52 82 4A C4 21 3E 4F 3D 41
-30 41 87 12 88 C9 0F 73 74 61 63 6B 20 6D 69 73
-6D 61 74 63 68 21 6A CD 82 9F B4 21 F2 23 18 42
-AE 21 19 42 B0 21 A8 49 FE FF 89 48 00 00 30 4D
-DC C9 08 56 41 52 49 41 42 4C 45 00 B0 12 0A CE
-BA 40 86 12 FC FF EF 3F 3C CC 08 43 4F 4E 53 54
-41 4E 54 00 B0 12 0A CE BA 40 85 12 FC FF 8A 4E
-FE FF 3E 4F E0 3F 8A CE 06 43 52 45 41 54 45 00
-B0 12 0A CE BA 40 85 12 FC FF 8A 4A FE FF D3 3F
-AA CC 05 44 4F 45 53 3E 1A 42 B2 21 BA 40 84 12
-00 00 8A 4D 02 00 3D 41 30 4D C2 CE 05 44 45 46
-45 52 B0 12 0A CE BA 40 30 40 FC FF BA 40 D8 CE
-FE FF B9 3F 00 00 81 5B 82 43 B6 21 30 4D 00 CE
-01 5D B2 43 B6 21 30 4D 9E C9 87 52 45 43 55 52
-53 45 19 42 C4 21 99 42 B2 21 00 00 A2 53 C4 21
-30 4D F6 CE 01 3A B0 12 0A CE BA 40 87 12 FC FF
-A2 83 C4 21 B2 43 B6 21 82 4F B4 21 30 4D 24 CF
-81 3B 82 93 B6 21 5D 27 87 12 34 C4 2A C4 EC CB
-58 CE F8 CE 2A C4 10 C9 09 49 4D 4D 45 44 49 41
-54 45 1A 42 AE 21 FA D0 80 00 00 00 30 4D BE 4F
-02 00 3E 4F 30 4D 58 CF 82 49 53 00 87 12 42 C6
-F4 C4 C0 C5 90 CF 9C CF 34 C4 6E CF EC CB 2A C4
-EE CD 6E CF 2A C4 40 CF 83 5B 27 5D 87 12 EE CD
-34 C4 34 C4 EC CB EC CB 2A C4 DA CC 88 50 4F 53
-54 50 4F 4E 45 00 87 12 4C C6 E2 C9 3A CA 54 C4
-C0 C5 FC CD 7E C5 C0 C5 D6 CF 34 C4 34 C4 EC CB
-EC CB 34 C4 EC CB EC CB 2A C4 DC CF 3A 4E 82 4A
-C6 21 2E 4E 82 4E C4 21 3D 40 10 00 09 4A 08 49
-29 83 18 48 FE FF 0E 98 FC 2B 89 48 00 00 1D 83
-F6 23 2A 4A 0A 93 F0 23 3E 4F 3D 41 30 4D 78 CF
-82 49 46 00 2F 83 8F 4E 00 00 1E 42 C4 21 BE 40
-C0 C5 00 00 A2 52 C4 21 2E 53 30 4D DC CE 84 45
-4C 53 45 00 1A 42 C4 21 BA 40 BC C5 00 00 2A 52
-82 4A C4 21 8E 4A 00 00 2A 83 0E 4A 30 4D 66 C9
-84 54 48 45 4E 00 9E 42 C4 21 00 00 3E 4F 30 4D
-A8 CE 85 42 45 47 49 4E 30 40 AC C7 50 D0 85 55
-4E 54 49 4C 39 40 C0 C5 1A 42 C4 21 A2 52 C4 21
-8A 49 00 00 8A 4E 02 00 3E 4F 30 4D D6 CD 85 41
-47 41 49 4E 39 40 BC C5 EF 3F 72 CE 85 57 48 49
-4C 45 87 12 14 D0 6E C4 2A C4 0A CF 86 52 45 50
-45 41 54 00 87 12 94 D0 56 D0 2A C4 2E D0 82 44
-4F 00 2F 83 8F 4E 00 00 1E 42 C4 21 BE 40 CA C5
-00 00 2E 53 82 4E C4 21 A2 53 00 20 1A 42 00 20
-8A 43 00 00 30 4D FE CB 84 4C 4F 4F 50 00 39 40
-EC C5 1A 42 C4 21 A2 52 C4 21 8A 49 00 00 8A 4E
-02 00 1E 42 00 20 A2 83 00 20 2E 4E 0E 93 04 24
-9E 42 C4 21 00 00 F5 3F 3E 4F 30 4D 0C C8 85 2B
-4C 4F 4F 50 39 40 DA C5 E4 3F E8 D0 85 4C 45 41
-56 45 1A 42 C4 21 BA 40 FC C5 00 00 BA 40 BC C5
-02 00 B2 50 06 00 C4 21 A2 53 00 20 2A 52 19 42
-00 20 89 4A 00 00 30 4D 2C D1 04 4D 4F 56 45 00
-0A 4E 38 4F 39 4F 3E 4F 0A 93 11 24 08 99 0F 24
-06 2C F8 49 00 00 18 53 1A 83 FB 23 30 4D 08 5A
-09 5A 19 83 18 83 E8 49 00 00 1A 83 FA 23 30 4D
-34 C4 CA 21 FC C4 2A C4 84 12 90 D1 7A D4 50 D4
-BE D0 EC CD 38 D4 1E D1 5A D1 CA C9 FE D1 32 D2
-6E D0 F8 D2 48 C5 98 CF 00 CF A2 CA 00 00 3A 40
-0C 00 39 40 CA 21 38 40 CC 21 D9 3F 3A 40 0E 00
-39 40 CC 21 38 40 CA 21 CC 3F 82 43 CC 21 30 4D
-92 42 CA 21 C8 21 30 4D AC CF 09 50 57 52 5F 53
-54 41 54 45 84 12 DA CF 34 D4 7E DB EA D1 08 50
-57 52 5F 48 45 52 45 00 92 42 C4 21 FA D1 92 42
-C6 21 F8 D1 EF 3F AC D0 09 52 53 54 5F 53 54 41
-54 45 92 42 0C 18 FA D1 92 42 0E 18 F8 D1 E2 3F
-18 D2 08 52 53 54 5F 48 45 52 45 00 92 42 C4 21
-0C 18 92 42 C6 21 0E 18 DF 3F B2 40 9E D2 00 D3
-B2 40 80 C8 74 C8 B2 40 D4 C8 EA C8 B2 40 16 C9
-2A C9 B2 40 04 C8 12 C8 30 41 9C D0 04 57 49 50
-45 00 39 40 80 FF B9 43 00 00 29 53 39 90 E2 FF
-FA 23 B0 12 4A D2 B2 40 7E DB C4 21 B2 40 34 D4
-C6 21 D4 3F 10 D0 06 28 57 41 52 4D 29 00 1E 42
-08 18 87 12 88 C9 05 0D 1B 5B 37 6D 6C C9 98 C7
-88 C9 27 20 46 61 73 74 46 6F 72 74 68 20 56 31
-36 30 20 2E 35 4D 48 7A 20 28 43 29 20 4A 2E 4D
-2E 54 68 6F 6F 72 65 6E 73 20 6C C9 34 C4 30 FF
-AC C7 2A C5 58 C7 88 C9 0B 62 79 74 65 73 20 66
-72 65 65 20 70 CD 6C D2 04 57 41 52 4D 00 30 40
-9E D2 62 D0 04 43 4F 4C 44 00 B2 40 04 A5 20 01
-B2 40 88 5A CC 01 B2 D0 00 08 04 02 B2 D3 06 02
-B2 43 02 02 B2 40 00 01 24 02 B2 40 FF FE 22 02
-B2 D0 FF FE 26 02 B2 43 42 02 B2 D3 46 02 B2 43
-62 02 B2 D3 66 02 B2 40 00 A5 60 01 B2 40 D6 00
-80 01 92 43 82 01 B2 40 0F 10 84 01 29 43 82 43
-88 01 92 D2 5E 01 08 18 A2 93 08 18 01 24 59 03
-38 40 50 C3 18 83 FE 23 19 83 FA 23 B2 40 00 06
-2A 02 3A 40 10 D3 39 40 E2 FF 89 4A 00 00 29 53
-FC 23 92 42 02 18 EC FF B2 40 18 00 0A 18 31 40
-E0 20 3F 40 80 20 37 40 00 C4 36 40 B4 C4 35 40
-08 C4 34 40 14 C4 B2 40 0A 00 DA 21 B2 43 AC 21
-92 C3 30 01 18 42 08 18 D2 B3 00 02 04 20 38 E3
-18 53 82 48 08 18 B2 40 81 00 00 05 A2 42 06 05
-B2 40 00 49 08 05 F2 D0 03 00 0A 02 92 C3 00 05
-92 D3 1A 05 3D 40 0E D4 18 42 08 18 38 90 0A 00
-38 27 38 90 16 00 35 2F 28 93 0B 23 F3 26 FE D2
-84 12 90 D1 5C DA 08 DB 10 DA 5C DB D6 D9 90 DA
-DA D6 00 00 CC D9 7C DA 2E DA 6C DA EA D7 00 00
-00 00 6E DB BC D1 96 D2 85 48 49 32 4C 4F 87 12
-AC C7 28 D0 EC CB F8 CE BE D1 10 D4 2A C4 04 D3
-04 43 4F 44 45 00 B0 12 0A CE A2 82 C4 21 87 12
-38 CF BC C5 48 D4 00 00 07 45 4E 44 43 4F 44 45
-87 12 CC D1 58 CE 2A C4 8E D0 03 41 53 4D 92 42
-C8 21 B8 21 B2 40 14 D4 C8 21 E5 3F 68 D4 06 45
-4E 44 41 53 4D 00 92 42 B8 21 C8 21 E9 3F 00 00
-05 43 4F 4C 4F 4E 1A 42 C4 21 BA 40 87 12 00 00
-A2 53 C4 21 B2 43 B6 21 30 40 CC D1 00 00 05 4C
-4F 32 48 49 1A 42 C4 21 BA 40 B0 12 00 00 BA 40
-2A C4 02 00 A2 52 C4 21 ED 3F 38 40 BE 21 39 48
-2A 48 09 5A 1A 52 C2 21 09 9A 03 24 7E 9A FC 27
-1A 83 0E 4A 2A 88 82 4A C2 21 30 4D B0 12 2A C4
-E2 C9 3A CA 72 C5 C0 C5 12 D5 0E CB C0 C5 FC CD
-34 D5 14 D5 29 4E 39 90 86 12 02 20 2E 53 30 41
-39 90 85 12 03 20 1E 4E 02 00 30 41 39 90 84 12
-01 20 2E 52 30 41 19 42 C4 21 A2 53 C4 21 89 4E
-00 00 3E 40 29 00 12 12 C2 21 92 53 C2 21 B0 12
-2A C4 E2 C9 0E CB C0 C5 66 D5 5C D5 21 53 3E 90
-10 00 BB 2D 30 41 68 D5 B2 41 C2 21 22 D3 30 41
-87 12 4C C6 DA D4 78 D5 82 43 BC 21 92 42 C4 21
-BA 21 A2 53 C4 21 0A 4E 3E 4F FA 90 23 00 00 00
-34 20 92 53 C2 21 B0 12 FC D4 0E 93 04 20 B2 40
-00 03 BC 21 27 3C 1E 93 04 20 B2 40 10 03 BC 21
-21 3C 2E 93 04 20 B2 40 20 03 BC 21 1B 3C 2E 92
-04 20 B2 40 20 02 BC 21 15 3C 3E 92 04 20 B2 40
-30 02 BC 21 0F 3C 3E 93 04 20 B2 40 30 03 BC 21
-09 3C B2 40 30 00 BC 21 19 42 C4 21 A2 53 C4 21
-89 4E 00 00 3E 4F 3D 41 30 4D FA 90 26 00 00 00
-08 20 B2 40 10 02 BC 21 92 53 C2 21 30 12 E8 D5
-75 3F FA 90 40 00 00 00 1A 20 B2 40 20 00 BC 21
-92 53 C2 21 B0 12 46 D5 0E 20 B2 50 10 00 BC 21
-3E 40 2B 00 B0 12 46 D5 32 24 92 92 BE 21 C2 21
-02 24 92 53 C2 21 8E 10 82 5E BC 21 D3 3F B0 12
-46 D5 F9 23 B2 50 10 00 BC 21 3E 40 28 00 B0 12
-FC D4 30 12 38 D6 67 3F 87 12 4C C6 DA D4 70 D6
-FE 90 26 00 00 00 3E 40 20 00 04 20 B2 50 82 00
-BC 21 C2 3F B0 12 46 D5 DF 23 B2 50 80 00 BC 21
-3E 40 28 00 B0 12 FC D4 B0 12 36 D5 D5 23 3D 40
-FC CD 30 4D 6C C8 04 52 45 54 49 00 87 12 34 C4
-00 13 EC CB 2A C4 34 C4 2C 00 70 D5 68 D6 C0 D6
-2E 4E 1E D2 BC 21 19 42 BA 21 92 3F BE D4 03 4D
-4F 56 84 12 B6 D6 00 40 CE D6 05 4D 4F 56 2E 42
-84 12 B6 D6 40 40 00 00 03 41 44 44 84 12 B6 D6
-00 50 E8 D6 05 41 44 44 2E 42 84 12 B6 D6 40 50
-F4 D6 04 41 44 44 43 00 84 12 B6 D6 00 60 02 D7
-06 41 44 44 43 2E 42 00 84 12 B6 D6 40 60 A6 D6
-04 53 55 42 43 00 84 12 B6 D6 00 70 20 D7 06 53
-55 42 43 2E 42 00 84 12 B6 D6 40 70 2E D7 03 53
-55 42 84 12 B6 D6 00 80 3E D7 05 53 55 42 2E 42
-84 12 B6 D6 40 80 A0 D4 03 43 4D 50 84 12 B6 D6
-00 90 58 D7 05 43 4D 50 2E 42 84 12 B6 D6 40 90
-8E D4 04 44 41 44 44 00 84 12 B6 D6 00 A0 72 D7
-06 44 41 44 44 2E 42 00 84 12 B6 D6 40 A0 64 D7
-03 42 49 54 84 12 B6 D6 00 B0 90 D7 05 42 49 54
-2E 42 84 12 B6 D6 40 B0 9C D7 03 42 49 43 84 12
-B6 D6 00 C0 AA D7 05 42 49 43 2E 42 84 12 B6 D6
-40 C0 B6 D7 03 42 49 53 84 12 B6 D6 00 D0 C4 D7
-05 42 49 53 2E 42 84 12 B6 D6 40 D0 00 00 03 58
-4F 52 84 12 B6 D6 00 E0 DE D7 05 58 4F 52 2E 42
-84 12 B6 D6 40 E0 10 D7 03 41 4E 44 84 12 B6 D6
-00 F0 F8 D7 05 41 4E 44 2E 42 84 12 B6 D6 40 F0
-4C C6 70 D5 16 D8 1A 42 BC 21 B2 F0 70 00 BC 21
-8A 10 3A F0 0F 00 82 DA BC 21 4A 3F 4A D7 03 52
-52 43 84 12 10 D8 00 10 2E D8 05 52 52 43 2E 42
-84 12 10 D8 40 10 3A D8 04 53 57 50 42 00 84 12
-10 D8 80 10 48 D8 03 52 52 41 84 12 10 D8 00 11
-56 D8 05 52 52 41 2E 42 84 12 10 D8 40 11 62 D8
-03 53 58 54 84 12 10 D8 80 11 00 00 04 50 55 53
-48 00 84 12 10 D8 00 12 7C D8 06 50 55 53 48 2E
-42 00 84 12 10 D8 40 12 D0 D7 04 43 41 4C 4C 00
-84 12 10 D8 80 12 34 C4 2C 00 70 D5 68 D6 B0 D8
-59 42 BC 21 5A 42 BD 21 82 4A BC 21 BE 90 00 15
-00 00 02 20 0A 89 02 3C 09 8A 0A 49 3A 90 10 00
-03 2C 5A 0E A8 3F 1A 53 0E 4A 87 12 98 C7 88 C9
-0D 6F 75 74 20 6F 66 20 62 6F 75 6E 64 73 6A CD
-8A D8 05 50 55 53 48 4D 84 12 A6 D8 00 15 F2 D8
-04 50 4F 50 4D 00 84 12 A6 D8 00 17 4C C6 DA D4
-12 D9 82 43 BC 21 92 42 C4 21 BA 21 A2 53 C4 21
-92 53 C2 21 3E 40 2C 00 B0 12 2A C4 E2 C9 0E CB
-C0 C5 FC CD 68 D6 38 D9 0A 4E 3E 4F 1A 83 2A 92
-CA 2F 8A 10 5A 06 6F 3F 70 D8 04 52 52 43 4D 00
-84 12 0C D9 50 00 4A D9 04 52 52 41 4D 00 84 12
-0C D9 50 01 58 D9 04 52 4C 41 4D 00 84 12 0C D9
-50 02 66 D9 04 52 52 55 4D 00 84 12 0C D9 50 03
-85 12 00 3C 74 D9 03 53 3E 3D 85 12 00 38 86 D9
-02 53 3C 00 85 12 00 34 00 D9 03 30 3E 3D 85 12
-00 30 9A D9 02 30 3C 00 85 12 00 30 00 00 02 55
-3C 00 85 12 00 2C AE D9 03 55 3E 3D 85 12 00 28
-A4 D9 03 30 3C 3E 85 12 00 24 C2 D9 02 30 3D 00
-85 12 00 20 78 C8 02 49 46 00 1A 42 C4 21 8A 4E
-00 00 A2 53 C4 21 0E 4A 30 4D B8 D9 04 54 48 45
-4E 00 1A 42 C4 21 08 4E 3E 4F 09 48 29 53 0A 89
-0A 11 3A 90 00 02 68 2F 88 DA 00 00 30 4D 80 D7
-04 45 4C 53 45 00 1A 42 C4 21 BA 40 00 3C 00 00
-A2 53 C4 21 2F 83 8F 4A 00 00 E3 3F EC D9 05 55
-4E 54 49 4C 3A 4F 08 4E 3E 4F 19 42 C4 21 2A 83
-0A 89 0A 11 3A 90 00 FE 47 3B 3A F0 FF 03 08 DA
-89 48 00 00 A2 53 C4 21 30 4D 04 D8 05 41 47 41
-49 4E 87 12 80 D9 34 DA 2A C4 00 00 05 57 48 49
-4C 45 87 12 DA D9 6E C4 2A C4 90 D9 06 52 45 50
-45 41 54 00 87 12 80 D9 34 DA F2 D9 2A C4 00 00
-03 4A 4D 50 87 12 EE CD 80 D9 34 DA 2A C4 3E B0
-00 10 03 20 3E E0 00 04 30 4D 3E 90 00 34 06 28
-03 24 3E 40 00 34 30 4D 3E 40 00 38 30 4D 00 00
-04 3F 4A 4D 50 00 87 12 9E DA EE CD 6E C4 34 DA
-2A C4 D4 DA 3D 41 08 4E 3E 4F 2A 48 0A 93 04 20
-98 42 C4 21 00 00 30 4D 88 43 00 00 A4 3F 9A D8
-03 42 57 31 84 12 D2 DA 00 00 F0 DA 03 42 57 32
-84 12 D2 DA 00 00 FC DA 03 42 57 33 84 12 D2 DA
-00 00 14 DB 3D 41 1A 42 C4 21 28 4E 08 93 08 20
-BA 4F 00 00 A2 53 C4 21 8E 4A 00 00 3E 4F 30 4D
-8E 43 00 00 61 3F 00 00 03 46 57 31 84 12 12 DB
-00 00 38 DB 03 46 57 32 84 12 12 DB 00 00 44 DB
-03 46 57 33 84 12 12 DB 00 00 50 DB 04 47 4F 54
-4F 00 87 12 80 D9 EE CD E2 CB 2A C4 C0 DA 05 3F
-47 4F 54 4F 87 12 9E DA EE CD E2 CB 2A C4
-@FFE2
-10 D3 10 D3 10 D3 10 D3 10 D3 86 C8 10 D3 10 D3
-10 D3 10 D3 10 D3 10 D3 10 D3 10 D3 10 D3
-q
@1800
-10 00 92 C8 80 3E 00 24 FD FF 18 00 A0 DB 56 D4
-52 C8 64 C8 00 00 00 00
+10 00 BA C8 80 3E 00 24 05 00 18 00 FE DC B6 D5
+7A C8 8C C8 00 00 00 00
@21AA
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 C4
03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
44 55 50 00 0E 93 F6 23 30 4D 40 C4 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 C4 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E C4 02 3E 52 00 0E 12 3E 4F 30 4D 8E C4
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 C4
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C C4 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 20 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 C4 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 C5
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 C4 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA C4 03 41 4E 44 3E FF 30 4D 7A C4 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E C5 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 C5 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E C5 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 C5 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 C4 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
+50 00 3E 4F 30 4D 00 00 03 4E 49 50 2F 53 30 4D
+00 00 04 53 57 41 50 00 2A 4F 8F 4E 00 00 0E 4A
+30 4D 68 C4 04 4F 56 45 52 00 8F 4E FE FF 2E 4F
+2F 83 30 4D 72 C4 03 52 4F 54 2A 4F 8F 4E 00 00
+1E 4F 02 00 8F 4A 02 00 30 4D 4E C4 02 3E 52 00
+0E 12 3E 4F 30 4D 96 C4 02 52 3E 00 2F 83 8F 4E
+00 00 3E 41 30 4D B8 C4 02 52 40 00 2F 83 8F 4E
+00 00 2E 41 30 4D 5C C4 05 44 45 50 54 48 8F 4E
+FE FF 3E 40 80 20 0E 8F 2F 83 0E 11 30 4D 00 00
+01 40 2E 4E 30 4D F0 C4 01 21 BE 4F 00 00 3E 4F
+30 4D 00 00 02 43 40 00 6E 4E 30 4D 04 C5 02 43
+21 00 FE 4F 00 00 1F 53 3E 4F 30 4D 00 00 01 2B
+3E 5F 30 4D 30 C4 01 2D 3E 8F 3E E3 1E 53 30 4D
+F8 C4 03 41 4E 44 3E FF 30 4D 84 C4 02 4F 52 00
+3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D 3C C5
+06 4E 45 47 41 54 45 00 E8 3F 32 C5 03 41 42 53
+0E 93 E3 33 30 4D D8 C4 04 44 41 42 53 00 3E F3
+06 34 BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D
+00 00 02 30 3D 00 1E 83 0E 7E 30 4D 82 C5 02 30
+3C 00 0E 5E 0E 7E 3E E3 30 4D 8E C5 02 30 3E 00
+1E 93 05 34 0B 3C 00 00 01 3D 3E 8F 07 20 3E 43
+30 4D A8 C5 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
+AC C4 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE C5 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 C5 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 C5 03 3E 49 4E 85 12 C2 21 10 C5
-04 42 41 53 45 00 85 12 DA 21 C0 C4 05 53 54 41
-54 45 85 12 B6 21 30 C6 02 42 4C 00 85 12 20 00
-F4 C5 03 55 4D 2A 2C 4F 0A 43 08 43 0B 43 19 43
-0E B9 02 24 08 5C 0B 6A 0C 5C 0A 6A 09 59 F8 2B
-8F 48 00 00 0E 4B 30 4D 94 C5 02 3C 23 00 B2 40
-AA 21 AA 21 30 4D 1E 15 0E 43 3D 40 20 00 0A 93
-04 20 0D 11 0A 4C 0C 43 09 43 0E 9B 01 28 0E 8B
-09 69 08 68 1D 83 07 30 0C 5C 0A 6A 0E 6E F5 2B
-0E 8B 12 D3 F5 3F 0A 4E 1D 17 30 41 48 C6 01 23
-1B 42 DA 21 2C 4F 0A 4E B0 12 86 C6 8F 49 00 00
-0E 48 7A 90 0A 00 02 28 3A 50 07 00 3A 50 30 00
-92 83 AA 21 18 42 AA 21 C8 4A 00 00 30 4D BE C6
-02 23 53 00 87 12 C0 C6 FA C6 2D 83 09 93 E0 23
-0E 93 DE 23 3D 41 30 4D F0 C6 02 23 3E 00 9F 42
-AA 21 00 00 3E 40 AA 21 2E 8F 30 4D 00 C6 04 48
-4F 4C 44 00 0A 4E 3E 4F DB 3F 3C C6 04 53 49 47
-4E 00 0E 93 3E 4F 3A 40 2D 00 D2 33 30 4D 52 C6
-03 55 44 2E 87 12 7E C6 F4 C6 0E C7 78 C9 40 C9
-2A C4 40 C7 02 55 2E 00 2F 83 8F 4E 00 00 0E 43
-F1 3F 3E B0 00 80 06 24 BF E3 00 00 3E E3 9F 53
-00 00 0E 63 30 4D DA C4 02 44 2E 00 87 12 7E C6
-6E C4 80 C4 62 C7 F4 C6 92 C4 32 C7 0E C7 78 C9
-40 C9 2A C4 52 C5 01 2E 3E B0 00 80 DD 27 2F 83
-3E 43 EC 3F 1E C7 04 48 45 52 45 00 2F 83 8F 4E
-00 00 1E 42 C4 21 30 4D 62 C5 05 41 4C 4C 4F 54
-82 5E C4 21 3E 4F 30 4D 0A C7 02 43 2C 00 1A 42
-C4 21 CA 4E 00 00 92 53 C4 21 3E 4F 30 4D 2F 83
-8F 4E 00 00 B0 12 52 C8 92 B3 1C 05 FD 27 1E 42
-0C 05 B0 12 64 C8 30 4D 30 40 DE C7 A6 C7 05 28
-4B 45 59 29 18 42 0C 05 EA 3F 12 C6 03 4B 45 59
-30 40 04 C8 BA C7 06 41 43 43 45 50 54 00 3C 40
-D0 C8 3B 40 9A C8 2D 15 0A 4E 2E 4F 0A 5E 3B 40
-0D 00 3C 40 20 00 3D 40 C4 C8 92 B3 1C 05 05 24
-18 42 0C 05 38 90 0A 00 04 20 21 53 39 40 7E C8
-4D 15 B2 40 11 00 0E 05 A2 B3 1C 05 FD 27 F2 C2
-03 02 30 41 B2 40 13 00 0E 05 A2 B3 1C 05 FD 27
-F2 D2 03 02 30 41 00 00 05 53 4C 45 45 50 30 40
-8C C8 00 00 07 28 53 4C 45 45 50 29 12 D2 0A 18
-F6 3F 21 52 3A 17 58 42 0C 05 48 9B E3 27 48 9C
-06 2C 78 92 11 20 2E 9F 0F 24 1E 83 05 3C 0E 9A
-03 24 CE 48 00 00 1E 53 82 48 0E 05 A2 B3 1C 05
-FD 27 30 4D C6 C8 2D 83 92 B3 1C 05 FD 27 E3 23
-B2 40 18 00 0A 18 3E 8F 3D 41 30 4D FE C7 06 28
-45 4D 49 54 29 00 08 4E 3E 4F E6 3F 78 C7 04 45
-4D 49 54 00 30 40 E6 C8 EE C8 04 45 43 48 4F 00
-B2 40 82 48 B8 C8 30 4D 96 C7 06 4E 4F 45 43 48
-4F 00 B2 40 30 4D B8 C8 30 4D DE C8 04 28 43 52
-29 00 2F 83 8F 4E 00 00 3E 40 0D 00 E3 3F CA C7
-02 43 52 00 30 40 22 C9 2C C7 05 53 50 41 43 45
-2F 83 8F 4E 00 00 3E 40 20 00 D4 3F 3A C9 06 53
-50 41 43 45 53 00 0E 93 09 24 0D 12 3D 40 62 C9
-EF 3F 64 C9 2D 83 1E 83 EB 23 3D 41 3E 4F 30 4D
-54 C7 04 54 59 50 45 00 0E 93 95 24 2A 4F 8F 5E
-00 00 0E 4A 87 12 CA C5 02 C6 0A C5 F4 C8 EC C5
-88 C9 2A C4 2F 82 8F 4E 02 00 7E 4D 8F 4D 00 00
-0D 5E 1D B3 0D 63 30 4D 4E C9 82 53 22 00 87 12
-34 C4 94 C9 F8 CB 34 C4 22 00 EE C9 BE C9 3D 41
-6E 4E 1E 83 82 5E C4 21 3E 4F 92 B3 C4 21 A2 63
-C4 21 30 4D 0A C9 82 2E 22 00 87 12 AE C9 34 C4
-78 C9 F8 CB 2A C4 00 00 04 57 4F 52 44 00 3C 40
-BE 21 39 4C 3A 4C 09 5A 3A 5C 28 4C 09 9A 19 24
-7E 9A FC 27 1A 83 3B 40 60 00 C8 4C 00 00 09 9A
-0C 24 7C 4A 4E 9C 09 24 18 53 4B 9C F6 2F 7C 90
-7B 00 F3 2F 7C 80 20 00 F0 3F 1A 82 C0 21 82 4A
-C2 21 1E 42 C4 21 08 8E CE 48 00 00 30 4D 00 00
-04 46 49 4E 44 00 2F 83 0C 4E 65 4C 74 40 80 00
-3B 40 CA 21 3E 4B 0E 93 1E 24 58 4C 01 00 78 F0
-1E 00 0E 58 2E 53 1E 4E FE FF 0E 93 F3 27 09 4E
-78 49 48 C4 48 95 F7 23 0A 4C 1A 53 FA 99 00 00
-F2 23 58 83 FA 23 19 B3 09 63 0C 49 6A 4E 1E 43
-4A 93 01 30 2E 83 8F 4C 00 00 35 40 08 C4 34 40
-14 C4 30 4D 2F 53 2F 53 3E 4F 30 4D 26 C6 07 3E
-4E 55 4D 42 45 52 2C 4F 6C 4C 7C 80 30 00 7C 90
-0A 00 02 28 7C 80 07 00 1C 92 DA 21 25 2C 2E 15
-2F 83 9F 4F 04 00 00 00 1E 42 DA 21 3D 40 E4 CA
-30 40 56 C6 E6 CA 2F 12 9F 4F 06 00 00 00 1E 42
-DA 21 3D 40 FA CA 30 40 56 C6 FC CA 3E 51 BF 51
-00 00 0E 63 AF 4F 06 00 8F 4E 04 00 1D 17 2F 53
-9F 53 00 00 1E 83 CF 23 30 4D 03 12 0D 12 12 12
-DA 21 32 C0 00 02 6D 4E 0D 5E 0C 4E 7A 40 2E 00
-0D 9C 0A 28 7A 9C FC 23 32 D0 00 02 FC 4C FE FF
-0D 9C FC 2F DE 83 00 00 3D 40 A6 CB 3F 82 8F 4E
-06 00 8F 43 04 00 8F 43 02 00 0A 4E 7E 4A 8F 4A
-00 00 79 4A 79 90 2D 00 17 2C 79 80 24 00 04 20
-B2 40 10 00 DA 21 0A 3C 59 83 03 20 A2 43 DA 21
-05 3C 69 53 98 23 B2 40 0A 00 DA 21 8F 4A 00 00
-1E 83 79 4A 79 90 2D 00 8E 23 B1 43 04 00 8F 4A
-00 00 1E 83 88 3F A8 CB 2F 53 0E 93 2C 17 82 4C
-DA 21 03 24 2F 52 0E F3 30 4D 9F 4F 02 00 04 00
-BF 4F 00 00 3E E3 09 20 3E E3 BF E3 02 00 BF E3
-00 00 9F 53 02 00 8F 63 00 00 32 B0 00 02 01 20
-2F 53 30 4D FA C8 07 45 58 45 43 55 54 45 0A 4E
-3E 4F 00 4A 28 C5 01 2C 1A 42 C4 21 A2 53 C4 21
-8A 4E 00 00 3E 4F 30 4D F6 CB 87 4C 49 54 45 52
-41 4C 82 93 B6 21 16 24 32 B0 00 02 09 24 1A 42
-C4 21 A2 52 C4 21 BA 40 34 C4 00 00 BA 4F 02 00
+0E 93 3E 4F FB 27 2D 53 30 4D 1E 83 0E 7E F9 3F
+39 40 00 80 39 8F 08 4E 3E 4F 08 59 19 15 30 4D
+81 5E 00 00 3E 4F 32 B0 00 01 E8 27 2D 53 21 52
+30 4D 91 53 00 00 F7 3F CE C5 06 55 4E 4C 4F 4F
+50 00 F5 3F 00 00 01 49 2F 83 8F 4E 00 00 2E 41
+1E 81 02 00 30 4D 1E C5 01 4A 2F 83 8F 4E 00 00
+1E 41 04 00 1E 81 06 00 30 4D 9C C5 03 50 41 44
+85 12 E2 20 1A C6 03 54 49 42 85 12 38 21 0E C5
+03 43 50 4C 85 12 50 00 C2 C5 03 3E 49 4E 85 12
+C2 21 60 C6 04 42 41 53 45 00 85 12 DA 21 C8 C4
+05 53 54 41 54 45 85 12 B6 21 74 C6 02 42 4C 00
+85 12 20 00 56 C6 03 55 4D 2A 2C 4F 0A 43 08 43
+0B 43 19 43 0E B9 02 24 08 5C 0B 6A 0C 5C 0A 6A
+09 59 F8 2B 8F 48 00 00 0E 4B 30 4D B4 C5 02 3C
+23 00 B2 40 AA 21 AA 21 30 4D 8C C6 01 23 2C 4F
+5B 42 DA 21 0A 43 34 40 20 00 0E 93 04 20 04 11
+0E 4C 0C 43 09 43 0A 9B 01 28 0A 8B 09 69 08 68
+14 83 07 30 0C 5C 0E 6E 0A 6A F5 2B 0A 8B 12 D3
+F5 3F 34 40 14 C4 8F 49 00 00 0E 48 7A 90 0A 00
+02 28 3A 50 07 00 3A 50 30 00 92 83 AA 21 18 42
+AA 21 C8 4A 00 00 30 4D CC C6 02 23 53 00 87 12
+CE C6 34 C7 2D 83 09 93 CA 23 0E 93 C8 23 3D 41
+30 4D 2A C7 02 23 3E 00 9F 42 AA 21 00 00 3E 40
+AA 21 2E 8F 30 4D 26 C6 04 48 4F 4C 44 00 0A 4E
+3E 4F DB 3F 80 C6 04 53 49 47 4E 00 0E 93 3E 4F
+3A 40 2D 00 D2 33 30 4D 96 C6 02 55 2E 00 87 12
+C2 C6 34 C4 00 00 2E C7 48 C7 A0 C9 68 C9 2A C4
+68 C5 02 44 2E 00 87 12 C2 C6 78 C4 8A C4 6E C5
+2E C7 9A C4 6C C7 48 C7 A0 C9 68 C9 2A C4 50 C5
+01 2E 0E 93 E4 37 2F 83 8F 4E 00 00 3E 43 EB 3F
+58 C7 04 48 45 52 45 00 2F 83 8F 4E 00 00 1E 42
+C4 21 30 4D 5C C5 05 41 4C 4C 4F 54 82 5E C4 21
+3E 4F 30 4D 44 C7 02 43 2C 00 1A 42 C4 21 CA 4E
+00 00 92 53 C4 21 3E 4F 30 4D 2F 83 8F 4E 00 00
+B0 12 7A C8 92 B3 1C 05 FD 27 1E 42 0C 05 B0 12
+8C C8 30 4D C2 C7 05 28 4B 45 59 29 18 42 0C 05
+EC 3F 38 C6 03 4B 45 59 30 40 1C C8 D6 C7 06 41
+43 43 45 50 54 00 30 40 46 C8 16 C8 08 28 41 43
+43 45 50 54 29 00 3C 40 F8 C8 3B 40 C2 C8 2D 15
+0A 4E 2E 4F 0A 5E 3B 40 0D 00 3C 40 20 00 3D 40
+EC C8 92 B3 1C 05 05 24 18 42 0C 05 38 90 0A 00
+04 20 21 53 39 40 A6 C8 4D 15 B2 40 11 00 0E 05
+F2 C2 03 02 A2 B3 1C 05 FD 27 30 41 B2 40 13 00
+0E 05 F2 D2 03 02 A2 B3 1C 05 FD 27 30 41 00 00
+05 53 4C 45 45 50 30 40 B4 C8 00 00 07 28 53 4C
+45 45 50 29 12 D2 0A 18 F6 3F 21 52 3A 17 58 42
+0C 05 48 9B E3 27 48 9C 06 2C 78 92 11 20 2E 9F
+0F 24 1E 83 05 3C 0E 9A 03 24 CE 48 00 00 1E 53
+82 48 0E 05 A2 B3 1C 05 FD 27 30 4D EE C8 2D 83
+92 B3 1C 05 FD 27 E3 23 B2 40 18 00 0A 18 3E 8F
+3D 41 30 4D 3C C8 06 28 45 4D 49 54 29 00 08 4E
+3E 4F E6 3F 92 C7 04 45 4D 49 54 00 30 40 0E C9
+16 C9 04 45 43 48 4F 00 B2 40 82 48 E0 C8 30 4D
+B0 C7 06 4E 4F 45 43 48 4F 00 B2 40 30 4D E0 C8
+30 4D 06 C9 04 28 43 52 29 00 2F 83 8F 4E 00 00
+3E 40 0D 00 E3 3F E6 C7 02 43 52 00 30 40 4A C9
+66 C7 05 53 50 41 43 45 2F 83 8F 4E 00 00 3E 40
+20 00 D4 3F 62 C9 06 53 50 41 43 45 53 00 0E 93
+09 24 0D 12 3D 40 8A C9 EF 3F 8C C9 2D 83 1E 83
+EB 23 3D 41 3E 4F 30 4D 7A C7 04 54 59 50 45 00
+0E 93 95 24 2A 4F 8F 5E 00 00 0E 4A 87 12 F0 C5
+28 C6 08 C5 1C C9 12 C6 B0 C9 2A C4 2F 82 8F 4E
+02 00 7E 4D 8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D
+76 C9 82 53 22 00 87 12 34 C4 BC C9 20 CC 34 C4
+22 00 16 CA E6 C9 3D 41 6E 4E 1E 83 82 5E C4 21
+3E 4F 92 B3 C4 21 A2 63 C4 21 30 4D 32 C9 82 2E
+22 00 87 12 D6 C9 34 C4 A0 C9 20 CC 2A C4 00 00
+04 57 4F 52 44 00 3C 40 BE 21 39 4C 3A 4C 09 5A
+3A 5C 28 4C 09 9A 19 24 7E 9A FC 27 1A 83 3B 40
+60 00 C8 4C 00 00 09 9A 0C 24 7C 4A 4E 9C 09 24
+18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F 7C 80 20 00
+F0 3F 1A 82 C0 21 82 4A C2 21 1E 42 C4 21 08 8E
+CE 48 00 00 30 4D 00 00 04 46 49 4E 44 00 2F 83
+0C 4E 65 4C 74 40 80 00 3B 40 CA 21 3E 4B 0E 93
+1E 24 58 4C 01 00 78 F0 1E 00 0E 58 2E 53 1E 4E
+FE FF 0E 93 F3 27 09 4E 78 49 48 C4 48 95 F7 23
+0A 4C 1A 53 FA 99 00 00 F2 23 58 83 FA 23 19 B3
+09 63 0C 49 6A 4E 1E 43 4A 93 01 30 2E 83 8F 4C
+00 00 35 40 08 C4 34 40 14 C4 30 4D 2F 53 2F 53
+3E 4F 30 4D 6A C6 07 3E 4E 55 4D 42 45 52 2C 4F
+6C 4C 7C 80 30 00 7C 90 0A 00 02 28 7C 80 07 00
+1C 92 DA 21 25 2C 2E 15 2F 83 9F 4F 04 00 00 00
+1E 42 DA 21 3D 40 0C CB 30 40 9A C6 0E CB 2F 12
+9F 4F 06 00 00 00 1E 42 DA 21 3D 40 22 CB 30 40
+9A C6 24 CB 3E 51 BF 51 00 00 0E 63 AF 4F 06 00
+8F 4E 04 00 1D 17 2F 53 9F 53 00 00 1E 83 CF 23
+30 4D 03 12 0D 12 12 12 DA 21 32 C0 00 02 6D 4E
+0D 5E 0C 4E 7A 40 2E 00 0D 9C 0A 28 7A 9C FC 23
+32 D0 00 02 FC 4C FE FF 0D 9C FC 2F DE 83 00 00
+3D 40 CE CB 3F 82 8F 4E 06 00 8F 43 04 00 8F 43
+02 00 0A 4E 7E 4A 8F 4A 00 00 79 4A 79 90 2D 00
+17 2C 79 80 24 00 04 20 B2 40 10 00 DA 21 0A 3C
+59 83 03 20 A2 43 DA 21 05 3C 69 53 98 23 B2 40
+0A 00 DA 21 8F 4A 00 00 1E 83 79 4A 79 90 2D 00
+8E 23 B1 43 04 00 8F 4A 00 00 1E 83 88 3F D0 CB
+2F 53 0E 93 2C 17 82 4C DA 21 03 24 2F 52 0E F3
+30 4D 9F 4F 02 00 04 00 BF 4F 00 00 3E E3 09 20
+3E E3 BF E3 02 00 BF E3 00 00 9F 53 02 00 8F 63
+00 00 32 B0 00 02 01 20 2F 53 30 4D 22 C9 07 45
+58 45 43 55 54 45 0A 4E 3E 4F 00 4A 26 C5 01 2C
+1A 42 C4 21 A2 53 C4 21 8A 4E 00 00 3E 4F 30 4D
+1E CC 87 4C 49 54 45 52 41 4C 82 93 B6 21 0F 24
1A 42 C4 21 A2 52 C4 21 BA 40 34 C4 00 00 8A 4E
-02 00 3E 4F 30 4D 30 C9 05 43 4F 55 4E 54 2F 83
-1E 53 8F 4E 00 00 5E 4E FF FF 30 4D 82 4E BE 21
-B2 4F C0 21 3E 4F 82 43 C2 21 87 12 4C C6 EE C9
-72 CC 3D 40 7E CC E7 22 3D 41 3E 4F 30 4D 80 CC
-0A 4E 3E 4F 3D 40 96 CC 48 27 3D 40 6C CC 1A E2
-B6 21 B2 27 AC 23 98 CC 3E 4F 3D 40 6C CC B9 23
-DE 53 00 00 68 4E 08 5E F8 40 3F 00 00 00 3D 40
-62 CE CD 3F E6 CB 08 45 56 41 4C 55 41 54 45 00
-39 40 BE 21 39 12 39 12 39 12 0D 12 B0 12 2A C4
-5C CC D4 CC 3D 41 B2 41 C2 21 B2 41 C0 21 B2 41
-BE 21 30 4D 7A C5 04 51 55 49 54 00 31 40 E0 20
-B2 40 00 20 00 20 82 43 B6 21 82 43 08 18 B0 12
-2A C4 94 C9 04 0D 6F 6B 20 00 78 C9 34 C4 38 21
-44 C4 34 C4 50 00 1E C8 40 C9 5C CC 34 C4 7E 20
-CE C4 B2 C5 94 C9 0D 73 74 61 63 6B 20 65 6D 70
-74 79 20 21 70 CD 34 C4 30 FF AC C7 B2 C5 94 C9
-0B 46 52 41 4D 20 66 75 6C 6C 20 21 70 CD 42 C6
-F4 C4 C0 C5 02 CD 94 C9 04 0D 20 20 20 00 BC C5
-0A CD 16 C8 05 41 42 4F 52 54 3F 40 80 20 BE 3F
-8F 93 02 00 97 26 B2 40 82 48 B8 C8 B0 12 62 D2
-82 43 1A DB 82 43 26 DB 82 43 32 DB 82 43 62 DB
-82 43 6E DB 82 43 7A DB A2 B3 1C 05 FD 27 B2 40
-11 00 0E 05 F2 C2 03 02 92 C3 1C 05 38 40 A0 AA
-39 42 19 83 FE 23 18 83 FB 23 92 B3 1C 05 F4 23
-87 12 94 C9 04 1B 5B 37 6D 00 78 C9 78 C9 94 C9
-04 1B 5B 30 6D 00 78 C9 A4 D1 E6 D1 EC D1 6A CD
-64 CD 86 41 42 4F 52 54 22 00 87 12 AE C9 34 C4
-70 CD F8 CB 2A C4 40 CA 01 27 87 12 4C C6 EE C9
-46 CA C0 C5 08 CE 2A C4 A0 CC 7A C6 81 5C 92 42
-BE 21 C2 21 30 4D 87 12 CA C9 4C C6 EE C9 20 CE
-08 4E 7A 4E 5A D3 5A 53 0A 58 19 42 C8 21 6E 4E
-3E F0 1E 00 09 5E 82 48 AE 21 82 49 B0 21 82 4A
-B2 21 2A 52 82 4A C4 21 3E 4F 3D 41 30 41 87 12
-94 C9 0F 73 74 61 63 6B 20 6D 69 73 6D 61 74 63
-68 21 76 CD 82 9F B4 21 F2 23 18 42 AE 21 19 42
-B0 21 A8 49 FE FF 89 48 00 00 30 4D E8 C9 08 56
-41 52 49 41 42 4C 45 00 B0 12 16 CE BA 40 86 12
-FC FF EF 3F 48 CC 08 43 4F 4E 53 54 41 4E 54 00
-B0 12 16 CE BA 40 85 12 FC FF 8A 4E FE FF 3E 4F
-E0 3F 96 CE 06 43 52 45 41 54 45 00 B0 12 16 CE
-BA 40 85 12 FC FF 8A 4A FE FF D3 3F B6 CC 05 44
-4F 45 53 3E 1A 42 B2 21 BA 40 84 12 00 00 8A 4D
-02 00 3D 41 30 4D CE CE 05 44 45 46 45 52 B0 12
-16 CE BA 40 30 40 FC FF BA 40 E4 CE FE FF B9 3F
-00 00 81 5B 82 43 B6 21 30 4D 0C CE 01 5D B2 43
-B6 21 30 4D AA C9 87 52 45 43 55 52 53 45 19 42
-C4 21 99 42 B2 21 00 00 A2 53 C4 21 30 4D 02 CF
-01 3A B0 12 16 CE BA 40 87 12 FC FF A2 83 C4 21
-B2 43 B6 21 82 4F B4 21 30 4D 30 CF 81 3B 82 93
-B6 21 5D 27 87 12 34 C4 2A C4 F8 CB 64 CE 04 CF
-2A C4 1C C9 09 49 4D 4D 45 44 49 41 54 45 1A 42
-AE 21 FA D0 80 00 00 00 30 4D BE 4F 02 00 3E 4F
-30 4D 64 CF 82 49 53 00 87 12 42 C6 F4 C4 C0 C5
-9C CF A8 CF 34 C4 7A CF F8 CB 2A C4 FA CD 7A CF
-2A C4 4C CF 83 5B 27 5D 87 12 FA CD 34 C4 34 C4
-F8 CB F8 CB 2A C4 E6 CC 88 50 4F 53 54 50 4F 4E
-45 00 87 12 4C C6 EE C9 46 CA 54 C4 C0 C5 08 CE
-7E C5 C0 C5 E2 CF 34 C4 34 C4 F8 CB F8 CB 34 C4
-F8 CB F8 CB 2A C4 E8 CF 3A 4E 82 4A C6 21 2E 4E
-82 4E C4 21 3D 40 10 00 09 4A 08 49 29 83 18 48
-FE FF 0E 98 FC 2B 89 48 00 00 1D 83 F6 23 2A 4A
-0A 93 F0 23 3E 4F 3D 41 30 4D 84 CF 82 49 46 00
-2F 83 8F 4E 00 00 1E 42 C4 21 BE 40 C0 C5 00 00
-A2 52 C4 21 2E 53 30 4D E8 CE 84 45 4C 53 45 00
-1A 42 C4 21 BA 40 BC C5 00 00 2A 52 82 4A C4 21
-8E 4A 00 00 2A 83 0E 4A 30 4D 72 C9 84 54 48 45
-4E 00 9E 42 C4 21 00 00 3E 4F 30 4D B4 CE 85 42
-45 47 49 4E 30 40 AC C7 5C D0 85 55 4E 54 49 4C
-39 40 C0 C5 1A 42 C4 21 A2 52 C4 21 8A 49 00 00
-8A 4E 02 00 3E 4F 30 4D E2 CD 85 41 47 41 49 4E
-39 40 BC C5 EF 3F 7E CE 85 57 48 49 4C 45 87 12
-20 D0 6E C4 2A C4 16 CF 86 52 45 50 45 41 54 00
-87 12 A0 D0 62 D0 2A C4 3A D0 82 44 4F 00 2F 83
-8F 4E 00 00 1E 42 C4 21 BE 40 CA C5 00 00 2E 53
-82 4E C4 21 A2 53 00 20 1A 42 00 20 8A 43 00 00
-30 4D 0A CC 84 4C 4F 4F 50 00 39 40 EC C5 1A 42
-C4 21 A2 52 C4 21 8A 49 00 00 8A 4E 02 00 1E 42
-00 20 A2 83 00 20 2E 4E 0E 93 04 24 9E 42 C4 21
-00 00 F5 3F 3E 4F 30 4D 0C C8 85 2B 4C 4F 4F 50
-39 40 DA C5 E4 3F F4 D0 85 4C 45 41 56 45 1A 42
-C4 21 BA 40 FC C5 00 00 BA 40 BC C5 02 00 B2 50
-06 00 C4 21 A2 53 00 20 2A 52 19 42 00 20 89 4A
-00 00 30 4D 38 D1 04 4D 4F 56 45 00 0A 4E 38 4F
-39 4F 3E 4F 0A 93 11 24 08 99 0F 24 06 2C F8 49
-00 00 18 53 1A 83 FB 23 30 4D 08 5A 09 5A 19 83
-18 83 E8 49 00 00 1A 83 FA 23 30 4D 34 C4 CA 21
-FC C4 2A C4 84 12 9C D1 9C D4 72 D4 CA D0 F8 CD
-5A D4 2A D1 66 D1 D6 C9 0A D2 3E D2 7A D0 04 D3
-48 C5 A4 CF 0C CF AE CA 00 00 3A 40 0C 00 39 40
-CA 21 38 40 CC 21 D9 3F 3A 40 0E 00 39 40 CC 21
-38 40 CA 21 CC 3F 82 43 CC 21 30 4D 92 42 CA 21
-C8 21 30 4D B8 CF 09 50 57 52 5F 53 54 41 54 45
-84 12 E6 CF 56 D4 A0 DB F6 D1 08 50 57 52 5F 48
-45 52 45 00 92 42 C4 21 06 D2 92 42 C6 21 04 D2
-EF 3F B8 D0 09 52 53 54 5F 53 54 41 54 45 92 42
-0C 18 06 D2 92 42 0E 18 04 D2 E2 3F 24 D2 08 52
-53 54 5F 48 45 52 45 00 92 42 C4 21 0C 18 92 42
-C6 21 0E 18 DF 3F B2 40 AA D2 0C D3 B2 40 8C C8
-80 C8 B2 40 E6 C8 F6 C8 B2 40 22 C9 36 C9 B2 40
-04 C8 12 C8 30 41 A8 D0 04 57 49 50 45 00 39 40
-80 FF B9 43 00 00 29 53 39 90 E2 FF FA 23 B0 12
-56 D2 B2 40 A0 DB C4 21 B2 40 56 D4 C6 21 D4 3F
-1C D0 06 28 57 41 52 4D 29 00 1E 42 08 18 87 12
-94 C9 05 0D 1B 5B 37 6D 78 C9 98 C7 94 C9 27 20
-46 61 73 74 46 6F 72 74 68 20 56 31 36 30 20 31
+02 00 3E 4F 32 B0 00 02 32 C0 00 02 F1 23 30 4D
+58 C9 05 43 4F 55 4E 54 2F 83 1E 53 8F 4E 00 00
+5E 4E FF FF 30 4D 82 4E BE 21 B2 4F C0 21 3E 4F
+82 43 C2 21 87 12 90 C6 16 CA 8C CC 3D 40 98 CC
+EE 22 3D 41 3E 4F 30 4D 9A CC 0A 4E 3E 4F 3D 40
+B0 CC 4F 27 3D 40 86 CC 1A E2 B6 21 B9 27 B3 23
+B2 CC 3E 4F 3D 40 86 CC C0 23 DE 53 00 00 68 4E
+08 5E F8 40 3F 00 00 00 3D 40 DE CE CD 3F 0E CC
+08 45 56 41 4C 55 41 54 45 00 39 40 BE 21 3C 49
+3B 49 3A 49 3D 15 B0 12 2A C4 76 CC EE CC B2 41
+C2 21 B2 41 C0 21 B2 41 BE 21 3D 41 30 4D 4C C6
+04 51 55 49 54 00 31 40 E0 20 B2 40 00 20 00 20
+82 43 B6 21 82 43 08 18 B0 12 2A C4 BC C9 03 0D
+6F 6B A0 C9 68 C9 5A C6 44 C4 64 C6 36 C8 68 C9
+76 CC DE C4 92 C5 BC C9 0D 73 74 61 63 6B 20 65
+6D 70 74 79 21 20 80 CD 34 C4 30 FF C8 C7 D2 C5
+BC C9 0B 46 52 41 4D 20 66 75 6C 6C 21 20 80 CD
+86 C6 F2 C4 E0 C5 1C CD BC C9 03 0D 20 20 DC C5
+22 CD 2E C8 05 41 42 4F 52 54 3F 40 80 20 C3 3F
+8F 93 02 00 A3 26 B2 40 82 48 E0 C8 B0 12 92 D2
+A2 B3 1C 05 FD 27 B2 40 11 00 0E 05 F2 C2 03 02
+92 C3 1C 05 38 40 A0 AA 39 42 03 43 19 83 FD 23
+18 83 FA 23 92 B3 1C 05 F3 23 87 12 BC C9 04 1B
+5B 37 6D 00 A0 C9 A0 C9 BC C9 04 1B 5B 30 6D 00
+A0 C9 A0 D1 E2 D1 E8 D1 30 D2 7A CD 74 CD 86 41
+42 4F 52 54 22 00 87 12 D6 C9 34 C4 80 CD 20 CC
+2A C4 68 CA 01 27 87 12 90 C6 16 CA 6E CA E0 C5
+04 CE 2A C4 BA CC BE C6 81 5C 92 42 BE 21 C2 21
+30 4D 00 00 81 5B 82 43 B6 21 30 4D 08 CE 01 5D
+B2 43 B6 21 30 4D 14 CE 83 5B 27 5D 87 12 F6 CD
+34 C4 34 C4 20 CC 20 CC 2A C4 BE 4F 02 00 3E 4F
+30 4D 44 C9 82 49 53 00 87 12 86 C6 F2 C4 E0 C5
+5C CE 2C CE 34 C4 3A CE 20 CC 2A C4 F6 CD 3A CE
+2A C4 44 CE 09 49 4D 4D 45 44 49 41 54 45 1A 42
+AE 21 FA D0 80 00 00 00 30 4D D2 C9 87 52 45 43
+55 52 53 45 19 42 C4 21 99 42 B2 21 00 00 A2 53
+C4 21 30 4D 00 CD 88 50 4F 53 54 50 4F 4E 45 00
+87 12 90 C6 16 CA 6E CA 54 C4 E0 C5 04 CE 92 C5
+E0 C5 C0 CE 34 C4 34 C4 20 CC 20 CC 34 C4 20 CC
+20 CC 2A C4 82 9F B4 21 A0 24 87 12 BC C9 0F 73
+74 61 63 6B 20 6D 69 73 6D 61 74 63 68 21 86 CD
+87 12 F2 C9 90 C6 16 CA EA CE 08 4E 7A 4E 5A D3
+5A 53 0A 58 19 42 C8 21 6E 4E 3E F0 1E 00 09 5E
+82 48 AE 21 82 49 B0 21 82 4A B2 21 2A 52 82 4A
+C4 21 3E 4F 3D 41 30 41 10 CA 08 56 41 52 49 41
+42 4C 45 00 B0 12 E0 CE BA 40 86 12 FC FF 71 3C
+62 CC 08 43 4F 4E 53 54 41 4E 54 00 B0 12 E0 CE
+BA 40 85 12 FC FF 8A 4E FE FF 3E 4F 62 3C 32 CF
+06 43 52 45 41 54 45 00 B0 12 E0 CE BA 40 85 12
+FC FF 8A 4A FE FF 55 3C D0 CC 05 44 4F 45 53 3E
+1A 42 B2 21 BA 40 84 12 00 00 8A 4D 02 00 3D 41
+30 4D 6A CF 05 44 45 46 45 52 B0 12 E0 CE BA 40
+30 40 FC FF BA 40 80 CF FE FF 3B 3C 28 CE 01 3A
+B0 12 E0 CE BA 40 87 12 FC FF A2 83 C4 21 B2 43
+B6 21 82 4F B4 21 30 4D 9E CF 81 3B 82 93 B6 21
+24 27 87 12 34 C4 2A C4 20 CC C4 CE 16 CE 2A C4
+D2 CF 3D 41 B2 4E 0E 18 A2 4E 0C 18 3E 4F 32 3D
+32 CC 06 4D 41 52 4B 45 52 00 B0 12 E0 CE BA 40
+84 12 FC FF BA 40 D0 CF FE FF 9A 42 C6 21 00 00
+28 83 8A 48 02 00 A2 52 C4 21 18 42 AE 21 19 42
+B0 21 A8 49 FE FF 89 48 00 00 30 4D 64 CE 82 49
+46 00 2F 83 8F 4E 00 00 1E 42 C4 21 A2 52 C4 21
+BE 40 E0 C5 00 00 2E 53 30 4D 84 CF 84 45 4C 53
+45 00 A2 52 C4 21 1A 42 C4 21 BA 40 DC C5 FC FF
+8E 4A 00 00 2A 83 0E 4A 30 4D 9A C9 84 54 48 45
+4E 00 9E 42 C4 21 00 00 3E 4F 30 4D 50 CF 85 42
+45 47 49 4E 30 40 C8 C7 5C D0 85 55 4E 54 49 4C
+39 40 E0 C5 A2 52 C4 21 1A 42 C4 21 8A 49 FC FF
+8A 4E FE FF 3E 4F 30 4D DE CD 85 41 47 41 49 4E
+39 40 DC C5 EF 3F 1A CF 85 57 48 49 4C 45 87 12
+22 D0 78 C4 2A C4 7C CE 86 52 45 50 45 41 54 00
+87 12 A0 D0 62 D0 2A C4 3C D0 82 44 4F 00 2F 83
+8F 4E 00 00 A2 53 C4 21 1E 42 C4 21 BE 40 F0 C5
+FE FF A2 53 00 20 1A 42 00 20 8A 43 00 00 30 4D
+E2 CF 84 4C 4F 4F 50 00 39 40 12 C6 A2 52 C4 21
+1A 42 C4 21 8A 49 FC FF 8A 4E FE FF 1E 42 00 20
+A2 83 00 20 2E 4E 0E 93 03 24 8E 4A 00 00 F6 3F
+3E 4F 30 4D 24 C8 85 2B 4C 4F 4F 50 39 40 00 C6
+E5 3F F2 D0 85 4C 45 41 56 45 1A 42 C4 21 BA 40
+22 C6 00 00 BA 40 DC C5 02 00 B2 50 06 00 C4 21
+A2 53 00 20 2A 52 19 42 00 20 89 4A 00 00 30 4D
+34 D1 04 4D 4F 56 45 00 0A 4E 38 4F 39 4F 3E 4F
+0A 93 11 24 08 99 0F 24 06 2C F8 49 00 00 18 53
+1A 83 FB 23 30 4D 08 5A 09 5A 19 83 18 83 E8 49
+00 00 1A 83 FA 23 30 4D 34 C4 CA 21 FA C4 2A C4
+84 12 98 D1 FC D5 D2 D5 CA D0 F4 CD BA D5 26 D1
+62 D1 FE C9 54 D2 6E D2 7A D0 74 D4 46 C5 FA D3
+1E CE D6 CA 00 00 3A 40 0E 00 39 40 CA 21 38 40
+CC 21 D9 3F 3A 40 0E 00 39 40 CC 21 38 40 CA 21
+CC 3F 82 43 CC 21 30 4D 92 42 CA 21 C8 21 30 4D
+F2 D1 3A 4E 82 4A C6 21 2E 4E 82 4E C4 21 3D 40
+10 00 09 4A 08 49 29 83 18 48 FE FF 0E 98 FC 2B
+89 48 00 00 1D 83 F6 23 2A 4A 0A 93 F0 23 3E 4F
+3D 41 30 4D 96 CE 09 50 57 52 5F 53 54 41 54 45
+84 12 F0 D1 B6 D5 FE DC B8 D0 09 52 53 54 5F 53
+54 41 54 45 92 42 0E 18 34 D2 92 42 0C 18 36 D2
+EF 3F 26 D2 08 50 57 52 5F 48 45 52 45 00 92 42
+C6 21 34 D2 92 42 C4 21 36 D2 30 4D 3A D2 08 52
+53 54 5F 48 45 52 45 00 92 42 C6 21 0E 18 92 42
+C4 21 0C 18 EC 3F B2 40 1A D4 7C D4 B2 40 B4 C8
+A8 C8 B2 40 0E C9 1E C9 B2 40 4A C9 5E C9 B2 40
+1C C8 2A C8 82 43 78 DC 82 43 84 DC 82 43 90 DC
+82 43 C0 DC 82 43 CC DC 82 43 D8 DC 30 41 A8 D0
+04 57 49 50 45 00 39 40 80 FF B9 43 00 00 29 53
+39 90 E2 FF FA 23 B0 12 86 D2 B2 40 FE DC 0C 18
+B2 40 B6 D5 0E 18 AE 3F 6E D0 07 43 4F 4D 50 41
+52 45 0C 4E 38 4F 3B 4F 39 4F 0E 4B 0E 5C 0C 24
+1B 83 07 30 1C 83 07 30 19 53 F9 98 FF FF F5 27
+02 2C 3E 43 30 4D 1E 43 30 4D BA CF 86 5B 54 48
+45 4E 5D 00 30 4D 1E 83 30 4D 1C D3 86 5B 45 4C
+53 45 5D 00 87 12 34 C4 01 00 90 C6 16 CA 68 CC
+44 C4 E0 C5 A2 D3 8A C4 8A C4 BC C9 04 5B 49 46
+5D 00 F2 D2 EA C5 60 D3 CE CA 2C C5 DC C5 96 D3
+8A C4 8A C4 BC C9 06 5B 45 4C 53 45 5D 00 F2 D2
+EA C5 84 D3 CE CA 26 D3 44 C4 E0 C5 80 D3 2C C5
+DC C5 96 D3 BC C9 06 5B 54 48 45 4E 5D 00 F2 D2
+EA C5 96 D3 26 D3 54 C4 EA C5 9E D3 2A C4 DC C5
+3A D3 CE CA BC C9 03 0D 6B 6F A0 C9 68 C9 5A C6
+44 C4 64 C6 36 C8 B8 D3 82 43 C2 21 82 4E BE 21
+B2 4F C0 21 3E 4F 3D 40 3A D3 30 4D 2C D3 84 5B
+49 46 5D 00 0E 93 3E 4F AD 27 30 4D CE D3 8B 5B
+55 4E 44 45 46 49 4E 45 44 5D 87 12 90 C6 16 CA
+6E CA 6C C4 86 C5 2A C4 DE D3 89 5B 44 45 46 49
+4E 45 44 5D 87 12 90 C6 16 CA 6E CA 6C C4 2A C4
+1E D0 06 28 57 41 52 4D 29 00 1E 42 08 18 87 12
+BC C9 05 0D 1B 5B 37 6D A0 C9 B2 C7 BC C9 27 20
+46 61 73 74 46 6F 72 74 68 20 56 31 36 32 20 31
36 4D 48 7A 20 28 43 29 20 4A 2E 4D 2E 54 68 6F
-6F 72 65 6E 73 20 78 C9 34 C4 30 FF AC C7 2A C5
-58 C7 94 C9 0B 62 79 74 65 73 20 66 72 65 65 20
-7C CD 78 D2 04 57 41 52 4D 00 30 40 AA D2 6E D0
+6F 72 65 6E 73 20 A0 C9 34 C4 30 FF C8 C7 28 C5
+7E C7 BC C9 0B 62 79 74 65 73 20 66 72 65 65 20
+8C CD C0 D2 04 57 41 52 4D 00 30 40 1A D4 EA D2
04 43 4F 4C 44 00 B2 40 04 A5 20 01 B2 40 88 5A
CC 01 B2 D0 00 08 04 02 B2 D3 06 02 B2 43 02 02
B2 40 00 01 24 02 B2 40 FF FE 22 02 B2 D0 FF FE
26 02 B2 43 42 02 B2 D3 46 02 B2 43 62 02 B2 D3
66 02 F2 40 A5 00 A1 01 F2 40 10 00 A0 01 D2 43
A1 01 B2 40 00 A5 60 01 B2 40 29 01 80 01 B2 40
-0B 00 82 01 B2 40 E9 01 84 01 39 40 40 00 82 43
-88 01 92 D2 5E 01 08 18 A2 93 08 18 01 24 59 03
-38 40 50 C3 18 83 FE 23 19 83 FA 23 B2 40 00 06
-2A 02 3A 40 1C D3 39 40 E2 FF 89 4A 00 00 29 53
+0B 00 82 01 B2 40 E9 01 84 01 B2 40 00 06 2A 02
+82 43 88 01 92 D2 5E 01 08 18 B2 B0 2C 01 8E 01
+FC 23 3A 40 8C D4 39 40 E2 FF 89 4A 00 00 29 53
FC 23 92 42 02 18 EC FF B2 40 18 00 0A 18 31 40
-E0 20 3F 40 80 20 37 40 00 C4 36 40 B4 C4 35 40
+E0 20 3F 40 80 20 37 40 00 C4 36 40 BC C4 35 40
08 C4 34 40 14 C4 B2 40 0A 00 DA 21 B2 43 AC 21
92 C3 30 01 18 42 08 18 D2 B3 00 02 04 20 38 E3
18 53 82 48 08 18 B2 40 81 00 00 05 B2 40 11 00
06 05 B2 40 00 4A 08 05 F2 D0 03 00 0A 02 92 C3
-00 05 92 D3 1A 05 3D 40 30 D4 18 42 08 18 38 90
-0A 00 2D 27 38 90 16 00 2A 2F 28 93 00 23 E8 26
-0A D3 84 12 9C D1 7E DA 2A DB 32 DA 7E DB F8 D9
-B2 DA FC D6 00 00 EE D9 9E DA 50 DA 8E DA 0C D8
-00 00 00 00 90 DB C8 D1 A2 D2 85 48 49 32 4C 4F
-87 12 AC C7 34 D0 F8 CB 04 CF CA D1 32 D4 2A C4
-10 D3 04 43 4F 44 45 00 B0 12 16 CE A2 82 C4 21
-87 12 44 CF BC C5 6A D4 00 00 07 45 4E 44 43 4F
-44 45 87 12 D8 D1 64 CE 2A C4 9A D0 03 41 53 4D
-92 42 C8 21 B8 21 B2 40 36 D4 C8 21 E5 3F 8A D4
+00 05 92 D3 1A 05 3D 40 90 D5 18 42 08 18 38 90
+0A 00 A1 26 38 90 16 00 9E 2E 28 93 5B 22 50 26
+7A D4 84 12 98 D1 DC DB 88 DC 90 DB DC DC 56 DB
+10 DC 5A D8 00 00 4C DB FC DB AE DB EC DB 6A D9
+00 00 00 00 EE DC C4 D1 12 D4 85 48 49 32 4C 4F
+87 12 C8 C7 36 D0 20 CC 16 CE C6 D1 92 D5 2A C4
+80 D4 04 43 4F 44 45 00 B0 12 E0 CE A2 82 C4 21
+87 12 B2 CF DC C5 CA D5 00 00 07 45 4E 44 43 4F
+44 45 87 12 D4 D1 C4 CE 2A C4 9A D0 03 41 53 4D
+92 42 C8 21 B8 21 B2 40 96 D5 C8 21 E5 3F EA D5
06 45 4E 44 41 53 4D 00 92 42 B8 21 C8 21 E9 3F
00 00 05 43 4F 4C 4F 4E 1A 42 C4 21 BA 40 87 12
-00 00 A2 53 C4 21 B2 43 B6 21 30 40 D8 D1 00 00
+00 00 A2 53 C4 21 B2 43 B6 21 30 40 D4 D1 00 00
05 4C 4F 32 48 49 1A 42 C4 21 BA 40 B0 12 00 00
BA 40 2A C4 02 00 A2 52 C4 21 ED 3F 38 40 BE 21
39 48 2A 48 09 5A 1A 52 C2 21 09 9A 03 24 7E 9A
FC 27 1A 83 0E 4A 2A 88 82 4A C2 21 30 4D B0 12
-2A C4 EE C9 46 CA 72 C5 C0 C5 34 D5 1A CB C0 C5
-08 CE 56 D5 36 D5 29 4E 39 90 86 12 02 20 2E 53
-30 41 39 90 85 12 03 20 1E 4E 02 00 30 41 39 90
-84 12 01 20 2E 52 30 41 19 42 C4 21 A2 53 C4 21
-89 4E 00 00 3E 40 29 00 12 12 C2 21 92 53 C2 21
-B0 12 2A C4 EE C9 1A CB C0 C5 88 D5 7E D5 21 53
-3E 90 10 00 BB 2D 30 41 8A D5 B2 41 C2 21 22 D3
-30 41 87 12 4C C6 FC D4 9A D5 82 43 BC 21 92 42
-C4 21 BA 21 A2 53 C4 21 0A 4E 3E 4F FA 90 23 00
-00 00 34 20 92 53 C2 21 B0 12 1E D5 0E 93 04 20
-B2 40 00 03 BC 21 27 3C 1E 93 04 20 B2 40 10 03
-BC 21 21 3C 2E 93 04 20 B2 40 20 03 BC 21 1B 3C
-2E 92 04 20 B2 40 20 02 BC 21 15 3C 3E 92 04 20
-B2 40 30 02 BC 21 0F 3C 3E 93 04 20 B2 40 30 03
-BC 21 09 3C B2 40 30 00 BC 21 19 42 C4 21 A2 53
-C4 21 89 4E 00 00 3E 4F 3D 41 30 4D FA 90 26 00
-00 00 08 20 B2 40 10 02 BC 21 92 53 C2 21 30 12
-0A D6 75 3F FA 90 40 00 00 00 1A 20 B2 40 20 00
-BC 21 92 53 C2 21 B0 12 68 D5 0E 20 B2 50 10 00
-BC 21 3E 40 2B 00 B0 12 68 D5 32 24 92 92 BE 21
-C2 21 02 24 92 53 C2 21 8E 10 82 5E BC 21 D3 3F
-B0 12 68 D5 F9 23 B2 50 10 00 BC 21 3E 40 28 00
-B0 12 1E D5 30 12 5A D6 67 3F 87 12 4C C6 FC D4
-92 D6 FE 90 26 00 00 00 3E 40 20 00 04 20 B2 50
-82 00 BC 21 C2 3F B0 12 68 D5 DF 23 B2 50 80 00
-BC 21 3E 40 28 00 B0 12 1E D5 B0 12 58 D5 D5 23
-3D 40 08 CE 30 4D 78 C8 04 52 45 54 49 00 87 12
-34 C4 00 13 F8 CB 2A C4 34 C4 2C 00 92 D5 8A D6
-E2 D6 2E 4E 1E D2 BC 21 19 42 BA 21 92 3F E0 D4
-03 4D 4F 56 84 12 D8 D6 00 40 F0 D6 05 4D 4F 56
-2E 42 84 12 D8 D6 40 40 00 00 03 41 44 44 84 12
-D8 D6 00 50 0A D7 05 41 44 44 2E 42 84 12 D8 D6
-40 50 16 D7 04 41 44 44 43 00 84 12 D8 D6 00 60
-24 D7 06 41 44 44 43 2E 42 00 84 12 D8 D6 40 60
-C8 D6 04 53 55 42 43 00 84 12 D8 D6 00 70 42 D7
-06 53 55 42 43 2E 42 00 84 12 D8 D6 40 70 50 D7
-03 53 55 42 84 12 D8 D6 00 80 60 D7 05 53 55 42
-2E 42 84 12 D8 D6 40 80 C2 D4 03 43 4D 50 84 12
-D8 D6 00 90 7A D7 05 43 4D 50 2E 42 84 12 D8 D6
-40 90 B0 D4 04 44 41 44 44 00 84 12 D8 D6 00 A0
-94 D7 06 44 41 44 44 2E 42 00 84 12 D8 D6 40 A0
-86 D7 03 42 49 54 84 12 D8 D6 00 B0 B2 D7 05 42
-49 54 2E 42 84 12 D8 D6 40 B0 BE D7 03 42 49 43
-84 12 D8 D6 00 C0 CC D7 05 42 49 43 2E 42 84 12
-D8 D6 40 C0 D8 D7 03 42 49 53 84 12 D8 D6 00 D0
-E6 D7 05 42 49 53 2E 42 84 12 D8 D6 40 D0 00 00
-03 58 4F 52 84 12 D8 D6 00 E0 00 D8 05 58 4F 52
-2E 42 84 12 D8 D6 40 E0 32 D7 03 41 4E 44 84 12
-D8 D6 00 F0 1A D8 05 41 4E 44 2E 42 84 12 D8 D6
-40 F0 4C C6 92 D5 38 D8 1A 42 BC 21 B2 F0 70 00
-BC 21 8A 10 3A F0 0F 00 82 DA BC 21 4A 3F 6C D7
-03 52 52 43 84 12 32 D8 00 10 50 D8 05 52 52 43
-2E 42 84 12 32 D8 40 10 5C D8 04 53 57 50 42 00
-84 12 32 D8 80 10 6A D8 03 52 52 41 84 12 32 D8
-00 11 78 D8 05 52 52 41 2E 42 84 12 32 D8 40 11
-84 D8 03 53 58 54 84 12 32 D8 80 11 00 00 04 50
-55 53 48 00 84 12 32 D8 00 12 9E D8 06 50 55 53
-48 2E 42 00 84 12 32 D8 40 12 F2 D7 04 43 41 4C
-4C 00 84 12 32 D8 80 12 34 C4 2C 00 92 D5 8A D6
-D2 D8 59 42 BC 21 5A 42 BD 21 82 4A BC 21 BE 90
-00 15 00 00 02 20 0A 89 02 3C 09 8A 0A 49 3A 90
-10 00 03 2C 5A 0E A8 3F 1A 53 0E 4A 87 12 98 C7
-94 C9 0D 6F 75 74 20 6F 66 20 62 6F 75 6E 64 73
-76 CD AC D8 05 50 55 53 48 4D 84 12 C8 D8 00 15
-14 D9 04 50 4F 50 4D 00 84 12 C8 D8 00 17 4C C6
-FC D4 34 D9 82 43 BC 21 92 42 C4 21 BA 21 A2 53
-C4 21 92 53 C2 21 3E 40 2C 00 B0 12 2A C4 EE C9
-1A CB C0 C5 08 CE 8A D6 5A D9 0A 4E 3E 4F 1A 83
-2A 92 CA 2F 8A 10 5A 06 6F 3F 92 D8 04 52 52 43
-4D 00 84 12 2E D9 50 00 6C D9 04 52 52 41 4D 00
-84 12 2E D9 50 01 7A D9 04 52 4C 41 4D 00 84 12
-2E D9 50 02 88 D9 04 52 52 55 4D 00 84 12 2E D9
-50 03 85 12 00 3C 96 D9 03 53 3E 3D 85 12 00 38
-A8 D9 02 53 3C 00 85 12 00 34 22 D9 03 30 3E 3D
-85 12 00 30 BC D9 02 30 3C 00 85 12 00 30 00 00
-02 55 3C 00 85 12 00 2C D0 D9 03 55 3E 3D 85 12
-00 28 C6 D9 03 30 3C 3E 85 12 00 24 E4 D9 02 30
-3D 00 85 12 00 20 84 C8 02 49 46 00 1A 42 C4 21
-8A 4E 00 00 A2 53 C4 21 0E 4A 30 4D DA D9 04 54
-48 45 4E 00 1A 42 C4 21 08 4E 3E 4F 09 48 29 53
-0A 89 0A 11 3A 90 00 02 68 2F 88 DA 00 00 30 4D
-A2 D7 04 45 4C 53 45 00 1A 42 C4 21 BA 40 00 3C
-00 00 A2 53 C4 21 2F 83 8F 4A 00 00 E3 3F 0E DA
-05 55 4E 54 49 4C 3A 4F 08 4E 3E 4F 19 42 C4 21
-2A 83 0A 89 0A 11 3A 90 00 FE 47 3B 3A F0 FF 03
-08 DA 89 48 00 00 A2 53 C4 21 30 4D 26 D8 05 41
-47 41 49 4E 87 12 A2 D9 56 DA 2A C4 00 00 05 57
-48 49 4C 45 87 12 FC D9 6E C4 2A C4 B2 D9 06 52
-45 50 45 41 54 00 87 12 A2 D9 56 DA 14 DA 2A C4
-00 00 03 4A 4D 50 87 12 FA CD A2 D9 56 DA 2A C4
-3E B0 00 10 03 20 3E E0 00 04 30 4D 3E 90 00 34
-06 28 03 24 3E 40 00 34 30 4D 3E 40 00 38 30 4D
-00 00 04 3F 4A 4D 50 00 87 12 C0 DA FA CD 6E C4
-56 DA 2A C4 F6 DA 3D 41 08 4E 3E 4F 2A 48 0A 93
-04 20 98 42 C4 21 00 00 30 4D 88 43 00 00 A4 3F
-BC D8 03 42 57 31 84 12 F4 DA 00 00 12 DB 03 42
-57 32 84 12 F4 DA 00 00 1E DB 03 42 57 33 84 12
-F4 DA 00 00 36 DB 3D 41 1A 42 C4 21 28 4E 08 93
-08 20 BA 4F 00 00 A2 53 C4 21 8E 4A 00 00 3E 4F
-30 4D 8E 43 00 00 61 3F 00 00 03 46 57 31 84 12
-34 DB 00 00 5A DB 03 46 57 32 84 12 34 DB 00 00
-66 DB 03 46 57 33 84 12 34 DB 00 00 72 DB 04 47
-4F 54 4F 00 87 12 A2 D9 FA CD EE CB 2A C4 E2 DA
-05 3F 47 4F 54 4F 87 12 C0 DA FA CD EE CB 2A C4
+2A C4 16 CA 6E CA EA C5 92 D6 42 CB E0 C5 04 CE
+B4 D6 94 D6 29 4E 39 90 86 12 02 20 2E 53 30 41
+39 90 85 12 03 20 1E 4E 02 00 30 41 39 90 84 12
+01 20 2E 52 30 41 19 42 C4 21 A2 53 C4 21 89 4E
+00 00 3E 40 29 00 12 12 C2 21 92 53 C2 21 B0 12
+2A C4 16 CA 42 CB E0 C5 E6 D6 DC D6 21 53 3E 90
+10 00 BB 2D 30 41 E8 D6 B2 41 C2 21 22 D3 30 41
+87 12 90 C6 5C D6 F8 D6 82 43 BC 21 92 42 C4 21
+BA 21 A2 53 C4 21 0A 4E 3E 4F FA 90 23 00 00 00
+34 20 92 53 C2 21 B0 12 7E D6 0E 93 04 20 B2 40
+00 03 BC 21 27 3C 1E 93 04 20 B2 40 10 03 BC 21
+21 3C 2E 93 04 20 B2 40 20 03 BC 21 1B 3C 2E 92
+04 20 B2 40 20 02 BC 21 15 3C 3E 92 04 20 B2 40
+30 02 BC 21 0F 3C 3E 93 04 20 B2 40 30 03 BC 21
+09 3C B2 40 30 00 BC 21 19 42 C4 21 A2 53 C4 21
+89 4E 00 00 3E 4F 3D 41 30 4D FA 90 26 00 00 00
+08 20 B2 40 10 02 BC 21 92 53 C2 21 30 12 68 D7
+76 3F FA 90 40 00 00 00 1A 20 B2 40 20 00 BC 21
+92 53 C2 21 B0 12 C6 D6 0E 20 B2 50 10 00 BC 21
+3E 40 2B 00 B0 12 C6 D6 32 24 92 92 BE 21 C2 21
+02 24 92 53 C2 21 8E 10 82 5E BC 21 D3 3F B0 12
+C6 D6 F9 23 B2 50 10 00 BC 21 3E 40 28 00 B0 12
+7E D6 30 12 B8 D7 67 3F 87 12 90 C6 5C D6 F0 D7
+FE 90 26 00 00 00 3E 40 20 00 04 20 B2 50 82 00
+BC 21 C2 3F B0 12 C6 D6 DF 23 B2 50 80 00 BC 21
+3E 40 28 00 B0 12 7E D6 B0 12 B6 D6 D5 23 3D 40
+04 CE 30 4D A0 C8 04 52 45 54 49 00 87 12 34 C4
+00 13 20 CC 2A C4 34 C4 2C 00 F0 D6 E8 D7 40 D8
+2E 4E 1E D2 BC 21 19 42 BA 21 92 3F 40 D6 03 4D
+4F 56 84 12 36 D8 00 40 4E D8 05 4D 4F 56 2E 42
+84 12 36 D8 40 40 00 00 03 41 44 44 84 12 36 D8
+00 50 68 D8 05 41 44 44 2E 42 84 12 36 D8 40 50
+74 D8 04 41 44 44 43 00 84 12 36 D8 00 60 82 D8
+06 41 44 44 43 2E 42 00 84 12 36 D8 40 60 26 D8
+04 53 55 42 43 00 84 12 36 D8 00 70 A0 D8 06 53
+55 42 43 2E 42 00 84 12 36 D8 40 70 AE D8 03 53
+55 42 84 12 36 D8 00 80 BE D8 05 53 55 42 2E 42
+84 12 36 D8 40 80 22 D6 03 43 4D 50 84 12 36 D8
+00 90 D8 D8 05 43 4D 50 2E 42 84 12 36 D8 40 90
+10 D6 04 44 41 44 44 00 84 12 36 D8 00 A0 F2 D8
+06 44 41 44 44 2E 42 00 84 12 36 D8 40 A0 E4 D8
+03 42 49 54 84 12 36 D8 00 B0 10 D9 05 42 49 54
+2E 42 84 12 36 D8 40 B0 1C D9 03 42 49 43 84 12
+36 D8 00 C0 2A D9 05 42 49 43 2E 42 84 12 36 D8
+40 C0 36 D9 03 42 49 53 84 12 36 D8 00 D0 44 D9
+05 42 49 53 2E 42 84 12 36 D8 40 D0 00 00 03 58
+4F 52 84 12 36 D8 00 E0 5E D9 05 58 4F 52 2E 42
+84 12 36 D8 40 E0 90 D8 03 41 4E 44 84 12 36 D8
+00 F0 78 D9 05 41 4E 44 2E 42 84 12 36 D8 40 F0
+90 C6 F0 D6 96 D9 1A 42 BC 21 B2 F0 70 00 BC 21
+8A 10 3A F0 0F 00 82 DA BC 21 4A 3F CA D8 03 52
+52 43 84 12 90 D9 00 10 AE D9 05 52 52 43 2E 42
+84 12 90 D9 40 10 BA D9 04 53 57 50 42 00 84 12
+90 D9 80 10 C8 D9 03 52 52 41 84 12 90 D9 00 11
+D6 D9 05 52 52 41 2E 42 84 12 90 D9 40 11 E2 D9
+03 53 58 54 84 12 90 D9 80 11 00 00 04 50 55 53
+48 00 84 12 90 D9 00 12 FC D9 06 50 55 53 48 2E
+42 00 84 12 90 D9 40 12 50 D9 04 43 41 4C 4C 00
+84 12 90 D9 80 12 34 C4 2C 00 F0 D6 E8 D7 30 DA
+59 42 BC 21 5A 42 BD 21 82 4A BC 21 BE 90 00 15
+00 00 02 20 0A 89 02 3C 09 8A 0A 49 3A 90 10 00
+03 2C 5A 0E A8 3F 1A 53 0E 4A 87 12 B2 C7 BC C9
+0D 6F 75 74 20 6F 66 20 62 6F 75 6E 64 73 86 CD
+0A DA 05 50 55 53 48 4D 84 12 26 DA 00 15 72 DA
+04 50 4F 50 4D 00 84 12 26 DA 00 17 90 C6 5C D6
+92 DA 82 43 BC 21 92 42 C4 21 BA 21 A2 53 C4 21
+92 53 C2 21 3E 40 2C 00 B0 12 2A C4 16 CA 42 CB
+E0 C5 04 CE E8 D7 B8 DA 0A 4E 3E 4F 1A 83 2A 92
+CA 2F 8A 10 5A 06 6F 3F F0 D9 04 52 52 43 4D 00
+84 12 8C DA 50 00 CA DA 04 52 52 41 4D 00 84 12
+8C DA 50 01 D8 DA 04 52 4C 41 4D 00 84 12 8C DA
+50 02 E6 DA 04 52 52 55 4D 00 84 12 8C DA 50 03
+85 12 00 3C F4 DA 03 53 3E 3D 85 12 00 38 06 DB
+02 53 3C 00 85 12 00 34 80 DA 03 30 3E 3D 85 12
+00 30 1A DB 02 30 3C 00 85 12 00 30 00 00 02 55
+3C 00 85 12 00 2C 2E DB 03 55 3E 3D 85 12 00 28
+24 DB 03 30 3C 3E 85 12 00 24 42 DB 02 30 3D 00
+85 12 00 20 AC C8 02 49 46 00 1A 42 C4 21 8A 4E
+00 00 A2 53 C4 21 0E 4A 30 4D 38 DB 04 54 48 45
+4E 00 1A 42 C4 21 08 4E 3E 4F 09 48 29 53 0A 89
+0A 11 3A 90 00 02 68 2F 88 DA 00 00 30 4D 00 D9
+04 45 4C 53 45 00 1A 42 C4 21 BA 40 00 3C 00 00
+A2 53 C4 21 2F 83 8F 4A 00 00 E3 3F 6C DB 05 55
+4E 54 49 4C 3A 4F 08 4E 3E 4F 19 42 C4 21 2A 83
+0A 89 0A 11 3A 90 00 FE 47 3B 3A F0 FF 03 08 DA
+89 48 00 00 A2 53 C4 21 30 4D 84 D9 05 41 47 41
+49 4E 87 12 00 DB B4 DB 2A C4 00 00 05 57 48 49
+4C 45 87 12 5A DB 78 C4 2A C4 10 DB 06 52 45 50
+45 41 54 00 87 12 00 DB B4 DB 72 DB 2A C4 00 00
+03 4A 4D 50 87 12 F6 CD 00 DB B4 DB 2A C4 3E B0
+00 10 03 20 3E E0 00 04 30 4D 3E 90 00 34 06 28
+03 24 3E 40 00 34 30 4D 3E 40 00 38 30 4D 00 00
+04 3F 4A 4D 50 00 87 12 1E DC F6 CD 78 C4 B4 DB
+2A C4 54 DC 3D 41 08 4E 3E 4F 2A 48 0A 93 04 20
+98 42 C4 21 00 00 30 4D 88 43 00 00 A4 3F 1A DA
+03 42 57 31 84 12 52 DC 00 00 70 DC 03 42 57 32
+84 12 52 DC 00 00 7C DC 03 42 57 33 84 12 52 DC
+00 00 94 DC 3D 41 1A 42 C4 21 28 4E 08 93 08 20
+BA 4F 00 00 A2 53 C4 21 8E 4A 00 00 3E 4F 30 4D
+8E 43 00 00 61 3F 00 00 03 46 57 31 84 12 92 DC
+00 00 B8 DC 03 46 57 32 84 12 92 DC 00 00 C4 DC
+03 46 57 33 84 12 92 DC 00 00 D0 DC 04 47 4F 54
+4F 00 87 12 00 DB F6 CD 16 CC 2A C4 40 DC 05 3F
+47 4F 54 4F 87 12 1E DC F6 CD 16 CC 2A C4
@FFE2
-1C D3 1C D3 1C D3 1C D3 1C D3 92 C8 1C D3 1C D3
-1C D3 1C D3 1C D3 1C D3 1C D3 1C D3 1C D3
+8C D4 8C D4 8C D4 8C D4 8C D4 BA C8 8C D4 8C D4
+8C D4 8C D4 8C D4 8C D4 8C D4 8C D4 8C D4
q
+++ /dev/null
-\prog\MSP430Flasher\msp430flasher -m SBW2 -n MSP430fr4133 -v -w %1 -z [VCC=3000]
-exit
-
-tip : how to calculate MAIN program lenght ?
-
-open the prog.txt file with your editor, select MAIN section
-in status bar, keep the number of selected chars
-if lines are ended with CR+LF, substract the number of lines selected
-then divide by 3.
@1800
-10 00 6A C6 C0 5D 80 04 FD FF 18 00 5C D9 12 D2
-2A C6 3C C6 00 00 00 00
+10 00 92 C6 C0 5D 80 04 05 00 18 00 CA DA 82 D3
+52 C6 64 C6 00 00 00 00
@1DAA
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 C2
03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
44 55 50 00 0E 93 F6 23 30 4D 40 C2 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 C2 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E C2 02 3E 52 00 0E 12 3E 4F 30 4D 8E C2
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 C2
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C C2 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 C2 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 C3
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 C2 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA C2 03 41 4E 44 3E FF 30 4D 7A C2 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E C3 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 C3 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E C3 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 C3 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 C2 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
+50 00 3E 4F 30 4D 00 00 03 4E 49 50 2F 53 30 4D
+00 00 04 53 57 41 50 00 2A 4F 8F 4E 00 00 0E 4A
+30 4D 68 C2 04 4F 56 45 52 00 8F 4E FE FF 2E 4F
+2F 83 30 4D 72 C2 03 52 4F 54 2A 4F 8F 4E 00 00
+1E 4F 02 00 8F 4A 02 00 30 4D 4E C2 02 3E 52 00
+0E 12 3E 4F 30 4D 96 C2 02 52 3E 00 2F 83 8F 4E
+00 00 3E 41 30 4D B8 C2 02 52 40 00 2F 83 8F 4E
+00 00 2E 41 30 4D 5C C2 05 44 45 50 54 48 8F 4E
+FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D 00 00
+01 40 2E 4E 30 4D F0 C2 01 21 BE 4F 00 00 3E 4F
+30 4D 00 00 02 43 40 00 6E 4E 30 4D 04 C3 02 43
+21 00 FE 4F 00 00 1F 53 3E 4F 30 4D 00 00 01 2B
+3E 5F 30 4D 30 C2 01 2D 3E 8F 3E E3 1E 53 30 4D
+F8 C2 03 41 4E 44 3E FF 30 4D 84 C2 02 4F 52 00
+3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D 3C C3
+06 4E 45 47 41 54 45 00 E8 3F 32 C3 03 41 42 53
+0E 93 E3 33 30 4D D8 C2 04 44 41 42 53 00 3E F3
+06 34 BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D
+00 00 02 30 3D 00 1E 83 0E 7E 30 4D 82 C3 02 30
+3C 00 0E 5E 0E 7E 3E E3 30 4D 8E C3 02 30 3E 00
+1E 93 05 34 0B 3C 00 00 01 3D 3E 8F 07 20 3E 43
+30 4D A8 C3 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
+AC C2 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE C3 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 C3 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 C3 03 3E 49 4E 85 12 C2 1D 10 C3
-04 42 41 53 45 00 85 12 DA 1D C0 C2 05 53 54 41
-54 45 85 12 B6 1D 30 C4 02 42 4C 00 85 12 20 00
-94 C3 02 3C 23 00 B2 40 AA 1D AA 1D 30 4D 1E 15
-0E 43 3D 40 20 00 0A 93 04 20 0D 11 0A 4C 0C 43
-09 43 0E 9B 01 28 0E 8B 09 69 08 68 1D 83 07 30
-0C 5C 0A 6A 0E 6E F5 2B 0E 8B 12 D3 F5 3F 0A 4E
-1D 17 30 41 48 C4 01 23 1B 42 DA 1D 2C 4F 0A 4E
-B0 12 5E C4 8F 49 00 00 0E 48 7A 90 0A 00 02 28
-3A 50 07 00 3A 50 30 00 92 83 AA 1D 18 42 AA 1D
-C8 4A 00 00 30 4D 96 C4 02 23 53 00 87 12 98 C4
-D2 C4 2D 83 09 93 E0 23 0E 93 DE 23 3D 41 30 4D
-C8 C4 02 23 3E 00 9F 42 AA 1D 00 00 3E 40 AA 1D
-2E 8F 30 4D 00 C4 04 48 4F 4C 44 00 0A 4E 3E 4F
-DB 3F 3C C4 04 53 49 47 4E 00 0E 93 3E 4F 3A 40
-2D 00 D2 33 30 4D F4 C3 03 55 44 2E 87 12 56 C4
-CC C4 E6 C4 50 C7 18 C7 2A C2 18 C5 02 55 2E 00
-2F 83 8F 4E 00 00 0E 43 F1 3F 3E B0 00 80 06 24
-BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D DA C2
-02 44 2E 00 87 12 56 C4 6E C2 80 C2 3A C5 CC C4
-92 C2 0A C5 E6 C4 50 C7 18 C7 2A C2 52 C3 01 2E
-3E B0 00 80 DD 27 2F 83 3E 43 EC 3F F6 C4 04 48
-45 52 45 00 2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D
-62 C3 05 41 4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D
-E2 C4 02 43 2C 00 1A 42 C4 1D CA 4E 00 00 92 53
-C4 1D 3E 4F 30 4D 2F 83 8F 4E 00 00 B0 12 2A C6
-92 B3 DC 05 FD 27 1E 42 CC 05 B0 12 3C C6 30 4D
-30 40 B6 C5 7E C5 05 28 4B 45 59 29 18 42 CC 05
-EA 3F 12 C4 03 4B 45 59 30 40 DC C5 92 C5 06 41
-43 43 45 50 54 00 3C 40 A8 C6 3B 40 72 C6 2D 15
-0A 4E 2E 4F 0A 5E 3B 40 0D 00 3C 40 20 00 3D 40
-9C C6 92 B3 DC 05 05 24 18 42 CC 05 38 90 0A 00
-04 20 21 53 39 40 56 C6 4D 15 B2 40 11 00 CE 05
-A2 B3 DC 05 FD 27 E2 C2 03 02 30 41 B2 40 13 00
-CE 05 A2 B3 DC 05 FD 27 E2 D2 03 02 30 41 00 00
-05 53 4C 45 45 50 30 40 64 C6 00 00 07 28 53 4C
-45 45 50 29 12 D2 0A 18 F6 3F 21 52 3A 17 58 42
-CC 05 48 9B E3 27 48 9C 06 2C 78 92 11 20 2E 9F
-0F 24 1E 83 05 3C 0E 9A 03 24 CE 48 00 00 1E 53
-82 48 CE 05 A2 B3 DC 05 FD 27 30 4D 9E C6 2D 83
-92 B3 DC 05 FD 27 E3 23 B2 40 18 00 0A 18 3E 8F
-3D 41 30 4D D6 C5 06 28 45 4D 49 54 29 00 08 4E
-3E 4F E6 3F 50 C5 04 45 4D 49 54 00 30 40 BE C6
-C6 C6 04 45 43 48 4F 00 B2 40 82 48 90 C6 30 4D
-6E C5 06 4E 4F 45 43 48 4F 00 B2 40 30 4D 90 C6
-30 4D B6 C6 04 28 43 52 29 00 2F 83 8F 4E 00 00
-3E 40 0D 00 E3 3F A2 C5 02 43 52 00 30 40 FA C6
-04 C5 05 53 50 41 43 45 2F 83 8F 4E 00 00 3E 40
-20 00 D4 3F 12 C7 06 53 50 41 43 45 53 00 0E 93
-09 24 0D 12 3D 40 3A C7 EF 3F 3C C7 2D 83 1E 83
-EB 23 3D 41 3E 4F 30 4D 2C C5 04 54 59 50 45 00
-0E 93 95 24 2A 4F 8F 5E 00 00 0E 4A 87 12 CA C3
-02 C4 0A C3 CC C6 EC C3 60 C7 2A C2 2F 82 8F 4E
-02 00 7E 4D 8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D
-26 C7 82 53 22 00 87 12 34 C2 6C C7 A2 C9 34 C2
-22 00 C6 C7 96 C7 3D 41 6E 4E 1E 83 82 5E C4 1D
-3E 4F 92 B3 C4 1D A2 63 C4 1D 30 4D E2 C6 82 2E
-22 00 87 12 86 C7 34 C2 50 C7 A2 C9 2A C2 00 00
-04 57 4F 52 44 00 3C 40 BE 1D 39 4C 3A 4C 09 5A
-3A 5C 28 4C 09 9A 19 24 7E 9A FC 27 1A 83 3B 40
-60 00 C8 4C 00 00 09 9A 0C 24 7C 4A 4E 9C 09 24
-18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F 7C 80 20 00
-F0 3F 1A 82 C0 1D 82 4A C2 1D 1E 42 C4 1D 08 8E
-CE 48 00 00 30 4D 00 00 04 46 49 4E 44 00 2F 83
-0C 4E 65 4C 74 40 80 00 3B 40 CA 1D 3E 4B 0E 93
-1E 24 58 4C 01 00 78 F0 1E 00 0E 58 2E 53 1E 4E
-FE FF 0E 93 F3 27 09 4E 78 49 48 C4 48 95 F7 23
-0A 4C 1A 53 FA 99 00 00 F2 23 58 83 FA 23 19 B3
-09 63 0C 49 6A 4E 1E 43 4A 93 01 30 2E 83 8F 4C
-00 00 35 40 08 C2 34 40 14 C2 30 4D 2F 53 2F 53
-3E 4F 30 4D 26 C4 07 3E 4E 55 4D 42 45 52 3C 4F
-38 4F 29 4F 2F 82 1B 42 DA 1D 6A 4C 7A 80 30 00
-7A 90 0A 00 02 28 7A 80 07 00 0A 9B 13 2C 82 49
-D0 04 82 48 D2 04 82 4B C8 04 19 42 E4 04 18 42
-E6 04 09 5A 08 63 1C 53 1E 83 E7 23 8F 49 04 00
-8F 48 02 00 8F 4C 00 00 30 4D 03 12 0D 12 1B 42
-DA 1D 0B 12 32 C0 00 02 6D 4E 0D 5E 0C 4E 7A 40
-2E 00 0D 9C 0A 28 7A 9C FC 23 32 D0 00 02 FC 4C
-FE FF 0D 9C FC 2F DE 83 00 00 09 43 08 43 3D 40
-50 C9 3F 82 8F 4E 06 00 0C 4E 7E 4C 6A 4C 7A 90
-2D 00 10 2C 3B 40 10 00 7A 80 24 00 06 24 2B 43
-5A 83 03 24 3B 52 6A 53 B0 23 1C 53 1E 83 6A 4C
-7A 90 2D 00 AA 23 1C 53 1E 83 B1 43 04 00 A5 3F
-52 C9 2F 53 0E 93 2C 17 82 4C DA 1D 03 24 2F 52
-0E F3 30 4D 9F 4F 02 00 04 00 BF 4F 00 00 3E E3
-09 20 3E E3 BF E3 02 00 BF E3 00 00 9F 53 02 00
-8F 63 00 00 32 B0 00 02 01 20 2F 53 30 4D D2 C6
-07 45 58 45 43 55 54 45 0A 4E 3E 4F 00 4A 28 C3
-01 2C 1A 42 C4 1D A2 53 C4 1D 8A 4E 00 00 3E 4F
-30 4D A0 C9 87 4C 49 54 45 52 41 4C 82 93 B6 1D
-16 24 32 B0 00 02 09 24 1A 42 C4 1D A2 52 C4 1D
-BA 40 34 C2 00 00 BA 4F 02 00 1A 42 C4 1D A2 52
-C4 1D BA 40 34 C2 00 00 8A 4E 02 00 3E 4F 30 4D
-08 C7 05 43 4F 55 4E 54 2F 83 1E 53 8F 4E 00 00
-5E 4E FF FF 30 4D 82 4E BE 1D B2 4F C0 1D 3E 4F
-82 43 C2 1D 87 12 4C C4 C6 C7 1C CA 3D 40 28 CA
-FE 22 3D 41 3E 4F 30 4D 2A CA 0A 4E 3E 4F 3D 40
-40 CA 53 27 3D 40 16 CA 1A E2 B6 1D B2 27 AC 23
-42 CA 3E 4F 3D 40 16 CA B9 23 DE 53 00 00 68 4E
-08 5E F8 40 3F 00 00 00 3D 40 0C CC CD 3F 90 C9
-08 45 56 41 4C 55 41 54 45 00 39 40 BE 1D 39 12
-39 12 39 12 0D 12 B0 12 2A C2 06 CA 7E CA 3D 41
-B2 41 C2 1D B2 41 C0 1D B2 41 BE 1D 30 4D 7A C3
-04 51 55 49 54 00 31 40 E0 1C B2 40 00 1C 00 1C
-82 43 B6 1D 82 43 08 18 B0 12 2A C2 6C C7 04 0D
-6F 6B 20 00 50 C7 34 C2 38 1D 44 C2 34 C2 50 00
-F6 C5 18 C7 06 CA 34 C2 7E 1C CE C2 B2 C3 6C C7
-0D 73 74 61 63 6B 20 65 6D 70 74 79 20 21 1A CB
-34 C2 30 FF 84 C5 B2 C3 6C C7 0B 46 52 41 4D 20
-66 75 6C 6C 20 21 1A CB 42 C4 F4 C2 C0 C3 AC CA
-6C C7 04 0D 20 20 20 00 BC C3 B4 CA EE C5 05 41
-42 4F 52 54 3F 40 80 1C BE 3F 8F 93 02 00 AE 26
-B2 40 82 48 90 C6 B0 12 0C D0 82 43 D6 D8 82 43
-E2 D8 82 43 EE D8 82 43 1E D9 82 43 2A D9 82 43
-36 D9 A2 B3 DC 05 FD 27 B2 40 11 00 CE 05 E2 C2
-03 02 92 C3 DC 05 38 40 F0 FF 39 42 19 83 FE 23
-18 83 FB 23 92 B3 DC 05 F4 23 87 12 6C C7 04 1B
-5B 37 6D 00 50 C7 50 C7 6C C7 04 1B 5B 30 6D 00
-50 C7 4E CF 90 CF 96 CF 14 CB 0E CB 86 41 42 4F
-52 54 22 00 87 12 86 C7 34 C2 1A CB A2 C9 2A C2
-18 C8 01 27 87 12 4C C4 C6 C7 1E C8 C0 C3 B2 CB
-2A C2 4A CA 52 C4 81 5C 92 42 BE 1D C2 1D 30 4D
-87 12 A2 C7 4C C4 C6 C7 CA CB 08 4E 7A 4E 5A D3
-5A 53 0A 58 19 42 C8 1D 6E 4E 3E F0 1E 00 09 5E
-82 48 AE 1D 82 49 B0 1D 82 4A B2 1D 2A 52 82 4A
-C4 1D 3E 4F 3D 41 30 41 87 12 6C C7 0F 73 74 61
-63 6B 20 6D 69 73 6D 61 74 63 68 21 20 CB 82 9F
-B4 1D F2 23 18 42 AE 1D 19 42 B0 1D A8 49 FE FF
-89 48 00 00 30 4D C0 C7 08 56 41 52 49 41 42 4C
-45 00 B0 12 C0 CB BA 40 86 12 FC FF EF 3F F2 C9
-08 43 4F 4E 53 54 41 4E 54 00 B0 12 C0 CB BA 40
-85 12 FC FF 8A 4E FE FF 3E 4F E0 3F 40 CC 06 43
-52 45 41 54 45 00 B0 12 C0 CB BA 40 85 12 FC FF
-8A 4A FE FF D3 3F 60 CA 05 44 4F 45 53 3E 1A 42
-B2 1D BA 40 84 12 00 00 8A 4D 02 00 3D 41 30 4D
-78 CC 05 44 45 46 45 52 B0 12 C0 CB BA 40 30 40
-FC FF BA 40 8E CC FE FF B9 3F 00 00 81 5B 82 43
-B6 1D 30 4D B6 CB 01 5D B2 43 B6 1D 30 4D 82 C7
-87 52 45 43 55 52 53 45 19 42 C4 1D 99 42 B2 1D
-00 00 A2 53 C4 1D 30 4D AC CC 01 3A B0 12 C0 CB
-BA 40 87 12 FC FF A2 83 C4 1D B2 43 B6 1D 82 4F
-B4 1D 30 4D DA CC 81 3B 82 93 B6 1D 5D 27 87 12
-34 C2 2A C2 A2 C9 0E CC AE CC 2A C2 F4 C6 09 49
+0E 93 3E 4F FB 27 2D 53 30 4D 1E 83 0E 7E F9 3F
+39 40 00 80 39 8F 08 4E 3E 4F 08 59 19 15 30 4D
+81 5E 00 00 3E 4F 32 B0 00 01 E8 27 2D 53 21 52
+30 4D 91 53 00 00 F7 3F CE C3 06 55 4E 4C 4F 4F
+50 00 F5 3F 00 00 01 49 2F 83 8F 4E 00 00 2E 41
+1E 81 02 00 30 4D 1E C3 01 4A 2F 83 8F 4E 00 00
+1E 41 04 00 1E 81 06 00 30 4D 9C C3 03 50 41 44
+85 12 E2 1C 1A C4 03 54 49 42 85 12 38 1D 0E C3
+03 43 50 4C 85 12 50 00 C2 C3 03 3E 49 4E 85 12
+C2 1D 60 C4 04 42 41 53 45 00 85 12 DA 1D C8 C2
+05 53 54 41 54 45 85 12 B6 1D 74 C4 02 42 4C 00
+85 12 20 00 B4 C3 02 3C 23 00 B2 40 AA 1D AA 1D
+30 4D 8C C4 01 23 2C 4F 5B 42 DA 1D 0A 43 34 40
+20 00 0E 93 04 20 04 11 0E 4C 0C 43 09 43 0A 9B
+01 28 0A 8B 09 69 08 68 14 83 07 30 0C 5C 0E 6E
+0A 6A F5 2B 0A 8B 12 D3 F5 3F 34 40 14 C2 8F 49
+00 00 0E 48 7A 90 0A 00 02 28 3A 50 07 00 3A 50
+30 00 92 83 AA 1D 18 42 AA 1D C8 4A 00 00 30 4D
+A4 C4 02 23 53 00 87 12 A6 C4 0C C5 2D 83 09 93
+CA 23 0E 93 C8 23 3D 41 30 4D 02 C5 02 23 3E 00
+9F 42 AA 1D 00 00 3E 40 AA 1D 2E 8F 30 4D 26 C4
+04 48 4F 4C 44 00 0A 4E 3E 4F DB 3F 80 C4 04 53
+49 47 4E 00 0E 93 3E 4F 3A 40 2D 00 D2 33 30 4D
+56 C4 02 55 2E 00 87 12 9A C4 34 C2 00 00 06 C5
+20 C5 78 C7 40 C7 2A C2 68 C3 02 44 2E 00 87 12
+9A C4 78 C2 8A C2 6E C3 06 C5 9A C2 44 C5 20 C5
+78 C7 40 C7 2A C2 50 C3 01 2E 0E 93 E4 37 2F 83
+8F 4E 00 00 3E 43 EB 3F 30 C5 04 48 45 52 45 00
+2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D 5C C3 05 41
+4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D 1C C5 02 43
+2C 00 1A 42 C4 1D CA 4E 00 00 92 53 C4 1D 3E 4F
+30 4D 2F 83 8F 4E 00 00 B0 12 52 C6 92 B3 DC 05
+FD 27 1E 42 CC 05 B0 12 64 C6 30 4D 9A C5 05 28
+4B 45 59 29 18 42 CC 05 EC 3F 38 C4 03 4B 45 59
+30 40 F4 C5 AE C5 06 41 43 43 45 50 54 00 30 40
+1E C6 EE C5 08 28 41 43 43 45 50 54 29 00 3C 40
+D0 C6 3B 40 9A C6 2D 15 0A 4E 2E 4F 0A 5E 3B 40
+0D 00 3C 40 20 00 3D 40 C4 C6 92 B3 DC 05 05 24
+18 42 CC 05 38 90 0A 00 04 20 21 53 39 40 7E C6
+4D 15 B2 40 11 00 CE 05 E2 C2 03 02 A2 B3 DC 05
+FD 27 30 41 B2 40 13 00 CE 05 E2 D2 03 02 A2 B3
+DC 05 FD 27 30 41 00 00 05 53 4C 45 45 50 30 40
+8C C6 00 00 07 28 53 4C 45 45 50 29 12 D2 0A 18
+F6 3F 21 52 3A 17 58 42 CC 05 48 9B E3 27 48 9C
+06 2C 78 92 11 20 2E 9F 0F 24 1E 83 05 3C 0E 9A
+03 24 CE 48 00 00 1E 53 82 48 CE 05 A2 B3 DC 05
+FD 27 30 4D C6 C6 2D 83 92 B3 DC 05 FD 27 E3 23
+B2 40 18 00 0A 18 3E 8F 3D 41 30 4D 14 C6 06 28
+45 4D 49 54 29 00 08 4E 3E 4F E6 3F 6A C5 04 45
+4D 49 54 00 30 40 E6 C6 EE C6 04 45 43 48 4F 00
+B2 40 82 48 B8 C6 30 4D 88 C5 06 4E 4F 45 43 48
+4F 00 B2 40 30 4D B8 C6 30 4D DE C6 04 28 43 52
+29 00 2F 83 8F 4E 00 00 3E 40 0D 00 E3 3F BE C5
+02 43 52 00 30 40 22 C7 3E C5 05 53 50 41 43 45
+2F 83 8F 4E 00 00 3E 40 20 00 D4 3F 3A C7 06 53
+50 41 43 45 53 00 0E 93 09 24 0D 12 3D 40 62 C7
+EF 3F 64 C7 2D 83 1E 83 EB 23 3D 41 3E 4F 30 4D
+52 C5 04 54 59 50 45 00 0E 93 95 24 2A 4F 8F 5E
+00 00 0E 4A 87 12 F0 C3 28 C4 08 C3 F4 C6 12 C4
+88 C7 2A C2 2F 82 8F 4E 02 00 7E 4D 8F 4D 00 00
+0D 5E 1D B3 0D 63 30 4D 4E C7 82 53 22 00 87 12
+34 C2 94 C7 CA C9 34 C2 22 00 EE C7 BE C7 3D 41
+6E 4E 1E 83 82 5E C4 1D 3E 4F 92 B3 C4 1D A2 63
+C4 1D 30 4D 0A C7 82 2E 22 00 87 12 AE C7 34 C2
+78 C7 CA C9 2A C2 00 00 04 57 4F 52 44 00 3C 40
+BE 1D 39 4C 3A 4C 09 5A 3A 5C 28 4C 09 9A 19 24
+7E 9A FC 27 1A 83 3B 40 60 00 C8 4C 00 00 09 9A
+0C 24 7C 4A 4E 9C 09 24 18 53 4B 9C F6 2F 7C 90
+7B 00 F3 2F 7C 80 20 00 F0 3F 1A 82 C0 1D 82 4A
+C2 1D 1E 42 C4 1D 08 8E CE 48 00 00 30 4D 00 00
+04 46 49 4E 44 00 2F 83 0C 4E 65 4C 74 40 80 00
+3B 40 CA 1D 3E 4B 0E 93 1E 24 58 4C 01 00 78 F0
+1E 00 0E 58 2E 53 1E 4E FE FF 0E 93 F3 27 09 4E
+78 49 48 C4 48 95 F7 23 0A 4C 1A 53 FA 99 00 00
+F2 23 58 83 FA 23 19 B3 09 63 0C 49 6A 4E 1E 43
+4A 93 01 30 2E 83 8F 4C 00 00 35 40 08 C2 34 40
+14 C2 30 4D 2F 53 2F 53 3E 4F 30 4D 6A C4 07 3E
+4E 55 4D 42 45 52 3C 4F 38 4F 29 4F 2F 82 1B 42
+DA 1D 6A 4C 7A 80 30 00 7A 90 0A 00 02 28 7A 80
+07 00 0A 9B 13 2C 82 49 D0 04 82 48 D2 04 82 4B
+C8 04 19 42 E4 04 18 42 E6 04 09 5A 08 63 1C 53
+1E 83 E7 23 8F 49 04 00 8F 48 02 00 8F 4C 00 00
+30 4D 03 12 0D 12 1B 42 DA 1D 0B 12 32 C0 00 02
+6D 4E 0D 5E 0C 4E 7A 40 2E 00 0D 9C 0A 28 7A 9C
+FC 23 32 D0 00 02 FC 4C FE FF 0D 9C FC 2F DE 83
+00 00 09 43 08 43 3D 40 78 C9 3F 82 8F 4E 06 00
+0C 4E 7E 4C 6A 4C 7A 90 2D 00 10 2C 3B 40 10 00
+7A 80 24 00 06 24 2B 43 5A 83 03 24 3B 52 6A 53
+B0 23 1C 53 1E 83 6A 4C 7A 90 2D 00 AA 23 1C 53
+1E 83 B1 43 04 00 A5 3F 7A C9 2F 53 0E 93 2C 17
+82 4C DA 1D 03 24 2F 52 0E F3 30 4D 9F 4F 02 00
+04 00 BF 4F 00 00 3E E3 09 20 3E E3 BF E3 02 00
+BF E3 00 00 9F 53 02 00 8F 63 00 00 32 B0 00 02
+01 20 2F 53 30 4D FA C6 07 45 58 45 43 55 54 45
+0A 4E 3E 4F 00 4A 26 C3 01 2C 1A 42 C4 1D A2 53
+C4 1D 8A 4E 00 00 3E 4F 30 4D C8 C9 87 4C 49 54
+45 52 41 4C 82 93 B6 1D 0F 24 1A 42 C4 1D A2 52
+C4 1D BA 40 34 C2 00 00 8A 4E 02 00 3E 4F 32 B0
+00 02 32 C0 00 02 F1 23 30 4D 30 C7 05 43 4F 55
+4E 54 2F 83 1E 53 8F 4E 00 00 5E 4E FF FF 30 4D
+82 4E BE 1D B2 4F C0 1D 3E 4F 82 43 C2 1D 87 12
+90 C4 EE C7 36 CA 3D 40 42 CA 05 23 3D 41 3E 4F
+30 4D 44 CA 0A 4E 3E 4F 3D 40 5A CA 5A 27 3D 40
+30 CA 1A E2 B6 1D B9 27 B3 23 5C CA 3E 4F 3D 40
+30 CA C0 23 DE 53 00 00 68 4E 08 5E F8 40 3F 00
+00 00 3D 40 88 CC CD 3F B8 C9 08 45 56 41 4C 55
+41 54 45 00 39 40 BE 1D 3C 49 3B 49 3A 49 3D 15
+B0 12 2A C2 20 CA 98 CA B2 41 C2 1D B2 41 C0 1D
+B2 41 BE 1D 3D 41 30 4D 4C C4 04 51 55 49 54 00
+31 40 E0 1C B2 40 00 1C 00 1C 82 43 B6 1D 82 43
+08 18 B0 12 2A C2 94 C7 03 0D 6F 6B 78 C7 40 C7
+5A C4 44 C2 64 C4 0E C6 40 C7 20 CA DE C2 92 C3
+94 C7 0D 73 74 61 63 6B 20 65 6D 70 74 79 21 20
+2A CB 34 C2 30 FF A0 C5 D2 C3 94 C7 0B 46 52 41
+4D 20 66 75 6C 6C 21 20 2A CB 86 C4 F2 C2 E0 C3
+C6 CA 94 C7 03 0D 20 20 DC C3 CC CA 06 C6 05 41
+42 4F 52 54 3F 40 80 1C C3 3F 8F 93 02 00 BA 26
+B2 40 82 48 B8 C6 B0 12 3C D0 A2 B3 DC 05 FD 27
+B2 40 11 00 CE 05 E2 C2 03 02 92 C3 DC 05 38 40
+F0 FF 39 42 03 43 19 83 FD 23 18 83 FA 23 92 B3
+DC 05 F3 23 87 12 94 C7 04 1B 5B 37 6D 00 78 C7
+78 C7 94 C7 04 1B 5B 30 6D 00 78 C7 4A CF 8C CF
+92 CF DA CF 24 CB 1E CB 86 41 42 4F 52 54 22 00
+87 12 AE C7 34 C2 2A CB CA C9 2A C2 40 C8 01 27
+87 12 90 C4 EE C7 46 C8 E0 C3 AE CB 2A C2 64 CA
+96 C4 81 5C 92 42 BE 1D C2 1D 30 4D 00 00 81 5B
+82 43 B6 1D 30 4D B2 CB 01 5D B2 43 B6 1D 30 4D
+BE CB 83 5B 27 5D 87 12 A0 CB 34 C2 34 C2 CA C9
+CA C9 2A C2 BE 4F 02 00 3E 4F 30 4D 1C C7 82 49
+53 00 87 12 86 C4 F2 C2 E0 C3 06 CC D6 CB 34 C2
+E4 CB CA C9 2A C2 A0 CB E4 CB 2A C2 EE CB 09 49
4D 4D 45 44 49 41 54 45 1A 42 AE 1D FA D0 80 00
-00 00 30 4D BE 4F 02 00 3E 4F 30 4D 0E CD 82 49
-53 00 87 12 42 C4 F4 C2 C0 C3 46 CD 52 CD 34 C2
-24 CD A2 C9 2A C2 A4 CB 24 CD 2A C2 F6 CC 83 5B
-27 5D 87 12 A4 CB 34 C2 34 C2 A2 C9 A2 C9 2A C2
-90 CA 88 50 4F 53 54 50 4F 4E 45 00 87 12 4C C4
-C6 C7 1E C8 54 C2 C0 C3 B2 CB 7E C3 C0 C3 8C CD
-34 C2 34 C2 A2 C9 A2 C9 34 C2 A2 C9 A2 C9 2A C2
-92 CD 3A 4E 82 4A C6 1D 2E 4E 82 4E C4 1D 3D 40
-10 00 09 4A 08 49 29 83 18 48 FE FF 0E 98 FC 2B
-89 48 00 00 1D 83 F6 23 2A 4A 0A 93 F0 23 3E 4F
-3D 41 30 4D 2E CD 82 49 46 00 2F 83 8F 4E 00 00
-1E 42 C4 1D BE 40 C0 C3 00 00 A2 52 C4 1D 2E 53
-30 4D 92 CC 84 45 4C 53 45 00 1A 42 C4 1D BA 40
-BC C3 00 00 2A 52 82 4A C4 1D 8E 4A 00 00 2A 83
-0E 4A 30 4D 4A C7 84 54 48 45 4E 00 9E 42 C4 1D
-00 00 3E 4F 30 4D 5E CC 85 42 45 47 49 4E 30 40
-84 C5 06 CE 85 55 4E 54 49 4C 39 40 C0 C3 1A 42
-C4 1D A2 52 C4 1D 8A 49 00 00 8A 4E 02 00 3E 4F
-30 4D 8C CB 85 41 47 41 49 4E 39 40 BC C3 EF 3F
-28 CC 85 57 48 49 4C 45 87 12 CA CD 6E C2 2A C2
-C0 CC 86 52 45 50 45 41 54 00 87 12 4A CE 0C CE
-2A C2 E4 CD 82 44 4F 00 2F 83 8F 4E 00 00 1E 42
-C4 1D BE 40 CA C3 00 00 2E 53 82 4E C4 1D A2 53
-00 1C 1A 42 00 1C 8A 43 00 00 30 4D B4 C9 84 4C
-4F 4F 50 00 39 40 EC C3 1A 42 C4 1D A2 52 C4 1D
-8A 49 00 00 8A 4E 02 00 1E 42 00 1C A2 83 00 1C
-2E 4E 0E 93 04 24 9E 42 C4 1D 00 00 F5 3F 3E 4F
-30 4D E4 C5 85 2B 4C 4F 4F 50 39 40 DA C3 E4 3F
-9E CE 85 4C 45 41 56 45 1A 42 C4 1D BA 40 FC C3
-00 00 BA 40 BC C3 02 00 B2 50 06 00 C4 1D A2 53
-00 1C 2A 52 19 42 00 1C 89 4A 00 00 30 4D E2 CE
-04 4D 4F 56 45 00 0A 4E 38 4F 39 4F 3E 4F 0A 93
-11 24 08 99 0F 24 06 2C F8 49 00 00 18 53 1A 83
-FB 23 30 4D 08 5A 09 5A 19 83 18 83 E8 49 00 00
-1A 83 FA 23 30 4D 34 C2 CA 1D FC C2 2A C2 84 12
-46 CF 58 D2 2E D2 74 CE A2 CB 16 D2 D4 CE 10 CF
-AE C7 B4 CF E8 CF 24 CE AE D0 48 C3 4E CD B6 CC
-86 C8 00 00 3A 40 0C 00 39 40 CA 1D 38 40 CC 1D
-D9 3F 3A 40 0E 00 39 40 CC 1D 38 40 CA 1D CC 3F
-82 43 CC 1D 30 4D 92 42 CA 1D C8 1D 30 4D 62 CD
-09 50 57 52 5F 53 54 41 54 45 84 12 90 CD 12 D2
-5C D9 A0 CF 08 50 57 52 5F 48 45 52 45 00 92 42
-C4 1D B0 CF 92 42 C6 1D AE CF EF 3F 62 CE 09 52
-53 54 5F 53 54 41 54 45 92 42 0C 18 B0 CF 92 42
-0E 18 AE CF E2 3F CE CF 08 52 53 54 5F 48 45 52
-45 00 92 42 C4 1D 0C 18 92 42 C6 1D 0E 18 DF 3F
-B2 40 54 D0 B6 D0 B2 40 64 C6 58 C6 B2 40 BE C6
-CE C6 B2 40 FA C6 0E C7 B2 40 DC C5 EA C5 30 41
-52 CE 04 57 49 50 45 00 39 40 80 FF B9 43 00 00
-29 53 39 90 CE FF FA 23 B0 12 00 D0 B2 40 5C D9
-C4 1D B2 40 12 D2 C6 1D D4 3F C6 CD 06 28 57 41
-52 4D 29 00 1E 42 08 18 87 12 6C C7 05 0D 1B 5B
-37 6D 50 C7 70 C5 6C C7 27 20 46 61 73 74 46 6F
-72 74 68 20 56 31 36 30 20 32 34 4D 48 7A 20 28
+00 00 30 4D AA C7 87 52 45 43 55 52 53 45 19 42
+C4 1D 99 42 B2 1D 00 00 A2 53 C4 1D 30 4D AA CA
+88 50 4F 53 54 50 4F 4E 45 00 87 12 90 C4 EE C7
+46 C8 54 C2 E0 C3 AE CB 92 C3 E0 C3 6A CC 34 C2
+34 C2 CA C9 CA C9 34 C2 CA C9 CA C9 2A C2 82 9F
+B4 1D A0 24 87 12 94 C7 0F 73 74 61 63 6B 20 6D
+69 73 6D 61 74 63 68 21 30 CB 87 12 CA C7 90 C4
+EE C7 94 CC 08 4E 7A 4E 5A D3 5A 53 0A 58 19 42
+C8 1D 6E 4E 3E F0 1E 00 09 5E 82 48 AE 1D 82 49
+B0 1D 82 4A B2 1D 2A 52 82 4A C4 1D 3E 4F 3D 41
+30 41 E8 C7 08 56 41 52 49 41 42 4C 45 00 B0 12
+8A CC BA 40 86 12 FC FF 71 3C 0C CA 08 43 4F 4E
+53 54 41 4E 54 00 B0 12 8A CC BA 40 85 12 FC FF
+8A 4E FE FF 3E 4F 62 3C DC CC 06 43 52 45 41 54
+45 00 B0 12 8A CC BA 40 85 12 FC FF 8A 4A FE FF
+55 3C 7A CA 05 44 4F 45 53 3E 1A 42 B2 1D BA 40
+84 12 00 00 8A 4D 02 00 3D 41 30 4D 14 CD 05 44
+45 46 45 52 B0 12 8A CC BA 40 30 40 FC FF BA 40
+2A CD FE FF 3B 3C D2 CB 01 3A B0 12 8A CC BA 40
+87 12 FC FF A2 83 C4 1D B2 43 B6 1D 82 4F B4 1D
+30 4D 48 CD 81 3B 82 93 B6 1D 24 27 87 12 34 C2
+2A C2 CA C9 6E CC C0 CB 2A C2 7C CD 3D 41 B2 4E
+0E 18 A2 4E 0C 18 3E 4F 32 3D DC C9 06 4D 41 52
+4B 45 52 00 B0 12 8A CC BA 40 84 12 FC FF BA 40
+7A CD FE FF 9A 42 C6 1D 00 00 28 83 8A 48 02 00
+A2 52 C4 1D 18 42 AE 1D 19 42 B0 1D A8 49 FE FF
+89 48 00 00 30 4D 0E CC 82 49 46 00 2F 83 8F 4E
+00 00 1E 42 C4 1D A2 52 C4 1D BE 40 E0 C3 00 00
+2E 53 30 4D 2E CD 84 45 4C 53 45 00 A2 52 C4 1D
+1A 42 C4 1D BA 40 DC C3 FC FF 8E 4A 00 00 2A 83
+0E 4A 30 4D 72 C7 84 54 48 45 4E 00 9E 42 C4 1D
+00 00 3E 4F 30 4D FA CC 85 42 45 47 49 4E 30 40
+A0 C5 06 CE 85 55 4E 54 49 4C 39 40 E0 C3 A2 52
+C4 1D 1A 42 C4 1D 8A 49 FC FF 8A 4E FE FF 3E 4F
+30 4D 88 CB 85 41 47 41 49 4E 39 40 DC C3 EF 3F
+C4 CC 85 57 48 49 4C 45 87 12 CC CD 78 C2 2A C2
+26 CC 86 52 45 50 45 41 54 00 87 12 4A CE 0C CE
+2A C2 E6 CD 82 44 4F 00 2F 83 8F 4E 00 00 A2 53
+C4 1D 1E 42 C4 1D BE 40 F0 C3 FE FF A2 53 00 1C
+1A 42 00 1C 8A 43 00 00 30 4D 8C CD 84 4C 4F 4F
+50 00 39 40 12 C4 A2 52 C4 1D 1A 42 C4 1D 8A 49
+FC FF 8A 4E FE FF 1E 42 00 1C A2 83 00 1C 2E 4E
+0E 93 03 24 8E 4A 00 00 F6 3F 3E 4F 30 4D FC C5
+85 2B 4C 4F 4F 50 39 40 00 C4 E5 3F 9C CE 85 4C
+45 41 56 45 1A 42 C4 1D BA 40 22 C4 00 00 BA 40
+DC C3 02 00 B2 50 06 00 C4 1D A2 53 00 1C 2A 52
+19 42 00 1C 89 4A 00 00 30 4D DE CE 04 4D 4F 56
+45 00 0A 4E 38 4F 39 4F 3E 4F 0A 93 11 24 08 99
+0F 24 06 2C F8 49 00 00 18 53 1A 83 FB 23 30 4D
+08 5A 09 5A 19 83 18 83 E8 49 00 00 1A 83 FA 23
+30 4D 34 C2 CA 1D FA C2 2A C2 84 12 42 CF C8 D3
+9E D3 74 CE 9E CB 86 D3 D0 CE 0C CF D6 C7 FE CF
+18 D0 24 CE 1E D2 46 C3 A4 D1 C8 CB AE C8 00 00
+3A 40 0E 00 39 40 CA 1D 38 40 CC 1D D9 3F 3A 40
+0E 00 39 40 CC 1D 38 40 CA 1D CC 3F 82 43 CC 1D
+30 4D 92 42 CA 1D C8 1D 30 4D 9C CF 3A 4E 82 4A
+C6 1D 2E 4E 82 4E C4 1D 3D 40 10 00 09 4A 08 49
+29 83 18 48 FE FF 0E 98 FC 2B 89 48 00 00 1D 83
+F6 23 2A 4A 0A 93 F0 23 3E 4F 3D 41 30 4D 40 CC
+09 50 57 52 5F 53 54 41 54 45 84 12 9A CF 82 D3
+CA DA 62 CE 09 52 53 54 5F 53 54 41 54 45 92 42
+0E 18 DE CF 92 42 0C 18 E0 CF EF 3F D0 CF 08 50
+57 52 5F 48 45 52 45 00 92 42 C6 1D DE CF 92 42
+C4 1D E0 CF 30 4D E4 CF 08 52 53 54 5F 48 45 52
+45 00 92 42 C6 1D 0E 18 92 42 C4 1D 0C 18 EC 3F
+B2 40 C4 D1 26 D2 B2 40 8C C6 80 C6 B2 40 E6 C6
+F6 C6 B2 40 22 C7 36 C7 B2 40 F4 C5 02 C6 82 43
+44 DA 82 43 50 DA 82 43 5C DA 82 43 8C DA 82 43
+98 DA 82 43 A4 DA 30 41 52 CE 04 57 49 50 45 00
+39 40 80 FF B9 43 00 00 29 53 39 90 CE FF FA 23
+B0 12 30 D0 B2 40 CA DA 0C 18 B2 40 82 D3 0E 18
+AE 3F 18 CE 07 43 4F 4D 50 41 52 45 0C 4E 38 4F
+3B 4F 39 4F 0E 4B 0E 5C 0C 24 1B 83 07 30 1C 83
+07 30 19 53 F9 98 FF FF F5 27 02 2C 3E 43 30 4D
+1E 43 30 4D 64 CD 86 5B 54 48 45 4E 5D 00 30 4D
+1E 83 30 4D C6 D0 86 5B 45 4C 53 45 5D 00 87 12
+34 C2 01 00 90 C4 EE C7 12 CA 44 C2 E0 C3 4C D1
+8A C2 8A C2 94 C7 04 5B 49 46 5D 00 9C D0 EA C3
+0A D1 A6 C8 2C C3 DC C3 40 D1 8A C2 8A C2 94 C7
+06 5B 45 4C 53 45 5D 00 9C D0 EA C3 2E D1 A6 C8
+D0 D0 44 C2 E0 C3 2A D1 2C C3 DC C3 40 D1 94 C7
+06 5B 54 48 45 4E 5D 00 9C D0 EA C3 40 D1 D0 D0
+54 C2 EA C3 48 D1 2A C2 DC C3 E4 D0 A6 C8 94 C7
+03 0D 6B 6F 78 C7 40 C7 5A C4 44 C2 64 C4 0E C6
+62 D1 82 43 C2 1D 82 4E BE 1D B2 4F C0 1D 3E 4F
+3D 40 E4 D0 30 4D D6 D0 84 5B 49 46 5D 00 0E 93
+3E 4F AD 27 30 4D 78 D1 8B 5B 55 4E 44 45 46 49
+4E 45 44 5D 87 12 90 C4 EE C7 46 C8 6C C2 86 C3
+2A C2 88 D1 89 5B 44 45 46 49 4E 45 44 5D 87 12
+90 C4 EE C7 46 C8 6C C2 2A C2 C8 CD 06 28 57 41
+52 4D 29 00 1E 42 08 18 87 12 94 C7 05 0D 1B 5B
+37 6D 78 C7 8A C5 94 C7 27 20 46 61 73 74 46 6F
+72 74 68 20 56 31 36 32 20 32 34 4D 48 7A 20 28
43 29 20 4A 2E 4D 2E 54 68 6F 6F 72 65 6E 73 20
-50 C7 34 C2 30 FF 84 C5 2A C3 30 C5 6C C7 0B 62
-79 74 65 73 20 66 72 65 65 20 26 CB 22 D0 04 57
-41 52 4D 00 30 40 54 D0 18 CE 04 43 4F 4C 44 00
+78 C7 34 C2 30 FF A0 C5 28 C3 56 C5 94 C7 0B 62
+79 74 65 73 20 66 72 65 65 20 36 CB 6A D0 04 57
+41 52 4D 00 30 40 C4 D1 94 D0 04 43 4F 4C 44 00
B2 40 04 A5 20 01 92 D3 30 01 B2 40 88 5A 5C 01
F2 D0 10 00 16 02 B2 D0 00 84 04 02 B2 D0 FF 7F
06 02 B2 40 FF 7F 02 02 F2 D0 07 00 36 02 B2 D0
92 D2 9E 01 08 18 A2 93 08 18 01 24 59 07 38 40
C2 A2 18 83 FE 23 19 83 FA 23 B2 D2 B0 01 92 C3
B0 01 F2 D0 10 00 2A 03 F2 C0 40 00 A1 04 3A 40
-C6 D0 39 40 CE FF 89 4A 00 00 29 53 FC 23 92 42
+36 D2 39 40 CE FF 89 4A 00 00 29 53 FC 23 92 42
02 18 F0 FF B2 40 18 00 0A 18 31 40 E0 1C 3F 40
-80 1C 37 40 00 C2 36 40 B4 C2 35 40 08 C2 34 40
+80 1C 37 40 00 C2 36 40 BC C2 35 40 08 C2 34 40
14 C2 B2 40 0A 00 DA 1D B2 43 AC 1D 92 C3 30 01
18 42 08 18 D2 B3 01 02 04 20 38 E3 18 53 82 48
08 18 B2 40 81 00 C0 05 B2 40 0D 00 C6 05 B2 40
01 49 C8 05 F2 D0 03 00 0D 02 92 C3 C0 05 92 D3
-DA 05 3D 40 EC D1 18 42 08 18 38 90 0A 00 24 27
-38 90 16 00 21 2F 28 93 F7 22 DF 26 B4 D0 84 12
-46 CF 3A D8 E6 D8 EE D7 3A D9 B4 D7 6E D8 B8 D4
-00 00 AA D7 5A D8 0C D8 4A D8 C8 D5 00 00 00 00
-4C D9 72 CF 4C D0 85 48 49 32 4C 4F 87 12 84 C5
-DE CD A2 C9 AE CC 74 CF EE D1 2A C2 BA D0 04 43
-4F 44 45 00 B0 12 C0 CB A2 82 C4 1D 87 12 EE CC
-BC C3 26 D2 00 00 07 45 4E 44 43 4F 44 45 87 12
-82 CF 0E CC 2A C2 44 CE 03 41 53 4D 92 42 C8 1D
-B8 1D B2 40 F2 D1 C8 1D E5 3F 46 D2 06 45 4E 44
+DA 05 3D 40 5C D3 18 42 08 18 38 90 0A 00 90 26
+38 90 16 00 8D 2E 28 93 4A 22 3F 26 24 D2 84 12
+42 CF A8 D9 54 DA 5C D9 A8 DA 22 D9 DC D9 26 D6
+00 00 18 D9 C8 D9 7A D9 B8 D9 36 D7 00 00 00 00
+BA DA 6E CF BC D1 85 48 49 32 4C 4F 87 12 A0 C5
+E0 CD CA C9 C0 CB 70 CF 5E D3 2A C2 2A D2 04 43
+4F 44 45 00 B0 12 8A CC A2 82 C4 1D 87 12 5C CD
+DC C3 96 D3 00 00 07 45 4E 44 43 4F 44 45 87 12
+7E CF 6E CC 2A C2 44 CE 03 41 53 4D 92 42 C8 1D
+B8 1D B2 40 62 D3 C8 1D E5 3F B6 D3 06 45 4E 44
41 53 4D 00 92 42 B8 1D C8 1D E9 3F 00 00 05 43
4F 4C 4F 4E 1A 42 C4 1D BA 40 87 12 00 00 A2 53
-C4 1D B2 43 B6 1D 30 40 82 CF 00 00 05 4C 4F 32
+C4 1D B2 43 B6 1D 30 40 7E CF 00 00 05 4C 4F 32
48 49 1A 42 C4 1D BA 40 B0 12 00 00 BA 40 2A C2
02 00 A2 52 C4 1D ED 3F 38 40 BE 1D 39 48 2A 48
09 5A 1A 52 C2 1D 09 9A 03 24 7E 9A FC 27 1A 83
-0E 4A 2A 88 82 4A C2 1D 30 4D B0 12 2A C2 C6 C7
-1E C8 72 C3 C0 C3 F0 D2 DA C8 C0 C3 B2 CB 12 D3
-F2 D2 29 4E 39 90 86 12 02 20 2E 53 30 41 39 90
-85 12 03 20 1E 4E 02 00 30 41 39 90 84 12 01 20
-2E 52 30 41 19 42 C4 1D A2 53 C4 1D 89 4E 00 00
-3E 40 29 00 12 12 C2 1D 92 53 C2 1D B0 12 2A C2
-C6 C7 DA C8 C0 C3 44 D3 3A D3 21 53 3E 90 10 00
-BB 2D 30 41 46 D3 B2 41 C2 1D 22 D3 30 41 87 12
-4C C4 B8 D2 56 D3 82 43 BC 1D 92 42 C4 1D BA 1D
-A2 53 C4 1D 0A 4E 3E 4F FA 90 23 00 00 00 34 20
-92 53 C2 1D B0 12 DA D2 0E 93 04 20 B2 40 00 03
-BC 1D 27 3C 1E 93 04 20 B2 40 10 03 BC 1D 21 3C
-2E 93 04 20 B2 40 20 03 BC 1D 1B 3C 2E 92 04 20
-B2 40 20 02 BC 1D 15 3C 3E 92 04 20 B2 40 30 02
-BC 1D 0F 3C 3E 93 04 20 B2 40 30 03 BC 1D 09 3C
-B2 40 30 00 BC 1D 19 42 C4 1D A2 53 C4 1D 89 4E
-00 00 3E 4F 3D 41 30 4D FA 90 26 00 00 00 08 20
-B2 40 10 02 BC 1D 92 53 C2 1D 30 12 C6 D3 75 3F
-FA 90 40 00 00 00 1A 20 B2 40 20 00 BC 1D 92 53
-C2 1D B0 12 24 D3 0E 20 B2 50 10 00 BC 1D 3E 40
-2B 00 B0 12 24 D3 32 24 92 92 BE 1D C2 1D 02 24
-92 53 C2 1D 8E 10 82 5E BC 1D D3 3F B0 12 24 D3
-F9 23 B2 50 10 00 BC 1D 3E 40 28 00 B0 12 DA D2
-30 12 16 D4 67 3F 87 12 4C C4 B8 D2 4E D4 FE 90
-26 00 00 00 3E 40 20 00 04 20 B2 50 82 00 BC 1D
-C2 3F B0 12 24 D3 DF 23 B2 50 80 00 BC 1D 3E 40
-28 00 B0 12 DA D2 B0 12 14 D3 D5 23 3D 40 B2 CB
-30 4D 50 C6 04 52 45 54 49 00 87 12 34 C2 00 13
-A2 C9 2A C2 34 C2 2C 00 4E D3 46 D4 9E D4 2E 4E
-1E D2 BC 1D 19 42 BA 1D 92 3F 9C D2 03 4D 4F 56
-84 12 94 D4 00 40 AC D4 05 4D 4F 56 2E 42 84 12
-94 D4 40 40 00 00 03 41 44 44 84 12 94 D4 00 50
-C6 D4 05 41 44 44 2E 42 84 12 94 D4 40 50 D2 D4
-04 41 44 44 43 00 84 12 94 D4 00 60 E0 D4 06 41
-44 44 43 2E 42 00 84 12 94 D4 40 60 84 D4 04 53
-55 42 43 00 84 12 94 D4 00 70 FE D4 06 53 55 42
-43 2E 42 00 84 12 94 D4 40 70 0C D5 03 53 55 42
-84 12 94 D4 00 80 1C D5 05 53 55 42 2E 42 84 12
-94 D4 40 80 7E D2 03 43 4D 50 84 12 94 D4 00 90
-36 D5 05 43 4D 50 2E 42 84 12 94 D4 40 90 6C D2
-04 44 41 44 44 00 84 12 94 D4 00 A0 50 D5 06 44
-41 44 44 2E 42 00 84 12 94 D4 40 A0 42 D5 03 42
-49 54 84 12 94 D4 00 B0 6E D5 05 42 49 54 2E 42
-84 12 94 D4 40 B0 7A D5 03 42 49 43 84 12 94 D4
-00 C0 88 D5 05 42 49 43 2E 42 84 12 94 D4 40 C0
-94 D5 03 42 49 53 84 12 94 D4 00 D0 A2 D5 05 42
-49 53 2E 42 84 12 94 D4 40 D0 00 00 03 58 4F 52
-84 12 94 D4 00 E0 BC D5 05 58 4F 52 2E 42 84 12
-94 D4 40 E0 EE D4 03 41 4E 44 84 12 94 D4 00 F0
-D6 D5 05 41 4E 44 2E 42 84 12 94 D4 40 F0 4C C4
-4E D3 F4 D5 1A 42 BC 1D B2 F0 70 00 BC 1D 8A 10
-3A F0 0F 00 82 DA BC 1D 4A 3F 28 D5 03 52 52 43
-84 12 EE D5 00 10 0C D6 05 52 52 43 2E 42 84 12
-EE D5 40 10 18 D6 04 53 57 50 42 00 84 12 EE D5
-80 10 26 D6 03 52 52 41 84 12 EE D5 00 11 34 D6
-05 52 52 41 2E 42 84 12 EE D5 40 11 40 D6 03 53
-58 54 84 12 EE D5 80 11 00 00 04 50 55 53 48 00
-84 12 EE D5 00 12 5A D6 06 50 55 53 48 2E 42 00
-84 12 EE D5 40 12 AE D5 04 43 41 4C 4C 00 84 12
-EE D5 80 12 34 C2 2C 00 4E D3 46 D4 8E D6 59 42
-BC 1D 5A 42 BD 1D 82 4A BC 1D BE 90 00 15 00 00
-02 20 0A 89 02 3C 09 8A 0A 49 3A 90 10 00 03 2C
-5A 0E A8 3F 1A 53 0E 4A 87 12 70 C5 6C C7 0D 6F
-75 74 20 6F 66 20 62 6F 75 6E 64 73 20 CB 68 D6
-05 50 55 53 48 4D 84 12 84 D6 00 15 D0 D6 04 50
-4F 50 4D 00 84 12 84 D6 00 17 4C C4 B8 D2 F0 D6
-82 43 BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D 92 53
-C2 1D 3E 40 2C 00 B0 12 2A C2 C6 C7 DA C8 C0 C3
-B2 CB 46 D4 16 D7 0A 4E 3E 4F 1A 83 2A 92 CA 2F
-8A 10 5A 06 6F 3F 4E D6 04 52 52 43 4D 00 84 12
-EA D6 50 00 28 D7 04 52 52 41 4D 00 84 12 EA D6
-50 01 36 D7 04 52 4C 41 4D 00 84 12 EA D6 50 02
-44 D7 04 52 52 55 4D 00 84 12 EA D6 50 03 85 12
-00 3C 52 D7 03 53 3E 3D 85 12 00 38 64 D7 02 53
-3C 00 85 12 00 34 DE D6 03 30 3E 3D 85 12 00 30
-78 D7 02 30 3C 00 85 12 00 30 00 00 02 55 3C 00
-85 12 00 2C 8C D7 03 55 3E 3D 85 12 00 28 82 D7
-03 30 3C 3E 85 12 00 24 A0 D7 02 30 3D 00 85 12
-00 20 5C C6 02 49 46 00 1A 42 C4 1D 8A 4E 00 00
-A2 53 C4 1D 0E 4A 30 4D 96 D7 04 54 48 45 4E 00
-1A 42 C4 1D 08 4E 3E 4F 09 48 29 53 0A 89 0A 11
-3A 90 00 02 68 2F 88 DA 00 00 30 4D 5E D5 04 45
-4C 53 45 00 1A 42 C4 1D BA 40 00 3C 00 00 A2 53
-C4 1D 2F 83 8F 4A 00 00 E3 3F CA D7 05 55 4E 54
-49 4C 3A 4F 08 4E 3E 4F 19 42 C4 1D 2A 83 0A 89
-0A 11 3A 90 00 FE 47 3B 3A F0 FF 03 08 DA 89 48
-00 00 A2 53 C4 1D 30 4D E2 D5 05 41 47 41 49 4E
-87 12 5E D7 12 D8 2A C2 00 00 05 57 48 49 4C 45
-87 12 B8 D7 6E C2 2A C2 6E D7 06 52 45 50 45 41
-54 00 87 12 5E D7 12 D8 D0 D7 2A C2 00 00 03 4A
-4D 50 87 12 A4 CB 5E D7 12 D8 2A C2 3E B0 00 10
-03 20 3E E0 00 04 30 4D 3E 90 00 34 06 28 03 24
-3E 40 00 34 30 4D 3E 40 00 38 30 4D 00 00 04 3F
-4A 4D 50 00 87 12 7C D8 A4 CB 6E C2 12 D8 2A C2
-B2 D8 3D 41 08 4E 3E 4F 2A 48 0A 93 04 20 98 42
-C4 1D 00 00 30 4D 88 43 00 00 A4 3F 78 D6 03 42
-57 31 84 12 B0 D8 00 00 CE D8 03 42 57 32 84 12
-B0 D8 00 00 DA D8 03 42 57 33 84 12 B0 D8 00 00
-F2 D8 3D 41 1A 42 C4 1D 28 4E 08 93 08 20 BA 4F
-00 00 A2 53 C4 1D 8E 4A 00 00 3E 4F 30 4D 8E 43
-00 00 61 3F 00 00 03 46 57 31 84 12 F0 D8 00 00
-16 D9 03 46 57 32 84 12 F0 D8 00 00 22 D9 03 46
-57 33 84 12 F0 D8 00 00 2E D9 04 47 4F 54 4F 00
-87 12 5E D7 A4 CB 98 C9 2A C2 9E D8 05 3F 47 4F
-54 4F 87 12 7C D8 A4 CB 98 C9 2A C2
+0E 4A 2A 88 82 4A C2 1D 30 4D B0 12 2A C2 EE C7
+46 C8 EA C3 5E D4 02 C9 E0 C3 AE CB 80 D4 60 D4
+29 4E 39 90 86 12 02 20 2E 53 30 41 39 90 85 12
+03 20 1E 4E 02 00 30 41 39 90 84 12 01 20 2E 52
+30 41 19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 40
+29 00 12 12 C2 1D 92 53 C2 1D B0 12 2A C2 EE C7
+02 C9 E0 C3 B2 D4 A8 D4 21 53 3E 90 10 00 BB 2D
+30 41 B4 D4 B2 41 C2 1D 22 D3 30 41 87 12 90 C4
+28 D4 C4 D4 82 43 BC 1D 92 42 C4 1D BA 1D A2 53
+C4 1D 0A 4E 3E 4F FA 90 23 00 00 00 34 20 92 53
+C2 1D B0 12 4A D4 0E 93 04 20 B2 40 00 03 BC 1D
+27 3C 1E 93 04 20 B2 40 10 03 BC 1D 21 3C 2E 93
+04 20 B2 40 20 03 BC 1D 1B 3C 2E 92 04 20 B2 40
+20 02 BC 1D 15 3C 3E 92 04 20 B2 40 30 02 BC 1D
+0F 3C 3E 93 04 20 B2 40 30 03 BC 1D 09 3C B2 40
+30 00 BC 1D 19 42 C4 1D A2 53 C4 1D 89 4E 00 00
+3E 4F 3D 41 30 4D FA 90 26 00 00 00 08 20 B2 40
+10 02 BC 1D 92 53 C2 1D 30 12 34 D5 76 3F FA 90
+40 00 00 00 1A 20 B2 40 20 00 BC 1D 92 53 C2 1D
+B0 12 92 D4 0E 20 B2 50 10 00 BC 1D 3E 40 2B 00
+B0 12 92 D4 32 24 92 92 BE 1D C2 1D 02 24 92 53
+C2 1D 8E 10 82 5E BC 1D D3 3F B0 12 92 D4 F9 23
+B2 50 10 00 BC 1D 3E 40 28 00 B0 12 4A D4 30 12
+84 D5 67 3F 87 12 90 C4 28 D4 BC D5 FE 90 26 00
+00 00 3E 40 20 00 04 20 B2 50 82 00 BC 1D C2 3F
+B0 12 92 D4 DF 23 B2 50 80 00 BC 1D 3E 40 28 00
+B0 12 4A D4 B0 12 82 D4 D5 23 3D 40 AE CB 30 4D
+78 C6 04 52 45 54 49 00 87 12 34 C2 00 13 CA C9
+2A C2 34 C2 2C 00 BC D4 B4 D5 0C D6 2E 4E 1E D2
+BC 1D 19 42 BA 1D 92 3F 0C D4 03 4D 4F 56 84 12
+02 D6 00 40 1A D6 05 4D 4F 56 2E 42 84 12 02 D6
+40 40 00 00 03 41 44 44 84 12 02 D6 00 50 34 D6
+05 41 44 44 2E 42 84 12 02 D6 40 50 40 D6 04 41
+44 44 43 00 84 12 02 D6 00 60 4E D6 06 41 44 44
+43 2E 42 00 84 12 02 D6 40 60 F2 D5 04 53 55 42
+43 00 84 12 02 D6 00 70 6C D6 06 53 55 42 43 2E
+42 00 84 12 02 D6 40 70 7A D6 03 53 55 42 84 12
+02 D6 00 80 8A D6 05 53 55 42 2E 42 84 12 02 D6
+40 80 EE D3 03 43 4D 50 84 12 02 D6 00 90 A4 D6
+05 43 4D 50 2E 42 84 12 02 D6 40 90 DC D3 04 44
+41 44 44 00 84 12 02 D6 00 A0 BE D6 06 44 41 44
+44 2E 42 00 84 12 02 D6 40 A0 B0 D6 03 42 49 54
+84 12 02 D6 00 B0 DC D6 05 42 49 54 2E 42 84 12
+02 D6 40 B0 E8 D6 03 42 49 43 84 12 02 D6 00 C0
+F6 D6 05 42 49 43 2E 42 84 12 02 D6 40 C0 02 D7
+03 42 49 53 84 12 02 D6 00 D0 10 D7 05 42 49 53
+2E 42 84 12 02 D6 40 D0 00 00 03 58 4F 52 84 12
+02 D6 00 E0 2A D7 05 58 4F 52 2E 42 84 12 02 D6
+40 E0 5C D6 03 41 4E 44 84 12 02 D6 00 F0 44 D7
+05 41 4E 44 2E 42 84 12 02 D6 40 F0 90 C4 BC D4
+62 D7 1A 42 BC 1D B2 F0 70 00 BC 1D 8A 10 3A F0
+0F 00 82 DA BC 1D 4A 3F 96 D6 03 52 52 43 84 12
+5C D7 00 10 7A D7 05 52 52 43 2E 42 84 12 5C D7
+40 10 86 D7 04 53 57 50 42 00 84 12 5C D7 80 10
+94 D7 03 52 52 41 84 12 5C D7 00 11 A2 D7 05 52
+52 41 2E 42 84 12 5C D7 40 11 AE D7 03 53 58 54
+84 12 5C D7 80 11 00 00 04 50 55 53 48 00 84 12
+5C D7 00 12 C8 D7 06 50 55 53 48 2E 42 00 84 12
+5C D7 40 12 1C D7 04 43 41 4C 4C 00 84 12 5C D7
+80 12 34 C2 2C 00 BC D4 B4 D5 FC D7 59 42 BC 1D
+5A 42 BD 1D 82 4A BC 1D BE 90 00 15 00 00 02 20
+0A 89 02 3C 09 8A 0A 49 3A 90 10 00 03 2C 5A 0E
+A8 3F 1A 53 0E 4A 87 12 8A C5 94 C7 0D 6F 75 74
+20 6F 66 20 62 6F 75 6E 64 73 30 CB D6 D7 05 50
+55 53 48 4D 84 12 F2 D7 00 15 3E D8 04 50 4F 50
+4D 00 84 12 F2 D7 00 17 90 C4 28 D4 5E D8 82 43
+BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D 92 53 C2 1D
+3E 40 2C 00 B0 12 2A C2 EE C7 02 C9 E0 C3 AE CB
+B4 D5 84 D8 0A 4E 3E 4F 1A 83 2A 92 CA 2F 8A 10
+5A 06 6F 3F BC D7 04 52 52 43 4D 00 84 12 58 D8
+50 00 96 D8 04 52 52 41 4D 00 84 12 58 D8 50 01
+A4 D8 04 52 4C 41 4D 00 84 12 58 D8 50 02 B2 D8
+04 52 52 55 4D 00 84 12 58 D8 50 03 85 12 00 3C
+C0 D8 03 53 3E 3D 85 12 00 38 D2 D8 02 53 3C 00
+85 12 00 34 4C D8 03 30 3E 3D 85 12 00 30 E6 D8
+02 30 3C 00 85 12 00 30 00 00 02 55 3C 00 85 12
+00 2C FA D8 03 55 3E 3D 85 12 00 28 F0 D8 03 30
+3C 3E 85 12 00 24 0E D9 02 30 3D 00 85 12 00 20
+84 C6 02 49 46 00 1A 42 C4 1D 8A 4E 00 00 A2 53
+C4 1D 0E 4A 30 4D 04 D9 04 54 48 45 4E 00 1A 42
+C4 1D 08 4E 3E 4F 09 48 29 53 0A 89 0A 11 3A 90
+00 02 68 2F 88 DA 00 00 30 4D CC D6 04 45 4C 53
+45 00 1A 42 C4 1D BA 40 00 3C 00 00 A2 53 C4 1D
+2F 83 8F 4A 00 00 E3 3F 38 D9 05 55 4E 54 49 4C
+3A 4F 08 4E 3E 4F 19 42 C4 1D 2A 83 0A 89 0A 11
+3A 90 00 FE 47 3B 3A F0 FF 03 08 DA 89 48 00 00
+A2 53 C4 1D 30 4D 50 D7 05 41 47 41 49 4E 87 12
+CC D8 80 D9 2A C2 00 00 05 57 48 49 4C 45 87 12
+26 D9 78 C2 2A C2 DC D8 06 52 45 50 45 41 54 00
+87 12 CC D8 80 D9 3E D9 2A C2 00 00 03 4A 4D 50
+87 12 A0 CB CC D8 80 D9 2A C2 3E B0 00 10 03 20
+3E E0 00 04 30 4D 3E 90 00 34 06 28 03 24 3E 40
+00 34 30 4D 3E 40 00 38 30 4D 00 00 04 3F 4A 4D
+50 00 87 12 EA D9 A0 CB 78 C2 80 D9 2A C2 20 DA
+3D 41 08 4E 3E 4F 2A 48 0A 93 04 20 98 42 C4 1D
+00 00 30 4D 88 43 00 00 A4 3F E6 D7 03 42 57 31
+84 12 1E DA 00 00 3C DA 03 42 57 32 84 12 1E DA
+00 00 48 DA 03 42 57 33 84 12 1E DA 00 00 60 DA
+3D 41 1A 42 C4 1D 28 4E 08 93 08 20 BA 4F 00 00
+A2 53 C4 1D 8E 4A 00 00 3E 4F 30 4D 8E 43 00 00
+61 3F 00 00 03 46 57 31 84 12 5E DA 00 00 84 DA
+03 46 57 32 84 12 5E DA 00 00 90 DA 03 46 57 33
+84 12 5E DA 00 00 9C DA 04 47 4F 54 4F 00 87 12
+CC D8 A0 CB C0 C9 2A C2 0C DA 05 3F 47 4F 54 4F
+87 12 EA D9 A0 CB C0 C9 2A C2
@FFCE
-C6 D0 C6 D0 C6 D0 C6 D0 C6 D0 C6 D0 C6 D0 C6 D0
-C6 D0 C6 D0 C6 D0 C6 D0 C6 D0 C6 D0 C6 D0 C6 D0
-C6 D0 6A C6 C6 D0 C6 D0 C6 D0 C6 D0 C6 D0 C6 D0
-C6 D0
+36 D2 36 D2 36 D2 36 D2 36 D2 36 D2 36 D2 36 D2
+36 D2 36 D2 36 D2 36 D2 36 D2 36 D2 36 D2 36 D2
+36 D2 92 C6 36 D2 36 D2 36 D2 36 D2 36 D2 36 D2
+36 D2
q
+++ /dev/null
-@1800
-10 00 6A C6 C0 5D 30 75 FD FF 18 00 58 D9 0E D2
-2A C6 3C C6 00 00 00 00
-@1DAA
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00
-@C200
-3A 41 0D 12 0D 4A 30 4D 2F 83 8F 4E 00 00 3E 41
-2E 4E 30 4D 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E
-30 4D 00 00 04 45 58 49 54 00 3D 41 30 4D 00 00
-03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 C2
-03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
-44 55 50 00 0E 93 F6 23 30 4D 40 C2 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 C2 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E C2 02 3E 52 00 0E 12 3E 4F 30 4D 8E C2
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 C2
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C C2 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 C2 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 C3
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 C2 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA C2 03 41 4E 44 3E FF 30 4D 7A C2 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E C3 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 C3 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E C3 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 C3 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 C2 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
-3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE C3 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 C3 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 C3 03 3E 49 4E 85 12 C2 1D 10 C3
-04 42 41 53 45 00 85 12 DA 1D C0 C2 05 53 54 41
-54 45 85 12 B6 1D 30 C4 02 42 4C 00 85 12 20 00
-94 C3 02 3C 23 00 B2 40 AA 1D AA 1D 30 4D 1E 15
-0E 43 3D 40 20 00 0A 93 04 20 0D 11 0A 4C 0C 43
-09 43 0E 9B 01 28 0E 8B 09 69 08 68 1D 83 07 30
-0C 5C 0A 6A 0E 6E F5 2B 0E 8B 12 D3 F5 3F 0A 4E
-1D 17 30 41 48 C4 01 23 1B 42 DA 1D 2C 4F 0A 4E
-B0 12 5E C4 8F 49 00 00 0E 48 7A 90 0A 00 02 28
-3A 50 07 00 3A 50 30 00 92 83 AA 1D 18 42 AA 1D
-C8 4A 00 00 30 4D 96 C4 02 23 53 00 87 12 98 C4
-D2 C4 2D 83 09 93 E0 23 0E 93 DE 23 3D 41 30 4D
-C8 C4 02 23 3E 00 9F 42 AA 1D 00 00 3E 40 AA 1D
-2E 8F 30 4D 00 C4 04 48 4F 4C 44 00 0A 4E 3E 4F
-DB 3F 3C C4 04 53 49 47 4E 00 0E 93 3E 4F 3A 40
-2D 00 D2 33 30 4D F4 C3 03 55 44 2E 87 12 56 C4
-CC C4 E6 C4 50 C7 18 C7 2A C2 18 C5 02 55 2E 00
-2F 83 8F 4E 00 00 0E 43 F1 3F 3E B0 00 80 06 24
-BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D DA C2
-02 44 2E 00 87 12 56 C4 6E C2 80 C2 3A C5 CC C4
-92 C2 0A C5 E6 C4 50 C7 18 C7 2A C2 52 C3 01 2E
-3E B0 00 80 DD 27 2F 83 3E 43 EC 3F F6 C4 04 48
-45 52 45 00 2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D
-62 C3 05 41 4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D
-E2 C4 02 43 2C 00 1A 42 C4 1D CA 4E 00 00 92 53
-C4 1D 3E 4F 30 4D 2F 83 8F 4E 00 00 B0 12 2A C6
-92 B3 DC 05 FD 27 1E 42 CC 05 B0 12 3C C6 30 4D
-30 40 B6 C5 7E C5 05 28 4B 45 59 29 18 42 CC 05
-EA 3F 12 C4 03 4B 45 59 30 40 DC C5 92 C5 06 41
-43 43 45 50 54 00 3C 40 A8 C6 3B 40 72 C6 2D 15
-0A 4E 2E 4F 0A 5E 3B 40 0D 00 3C 40 20 00 3D 40
-9C C6 92 B3 DC 05 05 24 18 42 CC 05 38 90 0A 00
-04 20 21 53 39 40 56 C6 4D 15 B2 40 11 00 CE 05
-A2 B3 DC 05 FD 27 E2 C2 03 02 30 41 B2 40 13 00
-CE 05 A2 B3 DC 05 FD 27 E2 D2 03 02 30 41 00 00
-05 53 4C 45 45 50 30 40 64 C6 00 00 07 28 53 4C
-45 45 50 29 12 D2 0A 18 F6 3F 21 52 3A 17 58 42
-CC 05 48 9B E3 27 48 9C 06 2C 78 92 11 20 2E 9F
-0F 24 1E 83 05 3C 0E 9A 03 24 CE 48 00 00 1E 53
-82 48 CE 05 A2 B3 DC 05 FD 27 30 4D 9E C6 2D 83
-92 B3 DC 05 FD 27 E3 23 B2 40 18 00 0A 18 3E 8F
-3D 41 30 4D D6 C5 06 28 45 4D 49 54 29 00 08 4E
-3E 4F E6 3F 50 C5 04 45 4D 49 54 00 30 40 BE C6
-C6 C6 04 45 43 48 4F 00 B2 40 82 48 90 C6 30 4D
-6E C5 06 4E 4F 45 43 48 4F 00 B2 40 30 4D 90 C6
-30 4D B6 C6 04 28 43 52 29 00 2F 83 8F 4E 00 00
-3E 40 0D 00 E3 3F A2 C5 02 43 52 00 30 40 FA C6
-04 C5 05 53 50 41 43 45 2F 83 8F 4E 00 00 3E 40
-20 00 D4 3F 12 C7 06 53 50 41 43 45 53 00 0E 93
-09 24 0D 12 3D 40 3A C7 EF 3F 3C C7 2D 83 1E 83
-EB 23 3D 41 3E 4F 30 4D 2C C5 04 54 59 50 45 00
-0E 93 95 24 2A 4F 8F 5E 00 00 0E 4A 87 12 CA C3
-02 C4 0A C3 CC C6 EC C3 60 C7 2A C2 2F 82 8F 4E
-02 00 7E 4D 8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D
-26 C7 82 53 22 00 87 12 34 C2 6C C7 A2 C9 34 C2
-22 00 C6 C7 96 C7 3D 41 6E 4E 1E 83 82 5E C4 1D
-3E 4F 92 B3 C4 1D A2 63 C4 1D 30 4D E2 C6 82 2E
-22 00 87 12 86 C7 34 C2 50 C7 A2 C9 2A C2 00 00
-04 57 4F 52 44 00 3C 40 BE 1D 39 4C 3A 4C 09 5A
-3A 5C 28 4C 09 9A 19 24 7E 9A FC 27 1A 83 3B 40
-60 00 C8 4C 00 00 09 9A 0C 24 7C 4A 4E 9C 09 24
-18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F 7C 80 20 00
-F0 3F 1A 82 C0 1D 82 4A C2 1D 1E 42 C4 1D 08 8E
-CE 48 00 00 30 4D 00 00 04 46 49 4E 44 00 2F 83
-0C 4E 65 4C 74 40 80 00 3B 40 CA 1D 3E 4B 0E 93
-1E 24 58 4C 01 00 78 F0 1E 00 0E 58 2E 53 1E 4E
-FE FF 0E 93 F3 27 09 4E 78 49 48 C4 48 95 F7 23
-0A 4C 1A 53 FA 99 00 00 F2 23 58 83 FA 23 19 B3
-09 63 0C 49 6A 4E 1E 43 4A 93 01 30 2E 83 8F 4C
-00 00 35 40 08 C2 34 40 14 C2 30 4D 2F 53 2F 53
-3E 4F 30 4D 26 C4 07 3E 4E 55 4D 42 45 52 3C 4F
-38 4F 29 4F 2F 82 1B 42 DA 1D 6A 4C 7A 80 30 00
-7A 90 0A 00 02 28 7A 80 07 00 0A 9B 13 2C 82 49
-D0 04 82 48 D2 04 82 4B C8 04 19 42 E4 04 18 42
-E6 04 09 5A 08 63 1C 53 1E 83 E7 23 8F 49 04 00
-8F 48 02 00 8F 4C 00 00 30 4D 03 12 0D 12 1B 42
-DA 1D 0B 12 32 C0 00 02 6D 4E 0D 5E 0C 4E 7A 40
-2E 00 0D 9C 0A 28 7A 9C FC 23 32 D0 00 02 FC 4C
-FE FF 0D 9C FC 2F DE 83 00 00 09 43 08 43 3D 40
-50 C9 3F 82 8F 4E 06 00 0C 4E 7E 4C 6A 4C 7A 90
-2D 00 10 2C 3B 40 10 00 7A 80 24 00 06 24 2B 43
-5A 83 03 24 3B 52 6A 53 B0 23 1C 53 1E 83 6A 4C
-7A 90 2D 00 AA 23 1C 53 1E 83 B1 43 04 00 A5 3F
-52 C9 2F 53 0E 93 2C 17 82 4C DA 1D 03 24 2F 52
-0E F3 30 4D 9F 4F 02 00 04 00 BF 4F 00 00 3E E3
-09 20 3E E3 BF E3 02 00 BF E3 00 00 9F 53 02 00
-8F 63 00 00 32 B0 00 02 01 20 2F 53 30 4D D2 C6
-07 45 58 45 43 55 54 45 0A 4E 3E 4F 00 4A 28 C3
-01 2C 1A 42 C4 1D A2 53 C4 1D 8A 4E 00 00 3E 4F
-30 4D A0 C9 87 4C 49 54 45 52 41 4C 82 93 B6 1D
-16 24 32 B0 00 02 09 24 1A 42 C4 1D A2 52 C4 1D
-BA 40 34 C2 00 00 BA 4F 02 00 1A 42 C4 1D A2 52
-C4 1D BA 40 34 C2 00 00 8A 4E 02 00 3E 4F 30 4D
-08 C7 05 43 4F 55 4E 54 2F 83 1E 53 8F 4E 00 00
-5E 4E FF FF 30 4D 82 4E BE 1D B2 4F C0 1D 3E 4F
-82 43 C2 1D 87 12 4C C4 C6 C7 1C CA 3D 40 28 CA
-FE 22 3D 41 3E 4F 30 4D 2A CA 0A 4E 3E 4F 3D 40
-40 CA 53 27 3D 40 16 CA 1A E2 B6 1D B2 27 AC 23
-42 CA 3E 4F 3D 40 16 CA B9 23 DE 53 00 00 68 4E
-08 5E F8 40 3F 00 00 00 3D 40 0C CC CD 3F 90 C9
-08 45 56 41 4C 55 41 54 45 00 39 40 BE 1D 39 12
-39 12 39 12 0D 12 B0 12 2A C2 06 CA 7E CA 3D 41
-B2 41 C2 1D B2 41 C0 1D B2 41 BE 1D 30 4D 7A C3
-04 51 55 49 54 00 31 40 E0 1C B2 40 00 1C 00 1C
-82 43 B6 1D 82 43 08 18 B0 12 2A C2 6C C7 04 0D
-6F 6B 20 00 50 C7 34 C2 38 1D 44 C2 34 C2 50 00
-F6 C5 18 C7 06 CA 34 C2 7E 1C CE C2 B2 C3 6C C7
-0D 73 74 61 63 6B 20 65 6D 70 74 79 20 21 1A CB
-34 C2 30 FF 84 C5 B2 C3 6C C7 0B 46 52 41 4D 20
-66 75 6C 6C 20 21 1A CB 42 C4 F4 C2 C0 C3 AC CA
-6C C7 04 0D 20 20 20 00 BC C3 B4 CA EE C5 05 41
-42 4F 52 54 3F 40 80 1C BE 3F 8F 93 02 00 AE 26
-B2 40 82 48 90 C6 B0 12 0C D0 82 43 D2 D8 82 43
-DE D8 82 43 EA D8 82 43 1A D9 82 43 26 D9 82 43
-32 D9 A2 B3 DC 05 FD 27 B2 40 11 00 CE 05 E2 C2
-03 02 92 C3 DC 05 38 40 F0 FF 39 42 19 83 FE 23
-18 83 FB 23 92 B3 DC 05 F4 23 87 12 6C C7 04 1B
-5B 37 6D 00 50 C7 50 C7 6C C7 04 1B 5B 30 6D 00
-50 C7 4E CF 90 CF 96 CF 14 CB 0E CB 86 41 42 4F
-52 54 22 00 87 12 86 C7 34 C2 1A CB A2 C9 2A C2
-18 C8 01 27 87 12 4C C4 C6 C7 1E C8 C0 C3 B2 CB
-2A C2 4A CA 52 C4 81 5C 92 42 BE 1D C2 1D 30 4D
-87 12 A2 C7 4C C4 C6 C7 CA CB 08 4E 7A 4E 5A D3
-5A 53 0A 58 19 42 C8 1D 6E 4E 3E F0 1E 00 09 5E
-82 48 AE 1D 82 49 B0 1D 82 4A B2 1D 2A 52 82 4A
-C4 1D 3E 4F 3D 41 30 41 87 12 6C C7 0F 73 74 61
-63 6B 20 6D 69 73 6D 61 74 63 68 21 20 CB 82 9F
-B4 1D F2 23 18 42 AE 1D 19 42 B0 1D A8 49 FE FF
-89 48 00 00 30 4D C0 C7 08 56 41 52 49 41 42 4C
-45 00 B0 12 C0 CB BA 40 86 12 FC FF EF 3F F2 C9
-08 43 4F 4E 53 54 41 4E 54 00 B0 12 C0 CB BA 40
-85 12 FC FF 8A 4E FE FF 3E 4F E0 3F 40 CC 06 43
-52 45 41 54 45 00 B0 12 C0 CB BA 40 85 12 FC FF
-8A 4A FE FF D3 3F 60 CA 05 44 4F 45 53 3E 1A 42
-B2 1D BA 40 84 12 00 00 8A 4D 02 00 3D 41 30 4D
-78 CC 05 44 45 46 45 52 B0 12 C0 CB BA 40 30 40
-FC FF BA 40 8E CC FE FF B9 3F 00 00 81 5B 82 43
-B6 1D 30 4D B6 CB 01 5D B2 43 B6 1D 30 4D 82 C7
-87 52 45 43 55 52 53 45 19 42 C4 1D 99 42 B2 1D
-00 00 A2 53 C4 1D 30 4D AC CC 01 3A B0 12 C0 CB
-BA 40 87 12 FC FF A2 83 C4 1D B2 43 B6 1D 82 4F
-B4 1D 30 4D DA CC 81 3B 82 93 B6 1D 5D 27 87 12
-34 C2 2A C2 A2 C9 0E CC AE CC 2A C2 F4 C6 09 49
-4D 4D 45 44 49 41 54 45 1A 42 AE 1D FA D0 80 00
-00 00 30 4D BE 4F 02 00 3E 4F 30 4D 0E CD 82 49
-53 00 87 12 42 C4 F4 C2 C0 C3 46 CD 52 CD 34 C2
-24 CD A2 C9 2A C2 A4 CB 24 CD 2A C2 F6 CC 83 5B
-27 5D 87 12 A4 CB 34 C2 34 C2 A2 C9 A2 C9 2A C2
-90 CA 88 50 4F 53 54 50 4F 4E 45 00 87 12 4C C4
-C6 C7 1E C8 54 C2 C0 C3 B2 CB 7E C3 C0 C3 8C CD
-34 C2 34 C2 A2 C9 A2 C9 34 C2 A2 C9 A2 C9 2A C2
-92 CD 3A 4E 82 4A C6 1D 2E 4E 82 4E C4 1D 3D 40
-10 00 09 4A 08 49 29 83 18 48 FE FF 0E 98 FC 2B
-89 48 00 00 1D 83 F6 23 2A 4A 0A 93 F0 23 3E 4F
-3D 41 30 4D 2E CD 82 49 46 00 2F 83 8F 4E 00 00
-1E 42 C4 1D BE 40 C0 C3 00 00 A2 52 C4 1D 2E 53
-30 4D 92 CC 84 45 4C 53 45 00 1A 42 C4 1D BA 40
-BC C3 00 00 2A 52 82 4A C4 1D 8E 4A 00 00 2A 83
-0E 4A 30 4D 4A C7 84 54 48 45 4E 00 9E 42 C4 1D
-00 00 3E 4F 30 4D 5E CC 85 42 45 47 49 4E 30 40
-84 C5 06 CE 85 55 4E 54 49 4C 39 40 C0 C3 1A 42
-C4 1D A2 52 C4 1D 8A 49 00 00 8A 4E 02 00 3E 4F
-30 4D 8C CB 85 41 47 41 49 4E 39 40 BC C3 EF 3F
-28 CC 85 57 48 49 4C 45 87 12 CA CD 6E C2 2A C2
-C0 CC 86 52 45 50 45 41 54 00 87 12 4A CE 0C CE
-2A C2 E4 CD 82 44 4F 00 2F 83 8F 4E 00 00 1E 42
-C4 1D BE 40 CA C3 00 00 2E 53 82 4E C4 1D A2 53
-00 1C 1A 42 00 1C 8A 43 00 00 30 4D B4 C9 84 4C
-4F 4F 50 00 39 40 EC C3 1A 42 C4 1D A2 52 C4 1D
-8A 49 00 00 8A 4E 02 00 1E 42 00 1C A2 83 00 1C
-2E 4E 0E 93 04 24 9E 42 C4 1D 00 00 F5 3F 3E 4F
-30 4D E4 C5 85 2B 4C 4F 4F 50 39 40 DA C3 E4 3F
-9E CE 85 4C 45 41 56 45 1A 42 C4 1D BA 40 FC C3
-00 00 BA 40 BC C3 02 00 B2 50 06 00 C4 1D A2 53
-00 1C 2A 52 19 42 00 1C 89 4A 00 00 30 4D E2 CE
-04 4D 4F 56 45 00 0A 4E 38 4F 39 4F 3E 4F 0A 93
-11 24 08 99 0F 24 06 2C F8 49 00 00 18 53 1A 83
-FB 23 30 4D 08 5A 09 5A 19 83 18 83 E8 49 00 00
-1A 83 FA 23 30 4D 34 C2 CA 1D FC C2 2A C2 84 12
-46 CF 54 D2 2A D2 74 CE A2 CB 12 D2 D4 CE 10 CF
-AE C7 B4 CF E8 CF 24 CE AE D0 48 C3 4E CD B6 CC
-86 C8 00 00 3A 40 0C 00 39 40 CA 1D 38 40 CC 1D
-D9 3F 3A 40 0E 00 39 40 CC 1D 38 40 CA 1D CC 3F
-82 43 CC 1D 30 4D 92 42 CA 1D C8 1D 30 4D 62 CD
-09 50 57 52 5F 53 54 41 54 45 84 12 90 CD 0E D2
-58 D9 A0 CF 08 50 57 52 5F 48 45 52 45 00 92 42
-C4 1D B0 CF 92 42 C6 1D AE CF EF 3F 62 CE 09 52
-53 54 5F 53 54 41 54 45 92 42 0C 18 B0 CF 92 42
-0E 18 AE CF E2 3F CE CF 08 52 53 54 5F 48 45 52
-45 00 92 42 C4 1D 0C 18 92 42 C6 1D 0E 18 DF 3F
-B2 40 54 D0 B6 D0 B2 40 64 C6 58 C6 B2 40 BE C6
-CE C6 B2 40 FA C6 0E C7 B2 40 DC C5 EA C5 30 41
-52 CE 04 57 49 50 45 00 39 40 80 FF B9 43 00 00
-29 53 39 90 CE FF FA 23 B0 12 00 D0 B2 40 58 D9
-C4 1D B2 40 0E D2 C6 1D D4 3F C6 CD 06 28 57 41
-52 4D 29 00 1E 42 08 18 87 12 6C C7 05 0D 1B 5B
-37 6D 50 C7 70 C5 6C C7 27 20 46 61 73 74 46 6F
-72 74 68 20 56 31 36 30 20 32 34 4D 48 7A 20 28
-43 29 20 4A 2E 4D 2E 54 68 6F 6F 72 65 6E 73 20
-50 C7 34 C2 30 FF 84 C5 2A C3 30 C5 6C C7 0B 62
-79 74 65 73 20 66 72 65 65 20 26 CB 22 D0 04 57
-41 52 4D 00 30 40 54 D0 18 CE 04 43 4F 4C 44 00
-B2 40 04 A5 20 01 92 D3 30 01 B2 40 88 5A 5C 01
-F2 D0 10 00 16 02 B2 D0 00 84 04 02 B2 D0 FF 7F
-06 02 B2 40 FF 7F 02 02 F2 D0 07 00 36 02 B2 D0
-F0 00 04 02 B2 40 0F FF 02 02 B2 D0 0F FF 06 02
-F2 D0 0F 00 24 03 F2 40 F0 00 22 03 F2 D0 F0 00
-26 03 F2 40 A5 00 61 01 B2 40 86 00 62 01 82 43
-66 01 39 40 C0 00 B2 40 33 00 64 01 D2 43 61 01
-92 D2 9E 01 08 18 A2 93 08 18 01 24 59 07 38 40
-C2 A2 18 83 FE 23 19 83 FA 23 B2 D2 B0 01 92 C3
-B0 01 F2 D0 10 00 2A 03 F2 C0 40 00 A1 04 3A 40
-C6 D0 39 40 CE FF 89 4A 00 00 29 53 FC 23 92 42
-02 18 F0 FF B2 40 18 00 0A 18 31 40 E0 1C 3F 40
-80 1C 37 40 00 C2 36 40 B4 C2 35 40 08 C2 34 40
-14 C2 B2 40 0A 00 DA 1D B2 43 AC 1D 92 C3 30 01
-18 42 08 18 D2 B3 01 02 04 20 38 E3 18 53 82 48
-08 18 B2 40 81 00 C0 05 B2 42 C6 05 82 43 C8 05
-F2 D0 03 00 0D 02 92 C3 C0 05 92 D3 DA 05 3D 40
-E8 D1 18 42 08 18 38 90 0A 00 26 27 38 90 16 00
-23 2F 28 93 F9 22 E1 26 B4 D0 84 12 46 CF 36 D8
-E2 D8 EA D7 36 D9 B0 D7 6A D8 B4 D4 00 00 A6 D7
-56 D8 08 D8 46 D8 C4 D5 00 00 00 00 48 D9 72 CF
-4C D0 85 48 49 32 4C 4F 87 12 84 C5 DE CD A2 C9
-AE CC 74 CF EA D1 2A C2 BA D0 04 43 4F 44 45 00
-B0 12 C0 CB A2 82 C4 1D 87 12 EE CC BC C3 22 D2
-00 00 07 45 4E 44 43 4F 44 45 87 12 82 CF 0E CC
-2A C2 44 CE 03 41 53 4D 92 42 C8 1D B8 1D B2 40
-EE D1 C8 1D E5 3F 42 D2 06 45 4E 44 41 53 4D 00
-92 42 B8 1D C8 1D E9 3F 00 00 05 43 4F 4C 4F 4E
-1A 42 C4 1D BA 40 87 12 00 00 A2 53 C4 1D B2 43
-B6 1D 30 40 82 CF 00 00 05 4C 4F 32 48 49 1A 42
-C4 1D BA 40 B0 12 00 00 BA 40 2A C2 02 00 A2 52
-C4 1D ED 3F 38 40 BE 1D 39 48 2A 48 09 5A 1A 52
-C2 1D 09 9A 03 24 7E 9A FC 27 1A 83 0E 4A 2A 88
-82 4A C2 1D 30 4D B0 12 2A C2 C6 C7 1E C8 72 C3
-C0 C3 EC D2 DA C8 C0 C3 B2 CB 0E D3 EE D2 29 4E
-39 90 86 12 02 20 2E 53 30 41 39 90 85 12 03 20
-1E 4E 02 00 30 41 39 90 84 12 01 20 2E 52 30 41
-19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 40 29 00
-12 12 C2 1D 92 53 C2 1D B0 12 2A C2 C6 C7 DA C8
-C0 C3 40 D3 36 D3 21 53 3E 90 10 00 BB 2D 30 41
-42 D3 B2 41 C2 1D 22 D3 30 41 87 12 4C C4 B4 D2
-52 D3 82 43 BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D
-0A 4E 3E 4F FA 90 23 00 00 00 34 20 92 53 C2 1D
-B0 12 D6 D2 0E 93 04 20 B2 40 00 03 BC 1D 27 3C
-1E 93 04 20 B2 40 10 03 BC 1D 21 3C 2E 93 04 20
-B2 40 20 03 BC 1D 1B 3C 2E 92 04 20 B2 40 20 02
-BC 1D 15 3C 3E 92 04 20 B2 40 30 02 BC 1D 0F 3C
-3E 93 04 20 B2 40 30 03 BC 1D 09 3C B2 40 30 00
-BC 1D 19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 4F
-3D 41 30 4D FA 90 26 00 00 00 08 20 B2 40 10 02
-BC 1D 92 53 C2 1D 30 12 C2 D3 75 3F FA 90 40 00
-00 00 1A 20 B2 40 20 00 BC 1D 92 53 C2 1D B0 12
-20 D3 0E 20 B2 50 10 00 BC 1D 3E 40 2B 00 B0 12
-20 D3 32 24 92 92 BE 1D C2 1D 02 24 92 53 C2 1D
-8E 10 82 5E BC 1D D3 3F B0 12 20 D3 F9 23 B2 50
-10 00 BC 1D 3E 40 28 00 B0 12 D6 D2 30 12 12 D4
-67 3F 87 12 4C C4 B4 D2 4A D4 FE 90 26 00 00 00
-3E 40 20 00 04 20 B2 50 82 00 BC 1D C2 3F B0 12
-20 D3 DF 23 B2 50 80 00 BC 1D 3E 40 28 00 B0 12
-D6 D2 B0 12 10 D3 D5 23 3D 40 B2 CB 30 4D 50 C6
-04 52 45 54 49 00 87 12 34 C2 00 13 A2 C9 2A C2
-34 C2 2C 00 4A D3 42 D4 9A D4 2E 4E 1E D2 BC 1D
-19 42 BA 1D 92 3F 98 D2 03 4D 4F 56 84 12 90 D4
-00 40 A8 D4 05 4D 4F 56 2E 42 84 12 90 D4 40 40
-00 00 03 41 44 44 84 12 90 D4 00 50 C2 D4 05 41
-44 44 2E 42 84 12 90 D4 40 50 CE D4 04 41 44 44
-43 00 84 12 90 D4 00 60 DC D4 06 41 44 44 43 2E
-42 00 84 12 90 D4 40 60 80 D4 04 53 55 42 43 00
-84 12 90 D4 00 70 FA D4 06 53 55 42 43 2E 42 00
-84 12 90 D4 40 70 08 D5 03 53 55 42 84 12 90 D4
-00 80 18 D5 05 53 55 42 2E 42 84 12 90 D4 40 80
-7A D2 03 43 4D 50 84 12 90 D4 00 90 32 D5 05 43
-4D 50 2E 42 84 12 90 D4 40 90 68 D2 04 44 41 44
-44 00 84 12 90 D4 00 A0 4C D5 06 44 41 44 44 2E
-42 00 84 12 90 D4 40 A0 3E D5 03 42 49 54 84 12
-90 D4 00 B0 6A D5 05 42 49 54 2E 42 84 12 90 D4
-40 B0 76 D5 03 42 49 43 84 12 90 D4 00 C0 84 D5
-05 42 49 43 2E 42 84 12 90 D4 40 C0 90 D5 03 42
-49 53 84 12 90 D4 00 D0 9E D5 05 42 49 53 2E 42
-84 12 90 D4 40 D0 00 00 03 58 4F 52 84 12 90 D4
-00 E0 B8 D5 05 58 4F 52 2E 42 84 12 90 D4 40 E0
-EA D4 03 41 4E 44 84 12 90 D4 00 F0 D2 D5 05 41
-4E 44 2E 42 84 12 90 D4 40 F0 4C C4 4A D3 F0 D5
-1A 42 BC 1D B2 F0 70 00 BC 1D 8A 10 3A F0 0F 00
-82 DA BC 1D 4A 3F 24 D5 03 52 52 43 84 12 EA D5
-00 10 08 D6 05 52 52 43 2E 42 84 12 EA D5 40 10
-14 D6 04 53 57 50 42 00 84 12 EA D5 80 10 22 D6
-03 52 52 41 84 12 EA D5 00 11 30 D6 05 52 52 41
-2E 42 84 12 EA D5 40 11 3C D6 03 53 58 54 84 12
-EA D5 80 11 00 00 04 50 55 53 48 00 84 12 EA D5
-00 12 56 D6 06 50 55 53 48 2E 42 00 84 12 EA D5
-40 12 AA D5 04 43 41 4C 4C 00 84 12 EA D5 80 12
-34 C2 2C 00 4A D3 42 D4 8A D6 59 42 BC 1D 5A 42
-BD 1D 82 4A BC 1D BE 90 00 15 00 00 02 20 0A 89
-02 3C 09 8A 0A 49 3A 90 10 00 03 2C 5A 0E A8 3F
-1A 53 0E 4A 87 12 70 C5 6C C7 0D 6F 75 74 20 6F
-66 20 62 6F 75 6E 64 73 20 CB 64 D6 05 50 55 53
-48 4D 84 12 80 D6 00 15 CC D6 04 50 4F 50 4D 00
-84 12 80 D6 00 17 4C C4 B4 D2 EC D6 82 43 BC 1D
-92 42 C4 1D BA 1D A2 53 C4 1D 92 53 C2 1D 3E 40
-2C 00 B0 12 2A C2 C6 C7 DA C8 C0 C3 B2 CB 42 D4
-12 D7 0A 4E 3E 4F 1A 83 2A 92 CA 2F 8A 10 5A 06
-6F 3F 4A D6 04 52 52 43 4D 00 84 12 E6 D6 50 00
-24 D7 04 52 52 41 4D 00 84 12 E6 D6 50 01 32 D7
-04 52 4C 41 4D 00 84 12 E6 D6 50 02 40 D7 04 52
-52 55 4D 00 84 12 E6 D6 50 03 85 12 00 3C 4E D7
-03 53 3E 3D 85 12 00 38 60 D7 02 53 3C 00 85 12
-00 34 DA D6 03 30 3E 3D 85 12 00 30 74 D7 02 30
-3C 00 85 12 00 30 00 00 02 55 3C 00 85 12 00 2C
-88 D7 03 55 3E 3D 85 12 00 28 7E D7 03 30 3C 3E
-85 12 00 24 9C D7 02 30 3D 00 85 12 00 20 5C C6
-02 49 46 00 1A 42 C4 1D 8A 4E 00 00 A2 53 C4 1D
-0E 4A 30 4D 92 D7 04 54 48 45 4E 00 1A 42 C4 1D
-08 4E 3E 4F 09 48 29 53 0A 89 0A 11 3A 90 00 02
-68 2F 88 DA 00 00 30 4D 5A D5 04 45 4C 53 45 00
-1A 42 C4 1D BA 40 00 3C 00 00 A2 53 C4 1D 2F 83
-8F 4A 00 00 E3 3F C6 D7 05 55 4E 54 49 4C 3A 4F
-08 4E 3E 4F 19 42 C4 1D 2A 83 0A 89 0A 11 3A 90
-00 FE 47 3B 3A F0 FF 03 08 DA 89 48 00 00 A2 53
-C4 1D 30 4D DE D5 05 41 47 41 49 4E 87 12 5A D7
-0E D8 2A C2 00 00 05 57 48 49 4C 45 87 12 B4 D7
-6E C2 2A C2 6A D7 06 52 45 50 45 41 54 00 87 12
-5A D7 0E D8 CC D7 2A C2 00 00 03 4A 4D 50 87 12
-A4 CB 5A D7 0E D8 2A C2 3E B0 00 10 03 20 3E E0
-00 04 30 4D 3E 90 00 34 06 28 03 24 3E 40 00 34
-30 4D 3E 40 00 38 30 4D 00 00 04 3F 4A 4D 50 00
-87 12 78 D8 A4 CB 6E C2 0E D8 2A C2 AE D8 3D 41
-08 4E 3E 4F 2A 48 0A 93 04 20 98 42 C4 1D 00 00
-30 4D 88 43 00 00 A4 3F 74 D6 03 42 57 31 84 12
-AC D8 00 00 CA D8 03 42 57 32 84 12 AC D8 00 00
-D6 D8 03 42 57 33 84 12 AC D8 00 00 EE D8 3D 41
-1A 42 C4 1D 28 4E 08 93 08 20 BA 4F 00 00 A2 53
-C4 1D 8E 4A 00 00 3E 4F 30 4D 8E 43 00 00 61 3F
-00 00 03 46 57 31 84 12 EC D8 00 00 12 D9 03 46
-57 32 84 12 EC D8 00 00 1E D9 03 46 57 33 84 12
-EC D8 00 00 2A D9 04 47 4F 54 4F 00 87 12 5A D7
-A4 CB 98 C9 2A C2 9A D8 05 3F 47 4F 54 4F 87 12
-78 D8 A4 CB 98 C9 2A C2
-@FFCE
-C6 D0 C6 D0 C6 D0 C6 D0 C6 D0 C6 D0 C6 D0 C6 D0
-C6 D0 C6 D0 C6 D0 C6 D0 C6 D0 C6 D0 C6 D0 C6 D0
-C6 D0 6A C6 C6 D0 C6 D0 C6 D0 C6 D0 C6 D0 C6 D0
-C6 D0
-q
+++ /dev/null
-@1800
-10 00 5E C6 F4 01 80 04 FD FF 18 00 48 D9 FE D1
-2A C6 36 C6 00 00 00 00
-@1DAA
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00
-@C200
-3A 41 0D 12 0D 4A 30 4D 2F 83 8F 4E 00 00 3E 41
-2E 4E 30 4D 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E
-30 4D 00 00 04 45 58 49 54 00 3D 41 30 4D 00 00
-03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 C2
-03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
-44 55 50 00 0E 93 F6 23 30 4D 40 C2 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 C2 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E C2 02 3E 52 00 0E 12 3E 4F 30 4D 8E C2
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 C2
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C C2 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 C2 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 C3
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 C2 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA C2 03 41 4E 44 3E FF 30 4D 7A C2 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E C3 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 C3 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E C3 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 C3 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 C2 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
-3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE C3 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 C3 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 C3 03 3E 49 4E 85 12 C2 1D 10 C3
-04 42 41 53 45 00 85 12 DA 1D C0 C2 05 53 54 41
-54 45 85 12 B6 1D 30 C4 02 42 4C 00 85 12 20 00
-94 C3 02 3C 23 00 B2 40 AA 1D AA 1D 30 4D 1E 15
-0E 43 3D 40 20 00 0A 93 04 20 0D 11 0A 4C 0C 43
-09 43 0E 9B 01 28 0E 8B 09 69 08 68 1D 83 07 30
-0C 5C 0A 6A 0E 6E F5 2B 0E 8B 12 D3 F5 3F 0A 4E
-1D 17 30 41 48 C4 01 23 1B 42 DA 1D 2C 4F 0A 4E
-B0 12 5E C4 8F 49 00 00 0E 48 7A 90 0A 00 02 28
-3A 50 07 00 3A 50 30 00 92 83 AA 1D 18 42 AA 1D
-C8 4A 00 00 30 4D 96 C4 02 23 53 00 87 12 98 C4
-D2 C4 2D 83 09 93 E0 23 0E 93 DE 23 3D 41 30 4D
-C8 C4 02 23 3E 00 9F 42 AA 1D 00 00 3E 40 AA 1D
-2E 8F 30 4D 00 C4 04 48 4F 4C 44 00 0A 4E 3E 4F
-DB 3F 3C C4 04 53 49 47 4E 00 0E 93 3E 4F 3A 40
-2D 00 D2 33 30 4D F4 C3 03 55 44 2E 87 12 56 C4
-CC C4 E6 C4 44 C7 0C C7 2A C2 18 C5 02 55 2E 00
-2F 83 8F 4E 00 00 0E 43 F1 3F 3E B0 00 80 06 24
-BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D DA C2
-02 44 2E 00 87 12 56 C4 6E C2 80 C2 3A C5 CC C4
-92 C2 0A C5 E6 C4 44 C7 0C C7 2A C2 52 C3 01 2E
-3E B0 00 80 DD 27 2F 83 3E 43 EC 3F F6 C4 04 48
-45 52 45 00 2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D
-62 C3 05 41 4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D
-E2 C4 02 43 2C 00 1A 42 C4 1D CA 4E 00 00 92 53
-C4 1D 3E 4F 30 4D 2F 83 8F 4E 00 00 B0 12 2A C6
-92 B3 DC 05 FD 27 1E 42 CC 05 B0 12 36 C6 30 4D
-30 40 B6 C5 7E C5 05 28 4B 45 59 29 18 42 CC 05
-EA 3F 12 C4 03 4B 45 59 30 40 DC C5 92 C5 06 41
-43 43 45 50 54 00 3C 40 96 C6 3B 40 66 C6 2D 15
-0A 4E 2E 4F 0A 5E 3B 40 0D 00 3C 40 20 00 3D 40
-8A C6 92 B3 DC 05 05 24 18 42 CC 05 38 90 0A 00
-04 20 21 53 39 40 4A C6 4D 15 B2 40 11 00 CE 05
-E2 C2 03 02 30 41 B2 40 13 00 CE 05 E2 D2 03 02
-30 41 00 00 05 53 4C 45 45 50 30 40 58 C6 00 00
-07 28 53 4C 45 45 50 29 12 D2 0A 18 F6 3F 21 52
-3A 17 58 42 CC 05 48 9B E6 27 48 9C 06 2C 78 92
-0E 20 2E 9F 0C 24 1E 83 05 3C 0E 9A 03 24 CE 48
-00 00 1E 53 82 48 CE 05 30 4D 8C C6 2D 83 92 B3
-DC 05 FD 27 E6 23 B2 40 18 00 0A 18 3E 8F 3D 41
-30 4D D6 C5 06 28 45 4D 49 54 29 00 08 4E 3E 4F
-A2 B3 DC 05 FD 27 E6 3F 50 C5 04 45 4D 49 54 00
-30 40 AC C6 BA C6 04 45 43 48 4F 00 B2 40 82 48
-84 C6 30 4D 6E C5 06 4E 4F 45 43 48 4F 00 B2 40
-30 4D 84 C6 30 4D A4 C6 04 28 43 52 29 00 2F 83
-8F 4E 00 00 3E 40 0D 00 E3 3F A2 C5 02 43 52 00
-30 40 EE C6 04 C5 05 53 50 41 43 45 2F 83 8F 4E
-00 00 3E 40 20 00 D4 3F 06 C7 06 53 50 41 43 45
-53 00 0E 93 09 24 0D 12 3D 40 2E C7 EF 3F 30 C7
-2D 83 1E 83 EB 23 3D 41 3E 4F 30 4D 2C C5 04 54
-59 50 45 00 0E 93 95 24 2A 4F 8F 5E 00 00 0E 4A
-87 12 CA C3 02 C4 0A C3 C0 C6 EC C3 54 C7 2A C2
-2F 82 8F 4E 02 00 7E 4D 8F 4D 00 00 0D 5E 1D B3
-0D 63 30 4D 1A C7 82 53 22 00 87 12 34 C2 60 C7
-96 C9 34 C2 22 00 BA C7 8A C7 3D 41 6E 4E 1E 83
-82 5E C4 1D 3E 4F 92 B3 C4 1D A2 63 C4 1D 30 4D
-D6 C6 82 2E 22 00 87 12 7A C7 34 C2 44 C7 96 C9
-2A C2 00 00 04 57 4F 52 44 00 3C 40 BE 1D 39 4C
-3A 4C 09 5A 3A 5C 28 4C 09 9A 19 24 7E 9A FC 27
-1A 83 3B 40 60 00 C8 4C 00 00 09 9A 0C 24 7C 4A
-4E 9C 09 24 18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F
-7C 80 20 00 F0 3F 1A 82 C0 1D 82 4A C2 1D 1E 42
-C4 1D 08 8E CE 48 00 00 30 4D 00 00 04 46 49 4E
-44 00 2F 83 0C 4E 65 4C 74 40 80 00 3B 40 CA 1D
-3E 4B 0E 93 1E 24 58 4C 01 00 78 F0 1E 00 0E 58
-2E 53 1E 4E FE FF 0E 93 F3 27 09 4E 78 49 48 C4
-48 95 F7 23 0A 4C 1A 53 FA 99 00 00 F2 23 58 83
-FA 23 19 B3 09 63 0C 49 6A 4E 1E 43 4A 93 01 30
-2E 83 8F 4C 00 00 35 40 08 C2 34 40 14 C2 30 4D
-2F 53 2F 53 3E 4F 30 4D 26 C4 07 3E 4E 55 4D 42
-45 52 3C 4F 38 4F 29 4F 2F 82 1B 42 DA 1D 6A 4C
-7A 80 30 00 7A 90 0A 00 02 28 7A 80 07 00 0A 9B
-13 2C 82 49 D0 04 82 48 D2 04 82 4B C8 04 19 42
-E4 04 18 42 E6 04 09 5A 08 63 1C 53 1E 83 E7 23
-8F 49 04 00 8F 48 02 00 8F 4C 00 00 30 4D 03 12
-0D 12 1B 42 DA 1D 0B 12 32 C0 00 02 6D 4E 0D 5E
-0C 4E 7A 40 2E 00 0D 9C 0A 28 7A 9C FC 23 32 D0
-00 02 FC 4C FE FF 0D 9C FC 2F DE 83 00 00 09 43
-08 43 3D 40 44 C9 3F 82 8F 4E 06 00 0C 4E 7E 4C
-6A 4C 7A 90 2D 00 10 2C 3B 40 10 00 7A 80 24 00
-06 24 2B 43 5A 83 03 24 3B 52 6A 53 B0 23 1C 53
-1E 83 6A 4C 7A 90 2D 00 AA 23 1C 53 1E 83 B1 43
-04 00 A5 3F 46 C9 2F 53 0E 93 2C 17 82 4C DA 1D
-03 24 2F 52 0E F3 30 4D 9F 4F 02 00 04 00 BF 4F
-00 00 3E E3 09 20 3E E3 BF E3 02 00 BF E3 00 00
-9F 53 02 00 8F 63 00 00 32 B0 00 02 01 20 2F 53
-30 4D C6 C6 07 45 58 45 43 55 54 45 0A 4E 3E 4F
-00 4A 28 C3 01 2C 1A 42 C4 1D A2 53 C4 1D 8A 4E
-00 00 3E 4F 30 4D 94 C9 87 4C 49 54 45 52 41 4C
-82 93 B6 1D 16 24 32 B0 00 02 09 24 1A 42 C4 1D
-A2 52 C4 1D BA 40 34 C2 00 00 BA 4F 02 00 1A 42
-C4 1D A2 52 C4 1D BA 40 34 C2 00 00 8A 4E 02 00
-3E 4F 30 4D FC C6 05 43 4F 55 4E 54 2F 83 1E 53
-8F 4E 00 00 5E 4E FF FF 30 4D 82 4E BE 1D B2 4F
-C0 1D 3E 4F 82 43 C2 1D 87 12 4C C4 BA C7 10 CA
-3D 40 1C CA FE 22 3D 41 3E 4F 30 4D 1E CA 0A 4E
-3E 4F 3D 40 34 CA 53 27 3D 40 0A CA 1A E2 B6 1D
-B2 27 AC 23 36 CA 3E 4F 3D 40 0A CA B9 23 DE 53
-00 00 68 4E 08 5E F8 40 3F 00 00 00 3D 40 00 CC
-CD 3F 84 C9 08 45 56 41 4C 55 41 54 45 00 39 40
-BE 1D 39 12 39 12 39 12 0D 12 B0 12 2A C2 FA C9
-72 CA 3D 41 B2 41 C2 1D B2 41 C0 1D B2 41 BE 1D
-30 4D 7A C3 04 51 55 49 54 00 31 40 E0 1C B2 40
-00 1C 00 1C 82 43 B6 1D 82 43 08 18 B0 12 2A C2
-60 C7 04 0D 6F 6B 20 00 44 C7 34 C2 38 1D 44 C2
-34 C2 50 00 F6 C5 0C C7 FA C9 34 C2 7E 1C CE C2
-B2 C3 60 C7 0D 73 74 61 63 6B 20 65 6D 70 74 79
-20 21 0E CB 34 C2 30 FF 84 C5 B2 C3 60 C7 0B 46
-52 41 4D 20 66 75 6C 6C 20 21 0E CB 42 C4 F4 C2
-C0 C3 A0 CA 60 C7 04 0D 20 20 20 00 BC C3 A8 CA
-EE C5 05 41 42 4F 52 54 3F 40 80 1C BE 3F 8F 93
-02 00 AE 26 B2 40 82 48 84 C6 B0 12 00 D0 82 43
-C2 D8 82 43 CE D8 82 43 DA D8 82 43 0A D9 82 43
-16 D9 82 43 22 D9 A2 B3 DC 05 FD 27 B2 40 11 00
-CE 05 E2 C2 03 02 92 C3 DC 05 38 40 55 05 39 42
-19 83 FE 23 18 83 FB 23 92 B3 DC 05 F4 23 87 12
-60 C7 04 1B 5B 37 6D 00 44 C7 44 C7 60 C7 04 1B
-5B 30 6D 00 44 C7 42 CF 84 CF 8A CF 08 CB 02 CB
-86 41 42 4F 52 54 22 00 87 12 7A C7 34 C2 0E CB
-96 C9 2A C2 0C C8 01 27 87 12 4C C4 BA C7 12 C8
-C0 C3 A6 CB 2A C2 3E CA 52 C4 81 5C 92 42 BE 1D
-C2 1D 30 4D 87 12 96 C7 4C C4 BA C7 BE CB 08 4E
-7A 4E 5A D3 5A 53 0A 58 19 42 C8 1D 6E 4E 3E F0
-1E 00 09 5E 82 48 AE 1D 82 49 B0 1D 82 4A B2 1D
-2A 52 82 4A C4 1D 3E 4F 3D 41 30 41 87 12 60 C7
-0F 73 74 61 63 6B 20 6D 69 73 6D 61 74 63 68 21
-14 CB 82 9F B4 1D F2 23 18 42 AE 1D 19 42 B0 1D
-A8 49 FE FF 89 48 00 00 30 4D B4 C7 08 56 41 52
-49 41 42 4C 45 00 B0 12 B4 CB BA 40 86 12 FC FF
-EF 3F E6 C9 08 43 4F 4E 53 54 41 4E 54 00 B0 12
-B4 CB BA 40 85 12 FC FF 8A 4E FE FF 3E 4F E0 3F
-34 CC 06 43 52 45 41 54 45 00 B0 12 B4 CB BA 40
-85 12 FC FF 8A 4A FE FF D3 3F 54 CA 05 44 4F 45
-53 3E 1A 42 B2 1D BA 40 84 12 00 00 8A 4D 02 00
-3D 41 30 4D 6C CC 05 44 45 46 45 52 B0 12 B4 CB
-BA 40 30 40 FC FF BA 40 82 CC FE FF B9 3F 00 00
-81 5B 82 43 B6 1D 30 4D AA CB 01 5D B2 43 B6 1D
-30 4D 76 C7 87 52 45 43 55 52 53 45 19 42 C4 1D
-99 42 B2 1D 00 00 A2 53 C4 1D 30 4D A0 CC 01 3A
-B0 12 B4 CB BA 40 87 12 FC FF A2 83 C4 1D B2 43
-B6 1D 82 4F B4 1D 30 4D CE CC 81 3B 82 93 B6 1D
-5D 27 87 12 34 C2 2A C2 96 C9 02 CC A2 CC 2A C2
-E8 C6 09 49 4D 4D 45 44 49 41 54 45 1A 42 AE 1D
-FA D0 80 00 00 00 30 4D BE 4F 02 00 3E 4F 30 4D
-02 CD 82 49 53 00 87 12 42 C4 F4 C2 C0 C3 3A CD
-46 CD 34 C2 18 CD 96 C9 2A C2 98 CB 18 CD 2A C2
-EA CC 83 5B 27 5D 87 12 98 CB 34 C2 34 C2 96 C9
-96 C9 2A C2 84 CA 88 50 4F 53 54 50 4F 4E 45 00
-87 12 4C C4 BA C7 12 C8 54 C2 C0 C3 A6 CB 7E C3
-C0 C3 80 CD 34 C2 34 C2 96 C9 96 C9 34 C2 96 C9
-96 C9 2A C2 86 CD 3A 4E 82 4A C6 1D 2E 4E 82 4E
-C4 1D 3D 40 10 00 09 4A 08 49 29 83 18 48 FE FF
-0E 98 FC 2B 89 48 00 00 1D 83 F6 23 2A 4A 0A 93
-F0 23 3E 4F 3D 41 30 4D 22 CD 82 49 46 00 2F 83
-8F 4E 00 00 1E 42 C4 1D BE 40 C0 C3 00 00 A2 52
-C4 1D 2E 53 30 4D 86 CC 84 45 4C 53 45 00 1A 42
-C4 1D BA 40 BC C3 00 00 2A 52 82 4A C4 1D 8E 4A
-00 00 2A 83 0E 4A 30 4D 3E C7 84 54 48 45 4E 00
-9E 42 C4 1D 00 00 3E 4F 30 4D 52 CC 85 42 45 47
-49 4E 30 40 84 C5 FA CD 85 55 4E 54 49 4C 39 40
-C0 C3 1A 42 C4 1D A2 52 C4 1D 8A 49 00 00 8A 4E
-02 00 3E 4F 30 4D 80 CB 85 41 47 41 49 4E 39 40
-BC C3 EF 3F 1C CC 85 57 48 49 4C 45 87 12 BE CD
-6E C2 2A C2 B4 CC 86 52 45 50 45 41 54 00 87 12
-3E CE 00 CE 2A C2 D8 CD 82 44 4F 00 2F 83 8F 4E
-00 00 1E 42 C4 1D BE 40 CA C3 00 00 2E 53 82 4E
-C4 1D A2 53 00 1C 1A 42 00 1C 8A 43 00 00 30 4D
-A8 C9 84 4C 4F 4F 50 00 39 40 EC C3 1A 42 C4 1D
-A2 52 C4 1D 8A 49 00 00 8A 4E 02 00 1E 42 00 1C
-A2 83 00 1C 2E 4E 0E 93 04 24 9E 42 C4 1D 00 00
-F5 3F 3E 4F 30 4D E4 C5 85 2B 4C 4F 4F 50 39 40
-DA C3 E4 3F 92 CE 85 4C 45 41 56 45 1A 42 C4 1D
-BA 40 FC C3 00 00 BA 40 BC C3 02 00 B2 50 06 00
-C4 1D A2 53 00 1C 2A 52 19 42 00 1C 89 4A 00 00
-30 4D D6 CE 04 4D 4F 56 45 00 0A 4E 38 4F 39 4F
-3E 4F 0A 93 11 24 08 99 0F 24 06 2C F8 49 00 00
-18 53 1A 83 FB 23 30 4D 08 5A 09 5A 19 83 18 83
-E8 49 00 00 1A 83 FA 23 30 4D 34 C2 CA 1D FC C2
-2A C2 84 12 3A CF 44 D2 1A D2 68 CE 96 CB 02 D2
-C8 CE 04 CF A2 C7 A8 CF DC CF 18 CE A2 D0 48 C3
-42 CD AA CC 7A C8 00 00 3A 40 0C 00 39 40 CA 1D
-38 40 CC 1D D9 3F 3A 40 0E 00 39 40 CC 1D 38 40
-CA 1D CC 3F 82 43 CC 1D 30 4D 92 42 CA 1D C8 1D
-30 4D 56 CD 09 50 57 52 5F 53 54 41 54 45 84 12
-84 CD FE D1 48 D9 94 CF 08 50 57 52 5F 48 45 52
-45 00 92 42 C4 1D A4 CF 92 42 C6 1D A2 CF EF 3F
-56 CE 09 52 53 54 5F 53 54 41 54 45 92 42 0C 18
-A4 CF 92 42 0E 18 A2 CF E2 3F C2 CF 08 52 53 54
-5F 48 45 52 45 00 92 42 C4 1D 0C 18 92 42 C6 1D
-0E 18 DF 3F B2 40 48 D0 AA D0 B2 40 58 C6 4C C6
-B2 40 AC C6 C2 C6 B2 40 EE C6 02 C7 B2 40 DC C5
-EA C5 30 41 46 CE 04 57 49 50 45 00 39 40 80 FF
-B9 43 00 00 29 53 39 90 CE FF FA 23 B0 12 F4 CF
-B2 40 48 D9 C4 1D B2 40 FE D1 C6 1D D4 3F BA CD
-06 28 57 41 52 4D 29 00 1E 42 08 18 87 12 60 C7
-05 0D 1B 5B 37 6D 44 C7 70 C5 60 C7 27 20 46 61
-73 74 46 6F 72 74 68 20 56 31 36 30 20 2E 35 4D
-48 7A 20 28 43 29 20 4A 2E 4D 2E 54 68 6F 6F 72
-65 6E 73 20 44 C7 34 C2 30 FF 84 C5 2A C3 30 C5
-60 C7 0B 62 79 74 65 73 20 66 72 65 65 20 1A CB
-16 D0 04 57 41 52 4D 00 30 40 48 D0 0C CE 04 43
-4F 4C 44 00 B2 40 04 A5 20 01 92 D3 30 01 B2 40
-88 5A 5C 01 F2 D0 10 00 16 02 B2 D0 00 84 04 02
-B2 D0 FF 7F 06 02 B2 40 FF 7F 02 02 F2 D0 07 00
-36 02 B2 D0 F0 00 04 02 B2 40 0F FF 02 02 B2 D0
-0F FF 06 02 F2 D0 0F 00 24 03 F2 40 F0 00 22 03
-F2 D0 F0 00 26 03 F2 40 A5 00 61 01 B2 40 44 00
-66 01 29 42 B2 40 33 00 64 01 D2 43 61 01 92 D2
-9E 01 08 18 A2 93 08 18 01 24 59 07 38 40 C2 A2
-18 83 FE 23 19 83 FA 23 B2 D2 B0 01 92 C3 B0 01
-F2 D0 10 00 2A 03 F2 C0 40 00 A1 04 3A 40 BA D0
-39 40 CE FF 89 4A 00 00 29 53 FC 23 92 42 02 18
-F0 FF B2 40 18 00 0A 18 31 40 E0 1C 3F 40 80 1C
-37 40 00 C2 36 40 B4 C2 35 40 08 C2 34 40 14 C2
-B2 40 0A 00 DA 1D B2 43 AC 1D 92 C3 30 01 18 42
-08 18 D2 B3 01 02 04 20 38 E3 18 53 82 48 08 18
-B2 40 81 00 C0 05 A2 42 C6 05 B2 40 00 49 C8 05
-F2 D0 03 00 0D 02 92 C3 C0 05 92 D3 DA 05 3D 40
-D8 D1 18 42 08 18 38 90 0A 00 28 27 38 90 16 00
-25 2F 28 93 FB 22 E3 26 A8 D0 84 12 3A CF 26 D8
-D2 D8 DA D7 26 D9 A0 D7 5A D8 A4 D4 00 00 96 D7
-46 D8 F8 D7 36 D8 B4 D5 00 00 00 00 38 D9 66 CF
-40 D0 85 48 49 32 4C 4F 87 12 84 C5 D2 CD 96 C9
-A2 CC 68 CF DA D1 2A C2 AE D0 04 43 4F 44 45 00
-B0 12 B4 CB A2 82 C4 1D 87 12 E2 CC BC C3 12 D2
-00 00 07 45 4E 44 43 4F 44 45 87 12 76 CF 02 CC
-2A C2 38 CE 03 41 53 4D 92 42 C8 1D B8 1D B2 40
-DE D1 C8 1D E5 3F 32 D2 06 45 4E 44 41 53 4D 00
-92 42 B8 1D C8 1D E9 3F 00 00 05 43 4F 4C 4F 4E
-1A 42 C4 1D BA 40 87 12 00 00 A2 53 C4 1D B2 43
-B6 1D 30 40 76 CF 00 00 05 4C 4F 32 48 49 1A 42
-C4 1D BA 40 B0 12 00 00 BA 40 2A C2 02 00 A2 52
-C4 1D ED 3F 38 40 BE 1D 39 48 2A 48 09 5A 1A 52
-C2 1D 09 9A 03 24 7E 9A FC 27 1A 83 0E 4A 2A 88
-82 4A C2 1D 30 4D B0 12 2A C2 BA C7 12 C8 72 C3
-C0 C3 DC D2 CE C8 C0 C3 A6 CB FE D2 DE D2 29 4E
-39 90 86 12 02 20 2E 53 30 41 39 90 85 12 03 20
-1E 4E 02 00 30 41 39 90 84 12 01 20 2E 52 30 41
-19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 40 29 00
-12 12 C2 1D 92 53 C2 1D B0 12 2A C2 BA C7 CE C8
-C0 C3 30 D3 26 D3 21 53 3E 90 10 00 BB 2D 30 41
-32 D3 B2 41 C2 1D 22 D3 30 41 87 12 4C C4 A4 D2
-42 D3 82 43 BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D
-0A 4E 3E 4F FA 90 23 00 00 00 34 20 92 53 C2 1D
-B0 12 C6 D2 0E 93 04 20 B2 40 00 03 BC 1D 27 3C
-1E 93 04 20 B2 40 10 03 BC 1D 21 3C 2E 93 04 20
-B2 40 20 03 BC 1D 1B 3C 2E 92 04 20 B2 40 20 02
-BC 1D 15 3C 3E 92 04 20 B2 40 30 02 BC 1D 0F 3C
-3E 93 04 20 B2 40 30 03 BC 1D 09 3C B2 40 30 00
-BC 1D 19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 4F
-3D 41 30 4D FA 90 26 00 00 00 08 20 B2 40 10 02
-BC 1D 92 53 C2 1D 30 12 B2 D3 75 3F FA 90 40 00
-00 00 1A 20 B2 40 20 00 BC 1D 92 53 C2 1D B0 12
-10 D3 0E 20 B2 50 10 00 BC 1D 3E 40 2B 00 B0 12
-10 D3 32 24 92 92 BE 1D C2 1D 02 24 92 53 C2 1D
-8E 10 82 5E BC 1D D3 3F B0 12 10 D3 F9 23 B2 50
-10 00 BC 1D 3E 40 28 00 B0 12 C6 D2 30 12 02 D4
-67 3F 87 12 4C C4 A4 D2 3A D4 FE 90 26 00 00 00
-3E 40 20 00 04 20 B2 50 82 00 BC 1D C2 3F B0 12
-10 D3 DF 23 B2 50 80 00 BC 1D 3E 40 28 00 B0 12
-C6 D2 B0 12 00 D3 D5 23 3D 40 A6 CB 30 4D 44 C6
-04 52 45 54 49 00 87 12 34 C2 00 13 96 C9 2A C2
-34 C2 2C 00 3A D3 32 D4 8A D4 2E 4E 1E D2 BC 1D
-19 42 BA 1D 92 3F 88 D2 03 4D 4F 56 84 12 80 D4
-00 40 98 D4 05 4D 4F 56 2E 42 84 12 80 D4 40 40
-00 00 03 41 44 44 84 12 80 D4 00 50 B2 D4 05 41
-44 44 2E 42 84 12 80 D4 40 50 BE D4 04 41 44 44
-43 00 84 12 80 D4 00 60 CC D4 06 41 44 44 43 2E
-42 00 84 12 80 D4 40 60 70 D4 04 53 55 42 43 00
-84 12 80 D4 00 70 EA D4 06 53 55 42 43 2E 42 00
-84 12 80 D4 40 70 F8 D4 03 53 55 42 84 12 80 D4
-00 80 08 D5 05 53 55 42 2E 42 84 12 80 D4 40 80
-6A D2 03 43 4D 50 84 12 80 D4 00 90 22 D5 05 43
-4D 50 2E 42 84 12 80 D4 40 90 58 D2 04 44 41 44
-44 00 84 12 80 D4 00 A0 3C D5 06 44 41 44 44 2E
-42 00 84 12 80 D4 40 A0 2E D5 03 42 49 54 84 12
-80 D4 00 B0 5A D5 05 42 49 54 2E 42 84 12 80 D4
-40 B0 66 D5 03 42 49 43 84 12 80 D4 00 C0 74 D5
-05 42 49 43 2E 42 84 12 80 D4 40 C0 80 D5 03 42
-49 53 84 12 80 D4 00 D0 8E D5 05 42 49 53 2E 42
-84 12 80 D4 40 D0 00 00 03 58 4F 52 84 12 80 D4
-00 E0 A8 D5 05 58 4F 52 2E 42 84 12 80 D4 40 E0
-DA D4 03 41 4E 44 84 12 80 D4 00 F0 C2 D5 05 41
-4E 44 2E 42 84 12 80 D4 40 F0 4C C4 3A D3 E0 D5
-1A 42 BC 1D B2 F0 70 00 BC 1D 8A 10 3A F0 0F 00
-82 DA BC 1D 4A 3F 14 D5 03 52 52 43 84 12 DA D5
-00 10 F8 D5 05 52 52 43 2E 42 84 12 DA D5 40 10
-04 D6 04 53 57 50 42 00 84 12 DA D5 80 10 12 D6
-03 52 52 41 84 12 DA D5 00 11 20 D6 05 52 52 41
-2E 42 84 12 DA D5 40 11 2C D6 03 53 58 54 84 12
-DA D5 80 11 00 00 04 50 55 53 48 00 84 12 DA D5
-00 12 46 D6 06 50 55 53 48 2E 42 00 84 12 DA D5
-40 12 9A D5 04 43 41 4C 4C 00 84 12 DA D5 80 12
-34 C2 2C 00 3A D3 32 D4 7A D6 59 42 BC 1D 5A 42
-BD 1D 82 4A BC 1D BE 90 00 15 00 00 02 20 0A 89
-02 3C 09 8A 0A 49 3A 90 10 00 03 2C 5A 0E A8 3F
-1A 53 0E 4A 87 12 70 C5 60 C7 0D 6F 75 74 20 6F
-66 20 62 6F 75 6E 64 73 14 CB 54 D6 05 50 55 53
-48 4D 84 12 70 D6 00 15 BC D6 04 50 4F 50 4D 00
-84 12 70 D6 00 17 4C C4 A4 D2 DC D6 82 43 BC 1D
-92 42 C4 1D BA 1D A2 53 C4 1D 92 53 C2 1D 3E 40
-2C 00 B0 12 2A C2 BA C7 CE C8 C0 C3 A6 CB 32 D4
-02 D7 0A 4E 3E 4F 1A 83 2A 92 CA 2F 8A 10 5A 06
-6F 3F 3A D6 04 52 52 43 4D 00 84 12 D6 D6 50 00
-14 D7 04 52 52 41 4D 00 84 12 D6 D6 50 01 22 D7
-04 52 4C 41 4D 00 84 12 D6 D6 50 02 30 D7 04 52
-52 55 4D 00 84 12 D6 D6 50 03 85 12 00 3C 3E D7
-03 53 3E 3D 85 12 00 38 50 D7 02 53 3C 00 85 12
-00 34 CA D6 03 30 3E 3D 85 12 00 30 64 D7 02 30
-3C 00 85 12 00 30 00 00 02 55 3C 00 85 12 00 2C
-78 D7 03 55 3E 3D 85 12 00 28 6E D7 03 30 3C 3E
-85 12 00 24 8C D7 02 30 3D 00 85 12 00 20 50 C6
-02 49 46 00 1A 42 C4 1D 8A 4E 00 00 A2 53 C4 1D
-0E 4A 30 4D 82 D7 04 54 48 45 4E 00 1A 42 C4 1D
-08 4E 3E 4F 09 48 29 53 0A 89 0A 11 3A 90 00 02
-68 2F 88 DA 00 00 30 4D 4A D5 04 45 4C 53 45 00
-1A 42 C4 1D BA 40 00 3C 00 00 A2 53 C4 1D 2F 83
-8F 4A 00 00 E3 3F B6 D7 05 55 4E 54 49 4C 3A 4F
-08 4E 3E 4F 19 42 C4 1D 2A 83 0A 89 0A 11 3A 90
-00 FE 47 3B 3A F0 FF 03 08 DA 89 48 00 00 A2 53
-C4 1D 30 4D CE D5 05 41 47 41 49 4E 87 12 4A D7
-FE D7 2A C2 00 00 05 57 48 49 4C 45 87 12 A4 D7
-6E C2 2A C2 5A D7 06 52 45 50 45 41 54 00 87 12
-4A D7 FE D7 BC D7 2A C2 00 00 03 4A 4D 50 87 12
-98 CB 4A D7 FE D7 2A C2 3E B0 00 10 03 20 3E E0
-00 04 30 4D 3E 90 00 34 06 28 03 24 3E 40 00 34
-30 4D 3E 40 00 38 30 4D 00 00 04 3F 4A 4D 50 00
-87 12 68 D8 98 CB 6E C2 FE D7 2A C2 9E D8 3D 41
-08 4E 3E 4F 2A 48 0A 93 04 20 98 42 C4 1D 00 00
-30 4D 88 43 00 00 A4 3F 64 D6 03 42 57 31 84 12
-9C D8 00 00 BA D8 03 42 57 32 84 12 9C D8 00 00
-C6 D8 03 42 57 33 84 12 9C D8 00 00 DE D8 3D 41
-1A 42 C4 1D 28 4E 08 93 08 20 BA 4F 00 00 A2 53
-C4 1D 8E 4A 00 00 3E 4F 30 4D 8E 43 00 00 61 3F
-00 00 03 46 57 31 84 12 DC D8 00 00 02 D9 03 46
-57 32 84 12 DC D8 00 00 0E D9 03 46 57 33 84 12
-DC D8 00 00 1A D9 04 47 4F 54 4F 00 87 12 4A D7
-98 CB 8C C9 2A C2 8A D8 05 3F 47 4F 54 4F 87 12
-68 D8 98 CB 8C C9 2A C2
-@FFCE
-BA D0 BA D0 BA D0 BA D0 BA D0 BA D0 BA D0 BA D0
-BA D0 BA D0 BA D0 BA D0 BA D0 BA D0 BA D0 BA D0
-BA D0 5E C6 BA D0 BA D0 BA D0 BA D0 BA D0 BA D0
-BA D0
-q
+++ /dev/null
-@1800
-10 00 5E C6 C0 5D 60 EA FD FF 18 00 4C D9 02 D2
-2A C6 36 C6 00 00 00 00
-@1DAA
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00
-@C200
-3A 41 0D 12 0D 4A 30 4D 2F 83 8F 4E 00 00 3E 41
-2E 4E 30 4D 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E
-30 4D 00 00 04 45 58 49 54 00 3D 41 30 4D 00 00
-03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 C2
-03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
-44 55 50 00 0E 93 F6 23 30 4D 40 C2 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 C2 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E C2 02 3E 52 00 0E 12 3E 4F 30 4D 8E C2
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 C2
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C C2 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 C2 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 C3
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 C2 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA C2 03 41 4E 44 3E FF 30 4D 7A C2 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E C3 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 C3 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E C3 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 C3 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 C2 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
-3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE C3 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 C3 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 C3 03 3E 49 4E 85 12 C2 1D 10 C3
-04 42 41 53 45 00 85 12 DA 1D C0 C2 05 53 54 41
-54 45 85 12 B6 1D 30 C4 02 42 4C 00 85 12 20 00
-94 C3 02 3C 23 00 B2 40 AA 1D AA 1D 30 4D 1E 15
-0E 43 3D 40 20 00 0A 93 04 20 0D 11 0A 4C 0C 43
-09 43 0E 9B 01 28 0E 8B 09 69 08 68 1D 83 07 30
-0C 5C 0A 6A 0E 6E F5 2B 0E 8B 12 D3 F5 3F 0A 4E
-1D 17 30 41 48 C4 01 23 1B 42 DA 1D 2C 4F 0A 4E
-B0 12 5E C4 8F 49 00 00 0E 48 7A 90 0A 00 02 28
-3A 50 07 00 3A 50 30 00 92 83 AA 1D 18 42 AA 1D
-C8 4A 00 00 30 4D 96 C4 02 23 53 00 87 12 98 C4
-D2 C4 2D 83 09 93 E0 23 0E 93 DE 23 3D 41 30 4D
-C8 C4 02 23 3E 00 9F 42 AA 1D 00 00 3E 40 AA 1D
-2E 8F 30 4D 00 C4 04 48 4F 4C 44 00 0A 4E 3E 4F
-DB 3F 3C C4 04 53 49 47 4E 00 0E 93 3E 4F 3A 40
-2D 00 D2 33 30 4D F4 C3 03 55 44 2E 87 12 56 C4
-CC C4 E6 C4 44 C7 0C C7 2A C2 18 C5 02 55 2E 00
-2F 83 8F 4E 00 00 0E 43 F1 3F 3E B0 00 80 06 24
-BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D DA C2
-02 44 2E 00 87 12 56 C4 6E C2 80 C2 3A C5 CC C4
-92 C2 0A C5 E6 C4 44 C7 0C C7 2A C2 52 C3 01 2E
-3E B0 00 80 DD 27 2F 83 3E 43 EC 3F F6 C4 04 48
-45 52 45 00 2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D
-62 C3 05 41 4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D
-E2 C4 02 43 2C 00 1A 42 C4 1D CA 4E 00 00 92 53
-C4 1D 3E 4F 30 4D 2F 83 8F 4E 00 00 B0 12 2A C6
-92 B3 DC 05 FD 27 1E 42 CC 05 B0 12 36 C6 30 4D
-30 40 B6 C5 7E C5 05 28 4B 45 59 29 18 42 CC 05
-EA 3F 12 C4 03 4B 45 59 30 40 DC C5 92 C5 06 41
-43 43 45 50 54 00 3C 40 96 C6 3B 40 66 C6 2D 15
-0A 4E 2E 4F 0A 5E 3B 40 0D 00 3C 40 20 00 3D 40
-8A C6 92 B3 DC 05 05 24 18 42 CC 05 38 90 0A 00
-04 20 21 53 39 40 4A C6 4D 15 B2 40 11 00 CE 05
-E2 C2 03 02 30 41 B2 40 13 00 CE 05 E2 D2 03 02
-30 41 00 00 05 53 4C 45 45 50 30 40 58 C6 00 00
-07 28 53 4C 45 45 50 29 12 D2 0A 18 F6 3F 21 52
-3A 17 58 42 CC 05 48 9B E6 27 48 9C 06 2C 78 92
-0E 20 2E 9F 0C 24 1E 83 05 3C 0E 9A 03 24 CE 48
-00 00 1E 53 82 48 CE 05 30 4D 8C C6 2D 83 92 B3
-DC 05 FD 27 E6 23 B2 40 18 00 0A 18 3E 8F 3D 41
-30 4D D6 C5 06 28 45 4D 49 54 29 00 08 4E 3E 4F
-A2 B3 DC 05 FD 27 E6 3F 50 C5 04 45 4D 49 54 00
-30 40 AC C6 BA C6 04 45 43 48 4F 00 B2 40 82 48
-84 C6 30 4D 6E C5 06 4E 4F 45 43 48 4F 00 B2 40
-30 4D 84 C6 30 4D A4 C6 04 28 43 52 29 00 2F 83
-8F 4E 00 00 3E 40 0D 00 E3 3F A2 C5 02 43 52 00
-30 40 EE C6 04 C5 05 53 50 41 43 45 2F 83 8F 4E
-00 00 3E 40 20 00 D4 3F 06 C7 06 53 50 41 43 45
-53 00 0E 93 09 24 0D 12 3D 40 2E C7 EF 3F 30 C7
-2D 83 1E 83 EB 23 3D 41 3E 4F 30 4D 2C C5 04 54
-59 50 45 00 0E 93 95 24 2A 4F 8F 5E 00 00 0E 4A
-87 12 CA C3 02 C4 0A C3 C0 C6 EC C3 54 C7 2A C2
-2F 82 8F 4E 02 00 7E 4D 8F 4D 00 00 0D 5E 1D B3
-0D 63 30 4D 1A C7 82 53 22 00 87 12 34 C2 60 C7
-96 C9 34 C2 22 00 BA C7 8A C7 3D 41 6E 4E 1E 83
-82 5E C4 1D 3E 4F 92 B3 C4 1D A2 63 C4 1D 30 4D
-D6 C6 82 2E 22 00 87 12 7A C7 34 C2 44 C7 96 C9
-2A C2 00 00 04 57 4F 52 44 00 3C 40 BE 1D 39 4C
-3A 4C 09 5A 3A 5C 28 4C 09 9A 19 24 7E 9A FC 27
-1A 83 3B 40 60 00 C8 4C 00 00 09 9A 0C 24 7C 4A
-4E 9C 09 24 18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F
-7C 80 20 00 F0 3F 1A 82 C0 1D 82 4A C2 1D 1E 42
-C4 1D 08 8E CE 48 00 00 30 4D 00 00 04 46 49 4E
-44 00 2F 83 0C 4E 65 4C 74 40 80 00 3B 40 CA 1D
-3E 4B 0E 93 1E 24 58 4C 01 00 78 F0 1E 00 0E 58
-2E 53 1E 4E FE FF 0E 93 F3 27 09 4E 78 49 48 C4
-48 95 F7 23 0A 4C 1A 53 FA 99 00 00 F2 23 58 83
-FA 23 19 B3 09 63 0C 49 6A 4E 1E 43 4A 93 01 30
-2E 83 8F 4C 00 00 35 40 08 C2 34 40 14 C2 30 4D
-2F 53 2F 53 3E 4F 30 4D 26 C4 07 3E 4E 55 4D 42
-45 52 3C 4F 38 4F 29 4F 2F 82 1B 42 DA 1D 6A 4C
-7A 80 30 00 7A 90 0A 00 02 28 7A 80 07 00 0A 9B
-13 2C 82 49 D0 04 82 48 D2 04 82 4B C8 04 19 42
-E4 04 18 42 E6 04 09 5A 08 63 1C 53 1E 83 E7 23
-8F 49 04 00 8F 48 02 00 8F 4C 00 00 30 4D 03 12
-0D 12 1B 42 DA 1D 0B 12 32 C0 00 02 6D 4E 0D 5E
-0C 4E 7A 40 2E 00 0D 9C 0A 28 7A 9C FC 23 32 D0
-00 02 FC 4C FE FF 0D 9C FC 2F DE 83 00 00 09 43
-08 43 3D 40 44 C9 3F 82 8F 4E 06 00 0C 4E 7E 4C
-6A 4C 7A 90 2D 00 10 2C 3B 40 10 00 7A 80 24 00
-06 24 2B 43 5A 83 03 24 3B 52 6A 53 B0 23 1C 53
-1E 83 6A 4C 7A 90 2D 00 AA 23 1C 53 1E 83 B1 43
-04 00 A5 3F 46 C9 2F 53 0E 93 2C 17 82 4C DA 1D
-03 24 2F 52 0E F3 30 4D 9F 4F 02 00 04 00 BF 4F
-00 00 3E E3 09 20 3E E3 BF E3 02 00 BF E3 00 00
-9F 53 02 00 8F 63 00 00 32 B0 00 02 01 20 2F 53
-30 4D C6 C6 07 45 58 45 43 55 54 45 0A 4E 3E 4F
-00 4A 28 C3 01 2C 1A 42 C4 1D A2 53 C4 1D 8A 4E
-00 00 3E 4F 30 4D 94 C9 87 4C 49 54 45 52 41 4C
-82 93 B6 1D 16 24 32 B0 00 02 09 24 1A 42 C4 1D
-A2 52 C4 1D BA 40 34 C2 00 00 BA 4F 02 00 1A 42
-C4 1D A2 52 C4 1D BA 40 34 C2 00 00 8A 4E 02 00
-3E 4F 30 4D FC C6 05 43 4F 55 4E 54 2F 83 1E 53
-8F 4E 00 00 5E 4E FF FF 30 4D 82 4E BE 1D B2 4F
-C0 1D 3E 4F 82 43 C2 1D 87 12 4C C4 BA C7 10 CA
-3D 40 1C CA FE 22 3D 41 3E 4F 30 4D 1E CA 0A 4E
-3E 4F 3D 40 34 CA 53 27 3D 40 0A CA 1A E2 B6 1D
-B2 27 AC 23 36 CA 3E 4F 3D 40 0A CA B9 23 DE 53
-00 00 68 4E 08 5E F8 40 3F 00 00 00 3D 40 00 CC
-CD 3F 84 C9 08 45 56 41 4C 55 41 54 45 00 39 40
-BE 1D 39 12 39 12 39 12 0D 12 B0 12 2A C2 FA C9
-72 CA 3D 41 B2 41 C2 1D B2 41 C0 1D B2 41 BE 1D
-30 4D 7A C3 04 51 55 49 54 00 31 40 E0 1C B2 40
-00 1C 00 1C 82 43 B6 1D 82 43 08 18 B0 12 2A C2
-60 C7 04 0D 6F 6B 20 00 44 C7 34 C2 38 1D 44 C2
-34 C2 50 00 F6 C5 0C C7 FA C9 34 C2 7E 1C CE C2
-B2 C3 60 C7 0D 73 74 61 63 6B 20 65 6D 70 74 79
-20 21 0E CB 34 C2 30 FF 84 C5 B2 C3 60 C7 0B 46
-52 41 4D 20 66 75 6C 6C 20 21 0E CB 42 C4 F4 C2
-C0 C3 A0 CA 60 C7 04 0D 20 20 20 00 BC C3 A8 CA
-EE C5 05 41 42 4F 52 54 3F 40 80 1C BE 3F 8F 93
-02 00 AE 26 B2 40 82 48 84 C6 B0 12 00 D0 82 43
-C6 D8 82 43 D2 D8 82 43 DE D8 82 43 0E D9 82 43
-1A D9 82 43 26 D9 A2 B3 DC 05 FD 27 B2 40 11 00
-CE 05 E2 C2 03 02 92 C3 DC 05 38 40 F0 FF 39 42
-19 83 FE 23 18 83 FB 23 92 B3 DC 05 F4 23 87 12
-60 C7 04 1B 5B 37 6D 00 44 C7 44 C7 60 C7 04 1B
-5B 30 6D 00 44 C7 42 CF 84 CF 8A CF 08 CB 02 CB
-86 41 42 4F 52 54 22 00 87 12 7A C7 34 C2 0E CB
-96 C9 2A C2 0C C8 01 27 87 12 4C C4 BA C7 12 C8
-C0 C3 A6 CB 2A C2 3E CA 52 C4 81 5C 92 42 BE 1D
-C2 1D 30 4D 87 12 96 C7 4C C4 BA C7 BE CB 08 4E
-7A 4E 5A D3 5A 53 0A 58 19 42 C8 1D 6E 4E 3E F0
-1E 00 09 5E 82 48 AE 1D 82 49 B0 1D 82 4A B2 1D
-2A 52 82 4A C4 1D 3E 4F 3D 41 30 41 87 12 60 C7
-0F 73 74 61 63 6B 20 6D 69 73 6D 61 74 63 68 21
-14 CB 82 9F B4 1D F2 23 18 42 AE 1D 19 42 B0 1D
-A8 49 FE FF 89 48 00 00 30 4D B4 C7 08 56 41 52
-49 41 42 4C 45 00 B0 12 B4 CB BA 40 86 12 FC FF
-EF 3F E6 C9 08 43 4F 4E 53 54 41 4E 54 00 B0 12
-B4 CB BA 40 85 12 FC FF 8A 4E FE FF 3E 4F E0 3F
-34 CC 06 43 52 45 41 54 45 00 B0 12 B4 CB BA 40
-85 12 FC FF 8A 4A FE FF D3 3F 54 CA 05 44 4F 45
-53 3E 1A 42 B2 1D BA 40 84 12 00 00 8A 4D 02 00
-3D 41 30 4D 6C CC 05 44 45 46 45 52 B0 12 B4 CB
-BA 40 30 40 FC FF BA 40 82 CC FE FF B9 3F 00 00
-81 5B 82 43 B6 1D 30 4D AA CB 01 5D B2 43 B6 1D
-30 4D 76 C7 87 52 45 43 55 52 53 45 19 42 C4 1D
-99 42 B2 1D 00 00 A2 53 C4 1D 30 4D A0 CC 01 3A
-B0 12 B4 CB BA 40 87 12 FC FF A2 83 C4 1D B2 43
-B6 1D 82 4F B4 1D 30 4D CE CC 81 3B 82 93 B6 1D
-5D 27 87 12 34 C2 2A C2 96 C9 02 CC A2 CC 2A C2
-E8 C6 09 49 4D 4D 45 44 49 41 54 45 1A 42 AE 1D
-FA D0 80 00 00 00 30 4D BE 4F 02 00 3E 4F 30 4D
-02 CD 82 49 53 00 87 12 42 C4 F4 C2 C0 C3 3A CD
-46 CD 34 C2 18 CD 96 C9 2A C2 98 CB 18 CD 2A C2
-EA CC 83 5B 27 5D 87 12 98 CB 34 C2 34 C2 96 C9
-96 C9 2A C2 84 CA 88 50 4F 53 54 50 4F 4E 45 00
-87 12 4C C4 BA C7 12 C8 54 C2 C0 C3 A6 CB 7E C3
-C0 C3 80 CD 34 C2 34 C2 96 C9 96 C9 34 C2 96 C9
-96 C9 2A C2 86 CD 3A 4E 82 4A C6 1D 2E 4E 82 4E
-C4 1D 3D 40 10 00 09 4A 08 49 29 83 18 48 FE FF
-0E 98 FC 2B 89 48 00 00 1D 83 F6 23 2A 4A 0A 93
-F0 23 3E 4F 3D 41 30 4D 22 CD 82 49 46 00 2F 83
-8F 4E 00 00 1E 42 C4 1D BE 40 C0 C3 00 00 A2 52
-C4 1D 2E 53 30 4D 86 CC 84 45 4C 53 45 00 1A 42
-C4 1D BA 40 BC C3 00 00 2A 52 82 4A C4 1D 8E 4A
-00 00 2A 83 0E 4A 30 4D 3E C7 84 54 48 45 4E 00
-9E 42 C4 1D 00 00 3E 4F 30 4D 52 CC 85 42 45 47
-49 4E 30 40 84 C5 FA CD 85 55 4E 54 49 4C 39 40
-C0 C3 1A 42 C4 1D A2 52 C4 1D 8A 49 00 00 8A 4E
-02 00 3E 4F 30 4D 80 CB 85 41 47 41 49 4E 39 40
-BC C3 EF 3F 1C CC 85 57 48 49 4C 45 87 12 BE CD
-6E C2 2A C2 B4 CC 86 52 45 50 45 41 54 00 87 12
-3E CE 00 CE 2A C2 D8 CD 82 44 4F 00 2F 83 8F 4E
-00 00 1E 42 C4 1D BE 40 CA C3 00 00 2E 53 82 4E
-C4 1D A2 53 00 1C 1A 42 00 1C 8A 43 00 00 30 4D
-A8 C9 84 4C 4F 4F 50 00 39 40 EC C3 1A 42 C4 1D
-A2 52 C4 1D 8A 49 00 00 8A 4E 02 00 1E 42 00 1C
-A2 83 00 1C 2E 4E 0E 93 04 24 9E 42 C4 1D 00 00
-F5 3F 3E 4F 30 4D E4 C5 85 2B 4C 4F 4F 50 39 40
-DA C3 E4 3F 92 CE 85 4C 45 41 56 45 1A 42 C4 1D
-BA 40 FC C3 00 00 BA 40 BC C3 02 00 B2 50 06 00
-C4 1D A2 53 00 1C 2A 52 19 42 00 1C 89 4A 00 00
-30 4D D6 CE 04 4D 4F 56 45 00 0A 4E 38 4F 39 4F
-3E 4F 0A 93 11 24 08 99 0F 24 06 2C F8 49 00 00
-18 53 1A 83 FB 23 30 4D 08 5A 09 5A 19 83 18 83
-E8 49 00 00 1A 83 FA 23 30 4D 34 C2 CA 1D FC C2
-2A C2 84 12 3A CF 48 D2 1E D2 68 CE 96 CB 06 D2
-C8 CE 04 CF A2 C7 A8 CF DC CF 18 CE A2 D0 48 C3
-42 CD AA CC 7A C8 00 00 3A 40 0C 00 39 40 CA 1D
-38 40 CC 1D D9 3F 3A 40 0E 00 39 40 CC 1D 38 40
-CA 1D CC 3F 82 43 CC 1D 30 4D 92 42 CA 1D C8 1D
-30 4D 56 CD 09 50 57 52 5F 53 54 41 54 45 84 12
-84 CD 02 D2 4C D9 94 CF 08 50 57 52 5F 48 45 52
-45 00 92 42 C4 1D A4 CF 92 42 C6 1D A2 CF EF 3F
-56 CE 09 52 53 54 5F 53 54 41 54 45 92 42 0C 18
-A4 CF 92 42 0E 18 A2 CF E2 3F C2 CF 08 52 53 54
-5F 48 45 52 45 00 92 42 C4 1D 0C 18 92 42 C6 1D
-0E 18 DF 3F B2 40 48 D0 AA D0 B2 40 58 C6 4C C6
-B2 40 AC C6 C2 C6 B2 40 EE C6 02 C7 B2 40 DC C5
-EA C5 30 41 46 CE 04 57 49 50 45 00 39 40 80 FF
-B9 43 00 00 29 53 39 90 CE FF FA 23 B0 12 F4 CF
-B2 40 4C D9 C4 1D B2 40 02 D2 C6 1D D4 3F BA CD
-06 28 57 41 52 4D 29 00 1E 42 08 18 87 12 60 C7
-05 0D 1B 5B 37 6D 44 C7 70 C5 60 C7 27 20 46 61
-73 74 46 6F 72 74 68 20 56 31 36 30 20 32 34 4D
-48 7A 20 28 43 29 20 4A 2E 4D 2E 54 68 6F 6F 72
-65 6E 73 20 44 C7 34 C2 30 FF 84 C5 2A C3 30 C5
-60 C7 0B 62 79 74 65 73 20 66 72 65 65 20 1A CB
-16 D0 04 57 41 52 4D 00 30 40 48 D0 0C CE 04 43
-4F 4C 44 00 B2 40 04 A5 20 01 92 D3 30 01 B2 40
-88 5A 5C 01 F2 D0 10 00 16 02 B2 D0 00 84 04 02
-B2 D0 FF 7F 06 02 B2 40 FF 7F 02 02 F2 D0 07 00
-36 02 B2 D0 F0 00 04 02 B2 40 0F FF 02 02 B2 D0
-0F FF 06 02 F2 D0 0F 00 24 03 F2 40 F0 00 22 03
-F2 D0 F0 00 26 03 F2 40 A5 00 61 01 B2 40 86 00
-62 01 82 43 66 01 39 40 C0 00 B2 40 33 00 64 01
-D2 43 61 01 92 D2 9E 01 08 18 A2 93 08 18 01 24
-59 07 38 40 C2 A2 18 83 FE 23 19 83 FA 23 B2 D2
-B0 01 92 C3 B0 01 F2 D0 10 00 2A 03 F2 C0 40 00
-A1 04 3A 40 BA D0 39 40 CE FF 89 4A 00 00 29 53
-FC 23 92 42 02 18 F0 FF B2 40 18 00 0A 18 31 40
-E0 1C 3F 40 80 1C 37 40 00 C2 36 40 B4 C2 35 40
-08 C2 34 40 14 C2 B2 40 0A 00 DA 1D B2 43 AC 1D
-92 C3 30 01 18 42 08 18 D2 B3 01 02 04 20 38 E3
-18 53 82 48 08 18 B2 40 81 00 C0 05 A2 42 C6 05
-82 43 C8 05 F2 D0 03 00 0D 02 92 C3 C0 05 92 D3
-DA 05 3D 40 DC D1 18 42 08 18 38 90 0A 00 26 27
-38 90 16 00 23 2F 28 93 F9 22 E1 26 A8 D0 84 12
-3A CF 2A D8 D6 D8 DE D7 2A D9 A4 D7 5E D8 A8 D4
-00 00 9A D7 4A D8 FC D7 3A D8 B8 D5 00 00 00 00
-3C D9 66 CF 40 D0 85 48 49 32 4C 4F 87 12 84 C5
-D2 CD 96 C9 A2 CC 68 CF DE D1 2A C2 AE D0 04 43
-4F 44 45 00 B0 12 B4 CB A2 82 C4 1D 87 12 E2 CC
-BC C3 16 D2 00 00 07 45 4E 44 43 4F 44 45 87 12
-76 CF 02 CC 2A C2 38 CE 03 41 53 4D 92 42 C8 1D
-B8 1D B2 40 E2 D1 C8 1D E5 3F 36 D2 06 45 4E 44
-41 53 4D 00 92 42 B8 1D C8 1D E9 3F 00 00 05 43
-4F 4C 4F 4E 1A 42 C4 1D BA 40 87 12 00 00 A2 53
-C4 1D B2 43 B6 1D 30 40 76 CF 00 00 05 4C 4F 32
-48 49 1A 42 C4 1D BA 40 B0 12 00 00 BA 40 2A C2
-02 00 A2 52 C4 1D ED 3F 38 40 BE 1D 39 48 2A 48
-09 5A 1A 52 C2 1D 09 9A 03 24 7E 9A FC 27 1A 83
-0E 4A 2A 88 82 4A C2 1D 30 4D B0 12 2A C2 BA C7
-12 C8 72 C3 C0 C3 E0 D2 CE C8 C0 C3 A6 CB 02 D3
-E2 D2 29 4E 39 90 86 12 02 20 2E 53 30 41 39 90
-85 12 03 20 1E 4E 02 00 30 41 39 90 84 12 01 20
-2E 52 30 41 19 42 C4 1D A2 53 C4 1D 89 4E 00 00
-3E 40 29 00 12 12 C2 1D 92 53 C2 1D B0 12 2A C2
-BA C7 CE C8 C0 C3 34 D3 2A D3 21 53 3E 90 10 00
-BB 2D 30 41 36 D3 B2 41 C2 1D 22 D3 30 41 87 12
-4C C4 A8 D2 46 D3 82 43 BC 1D 92 42 C4 1D BA 1D
-A2 53 C4 1D 0A 4E 3E 4F FA 90 23 00 00 00 34 20
-92 53 C2 1D B0 12 CA D2 0E 93 04 20 B2 40 00 03
-BC 1D 27 3C 1E 93 04 20 B2 40 10 03 BC 1D 21 3C
-2E 93 04 20 B2 40 20 03 BC 1D 1B 3C 2E 92 04 20
-B2 40 20 02 BC 1D 15 3C 3E 92 04 20 B2 40 30 02
-BC 1D 0F 3C 3E 93 04 20 B2 40 30 03 BC 1D 09 3C
-B2 40 30 00 BC 1D 19 42 C4 1D A2 53 C4 1D 89 4E
-00 00 3E 4F 3D 41 30 4D FA 90 26 00 00 00 08 20
-B2 40 10 02 BC 1D 92 53 C2 1D 30 12 B6 D3 75 3F
-FA 90 40 00 00 00 1A 20 B2 40 20 00 BC 1D 92 53
-C2 1D B0 12 14 D3 0E 20 B2 50 10 00 BC 1D 3E 40
-2B 00 B0 12 14 D3 32 24 92 92 BE 1D C2 1D 02 24
-92 53 C2 1D 8E 10 82 5E BC 1D D3 3F B0 12 14 D3
-F9 23 B2 50 10 00 BC 1D 3E 40 28 00 B0 12 CA D2
-30 12 06 D4 67 3F 87 12 4C C4 A8 D2 3E D4 FE 90
-26 00 00 00 3E 40 20 00 04 20 B2 50 82 00 BC 1D
-C2 3F B0 12 14 D3 DF 23 B2 50 80 00 BC 1D 3E 40
-28 00 B0 12 CA D2 B0 12 04 D3 D5 23 3D 40 A6 CB
-30 4D 44 C6 04 52 45 54 49 00 87 12 34 C2 00 13
-96 C9 2A C2 34 C2 2C 00 3E D3 36 D4 8E D4 2E 4E
-1E D2 BC 1D 19 42 BA 1D 92 3F 8C D2 03 4D 4F 56
-84 12 84 D4 00 40 9C D4 05 4D 4F 56 2E 42 84 12
-84 D4 40 40 00 00 03 41 44 44 84 12 84 D4 00 50
-B6 D4 05 41 44 44 2E 42 84 12 84 D4 40 50 C2 D4
-04 41 44 44 43 00 84 12 84 D4 00 60 D0 D4 06 41
-44 44 43 2E 42 00 84 12 84 D4 40 60 74 D4 04 53
-55 42 43 00 84 12 84 D4 00 70 EE D4 06 53 55 42
-43 2E 42 00 84 12 84 D4 40 70 FC D4 03 53 55 42
-84 12 84 D4 00 80 0C D5 05 53 55 42 2E 42 84 12
-84 D4 40 80 6E D2 03 43 4D 50 84 12 84 D4 00 90
-26 D5 05 43 4D 50 2E 42 84 12 84 D4 40 90 5C D2
-04 44 41 44 44 00 84 12 84 D4 00 A0 40 D5 06 44
-41 44 44 2E 42 00 84 12 84 D4 40 A0 32 D5 03 42
-49 54 84 12 84 D4 00 B0 5E D5 05 42 49 54 2E 42
-84 12 84 D4 40 B0 6A D5 03 42 49 43 84 12 84 D4
-00 C0 78 D5 05 42 49 43 2E 42 84 12 84 D4 40 C0
-84 D5 03 42 49 53 84 12 84 D4 00 D0 92 D5 05 42
-49 53 2E 42 84 12 84 D4 40 D0 00 00 03 58 4F 52
-84 12 84 D4 00 E0 AC D5 05 58 4F 52 2E 42 84 12
-84 D4 40 E0 DE D4 03 41 4E 44 84 12 84 D4 00 F0
-C6 D5 05 41 4E 44 2E 42 84 12 84 D4 40 F0 4C C4
-3E D3 E4 D5 1A 42 BC 1D B2 F0 70 00 BC 1D 8A 10
-3A F0 0F 00 82 DA BC 1D 4A 3F 18 D5 03 52 52 43
-84 12 DE D5 00 10 FC D5 05 52 52 43 2E 42 84 12
-DE D5 40 10 08 D6 04 53 57 50 42 00 84 12 DE D5
-80 10 16 D6 03 52 52 41 84 12 DE D5 00 11 24 D6
-05 52 52 41 2E 42 84 12 DE D5 40 11 30 D6 03 53
-58 54 84 12 DE D5 80 11 00 00 04 50 55 53 48 00
-84 12 DE D5 00 12 4A D6 06 50 55 53 48 2E 42 00
-84 12 DE D5 40 12 9E D5 04 43 41 4C 4C 00 84 12
-DE D5 80 12 34 C2 2C 00 3E D3 36 D4 7E D6 59 42
-BC 1D 5A 42 BD 1D 82 4A BC 1D BE 90 00 15 00 00
-02 20 0A 89 02 3C 09 8A 0A 49 3A 90 10 00 03 2C
-5A 0E A8 3F 1A 53 0E 4A 87 12 70 C5 60 C7 0D 6F
-75 74 20 6F 66 20 62 6F 75 6E 64 73 14 CB 58 D6
-05 50 55 53 48 4D 84 12 74 D6 00 15 C0 D6 04 50
-4F 50 4D 00 84 12 74 D6 00 17 4C C4 A8 D2 E0 D6
-82 43 BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D 92 53
-C2 1D 3E 40 2C 00 B0 12 2A C2 BA C7 CE C8 C0 C3
-A6 CB 36 D4 06 D7 0A 4E 3E 4F 1A 83 2A 92 CA 2F
-8A 10 5A 06 6F 3F 3E D6 04 52 52 43 4D 00 84 12
-DA D6 50 00 18 D7 04 52 52 41 4D 00 84 12 DA D6
-50 01 26 D7 04 52 4C 41 4D 00 84 12 DA D6 50 02
-34 D7 04 52 52 55 4D 00 84 12 DA D6 50 03 85 12
-00 3C 42 D7 03 53 3E 3D 85 12 00 38 54 D7 02 53
-3C 00 85 12 00 34 CE D6 03 30 3E 3D 85 12 00 30
-68 D7 02 30 3C 00 85 12 00 30 00 00 02 55 3C 00
-85 12 00 2C 7C D7 03 55 3E 3D 85 12 00 28 72 D7
-03 30 3C 3E 85 12 00 24 90 D7 02 30 3D 00 85 12
-00 20 50 C6 02 49 46 00 1A 42 C4 1D 8A 4E 00 00
-A2 53 C4 1D 0E 4A 30 4D 86 D7 04 54 48 45 4E 00
-1A 42 C4 1D 08 4E 3E 4F 09 48 29 53 0A 89 0A 11
-3A 90 00 02 68 2F 88 DA 00 00 30 4D 4E D5 04 45
-4C 53 45 00 1A 42 C4 1D BA 40 00 3C 00 00 A2 53
-C4 1D 2F 83 8F 4A 00 00 E3 3F BA D7 05 55 4E 54
-49 4C 3A 4F 08 4E 3E 4F 19 42 C4 1D 2A 83 0A 89
-0A 11 3A 90 00 FE 47 3B 3A F0 FF 03 08 DA 89 48
-00 00 A2 53 C4 1D 30 4D D2 D5 05 41 47 41 49 4E
-87 12 4E D7 02 D8 2A C2 00 00 05 57 48 49 4C 45
-87 12 A8 D7 6E C2 2A C2 5E D7 06 52 45 50 45 41
-54 00 87 12 4E D7 02 D8 C0 D7 2A C2 00 00 03 4A
-4D 50 87 12 98 CB 4E D7 02 D8 2A C2 3E B0 00 10
-03 20 3E E0 00 04 30 4D 3E 90 00 34 06 28 03 24
-3E 40 00 34 30 4D 3E 40 00 38 30 4D 00 00 04 3F
-4A 4D 50 00 87 12 6C D8 98 CB 6E C2 02 D8 2A C2
-A2 D8 3D 41 08 4E 3E 4F 2A 48 0A 93 04 20 98 42
-C4 1D 00 00 30 4D 88 43 00 00 A4 3F 68 D6 03 42
-57 31 84 12 A0 D8 00 00 BE D8 03 42 57 32 84 12
-A0 D8 00 00 CA D8 03 42 57 33 84 12 A0 D8 00 00
-E2 D8 3D 41 1A 42 C4 1D 28 4E 08 93 08 20 BA 4F
-00 00 A2 53 C4 1D 8E 4A 00 00 3E 4F 30 4D 8E 43
-00 00 61 3F 00 00 03 46 57 31 84 12 E0 D8 00 00
-06 D9 03 46 57 32 84 12 E0 D8 00 00 12 D9 03 46
-57 33 84 12 E0 D8 00 00 1E D9 04 47 4F 54 4F 00
-87 12 4E D7 98 CB 8C C9 2A C2 8E D8 05 3F 47 4F
-54 4F 87 12 6C D8 98 CB 8C C9 2A C2
-@FFCE
-BA D0 BA D0 BA D0 BA D0 BA D0 BA D0 BA D0 BA D0
-BA D0 BA D0 BA D0 BA D0 BA D0 BA D0 BA D0 BA D0
-BA D0 5E C6 BA D0 BA D0 BA D0 BA D0 BA D0 BA D0
-BA D0
-q
@1800
-10 00 6A C6 C0 5D 00 24 FD FF 18 00 5A D9 10 D2
-2A C6 3C C6 00 00 00 00
+10 00 92 C6 C0 5D 00 24 05 00 18 00 C8 DA 80 D3
+52 C6 64 C6 00 00 00 00
@1DAA
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 C2
03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
44 55 50 00 0E 93 F6 23 30 4D 40 C2 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 C2 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E C2 02 3E 52 00 0E 12 3E 4F 30 4D 8E C2
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 C2
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C C2 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 C2 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 C3
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 C2 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA C2 03 41 4E 44 3E FF 30 4D 7A C2 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E C3 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 C3 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E C3 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 C3 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 C2 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
+50 00 3E 4F 30 4D 00 00 03 4E 49 50 2F 53 30 4D
+00 00 04 53 57 41 50 00 2A 4F 8F 4E 00 00 0E 4A
+30 4D 68 C2 04 4F 56 45 52 00 8F 4E FE FF 2E 4F
+2F 83 30 4D 72 C2 03 52 4F 54 2A 4F 8F 4E 00 00
+1E 4F 02 00 8F 4A 02 00 30 4D 4E C2 02 3E 52 00
+0E 12 3E 4F 30 4D 96 C2 02 52 3E 00 2F 83 8F 4E
+00 00 3E 41 30 4D B8 C2 02 52 40 00 2F 83 8F 4E
+00 00 2E 41 30 4D 5C C2 05 44 45 50 54 48 8F 4E
+FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D 00 00
+01 40 2E 4E 30 4D F0 C2 01 21 BE 4F 00 00 3E 4F
+30 4D 00 00 02 43 40 00 6E 4E 30 4D 04 C3 02 43
+21 00 FE 4F 00 00 1F 53 3E 4F 30 4D 00 00 01 2B
+3E 5F 30 4D 30 C2 01 2D 3E 8F 3E E3 1E 53 30 4D
+F8 C2 03 41 4E 44 3E FF 30 4D 84 C2 02 4F 52 00
+3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D 3C C3
+06 4E 45 47 41 54 45 00 E8 3F 32 C3 03 41 42 53
+0E 93 E3 33 30 4D D8 C2 04 44 41 42 53 00 3E F3
+06 34 BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D
+00 00 02 30 3D 00 1E 83 0E 7E 30 4D 82 C3 02 30
+3C 00 0E 5E 0E 7E 3E E3 30 4D 8E C3 02 30 3E 00
+1E 93 05 34 0B 3C 00 00 01 3D 3E 8F 07 20 3E 43
+30 4D A8 C3 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
+AC C2 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE C3 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 C3 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 C3 03 3E 49 4E 85 12 C2 1D 10 C3
-04 42 41 53 45 00 85 12 DA 1D C0 C2 05 53 54 41
-54 45 85 12 B6 1D 30 C4 02 42 4C 00 85 12 20 00
-94 C3 02 3C 23 00 B2 40 AA 1D AA 1D 30 4D 1E 15
-0E 43 3D 40 20 00 0A 93 04 20 0D 11 0A 4C 0C 43
-09 43 0E 9B 01 28 0E 8B 09 69 08 68 1D 83 07 30
-0C 5C 0A 6A 0E 6E F5 2B 0E 8B 12 D3 F5 3F 0A 4E
-1D 17 30 41 48 C4 01 23 1B 42 DA 1D 2C 4F 0A 4E
-B0 12 5E C4 8F 49 00 00 0E 48 7A 90 0A 00 02 28
-3A 50 07 00 3A 50 30 00 92 83 AA 1D 18 42 AA 1D
-C8 4A 00 00 30 4D 96 C4 02 23 53 00 87 12 98 C4
-D2 C4 2D 83 09 93 E0 23 0E 93 DE 23 3D 41 30 4D
-C8 C4 02 23 3E 00 9F 42 AA 1D 00 00 3E 40 AA 1D
-2E 8F 30 4D 00 C4 04 48 4F 4C 44 00 0A 4E 3E 4F
-DB 3F 3C C4 04 53 49 47 4E 00 0E 93 3E 4F 3A 40
-2D 00 D2 33 30 4D F4 C3 03 55 44 2E 87 12 56 C4
-CC C4 E6 C4 50 C7 18 C7 2A C2 18 C5 02 55 2E 00
-2F 83 8F 4E 00 00 0E 43 F1 3F 3E B0 00 80 06 24
-BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D DA C2
-02 44 2E 00 87 12 56 C4 6E C2 80 C2 3A C5 CC C4
-92 C2 0A C5 E6 C4 50 C7 18 C7 2A C2 52 C3 01 2E
-3E B0 00 80 DD 27 2F 83 3E 43 EC 3F F6 C4 04 48
-45 52 45 00 2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D
-62 C3 05 41 4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D
-E2 C4 02 43 2C 00 1A 42 C4 1D CA 4E 00 00 92 53
-C4 1D 3E 4F 30 4D 2F 83 8F 4E 00 00 B0 12 2A C6
-92 B3 DC 05 FD 27 1E 42 CC 05 B0 12 3C C6 30 4D
-30 40 B6 C5 7E C5 05 28 4B 45 59 29 18 42 CC 05
-EA 3F 12 C4 03 4B 45 59 30 40 DC C5 92 C5 06 41
-43 43 45 50 54 00 3C 40 A8 C6 3B 40 72 C6 2D 15
-0A 4E 2E 4F 0A 5E 3B 40 0D 00 3C 40 20 00 3D 40
-9C C6 92 B3 DC 05 05 24 18 42 CC 05 38 90 0A 00
-04 20 21 53 39 40 56 C6 4D 15 B2 40 11 00 CE 05
-A2 B3 DC 05 FD 27 E2 C2 03 02 30 41 B2 40 13 00
-CE 05 A2 B3 DC 05 FD 27 E2 D2 03 02 30 41 00 00
-05 53 4C 45 45 50 30 40 64 C6 00 00 07 28 53 4C
-45 45 50 29 12 D2 0A 18 F6 3F 21 52 3A 17 58 42
-CC 05 48 9B E3 27 48 9C 06 2C 78 92 11 20 2E 9F
-0F 24 1E 83 05 3C 0E 9A 03 24 CE 48 00 00 1E 53
-82 48 CE 05 A2 B3 DC 05 FD 27 30 4D 9E C6 2D 83
-92 B3 DC 05 FD 27 E3 23 B2 40 18 00 0A 18 3E 8F
-3D 41 30 4D D6 C5 06 28 45 4D 49 54 29 00 08 4E
-3E 4F E6 3F 50 C5 04 45 4D 49 54 00 30 40 BE C6
-C6 C6 04 45 43 48 4F 00 B2 40 82 48 90 C6 30 4D
-6E C5 06 4E 4F 45 43 48 4F 00 B2 40 30 4D 90 C6
-30 4D B6 C6 04 28 43 52 29 00 2F 83 8F 4E 00 00
-3E 40 0D 00 E3 3F A2 C5 02 43 52 00 30 40 FA C6
-04 C5 05 53 50 41 43 45 2F 83 8F 4E 00 00 3E 40
-20 00 D4 3F 12 C7 06 53 50 41 43 45 53 00 0E 93
-09 24 0D 12 3D 40 3A C7 EF 3F 3C C7 2D 83 1E 83
-EB 23 3D 41 3E 4F 30 4D 2C C5 04 54 59 50 45 00
-0E 93 95 24 2A 4F 8F 5E 00 00 0E 4A 87 12 CA C3
-02 C4 0A C3 CC C6 EC C3 60 C7 2A C2 2F 82 8F 4E
-02 00 7E 4D 8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D
-26 C7 82 53 22 00 87 12 34 C2 6C C7 A2 C9 34 C2
-22 00 C6 C7 96 C7 3D 41 6E 4E 1E 83 82 5E C4 1D
-3E 4F 92 B3 C4 1D A2 63 C4 1D 30 4D E2 C6 82 2E
-22 00 87 12 86 C7 34 C2 50 C7 A2 C9 2A C2 00 00
-04 57 4F 52 44 00 3C 40 BE 1D 39 4C 3A 4C 09 5A
-3A 5C 28 4C 09 9A 19 24 7E 9A FC 27 1A 83 3B 40
-60 00 C8 4C 00 00 09 9A 0C 24 7C 4A 4E 9C 09 24
-18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F 7C 80 20 00
-F0 3F 1A 82 C0 1D 82 4A C2 1D 1E 42 C4 1D 08 8E
-CE 48 00 00 30 4D 00 00 04 46 49 4E 44 00 2F 83
-0C 4E 65 4C 74 40 80 00 3B 40 CA 1D 3E 4B 0E 93
-1E 24 58 4C 01 00 78 F0 1E 00 0E 58 2E 53 1E 4E
-FE FF 0E 93 F3 27 09 4E 78 49 48 C4 48 95 F7 23
-0A 4C 1A 53 FA 99 00 00 F2 23 58 83 FA 23 19 B3
-09 63 0C 49 6A 4E 1E 43 4A 93 01 30 2E 83 8F 4C
-00 00 35 40 08 C2 34 40 14 C2 30 4D 2F 53 2F 53
-3E 4F 30 4D 26 C4 07 3E 4E 55 4D 42 45 52 3C 4F
-38 4F 29 4F 2F 82 1B 42 DA 1D 6A 4C 7A 80 30 00
-7A 90 0A 00 02 28 7A 80 07 00 0A 9B 13 2C 82 49
-D0 04 82 48 D2 04 82 4B C8 04 19 42 E4 04 18 42
-E6 04 09 5A 08 63 1C 53 1E 83 E7 23 8F 49 04 00
-8F 48 02 00 8F 4C 00 00 30 4D 03 12 0D 12 1B 42
-DA 1D 0B 12 32 C0 00 02 6D 4E 0D 5E 0C 4E 7A 40
-2E 00 0D 9C 0A 28 7A 9C FC 23 32 D0 00 02 FC 4C
-FE FF 0D 9C FC 2F DE 83 00 00 09 43 08 43 3D 40
-50 C9 3F 82 8F 4E 06 00 0C 4E 7E 4C 6A 4C 7A 90
-2D 00 10 2C 3B 40 10 00 7A 80 24 00 06 24 2B 43
-5A 83 03 24 3B 52 6A 53 B0 23 1C 53 1E 83 6A 4C
-7A 90 2D 00 AA 23 1C 53 1E 83 B1 43 04 00 A5 3F
-52 C9 2F 53 0E 93 2C 17 82 4C DA 1D 03 24 2F 52
-0E F3 30 4D 9F 4F 02 00 04 00 BF 4F 00 00 3E E3
-09 20 3E E3 BF E3 02 00 BF E3 00 00 9F 53 02 00
-8F 63 00 00 32 B0 00 02 01 20 2F 53 30 4D D2 C6
-07 45 58 45 43 55 54 45 0A 4E 3E 4F 00 4A 28 C3
-01 2C 1A 42 C4 1D A2 53 C4 1D 8A 4E 00 00 3E 4F
-30 4D A0 C9 87 4C 49 54 45 52 41 4C 82 93 B6 1D
-16 24 32 B0 00 02 09 24 1A 42 C4 1D A2 52 C4 1D
-BA 40 34 C2 00 00 BA 4F 02 00 1A 42 C4 1D A2 52
-C4 1D BA 40 34 C2 00 00 8A 4E 02 00 3E 4F 30 4D
-08 C7 05 43 4F 55 4E 54 2F 83 1E 53 8F 4E 00 00
-5E 4E FF FF 30 4D 82 4E BE 1D B2 4F C0 1D 3E 4F
-82 43 C2 1D 87 12 4C C4 C6 C7 1C CA 3D 40 28 CA
-FE 22 3D 41 3E 4F 30 4D 2A CA 0A 4E 3E 4F 3D 40
-40 CA 53 27 3D 40 16 CA 1A E2 B6 1D B2 27 AC 23
-42 CA 3E 4F 3D 40 16 CA B9 23 DE 53 00 00 68 4E
-08 5E F8 40 3F 00 00 00 3D 40 0C CC CD 3F 90 C9
-08 45 56 41 4C 55 41 54 45 00 39 40 BE 1D 39 12
-39 12 39 12 0D 12 B0 12 2A C2 06 CA 7E CA 3D 41
-B2 41 C2 1D B2 41 C0 1D B2 41 BE 1D 30 4D 7A C3
-04 51 55 49 54 00 31 40 E0 1C B2 40 00 1C 00 1C
-82 43 B6 1D 82 43 08 18 B0 12 2A C2 6C C7 04 0D
-6F 6B 20 00 50 C7 34 C2 38 1D 44 C2 34 C2 50 00
-F6 C5 18 C7 06 CA 34 C2 7E 1C CE C2 B2 C3 6C C7
-0D 73 74 61 63 6B 20 65 6D 70 74 79 20 21 1A CB
-34 C2 30 FF 84 C5 B2 C3 6C C7 0B 46 52 41 4D 20
-66 75 6C 6C 20 21 1A CB 42 C4 F4 C2 C0 C3 AC CA
-6C C7 04 0D 20 20 20 00 BC C3 B4 CA EE C5 05 41
-42 4F 52 54 3F 40 80 1C BE 3F 8F 93 02 00 AE 26
-B2 40 82 48 90 C6 B0 12 0C D0 82 43 D4 D8 82 43
-E0 D8 82 43 EC D8 82 43 1C D9 82 43 28 D9 82 43
-34 D9 A2 B3 DC 05 FD 27 B2 40 11 00 CE 05 E2 C2
-03 02 92 C3 DC 05 38 40 F0 FF 39 42 19 83 FE 23
-18 83 FB 23 92 B3 DC 05 F4 23 87 12 6C C7 04 1B
-5B 37 6D 00 50 C7 50 C7 6C C7 04 1B 5B 30 6D 00
-50 C7 4E CF 90 CF 96 CF 14 CB 0E CB 86 41 42 4F
-52 54 22 00 87 12 86 C7 34 C2 1A CB A2 C9 2A C2
-18 C8 01 27 87 12 4C C4 C6 C7 1E C8 C0 C3 B2 CB
-2A C2 4A CA 52 C4 81 5C 92 42 BE 1D C2 1D 30 4D
-87 12 A2 C7 4C C4 C6 C7 CA CB 08 4E 7A 4E 5A D3
-5A 53 0A 58 19 42 C8 1D 6E 4E 3E F0 1E 00 09 5E
-82 48 AE 1D 82 49 B0 1D 82 4A B2 1D 2A 52 82 4A
-C4 1D 3E 4F 3D 41 30 41 87 12 6C C7 0F 73 74 61
-63 6B 20 6D 69 73 6D 61 74 63 68 21 20 CB 82 9F
-B4 1D F2 23 18 42 AE 1D 19 42 B0 1D A8 49 FE FF
-89 48 00 00 30 4D C0 C7 08 56 41 52 49 41 42 4C
-45 00 B0 12 C0 CB BA 40 86 12 FC FF EF 3F F2 C9
-08 43 4F 4E 53 54 41 4E 54 00 B0 12 C0 CB BA 40
-85 12 FC FF 8A 4E FE FF 3E 4F E0 3F 40 CC 06 43
-52 45 41 54 45 00 B0 12 C0 CB BA 40 85 12 FC FF
-8A 4A FE FF D3 3F 60 CA 05 44 4F 45 53 3E 1A 42
-B2 1D BA 40 84 12 00 00 8A 4D 02 00 3D 41 30 4D
-78 CC 05 44 45 46 45 52 B0 12 C0 CB BA 40 30 40
-FC FF BA 40 8E CC FE FF B9 3F 00 00 81 5B 82 43
-B6 1D 30 4D B6 CB 01 5D B2 43 B6 1D 30 4D 82 C7
-87 52 45 43 55 52 53 45 19 42 C4 1D 99 42 B2 1D
-00 00 A2 53 C4 1D 30 4D AC CC 01 3A B0 12 C0 CB
-BA 40 87 12 FC FF A2 83 C4 1D B2 43 B6 1D 82 4F
-B4 1D 30 4D DA CC 81 3B 82 93 B6 1D 5D 27 87 12
-34 C2 2A C2 A2 C9 0E CC AE CC 2A C2 F4 C6 09 49
+0E 93 3E 4F FB 27 2D 53 30 4D 1E 83 0E 7E F9 3F
+39 40 00 80 39 8F 08 4E 3E 4F 08 59 19 15 30 4D
+81 5E 00 00 3E 4F 32 B0 00 01 E8 27 2D 53 21 52
+30 4D 91 53 00 00 F7 3F CE C3 06 55 4E 4C 4F 4F
+50 00 F5 3F 00 00 01 49 2F 83 8F 4E 00 00 2E 41
+1E 81 02 00 30 4D 1E C3 01 4A 2F 83 8F 4E 00 00
+1E 41 04 00 1E 81 06 00 30 4D 9C C3 03 50 41 44
+85 12 E2 1C 1A C4 03 54 49 42 85 12 38 1D 0E C3
+03 43 50 4C 85 12 50 00 C2 C3 03 3E 49 4E 85 12
+C2 1D 60 C4 04 42 41 53 45 00 85 12 DA 1D C8 C2
+05 53 54 41 54 45 85 12 B6 1D 74 C4 02 42 4C 00
+85 12 20 00 B4 C3 02 3C 23 00 B2 40 AA 1D AA 1D
+30 4D 8C C4 01 23 2C 4F 5B 42 DA 1D 0A 43 34 40
+20 00 0E 93 04 20 04 11 0E 4C 0C 43 09 43 0A 9B
+01 28 0A 8B 09 69 08 68 14 83 07 30 0C 5C 0E 6E
+0A 6A F5 2B 0A 8B 12 D3 F5 3F 34 40 14 C2 8F 49
+00 00 0E 48 7A 90 0A 00 02 28 3A 50 07 00 3A 50
+30 00 92 83 AA 1D 18 42 AA 1D C8 4A 00 00 30 4D
+A4 C4 02 23 53 00 87 12 A6 C4 0C C5 2D 83 09 93
+CA 23 0E 93 C8 23 3D 41 30 4D 02 C5 02 23 3E 00
+9F 42 AA 1D 00 00 3E 40 AA 1D 2E 8F 30 4D 26 C4
+04 48 4F 4C 44 00 0A 4E 3E 4F DB 3F 80 C4 04 53
+49 47 4E 00 0E 93 3E 4F 3A 40 2D 00 D2 33 30 4D
+56 C4 02 55 2E 00 87 12 9A C4 34 C2 00 00 06 C5
+20 C5 78 C7 40 C7 2A C2 68 C3 02 44 2E 00 87 12
+9A C4 78 C2 8A C2 6E C3 06 C5 9A C2 44 C5 20 C5
+78 C7 40 C7 2A C2 50 C3 01 2E 0E 93 E4 37 2F 83
+8F 4E 00 00 3E 43 EB 3F 30 C5 04 48 45 52 45 00
+2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D 5C C3 05 41
+4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D 1C C5 02 43
+2C 00 1A 42 C4 1D CA 4E 00 00 92 53 C4 1D 3E 4F
+30 4D 2F 83 8F 4E 00 00 B0 12 52 C6 92 B3 DC 05
+FD 27 1E 42 CC 05 B0 12 64 C6 30 4D 9A C5 05 28
+4B 45 59 29 18 42 CC 05 EC 3F 38 C4 03 4B 45 59
+30 40 F4 C5 AE C5 06 41 43 43 45 50 54 00 30 40
+1E C6 EE C5 08 28 41 43 43 45 50 54 29 00 3C 40
+D0 C6 3B 40 9A C6 2D 15 0A 4E 2E 4F 0A 5E 3B 40
+0D 00 3C 40 20 00 3D 40 C4 C6 92 B3 DC 05 05 24
+18 42 CC 05 38 90 0A 00 04 20 21 53 39 40 7E C6
+4D 15 B2 40 11 00 CE 05 E2 C2 03 02 A2 B3 DC 05
+FD 27 30 41 B2 40 13 00 CE 05 E2 D2 03 02 A2 B3
+DC 05 FD 27 30 41 00 00 05 53 4C 45 45 50 30 40
+8C C6 00 00 07 28 53 4C 45 45 50 29 12 D2 0A 18
+F6 3F 21 52 3A 17 58 42 CC 05 48 9B E3 27 48 9C
+06 2C 78 92 11 20 2E 9F 0F 24 1E 83 05 3C 0E 9A
+03 24 CE 48 00 00 1E 53 82 48 CE 05 A2 B3 DC 05
+FD 27 30 4D C6 C6 2D 83 92 B3 DC 05 FD 27 E3 23
+B2 40 18 00 0A 18 3E 8F 3D 41 30 4D 14 C6 06 28
+45 4D 49 54 29 00 08 4E 3E 4F E6 3F 6A C5 04 45
+4D 49 54 00 30 40 E6 C6 EE C6 04 45 43 48 4F 00
+B2 40 82 48 B8 C6 30 4D 88 C5 06 4E 4F 45 43 48
+4F 00 B2 40 30 4D B8 C6 30 4D DE C6 04 28 43 52
+29 00 2F 83 8F 4E 00 00 3E 40 0D 00 E3 3F BE C5
+02 43 52 00 30 40 22 C7 3E C5 05 53 50 41 43 45
+2F 83 8F 4E 00 00 3E 40 20 00 D4 3F 3A C7 06 53
+50 41 43 45 53 00 0E 93 09 24 0D 12 3D 40 62 C7
+EF 3F 64 C7 2D 83 1E 83 EB 23 3D 41 3E 4F 30 4D
+52 C5 04 54 59 50 45 00 0E 93 95 24 2A 4F 8F 5E
+00 00 0E 4A 87 12 F0 C3 28 C4 08 C3 F4 C6 12 C4
+88 C7 2A C2 2F 82 8F 4E 02 00 7E 4D 8F 4D 00 00
+0D 5E 1D B3 0D 63 30 4D 4E C7 82 53 22 00 87 12
+34 C2 94 C7 CA C9 34 C2 22 00 EE C7 BE C7 3D 41
+6E 4E 1E 83 82 5E C4 1D 3E 4F 92 B3 C4 1D A2 63
+C4 1D 30 4D 0A C7 82 2E 22 00 87 12 AE C7 34 C2
+78 C7 CA C9 2A C2 00 00 04 57 4F 52 44 00 3C 40
+BE 1D 39 4C 3A 4C 09 5A 3A 5C 28 4C 09 9A 19 24
+7E 9A FC 27 1A 83 3B 40 60 00 C8 4C 00 00 09 9A
+0C 24 7C 4A 4E 9C 09 24 18 53 4B 9C F6 2F 7C 90
+7B 00 F3 2F 7C 80 20 00 F0 3F 1A 82 C0 1D 82 4A
+C2 1D 1E 42 C4 1D 08 8E CE 48 00 00 30 4D 00 00
+04 46 49 4E 44 00 2F 83 0C 4E 65 4C 74 40 80 00
+3B 40 CA 1D 3E 4B 0E 93 1E 24 58 4C 01 00 78 F0
+1E 00 0E 58 2E 53 1E 4E FE FF 0E 93 F3 27 09 4E
+78 49 48 C4 48 95 F7 23 0A 4C 1A 53 FA 99 00 00
+F2 23 58 83 FA 23 19 B3 09 63 0C 49 6A 4E 1E 43
+4A 93 01 30 2E 83 8F 4C 00 00 35 40 08 C2 34 40
+14 C2 30 4D 2F 53 2F 53 3E 4F 30 4D 6A C4 07 3E
+4E 55 4D 42 45 52 3C 4F 38 4F 29 4F 2F 82 1B 42
+DA 1D 6A 4C 7A 80 30 00 7A 90 0A 00 02 28 7A 80
+07 00 0A 9B 13 2C 82 49 D0 04 82 48 D2 04 82 4B
+C8 04 19 42 E4 04 18 42 E6 04 09 5A 08 63 1C 53
+1E 83 E7 23 8F 49 04 00 8F 48 02 00 8F 4C 00 00
+30 4D 03 12 0D 12 1B 42 DA 1D 0B 12 32 C0 00 02
+6D 4E 0D 5E 0C 4E 7A 40 2E 00 0D 9C 0A 28 7A 9C
+FC 23 32 D0 00 02 FC 4C FE FF 0D 9C FC 2F DE 83
+00 00 09 43 08 43 3D 40 78 C9 3F 82 8F 4E 06 00
+0C 4E 7E 4C 6A 4C 7A 90 2D 00 10 2C 3B 40 10 00
+7A 80 24 00 06 24 2B 43 5A 83 03 24 3B 52 6A 53
+B0 23 1C 53 1E 83 6A 4C 7A 90 2D 00 AA 23 1C 53
+1E 83 B1 43 04 00 A5 3F 7A C9 2F 53 0E 93 2C 17
+82 4C DA 1D 03 24 2F 52 0E F3 30 4D 9F 4F 02 00
+04 00 BF 4F 00 00 3E E3 09 20 3E E3 BF E3 02 00
+BF E3 00 00 9F 53 02 00 8F 63 00 00 32 B0 00 02
+01 20 2F 53 30 4D FA C6 07 45 58 45 43 55 54 45
+0A 4E 3E 4F 00 4A 26 C3 01 2C 1A 42 C4 1D A2 53
+C4 1D 8A 4E 00 00 3E 4F 30 4D C8 C9 87 4C 49 54
+45 52 41 4C 82 93 B6 1D 0F 24 1A 42 C4 1D A2 52
+C4 1D BA 40 34 C2 00 00 8A 4E 02 00 3E 4F 32 B0
+00 02 32 C0 00 02 F1 23 30 4D 30 C7 05 43 4F 55
+4E 54 2F 83 1E 53 8F 4E 00 00 5E 4E FF FF 30 4D
+82 4E BE 1D B2 4F C0 1D 3E 4F 82 43 C2 1D 87 12
+90 C4 EE C7 36 CA 3D 40 42 CA 05 23 3D 41 3E 4F
+30 4D 44 CA 0A 4E 3E 4F 3D 40 5A CA 5A 27 3D 40
+30 CA 1A E2 B6 1D B9 27 B3 23 5C CA 3E 4F 3D 40
+30 CA C0 23 DE 53 00 00 68 4E 08 5E F8 40 3F 00
+00 00 3D 40 88 CC CD 3F B8 C9 08 45 56 41 4C 55
+41 54 45 00 39 40 BE 1D 3C 49 3B 49 3A 49 3D 15
+B0 12 2A C2 20 CA 98 CA B2 41 C2 1D B2 41 C0 1D
+B2 41 BE 1D 3D 41 30 4D 4C C4 04 51 55 49 54 00
+31 40 E0 1C B2 40 00 1C 00 1C 82 43 B6 1D 82 43
+08 18 B0 12 2A C2 94 C7 03 0D 6F 6B 78 C7 40 C7
+5A C4 44 C2 64 C4 0E C6 40 C7 20 CA DE C2 92 C3
+94 C7 0D 73 74 61 63 6B 20 65 6D 70 74 79 21 20
+2A CB 34 C2 30 FF A0 C5 D2 C3 94 C7 0B 46 52 41
+4D 20 66 75 6C 6C 21 20 2A CB 86 C4 F2 C2 E0 C3
+C6 CA 94 C7 03 0D 20 20 DC C3 CC CA 06 C6 05 41
+42 4F 52 54 3F 40 80 1C C3 3F 8F 93 02 00 BA 26
+B2 40 82 48 B8 C6 B0 12 3C D0 A2 B3 DC 05 FD 27
+B2 40 11 00 CE 05 E2 C2 03 02 92 C3 DC 05 38 40
+F0 FF 39 42 03 43 19 83 FD 23 18 83 FA 23 92 B3
+DC 05 F3 23 87 12 94 C7 04 1B 5B 37 6D 00 78 C7
+78 C7 94 C7 04 1B 5B 30 6D 00 78 C7 4A CF 8C CF
+92 CF DA CF 24 CB 1E CB 86 41 42 4F 52 54 22 00
+87 12 AE C7 34 C2 2A CB CA C9 2A C2 40 C8 01 27
+87 12 90 C4 EE C7 46 C8 E0 C3 AE CB 2A C2 64 CA
+96 C4 81 5C 92 42 BE 1D C2 1D 30 4D 00 00 81 5B
+82 43 B6 1D 30 4D B2 CB 01 5D B2 43 B6 1D 30 4D
+BE CB 83 5B 27 5D 87 12 A0 CB 34 C2 34 C2 CA C9
+CA C9 2A C2 BE 4F 02 00 3E 4F 30 4D 1C C7 82 49
+53 00 87 12 86 C4 F2 C2 E0 C3 06 CC D6 CB 34 C2
+E4 CB CA C9 2A C2 A0 CB E4 CB 2A C2 EE CB 09 49
4D 4D 45 44 49 41 54 45 1A 42 AE 1D FA D0 80 00
-00 00 30 4D BE 4F 02 00 3E 4F 30 4D 0E CD 82 49
-53 00 87 12 42 C4 F4 C2 C0 C3 46 CD 52 CD 34 C2
-24 CD A2 C9 2A C2 A4 CB 24 CD 2A C2 F6 CC 83 5B
-27 5D 87 12 A4 CB 34 C2 34 C2 A2 C9 A2 C9 2A C2
-90 CA 88 50 4F 53 54 50 4F 4E 45 00 87 12 4C C4
-C6 C7 1E C8 54 C2 C0 C3 B2 CB 7E C3 C0 C3 8C CD
-34 C2 34 C2 A2 C9 A2 C9 34 C2 A2 C9 A2 C9 2A C2
-92 CD 3A 4E 82 4A C6 1D 2E 4E 82 4E C4 1D 3D 40
-10 00 09 4A 08 49 29 83 18 48 FE FF 0E 98 FC 2B
-89 48 00 00 1D 83 F6 23 2A 4A 0A 93 F0 23 3E 4F
-3D 41 30 4D 2E CD 82 49 46 00 2F 83 8F 4E 00 00
-1E 42 C4 1D BE 40 C0 C3 00 00 A2 52 C4 1D 2E 53
-30 4D 92 CC 84 45 4C 53 45 00 1A 42 C4 1D BA 40
-BC C3 00 00 2A 52 82 4A C4 1D 8E 4A 00 00 2A 83
-0E 4A 30 4D 4A C7 84 54 48 45 4E 00 9E 42 C4 1D
-00 00 3E 4F 30 4D 5E CC 85 42 45 47 49 4E 30 40
-84 C5 06 CE 85 55 4E 54 49 4C 39 40 C0 C3 1A 42
-C4 1D A2 52 C4 1D 8A 49 00 00 8A 4E 02 00 3E 4F
-30 4D 8C CB 85 41 47 41 49 4E 39 40 BC C3 EF 3F
-28 CC 85 57 48 49 4C 45 87 12 CA CD 6E C2 2A C2
-C0 CC 86 52 45 50 45 41 54 00 87 12 4A CE 0C CE
-2A C2 E4 CD 82 44 4F 00 2F 83 8F 4E 00 00 1E 42
-C4 1D BE 40 CA C3 00 00 2E 53 82 4E C4 1D A2 53
-00 1C 1A 42 00 1C 8A 43 00 00 30 4D B4 C9 84 4C
-4F 4F 50 00 39 40 EC C3 1A 42 C4 1D A2 52 C4 1D
-8A 49 00 00 8A 4E 02 00 1E 42 00 1C A2 83 00 1C
-2E 4E 0E 93 04 24 9E 42 C4 1D 00 00 F5 3F 3E 4F
-30 4D E4 C5 85 2B 4C 4F 4F 50 39 40 DA C3 E4 3F
-9E CE 85 4C 45 41 56 45 1A 42 C4 1D BA 40 FC C3
-00 00 BA 40 BC C3 02 00 B2 50 06 00 C4 1D A2 53
-00 1C 2A 52 19 42 00 1C 89 4A 00 00 30 4D E2 CE
-04 4D 4F 56 45 00 0A 4E 38 4F 39 4F 3E 4F 0A 93
-11 24 08 99 0F 24 06 2C F8 49 00 00 18 53 1A 83
-FB 23 30 4D 08 5A 09 5A 19 83 18 83 E8 49 00 00
-1A 83 FA 23 30 4D 34 C2 CA 1D FC C2 2A C2 84 12
-46 CF 56 D2 2C D2 74 CE A2 CB 14 D2 D4 CE 10 CF
-AE C7 B4 CF E8 CF 24 CE AE D0 48 C3 4E CD B6 CC
-86 C8 00 00 3A 40 0C 00 39 40 CA 1D 38 40 CC 1D
-D9 3F 3A 40 0E 00 39 40 CC 1D 38 40 CA 1D CC 3F
-82 43 CC 1D 30 4D 92 42 CA 1D C8 1D 30 4D 62 CD
-09 50 57 52 5F 53 54 41 54 45 84 12 90 CD 10 D2
-5A D9 A0 CF 08 50 57 52 5F 48 45 52 45 00 92 42
-C4 1D B0 CF 92 42 C6 1D AE CF EF 3F 62 CE 09 52
-53 54 5F 53 54 41 54 45 92 42 0C 18 B0 CF 92 42
-0E 18 AE CF E2 3F CE CF 08 52 53 54 5F 48 45 52
-45 00 92 42 C4 1D 0C 18 92 42 C6 1D 0E 18 DF 3F
-B2 40 54 D0 B6 D0 B2 40 64 C6 58 C6 B2 40 BE C6
-CE C6 B2 40 FA C6 0E C7 B2 40 DC C5 EA C5 30 41
-52 CE 04 57 49 50 45 00 39 40 80 FF B9 43 00 00
-29 53 39 90 CE FF FA 23 B0 12 00 D0 B2 40 5A D9
-C4 1D B2 40 10 D2 C6 1D D4 3F C6 CD 06 28 57 41
-52 4D 29 00 1E 42 08 18 87 12 6C C7 05 0D 1B 5B
-37 6D 50 C7 70 C5 6C C7 27 20 46 61 73 74 46 6F
-72 74 68 20 56 31 36 30 20 32 34 4D 48 7A 20 28
+00 00 30 4D AA C7 87 52 45 43 55 52 53 45 19 42
+C4 1D 99 42 B2 1D 00 00 A2 53 C4 1D 30 4D AA CA
+88 50 4F 53 54 50 4F 4E 45 00 87 12 90 C4 EE C7
+46 C8 54 C2 E0 C3 AE CB 92 C3 E0 C3 6A CC 34 C2
+34 C2 CA C9 CA C9 34 C2 CA C9 CA C9 2A C2 82 9F
+B4 1D A0 24 87 12 94 C7 0F 73 74 61 63 6B 20 6D
+69 73 6D 61 74 63 68 21 30 CB 87 12 CA C7 90 C4
+EE C7 94 CC 08 4E 7A 4E 5A D3 5A 53 0A 58 19 42
+C8 1D 6E 4E 3E F0 1E 00 09 5E 82 48 AE 1D 82 49
+B0 1D 82 4A B2 1D 2A 52 82 4A C4 1D 3E 4F 3D 41
+30 41 E8 C7 08 56 41 52 49 41 42 4C 45 00 B0 12
+8A CC BA 40 86 12 FC FF 71 3C 0C CA 08 43 4F 4E
+53 54 41 4E 54 00 B0 12 8A CC BA 40 85 12 FC FF
+8A 4E FE FF 3E 4F 62 3C DC CC 06 43 52 45 41 54
+45 00 B0 12 8A CC BA 40 85 12 FC FF 8A 4A FE FF
+55 3C 7A CA 05 44 4F 45 53 3E 1A 42 B2 1D BA 40
+84 12 00 00 8A 4D 02 00 3D 41 30 4D 14 CD 05 44
+45 46 45 52 B0 12 8A CC BA 40 30 40 FC FF BA 40
+2A CD FE FF 3B 3C D2 CB 01 3A B0 12 8A CC BA 40
+87 12 FC FF A2 83 C4 1D B2 43 B6 1D 82 4F B4 1D
+30 4D 48 CD 81 3B 82 93 B6 1D 24 27 87 12 34 C2
+2A C2 CA C9 6E CC C0 CB 2A C2 7C CD 3D 41 B2 4E
+0E 18 A2 4E 0C 18 3E 4F 32 3D DC C9 06 4D 41 52
+4B 45 52 00 B0 12 8A CC BA 40 84 12 FC FF BA 40
+7A CD FE FF 9A 42 C6 1D 00 00 28 83 8A 48 02 00
+A2 52 C4 1D 18 42 AE 1D 19 42 B0 1D A8 49 FE FF
+89 48 00 00 30 4D 0E CC 82 49 46 00 2F 83 8F 4E
+00 00 1E 42 C4 1D A2 52 C4 1D BE 40 E0 C3 00 00
+2E 53 30 4D 2E CD 84 45 4C 53 45 00 A2 52 C4 1D
+1A 42 C4 1D BA 40 DC C3 FC FF 8E 4A 00 00 2A 83
+0E 4A 30 4D 72 C7 84 54 48 45 4E 00 9E 42 C4 1D
+00 00 3E 4F 30 4D FA CC 85 42 45 47 49 4E 30 40
+A0 C5 06 CE 85 55 4E 54 49 4C 39 40 E0 C3 A2 52
+C4 1D 1A 42 C4 1D 8A 49 FC FF 8A 4E FE FF 3E 4F
+30 4D 88 CB 85 41 47 41 49 4E 39 40 DC C3 EF 3F
+C4 CC 85 57 48 49 4C 45 87 12 CC CD 78 C2 2A C2
+26 CC 86 52 45 50 45 41 54 00 87 12 4A CE 0C CE
+2A C2 E6 CD 82 44 4F 00 2F 83 8F 4E 00 00 A2 53
+C4 1D 1E 42 C4 1D BE 40 F0 C3 FE FF A2 53 00 1C
+1A 42 00 1C 8A 43 00 00 30 4D 8C CD 84 4C 4F 4F
+50 00 39 40 12 C4 A2 52 C4 1D 1A 42 C4 1D 8A 49
+FC FF 8A 4E FE FF 1E 42 00 1C A2 83 00 1C 2E 4E
+0E 93 03 24 8E 4A 00 00 F6 3F 3E 4F 30 4D FC C5
+85 2B 4C 4F 4F 50 39 40 00 C4 E5 3F 9C CE 85 4C
+45 41 56 45 1A 42 C4 1D BA 40 22 C4 00 00 BA 40
+DC C3 02 00 B2 50 06 00 C4 1D A2 53 00 1C 2A 52
+19 42 00 1C 89 4A 00 00 30 4D DE CE 04 4D 4F 56
+45 00 0A 4E 38 4F 39 4F 3E 4F 0A 93 11 24 08 99
+0F 24 06 2C F8 49 00 00 18 53 1A 83 FB 23 30 4D
+08 5A 09 5A 19 83 18 83 E8 49 00 00 1A 83 FA 23
+30 4D 34 C2 CA 1D FA C2 2A C2 84 12 42 CF C6 D3
+9C D3 74 CE 9E CB 84 D3 D0 CE 0C CF D6 C7 FE CF
+18 D0 24 CE 1E D2 46 C3 A4 D1 C8 CB AE C8 00 00
+3A 40 0E 00 39 40 CA 1D 38 40 CC 1D D9 3F 3A 40
+0E 00 39 40 CC 1D 38 40 CA 1D CC 3F 82 43 CC 1D
+30 4D 92 42 CA 1D C8 1D 30 4D 9C CF 3A 4E 82 4A
+C6 1D 2E 4E 82 4E C4 1D 3D 40 10 00 09 4A 08 49
+29 83 18 48 FE FF 0E 98 FC 2B 89 48 00 00 1D 83
+F6 23 2A 4A 0A 93 F0 23 3E 4F 3D 41 30 4D 40 CC
+09 50 57 52 5F 53 54 41 54 45 84 12 9A CF 80 D3
+C8 DA 62 CE 09 52 53 54 5F 53 54 41 54 45 92 42
+0E 18 DE CF 92 42 0C 18 E0 CF EF 3F D0 CF 08 50
+57 52 5F 48 45 52 45 00 92 42 C6 1D DE CF 92 42
+C4 1D E0 CF 30 4D E4 CF 08 52 53 54 5F 48 45 52
+45 00 92 42 C6 1D 0E 18 92 42 C4 1D 0C 18 EC 3F
+B2 40 C4 D1 26 D2 B2 40 8C C6 80 C6 B2 40 E6 C6
+F6 C6 B2 40 22 C7 36 C7 B2 40 F4 C5 02 C6 82 43
+42 DA 82 43 4E DA 82 43 5A DA 82 43 8A DA 82 43
+96 DA 82 43 A2 DA 30 41 52 CE 04 57 49 50 45 00
+39 40 80 FF B9 43 00 00 29 53 39 90 CE FF FA 23
+B0 12 30 D0 B2 40 C8 DA 0C 18 B2 40 80 D3 0E 18
+AE 3F 18 CE 07 43 4F 4D 50 41 52 45 0C 4E 38 4F
+3B 4F 39 4F 0E 4B 0E 5C 0C 24 1B 83 07 30 1C 83
+07 30 19 53 F9 98 FF FF F5 27 02 2C 3E 43 30 4D
+1E 43 30 4D 64 CD 86 5B 54 48 45 4E 5D 00 30 4D
+1E 83 30 4D C6 D0 86 5B 45 4C 53 45 5D 00 87 12
+34 C2 01 00 90 C4 EE C7 12 CA 44 C2 E0 C3 4C D1
+8A C2 8A C2 94 C7 04 5B 49 46 5D 00 9C D0 EA C3
+0A D1 A6 C8 2C C3 DC C3 40 D1 8A C2 8A C2 94 C7
+06 5B 45 4C 53 45 5D 00 9C D0 EA C3 2E D1 A6 C8
+D0 D0 44 C2 E0 C3 2A D1 2C C3 DC C3 40 D1 94 C7
+06 5B 54 48 45 4E 5D 00 9C D0 EA C3 40 D1 D0 D0
+54 C2 EA C3 48 D1 2A C2 DC C3 E4 D0 A6 C8 94 C7
+03 0D 6B 6F 78 C7 40 C7 5A C4 44 C2 64 C4 0E C6
+62 D1 82 43 C2 1D 82 4E BE 1D B2 4F C0 1D 3E 4F
+3D 40 E4 D0 30 4D D6 D0 84 5B 49 46 5D 00 0E 93
+3E 4F AD 27 30 4D 78 D1 8B 5B 55 4E 44 45 46 49
+4E 45 44 5D 87 12 90 C4 EE C7 46 C8 6C C2 86 C3
+2A C2 88 D1 89 5B 44 45 46 49 4E 45 44 5D 87 12
+90 C4 EE C7 46 C8 6C C2 2A C2 C8 CD 06 28 57 41
+52 4D 29 00 1E 42 08 18 87 12 94 C7 05 0D 1B 5B
+37 6D 78 C7 8A C5 94 C7 27 20 46 61 73 74 46 6F
+72 74 68 20 56 31 36 32 20 32 34 4D 48 7A 20 28
43 29 20 4A 2E 4D 2E 54 68 6F 6F 72 65 6E 73 20
-50 C7 34 C2 30 FF 84 C5 2A C3 30 C5 6C C7 0B 62
-79 74 65 73 20 66 72 65 65 20 26 CB 22 D0 04 57
-41 52 4D 00 30 40 54 D0 18 CE 04 43 4F 4C 44 00
+78 C7 34 C2 30 FF A0 C5 28 C3 56 C5 94 C7 0B 62
+79 74 65 73 20 66 72 65 65 20 36 CB 6A D0 04 57
+41 52 4D 00 30 40 C4 D1 94 D0 04 43 4F 4C 44 00
B2 40 04 A5 20 01 92 D3 30 01 B2 40 88 5A 5C 01
F2 D0 10 00 16 02 B2 D0 00 84 04 02 B2 D0 FF 7F
06 02 B2 40 FF 7F 02 02 F2 D0 07 00 36 02 B2 D0
92 D2 9E 01 08 18 A2 93 08 18 01 24 59 07 38 40
C2 A2 18 83 FE 23 19 83 FA 23 B2 D2 B0 01 92 C3
B0 01 F2 D0 10 00 2A 03 F2 C0 40 00 A1 04 3A 40
-C6 D0 39 40 CE FF 89 4A 00 00 29 53 FC 23 92 42
+36 D2 39 40 CE FF 89 4A 00 00 29 53 FC 23 92 42
02 18 F0 FF B2 40 18 00 0A 18 31 40 E0 1C 3F 40
-80 1C 37 40 00 C2 36 40 B4 C2 35 40 08 C2 34 40
+80 1C 37 40 00 C2 36 40 BC C2 35 40 08 C2 34 40
14 C2 B2 40 0A 00 DA 1D B2 43 AC 1D 92 C3 30 01
18 42 08 18 D2 B3 01 02 04 20 38 E3 18 53 82 48
08 18 B2 40 81 00 C0 05 92 43 C6 05 B2 40 A1 00
C8 05 F2 D0 03 00 0D 02 92 C3 C0 05 92 D3 DA 05
-3D 40 EA D1 18 42 08 18 38 90 0A 00 25 27 38 90
-16 00 22 2F 28 93 F8 22 E0 26 B4 D0 84 12 46 CF
-38 D8 E4 D8 EC D7 38 D9 B2 D7 6C D8 B6 D4 00 00
-A8 D7 58 D8 0A D8 48 D8 C6 D5 00 00 00 00 4A D9
-72 CF 4C D0 85 48 49 32 4C 4F 87 12 84 C5 DE CD
-A2 C9 AE CC 74 CF EC D1 2A C2 BA D0 04 43 4F 44
-45 00 B0 12 C0 CB A2 82 C4 1D 87 12 EE CC BC C3
-24 D2 00 00 07 45 4E 44 43 4F 44 45 87 12 82 CF
-0E CC 2A C2 44 CE 03 41 53 4D 92 42 C8 1D B8 1D
-B2 40 F0 D1 C8 1D E5 3F 44 D2 06 45 4E 44 41 53
+3D 40 5A D3 18 42 08 18 38 90 0A 00 91 26 38 90
+16 00 8E 2E 28 93 4B 22 40 26 24 D2 84 12 42 CF
+A6 D9 52 DA 5A D9 A6 DA 20 D9 DA D9 24 D6 00 00
+16 D9 C6 D9 78 D9 B6 D9 34 D7 00 00 00 00 B8 DA
+6E CF BC D1 85 48 49 32 4C 4F 87 12 A0 C5 E0 CD
+CA C9 C0 CB 70 CF 5C D3 2A C2 2A D2 04 43 4F 44
+45 00 B0 12 8A CC A2 82 C4 1D 87 12 5C CD DC C3
+94 D3 00 00 07 45 4E 44 43 4F 44 45 87 12 7E CF
+6E CC 2A C2 44 CE 03 41 53 4D 92 42 C8 1D B8 1D
+B2 40 60 D3 C8 1D E5 3F B4 D3 06 45 4E 44 41 53
4D 00 92 42 B8 1D C8 1D E9 3F 00 00 05 43 4F 4C
4F 4E 1A 42 C4 1D BA 40 87 12 00 00 A2 53 C4 1D
-B2 43 B6 1D 30 40 82 CF 00 00 05 4C 4F 32 48 49
+B2 43 B6 1D 30 40 7E CF 00 00 05 4C 4F 32 48 49
1A 42 C4 1D BA 40 B0 12 00 00 BA 40 2A C2 02 00
A2 52 C4 1D ED 3F 38 40 BE 1D 39 48 2A 48 09 5A
1A 52 C2 1D 09 9A 03 24 7E 9A FC 27 1A 83 0E 4A
-2A 88 82 4A C2 1D 30 4D B0 12 2A C2 C6 C7 1E C8
-72 C3 C0 C3 EE D2 DA C8 C0 C3 B2 CB 10 D3 F0 D2
-29 4E 39 90 86 12 02 20 2E 53 30 41 39 90 85 12
-03 20 1E 4E 02 00 30 41 39 90 84 12 01 20 2E 52
-30 41 19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 40
-29 00 12 12 C2 1D 92 53 C2 1D B0 12 2A C2 C6 C7
-DA C8 C0 C3 42 D3 38 D3 21 53 3E 90 10 00 BB 2D
-30 41 44 D3 B2 41 C2 1D 22 D3 30 41 87 12 4C C4
-B6 D2 54 D3 82 43 BC 1D 92 42 C4 1D BA 1D A2 53
-C4 1D 0A 4E 3E 4F FA 90 23 00 00 00 34 20 92 53
-C2 1D B0 12 D8 D2 0E 93 04 20 B2 40 00 03 BC 1D
-27 3C 1E 93 04 20 B2 40 10 03 BC 1D 21 3C 2E 93
-04 20 B2 40 20 03 BC 1D 1B 3C 2E 92 04 20 B2 40
-20 02 BC 1D 15 3C 3E 92 04 20 B2 40 30 02 BC 1D
-0F 3C 3E 93 04 20 B2 40 30 03 BC 1D 09 3C B2 40
-30 00 BC 1D 19 42 C4 1D A2 53 C4 1D 89 4E 00 00
-3E 4F 3D 41 30 4D FA 90 26 00 00 00 08 20 B2 40
-10 02 BC 1D 92 53 C2 1D 30 12 C4 D3 75 3F FA 90
-40 00 00 00 1A 20 B2 40 20 00 BC 1D 92 53 C2 1D
-B0 12 22 D3 0E 20 B2 50 10 00 BC 1D 3E 40 2B 00
-B0 12 22 D3 32 24 92 92 BE 1D C2 1D 02 24 92 53
-C2 1D 8E 10 82 5E BC 1D D3 3F B0 12 22 D3 F9 23
-B2 50 10 00 BC 1D 3E 40 28 00 B0 12 D8 D2 30 12
-14 D4 67 3F 87 12 4C C4 B6 D2 4C D4 FE 90 26 00
-00 00 3E 40 20 00 04 20 B2 50 82 00 BC 1D C2 3F
-B0 12 22 D3 DF 23 B2 50 80 00 BC 1D 3E 40 28 00
-B0 12 D8 D2 B0 12 12 D3 D5 23 3D 40 B2 CB 30 4D
-50 C6 04 52 45 54 49 00 87 12 34 C2 00 13 A2 C9
-2A C2 34 C2 2C 00 4C D3 44 D4 9C D4 2E 4E 1E D2
-BC 1D 19 42 BA 1D 92 3F 9A D2 03 4D 4F 56 84 12
-92 D4 00 40 AA D4 05 4D 4F 56 2E 42 84 12 92 D4
-40 40 00 00 03 41 44 44 84 12 92 D4 00 50 C4 D4
-05 41 44 44 2E 42 84 12 92 D4 40 50 D0 D4 04 41
-44 44 43 00 84 12 92 D4 00 60 DE D4 06 41 44 44
-43 2E 42 00 84 12 92 D4 40 60 82 D4 04 53 55 42
-43 00 84 12 92 D4 00 70 FC D4 06 53 55 42 43 2E
-42 00 84 12 92 D4 40 70 0A D5 03 53 55 42 84 12
-92 D4 00 80 1A D5 05 53 55 42 2E 42 84 12 92 D4
-40 80 7C D2 03 43 4D 50 84 12 92 D4 00 90 34 D5
-05 43 4D 50 2E 42 84 12 92 D4 40 90 6A D2 04 44
-41 44 44 00 84 12 92 D4 00 A0 4E D5 06 44 41 44
-44 2E 42 00 84 12 92 D4 40 A0 40 D5 03 42 49 54
-84 12 92 D4 00 B0 6C D5 05 42 49 54 2E 42 84 12
-92 D4 40 B0 78 D5 03 42 49 43 84 12 92 D4 00 C0
-86 D5 05 42 49 43 2E 42 84 12 92 D4 40 C0 92 D5
-03 42 49 53 84 12 92 D4 00 D0 A0 D5 05 42 49 53
-2E 42 84 12 92 D4 40 D0 00 00 03 58 4F 52 84 12
-92 D4 00 E0 BA D5 05 58 4F 52 2E 42 84 12 92 D4
-40 E0 EC D4 03 41 4E 44 84 12 92 D4 00 F0 D4 D5
-05 41 4E 44 2E 42 84 12 92 D4 40 F0 4C C4 4C D3
-F2 D5 1A 42 BC 1D B2 F0 70 00 BC 1D 8A 10 3A F0
-0F 00 82 DA BC 1D 4A 3F 26 D5 03 52 52 43 84 12
-EC D5 00 10 0A D6 05 52 52 43 2E 42 84 12 EC D5
-40 10 16 D6 04 53 57 50 42 00 84 12 EC D5 80 10
-24 D6 03 52 52 41 84 12 EC D5 00 11 32 D6 05 52
-52 41 2E 42 84 12 EC D5 40 11 3E D6 03 53 58 54
-84 12 EC D5 80 11 00 00 04 50 55 53 48 00 84 12
-EC D5 00 12 58 D6 06 50 55 53 48 2E 42 00 84 12
-EC D5 40 12 AC D5 04 43 41 4C 4C 00 84 12 EC D5
-80 12 34 C2 2C 00 4C D3 44 D4 8C D6 59 42 BC 1D
-5A 42 BD 1D 82 4A BC 1D BE 90 00 15 00 00 02 20
-0A 89 02 3C 09 8A 0A 49 3A 90 10 00 03 2C 5A 0E
-A8 3F 1A 53 0E 4A 87 12 70 C5 6C C7 0D 6F 75 74
-20 6F 66 20 62 6F 75 6E 64 73 20 CB 66 D6 05 50
-55 53 48 4D 84 12 82 D6 00 15 CE D6 04 50 4F 50
-4D 00 84 12 82 D6 00 17 4C C4 B6 D2 EE D6 82 43
-BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D 92 53 C2 1D
-3E 40 2C 00 B0 12 2A C2 C6 C7 DA C8 C0 C3 B2 CB
-44 D4 14 D7 0A 4E 3E 4F 1A 83 2A 92 CA 2F 8A 10
-5A 06 6F 3F 4C D6 04 52 52 43 4D 00 84 12 E8 D6
-50 00 26 D7 04 52 52 41 4D 00 84 12 E8 D6 50 01
-34 D7 04 52 4C 41 4D 00 84 12 E8 D6 50 02 42 D7
-04 52 52 55 4D 00 84 12 E8 D6 50 03 85 12 00 3C
-50 D7 03 53 3E 3D 85 12 00 38 62 D7 02 53 3C 00
-85 12 00 34 DC D6 03 30 3E 3D 85 12 00 30 76 D7
-02 30 3C 00 85 12 00 30 00 00 02 55 3C 00 85 12
-00 2C 8A D7 03 55 3E 3D 85 12 00 28 80 D7 03 30
-3C 3E 85 12 00 24 9E D7 02 30 3D 00 85 12 00 20
-5C C6 02 49 46 00 1A 42 C4 1D 8A 4E 00 00 A2 53
-C4 1D 0E 4A 30 4D 94 D7 04 54 48 45 4E 00 1A 42
-C4 1D 08 4E 3E 4F 09 48 29 53 0A 89 0A 11 3A 90
-00 02 68 2F 88 DA 00 00 30 4D 5C D5 04 45 4C 53
-45 00 1A 42 C4 1D BA 40 00 3C 00 00 A2 53 C4 1D
-2F 83 8F 4A 00 00 E3 3F C8 D7 05 55 4E 54 49 4C
-3A 4F 08 4E 3E 4F 19 42 C4 1D 2A 83 0A 89 0A 11
-3A 90 00 FE 47 3B 3A F0 FF 03 08 DA 89 48 00 00
-A2 53 C4 1D 30 4D E0 D5 05 41 47 41 49 4E 87 12
-5C D7 10 D8 2A C2 00 00 05 57 48 49 4C 45 87 12
-B6 D7 6E C2 2A C2 6C D7 06 52 45 50 45 41 54 00
-87 12 5C D7 10 D8 CE D7 2A C2 00 00 03 4A 4D 50
-87 12 A4 CB 5C D7 10 D8 2A C2 3E B0 00 10 03 20
-3E E0 00 04 30 4D 3E 90 00 34 06 28 03 24 3E 40
-00 34 30 4D 3E 40 00 38 30 4D 00 00 04 3F 4A 4D
-50 00 87 12 7A D8 A4 CB 6E C2 10 D8 2A C2 B0 D8
-3D 41 08 4E 3E 4F 2A 48 0A 93 04 20 98 42 C4 1D
-00 00 30 4D 88 43 00 00 A4 3F 76 D6 03 42 57 31
-84 12 AE D8 00 00 CC D8 03 42 57 32 84 12 AE D8
-00 00 D8 D8 03 42 57 33 84 12 AE D8 00 00 F0 D8
-3D 41 1A 42 C4 1D 28 4E 08 93 08 20 BA 4F 00 00
-A2 53 C4 1D 8E 4A 00 00 3E 4F 30 4D 8E 43 00 00
-61 3F 00 00 03 46 57 31 84 12 EE D8 00 00 14 D9
-03 46 57 32 84 12 EE D8 00 00 20 D9 03 46 57 33
-84 12 EE D8 00 00 2C D9 04 47 4F 54 4F 00 87 12
-5C D7 A4 CB 98 C9 2A C2 9C D8 05 3F 47 4F 54 4F
-87 12 7A D8 A4 CB 98 C9 2A C2
+2A 88 82 4A C2 1D 30 4D B0 12 2A C2 EE C7 46 C8
+EA C3 5C D4 02 C9 E0 C3 AE CB 7E D4 5E D4 29 4E
+39 90 86 12 02 20 2E 53 30 41 39 90 85 12 03 20
+1E 4E 02 00 30 41 39 90 84 12 01 20 2E 52 30 41
+19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 40 29 00
+12 12 C2 1D 92 53 C2 1D B0 12 2A C2 EE C7 02 C9
+E0 C3 B0 D4 A6 D4 21 53 3E 90 10 00 BB 2D 30 41
+B2 D4 B2 41 C2 1D 22 D3 30 41 87 12 90 C4 26 D4
+C2 D4 82 43 BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D
+0A 4E 3E 4F FA 90 23 00 00 00 34 20 92 53 C2 1D
+B0 12 48 D4 0E 93 04 20 B2 40 00 03 BC 1D 27 3C
+1E 93 04 20 B2 40 10 03 BC 1D 21 3C 2E 93 04 20
+B2 40 20 03 BC 1D 1B 3C 2E 92 04 20 B2 40 20 02
+BC 1D 15 3C 3E 92 04 20 B2 40 30 02 BC 1D 0F 3C
+3E 93 04 20 B2 40 30 03 BC 1D 09 3C B2 40 30 00
+BC 1D 19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 4F
+3D 41 30 4D FA 90 26 00 00 00 08 20 B2 40 10 02
+BC 1D 92 53 C2 1D 30 12 32 D5 76 3F FA 90 40 00
+00 00 1A 20 B2 40 20 00 BC 1D 92 53 C2 1D B0 12
+90 D4 0E 20 B2 50 10 00 BC 1D 3E 40 2B 00 B0 12
+90 D4 32 24 92 92 BE 1D C2 1D 02 24 92 53 C2 1D
+8E 10 82 5E BC 1D D3 3F B0 12 90 D4 F9 23 B2 50
+10 00 BC 1D 3E 40 28 00 B0 12 48 D4 30 12 82 D5
+67 3F 87 12 90 C4 26 D4 BA D5 FE 90 26 00 00 00
+3E 40 20 00 04 20 B2 50 82 00 BC 1D C2 3F B0 12
+90 D4 DF 23 B2 50 80 00 BC 1D 3E 40 28 00 B0 12
+48 D4 B0 12 80 D4 D5 23 3D 40 AE CB 30 4D 78 C6
+04 52 45 54 49 00 87 12 34 C2 00 13 CA C9 2A C2
+34 C2 2C 00 BA D4 B2 D5 0A D6 2E 4E 1E D2 BC 1D
+19 42 BA 1D 92 3F 0A D4 03 4D 4F 56 84 12 00 D6
+00 40 18 D6 05 4D 4F 56 2E 42 84 12 00 D6 40 40
+00 00 03 41 44 44 84 12 00 D6 00 50 32 D6 05 41
+44 44 2E 42 84 12 00 D6 40 50 3E D6 04 41 44 44
+43 00 84 12 00 D6 00 60 4C D6 06 41 44 44 43 2E
+42 00 84 12 00 D6 40 60 F0 D5 04 53 55 42 43 00
+84 12 00 D6 00 70 6A D6 06 53 55 42 43 2E 42 00
+84 12 00 D6 40 70 78 D6 03 53 55 42 84 12 00 D6
+00 80 88 D6 05 53 55 42 2E 42 84 12 00 D6 40 80
+EC D3 03 43 4D 50 84 12 00 D6 00 90 A2 D6 05 43
+4D 50 2E 42 84 12 00 D6 40 90 DA D3 04 44 41 44
+44 00 84 12 00 D6 00 A0 BC D6 06 44 41 44 44 2E
+42 00 84 12 00 D6 40 A0 AE D6 03 42 49 54 84 12
+00 D6 00 B0 DA D6 05 42 49 54 2E 42 84 12 00 D6
+40 B0 E6 D6 03 42 49 43 84 12 00 D6 00 C0 F4 D6
+05 42 49 43 2E 42 84 12 00 D6 40 C0 00 D7 03 42
+49 53 84 12 00 D6 00 D0 0E D7 05 42 49 53 2E 42
+84 12 00 D6 40 D0 00 00 03 58 4F 52 84 12 00 D6
+00 E0 28 D7 05 58 4F 52 2E 42 84 12 00 D6 40 E0
+5A D6 03 41 4E 44 84 12 00 D6 00 F0 42 D7 05 41
+4E 44 2E 42 84 12 00 D6 40 F0 90 C4 BA D4 60 D7
+1A 42 BC 1D B2 F0 70 00 BC 1D 8A 10 3A F0 0F 00
+82 DA BC 1D 4A 3F 94 D6 03 52 52 43 84 12 5A D7
+00 10 78 D7 05 52 52 43 2E 42 84 12 5A D7 40 10
+84 D7 04 53 57 50 42 00 84 12 5A D7 80 10 92 D7
+03 52 52 41 84 12 5A D7 00 11 A0 D7 05 52 52 41
+2E 42 84 12 5A D7 40 11 AC D7 03 53 58 54 84 12
+5A D7 80 11 00 00 04 50 55 53 48 00 84 12 5A D7
+00 12 C6 D7 06 50 55 53 48 2E 42 00 84 12 5A D7
+40 12 1A D7 04 43 41 4C 4C 00 84 12 5A D7 80 12
+34 C2 2C 00 BA D4 B2 D5 FA D7 59 42 BC 1D 5A 42
+BD 1D 82 4A BC 1D BE 90 00 15 00 00 02 20 0A 89
+02 3C 09 8A 0A 49 3A 90 10 00 03 2C 5A 0E A8 3F
+1A 53 0E 4A 87 12 8A C5 94 C7 0D 6F 75 74 20 6F
+66 20 62 6F 75 6E 64 73 30 CB D4 D7 05 50 55 53
+48 4D 84 12 F0 D7 00 15 3C D8 04 50 4F 50 4D 00
+84 12 F0 D7 00 17 90 C4 26 D4 5C D8 82 43 BC 1D
+92 42 C4 1D BA 1D A2 53 C4 1D 92 53 C2 1D 3E 40
+2C 00 B0 12 2A C2 EE C7 02 C9 E0 C3 AE CB B2 D5
+82 D8 0A 4E 3E 4F 1A 83 2A 92 CA 2F 8A 10 5A 06
+6F 3F BA D7 04 52 52 43 4D 00 84 12 56 D8 50 00
+94 D8 04 52 52 41 4D 00 84 12 56 D8 50 01 A2 D8
+04 52 4C 41 4D 00 84 12 56 D8 50 02 B0 D8 04 52
+52 55 4D 00 84 12 56 D8 50 03 85 12 00 3C BE D8
+03 53 3E 3D 85 12 00 38 D0 D8 02 53 3C 00 85 12
+00 34 4A D8 03 30 3E 3D 85 12 00 30 E4 D8 02 30
+3C 00 85 12 00 30 00 00 02 55 3C 00 85 12 00 2C
+F8 D8 03 55 3E 3D 85 12 00 28 EE D8 03 30 3C 3E
+85 12 00 24 0C D9 02 30 3D 00 85 12 00 20 84 C6
+02 49 46 00 1A 42 C4 1D 8A 4E 00 00 A2 53 C4 1D
+0E 4A 30 4D 02 D9 04 54 48 45 4E 00 1A 42 C4 1D
+08 4E 3E 4F 09 48 29 53 0A 89 0A 11 3A 90 00 02
+68 2F 88 DA 00 00 30 4D CA D6 04 45 4C 53 45 00
+1A 42 C4 1D BA 40 00 3C 00 00 A2 53 C4 1D 2F 83
+8F 4A 00 00 E3 3F 36 D9 05 55 4E 54 49 4C 3A 4F
+08 4E 3E 4F 19 42 C4 1D 2A 83 0A 89 0A 11 3A 90
+00 FE 47 3B 3A F0 FF 03 08 DA 89 48 00 00 A2 53
+C4 1D 30 4D 4E D7 05 41 47 41 49 4E 87 12 CA D8
+7E D9 2A C2 00 00 05 57 48 49 4C 45 87 12 24 D9
+78 C2 2A C2 DA D8 06 52 45 50 45 41 54 00 87 12
+CA D8 7E D9 3C D9 2A C2 00 00 03 4A 4D 50 87 12
+A0 CB CA D8 7E D9 2A C2 3E B0 00 10 03 20 3E E0
+00 04 30 4D 3E 90 00 34 06 28 03 24 3E 40 00 34
+30 4D 3E 40 00 38 30 4D 00 00 04 3F 4A 4D 50 00
+87 12 E8 D9 A0 CB 78 C2 7E D9 2A C2 1E DA 3D 41
+08 4E 3E 4F 2A 48 0A 93 04 20 98 42 C4 1D 00 00
+30 4D 88 43 00 00 A4 3F E4 D7 03 42 57 31 84 12
+1C DA 00 00 3A DA 03 42 57 32 84 12 1C DA 00 00
+46 DA 03 42 57 33 84 12 1C DA 00 00 5E DA 3D 41
+1A 42 C4 1D 28 4E 08 93 08 20 BA 4F 00 00 A2 53
+C4 1D 8E 4A 00 00 3E 4F 30 4D 8E 43 00 00 61 3F
+00 00 03 46 57 31 84 12 5C DA 00 00 82 DA 03 46
+57 32 84 12 5C DA 00 00 8E DA 03 46 57 33 84 12
+5C DA 00 00 9A DA 04 47 4F 54 4F 00 87 12 CA D8
+A0 CB C0 C9 2A C2 0A DA 05 3F 47 4F 54 4F 87 12
+E8 D9 A0 CB C0 C9 2A C2
@FFCE
-C6 D0 C6 D0 C6 D0 C6 D0 C6 D0 C6 D0 C6 D0 C6 D0
-C6 D0 C6 D0 C6 D0 C6 D0 C6 D0 C6 D0 C6 D0 C6 D0
-C6 D0 6A C6 C6 D0 C6 D0 C6 D0 C6 D0 C6 D0 C6 D0
-C6 D0
+36 D2 36 D2 36 D2 36 D2 36 D2 36 D2 36 D2 36 D2
+36 D2 36 D2 36 D2 36 D2 36 D2 36 D2 36 D2 36 D2
+36 D2 92 C6 36 D2 36 D2 36 D2 36 D2 36 D2 36 D2
+36 D2
q
+++ /dev/null
-\prog\MSP430Flasher\msp430flasher -m SBW2 -n MSP430fr5739 -v -w %1 -z [VCC=3000]
-exit
-
-tip : how to calculate MAIN program lenght ?
-
-open the prog.txt file with your editor, select MAIN section
-in status bar, keep the number of selected chars
-if lines are ended with CR+LF, substract the number of lines selected
-then divide by 3.
; PORT3 usage
; PORT4 usage
-; switch S1
-SWITCHIN .set P4IN ; port
-S1 .set 020h ; P4.5
-
-; P4.6 as LED1 output low
+; P4.5 - switch S1
+; P4.6 - LED1 red
.IFDEF TERMINALCTSRTS
+++ /dev/null
-@1800
-10 00 C8 4B 40 1F 00 60 FD FF 18 00 9C 60 6A 57
-B2 4B BA 4B 00 00 00 00
-@1DAA
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00
-@4400
-3A 41 0D 12 0D 4A 30 4D 2F 83 8F 4E 00 00 3E 41
-2E 4E 30 4D 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E
-30 4D 00 00 04 45 58 49 54 00 3D 41 30 4D 00 00
-03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 44
-03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
-44 55 50 00 0E 93 F6 23 30 4D 40 44 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 44 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E 44 02 3E 52 00 0E 12 3E 4F 30 4D 8E 44
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 44
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C 44 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 44 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 45
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 44 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA 44 03 41 4E 44 3E FF 30 4D 7A 44 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E 45 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 45 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E 45 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 45 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 44 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
-3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE 45 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 45 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 45 03 3E 49 4E 85 12 C2 1D 10 45
-04 42 41 53 45 00 85 12 DA 1D C0 44 05 53 54 41
-54 45 85 12 B6 1D 30 46 02 42 4C 00 85 12 20 00
-62 45 07 41 4C 49 47 4E 45 44 1E B3 0E 63 30 4D
-52 46 05 41 4C 49 47 4E 92 B3 C4 1D 82 63 C4 1D
-30 4D 52 45 03 4E 49 50 2F 53 30 4D 3C 46 03 53
-3E 44 2F 83 8F 4E 00 00 7A 3F F4 45 03 55 4D 2A
-A2 4F C0 04 82 4E C8 04 9F 42 E4 04 00 00 1E 42
-E6 04 30 4D 28 45 02 4D 2A 00 A2 4F C2 04 82 4E
-C8 04 9F 42 E4 04 00 00 1E 42 E6 04 30 4D 8C 46
-06 55 4D 2F 4D 4F 44 00 3A 4F 2C 4F 08 43 39 40
-10 00 0A 9E 01 28 0A 8E 08 68 19 83 06 30 0C 5C
-0A 6A F7 2B 0A 8E 12 D3 F7 3F 8F 4A 00 00 0E 48
-30 4D 7E 46 06 53 4D 2F 52 45 4D 00 0C 4E 2B 4F
-0E 93 02 34 3E E3 1E 53 8F 93 00 00 08 34 BF E3
-02 00 BF E3 00 00 9F 53 02 00 8F 63 00 00 1D 15
-3D 40 26 47 D1 3F 28 47 1C 17 0B 93 04 34 BF E3
-00 00 9F 53 00 00 0B EC 0B 93 02 34 3E E3 1E 53
-30 4D 00 00 06 46 4D 2F 4D 4F 44 00 0D 12 3D 40
-54 47 D4 3F 56 47 8F 93 00 00 05 24 1E 93 03 34
-8F 5C 00 00 1E 83 3D 41 30 4D 12 46 01 2A 87 12
-AA 46 62 44 2A 44 74 46 04 2F 4D 4F 44 00 87 12
-A8 44 82 46 B4 44 4C 47 2A 44 78 47 01 2F 87 12
-A8 44 82 46 B4 44 4C 47 78 46 2A 44 A6 46 03 4D
-4F 44 87 12 A8 44 82 46 B4 44 4C 47 62 44 2A 44
-6C 47 05 2A 2F 4D 4F 44 87 12 A8 44 AA 46 B4 44
-4C 47 2A 44 B2 47 02 2A 2F 00 87 12 A8 44 AA 46
-B4 44 4C 47 78 46 2A 44 48 46 05 43 48 41 52 53
-30 4D DA 47 05 43 48 41 52 2B 1E 53 30 4D E4 47
-05 43 45 4C 4C 53 0E 5E 30 4D F0 47 05 43 45 4C
-4C 2B 2E 53 30 4D F4 46 02 32 40 00 2F 83 9F 4E
-02 00 00 00 2E 4E 30 4D 08 48 02 32 21 00 BE 4F
-00 00 BE 4F 02 00 3E 4F 30 4D 1A 48 04 32 44 55
-50 00 2F 82 8F 4E 02 00 9F 4F 04 00 00 00 30 4D
-2C 48 05 32 44 52 4F 50 2F 53 3E 4F 30 4D 42 48
-05 32 53 57 41 50 2A 4F 9F 4F 04 00 00 00 8F 4A
-04 00 0A 4E 1E 4F 02 00 8F 4A 02 00 30 4D 50 48
-05 32 4F 56 45 52 2F 82 8F 4E 02 00 9F 4F 08 00
-00 00 1E 4F 06 00 30 4D 00 46 06 49 4E 56 45 52
-54 00 3E E3 30 4D 9E 47 06 4C 53 48 49 46 54 00
-3A 4F 3E F0 1F 00 03 24 0A 5A 1E 83 FD 23 0E 4A
-30 4D 70 48 06 52 53 48 49 46 54 00 3A 4F 3E F0
-1F 00 04 24 12 C3 0A 10 1E 83 FC 23 0E 4A 30 4D
-7A 45 02 31 2B 00 1E 53 30 4D D2 48 02 31 2D 00
-1E 83 30 4D B4 48 02 32 2A 00 0E 5E 30 4D E6 48
-02 32 2F 00 0E 11 30 4D 98 48 03 4D 41 58 2E 9F
-07 38 2F 53 30 4D FA 48 03 4D 49 4E 2E 9F F9 3B
-3E 4F 30 4D C6 47 02 2B 21 00 BE 5F 00 00 3E 4F
-30 4D FC 47 04 43 48 41 52 00 87 12 4C 46 24 4D
-D6 48 0A 45 2A 44 00 00 86 5B 43 48 41 52 5D 00
-87 12 2A 49 34 44 34 44 2C 4F 2C 4F 2A 44 44 47
-04 46 49 4C 4C 00 39 4F 3A 4F 09 93 05 24 CA 4E
-00 00 1A 53 19 83 FB 23 3E 4F 30 4D 8A 48 03 48
-45 58 B2 40 10 00 DA 1D 30 4D DA 44 07 44 45 43
-49 4D 41 4C B2 40 0A 00 DA 1D 30 4D 6E 49 81 28
-87 12 34 44 29 00 24 4D 62 44 2A 44 8C 47 82 2E
-28 00 87 12 34 44 29 00 24 4D 82 4F AE 4C 2A 44
-F0 48 06 53 4F 55 52 43 45 00 2F 82 8F 4E 02 00
-1E 42 BE 1D 9F 42 C0 1D 00 00 30 4D 26 46 05 3E
-42 4F 44 59 2E 52 30 4D 94 45 02 3C 23 00 B2 40
-AA 1D AA 1D 30 4D 1E 15 0E 43 3D 40 20 00 0A 93
-04 20 0D 11 0A 4C 0C 43 09 43 0E 9B 01 28 0E 8B
-09 69 08 68 1D 83 07 30 0C 5C 0A 6A 0E 6E F5 2B
-0E 8B 12 D3 F5 3F 0A 4E 1D 17 30 41 24 49 01 23
-1B 42 DA 1D 2C 4F 0A 4E B0 12 E6 49 8F 49 00 00
-0E 48 7A 90 0A 00 02 28 3A 50 07 00 3A 50 30 00
-92 83 AA 1D 18 42 AA 1D C8 4A 00 00 30 4D 1E 4A
-02 23 53 00 87 12 20 4A 5A 4A 2D 83 09 93 E0 23
-0E 93 DE 23 3D 41 30 4D 50 4A 02 23 3E 00 9F 42
-AA 1D 00 00 3E 40 AA 1D 2E 8F 30 4D 8E 49 04 48
-4F 4C 44 00 0A 4E 3E 4F DB 3F B2 49 04 53 49 47
-4E 00 0E 93 3E 4F 3A 40 2D 00 D2 33 30 4D C0 46
-03 55 44 2E 87 12 DE 49 54 4A 6E 4A AE 4C 76 4C
-2A 44 A0 4A 02 55 2E 00 2F 83 8F 4E 00 00 0E 43
-F1 3F 3E B0 00 80 06 24 BF E3 00 00 3E E3 9F 53
-00 00 0E 63 30 4D 7C 49 02 44 2E 00 87 12 DE 49
-6E 44 80 44 C2 4A 54 4A 92 44 92 4A 6E 4A AE 4C
-76 4C 2A 44 9E 49 01 2E 3E B0 00 80 DD 27 2F 83
-3E 43 EC 3F 7E 4A 04 48 45 52 45 00 2F 83 8F 4E
-00 00 1E 42 C4 1D 30 4D 62 46 05 41 4C 4C 4F 54
-82 5E C4 1D 3E 4F 30 4D 6A 4A 02 43 2C 00 1A 42
-C4 1D CA 4E 00 00 92 53 C4 1D 3E 4F 30 4D 2F 83
-8F 4E 00 00 B0 12 B2 4B 92 B3 DC 05 FD 27 1E 42
-CC 05 B0 12 BA 4B 30 4D 30 40 3E 4B 06 4B 05 28
-4B 45 59 29 18 42 CC 05 EA 3F 16 49 03 4B 45 59
-30 40 64 4B 1A 4B 06 41 43 43 45 50 54 00 3C 40
-00 4C 3B 40 D0 4B 2D 15 0A 4E 2E 4F 0A 5E 3B 40
-0D 00 3C 40 20 00 3D 40 F4 4B 92 B3 DC 05 05 24
-18 42 CC 05 38 90 0A 00 04 20 21 53 39 40 C2 4B
-4D 15 B2 40 11 00 CE 05 30 41 B2 40 13 00 CE 05
-30 41 12 D2 0A 18 FD 3F 21 52 3A 17 58 42 CC 05
-48 9B F3 27 48 9C 06 2C 78 92 0E 20 2E 9F 0C 24
-1E 83 05 3C 0E 9A 03 24 CE 48 00 00 1E 53 82 48
-CE 05 30 4D F6 4B 2D 83 92 B3 DC 05 FD 27 E6 23
-B2 40 18 00 0A 18 3E 8F 3D 41 30 4D 5E 4B 06 28
-45 4D 49 54 29 00 08 4E 3E 4F A2 B3 DC 05 FD 27
-E6 3F D8 4A 04 45 4D 49 54 00 30 40 16 4C 24 4C
-04 45 43 48 4F 00 B2 40 82 48 EE 4B 30 4D F6 4A
-06 4E 4F 45 43 48 4F 00 B2 40 30 4D EE 4B 30 4D
-0E 4C 04 28 43 52 29 00 2F 83 8F 4E 00 00 3E 40
-0D 00 E3 3F 2A 4B 02 43 52 00 30 40 58 4C 8C 4A
-05 53 50 41 43 45 2F 83 8F 4E 00 00 3E 40 20 00
-D4 3F 70 4C 06 53 50 41 43 45 53 00 0E 93 09 24
-0D 12 3D 40 98 4C EF 3F 9A 4C 2D 83 1E 83 EB 23
-3D 41 3E 4F 30 4D B4 4A 04 54 59 50 45 00 0E 93
-95 24 2A 4F 8F 5E 00 00 0E 4A 87 12 CA 45 02 46
-0A 45 2A 4C EC 45 BE 4C 2A 44 2F 82 8F 4E 02 00
-7E 4D 8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D 84 4C
-82 53 22 00 87 12 34 44 CA 4C 2C 4F 34 44 22 00
-24 4D F4 4C 3D 41 6E 4E 1E 83 82 5E C4 1D 3E 4F
-92 B3 C4 1D A2 63 C4 1D 30 4D 40 4C 82 2E 22 00
-87 12 E4 4C 34 44 AE 4C 2C 4F 2A 44 00 00 04 57
-4F 52 44 00 3C 40 BE 1D 39 4C 3A 4C 09 5A 3A 5C
-28 4C 09 9A 19 24 7E 9A FC 27 1A 83 3B 40 60 00
-C8 4C 00 00 09 9A 0C 24 7C 4A 4E 9C 09 24 18 53
-4B 9C F6 2F 7C 90 7B 00 F3 2F 7C 80 20 00 F0 3F
-1A 82 C0 1D 82 4A C2 1D 1E 42 C4 1D 08 8E CE 48
-00 00 30 4D 50 49 04 46 49 4E 44 00 2F 83 0C 4E
-65 4C 74 40 80 00 3B 40 CA 1D 3E 4B 0E 93 1E 24
-58 4C 01 00 78 F0 1E 00 0E 58 2E 53 1E 4E FE FF
-0E 93 F3 27 09 4E 78 49 48 C4 48 95 F7 23 0A 4C
-1A 53 FA 99 00 00 F2 23 58 83 FA 23 19 B3 09 63
-0C 49 6A 4E 1E 43 4A 93 01 30 2E 83 8F 4C 00 00
-35 40 08 44 34 40 14 44 30 4D 2F 53 2F 53 3E 4F
-30 4D CE 49 07 3E 4E 55 4D 42 45 52 3C 4F 38 4F
-29 4F 2F 82 1B 42 DA 1D 6A 4C 7A 80 30 00 7A 90
-0A 00 02 28 7A 80 07 00 0A 9B 13 2C 82 49 D0 04
-82 48 D2 04 82 4B C8 04 19 42 E4 04 18 42 E6 04
-09 5A 08 63 1C 53 1E 83 E7 23 8F 49 04 00 8F 48
-02 00 8F 4C 00 00 30 4D 03 12 0D 12 1B 42 DA 1D
-0B 12 32 C0 00 02 6D 4E 0D 5E 0C 4E 7A 40 2E 00
-0D 9C 0A 28 7A 9C FC 23 32 D0 00 02 FC 4C FE FF
-0D 9C FC 2F DE 83 00 00 09 43 08 43 3D 40 AE 4E
-3F 82 8F 4E 06 00 0C 4E 7E 4C 6A 4C 7A 90 2D 00
-10 2C 3B 40 10 00 7A 80 24 00 06 24 2B 43 5A 83
-03 24 3B 52 6A 53 B0 23 1C 53 1E 83 6A 4C 7A 90
-2D 00 AA 23 1C 53 1E 83 B1 43 04 00 A5 3F B0 4E
-2F 53 0E 93 2C 17 82 4C DA 1D 03 24 2F 52 0E F3
-30 4D 8F 93 00 00 15 20 32 B0 00 02 14 20 0E 93
-05 24 1A 4F 02 00 1A 83 0A 93 0B 38 2F 53 BF 4F
-00 00 3E E3 05 20 BF E3 00 00 9F 53 00 00 3E E3
-30 4D 32 D0 00 02 9F 4F 02 00 04 00 BF 4F 00 00
-3E E3 F6 23 BF E3 02 00 BF E3 00 00 9F 53 02 00
-8F 63 00 00 3E E3 30 4D 30 4C 07 45 58 45 43 55
-54 45 0A 4E 3E 4F 00 4A 08 49 01 2C 1A 42 C4 1D
-A2 53 C4 1D 8A 4E 00 00 3E 4F 30 4D 2A 4F 87 4C
-49 54 45 52 41 4C 82 93 B6 1D 16 24 32 B0 00 02
-09 24 1A 42 C4 1D A2 52 C4 1D BA 40 34 44 00 00
-BA 4F 02 00 1A 42 C4 1D A2 52 C4 1D BA 40 34 44
-00 00 8A 4E 02 00 3E 4F 30 4D 66 4C 05 43 4F 55
-4E 54 2F 83 1E 53 8F 4E 00 00 5E 4E FF FF 30 4D
-82 4E BE 1D B2 4F C0 1D 3E 4F 82 43 C2 1D 87 12
-4C 46 24 4D A6 4F 3D 40 B2 4F E8 22 3D 41 3E 4F
-30 4D B4 4F 0A 4E 3E 4F 3D 40 CA 4F 3D 27 3D 40
-A0 4F 1A E2 B6 1D B2 27 AC 23 CC 4F 3E 4F 3D 40
-A0 4F B9 23 DE 53 00 00 68 4E 08 5E F8 40 3F 00
-00 00 3D 40 92 51 CD 3F 1A 4F 08 45 56 41 4C 55
-41 54 45 00 39 40 BE 1D 39 12 39 12 39 12 0D 12
-B0 12 2A 44 90 4F 08 50 3D 41 B2 41 C2 1D B2 41
-C0 1D B2 41 BE 1D 30 4D DC 48 04 51 55 49 54 00
-31 40 E0 1C B2 40 00 1C AC 1D 82 43 B6 1D 82 43
-08 18 B0 12 2A 44 CA 4C 04 0D 6F 6B 20 00 AE 4C
-34 44 38 1D 44 44 34 44 50 00 7E 4B 76 4C 90 4F
-34 44 7E 1C CE 44 B2 45 CA 4C 0D 73 74 61 63 6B
-20 65 6D 70 74 79 20 21 A4 50 34 44 30 FF 0C 4B
-B2 45 CA 4C 0B 46 52 41 4D 20 66 75 6C 6C 20 21
-A4 50 42 46 F4 44 C0 45 36 50 CA 4C 04 0D 20 20
-20 00 BC 45 3E 50 76 4B 05 41 42 4F 52 54 3F 40
-80 1C BE 3F 8F 93 02 00 98 26 B2 40 82 48 EE 4B
-B0 12 8C 55 82 43 2E 5E 82 43 3A 5E 82 43 46 5E
-82 43 76 5E 82 43 82 5E 82 43 8E 5E A2 B3 DC 05
-FD 27 B2 40 11 00 CE 05 92 C3 DC 05 38 40 50 55
-39 42 19 83 FE 23 18 83 FB 23 92 B3 DC 05 F4 23
-87 12 CA 4C 04 1B 5B 37 6D 00 AE 4C AE 4C CA 4C
-04 1B 5B 30 6D 00 AE 4C D4 54 16 55 1C 55 9E 50
-98 50 86 41 42 4F 52 54 22 00 87 12 E4 4C 34 44
-A4 50 2C 4F 2A 44 76 4D 01 27 87 12 4C 46 24 4D
-7C 4D C0 45 38 51 2A 44 D4 4F DA 49 81 5C 92 42
-BE 1D C2 1D 30 4D 87 12 00 4D 4C 46 24 4D 50 51
-08 4E 7A 4E 5A D3 5A 53 0A 58 19 42 C8 1D 6E 4E
-3E F0 1E 00 09 5E 82 48 AE 1D 82 49 B0 1D 82 4A
-B2 1D 2A 52 82 4A C4 1D 3E 4F 3D 41 30 41 87 12
-CA 4C 0F 73 74 61 63 6B 20 6D 69 73 6D 61 74 63
-68 21 AA 50 82 9F B4 1D F2 23 18 42 AE 1D 19 42
-B0 1D A8 49 FE FF 89 48 00 00 30 4D 1E 4D 08 56
-41 52 49 41 42 4C 45 00 B0 12 46 51 BA 40 86 12
-FC FF EF 3F 7C 4F 08 43 4F 4E 53 54 41 4E 54 00
-B0 12 46 51 BA 40 85 12 FC FF 8A 4E FE FF 3E 4F
-E0 3F C6 51 06 43 52 45 41 54 45 00 B0 12 46 51
-BA 40 85 12 FC FF 8A 4A FE FF D3 3F EA 4F 05 44
-4F 45 53 3E 1A 42 B2 1D BA 40 84 12 00 00 8A 4D
-02 00 3D 41 30 4D FE 51 05 44 45 46 45 52 B0 12
-46 51 BA 40 30 40 FC FF BA 40 14 52 FE FF B9 3F
-38 49 81 5B 82 43 B6 1D 30 4D 3C 51 01 5D B2 43
-B6 1D 30 4D E0 4C 87 52 45 43 55 52 53 45 19 42
-C4 1D 99 42 B2 1D 00 00 A2 53 C4 1D 30 4D 32 52
-01 3A B0 12 46 51 BA 40 87 12 FC FF A2 83 C4 1D
-B2 43 B6 1D 82 4F B4 1D 30 4D 60 52 81 3B 82 93
-B6 1D 5D 27 87 12 34 44 2A 44 2C 4F 94 51 34 52
-2A 44 52 4C 09 49 4D 4D 45 44 49 41 54 45 1A 42
-AE 1D FA D0 80 00 00 00 30 4D BE 4F 02 00 3E 4F
-30 4D 94 52 82 49 53 00 87 12 42 46 F4 44 C0 45
-CC 52 D8 52 34 44 AA 52 2C 4F 2A 44 2A 51 AA 52
-2A 44 7C 52 83 5B 27 5D 87 12 2A 51 34 44 34 44
-2C 4F 2C 4F 2A 44 1A 50 88 50 4F 53 54 50 4F 4E
-45 00 87 12 4C 46 24 4D 7C 4D 54 44 C0 45 38 51
-7E 45 C0 45 12 53 34 44 34 44 2C 4F 2C 4F 34 44
-2C 4F 2C 4F 2A 44 18 53 3A 4E 82 4A C6 1D 2E 4E
-82 4E C4 1D 3D 40 10 00 09 4A 08 49 29 83 18 48
-FE FF 0E 98 FC 2B 89 48 00 00 1D 83 F6 23 2A 4A
-0A 93 F0 23 3E 4F 3D 41 30 4D B4 52 82 49 46 00
-2F 83 8F 4E 00 00 1E 42 C4 1D BE 40 C0 45 00 00
-A2 52 C4 1D 2E 53 30 4D 18 52 84 45 4C 53 45 00
-1A 42 C4 1D BA 40 BC 45 00 00 2A 52 82 4A C4 1D
-8E 4A 00 00 2A 83 0E 4A 30 4D A8 4C 84 54 48 45
-4E 00 9E 42 C4 1D 00 00 3E 4F 30 4D E4 51 85 42
-45 47 49 4E 30 40 0C 4B 8C 53 85 55 4E 54 49 4C
-39 40 C0 45 1A 42 C4 1D A2 52 C4 1D 8A 49 00 00
-8A 4E 02 00 3E 4F 30 4D 12 51 85 41 47 41 49 4E
-39 40 BC 45 EF 3F AE 51 85 57 48 49 4C 45 87 12
-50 53 6E 44 2A 44 46 52 86 52 45 50 45 41 54 00
-87 12 D0 53 92 53 2A 44 6A 53 82 44 4F 00 2F 83
-8F 4E 00 00 1E 42 C4 1D BE 40 CA 45 00 00 2E 53
-82 4E C4 1D A2 53 AC 1D 1A 42 AC 1D 8A 43 00 00
-30 4D 3E 4F 84 4C 4F 4F 50 00 39 40 EC 45 1A 42
-C4 1D A2 52 C4 1D 8A 49 00 00 8A 4E 02 00 1E 42
-AC 1D A2 83 AC 1D 2E 4E 0E 93 04 24 9E 42 C4 1D
-00 00 F5 3F 3E 4F 30 4D 6C 4B 85 2B 4C 4F 4F 50
-39 40 DA 45 E4 3F 24 54 85 4C 45 41 56 45 1A 42
-C4 1D BA 40 FC 45 00 00 BA 40 BC 45 02 00 B2 50
-06 00 C4 1D A2 53 AC 1D 2A 52 19 42 AC 1D 89 4A
-00 00 30 4D 68 54 04 4D 4F 56 45 00 0A 4E 38 4F
-39 4F 3E 4F 0A 93 11 24 08 99 0F 24 06 2C F8 49
-00 00 18 53 1A 83 FB 23 30 4D 08 5A 09 5A 19 83
-18 83 E8 49 00 00 1A 83 FA 23 30 4D 34 44 CA 1D
-FC 44 2A 44 84 12 CC 54 9E 57 86 57 20 60 28 51
-6E 57 5A 54 96 54 B6 5E 3A 55 6E 55 F8 5F 04 5F
-48 45 D4 52 3C 52 FA 5E 00 00 3A 40 0C 00 39 40
-CA 1D 38 40 CC 1D D9 3F 3A 40 0E 00 39 40 CC 1D
-38 40 CA 1D CC 3F 82 43 CC 1D 30 4D 92 42 CA 1D
-C8 1D 30 4D E8 52 09 50 57 52 5F 53 54 41 54 45
-84 12 16 53 6A 57 9C 60 26 55 08 50 57 52 5F 48
-45 52 45 00 92 42 C4 1D 36 55 92 42 C6 1D 34 55
-EF 3F E8 53 09 52 53 54 5F 53 54 41 54 45 92 42
-0C 18 36 55 92 42 0E 18 34 55 E2 3F 54 55 08 52
-53 54 5F 48 45 52 45 00 92 42 C4 1D 0C 18 92 42
-C6 1D 0E 18 DF 3F B2 40 D4 55 36 56 B2 40 16 4C
-2C 4C B2 40 58 4C 6C 4C B2 40 64 4B 72 4B 30 41
-D8 53 04 57 49 50 45 00 39 40 80 FF B9 43 00 00
-29 53 39 90 CC FF FA 23 B0 12 86 55 B2 40 9C 60
-C4 1D B2 40 6A 57 C6 1D D7 3F 4C 53 06 28 57 41
-52 4D 29 00 1E 42 08 18 87 12 CA 4C 05 0D 1B 5B
-37 6D AE 4C F8 4A CA 4C 27 20 46 61 73 74 46 6F
-72 74 68 20 56 31 36 30 20 20 38 4D 48 7A 20 28
-43 29 20 4A 2E 4D 2E 54 68 6F 6F 72 65 6E 73 20
-AE 4C 34 44 30 FF 0C 4B 2A 45 B8 4A CA 4C 0B 62
-79 74 65 73 20 66 72 65 65 20 B0 50 A2 55 04 57
-41 52 4D 00 30 40 D4 55 9E 53 04 43 4F 4C 44 00
-B2 40 04 A5 20 01 B2 40 88 5A 5C 01 92 D3 04 02
-B2 40 FE FF 02 02 A2 83 06 02 B2 40 00 40 24 02
-B2 40 FF BF 22 02 B2 D0 FF BF 26 02 F2 43 22 03
-F2 D3 26 03 F2 40 A5 00 61 01 82 43 66 01 39 40
-40 00 B2 40 33 00 64 01 D2 43 61 01 92 D2 9E 01
-08 18 A2 93 08 18 01 24 59 07 38 40 C2 A2 18 83
-FE 23 19 83 FA 23 B2 D2 B0 01 F2 D0 10 00 2A 03
-F2 C0 40 00 A1 04 3A 40 46 56 39 40 CC FF 89 4A
-00 00 29 53 FC 23 92 42 02 18 F0 FF B2 40 18 00
-0A 18 31 40 E0 1C 3F 40 80 1C 37 40 00 44 36 40
-B4 44 35 40 08 44 34 40 14 44 B2 40 0A 00 DA 1D
-B2 43 DC 1D 92 C3 30 01 18 42 08 18 D2 B3 01 02
-04 20 38 E3 18 53 82 48 08 18 B2 40 81 00 C0 05
-B2 40 03 00 C6 05 B2 40 00 44 C8 05 F2 D0 03 00
-0D 02 92 C3 C0 05 92 D3 DA 05 3D 40 44 57 18 42
-08 18 38 90 0A 00 38 27 38 90 16 00 35 2F 28 93
-0E 23 F6 26 34 56 84 12 CC 54 92 5D 3E 5E 46 5D
-92 5E 0C 5D C6 5D 10 5A 00 00 02 5D B2 5D 64 5D
-A2 5D 20 5B 00 00 00 00 A4 5E F8 54 CC 55 85 48
-49 32 4C 4F 87 12 0C 4B 64 53 2C 4F 34 52 FA 54
-46 57 2A 44 3A 56 04 43 4F 44 45 00 B0 12 46 51
-A2 82 C4 1D 87 12 74 52 BC 45 7E 57 CA 53 03 41
-53 4D 92 42 C8 1D B8 1D B2 40 4A 57 C8 1D EE 3F
-00 00 07 45 4E 44 43 4F 44 45 87 12 08 55 94 51
-2A 44 B2 57 06 45 4E 44 41 53 4D 00 92 42 B8 1D
-C8 1D F3 3F 00 00 05 43 4F 4C 4F 4E 1A 42 C4 1D
-BA 40 87 12 00 00 A2 53 C4 1D B2 43 B6 1D 30 40
-08 55 00 00 05 4C 4F 32 48 49 1A 42 C4 1D BA 40
-B0 12 00 00 BA 40 2A 44 02 00 A2 52 C4 1D ED 3F
-38 40 BE 1D 39 48 2A 48 09 5A 1A 52 C2 1D 09 9A
-03 24 7E 9A FC 27 1A 83 0E 4A 2A 88 82 4A C2 1D
-30 4D B0 12 2A 44 24 4D 7C 4D 72 45 C0 45 48 58
-38 4E C0 45 38 51 6A 58 4A 58 29 4E 39 90 86 12
-02 20 2E 53 30 41 39 90 85 12 03 20 1E 4E 02 00
-30 41 39 90 84 12 01 20 2E 52 30 41 19 42 C4 1D
-A2 53 C4 1D 89 4E 00 00 3E 40 29 00 12 12 C2 1D
-92 53 C2 1D B0 12 2A 44 24 4D 38 4E C0 45 9C 58
-92 58 21 53 3E 90 10 00 BB 2D 30 41 9E 58 B2 41
-C2 1D 22 D3 30 41 87 12 4C 46 10 58 AE 58 82 43
-BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D 0A 4E 3E 4F
-FA 90 23 00 00 00 34 20 92 53 C2 1D B0 12 32 58
-0E 93 04 20 B2 40 00 03 BC 1D 27 3C 1E 93 04 20
-B2 40 10 03 BC 1D 21 3C 2E 93 04 20 B2 40 20 03
-BC 1D 1B 3C 2E 92 04 20 B2 40 20 02 BC 1D 15 3C
-3E 92 04 20 B2 40 30 02 BC 1D 0F 3C 3E 93 04 20
-B2 40 30 03 BC 1D 09 3C B2 40 30 00 BC 1D 19 42
-C4 1D A2 53 C4 1D 89 4E 00 00 3E 4F 3D 41 30 4D
-FA 90 26 00 00 00 08 20 B2 40 10 02 BC 1D 92 53
-C2 1D 30 12 1E 59 75 3F FA 90 40 00 00 00 1A 20
-B2 40 20 00 BC 1D 92 53 C2 1D B0 12 7C 58 0E 20
-B2 50 10 00 BC 1D 3E 40 2B 00 B0 12 7C 58 32 24
-92 92 BE 1D C2 1D 02 24 92 53 C2 1D 8E 10 82 5E
-BC 1D D3 3F B0 12 7C 58 F9 23 B2 50 10 00 BC 1D
-3E 40 28 00 B0 12 32 58 30 12 6E 59 67 3F 87 12
-4C 46 10 58 A6 59 FE 90 26 00 00 00 3E 40 20 00
-04 20 B2 50 82 00 BC 1D C2 3F B0 12 7C 58 DF 23
-B2 50 80 00 BC 1D 3E 40 28 00 B0 12 32 58 B0 12
-6C 58 D5 23 3D 40 38 51 30 4D 00 00 04 52 45 54
-49 00 87 12 34 44 00 13 2C 4F 2A 44 34 44 2C 00
-A6 58 9E 59 F6 59 2E 4E 1E D2 BC 1D 19 42 BA 1D
-92 3F F4 57 03 4D 4F 56 84 12 EC 59 00 40 04 5A
-05 4D 4F 56 2E 42 84 12 EC 59 40 40 00 00 03 41
-44 44 84 12 EC 59 00 50 1E 5A 05 41 44 44 2E 42
-84 12 EC 59 40 50 2A 5A 04 41 44 44 43 00 84 12
-EC 59 00 60 38 5A 06 41 44 44 43 2E 42 00 84 12
-EC 59 40 60 DC 59 04 53 55 42 43 00 84 12 EC 59
-00 70 56 5A 06 53 55 42 43 2E 42 00 84 12 EC 59
-40 70 64 5A 03 53 55 42 84 12 EC 59 00 80 74 5A
-05 53 55 42 2E 42 84 12 EC 59 40 80 D6 57 03 43
-4D 50 84 12 EC 59 00 90 8E 5A 05 43 4D 50 2E 42
-84 12 EC 59 40 90 C4 57 04 44 41 44 44 00 84 12
-EC 59 00 A0 A8 5A 06 44 41 44 44 2E 42 00 84 12
-EC 59 40 A0 9A 5A 03 42 49 54 84 12 EC 59 00 B0
-C6 5A 05 42 49 54 2E 42 84 12 EC 59 40 B0 D2 5A
-03 42 49 43 84 12 EC 59 00 C0 E0 5A 05 42 49 43
-2E 42 84 12 EC 59 40 C0 EC 5A 03 42 49 53 84 12
-EC 59 00 D0 FA 5A 05 42 49 53 2E 42 84 12 EC 59
-40 D0 00 00 03 58 4F 52 84 12 EC 59 00 E0 14 5B
-05 58 4F 52 2E 42 84 12 EC 59 40 E0 46 5A 03 41
-4E 44 84 12 EC 59 00 F0 2E 5B 05 41 4E 44 2E 42
-84 12 EC 59 40 F0 4C 46 A6 58 4C 5B 1A 42 BC 1D
-B2 F0 70 00 BC 1D 8A 10 3A F0 0F 00 82 DA BC 1D
-4A 3F 80 5A 03 52 52 43 84 12 46 5B 00 10 64 5B
-05 52 52 43 2E 42 84 12 46 5B 40 10 70 5B 04 53
-57 50 42 00 84 12 46 5B 80 10 7E 5B 03 52 52 41
-84 12 46 5B 00 11 8C 5B 05 52 52 41 2E 42 84 12
-46 5B 40 11 98 5B 03 53 58 54 84 12 46 5B 80 11
-00 00 04 50 55 53 48 00 84 12 46 5B 00 12 B2 5B
-06 50 55 53 48 2E 42 00 84 12 46 5B 40 12 06 5B
-04 43 41 4C 4C 00 84 12 46 5B 80 12 34 44 2C 00
-A6 58 9E 59 E6 5B 59 42 BC 1D 5A 42 BD 1D 82 4A
-BC 1D BE 90 00 15 00 00 02 20 0A 89 02 3C 09 8A
-0A 49 3A 90 10 00 03 2C 5A 0E A8 3F 1A 53 0E 4A
-87 12 F8 4A CA 4C 0D 6F 75 74 20 6F 66 20 62 6F
-75 6E 64 73 AA 50 C0 5B 05 50 55 53 48 4D 84 12
-DC 5B 00 15 28 5C 04 50 4F 50 4D 00 84 12 DC 5B
-00 17 4C 46 10 58 48 5C 82 43 BC 1D 92 42 C4 1D
-BA 1D A2 53 C4 1D 92 53 C2 1D 3E 40 2C 00 B0 12
-2A 44 24 4D 38 4E C0 45 38 51 9E 59 6E 5C 0A 4E
-3E 4F 1A 83 2A 92 CA 2F 8A 10 5A 06 6F 3F A6 5B
-04 52 52 43 4D 00 84 12 42 5C 50 00 80 5C 04 52
-52 41 4D 00 84 12 42 5C 50 01 8E 5C 04 52 4C 41
-4D 00 84 12 42 5C 50 02 9C 5C 04 52 52 55 4D 00
-84 12 42 5C 50 03 85 12 00 3C AA 5C 03 53 3E 3D
-85 12 00 38 BC 5C 02 53 3C 00 85 12 00 34 36 5C
-03 30 3E 3D 85 12 00 30 D0 5C 02 30 3C 00 85 12
-00 30 00 00 02 55 3C 00 85 12 00 2C E4 5C 03 55
-3E 3D 85 12 00 28 DA 5C 03 30 3C 3E 85 12 00 24
-F8 5C 02 30 3D 00 85 12 00 20 00 00 02 49 46 00
-1A 42 C4 1D 8A 4E 00 00 A2 53 C4 1D 0E 4A 30 4D
-EE 5C 04 54 48 45 4E 00 1A 42 C4 1D 08 4E 3E 4F
-09 48 29 53 0A 89 0A 11 3A 90 00 02 68 2F 88 DA
-00 00 30 4D B6 5A 04 45 4C 53 45 00 1A 42 C4 1D
-BA 40 00 3C 00 00 A2 53 C4 1D 2F 83 8F 4A 00 00
-E3 3F 22 5D 05 55 4E 54 49 4C 3A 4F 08 4E 3E 4F
-19 42 C4 1D 2A 83 0A 89 0A 11 3A 90 00 FE 47 3B
-3A F0 FF 03 08 DA 89 48 00 00 A2 53 C4 1D 30 4D
-3A 5B 05 41 47 41 49 4E 87 12 B6 5C 6A 5D 2A 44
-00 00 05 57 48 49 4C 45 87 12 10 5D 6E 44 2A 44
-C6 5C 06 52 45 50 45 41 54 00 87 12 B6 5C 6A 5D
-28 5D 2A 44 00 00 03 4A 4D 50 87 12 2A 51 B6 5C
-6A 5D 2A 44 3E B0 00 10 03 20 3E E0 00 04 30 4D
-3E 90 00 34 06 28 03 24 3E 40 00 34 30 4D 3E 40
-00 38 30 4D 00 00 04 3F 4A 4D 50 00 87 12 D4 5D
-2A 51 6E 44 6A 5D 2A 44 0A 5E 3D 41 08 4E 3E 4F
-2A 48 0A 93 04 20 98 42 C4 1D 00 00 30 4D 88 43
-00 00 A4 3F D0 5B 03 42 57 31 84 12 08 5E 00 00
-26 5E 03 42 57 32 84 12 08 5E 00 00 32 5E 03 42
-57 33 84 12 08 5E 00 00 4A 5E 3D 41 1A 42 C4 1D
-28 4E 08 93 08 20 BA 4F 00 00 A2 53 C4 1D 8E 4A
-00 00 3E 4F 30 4D 8E 43 00 00 61 3F 00 00 03 46
-57 31 84 12 48 5E 00 00 6E 5E 03 46 57 32 84 12
-48 5E 00 00 7A 5E 03 46 57 33 84 12 48 5E 00 00
-86 5E 04 47 4F 54 4F 00 87 12 B6 5C 2A 51 22 4F
-2A 44 F6 5D 05 3F 47 4F 54 4F 87 12 D4 5D 2A 51
-22 4F 2A 44 0C 4D 02 2E 53 00 87 12 34 44 3C 00
-2A 4C E0 44 F8 4A 34 44 08 00 2A 4C 34 44 3E 00
-2A 4C 76 4C CE 44 34 44 80 1C B2 45 C0 45 F6 5E
-CE 44 34 44 7E 1C CA 45 02 46 F4 44 B8 4A 34 44
-FE FF DA 45 E8 5E 2A 44 E4 4D 01 3F 2E 4E 30 40
-B8 4A 2E 56 05 57 4F 52 44 53 87 12 36 46 F4 44
-34 44 0A 00 36 46 FC 44 6A 4C 34 44 03 00 8C 4C
-34 44 10 00 F8 4A CA 4C 14 74 68 72 65 61 64 73
-20 76 6F 63 61 62 75 6C 61 72 69 65 73 00 AE 4C
-36 46 FC 44 34 44 CA 1D 44 44 64 53 6E 44 F4 44
-54 44 C0 45 F2 5F 6A 4C 34 44 03 00 8C 4C 44 44
-34 44 E2 1C 34 44 10 00 44 44 22 45 9C 54 34 44
-00 00 44 44 34 44 10 00 44 44 22 45 34 44 00 00
-CA 45 44 44 02 46 34 44 E2 1C 22 45 F4 44 B2 45
-C0 45 A4 5F 62 44 62 44 02 46 44 44 34 44 E2 1C
-22 45 F4 44 34 44 02 00 DA 45 82 5F 54 44 C0 45
-E8 5F 44 44 34 44 02 00 2A 45 F4 44 92 44 34 44
-E2 1C 22 45 FC 44 44 44 82 4F 34 44 7F 00 38 45
-AE 4C 0A 45 34 44 0F 00 38 45 34 44 10 00 6E 44
-2A 45 8C 4C BC 45 6E 5F 62 44 62 44 6A 4C BC 45
-48 5F 62 44 2A 44 AA 53 03 55 2E 52 87 12 A8 44
-DE 49 34 44 00 00 20 4A 54 4A 6E 4A B4 44 80 44
-2A 45 34 44 00 00 FE 48 8C 4C AE 4C 2A 44 FA 53
-04 44 55 4D 50 00 0D 12 12 12 DA 1D B2 40 10 00
-DA 1D 2E 5F BF F0 F0 FF 00 00 B0 12 2A 44 6E 44
-CA 45 6A 4C 02 46 34 44 07 00 FC 5F 76 4C 02 46
-34 44 10 00 22 45 02 46 CA 45 02 46 0A 45 34 44
-03 00 FC 5F EC 45 5A 60 76 4C 76 4C 02 46 34 44
-10 00 22 45 02 46 CA 45 02 46 0A 45 34 44 7E 00
-0C 49 4C 46 FE 48 2A 4C EC 45 78 60 34 44 10 00
-DA 45 42 60 B4 44 36 46 FC 44 2A 44
-@FFCC
-46 56 46 56 46 56 46 56 46 56 46 56 46 56 46 56
-46 56 46 56 46 56 46 56 46 56 46 56 46 56 46 56
-46 56 46 56 C8 4B 46 56 46 56 46 56 46 56 46 56
-46 56 46 56
-q
@1800
-10 00 6A 48 80 3E 80 04 FD FF 18 00 46 5B FC 53
-2A 48 3C 48 00 00 00 00
+10 00 92 48 80 3E 80 04 05 00 18 00 B4 5C 6C 55
+52 48 64 48 00 00 00 00
@1DAA
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 44
03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
44 55 50 00 0E 93 F6 23 30 4D 40 44 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 44 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E 44 02 3E 52 00 0E 12 3E 4F 30 4D 8E 44
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 44
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C 44 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 44 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 45
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 44 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA 44 03 41 4E 44 3E FF 30 4D 7A 44 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E 45 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 45 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E 45 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 45 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 44 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
+50 00 3E 4F 30 4D 00 00 03 4E 49 50 2F 53 30 4D
+00 00 04 53 57 41 50 00 2A 4F 8F 4E 00 00 0E 4A
+30 4D 68 44 04 4F 56 45 52 00 8F 4E FE FF 2E 4F
+2F 83 30 4D 72 44 03 52 4F 54 2A 4F 8F 4E 00 00
+1E 4F 02 00 8F 4A 02 00 30 4D 4E 44 02 3E 52 00
+0E 12 3E 4F 30 4D 96 44 02 52 3E 00 2F 83 8F 4E
+00 00 3E 41 30 4D B8 44 02 52 40 00 2F 83 8F 4E
+00 00 2E 41 30 4D 5C 44 05 44 45 50 54 48 8F 4E
+FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D 00 00
+01 40 2E 4E 30 4D F0 44 01 21 BE 4F 00 00 3E 4F
+30 4D 00 00 02 43 40 00 6E 4E 30 4D 04 45 02 43
+21 00 FE 4F 00 00 1F 53 3E 4F 30 4D 00 00 01 2B
+3E 5F 30 4D 30 44 01 2D 3E 8F 3E E3 1E 53 30 4D
+F8 44 03 41 4E 44 3E FF 30 4D 84 44 02 4F 52 00
+3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D 3C 45
+06 4E 45 47 41 54 45 00 E8 3F 32 45 03 41 42 53
+0E 93 E3 33 30 4D D8 44 04 44 41 42 53 00 3E F3
+06 34 BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D
+00 00 02 30 3D 00 1E 83 0E 7E 30 4D 82 45 02 30
+3C 00 0E 5E 0E 7E 3E E3 30 4D 8E 45 02 30 3E 00
+1E 93 05 34 0B 3C 00 00 01 3D 3E 8F 07 20 3E 43
+30 4D A8 45 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
+AC 44 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE 45 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 45 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 45 03 3E 49 4E 85 12 C2 1D 10 45
-04 42 41 53 45 00 85 12 DA 1D C0 44 05 53 54 41
-54 45 85 12 B6 1D 30 46 02 42 4C 00 85 12 20 00
-94 45 02 3C 23 00 B2 40 AA 1D AA 1D 30 4D 1E 15
-0E 43 3D 40 20 00 0A 93 04 20 0D 11 0A 4C 0C 43
-09 43 0E 9B 01 28 0E 8B 09 69 08 68 1D 83 07 30
-0C 5C 0A 6A 0E 6E F5 2B 0E 8B 12 D3 F5 3F 0A 4E
-1D 17 30 41 48 46 01 23 1B 42 DA 1D 2C 4F 0A 4E
-B0 12 5E 46 8F 49 00 00 0E 48 7A 90 0A 00 02 28
-3A 50 07 00 3A 50 30 00 92 83 AA 1D 18 42 AA 1D
-C8 4A 00 00 30 4D 96 46 02 23 53 00 87 12 98 46
-D2 46 2D 83 09 93 E0 23 0E 93 DE 23 3D 41 30 4D
-C8 46 02 23 3E 00 9F 42 AA 1D 00 00 3E 40 AA 1D
-2E 8F 30 4D 00 46 04 48 4F 4C 44 00 0A 4E 3E 4F
-DB 3F 3C 46 04 53 49 47 4E 00 0E 93 3E 4F 3A 40
-2D 00 D2 33 30 4D F4 45 03 55 44 2E 87 12 56 46
-CC 46 E6 46 50 49 18 49 2A 44 18 47 02 55 2E 00
-2F 83 8F 4E 00 00 0E 43 F1 3F 3E B0 00 80 06 24
-BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D DA 44
-02 44 2E 00 87 12 56 46 6E 44 80 44 3A 47 CC 46
-92 44 0A 47 E6 46 50 49 18 49 2A 44 52 45 01 2E
-3E B0 00 80 DD 27 2F 83 3E 43 EC 3F F6 46 04 48
-45 52 45 00 2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D
-62 45 05 41 4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D
-E2 46 02 43 2C 00 1A 42 C4 1D CA 4E 00 00 92 53
-C4 1D 3E 4F 30 4D 2F 83 8F 4E 00 00 B0 12 2A 48
-92 B3 DC 05 FD 27 1E 42 CC 05 B0 12 3C 48 30 4D
-30 40 B6 47 7E 47 05 28 4B 45 59 29 18 42 CC 05
-EA 3F 12 46 03 4B 45 59 30 40 DC 47 92 47 06 41
-43 43 45 50 54 00 3C 40 A8 48 3B 40 72 48 2D 15
-0A 4E 2E 4F 0A 5E 3B 40 0D 00 3C 40 20 00 3D 40
-9C 48 92 B3 DC 05 05 24 18 42 CC 05 38 90 0A 00
-04 20 21 53 39 40 56 48 4D 15 B2 40 11 00 CE 05
-A2 B3 DC 05 FD 27 E2 C3 23 02 30 41 B2 40 13 00
-CE 05 A2 B3 DC 05 FD 27 E2 D3 23 02 30 41 00 00
-05 53 4C 45 45 50 30 40 64 48 00 00 07 28 53 4C
-45 45 50 29 12 D2 0A 18 F6 3F 21 52 3A 17 58 42
-CC 05 48 9B E3 27 48 9C 06 2C 78 92 11 20 2E 9F
-0F 24 1E 83 05 3C 0E 9A 03 24 CE 48 00 00 1E 53
-82 48 CE 05 A2 B3 DC 05 FD 27 30 4D 9E 48 2D 83
-92 B3 DC 05 FD 27 E3 23 B2 40 18 00 0A 18 3E 8F
-3D 41 30 4D D6 47 06 28 45 4D 49 54 29 00 08 4E
-3E 4F E6 3F 50 47 04 45 4D 49 54 00 30 40 BE 48
-C6 48 04 45 43 48 4F 00 B2 40 82 48 90 48 30 4D
-6E 47 06 4E 4F 45 43 48 4F 00 B2 40 30 4D 90 48
-30 4D B6 48 04 28 43 52 29 00 2F 83 8F 4E 00 00
-3E 40 0D 00 E3 3F A2 47 02 43 52 00 30 40 FA 48
-04 47 05 53 50 41 43 45 2F 83 8F 4E 00 00 3E 40
-20 00 D4 3F 12 49 06 53 50 41 43 45 53 00 0E 93
-09 24 0D 12 3D 40 3A 49 EF 3F 3C 49 2D 83 1E 83
-EB 23 3D 41 3E 4F 30 4D 2C 47 04 54 59 50 45 00
-0E 93 95 24 2A 4F 8F 5E 00 00 0E 4A 87 12 CA 45
-02 46 0A 45 CC 48 EC 45 60 49 2A 44 2F 82 8F 4E
-02 00 7E 4D 8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D
-26 49 82 53 22 00 87 12 34 44 6C 49 A2 4B 34 44
-22 00 C6 49 96 49 3D 41 6E 4E 1E 83 82 5E C4 1D
-3E 4F 92 B3 C4 1D A2 63 C4 1D 30 4D E2 48 82 2E
-22 00 87 12 86 49 34 44 50 49 A2 4B 2A 44 00 00
-04 57 4F 52 44 00 3C 40 BE 1D 39 4C 3A 4C 09 5A
-3A 5C 28 4C 09 9A 19 24 7E 9A FC 27 1A 83 3B 40
-60 00 C8 4C 00 00 09 9A 0C 24 7C 4A 4E 9C 09 24
-18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F 7C 80 20 00
-F0 3F 1A 82 C0 1D 82 4A C2 1D 1E 42 C4 1D 08 8E
-CE 48 00 00 30 4D 00 00 04 46 49 4E 44 00 2F 83
-0C 4E 65 4C 74 40 80 00 3B 40 CA 1D 3E 4B 0E 93
-1E 24 58 4C 01 00 78 F0 1E 00 0E 58 2E 53 1E 4E
-FE FF 0E 93 F3 27 09 4E 78 49 48 C4 48 95 F7 23
-0A 4C 1A 53 FA 99 00 00 F2 23 58 83 FA 23 19 B3
-09 63 0C 49 6A 4E 1E 43 4A 93 01 30 2E 83 8F 4C
-00 00 35 40 08 44 34 40 14 44 30 4D 2F 53 2F 53
-3E 4F 30 4D 26 46 07 3E 4E 55 4D 42 45 52 3C 4F
-38 4F 29 4F 2F 82 1B 42 DA 1D 6A 4C 7A 80 30 00
-7A 90 0A 00 02 28 7A 80 07 00 0A 9B 13 2C 82 49
-D0 04 82 48 D2 04 82 4B C8 04 19 42 E4 04 18 42
-E6 04 09 5A 08 63 1C 53 1E 83 E7 23 8F 49 04 00
-8F 48 02 00 8F 4C 00 00 30 4D 03 12 0D 12 1B 42
-DA 1D 0B 12 32 C0 00 02 6D 4E 0D 5E 0C 4E 7A 40
-2E 00 0D 9C 0A 28 7A 9C FC 23 32 D0 00 02 FC 4C
-FE FF 0D 9C FC 2F DE 83 00 00 09 43 08 43 3D 40
-50 4B 3F 82 8F 4E 06 00 0C 4E 7E 4C 6A 4C 7A 90
-2D 00 10 2C 3B 40 10 00 7A 80 24 00 06 24 2B 43
-5A 83 03 24 3B 52 6A 53 B0 23 1C 53 1E 83 6A 4C
-7A 90 2D 00 AA 23 1C 53 1E 83 B1 43 04 00 A5 3F
-52 4B 2F 53 0E 93 2C 17 82 4C DA 1D 03 24 2F 52
-0E F3 30 4D 9F 4F 02 00 04 00 BF 4F 00 00 3E E3
-09 20 3E E3 BF E3 02 00 BF E3 00 00 9F 53 02 00
-8F 63 00 00 32 B0 00 02 01 20 2F 53 30 4D D2 48
-07 45 58 45 43 55 54 45 0A 4E 3E 4F 00 4A 28 45
-01 2C 1A 42 C4 1D A2 53 C4 1D 8A 4E 00 00 3E 4F
-30 4D A0 4B 87 4C 49 54 45 52 41 4C 82 93 B6 1D
-16 24 32 B0 00 02 09 24 1A 42 C4 1D A2 52 C4 1D
-BA 40 34 44 00 00 BA 4F 02 00 1A 42 C4 1D A2 52
-C4 1D BA 40 34 44 00 00 8A 4E 02 00 3E 4F 30 4D
-08 49 05 43 4F 55 4E 54 2F 83 1E 53 8F 4E 00 00
-5E 4E FF FF 30 4D 82 4E BE 1D B2 4F C0 1D 3E 4F
-82 43 C2 1D 87 12 4C 46 C6 49 1C 4C 3D 40 28 4C
-FE 22 3D 41 3E 4F 30 4D 2A 4C 0A 4E 3E 4F 3D 40
-40 4C 53 27 3D 40 16 4C 1A E2 B6 1D B2 27 AC 23
-42 4C 3E 4F 3D 40 16 4C B9 23 DE 53 00 00 68 4E
-08 5E F8 40 3F 00 00 00 3D 40 0C 4E CD 3F 90 4B
-08 45 56 41 4C 55 41 54 45 00 39 40 BE 1D 39 12
-39 12 39 12 0D 12 B0 12 2A 44 06 4C 7E 4C 3D 41
-B2 41 C2 1D B2 41 C0 1D B2 41 BE 1D 30 4D 7A 45
-04 51 55 49 54 00 31 40 E0 1C B2 40 00 1C 00 1C
-82 43 B6 1D 82 43 08 18 B0 12 2A 44 6C 49 04 0D
-6F 6B 20 00 50 49 34 44 38 1D 44 44 34 44 50 00
-F6 47 18 49 06 4C 34 44 7E 1C CE 44 B2 45 6C 49
-0D 73 74 61 63 6B 20 65 6D 70 74 79 20 21 1A 4D
-34 44 30 FF 84 47 B2 45 6C 49 0B 46 52 41 4D 20
-66 75 6C 6C 20 21 1A 4D 42 46 F4 44 C0 45 AC 4C
-6C 49 04 0D 20 20 20 00 BC 45 B4 4C EE 47 05 41
-42 4F 52 54 3F 40 80 1C BE 3F 8F 93 02 00 AE 26
-B2 40 82 48 90 48 B0 12 0C 52 82 43 C0 5A 82 43
-CC 5A 82 43 D8 5A 82 43 08 5B 82 43 14 5B 82 43
-20 5B A2 B3 DC 05 FD 27 B2 40 11 00 CE 05 E2 C3
-23 02 92 C3 DC 05 38 40 A0 AA 39 42 19 83 FE 23
-18 83 FB 23 92 B3 DC 05 F4 23 87 12 6C 49 04 1B
-5B 37 6D 00 50 49 50 49 6C 49 04 1B 5B 30 6D 00
-50 49 4E 51 90 51 96 51 14 4D 0E 4D 86 41 42 4F
-52 54 22 00 87 12 86 49 34 44 1A 4D A2 4B 2A 44
-18 4A 01 27 87 12 4C 46 C6 49 1E 4A C0 45 B2 4D
-2A 44 4A 4C 52 46 81 5C 92 42 BE 1D C2 1D 30 4D
-87 12 A2 49 4C 46 C6 49 CA 4D 08 4E 7A 4E 5A D3
-5A 53 0A 58 19 42 C8 1D 6E 4E 3E F0 1E 00 09 5E
-82 48 AE 1D 82 49 B0 1D 82 4A B2 1D 2A 52 82 4A
-C4 1D 3E 4F 3D 41 30 41 87 12 6C 49 0F 73 74 61
-63 6B 20 6D 69 73 6D 61 74 63 68 21 20 4D 82 9F
-B4 1D F2 23 18 42 AE 1D 19 42 B0 1D A8 49 FE FF
-89 48 00 00 30 4D C0 49 08 56 41 52 49 41 42 4C
-45 00 B0 12 C0 4D BA 40 86 12 FC FF EF 3F F2 4B
-08 43 4F 4E 53 54 41 4E 54 00 B0 12 C0 4D BA 40
-85 12 FC FF 8A 4E FE FF 3E 4F E0 3F 40 4E 06 43
-52 45 41 54 45 00 B0 12 C0 4D BA 40 85 12 FC FF
-8A 4A FE FF D3 3F 60 4C 05 44 4F 45 53 3E 1A 42
-B2 1D BA 40 84 12 00 00 8A 4D 02 00 3D 41 30 4D
-78 4E 05 44 45 46 45 52 B0 12 C0 4D BA 40 30 40
-FC FF BA 40 8E 4E FE FF B9 3F 00 00 81 5B 82 43
-B6 1D 30 4D B6 4D 01 5D B2 43 B6 1D 30 4D 82 49
-87 52 45 43 55 52 53 45 19 42 C4 1D 99 42 B2 1D
-00 00 A2 53 C4 1D 30 4D AC 4E 01 3A B0 12 C0 4D
-BA 40 87 12 FC FF A2 83 C4 1D B2 43 B6 1D 82 4F
-B4 1D 30 4D DA 4E 81 3B 82 93 B6 1D 5D 27 87 12
-34 44 2A 44 A2 4B 0E 4E AE 4E 2A 44 F4 48 09 49
+0E 93 3E 4F FB 27 2D 53 30 4D 1E 83 0E 7E F9 3F
+39 40 00 80 39 8F 08 4E 3E 4F 08 59 19 15 30 4D
+81 5E 00 00 3E 4F 32 B0 00 01 E8 27 2D 53 21 52
+30 4D 91 53 00 00 F7 3F CE 45 06 55 4E 4C 4F 4F
+50 00 F5 3F 00 00 01 49 2F 83 8F 4E 00 00 2E 41
+1E 81 02 00 30 4D 1E 45 01 4A 2F 83 8F 4E 00 00
+1E 41 04 00 1E 81 06 00 30 4D 9C 45 03 50 41 44
+85 12 E2 1C 1A 46 03 54 49 42 85 12 38 1D 0E 45
+03 43 50 4C 85 12 50 00 C2 45 03 3E 49 4E 85 12
+C2 1D 60 46 04 42 41 53 45 00 85 12 DA 1D C8 44
+05 53 54 41 54 45 85 12 B6 1D 74 46 02 42 4C 00
+85 12 20 00 B4 45 02 3C 23 00 B2 40 AA 1D AA 1D
+30 4D 8C 46 01 23 2C 4F 5B 42 DA 1D 0A 43 34 40
+20 00 0E 93 04 20 04 11 0E 4C 0C 43 09 43 0A 9B
+01 28 0A 8B 09 69 08 68 14 83 07 30 0C 5C 0E 6E
+0A 6A F5 2B 0A 8B 12 D3 F5 3F 34 40 14 44 8F 49
+00 00 0E 48 7A 90 0A 00 02 28 3A 50 07 00 3A 50
+30 00 92 83 AA 1D 18 42 AA 1D C8 4A 00 00 30 4D
+A4 46 02 23 53 00 87 12 A6 46 0C 47 2D 83 09 93
+CA 23 0E 93 C8 23 3D 41 30 4D 02 47 02 23 3E 00
+9F 42 AA 1D 00 00 3E 40 AA 1D 2E 8F 30 4D 26 46
+04 48 4F 4C 44 00 0A 4E 3E 4F DB 3F 80 46 04 53
+49 47 4E 00 0E 93 3E 4F 3A 40 2D 00 D2 33 30 4D
+56 46 02 55 2E 00 87 12 9A 46 34 44 00 00 06 47
+20 47 78 49 40 49 2A 44 68 45 02 44 2E 00 87 12
+9A 46 78 44 8A 44 6E 45 06 47 9A 44 44 47 20 47
+78 49 40 49 2A 44 50 45 01 2E 0E 93 E4 37 2F 83
+8F 4E 00 00 3E 43 EB 3F 30 47 04 48 45 52 45 00
+2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D 5C 45 05 41
+4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D 1C 47 02 43
+2C 00 1A 42 C4 1D CA 4E 00 00 92 53 C4 1D 3E 4F
+30 4D 2F 83 8F 4E 00 00 B0 12 52 48 92 B3 DC 05
+FD 27 1E 42 CC 05 B0 12 64 48 30 4D 9A 47 05 28
+4B 45 59 29 18 42 CC 05 EC 3F 38 46 03 4B 45 59
+30 40 F4 47 AE 47 06 41 43 43 45 50 54 00 30 40
+1E 48 EE 47 08 28 41 43 43 45 50 54 29 00 3C 40
+D0 48 3B 40 9A 48 2D 15 0A 4E 2E 4F 0A 5E 3B 40
+0D 00 3C 40 20 00 3D 40 C4 48 92 B3 DC 05 05 24
+18 42 CC 05 38 90 0A 00 04 20 21 53 39 40 7E 48
+4D 15 B2 40 11 00 CE 05 E2 C3 23 02 A2 B3 DC 05
+FD 27 30 41 B2 40 13 00 CE 05 E2 D3 23 02 A2 B3
+DC 05 FD 27 30 41 00 00 05 53 4C 45 45 50 30 40
+8C 48 00 00 07 28 53 4C 45 45 50 29 12 D2 0A 18
+F6 3F 21 52 3A 17 58 42 CC 05 48 9B E3 27 48 9C
+06 2C 78 92 11 20 2E 9F 0F 24 1E 83 05 3C 0E 9A
+03 24 CE 48 00 00 1E 53 82 48 CE 05 A2 B3 DC 05
+FD 27 30 4D C6 48 2D 83 92 B3 DC 05 FD 27 E3 23
+B2 40 18 00 0A 18 3E 8F 3D 41 30 4D 14 48 06 28
+45 4D 49 54 29 00 08 4E 3E 4F E6 3F 6A 47 04 45
+4D 49 54 00 30 40 E6 48 EE 48 04 45 43 48 4F 00
+B2 40 82 48 B8 48 30 4D 88 47 06 4E 4F 45 43 48
+4F 00 B2 40 30 4D B8 48 30 4D DE 48 04 28 43 52
+29 00 2F 83 8F 4E 00 00 3E 40 0D 00 E3 3F BE 47
+02 43 52 00 30 40 22 49 3E 47 05 53 50 41 43 45
+2F 83 8F 4E 00 00 3E 40 20 00 D4 3F 3A 49 06 53
+50 41 43 45 53 00 0E 93 09 24 0D 12 3D 40 62 49
+EF 3F 64 49 2D 83 1E 83 EB 23 3D 41 3E 4F 30 4D
+52 47 04 54 59 50 45 00 0E 93 95 24 2A 4F 8F 5E
+00 00 0E 4A 87 12 F0 45 28 46 08 45 F4 48 12 46
+88 49 2A 44 2F 82 8F 4E 02 00 7E 4D 8F 4D 00 00
+0D 5E 1D B3 0D 63 30 4D 4E 49 82 53 22 00 87 12
+34 44 94 49 CA 4B 34 44 22 00 EE 49 BE 49 3D 41
+6E 4E 1E 83 82 5E C4 1D 3E 4F 92 B3 C4 1D A2 63
+C4 1D 30 4D 0A 49 82 2E 22 00 87 12 AE 49 34 44
+78 49 CA 4B 2A 44 00 00 04 57 4F 52 44 00 3C 40
+BE 1D 39 4C 3A 4C 09 5A 3A 5C 28 4C 09 9A 19 24
+7E 9A FC 27 1A 83 3B 40 60 00 C8 4C 00 00 09 9A
+0C 24 7C 4A 4E 9C 09 24 18 53 4B 9C F6 2F 7C 90
+7B 00 F3 2F 7C 80 20 00 F0 3F 1A 82 C0 1D 82 4A
+C2 1D 1E 42 C4 1D 08 8E CE 48 00 00 30 4D 00 00
+04 46 49 4E 44 00 2F 83 0C 4E 65 4C 74 40 80 00
+3B 40 CA 1D 3E 4B 0E 93 1E 24 58 4C 01 00 78 F0
+1E 00 0E 58 2E 53 1E 4E FE FF 0E 93 F3 27 09 4E
+78 49 48 C4 48 95 F7 23 0A 4C 1A 53 FA 99 00 00
+F2 23 58 83 FA 23 19 B3 09 63 0C 49 6A 4E 1E 43
+4A 93 01 30 2E 83 8F 4C 00 00 35 40 08 44 34 40
+14 44 30 4D 2F 53 2F 53 3E 4F 30 4D 6A 46 07 3E
+4E 55 4D 42 45 52 3C 4F 38 4F 29 4F 2F 82 1B 42
+DA 1D 6A 4C 7A 80 30 00 7A 90 0A 00 02 28 7A 80
+07 00 0A 9B 13 2C 82 49 D0 04 82 48 D2 04 82 4B
+C8 04 19 42 E4 04 18 42 E6 04 09 5A 08 63 1C 53
+1E 83 E7 23 8F 49 04 00 8F 48 02 00 8F 4C 00 00
+30 4D 03 12 0D 12 1B 42 DA 1D 0B 12 32 C0 00 02
+6D 4E 0D 5E 0C 4E 7A 40 2E 00 0D 9C 0A 28 7A 9C
+FC 23 32 D0 00 02 FC 4C FE FF 0D 9C FC 2F DE 83
+00 00 09 43 08 43 3D 40 78 4B 3F 82 8F 4E 06 00
+0C 4E 7E 4C 6A 4C 7A 90 2D 00 10 2C 3B 40 10 00
+7A 80 24 00 06 24 2B 43 5A 83 03 24 3B 52 6A 53
+B0 23 1C 53 1E 83 6A 4C 7A 90 2D 00 AA 23 1C 53
+1E 83 B1 43 04 00 A5 3F 7A 4B 2F 53 0E 93 2C 17
+82 4C DA 1D 03 24 2F 52 0E F3 30 4D 9F 4F 02 00
+04 00 BF 4F 00 00 3E E3 09 20 3E E3 BF E3 02 00
+BF E3 00 00 9F 53 02 00 8F 63 00 00 32 B0 00 02
+01 20 2F 53 30 4D FA 48 07 45 58 45 43 55 54 45
+0A 4E 3E 4F 00 4A 26 45 01 2C 1A 42 C4 1D A2 53
+C4 1D 8A 4E 00 00 3E 4F 30 4D C8 4B 87 4C 49 54
+45 52 41 4C 82 93 B6 1D 0F 24 1A 42 C4 1D A2 52
+C4 1D BA 40 34 44 00 00 8A 4E 02 00 3E 4F 32 B0
+00 02 32 C0 00 02 F1 23 30 4D 30 49 05 43 4F 55
+4E 54 2F 83 1E 53 8F 4E 00 00 5E 4E FF FF 30 4D
+82 4E BE 1D B2 4F C0 1D 3E 4F 82 43 C2 1D 87 12
+90 46 EE 49 36 4C 3D 40 42 4C 05 23 3D 41 3E 4F
+30 4D 44 4C 0A 4E 3E 4F 3D 40 5A 4C 5A 27 3D 40
+30 4C 1A E2 B6 1D B9 27 B3 23 5C 4C 3E 4F 3D 40
+30 4C C0 23 DE 53 00 00 68 4E 08 5E F8 40 3F 00
+00 00 3D 40 88 4E CD 3F B8 4B 08 45 56 41 4C 55
+41 54 45 00 39 40 BE 1D 3C 49 3B 49 3A 49 3D 15
+B0 12 2A 44 20 4C 98 4C B2 41 C2 1D B2 41 C0 1D
+B2 41 BE 1D 3D 41 30 4D 4C 46 04 51 55 49 54 00
+31 40 E0 1C B2 40 00 1C 00 1C 82 43 B6 1D 82 43
+08 18 B0 12 2A 44 94 49 03 0D 6F 6B 78 49 40 49
+5A 46 44 44 64 46 0E 48 40 49 20 4C DE 44 92 45
+94 49 0D 73 74 61 63 6B 20 65 6D 70 74 79 21 20
+2A 4D 34 44 30 FF A0 47 D2 45 94 49 0B 46 52 41
+4D 20 66 75 6C 6C 21 20 2A 4D 86 46 F2 44 E0 45
+C6 4C 94 49 03 0D 20 20 DC 45 CC 4C 06 48 05 41
+42 4F 52 54 3F 40 80 1C C3 3F 8F 93 02 00 BA 26
+B2 40 82 48 B8 48 B0 12 3C 52 A2 B3 DC 05 FD 27
+B2 40 11 00 CE 05 E2 C3 23 02 92 C3 DC 05 38 40
+A0 AA 39 42 03 43 19 83 FD 23 18 83 FA 23 92 B3
+DC 05 F3 23 87 12 94 49 04 1B 5B 37 6D 00 78 49
+78 49 94 49 04 1B 5B 30 6D 00 78 49 4A 51 8C 51
+92 51 DA 51 24 4D 1E 4D 86 41 42 4F 52 54 22 00
+87 12 AE 49 34 44 2A 4D CA 4B 2A 44 40 4A 01 27
+87 12 90 46 EE 49 46 4A E0 45 AE 4D 2A 44 64 4C
+96 46 81 5C 92 42 BE 1D C2 1D 30 4D 00 00 81 5B
+82 43 B6 1D 30 4D B2 4D 01 5D B2 43 B6 1D 30 4D
+BE 4D 83 5B 27 5D 87 12 A0 4D 34 44 34 44 CA 4B
+CA 4B 2A 44 BE 4F 02 00 3E 4F 30 4D 1C 49 82 49
+53 00 87 12 86 46 F2 44 E0 45 06 4E D6 4D 34 44
+E4 4D CA 4B 2A 44 A0 4D E4 4D 2A 44 EE 4D 09 49
4D 4D 45 44 49 41 54 45 1A 42 AE 1D FA D0 80 00
-00 00 30 4D BE 4F 02 00 3E 4F 30 4D 0E 4F 82 49
-53 00 87 12 42 46 F4 44 C0 45 46 4F 52 4F 34 44
-24 4F A2 4B 2A 44 A4 4D 24 4F 2A 44 F6 4E 83 5B
-27 5D 87 12 A4 4D 34 44 34 44 A2 4B A2 4B 2A 44
-90 4C 88 50 4F 53 54 50 4F 4E 45 00 87 12 4C 46
-C6 49 1E 4A 54 44 C0 45 B2 4D 7E 45 C0 45 8C 4F
-34 44 34 44 A2 4B A2 4B 34 44 A2 4B A2 4B 2A 44
-92 4F 3A 4E 82 4A C6 1D 2E 4E 82 4E C4 1D 3D 40
-10 00 09 4A 08 49 29 83 18 48 FE FF 0E 98 FC 2B
-89 48 00 00 1D 83 F6 23 2A 4A 0A 93 F0 23 3E 4F
-3D 41 30 4D 2E 4F 82 49 46 00 2F 83 8F 4E 00 00
-1E 42 C4 1D BE 40 C0 45 00 00 A2 52 C4 1D 2E 53
-30 4D 92 4E 84 45 4C 53 45 00 1A 42 C4 1D BA 40
-BC 45 00 00 2A 52 82 4A C4 1D 8E 4A 00 00 2A 83
-0E 4A 30 4D 4A 49 84 54 48 45 4E 00 9E 42 C4 1D
-00 00 3E 4F 30 4D 5E 4E 85 42 45 47 49 4E 30 40
-84 47 06 50 85 55 4E 54 49 4C 39 40 C0 45 1A 42
-C4 1D A2 52 C4 1D 8A 49 00 00 8A 4E 02 00 3E 4F
-30 4D 8C 4D 85 41 47 41 49 4E 39 40 BC 45 EF 3F
-28 4E 85 57 48 49 4C 45 87 12 CA 4F 6E 44 2A 44
-C0 4E 86 52 45 50 45 41 54 00 87 12 4A 50 0C 50
-2A 44 E4 4F 82 44 4F 00 2F 83 8F 4E 00 00 1E 42
-C4 1D BE 40 CA 45 00 00 2E 53 82 4E C4 1D A2 53
-00 1C 1A 42 00 1C 8A 43 00 00 30 4D B4 4B 84 4C
-4F 4F 50 00 39 40 EC 45 1A 42 C4 1D A2 52 C4 1D
-8A 49 00 00 8A 4E 02 00 1E 42 00 1C A2 83 00 1C
-2E 4E 0E 93 04 24 9E 42 C4 1D 00 00 F5 3F 3E 4F
-30 4D E4 47 85 2B 4C 4F 4F 50 39 40 DA 45 E4 3F
-9E 50 85 4C 45 41 56 45 1A 42 C4 1D BA 40 FC 45
-00 00 BA 40 BC 45 02 00 B2 50 06 00 C4 1D A2 53
-00 1C 2A 52 19 42 00 1C 89 4A 00 00 30 4D E2 50
-04 4D 4F 56 45 00 0A 4E 38 4F 39 4F 3E 4F 0A 93
-11 24 08 99 0F 24 06 2C F8 49 00 00 18 53 1A 83
-FB 23 30 4D 08 5A 09 5A 19 83 18 83 E8 49 00 00
-1A 83 FA 23 30 4D 34 44 CA 1D FC 44 2A 44 84 12
-46 51 42 54 18 54 74 50 A2 4D 00 54 D4 50 10 51
-AE 49 B4 51 E8 51 24 50 AE 52 48 45 4E 4F B6 4E
-86 4A 00 00 3A 40 0C 00 39 40 CA 1D 38 40 CC 1D
-D9 3F 3A 40 0E 00 39 40 CC 1D 38 40 CA 1D CC 3F
-82 43 CC 1D 30 4D 92 42 CA 1D C8 1D 30 4D 62 4F
-09 50 57 52 5F 53 54 41 54 45 84 12 90 4F FC 53
-46 5B A0 51 08 50 57 52 5F 48 45 52 45 00 92 42
-C4 1D B0 51 92 42 C6 1D AE 51 EF 3F 62 50 09 52
-53 54 5F 53 54 41 54 45 92 42 0C 18 B0 51 92 42
-0E 18 AE 51 E2 3F CE 51 08 52 53 54 5F 48 45 52
-45 00 92 42 C4 1D 0C 18 92 42 C6 1D 0E 18 DF 3F
-B2 40 54 52 B6 52 B2 40 64 48 58 48 B2 40 BE 48
-CE 48 B2 40 FA 48 0E 49 B2 40 DC 47 EA 47 30 41
-52 50 04 57 49 50 45 00 39 40 80 FF B9 43 00 00
-29 53 39 90 CC FF FA 23 B0 12 00 52 B2 40 46 5B
-C4 1D B2 40 FC 53 C6 1D D4 3F C6 4F 06 28 57 41
-52 4D 29 00 1E 42 08 18 87 12 6C 49 05 0D 1B 5B
-37 6D 50 49 70 47 6C 49 27 20 46 61 73 74 46 6F
-72 74 68 20 56 31 36 30 20 31 36 4D 48 7A 20 28
+00 00 30 4D AA 49 87 52 45 43 55 52 53 45 19 42
+C4 1D 99 42 B2 1D 00 00 A2 53 C4 1D 30 4D AA 4C
+88 50 4F 53 54 50 4F 4E 45 00 87 12 90 46 EE 49
+46 4A 54 44 E0 45 AE 4D 92 45 E0 45 6A 4E 34 44
+34 44 CA 4B CA 4B 34 44 CA 4B CA 4B 2A 44 82 9F
+B4 1D A0 24 87 12 94 49 0F 73 74 61 63 6B 20 6D
+69 73 6D 61 74 63 68 21 30 4D 87 12 CA 49 90 46
+EE 49 94 4E 08 4E 7A 4E 5A D3 5A 53 0A 58 19 42
+C8 1D 6E 4E 3E F0 1E 00 09 5E 82 48 AE 1D 82 49
+B0 1D 82 4A B2 1D 2A 52 82 4A C4 1D 3E 4F 3D 41
+30 41 E8 49 08 56 41 52 49 41 42 4C 45 00 B0 12
+8A 4E BA 40 86 12 FC FF 71 3C 0C 4C 08 43 4F 4E
+53 54 41 4E 54 00 B0 12 8A 4E BA 40 85 12 FC FF
+8A 4E FE FF 3E 4F 62 3C DC 4E 06 43 52 45 41 54
+45 00 B0 12 8A 4E BA 40 85 12 FC FF 8A 4A FE FF
+55 3C 7A 4C 05 44 4F 45 53 3E 1A 42 B2 1D BA 40
+84 12 00 00 8A 4D 02 00 3D 41 30 4D 14 4F 05 44
+45 46 45 52 B0 12 8A 4E BA 40 30 40 FC FF BA 40
+2A 4F FE FF 3B 3C D2 4D 01 3A B0 12 8A 4E BA 40
+87 12 FC FF A2 83 C4 1D B2 43 B6 1D 82 4F B4 1D
+30 4D 48 4F 81 3B 82 93 B6 1D 24 27 87 12 34 44
+2A 44 CA 4B 6E 4E C0 4D 2A 44 7C 4F 3D 41 B2 4E
+0E 18 A2 4E 0C 18 3E 4F 32 3D DC 4B 06 4D 41 52
+4B 45 52 00 B0 12 8A 4E BA 40 84 12 FC FF BA 40
+7A 4F FE FF 9A 42 C6 1D 00 00 28 83 8A 48 02 00
+A2 52 C4 1D 18 42 AE 1D 19 42 B0 1D A8 49 FE FF
+89 48 00 00 30 4D 0E 4E 82 49 46 00 2F 83 8F 4E
+00 00 1E 42 C4 1D A2 52 C4 1D BE 40 E0 45 00 00
+2E 53 30 4D 2E 4F 84 45 4C 53 45 00 A2 52 C4 1D
+1A 42 C4 1D BA 40 DC 45 FC FF 8E 4A 00 00 2A 83
+0E 4A 30 4D 72 49 84 54 48 45 4E 00 9E 42 C4 1D
+00 00 3E 4F 30 4D FA 4E 85 42 45 47 49 4E 30 40
+A0 47 06 50 85 55 4E 54 49 4C 39 40 E0 45 A2 52
+C4 1D 1A 42 C4 1D 8A 49 FC FF 8A 4E FE FF 3E 4F
+30 4D 88 4D 85 41 47 41 49 4E 39 40 DC 45 EF 3F
+C4 4E 85 57 48 49 4C 45 87 12 CC 4F 78 44 2A 44
+26 4E 86 52 45 50 45 41 54 00 87 12 4A 50 0C 50
+2A 44 E6 4F 82 44 4F 00 2F 83 8F 4E 00 00 A2 53
+C4 1D 1E 42 C4 1D BE 40 F0 45 FE FF A2 53 00 1C
+1A 42 00 1C 8A 43 00 00 30 4D 8C 4F 84 4C 4F 4F
+50 00 39 40 12 46 A2 52 C4 1D 1A 42 C4 1D 8A 49
+FC FF 8A 4E FE FF 1E 42 00 1C A2 83 00 1C 2E 4E
+0E 93 03 24 8E 4A 00 00 F6 3F 3E 4F 30 4D FC 47
+85 2B 4C 4F 4F 50 39 40 00 46 E5 3F 9C 50 85 4C
+45 41 56 45 1A 42 C4 1D BA 40 22 46 00 00 BA 40
+DC 45 02 00 B2 50 06 00 C4 1D A2 53 00 1C 2A 52
+19 42 00 1C 89 4A 00 00 30 4D DE 50 04 4D 4F 56
+45 00 0A 4E 38 4F 39 4F 3E 4F 0A 93 11 24 08 99
+0F 24 06 2C F8 49 00 00 18 53 1A 83 FB 23 30 4D
+08 5A 09 5A 19 83 18 83 E8 49 00 00 1A 83 FA 23
+30 4D 34 44 CA 1D FA 44 2A 44 84 12 42 51 B2 55
+88 55 74 50 9E 4D 70 55 D0 50 0C 51 D6 49 FE 51
+18 52 24 50 1E 54 46 45 A4 53 C8 4D AE 4A 00 00
+3A 40 0E 00 39 40 CA 1D 38 40 CC 1D D9 3F 3A 40
+0E 00 39 40 CC 1D 38 40 CA 1D CC 3F 82 43 CC 1D
+30 4D 92 42 CA 1D C8 1D 30 4D 9C 51 3A 4E 82 4A
+C6 1D 2E 4E 82 4E C4 1D 3D 40 10 00 09 4A 08 49
+29 83 18 48 FE FF 0E 98 FC 2B 89 48 00 00 1D 83
+F6 23 2A 4A 0A 93 F0 23 3E 4F 3D 41 30 4D 40 4E
+09 50 57 52 5F 53 54 41 54 45 84 12 9A 51 6C 55
+B4 5C 62 50 09 52 53 54 5F 53 54 41 54 45 92 42
+0E 18 DE 51 92 42 0C 18 E0 51 EF 3F D0 51 08 50
+57 52 5F 48 45 52 45 00 92 42 C6 1D DE 51 92 42
+C4 1D E0 51 30 4D E4 51 08 52 53 54 5F 48 45 52
+45 00 92 42 C6 1D 0E 18 92 42 C4 1D 0C 18 EC 3F
+B2 40 C4 53 26 54 B2 40 8C 48 80 48 B2 40 E6 48
+F6 48 B2 40 22 49 36 49 B2 40 F4 47 02 48 82 43
+2E 5C 82 43 3A 5C 82 43 46 5C 82 43 76 5C 82 43
+82 5C 82 43 8E 5C 30 41 52 50 04 57 49 50 45 00
+39 40 80 FF B9 43 00 00 29 53 39 90 CC FF FA 23
+B0 12 30 52 B2 40 B4 5C 0C 18 B2 40 6C 55 0E 18
+AE 3F 18 50 07 43 4F 4D 50 41 52 45 0C 4E 38 4F
+3B 4F 39 4F 0E 4B 0E 5C 0C 24 1B 83 07 30 1C 83
+07 30 19 53 F9 98 FF FF F5 27 02 2C 3E 43 30 4D
+1E 43 30 4D 64 4F 86 5B 54 48 45 4E 5D 00 30 4D
+1E 83 30 4D C6 52 86 5B 45 4C 53 45 5D 00 87 12
+34 44 01 00 90 46 EE 49 12 4C 44 44 E0 45 4C 53
+8A 44 8A 44 94 49 04 5B 49 46 5D 00 9C 52 EA 45
+0A 53 A6 4A 2C 45 DC 45 40 53 8A 44 8A 44 94 49
+06 5B 45 4C 53 45 5D 00 9C 52 EA 45 2E 53 A6 4A
+D0 52 44 44 E0 45 2A 53 2C 45 DC 45 40 53 94 49
+06 5B 54 48 45 4E 5D 00 9C 52 EA 45 40 53 D0 52
+54 44 EA 45 48 53 2A 44 DC 45 E4 52 A6 4A 94 49
+03 0D 6B 6F 78 49 40 49 5A 46 44 44 64 46 0E 48
+62 53 82 43 C2 1D 82 4E BE 1D B2 4F C0 1D 3E 4F
+3D 40 E4 52 30 4D D6 52 84 5B 49 46 5D 00 0E 93
+3E 4F AD 27 30 4D 78 53 8B 5B 55 4E 44 45 46 49
+4E 45 44 5D 87 12 90 46 EE 49 46 4A 6C 44 86 45
+2A 44 88 53 89 5B 44 45 46 49 4E 45 44 5D 87 12
+90 46 EE 49 46 4A 6C 44 2A 44 C8 4F 06 28 57 41
+52 4D 29 00 1E 42 08 18 87 12 94 49 05 0D 1B 5B
+37 6D 78 49 8A 47 94 49 27 20 46 61 73 74 46 6F
+72 74 68 20 56 31 36 32 20 31 36 4D 48 7A 20 28
43 29 20 4A 2E 4D 2E 54 68 6F 6F 72 65 6E 73 20
-50 49 34 44 30 FF 84 47 2A 45 30 47 6C 49 0B 62
-79 74 65 73 20 66 72 65 65 20 26 4D 22 52 04 57
-41 52 4D 00 30 40 54 52 18 50 04 43 4F 4C 44 00
+78 49 34 44 30 FF A0 47 28 45 56 47 94 49 0B 62
+79 74 65 73 20 66 72 65 65 20 36 4D 6A 52 04 57
+41 52 4D 00 30 40 C4 53 94 52 04 43 4F 4C 44 00
B2 40 04 A5 20 01 B2 40 88 5A 5C 01 92 D3 04 02
B2 40 FE FF 02 02 A2 83 06 02 B2 D0 00 42 24 02
B2 D3 26 02 B2 40 FF BF 22 02 F2 43 22 03 F2 D3
66 01 39 40 80 00 B2 40 33 00 64 01 D2 43 61 01
92 D2 9E 01 08 18 A2 93 08 18 01 24 59 07 38 40
C2 A2 18 83 FE 23 19 83 FA 23 B2 D2 B0 01 F2 D0
-10 00 2A 03 F2 C0 40 00 A1 04 3A 40 C6 52 39 40
+10 00 2A 03 F2 C0 40 00 A1 04 3A 40 36 54 39 40
CC FF 89 4A 00 00 29 53 FC 23 92 42 02 18 F0 FF
B2 40 18 00 0A 18 31 40 E0 1C 3F 40 80 1C 37 40
-00 44 36 40 B4 44 35 40 08 44 34 40 14 44 B2 40
+00 44 36 40 BC 44 35 40 08 44 34 40 14 44 B2 40
0A 00 DA 1D B2 43 AC 1D 92 C3 30 01 18 42 08 18
D2 B3 01 02 04 20 38 E3 18 53 82 48 08 18 B2 40
81 00 C0 05 B2 42 C6 05 B2 40 A1 F7 C8 05 F2 D0
-03 00 0D 02 92 C3 C0 05 92 D3 DA 05 3D 40 D6 53
-18 42 08 18 38 90 0A 00 2F 27 38 90 16 00 2C 2F
-28 93 02 23 EA 26 B4 52 84 12 46 51 24 5A D0 5A
-D8 59 24 5B 9E 59 58 5A A2 56 00 00 94 59 44 5A
-F6 59 34 5A B2 57 00 00 00 00 36 5B 72 51 4C 52
-85 48 49 32 4C 4F 87 12 84 47 DE 4F A2 4B AE 4E
-74 51 D8 53 2A 44 BA 52 04 43 4F 44 45 00 B0 12
-C0 4D A2 82 C4 1D 87 12 EE 4E BC 45 10 54 00 00
-07 45 4E 44 43 4F 44 45 87 12 82 51 0E 4E 2A 44
-44 50 03 41 53 4D 92 42 C8 1D B8 1D B2 40 DC 53
-C8 1D E5 3F 30 54 06 45 4E 44 41 53 4D 00 92 42
+03 00 0D 02 92 C3 C0 05 92 D3 DA 05 3D 40 46 55
+18 42 08 18 38 90 0A 00 9B 26 38 90 16 00 98 2E
+28 93 55 22 4A 26 24 54 84 12 42 51 92 5B 3E 5C
+46 5B 92 5C 0C 5B C6 5B 10 58 00 00 02 5B B2 5B
+64 5B A2 5B 20 59 00 00 00 00 A4 5C 6E 51 BC 53
+85 48 49 32 4C 4F 87 12 A0 47 E0 4F CA 4B C0 4D
+70 51 48 55 2A 44 2A 54 04 43 4F 44 45 00 B0 12
+8A 4E A2 82 C4 1D 87 12 5C 4F DC 45 80 55 00 00
+07 45 4E 44 43 4F 44 45 87 12 7E 51 6E 4E 2A 44
+44 50 03 41 53 4D 92 42 C8 1D B8 1D B2 40 4C 55
+C8 1D E5 3F A0 55 06 45 4E 44 41 53 4D 00 92 42
B8 1D C8 1D E9 3F 00 00 05 43 4F 4C 4F 4E 1A 42
C4 1D BA 40 87 12 00 00 A2 53 C4 1D B2 43 B6 1D
-30 40 82 51 00 00 05 4C 4F 32 48 49 1A 42 C4 1D
+30 40 7E 51 00 00 05 4C 4F 32 48 49 1A 42 C4 1D
BA 40 B0 12 00 00 BA 40 2A 44 02 00 A2 52 C4 1D
ED 3F 38 40 BE 1D 39 48 2A 48 09 5A 1A 52 C2 1D
09 9A 03 24 7E 9A FC 27 1A 83 0E 4A 2A 88 82 4A
-C2 1D 30 4D B0 12 2A 44 C6 49 1E 4A 72 45 C0 45
-DA 54 DA 4A C0 45 B2 4D FC 54 DC 54 29 4E 39 90
-86 12 02 20 2E 53 30 41 39 90 85 12 03 20 1E 4E
-02 00 30 41 39 90 84 12 01 20 2E 52 30 41 19 42
-C4 1D A2 53 C4 1D 89 4E 00 00 3E 40 29 00 12 12
-C2 1D 92 53 C2 1D B0 12 2A 44 C6 49 DA 4A C0 45
-2E 55 24 55 21 53 3E 90 10 00 BB 2D 30 41 30 55
-B2 41 C2 1D 22 D3 30 41 87 12 4C 46 A2 54 40 55
-82 43 BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D 0A 4E
-3E 4F FA 90 23 00 00 00 34 20 92 53 C2 1D B0 12
-C4 54 0E 93 04 20 B2 40 00 03 BC 1D 27 3C 1E 93
-04 20 B2 40 10 03 BC 1D 21 3C 2E 93 04 20 B2 40
-20 03 BC 1D 1B 3C 2E 92 04 20 B2 40 20 02 BC 1D
-15 3C 3E 92 04 20 B2 40 30 02 BC 1D 0F 3C 3E 93
-04 20 B2 40 30 03 BC 1D 09 3C B2 40 30 00 BC 1D
-19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 4F 3D 41
-30 4D FA 90 26 00 00 00 08 20 B2 40 10 02 BC 1D
-92 53 C2 1D 30 12 B0 55 75 3F FA 90 40 00 00 00
-1A 20 B2 40 20 00 BC 1D 92 53 C2 1D B0 12 0E 55
-0E 20 B2 50 10 00 BC 1D 3E 40 2B 00 B0 12 0E 55
-32 24 92 92 BE 1D C2 1D 02 24 92 53 C2 1D 8E 10
-82 5E BC 1D D3 3F B0 12 0E 55 F9 23 B2 50 10 00
-BC 1D 3E 40 28 00 B0 12 C4 54 30 12 00 56 67 3F
-87 12 4C 46 A2 54 38 56 FE 90 26 00 00 00 3E 40
-20 00 04 20 B2 50 82 00 BC 1D C2 3F B0 12 0E 55
-DF 23 B2 50 80 00 BC 1D 3E 40 28 00 B0 12 C4 54
-B0 12 FE 54 D5 23 3D 40 B2 4D 30 4D 50 48 04 52
-45 54 49 00 87 12 34 44 00 13 A2 4B 2A 44 34 44
-2C 00 38 55 30 56 88 56 2E 4E 1E D2 BC 1D 19 42
-BA 1D 92 3F 86 54 03 4D 4F 56 84 12 7E 56 00 40
-96 56 05 4D 4F 56 2E 42 84 12 7E 56 40 40 00 00
-03 41 44 44 84 12 7E 56 00 50 B0 56 05 41 44 44
-2E 42 84 12 7E 56 40 50 BC 56 04 41 44 44 43 00
-84 12 7E 56 00 60 CA 56 06 41 44 44 43 2E 42 00
-84 12 7E 56 40 60 6E 56 04 53 55 42 43 00 84 12
-7E 56 00 70 E8 56 06 53 55 42 43 2E 42 00 84 12
-7E 56 40 70 F6 56 03 53 55 42 84 12 7E 56 00 80
-06 57 05 53 55 42 2E 42 84 12 7E 56 40 80 68 54
-03 43 4D 50 84 12 7E 56 00 90 20 57 05 43 4D 50
-2E 42 84 12 7E 56 40 90 56 54 04 44 41 44 44 00
-84 12 7E 56 00 A0 3A 57 06 44 41 44 44 2E 42 00
-84 12 7E 56 40 A0 2C 57 03 42 49 54 84 12 7E 56
-00 B0 58 57 05 42 49 54 2E 42 84 12 7E 56 40 B0
-64 57 03 42 49 43 84 12 7E 56 00 C0 72 57 05 42
-49 43 2E 42 84 12 7E 56 40 C0 7E 57 03 42 49 53
-84 12 7E 56 00 D0 8C 57 05 42 49 53 2E 42 84 12
-7E 56 40 D0 00 00 03 58 4F 52 84 12 7E 56 00 E0
-A6 57 05 58 4F 52 2E 42 84 12 7E 56 40 E0 D8 56
-03 41 4E 44 84 12 7E 56 00 F0 C0 57 05 41 4E 44
-2E 42 84 12 7E 56 40 F0 4C 46 38 55 DE 57 1A 42
-BC 1D B2 F0 70 00 BC 1D 8A 10 3A F0 0F 00 82 DA
-BC 1D 4A 3F 12 57 03 52 52 43 84 12 D8 57 00 10
-F6 57 05 52 52 43 2E 42 84 12 D8 57 40 10 02 58
-04 53 57 50 42 00 84 12 D8 57 80 10 10 58 03 52
-52 41 84 12 D8 57 00 11 1E 58 05 52 52 41 2E 42
-84 12 D8 57 40 11 2A 58 03 53 58 54 84 12 D8 57
-80 11 00 00 04 50 55 53 48 00 84 12 D8 57 00 12
-44 58 06 50 55 53 48 2E 42 00 84 12 D8 57 40 12
-98 57 04 43 41 4C 4C 00 84 12 D8 57 80 12 34 44
-2C 00 38 55 30 56 78 58 59 42 BC 1D 5A 42 BD 1D
-82 4A BC 1D BE 90 00 15 00 00 02 20 0A 89 02 3C
-09 8A 0A 49 3A 90 10 00 03 2C 5A 0E A8 3F 1A 53
-0E 4A 87 12 70 47 6C 49 0D 6F 75 74 20 6F 66 20
-62 6F 75 6E 64 73 20 4D 52 58 05 50 55 53 48 4D
-84 12 6E 58 00 15 BA 58 04 50 4F 50 4D 00 84 12
-6E 58 00 17 4C 46 A2 54 DA 58 82 43 BC 1D 92 42
-C4 1D BA 1D A2 53 C4 1D 92 53 C2 1D 3E 40 2C 00
-B0 12 2A 44 C6 49 DA 4A C0 45 B2 4D 30 56 00 59
-0A 4E 3E 4F 1A 83 2A 92 CA 2F 8A 10 5A 06 6F 3F
-38 58 04 52 52 43 4D 00 84 12 D4 58 50 00 12 59
-04 52 52 41 4D 00 84 12 D4 58 50 01 20 59 04 52
-4C 41 4D 00 84 12 D4 58 50 02 2E 59 04 52 52 55
-4D 00 84 12 D4 58 50 03 85 12 00 3C 3C 59 03 53
-3E 3D 85 12 00 38 4E 59 02 53 3C 00 85 12 00 34
-C8 58 03 30 3E 3D 85 12 00 30 62 59 02 30 3C 00
-85 12 00 30 00 00 02 55 3C 00 85 12 00 2C 76 59
-03 55 3E 3D 85 12 00 28 6C 59 03 30 3C 3E 85 12
-00 24 8A 59 02 30 3D 00 85 12 00 20 5C 48 02 49
-46 00 1A 42 C4 1D 8A 4E 00 00 A2 53 C4 1D 0E 4A
-30 4D 80 59 04 54 48 45 4E 00 1A 42 C4 1D 08 4E
-3E 4F 09 48 29 53 0A 89 0A 11 3A 90 00 02 68 2F
-88 DA 00 00 30 4D 48 57 04 45 4C 53 45 00 1A 42
-C4 1D BA 40 00 3C 00 00 A2 53 C4 1D 2F 83 8F 4A
-00 00 E3 3F B4 59 05 55 4E 54 49 4C 3A 4F 08 4E
-3E 4F 19 42 C4 1D 2A 83 0A 89 0A 11 3A 90 00 FE
-47 3B 3A F0 FF 03 08 DA 89 48 00 00 A2 53 C4 1D
-30 4D CC 57 05 41 47 41 49 4E 87 12 48 59 FC 59
-2A 44 00 00 05 57 48 49 4C 45 87 12 A2 59 6E 44
-2A 44 58 59 06 52 45 50 45 41 54 00 87 12 48 59
-FC 59 BA 59 2A 44 00 00 03 4A 4D 50 87 12 A4 4D
-48 59 FC 59 2A 44 3E B0 00 10 03 20 3E E0 00 04
-30 4D 3E 90 00 34 06 28 03 24 3E 40 00 34 30 4D
-3E 40 00 38 30 4D 00 00 04 3F 4A 4D 50 00 87 12
-66 5A A4 4D 6E 44 FC 59 2A 44 9C 5A 3D 41 08 4E
-3E 4F 2A 48 0A 93 04 20 98 42 C4 1D 00 00 30 4D
-88 43 00 00 A4 3F 62 58 03 42 57 31 84 12 9A 5A
-00 00 B8 5A 03 42 57 32 84 12 9A 5A 00 00 C4 5A
-03 42 57 33 84 12 9A 5A 00 00 DC 5A 3D 41 1A 42
-C4 1D 28 4E 08 93 08 20 BA 4F 00 00 A2 53 C4 1D
-8E 4A 00 00 3E 4F 30 4D 8E 43 00 00 61 3F 00 00
-03 46 57 31 84 12 DA 5A 00 00 00 5B 03 46 57 32
-84 12 DA 5A 00 00 0C 5B 03 46 57 33 84 12 DA 5A
-00 00 18 5B 04 47 4F 54 4F 00 87 12 48 59 A4 4D
-98 4B 2A 44 88 5A 05 3F 47 4F 54 4F 87 12 66 5A
-A4 4D 98 4B 2A 44
+C2 1D 30 4D B0 12 2A 44 EE 49 46 4A EA 45 48 56
+02 4B E0 45 AE 4D 6A 56 4A 56 29 4E 39 90 86 12
+02 20 2E 53 30 41 39 90 85 12 03 20 1E 4E 02 00
+30 41 39 90 84 12 01 20 2E 52 30 41 19 42 C4 1D
+A2 53 C4 1D 89 4E 00 00 3E 40 29 00 12 12 C2 1D
+92 53 C2 1D B0 12 2A 44 EE 49 02 4B E0 45 9C 56
+92 56 21 53 3E 90 10 00 BB 2D 30 41 9E 56 B2 41
+C2 1D 22 D3 30 41 87 12 90 46 12 56 AE 56 82 43
+BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D 0A 4E 3E 4F
+FA 90 23 00 00 00 34 20 92 53 C2 1D B0 12 34 56
+0E 93 04 20 B2 40 00 03 BC 1D 27 3C 1E 93 04 20
+B2 40 10 03 BC 1D 21 3C 2E 93 04 20 B2 40 20 03
+BC 1D 1B 3C 2E 92 04 20 B2 40 20 02 BC 1D 15 3C
+3E 92 04 20 B2 40 30 02 BC 1D 0F 3C 3E 93 04 20
+B2 40 30 03 BC 1D 09 3C B2 40 30 00 BC 1D 19 42
+C4 1D A2 53 C4 1D 89 4E 00 00 3E 4F 3D 41 30 4D
+FA 90 26 00 00 00 08 20 B2 40 10 02 BC 1D 92 53
+C2 1D 30 12 1E 57 76 3F FA 90 40 00 00 00 1A 20
+B2 40 20 00 BC 1D 92 53 C2 1D B0 12 7C 56 0E 20
+B2 50 10 00 BC 1D 3E 40 2B 00 B0 12 7C 56 32 24
+92 92 BE 1D C2 1D 02 24 92 53 C2 1D 8E 10 82 5E
+BC 1D D3 3F B0 12 7C 56 F9 23 B2 50 10 00 BC 1D
+3E 40 28 00 B0 12 34 56 30 12 6E 57 67 3F 87 12
+90 46 12 56 A6 57 FE 90 26 00 00 00 3E 40 20 00
+04 20 B2 50 82 00 BC 1D C2 3F B0 12 7C 56 DF 23
+B2 50 80 00 BC 1D 3E 40 28 00 B0 12 34 56 B0 12
+6C 56 D5 23 3D 40 AE 4D 30 4D 78 48 04 52 45 54
+49 00 87 12 34 44 00 13 CA 4B 2A 44 34 44 2C 00
+A6 56 9E 57 F6 57 2E 4E 1E D2 BC 1D 19 42 BA 1D
+92 3F F6 55 03 4D 4F 56 84 12 EC 57 00 40 04 58
+05 4D 4F 56 2E 42 84 12 EC 57 40 40 00 00 03 41
+44 44 84 12 EC 57 00 50 1E 58 05 41 44 44 2E 42
+84 12 EC 57 40 50 2A 58 04 41 44 44 43 00 84 12
+EC 57 00 60 38 58 06 41 44 44 43 2E 42 00 84 12
+EC 57 40 60 DC 57 04 53 55 42 43 00 84 12 EC 57
+00 70 56 58 06 53 55 42 43 2E 42 00 84 12 EC 57
+40 70 64 58 03 53 55 42 84 12 EC 57 00 80 74 58
+05 53 55 42 2E 42 84 12 EC 57 40 80 D8 55 03 43
+4D 50 84 12 EC 57 00 90 8E 58 05 43 4D 50 2E 42
+84 12 EC 57 40 90 C6 55 04 44 41 44 44 00 84 12
+EC 57 00 A0 A8 58 06 44 41 44 44 2E 42 00 84 12
+EC 57 40 A0 9A 58 03 42 49 54 84 12 EC 57 00 B0
+C6 58 05 42 49 54 2E 42 84 12 EC 57 40 B0 D2 58
+03 42 49 43 84 12 EC 57 00 C0 E0 58 05 42 49 43
+2E 42 84 12 EC 57 40 C0 EC 58 03 42 49 53 84 12
+EC 57 00 D0 FA 58 05 42 49 53 2E 42 84 12 EC 57
+40 D0 00 00 03 58 4F 52 84 12 EC 57 00 E0 14 59
+05 58 4F 52 2E 42 84 12 EC 57 40 E0 46 58 03 41
+4E 44 84 12 EC 57 00 F0 2E 59 05 41 4E 44 2E 42
+84 12 EC 57 40 F0 90 46 A6 56 4C 59 1A 42 BC 1D
+B2 F0 70 00 BC 1D 8A 10 3A F0 0F 00 82 DA BC 1D
+4A 3F 80 58 03 52 52 43 84 12 46 59 00 10 64 59
+05 52 52 43 2E 42 84 12 46 59 40 10 70 59 04 53
+57 50 42 00 84 12 46 59 80 10 7E 59 03 52 52 41
+84 12 46 59 00 11 8C 59 05 52 52 41 2E 42 84 12
+46 59 40 11 98 59 03 53 58 54 84 12 46 59 80 11
+00 00 04 50 55 53 48 00 84 12 46 59 00 12 B2 59
+06 50 55 53 48 2E 42 00 84 12 46 59 40 12 06 59
+04 43 41 4C 4C 00 84 12 46 59 80 12 34 44 2C 00
+A6 56 9E 57 E6 59 59 42 BC 1D 5A 42 BD 1D 82 4A
+BC 1D BE 90 00 15 00 00 02 20 0A 89 02 3C 09 8A
+0A 49 3A 90 10 00 03 2C 5A 0E A8 3F 1A 53 0E 4A
+87 12 8A 47 94 49 0D 6F 75 74 20 6F 66 20 62 6F
+75 6E 64 73 30 4D C0 59 05 50 55 53 48 4D 84 12
+DC 59 00 15 28 5A 04 50 4F 50 4D 00 84 12 DC 59
+00 17 90 46 12 56 48 5A 82 43 BC 1D 92 42 C4 1D
+BA 1D A2 53 C4 1D 92 53 C2 1D 3E 40 2C 00 B0 12
+2A 44 EE 49 02 4B E0 45 AE 4D 9E 57 6E 5A 0A 4E
+3E 4F 1A 83 2A 92 CA 2F 8A 10 5A 06 6F 3F A6 59
+04 52 52 43 4D 00 84 12 42 5A 50 00 80 5A 04 52
+52 41 4D 00 84 12 42 5A 50 01 8E 5A 04 52 4C 41
+4D 00 84 12 42 5A 50 02 9C 5A 04 52 52 55 4D 00
+84 12 42 5A 50 03 85 12 00 3C AA 5A 03 53 3E 3D
+85 12 00 38 BC 5A 02 53 3C 00 85 12 00 34 36 5A
+03 30 3E 3D 85 12 00 30 D0 5A 02 30 3C 00 85 12
+00 30 00 00 02 55 3C 00 85 12 00 2C E4 5A 03 55
+3E 3D 85 12 00 28 DA 5A 03 30 3C 3E 85 12 00 24
+F8 5A 02 30 3D 00 85 12 00 20 84 48 02 49 46 00
+1A 42 C4 1D 8A 4E 00 00 A2 53 C4 1D 0E 4A 30 4D
+EE 5A 04 54 48 45 4E 00 1A 42 C4 1D 08 4E 3E 4F
+09 48 29 53 0A 89 0A 11 3A 90 00 02 68 2F 88 DA
+00 00 30 4D B6 58 04 45 4C 53 45 00 1A 42 C4 1D
+BA 40 00 3C 00 00 A2 53 C4 1D 2F 83 8F 4A 00 00
+E3 3F 22 5B 05 55 4E 54 49 4C 3A 4F 08 4E 3E 4F
+19 42 C4 1D 2A 83 0A 89 0A 11 3A 90 00 FE 47 3B
+3A F0 FF 03 08 DA 89 48 00 00 A2 53 C4 1D 30 4D
+3A 59 05 41 47 41 49 4E 87 12 B6 5A 6A 5B 2A 44
+00 00 05 57 48 49 4C 45 87 12 10 5B 78 44 2A 44
+C6 5A 06 52 45 50 45 41 54 00 87 12 B6 5A 6A 5B
+28 5B 2A 44 00 00 03 4A 4D 50 87 12 A0 4D B6 5A
+6A 5B 2A 44 3E B0 00 10 03 20 3E E0 00 04 30 4D
+3E 90 00 34 06 28 03 24 3E 40 00 34 30 4D 3E 40
+00 38 30 4D 00 00 04 3F 4A 4D 50 00 87 12 D4 5B
+A0 4D 78 44 6A 5B 2A 44 0A 5C 3D 41 08 4E 3E 4F
+2A 48 0A 93 04 20 98 42 C4 1D 00 00 30 4D 88 43
+00 00 A4 3F D0 59 03 42 57 31 84 12 08 5C 00 00
+26 5C 03 42 57 32 84 12 08 5C 00 00 32 5C 03 42
+57 33 84 12 08 5C 00 00 4A 5C 3D 41 1A 42 C4 1D
+28 4E 08 93 08 20 BA 4F 00 00 A2 53 C4 1D 8E 4A
+00 00 3E 4F 30 4D 8E 43 00 00 61 3F 00 00 03 46
+57 31 84 12 48 5C 00 00 6E 5C 03 46 57 32 84 12
+48 5C 00 00 7A 5C 03 46 57 33 84 12 48 5C 00 00
+86 5C 04 47 4F 54 4F 00 87 12 B6 5A A0 4D C0 4B
+2A 44 F6 5B 05 3F 47 4F 54 4F 87 12 D4 5B A0 4D
+C0 4B 2A 44
@FFCC
-C6 52 C6 52 C6 52 C6 52 C6 52 C6 52 C6 52 C6 52
-C6 52 C6 52 C6 52 C6 52 C6 52 C6 52 C6 52 C6 52
-C6 52 C6 52 6A 48 C6 52 C6 52 C6 52 C6 52 C6 52
-C6 52 C6 52
+36 54 36 54 36 54 36 54 36 54 36 54 36 54 36 54
+36 54 36 54 36 54 36 54 36 54 36 54 36 54 36 54
+36 54 36 54 92 48 36 54 36 54 36 54 36 54 36 54
+36 54 36 54
q
+++ /dev/null
-@1800
-10 00 6A 48 80 3E 30 75 FD FF 18 00 48 5B FE 53
-2A 48 3C 48 00 00 00 00
-@1DAA
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00
-@4400
-3A 41 0D 12 0D 4A 30 4D 2F 83 8F 4E 00 00 3E 41
-2E 4E 30 4D 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E
-30 4D 00 00 04 45 58 49 54 00 3D 41 30 4D 00 00
-03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 44
-03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
-44 55 50 00 0E 93 F6 23 30 4D 40 44 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 44 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E 44 02 3E 52 00 0E 12 3E 4F 30 4D 8E 44
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 44
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C 44 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 44 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 45
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 44 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA 44 03 41 4E 44 3E FF 30 4D 7A 44 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E 45 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 45 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E 45 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 45 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 44 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
-3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE 45 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 45 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 45 03 3E 49 4E 85 12 C2 1D 10 45
-04 42 41 53 45 00 85 12 DA 1D C0 44 05 53 54 41
-54 45 85 12 B6 1D 30 46 02 42 4C 00 85 12 20 00
-94 45 02 3C 23 00 B2 40 AA 1D AA 1D 30 4D 1E 15
-0E 43 3D 40 20 00 0A 93 04 20 0D 11 0A 4C 0C 43
-09 43 0E 9B 01 28 0E 8B 09 69 08 68 1D 83 07 30
-0C 5C 0A 6A 0E 6E F5 2B 0E 8B 12 D3 F5 3F 0A 4E
-1D 17 30 41 48 46 01 23 1B 42 DA 1D 2C 4F 0A 4E
-B0 12 5E 46 8F 49 00 00 0E 48 7A 90 0A 00 02 28
-3A 50 07 00 3A 50 30 00 92 83 AA 1D 18 42 AA 1D
-C8 4A 00 00 30 4D 96 46 02 23 53 00 87 12 98 46
-D2 46 2D 83 09 93 E0 23 0E 93 DE 23 3D 41 30 4D
-C8 46 02 23 3E 00 9F 42 AA 1D 00 00 3E 40 AA 1D
-2E 8F 30 4D 00 46 04 48 4F 4C 44 00 0A 4E 3E 4F
-DB 3F 3C 46 04 53 49 47 4E 00 0E 93 3E 4F 3A 40
-2D 00 D2 33 30 4D F4 45 03 55 44 2E 87 12 56 46
-CC 46 E6 46 50 49 18 49 2A 44 18 47 02 55 2E 00
-2F 83 8F 4E 00 00 0E 43 F1 3F 3E B0 00 80 06 24
-BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D DA 44
-02 44 2E 00 87 12 56 46 6E 44 80 44 3A 47 CC 46
-92 44 0A 47 E6 46 50 49 18 49 2A 44 52 45 01 2E
-3E B0 00 80 DD 27 2F 83 3E 43 EC 3F F6 46 04 48
-45 52 45 00 2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D
-62 45 05 41 4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D
-E2 46 02 43 2C 00 1A 42 C4 1D CA 4E 00 00 92 53
-C4 1D 3E 4F 30 4D 2F 83 8F 4E 00 00 B0 12 2A 48
-92 B3 DC 05 FD 27 1E 42 CC 05 B0 12 3C 48 30 4D
-30 40 B6 47 7E 47 05 28 4B 45 59 29 18 42 CC 05
-EA 3F 12 46 03 4B 45 59 30 40 DC 47 92 47 06 41
-43 43 45 50 54 00 3C 40 A8 48 3B 40 72 48 2D 15
-0A 4E 2E 4F 0A 5E 3B 40 0D 00 3C 40 20 00 3D 40
-9C 48 92 B3 DC 05 05 24 18 42 CC 05 38 90 0A 00
-04 20 21 53 39 40 56 48 4D 15 B2 40 11 00 CE 05
-A2 B3 DC 05 FD 27 E2 C3 23 02 30 41 B2 40 13 00
-CE 05 A2 B3 DC 05 FD 27 E2 D3 23 02 30 41 00 00
-05 53 4C 45 45 50 30 40 64 48 00 00 07 28 53 4C
-45 45 50 29 12 D2 0A 18 F6 3F 21 52 3A 17 58 42
-CC 05 48 9B E3 27 48 9C 06 2C 78 92 11 20 2E 9F
-0F 24 1E 83 05 3C 0E 9A 03 24 CE 48 00 00 1E 53
-82 48 CE 05 A2 B3 DC 05 FD 27 30 4D 9E 48 2D 83
-92 B3 DC 05 FD 27 E3 23 B2 40 18 00 0A 18 3E 8F
-3D 41 30 4D D6 47 06 28 45 4D 49 54 29 00 08 4E
-3E 4F E6 3F 50 47 04 45 4D 49 54 00 30 40 BE 48
-C6 48 04 45 43 48 4F 00 B2 40 82 48 90 48 30 4D
-6E 47 06 4E 4F 45 43 48 4F 00 B2 40 30 4D 90 48
-30 4D B6 48 04 28 43 52 29 00 2F 83 8F 4E 00 00
-3E 40 0D 00 E3 3F A2 47 02 43 52 00 30 40 FA 48
-04 47 05 53 50 41 43 45 2F 83 8F 4E 00 00 3E 40
-20 00 D4 3F 12 49 06 53 50 41 43 45 53 00 0E 93
-09 24 0D 12 3D 40 3A 49 EF 3F 3C 49 2D 83 1E 83
-EB 23 3D 41 3E 4F 30 4D 2C 47 04 54 59 50 45 00
-0E 93 95 24 2A 4F 8F 5E 00 00 0E 4A 87 12 CA 45
-02 46 0A 45 CC 48 EC 45 60 49 2A 44 2F 82 8F 4E
-02 00 7E 4D 8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D
-26 49 82 53 22 00 87 12 34 44 6C 49 A2 4B 34 44
-22 00 C6 49 96 49 3D 41 6E 4E 1E 83 82 5E C4 1D
-3E 4F 92 B3 C4 1D A2 63 C4 1D 30 4D E2 48 82 2E
-22 00 87 12 86 49 34 44 50 49 A2 4B 2A 44 00 00
-04 57 4F 52 44 00 3C 40 BE 1D 39 4C 3A 4C 09 5A
-3A 5C 28 4C 09 9A 19 24 7E 9A FC 27 1A 83 3B 40
-60 00 C8 4C 00 00 09 9A 0C 24 7C 4A 4E 9C 09 24
-18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F 7C 80 20 00
-F0 3F 1A 82 C0 1D 82 4A C2 1D 1E 42 C4 1D 08 8E
-CE 48 00 00 30 4D 00 00 04 46 49 4E 44 00 2F 83
-0C 4E 65 4C 74 40 80 00 3B 40 CA 1D 3E 4B 0E 93
-1E 24 58 4C 01 00 78 F0 1E 00 0E 58 2E 53 1E 4E
-FE FF 0E 93 F3 27 09 4E 78 49 48 C4 48 95 F7 23
-0A 4C 1A 53 FA 99 00 00 F2 23 58 83 FA 23 19 B3
-09 63 0C 49 6A 4E 1E 43 4A 93 01 30 2E 83 8F 4C
-00 00 35 40 08 44 34 40 14 44 30 4D 2F 53 2F 53
-3E 4F 30 4D 26 46 07 3E 4E 55 4D 42 45 52 3C 4F
-38 4F 29 4F 2F 82 1B 42 DA 1D 6A 4C 7A 80 30 00
-7A 90 0A 00 02 28 7A 80 07 00 0A 9B 13 2C 82 49
-D0 04 82 48 D2 04 82 4B C8 04 19 42 E4 04 18 42
-E6 04 09 5A 08 63 1C 53 1E 83 E7 23 8F 49 04 00
-8F 48 02 00 8F 4C 00 00 30 4D 03 12 0D 12 1B 42
-DA 1D 0B 12 32 C0 00 02 6D 4E 0D 5E 0C 4E 7A 40
-2E 00 0D 9C 0A 28 7A 9C FC 23 32 D0 00 02 FC 4C
-FE FF 0D 9C FC 2F DE 83 00 00 09 43 08 43 3D 40
-50 4B 3F 82 8F 4E 06 00 0C 4E 7E 4C 6A 4C 7A 90
-2D 00 10 2C 3B 40 10 00 7A 80 24 00 06 24 2B 43
-5A 83 03 24 3B 52 6A 53 B0 23 1C 53 1E 83 6A 4C
-7A 90 2D 00 AA 23 1C 53 1E 83 B1 43 04 00 A5 3F
-52 4B 2F 53 0E 93 2C 17 82 4C DA 1D 03 24 2F 52
-0E F3 30 4D 9F 4F 02 00 04 00 BF 4F 00 00 3E E3
-09 20 3E E3 BF E3 02 00 BF E3 00 00 9F 53 02 00
-8F 63 00 00 32 B0 00 02 01 20 2F 53 30 4D D2 48
-07 45 58 45 43 55 54 45 0A 4E 3E 4F 00 4A 28 45
-01 2C 1A 42 C4 1D A2 53 C4 1D 8A 4E 00 00 3E 4F
-30 4D A0 4B 87 4C 49 54 45 52 41 4C 82 93 B6 1D
-16 24 32 B0 00 02 09 24 1A 42 C4 1D A2 52 C4 1D
-BA 40 34 44 00 00 BA 4F 02 00 1A 42 C4 1D A2 52
-C4 1D BA 40 34 44 00 00 8A 4E 02 00 3E 4F 30 4D
-08 49 05 43 4F 55 4E 54 2F 83 1E 53 8F 4E 00 00
-5E 4E FF FF 30 4D 82 4E BE 1D B2 4F C0 1D 3E 4F
-82 43 C2 1D 87 12 4C 46 C6 49 1C 4C 3D 40 28 4C
-FE 22 3D 41 3E 4F 30 4D 2A 4C 0A 4E 3E 4F 3D 40
-40 4C 53 27 3D 40 16 4C 1A E2 B6 1D B2 27 AC 23
-42 4C 3E 4F 3D 40 16 4C B9 23 DE 53 00 00 68 4E
-08 5E F8 40 3F 00 00 00 3D 40 0C 4E CD 3F 90 4B
-08 45 56 41 4C 55 41 54 45 00 39 40 BE 1D 39 12
-39 12 39 12 0D 12 B0 12 2A 44 06 4C 7E 4C 3D 41
-B2 41 C2 1D B2 41 C0 1D B2 41 BE 1D 30 4D 7A 45
-04 51 55 49 54 00 31 40 E0 1C B2 40 00 1C 00 1C
-82 43 B6 1D 82 43 08 18 B0 12 2A 44 6C 49 04 0D
-6F 6B 20 00 50 49 34 44 38 1D 44 44 34 44 50 00
-F6 47 18 49 06 4C 34 44 7E 1C CE 44 B2 45 6C 49
-0D 73 74 61 63 6B 20 65 6D 70 74 79 20 21 1A 4D
-34 44 30 FF 84 47 B2 45 6C 49 0B 46 52 41 4D 20
-66 75 6C 6C 20 21 1A 4D 42 46 F4 44 C0 45 AC 4C
-6C 49 04 0D 20 20 20 00 BC 45 B4 4C EE 47 05 41
-42 4F 52 54 3F 40 80 1C BE 3F 8F 93 02 00 AE 26
-B2 40 82 48 90 48 B0 12 0C 52 82 43 C2 5A 82 43
-CE 5A 82 43 DA 5A 82 43 0A 5B 82 43 16 5B 82 43
-22 5B A2 B3 DC 05 FD 27 B2 40 11 00 CE 05 E2 C3
-23 02 92 C3 DC 05 38 40 A0 AA 39 42 19 83 FE 23
-18 83 FB 23 92 B3 DC 05 F4 23 87 12 6C 49 04 1B
-5B 37 6D 00 50 49 50 49 6C 49 04 1B 5B 30 6D 00
-50 49 4E 51 90 51 96 51 14 4D 0E 4D 86 41 42 4F
-52 54 22 00 87 12 86 49 34 44 1A 4D A2 4B 2A 44
-18 4A 01 27 87 12 4C 46 C6 49 1E 4A C0 45 B2 4D
-2A 44 4A 4C 52 46 81 5C 92 42 BE 1D C2 1D 30 4D
-87 12 A2 49 4C 46 C6 49 CA 4D 08 4E 7A 4E 5A D3
-5A 53 0A 58 19 42 C8 1D 6E 4E 3E F0 1E 00 09 5E
-82 48 AE 1D 82 49 B0 1D 82 4A B2 1D 2A 52 82 4A
-C4 1D 3E 4F 3D 41 30 41 87 12 6C 49 0F 73 74 61
-63 6B 20 6D 69 73 6D 61 74 63 68 21 20 4D 82 9F
-B4 1D F2 23 18 42 AE 1D 19 42 B0 1D A8 49 FE FF
-89 48 00 00 30 4D C0 49 08 56 41 52 49 41 42 4C
-45 00 B0 12 C0 4D BA 40 86 12 FC FF EF 3F F2 4B
-08 43 4F 4E 53 54 41 4E 54 00 B0 12 C0 4D BA 40
-85 12 FC FF 8A 4E FE FF 3E 4F E0 3F 40 4E 06 43
-52 45 41 54 45 00 B0 12 C0 4D BA 40 85 12 FC FF
-8A 4A FE FF D3 3F 60 4C 05 44 4F 45 53 3E 1A 42
-B2 1D BA 40 84 12 00 00 8A 4D 02 00 3D 41 30 4D
-78 4E 05 44 45 46 45 52 B0 12 C0 4D BA 40 30 40
-FC FF BA 40 8E 4E FE FF B9 3F 00 00 81 5B 82 43
-B6 1D 30 4D B6 4D 01 5D B2 43 B6 1D 30 4D 82 49
-87 52 45 43 55 52 53 45 19 42 C4 1D 99 42 B2 1D
-00 00 A2 53 C4 1D 30 4D AC 4E 01 3A B0 12 C0 4D
-BA 40 87 12 FC FF A2 83 C4 1D B2 43 B6 1D 82 4F
-B4 1D 30 4D DA 4E 81 3B 82 93 B6 1D 5D 27 87 12
-34 44 2A 44 A2 4B 0E 4E AE 4E 2A 44 F4 48 09 49
-4D 4D 45 44 49 41 54 45 1A 42 AE 1D FA D0 80 00
-00 00 30 4D BE 4F 02 00 3E 4F 30 4D 0E 4F 82 49
-53 00 87 12 42 46 F4 44 C0 45 46 4F 52 4F 34 44
-24 4F A2 4B 2A 44 A4 4D 24 4F 2A 44 F6 4E 83 5B
-27 5D 87 12 A4 4D 34 44 34 44 A2 4B A2 4B 2A 44
-90 4C 88 50 4F 53 54 50 4F 4E 45 00 87 12 4C 46
-C6 49 1E 4A 54 44 C0 45 B2 4D 7E 45 C0 45 8C 4F
-34 44 34 44 A2 4B A2 4B 34 44 A2 4B A2 4B 2A 44
-92 4F 3A 4E 82 4A C6 1D 2E 4E 82 4E C4 1D 3D 40
-10 00 09 4A 08 49 29 83 18 48 FE FF 0E 98 FC 2B
-89 48 00 00 1D 83 F6 23 2A 4A 0A 93 F0 23 3E 4F
-3D 41 30 4D 2E 4F 82 49 46 00 2F 83 8F 4E 00 00
-1E 42 C4 1D BE 40 C0 45 00 00 A2 52 C4 1D 2E 53
-30 4D 92 4E 84 45 4C 53 45 00 1A 42 C4 1D BA 40
-BC 45 00 00 2A 52 82 4A C4 1D 8E 4A 00 00 2A 83
-0E 4A 30 4D 4A 49 84 54 48 45 4E 00 9E 42 C4 1D
-00 00 3E 4F 30 4D 5E 4E 85 42 45 47 49 4E 30 40
-84 47 06 50 85 55 4E 54 49 4C 39 40 C0 45 1A 42
-C4 1D A2 52 C4 1D 8A 49 00 00 8A 4E 02 00 3E 4F
-30 4D 8C 4D 85 41 47 41 49 4E 39 40 BC 45 EF 3F
-28 4E 85 57 48 49 4C 45 87 12 CA 4F 6E 44 2A 44
-C0 4E 86 52 45 50 45 41 54 00 87 12 4A 50 0C 50
-2A 44 E4 4F 82 44 4F 00 2F 83 8F 4E 00 00 1E 42
-C4 1D BE 40 CA 45 00 00 2E 53 82 4E C4 1D A2 53
-00 1C 1A 42 00 1C 8A 43 00 00 30 4D B4 4B 84 4C
-4F 4F 50 00 39 40 EC 45 1A 42 C4 1D A2 52 C4 1D
-8A 49 00 00 8A 4E 02 00 1E 42 00 1C A2 83 00 1C
-2E 4E 0E 93 04 24 9E 42 C4 1D 00 00 F5 3F 3E 4F
-30 4D E4 47 85 2B 4C 4F 4F 50 39 40 DA 45 E4 3F
-9E 50 85 4C 45 41 56 45 1A 42 C4 1D BA 40 FC 45
-00 00 BA 40 BC 45 02 00 B2 50 06 00 C4 1D A2 53
-00 1C 2A 52 19 42 00 1C 89 4A 00 00 30 4D E2 50
-04 4D 4F 56 45 00 0A 4E 38 4F 39 4F 3E 4F 0A 93
-11 24 08 99 0F 24 06 2C F8 49 00 00 18 53 1A 83
-FB 23 30 4D 08 5A 09 5A 19 83 18 83 E8 49 00 00
-1A 83 FA 23 30 4D 34 44 CA 1D FC 44 2A 44 84 12
-46 51 44 54 1A 54 74 50 A2 4D 02 54 D4 50 10 51
-AE 49 B4 51 E8 51 24 50 AE 52 48 45 4E 4F B6 4E
-86 4A 00 00 3A 40 0C 00 39 40 CA 1D 38 40 CC 1D
-D9 3F 3A 40 0E 00 39 40 CC 1D 38 40 CA 1D CC 3F
-82 43 CC 1D 30 4D 92 42 CA 1D C8 1D 30 4D 62 4F
-09 50 57 52 5F 53 54 41 54 45 84 12 90 4F FE 53
-48 5B A0 51 08 50 57 52 5F 48 45 52 45 00 92 42
-C4 1D B0 51 92 42 C6 1D AE 51 EF 3F 62 50 09 52
-53 54 5F 53 54 41 54 45 92 42 0C 18 B0 51 92 42
-0E 18 AE 51 E2 3F CE 51 08 52 53 54 5F 48 45 52
-45 00 92 42 C4 1D 0C 18 92 42 C6 1D 0E 18 DF 3F
-B2 40 54 52 B6 52 B2 40 64 48 58 48 B2 40 BE 48
-CE 48 B2 40 FA 48 0E 49 B2 40 DC 47 EA 47 30 41
-52 50 04 57 49 50 45 00 39 40 80 FF B9 43 00 00
-29 53 39 90 CC FF FA 23 B0 12 00 52 B2 40 48 5B
-C4 1D B2 40 FE 53 C6 1D D4 3F C6 4F 06 28 57 41
-52 4D 29 00 1E 42 08 18 87 12 6C 49 05 0D 1B 5B
-37 6D 50 49 70 47 6C 49 27 20 46 61 73 74 46 6F
-72 74 68 20 56 31 36 30 20 31 36 4D 48 7A 20 28
-43 29 20 4A 2E 4D 2E 54 68 6F 6F 72 65 6E 73 20
-50 49 34 44 30 FF 84 47 2A 45 30 47 6C 49 0B 62
-79 74 65 73 20 66 72 65 65 20 26 4D 22 52 04 57
-41 52 4D 00 30 40 54 52 18 50 04 43 4F 4C 44 00
-B2 40 04 A5 20 01 B2 40 88 5A 5C 01 92 D3 04 02
-B2 40 FE FF 02 02 A2 83 06 02 B2 D0 00 42 24 02
-B2 D3 26 02 B2 40 FF BF 22 02 F2 43 22 03 F2 D3
-26 03 F2 40 A5 00 41 01 F2 40 10 00 40 01 D2 43
-41 01 F2 40 A5 00 61 01 B2 40 48 00 62 01 82 43
-66 01 39 40 80 00 B2 40 33 00 64 01 D2 43 61 01
-92 D2 9E 01 08 18 A2 93 08 18 01 24 59 07 38 40
-C2 A2 18 83 FE 23 19 83 FA 23 B2 D2 B0 01 F2 D0
-10 00 2A 03 F2 C0 40 00 A1 04 3A 40 C6 52 39 40
-CC FF 89 4A 00 00 29 53 FC 23 92 42 02 18 F0 FF
-B2 40 18 00 0A 18 31 40 E0 1C 3F 40 80 1C 37 40
-00 44 36 40 B4 44 35 40 08 44 34 40 14 44 B2 40
-0A 00 DA 1D B2 43 AC 1D 92 C3 30 01 18 42 08 18
-D2 B3 01 02 04 20 38 E3 18 53 82 48 08 18 B2 40
-81 00 C0 05 B2 40 05 00 C6 05 B2 40 00 49 C8 05
-F2 D0 03 00 0D 02 92 C3 C0 05 92 D3 DA 05 3D 40
-D8 53 18 42 08 18 38 90 0A 00 2E 27 38 90 16 00
-2B 2F 28 93 01 23 E9 26 B4 52 84 12 46 51 26 5A
-D2 5A DA 59 26 5B A0 59 5A 5A A4 56 00 00 96 59
-46 5A F8 59 36 5A B4 57 00 00 00 00 38 5B 72 51
-4C 52 85 48 49 32 4C 4F 87 12 84 47 DE 4F A2 4B
-AE 4E 74 51 DA 53 2A 44 BA 52 04 43 4F 44 45 00
-B0 12 C0 4D A2 82 C4 1D 87 12 EE 4E BC 45 12 54
-00 00 07 45 4E 44 43 4F 44 45 87 12 82 51 0E 4E
-2A 44 44 50 03 41 53 4D 92 42 C8 1D B8 1D B2 40
-DE 53 C8 1D E5 3F 32 54 06 45 4E 44 41 53 4D 00
-92 42 B8 1D C8 1D E9 3F 00 00 05 43 4F 4C 4F 4E
-1A 42 C4 1D BA 40 87 12 00 00 A2 53 C4 1D B2 43
-B6 1D 30 40 82 51 00 00 05 4C 4F 32 48 49 1A 42
-C4 1D BA 40 B0 12 00 00 BA 40 2A 44 02 00 A2 52
-C4 1D ED 3F 38 40 BE 1D 39 48 2A 48 09 5A 1A 52
-C2 1D 09 9A 03 24 7E 9A FC 27 1A 83 0E 4A 2A 88
-82 4A C2 1D 30 4D B0 12 2A 44 C6 49 1E 4A 72 45
-C0 45 DC 54 DA 4A C0 45 B2 4D FE 54 DE 54 29 4E
-39 90 86 12 02 20 2E 53 30 41 39 90 85 12 03 20
-1E 4E 02 00 30 41 39 90 84 12 01 20 2E 52 30 41
-19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 40 29 00
-12 12 C2 1D 92 53 C2 1D B0 12 2A 44 C6 49 DA 4A
-C0 45 30 55 26 55 21 53 3E 90 10 00 BB 2D 30 41
-32 55 B2 41 C2 1D 22 D3 30 41 87 12 4C 46 A4 54
-42 55 82 43 BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D
-0A 4E 3E 4F FA 90 23 00 00 00 34 20 92 53 C2 1D
-B0 12 C6 54 0E 93 04 20 B2 40 00 03 BC 1D 27 3C
-1E 93 04 20 B2 40 10 03 BC 1D 21 3C 2E 93 04 20
-B2 40 20 03 BC 1D 1B 3C 2E 92 04 20 B2 40 20 02
-BC 1D 15 3C 3E 92 04 20 B2 40 30 02 BC 1D 0F 3C
-3E 93 04 20 B2 40 30 03 BC 1D 09 3C B2 40 30 00
-BC 1D 19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 4F
-3D 41 30 4D FA 90 26 00 00 00 08 20 B2 40 10 02
-BC 1D 92 53 C2 1D 30 12 B2 55 75 3F FA 90 40 00
-00 00 1A 20 B2 40 20 00 BC 1D 92 53 C2 1D B0 12
-10 55 0E 20 B2 50 10 00 BC 1D 3E 40 2B 00 B0 12
-10 55 32 24 92 92 BE 1D C2 1D 02 24 92 53 C2 1D
-8E 10 82 5E BC 1D D3 3F B0 12 10 55 F9 23 B2 50
-10 00 BC 1D 3E 40 28 00 B0 12 C6 54 30 12 02 56
-67 3F 87 12 4C 46 A4 54 3A 56 FE 90 26 00 00 00
-3E 40 20 00 04 20 B2 50 82 00 BC 1D C2 3F B0 12
-10 55 DF 23 B2 50 80 00 BC 1D 3E 40 28 00 B0 12
-C6 54 B0 12 00 55 D5 23 3D 40 B2 4D 30 4D 50 48
-04 52 45 54 49 00 87 12 34 44 00 13 A2 4B 2A 44
-34 44 2C 00 3A 55 32 56 8A 56 2E 4E 1E D2 BC 1D
-19 42 BA 1D 92 3F 88 54 03 4D 4F 56 84 12 80 56
-00 40 98 56 05 4D 4F 56 2E 42 84 12 80 56 40 40
-00 00 03 41 44 44 84 12 80 56 00 50 B2 56 05 41
-44 44 2E 42 84 12 80 56 40 50 BE 56 04 41 44 44
-43 00 84 12 80 56 00 60 CC 56 06 41 44 44 43 2E
-42 00 84 12 80 56 40 60 70 56 04 53 55 42 43 00
-84 12 80 56 00 70 EA 56 06 53 55 42 43 2E 42 00
-84 12 80 56 40 70 F8 56 03 53 55 42 84 12 80 56
-00 80 08 57 05 53 55 42 2E 42 84 12 80 56 40 80
-6A 54 03 43 4D 50 84 12 80 56 00 90 22 57 05 43
-4D 50 2E 42 84 12 80 56 40 90 58 54 04 44 41 44
-44 00 84 12 80 56 00 A0 3C 57 06 44 41 44 44 2E
-42 00 84 12 80 56 40 A0 2E 57 03 42 49 54 84 12
-80 56 00 B0 5A 57 05 42 49 54 2E 42 84 12 80 56
-40 B0 66 57 03 42 49 43 84 12 80 56 00 C0 74 57
-05 42 49 43 2E 42 84 12 80 56 40 C0 80 57 03 42
-49 53 84 12 80 56 00 D0 8E 57 05 42 49 53 2E 42
-84 12 80 56 40 D0 00 00 03 58 4F 52 84 12 80 56
-00 E0 A8 57 05 58 4F 52 2E 42 84 12 80 56 40 E0
-DA 56 03 41 4E 44 84 12 80 56 00 F0 C2 57 05 41
-4E 44 2E 42 84 12 80 56 40 F0 4C 46 3A 55 E0 57
-1A 42 BC 1D B2 F0 70 00 BC 1D 8A 10 3A F0 0F 00
-82 DA BC 1D 4A 3F 14 57 03 52 52 43 84 12 DA 57
-00 10 F8 57 05 52 52 43 2E 42 84 12 DA 57 40 10
-04 58 04 53 57 50 42 00 84 12 DA 57 80 10 12 58
-03 52 52 41 84 12 DA 57 00 11 20 58 05 52 52 41
-2E 42 84 12 DA 57 40 11 2C 58 03 53 58 54 84 12
-DA 57 80 11 00 00 04 50 55 53 48 00 84 12 DA 57
-00 12 46 58 06 50 55 53 48 2E 42 00 84 12 DA 57
-40 12 9A 57 04 43 41 4C 4C 00 84 12 DA 57 80 12
-34 44 2C 00 3A 55 32 56 7A 58 59 42 BC 1D 5A 42
-BD 1D 82 4A BC 1D BE 90 00 15 00 00 02 20 0A 89
-02 3C 09 8A 0A 49 3A 90 10 00 03 2C 5A 0E A8 3F
-1A 53 0E 4A 87 12 70 47 6C 49 0D 6F 75 74 20 6F
-66 20 62 6F 75 6E 64 73 20 4D 54 58 05 50 55 53
-48 4D 84 12 70 58 00 15 BC 58 04 50 4F 50 4D 00
-84 12 70 58 00 17 4C 46 A4 54 DC 58 82 43 BC 1D
-92 42 C4 1D BA 1D A2 53 C4 1D 92 53 C2 1D 3E 40
-2C 00 B0 12 2A 44 C6 49 DA 4A C0 45 B2 4D 32 56
-02 59 0A 4E 3E 4F 1A 83 2A 92 CA 2F 8A 10 5A 06
-6F 3F 3A 58 04 52 52 43 4D 00 84 12 D6 58 50 00
-14 59 04 52 52 41 4D 00 84 12 D6 58 50 01 22 59
-04 52 4C 41 4D 00 84 12 D6 58 50 02 30 59 04 52
-52 55 4D 00 84 12 D6 58 50 03 85 12 00 3C 3E 59
-03 53 3E 3D 85 12 00 38 50 59 02 53 3C 00 85 12
-00 34 CA 58 03 30 3E 3D 85 12 00 30 64 59 02 30
-3C 00 85 12 00 30 00 00 02 55 3C 00 85 12 00 2C
-78 59 03 55 3E 3D 85 12 00 28 6E 59 03 30 3C 3E
-85 12 00 24 8C 59 02 30 3D 00 85 12 00 20 5C 48
-02 49 46 00 1A 42 C4 1D 8A 4E 00 00 A2 53 C4 1D
-0E 4A 30 4D 82 59 04 54 48 45 4E 00 1A 42 C4 1D
-08 4E 3E 4F 09 48 29 53 0A 89 0A 11 3A 90 00 02
-68 2F 88 DA 00 00 30 4D 4A 57 04 45 4C 53 45 00
-1A 42 C4 1D BA 40 00 3C 00 00 A2 53 C4 1D 2F 83
-8F 4A 00 00 E3 3F B6 59 05 55 4E 54 49 4C 3A 4F
-08 4E 3E 4F 19 42 C4 1D 2A 83 0A 89 0A 11 3A 90
-00 FE 47 3B 3A F0 FF 03 08 DA 89 48 00 00 A2 53
-C4 1D 30 4D CE 57 05 41 47 41 49 4E 87 12 4A 59
-FE 59 2A 44 00 00 05 57 48 49 4C 45 87 12 A4 59
-6E 44 2A 44 5A 59 06 52 45 50 45 41 54 00 87 12
-4A 59 FE 59 BC 59 2A 44 00 00 03 4A 4D 50 87 12
-A4 4D 4A 59 FE 59 2A 44 3E B0 00 10 03 20 3E E0
-00 04 30 4D 3E 90 00 34 06 28 03 24 3E 40 00 34
-30 4D 3E 40 00 38 30 4D 00 00 04 3F 4A 4D 50 00
-87 12 68 5A A4 4D 6E 44 FE 59 2A 44 9E 5A 3D 41
-08 4E 3E 4F 2A 48 0A 93 04 20 98 42 C4 1D 00 00
-30 4D 88 43 00 00 A4 3F 64 58 03 42 57 31 84 12
-9C 5A 00 00 BA 5A 03 42 57 32 84 12 9C 5A 00 00
-C6 5A 03 42 57 33 84 12 9C 5A 00 00 DE 5A 3D 41
-1A 42 C4 1D 28 4E 08 93 08 20 BA 4F 00 00 A2 53
-C4 1D 8E 4A 00 00 3E 4F 30 4D 8E 43 00 00 61 3F
-00 00 03 46 57 31 84 12 DC 5A 00 00 02 5B 03 46
-57 32 84 12 DC 5A 00 00 0E 5B 03 46 57 33 84 12
-DC 5A 00 00 1A 5B 04 47 4F 54 4F 00 87 12 4A 59
-A4 4D 98 4B 2A 44 8A 5A 05 3F 47 4F 54 4F 87 12
-68 5A A4 4D 98 4B 2A 44
-@FFCC
-C6 52 C6 52 C6 52 C6 52 C6 52 C6 52 C6 52 C6 52
-C6 52 C6 52 C6 52 C6 52 C6 52 C6 52 C6 52 C6 52
-C6 52 C6 52 6A 48 C6 52 C6 52 C6 52 C6 52 C6 52
-C6 52 C6 52
-q
+++ /dev/null
-@1800
-10 00 5E 48 F4 01 80 04 FD FF 18 00 28 5B DE 53
-2A 48 36 48 00 00 00 00
-@1DAA
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00
-@4400
-3A 41 0D 12 0D 4A 30 4D 2F 83 8F 4E 00 00 3E 41
-2E 4E 30 4D 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E
-30 4D 00 00 04 45 58 49 54 00 3D 41 30 4D 00 00
-03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 44
-03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
-44 55 50 00 0E 93 F6 23 30 4D 40 44 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 44 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E 44 02 3E 52 00 0E 12 3E 4F 30 4D 8E 44
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 44
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C 44 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 44 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 45
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 44 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA 44 03 41 4E 44 3E FF 30 4D 7A 44 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E 45 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 45 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E 45 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 45 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 44 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
-3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE 45 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 45 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 45 03 3E 49 4E 85 12 C2 1D 10 45
-04 42 41 53 45 00 85 12 DA 1D C0 44 05 53 54 41
-54 45 85 12 B6 1D 30 46 02 42 4C 00 85 12 20 00
-94 45 02 3C 23 00 B2 40 AA 1D AA 1D 30 4D 1E 15
-0E 43 3D 40 20 00 0A 93 04 20 0D 11 0A 4C 0C 43
-09 43 0E 9B 01 28 0E 8B 09 69 08 68 1D 83 07 30
-0C 5C 0A 6A 0E 6E F5 2B 0E 8B 12 D3 F5 3F 0A 4E
-1D 17 30 41 48 46 01 23 1B 42 DA 1D 2C 4F 0A 4E
-B0 12 5E 46 8F 49 00 00 0E 48 7A 90 0A 00 02 28
-3A 50 07 00 3A 50 30 00 92 83 AA 1D 18 42 AA 1D
-C8 4A 00 00 30 4D 96 46 02 23 53 00 87 12 98 46
-D2 46 2D 83 09 93 E0 23 0E 93 DE 23 3D 41 30 4D
-C8 46 02 23 3E 00 9F 42 AA 1D 00 00 3E 40 AA 1D
-2E 8F 30 4D 00 46 04 48 4F 4C 44 00 0A 4E 3E 4F
-DB 3F 3C 46 04 53 49 47 4E 00 0E 93 3E 4F 3A 40
-2D 00 D2 33 30 4D F4 45 03 55 44 2E 87 12 56 46
-CC 46 E6 46 44 49 0C 49 2A 44 18 47 02 55 2E 00
-2F 83 8F 4E 00 00 0E 43 F1 3F 3E B0 00 80 06 24
-BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D DA 44
-02 44 2E 00 87 12 56 46 6E 44 80 44 3A 47 CC 46
-92 44 0A 47 E6 46 44 49 0C 49 2A 44 52 45 01 2E
-3E B0 00 80 DD 27 2F 83 3E 43 EC 3F F6 46 04 48
-45 52 45 00 2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D
-62 45 05 41 4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D
-E2 46 02 43 2C 00 1A 42 C4 1D CA 4E 00 00 92 53
-C4 1D 3E 4F 30 4D 2F 83 8F 4E 00 00 B0 12 2A 48
-92 B3 DC 05 FD 27 1E 42 CC 05 B0 12 36 48 30 4D
-30 40 B6 47 7E 47 05 28 4B 45 59 29 18 42 CC 05
-EA 3F 12 46 03 4B 45 59 30 40 DC 47 92 47 06 41
-43 43 45 50 54 00 3C 40 96 48 3B 40 66 48 2D 15
-0A 4E 2E 4F 0A 5E 3B 40 0D 00 3C 40 20 00 3D 40
-8A 48 92 B3 DC 05 05 24 18 42 CC 05 38 90 0A 00
-04 20 21 53 39 40 4A 48 4D 15 B2 40 11 00 CE 05
-E2 C3 23 02 30 41 B2 40 13 00 CE 05 E2 D3 23 02
-30 41 00 00 05 53 4C 45 45 50 30 40 58 48 00 00
-07 28 53 4C 45 45 50 29 12 D2 0A 18 F6 3F 21 52
-3A 17 58 42 CC 05 48 9B E6 27 48 9C 06 2C 78 92
-0E 20 2E 9F 0C 24 1E 83 05 3C 0E 9A 03 24 CE 48
-00 00 1E 53 82 48 CE 05 30 4D 8C 48 2D 83 92 B3
-DC 05 FD 27 E6 23 B2 40 18 00 0A 18 3E 8F 3D 41
-30 4D D6 47 06 28 45 4D 49 54 29 00 08 4E 3E 4F
-A2 B3 DC 05 FD 27 E6 3F 50 47 04 45 4D 49 54 00
-30 40 AC 48 BA 48 04 45 43 48 4F 00 B2 40 82 48
-84 48 30 4D 6E 47 06 4E 4F 45 43 48 4F 00 B2 40
-30 4D 84 48 30 4D A4 48 04 28 43 52 29 00 2F 83
-8F 4E 00 00 3E 40 0D 00 E3 3F A2 47 02 43 52 00
-30 40 EE 48 04 47 05 53 50 41 43 45 2F 83 8F 4E
-00 00 3E 40 20 00 D4 3F 06 49 06 53 50 41 43 45
-53 00 0E 93 09 24 0D 12 3D 40 2E 49 EF 3F 30 49
-2D 83 1E 83 EB 23 3D 41 3E 4F 30 4D 2C 47 04 54
-59 50 45 00 0E 93 95 24 2A 4F 8F 5E 00 00 0E 4A
-87 12 CA 45 02 46 0A 45 C0 48 EC 45 54 49 2A 44
-2F 82 8F 4E 02 00 7E 4D 8F 4D 00 00 0D 5E 1D B3
-0D 63 30 4D 1A 49 82 53 22 00 87 12 34 44 60 49
-96 4B 34 44 22 00 BA 49 8A 49 3D 41 6E 4E 1E 83
-82 5E C4 1D 3E 4F 92 B3 C4 1D A2 63 C4 1D 30 4D
-D6 48 82 2E 22 00 87 12 7A 49 34 44 44 49 96 4B
-2A 44 00 00 04 57 4F 52 44 00 3C 40 BE 1D 39 4C
-3A 4C 09 5A 3A 5C 28 4C 09 9A 19 24 7E 9A FC 27
-1A 83 3B 40 60 00 C8 4C 00 00 09 9A 0C 24 7C 4A
-4E 9C 09 24 18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F
-7C 80 20 00 F0 3F 1A 82 C0 1D 82 4A C2 1D 1E 42
-C4 1D 08 8E CE 48 00 00 30 4D 00 00 04 46 49 4E
-44 00 2F 83 0C 4E 65 4C 74 40 80 00 3B 40 CA 1D
-3E 4B 0E 93 1E 24 58 4C 01 00 78 F0 1E 00 0E 58
-2E 53 1E 4E FE FF 0E 93 F3 27 09 4E 78 49 48 C4
-48 95 F7 23 0A 4C 1A 53 FA 99 00 00 F2 23 58 83
-FA 23 19 B3 09 63 0C 49 6A 4E 1E 43 4A 93 01 30
-2E 83 8F 4C 00 00 35 40 08 44 34 40 14 44 30 4D
-2F 53 2F 53 3E 4F 30 4D 26 46 07 3E 4E 55 4D 42
-45 52 3C 4F 38 4F 29 4F 2F 82 1B 42 DA 1D 6A 4C
-7A 80 30 00 7A 90 0A 00 02 28 7A 80 07 00 0A 9B
-13 2C 82 49 D0 04 82 48 D2 04 82 4B C8 04 19 42
-E4 04 18 42 E6 04 09 5A 08 63 1C 53 1E 83 E7 23
-8F 49 04 00 8F 48 02 00 8F 4C 00 00 30 4D 03 12
-0D 12 1B 42 DA 1D 0B 12 32 C0 00 02 6D 4E 0D 5E
-0C 4E 7A 40 2E 00 0D 9C 0A 28 7A 9C FC 23 32 D0
-00 02 FC 4C FE FF 0D 9C FC 2F DE 83 00 00 09 43
-08 43 3D 40 44 4B 3F 82 8F 4E 06 00 0C 4E 7E 4C
-6A 4C 7A 90 2D 00 10 2C 3B 40 10 00 7A 80 24 00
-06 24 2B 43 5A 83 03 24 3B 52 6A 53 B0 23 1C 53
-1E 83 6A 4C 7A 90 2D 00 AA 23 1C 53 1E 83 B1 43
-04 00 A5 3F 46 4B 2F 53 0E 93 2C 17 82 4C DA 1D
-03 24 2F 52 0E F3 30 4D 9F 4F 02 00 04 00 BF 4F
-00 00 3E E3 09 20 3E E3 BF E3 02 00 BF E3 00 00
-9F 53 02 00 8F 63 00 00 32 B0 00 02 01 20 2F 53
-30 4D C6 48 07 45 58 45 43 55 54 45 0A 4E 3E 4F
-00 4A 28 45 01 2C 1A 42 C4 1D A2 53 C4 1D 8A 4E
-00 00 3E 4F 30 4D 94 4B 87 4C 49 54 45 52 41 4C
-82 93 B6 1D 16 24 32 B0 00 02 09 24 1A 42 C4 1D
-A2 52 C4 1D BA 40 34 44 00 00 BA 4F 02 00 1A 42
-C4 1D A2 52 C4 1D BA 40 34 44 00 00 8A 4E 02 00
-3E 4F 30 4D FC 48 05 43 4F 55 4E 54 2F 83 1E 53
-8F 4E 00 00 5E 4E FF FF 30 4D 82 4E BE 1D B2 4F
-C0 1D 3E 4F 82 43 C2 1D 87 12 4C 46 BA 49 10 4C
-3D 40 1C 4C FE 22 3D 41 3E 4F 30 4D 1E 4C 0A 4E
-3E 4F 3D 40 34 4C 53 27 3D 40 0A 4C 1A E2 B6 1D
-B2 27 AC 23 36 4C 3E 4F 3D 40 0A 4C B9 23 DE 53
-00 00 68 4E 08 5E F8 40 3F 00 00 00 3D 40 00 4E
-CD 3F 84 4B 08 45 56 41 4C 55 41 54 45 00 39 40
-BE 1D 39 12 39 12 39 12 0D 12 B0 12 2A 44 FA 4B
-72 4C 3D 41 B2 41 C2 1D B2 41 C0 1D B2 41 BE 1D
-30 4D 7A 45 04 51 55 49 54 00 31 40 E0 1C B2 40
-00 1C 00 1C 82 43 B6 1D 82 43 08 18 B0 12 2A 44
-60 49 04 0D 6F 6B 20 00 44 49 34 44 38 1D 44 44
-34 44 50 00 F6 47 0C 49 FA 4B 34 44 7E 1C CE 44
-B2 45 60 49 0D 73 74 61 63 6B 20 65 6D 70 74 79
-20 21 0E 4D 34 44 30 FF 84 47 B2 45 60 49 0B 46
-52 41 4D 20 66 75 6C 6C 20 21 0E 4D 42 46 F4 44
-C0 45 A0 4C 60 49 04 0D 20 20 20 00 BC 45 A8 4C
-EE 47 05 41 42 4F 52 54 3F 40 80 1C BE 3F 8F 93
-02 00 AE 26 B2 40 82 48 84 48 B0 12 00 52 82 43
-A2 5A 82 43 AE 5A 82 43 BA 5A 82 43 EA 5A 82 43
-F6 5A 82 43 02 5B A2 B3 DC 05 FD 27 B2 40 11 00
-CE 05 E2 C3 23 02 92 C3 DC 05 38 40 55 05 39 42
-19 83 FE 23 18 83 FB 23 92 B3 DC 05 F4 23 87 12
-60 49 04 1B 5B 37 6D 00 44 49 44 49 60 49 04 1B
-5B 30 6D 00 44 49 42 51 84 51 8A 51 08 4D 02 4D
-86 41 42 4F 52 54 22 00 87 12 7A 49 34 44 0E 4D
-96 4B 2A 44 0C 4A 01 27 87 12 4C 46 BA 49 12 4A
-C0 45 A6 4D 2A 44 3E 4C 52 46 81 5C 92 42 BE 1D
-C2 1D 30 4D 87 12 96 49 4C 46 BA 49 BE 4D 08 4E
-7A 4E 5A D3 5A 53 0A 58 19 42 C8 1D 6E 4E 3E F0
-1E 00 09 5E 82 48 AE 1D 82 49 B0 1D 82 4A B2 1D
-2A 52 82 4A C4 1D 3E 4F 3D 41 30 41 87 12 60 49
-0F 73 74 61 63 6B 20 6D 69 73 6D 61 74 63 68 21
-14 4D 82 9F B4 1D F2 23 18 42 AE 1D 19 42 B0 1D
-A8 49 FE FF 89 48 00 00 30 4D B4 49 08 56 41 52
-49 41 42 4C 45 00 B0 12 B4 4D BA 40 86 12 FC FF
-EF 3F E6 4B 08 43 4F 4E 53 54 41 4E 54 00 B0 12
-B4 4D BA 40 85 12 FC FF 8A 4E FE FF 3E 4F E0 3F
-34 4E 06 43 52 45 41 54 45 00 B0 12 B4 4D BA 40
-85 12 FC FF 8A 4A FE FF D3 3F 54 4C 05 44 4F 45
-53 3E 1A 42 B2 1D BA 40 84 12 00 00 8A 4D 02 00
-3D 41 30 4D 6C 4E 05 44 45 46 45 52 B0 12 B4 4D
-BA 40 30 40 FC FF BA 40 82 4E FE FF B9 3F 00 00
-81 5B 82 43 B6 1D 30 4D AA 4D 01 5D B2 43 B6 1D
-30 4D 76 49 87 52 45 43 55 52 53 45 19 42 C4 1D
-99 42 B2 1D 00 00 A2 53 C4 1D 30 4D A0 4E 01 3A
-B0 12 B4 4D BA 40 87 12 FC FF A2 83 C4 1D B2 43
-B6 1D 82 4F B4 1D 30 4D CE 4E 81 3B 82 93 B6 1D
-5D 27 87 12 34 44 2A 44 96 4B 02 4E A2 4E 2A 44
-E8 48 09 49 4D 4D 45 44 49 41 54 45 1A 42 AE 1D
-FA D0 80 00 00 00 30 4D BE 4F 02 00 3E 4F 30 4D
-02 4F 82 49 53 00 87 12 42 46 F4 44 C0 45 3A 4F
-46 4F 34 44 18 4F 96 4B 2A 44 98 4D 18 4F 2A 44
-EA 4E 83 5B 27 5D 87 12 98 4D 34 44 34 44 96 4B
-96 4B 2A 44 84 4C 88 50 4F 53 54 50 4F 4E 45 00
-87 12 4C 46 BA 49 12 4A 54 44 C0 45 A6 4D 7E 45
-C0 45 80 4F 34 44 34 44 96 4B 96 4B 34 44 96 4B
-96 4B 2A 44 86 4F 3A 4E 82 4A C6 1D 2E 4E 82 4E
-C4 1D 3D 40 10 00 09 4A 08 49 29 83 18 48 FE FF
-0E 98 FC 2B 89 48 00 00 1D 83 F6 23 2A 4A 0A 93
-F0 23 3E 4F 3D 41 30 4D 22 4F 82 49 46 00 2F 83
-8F 4E 00 00 1E 42 C4 1D BE 40 C0 45 00 00 A2 52
-C4 1D 2E 53 30 4D 86 4E 84 45 4C 53 45 00 1A 42
-C4 1D BA 40 BC 45 00 00 2A 52 82 4A C4 1D 8E 4A
-00 00 2A 83 0E 4A 30 4D 3E 49 84 54 48 45 4E 00
-9E 42 C4 1D 00 00 3E 4F 30 4D 52 4E 85 42 45 47
-49 4E 30 40 84 47 FA 4F 85 55 4E 54 49 4C 39 40
-C0 45 1A 42 C4 1D A2 52 C4 1D 8A 49 00 00 8A 4E
-02 00 3E 4F 30 4D 80 4D 85 41 47 41 49 4E 39 40
-BC 45 EF 3F 1C 4E 85 57 48 49 4C 45 87 12 BE 4F
-6E 44 2A 44 B4 4E 86 52 45 50 45 41 54 00 87 12
-3E 50 00 50 2A 44 D8 4F 82 44 4F 00 2F 83 8F 4E
-00 00 1E 42 C4 1D BE 40 CA 45 00 00 2E 53 82 4E
-C4 1D A2 53 00 1C 1A 42 00 1C 8A 43 00 00 30 4D
-A8 4B 84 4C 4F 4F 50 00 39 40 EC 45 1A 42 C4 1D
-A2 52 C4 1D 8A 49 00 00 8A 4E 02 00 1E 42 00 1C
-A2 83 00 1C 2E 4E 0E 93 04 24 9E 42 C4 1D 00 00
-F5 3F 3E 4F 30 4D E4 47 85 2B 4C 4F 4F 50 39 40
-DA 45 E4 3F 92 50 85 4C 45 41 56 45 1A 42 C4 1D
-BA 40 FC 45 00 00 BA 40 BC 45 02 00 B2 50 06 00
-C4 1D A2 53 00 1C 2A 52 19 42 00 1C 89 4A 00 00
-30 4D D6 50 04 4D 4F 56 45 00 0A 4E 38 4F 39 4F
-3E 4F 0A 93 11 24 08 99 0F 24 06 2C F8 49 00 00
-18 53 1A 83 FB 23 30 4D 08 5A 09 5A 19 83 18 83
-E8 49 00 00 1A 83 FA 23 30 4D 34 44 CA 1D FC 44
-2A 44 84 12 3A 51 24 54 FA 53 68 50 96 4D E2 53
-C8 50 04 51 A2 49 A8 51 DC 51 18 50 A2 52 48 45
-42 4F AA 4E 7A 4A 00 00 3A 40 0C 00 39 40 CA 1D
-38 40 CC 1D D9 3F 3A 40 0E 00 39 40 CC 1D 38 40
-CA 1D CC 3F 82 43 CC 1D 30 4D 92 42 CA 1D C8 1D
-30 4D 56 4F 09 50 57 52 5F 53 54 41 54 45 84 12
-84 4F DE 53 28 5B 94 51 08 50 57 52 5F 48 45 52
-45 00 92 42 C4 1D A4 51 92 42 C6 1D A2 51 EF 3F
-56 50 09 52 53 54 5F 53 54 41 54 45 92 42 0C 18
-A4 51 92 42 0E 18 A2 51 E2 3F C2 51 08 52 53 54
-5F 48 45 52 45 00 92 42 C4 1D 0C 18 92 42 C6 1D
-0E 18 DF 3F B2 40 48 52 AA 52 B2 40 58 48 4C 48
-B2 40 AC 48 C2 48 B2 40 EE 48 02 49 B2 40 DC 47
-EA 47 30 41 46 50 04 57 49 50 45 00 39 40 80 FF
-B9 43 00 00 29 53 39 90 CC FF FA 23 B0 12 F4 51
-B2 40 28 5B C4 1D B2 40 DE 53 C6 1D D4 3F BA 4F
-06 28 57 41 52 4D 29 00 1E 42 08 18 87 12 60 49
-05 0D 1B 5B 37 6D 44 49 70 47 60 49 27 20 46 61
-73 74 46 6F 72 74 68 20 56 31 36 30 20 2E 35 4D
-48 7A 20 28 43 29 20 4A 2E 4D 2E 54 68 6F 6F 72
-65 6E 73 20 44 49 34 44 30 FF 84 47 2A 45 30 47
-60 49 0B 62 79 74 65 73 20 66 72 65 65 20 1A 4D
-16 52 04 57 41 52 4D 00 30 40 48 52 0C 50 04 43
-4F 4C 44 00 B2 40 04 A5 20 01 B2 40 88 5A 5C 01
-92 D3 04 02 B2 40 FE FF 02 02 A2 83 06 02 B2 D0
-00 42 24 02 B2 D3 26 02 B2 40 FF BF 22 02 F2 43
-22 03 F2 D3 26 03 F2 40 A5 00 61 01 82 43 62 01
-B2 40 11 01 66 01 29 42 B2 40 33 00 64 01 D2 43
-61 01 92 D2 9E 01 08 18 A2 93 08 18 01 24 59 07
-38 40 C2 A2 18 83 FE 23 19 83 FA 23 B2 D2 B0 01
-F2 D0 10 00 2A 03 F2 C0 40 00 A1 04 3A 40 BA 52
-39 40 CC FF 89 4A 00 00 29 53 FC 23 92 42 02 18
-F0 FF B2 40 18 00 0A 18 31 40 E0 1C 3F 40 80 1C
-37 40 00 44 36 40 B4 44 35 40 08 44 34 40 14 44
-B2 40 0A 00 DA 1D B2 43 AC 1D 92 C3 30 01 18 42
-08 18 D2 B3 01 02 04 20 38 E3 18 53 82 48 08 18
-B2 40 81 00 C0 05 A2 42 C6 05 B2 40 00 49 C8 05
-F2 D0 03 00 0D 02 92 C3 C0 05 92 D3 DA 05 3D 40
-B8 53 18 42 08 18 38 90 0A 00 38 27 38 90 16 00
-35 2F 28 93 0B 23 F3 26 A8 52 84 12 3A 51 06 5A
-B2 5A BA 59 06 5B 80 59 3A 5A 84 56 00 00 76 59
-26 5A D8 59 16 5A 94 57 00 00 00 00 18 5B 66 51
-40 52 85 48 49 32 4C 4F 87 12 84 47 D2 4F 96 4B
-A2 4E 68 51 BA 53 2A 44 AE 52 04 43 4F 44 45 00
-B0 12 B4 4D A2 82 C4 1D 87 12 E2 4E BC 45 F2 53
-00 00 07 45 4E 44 43 4F 44 45 87 12 76 51 02 4E
-2A 44 38 50 03 41 53 4D 92 42 C8 1D B8 1D B2 40
-BE 53 C8 1D E5 3F 12 54 06 45 4E 44 41 53 4D 00
-92 42 B8 1D C8 1D E9 3F 00 00 05 43 4F 4C 4F 4E
-1A 42 C4 1D BA 40 87 12 00 00 A2 53 C4 1D B2 43
-B6 1D 30 40 76 51 00 00 05 4C 4F 32 48 49 1A 42
-C4 1D BA 40 B0 12 00 00 BA 40 2A 44 02 00 A2 52
-C4 1D ED 3F 38 40 BE 1D 39 48 2A 48 09 5A 1A 52
-C2 1D 09 9A 03 24 7E 9A FC 27 1A 83 0E 4A 2A 88
-82 4A C2 1D 30 4D B0 12 2A 44 BA 49 12 4A 72 45
-C0 45 BC 54 CE 4A C0 45 A6 4D DE 54 BE 54 29 4E
-39 90 86 12 02 20 2E 53 30 41 39 90 85 12 03 20
-1E 4E 02 00 30 41 39 90 84 12 01 20 2E 52 30 41
-19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 40 29 00
-12 12 C2 1D 92 53 C2 1D B0 12 2A 44 BA 49 CE 4A
-C0 45 10 55 06 55 21 53 3E 90 10 00 BB 2D 30 41
-12 55 B2 41 C2 1D 22 D3 30 41 87 12 4C 46 84 54
-22 55 82 43 BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D
-0A 4E 3E 4F FA 90 23 00 00 00 34 20 92 53 C2 1D
-B0 12 A6 54 0E 93 04 20 B2 40 00 03 BC 1D 27 3C
-1E 93 04 20 B2 40 10 03 BC 1D 21 3C 2E 93 04 20
-B2 40 20 03 BC 1D 1B 3C 2E 92 04 20 B2 40 20 02
-BC 1D 15 3C 3E 92 04 20 B2 40 30 02 BC 1D 0F 3C
-3E 93 04 20 B2 40 30 03 BC 1D 09 3C B2 40 30 00
-BC 1D 19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 4F
-3D 41 30 4D FA 90 26 00 00 00 08 20 B2 40 10 02
-BC 1D 92 53 C2 1D 30 12 92 55 75 3F FA 90 40 00
-00 00 1A 20 B2 40 20 00 BC 1D 92 53 C2 1D B0 12
-F0 54 0E 20 B2 50 10 00 BC 1D 3E 40 2B 00 B0 12
-F0 54 32 24 92 92 BE 1D C2 1D 02 24 92 53 C2 1D
-8E 10 82 5E BC 1D D3 3F B0 12 F0 54 F9 23 B2 50
-10 00 BC 1D 3E 40 28 00 B0 12 A6 54 30 12 E2 55
-67 3F 87 12 4C 46 84 54 1A 56 FE 90 26 00 00 00
-3E 40 20 00 04 20 B2 50 82 00 BC 1D C2 3F B0 12
-F0 54 DF 23 B2 50 80 00 BC 1D 3E 40 28 00 B0 12
-A6 54 B0 12 E0 54 D5 23 3D 40 A6 4D 30 4D 44 48
-04 52 45 54 49 00 87 12 34 44 00 13 96 4B 2A 44
-34 44 2C 00 1A 55 12 56 6A 56 2E 4E 1E D2 BC 1D
-19 42 BA 1D 92 3F 68 54 03 4D 4F 56 84 12 60 56
-00 40 78 56 05 4D 4F 56 2E 42 84 12 60 56 40 40
-00 00 03 41 44 44 84 12 60 56 00 50 92 56 05 41
-44 44 2E 42 84 12 60 56 40 50 9E 56 04 41 44 44
-43 00 84 12 60 56 00 60 AC 56 06 41 44 44 43 2E
-42 00 84 12 60 56 40 60 50 56 04 53 55 42 43 00
-84 12 60 56 00 70 CA 56 06 53 55 42 43 2E 42 00
-84 12 60 56 40 70 D8 56 03 53 55 42 84 12 60 56
-00 80 E8 56 05 53 55 42 2E 42 84 12 60 56 40 80
-4A 54 03 43 4D 50 84 12 60 56 00 90 02 57 05 43
-4D 50 2E 42 84 12 60 56 40 90 38 54 04 44 41 44
-44 00 84 12 60 56 00 A0 1C 57 06 44 41 44 44 2E
-42 00 84 12 60 56 40 A0 0E 57 03 42 49 54 84 12
-60 56 00 B0 3A 57 05 42 49 54 2E 42 84 12 60 56
-40 B0 46 57 03 42 49 43 84 12 60 56 00 C0 54 57
-05 42 49 43 2E 42 84 12 60 56 40 C0 60 57 03 42
-49 53 84 12 60 56 00 D0 6E 57 05 42 49 53 2E 42
-84 12 60 56 40 D0 00 00 03 58 4F 52 84 12 60 56
-00 E0 88 57 05 58 4F 52 2E 42 84 12 60 56 40 E0
-BA 56 03 41 4E 44 84 12 60 56 00 F0 A2 57 05 41
-4E 44 2E 42 84 12 60 56 40 F0 4C 46 1A 55 C0 57
-1A 42 BC 1D B2 F0 70 00 BC 1D 8A 10 3A F0 0F 00
-82 DA BC 1D 4A 3F F4 56 03 52 52 43 84 12 BA 57
-00 10 D8 57 05 52 52 43 2E 42 84 12 BA 57 40 10
-E4 57 04 53 57 50 42 00 84 12 BA 57 80 10 F2 57
-03 52 52 41 84 12 BA 57 00 11 00 58 05 52 52 41
-2E 42 84 12 BA 57 40 11 0C 58 03 53 58 54 84 12
-BA 57 80 11 00 00 04 50 55 53 48 00 84 12 BA 57
-00 12 26 58 06 50 55 53 48 2E 42 00 84 12 BA 57
-40 12 7A 57 04 43 41 4C 4C 00 84 12 BA 57 80 12
-34 44 2C 00 1A 55 12 56 5A 58 59 42 BC 1D 5A 42
-BD 1D 82 4A BC 1D BE 90 00 15 00 00 02 20 0A 89
-02 3C 09 8A 0A 49 3A 90 10 00 03 2C 5A 0E A8 3F
-1A 53 0E 4A 87 12 70 47 60 49 0D 6F 75 74 20 6F
-66 20 62 6F 75 6E 64 73 14 4D 34 58 05 50 55 53
-48 4D 84 12 50 58 00 15 9C 58 04 50 4F 50 4D 00
-84 12 50 58 00 17 4C 46 84 54 BC 58 82 43 BC 1D
-92 42 C4 1D BA 1D A2 53 C4 1D 92 53 C2 1D 3E 40
-2C 00 B0 12 2A 44 BA 49 CE 4A C0 45 A6 4D 12 56
-E2 58 0A 4E 3E 4F 1A 83 2A 92 CA 2F 8A 10 5A 06
-6F 3F 1A 58 04 52 52 43 4D 00 84 12 B6 58 50 00
-F4 58 04 52 52 41 4D 00 84 12 B6 58 50 01 02 59
-04 52 4C 41 4D 00 84 12 B6 58 50 02 10 59 04 52
-52 55 4D 00 84 12 B6 58 50 03 85 12 00 3C 1E 59
-03 53 3E 3D 85 12 00 38 30 59 02 53 3C 00 85 12
-00 34 AA 58 03 30 3E 3D 85 12 00 30 44 59 02 30
-3C 00 85 12 00 30 00 00 02 55 3C 00 85 12 00 2C
-58 59 03 55 3E 3D 85 12 00 28 4E 59 03 30 3C 3E
-85 12 00 24 6C 59 02 30 3D 00 85 12 00 20 50 48
-02 49 46 00 1A 42 C4 1D 8A 4E 00 00 A2 53 C4 1D
-0E 4A 30 4D 62 59 04 54 48 45 4E 00 1A 42 C4 1D
-08 4E 3E 4F 09 48 29 53 0A 89 0A 11 3A 90 00 02
-68 2F 88 DA 00 00 30 4D 2A 57 04 45 4C 53 45 00
-1A 42 C4 1D BA 40 00 3C 00 00 A2 53 C4 1D 2F 83
-8F 4A 00 00 E3 3F 96 59 05 55 4E 54 49 4C 3A 4F
-08 4E 3E 4F 19 42 C4 1D 2A 83 0A 89 0A 11 3A 90
-00 FE 47 3B 3A F0 FF 03 08 DA 89 48 00 00 A2 53
-C4 1D 30 4D AE 57 05 41 47 41 49 4E 87 12 2A 59
-DE 59 2A 44 00 00 05 57 48 49 4C 45 87 12 84 59
-6E 44 2A 44 3A 59 06 52 45 50 45 41 54 00 87 12
-2A 59 DE 59 9C 59 2A 44 00 00 03 4A 4D 50 87 12
-98 4D 2A 59 DE 59 2A 44 3E B0 00 10 03 20 3E E0
-00 04 30 4D 3E 90 00 34 06 28 03 24 3E 40 00 34
-30 4D 3E 40 00 38 30 4D 00 00 04 3F 4A 4D 50 00
-87 12 48 5A 98 4D 6E 44 DE 59 2A 44 7E 5A 3D 41
-08 4E 3E 4F 2A 48 0A 93 04 20 98 42 C4 1D 00 00
-30 4D 88 43 00 00 A4 3F 44 58 03 42 57 31 84 12
-7C 5A 00 00 9A 5A 03 42 57 32 84 12 7C 5A 00 00
-A6 5A 03 42 57 33 84 12 7C 5A 00 00 BE 5A 3D 41
-1A 42 C4 1D 28 4E 08 93 08 20 BA 4F 00 00 A2 53
-C4 1D 8E 4A 00 00 3E 4F 30 4D 8E 43 00 00 61 3F
-00 00 03 46 57 31 84 12 BC 5A 00 00 E2 5A 03 46
-57 32 84 12 BC 5A 00 00 EE 5A 03 46 57 33 84 12
-BC 5A 00 00 FA 5A 04 47 4F 54 4F 00 87 12 2A 59
-98 4D 8C 4B 2A 44 6A 5A 05 3F 47 4F 54 4F 87 12
-48 5A 98 4D 8C 4B 2A 44
-@FFCC
-BA 52 BA 52 BA 52 BA 52 BA 52 BA 52 BA 52 BA 52
-BA 52 BA 52 BA 52 BA 52 BA 52 BA 52 BA 52 BA 52
-BA 52 BA 52 5E 48 BA 52 BA 52 BA 52 BA 52 BA 52
-BA 52 BA 52
-q
@1800
-10 00 6A 48 80 3E 00 24 FD FF 18 00 48 5B FE 53
-2A 48 3C 48 00 00 00 00
+10 00 92 48 80 3E 00 24 05 00 18 00 B6 5C 6E 55
+52 48 64 48 00 00 00 00
@1DAA
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 44
03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
44 55 50 00 0E 93 F6 23 30 4D 40 44 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 44 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E 44 02 3E 52 00 0E 12 3E 4F 30 4D 8E 44
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 44
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C 44 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 44 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 45
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 44 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA 44 03 41 4E 44 3E FF 30 4D 7A 44 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E 45 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 45 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E 45 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 45 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 44 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
+50 00 3E 4F 30 4D 00 00 03 4E 49 50 2F 53 30 4D
+00 00 04 53 57 41 50 00 2A 4F 8F 4E 00 00 0E 4A
+30 4D 68 44 04 4F 56 45 52 00 8F 4E FE FF 2E 4F
+2F 83 30 4D 72 44 03 52 4F 54 2A 4F 8F 4E 00 00
+1E 4F 02 00 8F 4A 02 00 30 4D 4E 44 02 3E 52 00
+0E 12 3E 4F 30 4D 96 44 02 52 3E 00 2F 83 8F 4E
+00 00 3E 41 30 4D B8 44 02 52 40 00 2F 83 8F 4E
+00 00 2E 41 30 4D 5C 44 05 44 45 50 54 48 8F 4E
+FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D 00 00
+01 40 2E 4E 30 4D F0 44 01 21 BE 4F 00 00 3E 4F
+30 4D 00 00 02 43 40 00 6E 4E 30 4D 04 45 02 43
+21 00 FE 4F 00 00 1F 53 3E 4F 30 4D 00 00 01 2B
+3E 5F 30 4D 30 44 01 2D 3E 8F 3E E3 1E 53 30 4D
+F8 44 03 41 4E 44 3E FF 30 4D 84 44 02 4F 52 00
+3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D 3C 45
+06 4E 45 47 41 54 45 00 E8 3F 32 45 03 41 42 53
+0E 93 E3 33 30 4D D8 44 04 44 41 42 53 00 3E F3
+06 34 BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D
+00 00 02 30 3D 00 1E 83 0E 7E 30 4D 82 45 02 30
+3C 00 0E 5E 0E 7E 3E E3 30 4D 8E 45 02 30 3E 00
+1E 93 05 34 0B 3C 00 00 01 3D 3E 8F 07 20 3E 43
+30 4D A8 45 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
+AC 44 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE 45 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 45 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 45 03 3E 49 4E 85 12 C2 1D 10 45
-04 42 41 53 45 00 85 12 DA 1D C0 44 05 53 54 41
-54 45 85 12 B6 1D 30 46 02 42 4C 00 85 12 20 00
-94 45 02 3C 23 00 B2 40 AA 1D AA 1D 30 4D 1E 15
-0E 43 3D 40 20 00 0A 93 04 20 0D 11 0A 4C 0C 43
-09 43 0E 9B 01 28 0E 8B 09 69 08 68 1D 83 07 30
-0C 5C 0A 6A 0E 6E F5 2B 0E 8B 12 D3 F5 3F 0A 4E
-1D 17 30 41 48 46 01 23 1B 42 DA 1D 2C 4F 0A 4E
-B0 12 5E 46 8F 49 00 00 0E 48 7A 90 0A 00 02 28
-3A 50 07 00 3A 50 30 00 92 83 AA 1D 18 42 AA 1D
-C8 4A 00 00 30 4D 96 46 02 23 53 00 87 12 98 46
-D2 46 2D 83 09 93 E0 23 0E 93 DE 23 3D 41 30 4D
-C8 46 02 23 3E 00 9F 42 AA 1D 00 00 3E 40 AA 1D
-2E 8F 30 4D 00 46 04 48 4F 4C 44 00 0A 4E 3E 4F
-DB 3F 3C 46 04 53 49 47 4E 00 0E 93 3E 4F 3A 40
-2D 00 D2 33 30 4D F4 45 03 55 44 2E 87 12 56 46
-CC 46 E6 46 50 49 18 49 2A 44 18 47 02 55 2E 00
-2F 83 8F 4E 00 00 0E 43 F1 3F 3E B0 00 80 06 24
-BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D DA 44
-02 44 2E 00 87 12 56 46 6E 44 80 44 3A 47 CC 46
-92 44 0A 47 E6 46 50 49 18 49 2A 44 52 45 01 2E
-3E B0 00 80 DD 27 2F 83 3E 43 EC 3F F6 46 04 48
-45 52 45 00 2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D
-62 45 05 41 4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D
-E2 46 02 43 2C 00 1A 42 C4 1D CA 4E 00 00 92 53
-C4 1D 3E 4F 30 4D 2F 83 8F 4E 00 00 B0 12 2A 48
-92 B3 DC 05 FD 27 1E 42 CC 05 B0 12 3C 48 30 4D
-30 40 B6 47 7E 47 05 28 4B 45 59 29 18 42 CC 05
-EA 3F 12 46 03 4B 45 59 30 40 DC 47 92 47 06 41
-43 43 45 50 54 00 3C 40 A8 48 3B 40 72 48 2D 15
-0A 4E 2E 4F 0A 5E 3B 40 0D 00 3C 40 20 00 3D 40
-9C 48 92 B3 DC 05 05 24 18 42 CC 05 38 90 0A 00
-04 20 21 53 39 40 56 48 4D 15 B2 40 11 00 CE 05
-A2 B3 DC 05 FD 27 E2 C3 23 02 30 41 B2 40 13 00
-CE 05 A2 B3 DC 05 FD 27 E2 D3 23 02 30 41 00 00
-05 53 4C 45 45 50 30 40 64 48 00 00 07 28 53 4C
-45 45 50 29 12 D2 0A 18 F6 3F 21 52 3A 17 58 42
-CC 05 48 9B E3 27 48 9C 06 2C 78 92 11 20 2E 9F
-0F 24 1E 83 05 3C 0E 9A 03 24 CE 48 00 00 1E 53
-82 48 CE 05 A2 B3 DC 05 FD 27 30 4D 9E 48 2D 83
-92 B3 DC 05 FD 27 E3 23 B2 40 18 00 0A 18 3E 8F
-3D 41 30 4D D6 47 06 28 45 4D 49 54 29 00 08 4E
-3E 4F E6 3F 50 47 04 45 4D 49 54 00 30 40 BE 48
-C6 48 04 45 43 48 4F 00 B2 40 82 48 90 48 30 4D
-6E 47 06 4E 4F 45 43 48 4F 00 B2 40 30 4D 90 48
-30 4D B6 48 04 28 43 52 29 00 2F 83 8F 4E 00 00
-3E 40 0D 00 E3 3F A2 47 02 43 52 00 30 40 FA 48
-04 47 05 53 50 41 43 45 2F 83 8F 4E 00 00 3E 40
-20 00 D4 3F 12 49 06 53 50 41 43 45 53 00 0E 93
-09 24 0D 12 3D 40 3A 49 EF 3F 3C 49 2D 83 1E 83
-EB 23 3D 41 3E 4F 30 4D 2C 47 04 54 59 50 45 00
-0E 93 95 24 2A 4F 8F 5E 00 00 0E 4A 87 12 CA 45
-02 46 0A 45 CC 48 EC 45 60 49 2A 44 2F 82 8F 4E
-02 00 7E 4D 8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D
-26 49 82 53 22 00 87 12 34 44 6C 49 A2 4B 34 44
-22 00 C6 49 96 49 3D 41 6E 4E 1E 83 82 5E C4 1D
-3E 4F 92 B3 C4 1D A2 63 C4 1D 30 4D E2 48 82 2E
-22 00 87 12 86 49 34 44 50 49 A2 4B 2A 44 00 00
-04 57 4F 52 44 00 3C 40 BE 1D 39 4C 3A 4C 09 5A
-3A 5C 28 4C 09 9A 19 24 7E 9A FC 27 1A 83 3B 40
-60 00 C8 4C 00 00 09 9A 0C 24 7C 4A 4E 9C 09 24
-18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F 7C 80 20 00
-F0 3F 1A 82 C0 1D 82 4A C2 1D 1E 42 C4 1D 08 8E
-CE 48 00 00 30 4D 00 00 04 46 49 4E 44 00 2F 83
-0C 4E 65 4C 74 40 80 00 3B 40 CA 1D 3E 4B 0E 93
-1E 24 58 4C 01 00 78 F0 1E 00 0E 58 2E 53 1E 4E
-FE FF 0E 93 F3 27 09 4E 78 49 48 C4 48 95 F7 23
-0A 4C 1A 53 FA 99 00 00 F2 23 58 83 FA 23 19 B3
-09 63 0C 49 6A 4E 1E 43 4A 93 01 30 2E 83 8F 4C
-00 00 35 40 08 44 34 40 14 44 30 4D 2F 53 2F 53
-3E 4F 30 4D 26 46 07 3E 4E 55 4D 42 45 52 3C 4F
-38 4F 29 4F 2F 82 1B 42 DA 1D 6A 4C 7A 80 30 00
-7A 90 0A 00 02 28 7A 80 07 00 0A 9B 13 2C 82 49
-D0 04 82 48 D2 04 82 4B C8 04 19 42 E4 04 18 42
-E6 04 09 5A 08 63 1C 53 1E 83 E7 23 8F 49 04 00
-8F 48 02 00 8F 4C 00 00 30 4D 03 12 0D 12 1B 42
-DA 1D 0B 12 32 C0 00 02 6D 4E 0D 5E 0C 4E 7A 40
-2E 00 0D 9C 0A 28 7A 9C FC 23 32 D0 00 02 FC 4C
-FE FF 0D 9C FC 2F DE 83 00 00 09 43 08 43 3D 40
-50 4B 3F 82 8F 4E 06 00 0C 4E 7E 4C 6A 4C 7A 90
-2D 00 10 2C 3B 40 10 00 7A 80 24 00 06 24 2B 43
-5A 83 03 24 3B 52 6A 53 B0 23 1C 53 1E 83 6A 4C
-7A 90 2D 00 AA 23 1C 53 1E 83 B1 43 04 00 A5 3F
-52 4B 2F 53 0E 93 2C 17 82 4C DA 1D 03 24 2F 52
-0E F3 30 4D 9F 4F 02 00 04 00 BF 4F 00 00 3E E3
-09 20 3E E3 BF E3 02 00 BF E3 00 00 9F 53 02 00
-8F 63 00 00 32 B0 00 02 01 20 2F 53 30 4D D2 48
-07 45 58 45 43 55 54 45 0A 4E 3E 4F 00 4A 28 45
-01 2C 1A 42 C4 1D A2 53 C4 1D 8A 4E 00 00 3E 4F
-30 4D A0 4B 87 4C 49 54 45 52 41 4C 82 93 B6 1D
-16 24 32 B0 00 02 09 24 1A 42 C4 1D A2 52 C4 1D
-BA 40 34 44 00 00 BA 4F 02 00 1A 42 C4 1D A2 52
-C4 1D BA 40 34 44 00 00 8A 4E 02 00 3E 4F 30 4D
-08 49 05 43 4F 55 4E 54 2F 83 1E 53 8F 4E 00 00
-5E 4E FF FF 30 4D 82 4E BE 1D B2 4F C0 1D 3E 4F
-82 43 C2 1D 87 12 4C 46 C6 49 1C 4C 3D 40 28 4C
-FE 22 3D 41 3E 4F 30 4D 2A 4C 0A 4E 3E 4F 3D 40
-40 4C 53 27 3D 40 16 4C 1A E2 B6 1D B2 27 AC 23
-42 4C 3E 4F 3D 40 16 4C B9 23 DE 53 00 00 68 4E
-08 5E F8 40 3F 00 00 00 3D 40 0C 4E CD 3F 90 4B
-08 45 56 41 4C 55 41 54 45 00 39 40 BE 1D 39 12
-39 12 39 12 0D 12 B0 12 2A 44 06 4C 7E 4C 3D 41
-B2 41 C2 1D B2 41 C0 1D B2 41 BE 1D 30 4D 7A 45
-04 51 55 49 54 00 31 40 E0 1C B2 40 00 1C 00 1C
-82 43 B6 1D 82 43 08 18 B0 12 2A 44 6C 49 04 0D
-6F 6B 20 00 50 49 34 44 38 1D 44 44 34 44 50 00
-F6 47 18 49 06 4C 34 44 7E 1C CE 44 B2 45 6C 49
-0D 73 74 61 63 6B 20 65 6D 70 74 79 20 21 1A 4D
-34 44 30 FF 84 47 B2 45 6C 49 0B 46 52 41 4D 20
-66 75 6C 6C 20 21 1A 4D 42 46 F4 44 C0 45 AC 4C
-6C 49 04 0D 20 20 20 00 BC 45 B4 4C EE 47 05 41
-42 4F 52 54 3F 40 80 1C BE 3F 8F 93 02 00 AE 26
-B2 40 82 48 90 48 B0 12 0C 52 82 43 C2 5A 82 43
-CE 5A 82 43 DA 5A 82 43 0A 5B 82 43 16 5B 82 43
-22 5B A2 B3 DC 05 FD 27 B2 40 11 00 CE 05 E2 C3
-23 02 92 C3 DC 05 38 40 A0 AA 39 42 19 83 FE 23
-18 83 FB 23 92 B3 DC 05 F4 23 87 12 6C 49 04 1B
-5B 37 6D 00 50 49 50 49 6C 49 04 1B 5B 30 6D 00
-50 49 4E 51 90 51 96 51 14 4D 0E 4D 86 41 42 4F
-52 54 22 00 87 12 86 49 34 44 1A 4D A2 4B 2A 44
-18 4A 01 27 87 12 4C 46 C6 49 1E 4A C0 45 B2 4D
-2A 44 4A 4C 52 46 81 5C 92 42 BE 1D C2 1D 30 4D
-87 12 A2 49 4C 46 C6 49 CA 4D 08 4E 7A 4E 5A D3
-5A 53 0A 58 19 42 C8 1D 6E 4E 3E F0 1E 00 09 5E
-82 48 AE 1D 82 49 B0 1D 82 4A B2 1D 2A 52 82 4A
-C4 1D 3E 4F 3D 41 30 41 87 12 6C 49 0F 73 74 61
-63 6B 20 6D 69 73 6D 61 74 63 68 21 20 4D 82 9F
-B4 1D F2 23 18 42 AE 1D 19 42 B0 1D A8 49 FE FF
-89 48 00 00 30 4D C0 49 08 56 41 52 49 41 42 4C
-45 00 B0 12 C0 4D BA 40 86 12 FC FF EF 3F F2 4B
-08 43 4F 4E 53 54 41 4E 54 00 B0 12 C0 4D BA 40
-85 12 FC FF 8A 4E FE FF 3E 4F E0 3F 40 4E 06 43
-52 45 41 54 45 00 B0 12 C0 4D BA 40 85 12 FC FF
-8A 4A FE FF D3 3F 60 4C 05 44 4F 45 53 3E 1A 42
-B2 1D BA 40 84 12 00 00 8A 4D 02 00 3D 41 30 4D
-78 4E 05 44 45 46 45 52 B0 12 C0 4D BA 40 30 40
-FC FF BA 40 8E 4E FE FF B9 3F 00 00 81 5B 82 43
-B6 1D 30 4D B6 4D 01 5D B2 43 B6 1D 30 4D 82 49
-87 52 45 43 55 52 53 45 19 42 C4 1D 99 42 B2 1D
-00 00 A2 53 C4 1D 30 4D AC 4E 01 3A B0 12 C0 4D
-BA 40 87 12 FC FF A2 83 C4 1D B2 43 B6 1D 82 4F
-B4 1D 30 4D DA 4E 81 3B 82 93 B6 1D 5D 27 87 12
-34 44 2A 44 A2 4B 0E 4E AE 4E 2A 44 F4 48 09 49
+0E 93 3E 4F FB 27 2D 53 30 4D 1E 83 0E 7E F9 3F
+39 40 00 80 39 8F 08 4E 3E 4F 08 59 19 15 30 4D
+81 5E 00 00 3E 4F 32 B0 00 01 E8 27 2D 53 21 52
+30 4D 91 53 00 00 F7 3F CE 45 06 55 4E 4C 4F 4F
+50 00 F5 3F 00 00 01 49 2F 83 8F 4E 00 00 2E 41
+1E 81 02 00 30 4D 1E 45 01 4A 2F 83 8F 4E 00 00
+1E 41 04 00 1E 81 06 00 30 4D 9C 45 03 50 41 44
+85 12 E2 1C 1A 46 03 54 49 42 85 12 38 1D 0E 45
+03 43 50 4C 85 12 50 00 C2 45 03 3E 49 4E 85 12
+C2 1D 60 46 04 42 41 53 45 00 85 12 DA 1D C8 44
+05 53 54 41 54 45 85 12 B6 1D 74 46 02 42 4C 00
+85 12 20 00 B4 45 02 3C 23 00 B2 40 AA 1D AA 1D
+30 4D 8C 46 01 23 2C 4F 5B 42 DA 1D 0A 43 34 40
+20 00 0E 93 04 20 04 11 0E 4C 0C 43 09 43 0A 9B
+01 28 0A 8B 09 69 08 68 14 83 07 30 0C 5C 0E 6E
+0A 6A F5 2B 0A 8B 12 D3 F5 3F 34 40 14 44 8F 49
+00 00 0E 48 7A 90 0A 00 02 28 3A 50 07 00 3A 50
+30 00 92 83 AA 1D 18 42 AA 1D C8 4A 00 00 30 4D
+A4 46 02 23 53 00 87 12 A6 46 0C 47 2D 83 09 93
+CA 23 0E 93 C8 23 3D 41 30 4D 02 47 02 23 3E 00
+9F 42 AA 1D 00 00 3E 40 AA 1D 2E 8F 30 4D 26 46
+04 48 4F 4C 44 00 0A 4E 3E 4F DB 3F 80 46 04 53
+49 47 4E 00 0E 93 3E 4F 3A 40 2D 00 D2 33 30 4D
+56 46 02 55 2E 00 87 12 9A 46 34 44 00 00 06 47
+20 47 78 49 40 49 2A 44 68 45 02 44 2E 00 87 12
+9A 46 78 44 8A 44 6E 45 06 47 9A 44 44 47 20 47
+78 49 40 49 2A 44 50 45 01 2E 0E 93 E4 37 2F 83
+8F 4E 00 00 3E 43 EB 3F 30 47 04 48 45 52 45 00
+2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D 5C 45 05 41
+4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D 1C 47 02 43
+2C 00 1A 42 C4 1D CA 4E 00 00 92 53 C4 1D 3E 4F
+30 4D 2F 83 8F 4E 00 00 B0 12 52 48 92 B3 DC 05
+FD 27 1E 42 CC 05 B0 12 64 48 30 4D 9A 47 05 28
+4B 45 59 29 18 42 CC 05 EC 3F 38 46 03 4B 45 59
+30 40 F4 47 AE 47 06 41 43 43 45 50 54 00 30 40
+1E 48 EE 47 08 28 41 43 43 45 50 54 29 00 3C 40
+D0 48 3B 40 9A 48 2D 15 0A 4E 2E 4F 0A 5E 3B 40
+0D 00 3C 40 20 00 3D 40 C4 48 92 B3 DC 05 05 24
+18 42 CC 05 38 90 0A 00 04 20 21 53 39 40 7E 48
+4D 15 B2 40 11 00 CE 05 E2 C3 23 02 A2 B3 DC 05
+FD 27 30 41 B2 40 13 00 CE 05 E2 D3 23 02 A2 B3
+DC 05 FD 27 30 41 00 00 05 53 4C 45 45 50 30 40
+8C 48 00 00 07 28 53 4C 45 45 50 29 12 D2 0A 18
+F6 3F 21 52 3A 17 58 42 CC 05 48 9B E3 27 48 9C
+06 2C 78 92 11 20 2E 9F 0F 24 1E 83 05 3C 0E 9A
+03 24 CE 48 00 00 1E 53 82 48 CE 05 A2 B3 DC 05
+FD 27 30 4D C6 48 2D 83 92 B3 DC 05 FD 27 E3 23
+B2 40 18 00 0A 18 3E 8F 3D 41 30 4D 14 48 06 28
+45 4D 49 54 29 00 08 4E 3E 4F E6 3F 6A 47 04 45
+4D 49 54 00 30 40 E6 48 EE 48 04 45 43 48 4F 00
+B2 40 82 48 B8 48 30 4D 88 47 06 4E 4F 45 43 48
+4F 00 B2 40 30 4D B8 48 30 4D DE 48 04 28 43 52
+29 00 2F 83 8F 4E 00 00 3E 40 0D 00 E3 3F BE 47
+02 43 52 00 30 40 22 49 3E 47 05 53 50 41 43 45
+2F 83 8F 4E 00 00 3E 40 20 00 D4 3F 3A 49 06 53
+50 41 43 45 53 00 0E 93 09 24 0D 12 3D 40 62 49
+EF 3F 64 49 2D 83 1E 83 EB 23 3D 41 3E 4F 30 4D
+52 47 04 54 59 50 45 00 0E 93 95 24 2A 4F 8F 5E
+00 00 0E 4A 87 12 F0 45 28 46 08 45 F4 48 12 46
+88 49 2A 44 2F 82 8F 4E 02 00 7E 4D 8F 4D 00 00
+0D 5E 1D B3 0D 63 30 4D 4E 49 82 53 22 00 87 12
+34 44 94 49 CA 4B 34 44 22 00 EE 49 BE 49 3D 41
+6E 4E 1E 83 82 5E C4 1D 3E 4F 92 B3 C4 1D A2 63
+C4 1D 30 4D 0A 49 82 2E 22 00 87 12 AE 49 34 44
+78 49 CA 4B 2A 44 00 00 04 57 4F 52 44 00 3C 40
+BE 1D 39 4C 3A 4C 09 5A 3A 5C 28 4C 09 9A 19 24
+7E 9A FC 27 1A 83 3B 40 60 00 C8 4C 00 00 09 9A
+0C 24 7C 4A 4E 9C 09 24 18 53 4B 9C F6 2F 7C 90
+7B 00 F3 2F 7C 80 20 00 F0 3F 1A 82 C0 1D 82 4A
+C2 1D 1E 42 C4 1D 08 8E CE 48 00 00 30 4D 00 00
+04 46 49 4E 44 00 2F 83 0C 4E 65 4C 74 40 80 00
+3B 40 CA 1D 3E 4B 0E 93 1E 24 58 4C 01 00 78 F0
+1E 00 0E 58 2E 53 1E 4E FE FF 0E 93 F3 27 09 4E
+78 49 48 C4 48 95 F7 23 0A 4C 1A 53 FA 99 00 00
+F2 23 58 83 FA 23 19 B3 09 63 0C 49 6A 4E 1E 43
+4A 93 01 30 2E 83 8F 4C 00 00 35 40 08 44 34 40
+14 44 30 4D 2F 53 2F 53 3E 4F 30 4D 6A 46 07 3E
+4E 55 4D 42 45 52 3C 4F 38 4F 29 4F 2F 82 1B 42
+DA 1D 6A 4C 7A 80 30 00 7A 90 0A 00 02 28 7A 80
+07 00 0A 9B 13 2C 82 49 D0 04 82 48 D2 04 82 4B
+C8 04 19 42 E4 04 18 42 E6 04 09 5A 08 63 1C 53
+1E 83 E7 23 8F 49 04 00 8F 48 02 00 8F 4C 00 00
+30 4D 03 12 0D 12 1B 42 DA 1D 0B 12 32 C0 00 02
+6D 4E 0D 5E 0C 4E 7A 40 2E 00 0D 9C 0A 28 7A 9C
+FC 23 32 D0 00 02 FC 4C FE FF 0D 9C FC 2F DE 83
+00 00 09 43 08 43 3D 40 78 4B 3F 82 8F 4E 06 00
+0C 4E 7E 4C 6A 4C 7A 90 2D 00 10 2C 3B 40 10 00
+7A 80 24 00 06 24 2B 43 5A 83 03 24 3B 52 6A 53
+B0 23 1C 53 1E 83 6A 4C 7A 90 2D 00 AA 23 1C 53
+1E 83 B1 43 04 00 A5 3F 7A 4B 2F 53 0E 93 2C 17
+82 4C DA 1D 03 24 2F 52 0E F3 30 4D 9F 4F 02 00
+04 00 BF 4F 00 00 3E E3 09 20 3E E3 BF E3 02 00
+BF E3 00 00 9F 53 02 00 8F 63 00 00 32 B0 00 02
+01 20 2F 53 30 4D FA 48 07 45 58 45 43 55 54 45
+0A 4E 3E 4F 00 4A 26 45 01 2C 1A 42 C4 1D A2 53
+C4 1D 8A 4E 00 00 3E 4F 30 4D C8 4B 87 4C 49 54
+45 52 41 4C 82 93 B6 1D 0F 24 1A 42 C4 1D A2 52
+C4 1D BA 40 34 44 00 00 8A 4E 02 00 3E 4F 32 B0
+00 02 32 C0 00 02 F1 23 30 4D 30 49 05 43 4F 55
+4E 54 2F 83 1E 53 8F 4E 00 00 5E 4E FF FF 30 4D
+82 4E BE 1D B2 4F C0 1D 3E 4F 82 43 C2 1D 87 12
+90 46 EE 49 36 4C 3D 40 42 4C 05 23 3D 41 3E 4F
+30 4D 44 4C 0A 4E 3E 4F 3D 40 5A 4C 5A 27 3D 40
+30 4C 1A E2 B6 1D B9 27 B3 23 5C 4C 3E 4F 3D 40
+30 4C C0 23 DE 53 00 00 68 4E 08 5E F8 40 3F 00
+00 00 3D 40 88 4E CD 3F B8 4B 08 45 56 41 4C 55
+41 54 45 00 39 40 BE 1D 3C 49 3B 49 3A 49 3D 15
+B0 12 2A 44 20 4C 98 4C B2 41 C2 1D B2 41 C0 1D
+B2 41 BE 1D 3D 41 30 4D 4C 46 04 51 55 49 54 00
+31 40 E0 1C B2 40 00 1C 00 1C 82 43 B6 1D 82 43
+08 18 B0 12 2A 44 94 49 03 0D 6F 6B 78 49 40 49
+5A 46 44 44 64 46 0E 48 40 49 20 4C DE 44 92 45
+94 49 0D 73 74 61 63 6B 20 65 6D 70 74 79 21 20
+2A 4D 34 44 30 FF A0 47 D2 45 94 49 0B 46 52 41
+4D 20 66 75 6C 6C 21 20 2A 4D 86 46 F2 44 E0 45
+C6 4C 94 49 03 0D 20 20 DC 45 CC 4C 06 48 05 41
+42 4F 52 54 3F 40 80 1C C3 3F 8F 93 02 00 BA 26
+B2 40 82 48 B8 48 B0 12 3C 52 A2 B3 DC 05 FD 27
+B2 40 11 00 CE 05 E2 C3 23 02 92 C3 DC 05 38 40
+A0 AA 39 42 03 43 19 83 FD 23 18 83 FA 23 92 B3
+DC 05 F3 23 87 12 94 49 04 1B 5B 37 6D 00 78 49
+78 49 94 49 04 1B 5B 30 6D 00 78 49 4A 51 8C 51
+92 51 DA 51 24 4D 1E 4D 86 41 42 4F 52 54 22 00
+87 12 AE 49 34 44 2A 4D CA 4B 2A 44 40 4A 01 27
+87 12 90 46 EE 49 46 4A E0 45 AE 4D 2A 44 64 4C
+96 46 81 5C 92 42 BE 1D C2 1D 30 4D 00 00 81 5B
+82 43 B6 1D 30 4D B2 4D 01 5D B2 43 B6 1D 30 4D
+BE 4D 83 5B 27 5D 87 12 A0 4D 34 44 34 44 CA 4B
+CA 4B 2A 44 BE 4F 02 00 3E 4F 30 4D 1C 49 82 49
+53 00 87 12 86 46 F2 44 E0 45 06 4E D6 4D 34 44
+E4 4D CA 4B 2A 44 A0 4D E4 4D 2A 44 EE 4D 09 49
4D 4D 45 44 49 41 54 45 1A 42 AE 1D FA D0 80 00
-00 00 30 4D BE 4F 02 00 3E 4F 30 4D 0E 4F 82 49
-53 00 87 12 42 46 F4 44 C0 45 46 4F 52 4F 34 44
-24 4F A2 4B 2A 44 A4 4D 24 4F 2A 44 F6 4E 83 5B
-27 5D 87 12 A4 4D 34 44 34 44 A2 4B A2 4B 2A 44
-90 4C 88 50 4F 53 54 50 4F 4E 45 00 87 12 4C 46
-C6 49 1E 4A 54 44 C0 45 B2 4D 7E 45 C0 45 8C 4F
-34 44 34 44 A2 4B A2 4B 34 44 A2 4B A2 4B 2A 44
-92 4F 3A 4E 82 4A C6 1D 2E 4E 82 4E C4 1D 3D 40
-10 00 09 4A 08 49 29 83 18 48 FE FF 0E 98 FC 2B
-89 48 00 00 1D 83 F6 23 2A 4A 0A 93 F0 23 3E 4F
-3D 41 30 4D 2E 4F 82 49 46 00 2F 83 8F 4E 00 00
-1E 42 C4 1D BE 40 C0 45 00 00 A2 52 C4 1D 2E 53
-30 4D 92 4E 84 45 4C 53 45 00 1A 42 C4 1D BA 40
-BC 45 00 00 2A 52 82 4A C4 1D 8E 4A 00 00 2A 83
-0E 4A 30 4D 4A 49 84 54 48 45 4E 00 9E 42 C4 1D
-00 00 3E 4F 30 4D 5E 4E 85 42 45 47 49 4E 30 40
-84 47 06 50 85 55 4E 54 49 4C 39 40 C0 45 1A 42
-C4 1D A2 52 C4 1D 8A 49 00 00 8A 4E 02 00 3E 4F
-30 4D 8C 4D 85 41 47 41 49 4E 39 40 BC 45 EF 3F
-28 4E 85 57 48 49 4C 45 87 12 CA 4F 6E 44 2A 44
-C0 4E 86 52 45 50 45 41 54 00 87 12 4A 50 0C 50
-2A 44 E4 4F 82 44 4F 00 2F 83 8F 4E 00 00 1E 42
-C4 1D BE 40 CA 45 00 00 2E 53 82 4E C4 1D A2 53
-00 1C 1A 42 00 1C 8A 43 00 00 30 4D B4 4B 84 4C
-4F 4F 50 00 39 40 EC 45 1A 42 C4 1D A2 52 C4 1D
-8A 49 00 00 8A 4E 02 00 1E 42 00 1C A2 83 00 1C
-2E 4E 0E 93 04 24 9E 42 C4 1D 00 00 F5 3F 3E 4F
-30 4D E4 47 85 2B 4C 4F 4F 50 39 40 DA 45 E4 3F
-9E 50 85 4C 45 41 56 45 1A 42 C4 1D BA 40 FC 45
-00 00 BA 40 BC 45 02 00 B2 50 06 00 C4 1D A2 53
-00 1C 2A 52 19 42 00 1C 89 4A 00 00 30 4D E2 50
-04 4D 4F 56 45 00 0A 4E 38 4F 39 4F 3E 4F 0A 93
-11 24 08 99 0F 24 06 2C F8 49 00 00 18 53 1A 83
-FB 23 30 4D 08 5A 09 5A 19 83 18 83 E8 49 00 00
-1A 83 FA 23 30 4D 34 44 CA 1D FC 44 2A 44 84 12
-46 51 44 54 1A 54 74 50 A2 4D 02 54 D4 50 10 51
-AE 49 B4 51 E8 51 24 50 AE 52 48 45 4E 4F B6 4E
-86 4A 00 00 3A 40 0C 00 39 40 CA 1D 38 40 CC 1D
-D9 3F 3A 40 0E 00 39 40 CC 1D 38 40 CA 1D CC 3F
-82 43 CC 1D 30 4D 92 42 CA 1D C8 1D 30 4D 62 4F
-09 50 57 52 5F 53 54 41 54 45 84 12 90 4F FE 53
-48 5B A0 51 08 50 57 52 5F 48 45 52 45 00 92 42
-C4 1D B0 51 92 42 C6 1D AE 51 EF 3F 62 50 09 52
-53 54 5F 53 54 41 54 45 92 42 0C 18 B0 51 92 42
-0E 18 AE 51 E2 3F CE 51 08 52 53 54 5F 48 45 52
-45 00 92 42 C4 1D 0C 18 92 42 C6 1D 0E 18 DF 3F
-B2 40 54 52 B6 52 B2 40 64 48 58 48 B2 40 BE 48
-CE 48 B2 40 FA 48 0E 49 B2 40 DC 47 EA 47 30 41
-52 50 04 57 49 50 45 00 39 40 80 FF B9 43 00 00
-29 53 39 90 CC FF FA 23 B0 12 00 52 B2 40 48 5B
-C4 1D B2 40 FE 53 C6 1D D4 3F C6 4F 06 28 57 41
-52 4D 29 00 1E 42 08 18 87 12 6C 49 05 0D 1B 5B
-37 6D 50 49 70 47 6C 49 27 20 46 61 73 74 46 6F
-72 74 68 20 56 31 36 30 20 31 36 4D 48 7A 20 28
+00 00 30 4D AA 49 87 52 45 43 55 52 53 45 19 42
+C4 1D 99 42 B2 1D 00 00 A2 53 C4 1D 30 4D AA 4C
+88 50 4F 53 54 50 4F 4E 45 00 87 12 90 46 EE 49
+46 4A 54 44 E0 45 AE 4D 92 45 E0 45 6A 4E 34 44
+34 44 CA 4B CA 4B 34 44 CA 4B CA 4B 2A 44 82 9F
+B4 1D A0 24 87 12 94 49 0F 73 74 61 63 6B 20 6D
+69 73 6D 61 74 63 68 21 30 4D 87 12 CA 49 90 46
+EE 49 94 4E 08 4E 7A 4E 5A D3 5A 53 0A 58 19 42
+C8 1D 6E 4E 3E F0 1E 00 09 5E 82 48 AE 1D 82 49
+B0 1D 82 4A B2 1D 2A 52 82 4A C4 1D 3E 4F 3D 41
+30 41 E8 49 08 56 41 52 49 41 42 4C 45 00 B0 12
+8A 4E BA 40 86 12 FC FF 71 3C 0C 4C 08 43 4F 4E
+53 54 41 4E 54 00 B0 12 8A 4E BA 40 85 12 FC FF
+8A 4E FE FF 3E 4F 62 3C DC 4E 06 43 52 45 41 54
+45 00 B0 12 8A 4E BA 40 85 12 FC FF 8A 4A FE FF
+55 3C 7A 4C 05 44 4F 45 53 3E 1A 42 B2 1D BA 40
+84 12 00 00 8A 4D 02 00 3D 41 30 4D 14 4F 05 44
+45 46 45 52 B0 12 8A 4E BA 40 30 40 FC FF BA 40
+2A 4F FE FF 3B 3C D2 4D 01 3A B0 12 8A 4E BA 40
+87 12 FC FF A2 83 C4 1D B2 43 B6 1D 82 4F B4 1D
+30 4D 48 4F 81 3B 82 93 B6 1D 24 27 87 12 34 44
+2A 44 CA 4B 6E 4E C0 4D 2A 44 7C 4F 3D 41 B2 4E
+0E 18 A2 4E 0C 18 3E 4F 32 3D DC 4B 06 4D 41 52
+4B 45 52 00 B0 12 8A 4E BA 40 84 12 FC FF BA 40
+7A 4F FE FF 9A 42 C6 1D 00 00 28 83 8A 48 02 00
+A2 52 C4 1D 18 42 AE 1D 19 42 B0 1D A8 49 FE FF
+89 48 00 00 30 4D 0E 4E 82 49 46 00 2F 83 8F 4E
+00 00 1E 42 C4 1D A2 52 C4 1D BE 40 E0 45 00 00
+2E 53 30 4D 2E 4F 84 45 4C 53 45 00 A2 52 C4 1D
+1A 42 C4 1D BA 40 DC 45 FC FF 8E 4A 00 00 2A 83
+0E 4A 30 4D 72 49 84 54 48 45 4E 00 9E 42 C4 1D
+00 00 3E 4F 30 4D FA 4E 85 42 45 47 49 4E 30 40
+A0 47 06 50 85 55 4E 54 49 4C 39 40 E0 45 A2 52
+C4 1D 1A 42 C4 1D 8A 49 FC FF 8A 4E FE FF 3E 4F
+30 4D 88 4D 85 41 47 41 49 4E 39 40 DC 45 EF 3F
+C4 4E 85 57 48 49 4C 45 87 12 CC 4F 78 44 2A 44
+26 4E 86 52 45 50 45 41 54 00 87 12 4A 50 0C 50
+2A 44 E6 4F 82 44 4F 00 2F 83 8F 4E 00 00 A2 53
+C4 1D 1E 42 C4 1D BE 40 F0 45 FE FF A2 53 00 1C
+1A 42 00 1C 8A 43 00 00 30 4D 8C 4F 84 4C 4F 4F
+50 00 39 40 12 46 A2 52 C4 1D 1A 42 C4 1D 8A 49
+FC FF 8A 4E FE FF 1E 42 00 1C A2 83 00 1C 2E 4E
+0E 93 03 24 8E 4A 00 00 F6 3F 3E 4F 30 4D FC 47
+85 2B 4C 4F 4F 50 39 40 00 46 E5 3F 9C 50 85 4C
+45 41 56 45 1A 42 C4 1D BA 40 22 46 00 00 BA 40
+DC 45 02 00 B2 50 06 00 C4 1D A2 53 00 1C 2A 52
+19 42 00 1C 89 4A 00 00 30 4D DE 50 04 4D 4F 56
+45 00 0A 4E 38 4F 39 4F 3E 4F 0A 93 11 24 08 99
+0F 24 06 2C F8 49 00 00 18 53 1A 83 FB 23 30 4D
+08 5A 09 5A 19 83 18 83 E8 49 00 00 1A 83 FA 23
+30 4D 34 44 CA 1D FA 44 2A 44 84 12 42 51 B4 55
+8A 55 74 50 9E 4D 72 55 D0 50 0C 51 D6 49 FE 51
+18 52 24 50 1E 54 46 45 A4 53 C8 4D AE 4A 00 00
+3A 40 0E 00 39 40 CA 1D 38 40 CC 1D D9 3F 3A 40
+0E 00 39 40 CC 1D 38 40 CA 1D CC 3F 82 43 CC 1D
+30 4D 92 42 CA 1D C8 1D 30 4D 9C 51 3A 4E 82 4A
+C6 1D 2E 4E 82 4E C4 1D 3D 40 10 00 09 4A 08 49
+29 83 18 48 FE FF 0E 98 FC 2B 89 48 00 00 1D 83
+F6 23 2A 4A 0A 93 F0 23 3E 4F 3D 41 30 4D 40 4E
+09 50 57 52 5F 53 54 41 54 45 84 12 9A 51 6E 55
+B6 5C 62 50 09 52 53 54 5F 53 54 41 54 45 92 42
+0E 18 DE 51 92 42 0C 18 E0 51 EF 3F D0 51 08 50
+57 52 5F 48 45 52 45 00 92 42 C6 1D DE 51 92 42
+C4 1D E0 51 30 4D E4 51 08 52 53 54 5F 48 45 52
+45 00 92 42 C6 1D 0E 18 92 42 C4 1D 0C 18 EC 3F
+B2 40 C4 53 26 54 B2 40 8C 48 80 48 B2 40 E6 48
+F6 48 B2 40 22 49 36 49 B2 40 F4 47 02 48 82 43
+30 5C 82 43 3C 5C 82 43 48 5C 82 43 78 5C 82 43
+84 5C 82 43 90 5C 30 41 52 50 04 57 49 50 45 00
+39 40 80 FF B9 43 00 00 29 53 39 90 CC FF FA 23
+B0 12 30 52 B2 40 B6 5C 0C 18 B2 40 6E 55 0E 18
+AE 3F 18 50 07 43 4F 4D 50 41 52 45 0C 4E 38 4F
+3B 4F 39 4F 0E 4B 0E 5C 0C 24 1B 83 07 30 1C 83
+07 30 19 53 F9 98 FF FF F5 27 02 2C 3E 43 30 4D
+1E 43 30 4D 64 4F 86 5B 54 48 45 4E 5D 00 30 4D
+1E 83 30 4D C6 52 86 5B 45 4C 53 45 5D 00 87 12
+34 44 01 00 90 46 EE 49 12 4C 44 44 E0 45 4C 53
+8A 44 8A 44 94 49 04 5B 49 46 5D 00 9C 52 EA 45
+0A 53 A6 4A 2C 45 DC 45 40 53 8A 44 8A 44 94 49
+06 5B 45 4C 53 45 5D 00 9C 52 EA 45 2E 53 A6 4A
+D0 52 44 44 E0 45 2A 53 2C 45 DC 45 40 53 94 49
+06 5B 54 48 45 4E 5D 00 9C 52 EA 45 40 53 D0 52
+54 44 EA 45 48 53 2A 44 DC 45 E4 52 A6 4A 94 49
+03 0D 6B 6F 78 49 40 49 5A 46 44 44 64 46 0E 48
+62 53 82 43 C2 1D 82 4E BE 1D B2 4F C0 1D 3E 4F
+3D 40 E4 52 30 4D D6 52 84 5B 49 46 5D 00 0E 93
+3E 4F AD 27 30 4D 78 53 8B 5B 55 4E 44 45 46 49
+4E 45 44 5D 87 12 90 46 EE 49 46 4A 6C 44 86 45
+2A 44 88 53 89 5B 44 45 46 49 4E 45 44 5D 87 12
+90 46 EE 49 46 4A 6C 44 2A 44 C8 4F 06 28 57 41
+52 4D 29 00 1E 42 08 18 87 12 94 49 05 0D 1B 5B
+37 6D 78 49 8A 47 94 49 27 20 46 61 73 74 46 6F
+72 74 68 20 56 31 36 32 20 31 36 4D 48 7A 20 28
43 29 20 4A 2E 4D 2E 54 68 6F 6F 72 65 6E 73 20
-50 49 34 44 30 FF 84 47 2A 45 30 47 6C 49 0B 62
-79 74 65 73 20 66 72 65 65 20 26 4D 22 52 04 57
-41 52 4D 00 30 40 54 52 18 50 04 43 4F 4C 44 00
+78 49 34 44 30 FF A0 47 28 45 56 47 94 49 0B 62
+79 74 65 73 20 66 72 65 65 20 36 4D 6A 52 04 57
+41 52 4D 00 30 40 C4 53 94 52 04 43 4F 4C 44 00
B2 40 04 A5 20 01 B2 40 88 5A 5C 01 92 D3 04 02
B2 40 FE FF 02 02 A2 83 06 02 B2 D0 00 42 24 02
B2 D3 26 02 B2 40 FF BF 22 02 F2 43 22 03 F2 D3
66 01 39 40 80 00 B2 40 33 00 64 01 D2 43 61 01
92 D2 9E 01 08 18 A2 93 08 18 01 24 59 07 38 40
C2 A2 18 83 FE 23 19 83 FA 23 B2 D2 B0 01 F2 D0
-10 00 2A 03 F2 C0 40 00 A1 04 3A 40 C6 52 39 40
+10 00 2A 03 F2 C0 40 00 A1 04 3A 40 36 54 39 40
CC FF 89 4A 00 00 29 53 FC 23 92 42 02 18 F0 FF
B2 40 18 00 0A 18 31 40 E0 1C 3F 40 80 1C 37 40
-00 44 36 40 B4 44 35 40 08 44 34 40 14 44 B2 40
+00 44 36 40 BC 44 35 40 08 44 34 40 14 44 B2 40
0A 00 DA 1D B2 43 AC 1D 92 C3 30 01 18 42 08 18
D2 B3 01 02 04 20 38 E3 18 53 82 48 08 18 B2 40
81 00 C0 05 B2 40 11 00 C6 05 B2 40 00 4A C8 05
F2 D0 03 00 0D 02 92 C3 C0 05 92 D3 DA 05 3D 40
-D8 53 18 42 08 18 38 90 0A 00 2E 27 38 90 16 00
-2B 2F 28 93 01 23 E9 26 B4 52 84 12 46 51 26 5A
-D2 5A DA 59 26 5B A0 59 5A 5A A4 56 00 00 96 59
-46 5A F8 59 36 5A B4 57 00 00 00 00 38 5B 72 51
-4C 52 85 48 49 32 4C 4F 87 12 84 47 DE 4F A2 4B
-AE 4E 74 51 DA 53 2A 44 BA 52 04 43 4F 44 45 00
-B0 12 C0 4D A2 82 C4 1D 87 12 EE 4E BC 45 12 54
-00 00 07 45 4E 44 43 4F 44 45 87 12 82 51 0E 4E
+48 55 18 42 08 18 38 90 0A 00 9A 26 38 90 16 00
+97 2E 28 93 54 22 49 26 24 54 84 12 42 51 94 5B
+40 5C 48 5B 94 5C 0E 5B C8 5B 12 58 00 00 04 5B
+B4 5B 66 5B A4 5B 22 59 00 00 00 00 A6 5C 6E 51
+BC 53 85 48 49 32 4C 4F 87 12 A0 47 E0 4F CA 4B
+C0 4D 70 51 4A 55 2A 44 2A 54 04 43 4F 44 45 00
+B0 12 8A 4E A2 82 C4 1D 87 12 5C 4F DC 45 82 55
+00 00 07 45 4E 44 43 4F 44 45 87 12 7E 51 6E 4E
2A 44 44 50 03 41 53 4D 92 42 C8 1D B8 1D B2 40
-DE 53 C8 1D E5 3F 32 54 06 45 4E 44 41 53 4D 00
+4E 55 C8 1D E5 3F A2 55 06 45 4E 44 41 53 4D 00
92 42 B8 1D C8 1D E9 3F 00 00 05 43 4F 4C 4F 4E
1A 42 C4 1D BA 40 87 12 00 00 A2 53 C4 1D B2 43
-B6 1D 30 40 82 51 00 00 05 4C 4F 32 48 49 1A 42
+B6 1D 30 40 7E 51 00 00 05 4C 4F 32 48 49 1A 42
C4 1D BA 40 B0 12 00 00 BA 40 2A 44 02 00 A2 52
C4 1D ED 3F 38 40 BE 1D 39 48 2A 48 09 5A 1A 52
C2 1D 09 9A 03 24 7E 9A FC 27 1A 83 0E 4A 2A 88
-82 4A C2 1D 30 4D B0 12 2A 44 C6 49 1E 4A 72 45
-C0 45 DC 54 DA 4A C0 45 B2 4D FE 54 DE 54 29 4E
-39 90 86 12 02 20 2E 53 30 41 39 90 85 12 03 20
-1E 4E 02 00 30 41 39 90 84 12 01 20 2E 52 30 41
-19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 40 29 00
-12 12 C2 1D 92 53 C2 1D B0 12 2A 44 C6 49 DA 4A
-C0 45 30 55 26 55 21 53 3E 90 10 00 BB 2D 30 41
-32 55 B2 41 C2 1D 22 D3 30 41 87 12 4C 46 A4 54
-42 55 82 43 BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D
-0A 4E 3E 4F FA 90 23 00 00 00 34 20 92 53 C2 1D
-B0 12 C6 54 0E 93 04 20 B2 40 00 03 BC 1D 27 3C
-1E 93 04 20 B2 40 10 03 BC 1D 21 3C 2E 93 04 20
-B2 40 20 03 BC 1D 1B 3C 2E 92 04 20 B2 40 20 02
-BC 1D 15 3C 3E 92 04 20 B2 40 30 02 BC 1D 0F 3C
-3E 93 04 20 B2 40 30 03 BC 1D 09 3C B2 40 30 00
-BC 1D 19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 4F
-3D 41 30 4D FA 90 26 00 00 00 08 20 B2 40 10 02
-BC 1D 92 53 C2 1D 30 12 B2 55 75 3F FA 90 40 00
-00 00 1A 20 B2 40 20 00 BC 1D 92 53 C2 1D B0 12
-10 55 0E 20 B2 50 10 00 BC 1D 3E 40 2B 00 B0 12
-10 55 32 24 92 92 BE 1D C2 1D 02 24 92 53 C2 1D
-8E 10 82 5E BC 1D D3 3F B0 12 10 55 F9 23 B2 50
-10 00 BC 1D 3E 40 28 00 B0 12 C6 54 30 12 02 56
-67 3F 87 12 4C 46 A4 54 3A 56 FE 90 26 00 00 00
-3E 40 20 00 04 20 B2 50 82 00 BC 1D C2 3F B0 12
-10 55 DF 23 B2 50 80 00 BC 1D 3E 40 28 00 B0 12
-C6 54 B0 12 00 55 D5 23 3D 40 B2 4D 30 4D 50 48
-04 52 45 54 49 00 87 12 34 44 00 13 A2 4B 2A 44
-34 44 2C 00 3A 55 32 56 8A 56 2E 4E 1E D2 BC 1D
-19 42 BA 1D 92 3F 88 54 03 4D 4F 56 84 12 80 56
-00 40 98 56 05 4D 4F 56 2E 42 84 12 80 56 40 40
-00 00 03 41 44 44 84 12 80 56 00 50 B2 56 05 41
-44 44 2E 42 84 12 80 56 40 50 BE 56 04 41 44 44
-43 00 84 12 80 56 00 60 CC 56 06 41 44 44 43 2E
-42 00 84 12 80 56 40 60 70 56 04 53 55 42 43 00
-84 12 80 56 00 70 EA 56 06 53 55 42 43 2E 42 00
-84 12 80 56 40 70 F8 56 03 53 55 42 84 12 80 56
-00 80 08 57 05 53 55 42 2E 42 84 12 80 56 40 80
-6A 54 03 43 4D 50 84 12 80 56 00 90 22 57 05 43
-4D 50 2E 42 84 12 80 56 40 90 58 54 04 44 41 44
-44 00 84 12 80 56 00 A0 3C 57 06 44 41 44 44 2E
-42 00 84 12 80 56 40 A0 2E 57 03 42 49 54 84 12
-80 56 00 B0 5A 57 05 42 49 54 2E 42 84 12 80 56
-40 B0 66 57 03 42 49 43 84 12 80 56 00 C0 74 57
-05 42 49 43 2E 42 84 12 80 56 40 C0 80 57 03 42
-49 53 84 12 80 56 00 D0 8E 57 05 42 49 53 2E 42
-84 12 80 56 40 D0 00 00 03 58 4F 52 84 12 80 56
-00 E0 A8 57 05 58 4F 52 2E 42 84 12 80 56 40 E0
-DA 56 03 41 4E 44 84 12 80 56 00 F0 C2 57 05 41
-4E 44 2E 42 84 12 80 56 40 F0 4C 46 3A 55 E0 57
-1A 42 BC 1D B2 F0 70 00 BC 1D 8A 10 3A F0 0F 00
-82 DA BC 1D 4A 3F 14 57 03 52 52 43 84 12 DA 57
-00 10 F8 57 05 52 52 43 2E 42 84 12 DA 57 40 10
-04 58 04 53 57 50 42 00 84 12 DA 57 80 10 12 58
-03 52 52 41 84 12 DA 57 00 11 20 58 05 52 52 41
-2E 42 84 12 DA 57 40 11 2C 58 03 53 58 54 84 12
-DA 57 80 11 00 00 04 50 55 53 48 00 84 12 DA 57
-00 12 46 58 06 50 55 53 48 2E 42 00 84 12 DA 57
-40 12 9A 57 04 43 41 4C 4C 00 84 12 DA 57 80 12
-34 44 2C 00 3A 55 32 56 7A 58 59 42 BC 1D 5A 42
-BD 1D 82 4A BC 1D BE 90 00 15 00 00 02 20 0A 89
-02 3C 09 8A 0A 49 3A 90 10 00 03 2C 5A 0E A8 3F
-1A 53 0E 4A 87 12 70 47 6C 49 0D 6F 75 74 20 6F
-66 20 62 6F 75 6E 64 73 20 4D 54 58 05 50 55 53
-48 4D 84 12 70 58 00 15 BC 58 04 50 4F 50 4D 00
-84 12 70 58 00 17 4C 46 A4 54 DC 58 82 43 BC 1D
-92 42 C4 1D BA 1D A2 53 C4 1D 92 53 C2 1D 3E 40
-2C 00 B0 12 2A 44 C6 49 DA 4A C0 45 B2 4D 32 56
-02 59 0A 4E 3E 4F 1A 83 2A 92 CA 2F 8A 10 5A 06
-6F 3F 3A 58 04 52 52 43 4D 00 84 12 D6 58 50 00
-14 59 04 52 52 41 4D 00 84 12 D6 58 50 01 22 59
-04 52 4C 41 4D 00 84 12 D6 58 50 02 30 59 04 52
-52 55 4D 00 84 12 D6 58 50 03 85 12 00 3C 3E 59
-03 53 3E 3D 85 12 00 38 50 59 02 53 3C 00 85 12
-00 34 CA 58 03 30 3E 3D 85 12 00 30 64 59 02 30
-3C 00 85 12 00 30 00 00 02 55 3C 00 85 12 00 2C
-78 59 03 55 3E 3D 85 12 00 28 6E 59 03 30 3C 3E
-85 12 00 24 8C 59 02 30 3D 00 85 12 00 20 5C 48
-02 49 46 00 1A 42 C4 1D 8A 4E 00 00 A2 53 C4 1D
-0E 4A 30 4D 82 59 04 54 48 45 4E 00 1A 42 C4 1D
-08 4E 3E 4F 09 48 29 53 0A 89 0A 11 3A 90 00 02
-68 2F 88 DA 00 00 30 4D 4A 57 04 45 4C 53 45 00
-1A 42 C4 1D BA 40 00 3C 00 00 A2 53 C4 1D 2F 83
-8F 4A 00 00 E3 3F B6 59 05 55 4E 54 49 4C 3A 4F
-08 4E 3E 4F 19 42 C4 1D 2A 83 0A 89 0A 11 3A 90
-00 FE 47 3B 3A F0 FF 03 08 DA 89 48 00 00 A2 53
-C4 1D 30 4D CE 57 05 41 47 41 49 4E 87 12 4A 59
-FE 59 2A 44 00 00 05 57 48 49 4C 45 87 12 A4 59
-6E 44 2A 44 5A 59 06 52 45 50 45 41 54 00 87 12
-4A 59 FE 59 BC 59 2A 44 00 00 03 4A 4D 50 87 12
-A4 4D 4A 59 FE 59 2A 44 3E B0 00 10 03 20 3E E0
-00 04 30 4D 3E 90 00 34 06 28 03 24 3E 40 00 34
-30 4D 3E 40 00 38 30 4D 00 00 04 3F 4A 4D 50 00
-87 12 68 5A A4 4D 6E 44 FE 59 2A 44 9E 5A 3D 41
-08 4E 3E 4F 2A 48 0A 93 04 20 98 42 C4 1D 00 00
-30 4D 88 43 00 00 A4 3F 64 58 03 42 57 31 84 12
-9C 5A 00 00 BA 5A 03 42 57 32 84 12 9C 5A 00 00
-C6 5A 03 42 57 33 84 12 9C 5A 00 00 DE 5A 3D 41
-1A 42 C4 1D 28 4E 08 93 08 20 BA 4F 00 00 A2 53
-C4 1D 8E 4A 00 00 3E 4F 30 4D 8E 43 00 00 61 3F
-00 00 03 46 57 31 84 12 DC 5A 00 00 02 5B 03 46
-57 32 84 12 DC 5A 00 00 0E 5B 03 46 57 33 84 12
-DC 5A 00 00 1A 5B 04 47 4F 54 4F 00 87 12 4A 59
-A4 4D 98 4B 2A 44 8A 5A 05 3F 47 4F 54 4F 87 12
-68 5A A4 4D 98 4B 2A 44
+82 4A C2 1D 30 4D B0 12 2A 44 EE 49 46 4A EA 45
+4A 56 02 4B E0 45 AE 4D 6C 56 4C 56 29 4E 39 90
+86 12 02 20 2E 53 30 41 39 90 85 12 03 20 1E 4E
+02 00 30 41 39 90 84 12 01 20 2E 52 30 41 19 42
+C4 1D A2 53 C4 1D 89 4E 00 00 3E 40 29 00 12 12
+C2 1D 92 53 C2 1D B0 12 2A 44 EE 49 02 4B E0 45
+9E 56 94 56 21 53 3E 90 10 00 BB 2D 30 41 A0 56
+B2 41 C2 1D 22 D3 30 41 87 12 90 46 14 56 B0 56
+82 43 BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D 0A 4E
+3E 4F FA 90 23 00 00 00 34 20 92 53 C2 1D B0 12
+36 56 0E 93 04 20 B2 40 00 03 BC 1D 27 3C 1E 93
+04 20 B2 40 10 03 BC 1D 21 3C 2E 93 04 20 B2 40
+20 03 BC 1D 1B 3C 2E 92 04 20 B2 40 20 02 BC 1D
+15 3C 3E 92 04 20 B2 40 30 02 BC 1D 0F 3C 3E 93
+04 20 B2 40 30 03 BC 1D 09 3C B2 40 30 00 BC 1D
+19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 4F 3D 41
+30 4D FA 90 26 00 00 00 08 20 B2 40 10 02 BC 1D
+92 53 C2 1D 30 12 20 57 76 3F FA 90 40 00 00 00
+1A 20 B2 40 20 00 BC 1D 92 53 C2 1D B0 12 7E 56
+0E 20 B2 50 10 00 BC 1D 3E 40 2B 00 B0 12 7E 56
+32 24 92 92 BE 1D C2 1D 02 24 92 53 C2 1D 8E 10
+82 5E BC 1D D3 3F B0 12 7E 56 F9 23 B2 50 10 00
+BC 1D 3E 40 28 00 B0 12 36 56 30 12 70 57 67 3F
+87 12 90 46 14 56 A8 57 FE 90 26 00 00 00 3E 40
+20 00 04 20 B2 50 82 00 BC 1D C2 3F B0 12 7E 56
+DF 23 B2 50 80 00 BC 1D 3E 40 28 00 B0 12 36 56
+B0 12 6E 56 D5 23 3D 40 AE 4D 30 4D 78 48 04 52
+45 54 49 00 87 12 34 44 00 13 CA 4B 2A 44 34 44
+2C 00 A8 56 A0 57 F8 57 2E 4E 1E D2 BC 1D 19 42
+BA 1D 92 3F F8 55 03 4D 4F 56 84 12 EE 57 00 40
+06 58 05 4D 4F 56 2E 42 84 12 EE 57 40 40 00 00
+03 41 44 44 84 12 EE 57 00 50 20 58 05 41 44 44
+2E 42 84 12 EE 57 40 50 2C 58 04 41 44 44 43 00
+84 12 EE 57 00 60 3A 58 06 41 44 44 43 2E 42 00
+84 12 EE 57 40 60 DE 57 04 53 55 42 43 00 84 12
+EE 57 00 70 58 58 06 53 55 42 43 2E 42 00 84 12
+EE 57 40 70 66 58 03 53 55 42 84 12 EE 57 00 80
+76 58 05 53 55 42 2E 42 84 12 EE 57 40 80 DA 55
+03 43 4D 50 84 12 EE 57 00 90 90 58 05 43 4D 50
+2E 42 84 12 EE 57 40 90 C8 55 04 44 41 44 44 00
+84 12 EE 57 00 A0 AA 58 06 44 41 44 44 2E 42 00
+84 12 EE 57 40 A0 9C 58 03 42 49 54 84 12 EE 57
+00 B0 C8 58 05 42 49 54 2E 42 84 12 EE 57 40 B0
+D4 58 03 42 49 43 84 12 EE 57 00 C0 E2 58 05 42
+49 43 2E 42 84 12 EE 57 40 C0 EE 58 03 42 49 53
+84 12 EE 57 00 D0 FC 58 05 42 49 53 2E 42 84 12
+EE 57 40 D0 00 00 03 58 4F 52 84 12 EE 57 00 E0
+16 59 05 58 4F 52 2E 42 84 12 EE 57 40 E0 48 58
+03 41 4E 44 84 12 EE 57 00 F0 30 59 05 41 4E 44
+2E 42 84 12 EE 57 40 F0 90 46 A8 56 4E 59 1A 42
+BC 1D B2 F0 70 00 BC 1D 8A 10 3A F0 0F 00 82 DA
+BC 1D 4A 3F 82 58 03 52 52 43 84 12 48 59 00 10
+66 59 05 52 52 43 2E 42 84 12 48 59 40 10 72 59
+04 53 57 50 42 00 84 12 48 59 80 10 80 59 03 52
+52 41 84 12 48 59 00 11 8E 59 05 52 52 41 2E 42
+84 12 48 59 40 11 9A 59 03 53 58 54 84 12 48 59
+80 11 00 00 04 50 55 53 48 00 84 12 48 59 00 12
+B4 59 06 50 55 53 48 2E 42 00 84 12 48 59 40 12
+08 59 04 43 41 4C 4C 00 84 12 48 59 80 12 34 44
+2C 00 A8 56 A0 57 E8 59 59 42 BC 1D 5A 42 BD 1D
+82 4A BC 1D BE 90 00 15 00 00 02 20 0A 89 02 3C
+09 8A 0A 49 3A 90 10 00 03 2C 5A 0E A8 3F 1A 53
+0E 4A 87 12 8A 47 94 49 0D 6F 75 74 20 6F 66 20
+62 6F 75 6E 64 73 30 4D C2 59 05 50 55 53 48 4D
+84 12 DE 59 00 15 2A 5A 04 50 4F 50 4D 00 84 12
+DE 59 00 17 90 46 14 56 4A 5A 82 43 BC 1D 92 42
+C4 1D BA 1D A2 53 C4 1D 92 53 C2 1D 3E 40 2C 00
+B0 12 2A 44 EE 49 02 4B E0 45 AE 4D A0 57 70 5A
+0A 4E 3E 4F 1A 83 2A 92 CA 2F 8A 10 5A 06 6F 3F
+A8 59 04 52 52 43 4D 00 84 12 44 5A 50 00 82 5A
+04 52 52 41 4D 00 84 12 44 5A 50 01 90 5A 04 52
+4C 41 4D 00 84 12 44 5A 50 02 9E 5A 04 52 52 55
+4D 00 84 12 44 5A 50 03 85 12 00 3C AC 5A 03 53
+3E 3D 85 12 00 38 BE 5A 02 53 3C 00 85 12 00 34
+38 5A 03 30 3E 3D 85 12 00 30 D2 5A 02 30 3C 00
+85 12 00 30 00 00 02 55 3C 00 85 12 00 2C E6 5A
+03 55 3E 3D 85 12 00 28 DC 5A 03 30 3C 3E 85 12
+00 24 FA 5A 02 30 3D 00 85 12 00 20 84 48 02 49
+46 00 1A 42 C4 1D 8A 4E 00 00 A2 53 C4 1D 0E 4A
+30 4D F0 5A 04 54 48 45 4E 00 1A 42 C4 1D 08 4E
+3E 4F 09 48 29 53 0A 89 0A 11 3A 90 00 02 68 2F
+88 DA 00 00 30 4D B8 58 04 45 4C 53 45 00 1A 42
+C4 1D BA 40 00 3C 00 00 A2 53 C4 1D 2F 83 8F 4A
+00 00 E3 3F 24 5B 05 55 4E 54 49 4C 3A 4F 08 4E
+3E 4F 19 42 C4 1D 2A 83 0A 89 0A 11 3A 90 00 FE
+47 3B 3A F0 FF 03 08 DA 89 48 00 00 A2 53 C4 1D
+30 4D 3C 59 05 41 47 41 49 4E 87 12 B8 5A 6C 5B
+2A 44 00 00 05 57 48 49 4C 45 87 12 12 5B 78 44
+2A 44 C8 5A 06 52 45 50 45 41 54 00 87 12 B8 5A
+6C 5B 2A 5B 2A 44 00 00 03 4A 4D 50 87 12 A0 4D
+B8 5A 6C 5B 2A 44 3E B0 00 10 03 20 3E E0 00 04
+30 4D 3E 90 00 34 06 28 03 24 3E 40 00 34 30 4D
+3E 40 00 38 30 4D 00 00 04 3F 4A 4D 50 00 87 12
+D6 5B A0 4D 78 44 6C 5B 2A 44 0C 5C 3D 41 08 4E
+3E 4F 2A 48 0A 93 04 20 98 42 C4 1D 00 00 30 4D
+88 43 00 00 A4 3F D2 59 03 42 57 31 84 12 0A 5C
+00 00 28 5C 03 42 57 32 84 12 0A 5C 00 00 34 5C
+03 42 57 33 84 12 0A 5C 00 00 4C 5C 3D 41 1A 42
+C4 1D 28 4E 08 93 08 20 BA 4F 00 00 A2 53 C4 1D
+8E 4A 00 00 3E 4F 30 4D 8E 43 00 00 61 3F 00 00
+03 46 57 31 84 12 4A 5C 00 00 70 5C 03 46 57 32
+84 12 4A 5C 00 00 7C 5C 03 46 57 33 84 12 4A 5C
+00 00 88 5C 04 47 4F 54 4F 00 87 12 B8 5A A0 4D
+C0 4B 2A 44 F8 5B 05 3F 47 4F 54 4F 87 12 D6 5B
+A0 4D C0 4B 2A 44
@FFCC
-C6 52 C6 52 C6 52 C6 52 C6 52 C6 52 C6 52 C6 52
-C6 52 C6 52 C6 52 C6 52 C6 52 C6 52 C6 52 C6 52
-C6 52 C6 52 6A 48 C6 52 C6 52 C6 52 C6 52 C6 52
-C6 52 C6 52
+36 54 36 54 36 54 36 54 36 54 36 54 36 54 36 54
+36 54 36 54 36 54 36 54 36 54 36 54 36 54 36 54
+36 54 36 54 92 48 36 54 36 54 36 54 36 54 36 54
+36 54 36 54
q
+++ /dev/null
-\prog\MSP430Flasher\msp430flasher -m SBW2 -n MSP430fr5969 -v -w %1 -z [VCC=3000]
-exit
-
-tip : how to calculate MAIN program lenght ?
-
-open the prog.txt file with your editor, select MAIN section
-in status bar, keep the number of selected chars
-if lines are ended with CR+LF, substract the number of lines selected
-then divide by 3.
MOV #8, &REFCTL
; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : RTC REGISTERS
+; POWER ON RESET AND INITIALIZATION : RTC_C REGISTERS
; ----------------------------------------------------------------------
.IFDEF LF_XTAL
; LFXIN : PJ.4, LFXOUT : PJ.5
BIS.B #010h,&PJSEL0 ; SEL0 for only LFXIN
- BIC.B #RTCHOLD,&RTCCTL1 ; Clear RTCHOLD = start RTC_B
+ MOV.B #0A5h,&RTCCTL0_H ; unlock RTC_C
+ BIC.B #RTCHOLD,&RTCCTL1 ; Clear RTCHOLD = start RTC_C
.ENDIF
; ----------------------------------------------------------------------
+++ /dev/null
-@1800
-10 00 E6 44 80 3E 30 75 FD FF 18 00 5E 65 F0 51
-A6 44 B8 44 EA 59 28 5A
-@1DAA
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00
-@2000
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-@4000
-3A 41 0D 12 0D 4A 30 4D 2F 83 8F 4E 00 00 3E 41
-2E 4E 30 4D 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E
-30 4D 00 00 04 45 58 49 54 00 3D 41 30 4D 00 00
-03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 40
-03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
-44 55 50 00 0E 93 F6 23 30 4D 40 40 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 40 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E 40 02 3E 52 00 0E 12 3E 4F 30 4D 8E 40
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 40
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C 40 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 40 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 41
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 40 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA 40 03 41 4E 44 3E FF 30 4D 7A 40 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E 41 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 41 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E 41 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 41 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 40 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
-3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE 41 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 41 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 41 03 3E 49 4E 85 12 C2 1D 10 41
-04 42 41 53 45 00 85 12 DA 1D C0 40 05 53 54 41
-54 45 85 12 B6 1D 30 42 02 42 4C 00 85 12 20 00
-94 41 02 3C 23 00 B2 40 AA 1D AA 1D 30 4D 1E 15
-0E 43 3D 40 20 00 0A 93 04 20 0D 11 0A 4C 0C 43
-09 43 0E 9B 01 28 0E 8B 09 69 08 68 1D 83 07 30
-0C 5C 0A 6A 0E 6E F5 2B 0E 8B 12 D3 F5 3F 0A 4E
-1D 17 30 41 48 42 01 23 1B 42 DA 1D 2C 4F 0A 4E
-B0 12 5E 42 8F 49 00 00 0E 48 7A 90 0A 00 02 28
-3A 50 07 00 3A 50 30 00 92 83 AA 1D 18 42 AA 1D
-C8 4A 00 00 30 4D 96 42 02 23 53 00 87 12 98 42
-D2 42 2D 83 09 93 E0 23 0E 93 DE 23 3D 41 30 4D
-C8 42 02 23 3E 00 9F 42 AA 1D 00 00 3E 40 AA 1D
-2E 8F 30 4D 00 42 04 48 4F 4C 44 00 0A 4E 3E 4F
-DB 3F 3C 42 04 53 49 47 4E 00 0E 93 3E 4F 3A 40
-2D 00 D2 33 30 4D F4 41 03 55 44 2E 87 12 56 42
-CC 42 E6 42 CC 45 94 45 2A 40 18 43 02 55 2E 00
-2F 83 8F 4E 00 00 0E 43 F1 3F 3E B0 00 80 06 24
-BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D DA 40
-02 44 2E 00 87 12 56 42 6E 40 80 40 3A 43 CC 42
-92 40 0A 43 E6 42 CC 45 94 45 2A 40 52 41 01 2E
-3E B0 00 80 DD 27 2F 83 3E 43 EC 3F F6 42 04 48
-45 52 45 00 2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D
-62 41 05 41 4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D
-E2 42 02 43 2C 00 1A 42 C4 1D CA 4E 00 00 92 53
-C4 1D 3E 4F 30 4D 2F 83 8F 4E 00 00 B0 12 A6 44
-92 B3 DC 05 FD 27 1E 42 CC 05 B0 12 B8 44 30 4D
-30 40 B6 43 7E 43 05 28 4B 45 59 29 18 42 CC 05
-EA 3F 12 42 03 4B 45 59 30 40 DC 43 0D 12 3D 40
-18 44 1B 42 34 20 9B 42 1E 20 16 00 3A 40 00 21
-BF 40 50 00 00 00 8F 4A 02 00 0E 43 82 93 20 20
-13 24 19 42 1E 20 02 3C 1A 44 2D 83 19 92 20 20
-16 2C 58 49 00 1E 19 53 78 90 20 00 08 2C 78 90
-0A 00 F4 23 82 49 1E 20 2F 53 3D 41 30 4D 8F 9E
-00 00 64 24 CA 48 00 00 1A 53 1E 53 5F 3C 0A 12
-B0 12 54 5B 3A 41 DA 3F 92 43 06 41 43 43 45 50
-54 00 30 40 72 44 D6 43 08 28 41 43 43 45 50 54
-29 00 3C 40 24 45 3B 40 EE 44 2D 15 0A 4E 2E 4F
-0A 5E 3B 40 0D 00 3C 40 20 00 3D 40 18 45 92 B3
-DC 05 05 24 18 42 CC 05 38 90 0A 00 04 20 21 53
-39 40 D2 44 4D 15 B2 40 11 00 CE 05 A2 B3 DC 05
-FD 27 E2 C2 23 02 30 41 B2 40 13 00 CE 05 A2 B3
-DC 05 FD 27 E2 D2 23 02 30 41 00 00 05 53 4C 45
-45 50 30 40 E0 44 00 00 07 28 53 4C 45 45 50 29
-12 D2 0A 18 F6 3F 21 52 3A 17 58 42 CC 05 48 9B
-E3 27 48 9C 06 2C 78 92 11 20 2E 9F 0F 24 1E 83
-05 3C 0E 9A 03 24 CE 48 00 00 1E 53 82 48 CE 05
-A2 B3 DC 05 FD 27 30 4D 1A 45 2D 83 92 B3 DC 05
-FD 27 E3 23 B2 40 18 00 0A 18 3E 8F 3D 41 30 4D
-68 44 06 28 45 4D 49 54 29 00 08 4E 3E 4F E6 3F
-50 43 04 45 4D 49 54 00 30 40 3A 45 42 45 04 45
-43 48 4F 00 B2 40 82 48 0C 45 30 4D 6E 43 06 4E
-4F 45 43 48 4F 00 B2 40 30 4D 0C 45 30 4D 32 45
-04 28 43 52 29 00 2F 83 8F 4E 00 00 3E 40 0D 00
-E3 3F A2 43 02 43 52 00 30 40 76 45 04 43 05 53
-50 41 43 45 2F 83 8F 4E 00 00 3E 40 20 00 D4 3F
-8E 45 06 53 50 41 43 45 53 00 0E 93 09 24 0D 12
-3D 40 B6 45 EF 3F B8 45 2D 83 1E 83 EB 23 3D 41
-3E 4F 30 4D 2C 43 04 54 59 50 45 00 0E 93 95 24
-2A 4F 8F 5E 00 00 0E 4A 87 12 CA 41 02 42 0A 41
-48 45 EC 41 DC 45 2A 40 2F 82 8F 4E 02 00 7E 4D
-8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D A2 45 82 53
-22 00 87 12 34 40 E8 45 1E 48 34 40 22 00 42 46
-12 46 3D 41 6E 4E 1E 83 82 5E C4 1D 3E 4F 92 B3
-C4 1D A2 63 C4 1D 30 4D 5E 45 82 2E 22 00 87 12
-02 46 34 40 CC 45 1E 48 2A 40 00 00 04 57 4F 52
-44 00 3C 40 BE 1D 39 4C 3A 4C 09 5A 3A 5C 28 4C
-09 9A 19 24 7E 9A FC 27 1A 83 3B 40 60 00 C8 4C
-00 00 09 9A 0C 24 7C 4A 4E 9C 09 24 18 53 4B 9C
-F6 2F 7C 90 7B 00 F3 2F 7C 80 20 00 F0 3F 1A 82
-C0 1D 82 4A C2 1D 1E 42 C4 1D 08 8E CE 48 00 00
-30 4D 00 00 04 46 49 4E 44 00 2F 83 0C 4E 65 4C
-74 40 80 00 3B 40 CA 1D 3E 4B 0E 93 1E 24 58 4C
-01 00 78 F0 1E 00 0E 58 2E 53 1E 4E FE FF 0E 93
-F3 27 09 4E 78 49 48 C4 48 95 F7 23 0A 4C 1A 53
-FA 99 00 00 F2 23 58 83 FA 23 19 B3 09 63 0C 49
-6A 4E 1E 43 4A 93 01 30 2E 83 8F 4C 00 00 35 40
-08 40 34 40 14 40 30 4D 2F 53 2F 53 3E 4F 30 4D
-26 42 07 3E 4E 55 4D 42 45 52 3C 4F 38 4F 29 4F
-2F 82 1B 42 DA 1D 6A 4C 7A 80 30 00 7A 90 0A 00
-02 28 7A 80 07 00 0A 9B 13 2C 82 49 D0 04 82 48
-D2 04 82 4B C8 04 19 42 E4 04 18 42 E6 04 09 5A
-08 63 1C 53 1E 83 E7 23 8F 49 04 00 8F 48 02 00
-8F 4C 00 00 30 4D 03 12 0D 12 1B 42 DA 1D 0B 12
-32 C0 00 02 6D 4E 0D 5E 0C 4E 7A 40 2E 00 0D 9C
-0A 28 7A 9C FC 23 32 D0 00 02 FC 4C FE FF 0D 9C
-FC 2F DE 83 00 00 09 43 08 43 3D 40 CC 47 3F 82
-8F 4E 06 00 0C 4E 7E 4C 6A 4C 7A 90 2D 00 10 2C
-3B 40 10 00 7A 80 24 00 06 24 2B 43 5A 83 03 24
-3B 52 6A 53 B0 23 1C 53 1E 83 6A 4C 7A 90 2D 00
-AA 23 1C 53 1E 83 B1 43 04 00 A5 3F CE 47 2F 53
-0E 93 2C 17 82 4C DA 1D 03 24 2F 52 0E F3 30 4D
-9F 4F 02 00 04 00 BF 4F 00 00 3E E3 09 20 3E E3
-BF E3 02 00 BF E3 00 00 9F 53 02 00 8F 63 00 00
-32 B0 00 02 01 20 2F 53 30 4D 4E 45 07 45 58 45
-43 55 54 45 0A 4E 3E 4F 00 4A 28 41 01 2C 1A 42
-C4 1D A2 53 C4 1D 8A 4E 00 00 3E 4F 30 4D 1C 48
-87 4C 49 54 45 52 41 4C 82 93 B6 1D 16 24 32 B0
-00 02 09 24 1A 42 C4 1D A2 52 C4 1D BA 40 34 40
-00 00 BA 4F 02 00 1A 42 C4 1D A2 52 C4 1D BA 40
-34 40 00 00 8A 4E 02 00 3E 4F 30 4D 84 45 05 43
-4F 55 4E 54 2F 83 1E 53 8F 4E 00 00 5E 4E FF FF
-30 4D 82 4E BE 1D B2 4F C0 1D 3E 4F 82 43 C2 1D
-87 12 4C 42 42 46 98 48 3D 40 A4 48 FE 22 3D 41
-3E 4F 30 4D A6 48 0A 4E 3E 4F 3D 40 BC 48 53 27
-3D 40 92 48 1A E2 B6 1D B2 27 AC 23 BE 48 3E 4F
-3D 40 92 48 B9 23 DE 53 00 00 68 4E 08 5E F8 40
-3F 00 00 00 3D 40 98 4A CD 3F 0C 48 08 45 56 41
-4C 55 41 54 45 00 39 40 BE 1D 39 12 39 12 39 12
-0D 12 B0 12 2A 40 82 48 FA 48 3D 41 B2 41 C2 1D
-B2 41 C0 1D B2 41 BE 1D 30 4D 7A 41 04 51 55 49
-54 00 31 40 E0 1C B2 40 00 1C 00 1C 82 43 B6 1D
-82 43 08 18 B0 12 2A 40 E8 45 04 0D 6F 6B 20 00
-CC 45 34 40 38 1D 44 40 34 40 50 00 62 44 94 45
-82 48 34 40 7E 1C CE 40 B2 41 E8 45 0D 73 74 61
-63 6B 20 65 6D 70 74 79 20 21 96 49 34 40 30 FF
-84 43 B2 41 E8 45 0B 46 52 41 4D 20 66 75 6C 6C
-20 21 96 49 42 42 F4 40 C0 41 28 49 E8 45 04 0D
-20 20 20 00 BC 41 30 49 5A 44 05 41 42 4F 52 54
-3F 40 80 1C BE 3F 8F 93 02 00 AE 26 B2 40 82 48
-0C 45 1B 42 34 20 0B 93 04 24 CB 43 02 00 2B 4B
-FA 3F B0 12 98 4E 82 43 B4 58 82 43 C0 58 82 43
-CC 58 82 43 FC 58 82 43 08 59 82 43 14 59 A2 B3
-DC 05 FD 27 B2 40 11 00 CE 05 E2 C2 23 02 92 C3
-DC 05 38 40 A0 AA 39 42 19 83 FE 23 18 83 FB 23
-92 B3 DC 05 F4 23 87 12 E8 45 04 1B 5B 37 6D 00
-CC 45 CC 45 E8 45 04 1B 5B 30 6D 00 CC 45 DA 4D
-1C 4E 22 4E 90 49 8A 49 86 41 42 4F 52 54 22 00
-87 12 02 46 34 40 96 49 1E 48 2A 40 94 46 01 27
-87 12 4C 42 42 46 9A 46 C0 41 3E 4A 2A 40 C6 48
-52 42 81 5C 92 42 BE 1D C2 1D 30 4D 87 12 1E 46
-4C 42 42 46 56 4A 08 4E 7A 4E 5A D3 5A 53 0A 58
-19 42 C8 1D 6E 4E 3E F0 1E 00 09 5E 82 48 AE 1D
-82 49 B0 1D 82 4A B2 1D 2A 52 82 4A C4 1D 3E 4F
-3D 41 30 41 87 12 E8 45 0F 73 74 61 63 6B 20 6D
-69 73 6D 61 74 63 68 21 9C 49 82 9F B4 1D F2 23
-18 42 AE 1D 19 42 B0 1D A8 49 FE FF 89 48 00 00
-30 4D 3C 46 08 56 41 52 49 41 42 4C 45 00 B0 12
-4C 4A BA 40 86 12 FC FF EF 3F 6E 48 08 43 4F 4E
-53 54 41 4E 54 00 B0 12 4C 4A BA 40 85 12 FC FF
-8A 4E FE FF 3E 4F E0 3F CC 4A 06 43 52 45 41 54
-45 00 B0 12 4C 4A BA 40 85 12 FC FF 8A 4A FE FF
-D3 3F DC 48 05 44 4F 45 53 3E 1A 42 B2 1D BA 40
-84 12 00 00 8A 4D 02 00 3D 41 30 4D 04 4B 05 44
-45 46 45 52 B0 12 4C 4A BA 40 30 40 FC FF BA 40
-1A 4B FE FF B9 3F 00 00 81 5B 82 43 B6 1D 30 4D
-42 4A 01 5D B2 43 B6 1D 30 4D FE 45 87 52 45 43
-55 52 53 45 19 42 C4 1D 99 42 B2 1D 00 00 A2 53
-C4 1D 30 4D 38 4B 01 3A B0 12 4C 4A BA 40 87 12
-FC FF A2 83 C4 1D B2 43 B6 1D 82 4F B4 1D 30 4D
-66 4B 81 3B 82 93 B6 1D 5D 27 87 12 34 40 2A 40
-1E 48 9A 4A 3A 4B 2A 40 70 45 09 49 4D 4D 45 44
-49 41 54 45 1A 42 AE 1D FA D0 80 00 00 00 30 4D
-BE 4F 02 00 3E 4F 30 4D 9A 4B 82 49 53 00 87 12
-42 42 F4 40 C0 41 D2 4B DE 4B 34 40 B0 4B 1E 48
-2A 40 30 4A B0 4B 2A 40 82 4B 83 5B 27 5D 87 12
-30 4A 34 40 34 40 1E 48 1E 48 2A 40 0C 49 88 50
-4F 53 54 50 4F 4E 45 00 87 12 4C 42 42 46 9A 46
-54 40 C0 41 3E 4A 7E 41 C0 41 18 4C 34 40 34 40
-1E 48 1E 48 34 40 1E 48 1E 48 2A 40 1E 4C 3A 4E
-82 4A C6 1D 2E 4E 82 4E C4 1D 3D 40 10 00 09 4A
-08 49 29 83 18 48 FE FF 0E 98 FC 2B 89 48 00 00
-1D 83 F6 23 2A 4A 0A 93 F0 23 3E 4F 3D 41 30 4D
-BA 4B 82 49 46 00 2F 83 8F 4E 00 00 1E 42 C4 1D
-BE 40 C0 41 00 00 A2 52 C4 1D 2E 53 30 4D 1E 4B
-84 45 4C 53 45 00 1A 42 C4 1D BA 40 BC 41 00 00
-2A 52 82 4A C4 1D 8E 4A 00 00 2A 83 0E 4A 30 4D
-C6 45 84 54 48 45 4E 00 9E 42 C4 1D 00 00 3E 4F
-30 4D EA 4A 85 42 45 47 49 4E 30 40 84 43 92 4C
-85 55 4E 54 49 4C 39 40 C0 41 1A 42 C4 1D A2 52
-C4 1D 8A 49 00 00 8A 4E 02 00 3E 4F 30 4D 18 4A
-85 41 47 41 49 4E 39 40 BC 41 EF 3F B4 4A 85 57
-48 49 4C 45 87 12 56 4C 6E 40 2A 40 4C 4B 86 52
-45 50 45 41 54 00 87 12 D6 4C 98 4C 2A 40 70 4C
-82 44 4F 00 2F 83 8F 4E 00 00 1E 42 C4 1D BE 40
-CA 41 00 00 2E 53 82 4E C4 1D A2 53 00 1C 1A 42
-00 1C 8A 43 00 00 30 4D 30 48 84 4C 4F 4F 50 00
-39 40 EC 41 1A 42 C4 1D A2 52 C4 1D 8A 49 00 00
-8A 4E 02 00 1E 42 00 1C A2 83 00 1C 2E 4E 0E 93
-04 24 9E 42 C4 1D 00 00 F5 3F 3E 4F 30 4D E4 43
-85 2B 4C 4F 4F 50 39 40 DA 41 E4 3F 2A 4D 85 4C
-45 41 56 45 1A 42 C4 1D BA 40 FC 41 00 00 BA 40
-BC 41 02 00 B2 50 06 00 C4 1D A2 53 00 1C 2A 52
-19 42 00 1C 89 4A 00 00 30 4D 6E 4D 04 4D 4F 56
-45 00 0A 4E 38 4F 39 4F 3E 4F 0A 93 11 24 08 99
-0F 24 06 2C F8 49 00 00 18 53 1A 83 FB 23 30 4D
-08 5A 09 5A 19 83 18 83 E8 49 00 00 1A 83 FA 23
-30 4D 34 40 CA 1D FC 40 2A 40 84 12 D2 4D 36 52
-0A 65 44 65 2C 65 F4 51 60 4D 34 64 E4 62 40 4E
-E8 64 42 64 32 63 48 41 DA 4B 42 4B 28 63 00 00
-3A 40 0C 00 39 40 CA 1D 38 40 CC 1D D9 3F 3A 40
-0E 00 39 40 CC 1D 38 40 CA 1D CC 3F 82 43 CC 1D
-30 4D 92 42 CA 1D C8 1D 30 4D EE 4B 09 50 57 52
-5F 53 54 41 54 45 84 12 1C 4C F0 51 5E 65 2C 4E
-08 50 57 52 5F 48 45 52 45 00 92 42 C4 1D 3C 4E
-92 42 C6 1D 3A 4E EF 3F EE 4C 09 52 53 54 5F 53
-54 41 54 45 92 42 0C 18 3C 4E 92 42 0E 18 3A 4E
-E2 3F 5A 4E 08 52 53 54 5F 48 45 52 45 00 92 42
-C4 1D 0C 18 92 42 C6 1D 0E 18 DF 3F B2 40 E6 4E
-48 4F B2 40 E0 44 D4 44 B2 40 3A 45 4A 45 B2 40
-76 45 8A 45 B2 40 DC 43 EA 43 B2 40 72 44 64 44
-30 41 DE 4C 04 57 49 50 45 00 39 40 80 FF B9 43
-00 00 29 53 39 90 B4 FF FA 23 B0 12 8C 4E B2 40
-5E 65 C4 1D B2 40 F0 51 C6 1D D1 3F 52 4C 06 28
-57 41 52 4D 29 00 1E 42 08 18 87 12 E8 45 05 0D
-1B 5B 37 6D CC 45 70 43 E8 45 27 20 46 61 73 74
-46 6F 72 74 68 20 56 31 36 30 20 31 36 4D 48 7A
-20 28 43 29 20 4A 2E 4D 2E 54 68 6F 6F 72 65 6E
-73 20 CC 45 34 40 30 FF 84 43 2A 41 30 43 E8 45
-0B 62 79 74 65 73 20 66 72 65 65 20 B2 49 B4 4E
-04 57 41 52 4D 00 30 40 E6 4E A4 4C 04 43 4F 4C
-44 00 B2 40 04 A5 20 01 B2 40 88 5A 5C 01 B2 D0
-03 00 04 02 B2 40 FC FF 02 02 B2 C0 03 00 06 02
-B2 D0 00 04 24 02 B2 D3 26 02 B2 43 22 02 B2 43
-42 02 B2 D3 46 02 B2 43 62 02 B2 D3 66 02 F2 43
-26 03 F2 D3 22 03 F2 40 A5 00 41 01 F2 40 10 00
-40 01 D2 43 41 01 F2 40 A5 00 61 01 B2 40 48 00
-62 01 82 43 66 01 39 40 80 00 B2 40 33 00 64 01
-D2 43 61 01 92 D2 9E 01 08 18 A2 93 08 18 01 24
-59 07 38 40 C2 A2 18 83 FE 23 19 83 FA 23 B2 42
-B0 01 F2 D0 10 00 2A 03 F2 C0 40 00 A2 04 3A 40
-58 4F 39 40 B4 FF 89 4A 00 00 29 53 FC 23 92 42
-02 18 F0 FF B2 40 18 00 0A 18 31 40 E0 1C 3F 40
-80 1C 37 40 00 40 36 40 B4 40 35 40 08 40 34 40
-14 40 B2 40 0A 00 DA 1D B2 43 AC 1D 92 C3 30 01
-18 42 08 18 D2 B3 01 02 04 20 38 E3 18 53 82 48
-08 18 B2 40 81 00 C0 05 B2 40 05 00 C6 05 B2 40
-00 49 C8 05 F2 D0 03 00 0D 02 92 C3 C0 05 92 D3
-DA 05 3D 40 7C 50 18 42 08 18 38 90 0A 00 25 27
-38 90 16 00 22 2F 28 93 F5 22 DD 26 7E 50 E2 B2
-60 02 61 23 B2 40 81 A9 40 06 B2 40 30 00 46 06
-D2 D3 25 02 B2 D0 C0 04 0C 02 B2 C0 C0 04 06 02
-92 C3 40 06 39 40 00 20 89 43 00 00 29 53 39 90
-54 21 FA 23 39 42 B0 12 C2 59 D2 C3 23 02 2C 42
-B2 40 95 00 14 20 B2 40 00 40 18 20 1A 43 B0 12
-86 59 02 24 30 40 60 5A B0 12 C0 59 7A 93 FC 23
-B2 40 87 AA 14 20 92 43 16 20 B2 40 00 48 18 20
-1A 43 B0 12 86 59 29 42 B0 12 C2 59 92 43 14 20
-82 43 16 20 78 43 3C 42 B2 40 00 77 18 20 1A 43
-B0 12 86 59 B2 40 40 69 18 20 B0 12 7C 59 03 24
-58 83 F2 23 D7 3F 0C 5C A2 43 16 20 B2 40 00 50
-18 20 B0 12 7C 59 CE 23 92 D3 40 06 82 43 46 06
-92 C3 40 06 B0 12 E8 59 38 40 00 1E 92 48 C6 01
-04 20 92 48 C8 01 06 20 5A 48 C2 01 92 43 02 20
-7A 80 06 00 0D 24 7A 82 0B 24 A2 43 02 20 6A 53
-07 24 5A 53 05 24 3A 50 0B 20 0C 4A 30 40 66 5A
-B0 12 E8 59 D2 48 0D 00 12 20 19 48 0E 00 82 49
-08 20 1A 48 16 00 0A 93 02 20 1A 48 24 00 82 4A
-0A 20 09 5A 82 49 0C 20 09 5A A2 93 02 20 04 24
-82 49 0E 20 39 50 20 00 19 82 12 20 19 82 12 20
-82 49 10 20 92 42 02 20 2C 20 BD 3E 84 12 D2 4D
-18 58 C4 58 CC 57 18 59 92 57 4C 58 96 54 00 00
-88 57 38 58 EA 57 28 58 A6 55 00 00 00 00 2A 59
-FE 4D DE 4E 85 48 49 32 4C 4F 87 12 84 43 6A 4C
-1E 48 3A 4B 00 4E CC 51 2A 40 4C 4F 04 43 4F 44
-45 00 B0 12 4C 4A A2 82 C4 1D 87 12 7A 4B BC 41
-04 52 00 00 07 45 4E 44 43 4F 44 45 87 12 0E 4E
-9A 4A 2A 40 D0 4C 03 41 53 4D 92 42 C8 1D B8 1D
-B2 40 D0 51 C8 1D E5 3F 24 52 06 45 4E 44 41 53
-4D 00 92 42 B8 1D C8 1D E9 3F 00 00 05 43 4F 4C
-4F 4E 1A 42 C4 1D BA 40 87 12 00 00 A2 53 C4 1D
-B2 43 B6 1D 30 40 0E 4E 00 00 05 4C 4F 32 48 49
-1A 42 C4 1D BA 40 B0 12 00 00 BA 40 2A 40 02 00
-A2 52 C4 1D ED 3F 38 40 BE 1D 39 48 2A 48 09 5A
-1A 52 C2 1D 09 9A 03 24 7E 9A FC 27 1A 83 0E 4A
-2A 88 82 4A C2 1D 30 4D B0 12 2A 40 42 46 9A 46
-72 41 C0 41 CE 52 56 47 C0 41 3E 4A F0 52 D0 52
-29 4E 39 90 86 12 02 20 2E 53 30 41 39 90 85 12
-03 20 1E 4E 02 00 30 41 39 90 84 12 01 20 2E 52
-30 41 19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 40
-29 00 12 12 C2 1D 92 53 C2 1D B0 12 2A 40 42 46
-56 47 C0 41 22 53 18 53 21 53 3E 90 10 00 BB 2D
-30 41 24 53 B2 41 C2 1D 22 D3 30 41 87 12 4C 42
-96 52 34 53 82 43 BC 1D 92 42 C4 1D BA 1D A2 53
-C4 1D 0A 4E 3E 4F FA 90 23 00 00 00 34 20 92 53
-C2 1D B0 12 B8 52 0E 93 04 20 B2 40 00 03 BC 1D
-27 3C 1E 93 04 20 B2 40 10 03 BC 1D 21 3C 2E 93
-04 20 B2 40 20 03 BC 1D 1B 3C 2E 92 04 20 B2 40
-20 02 BC 1D 15 3C 3E 92 04 20 B2 40 30 02 BC 1D
-0F 3C 3E 93 04 20 B2 40 30 03 BC 1D 09 3C B2 40
-30 00 BC 1D 19 42 C4 1D A2 53 C4 1D 89 4E 00 00
-3E 4F 3D 41 30 4D FA 90 26 00 00 00 08 20 B2 40
-10 02 BC 1D 92 53 C2 1D 30 12 A4 53 75 3F FA 90
-40 00 00 00 1A 20 B2 40 20 00 BC 1D 92 53 C2 1D
-B0 12 02 53 0E 20 B2 50 10 00 BC 1D 3E 40 2B 00
-B0 12 02 53 32 24 92 92 BE 1D C2 1D 02 24 92 53
-C2 1D 8E 10 82 5E BC 1D D3 3F B0 12 02 53 F9 23
-B2 50 10 00 BC 1D 3E 40 28 00 B0 12 B8 52 30 12
-F4 53 67 3F 87 12 4C 42 96 52 2C 54 FE 90 26 00
-00 00 3E 40 20 00 04 20 B2 50 82 00 BC 1D C2 3F
-B0 12 02 53 DF 23 B2 50 80 00 BC 1D 3E 40 28 00
-B0 12 B8 52 B0 12 F2 52 D5 23 3D 40 3E 4A 30 4D
-CC 44 04 52 45 54 49 00 87 12 34 40 00 13 1E 48
-2A 40 34 40 2C 00 2C 53 24 54 7C 54 2E 4E 1E D2
-BC 1D 19 42 BA 1D 92 3F 7A 52 03 4D 4F 56 84 12
-72 54 00 40 8A 54 05 4D 4F 56 2E 42 84 12 72 54
-40 40 00 00 03 41 44 44 84 12 72 54 00 50 A4 54
-05 41 44 44 2E 42 84 12 72 54 40 50 B0 54 04 41
-44 44 43 00 84 12 72 54 00 60 BE 54 06 41 44 44
-43 2E 42 00 84 12 72 54 40 60 62 54 04 53 55 42
-43 00 84 12 72 54 00 70 DC 54 06 53 55 42 43 2E
-42 00 84 12 72 54 40 70 EA 54 03 53 55 42 84 12
-72 54 00 80 FA 54 05 53 55 42 2E 42 84 12 72 54
-40 80 5C 52 03 43 4D 50 84 12 72 54 00 90 14 55
-05 43 4D 50 2E 42 84 12 72 54 40 90 4A 52 04 44
-41 44 44 00 84 12 72 54 00 A0 2E 55 06 44 41 44
-44 2E 42 00 84 12 72 54 40 A0 20 55 03 42 49 54
-84 12 72 54 00 B0 4C 55 05 42 49 54 2E 42 84 12
-72 54 40 B0 58 55 03 42 49 43 84 12 72 54 00 C0
-66 55 05 42 49 43 2E 42 84 12 72 54 40 C0 72 55
-03 42 49 53 84 12 72 54 00 D0 80 55 05 42 49 53
-2E 42 84 12 72 54 40 D0 00 00 03 58 4F 52 84 12
-72 54 00 E0 9A 55 05 58 4F 52 2E 42 84 12 72 54
-40 E0 CC 54 03 41 4E 44 84 12 72 54 00 F0 B4 55
-05 41 4E 44 2E 42 84 12 72 54 40 F0 4C 42 2C 53
-D2 55 1A 42 BC 1D B2 F0 70 00 BC 1D 8A 10 3A F0
-0F 00 82 DA BC 1D 4A 3F 06 55 03 52 52 43 84 12
-CC 55 00 10 EA 55 05 52 52 43 2E 42 84 12 CC 55
-40 10 F6 55 04 53 57 50 42 00 84 12 CC 55 80 10
-04 56 03 52 52 41 84 12 CC 55 00 11 12 56 05 52
-52 41 2E 42 84 12 CC 55 40 11 1E 56 03 53 58 54
-84 12 CC 55 80 11 00 00 04 50 55 53 48 00 84 12
-CC 55 00 12 38 56 06 50 55 53 48 2E 42 00 84 12
-CC 55 40 12 8C 55 04 43 41 4C 4C 00 84 12 CC 55
-80 12 34 40 2C 00 2C 53 24 54 6C 56 59 42 BC 1D
-5A 42 BD 1D 82 4A BC 1D BE 90 00 15 00 00 02 20
-0A 89 02 3C 09 8A 0A 49 3A 90 10 00 03 2C 5A 0E
-A8 3F 1A 53 0E 4A 87 12 70 43 E8 45 0D 6F 75 74
-20 6F 66 20 62 6F 75 6E 64 73 9C 49 46 56 05 50
-55 53 48 4D 84 12 62 56 00 15 AE 56 04 50 4F 50
-4D 00 84 12 62 56 00 17 4C 42 96 52 CE 56 82 43
-BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D 92 53 C2 1D
-3E 40 2C 00 B0 12 2A 40 42 46 56 47 C0 41 3E 4A
-24 54 F4 56 0A 4E 3E 4F 1A 83 2A 92 CA 2F 8A 10
-5A 06 6F 3F 2C 56 04 52 52 43 4D 00 84 12 C8 56
-50 00 06 57 04 52 52 41 4D 00 84 12 C8 56 50 01
-14 57 04 52 4C 41 4D 00 84 12 C8 56 50 02 22 57
-04 52 52 55 4D 00 84 12 C8 56 50 03 85 12 00 3C
-30 57 03 53 3E 3D 85 12 00 38 42 57 02 53 3C 00
-85 12 00 34 BC 56 03 30 3E 3D 85 12 00 30 56 57
-02 30 3C 00 85 12 00 30 00 00 02 55 3C 00 85 12
-00 2C 6A 57 03 55 3E 3D 85 12 00 28 60 57 03 30
-3C 3E 85 12 00 24 7E 57 02 30 3D 00 85 12 00 20
-D8 44 02 49 46 00 1A 42 C4 1D 8A 4E 00 00 A2 53
-C4 1D 0E 4A 30 4D 74 57 04 54 48 45 4E 00 1A 42
-C4 1D 08 4E 3E 4F 09 48 29 53 0A 89 0A 11 3A 90
-00 02 68 2F 88 DA 00 00 30 4D 3C 55 04 45 4C 53
-45 00 1A 42 C4 1D BA 40 00 3C 00 00 A2 53 C4 1D
-2F 83 8F 4A 00 00 E3 3F A8 57 05 55 4E 54 49 4C
-3A 4F 08 4E 3E 4F 19 42 C4 1D 2A 83 0A 89 0A 11
-3A 90 00 FE 47 3B 3A F0 FF 03 08 DA 89 48 00 00
-A2 53 C4 1D 30 4D C0 55 05 41 47 41 49 4E 87 12
-3C 57 F0 57 2A 40 00 00 05 57 48 49 4C 45 87 12
-96 57 6E 40 2A 40 4C 57 06 52 45 50 45 41 54 00
-87 12 3C 57 F0 57 AE 57 2A 40 00 00 03 4A 4D 50
-87 12 30 4A 3C 57 F0 57 2A 40 3E B0 00 10 03 20
-3E E0 00 04 30 4D 3E 90 00 34 06 28 03 24 3E 40
-00 34 30 4D 3E 40 00 38 30 4D 00 00 04 3F 4A 4D
-50 00 87 12 5A 58 30 4A 6E 40 F0 57 2A 40 90 58
-3D 41 08 4E 3E 4F 2A 48 0A 93 04 20 98 42 C4 1D
-00 00 30 4D 88 43 00 00 A4 3F 56 56 03 42 57 31
-84 12 8E 58 00 00 AC 58 03 42 57 32 84 12 8E 58
-00 00 B8 58 03 42 57 33 84 12 8E 58 00 00 D0 58
-3D 41 1A 42 C4 1D 28 4E 08 93 08 20 BA 4F 00 00
-A2 53 C4 1D 8E 4A 00 00 3E 4F 30 4D 8E 43 00 00
-61 3F 00 00 03 46 57 31 84 12 CE 58 00 00 F4 58
-03 46 57 32 84 12 CE 58 00 00 00 59 03 46 57 33
-84 12 CE 58 00 00 0C 59 04 47 4F 54 4F 00 87 12
-3C 57 30 4A 14 48 2A 40 7C 58 05 3F 47 4F 54 4F
-87 12 5A 58 30 4A 14 48 2A 40 D2 C3 23 02 E2 B2
-60 02 02 24 30 40 52 4F 1A 52 04 20 19 62 06 20
-92 43 14 20 A2 93 02 20 07 24 0A 5A 49 69 82 4A
-16 20 C2 49 18 20 0A 3C C2 4A 15 20 8A 10 C2 4A
-16 20 C2 49 17 20 89 10 C2 49 18 20 B0 12 C0 59
-7A 93 FC 23 0A 43 39 40 05 00 D2 49 14 20 4E 06
-82 93 46 06 05 24 92 B3 6C 06 FD 27 C2 93 4C 06
-59 83 F3 2F 19 83 0B 30 F2 43 4E 06 82 93 46 06
-03 24 92 B3 6C 06 FD 27 5A 92 4C 06 F3 23 30 41
-19 43 3A 43 8A 10 C2 4A 4E 06 82 93 46 06 05 24
-92 B3 6C 06 FD 27 C2 93 4C 06 19 83 F3 23 5A 42
-4C 06 30 41 1A 52 08 20 09 43 1C D3 F2 40 51 00
-19 20 B0 12 3A 59 34 20 B0 12 C0 59 7A 90 FE FF
-04 24 FA 23 D9 42 4C 06 FF 1D F2 43 4E 06 03 43
-19 53 39 90 01 02 F6 23 F2 43 4E 06 3C C0 03 00
-D2 D3 23 02 30 41 09 43 2C D3 F0 40 58 00 EB C5
-B0 12 3A 59 15 20 3A 40 FE FF 29 43 B0 12 C4 59
-D2 49 00 1E 4E 06 03 43 19 53 39 90 00 02 F8 23
-39 40 03 00 B0 12 C2 59 7A C0 E1 00 6A 92 DE 27
-8C 10 1C 52 4C 06 D2 D3 23 02 87 12 E8 45 0B 3C
-20 53 44 20 45 72 72 6F 72 21 7C 5A 2F 82 8F 4E
-02 00 9F 42 DA 1D 00 00 B2 40 10 00 DA 1D 0E 4C
-B0 12 2A 40 30 43 36 42 FC 40 9C 49 39 4F 18 42
-C4 1D 4A 4E 0E 48 C8 4A 00 00 18 53 30 40 B4 4D
-92 4B 0E 00 22 20 92 4B 10 00 24 20 5A 42 23 20
-58 42 22 20 A2 93 02 20 02 24 08 58 30 41 59 42
-24 20 89 10 0A 59 88 10 08 58 0A 6A 88 10 08 58
-30 41 82 43 1C 20 92 42 0E 20 1A 20 C2 93 24 20
-03 20 92 93 22 20 14 24 92 42 22 20 D0 04 92 42
-24 20 D2 04 92 42 12 20 C8 04 92 42 E4 04 1A 20
-92 42 E6 04 1C 20 92 52 10 20 1A 20 82 63 1C 20
-30 41 92 4B 0E 00 22 20 92 4B 10 00 24 20 B0 12
-E2 5A 5A 4B 03 00 82 5A 1A 20 82 63 1C 20 30 41
-09 93 07 24 F8 90 20 00 00 1E 03 20 18 53 19 83
-F9 23 30 41 1B 42 34 20 82 43 1E 20 B2 90 00 02
-20 20 9A 20 BB 80 00 02 12 00 8B 73 14 00 DB 53
-03 00 DB 92 12 20 03 00 11 28 CB 43 03 00 B0 12
-B0 5A B0 12 E4 59 8B 43 10 00 9B 48 00 1E 0E 00
-92 93 02 20 03 24 9B 48 02 1E 10 00 B2 40 00 02
-20 20 8B 93 14 00 0B 20 92 9B 12 00 1E 20 74 2C
-BB 90 00 02 12 00 03 2C 92 4B 12 00 20 20 B0 12
-22 5B 1A 42 1A 20 19 42 1C 20 0F 3F 3C 42 3B 40
-40 20 09 43 CB 93 02 00 10 24 9B 92 24 20 0C 00
-04 20 9B 92 22 20 0A 00 07 24 09 4B 3B 50 18 00
-3B 90 00 21 EF 23 0C 5C 30 41 0C 43 82 4B 34 20
-8B 49 00 00 4A 93 07 34 49 93 05 24 C9 93 02 00
-02 34 5A 59 02 00 CB 4A 02 00 CB 43 03 00 9B 42
-1A 20 04 00 9B 42 1C 20 06 00 18 42 30 20 8B 48
-08 00 9B 48 1A 1E 0A 00 9B 48 14 1E 0C 00 9B 48
-1A 1E 0E 00 9B 48 14 1E 10 00 9B 48 1C 1E 12 00
-9B 48 1E 1E 14 00 82 43 1E 20 6A 93 62 27 CC 37
-8B 43 16 00 7A 93 05 24 99 37 99 52 C2 1D 16 00
-95 3F 92 42 BE 1D 36 20 92 82 C2 1D 36 20 92 42
-C0 1D 38 20 92 52 C2 1D 38 20 B2 40 EC 43 64 44
-92 42 BE 1D C2 1D 82 3F 1B 42 34 20 82 43 20 20
-0B 93 AA 27 EB 93 02 00 04 20 B0 12 08 61 B0 12
-D0 60 5A 4B 02 00 CB 43 02 00 2B 4B 82 4B 34 20
-5A 53 05 24 99 37 92 4B 16 00 1E 20 67 3F 1E 42
-36 20 9F 42 38 20 02 00 B2 40 72 44 64 44 8C 3F
-74 4E 85 52 45 41 44 22 5A 43 19 3C 40 4F 86 57
-52 49 54 45 22 00 6A 43 12 3C 00 4D 84 44 45 4C
-22 00 6A 42 0C 3C 0C 52 05 43 4C 4F 53 45 B0 12
-98 5C 30 4D 9C 4D 85 4C 4F 41 44 22 7A 43 2F 83
-8F 4E 00 00 0E 4A 82 93 B6 1D 0D 24 87 12 34 40
-34 40 1E 48 1E 48 02 46 34 40 9C 5A 1E 48 34 40
-52 5D 1E 48 2A 40 87 12 34 40 22 00 42 46 50 5D
-3D 41 2F 83 78 4E 08 5E C8 43 00 00 1C 43 92 42
-2C 20 22 20 92 42 2E 20 24 20 CE 93 00 00 96 24
-FE 90 3A 00 01 00 01 20 2E 53 FE 90 5C 00 00 00
-09 20 1E 53 92 42 02 20 22 20 82 43 24 20 CE 93
-00 00 76 24 82 4E 32 20 B0 12 E2 5A BF 40 20 00
-00 00 A2 93 02 20 04 24 92 92 22 20 02 20 03 24
-9F 42 12 20 00 00 B0 12 C2 5B 2C 43 0A 43 08 4A
-58 0E 08 58 82 48 30 20 C8 93 00 1E 67 24 39 42
-F8 9E 00 1E 04 20 18 53 19 83 FA 23 1E 53 FE 90
-2E 00 FF FF 1B 24 39 50 03 00 B0 12 40 5B 07 20
-FE 90 5C 00 FF FF 2C 24 CE 93 FF FF 29 24 1E 42
-32 20 1A 53 3A 90 10 00 DA 23 92 53 1A 20 82 63
-1C 20 9F 83 00 00 CF 23 2C 42 40 3C FE 90 2E 00
-FE FF ED 27 B0 12 40 5B EA 23 39 40 03 00 F8 9E
-00 1E 04 20 18 53 19 83 FA 23 0A 3C CE 93 FF FF
-DE 23 FE 90 5C 00 FF FF DA 23 B0 12 40 5B D7 23
-18 42 30 20 92 48 1A 1E 22 20 92 48 14 1E 24 20
-F8 B0 10 00 0B 1E 16 24 82 93 24 20 06 20 82 93
-22 20 03 20 92 42 02 20 22 20 CE 93 FF FF 87 23
-92 42 22 20 2C 20 92 42 24 20 2E 20 2F 52 3E 4F
-3D 41 30 4D 1A 4F 02 00 B0 12 CC 5B 2F 53 3A 4F
-3E 4F 7A 93 12 20 0C 93 01 20 30 4D 87 12 E8 45
-0B 3C 20 4F 70 65 6E 45 72 72 6F 72 54 45 84 43
-74 48 CC 45 94 45 BC 41 7A 5A 1A 93 B5 20 0C 93
-ED 23 30 4D E2 5C 04 52 45 41 44 00 2F 83 8F 4E
-00 00 1E 42 34 20 B0 12 54 5B 1E 82 34 20 30 4D
-2C 43 12 12 2A 20 18 42 02 20 08 58 2A 41 82 9A
-0A 20 A0 24 B0 12 E4 59 09 43 28 93 03 24 89 93
-02 1E 03 20 89 93 00 1E 07 24 09 58 39 90 00 02
-F4 23 91 53 00 00 EA 3F 0C 43 6A 41 B9 43 00 1E
-28 93 0F 24 B9 40 FF 0F 02 1E 09 11 8A 10 09 5A
-5A 41 01 00 0A 11 09 10 82 4A 28 20 82 49 26 20
-07 3C 09 11 C2 49 26 20 C2 4A 27 20 82 43 28 20
-3A 41 82 4A 2A 20 30 41 0A 12 1A 52 08 20 B0 12
-26 5A 3A 41 1A 52 0C 20 30 40 26 5A F2 B0 40 00
-A2 04 29 20 F2 B0 10 00 A2 04 FC 27 5A 42 B0 04
-4A 11 59 42 B4 04 F2 40 20 00 C0 04 D2 42 B1 04
-C8 04 1A 52 E4 04 D2 42 B5 04 C8 04 19 52 E4 04
-D2 42 B2 04 C0 04 B2 40 00 08 C8 04 1A 52 E4 04
-92 42 B6 04 C0 04 B2 80 BC 07 C0 04 B2 40 00 02
-C8 04 19 52 E4 04 30 41 22 2A 2B 2C 2F 3A 3B 3C
-3D 3E 3F 5B 5C 5D 7C 2E 29 92 06 38 39 80 03 00
-B0 12 26 60 39 40 03 00 7A 4B C8 4A 00 1E 0A 93
-12 24 0D 12 3D 40 0F 00 3C 40 D8 5F 7A 9C F4 27
-1D 83 FC 23 3D 41 6A 9C E7 27 3A 80 21 00 EC 3B
-18 53 19 83 E9 23 09 93 06 24 F8 40 20 00 00 1E
-18 53 19 83 FA 23 30 41 2A 93 E4 20 2C 93 0D 24
-0C 93 BA 24 87 12 E8 45 0C 3C 20 57 72 69 74 65
-45 72 72 6F 72 00 BC 41 BC 5E B0 12 F0 5E 92 42
-26 20 22 20 92 42 28 20 24 20 B0 12 68 5F B0 12
-C2 5B 18 42 30 20 F8 40 20 00 0B 1E B0 12 7C 5F
-88 43 0C 1E 88 4A 0E 1E 88 49 10 1E 88 49 12 1E
-98 42 24 20 14 1E 98 42 22 20 1A 1E 88 43 1C 1E
-88 43 1E 1E 1C 43 1B 42 32 20 CB 93 00 00 CA 27
-FB 90 2E 00 00 00 C6 27 39 40 0B 00 B0 12 F8 5F
-B0 12 12 61 2A 43 B0 12 CC 5B 0C 93 BB 23 30 4D
-1A 4B 04 00 19 4B 06 00 B0 12 EA 59 B0 12 7C 5F
-18 4B 08 00 88 49 12 1E 88 4A 16 1E 88 49 18 1E
-98 4B 12 00 1C 1E 98 4B 14 00 1E 1E 1A 4B 04 00
-19 4B 06 00 30 40 28 5A 9B 52 1E 20 12 00 8B 63
-14 00 1A 42 1A 20 19 42 1C 20 30 40 28 5A B2 40
-00 02 1E 20 1B 42 34 20 B0 12 08 61 82 43 1E 20
-DB 53 03 00 DB 92 12 20 03 00 22 20 CB 43 03 00
-B0 12 B0 5A 08 12 0A 12 B0 12 F0 5E 2A 91 05 24
-B0 12 68 5F 2A 41 B0 12 E4 59 3A 41 38 41 98 42
-26 20 00 1E 92 93 02 20 03 24 98 42 28 20 02 1E
-B0 12 68 5F 9B 42 26 20 0E 00 9B 42 28 20 10 00
-30 40 22 5B EE 5C 05 57 52 49 54 45 B0 12 1E 61
-30 4D D6 5E 07 53 44 5F 45 4D 49 54 B2 90 00 02
-1E 20 02 28 B0 12 1E 61 18 42 1E 20 C8 4E 00 1E
-92 53 1E 20 3E 4F 30 4D 58 4B 13 00 5C 4B 14 00
-8C 10 0C 58 5A 4B 15 00 0A 11 0C 10 18 4B 12 00
-BB C0 FF 01 12 00 38 F0 FF 01 82 48 1E 20 5B 42
-12 20 B0 12 5E 42 1B 42 34 20 CB 4A 03 00 19 5B
-0A 00 18 6B 0C 00 8B 49 0E 00 8B 48 10 00 B0 12
-BE 5B 30 4D 0C 93 38 20 38 90 E0 01 03 2C C8 93
-20 1E 02 24 7C 40 E5 00 C8 4C 00 1E B0 12 12 61
-B0 12 BC 5A 82 4A 2A 20 0B 4A B0 12 E4 59 1A 48
-00 1E 88 43 00 1E 92 93 02 20 09 24 19 48 02 1E
-88 43 02 1E 39 F0 FF 0F 39 90 FF 0F 02 20 3A 93
-0E 24 82 4A 22 20 82 49 24 20 B0 12 BC 5A 0B 9A
-E6 27 0A 12 0A 4B B0 12 68 5F 3A 41 DD 3F 0A 4B
-B0 12 68 5F B0 12 98 5C 30 4D B0 4C 08 54 45 52
-4D 32 53 44 22 00 87 12 02 5D 84 43 8E 62 21 53
-2F 83 AF 43 00 00 3D 40 9E 62 30 40 52 5D A0 62
-92 C3 DC 05 08 43 B0 12 A6 44 92 B3 DC 05 FD 27
-59 42 CC 05 69 92 0D 24 C8 49 00 1E 18 53 38 90
-FF 01 04 24 F2 2B B0 12 1E 61 EC 3F B0 12 B8 44
-EC 3F B0 12 B8 44 82 48 1E 20 B0 12 98 5C 3D 41
-30 4D 2A 46 02 2E 53 00 87 12 34 40 3C 00 48 45
-E0 40 70 43 34 40 08 00 48 45 34 40 3E 00 48 45
-94 45 CE 40 34 40 80 1C B2 41 C0 41 24 63 CE 40
-34 40 7E 1C CA 41 02 42 F4 40 30 43 34 40 FE FF
-DA 41 16 63 2A 40 02 47 01 3F 2E 4E 30 40 30 43
-86 61 05 57 4F 52 44 53 87 12 36 42 F4 40 34 40
-0A 00 36 42 FC 40 88 45 34 40 03 00 AA 45 34 40
-10 00 70 43 E8 45 14 74 68 72 65 61 64 73 20 76
-6F 63 61 62 75 6C 61 72 69 65 73 00 CC 45 36 42
-FC 40 34 40 CA 1D 44 40 6A 4C 6E 40 F4 40 54 40
-C0 41 20 64 88 45 34 40 03 00 AA 45 44 40 34 40
-E2 1C 34 40 10 00 44 40 22 41 A2 4D 34 40 00 00
-44 40 34 40 10 00 44 40 22 41 34 40 00 00 CA 41
-44 40 02 42 34 40 E2 1C 22 41 F4 40 B2 41 C0 41
-D2 63 62 40 62 40 02 42 44 40 34 40 E2 1C 22 41
-F4 40 34 40 02 00 DA 41 B0 63 54 40 C0 41 16 64
-44 40 34 40 02 00 2A 41 F4 40 92 40 34 40 E2 1C
-22 41 FC 40 44 40 74 48 34 40 7F 00 38 41 CC 45
-0A 41 34 40 0F 00 38 41 34 40 10 00 6E 40 2A 41
-AA 45 BC 41 9C 63 62 40 62 40 88 45 BC 41 76 63
-62 40 2A 40 16 5D 03 4D 41 58 2E 9F 07 38 2F 53
-30 4D 26 64 03 4D 49 4E 2E 9F F9 3B 3E 4F 30 4D
-7C 62 03 55 2E 52 87 12 A8 40 56 42 34 40 00 00
-98 42 CC 42 E6 42 B4 40 80 40 2A 41 34 40 00 00
-2A 64 AA 45 CC 45 2A 40 FC 5C 04 44 55 4D 50 00
-0D 12 12 12 DA 1D B2 40 10 00 DA 1D 2E 5F BF F0
-F0 FF 00 00 B0 12 2A 40 6E 40 CA 41 88 45 02 42
-34 40 07 00 46 64 94 45 02 42 34 40 10 00 22 41
-02 42 CA 41 02 42 0A 41 34 40 03 00 46 64 EC 41
-A4 64 94 45 94 45 02 42 34 40 10 00 22 41 02 42
-CA 41 02 42 0A 41 34 40 7E 00 38 64 4C 42 2A 64
-48 45 EC 41 C2 64 34 40 10 00 DA 41 8C 64 B4 40
-36 42 FC 40 2A 40 94 61 06 53 45 43 54 5F 44 00
-09 4E 2A 4F B0 12 EA 59 87 12 1C 43 34 40 00 1E
-34 40 00 02 70 64 2A 40 08 5D 07 43 4C 55 53 54
-5F 44 82 4E 24 20 A2 4F 22 20 B0 12 E2 5A 9F 42
-1A 20 00 00 1E 42 1C 20 E3 3F 2E 4A 05 46 41 54
-5F 44 2F 82 8F 4E 02 00 9F 42 08 20 00 00 0E 43
-D7 3F 6A 64 05 44 49 52 5F 44 2F 82 8F 4E 02 00
-92 42 2C 20 22 20 92 42 2E 20 24 20 DE 3F
-@FFB4
-58 4F 58 4F 58 4F 58 4F 58 4F 58 4F 58 4F 58 4F
-58 4F 58 4F 58 4F 58 4F 58 4F 58 4F 58 4F 58 4F
-58 4F 58 4F 58 4F 58 4F 58 4F 58 4F 58 4F 58 4F
-58 4F 58 4F 58 4F 58 4F 58 4F 58 4F E6 44 58 4F
-58 4F 58 4F 58 4F 58 4F 58 4F 58 4F
-q
+++ /dev/null
-@1800
-10 00 6A 44 80 3E 80 04 FD FF 18 00 58 57 0E 50
-2A 44 3C 44 00 00 00 00
-@1DAA
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00
-@4000
-3A 41 0D 12 0D 4A 30 4D 2F 83 8F 4E 00 00 3E 41
-2E 4E 30 4D 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E
-30 4D 00 00 04 45 58 49 54 00 3D 41 30 4D 00 00
-03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 40
-03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
-44 55 50 00 0E 93 F6 23 30 4D 40 40 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 40 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E 40 02 3E 52 00 0E 12 3E 4F 30 4D 8E 40
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 40
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C 40 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 40 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 41
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 40 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA 40 03 41 4E 44 3E FF 30 4D 7A 40 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E 41 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 41 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E 41 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 41 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 40 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
-3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE 41 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 41 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 41 03 3E 49 4E 85 12 C2 1D 10 41
-04 42 41 53 45 00 85 12 DA 1D C0 40 05 53 54 41
-54 45 85 12 B6 1D 30 42 02 42 4C 00 85 12 20 00
-94 41 02 3C 23 00 B2 40 AA 1D AA 1D 30 4D 1E 15
-0E 43 3D 40 20 00 0A 93 04 20 0D 11 0A 4C 0C 43
-09 43 0E 9B 01 28 0E 8B 09 69 08 68 1D 83 07 30
-0C 5C 0A 6A 0E 6E F5 2B 0E 8B 12 D3 F5 3F 0A 4E
-1D 17 30 41 48 42 01 23 1B 42 DA 1D 2C 4F 0A 4E
-B0 12 5E 42 8F 49 00 00 0E 48 7A 90 0A 00 02 28
-3A 50 07 00 3A 50 30 00 92 83 AA 1D 18 42 AA 1D
-C8 4A 00 00 30 4D 96 42 02 23 53 00 87 12 98 42
-D2 42 2D 83 09 93 E0 23 0E 93 DE 23 3D 41 30 4D
-C8 42 02 23 3E 00 9F 42 AA 1D 00 00 3E 40 AA 1D
-2E 8F 30 4D 00 42 04 48 4F 4C 44 00 0A 4E 3E 4F
-DB 3F 3C 42 04 53 49 47 4E 00 0E 93 3E 4F 3A 40
-2D 00 D2 33 30 4D F4 41 03 55 44 2E 87 12 56 42
-CC 42 E6 42 50 45 18 45 2A 40 18 43 02 55 2E 00
-2F 83 8F 4E 00 00 0E 43 F1 3F 3E B0 00 80 06 24
-BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D DA 40
-02 44 2E 00 87 12 56 42 6E 40 80 40 3A 43 CC 42
-92 40 0A 43 E6 42 50 45 18 45 2A 40 52 41 01 2E
-3E B0 00 80 DD 27 2F 83 3E 43 EC 3F F6 42 04 48
-45 52 45 00 2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D
-62 41 05 41 4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D
-E2 42 02 43 2C 00 1A 42 C4 1D CA 4E 00 00 92 53
-C4 1D 3E 4F 30 4D 2F 83 8F 4E 00 00 B0 12 2A 44
-92 B3 DC 05 FD 27 1E 42 CC 05 B0 12 3C 44 30 4D
-30 40 B6 43 7E 43 05 28 4B 45 59 29 18 42 CC 05
-EA 3F 12 42 03 4B 45 59 30 40 DC 43 92 43 06 41
-43 43 45 50 54 00 3C 40 A8 44 3B 40 72 44 2D 15
-0A 4E 2E 4F 0A 5E 3B 40 0D 00 3C 40 20 00 3D 40
-9C 44 92 B3 DC 05 05 24 18 42 CC 05 38 90 0A 00
-04 20 21 53 39 40 56 44 4D 15 B2 40 11 00 CE 05
-A2 B3 DC 05 FD 27 E2 C2 23 02 30 41 B2 40 13 00
-CE 05 A2 B3 DC 05 FD 27 E2 D2 23 02 30 41 00 00
-05 53 4C 45 45 50 30 40 64 44 00 00 07 28 53 4C
-45 45 50 29 12 D2 0A 18 F6 3F 21 52 3A 17 58 42
-CC 05 48 9B E3 27 48 9C 06 2C 78 92 11 20 2E 9F
-0F 24 1E 83 05 3C 0E 9A 03 24 CE 48 00 00 1E 53
-82 48 CE 05 A2 B3 DC 05 FD 27 30 4D 9E 44 2D 83
-92 B3 DC 05 FD 27 E3 23 B2 40 18 00 0A 18 3E 8F
-3D 41 30 4D D6 43 06 28 45 4D 49 54 29 00 08 4E
-3E 4F E6 3F 50 43 04 45 4D 49 54 00 30 40 BE 44
-C6 44 04 45 43 48 4F 00 B2 40 82 48 90 44 30 4D
-6E 43 06 4E 4F 45 43 48 4F 00 B2 40 30 4D 90 44
-30 4D B6 44 04 28 43 52 29 00 2F 83 8F 4E 00 00
-3E 40 0D 00 E3 3F A2 43 02 43 52 00 30 40 FA 44
-04 43 05 53 50 41 43 45 2F 83 8F 4E 00 00 3E 40
-20 00 D4 3F 12 45 06 53 50 41 43 45 53 00 0E 93
-09 24 0D 12 3D 40 3A 45 EF 3F 3C 45 2D 83 1E 83
-EB 23 3D 41 3E 4F 30 4D 2C 43 04 54 59 50 45 00
-0E 93 95 24 2A 4F 8F 5E 00 00 0E 4A 87 12 CA 41
-02 42 0A 41 CC 44 EC 41 60 45 2A 40 2F 82 8F 4E
-02 00 7E 4D 8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D
-26 45 82 53 22 00 87 12 34 40 6C 45 A2 47 34 40
-22 00 C6 45 96 45 3D 41 6E 4E 1E 83 82 5E C4 1D
-3E 4F 92 B3 C4 1D A2 63 C4 1D 30 4D E2 44 82 2E
-22 00 87 12 86 45 34 40 50 45 A2 47 2A 40 00 00
-04 57 4F 52 44 00 3C 40 BE 1D 39 4C 3A 4C 09 5A
-3A 5C 28 4C 09 9A 19 24 7E 9A FC 27 1A 83 3B 40
-60 00 C8 4C 00 00 09 9A 0C 24 7C 4A 4E 9C 09 24
-18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F 7C 80 20 00
-F0 3F 1A 82 C0 1D 82 4A C2 1D 1E 42 C4 1D 08 8E
-CE 48 00 00 30 4D 00 00 04 46 49 4E 44 00 2F 83
-0C 4E 65 4C 74 40 80 00 3B 40 CA 1D 3E 4B 0E 93
-1E 24 58 4C 01 00 78 F0 1E 00 0E 58 2E 53 1E 4E
-FE FF 0E 93 F3 27 09 4E 78 49 48 C4 48 95 F7 23
-0A 4C 1A 53 FA 99 00 00 F2 23 58 83 FA 23 19 B3
-09 63 0C 49 6A 4E 1E 43 4A 93 01 30 2E 83 8F 4C
-00 00 35 40 08 40 34 40 14 40 30 4D 2F 53 2F 53
-3E 4F 30 4D 26 42 07 3E 4E 55 4D 42 45 52 3C 4F
-38 4F 29 4F 2F 82 1B 42 DA 1D 6A 4C 7A 80 30 00
-7A 90 0A 00 02 28 7A 80 07 00 0A 9B 13 2C 82 49
-D0 04 82 48 D2 04 82 4B C8 04 19 42 E4 04 18 42
-E6 04 09 5A 08 63 1C 53 1E 83 E7 23 8F 49 04 00
-8F 48 02 00 8F 4C 00 00 30 4D 03 12 0D 12 1B 42
-DA 1D 0B 12 32 C0 00 02 6D 4E 0D 5E 0C 4E 7A 40
-2E 00 0D 9C 0A 28 7A 9C FC 23 32 D0 00 02 FC 4C
-FE FF 0D 9C FC 2F DE 83 00 00 09 43 08 43 3D 40
-50 47 3F 82 8F 4E 06 00 0C 4E 7E 4C 6A 4C 7A 90
-2D 00 10 2C 3B 40 10 00 7A 80 24 00 06 24 2B 43
-5A 83 03 24 3B 52 6A 53 B0 23 1C 53 1E 83 6A 4C
-7A 90 2D 00 AA 23 1C 53 1E 83 B1 43 04 00 A5 3F
-52 47 2F 53 0E 93 2C 17 82 4C DA 1D 03 24 2F 52
-0E F3 30 4D 9F 4F 02 00 04 00 BF 4F 00 00 3E E3
-09 20 3E E3 BF E3 02 00 BF E3 00 00 9F 53 02 00
-8F 63 00 00 32 B0 00 02 01 20 2F 53 30 4D D2 44
-07 45 58 45 43 55 54 45 0A 4E 3E 4F 00 4A 28 41
-01 2C 1A 42 C4 1D A2 53 C4 1D 8A 4E 00 00 3E 4F
-30 4D A0 47 87 4C 49 54 45 52 41 4C 82 93 B6 1D
-16 24 32 B0 00 02 09 24 1A 42 C4 1D A2 52 C4 1D
-BA 40 34 40 00 00 BA 4F 02 00 1A 42 C4 1D A2 52
-C4 1D BA 40 34 40 00 00 8A 4E 02 00 3E 4F 30 4D
-08 45 05 43 4F 55 4E 54 2F 83 1E 53 8F 4E 00 00
-5E 4E FF FF 30 4D 82 4E BE 1D B2 4F C0 1D 3E 4F
-82 43 C2 1D 87 12 4C 42 C6 45 1C 48 3D 40 28 48
-FE 22 3D 41 3E 4F 30 4D 2A 48 0A 4E 3E 4F 3D 40
-40 48 53 27 3D 40 16 48 1A E2 B6 1D B2 27 AC 23
-42 48 3E 4F 3D 40 16 48 B9 23 DE 53 00 00 68 4E
-08 5E F8 40 3F 00 00 00 3D 40 0C 4A CD 3F 90 47
-08 45 56 41 4C 55 41 54 45 00 39 40 BE 1D 39 12
-39 12 39 12 0D 12 B0 12 2A 40 06 48 7E 48 3D 41
-B2 41 C2 1D B2 41 C0 1D B2 41 BE 1D 30 4D 7A 41
-04 51 55 49 54 00 31 40 E0 1C B2 40 00 1C 00 1C
-82 43 B6 1D 82 43 08 18 B0 12 2A 40 6C 45 04 0D
-6F 6B 20 00 50 45 34 40 38 1D 44 40 34 40 50 00
-F6 43 18 45 06 48 34 40 7E 1C CE 40 B2 41 6C 45
-0D 73 74 61 63 6B 20 65 6D 70 74 79 20 21 1A 49
-34 40 30 FF 84 43 B2 41 6C 45 0B 46 52 41 4D 20
-66 75 6C 6C 20 21 1A 49 42 42 F4 40 C0 41 AC 48
-6C 45 04 0D 20 20 20 00 BC 41 B4 48 EE 43 05 41
-42 4F 52 54 3F 40 80 1C BE 3F 8F 93 02 00 AE 26
-B2 40 82 48 90 44 B0 12 0C 4E 82 43 D2 56 82 43
-DE 56 82 43 EA 56 82 43 1A 57 82 43 26 57 82 43
-32 57 A2 B3 DC 05 FD 27 B2 40 11 00 CE 05 E2 C2
-23 02 92 C3 DC 05 38 40 A0 AA 39 42 19 83 FE 23
-18 83 FB 23 92 B3 DC 05 F4 23 87 12 6C 45 04 1B
-5B 37 6D 00 50 45 50 45 6C 45 04 1B 5B 30 6D 00
-50 45 4E 4D 90 4D 96 4D 14 49 0E 49 86 41 42 4F
-52 54 22 00 87 12 86 45 34 40 1A 49 A2 47 2A 40
-18 46 01 27 87 12 4C 42 C6 45 1E 46 C0 41 B2 49
-2A 40 4A 48 52 42 81 5C 92 42 BE 1D C2 1D 30 4D
-87 12 A2 45 4C 42 C6 45 CA 49 08 4E 7A 4E 5A D3
-5A 53 0A 58 19 42 C8 1D 6E 4E 3E F0 1E 00 09 5E
-82 48 AE 1D 82 49 B0 1D 82 4A B2 1D 2A 52 82 4A
-C4 1D 3E 4F 3D 41 30 41 87 12 6C 45 0F 73 74 61
-63 6B 20 6D 69 73 6D 61 74 63 68 21 20 49 82 9F
-B4 1D F2 23 18 42 AE 1D 19 42 B0 1D A8 49 FE FF
-89 48 00 00 30 4D C0 45 08 56 41 52 49 41 42 4C
-45 00 B0 12 C0 49 BA 40 86 12 FC FF EF 3F F2 47
-08 43 4F 4E 53 54 41 4E 54 00 B0 12 C0 49 BA 40
-85 12 FC FF 8A 4E FE FF 3E 4F E0 3F 40 4A 06 43
-52 45 41 54 45 00 B0 12 C0 49 BA 40 85 12 FC FF
-8A 4A FE FF D3 3F 60 48 05 44 4F 45 53 3E 1A 42
-B2 1D BA 40 84 12 00 00 8A 4D 02 00 3D 41 30 4D
-78 4A 05 44 45 46 45 52 B0 12 C0 49 BA 40 30 40
-FC FF BA 40 8E 4A FE FF B9 3F 00 00 81 5B 82 43
-B6 1D 30 4D B6 49 01 5D B2 43 B6 1D 30 4D 82 45
-87 52 45 43 55 52 53 45 19 42 C4 1D 99 42 B2 1D
-00 00 A2 53 C4 1D 30 4D AC 4A 01 3A B0 12 C0 49
-BA 40 87 12 FC FF A2 83 C4 1D B2 43 B6 1D 82 4F
-B4 1D 30 4D DA 4A 81 3B 82 93 B6 1D 5D 27 87 12
-34 40 2A 40 A2 47 0E 4A AE 4A 2A 40 F4 44 09 49
-4D 4D 45 44 49 41 54 45 1A 42 AE 1D FA D0 80 00
-00 00 30 4D BE 4F 02 00 3E 4F 30 4D 0E 4B 82 49
-53 00 87 12 42 42 F4 40 C0 41 46 4B 52 4B 34 40
-24 4B A2 47 2A 40 A4 49 24 4B 2A 40 F6 4A 83 5B
-27 5D 87 12 A4 49 34 40 34 40 A2 47 A2 47 2A 40
-90 48 88 50 4F 53 54 50 4F 4E 45 00 87 12 4C 42
-C6 45 1E 46 54 40 C0 41 B2 49 7E 41 C0 41 8C 4B
-34 40 34 40 A2 47 A2 47 34 40 A2 47 A2 47 2A 40
-92 4B 3A 4E 82 4A C6 1D 2E 4E 82 4E C4 1D 3D 40
-10 00 09 4A 08 49 29 83 18 48 FE FF 0E 98 FC 2B
-89 48 00 00 1D 83 F6 23 2A 4A 0A 93 F0 23 3E 4F
-3D 41 30 4D 2E 4B 82 49 46 00 2F 83 8F 4E 00 00
-1E 42 C4 1D BE 40 C0 41 00 00 A2 52 C4 1D 2E 53
-30 4D 92 4A 84 45 4C 53 45 00 1A 42 C4 1D BA 40
-BC 41 00 00 2A 52 82 4A C4 1D 8E 4A 00 00 2A 83
-0E 4A 30 4D 4A 45 84 54 48 45 4E 00 9E 42 C4 1D
-00 00 3E 4F 30 4D 5E 4A 85 42 45 47 49 4E 30 40
-84 43 06 4C 85 55 4E 54 49 4C 39 40 C0 41 1A 42
-C4 1D A2 52 C4 1D 8A 49 00 00 8A 4E 02 00 3E 4F
-30 4D 8C 49 85 41 47 41 49 4E 39 40 BC 41 EF 3F
-28 4A 85 57 48 49 4C 45 87 12 CA 4B 6E 40 2A 40
-C0 4A 86 52 45 50 45 41 54 00 87 12 4A 4C 0C 4C
-2A 40 E4 4B 82 44 4F 00 2F 83 8F 4E 00 00 1E 42
-C4 1D BE 40 CA 41 00 00 2E 53 82 4E C4 1D A2 53
-00 1C 1A 42 00 1C 8A 43 00 00 30 4D B4 47 84 4C
-4F 4F 50 00 39 40 EC 41 1A 42 C4 1D A2 52 C4 1D
-8A 49 00 00 8A 4E 02 00 1E 42 00 1C A2 83 00 1C
-2E 4E 0E 93 04 24 9E 42 C4 1D 00 00 F5 3F 3E 4F
-30 4D E4 43 85 2B 4C 4F 4F 50 39 40 DA 41 E4 3F
-9E 4C 85 4C 45 41 56 45 1A 42 C4 1D BA 40 FC 41
-00 00 BA 40 BC 41 02 00 B2 50 06 00 C4 1D A2 53
-00 1C 2A 52 19 42 00 1C 89 4A 00 00 30 4D E2 4C
-04 4D 4F 56 45 00 0A 4E 38 4F 39 4F 3E 4F 0A 93
-11 24 08 99 0F 24 06 2C F8 49 00 00 18 53 1A 83
-FB 23 30 4D 08 5A 09 5A 19 83 18 83 E8 49 00 00
-1A 83 FA 23 30 4D 34 40 CA 1D FC 40 2A 40 84 12
-46 4D 54 50 2A 50 74 4C A2 49 12 50 D4 4C 10 4D
-AE 45 B4 4D E8 4D 24 4C AE 4E 48 41 4E 4B B6 4A
-86 46 00 00 3A 40 0C 00 39 40 CA 1D 38 40 CC 1D
-D9 3F 3A 40 0E 00 39 40 CC 1D 38 40 CA 1D CC 3F
-82 43 CC 1D 30 4D 92 42 CA 1D C8 1D 30 4D 62 4B
-09 50 57 52 5F 53 54 41 54 45 84 12 90 4B 0E 50
-58 57 A0 4D 08 50 57 52 5F 48 45 52 45 00 92 42
-C4 1D B0 4D 92 42 C6 1D AE 4D EF 3F 62 4C 09 52
-53 54 5F 53 54 41 54 45 92 42 0C 18 B0 4D 92 42
-0E 18 AE 4D E2 3F CE 4D 08 52 53 54 5F 48 45 52
-45 00 92 42 C4 1D 0C 18 92 42 C6 1D 0E 18 DF 3F
-B2 40 54 4E B6 4E B2 40 64 44 58 44 B2 40 BE 44
-CE 44 B2 40 FA 44 0E 45 B2 40 DC 43 EA 43 30 41
-52 4C 04 57 49 50 45 00 39 40 80 FF B9 43 00 00
-29 53 39 90 B4 FF FA 23 B0 12 00 4E B2 40 58 57
-C4 1D B2 40 0E 50 C6 1D D4 3F C6 4B 06 28 57 41
-52 4D 29 00 1E 42 08 18 87 12 6C 45 05 0D 1B 5B
-37 6D 50 45 70 43 6C 45 27 20 46 61 73 74 46 6F
-72 74 68 20 56 31 36 30 20 31 36 4D 48 7A 20 28
-43 29 20 4A 2E 4D 2E 54 68 6F 6F 72 65 6E 73 20
-50 45 34 40 30 FF 84 43 2A 41 30 43 6C 45 0B 62
-79 74 65 73 20 66 72 65 65 20 26 49 22 4E 04 57
-41 52 4D 00 30 40 54 4E 18 4C 04 43 4F 4C 44 00
-B2 40 04 A5 20 01 B2 40 88 5A 5C 01 B2 D0 03 00
-04 02 B2 40 FC FF 02 02 B2 C0 03 00 06 02 B2 D0
-00 04 24 02 B2 D3 26 02 B2 43 22 02 B2 43 42 02
-B2 D3 46 02 B2 43 62 02 B2 D3 66 02 F2 43 26 03
-F2 D3 22 03 F2 40 A5 00 41 01 F2 40 10 00 40 01
-D2 43 41 01 F2 40 A5 00 61 01 B2 40 48 00 62 01
-82 43 66 01 39 40 80 00 B2 40 33 00 64 01 D2 43
-61 01 92 D2 9E 01 08 18 A2 93 08 18 01 24 59 07
-38 40 C2 A2 18 83 FE 23 19 83 FA 23 B2 42 B0 01
-F2 D0 10 00 2A 03 F2 C0 40 00 A2 04 3A 40 C6 4E
-39 40 B4 FF 89 4A 00 00 29 53 FC 23 92 42 02 18
-F0 FF B2 40 18 00 0A 18 31 40 E0 1C 3F 40 80 1C
-37 40 00 40 36 40 B4 40 35 40 08 40 34 40 14 40
-B2 40 0A 00 DA 1D B2 43 AC 1D 92 C3 30 01 18 42
-08 18 D2 B3 01 02 04 20 38 E3 18 53 82 48 08 18
-B2 40 81 00 C0 05 B2 42 C6 05 B2 40 A1 F7 C8 05
-F2 D0 03 00 0D 02 92 C3 C0 05 92 D3 DA 05 3D 40
-E8 4F 18 42 08 18 38 90 0A 00 26 27 38 90 16 00
-23 2F 28 93 F9 22 E1 26 B4 4E 84 12 46 4D 36 56
-E2 56 EA 55 36 57 B0 55 6A 56 B4 52 00 00 A6 55
-56 56 08 56 46 56 C4 53 00 00 00 00 48 57 72 4D
-4C 4E 85 48 49 32 4C 4F 87 12 84 43 DE 4B A2 47
-AE 4A 74 4D EA 4F 2A 40 BA 4E 04 43 4F 44 45 00
-B0 12 C0 49 A2 82 C4 1D 87 12 EE 4A BC 41 22 50
-00 00 07 45 4E 44 43 4F 44 45 87 12 82 4D 0E 4A
-2A 40 44 4C 03 41 53 4D 92 42 C8 1D B8 1D B2 40
-EE 4F C8 1D E5 3F 42 50 06 45 4E 44 41 53 4D 00
-92 42 B8 1D C8 1D E9 3F 00 00 05 43 4F 4C 4F 4E
-1A 42 C4 1D BA 40 87 12 00 00 A2 53 C4 1D B2 43
-B6 1D 30 40 82 4D 00 00 05 4C 4F 32 48 49 1A 42
-C4 1D BA 40 B0 12 00 00 BA 40 2A 40 02 00 A2 52
-C4 1D ED 3F 38 40 BE 1D 39 48 2A 48 09 5A 1A 52
-C2 1D 09 9A 03 24 7E 9A FC 27 1A 83 0E 4A 2A 88
-82 4A C2 1D 30 4D B0 12 2A 40 C6 45 1E 46 72 41
-C0 41 EC 50 DA 46 C0 41 B2 49 0E 51 EE 50 29 4E
-39 90 86 12 02 20 2E 53 30 41 39 90 85 12 03 20
-1E 4E 02 00 30 41 39 90 84 12 01 20 2E 52 30 41
-19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 40 29 00
-12 12 C2 1D 92 53 C2 1D B0 12 2A 40 C6 45 DA 46
-C0 41 40 51 36 51 21 53 3E 90 10 00 BB 2D 30 41
-42 51 B2 41 C2 1D 22 D3 30 41 87 12 4C 42 B4 50
-52 51 82 43 BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D
-0A 4E 3E 4F FA 90 23 00 00 00 34 20 92 53 C2 1D
-B0 12 D6 50 0E 93 04 20 B2 40 00 03 BC 1D 27 3C
-1E 93 04 20 B2 40 10 03 BC 1D 21 3C 2E 93 04 20
-B2 40 20 03 BC 1D 1B 3C 2E 92 04 20 B2 40 20 02
-BC 1D 15 3C 3E 92 04 20 B2 40 30 02 BC 1D 0F 3C
-3E 93 04 20 B2 40 30 03 BC 1D 09 3C B2 40 30 00
-BC 1D 19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 4F
-3D 41 30 4D FA 90 26 00 00 00 08 20 B2 40 10 02
-BC 1D 92 53 C2 1D 30 12 C2 51 75 3F FA 90 40 00
-00 00 1A 20 B2 40 20 00 BC 1D 92 53 C2 1D B0 12
-20 51 0E 20 B2 50 10 00 BC 1D 3E 40 2B 00 B0 12
-20 51 32 24 92 92 BE 1D C2 1D 02 24 92 53 C2 1D
-8E 10 82 5E BC 1D D3 3F B0 12 20 51 F9 23 B2 50
-10 00 BC 1D 3E 40 28 00 B0 12 D6 50 30 12 12 52
-67 3F 87 12 4C 42 B4 50 4A 52 FE 90 26 00 00 00
-3E 40 20 00 04 20 B2 50 82 00 BC 1D C2 3F B0 12
-20 51 DF 23 B2 50 80 00 BC 1D 3E 40 28 00 B0 12
-D6 50 B0 12 10 51 D5 23 3D 40 B2 49 30 4D 50 44
-04 52 45 54 49 00 87 12 34 40 00 13 A2 47 2A 40
-34 40 2C 00 4A 51 42 52 9A 52 2E 4E 1E D2 BC 1D
-19 42 BA 1D 92 3F 98 50 03 4D 4F 56 84 12 90 52
-00 40 A8 52 05 4D 4F 56 2E 42 84 12 90 52 40 40
-00 00 03 41 44 44 84 12 90 52 00 50 C2 52 05 41
-44 44 2E 42 84 12 90 52 40 50 CE 52 04 41 44 44
-43 00 84 12 90 52 00 60 DC 52 06 41 44 44 43 2E
-42 00 84 12 90 52 40 60 80 52 04 53 55 42 43 00
-84 12 90 52 00 70 FA 52 06 53 55 42 43 2E 42 00
-84 12 90 52 40 70 08 53 03 53 55 42 84 12 90 52
-00 80 18 53 05 53 55 42 2E 42 84 12 90 52 40 80
-7A 50 03 43 4D 50 84 12 90 52 00 90 32 53 05 43
-4D 50 2E 42 84 12 90 52 40 90 68 50 04 44 41 44
-44 00 84 12 90 52 00 A0 4C 53 06 44 41 44 44 2E
-42 00 84 12 90 52 40 A0 3E 53 03 42 49 54 84 12
-90 52 00 B0 6A 53 05 42 49 54 2E 42 84 12 90 52
-40 B0 76 53 03 42 49 43 84 12 90 52 00 C0 84 53
-05 42 49 43 2E 42 84 12 90 52 40 C0 90 53 03 42
-49 53 84 12 90 52 00 D0 9E 53 05 42 49 53 2E 42
-84 12 90 52 40 D0 00 00 03 58 4F 52 84 12 90 52
-00 E0 B8 53 05 58 4F 52 2E 42 84 12 90 52 40 E0
-EA 52 03 41 4E 44 84 12 90 52 00 F0 D2 53 05 41
-4E 44 2E 42 84 12 90 52 40 F0 4C 42 4A 51 F0 53
-1A 42 BC 1D B2 F0 70 00 BC 1D 8A 10 3A F0 0F 00
-82 DA BC 1D 4A 3F 24 53 03 52 52 43 84 12 EA 53
-00 10 08 54 05 52 52 43 2E 42 84 12 EA 53 40 10
-14 54 04 53 57 50 42 00 84 12 EA 53 80 10 22 54
-03 52 52 41 84 12 EA 53 00 11 30 54 05 52 52 41
-2E 42 84 12 EA 53 40 11 3C 54 03 53 58 54 84 12
-EA 53 80 11 00 00 04 50 55 53 48 00 84 12 EA 53
-00 12 56 54 06 50 55 53 48 2E 42 00 84 12 EA 53
-40 12 AA 53 04 43 41 4C 4C 00 84 12 EA 53 80 12
-34 40 2C 00 4A 51 42 52 8A 54 59 42 BC 1D 5A 42
-BD 1D 82 4A BC 1D BE 90 00 15 00 00 02 20 0A 89
-02 3C 09 8A 0A 49 3A 90 10 00 03 2C 5A 0E A8 3F
-1A 53 0E 4A 87 12 70 43 6C 45 0D 6F 75 74 20 6F
-66 20 62 6F 75 6E 64 73 20 49 64 54 05 50 55 53
-48 4D 84 12 80 54 00 15 CC 54 04 50 4F 50 4D 00
-84 12 80 54 00 17 4C 42 B4 50 EC 54 82 43 BC 1D
-92 42 C4 1D BA 1D A2 53 C4 1D 92 53 C2 1D 3E 40
-2C 00 B0 12 2A 40 C6 45 DA 46 C0 41 B2 49 42 52
-12 55 0A 4E 3E 4F 1A 83 2A 92 CA 2F 8A 10 5A 06
-6F 3F 4A 54 04 52 52 43 4D 00 84 12 E6 54 50 00
-24 55 04 52 52 41 4D 00 84 12 E6 54 50 01 32 55
-04 52 4C 41 4D 00 84 12 E6 54 50 02 40 55 04 52
-52 55 4D 00 84 12 E6 54 50 03 85 12 00 3C 4E 55
-03 53 3E 3D 85 12 00 38 60 55 02 53 3C 00 85 12
-00 34 DA 54 03 30 3E 3D 85 12 00 30 74 55 02 30
-3C 00 85 12 00 30 00 00 02 55 3C 00 85 12 00 2C
-88 55 03 55 3E 3D 85 12 00 28 7E 55 03 30 3C 3E
-85 12 00 24 9C 55 02 30 3D 00 85 12 00 20 5C 44
-02 49 46 00 1A 42 C4 1D 8A 4E 00 00 A2 53 C4 1D
-0E 4A 30 4D 92 55 04 54 48 45 4E 00 1A 42 C4 1D
-08 4E 3E 4F 09 48 29 53 0A 89 0A 11 3A 90 00 02
-68 2F 88 DA 00 00 30 4D 5A 53 04 45 4C 53 45 00
-1A 42 C4 1D BA 40 00 3C 00 00 A2 53 C4 1D 2F 83
-8F 4A 00 00 E3 3F C6 55 05 55 4E 54 49 4C 3A 4F
-08 4E 3E 4F 19 42 C4 1D 2A 83 0A 89 0A 11 3A 90
-00 FE 47 3B 3A F0 FF 03 08 DA 89 48 00 00 A2 53
-C4 1D 30 4D DE 53 05 41 47 41 49 4E 87 12 5A 55
-0E 56 2A 40 00 00 05 57 48 49 4C 45 87 12 B4 55
-6E 40 2A 40 6A 55 06 52 45 50 45 41 54 00 87 12
-5A 55 0E 56 CC 55 2A 40 00 00 03 4A 4D 50 87 12
-A4 49 5A 55 0E 56 2A 40 3E B0 00 10 03 20 3E E0
-00 04 30 4D 3E 90 00 34 06 28 03 24 3E 40 00 34
-30 4D 3E 40 00 38 30 4D 00 00 04 3F 4A 4D 50 00
-87 12 78 56 A4 49 6E 40 0E 56 2A 40 AE 56 3D 41
-08 4E 3E 4F 2A 48 0A 93 04 20 98 42 C4 1D 00 00
-30 4D 88 43 00 00 A4 3F 74 54 03 42 57 31 84 12
-AC 56 00 00 CA 56 03 42 57 32 84 12 AC 56 00 00
-D6 56 03 42 57 33 84 12 AC 56 00 00 EE 56 3D 41
-1A 42 C4 1D 28 4E 08 93 08 20 BA 4F 00 00 A2 53
-C4 1D 8E 4A 00 00 3E 4F 30 4D 8E 43 00 00 61 3F
-00 00 03 46 57 31 84 12 EC 56 00 00 12 57 03 46
-57 32 84 12 EC 56 00 00 1E 57 03 46 57 33 84 12
-EC 56 00 00 2A 57 04 47 4F 54 4F 00 87 12 5A 55
-A4 49 98 47 2A 40 9A 56 05 3F 47 4F 54 4F 87 12
-78 56 A4 49 98 47 2A 40
-@FFB4
-C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E
-C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E
-C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E
-C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E 6A 44 C6 4E
-C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E
-q
--- /dev/null
+@1800
+10 00 FA 44 80 3E 80 04 05 00 18 00 82 64 84 53
+BA 44 CC 44 7C 5B BA 5B
+@1DAA
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00
+@2000
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+@4000
+3A 41 0D 12 0D 4A 30 4D 2F 83 8F 4E 00 00 3E 41
+2E 4E 30 4D 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E
+30 4D 00 00 04 45 58 49 54 00 3D 41 30 4D 00 00
+03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 40
+03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
+44 55 50 00 0E 93 F6 23 30 4D 40 40 04 44 52 4F
+50 00 3E 4F 30 4D 00 00 03 4E 49 50 2F 53 30 4D
+00 00 04 53 57 41 50 00 2A 4F 8F 4E 00 00 0E 4A
+30 4D 68 40 04 4F 56 45 52 00 8F 4E FE FF 2E 4F
+2F 83 30 4D 72 40 03 52 4F 54 2A 4F 8F 4E 00 00
+1E 4F 02 00 8F 4A 02 00 30 4D 4E 40 02 3E 52 00
+0E 12 3E 4F 30 4D 96 40 02 52 3E 00 2F 83 8F 4E
+00 00 3E 41 30 4D B8 40 02 52 40 00 2F 83 8F 4E
+00 00 2E 41 30 4D 5C 40 05 44 45 50 54 48 8F 4E
+FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D 00 00
+01 40 2E 4E 30 4D F0 40 01 21 BE 4F 00 00 3E 4F
+30 4D 00 00 02 43 40 00 6E 4E 30 4D 04 41 02 43
+21 00 FE 4F 00 00 1F 53 3E 4F 30 4D 00 00 01 2B
+3E 5F 30 4D 30 40 01 2D 3E 8F 3E E3 1E 53 30 4D
+F8 40 03 41 4E 44 3E FF 30 4D 84 40 02 4F 52 00
+3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D 3C 41
+06 4E 45 47 41 54 45 00 E8 3F 32 41 03 41 42 53
+0E 93 E3 33 30 4D D8 40 04 44 41 42 53 00 3E F3
+06 34 BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D
+00 00 02 30 3D 00 1E 83 0E 7E 30 4D 82 41 02 30
+3C 00 0E 5E 0E 7E 3E E3 30 4D 8E 41 02 30 3E 00
+1E 93 05 34 0B 3C 00 00 01 3D 3E 8F 07 20 3E 43
+30 4D A8 41 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
+AC 40 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
+3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
+0E 93 3E 4F FB 27 2D 53 30 4D 1E 83 0E 7E F9 3F
+39 40 00 80 39 8F 08 4E 3E 4F 08 59 19 15 30 4D
+81 5E 00 00 3E 4F 32 B0 00 01 E8 27 2D 53 21 52
+30 4D 91 53 00 00 F7 3F CE 41 06 55 4E 4C 4F 4F
+50 00 F5 3F 00 00 01 49 2F 83 8F 4E 00 00 2E 41
+1E 81 02 00 30 4D 1E 41 01 4A 2F 83 8F 4E 00 00
+1E 41 04 00 1E 81 06 00 30 4D 9C 41 03 50 41 44
+85 12 E2 1C 1A 42 03 54 49 42 85 12 38 1D 0E 41
+03 43 50 4C 85 12 50 00 C2 41 03 3E 49 4E 85 12
+C2 1D 60 42 04 42 41 53 45 00 85 12 DA 1D C8 40
+05 53 54 41 54 45 85 12 B6 1D 74 42 02 42 4C 00
+85 12 20 00 B4 41 02 3C 23 00 B2 40 AA 1D AA 1D
+30 4D 8C 42 01 23 2C 4F 5B 42 DA 1D 0A 43 34 40
+20 00 0E 93 04 20 04 11 0E 4C 0C 43 09 43 0A 9B
+01 28 0A 8B 09 69 08 68 14 83 07 30 0C 5C 0E 6E
+0A 6A F5 2B 0A 8B 12 D3 F5 3F 34 40 14 40 8F 49
+00 00 0E 48 7A 90 0A 00 02 28 3A 50 07 00 3A 50
+30 00 92 83 AA 1D 18 42 AA 1D C8 4A 00 00 30 4D
+A4 42 02 23 53 00 87 12 A6 42 0C 43 2D 83 09 93
+CA 23 0E 93 C8 23 3D 41 30 4D 02 43 02 23 3E 00
+9F 42 AA 1D 00 00 3E 40 AA 1D 2E 8F 30 4D 26 42
+04 48 4F 4C 44 00 0A 4E 3E 4F DB 3F 80 42 04 53
+49 47 4E 00 0E 93 3E 4F 3A 40 2D 00 D2 33 30 4D
+56 42 02 55 2E 00 87 12 9A 42 34 40 00 00 06 43
+20 43 E0 45 A8 45 2A 40 68 41 02 44 2E 00 87 12
+9A 42 78 40 8A 40 6E 41 06 43 9A 40 44 43 20 43
+E0 45 A8 45 2A 40 50 41 01 2E 0E 93 E4 37 2F 83
+8F 4E 00 00 3E 43 EB 3F 30 43 04 48 45 52 45 00
+2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D 5C 41 05 41
+4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D 1C 43 02 43
+2C 00 1A 42 C4 1D CA 4E 00 00 92 53 C4 1D 3E 4F
+30 4D 2F 83 8F 4E 00 00 B0 12 BA 44 92 B3 DC 05
+FD 27 1E 42 CC 05 B0 12 CC 44 30 4D 9A 43 05 28
+4B 45 59 29 18 42 CC 05 EC 3F 38 42 03 4B 45 59
+30 40 F4 43 0D 12 3D 40 2E 44 1B 42 34 20 9B 42
+1E 20 16 00 3A 40 00 21 8F 4A 02 00 8F 4E 00 00
+0E 43 82 93 20 20 13 24 19 42 1E 20 02 3C 30 44
+2D 83 19 92 20 20 15 2C 58 49 00 1E 19 53 78 90
+20 00 08 2C 78 90 0A 00 F4 23 82 49 1E 20 2F 53
+3D 41 30 4D 2E 9F 64 24 CA 48 00 00 1A 53 1E 53
+5F 3C 0A 12 B0 12 F0 5C 3A 41 DB 3F AE 43 06 41
+43 43 45 50 54 00 30 40 86 44 EE 43 08 28 41 43
+43 45 50 54 29 00 3C 40 38 45 3B 40 02 45 2D 15
+0A 4E 2E 4F 0A 5E 3B 40 0D 00 3C 40 20 00 3D 40
+2C 45 92 B3 DC 05 05 24 18 42 CC 05 38 90 0A 00
+04 20 21 53 39 40 E6 44 4D 15 B2 40 11 00 CE 05
+E2 C2 23 02 A2 B3 DC 05 FD 27 30 41 B2 40 13 00
+CE 05 E2 D2 23 02 A2 B3 DC 05 FD 27 30 41 00 00
+05 53 4C 45 45 50 30 40 F4 44 00 00 07 28 53 4C
+45 45 50 29 12 D2 0A 18 F6 3F 21 52 3A 17 58 42
+CC 05 48 9B E3 27 48 9C 06 2C 78 92 11 20 2E 9F
+0F 24 1E 83 05 3C 0E 9A 03 24 CE 48 00 00 1E 53
+82 48 CE 05 A2 B3 DC 05 FD 27 30 4D 2E 45 2D 83
+92 B3 DC 05 FD 27 E3 23 B2 40 18 00 0A 18 3E 8F
+3D 41 30 4D 7C 44 06 28 45 4D 49 54 29 00 08 4E
+3E 4F E6 3F 6A 43 04 45 4D 49 54 00 30 40 4E 45
+56 45 04 45 43 48 4F 00 B2 40 82 48 20 45 30 4D
+88 43 06 4E 4F 45 43 48 4F 00 B2 40 30 4D 20 45
+30 4D 46 45 04 28 43 52 29 00 2F 83 8F 4E 00 00
+3E 40 0D 00 E3 3F BE 43 02 43 52 00 30 40 8A 45
+3E 43 05 53 50 41 43 45 2F 83 8F 4E 00 00 3E 40
+20 00 D4 3F A2 45 06 53 50 41 43 45 53 00 0E 93
+09 24 0D 12 3D 40 CA 45 EF 3F CC 45 2D 83 1E 83
+EB 23 3D 41 3E 4F 30 4D 52 43 04 54 59 50 45 00
+0E 93 95 24 2A 4F 8F 5E 00 00 0E 4A 87 12 F0 41
+28 42 08 41 5C 45 12 42 F0 45 2A 40 2F 82 8F 4E
+02 00 7E 4D 8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D
+B6 45 82 53 22 00 87 12 34 40 FC 45 32 48 34 40
+22 00 56 46 26 46 3D 41 6E 4E 1E 83 82 5E C4 1D
+3E 4F 92 B3 C4 1D A2 63 C4 1D 30 4D 72 45 82 2E
+22 00 87 12 16 46 34 40 E0 45 32 48 2A 40 00 00
+04 57 4F 52 44 00 3C 40 BE 1D 39 4C 3A 4C 09 5A
+3A 5C 28 4C 09 9A 19 24 7E 9A FC 27 1A 83 3B 40
+60 00 C8 4C 00 00 09 9A 0C 24 7C 4A 4E 9C 09 24
+18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F 7C 80 20 00
+F0 3F 1A 82 C0 1D 82 4A C2 1D 1E 42 C4 1D 08 8E
+CE 48 00 00 30 4D 00 00 04 46 49 4E 44 00 2F 83
+0C 4E 65 4C 74 40 80 00 3B 40 CA 1D 3E 4B 0E 93
+1E 24 58 4C 01 00 78 F0 1E 00 0E 58 2E 53 1E 4E
+FE FF 0E 93 F3 27 09 4E 78 49 48 C4 48 95 F7 23
+0A 4C 1A 53 FA 99 00 00 F2 23 58 83 FA 23 19 B3
+09 63 0C 49 6A 4E 1E 43 4A 93 01 30 2E 83 8F 4C
+00 00 35 40 08 40 34 40 14 40 30 4D 2F 53 2F 53
+3E 4F 30 4D 6A 42 07 3E 4E 55 4D 42 45 52 3C 4F
+38 4F 29 4F 2F 82 1B 42 DA 1D 6A 4C 7A 80 30 00
+7A 90 0A 00 02 28 7A 80 07 00 0A 9B 13 2C 82 49
+D0 04 82 48 D2 04 82 4B C8 04 19 42 E4 04 18 42
+E6 04 09 5A 08 63 1C 53 1E 83 E7 23 8F 49 04 00
+8F 48 02 00 8F 4C 00 00 30 4D 03 12 0D 12 1B 42
+DA 1D 0B 12 32 C0 00 02 6D 4E 0D 5E 0C 4E 7A 40
+2E 00 0D 9C 0A 28 7A 9C FC 23 32 D0 00 02 FC 4C
+FE FF 0D 9C FC 2F DE 83 00 00 09 43 08 43 3D 40
+E0 47 3F 82 8F 4E 06 00 0C 4E 7E 4C 6A 4C 7A 90
+2D 00 10 2C 3B 40 10 00 7A 80 24 00 06 24 2B 43
+5A 83 03 24 3B 52 6A 53 B0 23 1C 53 1E 83 6A 4C
+7A 90 2D 00 AA 23 1C 53 1E 83 B1 43 04 00 A5 3F
+E2 47 2F 53 0E 93 2C 17 82 4C DA 1D 03 24 2F 52
+0E F3 30 4D 9F 4F 02 00 04 00 BF 4F 00 00 3E E3
+09 20 3E E3 BF E3 02 00 BF E3 00 00 9F 53 02 00
+8F 63 00 00 32 B0 00 02 01 20 2F 53 30 4D 62 45
+07 45 58 45 43 55 54 45 0A 4E 3E 4F 00 4A 26 41
+01 2C 1A 42 C4 1D A2 53 C4 1D 8A 4E 00 00 3E 4F
+30 4D 30 48 87 4C 49 54 45 52 41 4C 82 93 B6 1D
+0F 24 1A 42 C4 1D A2 52 C4 1D BA 40 34 40 00 00
+8A 4E 02 00 3E 4F 32 B0 00 02 32 C0 00 02 F1 23
+30 4D 98 45 05 43 4F 55 4E 54 2F 83 1E 53 8F 4E
+00 00 5E 4E FF FF 30 4D 82 4E BE 1D B2 4F C0 1D
+3E 4F 82 43 C2 1D 87 12 90 42 56 46 9E 48 3D 40
+AA 48 05 23 3D 41 3E 4F 30 4D AC 48 0A 4E 3E 4F
+3D 40 C2 48 5A 27 3D 40 98 48 1A E2 B6 1D B9 27
+B3 23 C4 48 3E 4F 3D 40 98 48 C0 23 DE 53 00 00
+68 4E 08 5E F8 40 3F 00 00 00 3D 40 34 4B CD 3F
+20 48 08 45 56 41 4C 55 41 54 45 00 39 40 BE 1D
+3C 49 3B 49 3A 49 3D 15 B0 12 2A 40 88 48 00 49
+B2 41 C2 1D B2 41 C0 1D B2 41 BE 1D 3D 41 30 4D
+4C 42 04 51 55 49 54 00 31 40 E0 1C B2 40 00 1C
+00 1C 82 43 B6 1D 82 93 08 18 17 24 E2 B2 60 02
+14 20 2F 83 8F 4E 00 00 1E 42 08 18 82 43 08 18
+B0 12 2A 40 FC 45 0F 4C 4F 41 44 22 20 42 4F 4F
+54 2E 34 54 48 22 DC 41 76 49 82 43 08 18 B0 12
+2A 40 FC 45 03 0D 6F 6B E0 45 A8 45 5A 42 44 40
+64 42 76 44 A8 45 88 48 DE 40 92 41 FC 45 0D 73
+74 61 63 6B 20 65 6D 70 74 79 21 20 C6 49 34 40
+30 FF A0 43 D2 41 FC 45 0B 46 52 41 4D 20 66 75
+6C 6C 21 20 C6 49 86 42 F2 40 E0 41 62 49 FC 45
+03 0D 20 20 DC 41 68 49 6E 44 05 41 42 4F 52 54
+3F 40 80 1C A9 3F 8F 93 02 00 A0 26 B2 40 82 48
+20 45 1B 42 34 20 0B 93 04 24 CB 43 02 00 2B 4B
+FA 3F B0 12 E8 4E A2 B3 DC 05 FD 27 B2 40 11 00
+CE 05 E2 C2 23 02 92 C3 DC 05 38 40 A0 AA 39 42
+03 43 19 83 FD 23 18 83 FA 23 92 B3 DC 05 F3 23
+87 12 FC 45 04 1B 5B 37 6D 00 E0 45 E0 45 FC 45
+04 1B 5B 30 6D 00 E0 45 F6 4D 38 4E 3E 4E 86 4E
+C0 49 BA 49 86 41 42 4F 52 54 22 00 87 12 16 46
+34 40 C6 49 32 48 2A 40 A8 46 01 27 87 12 90 42
+56 46 AE 46 E0 41 5A 4A 2A 40 CC 48 96 42 81 5C
+92 42 BE 1D C2 1D 30 4D 00 00 81 5B 82 43 B6 1D
+30 4D 5E 4A 01 5D B2 43 B6 1D 30 4D 6A 4A 83 5B
+27 5D 87 12 4C 4A 34 40 34 40 32 48 32 48 2A 40
+BE 4F 02 00 3E 4F 30 4D 84 45 82 49 53 00 87 12
+86 42 F2 40 E0 41 B2 4A 82 4A 34 40 90 4A 32 48
+2A 40 4C 4A 90 4A 2A 40 9A 4A 09 49 4D 4D 45 44
+49 41 54 45 1A 42 AE 1D FA D0 80 00 00 00 30 4D
+12 46 87 52 45 43 55 52 53 45 19 42 C4 1D 99 42
+B2 1D 00 00 A2 53 C4 1D 30 4D 12 49 88 50 4F 53
+54 50 4F 4E 45 00 87 12 90 42 56 46 AE 46 54 40
+E0 41 5A 4A 92 41 E0 41 16 4B 34 40 34 40 32 48
+32 48 34 40 32 48 32 48 2A 40 82 9F B4 1D A0 24
+87 12 FC 45 0F 73 74 61 63 6B 20 6D 69 73 6D 61
+74 63 68 21 CC 49 87 12 32 46 90 42 56 46 40 4B
+08 4E 7A 4E 5A D3 5A 53 0A 58 19 42 C8 1D 6E 4E
+3E F0 1E 00 09 5E 82 48 AE 1D 82 49 B0 1D 82 4A
+B2 1D 2A 52 82 4A C4 1D 3E 4F 3D 41 30 41 50 46
+08 56 41 52 49 41 42 4C 45 00 B0 12 36 4B BA 40
+86 12 FC FF 71 3C 74 48 08 43 4F 4E 53 54 41 4E
+54 00 B0 12 36 4B BA 40 85 12 FC FF 8A 4E FE FF
+3E 4F 62 3C 88 4B 06 43 52 45 41 54 45 00 B0 12
+36 4B BA 40 85 12 FC FF 8A 4A FE FF 55 3C E2 48
+05 44 4F 45 53 3E 1A 42 B2 1D BA 40 84 12 00 00
+8A 4D 02 00 3D 41 30 4D C0 4B 05 44 45 46 45 52
+B0 12 36 4B BA 40 30 40 FC FF BA 40 D6 4B FE FF
+3B 3C 7E 4A 01 3A B0 12 36 4B BA 40 87 12 FC FF
+A2 83 C4 1D B2 43 B6 1D 82 4F B4 1D 30 4D F4 4B
+81 3B 82 93 B6 1D 24 27 87 12 34 40 2A 40 32 48
+1A 4B 6C 4A 2A 40 28 4C 3D 41 B2 4E 0E 18 A2 4E
+0C 18 3E 4F 32 3D 44 48 06 4D 41 52 4B 45 52 00
+B0 12 36 4B BA 40 84 12 FC FF BA 40 26 4C FE FF
+9A 42 C6 1D 00 00 28 83 8A 48 02 00 A2 52 C4 1D
+18 42 AE 1D 19 42 B0 1D A8 49 FE FF 89 48 00 00
+30 4D BA 4A 82 49 46 00 2F 83 8F 4E 00 00 1E 42
+C4 1D A2 52 C4 1D BE 40 E0 41 00 00 2E 53 30 4D
+DA 4B 84 45 4C 53 45 00 A2 52 C4 1D 1A 42 C4 1D
+BA 40 DC 41 FC FF 8E 4A 00 00 2A 83 0E 4A 30 4D
+DA 45 84 54 48 45 4E 00 9E 42 C4 1D 00 00 3E 4F
+30 4D A6 4B 85 42 45 47 49 4E 30 40 A0 43 B2 4C
+85 55 4E 54 49 4C 39 40 E0 41 A2 52 C4 1D 1A 42
+C4 1D 8A 49 FC FF 8A 4E FE FF 3E 4F 30 4D 34 4A
+85 41 47 41 49 4E 39 40 DC 41 EF 3F 70 4B 85 57
+48 49 4C 45 87 12 78 4C 78 40 2A 40 D2 4A 86 52
+45 50 45 41 54 00 87 12 F6 4C B8 4C 2A 40 92 4C
+82 44 4F 00 2F 83 8F 4E 00 00 A2 53 C4 1D 1E 42
+C4 1D BE 40 F0 41 FE FF A2 53 00 1C 1A 42 00 1C
+8A 43 00 00 30 4D 38 4C 84 4C 4F 4F 50 00 39 40
+12 42 A2 52 C4 1D 1A 42 C4 1D 8A 49 FC FF 8A 4E
+FE FF 1E 42 00 1C A2 83 00 1C 2E 4E 0E 93 03 24
+8E 4A 00 00 F6 3F 3E 4F 30 4D FC 43 85 2B 4C 4F
+4F 50 39 40 00 42 E5 3F 48 4D 85 4C 45 41 56 45
+1A 42 C4 1D BA 40 22 42 00 00 BA 40 DC 41 02 00
+B2 50 06 00 C4 1D A2 53 00 1C 2A 52 19 42 00 1C
+89 4A 00 00 30 4D 8A 4D 04 4D 4F 56 45 00 0A 4E
+38 4F 39 4F 3E 4F 0A 93 11 24 08 99 0F 24 06 2C
+F8 49 00 00 18 53 1A 83 FB 23 30 4D 08 5A 09 5A
+19 83 18 83 E8 49 00 00 1A 83 FA 23 30 4D 34 40
+CA 1D FA 40 2A 40 84 12 EE 4D CA 53 9C 5E 90 5E
+4A 4A 88 53 7C 4D AA 5E 3E 46 AA 4E 26 63 1C 64
+18 63 46 41 30 5C 74 4A 16 47 00 00 3A 40 0E 00
+39 40 CA 1D 38 40 CC 1D D9 3F 3A 40 0E 00 39 40
+CC 1D 38 40 CA 1D CC 3F 82 43 CC 1D 30 4D 92 42
+CA 1D C8 1D 30 4D 48 4E 3A 4E 82 4A C6 1D 2E 4E
+82 4E C4 1D 3D 40 10 00 09 4A 08 49 29 83 18 48
+FE FF 0E 98 FC 2B 89 48 00 00 1D 83 F6 23 2A 4A
+0A 93 F0 23 3E 4F 3D 41 30 4D EC 4A 09 50 57 52
+5F 53 54 41 54 45 84 12 46 4E 84 53 82 64 0E 4D
+09 52 53 54 5F 53 54 41 54 45 92 42 0E 18 8A 4E
+92 42 0C 18 8C 4E EF 3F 7C 4E 08 50 57 52 5F 48
+45 52 45 00 92 42 C6 1D 8A 4E 92 42 C4 1D 8C 4E
+30 4D 90 4E 08 52 53 54 5F 48 45 52 45 00 92 42
+C6 1D 0E 18 92 42 C4 1D 0C 18 EC 3F B2 40 76 50
+D8 50 B2 40 F4 44 E8 44 B2 40 4E 45 5E 45 B2 40
+8A 45 9E 45 B2 40 F4 43 02 44 B2 40 86 44 78 44
+82 43 46 5A 82 43 52 5A 82 43 5E 5A 82 43 8E 5A
+82 43 9A 5A 82 43 A6 5A 30 41 FE 4C 04 57 49 50
+45 00 39 40 80 FF B9 43 00 00 29 53 39 90 B4 FF
+FA 23 B0 12 DC 4E B2 40 82 64 0C 18 B2 40 84 53
+0E 18 AB 3F C4 4C 07 43 4F 4D 50 41 52 45 0C 4E
+38 4F 3B 4F 39 4F 0E 4B 0E 5C 0C 24 1B 83 07 30
+1C 83 07 30 19 53 F9 98 FF FF F5 27 02 2C 3E 43
+30 4D 1E 43 30 4D 10 4C 86 5B 54 48 45 4E 5D 00
+30 4D 1E 83 30 4D 78 4F 86 5B 45 4C 53 45 5D 00
+87 12 34 40 01 00 90 42 56 46 7A 48 44 40 E0 41
+FE 4F 8A 40 8A 40 FC 45 04 5B 49 46 5D 00 4E 4F
+EA 41 BC 4F 0E 47 2C 41 DC 41 F2 4F 8A 40 8A 40
+FC 45 06 5B 45 4C 53 45 5D 00 4E 4F EA 41 E0 4F
+0E 47 82 4F 44 40 E0 41 DC 4F 2C 41 DC 41 F2 4F
+FC 45 06 5B 54 48 45 4E 5D 00 4E 4F EA 41 F2 4F
+82 4F 54 40 EA 41 FA 4F 2A 40 DC 41 96 4F 0E 47
+FC 45 03 0D 6B 6F E0 45 A8 45 5A 42 44 40 64 42
+76 44 14 50 82 43 C2 1D 82 4E BE 1D B2 4F C0 1D
+3E 4F 3D 40 96 4F 30 4D 88 4F 84 5B 49 46 5D 00
+0E 93 3E 4F AD 27 30 4D 2A 50 8B 5B 55 4E 44 45
+46 49 4E 45 44 5D 87 12 90 42 56 46 AE 46 6C 40
+86 41 2A 40 3A 50 89 5B 44 45 46 49 4E 45 44 5D
+87 12 90 42 56 46 AE 46 6C 40 2A 40 74 4C 06 28
+57 41 52 4D 29 00 1E 42 08 18 87 12 FC 45 05 0D
+1B 5B 37 6D E0 45 8A 43 FC 45 27 20 46 61 73 74
+46 6F 72 74 68 20 56 31 36 32 20 31 36 4D 48 7A
+20 28 43 29 20 4A 2E 4D 2E 54 68 6F 6F 72 65 6E
+73 20 E0 45 34 40 30 FF A0 43 28 41 56 43 FC 45
+0B 62 79 74 65 73 20 66 72 65 65 20 E2 49 1C 4F
+04 57 41 52 4D 00 30 40 76 50 46 4F 04 43 4F 4C
+44 00 B2 40 04 A5 20 01 B2 40 88 5A 5C 01 B2 D0
+03 00 04 02 B2 40 FC FF 02 02 B2 C0 03 00 06 02
+B2 D0 00 04 24 02 B2 D3 26 02 B2 43 22 02 B2 43
+42 02 B2 D3 46 02 B2 43 62 02 B2 D3 66 02 F2 43
+26 03 F2 D3 22 03 F2 40 A5 00 41 01 F2 40 10 00
+40 01 D2 43 41 01 F2 40 A5 00 61 01 B2 40 48 00
+62 01 82 43 66 01 39 40 80 00 B2 40 33 00 64 01
+D2 43 61 01 92 D2 9E 01 08 18 A2 93 08 18 01 24
+59 07 38 40 C2 A2 18 83 FE 23 19 83 FA 23 B2 42
+B0 01 F2 D0 10 00 2A 03 F2 40 A5 00 A1 04 F2 C0
+40 00 A2 04 3A 40 E8 50 39 40 B4 FF 89 4A 00 00
+29 53 FC 23 92 42 02 18 F0 FF B2 40 18 00 0A 18
+31 40 E0 1C 3F 40 80 1C 37 40 00 40 36 40 BC 40
+35 40 08 40 34 40 14 40 B2 40 0A 00 DA 1D B2 43
+AC 1D 92 C3 30 01 18 42 08 18 D2 B3 01 02 04 20
+38 E3 18 53 82 48 08 18 B2 40 81 00 C0 05 B2 42
+C6 05 B2 40 A1 F7 C8 05 F2 D0 03 00 0D 02 92 C3
+C0 05 92 D3 DA 05 3D 40 10 52 18 42 08 18 38 90
+0A 00 8F 26 38 90 16 00 8C 2E 28 93 46 22 3B 26
+12 52 E2 B2 60 02 5F 23 B2 40 81 A9 40 06 B2 40
+30 00 46 06 D2 D3 25 02 B2 D0 C0 04 0C 02 B2 C0
+C0 04 06 02 92 C3 40 06 39 40 00 20 89 43 00 00
+29 53 39 90 54 21 FA 23 39 42 B0 12 54 5B D2 C3
+23 02 2C 42 B2 40 95 00 14 20 B2 40 00 40 18 20
+1A 43 B0 12 18 5B 02 24 30 40 F2 5B B0 12 52 5B
+7A 93 FC 23 B2 40 87 AA 14 20 92 43 16 20 B2 40
+00 48 18 20 1A 43 B0 12 18 5B 29 42 B0 12 54 5B
+92 43 14 20 82 43 16 20 78 43 3C 42 B2 40 00 77
+18 20 1A 43 B0 12 18 5B B2 40 40 69 18 20 B0 12
+0E 5B 03 24 58 83 F2 23 D7 3F 0C 5C A2 43 16 20
+B2 40 00 50 18 20 B0 12 0E 5B CE 23 92 D3 40 06
+82 43 46 06 92 C3 40 06 B0 12 7A 5B 38 40 00 1E
+92 48 C6 01 04 20 92 48 C8 01 06 20 5A 48 C2 01
+92 43 02 20 7A 80 06 00 0D 24 7A 82 0B 24 A2 43
+02 20 6A 53 07 24 5A 53 05 24 3A 50 0B 20 0C 4A
+30 40 F8 5B B0 12 7A 5B D2 48 0D 00 12 20 19 48
+0E 00 82 49 08 20 1A 48 16 00 0A 93 02 20 1A 48
+24 00 82 4A 0A 20 09 5A 82 49 0C 20 09 5A A2 93
+02 20 04 24 82 49 0E 20 39 50 20 00 19 82 12 20
+19 82 12 20 82 49 10 20 92 42 02 20 2C 20 BB 3E
+84 12 EE 4D AA 59 56 5A 5E 59 AA 5A 24 59 DE 59
+28 56 00 00 1A 59 CA 59 7C 59 BA 59 38 57 00 00
+00 00 BC 5A 1A 4E 6E 50 85 48 49 32 4C 4F 87 12
+A0 43 8C 4C 32 48 6C 4A 1C 4E 60 53 2A 40 DC 50
+04 43 4F 44 45 00 B0 12 36 4B A2 82 C4 1D 87 12
+08 4C DC 41 98 53 00 00 07 45 4E 44 43 4F 44 45
+87 12 2A 4E 1A 4B 2A 40 F0 4C 03 41 53 4D 92 42
+C8 1D B8 1D B2 40 64 53 C8 1D E5 3F B8 53 06 45
+4E 44 41 53 4D 00 92 42 B8 1D C8 1D E9 3F 00 00
+05 43 4F 4C 4F 4E 1A 42 C4 1D BA 40 87 12 00 00
+A2 53 C4 1D B2 43 B6 1D 30 40 2A 4E 00 00 05 4C
+4F 32 48 49 1A 42 C4 1D BA 40 B0 12 00 00 BA 40
+2A 40 02 00 A2 52 C4 1D ED 3F 38 40 BE 1D 39 48
+2A 48 09 5A 1A 52 C2 1D 09 9A 03 24 7E 9A FC 27
+1A 83 0E 4A 2A 88 82 4A C2 1D 30 4D B0 12 2A 40
+56 46 AE 46 EA 41 60 54 6A 47 E0 41 5A 4A 82 54
+62 54 29 4E 39 90 86 12 02 20 2E 53 30 41 39 90
+85 12 03 20 1E 4E 02 00 30 41 39 90 84 12 01 20
+2E 52 30 41 19 42 C4 1D A2 53 C4 1D 89 4E 00 00
+3E 40 29 00 12 12 C2 1D 92 53 C2 1D B0 12 2A 40
+56 46 6A 47 E0 41 B4 54 AA 54 21 53 3E 90 10 00
+BB 2D 30 41 B6 54 B2 41 C2 1D 22 D3 30 41 87 12
+90 42 2A 54 C6 54 82 43 BC 1D 92 42 C4 1D BA 1D
+A2 53 C4 1D 0A 4E 3E 4F FA 90 23 00 00 00 34 20
+92 53 C2 1D B0 12 4C 54 0E 93 04 20 B2 40 00 03
+BC 1D 27 3C 1E 93 04 20 B2 40 10 03 BC 1D 21 3C
+2E 93 04 20 B2 40 20 03 BC 1D 1B 3C 2E 92 04 20
+B2 40 20 02 BC 1D 15 3C 3E 92 04 20 B2 40 30 02
+BC 1D 0F 3C 3E 93 04 20 B2 40 30 03 BC 1D 09 3C
+B2 40 30 00 BC 1D 19 42 C4 1D A2 53 C4 1D 89 4E
+00 00 3E 4F 3D 41 30 4D FA 90 26 00 00 00 08 20
+B2 40 10 02 BC 1D 92 53 C2 1D 30 12 36 55 76 3F
+FA 90 40 00 00 00 1A 20 B2 40 20 00 BC 1D 92 53
+C2 1D B0 12 94 54 0E 20 B2 50 10 00 BC 1D 3E 40
+2B 00 B0 12 94 54 32 24 92 92 BE 1D C2 1D 02 24
+92 53 C2 1D 8E 10 82 5E BC 1D D3 3F B0 12 94 54
+F9 23 B2 50 10 00 BC 1D 3E 40 28 00 B0 12 4C 54
+30 12 86 55 67 3F 87 12 90 42 2A 54 BE 55 FE 90
+26 00 00 00 3E 40 20 00 04 20 B2 50 82 00 BC 1D
+C2 3F B0 12 94 54 DF 23 B2 50 80 00 BC 1D 3E 40
+28 00 B0 12 4C 54 B0 12 84 54 D5 23 3D 40 5A 4A
+30 4D E0 44 04 52 45 54 49 00 87 12 34 40 00 13
+32 48 2A 40 34 40 2C 00 BE 54 B6 55 0E 56 2E 4E
+1E D2 BC 1D 19 42 BA 1D 92 3F 0E 54 03 4D 4F 56
+84 12 04 56 00 40 1C 56 05 4D 4F 56 2E 42 84 12
+04 56 40 40 00 00 03 41 44 44 84 12 04 56 00 50
+36 56 05 41 44 44 2E 42 84 12 04 56 40 50 42 56
+04 41 44 44 43 00 84 12 04 56 00 60 50 56 06 41
+44 44 43 2E 42 00 84 12 04 56 40 60 F4 55 04 53
+55 42 43 00 84 12 04 56 00 70 6E 56 06 53 55 42
+43 2E 42 00 84 12 04 56 40 70 7C 56 03 53 55 42
+84 12 04 56 00 80 8C 56 05 53 55 42 2E 42 84 12
+04 56 40 80 F0 53 03 43 4D 50 84 12 04 56 00 90
+A6 56 05 43 4D 50 2E 42 84 12 04 56 40 90 DE 53
+04 44 41 44 44 00 84 12 04 56 00 A0 C0 56 06 44
+41 44 44 2E 42 00 84 12 04 56 40 A0 B2 56 03 42
+49 54 84 12 04 56 00 B0 DE 56 05 42 49 54 2E 42
+84 12 04 56 40 B0 EA 56 03 42 49 43 84 12 04 56
+00 C0 F8 56 05 42 49 43 2E 42 84 12 04 56 40 C0
+04 57 03 42 49 53 84 12 04 56 00 D0 12 57 05 42
+49 53 2E 42 84 12 04 56 40 D0 00 00 03 58 4F 52
+84 12 04 56 00 E0 2C 57 05 58 4F 52 2E 42 84 12
+04 56 40 E0 5E 56 03 41 4E 44 84 12 04 56 00 F0
+46 57 05 41 4E 44 2E 42 84 12 04 56 40 F0 90 42
+BE 54 64 57 1A 42 BC 1D B2 F0 70 00 BC 1D 8A 10
+3A F0 0F 00 82 DA BC 1D 4A 3F 98 56 03 52 52 43
+84 12 5E 57 00 10 7C 57 05 52 52 43 2E 42 84 12
+5E 57 40 10 88 57 04 53 57 50 42 00 84 12 5E 57
+80 10 96 57 03 52 52 41 84 12 5E 57 00 11 A4 57
+05 52 52 41 2E 42 84 12 5E 57 40 11 B0 57 03 53
+58 54 84 12 5E 57 80 11 00 00 04 50 55 53 48 00
+84 12 5E 57 00 12 CA 57 06 50 55 53 48 2E 42 00
+84 12 5E 57 40 12 1E 57 04 43 41 4C 4C 00 84 12
+5E 57 80 12 34 40 2C 00 BE 54 B6 55 FE 57 59 42
+BC 1D 5A 42 BD 1D 82 4A BC 1D BE 90 00 15 00 00
+02 20 0A 89 02 3C 09 8A 0A 49 3A 90 10 00 03 2C
+5A 0E A8 3F 1A 53 0E 4A 87 12 8A 43 FC 45 0D 6F
+75 74 20 6F 66 20 62 6F 75 6E 64 73 CC 49 D8 57
+05 50 55 53 48 4D 84 12 F4 57 00 15 40 58 04 50
+4F 50 4D 00 84 12 F4 57 00 17 90 42 2A 54 60 58
+82 43 BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D 92 53
+C2 1D 3E 40 2C 00 B0 12 2A 40 56 46 6A 47 E0 41
+5A 4A B6 55 86 58 0A 4E 3E 4F 1A 83 2A 92 CA 2F
+8A 10 5A 06 6F 3F BE 57 04 52 52 43 4D 00 84 12
+5A 58 50 00 98 58 04 52 52 41 4D 00 84 12 5A 58
+50 01 A6 58 04 52 4C 41 4D 00 84 12 5A 58 50 02
+B4 58 04 52 52 55 4D 00 84 12 5A 58 50 03 85 12
+00 3C C2 58 03 53 3E 3D 85 12 00 38 D4 58 02 53
+3C 00 85 12 00 34 4E 58 03 30 3E 3D 85 12 00 30
+E8 58 02 30 3C 00 85 12 00 30 00 00 02 55 3C 00
+85 12 00 2C FC 58 03 55 3E 3D 85 12 00 28 F2 58
+03 30 3C 3E 85 12 00 24 10 59 02 30 3D 00 85 12
+00 20 EC 44 02 49 46 00 1A 42 C4 1D 8A 4E 00 00
+A2 53 C4 1D 0E 4A 30 4D 06 59 04 54 48 45 4E 00
+1A 42 C4 1D 08 4E 3E 4F 09 48 29 53 0A 89 0A 11
+3A 90 00 02 68 2F 88 DA 00 00 30 4D CE 56 04 45
+4C 53 45 00 1A 42 C4 1D BA 40 00 3C 00 00 A2 53
+C4 1D 2F 83 8F 4A 00 00 E3 3F 3A 59 05 55 4E 54
+49 4C 3A 4F 08 4E 3E 4F 19 42 C4 1D 2A 83 0A 89
+0A 11 3A 90 00 FE 47 3B 3A F0 FF 03 08 DA 89 48
+00 00 A2 53 C4 1D 30 4D 52 57 05 41 47 41 49 4E
+87 12 CE 58 82 59 2A 40 00 00 05 57 48 49 4C 45
+87 12 28 59 78 40 2A 40 DE 58 06 52 45 50 45 41
+54 00 87 12 CE 58 82 59 40 59 2A 40 00 00 03 4A
+4D 50 87 12 4C 4A CE 58 82 59 2A 40 3E B0 00 10
+03 20 3E E0 00 04 30 4D 3E 90 00 34 06 28 03 24
+3E 40 00 34 30 4D 3E 40 00 38 30 4D 00 00 04 3F
+4A 4D 50 00 87 12 EC 59 4C 4A 78 40 82 59 2A 40
+22 5A 3D 41 08 4E 3E 4F 2A 48 0A 93 04 20 98 42
+C4 1D 00 00 30 4D 88 43 00 00 A4 3F E8 57 03 42
+57 31 84 12 20 5A 00 00 3E 5A 03 42 57 32 84 12
+20 5A 00 00 4A 5A 03 42 57 33 84 12 20 5A 00 00
+62 5A 3D 41 1A 42 C4 1D 28 4E 08 93 08 20 BA 4F
+00 00 A2 53 C4 1D 8E 4A 00 00 3E 4F 30 4D 8E 43
+00 00 61 3F 00 00 03 46 57 31 84 12 60 5A 00 00
+86 5A 03 46 57 32 84 12 60 5A 00 00 92 5A 03 46
+57 33 84 12 60 5A 00 00 9E 5A 04 47 4F 54 4F 00
+87 12 CE 58 4C 4A 28 48 2A 40 0E 5A 05 3F 47 4F
+54 4F 87 12 EC 59 4C 4A 28 48 2A 40 D2 C3 23 02
+E2 B2 60 02 02 24 30 40 E2 50 1A 52 04 20 19 62
+06 20 92 43 14 20 A2 93 02 20 07 24 0A 5A 49 69
+82 4A 16 20 C2 49 18 20 0A 3C C2 4A 15 20 8A 10
+C2 4A 16 20 C2 49 17 20 89 10 C2 49 18 20 B0 12
+52 5B 7A 93 FC 23 0A 43 39 40 05 00 D2 49 14 20
+4E 06 82 93 46 06 05 24 92 B3 6C 06 FD 27 C2 93
+4C 06 59 83 F3 2F 19 83 0B 30 F2 43 4E 06 82 93
+46 06 03 24 92 B3 6C 06 FD 27 5A 92 4C 06 F3 23
+30 41 19 43 3A 43 8A 10 C2 4A 4E 06 82 93 46 06
+05 24 92 B3 6C 06 FD 27 C2 93 4C 06 19 83 F3 23
+5A 42 4C 06 30 41 1A 52 08 20 09 43 1C D3 F2 40
+51 00 19 20 B0 12 CC 5A 34 20 B0 12 52 5B 7A 90
+FE FF 04 24 FA 23 D9 42 4C 06 FF 1D F2 43 4E 06
+03 43 19 53 39 90 01 02 F6 23 F2 43 4E 06 3C C0
+03 00 D2 D3 23 02 30 41 09 43 2C D3 F0 40 58 00
+59 C4 B0 12 CC 5A 15 20 3A 40 FE FF 29 43 B0 12
+56 5B D2 49 00 1E 4E 06 03 43 19 53 39 90 00 02
+F8 23 39 40 03 00 B0 12 54 5B 7A C0 E1 00 6A 92
+DE 27 8C 10 1C 52 4C 06 D2 D3 23 02 87 12 FC 45
+0B 3C 20 53 44 20 45 72 72 6F 72 21 0E 5C 2F 82
+8F 4E 02 00 9F 42 DA 1D 00 00 B2 40 10 00 DA 1D
+0E 4C B0 12 2A 40 56 43 7A 42 FA 40 CC 49 56 50
+09 7B 53 44 5F 4C 4F 41 44 7D 30 4D 39 4F 18 42
+C4 1D 4A 4E 0E 48 C8 4A 00 00 18 53 30 40 D0 4D
+92 4B 0E 00 22 20 92 4B 10 00 24 20 5A 42 23 20
+58 42 22 20 A2 93 02 20 08 20 59 42 24 20 89 10
+0A 59 88 10 08 58 0A 6A 88 10 08 58 30 41 82 43
+1C 20 92 42 0E 20 1A 20 C2 93 24 20 03 20 92 93
+22 20 14 24 92 42 22 20 D0 04 92 42 24 20 D2 04
+92 42 12 20 C8 04 92 42 E4 04 1A 20 92 42 E6 04
+1C 20 92 52 10 20 1A 20 82 63 1C 20 30 41 92 4B
+0E 00 22 20 92 4B 10 00 24 20 B0 12 7E 5C 5A 4B
+03 00 82 5A 1A 20 82 63 1C 20 30 41 09 93 07 24
+F8 90 20 00 00 1E 03 20 18 53 19 83 F9 23 30 41
+1B 42 34 20 82 43 1E 20 B2 90 00 02 20 20 96 20
+BB 80 00 02 12 00 8B 73 14 00 DB 53 03 00 DB 92
+12 20 03 00 11 28 CB 43 03 00 B0 12 50 5C B0 12
+76 5B 8B 43 10 00 9B 48 00 1E 0E 00 92 93 02 20
+03 24 9B 48 02 1E 10 00 B2 40 00 02 20 20 8B 93
+14 00 0B 20 92 9B 12 00 1E 20 70 2C BB 90 00 02
+12 00 03 2C 92 4B 12 00 20 20 B0 12 BE 5C 1A 42
+1A 20 19 42 1C 20 0A 3F 3C 42 3B 40 40 20 09 43
+CB 93 02 00 10 24 9B 92 24 20 0C 00 04 20 9B 92
+22 20 0A 00 07 24 09 4B 3B 50 18 00 3B 90 00 21
+EF 23 0C 5C 30 41 0C 43 82 4B 34 20 8B 49 00 00
+4A 93 07 34 49 93 05 24 C9 93 02 00 02 34 5A 59
+02 00 CB 4A 02 00 CB 43 03 00 9B 42 1A 20 04 00
+9B 42 1C 20 06 00 18 42 30 20 8B 48 08 00 9B 48
+1A 1E 0A 00 9B 48 14 1E 0C 00 9B 48 1A 1E 0E 00
+9B 48 14 1E 10 00 9B 48 1C 1E 12 00 9B 48 1E 1E
+14 00 82 43 1E 20 6A 93 62 27 CC 37 8B 43 16 00
+7A 93 05 24 99 37 99 52 C2 1D 16 00 95 3F 19 42
+C2 1D 1A 42 BE 1D 0A 89 82 4A 36 20 19 52 C0 1D
+82 49 38 20 B2 40 04 44 78 44 86 3F 1B 42 34 20
+82 43 20 20 0B 93 AE 27 EB 93 02 00 04 20 B0 12
+9A 62 B0 12 62 62 5A 4B 02 00 CB 43 02 00 2B 4B
+82 4B 34 20 5A 53 05 24 9D 37 92 4B 16 00 1E 20
+6B 3F 1E 42 36 20 9F 42 38 20 02 00 B2 40 86 44
+78 44 30 41 C4 4E 85 52 45 41 44 22 5A 43 19 3C
+D0 50 86 57 52 49 54 45 22 00 6A 43 12 3C 20 4D
+84 44 45 4C 22 00 6A 42 0C 3C A0 53 05 43 4C 4F
+53 45 B0 12 2C 5E 30 4D B8 4D 85 4C 4F 41 44 22
+7A 43 2F 83 8F 4E 00 00 0E 4A 82 93 B6 1D 0D 24
+87 12 34 40 34 40 32 48 32 48 16 46 34 40 3C 5C
+32 48 34 40 E6 5E 32 48 2A 40 87 12 34 40 22 00
+56 46 E4 5E 3D 41 78 4E 08 5E C8 43 00 00 1C 43
+92 42 2C 20 22 20 92 42 2E 20 24 20 CE 93 00 00
+91 24 FE 90 3A 00 01 00 01 20 2E 53 FE 90 5C 00
+00 00 09 20 1E 53 92 42 02 20 22 20 82 43 24 20
+CE 93 00 00 73 24 82 4E 32 20 B0 12 7E 5C 34 40
+20 00 A2 93 02 20 04 24 92 92 22 20 02 20 02 24
+14 42 12 20 B0 12 5E 5D 2C 43 0A 43 08 4A 58 0E
+08 58 82 48 30 20 C8 93 00 1E 64 24 39 42 F8 9E
+00 1E 04 20 18 53 19 83 FA 23 1E 53 FE 90 2E 00
+FF FF 1A 24 39 50 03 00 B0 12 DC 5C 07 20 FE 90
+5C 00 FF FF 2B 24 CE 93 FF FF 28 24 1E 42 32 20
+1A 53 3A 90 10 00 DA 23 92 53 1A 20 82 63 1C 20
+14 83 D0 23 2C 42 3E 3C FE 90 2E 00 FE FF EE 27
+B0 12 DC 5C EB 23 39 40 03 00 F8 9E 00 1E 04 20
+18 53 19 83 FA 23 0A 3C CE 93 FF FF DF 23 FE 90
+5C 00 FF FF DB 23 B0 12 DC 5C D8 23 18 42 30 20
+92 48 1A 1E 22 20 92 48 14 1E 24 20 F8 B0 10 00
+0B 1E 15 24 82 93 24 20 06 20 82 93 22 20 03 20
+92 42 02 20 22 20 CE 93 FF FF 8A 23 92 42 22 20
+2C 20 92 42 24 20 2E 20 8F 43 00 00 03 3C 2A 4F
+B0 12 68 5D 3A 4F 34 40 14 40 3E 4F 0A 93 06 24
+7A 93 14 20 0C 93 03 20 3D 40 98 48 30 4D 87 12
+FC 45 0B 3C 20 4F 70 65 6E 45 72 72 6F 72 68 45
+A0 43 7A 48 E0 45 A8 45 DC 41 0C 5C 1A 93 B5 20
+0C 93 ED 23 30 4D 76 5E 04 52 45 41 44 00 2F 83
+8F 4E 00 00 1E 42 34 20 B0 12 F0 5C 1E 82 34 20
+30 4D 2C 43 12 12 2A 20 18 42 02 20 08 58 2A 41
+82 9A 0A 20 A0 24 B0 12 76 5B 09 43 28 93 03 24
+89 93 02 1E 03 20 89 93 00 1E 07 24 09 58 39 90
+00 02 F4 23 91 53 00 00 EA 3F 0C 43 6A 41 B9 43
+00 1E 28 93 0F 24 B9 40 FF 0F 02 1E 09 11 8A 10
+09 5A 5A 41 01 00 0A 11 09 10 82 4A 28 20 82 49
+26 20 07 3C 09 11 C2 49 26 20 C2 4A 27 20 82 43
+28 20 3A 41 82 4A 2A 20 30 41 0A 12 1A 52 08 20
+B0 12 B8 5B 3A 41 1A 52 0C 20 30 40 B8 5B F2 B0
+40 00 A2 04 29 20 F2 B0 10 00 A2 04 FC 27 5A 42
+B0 04 4A 11 59 42 B4 04 F2 40 20 00 C0 04 D2 42
+B1 04 C8 04 1A 52 E4 04 D2 42 B5 04 C8 04 19 52
+E4 04 D2 42 B2 04 C0 04 B2 40 00 08 C8 04 1A 52
+E4 04 92 42 B6 04 C0 04 B2 80 BC 07 C0 04 B2 40
+00 02 C8 04 19 52 E4 04 30 41 22 2A 2B 2C 2F 3A
+3B 3C 3D 3E 3F 5B 5C 5D 7C 2E 29 92 06 38 39 80
+03 00 B0 12 B8 61 39 40 03 00 7A 4B C8 4A 00 1E
+0A 93 12 24 0D 12 3D 40 0F 00 3C 40 6A 61 7A 9C
+F4 27 1D 83 FC 23 3D 41 6A 9C E7 27 3A 80 21 00
+EC 3B 18 53 19 83 E9 23 09 93 06 24 F8 40 20 00
+00 1E 18 53 19 83 FA 23 30 41 2A 93 EB 20 2C 93
+0D 24 0C 93 BA 24 87 12 FC 45 0C 3C 20 57 72 69
+74 65 45 72 72 6F 72 00 DC 41 4E 60 B0 12 82 60
+92 42 26 20 22 20 92 42 28 20 24 20 B0 12 FA 60
+B0 12 5E 5D 18 42 30 20 F8 40 20 00 0B 1E B0 12
+0E 61 88 43 0C 1E 88 4A 0E 1E 88 49 10 1E 88 49
+12 1E 98 42 24 20 14 1E 98 42 22 20 1A 1E 88 43
+1C 1E 88 43 1E 1E 1C 43 1B 42 32 20 CB 93 00 00
+CA 27 FB 90 2E 00 00 00 C6 27 39 40 0B 00 B0 12
+8A 61 B0 12 A4 62 2A 43 B0 12 68 5D 0C 93 BB 23
+30 4D 1A 4B 04 00 19 4B 06 00 B0 12 7C 5B B0 12
+0E 61 18 4B 08 00 88 49 12 1E 88 4A 16 1E 88 49
+18 1E 98 4B 12 00 1C 1E 98 4B 14 00 1E 1E 1A 4B
+04 00 19 4B 06 00 30 40 BA 5B 9B 52 1E 20 12 00
+8B 63 14 00 1A 42 1A 20 19 42 1C 20 30 40 BA 5B
+B2 40 00 02 1E 20 1B 42 34 20 B0 12 9A 62 82 43
+1E 20 DB 53 03 00 DB 92 12 20 03 00 22 20 CB 43
+03 00 B0 12 50 5C 08 12 0A 12 B0 12 82 60 2A 91
+05 24 B0 12 FA 60 2A 41 B0 12 76 5B 3A 41 38 41
+98 42 26 20 00 1E 92 93 02 20 03 24 98 42 28 20
+02 1E B0 12 FA 60 9B 42 26 20 0E 00 9B 42 28 20
+10 00 30 40 BE 5C 82 5E 05 57 52 49 54 45 B0 12
+B0 62 30 4D 68 60 07 53 44 5F 45 4D 49 54 B2 90
+00 02 1E 20 02 28 B0 12 B0 62 18 42 1E 20 C8 4E
+00 1E 92 53 1E 20 3E 4F 30 4D 58 4B 13 00 59 4B
+14 00 89 10 09 58 58 4B 15 00 5B 42 12 20 0A 43
+3C 42 08 11 09 10 4A 10 1C 83 0B 11 FA 2B 0A 11
+1C 83 FD 37 1B 42 34 20 19 5B 0A 00 18 6B 0C 00
+8B 49 0E 00 8B 48 10 00 CB 4A 03 00 1A 4B 12 00
+BB C0 FF 01 12 00 3A F0 FF 01 82 4A 1E 20 B0 12
+5A 5D 30 4D 0C 93 38 20 38 90 E0 01 03 2C C8 93
+20 1E 02 24 7C 40 E5 00 C8 4C 00 1E B0 12 A4 62
+B0 12 5C 5C 82 4A 2A 20 0B 4A B0 12 76 5B 1A 48
+00 1E 88 43 00 1E 92 93 02 20 09 24 19 48 02 1E
+88 43 02 1E 39 F0 FF 0F 39 90 FF 0F 02 20 3A 93
+0E 24 82 4A 22 20 82 49 24 20 B0 12 5C 5C 0B 9A
+E6 27 0A 12 0A 4B B0 12 FA 60 3A 41 DD 3F 0A 4B
+B0 12 FA 60 B0 12 2C 5E 30 4D D0 4C 08 54 45 52
+4D 32 53 44 22 00 87 12 96 5E A0 43 2E 64 21 53
+2F 83 AF 43 00 00 3D 40 3E 64 30 40 E6 5E 40 64
+92 C3 DC 05 08 43 B0 12 BA 44 92 B3 DC 05 FD 27
+59 42 CC 05 69 92 0D 24 C8 49 00 1E 18 53 38 90
+FF 01 F3 2B 03 24 B0 12 B0 62 EC 3F B0 12 CC 44
+EC 3F B0 12 CC 44 82 48 1E 20 B0 12 2C 5E 3D 41
+30 4D
+@FFB4
+E8 50 E8 50 E8 50 E8 50 E8 50 E8 50 E8 50 E8 50
+E8 50 E8 50 E8 50 E8 50 E8 50 E8 50 E8 50 E8 50
+E8 50 E8 50 E8 50 E8 50 E8 50 E8 50 E8 50 E8 50
+E8 50 E8 50 E8 50 E8 50 E8 50 E8 50 FA 44 E8 50
+E8 50 E8 50 E8 50 E8 50 E8 50 E8 50
+q
@1800
-10 00 E6 44 80 3E 80 04 FD FF 18 00 5C 65 EE 51
-A6 44 B8 44 E8 59 26 5A
+10 00 FA 44 80 3E 80 04 05 00 18 00 36 66 50 53
+BA 44 CC 44 30 5D 6E 5D
@1DAA
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 40
03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
44 55 50 00 0E 93 F6 23 30 4D 40 40 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 40 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E 40 02 3E 52 00 0E 12 3E 4F 30 4D 8E 40
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 40
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C 40 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 40 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 41
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 40 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA 40 03 41 4E 44 3E FF 30 4D 7A 40 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E 41 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 41 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E 41 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 41 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 40 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
+50 00 3E 4F 30 4D 00 00 03 4E 49 50 2F 53 30 4D
+00 00 04 53 57 41 50 00 2A 4F 8F 4E 00 00 0E 4A
+30 4D 68 40 04 4F 56 45 52 00 8F 4E FE FF 2E 4F
+2F 83 30 4D 72 40 03 52 4F 54 2A 4F 8F 4E 00 00
+1E 4F 02 00 8F 4A 02 00 30 4D 4E 40 02 3E 52 00
+0E 12 3E 4F 30 4D 96 40 02 52 3E 00 2F 83 8F 4E
+00 00 3E 41 30 4D B8 40 02 52 40 00 2F 83 8F 4E
+00 00 2E 41 30 4D 5C 40 05 44 45 50 54 48 8F 4E
+FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D 00 00
+01 40 2E 4E 30 4D F0 40 01 21 BE 4F 00 00 3E 4F
+30 4D 00 00 02 43 40 00 6E 4E 30 4D 04 41 02 43
+21 00 FE 4F 00 00 1F 53 3E 4F 30 4D 00 00 01 2B
+3E 5F 30 4D 30 40 01 2D 3E 8F 3E E3 1E 53 30 4D
+F8 40 03 41 4E 44 3E FF 30 4D 84 40 02 4F 52 00
+3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D 3C 41
+06 4E 45 47 41 54 45 00 E8 3F 32 41 03 41 42 53
+0E 93 E3 33 30 4D D8 40 04 44 41 42 53 00 3E F3
+06 34 BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D
+00 00 02 30 3D 00 1E 83 0E 7E 30 4D 82 41 02 30
+3C 00 0E 5E 0E 7E 3E E3 30 4D 8E 41 02 30 3E 00
+1E 93 05 34 0B 3C 00 00 01 3D 3E 8F 07 20 3E 43
+30 4D A8 41 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
+AC 40 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE 41 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 41 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 41 03 3E 49 4E 85 12 C2 1D 10 41
-04 42 41 53 45 00 85 12 DA 1D C0 40 05 53 54 41
-54 45 85 12 B6 1D 30 42 02 42 4C 00 85 12 20 00
-94 41 02 3C 23 00 B2 40 AA 1D AA 1D 30 4D 1E 15
-0E 43 3D 40 20 00 0A 93 04 20 0D 11 0A 4C 0C 43
-09 43 0E 9B 01 28 0E 8B 09 69 08 68 1D 83 07 30
-0C 5C 0A 6A 0E 6E F5 2B 0E 8B 12 D3 F5 3F 0A 4E
-1D 17 30 41 48 42 01 23 1B 42 DA 1D 2C 4F 0A 4E
-B0 12 5E 42 8F 49 00 00 0E 48 7A 90 0A 00 02 28
-3A 50 07 00 3A 50 30 00 92 83 AA 1D 18 42 AA 1D
-C8 4A 00 00 30 4D 96 42 02 23 53 00 87 12 98 42
-D2 42 2D 83 09 93 E0 23 0E 93 DE 23 3D 41 30 4D
-C8 42 02 23 3E 00 9F 42 AA 1D 00 00 3E 40 AA 1D
-2E 8F 30 4D 00 42 04 48 4F 4C 44 00 0A 4E 3E 4F
-DB 3F 3C 42 04 53 49 47 4E 00 0E 93 3E 4F 3A 40
-2D 00 D2 33 30 4D F4 41 03 55 44 2E 87 12 56 42
-CC 42 E6 42 CC 45 94 45 2A 40 18 43 02 55 2E 00
-2F 83 8F 4E 00 00 0E 43 F1 3F 3E B0 00 80 06 24
-BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D DA 40
-02 44 2E 00 87 12 56 42 6E 40 80 40 3A 43 CC 42
-92 40 0A 43 E6 42 CC 45 94 45 2A 40 52 41 01 2E
-3E B0 00 80 DD 27 2F 83 3E 43 EC 3F F6 42 04 48
-45 52 45 00 2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D
-62 41 05 41 4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D
-E2 42 02 43 2C 00 1A 42 C4 1D CA 4E 00 00 92 53
-C4 1D 3E 4F 30 4D 2F 83 8F 4E 00 00 B0 12 A6 44
-92 B3 DC 05 FD 27 1E 42 CC 05 B0 12 B8 44 30 4D
-30 40 B6 43 7E 43 05 28 4B 45 59 29 18 42 CC 05
-EA 3F 12 42 03 4B 45 59 30 40 DC 43 0D 12 3D 40
-18 44 1B 42 34 20 9B 42 1E 20 16 00 3A 40 00 21
-BF 40 50 00 00 00 8F 4A 02 00 0E 43 82 93 20 20
-13 24 19 42 1E 20 02 3C 1A 44 2D 83 19 92 20 20
-16 2C 58 49 00 1E 19 53 78 90 20 00 08 2C 78 90
-0A 00 F4 23 82 49 1E 20 2F 53 3D 41 30 4D 8F 9E
-00 00 64 24 CA 48 00 00 1A 53 1E 53 5F 3C 0A 12
-B0 12 52 5B 3A 41 DA 3F 92 43 06 41 43 43 45 50
-54 00 30 40 72 44 D6 43 08 28 41 43 43 45 50 54
-29 00 3C 40 24 45 3B 40 EE 44 2D 15 0A 4E 2E 4F
-0A 5E 3B 40 0D 00 3C 40 20 00 3D 40 18 45 92 B3
-DC 05 05 24 18 42 CC 05 38 90 0A 00 04 20 21 53
-39 40 D2 44 4D 15 B2 40 11 00 CE 05 A2 B3 DC 05
-FD 27 E2 C2 23 02 30 41 B2 40 13 00 CE 05 A2 B3
-DC 05 FD 27 E2 D2 23 02 30 41 00 00 05 53 4C 45
-45 50 30 40 E0 44 00 00 07 28 53 4C 45 45 50 29
-12 D2 0A 18 F6 3F 21 52 3A 17 58 42 CC 05 48 9B
-E3 27 48 9C 06 2C 78 92 11 20 2E 9F 0F 24 1E 83
-05 3C 0E 9A 03 24 CE 48 00 00 1E 53 82 48 CE 05
-A2 B3 DC 05 FD 27 30 4D 1A 45 2D 83 92 B3 DC 05
-FD 27 E3 23 B2 40 18 00 0A 18 3E 8F 3D 41 30 4D
-68 44 06 28 45 4D 49 54 29 00 08 4E 3E 4F E6 3F
-50 43 04 45 4D 49 54 00 30 40 3A 45 42 45 04 45
-43 48 4F 00 B2 40 82 48 0C 45 30 4D 6E 43 06 4E
-4F 45 43 48 4F 00 B2 40 30 4D 0C 45 30 4D 32 45
-04 28 43 52 29 00 2F 83 8F 4E 00 00 3E 40 0D 00
-E3 3F A2 43 02 43 52 00 30 40 76 45 04 43 05 53
-50 41 43 45 2F 83 8F 4E 00 00 3E 40 20 00 D4 3F
-8E 45 06 53 50 41 43 45 53 00 0E 93 09 24 0D 12
-3D 40 B6 45 EF 3F B8 45 2D 83 1E 83 EB 23 3D 41
-3E 4F 30 4D 2C 43 04 54 59 50 45 00 0E 93 95 24
-2A 4F 8F 5E 00 00 0E 4A 87 12 CA 41 02 42 0A 41
-48 45 EC 41 DC 45 2A 40 2F 82 8F 4E 02 00 7E 4D
-8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D A2 45 82 53
-22 00 87 12 34 40 E8 45 1E 48 34 40 22 00 42 46
-12 46 3D 41 6E 4E 1E 83 82 5E C4 1D 3E 4F 92 B3
-C4 1D A2 63 C4 1D 30 4D 5E 45 82 2E 22 00 87 12
-02 46 34 40 CC 45 1E 48 2A 40 00 00 04 57 4F 52
-44 00 3C 40 BE 1D 39 4C 3A 4C 09 5A 3A 5C 28 4C
-09 9A 19 24 7E 9A FC 27 1A 83 3B 40 60 00 C8 4C
-00 00 09 9A 0C 24 7C 4A 4E 9C 09 24 18 53 4B 9C
-F6 2F 7C 90 7B 00 F3 2F 7C 80 20 00 F0 3F 1A 82
-C0 1D 82 4A C2 1D 1E 42 C4 1D 08 8E CE 48 00 00
-30 4D 00 00 04 46 49 4E 44 00 2F 83 0C 4E 65 4C
-74 40 80 00 3B 40 CA 1D 3E 4B 0E 93 1E 24 58 4C
-01 00 78 F0 1E 00 0E 58 2E 53 1E 4E FE FF 0E 93
-F3 27 09 4E 78 49 48 C4 48 95 F7 23 0A 4C 1A 53
-FA 99 00 00 F2 23 58 83 FA 23 19 B3 09 63 0C 49
-6A 4E 1E 43 4A 93 01 30 2E 83 8F 4C 00 00 35 40
-08 40 34 40 14 40 30 4D 2F 53 2F 53 3E 4F 30 4D
-26 42 07 3E 4E 55 4D 42 45 52 3C 4F 38 4F 29 4F
-2F 82 1B 42 DA 1D 6A 4C 7A 80 30 00 7A 90 0A 00
-02 28 7A 80 07 00 0A 9B 13 2C 82 49 D0 04 82 48
-D2 04 82 4B C8 04 19 42 E4 04 18 42 E6 04 09 5A
-08 63 1C 53 1E 83 E7 23 8F 49 04 00 8F 48 02 00
-8F 4C 00 00 30 4D 03 12 0D 12 1B 42 DA 1D 0B 12
-32 C0 00 02 6D 4E 0D 5E 0C 4E 7A 40 2E 00 0D 9C
-0A 28 7A 9C FC 23 32 D0 00 02 FC 4C FE FF 0D 9C
-FC 2F DE 83 00 00 09 43 08 43 3D 40 CC 47 3F 82
-8F 4E 06 00 0C 4E 7E 4C 6A 4C 7A 90 2D 00 10 2C
-3B 40 10 00 7A 80 24 00 06 24 2B 43 5A 83 03 24
-3B 52 6A 53 B0 23 1C 53 1E 83 6A 4C 7A 90 2D 00
-AA 23 1C 53 1E 83 B1 43 04 00 A5 3F CE 47 2F 53
-0E 93 2C 17 82 4C DA 1D 03 24 2F 52 0E F3 30 4D
-9F 4F 02 00 04 00 BF 4F 00 00 3E E3 09 20 3E E3
-BF E3 02 00 BF E3 00 00 9F 53 02 00 8F 63 00 00
-32 B0 00 02 01 20 2F 53 30 4D 4E 45 07 45 58 45
-43 55 54 45 0A 4E 3E 4F 00 4A 28 41 01 2C 1A 42
-C4 1D A2 53 C4 1D 8A 4E 00 00 3E 4F 30 4D 1C 48
-87 4C 49 54 45 52 41 4C 82 93 B6 1D 16 24 32 B0
-00 02 09 24 1A 42 C4 1D A2 52 C4 1D BA 40 34 40
-00 00 BA 4F 02 00 1A 42 C4 1D A2 52 C4 1D BA 40
-34 40 00 00 8A 4E 02 00 3E 4F 30 4D 84 45 05 43
-4F 55 4E 54 2F 83 1E 53 8F 4E 00 00 5E 4E FF FF
-30 4D 82 4E BE 1D B2 4F C0 1D 3E 4F 82 43 C2 1D
-87 12 4C 42 42 46 98 48 3D 40 A4 48 FE 22 3D 41
-3E 4F 30 4D A6 48 0A 4E 3E 4F 3D 40 BC 48 53 27
-3D 40 92 48 1A E2 B6 1D B2 27 AC 23 BE 48 3E 4F
-3D 40 92 48 B9 23 DE 53 00 00 68 4E 08 5E F8 40
-3F 00 00 00 3D 40 98 4A CD 3F 0C 48 08 45 56 41
-4C 55 41 54 45 00 39 40 BE 1D 39 12 39 12 39 12
-0D 12 B0 12 2A 40 82 48 FA 48 3D 41 B2 41 C2 1D
-B2 41 C0 1D B2 41 BE 1D 30 4D 7A 41 04 51 55 49
-54 00 31 40 E0 1C B2 40 00 1C 00 1C 82 43 B6 1D
-82 43 08 18 B0 12 2A 40 E8 45 04 0D 6F 6B 20 00
-CC 45 34 40 38 1D 44 40 34 40 50 00 62 44 94 45
-82 48 34 40 7E 1C CE 40 B2 41 E8 45 0D 73 74 61
-63 6B 20 65 6D 70 74 79 20 21 96 49 34 40 30 FF
-84 43 B2 41 E8 45 0B 46 52 41 4D 20 66 75 6C 6C
-20 21 96 49 42 42 F4 40 C0 41 28 49 E8 45 04 0D
-20 20 20 00 BC 41 30 49 5A 44 05 41 42 4F 52 54
-3F 40 80 1C BE 3F 8F 93 02 00 AE 26 B2 40 82 48
-0C 45 1B 42 34 20 0B 93 04 24 CB 43 02 00 2B 4B
-FA 3F B0 12 98 4E 82 43 B2 58 82 43 BE 58 82 43
-CA 58 82 43 FA 58 82 43 06 59 82 43 12 59 A2 B3
-DC 05 FD 27 B2 40 11 00 CE 05 E2 C2 23 02 92 C3
-DC 05 38 40 A0 AA 39 42 19 83 FE 23 18 83 FB 23
-92 B3 DC 05 F4 23 87 12 E8 45 04 1B 5B 37 6D 00
-CC 45 CC 45 E8 45 04 1B 5B 30 6D 00 CC 45 DA 4D
-1C 4E 22 4E 90 49 8A 49 86 41 42 4F 52 54 22 00
-87 12 02 46 34 40 96 49 1E 48 2A 40 94 46 01 27
-87 12 4C 42 42 46 9A 46 C0 41 3E 4A 2A 40 C6 48
-52 42 81 5C 92 42 BE 1D C2 1D 30 4D 87 12 1E 46
-4C 42 42 46 56 4A 08 4E 7A 4E 5A D3 5A 53 0A 58
-19 42 C8 1D 6E 4E 3E F0 1E 00 09 5E 82 48 AE 1D
-82 49 B0 1D 82 4A B2 1D 2A 52 82 4A C4 1D 3E 4F
-3D 41 30 41 87 12 E8 45 0F 73 74 61 63 6B 20 6D
-69 73 6D 61 74 63 68 21 9C 49 82 9F B4 1D F2 23
-18 42 AE 1D 19 42 B0 1D A8 49 FE FF 89 48 00 00
-30 4D 3C 46 08 56 41 52 49 41 42 4C 45 00 B0 12
-4C 4A BA 40 86 12 FC FF EF 3F 6E 48 08 43 4F 4E
-53 54 41 4E 54 00 B0 12 4C 4A BA 40 85 12 FC FF
-8A 4E FE FF 3E 4F E0 3F CC 4A 06 43 52 45 41 54
-45 00 B0 12 4C 4A BA 40 85 12 FC FF 8A 4A FE FF
-D3 3F DC 48 05 44 4F 45 53 3E 1A 42 B2 1D BA 40
-84 12 00 00 8A 4D 02 00 3D 41 30 4D 04 4B 05 44
-45 46 45 52 B0 12 4C 4A BA 40 30 40 FC FF BA 40
-1A 4B FE FF B9 3F 00 00 81 5B 82 43 B6 1D 30 4D
-42 4A 01 5D B2 43 B6 1D 30 4D FE 45 87 52 45 43
-55 52 53 45 19 42 C4 1D 99 42 B2 1D 00 00 A2 53
-C4 1D 30 4D 38 4B 01 3A B0 12 4C 4A BA 40 87 12
-FC FF A2 83 C4 1D B2 43 B6 1D 82 4F B4 1D 30 4D
-66 4B 81 3B 82 93 B6 1D 5D 27 87 12 34 40 2A 40
-1E 48 9A 4A 3A 4B 2A 40 70 45 09 49 4D 4D 45 44
-49 41 54 45 1A 42 AE 1D FA D0 80 00 00 00 30 4D
-BE 4F 02 00 3E 4F 30 4D 9A 4B 82 49 53 00 87 12
-42 42 F4 40 C0 41 D2 4B DE 4B 34 40 B0 4B 1E 48
-2A 40 30 4A B0 4B 2A 40 82 4B 83 5B 27 5D 87 12
-30 4A 34 40 34 40 1E 48 1E 48 2A 40 0C 49 88 50
-4F 53 54 50 4F 4E 45 00 87 12 4C 42 42 46 9A 46
-54 40 C0 41 3E 4A 7E 41 C0 41 18 4C 34 40 34 40
-1E 48 1E 48 34 40 1E 48 1E 48 2A 40 1E 4C 3A 4E
-82 4A C6 1D 2E 4E 82 4E C4 1D 3D 40 10 00 09 4A
-08 49 29 83 18 48 FE FF 0E 98 FC 2B 89 48 00 00
-1D 83 F6 23 2A 4A 0A 93 F0 23 3E 4F 3D 41 30 4D
-BA 4B 82 49 46 00 2F 83 8F 4E 00 00 1E 42 C4 1D
-BE 40 C0 41 00 00 A2 52 C4 1D 2E 53 30 4D 1E 4B
-84 45 4C 53 45 00 1A 42 C4 1D BA 40 BC 41 00 00
-2A 52 82 4A C4 1D 8E 4A 00 00 2A 83 0E 4A 30 4D
-C6 45 84 54 48 45 4E 00 9E 42 C4 1D 00 00 3E 4F
-30 4D EA 4A 85 42 45 47 49 4E 30 40 84 43 92 4C
-85 55 4E 54 49 4C 39 40 C0 41 1A 42 C4 1D A2 52
-C4 1D 8A 49 00 00 8A 4E 02 00 3E 4F 30 4D 18 4A
-85 41 47 41 49 4E 39 40 BC 41 EF 3F B4 4A 85 57
-48 49 4C 45 87 12 56 4C 6E 40 2A 40 4C 4B 86 52
-45 50 45 41 54 00 87 12 D6 4C 98 4C 2A 40 70 4C
-82 44 4F 00 2F 83 8F 4E 00 00 1E 42 C4 1D BE 40
-CA 41 00 00 2E 53 82 4E C4 1D A2 53 00 1C 1A 42
-00 1C 8A 43 00 00 30 4D 30 48 84 4C 4F 4F 50 00
-39 40 EC 41 1A 42 C4 1D A2 52 C4 1D 8A 49 00 00
-8A 4E 02 00 1E 42 00 1C A2 83 00 1C 2E 4E 0E 93
-04 24 9E 42 C4 1D 00 00 F5 3F 3E 4F 30 4D E4 43
-85 2B 4C 4F 4F 50 39 40 DA 41 E4 3F 2A 4D 85 4C
-45 41 56 45 1A 42 C4 1D BA 40 FC 41 00 00 BA 40
-BC 41 02 00 B2 50 06 00 C4 1D A2 53 00 1C 2A 52
-19 42 00 1C 89 4A 00 00 30 4D 6E 4D 04 4D 4F 56
-45 00 0A 4E 38 4F 39 4F 3E 4F 0A 93 11 24 08 99
-0F 24 06 2C F8 49 00 00 18 53 1A 83 FB 23 30 4D
-08 5A 09 5A 19 83 18 83 E8 49 00 00 1A 83 FA 23
-30 4D 34 40 CA 1D FC 40 2A 40 84 12 D2 4D 34 52
-08 65 42 65 2A 65 F2 51 60 4D 32 64 E2 62 40 4E
-E6 64 40 64 30 63 48 41 DA 4B 42 4B 26 63 00 00
-3A 40 0C 00 39 40 CA 1D 38 40 CC 1D D9 3F 3A 40
-0E 00 39 40 CC 1D 38 40 CA 1D CC 3F 82 43 CC 1D
-30 4D 92 42 CA 1D C8 1D 30 4D EE 4B 09 50 57 52
-5F 53 54 41 54 45 84 12 1C 4C EE 51 5C 65 2C 4E
-08 50 57 52 5F 48 45 52 45 00 92 42 C4 1D 3C 4E
-92 42 C6 1D 3A 4E EF 3F EE 4C 09 52 53 54 5F 53
-54 41 54 45 92 42 0C 18 3C 4E 92 42 0E 18 3A 4E
-E2 3F 5A 4E 08 52 53 54 5F 48 45 52 45 00 92 42
-C4 1D 0C 18 92 42 C6 1D 0E 18 DF 3F B2 40 E6 4E
-48 4F B2 40 E0 44 D4 44 B2 40 3A 45 4A 45 B2 40
-76 45 8A 45 B2 40 DC 43 EA 43 B2 40 72 44 64 44
-30 41 DE 4C 04 57 49 50 45 00 39 40 80 FF B9 43
-00 00 29 53 39 90 B4 FF FA 23 B0 12 8C 4E B2 40
-5C 65 C4 1D B2 40 EE 51 C6 1D D1 3F 52 4C 06 28
-57 41 52 4D 29 00 1E 42 08 18 87 12 E8 45 05 0D
-1B 5B 37 6D CC 45 70 43 E8 45 27 20 46 61 73 74
-46 6F 72 74 68 20 56 31 36 30 20 31 36 4D 48 7A
-20 28 43 29 20 4A 2E 4D 2E 54 68 6F 6F 72 65 6E
-73 20 CC 45 34 40 30 FF 84 43 2A 41 30 43 E8 45
-0B 62 79 74 65 73 20 66 72 65 65 20 B2 49 B4 4E
-04 57 41 52 4D 00 30 40 E6 4E A4 4C 04 43 4F 4C
-44 00 B2 40 04 A5 20 01 B2 40 88 5A 5C 01 B2 D0
-03 00 04 02 B2 40 FC FF 02 02 B2 C0 03 00 06 02
-B2 D0 00 04 24 02 B2 D3 26 02 B2 43 22 02 B2 43
-42 02 B2 D3 46 02 B2 43 62 02 B2 D3 66 02 F2 43
-26 03 F2 D3 22 03 F2 40 A5 00 41 01 F2 40 10 00
-40 01 D2 43 41 01 F2 40 A5 00 61 01 B2 40 48 00
-62 01 82 43 66 01 39 40 80 00 B2 40 33 00 64 01
-D2 43 61 01 92 D2 9E 01 08 18 A2 93 08 18 01 24
-59 07 38 40 C2 A2 18 83 FE 23 19 83 FA 23 B2 42
-B0 01 F2 D0 10 00 2A 03 F2 C0 40 00 A2 04 3A 40
-58 4F 39 40 B4 FF 89 4A 00 00 29 53 FC 23 92 42
-02 18 F0 FF B2 40 18 00 0A 18 31 40 E0 1C 3F 40
-80 1C 37 40 00 40 36 40 B4 40 35 40 08 40 34 40
-14 40 B2 40 0A 00 DA 1D B2 43 AC 1D 92 C3 30 01
-18 42 08 18 D2 B3 01 02 04 20 38 E3 18 53 82 48
-08 18 B2 40 81 00 C0 05 B2 42 C6 05 B2 40 A1 F7
-C8 05 F2 D0 03 00 0D 02 92 C3 C0 05 92 D3 DA 05
-3D 40 7A 50 18 42 08 18 38 90 0A 00 26 27 38 90
-16 00 23 2F 28 93 F6 22 DE 26 7C 50 E2 B2 60 02
-62 23 B2 40 81 A9 40 06 B2 40 30 00 46 06 D2 D3
-25 02 B2 D0 C0 04 0C 02 B2 C0 C0 04 06 02 92 C3
-40 06 39 40 00 20 89 43 00 00 29 53 39 90 54 21
-FA 23 39 42 B0 12 C0 59 D2 C3 23 02 2C 42 B2 40
-95 00 14 20 B2 40 00 40 18 20 1A 43 B0 12 84 59
-02 24 30 40 5E 5A B0 12 BE 59 7A 93 FC 23 B2 40
-87 AA 14 20 92 43 16 20 B2 40 00 48 18 20 1A 43
-B0 12 84 59 29 42 B0 12 C0 59 92 43 14 20 82 43
-16 20 78 43 3C 42 B2 40 00 77 18 20 1A 43 B0 12
-84 59 B2 40 40 69 18 20 B0 12 7A 59 03 24 58 83
-F2 23 D7 3F 0C 5C A2 43 16 20 B2 40 00 50 18 20
-B0 12 7A 59 CE 23 92 D3 40 06 82 43 46 06 92 C3
-40 06 B0 12 E6 59 38 40 00 1E 92 48 C6 01 04 20
-92 48 C8 01 06 20 5A 48 C2 01 92 43 02 20 7A 80
-06 00 0D 24 7A 82 0B 24 A2 43 02 20 6A 53 07 24
-5A 53 05 24 3A 50 0B 20 0C 4A 30 40 64 5A B0 12
-E6 59 D2 48 0D 00 12 20 19 48 0E 00 82 49 08 20
-1A 48 16 00 0A 93 02 20 1A 48 24 00 82 4A 0A 20
-09 5A 82 49 0C 20 09 5A A2 93 02 20 04 24 82 49
-0E 20 39 50 20 00 19 82 12 20 19 82 12 20 82 49
-10 20 92 42 02 20 2C 20 BE 3E 84 12 D2 4D 16 58
-C2 58 CA 57 16 59 90 57 4A 58 94 54 00 00 86 57
-36 58 E8 57 26 58 A4 55 00 00 00 00 28 59 FE 4D
-DE 4E 85 48 49 32 4C 4F 87 12 84 43 6A 4C 1E 48
-3A 4B 00 4E CA 51 2A 40 4C 4F 04 43 4F 44 45 00
-B0 12 4C 4A A2 82 C4 1D 87 12 7A 4B BC 41 02 52
-00 00 07 45 4E 44 43 4F 44 45 87 12 0E 4E 9A 4A
-2A 40 D0 4C 03 41 53 4D 92 42 C8 1D B8 1D B2 40
-CE 51 C8 1D E5 3F 22 52 06 45 4E 44 41 53 4D 00
-92 42 B8 1D C8 1D E9 3F 00 00 05 43 4F 4C 4F 4E
-1A 42 C4 1D BA 40 87 12 00 00 A2 53 C4 1D B2 43
-B6 1D 30 40 0E 4E 00 00 05 4C 4F 32 48 49 1A 42
-C4 1D BA 40 B0 12 00 00 BA 40 2A 40 02 00 A2 52
-C4 1D ED 3F 38 40 BE 1D 39 48 2A 48 09 5A 1A 52
-C2 1D 09 9A 03 24 7E 9A FC 27 1A 83 0E 4A 2A 88
-82 4A C2 1D 30 4D B0 12 2A 40 42 46 9A 46 72 41
-C0 41 CC 52 56 47 C0 41 3E 4A EE 52 CE 52 29 4E
+0E 93 3E 4F FB 27 2D 53 30 4D 1E 83 0E 7E F9 3F
+39 40 00 80 39 8F 08 4E 3E 4F 08 59 19 15 30 4D
+81 5E 00 00 3E 4F 32 B0 00 01 E8 27 2D 53 21 52
+30 4D 91 53 00 00 F7 3F CE 41 06 55 4E 4C 4F 4F
+50 00 F5 3F 00 00 01 49 2F 83 8F 4E 00 00 2E 41
+1E 81 02 00 30 4D 1E 41 01 4A 2F 83 8F 4E 00 00
+1E 41 04 00 1E 81 06 00 30 4D 9C 41 03 50 41 44
+85 12 E2 1C 1A 42 03 54 49 42 85 12 38 1D 0E 41
+03 43 50 4C 85 12 50 00 C2 41 03 3E 49 4E 85 12
+C2 1D 60 42 04 42 41 53 45 00 85 12 DA 1D C8 40
+05 53 54 41 54 45 85 12 B6 1D 74 42 02 42 4C 00
+85 12 20 00 B4 41 02 3C 23 00 B2 40 AA 1D AA 1D
+30 4D 8C 42 01 23 2C 4F 5B 42 DA 1D 0A 43 34 40
+20 00 0E 93 04 20 04 11 0E 4C 0C 43 09 43 0A 9B
+01 28 0A 8B 09 69 08 68 14 83 07 30 0C 5C 0E 6E
+0A 6A F5 2B 0A 8B 12 D3 F5 3F 34 40 14 40 8F 49
+00 00 0E 48 7A 90 0A 00 02 28 3A 50 07 00 3A 50
+30 00 92 83 AA 1D 18 42 AA 1D C8 4A 00 00 30 4D
+A4 42 02 23 53 00 87 12 A6 42 0C 43 2D 83 09 93
+CA 23 0E 93 C8 23 3D 41 30 4D 02 43 02 23 3E 00
+9F 42 AA 1D 00 00 3E 40 AA 1D 2E 8F 30 4D 26 42
+04 48 4F 4C 44 00 0A 4E 3E 4F DB 3F 80 42 04 53
+49 47 4E 00 0E 93 3E 4F 3A 40 2D 00 D2 33 30 4D
+56 42 02 55 2E 00 87 12 9A 42 34 40 00 00 06 43
+20 43 E0 45 A8 45 2A 40 68 41 02 44 2E 00 87 12
+9A 42 78 40 8A 40 6E 41 06 43 9A 40 44 43 20 43
+E0 45 A8 45 2A 40 50 41 01 2E 0E 93 E4 37 2F 83
+8F 4E 00 00 3E 43 EB 3F 30 43 04 48 45 52 45 00
+2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D 5C 41 05 41
+4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D 1C 43 02 43
+2C 00 1A 42 C4 1D CA 4E 00 00 92 53 C4 1D 3E 4F
+30 4D 2F 83 8F 4E 00 00 B0 12 BA 44 92 B3 DC 05
+FD 27 1E 42 CC 05 B0 12 CC 44 30 4D 9A 43 05 28
+4B 45 59 29 18 42 CC 05 EC 3F 38 42 03 4B 45 59
+30 40 F4 43 0D 12 3D 40 2E 44 1B 42 34 20 9B 42
+1E 20 16 00 3A 40 00 21 8F 4A 02 00 8F 4E 00 00
+0E 43 82 93 20 20 13 24 19 42 1E 20 02 3C 30 44
+2D 83 19 92 20 20 15 2C 58 49 00 1E 19 53 78 90
+20 00 08 2C 78 90 0A 00 F4 23 82 49 1E 20 2F 53
+3D 41 30 4D 2E 9F 64 24 CA 48 00 00 1A 53 1E 53
+5F 3C 0A 12 B0 12 A4 5E 3A 41 DB 3F AE 43 06 41
+43 43 45 50 54 00 30 40 86 44 EE 43 08 28 41 43
+43 45 50 54 29 00 3C 40 38 45 3B 40 02 45 2D 15
+0A 4E 2E 4F 0A 5E 3B 40 0D 00 3C 40 20 00 3D 40
+2C 45 92 B3 DC 05 05 24 18 42 CC 05 38 90 0A 00
+04 20 21 53 39 40 E6 44 4D 15 B2 40 11 00 CE 05
+E2 C2 23 02 A2 B3 DC 05 FD 27 30 41 B2 40 13 00
+CE 05 E2 D2 23 02 A2 B3 DC 05 FD 27 30 41 00 00
+05 53 4C 45 45 50 30 40 F4 44 00 00 07 28 53 4C
+45 45 50 29 12 D2 0A 18 F6 3F 21 52 3A 17 58 42
+CC 05 48 9B E3 27 48 9C 06 2C 78 92 11 20 2E 9F
+0F 24 1E 83 05 3C 0E 9A 03 24 CE 48 00 00 1E 53
+82 48 CE 05 A2 B3 DC 05 FD 27 30 4D 2E 45 2D 83
+92 B3 DC 05 FD 27 E3 23 B2 40 18 00 0A 18 3E 8F
+3D 41 30 4D 7C 44 06 28 45 4D 49 54 29 00 08 4E
+3E 4F E6 3F 6A 43 04 45 4D 49 54 00 30 40 4E 45
+56 45 04 45 43 48 4F 00 B2 40 82 48 20 45 30 4D
+88 43 06 4E 4F 45 43 48 4F 00 B2 40 30 4D 20 45
+30 4D 46 45 04 28 43 52 29 00 2F 83 8F 4E 00 00
+3E 40 0D 00 E3 3F BE 43 02 43 52 00 30 40 8A 45
+3E 43 05 53 50 41 43 45 2F 83 8F 4E 00 00 3E 40
+20 00 D4 3F A2 45 06 53 50 41 43 45 53 00 0E 93
+09 24 0D 12 3D 40 CA 45 EF 3F CC 45 2D 83 1E 83
+EB 23 3D 41 3E 4F 30 4D 52 43 04 54 59 50 45 00
+0E 93 95 24 2A 4F 8F 5E 00 00 0E 4A 87 12 F0 41
+28 42 08 41 5C 45 12 42 F0 45 2A 40 2F 82 8F 4E
+02 00 7E 4D 8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D
+B6 45 82 53 22 00 87 12 34 40 FC 45 32 48 34 40
+22 00 56 46 26 46 3D 41 6E 4E 1E 83 82 5E C4 1D
+3E 4F 92 B3 C4 1D A2 63 C4 1D 30 4D 72 45 82 2E
+22 00 87 12 16 46 34 40 E0 45 32 48 2A 40 00 00
+04 57 4F 52 44 00 3C 40 BE 1D 39 4C 3A 4C 09 5A
+3A 5C 28 4C 09 9A 19 24 7E 9A FC 27 1A 83 3B 40
+60 00 C8 4C 00 00 09 9A 0C 24 7C 4A 4E 9C 09 24
+18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F 7C 80 20 00
+F0 3F 1A 82 C0 1D 82 4A C2 1D 1E 42 C4 1D 08 8E
+CE 48 00 00 30 4D 00 00 04 46 49 4E 44 00 2F 83
+0C 4E 65 4C 74 40 80 00 3B 40 CA 1D 3E 4B 0E 93
+1E 24 58 4C 01 00 78 F0 1E 00 0E 58 2E 53 1E 4E
+FE FF 0E 93 F3 27 09 4E 78 49 48 C4 48 95 F7 23
+0A 4C 1A 53 FA 99 00 00 F2 23 58 83 FA 23 19 B3
+09 63 0C 49 6A 4E 1E 43 4A 93 01 30 2E 83 8F 4C
+00 00 35 40 08 40 34 40 14 40 30 4D 2F 53 2F 53
+3E 4F 30 4D 6A 42 07 3E 4E 55 4D 42 45 52 3C 4F
+38 4F 29 4F 2F 82 1B 42 DA 1D 6A 4C 7A 80 30 00
+7A 90 0A 00 02 28 7A 80 07 00 0A 9B 13 2C 82 49
+D0 04 82 48 D2 04 82 4B C8 04 19 42 E4 04 18 42
+E6 04 09 5A 08 63 1C 53 1E 83 E7 23 8F 49 04 00
+8F 48 02 00 8F 4C 00 00 30 4D 03 12 0D 12 1B 42
+DA 1D 0B 12 32 C0 00 02 6D 4E 0D 5E 0C 4E 7A 40
+2E 00 0D 9C 0A 28 7A 9C FC 23 32 D0 00 02 FC 4C
+FE FF 0D 9C FC 2F DE 83 00 00 09 43 08 43 3D 40
+E0 47 3F 82 8F 4E 06 00 0C 4E 7E 4C 6A 4C 7A 90
+2D 00 10 2C 3B 40 10 00 7A 80 24 00 06 24 2B 43
+5A 83 03 24 3B 52 6A 53 B0 23 1C 53 1E 83 6A 4C
+7A 90 2D 00 AA 23 1C 53 1E 83 B1 43 04 00 A5 3F
+E2 47 2F 53 0E 93 2C 17 82 4C DA 1D 03 24 2F 52
+0E F3 30 4D 9F 4F 02 00 04 00 BF 4F 00 00 3E E3
+09 20 3E E3 BF E3 02 00 BF E3 00 00 9F 53 02 00
+8F 63 00 00 32 B0 00 02 01 20 2F 53 30 4D 62 45
+07 45 58 45 43 55 54 45 0A 4E 3E 4F 00 4A 26 41
+01 2C 1A 42 C4 1D A2 53 C4 1D 8A 4E 00 00 3E 4F
+30 4D 30 48 87 4C 49 54 45 52 41 4C 82 93 B6 1D
+0F 24 1A 42 C4 1D A2 52 C4 1D BA 40 34 40 00 00
+8A 4E 02 00 3E 4F 32 B0 00 02 32 C0 00 02 F1 23
+30 4D 98 45 05 43 4F 55 4E 54 2F 83 1E 53 8F 4E
+00 00 5E 4E FF FF 30 4D 82 4E BE 1D B2 4F C0 1D
+3E 4F 82 43 C2 1D 87 12 90 42 56 46 9E 48 3D 40
+AA 48 05 23 3D 41 3E 4F 30 4D AC 48 0A 4E 3E 4F
+3D 40 C2 48 5A 27 3D 40 98 48 1A E2 B6 1D B9 27
+B3 23 C4 48 3E 4F 3D 40 98 48 C0 23 DE 53 00 00
+68 4E 08 5E F8 40 3F 00 00 00 3D 40 00 4B CD 3F
+20 48 08 45 56 41 4C 55 41 54 45 00 39 40 BE 1D
+3C 49 3B 49 3A 49 3D 15 B0 12 2A 40 88 48 00 49
+B2 41 C2 1D B2 41 C0 1D B2 41 BE 1D 3D 41 30 4D
+4C 42 04 51 55 49 54 00 31 40 E0 1C B2 40 00 1C
+00 1C 82 43 B6 1D 82 43 08 18 B0 12 2A 40 FC 45
+03 0D 6F 6B E0 45 A8 45 5A 42 44 40 64 42 76 44
+A8 45 88 48 DE 40 92 41 FC 45 0D 73 74 61 63 6B
+20 65 6D 70 74 79 21 20 92 49 34 40 30 FF A0 43
+D2 41 FC 45 0B 46 52 41 4D 20 66 75 6C 6C 21 20
+92 49 86 42 F2 40 E0 41 2E 49 FC 45 03 0D 20 20
+DC 41 34 49 6E 44 05 41 42 4F 52 54 3F 40 80 1C
+C3 3F 8F 93 02 00 BA 26 B2 40 82 48 20 45 1B 42
+34 20 0B 93 04 24 CB 43 02 00 2B 4B FA 3F B0 12
+B4 4E A2 B3 DC 05 FD 27 B2 40 11 00 CE 05 E2 C2
+23 02 92 C3 DC 05 38 40 A0 AA 39 42 03 43 19 83
+FD 23 18 83 FA 23 92 B3 DC 05 F3 23 87 12 FC 45
+04 1B 5B 37 6D 00 E0 45 E0 45 FC 45 04 1B 5B 30
+6D 00 E0 45 C2 4D 04 4E 0A 4E 52 4E 8C 49 86 49
+86 41 42 4F 52 54 22 00 87 12 16 46 34 40 92 49
+32 48 2A 40 A8 46 01 27 87 12 90 42 56 46 AE 46
+E0 41 26 4A 2A 40 CC 48 96 42 81 5C 92 42 BE 1D
+C2 1D 30 4D 00 00 81 5B 82 43 B6 1D 30 4D 2A 4A
+01 5D B2 43 B6 1D 30 4D 36 4A 83 5B 27 5D 87 12
+18 4A 34 40 34 40 32 48 32 48 2A 40 BE 4F 02 00
+3E 4F 30 4D 84 45 82 49 53 00 87 12 86 42 F2 40
+E0 41 7E 4A 4E 4A 34 40 5C 4A 32 48 2A 40 18 4A
+5C 4A 2A 40 66 4A 09 49 4D 4D 45 44 49 41 54 45
+1A 42 AE 1D FA D0 80 00 00 00 30 4D 12 46 87 52
+45 43 55 52 53 45 19 42 C4 1D 99 42 B2 1D 00 00
+A2 53 C4 1D 30 4D 12 49 88 50 4F 53 54 50 4F 4E
+45 00 87 12 90 42 56 46 AE 46 54 40 E0 41 26 4A
+92 41 E0 41 E2 4A 34 40 34 40 32 48 32 48 34 40
+32 48 32 48 2A 40 82 9F B4 1D A0 24 87 12 FC 45
+0F 73 74 61 63 6B 20 6D 69 73 6D 61 74 63 68 21
+98 49 87 12 32 46 90 42 56 46 0C 4B 08 4E 7A 4E
+5A D3 5A 53 0A 58 19 42 C8 1D 6E 4E 3E F0 1E 00
+09 5E 82 48 AE 1D 82 49 B0 1D 82 4A B2 1D 2A 52
+82 4A C4 1D 3E 4F 3D 41 30 41 50 46 08 56 41 52
+49 41 42 4C 45 00 B0 12 02 4B BA 40 86 12 FC FF
+71 3C 74 48 08 43 4F 4E 53 54 41 4E 54 00 B0 12
+02 4B BA 40 85 12 FC FF 8A 4E FE FF 3E 4F 62 3C
+54 4B 06 43 52 45 41 54 45 00 B0 12 02 4B BA 40
+85 12 FC FF 8A 4A FE FF 55 3C E2 48 05 44 4F 45
+53 3E 1A 42 B2 1D BA 40 84 12 00 00 8A 4D 02 00
+3D 41 30 4D 8C 4B 05 44 45 46 45 52 B0 12 02 4B
+BA 40 30 40 FC FF BA 40 A2 4B FE FF 3B 3C 4A 4A
+01 3A B0 12 02 4B BA 40 87 12 FC FF A2 83 C4 1D
+B2 43 B6 1D 82 4F B4 1D 30 4D C0 4B 81 3B 82 93
+B6 1D 24 27 87 12 34 40 2A 40 32 48 E6 4A 38 4A
+2A 40 F4 4B 3D 41 B2 4E 0E 18 A2 4E 0C 18 3E 4F
+32 3D 44 48 06 4D 41 52 4B 45 52 00 B0 12 02 4B
+BA 40 84 12 FC FF BA 40 F2 4B FE FF 9A 42 C6 1D
+00 00 28 83 8A 48 02 00 A2 52 C4 1D 18 42 AE 1D
+19 42 B0 1D A8 49 FE FF 89 48 00 00 30 4D 86 4A
+82 49 46 00 2F 83 8F 4E 00 00 1E 42 C4 1D A2 52
+C4 1D BE 40 E0 41 00 00 2E 53 30 4D A6 4B 84 45
+4C 53 45 00 A2 52 C4 1D 1A 42 C4 1D BA 40 DC 41
+FC FF 8E 4A 00 00 2A 83 0E 4A 30 4D DA 45 84 54
+48 45 4E 00 9E 42 C4 1D 00 00 3E 4F 30 4D 72 4B
+85 42 45 47 49 4E 30 40 A0 43 7E 4C 85 55 4E 54
+49 4C 39 40 E0 41 A2 52 C4 1D 1A 42 C4 1D 8A 49
+FC FF 8A 4E FE FF 3E 4F 30 4D 00 4A 85 41 47 41
+49 4E 39 40 DC 41 EF 3F 3C 4B 85 57 48 49 4C 45
+87 12 44 4C 78 40 2A 40 9E 4A 86 52 45 50 45 41
+54 00 87 12 C2 4C 84 4C 2A 40 5E 4C 82 44 4F 00
+2F 83 8F 4E 00 00 A2 53 C4 1D 1E 42 C4 1D BE 40
+F0 41 FE FF A2 53 00 1C 1A 42 00 1C 8A 43 00 00
+30 4D 04 4C 84 4C 4F 4F 50 00 39 40 12 42 A2 52
+C4 1D 1A 42 C4 1D 8A 49 FC FF 8A 4E FE FF 1E 42
+00 1C A2 83 00 1C 2E 4E 0E 93 03 24 8E 4A 00 00
+F6 3F 3E 4F 30 4D FC 43 85 2B 4C 4F 4F 50 39 40
+00 42 E5 3F 14 4D 85 4C 45 41 56 45 1A 42 C4 1D
+BA 40 22 42 00 00 BA 40 DC 41 02 00 B2 50 06 00
+C4 1D A2 53 00 1C 2A 52 19 42 00 1C 89 4A 00 00
+30 4D 56 4D 04 4D 4F 56 45 00 0A 4E 38 4F 39 4F
+3E 4F 0A 93 11 24 08 99 0F 24 06 2C F8 49 00 00
+18 53 1A 83 FB 23 30 4D 08 5A 09 5A 19 83 18 83
+E8 49 00 00 1A 83 FA 23 30 4D 34 40 CA 1D FA 40
+2A 40 84 12 BA 4D 96 53 50 60 44 60 16 4A 54 53
+48 4D 5E 60 06 5B 76 4E DA 64 D0 65 CC 64 46 41
+E4 5D 40 4A 1A 5B 00 00 3A 40 0E 00 39 40 CA 1D
+38 40 CC 1D D9 3F 3A 40 0E 00 39 40 CC 1D 38 40
+CA 1D CC 3F 82 43 CC 1D 30 4D 92 42 CA 1D C8 1D
+30 4D 14 4E 3A 4E 82 4A C6 1D 2E 4E 82 4E C4 1D
+3D 40 10 00 09 4A 08 49 29 83 18 48 FE FF 0E 98
+FC 2B 89 48 00 00 1D 83 F6 23 2A 4A 0A 93 F0 23
+3E 4F 3D 41 30 4D B8 4A 09 50 57 52 5F 53 54 41
+54 45 84 12 12 4E 50 53 36 66 DA 4C 09 52 53 54
+5F 53 54 41 54 45 92 42 0E 18 56 4E 92 42 0C 18
+58 4E EF 3F 48 4E 08 50 57 52 5F 48 45 52 45 00
+92 42 C6 1D 56 4E 92 42 C4 1D 58 4E 30 4D 5C 4E
+08 52 53 54 5F 48 45 52 45 00 92 42 C6 1D 0E 18
+92 42 C4 1D 0C 18 EC 3F B2 40 42 50 A4 50 B2 40
+F4 44 E8 44 B2 40 4E 45 5E 45 B2 40 8A 45 9E 45
+B2 40 F4 43 02 44 B2 40 86 44 78 44 82 43 12 5A
+82 43 1E 5A 82 43 2A 5A 82 43 5A 5A 82 43 66 5A
+82 43 72 5A 30 41 CA 4C 04 57 49 50 45 00 39 40
+80 FF B9 43 00 00 29 53 39 90 B4 FF FA 23 B0 12
+A8 4E B2 40 36 66 0C 18 B2 40 50 53 0E 18 AB 3F
+90 4C 07 43 4F 4D 50 41 52 45 0C 4E 38 4F 3B 4F
+39 4F 0E 4B 0E 5C 0C 24 1B 83 07 30 1C 83 07 30
+19 53 F9 98 FF FF F5 27 02 2C 3E 43 30 4D 1E 43
+30 4D DC 4B 86 5B 54 48 45 4E 5D 00 30 4D 1E 83
+30 4D 44 4F 86 5B 45 4C 53 45 5D 00 87 12 34 40
+01 00 90 42 56 46 7A 48 44 40 E0 41 CA 4F 8A 40
+8A 40 FC 45 04 5B 49 46 5D 00 1A 4F EA 41 88 4F
+0E 47 2C 41 DC 41 BE 4F 8A 40 8A 40 FC 45 06 5B
+45 4C 53 45 5D 00 1A 4F EA 41 AC 4F 0E 47 4E 4F
+44 40 E0 41 A8 4F 2C 41 DC 41 BE 4F FC 45 06 5B
+54 48 45 4E 5D 00 1A 4F EA 41 BE 4F 4E 4F 54 40
+EA 41 C6 4F 2A 40 DC 41 62 4F 0E 47 FC 45 03 0D
+6B 6F E0 45 A8 45 5A 42 44 40 64 42 76 44 E0 4F
+82 43 C2 1D 82 4E BE 1D B2 4F C0 1D 3E 4F 3D 40
+62 4F 30 4D 54 4F 84 5B 49 46 5D 00 0E 93 3E 4F
+AD 27 30 4D F6 4F 8B 5B 55 4E 44 45 46 49 4E 45
+44 5D 87 12 90 42 56 46 AE 46 6C 40 86 41 2A 40
+06 50 89 5B 44 45 46 49 4E 45 44 5D 87 12 90 42
+56 46 AE 46 6C 40 2A 40 40 4C 06 28 57 41 52 4D
+29 00 1E 42 08 18 87 12 FC 45 05 0D 1B 5B 37 6D
+E0 45 8A 43 FC 45 27 20 46 61 73 74 46 6F 72 74
+68 20 56 31 36 32 20 31 36 4D 48 7A 20 28 43 29
+20 4A 2E 4D 2E 54 68 6F 6F 72 65 6E 73 20 E0 45
+34 40 30 FF A0 43 28 41 56 43 FC 45 0B 62 79 74
+65 73 20 66 72 65 65 20 AE 49 E8 4E 04 57 41 52
+4D 00 30 40 42 50 12 4F 04 43 4F 4C 44 00 B2 40
+04 A5 20 01 B2 40 88 5A 5C 01 B2 D0 03 00 04 02
+B2 40 FC FF 02 02 B2 C0 03 00 06 02 B2 D0 00 04
+24 02 B2 D3 26 02 B2 43 22 02 B2 43 42 02 B2 D3
+46 02 B2 43 62 02 B2 D3 66 02 F2 43 26 03 F2 D3
+22 03 F2 40 A5 00 41 01 F2 40 10 00 40 01 D2 43
+41 01 F2 40 A5 00 61 01 B2 40 48 00 62 01 82 43
+66 01 39 40 80 00 B2 40 33 00 64 01 D2 43 61 01
+92 D2 9E 01 08 18 A2 93 08 18 01 24 59 07 38 40
+C2 A2 18 83 FE 23 19 83 FA 23 B2 42 B0 01 F2 D0
+10 00 2A 03 F2 40 A5 00 A1 04 F2 C0 40 00 A2 04
+3A 40 B4 50 39 40 B4 FF 89 4A 00 00 29 53 FC 23
+92 42 02 18 F0 FF B2 40 18 00 0A 18 31 40 E0 1C
+3F 40 80 1C 37 40 00 40 36 40 BC 40 35 40 08 40
+34 40 14 40 B2 40 0A 00 DA 1D B2 43 AC 1D 92 C3
+30 01 18 42 08 18 D2 B3 01 02 04 20 38 E3 18 53
+82 48 08 18 B2 40 81 00 C0 05 B2 42 C6 05 B2 40
+A1 F7 C8 05 F2 D0 03 00 0D 02 92 C3 C0 05 92 D3
+DA 05 3D 40 DC 51 18 42 08 18 38 90 0A 00 8F 26
+38 90 16 00 8C 2E 28 93 46 22 3B 26 DE 51 E2 B2
+60 02 5F 23 B2 40 81 A9 40 06 B2 40 30 00 46 06
+D2 D3 25 02 B2 D0 C0 04 0C 02 B2 C0 C0 04 06 02
+92 C3 40 06 39 40 00 20 89 43 00 00 29 53 39 90
+54 21 FA 23 39 42 B0 12 08 5D D2 C3 23 02 2C 42
+B2 40 95 00 14 20 B2 40 00 40 18 20 1A 43 B0 12
+CC 5C 02 24 30 40 A6 5D B0 12 06 5D 7A 93 FC 23
+B2 40 87 AA 14 20 92 43 16 20 B2 40 00 48 18 20
+1A 43 B0 12 CC 5C 29 42 B0 12 08 5D 92 43 14 20
+82 43 16 20 78 43 3C 42 B2 40 00 77 18 20 1A 43
+B0 12 CC 5C B2 40 40 69 18 20 B0 12 C2 5C 03 24
+58 83 F2 23 D7 3F 0C 5C A2 43 16 20 B2 40 00 50
+18 20 B0 12 C2 5C CE 23 92 D3 40 06 82 43 46 06
+92 C3 40 06 B0 12 2E 5D 38 40 00 1E 92 48 C6 01
+04 20 92 48 C8 01 06 20 5A 48 C2 01 92 43 02 20
+7A 80 06 00 0D 24 7A 82 0B 24 A2 43 02 20 6A 53
+07 24 5A 53 05 24 3A 50 0B 20 0C 4A 30 40 AC 5D
+B0 12 2E 5D D2 48 0D 00 12 20 19 48 0E 00 82 49
+08 20 1A 48 16 00 0A 93 02 20 1A 48 24 00 82 4A
+0A 20 09 5A 82 49 0C 20 09 5A A2 93 02 20 04 24
+82 49 0E 20 39 50 20 00 19 82 12 20 19 82 12 20
+82 49 10 20 92 42 02 20 2C 20 BB 3E 84 12 BA 4D
+76 59 22 5A 2A 59 76 5A F0 58 AA 59 F4 55 00 00
+E6 58 96 59 48 59 86 59 04 57 00 00 00 00 88 5A
+E6 4D 3A 50 85 48 49 32 4C 4F 87 12 A0 43 58 4C
+32 48 38 4A E8 4D 2C 53 2A 40 A8 50 04 43 4F 44
+45 00 B0 12 02 4B A2 82 C4 1D 87 12 D4 4B DC 41
+64 53 00 00 07 45 4E 44 43 4F 44 45 87 12 F6 4D
+E6 4A 2A 40 BC 4C 03 41 53 4D 92 42 C8 1D B8 1D
+B2 40 30 53 C8 1D E5 3F 84 53 06 45 4E 44 41 53
+4D 00 92 42 B8 1D C8 1D E9 3F 00 00 05 43 4F 4C
+4F 4E 1A 42 C4 1D BA 40 87 12 00 00 A2 53 C4 1D
+B2 43 B6 1D 30 40 F6 4D 00 00 05 4C 4F 32 48 49
+1A 42 C4 1D BA 40 B0 12 00 00 BA 40 2A 40 02 00
+A2 52 C4 1D ED 3F 38 40 BE 1D 39 48 2A 48 09 5A
+1A 52 C2 1D 09 9A 03 24 7E 9A FC 27 1A 83 0E 4A
+2A 88 82 4A C2 1D 30 4D B0 12 2A 40 56 46 AE 46
+EA 41 2C 54 6A 47 E0 41 26 4A 4E 54 2E 54 29 4E
39 90 86 12 02 20 2E 53 30 41 39 90 85 12 03 20
1E 4E 02 00 30 41 39 90 84 12 01 20 2E 52 30 41
19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 40 29 00
-12 12 C2 1D 92 53 C2 1D B0 12 2A 40 42 46 56 47
-C0 41 20 53 16 53 21 53 3E 90 10 00 BB 2D 30 41
-22 53 B2 41 C2 1D 22 D3 30 41 87 12 4C 42 94 52
-32 53 82 43 BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D
+12 12 C2 1D 92 53 C2 1D B0 12 2A 40 56 46 6A 47
+E0 41 80 54 76 54 21 53 3E 90 10 00 BB 2D 30 41
+82 54 B2 41 C2 1D 22 D3 30 41 87 12 90 42 F6 53
+92 54 82 43 BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D
0A 4E 3E 4F FA 90 23 00 00 00 34 20 92 53 C2 1D
-B0 12 B6 52 0E 93 04 20 B2 40 00 03 BC 1D 27 3C
+B0 12 18 54 0E 93 04 20 B2 40 00 03 BC 1D 27 3C
1E 93 04 20 B2 40 10 03 BC 1D 21 3C 2E 93 04 20
B2 40 20 03 BC 1D 1B 3C 2E 92 04 20 B2 40 20 02
BC 1D 15 3C 3E 92 04 20 B2 40 30 02 BC 1D 0F 3C
3E 93 04 20 B2 40 30 03 BC 1D 09 3C B2 40 30 00
BC 1D 19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 4F
3D 41 30 4D FA 90 26 00 00 00 08 20 B2 40 10 02
-BC 1D 92 53 C2 1D 30 12 A2 53 75 3F FA 90 40 00
+BC 1D 92 53 C2 1D 30 12 02 55 76 3F FA 90 40 00
00 00 1A 20 B2 40 20 00 BC 1D 92 53 C2 1D B0 12
-00 53 0E 20 B2 50 10 00 BC 1D 3E 40 2B 00 B0 12
-00 53 32 24 92 92 BE 1D C2 1D 02 24 92 53 C2 1D
-8E 10 82 5E BC 1D D3 3F B0 12 00 53 F9 23 B2 50
-10 00 BC 1D 3E 40 28 00 B0 12 B6 52 30 12 F2 53
-67 3F 87 12 4C 42 94 52 2A 54 FE 90 26 00 00 00
+60 54 0E 20 B2 50 10 00 BC 1D 3E 40 2B 00 B0 12
+60 54 32 24 92 92 BE 1D C2 1D 02 24 92 53 C2 1D
+8E 10 82 5E BC 1D D3 3F B0 12 60 54 F9 23 B2 50
+10 00 BC 1D 3E 40 28 00 B0 12 18 54 30 12 52 55
+67 3F 87 12 90 42 F6 53 8A 55 FE 90 26 00 00 00
3E 40 20 00 04 20 B2 50 82 00 BC 1D C2 3F B0 12
-00 53 DF 23 B2 50 80 00 BC 1D 3E 40 28 00 B0 12
-B6 52 B0 12 F0 52 D5 23 3D 40 3E 4A 30 4D CC 44
-04 52 45 54 49 00 87 12 34 40 00 13 1E 48 2A 40
-34 40 2C 00 2A 53 22 54 7A 54 2E 4E 1E D2 BC 1D
-19 42 BA 1D 92 3F 78 52 03 4D 4F 56 84 12 70 54
-00 40 88 54 05 4D 4F 56 2E 42 84 12 70 54 40 40
-00 00 03 41 44 44 84 12 70 54 00 50 A2 54 05 41
-44 44 2E 42 84 12 70 54 40 50 AE 54 04 41 44 44
-43 00 84 12 70 54 00 60 BC 54 06 41 44 44 43 2E
-42 00 84 12 70 54 40 60 60 54 04 53 55 42 43 00
-84 12 70 54 00 70 DA 54 06 53 55 42 43 2E 42 00
-84 12 70 54 40 70 E8 54 03 53 55 42 84 12 70 54
-00 80 F8 54 05 53 55 42 2E 42 84 12 70 54 40 80
-5A 52 03 43 4D 50 84 12 70 54 00 90 12 55 05 43
-4D 50 2E 42 84 12 70 54 40 90 48 52 04 44 41 44
-44 00 84 12 70 54 00 A0 2C 55 06 44 41 44 44 2E
-42 00 84 12 70 54 40 A0 1E 55 03 42 49 54 84 12
-70 54 00 B0 4A 55 05 42 49 54 2E 42 84 12 70 54
-40 B0 56 55 03 42 49 43 84 12 70 54 00 C0 64 55
-05 42 49 43 2E 42 84 12 70 54 40 C0 70 55 03 42
-49 53 84 12 70 54 00 D0 7E 55 05 42 49 53 2E 42
-84 12 70 54 40 D0 00 00 03 58 4F 52 84 12 70 54
-00 E0 98 55 05 58 4F 52 2E 42 84 12 70 54 40 E0
-CA 54 03 41 4E 44 84 12 70 54 00 F0 B2 55 05 41
-4E 44 2E 42 84 12 70 54 40 F0 4C 42 2A 53 D0 55
+60 54 DF 23 B2 50 80 00 BC 1D 3E 40 28 00 B0 12
+18 54 B0 12 50 54 D5 23 3D 40 26 4A 30 4D E0 44
+04 52 45 54 49 00 87 12 34 40 00 13 32 48 2A 40
+34 40 2C 00 8A 54 82 55 DA 55 2E 4E 1E D2 BC 1D
+19 42 BA 1D 92 3F DA 53 03 4D 4F 56 84 12 D0 55
+00 40 E8 55 05 4D 4F 56 2E 42 84 12 D0 55 40 40
+00 00 03 41 44 44 84 12 D0 55 00 50 02 56 05 41
+44 44 2E 42 84 12 D0 55 40 50 0E 56 04 41 44 44
+43 00 84 12 D0 55 00 60 1C 56 06 41 44 44 43 2E
+42 00 84 12 D0 55 40 60 C0 55 04 53 55 42 43 00
+84 12 D0 55 00 70 3A 56 06 53 55 42 43 2E 42 00
+84 12 D0 55 40 70 48 56 03 53 55 42 84 12 D0 55
+00 80 58 56 05 53 55 42 2E 42 84 12 D0 55 40 80
+BC 53 03 43 4D 50 84 12 D0 55 00 90 72 56 05 43
+4D 50 2E 42 84 12 D0 55 40 90 AA 53 04 44 41 44
+44 00 84 12 D0 55 00 A0 8C 56 06 44 41 44 44 2E
+42 00 84 12 D0 55 40 A0 7E 56 03 42 49 54 84 12
+D0 55 00 B0 AA 56 05 42 49 54 2E 42 84 12 D0 55
+40 B0 B6 56 03 42 49 43 84 12 D0 55 00 C0 C4 56
+05 42 49 43 2E 42 84 12 D0 55 40 C0 D0 56 03 42
+49 53 84 12 D0 55 00 D0 DE 56 05 42 49 53 2E 42
+84 12 D0 55 40 D0 00 00 03 58 4F 52 84 12 D0 55
+00 E0 F8 56 05 58 4F 52 2E 42 84 12 D0 55 40 E0
+2A 56 03 41 4E 44 84 12 D0 55 00 F0 12 57 05 41
+4E 44 2E 42 84 12 D0 55 40 F0 90 42 8A 54 30 57
1A 42 BC 1D B2 F0 70 00 BC 1D 8A 10 3A F0 0F 00
-82 DA BC 1D 4A 3F 04 55 03 52 52 43 84 12 CA 55
-00 10 E8 55 05 52 52 43 2E 42 84 12 CA 55 40 10
-F4 55 04 53 57 50 42 00 84 12 CA 55 80 10 02 56
-03 52 52 41 84 12 CA 55 00 11 10 56 05 52 52 41
-2E 42 84 12 CA 55 40 11 1C 56 03 53 58 54 84 12
-CA 55 80 11 00 00 04 50 55 53 48 00 84 12 CA 55
-00 12 36 56 06 50 55 53 48 2E 42 00 84 12 CA 55
-40 12 8A 55 04 43 41 4C 4C 00 84 12 CA 55 80 12
-34 40 2C 00 2A 53 22 54 6A 56 59 42 BC 1D 5A 42
+82 DA BC 1D 4A 3F 64 56 03 52 52 43 84 12 2A 57
+00 10 48 57 05 52 52 43 2E 42 84 12 2A 57 40 10
+54 57 04 53 57 50 42 00 84 12 2A 57 80 10 62 57
+03 52 52 41 84 12 2A 57 00 11 70 57 05 52 52 41
+2E 42 84 12 2A 57 40 11 7C 57 03 53 58 54 84 12
+2A 57 80 11 00 00 04 50 55 53 48 00 84 12 2A 57
+00 12 96 57 06 50 55 53 48 2E 42 00 84 12 2A 57
+40 12 EA 56 04 43 41 4C 4C 00 84 12 2A 57 80 12
+34 40 2C 00 8A 54 82 55 CA 57 59 42 BC 1D 5A 42
BD 1D 82 4A BC 1D BE 90 00 15 00 00 02 20 0A 89
02 3C 09 8A 0A 49 3A 90 10 00 03 2C 5A 0E A8 3F
-1A 53 0E 4A 87 12 70 43 E8 45 0D 6F 75 74 20 6F
-66 20 62 6F 75 6E 64 73 9C 49 44 56 05 50 55 53
-48 4D 84 12 60 56 00 15 AC 56 04 50 4F 50 4D 00
-84 12 60 56 00 17 4C 42 94 52 CC 56 82 43 BC 1D
+1A 53 0E 4A 87 12 8A 43 FC 45 0D 6F 75 74 20 6F
+66 20 62 6F 75 6E 64 73 98 49 A4 57 05 50 55 53
+48 4D 84 12 C0 57 00 15 0C 58 04 50 4F 50 4D 00
+84 12 C0 57 00 17 90 42 F6 53 2C 58 82 43 BC 1D
92 42 C4 1D BA 1D A2 53 C4 1D 92 53 C2 1D 3E 40
-2C 00 B0 12 2A 40 42 46 56 47 C0 41 3E 4A 22 54
-F2 56 0A 4E 3E 4F 1A 83 2A 92 CA 2F 8A 10 5A 06
-6F 3F 2A 56 04 52 52 43 4D 00 84 12 C6 56 50 00
-04 57 04 52 52 41 4D 00 84 12 C6 56 50 01 12 57
-04 52 4C 41 4D 00 84 12 C6 56 50 02 20 57 04 52
-52 55 4D 00 84 12 C6 56 50 03 85 12 00 3C 2E 57
-03 53 3E 3D 85 12 00 38 40 57 02 53 3C 00 85 12
-00 34 BA 56 03 30 3E 3D 85 12 00 30 54 57 02 30
+2C 00 B0 12 2A 40 56 46 6A 47 E0 41 26 4A 82 55
+52 58 0A 4E 3E 4F 1A 83 2A 92 CA 2F 8A 10 5A 06
+6F 3F 8A 57 04 52 52 43 4D 00 84 12 26 58 50 00
+64 58 04 52 52 41 4D 00 84 12 26 58 50 01 72 58
+04 52 4C 41 4D 00 84 12 26 58 50 02 80 58 04 52
+52 55 4D 00 84 12 26 58 50 03 85 12 00 3C 8E 58
+03 53 3E 3D 85 12 00 38 A0 58 02 53 3C 00 85 12
+00 34 1A 58 03 30 3E 3D 85 12 00 30 B4 58 02 30
3C 00 85 12 00 30 00 00 02 55 3C 00 85 12 00 2C
-68 57 03 55 3E 3D 85 12 00 28 5E 57 03 30 3C 3E
-85 12 00 24 7C 57 02 30 3D 00 85 12 00 20 D8 44
+C8 58 03 55 3E 3D 85 12 00 28 BE 58 03 30 3C 3E
+85 12 00 24 DC 58 02 30 3D 00 85 12 00 20 EC 44
02 49 46 00 1A 42 C4 1D 8A 4E 00 00 A2 53 C4 1D
-0E 4A 30 4D 72 57 04 54 48 45 4E 00 1A 42 C4 1D
+0E 4A 30 4D D2 58 04 54 48 45 4E 00 1A 42 C4 1D
08 4E 3E 4F 09 48 29 53 0A 89 0A 11 3A 90 00 02
-68 2F 88 DA 00 00 30 4D 3A 55 04 45 4C 53 45 00
+68 2F 88 DA 00 00 30 4D 9A 56 04 45 4C 53 45 00
1A 42 C4 1D BA 40 00 3C 00 00 A2 53 C4 1D 2F 83
-8F 4A 00 00 E3 3F A6 57 05 55 4E 54 49 4C 3A 4F
+8F 4A 00 00 E3 3F 06 59 05 55 4E 54 49 4C 3A 4F
08 4E 3E 4F 19 42 C4 1D 2A 83 0A 89 0A 11 3A 90
00 FE 47 3B 3A F0 FF 03 08 DA 89 48 00 00 A2 53
-C4 1D 30 4D BE 55 05 41 47 41 49 4E 87 12 3A 57
-EE 57 2A 40 00 00 05 57 48 49 4C 45 87 12 94 57
-6E 40 2A 40 4A 57 06 52 45 50 45 41 54 00 87 12
-3A 57 EE 57 AC 57 2A 40 00 00 03 4A 4D 50 87 12
-30 4A 3A 57 EE 57 2A 40 3E B0 00 10 03 20 3E E0
+C4 1D 30 4D 1E 57 05 41 47 41 49 4E 87 12 9A 58
+4E 59 2A 40 00 00 05 57 48 49 4C 45 87 12 F4 58
+78 40 2A 40 AA 58 06 52 45 50 45 41 54 00 87 12
+9A 58 4E 59 0C 59 2A 40 00 00 03 4A 4D 50 87 12
+18 4A 9A 58 4E 59 2A 40 3E B0 00 10 03 20 3E E0
00 04 30 4D 3E 90 00 34 06 28 03 24 3E 40 00 34
30 4D 3E 40 00 38 30 4D 00 00 04 3F 4A 4D 50 00
-87 12 58 58 30 4A 6E 40 EE 57 2A 40 8E 58 3D 41
+87 12 B8 59 18 4A 78 40 4E 59 2A 40 EE 59 3D 41
08 4E 3E 4F 2A 48 0A 93 04 20 98 42 C4 1D 00 00
-30 4D 88 43 00 00 A4 3F 54 56 03 42 57 31 84 12
-8C 58 00 00 AA 58 03 42 57 32 84 12 8C 58 00 00
-B6 58 03 42 57 33 84 12 8C 58 00 00 CE 58 3D 41
+30 4D 88 43 00 00 A4 3F B4 57 03 42 57 31 84 12
+EC 59 00 00 0A 5A 03 42 57 32 84 12 EC 59 00 00
+16 5A 03 42 57 33 84 12 EC 59 00 00 2E 5A 3D 41
1A 42 C4 1D 28 4E 08 93 08 20 BA 4F 00 00 A2 53
C4 1D 8E 4A 00 00 3E 4F 30 4D 8E 43 00 00 61 3F
-00 00 03 46 57 31 84 12 CC 58 00 00 F2 58 03 46
-57 32 84 12 CC 58 00 00 FE 58 03 46 57 33 84 12
-CC 58 00 00 0A 59 04 47 4F 54 4F 00 87 12 3A 57
-30 4A 14 48 2A 40 7A 58 05 3F 47 4F 54 4F 87 12
-58 58 30 4A 14 48 2A 40 D2 C3 23 02 E2 B2 60 02
-02 24 30 40 52 4F 1A 52 04 20 19 62 06 20 92 43
-14 20 A2 93 02 20 07 24 0A 5A 49 69 82 4A 16 20
-C2 49 18 20 0A 3C C2 4A 15 20 8A 10 C2 4A 16 20
-C2 49 17 20 89 10 C2 49 18 20 B0 12 BE 59 7A 93
-FC 23 0A 43 39 40 05 00 D2 49 14 20 4E 06 82 93
-46 06 05 24 92 B3 6C 06 FD 27 C2 93 4C 06 59 83
-F3 2F 19 83 0B 30 F2 43 4E 06 82 93 46 06 03 24
-92 B3 6C 06 FD 27 5A 92 4C 06 F3 23 30 41 19 43
-3A 43 8A 10 C2 4A 4E 06 82 93 46 06 05 24 92 B3
-6C 06 FD 27 C2 93 4C 06 19 83 F3 23 5A 42 4C 06
-30 41 1A 52 08 20 09 43 1C D3 F2 40 51 00 19 20
-B0 12 38 59 34 20 B0 12 BE 59 7A 90 FE FF 04 24
-FA 23 D9 42 4C 06 FF 1D F2 43 4E 06 03 43 19 53
-39 90 01 02 F6 23 F2 43 4E 06 3C C0 03 00 D2 D3
-23 02 30 41 09 43 2C D3 F0 40 58 00 ED C5 B0 12
-38 59 15 20 3A 40 FE FF 29 43 B0 12 C2 59 D2 49
-00 1E 4E 06 03 43 19 53 39 90 00 02 F8 23 39 40
-03 00 B0 12 C0 59 7A C0 E1 00 6A 92 DE 27 8C 10
-1C 52 4C 06 D2 D3 23 02 87 12 E8 45 0B 3C 20 53
-44 20 45 72 72 6F 72 21 7A 5A 2F 82 8F 4E 02 00
-9F 42 DA 1D 00 00 B2 40 10 00 DA 1D 0E 4C B0 12
-2A 40 30 43 36 42 FC 40 9C 49 39 4F 18 42 C4 1D
-4A 4E 0E 48 C8 4A 00 00 18 53 30 40 B4 4D 92 4B
-0E 00 22 20 92 4B 10 00 24 20 5A 42 23 20 58 42
-22 20 A2 93 02 20 02 24 08 58 30 41 59 42 24 20
-89 10 0A 59 88 10 08 58 0A 6A 88 10 08 58 30 41
-82 43 1C 20 92 42 0E 20 1A 20 C2 93 24 20 03 20
-92 93 22 20 14 24 92 42 22 20 D0 04 92 42 24 20
-D2 04 92 42 12 20 C8 04 92 42 E4 04 1A 20 92 42
-E6 04 1C 20 92 52 10 20 1A 20 82 63 1C 20 30 41
-92 4B 0E 00 22 20 92 4B 10 00 24 20 B0 12 E0 5A
-5A 4B 03 00 82 5A 1A 20 82 63 1C 20 30 41 09 93
-07 24 F8 90 20 00 00 1E 03 20 18 53 19 83 F9 23
-30 41 1B 42 34 20 82 43 1E 20 B2 90 00 02 20 20
-9A 20 BB 80 00 02 12 00 8B 73 14 00 DB 53 03 00
-DB 92 12 20 03 00 11 28 CB 43 03 00 B0 12 AE 5A
-B0 12 E2 59 8B 43 10 00 9B 48 00 1E 0E 00 92 93
-02 20 03 24 9B 48 02 1E 10 00 B2 40 00 02 20 20
-8B 93 14 00 0B 20 92 9B 12 00 1E 20 74 2C BB 90
-00 02 12 00 03 2C 92 4B 12 00 20 20 B0 12 20 5B
-1A 42 1A 20 19 42 1C 20 0F 3F 3C 42 3B 40 40 20
-09 43 CB 93 02 00 10 24 9B 92 24 20 0C 00 04 20
-9B 92 22 20 0A 00 07 24 09 4B 3B 50 18 00 3B 90
-00 21 EF 23 0C 5C 30 41 0C 43 82 4B 34 20 8B 49
-00 00 4A 93 07 34 49 93 05 24 C9 93 02 00 02 34
-5A 59 02 00 CB 4A 02 00 CB 43 03 00 9B 42 1A 20
-04 00 9B 42 1C 20 06 00 18 42 30 20 8B 48 08 00
-9B 48 1A 1E 0A 00 9B 48 14 1E 0C 00 9B 48 1A 1E
-0E 00 9B 48 14 1E 10 00 9B 48 1C 1E 12 00 9B 48
-1E 1E 14 00 82 43 1E 20 6A 93 62 27 CC 37 8B 43
-16 00 7A 93 05 24 99 37 99 52 C2 1D 16 00 95 3F
-92 42 BE 1D 36 20 92 82 C2 1D 36 20 92 42 C0 1D
-38 20 92 52 C2 1D 38 20 B2 40 EC 43 64 44 92 42
-BE 1D C2 1D 82 3F 1B 42 34 20 82 43 20 20 0B 93
-AA 27 EB 93 02 00 04 20 B0 12 06 61 B0 12 CE 60
-5A 4B 02 00 CB 43 02 00 2B 4B 82 4B 34 20 5A 53
-05 24 99 37 92 4B 16 00 1E 20 67 3F 1E 42 36 20
-9F 42 38 20 02 00 B2 40 72 44 64 44 8C 3F 74 4E
-85 52 45 41 44 22 5A 43 19 3C 40 4F 86 57 52 49
-54 45 22 00 6A 43 12 3C 00 4D 84 44 45 4C 22 00
-6A 42 0C 3C 0A 52 05 43 4C 4F 53 45 B0 12 96 5C
-30 4D 9C 4D 85 4C 4F 41 44 22 7A 43 2F 83 8F 4E
-00 00 0E 4A 82 93 B6 1D 0D 24 87 12 34 40 34 40
-1E 48 1E 48 02 46 34 40 9A 5A 1E 48 34 40 50 5D
-1E 48 2A 40 87 12 34 40 22 00 42 46 4E 5D 3D 41
-2F 83 78 4E 08 5E C8 43 00 00 1C 43 92 42 2C 20
-22 20 92 42 2E 20 24 20 CE 93 00 00 96 24 FE 90
-3A 00 01 00 01 20 2E 53 FE 90 5C 00 00 00 09 20
-1E 53 92 42 02 20 22 20 82 43 24 20 CE 93 00 00
-76 24 82 4E 32 20 B0 12 E0 5A BF 40 20 00 00 00
-A2 93 02 20 04 24 92 92 22 20 02 20 03 24 9F 42
-12 20 00 00 B0 12 C0 5B 2C 43 0A 43 08 4A 58 0E
-08 58 82 48 30 20 C8 93 00 1E 67 24 39 42 F8 9E
-00 1E 04 20 18 53 19 83 FA 23 1E 53 FE 90 2E 00
-FF FF 1B 24 39 50 03 00 B0 12 3E 5B 07 20 FE 90
-5C 00 FF FF 2C 24 CE 93 FF FF 29 24 1E 42 32 20
-1A 53 3A 90 10 00 DA 23 92 53 1A 20 82 63 1C 20
-9F 83 00 00 CF 23 2C 42 40 3C FE 90 2E 00 FE FF
-ED 27 B0 12 3E 5B EA 23 39 40 03 00 F8 9E 00 1E
-04 20 18 53 19 83 FA 23 0A 3C CE 93 FF FF DE 23
-FE 90 5C 00 FF FF DA 23 B0 12 3E 5B D7 23 18 42
-30 20 92 48 1A 1E 22 20 92 48 14 1E 24 20 F8 B0
-10 00 0B 1E 16 24 82 93 24 20 06 20 82 93 22 20
-03 20 92 42 02 20 22 20 CE 93 FF FF 87 23 92 42
-22 20 2C 20 92 42 24 20 2E 20 2F 52 3E 4F 3D 41
-30 4D 1A 4F 02 00 B0 12 CA 5B 2F 53 3A 4F 3E 4F
-7A 93 12 20 0C 93 01 20 30 4D 87 12 E8 45 0B 3C
-20 4F 70 65 6E 45 72 72 6F 72 54 45 84 43 74 48
-CC 45 94 45 BC 41 78 5A 1A 93 B5 20 0C 93 ED 23
-30 4D E0 5C 04 52 45 41 44 00 2F 83 8F 4E 00 00
-1E 42 34 20 B0 12 52 5B 1E 82 34 20 30 4D 2C 43
-12 12 2A 20 18 42 02 20 08 58 2A 41 82 9A 0A 20
-A0 24 B0 12 E2 59 09 43 28 93 03 24 89 93 02 1E
-03 20 89 93 00 1E 07 24 09 58 39 90 00 02 F4 23
-91 53 00 00 EA 3F 0C 43 6A 41 B9 43 00 1E 28 93
-0F 24 B9 40 FF 0F 02 1E 09 11 8A 10 09 5A 5A 41
-01 00 0A 11 09 10 82 4A 28 20 82 49 26 20 07 3C
-09 11 C2 49 26 20 C2 4A 27 20 82 43 28 20 3A 41
-82 4A 2A 20 30 41 0A 12 1A 52 08 20 B0 12 24 5A
-3A 41 1A 52 0C 20 30 40 24 5A F2 B0 40 00 A2 04
-29 20 F2 B0 10 00 A2 04 FC 27 5A 42 B0 04 4A 11
-59 42 B4 04 F2 40 20 00 C0 04 D2 42 B1 04 C8 04
-1A 52 E4 04 D2 42 B5 04 C8 04 19 52 E4 04 D2 42
-B2 04 C0 04 B2 40 00 08 C8 04 1A 52 E4 04 92 42
-B6 04 C0 04 B2 80 BC 07 C0 04 B2 40 00 02 C8 04
-19 52 E4 04 30 41 22 2A 2B 2C 2F 3A 3B 3C 3D 3E
-3F 5B 5C 5D 7C 2E 29 92 06 38 39 80 03 00 B0 12
-24 60 39 40 03 00 7A 4B C8 4A 00 1E 0A 93 12 24
-0D 12 3D 40 0F 00 3C 40 D6 5F 7A 9C F4 27 1D 83
-FC 23 3D 41 6A 9C E7 27 3A 80 21 00 EC 3B 18 53
-19 83 E9 23 09 93 06 24 F8 40 20 00 00 1E 18 53
-19 83 FA 23 30 41 2A 93 E4 20 2C 93 0D 24 0C 93
-BA 24 87 12 E8 45 0C 3C 20 57 72 69 74 65 45 72
-72 6F 72 00 BC 41 BA 5E B0 12 EE 5E 92 42 26 20
-22 20 92 42 28 20 24 20 B0 12 66 5F B0 12 C0 5B
-18 42 30 20 F8 40 20 00 0B 1E B0 12 7A 5F 88 43
-0C 1E 88 4A 0E 1E 88 49 10 1E 88 49 12 1E 98 42
-24 20 14 1E 98 42 22 20 1A 1E 88 43 1C 1E 88 43
-1E 1E 1C 43 1B 42 32 20 CB 93 00 00 CA 27 FB 90
-2E 00 00 00 C6 27 39 40 0B 00 B0 12 F6 5F B0 12
-10 61 2A 43 B0 12 CA 5B 0C 93 BB 23 30 4D 1A 4B
-04 00 19 4B 06 00 B0 12 E8 59 B0 12 7A 5F 18 4B
-08 00 88 49 12 1E 88 4A 16 1E 88 49 18 1E 98 4B
-12 00 1C 1E 98 4B 14 00 1E 1E 1A 4B 04 00 19 4B
-06 00 30 40 26 5A 9B 52 1E 20 12 00 8B 63 14 00
-1A 42 1A 20 19 42 1C 20 30 40 26 5A B2 40 00 02
-1E 20 1B 42 34 20 B0 12 06 61 82 43 1E 20 DB 53
-03 00 DB 92 12 20 03 00 22 20 CB 43 03 00 B0 12
-AE 5A 08 12 0A 12 B0 12 EE 5E 2A 91 05 24 B0 12
-66 5F 2A 41 B0 12 E2 59 3A 41 38 41 98 42 26 20
-00 1E 92 93 02 20 03 24 98 42 28 20 02 1E B0 12
-66 5F 9B 42 26 20 0E 00 9B 42 28 20 10 00 30 40
-20 5B EC 5C 05 57 52 49 54 45 B0 12 1C 61 30 4D
-D4 5E 07 53 44 5F 45 4D 49 54 B2 90 00 02 1E 20
-02 28 B0 12 1C 61 18 42 1E 20 C8 4E 00 1E 92 53
-1E 20 3E 4F 30 4D 58 4B 13 00 5C 4B 14 00 8C 10
-0C 58 5A 4B 15 00 0A 11 0C 10 18 4B 12 00 BB C0
-FF 01 12 00 38 F0 FF 01 82 48 1E 20 5B 42 12 20
-B0 12 5E 42 1B 42 34 20 CB 4A 03 00 19 5B 0A 00
-18 6B 0C 00 8B 49 0E 00 8B 48 10 00 B0 12 BC 5B
-30 4D 0C 93 38 20 38 90 E0 01 03 2C C8 93 20 1E
-02 24 7C 40 E5 00 C8 4C 00 1E B0 12 10 61 B0 12
-BA 5A 82 4A 2A 20 0B 4A B0 12 E2 59 1A 48 00 1E
-88 43 00 1E 92 93 02 20 09 24 19 48 02 1E 88 43
-02 1E 39 F0 FF 0F 39 90 FF 0F 02 20 3A 93 0E 24
-82 4A 22 20 82 49 24 20 B0 12 BA 5A 0B 9A E6 27
-0A 12 0A 4B B0 12 66 5F 3A 41 DD 3F 0A 4B B0 12
-66 5F B0 12 96 5C 30 4D B0 4C 08 54 45 52 4D 32
-53 44 22 00 87 12 00 5D 84 43 8C 62 21 53 2F 83
-AF 43 00 00 3D 40 9C 62 30 40 50 5D 9E 62 92 C3
-DC 05 08 43 B0 12 A6 44 92 B3 DC 05 FD 27 59 42
-CC 05 69 92 0D 24 C8 49 00 1E 18 53 38 90 FF 01
-04 24 F2 2B B0 12 1C 61 EC 3F B0 12 B8 44 EC 3F
-B0 12 B8 44 82 48 1E 20 B0 12 96 5C 3D 41 30 4D
-2A 46 02 2E 53 00 87 12 34 40 3C 00 48 45 E0 40
-70 43 34 40 08 00 48 45 34 40 3E 00 48 45 94 45
-CE 40 34 40 80 1C B2 41 C0 41 22 63 CE 40 34 40
-7E 1C CA 41 02 42 F4 40 30 43 34 40 FE FF DA 41
-14 63 2A 40 02 47 01 3F 2E 4E 30 40 30 43 84 61
-05 57 4F 52 44 53 87 12 36 42 F4 40 34 40 0A 00
-36 42 FC 40 88 45 34 40 03 00 AA 45 34 40 10 00
-70 43 E8 45 14 74 68 72 65 61 64 73 20 76 6F 63
-61 62 75 6C 61 72 69 65 73 00 CC 45 36 42 FC 40
-34 40 CA 1D 44 40 6A 4C 6E 40 F4 40 54 40 C0 41
-1E 64 88 45 34 40 03 00 AA 45 44 40 34 40 E2 1C
-34 40 10 00 44 40 22 41 A2 4D 34 40 00 00 44 40
-34 40 10 00 44 40 22 41 34 40 00 00 CA 41 44 40
-02 42 34 40 E2 1C 22 41 F4 40 B2 41 C0 41 D0 63
-62 40 62 40 02 42 44 40 34 40 E2 1C 22 41 F4 40
-34 40 02 00 DA 41 AE 63 54 40 C0 41 14 64 44 40
-34 40 02 00 2A 41 F4 40 92 40 34 40 E2 1C 22 41
-FC 40 44 40 74 48 34 40 7F 00 38 41 CC 45 0A 41
-34 40 0F 00 38 41 34 40 10 00 6E 40 2A 41 AA 45
-BC 41 9A 63 62 40 62 40 88 45 BC 41 74 63 62 40
-2A 40 14 5D 03 4D 41 58 2E 9F 07 38 2F 53 30 4D
-24 64 03 4D 49 4E 2E 9F F9 3B 3E 4F 30 4D 7A 62
-03 55 2E 52 87 12 A8 40 56 42 34 40 00 00 98 42
-CC 42 E6 42 B4 40 80 40 2A 41 34 40 00 00 28 64
-AA 45 CC 45 2A 40 FA 5C 04 44 55 4D 50 00 0D 12
-12 12 DA 1D B2 40 10 00 DA 1D 2E 5F BF F0 F0 FF
-00 00 B0 12 2A 40 6E 40 CA 41 88 45 02 42 34 40
-07 00 44 64 94 45 02 42 34 40 10 00 22 41 02 42
-CA 41 02 42 0A 41 34 40 03 00 44 64 EC 41 A2 64
-94 45 94 45 02 42 34 40 10 00 22 41 02 42 CA 41
-02 42 0A 41 34 40 7E 00 36 64 4C 42 28 64 48 45
-EC 41 C0 64 34 40 10 00 DA 41 8A 64 B4 40 36 42
-FC 40 2A 40 92 61 06 53 45 43 54 5F 44 00 09 4E
-2A 4F B0 12 E8 59 87 12 1C 43 34 40 00 1E 34 40
-00 02 6E 64 2A 40 06 5D 07 43 4C 55 53 54 5F 44
-82 4E 24 20 A2 4F 22 20 B0 12 E0 5A 9F 42 1A 20
-00 00 1E 42 1C 20 E3 3F 2E 4A 05 46 41 54 5F 44
-2F 82 8F 4E 02 00 9F 42 08 20 00 00 0E 43 D7 3F
-68 64 05 44 49 52 5F 44 2F 82 8F 4E 02 00 92 42
-2C 20 22 20 92 42 2E 20 24 20 DE 3F
+00 00 03 46 57 31 84 12 2C 5A 00 00 52 5A 03 46
+57 32 84 12 2C 5A 00 00 5E 5A 03 46 57 33 84 12
+2C 5A 00 00 6A 5A 04 47 4F 54 4F 00 87 12 9A 58
+18 4A 28 48 2A 40 DA 59 05 3F 47 4F 54 4F 87 12
+B8 59 18 4A 28 48 2A 40 22 50 09 7B 55 54 49 4C
+49 54 59 7D 30 4D 3E 46 02 2E 53 00 8F 4E FE FF
+0E 4F 2E 83 8F 4E FA FF 3E 40 80 1C 2E 83 8F 4E
+FC FF 3F 80 06 00 2E 8F 0E 11 87 12 34 40 3C 00
+5C 45 8A 43 34 40 08 00 5C 45 34 40 3E 00 5C 45
+A8 45 8A 40 8A 40 C4 41 EA 41 F2 5A 62 40 62 40
+2A 40 F0 41 28 42 F2 40 56 43 34 40 02 00 00 42
+F4 5A 2A 40 A8 5A 03 2E 52 53 8F 4E FE FF 8F 41
+FA FF 3E 40 E0 1C D3 3F 16 47 01 3F 2E 4E 30 40
+56 43 9C 50 05 57 4F 52 44 53 87 12 9C 45 34 40
+03 00 BE 45 34 40 CA 1D F2 40 50 42 34 40 10 00
+44 40 20 41 8A 4D 34 40 00 00 44 40 34 40 10 00
+44 40 20 41 34 40 00 00 F0 41 44 40 28 42 50 42
+20 41 F2 40 D2 41 E0 41 78 5B 62 40 62 40 28 42
+44 40 50 42 20 41 F2 40 34 40 02 00 00 42 5A 5B
+54 40 E0 41 BA 5B 44 40 34 40 02 00 28 41 F2 40
+9A 40 50 42 20 41 FA 40 44 40 7A 48 34 40 7F 00
+36 41 E0 45 08 41 34 40 0F 00 36 41 34 40 10 00
+78 40 28 41 BE 45 DC 41 46 5B 62 40 2A 40 84 4D
+03 4D 41 58 2E 9F 07 38 2F 53 30 4D C0 5B 03 4D
+49 4E 2E 9F F9 3B 3E 4F 30 4D 9C 4C 03 55 2E 52
+87 12 B0 40 9A 42 34 40 00 00 A6 42 06 43 20 43
+BC 40 8A 40 28 41 34 40 00 00 C4 5B BE 45 E0 45
+2A 40 EC 4C 04 44 55 4D 50 00 0D 12 12 12 DA 1D
+B2 40 10 00 DA 1D 2E 5F BF F0 F0 FF 00 00 B0 12
+2A 40 78 40 F0 41 9C 45 28 42 34 40 07 00 E0 5B
+A8 45 28 42 34 40 10 00 20 41 28 42 F0 41 28 42
+08 41 34 40 03 00 E0 5B 12 42 3E 5C A8 45 A8 45
+28 42 34 40 10 00 20 41 28 42 F0 41 28 42 08 41
+34 40 7E 00 D2 5B 90 42 C4 5B 5C 45 12 42 5C 5C
+34 40 10 00 00 42 26 5C BC 40 7A 42 FA 40 2A 40
+D2 C3 23 02 E2 B2 60 02 02 24 30 40 AE 50 1A 52
+04 20 19 62 06 20 92 43 14 20 A2 93 02 20 07 24
+0A 5A 49 69 82 4A 16 20 C2 49 18 20 0A 3C C2 4A
+15 20 8A 10 C2 4A 16 20 C2 49 17 20 89 10 C2 49
+18 20 B0 12 06 5D 7A 93 FC 23 0A 43 39 40 05 00
+D2 49 14 20 4E 06 82 93 46 06 05 24 92 B3 6C 06
+FD 27 C2 93 4C 06 59 83 F3 2F 19 83 0B 30 F2 43
+4E 06 82 93 46 06 03 24 92 B3 6C 06 FD 27 5A 92
+4C 06 F3 23 30 41 19 43 3A 43 8A 10 C2 4A 4E 06
+82 93 46 06 05 24 92 B3 6C 06 FD 27 C2 93 4C 06
+19 83 F3 23 5A 42 4C 06 30 41 1A 52 08 20 09 43
+1C D3 F2 40 51 00 19 20 B0 12 80 5C 34 20 B0 12
+06 5D 7A 90 FE FF 04 24 FA 23 D9 42 4C 06 FF 1D
+F2 43 4E 06 03 43 19 53 39 90 01 02 F6 23 F2 43
+4E 06 3C C0 03 00 D2 D3 23 02 30 41 09 43 2C D3
+F0 40 58 00 A5 C2 B0 12 80 5C 15 20 3A 40 FE FF
+29 43 B0 12 0A 5D D2 49 00 1E 4E 06 03 43 19 53
+39 90 00 02 F8 23 39 40 03 00 B0 12 08 5D 7A C0
+E1 00 6A 92 DE 27 8C 10 1C 52 4C 06 D2 D3 23 02
+87 12 FC 45 0B 3C 20 53 44 20 45 72 72 6F 72 21
+C2 5D 2F 82 8F 4E 02 00 9F 42 DA 1D 00 00 B2 40
+10 00 DA 1D 0E 4C B0 12 2A 40 56 43 7A 42 FA 40
+98 49 9A 5A 09 7B 53 44 5F 4C 4F 41 44 7D 30 4D
+39 4F 18 42 C4 1D 4A 4E 0E 48 C8 4A 00 00 18 53
+30 40 9C 4D 92 4B 0E 00 22 20 92 4B 10 00 24 20
+5A 42 23 20 58 42 22 20 A2 93 02 20 08 20 59 42
+24 20 89 10 0A 59 88 10 08 58 0A 6A 88 10 08 58
+30 41 82 43 1C 20 92 42 0E 20 1A 20 C2 93 24 20
+03 20 92 93 22 20 14 24 92 42 22 20 D0 04 92 42
+24 20 D2 04 92 42 12 20 C8 04 92 42 E4 04 1A 20
+92 42 E6 04 1C 20 92 52 10 20 1A 20 82 63 1C 20
+30 41 92 4B 0E 00 22 20 92 4B 10 00 24 20 B0 12
+32 5E 5A 4B 03 00 82 5A 1A 20 82 63 1C 20 30 41
+09 93 07 24 F8 90 20 00 00 1E 03 20 18 53 19 83
+F9 23 30 41 1B 42 34 20 82 43 1E 20 B2 90 00 02
+20 20 96 20 BB 80 00 02 12 00 8B 73 14 00 DB 53
+03 00 DB 92 12 20 03 00 11 28 CB 43 03 00 B0 12
+04 5E B0 12 2A 5D 8B 43 10 00 9B 48 00 1E 0E 00
+92 93 02 20 03 24 9B 48 02 1E 10 00 B2 40 00 02
+20 20 8B 93 14 00 0B 20 92 9B 12 00 1E 20 70 2C
+BB 90 00 02 12 00 03 2C 92 4B 12 00 20 20 B0 12
+72 5E 1A 42 1A 20 19 42 1C 20 0A 3F 3C 42 3B 40
+40 20 09 43 CB 93 02 00 10 24 9B 92 24 20 0C 00
+04 20 9B 92 22 20 0A 00 07 24 09 4B 3B 50 18 00
+3B 90 00 21 EF 23 0C 5C 30 41 0C 43 82 4B 34 20
+8B 49 00 00 4A 93 07 34 49 93 05 24 C9 93 02 00
+02 34 5A 59 02 00 CB 4A 02 00 CB 43 03 00 9B 42
+1A 20 04 00 9B 42 1C 20 06 00 18 42 30 20 8B 48
+08 00 9B 48 1A 1E 0A 00 9B 48 14 1E 0C 00 9B 48
+1A 1E 0E 00 9B 48 14 1E 10 00 9B 48 1C 1E 12 00
+9B 48 1E 1E 14 00 82 43 1E 20 6A 93 62 27 CC 37
+8B 43 16 00 7A 93 05 24 99 37 99 52 C2 1D 16 00
+95 3F 19 42 C2 1D 1A 42 BE 1D 0A 89 82 4A 36 20
+19 52 C0 1D 82 49 38 20 B2 40 04 44 78 44 86 3F
+1B 42 34 20 82 43 20 20 0B 93 AE 27 EB 93 02 00
+04 20 B0 12 4E 64 B0 12 16 64 5A 4B 02 00 CB 43
+02 00 2B 4B 82 4B 34 20 5A 53 05 24 9D 37 92 4B
+16 00 1E 20 6B 3F 1E 42 36 20 9F 42 38 20 02 00
+B2 40 86 44 78 44 30 41 90 4E 85 52 45 41 44 22
+5A 43 19 3C 24 5B 86 57 52 49 54 45 22 00 6A 43
+12 3C 04 5C 84 44 45 4C 22 00 6A 42 0C 3C 6C 53
+05 43 4C 4F 53 45 B0 12 E0 5F 30 4D CE 5B 85 4C
+4F 41 44 22 7A 43 2F 83 8F 4E 00 00 0E 4A 82 93
+B6 1D 0D 24 87 12 34 40 34 40 32 48 32 48 16 46
+34 40 F0 5D 32 48 34 40 9A 60 32 48 2A 40 87 12
+34 40 22 00 56 46 98 60 3D 41 78 4E 08 5E C8 43
+00 00 1C 43 92 42 2C 20 22 20 92 42 2E 20 24 20
+CE 93 00 00 91 24 FE 90 3A 00 01 00 01 20 2E 53
+FE 90 5C 00 00 00 09 20 1E 53 92 42 02 20 22 20
+82 43 24 20 CE 93 00 00 73 24 82 4E 32 20 B0 12
+32 5E 34 40 20 00 A2 93 02 20 04 24 92 92 22 20
+02 20 02 24 14 42 12 20 B0 12 12 5F 2C 43 0A 43
+08 4A 58 0E 08 58 82 48 30 20 C8 93 00 1E 64 24
+39 42 F8 9E 00 1E 04 20 18 53 19 83 FA 23 1E 53
+FE 90 2E 00 FF FF 1A 24 39 50 03 00 B0 12 90 5E
+07 20 FE 90 5C 00 FF FF 2B 24 CE 93 FF FF 28 24
+1E 42 32 20 1A 53 3A 90 10 00 DA 23 92 53 1A 20
+82 63 1C 20 14 83 D0 23 2C 42 3E 3C FE 90 2E 00
+FE FF EE 27 B0 12 90 5E EB 23 39 40 03 00 F8 9E
+00 1E 04 20 18 53 19 83 FA 23 0A 3C CE 93 FF FF
+DF 23 FE 90 5C 00 FF FF DB 23 B0 12 90 5E D8 23
+18 42 30 20 92 48 1A 1E 22 20 92 48 14 1E 24 20
+F8 B0 10 00 0B 1E 15 24 82 93 24 20 06 20 82 93
+22 20 03 20 92 42 02 20 22 20 CE 93 FF FF 8A 23
+92 42 22 20 2C 20 92 42 24 20 2E 20 8F 43 00 00
+03 3C 2A 4F B0 12 1C 5F 3A 4F 34 40 14 40 3E 4F
+0A 93 06 24 7A 93 14 20 0C 93 03 20 3D 40 98 48
+30 4D 87 12 FC 45 0B 3C 20 4F 70 65 6E 45 72 72
+6F 72 68 45 A0 43 7A 48 E0 45 A8 45 DC 41 C0 5D
+1A 93 B5 20 0C 93 ED 23 30 4D 2A 60 04 52 45 41
+44 00 2F 83 8F 4E 00 00 1E 42 34 20 B0 12 A4 5E
+1E 82 34 20 30 4D 2C 43 12 12 2A 20 18 42 02 20
+08 58 2A 41 82 9A 0A 20 A0 24 B0 12 2A 5D 09 43
+28 93 03 24 89 93 02 1E 03 20 89 93 00 1E 07 24
+09 58 39 90 00 02 F4 23 91 53 00 00 EA 3F 0C 43
+6A 41 B9 43 00 1E 28 93 0F 24 B9 40 FF 0F 02 1E
+09 11 8A 10 09 5A 5A 41 01 00 0A 11 09 10 82 4A
+28 20 82 49 26 20 07 3C 09 11 C2 49 26 20 C2 4A
+27 20 82 43 28 20 3A 41 82 4A 2A 20 30 41 0A 12
+1A 52 08 20 B0 12 6C 5D 3A 41 1A 52 0C 20 30 40
+6C 5D F2 B0 40 00 A2 04 29 20 F2 B0 10 00 A2 04
+FC 27 5A 42 B0 04 4A 11 59 42 B4 04 F2 40 20 00
+C0 04 D2 42 B1 04 C8 04 1A 52 E4 04 D2 42 B5 04
+C8 04 19 52 E4 04 D2 42 B2 04 C0 04 B2 40 00 08
+C8 04 1A 52 E4 04 92 42 B6 04 C0 04 B2 80 BC 07
+C0 04 B2 40 00 02 C8 04 19 52 E4 04 30 41 22 2A
+2B 2C 2F 3A 3B 3C 3D 3E 3F 5B 5C 5D 7C 2E 29 92
+06 38 39 80 03 00 B0 12 6C 63 39 40 03 00 7A 4B
+C8 4A 00 1E 0A 93 12 24 0D 12 3D 40 0F 00 3C 40
+1E 63 7A 9C F4 27 1D 83 FC 23 3D 41 6A 9C E7 27
+3A 80 21 00 EC 3B 18 53 19 83 E9 23 09 93 06 24
+F8 40 20 00 00 1E 18 53 19 83 FA 23 30 41 2A 93
+EB 20 2C 93 0D 24 0C 93 BA 24 87 12 FC 45 0C 3C
+20 57 72 69 74 65 45 72 72 6F 72 00 DC 41 02 62
+B0 12 36 62 92 42 26 20 22 20 92 42 28 20 24 20
+B0 12 AE 62 B0 12 12 5F 18 42 30 20 F8 40 20 00
+0B 1E B0 12 C2 62 88 43 0C 1E 88 4A 0E 1E 88 49
+10 1E 88 49 12 1E 98 42 24 20 14 1E 98 42 22 20
+1A 1E 88 43 1C 1E 88 43 1E 1E 1C 43 1B 42 32 20
+CB 93 00 00 CA 27 FB 90 2E 00 00 00 C6 27 39 40
+0B 00 B0 12 3E 63 B0 12 58 64 2A 43 B0 12 1C 5F
+0C 93 BB 23 30 4D 1A 4B 04 00 19 4B 06 00 B0 12
+30 5D B0 12 C2 62 18 4B 08 00 88 49 12 1E 88 4A
+16 1E 88 49 18 1E 98 4B 12 00 1C 1E 98 4B 14 00
+1E 1E 1A 4B 04 00 19 4B 06 00 30 40 6E 5D 9B 52
+1E 20 12 00 8B 63 14 00 1A 42 1A 20 19 42 1C 20
+30 40 6E 5D B2 40 00 02 1E 20 1B 42 34 20 B0 12
+4E 64 82 43 1E 20 DB 53 03 00 DB 92 12 20 03 00
+22 20 CB 43 03 00 B0 12 04 5E 08 12 0A 12 B0 12
+36 62 2A 91 05 24 B0 12 AE 62 2A 41 B0 12 2A 5D
+3A 41 38 41 98 42 26 20 00 1E 92 93 02 20 03 24
+98 42 28 20 02 1E B0 12 AE 62 9B 42 26 20 0E 00
+9B 42 28 20 10 00 30 40 72 5E 36 60 05 57 52 49
+54 45 B0 12 64 64 30 4D 1C 62 07 53 44 5F 45 4D
+49 54 B2 90 00 02 1E 20 02 28 B0 12 64 64 18 42
+1E 20 C8 4E 00 1E 92 53 1E 20 3E 4F 30 4D 58 4B
+13 00 59 4B 14 00 89 10 09 58 58 4B 15 00 5B 42
+12 20 0A 43 3C 42 08 11 09 10 4A 10 1C 83 0B 11
+FA 2B 0A 11 1C 83 FD 37 1B 42 34 20 19 5B 0A 00
+18 6B 0C 00 8B 49 0E 00 8B 48 10 00 CB 4A 03 00
+1A 4B 12 00 BB C0 FF 01 12 00 3A F0 FF 01 82 4A
+1E 20 B0 12 0E 5F 30 4D 0C 93 38 20 38 90 E0 01
+03 2C C8 93 20 1E 02 24 7C 40 E5 00 C8 4C 00 1E
+B0 12 58 64 B0 12 10 5E 82 4A 2A 20 0B 4A B0 12
+2A 5D 1A 48 00 1E 88 43 00 1E 92 93 02 20 09 24
+19 48 02 1E 88 43 02 1E 39 F0 FF 0F 39 90 FF 0F
+02 20 3A 93 0E 24 82 4A 22 20 82 49 24 20 B0 12
+10 5E 0B 9A E6 27 0A 12 0A 4B B0 12 AE 62 3A 41
+DD 3F 0A 4B B0 12 AE 62 B0 12 E0 5F 30 4D DC 5B
+08 54 45 52 4D 32 53 44 22 00 87 12 4A 60 A0 43
+E2 65 21 53 2F 83 AF 43 00 00 3D 40 F2 65 30 40
+9A 60 F4 65 92 C3 DC 05 08 43 B0 12 BA 44 92 B3
+DC 05 FD 27 59 42 CC 05 69 92 0D 24 C8 49 00 1E
+18 53 38 90 FF 01 F3 2B 03 24 B0 12 64 64 EC 3F
+B0 12 CC 44 EC 3F B0 12 CC 44 82 48 1E 20 B0 12
+E0 5F 3D 41 30 4D
@FFB4
-58 4F 58 4F 58 4F 58 4F 58 4F 58 4F 58 4F 58 4F
-58 4F 58 4F 58 4F 58 4F 58 4F 58 4F 58 4F 58 4F
-58 4F 58 4F 58 4F 58 4F 58 4F 58 4F 58 4F 58 4F
-58 4F 58 4F 58 4F 58 4F 58 4F 58 4F E6 44 58 4F
-58 4F 58 4F 58 4F 58 4F 58 4F 58 4F
+B4 50 B4 50 B4 50 B4 50 B4 50 B4 50 B4 50 B4 50
+B4 50 B4 50 B4 50 B4 50 B4 50 B4 50 B4 50 B4 50
+B4 50 B4 50 B4 50 B4 50 B4 50 B4 50 B4 50 B4 50
+B4 50 B4 50 B4 50 B4 50 B4 50 B4 50 FA 44 B4 50
+B4 50 B4 50 B4 50 B4 50 B4 50 B4 50
q
+++ /dev/null
-@1800
-10 00 6A 44 80 3E 30 75 FD FF 18 00 5A 57 10 50
-2A 44 3C 44 00 00 00 00
-@1DAA
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00
-@4000
-3A 41 0D 12 0D 4A 30 4D 2F 83 8F 4E 00 00 3E 41
-2E 4E 30 4D 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E
-30 4D 00 00 04 45 58 49 54 00 3D 41 30 4D 00 00
-03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 40
-03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
-44 55 50 00 0E 93 F6 23 30 4D 40 40 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 40 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E 40 02 3E 52 00 0E 12 3E 4F 30 4D 8E 40
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 40
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C 40 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 40 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 41
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 40 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA 40 03 41 4E 44 3E FF 30 4D 7A 40 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E 41 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 41 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E 41 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 41 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 40 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
-3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE 41 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 41 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 41 03 3E 49 4E 85 12 C2 1D 10 41
-04 42 41 53 45 00 85 12 DA 1D C0 40 05 53 54 41
-54 45 85 12 B6 1D 30 42 02 42 4C 00 85 12 20 00
-94 41 02 3C 23 00 B2 40 AA 1D AA 1D 30 4D 1E 15
-0E 43 3D 40 20 00 0A 93 04 20 0D 11 0A 4C 0C 43
-09 43 0E 9B 01 28 0E 8B 09 69 08 68 1D 83 07 30
-0C 5C 0A 6A 0E 6E F5 2B 0E 8B 12 D3 F5 3F 0A 4E
-1D 17 30 41 48 42 01 23 1B 42 DA 1D 2C 4F 0A 4E
-B0 12 5E 42 8F 49 00 00 0E 48 7A 90 0A 00 02 28
-3A 50 07 00 3A 50 30 00 92 83 AA 1D 18 42 AA 1D
-C8 4A 00 00 30 4D 96 42 02 23 53 00 87 12 98 42
-D2 42 2D 83 09 93 E0 23 0E 93 DE 23 3D 41 30 4D
-C8 42 02 23 3E 00 9F 42 AA 1D 00 00 3E 40 AA 1D
-2E 8F 30 4D 00 42 04 48 4F 4C 44 00 0A 4E 3E 4F
-DB 3F 3C 42 04 53 49 47 4E 00 0E 93 3E 4F 3A 40
-2D 00 D2 33 30 4D F4 41 03 55 44 2E 87 12 56 42
-CC 42 E6 42 50 45 18 45 2A 40 18 43 02 55 2E 00
-2F 83 8F 4E 00 00 0E 43 F1 3F 3E B0 00 80 06 24
-BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D DA 40
-02 44 2E 00 87 12 56 42 6E 40 80 40 3A 43 CC 42
-92 40 0A 43 E6 42 50 45 18 45 2A 40 52 41 01 2E
-3E B0 00 80 DD 27 2F 83 3E 43 EC 3F F6 42 04 48
-45 52 45 00 2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D
-62 41 05 41 4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D
-E2 42 02 43 2C 00 1A 42 C4 1D CA 4E 00 00 92 53
-C4 1D 3E 4F 30 4D 2F 83 8F 4E 00 00 B0 12 2A 44
-92 B3 DC 05 FD 27 1E 42 CC 05 B0 12 3C 44 30 4D
-30 40 B6 43 7E 43 05 28 4B 45 59 29 18 42 CC 05
-EA 3F 12 42 03 4B 45 59 30 40 DC 43 92 43 06 41
-43 43 45 50 54 00 3C 40 A8 44 3B 40 72 44 2D 15
-0A 4E 2E 4F 0A 5E 3B 40 0D 00 3C 40 20 00 3D 40
-9C 44 92 B3 DC 05 05 24 18 42 CC 05 38 90 0A 00
-04 20 21 53 39 40 56 44 4D 15 B2 40 11 00 CE 05
-A2 B3 DC 05 FD 27 E2 C2 23 02 30 41 B2 40 13 00
-CE 05 A2 B3 DC 05 FD 27 E2 D2 23 02 30 41 00 00
-05 53 4C 45 45 50 30 40 64 44 00 00 07 28 53 4C
-45 45 50 29 12 D2 0A 18 F6 3F 21 52 3A 17 58 42
-CC 05 48 9B E3 27 48 9C 06 2C 78 92 11 20 2E 9F
-0F 24 1E 83 05 3C 0E 9A 03 24 CE 48 00 00 1E 53
-82 48 CE 05 A2 B3 DC 05 FD 27 30 4D 9E 44 2D 83
-92 B3 DC 05 FD 27 E3 23 B2 40 18 00 0A 18 3E 8F
-3D 41 30 4D D6 43 06 28 45 4D 49 54 29 00 08 4E
-3E 4F E6 3F 50 43 04 45 4D 49 54 00 30 40 BE 44
-C6 44 04 45 43 48 4F 00 B2 40 82 48 90 44 30 4D
-6E 43 06 4E 4F 45 43 48 4F 00 B2 40 30 4D 90 44
-30 4D B6 44 04 28 43 52 29 00 2F 83 8F 4E 00 00
-3E 40 0D 00 E3 3F A2 43 02 43 52 00 30 40 FA 44
-04 43 05 53 50 41 43 45 2F 83 8F 4E 00 00 3E 40
-20 00 D4 3F 12 45 06 53 50 41 43 45 53 00 0E 93
-09 24 0D 12 3D 40 3A 45 EF 3F 3C 45 2D 83 1E 83
-EB 23 3D 41 3E 4F 30 4D 2C 43 04 54 59 50 45 00
-0E 93 95 24 2A 4F 8F 5E 00 00 0E 4A 87 12 CA 41
-02 42 0A 41 CC 44 EC 41 60 45 2A 40 2F 82 8F 4E
-02 00 7E 4D 8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D
-26 45 82 53 22 00 87 12 34 40 6C 45 A2 47 34 40
-22 00 C6 45 96 45 3D 41 6E 4E 1E 83 82 5E C4 1D
-3E 4F 92 B3 C4 1D A2 63 C4 1D 30 4D E2 44 82 2E
-22 00 87 12 86 45 34 40 50 45 A2 47 2A 40 00 00
-04 57 4F 52 44 00 3C 40 BE 1D 39 4C 3A 4C 09 5A
-3A 5C 28 4C 09 9A 19 24 7E 9A FC 27 1A 83 3B 40
-60 00 C8 4C 00 00 09 9A 0C 24 7C 4A 4E 9C 09 24
-18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F 7C 80 20 00
-F0 3F 1A 82 C0 1D 82 4A C2 1D 1E 42 C4 1D 08 8E
-CE 48 00 00 30 4D 00 00 04 46 49 4E 44 00 2F 83
-0C 4E 65 4C 74 40 80 00 3B 40 CA 1D 3E 4B 0E 93
-1E 24 58 4C 01 00 78 F0 1E 00 0E 58 2E 53 1E 4E
-FE FF 0E 93 F3 27 09 4E 78 49 48 C4 48 95 F7 23
-0A 4C 1A 53 FA 99 00 00 F2 23 58 83 FA 23 19 B3
-09 63 0C 49 6A 4E 1E 43 4A 93 01 30 2E 83 8F 4C
-00 00 35 40 08 40 34 40 14 40 30 4D 2F 53 2F 53
-3E 4F 30 4D 26 42 07 3E 4E 55 4D 42 45 52 3C 4F
-38 4F 29 4F 2F 82 1B 42 DA 1D 6A 4C 7A 80 30 00
-7A 90 0A 00 02 28 7A 80 07 00 0A 9B 13 2C 82 49
-D0 04 82 48 D2 04 82 4B C8 04 19 42 E4 04 18 42
-E6 04 09 5A 08 63 1C 53 1E 83 E7 23 8F 49 04 00
-8F 48 02 00 8F 4C 00 00 30 4D 03 12 0D 12 1B 42
-DA 1D 0B 12 32 C0 00 02 6D 4E 0D 5E 0C 4E 7A 40
-2E 00 0D 9C 0A 28 7A 9C FC 23 32 D0 00 02 FC 4C
-FE FF 0D 9C FC 2F DE 83 00 00 09 43 08 43 3D 40
-50 47 3F 82 8F 4E 06 00 0C 4E 7E 4C 6A 4C 7A 90
-2D 00 10 2C 3B 40 10 00 7A 80 24 00 06 24 2B 43
-5A 83 03 24 3B 52 6A 53 B0 23 1C 53 1E 83 6A 4C
-7A 90 2D 00 AA 23 1C 53 1E 83 B1 43 04 00 A5 3F
-52 47 2F 53 0E 93 2C 17 82 4C DA 1D 03 24 2F 52
-0E F3 30 4D 9F 4F 02 00 04 00 BF 4F 00 00 3E E3
-09 20 3E E3 BF E3 02 00 BF E3 00 00 9F 53 02 00
-8F 63 00 00 32 B0 00 02 01 20 2F 53 30 4D D2 44
-07 45 58 45 43 55 54 45 0A 4E 3E 4F 00 4A 28 41
-01 2C 1A 42 C4 1D A2 53 C4 1D 8A 4E 00 00 3E 4F
-30 4D A0 47 87 4C 49 54 45 52 41 4C 82 93 B6 1D
-16 24 32 B0 00 02 09 24 1A 42 C4 1D A2 52 C4 1D
-BA 40 34 40 00 00 BA 4F 02 00 1A 42 C4 1D A2 52
-C4 1D BA 40 34 40 00 00 8A 4E 02 00 3E 4F 30 4D
-08 45 05 43 4F 55 4E 54 2F 83 1E 53 8F 4E 00 00
-5E 4E FF FF 30 4D 82 4E BE 1D B2 4F C0 1D 3E 4F
-82 43 C2 1D 87 12 4C 42 C6 45 1C 48 3D 40 28 48
-FE 22 3D 41 3E 4F 30 4D 2A 48 0A 4E 3E 4F 3D 40
-40 48 53 27 3D 40 16 48 1A E2 B6 1D B2 27 AC 23
-42 48 3E 4F 3D 40 16 48 B9 23 DE 53 00 00 68 4E
-08 5E F8 40 3F 00 00 00 3D 40 0C 4A CD 3F 90 47
-08 45 56 41 4C 55 41 54 45 00 39 40 BE 1D 39 12
-39 12 39 12 0D 12 B0 12 2A 40 06 48 7E 48 3D 41
-B2 41 C2 1D B2 41 C0 1D B2 41 BE 1D 30 4D 7A 41
-04 51 55 49 54 00 31 40 E0 1C B2 40 00 1C 00 1C
-82 43 B6 1D 82 43 08 18 B0 12 2A 40 6C 45 04 0D
-6F 6B 20 00 50 45 34 40 38 1D 44 40 34 40 50 00
-F6 43 18 45 06 48 34 40 7E 1C CE 40 B2 41 6C 45
-0D 73 74 61 63 6B 20 65 6D 70 74 79 20 21 1A 49
-34 40 30 FF 84 43 B2 41 6C 45 0B 46 52 41 4D 20
-66 75 6C 6C 20 21 1A 49 42 42 F4 40 C0 41 AC 48
-6C 45 04 0D 20 20 20 00 BC 41 B4 48 EE 43 05 41
-42 4F 52 54 3F 40 80 1C BE 3F 8F 93 02 00 AE 26
-B2 40 82 48 90 44 B0 12 0C 4E 82 43 D4 56 82 43
-E0 56 82 43 EC 56 82 43 1C 57 82 43 28 57 82 43
-34 57 A2 B3 DC 05 FD 27 B2 40 11 00 CE 05 E2 C2
-23 02 92 C3 DC 05 38 40 A0 AA 39 42 19 83 FE 23
-18 83 FB 23 92 B3 DC 05 F4 23 87 12 6C 45 04 1B
-5B 37 6D 00 50 45 50 45 6C 45 04 1B 5B 30 6D 00
-50 45 4E 4D 90 4D 96 4D 14 49 0E 49 86 41 42 4F
-52 54 22 00 87 12 86 45 34 40 1A 49 A2 47 2A 40
-18 46 01 27 87 12 4C 42 C6 45 1E 46 C0 41 B2 49
-2A 40 4A 48 52 42 81 5C 92 42 BE 1D C2 1D 30 4D
-87 12 A2 45 4C 42 C6 45 CA 49 08 4E 7A 4E 5A D3
-5A 53 0A 58 19 42 C8 1D 6E 4E 3E F0 1E 00 09 5E
-82 48 AE 1D 82 49 B0 1D 82 4A B2 1D 2A 52 82 4A
-C4 1D 3E 4F 3D 41 30 41 87 12 6C 45 0F 73 74 61
-63 6B 20 6D 69 73 6D 61 74 63 68 21 20 49 82 9F
-B4 1D F2 23 18 42 AE 1D 19 42 B0 1D A8 49 FE FF
-89 48 00 00 30 4D C0 45 08 56 41 52 49 41 42 4C
-45 00 B0 12 C0 49 BA 40 86 12 FC FF EF 3F F2 47
-08 43 4F 4E 53 54 41 4E 54 00 B0 12 C0 49 BA 40
-85 12 FC FF 8A 4E FE FF 3E 4F E0 3F 40 4A 06 43
-52 45 41 54 45 00 B0 12 C0 49 BA 40 85 12 FC FF
-8A 4A FE FF D3 3F 60 48 05 44 4F 45 53 3E 1A 42
-B2 1D BA 40 84 12 00 00 8A 4D 02 00 3D 41 30 4D
-78 4A 05 44 45 46 45 52 B0 12 C0 49 BA 40 30 40
-FC FF BA 40 8E 4A FE FF B9 3F 00 00 81 5B 82 43
-B6 1D 30 4D B6 49 01 5D B2 43 B6 1D 30 4D 82 45
-87 52 45 43 55 52 53 45 19 42 C4 1D 99 42 B2 1D
-00 00 A2 53 C4 1D 30 4D AC 4A 01 3A B0 12 C0 49
-BA 40 87 12 FC FF A2 83 C4 1D B2 43 B6 1D 82 4F
-B4 1D 30 4D DA 4A 81 3B 82 93 B6 1D 5D 27 87 12
-34 40 2A 40 A2 47 0E 4A AE 4A 2A 40 F4 44 09 49
-4D 4D 45 44 49 41 54 45 1A 42 AE 1D FA D0 80 00
-00 00 30 4D BE 4F 02 00 3E 4F 30 4D 0E 4B 82 49
-53 00 87 12 42 42 F4 40 C0 41 46 4B 52 4B 34 40
-24 4B A2 47 2A 40 A4 49 24 4B 2A 40 F6 4A 83 5B
-27 5D 87 12 A4 49 34 40 34 40 A2 47 A2 47 2A 40
-90 48 88 50 4F 53 54 50 4F 4E 45 00 87 12 4C 42
-C6 45 1E 46 54 40 C0 41 B2 49 7E 41 C0 41 8C 4B
-34 40 34 40 A2 47 A2 47 34 40 A2 47 A2 47 2A 40
-92 4B 3A 4E 82 4A C6 1D 2E 4E 82 4E C4 1D 3D 40
-10 00 09 4A 08 49 29 83 18 48 FE FF 0E 98 FC 2B
-89 48 00 00 1D 83 F6 23 2A 4A 0A 93 F0 23 3E 4F
-3D 41 30 4D 2E 4B 82 49 46 00 2F 83 8F 4E 00 00
-1E 42 C4 1D BE 40 C0 41 00 00 A2 52 C4 1D 2E 53
-30 4D 92 4A 84 45 4C 53 45 00 1A 42 C4 1D BA 40
-BC 41 00 00 2A 52 82 4A C4 1D 8E 4A 00 00 2A 83
-0E 4A 30 4D 4A 45 84 54 48 45 4E 00 9E 42 C4 1D
-00 00 3E 4F 30 4D 5E 4A 85 42 45 47 49 4E 30 40
-84 43 06 4C 85 55 4E 54 49 4C 39 40 C0 41 1A 42
-C4 1D A2 52 C4 1D 8A 49 00 00 8A 4E 02 00 3E 4F
-30 4D 8C 49 85 41 47 41 49 4E 39 40 BC 41 EF 3F
-28 4A 85 57 48 49 4C 45 87 12 CA 4B 6E 40 2A 40
-C0 4A 86 52 45 50 45 41 54 00 87 12 4A 4C 0C 4C
-2A 40 E4 4B 82 44 4F 00 2F 83 8F 4E 00 00 1E 42
-C4 1D BE 40 CA 41 00 00 2E 53 82 4E C4 1D A2 53
-00 1C 1A 42 00 1C 8A 43 00 00 30 4D B4 47 84 4C
-4F 4F 50 00 39 40 EC 41 1A 42 C4 1D A2 52 C4 1D
-8A 49 00 00 8A 4E 02 00 1E 42 00 1C A2 83 00 1C
-2E 4E 0E 93 04 24 9E 42 C4 1D 00 00 F5 3F 3E 4F
-30 4D E4 43 85 2B 4C 4F 4F 50 39 40 DA 41 E4 3F
-9E 4C 85 4C 45 41 56 45 1A 42 C4 1D BA 40 FC 41
-00 00 BA 40 BC 41 02 00 B2 50 06 00 C4 1D A2 53
-00 1C 2A 52 19 42 00 1C 89 4A 00 00 30 4D E2 4C
-04 4D 4F 56 45 00 0A 4E 38 4F 39 4F 3E 4F 0A 93
-11 24 08 99 0F 24 06 2C F8 49 00 00 18 53 1A 83
-FB 23 30 4D 08 5A 09 5A 19 83 18 83 E8 49 00 00
-1A 83 FA 23 30 4D 34 40 CA 1D FC 40 2A 40 84 12
-46 4D 56 50 2C 50 74 4C A2 49 14 50 D4 4C 10 4D
-AE 45 B4 4D E8 4D 24 4C AE 4E 48 41 4E 4B B6 4A
-86 46 00 00 3A 40 0C 00 39 40 CA 1D 38 40 CC 1D
-D9 3F 3A 40 0E 00 39 40 CC 1D 38 40 CA 1D CC 3F
-82 43 CC 1D 30 4D 92 42 CA 1D C8 1D 30 4D 62 4B
-09 50 57 52 5F 53 54 41 54 45 84 12 90 4B 10 50
-5A 57 A0 4D 08 50 57 52 5F 48 45 52 45 00 92 42
-C4 1D B0 4D 92 42 C6 1D AE 4D EF 3F 62 4C 09 52
-53 54 5F 53 54 41 54 45 92 42 0C 18 B0 4D 92 42
-0E 18 AE 4D E2 3F CE 4D 08 52 53 54 5F 48 45 52
-45 00 92 42 C4 1D 0C 18 92 42 C6 1D 0E 18 DF 3F
-B2 40 54 4E B6 4E B2 40 64 44 58 44 B2 40 BE 44
-CE 44 B2 40 FA 44 0E 45 B2 40 DC 43 EA 43 30 41
-52 4C 04 57 49 50 45 00 39 40 80 FF B9 43 00 00
-29 53 39 90 B4 FF FA 23 B0 12 00 4E B2 40 5A 57
-C4 1D B2 40 10 50 C6 1D D4 3F C6 4B 06 28 57 41
-52 4D 29 00 1E 42 08 18 87 12 6C 45 05 0D 1B 5B
-37 6D 50 45 70 43 6C 45 27 20 46 61 73 74 46 6F
-72 74 68 20 56 31 36 30 20 31 36 4D 48 7A 20 28
-43 29 20 4A 2E 4D 2E 54 68 6F 6F 72 65 6E 73 20
-50 45 34 40 30 FF 84 43 2A 41 30 43 6C 45 0B 62
-79 74 65 73 20 66 72 65 65 20 26 49 22 4E 04 57
-41 52 4D 00 30 40 54 4E 18 4C 04 43 4F 4C 44 00
-B2 40 04 A5 20 01 B2 40 88 5A 5C 01 B2 D0 03 00
-04 02 B2 40 FC FF 02 02 B2 C0 03 00 06 02 B2 D0
-00 04 24 02 B2 D3 26 02 B2 43 22 02 B2 43 42 02
-B2 D3 46 02 B2 43 62 02 B2 D3 66 02 F2 43 26 03
-F2 D3 22 03 F2 40 A5 00 41 01 F2 40 10 00 40 01
-D2 43 41 01 F2 40 A5 00 61 01 B2 40 48 00 62 01
-82 43 66 01 39 40 80 00 B2 40 33 00 64 01 D2 43
-61 01 92 D2 9E 01 08 18 A2 93 08 18 01 24 59 07
-38 40 C2 A2 18 83 FE 23 19 83 FA 23 B2 42 B0 01
-F2 D0 10 00 2A 03 F2 C0 40 00 A2 04 3A 40 C6 4E
-39 40 B4 FF 89 4A 00 00 29 53 FC 23 92 42 02 18
-F0 FF B2 40 18 00 0A 18 31 40 E0 1C 3F 40 80 1C
-37 40 00 40 36 40 B4 40 35 40 08 40 34 40 14 40
-B2 40 0A 00 DA 1D B2 43 AC 1D 92 C3 30 01 18 42
-08 18 D2 B3 01 02 04 20 38 E3 18 53 82 48 08 18
-B2 40 81 00 C0 05 B2 40 05 00 C6 05 B2 40 00 49
-C8 05 F2 D0 03 00 0D 02 92 C3 C0 05 92 D3 DA 05
-3D 40 EA 4F 18 42 08 18 38 90 0A 00 25 27 38 90
-16 00 22 2F 28 93 F8 22 E0 26 B4 4E 84 12 46 4D
-38 56 E4 56 EC 55 38 57 B2 55 6C 56 B6 52 00 00
-A8 55 58 56 0A 56 48 56 C6 53 00 00 00 00 4A 57
-72 4D 4C 4E 85 48 49 32 4C 4F 87 12 84 43 DE 4B
-A2 47 AE 4A 74 4D EC 4F 2A 40 BA 4E 04 43 4F 44
-45 00 B0 12 C0 49 A2 82 C4 1D 87 12 EE 4A BC 41
-24 50 00 00 07 45 4E 44 43 4F 44 45 87 12 82 4D
-0E 4A 2A 40 44 4C 03 41 53 4D 92 42 C8 1D B8 1D
-B2 40 F0 4F C8 1D E5 3F 44 50 06 45 4E 44 41 53
-4D 00 92 42 B8 1D C8 1D E9 3F 00 00 05 43 4F 4C
-4F 4E 1A 42 C4 1D BA 40 87 12 00 00 A2 53 C4 1D
-B2 43 B6 1D 30 40 82 4D 00 00 05 4C 4F 32 48 49
-1A 42 C4 1D BA 40 B0 12 00 00 BA 40 2A 40 02 00
-A2 52 C4 1D ED 3F 38 40 BE 1D 39 48 2A 48 09 5A
-1A 52 C2 1D 09 9A 03 24 7E 9A FC 27 1A 83 0E 4A
-2A 88 82 4A C2 1D 30 4D B0 12 2A 40 C6 45 1E 46
-72 41 C0 41 EE 50 DA 46 C0 41 B2 49 10 51 F0 50
-29 4E 39 90 86 12 02 20 2E 53 30 41 39 90 85 12
-03 20 1E 4E 02 00 30 41 39 90 84 12 01 20 2E 52
-30 41 19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 40
-29 00 12 12 C2 1D 92 53 C2 1D B0 12 2A 40 C6 45
-DA 46 C0 41 42 51 38 51 21 53 3E 90 10 00 BB 2D
-30 41 44 51 B2 41 C2 1D 22 D3 30 41 87 12 4C 42
-B6 50 54 51 82 43 BC 1D 92 42 C4 1D BA 1D A2 53
-C4 1D 0A 4E 3E 4F FA 90 23 00 00 00 34 20 92 53
-C2 1D B0 12 D8 50 0E 93 04 20 B2 40 00 03 BC 1D
-27 3C 1E 93 04 20 B2 40 10 03 BC 1D 21 3C 2E 93
-04 20 B2 40 20 03 BC 1D 1B 3C 2E 92 04 20 B2 40
-20 02 BC 1D 15 3C 3E 92 04 20 B2 40 30 02 BC 1D
-0F 3C 3E 93 04 20 B2 40 30 03 BC 1D 09 3C B2 40
-30 00 BC 1D 19 42 C4 1D A2 53 C4 1D 89 4E 00 00
-3E 4F 3D 41 30 4D FA 90 26 00 00 00 08 20 B2 40
-10 02 BC 1D 92 53 C2 1D 30 12 C4 51 75 3F FA 90
-40 00 00 00 1A 20 B2 40 20 00 BC 1D 92 53 C2 1D
-B0 12 22 51 0E 20 B2 50 10 00 BC 1D 3E 40 2B 00
-B0 12 22 51 32 24 92 92 BE 1D C2 1D 02 24 92 53
-C2 1D 8E 10 82 5E BC 1D D3 3F B0 12 22 51 F9 23
-B2 50 10 00 BC 1D 3E 40 28 00 B0 12 D8 50 30 12
-14 52 67 3F 87 12 4C 42 B6 50 4C 52 FE 90 26 00
-00 00 3E 40 20 00 04 20 B2 50 82 00 BC 1D C2 3F
-B0 12 22 51 DF 23 B2 50 80 00 BC 1D 3E 40 28 00
-B0 12 D8 50 B0 12 12 51 D5 23 3D 40 B2 49 30 4D
-50 44 04 52 45 54 49 00 87 12 34 40 00 13 A2 47
-2A 40 34 40 2C 00 4C 51 44 52 9C 52 2E 4E 1E D2
-BC 1D 19 42 BA 1D 92 3F 9A 50 03 4D 4F 56 84 12
-92 52 00 40 AA 52 05 4D 4F 56 2E 42 84 12 92 52
-40 40 00 00 03 41 44 44 84 12 92 52 00 50 C4 52
-05 41 44 44 2E 42 84 12 92 52 40 50 D0 52 04 41
-44 44 43 00 84 12 92 52 00 60 DE 52 06 41 44 44
-43 2E 42 00 84 12 92 52 40 60 82 52 04 53 55 42
-43 00 84 12 92 52 00 70 FC 52 06 53 55 42 43 2E
-42 00 84 12 92 52 40 70 0A 53 03 53 55 42 84 12
-92 52 00 80 1A 53 05 53 55 42 2E 42 84 12 92 52
-40 80 7C 50 03 43 4D 50 84 12 92 52 00 90 34 53
-05 43 4D 50 2E 42 84 12 92 52 40 90 6A 50 04 44
-41 44 44 00 84 12 92 52 00 A0 4E 53 06 44 41 44
-44 2E 42 00 84 12 92 52 40 A0 40 53 03 42 49 54
-84 12 92 52 00 B0 6C 53 05 42 49 54 2E 42 84 12
-92 52 40 B0 78 53 03 42 49 43 84 12 92 52 00 C0
-86 53 05 42 49 43 2E 42 84 12 92 52 40 C0 92 53
-03 42 49 53 84 12 92 52 00 D0 A0 53 05 42 49 53
-2E 42 84 12 92 52 40 D0 00 00 03 58 4F 52 84 12
-92 52 00 E0 BA 53 05 58 4F 52 2E 42 84 12 92 52
-40 E0 EC 52 03 41 4E 44 84 12 92 52 00 F0 D4 53
-05 41 4E 44 2E 42 84 12 92 52 40 F0 4C 42 4C 51
-F2 53 1A 42 BC 1D B2 F0 70 00 BC 1D 8A 10 3A F0
-0F 00 82 DA BC 1D 4A 3F 26 53 03 52 52 43 84 12
-EC 53 00 10 0A 54 05 52 52 43 2E 42 84 12 EC 53
-40 10 16 54 04 53 57 50 42 00 84 12 EC 53 80 10
-24 54 03 52 52 41 84 12 EC 53 00 11 32 54 05 52
-52 41 2E 42 84 12 EC 53 40 11 3E 54 03 53 58 54
-84 12 EC 53 80 11 00 00 04 50 55 53 48 00 84 12
-EC 53 00 12 58 54 06 50 55 53 48 2E 42 00 84 12
-EC 53 40 12 AC 53 04 43 41 4C 4C 00 84 12 EC 53
-80 12 34 40 2C 00 4C 51 44 52 8C 54 59 42 BC 1D
-5A 42 BD 1D 82 4A BC 1D BE 90 00 15 00 00 02 20
-0A 89 02 3C 09 8A 0A 49 3A 90 10 00 03 2C 5A 0E
-A8 3F 1A 53 0E 4A 87 12 70 43 6C 45 0D 6F 75 74
-20 6F 66 20 62 6F 75 6E 64 73 20 49 66 54 05 50
-55 53 48 4D 84 12 82 54 00 15 CE 54 04 50 4F 50
-4D 00 84 12 82 54 00 17 4C 42 B6 50 EE 54 82 43
-BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D 92 53 C2 1D
-3E 40 2C 00 B0 12 2A 40 C6 45 DA 46 C0 41 B2 49
-44 52 14 55 0A 4E 3E 4F 1A 83 2A 92 CA 2F 8A 10
-5A 06 6F 3F 4C 54 04 52 52 43 4D 00 84 12 E8 54
-50 00 26 55 04 52 52 41 4D 00 84 12 E8 54 50 01
-34 55 04 52 4C 41 4D 00 84 12 E8 54 50 02 42 55
-04 52 52 55 4D 00 84 12 E8 54 50 03 85 12 00 3C
-50 55 03 53 3E 3D 85 12 00 38 62 55 02 53 3C 00
-85 12 00 34 DC 54 03 30 3E 3D 85 12 00 30 76 55
-02 30 3C 00 85 12 00 30 00 00 02 55 3C 00 85 12
-00 2C 8A 55 03 55 3E 3D 85 12 00 28 80 55 03 30
-3C 3E 85 12 00 24 9E 55 02 30 3D 00 85 12 00 20
-5C 44 02 49 46 00 1A 42 C4 1D 8A 4E 00 00 A2 53
-C4 1D 0E 4A 30 4D 94 55 04 54 48 45 4E 00 1A 42
-C4 1D 08 4E 3E 4F 09 48 29 53 0A 89 0A 11 3A 90
-00 02 68 2F 88 DA 00 00 30 4D 5C 53 04 45 4C 53
-45 00 1A 42 C4 1D BA 40 00 3C 00 00 A2 53 C4 1D
-2F 83 8F 4A 00 00 E3 3F C8 55 05 55 4E 54 49 4C
-3A 4F 08 4E 3E 4F 19 42 C4 1D 2A 83 0A 89 0A 11
-3A 90 00 FE 47 3B 3A F0 FF 03 08 DA 89 48 00 00
-A2 53 C4 1D 30 4D E0 53 05 41 47 41 49 4E 87 12
-5C 55 10 56 2A 40 00 00 05 57 48 49 4C 45 87 12
-B6 55 6E 40 2A 40 6C 55 06 52 45 50 45 41 54 00
-87 12 5C 55 10 56 CE 55 2A 40 00 00 03 4A 4D 50
-87 12 A4 49 5C 55 10 56 2A 40 3E B0 00 10 03 20
-3E E0 00 04 30 4D 3E 90 00 34 06 28 03 24 3E 40
-00 34 30 4D 3E 40 00 38 30 4D 00 00 04 3F 4A 4D
-50 00 87 12 7A 56 A4 49 6E 40 10 56 2A 40 B0 56
-3D 41 08 4E 3E 4F 2A 48 0A 93 04 20 98 42 C4 1D
-00 00 30 4D 88 43 00 00 A4 3F 76 54 03 42 57 31
-84 12 AE 56 00 00 CC 56 03 42 57 32 84 12 AE 56
-00 00 D8 56 03 42 57 33 84 12 AE 56 00 00 F0 56
-3D 41 1A 42 C4 1D 28 4E 08 93 08 20 BA 4F 00 00
-A2 53 C4 1D 8E 4A 00 00 3E 4F 30 4D 8E 43 00 00
-61 3F 00 00 03 46 57 31 84 12 EE 56 00 00 14 57
-03 46 57 32 84 12 EE 56 00 00 20 57 03 46 57 33
-84 12 EE 56 00 00 2C 57 04 47 4F 54 4F 00 87 12
-5C 55 A4 49 98 47 2A 40 9C 56 05 3F 47 4F 54 4F
-87 12 7A 56 A4 49 98 47 2A 40
-@FFB4
-C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E
-C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E
-C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E
-C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E 6A 44 C6 4E
-C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E
-q
+++ /dev/null
-@1800
-10 00 E6 44 80 3E 30 75 FD FF 18 00 5E 65 F0 51
-A6 44 B8 44 EA 59 28 5A
-@1DAA
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00
-@2000
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-@4000
-3A 41 0D 12 0D 4A 30 4D 2F 83 8F 4E 00 00 3E 41
-2E 4E 30 4D 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E
-30 4D 00 00 04 45 58 49 54 00 3D 41 30 4D 00 00
-03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 40
-03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
-44 55 50 00 0E 93 F6 23 30 4D 40 40 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 40 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E 40 02 3E 52 00 0E 12 3E 4F 30 4D 8E 40
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 40
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C 40 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 40 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 41
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 40 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA 40 03 41 4E 44 3E FF 30 4D 7A 40 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E 41 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 41 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E 41 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 41 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 40 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
-3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE 41 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 41 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 41 03 3E 49 4E 85 12 C2 1D 10 41
-04 42 41 53 45 00 85 12 DA 1D C0 40 05 53 54 41
-54 45 85 12 B6 1D 30 42 02 42 4C 00 85 12 20 00
-94 41 02 3C 23 00 B2 40 AA 1D AA 1D 30 4D 1E 15
-0E 43 3D 40 20 00 0A 93 04 20 0D 11 0A 4C 0C 43
-09 43 0E 9B 01 28 0E 8B 09 69 08 68 1D 83 07 30
-0C 5C 0A 6A 0E 6E F5 2B 0E 8B 12 D3 F5 3F 0A 4E
-1D 17 30 41 48 42 01 23 1B 42 DA 1D 2C 4F 0A 4E
-B0 12 5E 42 8F 49 00 00 0E 48 7A 90 0A 00 02 28
-3A 50 07 00 3A 50 30 00 92 83 AA 1D 18 42 AA 1D
-C8 4A 00 00 30 4D 96 42 02 23 53 00 87 12 98 42
-D2 42 2D 83 09 93 E0 23 0E 93 DE 23 3D 41 30 4D
-C8 42 02 23 3E 00 9F 42 AA 1D 00 00 3E 40 AA 1D
-2E 8F 30 4D 00 42 04 48 4F 4C 44 00 0A 4E 3E 4F
-DB 3F 3C 42 04 53 49 47 4E 00 0E 93 3E 4F 3A 40
-2D 00 D2 33 30 4D F4 41 03 55 44 2E 87 12 56 42
-CC 42 E6 42 CC 45 94 45 2A 40 18 43 02 55 2E 00
-2F 83 8F 4E 00 00 0E 43 F1 3F 3E B0 00 80 06 24
-BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D DA 40
-02 44 2E 00 87 12 56 42 6E 40 80 40 3A 43 CC 42
-92 40 0A 43 E6 42 CC 45 94 45 2A 40 52 41 01 2E
-3E B0 00 80 DD 27 2F 83 3E 43 EC 3F F6 42 04 48
-45 52 45 00 2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D
-62 41 05 41 4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D
-E2 42 02 43 2C 00 1A 42 C4 1D CA 4E 00 00 92 53
-C4 1D 3E 4F 30 4D 2F 83 8F 4E 00 00 B0 12 A6 44
-92 B3 DC 05 FD 27 1E 42 CC 05 B0 12 B8 44 30 4D
-30 40 B6 43 7E 43 05 28 4B 45 59 29 18 42 CC 05
-EA 3F 12 42 03 4B 45 59 30 40 DC 43 0D 12 3D 40
-18 44 1B 42 34 20 9B 42 1E 20 16 00 3A 40 00 21
-BF 40 50 00 00 00 8F 4A 02 00 0E 43 82 93 20 20
-13 24 19 42 1E 20 02 3C 1A 44 2D 83 19 92 20 20
-16 2C 58 49 00 1E 19 53 78 90 20 00 08 2C 78 90
-0A 00 F4 23 82 49 1E 20 2F 53 3D 41 30 4D 8F 9E
-00 00 64 24 CA 48 00 00 1A 53 1E 53 5F 3C 0A 12
-B0 12 54 5B 3A 41 DA 3F 92 43 06 41 43 43 45 50
-54 00 30 40 72 44 D6 43 08 28 41 43 43 45 50 54
-29 00 3C 40 24 45 3B 40 EE 44 2D 15 0A 4E 2E 4F
-0A 5E 3B 40 0D 00 3C 40 20 00 3D 40 18 45 92 B3
-DC 05 05 24 18 42 CC 05 38 90 0A 00 04 20 21 53
-39 40 D2 44 4D 15 B2 40 11 00 CE 05 A2 B3 DC 05
-FD 27 E2 C2 23 02 30 41 B2 40 13 00 CE 05 A2 B3
-DC 05 FD 27 E2 D2 23 02 30 41 00 00 05 53 4C 45
-45 50 30 40 E0 44 00 00 07 28 53 4C 45 45 50 29
-12 D2 0A 18 F6 3F 21 52 3A 17 58 42 CC 05 48 9B
-E3 27 48 9C 06 2C 78 92 11 20 2E 9F 0F 24 1E 83
-05 3C 0E 9A 03 24 CE 48 00 00 1E 53 82 48 CE 05
-A2 B3 DC 05 FD 27 30 4D 1A 45 2D 83 92 B3 DC 05
-FD 27 E3 23 B2 40 18 00 0A 18 3E 8F 3D 41 30 4D
-68 44 06 28 45 4D 49 54 29 00 08 4E 3E 4F E6 3F
-50 43 04 45 4D 49 54 00 30 40 3A 45 42 45 04 45
-43 48 4F 00 B2 40 82 48 0C 45 30 4D 6E 43 06 4E
-4F 45 43 48 4F 00 B2 40 30 4D 0C 45 30 4D 32 45
-04 28 43 52 29 00 2F 83 8F 4E 00 00 3E 40 0D 00
-E3 3F A2 43 02 43 52 00 30 40 76 45 04 43 05 53
-50 41 43 45 2F 83 8F 4E 00 00 3E 40 20 00 D4 3F
-8E 45 06 53 50 41 43 45 53 00 0E 93 09 24 0D 12
-3D 40 B6 45 EF 3F B8 45 2D 83 1E 83 EB 23 3D 41
-3E 4F 30 4D 2C 43 04 54 59 50 45 00 0E 93 95 24
-2A 4F 8F 5E 00 00 0E 4A 87 12 CA 41 02 42 0A 41
-48 45 EC 41 DC 45 2A 40 2F 82 8F 4E 02 00 7E 4D
-8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D A2 45 82 53
-22 00 87 12 34 40 E8 45 1E 48 34 40 22 00 42 46
-12 46 3D 41 6E 4E 1E 83 82 5E C4 1D 3E 4F 92 B3
-C4 1D A2 63 C4 1D 30 4D 5E 45 82 2E 22 00 87 12
-02 46 34 40 CC 45 1E 48 2A 40 00 00 04 57 4F 52
-44 00 3C 40 BE 1D 39 4C 3A 4C 09 5A 3A 5C 28 4C
-09 9A 19 24 7E 9A FC 27 1A 83 3B 40 60 00 C8 4C
-00 00 09 9A 0C 24 7C 4A 4E 9C 09 24 18 53 4B 9C
-F6 2F 7C 90 7B 00 F3 2F 7C 80 20 00 F0 3F 1A 82
-C0 1D 82 4A C2 1D 1E 42 C4 1D 08 8E CE 48 00 00
-30 4D 00 00 04 46 49 4E 44 00 2F 83 0C 4E 65 4C
-74 40 80 00 3B 40 CA 1D 3E 4B 0E 93 1E 24 58 4C
-01 00 78 F0 1E 00 0E 58 2E 53 1E 4E FE FF 0E 93
-F3 27 09 4E 78 49 48 C4 48 95 F7 23 0A 4C 1A 53
-FA 99 00 00 F2 23 58 83 FA 23 19 B3 09 63 0C 49
-6A 4E 1E 43 4A 93 01 30 2E 83 8F 4C 00 00 35 40
-08 40 34 40 14 40 30 4D 2F 53 2F 53 3E 4F 30 4D
-26 42 07 3E 4E 55 4D 42 45 52 3C 4F 38 4F 29 4F
-2F 82 1B 42 DA 1D 6A 4C 7A 80 30 00 7A 90 0A 00
-02 28 7A 80 07 00 0A 9B 13 2C 82 49 D0 04 82 48
-D2 04 82 4B C8 04 19 42 E4 04 18 42 E6 04 09 5A
-08 63 1C 53 1E 83 E7 23 8F 49 04 00 8F 48 02 00
-8F 4C 00 00 30 4D 03 12 0D 12 1B 42 DA 1D 0B 12
-32 C0 00 02 6D 4E 0D 5E 0C 4E 7A 40 2E 00 0D 9C
-0A 28 7A 9C FC 23 32 D0 00 02 FC 4C FE FF 0D 9C
-FC 2F DE 83 00 00 09 43 08 43 3D 40 CC 47 3F 82
-8F 4E 06 00 0C 4E 7E 4C 6A 4C 7A 90 2D 00 10 2C
-3B 40 10 00 7A 80 24 00 06 24 2B 43 5A 83 03 24
-3B 52 6A 53 B0 23 1C 53 1E 83 6A 4C 7A 90 2D 00
-AA 23 1C 53 1E 83 B1 43 04 00 A5 3F CE 47 2F 53
-0E 93 2C 17 82 4C DA 1D 03 24 2F 52 0E F3 30 4D
-9F 4F 02 00 04 00 BF 4F 00 00 3E E3 09 20 3E E3
-BF E3 02 00 BF E3 00 00 9F 53 02 00 8F 63 00 00
-32 B0 00 02 01 20 2F 53 30 4D 4E 45 07 45 58 45
-43 55 54 45 0A 4E 3E 4F 00 4A 28 41 01 2C 1A 42
-C4 1D A2 53 C4 1D 8A 4E 00 00 3E 4F 30 4D 1C 48
-87 4C 49 54 45 52 41 4C 82 93 B6 1D 16 24 32 B0
-00 02 09 24 1A 42 C4 1D A2 52 C4 1D BA 40 34 40
-00 00 BA 4F 02 00 1A 42 C4 1D A2 52 C4 1D BA 40
-34 40 00 00 8A 4E 02 00 3E 4F 30 4D 84 45 05 43
-4F 55 4E 54 2F 83 1E 53 8F 4E 00 00 5E 4E FF FF
-30 4D 82 4E BE 1D B2 4F C0 1D 3E 4F 82 43 C2 1D
-87 12 4C 42 42 46 98 48 3D 40 A4 48 FE 22 3D 41
-3E 4F 30 4D A6 48 0A 4E 3E 4F 3D 40 BC 48 53 27
-3D 40 92 48 1A E2 B6 1D B2 27 AC 23 BE 48 3E 4F
-3D 40 92 48 B9 23 DE 53 00 00 68 4E 08 5E F8 40
-3F 00 00 00 3D 40 98 4A CD 3F 0C 48 08 45 56 41
-4C 55 41 54 45 00 39 40 BE 1D 39 12 39 12 39 12
-0D 12 B0 12 2A 40 82 48 FA 48 3D 41 B2 41 C2 1D
-B2 41 C0 1D B2 41 BE 1D 30 4D 7A 41 04 51 55 49
-54 00 31 40 E0 1C B2 40 00 1C 00 1C 82 43 B6 1D
-82 43 08 18 B0 12 2A 40 E8 45 04 0D 6F 6B 20 00
-CC 45 34 40 38 1D 44 40 34 40 50 00 62 44 94 45
-82 48 34 40 7E 1C CE 40 B2 41 E8 45 0D 73 74 61
-63 6B 20 65 6D 70 74 79 20 21 96 49 34 40 30 FF
-84 43 B2 41 E8 45 0B 46 52 41 4D 20 66 75 6C 6C
-20 21 96 49 42 42 F4 40 C0 41 28 49 E8 45 04 0D
-20 20 20 00 BC 41 30 49 5A 44 05 41 42 4F 52 54
-3F 40 80 1C BE 3F 8F 93 02 00 AE 26 B2 40 82 48
-0C 45 1B 42 34 20 0B 93 04 24 CB 43 02 00 2B 4B
-FA 3F B0 12 98 4E 82 43 B4 58 82 43 C0 58 82 43
-CC 58 82 43 FC 58 82 43 08 59 82 43 14 59 A2 B3
-DC 05 FD 27 B2 40 11 00 CE 05 E2 C2 23 02 92 C3
-DC 05 38 40 A0 AA 39 42 19 83 FE 23 18 83 FB 23
-92 B3 DC 05 F4 23 87 12 E8 45 04 1B 5B 37 6D 00
-CC 45 CC 45 E8 45 04 1B 5B 30 6D 00 CC 45 DA 4D
-1C 4E 22 4E 90 49 8A 49 86 41 42 4F 52 54 22 00
-87 12 02 46 34 40 96 49 1E 48 2A 40 94 46 01 27
-87 12 4C 42 42 46 9A 46 C0 41 3E 4A 2A 40 C6 48
-52 42 81 5C 92 42 BE 1D C2 1D 30 4D 87 12 1E 46
-4C 42 42 46 56 4A 08 4E 7A 4E 5A D3 5A 53 0A 58
-19 42 C8 1D 6E 4E 3E F0 1E 00 09 5E 82 48 AE 1D
-82 49 B0 1D 82 4A B2 1D 2A 52 82 4A C4 1D 3E 4F
-3D 41 30 41 87 12 E8 45 0F 73 74 61 63 6B 20 6D
-69 73 6D 61 74 63 68 21 9C 49 82 9F B4 1D F2 23
-18 42 AE 1D 19 42 B0 1D A8 49 FE FF 89 48 00 00
-30 4D 3C 46 08 56 41 52 49 41 42 4C 45 00 B0 12
-4C 4A BA 40 86 12 FC FF EF 3F 6E 48 08 43 4F 4E
-53 54 41 4E 54 00 B0 12 4C 4A BA 40 85 12 FC FF
-8A 4E FE FF 3E 4F E0 3F CC 4A 06 43 52 45 41 54
-45 00 B0 12 4C 4A BA 40 85 12 FC FF 8A 4A FE FF
-D3 3F DC 48 05 44 4F 45 53 3E 1A 42 B2 1D BA 40
-84 12 00 00 8A 4D 02 00 3D 41 30 4D 04 4B 05 44
-45 46 45 52 B0 12 4C 4A BA 40 30 40 FC FF BA 40
-1A 4B FE FF B9 3F 00 00 81 5B 82 43 B6 1D 30 4D
-42 4A 01 5D B2 43 B6 1D 30 4D FE 45 87 52 45 43
-55 52 53 45 19 42 C4 1D 99 42 B2 1D 00 00 A2 53
-C4 1D 30 4D 38 4B 01 3A B0 12 4C 4A BA 40 87 12
-FC FF A2 83 C4 1D B2 43 B6 1D 82 4F B4 1D 30 4D
-66 4B 81 3B 82 93 B6 1D 5D 27 87 12 34 40 2A 40
-1E 48 9A 4A 3A 4B 2A 40 70 45 09 49 4D 4D 45 44
-49 41 54 45 1A 42 AE 1D FA D0 80 00 00 00 30 4D
-BE 4F 02 00 3E 4F 30 4D 9A 4B 82 49 53 00 87 12
-42 42 F4 40 C0 41 D2 4B DE 4B 34 40 B0 4B 1E 48
-2A 40 30 4A B0 4B 2A 40 82 4B 83 5B 27 5D 87 12
-30 4A 34 40 34 40 1E 48 1E 48 2A 40 0C 49 88 50
-4F 53 54 50 4F 4E 45 00 87 12 4C 42 42 46 9A 46
-54 40 C0 41 3E 4A 7E 41 C0 41 18 4C 34 40 34 40
-1E 48 1E 48 34 40 1E 48 1E 48 2A 40 1E 4C 3A 4E
-82 4A C6 1D 2E 4E 82 4E C4 1D 3D 40 10 00 09 4A
-08 49 29 83 18 48 FE FF 0E 98 FC 2B 89 48 00 00
-1D 83 F6 23 2A 4A 0A 93 F0 23 3E 4F 3D 41 30 4D
-BA 4B 82 49 46 00 2F 83 8F 4E 00 00 1E 42 C4 1D
-BE 40 C0 41 00 00 A2 52 C4 1D 2E 53 30 4D 1E 4B
-84 45 4C 53 45 00 1A 42 C4 1D BA 40 BC 41 00 00
-2A 52 82 4A C4 1D 8E 4A 00 00 2A 83 0E 4A 30 4D
-C6 45 84 54 48 45 4E 00 9E 42 C4 1D 00 00 3E 4F
-30 4D EA 4A 85 42 45 47 49 4E 30 40 84 43 92 4C
-85 55 4E 54 49 4C 39 40 C0 41 1A 42 C4 1D A2 52
-C4 1D 8A 49 00 00 8A 4E 02 00 3E 4F 30 4D 18 4A
-85 41 47 41 49 4E 39 40 BC 41 EF 3F B4 4A 85 57
-48 49 4C 45 87 12 56 4C 6E 40 2A 40 4C 4B 86 52
-45 50 45 41 54 00 87 12 D6 4C 98 4C 2A 40 70 4C
-82 44 4F 00 2F 83 8F 4E 00 00 1E 42 C4 1D BE 40
-CA 41 00 00 2E 53 82 4E C4 1D A2 53 00 1C 1A 42
-00 1C 8A 43 00 00 30 4D 30 48 84 4C 4F 4F 50 00
-39 40 EC 41 1A 42 C4 1D A2 52 C4 1D 8A 49 00 00
-8A 4E 02 00 1E 42 00 1C A2 83 00 1C 2E 4E 0E 93
-04 24 9E 42 C4 1D 00 00 F5 3F 3E 4F 30 4D E4 43
-85 2B 4C 4F 4F 50 39 40 DA 41 E4 3F 2A 4D 85 4C
-45 41 56 45 1A 42 C4 1D BA 40 FC 41 00 00 BA 40
-BC 41 02 00 B2 50 06 00 C4 1D A2 53 00 1C 2A 52
-19 42 00 1C 89 4A 00 00 30 4D 6E 4D 04 4D 4F 56
-45 00 0A 4E 38 4F 39 4F 3E 4F 0A 93 11 24 08 99
-0F 24 06 2C F8 49 00 00 18 53 1A 83 FB 23 30 4D
-08 5A 09 5A 19 83 18 83 E8 49 00 00 1A 83 FA 23
-30 4D 34 40 CA 1D FC 40 2A 40 84 12 D2 4D 36 52
-0A 65 44 65 2C 65 F4 51 60 4D 34 64 E4 62 40 4E
-E8 64 42 64 32 63 48 41 DA 4B 42 4B 28 63 00 00
-3A 40 0C 00 39 40 CA 1D 38 40 CC 1D D9 3F 3A 40
-0E 00 39 40 CC 1D 38 40 CA 1D CC 3F 82 43 CC 1D
-30 4D 92 42 CA 1D C8 1D 30 4D EE 4B 09 50 57 52
-5F 53 54 41 54 45 84 12 1C 4C F0 51 5E 65 2C 4E
-08 50 57 52 5F 48 45 52 45 00 92 42 C4 1D 3C 4E
-92 42 C6 1D 3A 4E EF 3F EE 4C 09 52 53 54 5F 53
-54 41 54 45 92 42 0C 18 3C 4E 92 42 0E 18 3A 4E
-E2 3F 5A 4E 08 52 53 54 5F 48 45 52 45 00 92 42
-C4 1D 0C 18 92 42 C6 1D 0E 18 DF 3F B2 40 E6 4E
-48 4F B2 40 E0 44 D4 44 B2 40 3A 45 4A 45 B2 40
-76 45 8A 45 B2 40 DC 43 EA 43 B2 40 72 44 64 44
-30 41 DE 4C 04 57 49 50 45 00 39 40 80 FF B9 43
-00 00 29 53 39 90 B4 FF FA 23 B0 12 8C 4E B2 40
-5E 65 C4 1D B2 40 F0 51 C6 1D D1 3F 52 4C 06 28
-57 41 52 4D 29 00 1E 42 08 18 87 12 E8 45 05 0D
-1B 5B 37 6D CC 45 70 43 E8 45 27 20 46 61 73 74
-46 6F 72 74 68 20 56 31 36 30 20 31 36 4D 48 7A
-20 28 43 29 20 4A 2E 4D 2E 54 68 6F 6F 72 65 6E
-73 20 CC 45 34 40 30 FF 84 43 2A 41 30 43 E8 45
-0B 62 79 74 65 73 20 66 72 65 65 20 B2 49 B4 4E
-04 57 41 52 4D 00 30 40 E6 4E A4 4C 04 43 4F 4C
-44 00 B2 40 04 A5 20 01 B2 40 88 5A 5C 01 B2 D0
-03 00 04 02 B2 40 FC FF 02 02 B2 C0 03 00 06 02
-B2 D0 00 04 24 02 B2 D3 26 02 B2 43 22 02 B2 43
-42 02 B2 D3 46 02 B2 43 62 02 B2 D3 66 02 F2 43
-26 03 F2 D3 22 03 F2 40 A5 00 41 01 F2 40 10 00
-40 01 D2 43 41 01 F2 40 A5 00 61 01 B2 40 48 00
-62 01 82 43 66 01 39 40 80 00 B2 40 33 00 64 01
-D2 43 61 01 92 D2 9E 01 08 18 A2 93 08 18 01 24
-59 07 38 40 C2 A2 18 83 FE 23 19 83 FA 23 B2 42
-B0 01 F2 D0 10 00 2A 03 F2 C0 40 00 A2 04 3A 40
-58 4F 39 40 B4 FF 89 4A 00 00 29 53 FC 23 92 42
-02 18 F0 FF B2 40 18 00 0A 18 31 40 E0 1C 3F 40
-80 1C 37 40 00 40 36 40 B4 40 35 40 08 40 34 40
-14 40 B2 40 0A 00 DA 1D B2 43 AC 1D 92 C3 30 01
-18 42 08 18 D2 B3 01 02 04 20 38 E3 18 53 82 48
-08 18 B2 40 81 00 C0 05 B2 40 05 00 C6 05 B2 40
-00 49 C8 05 F2 D0 03 00 0D 02 92 C3 C0 05 92 D3
-DA 05 3D 40 7C 50 18 42 08 18 38 90 0A 00 25 27
-38 90 16 00 22 2F 28 93 F5 22 DD 26 7E 50 E2 B2
-60 02 61 23 B2 40 81 A9 40 06 B2 40 30 00 46 06
-D2 D3 25 02 B2 D0 C0 04 0C 02 B2 C0 C0 04 06 02
-92 C3 40 06 39 40 00 20 89 43 00 00 29 53 39 90
-54 21 FA 23 39 42 B0 12 C2 59 D2 C3 23 02 2C 42
-B2 40 95 00 14 20 B2 40 00 40 18 20 1A 43 B0 12
-86 59 02 24 30 40 60 5A B0 12 C0 59 7A 93 FC 23
-B2 40 87 AA 14 20 92 43 16 20 B2 40 00 48 18 20
-1A 43 B0 12 86 59 29 42 B0 12 C2 59 92 43 14 20
-82 43 16 20 78 43 3C 42 B2 40 00 77 18 20 1A 43
-B0 12 86 59 B2 40 40 69 18 20 B0 12 7C 59 03 24
-58 83 F2 23 D7 3F 0C 5C A2 43 16 20 B2 40 00 50
-18 20 B0 12 7C 59 CE 23 92 D3 40 06 82 43 46 06
-92 C3 40 06 B0 12 E8 59 38 40 00 1E 92 48 C6 01
-04 20 92 48 C8 01 06 20 5A 48 C2 01 92 43 02 20
-7A 80 06 00 0D 24 7A 82 0B 24 A2 43 02 20 6A 53
-07 24 5A 53 05 24 3A 50 0B 20 0C 4A 30 40 66 5A
-B0 12 E8 59 D2 48 0D 00 12 20 19 48 0E 00 82 49
-08 20 1A 48 16 00 0A 93 02 20 1A 48 24 00 82 4A
-0A 20 09 5A 82 49 0C 20 09 5A A2 93 02 20 04 24
-82 49 0E 20 39 50 20 00 19 82 12 20 19 82 12 20
-82 49 10 20 92 42 02 20 2C 20 BD 3E 84 12 D2 4D
-18 58 C4 58 CC 57 18 59 92 57 4C 58 96 54 00 00
-88 57 38 58 EA 57 28 58 A6 55 00 00 00 00 2A 59
-FE 4D DE 4E 85 48 49 32 4C 4F 87 12 84 43 6A 4C
-1E 48 3A 4B 00 4E CC 51 2A 40 4C 4F 04 43 4F 44
-45 00 B0 12 4C 4A A2 82 C4 1D 87 12 7A 4B BC 41
-04 52 00 00 07 45 4E 44 43 4F 44 45 87 12 0E 4E
-9A 4A 2A 40 D0 4C 03 41 53 4D 92 42 C8 1D B8 1D
-B2 40 D0 51 C8 1D E5 3F 24 52 06 45 4E 44 41 53
-4D 00 92 42 B8 1D C8 1D E9 3F 00 00 05 43 4F 4C
-4F 4E 1A 42 C4 1D BA 40 87 12 00 00 A2 53 C4 1D
-B2 43 B6 1D 30 40 0E 4E 00 00 05 4C 4F 32 48 49
-1A 42 C4 1D BA 40 B0 12 00 00 BA 40 2A 40 02 00
-A2 52 C4 1D ED 3F 38 40 BE 1D 39 48 2A 48 09 5A
-1A 52 C2 1D 09 9A 03 24 7E 9A FC 27 1A 83 0E 4A
-2A 88 82 4A C2 1D 30 4D B0 12 2A 40 42 46 9A 46
-72 41 C0 41 CE 52 56 47 C0 41 3E 4A F0 52 D0 52
-29 4E 39 90 86 12 02 20 2E 53 30 41 39 90 85 12
-03 20 1E 4E 02 00 30 41 39 90 84 12 01 20 2E 52
-30 41 19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 40
-29 00 12 12 C2 1D 92 53 C2 1D B0 12 2A 40 42 46
-56 47 C0 41 22 53 18 53 21 53 3E 90 10 00 BB 2D
-30 41 24 53 B2 41 C2 1D 22 D3 30 41 87 12 4C 42
-96 52 34 53 82 43 BC 1D 92 42 C4 1D BA 1D A2 53
-C4 1D 0A 4E 3E 4F FA 90 23 00 00 00 34 20 92 53
-C2 1D B0 12 B8 52 0E 93 04 20 B2 40 00 03 BC 1D
-27 3C 1E 93 04 20 B2 40 10 03 BC 1D 21 3C 2E 93
-04 20 B2 40 20 03 BC 1D 1B 3C 2E 92 04 20 B2 40
-20 02 BC 1D 15 3C 3E 92 04 20 B2 40 30 02 BC 1D
-0F 3C 3E 93 04 20 B2 40 30 03 BC 1D 09 3C B2 40
-30 00 BC 1D 19 42 C4 1D A2 53 C4 1D 89 4E 00 00
-3E 4F 3D 41 30 4D FA 90 26 00 00 00 08 20 B2 40
-10 02 BC 1D 92 53 C2 1D 30 12 A4 53 75 3F FA 90
-40 00 00 00 1A 20 B2 40 20 00 BC 1D 92 53 C2 1D
-B0 12 02 53 0E 20 B2 50 10 00 BC 1D 3E 40 2B 00
-B0 12 02 53 32 24 92 92 BE 1D C2 1D 02 24 92 53
-C2 1D 8E 10 82 5E BC 1D D3 3F B0 12 02 53 F9 23
-B2 50 10 00 BC 1D 3E 40 28 00 B0 12 B8 52 30 12
-F4 53 67 3F 87 12 4C 42 96 52 2C 54 FE 90 26 00
-00 00 3E 40 20 00 04 20 B2 50 82 00 BC 1D C2 3F
-B0 12 02 53 DF 23 B2 50 80 00 BC 1D 3E 40 28 00
-B0 12 B8 52 B0 12 F2 52 D5 23 3D 40 3E 4A 30 4D
-CC 44 04 52 45 54 49 00 87 12 34 40 00 13 1E 48
-2A 40 34 40 2C 00 2C 53 24 54 7C 54 2E 4E 1E D2
-BC 1D 19 42 BA 1D 92 3F 7A 52 03 4D 4F 56 84 12
-72 54 00 40 8A 54 05 4D 4F 56 2E 42 84 12 72 54
-40 40 00 00 03 41 44 44 84 12 72 54 00 50 A4 54
-05 41 44 44 2E 42 84 12 72 54 40 50 B0 54 04 41
-44 44 43 00 84 12 72 54 00 60 BE 54 06 41 44 44
-43 2E 42 00 84 12 72 54 40 60 62 54 04 53 55 42
-43 00 84 12 72 54 00 70 DC 54 06 53 55 42 43 2E
-42 00 84 12 72 54 40 70 EA 54 03 53 55 42 84 12
-72 54 00 80 FA 54 05 53 55 42 2E 42 84 12 72 54
-40 80 5C 52 03 43 4D 50 84 12 72 54 00 90 14 55
-05 43 4D 50 2E 42 84 12 72 54 40 90 4A 52 04 44
-41 44 44 00 84 12 72 54 00 A0 2E 55 06 44 41 44
-44 2E 42 00 84 12 72 54 40 A0 20 55 03 42 49 54
-84 12 72 54 00 B0 4C 55 05 42 49 54 2E 42 84 12
-72 54 40 B0 58 55 03 42 49 43 84 12 72 54 00 C0
-66 55 05 42 49 43 2E 42 84 12 72 54 40 C0 72 55
-03 42 49 53 84 12 72 54 00 D0 80 55 05 42 49 53
-2E 42 84 12 72 54 40 D0 00 00 03 58 4F 52 84 12
-72 54 00 E0 9A 55 05 58 4F 52 2E 42 84 12 72 54
-40 E0 CC 54 03 41 4E 44 84 12 72 54 00 F0 B4 55
-05 41 4E 44 2E 42 84 12 72 54 40 F0 4C 42 2C 53
-D2 55 1A 42 BC 1D B2 F0 70 00 BC 1D 8A 10 3A F0
-0F 00 82 DA BC 1D 4A 3F 06 55 03 52 52 43 84 12
-CC 55 00 10 EA 55 05 52 52 43 2E 42 84 12 CC 55
-40 10 F6 55 04 53 57 50 42 00 84 12 CC 55 80 10
-04 56 03 52 52 41 84 12 CC 55 00 11 12 56 05 52
-52 41 2E 42 84 12 CC 55 40 11 1E 56 03 53 58 54
-84 12 CC 55 80 11 00 00 04 50 55 53 48 00 84 12
-CC 55 00 12 38 56 06 50 55 53 48 2E 42 00 84 12
-CC 55 40 12 8C 55 04 43 41 4C 4C 00 84 12 CC 55
-80 12 34 40 2C 00 2C 53 24 54 6C 56 59 42 BC 1D
-5A 42 BD 1D 82 4A BC 1D BE 90 00 15 00 00 02 20
-0A 89 02 3C 09 8A 0A 49 3A 90 10 00 03 2C 5A 0E
-A8 3F 1A 53 0E 4A 87 12 70 43 E8 45 0D 6F 75 74
-20 6F 66 20 62 6F 75 6E 64 73 9C 49 46 56 05 50
-55 53 48 4D 84 12 62 56 00 15 AE 56 04 50 4F 50
-4D 00 84 12 62 56 00 17 4C 42 96 52 CE 56 82 43
-BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D 92 53 C2 1D
-3E 40 2C 00 B0 12 2A 40 42 46 56 47 C0 41 3E 4A
-24 54 F4 56 0A 4E 3E 4F 1A 83 2A 92 CA 2F 8A 10
-5A 06 6F 3F 2C 56 04 52 52 43 4D 00 84 12 C8 56
-50 00 06 57 04 52 52 41 4D 00 84 12 C8 56 50 01
-14 57 04 52 4C 41 4D 00 84 12 C8 56 50 02 22 57
-04 52 52 55 4D 00 84 12 C8 56 50 03 85 12 00 3C
-30 57 03 53 3E 3D 85 12 00 38 42 57 02 53 3C 00
-85 12 00 34 BC 56 03 30 3E 3D 85 12 00 30 56 57
-02 30 3C 00 85 12 00 30 00 00 02 55 3C 00 85 12
-00 2C 6A 57 03 55 3E 3D 85 12 00 28 60 57 03 30
-3C 3E 85 12 00 24 7E 57 02 30 3D 00 85 12 00 20
-D8 44 02 49 46 00 1A 42 C4 1D 8A 4E 00 00 A2 53
-C4 1D 0E 4A 30 4D 74 57 04 54 48 45 4E 00 1A 42
-C4 1D 08 4E 3E 4F 09 48 29 53 0A 89 0A 11 3A 90
-00 02 68 2F 88 DA 00 00 30 4D 3C 55 04 45 4C 53
-45 00 1A 42 C4 1D BA 40 00 3C 00 00 A2 53 C4 1D
-2F 83 8F 4A 00 00 E3 3F A8 57 05 55 4E 54 49 4C
-3A 4F 08 4E 3E 4F 19 42 C4 1D 2A 83 0A 89 0A 11
-3A 90 00 FE 47 3B 3A F0 FF 03 08 DA 89 48 00 00
-A2 53 C4 1D 30 4D C0 55 05 41 47 41 49 4E 87 12
-3C 57 F0 57 2A 40 00 00 05 57 48 49 4C 45 87 12
-96 57 6E 40 2A 40 4C 57 06 52 45 50 45 41 54 00
-87 12 3C 57 F0 57 AE 57 2A 40 00 00 03 4A 4D 50
-87 12 30 4A 3C 57 F0 57 2A 40 3E B0 00 10 03 20
-3E E0 00 04 30 4D 3E 90 00 34 06 28 03 24 3E 40
-00 34 30 4D 3E 40 00 38 30 4D 00 00 04 3F 4A 4D
-50 00 87 12 5A 58 30 4A 6E 40 F0 57 2A 40 90 58
-3D 41 08 4E 3E 4F 2A 48 0A 93 04 20 98 42 C4 1D
-00 00 30 4D 88 43 00 00 A4 3F 56 56 03 42 57 31
-84 12 8E 58 00 00 AC 58 03 42 57 32 84 12 8E 58
-00 00 B8 58 03 42 57 33 84 12 8E 58 00 00 D0 58
-3D 41 1A 42 C4 1D 28 4E 08 93 08 20 BA 4F 00 00
-A2 53 C4 1D 8E 4A 00 00 3E 4F 30 4D 8E 43 00 00
-61 3F 00 00 03 46 57 31 84 12 CE 58 00 00 F4 58
-03 46 57 32 84 12 CE 58 00 00 00 59 03 46 57 33
-84 12 CE 58 00 00 0C 59 04 47 4F 54 4F 00 87 12
-3C 57 30 4A 14 48 2A 40 7C 58 05 3F 47 4F 54 4F
-87 12 5A 58 30 4A 14 48 2A 40 D2 C3 23 02 E2 B2
-60 02 02 24 30 40 52 4F 1A 52 04 20 19 62 06 20
-92 43 14 20 A2 93 02 20 07 24 0A 5A 49 69 82 4A
-16 20 C2 49 18 20 0A 3C C2 4A 15 20 8A 10 C2 4A
-16 20 C2 49 17 20 89 10 C2 49 18 20 B0 12 C0 59
-7A 93 FC 23 0A 43 39 40 05 00 D2 49 14 20 4E 06
-82 93 46 06 05 24 92 B3 6C 06 FD 27 C2 93 4C 06
-59 83 F3 2F 19 83 0B 30 F2 43 4E 06 82 93 46 06
-03 24 92 B3 6C 06 FD 27 5A 92 4C 06 F3 23 30 41
-19 43 3A 43 8A 10 C2 4A 4E 06 82 93 46 06 05 24
-92 B3 6C 06 FD 27 C2 93 4C 06 19 83 F3 23 5A 42
-4C 06 30 41 1A 52 08 20 09 43 1C D3 F2 40 51 00
-19 20 B0 12 3A 59 34 20 B0 12 C0 59 7A 90 FE FF
-04 24 FA 23 D9 42 4C 06 FF 1D F2 43 4E 06 03 43
-19 53 39 90 01 02 F6 23 F2 43 4E 06 3C C0 03 00
-D2 D3 23 02 30 41 09 43 2C D3 F0 40 58 00 EB C5
-B0 12 3A 59 15 20 3A 40 FE FF 29 43 B0 12 C4 59
-D2 49 00 1E 4E 06 03 43 19 53 39 90 00 02 F8 23
-39 40 03 00 B0 12 C2 59 7A C0 E1 00 6A 92 DE 27
-8C 10 1C 52 4C 06 D2 D3 23 02 87 12 E8 45 0B 3C
-20 53 44 20 45 72 72 6F 72 21 7C 5A 2F 82 8F 4E
-02 00 9F 42 DA 1D 00 00 B2 40 10 00 DA 1D 0E 4C
-B0 12 2A 40 30 43 36 42 FC 40 9C 49 39 4F 18 42
-C4 1D 4A 4E 0E 48 C8 4A 00 00 18 53 30 40 B4 4D
-92 4B 0E 00 22 20 92 4B 10 00 24 20 5A 42 23 20
-58 42 22 20 A2 93 02 20 02 24 08 58 30 41 59 42
-24 20 89 10 0A 59 88 10 08 58 0A 6A 88 10 08 58
-30 41 82 43 1C 20 92 42 0E 20 1A 20 C2 93 24 20
-03 20 92 93 22 20 14 24 92 42 22 20 D0 04 92 42
-24 20 D2 04 92 42 12 20 C8 04 92 42 E4 04 1A 20
-92 42 E6 04 1C 20 92 52 10 20 1A 20 82 63 1C 20
-30 41 92 4B 0E 00 22 20 92 4B 10 00 24 20 B0 12
-E2 5A 5A 4B 03 00 82 5A 1A 20 82 63 1C 20 30 41
-09 93 07 24 F8 90 20 00 00 1E 03 20 18 53 19 83
-F9 23 30 41 1B 42 34 20 82 43 1E 20 B2 90 00 02
-20 20 9A 20 BB 80 00 02 12 00 8B 73 14 00 DB 53
-03 00 DB 92 12 20 03 00 11 28 CB 43 03 00 B0 12
-B0 5A B0 12 E4 59 8B 43 10 00 9B 48 00 1E 0E 00
-92 93 02 20 03 24 9B 48 02 1E 10 00 B2 40 00 02
-20 20 8B 93 14 00 0B 20 92 9B 12 00 1E 20 74 2C
-BB 90 00 02 12 00 03 2C 92 4B 12 00 20 20 B0 12
-22 5B 1A 42 1A 20 19 42 1C 20 0F 3F 3C 42 3B 40
-40 20 09 43 CB 93 02 00 10 24 9B 92 24 20 0C 00
-04 20 9B 92 22 20 0A 00 07 24 09 4B 3B 50 18 00
-3B 90 00 21 EF 23 0C 5C 30 41 0C 43 82 4B 34 20
-8B 49 00 00 4A 93 07 34 49 93 05 24 C9 93 02 00
-02 34 5A 59 02 00 CB 4A 02 00 CB 43 03 00 9B 42
-1A 20 04 00 9B 42 1C 20 06 00 18 42 30 20 8B 48
-08 00 9B 48 1A 1E 0A 00 9B 48 14 1E 0C 00 9B 48
-1A 1E 0E 00 9B 48 14 1E 10 00 9B 48 1C 1E 12 00
-9B 48 1E 1E 14 00 82 43 1E 20 6A 93 62 27 CC 37
-8B 43 16 00 7A 93 05 24 99 37 99 52 C2 1D 16 00
-95 3F 92 42 BE 1D 36 20 92 82 C2 1D 36 20 92 42
-C0 1D 38 20 92 52 C2 1D 38 20 B2 40 EC 43 64 44
-92 42 BE 1D C2 1D 82 3F 1B 42 34 20 82 43 20 20
-0B 93 AA 27 EB 93 02 00 04 20 B0 12 08 61 B0 12
-D0 60 5A 4B 02 00 CB 43 02 00 2B 4B 82 4B 34 20
-5A 53 05 24 99 37 92 4B 16 00 1E 20 67 3F 1E 42
-36 20 9F 42 38 20 02 00 B2 40 72 44 64 44 8C 3F
-74 4E 85 52 45 41 44 22 5A 43 19 3C 40 4F 86 57
-52 49 54 45 22 00 6A 43 12 3C 00 4D 84 44 45 4C
-22 00 6A 42 0C 3C 0C 52 05 43 4C 4F 53 45 B0 12
-98 5C 30 4D 9C 4D 85 4C 4F 41 44 22 7A 43 2F 83
-8F 4E 00 00 0E 4A 82 93 B6 1D 0D 24 87 12 34 40
-34 40 1E 48 1E 48 02 46 34 40 9C 5A 1E 48 34 40
-52 5D 1E 48 2A 40 87 12 34 40 22 00 42 46 50 5D
-3D 41 2F 83 78 4E 08 5E C8 43 00 00 1C 43 92 42
-2C 20 22 20 92 42 2E 20 24 20 CE 93 00 00 96 24
-FE 90 3A 00 01 00 01 20 2E 53 FE 90 5C 00 00 00
-09 20 1E 53 92 42 02 20 22 20 82 43 24 20 CE 93
-00 00 76 24 82 4E 32 20 B0 12 E2 5A BF 40 20 00
-00 00 A2 93 02 20 04 24 92 92 22 20 02 20 03 24
-9F 42 12 20 00 00 B0 12 C2 5B 2C 43 0A 43 08 4A
-58 0E 08 58 82 48 30 20 C8 93 00 1E 67 24 39 42
-F8 9E 00 1E 04 20 18 53 19 83 FA 23 1E 53 FE 90
-2E 00 FF FF 1B 24 39 50 03 00 B0 12 40 5B 07 20
-FE 90 5C 00 FF FF 2C 24 CE 93 FF FF 29 24 1E 42
-32 20 1A 53 3A 90 10 00 DA 23 92 53 1A 20 82 63
-1C 20 9F 83 00 00 CF 23 2C 42 40 3C FE 90 2E 00
-FE FF ED 27 B0 12 40 5B EA 23 39 40 03 00 F8 9E
-00 1E 04 20 18 53 19 83 FA 23 0A 3C CE 93 FF FF
-DE 23 FE 90 5C 00 FF FF DA 23 B0 12 40 5B D7 23
-18 42 30 20 92 48 1A 1E 22 20 92 48 14 1E 24 20
-F8 B0 10 00 0B 1E 16 24 82 93 24 20 06 20 82 93
-22 20 03 20 92 42 02 20 22 20 CE 93 FF FF 87 23
-92 42 22 20 2C 20 92 42 24 20 2E 20 2F 52 3E 4F
-3D 41 30 4D 1A 4F 02 00 B0 12 CC 5B 2F 53 3A 4F
-3E 4F 7A 93 12 20 0C 93 01 20 30 4D 87 12 E8 45
-0B 3C 20 4F 70 65 6E 45 72 72 6F 72 54 45 84 43
-74 48 CC 45 94 45 BC 41 7A 5A 1A 93 B5 20 0C 93
-ED 23 30 4D E2 5C 04 52 45 41 44 00 2F 83 8F 4E
-00 00 1E 42 34 20 B0 12 54 5B 1E 82 34 20 30 4D
-2C 43 12 12 2A 20 18 42 02 20 08 58 2A 41 82 9A
-0A 20 A0 24 B0 12 E4 59 09 43 28 93 03 24 89 93
-02 1E 03 20 89 93 00 1E 07 24 09 58 39 90 00 02
-F4 23 91 53 00 00 EA 3F 0C 43 6A 41 B9 43 00 1E
-28 93 0F 24 B9 40 FF 0F 02 1E 09 11 8A 10 09 5A
-5A 41 01 00 0A 11 09 10 82 4A 28 20 82 49 26 20
-07 3C 09 11 C2 49 26 20 C2 4A 27 20 82 43 28 20
-3A 41 82 4A 2A 20 30 41 0A 12 1A 52 08 20 B0 12
-26 5A 3A 41 1A 52 0C 20 30 40 26 5A F2 B0 40 00
-A2 04 29 20 F2 B0 10 00 A2 04 FC 27 5A 42 B0 04
-4A 11 59 42 B4 04 F2 40 20 00 C0 04 D2 42 B1 04
-C8 04 1A 52 E4 04 D2 42 B5 04 C8 04 19 52 E4 04
-D2 42 B2 04 C0 04 B2 40 00 08 C8 04 1A 52 E4 04
-92 42 B6 04 C0 04 B2 80 BC 07 C0 04 B2 40 00 02
-C8 04 19 52 E4 04 30 41 22 2A 2B 2C 2F 3A 3B 3C
-3D 3E 3F 5B 5C 5D 7C 2E 29 92 06 38 39 80 03 00
-B0 12 26 60 39 40 03 00 7A 4B C8 4A 00 1E 0A 93
-12 24 0D 12 3D 40 0F 00 3C 40 D8 5F 7A 9C F4 27
-1D 83 FC 23 3D 41 6A 9C E7 27 3A 80 21 00 EC 3B
-18 53 19 83 E9 23 09 93 06 24 F8 40 20 00 00 1E
-18 53 19 83 FA 23 30 41 2A 93 E4 20 2C 93 0D 24
-0C 93 BA 24 87 12 E8 45 0C 3C 20 57 72 69 74 65
-45 72 72 6F 72 00 BC 41 BC 5E B0 12 F0 5E 92 42
-26 20 22 20 92 42 28 20 24 20 B0 12 68 5F B0 12
-C2 5B 18 42 30 20 F8 40 20 00 0B 1E B0 12 7C 5F
-88 43 0C 1E 88 4A 0E 1E 88 49 10 1E 88 49 12 1E
-98 42 24 20 14 1E 98 42 22 20 1A 1E 88 43 1C 1E
-88 43 1E 1E 1C 43 1B 42 32 20 CB 93 00 00 CA 27
-FB 90 2E 00 00 00 C6 27 39 40 0B 00 B0 12 F8 5F
-B0 12 12 61 2A 43 B0 12 CC 5B 0C 93 BB 23 30 4D
-1A 4B 04 00 19 4B 06 00 B0 12 EA 59 B0 12 7C 5F
-18 4B 08 00 88 49 12 1E 88 4A 16 1E 88 49 18 1E
-98 4B 12 00 1C 1E 98 4B 14 00 1E 1E 1A 4B 04 00
-19 4B 06 00 30 40 28 5A 9B 52 1E 20 12 00 8B 63
-14 00 1A 42 1A 20 19 42 1C 20 30 40 28 5A B2 40
-00 02 1E 20 1B 42 34 20 B0 12 08 61 82 43 1E 20
-DB 53 03 00 DB 92 12 20 03 00 22 20 CB 43 03 00
-B0 12 B0 5A 08 12 0A 12 B0 12 F0 5E 2A 91 05 24
-B0 12 68 5F 2A 41 B0 12 E4 59 3A 41 38 41 98 42
-26 20 00 1E 92 93 02 20 03 24 98 42 28 20 02 1E
-B0 12 68 5F 9B 42 26 20 0E 00 9B 42 28 20 10 00
-30 40 22 5B EE 5C 05 57 52 49 54 45 B0 12 1E 61
-30 4D D6 5E 07 53 44 5F 45 4D 49 54 B2 90 00 02
-1E 20 02 28 B0 12 1E 61 18 42 1E 20 C8 4E 00 1E
-92 53 1E 20 3E 4F 30 4D 58 4B 13 00 5C 4B 14 00
-8C 10 0C 58 5A 4B 15 00 0A 11 0C 10 18 4B 12 00
-BB C0 FF 01 12 00 38 F0 FF 01 82 48 1E 20 5B 42
-12 20 B0 12 5E 42 1B 42 34 20 CB 4A 03 00 19 5B
-0A 00 18 6B 0C 00 8B 49 0E 00 8B 48 10 00 B0 12
-BE 5B 30 4D 0C 93 38 20 38 90 E0 01 03 2C C8 93
-20 1E 02 24 7C 40 E5 00 C8 4C 00 1E B0 12 12 61
-B0 12 BC 5A 82 4A 2A 20 0B 4A B0 12 E4 59 1A 48
-00 1E 88 43 00 1E 92 93 02 20 09 24 19 48 02 1E
-88 43 02 1E 39 F0 FF 0F 39 90 FF 0F 02 20 3A 93
-0E 24 82 4A 22 20 82 49 24 20 B0 12 BC 5A 0B 9A
-E6 27 0A 12 0A 4B B0 12 68 5F 3A 41 DD 3F 0A 4B
-B0 12 68 5F B0 12 98 5C 30 4D B0 4C 08 54 45 52
-4D 32 53 44 22 00 87 12 02 5D 84 43 8E 62 21 53
-2F 83 AF 43 00 00 3D 40 9E 62 30 40 52 5D A0 62
-92 C3 DC 05 08 43 B0 12 A6 44 92 B3 DC 05 FD 27
-59 42 CC 05 69 92 0D 24 C8 49 00 1E 18 53 38 90
-FF 01 04 24 F2 2B B0 12 1E 61 EC 3F B0 12 B8 44
-EC 3F B0 12 B8 44 82 48 1E 20 B0 12 98 5C 3D 41
-30 4D 2A 46 02 2E 53 00 87 12 34 40 3C 00 48 45
-E0 40 70 43 34 40 08 00 48 45 34 40 3E 00 48 45
-94 45 CE 40 34 40 80 1C B2 41 C0 41 24 63 CE 40
-34 40 7E 1C CA 41 02 42 F4 40 30 43 34 40 FE FF
-DA 41 16 63 2A 40 02 47 01 3F 2E 4E 30 40 30 43
-86 61 05 57 4F 52 44 53 87 12 36 42 F4 40 34 40
-0A 00 36 42 FC 40 88 45 34 40 03 00 AA 45 34 40
-10 00 70 43 E8 45 14 74 68 72 65 61 64 73 20 76
-6F 63 61 62 75 6C 61 72 69 65 73 00 CC 45 36 42
-FC 40 34 40 CA 1D 44 40 6A 4C 6E 40 F4 40 54 40
-C0 41 20 64 88 45 34 40 03 00 AA 45 44 40 34 40
-E2 1C 34 40 10 00 44 40 22 41 A2 4D 34 40 00 00
-44 40 34 40 10 00 44 40 22 41 34 40 00 00 CA 41
-44 40 02 42 34 40 E2 1C 22 41 F4 40 B2 41 C0 41
-D2 63 62 40 62 40 02 42 44 40 34 40 E2 1C 22 41
-F4 40 34 40 02 00 DA 41 B0 63 54 40 C0 41 16 64
-44 40 34 40 02 00 2A 41 F4 40 92 40 34 40 E2 1C
-22 41 FC 40 44 40 74 48 34 40 7F 00 38 41 CC 45
-0A 41 34 40 0F 00 38 41 34 40 10 00 6E 40 2A 41
-AA 45 BC 41 9C 63 62 40 62 40 88 45 BC 41 76 63
-62 40 2A 40 16 5D 03 4D 41 58 2E 9F 07 38 2F 53
-30 4D 26 64 03 4D 49 4E 2E 9F F9 3B 3E 4F 30 4D
-7C 62 03 55 2E 52 87 12 A8 40 56 42 34 40 00 00
-98 42 CC 42 E6 42 B4 40 80 40 2A 41 34 40 00 00
-2A 64 AA 45 CC 45 2A 40 FC 5C 04 44 55 4D 50 00
-0D 12 12 12 DA 1D B2 40 10 00 DA 1D 2E 5F BF F0
-F0 FF 00 00 B0 12 2A 40 6E 40 CA 41 88 45 02 42
-34 40 07 00 46 64 94 45 02 42 34 40 10 00 22 41
-02 42 CA 41 02 42 0A 41 34 40 03 00 46 64 EC 41
-A4 64 94 45 94 45 02 42 34 40 10 00 22 41 02 42
-CA 41 02 42 0A 41 34 40 7E 00 38 64 4C 42 2A 64
-48 45 EC 41 C2 64 34 40 10 00 DA 41 8C 64 B4 40
-36 42 FC 40 2A 40 94 61 06 53 45 43 54 5F 44 00
-09 4E 2A 4F B0 12 EA 59 87 12 1C 43 34 40 00 1E
-34 40 00 02 70 64 2A 40 08 5D 07 43 4C 55 53 54
-5F 44 82 4E 24 20 A2 4F 22 20 B0 12 E2 5A 9F 42
-1A 20 00 00 1E 42 1C 20 E3 3F 2E 4A 05 46 41 54
-5F 44 2F 82 8F 4E 02 00 9F 42 08 20 00 00 0E 43
-D7 3F 6A 64 05 44 49 52 5F 44 2F 82 8F 4E 02 00
-92 42 2C 20 22 20 92 42 2E 20 24 20 DE 3F
-@FFB4
-58 4F 58 4F 58 4F 58 4F 58 4F 58 4F 58 4F 58 4F
-58 4F 58 4F 58 4F 58 4F 58 4F 58 4F 58 4F 58 4F
-58 4F 58 4F 58 4F 58 4F 58 4F 58 4F 58 4F 58 4F
-58 4F 58 4F 58 4F 58 4F 58 4F 58 4F E6 44 58 4F
-58 4F 58 4F 58 4F 58 4F 58 4F 58 4F
-q
+++ /dev/null
-@1800
-10 00 5E 44 F4 01 80 04 FD FF 18 00 3A 57 F0 4F
-2A 44 36 44 00 00 00 00
-@1DAA
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00
-@4000
-3A 41 0D 12 0D 4A 30 4D 2F 83 8F 4E 00 00 3E 41
-2E 4E 30 4D 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E
-30 4D 00 00 04 45 58 49 54 00 3D 41 30 4D 00 00
-03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 40
-03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
-44 55 50 00 0E 93 F6 23 30 4D 40 40 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 40 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E 40 02 3E 52 00 0E 12 3E 4F 30 4D 8E 40
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 40
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C 40 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 40 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 41
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 40 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA 40 03 41 4E 44 3E FF 30 4D 7A 40 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E 41 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 41 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E 41 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 41 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 40 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
-3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE 41 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 41 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 41 03 3E 49 4E 85 12 C2 1D 10 41
-04 42 41 53 45 00 85 12 DA 1D C0 40 05 53 54 41
-54 45 85 12 B6 1D 30 42 02 42 4C 00 85 12 20 00
-94 41 02 3C 23 00 B2 40 AA 1D AA 1D 30 4D 1E 15
-0E 43 3D 40 20 00 0A 93 04 20 0D 11 0A 4C 0C 43
-09 43 0E 9B 01 28 0E 8B 09 69 08 68 1D 83 07 30
-0C 5C 0A 6A 0E 6E F5 2B 0E 8B 12 D3 F5 3F 0A 4E
-1D 17 30 41 48 42 01 23 1B 42 DA 1D 2C 4F 0A 4E
-B0 12 5E 42 8F 49 00 00 0E 48 7A 90 0A 00 02 28
-3A 50 07 00 3A 50 30 00 92 83 AA 1D 18 42 AA 1D
-C8 4A 00 00 30 4D 96 42 02 23 53 00 87 12 98 42
-D2 42 2D 83 09 93 E0 23 0E 93 DE 23 3D 41 30 4D
-C8 42 02 23 3E 00 9F 42 AA 1D 00 00 3E 40 AA 1D
-2E 8F 30 4D 00 42 04 48 4F 4C 44 00 0A 4E 3E 4F
-DB 3F 3C 42 04 53 49 47 4E 00 0E 93 3E 4F 3A 40
-2D 00 D2 33 30 4D F4 41 03 55 44 2E 87 12 56 42
-CC 42 E6 42 44 45 0C 45 2A 40 18 43 02 55 2E 00
-2F 83 8F 4E 00 00 0E 43 F1 3F 3E B0 00 80 06 24
-BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D DA 40
-02 44 2E 00 87 12 56 42 6E 40 80 40 3A 43 CC 42
-92 40 0A 43 E6 42 44 45 0C 45 2A 40 52 41 01 2E
-3E B0 00 80 DD 27 2F 83 3E 43 EC 3F F6 42 04 48
-45 52 45 00 2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D
-62 41 05 41 4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D
-E2 42 02 43 2C 00 1A 42 C4 1D CA 4E 00 00 92 53
-C4 1D 3E 4F 30 4D 2F 83 8F 4E 00 00 B0 12 2A 44
-92 B3 DC 05 FD 27 1E 42 CC 05 B0 12 36 44 30 4D
-30 40 B6 43 7E 43 05 28 4B 45 59 29 18 42 CC 05
-EA 3F 12 42 03 4B 45 59 30 40 DC 43 92 43 06 41
-43 43 45 50 54 00 3C 40 96 44 3B 40 66 44 2D 15
-0A 4E 2E 4F 0A 5E 3B 40 0D 00 3C 40 20 00 3D 40
-8A 44 92 B3 DC 05 05 24 18 42 CC 05 38 90 0A 00
-04 20 21 53 39 40 4A 44 4D 15 B2 40 11 00 CE 05
-E2 C2 23 02 30 41 B2 40 13 00 CE 05 E2 D2 23 02
-30 41 00 00 05 53 4C 45 45 50 30 40 58 44 00 00
-07 28 53 4C 45 45 50 29 12 D2 0A 18 F6 3F 21 52
-3A 17 58 42 CC 05 48 9B E6 27 48 9C 06 2C 78 92
-0E 20 2E 9F 0C 24 1E 83 05 3C 0E 9A 03 24 CE 48
-00 00 1E 53 82 48 CE 05 30 4D 8C 44 2D 83 92 B3
-DC 05 FD 27 E6 23 B2 40 18 00 0A 18 3E 8F 3D 41
-30 4D D6 43 06 28 45 4D 49 54 29 00 08 4E 3E 4F
-A2 B3 DC 05 FD 27 E6 3F 50 43 04 45 4D 49 54 00
-30 40 AC 44 BA 44 04 45 43 48 4F 00 B2 40 82 48
-84 44 30 4D 6E 43 06 4E 4F 45 43 48 4F 00 B2 40
-30 4D 84 44 30 4D A4 44 04 28 43 52 29 00 2F 83
-8F 4E 00 00 3E 40 0D 00 E3 3F A2 43 02 43 52 00
-30 40 EE 44 04 43 05 53 50 41 43 45 2F 83 8F 4E
-00 00 3E 40 20 00 D4 3F 06 45 06 53 50 41 43 45
-53 00 0E 93 09 24 0D 12 3D 40 2E 45 EF 3F 30 45
-2D 83 1E 83 EB 23 3D 41 3E 4F 30 4D 2C 43 04 54
-59 50 45 00 0E 93 95 24 2A 4F 8F 5E 00 00 0E 4A
-87 12 CA 41 02 42 0A 41 C0 44 EC 41 54 45 2A 40
-2F 82 8F 4E 02 00 7E 4D 8F 4D 00 00 0D 5E 1D B3
-0D 63 30 4D 1A 45 82 53 22 00 87 12 34 40 60 45
-96 47 34 40 22 00 BA 45 8A 45 3D 41 6E 4E 1E 83
-82 5E C4 1D 3E 4F 92 B3 C4 1D A2 63 C4 1D 30 4D
-D6 44 82 2E 22 00 87 12 7A 45 34 40 44 45 96 47
-2A 40 00 00 04 57 4F 52 44 00 3C 40 BE 1D 39 4C
-3A 4C 09 5A 3A 5C 28 4C 09 9A 19 24 7E 9A FC 27
-1A 83 3B 40 60 00 C8 4C 00 00 09 9A 0C 24 7C 4A
-4E 9C 09 24 18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F
-7C 80 20 00 F0 3F 1A 82 C0 1D 82 4A C2 1D 1E 42
-C4 1D 08 8E CE 48 00 00 30 4D 00 00 04 46 49 4E
-44 00 2F 83 0C 4E 65 4C 74 40 80 00 3B 40 CA 1D
-3E 4B 0E 93 1E 24 58 4C 01 00 78 F0 1E 00 0E 58
-2E 53 1E 4E FE FF 0E 93 F3 27 09 4E 78 49 48 C4
-48 95 F7 23 0A 4C 1A 53 FA 99 00 00 F2 23 58 83
-FA 23 19 B3 09 63 0C 49 6A 4E 1E 43 4A 93 01 30
-2E 83 8F 4C 00 00 35 40 08 40 34 40 14 40 30 4D
-2F 53 2F 53 3E 4F 30 4D 26 42 07 3E 4E 55 4D 42
-45 52 3C 4F 38 4F 29 4F 2F 82 1B 42 DA 1D 6A 4C
-7A 80 30 00 7A 90 0A 00 02 28 7A 80 07 00 0A 9B
-13 2C 82 49 D0 04 82 48 D2 04 82 4B C8 04 19 42
-E4 04 18 42 E6 04 09 5A 08 63 1C 53 1E 83 E7 23
-8F 49 04 00 8F 48 02 00 8F 4C 00 00 30 4D 03 12
-0D 12 1B 42 DA 1D 0B 12 32 C0 00 02 6D 4E 0D 5E
-0C 4E 7A 40 2E 00 0D 9C 0A 28 7A 9C FC 23 32 D0
-00 02 FC 4C FE FF 0D 9C FC 2F DE 83 00 00 09 43
-08 43 3D 40 44 47 3F 82 8F 4E 06 00 0C 4E 7E 4C
-6A 4C 7A 90 2D 00 10 2C 3B 40 10 00 7A 80 24 00
-06 24 2B 43 5A 83 03 24 3B 52 6A 53 B0 23 1C 53
-1E 83 6A 4C 7A 90 2D 00 AA 23 1C 53 1E 83 B1 43
-04 00 A5 3F 46 47 2F 53 0E 93 2C 17 82 4C DA 1D
-03 24 2F 52 0E F3 30 4D 9F 4F 02 00 04 00 BF 4F
-00 00 3E E3 09 20 3E E3 BF E3 02 00 BF E3 00 00
-9F 53 02 00 8F 63 00 00 32 B0 00 02 01 20 2F 53
-30 4D C6 44 07 45 58 45 43 55 54 45 0A 4E 3E 4F
-00 4A 28 41 01 2C 1A 42 C4 1D A2 53 C4 1D 8A 4E
-00 00 3E 4F 30 4D 94 47 87 4C 49 54 45 52 41 4C
-82 93 B6 1D 16 24 32 B0 00 02 09 24 1A 42 C4 1D
-A2 52 C4 1D BA 40 34 40 00 00 BA 4F 02 00 1A 42
-C4 1D A2 52 C4 1D BA 40 34 40 00 00 8A 4E 02 00
-3E 4F 30 4D FC 44 05 43 4F 55 4E 54 2F 83 1E 53
-8F 4E 00 00 5E 4E FF FF 30 4D 82 4E BE 1D B2 4F
-C0 1D 3E 4F 82 43 C2 1D 87 12 4C 42 BA 45 10 48
-3D 40 1C 48 FE 22 3D 41 3E 4F 30 4D 1E 48 0A 4E
-3E 4F 3D 40 34 48 53 27 3D 40 0A 48 1A E2 B6 1D
-B2 27 AC 23 36 48 3E 4F 3D 40 0A 48 B9 23 DE 53
-00 00 68 4E 08 5E F8 40 3F 00 00 00 3D 40 00 4A
-CD 3F 84 47 08 45 56 41 4C 55 41 54 45 00 39 40
-BE 1D 39 12 39 12 39 12 0D 12 B0 12 2A 40 FA 47
-72 48 3D 41 B2 41 C2 1D B2 41 C0 1D B2 41 BE 1D
-30 4D 7A 41 04 51 55 49 54 00 31 40 E0 1C B2 40
-00 1C 00 1C 82 43 B6 1D 82 43 08 18 B0 12 2A 40
-60 45 04 0D 6F 6B 20 00 44 45 34 40 38 1D 44 40
-34 40 50 00 F6 43 0C 45 FA 47 34 40 7E 1C CE 40
-B2 41 60 45 0D 73 74 61 63 6B 20 65 6D 70 74 79
-20 21 0E 49 34 40 30 FF 84 43 B2 41 60 45 0B 46
-52 41 4D 20 66 75 6C 6C 20 21 0E 49 42 42 F4 40
-C0 41 A0 48 60 45 04 0D 20 20 20 00 BC 41 A8 48
-EE 43 05 41 42 4F 52 54 3F 40 80 1C BE 3F 8F 93
-02 00 AE 26 B2 40 82 48 84 44 B0 12 00 4E 82 43
-B4 56 82 43 C0 56 82 43 CC 56 82 43 FC 56 82 43
-08 57 82 43 14 57 A2 B3 DC 05 FD 27 B2 40 11 00
-CE 05 E2 C2 23 02 92 C3 DC 05 38 40 55 05 39 42
-19 83 FE 23 18 83 FB 23 92 B3 DC 05 F4 23 87 12
-60 45 04 1B 5B 37 6D 00 44 45 44 45 60 45 04 1B
-5B 30 6D 00 44 45 42 4D 84 4D 8A 4D 08 49 02 49
-86 41 42 4F 52 54 22 00 87 12 7A 45 34 40 0E 49
-96 47 2A 40 0C 46 01 27 87 12 4C 42 BA 45 12 46
-C0 41 A6 49 2A 40 3E 48 52 42 81 5C 92 42 BE 1D
-C2 1D 30 4D 87 12 96 45 4C 42 BA 45 BE 49 08 4E
-7A 4E 5A D3 5A 53 0A 58 19 42 C8 1D 6E 4E 3E F0
-1E 00 09 5E 82 48 AE 1D 82 49 B0 1D 82 4A B2 1D
-2A 52 82 4A C4 1D 3E 4F 3D 41 30 41 87 12 60 45
-0F 73 74 61 63 6B 20 6D 69 73 6D 61 74 63 68 21
-14 49 82 9F B4 1D F2 23 18 42 AE 1D 19 42 B0 1D
-A8 49 FE FF 89 48 00 00 30 4D B4 45 08 56 41 52
-49 41 42 4C 45 00 B0 12 B4 49 BA 40 86 12 FC FF
-EF 3F E6 47 08 43 4F 4E 53 54 41 4E 54 00 B0 12
-B4 49 BA 40 85 12 FC FF 8A 4E FE FF 3E 4F E0 3F
-34 4A 06 43 52 45 41 54 45 00 B0 12 B4 49 BA 40
-85 12 FC FF 8A 4A FE FF D3 3F 54 48 05 44 4F 45
-53 3E 1A 42 B2 1D BA 40 84 12 00 00 8A 4D 02 00
-3D 41 30 4D 6C 4A 05 44 45 46 45 52 B0 12 B4 49
-BA 40 30 40 FC FF BA 40 82 4A FE FF B9 3F 00 00
-81 5B 82 43 B6 1D 30 4D AA 49 01 5D B2 43 B6 1D
-30 4D 76 45 87 52 45 43 55 52 53 45 19 42 C4 1D
-99 42 B2 1D 00 00 A2 53 C4 1D 30 4D A0 4A 01 3A
-B0 12 B4 49 BA 40 87 12 FC FF A2 83 C4 1D B2 43
-B6 1D 82 4F B4 1D 30 4D CE 4A 81 3B 82 93 B6 1D
-5D 27 87 12 34 40 2A 40 96 47 02 4A A2 4A 2A 40
-E8 44 09 49 4D 4D 45 44 49 41 54 45 1A 42 AE 1D
-FA D0 80 00 00 00 30 4D BE 4F 02 00 3E 4F 30 4D
-02 4B 82 49 53 00 87 12 42 42 F4 40 C0 41 3A 4B
-46 4B 34 40 18 4B 96 47 2A 40 98 49 18 4B 2A 40
-EA 4A 83 5B 27 5D 87 12 98 49 34 40 34 40 96 47
-96 47 2A 40 84 48 88 50 4F 53 54 50 4F 4E 45 00
-87 12 4C 42 BA 45 12 46 54 40 C0 41 A6 49 7E 41
-C0 41 80 4B 34 40 34 40 96 47 96 47 34 40 96 47
-96 47 2A 40 86 4B 3A 4E 82 4A C6 1D 2E 4E 82 4E
-C4 1D 3D 40 10 00 09 4A 08 49 29 83 18 48 FE FF
-0E 98 FC 2B 89 48 00 00 1D 83 F6 23 2A 4A 0A 93
-F0 23 3E 4F 3D 41 30 4D 22 4B 82 49 46 00 2F 83
-8F 4E 00 00 1E 42 C4 1D BE 40 C0 41 00 00 A2 52
-C4 1D 2E 53 30 4D 86 4A 84 45 4C 53 45 00 1A 42
-C4 1D BA 40 BC 41 00 00 2A 52 82 4A C4 1D 8E 4A
-00 00 2A 83 0E 4A 30 4D 3E 45 84 54 48 45 4E 00
-9E 42 C4 1D 00 00 3E 4F 30 4D 52 4A 85 42 45 47
-49 4E 30 40 84 43 FA 4B 85 55 4E 54 49 4C 39 40
-C0 41 1A 42 C4 1D A2 52 C4 1D 8A 49 00 00 8A 4E
-02 00 3E 4F 30 4D 80 49 85 41 47 41 49 4E 39 40
-BC 41 EF 3F 1C 4A 85 57 48 49 4C 45 87 12 BE 4B
-6E 40 2A 40 B4 4A 86 52 45 50 45 41 54 00 87 12
-3E 4C 00 4C 2A 40 D8 4B 82 44 4F 00 2F 83 8F 4E
-00 00 1E 42 C4 1D BE 40 CA 41 00 00 2E 53 82 4E
-C4 1D A2 53 00 1C 1A 42 00 1C 8A 43 00 00 30 4D
-A8 47 84 4C 4F 4F 50 00 39 40 EC 41 1A 42 C4 1D
-A2 52 C4 1D 8A 49 00 00 8A 4E 02 00 1E 42 00 1C
-A2 83 00 1C 2E 4E 0E 93 04 24 9E 42 C4 1D 00 00
-F5 3F 3E 4F 30 4D E4 43 85 2B 4C 4F 4F 50 39 40
-DA 41 E4 3F 92 4C 85 4C 45 41 56 45 1A 42 C4 1D
-BA 40 FC 41 00 00 BA 40 BC 41 02 00 B2 50 06 00
-C4 1D A2 53 00 1C 2A 52 19 42 00 1C 89 4A 00 00
-30 4D D6 4C 04 4D 4F 56 45 00 0A 4E 38 4F 39 4F
-3E 4F 0A 93 11 24 08 99 0F 24 06 2C F8 49 00 00
-18 53 1A 83 FB 23 30 4D 08 5A 09 5A 19 83 18 83
-E8 49 00 00 1A 83 FA 23 30 4D 34 40 CA 1D FC 40
-2A 40 84 12 3A 4D 36 50 0C 50 68 4C 96 49 F4 4F
-C8 4C 04 4D A2 45 A8 4D DC 4D 18 4C A2 4E 48 41
-42 4B AA 4A 7A 46 00 00 3A 40 0C 00 39 40 CA 1D
-38 40 CC 1D D9 3F 3A 40 0E 00 39 40 CC 1D 38 40
-CA 1D CC 3F 82 43 CC 1D 30 4D 92 42 CA 1D C8 1D
-30 4D 56 4B 09 50 57 52 5F 53 54 41 54 45 84 12
-84 4B F0 4F 3A 57 94 4D 08 50 57 52 5F 48 45 52
-45 00 92 42 C4 1D A4 4D 92 42 C6 1D A2 4D EF 3F
-56 4C 09 52 53 54 5F 53 54 41 54 45 92 42 0C 18
-A4 4D 92 42 0E 18 A2 4D E2 3F C2 4D 08 52 53 54
-5F 48 45 52 45 00 92 42 C4 1D 0C 18 92 42 C6 1D
-0E 18 DF 3F B2 40 48 4E AA 4E B2 40 58 44 4C 44
-B2 40 AC 44 C2 44 B2 40 EE 44 02 45 B2 40 DC 43
-EA 43 30 41 46 4C 04 57 49 50 45 00 39 40 80 FF
-B9 43 00 00 29 53 39 90 B4 FF FA 23 B0 12 F4 4D
-B2 40 3A 57 C4 1D B2 40 F0 4F C6 1D D4 3F BA 4B
-06 28 57 41 52 4D 29 00 1E 42 08 18 87 12 60 45
-05 0D 1B 5B 37 6D 44 45 70 43 60 45 27 20 46 61
-73 74 46 6F 72 74 68 20 56 31 36 30 20 2E 35 4D
-48 7A 20 28 43 29 20 4A 2E 4D 2E 54 68 6F 6F 72
-65 6E 73 20 44 45 34 40 30 FF 84 43 2A 41 30 43
-60 45 0B 62 79 74 65 73 20 66 72 65 65 20 1A 49
-16 4E 04 57 41 52 4D 00 30 40 48 4E 0C 4C 04 43
-4F 4C 44 00 B2 40 04 A5 20 01 B2 40 88 5A 5C 01
-B2 D0 03 00 04 02 B2 40 FC FF 02 02 B2 C0 03 00
-06 02 B2 D0 00 04 24 02 B2 D3 26 02 B2 43 22 02
-B2 43 42 02 B2 D3 46 02 B2 43 62 02 B2 D3 66 02
-F2 43 26 03 F2 D3 22 03 F2 40 A5 00 61 01 82 43
-62 01 B2 40 11 01 66 01 29 42 B2 40 33 00 64 01
-D2 43 61 01 92 D2 9E 01 08 18 A2 93 08 18 01 24
-59 07 38 40 C2 A2 18 83 FE 23 19 83 FA 23 B2 42
-B0 01 F2 D0 10 00 2A 03 F2 C0 40 00 A2 04 3A 40
-BA 4E 39 40 B4 FF 89 4A 00 00 29 53 FC 23 92 42
-02 18 F0 FF B2 40 18 00 0A 18 31 40 E0 1C 3F 40
-80 1C 37 40 00 40 36 40 B4 40 35 40 08 40 34 40
-14 40 B2 40 0A 00 DA 1D B2 43 AC 1D 92 C3 30 01
-18 42 08 18 D2 B3 01 02 04 20 38 E3 18 53 82 48
-08 18 B2 40 81 00 C0 05 A2 42 C6 05 B2 40 00 49
-C8 05 F2 D0 03 00 0D 02 92 C3 C0 05 92 D3 DA 05
-3D 40 CA 4F 18 42 08 18 38 90 0A 00 2F 27 38 90
-16 00 2C 2F 28 93 02 23 EA 26 A8 4E 84 12 3A 4D
-18 56 C4 56 CC 55 18 57 92 55 4C 56 96 52 00 00
-88 55 38 56 EA 55 28 56 A6 53 00 00 00 00 2A 57
-66 4D 40 4E 85 48 49 32 4C 4F 87 12 84 43 D2 4B
-96 47 A2 4A 68 4D CC 4F 2A 40 AE 4E 04 43 4F 44
-45 00 B0 12 B4 49 A2 82 C4 1D 87 12 E2 4A BC 41
-04 50 00 00 07 45 4E 44 43 4F 44 45 87 12 76 4D
-02 4A 2A 40 38 4C 03 41 53 4D 92 42 C8 1D B8 1D
-B2 40 D0 4F C8 1D E5 3F 24 50 06 45 4E 44 41 53
-4D 00 92 42 B8 1D C8 1D E9 3F 00 00 05 43 4F 4C
-4F 4E 1A 42 C4 1D BA 40 87 12 00 00 A2 53 C4 1D
-B2 43 B6 1D 30 40 76 4D 00 00 05 4C 4F 32 48 49
-1A 42 C4 1D BA 40 B0 12 00 00 BA 40 2A 40 02 00
-A2 52 C4 1D ED 3F 38 40 BE 1D 39 48 2A 48 09 5A
-1A 52 C2 1D 09 9A 03 24 7E 9A FC 27 1A 83 0E 4A
-2A 88 82 4A C2 1D 30 4D B0 12 2A 40 BA 45 12 46
-72 41 C0 41 CE 50 CE 46 C0 41 A6 49 F0 50 D0 50
-29 4E 39 90 86 12 02 20 2E 53 30 41 39 90 85 12
-03 20 1E 4E 02 00 30 41 39 90 84 12 01 20 2E 52
-30 41 19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 40
-29 00 12 12 C2 1D 92 53 C2 1D B0 12 2A 40 BA 45
-CE 46 C0 41 22 51 18 51 21 53 3E 90 10 00 BB 2D
-30 41 24 51 B2 41 C2 1D 22 D3 30 41 87 12 4C 42
-96 50 34 51 82 43 BC 1D 92 42 C4 1D BA 1D A2 53
-C4 1D 0A 4E 3E 4F FA 90 23 00 00 00 34 20 92 53
-C2 1D B0 12 B8 50 0E 93 04 20 B2 40 00 03 BC 1D
-27 3C 1E 93 04 20 B2 40 10 03 BC 1D 21 3C 2E 93
-04 20 B2 40 20 03 BC 1D 1B 3C 2E 92 04 20 B2 40
-20 02 BC 1D 15 3C 3E 92 04 20 B2 40 30 02 BC 1D
-0F 3C 3E 93 04 20 B2 40 30 03 BC 1D 09 3C B2 40
-30 00 BC 1D 19 42 C4 1D A2 53 C4 1D 89 4E 00 00
-3E 4F 3D 41 30 4D FA 90 26 00 00 00 08 20 B2 40
-10 02 BC 1D 92 53 C2 1D 30 12 A4 51 75 3F FA 90
-40 00 00 00 1A 20 B2 40 20 00 BC 1D 92 53 C2 1D
-B0 12 02 51 0E 20 B2 50 10 00 BC 1D 3E 40 2B 00
-B0 12 02 51 32 24 92 92 BE 1D C2 1D 02 24 92 53
-C2 1D 8E 10 82 5E BC 1D D3 3F B0 12 02 51 F9 23
-B2 50 10 00 BC 1D 3E 40 28 00 B0 12 B8 50 30 12
-F4 51 67 3F 87 12 4C 42 96 50 2C 52 FE 90 26 00
-00 00 3E 40 20 00 04 20 B2 50 82 00 BC 1D C2 3F
-B0 12 02 51 DF 23 B2 50 80 00 BC 1D 3E 40 28 00
-B0 12 B8 50 B0 12 F2 50 D5 23 3D 40 A6 49 30 4D
-44 44 04 52 45 54 49 00 87 12 34 40 00 13 96 47
-2A 40 34 40 2C 00 2C 51 24 52 7C 52 2E 4E 1E D2
-BC 1D 19 42 BA 1D 92 3F 7A 50 03 4D 4F 56 84 12
-72 52 00 40 8A 52 05 4D 4F 56 2E 42 84 12 72 52
-40 40 00 00 03 41 44 44 84 12 72 52 00 50 A4 52
-05 41 44 44 2E 42 84 12 72 52 40 50 B0 52 04 41
-44 44 43 00 84 12 72 52 00 60 BE 52 06 41 44 44
-43 2E 42 00 84 12 72 52 40 60 62 52 04 53 55 42
-43 00 84 12 72 52 00 70 DC 52 06 53 55 42 43 2E
-42 00 84 12 72 52 40 70 EA 52 03 53 55 42 84 12
-72 52 00 80 FA 52 05 53 55 42 2E 42 84 12 72 52
-40 80 5C 50 03 43 4D 50 84 12 72 52 00 90 14 53
-05 43 4D 50 2E 42 84 12 72 52 40 90 4A 50 04 44
-41 44 44 00 84 12 72 52 00 A0 2E 53 06 44 41 44
-44 2E 42 00 84 12 72 52 40 A0 20 53 03 42 49 54
-84 12 72 52 00 B0 4C 53 05 42 49 54 2E 42 84 12
-72 52 40 B0 58 53 03 42 49 43 84 12 72 52 00 C0
-66 53 05 42 49 43 2E 42 84 12 72 52 40 C0 72 53
-03 42 49 53 84 12 72 52 00 D0 80 53 05 42 49 53
-2E 42 84 12 72 52 40 D0 00 00 03 58 4F 52 84 12
-72 52 00 E0 9A 53 05 58 4F 52 2E 42 84 12 72 52
-40 E0 CC 52 03 41 4E 44 84 12 72 52 00 F0 B4 53
-05 41 4E 44 2E 42 84 12 72 52 40 F0 4C 42 2C 51
-D2 53 1A 42 BC 1D B2 F0 70 00 BC 1D 8A 10 3A F0
-0F 00 82 DA BC 1D 4A 3F 06 53 03 52 52 43 84 12
-CC 53 00 10 EA 53 05 52 52 43 2E 42 84 12 CC 53
-40 10 F6 53 04 53 57 50 42 00 84 12 CC 53 80 10
-04 54 03 52 52 41 84 12 CC 53 00 11 12 54 05 52
-52 41 2E 42 84 12 CC 53 40 11 1E 54 03 53 58 54
-84 12 CC 53 80 11 00 00 04 50 55 53 48 00 84 12
-CC 53 00 12 38 54 06 50 55 53 48 2E 42 00 84 12
-CC 53 40 12 8C 53 04 43 41 4C 4C 00 84 12 CC 53
-80 12 34 40 2C 00 2C 51 24 52 6C 54 59 42 BC 1D
-5A 42 BD 1D 82 4A BC 1D BE 90 00 15 00 00 02 20
-0A 89 02 3C 09 8A 0A 49 3A 90 10 00 03 2C 5A 0E
-A8 3F 1A 53 0E 4A 87 12 70 43 60 45 0D 6F 75 74
-20 6F 66 20 62 6F 75 6E 64 73 14 49 46 54 05 50
-55 53 48 4D 84 12 62 54 00 15 AE 54 04 50 4F 50
-4D 00 84 12 62 54 00 17 4C 42 96 50 CE 54 82 43
-BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D 92 53 C2 1D
-3E 40 2C 00 B0 12 2A 40 BA 45 CE 46 C0 41 A6 49
-24 52 F4 54 0A 4E 3E 4F 1A 83 2A 92 CA 2F 8A 10
-5A 06 6F 3F 2C 54 04 52 52 43 4D 00 84 12 C8 54
-50 00 06 55 04 52 52 41 4D 00 84 12 C8 54 50 01
-14 55 04 52 4C 41 4D 00 84 12 C8 54 50 02 22 55
-04 52 52 55 4D 00 84 12 C8 54 50 03 85 12 00 3C
-30 55 03 53 3E 3D 85 12 00 38 42 55 02 53 3C 00
-85 12 00 34 BC 54 03 30 3E 3D 85 12 00 30 56 55
-02 30 3C 00 85 12 00 30 00 00 02 55 3C 00 85 12
-00 2C 6A 55 03 55 3E 3D 85 12 00 28 60 55 03 30
-3C 3E 85 12 00 24 7E 55 02 30 3D 00 85 12 00 20
-50 44 02 49 46 00 1A 42 C4 1D 8A 4E 00 00 A2 53
-C4 1D 0E 4A 30 4D 74 55 04 54 48 45 4E 00 1A 42
-C4 1D 08 4E 3E 4F 09 48 29 53 0A 89 0A 11 3A 90
-00 02 68 2F 88 DA 00 00 30 4D 3C 53 04 45 4C 53
-45 00 1A 42 C4 1D BA 40 00 3C 00 00 A2 53 C4 1D
-2F 83 8F 4A 00 00 E3 3F A8 55 05 55 4E 54 49 4C
-3A 4F 08 4E 3E 4F 19 42 C4 1D 2A 83 0A 89 0A 11
-3A 90 00 FE 47 3B 3A F0 FF 03 08 DA 89 48 00 00
-A2 53 C4 1D 30 4D C0 53 05 41 47 41 49 4E 87 12
-3C 55 F0 55 2A 40 00 00 05 57 48 49 4C 45 87 12
-96 55 6E 40 2A 40 4C 55 06 52 45 50 45 41 54 00
-87 12 3C 55 F0 55 AE 55 2A 40 00 00 03 4A 4D 50
-87 12 98 49 3C 55 F0 55 2A 40 3E B0 00 10 03 20
-3E E0 00 04 30 4D 3E 90 00 34 06 28 03 24 3E 40
-00 34 30 4D 3E 40 00 38 30 4D 00 00 04 3F 4A 4D
-50 00 87 12 5A 56 98 49 6E 40 F0 55 2A 40 90 56
-3D 41 08 4E 3E 4F 2A 48 0A 93 04 20 98 42 C4 1D
-00 00 30 4D 88 43 00 00 A4 3F 56 54 03 42 57 31
-84 12 8E 56 00 00 AC 56 03 42 57 32 84 12 8E 56
-00 00 B8 56 03 42 57 33 84 12 8E 56 00 00 D0 56
-3D 41 1A 42 C4 1D 28 4E 08 93 08 20 BA 4F 00 00
-A2 53 C4 1D 8E 4A 00 00 3E 4F 30 4D 8E 43 00 00
-61 3F 00 00 03 46 57 31 84 12 CE 56 00 00 F4 56
-03 46 57 32 84 12 CE 56 00 00 00 57 03 46 57 33
-84 12 CE 56 00 00 0C 57 04 47 4F 54 4F 00 87 12
-3C 55 98 49 8C 47 2A 40 7C 56 05 3F 47 4F 54 4F
-87 12 5A 56 98 49 8C 47 2A 40
-@FFB4
-BA 4E BA 4E BA 4E BA 4E BA 4E BA 4E BA 4E BA 4E
-BA 4E BA 4E BA 4E BA 4E BA 4E BA 4E BA 4E BA 4E
-BA 4E BA 4E BA 4E BA 4E BA 4E BA 4E BA 4E BA 4E
-BA 4E BA 4E BA 4E BA 4E BA 4E BA 4E 5E 44 BA 4E
-BA 4E BA 4E BA 4E BA 4E BA 4E BA 4E
-q
+++ /dev/null
-@1800
-10 00 6A 44 80 3E 00 24 FD FF 18 00 5A 57 10 50
-2A 44 3C 44 00 00 00 00
-@1DAA
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00
-@4000
-3A 41 0D 12 0D 4A 30 4D 2F 83 8F 4E 00 00 3E 41
-2E 4E 30 4D 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E
-30 4D 00 00 04 45 58 49 54 00 3D 41 30 4D 00 00
-03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 40
-03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
-44 55 50 00 0E 93 F6 23 30 4D 40 40 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 40 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E 40 02 3E 52 00 0E 12 3E 4F 30 4D 8E 40
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 40
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C 40 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 40 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 41
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 40 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA 40 03 41 4E 44 3E FF 30 4D 7A 40 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E 41 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 41 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E 41 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 41 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 40 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
-3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE 41 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 41 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 41 03 3E 49 4E 85 12 C2 1D 10 41
-04 42 41 53 45 00 85 12 DA 1D C0 40 05 53 54 41
-54 45 85 12 B6 1D 30 42 02 42 4C 00 85 12 20 00
-94 41 02 3C 23 00 B2 40 AA 1D AA 1D 30 4D 1E 15
-0E 43 3D 40 20 00 0A 93 04 20 0D 11 0A 4C 0C 43
-09 43 0E 9B 01 28 0E 8B 09 69 08 68 1D 83 07 30
-0C 5C 0A 6A 0E 6E F5 2B 0E 8B 12 D3 F5 3F 0A 4E
-1D 17 30 41 48 42 01 23 1B 42 DA 1D 2C 4F 0A 4E
-B0 12 5E 42 8F 49 00 00 0E 48 7A 90 0A 00 02 28
-3A 50 07 00 3A 50 30 00 92 83 AA 1D 18 42 AA 1D
-C8 4A 00 00 30 4D 96 42 02 23 53 00 87 12 98 42
-D2 42 2D 83 09 93 E0 23 0E 93 DE 23 3D 41 30 4D
-C8 42 02 23 3E 00 9F 42 AA 1D 00 00 3E 40 AA 1D
-2E 8F 30 4D 00 42 04 48 4F 4C 44 00 0A 4E 3E 4F
-DB 3F 3C 42 04 53 49 47 4E 00 0E 93 3E 4F 3A 40
-2D 00 D2 33 30 4D F4 41 03 55 44 2E 87 12 56 42
-CC 42 E6 42 50 45 18 45 2A 40 18 43 02 55 2E 00
-2F 83 8F 4E 00 00 0E 43 F1 3F 3E B0 00 80 06 24
-BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D DA 40
-02 44 2E 00 87 12 56 42 6E 40 80 40 3A 43 CC 42
-92 40 0A 43 E6 42 50 45 18 45 2A 40 52 41 01 2E
-3E B0 00 80 DD 27 2F 83 3E 43 EC 3F F6 42 04 48
-45 52 45 00 2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D
-62 41 05 41 4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D
-E2 42 02 43 2C 00 1A 42 C4 1D CA 4E 00 00 92 53
-C4 1D 3E 4F 30 4D 2F 83 8F 4E 00 00 B0 12 2A 44
-92 B3 DC 05 FD 27 1E 42 CC 05 B0 12 3C 44 30 4D
-30 40 B6 43 7E 43 05 28 4B 45 59 29 18 42 CC 05
-EA 3F 12 42 03 4B 45 59 30 40 DC 43 92 43 06 41
-43 43 45 50 54 00 3C 40 A8 44 3B 40 72 44 2D 15
-0A 4E 2E 4F 0A 5E 3B 40 0D 00 3C 40 20 00 3D 40
-9C 44 92 B3 DC 05 05 24 18 42 CC 05 38 90 0A 00
-04 20 21 53 39 40 56 44 4D 15 B2 40 11 00 CE 05
-A2 B3 DC 05 FD 27 E2 C2 23 02 30 41 B2 40 13 00
-CE 05 A2 B3 DC 05 FD 27 E2 D2 23 02 30 41 00 00
-05 53 4C 45 45 50 30 40 64 44 00 00 07 28 53 4C
-45 45 50 29 12 D2 0A 18 F6 3F 21 52 3A 17 58 42
-CC 05 48 9B E3 27 48 9C 06 2C 78 92 11 20 2E 9F
-0F 24 1E 83 05 3C 0E 9A 03 24 CE 48 00 00 1E 53
-82 48 CE 05 A2 B3 DC 05 FD 27 30 4D 9E 44 2D 83
-92 B3 DC 05 FD 27 E3 23 B2 40 18 00 0A 18 3E 8F
-3D 41 30 4D D6 43 06 28 45 4D 49 54 29 00 08 4E
-3E 4F E6 3F 50 43 04 45 4D 49 54 00 30 40 BE 44
-C6 44 04 45 43 48 4F 00 B2 40 82 48 90 44 30 4D
-6E 43 06 4E 4F 45 43 48 4F 00 B2 40 30 4D 90 44
-30 4D B6 44 04 28 43 52 29 00 2F 83 8F 4E 00 00
-3E 40 0D 00 E3 3F A2 43 02 43 52 00 30 40 FA 44
-04 43 05 53 50 41 43 45 2F 83 8F 4E 00 00 3E 40
-20 00 D4 3F 12 45 06 53 50 41 43 45 53 00 0E 93
-09 24 0D 12 3D 40 3A 45 EF 3F 3C 45 2D 83 1E 83
-EB 23 3D 41 3E 4F 30 4D 2C 43 04 54 59 50 45 00
-0E 93 95 24 2A 4F 8F 5E 00 00 0E 4A 87 12 CA 41
-02 42 0A 41 CC 44 EC 41 60 45 2A 40 2F 82 8F 4E
-02 00 7E 4D 8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D
-26 45 82 53 22 00 87 12 34 40 6C 45 A2 47 34 40
-22 00 C6 45 96 45 3D 41 6E 4E 1E 83 82 5E C4 1D
-3E 4F 92 B3 C4 1D A2 63 C4 1D 30 4D E2 44 82 2E
-22 00 87 12 86 45 34 40 50 45 A2 47 2A 40 00 00
-04 57 4F 52 44 00 3C 40 BE 1D 39 4C 3A 4C 09 5A
-3A 5C 28 4C 09 9A 19 24 7E 9A FC 27 1A 83 3B 40
-60 00 C8 4C 00 00 09 9A 0C 24 7C 4A 4E 9C 09 24
-18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F 7C 80 20 00
-F0 3F 1A 82 C0 1D 82 4A C2 1D 1E 42 C4 1D 08 8E
-CE 48 00 00 30 4D 00 00 04 46 49 4E 44 00 2F 83
-0C 4E 65 4C 74 40 80 00 3B 40 CA 1D 3E 4B 0E 93
-1E 24 58 4C 01 00 78 F0 1E 00 0E 58 2E 53 1E 4E
-FE FF 0E 93 F3 27 09 4E 78 49 48 C4 48 95 F7 23
-0A 4C 1A 53 FA 99 00 00 F2 23 58 83 FA 23 19 B3
-09 63 0C 49 6A 4E 1E 43 4A 93 01 30 2E 83 8F 4C
-00 00 35 40 08 40 34 40 14 40 30 4D 2F 53 2F 53
-3E 4F 30 4D 26 42 07 3E 4E 55 4D 42 45 52 3C 4F
-38 4F 29 4F 2F 82 1B 42 DA 1D 6A 4C 7A 80 30 00
-7A 90 0A 00 02 28 7A 80 07 00 0A 9B 13 2C 82 49
-D0 04 82 48 D2 04 82 4B C8 04 19 42 E4 04 18 42
-E6 04 09 5A 08 63 1C 53 1E 83 E7 23 8F 49 04 00
-8F 48 02 00 8F 4C 00 00 30 4D 03 12 0D 12 1B 42
-DA 1D 0B 12 32 C0 00 02 6D 4E 0D 5E 0C 4E 7A 40
-2E 00 0D 9C 0A 28 7A 9C FC 23 32 D0 00 02 FC 4C
-FE FF 0D 9C FC 2F DE 83 00 00 09 43 08 43 3D 40
-50 47 3F 82 8F 4E 06 00 0C 4E 7E 4C 6A 4C 7A 90
-2D 00 10 2C 3B 40 10 00 7A 80 24 00 06 24 2B 43
-5A 83 03 24 3B 52 6A 53 B0 23 1C 53 1E 83 6A 4C
-7A 90 2D 00 AA 23 1C 53 1E 83 B1 43 04 00 A5 3F
-52 47 2F 53 0E 93 2C 17 82 4C DA 1D 03 24 2F 52
-0E F3 30 4D 9F 4F 02 00 04 00 BF 4F 00 00 3E E3
-09 20 3E E3 BF E3 02 00 BF E3 00 00 9F 53 02 00
-8F 63 00 00 32 B0 00 02 01 20 2F 53 30 4D D2 44
-07 45 58 45 43 55 54 45 0A 4E 3E 4F 00 4A 28 41
-01 2C 1A 42 C4 1D A2 53 C4 1D 8A 4E 00 00 3E 4F
-30 4D A0 47 87 4C 49 54 45 52 41 4C 82 93 B6 1D
-16 24 32 B0 00 02 09 24 1A 42 C4 1D A2 52 C4 1D
-BA 40 34 40 00 00 BA 4F 02 00 1A 42 C4 1D A2 52
-C4 1D BA 40 34 40 00 00 8A 4E 02 00 3E 4F 30 4D
-08 45 05 43 4F 55 4E 54 2F 83 1E 53 8F 4E 00 00
-5E 4E FF FF 30 4D 82 4E BE 1D B2 4F C0 1D 3E 4F
-82 43 C2 1D 87 12 4C 42 C6 45 1C 48 3D 40 28 48
-FE 22 3D 41 3E 4F 30 4D 2A 48 0A 4E 3E 4F 3D 40
-40 48 53 27 3D 40 16 48 1A E2 B6 1D B2 27 AC 23
-42 48 3E 4F 3D 40 16 48 B9 23 DE 53 00 00 68 4E
-08 5E F8 40 3F 00 00 00 3D 40 0C 4A CD 3F 90 47
-08 45 56 41 4C 55 41 54 45 00 39 40 BE 1D 39 12
-39 12 39 12 0D 12 B0 12 2A 40 06 48 7E 48 3D 41
-B2 41 C2 1D B2 41 C0 1D B2 41 BE 1D 30 4D 7A 41
-04 51 55 49 54 00 31 40 E0 1C B2 40 00 1C 00 1C
-82 43 B6 1D 82 43 08 18 B0 12 2A 40 6C 45 04 0D
-6F 6B 20 00 50 45 34 40 38 1D 44 40 34 40 50 00
-F6 43 18 45 06 48 34 40 7E 1C CE 40 B2 41 6C 45
-0D 73 74 61 63 6B 20 65 6D 70 74 79 20 21 1A 49
-34 40 30 FF 84 43 B2 41 6C 45 0B 46 52 41 4D 20
-66 75 6C 6C 20 21 1A 49 42 42 F4 40 C0 41 AC 48
-6C 45 04 0D 20 20 20 00 BC 41 B4 48 EE 43 05 41
-42 4F 52 54 3F 40 80 1C BE 3F 8F 93 02 00 AE 26
-B2 40 82 48 90 44 B0 12 0C 4E 82 43 D4 56 82 43
-E0 56 82 43 EC 56 82 43 1C 57 82 43 28 57 82 43
-34 57 A2 B3 DC 05 FD 27 B2 40 11 00 CE 05 E2 C2
-23 02 92 C3 DC 05 38 40 A0 AA 39 42 19 83 FE 23
-18 83 FB 23 92 B3 DC 05 F4 23 87 12 6C 45 04 1B
-5B 37 6D 00 50 45 50 45 6C 45 04 1B 5B 30 6D 00
-50 45 4E 4D 90 4D 96 4D 14 49 0E 49 86 41 42 4F
-52 54 22 00 87 12 86 45 34 40 1A 49 A2 47 2A 40
-18 46 01 27 87 12 4C 42 C6 45 1E 46 C0 41 B2 49
-2A 40 4A 48 52 42 81 5C 92 42 BE 1D C2 1D 30 4D
-87 12 A2 45 4C 42 C6 45 CA 49 08 4E 7A 4E 5A D3
-5A 53 0A 58 19 42 C8 1D 6E 4E 3E F0 1E 00 09 5E
-82 48 AE 1D 82 49 B0 1D 82 4A B2 1D 2A 52 82 4A
-C4 1D 3E 4F 3D 41 30 41 87 12 6C 45 0F 73 74 61
-63 6B 20 6D 69 73 6D 61 74 63 68 21 20 49 82 9F
-B4 1D F2 23 18 42 AE 1D 19 42 B0 1D A8 49 FE FF
-89 48 00 00 30 4D C0 45 08 56 41 52 49 41 42 4C
-45 00 B0 12 C0 49 BA 40 86 12 FC FF EF 3F F2 47
-08 43 4F 4E 53 54 41 4E 54 00 B0 12 C0 49 BA 40
-85 12 FC FF 8A 4E FE FF 3E 4F E0 3F 40 4A 06 43
-52 45 41 54 45 00 B0 12 C0 49 BA 40 85 12 FC FF
-8A 4A FE FF D3 3F 60 48 05 44 4F 45 53 3E 1A 42
-B2 1D BA 40 84 12 00 00 8A 4D 02 00 3D 41 30 4D
-78 4A 05 44 45 46 45 52 B0 12 C0 49 BA 40 30 40
-FC FF BA 40 8E 4A FE FF B9 3F 00 00 81 5B 82 43
-B6 1D 30 4D B6 49 01 5D B2 43 B6 1D 30 4D 82 45
-87 52 45 43 55 52 53 45 19 42 C4 1D 99 42 B2 1D
-00 00 A2 53 C4 1D 30 4D AC 4A 01 3A B0 12 C0 49
-BA 40 87 12 FC FF A2 83 C4 1D B2 43 B6 1D 82 4F
-B4 1D 30 4D DA 4A 81 3B 82 93 B6 1D 5D 27 87 12
-34 40 2A 40 A2 47 0E 4A AE 4A 2A 40 F4 44 09 49
-4D 4D 45 44 49 41 54 45 1A 42 AE 1D FA D0 80 00
-00 00 30 4D BE 4F 02 00 3E 4F 30 4D 0E 4B 82 49
-53 00 87 12 42 42 F4 40 C0 41 46 4B 52 4B 34 40
-24 4B A2 47 2A 40 A4 49 24 4B 2A 40 F6 4A 83 5B
-27 5D 87 12 A4 49 34 40 34 40 A2 47 A2 47 2A 40
-90 48 88 50 4F 53 54 50 4F 4E 45 00 87 12 4C 42
-C6 45 1E 46 54 40 C0 41 B2 49 7E 41 C0 41 8C 4B
-34 40 34 40 A2 47 A2 47 34 40 A2 47 A2 47 2A 40
-92 4B 3A 4E 82 4A C6 1D 2E 4E 82 4E C4 1D 3D 40
-10 00 09 4A 08 49 29 83 18 48 FE FF 0E 98 FC 2B
-89 48 00 00 1D 83 F6 23 2A 4A 0A 93 F0 23 3E 4F
-3D 41 30 4D 2E 4B 82 49 46 00 2F 83 8F 4E 00 00
-1E 42 C4 1D BE 40 C0 41 00 00 A2 52 C4 1D 2E 53
-30 4D 92 4A 84 45 4C 53 45 00 1A 42 C4 1D BA 40
-BC 41 00 00 2A 52 82 4A C4 1D 8E 4A 00 00 2A 83
-0E 4A 30 4D 4A 45 84 54 48 45 4E 00 9E 42 C4 1D
-00 00 3E 4F 30 4D 5E 4A 85 42 45 47 49 4E 30 40
-84 43 06 4C 85 55 4E 54 49 4C 39 40 C0 41 1A 42
-C4 1D A2 52 C4 1D 8A 49 00 00 8A 4E 02 00 3E 4F
-30 4D 8C 49 85 41 47 41 49 4E 39 40 BC 41 EF 3F
-28 4A 85 57 48 49 4C 45 87 12 CA 4B 6E 40 2A 40
-C0 4A 86 52 45 50 45 41 54 00 87 12 4A 4C 0C 4C
-2A 40 E4 4B 82 44 4F 00 2F 83 8F 4E 00 00 1E 42
-C4 1D BE 40 CA 41 00 00 2E 53 82 4E C4 1D A2 53
-00 1C 1A 42 00 1C 8A 43 00 00 30 4D B4 47 84 4C
-4F 4F 50 00 39 40 EC 41 1A 42 C4 1D A2 52 C4 1D
-8A 49 00 00 8A 4E 02 00 1E 42 00 1C A2 83 00 1C
-2E 4E 0E 93 04 24 9E 42 C4 1D 00 00 F5 3F 3E 4F
-30 4D E4 43 85 2B 4C 4F 4F 50 39 40 DA 41 E4 3F
-9E 4C 85 4C 45 41 56 45 1A 42 C4 1D BA 40 FC 41
-00 00 BA 40 BC 41 02 00 B2 50 06 00 C4 1D A2 53
-00 1C 2A 52 19 42 00 1C 89 4A 00 00 30 4D E2 4C
-04 4D 4F 56 45 00 0A 4E 38 4F 39 4F 3E 4F 0A 93
-11 24 08 99 0F 24 06 2C F8 49 00 00 18 53 1A 83
-FB 23 30 4D 08 5A 09 5A 19 83 18 83 E8 49 00 00
-1A 83 FA 23 30 4D 34 40 CA 1D FC 40 2A 40 84 12
-46 4D 56 50 2C 50 74 4C A2 49 14 50 D4 4C 10 4D
-AE 45 B4 4D E8 4D 24 4C AE 4E 48 41 4E 4B B6 4A
-86 46 00 00 3A 40 0C 00 39 40 CA 1D 38 40 CC 1D
-D9 3F 3A 40 0E 00 39 40 CC 1D 38 40 CA 1D CC 3F
-82 43 CC 1D 30 4D 92 42 CA 1D C8 1D 30 4D 62 4B
-09 50 57 52 5F 53 54 41 54 45 84 12 90 4B 10 50
-5A 57 A0 4D 08 50 57 52 5F 48 45 52 45 00 92 42
-C4 1D B0 4D 92 42 C6 1D AE 4D EF 3F 62 4C 09 52
-53 54 5F 53 54 41 54 45 92 42 0C 18 B0 4D 92 42
-0E 18 AE 4D E2 3F CE 4D 08 52 53 54 5F 48 45 52
-45 00 92 42 C4 1D 0C 18 92 42 C6 1D 0E 18 DF 3F
-B2 40 54 4E B6 4E B2 40 64 44 58 44 B2 40 BE 44
-CE 44 B2 40 FA 44 0E 45 B2 40 DC 43 EA 43 30 41
-52 4C 04 57 49 50 45 00 39 40 80 FF B9 43 00 00
-29 53 39 90 B4 FF FA 23 B0 12 00 4E B2 40 5A 57
-C4 1D B2 40 10 50 C6 1D D4 3F C6 4B 06 28 57 41
-52 4D 29 00 1E 42 08 18 87 12 6C 45 05 0D 1B 5B
-37 6D 50 45 70 43 6C 45 27 20 46 61 73 74 46 6F
-72 74 68 20 56 31 36 30 20 31 36 4D 48 7A 20 28
-43 29 20 4A 2E 4D 2E 54 68 6F 6F 72 65 6E 73 20
-50 45 34 40 30 FF 84 43 2A 41 30 43 6C 45 0B 62
-79 74 65 73 20 66 72 65 65 20 26 49 22 4E 04 57
-41 52 4D 00 30 40 54 4E 18 4C 04 43 4F 4C 44 00
-B2 40 04 A5 20 01 B2 40 88 5A 5C 01 B2 D0 03 00
-04 02 B2 40 FC FF 02 02 B2 C0 03 00 06 02 B2 D0
-00 04 24 02 B2 D3 26 02 B2 43 22 02 B2 43 42 02
-B2 D3 46 02 B2 43 62 02 B2 D3 66 02 F2 43 26 03
-F2 D3 22 03 F2 40 A5 00 41 01 F2 40 10 00 40 01
-D2 43 41 01 F2 40 A5 00 61 01 B2 40 48 00 62 01
-82 43 66 01 39 40 80 00 B2 40 33 00 64 01 D2 43
-61 01 92 D2 9E 01 08 18 A2 93 08 18 01 24 59 07
-38 40 C2 A2 18 83 FE 23 19 83 FA 23 B2 42 B0 01
-F2 D0 10 00 2A 03 F2 C0 40 00 A2 04 3A 40 C6 4E
-39 40 B4 FF 89 4A 00 00 29 53 FC 23 92 42 02 18
-F0 FF B2 40 18 00 0A 18 31 40 E0 1C 3F 40 80 1C
-37 40 00 40 36 40 B4 40 35 40 08 40 34 40 14 40
-B2 40 0A 00 DA 1D B2 43 AC 1D 92 C3 30 01 18 42
-08 18 D2 B3 01 02 04 20 38 E3 18 53 82 48 08 18
-B2 40 81 00 C0 05 B2 40 11 00 C6 05 B2 40 00 4A
-C8 05 F2 D0 03 00 0D 02 92 C3 C0 05 92 D3 DA 05
-3D 40 EA 4F 18 42 08 18 38 90 0A 00 25 27 38 90
-16 00 22 2F 28 93 F8 22 E0 26 B4 4E 84 12 46 4D
-38 56 E4 56 EC 55 38 57 B2 55 6C 56 B6 52 00 00
-A8 55 58 56 0A 56 48 56 C6 53 00 00 00 00 4A 57
-72 4D 4C 4E 85 48 49 32 4C 4F 87 12 84 43 DE 4B
-A2 47 AE 4A 74 4D EC 4F 2A 40 BA 4E 04 43 4F 44
-45 00 B0 12 C0 49 A2 82 C4 1D 87 12 EE 4A BC 41
-24 50 00 00 07 45 4E 44 43 4F 44 45 87 12 82 4D
-0E 4A 2A 40 44 4C 03 41 53 4D 92 42 C8 1D B8 1D
-B2 40 F0 4F C8 1D E5 3F 44 50 06 45 4E 44 41 53
-4D 00 92 42 B8 1D C8 1D E9 3F 00 00 05 43 4F 4C
-4F 4E 1A 42 C4 1D BA 40 87 12 00 00 A2 53 C4 1D
-B2 43 B6 1D 30 40 82 4D 00 00 05 4C 4F 32 48 49
-1A 42 C4 1D BA 40 B0 12 00 00 BA 40 2A 40 02 00
-A2 52 C4 1D ED 3F 38 40 BE 1D 39 48 2A 48 09 5A
-1A 52 C2 1D 09 9A 03 24 7E 9A FC 27 1A 83 0E 4A
-2A 88 82 4A C2 1D 30 4D B0 12 2A 40 C6 45 1E 46
-72 41 C0 41 EE 50 DA 46 C0 41 B2 49 10 51 F0 50
-29 4E 39 90 86 12 02 20 2E 53 30 41 39 90 85 12
-03 20 1E 4E 02 00 30 41 39 90 84 12 01 20 2E 52
-30 41 19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 40
-29 00 12 12 C2 1D 92 53 C2 1D B0 12 2A 40 C6 45
-DA 46 C0 41 42 51 38 51 21 53 3E 90 10 00 BB 2D
-30 41 44 51 B2 41 C2 1D 22 D3 30 41 87 12 4C 42
-B6 50 54 51 82 43 BC 1D 92 42 C4 1D BA 1D A2 53
-C4 1D 0A 4E 3E 4F FA 90 23 00 00 00 34 20 92 53
-C2 1D B0 12 D8 50 0E 93 04 20 B2 40 00 03 BC 1D
-27 3C 1E 93 04 20 B2 40 10 03 BC 1D 21 3C 2E 93
-04 20 B2 40 20 03 BC 1D 1B 3C 2E 92 04 20 B2 40
-20 02 BC 1D 15 3C 3E 92 04 20 B2 40 30 02 BC 1D
-0F 3C 3E 93 04 20 B2 40 30 03 BC 1D 09 3C B2 40
-30 00 BC 1D 19 42 C4 1D A2 53 C4 1D 89 4E 00 00
-3E 4F 3D 41 30 4D FA 90 26 00 00 00 08 20 B2 40
-10 02 BC 1D 92 53 C2 1D 30 12 C4 51 75 3F FA 90
-40 00 00 00 1A 20 B2 40 20 00 BC 1D 92 53 C2 1D
-B0 12 22 51 0E 20 B2 50 10 00 BC 1D 3E 40 2B 00
-B0 12 22 51 32 24 92 92 BE 1D C2 1D 02 24 92 53
-C2 1D 8E 10 82 5E BC 1D D3 3F B0 12 22 51 F9 23
-B2 50 10 00 BC 1D 3E 40 28 00 B0 12 D8 50 30 12
-14 52 67 3F 87 12 4C 42 B6 50 4C 52 FE 90 26 00
-00 00 3E 40 20 00 04 20 B2 50 82 00 BC 1D C2 3F
-B0 12 22 51 DF 23 B2 50 80 00 BC 1D 3E 40 28 00
-B0 12 D8 50 B0 12 12 51 D5 23 3D 40 B2 49 30 4D
-50 44 04 52 45 54 49 00 87 12 34 40 00 13 A2 47
-2A 40 34 40 2C 00 4C 51 44 52 9C 52 2E 4E 1E D2
-BC 1D 19 42 BA 1D 92 3F 9A 50 03 4D 4F 56 84 12
-92 52 00 40 AA 52 05 4D 4F 56 2E 42 84 12 92 52
-40 40 00 00 03 41 44 44 84 12 92 52 00 50 C4 52
-05 41 44 44 2E 42 84 12 92 52 40 50 D0 52 04 41
-44 44 43 00 84 12 92 52 00 60 DE 52 06 41 44 44
-43 2E 42 00 84 12 92 52 40 60 82 52 04 53 55 42
-43 00 84 12 92 52 00 70 FC 52 06 53 55 42 43 2E
-42 00 84 12 92 52 40 70 0A 53 03 53 55 42 84 12
-92 52 00 80 1A 53 05 53 55 42 2E 42 84 12 92 52
-40 80 7C 50 03 43 4D 50 84 12 92 52 00 90 34 53
-05 43 4D 50 2E 42 84 12 92 52 40 90 6A 50 04 44
-41 44 44 00 84 12 92 52 00 A0 4E 53 06 44 41 44
-44 2E 42 00 84 12 92 52 40 A0 40 53 03 42 49 54
-84 12 92 52 00 B0 6C 53 05 42 49 54 2E 42 84 12
-92 52 40 B0 78 53 03 42 49 43 84 12 92 52 00 C0
-86 53 05 42 49 43 2E 42 84 12 92 52 40 C0 92 53
-03 42 49 53 84 12 92 52 00 D0 A0 53 05 42 49 53
-2E 42 84 12 92 52 40 D0 00 00 03 58 4F 52 84 12
-92 52 00 E0 BA 53 05 58 4F 52 2E 42 84 12 92 52
-40 E0 EC 52 03 41 4E 44 84 12 92 52 00 F0 D4 53
-05 41 4E 44 2E 42 84 12 92 52 40 F0 4C 42 4C 51
-F2 53 1A 42 BC 1D B2 F0 70 00 BC 1D 8A 10 3A F0
-0F 00 82 DA BC 1D 4A 3F 26 53 03 52 52 43 84 12
-EC 53 00 10 0A 54 05 52 52 43 2E 42 84 12 EC 53
-40 10 16 54 04 53 57 50 42 00 84 12 EC 53 80 10
-24 54 03 52 52 41 84 12 EC 53 00 11 32 54 05 52
-52 41 2E 42 84 12 EC 53 40 11 3E 54 03 53 58 54
-84 12 EC 53 80 11 00 00 04 50 55 53 48 00 84 12
-EC 53 00 12 58 54 06 50 55 53 48 2E 42 00 84 12
-EC 53 40 12 AC 53 04 43 41 4C 4C 00 84 12 EC 53
-80 12 34 40 2C 00 4C 51 44 52 8C 54 59 42 BC 1D
-5A 42 BD 1D 82 4A BC 1D BE 90 00 15 00 00 02 20
-0A 89 02 3C 09 8A 0A 49 3A 90 10 00 03 2C 5A 0E
-A8 3F 1A 53 0E 4A 87 12 70 43 6C 45 0D 6F 75 74
-20 6F 66 20 62 6F 75 6E 64 73 20 49 66 54 05 50
-55 53 48 4D 84 12 82 54 00 15 CE 54 04 50 4F 50
-4D 00 84 12 82 54 00 17 4C 42 B6 50 EE 54 82 43
-BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D 92 53 C2 1D
-3E 40 2C 00 B0 12 2A 40 C6 45 DA 46 C0 41 B2 49
-44 52 14 55 0A 4E 3E 4F 1A 83 2A 92 CA 2F 8A 10
-5A 06 6F 3F 4C 54 04 52 52 43 4D 00 84 12 E8 54
-50 00 26 55 04 52 52 41 4D 00 84 12 E8 54 50 01
-34 55 04 52 4C 41 4D 00 84 12 E8 54 50 02 42 55
-04 52 52 55 4D 00 84 12 E8 54 50 03 85 12 00 3C
-50 55 03 53 3E 3D 85 12 00 38 62 55 02 53 3C 00
-85 12 00 34 DC 54 03 30 3E 3D 85 12 00 30 76 55
-02 30 3C 00 85 12 00 30 00 00 02 55 3C 00 85 12
-00 2C 8A 55 03 55 3E 3D 85 12 00 28 80 55 03 30
-3C 3E 85 12 00 24 9E 55 02 30 3D 00 85 12 00 20
-5C 44 02 49 46 00 1A 42 C4 1D 8A 4E 00 00 A2 53
-C4 1D 0E 4A 30 4D 94 55 04 54 48 45 4E 00 1A 42
-C4 1D 08 4E 3E 4F 09 48 29 53 0A 89 0A 11 3A 90
-00 02 68 2F 88 DA 00 00 30 4D 5C 53 04 45 4C 53
-45 00 1A 42 C4 1D BA 40 00 3C 00 00 A2 53 C4 1D
-2F 83 8F 4A 00 00 E3 3F C8 55 05 55 4E 54 49 4C
-3A 4F 08 4E 3E 4F 19 42 C4 1D 2A 83 0A 89 0A 11
-3A 90 00 FE 47 3B 3A F0 FF 03 08 DA 89 48 00 00
-A2 53 C4 1D 30 4D E0 53 05 41 47 41 49 4E 87 12
-5C 55 10 56 2A 40 00 00 05 57 48 49 4C 45 87 12
-B6 55 6E 40 2A 40 6C 55 06 52 45 50 45 41 54 00
-87 12 5C 55 10 56 CE 55 2A 40 00 00 03 4A 4D 50
-87 12 A4 49 5C 55 10 56 2A 40 3E B0 00 10 03 20
-3E E0 00 04 30 4D 3E 90 00 34 06 28 03 24 3E 40
-00 34 30 4D 3E 40 00 38 30 4D 00 00 04 3F 4A 4D
-50 00 87 12 7A 56 A4 49 6E 40 10 56 2A 40 B0 56
-3D 41 08 4E 3E 4F 2A 48 0A 93 04 20 98 42 C4 1D
-00 00 30 4D 88 43 00 00 A4 3F 76 54 03 42 57 31
-84 12 AE 56 00 00 CC 56 03 42 57 32 84 12 AE 56
-00 00 D8 56 03 42 57 33 84 12 AE 56 00 00 F0 56
-3D 41 1A 42 C4 1D 28 4E 08 93 08 20 BA 4F 00 00
-A2 53 C4 1D 8E 4A 00 00 3E 4F 30 4D 8E 43 00 00
-61 3F 00 00 03 46 57 31 84 12 EE 56 00 00 14 57
-03 46 57 32 84 12 EE 56 00 00 20 57 03 46 57 33
-84 12 EE 56 00 00 2C 57 04 47 4F 54 4F 00 87 12
-5C 55 A4 49 98 47 2A 40 9C 56 05 3F 47 4F 54 4F
-87 12 7A 56 A4 49 98 47 2A 40
-@FFB4
-C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E
-C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E
-C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E
-C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E 6A 44 C6 4E
-C6 4E C6 4E C6 4E C6 4E C6 4E C6 4E
-q
--- /dev/null
+@1800
+10 00 FA 44 80 3E 00 24 05 00 18 00 84 64 86 53
+BA 44 CC 44 7E 5B BC 5B
+@1DAA
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00
+@2000
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+@4000
+3A 41 0D 12 0D 4A 30 4D 2F 83 8F 4E 00 00 3E 41
+2E 4E 30 4D 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E
+30 4D 00 00 04 45 58 49 54 00 3D 41 30 4D 00 00
+03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 40
+03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
+44 55 50 00 0E 93 F6 23 30 4D 40 40 04 44 52 4F
+50 00 3E 4F 30 4D 00 00 03 4E 49 50 2F 53 30 4D
+00 00 04 53 57 41 50 00 2A 4F 8F 4E 00 00 0E 4A
+30 4D 68 40 04 4F 56 45 52 00 8F 4E FE FF 2E 4F
+2F 83 30 4D 72 40 03 52 4F 54 2A 4F 8F 4E 00 00
+1E 4F 02 00 8F 4A 02 00 30 4D 4E 40 02 3E 52 00
+0E 12 3E 4F 30 4D 96 40 02 52 3E 00 2F 83 8F 4E
+00 00 3E 41 30 4D B8 40 02 52 40 00 2F 83 8F 4E
+00 00 2E 41 30 4D 5C 40 05 44 45 50 54 48 8F 4E
+FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D 00 00
+01 40 2E 4E 30 4D F0 40 01 21 BE 4F 00 00 3E 4F
+30 4D 00 00 02 43 40 00 6E 4E 30 4D 04 41 02 43
+21 00 FE 4F 00 00 1F 53 3E 4F 30 4D 00 00 01 2B
+3E 5F 30 4D 30 40 01 2D 3E 8F 3E E3 1E 53 30 4D
+F8 40 03 41 4E 44 3E FF 30 4D 84 40 02 4F 52 00
+3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D 3C 41
+06 4E 45 47 41 54 45 00 E8 3F 32 41 03 41 42 53
+0E 93 E3 33 30 4D D8 40 04 44 41 42 53 00 3E F3
+06 34 BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D
+00 00 02 30 3D 00 1E 83 0E 7E 30 4D 82 41 02 30
+3C 00 0E 5E 0E 7E 3E E3 30 4D 8E 41 02 30 3E 00
+1E 93 05 34 0B 3C 00 00 01 3D 3E 8F 07 20 3E 43
+30 4D A8 41 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
+AC 40 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
+3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
+0E 93 3E 4F FB 27 2D 53 30 4D 1E 83 0E 7E F9 3F
+39 40 00 80 39 8F 08 4E 3E 4F 08 59 19 15 30 4D
+81 5E 00 00 3E 4F 32 B0 00 01 E8 27 2D 53 21 52
+30 4D 91 53 00 00 F7 3F CE 41 06 55 4E 4C 4F 4F
+50 00 F5 3F 00 00 01 49 2F 83 8F 4E 00 00 2E 41
+1E 81 02 00 30 4D 1E 41 01 4A 2F 83 8F 4E 00 00
+1E 41 04 00 1E 81 06 00 30 4D 9C 41 03 50 41 44
+85 12 E2 1C 1A 42 03 54 49 42 85 12 38 1D 0E 41
+03 43 50 4C 85 12 50 00 C2 41 03 3E 49 4E 85 12
+C2 1D 60 42 04 42 41 53 45 00 85 12 DA 1D C8 40
+05 53 54 41 54 45 85 12 B6 1D 74 42 02 42 4C 00
+85 12 20 00 B4 41 02 3C 23 00 B2 40 AA 1D AA 1D
+30 4D 8C 42 01 23 2C 4F 5B 42 DA 1D 0A 43 34 40
+20 00 0E 93 04 20 04 11 0E 4C 0C 43 09 43 0A 9B
+01 28 0A 8B 09 69 08 68 14 83 07 30 0C 5C 0E 6E
+0A 6A F5 2B 0A 8B 12 D3 F5 3F 34 40 14 40 8F 49
+00 00 0E 48 7A 90 0A 00 02 28 3A 50 07 00 3A 50
+30 00 92 83 AA 1D 18 42 AA 1D C8 4A 00 00 30 4D
+A4 42 02 23 53 00 87 12 A6 42 0C 43 2D 83 09 93
+CA 23 0E 93 C8 23 3D 41 30 4D 02 43 02 23 3E 00
+9F 42 AA 1D 00 00 3E 40 AA 1D 2E 8F 30 4D 26 42
+04 48 4F 4C 44 00 0A 4E 3E 4F DB 3F 80 42 04 53
+49 47 4E 00 0E 93 3E 4F 3A 40 2D 00 D2 33 30 4D
+56 42 02 55 2E 00 87 12 9A 42 34 40 00 00 06 43
+20 43 E0 45 A8 45 2A 40 68 41 02 44 2E 00 87 12
+9A 42 78 40 8A 40 6E 41 06 43 9A 40 44 43 20 43
+E0 45 A8 45 2A 40 50 41 01 2E 0E 93 E4 37 2F 83
+8F 4E 00 00 3E 43 EB 3F 30 43 04 48 45 52 45 00
+2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D 5C 41 05 41
+4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D 1C 43 02 43
+2C 00 1A 42 C4 1D CA 4E 00 00 92 53 C4 1D 3E 4F
+30 4D 2F 83 8F 4E 00 00 B0 12 BA 44 92 B3 DC 05
+FD 27 1E 42 CC 05 B0 12 CC 44 30 4D 9A 43 05 28
+4B 45 59 29 18 42 CC 05 EC 3F 38 42 03 4B 45 59
+30 40 F4 43 0D 12 3D 40 2E 44 1B 42 34 20 9B 42
+1E 20 16 00 3A 40 00 21 8F 4A 02 00 8F 4E 00 00
+0E 43 82 93 20 20 13 24 19 42 1E 20 02 3C 30 44
+2D 83 19 92 20 20 15 2C 58 49 00 1E 19 53 78 90
+20 00 08 2C 78 90 0A 00 F4 23 82 49 1E 20 2F 53
+3D 41 30 4D 2E 9F 64 24 CA 48 00 00 1A 53 1E 53
+5F 3C 0A 12 B0 12 F2 5C 3A 41 DB 3F AE 43 06 41
+43 43 45 50 54 00 30 40 86 44 EE 43 08 28 41 43
+43 45 50 54 29 00 3C 40 38 45 3B 40 02 45 2D 15
+0A 4E 2E 4F 0A 5E 3B 40 0D 00 3C 40 20 00 3D 40
+2C 45 92 B3 DC 05 05 24 18 42 CC 05 38 90 0A 00
+04 20 21 53 39 40 E6 44 4D 15 B2 40 11 00 CE 05
+E2 C2 23 02 A2 B3 DC 05 FD 27 30 41 B2 40 13 00
+CE 05 E2 D2 23 02 A2 B3 DC 05 FD 27 30 41 00 00
+05 53 4C 45 45 50 30 40 F4 44 00 00 07 28 53 4C
+45 45 50 29 12 D2 0A 18 F6 3F 21 52 3A 17 58 42
+CC 05 48 9B E3 27 48 9C 06 2C 78 92 11 20 2E 9F
+0F 24 1E 83 05 3C 0E 9A 03 24 CE 48 00 00 1E 53
+82 48 CE 05 A2 B3 DC 05 FD 27 30 4D 2E 45 2D 83
+92 B3 DC 05 FD 27 E3 23 B2 40 18 00 0A 18 3E 8F
+3D 41 30 4D 7C 44 06 28 45 4D 49 54 29 00 08 4E
+3E 4F E6 3F 6A 43 04 45 4D 49 54 00 30 40 4E 45
+56 45 04 45 43 48 4F 00 B2 40 82 48 20 45 30 4D
+88 43 06 4E 4F 45 43 48 4F 00 B2 40 30 4D 20 45
+30 4D 46 45 04 28 43 52 29 00 2F 83 8F 4E 00 00
+3E 40 0D 00 E3 3F BE 43 02 43 52 00 30 40 8A 45
+3E 43 05 53 50 41 43 45 2F 83 8F 4E 00 00 3E 40
+20 00 D4 3F A2 45 06 53 50 41 43 45 53 00 0E 93
+09 24 0D 12 3D 40 CA 45 EF 3F CC 45 2D 83 1E 83
+EB 23 3D 41 3E 4F 30 4D 52 43 04 54 59 50 45 00
+0E 93 95 24 2A 4F 8F 5E 00 00 0E 4A 87 12 F0 41
+28 42 08 41 5C 45 12 42 F0 45 2A 40 2F 82 8F 4E
+02 00 7E 4D 8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D
+B6 45 82 53 22 00 87 12 34 40 FC 45 32 48 34 40
+22 00 56 46 26 46 3D 41 6E 4E 1E 83 82 5E C4 1D
+3E 4F 92 B3 C4 1D A2 63 C4 1D 30 4D 72 45 82 2E
+22 00 87 12 16 46 34 40 E0 45 32 48 2A 40 00 00
+04 57 4F 52 44 00 3C 40 BE 1D 39 4C 3A 4C 09 5A
+3A 5C 28 4C 09 9A 19 24 7E 9A FC 27 1A 83 3B 40
+60 00 C8 4C 00 00 09 9A 0C 24 7C 4A 4E 9C 09 24
+18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F 7C 80 20 00
+F0 3F 1A 82 C0 1D 82 4A C2 1D 1E 42 C4 1D 08 8E
+CE 48 00 00 30 4D 00 00 04 46 49 4E 44 00 2F 83
+0C 4E 65 4C 74 40 80 00 3B 40 CA 1D 3E 4B 0E 93
+1E 24 58 4C 01 00 78 F0 1E 00 0E 58 2E 53 1E 4E
+FE FF 0E 93 F3 27 09 4E 78 49 48 C4 48 95 F7 23
+0A 4C 1A 53 FA 99 00 00 F2 23 58 83 FA 23 19 B3
+09 63 0C 49 6A 4E 1E 43 4A 93 01 30 2E 83 8F 4C
+00 00 35 40 08 40 34 40 14 40 30 4D 2F 53 2F 53
+3E 4F 30 4D 6A 42 07 3E 4E 55 4D 42 45 52 3C 4F
+38 4F 29 4F 2F 82 1B 42 DA 1D 6A 4C 7A 80 30 00
+7A 90 0A 00 02 28 7A 80 07 00 0A 9B 13 2C 82 49
+D0 04 82 48 D2 04 82 4B C8 04 19 42 E4 04 18 42
+E6 04 09 5A 08 63 1C 53 1E 83 E7 23 8F 49 04 00
+8F 48 02 00 8F 4C 00 00 30 4D 03 12 0D 12 1B 42
+DA 1D 0B 12 32 C0 00 02 6D 4E 0D 5E 0C 4E 7A 40
+2E 00 0D 9C 0A 28 7A 9C FC 23 32 D0 00 02 FC 4C
+FE FF 0D 9C FC 2F DE 83 00 00 09 43 08 43 3D 40
+E0 47 3F 82 8F 4E 06 00 0C 4E 7E 4C 6A 4C 7A 90
+2D 00 10 2C 3B 40 10 00 7A 80 24 00 06 24 2B 43
+5A 83 03 24 3B 52 6A 53 B0 23 1C 53 1E 83 6A 4C
+7A 90 2D 00 AA 23 1C 53 1E 83 B1 43 04 00 A5 3F
+E2 47 2F 53 0E 93 2C 17 82 4C DA 1D 03 24 2F 52
+0E F3 30 4D 9F 4F 02 00 04 00 BF 4F 00 00 3E E3
+09 20 3E E3 BF E3 02 00 BF E3 00 00 9F 53 02 00
+8F 63 00 00 32 B0 00 02 01 20 2F 53 30 4D 62 45
+07 45 58 45 43 55 54 45 0A 4E 3E 4F 00 4A 26 41
+01 2C 1A 42 C4 1D A2 53 C4 1D 8A 4E 00 00 3E 4F
+30 4D 30 48 87 4C 49 54 45 52 41 4C 82 93 B6 1D
+0F 24 1A 42 C4 1D A2 52 C4 1D BA 40 34 40 00 00
+8A 4E 02 00 3E 4F 32 B0 00 02 32 C0 00 02 F1 23
+30 4D 98 45 05 43 4F 55 4E 54 2F 83 1E 53 8F 4E
+00 00 5E 4E FF FF 30 4D 82 4E BE 1D B2 4F C0 1D
+3E 4F 82 43 C2 1D 87 12 90 42 56 46 9E 48 3D 40
+AA 48 05 23 3D 41 3E 4F 30 4D AC 48 0A 4E 3E 4F
+3D 40 C2 48 5A 27 3D 40 98 48 1A E2 B6 1D B9 27
+B3 23 C4 48 3E 4F 3D 40 98 48 C0 23 DE 53 00 00
+68 4E 08 5E F8 40 3F 00 00 00 3D 40 34 4B CD 3F
+20 48 08 45 56 41 4C 55 41 54 45 00 39 40 BE 1D
+3C 49 3B 49 3A 49 3D 15 B0 12 2A 40 88 48 00 49
+B2 41 C2 1D B2 41 C0 1D B2 41 BE 1D 3D 41 30 4D
+4C 42 04 51 55 49 54 00 31 40 E0 1C B2 40 00 1C
+00 1C 82 43 B6 1D 82 93 08 18 17 24 E2 B2 60 02
+14 20 2F 83 8F 4E 00 00 1E 42 08 18 82 43 08 18
+B0 12 2A 40 FC 45 0F 4C 4F 41 44 22 20 42 4F 4F
+54 2E 34 54 48 22 DC 41 76 49 82 43 08 18 B0 12
+2A 40 FC 45 03 0D 6F 6B E0 45 A8 45 5A 42 44 40
+64 42 76 44 A8 45 88 48 DE 40 92 41 FC 45 0D 73
+74 61 63 6B 20 65 6D 70 74 79 21 20 C6 49 34 40
+30 FF A0 43 D2 41 FC 45 0B 46 52 41 4D 20 66 75
+6C 6C 21 20 C6 49 86 42 F2 40 E0 41 62 49 FC 45
+03 0D 20 20 DC 41 68 49 6E 44 05 41 42 4F 52 54
+3F 40 80 1C A9 3F 8F 93 02 00 A0 26 B2 40 82 48
+20 45 1B 42 34 20 0B 93 04 24 CB 43 02 00 2B 4B
+FA 3F B0 12 E8 4E A2 B3 DC 05 FD 27 B2 40 11 00
+CE 05 E2 C2 23 02 92 C3 DC 05 38 40 A0 AA 39 42
+03 43 19 83 FD 23 18 83 FA 23 92 B3 DC 05 F3 23
+87 12 FC 45 04 1B 5B 37 6D 00 E0 45 E0 45 FC 45
+04 1B 5B 30 6D 00 E0 45 F6 4D 38 4E 3E 4E 86 4E
+C0 49 BA 49 86 41 42 4F 52 54 22 00 87 12 16 46
+34 40 C6 49 32 48 2A 40 A8 46 01 27 87 12 90 42
+56 46 AE 46 E0 41 5A 4A 2A 40 CC 48 96 42 81 5C
+92 42 BE 1D C2 1D 30 4D 00 00 81 5B 82 43 B6 1D
+30 4D 5E 4A 01 5D B2 43 B6 1D 30 4D 6A 4A 83 5B
+27 5D 87 12 4C 4A 34 40 34 40 32 48 32 48 2A 40
+BE 4F 02 00 3E 4F 30 4D 84 45 82 49 53 00 87 12
+86 42 F2 40 E0 41 B2 4A 82 4A 34 40 90 4A 32 48
+2A 40 4C 4A 90 4A 2A 40 9A 4A 09 49 4D 4D 45 44
+49 41 54 45 1A 42 AE 1D FA D0 80 00 00 00 30 4D
+12 46 87 52 45 43 55 52 53 45 19 42 C4 1D 99 42
+B2 1D 00 00 A2 53 C4 1D 30 4D 12 49 88 50 4F 53
+54 50 4F 4E 45 00 87 12 90 42 56 46 AE 46 54 40
+E0 41 5A 4A 92 41 E0 41 16 4B 34 40 34 40 32 48
+32 48 34 40 32 48 32 48 2A 40 82 9F B4 1D A0 24
+87 12 FC 45 0F 73 74 61 63 6B 20 6D 69 73 6D 61
+74 63 68 21 CC 49 87 12 32 46 90 42 56 46 40 4B
+08 4E 7A 4E 5A D3 5A 53 0A 58 19 42 C8 1D 6E 4E
+3E F0 1E 00 09 5E 82 48 AE 1D 82 49 B0 1D 82 4A
+B2 1D 2A 52 82 4A C4 1D 3E 4F 3D 41 30 41 50 46
+08 56 41 52 49 41 42 4C 45 00 B0 12 36 4B BA 40
+86 12 FC FF 71 3C 74 48 08 43 4F 4E 53 54 41 4E
+54 00 B0 12 36 4B BA 40 85 12 FC FF 8A 4E FE FF
+3E 4F 62 3C 88 4B 06 43 52 45 41 54 45 00 B0 12
+36 4B BA 40 85 12 FC FF 8A 4A FE FF 55 3C E2 48
+05 44 4F 45 53 3E 1A 42 B2 1D BA 40 84 12 00 00
+8A 4D 02 00 3D 41 30 4D C0 4B 05 44 45 46 45 52
+B0 12 36 4B BA 40 30 40 FC FF BA 40 D6 4B FE FF
+3B 3C 7E 4A 01 3A B0 12 36 4B BA 40 87 12 FC FF
+A2 83 C4 1D B2 43 B6 1D 82 4F B4 1D 30 4D F4 4B
+81 3B 82 93 B6 1D 24 27 87 12 34 40 2A 40 32 48
+1A 4B 6C 4A 2A 40 28 4C 3D 41 B2 4E 0E 18 A2 4E
+0C 18 3E 4F 32 3D 44 48 06 4D 41 52 4B 45 52 00
+B0 12 36 4B BA 40 84 12 FC FF BA 40 26 4C FE FF
+9A 42 C6 1D 00 00 28 83 8A 48 02 00 A2 52 C4 1D
+18 42 AE 1D 19 42 B0 1D A8 49 FE FF 89 48 00 00
+30 4D BA 4A 82 49 46 00 2F 83 8F 4E 00 00 1E 42
+C4 1D A2 52 C4 1D BE 40 E0 41 00 00 2E 53 30 4D
+DA 4B 84 45 4C 53 45 00 A2 52 C4 1D 1A 42 C4 1D
+BA 40 DC 41 FC FF 8E 4A 00 00 2A 83 0E 4A 30 4D
+DA 45 84 54 48 45 4E 00 9E 42 C4 1D 00 00 3E 4F
+30 4D A6 4B 85 42 45 47 49 4E 30 40 A0 43 B2 4C
+85 55 4E 54 49 4C 39 40 E0 41 A2 52 C4 1D 1A 42
+C4 1D 8A 49 FC FF 8A 4E FE FF 3E 4F 30 4D 34 4A
+85 41 47 41 49 4E 39 40 DC 41 EF 3F 70 4B 85 57
+48 49 4C 45 87 12 78 4C 78 40 2A 40 D2 4A 86 52
+45 50 45 41 54 00 87 12 F6 4C B8 4C 2A 40 92 4C
+82 44 4F 00 2F 83 8F 4E 00 00 A2 53 C4 1D 1E 42
+C4 1D BE 40 F0 41 FE FF A2 53 00 1C 1A 42 00 1C
+8A 43 00 00 30 4D 38 4C 84 4C 4F 4F 50 00 39 40
+12 42 A2 52 C4 1D 1A 42 C4 1D 8A 49 FC FF 8A 4E
+FE FF 1E 42 00 1C A2 83 00 1C 2E 4E 0E 93 03 24
+8E 4A 00 00 F6 3F 3E 4F 30 4D FC 43 85 2B 4C 4F
+4F 50 39 40 00 42 E5 3F 48 4D 85 4C 45 41 56 45
+1A 42 C4 1D BA 40 22 42 00 00 BA 40 DC 41 02 00
+B2 50 06 00 C4 1D A2 53 00 1C 2A 52 19 42 00 1C
+89 4A 00 00 30 4D 8A 4D 04 4D 4F 56 45 00 0A 4E
+38 4F 39 4F 3E 4F 0A 93 11 24 08 99 0F 24 06 2C
+F8 49 00 00 18 53 1A 83 FB 23 30 4D 08 5A 09 5A
+19 83 18 83 E8 49 00 00 1A 83 FA 23 30 4D 34 40
+CA 1D FA 40 2A 40 84 12 EE 4D CC 53 9E 5E 92 5E
+4A 4A 8A 53 7C 4D AC 5E 3E 46 AA 4E 28 63 1E 64
+1A 63 46 41 32 5C 74 4A 16 47 00 00 3A 40 0E 00
+39 40 CA 1D 38 40 CC 1D D9 3F 3A 40 0E 00 39 40
+CC 1D 38 40 CA 1D CC 3F 82 43 CC 1D 30 4D 92 42
+CA 1D C8 1D 30 4D 48 4E 3A 4E 82 4A C6 1D 2E 4E
+82 4E C4 1D 3D 40 10 00 09 4A 08 49 29 83 18 48
+FE FF 0E 98 FC 2B 89 48 00 00 1D 83 F6 23 2A 4A
+0A 93 F0 23 3E 4F 3D 41 30 4D EC 4A 09 50 57 52
+5F 53 54 41 54 45 84 12 46 4E 86 53 84 64 0E 4D
+09 52 53 54 5F 53 54 41 54 45 92 42 0E 18 8A 4E
+92 42 0C 18 8C 4E EF 3F 7C 4E 08 50 57 52 5F 48
+45 52 45 00 92 42 C6 1D 8A 4E 92 42 C4 1D 8C 4E
+30 4D 90 4E 08 52 53 54 5F 48 45 52 45 00 92 42
+C6 1D 0E 18 92 42 C4 1D 0C 18 EC 3F B2 40 76 50
+D8 50 B2 40 F4 44 E8 44 B2 40 4E 45 5E 45 B2 40
+8A 45 9E 45 B2 40 F4 43 02 44 B2 40 86 44 78 44
+82 43 48 5A 82 43 54 5A 82 43 60 5A 82 43 90 5A
+82 43 9C 5A 82 43 A8 5A 30 41 FE 4C 04 57 49 50
+45 00 39 40 80 FF B9 43 00 00 29 53 39 90 B4 FF
+FA 23 B0 12 DC 4E B2 40 84 64 0C 18 B2 40 86 53
+0E 18 AB 3F C4 4C 07 43 4F 4D 50 41 52 45 0C 4E
+38 4F 3B 4F 39 4F 0E 4B 0E 5C 0C 24 1B 83 07 30
+1C 83 07 30 19 53 F9 98 FF FF F5 27 02 2C 3E 43
+30 4D 1E 43 30 4D 10 4C 86 5B 54 48 45 4E 5D 00
+30 4D 1E 83 30 4D 78 4F 86 5B 45 4C 53 45 5D 00
+87 12 34 40 01 00 90 42 56 46 7A 48 44 40 E0 41
+FE 4F 8A 40 8A 40 FC 45 04 5B 49 46 5D 00 4E 4F
+EA 41 BC 4F 0E 47 2C 41 DC 41 F2 4F 8A 40 8A 40
+FC 45 06 5B 45 4C 53 45 5D 00 4E 4F EA 41 E0 4F
+0E 47 82 4F 44 40 E0 41 DC 4F 2C 41 DC 41 F2 4F
+FC 45 06 5B 54 48 45 4E 5D 00 4E 4F EA 41 F2 4F
+82 4F 54 40 EA 41 FA 4F 2A 40 DC 41 96 4F 0E 47
+FC 45 03 0D 6B 6F E0 45 A8 45 5A 42 44 40 64 42
+76 44 14 50 82 43 C2 1D 82 4E BE 1D B2 4F C0 1D
+3E 4F 3D 40 96 4F 30 4D 88 4F 84 5B 49 46 5D 00
+0E 93 3E 4F AD 27 30 4D 2A 50 8B 5B 55 4E 44 45
+46 49 4E 45 44 5D 87 12 90 42 56 46 AE 46 6C 40
+86 41 2A 40 3A 50 89 5B 44 45 46 49 4E 45 44 5D
+87 12 90 42 56 46 AE 46 6C 40 2A 40 74 4C 06 28
+57 41 52 4D 29 00 1E 42 08 18 87 12 FC 45 05 0D
+1B 5B 37 6D E0 45 8A 43 FC 45 27 20 46 61 73 74
+46 6F 72 74 68 20 56 31 36 32 20 31 36 4D 48 7A
+20 28 43 29 20 4A 2E 4D 2E 54 68 6F 6F 72 65 6E
+73 20 E0 45 34 40 30 FF A0 43 28 41 56 43 FC 45
+0B 62 79 74 65 73 20 66 72 65 65 20 E2 49 1C 4F
+04 57 41 52 4D 00 30 40 76 50 46 4F 04 43 4F 4C
+44 00 B2 40 04 A5 20 01 B2 40 88 5A 5C 01 B2 D0
+03 00 04 02 B2 40 FC FF 02 02 B2 C0 03 00 06 02
+B2 D0 00 04 24 02 B2 D3 26 02 B2 43 22 02 B2 43
+42 02 B2 D3 46 02 B2 43 62 02 B2 D3 66 02 F2 43
+26 03 F2 D3 22 03 F2 40 A5 00 41 01 F2 40 10 00
+40 01 D2 43 41 01 F2 40 A5 00 61 01 B2 40 48 00
+62 01 82 43 66 01 39 40 80 00 B2 40 33 00 64 01
+D2 43 61 01 92 D2 9E 01 08 18 A2 93 08 18 01 24
+59 07 38 40 C2 A2 18 83 FE 23 19 83 FA 23 B2 42
+B0 01 F2 D0 10 00 2A 03 F2 40 A5 00 A1 04 F2 C0
+40 00 A2 04 3A 40 E8 50 39 40 B4 FF 89 4A 00 00
+29 53 FC 23 92 42 02 18 F0 FF B2 40 18 00 0A 18
+31 40 E0 1C 3F 40 80 1C 37 40 00 40 36 40 BC 40
+35 40 08 40 34 40 14 40 B2 40 0A 00 DA 1D B2 43
+AC 1D 92 C3 30 01 18 42 08 18 D2 B3 01 02 04 20
+38 E3 18 53 82 48 08 18 B2 40 81 00 C0 05 B2 40
+11 00 C6 05 B2 40 00 4A C8 05 F2 D0 03 00 0D 02
+92 C3 C0 05 92 D3 DA 05 3D 40 12 52 18 42 08 18
+38 90 0A 00 8E 26 38 90 16 00 8B 2E 28 93 45 22
+3A 26 14 52 E2 B2 60 02 5E 23 B2 40 81 A9 40 06
+B2 40 30 00 46 06 D2 D3 25 02 B2 D0 C0 04 0C 02
+B2 C0 C0 04 06 02 92 C3 40 06 39 40 00 20 89 43
+00 00 29 53 39 90 54 21 FA 23 39 42 B0 12 56 5B
+D2 C3 23 02 2C 42 B2 40 95 00 14 20 B2 40 00 40
+18 20 1A 43 B0 12 1A 5B 02 24 30 40 F4 5B B0 12
+54 5B 7A 93 FC 23 B2 40 87 AA 14 20 92 43 16 20
+B2 40 00 48 18 20 1A 43 B0 12 1A 5B 29 42 B0 12
+56 5B 92 43 14 20 82 43 16 20 78 43 3C 42 B2 40
+00 77 18 20 1A 43 B0 12 1A 5B B2 40 40 69 18 20
+B0 12 10 5B 03 24 58 83 F2 23 D7 3F 0C 5C A2 43
+16 20 B2 40 00 50 18 20 B0 12 10 5B CE 23 92 D3
+40 06 82 43 46 06 92 C3 40 06 B0 12 7C 5B 38 40
+00 1E 92 48 C6 01 04 20 92 48 C8 01 06 20 5A 48
+C2 01 92 43 02 20 7A 80 06 00 0D 24 7A 82 0B 24
+A2 43 02 20 6A 53 07 24 5A 53 05 24 3A 50 0B 20
+0C 4A 30 40 FA 5B B0 12 7C 5B D2 48 0D 00 12 20
+19 48 0E 00 82 49 08 20 1A 48 16 00 0A 93 02 20
+1A 48 24 00 82 4A 0A 20 09 5A 82 49 0C 20 09 5A
+A2 93 02 20 04 24 82 49 0E 20 39 50 20 00 19 82
+12 20 19 82 12 20 82 49 10 20 92 42 02 20 2C 20
+BA 3E 84 12 EE 4D AC 59 58 5A 60 59 AC 5A 26 59
+E0 59 2A 56 00 00 1C 59 CC 59 7E 59 BC 59 3A 57
+00 00 00 00 BE 5A 1A 4E 6E 50 85 48 49 32 4C 4F
+87 12 A0 43 8C 4C 32 48 6C 4A 1C 4E 62 53 2A 40
+DC 50 04 43 4F 44 45 00 B0 12 36 4B A2 82 C4 1D
+87 12 08 4C DC 41 9A 53 00 00 07 45 4E 44 43 4F
+44 45 87 12 2A 4E 1A 4B 2A 40 F0 4C 03 41 53 4D
+92 42 C8 1D B8 1D B2 40 66 53 C8 1D E5 3F BA 53
+06 45 4E 44 41 53 4D 00 92 42 B8 1D C8 1D E9 3F
+00 00 05 43 4F 4C 4F 4E 1A 42 C4 1D BA 40 87 12
+00 00 A2 53 C4 1D B2 43 B6 1D 30 40 2A 4E 00 00
+05 4C 4F 32 48 49 1A 42 C4 1D BA 40 B0 12 00 00
+BA 40 2A 40 02 00 A2 52 C4 1D ED 3F 38 40 BE 1D
+39 48 2A 48 09 5A 1A 52 C2 1D 09 9A 03 24 7E 9A
+FC 27 1A 83 0E 4A 2A 88 82 4A C2 1D 30 4D B0 12
+2A 40 56 46 AE 46 EA 41 62 54 6A 47 E0 41 5A 4A
+84 54 64 54 29 4E 39 90 86 12 02 20 2E 53 30 41
+39 90 85 12 03 20 1E 4E 02 00 30 41 39 90 84 12
+01 20 2E 52 30 41 19 42 C4 1D A2 53 C4 1D 89 4E
+00 00 3E 40 29 00 12 12 C2 1D 92 53 C2 1D B0 12
+2A 40 56 46 6A 47 E0 41 B6 54 AC 54 21 53 3E 90
+10 00 BB 2D 30 41 B8 54 B2 41 C2 1D 22 D3 30 41
+87 12 90 42 2C 54 C8 54 82 43 BC 1D 92 42 C4 1D
+BA 1D A2 53 C4 1D 0A 4E 3E 4F FA 90 23 00 00 00
+34 20 92 53 C2 1D B0 12 4E 54 0E 93 04 20 B2 40
+00 03 BC 1D 27 3C 1E 93 04 20 B2 40 10 03 BC 1D
+21 3C 2E 93 04 20 B2 40 20 03 BC 1D 1B 3C 2E 92
+04 20 B2 40 20 02 BC 1D 15 3C 3E 92 04 20 B2 40
+30 02 BC 1D 0F 3C 3E 93 04 20 B2 40 30 03 BC 1D
+09 3C B2 40 30 00 BC 1D 19 42 C4 1D A2 53 C4 1D
+89 4E 00 00 3E 4F 3D 41 30 4D FA 90 26 00 00 00
+08 20 B2 40 10 02 BC 1D 92 53 C2 1D 30 12 38 55
+76 3F FA 90 40 00 00 00 1A 20 B2 40 20 00 BC 1D
+92 53 C2 1D B0 12 96 54 0E 20 B2 50 10 00 BC 1D
+3E 40 2B 00 B0 12 96 54 32 24 92 92 BE 1D C2 1D
+02 24 92 53 C2 1D 8E 10 82 5E BC 1D D3 3F B0 12
+96 54 F9 23 B2 50 10 00 BC 1D 3E 40 28 00 B0 12
+4E 54 30 12 88 55 67 3F 87 12 90 42 2C 54 C0 55
+FE 90 26 00 00 00 3E 40 20 00 04 20 B2 50 82 00
+BC 1D C2 3F B0 12 96 54 DF 23 B2 50 80 00 BC 1D
+3E 40 28 00 B0 12 4E 54 B0 12 86 54 D5 23 3D 40
+5A 4A 30 4D E0 44 04 52 45 54 49 00 87 12 34 40
+00 13 32 48 2A 40 34 40 2C 00 C0 54 B8 55 10 56
+2E 4E 1E D2 BC 1D 19 42 BA 1D 92 3F 10 54 03 4D
+4F 56 84 12 06 56 00 40 1E 56 05 4D 4F 56 2E 42
+84 12 06 56 40 40 00 00 03 41 44 44 84 12 06 56
+00 50 38 56 05 41 44 44 2E 42 84 12 06 56 40 50
+44 56 04 41 44 44 43 00 84 12 06 56 00 60 52 56
+06 41 44 44 43 2E 42 00 84 12 06 56 40 60 F6 55
+04 53 55 42 43 00 84 12 06 56 00 70 70 56 06 53
+55 42 43 2E 42 00 84 12 06 56 40 70 7E 56 03 53
+55 42 84 12 06 56 00 80 8E 56 05 53 55 42 2E 42
+84 12 06 56 40 80 F2 53 03 43 4D 50 84 12 06 56
+00 90 A8 56 05 43 4D 50 2E 42 84 12 06 56 40 90
+E0 53 04 44 41 44 44 00 84 12 06 56 00 A0 C2 56
+06 44 41 44 44 2E 42 00 84 12 06 56 40 A0 B4 56
+03 42 49 54 84 12 06 56 00 B0 E0 56 05 42 49 54
+2E 42 84 12 06 56 40 B0 EC 56 03 42 49 43 84 12
+06 56 00 C0 FA 56 05 42 49 43 2E 42 84 12 06 56
+40 C0 06 57 03 42 49 53 84 12 06 56 00 D0 14 57
+05 42 49 53 2E 42 84 12 06 56 40 D0 00 00 03 58
+4F 52 84 12 06 56 00 E0 2E 57 05 58 4F 52 2E 42
+84 12 06 56 40 E0 60 56 03 41 4E 44 84 12 06 56
+00 F0 48 57 05 41 4E 44 2E 42 84 12 06 56 40 F0
+90 42 C0 54 66 57 1A 42 BC 1D B2 F0 70 00 BC 1D
+8A 10 3A F0 0F 00 82 DA BC 1D 4A 3F 9A 56 03 52
+52 43 84 12 60 57 00 10 7E 57 05 52 52 43 2E 42
+84 12 60 57 40 10 8A 57 04 53 57 50 42 00 84 12
+60 57 80 10 98 57 03 52 52 41 84 12 60 57 00 11
+A6 57 05 52 52 41 2E 42 84 12 60 57 40 11 B2 57
+03 53 58 54 84 12 60 57 80 11 00 00 04 50 55 53
+48 00 84 12 60 57 00 12 CC 57 06 50 55 53 48 2E
+42 00 84 12 60 57 40 12 20 57 04 43 41 4C 4C 00
+84 12 60 57 80 12 34 40 2C 00 C0 54 B8 55 00 58
+59 42 BC 1D 5A 42 BD 1D 82 4A BC 1D BE 90 00 15
+00 00 02 20 0A 89 02 3C 09 8A 0A 49 3A 90 10 00
+03 2C 5A 0E A8 3F 1A 53 0E 4A 87 12 8A 43 FC 45
+0D 6F 75 74 20 6F 66 20 62 6F 75 6E 64 73 CC 49
+DA 57 05 50 55 53 48 4D 84 12 F6 57 00 15 42 58
+04 50 4F 50 4D 00 84 12 F6 57 00 17 90 42 2C 54
+62 58 82 43 BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D
+92 53 C2 1D 3E 40 2C 00 B0 12 2A 40 56 46 6A 47
+E0 41 5A 4A B8 55 88 58 0A 4E 3E 4F 1A 83 2A 92
+CA 2F 8A 10 5A 06 6F 3F C0 57 04 52 52 43 4D 00
+84 12 5C 58 50 00 9A 58 04 52 52 41 4D 00 84 12
+5C 58 50 01 A8 58 04 52 4C 41 4D 00 84 12 5C 58
+50 02 B6 58 04 52 52 55 4D 00 84 12 5C 58 50 03
+85 12 00 3C C4 58 03 53 3E 3D 85 12 00 38 D6 58
+02 53 3C 00 85 12 00 34 50 58 03 30 3E 3D 85 12
+00 30 EA 58 02 30 3C 00 85 12 00 30 00 00 02 55
+3C 00 85 12 00 2C FE 58 03 55 3E 3D 85 12 00 28
+F4 58 03 30 3C 3E 85 12 00 24 12 59 02 30 3D 00
+85 12 00 20 EC 44 02 49 46 00 1A 42 C4 1D 8A 4E
+00 00 A2 53 C4 1D 0E 4A 30 4D 08 59 04 54 48 45
+4E 00 1A 42 C4 1D 08 4E 3E 4F 09 48 29 53 0A 89
+0A 11 3A 90 00 02 68 2F 88 DA 00 00 30 4D D0 56
+04 45 4C 53 45 00 1A 42 C4 1D BA 40 00 3C 00 00
+A2 53 C4 1D 2F 83 8F 4A 00 00 E3 3F 3C 59 05 55
+4E 54 49 4C 3A 4F 08 4E 3E 4F 19 42 C4 1D 2A 83
+0A 89 0A 11 3A 90 00 FE 47 3B 3A F0 FF 03 08 DA
+89 48 00 00 A2 53 C4 1D 30 4D 54 57 05 41 47 41
+49 4E 87 12 D0 58 84 59 2A 40 00 00 05 57 48 49
+4C 45 87 12 2A 59 78 40 2A 40 E0 58 06 52 45 50
+45 41 54 00 87 12 D0 58 84 59 42 59 2A 40 00 00
+03 4A 4D 50 87 12 4C 4A D0 58 84 59 2A 40 3E B0
+00 10 03 20 3E E0 00 04 30 4D 3E 90 00 34 06 28
+03 24 3E 40 00 34 30 4D 3E 40 00 38 30 4D 00 00
+04 3F 4A 4D 50 00 87 12 EE 59 4C 4A 78 40 84 59
+2A 40 24 5A 3D 41 08 4E 3E 4F 2A 48 0A 93 04 20
+98 42 C4 1D 00 00 30 4D 88 43 00 00 A4 3F EA 57
+03 42 57 31 84 12 22 5A 00 00 40 5A 03 42 57 32
+84 12 22 5A 00 00 4C 5A 03 42 57 33 84 12 22 5A
+00 00 64 5A 3D 41 1A 42 C4 1D 28 4E 08 93 08 20
+BA 4F 00 00 A2 53 C4 1D 8E 4A 00 00 3E 4F 30 4D
+8E 43 00 00 61 3F 00 00 03 46 57 31 84 12 62 5A
+00 00 88 5A 03 46 57 32 84 12 62 5A 00 00 94 5A
+03 46 57 33 84 12 62 5A 00 00 A0 5A 04 47 4F 54
+4F 00 87 12 D0 58 4C 4A 28 48 2A 40 10 5A 05 3F
+47 4F 54 4F 87 12 EE 59 4C 4A 28 48 2A 40 D2 C3
+23 02 E2 B2 60 02 02 24 30 40 E2 50 1A 52 04 20
+19 62 06 20 92 43 14 20 A2 93 02 20 07 24 0A 5A
+49 69 82 4A 16 20 C2 49 18 20 0A 3C C2 4A 15 20
+8A 10 C2 4A 16 20 C2 49 17 20 89 10 C2 49 18 20
+B0 12 54 5B 7A 93 FC 23 0A 43 39 40 05 00 D2 49
+14 20 4E 06 82 93 46 06 05 24 92 B3 6C 06 FD 27
+C2 93 4C 06 59 83 F3 2F 19 83 0B 30 F2 43 4E 06
+82 93 46 06 03 24 92 B3 6C 06 FD 27 5A 92 4C 06
+F3 23 30 41 19 43 3A 43 8A 10 C2 4A 4E 06 82 93
+46 06 05 24 92 B3 6C 06 FD 27 C2 93 4C 06 19 83
+F3 23 5A 42 4C 06 30 41 1A 52 08 20 09 43 1C D3
+F2 40 51 00 19 20 B0 12 CE 5A 34 20 B0 12 54 5B
+7A 90 FE FF 04 24 FA 23 D9 42 4C 06 FF 1D F2 43
+4E 06 03 43 19 53 39 90 01 02 F6 23 F2 43 4E 06
+3C C0 03 00 D2 D3 23 02 30 41 09 43 2C D3 F0 40
+58 00 57 C4 B0 12 CE 5A 15 20 3A 40 FE FF 29 43
+B0 12 58 5B D2 49 00 1E 4E 06 03 43 19 53 39 90
+00 02 F8 23 39 40 03 00 B0 12 56 5B 7A C0 E1 00
+6A 92 DE 27 8C 10 1C 52 4C 06 D2 D3 23 02 87 12
+FC 45 0B 3C 20 53 44 20 45 72 72 6F 72 21 10 5C
+2F 82 8F 4E 02 00 9F 42 DA 1D 00 00 B2 40 10 00
+DA 1D 0E 4C B0 12 2A 40 56 43 7A 42 FA 40 CC 49
+56 50 09 7B 53 44 5F 4C 4F 41 44 7D 30 4D 39 4F
+18 42 C4 1D 4A 4E 0E 48 C8 4A 00 00 18 53 30 40
+D0 4D 92 4B 0E 00 22 20 92 4B 10 00 24 20 5A 42
+23 20 58 42 22 20 A2 93 02 20 08 20 59 42 24 20
+89 10 0A 59 88 10 08 58 0A 6A 88 10 08 58 30 41
+82 43 1C 20 92 42 0E 20 1A 20 C2 93 24 20 03 20
+92 93 22 20 14 24 92 42 22 20 D0 04 92 42 24 20
+D2 04 92 42 12 20 C8 04 92 42 E4 04 1A 20 92 42
+E6 04 1C 20 92 52 10 20 1A 20 82 63 1C 20 30 41
+92 4B 0E 00 22 20 92 4B 10 00 24 20 B0 12 80 5C
+5A 4B 03 00 82 5A 1A 20 82 63 1C 20 30 41 09 93
+07 24 F8 90 20 00 00 1E 03 20 18 53 19 83 F9 23
+30 41 1B 42 34 20 82 43 1E 20 B2 90 00 02 20 20
+96 20 BB 80 00 02 12 00 8B 73 14 00 DB 53 03 00
+DB 92 12 20 03 00 11 28 CB 43 03 00 B0 12 52 5C
+B0 12 78 5B 8B 43 10 00 9B 48 00 1E 0E 00 92 93
+02 20 03 24 9B 48 02 1E 10 00 B2 40 00 02 20 20
+8B 93 14 00 0B 20 92 9B 12 00 1E 20 70 2C BB 90
+00 02 12 00 03 2C 92 4B 12 00 20 20 B0 12 C0 5C
+1A 42 1A 20 19 42 1C 20 0A 3F 3C 42 3B 40 40 20
+09 43 CB 93 02 00 10 24 9B 92 24 20 0C 00 04 20
+9B 92 22 20 0A 00 07 24 09 4B 3B 50 18 00 3B 90
+00 21 EF 23 0C 5C 30 41 0C 43 82 4B 34 20 8B 49
+00 00 4A 93 07 34 49 93 05 24 C9 93 02 00 02 34
+5A 59 02 00 CB 4A 02 00 CB 43 03 00 9B 42 1A 20
+04 00 9B 42 1C 20 06 00 18 42 30 20 8B 48 08 00
+9B 48 1A 1E 0A 00 9B 48 14 1E 0C 00 9B 48 1A 1E
+0E 00 9B 48 14 1E 10 00 9B 48 1C 1E 12 00 9B 48
+1E 1E 14 00 82 43 1E 20 6A 93 62 27 CC 37 8B 43
+16 00 7A 93 05 24 99 37 99 52 C2 1D 16 00 95 3F
+19 42 C2 1D 1A 42 BE 1D 0A 89 82 4A 36 20 19 52
+C0 1D 82 49 38 20 B2 40 04 44 78 44 86 3F 1B 42
+34 20 82 43 20 20 0B 93 AE 27 EB 93 02 00 04 20
+B0 12 9C 62 B0 12 64 62 5A 4B 02 00 CB 43 02 00
+2B 4B 82 4B 34 20 5A 53 05 24 9D 37 92 4B 16 00
+1E 20 6B 3F 1E 42 36 20 9F 42 38 20 02 00 B2 40
+86 44 78 44 30 41 C4 4E 85 52 45 41 44 22 5A 43
+19 3C D0 50 86 57 52 49 54 45 22 00 6A 43 12 3C
+20 4D 84 44 45 4C 22 00 6A 42 0C 3C A2 53 05 43
+4C 4F 53 45 B0 12 2E 5E 30 4D B8 4D 85 4C 4F 41
+44 22 7A 43 2F 83 8F 4E 00 00 0E 4A 82 93 B6 1D
+0D 24 87 12 34 40 34 40 32 48 32 48 16 46 34 40
+3E 5C 32 48 34 40 E8 5E 32 48 2A 40 87 12 34 40
+22 00 56 46 E6 5E 3D 41 78 4E 08 5E C8 43 00 00
+1C 43 92 42 2C 20 22 20 92 42 2E 20 24 20 CE 93
+00 00 91 24 FE 90 3A 00 01 00 01 20 2E 53 FE 90
+5C 00 00 00 09 20 1E 53 92 42 02 20 22 20 82 43
+24 20 CE 93 00 00 73 24 82 4E 32 20 B0 12 80 5C
+34 40 20 00 A2 93 02 20 04 24 92 92 22 20 02 20
+02 24 14 42 12 20 B0 12 60 5D 2C 43 0A 43 08 4A
+58 0E 08 58 82 48 30 20 C8 93 00 1E 64 24 39 42
+F8 9E 00 1E 04 20 18 53 19 83 FA 23 1E 53 FE 90
+2E 00 FF FF 1A 24 39 50 03 00 B0 12 DE 5C 07 20
+FE 90 5C 00 FF FF 2B 24 CE 93 FF FF 28 24 1E 42
+32 20 1A 53 3A 90 10 00 DA 23 92 53 1A 20 82 63
+1C 20 14 83 D0 23 2C 42 3E 3C FE 90 2E 00 FE FF
+EE 27 B0 12 DE 5C EB 23 39 40 03 00 F8 9E 00 1E
+04 20 18 53 19 83 FA 23 0A 3C CE 93 FF FF DF 23
+FE 90 5C 00 FF FF DB 23 B0 12 DE 5C D8 23 18 42
+30 20 92 48 1A 1E 22 20 92 48 14 1E 24 20 F8 B0
+10 00 0B 1E 15 24 82 93 24 20 06 20 82 93 22 20
+03 20 92 42 02 20 22 20 CE 93 FF FF 8A 23 92 42
+22 20 2C 20 92 42 24 20 2E 20 8F 43 00 00 03 3C
+2A 4F B0 12 6A 5D 3A 4F 34 40 14 40 3E 4F 0A 93
+06 24 7A 93 14 20 0C 93 03 20 3D 40 98 48 30 4D
+87 12 FC 45 0B 3C 20 4F 70 65 6E 45 72 72 6F 72
+68 45 A0 43 7A 48 E0 45 A8 45 DC 41 0E 5C 1A 93
+B5 20 0C 93 ED 23 30 4D 78 5E 04 52 45 41 44 00
+2F 83 8F 4E 00 00 1E 42 34 20 B0 12 F2 5C 1E 82
+34 20 30 4D 2C 43 12 12 2A 20 18 42 02 20 08 58
+2A 41 82 9A 0A 20 A0 24 B0 12 78 5B 09 43 28 93
+03 24 89 93 02 1E 03 20 89 93 00 1E 07 24 09 58
+39 90 00 02 F4 23 91 53 00 00 EA 3F 0C 43 6A 41
+B9 43 00 1E 28 93 0F 24 B9 40 FF 0F 02 1E 09 11
+8A 10 09 5A 5A 41 01 00 0A 11 09 10 82 4A 28 20
+82 49 26 20 07 3C 09 11 C2 49 26 20 C2 4A 27 20
+82 43 28 20 3A 41 82 4A 2A 20 30 41 0A 12 1A 52
+08 20 B0 12 BA 5B 3A 41 1A 52 0C 20 30 40 BA 5B
+F2 B0 40 00 A2 04 29 20 F2 B0 10 00 A2 04 FC 27
+5A 42 B0 04 4A 11 59 42 B4 04 F2 40 20 00 C0 04
+D2 42 B1 04 C8 04 1A 52 E4 04 D2 42 B5 04 C8 04
+19 52 E4 04 D2 42 B2 04 C0 04 B2 40 00 08 C8 04
+1A 52 E4 04 92 42 B6 04 C0 04 B2 80 BC 07 C0 04
+B2 40 00 02 C8 04 19 52 E4 04 30 41 22 2A 2B 2C
+2F 3A 3B 3C 3D 3E 3F 5B 5C 5D 7C 2E 29 92 06 38
+39 80 03 00 B0 12 BA 61 39 40 03 00 7A 4B C8 4A
+00 1E 0A 93 12 24 0D 12 3D 40 0F 00 3C 40 6C 61
+7A 9C F4 27 1D 83 FC 23 3D 41 6A 9C E7 27 3A 80
+21 00 EC 3B 18 53 19 83 E9 23 09 93 06 24 F8 40
+20 00 00 1E 18 53 19 83 FA 23 30 41 2A 93 EB 20
+2C 93 0D 24 0C 93 BA 24 87 12 FC 45 0C 3C 20 57
+72 69 74 65 45 72 72 6F 72 00 DC 41 50 60 B0 12
+84 60 92 42 26 20 22 20 92 42 28 20 24 20 B0 12
+FC 60 B0 12 60 5D 18 42 30 20 F8 40 20 00 0B 1E
+B0 12 10 61 88 43 0C 1E 88 4A 0E 1E 88 49 10 1E
+88 49 12 1E 98 42 24 20 14 1E 98 42 22 20 1A 1E
+88 43 1C 1E 88 43 1E 1E 1C 43 1B 42 32 20 CB 93
+00 00 CA 27 FB 90 2E 00 00 00 C6 27 39 40 0B 00
+B0 12 8C 61 B0 12 A6 62 2A 43 B0 12 6A 5D 0C 93
+BB 23 30 4D 1A 4B 04 00 19 4B 06 00 B0 12 7E 5B
+B0 12 10 61 18 4B 08 00 88 49 12 1E 88 4A 16 1E
+88 49 18 1E 98 4B 12 00 1C 1E 98 4B 14 00 1E 1E
+1A 4B 04 00 19 4B 06 00 30 40 BC 5B 9B 52 1E 20
+12 00 8B 63 14 00 1A 42 1A 20 19 42 1C 20 30 40
+BC 5B B2 40 00 02 1E 20 1B 42 34 20 B0 12 9C 62
+82 43 1E 20 DB 53 03 00 DB 92 12 20 03 00 22 20
+CB 43 03 00 B0 12 52 5C 08 12 0A 12 B0 12 84 60
+2A 91 05 24 B0 12 FC 60 2A 41 B0 12 78 5B 3A 41
+38 41 98 42 26 20 00 1E 92 93 02 20 03 24 98 42
+28 20 02 1E B0 12 FC 60 9B 42 26 20 0E 00 9B 42
+28 20 10 00 30 40 C0 5C 84 5E 05 57 52 49 54 45
+B0 12 B2 62 30 4D 6A 60 07 53 44 5F 45 4D 49 54
+B2 90 00 02 1E 20 02 28 B0 12 B2 62 18 42 1E 20
+C8 4E 00 1E 92 53 1E 20 3E 4F 30 4D 58 4B 13 00
+59 4B 14 00 89 10 09 58 58 4B 15 00 5B 42 12 20
+0A 43 3C 42 08 11 09 10 4A 10 1C 83 0B 11 FA 2B
+0A 11 1C 83 FD 37 1B 42 34 20 19 5B 0A 00 18 6B
+0C 00 8B 49 0E 00 8B 48 10 00 CB 4A 03 00 1A 4B
+12 00 BB C0 FF 01 12 00 3A F0 FF 01 82 4A 1E 20
+B0 12 5C 5D 30 4D 0C 93 38 20 38 90 E0 01 03 2C
+C8 93 20 1E 02 24 7C 40 E5 00 C8 4C 00 1E B0 12
+A6 62 B0 12 5E 5C 82 4A 2A 20 0B 4A B0 12 78 5B
+1A 48 00 1E 88 43 00 1E 92 93 02 20 09 24 19 48
+02 1E 88 43 02 1E 39 F0 FF 0F 39 90 FF 0F 02 20
+3A 93 0E 24 82 4A 22 20 82 49 24 20 B0 12 5E 5C
+0B 9A E6 27 0A 12 0A 4B B0 12 FC 60 3A 41 DD 3F
+0A 4B B0 12 FC 60 B0 12 2E 5E 30 4D D0 4C 08 54
+45 52 4D 32 53 44 22 00 87 12 98 5E A0 43 30 64
+21 53 2F 83 AF 43 00 00 3D 40 40 64 30 40 E8 5E
+42 64 92 C3 DC 05 08 43 B0 12 BA 44 92 B3 DC 05
+FD 27 59 42 CC 05 69 92 0D 24 C8 49 00 1E 18 53
+38 90 FF 01 F3 2B 03 24 B0 12 B2 62 EC 3F B0 12
+CC 44 EC 3F B0 12 CC 44 82 48 1E 20 B0 12 2E 5E
+3D 41 30 4D
+@FFB4
+E8 50 E8 50 E8 50 E8 50 E8 50 E8 50 E8 50 E8 50
+E8 50 E8 50 E8 50 E8 50 E8 50 E8 50 E8 50 E8 50
+E8 50 E8 50 E8 50 E8 50 E8 50 E8 50 E8 50 E8 50
+E8 50 E8 50 E8 50 E8 50 E8 50 E8 50 FA 44 E8 50
+E8 50 E8 50 E8 50 E8 50 E8 50 E8 50
+q
@1800
-10 00 E6 44 80 3E 00 24 FD FF 18 00 5E 65 F0 51
-A6 44 B8 44 EA 59 28 5A
+10 00 FA 44 80 3E 00 24 05 00 18 00 38 66 52 53
+BA 44 CC 44 32 5D 70 5D
@1DAA
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 40
03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
44 55 50 00 0E 93 F6 23 30 4D 40 40 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 40 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E 40 02 3E 52 00 0E 12 3E 4F 30 4D 8E 40
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 40
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C 40 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 40 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 41
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 40 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA 40 03 41 4E 44 3E FF 30 4D 7A 40 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E 41 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 41 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E 41 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 41 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 40 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
+50 00 3E 4F 30 4D 00 00 03 4E 49 50 2F 53 30 4D
+00 00 04 53 57 41 50 00 2A 4F 8F 4E 00 00 0E 4A
+30 4D 68 40 04 4F 56 45 52 00 8F 4E FE FF 2E 4F
+2F 83 30 4D 72 40 03 52 4F 54 2A 4F 8F 4E 00 00
+1E 4F 02 00 8F 4A 02 00 30 4D 4E 40 02 3E 52 00
+0E 12 3E 4F 30 4D 96 40 02 52 3E 00 2F 83 8F 4E
+00 00 3E 41 30 4D B8 40 02 52 40 00 2F 83 8F 4E
+00 00 2E 41 30 4D 5C 40 05 44 45 50 54 48 8F 4E
+FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D 00 00
+01 40 2E 4E 30 4D F0 40 01 21 BE 4F 00 00 3E 4F
+30 4D 00 00 02 43 40 00 6E 4E 30 4D 04 41 02 43
+21 00 FE 4F 00 00 1F 53 3E 4F 30 4D 00 00 01 2B
+3E 5F 30 4D 30 40 01 2D 3E 8F 3E E3 1E 53 30 4D
+F8 40 03 41 4E 44 3E FF 30 4D 84 40 02 4F 52 00
+3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D 3C 41
+06 4E 45 47 41 54 45 00 E8 3F 32 41 03 41 42 53
+0E 93 E3 33 30 4D D8 40 04 44 41 42 53 00 3E F3
+06 34 BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D
+00 00 02 30 3D 00 1E 83 0E 7E 30 4D 82 41 02 30
+3C 00 0E 5E 0E 7E 3E E3 30 4D 8E 41 02 30 3E 00
+1E 93 05 34 0B 3C 00 00 01 3D 3E 8F 07 20 3E 43
+30 4D A8 41 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
+AC 40 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE 41 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 41 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 41 03 3E 49 4E 85 12 C2 1D 10 41
-04 42 41 53 45 00 85 12 DA 1D C0 40 05 53 54 41
-54 45 85 12 B6 1D 30 42 02 42 4C 00 85 12 20 00
-94 41 02 3C 23 00 B2 40 AA 1D AA 1D 30 4D 1E 15
-0E 43 3D 40 20 00 0A 93 04 20 0D 11 0A 4C 0C 43
-09 43 0E 9B 01 28 0E 8B 09 69 08 68 1D 83 07 30
-0C 5C 0A 6A 0E 6E F5 2B 0E 8B 12 D3 F5 3F 0A 4E
-1D 17 30 41 48 42 01 23 1B 42 DA 1D 2C 4F 0A 4E
-B0 12 5E 42 8F 49 00 00 0E 48 7A 90 0A 00 02 28
-3A 50 07 00 3A 50 30 00 92 83 AA 1D 18 42 AA 1D
-C8 4A 00 00 30 4D 96 42 02 23 53 00 87 12 98 42
-D2 42 2D 83 09 93 E0 23 0E 93 DE 23 3D 41 30 4D
-C8 42 02 23 3E 00 9F 42 AA 1D 00 00 3E 40 AA 1D
-2E 8F 30 4D 00 42 04 48 4F 4C 44 00 0A 4E 3E 4F
-DB 3F 3C 42 04 53 49 47 4E 00 0E 93 3E 4F 3A 40
-2D 00 D2 33 30 4D F4 41 03 55 44 2E 87 12 56 42
-CC 42 E6 42 CC 45 94 45 2A 40 18 43 02 55 2E 00
-2F 83 8F 4E 00 00 0E 43 F1 3F 3E B0 00 80 06 24
-BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D DA 40
-02 44 2E 00 87 12 56 42 6E 40 80 40 3A 43 CC 42
-92 40 0A 43 E6 42 CC 45 94 45 2A 40 52 41 01 2E
-3E B0 00 80 DD 27 2F 83 3E 43 EC 3F F6 42 04 48
-45 52 45 00 2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D
-62 41 05 41 4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D
-E2 42 02 43 2C 00 1A 42 C4 1D CA 4E 00 00 92 53
-C4 1D 3E 4F 30 4D 2F 83 8F 4E 00 00 B0 12 A6 44
-92 B3 DC 05 FD 27 1E 42 CC 05 B0 12 B8 44 30 4D
-30 40 B6 43 7E 43 05 28 4B 45 59 29 18 42 CC 05
-EA 3F 12 42 03 4B 45 59 30 40 DC 43 0D 12 3D 40
-18 44 1B 42 34 20 9B 42 1E 20 16 00 3A 40 00 21
-BF 40 50 00 00 00 8F 4A 02 00 0E 43 82 93 20 20
-13 24 19 42 1E 20 02 3C 1A 44 2D 83 19 92 20 20
-16 2C 58 49 00 1E 19 53 78 90 20 00 08 2C 78 90
-0A 00 F4 23 82 49 1E 20 2F 53 3D 41 30 4D 8F 9E
-00 00 64 24 CA 48 00 00 1A 53 1E 53 5F 3C 0A 12
-B0 12 54 5B 3A 41 DA 3F 92 43 06 41 43 43 45 50
-54 00 30 40 72 44 D6 43 08 28 41 43 43 45 50 54
-29 00 3C 40 24 45 3B 40 EE 44 2D 15 0A 4E 2E 4F
-0A 5E 3B 40 0D 00 3C 40 20 00 3D 40 18 45 92 B3
-DC 05 05 24 18 42 CC 05 38 90 0A 00 04 20 21 53
-39 40 D2 44 4D 15 B2 40 11 00 CE 05 A2 B3 DC 05
-FD 27 E2 C2 23 02 30 41 B2 40 13 00 CE 05 A2 B3
-DC 05 FD 27 E2 D2 23 02 30 41 00 00 05 53 4C 45
-45 50 30 40 E0 44 00 00 07 28 53 4C 45 45 50 29
-12 D2 0A 18 F6 3F 21 52 3A 17 58 42 CC 05 48 9B
-E3 27 48 9C 06 2C 78 92 11 20 2E 9F 0F 24 1E 83
-05 3C 0E 9A 03 24 CE 48 00 00 1E 53 82 48 CE 05
-A2 B3 DC 05 FD 27 30 4D 1A 45 2D 83 92 B3 DC 05
-FD 27 E3 23 B2 40 18 00 0A 18 3E 8F 3D 41 30 4D
-68 44 06 28 45 4D 49 54 29 00 08 4E 3E 4F E6 3F
-50 43 04 45 4D 49 54 00 30 40 3A 45 42 45 04 45
-43 48 4F 00 B2 40 82 48 0C 45 30 4D 6E 43 06 4E
-4F 45 43 48 4F 00 B2 40 30 4D 0C 45 30 4D 32 45
-04 28 43 52 29 00 2F 83 8F 4E 00 00 3E 40 0D 00
-E3 3F A2 43 02 43 52 00 30 40 76 45 04 43 05 53
-50 41 43 45 2F 83 8F 4E 00 00 3E 40 20 00 D4 3F
-8E 45 06 53 50 41 43 45 53 00 0E 93 09 24 0D 12
-3D 40 B6 45 EF 3F B8 45 2D 83 1E 83 EB 23 3D 41
-3E 4F 30 4D 2C 43 04 54 59 50 45 00 0E 93 95 24
-2A 4F 8F 5E 00 00 0E 4A 87 12 CA 41 02 42 0A 41
-48 45 EC 41 DC 45 2A 40 2F 82 8F 4E 02 00 7E 4D
-8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D A2 45 82 53
-22 00 87 12 34 40 E8 45 1E 48 34 40 22 00 42 46
-12 46 3D 41 6E 4E 1E 83 82 5E C4 1D 3E 4F 92 B3
-C4 1D A2 63 C4 1D 30 4D 5E 45 82 2E 22 00 87 12
-02 46 34 40 CC 45 1E 48 2A 40 00 00 04 57 4F 52
-44 00 3C 40 BE 1D 39 4C 3A 4C 09 5A 3A 5C 28 4C
-09 9A 19 24 7E 9A FC 27 1A 83 3B 40 60 00 C8 4C
-00 00 09 9A 0C 24 7C 4A 4E 9C 09 24 18 53 4B 9C
-F6 2F 7C 90 7B 00 F3 2F 7C 80 20 00 F0 3F 1A 82
-C0 1D 82 4A C2 1D 1E 42 C4 1D 08 8E CE 48 00 00
-30 4D 00 00 04 46 49 4E 44 00 2F 83 0C 4E 65 4C
-74 40 80 00 3B 40 CA 1D 3E 4B 0E 93 1E 24 58 4C
-01 00 78 F0 1E 00 0E 58 2E 53 1E 4E FE FF 0E 93
-F3 27 09 4E 78 49 48 C4 48 95 F7 23 0A 4C 1A 53
-FA 99 00 00 F2 23 58 83 FA 23 19 B3 09 63 0C 49
-6A 4E 1E 43 4A 93 01 30 2E 83 8F 4C 00 00 35 40
-08 40 34 40 14 40 30 4D 2F 53 2F 53 3E 4F 30 4D
-26 42 07 3E 4E 55 4D 42 45 52 3C 4F 38 4F 29 4F
-2F 82 1B 42 DA 1D 6A 4C 7A 80 30 00 7A 90 0A 00
-02 28 7A 80 07 00 0A 9B 13 2C 82 49 D0 04 82 48
-D2 04 82 4B C8 04 19 42 E4 04 18 42 E6 04 09 5A
-08 63 1C 53 1E 83 E7 23 8F 49 04 00 8F 48 02 00
-8F 4C 00 00 30 4D 03 12 0D 12 1B 42 DA 1D 0B 12
-32 C0 00 02 6D 4E 0D 5E 0C 4E 7A 40 2E 00 0D 9C
-0A 28 7A 9C FC 23 32 D0 00 02 FC 4C FE FF 0D 9C
-FC 2F DE 83 00 00 09 43 08 43 3D 40 CC 47 3F 82
-8F 4E 06 00 0C 4E 7E 4C 6A 4C 7A 90 2D 00 10 2C
-3B 40 10 00 7A 80 24 00 06 24 2B 43 5A 83 03 24
-3B 52 6A 53 B0 23 1C 53 1E 83 6A 4C 7A 90 2D 00
-AA 23 1C 53 1E 83 B1 43 04 00 A5 3F CE 47 2F 53
-0E 93 2C 17 82 4C DA 1D 03 24 2F 52 0E F3 30 4D
-9F 4F 02 00 04 00 BF 4F 00 00 3E E3 09 20 3E E3
-BF E3 02 00 BF E3 00 00 9F 53 02 00 8F 63 00 00
-32 B0 00 02 01 20 2F 53 30 4D 4E 45 07 45 58 45
-43 55 54 45 0A 4E 3E 4F 00 4A 28 41 01 2C 1A 42
-C4 1D A2 53 C4 1D 8A 4E 00 00 3E 4F 30 4D 1C 48
-87 4C 49 54 45 52 41 4C 82 93 B6 1D 16 24 32 B0
-00 02 09 24 1A 42 C4 1D A2 52 C4 1D BA 40 34 40
-00 00 BA 4F 02 00 1A 42 C4 1D A2 52 C4 1D BA 40
-34 40 00 00 8A 4E 02 00 3E 4F 30 4D 84 45 05 43
-4F 55 4E 54 2F 83 1E 53 8F 4E 00 00 5E 4E FF FF
-30 4D 82 4E BE 1D B2 4F C0 1D 3E 4F 82 43 C2 1D
-87 12 4C 42 42 46 98 48 3D 40 A4 48 FE 22 3D 41
-3E 4F 30 4D A6 48 0A 4E 3E 4F 3D 40 BC 48 53 27
-3D 40 92 48 1A E2 B6 1D B2 27 AC 23 BE 48 3E 4F
-3D 40 92 48 B9 23 DE 53 00 00 68 4E 08 5E F8 40
-3F 00 00 00 3D 40 98 4A CD 3F 0C 48 08 45 56 41
-4C 55 41 54 45 00 39 40 BE 1D 39 12 39 12 39 12
-0D 12 B0 12 2A 40 82 48 FA 48 3D 41 B2 41 C2 1D
-B2 41 C0 1D B2 41 BE 1D 30 4D 7A 41 04 51 55 49
-54 00 31 40 E0 1C B2 40 00 1C 00 1C 82 43 B6 1D
-82 43 08 18 B0 12 2A 40 E8 45 04 0D 6F 6B 20 00
-CC 45 34 40 38 1D 44 40 34 40 50 00 62 44 94 45
-82 48 34 40 7E 1C CE 40 B2 41 E8 45 0D 73 74 61
-63 6B 20 65 6D 70 74 79 20 21 96 49 34 40 30 FF
-84 43 B2 41 E8 45 0B 46 52 41 4D 20 66 75 6C 6C
-20 21 96 49 42 42 F4 40 C0 41 28 49 E8 45 04 0D
-20 20 20 00 BC 41 30 49 5A 44 05 41 42 4F 52 54
-3F 40 80 1C BE 3F 8F 93 02 00 AE 26 B2 40 82 48
-0C 45 1B 42 34 20 0B 93 04 24 CB 43 02 00 2B 4B
-FA 3F B0 12 98 4E 82 43 B4 58 82 43 C0 58 82 43
-CC 58 82 43 FC 58 82 43 08 59 82 43 14 59 A2 B3
-DC 05 FD 27 B2 40 11 00 CE 05 E2 C2 23 02 92 C3
-DC 05 38 40 A0 AA 39 42 19 83 FE 23 18 83 FB 23
-92 B3 DC 05 F4 23 87 12 E8 45 04 1B 5B 37 6D 00
-CC 45 CC 45 E8 45 04 1B 5B 30 6D 00 CC 45 DA 4D
-1C 4E 22 4E 90 49 8A 49 86 41 42 4F 52 54 22 00
-87 12 02 46 34 40 96 49 1E 48 2A 40 94 46 01 27
-87 12 4C 42 42 46 9A 46 C0 41 3E 4A 2A 40 C6 48
-52 42 81 5C 92 42 BE 1D C2 1D 30 4D 87 12 1E 46
-4C 42 42 46 56 4A 08 4E 7A 4E 5A D3 5A 53 0A 58
-19 42 C8 1D 6E 4E 3E F0 1E 00 09 5E 82 48 AE 1D
-82 49 B0 1D 82 4A B2 1D 2A 52 82 4A C4 1D 3E 4F
-3D 41 30 41 87 12 E8 45 0F 73 74 61 63 6B 20 6D
-69 73 6D 61 74 63 68 21 9C 49 82 9F B4 1D F2 23
-18 42 AE 1D 19 42 B0 1D A8 49 FE FF 89 48 00 00
-30 4D 3C 46 08 56 41 52 49 41 42 4C 45 00 B0 12
-4C 4A BA 40 86 12 FC FF EF 3F 6E 48 08 43 4F 4E
-53 54 41 4E 54 00 B0 12 4C 4A BA 40 85 12 FC FF
-8A 4E FE FF 3E 4F E0 3F CC 4A 06 43 52 45 41 54
-45 00 B0 12 4C 4A BA 40 85 12 FC FF 8A 4A FE FF
-D3 3F DC 48 05 44 4F 45 53 3E 1A 42 B2 1D BA 40
-84 12 00 00 8A 4D 02 00 3D 41 30 4D 04 4B 05 44
-45 46 45 52 B0 12 4C 4A BA 40 30 40 FC FF BA 40
-1A 4B FE FF B9 3F 00 00 81 5B 82 43 B6 1D 30 4D
-42 4A 01 5D B2 43 B6 1D 30 4D FE 45 87 52 45 43
-55 52 53 45 19 42 C4 1D 99 42 B2 1D 00 00 A2 53
-C4 1D 30 4D 38 4B 01 3A B0 12 4C 4A BA 40 87 12
-FC FF A2 83 C4 1D B2 43 B6 1D 82 4F B4 1D 30 4D
-66 4B 81 3B 82 93 B6 1D 5D 27 87 12 34 40 2A 40
-1E 48 9A 4A 3A 4B 2A 40 70 45 09 49 4D 4D 45 44
-49 41 54 45 1A 42 AE 1D FA D0 80 00 00 00 30 4D
-BE 4F 02 00 3E 4F 30 4D 9A 4B 82 49 53 00 87 12
-42 42 F4 40 C0 41 D2 4B DE 4B 34 40 B0 4B 1E 48
-2A 40 30 4A B0 4B 2A 40 82 4B 83 5B 27 5D 87 12
-30 4A 34 40 34 40 1E 48 1E 48 2A 40 0C 49 88 50
-4F 53 54 50 4F 4E 45 00 87 12 4C 42 42 46 9A 46
-54 40 C0 41 3E 4A 7E 41 C0 41 18 4C 34 40 34 40
-1E 48 1E 48 34 40 1E 48 1E 48 2A 40 1E 4C 3A 4E
-82 4A C6 1D 2E 4E 82 4E C4 1D 3D 40 10 00 09 4A
-08 49 29 83 18 48 FE FF 0E 98 FC 2B 89 48 00 00
-1D 83 F6 23 2A 4A 0A 93 F0 23 3E 4F 3D 41 30 4D
-BA 4B 82 49 46 00 2F 83 8F 4E 00 00 1E 42 C4 1D
-BE 40 C0 41 00 00 A2 52 C4 1D 2E 53 30 4D 1E 4B
-84 45 4C 53 45 00 1A 42 C4 1D BA 40 BC 41 00 00
-2A 52 82 4A C4 1D 8E 4A 00 00 2A 83 0E 4A 30 4D
-C6 45 84 54 48 45 4E 00 9E 42 C4 1D 00 00 3E 4F
-30 4D EA 4A 85 42 45 47 49 4E 30 40 84 43 92 4C
-85 55 4E 54 49 4C 39 40 C0 41 1A 42 C4 1D A2 52
-C4 1D 8A 49 00 00 8A 4E 02 00 3E 4F 30 4D 18 4A
-85 41 47 41 49 4E 39 40 BC 41 EF 3F B4 4A 85 57
-48 49 4C 45 87 12 56 4C 6E 40 2A 40 4C 4B 86 52
-45 50 45 41 54 00 87 12 D6 4C 98 4C 2A 40 70 4C
-82 44 4F 00 2F 83 8F 4E 00 00 1E 42 C4 1D BE 40
-CA 41 00 00 2E 53 82 4E C4 1D A2 53 00 1C 1A 42
-00 1C 8A 43 00 00 30 4D 30 48 84 4C 4F 4F 50 00
-39 40 EC 41 1A 42 C4 1D A2 52 C4 1D 8A 49 00 00
-8A 4E 02 00 1E 42 00 1C A2 83 00 1C 2E 4E 0E 93
-04 24 9E 42 C4 1D 00 00 F5 3F 3E 4F 30 4D E4 43
-85 2B 4C 4F 4F 50 39 40 DA 41 E4 3F 2A 4D 85 4C
-45 41 56 45 1A 42 C4 1D BA 40 FC 41 00 00 BA 40
-BC 41 02 00 B2 50 06 00 C4 1D A2 53 00 1C 2A 52
-19 42 00 1C 89 4A 00 00 30 4D 6E 4D 04 4D 4F 56
-45 00 0A 4E 38 4F 39 4F 3E 4F 0A 93 11 24 08 99
-0F 24 06 2C F8 49 00 00 18 53 1A 83 FB 23 30 4D
-08 5A 09 5A 19 83 18 83 E8 49 00 00 1A 83 FA 23
-30 4D 34 40 CA 1D FC 40 2A 40 84 12 D2 4D 36 52
-0A 65 44 65 2C 65 F4 51 60 4D 34 64 E4 62 40 4E
-E8 64 42 64 32 63 48 41 DA 4B 42 4B 28 63 00 00
-3A 40 0C 00 39 40 CA 1D 38 40 CC 1D D9 3F 3A 40
-0E 00 39 40 CC 1D 38 40 CA 1D CC 3F 82 43 CC 1D
-30 4D 92 42 CA 1D C8 1D 30 4D EE 4B 09 50 57 52
-5F 53 54 41 54 45 84 12 1C 4C F0 51 5E 65 2C 4E
-08 50 57 52 5F 48 45 52 45 00 92 42 C4 1D 3C 4E
-92 42 C6 1D 3A 4E EF 3F EE 4C 09 52 53 54 5F 53
-54 41 54 45 92 42 0C 18 3C 4E 92 42 0E 18 3A 4E
-E2 3F 5A 4E 08 52 53 54 5F 48 45 52 45 00 92 42
-C4 1D 0C 18 92 42 C6 1D 0E 18 DF 3F B2 40 E6 4E
-48 4F B2 40 E0 44 D4 44 B2 40 3A 45 4A 45 B2 40
-76 45 8A 45 B2 40 DC 43 EA 43 B2 40 72 44 64 44
-30 41 DE 4C 04 57 49 50 45 00 39 40 80 FF B9 43
-00 00 29 53 39 90 B4 FF FA 23 B0 12 8C 4E B2 40
-5E 65 C4 1D B2 40 F0 51 C6 1D D1 3F 52 4C 06 28
-57 41 52 4D 29 00 1E 42 08 18 87 12 E8 45 05 0D
-1B 5B 37 6D CC 45 70 43 E8 45 27 20 46 61 73 74
-46 6F 72 74 68 20 56 31 36 30 20 31 36 4D 48 7A
-20 28 43 29 20 4A 2E 4D 2E 54 68 6F 6F 72 65 6E
-73 20 CC 45 34 40 30 FF 84 43 2A 41 30 43 E8 45
-0B 62 79 74 65 73 20 66 72 65 65 20 B2 49 B4 4E
-04 57 41 52 4D 00 30 40 E6 4E A4 4C 04 43 4F 4C
-44 00 B2 40 04 A5 20 01 B2 40 88 5A 5C 01 B2 D0
-03 00 04 02 B2 40 FC FF 02 02 B2 C0 03 00 06 02
-B2 D0 00 04 24 02 B2 D3 26 02 B2 43 22 02 B2 43
-42 02 B2 D3 46 02 B2 43 62 02 B2 D3 66 02 F2 43
-26 03 F2 D3 22 03 F2 40 A5 00 41 01 F2 40 10 00
-40 01 D2 43 41 01 F2 40 A5 00 61 01 B2 40 48 00
-62 01 82 43 66 01 39 40 80 00 B2 40 33 00 64 01
-D2 43 61 01 92 D2 9E 01 08 18 A2 93 08 18 01 24
-59 07 38 40 C2 A2 18 83 FE 23 19 83 FA 23 B2 42
-B0 01 F2 D0 10 00 2A 03 F2 C0 40 00 A2 04 3A 40
-58 4F 39 40 B4 FF 89 4A 00 00 29 53 FC 23 92 42
-02 18 F0 FF B2 40 18 00 0A 18 31 40 E0 1C 3F 40
-80 1C 37 40 00 40 36 40 B4 40 35 40 08 40 34 40
-14 40 B2 40 0A 00 DA 1D B2 43 AC 1D 92 C3 30 01
-18 42 08 18 D2 B3 01 02 04 20 38 E3 18 53 82 48
-08 18 B2 40 81 00 C0 05 B2 40 11 00 C6 05 B2 40
-00 4A C8 05 F2 D0 03 00 0D 02 92 C3 C0 05 92 D3
-DA 05 3D 40 7C 50 18 42 08 18 38 90 0A 00 25 27
-38 90 16 00 22 2F 28 93 F5 22 DD 26 7E 50 E2 B2
-60 02 61 23 B2 40 81 A9 40 06 B2 40 30 00 46 06
-D2 D3 25 02 B2 D0 C0 04 0C 02 B2 C0 C0 04 06 02
-92 C3 40 06 39 40 00 20 89 43 00 00 29 53 39 90
-54 21 FA 23 39 42 B0 12 C2 59 D2 C3 23 02 2C 42
-B2 40 95 00 14 20 B2 40 00 40 18 20 1A 43 B0 12
-86 59 02 24 30 40 60 5A B0 12 C0 59 7A 93 FC 23
-B2 40 87 AA 14 20 92 43 16 20 B2 40 00 48 18 20
-1A 43 B0 12 86 59 29 42 B0 12 C2 59 92 43 14 20
-82 43 16 20 78 43 3C 42 B2 40 00 77 18 20 1A 43
-B0 12 86 59 B2 40 40 69 18 20 B0 12 7C 59 03 24
-58 83 F2 23 D7 3F 0C 5C A2 43 16 20 B2 40 00 50
-18 20 B0 12 7C 59 CE 23 92 D3 40 06 82 43 46 06
-92 C3 40 06 B0 12 E8 59 38 40 00 1E 92 48 C6 01
-04 20 92 48 C8 01 06 20 5A 48 C2 01 92 43 02 20
-7A 80 06 00 0D 24 7A 82 0B 24 A2 43 02 20 6A 53
-07 24 5A 53 05 24 3A 50 0B 20 0C 4A 30 40 66 5A
-B0 12 E8 59 D2 48 0D 00 12 20 19 48 0E 00 82 49
-08 20 1A 48 16 00 0A 93 02 20 1A 48 24 00 82 4A
-0A 20 09 5A 82 49 0C 20 09 5A A2 93 02 20 04 24
-82 49 0E 20 39 50 20 00 19 82 12 20 19 82 12 20
-82 49 10 20 92 42 02 20 2C 20 BD 3E 84 12 D2 4D
-18 58 C4 58 CC 57 18 59 92 57 4C 58 96 54 00 00
-88 57 38 58 EA 57 28 58 A6 55 00 00 00 00 2A 59
-FE 4D DE 4E 85 48 49 32 4C 4F 87 12 84 43 6A 4C
-1E 48 3A 4B 00 4E CC 51 2A 40 4C 4F 04 43 4F 44
-45 00 B0 12 4C 4A A2 82 C4 1D 87 12 7A 4B BC 41
-04 52 00 00 07 45 4E 44 43 4F 44 45 87 12 0E 4E
-9A 4A 2A 40 D0 4C 03 41 53 4D 92 42 C8 1D B8 1D
-B2 40 D0 51 C8 1D E5 3F 24 52 06 45 4E 44 41 53
-4D 00 92 42 B8 1D C8 1D E9 3F 00 00 05 43 4F 4C
-4F 4E 1A 42 C4 1D BA 40 87 12 00 00 A2 53 C4 1D
-B2 43 B6 1D 30 40 0E 4E 00 00 05 4C 4F 32 48 49
-1A 42 C4 1D BA 40 B0 12 00 00 BA 40 2A 40 02 00
-A2 52 C4 1D ED 3F 38 40 BE 1D 39 48 2A 48 09 5A
-1A 52 C2 1D 09 9A 03 24 7E 9A FC 27 1A 83 0E 4A
-2A 88 82 4A C2 1D 30 4D B0 12 2A 40 42 46 9A 46
-72 41 C0 41 CE 52 56 47 C0 41 3E 4A F0 52 D0 52
+0E 93 3E 4F FB 27 2D 53 30 4D 1E 83 0E 7E F9 3F
+39 40 00 80 39 8F 08 4E 3E 4F 08 59 19 15 30 4D
+81 5E 00 00 3E 4F 32 B0 00 01 E8 27 2D 53 21 52
+30 4D 91 53 00 00 F7 3F CE 41 06 55 4E 4C 4F 4F
+50 00 F5 3F 00 00 01 49 2F 83 8F 4E 00 00 2E 41
+1E 81 02 00 30 4D 1E 41 01 4A 2F 83 8F 4E 00 00
+1E 41 04 00 1E 81 06 00 30 4D 9C 41 03 50 41 44
+85 12 E2 1C 1A 42 03 54 49 42 85 12 38 1D 0E 41
+03 43 50 4C 85 12 50 00 C2 41 03 3E 49 4E 85 12
+C2 1D 60 42 04 42 41 53 45 00 85 12 DA 1D C8 40
+05 53 54 41 54 45 85 12 B6 1D 74 42 02 42 4C 00
+85 12 20 00 B4 41 02 3C 23 00 B2 40 AA 1D AA 1D
+30 4D 8C 42 01 23 2C 4F 5B 42 DA 1D 0A 43 34 40
+20 00 0E 93 04 20 04 11 0E 4C 0C 43 09 43 0A 9B
+01 28 0A 8B 09 69 08 68 14 83 07 30 0C 5C 0E 6E
+0A 6A F5 2B 0A 8B 12 D3 F5 3F 34 40 14 40 8F 49
+00 00 0E 48 7A 90 0A 00 02 28 3A 50 07 00 3A 50
+30 00 92 83 AA 1D 18 42 AA 1D C8 4A 00 00 30 4D
+A4 42 02 23 53 00 87 12 A6 42 0C 43 2D 83 09 93
+CA 23 0E 93 C8 23 3D 41 30 4D 02 43 02 23 3E 00
+9F 42 AA 1D 00 00 3E 40 AA 1D 2E 8F 30 4D 26 42
+04 48 4F 4C 44 00 0A 4E 3E 4F DB 3F 80 42 04 53
+49 47 4E 00 0E 93 3E 4F 3A 40 2D 00 D2 33 30 4D
+56 42 02 55 2E 00 87 12 9A 42 34 40 00 00 06 43
+20 43 E0 45 A8 45 2A 40 68 41 02 44 2E 00 87 12
+9A 42 78 40 8A 40 6E 41 06 43 9A 40 44 43 20 43
+E0 45 A8 45 2A 40 50 41 01 2E 0E 93 E4 37 2F 83
+8F 4E 00 00 3E 43 EB 3F 30 43 04 48 45 52 45 00
+2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D 5C 41 05 41
+4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D 1C 43 02 43
+2C 00 1A 42 C4 1D CA 4E 00 00 92 53 C4 1D 3E 4F
+30 4D 2F 83 8F 4E 00 00 B0 12 BA 44 92 B3 DC 05
+FD 27 1E 42 CC 05 B0 12 CC 44 30 4D 9A 43 05 28
+4B 45 59 29 18 42 CC 05 EC 3F 38 42 03 4B 45 59
+30 40 F4 43 0D 12 3D 40 2E 44 1B 42 34 20 9B 42
+1E 20 16 00 3A 40 00 21 8F 4A 02 00 8F 4E 00 00
+0E 43 82 93 20 20 13 24 19 42 1E 20 02 3C 30 44
+2D 83 19 92 20 20 15 2C 58 49 00 1E 19 53 78 90
+20 00 08 2C 78 90 0A 00 F4 23 82 49 1E 20 2F 53
+3D 41 30 4D 2E 9F 64 24 CA 48 00 00 1A 53 1E 53
+5F 3C 0A 12 B0 12 A6 5E 3A 41 DB 3F AE 43 06 41
+43 43 45 50 54 00 30 40 86 44 EE 43 08 28 41 43
+43 45 50 54 29 00 3C 40 38 45 3B 40 02 45 2D 15
+0A 4E 2E 4F 0A 5E 3B 40 0D 00 3C 40 20 00 3D 40
+2C 45 92 B3 DC 05 05 24 18 42 CC 05 38 90 0A 00
+04 20 21 53 39 40 E6 44 4D 15 B2 40 11 00 CE 05
+E2 C2 23 02 A2 B3 DC 05 FD 27 30 41 B2 40 13 00
+CE 05 E2 D2 23 02 A2 B3 DC 05 FD 27 30 41 00 00
+05 53 4C 45 45 50 30 40 F4 44 00 00 07 28 53 4C
+45 45 50 29 12 D2 0A 18 F6 3F 21 52 3A 17 58 42
+CC 05 48 9B E3 27 48 9C 06 2C 78 92 11 20 2E 9F
+0F 24 1E 83 05 3C 0E 9A 03 24 CE 48 00 00 1E 53
+82 48 CE 05 A2 B3 DC 05 FD 27 30 4D 2E 45 2D 83
+92 B3 DC 05 FD 27 E3 23 B2 40 18 00 0A 18 3E 8F
+3D 41 30 4D 7C 44 06 28 45 4D 49 54 29 00 08 4E
+3E 4F E6 3F 6A 43 04 45 4D 49 54 00 30 40 4E 45
+56 45 04 45 43 48 4F 00 B2 40 82 48 20 45 30 4D
+88 43 06 4E 4F 45 43 48 4F 00 B2 40 30 4D 20 45
+30 4D 46 45 04 28 43 52 29 00 2F 83 8F 4E 00 00
+3E 40 0D 00 E3 3F BE 43 02 43 52 00 30 40 8A 45
+3E 43 05 53 50 41 43 45 2F 83 8F 4E 00 00 3E 40
+20 00 D4 3F A2 45 06 53 50 41 43 45 53 00 0E 93
+09 24 0D 12 3D 40 CA 45 EF 3F CC 45 2D 83 1E 83
+EB 23 3D 41 3E 4F 30 4D 52 43 04 54 59 50 45 00
+0E 93 95 24 2A 4F 8F 5E 00 00 0E 4A 87 12 F0 41
+28 42 08 41 5C 45 12 42 F0 45 2A 40 2F 82 8F 4E
+02 00 7E 4D 8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D
+B6 45 82 53 22 00 87 12 34 40 FC 45 32 48 34 40
+22 00 56 46 26 46 3D 41 6E 4E 1E 83 82 5E C4 1D
+3E 4F 92 B3 C4 1D A2 63 C4 1D 30 4D 72 45 82 2E
+22 00 87 12 16 46 34 40 E0 45 32 48 2A 40 00 00
+04 57 4F 52 44 00 3C 40 BE 1D 39 4C 3A 4C 09 5A
+3A 5C 28 4C 09 9A 19 24 7E 9A FC 27 1A 83 3B 40
+60 00 C8 4C 00 00 09 9A 0C 24 7C 4A 4E 9C 09 24
+18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F 7C 80 20 00
+F0 3F 1A 82 C0 1D 82 4A C2 1D 1E 42 C4 1D 08 8E
+CE 48 00 00 30 4D 00 00 04 46 49 4E 44 00 2F 83
+0C 4E 65 4C 74 40 80 00 3B 40 CA 1D 3E 4B 0E 93
+1E 24 58 4C 01 00 78 F0 1E 00 0E 58 2E 53 1E 4E
+FE FF 0E 93 F3 27 09 4E 78 49 48 C4 48 95 F7 23
+0A 4C 1A 53 FA 99 00 00 F2 23 58 83 FA 23 19 B3
+09 63 0C 49 6A 4E 1E 43 4A 93 01 30 2E 83 8F 4C
+00 00 35 40 08 40 34 40 14 40 30 4D 2F 53 2F 53
+3E 4F 30 4D 6A 42 07 3E 4E 55 4D 42 45 52 3C 4F
+38 4F 29 4F 2F 82 1B 42 DA 1D 6A 4C 7A 80 30 00
+7A 90 0A 00 02 28 7A 80 07 00 0A 9B 13 2C 82 49
+D0 04 82 48 D2 04 82 4B C8 04 19 42 E4 04 18 42
+E6 04 09 5A 08 63 1C 53 1E 83 E7 23 8F 49 04 00
+8F 48 02 00 8F 4C 00 00 30 4D 03 12 0D 12 1B 42
+DA 1D 0B 12 32 C0 00 02 6D 4E 0D 5E 0C 4E 7A 40
+2E 00 0D 9C 0A 28 7A 9C FC 23 32 D0 00 02 FC 4C
+FE FF 0D 9C FC 2F DE 83 00 00 09 43 08 43 3D 40
+E0 47 3F 82 8F 4E 06 00 0C 4E 7E 4C 6A 4C 7A 90
+2D 00 10 2C 3B 40 10 00 7A 80 24 00 06 24 2B 43
+5A 83 03 24 3B 52 6A 53 B0 23 1C 53 1E 83 6A 4C
+7A 90 2D 00 AA 23 1C 53 1E 83 B1 43 04 00 A5 3F
+E2 47 2F 53 0E 93 2C 17 82 4C DA 1D 03 24 2F 52
+0E F3 30 4D 9F 4F 02 00 04 00 BF 4F 00 00 3E E3
+09 20 3E E3 BF E3 02 00 BF E3 00 00 9F 53 02 00
+8F 63 00 00 32 B0 00 02 01 20 2F 53 30 4D 62 45
+07 45 58 45 43 55 54 45 0A 4E 3E 4F 00 4A 26 41
+01 2C 1A 42 C4 1D A2 53 C4 1D 8A 4E 00 00 3E 4F
+30 4D 30 48 87 4C 49 54 45 52 41 4C 82 93 B6 1D
+0F 24 1A 42 C4 1D A2 52 C4 1D BA 40 34 40 00 00
+8A 4E 02 00 3E 4F 32 B0 00 02 32 C0 00 02 F1 23
+30 4D 98 45 05 43 4F 55 4E 54 2F 83 1E 53 8F 4E
+00 00 5E 4E FF FF 30 4D 82 4E BE 1D B2 4F C0 1D
+3E 4F 82 43 C2 1D 87 12 90 42 56 46 9E 48 3D 40
+AA 48 05 23 3D 41 3E 4F 30 4D AC 48 0A 4E 3E 4F
+3D 40 C2 48 5A 27 3D 40 98 48 1A E2 B6 1D B9 27
+B3 23 C4 48 3E 4F 3D 40 98 48 C0 23 DE 53 00 00
+68 4E 08 5E F8 40 3F 00 00 00 3D 40 00 4B CD 3F
+20 48 08 45 56 41 4C 55 41 54 45 00 39 40 BE 1D
+3C 49 3B 49 3A 49 3D 15 B0 12 2A 40 88 48 00 49
+B2 41 C2 1D B2 41 C0 1D B2 41 BE 1D 3D 41 30 4D
+4C 42 04 51 55 49 54 00 31 40 E0 1C B2 40 00 1C
+00 1C 82 43 B6 1D 82 43 08 18 B0 12 2A 40 FC 45
+03 0D 6F 6B E0 45 A8 45 5A 42 44 40 64 42 76 44
+A8 45 88 48 DE 40 92 41 FC 45 0D 73 74 61 63 6B
+20 65 6D 70 74 79 21 20 92 49 34 40 30 FF A0 43
+D2 41 FC 45 0B 46 52 41 4D 20 66 75 6C 6C 21 20
+92 49 86 42 F2 40 E0 41 2E 49 FC 45 03 0D 20 20
+DC 41 34 49 6E 44 05 41 42 4F 52 54 3F 40 80 1C
+C3 3F 8F 93 02 00 BA 26 B2 40 82 48 20 45 1B 42
+34 20 0B 93 04 24 CB 43 02 00 2B 4B FA 3F B0 12
+B4 4E A2 B3 DC 05 FD 27 B2 40 11 00 CE 05 E2 C2
+23 02 92 C3 DC 05 38 40 A0 AA 39 42 03 43 19 83
+FD 23 18 83 FA 23 92 B3 DC 05 F3 23 87 12 FC 45
+04 1B 5B 37 6D 00 E0 45 E0 45 FC 45 04 1B 5B 30
+6D 00 E0 45 C2 4D 04 4E 0A 4E 52 4E 8C 49 86 49
+86 41 42 4F 52 54 22 00 87 12 16 46 34 40 92 49
+32 48 2A 40 A8 46 01 27 87 12 90 42 56 46 AE 46
+E0 41 26 4A 2A 40 CC 48 96 42 81 5C 92 42 BE 1D
+C2 1D 30 4D 00 00 81 5B 82 43 B6 1D 30 4D 2A 4A
+01 5D B2 43 B6 1D 30 4D 36 4A 83 5B 27 5D 87 12
+18 4A 34 40 34 40 32 48 32 48 2A 40 BE 4F 02 00
+3E 4F 30 4D 84 45 82 49 53 00 87 12 86 42 F2 40
+E0 41 7E 4A 4E 4A 34 40 5C 4A 32 48 2A 40 18 4A
+5C 4A 2A 40 66 4A 09 49 4D 4D 45 44 49 41 54 45
+1A 42 AE 1D FA D0 80 00 00 00 30 4D 12 46 87 52
+45 43 55 52 53 45 19 42 C4 1D 99 42 B2 1D 00 00
+A2 53 C4 1D 30 4D 12 49 88 50 4F 53 54 50 4F 4E
+45 00 87 12 90 42 56 46 AE 46 54 40 E0 41 26 4A
+92 41 E0 41 E2 4A 34 40 34 40 32 48 32 48 34 40
+32 48 32 48 2A 40 82 9F B4 1D A0 24 87 12 FC 45
+0F 73 74 61 63 6B 20 6D 69 73 6D 61 74 63 68 21
+98 49 87 12 32 46 90 42 56 46 0C 4B 08 4E 7A 4E
+5A D3 5A 53 0A 58 19 42 C8 1D 6E 4E 3E F0 1E 00
+09 5E 82 48 AE 1D 82 49 B0 1D 82 4A B2 1D 2A 52
+82 4A C4 1D 3E 4F 3D 41 30 41 50 46 08 56 41 52
+49 41 42 4C 45 00 B0 12 02 4B BA 40 86 12 FC FF
+71 3C 74 48 08 43 4F 4E 53 54 41 4E 54 00 B0 12
+02 4B BA 40 85 12 FC FF 8A 4E FE FF 3E 4F 62 3C
+54 4B 06 43 52 45 41 54 45 00 B0 12 02 4B BA 40
+85 12 FC FF 8A 4A FE FF 55 3C E2 48 05 44 4F 45
+53 3E 1A 42 B2 1D BA 40 84 12 00 00 8A 4D 02 00
+3D 41 30 4D 8C 4B 05 44 45 46 45 52 B0 12 02 4B
+BA 40 30 40 FC FF BA 40 A2 4B FE FF 3B 3C 4A 4A
+01 3A B0 12 02 4B BA 40 87 12 FC FF A2 83 C4 1D
+B2 43 B6 1D 82 4F B4 1D 30 4D C0 4B 81 3B 82 93
+B6 1D 24 27 87 12 34 40 2A 40 32 48 E6 4A 38 4A
+2A 40 F4 4B 3D 41 B2 4E 0E 18 A2 4E 0C 18 3E 4F
+32 3D 44 48 06 4D 41 52 4B 45 52 00 B0 12 02 4B
+BA 40 84 12 FC FF BA 40 F2 4B FE FF 9A 42 C6 1D
+00 00 28 83 8A 48 02 00 A2 52 C4 1D 18 42 AE 1D
+19 42 B0 1D A8 49 FE FF 89 48 00 00 30 4D 86 4A
+82 49 46 00 2F 83 8F 4E 00 00 1E 42 C4 1D A2 52
+C4 1D BE 40 E0 41 00 00 2E 53 30 4D A6 4B 84 45
+4C 53 45 00 A2 52 C4 1D 1A 42 C4 1D BA 40 DC 41
+FC FF 8E 4A 00 00 2A 83 0E 4A 30 4D DA 45 84 54
+48 45 4E 00 9E 42 C4 1D 00 00 3E 4F 30 4D 72 4B
+85 42 45 47 49 4E 30 40 A0 43 7E 4C 85 55 4E 54
+49 4C 39 40 E0 41 A2 52 C4 1D 1A 42 C4 1D 8A 49
+FC FF 8A 4E FE FF 3E 4F 30 4D 00 4A 85 41 47 41
+49 4E 39 40 DC 41 EF 3F 3C 4B 85 57 48 49 4C 45
+87 12 44 4C 78 40 2A 40 9E 4A 86 52 45 50 45 41
+54 00 87 12 C2 4C 84 4C 2A 40 5E 4C 82 44 4F 00
+2F 83 8F 4E 00 00 A2 53 C4 1D 1E 42 C4 1D BE 40
+F0 41 FE FF A2 53 00 1C 1A 42 00 1C 8A 43 00 00
+30 4D 04 4C 84 4C 4F 4F 50 00 39 40 12 42 A2 52
+C4 1D 1A 42 C4 1D 8A 49 FC FF 8A 4E FE FF 1E 42
+00 1C A2 83 00 1C 2E 4E 0E 93 03 24 8E 4A 00 00
+F6 3F 3E 4F 30 4D FC 43 85 2B 4C 4F 4F 50 39 40
+00 42 E5 3F 14 4D 85 4C 45 41 56 45 1A 42 C4 1D
+BA 40 22 42 00 00 BA 40 DC 41 02 00 B2 50 06 00
+C4 1D A2 53 00 1C 2A 52 19 42 00 1C 89 4A 00 00
+30 4D 56 4D 04 4D 4F 56 45 00 0A 4E 38 4F 39 4F
+3E 4F 0A 93 11 24 08 99 0F 24 06 2C F8 49 00 00
+18 53 1A 83 FB 23 30 4D 08 5A 09 5A 19 83 18 83
+E8 49 00 00 1A 83 FA 23 30 4D 34 40 CA 1D FA 40
+2A 40 84 12 BA 4D 98 53 52 60 46 60 16 4A 56 53
+48 4D 60 60 08 5B 76 4E DC 64 D2 65 CE 64 46 41
+E6 5D 40 4A 1C 5B 00 00 3A 40 0E 00 39 40 CA 1D
+38 40 CC 1D D9 3F 3A 40 0E 00 39 40 CC 1D 38 40
+CA 1D CC 3F 82 43 CC 1D 30 4D 92 42 CA 1D C8 1D
+30 4D 14 4E 3A 4E 82 4A C6 1D 2E 4E 82 4E C4 1D
+3D 40 10 00 09 4A 08 49 29 83 18 48 FE FF 0E 98
+FC 2B 89 48 00 00 1D 83 F6 23 2A 4A 0A 93 F0 23
+3E 4F 3D 41 30 4D B8 4A 09 50 57 52 5F 53 54 41
+54 45 84 12 12 4E 52 53 38 66 DA 4C 09 52 53 54
+5F 53 54 41 54 45 92 42 0E 18 56 4E 92 42 0C 18
+58 4E EF 3F 48 4E 08 50 57 52 5F 48 45 52 45 00
+92 42 C6 1D 56 4E 92 42 C4 1D 58 4E 30 4D 5C 4E
+08 52 53 54 5F 48 45 52 45 00 92 42 C6 1D 0E 18
+92 42 C4 1D 0C 18 EC 3F B2 40 42 50 A4 50 B2 40
+F4 44 E8 44 B2 40 4E 45 5E 45 B2 40 8A 45 9E 45
+B2 40 F4 43 02 44 B2 40 86 44 78 44 82 43 14 5A
+82 43 20 5A 82 43 2C 5A 82 43 5C 5A 82 43 68 5A
+82 43 74 5A 30 41 CA 4C 04 57 49 50 45 00 39 40
+80 FF B9 43 00 00 29 53 39 90 B4 FF FA 23 B0 12
+A8 4E B2 40 38 66 0C 18 B2 40 52 53 0E 18 AB 3F
+90 4C 07 43 4F 4D 50 41 52 45 0C 4E 38 4F 3B 4F
+39 4F 0E 4B 0E 5C 0C 24 1B 83 07 30 1C 83 07 30
+19 53 F9 98 FF FF F5 27 02 2C 3E 43 30 4D 1E 43
+30 4D DC 4B 86 5B 54 48 45 4E 5D 00 30 4D 1E 83
+30 4D 44 4F 86 5B 45 4C 53 45 5D 00 87 12 34 40
+01 00 90 42 56 46 7A 48 44 40 E0 41 CA 4F 8A 40
+8A 40 FC 45 04 5B 49 46 5D 00 1A 4F EA 41 88 4F
+0E 47 2C 41 DC 41 BE 4F 8A 40 8A 40 FC 45 06 5B
+45 4C 53 45 5D 00 1A 4F EA 41 AC 4F 0E 47 4E 4F
+44 40 E0 41 A8 4F 2C 41 DC 41 BE 4F FC 45 06 5B
+54 48 45 4E 5D 00 1A 4F EA 41 BE 4F 4E 4F 54 40
+EA 41 C6 4F 2A 40 DC 41 62 4F 0E 47 FC 45 03 0D
+6B 6F E0 45 A8 45 5A 42 44 40 64 42 76 44 E0 4F
+82 43 C2 1D 82 4E BE 1D B2 4F C0 1D 3E 4F 3D 40
+62 4F 30 4D 54 4F 84 5B 49 46 5D 00 0E 93 3E 4F
+AD 27 30 4D F6 4F 8B 5B 55 4E 44 45 46 49 4E 45
+44 5D 87 12 90 42 56 46 AE 46 6C 40 86 41 2A 40
+06 50 89 5B 44 45 46 49 4E 45 44 5D 87 12 90 42
+56 46 AE 46 6C 40 2A 40 40 4C 06 28 57 41 52 4D
+29 00 1E 42 08 18 87 12 FC 45 05 0D 1B 5B 37 6D
+E0 45 8A 43 FC 45 27 20 46 61 73 74 46 6F 72 74
+68 20 56 31 36 32 20 31 36 4D 48 7A 20 28 43 29
+20 4A 2E 4D 2E 54 68 6F 6F 72 65 6E 73 20 E0 45
+34 40 30 FF A0 43 28 41 56 43 FC 45 0B 62 79 74
+65 73 20 66 72 65 65 20 AE 49 E8 4E 04 57 41 52
+4D 00 30 40 42 50 12 4F 04 43 4F 4C 44 00 B2 40
+04 A5 20 01 B2 40 88 5A 5C 01 B2 D0 03 00 04 02
+B2 40 FC FF 02 02 B2 C0 03 00 06 02 B2 D0 00 04
+24 02 B2 D3 26 02 B2 43 22 02 B2 43 42 02 B2 D3
+46 02 B2 43 62 02 B2 D3 66 02 F2 43 26 03 F2 D3
+22 03 F2 40 A5 00 41 01 F2 40 10 00 40 01 D2 43
+41 01 F2 40 A5 00 61 01 B2 40 48 00 62 01 82 43
+66 01 39 40 80 00 B2 40 33 00 64 01 D2 43 61 01
+92 D2 9E 01 08 18 A2 93 08 18 01 24 59 07 38 40
+C2 A2 18 83 FE 23 19 83 FA 23 B2 42 B0 01 F2 D0
+10 00 2A 03 F2 40 A5 00 A1 04 F2 C0 40 00 A2 04
+3A 40 B4 50 39 40 B4 FF 89 4A 00 00 29 53 FC 23
+92 42 02 18 F0 FF B2 40 18 00 0A 18 31 40 E0 1C
+3F 40 80 1C 37 40 00 40 36 40 BC 40 35 40 08 40
+34 40 14 40 B2 40 0A 00 DA 1D B2 43 AC 1D 92 C3
+30 01 18 42 08 18 D2 B3 01 02 04 20 38 E3 18 53
+82 48 08 18 B2 40 81 00 C0 05 B2 40 11 00 C6 05
+B2 40 00 4A C8 05 F2 D0 03 00 0D 02 92 C3 C0 05
+92 D3 DA 05 3D 40 DE 51 18 42 08 18 38 90 0A 00
+8E 26 38 90 16 00 8B 2E 28 93 45 22 3A 26 E0 51
+E2 B2 60 02 5E 23 B2 40 81 A9 40 06 B2 40 30 00
+46 06 D2 D3 25 02 B2 D0 C0 04 0C 02 B2 C0 C0 04
+06 02 92 C3 40 06 39 40 00 20 89 43 00 00 29 53
+39 90 54 21 FA 23 39 42 B0 12 0A 5D D2 C3 23 02
+2C 42 B2 40 95 00 14 20 B2 40 00 40 18 20 1A 43
+B0 12 CE 5C 02 24 30 40 A8 5D B0 12 08 5D 7A 93
+FC 23 B2 40 87 AA 14 20 92 43 16 20 B2 40 00 48
+18 20 1A 43 B0 12 CE 5C 29 42 B0 12 0A 5D 92 43
+14 20 82 43 16 20 78 43 3C 42 B2 40 00 77 18 20
+1A 43 B0 12 CE 5C B2 40 40 69 18 20 B0 12 C4 5C
+03 24 58 83 F2 23 D7 3F 0C 5C A2 43 16 20 B2 40
+00 50 18 20 B0 12 C4 5C CE 23 92 D3 40 06 82 43
+46 06 92 C3 40 06 B0 12 30 5D 38 40 00 1E 92 48
+C6 01 04 20 92 48 C8 01 06 20 5A 48 C2 01 92 43
+02 20 7A 80 06 00 0D 24 7A 82 0B 24 A2 43 02 20
+6A 53 07 24 5A 53 05 24 3A 50 0B 20 0C 4A 30 40
+AE 5D B0 12 30 5D D2 48 0D 00 12 20 19 48 0E 00
+82 49 08 20 1A 48 16 00 0A 93 02 20 1A 48 24 00
+82 4A 0A 20 09 5A 82 49 0C 20 09 5A A2 93 02 20
+04 24 82 49 0E 20 39 50 20 00 19 82 12 20 19 82
+12 20 82 49 10 20 92 42 02 20 2C 20 BA 3E 84 12
+BA 4D 78 59 24 5A 2C 59 78 5A F2 58 AC 59 F6 55
+00 00 E8 58 98 59 4A 59 88 59 06 57 00 00 00 00
+8A 5A E6 4D 3A 50 85 48 49 32 4C 4F 87 12 A0 43
+58 4C 32 48 38 4A E8 4D 2E 53 2A 40 A8 50 04 43
+4F 44 45 00 B0 12 02 4B A2 82 C4 1D 87 12 D4 4B
+DC 41 66 53 00 00 07 45 4E 44 43 4F 44 45 87 12
+F6 4D E6 4A 2A 40 BC 4C 03 41 53 4D 92 42 C8 1D
+B8 1D B2 40 32 53 C8 1D E5 3F 86 53 06 45 4E 44
+41 53 4D 00 92 42 B8 1D C8 1D E9 3F 00 00 05 43
+4F 4C 4F 4E 1A 42 C4 1D BA 40 87 12 00 00 A2 53
+C4 1D B2 43 B6 1D 30 40 F6 4D 00 00 05 4C 4F 32
+48 49 1A 42 C4 1D BA 40 B0 12 00 00 BA 40 2A 40
+02 00 A2 52 C4 1D ED 3F 38 40 BE 1D 39 48 2A 48
+09 5A 1A 52 C2 1D 09 9A 03 24 7E 9A FC 27 1A 83
+0E 4A 2A 88 82 4A C2 1D 30 4D B0 12 2A 40 56 46
+AE 46 EA 41 2E 54 6A 47 E0 41 26 4A 50 54 30 54
29 4E 39 90 86 12 02 20 2E 53 30 41 39 90 85 12
03 20 1E 4E 02 00 30 41 39 90 84 12 01 20 2E 52
30 41 19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 40
-29 00 12 12 C2 1D 92 53 C2 1D B0 12 2A 40 42 46
-56 47 C0 41 22 53 18 53 21 53 3E 90 10 00 BB 2D
-30 41 24 53 B2 41 C2 1D 22 D3 30 41 87 12 4C 42
-96 52 34 53 82 43 BC 1D 92 42 C4 1D BA 1D A2 53
+29 00 12 12 C2 1D 92 53 C2 1D B0 12 2A 40 56 46
+6A 47 E0 41 82 54 78 54 21 53 3E 90 10 00 BB 2D
+30 41 84 54 B2 41 C2 1D 22 D3 30 41 87 12 90 42
+F8 53 94 54 82 43 BC 1D 92 42 C4 1D BA 1D A2 53
C4 1D 0A 4E 3E 4F FA 90 23 00 00 00 34 20 92 53
-C2 1D B0 12 B8 52 0E 93 04 20 B2 40 00 03 BC 1D
+C2 1D B0 12 1A 54 0E 93 04 20 B2 40 00 03 BC 1D
27 3C 1E 93 04 20 B2 40 10 03 BC 1D 21 3C 2E 93
04 20 B2 40 20 03 BC 1D 1B 3C 2E 92 04 20 B2 40
20 02 BC 1D 15 3C 3E 92 04 20 B2 40 30 02 BC 1D
0F 3C 3E 93 04 20 B2 40 30 03 BC 1D 09 3C B2 40
30 00 BC 1D 19 42 C4 1D A2 53 C4 1D 89 4E 00 00
3E 4F 3D 41 30 4D FA 90 26 00 00 00 08 20 B2 40
-10 02 BC 1D 92 53 C2 1D 30 12 A4 53 75 3F FA 90
+10 02 BC 1D 92 53 C2 1D 30 12 04 55 76 3F FA 90
40 00 00 00 1A 20 B2 40 20 00 BC 1D 92 53 C2 1D
-B0 12 02 53 0E 20 B2 50 10 00 BC 1D 3E 40 2B 00
-B0 12 02 53 32 24 92 92 BE 1D C2 1D 02 24 92 53
-C2 1D 8E 10 82 5E BC 1D D3 3F B0 12 02 53 F9 23
-B2 50 10 00 BC 1D 3E 40 28 00 B0 12 B8 52 30 12
-F4 53 67 3F 87 12 4C 42 96 52 2C 54 FE 90 26 00
+B0 12 62 54 0E 20 B2 50 10 00 BC 1D 3E 40 2B 00
+B0 12 62 54 32 24 92 92 BE 1D C2 1D 02 24 92 53
+C2 1D 8E 10 82 5E BC 1D D3 3F B0 12 62 54 F9 23
+B2 50 10 00 BC 1D 3E 40 28 00 B0 12 1A 54 30 12
+54 55 67 3F 87 12 90 42 F8 53 8C 55 FE 90 26 00
00 00 3E 40 20 00 04 20 B2 50 82 00 BC 1D C2 3F
-B0 12 02 53 DF 23 B2 50 80 00 BC 1D 3E 40 28 00
-B0 12 B8 52 B0 12 F2 52 D5 23 3D 40 3E 4A 30 4D
-CC 44 04 52 45 54 49 00 87 12 34 40 00 13 1E 48
-2A 40 34 40 2C 00 2C 53 24 54 7C 54 2E 4E 1E D2
-BC 1D 19 42 BA 1D 92 3F 7A 52 03 4D 4F 56 84 12
-72 54 00 40 8A 54 05 4D 4F 56 2E 42 84 12 72 54
-40 40 00 00 03 41 44 44 84 12 72 54 00 50 A4 54
-05 41 44 44 2E 42 84 12 72 54 40 50 B0 54 04 41
-44 44 43 00 84 12 72 54 00 60 BE 54 06 41 44 44
-43 2E 42 00 84 12 72 54 40 60 62 54 04 53 55 42
-43 00 84 12 72 54 00 70 DC 54 06 53 55 42 43 2E
-42 00 84 12 72 54 40 70 EA 54 03 53 55 42 84 12
-72 54 00 80 FA 54 05 53 55 42 2E 42 84 12 72 54
-40 80 5C 52 03 43 4D 50 84 12 72 54 00 90 14 55
-05 43 4D 50 2E 42 84 12 72 54 40 90 4A 52 04 44
-41 44 44 00 84 12 72 54 00 A0 2E 55 06 44 41 44
-44 2E 42 00 84 12 72 54 40 A0 20 55 03 42 49 54
-84 12 72 54 00 B0 4C 55 05 42 49 54 2E 42 84 12
-72 54 40 B0 58 55 03 42 49 43 84 12 72 54 00 C0
-66 55 05 42 49 43 2E 42 84 12 72 54 40 C0 72 55
-03 42 49 53 84 12 72 54 00 D0 80 55 05 42 49 53
-2E 42 84 12 72 54 40 D0 00 00 03 58 4F 52 84 12
-72 54 00 E0 9A 55 05 58 4F 52 2E 42 84 12 72 54
-40 E0 CC 54 03 41 4E 44 84 12 72 54 00 F0 B4 55
-05 41 4E 44 2E 42 84 12 72 54 40 F0 4C 42 2C 53
-D2 55 1A 42 BC 1D B2 F0 70 00 BC 1D 8A 10 3A F0
-0F 00 82 DA BC 1D 4A 3F 06 55 03 52 52 43 84 12
-CC 55 00 10 EA 55 05 52 52 43 2E 42 84 12 CC 55
-40 10 F6 55 04 53 57 50 42 00 84 12 CC 55 80 10
-04 56 03 52 52 41 84 12 CC 55 00 11 12 56 05 52
-52 41 2E 42 84 12 CC 55 40 11 1E 56 03 53 58 54
-84 12 CC 55 80 11 00 00 04 50 55 53 48 00 84 12
-CC 55 00 12 38 56 06 50 55 53 48 2E 42 00 84 12
-CC 55 40 12 8C 55 04 43 41 4C 4C 00 84 12 CC 55
-80 12 34 40 2C 00 2C 53 24 54 6C 56 59 42 BC 1D
+B0 12 62 54 DF 23 B2 50 80 00 BC 1D 3E 40 28 00
+B0 12 1A 54 B0 12 52 54 D5 23 3D 40 26 4A 30 4D
+E0 44 04 52 45 54 49 00 87 12 34 40 00 13 32 48
+2A 40 34 40 2C 00 8C 54 84 55 DC 55 2E 4E 1E D2
+BC 1D 19 42 BA 1D 92 3F DC 53 03 4D 4F 56 84 12
+D2 55 00 40 EA 55 05 4D 4F 56 2E 42 84 12 D2 55
+40 40 00 00 03 41 44 44 84 12 D2 55 00 50 04 56
+05 41 44 44 2E 42 84 12 D2 55 40 50 10 56 04 41
+44 44 43 00 84 12 D2 55 00 60 1E 56 06 41 44 44
+43 2E 42 00 84 12 D2 55 40 60 C2 55 04 53 55 42
+43 00 84 12 D2 55 00 70 3C 56 06 53 55 42 43 2E
+42 00 84 12 D2 55 40 70 4A 56 03 53 55 42 84 12
+D2 55 00 80 5A 56 05 53 55 42 2E 42 84 12 D2 55
+40 80 BE 53 03 43 4D 50 84 12 D2 55 00 90 74 56
+05 43 4D 50 2E 42 84 12 D2 55 40 90 AC 53 04 44
+41 44 44 00 84 12 D2 55 00 A0 8E 56 06 44 41 44
+44 2E 42 00 84 12 D2 55 40 A0 80 56 03 42 49 54
+84 12 D2 55 00 B0 AC 56 05 42 49 54 2E 42 84 12
+D2 55 40 B0 B8 56 03 42 49 43 84 12 D2 55 00 C0
+C6 56 05 42 49 43 2E 42 84 12 D2 55 40 C0 D2 56
+03 42 49 53 84 12 D2 55 00 D0 E0 56 05 42 49 53
+2E 42 84 12 D2 55 40 D0 00 00 03 58 4F 52 84 12
+D2 55 00 E0 FA 56 05 58 4F 52 2E 42 84 12 D2 55
+40 E0 2C 56 03 41 4E 44 84 12 D2 55 00 F0 14 57
+05 41 4E 44 2E 42 84 12 D2 55 40 F0 90 42 8C 54
+32 57 1A 42 BC 1D B2 F0 70 00 BC 1D 8A 10 3A F0
+0F 00 82 DA BC 1D 4A 3F 66 56 03 52 52 43 84 12
+2C 57 00 10 4A 57 05 52 52 43 2E 42 84 12 2C 57
+40 10 56 57 04 53 57 50 42 00 84 12 2C 57 80 10
+64 57 03 52 52 41 84 12 2C 57 00 11 72 57 05 52
+52 41 2E 42 84 12 2C 57 40 11 7E 57 03 53 58 54
+84 12 2C 57 80 11 00 00 04 50 55 53 48 00 84 12
+2C 57 00 12 98 57 06 50 55 53 48 2E 42 00 84 12
+2C 57 40 12 EC 56 04 43 41 4C 4C 00 84 12 2C 57
+80 12 34 40 2C 00 8C 54 84 55 CC 57 59 42 BC 1D
5A 42 BD 1D 82 4A BC 1D BE 90 00 15 00 00 02 20
0A 89 02 3C 09 8A 0A 49 3A 90 10 00 03 2C 5A 0E
-A8 3F 1A 53 0E 4A 87 12 70 43 E8 45 0D 6F 75 74
-20 6F 66 20 62 6F 75 6E 64 73 9C 49 46 56 05 50
-55 53 48 4D 84 12 62 56 00 15 AE 56 04 50 4F 50
-4D 00 84 12 62 56 00 17 4C 42 96 52 CE 56 82 43
+A8 3F 1A 53 0E 4A 87 12 8A 43 FC 45 0D 6F 75 74
+20 6F 66 20 62 6F 75 6E 64 73 98 49 A6 57 05 50
+55 53 48 4D 84 12 C2 57 00 15 0E 58 04 50 4F 50
+4D 00 84 12 C2 57 00 17 90 42 F8 53 2E 58 82 43
BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D 92 53 C2 1D
-3E 40 2C 00 B0 12 2A 40 42 46 56 47 C0 41 3E 4A
-24 54 F4 56 0A 4E 3E 4F 1A 83 2A 92 CA 2F 8A 10
-5A 06 6F 3F 2C 56 04 52 52 43 4D 00 84 12 C8 56
-50 00 06 57 04 52 52 41 4D 00 84 12 C8 56 50 01
-14 57 04 52 4C 41 4D 00 84 12 C8 56 50 02 22 57
-04 52 52 55 4D 00 84 12 C8 56 50 03 85 12 00 3C
-30 57 03 53 3E 3D 85 12 00 38 42 57 02 53 3C 00
-85 12 00 34 BC 56 03 30 3E 3D 85 12 00 30 56 57
+3E 40 2C 00 B0 12 2A 40 56 46 6A 47 E0 41 26 4A
+84 55 54 58 0A 4E 3E 4F 1A 83 2A 92 CA 2F 8A 10
+5A 06 6F 3F 8C 57 04 52 52 43 4D 00 84 12 28 58
+50 00 66 58 04 52 52 41 4D 00 84 12 28 58 50 01
+74 58 04 52 4C 41 4D 00 84 12 28 58 50 02 82 58
+04 52 52 55 4D 00 84 12 28 58 50 03 85 12 00 3C
+90 58 03 53 3E 3D 85 12 00 38 A2 58 02 53 3C 00
+85 12 00 34 1C 58 03 30 3E 3D 85 12 00 30 B6 58
02 30 3C 00 85 12 00 30 00 00 02 55 3C 00 85 12
-00 2C 6A 57 03 55 3E 3D 85 12 00 28 60 57 03 30
-3C 3E 85 12 00 24 7E 57 02 30 3D 00 85 12 00 20
-D8 44 02 49 46 00 1A 42 C4 1D 8A 4E 00 00 A2 53
-C4 1D 0E 4A 30 4D 74 57 04 54 48 45 4E 00 1A 42
+00 2C CA 58 03 55 3E 3D 85 12 00 28 C0 58 03 30
+3C 3E 85 12 00 24 DE 58 02 30 3D 00 85 12 00 20
+EC 44 02 49 46 00 1A 42 C4 1D 8A 4E 00 00 A2 53
+C4 1D 0E 4A 30 4D D4 58 04 54 48 45 4E 00 1A 42
C4 1D 08 4E 3E 4F 09 48 29 53 0A 89 0A 11 3A 90
-00 02 68 2F 88 DA 00 00 30 4D 3C 55 04 45 4C 53
+00 02 68 2F 88 DA 00 00 30 4D 9C 56 04 45 4C 53
45 00 1A 42 C4 1D BA 40 00 3C 00 00 A2 53 C4 1D
-2F 83 8F 4A 00 00 E3 3F A8 57 05 55 4E 54 49 4C
+2F 83 8F 4A 00 00 E3 3F 08 59 05 55 4E 54 49 4C
3A 4F 08 4E 3E 4F 19 42 C4 1D 2A 83 0A 89 0A 11
3A 90 00 FE 47 3B 3A F0 FF 03 08 DA 89 48 00 00
-A2 53 C4 1D 30 4D C0 55 05 41 47 41 49 4E 87 12
-3C 57 F0 57 2A 40 00 00 05 57 48 49 4C 45 87 12
-96 57 6E 40 2A 40 4C 57 06 52 45 50 45 41 54 00
-87 12 3C 57 F0 57 AE 57 2A 40 00 00 03 4A 4D 50
-87 12 30 4A 3C 57 F0 57 2A 40 3E B0 00 10 03 20
+A2 53 C4 1D 30 4D 20 57 05 41 47 41 49 4E 87 12
+9C 58 50 59 2A 40 00 00 05 57 48 49 4C 45 87 12
+F6 58 78 40 2A 40 AC 58 06 52 45 50 45 41 54 00
+87 12 9C 58 50 59 0E 59 2A 40 00 00 03 4A 4D 50
+87 12 18 4A 9C 58 50 59 2A 40 3E B0 00 10 03 20
3E E0 00 04 30 4D 3E 90 00 34 06 28 03 24 3E 40
00 34 30 4D 3E 40 00 38 30 4D 00 00 04 3F 4A 4D
-50 00 87 12 5A 58 30 4A 6E 40 F0 57 2A 40 90 58
+50 00 87 12 BA 59 18 4A 78 40 50 59 2A 40 F0 59
3D 41 08 4E 3E 4F 2A 48 0A 93 04 20 98 42 C4 1D
-00 00 30 4D 88 43 00 00 A4 3F 56 56 03 42 57 31
-84 12 8E 58 00 00 AC 58 03 42 57 32 84 12 8E 58
-00 00 B8 58 03 42 57 33 84 12 8E 58 00 00 D0 58
+00 00 30 4D 88 43 00 00 A4 3F B6 57 03 42 57 31
+84 12 EE 59 00 00 0C 5A 03 42 57 32 84 12 EE 59
+00 00 18 5A 03 42 57 33 84 12 EE 59 00 00 30 5A
3D 41 1A 42 C4 1D 28 4E 08 93 08 20 BA 4F 00 00
A2 53 C4 1D 8E 4A 00 00 3E 4F 30 4D 8E 43 00 00
-61 3F 00 00 03 46 57 31 84 12 CE 58 00 00 F4 58
-03 46 57 32 84 12 CE 58 00 00 00 59 03 46 57 33
-84 12 CE 58 00 00 0C 59 04 47 4F 54 4F 00 87 12
-3C 57 30 4A 14 48 2A 40 7C 58 05 3F 47 4F 54 4F
-87 12 5A 58 30 4A 14 48 2A 40 D2 C3 23 02 E2 B2
-60 02 02 24 30 40 52 4F 1A 52 04 20 19 62 06 20
-92 43 14 20 A2 93 02 20 07 24 0A 5A 49 69 82 4A
-16 20 C2 49 18 20 0A 3C C2 4A 15 20 8A 10 C2 4A
-16 20 C2 49 17 20 89 10 C2 49 18 20 B0 12 C0 59
-7A 93 FC 23 0A 43 39 40 05 00 D2 49 14 20 4E 06
-82 93 46 06 05 24 92 B3 6C 06 FD 27 C2 93 4C 06
-59 83 F3 2F 19 83 0B 30 F2 43 4E 06 82 93 46 06
-03 24 92 B3 6C 06 FD 27 5A 92 4C 06 F3 23 30 41
-19 43 3A 43 8A 10 C2 4A 4E 06 82 93 46 06 05 24
-92 B3 6C 06 FD 27 C2 93 4C 06 19 83 F3 23 5A 42
-4C 06 30 41 1A 52 08 20 09 43 1C D3 F2 40 51 00
-19 20 B0 12 3A 59 34 20 B0 12 C0 59 7A 90 FE FF
-04 24 FA 23 D9 42 4C 06 FF 1D F2 43 4E 06 03 43
-19 53 39 90 01 02 F6 23 F2 43 4E 06 3C C0 03 00
-D2 D3 23 02 30 41 09 43 2C D3 F0 40 58 00 EB C5
-B0 12 3A 59 15 20 3A 40 FE FF 29 43 B0 12 C4 59
-D2 49 00 1E 4E 06 03 43 19 53 39 90 00 02 F8 23
-39 40 03 00 B0 12 C2 59 7A C0 E1 00 6A 92 DE 27
-8C 10 1C 52 4C 06 D2 D3 23 02 87 12 E8 45 0B 3C
-20 53 44 20 45 72 72 6F 72 21 7C 5A 2F 82 8F 4E
-02 00 9F 42 DA 1D 00 00 B2 40 10 00 DA 1D 0E 4C
-B0 12 2A 40 30 43 36 42 FC 40 9C 49 39 4F 18 42
-C4 1D 4A 4E 0E 48 C8 4A 00 00 18 53 30 40 B4 4D
-92 4B 0E 00 22 20 92 4B 10 00 24 20 5A 42 23 20
-58 42 22 20 A2 93 02 20 02 24 08 58 30 41 59 42
-24 20 89 10 0A 59 88 10 08 58 0A 6A 88 10 08 58
-30 41 82 43 1C 20 92 42 0E 20 1A 20 C2 93 24 20
-03 20 92 93 22 20 14 24 92 42 22 20 D0 04 92 42
-24 20 D2 04 92 42 12 20 C8 04 92 42 E4 04 1A 20
-92 42 E6 04 1C 20 92 52 10 20 1A 20 82 63 1C 20
-30 41 92 4B 0E 00 22 20 92 4B 10 00 24 20 B0 12
-E2 5A 5A 4B 03 00 82 5A 1A 20 82 63 1C 20 30 41
-09 93 07 24 F8 90 20 00 00 1E 03 20 18 53 19 83
-F9 23 30 41 1B 42 34 20 82 43 1E 20 B2 90 00 02
-20 20 9A 20 BB 80 00 02 12 00 8B 73 14 00 DB 53
-03 00 DB 92 12 20 03 00 11 28 CB 43 03 00 B0 12
-B0 5A B0 12 E4 59 8B 43 10 00 9B 48 00 1E 0E 00
-92 93 02 20 03 24 9B 48 02 1E 10 00 B2 40 00 02
-20 20 8B 93 14 00 0B 20 92 9B 12 00 1E 20 74 2C
-BB 90 00 02 12 00 03 2C 92 4B 12 00 20 20 B0 12
-22 5B 1A 42 1A 20 19 42 1C 20 0F 3F 3C 42 3B 40
-40 20 09 43 CB 93 02 00 10 24 9B 92 24 20 0C 00
-04 20 9B 92 22 20 0A 00 07 24 09 4B 3B 50 18 00
-3B 90 00 21 EF 23 0C 5C 30 41 0C 43 82 4B 34 20
-8B 49 00 00 4A 93 07 34 49 93 05 24 C9 93 02 00
-02 34 5A 59 02 00 CB 4A 02 00 CB 43 03 00 9B 42
-1A 20 04 00 9B 42 1C 20 06 00 18 42 30 20 8B 48
-08 00 9B 48 1A 1E 0A 00 9B 48 14 1E 0C 00 9B 48
-1A 1E 0E 00 9B 48 14 1E 10 00 9B 48 1C 1E 12 00
-9B 48 1E 1E 14 00 82 43 1E 20 6A 93 62 27 CC 37
-8B 43 16 00 7A 93 05 24 99 37 99 52 C2 1D 16 00
-95 3F 92 42 BE 1D 36 20 92 82 C2 1D 36 20 92 42
-C0 1D 38 20 92 52 C2 1D 38 20 B2 40 EC 43 64 44
-92 42 BE 1D C2 1D 82 3F 1B 42 34 20 82 43 20 20
-0B 93 AA 27 EB 93 02 00 04 20 B0 12 08 61 B0 12
-D0 60 5A 4B 02 00 CB 43 02 00 2B 4B 82 4B 34 20
-5A 53 05 24 99 37 92 4B 16 00 1E 20 67 3F 1E 42
-36 20 9F 42 38 20 02 00 B2 40 72 44 64 44 8C 3F
-74 4E 85 52 45 41 44 22 5A 43 19 3C 40 4F 86 57
-52 49 54 45 22 00 6A 43 12 3C 00 4D 84 44 45 4C
-22 00 6A 42 0C 3C 0C 52 05 43 4C 4F 53 45 B0 12
-98 5C 30 4D 9C 4D 85 4C 4F 41 44 22 7A 43 2F 83
-8F 4E 00 00 0E 4A 82 93 B6 1D 0D 24 87 12 34 40
-34 40 1E 48 1E 48 02 46 34 40 9C 5A 1E 48 34 40
-52 5D 1E 48 2A 40 87 12 34 40 22 00 42 46 50 5D
-3D 41 2F 83 78 4E 08 5E C8 43 00 00 1C 43 92 42
-2C 20 22 20 92 42 2E 20 24 20 CE 93 00 00 96 24
-FE 90 3A 00 01 00 01 20 2E 53 FE 90 5C 00 00 00
-09 20 1E 53 92 42 02 20 22 20 82 43 24 20 CE 93
-00 00 76 24 82 4E 32 20 B0 12 E2 5A BF 40 20 00
-00 00 A2 93 02 20 04 24 92 92 22 20 02 20 03 24
-9F 42 12 20 00 00 B0 12 C2 5B 2C 43 0A 43 08 4A
-58 0E 08 58 82 48 30 20 C8 93 00 1E 67 24 39 42
-F8 9E 00 1E 04 20 18 53 19 83 FA 23 1E 53 FE 90
-2E 00 FF FF 1B 24 39 50 03 00 B0 12 40 5B 07 20
-FE 90 5C 00 FF FF 2C 24 CE 93 FF FF 29 24 1E 42
-32 20 1A 53 3A 90 10 00 DA 23 92 53 1A 20 82 63
-1C 20 9F 83 00 00 CF 23 2C 42 40 3C FE 90 2E 00
-FE FF ED 27 B0 12 40 5B EA 23 39 40 03 00 F8 9E
-00 1E 04 20 18 53 19 83 FA 23 0A 3C CE 93 FF FF
-DE 23 FE 90 5C 00 FF FF DA 23 B0 12 40 5B D7 23
-18 42 30 20 92 48 1A 1E 22 20 92 48 14 1E 24 20
-F8 B0 10 00 0B 1E 16 24 82 93 24 20 06 20 82 93
-22 20 03 20 92 42 02 20 22 20 CE 93 FF FF 87 23
-92 42 22 20 2C 20 92 42 24 20 2E 20 2F 52 3E 4F
-3D 41 30 4D 1A 4F 02 00 B0 12 CC 5B 2F 53 3A 4F
-3E 4F 7A 93 12 20 0C 93 01 20 30 4D 87 12 E8 45
-0B 3C 20 4F 70 65 6E 45 72 72 6F 72 54 45 84 43
-74 48 CC 45 94 45 BC 41 7A 5A 1A 93 B5 20 0C 93
-ED 23 30 4D E2 5C 04 52 45 41 44 00 2F 83 8F 4E
-00 00 1E 42 34 20 B0 12 54 5B 1E 82 34 20 30 4D
-2C 43 12 12 2A 20 18 42 02 20 08 58 2A 41 82 9A
-0A 20 A0 24 B0 12 E4 59 09 43 28 93 03 24 89 93
-02 1E 03 20 89 93 00 1E 07 24 09 58 39 90 00 02
-F4 23 91 53 00 00 EA 3F 0C 43 6A 41 B9 43 00 1E
-28 93 0F 24 B9 40 FF 0F 02 1E 09 11 8A 10 09 5A
-5A 41 01 00 0A 11 09 10 82 4A 28 20 82 49 26 20
-07 3C 09 11 C2 49 26 20 C2 4A 27 20 82 43 28 20
-3A 41 82 4A 2A 20 30 41 0A 12 1A 52 08 20 B0 12
-26 5A 3A 41 1A 52 0C 20 30 40 26 5A F2 B0 40 00
-A2 04 29 20 F2 B0 10 00 A2 04 FC 27 5A 42 B0 04
-4A 11 59 42 B4 04 F2 40 20 00 C0 04 D2 42 B1 04
-C8 04 1A 52 E4 04 D2 42 B5 04 C8 04 19 52 E4 04
-D2 42 B2 04 C0 04 B2 40 00 08 C8 04 1A 52 E4 04
-92 42 B6 04 C0 04 B2 80 BC 07 C0 04 B2 40 00 02
-C8 04 19 52 E4 04 30 41 22 2A 2B 2C 2F 3A 3B 3C
-3D 3E 3F 5B 5C 5D 7C 2E 29 92 06 38 39 80 03 00
-B0 12 26 60 39 40 03 00 7A 4B C8 4A 00 1E 0A 93
-12 24 0D 12 3D 40 0F 00 3C 40 D8 5F 7A 9C F4 27
-1D 83 FC 23 3D 41 6A 9C E7 27 3A 80 21 00 EC 3B
-18 53 19 83 E9 23 09 93 06 24 F8 40 20 00 00 1E
-18 53 19 83 FA 23 30 41 2A 93 E4 20 2C 93 0D 24
-0C 93 BA 24 87 12 E8 45 0C 3C 20 57 72 69 74 65
-45 72 72 6F 72 00 BC 41 BC 5E B0 12 F0 5E 92 42
-26 20 22 20 92 42 28 20 24 20 B0 12 68 5F B0 12
-C2 5B 18 42 30 20 F8 40 20 00 0B 1E B0 12 7C 5F
-88 43 0C 1E 88 4A 0E 1E 88 49 10 1E 88 49 12 1E
-98 42 24 20 14 1E 98 42 22 20 1A 1E 88 43 1C 1E
-88 43 1E 1E 1C 43 1B 42 32 20 CB 93 00 00 CA 27
-FB 90 2E 00 00 00 C6 27 39 40 0B 00 B0 12 F8 5F
-B0 12 12 61 2A 43 B0 12 CC 5B 0C 93 BB 23 30 4D
-1A 4B 04 00 19 4B 06 00 B0 12 EA 59 B0 12 7C 5F
-18 4B 08 00 88 49 12 1E 88 4A 16 1E 88 49 18 1E
-98 4B 12 00 1C 1E 98 4B 14 00 1E 1E 1A 4B 04 00
-19 4B 06 00 30 40 28 5A 9B 52 1E 20 12 00 8B 63
-14 00 1A 42 1A 20 19 42 1C 20 30 40 28 5A B2 40
-00 02 1E 20 1B 42 34 20 B0 12 08 61 82 43 1E 20
-DB 53 03 00 DB 92 12 20 03 00 22 20 CB 43 03 00
-B0 12 B0 5A 08 12 0A 12 B0 12 F0 5E 2A 91 05 24
-B0 12 68 5F 2A 41 B0 12 E4 59 3A 41 38 41 98 42
-26 20 00 1E 92 93 02 20 03 24 98 42 28 20 02 1E
-B0 12 68 5F 9B 42 26 20 0E 00 9B 42 28 20 10 00
-30 40 22 5B EE 5C 05 57 52 49 54 45 B0 12 1E 61
-30 4D D6 5E 07 53 44 5F 45 4D 49 54 B2 90 00 02
-1E 20 02 28 B0 12 1E 61 18 42 1E 20 C8 4E 00 1E
-92 53 1E 20 3E 4F 30 4D 58 4B 13 00 5C 4B 14 00
-8C 10 0C 58 5A 4B 15 00 0A 11 0C 10 18 4B 12 00
-BB C0 FF 01 12 00 38 F0 FF 01 82 48 1E 20 5B 42
-12 20 B0 12 5E 42 1B 42 34 20 CB 4A 03 00 19 5B
-0A 00 18 6B 0C 00 8B 49 0E 00 8B 48 10 00 B0 12
-BE 5B 30 4D 0C 93 38 20 38 90 E0 01 03 2C C8 93
-20 1E 02 24 7C 40 E5 00 C8 4C 00 1E B0 12 12 61
-B0 12 BC 5A 82 4A 2A 20 0B 4A B0 12 E4 59 1A 48
-00 1E 88 43 00 1E 92 93 02 20 09 24 19 48 02 1E
-88 43 02 1E 39 F0 FF 0F 39 90 FF 0F 02 20 3A 93
-0E 24 82 4A 22 20 82 49 24 20 B0 12 BC 5A 0B 9A
-E6 27 0A 12 0A 4B B0 12 68 5F 3A 41 DD 3F 0A 4B
-B0 12 68 5F B0 12 98 5C 30 4D B0 4C 08 54 45 52
-4D 32 53 44 22 00 87 12 02 5D 84 43 8E 62 21 53
-2F 83 AF 43 00 00 3D 40 9E 62 30 40 52 5D A0 62
-92 C3 DC 05 08 43 B0 12 A6 44 92 B3 DC 05 FD 27
-59 42 CC 05 69 92 0D 24 C8 49 00 1E 18 53 38 90
-FF 01 04 24 F2 2B B0 12 1E 61 EC 3F B0 12 B8 44
-EC 3F B0 12 B8 44 82 48 1E 20 B0 12 98 5C 3D 41
-30 4D 2A 46 02 2E 53 00 87 12 34 40 3C 00 48 45
-E0 40 70 43 34 40 08 00 48 45 34 40 3E 00 48 45
-94 45 CE 40 34 40 80 1C B2 41 C0 41 24 63 CE 40
-34 40 7E 1C CA 41 02 42 F4 40 30 43 34 40 FE FF
-DA 41 16 63 2A 40 02 47 01 3F 2E 4E 30 40 30 43
-86 61 05 57 4F 52 44 53 87 12 36 42 F4 40 34 40
-0A 00 36 42 FC 40 88 45 34 40 03 00 AA 45 34 40
-10 00 70 43 E8 45 14 74 68 72 65 61 64 73 20 76
-6F 63 61 62 75 6C 61 72 69 65 73 00 CC 45 36 42
-FC 40 34 40 CA 1D 44 40 6A 4C 6E 40 F4 40 54 40
-C0 41 20 64 88 45 34 40 03 00 AA 45 44 40 34 40
-E2 1C 34 40 10 00 44 40 22 41 A2 4D 34 40 00 00
-44 40 34 40 10 00 44 40 22 41 34 40 00 00 CA 41
-44 40 02 42 34 40 E2 1C 22 41 F4 40 B2 41 C0 41
-D2 63 62 40 62 40 02 42 44 40 34 40 E2 1C 22 41
-F4 40 34 40 02 00 DA 41 B0 63 54 40 C0 41 16 64
-44 40 34 40 02 00 2A 41 F4 40 92 40 34 40 E2 1C
-22 41 FC 40 44 40 74 48 34 40 7F 00 38 41 CC 45
-0A 41 34 40 0F 00 38 41 34 40 10 00 6E 40 2A 41
-AA 45 BC 41 9C 63 62 40 62 40 88 45 BC 41 76 63
-62 40 2A 40 16 5D 03 4D 41 58 2E 9F 07 38 2F 53
-30 4D 26 64 03 4D 49 4E 2E 9F F9 3B 3E 4F 30 4D
-7C 62 03 55 2E 52 87 12 A8 40 56 42 34 40 00 00
-98 42 CC 42 E6 42 B4 40 80 40 2A 41 34 40 00 00
-2A 64 AA 45 CC 45 2A 40 FC 5C 04 44 55 4D 50 00
-0D 12 12 12 DA 1D B2 40 10 00 DA 1D 2E 5F BF F0
-F0 FF 00 00 B0 12 2A 40 6E 40 CA 41 88 45 02 42
-34 40 07 00 46 64 94 45 02 42 34 40 10 00 22 41
-02 42 CA 41 02 42 0A 41 34 40 03 00 46 64 EC 41
-A4 64 94 45 94 45 02 42 34 40 10 00 22 41 02 42
-CA 41 02 42 0A 41 34 40 7E 00 38 64 4C 42 2A 64
-48 45 EC 41 C2 64 34 40 10 00 DA 41 8C 64 B4 40
-36 42 FC 40 2A 40 94 61 06 53 45 43 54 5F 44 00
-09 4E 2A 4F B0 12 EA 59 87 12 1C 43 34 40 00 1E
-34 40 00 02 70 64 2A 40 08 5D 07 43 4C 55 53 54
-5F 44 82 4E 24 20 A2 4F 22 20 B0 12 E2 5A 9F 42
-1A 20 00 00 1E 42 1C 20 E3 3F 2E 4A 05 46 41 54
-5F 44 2F 82 8F 4E 02 00 9F 42 08 20 00 00 0E 43
-D7 3F 6A 64 05 44 49 52 5F 44 2F 82 8F 4E 02 00
-92 42 2C 20 22 20 92 42 2E 20 24 20 DE 3F
+61 3F 00 00 03 46 57 31 84 12 2E 5A 00 00 54 5A
+03 46 57 32 84 12 2E 5A 00 00 60 5A 03 46 57 33
+84 12 2E 5A 00 00 6C 5A 04 47 4F 54 4F 00 87 12
+9C 58 18 4A 28 48 2A 40 DC 59 05 3F 47 4F 54 4F
+87 12 BA 59 18 4A 28 48 2A 40 22 50 09 7B 55 54
+49 4C 49 54 59 7D 30 4D 3E 46 02 2E 53 00 8F 4E
+FE FF 0E 4F 2E 83 8F 4E FA FF 3E 40 80 1C 2E 83
+8F 4E FC FF 3F 80 06 00 2E 8F 0E 11 87 12 34 40
+3C 00 5C 45 8A 43 34 40 08 00 5C 45 34 40 3E 00
+5C 45 A8 45 8A 40 8A 40 C4 41 EA 41 F4 5A 62 40
+62 40 2A 40 F0 41 28 42 F2 40 56 43 34 40 02 00
+00 42 F6 5A 2A 40 AA 5A 03 2E 52 53 8F 4E FE FF
+8F 41 FA FF 3E 40 E0 1C D3 3F 16 47 01 3F 2E 4E
+30 40 56 43 9C 50 05 57 4F 52 44 53 87 12 9C 45
+34 40 03 00 BE 45 34 40 CA 1D F2 40 50 42 34 40
+10 00 44 40 20 41 8A 4D 34 40 00 00 44 40 34 40
+10 00 44 40 20 41 34 40 00 00 F0 41 44 40 28 42
+50 42 20 41 F2 40 D2 41 E0 41 7A 5B 62 40 62 40
+28 42 44 40 50 42 20 41 F2 40 34 40 02 00 00 42
+5C 5B 54 40 E0 41 BC 5B 44 40 34 40 02 00 28 41
+F2 40 9A 40 50 42 20 41 FA 40 44 40 7A 48 34 40
+7F 00 36 41 E0 45 08 41 34 40 0F 00 36 41 34 40
+10 00 78 40 28 41 BE 45 DC 41 48 5B 62 40 2A 40
+84 4D 03 4D 41 58 2E 9F 07 38 2F 53 30 4D C2 5B
+03 4D 49 4E 2E 9F F9 3B 3E 4F 30 4D 9C 4C 03 55
+2E 52 87 12 B0 40 9A 42 34 40 00 00 A6 42 06 43
+20 43 BC 40 8A 40 28 41 34 40 00 00 C6 5B BE 45
+E0 45 2A 40 EC 4C 04 44 55 4D 50 00 0D 12 12 12
+DA 1D B2 40 10 00 DA 1D 2E 5F BF F0 F0 FF 00 00
+B0 12 2A 40 78 40 F0 41 9C 45 28 42 34 40 07 00
+E2 5B A8 45 28 42 34 40 10 00 20 41 28 42 F0 41
+28 42 08 41 34 40 03 00 E2 5B 12 42 40 5C A8 45
+A8 45 28 42 34 40 10 00 20 41 28 42 F0 41 28 42
+08 41 34 40 7E 00 D4 5B 90 42 C6 5B 5C 45 12 42
+5E 5C 34 40 10 00 00 42 28 5C BC 40 7A 42 FA 40
+2A 40 D2 C3 23 02 E2 B2 60 02 02 24 30 40 AE 50
+1A 52 04 20 19 62 06 20 92 43 14 20 A2 93 02 20
+07 24 0A 5A 49 69 82 4A 16 20 C2 49 18 20 0A 3C
+C2 4A 15 20 8A 10 C2 4A 16 20 C2 49 17 20 89 10
+C2 49 18 20 B0 12 08 5D 7A 93 FC 23 0A 43 39 40
+05 00 D2 49 14 20 4E 06 82 93 46 06 05 24 92 B3
+6C 06 FD 27 C2 93 4C 06 59 83 F3 2F 19 83 0B 30
+F2 43 4E 06 82 93 46 06 03 24 92 B3 6C 06 FD 27
+5A 92 4C 06 F3 23 30 41 19 43 3A 43 8A 10 C2 4A
+4E 06 82 93 46 06 05 24 92 B3 6C 06 FD 27 C2 93
+4C 06 19 83 F3 23 5A 42 4C 06 30 41 1A 52 08 20
+09 43 1C D3 F2 40 51 00 19 20 B0 12 82 5C 34 20
+B0 12 08 5D 7A 90 FE FF 04 24 FA 23 D9 42 4C 06
+FF 1D F2 43 4E 06 03 43 19 53 39 90 01 02 F6 23
+F2 43 4E 06 3C C0 03 00 D2 D3 23 02 30 41 09 43
+2C D3 F0 40 58 00 A3 C2 B0 12 82 5C 15 20 3A 40
+FE FF 29 43 B0 12 0C 5D D2 49 00 1E 4E 06 03 43
+19 53 39 90 00 02 F8 23 39 40 03 00 B0 12 0A 5D
+7A C0 E1 00 6A 92 DE 27 8C 10 1C 52 4C 06 D2 D3
+23 02 87 12 FC 45 0B 3C 20 53 44 20 45 72 72 6F
+72 21 C4 5D 2F 82 8F 4E 02 00 9F 42 DA 1D 00 00
+B2 40 10 00 DA 1D 0E 4C B0 12 2A 40 56 43 7A 42
+FA 40 98 49 9C 5A 09 7B 53 44 5F 4C 4F 41 44 7D
+30 4D 39 4F 18 42 C4 1D 4A 4E 0E 48 C8 4A 00 00
+18 53 30 40 9C 4D 92 4B 0E 00 22 20 92 4B 10 00
+24 20 5A 42 23 20 58 42 22 20 A2 93 02 20 08 20
+59 42 24 20 89 10 0A 59 88 10 08 58 0A 6A 88 10
+08 58 30 41 82 43 1C 20 92 42 0E 20 1A 20 C2 93
+24 20 03 20 92 93 22 20 14 24 92 42 22 20 D0 04
+92 42 24 20 D2 04 92 42 12 20 C8 04 92 42 E4 04
+1A 20 92 42 E6 04 1C 20 92 52 10 20 1A 20 82 63
+1C 20 30 41 92 4B 0E 00 22 20 92 4B 10 00 24 20
+B0 12 34 5E 5A 4B 03 00 82 5A 1A 20 82 63 1C 20
+30 41 09 93 07 24 F8 90 20 00 00 1E 03 20 18 53
+19 83 F9 23 30 41 1B 42 34 20 82 43 1E 20 B2 90
+00 02 20 20 96 20 BB 80 00 02 12 00 8B 73 14 00
+DB 53 03 00 DB 92 12 20 03 00 11 28 CB 43 03 00
+B0 12 06 5E B0 12 2C 5D 8B 43 10 00 9B 48 00 1E
+0E 00 92 93 02 20 03 24 9B 48 02 1E 10 00 B2 40
+00 02 20 20 8B 93 14 00 0B 20 92 9B 12 00 1E 20
+70 2C BB 90 00 02 12 00 03 2C 92 4B 12 00 20 20
+B0 12 74 5E 1A 42 1A 20 19 42 1C 20 0A 3F 3C 42
+3B 40 40 20 09 43 CB 93 02 00 10 24 9B 92 24 20
+0C 00 04 20 9B 92 22 20 0A 00 07 24 09 4B 3B 50
+18 00 3B 90 00 21 EF 23 0C 5C 30 41 0C 43 82 4B
+34 20 8B 49 00 00 4A 93 07 34 49 93 05 24 C9 93
+02 00 02 34 5A 59 02 00 CB 4A 02 00 CB 43 03 00
+9B 42 1A 20 04 00 9B 42 1C 20 06 00 18 42 30 20
+8B 48 08 00 9B 48 1A 1E 0A 00 9B 48 14 1E 0C 00
+9B 48 1A 1E 0E 00 9B 48 14 1E 10 00 9B 48 1C 1E
+12 00 9B 48 1E 1E 14 00 82 43 1E 20 6A 93 62 27
+CC 37 8B 43 16 00 7A 93 05 24 99 37 99 52 C2 1D
+16 00 95 3F 19 42 C2 1D 1A 42 BE 1D 0A 89 82 4A
+36 20 19 52 C0 1D 82 49 38 20 B2 40 04 44 78 44
+86 3F 1B 42 34 20 82 43 20 20 0B 93 AE 27 EB 93
+02 00 04 20 B0 12 50 64 B0 12 18 64 5A 4B 02 00
+CB 43 02 00 2B 4B 82 4B 34 20 5A 53 05 24 9D 37
+92 4B 16 00 1E 20 6B 3F 1E 42 36 20 9F 42 38 20
+02 00 B2 40 86 44 78 44 30 41 90 4E 85 52 45 41
+44 22 5A 43 19 3C 26 5B 86 57 52 49 54 45 22 00
+6A 43 12 3C 06 5C 84 44 45 4C 22 00 6A 42 0C 3C
+6E 53 05 43 4C 4F 53 45 B0 12 E2 5F 30 4D D0 5B
+85 4C 4F 41 44 22 7A 43 2F 83 8F 4E 00 00 0E 4A
+82 93 B6 1D 0D 24 87 12 34 40 34 40 32 48 32 48
+16 46 34 40 F2 5D 32 48 34 40 9C 60 32 48 2A 40
+87 12 34 40 22 00 56 46 9A 60 3D 41 78 4E 08 5E
+C8 43 00 00 1C 43 92 42 2C 20 22 20 92 42 2E 20
+24 20 CE 93 00 00 91 24 FE 90 3A 00 01 00 01 20
+2E 53 FE 90 5C 00 00 00 09 20 1E 53 92 42 02 20
+22 20 82 43 24 20 CE 93 00 00 73 24 82 4E 32 20
+B0 12 34 5E 34 40 20 00 A2 93 02 20 04 24 92 92
+22 20 02 20 02 24 14 42 12 20 B0 12 14 5F 2C 43
+0A 43 08 4A 58 0E 08 58 82 48 30 20 C8 93 00 1E
+64 24 39 42 F8 9E 00 1E 04 20 18 53 19 83 FA 23
+1E 53 FE 90 2E 00 FF FF 1A 24 39 50 03 00 B0 12
+92 5E 07 20 FE 90 5C 00 FF FF 2B 24 CE 93 FF FF
+28 24 1E 42 32 20 1A 53 3A 90 10 00 DA 23 92 53
+1A 20 82 63 1C 20 14 83 D0 23 2C 42 3E 3C FE 90
+2E 00 FE FF EE 27 B0 12 92 5E EB 23 39 40 03 00
+F8 9E 00 1E 04 20 18 53 19 83 FA 23 0A 3C CE 93
+FF FF DF 23 FE 90 5C 00 FF FF DB 23 B0 12 92 5E
+D8 23 18 42 30 20 92 48 1A 1E 22 20 92 48 14 1E
+24 20 F8 B0 10 00 0B 1E 15 24 82 93 24 20 06 20
+82 93 22 20 03 20 92 42 02 20 22 20 CE 93 FF FF
+8A 23 92 42 22 20 2C 20 92 42 24 20 2E 20 8F 43
+00 00 03 3C 2A 4F B0 12 1E 5F 3A 4F 34 40 14 40
+3E 4F 0A 93 06 24 7A 93 14 20 0C 93 03 20 3D 40
+98 48 30 4D 87 12 FC 45 0B 3C 20 4F 70 65 6E 45
+72 72 6F 72 68 45 A0 43 7A 48 E0 45 A8 45 DC 41
+C2 5D 1A 93 B5 20 0C 93 ED 23 30 4D 2C 60 04 52
+45 41 44 00 2F 83 8F 4E 00 00 1E 42 34 20 B0 12
+A6 5E 1E 82 34 20 30 4D 2C 43 12 12 2A 20 18 42
+02 20 08 58 2A 41 82 9A 0A 20 A0 24 B0 12 2C 5D
+09 43 28 93 03 24 89 93 02 1E 03 20 89 93 00 1E
+07 24 09 58 39 90 00 02 F4 23 91 53 00 00 EA 3F
+0C 43 6A 41 B9 43 00 1E 28 93 0F 24 B9 40 FF 0F
+02 1E 09 11 8A 10 09 5A 5A 41 01 00 0A 11 09 10
+82 4A 28 20 82 49 26 20 07 3C 09 11 C2 49 26 20
+C2 4A 27 20 82 43 28 20 3A 41 82 4A 2A 20 30 41
+0A 12 1A 52 08 20 B0 12 6E 5D 3A 41 1A 52 0C 20
+30 40 6E 5D F2 B0 40 00 A2 04 29 20 F2 B0 10 00
+A2 04 FC 27 5A 42 B0 04 4A 11 59 42 B4 04 F2 40
+20 00 C0 04 D2 42 B1 04 C8 04 1A 52 E4 04 D2 42
+B5 04 C8 04 19 52 E4 04 D2 42 B2 04 C0 04 B2 40
+00 08 C8 04 1A 52 E4 04 92 42 B6 04 C0 04 B2 80
+BC 07 C0 04 B2 40 00 02 C8 04 19 52 E4 04 30 41
+22 2A 2B 2C 2F 3A 3B 3C 3D 3E 3F 5B 5C 5D 7C 2E
+29 92 06 38 39 80 03 00 B0 12 6E 63 39 40 03 00
+7A 4B C8 4A 00 1E 0A 93 12 24 0D 12 3D 40 0F 00
+3C 40 20 63 7A 9C F4 27 1D 83 FC 23 3D 41 6A 9C
+E7 27 3A 80 21 00 EC 3B 18 53 19 83 E9 23 09 93
+06 24 F8 40 20 00 00 1E 18 53 19 83 FA 23 30 41
+2A 93 EB 20 2C 93 0D 24 0C 93 BA 24 87 12 FC 45
+0C 3C 20 57 72 69 74 65 45 72 72 6F 72 00 DC 41
+04 62 B0 12 38 62 92 42 26 20 22 20 92 42 28 20
+24 20 B0 12 B0 62 B0 12 14 5F 18 42 30 20 F8 40
+20 00 0B 1E B0 12 C4 62 88 43 0C 1E 88 4A 0E 1E
+88 49 10 1E 88 49 12 1E 98 42 24 20 14 1E 98 42
+22 20 1A 1E 88 43 1C 1E 88 43 1E 1E 1C 43 1B 42
+32 20 CB 93 00 00 CA 27 FB 90 2E 00 00 00 C6 27
+39 40 0B 00 B0 12 40 63 B0 12 5A 64 2A 43 B0 12
+1E 5F 0C 93 BB 23 30 4D 1A 4B 04 00 19 4B 06 00
+B0 12 32 5D B0 12 C4 62 18 4B 08 00 88 49 12 1E
+88 4A 16 1E 88 49 18 1E 98 4B 12 00 1C 1E 98 4B
+14 00 1E 1E 1A 4B 04 00 19 4B 06 00 30 40 70 5D
+9B 52 1E 20 12 00 8B 63 14 00 1A 42 1A 20 19 42
+1C 20 30 40 70 5D B2 40 00 02 1E 20 1B 42 34 20
+B0 12 50 64 82 43 1E 20 DB 53 03 00 DB 92 12 20
+03 00 22 20 CB 43 03 00 B0 12 06 5E 08 12 0A 12
+B0 12 38 62 2A 91 05 24 B0 12 B0 62 2A 41 B0 12
+2C 5D 3A 41 38 41 98 42 26 20 00 1E 92 93 02 20
+03 24 98 42 28 20 02 1E B0 12 B0 62 9B 42 26 20
+0E 00 9B 42 28 20 10 00 30 40 74 5E 38 60 05 57
+52 49 54 45 B0 12 66 64 30 4D 1E 62 07 53 44 5F
+45 4D 49 54 B2 90 00 02 1E 20 02 28 B0 12 66 64
+18 42 1E 20 C8 4E 00 1E 92 53 1E 20 3E 4F 30 4D
+58 4B 13 00 59 4B 14 00 89 10 09 58 58 4B 15 00
+5B 42 12 20 0A 43 3C 42 08 11 09 10 4A 10 1C 83
+0B 11 FA 2B 0A 11 1C 83 FD 37 1B 42 34 20 19 5B
+0A 00 18 6B 0C 00 8B 49 0E 00 8B 48 10 00 CB 4A
+03 00 1A 4B 12 00 BB C0 FF 01 12 00 3A F0 FF 01
+82 4A 1E 20 B0 12 10 5F 30 4D 0C 93 38 20 38 90
+E0 01 03 2C C8 93 20 1E 02 24 7C 40 E5 00 C8 4C
+00 1E B0 12 5A 64 B0 12 12 5E 82 4A 2A 20 0B 4A
+B0 12 2C 5D 1A 48 00 1E 88 43 00 1E 92 93 02 20
+09 24 19 48 02 1E 88 43 02 1E 39 F0 FF 0F 39 90
+FF 0F 02 20 3A 93 0E 24 82 4A 22 20 82 49 24 20
+B0 12 12 5E 0B 9A E6 27 0A 12 0A 4B B0 12 B0 62
+3A 41 DD 3F 0A 4B B0 12 B0 62 B0 12 E2 5F 30 4D
+DE 5B 08 54 45 52 4D 32 53 44 22 00 87 12 4C 60
+A0 43 E4 65 21 53 2F 83 AF 43 00 00 3D 40 F4 65
+30 40 9C 60 F6 65 92 C3 DC 05 08 43 B0 12 BA 44
+92 B3 DC 05 FD 27 59 42 CC 05 69 92 0D 24 C8 49
+00 1E 18 53 38 90 FF 01 F3 2B 03 24 B0 12 66 64
+EC 3F B0 12 CC 44 EC 3F B0 12 CC 44 82 48 1E 20
+B0 12 E2 5F 3D 41 30 4D
@FFB4
-58 4F 58 4F 58 4F 58 4F 58 4F 58 4F 58 4F 58 4F
-58 4F 58 4F 58 4F 58 4F 58 4F 58 4F 58 4F 58 4F
-58 4F 58 4F 58 4F 58 4F 58 4F 58 4F 58 4F 58 4F
-58 4F 58 4F 58 4F 58 4F 58 4F 58 4F E6 44 58 4F
-58 4F 58 4F 58 4F 58 4F 58 4F 58 4F
+B4 50 B4 50 B4 50 B4 50 B4 50 B4 50 B4 50 B4 50
+B4 50 B4 50 B4 50 B4 50 B4 50 B4 50 B4 50 B4 50
+B4 50 B4 50 B4 50 B4 50 B4 50 B4 50 B4 50 B4 50
+B4 50 B4 50 B4 50 B4 50 B4 50 B4 50 FA 44 B4 50
+B4 50 B4 50 B4 50 B4 50 B4 50 B4 50
q
+++ /dev/null
-\prog\MSP430Flasher\msp430flasher -m SBW2 -n MSP430fr5994 -v -w %1 -z [VCC=3000]
-exit
-
-tip : how to calculate MAIN program lenght ?
-
-open the prog.txt file with your editor, select MAIN section
-in status bar, keep the number of selected chars
-if lines are ended with CR+LF, substract the number of lines selected
-then divide by 3.
@1800
-10 00 6A 48 80 3E 80 04 FD FF 18 00 66 5B 1C 54
-2A 48 3C 48 00 00 00 00
+10 00 92 48 80 3E 80 04 05 00 18 00 D4 5C 8C 55
+52 48 64 48 00 00 00 00
@1DAA
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 44
03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
44 55 50 00 0E 93 F6 23 30 4D 40 44 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 44 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E 44 02 3E 52 00 0E 12 3E 4F 30 4D 8E 44
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 44
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C 44 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 44 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 45
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 44 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA 44 03 41 4E 44 3E FF 30 4D 7A 44 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E 45 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 45 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E 45 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 45 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 44 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
+50 00 3E 4F 30 4D 00 00 03 4E 49 50 2F 53 30 4D
+00 00 04 53 57 41 50 00 2A 4F 8F 4E 00 00 0E 4A
+30 4D 68 44 04 4F 56 45 52 00 8F 4E FE FF 2E 4F
+2F 83 30 4D 72 44 03 52 4F 54 2A 4F 8F 4E 00 00
+1E 4F 02 00 8F 4A 02 00 30 4D 4E 44 02 3E 52 00
+0E 12 3E 4F 30 4D 96 44 02 52 3E 00 2F 83 8F 4E
+00 00 3E 41 30 4D B8 44 02 52 40 00 2F 83 8F 4E
+00 00 2E 41 30 4D 5C 44 05 44 45 50 54 48 8F 4E
+FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D 00 00
+01 40 2E 4E 30 4D F0 44 01 21 BE 4F 00 00 3E 4F
+30 4D 00 00 02 43 40 00 6E 4E 30 4D 04 45 02 43
+21 00 FE 4F 00 00 1F 53 3E 4F 30 4D 00 00 01 2B
+3E 5F 30 4D 30 44 01 2D 3E 8F 3E E3 1E 53 30 4D
+F8 44 03 41 4E 44 3E FF 30 4D 84 44 02 4F 52 00
+3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D 3C 45
+06 4E 45 47 41 54 45 00 E8 3F 32 45 03 41 42 53
+0E 93 E3 33 30 4D D8 44 04 44 41 42 53 00 3E F3
+06 34 BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D
+00 00 02 30 3D 00 1E 83 0E 7E 30 4D 82 45 02 30
+3C 00 0E 5E 0E 7E 3E E3 30 4D 8E 45 02 30 3E 00
+1E 93 05 34 0B 3C 00 00 01 3D 3E 8F 07 20 3E 43
+30 4D A8 45 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
+AC 44 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE 45 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 45 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 45 03 3E 49 4E 85 12 C2 1D 10 45
-04 42 41 53 45 00 85 12 DA 1D C0 44 05 53 54 41
-54 45 85 12 B6 1D 30 46 02 42 4C 00 85 12 20 00
-94 45 02 3C 23 00 B2 40 AA 1D AA 1D 30 4D 1E 15
-0E 43 3D 40 20 00 0A 93 04 20 0D 11 0A 4C 0C 43
-09 43 0E 9B 01 28 0E 8B 09 69 08 68 1D 83 07 30
-0C 5C 0A 6A 0E 6E F5 2B 0E 8B 12 D3 F5 3F 0A 4E
-1D 17 30 41 48 46 01 23 1B 42 DA 1D 2C 4F 0A 4E
-B0 12 5E 46 8F 49 00 00 0E 48 7A 90 0A 00 02 28
-3A 50 07 00 3A 50 30 00 92 83 AA 1D 18 42 AA 1D
-C8 4A 00 00 30 4D 96 46 02 23 53 00 87 12 98 46
-D2 46 2D 83 09 93 E0 23 0E 93 DE 23 3D 41 30 4D
-C8 46 02 23 3E 00 9F 42 AA 1D 00 00 3E 40 AA 1D
-2E 8F 30 4D 00 46 04 48 4F 4C 44 00 0A 4E 3E 4F
-DB 3F 3C 46 04 53 49 47 4E 00 0E 93 3E 4F 3A 40
-2D 00 D2 33 30 4D F4 45 03 55 44 2E 87 12 56 46
-CC 46 E6 46 50 49 18 49 2A 44 18 47 02 55 2E 00
-2F 83 8F 4E 00 00 0E 43 F1 3F 3E B0 00 80 06 24
-BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D DA 44
-02 44 2E 00 87 12 56 46 6E 44 80 44 3A 47 CC 46
-92 44 0A 47 E6 46 50 49 18 49 2A 44 52 45 01 2E
-3E B0 00 80 DD 27 2F 83 3E 43 EC 3F F6 46 04 48
-45 52 45 00 2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D
-62 45 05 41 4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D
-E2 46 02 43 2C 00 1A 42 C4 1D CA 4E 00 00 92 53
-C4 1D 3E 4F 30 4D 2F 83 8F 4E 00 00 B0 12 2A 48
-92 B3 FC 05 FD 27 1E 42 EC 05 B0 12 3C 48 30 4D
-30 40 B6 47 7E 47 05 28 4B 45 59 29 18 42 EC 05
-EA 3F 12 46 03 4B 45 59 30 40 DC 47 92 47 06 41
-43 43 45 50 54 00 3C 40 A8 48 3B 40 72 48 2D 15
-0A 4E 2E 4F 0A 5E 3B 40 0D 00 3C 40 20 00 3D 40
-9C 48 92 B3 FC 05 05 24 18 42 EC 05 38 90 0A 00
-04 20 21 53 39 40 56 48 4D 15 B2 40 11 00 EE 05
-A2 B3 FC 05 FD 27 D2 C3 22 02 30 41 B2 40 13 00
-EE 05 A2 B3 FC 05 FD 27 D2 D3 22 02 30 41 00 00
-05 53 4C 45 45 50 30 40 64 48 00 00 07 28 53 4C
-45 45 50 29 12 D2 0A 18 F6 3F 21 52 3A 17 58 42
-EC 05 48 9B E3 27 48 9C 06 2C 78 92 11 20 2E 9F
-0F 24 1E 83 05 3C 0E 9A 03 24 CE 48 00 00 1E 53
-82 48 EE 05 A2 B3 FC 05 FD 27 30 4D 9E 48 2D 83
-92 B3 FC 05 FD 27 E3 23 B2 40 18 00 0A 18 3E 8F
-3D 41 30 4D D6 47 06 28 45 4D 49 54 29 00 08 4E
-3E 4F E6 3F 50 47 04 45 4D 49 54 00 30 40 BE 48
-C6 48 04 45 43 48 4F 00 B2 40 82 48 90 48 30 4D
-6E 47 06 4E 4F 45 43 48 4F 00 B2 40 30 4D 90 48
-30 4D B6 48 04 28 43 52 29 00 2F 83 8F 4E 00 00
-3E 40 0D 00 E3 3F A2 47 02 43 52 00 30 40 FA 48
-04 47 05 53 50 41 43 45 2F 83 8F 4E 00 00 3E 40
-20 00 D4 3F 12 49 06 53 50 41 43 45 53 00 0E 93
-09 24 0D 12 3D 40 3A 49 EF 3F 3C 49 2D 83 1E 83
-EB 23 3D 41 3E 4F 30 4D 2C 47 04 54 59 50 45 00
-0E 93 95 24 2A 4F 8F 5E 00 00 0E 4A 87 12 CA 45
-02 46 0A 45 CC 48 EC 45 60 49 2A 44 2F 82 8F 4E
-02 00 7E 4D 8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D
-26 49 82 53 22 00 87 12 34 44 6C 49 A2 4B 34 44
-22 00 C6 49 96 49 3D 41 6E 4E 1E 83 82 5E C4 1D
-3E 4F 92 B3 C4 1D A2 63 C4 1D 30 4D E2 48 82 2E
-22 00 87 12 86 49 34 44 50 49 A2 4B 2A 44 00 00
-04 57 4F 52 44 00 3C 40 BE 1D 39 4C 3A 4C 09 5A
-3A 5C 28 4C 09 9A 19 24 7E 9A FC 27 1A 83 3B 40
-60 00 C8 4C 00 00 09 9A 0C 24 7C 4A 4E 9C 09 24
-18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F 7C 80 20 00
-F0 3F 1A 82 C0 1D 82 4A C2 1D 1E 42 C4 1D 08 8E
-CE 48 00 00 30 4D 00 00 04 46 49 4E 44 00 2F 83
-0C 4E 65 4C 74 40 80 00 3B 40 CA 1D 3E 4B 0E 93
-1E 24 58 4C 01 00 78 F0 1E 00 0E 58 2E 53 1E 4E
-FE FF 0E 93 F3 27 09 4E 78 49 48 C4 48 95 F7 23
-0A 4C 1A 53 FA 99 00 00 F2 23 58 83 FA 23 19 B3
-09 63 0C 49 6A 4E 1E 43 4A 93 01 30 2E 83 8F 4C
-00 00 35 40 08 44 34 40 14 44 30 4D 2F 53 2F 53
-3E 4F 30 4D 26 46 07 3E 4E 55 4D 42 45 52 3C 4F
-38 4F 29 4F 2F 82 1B 42 DA 1D 6A 4C 7A 80 30 00
-7A 90 0A 00 02 28 7A 80 07 00 0A 9B 13 2C 82 49
-D0 04 82 48 D2 04 82 4B C8 04 19 42 E4 04 18 42
-E6 04 09 5A 08 63 1C 53 1E 83 E7 23 8F 49 04 00
-8F 48 02 00 8F 4C 00 00 30 4D 03 12 0D 12 1B 42
-DA 1D 0B 12 32 C0 00 02 6D 4E 0D 5E 0C 4E 7A 40
-2E 00 0D 9C 0A 28 7A 9C FC 23 32 D0 00 02 FC 4C
-FE FF 0D 9C FC 2F DE 83 00 00 09 43 08 43 3D 40
-50 4B 3F 82 8F 4E 06 00 0C 4E 7E 4C 6A 4C 7A 90
-2D 00 10 2C 3B 40 10 00 7A 80 24 00 06 24 2B 43
-5A 83 03 24 3B 52 6A 53 B0 23 1C 53 1E 83 6A 4C
-7A 90 2D 00 AA 23 1C 53 1E 83 B1 43 04 00 A5 3F
-52 4B 2F 53 0E 93 2C 17 82 4C DA 1D 03 24 2F 52
-0E F3 30 4D 9F 4F 02 00 04 00 BF 4F 00 00 3E E3
-09 20 3E E3 BF E3 02 00 BF E3 00 00 9F 53 02 00
-8F 63 00 00 32 B0 00 02 01 20 2F 53 30 4D D2 48
-07 45 58 45 43 55 54 45 0A 4E 3E 4F 00 4A 28 45
-01 2C 1A 42 C4 1D A2 53 C4 1D 8A 4E 00 00 3E 4F
-30 4D A0 4B 87 4C 49 54 45 52 41 4C 82 93 B6 1D
-16 24 32 B0 00 02 09 24 1A 42 C4 1D A2 52 C4 1D
-BA 40 34 44 00 00 BA 4F 02 00 1A 42 C4 1D A2 52
-C4 1D BA 40 34 44 00 00 8A 4E 02 00 3E 4F 30 4D
-08 49 05 43 4F 55 4E 54 2F 83 1E 53 8F 4E 00 00
-5E 4E FF FF 30 4D 82 4E BE 1D B2 4F C0 1D 3E 4F
-82 43 C2 1D 87 12 4C 46 C6 49 1C 4C 3D 40 28 4C
-FE 22 3D 41 3E 4F 30 4D 2A 4C 0A 4E 3E 4F 3D 40
-40 4C 53 27 3D 40 16 4C 1A E2 B6 1D B2 27 AC 23
-42 4C 3E 4F 3D 40 16 4C B9 23 DE 53 00 00 68 4E
-08 5E F8 40 3F 00 00 00 3D 40 0C 4E CD 3F 90 4B
-08 45 56 41 4C 55 41 54 45 00 39 40 BE 1D 39 12
-39 12 39 12 0D 12 B0 12 2A 44 06 4C 7E 4C 3D 41
-B2 41 C2 1D B2 41 C0 1D B2 41 BE 1D 30 4D 7A 45
-04 51 55 49 54 00 31 40 E0 1C B2 40 00 1C 00 1C
-82 43 B6 1D 82 43 08 18 B0 12 2A 44 6C 49 04 0D
-6F 6B 20 00 50 49 34 44 38 1D 44 44 34 44 50 00
-F6 47 18 49 06 4C 34 44 7E 1C CE 44 B2 45 6C 49
-0D 73 74 61 63 6B 20 65 6D 70 74 79 20 21 1A 4D
-34 44 30 FF 84 47 B2 45 6C 49 0B 46 52 41 4D 20
-66 75 6C 6C 20 21 1A 4D 42 46 F4 44 C0 45 AC 4C
-6C 49 04 0D 20 20 20 00 BC 45 B4 4C EE 47 05 41
-42 4F 52 54 3F 40 80 1C BE 3F 8F 93 02 00 AE 26
-B2 40 82 48 90 48 B0 12 0C 52 82 43 E0 5A 82 43
-EC 5A 82 43 F8 5A 82 43 28 5B 82 43 34 5B 82 43
-40 5B A2 B3 FC 05 FD 27 B2 40 11 00 EE 05 D2 C3
-22 02 92 C3 FC 05 38 40 A0 AA 39 42 19 83 FE 23
-18 83 FB 23 92 B3 FC 05 F4 23 87 12 6C 49 04 1B
-5B 37 6D 00 50 49 50 49 6C 49 04 1B 5B 30 6D 00
-50 49 4E 51 90 51 96 51 14 4D 0E 4D 86 41 42 4F
-52 54 22 00 87 12 86 49 34 44 1A 4D A2 4B 2A 44
-18 4A 01 27 87 12 4C 46 C6 49 1E 4A C0 45 B2 4D
-2A 44 4A 4C 52 46 81 5C 92 42 BE 1D C2 1D 30 4D
-87 12 A2 49 4C 46 C6 49 CA 4D 08 4E 7A 4E 5A D3
-5A 53 0A 58 19 42 C8 1D 6E 4E 3E F0 1E 00 09 5E
-82 48 AE 1D 82 49 B0 1D 82 4A B2 1D 2A 52 82 4A
-C4 1D 3E 4F 3D 41 30 41 87 12 6C 49 0F 73 74 61
-63 6B 20 6D 69 73 6D 61 74 63 68 21 20 4D 82 9F
-B4 1D F2 23 18 42 AE 1D 19 42 B0 1D A8 49 FE FF
-89 48 00 00 30 4D C0 49 08 56 41 52 49 41 42 4C
-45 00 B0 12 C0 4D BA 40 86 12 FC FF EF 3F F2 4B
-08 43 4F 4E 53 54 41 4E 54 00 B0 12 C0 4D BA 40
-85 12 FC FF 8A 4E FE FF 3E 4F E0 3F 40 4E 06 43
-52 45 41 54 45 00 B0 12 C0 4D BA 40 85 12 FC FF
-8A 4A FE FF D3 3F 60 4C 05 44 4F 45 53 3E 1A 42
-B2 1D BA 40 84 12 00 00 8A 4D 02 00 3D 41 30 4D
-78 4E 05 44 45 46 45 52 B0 12 C0 4D BA 40 30 40
-FC FF BA 40 8E 4E FE FF B9 3F 00 00 81 5B 82 43
-B6 1D 30 4D B6 4D 01 5D B2 43 B6 1D 30 4D 82 49
-87 52 45 43 55 52 53 45 19 42 C4 1D 99 42 B2 1D
-00 00 A2 53 C4 1D 30 4D AC 4E 01 3A B0 12 C0 4D
-BA 40 87 12 FC FF A2 83 C4 1D B2 43 B6 1D 82 4F
-B4 1D 30 4D DA 4E 81 3B 82 93 B6 1D 5D 27 87 12
-34 44 2A 44 A2 4B 0E 4E AE 4E 2A 44 F4 48 09 49
+0E 93 3E 4F FB 27 2D 53 30 4D 1E 83 0E 7E F9 3F
+39 40 00 80 39 8F 08 4E 3E 4F 08 59 19 15 30 4D
+81 5E 00 00 3E 4F 32 B0 00 01 E8 27 2D 53 21 52
+30 4D 91 53 00 00 F7 3F CE 45 06 55 4E 4C 4F 4F
+50 00 F5 3F 00 00 01 49 2F 83 8F 4E 00 00 2E 41
+1E 81 02 00 30 4D 1E 45 01 4A 2F 83 8F 4E 00 00
+1E 41 04 00 1E 81 06 00 30 4D 9C 45 03 50 41 44
+85 12 E2 1C 1A 46 03 54 49 42 85 12 38 1D 0E 45
+03 43 50 4C 85 12 50 00 C2 45 03 3E 49 4E 85 12
+C2 1D 60 46 04 42 41 53 45 00 85 12 DA 1D C8 44
+05 53 54 41 54 45 85 12 B6 1D 74 46 02 42 4C 00
+85 12 20 00 B4 45 02 3C 23 00 B2 40 AA 1D AA 1D
+30 4D 8C 46 01 23 2C 4F 5B 42 DA 1D 0A 43 34 40
+20 00 0E 93 04 20 04 11 0E 4C 0C 43 09 43 0A 9B
+01 28 0A 8B 09 69 08 68 14 83 07 30 0C 5C 0E 6E
+0A 6A F5 2B 0A 8B 12 D3 F5 3F 34 40 14 44 8F 49
+00 00 0E 48 7A 90 0A 00 02 28 3A 50 07 00 3A 50
+30 00 92 83 AA 1D 18 42 AA 1D C8 4A 00 00 30 4D
+A4 46 02 23 53 00 87 12 A6 46 0C 47 2D 83 09 93
+CA 23 0E 93 C8 23 3D 41 30 4D 02 47 02 23 3E 00
+9F 42 AA 1D 00 00 3E 40 AA 1D 2E 8F 30 4D 26 46
+04 48 4F 4C 44 00 0A 4E 3E 4F DB 3F 80 46 04 53
+49 47 4E 00 0E 93 3E 4F 3A 40 2D 00 D2 33 30 4D
+56 46 02 55 2E 00 87 12 9A 46 34 44 00 00 06 47
+20 47 78 49 40 49 2A 44 68 45 02 44 2E 00 87 12
+9A 46 78 44 8A 44 6E 45 06 47 9A 44 44 47 20 47
+78 49 40 49 2A 44 50 45 01 2E 0E 93 E4 37 2F 83
+8F 4E 00 00 3E 43 EB 3F 30 47 04 48 45 52 45 00
+2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D 5C 45 05 41
+4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D 1C 47 02 43
+2C 00 1A 42 C4 1D CA 4E 00 00 92 53 C4 1D 3E 4F
+30 4D 2F 83 8F 4E 00 00 B0 12 52 48 92 B3 FC 05
+FD 27 1E 42 EC 05 B0 12 64 48 30 4D 9A 47 05 28
+4B 45 59 29 18 42 EC 05 EC 3F 38 46 03 4B 45 59
+30 40 F4 47 AE 47 06 41 43 43 45 50 54 00 30 40
+1E 48 EE 47 08 28 41 43 43 45 50 54 29 00 3C 40
+D0 48 3B 40 9A 48 2D 15 0A 4E 2E 4F 0A 5E 3B 40
+0D 00 3C 40 20 00 3D 40 C4 48 92 B3 FC 05 05 24
+18 42 EC 05 38 90 0A 00 04 20 21 53 39 40 7E 48
+4D 15 B2 40 11 00 EE 05 D2 C3 22 02 A2 B3 FC 05
+FD 27 30 41 B2 40 13 00 EE 05 D2 D3 22 02 A2 B3
+FC 05 FD 27 30 41 00 00 05 53 4C 45 45 50 30 40
+8C 48 00 00 07 28 53 4C 45 45 50 29 12 D2 0A 18
+F6 3F 21 52 3A 17 58 42 EC 05 48 9B E3 27 48 9C
+06 2C 78 92 11 20 2E 9F 0F 24 1E 83 05 3C 0E 9A
+03 24 CE 48 00 00 1E 53 82 48 EE 05 A2 B3 FC 05
+FD 27 30 4D C6 48 2D 83 92 B3 FC 05 FD 27 E3 23
+B2 40 18 00 0A 18 3E 8F 3D 41 30 4D 14 48 06 28
+45 4D 49 54 29 00 08 4E 3E 4F E6 3F 6A 47 04 45
+4D 49 54 00 30 40 E6 48 EE 48 04 45 43 48 4F 00
+B2 40 82 48 B8 48 30 4D 88 47 06 4E 4F 45 43 48
+4F 00 B2 40 30 4D B8 48 30 4D DE 48 04 28 43 52
+29 00 2F 83 8F 4E 00 00 3E 40 0D 00 E3 3F BE 47
+02 43 52 00 30 40 22 49 3E 47 05 53 50 41 43 45
+2F 83 8F 4E 00 00 3E 40 20 00 D4 3F 3A 49 06 53
+50 41 43 45 53 00 0E 93 09 24 0D 12 3D 40 62 49
+EF 3F 64 49 2D 83 1E 83 EB 23 3D 41 3E 4F 30 4D
+52 47 04 54 59 50 45 00 0E 93 95 24 2A 4F 8F 5E
+00 00 0E 4A 87 12 F0 45 28 46 08 45 F4 48 12 46
+88 49 2A 44 2F 82 8F 4E 02 00 7E 4D 8F 4D 00 00
+0D 5E 1D B3 0D 63 30 4D 4E 49 82 53 22 00 87 12
+34 44 94 49 CA 4B 34 44 22 00 EE 49 BE 49 3D 41
+6E 4E 1E 83 82 5E C4 1D 3E 4F 92 B3 C4 1D A2 63
+C4 1D 30 4D 0A 49 82 2E 22 00 87 12 AE 49 34 44
+78 49 CA 4B 2A 44 00 00 04 57 4F 52 44 00 3C 40
+BE 1D 39 4C 3A 4C 09 5A 3A 5C 28 4C 09 9A 19 24
+7E 9A FC 27 1A 83 3B 40 60 00 C8 4C 00 00 09 9A
+0C 24 7C 4A 4E 9C 09 24 18 53 4B 9C F6 2F 7C 90
+7B 00 F3 2F 7C 80 20 00 F0 3F 1A 82 C0 1D 82 4A
+C2 1D 1E 42 C4 1D 08 8E CE 48 00 00 30 4D 00 00
+04 46 49 4E 44 00 2F 83 0C 4E 65 4C 74 40 80 00
+3B 40 CA 1D 3E 4B 0E 93 1E 24 58 4C 01 00 78 F0
+1E 00 0E 58 2E 53 1E 4E FE FF 0E 93 F3 27 09 4E
+78 49 48 C4 48 95 F7 23 0A 4C 1A 53 FA 99 00 00
+F2 23 58 83 FA 23 19 B3 09 63 0C 49 6A 4E 1E 43
+4A 93 01 30 2E 83 8F 4C 00 00 35 40 08 44 34 40
+14 44 30 4D 2F 53 2F 53 3E 4F 30 4D 6A 46 07 3E
+4E 55 4D 42 45 52 3C 4F 38 4F 29 4F 2F 82 1B 42
+DA 1D 6A 4C 7A 80 30 00 7A 90 0A 00 02 28 7A 80
+07 00 0A 9B 13 2C 82 49 D0 04 82 48 D2 04 82 4B
+C8 04 19 42 E4 04 18 42 E6 04 09 5A 08 63 1C 53
+1E 83 E7 23 8F 49 04 00 8F 48 02 00 8F 4C 00 00
+30 4D 03 12 0D 12 1B 42 DA 1D 0B 12 32 C0 00 02
+6D 4E 0D 5E 0C 4E 7A 40 2E 00 0D 9C 0A 28 7A 9C
+FC 23 32 D0 00 02 FC 4C FE FF 0D 9C FC 2F DE 83
+00 00 09 43 08 43 3D 40 78 4B 3F 82 8F 4E 06 00
+0C 4E 7E 4C 6A 4C 7A 90 2D 00 10 2C 3B 40 10 00
+7A 80 24 00 06 24 2B 43 5A 83 03 24 3B 52 6A 53
+B0 23 1C 53 1E 83 6A 4C 7A 90 2D 00 AA 23 1C 53
+1E 83 B1 43 04 00 A5 3F 7A 4B 2F 53 0E 93 2C 17
+82 4C DA 1D 03 24 2F 52 0E F3 30 4D 9F 4F 02 00
+04 00 BF 4F 00 00 3E E3 09 20 3E E3 BF E3 02 00
+BF E3 00 00 9F 53 02 00 8F 63 00 00 32 B0 00 02
+01 20 2F 53 30 4D FA 48 07 45 58 45 43 55 54 45
+0A 4E 3E 4F 00 4A 26 45 01 2C 1A 42 C4 1D A2 53
+C4 1D 8A 4E 00 00 3E 4F 30 4D C8 4B 87 4C 49 54
+45 52 41 4C 82 93 B6 1D 0F 24 1A 42 C4 1D A2 52
+C4 1D BA 40 34 44 00 00 8A 4E 02 00 3E 4F 32 B0
+00 02 32 C0 00 02 F1 23 30 4D 30 49 05 43 4F 55
+4E 54 2F 83 1E 53 8F 4E 00 00 5E 4E FF FF 30 4D
+82 4E BE 1D B2 4F C0 1D 3E 4F 82 43 C2 1D 87 12
+90 46 EE 49 36 4C 3D 40 42 4C 05 23 3D 41 3E 4F
+30 4D 44 4C 0A 4E 3E 4F 3D 40 5A 4C 5A 27 3D 40
+30 4C 1A E2 B6 1D B9 27 B3 23 5C 4C 3E 4F 3D 40
+30 4C C0 23 DE 53 00 00 68 4E 08 5E F8 40 3F 00
+00 00 3D 40 88 4E CD 3F B8 4B 08 45 56 41 4C 55
+41 54 45 00 39 40 BE 1D 3C 49 3B 49 3A 49 3D 15
+B0 12 2A 44 20 4C 98 4C B2 41 C2 1D B2 41 C0 1D
+B2 41 BE 1D 3D 41 30 4D 4C 46 04 51 55 49 54 00
+31 40 E0 1C B2 40 00 1C 00 1C 82 43 B6 1D 82 43
+08 18 B0 12 2A 44 94 49 03 0D 6F 6B 78 49 40 49
+5A 46 44 44 64 46 0E 48 40 49 20 4C DE 44 92 45
+94 49 0D 73 74 61 63 6B 20 65 6D 70 74 79 21 20
+2A 4D 34 44 30 FF A0 47 D2 45 94 49 0B 46 52 41
+4D 20 66 75 6C 6C 21 20 2A 4D 86 46 F2 44 E0 45
+C6 4C 94 49 03 0D 20 20 DC 45 CC 4C 06 48 05 41
+42 4F 52 54 3F 40 80 1C C3 3F 8F 93 02 00 BA 26
+B2 40 82 48 B8 48 B0 12 3C 52 A2 B3 FC 05 FD 27
+B2 40 11 00 EE 05 D2 C3 22 02 92 C3 FC 05 38 40
+A0 AA 39 42 03 43 19 83 FD 23 18 83 FA 23 92 B3
+FC 05 F3 23 87 12 94 49 04 1B 5B 37 6D 00 78 49
+78 49 94 49 04 1B 5B 30 6D 00 78 49 4A 51 8C 51
+92 51 DA 51 24 4D 1E 4D 86 41 42 4F 52 54 22 00
+87 12 AE 49 34 44 2A 4D CA 4B 2A 44 40 4A 01 27
+87 12 90 46 EE 49 46 4A E0 45 AE 4D 2A 44 64 4C
+96 46 81 5C 92 42 BE 1D C2 1D 30 4D 00 00 81 5B
+82 43 B6 1D 30 4D B2 4D 01 5D B2 43 B6 1D 30 4D
+BE 4D 83 5B 27 5D 87 12 A0 4D 34 44 34 44 CA 4B
+CA 4B 2A 44 BE 4F 02 00 3E 4F 30 4D 1C 49 82 49
+53 00 87 12 86 46 F2 44 E0 45 06 4E D6 4D 34 44
+E4 4D CA 4B 2A 44 A0 4D E4 4D 2A 44 EE 4D 09 49
4D 4D 45 44 49 41 54 45 1A 42 AE 1D FA D0 80 00
-00 00 30 4D BE 4F 02 00 3E 4F 30 4D 0E 4F 82 49
-53 00 87 12 42 46 F4 44 C0 45 46 4F 52 4F 34 44
-24 4F A2 4B 2A 44 A4 4D 24 4F 2A 44 F6 4E 83 5B
-27 5D 87 12 A4 4D 34 44 34 44 A2 4B A2 4B 2A 44
-90 4C 88 50 4F 53 54 50 4F 4E 45 00 87 12 4C 46
-C6 49 1E 4A 54 44 C0 45 B2 4D 7E 45 C0 45 8C 4F
-34 44 34 44 A2 4B A2 4B 34 44 A2 4B A2 4B 2A 44
-92 4F 3A 4E 82 4A C6 1D 2E 4E 82 4E C4 1D 3D 40
-10 00 09 4A 08 49 29 83 18 48 FE FF 0E 98 FC 2B
-89 48 00 00 1D 83 F6 23 2A 4A 0A 93 F0 23 3E 4F
-3D 41 30 4D 2E 4F 82 49 46 00 2F 83 8F 4E 00 00
-1E 42 C4 1D BE 40 C0 45 00 00 A2 52 C4 1D 2E 53
-30 4D 92 4E 84 45 4C 53 45 00 1A 42 C4 1D BA 40
-BC 45 00 00 2A 52 82 4A C4 1D 8E 4A 00 00 2A 83
-0E 4A 30 4D 4A 49 84 54 48 45 4E 00 9E 42 C4 1D
-00 00 3E 4F 30 4D 5E 4E 85 42 45 47 49 4E 30 40
-84 47 06 50 85 55 4E 54 49 4C 39 40 C0 45 1A 42
-C4 1D A2 52 C4 1D 8A 49 00 00 8A 4E 02 00 3E 4F
-30 4D 8C 4D 85 41 47 41 49 4E 39 40 BC 45 EF 3F
-28 4E 85 57 48 49 4C 45 87 12 CA 4F 6E 44 2A 44
-C0 4E 86 52 45 50 45 41 54 00 87 12 4A 50 0C 50
-2A 44 E4 4F 82 44 4F 00 2F 83 8F 4E 00 00 1E 42
-C4 1D BE 40 CA 45 00 00 2E 53 82 4E C4 1D A2 53
-00 1C 1A 42 00 1C 8A 43 00 00 30 4D B4 4B 84 4C
-4F 4F 50 00 39 40 EC 45 1A 42 C4 1D A2 52 C4 1D
-8A 49 00 00 8A 4E 02 00 1E 42 00 1C A2 83 00 1C
-2E 4E 0E 93 04 24 9E 42 C4 1D 00 00 F5 3F 3E 4F
-30 4D E4 47 85 2B 4C 4F 4F 50 39 40 DA 45 E4 3F
-9E 50 85 4C 45 41 56 45 1A 42 C4 1D BA 40 FC 45
-00 00 BA 40 BC 45 02 00 B2 50 06 00 C4 1D A2 53
-00 1C 2A 52 19 42 00 1C 89 4A 00 00 30 4D E2 50
-04 4D 4F 56 45 00 0A 4E 38 4F 39 4F 3E 4F 0A 93
-11 24 08 99 0F 24 06 2C F8 49 00 00 18 53 1A 83
-FB 23 30 4D 08 5A 09 5A 19 83 18 83 E8 49 00 00
-1A 83 FA 23 30 4D 34 44 CA 1D FC 44 2A 44 84 12
-46 51 62 54 38 54 74 50 A2 4D 20 54 D4 50 10 51
-AE 49 B4 51 E8 51 24 50 AE 52 48 45 4E 4F B6 4E
-86 4A 00 00 3A 40 0C 00 39 40 CA 1D 38 40 CC 1D
-D9 3F 3A 40 0E 00 39 40 CC 1D 38 40 CA 1D CC 3F
-82 43 CC 1D 30 4D 92 42 CA 1D C8 1D 30 4D 62 4F
-09 50 57 52 5F 53 54 41 54 45 84 12 90 4F 1C 54
-66 5B A0 51 08 50 57 52 5F 48 45 52 45 00 92 42
-C4 1D B0 51 92 42 C6 1D AE 51 EF 3F 62 50 09 52
-53 54 5F 53 54 41 54 45 92 42 0C 18 B0 51 92 42
-0E 18 AE 51 E2 3F CE 51 08 52 53 54 5F 48 45 52
-45 00 92 42 C4 1D 0C 18 92 42 C6 1D 0E 18 DF 3F
-B2 40 54 52 B6 52 B2 40 64 48 58 48 B2 40 BE 48
-CE 48 B2 40 FA 48 0E 49 B2 40 DC 47 EA 47 30 41
-52 50 04 57 49 50 45 00 39 40 80 FF B9 43 00 00
-29 53 39 90 C6 FF FA 23 B0 12 00 52 B2 40 66 5B
-C4 1D B2 40 1C 54 C6 1D D4 3F C6 4F 06 28 57 41
-52 4D 29 00 1E 42 08 18 87 12 6C 49 05 0D 1B 5B
-37 6D 50 49 70 47 6C 49 27 20 46 61 73 74 46 6F
-72 74 68 20 56 31 36 30 20 31 36 4D 48 7A 20 28
+00 00 30 4D AA 49 87 52 45 43 55 52 53 45 19 42
+C4 1D 99 42 B2 1D 00 00 A2 53 C4 1D 30 4D AA 4C
+88 50 4F 53 54 50 4F 4E 45 00 87 12 90 46 EE 49
+46 4A 54 44 E0 45 AE 4D 92 45 E0 45 6A 4E 34 44
+34 44 CA 4B CA 4B 34 44 CA 4B CA 4B 2A 44 82 9F
+B4 1D A0 24 87 12 94 49 0F 73 74 61 63 6B 20 6D
+69 73 6D 61 74 63 68 21 30 4D 87 12 CA 49 90 46
+EE 49 94 4E 08 4E 7A 4E 5A D3 5A 53 0A 58 19 42
+C8 1D 6E 4E 3E F0 1E 00 09 5E 82 48 AE 1D 82 49
+B0 1D 82 4A B2 1D 2A 52 82 4A C4 1D 3E 4F 3D 41
+30 41 E8 49 08 56 41 52 49 41 42 4C 45 00 B0 12
+8A 4E BA 40 86 12 FC FF 71 3C 0C 4C 08 43 4F 4E
+53 54 41 4E 54 00 B0 12 8A 4E BA 40 85 12 FC FF
+8A 4E FE FF 3E 4F 62 3C DC 4E 06 43 52 45 41 54
+45 00 B0 12 8A 4E BA 40 85 12 FC FF 8A 4A FE FF
+55 3C 7A 4C 05 44 4F 45 53 3E 1A 42 B2 1D BA 40
+84 12 00 00 8A 4D 02 00 3D 41 30 4D 14 4F 05 44
+45 46 45 52 B0 12 8A 4E BA 40 30 40 FC FF BA 40
+2A 4F FE FF 3B 3C D2 4D 01 3A B0 12 8A 4E BA 40
+87 12 FC FF A2 83 C4 1D B2 43 B6 1D 82 4F B4 1D
+30 4D 48 4F 81 3B 82 93 B6 1D 24 27 87 12 34 44
+2A 44 CA 4B 6E 4E C0 4D 2A 44 7C 4F 3D 41 B2 4E
+0E 18 A2 4E 0C 18 3E 4F 32 3D DC 4B 06 4D 41 52
+4B 45 52 00 B0 12 8A 4E BA 40 84 12 FC FF BA 40
+7A 4F FE FF 9A 42 C6 1D 00 00 28 83 8A 48 02 00
+A2 52 C4 1D 18 42 AE 1D 19 42 B0 1D A8 49 FE FF
+89 48 00 00 30 4D 0E 4E 82 49 46 00 2F 83 8F 4E
+00 00 1E 42 C4 1D A2 52 C4 1D BE 40 E0 45 00 00
+2E 53 30 4D 2E 4F 84 45 4C 53 45 00 A2 52 C4 1D
+1A 42 C4 1D BA 40 DC 45 FC FF 8E 4A 00 00 2A 83
+0E 4A 30 4D 72 49 84 54 48 45 4E 00 9E 42 C4 1D
+00 00 3E 4F 30 4D FA 4E 85 42 45 47 49 4E 30 40
+A0 47 06 50 85 55 4E 54 49 4C 39 40 E0 45 A2 52
+C4 1D 1A 42 C4 1D 8A 49 FC FF 8A 4E FE FF 3E 4F
+30 4D 88 4D 85 41 47 41 49 4E 39 40 DC 45 EF 3F
+C4 4E 85 57 48 49 4C 45 87 12 CC 4F 78 44 2A 44
+26 4E 86 52 45 50 45 41 54 00 87 12 4A 50 0C 50
+2A 44 E6 4F 82 44 4F 00 2F 83 8F 4E 00 00 A2 53
+C4 1D 1E 42 C4 1D BE 40 F0 45 FE FF A2 53 00 1C
+1A 42 00 1C 8A 43 00 00 30 4D 8C 4F 84 4C 4F 4F
+50 00 39 40 12 46 A2 52 C4 1D 1A 42 C4 1D 8A 49
+FC FF 8A 4E FE FF 1E 42 00 1C A2 83 00 1C 2E 4E
+0E 93 03 24 8E 4A 00 00 F6 3F 3E 4F 30 4D FC 47
+85 2B 4C 4F 4F 50 39 40 00 46 E5 3F 9C 50 85 4C
+45 41 56 45 1A 42 C4 1D BA 40 22 46 00 00 BA 40
+DC 45 02 00 B2 50 06 00 C4 1D A2 53 00 1C 2A 52
+19 42 00 1C 89 4A 00 00 30 4D DE 50 04 4D 4F 56
+45 00 0A 4E 38 4F 39 4F 3E 4F 0A 93 11 24 08 99
+0F 24 06 2C F8 49 00 00 18 53 1A 83 FB 23 30 4D
+08 5A 09 5A 19 83 18 83 E8 49 00 00 1A 83 FA 23
+30 4D 34 44 CA 1D FA 44 2A 44 84 12 42 51 D2 55
+A8 55 74 50 9E 4D 90 55 D0 50 0C 51 D6 49 FE 51
+18 52 24 50 1E 54 46 45 A4 53 C8 4D AE 4A 00 00
+3A 40 0E 00 39 40 CA 1D 38 40 CC 1D D9 3F 3A 40
+0E 00 39 40 CC 1D 38 40 CA 1D CC 3F 82 43 CC 1D
+30 4D 92 42 CA 1D C8 1D 30 4D 9C 51 3A 4E 82 4A
+C6 1D 2E 4E 82 4E C4 1D 3D 40 10 00 09 4A 08 49
+29 83 18 48 FE FF 0E 98 FC 2B 89 48 00 00 1D 83
+F6 23 2A 4A 0A 93 F0 23 3E 4F 3D 41 30 4D 40 4E
+09 50 57 52 5F 53 54 41 54 45 84 12 9A 51 8C 55
+D4 5C 62 50 09 52 53 54 5F 53 54 41 54 45 92 42
+0E 18 DE 51 92 42 0C 18 E0 51 EF 3F D0 51 08 50
+57 52 5F 48 45 52 45 00 92 42 C6 1D DE 51 92 42
+C4 1D E0 51 30 4D E4 51 08 52 53 54 5F 48 45 52
+45 00 92 42 C6 1D 0E 18 92 42 C4 1D 0C 18 EC 3F
+B2 40 C4 53 26 54 B2 40 8C 48 80 48 B2 40 E6 48
+F6 48 B2 40 22 49 36 49 B2 40 F4 47 02 48 82 43
+4E 5C 82 43 5A 5C 82 43 66 5C 82 43 96 5C 82 43
+A2 5C 82 43 AE 5C 30 41 52 50 04 57 49 50 45 00
+39 40 80 FF B9 43 00 00 29 53 39 90 C6 FF FA 23
+B0 12 30 52 B2 40 D4 5C 0C 18 B2 40 8C 55 0E 18
+AE 3F 18 50 07 43 4F 4D 50 41 52 45 0C 4E 38 4F
+3B 4F 39 4F 0E 4B 0E 5C 0C 24 1B 83 07 30 1C 83
+07 30 19 53 F9 98 FF FF F5 27 02 2C 3E 43 30 4D
+1E 43 30 4D 64 4F 86 5B 54 48 45 4E 5D 00 30 4D
+1E 83 30 4D C6 52 86 5B 45 4C 53 45 5D 00 87 12
+34 44 01 00 90 46 EE 49 12 4C 44 44 E0 45 4C 53
+8A 44 8A 44 94 49 04 5B 49 46 5D 00 9C 52 EA 45
+0A 53 A6 4A 2C 45 DC 45 40 53 8A 44 8A 44 94 49
+06 5B 45 4C 53 45 5D 00 9C 52 EA 45 2E 53 A6 4A
+D0 52 44 44 E0 45 2A 53 2C 45 DC 45 40 53 94 49
+06 5B 54 48 45 4E 5D 00 9C 52 EA 45 40 53 D0 52
+54 44 EA 45 48 53 2A 44 DC 45 E4 52 A6 4A 94 49
+03 0D 6B 6F 78 49 40 49 5A 46 44 44 64 46 0E 48
+62 53 82 43 C2 1D 82 4E BE 1D B2 4F C0 1D 3E 4F
+3D 40 E4 52 30 4D D6 52 84 5B 49 46 5D 00 0E 93
+3E 4F AD 27 30 4D 78 53 8B 5B 55 4E 44 45 46 49
+4E 45 44 5D 87 12 90 46 EE 49 46 4A 6C 44 86 45
+2A 44 88 53 89 5B 44 45 46 49 4E 45 44 5D 87 12
+90 46 EE 49 46 4A 6C 44 2A 44 C8 4F 06 28 57 41
+52 4D 29 00 1E 42 08 18 87 12 94 49 05 0D 1B 5B
+37 6D 78 49 8A 47 94 49 27 20 46 61 73 74 46 6F
+72 74 68 20 56 31 36 32 20 31 36 4D 48 7A 20 28
43 29 20 4A 2E 4D 2E 54 68 6F 6F 72 65 6E 73 20
-50 49 34 44 30 FF 84 47 2A 45 30 47 6C 49 0B 62
-79 74 65 73 20 66 72 65 65 20 26 4D 22 52 04 57
-41 52 4D 00 30 40 54 52 18 50 04 43 4F 4C 44 00
+78 49 34 44 30 FF A0 47 28 45 56 47 94 49 0B 62
+79 74 65 73 20 66 72 65 65 20 36 4D 6A 52 04 57
+41 52 4D 00 30 40 C4 53 94 52 04 43 4F 4C 44 00
B2 40 04 A5 20 01 B2 40 88 5A 5C 01 92 43 04 02
B2 40 FE FF 02 02 A2 83 06 02 92 D3 24 02 B2 D3
26 02 B2 43 22 02 B2 43 42 02 B2 D3 46 02 B2 43
39 40 80 00 B2 40 33 00 64 01 D2 43 61 01 92 D2
9E 01 08 18 A2 93 08 18 01 24 59 07 38 40 C2 A2
18 83 FE 23 19 83 FA 23 B2 42 B0 01 F2 D0 10 00
-2A 03 F2 C0 40 00 A2 04 3A 40 C6 52 39 40 C6 FF
+2A 03 F2 C0 40 00 A2 04 3A 40 36 54 39 40 C6 FF
89 4A 00 00 29 53 FC 23 92 42 02 18 E4 FF B2 40
18 00 0A 18 31 40 E0 1C 3F 40 80 1C 37 40 00 44
-36 40 B4 44 35 40 08 44 34 40 14 44 B2 40 0A 00
+36 40 BC 44 35 40 08 44 34 40 14 44 B2 40 0A 00
DA 1D B2 43 AC 1D 92 C3 30 01 18 42 08 18 F2 B0
10 00 20 02 04 20 38 E3 18 53 82 48 08 18 B2 40
81 00 E0 05 B2 42 E6 05 B2 40 A1 F7 E8 05 F2 D0
-30 00 2A 02 92 C3 E0 05 92 D3 FA 05 3D 40 F6 53
-18 42 08 18 38 90 0A 00 1F 27 38 90 16 00 1C 2F
-28 93 F2 22 DA 26 B4 52 84 12 46 51 44 5A F0 5A
-F8 59 44 5B BE 59 78 5A C2 56 00 00 B4 59 64 5A
-16 5A 54 5A D2 57 00 00 00 00 56 5B 72 51 4C 52
-85 48 49 32 4C 4F 87 12 84 47 DE 4F A2 4B AE 4E
-74 51 F8 53 2A 44 BA 52 04 43 4F 44 45 00 B0 12
-C0 4D A2 82 C4 1D 87 12 EE 4E BC 45 30 54 00 00
-07 45 4E 44 43 4F 44 45 87 12 82 51 0E 4E 2A 44
-44 50 03 41 53 4D 92 42 C8 1D B8 1D B2 40 FC 53
-C8 1D E5 3F 50 54 06 45 4E 44 41 53 4D 00 92 42
+30 00 2A 02 92 C3 E0 05 92 D3 FA 05 3D 40 66 55
+18 42 08 18 38 90 0A 00 8B 26 38 90 16 00 88 2E
+28 93 45 22 3A 26 24 54 84 12 42 51 B2 5B 5E 5C
+66 5B B2 5C 2C 5B E6 5B 30 58 00 00 22 5B D2 5B
+84 5B C2 5B 40 59 00 00 00 00 C4 5C 6E 51 BC 53
+85 48 49 32 4C 4F 87 12 A0 47 E0 4F CA 4B C0 4D
+70 51 68 55 2A 44 2A 54 04 43 4F 44 45 00 B0 12
+8A 4E A2 82 C4 1D 87 12 5C 4F DC 45 A0 55 00 00
+07 45 4E 44 43 4F 44 45 87 12 7E 51 6E 4E 2A 44
+44 50 03 41 53 4D 92 42 C8 1D B8 1D B2 40 6C 55
+C8 1D E5 3F C0 55 06 45 4E 44 41 53 4D 00 92 42
B8 1D C8 1D E9 3F 00 00 05 43 4F 4C 4F 4E 1A 42
C4 1D BA 40 87 12 00 00 A2 53 C4 1D B2 43 B6 1D
-30 40 82 51 00 00 05 4C 4F 32 48 49 1A 42 C4 1D
+30 40 7E 51 00 00 05 4C 4F 32 48 49 1A 42 C4 1D
BA 40 B0 12 00 00 BA 40 2A 44 02 00 A2 52 C4 1D
ED 3F 38 40 BE 1D 39 48 2A 48 09 5A 1A 52 C2 1D
09 9A 03 24 7E 9A FC 27 1A 83 0E 4A 2A 88 82 4A
-C2 1D 30 4D B0 12 2A 44 C6 49 1E 4A 72 45 C0 45
-FA 54 DA 4A C0 45 B2 4D 1C 55 FC 54 29 4E 39 90
-86 12 02 20 2E 53 30 41 39 90 85 12 03 20 1E 4E
-02 00 30 41 39 90 84 12 01 20 2E 52 30 41 19 42
-C4 1D A2 53 C4 1D 89 4E 00 00 3E 40 29 00 12 12
-C2 1D 92 53 C2 1D B0 12 2A 44 C6 49 DA 4A C0 45
-4E 55 44 55 21 53 3E 90 10 00 BB 2D 30 41 50 55
-B2 41 C2 1D 22 D3 30 41 87 12 4C 46 C2 54 60 55
-82 43 BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D 0A 4E
-3E 4F FA 90 23 00 00 00 34 20 92 53 C2 1D B0 12
-E4 54 0E 93 04 20 B2 40 00 03 BC 1D 27 3C 1E 93
-04 20 B2 40 10 03 BC 1D 21 3C 2E 93 04 20 B2 40
-20 03 BC 1D 1B 3C 2E 92 04 20 B2 40 20 02 BC 1D
-15 3C 3E 92 04 20 B2 40 30 02 BC 1D 0F 3C 3E 93
-04 20 B2 40 30 03 BC 1D 09 3C B2 40 30 00 BC 1D
-19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 4F 3D 41
-30 4D FA 90 26 00 00 00 08 20 B2 40 10 02 BC 1D
-92 53 C2 1D 30 12 D0 55 75 3F FA 90 40 00 00 00
-1A 20 B2 40 20 00 BC 1D 92 53 C2 1D B0 12 2E 55
-0E 20 B2 50 10 00 BC 1D 3E 40 2B 00 B0 12 2E 55
-32 24 92 92 BE 1D C2 1D 02 24 92 53 C2 1D 8E 10
-82 5E BC 1D D3 3F B0 12 2E 55 F9 23 B2 50 10 00
-BC 1D 3E 40 28 00 B0 12 E4 54 30 12 20 56 67 3F
-87 12 4C 46 C2 54 58 56 FE 90 26 00 00 00 3E 40
-20 00 04 20 B2 50 82 00 BC 1D C2 3F B0 12 2E 55
-DF 23 B2 50 80 00 BC 1D 3E 40 28 00 B0 12 E4 54
-B0 12 1E 55 D5 23 3D 40 B2 4D 30 4D 50 48 04 52
-45 54 49 00 87 12 34 44 00 13 A2 4B 2A 44 34 44
-2C 00 58 55 50 56 A8 56 2E 4E 1E D2 BC 1D 19 42
-BA 1D 92 3F A6 54 03 4D 4F 56 84 12 9E 56 00 40
-B6 56 05 4D 4F 56 2E 42 84 12 9E 56 40 40 00 00
-03 41 44 44 84 12 9E 56 00 50 D0 56 05 41 44 44
-2E 42 84 12 9E 56 40 50 DC 56 04 41 44 44 43 00
-84 12 9E 56 00 60 EA 56 06 41 44 44 43 2E 42 00
-84 12 9E 56 40 60 8E 56 04 53 55 42 43 00 84 12
-9E 56 00 70 08 57 06 53 55 42 43 2E 42 00 84 12
-9E 56 40 70 16 57 03 53 55 42 84 12 9E 56 00 80
-26 57 05 53 55 42 2E 42 84 12 9E 56 40 80 88 54
-03 43 4D 50 84 12 9E 56 00 90 40 57 05 43 4D 50
-2E 42 84 12 9E 56 40 90 76 54 04 44 41 44 44 00
-84 12 9E 56 00 A0 5A 57 06 44 41 44 44 2E 42 00
-84 12 9E 56 40 A0 4C 57 03 42 49 54 84 12 9E 56
-00 B0 78 57 05 42 49 54 2E 42 84 12 9E 56 40 B0
-84 57 03 42 49 43 84 12 9E 56 00 C0 92 57 05 42
-49 43 2E 42 84 12 9E 56 40 C0 9E 57 03 42 49 53
-84 12 9E 56 00 D0 AC 57 05 42 49 53 2E 42 84 12
-9E 56 40 D0 00 00 03 58 4F 52 84 12 9E 56 00 E0
-C6 57 05 58 4F 52 2E 42 84 12 9E 56 40 E0 F8 56
-03 41 4E 44 84 12 9E 56 00 F0 E0 57 05 41 4E 44
-2E 42 84 12 9E 56 40 F0 4C 46 58 55 FE 57 1A 42
-BC 1D B2 F0 70 00 BC 1D 8A 10 3A F0 0F 00 82 DA
-BC 1D 4A 3F 32 57 03 52 52 43 84 12 F8 57 00 10
-16 58 05 52 52 43 2E 42 84 12 F8 57 40 10 22 58
-04 53 57 50 42 00 84 12 F8 57 80 10 30 58 03 52
-52 41 84 12 F8 57 00 11 3E 58 05 52 52 41 2E 42
-84 12 F8 57 40 11 4A 58 03 53 58 54 84 12 F8 57
-80 11 00 00 04 50 55 53 48 00 84 12 F8 57 00 12
-64 58 06 50 55 53 48 2E 42 00 84 12 F8 57 40 12
-B8 57 04 43 41 4C 4C 00 84 12 F8 57 80 12 34 44
-2C 00 58 55 50 56 98 58 59 42 BC 1D 5A 42 BD 1D
-82 4A BC 1D BE 90 00 15 00 00 02 20 0A 89 02 3C
-09 8A 0A 49 3A 90 10 00 03 2C 5A 0E A8 3F 1A 53
-0E 4A 87 12 70 47 6C 49 0D 6F 75 74 20 6F 66 20
-62 6F 75 6E 64 73 20 4D 72 58 05 50 55 53 48 4D
-84 12 8E 58 00 15 DA 58 04 50 4F 50 4D 00 84 12
-8E 58 00 17 4C 46 C2 54 FA 58 82 43 BC 1D 92 42
-C4 1D BA 1D A2 53 C4 1D 92 53 C2 1D 3E 40 2C 00
-B0 12 2A 44 C6 49 DA 4A C0 45 B2 4D 50 56 20 59
-0A 4E 3E 4F 1A 83 2A 92 CA 2F 8A 10 5A 06 6F 3F
-58 58 04 52 52 43 4D 00 84 12 F4 58 50 00 32 59
-04 52 52 41 4D 00 84 12 F4 58 50 01 40 59 04 52
-4C 41 4D 00 84 12 F4 58 50 02 4E 59 04 52 52 55
-4D 00 84 12 F4 58 50 03 85 12 00 3C 5C 59 03 53
-3E 3D 85 12 00 38 6E 59 02 53 3C 00 85 12 00 34
-E8 58 03 30 3E 3D 85 12 00 30 82 59 02 30 3C 00
-85 12 00 30 00 00 02 55 3C 00 85 12 00 2C 96 59
-03 55 3E 3D 85 12 00 28 8C 59 03 30 3C 3E 85 12
-00 24 AA 59 02 30 3D 00 85 12 00 20 5C 48 02 49
-46 00 1A 42 C4 1D 8A 4E 00 00 A2 53 C4 1D 0E 4A
-30 4D A0 59 04 54 48 45 4E 00 1A 42 C4 1D 08 4E
-3E 4F 09 48 29 53 0A 89 0A 11 3A 90 00 02 68 2F
-88 DA 00 00 30 4D 68 57 04 45 4C 53 45 00 1A 42
-C4 1D BA 40 00 3C 00 00 A2 53 C4 1D 2F 83 8F 4A
-00 00 E3 3F D4 59 05 55 4E 54 49 4C 3A 4F 08 4E
-3E 4F 19 42 C4 1D 2A 83 0A 89 0A 11 3A 90 00 FE
-47 3B 3A F0 FF 03 08 DA 89 48 00 00 A2 53 C4 1D
-30 4D EC 57 05 41 47 41 49 4E 87 12 68 59 1C 5A
-2A 44 00 00 05 57 48 49 4C 45 87 12 C2 59 6E 44
-2A 44 78 59 06 52 45 50 45 41 54 00 87 12 68 59
-1C 5A DA 59 2A 44 00 00 03 4A 4D 50 87 12 A4 4D
-68 59 1C 5A 2A 44 3E B0 00 10 03 20 3E E0 00 04
-30 4D 3E 90 00 34 06 28 03 24 3E 40 00 34 30 4D
-3E 40 00 38 30 4D 00 00 04 3F 4A 4D 50 00 87 12
-86 5A A4 4D 6E 44 1C 5A 2A 44 BC 5A 3D 41 08 4E
-3E 4F 2A 48 0A 93 04 20 98 42 C4 1D 00 00 30 4D
-88 43 00 00 A4 3F 82 58 03 42 57 31 84 12 BA 5A
-00 00 D8 5A 03 42 57 32 84 12 BA 5A 00 00 E4 5A
-03 42 57 33 84 12 BA 5A 00 00 FC 5A 3D 41 1A 42
-C4 1D 28 4E 08 93 08 20 BA 4F 00 00 A2 53 C4 1D
-8E 4A 00 00 3E 4F 30 4D 8E 43 00 00 61 3F 00 00
-03 46 57 31 84 12 FA 5A 00 00 20 5B 03 46 57 32
-84 12 FA 5A 00 00 2C 5B 03 46 57 33 84 12 FA 5A
-00 00 38 5B 04 47 4F 54 4F 00 87 12 68 59 A4 4D
-98 4B 2A 44 A8 5A 05 3F 47 4F 54 4F 87 12 86 5A
-A4 4D 98 4B 2A 44
+C2 1D 30 4D B0 12 2A 44 EE 49 46 4A EA 45 68 56
+02 4B E0 45 AE 4D 8A 56 6A 56 29 4E 39 90 86 12
+02 20 2E 53 30 41 39 90 85 12 03 20 1E 4E 02 00
+30 41 39 90 84 12 01 20 2E 52 30 41 19 42 C4 1D
+A2 53 C4 1D 89 4E 00 00 3E 40 29 00 12 12 C2 1D
+92 53 C2 1D B0 12 2A 44 EE 49 02 4B E0 45 BC 56
+B2 56 21 53 3E 90 10 00 BB 2D 30 41 BE 56 B2 41
+C2 1D 22 D3 30 41 87 12 90 46 32 56 CE 56 82 43
+BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D 0A 4E 3E 4F
+FA 90 23 00 00 00 34 20 92 53 C2 1D B0 12 54 56
+0E 93 04 20 B2 40 00 03 BC 1D 27 3C 1E 93 04 20
+B2 40 10 03 BC 1D 21 3C 2E 93 04 20 B2 40 20 03
+BC 1D 1B 3C 2E 92 04 20 B2 40 20 02 BC 1D 15 3C
+3E 92 04 20 B2 40 30 02 BC 1D 0F 3C 3E 93 04 20
+B2 40 30 03 BC 1D 09 3C B2 40 30 00 BC 1D 19 42
+C4 1D A2 53 C4 1D 89 4E 00 00 3E 4F 3D 41 30 4D
+FA 90 26 00 00 00 08 20 B2 40 10 02 BC 1D 92 53
+C2 1D 30 12 3E 57 76 3F FA 90 40 00 00 00 1A 20
+B2 40 20 00 BC 1D 92 53 C2 1D B0 12 9C 56 0E 20
+B2 50 10 00 BC 1D 3E 40 2B 00 B0 12 9C 56 32 24
+92 92 BE 1D C2 1D 02 24 92 53 C2 1D 8E 10 82 5E
+BC 1D D3 3F B0 12 9C 56 F9 23 B2 50 10 00 BC 1D
+3E 40 28 00 B0 12 54 56 30 12 8E 57 67 3F 87 12
+90 46 32 56 C6 57 FE 90 26 00 00 00 3E 40 20 00
+04 20 B2 50 82 00 BC 1D C2 3F B0 12 9C 56 DF 23
+B2 50 80 00 BC 1D 3E 40 28 00 B0 12 54 56 B0 12
+8C 56 D5 23 3D 40 AE 4D 30 4D 78 48 04 52 45 54
+49 00 87 12 34 44 00 13 CA 4B 2A 44 34 44 2C 00
+C6 56 BE 57 16 58 2E 4E 1E D2 BC 1D 19 42 BA 1D
+92 3F 16 56 03 4D 4F 56 84 12 0C 58 00 40 24 58
+05 4D 4F 56 2E 42 84 12 0C 58 40 40 00 00 03 41
+44 44 84 12 0C 58 00 50 3E 58 05 41 44 44 2E 42
+84 12 0C 58 40 50 4A 58 04 41 44 44 43 00 84 12
+0C 58 00 60 58 58 06 41 44 44 43 2E 42 00 84 12
+0C 58 40 60 FC 57 04 53 55 42 43 00 84 12 0C 58
+00 70 76 58 06 53 55 42 43 2E 42 00 84 12 0C 58
+40 70 84 58 03 53 55 42 84 12 0C 58 00 80 94 58
+05 53 55 42 2E 42 84 12 0C 58 40 80 F8 55 03 43
+4D 50 84 12 0C 58 00 90 AE 58 05 43 4D 50 2E 42
+84 12 0C 58 40 90 E6 55 04 44 41 44 44 00 84 12
+0C 58 00 A0 C8 58 06 44 41 44 44 2E 42 00 84 12
+0C 58 40 A0 BA 58 03 42 49 54 84 12 0C 58 00 B0
+E6 58 05 42 49 54 2E 42 84 12 0C 58 40 B0 F2 58
+03 42 49 43 84 12 0C 58 00 C0 00 59 05 42 49 43
+2E 42 84 12 0C 58 40 C0 0C 59 03 42 49 53 84 12
+0C 58 00 D0 1A 59 05 42 49 53 2E 42 84 12 0C 58
+40 D0 00 00 03 58 4F 52 84 12 0C 58 00 E0 34 59
+05 58 4F 52 2E 42 84 12 0C 58 40 E0 66 58 03 41
+4E 44 84 12 0C 58 00 F0 4E 59 05 41 4E 44 2E 42
+84 12 0C 58 40 F0 90 46 C6 56 6C 59 1A 42 BC 1D
+B2 F0 70 00 BC 1D 8A 10 3A F0 0F 00 82 DA BC 1D
+4A 3F A0 58 03 52 52 43 84 12 66 59 00 10 84 59
+05 52 52 43 2E 42 84 12 66 59 40 10 90 59 04 53
+57 50 42 00 84 12 66 59 80 10 9E 59 03 52 52 41
+84 12 66 59 00 11 AC 59 05 52 52 41 2E 42 84 12
+66 59 40 11 B8 59 03 53 58 54 84 12 66 59 80 11
+00 00 04 50 55 53 48 00 84 12 66 59 00 12 D2 59
+06 50 55 53 48 2E 42 00 84 12 66 59 40 12 26 59
+04 43 41 4C 4C 00 84 12 66 59 80 12 34 44 2C 00
+C6 56 BE 57 06 5A 59 42 BC 1D 5A 42 BD 1D 82 4A
+BC 1D BE 90 00 15 00 00 02 20 0A 89 02 3C 09 8A
+0A 49 3A 90 10 00 03 2C 5A 0E A8 3F 1A 53 0E 4A
+87 12 8A 47 94 49 0D 6F 75 74 20 6F 66 20 62 6F
+75 6E 64 73 30 4D E0 59 05 50 55 53 48 4D 84 12
+FC 59 00 15 48 5A 04 50 4F 50 4D 00 84 12 FC 59
+00 17 90 46 32 56 68 5A 82 43 BC 1D 92 42 C4 1D
+BA 1D A2 53 C4 1D 92 53 C2 1D 3E 40 2C 00 B0 12
+2A 44 EE 49 02 4B E0 45 AE 4D BE 57 8E 5A 0A 4E
+3E 4F 1A 83 2A 92 CA 2F 8A 10 5A 06 6F 3F C6 59
+04 52 52 43 4D 00 84 12 62 5A 50 00 A0 5A 04 52
+52 41 4D 00 84 12 62 5A 50 01 AE 5A 04 52 4C 41
+4D 00 84 12 62 5A 50 02 BC 5A 04 52 52 55 4D 00
+84 12 62 5A 50 03 85 12 00 3C CA 5A 03 53 3E 3D
+85 12 00 38 DC 5A 02 53 3C 00 85 12 00 34 56 5A
+03 30 3E 3D 85 12 00 30 F0 5A 02 30 3C 00 85 12
+00 30 00 00 02 55 3C 00 85 12 00 2C 04 5B 03 55
+3E 3D 85 12 00 28 FA 5A 03 30 3C 3E 85 12 00 24
+18 5B 02 30 3D 00 85 12 00 20 84 48 02 49 46 00
+1A 42 C4 1D 8A 4E 00 00 A2 53 C4 1D 0E 4A 30 4D
+0E 5B 04 54 48 45 4E 00 1A 42 C4 1D 08 4E 3E 4F
+09 48 29 53 0A 89 0A 11 3A 90 00 02 68 2F 88 DA
+00 00 30 4D D6 58 04 45 4C 53 45 00 1A 42 C4 1D
+BA 40 00 3C 00 00 A2 53 C4 1D 2F 83 8F 4A 00 00
+E3 3F 42 5B 05 55 4E 54 49 4C 3A 4F 08 4E 3E 4F
+19 42 C4 1D 2A 83 0A 89 0A 11 3A 90 00 FE 47 3B
+3A F0 FF 03 08 DA 89 48 00 00 A2 53 C4 1D 30 4D
+5A 59 05 41 47 41 49 4E 87 12 D6 5A 8A 5B 2A 44
+00 00 05 57 48 49 4C 45 87 12 30 5B 78 44 2A 44
+E6 5A 06 52 45 50 45 41 54 00 87 12 D6 5A 8A 5B
+48 5B 2A 44 00 00 03 4A 4D 50 87 12 A0 4D D6 5A
+8A 5B 2A 44 3E B0 00 10 03 20 3E E0 00 04 30 4D
+3E 90 00 34 06 28 03 24 3E 40 00 34 30 4D 3E 40
+00 38 30 4D 00 00 04 3F 4A 4D 50 00 87 12 F4 5B
+A0 4D 78 44 8A 5B 2A 44 2A 5C 3D 41 08 4E 3E 4F
+2A 48 0A 93 04 20 98 42 C4 1D 00 00 30 4D 88 43
+00 00 A4 3F F0 59 03 42 57 31 84 12 28 5C 00 00
+46 5C 03 42 57 32 84 12 28 5C 00 00 52 5C 03 42
+57 33 84 12 28 5C 00 00 6A 5C 3D 41 1A 42 C4 1D
+28 4E 08 93 08 20 BA 4F 00 00 A2 53 C4 1D 8E 4A
+00 00 3E 4F 30 4D 8E 43 00 00 61 3F 00 00 03 46
+57 31 84 12 68 5C 00 00 8E 5C 03 46 57 32 84 12
+68 5C 00 00 9A 5C 03 46 57 33 84 12 68 5C 00 00
+A6 5C 04 47 4F 54 4F 00 87 12 D6 5A A0 4D C0 4B
+2A 44 16 5C 05 3F 47 4F 54 4F 87 12 F4 5B A0 4D
+C0 4B 2A 44
@FFC6
-C6 52 C6 52 C6 52 C6 52 C6 52 C6 52 C6 52 C6 52
-C6 52 C6 52 C6 52 C6 52 C6 52 C6 52 C6 52 6A 48
-C6 52 C6 52 C6 52 C6 52 C6 52 C6 52 C6 52 C6 52
-C6 52 C6 52 C6 52 C6 52 C6 52
+36 54 36 54 36 54 36 54 36 54 36 54 36 54 36 54
+36 54 36 54 36 54 36 54 36 54 36 54 36 54 92 48
+36 54 36 54 36 54 36 54 36 54 36 54 36 54 36 54
+36 54 36 54 36 54 36 54 36 54
q
+++ /dev/null
-@1800
-10 00 6A 48 80 3E 30 75 FD FF 18 00 68 5B 1E 54
-2A 48 3C 48 00 00 00 00
-@1DAA
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00
-@4400
-3A 41 0D 12 0D 4A 30 4D 2F 83 8F 4E 00 00 3E 41
-2E 4E 30 4D 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E
-30 4D 00 00 04 45 58 49 54 00 3D 41 30 4D 00 00
-03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 44
-03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
-44 55 50 00 0E 93 F6 23 30 4D 40 44 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 44 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E 44 02 3E 52 00 0E 12 3E 4F 30 4D 8E 44
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 44
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C 44 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 44 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 45
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 44 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA 44 03 41 4E 44 3E FF 30 4D 7A 44 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E 45 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 45 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E 45 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 45 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 44 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
-3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE 45 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 45 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 45 03 3E 49 4E 85 12 C2 1D 10 45
-04 42 41 53 45 00 85 12 DA 1D C0 44 05 53 54 41
-54 45 85 12 B6 1D 30 46 02 42 4C 00 85 12 20 00
-94 45 02 3C 23 00 B2 40 AA 1D AA 1D 30 4D 1E 15
-0E 43 3D 40 20 00 0A 93 04 20 0D 11 0A 4C 0C 43
-09 43 0E 9B 01 28 0E 8B 09 69 08 68 1D 83 07 30
-0C 5C 0A 6A 0E 6E F5 2B 0E 8B 12 D3 F5 3F 0A 4E
-1D 17 30 41 48 46 01 23 1B 42 DA 1D 2C 4F 0A 4E
-B0 12 5E 46 8F 49 00 00 0E 48 7A 90 0A 00 02 28
-3A 50 07 00 3A 50 30 00 92 83 AA 1D 18 42 AA 1D
-C8 4A 00 00 30 4D 96 46 02 23 53 00 87 12 98 46
-D2 46 2D 83 09 93 E0 23 0E 93 DE 23 3D 41 30 4D
-C8 46 02 23 3E 00 9F 42 AA 1D 00 00 3E 40 AA 1D
-2E 8F 30 4D 00 46 04 48 4F 4C 44 00 0A 4E 3E 4F
-DB 3F 3C 46 04 53 49 47 4E 00 0E 93 3E 4F 3A 40
-2D 00 D2 33 30 4D F4 45 03 55 44 2E 87 12 56 46
-CC 46 E6 46 50 49 18 49 2A 44 18 47 02 55 2E 00
-2F 83 8F 4E 00 00 0E 43 F1 3F 3E B0 00 80 06 24
-BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D DA 44
-02 44 2E 00 87 12 56 46 6E 44 80 44 3A 47 CC 46
-92 44 0A 47 E6 46 50 49 18 49 2A 44 52 45 01 2E
-3E B0 00 80 DD 27 2F 83 3E 43 EC 3F F6 46 04 48
-45 52 45 00 2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D
-62 45 05 41 4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D
-E2 46 02 43 2C 00 1A 42 C4 1D CA 4E 00 00 92 53
-C4 1D 3E 4F 30 4D 2F 83 8F 4E 00 00 B0 12 2A 48
-92 B3 FC 05 FD 27 1E 42 EC 05 B0 12 3C 48 30 4D
-30 40 B6 47 7E 47 05 28 4B 45 59 29 18 42 EC 05
-EA 3F 12 46 03 4B 45 59 30 40 DC 47 92 47 06 41
-43 43 45 50 54 00 3C 40 A8 48 3B 40 72 48 2D 15
-0A 4E 2E 4F 0A 5E 3B 40 0D 00 3C 40 20 00 3D 40
-9C 48 92 B3 FC 05 05 24 18 42 EC 05 38 90 0A 00
-04 20 21 53 39 40 56 48 4D 15 B2 40 11 00 EE 05
-A2 B3 FC 05 FD 27 D2 C3 22 02 30 41 B2 40 13 00
-EE 05 A2 B3 FC 05 FD 27 D2 D3 22 02 30 41 00 00
-05 53 4C 45 45 50 30 40 64 48 00 00 07 28 53 4C
-45 45 50 29 12 D2 0A 18 F6 3F 21 52 3A 17 58 42
-EC 05 48 9B E3 27 48 9C 06 2C 78 92 11 20 2E 9F
-0F 24 1E 83 05 3C 0E 9A 03 24 CE 48 00 00 1E 53
-82 48 EE 05 A2 B3 FC 05 FD 27 30 4D 9E 48 2D 83
-92 B3 FC 05 FD 27 E3 23 B2 40 18 00 0A 18 3E 8F
-3D 41 30 4D D6 47 06 28 45 4D 49 54 29 00 08 4E
-3E 4F E6 3F 50 47 04 45 4D 49 54 00 30 40 BE 48
-C6 48 04 45 43 48 4F 00 B2 40 82 48 90 48 30 4D
-6E 47 06 4E 4F 45 43 48 4F 00 B2 40 30 4D 90 48
-30 4D B6 48 04 28 43 52 29 00 2F 83 8F 4E 00 00
-3E 40 0D 00 E3 3F A2 47 02 43 52 00 30 40 FA 48
-04 47 05 53 50 41 43 45 2F 83 8F 4E 00 00 3E 40
-20 00 D4 3F 12 49 06 53 50 41 43 45 53 00 0E 93
-09 24 0D 12 3D 40 3A 49 EF 3F 3C 49 2D 83 1E 83
-EB 23 3D 41 3E 4F 30 4D 2C 47 04 54 59 50 45 00
-0E 93 95 24 2A 4F 8F 5E 00 00 0E 4A 87 12 CA 45
-02 46 0A 45 CC 48 EC 45 60 49 2A 44 2F 82 8F 4E
-02 00 7E 4D 8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D
-26 49 82 53 22 00 87 12 34 44 6C 49 A2 4B 34 44
-22 00 C6 49 96 49 3D 41 6E 4E 1E 83 82 5E C4 1D
-3E 4F 92 B3 C4 1D A2 63 C4 1D 30 4D E2 48 82 2E
-22 00 87 12 86 49 34 44 50 49 A2 4B 2A 44 00 00
-04 57 4F 52 44 00 3C 40 BE 1D 39 4C 3A 4C 09 5A
-3A 5C 28 4C 09 9A 19 24 7E 9A FC 27 1A 83 3B 40
-60 00 C8 4C 00 00 09 9A 0C 24 7C 4A 4E 9C 09 24
-18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F 7C 80 20 00
-F0 3F 1A 82 C0 1D 82 4A C2 1D 1E 42 C4 1D 08 8E
-CE 48 00 00 30 4D 00 00 04 46 49 4E 44 00 2F 83
-0C 4E 65 4C 74 40 80 00 3B 40 CA 1D 3E 4B 0E 93
-1E 24 58 4C 01 00 78 F0 1E 00 0E 58 2E 53 1E 4E
-FE FF 0E 93 F3 27 09 4E 78 49 48 C4 48 95 F7 23
-0A 4C 1A 53 FA 99 00 00 F2 23 58 83 FA 23 19 B3
-09 63 0C 49 6A 4E 1E 43 4A 93 01 30 2E 83 8F 4C
-00 00 35 40 08 44 34 40 14 44 30 4D 2F 53 2F 53
-3E 4F 30 4D 26 46 07 3E 4E 55 4D 42 45 52 3C 4F
-38 4F 29 4F 2F 82 1B 42 DA 1D 6A 4C 7A 80 30 00
-7A 90 0A 00 02 28 7A 80 07 00 0A 9B 13 2C 82 49
-D0 04 82 48 D2 04 82 4B C8 04 19 42 E4 04 18 42
-E6 04 09 5A 08 63 1C 53 1E 83 E7 23 8F 49 04 00
-8F 48 02 00 8F 4C 00 00 30 4D 03 12 0D 12 1B 42
-DA 1D 0B 12 32 C0 00 02 6D 4E 0D 5E 0C 4E 7A 40
-2E 00 0D 9C 0A 28 7A 9C FC 23 32 D0 00 02 FC 4C
-FE FF 0D 9C FC 2F DE 83 00 00 09 43 08 43 3D 40
-50 4B 3F 82 8F 4E 06 00 0C 4E 7E 4C 6A 4C 7A 90
-2D 00 10 2C 3B 40 10 00 7A 80 24 00 06 24 2B 43
-5A 83 03 24 3B 52 6A 53 B0 23 1C 53 1E 83 6A 4C
-7A 90 2D 00 AA 23 1C 53 1E 83 B1 43 04 00 A5 3F
-52 4B 2F 53 0E 93 2C 17 82 4C DA 1D 03 24 2F 52
-0E F3 30 4D 9F 4F 02 00 04 00 BF 4F 00 00 3E E3
-09 20 3E E3 BF E3 02 00 BF E3 00 00 9F 53 02 00
-8F 63 00 00 32 B0 00 02 01 20 2F 53 30 4D D2 48
-07 45 58 45 43 55 54 45 0A 4E 3E 4F 00 4A 28 45
-01 2C 1A 42 C4 1D A2 53 C4 1D 8A 4E 00 00 3E 4F
-30 4D A0 4B 87 4C 49 54 45 52 41 4C 82 93 B6 1D
-16 24 32 B0 00 02 09 24 1A 42 C4 1D A2 52 C4 1D
-BA 40 34 44 00 00 BA 4F 02 00 1A 42 C4 1D A2 52
-C4 1D BA 40 34 44 00 00 8A 4E 02 00 3E 4F 30 4D
-08 49 05 43 4F 55 4E 54 2F 83 1E 53 8F 4E 00 00
-5E 4E FF FF 30 4D 82 4E BE 1D B2 4F C0 1D 3E 4F
-82 43 C2 1D 87 12 4C 46 C6 49 1C 4C 3D 40 28 4C
-FE 22 3D 41 3E 4F 30 4D 2A 4C 0A 4E 3E 4F 3D 40
-40 4C 53 27 3D 40 16 4C 1A E2 B6 1D B2 27 AC 23
-42 4C 3E 4F 3D 40 16 4C B9 23 DE 53 00 00 68 4E
-08 5E F8 40 3F 00 00 00 3D 40 0C 4E CD 3F 90 4B
-08 45 56 41 4C 55 41 54 45 00 39 40 BE 1D 39 12
-39 12 39 12 0D 12 B0 12 2A 44 06 4C 7E 4C 3D 41
-B2 41 C2 1D B2 41 C0 1D B2 41 BE 1D 30 4D 7A 45
-04 51 55 49 54 00 31 40 E0 1C B2 40 00 1C 00 1C
-82 43 B6 1D 82 43 08 18 B0 12 2A 44 6C 49 04 0D
-6F 6B 20 00 50 49 34 44 38 1D 44 44 34 44 50 00
-F6 47 18 49 06 4C 34 44 7E 1C CE 44 B2 45 6C 49
-0D 73 74 61 63 6B 20 65 6D 70 74 79 20 21 1A 4D
-34 44 30 FF 84 47 B2 45 6C 49 0B 46 52 41 4D 20
-66 75 6C 6C 20 21 1A 4D 42 46 F4 44 C0 45 AC 4C
-6C 49 04 0D 20 20 20 00 BC 45 B4 4C EE 47 05 41
-42 4F 52 54 3F 40 80 1C BE 3F 8F 93 02 00 AE 26
-B2 40 82 48 90 48 B0 12 0C 52 82 43 E2 5A 82 43
-EE 5A 82 43 FA 5A 82 43 2A 5B 82 43 36 5B 82 43
-42 5B A2 B3 FC 05 FD 27 B2 40 11 00 EE 05 D2 C3
-22 02 92 C3 FC 05 38 40 A0 AA 39 42 19 83 FE 23
-18 83 FB 23 92 B3 FC 05 F4 23 87 12 6C 49 04 1B
-5B 37 6D 00 50 49 50 49 6C 49 04 1B 5B 30 6D 00
-50 49 4E 51 90 51 96 51 14 4D 0E 4D 86 41 42 4F
-52 54 22 00 87 12 86 49 34 44 1A 4D A2 4B 2A 44
-18 4A 01 27 87 12 4C 46 C6 49 1E 4A C0 45 B2 4D
-2A 44 4A 4C 52 46 81 5C 92 42 BE 1D C2 1D 30 4D
-87 12 A2 49 4C 46 C6 49 CA 4D 08 4E 7A 4E 5A D3
-5A 53 0A 58 19 42 C8 1D 6E 4E 3E F0 1E 00 09 5E
-82 48 AE 1D 82 49 B0 1D 82 4A B2 1D 2A 52 82 4A
-C4 1D 3E 4F 3D 41 30 41 87 12 6C 49 0F 73 74 61
-63 6B 20 6D 69 73 6D 61 74 63 68 21 20 4D 82 9F
-B4 1D F2 23 18 42 AE 1D 19 42 B0 1D A8 49 FE FF
-89 48 00 00 30 4D C0 49 08 56 41 52 49 41 42 4C
-45 00 B0 12 C0 4D BA 40 86 12 FC FF EF 3F F2 4B
-08 43 4F 4E 53 54 41 4E 54 00 B0 12 C0 4D BA 40
-85 12 FC FF 8A 4E FE FF 3E 4F E0 3F 40 4E 06 43
-52 45 41 54 45 00 B0 12 C0 4D BA 40 85 12 FC FF
-8A 4A FE FF D3 3F 60 4C 05 44 4F 45 53 3E 1A 42
-B2 1D BA 40 84 12 00 00 8A 4D 02 00 3D 41 30 4D
-78 4E 05 44 45 46 45 52 B0 12 C0 4D BA 40 30 40
-FC FF BA 40 8E 4E FE FF B9 3F 00 00 81 5B 82 43
-B6 1D 30 4D B6 4D 01 5D B2 43 B6 1D 30 4D 82 49
-87 52 45 43 55 52 53 45 19 42 C4 1D 99 42 B2 1D
-00 00 A2 53 C4 1D 30 4D AC 4E 01 3A B0 12 C0 4D
-BA 40 87 12 FC FF A2 83 C4 1D B2 43 B6 1D 82 4F
-B4 1D 30 4D DA 4E 81 3B 82 93 B6 1D 5D 27 87 12
-34 44 2A 44 A2 4B 0E 4E AE 4E 2A 44 F4 48 09 49
-4D 4D 45 44 49 41 54 45 1A 42 AE 1D FA D0 80 00
-00 00 30 4D BE 4F 02 00 3E 4F 30 4D 0E 4F 82 49
-53 00 87 12 42 46 F4 44 C0 45 46 4F 52 4F 34 44
-24 4F A2 4B 2A 44 A4 4D 24 4F 2A 44 F6 4E 83 5B
-27 5D 87 12 A4 4D 34 44 34 44 A2 4B A2 4B 2A 44
-90 4C 88 50 4F 53 54 50 4F 4E 45 00 87 12 4C 46
-C6 49 1E 4A 54 44 C0 45 B2 4D 7E 45 C0 45 8C 4F
-34 44 34 44 A2 4B A2 4B 34 44 A2 4B A2 4B 2A 44
-92 4F 3A 4E 82 4A C6 1D 2E 4E 82 4E C4 1D 3D 40
-10 00 09 4A 08 49 29 83 18 48 FE FF 0E 98 FC 2B
-89 48 00 00 1D 83 F6 23 2A 4A 0A 93 F0 23 3E 4F
-3D 41 30 4D 2E 4F 82 49 46 00 2F 83 8F 4E 00 00
-1E 42 C4 1D BE 40 C0 45 00 00 A2 52 C4 1D 2E 53
-30 4D 92 4E 84 45 4C 53 45 00 1A 42 C4 1D BA 40
-BC 45 00 00 2A 52 82 4A C4 1D 8E 4A 00 00 2A 83
-0E 4A 30 4D 4A 49 84 54 48 45 4E 00 9E 42 C4 1D
-00 00 3E 4F 30 4D 5E 4E 85 42 45 47 49 4E 30 40
-84 47 06 50 85 55 4E 54 49 4C 39 40 C0 45 1A 42
-C4 1D A2 52 C4 1D 8A 49 00 00 8A 4E 02 00 3E 4F
-30 4D 8C 4D 85 41 47 41 49 4E 39 40 BC 45 EF 3F
-28 4E 85 57 48 49 4C 45 87 12 CA 4F 6E 44 2A 44
-C0 4E 86 52 45 50 45 41 54 00 87 12 4A 50 0C 50
-2A 44 E4 4F 82 44 4F 00 2F 83 8F 4E 00 00 1E 42
-C4 1D BE 40 CA 45 00 00 2E 53 82 4E C4 1D A2 53
-00 1C 1A 42 00 1C 8A 43 00 00 30 4D B4 4B 84 4C
-4F 4F 50 00 39 40 EC 45 1A 42 C4 1D A2 52 C4 1D
-8A 49 00 00 8A 4E 02 00 1E 42 00 1C A2 83 00 1C
-2E 4E 0E 93 04 24 9E 42 C4 1D 00 00 F5 3F 3E 4F
-30 4D E4 47 85 2B 4C 4F 4F 50 39 40 DA 45 E4 3F
-9E 50 85 4C 45 41 56 45 1A 42 C4 1D BA 40 FC 45
-00 00 BA 40 BC 45 02 00 B2 50 06 00 C4 1D A2 53
-00 1C 2A 52 19 42 00 1C 89 4A 00 00 30 4D E2 50
-04 4D 4F 56 45 00 0A 4E 38 4F 39 4F 3E 4F 0A 93
-11 24 08 99 0F 24 06 2C F8 49 00 00 18 53 1A 83
-FB 23 30 4D 08 5A 09 5A 19 83 18 83 E8 49 00 00
-1A 83 FA 23 30 4D 34 44 CA 1D FC 44 2A 44 84 12
-46 51 64 54 3A 54 74 50 A2 4D 22 54 D4 50 10 51
-AE 49 B4 51 E8 51 24 50 AE 52 48 45 4E 4F B6 4E
-86 4A 00 00 3A 40 0C 00 39 40 CA 1D 38 40 CC 1D
-D9 3F 3A 40 0E 00 39 40 CC 1D 38 40 CA 1D CC 3F
-82 43 CC 1D 30 4D 92 42 CA 1D C8 1D 30 4D 62 4F
-09 50 57 52 5F 53 54 41 54 45 84 12 90 4F 1E 54
-68 5B A0 51 08 50 57 52 5F 48 45 52 45 00 92 42
-C4 1D B0 51 92 42 C6 1D AE 51 EF 3F 62 50 09 52
-53 54 5F 53 54 41 54 45 92 42 0C 18 B0 51 92 42
-0E 18 AE 51 E2 3F CE 51 08 52 53 54 5F 48 45 52
-45 00 92 42 C4 1D 0C 18 92 42 C6 1D 0E 18 DF 3F
-B2 40 54 52 B6 52 B2 40 64 48 58 48 B2 40 BE 48
-CE 48 B2 40 FA 48 0E 49 B2 40 DC 47 EA 47 30 41
-52 50 04 57 49 50 45 00 39 40 80 FF B9 43 00 00
-29 53 39 90 C6 FF FA 23 B0 12 00 52 B2 40 68 5B
-C4 1D B2 40 1E 54 C6 1D D4 3F C6 4F 06 28 57 41
-52 4D 29 00 1E 42 08 18 87 12 6C 49 05 0D 1B 5B
-37 6D 50 49 70 47 6C 49 27 20 46 61 73 74 46 6F
-72 74 68 20 56 31 36 30 20 31 36 4D 48 7A 20 28
-43 29 20 4A 2E 4D 2E 54 68 6F 6F 72 65 6E 73 20
-50 49 34 44 30 FF 84 47 2A 45 30 47 6C 49 0B 62
-79 74 65 73 20 66 72 65 65 20 26 4D 22 52 04 57
-41 52 4D 00 30 40 54 52 18 50 04 43 4F 4C 44 00
-B2 40 04 A5 20 01 B2 40 88 5A 5C 01 92 43 04 02
-B2 40 FE FF 02 02 A2 83 06 02 92 D3 24 02 B2 D3
-26 02 B2 43 22 02 B2 43 42 02 B2 D3 46 02 B2 43
-62 02 B2 D3 66 02 B2 40 80 00 84 02 B2 40 7F FF
-82 02 B2 D0 7F FF 86 02 F2 43 22 03 F2 D3 26 03
-F2 40 A5 00 41 01 F2 40 10 00 40 01 D2 43 41 01
-F2 40 A5 00 61 01 B2 40 48 00 62 01 82 43 66 01
-39 40 80 00 B2 40 33 00 64 01 D2 43 61 01 92 D2
-9E 01 08 18 A2 93 08 18 01 24 59 07 38 40 C2 A2
-18 83 FE 23 19 83 FA 23 B2 42 B0 01 F2 D0 10 00
-2A 03 F2 C0 40 00 A2 04 3A 40 C6 52 39 40 C6 FF
-89 4A 00 00 29 53 FC 23 92 42 02 18 E4 FF B2 40
-18 00 0A 18 31 40 E0 1C 3F 40 80 1C 37 40 00 44
-36 40 B4 44 35 40 08 44 34 40 14 44 B2 40 0A 00
-DA 1D B2 43 AC 1D 92 C3 30 01 18 42 08 18 F2 B0
-10 00 20 02 04 20 38 E3 18 53 82 48 08 18 B2 40
-81 00 E0 05 B2 40 05 00 E6 05 B2 40 00 49 E8 05
-F2 D0 30 00 2A 02 92 C3 E0 05 92 D3 FA 05 3D 40
-F8 53 18 42 08 18 38 90 0A 00 1E 27 38 90 16 00
-1B 2F 28 93 F1 22 D9 26 B4 52 84 12 46 51 46 5A
-F2 5A FA 59 46 5B C0 59 7A 5A C4 56 00 00 B6 59
-66 5A 18 5A 56 5A D4 57 00 00 00 00 58 5B 72 51
-4C 52 85 48 49 32 4C 4F 87 12 84 47 DE 4F A2 4B
-AE 4E 74 51 FA 53 2A 44 BA 52 04 43 4F 44 45 00
-B0 12 C0 4D A2 82 C4 1D 87 12 EE 4E BC 45 32 54
-00 00 07 45 4E 44 43 4F 44 45 87 12 82 51 0E 4E
-2A 44 44 50 03 41 53 4D 92 42 C8 1D B8 1D B2 40
-FE 53 C8 1D E5 3F 52 54 06 45 4E 44 41 53 4D 00
-92 42 B8 1D C8 1D E9 3F 00 00 05 43 4F 4C 4F 4E
-1A 42 C4 1D BA 40 87 12 00 00 A2 53 C4 1D B2 43
-B6 1D 30 40 82 51 00 00 05 4C 4F 32 48 49 1A 42
-C4 1D BA 40 B0 12 00 00 BA 40 2A 44 02 00 A2 52
-C4 1D ED 3F 38 40 BE 1D 39 48 2A 48 09 5A 1A 52
-C2 1D 09 9A 03 24 7E 9A FC 27 1A 83 0E 4A 2A 88
-82 4A C2 1D 30 4D B0 12 2A 44 C6 49 1E 4A 72 45
-C0 45 FC 54 DA 4A C0 45 B2 4D 1E 55 FE 54 29 4E
-39 90 86 12 02 20 2E 53 30 41 39 90 85 12 03 20
-1E 4E 02 00 30 41 39 90 84 12 01 20 2E 52 30 41
-19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 40 29 00
-12 12 C2 1D 92 53 C2 1D B0 12 2A 44 C6 49 DA 4A
-C0 45 50 55 46 55 21 53 3E 90 10 00 BB 2D 30 41
-52 55 B2 41 C2 1D 22 D3 30 41 87 12 4C 46 C4 54
-62 55 82 43 BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D
-0A 4E 3E 4F FA 90 23 00 00 00 34 20 92 53 C2 1D
-B0 12 E6 54 0E 93 04 20 B2 40 00 03 BC 1D 27 3C
-1E 93 04 20 B2 40 10 03 BC 1D 21 3C 2E 93 04 20
-B2 40 20 03 BC 1D 1B 3C 2E 92 04 20 B2 40 20 02
-BC 1D 15 3C 3E 92 04 20 B2 40 30 02 BC 1D 0F 3C
-3E 93 04 20 B2 40 30 03 BC 1D 09 3C B2 40 30 00
-BC 1D 19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 4F
-3D 41 30 4D FA 90 26 00 00 00 08 20 B2 40 10 02
-BC 1D 92 53 C2 1D 30 12 D2 55 75 3F FA 90 40 00
-00 00 1A 20 B2 40 20 00 BC 1D 92 53 C2 1D B0 12
-30 55 0E 20 B2 50 10 00 BC 1D 3E 40 2B 00 B0 12
-30 55 32 24 92 92 BE 1D C2 1D 02 24 92 53 C2 1D
-8E 10 82 5E BC 1D D3 3F B0 12 30 55 F9 23 B2 50
-10 00 BC 1D 3E 40 28 00 B0 12 E6 54 30 12 22 56
-67 3F 87 12 4C 46 C4 54 5A 56 FE 90 26 00 00 00
-3E 40 20 00 04 20 B2 50 82 00 BC 1D C2 3F B0 12
-30 55 DF 23 B2 50 80 00 BC 1D 3E 40 28 00 B0 12
-E6 54 B0 12 20 55 D5 23 3D 40 B2 4D 30 4D 50 48
-04 52 45 54 49 00 87 12 34 44 00 13 A2 4B 2A 44
-34 44 2C 00 5A 55 52 56 AA 56 2E 4E 1E D2 BC 1D
-19 42 BA 1D 92 3F A8 54 03 4D 4F 56 84 12 A0 56
-00 40 B8 56 05 4D 4F 56 2E 42 84 12 A0 56 40 40
-00 00 03 41 44 44 84 12 A0 56 00 50 D2 56 05 41
-44 44 2E 42 84 12 A0 56 40 50 DE 56 04 41 44 44
-43 00 84 12 A0 56 00 60 EC 56 06 41 44 44 43 2E
-42 00 84 12 A0 56 40 60 90 56 04 53 55 42 43 00
-84 12 A0 56 00 70 0A 57 06 53 55 42 43 2E 42 00
-84 12 A0 56 40 70 18 57 03 53 55 42 84 12 A0 56
-00 80 28 57 05 53 55 42 2E 42 84 12 A0 56 40 80
-8A 54 03 43 4D 50 84 12 A0 56 00 90 42 57 05 43
-4D 50 2E 42 84 12 A0 56 40 90 78 54 04 44 41 44
-44 00 84 12 A0 56 00 A0 5C 57 06 44 41 44 44 2E
-42 00 84 12 A0 56 40 A0 4E 57 03 42 49 54 84 12
-A0 56 00 B0 7A 57 05 42 49 54 2E 42 84 12 A0 56
-40 B0 86 57 03 42 49 43 84 12 A0 56 00 C0 94 57
-05 42 49 43 2E 42 84 12 A0 56 40 C0 A0 57 03 42
-49 53 84 12 A0 56 00 D0 AE 57 05 42 49 53 2E 42
-84 12 A0 56 40 D0 00 00 03 58 4F 52 84 12 A0 56
-00 E0 C8 57 05 58 4F 52 2E 42 84 12 A0 56 40 E0
-FA 56 03 41 4E 44 84 12 A0 56 00 F0 E2 57 05 41
-4E 44 2E 42 84 12 A0 56 40 F0 4C 46 5A 55 00 58
-1A 42 BC 1D B2 F0 70 00 BC 1D 8A 10 3A F0 0F 00
-82 DA BC 1D 4A 3F 34 57 03 52 52 43 84 12 FA 57
-00 10 18 58 05 52 52 43 2E 42 84 12 FA 57 40 10
-24 58 04 53 57 50 42 00 84 12 FA 57 80 10 32 58
-03 52 52 41 84 12 FA 57 00 11 40 58 05 52 52 41
-2E 42 84 12 FA 57 40 11 4C 58 03 53 58 54 84 12
-FA 57 80 11 00 00 04 50 55 53 48 00 84 12 FA 57
-00 12 66 58 06 50 55 53 48 2E 42 00 84 12 FA 57
-40 12 BA 57 04 43 41 4C 4C 00 84 12 FA 57 80 12
-34 44 2C 00 5A 55 52 56 9A 58 59 42 BC 1D 5A 42
-BD 1D 82 4A BC 1D BE 90 00 15 00 00 02 20 0A 89
-02 3C 09 8A 0A 49 3A 90 10 00 03 2C 5A 0E A8 3F
-1A 53 0E 4A 87 12 70 47 6C 49 0D 6F 75 74 20 6F
-66 20 62 6F 75 6E 64 73 20 4D 74 58 05 50 55 53
-48 4D 84 12 90 58 00 15 DC 58 04 50 4F 50 4D 00
-84 12 90 58 00 17 4C 46 C4 54 FC 58 82 43 BC 1D
-92 42 C4 1D BA 1D A2 53 C4 1D 92 53 C2 1D 3E 40
-2C 00 B0 12 2A 44 C6 49 DA 4A C0 45 B2 4D 52 56
-22 59 0A 4E 3E 4F 1A 83 2A 92 CA 2F 8A 10 5A 06
-6F 3F 5A 58 04 52 52 43 4D 00 84 12 F6 58 50 00
-34 59 04 52 52 41 4D 00 84 12 F6 58 50 01 42 59
-04 52 4C 41 4D 00 84 12 F6 58 50 02 50 59 04 52
-52 55 4D 00 84 12 F6 58 50 03 85 12 00 3C 5E 59
-03 53 3E 3D 85 12 00 38 70 59 02 53 3C 00 85 12
-00 34 EA 58 03 30 3E 3D 85 12 00 30 84 59 02 30
-3C 00 85 12 00 30 00 00 02 55 3C 00 85 12 00 2C
-98 59 03 55 3E 3D 85 12 00 28 8E 59 03 30 3C 3E
-85 12 00 24 AC 59 02 30 3D 00 85 12 00 20 5C 48
-02 49 46 00 1A 42 C4 1D 8A 4E 00 00 A2 53 C4 1D
-0E 4A 30 4D A2 59 04 54 48 45 4E 00 1A 42 C4 1D
-08 4E 3E 4F 09 48 29 53 0A 89 0A 11 3A 90 00 02
-68 2F 88 DA 00 00 30 4D 6A 57 04 45 4C 53 45 00
-1A 42 C4 1D BA 40 00 3C 00 00 A2 53 C4 1D 2F 83
-8F 4A 00 00 E3 3F D6 59 05 55 4E 54 49 4C 3A 4F
-08 4E 3E 4F 19 42 C4 1D 2A 83 0A 89 0A 11 3A 90
-00 FE 47 3B 3A F0 FF 03 08 DA 89 48 00 00 A2 53
-C4 1D 30 4D EE 57 05 41 47 41 49 4E 87 12 6A 59
-1E 5A 2A 44 00 00 05 57 48 49 4C 45 87 12 C4 59
-6E 44 2A 44 7A 59 06 52 45 50 45 41 54 00 87 12
-6A 59 1E 5A DC 59 2A 44 00 00 03 4A 4D 50 87 12
-A4 4D 6A 59 1E 5A 2A 44 3E B0 00 10 03 20 3E E0
-00 04 30 4D 3E 90 00 34 06 28 03 24 3E 40 00 34
-30 4D 3E 40 00 38 30 4D 00 00 04 3F 4A 4D 50 00
-87 12 88 5A A4 4D 6E 44 1E 5A 2A 44 BE 5A 3D 41
-08 4E 3E 4F 2A 48 0A 93 04 20 98 42 C4 1D 00 00
-30 4D 88 43 00 00 A4 3F 84 58 03 42 57 31 84 12
-BC 5A 00 00 DA 5A 03 42 57 32 84 12 BC 5A 00 00
-E6 5A 03 42 57 33 84 12 BC 5A 00 00 FE 5A 3D 41
-1A 42 C4 1D 28 4E 08 93 08 20 BA 4F 00 00 A2 53
-C4 1D 8E 4A 00 00 3E 4F 30 4D 8E 43 00 00 61 3F
-00 00 03 46 57 31 84 12 FC 5A 00 00 22 5B 03 46
-57 32 84 12 FC 5A 00 00 2E 5B 03 46 57 33 84 12
-FC 5A 00 00 3A 5B 04 47 4F 54 4F 00 87 12 6A 59
-A4 4D 98 4B 2A 44 AA 5A 05 3F 47 4F 54 4F 87 12
-88 5A A4 4D 98 4B 2A 44
-@FFC6
-C6 52 C6 52 C6 52 C6 52 C6 52 C6 52 C6 52 C6 52
-C6 52 C6 52 C6 52 C6 52 C6 52 C6 52 C6 52 6A 48
-C6 52 C6 52 C6 52 C6 52 C6 52 C6 52 C6 52 C6 52
-C6 52 C6 52 C6 52 C6 52 C6 52
-q
+++ /dev/null
-@1800
-10 00 5E 48 F4 01 80 04 FD FF 18 00 48 5B FE 53
-2A 48 36 48 00 00 00 00
-@1DAA
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-00 00 00 00 00 00
-@4400
-3A 41 0D 12 0D 4A 30 4D 2F 83 8F 4E 00 00 3E 41
-2E 4E 30 4D 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E
-30 4D 00 00 04 45 58 49 54 00 3D 41 30 4D 00 00
-03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 44
-03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
-44 55 50 00 0E 93 F6 23 30 4D 40 44 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 44 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E 44 02 3E 52 00 0E 12 3E 4F 30 4D 8E 44
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 44
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C 44 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 44 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 45
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 44 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA 44 03 41 4E 44 3E FF 30 4D 7A 44 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E 45 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 45 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E 45 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 45 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 44 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
-3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE 45 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 45 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 45 03 3E 49 4E 85 12 C2 1D 10 45
-04 42 41 53 45 00 85 12 DA 1D C0 44 05 53 54 41
-54 45 85 12 B6 1D 30 46 02 42 4C 00 85 12 20 00
-94 45 02 3C 23 00 B2 40 AA 1D AA 1D 30 4D 1E 15
-0E 43 3D 40 20 00 0A 93 04 20 0D 11 0A 4C 0C 43
-09 43 0E 9B 01 28 0E 8B 09 69 08 68 1D 83 07 30
-0C 5C 0A 6A 0E 6E F5 2B 0E 8B 12 D3 F5 3F 0A 4E
-1D 17 30 41 48 46 01 23 1B 42 DA 1D 2C 4F 0A 4E
-B0 12 5E 46 8F 49 00 00 0E 48 7A 90 0A 00 02 28
-3A 50 07 00 3A 50 30 00 92 83 AA 1D 18 42 AA 1D
-C8 4A 00 00 30 4D 96 46 02 23 53 00 87 12 98 46
-D2 46 2D 83 09 93 E0 23 0E 93 DE 23 3D 41 30 4D
-C8 46 02 23 3E 00 9F 42 AA 1D 00 00 3E 40 AA 1D
-2E 8F 30 4D 00 46 04 48 4F 4C 44 00 0A 4E 3E 4F
-DB 3F 3C 46 04 53 49 47 4E 00 0E 93 3E 4F 3A 40
-2D 00 D2 33 30 4D F4 45 03 55 44 2E 87 12 56 46
-CC 46 E6 46 44 49 0C 49 2A 44 18 47 02 55 2E 00
-2F 83 8F 4E 00 00 0E 43 F1 3F 3E B0 00 80 06 24
-BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D DA 44
-02 44 2E 00 87 12 56 46 6E 44 80 44 3A 47 CC 46
-92 44 0A 47 E6 46 44 49 0C 49 2A 44 52 45 01 2E
-3E B0 00 80 DD 27 2F 83 3E 43 EC 3F F6 46 04 48
-45 52 45 00 2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D
-62 45 05 41 4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D
-E2 46 02 43 2C 00 1A 42 C4 1D CA 4E 00 00 92 53
-C4 1D 3E 4F 30 4D 2F 83 8F 4E 00 00 B0 12 2A 48
-92 B3 FC 05 FD 27 1E 42 EC 05 B0 12 36 48 30 4D
-30 40 B6 47 7E 47 05 28 4B 45 59 29 18 42 EC 05
-EA 3F 12 46 03 4B 45 59 30 40 DC 47 92 47 06 41
-43 43 45 50 54 00 3C 40 96 48 3B 40 66 48 2D 15
-0A 4E 2E 4F 0A 5E 3B 40 0D 00 3C 40 20 00 3D 40
-8A 48 92 B3 FC 05 05 24 18 42 EC 05 38 90 0A 00
-04 20 21 53 39 40 4A 48 4D 15 B2 40 11 00 EE 05
-D2 C3 22 02 30 41 B2 40 13 00 EE 05 D2 D3 22 02
-30 41 00 00 05 53 4C 45 45 50 30 40 58 48 00 00
-07 28 53 4C 45 45 50 29 12 D2 0A 18 F6 3F 21 52
-3A 17 58 42 EC 05 48 9B E6 27 48 9C 06 2C 78 92
-0E 20 2E 9F 0C 24 1E 83 05 3C 0E 9A 03 24 CE 48
-00 00 1E 53 82 48 EE 05 30 4D 8C 48 2D 83 92 B3
-FC 05 FD 27 E6 23 B2 40 18 00 0A 18 3E 8F 3D 41
-30 4D D6 47 06 28 45 4D 49 54 29 00 08 4E 3E 4F
-A2 B3 FC 05 FD 27 E6 3F 50 47 04 45 4D 49 54 00
-30 40 AC 48 BA 48 04 45 43 48 4F 00 B2 40 82 48
-84 48 30 4D 6E 47 06 4E 4F 45 43 48 4F 00 B2 40
-30 4D 84 48 30 4D A4 48 04 28 43 52 29 00 2F 83
-8F 4E 00 00 3E 40 0D 00 E3 3F A2 47 02 43 52 00
-30 40 EE 48 04 47 05 53 50 41 43 45 2F 83 8F 4E
-00 00 3E 40 20 00 D4 3F 06 49 06 53 50 41 43 45
-53 00 0E 93 09 24 0D 12 3D 40 2E 49 EF 3F 30 49
-2D 83 1E 83 EB 23 3D 41 3E 4F 30 4D 2C 47 04 54
-59 50 45 00 0E 93 95 24 2A 4F 8F 5E 00 00 0E 4A
-87 12 CA 45 02 46 0A 45 C0 48 EC 45 54 49 2A 44
-2F 82 8F 4E 02 00 7E 4D 8F 4D 00 00 0D 5E 1D B3
-0D 63 30 4D 1A 49 82 53 22 00 87 12 34 44 60 49
-96 4B 34 44 22 00 BA 49 8A 49 3D 41 6E 4E 1E 83
-82 5E C4 1D 3E 4F 92 B3 C4 1D A2 63 C4 1D 30 4D
-D6 48 82 2E 22 00 87 12 7A 49 34 44 44 49 96 4B
-2A 44 00 00 04 57 4F 52 44 00 3C 40 BE 1D 39 4C
-3A 4C 09 5A 3A 5C 28 4C 09 9A 19 24 7E 9A FC 27
-1A 83 3B 40 60 00 C8 4C 00 00 09 9A 0C 24 7C 4A
-4E 9C 09 24 18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F
-7C 80 20 00 F0 3F 1A 82 C0 1D 82 4A C2 1D 1E 42
-C4 1D 08 8E CE 48 00 00 30 4D 00 00 04 46 49 4E
-44 00 2F 83 0C 4E 65 4C 74 40 80 00 3B 40 CA 1D
-3E 4B 0E 93 1E 24 58 4C 01 00 78 F0 1E 00 0E 58
-2E 53 1E 4E FE FF 0E 93 F3 27 09 4E 78 49 48 C4
-48 95 F7 23 0A 4C 1A 53 FA 99 00 00 F2 23 58 83
-FA 23 19 B3 09 63 0C 49 6A 4E 1E 43 4A 93 01 30
-2E 83 8F 4C 00 00 35 40 08 44 34 40 14 44 30 4D
-2F 53 2F 53 3E 4F 30 4D 26 46 07 3E 4E 55 4D 42
-45 52 3C 4F 38 4F 29 4F 2F 82 1B 42 DA 1D 6A 4C
-7A 80 30 00 7A 90 0A 00 02 28 7A 80 07 00 0A 9B
-13 2C 82 49 D0 04 82 48 D2 04 82 4B C8 04 19 42
-E4 04 18 42 E6 04 09 5A 08 63 1C 53 1E 83 E7 23
-8F 49 04 00 8F 48 02 00 8F 4C 00 00 30 4D 03 12
-0D 12 1B 42 DA 1D 0B 12 32 C0 00 02 6D 4E 0D 5E
-0C 4E 7A 40 2E 00 0D 9C 0A 28 7A 9C FC 23 32 D0
-00 02 FC 4C FE FF 0D 9C FC 2F DE 83 00 00 09 43
-08 43 3D 40 44 4B 3F 82 8F 4E 06 00 0C 4E 7E 4C
-6A 4C 7A 90 2D 00 10 2C 3B 40 10 00 7A 80 24 00
-06 24 2B 43 5A 83 03 24 3B 52 6A 53 B0 23 1C 53
-1E 83 6A 4C 7A 90 2D 00 AA 23 1C 53 1E 83 B1 43
-04 00 A5 3F 46 4B 2F 53 0E 93 2C 17 82 4C DA 1D
-03 24 2F 52 0E F3 30 4D 9F 4F 02 00 04 00 BF 4F
-00 00 3E E3 09 20 3E E3 BF E3 02 00 BF E3 00 00
-9F 53 02 00 8F 63 00 00 32 B0 00 02 01 20 2F 53
-30 4D C6 48 07 45 58 45 43 55 54 45 0A 4E 3E 4F
-00 4A 28 45 01 2C 1A 42 C4 1D A2 53 C4 1D 8A 4E
-00 00 3E 4F 30 4D 94 4B 87 4C 49 54 45 52 41 4C
-82 93 B6 1D 16 24 32 B0 00 02 09 24 1A 42 C4 1D
-A2 52 C4 1D BA 40 34 44 00 00 BA 4F 02 00 1A 42
-C4 1D A2 52 C4 1D BA 40 34 44 00 00 8A 4E 02 00
-3E 4F 30 4D FC 48 05 43 4F 55 4E 54 2F 83 1E 53
-8F 4E 00 00 5E 4E FF FF 30 4D 82 4E BE 1D B2 4F
-C0 1D 3E 4F 82 43 C2 1D 87 12 4C 46 BA 49 10 4C
-3D 40 1C 4C FE 22 3D 41 3E 4F 30 4D 1E 4C 0A 4E
-3E 4F 3D 40 34 4C 53 27 3D 40 0A 4C 1A E2 B6 1D
-B2 27 AC 23 36 4C 3E 4F 3D 40 0A 4C B9 23 DE 53
-00 00 68 4E 08 5E F8 40 3F 00 00 00 3D 40 00 4E
-CD 3F 84 4B 08 45 56 41 4C 55 41 54 45 00 39 40
-BE 1D 39 12 39 12 39 12 0D 12 B0 12 2A 44 FA 4B
-72 4C 3D 41 B2 41 C2 1D B2 41 C0 1D B2 41 BE 1D
-30 4D 7A 45 04 51 55 49 54 00 31 40 E0 1C B2 40
-00 1C 00 1C 82 43 B6 1D 82 43 08 18 B0 12 2A 44
-60 49 04 0D 6F 6B 20 00 44 49 34 44 38 1D 44 44
-34 44 50 00 F6 47 0C 49 FA 4B 34 44 7E 1C CE 44
-B2 45 60 49 0D 73 74 61 63 6B 20 65 6D 70 74 79
-20 21 0E 4D 34 44 30 FF 84 47 B2 45 60 49 0B 46
-52 41 4D 20 66 75 6C 6C 20 21 0E 4D 42 46 F4 44
-C0 45 A0 4C 60 49 04 0D 20 20 20 00 BC 45 A8 4C
-EE 47 05 41 42 4F 52 54 3F 40 80 1C BE 3F 8F 93
-02 00 AE 26 B2 40 82 48 84 48 B0 12 00 52 82 43
-C2 5A 82 43 CE 5A 82 43 DA 5A 82 43 0A 5B 82 43
-16 5B 82 43 22 5B A2 B3 FC 05 FD 27 B2 40 11 00
-EE 05 D2 C3 22 02 92 C3 FC 05 38 40 55 05 39 42
-19 83 FE 23 18 83 FB 23 92 B3 FC 05 F4 23 87 12
-60 49 04 1B 5B 37 6D 00 44 49 44 49 60 49 04 1B
-5B 30 6D 00 44 49 42 51 84 51 8A 51 08 4D 02 4D
-86 41 42 4F 52 54 22 00 87 12 7A 49 34 44 0E 4D
-96 4B 2A 44 0C 4A 01 27 87 12 4C 46 BA 49 12 4A
-C0 45 A6 4D 2A 44 3E 4C 52 46 81 5C 92 42 BE 1D
-C2 1D 30 4D 87 12 96 49 4C 46 BA 49 BE 4D 08 4E
-7A 4E 5A D3 5A 53 0A 58 19 42 C8 1D 6E 4E 3E F0
-1E 00 09 5E 82 48 AE 1D 82 49 B0 1D 82 4A B2 1D
-2A 52 82 4A C4 1D 3E 4F 3D 41 30 41 87 12 60 49
-0F 73 74 61 63 6B 20 6D 69 73 6D 61 74 63 68 21
-14 4D 82 9F B4 1D F2 23 18 42 AE 1D 19 42 B0 1D
-A8 49 FE FF 89 48 00 00 30 4D B4 49 08 56 41 52
-49 41 42 4C 45 00 B0 12 B4 4D BA 40 86 12 FC FF
-EF 3F E6 4B 08 43 4F 4E 53 54 41 4E 54 00 B0 12
-B4 4D BA 40 85 12 FC FF 8A 4E FE FF 3E 4F E0 3F
-34 4E 06 43 52 45 41 54 45 00 B0 12 B4 4D BA 40
-85 12 FC FF 8A 4A FE FF D3 3F 54 4C 05 44 4F 45
-53 3E 1A 42 B2 1D BA 40 84 12 00 00 8A 4D 02 00
-3D 41 30 4D 6C 4E 05 44 45 46 45 52 B0 12 B4 4D
-BA 40 30 40 FC FF BA 40 82 4E FE FF B9 3F 00 00
-81 5B 82 43 B6 1D 30 4D AA 4D 01 5D B2 43 B6 1D
-30 4D 76 49 87 52 45 43 55 52 53 45 19 42 C4 1D
-99 42 B2 1D 00 00 A2 53 C4 1D 30 4D A0 4E 01 3A
-B0 12 B4 4D BA 40 87 12 FC FF A2 83 C4 1D B2 43
-B6 1D 82 4F B4 1D 30 4D CE 4E 81 3B 82 93 B6 1D
-5D 27 87 12 34 44 2A 44 96 4B 02 4E A2 4E 2A 44
-E8 48 09 49 4D 4D 45 44 49 41 54 45 1A 42 AE 1D
-FA D0 80 00 00 00 30 4D BE 4F 02 00 3E 4F 30 4D
-02 4F 82 49 53 00 87 12 42 46 F4 44 C0 45 3A 4F
-46 4F 34 44 18 4F 96 4B 2A 44 98 4D 18 4F 2A 44
-EA 4E 83 5B 27 5D 87 12 98 4D 34 44 34 44 96 4B
-96 4B 2A 44 84 4C 88 50 4F 53 54 50 4F 4E 45 00
-87 12 4C 46 BA 49 12 4A 54 44 C0 45 A6 4D 7E 45
-C0 45 80 4F 34 44 34 44 96 4B 96 4B 34 44 96 4B
-96 4B 2A 44 86 4F 3A 4E 82 4A C6 1D 2E 4E 82 4E
-C4 1D 3D 40 10 00 09 4A 08 49 29 83 18 48 FE FF
-0E 98 FC 2B 89 48 00 00 1D 83 F6 23 2A 4A 0A 93
-F0 23 3E 4F 3D 41 30 4D 22 4F 82 49 46 00 2F 83
-8F 4E 00 00 1E 42 C4 1D BE 40 C0 45 00 00 A2 52
-C4 1D 2E 53 30 4D 86 4E 84 45 4C 53 45 00 1A 42
-C4 1D BA 40 BC 45 00 00 2A 52 82 4A C4 1D 8E 4A
-00 00 2A 83 0E 4A 30 4D 3E 49 84 54 48 45 4E 00
-9E 42 C4 1D 00 00 3E 4F 30 4D 52 4E 85 42 45 47
-49 4E 30 40 84 47 FA 4F 85 55 4E 54 49 4C 39 40
-C0 45 1A 42 C4 1D A2 52 C4 1D 8A 49 00 00 8A 4E
-02 00 3E 4F 30 4D 80 4D 85 41 47 41 49 4E 39 40
-BC 45 EF 3F 1C 4E 85 57 48 49 4C 45 87 12 BE 4F
-6E 44 2A 44 B4 4E 86 52 45 50 45 41 54 00 87 12
-3E 50 00 50 2A 44 D8 4F 82 44 4F 00 2F 83 8F 4E
-00 00 1E 42 C4 1D BE 40 CA 45 00 00 2E 53 82 4E
-C4 1D A2 53 00 1C 1A 42 00 1C 8A 43 00 00 30 4D
-A8 4B 84 4C 4F 4F 50 00 39 40 EC 45 1A 42 C4 1D
-A2 52 C4 1D 8A 49 00 00 8A 4E 02 00 1E 42 00 1C
-A2 83 00 1C 2E 4E 0E 93 04 24 9E 42 C4 1D 00 00
-F5 3F 3E 4F 30 4D E4 47 85 2B 4C 4F 4F 50 39 40
-DA 45 E4 3F 92 50 85 4C 45 41 56 45 1A 42 C4 1D
-BA 40 FC 45 00 00 BA 40 BC 45 02 00 B2 50 06 00
-C4 1D A2 53 00 1C 2A 52 19 42 00 1C 89 4A 00 00
-30 4D D6 50 04 4D 4F 56 45 00 0A 4E 38 4F 39 4F
-3E 4F 0A 93 11 24 08 99 0F 24 06 2C F8 49 00 00
-18 53 1A 83 FB 23 30 4D 08 5A 09 5A 19 83 18 83
-E8 49 00 00 1A 83 FA 23 30 4D 34 44 CA 1D FC 44
-2A 44 84 12 3A 51 44 54 1A 54 68 50 96 4D 02 54
-C8 50 04 51 A2 49 A8 51 DC 51 18 50 A2 52 48 45
-42 4F AA 4E 7A 4A 00 00 3A 40 0C 00 39 40 CA 1D
-38 40 CC 1D D9 3F 3A 40 0E 00 39 40 CC 1D 38 40
-CA 1D CC 3F 82 43 CC 1D 30 4D 92 42 CA 1D C8 1D
-30 4D 56 4F 09 50 57 52 5F 53 54 41 54 45 84 12
-84 4F FE 53 48 5B 94 51 08 50 57 52 5F 48 45 52
-45 00 92 42 C4 1D A4 51 92 42 C6 1D A2 51 EF 3F
-56 50 09 52 53 54 5F 53 54 41 54 45 92 42 0C 18
-A4 51 92 42 0E 18 A2 51 E2 3F C2 51 08 52 53 54
-5F 48 45 52 45 00 92 42 C4 1D 0C 18 92 42 C6 1D
-0E 18 DF 3F B2 40 48 52 AA 52 B2 40 58 48 4C 48
-B2 40 AC 48 C2 48 B2 40 EE 48 02 49 B2 40 DC 47
-EA 47 30 41 46 50 04 57 49 50 45 00 39 40 80 FF
-B9 43 00 00 29 53 39 90 C6 FF FA 23 B0 12 F4 51
-B2 40 48 5B C4 1D B2 40 FE 53 C6 1D D4 3F BA 4F
-06 28 57 41 52 4D 29 00 1E 42 08 18 87 12 60 49
-05 0D 1B 5B 37 6D 44 49 70 47 60 49 27 20 46 61
-73 74 46 6F 72 74 68 20 56 31 36 30 20 2E 35 4D
-48 7A 20 28 43 29 20 4A 2E 4D 2E 54 68 6F 6F 72
-65 6E 73 20 44 49 34 44 30 FF 84 47 2A 45 30 47
-60 49 0B 62 79 74 65 73 20 66 72 65 65 20 1A 4D
-16 52 04 57 41 52 4D 00 30 40 48 52 0C 50 04 43
-4F 4C 44 00 B2 40 04 A5 20 01 B2 40 88 5A 5C 01
-92 43 04 02 B2 40 FE FF 02 02 A2 83 06 02 92 D3
-24 02 B2 D3 26 02 B2 43 22 02 B2 43 42 02 B2 D3
-46 02 B2 43 62 02 B2 D3 66 02 B2 40 80 00 84 02
-B2 40 7F FF 82 02 B2 D0 7F FF 86 02 F2 43 22 03
-F2 D3 26 03 F2 40 A5 00 61 01 82 43 62 01 B2 40
-11 01 66 01 29 42 B2 40 33 00 64 01 D2 43 61 01
-92 D2 9E 01 08 18 A2 93 08 18 01 24 59 07 38 40
-C2 A2 18 83 FE 23 19 83 FA 23 B2 42 B0 01 F2 D0
-10 00 2A 03 F2 C0 40 00 A2 04 3A 40 BA 52 39 40
-C6 FF 89 4A 00 00 29 53 FC 23 92 42 02 18 E4 FF
-B2 40 18 00 0A 18 31 40 E0 1C 3F 40 80 1C 37 40
-00 44 36 40 B4 44 35 40 08 44 34 40 14 44 B2 40
-0A 00 DA 1D B2 43 AC 1D 92 C3 30 01 18 42 08 18
-F2 B0 10 00 20 02 04 20 38 E3 18 53 82 48 08 18
-B2 40 81 00 E0 05 A2 42 E6 05 B2 40 00 49 E8 05
-F2 D0 30 00 2A 02 92 C3 E0 05 92 D3 FA 05 3D 40
-D8 53 18 42 08 18 38 90 0A 00 28 27 38 90 16 00
-25 2F 28 93 FB 22 E3 26 A8 52 84 12 3A 51 26 5A
-D2 5A DA 59 26 5B A0 59 5A 5A A4 56 00 00 96 59
-46 5A F8 59 36 5A B4 57 00 00 00 00 38 5B 66 51
-40 52 85 48 49 32 4C 4F 87 12 84 47 D2 4F 96 4B
-A2 4E 68 51 DA 53 2A 44 AE 52 04 43 4F 44 45 00
-B0 12 B4 4D A2 82 C4 1D 87 12 E2 4E BC 45 12 54
-00 00 07 45 4E 44 43 4F 44 45 87 12 76 51 02 4E
-2A 44 38 50 03 41 53 4D 92 42 C8 1D B8 1D B2 40
-DE 53 C8 1D E5 3F 32 54 06 45 4E 44 41 53 4D 00
-92 42 B8 1D C8 1D E9 3F 00 00 05 43 4F 4C 4F 4E
-1A 42 C4 1D BA 40 87 12 00 00 A2 53 C4 1D B2 43
-B6 1D 30 40 76 51 00 00 05 4C 4F 32 48 49 1A 42
-C4 1D BA 40 B0 12 00 00 BA 40 2A 44 02 00 A2 52
-C4 1D ED 3F 38 40 BE 1D 39 48 2A 48 09 5A 1A 52
-C2 1D 09 9A 03 24 7E 9A FC 27 1A 83 0E 4A 2A 88
-82 4A C2 1D 30 4D B0 12 2A 44 BA 49 12 4A 72 45
-C0 45 DC 54 CE 4A C0 45 A6 4D FE 54 DE 54 29 4E
-39 90 86 12 02 20 2E 53 30 41 39 90 85 12 03 20
-1E 4E 02 00 30 41 39 90 84 12 01 20 2E 52 30 41
-19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 40 29 00
-12 12 C2 1D 92 53 C2 1D B0 12 2A 44 BA 49 CE 4A
-C0 45 30 55 26 55 21 53 3E 90 10 00 BB 2D 30 41
-32 55 B2 41 C2 1D 22 D3 30 41 87 12 4C 46 A4 54
-42 55 82 43 BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D
-0A 4E 3E 4F FA 90 23 00 00 00 34 20 92 53 C2 1D
-B0 12 C6 54 0E 93 04 20 B2 40 00 03 BC 1D 27 3C
-1E 93 04 20 B2 40 10 03 BC 1D 21 3C 2E 93 04 20
-B2 40 20 03 BC 1D 1B 3C 2E 92 04 20 B2 40 20 02
-BC 1D 15 3C 3E 92 04 20 B2 40 30 02 BC 1D 0F 3C
-3E 93 04 20 B2 40 30 03 BC 1D 09 3C B2 40 30 00
-BC 1D 19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 4F
-3D 41 30 4D FA 90 26 00 00 00 08 20 B2 40 10 02
-BC 1D 92 53 C2 1D 30 12 B2 55 75 3F FA 90 40 00
-00 00 1A 20 B2 40 20 00 BC 1D 92 53 C2 1D B0 12
-10 55 0E 20 B2 50 10 00 BC 1D 3E 40 2B 00 B0 12
-10 55 32 24 92 92 BE 1D C2 1D 02 24 92 53 C2 1D
-8E 10 82 5E BC 1D D3 3F B0 12 10 55 F9 23 B2 50
-10 00 BC 1D 3E 40 28 00 B0 12 C6 54 30 12 02 56
-67 3F 87 12 4C 46 A4 54 3A 56 FE 90 26 00 00 00
-3E 40 20 00 04 20 B2 50 82 00 BC 1D C2 3F B0 12
-10 55 DF 23 B2 50 80 00 BC 1D 3E 40 28 00 B0 12
-C6 54 B0 12 00 55 D5 23 3D 40 A6 4D 30 4D 44 48
-04 52 45 54 49 00 87 12 34 44 00 13 96 4B 2A 44
-34 44 2C 00 3A 55 32 56 8A 56 2E 4E 1E D2 BC 1D
-19 42 BA 1D 92 3F 88 54 03 4D 4F 56 84 12 80 56
-00 40 98 56 05 4D 4F 56 2E 42 84 12 80 56 40 40
-00 00 03 41 44 44 84 12 80 56 00 50 B2 56 05 41
-44 44 2E 42 84 12 80 56 40 50 BE 56 04 41 44 44
-43 00 84 12 80 56 00 60 CC 56 06 41 44 44 43 2E
-42 00 84 12 80 56 40 60 70 56 04 53 55 42 43 00
-84 12 80 56 00 70 EA 56 06 53 55 42 43 2E 42 00
-84 12 80 56 40 70 F8 56 03 53 55 42 84 12 80 56
-00 80 08 57 05 53 55 42 2E 42 84 12 80 56 40 80
-6A 54 03 43 4D 50 84 12 80 56 00 90 22 57 05 43
-4D 50 2E 42 84 12 80 56 40 90 58 54 04 44 41 44
-44 00 84 12 80 56 00 A0 3C 57 06 44 41 44 44 2E
-42 00 84 12 80 56 40 A0 2E 57 03 42 49 54 84 12
-80 56 00 B0 5A 57 05 42 49 54 2E 42 84 12 80 56
-40 B0 66 57 03 42 49 43 84 12 80 56 00 C0 74 57
-05 42 49 43 2E 42 84 12 80 56 40 C0 80 57 03 42
-49 53 84 12 80 56 00 D0 8E 57 05 42 49 53 2E 42
-84 12 80 56 40 D0 00 00 03 58 4F 52 84 12 80 56
-00 E0 A8 57 05 58 4F 52 2E 42 84 12 80 56 40 E0
-DA 56 03 41 4E 44 84 12 80 56 00 F0 C2 57 05 41
-4E 44 2E 42 84 12 80 56 40 F0 4C 46 3A 55 E0 57
-1A 42 BC 1D B2 F0 70 00 BC 1D 8A 10 3A F0 0F 00
-82 DA BC 1D 4A 3F 14 57 03 52 52 43 84 12 DA 57
-00 10 F8 57 05 52 52 43 2E 42 84 12 DA 57 40 10
-04 58 04 53 57 50 42 00 84 12 DA 57 80 10 12 58
-03 52 52 41 84 12 DA 57 00 11 20 58 05 52 52 41
-2E 42 84 12 DA 57 40 11 2C 58 03 53 58 54 84 12
-DA 57 80 11 00 00 04 50 55 53 48 00 84 12 DA 57
-00 12 46 58 06 50 55 53 48 2E 42 00 84 12 DA 57
-40 12 9A 57 04 43 41 4C 4C 00 84 12 DA 57 80 12
-34 44 2C 00 3A 55 32 56 7A 58 59 42 BC 1D 5A 42
-BD 1D 82 4A BC 1D BE 90 00 15 00 00 02 20 0A 89
-02 3C 09 8A 0A 49 3A 90 10 00 03 2C 5A 0E A8 3F
-1A 53 0E 4A 87 12 70 47 60 49 0D 6F 75 74 20 6F
-66 20 62 6F 75 6E 64 73 14 4D 54 58 05 50 55 53
-48 4D 84 12 70 58 00 15 BC 58 04 50 4F 50 4D 00
-84 12 70 58 00 17 4C 46 A4 54 DC 58 82 43 BC 1D
-92 42 C4 1D BA 1D A2 53 C4 1D 92 53 C2 1D 3E 40
-2C 00 B0 12 2A 44 BA 49 CE 4A C0 45 A6 4D 32 56
-02 59 0A 4E 3E 4F 1A 83 2A 92 CA 2F 8A 10 5A 06
-6F 3F 3A 58 04 52 52 43 4D 00 84 12 D6 58 50 00
-14 59 04 52 52 41 4D 00 84 12 D6 58 50 01 22 59
-04 52 4C 41 4D 00 84 12 D6 58 50 02 30 59 04 52
-52 55 4D 00 84 12 D6 58 50 03 85 12 00 3C 3E 59
-03 53 3E 3D 85 12 00 38 50 59 02 53 3C 00 85 12
-00 34 CA 58 03 30 3E 3D 85 12 00 30 64 59 02 30
-3C 00 85 12 00 30 00 00 02 55 3C 00 85 12 00 2C
-78 59 03 55 3E 3D 85 12 00 28 6E 59 03 30 3C 3E
-85 12 00 24 8C 59 02 30 3D 00 85 12 00 20 50 48
-02 49 46 00 1A 42 C4 1D 8A 4E 00 00 A2 53 C4 1D
-0E 4A 30 4D 82 59 04 54 48 45 4E 00 1A 42 C4 1D
-08 4E 3E 4F 09 48 29 53 0A 89 0A 11 3A 90 00 02
-68 2F 88 DA 00 00 30 4D 4A 57 04 45 4C 53 45 00
-1A 42 C4 1D BA 40 00 3C 00 00 A2 53 C4 1D 2F 83
-8F 4A 00 00 E3 3F B6 59 05 55 4E 54 49 4C 3A 4F
-08 4E 3E 4F 19 42 C4 1D 2A 83 0A 89 0A 11 3A 90
-00 FE 47 3B 3A F0 FF 03 08 DA 89 48 00 00 A2 53
-C4 1D 30 4D CE 57 05 41 47 41 49 4E 87 12 4A 59
-FE 59 2A 44 00 00 05 57 48 49 4C 45 87 12 A4 59
-6E 44 2A 44 5A 59 06 52 45 50 45 41 54 00 87 12
-4A 59 FE 59 BC 59 2A 44 00 00 03 4A 4D 50 87 12
-98 4D 4A 59 FE 59 2A 44 3E B0 00 10 03 20 3E E0
-00 04 30 4D 3E 90 00 34 06 28 03 24 3E 40 00 34
-30 4D 3E 40 00 38 30 4D 00 00 04 3F 4A 4D 50 00
-87 12 68 5A 98 4D 6E 44 FE 59 2A 44 9E 5A 3D 41
-08 4E 3E 4F 2A 48 0A 93 04 20 98 42 C4 1D 00 00
-30 4D 88 43 00 00 A4 3F 64 58 03 42 57 31 84 12
-9C 5A 00 00 BA 5A 03 42 57 32 84 12 9C 5A 00 00
-C6 5A 03 42 57 33 84 12 9C 5A 00 00 DE 5A 3D 41
-1A 42 C4 1D 28 4E 08 93 08 20 BA 4F 00 00 A2 53
-C4 1D 8E 4A 00 00 3E 4F 30 4D 8E 43 00 00 61 3F
-00 00 03 46 57 31 84 12 DC 5A 00 00 02 5B 03 46
-57 32 84 12 DC 5A 00 00 0E 5B 03 46 57 33 84 12
-DC 5A 00 00 1A 5B 04 47 4F 54 4F 00 87 12 4A 59
-98 4D 8C 4B 2A 44 8A 5A 05 3F 47 4F 54 4F 87 12
-68 5A 98 4D 8C 4B 2A 44
-@FFC6
-BA 52 BA 52 BA 52 BA 52 BA 52 BA 52 BA 52 BA 52
-BA 52 BA 52 BA 52 BA 52 BA 52 BA 52 BA 52 5E 48
-BA 52 BA 52 BA 52 BA 52 BA 52 BA 52 BA 52 BA 52
-BA 52 BA 52 BA 52 BA 52 BA 52
-q
@1800
-10 00 6A 48 80 3E 00 24 FD FF 18 00 68 5B 1E 54
-2A 48 3C 48 00 00 00 00
+10 00 92 48 80 3E 00 24 05 00 18 00 D6 5C 8E 55
+52 48 64 48 00 00 00 00
@1DAA
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
03 4C 49 54 2F 83 8F 4E 00 00 3E 4D 30 4D 24 44
03 44 55 50 2F 83 8F 4E 00 00 30 4D 00 00 04 3F
44 55 50 00 0E 93 F6 23 30 4D 40 44 04 44 52 4F
-50 00 3E 4F 30 4D 00 00 04 53 57 41 50 00 2A 4F
-8F 4E 00 00 0E 4A 30 4D 00 00 04 4F 56 45 52 00
-2F 83 8F 4E 00 00 1E 4F 02 00 30 4D 68 44 03 52
-4F 54 2A 4F 8F 4E 00 00 1E 4F 02 00 8F 4A 02 00
-30 4D 4E 44 02 3E 52 00 0E 12 3E 4F 30 4D 8E 44
-02 52 3E 00 2F 83 8F 4E 00 00 3E 41 30 4D B0 44
-02 52 40 00 2F 83 8F 4E 00 00 2E 41 30 4D 8F 4E
-FE FF 0E 4F 2F 83 30 4D 5C 44 05 44 45 50 54 48
-8F 4E FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D
-00 00 01 40 2E 4E 30 4D F2 44 01 21 BE 4F 00 00
-3E 4F 30 4D 00 00 02 43 40 00 6E 4E 30 4D 06 45
-02 43 21 00 3A 4F CE 4A 00 00 3E 4F 30 4D 00 00
-01 2B 3E 5F 30 4D 30 44 01 2D 3A 4F 0A 8E 0E 4A
-30 4D FA 44 03 41 4E 44 3E FF 30 4D 7A 44 02 4F
-52 00 3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D
-3E 45 06 4E 45 47 41 54 45 00 3E E3 1E 53 30 4D
-34 45 03 41 42 53 0E 93 F8 33 30 4D 00 00 02 30
-3D 00 1E 83 0E 7E 30 4D 6E 45 02 30 3C 00 0E 5E
-0E 7E 3E E3 30 4D 00 00 01 3D 3E 8F 07 20 3E 43
-30 4D 88 45 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
-A4 44 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
+50 00 3E 4F 30 4D 00 00 03 4E 49 50 2F 53 30 4D
+00 00 04 53 57 41 50 00 2A 4F 8F 4E 00 00 0E 4A
+30 4D 68 44 04 4F 56 45 52 00 8F 4E FE FF 2E 4F
+2F 83 30 4D 72 44 03 52 4F 54 2A 4F 8F 4E 00 00
+1E 4F 02 00 8F 4A 02 00 30 4D 4E 44 02 3E 52 00
+0E 12 3E 4F 30 4D 96 44 02 52 3E 00 2F 83 8F 4E
+00 00 3E 41 30 4D B8 44 02 52 40 00 2F 83 8F 4E
+00 00 2E 41 30 4D 5C 44 05 44 45 50 54 48 8F 4E
+FE FF 3E 40 80 1C 0E 8F 2F 83 0E 11 30 4D 00 00
+01 40 2E 4E 30 4D F0 44 01 21 BE 4F 00 00 3E 4F
+30 4D 00 00 02 43 40 00 6E 4E 30 4D 04 45 02 43
+21 00 FE 4F 00 00 1F 53 3E 4F 30 4D 00 00 01 2B
+3E 5F 30 4D 30 44 01 2D 3E 8F 3E E3 1E 53 30 4D
+F8 44 03 41 4E 44 3E FF 30 4D 84 44 02 4F 52 00
+3E DF 30 4D 00 00 03 58 4F 52 3E EF 30 4D 3C 45
+06 4E 45 47 41 54 45 00 E8 3F 32 45 03 41 42 53
+0E 93 E3 33 30 4D D8 44 04 44 41 42 53 00 3E F3
+06 34 BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D
+00 00 02 30 3D 00 1E 83 0E 7E 30 4D 82 45 02 30
+3C 00 0E 5E 0E 7E 3E E3 30 4D 8E 45 02 30 3E 00
+1E 93 05 34 0B 3C 00 00 01 3D 3E 8F 07 20 3E 43
+30 4D A8 45 01 3C 3A 4F 0A 8E F9 3B 0E 43 30 4D
+AC 44 01 3E 3E 8F F3 3B 0E 43 30 4D 00 00 02 55
3C 00 3A 4F 0A 8E EB 2B 0E 43 30 4D 2D 4D 30 4D
-0E 93 3E 4F FB 27 2D 53 30 4D 39 40 00 80 39 8F
-08 4E 3E 4F 08 59 19 15 30 4D 81 5E 00 00 3E 4F
-32 B0 00 01 EB 27 2D 53 21 52 30 4D 91 53 00 00
-F7 3F AE 45 06 55 4E 4C 4F 4F 50 00 F5 3F 00 00
-01 49 2F 83 8F 4E 00 00 2E 41 1E 81 02 00 30 4D
-20 45 01 4A 2F 83 8F 4E 00 00 1E 41 04 00 1E 81
-06 00 30 4D A2 45 03 3E 49 4E 85 12 C2 1D 10 45
-04 42 41 53 45 00 85 12 DA 1D C0 44 05 53 54 41
-54 45 85 12 B6 1D 30 46 02 42 4C 00 85 12 20 00
-94 45 02 3C 23 00 B2 40 AA 1D AA 1D 30 4D 1E 15
-0E 43 3D 40 20 00 0A 93 04 20 0D 11 0A 4C 0C 43
-09 43 0E 9B 01 28 0E 8B 09 69 08 68 1D 83 07 30
-0C 5C 0A 6A 0E 6E F5 2B 0E 8B 12 D3 F5 3F 0A 4E
-1D 17 30 41 48 46 01 23 1B 42 DA 1D 2C 4F 0A 4E
-B0 12 5E 46 8F 49 00 00 0E 48 7A 90 0A 00 02 28
-3A 50 07 00 3A 50 30 00 92 83 AA 1D 18 42 AA 1D
-C8 4A 00 00 30 4D 96 46 02 23 53 00 87 12 98 46
-D2 46 2D 83 09 93 E0 23 0E 93 DE 23 3D 41 30 4D
-C8 46 02 23 3E 00 9F 42 AA 1D 00 00 3E 40 AA 1D
-2E 8F 30 4D 00 46 04 48 4F 4C 44 00 0A 4E 3E 4F
-DB 3F 3C 46 04 53 49 47 4E 00 0E 93 3E 4F 3A 40
-2D 00 D2 33 30 4D F4 45 03 55 44 2E 87 12 56 46
-CC 46 E6 46 50 49 18 49 2A 44 18 47 02 55 2E 00
-2F 83 8F 4E 00 00 0E 43 F1 3F 3E B0 00 80 06 24
-BF E3 00 00 3E E3 9F 53 00 00 0E 63 30 4D DA 44
-02 44 2E 00 87 12 56 46 6E 44 80 44 3A 47 CC 46
-92 44 0A 47 E6 46 50 49 18 49 2A 44 52 45 01 2E
-3E B0 00 80 DD 27 2F 83 3E 43 EC 3F F6 46 04 48
-45 52 45 00 2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D
-62 45 05 41 4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D
-E2 46 02 43 2C 00 1A 42 C4 1D CA 4E 00 00 92 53
-C4 1D 3E 4F 30 4D 2F 83 8F 4E 00 00 B0 12 2A 48
-92 B3 FC 05 FD 27 1E 42 EC 05 B0 12 3C 48 30 4D
-30 40 B6 47 7E 47 05 28 4B 45 59 29 18 42 EC 05
-EA 3F 12 46 03 4B 45 59 30 40 DC 47 92 47 06 41
-43 43 45 50 54 00 3C 40 A8 48 3B 40 72 48 2D 15
-0A 4E 2E 4F 0A 5E 3B 40 0D 00 3C 40 20 00 3D 40
-9C 48 92 B3 FC 05 05 24 18 42 EC 05 38 90 0A 00
-04 20 21 53 39 40 56 48 4D 15 B2 40 11 00 EE 05
-A2 B3 FC 05 FD 27 D2 C3 22 02 30 41 B2 40 13 00
-EE 05 A2 B3 FC 05 FD 27 D2 D3 22 02 30 41 00 00
-05 53 4C 45 45 50 30 40 64 48 00 00 07 28 53 4C
-45 45 50 29 12 D2 0A 18 F6 3F 21 52 3A 17 58 42
-EC 05 48 9B E3 27 48 9C 06 2C 78 92 11 20 2E 9F
-0F 24 1E 83 05 3C 0E 9A 03 24 CE 48 00 00 1E 53
-82 48 EE 05 A2 B3 FC 05 FD 27 30 4D 9E 48 2D 83
-92 B3 FC 05 FD 27 E3 23 B2 40 18 00 0A 18 3E 8F
-3D 41 30 4D D6 47 06 28 45 4D 49 54 29 00 08 4E
-3E 4F E6 3F 50 47 04 45 4D 49 54 00 30 40 BE 48
-C6 48 04 45 43 48 4F 00 B2 40 82 48 90 48 30 4D
-6E 47 06 4E 4F 45 43 48 4F 00 B2 40 30 4D 90 48
-30 4D B6 48 04 28 43 52 29 00 2F 83 8F 4E 00 00
-3E 40 0D 00 E3 3F A2 47 02 43 52 00 30 40 FA 48
-04 47 05 53 50 41 43 45 2F 83 8F 4E 00 00 3E 40
-20 00 D4 3F 12 49 06 53 50 41 43 45 53 00 0E 93
-09 24 0D 12 3D 40 3A 49 EF 3F 3C 49 2D 83 1E 83
-EB 23 3D 41 3E 4F 30 4D 2C 47 04 54 59 50 45 00
-0E 93 95 24 2A 4F 8F 5E 00 00 0E 4A 87 12 CA 45
-02 46 0A 45 CC 48 EC 45 60 49 2A 44 2F 82 8F 4E
-02 00 7E 4D 8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D
-26 49 82 53 22 00 87 12 34 44 6C 49 A2 4B 34 44
-22 00 C6 49 96 49 3D 41 6E 4E 1E 83 82 5E C4 1D
-3E 4F 92 B3 C4 1D A2 63 C4 1D 30 4D E2 48 82 2E
-22 00 87 12 86 49 34 44 50 49 A2 4B 2A 44 00 00
-04 57 4F 52 44 00 3C 40 BE 1D 39 4C 3A 4C 09 5A
-3A 5C 28 4C 09 9A 19 24 7E 9A FC 27 1A 83 3B 40
-60 00 C8 4C 00 00 09 9A 0C 24 7C 4A 4E 9C 09 24
-18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F 7C 80 20 00
-F0 3F 1A 82 C0 1D 82 4A C2 1D 1E 42 C4 1D 08 8E
-CE 48 00 00 30 4D 00 00 04 46 49 4E 44 00 2F 83
-0C 4E 65 4C 74 40 80 00 3B 40 CA 1D 3E 4B 0E 93
-1E 24 58 4C 01 00 78 F0 1E 00 0E 58 2E 53 1E 4E
-FE FF 0E 93 F3 27 09 4E 78 49 48 C4 48 95 F7 23
-0A 4C 1A 53 FA 99 00 00 F2 23 58 83 FA 23 19 B3
-09 63 0C 49 6A 4E 1E 43 4A 93 01 30 2E 83 8F 4C
-00 00 35 40 08 44 34 40 14 44 30 4D 2F 53 2F 53
-3E 4F 30 4D 26 46 07 3E 4E 55 4D 42 45 52 3C 4F
-38 4F 29 4F 2F 82 1B 42 DA 1D 6A 4C 7A 80 30 00
-7A 90 0A 00 02 28 7A 80 07 00 0A 9B 13 2C 82 49
-D0 04 82 48 D2 04 82 4B C8 04 19 42 E4 04 18 42
-E6 04 09 5A 08 63 1C 53 1E 83 E7 23 8F 49 04 00
-8F 48 02 00 8F 4C 00 00 30 4D 03 12 0D 12 1B 42
-DA 1D 0B 12 32 C0 00 02 6D 4E 0D 5E 0C 4E 7A 40
-2E 00 0D 9C 0A 28 7A 9C FC 23 32 D0 00 02 FC 4C
-FE FF 0D 9C FC 2F DE 83 00 00 09 43 08 43 3D 40
-50 4B 3F 82 8F 4E 06 00 0C 4E 7E 4C 6A 4C 7A 90
-2D 00 10 2C 3B 40 10 00 7A 80 24 00 06 24 2B 43
-5A 83 03 24 3B 52 6A 53 B0 23 1C 53 1E 83 6A 4C
-7A 90 2D 00 AA 23 1C 53 1E 83 B1 43 04 00 A5 3F
-52 4B 2F 53 0E 93 2C 17 82 4C DA 1D 03 24 2F 52
-0E F3 30 4D 9F 4F 02 00 04 00 BF 4F 00 00 3E E3
-09 20 3E E3 BF E3 02 00 BF E3 00 00 9F 53 02 00
-8F 63 00 00 32 B0 00 02 01 20 2F 53 30 4D D2 48
-07 45 58 45 43 55 54 45 0A 4E 3E 4F 00 4A 28 45
-01 2C 1A 42 C4 1D A2 53 C4 1D 8A 4E 00 00 3E 4F
-30 4D A0 4B 87 4C 49 54 45 52 41 4C 82 93 B6 1D
-16 24 32 B0 00 02 09 24 1A 42 C4 1D A2 52 C4 1D
-BA 40 34 44 00 00 BA 4F 02 00 1A 42 C4 1D A2 52
-C4 1D BA 40 34 44 00 00 8A 4E 02 00 3E 4F 30 4D
-08 49 05 43 4F 55 4E 54 2F 83 1E 53 8F 4E 00 00
-5E 4E FF FF 30 4D 82 4E BE 1D B2 4F C0 1D 3E 4F
-82 43 C2 1D 87 12 4C 46 C6 49 1C 4C 3D 40 28 4C
-FE 22 3D 41 3E 4F 30 4D 2A 4C 0A 4E 3E 4F 3D 40
-40 4C 53 27 3D 40 16 4C 1A E2 B6 1D B2 27 AC 23
-42 4C 3E 4F 3D 40 16 4C B9 23 DE 53 00 00 68 4E
-08 5E F8 40 3F 00 00 00 3D 40 0C 4E CD 3F 90 4B
-08 45 56 41 4C 55 41 54 45 00 39 40 BE 1D 39 12
-39 12 39 12 0D 12 B0 12 2A 44 06 4C 7E 4C 3D 41
-B2 41 C2 1D B2 41 C0 1D B2 41 BE 1D 30 4D 7A 45
-04 51 55 49 54 00 31 40 E0 1C B2 40 00 1C 00 1C
-82 43 B6 1D 82 43 08 18 B0 12 2A 44 6C 49 04 0D
-6F 6B 20 00 50 49 34 44 38 1D 44 44 34 44 50 00
-F6 47 18 49 06 4C 34 44 7E 1C CE 44 B2 45 6C 49
-0D 73 74 61 63 6B 20 65 6D 70 74 79 20 21 1A 4D
-34 44 30 FF 84 47 B2 45 6C 49 0B 46 52 41 4D 20
-66 75 6C 6C 20 21 1A 4D 42 46 F4 44 C0 45 AC 4C
-6C 49 04 0D 20 20 20 00 BC 45 B4 4C EE 47 05 41
-42 4F 52 54 3F 40 80 1C BE 3F 8F 93 02 00 AE 26
-B2 40 82 48 90 48 B0 12 0C 52 82 43 E2 5A 82 43
-EE 5A 82 43 FA 5A 82 43 2A 5B 82 43 36 5B 82 43
-42 5B A2 B3 FC 05 FD 27 B2 40 11 00 EE 05 D2 C3
-22 02 92 C3 FC 05 38 40 A0 AA 39 42 19 83 FE 23
-18 83 FB 23 92 B3 FC 05 F4 23 87 12 6C 49 04 1B
-5B 37 6D 00 50 49 50 49 6C 49 04 1B 5B 30 6D 00
-50 49 4E 51 90 51 96 51 14 4D 0E 4D 86 41 42 4F
-52 54 22 00 87 12 86 49 34 44 1A 4D A2 4B 2A 44
-18 4A 01 27 87 12 4C 46 C6 49 1E 4A C0 45 B2 4D
-2A 44 4A 4C 52 46 81 5C 92 42 BE 1D C2 1D 30 4D
-87 12 A2 49 4C 46 C6 49 CA 4D 08 4E 7A 4E 5A D3
-5A 53 0A 58 19 42 C8 1D 6E 4E 3E F0 1E 00 09 5E
-82 48 AE 1D 82 49 B0 1D 82 4A B2 1D 2A 52 82 4A
-C4 1D 3E 4F 3D 41 30 41 87 12 6C 49 0F 73 74 61
-63 6B 20 6D 69 73 6D 61 74 63 68 21 20 4D 82 9F
-B4 1D F2 23 18 42 AE 1D 19 42 B0 1D A8 49 FE FF
-89 48 00 00 30 4D C0 49 08 56 41 52 49 41 42 4C
-45 00 B0 12 C0 4D BA 40 86 12 FC FF EF 3F F2 4B
-08 43 4F 4E 53 54 41 4E 54 00 B0 12 C0 4D BA 40
-85 12 FC FF 8A 4E FE FF 3E 4F E0 3F 40 4E 06 43
-52 45 41 54 45 00 B0 12 C0 4D BA 40 85 12 FC FF
-8A 4A FE FF D3 3F 60 4C 05 44 4F 45 53 3E 1A 42
-B2 1D BA 40 84 12 00 00 8A 4D 02 00 3D 41 30 4D
-78 4E 05 44 45 46 45 52 B0 12 C0 4D BA 40 30 40
-FC FF BA 40 8E 4E FE FF B9 3F 00 00 81 5B 82 43
-B6 1D 30 4D B6 4D 01 5D B2 43 B6 1D 30 4D 82 49
-87 52 45 43 55 52 53 45 19 42 C4 1D 99 42 B2 1D
-00 00 A2 53 C4 1D 30 4D AC 4E 01 3A B0 12 C0 4D
-BA 40 87 12 FC FF A2 83 C4 1D B2 43 B6 1D 82 4F
-B4 1D 30 4D DA 4E 81 3B 82 93 B6 1D 5D 27 87 12
-34 44 2A 44 A2 4B 0E 4E AE 4E 2A 44 F4 48 09 49
+0E 93 3E 4F FB 27 2D 53 30 4D 1E 83 0E 7E F9 3F
+39 40 00 80 39 8F 08 4E 3E 4F 08 59 19 15 30 4D
+81 5E 00 00 3E 4F 32 B0 00 01 E8 27 2D 53 21 52
+30 4D 91 53 00 00 F7 3F CE 45 06 55 4E 4C 4F 4F
+50 00 F5 3F 00 00 01 49 2F 83 8F 4E 00 00 2E 41
+1E 81 02 00 30 4D 1E 45 01 4A 2F 83 8F 4E 00 00
+1E 41 04 00 1E 81 06 00 30 4D 9C 45 03 50 41 44
+85 12 E2 1C 1A 46 03 54 49 42 85 12 38 1D 0E 45
+03 43 50 4C 85 12 50 00 C2 45 03 3E 49 4E 85 12
+C2 1D 60 46 04 42 41 53 45 00 85 12 DA 1D C8 44
+05 53 54 41 54 45 85 12 B6 1D 74 46 02 42 4C 00
+85 12 20 00 B4 45 02 3C 23 00 B2 40 AA 1D AA 1D
+30 4D 8C 46 01 23 2C 4F 5B 42 DA 1D 0A 43 34 40
+20 00 0E 93 04 20 04 11 0E 4C 0C 43 09 43 0A 9B
+01 28 0A 8B 09 69 08 68 14 83 07 30 0C 5C 0E 6E
+0A 6A F5 2B 0A 8B 12 D3 F5 3F 34 40 14 44 8F 49
+00 00 0E 48 7A 90 0A 00 02 28 3A 50 07 00 3A 50
+30 00 92 83 AA 1D 18 42 AA 1D C8 4A 00 00 30 4D
+A4 46 02 23 53 00 87 12 A6 46 0C 47 2D 83 09 93
+CA 23 0E 93 C8 23 3D 41 30 4D 02 47 02 23 3E 00
+9F 42 AA 1D 00 00 3E 40 AA 1D 2E 8F 30 4D 26 46
+04 48 4F 4C 44 00 0A 4E 3E 4F DB 3F 80 46 04 53
+49 47 4E 00 0E 93 3E 4F 3A 40 2D 00 D2 33 30 4D
+56 46 02 55 2E 00 87 12 9A 46 34 44 00 00 06 47
+20 47 78 49 40 49 2A 44 68 45 02 44 2E 00 87 12
+9A 46 78 44 8A 44 6E 45 06 47 9A 44 44 47 20 47
+78 49 40 49 2A 44 50 45 01 2E 0E 93 E4 37 2F 83
+8F 4E 00 00 3E 43 EB 3F 30 47 04 48 45 52 45 00
+2F 83 8F 4E 00 00 1E 42 C4 1D 30 4D 5C 45 05 41
+4C 4C 4F 54 82 5E C4 1D 3E 4F 30 4D 1C 47 02 43
+2C 00 1A 42 C4 1D CA 4E 00 00 92 53 C4 1D 3E 4F
+30 4D 2F 83 8F 4E 00 00 B0 12 52 48 92 B3 FC 05
+FD 27 1E 42 EC 05 B0 12 64 48 30 4D 9A 47 05 28
+4B 45 59 29 18 42 EC 05 EC 3F 38 46 03 4B 45 59
+30 40 F4 47 AE 47 06 41 43 43 45 50 54 00 30 40
+1E 48 EE 47 08 28 41 43 43 45 50 54 29 00 3C 40
+D0 48 3B 40 9A 48 2D 15 0A 4E 2E 4F 0A 5E 3B 40
+0D 00 3C 40 20 00 3D 40 C4 48 92 B3 FC 05 05 24
+18 42 EC 05 38 90 0A 00 04 20 21 53 39 40 7E 48
+4D 15 B2 40 11 00 EE 05 D2 C3 22 02 A2 B3 FC 05
+FD 27 30 41 B2 40 13 00 EE 05 D2 D3 22 02 A2 B3
+FC 05 FD 27 30 41 00 00 05 53 4C 45 45 50 30 40
+8C 48 00 00 07 28 53 4C 45 45 50 29 12 D2 0A 18
+F6 3F 21 52 3A 17 58 42 EC 05 48 9B E3 27 48 9C
+06 2C 78 92 11 20 2E 9F 0F 24 1E 83 05 3C 0E 9A
+03 24 CE 48 00 00 1E 53 82 48 EE 05 A2 B3 FC 05
+FD 27 30 4D C6 48 2D 83 92 B3 FC 05 FD 27 E3 23
+B2 40 18 00 0A 18 3E 8F 3D 41 30 4D 14 48 06 28
+45 4D 49 54 29 00 08 4E 3E 4F E6 3F 6A 47 04 45
+4D 49 54 00 30 40 E6 48 EE 48 04 45 43 48 4F 00
+B2 40 82 48 B8 48 30 4D 88 47 06 4E 4F 45 43 48
+4F 00 B2 40 30 4D B8 48 30 4D DE 48 04 28 43 52
+29 00 2F 83 8F 4E 00 00 3E 40 0D 00 E3 3F BE 47
+02 43 52 00 30 40 22 49 3E 47 05 53 50 41 43 45
+2F 83 8F 4E 00 00 3E 40 20 00 D4 3F 3A 49 06 53
+50 41 43 45 53 00 0E 93 09 24 0D 12 3D 40 62 49
+EF 3F 64 49 2D 83 1E 83 EB 23 3D 41 3E 4F 30 4D
+52 47 04 54 59 50 45 00 0E 93 95 24 2A 4F 8F 5E
+00 00 0E 4A 87 12 F0 45 28 46 08 45 F4 48 12 46
+88 49 2A 44 2F 82 8F 4E 02 00 7E 4D 8F 4D 00 00
+0D 5E 1D B3 0D 63 30 4D 4E 49 82 53 22 00 87 12
+34 44 94 49 CA 4B 34 44 22 00 EE 49 BE 49 3D 41
+6E 4E 1E 83 82 5E C4 1D 3E 4F 92 B3 C4 1D A2 63
+C4 1D 30 4D 0A 49 82 2E 22 00 87 12 AE 49 34 44
+78 49 CA 4B 2A 44 00 00 04 57 4F 52 44 00 3C 40
+BE 1D 39 4C 3A 4C 09 5A 3A 5C 28 4C 09 9A 19 24
+7E 9A FC 27 1A 83 3B 40 60 00 C8 4C 00 00 09 9A
+0C 24 7C 4A 4E 9C 09 24 18 53 4B 9C F6 2F 7C 90
+7B 00 F3 2F 7C 80 20 00 F0 3F 1A 82 C0 1D 82 4A
+C2 1D 1E 42 C4 1D 08 8E CE 48 00 00 30 4D 00 00
+04 46 49 4E 44 00 2F 83 0C 4E 65 4C 74 40 80 00
+3B 40 CA 1D 3E 4B 0E 93 1E 24 58 4C 01 00 78 F0
+1E 00 0E 58 2E 53 1E 4E FE FF 0E 93 F3 27 09 4E
+78 49 48 C4 48 95 F7 23 0A 4C 1A 53 FA 99 00 00
+F2 23 58 83 FA 23 19 B3 09 63 0C 49 6A 4E 1E 43
+4A 93 01 30 2E 83 8F 4C 00 00 35 40 08 44 34 40
+14 44 30 4D 2F 53 2F 53 3E 4F 30 4D 6A 46 07 3E
+4E 55 4D 42 45 52 3C 4F 38 4F 29 4F 2F 82 1B 42
+DA 1D 6A 4C 7A 80 30 00 7A 90 0A 00 02 28 7A 80
+07 00 0A 9B 13 2C 82 49 D0 04 82 48 D2 04 82 4B
+C8 04 19 42 E4 04 18 42 E6 04 09 5A 08 63 1C 53
+1E 83 E7 23 8F 49 04 00 8F 48 02 00 8F 4C 00 00
+30 4D 03 12 0D 12 1B 42 DA 1D 0B 12 32 C0 00 02
+6D 4E 0D 5E 0C 4E 7A 40 2E 00 0D 9C 0A 28 7A 9C
+FC 23 32 D0 00 02 FC 4C FE FF 0D 9C FC 2F DE 83
+00 00 09 43 08 43 3D 40 78 4B 3F 82 8F 4E 06 00
+0C 4E 7E 4C 6A 4C 7A 90 2D 00 10 2C 3B 40 10 00
+7A 80 24 00 06 24 2B 43 5A 83 03 24 3B 52 6A 53
+B0 23 1C 53 1E 83 6A 4C 7A 90 2D 00 AA 23 1C 53
+1E 83 B1 43 04 00 A5 3F 7A 4B 2F 53 0E 93 2C 17
+82 4C DA 1D 03 24 2F 52 0E F3 30 4D 9F 4F 02 00
+04 00 BF 4F 00 00 3E E3 09 20 3E E3 BF E3 02 00
+BF E3 00 00 9F 53 02 00 8F 63 00 00 32 B0 00 02
+01 20 2F 53 30 4D FA 48 07 45 58 45 43 55 54 45
+0A 4E 3E 4F 00 4A 26 45 01 2C 1A 42 C4 1D A2 53
+C4 1D 8A 4E 00 00 3E 4F 30 4D C8 4B 87 4C 49 54
+45 52 41 4C 82 93 B6 1D 0F 24 1A 42 C4 1D A2 52
+C4 1D BA 40 34 44 00 00 8A 4E 02 00 3E 4F 32 B0
+00 02 32 C0 00 02 F1 23 30 4D 30 49 05 43 4F 55
+4E 54 2F 83 1E 53 8F 4E 00 00 5E 4E FF FF 30 4D
+82 4E BE 1D B2 4F C0 1D 3E 4F 82 43 C2 1D 87 12
+90 46 EE 49 36 4C 3D 40 42 4C 05 23 3D 41 3E 4F
+30 4D 44 4C 0A 4E 3E 4F 3D 40 5A 4C 5A 27 3D 40
+30 4C 1A E2 B6 1D B9 27 B3 23 5C 4C 3E 4F 3D 40
+30 4C C0 23 DE 53 00 00 68 4E 08 5E F8 40 3F 00
+00 00 3D 40 88 4E CD 3F B8 4B 08 45 56 41 4C 55
+41 54 45 00 39 40 BE 1D 3C 49 3B 49 3A 49 3D 15
+B0 12 2A 44 20 4C 98 4C B2 41 C2 1D B2 41 C0 1D
+B2 41 BE 1D 3D 41 30 4D 4C 46 04 51 55 49 54 00
+31 40 E0 1C B2 40 00 1C 00 1C 82 43 B6 1D 82 43
+08 18 B0 12 2A 44 94 49 03 0D 6F 6B 78 49 40 49
+5A 46 44 44 64 46 0E 48 40 49 20 4C DE 44 92 45
+94 49 0D 73 74 61 63 6B 20 65 6D 70 74 79 21 20
+2A 4D 34 44 30 FF A0 47 D2 45 94 49 0B 46 52 41
+4D 20 66 75 6C 6C 21 20 2A 4D 86 46 F2 44 E0 45
+C6 4C 94 49 03 0D 20 20 DC 45 CC 4C 06 48 05 41
+42 4F 52 54 3F 40 80 1C C3 3F 8F 93 02 00 BA 26
+B2 40 82 48 B8 48 B0 12 3C 52 A2 B3 FC 05 FD 27
+B2 40 11 00 EE 05 D2 C3 22 02 92 C3 FC 05 38 40
+A0 AA 39 42 03 43 19 83 FD 23 18 83 FA 23 92 B3
+FC 05 F3 23 87 12 94 49 04 1B 5B 37 6D 00 78 49
+78 49 94 49 04 1B 5B 30 6D 00 78 49 4A 51 8C 51
+92 51 DA 51 24 4D 1E 4D 86 41 42 4F 52 54 22 00
+87 12 AE 49 34 44 2A 4D CA 4B 2A 44 40 4A 01 27
+87 12 90 46 EE 49 46 4A E0 45 AE 4D 2A 44 64 4C
+96 46 81 5C 92 42 BE 1D C2 1D 30 4D 00 00 81 5B
+82 43 B6 1D 30 4D B2 4D 01 5D B2 43 B6 1D 30 4D
+BE 4D 83 5B 27 5D 87 12 A0 4D 34 44 34 44 CA 4B
+CA 4B 2A 44 BE 4F 02 00 3E 4F 30 4D 1C 49 82 49
+53 00 87 12 86 46 F2 44 E0 45 06 4E D6 4D 34 44
+E4 4D CA 4B 2A 44 A0 4D E4 4D 2A 44 EE 4D 09 49
4D 4D 45 44 49 41 54 45 1A 42 AE 1D FA D0 80 00
-00 00 30 4D BE 4F 02 00 3E 4F 30 4D 0E 4F 82 49
-53 00 87 12 42 46 F4 44 C0 45 46 4F 52 4F 34 44
-24 4F A2 4B 2A 44 A4 4D 24 4F 2A 44 F6 4E 83 5B
-27 5D 87 12 A4 4D 34 44 34 44 A2 4B A2 4B 2A 44
-90 4C 88 50 4F 53 54 50 4F 4E 45 00 87 12 4C 46
-C6 49 1E 4A 54 44 C0 45 B2 4D 7E 45 C0 45 8C 4F
-34 44 34 44 A2 4B A2 4B 34 44 A2 4B A2 4B 2A 44
-92 4F 3A 4E 82 4A C6 1D 2E 4E 82 4E C4 1D 3D 40
-10 00 09 4A 08 49 29 83 18 48 FE FF 0E 98 FC 2B
-89 48 00 00 1D 83 F6 23 2A 4A 0A 93 F0 23 3E 4F
-3D 41 30 4D 2E 4F 82 49 46 00 2F 83 8F 4E 00 00
-1E 42 C4 1D BE 40 C0 45 00 00 A2 52 C4 1D 2E 53
-30 4D 92 4E 84 45 4C 53 45 00 1A 42 C4 1D BA 40
-BC 45 00 00 2A 52 82 4A C4 1D 8E 4A 00 00 2A 83
-0E 4A 30 4D 4A 49 84 54 48 45 4E 00 9E 42 C4 1D
-00 00 3E 4F 30 4D 5E 4E 85 42 45 47 49 4E 30 40
-84 47 06 50 85 55 4E 54 49 4C 39 40 C0 45 1A 42
-C4 1D A2 52 C4 1D 8A 49 00 00 8A 4E 02 00 3E 4F
-30 4D 8C 4D 85 41 47 41 49 4E 39 40 BC 45 EF 3F
-28 4E 85 57 48 49 4C 45 87 12 CA 4F 6E 44 2A 44
-C0 4E 86 52 45 50 45 41 54 00 87 12 4A 50 0C 50
-2A 44 E4 4F 82 44 4F 00 2F 83 8F 4E 00 00 1E 42
-C4 1D BE 40 CA 45 00 00 2E 53 82 4E C4 1D A2 53
-00 1C 1A 42 00 1C 8A 43 00 00 30 4D B4 4B 84 4C
-4F 4F 50 00 39 40 EC 45 1A 42 C4 1D A2 52 C4 1D
-8A 49 00 00 8A 4E 02 00 1E 42 00 1C A2 83 00 1C
-2E 4E 0E 93 04 24 9E 42 C4 1D 00 00 F5 3F 3E 4F
-30 4D E4 47 85 2B 4C 4F 4F 50 39 40 DA 45 E4 3F
-9E 50 85 4C 45 41 56 45 1A 42 C4 1D BA 40 FC 45
-00 00 BA 40 BC 45 02 00 B2 50 06 00 C4 1D A2 53
-00 1C 2A 52 19 42 00 1C 89 4A 00 00 30 4D E2 50
-04 4D 4F 56 45 00 0A 4E 38 4F 39 4F 3E 4F 0A 93
-11 24 08 99 0F 24 06 2C F8 49 00 00 18 53 1A 83
-FB 23 30 4D 08 5A 09 5A 19 83 18 83 E8 49 00 00
-1A 83 FA 23 30 4D 34 44 CA 1D FC 44 2A 44 84 12
-46 51 64 54 3A 54 74 50 A2 4D 22 54 D4 50 10 51
-AE 49 B4 51 E8 51 24 50 AE 52 48 45 4E 4F B6 4E
-86 4A 00 00 3A 40 0C 00 39 40 CA 1D 38 40 CC 1D
-D9 3F 3A 40 0E 00 39 40 CC 1D 38 40 CA 1D CC 3F
-82 43 CC 1D 30 4D 92 42 CA 1D C8 1D 30 4D 62 4F
-09 50 57 52 5F 53 54 41 54 45 84 12 90 4F 1E 54
-68 5B A0 51 08 50 57 52 5F 48 45 52 45 00 92 42
-C4 1D B0 51 92 42 C6 1D AE 51 EF 3F 62 50 09 52
-53 54 5F 53 54 41 54 45 92 42 0C 18 B0 51 92 42
-0E 18 AE 51 E2 3F CE 51 08 52 53 54 5F 48 45 52
-45 00 92 42 C4 1D 0C 18 92 42 C6 1D 0E 18 DF 3F
-B2 40 54 52 B6 52 B2 40 64 48 58 48 B2 40 BE 48
-CE 48 B2 40 FA 48 0E 49 B2 40 DC 47 EA 47 30 41
-52 50 04 57 49 50 45 00 39 40 80 FF B9 43 00 00
-29 53 39 90 C6 FF FA 23 B0 12 00 52 B2 40 68 5B
-C4 1D B2 40 1E 54 C6 1D D4 3F C6 4F 06 28 57 41
-52 4D 29 00 1E 42 08 18 87 12 6C 49 05 0D 1B 5B
-37 6D 50 49 70 47 6C 49 27 20 46 61 73 74 46 6F
-72 74 68 20 56 31 36 30 20 31 36 4D 48 7A 20 28
+00 00 30 4D AA 49 87 52 45 43 55 52 53 45 19 42
+C4 1D 99 42 B2 1D 00 00 A2 53 C4 1D 30 4D AA 4C
+88 50 4F 53 54 50 4F 4E 45 00 87 12 90 46 EE 49
+46 4A 54 44 E0 45 AE 4D 92 45 E0 45 6A 4E 34 44
+34 44 CA 4B CA 4B 34 44 CA 4B CA 4B 2A 44 82 9F
+B4 1D A0 24 87 12 94 49 0F 73 74 61 63 6B 20 6D
+69 73 6D 61 74 63 68 21 30 4D 87 12 CA 49 90 46
+EE 49 94 4E 08 4E 7A 4E 5A D3 5A 53 0A 58 19 42
+C8 1D 6E 4E 3E F0 1E 00 09 5E 82 48 AE 1D 82 49
+B0 1D 82 4A B2 1D 2A 52 82 4A C4 1D 3E 4F 3D 41
+30 41 E8 49 08 56 41 52 49 41 42 4C 45 00 B0 12
+8A 4E BA 40 86 12 FC FF 71 3C 0C 4C 08 43 4F 4E
+53 54 41 4E 54 00 B0 12 8A 4E BA 40 85 12 FC FF
+8A 4E FE FF 3E 4F 62 3C DC 4E 06 43 52 45 41 54
+45 00 B0 12 8A 4E BA 40 85 12 FC FF 8A 4A FE FF
+55 3C 7A 4C 05 44 4F 45 53 3E 1A 42 B2 1D BA 40
+84 12 00 00 8A 4D 02 00 3D 41 30 4D 14 4F 05 44
+45 46 45 52 B0 12 8A 4E BA 40 30 40 FC FF BA 40
+2A 4F FE FF 3B 3C D2 4D 01 3A B0 12 8A 4E BA 40
+87 12 FC FF A2 83 C4 1D B2 43 B6 1D 82 4F B4 1D
+30 4D 48 4F 81 3B 82 93 B6 1D 24 27 87 12 34 44
+2A 44 CA 4B 6E 4E C0 4D 2A 44 7C 4F 3D 41 B2 4E
+0E 18 A2 4E 0C 18 3E 4F 32 3D DC 4B 06 4D 41 52
+4B 45 52 00 B0 12 8A 4E BA 40 84 12 FC FF BA 40
+7A 4F FE FF 9A 42 C6 1D 00 00 28 83 8A 48 02 00
+A2 52 C4 1D 18 42 AE 1D 19 42 B0 1D A8 49 FE FF
+89 48 00 00 30 4D 0E 4E 82 49 46 00 2F 83 8F 4E
+00 00 1E 42 C4 1D A2 52 C4 1D BE 40 E0 45 00 00
+2E 53 30 4D 2E 4F 84 45 4C 53 45 00 A2 52 C4 1D
+1A 42 C4 1D BA 40 DC 45 FC FF 8E 4A 00 00 2A 83
+0E 4A 30 4D 72 49 84 54 48 45 4E 00 9E 42 C4 1D
+00 00 3E 4F 30 4D FA 4E 85 42 45 47 49 4E 30 40
+A0 47 06 50 85 55 4E 54 49 4C 39 40 E0 45 A2 52
+C4 1D 1A 42 C4 1D 8A 49 FC FF 8A 4E FE FF 3E 4F
+30 4D 88 4D 85 41 47 41 49 4E 39 40 DC 45 EF 3F
+C4 4E 85 57 48 49 4C 45 87 12 CC 4F 78 44 2A 44
+26 4E 86 52 45 50 45 41 54 00 87 12 4A 50 0C 50
+2A 44 E6 4F 82 44 4F 00 2F 83 8F 4E 00 00 A2 53
+C4 1D 1E 42 C4 1D BE 40 F0 45 FE FF A2 53 00 1C
+1A 42 00 1C 8A 43 00 00 30 4D 8C 4F 84 4C 4F 4F
+50 00 39 40 12 46 A2 52 C4 1D 1A 42 C4 1D 8A 49
+FC FF 8A 4E FE FF 1E 42 00 1C A2 83 00 1C 2E 4E
+0E 93 03 24 8E 4A 00 00 F6 3F 3E 4F 30 4D FC 47
+85 2B 4C 4F 4F 50 39 40 00 46 E5 3F 9C 50 85 4C
+45 41 56 45 1A 42 C4 1D BA 40 22 46 00 00 BA 40
+DC 45 02 00 B2 50 06 00 C4 1D A2 53 00 1C 2A 52
+19 42 00 1C 89 4A 00 00 30 4D DE 50 04 4D 4F 56
+45 00 0A 4E 38 4F 39 4F 3E 4F 0A 93 11 24 08 99
+0F 24 06 2C F8 49 00 00 18 53 1A 83 FB 23 30 4D
+08 5A 09 5A 19 83 18 83 E8 49 00 00 1A 83 FA 23
+30 4D 34 44 CA 1D FA 44 2A 44 84 12 42 51 D4 55
+AA 55 74 50 9E 4D 92 55 D0 50 0C 51 D6 49 FE 51
+18 52 24 50 1E 54 46 45 A4 53 C8 4D AE 4A 00 00
+3A 40 0E 00 39 40 CA 1D 38 40 CC 1D D9 3F 3A 40
+0E 00 39 40 CC 1D 38 40 CA 1D CC 3F 82 43 CC 1D
+30 4D 92 42 CA 1D C8 1D 30 4D 9C 51 3A 4E 82 4A
+C6 1D 2E 4E 82 4E C4 1D 3D 40 10 00 09 4A 08 49
+29 83 18 48 FE FF 0E 98 FC 2B 89 48 00 00 1D 83
+F6 23 2A 4A 0A 93 F0 23 3E 4F 3D 41 30 4D 40 4E
+09 50 57 52 5F 53 54 41 54 45 84 12 9A 51 8E 55
+D6 5C 62 50 09 52 53 54 5F 53 54 41 54 45 92 42
+0E 18 DE 51 92 42 0C 18 E0 51 EF 3F D0 51 08 50
+57 52 5F 48 45 52 45 00 92 42 C6 1D DE 51 92 42
+C4 1D E0 51 30 4D E4 51 08 52 53 54 5F 48 45 52
+45 00 92 42 C6 1D 0E 18 92 42 C4 1D 0C 18 EC 3F
+B2 40 C4 53 26 54 B2 40 8C 48 80 48 B2 40 E6 48
+F6 48 B2 40 22 49 36 49 B2 40 F4 47 02 48 82 43
+50 5C 82 43 5C 5C 82 43 68 5C 82 43 98 5C 82 43
+A4 5C 82 43 B0 5C 30 41 52 50 04 57 49 50 45 00
+39 40 80 FF B9 43 00 00 29 53 39 90 C6 FF FA 23
+B0 12 30 52 B2 40 D6 5C 0C 18 B2 40 8E 55 0E 18
+AE 3F 18 50 07 43 4F 4D 50 41 52 45 0C 4E 38 4F
+3B 4F 39 4F 0E 4B 0E 5C 0C 24 1B 83 07 30 1C 83
+07 30 19 53 F9 98 FF FF F5 27 02 2C 3E 43 30 4D
+1E 43 30 4D 64 4F 86 5B 54 48 45 4E 5D 00 30 4D
+1E 83 30 4D C6 52 86 5B 45 4C 53 45 5D 00 87 12
+34 44 01 00 90 46 EE 49 12 4C 44 44 E0 45 4C 53
+8A 44 8A 44 94 49 04 5B 49 46 5D 00 9C 52 EA 45
+0A 53 A6 4A 2C 45 DC 45 40 53 8A 44 8A 44 94 49
+06 5B 45 4C 53 45 5D 00 9C 52 EA 45 2E 53 A6 4A
+D0 52 44 44 E0 45 2A 53 2C 45 DC 45 40 53 94 49
+06 5B 54 48 45 4E 5D 00 9C 52 EA 45 40 53 D0 52
+54 44 EA 45 48 53 2A 44 DC 45 E4 52 A6 4A 94 49
+03 0D 6B 6F 78 49 40 49 5A 46 44 44 64 46 0E 48
+62 53 82 43 C2 1D 82 4E BE 1D B2 4F C0 1D 3E 4F
+3D 40 E4 52 30 4D D6 52 84 5B 49 46 5D 00 0E 93
+3E 4F AD 27 30 4D 78 53 8B 5B 55 4E 44 45 46 49
+4E 45 44 5D 87 12 90 46 EE 49 46 4A 6C 44 86 45
+2A 44 88 53 89 5B 44 45 46 49 4E 45 44 5D 87 12
+90 46 EE 49 46 4A 6C 44 2A 44 C8 4F 06 28 57 41
+52 4D 29 00 1E 42 08 18 87 12 94 49 05 0D 1B 5B
+37 6D 78 49 8A 47 94 49 27 20 46 61 73 74 46 6F
+72 74 68 20 56 31 36 32 20 31 36 4D 48 7A 20 28
43 29 20 4A 2E 4D 2E 54 68 6F 6F 72 65 6E 73 20
-50 49 34 44 30 FF 84 47 2A 45 30 47 6C 49 0B 62
-79 74 65 73 20 66 72 65 65 20 26 4D 22 52 04 57
-41 52 4D 00 30 40 54 52 18 50 04 43 4F 4C 44 00
+78 49 34 44 30 FF A0 47 28 45 56 47 94 49 0B 62
+79 74 65 73 20 66 72 65 65 20 36 4D 6A 52 04 57
+41 52 4D 00 30 40 C4 53 94 52 04 43 4F 4C 44 00
B2 40 04 A5 20 01 B2 40 88 5A 5C 01 92 43 04 02
B2 40 FE FF 02 02 A2 83 06 02 92 D3 24 02 B2 D3
26 02 B2 43 22 02 B2 43 42 02 B2 D3 46 02 B2 43
39 40 80 00 B2 40 33 00 64 01 D2 43 61 01 92 D2
9E 01 08 18 A2 93 08 18 01 24 59 07 38 40 C2 A2
18 83 FE 23 19 83 FA 23 B2 42 B0 01 F2 D0 10 00
-2A 03 F2 C0 40 00 A2 04 3A 40 C6 52 39 40 C6 FF
+2A 03 F2 C0 40 00 A2 04 3A 40 36 54 39 40 C6 FF
89 4A 00 00 29 53 FC 23 92 42 02 18 E4 FF B2 40
18 00 0A 18 31 40 E0 1C 3F 40 80 1C 37 40 00 44
-36 40 B4 44 35 40 08 44 34 40 14 44 B2 40 0A 00
+36 40 BC 44 35 40 08 44 34 40 14 44 B2 40 0A 00
DA 1D B2 43 AC 1D 92 C3 30 01 18 42 08 18 F2 B0
10 00 20 02 04 20 38 E3 18 53 82 48 08 18 B2 40
81 00 E0 05 B2 40 11 00 E6 05 B2 40 00 4A E8 05
F2 D0 30 00 2A 02 92 C3 E0 05 92 D3 FA 05 3D 40
-F8 53 18 42 08 18 38 90 0A 00 1E 27 38 90 16 00
-1B 2F 28 93 F1 22 D9 26 B4 52 84 12 46 51 46 5A
-F2 5A FA 59 46 5B C0 59 7A 5A C4 56 00 00 B6 59
-66 5A 18 5A 56 5A D4 57 00 00 00 00 58 5B 72 51
-4C 52 85 48 49 32 4C 4F 87 12 84 47 DE 4F A2 4B
-AE 4E 74 51 FA 53 2A 44 BA 52 04 43 4F 44 45 00
-B0 12 C0 4D A2 82 C4 1D 87 12 EE 4E BC 45 32 54
-00 00 07 45 4E 44 43 4F 44 45 87 12 82 51 0E 4E
+68 55 18 42 08 18 38 90 0A 00 8A 26 38 90 16 00
+87 2E 28 93 44 22 39 26 24 54 84 12 42 51 B4 5B
+60 5C 68 5B B4 5C 2E 5B E8 5B 32 58 00 00 24 5B
+D4 5B 86 5B C4 5B 42 59 00 00 00 00 C6 5C 6E 51
+BC 53 85 48 49 32 4C 4F 87 12 A0 47 E0 4F CA 4B
+C0 4D 70 51 6A 55 2A 44 2A 54 04 43 4F 44 45 00
+B0 12 8A 4E A2 82 C4 1D 87 12 5C 4F DC 45 A2 55
+00 00 07 45 4E 44 43 4F 44 45 87 12 7E 51 6E 4E
2A 44 44 50 03 41 53 4D 92 42 C8 1D B8 1D B2 40
-FE 53 C8 1D E5 3F 52 54 06 45 4E 44 41 53 4D 00
+6E 55 C8 1D E5 3F C2 55 06 45 4E 44 41 53 4D 00
92 42 B8 1D C8 1D E9 3F 00 00 05 43 4F 4C 4F 4E
1A 42 C4 1D BA 40 87 12 00 00 A2 53 C4 1D B2 43
-B6 1D 30 40 82 51 00 00 05 4C 4F 32 48 49 1A 42
+B6 1D 30 40 7E 51 00 00 05 4C 4F 32 48 49 1A 42
C4 1D BA 40 B0 12 00 00 BA 40 2A 44 02 00 A2 52
C4 1D ED 3F 38 40 BE 1D 39 48 2A 48 09 5A 1A 52
C2 1D 09 9A 03 24 7E 9A FC 27 1A 83 0E 4A 2A 88
-82 4A C2 1D 30 4D B0 12 2A 44 C6 49 1E 4A 72 45
-C0 45 FC 54 DA 4A C0 45 B2 4D 1E 55 FE 54 29 4E
-39 90 86 12 02 20 2E 53 30 41 39 90 85 12 03 20
-1E 4E 02 00 30 41 39 90 84 12 01 20 2E 52 30 41
-19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 40 29 00
-12 12 C2 1D 92 53 C2 1D B0 12 2A 44 C6 49 DA 4A
-C0 45 50 55 46 55 21 53 3E 90 10 00 BB 2D 30 41
-52 55 B2 41 C2 1D 22 D3 30 41 87 12 4C 46 C4 54
-62 55 82 43 BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D
-0A 4E 3E 4F FA 90 23 00 00 00 34 20 92 53 C2 1D
-B0 12 E6 54 0E 93 04 20 B2 40 00 03 BC 1D 27 3C
-1E 93 04 20 B2 40 10 03 BC 1D 21 3C 2E 93 04 20
-B2 40 20 03 BC 1D 1B 3C 2E 92 04 20 B2 40 20 02
-BC 1D 15 3C 3E 92 04 20 B2 40 30 02 BC 1D 0F 3C
-3E 93 04 20 B2 40 30 03 BC 1D 09 3C B2 40 30 00
-BC 1D 19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 4F
-3D 41 30 4D FA 90 26 00 00 00 08 20 B2 40 10 02
-BC 1D 92 53 C2 1D 30 12 D2 55 75 3F FA 90 40 00
-00 00 1A 20 B2 40 20 00 BC 1D 92 53 C2 1D B0 12
-30 55 0E 20 B2 50 10 00 BC 1D 3E 40 2B 00 B0 12
-30 55 32 24 92 92 BE 1D C2 1D 02 24 92 53 C2 1D
-8E 10 82 5E BC 1D D3 3F B0 12 30 55 F9 23 B2 50
-10 00 BC 1D 3E 40 28 00 B0 12 E6 54 30 12 22 56
-67 3F 87 12 4C 46 C4 54 5A 56 FE 90 26 00 00 00
-3E 40 20 00 04 20 B2 50 82 00 BC 1D C2 3F B0 12
-30 55 DF 23 B2 50 80 00 BC 1D 3E 40 28 00 B0 12
-E6 54 B0 12 20 55 D5 23 3D 40 B2 4D 30 4D 50 48
-04 52 45 54 49 00 87 12 34 44 00 13 A2 4B 2A 44
-34 44 2C 00 5A 55 52 56 AA 56 2E 4E 1E D2 BC 1D
-19 42 BA 1D 92 3F A8 54 03 4D 4F 56 84 12 A0 56
-00 40 B8 56 05 4D 4F 56 2E 42 84 12 A0 56 40 40
-00 00 03 41 44 44 84 12 A0 56 00 50 D2 56 05 41
-44 44 2E 42 84 12 A0 56 40 50 DE 56 04 41 44 44
-43 00 84 12 A0 56 00 60 EC 56 06 41 44 44 43 2E
-42 00 84 12 A0 56 40 60 90 56 04 53 55 42 43 00
-84 12 A0 56 00 70 0A 57 06 53 55 42 43 2E 42 00
-84 12 A0 56 40 70 18 57 03 53 55 42 84 12 A0 56
-00 80 28 57 05 53 55 42 2E 42 84 12 A0 56 40 80
-8A 54 03 43 4D 50 84 12 A0 56 00 90 42 57 05 43
-4D 50 2E 42 84 12 A0 56 40 90 78 54 04 44 41 44
-44 00 84 12 A0 56 00 A0 5C 57 06 44 41 44 44 2E
-42 00 84 12 A0 56 40 A0 4E 57 03 42 49 54 84 12
-A0 56 00 B0 7A 57 05 42 49 54 2E 42 84 12 A0 56
-40 B0 86 57 03 42 49 43 84 12 A0 56 00 C0 94 57
-05 42 49 43 2E 42 84 12 A0 56 40 C0 A0 57 03 42
-49 53 84 12 A0 56 00 D0 AE 57 05 42 49 53 2E 42
-84 12 A0 56 40 D0 00 00 03 58 4F 52 84 12 A0 56
-00 E0 C8 57 05 58 4F 52 2E 42 84 12 A0 56 40 E0
-FA 56 03 41 4E 44 84 12 A0 56 00 F0 E2 57 05 41
-4E 44 2E 42 84 12 A0 56 40 F0 4C 46 5A 55 00 58
-1A 42 BC 1D B2 F0 70 00 BC 1D 8A 10 3A F0 0F 00
-82 DA BC 1D 4A 3F 34 57 03 52 52 43 84 12 FA 57
-00 10 18 58 05 52 52 43 2E 42 84 12 FA 57 40 10
-24 58 04 53 57 50 42 00 84 12 FA 57 80 10 32 58
-03 52 52 41 84 12 FA 57 00 11 40 58 05 52 52 41
-2E 42 84 12 FA 57 40 11 4C 58 03 53 58 54 84 12
-FA 57 80 11 00 00 04 50 55 53 48 00 84 12 FA 57
-00 12 66 58 06 50 55 53 48 2E 42 00 84 12 FA 57
-40 12 BA 57 04 43 41 4C 4C 00 84 12 FA 57 80 12
-34 44 2C 00 5A 55 52 56 9A 58 59 42 BC 1D 5A 42
-BD 1D 82 4A BC 1D BE 90 00 15 00 00 02 20 0A 89
-02 3C 09 8A 0A 49 3A 90 10 00 03 2C 5A 0E A8 3F
-1A 53 0E 4A 87 12 70 47 6C 49 0D 6F 75 74 20 6F
-66 20 62 6F 75 6E 64 73 20 4D 74 58 05 50 55 53
-48 4D 84 12 90 58 00 15 DC 58 04 50 4F 50 4D 00
-84 12 90 58 00 17 4C 46 C4 54 FC 58 82 43 BC 1D
-92 42 C4 1D BA 1D A2 53 C4 1D 92 53 C2 1D 3E 40
-2C 00 B0 12 2A 44 C6 49 DA 4A C0 45 B2 4D 52 56
-22 59 0A 4E 3E 4F 1A 83 2A 92 CA 2F 8A 10 5A 06
-6F 3F 5A 58 04 52 52 43 4D 00 84 12 F6 58 50 00
-34 59 04 52 52 41 4D 00 84 12 F6 58 50 01 42 59
-04 52 4C 41 4D 00 84 12 F6 58 50 02 50 59 04 52
-52 55 4D 00 84 12 F6 58 50 03 85 12 00 3C 5E 59
-03 53 3E 3D 85 12 00 38 70 59 02 53 3C 00 85 12
-00 34 EA 58 03 30 3E 3D 85 12 00 30 84 59 02 30
-3C 00 85 12 00 30 00 00 02 55 3C 00 85 12 00 2C
-98 59 03 55 3E 3D 85 12 00 28 8E 59 03 30 3C 3E
-85 12 00 24 AC 59 02 30 3D 00 85 12 00 20 5C 48
-02 49 46 00 1A 42 C4 1D 8A 4E 00 00 A2 53 C4 1D
-0E 4A 30 4D A2 59 04 54 48 45 4E 00 1A 42 C4 1D
-08 4E 3E 4F 09 48 29 53 0A 89 0A 11 3A 90 00 02
-68 2F 88 DA 00 00 30 4D 6A 57 04 45 4C 53 45 00
-1A 42 C4 1D BA 40 00 3C 00 00 A2 53 C4 1D 2F 83
-8F 4A 00 00 E3 3F D6 59 05 55 4E 54 49 4C 3A 4F
-08 4E 3E 4F 19 42 C4 1D 2A 83 0A 89 0A 11 3A 90
-00 FE 47 3B 3A F0 FF 03 08 DA 89 48 00 00 A2 53
-C4 1D 30 4D EE 57 05 41 47 41 49 4E 87 12 6A 59
-1E 5A 2A 44 00 00 05 57 48 49 4C 45 87 12 C4 59
-6E 44 2A 44 7A 59 06 52 45 50 45 41 54 00 87 12
-6A 59 1E 5A DC 59 2A 44 00 00 03 4A 4D 50 87 12
-A4 4D 6A 59 1E 5A 2A 44 3E B0 00 10 03 20 3E E0
-00 04 30 4D 3E 90 00 34 06 28 03 24 3E 40 00 34
-30 4D 3E 40 00 38 30 4D 00 00 04 3F 4A 4D 50 00
-87 12 88 5A A4 4D 6E 44 1E 5A 2A 44 BE 5A 3D 41
-08 4E 3E 4F 2A 48 0A 93 04 20 98 42 C4 1D 00 00
-30 4D 88 43 00 00 A4 3F 84 58 03 42 57 31 84 12
-BC 5A 00 00 DA 5A 03 42 57 32 84 12 BC 5A 00 00
-E6 5A 03 42 57 33 84 12 BC 5A 00 00 FE 5A 3D 41
-1A 42 C4 1D 28 4E 08 93 08 20 BA 4F 00 00 A2 53
-C4 1D 8E 4A 00 00 3E 4F 30 4D 8E 43 00 00 61 3F
-00 00 03 46 57 31 84 12 FC 5A 00 00 22 5B 03 46
-57 32 84 12 FC 5A 00 00 2E 5B 03 46 57 33 84 12
-FC 5A 00 00 3A 5B 04 47 4F 54 4F 00 87 12 6A 59
-A4 4D 98 4B 2A 44 AA 5A 05 3F 47 4F 54 4F 87 12
-88 5A A4 4D 98 4B 2A 44
+82 4A C2 1D 30 4D B0 12 2A 44 EE 49 46 4A EA 45
+6A 56 02 4B E0 45 AE 4D 8C 56 6C 56 29 4E 39 90
+86 12 02 20 2E 53 30 41 39 90 85 12 03 20 1E 4E
+02 00 30 41 39 90 84 12 01 20 2E 52 30 41 19 42
+C4 1D A2 53 C4 1D 89 4E 00 00 3E 40 29 00 12 12
+C2 1D 92 53 C2 1D B0 12 2A 44 EE 49 02 4B E0 45
+BE 56 B4 56 21 53 3E 90 10 00 BB 2D 30 41 C0 56
+B2 41 C2 1D 22 D3 30 41 87 12 90 46 34 56 D0 56
+82 43 BC 1D 92 42 C4 1D BA 1D A2 53 C4 1D 0A 4E
+3E 4F FA 90 23 00 00 00 34 20 92 53 C2 1D B0 12
+56 56 0E 93 04 20 B2 40 00 03 BC 1D 27 3C 1E 93
+04 20 B2 40 10 03 BC 1D 21 3C 2E 93 04 20 B2 40
+20 03 BC 1D 1B 3C 2E 92 04 20 B2 40 20 02 BC 1D
+15 3C 3E 92 04 20 B2 40 30 02 BC 1D 0F 3C 3E 93
+04 20 B2 40 30 03 BC 1D 09 3C B2 40 30 00 BC 1D
+19 42 C4 1D A2 53 C4 1D 89 4E 00 00 3E 4F 3D 41
+30 4D FA 90 26 00 00 00 08 20 B2 40 10 02 BC 1D
+92 53 C2 1D 30 12 40 57 76 3F FA 90 40 00 00 00
+1A 20 B2 40 20 00 BC 1D 92 53 C2 1D B0 12 9E 56
+0E 20 B2 50 10 00 BC 1D 3E 40 2B 00 B0 12 9E 56
+32 24 92 92 BE 1D C2 1D 02 24 92 53 C2 1D 8E 10
+82 5E BC 1D D3 3F B0 12 9E 56 F9 23 B2 50 10 00
+BC 1D 3E 40 28 00 B0 12 56 56 30 12 90 57 67 3F
+87 12 90 46 34 56 C8 57 FE 90 26 00 00 00 3E 40
+20 00 04 20 B2 50 82 00 BC 1D C2 3F B0 12 9E 56
+DF 23 B2 50 80 00 BC 1D 3E 40 28 00 B0 12 56 56
+B0 12 8E 56 D5 23 3D 40 AE 4D 30 4D 78 48 04 52
+45 54 49 00 87 12 34 44 00 13 CA 4B 2A 44 34 44
+2C 00 C8 56 C0 57 18 58 2E 4E 1E D2 BC 1D 19 42
+BA 1D 92 3F 18 56 03 4D 4F 56 84 12 0E 58 00 40
+26 58 05 4D 4F 56 2E 42 84 12 0E 58 40 40 00 00
+03 41 44 44 84 12 0E 58 00 50 40 58 05 41 44 44
+2E 42 84 12 0E 58 40 50 4C 58 04 41 44 44 43 00
+84 12 0E 58 00 60 5A 58 06 41 44 44 43 2E 42 00
+84 12 0E 58 40 60 FE 57 04 53 55 42 43 00 84 12
+0E 58 00 70 78 58 06 53 55 42 43 2E 42 00 84 12
+0E 58 40 70 86 58 03 53 55 42 84 12 0E 58 00 80
+96 58 05 53 55 42 2E 42 84 12 0E 58 40 80 FA 55
+03 43 4D 50 84 12 0E 58 00 90 B0 58 05 43 4D 50
+2E 42 84 12 0E 58 40 90 E8 55 04 44 41 44 44 00
+84 12 0E 58 00 A0 CA 58 06 44 41 44 44 2E 42 00
+84 12 0E 58 40 A0 BC 58 03 42 49 54 84 12 0E 58
+00 B0 E8 58 05 42 49 54 2E 42 84 12 0E 58 40 B0
+F4 58 03 42 49 43 84 12 0E 58 00 C0 02 59 05 42
+49 43 2E 42 84 12 0E 58 40 C0 0E 59 03 42 49 53
+84 12 0E 58 00 D0 1C 59 05 42 49 53 2E 42 84 12
+0E 58 40 D0 00 00 03 58 4F 52 84 12 0E 58 00 E0
+36 59 05 58 4F 52 2E 42 84 12 0E 58 40 E0 68 58
+03 41 4E 44 84 12 0E 58 00 F0 50 59 05 41 4E 44
+2E 42 84 12 0E 58 40 F0 90 46 C8 56 6E 59 1A 42
+BC 1D B2 F0 70 00 BC 1D 8A 10 3A F0 0F 00 82 DA
+BC 1D 4A 3F A2 58 03 52 52 43 84 12 68 59 00 10
+86 59 05 52 52 43 2E 42 84 12 68 59 40 10 92 59
+04 53 57 50 42 00 84 12 68 59 80 10 A0 59 03 52
+52 41 84 12 68 59 00 11 AE 59 05 52 52 41 2E 42
+84 12 68 59 40 11 BA 59 03 53 58 54 84 12 68 59
+80 11 00 00 04 50 55 53 48 00 84 12 68 59 00 12
+D4 59 06 50 55 53 48 2E 42 00 84 12 68 59 40 12
+28 59 04 43 41 4C 4C 00 84 12 68 59 80 12 34 44
+2C 00 C8 56 C0 57 08 5A 59 42 BC 1D 5A 42 BD 1D
+82 4A BC 1D BE 90 00 15 00 00 02 20 0A 89 02 3C
+09 8A 0A 49 3A 90 10 00 03 2C 5A 0E A8 3F 1A 53
+0E 4A 87 12 8A 47 94 49 0D 6F 75 74 20 6F 66 20
+62 6F 75 6E 64 73 30 4D E2 59 05 50 55 53 48 4D
+84 12 FE 59 00 15 4A 5A 04 50 4F 50 4D 00 84 12
+FE 59 00 17 90 46 34 56 6A 5A 82 43 BC 1D 92 42
+C4 1D BA 1D A2 53 C4 1D 92 53 C2 1D 3E 40 2C 00
+B0 12 2A 44 EE 49 02 4B E0 45 AE 4D C0 57 90 5A
+0A 4E 3E 4F 1A 83 2A 92 CA 2F 8A 10 5A 06 6F 3F
+C8 59 04 52 52 43 4D 00 84 12 64 5A 50 00 A2 5A
+04 52 52 41 4D 00 84 12 64 5A 50 01 B0 5A 04 52
+4C 41 4D 00 84 12 64 5A 50 02 BE 5A 04 52 52 55
+4D 00 84 12 64 5A 50 03 85 12 00 3C CC 5A 03 53
+3E 3D 85 12 00 38 DE 5A 02 53 3C 00 85 12 00 34
+58 5A 03 30 3E 3D 85 12 00 30 F2 5A 02 30 3C 00
+85 12 00 30 00 00 02 55 3C 00 85 12 00 2C 06 5B
+03 55 3E 3D 85 12 00 28 FC 5A 03 30 3C 3E 85 12
+00 24 1A 5B 02 30 3D 00 85 12 00 20 84 48 02 49
+46 00 1A 42 C4 1D 8A 4E 00 00 A2 53 C4 1D 0E 4A
+30 4D 10 5B 04 54 48 45 4E 00 1A 42 C4 1D 08 4E
+3E 4F 09 48 29 53 0A 89 0A 11 3A 90 00 02 68 2F
+88 DA 00 00 30 4D D8 58 04 45 4C 53 45 00 1A 42
+C4 1D BA 40 00 3C 00 00 A2 53 C4 1D 2F 83 8F 4A
+00 00 E3 3F 44 5B 05 55 4E 54 49 4C 3A 4F 08 4E
+3E 4F 19 42 C4 1D 2A 83 0A 89 0A 11 3A 90 00 FE
+47 3B 3A F0 FF 03 08 DA 89 48 00 00 A2 53 C4 1D
+30 4D 5C 59 05 41 47 41 49 4E 87 12 D8 5A 8C 5B
+2A 44 00 00 05 57 48 49 4C 45 87 12 32 5B 78 44
+2A 44 E8 5A 06 52 45 50 45 41 54 00 87 12 D8 5A
+8C 5B 4A 5B 2A 44 00 00 03 4A 4D 50 87 12 A0 4D
+D8 5A 8C 5B 2A 44 3E B0 00 10 03 20 3E E0 00 04
+30 4D 3E 90 00 34 06 28 03 24 3E 40 00 34 30 4D
+3E 40 00 38 30 4D 00 00 04 3F 4A 4D 50 00 87 12
+F6 5B A0 4D 78 44 8C 5B 2A 44 2C 5C 3D 41 08 4E
+3E 4F 2A 48 0A 93 04 20 98 42 C4 1D 00 00 30 4D
+88 43 00 00 A4 3F F2 59 03 42 57 31 84 12 2A 5C
+00 00 48 5C 03 42 57 32 84 12 2A 5C 00 00 54 5C
+03 42 57 33 84 12 2A 5C 00 00 6C 5C 3D 41 1A 42
+C4 1D 28 4E 08 93 08 20 BA 4F 00 00 A2 53 C4 1D
+8E 4A 00 00 3E 4F 30 4D 8E 43 00 00 61 3F 00 00
+03 46 57 31 84 12 6A 5C 00 00 90 5C 03 46 57 32
+84 12 6A 5C 00 00 9C 5C 03 46 57 33 84 12 6A 5C
+00 00 A8 5C 04 47 4F 54 4F 00 87 12 D8 5A A0 4D
+C0 4B 2A 44 18 5C 05 3F 47 4F 54 4F 87 12 F6 5B
+A0 4D C0 4B 2A 44
@FFC6
-C6 52 C6 52 C6 52 C6 52 C6 52 C6 52 C6 52 C6 52
-C6 52 C6 52 C6 52 C6 52 C6 52 C6 52 C6 52 6A 48
-C6 52 C6 52 C6 52 C6 52 C6 52 C6 52 C6 52 C6 52
-C6 52 C6 52 C6 52 C6 52 C6 52
+36 54 36 54 36 54 36 54 36 54 36 54 36 54 36 54
+36 54 36 54 36 54 36 54 36 54 36 54 36 54 92 48
+36 54 36 54 36 54 36 54 36 54 36 54 36 54 36 54
+36 54 36 54 36 54 36 54 36 54
q
+++ /dev/null
-\prog\MSP430Flasher\msp430flasher -m SBW2 -n MSP430fr6989 -v -w %1 -z [VCC=3000]
-exit
-
-tip : how to calculate MAIN program lenght ?
-
-open the prog.txt file with your editor, select MAIN section
-in status bar, keep the number of selected chars
-if lines are ended with CR+LF, substract the number of lines selected
-then divide by 3.
+++ /dev/null
-; -*- coding: utf-8 -*-
-; MY_MSP430FR5738.asm
-; config file for MY_MSP430FR5738 board
-;
-; Copyright (C) <2014> <J.M. THOORENS>
-;
-; This program is free software: you can redistribute it and/or modify
-; it under the terms of the GNU General Public License as published by
-; the Free Software Foundation, either version 3 of the License, or
-; (at your option) any later version.
-;
-; This program is distributed in the hope that it will be useful,
-; but WITHOUT ANY WARRANTY; without even the implied warranty of
-; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-; GNU General Public License for more details.
-;
-; You should have received a copy of the GNU General Public License
-; along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-
-; ======================================================================
-; MY_MSP430FR5738 board
-; ======================================================================
-
-; MSP430FR5738 XTAL 32768 Hz
-; 1 --- PJ.4 --- LFXIN
-; 2 --- PJ.5 --- LFXOUT
-
-; MSP430FR5738 PROG 6PINS UART 4PINS
-; --- VCC <-> 2 "3v3" <-> 1 "3v3"
-; 20 --- P2.1 <-- 6 "RXD" <-- 2 "RXD"
-; +--4k7-< DeepRST <-- GND
-; |
-; 19 --- P2.0 <+> 1 "TXD" --> 3 "TXD"
-; --- VSS <-> 5 "GND" <-> 4 "GND"
-; 17 --- TEST --- 3 "TST"
-; 18 --- RST --- 4 "RST"
-
-; SWITCH PROG/UART
-; oriented to UART 4PINS
-
-; I2C 4PINS
-; 1 "3v3" <-> DVCC,AVCC
-; 2 "SCL" <-> pin23 = P1.7 == UCB0RXD --> UCB0RXDBUF
-; 3 "SDA" <-> pin22 = P1.6 == UCB0TXD <-- UCB0TXDBUf
-; 4 "GND" <-> DVSS,AVSS
-
-; P1
-; 1 <-> pin5 P1.0/TA0.1/DMAE0/RTCCLK/A0/CD0/VeREF-
-; 2 <-> pin6 P1.1/TA0.2/TA1CLK/CDOUT/A1/CD1/VeREF+
-; 3 <-> pin7 P1.2/TA1.1/TA0CLK/CDOUT/A2/CD2
-; 4 <-> pin8 P1.3/TA1.2/UCB0STE/A3/CD3
-; 5 <-> pin9 P1.4/TB0.1/UCA0STE/A4/CD4
-; 6 <-> pin10 P1.5/TB0.2/UCA0CLK/A5/CD5
-; 7 <-> pin22 P1.6/UCB0SIMO/UCB0SDA/TA0.0
-; 8 <-> pin23 P1.7/UCB0SOMI/UCB0SCL/TA1.0
-
-; P2
-; 1 <-> pin19 P2.0/UCA0TXD/UCA0SIMO/TB0CLK/ACLK
-; 2 <-> pin20 P2.1/UCA0RXD/UCA0SOMI/TB0.0
-; 3 <-> pin21 P2.2/UCB0CLK
-; 4 <-> pin27 P2.3/TA0.0/A6/CD10
-; 5 <-> pin28 P2.4/TA1.0/A7/CD11
-; 6 <-> pin15 P2.5/TB0.0
-; 7 <-> pin16 P2.6
-; 8 <-> "NC "
-
-; PJ
-; 1 <-> "3V3 "
-; 2 <-> "3V3 "
-; 3 <-> pin11 PJ.0/TDO/TB0OUTH/SMCLK/CD6
-; 4 <-> pin12 PJ.1/TDI/TCLK/MCLK/CD7
-; 5 <-> pin13 PJ.2/TMS/ACLK/CD8
-; 6 <-> pin14 PJ.3/TCK/CD9
-; 7 <-> "GND "
-; 8 <-> "GND "
-
-; XTAL 32768 Hz
-; PJ.4 <->XIN LF XTAL
-; PJ.5 <->XOUT LF XTAL
-
-; Vcc <------------------------- Vcc \
-; RST <------------------------> RST \ TI_PROGRM
-; TST <------------------------> TST / INTERFACE
-; Vss <------------------------> Gnd /
-
-; Vcc <------------------------- Vcc \
-; P2.0 TX0 ---------------------> RX \ UARTtoUSB
-; P2.1 RX0 <--------------------- TX / CP2102
-; Vss <------------------------> Gnd /
-
-; GND <-------+---0V0----------> 1 LCD_Vss
-; VCC <------ | --3V6-----+----> 2 LCD_Vdd
-; | |
-; |___ 470n ---
-; ^ | ---
-; / \ BAT54 |
-; --- |
-; 100n | 2k2 |
-; P1.5 >---||--+--^/\/\/v--+----> 3 LCD_Vo (=0V6 without modulation)
-; P1.4 >------------------------> 4 LCD_RS
-; P1.3 >------------------------> 5 LCD_R/W
-; P1.2 >------------------------> 6 LCD_EN
-
-; P1.1 >------------------------> 5 SCL I2C MASTER
-; P1.0 >------------------------> 6 SDA I2C MASTER | IR_RC5 receiver
-
-; PJ.0 <------------------------> 11 LCD_DB4
-; PJ.1 <------------------------> 12 LCD_DB5
-; PJ.2 <------------------------> 13 LCD_DB5
-; PJ.3 <------------------------> 14 LCD_DB7
-
-; P2.5 ---> S2 LCD contrast +
-; P2.6 ---> S1 LCD contrast - | HARD WIPE
-
-
-
-; VCC P1.1 ---> red SD_CardAdapter VCC
-; GND P1.2 <--> black SD_CardAdapter GND
-; P1.6/UCB0SIMO/UCB0SDA/TA0.0 P1.7 ---> grey SD_CardAdapter SDI (MOSI)
-; P1.7/UCB0SOMI/UCB0SCL/TA1.0 <--- purple SD_CardAdapter SDO (MISO)
-; P2.2/UCB0CLK ---> orange SD_CardAdapter CLK (SCK)
-; P2.3/TA0.0/A6/CD10 <--- violin SD_CardAdapter CD (Card Detect)
-; P2.4/TA1.0/A7/CD11 ---> brown SD_CardAdapter CS (Card Select)
-
-
-
-; Clocks:
-; 24 MHz DCO intern
-
-; ----------------------------------------------------------------------
-; INIT order : LOCK I/O, WDT, GPIOs, FRAM, Clock, UARTs
-; ----------------------------------------------------------------------
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : LOCK I/O as high impedance state
-; ----------------------------------------------------------------------
-
- BIS #LOCKLPM5,&PM5CTL0 ; unlocked by WARM
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : WATCHDOG TIMER A
-; ----------------------------------------------------------------------
-
-; WDT code
- MOV #WDTPW+WDTHOLD+WDTCNTCL,&WDTCTL ; stop WDT
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : I/O
-; ----------------------------------------------------------------------
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION PAIN=PORT2:PORT1
-; ----------------------------------------------------------------------
-
-; reset state : Px{DIR,REN,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; Px{IN,OUT,IES} = ?
-
-; PORT1 usage
-
-; PORT2 usage
-
-Deep_RST_IN .equ P2IN ; TERMINAL TX pin as FORTH Deep_RST
-Deep_RST .equ 1 ; P2.0 = TX
-TERM_TXRX .equ 003h ; P2.1 = RX
-TERM_SEL .equ P2SEL1
-TERM_REN .equ P2REN
-
- .IFDEF TERMINALCTSRTS
-;configure P2.2 as RTS output high
-RTS .equ 4
-HANDSHAKOUT .equ P2OUT
-HANDSHAKIN .equ P2IN
- BIS.B #RTS,&HANDSHAKOUT
- .ENDIF
-
-; PORTx default wanted state : pins as input with pullup resistor
-
- MOV #-1,&PAOUT ; all pins 1
- BIS #-1,&PAREN ; all pins 1 with pull resistors
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : PORTJ
-; ----------------------------------------------------------------------
-
-; reset state : Px{DIR,REN,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; Px{IN,OUT,IES} = ?
-
-; PORTJ usage
-
-; PORTx default wanted state : pins as input with pullup resistor
-
- MOV.B #-1,&PJOUT ; pullup resistors
- BIS.B #-1,&PJREN ; enable pullup/pulldown resistors
-
-; ----------------------------------------------------------------------
-; FRAM config
-; ----------------------------------------------------------------------
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : CLOCK SYSTEM
-; ----------------------------------------------------------------------
-
-; DCOCLK: Internal digitally controlled oscillator (DCO).
-
- MOV.B #CSKEY,&CSCTL0_H ; Unlock CS registers
-
- .IF FREQUENCY = 0.5
-; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value)
- MOV #DIVA_0 + DIVS_16 + DIVM_16,&CSCTL3
- MOV #4,X
-
- .ELSEIF FREQUENCY = 1
-; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value)
- MOV #DIVA_0 + DIVS_8 + DIVM_8,&CSCTL3
- MOV #8,X
-
- .ELSEIF FREQUENCY = 2
-; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value)
- MOV #DIVA_0 + DIVS_4 + DIVM_4,&CSCTL3
- MOV #16,X
-
- .ELSEIF FREQUENCY = 4
-; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value)
- MOV #DIVA_0 + DIVS_2 + DIVM_2,&CSCTL3
- MOV #32,X
-
- .ELSEIF FREQUENCY = 8
-; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value)
- MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0
- MOV #64,X
-
- .ELSEIF FREQUENCY = 16
- MOV #DCORSEL,&CSCTL1 ; Set 16MHZ DCO setting
- MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0
- MOV #128,X
-
- .ELSEIF FREQUENCY = 24
- MOV #DCORSEL+DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 24 MHZ DCO setting
- MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0
- MOV #192,X
-
- .ELSEIF
- .error "bad frequency setting, only 0.5,1,2,4,8,16,24 MHz"
- .ENDIF
-
- .IFDEF LF_XTAL
- MOV #SELA_LFXCLK+SELS_DCOCLK+SELM_DCOCLK,&CSCTL2
- .ELSE
- MOV #SELA_VLOCLK+SELS_DCOCLK+SELM_DCOCLK,&CSCTL2
- .ENDIF
- MOV.B #01h, &CSCTL0_H ; Lock CS Registers
-
- BIS &SYSRSTIV,&SAVE_SYSRSTIV; store volatile SYSRSTIV preserving a pending request for DEEP_RST
- CMP #2,&SAVE_SYSRSTIV ; POWER ON ?
- JZ ClockWaitX ; yes
- .word 0759h ; no RRUM #2,X --> wait only 125 ms
-ClockWaitX MOV #41666,Y ; wait 0.5s before starting after POWER ON
-ClockWaitY SUB #1,Y ;
- JNZ ClockWaitY ; 41666x3 = 125000 cycles delay = 125ms @ 1MHz
- SUB #1,X ; x 4 @ 1 MHZ
- JNZ ClockWaitX ; time to stabilize power source ( 1s )
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : REF
-; ----------------------------------------------------------------------
-
- MOV #8, &REFCTL
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : RTC REGISTERS
-; ----------------------------------------------------------------------
-
- .IFDEF LF_XTAL
-; LF Xtal XIN : PJ.4, LF Xtal XOUT : PJ.5
- BIS.B #010h,&PJSEL0 ; SEL0 for only XIN
- BIC.B #RTCHOLD,&RTCCTL1 ; Clear RTCHOLD = start RTC_B
- .ENDIF
-
+++ /dev/null
-; -*- coding: utf-8 -*-
-; MY_MSP430FR5738_1.asm
-; config file for MY_MSP430FR5738 board
-;
-; Copyright (C) <2014> <J.M. THOORENS>
-;
-; This program is free software: you can redistribute it and/or modify
-; it under the terms of the GNU General Public License as published by
-; the Free Software Foundation, either version 3 of the License, or
-; (at your option) any later version.
-;
-; This program is distributed in the hope that it will be useful,
-; but WITHOUT ANY WARRANTY; without even the implied warranty of
-; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-; GNU General Public License for more details.
-;
-; You should have received a copy of the GNU General Public License
-; along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-
-; ======================================================================
-; MY_MSP430FR5738_1 BOARD
-; ======================================================================
-;
-; MSP430FR5738 XTAL 32768 Hz
-; 1 --- PJ.4 --- LFXIN
-; 2 --- PJ.5 --- LFXOUT
-;
-; MSP430FR5738 PROG 6PINS ISOLATOR
-; --- VCC <-> 2 "3v3" >--------> Vdd1 1 [| SI |] 8 Vdd2 <---< 3v3 )
-; 20 --- P2.1 <-- 6 "RX0" <---4k7--< A1 2 [| 86 |] 7 B1 <---- TXD \ UART2USB
-; 19 --- P2.0 <-> 1 "TX0" <--+-----> A2 3 [| 22 |] 6 B2 >---> RXD / PL2303TA
-; --- VSS <-> 5 "GND" <- | ----> Gnd1 4 [| EC |] 5 Gnd2 <---> GND )
-; 17 --- TEST --- 3 "TST" |
-; 18 --- RST --- 4 "RST" |
-; +-4k7-< DeepRST <-- GND
-
-; DIP1 AVcc -- ferrite bead -- DVcc
-; DIP2 AVss -- ferrite bead -- DVss
-; DIP3 GND
-; DIP4 P2.4/TA1.0/A7/CD11
-; DIP5 P2.3/TA0.0/A6/CD10
-; DIP6 P1.7/UCB0SOMI/UCB0SCL/TA1.0
-; DIP7 P1.6/UCB0SIMO/UCB0SDA/TA0.0
-; DIP8 P2.2/UCB0CLK
-; DIP9 P2.6
-; DIP10 P2.5/TB0.0
-; DIP11 PJ.3/TCK/CD9
-; DIP12 PJ.2/TMS/ACLK/CD8
-; DIP13 PJ.1/TDI/TCLK/MCLK/CD7
-; DIP14 PJ.0/TDO/TB0OUTH/SMCLK/CD6
-; DIP15 P1.5/TB0.2/UCA0CLK/A5/CD5
-; DIP16 P1.4/TB0.1/UCA0STE/A4/CD4
-; DIP17 P1.3/TA1.2/UCB0STE/A3/CD3
-; DIP18 P1.2/TA1.1/TA0CLK/CDOUT/A2/CD2
-; DIP19 P1.1/TA0.2/TA1CLK/CDOUT/A1/CD1/VeREF+
-; DIP20 P1.0/TA0.1/DMAE0/RTCCLK/A0/CD0/VeREF-
-
-
-; CPU OUTPUT WORLD
-; --- ------------
-; GND <-------+---0V0----------> 1 LCD_Vss
-; VCC <------ | --3V6-----+----> 2 LCD_Vdd
-; | |
-; ___ 470n ---
-; ^ ---
-; / \ 1N4148 |
-; --- |
-; 100n | 2k2 |
-; P1.5 >---||--+--^/\/\/v--+----> 3 LCD_Vo (0V6 without modulation)
-; P1.4 >------------------------> 4 LCD_RS
-; P1.3 >------------------------> 5 LCD_R/W
-; P1.2 >------------------------> 6 LCD_EN
-;
-; PJ.0 <------------------------> 11 LCD_DB4
-; PJ.1 <------------------------> 12 LCD_DB5
-; PJ.2 <------------------------> 13 LCD_DB5
-; PJ.3 <------------------------> 14 LCD_DB7
-;
-; P2.5 <------------------------< S2 LCD contrast +
-; P2.6 <------------------------< S1 LCD contrast -
-;
-; P1.1 >------------------------> SCL I2C MASTER
-; P1.0 >------------------------> SDA I2C MASTER | IR_RC5 receiver
-;
-;
-;
-; VCC DIP1 ---> red SD_CardAdapter VCC
-; GND DIP2 <--> black SD_CardAdapter GND
-; P1.6/UCB0SIMO/UCB0SDA/TA0.0 DIP7 ---> grey SD_CardAdapter SDI (MOSI)
-; P1.7/UCB0SOMI/UCB0SCL/TA1.0 DIP6 <--- purple SD_CardAdapter SDO (MISO)
-; P2.2/UCB0CLK DIP8 ---> orange SD_CardAdapter CLK (SCK)
-; P2.3/TA0.0/A6/CD10 DIP5 <--- violin SD_CardAdapter CD (Card Detect)
-; P2.4/TA1.0/A7/CD11 DIP4 ---> brown SD_CardAdapter CS (Card Select)
-
-; Clocks:
-; 24 MHz DCO intern
-
-; ----------------------------------------------------------------------
-; INIT order : LOCK I/O, WDT, GPIOs, FRAM, Clock, UARTs
-; ----------------------------------------------------------------------
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : LOCK I/O as high impedance state
-; ----------------------------------------------------------------------
-
- BIS #LOCKLPM5,&PM5CTL0 ; unlocked by WARM
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : WATCHDOG TIMER A
-; ----------------------------------------------------------------------
-
-; WDT code
- MOV #WDTPW+WDTHOLD+WDTCNTCL,&WDTCTL ; stop WDT
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : I/O
-; ----------------------------------------------------------------------
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION PAIN=PORT2:PORT1
-; ----------------------------------------------------------------------
-
-; reset state : Px{DIR,REN,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; Px{IN,OUT,IES} = ?
-
-; PORT1 usage
-
-; PORT2 usage
-
-Deep_RST_IN .equ P2IN ; TERMINAL TX pin as FORTH Deep_RST
-Deep_RST .equ 1 ; P2.0 = TX
-TERM_TXRX .equ 003h ; P2.1 = RX
-TERM_SEL .equ P2SEL1
-TERM_REN .equ P2REN
-
- .IFDEF TERMINALCTSRTS
-;configure P2.2 as RTS output high
-RTS .equ 4
-HANDSHAKOUT .equ P2OUT
-HANDSHAKIN .equ P2IN
- BIS.B #RTS,&HANDSHAKOUT
- .ENDIF
-
-; PORTx default wanted state : pins as input with pullup resistor
-
- MOV #-1,&PAOUT ; all pins 1
- BIS #-1,&PAREN ; all pins 1 with pull resistors
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : PORTJ
-; ----------------------------------------------------------------------
-
-; reset state : Px{DIR,REN,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; Px{IN,OUT,IES} = ?
-
-; PORTJ usage
-
-; PORTx default wanted state : pins as input with pullup resistor
-
- MOV.B #-1,&PJOUT ; pullup resistors
- BIS.B #-1,&PJREN ; enable pullup/pulldown resistors
-
-; ----------------------------------------------------------------------
-; FRAM config
-; ----------------------------------------------------------------------
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : CLOCK SYSTEM
-; ----------------------------------------------------------------------
-
-; DCOCLK: Internal digitally controlled oscillator (DCO).
-
- MOV.B #CSKEY,&CSCTL0_H ; Unlock CS registers
-
- .IF FREQUENCY = 0.5
-; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value)
- MOV #DIVA_0 + DIVS_16 + DIVM_16,&CSCTL3
- MOV #4,X
-
- .ELSEIF FREQUENCY = 1
-; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value)
- MOV #DIVA_0 + DIVS_8 + DIVM_8,&CSCTL3
- MOV #8,X
-
- .ELSEIF FREQUENCY = 2
-; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value)
- MOV #DIVA_0 + DIVS_4 + DIVM_4,&CSCTL3
- MOV #16,X
-
- .ELSEIF FREQUENCY = 4
-; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value)
- MOV #DIVA_0 + DIVS_2 + DIVM_2,&CSCTL3
- MOV #32,X
-
- .ELSEIF FREQUENCY = 8
-; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value)
- MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0
- MOV #64,X
-
- .ELSEIF FREQUENCY = 16
- MOV #DCORSEL,&CSCTL1 ; Set 16MHZ DCO setting
- MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0
- MOV #128,X
-
- .ELSEIF FREQUENCY = 24
- MOV #DCORSEL+DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 24 MHZ DCO setting
- MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0
- MOV #192,X
-
- .ELSEIF
- .error "bad frequency setting, only 0.5,1,2,4,8,16,24 MHz"
- .ENDIF
-
- .IFDEF LF_XTAL
- MOV #SELA_LFXCLK+SELS_DCOCLK+SELM_DCOCLK,&CSCTL2
- .ELSE
- MOV #SELA_VLOCLK+SELS_DCOCLK+SELM_DCOCLK,&CSCTL2
- .ENDIF
- MOV.B #01h, &CSCTL0_H ; Lock CS Registers
-
- BIS &SYSRSTIV,&SAVE_SYSRSTIV; store volatile SYSRSTIV preserving a pending request for DEEP_RST
- CMP #2,&SAVE_SYSRSTIV ; POWER ON ?
- JZ ClockWaitX ; yes
- .word 0759h ; no RRUM #2,X --> wait only 125 ms
-ClockWaitX MOV #41666,Y ; wait 0.5s before starting after POWER ON
-ClockWaitY SUB #1,Y ;
- JNZ ClockWaitY ; 41666x3 = 125000 cycles delay = 125ms @ 1MHz
- SUB #1,X ; x 4 @ 1 MHZ
- JNZ ClockWaitX ; time to stabilize power source ( 1s )
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : REF
-; ----------------------------------------------------------------------
-
- MOV #8, &REFCTL
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : RTC REGISTERS
-; ----------------------------------------------------------------------
-
- .IFDEF LF_XTAL
-; LF Xtal XIN : PJ.4, LF Xtal XOUT : PJ.5
- BIS.B #010h,&PJSEL0 ; SEL0 for only XIN
- BIC.B #RTCHOLD,&RTCCTL1 ; Clear RTCHOLD = start RTC_B
- .ENDIF
-
+++ /dev/null
-; -*- coding: utf-8 -*-
-; MY_MSP430FR5738_2.asm
-; config file for MY_MSP430FR5738 board
-;
-; Copyright (C) <2014> <J.M. THOORENS>
-;
-; This program is free software: you can redistribute it and/or modify
-; it under the terms of the GNU General Public License as published by
-; the Free Software Foundation, either version 3 of the License, or
-; (at your option) any later version.
-;
-; This program is distributed in the hope that it will be useful,
-; but WITHOUT ANY WARRANTY; without even the implied warranty of
-; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-; GNU General Public License for more details.
-;
-; You should have received a copy of the GNU General Public License
-; along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-
-; ======================================================================
-; MY_MSP430FR5738_2 BOARD
-; ======================================================================
-;
-; MSP430FR5738 XTAL 32768 Hz
-; 1 --- PJ.4 --- LFXIN
-; 2 --- PJ.5 --- LFXOUT
-;
-; MSP430FR5738 PROG 6PINS ISOLATOR
-; --- VCC <-> 2 "3v3" >--------> Vdd1 1 [| SI |] 8 Vdd2 <---< 3v3 )
-; 20 --- P2.1 <-- 6 "RX0" <---4k7--< A1 2 [| 86 |] 7 B1 <---- TXD \ UART2USB
-; 19 --- P2.0 <-> 1 "TX0" <--+-----> A2 3 [| 22 |] 6 B2 >---> RXD / PL2303TA
-; --- VSS <-> 5 "GND" <- | ----> Gnd1 4 [| EC |] 5 Gnd2 <---> GND )
-; 17 --- TEST --- 3 "TST" |
-; 18 --- RST --- 4 "RST" |
-; +-4k7-< DeepRST <-- GND
-
-; DIP1 AVcc -- ferrite bead -- DVcc
-; DIP2 AVss -- ferrite bead -- DVss
-; DIP3 P2.4/TA1.0/A7/CD11
-; DIP4 P2.3/TA0.0/A6/CD10
-; DIP5 P1.7/UCB0SOMI/UCB0SCL/TA1.0
-; DIP6 P1.6/UCB0SIMO/UCB0SDA/TA0.0
-; DIP7 P2.2/UCB0CLK
-; DIP8 P2.6
-; DIP9 P2.5/TB0.0
-; DIP10 GND
-; DIP11 PJ.3/TCK/CD9
-; DIP12 PJ.2/TMS/ACLK/CD8
-; DIP13 PJ.1/TDI/TCLK/MCLK/CD7
-; DIP14 PJ.0/TDO/TB0OUTH/SMCLK/CD6
-; DIP15 P1.5/TB0.2/UCA0CLK/A5/CD5
-; DIP16 P1.4/TB0.1/UCA0STE/A4/CD4
-; DIP17 P1.3/TA1.2/UCB0STE/A3/CD3
-; DIP18 P1.2/TA1.1/TA0CLK/CDOUT/A2/CD2
-; DIP19 P1.1/TA0.2/TA1CLK/CDOUT/A1/CD1/VeREF+
-; DIP20 P1.0/TA0.1/DMAE0/RTCCLK/A0/CD0/VeREF-
-
-
-; CPU OUTPUT WORLD
-; --- ------------
-; GND <-------+---0V0----------> 1 LCD_Vss
-; VCC <------ | --3V6-----+----> 2 LCD_Vdd
-; | |
-; ___ 470n ---
-; ^ ---
-; / \ 1N4148 |
-; --- |
-; 100n | 2k2 |
-; P1.5 >---||--+--^/\/\/v--+----> 3 LCD_Vo (0V6 without modulation)
-; P1.4 >------------------------> 4 LCD_RS
-; P1.3 >------------------------> 5 LCD_R/W
-; P1.2 >------------------------> 6 LCD_EN
-;
-; PJ.0 <------------------------> 11 LCD_DB4
-; PJ.1 <------------------------> 12 LCD_DB5
-; PJ.2 <------------------------> 13 LCD_DB5
-; PJ.3 <------------------------> 14 LCD_DB7
-;
-; P2.5 <------------------------< S2 LCD contrast +
-; P2.6 <------------------------< S1 LCD contrast -
-;
-; P1.1 >------------------------> SCL I2C MASTER
-; P1.0 >------------------------> SDA I2C MASTER | IR_RC5 receiver
-;
-;
-;
-; VCC DIP1 ---> red SD_CardAdapter VCC
-; GND DIP2 <--> black SD_CardAdapter GND
-; P2.4/TA1.0/A7/CD11 DIP3 ---> brown SD_CardAdapter CS (Card Select)
-; P2.3/TA0.0/A6/CD10 DIP4 <--- violin SD_CardAdapter CD (Card Detect)
-; P1.7/UCB0SOMI/UCB0SCL/TA1.0 DIP5 <--- purple SD_CardAdapter SDO (MISO)
-; P1.6/UCB0SIMO/UCB0SDA/TA0.0 DIP6 ---> grey SD_CardAdapter SDI (MOSI)
-; P2.2/UCB0CLK DIP7 ---> orange SD_CardAdapter CLK (SCK)
-
-
-; Clocks:
-; 24 MHz DCO intern
-
-; ----------------------------------------------------------------------
-; INIT order : LOCK I/O, WDT, GPIOs, FRAM, Clock, UARTs
-; ----------------------------------------------------------------------
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : LOCK I/O as high impedance state
-; ----------------------------------------------------------------------
-
- BIS #LOCKLPM5,&PM5CTL0 ; unlocked by WARM
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : WATCHDOG TIMER A
-; ----------------------------------------------------------------------
-
-; WDT code
- MOV #WDTPW+WDTHOLD+WDTCNTCL,&WDTCTL ; stop WDT
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : I/O
-; ----------------------------------------------------------------------
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION PAIN=PORT2:PORT1
-; ----------------------------------------------------------------------
-
-; reset state : Px{DIR,REN,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; Px{IN,OUT,IES} = ?
-
-; PORT1 usage
-
-; PORT2 usage
-
-Deep_RST_IN .equ P2IN ; TERMINAL TX pin as FORTH Deep_RST
-Deep_RST .equ 1 ; P2.0 = TX
-TERM_TXRX .equ 003h ; P2.1 = RX
-TERM_SEL .equ P2SEL1
-TERM_REN .equ P2REN
-
- .IFDEF TERMINALCTSRTS
-;configure P2.2 as RTS output high
-RTS .equ 4
-HANDSHAKOUT .equ P2OUT
-HANDSHAKIN .equ P2IN
- BIS.B #RTS,&HANDSHAKOUT
- .ENDIF
-
-; PORTx default wanted state : pins as input with pullup resistor
-
- MOV #-1,&PAOUT ; all pins 1
- BIS #-1,&PAREN ; all pins 1 with pull resistors
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : PORTJ
-; ----------------------------------------------------------------------
-
-; reset state : Px{DIR,REN,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; Px{IN,OUT,IES} = ?
-
-; PORTJ usage
-
-; PORTx default wanted state : pins as input with pullup resistor
-
- MOV.B #-1,&PJOUT ; pullup resistors
- BIS.B #-1,&PJREN ; enable pullup/pulldown resistors
-
-; ----------------------------------------------------------------------
-; FRAM config
-; ----------------------------------------------------------------------
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : CLOCK SYSTEM
-; ----------------------------------------------------------------------
-
-; DCOCLK: Internal digitally controlled oscillator (DCO).
-
- MOV.B #CSKEY,&CSCTL0_H ; Unlock CS registers
-
- .IF FREQUENCY = 0.5
-; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value)
- MOV #DIVA_0 + DIVS_16 + DIVM_16,&CSCTL3
- MOV #4,X
-
- .ELSEIF FREQUENCY = 1
-; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value)
- MOV #DIVA_0 + DIVS_8 + DIVM_8,&CSCTL3
- MOV #8,X
-
- .ELSEIF FREQUENCY = 2
-; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value)
- MOV #DIVA_0 + DIVS_4 + DIVM_4,&CSCTL3
- MOV #16,X
-
- .ELSEIF FREQUENCY = 4
-; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value)
- MOV #DIVA_0 + DIVS_2 + DIVM_2,&CSCTL3
- MOV #32,X
-
- .ELSEIF FREQUENCY = 8
-; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value)
- MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0
- MOV #64,X
-
- .ELSEIF FREQUENCY = 16
- MOV #DCORSEL,&CSCTL1 ; Set 16MHZ DCO setting
- MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0
- MOV #128,X
-
- .ELSEIF FREQUENCY = 24
- MOV #DCORSEL+DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 24 MHZ DCO setting
- MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0
- MOV #192,X
-
- .ELSEIF
- .error "bad frequency setting, only 0.5,1,2,4,8,16,24 MHz"
- .ENDIF
-
- .IFDEF LF_XTAL
- MOV #SELA_LFXCLK+SELS_DCOCLK+SELM_DCOCLK,&CSCTL2
- .ELSE
- MOV #SELA_VLOCLK+SELS_DCOCLK+SELM_DCOCLK,&CSCTL2
- .ENDIF
- MOV.B #01h, &CSCTL0_H ; Lock CS Registers
-
- BIS &SYSRSTIV,&SAVE_SYSRSTIV; store volatile SYSRSTIV preserving a pending request for DEEP_RST
- CMP #2,&SAVE_SYSRSTIV ; POWER ON ?
- JZ ClockWaitX ; yes
- .word 0759h ; no RRUM #2,X --> wait only 125 ms
-ClockWaitX MOV #41666,Y ; wait 0.5s before starting after POWER ON
-ClockWaitY SUB #1,Y ;
- JNZ ClockWaitY ; 41666x3 = 125000 cycles delay = 125ms @ 1MHz
- SUB #1,X ; x 4 @ 1 MHZ
- JNZ ClockWaitX ; time to stabilize power source ( 1s )
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : REF
-; ----------------------------------------------------------------------
-
- MOV #8, &REFCTL
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : RTC REGISTERS
-; ----------------------------------------------------------------------
-
- .IFDEF LF_XTAL
-; LF Xtal XIN : PJ.4, LF Xtal XOUT : PJ.5
- BIS.B #010h,&PJSEL0 ; SEL0 for only XIN
- BIC.B #RTCHOLD,&RTCCTL1 ; Clear RTCHOLD = start RTC_B
- .ENDIF
-
+++ /dev/null
-; -*- coding: utf-8 -*-
-; MY_MSP430FR5948.asm
-
-; Fast Forth For Texas Instrument MSP430FR5739
-;
-; Copyright (C) <2014> <J.M. THOORENS>
-;
-; This program is free software: you can redistribute it and/or modify
-; it under the terms of the GNU General Public License as published by
-; the Free Software Foundation, either version 3 of the License, or
-; (at your option) any later version.
-;
-; This program is distributed in the hope that it will be useful,
-; but WITHOUT ANY WARRANTY; without even the implied warranty of
-; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-; GNU General Public License for more details.
-;
-; You should have received a copy of the GNU General Public License
-; along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-; ======================================================================
-; MY_MSP430FR5948 : MSP430FR5948 TSSOP38 to DIP28 board MAP
-; may be remplaced by MSP430FR5939 TSSOP 38
-; with this first version, RX don't work via prog6pins when SI8622EC is present
-; ======================================================================
-
-; MSP430FR5948 XTAL 32768 Hz
-; 1 --- PJ.4 --- LFXIN
-; 2 --- PJ.5 --- LFXOUT
-
-; MSP430FR5948 PROG 6PINS ISOLATED UARTtoUSB bridge
-; --- VCC <-> 2 "3v3" --------> 1 Vdd1 <| SI |> Vdd2 8 <-- 3v3
-; 24 --- P2.1 <-- 6 "RX0" <----4k7- 2 A1 <| 86 |> B1 7 <-- TXD
-; 23 --- P2.0 <-> 1 "TX0" <--+----> 3 A2 <| 22 |> B2 6 --> RXD
-; --- VSS <-> 5 "GND" <- | ---> 4 Gnd1 <| EC |> Gnd2 5 <-- GND
-; 21 --- TEST --- 3 "TST" |
-; 22 --- RST --- 4 "RST" |
-; +-4k7- DeepRST <-- GND
-
-; MSP430FR5948 DIP28
-; 4,34 --- VCC --- 1 ; +
-; 3,33,38 --- VSS --- 2 ; -
-; 37 --- P2.4 --- 3 ; TA1.0/UCA1CLK/A7/C11
-; 36 --- P2.3 --- 4 ; TA0.0/UCA1STE/A6/C10
-; 5 ; GND
-; 31 --- P1.7 --- 6 ; TB0.4/UCB0SOMI/UCB0SCL/TA1.0
-; 30 --- P1.6 --- 7 ; TB0.3/UCB0SIMO/UCB0SDA/TA0.0
-; 29 --- P3.7 --- 8 ; TB0.6
-; 28 --- P3.6 --- 9 ; TB0.5
-; 27 --- P3.5 --- 10 ; TB0.4/COUT
-; 26 --- P3.4 --- 11 ; TB0.3/SMCLK
-; 20 --- P2.6 --- 12 ; TB0.1/UCA1RXD/UCA1SOMI
-; 25 --- P2.2 --- 13 ; TB0.2/UCB0CLK
-; 19 --- P2.5 --- 14 ; TB0.0/UCA1TXD/UCA1SIMO
-; 15 --- PJ.0 --- 15 ; TDO/TB0OUTH/SMCLK/SRSCG1/C6
-; 16 --- PJ.1 --- 16 ; TDI/TCLK/MCLK/SRSCG0/C7
-; 17 --- PJ.2 --- 17 ; TMS/ACLK/SROSCOFF/C8
-; 18 --- PJ.3 --- 18 ; TCK/SRCPUOFF/C9
-; 14 --- P1.5 --- 19 ; TB0.2/UCA0CLK/A5/C5
-; 13 --- P1.4 --- 20 ; TB0.1/UCA0STE/A4/C4
-; 12 --- P1.3 --- 21 ; TA1.2/UCB0STE/A3/C3
-; 10 --- P3.2 --- 22 ; A14/C14
-; 11 --- P3.3 --- 23 ; A15/C15
-; 9 --- P3.1 --- 24 ; A13/C13
-; 8 --- P3.0 --- 25 ; A12/C12
-; 5 --- P1.0 --- 26 ; TA0.1/DMAE0/RTCCLK/A0/C0/VREF-/VeREF-
-; 6 --- P1.1 --- 27 ; TA0.2/TA1CLK/COUT/A1/C1/VREF+/VeREF+
-; 7 --- P1.2 --- 28 ; TA1.1/TA0CLK/COUT/A2/C2
-
-
-; P1.0 - DIP.26
-; P1.1 - DIP.27
-; P1.2 - DIP.28 <------------------------> SDA I2C SOFTWARE MASTER
-; P1.3 - DIP.21 <------------------------> SCL I2C SOFTWARE MASTER
-; P1.4 - DIP.20
-; P1.5 - DIP.19
-; P1.6 - DIP.7 UCB0 SDA/SIMO <------------> SDA I2C MASTER/SLAVE
-; P1.7 - DIP.6 UCB0 SCL/SOMI <------------> SCL I2C MASTER/SLAVE
-;
-; SD_Card socket
-; VCC - -------------------------> VCC SD_CardAdapter
-; P2.2 - DIP.13 -------------------------> TB0.2 LCD_Vo
-; P2.3 - DIP.4 -------------------------> SD_CardAdapter CD (CardDetect)
-; P2.4 - DIP.3 UCA1/CLK ---------------> SD_CardAdapter SCK
-; P2.5 - DIP.14 UCA1/SIMO ---------------> SD_CardAdapter CMD/SDI (MOSI)
-; P2.6 - DIP.12 UCA1/SOMI <--------------- SD_CardAdapter DAT0/SDO (MISO)
-; P2.7 - -------------------------> SD_CardAdapter DAT3/CS (Card Select) (CD at power up)
-; VSS - <------------------------> GND SD_CardAdapter
-;
-;
-; P3.0 - DIP.25 -------------------------> 4 LCD_RS
-; P3.1 - DIP.24 -------------------------> 5 LCD_R/W
-; P3.2 - DIP.23 -------------------------> 6 LCD_EN
-; P3.3 - DIP.22 <------------------------- OUT IR_Receiver (1 TSOP32236)
-; P3.4 - DIP.11 -------------------------> sw1 (hard reset)
-; P3.5 - DIP.10 -------------------------> sw2
-; P3.6 - DIP.9
-; P3.7 - DIP.8
-;
-;
-; PJ.0 - DIP.15 <------------------------> 11 LCD_DB4
-; PJ.1 - DIP.16 <------------------------> 12 LCD_DB5
-; PJ.2 - DIP.17 <------------------------> 13 LCD_DB5
-; PJ.3 - DIP.18 <------------------------> 14 LCD_DB7
-;
-
-; Clocks:
-; 8 MHz DCO intern
-
-; ----------------------------------------------------------------------
-; INIT order : LOCK I/O, WDT, GPIOs, FRAM, Clock, UARTs
-; ----------------------------------------------------------------------
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : LOCK PMM_LOCKLPM5
-; ----------------------------------------------------------------------
-
-; BIS #LOCKLPM5,&PM5CTL0 ; unlocked by WARM
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : WATCHDOG TIMER A
-; ----------------------------------------------------------------------
-
- MOV #WDTPW+WDTHOLD+WDTCNTCL,&WDTCTL ; stop WDT
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : I/O
-; ----------------------------------------------------------------------
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : PORT1/2
-; ----------------------------------------------------------------------
-
-; reset state : Px{DIR,REN,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; Px{IN,OUT,IES} = ?
-
-; PORT1 usage
-
-; PORT2 usage
-
-Deep_RST_IN .equ P2IN ; TERMINAL TX pin as FORTH Deep_RST
-Deep_RST .equ 1 ; P2.0
-TERM_TXRX .equ 003h
-TERM_SEL .equ P2SEL1
-TERM_REN .equ P2REN
-
- .IFDEF TERMINALCTSRTS
- .error "CTS/RTS Control Flow not implemented"
- .ENDIF
-
-; PORTx default wanted state : pins as input with pullup resistor
-
- MOV #-1,&PAOUT ; OUT1
- BIS #-1,&PAREN ; REN1 all pullup resistors
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : PORT3/4
-; ----------------------------------------------------------------------
-
-; reset state : Px{DIR,REN,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; Px{IN,OUT,IES} = ?
-
-; PORT3 usage
-
-; PORT4 usage
-
-; PORTx default wanted state : pins as input with pullup resistor
-
- MOV #-1,&PBOUT ; pullup
- BIS #-1,&PBREN ; all pullup resistors
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : PORTJ
-; ----------------------------------------------------------------------
-
-; reset state : Px{DIR,REN,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; Px{IN,OUT,IES} = ?
-
-; PJ usage
-
-; PORTx default wanted state : pins as input with pullup resistor
-
- MOV.B #-1,&PJOUT ;
- BIS.B #-1,&PJREN ; pullup resistors on unused pins
-
-; ----------------------------------------------------------------------
-; FRAM config
-; ----------------------------------------------------------------------
-
- .IF FREQUENCY = 16
- MOV.B #0A5h, &FRCTL0_H ; enable FRCTL0 access
- MOV.B #10h, &FRCTL0 ; 1 waitstate @ 16 MHz
- MOV.B #01h, &FRCTL0_H ; disable FRCTL0 access
- .ENDIF
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : CLOCK SYSTEM
-; ----------------------------------------------------------------------
-
-; DCOCLK: Internal digitally controlled oscillator (DCO).
-; Startup clock system in max. DCO setting ~8MHz
-
-
-; CS code for MSP430FR5948
- MOV.B #CSKEY,&CSCTL0_H ; Unlock CS registers
-
- .IF FREQUENCY = 0.5
- MOV #0,&CSCTL1 ; Set 1MHZ DCO setting
- MOV #DIVA_2 + DIVS_2 + DIVM_2,&CSCTL3 ; set all dividers as 2
- MOV #4,X
-
- .ELSEIF FREQUENCY = 1
- MOV #0,&CSCTL1 ; Set 1MHZ DCO setting
- MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0
- MOV #8,X
-
- .ELSEIF FREQUENCY = 2
- MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 4MHZ DCO setting
- MOV #DIVA_0 + DIVS_2 + DIVM_2,&CSCTL3
- MOV #16,X
-
- .ELSEIF FREQUENCY = 4
- MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 4MHZ DCO setting
- MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0
- MOV #32,X
-
- .ELSEIF FREQUENCY = 8
-; MOV #DCOFSEL2+DCOFSEL1,&CSCTL1 ; Set 8MHZ DCO setting (default value)
- MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0
- MOV #64,X
-
- .ELSEIF FREQUENCY = 16
- MOV #DCORSEL+DCOFSEL2,&CSCTL1 ; Set 16MHZ DCO setting
- MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0
- MOV #128,X
-
- .ELSEIF
- .error "bad frequency setting, only 0.5,1,2,4,8,16 MHz"
- .ENDIF
-
- .IFDEF LF_XTAL
- MOV #SELA_LFXCLK+SELS_DCOCLK+SELM_DCOCLK,&CSCTL2
- .ELSE
- MOV #SELA_VLOCLK+SELS_DCOCLK+SELM_DCOCLK,&CSCTL2
- .ENDIF
- MOV.B #01h, &CSCTL0_H ; Lock CS Registers
-
- BIS &SYSRSTIV,&SAVE_SYSRSTIV; store volatile SYSRSTIV preserving a pending request for DEEP_RST
- CMP #2,&SAVE_SYSRSTIV ; POWER ON ?
- JZ ClockWaitX ; yes
- .word 0759h ; no RRUM #2,X --> wait only 125 ms
-ClockWaitX MOV #41666,Y ; wait 0.5s before starting after POWER ON
-ClockWaitY SUB #1,Y ;
- JNZ ClockWaitY ; 41666x3 = 125000 cycles delay = 125ms @ 1MHz
- SUB #1,X ; x 4 @ 1 MHZ
- JNZ ClockWaitX ; time to stabilize power source ( 1s )
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : REF
-; ----------------------------------------------------------------------
-
- MOV #8, &REFCTL
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : RTC REGISTERS
-; ----------------------------------------------------------------------
-
- .IFDEF LF_XTAL
-; LF Xtal XIN : PJ.4, LF Xtal XOUT : PJ.5
- BIS.B #010h,&PJSEL0 ; SEL0 for only XIN
- BIC.B #RTCHOLD,&RTCCTL1 ; Clear RTCHOLD = start RTC_B
- .ENDIF
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : SYS REGISTERS
-; ----------------------------------------------------------------------
-
-
-; SYS code
-; see COLD word
+++ /dev/null
-; -*- coding: utf-8 -*-
-; MY_MSP430FR5948.asm
-
-; Fast Forth For Texas Instrument MSP430FR5739
-;
-; Copyright (C) <2014> <J.M. THOORENS>
-;
-; This program is free software: you can redistribute it and/or modify
-; it under the terms of the GNU General Public License as published by
-; the Free Software Foundation, either version 3 of the License, or
-; (at your option) any later version.
-;
-; This program is distributed in the hope that it will be useful,
-; but WITHOUT ANY WARRANTY; without even the implied warranty of
-; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-; GNU General Public License for more details.
-;
-; You should have received a copy of the GNU General Public License
-; along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-; ======================================================================
-; MY_MSP430FR5948_1 : MSP430FR5948 TSSOP38 to DIP28 board MAP
-; may be remplaced by MSP430FR5939 TSSOP 38
-; Version 1 : added a 4k7 resistor on RX signal between Si8622EC and PROG6PINS
-; SD_CS and SD_CD are inverted
-; ======================================================================
-;
-; MSP430FR5948 XTAL 32768 Hz
-; 1 --- PJ.4 --- LFXIN
-; 2 --- PJ.5 --- LFXOUT
-;
-; MSP430FR5948 PROG 6PINS ISOLATED UARTtoUSB bridge
-; 34 --- DVCC <-> 2 "3v3" --------> 1 Vdd1 <| SI |> Vdd2 8 <-- 3v3
-; 24 --- P2.1 <-- 6 "RX0" <----4k7- 2 A1 <| 86 |> B1 7 <-- TXD
-; 23 --- P2.0 <-> 1 "TX0" <--+----> 3 A2 <| 22 |> B2 6 --> RXD
-; 33 --- DVSS <-> 5 "GND" <- | ---> 4 Gnd1 <| EC |> Gnd2 5 <-- GND
-; 21 --- TEST --- 3 "TST" |
-; 22 --- RST --- 4 "RST" |
-; +-4k7- DeepRST <-- GND
-;
-;
-; DIP28 1 --- 4 AVCC --- ferrite bead --- DVCC 34
-; DIP28 2 --- 3 AVSS --- ferrite bead --- DVSS 33
-;
-; MSP430FR5948 DIP28
-; 4, --- AVCC --- 1 ; +
-; 3,38 --- AVSS --- 2 ; -
-; 3 ; GND
-; 37 --- P2.4 --- 4 ; TA1.0/UCA1CLK/A7/C11
-; 36 --- P2.3 --- 5 ; TA0.0/UCA1STE/A6/C10
-; 30 --- P1.6 --- 6 ; TB0.3/UCB0SIMO/UCB0SDA/TA0.0
-; 31 --- P1.7 --- 7 ; TB0.4/UCB0SOMI/UCB0SCL/TA1.0
-; 29 --- P3.7 --- 8 ; TB0.6
-; 28 --- P3.6 --- 9 ; TB0.5
-; 27 --- P3.5 --- 10 ; TB0.4/COUT
-; 26 --- P3.4 --- 11 ; TB0.3/SMCLK
-; 20 --- P2.6 --- 12 ; TB0.1/UCA1RXD/UCA1SOMI
-; 25 --- P2.2 --- 13 ; TB0.2/UCB0CLK
-; 19 --- P2.5 --- 14 ; TB0.0/UCA1TXD/UCA1SIMO
-; 15 --- PJ.0 --- 15 ; TDO/TB0OUTH/SMCLK/SRSCG1/C6
-; 16 --- PJ.1 --- 16 ; TDI/TCLK/MCLK/SRSCG0/C7
-; 17 --- PJ.2 --- 17 ; TMS/ACLK/SROSCOFF/C8
-; 18 --- PJ.3 --- 18 ; TCK/SRCPUOFF/C9
-; 14 --- P1.5 --- 19 ; TB0.2/UCA0CLK/A5/C5
-; 13 --- P1.4 --- 20 ; TB0.1/UCA0STE/A4/C4
-; 12 --- P1.3 --- 21 ; TA1.2/UCB0STE/A3/C3
-; 10 --- P3.2 --- 22 ; A14/C14
-; 11 --- P3.3 --- 23 ; A15/C15
-; 9 --- P3.1 --- 24 ; A13/C13
-; 8 --- P3.0 --- 25 ; A12/C12
-; 5 --- P1.0 --- 26 ; TA0.1/DMAE0/RTCCLK/A0/C0/VREF-/VeREF-
-; 6 --- P1.1 --- 27 ; TA0.2/TA1CLK/COUT/A1/C1/VREF+/VeREF+
-; 7 --- P1.2 --- 28 ; TA1.1/TA0CLK/COUT/A2/C2
-;
-;
-; P1.0 - DIP.26
-; P1.1 - DIP.27
-; P1.2 - DIP.28 <------------------------> SDA I2C SOFTWARE MASTER
-; P1.3 - DIP.21 <------------------------> SCL I2C SOFTWARE MASTER
-; P1.4 - DIP.20
-; P1.5 - DIP.19
-; P1.6 - DIP.6 UCB0 SDA/SIMO <------------> SDA I2C MASTER/SLAVE
-; P1.7 - DIP.7 UCB0 SCL/SOMI <------------> SCL I2C MASTER/SLAVE
-;
-; SD_Card socket
-; VCC - -------------------------> VCC SD_CardAdapter
-; P2.2 - DIP.13 -------------------------> TB0.2 LCD_Vo
-; P2.3 - DIP.5 -------------------------> SD_CardAdapter DAT3/CS (Card Select) (CD at power up)
-; P2.4 - DIP.4 UCA1/CLK ---------------> SD_CardAdapter SCK
-; P2.5 - DIP.14 UCA1/SIMO ---------------> SD_CardAdapter CMD/SDI (MOSI)
-; P2.6 - DIP.12 UCA1/SOMI <--------------- SD_CardAdapter DAT0/SDO (MISO)
-; P2.7 - -------------------------> SD_CardAdapter CD (CardDetect)
-; VSS - <------------------------> GND SD_CardAdapter
-;
-;
-; P3.0 - DIP.25 -------------------------> 4 LCD_RS
-; P3.1 - DIP.24 -------------------------> 5 LCD_R/W
-; P3.2 - DIP.23 -------------------------> 6 LCD_EN
-; P3.3 - DIP.22 <------------------------- OUT IR_Receiver (1 TSOP32236)
-; P3.4 - DIP.11 -------------------------> sw1 (hard reset)
-; P3.5 - DIP.10 -------------------------> sw2
-; P3.6 - DIP.9
-; P3.7 - DIP.8
-;
-;
-; PJ.0 - DIP.15 <------------------------> 11 LCD_DB4
-; PJ.1 - DIP.16 <------------------------> 12 LCD_DB5
-; PJ.2 - DIP.17 <------------------------> 13 LCD_DB5
-; PJ.3 - DIP.18 <------------------------> 14 LCD_DB7
-
-; Clocks:
-; 8 MHz DCO intern
-
-; ----------------------------------------------------------------------
-; INIT order : LOCK I/O, WDT, GPIOs, FRAM, Clock, UARTs
-; ----------------------------------------------------------------------
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : LOCK PMM_LOCKLPM5
-; ----------------------------------------------------------------------
-
-; BIS #LOCKLPM5,&PM5CTL0 ; unlocked by WARM
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : WATCHDOG TIMER A
-; ----------------------------------------------------------------------
-
- MOV #WDTPW+WDTHOLD+WDTCNTCL,&WDTCTL ; stop WDT
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : I/O
-; ----------------------------------------------------------------------
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : PORT1/2
-; ----------------------------------------------------------------------
-
-; reset state : Px{DIR,REN,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; Px{IN,OUT,IES} = ?
-
-; PORT1 usage
-
-; PORT2 usage
-
-Deep_RST_IN .equ P2IN ; TERMINAL TX pin as FORTH Deep_RST
-Deep_RST .equ 1 ; P2.0
-TERM_TXRX .equ 003h
-TERM_SEL .equ P2SEL1
-TERM_REN .equ P2REN
-
- .IFDEF TERMINALCTSRTS
- .error "CTS/RTS Control Flow not implemented"
- .ENDIF
-
-; PORTx default wanted state : pins as input with pullup resistor
-
- MOV #-1,&PAOUT ; OUT1
- BIS #-1,&PAREN ; REN1 all pullup resistors
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : PORT3/4
-; ----------------------------------------------------------------------
-
-; reset state : Px{DIR,REN,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; Px{IN,OUT,IES} = ?
-
-; PORT3 usage
-
-; PORT4 usage
-
-; PORTx default wanted state : pins as input with pullup resistor
-
- MOV #-1,&PBOUT ; pullup
- BIS #-1,&PBREN ; all pullup resistors
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : PORTJ
-; ----------------------------------------------------------------------
-
-; reset state : Px{DIR,REN,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; Px{IN,OUT,IES} = ?
-
-; PJ usage
-
-; PORTx default wanted state : pins as input with pullup resistor
-
- MOV.B #-1,&PJOUT ;
- BIS.B #-1,&PJREN ; pullup resistors on unused pins
-
-; ----------------------------------------------------------------------
-; FRAM config
-; ----------------------------------------------------------------------
-
- .IF FREQUENCY = 16
- MOV.B #0A5h, &FRCTL0_H ; enable FRCTL0 access
- MOV.B #10h, &FRCTL0 ; 1 waitstate @ 16 MHz
- MOV.B #01h, &FRCTL0_H ; disable FRCTL0 access
- .ENDIF
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : CLOCK SYSTEM
-; ----------------------------------------------------------------------
-
-; DCOCLK: Internal digitally controlled oscillator (DCO).
-; Startup clock system in max. DCO setting ~8MHz
-
-
-; CS code for MSP430FR5948
- MOV.B #CSKEY,&CSCTL0_H ; Unlock CS registers
-
- .IF FREQUENCY = 0.5
- MOV #0,&CSCTL1 ; Set 1MHZ DCO setting
- MOV #DIVA_2 + DIVS_2 + DIVM_2,&CSCTL3 ; set all dividers as 2
- MOV #4,X
-
- .ELSEIF FREQUENCY = 1
- MOV #0,&CSCTL1 ; Set 1MHZ DCO setting
- MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0
- MOV #8,X
-
- .ELSEIF FREQUENCY = 2
- MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 4MHZ DCO setting
- MOV #DIVA_0 + DIVS_2 + DIVM_2,&CSCTL3
- MOV #16,X
-
- .ELSEIF FREQUENCY = 4
- MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 4MHZ DCO setting
- MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0
- MOV #32,X
-
- .ELSEIF FREQUENCY = 8
-; MOV #DCOFSEL2+DCOFSEL1,&CSCTL1 ; Set 8MHZ DCO setting (default value)
- MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0
- MOV #64,X
-
- .ELSEIF FREQUENCY = 16
- MOV #DCORSEL+DCOFSEL2,&CSCTL1 ; Set 16MHZ DCO setting
- MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0
- MOV #128,X
-
- .ELSEIF
- .error "bad frequency setting, only 0.5,1,2,4,8,16 MHz"
- .ENDIF
-
- .IFDEF LF_XTAL
- MOV #SELA_LFXCLK+SELS_DCOCLK+SELM_DCOCLK,&CSCTL2
- .ELSE
- MOV #SELA_VLOCLK+SELS_DCOCLK+SELM_DCOCLK,&CSCTL2
- .ENDIF
- MOV.B #01h, &CSCTL0_H ; Lock CS Registers
-
- BIS &SYSRSTIV,&SAVE_SYSRSTIV; store volatile SYSRSTIV preserving a pending request for DEEP_RST
- CMP #2,&SAVE_SYSRSTIV ; POWER ON ?
- JZ ClockWaitX ; yes
- .word 0759h ; no RRUM #2,X --> wait only 125 ms
-ClockWaitX MOV #41666,Y ; wait 0.5s before starting after POWER ON
-ClockWaitY SUB #1,Y ;
- JNZ ClockWaitY ; 41666x3 = 125000 cycles delay = 125ms @ 1MHz
- SUB #1,X ; x 4 @ 1 MHZ
- JNZ ClockWaitX ; time to stabilize power source ( 1s )
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : REF
-; ----------------------------------------------------------------------
-
- MOV #8, &REFCTL
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : RTC REGISTERS
-; ----------------------------------------------------------------------
-
- .IFDEF LF_XTAL
-; LF Xtal XIN : PJ.4, LF Xtal XOUT : PJ.5
- BIS.B #010h,&PJSEL0 ; SEL0 for only XIN
- BIC.B #RTCHOLD,&RTCCTL1 ; Clear RTCHOLD = start RTC_B
- .ENDIF
-
-; ----------------------------------------------------------------------
-; POWER ON RESET AND INITIALIZATION : SYS REGISTERS
-; ----------------------------------------------------------------------
-
-
-; SYS code
-; see COLD word
With a load, read,create, write, delete SD_CARD files driver, + source files direct copy from PC to SD_Card, its size is still < 9Kb.
It works with all SD CARD memories from 64MB to 64GB. Count 14/11 clock cycles to read/write a byte, with SPI_CLK = MCLK...
-This enables to make a fast data logger with a small footprint as a MSP430FR5738 QFN24.
+This enables to make a fast data logger with a small footprint as a MSP430FR5738 QFN24. To compare with a LPC800 ARM entry-level...
Tested on MSP-EXP430{FR5969,FR5994,FR6989,FR4133} launchpads and CHIPSTICKFR2433, at 0.5, 1, 2, 4, 8, 16 MHz,
and 24MHz on a MSP430FR5738 module.
which ensures its compatibility with the FORTH CORE ANS94 standard.
For MSP430FR4133 choose COMPSMPY.f, COMPHMPY.f for all others.
- Notice that FAST FORTH interprets only SPACE as delimiter (not TAB), BACKSPACE, and CR+LF as end of line.
+ Notice that FAST FORTH interprets lines up to 80 chars, only SPACE as delimiter, only CR+LF as EOL, and BACKSPACE.
And that memory access is limited to 64 kbytes. You can always create FORTH words to access data beyond this limit...
Finally, using the SCITE editor as IDE, you can do everything from its "tools" menu.
What is new ?
-------------
+ V162.
+
+ Added a set of words to enable conditional interpretation/compilation : MARKER [DEFINED] [UNDEFINED] [IF] [ELSE] [THEN]
+ A MARKER word ( defined as {word} to well see it) allows you to wipe some program even if loaded in memory below RST_STATE boundary.
+ see conditional compilation source files in the new subfolder MSP430_COND.
+
+ All interpretation / compilation errors now execute PWR_STATE, so any incorrect definition will be automatically erased,
+ as well as its source file, if any.
+
+ Added a bootloader option which loads BOOT.4TH from SD_Card memory when the cause of reset in SYSRSTIV register is <> 0 (<> WARM).
+ When you download FAST FORTH (SYSRSTIV = 15), and if a sd_card memory is present, BOOT.4TH will load SD_TOOLS.4TH.
+ You can of course modify BOOT.4TH according to your convenience!
+
V161.
SD_Card driver works also with software multiplier (with MSP430FR4133)
Content
-------
-With a size about 5.5 kb (enhanced version with vocabularies 16 threads), Fast Forth contains 116 words:
-
- ASM CODE HI2LO ASSEMBLER COLD WARM (WARM) WIPE
- RST_HERE RST_STATE PWR_HERE PWR_STATE MOVE LEAVE +LOOP LOOP
- DO REPEAT WHILE AGAIN UNTIL BEGIN THEN ELSE
- IF POSTPONE ['] IS IMMEDIATE ; : RECURSE
- ] [ DEFER DOES> CREATE CONSTANT VARIABLE \
- ' ABORT" ABORT QUIT EVALUATE COUNT LITERAL ,
- EXECUTE >NUMBER FIND WORD ." S" TYPE SPACES
- SPACE CR (CR) NOECHO ECHO EMIT (EMIT) (ACCEPT)
- ACCEPT KEY (KEY) C, ALLOT HERE . D.
- U. UD. SIGN HOLD #> #S # <#
- BL STATE BASE >IN J I UNLOOP U<
- > < = 0< 0= ABS NEGATE XOR
- OR AND - + C! C@ ! @
- DEPTH R@ R> >R ROT OVER SWAP DROP
- ?DUP DUP LIT EXIT
+With a size < 6 kb (enhanced version with 16 threads vocabularies), Fast Forth contains 119 words:
+
+ ASM CODE HI2LO COLD WARM (WARM) WIPE RST_HERE
+ RST_STATE PWR_HERE PWR_STATE MOVE LEAVE +LOOP LOOP DO
+ REPEAT WHILE AGAIN UNTIL BEGIN THEN ELSE IF
+ POSTPONE RECURSE IMMEDIATE ; : DEFER DOES> CREATE
+ CONSTANT VARIABLE IS ['] ] [ \ '
+ ABORT" ABORT QUIT EVALUATE COUNT LITERAL , EXECUTE
+ >NUMBER FIND WORD ." S" TYPE SPACES SPACE
+ CR (CR) NOECHO ECHO EMIT (EMIT) (ACCEPT) ACCEPT
+ KEY (KEY) C, ALLOT HERE . D. U.
+ SIGN HOLD #> #S # <# BL STATE
+ BASE >IN TIB PAD J I UNLOOP U<
+ > < = 0> 0< 0= DABS ABS
+ NEGATE XOR OR AND - + C! C@
+ ! @ DEPTH R@ R> >R ROT OVER
+ SWAP NIP DROP ?DUP DUP LIT EXIT
...size that includes its embedded assembler of 71 words:
[CHAR] CHAR CELL+ CELLS CHAR+ CHARS ALIGN ALIGNED
2OVER 2SWAP 2DROP 2DUP 2! 2@ */ */MOD
MOD / /MOD * FM/MOD SM/REM UM/MOD M*
- UM* S>D NIP 2/ 2* MIN MAX 1-
- 1+ RSHIFT LSHIFT INVERT
+ UM* S>D 2/ 2* MIN MAX 1- 1+
+ RSHIFT LSHIFT INVERT
external SD\_TOOLS ADD-ON in SD\_TOOLS.f adds:
assemble (CTRL+0). A window asks you for 4 parameters:
-set device as first param, i.e. MSP430FR5969,
-
-set your target as 2th param, i.e. MSP_EXP430fr5969,
+set device as first param, i.e. MSP_EXP430FR5969,
-then execute. the output is a target.txt file.
+then execute. the output is a target.txt file, i.e. MSP_EXP430FR5969.txt
Send a source file to the FAST FORH target
------------------
-Two .bat files are done in the folder \MSP430-FORTH that enable you to send any source file to any target.
+Three .bat files are done in folders \MSP430-FORTH and \CONDCOMP that enable you to do all you want.
+Double clic on them to see how to do.
-See how to in the file \MSP430-FORTH\send\_source\_file\_to\_target\_readme.txt. Or double click on .bat file
-
-you can also open any source file with scite, and do all via menu Tools.
+you can also open any source file with scite editor, and do all you want via its Tools menu.
SD_Card Load, Read, Write and Delete
HowTo change DIRectory
---------------
- READ" \misc". \misc becomes the current folder.
- READ" ..\" parent folder becomes the current folder.
- READ" \" Root becomes the current folder.
+ LOAD" \misc". \misc becomes the current folder.
+ LOAD" ..\" parent folder becomes the current folder.
+ LOAD" \" Root becomes the current folder.
Drive letters are always ignored.
Downloading source file to SD_Card
------------------------------------------
-to download a file.f/file.4th onto SD_CARD, use Send_file.f_to_SD_CARD_targe.bat/Send_file.4th_to_SD_CARD_targe.bat.
-any file.f will be preprocessed by gema before sending to SD_CARD as file.4th.
-
+to download a source file (.f or .4th) onto SD_CARD target, use CopySourceFileToTarget_SD_Card.bat.
+or use scite.
Double click on one of this bat files to see how to do.
=====
Management of vocabularies (not ANSI). VOCABULARY, DEFINITIONS, ONLY, ALSO, PREVIOUS, CONTEXT, CURRENT, FORTH, ASSEMBLER.
-In fact, it's the operation of the assembler that requires the vocabularies management.
+In fact, it's the the assembler that requires the vocabularies management.
Recognizing prefixed numbers %101011 (bin), $00FE (hex) and #220 (decimal).
case 1.1 : when you type PWR_STATE ==> the program beyond PWR_HERE is lost.
+ case 1.2 : If an error message (reverse video) occurs, PWR_STATE is automatically executed and the program beyond PWR_HERE is lost.
+ In this way, any compilation error is followed by the complete erasure of the uncompleted word,
+ or by that of the downloading source file causing this error.
+ So, it is recommended to finish a source file with at least PWR_HERE to protect it against any subsequent error.
+
case 2 : <reset> ==> performs reset and the program beyond RST_HERE is lost.
if ECHO is on, the WARM display is preceded by the SYSRSTIV value "4", else no display.
case 4.2 : writing -1 in SAVE_SYSRSTIV before COLD = software DEEP_RST ===> same effects
The WARM display is preceded by "-1".
+ case 5 : after FAST FORTH core compilation, the WARM displays SAVE_SYSRSTIV = 15. User may use this information before WARM occurs.
+
If SD\_CARD extention and SD\_CARD memory with \BOOT.4TH included, the cases 1 to 4 start it after displaying of WARM message.
statusbar.text.1=\
li=$(LineNumber) co=$(ColumnNumber) $(OverType) ($(EOLMode)) $(FileAttr)
statusbar.text.2=\
-$(BufferLength) chars in $(NbOfLines) lines. Sel: $(SelLength) chars.
+$(BufferLength) chars in $(NbOfLines) lines. Sel: $(SelHeight) lines, $(SelLength) chars.
statusbar.text.3=\
Now is: Date=$(CurrentDate) Time=$(CurrentTime)
statusbar.text.4=\
# to the types of files seen when opening.
# There is a limit (possibly 256 characters) to the length of a filter,
# so not all source extensions can be in this setting.
-#*.idl;*.odl;*.rc;*.rc2;*.dlg;*.def;make*;*.mak;\
-#*.frm;*.cls;*.ctl;;*.pl;;*.iface;*.e;#*.rb;*.cgi;*.lua;\
-#source.files=*.asm;*.c;*.cc;*.f;*.ff;*.far;*.cpp;*.cxx;*.cs;*.h;*.hh;*.hxx;*.hpp;\
-source.files=*.asm;*.avr;*.tiny;*.mega;*.vb;*.vbs;*.bas;*.bat;*.ini;*.py;*.js;*.properties;*.vhd;*.vhdl
+source.files=*.asm;*.inc;*.pat;*.f;*.4th;*.bat
# Each platform has a different idea of the most important filters
if PLAT_WIN
all.files=All Files (*.*)|*.*|
- top.filters=All Source|$(source.files)|$(all.files)
+ top.filters=$(all.files)All Source|$(source.files)|
if PLAT_GTK
all.files=All Files (*)|*|Hidden Files (.*)|.*|
top.filters=All Source|$(source.files)|$(all.files)
.ENDIF ; CHIPSTICK_FR2433
+ .IFDEF MY_MSP430FR5738
+ .warning "Code for MY_MSP430FR5738"
+DEVICE = "MSP430FR5738"
+;CHIP .equ 5738
+LF_XTAL
+UCA0_UART
+UCB0_SD
+ .include "MSP430FR57xx.inc"
+ .ENDIF ; MY_MSP430FR5738
+
+ .IFDEF MY_MSP430FR5734
+ .warning "Code for MY_MSP430FR5734"
+DEVICE = "MSP430FR5734"
+;CHIP .equ 5734
+UCA0_UART
+ .include "MSP430FR57xx.inc"
+ .ENDIF ; MY_MSP430FR5734_1
+
+ .IFDEF MY_MSP430FR5738_1
+ .warning "Code for MY_MSP430FR5738_1"
+DEVICE = "MSP430FR5738"
+;CHIP .equ 5738
+LF_XTAL
+UCA0_UART
+UCB0_SD
+ .include "MSP430FR57xx.inc"
+ .ENDIF ; MY_MSP430FR5738_1
+
+ .IFDEF MY_MSP430FR5948
+ .warning "Code for MY_MSP430FR5948"
+DEVICE = "MSP430FR5948"
+;CHIP .equ 5948
+UCA0_UART
+UCA1_SD
+ .include "MSP430FR5x6x.inc"
+ .ENDIF ; MY_MSP430FR5948
+
+ .IFDEF MY_MSP430FR5948_1
+ .warning "Code for MY_MSP430FR5948_1"
+DEVICE = "MSP430FR5948"
+;CHIP .equ 5948
+LF_XTAL
+UCA0_UART
+UCA1_SD
+ .include "MSP430FR5x6x.inc"
+ .ENDIF ; MY_MSP430FR5948_1
+
+ .IFDEF JMJ_BOX
+ .warning "Code for JMJ_BOX"
+DEVICE = "MSP430FR5738"
+;CHIP .equ 5738
+UCA0_UART
+ .include "MSP430FR57xx.inc"
+ .ENDIF ; JMJ_BOX
+
+ .IFDEF PA8_PA_MSP430
+ .warning "Code for PA8_PA_MSP430"
+DEVICE = "MSP430FR5738"
+;CHIP .equ 5738
+UCA0_UART
+ .include "MSP430FR57xx.inc"
+ .ENDIF ; PA8_PA_MSP430
+
+ .IFDEF PA_PA_MSP430
+ .warning "Code for PA_PA_MSP430"
+DEVICE = "MSP430FR5738"
+;CHIP .equ 5738
+UCA0_UART
+ .include "MSP430FR57xx.inc"
+ .ENDIF ; PA_PA_MSP430
+
+ .IFDEF PA_Core_MSP430
+ .warning "Code for PA_Core_MSP430"
+DEVICE = "MSP430FR5948"
+;CHIP .equ 5948
+LF_XTAL
+UCA0_UART
+ .include "MSP430FR5x6x.inc"
+ .ENDIF ; PA_Core_MSP430
+
.IF (charfromstr(DEVICE,8) = '5') & (charfromstr(DEVICE,9) = '7')
RAM_1K
.ENDIF
\ No newline at end of file
.IFDEF CHIPSTICK_FR2433
.include "CHIPSTICK_FR2433.asm"
.ENDIF
+ .IFDEF MY_MSP430FR5734
+ .include "MSP430FR5738.asm"
+ .ENDIF
+ .IFDEF MY_MSP430FR5738
+ .include "MSP430FR5738.asm"
+ .ENDIF
+ .IFDEF MY_MSP430FR5738_1
+ .include "MSP430FR5738.asm"
+ .ENDIF
+ .IFDEF MY_MSP430FR5738_2
+ .include "MSP430FR5738.asm"
+ .ENDIF
+ .IFDEF MY_MSP430FR5948
+ .include "MSP430FR5948.asm"
+ .ENDIF
+ .IFDEF MY_MSP430FR5948_1
+ .include "MSP430FR5948.asm"
+ .ENDIF
+ .IFDEF JMJ_BOX
+ .include "MSP430FR5738.asm"
+ .ENDIF
+ .IFDEF PA8_PA_MSP430
+ .include "MSP430FR5738.asm"
+ .ENDIF
+ .IFDEF PA_PA_MSP430
+ .include "MSP430FR5738.asm"
+ .ENDIF
+ .IFDEF PA_Core_MSP430
+ .include "MSP430FR5948.asm"
+ .ENDIF
--- /dev/null
+[BG]
+; Use Eterm look-feel Background extension (on/off)
+BGEnable=on
+
+; Use AlphaBlend API (on/off)
+BGUseAlphaBlendAPI=on
+
+; Susie plugin path
+BGSPIPath=plugin
+
+; Fast window sizing/moving
+BGFastSizeMove=on
+
+; Flickerless window moving
+BGFlickerlessMove=on
+
+; If HideTitle=on and BGNoFrame=on, use window without frame
+; you can resize window with Alt + Shift + LeftDrag
+BGNoFrame=on
+
+; wildcard => random select
+BGThemeFile=theme\*.INI
+
+
+[Tera Term]
+; Tera Term version number
+Version=2.3
+
+; Language (English/Japanese/Russian/Korean/UTF-8)
+Language=English
+
+; User interface language file that includes message strings.
+; Tera Term uses built-in English message when the file or message is not found.
+UILanguageFile=lang\French.lng
+
+; Connecting timeout value(per seconds). No action if the value is zero.
+; Connecting socket could be canceled after the value timeout if the value is greater than zero.
+; The default value is zero(depends on Windows TCP/IP stack implementation).
+ConnectingTimeout=0
+
+; pasting string by clicking mouse right button disabled
+DisablePasteMouseRButton=off
+
+; pasting string by clicking mouse middle button disabled
+DisablePasteMouseMButton=on
+
+; confirm pasting string by clicking mouse right button
+ConfirmPasteMouseRButton=off
+
+; confirm changing clipboard string by clicking mouse right button
+ConfirmChangePaste=on
+ConfirmChangePasteCR=on
+PasteDialogSize=330,220
+ConfirmChangePasteStringFile=
+
+; Scroll out the current buffer when the clear screen does.
+ScrollWindowClearScreen=on
+
+; Reset scrollback on display activity
+AutoScrollOnlyInBottomLine=on
+
+; Starting the selection only by a left button.
+SelectOnlyByLButton=on
+
+; New connection by Alt-N Accelerator key
+AcceleratorNewConnection=on
+
+; Duplicate session by Alt-D Accelerator key disabled
+DisableAcceleratorDuplicateSession=off
+
+; Cygwin connection by Alt-G Accelerator key
+AcceleratorCygwinConnection=on
+
+; Send break by Alt-B Accelerator key disabled
+DisableAcceleratorSendBreak=off
+
+; New connection Menu disabled
+DisableMenuNewConnection=off
+
+; Duplicate session Menu disabled
+DisableMenuDuplicateSession=off
+
+; Send break Menu disabled
+DisableMenuSendBreak=off
+
+; ANSI color definition (in the case FullColor=on)
+; * UseTextColor should be off, or the background and foreground color of
+; VTColor are assigned to color-number 0 and 7 respectively, even if
+; they are specified in ANSIColor.
+; * ANSIColor is a set of 4 values that are color-number(0--15),
+; red-value(0--255), green-value(0--255) and blue-value(0--255).
+ANSIColor=0,0,0,0, 1,255,0,0, 2,0,255,0, 3,255,255,0, 4,128,128,255, 5,255,0,255, 6,0,255,255, 7,255,255,255, 8,64,64,64, 9,192,0,0, 10,0,192,0, 11,192,192,0, 12,64,64,192, 13,192,0,192, 14,0,192,192, 15,192,192,192
+; xterm
+; ANSIColor=0,0,0,0, 1,255,0,0, 2,0,255,0, 3,255,255,0, 4,92,92,255, 5,255,0,255, 6,0,255,255, 7,255,255,255, 8,127,127,127, 9,205,0,0, 10,0,205,0, 11,205,205,0, 12,0,0,238, 13,205,0,205, 14,0,205,205, 15,229,229,229
+; PuTTY
+;ANSIColor=0,0,0,0, 1,255,85,85, 2,85,255,85, 3,255,255,85, 4,85,85,255, 5,255,85,255, 6,85,255,255, 7,255,255,255, 8,85,85,85, 9,187,0,0, 10,0,187,0, 11,187,187,0, 12,0,0,187, 13,187,0,187, 14,0,187,187, 15,187,187,187
+; Tera Term Pro 2.3
+;ANSIColor=0,0,0,0, 1,255,0,0, 2,0,255,0, 3,255,255,0, 4,0,0,255, 5,255,0,255, 6,0,255,255, 7,255,255,255, 8,128,128,128, 9,128,0,0, 10,0,128,0, 11,128,128,0, 12,0,0,128, 13,128,0,128, 14,0,128,128, 15,192,192,192
+; Solarized (http://ethanschoonover.com/solarized)
+;ANSIColor=0,7,54,66, 1,203,75,22, 2,88,110,117, 3,101,123,131, 4,131,148,150, 5,108,113,196, 6,147,161,161, 7,253,246,227, 8,0,43,54, 9,220,50,47, 10,133,153,0, 11,181,137,0, 12,38,139,210, 13,211,54,130, 14,42,161,152, 15,238,232,213
+
+; Enable continued-line copy
+EnableContinuedLineCopy=on
+
+; Mouse cursor type (arrow/ibeam/cross/hand)
+MouseCursor=IBEAM
+
+; Translucent window (0 - 255: transparency value)
+AlphaBlend=255
+
+; Cygwin install path
+CygwinDirectory=C:\cygwin64
+
+; Viewlog Editor path
+ViewlogEditor=C:\Windows\notepad.exe
+
+; Locale for Unicode
+;Locale=chs
+Locale=english
+
+; CodePage for Unicode
+CodePage=1252
+
+; Background color of text uses background color of screen (on/off)
+UseNormalBGColor=on
+
+; Port type (serial/tcpip/namedpipe)
+Port=serial
+
+; Window positions
+VTPos=-2147483648,-2147483648
+TEKPos=-2147483648,-2147483648
+
+; Terminal size
+TerminalSize=128,42
+; Terminal size=window size (on/off)
+TermIsWin=on
+; Auto window resizing option (on/off)
+AutoWinResize=off
+
+; Convert a received new-line (CR) char to CR/CRLF/LF/AUTO
+CRReceive=AUTO
+; New-line code to be transmitted (CR/CRLF/LF)
+CRSend=CRLF
+
+; Terminal ID
+TerminalID=VT100
+
+; Local echo (on/off)
+LocalEcho=off
+
+; Answerback
+Answerback=
+
+; Auto window switching (VT<->TEK; on/off)
+AutoWinSwitch=off
+
+; Kanji code to be received (SJIS/EUC/JIS)
+KanjiReceive=UTF-8
+; JIS Katakana code to be received (7/8)
+KatakanaReceive=8
+
+; Kanji code to be transmitted (SJIS/EUC/JIS)
+KanjiSend=UTF-8
+; JIS Katakana to be transmitted (7/8)
+KatakanaSend=8
+; Kanji-in sequence to be transmitted (@/B)
+KanjiIn=B
+; Kanji-out sequence to be transmitted (J/B)
+KanjiOut=B
+
+; Russian code set used in host
+RussHost=Windows
+; Russian code set used in PC
+RussClient=Windows
+
+; Window title
+Title=Tera Term
+
+; Cursor shape (block/vertical/horizontal)
+CursorShape=block
+
+; Hide title & menu bars and enable popup menu (on/off)
+HideTitle=off
+; Hide menu bar and enable popup menu (on/off)
+PopupMenu=off
+
+; Color mode (on/off)
+EnableANSIColor=on
+PcBoldColor=on
+Aixterm16Color=on
+Xterm256Color=on
+
+; Enable scroll buffer (on/off)
+EnableScrollBuff=on
+; Scroll buffer size
+ScrollBuffSize=12000
+
+; Text and background colors
+; for Normal characters
+VTColor=0,255,0,0,0,0
+; Solarized Dark
+;VTColor=131,148,150,0,43,54
+; Solarized Light
+;VTColor=101,123,131,253,246,227
+;
+; for Bold characters
+EnableBoldAttrColor=on
+VTBoldColor=255,255,0,0,0,0
+; Solarized Dark
+;VTBoldColor=147,161,161,7,54,66
+; Solarized Light
+;VTBoldColor=88,110,117,238,232,213
+;
+; for Blink characters
+EnableBlinkAttrColor=on
+VTBlinkColor=255,0,0,0,0,0
+; Solarized Dark
+;VTBlinkColor=133,153,0,0,43,54
+; Solarized Light
+;VTBlinkColor=133,153,0,253,246,227
+;
+; for Reverse characters
+EnableReverseAttrColor=on
+VTReverseColor=0,0,0,255,255,255
+; Solarized Dark
+;VTReverseColor=0,43,54,131,148,150
+;VTReverseColor=101,123,131,253,246,227
+; Solarized Light
+;VTReverseColor=253,246,227,101,123,131
+;VTReverseColor=131,148,150,0,43,54
+;
+; for URL(hyper link) text color
+EnableURLColor=on
+URLUnderline=on
+URLColor=0,255,255,0,0,0
+; Solarized Dark
+;URLColor=181,137,0,0,43,54
+; Solarized Light
+;URLColor=181,137,0,253,246,227
+;
+
+; Enable clickable URL
+EnableClickableUrl=off
+
+; Launched Browser
+; Firefox example
+; ClickableUrlBrowser=firefox
+; ClickableUrlBrowserArg=-new-tab
+; Opera example
+; ClickableUrlBrowser=opera
+; ClickableUrlBrowserArg=-newpage
+; IE example
+; ClickableUrlBrowser=iexplore
+; ClickableUrlBrowserArg=
+; Chrome example
+; ClickableUrlBrowser=chrome
+; ClickableUrlBrowserArg=
+ClickableUrlBrowser=
+ClickableUrlBrowserArg=
+
+
+; for TEK window
+TEKColor=0,0,0,255,255,255
+
+; TEK color emulation (on/off)
+TEKColorEmulation=off
+
+; Font
+VTFont=Lucida Console,0,-13,0
+; Bold style font (on/off)
+EnableBold=on
+; Font for TEK window
+TEKFont=Terminal,0,-8,255
+; Font quality(default/non-antialiased/antialiased/cleartype)
+FontQuality=default
+
+; Russian code set of the font
+RussFont=Windows
+
+; Backspace key (BS/DEL)
+BSKey=BS
+; transmit DEL by Delete key (on/off)
+DeleteKey=on
+
+; Russian code set used in the keyboard driver
+RussKeyb=Windows
+
+; Meta key (on/off/left/right)
+MetaKey=off
+
+; Meta key sets MSB (off/raw/text)
+Meta8Bit=off
+
+; Application keypad mode disabled.
+DisableAppKeypad=on
+
+; Application cursor mode disabled.
+DisableAppCursor=on
+
+; Serial port parameters
+; Port number
+ComPort=3
+; Baud rate
+BaudRate=921600
+; Parity (even/odd/none/mark/space)
+Parity=none
+; Data (7/8)
+DataBit=8
+; Stop (1/1.5/2)
+StopBit=1
+; Flow control (x/hard/none)
+FlowCtrl=x
+; Transmit delay per character (in msec)
+DelayPerChar=0
+; Transmit delay per line (in msec)
+DelayPerLine=0
+
+; TCP/IP parameters
+; TCP port#
+TCPPort=80
+; Telnet flag (on/off)
+Telnet=off
+; Telnet terminal type
+;TermType=vt100
+TermType=xterm
+
+; Auto window closing option (on/off)
+AutoWinClose=on
+; History list of hosts
+HistoryList=on
+
+; Binary flag for Send File (on/off)
+TransBin=off
+
+; without transfer dialog flag for Send File (on/off)
+FTHideDialog=off
+
+; Binary flag for Log (on/off)
+LogBinary=off
+; Log append (on/off)
+LogAppend=on
+; plain text flag for Log (on/off)
+LogTypePlainText=on
+; timestamp flag for Log (on/off)
+LogTimestamp=off
+; without transfer dialog flag for Log (on/off)
+LogHideDialog=off
+; Current all buffer included in first (on/off)
+LogIncludeScreenBuffer=off
+
+; Default Log file name. You can specify strftime format to here.
+LogDefaultName=teraterm.log
+; Default path to save the log file.
+LogDefaultPath=
+; Auto start logging with default log file name.
+LogAutoStart=off
+
+; === Log Rotate ===
+; Mode: 0(none), 1(size)
+LogRotate=0
+; Size
+LogRotateSize=0
+; Size type: 0(byte), 1(KB), 2(MB)
+LogRotateSizeType=0
+; Step: 0(none), >=1(count times)
+LogRotateStep=0
+
+; Deferred Log Write Mode (on/off)
+DeferredLogWriteMode=on
+
+
+; XMODEM option (checksum/crc/1k)
+XmodemOpt=checksum
+; Binary flag for XMODEM Receive and ZMODEM Send (on/off)
+XmodemBin=on
+
+; XMODEM receive command
+XmodemRcvCommand=
+
+; Default directory for file transfers
+FileDir=A:\projets\msp430\MSP430-FORTH
+
+; Filter for send file
+FileSendFilter=
+
+; SCP sending directory
+ScpSendDir=
+
+; Save Broadcast Command History
+BroadcastCommandHistory=on
+
+; Broadcast command enabling flag on the dialog window (on/off)
+AcceptBroadcast=on
+
+; Number of broadcast command history
+MaxBroadcatHistory=99
+
+;------ special options (see Tera Term help)
+
+; C1 (8-bit) control characters
+Accept8BitCtrl=on
+Send8BitCtrl=off
+
+; Accept remote-controlled window title changing (off/overwrite/ahead/last)
+AcceptTitleChangeRequest=overwrite
+
+; Wrong kanji-out ^[(H (Japanese only)
+AllowWrongSequence=off
+
+; Alternate screen buffer support
+AlternateScreenBuffer=on
+
+; Automatic serial reconnection when serial cable is inserted and extracted(Windows XP or later).
+AutoComPortReconnect=on
+
+; When serial port is specified with with /C= option and the port does not exist,
+; Tera Term will wait for port connection.
+WaitCom=off
+
+; Auto file renaming for downloading
+AutoFileRename=on
+
+; Auto text copying
+AutoTextCopy=on
+
+; Back wrap
+BackWrap=off
+
+; Beep by BEL (on/off/visual)
+Beep=on
+
+; Beep over-used
+BeepOverUsedTime=2
+BeepOverUsedCount=5
+BeepSuppressTime=5
+
+; Beep on connection & disconnection
+BeepOnConnect=off
+
+; B-Plus auto receive
+BPAuto=off
+
+; Escape all control characters in B-Plus
+BPEscCtl=off
+
+; B-Plus log
+BPLog=off
+
+; Clear serial port buffer when port opening
+ClearComBuffOnOpen=on
+
+; Clear screen when window is resized
+ClearOnResize=on
+
+; Clear screen after the connection is closed
+ClearScreenOnCloseConnection=off
+
+; Clipboard access from remote (on/off/read/write)
+ClipboardAccessFromRemote=off
+
+; "Disconnect?" warning
+ConfirmDisconnect=on
+
+; Control characters in kanji (Japanese only)
+CtrlInKanji=on
+
+; Confirm send a file when drag and drop
+ConfirmFileDragAndDrop=on
+
+; allow the sequences related to cursor control
+CursorCtrlSequence=off
+
+; Display all characters (debug mode)
+Debug=off
+; Debug mode type which can be selected by user.
+; on|all = All types
+; off|none = Disabled debug mode
+; normal = usual teraterm debug mode
+; hex = hex output
+; noout = disable output completely
+DebugModes=all
+
+; Delimters for word selection
+; (compatible with earlier versions of Tera Term)
+; DelimList=$20
+; DelimDBCS=off
+DelimList=$20!"#$24%&'()*+,:;<=>?@[\]^`{|}
+DelimDBCS=on
+
+; Disable mouse event tracking when Control-Key is pressed.
+DisableMouseTrackingByCtrl=on
+
+; Disable wheel to cursor translation when Control-Key is pressed.
+DisableWheelToCursorByCtrl=on
+
+; Line at a time mode
+EnableLineMode=on
+
+; Popup menu
+EnablePopupMenu=on
+
+; "Show menu bar" command
+EnableShowMenu=on
+
+; Enable the status line
+EnableStatusLine=on
+
+; High speed file transfer on serial connection.
+FileSendHighSpeedMode=on
+
+; Display "New Connection" dialog on startup
+HostDialogOnStartup=on
+
+; Enable IME / inline input (Japanese only)
+IME=on
+IMEInline=on
+
+IMERelatedCursor=off
+
+; Windows 7 jump list support
+JumpList=on
+
+; Join Split URL
+JoinSplitURL=off
+JoinSplitURLIgnoreEOLChar=\
+
+; Kermit log
+KmtLog=off
+; Kermit CAPAS: Ability to transmit and receive extended-length packets
+KmtLongPacket=off
+; Kermit CAPAS: Ability to accept "A" packets (file attributes)
+KmtFileAttr=off
+
+; Language selection
+LanguageSelection=on
+
+; Lock Terminal Unique ID
+LockTUID=on
+
+; Exclusive lock for log file
+LogLockExclusive=on
+
+; Max scroll buffer size
+MaxBuffSize=500000
+
+; Max serial port number
+MaxComPort=256
+
+; Max buffer size of OSC string
+MaxOSCBufferSize=4096
+
+; Mouse event tracking
+MouseEventTracking=on
+
+; Maximized window bug tweak
+MaximizedBugTweak=2
+
+; Nonblinking cursor
+NonblinkingCursor=off
+
+; Polygon cursor for KILLFOCUS
+KillFocusCursor=on
+
+; Delay for pass-thru printing (in secs)
+PassThruDelay=3
+
+; Direct pass-thru printing
+PassThruPort=
+
+; Delay for paste per each lines (in msec)
+PasteDelayPerLine=10
+
+; Allow the sequences related to printer control
+PrinterCtrlSequence=on
+
+; Printer font
+PrnFont=
+
+; Page margins for printing
+; (left, right, top and bottom in 1/100 inches)
+PrnMargin=50,50,50,50
+
+; Quick-VAN log
+QVLog=off
+
+; Quick-VAN window size
+QVWinSize=8
+
+; Russian code set of printer font
+RussPrint=Windows
+
+; Save VT Window position
+SaveVTWinPos=off
+
+; Max lines per one jump scroll
+ScrollThreshold=12
+
+; Scroll line count with mouse wheel button
+MouseWheelScrollLine=3
+
+; Text selection on window activation
+SelectOnActivate=on
+
+; Break signal length (in msec)
+SendBreakTime=1000
+
+; Startup macro
+StartupMacro=
+
+; Strict Key Mapping
+StrictKeyMapping=off
+
+; Tab Stop Modify Sequence (on/off/combination of HTS,HTS7,HTS8,TBC,TBC0,TBC3)
+TabStopModifySequence=on
+
+; TEK mouse code
+TEKGINMouseCode=32
+
+; Telnet Auto Detection
+TelAutoDetect=on
+
+; Telnet binary option
+TelBin=off
+
+; Telnet auto echo
+TelEcho=off
+
+; Telnet log
+TelLog=off
+
+; Standard telnet port
+TelPort=23
+
+; Keep-Alive packet sending interval on telnet connection (per second, 0=disabled)
+TelKeepAliveInterval=300
+
+; Auto setup for non-telnet
+TCPLocalEcho=off
+TCPCRSend=
+
+; Terminal Unique ID
+TerminalUID=FFFFFFFF
+
+; Title format
+; format ID: 5(000101) <title> - <host/port> VT/TEK
+; format ID: 13(001101) <host/port> - <title> VT/TEK
+; format ID: 29(011101) <host:tcpport/port> - <title> VT/TEK
+; format ID: 45(101101) <host/port:baud> - <title> VT/TEK
+; format ID: 61(111101) <host:tcpport/port:baud> - <title> VT/TEK
+TitleFormat=45
+
+; Allow the sequences related to title report (accept/ignore/empty)
+TitleReportSequence=empty
+
+; Translate mouse wheel to cursor key when application cursor mode
+TranslateWheelToCursor=on
+
+; Trim trailing new line character when pasting
+TrimTrailingNLonPaste=off
+
+; Unknown Unicode character handling
+UnknownUnicodeCharacterAsWide=off
+
+; Mapping of Unicode to DEC special character
+; The sum of following values:
+; 1 : Box drawings (U+2500-U+257F)
+; 2 : Bullet (U+2022)
+; Hyphenation point (U+2027)
+; Light shade (25%) (U+2591)
+; Medium shade (50%) (U+2592)
+; Dark shade (75%) (U+2593)
+; Black small square (U+25AA)
+; Black vertical rectangle (U+25AE)
+; Black verty small square (U+2B1D)
+; 4 : Middle dot (U+00B7)
+; One dot leader (U+2024)
+; Bullet operator (U+2219)
+UnicodeToDecSpMapping=3
+
+; White & black color conversion
+UseTextColor=off
+
+; VT Compatible Tab
+VTCompatTab=off
+
+; Space between characters (lines)
+VTFontSpace=0,0,0,0
+
+; Window Icon
+VTIcon=Default
+TEKIcon=Default
+
+; Scaling factors for printing (in pixels per inch)
+VTPPI=0,0
+TEKPPI=0,0
+
+; `wait4all' macro command
+Wait4allMacroCommand=off
+
+; allow the sequences related to window control
+WindowCtrlSequence=on
+
+; allow the sequences related to window report
+WindowReportSequence=on
+
+; [Window] menu
+WindowMenu=on
+
+; XMODEM log
+XmodemLog=off
+
+; XMODEM Timeout value(v1,v2,v3,v4,v5) by seconds
+; v1=NAK mode: Timeout value for first packet
+; v2=CRC mode: Timeout value for first packet
+; v3=Timeout short time
+; v4=Timeout long time
+; v5=Timeout very long time
+XmodemTimeouts=10,3,10,20,60
+
+; YMODEM log
+YmodemLog=off
+
+; YMODEM receive command
+YmodemRcvCommand=
+
+; YMODEM Timeout value(v1,v2,v3,v4,v5) by seconds
+; v1=NAK mode: Timeout value for first packet
+; v2=CRC mode: Timeout value for first packet
+; v3=Timeout short time
+; v4=Timeout long time
+; v5=Timeout very long time
+YmodemTimeouts=10,3,10,20,60
+
+; ZMODEM auto receive
+ZmodemAuto=off
+
+; ZMODEM parameters for sending
+ZmodemDataLen=1024
+ZmodemWinSize=32767
+
+; Escape all control characters in ZMODEM
+ZmodemEscCtl=off
+
+; ZMODEM log
+ZmodemLog=off
+
+; ZMODEM receive command
+ZmodemRcvCommand=rz
+
+; ZMODEM Timeout value(v1,v2,v3,v4) by seconds
+; v1=Timeout value for serial port
+; v2=Timeout value for TCP/IP port
+; v3=Timeout value for initial packet
+; v4=Timeout value for final packet
+ZmodemTimeouts=10,0,10,3
+NormalizeLineBreakOnPaste=off
+NotifyClipboardAccess=on
+
+;------ end of special options
+
+[TTSSH]
+; SSH enabled flag (1=enabled 0=disabled)
+Enabled=1
+
+; default login username (setup to authentication dialog)
+DefaultUserName=
+DefaultForwarding=
+
+; Cipher algorithm order
+; 2...DES(SSH1), 3...3DES(SSH1), 6...Blowfish(SSH1), 7...3DES-CBC,
+; 8...AES128-CBC, 9...AES192-CBC, :...AES256-CBC, ;...Blowfish-CBC,
+; <...AES128-CTR, =...AES192-CTR, >...AES256-CTR, ?...Arcfour,
+; @...Arcfour128, A...Arcfour256, B...CAST128-CBC, C...3DES-CTR,
+; D...Blowfish-CTR, E...CAST128-CTR, F...Camellia128-CBC,
+; G...Camellia192-CBC, H...Camellia256-CBC, I...Camellia128-CTR,
+; J...Camellia192-CTR, K...Camellia256-CTR
+; 0...Ciphers below this line are disabled.
+CipherOrder=K>H:J=G9I<F8C7D;EB30A@?62
+
+; KEX algorithm order(SSH2)
+; 1...diffie-hellman-group1-sha1
+; 2...diffie-hellman-group14-sha1
+; 3...diffie-hellman-group-exchange-sha1
+; 4...diffie-hellman-group-exchange-sha256
+; 5...ecdh-sha2-nistp256
+; 6...ecdh-sha2-nistp384
+; 7...ecdh-sha2-nistp521
+; 8...diffie-hellman-group14-sha256
+; 9...diffie-hellman-group16-sha512
+; :...diffie-hellman-group18-sha512
+; 0...KEXs below this line are disabled.
+KexOrder=567:9843210
+
+; minimal size in bits of an acceptable group in SSH_MSG_KEY_DH_GEX_REQUEST packet
+GexMinimalGroupSize=0
+
+; Host Key algorithm order(SSH2)
+; 2...ssh-rsa
+; 3...ssh-dss
+; 4...ecdh-sha2-nistp256
+; 5...ecdh-sha2-nistp384
+; 6...ecdh-sha2-nistp521
+; 7...ssh-ed25519
+; 0...below this line are disabled.
+HostKeyOrder=4567230
+
+; MAC algorithm order(SSH2)
+; 1...hmac-sha1
+; 2...hmac-md5
+; 3...hmac-sha1-96
+; 4...hmac-md5-96
+; 5...hmac-ripemd160@openssh.com
+; 6...hmac-sha2-256
+; 8...hmac-sha2-512
+; 0...below this line are disabled.
+MacOrder=86152034
+
+; Compression algorithm order(SSH2)
+; 1...none
+; 2...zlib
+; 3...zlib@openssh.com(Delayed Compression)
+; 0...below this line are disabled.
+CompOrder=3210
+; packet compression level (0=none)
+Compression=0
+
+
+KnownHostsFiles=ssh_known_hosts
+DefaultRhostsLocalUserName=
+DefaultRhostsHostPrivateKeyFile=
+DefaultRSAPrivateKeyFile=
+DefaultAuthMethod=3
+; Debug message logging level of `TTSSH.LOG'.
+; The default value is disabled(0).
+; LOG_LEVEL_FATAL 5
+; LOG_LEVEL_ERROR 10
+; LOG_LEVEL_URGENT 20
+; LOG_LEVEL_WARNING 30
+; LOG_LEVEL_NOTIFY 50
+; LOG_LEVEL_INFO 80
+; LOG_LEVEL_VERBOSE 100
+; LOG_LEVEL_SSHDUMP 200
+LogLevel=0
+WriteBufferSize=2097152
+
+; SSH protocol version (1 or 2)
+ProtocolVersion=2
+
+; SSH heartbeat(keepalive): per second (0=disabled)
+HeartBeat=60
+
+; Remember password in memory (1=enabled 0=disabled)
+RememberPassword=1
+
+; Check supported auth methods with "none" method (1=enabled 0=disabled)
+CheckAuthListFirst=0
+
+; Enable connection to the server that has RSA key length less than 768 bit (1=enabled 0=disabled)
+EnableRsaShortKeyServer=0
+
+; SSH agent forwarding (pageant) (1=enabled 0=disabled)
+ForwardAgent=0
+
+; Confirm SSH agent forwarding (1=enabled 0=disabled)
+ForwardAgentConfirm=1
+
+; Verify host key by DNS (1=enabled 0=disabled)
+VerifyHostKeyDNS=0
+
+; SSH Icon
+SSHIcon=Default
+
+; Disable error popup-message box
+; 0 ... Default(not disabling)
+; 1 ... Sending forwarded data to a local port
+DisablePopupMessage=0
+
+; X11 Forwarding
+X11Display=
+
+; Host key rotation support (derived from OpenSSH 6.8)
+; 0 ... Disabled
+; 1 ... Enabled
+; 2 ... Enabled with User's confirmation
+UpdateHostkeys=0
+ForwardAgentNotify=1
+
+
+[TTProxy]
+ConnectionTimeout="10"
+SocksResolve="auto"
+TelnetHostnamePrompt=">> Host name: "
+TelnetUsernamePrompt="Username:"
+TelnetPasswordPrompt="Password:"
+TelnetConnectedMessage="-- Connected to "
+TelnetErrorMessage="!!!!!!!!"
+
+[TTXKanjiMenu]
+UseOneSetting=on
+
+[TTXttyrec]
+RecordStartSize=on
+
+[TTXRecurringCommand]
+Enable=off
+Command=
+Interval=300
+AddNewLine=off
+
+[Resize Menu]
+; 80x62
+;ResizeMenu1= 80, 24
+;
+; 120x52
+;ResizeMenu2=120, 52
+;
+; Width: no-change, Height: 52
+;ResizeMenu3= 0, 52
+;
+; Width: 80, Height: no-change
+;ResizeMenu4= 80, 0
+
+;------ Telnet host list
+; Max number of hosts is 200.
+; You can edit this list in the [Setup] TCP/IP dialog box.
+;[Hosts]
+; Host name
+;Host1=myhost.example.com
+; IPv4 address
+;Host2=192.0.2.1
+; IPv6 address
+;Host3=[2001:db8:1:2:8401:02ff:fe03:0405]
+; IPv6 address with interface number
+;Host4=[fe80::8401:02ff:fe03:0405%3]
+; Host name with option
+;Host5=myhost.example.com /F=myhost.ini
+; Host name with user, port and option
+;Host6=user@myhost.example.com:10022 /ssh
+; URL
+;Host7=ssh://user@myhost.example.com
+; COM1 port
+;Host8=/C=1
+; Replay a file
+;Host9=/R=readme.txt
+
+[Hosts]
+Host1=192.168.4.2
+Host2=192.168.0.8
+Host3=192.168.1.8
+Host4=192.168.1.8/
+Host5=myhost.example.com
+Host6=192.0.2.1
+Host7=[2001:db8:1:2:8401:2ff:fe03:405]
+Host8=[fe80::8401:2ff:fe03:405%3]
+Host9=myhost.example.com /F=myhost.ini
+Host10=user@myhost.example.com:10022 /ssh
+Host11=ssh://user@myhost.example.com
+Host12=/C=1 ;serial port
+Host13=\\.\pipe\vmware-serial-port ;Named pipe
+Host14=/R=readme.txt ;replay a file
!MSP430FR2xxx.pat
-LPM4,=\$F8,! SR(LPM4+GIE)
-LPM3,=\$D8,! SR(LPM3+GIE)
-LPM2,=\$98,! SR(LPM2+GIE)
-LPM1,=\$58,! SR(LPM1+GIE)
-LPM0,=\$18,! SR(LPM0+GIE)
+LPM4=\$F8! SR(LPM4+GIE)
+LPM3=\$D8! SR(LPM3+GIE)
+LPM2=\$98! SR(LPM2+GIE)
+LPM1=\$58! SR(LPM1+GIE)
+LPM0=\$18! SR(LPM0+GIE)
SFRIE1=\$100! \ SFR enable register
P2SEL0=\$20B!
P2SEL1=\$20D!
P2SELC=\$217!
-P2IES=\$218!
+P2IES=\$219!
P2IE=\$21B!
P2IFG=\$21D!
!MSP430FR2x4x_FastForth.pat
+
! ===========================================================
! MSP430FR2xxx and FR4xxx DEVICES HAVE SPECIFIC RAM ADDRESSES
! ===========================================================
SCG0=\$40! = SR(6) SCG0
SCG1=\$80! = SR(7) SCG1
V=\$100! = SR(8) oVerflow flag
-UF1=\$200! = SR(9) User Flag 1 used by ?NUMBER --> INTERPRET --> LITERAL to process double numbers, else free for use.
-UF2=\$400! = SR(10) User Flag 2
-UF3=\$800! = SR(11) User Flag 3
+UF9=\$200! = SR(9) User Flag 1 used by ?NUMBER --> INTERPRET --> LITERAL to process double numbers, else free for use.
+UF10=\$400! = SR(10) User Flag 2
+UF11=\$800! = SR(11) User Flag 3
C\@=C\@
C\!=C\!
! ============================================
! symbolic codes :
! ============================================
+POP=MOV \@R1+,! \ MOV @RSP+,
+POP\.B=MOV\.B \@R1+,! \ MOV.B @RSP+,
RET=MOV \@R1+,R0! \ MOV @RSP+,PC
NOP=MOV 0,R3! \ one word one cycle
NOP2=\$3C00 ,! \ compile JMP 0 one word two cycles
NEXT=MOV \@R13+,R0! \ MOV @IP+,PC
+! ============================================
+! FORTH DOxxx registers :
+! ============================================
+rDOCOL=R7!
+rDOVAR=R6!
+rDOCON=R5!
+rDODOES=R4!
! You can check the addresses below by comparing their values in DTCforthMSP430FRxxxx.lst
! those addresses are usable with the symbolic assembler
INIDP=\$180C! define RST_STATE, init by wipe
INIVOC=\$180E! define RST_STATE, init by wipe
-XON=\$1810!
-XOFF=\$1812!
+RXON=\$1810!
+RXOFF=\$1812!
ReadSectorWX=\$1814! call with W = SectorLO X = SectorHI
WriteSectorWX=\$1816! call with W = SectorLO X = SectorHI
! ============================================
+! FORTH RAM areas :
+! ============================================
+LSTACK_SIZE=\#16! words
+PSTACK_SIZE=\#48! words
+RSTACK_SIZE=\#48! words
+PAD_LEN=\#84! bytes
+TIB_LEN=\#80! bytes
+HOLD_SIZE=\#34! bytes
+
+! ============================================
! FastForth RAM memory map (>= 1k):
! ============================================
-LSATCK=\$2000! \ leave stack, grow up
LEAVEPTR=\$2000! \ Leave-stack pointer, init by QUIT
+LSATCK=\$2000! \ leave stack, grow up
PSTACK=\$2080! \ parameter stack, grow down
RSTACK=\$20E0! \ Return stack, grow down
-PAD=\$20E2! \ user scratch pad buffer, grow up
-TIB=\$2138! \ Terminal input buffer, grow up
+PAD_ORG=\$20E2! \ user scratch pad buffer, grow up
+TIB_ORG=\$2138! \ Terminal input buffer, grow up
BASE_HOLD=\$21AA! \ BASE HOLD area, grow down
! ----------------------
HandleOutOfBound=\$2500!
SDIB=\$2500!
-
+SDIB_LEN=\#84!
SD_END_DATA=\$2554!
\ No newline at end of file
!MSP430fr57xx.pat
-LPM4,=\$F8,! SR(LPM4+GIE)
-LPM3,=\$D8,! SR(LPM3+GIE)
-LPM2,=\$98,! SR(LPM2+GIE)
-LPM1,=\$58,! SR(LPM1+GIE)
-LPM0,=\$18,! SR(LPM0+GIE)
+LPM4=\$F8! SR(LPM4+GIE)
+LPM3=\$D8! SR(LPM3+GIE)
+LPM2=\$98! SR(LPM2+GIE)
+LPM1=\$58! SR(LPM1+GIE)
+LPM0=\$18! SR(LPM0+GIE)
P2SEL0=\$20B!
P2SEL1=\$20D!
P2SELC=\$217!
-P2IES=\$218!
+P2IES=\$219!
P2IE=\$21B!
P2IFG=\$21D!
P4SEL0=\$22B!
P4SEL1=\$22D!
P4SELC=\$237!
-P4IES=\$238!
+P4IES=\$239!
P4IE=\$23B!
P4IFG=\$23D!
TACLR=4!
TAIFG=1!
-TBCLR=2!
+TBCLR=4!
TBIFG=1!
CCIFG=1!
TB2EX0=\$460! \ TB2 expansion register 0
TB2IV=\$46E! \ TB2 interrupt vector
+! RTC_B
RTCCTL0=\$4A0! \ RTC control 0
RTCCTL1=\$4A1! \ RTC control 1
RTCCTL2=\$4A2! \ RTC control 2
BIN2BCD=\$4BC! \ Binary-to-BCD conversion register
BCD2BIN=\$4BE! \ BCD-to-binary conversion register
RTCHOLD=\$40!
+RTCRDY=\$10!
MPY=\$4C0! \ 16-bit operand 1 \96 multiply
MPYS=\$4C2! \ 16-bit operand 1 \96 signed multiply
SCG0=\$40! = SR(6) SCG0
SCG1=\$80! = SR(7) SCG1
V=\$100! = SR(8) oVerflow flag
-UF1=\$200! = SR(9) User Flag 1, set by ?NUMBER, used and reset to 0 by following LITERAL (double number process) else free for use.
-UF2=\$400! = SR(10) User Flag 2
-UF3=\$800! = SR(11) User Flag 3
+UF9=\$200! = SR(9) User Flag 1 used by ?NUMBER --> INTERPRET --> LITERAL to process double numbers, else free for use.
+UF10=\$400! = SR(10) User Flag 2
+UF11=\$800! = SR(11) User Flag 3
C\@=C\@
C\!=C\!
! symbolic codes :
! ============================================
RET=MOV \@R1+,R0! \ MOV @RSP+,PC
-NOP=MOV 0,R3! \ one word one cycle
+NOP=MOV \#0,R3! \ one word one cycle
NOP2=\$3C00 ,! \ compile JMP 0 one word two cycles
NOP3=MOV R0,R0! \ MOV PC,PC one word three cycles
NEXT=MOV \@R13+,R0! \ MOV @IP+,PC
+SEMI=MOV \@R1+,R13 \n MOV \@R13+,R0!
+! ============================================
+! FORTH DOxxx registers :
+! ============================================
+rDOCOL=R7!
+rDOVAR=R6!
+rDOCON=R5!
+rDODOES=R4!
! You can check the addresses below by comparing their values in DTCforthMSP430FRxxxx.lst
! those addresses are usable with the symbolic assembler
INIDP=\$180C! define RST_STATE, init by wipe
INIVOC=\$180E! define RST_STATE, init by wipe
-XON=\$1810!
-XOFF=\$1812!
+RXON=\$1810!
+RXOFF=\$1812!
ReadSectorWX=\$1814! call with W = SectorLO X = SectorHI
WriteSectorWX=\$1816! call with W = SectorLO X = SectorHI
! ============================================
+! FORTH RAM areas :
+! ============================================
+LSTACK_SIZE=\#16! words
+PSTACK_SIZE=\#48! words
+RSTACK_SIZE=\#48! words
+PAD_LEN=\#84! bytes
+TIB_LEN=\#80! bytes
+HOLD_SIZE=\#34! bytes
+
+! ============================================
! FastForth RAM memory map (= 1k):
! ============================================
-LSATCK=\$1C00! \ leave stack, grow up
LEAVEPTR=\$1C00! \ Leave-stack pointer, init by QUIT
+LSATCK=\$1C00! \ leave stack, grow up
PSTACK=\$1C80! \ parameter stack, grow down
RSTACK=\$1CE0! \ Return stack, grow down
-PAD=\$1CE2! \ user scratch pad buffer, grow up
-TIB=\$1D38! \ Terminal input buffer, grow up
+PAD_ORG=\$1CE2! \ user scratch pad buffer, grow up
+TIB_ORG=\$1D38! \ Terminal input buffer, grow up
BASE_HOLD=\$1DAA! \ BASE HOLD area, grow down
! ----------------------
@define{@read{/config/gema/MSP430FR5x6x.pat}}
+! \ RTC_B
+RTCCTL0=\$4A0! \ RTC control 0
+RTCCTL1=\$4A1! \ RTC control 1
+RTCCTL2=\$4A2! \ RTC control 2
+RTCCTL3=\$4A3! \ RTC control 3
+RTCPS0CTL=\$4A8! \ RTC prescaler 0 control
+RTCPS1CTL=\$4AA! \ RTC prescaler 1 control
+RTCPS0=\$4AC! \ RTC prescaler 0
+RTCPS1=\$4AD! \ RTC prescaler 1
+RTCIV=\$4AE! \ RTC interrupt vector word
+RTCSEC=\$4B0! \ RTC seconds, RTC counter register 1 RTCSEC,
+RTCMIN=\$4B1! \ RTC minutes, RTC counter register 2 RTCMIN,
+RTCHOUR=\$4B2! \ RTC hours, RTC counter register 3 RTCHOUR,
+RTCDOW=\$4B3! \ RTC day of week, RTC counter register 4 RTCDOW,
+RTCDAY=\$4B4! \ RTC days
+RTCMON=\$4B5! \ RTC month
+RTCYEAR=\$4B6!
+RTCYEARL=\$4B6! \ RTC year low
+RTCYEARH=\$4B7! \ RTC year high
+RTCAMIN=\$4B8! \ RTC alarm minutes
+RTCAHOUR=\$4B9! \ RTC alarm hours
+RTCADOW=\$4BA! \ RTC alarm day of week
+RTCADAY=\$4BB! \ RTC alarm days
+BIN2BCD=\$4BC! \ Binary-to-BCD conversion register
+BCD2BIN=\$4BE! \ BCD-to-binary conversion register
+RTCHOLD=\$40!
+RTCRDY=\$10!
+
! ----------------------------------------------
! MSP430fr5948 MEMORY MAP
! ----------------------------------------------
eUSCI_A1_Vec=\$FFE6!
TA0_x_Vec=\$FFE8!
TA0_0_Vec=\$FFEA!
-ADC10_B_Vec=\$FFEC!
+ADC12_B_Vec=\$FFEC!
eUSCI_B0_Vec=\$FFEE!
eUSCI_A0_Vec=\$FFF0!
WDT_Vec=\$FFF2!
@define{@read{/config/gema/MSP430FR5x6x.pat}}
+! \ RTC_B
+RTCCTL0=\$4A0! \ RTC control 0
+RTCCTL1=\$4A1! \ RTC control 1
+RTCCTL2=\$4A2! \ RTC control 2
+RTCCTL3=\$4A3! \ RTC control 3
+RTCPS0CTL=\$4A8! \ RTC prescaler 0 control
+RTCPS1CTL=\$4AA! \ RTC prescaler 1 control
+RTCPS0=\$4AC! \ RTC prescaler 0
+RTCPS1=\$4AD! \ RTC prescaler 1
+RTCIV=\$4AE! \ RTC interrupt vector word
+RTCSEC=\$4B0! \ RTC seconds, RTC counter register 1 RTCSEC,
+RTCMIN=\$4B1! \ RTC minutes, RTC counter register 2 RTCMIN,
+RTCHOUR=\$4B2! \ RTC hours, RTC counter register 3 RTCHOUR,
+RTCDOW=\$4B3! \ RTC day of week, RTC counter register 4 RTCDOW,
+RTCDAY=\$4B4! \ RTC days
+RTCMON=\$4B5! \ RTC month
+RTCYEAR=\$4B6!
+RTCYEARL=\$4B6! \ RTC year low
+RTCYEARH=\$4B7! \ RTC year high
+RTCAMIN=\$4B8! \ RTC alarm minutes
+RTCAHOUR=\$4B9! \ RTC alarm hours
+RTCADOW=\$4BA! \ RTC alarm day of week
+RTCADAY=\$4BB! \ RTC alarm days
+BIN2BCD=\$4BC! \ Binary-to-BCD conversion register
+BCD2BIN=\$4BE! \ BCD-to-binary conversion register
+RTCHOLD=\$40!
+RTCRDY=\$10!
+
! ----------------------------------------------
! MSP430FR5969 MEMORY MAP
! ----------------------------------------------
@define{@read{/config/gema/MSP430FR5x6x.pat}}
+! \ RTC_C
+RTCCTL0_L=\$4A0! \ RTCCTL0_L
+RTCCTL0_H=\$4A1! \ RTCCTL0_H
+RTCCTL1=\$4A2! \ RTCCTL1
+RTCCTL3=\$4A3! \ RTCCTL3
+RTCPS0CTL=\$4A8! \ RTC prescaler 0 control
+RTCPS1CTL=\$4AA! \ RTC prescaler 1 control
+RTCPS0=\$4AC! \ RTC prescaler 0
+RTCPS1=\$4AD! \ RTC prescaler 1
+RTCIV=\$4AE! \ RTC interrupt vector word
+RTCSEC=\$4B0! \ RTC seconds, RTC counter register 1 RTCSEC,
+RTCMIN=\$4B1! \ RTC minutes, RTC counter register 2 RTCMIN,
+RTCHOUR=\$4B2! \ RTC hours, RTC counter register 3 RTCHOUR,
+RTCDOW=\$4B3! \ RTC day of week, RTC counter register 4 RTCDOW,
+RTCDAY=\$4B4! \ RTC days
+RTCMON=\$4B5! \ RTC month
+RTCYEAR=\$4B6!
+RTCYEARL=\$4B6! \ RTC year low
+RTCYEARH=\$4B7! \ RTC year high
+RTCAMIN=\$4B8! \ RTC alarm minutes
+RTCAHOUR=\$4B9! \ RTC alarm hours
+RTCADOW=\$4BA! \ RTC alarm day of week
+RTCADAY=\$4BB! \ RTC alarm days
+BIN2BCD=\$4BC! \ Binary-to-BCD conversion register
+BCD2BIN=\$4BE! \ BCD-to-binary conversion register
+RTCHOLD=\$40!
+RTCRDY=\$10!
+
! ----------------------------------------------
! MSP430FR5994 MEMORY MAP
! ----------------------------------------------
!MSP430fr5x6x.pat
-LPM4,=\$F8,! SR(LPM4+GIE)
-LPM3,=\$D8,! SR(LPM3+GIE)
-LPM2,=\$98,! SR(LPM2+GIE)
-LPM1,=\$58,! SR(LPM1+GIE)
-LPM0,=\$18,! SR(LPM0+GIE)
+LPM4=\$F8! SR(LPM4+GIE)
+LPM3=\$D8! SR(LPM3+GIE)
+LPM2=\$98! SR(LPM2+GIE)
+LPM1=\$58! SR(LPM1+GIE)
+LPM0=\$18! SR(LPM0+GIE)
CAPTIO1CTL=\$47E! \ Capacitive Touch IO 1 control
-! \ RTC_B / RTC_C
-RTCCTL0=\$4A0! \ RTC control 0 / RTCCTL0_L
-RTCCTL1=\$4A1! \ RTC control 1 / RTCCTL0_H
-RTCCTL2=\$4A2! \ RTC control 2 / RTCCTL1
-RTCCTL3=\$4A3! \ RTC control 3 / RTCCTL3
-RTCPS0CTL=\$4A8! \ RTC prescaler 0 control
-RTCPS1CTL=\$4AA! \ RTC prescaler 1 control
-RTCPS0=\$4AC! \ RTC prescaler 0
-RTCPS1=\$4AD! \ RTC prescaler 1
-RTCIV=\$4AE! \ RTC interrupt vector word
-RTCSEC=\$4B0! \ RTC seconds, RTC counter register 1 RTCSEC,
-RTCMIN=\$4B1! \ RTC minutes, RTC counter register 2 RTCMIN,
-RTCHOUR=\$4B2! \ RTC hours, RTC counter register 3 RTCHOUR,
-RTCDOW=\$4B3! \ RTC day of week, RTC counter register 4 RTCDOW,
-RTCDAY=\$4B4! \ RTC days
-RTCMON=\$4B5! \ RTC month
-RTCYEAR=\$4B6!
-RTCYEARL=\$4B6! \ RTC year low
-RTCYEARH=\$4B7! \ RTC year high
-RTCAMIN=\$4B8! \ RTC alarm minutes
-RTCAHOUR=\$4B9! \ RTC alarm hours
-RTCADOW=\$4BA! \ RTC alarm day of week
-RTCADAY=\$4BB! \ RTC alarm days
-BIN2BCD=\$4BC! \ Binary-to-BCD conversion register
-BCD2BIN=\$4BE! \ BCD-to-binary conversion register
-RTCHOLD=\$40!
-
MPY=\$4C0! \ 16-bit operand 1 \96 multiply
MPYS=\$4C2! \ 16-bit operand 1 \96 signed multiply
MAC=\$4C4! \ 16-bit operand 1 \96 multiply accumulate
ADC12MEM30=\$89C! \ ADC12_B Memory 30
ADC12MEM31=\$89E! \ ADC12_B Memory 31
+ADCON=\$10!
+ADCSTART=\$03!
CDIFG=1!
CDIIFG=2!
SCG0=\$40! = SR(6) SCG0
SCG1=\$80! = SR(7) SCG1
V=\$100! = SR(8) oVerflow flag
-UF1=\$200! = SR(9) User Flag 1 used by ?NUMBER --> INTERPRET --> LITERAL to process double numbers, else free for use.
-UF2=\$400! = SR(10) User Flag 2
-UF3=\$800! = SR(11) User Flag 3
+UF9=\$200! = SR(9) User Flag 1 used by ?NUMBER --> INTERPRET --> LITERAL to process double numbers, else free for use.
+UF10=\$400! = SR(10) User Flag 2
+UF11=\$800! = SR(11) User Flag 3
C\@=C\@
C\!=C\!
! ============================================
! symbolic codes :
! ============================================
+POP=MOV \@R1+,! \ MOV @RSP+,
+POP\.B=MOV\.B \@R1+,! \ MOV.B @RSP+,
RET=MOV \@R1+,R0! \ MOV @RSP+,PC
NOP=MOV 0,R3! \ one word one cycle
NOP2=\$3C00 ,! \ compile JMP 0 one word two cycles
NEXT=MOV \@R13+,R0! \ MOV @IP+,PC
+! ============================================
+! FORTH DOxxx registers :
+! ============================================
+rDOCOL=R7!
+rDOVAR=R6!
+rDOCON=R5!
+rDODOES=R4!
+
! You can check the addresses below by comparing their values in DTCforthMSP430FRxxxx.lst
! those addresses are usable with the symbolic assembler
INIDP=\$180C! define RST_STATE, init by wipe
INIVOC=\$180E! define RST_STATE, init by wipe
-XON=\$1810!
-XOFF=\$1812!
+RXON=\$1810!
+RXOFF=\$1812!
ReadSectorWX=\$1814! call with W = SectorLO X = SectorHI
WriteSectorWX=\$1816! call with W = SectorLO X = SectorHI
+GPFLAGS=\$1818!
+! ============================================
+! FORTH RAM areas :
+! ============================================
+LSTACK_SIZE=\#16! words
+PSTACK_SIZE=\#48! words
+RSTACK_SIZE=\#48! words
+PAD_LEN=\#84! bytes
+TIB_LEN=\#80! bytes
+HOLD_SIZE=\#34! bytes
! ============================================
! FastForth RAM memory map (>= 2k):
! ============================================
-LSATCK=\$1C00! \ leave stack, grow up
LEAVEPTR=\$1C00! \ Leave-stack pointer, init by QUIT
+LSATCK=\$1C00! \ leave stack, grow up
PSTACK=\$1C80! \ parameter stack, grow down
RSTACK=\$1CE0! \ Return stack, grow down
-PAD=\$1CE2! \ user scratch pad buffer, grow up
-TIB=\$1D38! \ Terminal input buffer, grow up
+PAD_ORG=\$1CE2! \ user scratch pad buffer, grow up
+TIB_ORG=\$1D38! \ Terminal input buffer, grow up
BASE_HOLD=\$1DAA! \ BASE HOLD area, grow down
! ----------------------
HandleOutOfBound=\$2100!
SDIB=\$2100!
-
+SDIB_LEN=\#84!
SD_END_DATA=\$2154!
\ No newline at end of file
@define{@read{/config/gema/MSP430FR5x6x.pat}}
+! \ RTC_C
+RTCCTL0_L=\$4A0! \ RTCCTL0_L
+RTCCTL0_H=\$4A1! \ RTCCTL0_H
+RTCCTL1=\$4A2! \ RTCCTL1
+RTCCTL3=\$4A3! \ RTCCTL3
+RTCPS0CTL=\$4A8! \ RTC prescaler 0 control
+RTCPS1CTL=\$4AA! \ RTC prescaler 1 control
+RTCPS0=\$4AC! \ RTC prescaler 0
+RTCPS1=\$4AD! \ RTC prescaler 1
+RTCIV=\$4AE! \ RTC interrupt vector word
+RTCSEC=\$4B0! \ RTC seconds, RTC counter register 1 RTCSEC,
+RTCMIN=\$4B1! \ RTC minutes, RTC counter register 2 RTCMIN,
+RTCHOUR=\$4B2! \ RTC hours, RTC counter register 3 RTCHOUR,
+RTCDOW=\$4B3! \ RTC day of week, RTC counter register 4 RTCDOW,
+RTCDAY=\$4B4! \ RTC days
+RTCMON=\$4B5! \ RTC month
+RTCYEAR=\$4B6!
+RTCYEARL=\$4B6! \ RTC year low
+RTCYEARH=\$4B7! \ RTC year high
+RTCAMIN=\$4B8! \ RTC alarm minutes
+RTCAHOUR=\$4B9! \ RTC alarm hours
+RTCADOW=\$4BA! \ RTC alarm day of week
+RTCADAY=\$4BB! \ RTC alarm days
+BIN2BCD=\$4BC! \ Binary-to-BCD conversion register
+BCD2BIN=\$4BE! \ BCD-to-binary conversion register
+RTCHOLD=\$40!
+RTCRDY=\$10!
+
! ----------------------------------------------
! MSP430FR6989 MEMORY MAP
! ----------------------------------------------
--- /dev/null
+@ECHO OFF
+
+:: ==============================================================================================
+:: your git copy of fast forth must be the root of a virtual drive
+:: ==============================================================================================
+
+IF "%1" == "" GOTO CopyError
+
+:: ==============================================================================================
+:: source file.f part
+:: %~dpn1.f is the symbolic source file.f described as drive\path\name.f
+:: %~dpn2.pat is the pattern file.pat for preprocessor gema.exe described as drive\path\name.pat
+:: %~dpn1.4th is the source file.4th to be sent to the target
+:: %~d1 is the drive of arg %1
+:: %~nx0 is name.ext of this bat file
+
+IF NOT EXIST %~dpn1.f GOTO 4th
+IF NOT EXIST %~dpn2.pat GOTO errorF
+
+IF /I "%3" == "" GOTO preprocessF
+
+:errorF
+@start %~d1\config\scite\AS_MSP430\Error.bat CopyErrorF %~nx0
+exit
+
+:preprocessF
+@%~d1\prog\gema\gema.exe -nobackup -line -t -f %~dpn2.pat %~dpn1.f %~dpn1.4th
+
+:DownloadF
+@taskkill /F /IM ttermpro.exe 1> NULL 2>&1
+
+:win32f
+@"C:\Program Files\teraterm\ttpmacro.exe" /V %~d1\config\scite\AS_MSP430\SendToSD.ttl %~dpn1.4th /C 1> NULL 2>&1
+@IF NOT ERRORLEVEL 1 GOTO EndF
+
+:win64f
+del null
+@"C:\Program Files (x86)\teraterm\ttpmacro.exe" /V %~d1\config\scite\AS_MSP430\SendToSD.ttl %~dpn1.4th /C
+
+:EndF
+@del %~dpn1.4th
+exit
+
+:: ==============================================================================================
+:: source file.4th part
+:: %~dpn1.4th is the file to be sent described as drive\path\name.4th
+:: %~d1 is the drive of param %1
+:: %~nx0 is name.ext of this bat file
+:: %2 must not exist
+
+:4th
+
+IF NOT EXIST %~dpn1.4th GOTO CopyError
+
+if /I "%2"=="" GOTO Download4th
+
+:Error4th
+@start %~d1\config\scite\AS_MSP430\Error.bat CopyError4th %~nx0
+exit
+
+:Download4th
+@taskkill /F /IM ttermpro.exe 1> NULL 2>&1
+
+:win324th
+@"C:\Program Files\teraterm\ttpmacro.exe" /V %~d0\config\scite\AS_MSP430\SendtoSD.ttl %~dpn1.4th /C 1> NULL 2>&1
+@IF NOT ERRORLEVEL 1 GOTO End4th
+
+:win644th
+del null
+@"C:\Program Files (x86)\teraterm\ttpmacro.exe" /V %~d0\config\scite\AS_MSP430\SendtoSD.ttl %~dpn1.4th /C
+
+:End4th
+exit
+
+
+:CopyError
+@start %~d1\config\scite\AS_MSP430\Error.bat CopyError %~nx0
+exit
--- /dev/null
+
+@GOTO %1
+
+:DownloadErrorF
+@call :before0
+@call :before
+@echo how to download a generic file.f to your target
+@echo -----------------------------------------------
+@echo 1- clic on your file.f,
+@echo 2- ctrl+clic on your selected target.pat file, for example MSP_EXP430FR5994.pat
+@echo 3- then drag and drop your file.f onto %2
+@echo the generic file.f is sent so to the preprocessor gema.exe which products a specific file.4th
+@echo which is itself downloaded onto target
+@echo.
+@pause
+exit
+
+:DownloadError4th
+@call :before0
+@call :before
+@echo how to download a file.4th to your target
+@echo -----------------------------------------
+@echo drag and drop your file.4th onto %2
+@echo.
+@pause
+exit
+
+:CopyErrorF
+@call :before0
+@call :before
+@echo how to copy a generic file.f to your SD_CARD target
+@echo ---------------------------------------------------
+@echo and a formatted FAT16/32 SD_CARD is in it's slot...
+@echo 1- clic on your file.f,
+@echo 2- ctrl+clic on your selected target.pat file, for example MSP_EXP430FR5994.pat
+@echo 3- release ctrl+clic
+@echo 4- then drag and drop your file.f onto %2
+@echo the generic file.f is sent so to the preprocessor gema.exe which products a specific file.4th
+@echo which is itself copied onto SD_CARD target
+@echo.
+@pause
+exit
+
+:CopyError4th
+@call :before0
+@call :before
+@echo how to copy a file.4th to the SD_CARD target
+@echo --------------------------------------------
+@echo and a formatted FAT16/32 SD_CARD is in it's slot...
+@echo drag and drop your file.4th onto %2
+@echo.
+@pause
+exit
+
+:ConvertError
+@call :before0
+@echo how to convert a generic file.f to a target specific file.4th
+@echo -------------------------------------------------------------
+@echo 1- clic on a file.f,
+@echo 2- ctrl+clic on your selected target.pat file, for example MSP_EXP430FR5994.pat
+@echo 3- release ctrl+clic
+@echo 4- then drag and drop your file.f onto %2
+@echo the generic file.f is sent so to the preprocessor gema.exe which products a specific file.4th
+@echo.
+@pause
+exit
+
+:DownloadError
+@call :before0
+@call :before
+@echo how to download a generic file.f to your target
+@echo -----------------------------------------------
+@echo 1- clic on your file.f,
+@echo 2- ctrl+clic on your selected target.pat file, for example MSP_EXP430FR5994.pat
+@echo 3- release ctrl+clic
+@echo 4- then drag and drop your file.f onto %2
+@echo the generic file.f is sent so to the preprocessor gema.exe which products a specific file.4th
+@echo which is itself downloaded onto target
+@echo.
+@echo how to download a file.4th to your target
+@echo -----------------------------------------
+@echo drag and drop your file.4th onto %2
+@echo.
+@pause
+exit
+
+
+:COPYError
+@call :before0
+@call :before
+@echo how to copy a generic file.f to your SD_CARD target
+@echo ---------------------------------------------------
+@echo and a formatted FAT16/32 SD_CARD is in it's slot...
+@echo 1- clic on your file.f,
+@echo 2- ctrl+clic on your selected target.pat file, for example MSP_EXP430FR5994.pat
+@echo 3- release ctrl+clic
+@echo 4- then drag and drop your file.f onto %2
+@echo the generic file.f is sent so to the preprocessor gema.exe which products a specific file.4th
+@echo which is itself copied onto SD_CARD target
+@echo.
+@echo how to download a file.4th to your target
+@echo -----------------------------------------
+@echo drag and drop your file.4th onto %2
+@echo.
+@pause
+exit
+
+
+:before0
+@echo you have downloaded your copy of gitlab fast forth onto a folder shared and connected as virtual drive (A: or B: ...)
+@echo so config files.pat for the preprocessor gema.exe are in the folder \config\gema\
+@echo and batch file are in the folder \config\scite\msp430_as\
+@echo you have installed the last version of teraterm,
+@echo you have installed the last version of gema.exe in the folder \prog\gema\.
+@echo.
+@echo edit properties of these three links SendSourceFileToTarget.bat, CopySourceFileToTarget_SD_Card.bat and
+@echo PreprocessSourceFile.f.bat to change the drive letter B: as yours.
+@echo.
+@exit /B
+
+:before
+@echo before sending a file
+@echo ---------------------
+@echo teraterm must be well configured, and its config must be saved,
+@echo so you must see the FAST FORTH prompt "ok" when you type "return" on the teraterm terminal.
+@echo.
+@exit /B
\ No newline at end of file
@ECHO OFF
-if not exist %~dpn1.hex goto eof
-if exist %2 goto eof
+if not exist %~dpn1.hex exit
+if exist %2 exit
a:\prog\srecord\srec_cat %~dpn1.hex -intel -output %~dpn1.txt -ti-txt
-:eof
exit
rem %1 is the target device, example: MSP430FR5969
\ No newline at end of file
--- /dev/null
+@ECHO OFF
+IF NOT EXIST %~dpn1.f GOTO error
+IF NOT EXIST %~dpn2.pat GOTO error
+
+IF "%3" == "" GOTO preprocess
+
+:error
+@start %~d1\config\scite\AS_MSP430\Error.bat ConvertError %~nx0
+exit
+
+:preprocess
+@%~d1\prog\gema\gema.exe -nobackup -line -t -f %~dpn2.pat %~dpn1.f %~dpn1.4th
+exit
+
+:: %~dpn1.f is the symbolic source file described as drive\path\name.f of first arg (%1)
+:: %~dpn2.pat is the pattern file for preprocessor gema.exe described as drive\path\name.pat of 2th arg (%2)
+:: %~dpn1.4th is the source file ready to send to the target
+:: %~d1 is the drive of arg %1
+:: %~nx0 is name.ext of this bat file
+
+rem your git copy must be the root of a virtual drive
+
statusbar.text.1=\
li=$(LineNumber) co=$(ColumnNumber) $(OverType) ($(EOLMode)) $(FileAttr)
statusbar.text.2=\
-$(BufferLength) chars in $(NbOfLines) lines. Sel: $(SelLength) chars.
+$(BufferLength) chars in $(NbOfLines) lines. Sel: $(SelHeight) lines, $(SelLength) chars.
statusbar.text.3=\
Now is: Date=$(CurrentDate) Time=$(CurrentTime)
statusbar.text.4=\
# to the types of files seen when opening.
# There is a limit (possibly 256 characters) to the length of a filter,
# so not all source extensions can be in this setting.
-#*.idl;*.odl;*.rc;*.rc2;*.dlg;*.def;make*;*.mak;\
-#*.frm;*.cls;*.ctl;;*.pl;;*.iface;*.e;#*.rb;*.cgi;*.lua;\
-#source.files=*.asm;*.c;*.cc;*.f;*.ff;*.far;*.cpp;*.cxx;*.cs;*.h;*.hh;*.hxx;*.hpp;\
-source.files=*.asm;*.avr;*.tiny;*.mega;*.vb;*.vbs;*.bas;*.bat;*.ini;*.py;*.js;*.properties;*.vhd;*.vhdl
+source.files=*.asm;*.inc;*.pat;*.f;*.4th;*.bat
# Each platform has a different idea of the most important filters
if PLAT_WIN
all.files=All Files (*.*)|*.*|
- top.filters=All Source|$(source.files)|$(all.files)
+ top.filters=$(all.files)All Source|$(source.files)|
if PLAT_GTK
all.files=All Files (*)|*|Hidden Files (.*)|.*|
top.filters=All Source|$(source.files)|$(all.files)
--- /dev/null
+
+@GOTO %1
+
+:DownloadErrorF
+@call :before
+@echo how to download a generic file.f to your target
+@echo -----------------------------------------------
+@echo 1- clic on your file.f,
+@echo 2- ctrl clic on your selected target.pat file, for example MSP_EXP430FR5994.pat
+@echo 3- then drag and drop your file.f onto %2
+@echo the generic file.f is sent so to the preprocessor gema.exe which products a specific file.4th
+@echo which is itself downloaded onto target
+@echo.
+@pause
+exit
+
+:DownloadError4th
+@call :before
+@echo how to download a file.4th to your target
+@echo -----------------------------------------
+@echo drag and drop your file.4th onto %2
+@echo.
+@pause
+exit
+
+:CopyErrorF
+@call :before
+@echo how to copy a generic file.f to your SD_CARD target
+@echo ---------------------------------------------------
+@echo and a formatted FAT16/32 SD_CARD is in it's slot...
+@echo 1- clic on your file.f,
+@echo 2- ctrl clic on your selected target.pat file, for example MSP_EXP430FR5994.pat
+@echo 3- then drag and drop your file.f onto %2
+@echo the generic file.f is sent so to the preprocessor gema.exe which products a specific file.4th
+@echo which is itself copied onto SD_CARD target
+@echo.
+@pause
+exit
+
+:CopyError4th
+@call :before
+@echo how to copy a file.4th to the SD_CARD target
+@echo --------------------------------------------
+@echo and a formatted FAT16/32 SD_CARD is in it's slot...
+@echo drag and drop your file.4th onto %2
+@echo.
+@pause
+exit
+
+:ConvertError
+@echo you have downloaded your copy of gitlab fast forth onto a folder shared and connected as virtual drive (A: or B: ...)
+@echo so config files.pat for the preprocessor gema.exe are in the folder \config\gema\
+@echo and batch file are in the folder \config\scite\msp430_as\
+@echo you have installed the last version of gema.exe in the folder \prog\gema\.
+@echo.
+@echo how to convert a generic file.f to a file.4th specific to a target
+@echo ------------------------------------------------------------------
+@echo 1- clic on a file.f,
+@echo 2- ctrl clic on your selected target.pat file, for example MSP_EXP430FR5994.pat
+@echo 3- clic selected file.f then drag and drop it on to %2
+@echo the generic file.f is sent so to the preprocessor gema.exe which products a specific file.4th
+@echo.
+@pause
+exit
+
+:DownloadError
+@echo you have downloaded your copy of gitlab fast forth onto a folder shared and connected as virtual drive (A: or B: ...)
+@echo so config files.pat for the preprocessor gema.exe are in the folder \config\gema\
+@echo and batch file are in the folder \config\scite\msp430_as\
+@echo you have installed the last version of teraterm,
+@echo you have installed the last version of gema.exe in the folder \prog\gema\.
+@echo.
+@echo edit properties of these three links SendSourceFileToTarget.bat, CopySourceFileToTarget_SD_Card.bat and
+@echo PreprocessSourceFile.f.bat to change the drive letter B: as yours.
+@echo.
+@call :before
+@echo how to download a generic file.f to your target
+@echo -----------------------------------------------
+@echo 1- clic on your file.f,
+@echo 2- ctrl clic on your selected target.pat file, for example MSP_EXP430FR5994.pat
+@echo 3- then drag and drop your file.f onto %2
+@echo the generic file.f is sent so to the preprocessor gema.exe which products a specific file.4th
+@echo which is itself downloaded onto target
+@echo.
+@echo how to download a file.4th to your target
+@echo -----------------------------------------
+@echo drag and drop your file.4th onto %2
+@echo.
+@pause
+exit
+
+
+:before
+@echo before sending a file
+@echo ---------------------
+@echo teraterm must be well configured, and its config must be saved,
+@echo so you must see the FAST FORTH prompt "ok" when you type "return" on the teraterm terminal.
+@echo.
connect param3
-sendln ' $0A BASE ! STOP' ; blanks are to pass LPMx wake up time...
+sendln ' $0A BASE ! ECHO STOP' ; blanks are to pass LPMx wake up time...
inputbox 'Send a File' 'Select File : ' param2
sendfile inputstr 0
showtt 1
+
end
; param1 = this macro
; param2 = file to send
; param3 = "/C"
+; param4 = ECHO or NOECHO
\ No newline at end of file
--- /dev/null
+@ECHO OFF
+
+:: ==============================================================================================
+:: your git copy of fast forth must be the root of a virtual drive
+:: ==============================================================================================
+
+IF "%1" == "" GOTO DownloadError
+
+:: ==============================================================================================
+:: source file.f part
+:: %~dpn1.f is the symbolic source file.f described as drive\path\name.f
+:: %~dpn2.pat is the pattern file.pat for preprocessor gema.exe described as drive\path\name.pat
+:: %~dpn1.4th is the source file.4th to be sent to the target
+:: %~d1 is the drive of arg %1
+:: %~nx0 is name.ext of this bat file
+
+IF NOT EXIST %~dpn1.f GOTO 4th
+IF NOT EXIST %~dpn2.pat GOTO errorF
+
+IF /I "%3" == "" GOTO preprocessF
+IF /I "%3" == "ECHO" GOTO preprocessF
+IF /I "%3" == "NOECHO" GOTO preprocessF
+
+:errorF
+@start %~d1\config\scite\AS_MSP430\Error.bat DownloadErrorF %~nx0
+exit
+
+:preprocessF
+@%~d1\prog\gema\gema.exe -nobackup -line -t -f %~dpn2.pat %~dpn1.f %~dpn1.4th
+
+:DownloadF
+@taskkill /F /IM ttermpro.exe 1> NULL 2>&1
+
+:Win32F
+@"C:\Program Files\teraterm\ttpmacro.exe" /V %~d1\config\scite\AS_MSP430\SendFile.ttl %~dpn1.4th /C %3 1> NULL 2>&1
+@IF NOT ERRORLEVEL 1 GOTO EndF
+
+:Win64F
+del null
+@"C:\Program Files (x86)\teraterm\ttpmacro.exe" /V %~d1\config\scite\AS_MSP430\SendFile.ttl %~dpn1.4th /C %3
+
+:EndF
+@del %~dpn1.4th
+exit
+
+
+:: ==============================================================================================
+:: source file.4th part
+:: %~dpn1.4th is the file to be sent described as drive\path\name.4th
+:: %~d1 is the drive of param %1
+:: %~nx0 is name.ext of this bat file
+
+:4th
+
+IF NOT EXIST %~dpn1.4th GOTO DownloadError
+
+if /I "%2"=="" GOTO Download4th
+if /I "%2"=="ECHO" GOTO Download4th
+if /I "%2"=="NOECHO" GOTO Download4th
+
+:Error4th
+@start %~d1\config\scite\AS_MSP430\Error.bat DownloadError4th %~nx0
+exit
+
+:Download4th
+@taskkill /F /IM ttermpro.exe 1> NULL 2>&1
+
+:Win324th
+@"C:\Program Files\teraterm\ttpmacro.exe" /V %~d1\config\scite\AS_MSP430\SendFile.ttl %~dpn1.4th /C %2 1> NULL 2>&1
+@IF NOT ERRORLEVEL 1 GOTO End4th
+
+:Win644th
+del null
+@"C:\Program Files (x86)\teraterm\ttpmacro.exe" /V %~d1\config\scite\AS_MSP430\SendFile.ttl %~dpn1.4th /C %2
+
+:End4th
+exit
+
+
+:DownloadError
+@start %~d1\config\scite\AS_MSP430\Error.bat DownloadError %~nx0
+exit
sendln ' $0A BASE ! ECHO STOP' ; blanks are added to pass LPMx wake up time...
-inputbox 'here you can add a path to the file: ' 'Send a File to SD_CARD target' fname
+inputbox 'here you can modify destination: ' 'Send a File to SD_CARD target' fname
sendln 'TERM2SD" ' inputstr '"' ; send to FastForth the command TERM2SD" \file.ext" ...with optionnal path added in inputbox
+++ /dev/null
-
-; param1 = this macro filename
-; param2 = pathname of the bat file
-; param3 = /C = default COM saved in TERATERM.INI with all its parameters.
-
-timeout=0 ; 0 s
-mtimeout=100 ; + 100 ms = 100 ms
-noname = '\'
-connect param3
-
-; blanks are added to pass LPMx wake up time...
-sendln ' $0A BASE ! ECHO STOP'
-
-
-; first input box to define file to be read
-inputbox 'select SD_CARD file to be read:' 'SD_CARD file' '\'
-
-strcompare inputstr noname
-if result=0 then
-goto end
-endif
-
-fileorg = inputstr
-namedst = inputstr
-
-strremove namedst 1 1
-dirdst = param2 ; disdst = path of bat file
-makepath filedst dirdst namedst ; filedst = pathname of file selected in windows 2
-
-
-; 2th input box to define destination file with param1 path
-inputbox 'select destination file:' 'destination file' filedst
-
-filecreate filehandle inputstr
-
-;setsync 1 ; enter synchronous mode
-
-; send to FastForth the command TERM2SD" \file.ext"...
-; ...with optionnal path added in first inputbox
-sendln 'SD2TERM" ' fileorg '"'
-
-recvln ; keep sendln 'SD2TERM" ' fileorg '"'
-recvln ; keep FastForth response
-
-:start
-
-recvln ; receive one line
-
-if result=0 then ; case of timeout
- fileclose filehandle
- goto end
-endif
-
-filewriteln filehandle inputstr ; write it to output file
-
-send #17 ; send XON
-
-goto start
-
-:end
-
-;setsync 0 ; enter asynchronous mode
-
-showtt 1
-
-closett
-end
\ No newline at end of file
+++ /dev/null
-@ECHO OFF
-if not exist %~dpn1%.4th goto error
-if exist %2 goto error
-taskkill /F /IM ttermpro.exe 1> NULL 2>&1
-@"C:\Program Files\teraterm\ttpmacro.exe" /V %~d0\config\scite\AS_MSP430\SendtoSD.ttl %~dpn1%.4th /C 1> NULL 2>&1
-if ERRORLEVEL 1 goto nextcmd
-exit
-
-:nextcmd
-del null
-@"C:\Program Files (x86)\teraterm\ttpmacro.exe" /V %~d0\config\scite\AS_MSP430\SendtoSD.ttl %~dpn1%.4th /C
-exit
-
-:error
-
-@start %~d0\config\scite\AS_MSP430\error4thtoSDCARD.bat
-exit
-
-rem %~d0% is the drive of bat file
-rem %~dpn1%.4th is the file to send described as drive\path\name.4th of param %1
-rem %~d1 is the drive of param %1
+++ /dev/null
-@ECHO OFF
-if not exist %~dpn1.4th goto error
-
-if "%2"=="" GOTO testend
-if /I "%2"=="ECHO" GOTO testend
-if /I "%2"=="NOECHO" GOTO testend
-
-:error
-start %~d1\config\scite\AS_MSP430\error4th.bat
-exit
-
-
-
-
-
-:testend
-taskkill /F /IM ttermpro.exe 1> NULL 2>&1
-@"C:\Program Files\teraterm\ttpmacro.exe" /V %~d1\config\scite\AS_MSP430\SendFile.ttl %~dpn1.4th /C %2 1> NULL 2>&1
-if ERRORLEVEL 1 goto nextcmd
-exit
-
-:nextcmd
-del null
-@"C:\Program Files (x86)\teraterm\ttpmacro.exe" /V %~d1\config\scite\AS_MSP430\SendFile.ttl %~dpn1.4th /C %2
-:eof
-exit
-
-
-
-rem %~dpn1.4th is the file to send described as drive\path\name.4th of param %1
-rem %~d1 is the drive of param %1
-
-
-
-
# asm styles
#MSP430_instructions
-keywords.$(file.patterns.asm)=adc adc.b adc.w add add.b add.w addc addc.b addc.w and and.b and.w \
- bic bic.b bic.w bis bis.b bis.w bit bit.b bit.w br branch call clrc clrn clrz dint eint \
- clr clr.b clr.w cmp cmp.b cmp.w dadc dadc.b dadc.w dadd dadd.b dadd.w dec dec.b dec.w decd decd.b decd.w \
- inc inc.b inc.w incd incd.b incd.w inv inv.b inv.w mov mov.b mov.w pop pop.b pop.w push push.b push.w \
- jc jhs je jeq jz jge jl jmp jn jnc jlo jne jnz nop nop2 nop3 nop4 nop5 nop6 nop7 ret reti setc setn setz swpb sxt \
- rla rla.b rla.w rlc rlc.b rlc.w rra rra.b rra.w rrc rrc.b rrc.w sbc sbc.b sbc.w sub sub.b sub.w \
- subc subc.b subc.w sbb sbb.b sbb.w tst tst.b tst.w xor xor.b xor.w \
+keywords.$(file.patterns.asm)=add add.b add.w addc addc.b addc.w and and.b and.w \
+ bic bic.b bic.w bis bis.b bis.w bit bit.b bit.w br branch call \
+ cmp cmp.b cmp.w dadd dadd.b dadd.w \
+ mov mov.b mov.w push push.b push.w \
+ jc jhs je jeq jz jge jl jmp jn jnc jlo jne jnz \
+ nop nop2 nop3 ret reti swpb sxt \
+ rra rra.b rra.w rrc rrc.b rrc.w sub sub.b sub.w \
+ subc subc.b subc.w xor xor.b xor.w \
pushm popm rlam rram rrcm rrum
##preprocessor
# the star at the start of this command line is to display the parameters box
-# write the name of the device in the first parameter; example : MSP430fr5969
-# write the name of the target in the 2th parameter; example : MSP_EXP430fr5969
+# copy the name of the target in the first parameter; example : MSP_EXP430FR5969
-command.name.0.*.asm=Assembler 1:[device] 2:[target]
-command.0.*.asm=*\config\scite\AS_MSP430\build.bat $(FileNameExt) $(2)$(3)
+command.name.0.*.asm=Assemble for 1:[target]
+command.0.*.asm=*\config\scite\AS_MSP430\build.bat $(FileNameExt) $(1)$(2)
-command.name.1.*.asm=FET Prog 1:[device] 2:[target]
-command.1.*.asm=*\config\scite\AS_MSP430\prog.bat $(1) $(2)$(3).txt
+command.name.1.*.asm=FET Prog 1:[target]
+command.1.*.asm=*\config\scite\AS_MSP430\prog.bat $(1)$(2)
+
+
+command.name.2.*.asm=Assemble for target CurrentSelection
+command.2.*.asm=\config\scite\AS_MSP430\build.bat $(FileNameExt) $(CurrentSelection)
+
+command.name.3.*.asm=FET Prog target CurrentSelection
+command.3.*.asm=\config\scite\AS_MSP430\prog.bat $(CurrentSelection)
@ECHO OFF
-\prog\MacroAssemblerAS\bin\asw -L -i \projets\msp430 %1 -o %2.p
-\prog\MacroAssemblerAS\bin\p2hex %2.p -r 0x0000-0xffff
-\prog\srecord\srec_cat %2.hex -intel -output %2.txt -ti-txt
+%~d1\prog\MacroAssemblerAS\bin\asw -L -i \projets\msp430 %1 -o %2.p
+%~d1\prog\MacroAssemblerAS\bin\p2hex %2.p -r 0x0000-0xffff
+%~d1\prog\srecord\srec_cat %2.hex -intel -output %2.txt -ti-txt
del %2.p
del %2.hex
exit
-rem %1 is the target device, example: MSP430FR5969
-rem %2 is the target, example: MSP_EXP430FR5969
\ No newline at end of file
+rem your git copy must be the root of a virtual drive
+
+rem %1 is the input file.asm
+rem %2 is the target name, plus optional infos
+++ /dev/null
-@ECHO OFF
-if not exist %~dpn1.f goto error
-if not exist %~dpn2.pat goto error
-if exist %3 goto error
-@%~d1\prog\gema\gema.exe -nobackup -line -t -f %~dpn2.pat %~dpn1.f %~dpn1.4th
-exit
-
-:error
-
-@start %~d1\config\scite\AS_MSP430\errorfto4th.bat
-exit
-
-
-
-exit
-%~dpn1.f is the symbolic source file described as drive\path\name.f of first arg (%1)
-%~dpn2.pat is the pattern file for preprocessor gema.exe described as drive\path\name.pat of 2th arg (%2)
-%~dpn1.4th is the source file ready to send to the target
-%~d1 is the drive of arg %1
+++ /dev/null
-
-@echo how to download a file.4th to your target
-@echo -----------------------------------------
-@echo I presume you are connected to your fastforth target via input terminal TERATERM.EXE
-@echo drag and drop your file.4th onto Send_file.4th_to_target.bat
-
-@pause
-exit
-
+++ /dev/null
-
-@echo how to copy a file.4th to the SD_CARD target
-@echo --------------------------------------------
-@echo I presume you are connected via TERATERM.EXE to your fastforth target with its SD_CARD extensions,
-@echo and a formatted FAT 16 SD_CARD is in it's slot...
-@echo drag and drop your file.4th onto Send_File.4th_to_SD_CARD_target.bat
-
-@pause
-exit
-
+++ /dev/null
-
-@echo how to download a generic file.f to your target
-@echo -----------------------------------------------
-@echo I presume you are connected to your fastforth target via input terminal TERATERM.EXE
-@echo 1- clic on your file.f,
-@echo 2- ctrl clic on your selected target.pat file, for example MSP_EXP430FR5994.pat
-@echo 3- then drag and drop your file.f onto Send_File.f_to_SD_CARD_target.bat
-@echo the generic file.f is sent so to the preprocessor gema.exe which products a specific file.4th
-@echo which is itself loaded by FastForth onto target
-
-@pause
-exit
+++ /dev/null
-
-@echo how to convert a generic file.f to a file.4th specific to a target
-@echo ------------------------------------------------------------------
-@echo I presume you are connected to your fastforth target via input terminal TERATERM.EXE
-@echo 1- clic on a file.f,
-@echo 2- ctrl clic on your selected target.pat file, for example MSP_EXP430FR5994.pat
-@echo 3- clic selected file.f then drag and drop it on to Convert_file.f_to_file.4th.bat
-@echo the generic file.f is sent so to the preprocessor gema.exe which products specific the file.4th
-@pause
-exit
+++ /dev/null
-
-
-@echo how to copy a generic file.f to your SD_CARD target
-@echo ---------------------------------------------------
-@echo I presume you are connected via TERATERM.EXE to your fastforth target with its SD_CARD extensions,
-@echo and a formatted FAT 16 SD_CARD is in it's slot...
-@echo 1- clic on your file.f,
-@echo 2- ctrl clic on your selected target.pat file, for example MSP_EXP430FR5994.pat
-@echo 3- then drag and drop your file.f onto Send_File.f_to_SD_CARD_target.bat
-@echo the generic file.f is sent so to the preprocessor gema.exe which products a specific file.4th
-@echo which is itself copied onto SD_CARD target
-
-@pause
-exit
-
+++ /dev/null
-
-
-@echo how to receive a file from target SD_CARD
-@echo -----------------------------------------
-@echo I presume you are connected via TERATERM.EXE to your fastforth target with its SD_CARD extensions,
-@echo and a formatted FAT 16 SD_CARD is in it's slot...
-@echo 1- drag and drop any file.f/.4th of your destination folder onto Receive_file_from_SD_CARD_target.bat
-@echo this defines path for 2th window below
-@echo 2- in the first window opened by TERATERM select the SD_CARD file you want upload
-@echo 3- in the 2th window, change if necessary filename to be written on your PC.
-@echo 4- wait for TERATERM window blinking (at 15kb/s, this may do a long time): it's done.
-
-@pause
-exit
-
# control keywords Forth
keywords.$(file.patterns.forth)=\
again begin case do else endcase endof if loop +loop leave unloop of repeat then until while ?do \
-< > >= = <> 0<> 0= 0< <0 0>= u< u>= S< S>= jmp goto bw1 bw2 bw3 fw1 fw2 fw3
+< > >= = <> 0<> 0= 0< <0 0>= u< u>= s< s>= jmp goto ?goto bw1 bw2 bw3 fw1 fw2 fw3
# Keywords
keywords2.$(file.patterns.forth)=\
keywords3.$(file.patterns.forth)=\
code endcode : ; \
lo2hi hi2lo colon asm endasm \
+\[if] \[else] \[then] \[undefined] \[defined]
# MSP430 assembly words & MSP430_instructions
keywords4.$(file.patterns.forth)=\
style.forth.3=fore:#FFFFFF
# control (keyword_FORTH_CONTROL)
-style.forth.4=fore:#007f7F
+style.forth.4=fore:#00bfbF
# Keywords (keyword2_SCE_FORTH_KEYWORD)
style.forth.5=fore:#FF0FF,$(font.base)
style.forth.8=fore:#FFFF00,$(font.base)
# number (SCE_FORTH_NUMBER)
-style.forth.9=fore:#007F7F,$(font.base)
+style.forth.9=fore:#00BFBF,$(font.base)
# Double quoted string (SCE_FORTH_STRING)
style.forth.10=fore:#00FFFF,$(font.base)
# locale
-style.forth.11=fore:#0000CC,$(font.base)
+style.forth.11=fore:#0077FF,$(font.base)
#command.compile.*.f=spf.cmd $(FileNameExt)
-command.name.0.*.f=preprocess file.f with 2:[target].pat then send file.4th to [target] with ECHO
-command.0.*.f=*\config\scite\AS_MSP430\send_file.f_to_target.bat $(FileDir)\$(FileName).f $(2) ECHO
+command.name.0.*.f=preprocess file.f with 1:[target].pat then send file.4th to [target] with ECHO
+command.0.*.f=*\config\scite\AS_MSP430\SendSourceFileToTarget.bat $(FileDir)\$(FileName).f $(1) ECHO
-command.name.1.*.f=preprocess file.f with 2:[target].pat then send file.4th to [target] without ECHO
-command.1.*.f=*\config\scite\AS_MSP430\send_file.f_to_target.bat $(FileDir)\$(FileName).f $(2) NOECHO
+command.name.1.*.f=preprocess file.f with 1:[target].pat then send file.4th to [target] without ECHO
+command.1.*.f=*\config\scite\AS_MSP430\SendSourceFileToTarget.bat $(FileDir)\$(FileName).f $(1) NOECHO
-command.name.2.*.f=preprocess file.f with 2:[target].pat then send file.4th to [target] SD_CARD
-command.2.*.f=*\config\scite\AS_MSP430\send_file.f_to_SD_CARD_target.bat $(FileDir)\$(FileName).f $(2)
+command.name.2.*.f=preprocess file.f with 1:[target].pat then send file.4th to [target] SD_CARD
+command.2.*.f=*\config\scite\AS_MSP430\CopySourceFileToTarget_SD_Card.bat $(FileDir)\$(FileName).f $(1)
-command.name.3.*.f=preprocess file.f with 2:[target].pat to file.4th (for debug)
-command.3.*.f=*\config\scite\AS_MSP430\convert_file.f_to_file.4th.bat $(FileDir)\$(FileName).f $(2)
+command.name.3.*.f=preprocess file.f with 1:[target].pat to file.4th (for debug)
+command.3.*.f=*\config\scite\AS_MSP430\PreprocessSourceFile.f.bat $(FileDir)\$(FileName).f $(1)
command.name.4.*.f=convert FORTH registers to TI's ones
command.4.*.f=\prog\gema\gema -line -t -f \config\gema\FastForthREGtoTI.pat $(FileNameExt) $(FileNameExt)
command.name.0.*.4th=send file.4th to [target] with ECHO
-command.0.*.4th=*\config\scite\AS_MSP430\send_file.4th_to_target.bat $(FileDir)\$(FileName).4th ECHO
+command.0.*.4th=*\config\scite\AS_MSP430\SendSourceFileToTarget.bat $(FileDir)\$(FileName).4th ECHO
command.name.1.*.4th=send file.4th to [target] without ECHO
-command.1.*.4th=*\config\scite\AS_MSP430\send_file.4th_to_target.bat $(FileDir)\$(FileName).4th NOECHO
+command.1.*.4th=*\config\scite\AS_MSP430\SendSourceFileToTarget.bat $(FileDir)\$(FileName).4th NOECHO
command.name.2.*.4th=send file.4th to [target] SD_CARD
-command.2.*.4th=*\config\scite\AS_MSP430\send_file.4th_to_SD_CARD_target.bat $(FileDir)\$(FileName).4th
+command.2.*.4th=*\config\scite\AS_MSP430\CopySourceFileToTarget_SD_Card.bat $(FileDir)\$(FileName).4th
command.name.3.*.4th=convert TI registers to FORTH's ones
-command.3.*.4th=*\prog\gema\gema -line -t -f \config\gema\TiREGtoFastForth.pat $(FileNameExt) $(FileNameExt)
+command.3.*.4th=\prog\gema\gema -line -t -f \config\gema\TiREGtoFastForth.pat $(FileNameExt) $(FileNameExt)
command.name.4.*.4th=convert FORTH registers to TI's ones
-command.4.*.4th=*\prog\gema\gema -line -t -f \config\gema\FastForthREGtoTI.pat $(FileNameExt) $(FileNameExt)
+command.4.*.4th=\prog\gema\gema -line -t -f \config\gema\FastForthREGtoTI.pat $(FileNameExt) $(FileNameExt)
-\prog\MSP430Flasher\msp430flasher -s -m SBW2 -n %1 -v -w %2 -z [RESET,VCC]
-exit
-
-rem -s : force update
-rem -m : select SBW2 mode
-rem -n %1 : device
-rem -v : verify device
-rem -w %2 : file to be flashed
-rem -z [] : end of flasher behaviour
\ No newline at end of file
+::@echo off
+
+@set device=%~n1
+@if %device:~0,16% == MSP_EXP430FR5739 set device=MSP430FR5739
+@if %device:~0,16% == MSP_EXP430FR5969 set device=MSP430FR5969
+@if %device:~0,16% == MSP_EXP430FR5994 set device=MSP430FR5994
+@if %device:~0,16% == MSP_EXP430FR6989 set device=MSP430FR6989
+@if %device:~0,16% == MSP_EXP430FR4133 set device=MSP430FR4133
+@if %device:~0,16% == CHIPSTICK_FR2433 set device=MSP430FR2433
+
+@if %device:~0,15% == MY_MSP430FR5738 set device=MSP430FR5738
+@if %device:~0,15% == MY_MSP430FR5948 set device=MSP430FR5948
+@if %device:~0,17% == MY_MSP430FR5738_1 set device=MSP430FR5738
+@if %device:~0,17% == MY_MSP430FR5738_2 set device=MSP430FR5738
+@if %device:~0,17% == MY_MSP430FR5948_1 set device=MSP430FR5948
+@if %device:~0,7% == JMJ_BOX set device=MSP430FR5738
+@if %device:~0,13% == PA8_PA_MSP430 set device=MSP430FR5738
+@if %device:~0,12% == PA_PA_MSP430 set device=MSP430FR5738
+@if %device:~0,14% == PA_Core_MSP430 set device=MSP430FR5948
+
+ %~d1\prog\MSP430Flasher\msp430flasher -s -m SBW2 -n %device% -v -w %~n1.txt -z [RESET,VCC]
+
+@exit
+
+:: your git copy must be the root of a virtual drive
+
+:: %n1 = file filename (= target) to flash
+:: -s : force update
+:: -m : select SBW2 mode
+:: -n %device% : device set from %n1
+:: -v : verify device
+:: -w %~dpn1.txt : file to be flashed
+:: -z [] : end of flasher behaviour
+++ /dev/null
-@ECHO OFF
-if not exist %~dpn1.f goto error
-if not exist %~dpn2.pat goto error
-if exist %3 goto error
-@%~d1\prog\gema\gema.exe -nobackup -line -t -f %~dpn2.pat %~dpn1.f %~dpn1.4th
-@taskkill /F /IM ttermpro.exe 1> NULL 2>&1
-@"C:\Program Files\teraterm\ttpmacro.exe" /V %~d1\config\scite\AS_MSP430\SendToSD.ttl %~dpn1.4th /C 1> NULL 2>&1
-if ERRORLEVEL 1 goto nextcmd
-exit
-
-:nextcmd
-del null
-@"C:\Program Files (x86)\teraterm\ttpmacro.exe" /V %~d1\config\scite\AS_MSP430\SendToSD.ttl %~dpn1.4th /C
-@del %~dpn1.4th
-:eof
-exit
-
-:error
-
-@start %~d1\config\scite\AS_MSP430\errorftoSDCARD.bat
-exit
-
-rem %~dpn1.f is the symbolic source file described as drive\path\name.f of first arg (%1)
-rem %~dpn2.pat is the pattern file for preprocessor gema.exe described as drive\path\name.pat of 2th arg (%2)
-rem %~dpn1.4th is the source file send to the target
-rem %~d1 is the drive of arg %1
-
+++ /dev/null
-@ECHO OFF
-IF NOT EXIST %~dpn1.f GOTO error
-IF NOT EXIST %~dpn2.pat GOTO error
-
-if "%3"=="" goto testend
-if /I "%3"=="ECHO" GOTO testend
-if /I "%3"=="NOECHO" GOTO testend
-
-:error
-@start %~d1\config\scite\AS_MSP430\errorf.bat
-exit
-
-
-:testend
-@%~d1\prog\gema\gema.exe -nobackup -line -t -f %~dpn2.pat %~dpn1.f %~dpn1.4th
-
-@taskkill /F /IM ttermpro.exe 1> NULL 2>&1
-@"C:\Program Files\teraterm\ttpmacro.exe" /V %~d1\config\scite\AS_MSP430\SendFile.ttl %~dpn1.4th /C %3 1> NULL 2>&1
-if ERRORLEVEL 1 goto nextcmd
-exit
-
-:nextcmd
-del null
-@"C:\Program Files (x86)\teraterm\ttpmacro.exe" /V %~d1\config\scite\AS_MSP430\SendFile.ttl %~dpn1.4th /C %3
-@del %~dpn1.4th
-:eof
-exit
-
-
-rem %~dpn1.f is the symbolic source file described as drive\path\name.f of first arg (%1)
-rem %~dpn2.pat is the pattern file for preprocessor gema.exe described as drive\path\name.pat of 2th arg (%2)
-rem %~dpn1.4th is the source file send to the target
-rem %~d1 is the drive of arg %1
-
--- /dev/null
+;
+; tera term mecrisp-stellaris forth upload helper
+; Copyright (C) 2015 Jean Jonethal
+;
+; This program is free software: you can redistribute it and/or modify
+; it under the terms of the GNU General Public License as published by
+; the Free Software Foundation, either version 3 of the License, or
+; (at your option) any later version.
+;
+; This program is distributed in the hope that it will be useful,
+; but WITHOUT ANY WARRANTY; without even the implied warranty of
+; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+; GNU General Public License for more details.
+;
+; You should have received a copy of the GNU General Public License
+; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+; small upload macro for uploading forth source via tera term tested with version 4.88
+; Tera Term website http://ttssh2.osdn.jp/index.html.en
+; tera term supports call stack up to 10 levels on my laptop so using iterative approach here
+
+; upload source file to target line by line and waits for "ok." after transmission of line.
+; supports nesting include with pathname
+; line containing include directive is not sent to target
+; max source line length is 511
+; include path\filename.ext
+
+; example project.txt :
+; include dump.txt
+; include ..\common\disassembler-m3.txt
+; include demo2.fth
+
+; TODO:
+; "require" - support for single inclusion
+; error handling for MAXLEVEL
+; path handling relative to root file
+; test path handling
+
+; global definitions
+MAXLEVEL = 20 ; max nesting level up to 65536 levels might be supported by tera term
+MAX_LINE_LENGTH = 511 ; max string/line length supported by tera term
+INCLUDE_PATTERN = "include\s+([\.\w/:\\-]+)" ; this pattern marks our include file
+SOURCE_PATTERN = "^([^\\]+)" ; skip line comments
+timeout = 5 ; you might tune this for longer response times
+mtimeout = 500 ; wait 500 ms for "ok." response
+infilehandle = -1 ; current file handle
+fname = "" ; current filename
+newfileHandle = -1 ; store the new file handle
+; parameter stack ; stack rised upwards
+level = 1 ; current include level
+intdim FileHandleStack MAXLEVEL ; file handle stack
+intdim clp MAXLEVEL ; line position stack - unused at the moment
+strdim LineStack MAXLEVEL ; line stack - unused at the moment
+strdim FileNameStack MAXLEVEL ; filename stack
+
+
+; check for macro parameter
+if paramcnt = 2 then ; if there is a macro parameter use it as input file name
+ fname = param2
+endif
+strlen fname
+if result = 0 then ; if there is no valid parameter open file dialog for selection
+ filenamebox "select file" 0
+ fname = inputstr
+ messagebox fname "opened"
+endif
+
+dirname prjdir fname ; dirname <strvar> <path> setup current directory to fname
+setdir prjdir ; setdir <dir> set macrodir to directory containing file fname
+
+call uploading
+goto ende
+
+:uploading
+ fileopen infilehandle fname 0 1 ; fileopen <file handle> <filename> <append flag> [<readonly flag>]
+ if infilehandle <> -1 then ; if file open successful
+ level = 1 ; we start at level 1
+ FileNameStack[level] = fname ;
+ FileHandleStack[level] = infilehandle
+ while 1 ; infinite loop !
+ infilehandle = FileHandleStack[level] ; update current file handle
+ filereadln infilehandle line ; filereadln <file handle> <strvar> get next line from this file
+ if result = 0 then
+ call processLine
+ else ; end of file (it is the last line of file)
+ call levelback ; close file , back one nesting level
+ if level < 1 then ; upper most file ended
+ messagebox fname "Finished" ; notify user
+ break
+ endif
+ endif
+ endwhile
+ endif
+return
+
+:levelback
+; close file and switch to previous level
+
+ fileclose infilehandle
+ level = level - 1
+ if level > 0 then ; back to previous level
+ infilehandle = FileHandleStack[level]
+ fname = FileNameStack[level]
+ else
+ infilehandle = -1
+ FileHandleStack[level] = -1
+ endif
+return
+
+:processLine
+; scan every line for include filename or send to target and wait for "ok."
+; line contains current line to be scanned
+
+ strmatch line INCLUDE_PATTERN ; scan the line for include pattern
+ if result > 0 then
+ fname = groupmatchstr1 ; found new include line
+ call openNewFile
+ else
+ call skipComment
+ send line #10 ; send line + LF
+ wait "ok."
+ endif
+return
+
+:openNewFile
+; start a new include level when open successfull
+; fname contains new include filename
+; notify user if failed to open included file
+
+ fileopen newfileHandle fname 0 1
+ if newfileHandle <> -1 then ; new include file opened
+ level = level + 1
+ infilehandle = newfileHandle
+ FileNameStack[level] = fname
+ FileHandleStack[level] = infilehandle
+ else
+ messagebox fname "open failed" ; notify user about failed file
+ endif
+return
+
+:skipComment
+; dont transfer comments
+ strmatch line SOURCE_PATTERN ; skip comments
+ if result > 0 then
+ line = groupmatchstr1
+ else
+ line = ""
+ endif
+return
+
+
+:ende
\ No newline at end of file
+++ /dev/null
-# SciTEDirectoriy.properties
-# For Windows, place in your directory project folder
-# Documentation at http://www.scintilla.org/SciTEDoc.html
-
-
-# Globals
-buffers.zorder.switching=1
-
-# Window sizes and visibility
-if PLAT_WIN
- position.left=-1
- position.top=0
-if PLAT_GTK
- position.left=5
- position.top=22
-position.width=1000
-position.height=768
-position.maximize=1
-#position.tile=1
-#full.screen.hides.menu=1
-minimize.to.tray=0
-split.vertical=1
-output.horizontal.size=400
-output.vertical.size=600
-output.initial.hide=1
-#horizontal.scrollbar=0
-#horizontal.scroll.width=10000
-#horizontal.scroll.width.tracking=0
-#output.horizontal.scrollbar=0
-#output.horizontal.scroll.width=10000
-#output.horizontal.scroll.width.tracking=0
-#output.scroll=0
-error.select.line=1
-#end.at.last.line=0
-tabbar.visible=1
-#tabbar.hide.one=1
-tabbar.multiline=0
-toolbar.visible=1
-#toolbar.detachable=1
-#toolbar.usestockicons=1
-#menubar.detachable=1
-#undo.redo.lazy=1
-statusbar.visible=1
-#fileselector.width=800
-#fileselector.height=600
-#fileselector.show.hidden=1
-magnification=0
-output.magnification=-4
-
-# Sizes and visibility in edit pane
-line.margin.visible=1
-line.margin.width=4
-margin.width=16
-fold.margin.width=0
-#fold.margin.colour=#00FF00
-#fold.margin.highlight.colour=#0000FF
-blank.margin.left=20
-#blank.margin.right=4
-buffered.draw=1
-#two.phase.draw=0
-use.palette=0
-
-
-#Element styles
-
-
-#view.eol=1
-#control.char.symbol=.
-caret.period=500
-view.whitespace=0
-view.indentation.whitespace=1
-view.indentation.guides=0
-view.indentation.examine=3
-highlight.indentation.guides=1
-caret.fore=#FF0000
-#caret.additional.blinks=0
-caret.width=3
-caret.line.back=#222222
-calltip.back=#FFF0FE
-edge.column=128
-edge.mode=1
-edge.colour=#C0DCC0
-braces.check=1
-braces.sloppy=1
-
-# black background
-selection.fore=#000000
-selection.alpha=256
-selection.back=#808080
-#selection.additional.fore=#0000A0
-#selection.additional.back=#000080
-#selection.additional.alpha=20
-#selection.multiple=0
-#selection.additional.typing=0
-#virtual.space=3
-#rectangular.selection.modifier=4
-#whitespace.fore=#FFFFFF
-#whitespace.back=#FFF0F0
-#error.marker.fore=#0000A0
-#error.marker.back=#DADAFF
-#bookmark.fore=#808000
-#bookmark.back=#FFFFA0
-#bookmark.alpha=
-#find.mark=#0000FF
-#highlight.current.word=1
-#highlight.current.word.by.style=1
-#highlight.current.word.colour=#00D040
-#indicators.alpha=63
-#indicators.under=1
-
-
-# Scripting
-ext.lua.startup.script=$(SciteUserHome)/SciTEStartup.lua
-ext.lua.auto.reload=1
-#ext.lua.reset=1
-
-
-# Checking
-are.you.sure=1
-#are.you.sure.for.build=1
-#save.all.for.build=1
-quit.on.close.last=1
-load.on.activate=1
-#save.on.deactivate=1
-are.you.sure.on.reload=1
-reload.preserves.undo=1
-#check.if.already.open=1
-#temp.files.sync.load=1
-default.file.ext=.txt
-#source.default.extensions=.h|.cxx|.bat
-title.full.path=1
-title.show.buffers=1
-pathbar.visible=1
-#save.recent=1
-#save.session=1
-#session.bookmarks=1
-#session.folds=1
-#save.position=1
-#open.dialog.in.file.directory=1
-#strip.trailing.spaces=1
-#ensure.final.line.end=1
-#ensure.consistent.line.ends=1
-#save.deletes.first=1
-#save.check.modified.time=1
-buffers=40
-buffers.zorder.switching=1
-#api.*.cxx=d:\api\w.api
-#import locale
-locale.properties=\config\scite\locale.fr.properties
-#win95.death.delay=1000
-#translation.missing=***
-#read.only=1
-#max.file.size=1
-
-# Indentation
-tabsize=4
-indent.size=4
-use.tabs=0
-#indent.auto=1
-indent.automatic=0
-indent.opening=0
-indent.closing=0
-#tab.indents=0
-#backspace.unindents=0
-
-# Wrapping of long lines
-#wrap=1
-#wrap.style=2
-cache.layout=2
-#output.wrap=1
-#output.cache.layout=3
-#wrap.visual.flags=3
-#wrap.visual.flags.location=3
-#wrap.indent.mode=1
-#wrap.visual.startindent=4
-
-# Folding
-# enable folding, and show lines below when collapsed.
-fold=0
-fold.compact=0
-fold.flags=20
-fold.symbols=2
-#fold.highlight=1
-#fold.highlight.colour=#00C0C0
-#fold.on.open=1
-fold.comment=1
-fold.preprocessor=1
-
-# Find and Replace
-# Internal search always available with recursive capability so use in preference to external tool
-find.command=
-# findstr is available on recent versions of Windows including 2000
-if PLAT_WIN
- find.command=findstr /n /s $(find.files) $(find.what)
-#find.input=$(find.what)
-if PLAT_GTK
- find.command=grep --line-number "$(find.what)" $(find.files)
-#find.files=*.c *.cxx *.h
-find.files=*.*
-#find.in.files.close.on.find=0
-#find.in.dot=1
-#find.in.binary=1
-#find.close.on.find=0
-#find.replace.matchcase=1
-#find.replace.escapes=1
-#find.replace.regexp=1
-#find.replace.regexp.posix=1
-#find.replace.wrap=0
-#find.replacewith.focus=0
-#find.replace.advanced=1
-find.use.strip=0
-replace.use.strip=0
-#strip.button.height=24
-
-
-# Behaviour
-#eol.mode=LF
-#eol.auto=1
-clear.before.execute=0
-#vc.home.key=1
-#wrap.aware.home.end.keys=1
-#autocompleteword.automatic=1
-#autocomplete.choose.single=1
-caret.policy.xslop=1
-caret.policy.width=20
-caret.policy.xstrict=0
-caret.policy.xeven=0
-caret.policy.xjumps=0
-caret.policy.yslop=1
-caret.policy.lines=3
-caret.policy.ystrict=1
-caret.policy.yeven=1
-caret.policy.yjumps=0
-#visible.policy.strict=1
-#visible.policy.slop=1
-#visible.policy.lines=4
-#time.commands=1
-#caret.sticky=1
-properties.directory.enable=1
-
-# Status Bar
-statusbar.number=4
-statusbar.text.1=\
-li=$(LineNumber) co=$(ColumnNumber) $(OverType) ($(EOLMode)) $(FileAttr)
-statusbar.text.2=\
-$(BufferLength) chars in $(NbOfLines) lines. Sel: $(SelLength) chars.
-statusbar.text.3=\
-Now is: Date=$(CurrentDate) Time=$(CurrentTime)
-statusbar.text.4=\
-$(FileNameExt) : $(FileDate) \97 $(FileTime) | $(FileAttr)
-
-if PLAT_WIN
- command.scite.help=C:\Program Files\SRWare Iron\iron.exe "C:\Program Files\SciTE\SciTEDoc.html"
- command.scite.help.subsystem=2
-if PLAT_GTK
- command.print.*=a2ps "$(FileNameExt)"
- command.scite.help=netscape "file://$(SciteDefaultHome)/SciTEDoc.html"
-
-# Internationalisation
-# Japanese input code page 932 and ShiftJIS character set 128
-#code.page=932
-#character.set=128
-# Unicode
-#code.page=65001
-code.page=0
-#character.set=204
-# Required for Unicode to work on GTK+:
-#LC_CTYPE=en_US.UTF-8
-if PLAT_GTK
- output.code.page=65001
-if PLAT_MAC
- output.code.page=65001
-
-# Export
-#export.keep.ext=1
-export.html.wysiwyg=1
-#export.html.tabs=1
-#export.html.folding=1
-export.html.styleused=1
-export.html.title.fullpath=1
-#export.rtf.tabs=1
-#export.rtf.font.face=Arial
-#export.rtf.font.size=9
-#export.rtf.tabsize=8
-#export.rtf.wysiwyg=0
-#export.tex.title.fullpath=1
-# Magnification (added to default screen font size)
-export.pdf.magnification=0
-# Font: Courier, Helvetica or Times (Courier line-wraps)
-export.pdf.font=Courier
-# Page size (in points): width, height
-# E.g. Letter 612,792; A4 595,842; maximum 14400,14400
-export.pdf.pagesize=595,842
-# Margins (in points): left, right, top, bottom
-export.pdf.margins=56,28,28,28
-export.xml.collapse.spaces=1
-export.xml.collapse.lines=1
-
-# Define values for use in the imported properties files
-chars.alpha=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
-chars.numeric=0123456789ABCDEFabcdefx
-chars.accented=\8a\9a\8c\9c\9fÿÀàÁáÂâÃãÄäÅåÆæÇçÈèÉéÊêËëÌìÍíÎîÏïÐðÑñÒòÓóÔôÕõÖØøÙùÚúÛûÜüÝýÞþßö
-# This is a better set for Russian:
-#chars.accented=ÀàÁáÂâÃãÄäÅ娸ÆæÇçÈèÉéÊêËëÌìÍíÎîÏïÐðÑñÒòÓóÔôÕõÖö×÷ØøÙùÚúÛûÜüÝýÞþßÿ
-
-# The open.filter setting is only used on Windows where the file selector has a menu of filters to apply
-# to the types of files seen when opening.
-# There is a limit (possibly 256 characters) to the length of a filter,
-# so not all source extensions can be in this setting.
-#*.idl;*.odl;*.rc;*.rc2;*.dlg;*.def;make*;*.mak;\
-#*.frm;*.cls;*.ctl;;*.pl;;*.iface;*.e;#*.rb;*.cgi;*.lua;\
-#source.files=*.asm;*.c;*.cc;*.f;*.ff;*.far;*.cpp;*.cxx;*.cs;*.h;*.hh;*.hxx;*.hpp;\
-source.files=*.asm;*.avr;*.tiny;*.mega;*.vb;*.vbs;*.bas;*.bat;*.ini;*.py;*.js;*.properties;*.vhd;*.vhdl
-
-# Each platform has a different idea of the most important filters
-if PLAT_WIN
- all.files=All Files (*.*)|*.*|
- top.filters=All Source|$(source.files)|$(all.files)
-if PLAT_GTK
- all.files=All Files (*)|*|Hidden Files (.*)|.*|
- top.filters=All Source|$(source.files)|$(all.files)
-# As OS X only greys out filtered files, show all as default
-if PLAT_MAC
- all.files=All Files (*.*)|*.*|
- top.filters=$(all.files)All Source|$(source.files)|
-
-open.filter=\
-$(top.filters)\
-#$(filter.ada)\
-$(filter.conf)\
-$(filter.asm)\
-#$(filter.asn1)\
-#$(filter.ave)\
-#$(filter.baan)\
-$(filter.bash)\
-#$(filter.caml)\
-#$(filter.cmake)\
-#$(filter.cpp)\
-#$(filter.ch)\
-$(filter.css)\
-#$(filter.d)\
-#$(filter.eiffel)\
-#$(filter.erlang)\
-$(filter.fortran)\
-$(filter.forth)\
-#$(filter.gap)\
-#$(filter.hs)\
-#$(filter.idl)\
-#$(filter.inno)\
-$(filter.java)\
-$(filter.js)\
-#$(filter.kix)\
-#$(filter.lout)\
-$(filter.lua)\
-#$(filter.matlab)\
-#$(filter.metapost)\
-#$(filter.mmixal)\
-#$(filter.modula3)\
-#$(filter.nncrontab)\
-#$(filter.nsis)\
-#$(filter.opal)\
-#$(filter.pascal)\
-#$(filter.perl)\
-#$(filter.php)\
-#$(filter.pov)\
-#$(filter.powershell)\
-#$(filter.prg)\
-$(filter.properties)\
-$(filter.ps)\
-$(filter.python)\
-$(filter.r)\
-$(filter.ruby)\
-#$(filter.sql)\
-#$(filter.specman)\
-$(filter.tcl)\
-$(filter.tex)\
-$(filter.text)\
-$(filter.txt2tags)\
-$(filter.vb)\
-$(filter.web)\
-#$(filter.yaml)\
-$(filter.verilog)\
-$(filter.vhdl)
-
-#save.filter=$(open.filter)
-
-# Give symbolic names to the set of fonts used in the standard styles.
-if PLAT_WIN
- font.base=font:Lucida Console,size:10
- font.small=font:Lucida Console,size:10
- font.comment=font:Lucida Console,size:10
- font.code.comment.box=$(font.comment)
- font.code.comment.line=$(font.comment)
- font.code.comment.doc=$(font.comment)
- font.code.comment.nested=$(font.comment)
- font.text=font:Lucida Console,size:10
- font.text.comment=font:Lucida Console,size:10
- font.embedded.base=font:Lucida Console,size:10
- font.embedded.comment=font:Lucida Console,size:10
- font.monospace=font:Lucida Console,size:10
- font.vbs=font:Lucida Sans Unicode,size:10
-if PLAT_GTK
- font.base=font:lucidatypewriter,size:12
- font.small=font:lucidatypewriter,size:10
- font.comment=font:new century schoolbook,size:8
- font.code.comment.box=$(font.comment)
- font.code.comment.line=$(font.comment)
- font.code.comment.doc=$(font.comment)
- font.code.comment.nested=$(font.comment)
- font.text=font:times,size:8
- font.text.comment=font:lucidatypewriter,size:8
- font.embedded.base=font:lucidatypewriter,size:8
- font.embedded.comment=font:lucidatypewriter,size:8
- font.monospace=font:courier,size:8
- font.vbs=font:new century schoolbook,size:8
-if PLAT_MAC
- font.base=font:Verdana,size:12
- font.small=font:Verdana,size:10
- font.comment=font:Georgia,size:13
- font.code.comment.box=$(font.comment)
- font.code.comment.line=$(font.comment)
- font.code.comment.doc=$(font.comment)
- font.code.comment.nested=$(font.comment)
- font.text=font:Times New Roman,size:13
- font.text.comment=font:Verdana,size:11
- font.embedded.base=font:Verdana,size:11
- font.embedded.comment=font:Comic Sans MS,size:10
- font.monospace=font:Courier New,size:12
- font.vbs=font:Lucida Sans Unicode,size:12
- font.js=$(font.comment)
-
-# Old GTK+ font settings are faster but not antialiased
- #~ font.base=font:lucidatypewriter,size:12
- #~ font.small=font:lucidatypewriter,size:10
- #~ font.comment=font:new century schoolbook,size:12
- #~ font.code.comment.box=$(font.comment)
- #~ font.code.comment.line=$(font.comment)
- #~ font.code.comment.doc=$(font.comment)
- #~ font.text=font:times,size:14
- #~ font.text.comment=font:lucidatypewriter,size:10
- #~ font.embedded.base=font:lucidatypewriter,size:12
- #~ font.embedded.comment=font:lucidatypewriter,size:12
- #~ font.monospace=font:courier,size:12
- #~ font.vbs=font:new century schoolbook,size:12
-
-# Give symbolic names to the set of colours used in the standard styles.
-colour.code.comment.box=fore:#00FF00
-colour.code.comment.line=fore:#00FF00
-colour.code.comment.doc=fore:#3F703F
-colour.code.comment.nested=fore:#A0C0A0
-colour.text.comment=fore:#0000FF,back:#FFFFFF
-colour.other.comment=fore:#00FF00
-colour.embedded.comment=back:#E0EEFF
-colour.embedded.js=back:#F0F0FF
-colour.notused=back:#FF0000
-#couleur des nombres
-colour.number=fore:#FF00FF
-#couleur des instructions du langage
-colour.keyword=fore:#FF0000
-#couleur chaînes entre guillemets
-colour.string=fore:#00FFFF
-colour.char=fore:#7F7F7F
-colour.operator=fore:#00FF00
-colour.preproc=fore:#FF7F00
-colour.error=fore:#FFFF00,back:#FF0000
-
-# Global default styles for all languages
-# Default style, black background
-style.*.32=back:#000000,fore:#FFFFFF,font:Lucida Console,size:10
-# Line number
-style.*.33=back:#404040,$(font.base))
-# Brace highlight
-style.*.34=back:#222222,fore:#8080FF,bold
-# Brace incomplete highlight
-style.*.35=back:#222222,fore:#FF0000,bold
-# Control characters
-style.*.36=
-# Indentation guides
-style.*.37=fore:#C0C0C0,back:#FFFFFF
-
-# Printing - only works on Windows
-if PLAT_WIN
- #print.colour.mode=1
- print.magnification=-1
- # Setup: left, right, top, bottom margins, in local units:
- # hundredths of millimeters or thousandths of inches
- print.margins=2000,1000,1000,1000
- # Header/footer:
- # && = &; &p = current page
- # &f = file name; &F = full path
- # &d = file date; &D = current date
- # &t = file time; &T = full time
- print.header.format=$(FileNameExt) \97 Printed on $(CurrentDate), $(CurrentTime) \97 Page $(CurrentPage)
- print.footer.format=$(FilePath) \97 File date: $(FileDate) \97 File time: $(FileTime)
- # Header/footer style
- print.header.style=font:Arial,size:12,bold
- print.footer.style=font:Arial Narrow,size:10,italics
-
-# Warnings - only works on Windows and needs to be pointed at files on machine
-#if PLAT_WIN
-# warning.findwrapped=100,E:\Windows\Media\SFX\Boing.wav
-# warning.notfound=0,Effect.wav
-# warning.wrongfile=0,Glass.wav
-# warning.executeok=0,Fanfare.wav
-# warning.executeko=100,GlassBreak.wav
-# warning.nootherbookmark=100,Boing2.wav
-
-# Define the Lexer menu,
-# Each item contains three parts: menu string | file extension | key
-# The only keys allowed currently are based on F-keys and alphabetic keys and look like
-# [Ctrl+][Shift+][Fn|a] such as F12 or Ctrl+Shift+D.
-# A '&' may be placed before a letter to be used as an accelerator. This does not work on GTK+.
-
-keyText=Shift+F11
-keyMake=Ctrl+Shift+F11
-keyHTML=F12
-keyXML=Shift+F12
-# On OS X, F11 is used by Expose, F12 by Dashbard
-if PLAT_MAC
- keyText=Shift+F13
- keyMake=Ctrl+Shift+F13
- keyHTML=Ctrl+Shift+F14
- keyXML=Shift+F14
-
-menu.language=\
-Text|txt|Shift+F11|\
-#Ada|ads||\
-#Apache Confi&g|conf||\
-Assembler|asm||\
-#ASN.1|asn1||\
-#Avenue|ave||\
-#Baan|bc||\
-&Batch|bat||\
-#Bullant|ant||\
-&C / C++|c||\
-#CMake|cmake||\
-C&#|cs||\
-#COBOL|cob||\
-#Csound|orc||\
-CSS|css||\
-D|d||\
-&Difference|diff||\
-#&Eiffel|e||\
-#Erlang|erl||\
-&Errorlist|err||\
-#FlagShip|prg||\
-Forth|forth||\
-&Fortran|f90||\
-#Gap|g||\
-#Haskell|hs||\
-H&ypertext|html|F12|\
-#&InnoSetup|iss||\
-&Java|java||\
-Java&Script|js||\
-#&Kix|kix||\
-#Lisp|lisp||\
-#Lot|lot||\
-#Lout|lt||\
-#Lu&a|lua||\
-#Matlab|m.matlab||\
-&Makefile|mak|Ctrl+Shift+F11|\
-#MetaPost|mp||\
-#MMIXAL|mms||\
-#Modula-3|m3||\
-#&nnCron crontab|tab||\
-#NSIS|nsis||\
-#Objective Caml|ml||\
-#Octave|m.octave||\
-#Opal|impl||\
-#Pascal|pas||\
-Pe&rl|pl||\
-P&HP|php||\
-#P&LSQL|spec||\
-#P&ostScript|ps||\
-#P&OV-Ray SDL|pov||\
-#PowerShell|ps1||\
-#PowerPro|powerpro||\
-&Properties|properties||\
-Pytho&n|py||\
-#R|R||\
-#Reso&urce|rc||\
-Ruby|rb||\
-Shell|sh||\
-S&QL|sql||\
-#Specman|e||\
-&TCL|tcl||\
-TeX|tex||\
-#&txt2tags|t2t||\
-&VB|vb||\
-VBScr&ipt|vbs||\
-#Verilog|v||\
-#VHDL|vhd||\
-&XML|xml|$(keyXML)|\
-YAML|yaml||
-
-# User defined key commands
-user.shortcuts=\
-Ctrl+Shift+V|IDM_PASTEANDDOWN|\
-Ctrl+PageUp|IDM_PREVFILE|\
-Ctrl+PageDown|IDM_NEXTFILE|
-
-#KeypadPlus|IDM_EXPAND|\
-#KeypadMinus|IDM_BLOCK_COMMENT|
-
-#user.context.menu=\
-#||\
-#Next File|IDM_NEXTFILE|\
-#Prev File|IDM_PREVFILE|
-
-# Import all the language specific properties files
-#import abaqus
-#import ada
-#import asn1
-#import au3
-#import ave
-#import baan
-#import freebasic
-#import blitzbasic
-#import bullant
-#import caml
-import conf
-#import cobol
-import cpp
-#import cmake
-#import csound
-import css
-#import d
-#import eiffel
-#import erlang
-#import escript
-#import flagship
-import \config\scite\fortran
-#import gap
-#import haskell
-import html
-#import inno
-#import kix
-import lisp
-#import lot
-#import lout
-import lua
-#import matlab
-#import metapost
-#import mmixal
-#import modula3
-#import nimrod
-#import nncrontab
-#import nsis
-#import opal
-import \config\scite\others
-#import pascal
-#import perl
-#import pov
-#import powerpro
-#import powershell
-import ps
-#import purebasic
-import python
-#import r
-#import rebol
-import ruby
-#import scriptol
-#import smalltalk
-#import spice
-#import sql
-#import specman
-#import tacl
-#import tal
-import tcl
-#import txt2tags
-import tex
-#import vb
-#import yaml
-#import verilog
-#import vhdl
-import \config\scite\AS_MSP430\asm
-import \config\scite\AS_MSP430\gema
-import \config\scite\AS_MSP430\forth
-import \config\scite\hex
-
-
-# Error list styles
-
-style.errorlist.32=fore:#B0B000,$(font.small)
-# Default
-style.errorlist.0=fore:#FFFFFF
-# Microsoft Error
-style.errorlist.3=fore:#0080FF
-# command or return status
-style.errorlist.4=fore:#FF00FF
-
-# Text matched with find in files and message part of GCC errors
-style.errorlist.21=fore:#FF0000
-
-
-
-
word.characters.$(file.patterns.text)=$(chars.alpha)$(chars.numeric)$(chars.accented)-'
-colour.other.operator=fore:#B06000
+colour.other.operator=fore:#FFFF00
# Properties styles
del dir do dpath echo else endlocal erase errorlevel exist \
exit for ftype goto if in lpt1 lpt2 lpt3 lpt4 md mkdir move \
not nul path pause popd prompt prn pushd rd rem ren \
-rename rmdir set setlocal shift start time title type ver \
+rename rmdir set setlocal shift start taskkill time title type ver \
verify vol
keywords.$(file.patterns.batch)=$(keywordclass.batch)
#keywords2.$(file.patterns.batch)=append attrib chkdsk comp diskcomp
# Default
-style.batch.0=fore:#000000
+style.batch.0=fore:#FFFFFF
# Comment (rem or ::)
-style.batch.1=fore:#007F00,$(font.comment)
+style.batch.1=fore:#00FF00,$(font.comment)
# Keywords
-style.batch.2=$(colour.keyword),bold
+style.batch.2=$(colour.keyword)
# Label (line beginning with ':')
-style.batch.3=$(colour.string),back:#606060,fore:#FFFF00,eolfilled
+style.batch.3=$(colour.string),fore:#FFFF00,eolfilled
# Hide command character ('@')
style.batch.4=$(colour.preproc)
# External commands
-style.batch.5=fore:#007090,$(font.monospace),bold
+style.batch.5=fore:#00FFFF,$(font.monospace)
# Variable: %%x (x is almost whatever, except space and %), %n (n in [0-9]), %EnvironmentVar%
-style.batch.6=fore:#800080
+style.batch.6=fore:#FF00FF
# Operator: * ? < > |
-style.batch.7=fore:#000000
+style.batch.7=fore:#FFFFFF
comment.block.batch=REM ~
; You should have received a copy of the GNU General Public License
; along with this program. If not, see <http://www.gnu.org/licenses/>.
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
; assembled with MACROASSEMBLER AS (http://john.ccac.rwth-aachen.de:8000/as/)
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
.cpu MSP430
.include "mspregister.mac" ;
; macexp off ; unrem to hide macro results
-;----------------------------------------------------------------------------------------------------------
+;-------------------------------------------------------------------------------
; Vingt fois sur le métier remettez votre ouvrage,
; Polissez-le sans cesse, et le repolissez,
; Ajoutez quelquefois, et souvent effacez.
-; Boileau, L'Art poétique
-;----------------------------------------------------------------------------------------------------------
-
-;===============================================================================================
-;===============================================================================================
-; before assembling or programming you must set DEVICE in param1 and TARGET in param2 (SHIFT+F8)
-; according to the TARGET "switched" below
-; example : your TARGET = MSP_EXP430FR5969 (notice the underscore) ==> DEVICE = MSP430FR5969
-;===============================================================================================
-;===============================================================================================
-
-;-----------------------------------------------------------------------------------------------
-; TARGET configuration SWITCHES ; bytes values are for DTC=1, 8MHz 2457600bds XON/XOFF + RTS
-;-----------------------------------------------------------------------------------------------
-; TOTAL - SUM of (INFO+RAM +VECTORS) = MAIN PROG
-;MSP_EXP430FR5739 ; compile for MSP-EXP430FR5739 launchpad ; 4136 - 160 ( 24 + 86 + 50 ) = 3976 bytes
-;MSP_EXP430FR5969 ; compile for MSP-EXP430FR5969 launchpad ; 4102 - 162 ( 24 + 86 + 52 ) = 3940 bytes
-;MSP_EXP430FR5994 ; compile for MSP-EXP430FR5994 launchpad ; 4144 - 186 ( 24 + 86 + 76 ) = 3956 bytes
-;MSP_EXP430FR6989 ; compile for MSP-EXP430FR6989 launchpad ; 4140 - 168 ( 24 + 86 + 58 ) = 3972 bytes
-;MSP_EXP430FR4133 ; compile for MSP-EXP430FR4133 launchpad ; 4174 - 140 ( 24 + 86 + 30 ) = 4034 bytes
-CHIPSTICK_FR2433 ; compile for the "CHIPSTICK" of M. Ken BOAK ; 4070 - 148 ( 24 + 86 + 38 ) = 3928 bytes
+; Boileau, L'Art poétique
+;-------------------------------------------------------------------------------
+
+;===============================================================================
+;===============================================================================
+;before assembling or programming you must copy your TARGET in param1 (SHIFT+F8)
+;===============================================================================
+;===============================================================================
+
+;-------------------------------------------------------------------------------
+; TARGET configuration SWITCHES ; bytes values are for DTC=1, 8MHz 2457600 bds XON/XOFF
+;-------------------------------------------------------------------------------
+; TOTAL - SUM of (INFO+RAM +VECTORS) = MAIN PROG
+;MSP_EXP430FR5739 ;; MSP-EXP430FR5739 launchpad ; 4154 - 160 ( 24 + 86 + 50 ) = 3994 bytes
+;MSP_EXP430FR5969 ; MSP-EXP430FR5969 launchpad ; 4136 - 162 ( 24 + 86 + 52 ) = 3974 bytes
+MSP_EXP430FR5994 ; MSP-EXP430FR5994 launchpad ; 4172 - 186 ( 24 + 86 + 76 ) = 3986 bytes
+;MSP_EXP430FR6989 ; MSP-EXP430FR6989 launchpad ; 4170 - 168 ( 24 + 86 + 58 ) = 4002 bytes
+;MSP_EXP430FR4133 ; MSP-EXP430FR4133 launchpad ; 4180 - 140 ( 24 + 86 + 30 ) = 4040 bytes
+;CHIPSTICK_FR2433 ; "CHIPSTICK" of M. Ken BOAK ; 4096 - 148 ( 24 + 86 + 38 ) = 3948 bytes
+;MY_MSP430FR5738 ; my MSP430FR5738 miniboards ; 4100 - 160 ( 24 + 86 + 50 ) = 3940 bytes
+;MY_MSP430FR5738_1 ; MYMSP430FR5738_1 miniboard ; 4100 - 160 ( 24 + 86 + 50 ) = 3940 bytes
+;MY_MSP430FR5948 ; my MSP430FR5948 miniboard ; 4110 - 162 ( 24 + 86 + 52 ) = 3948 bytes
+;MY_MSP430FR5948_1 ; my MSP430FR5948_1 miniboard ; 4122 - 162 ( 24 + 86 + 52 ) = 3960 bytes
+;JMJ_BOX ; JMJ_BOX MSP430FR5738 ; 4088 - 160 ( 24 + 86 + 50 ) = 3928 bytes
+;PA8_PA_MSP430 ; PA8_PA_MSP430 MSP430FR5738 ; 4088 - 160 ( 24 + 86 + 50 ) = 3928 bytes
; choose DTC (Direct Threaded Code) model, if you don't know, choose 1
-DTC .equ 1 ; DTC model 1 : DOCOL = CALL rDOCOL 14 cycles 1 word shortest DTC model
- ; DTC model 2 : DOCOL = PUSH IP, CALL rEXIT 13 cycles 2 words good compromize for mix FORTH/ASM code
- ; DTC model 3 : inlined DOCOL 9 cycles 4 words fastest
+DTC .equ 2 ; DTC model 1 : DOCOL = CALL rDOCOL 14 cycles 1 word shortest DTC model
+ ; DTC model 2 : DOCOL = PUSH IP, CALL rEXIT 13 cycles 2 words good compromize for mix FORTH/ASM code
+ ; DTC model 3 : inlined DOCOL 9 cycles 4 words fastest
FREQUENCY .equ 16 ; fully tested at 0.25,0.5,1,2,4,8,16 (and 24 for MSP430FR57xx) MHz
THREADS .equ 16 ; 1, 4, 8, 16, 32 search entries in dictionnary. 16 is the good compromise between speed and size.
; +40, +66, +90, +154 bytes
-TERMINALBAUDRATE .equ 3000000 ; choose value considering the frequency and the UART2USB bridge, see explanations below.
-TERMINALXONXOFF ; to enable XON/XOFF flow control (PL2303TA/HXD, CP2102)
-TERMINALCTSRTS ; to enable hardware flow control with RTS (PL2303TA/HXD, FT232RL)
+TERMINALBAUDRATE .equ 921600 ; choose value considering the frequency and the UART2USB bridge, see choices below.
- .include "Target.inc" ; to define target config: I/O, memory, SFR, vectors, TERMINAL eUSCI, SD_Card eUSCI, LF_XTAL,
+ ; select a minima one item below, input terminal don't work if no flow control.
+TERMINALXONXOFF ; set 3 wires (GND,RX,TX) XON/XOFF software flow control; unselect if you plan to use binary flows
+TERMINALCTSRTS ; +12 bytes to set 4 wires (GND,RX,TX,RTS) hardware input flow control
-;-----------------------------------------------------------------------
-; KERNEL ADD-ON SWITCHES ;
-;-----------------------------------------------------------------------
-MSP430ASSEMBLER ;; + 1896 bytes : add embedded assembler with TI syntax; without, you can do all but all much more slowly...
-;SD_CARD_LOADER ; + 1754 bytes : to LOAD source files from SD_card
-;SD_CARD_READ_WRITE ; + 1162 bytes : to read, create, write and del files + source files direct copy from PC to SD_Card
+ .include "Target.inc" ; to define target config: I/O, memory, SFR, vectors, TERMINAL eUSCI, SD_Card eUSCI, LF_XTAL,
+ ; but only for FAST FORTH core use, not for your FAST FORTH application.
+
+;-------------------------------------------------------------------------------
+; KERNEL ADD-ON SWITCHES
+;-------------------------------------------------------------------------------
+CONDCOMP ;; + 354 bytes : add conditionnal compilation : [UNDEFINED] [DEFINED] [IF] [ELSE] [THEN], strongly recommended.
+MSP430ASSEMBLER ;; + 1894 bytes : add embedded assembler with TI syntax; without, you can do all but all much more slowly...
+SD_CARD_LOADER ;; + 1834 bytes : to LOAD source files from SD_card
+SD_CARD_READ_WRITE ;; + 1176 bytes : to read, create, write and del files + source files direct copy from PC to SD_Card
+BOOTLOADER ; + 50 bytes : add a bootstrap to SD_CARD\BOOT.4TH.
;VOCABULARY_SET ; + 108 bytes : add VOCABULARY FORTH ASSEMBLER ALSO PREVIOUS ONLY DEFINITIONS (FORTH83, not ANSI)
-;LOWERCASE ; + 30 bytes : enable to EMIT strings in lowercase.
+;LOWERCASE ; + 30 bytes : enable to write strings in lowercase.
;BACKSPACE_ERASE ; + 24 bytes : replace BS by ERASE, for visual comfort
-;-------------------------------------------------------------------------------------------------
-; OPTIONAL KERNELL ADD-ON SWITCHES, because their source file can be downloaded later >----------------+
-;------------------------------------------------------------------------------------------------- |
-; v
-;UTILITY ; + 404 bytes : add .S WORDS U.R DUMP ? UTILITY.f
-;SD_TOOLS ; + 126 bytes for trivial DIR, FAT, CLUSTER and SECTOR view, adds UTILITY SD_TOOLS.f
-;ANS_CORE_COMPLIANT ; + 876 bytes : required to pass coretest.4th ; (includes items below) COMPxMPY.f (x = H or S)
+;-------------------------------------------------------------------------------
+; OPTIONAL KERNELL ADD-ON SWITCHES (can be downloaded later) >------------------+
+; Tip: when switched ON below, ADD-ONs become protected against WIPE and Deep Reset... |
+;------------------------------------------------------------------------------- v
+;UTILITY ; + 412/494 bytes : add .S .RS WORDS U.R DUMP ? UTILITY.f
+;SD_TOOLS ; + 126 bytes for trivial DIR, FAT, CLUSTER and SECTOR view, adds UTILITY SD_TOOLS.f
+;ANS_CORE_COMPLIANT ; + 876 bytes : required to pass coretest.4th ; (includes items below) COMPxMPY.f (x = H or S)
;ARITHMETIC ; + 358 bytes : add S>D M* SM/REM FM/MOD * /MOD / MOD */MOD /MOD */
;DOUBLE ; + 130 bytes : add 2@ 2! 2DUP 2SWAP 2OVER
;ALIGNMENT ; + 24 bytes : add ALIGN ALIGNED
;PORTABILITY ; + 46 bytes : add CHARS CHAR+ CELLS CELL+
-
-;=================================================================
+;===============================================================================
; XON/XOFF control flow configuration ; up to 322kBd/MHz with ECHO
-;=================================================================
+;===============================================================================
-; Only two usb2uart bridges correctly handle XON / XOFF: cp2102 and pl2303.
+; Only two usb2uart bridges correctly handle XON/XOFF: cp2102 and pl2303.
; the best and cheapest: UARTtoUSB cable with Prolific PL2303TA (supply current = 8 mA) or PL2303HXD
; ...but pl2303HXD cable have not the 3.3V pin...
; don't forget : save new TERATERM configuration !
-;======================================================================
+;===============================================================================
; Hardware control flow configuration: RTS is wired on UART2USB CTS pin
-;======================================================================
+;===============================================================================
; Launchpad <-> UARTtoUSB
; RX <-- TX
; UARTtoUSB module with FTDI FT232RL (FT230X don't work correctly)
-; --------------------------------------------------------------------
+;-------------------------------------------------------------------------------
; WARNING ! buy a FT232RL module with a switch 5V/3V3 and select 3V3 !
-; --------------------------------------------------------------------
+;-------------------------------------------------------------------------------
; 9600,19200,38400,57600,115200 (500kHz)
; + 230400 (1MHz)
; + 460800 (2MHz)
; don't forget : save new TERATERM configuration !
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
; DTCforthMSP430FR5xxx Init vocabulary pointers:
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
.IF THREADS = 1
.include "ForthThreads.mac"
.ENDIF
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
; DTCforthMSP430FR5xxx RAM memory map:
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
; name words ; comment
;PAD ; ----- RAMSTART + $E2
; |
-PAD_SIZE .equ 84 ; | grows up (ans spec. : PAD >= 84 chars)
+PAD_LEN .equ 84 ; | grows up (ans spec. : PAD >= 84 chars)
; |
; v
; ----- RAMSTART + $136
;TIB ; ----- RAMSTART + $138
; |
-TIB_SIZE .equ 80 ; | grows up (ans spec. : TIB >= 80 chars)
+TIB_LEN .equ 80 ; | grows up (ans spec. : TIB >= 80 chars)
; |
; v
; ^
LEAVEPTR .equ LSTACK ; Leave-stack pointer
PSTACK .equ LSTACK+(LSTACK_SIZE*2)+(PSTACK_SIZE*2)
RSTACK .equ PSTACK+(RSTACK_SIZE*2)
-PAD .equ RSTACK+2
-TIB .equ PAD+PAD_SIZE+2
-BASE_HOLD .equ TIB+TIB_SIZE+HOLD_SIZE
+PAD_ORG .equ RSTACK+2
+TIB_ORG .equ PAD_ORG+PAD_LEN+2
+BASE_HOLD .equ TIB_ORG+TIB_LEN+HOLD_SIZE
; ----------------------------------
HP .word 0 ; HOLD ptr
CAPS .word 0
-LAST_NFA .word 0 ; NFA, VOC_PFA, LFA, CFA, CSP of last created word
-LAST_THREAD .word 0
+LAST_NFA .word 0 ; NFA, VOC_PFA, LFA, CFA, PSP of last created word
+LAST_THREAD .word 0 ; used by QREVEAL
LAST_CFA .word 0
-LAST_CSP .word 0
+LAST_PSP .word 0
STATE .word 0 ; Interpreter state
ASM_CURRENT .word 0 ; preserve CURRENT during create assembler words
OPCODE .word 0 ; OPCODE adr
BUFEND .equ BUFFER + 200h ; 512bytes
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
; INFO(DCBA) >= 256 bytes memory map:
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
.org INFOSTART
.ENDIF
HECTOBAUDS .word TERMINALBAUDRATE/100 ; user use
-SAVE_SYSRSTIV .word -3 ; to perform DEEP_RST after FastForth compiling
+SAVE_SYSRSTIV .word 05 ; value to identify FAST FORTH first start after core recompiling
LPM_MODE .word CPUOFF+GIE ; LPM0 is the default mode
INIDP .word ROMDICT ; define RST_STATE
INIVOC .word lastvoclink ; define RST_STATE
; ------------------------------
; VARIABLES that could be in RAM
; ------------------------------
- .IFNDEF RAM_1K ; if RAM = 1K the variables below stay in FRAM
+ .IFNDEF RAM_1K ; if RAM = 1K (FR57xx) the variables below stay in FRAM
.org BUFEND ; else in RAM beyond BUFFER
.ENDIF
; ---------------------------------------
SAVEtsLEN .word 0 ; of previous ACCEPT
SAVEtsPTR .word 0 ; of previous ACCEPT
-MemSectorL .word 0 ;
-MemSectorH .word 0 ;
+ .word 0 ;
+ .word 0 ;
.word 0
; ---------------------------------------
HDLW_BUFofst .equ 22 ; BUFFER offset ; used by LOAD"
- .IFDEF RAM_1K ; RAM_Size = 1k
+ .IFDEF RAM_1K ; RAM_Size = 1k, no SDIB due to the lack of RAM
FirstHandle
HandleMax .equ 7
HandleLenght .equ 24
.org HandleEnd
SDIB
-SDIB_SIZE .equ 84
+SDIB_LEN .equ 84
- .org SDIB+SDIB_SIZE
+ .org SDIB+SDIB_LEN
.ENDIF ; RAM_Size
.ENDIF ; SD_CARD_LOADER
-SD_END_DATA ; used to init SD_ram area
-; ----------------------------------------------------------------------
-; DTCforthMSP430FR5xxx REGISTER USAGE
-; ----------------------------------------------------------------------
-
- .SWITCH DTC
- .CASE 1 ; DOCOL = CALL rDOCOL
-
-RSP .reg SP ; RSP = Return Stack Pointer (return stack)
-
-; DOxxx registers ; must be saved before use and restored after use
-rDODOES .reg r4
-rDOCON .reg r5
-rDOVAR .reg r6
-rDOCOL .reg R7
-
-; Scratch registers
-Y .reg R8
-X .reg R9
-W .reg R10
-T .reg R11
-S .reg R12
-
-; Forth virtual machine
-IP .reg R13 ; interpretative pointer
-TOS .reg R14 ; first PSP cell
-PSP .reg R15 ; PSP = Parameters Stack Pointer (stack data)
-
- .CASE 2 ; DOCOL = PUSH IP + CALL rEXIT
-
-RSP .reg SP ; RSP = Return Stack Pointer (return stack)
+SD_END_DATA ; used by SD_INIT to init SD_ram area
-; DOxxx registers ; must be saved before use and restored after use
-rDODOES .reg r4
-rDOCON .reg r5
-rDOVAR .reg r6
-rEXIT .reg R7
+;-------------------------------------------------------------------------------
+; DTCforthMSP430FR5xxx program (FRAM) memory
+;-------------------------------------------------------------------------------
-; Scratch registers
-Y .reg R8
-X .reg R9
-W .reg R10
-T .reg R11
-S .reg R12
+ .org PROGRAMSTART
-; Forth virtual machine
-IP .reg R13 ; interpretative pointer
-TOS .reg R14 ; first PSP cell
-PSP .reg R15 ; PSP = Parameters Stack Pointer (stack data)
+;-------------------------------------------------------------------------------
+; DEFINING EXECUTIVE WORDS - DTC model
+;-------------------------------------------------------------------------------
- .CASE 3 ; INLINED DOCOL
+;-------------------------------------------------------------------------------
+; very nice FAST FORTH added feature:
+;-------------------------------------------------------------------------------
+; as IP is computed from the PC value, we can place low level to high level
+; switches "COLON" or "LO2HI" anywhere in a word, i.e. not only at its beginning.
+;-------------------------------------------------------------------------------
-RSP .reg SP ; RSP = Return Stack Pointer (return stack)
+RSP .reg R1 ; RSP = Return Stack Pointer (return stack)
; DOxxx registers ; must be saved before use and restored after use
rDODOES .reg r4
rDOVAR .reg r6
; Scratch registers
-R .reg R7
Y .reg R8
X .reg R9
W .reg R10
TOS .reg R14 ; first PSP cell
PSP .reg R15 ; PSP = Parameters Stack Pointer (stack data)
- .ENDCASE ; DTC
-
-; ----------------------------------------------------------------------
-; DTCforthMSP430FR5xxx program (FRAM) memory
-; ----------------------------------------------------------------------
-
- .org PROGRAMSTART
-
-; ----------------------------------------------------------------------
-; DEFINING EXECUTIVE WORDS - DTC model
-; ----------------------------------------------------------------------
-
-; ----------------------------------------------------------------------
-; very nice FAST FORTH added feature:
-; ----------------------------------------------------------------------
-; as IP is calculated from the PC value we can place the low to high level
-; switches "COLON" or "LO2HI" anywhere in a word, i.e. not only at its beginning.
-; ----------------------------------------------------------------------
-
-
- .SWITCH DTC
- .CASE 1 ; DOCOL = CALL rDOCOL
-
mNEXT .MACRO ; return for low level words (written in assembler)
MOV @IP+,PC ; 4 fetch code address into PC, IP=PFA
.ENDM ; 4 cycles,1word = ITC -2cycles -1 word
.word $+2 ; 0 cycle
.ENDM ; 0 cycle, 1 word
-ASMtoFORTH .MACRO ; compiled by LO2HI
- CALL #EXIT ;
- .ENDM ; 2 words, 10~
-DOCOL1 .equ 1287h ; 4 CALL R7 ; [R7] is set as xdocol by COLD
-mDOCOL .MACRO ; compiled by : and by colon
- CALL R7 ;
- .ENDM ; 14~ 1 word
+ .SWITCH DTC
+;-------------------------------------------------------------------------------
+ .CASE 1 ; DOCOL = CALL rDOCOL
+;-------------------------------------------------------------------------------
+
+rDOCOL .reg R7 ; COLD defines xdocol as R7 content
-xdocol ; 4 for CALL rDOCOL
- MOV @RSP+,W ; 2
+xdocol MOV @RSP+,W ; 2
PUSH IP ; 3 save old IP on return stack
MOV W,IP ; 1 set new IP to PFA
MOV @IP+,PC ; 4 = NEXT
- ; 14 = ITC +4
+ ; 10 cycles
- .CASE 2 ; DOCOL = PUSH IP + CALL rEXIT
+ASMtoFORTH .MACRO ; compiled by LO2HI
+ CALL #EXIT ; 2 words, 10 cycles
+ .ENDM ;
-mNEXT .MACRO
- MOV @IP+,PC ; 4 fetch code address into PC, IP=PFA
- .ENDM ; 4cycles,1word = ITC -2cycles -1 word
+mDOCOL .MACRO ; compiled by : and by colon
+ CALL R7 ; 1 word, 14 cycles (CALL included) = ITC+4
+ .ENDM ;
-NEXT .equ 4D30h ; 4 MOV @IP+,PC
+DOCOL1 .equ 1287h ; 4 CALL R7
-FORTHtoASM .MACRO ; compiled by HI2LO
- .word $+2 ; 0 cycle
- .ENDM ; 0 cycle, 1 word
+;-------------------------------------------------------------------------------
+ .CASE 2 ; DOCOL = PUSH IP + CALL rEXIT
+;-------------------------------------------------------------------------------
+
+rEXIT .reg R7 ; COLD defines EXIT as R7 content
ASMtoFORTH .MACRO ; compiled by LO2HI
- CALL rEXIT ; CALL EXIT
- .ENDM ; 10 cycles, 1 word
+ CALL rEXIT ; 1 word, 10 cycles
+ .ENDM ;
mDOCOL .MACRO ; compiled by : and by COLON
PUSH IP ; 3
- CALL rEXIT ; 10 CALL EXIT
- .ENDM ; 13 cycles (ITC+3), two words
+ CALL rEXIT ; 10
+ .ENDM ; 2 words, 13 cycles = ITC+3
DOCOL1 .equ 120Dh ; 3 PUSH IP
-DOCOL2 .equ 1287h ; 4 CALL rEXIT ; [rEXIT] is set as EXIT by COLD
+DOCOL2 .equ 1287h ; 4 CALL rEXIT
+;-------------------------------------------------------------------------------
.CASE 3 ; inlined DOCOL
+;-------------------------------------------------------------------------------
-mNEXT .MACRO ; return for low level words (written in assembler)
- MOV @IP+,PC ; 4 fetch code address into PC, IP=PFA
- .ENDM ; 4 cycles,1word = ITC -2cycles -1 word
-
-NEXT .equ 4D30h ; 4 MOV @IP+,PC
-
-FORTHtoASM .MACRO ; compiled by HI2LO
- .word $+2 ; 0 cycle
- .ENDM ; 0 cycle, 1 word
+R .reg R7 ; Scratch register
ASMtoFORTH .MACRO ; compiled by LO2HI
MOV PC,IP ; 1
MOV PC,IP ; 1
ADD #4,IP ; 1
MOV @IP+,PC ; 4 NEXT
- .ENDM ; 9 cycles (ITC -1), 4 words
+ .ENDM ; 4 words, 9 cycles (ITC-1)
DOCOL1 .equ 120Dh ; 3 PUSH IP
DOCOL2 .equ 400Dh ; 1 MOV PC,IP
.ENDCASE ; DTC
+;-------------------------------------------------------------------------------
; mDOVAR leave on parameter stack the PFA of a VARIABLE definition
+;-------------------------------------------------------------------------------
mDOVAR .MACRO ; compiled by VARIABLE
- CALL rDOVAR ; CALL RFROM
- .ENDM ; 14 cycles (ITC+4), 1 word
+ CALL rDOVAR ; 1 word, 14 cycles (ITC+4)
+ .ENDM ;
-DOVAR .equ 1286h ; 4 CALL rDOVAR ; [rDOVAR] is set as RFROM by COLD
+DOVAR .equ 1286h ; CALL rDOVAR ; [rDOVAR] is defined as RFROM by COLD
+;-------------------------------------------------------------------------------
; mDOCON leave on parameter stack the [PFA] of a CONSTANT definition
+;-------------------------------------------------------------------------------
mDOCON .MACRO ; compiled by CONSTANT
- CALL rDOCON ; CALL xdocon
- .ENDM ; 16 cycles (ITC+4), 1 word
+ CALL rDOCON ; 1 word, 16 cycles (ITC+4)
+ .ENDM ;
-DOCON .equ 1285h ; 4 CALL rDOCON ; [rDOCON] is set as xdocon by COLD
+DOCON .equ 1285h ; 4 CALL rDOCON ; [rDOCON] is defined as xdocon by COLD
xdocon ; -- constant ; 4 for CALL rDOCON
- SUB #2,PSP ; 1 make room on stack
- MOV TOS,0(PSP) ; 3 push first PSP cell
- MOV @RSP+,TOS ; 2 TOS=CONSTANT address
- MOV @TOS,TOS ; 2 TOS=CONSTANT
+ SUB #2,PSP ; 1
+ MOV TOS,0(PSP) ; 3 save TOS on parameters stack
+ MOV @RSP+,TOS ; 2 TOS = CFA address of master word CONSTANT
+ MOV @TOS,TOS ; 2 TOS = CONSTANT value
MOV @IP+,PC ; 4 execute next word
; 16 = ITC (+4)
-; mDODOES leave on parameter stack the PFA of a CREATE definition
+;-------------------------------------------------------------------------------
+; mDODOES leave on parameter stack the PFA of a CREATE definition and execute Master word
+;-------------------------------------------------------------------------------
mDODOES .MACRO ; compiled by DOES>
CALL rDODOES ; CALL xdodoes
- .ENDM ; 19 cycles (ITC-2), 1 word
+ .ENDM ; 1 word, 19 cycles (ITC-2)
-DODOES .equ 1284h ; 4 CALL rDODOES ; [rDODOES] is set as xdodoes by COLD
+DODOES .equ 1284h ; 4 CALL rDODOES ; [rDODOES] is defind as xdodoes by COLD
xdodoes ; -- a-addr ; 4 for CALL rDODOES
SUB #2,PSP ; 1
MOV TOS,0(PSP) ; 3 save TOS on parameters stack
MOV @RSP+,TOS ; 2 TOS = CFA address of master word, i.e. address of its first cell after DOES>
PUSH IP ; 3 save IP on return stack
- MOV @TOS+,IP ; 2 IP = CFA of Master word, TOS = BODY of created word
+ MOV @TOS+,IP ; 2 IP = CFA of Master word, TOS = BODY address of created word
MOV @IP+,PC ; 4 Execute Master word
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
; INTERPRETER LOGIC
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
;https://forth-standard.org/standard/core/EXIT
-;C EXIT -- exit a colon definition; CALL #EXIT performs ASMtoFORTH
+;C EXIT -- exit a colon definition; CALL #EXIT performs ASMtoFORTH (10 cycles)
FORTHWORD "EXIT"
EXIT: MOV @RSP+,IP ; 2 pop previous IP (or next PC) from return stack
MOV @IP+,PC ; 4 = NEXT
MOV @IP+,PC ; 4 NEXT
; 11 = ITC - 2
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
; STACK OPERATIONS
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
;https://forth-standard.org/standard/core/DUP
;C DUP x -- x x duplicate top of stack
DROP: MOV @PSP+,TOS ; 2
mNEXT ; 4
+;https://forth-standard.org/standard/core/NIP
+;C NIP x1 x2 -- x2 Drop the first item below the top of stack
+ FORTHWORD "NIP"
+NIP: ADD #2,PSP ; 1
+ mNEXT ; 4
+
;https://forth-standard.org/standard/core/SWAP
;C SWAP x1 x2 -- x2 x1 swap top two items
FORTHWORD "SWAP"
;https://forth-standard.org/standard/core/OVER
;C OVER x1 x2 -- x1 x2 x1
FORTHWORD "OVER"
-OVER: SUB #2,PSP ; 2 -- x1 x x2
- MOV TOS,0(PSP) ; 3 -- x1 x2 x2
- MOV 2(PSP),TOS ; 2 -- x1 x2 x1
+OVER: MOV TOS,-2(PSP) ; 3 -- x1 (x2) x2
+ MOV @PSP,TOS ; 2 -- x1 (x2) x1
+ SUB #2,PSP ; 2 -- x1 x2 x1
mNEXT ; 4
;https://forth-standard.org/standard/core/ROT
MOV @RSP,TOS
mNEXT
-;;Z SP@ -- a-addr get data stack pointer, must leave PSTACK value if stack empty
-; FORTHWORD "SP@"
-SPFETCH: MOV TOS,-2(PSP) ;3
- MOV PSP,TOS ;1
- SUB #2,PSP ;1 post decrement stack...
- mNEXT
-
;https://forth-standard.org/standard/core/DEPTH
;C DEPTH -- +n number of items on stack, must leave 0 if stack empty
FORTHWORD "DEPTH"
RRA TOS ; TOS/2 --> TOS
mNEXT
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
; MEMORY OPERATIONS
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
;https://forth-standard.org/standard/core/Fetch
;C @ a-addr -- x fetch cell from memory
FETCH: MOV @TOS,TOS
mNEXT
-
;https://forth-standard.org/standard/core/Store
;C ! x a-addr -- store cell in memory
FORTHWORD "!"
;https://forth-standard.org/standard/core/CFetch
;C C@ c-addr -- char fetch char from memory
FORTHWORD "C@"
-CFETCH: MOV.B @TOS,TOS
- mNEXT
-
+CFETCH: MOV.B @TOS,TOS ;2
+ mNEXT ;4
;https://forth-standard.org/standard/core/CStore
;C C! char c-addr -- store char in memory
FORTHWORD "C!"
-CSTORE: MOV @PSP+,W ;2
- MOV.B W,0(TOS) ;3
+CSTORE: MOV.B @PSP+,0(TOS);4
+ ADD #1,PSP ;1
MOV @PSP+,TOS ;2
mNEXT
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
; ARITHMETIC OPERATIONS
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
;https://forth-standard.org/standard/core/Plus
;C + n1/u1 n2/u2 -- n3/u3 add n1+n2
mNEXT
;https://forth-standard.org/standard/core/Minus
-;C - n1/u1 n2/u2 -- n3/u3 subtract n1-n2
+;C - n1/u1 n2/u2 -- n3/u3 n3 = n1-n2
FORTHWORD "-"
-MINUS: MOV @PSP+,W ; 2
- SUB TOS,W ; 1
- MOV W,TOS ; 1
+MINUS: SUB @PSP+,TOS ;2 -- n2-n1
+NEGATE: XOR #-1,TOS ;1
+ONEPLUS: ADD #1,TOS ;1 -- n3 = -(n2-n1)
mNEXT
;https://forth-standard.org/standard/core/AND
;https://forth-standard.org/standard/core/NEGATE
;C NEGATE x1 -- x2 two's complement
FORTHWORD "NEGATE"
-NEGATE: XOR #-1,TOS
- ADD #1,TOS
- mNEXT
+ JMP NEGATE
;https://forth-standard.org/standard/core/ABS
;C ABS n1 -- +n2 absolute value
JN NEGATE
mNEXT
-; ----------------------------------------------------------------------
+;https://forth-standard.org/standard/double/DABS
+;C DABS d1 -- |d1| absolute value
+ FORTHWORD "DABS"
+DABBS: AND #-1,TOS ; clear V, set N
+ JGE DABBSEND ; JMP if positive
+DNEGATE: XOR #-1,0(PSP)
+ XOR #-1,TOS
+ ADD #1,0(PSP)
+ ADDC #0,TOS
+DABBSEND mNEXT
+
+;-------------------------------------------------------------------------------
; COMPARAISON OPERATIONS
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
;https://forth-standard.org/standard/core/ZeroEqual
;C 0= n/u -- flag return true if TOS=0
;https://forth-standard.org/standard/core/Zeroless
;C 0< n -- flag true if TOS negative
FORTHWORD "0<"
-ZEROLESS: ADD TOS,TOS ; set carry if TOS negative
- SUBC TOS,TOS ; TOS=-1 if carry was clear
- XOR #-1,TOS ; TOS=-1 if carry was set
+ZEROLESS: ADD TOS,TOS ;1 set carry if TOS negative
+ SUBC TOS,TOS ;1 TOS=-1 if carry was clear
+ XOR #-1,TOS ;1 TOS=-1 if carry was set
mNEXT
+;https://forth-standard.org/standard/core/Zeromore
+;C 0> n -- flag true if TOS positive
+ FORTHWORD "0>"
+ZEROMORE: CMP #1,TOS
+ JGE TOSTRUE
+ JMP TOSFALSE
+
;https://forth-standard.org/standard/core/Equal
;C = x1 x2 -- flag test x1=x2
FORTHWORD "="
-EQUAL: SUB @PSP+,TOS ; 2
- JNZ TOSFALSE ; 2 --> +4
-TOSTRUE MOV #-1,TOS ; 2 (MOV @R3+,TOS)
- mNEXT ; 4
+EQUAL: SUB @PSP+,TOS ;2
+ JNZ TOSFALSE ;2 --> +4
+TOSTRUE MOV #-1,TOS ;1
+ mNEXT ;4
;https://forth-standard.org/standard/core/less
;C < n1 n2 -- flag test n1<n2, signed
FORTHWORD "<"
-LESS: MOV @PSP+,W ; 2 W=n1
- SUB TOS,W ; 1 W=n1-n2 flags set
- JL TOSTRUE ; 2
-TOSFALSE MOV #0,TOS ; 1
- mNEXT ; 4
+LESS: MOV @PSP+,W ;2 W=n1
+ SUB TOS,W ;1 W=n1-n2 flags set
+ JL TOSTRUE ;2
+TOSFALSE MOV #0,TOS ;1
+ mNEXT ;4
;https://forth-standard.org/standard/core/more
;C > n1 n2 -- flag test n1>n2, signed
FORTHWORD ">"
-GREATER: SUB @PSP+,TOS ; 2 TOS=n2-n1
- JL TOSTRUE ; 2
- MOV #0,TOS ; 1
- mNEXT ; 4
+GREATER: SUB @PSP+,TOS ;2 TOS=n2-n1
+ JL TOSTRUE ;2
+ MOV #0,TOS ;1
+ mNEXT ;4
;https://forth-standard.org/standard/core/Uless
;C U< u1 u2 -- flag test u1<u2, unsigned
FORTHWORD "U<"
-ULESS: MOV @PSP+,W ; 2
- SUB TOS,W ; 1 u1-u2 in W, cy clear if borrow
- JNC TOSTRUE ; 2
- MOV #0,TOS ; 1
- mNEXT ; 4
+ULESS: MOV @PSP+,W ;2
+ SUB TOS,W ;1 u1-u2 in W, carry clear if borrow
+ JNC TOSTRUE ;2
+ MOV #0,TOS ;1
+ mNEXT ;4
-; ----------------------------------------------------------------------
-; BRANCH and LOOP OPERATIONS
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
+; BRANCH and LOOP OPERATORS
+;-------------------------------------------------------------------------------
;Z branch -- branch always
-; FORTHWORD "BRANCH"
BRAN: MOV @IP,IP ; 2
mNEXT ; 4
;Z ?branch x -- branch if TOS = zero
-; FORTHWORD "?BRANCH"
QBRAN: CMP #0,TOS ; 1 test TOS value
- MOV @PSP+,TOS ; 2 pop new TOS value (doesn't change flags)
+QBRAN1 MOV @PSP+,TOS ; 2 pop new TOS value (doesn't change flags)
JZ bran ; 2 if TOS was zero, take the branch = 11 cycles
ADD #2,IP ; 1 else skip the branch destination
mNEXT ; 4 ==> branch not taken = 10 cycles
+;Z 0?branch x -- branch if TOS <> zero
+QZBRAN: SUB #1,TOS ; 1 borrow (clear cy) if TOS was 0
+ SUBC TOS,TOS ; 1 TOS=-1 if borrow was set
+ JMP QBRAN1 ; 2
+
+
;Z (do) n1|u1 n2|u2 -- R: -- sys1 sys2 run-time code for DO
; n1|u1=limit, n2|u2=index
-; FORTHWORD "(DO)"
-
xdo: MOV #8000h,X ;2 compute 8000h-limit "fudge factor"
SUB @PSP+,X ;2
MOV TOS,Y ;1 loop ctr = index+fudge
; run-time code for +LOOP
; Add n to the loop index. If loop terminates, clean up the
; return stack and skip the branch. Else take the inline branch.
-; FORTHWORD "(+LOOP)"
-
xploop: ADD TOS,0(RSP) ;4 increment INDEX by TOS value
MOV @PSP+,TOS ;2 get new TOS, doesn't change flags
xloopnext BIT #100h,SR ;2 is overflow bit set?
; Add 1 to the loop index. If loop terminates, clean up the
; return stack and skip the branch. Else take the inline branch.
; Note that LOOP terminates when index=8000h.
-; FORTHWORD "(LOOP)"
-
xloop: ADD #1,0(RSP) ;4 increment INDEX
JMP xloopnext ;2
+;https://forth-standard.org/standard/core/UNLOOP
;C UNLOOP -- R: sys1 sys2 -- drop loop parms
FORTHWORD "UNLOOP"
UNLOOP: JMP UNXLOOP
+;https://forth-standard.org/standard/core/I
;C I -- n R: sys1 sys2 -- sys1 sys2
;C get the innermost loop index
FORTHWORD "I"
-II: SUB #2,PSP ; make room in TOS
- MOV TOS,0(PSP)
- MOV @RSP,TOS ; index = loopctr - fudge
- SUB 2(RSP),TOS
- mNEXT
+II: SUB #2,PSP ;1 make room in TOS
+ MOV TOS,0(PSP) ;3
+ MOV @RSP,TOS ;2 index = loopctr - fudge
+ SUB 2(RSP),TOS ;3
+ mNEXT ;4 13~
+;https://forth-standard.org/standard/core/J
;C J -- n R: 4*sys -- 4*sys
;C get the second loop index
FORTHWORD "J"
SUB 6(RSP),TOS
mNEXT
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
; SYSTEM VARIABLES & CONSTANTS
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
+
+;https://forth-standard.org/standard/core/PAD
+; PAD -- pad address
+ FORTHWORD "PAD"
+PAD mDOCON
+ .WORD PAD_ORG
+
+; TIB -- terminal input buffer address
+ FORTHWORD "TIB"
+TIB mDOCON
+ .WORD TIB_ORG ; constant, may be modified by IS
+
+; CPL -- terminal input buffer lenght (CPL = Chars Per Line)
+ FORTHWORD "CPL"
+CPL mDOCON
+ .WORD TIB_LEN ; constant, may be modified by IS
;https://forth-standard.org/standard/core/toIN
;C >IN -- a-addr holds offset in input stream
FBLANK: mDOCON
.word 32
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
; MULTIPLY
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
.IFNDEF MPY ; if no hardware MPY
;https://forth-standard.org/standard/core/UMTimes
;C UM* u1 u2 -- ud unsigned 16x16->32 mult.
FORTHWORD "UM*"
-UMSTAR: MOV @PSP,S ; U1 = MULTIPLICANDlo
- MOV #0,W ; 0 -> created MULTIPLICANDhi
- MOV #0,Y ; 0 -> created RESULTlo
- MOV #0,T ; 0 -> created RESULThi
- MOV #1,X ; BIT TEST REGISTER
+UMSTAR: MOV @PSP,S ;2 U1 = MULTIPLICANDlo
+ MOV #0,W ;1 0 -> created MULTIPLICANDhi
+ MOV #0,Y ;1 0 -> created RESULTlo
+ MOV #0,T ;1 0 -> created RESULThi
+ MOV #1,X ;1 BIT TEST REGISTER
UMSTARLOOP BIT X,TOS ;1 TEST ACTUAL BIT MULTIPLIER
JZ UMSTARNEXT ;2 IF 0: DO NOTHING
ADD S,Y ;1 IF 1: ADD MULTIPLICAND TO RESULT
ADDC W,W ;1 (RLC MSBs)
ADD X,X ;1 (RLA) NEXT BIT TO TEST
JNC UMSTARLOOP ;2 IF BIT IN CARRY: FINISHED 10~ loop
- MOV Y,0(PSP) ; low result on stack
- MOV T,TOS ; high result in TOS
+ MOV Y,0(PSP) ;3 low result on stack
+ MOV T,TOS ;1 high result in TOS
mNEXT
- .ENDIF ; hardware MPY
+ .ENDIF ; no hardware MPY
-; ----------------------------------------------------------------------------------------
-; ANS complement OPTION that include ALIGNMENT, PORTABILITY, ARITHMETIC and DOUBLE options
-; ----------------------------------------------------------------------------------------
+;-------------------------------------------------------------------------------
+; ANS complement OPTION
+;-------------------------------------------------------------------------------
.IFDEF ANS_CORE_COMPLIANT
.include "ADDON\ANS_COMPLEMENT.asm"
-; ----------------------------------------------------------------------------------------
-
.ELSEIF
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
; ALIGNMENT OPERATORS OPTION
-; ----------------------------------------------------------------------
- .IFDEF ALIGNMENT ; included in ANS_COMPLEMENT
- .include "ADDON\ALIGNMENT.asm"
- .ENDIF ; ALIGNMENT
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
+ .IFDEF ALIGNMENT ; included in ANS_COMPLEMENT
+ .include "ADDON\ALIGNMENT.asm"
+ .ENDIF ; ALIGNMENT
+
+;-------------------------------------------------------------------------------
; PORTABILITY OPERATORS OPTION
-; ----------------------------------------------------------------------
- .IFDEF PORTABILITY
- .include "ADDON\PORTABILITY.asm"
- .ENDIF ; PORTABILITY
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
+ .IFDEF PORTABILITY
+ .include "ADDON\PORTABILITY.asm"
+ .ENDIF ; PORTABILITY
+
+;-------------------------------------------------------------------------------
; ARITHMETIC OPERATORS OPTION
-; ----------------------------------------------------------------------
- .IFDEF ARITHMETIC ; included in ANS_COMPLEMENT
- .include "ADDON\ARITHMETIC.asm"
- .ENDIF ; ARITHMETIC
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
+ .IFDEF ARITHMETIC ; included in ANS_COMPLEMENT
+ .include "ADDON\ARITHMETIC.asm"
+ .ENDIF ; ARITHMETIC
+
+;-------------------------------------------------------------------------------
; DOUBLE OPERATORS OPTION
-; ----------------------------------------------------------------------
- .IFDEF DOUBLE ; included in ANS_COMPLEMENT
- .include "ADDON\DOUBLE.asm"
- .ENDIF ; DOUBLE
+;-------------------------------------------------------------------------------
+ .IFDEF DOUBLE ; included in ANS_COMPLEMENT
+ .include "ADDON\DOUBLE.asm"
+ .ENDIF ; DOUBLE
-; ----------------------------------------------------------------------------------------
.ENDIF ; ANS_COMPLEMENT
-; ----------------------------------------------------------------------------------------
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
; NUMERIC OUTPUT
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
; Numeric conversion is done last digit first, so
; the output buffer is built backwards in memory.
;https://forth-standard.org/standard/core/num-start
-;C <# -- begin numeric conversion (initialize Hold Pointer in PAD area)
+;C <# -- begin numeric conversion (initialize Hold Pointer)
FORTHWORD "<#"
LESSNUM: MOV #BASE_HOLD,&HP
mNEXT
; unsigned 32-BIT DIVIDEND : 16-BIT DIVISOR --> 32-BIT QUOTIENT, 16-BIT REMAINDER
-; DVDhi|DVDlo : DVR --> QUOThi|QUOTlo, REMAINDER
-; about 2 times faster if ud1 < 65536 (it's the general case)
-
-; input registers :
-; T = DIVISOR
-; S = DVDlo
-; W = DVDhi
-; output registers :
-; W = remainder
-; X = QUOTlo
-; Y = QUOThi
-; saved registers :
-; IP = count
-; TOS = DVD48
-
-UDIVQ32: ; use S,T,W,X,Y
- .word 151Eh ;4 PUSHM TOS,IP (1+1 push,TOS=Eh): save all no scratch registers before use
- MOV #0,TOS ;1 TOS = DVD48 = 0
- MOV #32,IP ;3 init loop count
- CMP #0,W ;1 DVDhi <> 0 ?
+; DVDhi|DVDlo : DIVlo --> QUOThi|QUOTlo REMlo
+; then REMlo is converted in ASCII char
+; 2 times faster if DVDhi = 0 (it's the general case)
+
+; Input: division NUM
+; -----------------------------
+; S = DVDlo (15-0) = ud1lo
+; TOS = DVDhi (31-16) = ud1hi
+; W = REMAINDER(15-0)
+; T = DIVlo = BASE
+; rDODOES = count
+
+; Output: division NUM
+; -----------------------------
+; X = QUOTlo = ud2lo
+; Y = QUOThi = ud2hi
+; W = REMlo = digit --> char --> -[HP]
+
+;https://forth-standard.org/standard/core/num
+;C # ud1lo ud1hi -- ud2lo ud2hi convert 1 digit of output
+ FORTHWORD "#"
+NUM MOV @PSP,S ;2 TOS = DVDhi, S = DVDlo
+ MOV.B &BASE,T ;3 T = DIVlo
+ MOV #0,W ;1 W = REMlo = 0
+ MOV #32,rDODOES ;2 init loop count
+ CMP #0,TOS ;1 DVDhi <> 0 ?
JNZ MDIV1 ;2 yes
- RRA IP ;1 no: loop count / 2
- MOV S,W ;1 DVD = DVD<<16
- MOV #0,S ;1
- MOV #0,X ;1 QUOTlo = 0
-MDIV1 CMP T,TOS ;1 DVD48 > divisor ?
- JNC MDIV2 ;2 U<
- SUB T,TOS ;1 DVD48 - DVR
-MDIV2 ADDC X,X ;1 RLC quotLO
- ADDC Y,Y ;1 RLC quotHI
- SUB #1,IP ;1 Decrement loop counter
- JN ENDMDIVIDE ;2 If 0< --> end
+ RRA rDODOES ;1 no: loop count / 2
+ MOV S,TOS ;1 DVDhi <-- DVDlo
+ MOV #0,S ;1 DVDlo <-- 0
+ MOV #0,X ;1 QUOTlo <-- 0 (to do QUOThi = 0 at the end of division)
+MDIV1: CMP T,W ;1 REMlo U>= DIVlo ?
+ JNC MDIV2 ;2 no
+ SUB T,W ;1 REMlo - DIVlo
+MDIV2: ADDC X,X ;1 RLC QUOTlo
+ ADDC Y,Y ;1 RLC QUOThi
+ SUB #1,rDODOES ;1 Decrement loop counter
+ JN ENDMDIV ;2 If 0< --> end
ADD S,S ;1 RLA DVDlo
- ADDC W,W ;1 RLC DVDhi
- ADDC TOS,TOS ;1 RLC DVD48
+ ADDC TOS,TOS ;1 RLC DVDhi
+ ADDC W,W ;1 RLC REMlo
JNC MDIV1 ;2 14~ loop
- SUB T,TOS ;1 DVD48 - DVR
+ SUB T,W ;1 REMlo - DIVlo
BIS #1,SR ;1 SETC
JMP MDIV2 ;2 14~ loop
-ENDMDIVIDE MOV TOS,W ;1 DVD48 ==> W = remainder
- .word 171Dh ;4 POPM IP, TOS
- RET ;4 27 words
-
-
-;https://forth-standard.org/standard/core/num
-;C # ud1lo:ud1hi -- ud2lo:ud2hi convert 1 digit of output
- FORTHWORD "#"
-NUM: MOV &BASE,T ;3 T = Divisor
- MOV @PSP,S ;2 S = DVDlo
- MOV TOS,W ;1 TOS ==> W = DVDhi
- CALL #UDIVQ32 ;4 use S,T,W,X,Y
+ENDMDIV MOV #xdodoes,rDODOES;2 restore rDODOES
MOV X,0(PSP) ;3 QUOTlo in 0(PSP)
MOV Y,TOS ;1 QUOThi in TOS
-TODIGIT CMP.B #10,W ;2 W = REMAINDER
+TODIGIT CMP.B #10,W ;2 W = REMlo
JLO TODIGIT1 ;2 U<
ADD #7,W ;2
TODIGIT1 ADD #30h,W ;2
HOLDW SUB #1,&HP ;3 store W=char --> -[HP]
MOV &HP,Y ;3
MOV.B W,0(Y) ;3
- mNEXT ;4 23 words, about 290/490 cycles/char
+ mNEXT ;4 45 words, about 270/492 cycles/char
;https://forth-standard.org/standard/core/numS
;C #S udlo:udhi -- udlo:udhi=0 convert remaining digits
FORTHWORD "#S"
NUMS: mDOCOL
.word NUM ;
-NUMS1 FORTHtoASM ;
- SUB #2,IP ;1 define NUM return
- CMP #0,X ;1 test udlo first
+ FORTHtoASM ;
+ SUB #2,IP ;1 restore NUM return
+ CMP #0,X ;1 test ud2lo first (generally true)
JNZ NUM ;2
- CMP #0,TOS ;1 then udhi
+ CMP #0,TOS ;1 then test ud2hi (generally false)
JNZ NUM ;2
-NUMSEND MOV @RSP+,IP ;2
- mNEXT ;4
+ MOV @RSP+,IP ;2
+ mNEXT ;4 about 280/505 cycles/char
;https://forth-standard.org/standard/core/num-end
;C #> udlo:udhi=0 -- c-addr u end conversion, get string
MOV @PSP+,TOS ;2
JMP HOLDW ;15
-;;https://forth-standard.org/standard/core/HOLDS
-;;Adds the string represented by addr u to the pictured numeric output string
-;;compilation use: <# S" string" HOLDS #>
-;;free HOLDS chars space in the 34 bytes HOLD area (requested by ANS) = 24 chars if hexa, 22 chars if decimal, 0 if binary.
-;;C HOLDS addr u --
-; FORTHWORD "HOLDS"
-;HOLDS MOV @PSP+,X ;2
-; ADD TOS,X ;1 src
-; MOV &HP,Y ;3 dst
-;HOLDSLOOP SUB #1,Y ;1 dst-1
-; SUB #1,X ;1 src-1
-; SUB #1,TOS ;1 cnt-1
-; JLO HOLDSNEXT ;2 u<
-; MOV.B @X,0(Y) ;4
-; JMP HOLDSLOOP ;2
-;HOLDSNEXT MOV Y,&HP ;3
-; MOV @PSP+,TOS ;2
-; mNEXT ;4 15 words
-
;https://forth-standard.org/standard/core/SIGN
;C SIGN n -- add minus sign if n<0
FORTHWORD "SIGN"
JN HOLDW ; 0<
mNEXT
-;X UD. udlo udhi -- display ud (unsigned)
- FORTHWORD "UD."
-UDDOT: mDOCOL
- .word LESSNUM,NUMS,NUMGREATER,TYPE
- .word SPACE,EXIT
-
;https://forth-standard.org/standard/core/Ud
;C U. u -- display u (unsigned)
FORTHWORD "U."
-UDOT: SUB #2,PSP
- MOV TOS,0(PSP)
- MOV #0,TOS
- JMP UDDOT
-
-;https://forth-standard.org/standard/double/DABS
-;C DABS d1 -- |d1| absolute value
-; FORTHWORD "DABS"
-DABBS: BIT #8000h,TOS ; 1
- JZ DABBSEND
- XOR #-1,0(PSP)
- XOR #-1,TOS
- ADD #1,0(PSP)
- ADDC #0,TOS
-DABBSEND mNEXT
+UDOT: mDOCOL
+ .word LESSNUM,lit,0,NUMS,NUMGREATER,TYPE,SPACE,EXIT
;https://forth-standard.org/standard/double/Dd
;C D. dlo dhi -- display d (signed)
;https://forth-standard.org/standard/core/d
;C . n -- display n (signed)
FORTHWORD "."
-DOT: BIT #8000h,TOS
- JZ UDOT
+DOT: CMP #0,TOS
+ JGE UDOT
SUB #2,PSP
- MOV #-1,TOS
+ MOV TOS,0(PSP)
+ MOV #-1,TOS ; extend sign
JMP DDOT
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
; DICTIONARY MANAGEMENT
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
;https://forth-standard.org/standard/core/HERE
;C HERE -- addr returns dictionary ptr
CALL #RXOFF ;
mNEXT
-;https://forth-standard.org/standard/facility/KEYq
;F KEY? -- c get character from input device ; deferred word
; FORTHWORD "KEY?"
-KEYTST: MOV #PARENKEYTST,PC
+;KEYTST: MOV #PARENKEYTST,PC
;Z (KEY) -- c get character from the terminal
FORTHWORD "KEY"
KEY: MOV #PARENKEY,PC
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
; INTERPRETER INPUT, the kernel of kernel !
-; ----------------------------------------------------------------------
-
- .IFDEF SD_CARD_LOADER ; ACCEPT becomes a DEFERred word
+;-------------------------------------------------------------------------------
- .include "forthMSP430FR_SD_ACCEPT.asm" ; that creates SD_ACCEPT and (SD_ACCEPT)
+ .IFDEF SD_CARD_LOADER
+ .include "forthMSP430FR_SD_ACCEPT.asm" ; that creates SD_ACCEPT
+ .ENDIF ; SD_CARD_LOADER
- .ELSE ; ACCEPT is not a DEFERred word
;https://forth-standard.org/standard/core/ACCEPT
-;C ACCEPT addr len -- len' get line at addr to interpret len' chars
+;C ACCEPT addr addr len -- addr' len' get line at addr to interpret len' chars
FORTHWORD "ACCEPT"
-ACCEPT:
+ACCEPT MOV #PARENACCEPT,PC
- .ENDIF
+;C (ACCEPT) addr addr len -- addr len' get len' (up to len) chars from terminal (TERATERM.EXE) via USBtoUART bridge
+ FORTHWORD "(ACCEPT)"
+PARENACCEPT
; con speed of TERMINAL link, there are three bottlenecks :
; 1- time to send XOFF/RTS_high on CR (CR+LF=EOL), first emergency.
; --------------------------------------;
MOV #ENDACCEPT,S ;2 S = ACCEPT XOFF return
MOV #AKEYREAD1,T ;2 T = default XON return
- .word 152Dh ;5 PUSHM IP,S,T, as IP ret, ACCEPT XOFF ret, XON ret
+; .word 1537h ;6 in advance, we can also save R7 to R4
+ .word 152Dh ;5 PUSHM IP,S,T, as IP ret, XOFF ret, XON ret
MOV TOS,W ;1 -- addr len
MOV @PSP,TOS ;2 -- org ptr )
ADD TOS,W ;1 -- org ptr W=Bound )
MOV #20h,S ;2 S = 'BL' to speed up char loop in part II ) for TERMINAL_INT use
MOV #AYEMIT_RET,IP ;2 IP = return for YEMIT )
BIT #UCRXIFG,&TERMIFG ;3 RX_Int ?
- JZ ACCEPTNEXT ;2 no : case of FORTH init or input terminal quiet
+ JZ ACCEPTNEXT ;2 no : case of quiet input terminal
MOV &TERMRXBUF,Y ;3 yes: clear RX_Int
CMP #0Ah,Y ;2 received char = LF ? (end of downloading ?)
- JNZ RXON ;2 no : RXON return ==> AKEYREAD1, to process first char of new line.
-ACCEPTNEXT ADD #2,RSP ;1 yes: remove previous XON return address,
- MOV #SLEEP,X ;2 set XON return ==> SLEEP
-; MOV #PARENSLEEP,X ;2 set XON return ==> SLEEP
- .word 154Dh ;7 PUSHM IP,S,T,W,X
+ JNZ RXON ;2 no : RXON return = AKEYREAD1, to process first char of new line.
+ACCEPTNEXT ADD #2,RSP ;1 yes: remove AKEYREAD1 as XON return,
+ MOV #SLEEP,X ;2 and set XON return = SLEEP
+ .word 154Dh ;7 PUSHM IP,S,T,W,X before SLEEP (and so WAKE on any interrupts)
; --------------------------------------;
; ======================================;
; ======================================;
.IFDEF TERMINALXONXOFF ;
MOV #17,&TERMTXBUF ;4 move char XON into TX_buf
+ .ENDIF ;
+ .IFDEF TERMINALCTSRTS ;
+ BIC.B #RTS,&HANDSHAKOUT ;4 set RTS low
+ .ENDIF ;
+ .IFDEF TERMINALXONXOFF ;
.IF TERMINALBAUDRATE/FREQUENCY <230400
RXON_LOOP BIT #UCTXIFG,&TERMIFG ;3 wait the sending end of XON, useless at high baudrates
JZ RXON_LOOP ;2
- .ENDIF
.ENDIF ;
- .IFDEF TERMINALCTSRTS ;
- BIC.B #RTS,&HANDSHAKOUT ;4 set RTS low
.ENDIF ;
; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv;
; starts first and 3th stopwatches ;
; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^;
- RET ;4 to BACKGND or AKEYREAD1
-; --------------------------------------;
+ RET ;4 to BACKGND (End of file download or quiet input) or AKEYREAD1 (get next line of file downloading)
+; --------------------------------------; ...or user defined
+; ASMWORD "RXON"
+; JMP RXON
+
+; ASMWORD "RXOFF"
; ======================================;
RXOFF: ; NOP11
; ======================================;
.IFDEF TERMINALXONXOFF ;
MOV #19,&TERMTXBUF ;4 move XOFF char into TX_buf
+ .ENDIF ;
+ .IFDEF TERMINALCTSRTS ;
+ BIS.B #RTS,&HANDSHAKOUT ;4 set RTS high
+ .ENDIF ;
+ .IFDEF TERMINALXONXOFF ;
.IF TERMINALBAUDRATE/FREQUENCY <230400
RXOFF_LOOP BIT #UCTXIFG,&TERMIFG ;3 wait the sending end of XOFF, useless at high baudrates
JZ RXOFF_LOOP ;2
- .ENDIF
.ENDIF ;
- .IFDEF TERMINALCTSRTS ;
- BIS.B #RTS,&HANDSHAKOUT ;4 set RTS high
.ENDIF ;
RET ;4 to ENDACCEPT, ...or user defined
; --------------------------------------;
-; redirection of word SLEEP to word BACKGROUND is easy: MOV #SLEEP,X
-; MOV #BACKGROUND,2(X)
-;
-; ...but this word BACKGROUND must be ended by: MOV #(SLEEP),PC
-;
-; removing redirection made by : MOV #SLEEP,X
-; MOV #(SLEEP),2(X)
-;
+
; --------------------------------------;
- ASMWORD "SLEEP" ;
+ ASMWORD "SLEEP" ; may be redirected
SLEEP: ;
MOV #PARENSLEEP,PC ;3
; --------------------------------------;
; --------------------------------------;
- ASMWORD "(SLEEP)"
+ ASMWORD "(SLEEP)" ;
PARENSLEEP: ;
BIS &LPM_MODE,SR ;3 enter in LPMx sleep mode with GIE=1
-; --------------------------------------; default mode : LPM0.
+; --------------------------------------; default FAST FORTH mode (for its input terminal use) : LPM0.
+;###############################################################################################################
+;###############################################################################################################
; ### # # ####### ####### ###### ###### # # ###### ####### ##### # # ####### ###### #######
; # ## # # # # # # # # # # # # # # # # # # # #
; # # ## # # # # # # # # # # # # # # # # # #
; ### # # # ####### # # # # ##### # # ##### # # ####### # # #######
+;###############################################################################################################
+;###############################################################################################################
+
; here, Fast FORTH sleeps, waiting any interrupt.
; IP,S,T,W,X,Y registers (R13 to R8) are free for any interrupt routine...
; ...and so PSP and RSP stacks with their rules of use.
-; remember : in any interrupt routine you must include : BIC #0xF8,0(RSP) before RETI
+; remember: in any interrupt routine you must include : BIC #0x78,0(RSP) before RETI
; to force return to SLEEP.
-; or simply (previous SR flags are lost): ADD #2 RSP, then RET instead of RETI
+; or (bad idea ? previous SR flags are lost) simply : ADD #2 RSP, then RET instead of RETI
; ======================================;
- JMP SLEEP ;2 and here is the return for any interrupts, else TERMINAL_INT :-)
-; JMP PARENSLEEP ;2 and here is the return for any interrupts, else TERMINAL_INT :-)
+ JMP SLEEP ;2 here is the return for any interrupts, else TERMINAL_INT :-)
; ======================================;
; **************************************;
-TERMINAL_INT: ; <--- UCA0 RX interrupt vector, delayed by the LPMx wake up time
+TERMINAL_INT: ; <--- TEMR RX interrupt vector, delayed by the LPMx wake up time
; **************************************; if wake up time increases, max bauds rate decreases...
; (ACCEPT) part II under interrupt ; Org Ptr -- len'
; --------------------------------------;
- ADD #4,RSP ;1 remove SR and PC from stack
- .word 173Ah ;6 POPM W=bound,T=0Dh,S=20h,IP=AYEMIT_RET
+ ADD #4,RSP ;1 remove SR and PC from stack, SR flags are lost (unused by FORTH interpreter)
+ .word 173Ah ;6 POPM W=buffer_bound,T=0Dh,S=20h,IP=AYEMIT_RET
; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv;
; starts the 2th stopwatch ;
; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^;
AKEYREAD1 ; <--- XON RET address 2 ; first emergency: anticipate XOFF on CR as soon as possible
CMP.B T,Y ;1 char = CR ?
JZ RXOFF ;2 then RET to ENDACCEPT
-; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv;+ 4
-; stops the first stopwatch ; first bottleneck, best case result: 24~ + LPMx wake_up time..
+; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv;+ 4 to send RXOFF
+; stops the first stopwatch ;= first bottleneck, best case result: 24~ + LPMx wake_up time..
; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^; ...or 11~ in case of empty line
CMP.B S,Y ;1 printable char ?
JHS ASTORETEST ;2 yes
CMP.B #8,Y ; char = BS ?
- JNE WAITaKEY ;
+ JNE WAITaKEY ; case of other control chars
; --------------------------------------;
-; start of backspace ;
+; start of backspace ; made only by an human
; --------------------------------------;
-BACKSPACE CMP @PSP,TOS ; Ptr = Org ?
+ CMP @PSP,TOS ; Ptr = Org ?
JZ WAITaKEY ; yes: do nothing
SUB #1,TOS ; no : dec Ptr
; --------------------------------------;
; --------------------------------------;
; end of backspace ;
; --------------------------------------;
-ASTORETEST CMP W,TOS ; 1 Bound is reached ? (protect against big lines without CR, UNIX like)
- JZ YEMIT ; 2 yes, send echo without store, then loopback
-ASTORE MOV.B Y,0(TOS) ; 3 no, store char @ Ptr before send echo, then loopback
+ASTORETEST CMP W,TOS ; 1 Bound is reached ?
+ JZ YEMIT ; 2 yes: send echo then loopback
+ MOV.B Y,0(TOS) ; 3 no: store char @ Ptr, send echo then loopback
ADD #1,TOS ; 1 increment Ptr
YEMIT: .word 4882h ; hi7/4~ lo:12/4~ send/send_not echo to terminal
.word TERMTXBUF ; 3 MOV Y,&TERMTXBUF
; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^;
; --------------------------------------;
-ENDACCEPT ; <--- XOFF RET address
+ENDACCEPT ; <--- XOFF return address
; --------------------------------------;
- MOV #LPM0+GIE,&LPM_MODE ; reset LPM_MODE to default mode LPM0
-DROPEXIT SUB @PSP+,TOS ; Org Ptr -- len'
+ MOV #LPM0+GIE,&LPM_MODE ; reset LPM_MODE to default mode LPM0 for next line of input stream
+DROPEXIT
+; .word 1734h ;6 we can also restore R7 to R4
+ SUB @PSP+,TOS ; Org Ptr -- len'
MOV @RSP+,IP ; 2 and continue with INTERPRET with GIE=0.
; So FORTH machine is protected against any interrupt...
mNEXT ; ...until next falling down to LPMx mode of (ACCEPT) part1,
YEMIT2 BIT #UCTXIFG,&TERMIFG ; 3 wait the sending end of previous char (usefull for low baudrates)
JZ YEMIT2 ; 2
.ENDIF
- JMP YEMIT
+ JMP YEMIT ;9 12~
;https://forth-standard.org/standard/core/EMIT
;C EMIT c -- output character to the output device ; deferred word
FORTHWORD "EMIT"
-EMIT: MOV #PARENEMIT,PC ; 3
+EMIT: MOV #PARENEMIT,PC ;3 15~
;Z ECHO -- connect console output (default)
;https://forth-standard.org/standard/core/SPACE
;C SPACE -- output a space
FORTHWORD "SPACE"
-SPACE: SUB #2,PSP
- MOV TOS,0(PSP)
- MOV #20h,TOS
- JMP EMIT
+SPACE: SUB #2,PSP ;1
+ MOV TOS,0(PSP) ;3
+ MOV #20h,TOS ;2
+ JMP EMIT ;17~ 23~
;https://forth-standard.org/standard/core/SPACES
;C SPACES n -- output n spaces
JZ SPACESEND
PUSH IP
MOV #SPACESNEXT,IP
- JMP SPACE
+ JMP SPACE ;25~
SPACESNEXT FORTHtoASM
- SUB #2,IP
- SUB #1,TOS
- JNZ SPACE
+ SUB #2,IP ;1
+ SUB #1,TOS ;1
+ JNZ SPACE ;25~ ==> 27~ by space ==> 2.963 MBds @ 8 MHz
MOV @RSP+,IP
SPACESEND MOV @PSP+,TOS
mNEXT
MOV W,TOS
mDOCOL
.word xdo
-TYPELOOP .word II,CFETCH,EMIT,xloop,TYPELOOP
+TYPELOOP .word II,CFETCH,EMIT,xloop,TYPELOOP ; 13+6+15+16= 50~ char loop ==> 1.6MBds @ 8MHz
.word EXIT
ADDC #0,IP ; 1 -- addr u IP=addr+u aligned
mNEXT ; 4 16~
+ .IFDEF LOWERCASE
+
+ FORTHWORD "CAPS_ON"
+CAPS_ON: MOV #-1,&CAPS ; state by default
+ mNEXT
+
+ FORTHWORD "CAPS_OFF"
+CAPS_OFF: MOV #0,&CAPS
+ mNEXT
+
;https://forth-standard.org/standard/core/Sq
;C S" -- compile in-line string
FORTHWORDIMM "S\34" ; immediate
SQUOTE: mDOCOL
.word lit,XSQUOTE,COMMA
-SQUOTE1 .word lit,'"',WORDD ; -- c-addr (= HERE)
+SQUOTE1 .word CAPS_OFF
+ .word lit,'"',WORDD ; -- c-addr (= HERE)
+ .word CAPS_ON
FORTHtoASM
MOV @RSP+,IP
MOV.B @TOS,TOS ; -- u
ADDC #2,&DDP ;4 +2 bytes
mNEXT
- .IFDEF LOWERCASE
+ .ELSE
- FORTHWORD "CAPS_ON"
-CAPS_ON: MOV #-1,&CAPS ; state by default
+;https://forth-standard.org/standard/core/Sq
+;C S" -- compile in-line string
+ FORTHWORDIMM "S\34" ; immediate
+SQUOTE: mDOCOL
+ .word lit,XSQUOTE,COMMA
+SQUOTE1 .word lit,'"',WORDD ; -- c-addr (= HERE)
+ FORTHtoASM
+ MOV @RSP+,IP
+ MOV.B @TOS,TOS ; -- u
+ SUB #1,TOS ; -1 byte
+ ADD TOS,&DDP
+ MOV @PSP+,TOS
+CELLPLUSALIGN
+ BIT #1,&DDP ;3 carry set if 1
+ ADDC #2,&DDP ;4 +2 bytes
mNEXT
- FORTHWORD "CAPS_OFF"
-CAPS_OFF: MOV #0,&CAPS
- mNEXT
+ .ENDIF ; LOWERCASE
;https://forth-standard.org/standard/core/Dotq
;C ." -- compile string to print
FORTHWORDIMM ".\34" ; immediate
DOTQUOTE: mDOCOL
- .word CAPS_OFF
.word SQUOTE
- .word CAPS_ON
.word lit,TYPE,COMMA,EXIT
- .ELSE
-
-;https://forth-standard.org/standard/core/Dotq
-;C ." -- compile string to print
- FORTHWORDIMM ".\34" ; immediate
-DOTQUOTE: mDOCOL
- .word SQUOTE
- .word lit,TYPE,COMMA,EXIT
-
- .ENDIF ; LOWERCASE
-
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
; INTERPRETER
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
;https://forth-standard.org/standard/core/WORD
;C WORD char -- addr Z=1 if len=0
-; parse a word delimited by char ( and begining usually at [TIB])
+; parse a word delimited by char separator
; "word" is capitalized
; TOIN is the relative displacement into buffer
-; empty line = 25 cycles + 7 cycles by char
+; spaces (as separator) filled line = 25 cycles + 7 cycles by char
FORTHWORD "WORD"
WORDD: MOV #SOURCE_LEN,S ;2 -- separator
MOV @S+,X ;2 X = buf_len
CMP.B @W+,TOS ;2 does char = separator ?
JZ SKIPCHARLOO ;2 -- separator if yes
SCANWORD SUB #1,W ;1
- MOV #96,T ;2 T = 96 = ascii(a)-1 (test value in register before SCANWORD loop)
+ MOV #96,T ;2 T = 96 = ascii(a)-1 (test value set in a register before SCANWORD loop)
SCANWORDLOO ; -- separator 15/23 cycles loop for upper/lower case char... write words in upper case !
MOV.B S,0(Y) ;3 first time puts anything in dst word length, then put char @ dst.
CMP W,X ;1 buf_ptr = buf_end ?
ADD #1,Y ;1 increment dst just before test loop
CMP.B S,T ;1 char U< 'a' ? ('a'-1 U>= char) this condition is tested at each loop
JC SCANWORDLOO ;2 15~ upper case char loop
- .IFDEF LOWERCASE ; enable lowercase strings
+ .IFDEF LOWERCASE ;
QCAPS CMP #0,&CAPS ;3 CAPS is OFF ? (case available only for ABORT" ." .( )
JZ SCANWORDLOO ;2 yes
.ENDIF ; LOWERCASE ; here CAPS is ON (other cases)
CMP.B #123,S ;2 char U>= 'z'+1 ?
JC SCANWORDLOO ;2 if yes
SUB.B #32,S ;2 convert lowercase char to uppercase
- JMP SCANWORDLOO ;2 28~ lower case char loop
+ JMP SCANWORDLOO ;2
SCANWORDEND SUB &SOURCE_ADR,W ;3 -- separator W=buf_ptr - buf_org = new >IN (first char separator next)
MOV W,&TOIN ;3 update >IN
mNEXT ;4 42/47 words
-
THREEDROP ADD #2,PSP
TWODROP ADD #2,PSP
MOV @PSP+,TOS
; ----------------------------------;
; decimal point process add-on ;
; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv;
- BIC #UF1,SR ;2 reset flag UF1 used here as Decimal Point flag
+ BIC #UF9,SR ;2 reset flag UF9 used here as Decimal Point flag
MOV.B @TOS,IP ;2 IP = count of chars
ADD TOS,IP ;1 IP = end address
MOV TOS,S ;1 S = ptr
JLO SearchDPEND ;2
CMP.B @S+,W ;2 DP found ?
JNE SearchDP ;2 7~ loop by char
-DPfound BIS #UF1,SR ;2 DP found: set flag UF1
+DPfound BIS #UF9,SR ;2 DP found: set flag UF9
DPrubLoop MOV.B @S+,-2(S) ;4 rub out decimal point
CMP S,IP ;1 and move left one all susbsequent chars
JHS DPrubLoop ;2 7~ loop by char
SUB.B #'$',W ;2 = 0 ==> "$" : hex number ?
JZ PREFIXED ;2
QBINARY MOV #2,T ;1 BASE = 2
- SUB.B #1,W ;1 "%" - "$" - 1 = 0 ==> '%' : hex number ?
+ SUB.B #1,W ;1 "%" - "$" - 1 = 0 ==> '%' : bin number ?
JZ PREFIXED ;2
QDECIMAL ADD #8,T ;1 BASE = 10
ADD.B #2,W ;1 "#" - "%" + 2 = 0 ==> '#' : decimal number ?
XOR #-1,0(PSP) ;3 -- dlo-1 udhi tf
ADD #1,2(PSP) ;3 -- dlo dhi-1 tf
ADDC #0,0(PSP) ;3 -- dlo dhi tf
-QDOUBLE BIT #UF1,SR ;2 decimal point added ?
+QDOUBLE BIT #UF9,SR ;2 decimal point added ?
JNZ QNUMEND ;2 leave double
ADD #2,PSP ;1 leave number
QNUMEND mNEXT ;4 90 words TOS=-1 and Z=0 ==> conversion ok
; ----------------------------------;
; decimal point process add-on ;
; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv;
- BIC #UF1,SR ;2 reset flag UF1 used here as decimal point flag
+ BIC #UF9,SR ;2 reset flag UF9 used here as decimal point flag
MOV.B @TOS,IP ;2 IP = count of chars
ADD TOS,IP ;1 IP = end address
MOV TOS,S ;1 S = ptr
JLO SearchDPEND ;2
CMP.B @S+,W ;2 DP found ?
JNE SearchDP ;2 7~ loop by char
-DPfound BIS #UF1,SR ;2 DP found: set flag UF1
+DPfound BIS #UF9,SR ;2 DP found: set flag UF9
DPrubLoop MOV.B @S+,-2(S) ;4 rub out decimal point
CMP S,IP ;1 and move left one all susbsequent chars
JHS DPrubLoop ;2 7~ loop by char
XOR #-1,0(PSP) ;3 -- dlo-1 udhi tf
ADD #1,2(PSP) ;3 -- dlo dhi-1 tf
ADDC #0,0(PSP) ;3 -- dlo dhi tf
-QDOUBLE BIT #UF1,SR ;2 decimal point added ?
+QDOUBLE BIT #UF9,SR ;2 decimal point added ?
JNZ QNUMEND ;2 process double numbers
ADD #2,PSP ;
QNUMEND mNEXT ;4 100 words TOS=-1 and Z=0 ==> conversion ok
.ENDIF ; MPY
-
;https://forth-standard.org/standard/core/EXECUTE
;C EXECUTE i*x xt -- j*x execute Forth word at 'xt'
FORTHWORD "EXECUTE"
;https://forth-standard.org/standard/core/LITERAL
;C LITERAL (n|d) -- append single numeric literal if compiling state
-; (n|d) -- append double numeric literal if compiling state and if UF1=1 (not ANS)
+; (n|d) -- append double numeric literal if compiling state and if UF9=1 (not ANS)
FORTHWORDIMM "LITERAL" ; immediate
LITERAL: CMP #0,&STATE ;3
JZ LITERALEND ;2
- BIT #UF1,SR ;2
- JZ LITERAL1 ;2
-LITERAL2 MOV &DDP,W ;3
- ADD #4,&DDP ;3
- MOV #lit,0(W) ;4
- MOV @PSP+,2(W) ;3
LITERAL1 MOV &DDP,W ;3
ADD #4,&DDP ;3
MOV #lit,0(W) ;4
MOV TOS,2(W) ;3
MOV @PSP+,TOS ;2
-LITERALEND mNEXT ;4 24~
+ BIT #UF9,SR ;2
+ BIC #UF9,SR ;2
+ JNZ LITERAL1 ;2
+LITERALEND mNEXT ;4 30~
;https://forth-standard.org/standard/core/COUNT
;C COUNT c-addr1 -- adr len counted->adr/len
;C INTERPRET i*x addr u -- j*x interpret given buffer
; This is the common factor of EVALUATE and QUIT.
; Absent from forth 2012
-
+; set addr, u as input buffer then parse it word by word
; FORTHWORD "INTERPRET"
INTERPRET: MOV TOS,&SOURCE_LEN ; -- addr u buffer lentgh ==> ticksource variable
MOV @PSP+,&SOURCE_ADR ; -- u buffer address ==> ticksource+2 variable
JZ COMMA ;2 c-addr -- if W xor STATE = 0 compile xt then loop back to INTLOOP
JNZ EXECUTE ;2 c-addr -- if W xor STATE <> 0 execute then loop back to INTLOOP
-INTQNUMNEXT FORTHtoASM ; -- n|c-addr fl Z = not a number
+INTQNUMNEXT FORTHtoASM ; -- n|c-addr fl Z = not a number, UF9 = double number request
MOV @PSP+,TOS ;2
MOV #INTLOOP,IP ;2 -- n|c-addr define LITERAL return
JNZ LITERAL ;2 n -- execute LITERAL then loop back to INTLOOP
ADD TOS,Y ;1
MOV.B #'?',0(Y) ;5 add '?' to end of word
MOV #FQABORTYES,IP ;2 define COUNT return
- JMP COUNT ;2 c-addr -- 44 words
+ JMP COUNT ;2 -- addr len 44 words
;https://forth-standard.org/standard/core/EVALUATE
; EVALUATE \ i*x c-addr u -- j*x interpret string
FORTHWORD "EVALUATE"
-EVALUATE: MOV #SOURCE_LEN,X
- PUSH @X+ ;4 push SOURCE_LEN
- PUSH @X+ ;4 push SOURCE_ADR
- PUSH @X+ ;4 push TOIN
- PUSH IP
+EVALUATE: MOV #SOURCE_LEN,X ;2
+ MOV @X+,S ;2 S = SOURCE_LEN
+ MOV @X+,T ;2 T = SOURCE_ADR
+ MOV @X+,W ;2 W = TOIN
+ .word 153Dh ;6 PUSHM IP,S,T,W
ASMtoFORTH
.word INTERPRET
FORTHtoASM
- MOV @RSP+,IP ;2
MOV @RSP+,&TOIN ;4
MOV @RSP+,&SOURCE_ADR ;4
MOV @RSP+,&SOURCE_LEN ;4
+ MOV @RSP+,IP ;2
mNEXT
;https://forth-standard.org/standard/core/QUIT
MOV #LSTACK,&LEAVEPTR
MOV #0,&STATE
- MOV #0,&SAVE_SYSRSTIV ;
+ .IFDEF SD_CARD_LOADER
+ .IFDEF CONDCOMP
+ .IFDEF BOOTLOADER
+; ----------------------------------;
+; BOOTSTRAP TEST ;
+; ----------------------------------;
+ CMP #0,&SAVE_SYSRSTIV ; if WARM
+ JZ QUIT0 ; no boostrap
+ BIT.B #SD_CD,&SD_CDIN ; SD_memory in SD_Card module ?
+ JNZ QUIT0 ; no
+; ----------------------------------;
+; BOOTSTRAP ; on SYSRSTIV <> 0
+; ----------------------------------;
+ SUB #2,PSP ;
+ MOV TOS,0(PSP) ;
+ MOV &SAVE_SYSRSTIV,TOS ;
+ MOV #0,&SAVE_SYSRSTIV ;
+ ASMtoFORTH ;
+ .word NOECHO ; warning ! your BOOT.4TH must to be finish with ECHO command!
+ .word XSQUOTE ; -- addr u
+ .byte 15,"LOAD\34 BOOT.4TH\34" ; issues error 2 if no such file...
+ .word BRAN,QUIT4 ;
+; ----------------------------------;
+ .ENDIF
+ .ENDIF
+ .ENDIF
-QUIT0 ASMtoFORTH
+QUIT0 MOV #0,&SAVE_SYSRSTIV ;
+ ASMtoFORTH
QUIT1 .word XSQUOTE
- .byte 4,13,"ok " ; CR + system prompt
-QUIT2 .word TYPE
-QUIT3 .word lit,TIB,DUP,lit,TIB_SIZE ; -- StringOrg StringOrg len
- .word ACCEPT ; -- StringOrg len'
+ .byte 3,13,"ok" ; CR + system prompt
+QUIT2 .word TYPE,SPACE
+QUIT3 .word TIB,DUP,CPL ; -- StringOrg StringOrg maxlenght
+ .word ACCEPT ; -- StringOrg len' (len' <= maxlenght)
.word SPACE
QUIT4 .word INTERPRET
- .word lit,PSTACK-2,SPFETCH,ULESS
+ .word DEPTH,ZEROLESS
.word XSQUOTE
- .byte 13,"stack empty !"
+ .byte 13,"stack empty! "
.word QABORT
.word lit,FRAM_FULL,HERE,ULESS
.word XSQUOTE
- .byte 11,"FRAM full !"
+ .byte 11,"FRAM full! "
.word QABORT
.word FSTATE,FETCH
.word QBRAN,QUIT1 ; case of interpretion state
.word XSQUOTE ; case of compilation state
- .byte 4,13," " ; CR + 3 spaces
+ .byte 3,13,32,32 ; CR + 2 blanks
.word BRAN,QUIT2
;https://forth-standard.org/standard/core/ABORT
QABORT: CMP #0,2(PSP) ; -- f c-addr u flag test
QABORTNO JZ THREEDROP
-QABORTYES MOV #4882h,&YEMIT ; restore default YEMIT = set ECHO
+QABORTYES MOV #4882h,&YEMIT ; -- c-addr u restore default YEMIT = set ECHO
+
.IFDEF SD_CARD_LOADER ; close all handles
- MOV &CurrentHdl,T
-QABORTCLOSE
- CMP #0,T
- JZ QABORTYESNOECHO
- MOV.B #0,HDLB_Token(T)
- MOV @T,T
- JMP QABORTCLOSE
+ MOV &CurrentHdl,T
+QABORTCLOSE CMP #0,T
+ JZ QABORTYESNOECHO
+ MOV.B #0,HDLB_Token(T)
+ MOV @T,T
+ JMP QABORTCLOSE
.ENDIF
- ; -- c-addr u
; ----------------------------------;
QABORTYESNOECHO ; <== WARM jumps here, thus, if NOECHO, TERMINAL can be disconnected without freezing the app
; ----------------------------------;
- CALL #QAB_DEFER ; restore default deferred words ....else WARM.
- .IFDEF MSP430ASSEMBLER ; reset all branch labels
- MOV #0,&CLRBW1
- MOV #0,&CLRBW2
- MOV #0,&CLRBW3
- MOV #0,&CLRFW1
- MOV #0,&CLRFW2
- MOV #0,&CLRFW3
- .ENDIF
-
-
+ CALL #QAB_DEFER ; restore default deferred words ....else WARM and SLEEP.
; ----------------------------------;
QABORTTERM ; wait the end of source file downloading
; ----------------------------------;
MOV #17,&TERMTXBUF ; yes move XON char into TX_buf
.ENDIF ;
.IFDEF TERMINALCTSRTS ;
- BIC.B #RTS,&HANDSHAKOUT ; set /RTS low (connected to /CTS pin of UARTtoUSB bridge)
+ BIC.B #RTS,&HANDSHAKOUT ; set /RTS low (connected to /CTS pin of UARTtoUSB bridge)
.ENDIF ;
QABORTLOOP BIC #UCRXIFG,&TERMIFG ; reset TERMIFG(UCRXIFG)
- MOV #RefillUSBtime,Y ; 2730*28 = 75 ms
-QABUSBLOOPJ ; 28~ loop : PL2303TA seems the slower USB device to refill its buffer.
- MOV #8,X ; 1~
-QABUSBLOOPI ; 3~ loop
- SUB #1,X ; 1~
- JNZ QABUSBLOOPI ; 2~
- SUB #1,Y ; 1~
- JNZ QABUSBLOOPJ ; 2~
- BIT #UCRXIFG,&TERMIFG ; 4 new char in TERMXBUF ?
+ MOV #RefillUSBtime,Y ; 2730*36 = 98 ms : PL2303TA seems to be the slower USB device to refill its TX buffer.
+QABUSBLOOPJ MOV #8,X ; 1~ <-------+
+QABUSBLOOPI NOP ; 1~ <---+ |
+ SUB #1,X ; 1~ | |
+ JNZ QABUSBLOOPI ; 2~ > 4~ loop -+ |
+ SUB #1,Y ; 1~ |
+ JNZ QABUSBLOOPJ ; 2~ --> 36~ loop --+
+ BIT #UCRXIFG,&TERMIFG ; 4 new char in TERMXBUF after refill time out ?
JNZ QABORTLOOP ; 2 yes, the input stream (download source file) is still active
-
; ----------------------------------;
; Display WARM/ABORT message ;
; ----------------------------------;
mDOCOL ; no, the input stream is quiet (end of download source file)
.word XSQUOTE ; -- c-addr u c-addr1 u1
- .byte 4,1Bh,"[7m" ;
+ .byte 4,27,"[7m" ;
.word TYPE ; -- c-addr u set reverse video
.word TYPE ; -- type abort message
.word XSQUOTE ; -- c-addr2 u2
- .byte 4,1Bh,"[0m" ;
+ .byte 4,27,"[0m" ;
.word TYPE ; -- set normal video
.word FORTH,ONLY ; to quit assembler and so to abort any ASSEMBLER definitions
.word DEFINITIONS ; reset CURRENT directory
+ .word PWR_STATE ; wipe, if exist, not well finished definition and its previous MARKER
.IFDEF LOWERCASE
.word CAPS_ON ;
.ENDIF
FORTHWORDIMM "ABORT\34" ; immediate
ABORTQUOTE: mDOCOL
-
- .IFDEF LOWERCASE
- .word CAPS_OFF,SQUOTE,CAPS_ON
- .word lit,QABORT,COMMA
- .word EXIT
- .ELSE
.word SQUOTE
.word lit,QABORT,COMMA
.word EXIT
- .ENDIF ; LOWERCASE
-
;https://forth-standard.org/standard/core/Tick
-;C ' -- xt find word in dictionary
+;C ' -- xt find word in dictionary and leave on stack its execution address
FORTHWORD "'"
TICK: mDOCOL ; separator -- xt
.word FBLANK,WORDD,FIND ; Z=1 if not found
BACKSLASH: MOV &SOURCE_LEN,&TOIN ;
mNEXT
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
; COMPILER
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
+
+;https://forth-standard.org/standard/core/Bracket
+;C [ -- enter interpretative state
+ FORTHWORDIMM "[" ; immediate
+LEFTBRACKET: MOV #0,&STATE
+ mNEXT
+
+;https://forth-standard.org/standard/core/right-bracket
+;C ] -- enter compiling state
+ FORTHWORD "]"
+RIGHTBRACKET: MOV #-1,&STATE
+ mNEXT
+
+;https://forth-standard.org/standard/core/BracketTick
+;C ['] <name> -- find word & compile it as literal
+ FORTHWORDIMM "[']" ; immediate word, i.e. word executed also during compilation
+BRACTICK: mDOCOL
+ .word TICK ; get xt of <name>
+ .word lit,lit,COMMA ; append LIT action
+ .word COMMA,EXIT ; append xt literal
+
+;https://forth-standard.org/standard/core/DEFERStore
+;C DEFER! xt CFA_DEFER -- ; store xt to the address after DODEFER
+; FORTHWORD "DEFER!"
+DEFERSTORE: MOV @PSP+,2(TOS) ; -- CFA_DEFER xt --> [CFA_DEFER+2]
+ MOV @PSP+,TOS ; --
+ mNEXT
+
+;https://forth-standard.org/standard/core/IS
+;C IS <name> xt --
+; used as is :
+; DEFER DISPLAY create a "do nothing" definition (2 CELLS)
+; inline command : ' U. IS DISPLAY U. becomes the runtime of the word DISPLAY
+; or in a definition : ... ['] U. IS DISPLAY ...
+; KEY, EMIT, CR, ACCEPT and WARM are DEFERred words
+
+; as IS replaces the PFA value of a "PFA word", it may be also used with VARIABLE and CONSTANT words...
+
+ FORTHWORDIMM "IS" ; immediate
+IS: mDOCOL
+ .word FSTATE,FETCH
+ .word QBRAN,IS_EXEC
+IS_COMPILE .word BRACTICK ; find the word, compile its CFA as literal
+ .word lit,DEFERSTORE,COMMA ; compile DEFERSTORE
+ .word EXIT
+IS_EXEC .word TICK,DEFERSTORE ; find the word, leave its CFA on the stack and execute DEFERSTORE
+ .word EXIT
+
+;https://forth-standard.org/standard/core/IMMEDIATE
+;C IMMEDIATE -- make last definition immediate
+ FORTHWORD "IMMEDIATE"
+IMMEDIATE: MOV &LAST_NFA,W
+ BIS.B #80h,0(W)
+ mNEXT
+
+;https://forth-standard.org/standard/core/RECURSE
+;C RECURSE -- recurse to current definition (compile current definition)
+ FORTHWORDIMM "RECURSE" ; immediate
+RECURSE: MOV &DDP,X ;
+ MOV &LAST_CFA,0(X) ;
+ ADD #2,&DDP ;
+ mNEXT
+
+
+;https://forth-standard.org/standard/core/POSTPONE
+ FORTHWORDIMM "POSTPONE" ; immediate
+POSTPONE: mDOCOL
+ .word FBLANK,WORDD,FIND,QDUP
+ .word QBRAN,NotFound
+ .word ZEROLESS ; immediate ?
+ .word QBRAN,POST1 ; yes
+ .word lit,lit,COMMA,COMMA
+ .word lit,COMMA
+POST1: .word COMMA,EXIT
+
+
+;;Z ?REVEAL -- if no stack mismatch, link this created word in the CURRENT vocabulary
+; FORTHWORD "REVEAL"
+QREVEAL: CMP PSP,&LAST_PSP ; Check SP with its saved value by :
+ JZ GOOD_CSP ; if no stack mismatch. See MARKER below
+BAD_CSP mDOCOL
+ .word XSQUOTE
+ .byte 15,"stack mismatch!"
+FQABORTYES .word QABORTYES
; HEADER create an header for a new word. Max count of chars = 126
-; common code for VARIABLE, CONSTANT, CREATE, DEFER, :, CODE, ASM.
+; common code for VARIABLE, CONSTANT, CREATE, DEFER, :, MARKER, CODE, ASM.
; don't link created word in vocabulary.
-
HEADER: mDOCOL
.word CELLPLUSALIGN ; ALIGN then make room for LFA
.word FBLANK,WORDD ;
; X is LAST_THREAD > used by VARIABLE, CONSTANT, CREATE, DEFER and :
; Y is NFA )
-BAD_CSP mDOCOL
- .word XSQUOTE
- .byte 15,"stack mismatch!"
-FQABORTYES .word QABORTYES
-
-;;Z ?REVEAL -- link last created word in vocabulary if no stack mismatch
-; FORTHWORD "REVEAL"
-QREVEAL: CMP PSP,&LAST_CSP ; check actual SP with saved value by :
- JNZ BAD_CSP ; if stack mismatch
- MOV &LAST_NFA,Y ;
- MOV &LAST_THREAD,X ;
-REVEAL MOV @X,-2(Y) ; [LAST_THREAD] --> LFA
- MOV Y,0(X) ; LAST_NFA --> [LAST_THREAD]
- mNEXT
-
-
;https://forth-standard.org/standard/core/VARIABLE
;C VARIABLE <name> -- define a Forth VARIABLE
FORTHWORD "VARIABLE"
-VARIABLE: CALL #HEADER ; -- W = DDP = CFA + 2 words
- MOV #DOVAR,-4(W)
- JMP REVEAL
+VARIABLE: CALL #HEADER ; W = DDP = CFA + 2 words
+ MOV #DOVAR,-4(W) ; CFA = DOVAR
+ JMP REVEAL ; PFA = undefined
;https://forth-standard.org/standard/core/CONSTANT
-;C CONSTANT <name> n -- define a Forth CONSTANT
+;C CONSTANT <name> n -- define a Forth CONSTANT (it's also an alias of VALUE)
FORTHWORD "CONSTANT"
-CONSTANT: CALL #HEADER ; -- W = DDP
- MOV #DOCON,-4(W) ; compile exec
- MOV TOS,-2(W) ; compile TOS as constant
+CONSTANT: CALL #HEADER ; W = DDP = CFA + 2 words
+ MOV #DOCON,-4(W) ; CFA = DOCON
+ MOV TOS,-2(W) ; PFA = n
MOV @PSP+,TOS
JMP REVEAL
+;;https://forth-standard.org/standard/core/VALUE
+;;( x "<spaces>name" -- ) define a Forth VALUE
+;;Skip leading space delimiters. Parse name delimited by a space.
+;;Create a definition for name with the execution semantics defined below,
+;;with an initial value equal to x.
+;
+;;name Execution: ( -- x )
+;;Place x on the stack. The value of x is that given when name was created,
+;;until the phrase x TO name is executed, causing a new value of x to be assigned to name.
+;
+;;TO name Run-time: ( x -- )
+;;Assign the value x to name.
+;
+; FORTHWORD "VALUE"
+; JMP CONSTANT
+;
+; FORTHWORDIMM "TO"
+; JMP IS
+
+
;https://forth-standard.org/standard/core/CREATE
-;C CREATE <name> -- define a CONSTANT with its next address
+;C CREATE <name> -- define a CONSTANT with its next address
; Execution: ( -- a-addr ) ; a-addr is the address of name's data field
; ; the execution semantics of name may be extended by using DOES>
FORTHWORD "CREATE"
CREATE: CALL #HEADER ; -- W = DDP
- MOV #DOCON,-4(W) ;4 first CELL = DOCON
- MOV W,-2(W) ;3 second CELL = HERE
+ MOV #DOCON,-4(W) ;4 CFA = DOCON
+ MOV W,-2(W) ;3 PFA = next address
JMP REVEAL
;https://forth-standard.org/standard/core/DOES
;C DOES> -- set action for the latest CREATEd definition
FORTHWORD "DOES>"
DOES: MOV &LAST_CFA,W ; W = CFA of latest CREATEd word that becomes a master word
- MOV #DODOES,0(W) ; remplace code of CFA (DOCON) by DODOES
- MOV IP,2(W) ; remplace parameter of PFA (HERE) by the address after DOES> as execution address
+ MOV #DODOES,0(W) ; replace old CFA (DOCON) by new CFA (DODOES)
+ MOV IP,2(W) ; replace old PFA by the address after DOES> as execution address
MOV @RSP+,IP ; exit of the new created word
NEXTADR mNEXT
;https://forth-standard.org/standard/core/DEFER
-;X DEFER <name> -- ; create a word to be deferred
+;C DEFER "<spaces>name" --
+;Skip leading space delimiters. Parse name delimited by a space.
+;Create a definition for name with the execution semantics defined below.
+
+;name Execution: --
+;Execute the xt that name is set to execute, i.e. NEXT (nothing),
+;until the phrase ' word IS name is executed, causing a new value of xt to be assigned to name.
+
FORTHWORD "DEFER"
DEFER: CALL #HEADER
- MOV #4030h,-4(W) ;4 first CELL = MOV @PC+,PC = BR...
- MOV #NEXTADR,-2(W) ;4 second CELL = address of mNEXT below : created word does nothing by default
+ MOV #4030h,-4(W) ;4 CFA = MOV @PC+,PC = BR...
+ MOV #NEXTADR,-2(W) ;4 PFA = address of NEXT: created word does nothing by default
JMP REVEAL
-;https://forth-standard.org/standard/core/Bracket
-;C [ -- enter interpretative state
- FORTHWORDIMM "[" ; immediate
-LEFTBRACKET: MOV #0,&STATE
- mNEXT
-
-;https://forth-standard.org/standard/core/right-bracket
-;C ] -- enter compiling state
- FORTHWORD "]"
-RIGHTBRACKET: MOV #-1,&STATE
- mNEXT
-
-;https://forth-standard.org/standard/core/RECURSE
-;C RECURSE -- recurse to current definition (compile current definition)
- FORTHWORDIMM "RECURSE" ; immediate
-RECURSE: MOV &DDP,X ;
- MOV &LAST_CFA,0(X) ;
- ADD #2,&DDP ;
- mNEXT
;https://forth-standard.org/standard/core/Colon
;C : <name> -- begin a colon definition
.CASE 1
MOV #DOCOL1,-4(W) ; compile CALL rDOCOL
SUB #2,&DDP
-
.CASE 2
MOV #DOCOL1,-4(W) ; compile PUSH IP 3~
MOV #DOCOL2,-2(W) ; compile CALL rEXIT
-
.CASE 3 ; inlined DOCOL
MOV #DOCOL1,-4(W) ; compile PUSH IP 3~
MOV #DOCOL2,-2(W) ; compile MOV PC,IP 1~
MOV #DOCOL3,0(W) ; compile ADD #4,IP 1~
MOV #NEXT,+2(W) ; compile MOV @IP+,PC 4~
ADD #4,&DDP
-
- .ENDCASE ; DTC
+ .ENDCASE ; of DTC
MOV #-1,&STATE ; enter compiling state
-SAVE_PSP MOV PSP,&LAST_CSP ; save PSP for check compiling, used by QREVEAL
+SAVE_PSP MOV PSP,&LAST_PSP ; save PSP for check compiling, used by QREVEAL
mNEXT
;https://forth-standard.org/standard/core/Semi
;C ; -- end a colon definition
FORTHWORDIMM ";" ; immediate
SEMICOLON: CMP #0,&STATE ; interpret mode : semicolon becomes a comment separator
- JZ BACKSLASH ; tip: ; it's transparent to the preprocessor, so semicolon comments are kept in file.4th
+ JZ BACKSLASH ; tip: ";" is transparent to the preprocessor, so semicolon comments are kept in file.4th
mDOCOL ; compile mode
.word lit,EXIT,COMMA
.word QREVEAL,LEFTBRACKET,EXIT
-;https://forth-standard.org/standard/core/IMMEDIATE
-;C IMMEDIATE -- make last definition immediate
- FORTHWORD "IMMEDIATE"
-IMMEDIATE: MOV &LAST_NFA,W
- BIS.B #80h,0(W)
- mNEXT
-
-;https://forth-standard.org/standard/core/DEFERStore
-;CE DEFER! xt CFA_DEFER -- ; store xt to the address after DODEFER
-; FORTHWORD "DEFER!"
-DEFERSTORE: MOV @PSP+,2(TOS) ; -- CFA_DEFER xt --> [CFA_DEFER+2]
- MOV @PSP+,TOS ; --
- mNEXT
-
-;https://forth-standard.org/standard/core/IS
-;C IS <name> xt --
-; used as is :
-; DEFER DISPLAY create a "do nothing" definition (2 CELLS)
-; inline command : ' U. IS DISPLAY U. becomes the runtime of the word DISPLAY
-; or in a definition : ... ['] U. IS DISPLAY ...
-; KEY, EMIT, CR, ACCEPT and WARM are DEFERred words
-
- FORTHWORDIMM "IS" ; immediate
-IS: mDOCOL
- .word FSTATE,FETCH
- .word QBRAN,IS_EXEC
-IS_COMPILE .word BRACTICK ; find the word, compile its CFA as literal
- .word lit,DEFERSTORE,COMMA ; compile DEFERSTORE
- .word EXIT
-IS_EXEC .word TICK,DEFERSTORE ; find the word, leave its CFA on the stack and execute DEFERSTORE
- .word EXIT
-
-;https://forth-standard.org/standard/core/BracketTick
-;C ['] <name> -- find word & compile it as literal
- FORTHWORDIMM "[']" ; immediate word, i.e. word executed also during compilation
-BRACTICK: mDOCOL
- .word TICK ; get xt of <name>
- .word lit,lit,COMMA ; append LIT action
- .word COMMA,EXIT ; append xt literal
-
-;https://forth-standard.org/standard/core/POSTPONE
- FORTHWORDIMM "POSTPONE" ; immediate
-POSTPONE: mDOCOL
- .word FBLANK,WORDD,FIND,QDUP
- .word QBRAN,NotFound
- .word ZEROLESS ; immediate ?
- .word QBRAN,POST1 ; yes
- .word lit,lit,COMMA,COMMA
- .word lit,COMMA
-POST1: .word COMMA,EXIT
-
+ .IFDEF CONDCOMP
;; CORE EXT MARKER
;;( "<spaces>name" -- )
;;Skip leading space delimiters. Parse name delimited by a space. Create a definition for name
;;of any structures still existing that could refer to deleted definitions or deallocated data space is
;;not necessarily provided. No other contextual information such as numeric base is affected
-; FORTHWORD "MARKER"
-; CALL #HEADER ;4
-; MOV #DODOES,-4(W) ;4 CFA = DODOES
-; MOV #MARKER_DOES,-2(W) ;4 PFA = MARKER_DOES
-; ADD #4,&DDP ;3
-; MOV &LASTVOC,0(W) ;5 [BODY] = VOCLINK to be restored
-; MOV Y,2(W) ;3 [BODY+2] = NFA
-; SUB #2,2(W) ;4 [BODY+2] = LFA = DP to be restored
-; JMP REVEAL ;2
-
-MARKER_DOES
- .IFDEF VOCABULARY_SET
- .word FORTH,ONLY,DEFINITIONS
- .ENDIF
- FORTHtoASM ; -- BODY IP is free
- MOV @TOS+,W ; -- BODY+2 W= old VOCLINK =VLK
- MOV W,&LASTVOC ; -- BODY+2 restore LASTVOC
- MOV @TOS,TOS ; -- OLD_DP
- MOV TOS,&DDP ; -- OLD_DP restore DP
-
- .SWITCH THREADS
-
- .CASE 1
-MARKALLVOC MOV W,Y ; -- OLD_DP W=VLK Y=VLK
-MRKWORDLOOP MOV -2(Y),Y ; -- OLD_DP W=VLK Y=NFA
- CMP Y,TOS ; -- OLD_DP CMP = TOS-Y : OLD_DP-NFA
- JNC MRKWORDLOOP ; loop back if TOS<Y : OLD_DP<NFA
- MOV Y,-2(W) ; W=VLK X=THD Y=NFA refresh thread with good NFA
- MOV @W,W ; -- OLD_DP W=[VLK] = next voclink
- CMP #0,W ; -- OLD_DP W=[VLK] = next voclink end of vocs ?
- JNZ MARKALLVOC ; -- OLD_DP W=VLK no : loopback
-
- .ELSECASE ; multi threads
-
-MARKALLVOC MOV #THREADS,IP ; -- OLD_DP W=VLK
- MOV W,X ; -- OLD_DP W=VLK X=VLK
-MRKTHRDLOOP MOV X,Y ; -- OLD_DP W=VLK X=VLK Y=VLK
- SUB #2,X ; -- OLD_DP W=VLK X=THD (thread ((case-2)to0))
-MRKWORDLOOP MOV -2(Y),Y ; -- OLD_DP W=VLK Y=NFA
- CMP Y,TOS ; -- OLD_DP CMP = TOS-Y : OLD_DP-NFA
- JNC MRKWORDLOOP ; loop back if TOS<Y : OLD_DP<NFA
-MARKTHREAD MOV Y,0(X) ; W=VLK X=THD Y=NFA refresh thread with good NFA
- SUB #1,IP ; -- OLD_DP W=VLK X=THD Y=NFA IP=CFT-1
- JNZ MRKTHRDLOOP ; loopback to compare NFA in next thread (thread-1)
- MOV @W,W ; -- OLD_DP W=[VLK] = next voclink
- CMP #0,W ; -- OLD_DP W=[VLK] = next voclink end of vocs ?
- JNZ MARKALLVOC ; -- OLD_DP W=VLK no : loopback
+MARKER_DOES FORTHtoASM ; execution part
+ MOV @RSP+,IP ; -- PFA
+ MOV @TOS+,&INIVOC ; set VOC_LINK value for RST_STATE
+ MOV @TOS,&INIDP ; set DP value for RST_STATE
+ MOV @PSP+,TOS ; --
+ JMP RST_STATE ; execute RST_STATE, PWR_STATE then STATE_DOES
+
+ FORTHWORD "MARKER" ; definition part
+ CALL #HEADER ;4 W = DP+4
+ MOV #DODOES,-4(W) ;4 CFA = DODOES
+ MOV #MARKER_DOES,-2(W) ;4 PFA = MARKER_DOES
+ MOV &LASTVOC,0(W) ;5 [BODY] = VOCLINK to be restored
+ SUB #2,Y ;1 Y = LFA
+ MOV Y,2(W) ;3 [BODY+2] = LFA = DP to be restored
+ ADD #4,&DDP ;3
+
+ .ENDIF ; CONDCOMP
+
+GOOD_CSP MOV &LAST_NFA,Y ;
+ MOV &LAST_THREAD,X ;
+REVEAL MOV @X,-2(Y) ; [LAST_THREAD] --> LFA
+ MOV Y,0(X) ; LAST_NFA --> [LAST_THREAD]
+ mNEXT
- .ENDCASE ; THREADS ; -- HERE
-
- MOV @PSP+,TOS ;
- MOV @RSP+,IP ;
- mNEXT ;
-; ----------------------------------;
; ----------------------------------------------------------------------
; CONTROL STRUCTURES
IFF: SUB #2,PSP ;
MOV TOS,0(PSP) ;
MOV &DDP,TOS ; -- HERE
- MOV #QBRAN,0(TOS) ; -- HERE
- ADD #4,&DDP ; compile two words
+ ADD #4,&DDP ; compile one word, reserve one word
+ MOV #QBRAN,0(TOS) ; -- HERE compile QBRAN
CELLPLUS ADD #2,TOS ; -- HERE+2=IFadr
mNEXT
+
;https://forth-standard.org/standard/core/ELSE
;C ELSE IFadr -- ELSEadr resolve forward IF branch, leave ELSEadr on stack
FORTHWORDIMM "ELSE" ; immediate
-ELSS: MOV &DDP,W
- MOV #bran,0(W)
- ADD #4,W ; W=HERE+4
- MOV W,&DDP ; compile two words
+ELSS: ADD #4,&DDP ; make room to compile two words
+ MOV &DDP,W ; W=HERE+4
+ MOV #bran,-4(W)
MOV W,0(TOS) ; HERE+4 ==> [IFadr]
SUB #2,W ; HERE+2
MOV W,TOS ; -- ELSEadr
;C UNTIL BEGINadr -- resolve conditional backward branch
FORTHWORDIMM "UNTIL" ; immediate
UNTIL: MOV #qbran,X
-UNTIL1 MOV &DDP,W ; W = HERE
- ADD #4,&DDP ; compile two words
- MOV X,0(W) ; compile Bran or qbran at HERE
- MOV TOS,2(W) ; compile bakcward adr at HERE+2
+UNTIL1 ADD #4,&DDP ; compile two words
+ MOV &DDP,W ; W = HERE
+ MOV X,-4(W) ; compile Bran or qbran at HERE
+ MOV TOS,-2(W) ; compile bakcward adr at HERE+2
MOV @PSP+,TOS
mNEXT
FORTHWORDIMM "DO" ; immediate
DO: SUB #2,PSP ;
MOV TOS,0(PSP) ;
- MOV &DDP,TOS ; -- HERE
- MOV #xdo,0(TOS)
- ADD #2,TOS ; -- HERE+2
- MOV TOS,&DDP ; compile one word
+ ADD #2,&DDP ; make room to compile xdo
+ MOV &DDP,TOS ; -- HERE+2
+ MOV #xdo,-2(TOS) ; compile xdo
ADD #2,&LEAVEPTR ; -- HERE+2 LEAVEPTR+2
MOV &LEAVEPTR,W ;
MOV #0,0(W) ; -- HERE+2 L-- 0
mNEXT
;https://forth-standard.org/standard/core/LOOP
-;C LOOP DOadr -- L-- 0 a1 a2 .. aN
+;C LOOP DOadr -- L-- an an-1 .. a1 0
FORTHWORDIMM "LOOP" ; immediate
LOO: MOV #xloop,X
-ENDLOOP MOV &DDP,W
- ADD #4,&DDP ; compile two words
- MOV X,0(W) ; xloop --> HERE
- MOV TOS,2(W) ; DOadr --> HERE+2
+ENDLOOP ADD #4,&DDP ; make room to compile two words
+ MOV &DDP,W
+ MOV X,-4(W) ; xloop --> HERE
+ MOV TOS,-2(W) ; DOadr --> HERE+2
; resolve all "leave" adr
LEAVELOOP MOV &LEAVEPTR,TOS ; -- Adr of top LeaveStack cell
SUB #2,&LEAVEPTR ; --
MOV @TOS,TOS ; -- first LeaveStack value
CMP #0,TOS ; -- = value left by DO ?
JZ ENDLOOPEND
- MOV &DDP,0(TOS) ; move adr after loop as UNLOOP adr
+ MOV W,0(TOS) ; move adr after loop as UNLOOP adr
JMP LEAVELOOP
ENDLOOPEND MOV @PSP+,TOS
mNEXT
;https://forth-standard.org/standard/core/PlusLOOP
-;C +LOOP adrs -- L: 0 a1 a2 .. aN --
+;C +LOOP adrs -- L-- an an-1 .. a1 0
FORTHWORDIMM "+LOOP" ; immediate
PLUSLOOP: MOV #xploop,X
JMP ENDLOOP
MOVE_X mNEXT
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
; WORDS SET for VOCABULARY, not ANS compliant
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
;X VOCABULARY -- create a vocabulary
.IFDEF VOCABULARY_SET
FORTHWORD "ALSO"
.ENDIF ; VOCABULARY_SET
-ALSO: MOV #12,W ; -- move up 6 words
+ALSO: MOV #14,W ; -- move up 7 words
MOV #CONTEXT,X ; X=src
MOV #CONTEXT+2,Y ; Y=dst
JMP MOVEUP ; src < dst
DEFINITIONS: MOV &CONTEXT,&CURRENT
mNEXT
-; ----------------------------------------------------------------------
-; IMPROVED POWER ON RESET AND INITIALIZATION
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
+; IMPROVED ON/OFF AND RESET
+;-------------------------------------------------------------------------------
+
+STATE_DOES
+ .IFDEF VOCABULARY_SET
+ .word FORTH,ONLY,DEFINITIONS ; doesn't restore search order pointers
+ .ENDIF
+ FORTHtoASM ; -- BODY IP is free
+ MOV @TOS+,W ; -- BODY+2 W = old VOCLINK = VLK
+ MOV W,&LASTVOC ; -- BODY+2 restore LASTVOC
+ MOV @TOS,TOS ; -- OLD_DP
+ MOV TOS,&DDP ; -- OLD_DP restore DP
+
+ .SWITCH THREADS
+ .CASE 1 ; mono thread vocabularies
+MARKALLVOC MOV W,Y ; -- OLD_DP W=VLK Y=VLK
+MRKWORDLOOP MOV -2(Y),Y ; -- OLD_DP W=VLK Y=NFA
+ CMP Y,TOS ; -- OLD_DP CMP = TOS-Y : OLD_DP-NFA
+ JNC MRKWORDLOOP ; loop back if TOS<Y : OLD_DP<NFA
+ MOV Y,-2(W) ; W=VLK X=THD Y=NFA refresh thread with good NFA
+ MOV @W,W ; -- OLD_DP W=[VLK] = next voclink
+ CMP #0,W ; -- OLD_DP W=[VLK] = next voclink end of vocs ?
+ JNZ MARKALLVOC ; -- OLD_DP W=VLK no : loopback
- FORTHWORD "PWR_STATE" ; set dictionary in same state as OFF/ON
+ .ELSECASE ; multi threads vocabularies
+MARKALLVOC MOV #THREADS,IP ; -- OLD_DP W=VLK
+ MOV W,X ; -- OLD_DP W=VLK X=VLK
+MRKTHRDLOOP MOV X,Y ; -- OLD_DP W=VLK X=VLK Y=VLK
+ SUB #2,X ; -- OLD_DP W=VLK X=THD (thread ((case-2)to0))
+MRKWORDLOOP MOV -2(Y),Y ; -- OLD_DP W=VLK Y=NFA
+ CMP Y,TOS ; -- OLD_DP CMP = TOS-Y : OLD_DP-NFA
+ JNC MRKWORDLOOP ; loop back if TOS<Y : OLD_DP<NFA
+MARKTHREAD MOV Y,0(X) ; W=VLK X=THD Y=NFA refresh thread with good NFA
+ SUB #1,IP ; -- OLD_DP W=VLK X=THD Y=NFA IP=CFT-1
+ JNZ MRKTHRDLOOP ; loopback to compare NFA in next thread (thread-1)
+ MOV @W,W ; -- OLD_DP W=[VLK] = next voclink
+ CMP #0,W ; -- OLD_DP W=[VLK] = next voclink end of vocs ?
+ JNZ MARKALLVOC ; -- OLD_DP W=VLK no : loopback
+
+ .ENDCASE ; of THREADS ; -- DDP
+ MOV @PSP+,TOS ;
+ MOV @RSP+,IP ;
+ mNEXT ;
+
+ FORTHWORD "PWR_STATE" ; reinitialize dictionary in same state as after OFF/ON
PWR_STATE: mDODOES ; DOES part of MARKER : resets pointers DP, voclink and latest
- .word MARKER_DOES ; execution vector of MARKER DOES
-MARKVOC .word lastvoclink ; as voclink value
-MARKDP .word ROMDICT ; as DP value
+ .word STATE_DOES ; execution vector of PWR_STATE
+MARKVOC .word lastvoclink ; initialised by forthMSP430FR.asm as voclink value
+MARKDP .word ROMDICT ; initialised by forthMSP430FR.asm as DP value
+
+ FORTHWORD "RST_STATE" ; reinitialize dictionary in same state as after <reset>
+RST_STATE: MOV &INIVOC,&MARKVOC ; INI value saved in FRAM
+ MOV &INIDP,&MARKDP ; INI value saved in FRAM
+ JMP PWR_STATE
- FORTHWORD "PWR_HERE" ; define dictionary bound for PWR_STATE
-PWR_HERE: MOV &DDP,&MARKDP
- MOV &LASTVOC,&MARKVOC
- JMP PWR_STATE
- FORTHWORD "RST_STATE" ; set dictionary in same state as <reset>
-RST_STATE: MOV &INIDP,&MARKDP
- MOV &INIVOC,&MARKVOC
- JMP PWR_STATE
+ FORTHWORD "PWR_HERE" ; define dictionary bound for power OFF/ON
+PWR_HERE: MOV &LASTVOC,&MARKVOC
+ MOV &DDP,&MARKDP
+ mNEXT
- FORTHWORD "RST_HERE" ; define dictionary bound for RST_STATE
-RST_HERE: MOV &DDP,&INIDP
- MOV &LASTVOC,&INIVOC
- JMP PWR_HERE ; and reset PWR_STATE same as RST_STATE
+ FORTHWORD "RST_HERE" ; define dictionary bound for <reset>
+RST_HERE: MOV &LASTVOC,&INIVOC
+ MOV &DDP,&INIDP
+ JMP PWR_HERE ; and init PWR_STATE same as RST_STATE
WIPE_DEFER MOV #PARENWARM,&WARM+2
.IFDEF SD_CARD_LOADER
MOV #PARENACCEPT,&ACCEPT+2 ; always restore default console input
.ENDIF
+ .IFDEF MSP430ASSEMBLER ; reset all branch labels
+ MOV #0,&CLRBW1
+ MOV #0,&CLRBW2
+ MOV #0,&CLRBW3
+ MOV #0,&CLRFW1
+ MOV #0,&CLRFW2
+ MOV #0,&CLRFW3
+ .ENDIF
+
RET
- FORTHWORD "WIPE" ; restore the program as it was in FastForth.hex file
+ FORTHWORD "WIPE" ; restore the program as it was in forthMSP430FR.txt file
WIPE:
; reset JTAG and BSL signatures ; unlock JTAG, SBW and BSL
MOV #SIGNATURES,X
; reset all FACTORY defered words to allow execution from SD_Card
CALL #WIPE_DEFER
; reinit this factory values :
- MOV #ROMDICT,&DDP
- MOV #lastvoclink,&LASTVOC
+ MOV #ROMDICT,&INIDP
+ MOV #lastvoclink,&INIVOC
; then reinit RST_STATE and PWR_STATE
- JMP RST_HERE
+ JMP RST_STATE
+
+
+
+; ------------------------------------------------------------------------------------------
+; forthMSP430FR : CONDITIONNAL COMPILATION
+; ------------------------------------------------------------------------------------------
+ .IFDEF CONDCOMP ; 2- conditionnal compilation part
+ .IFNDEF LOWERCASE
+ .WARNING "uncomment LOWERCASE ADD-ON to pass coretest COMPARE !"
+ .ENDIF ; LOWERCASE
+;COMPARE ( c-addr1 u1 c-addr2 u2 -- n )
+;https://forth-standard.org/standard/string/COMPARE
+;Compare the string specified by c-addr1 u1 to the string specified by c-addr2 u2.
+;The strings are compared, beginning at the given addresses, character by character,
+;up to the length of the shorter string or until a difference is found.
+;If the two strings are identical, n is zero.
+;If the two strings are identical up to the length of the shorter string,
+; n is minus-one (-1) if u1 is less than u2 and one (1) otherwise.
+;If the two strings are not identical up to the length of the shorter string,
+; n is minus-one (-1) if the first non-matching character in the string specified by c-addr1 u1
+; has a lesser numeric value than the corresponding character in the string specified by c-addr2 u2 and one (1) otherwise.
+ FORTHWORD "COMPARE"
+COMPARE
+ MOV TOS,S ;1 u2 = S
+ MOV @PSP+,Y ;2 addr2 = Y
+ MOV @PSP+,T ;2 u1 = T
+ MOV @PSP+,X ;2 addr1 = X
+COMPAR1 MOV T,TOS ;1
+ ADD S,TOS ;1
+ JZ COMPEQUAL ;2 end of all successfull comparisons
+ SUB #1,T ;1
+ JN COMPLESS ;2 u1<u2
+ SUB #1,S ;1
+ JN COMPGREATER ;2 u2<u1
+ ADD #1,X ;1
+ CMP.B @Y+,-1(X) ;4 char1-char2
+ JZ COMPAR1 ;2 char1=char2 17~ loop
+ JHS COMPGREATER ;2 char1>char2
+COMPLESS ; char1<char2
+ MOV #-1,TOS ;1
+ MOV @IP+,PC ;4
+COMPGREATER
+ MOV #1,TOS ;1
+COMPEQUAL
+ MOV @IP+,PC ;4 20 words
+
+;[THEN]
+;https://forth-standard.org/standard/tools/BracketTHEN
+ FORTHWORDIMM "[THEN]" ; do nothing
+ mNEXT
+
+ONEMIN
+ SUB #1,TOS
+ mNEXT
+
+;[ELSE]
+;Compilation:
+;Perform the execution semantics given below.
+;Execution:
+;( "<spaces>name ..." -- )
+;Skipping leading spaces, parse and discard space-delimited words from the parse area,
+;including nested occurrences of [IF] ... [THEN] and [IF] ... [ELSE] ... [THEN],
+;until the word [THEN] has been parsed and discarded.
+;If the parse area becomes exhausted, it is refilled as with REFILL.
+ FORTHWORDIMM "[ELSE]"
+BRACKETELSE
+ mDOCOL
+ .word lit,1 ; 1
+BRACKETELSE1 ; BEGIN
+BRACKETELSE2 ; BEGIN
+ .word FBLANK,WORDD,COUNT ; BL WORD COUNT
+ .word DUP,QBRAN,BRACKETELSE10 ; DUP WHILE
+ .word OVER,OVER ; 2DUP
+ .word XSQUOTE ; S" [IF]"
+ .byte 4,"[IF]" ;
+ .word COMPARE ; COMPARE
+ .word QZBRAN,BRACKETELSE3 ; 0= IF
+ .word TWODROP,ONEPLUS ; 2DROP 1+
+ .word BRAN,BRACKETELSE8 ; (ENDIF)
+BRACKETELSE3 ; ELSE
+ .word OVER,OVER ; OVER OVER
+ .word XSQUOTE ; S" [ELSE]"
+ .byte 6,"[ELSE]" ;
+ .word COMPARE ; COMPARE
+ .word QZBRAN,BRACKETELSE5 ; 0= IF
+ .word TWODROP,ONEMIN ; 2DROP 1-
+ .word DUP,QBRAN,BRACKETELSE4 ; DUP IF
+ .word ONEPLUS ; 1+
+BRACKETELSE4 ; THEN
+ .word BRAN,BRACKETELSE7 ; (ENDIF)
+BRACKETELSE5 ; ELSE
+ .word XSQUOTE ; S" [THEN]"
+ .byte 6,"[THEN]" ;
+ .word COMPARE ; COMPARE
+ .word QZBRAN,BRACKETELSE6 ; 0= IF
+ .word ONEMIN ; 1-
+BRACKETELSE6 ; THEN
+BRACKETELSE7 ; THEN
+BRACKETELSE8 ; THEN
+ .word QDUP ; ?DUP
+ .word QZBRAN,BRACKETELSE9 ; 0= IF
+ .word EXIT ; EXIT
+BRACKETELSE9 ; THEN
+ .word BRAN,BRACKETELSE2 ; REPEAT
+BRACKETELSE10 ;
+ .word TWODROP ; 2DROP
+ .word XSQUOTE ;
+ .byte 3,13,107,111 ;
+ .word TYPE,SPACE ; CR ." ko " to show false branch of conditionnal compilation
+ .word TIB,DUP,CPL ; REFILL
+ .word ACCEPT ; -- StringOrg len' (len' <= TIB_LEN)
+ FORTHtoASM ;
+ MOV #0,&TOIN ;
+ MOV TOS,&SOURCE_LEN ; -- StringOrg len'
+ MOV @PSP+,&SOURCE_ADR ; -- len'
+ MOV @PSP+,TOS ; --
+ MOV #BRACKETELSE1,IP ; AGAIN
+ mNEXT ; 78 words
+
+
+;[IF]
+;https://forth-standard.org/standard/tools/BracketIF
+;Compilation:
+;Perform the execution semantics given below.
+;Execution: ;( flag | flag "<spaces>name ..." -- )
+;If flag is true, do nothing. Otherwise, skipping leading spaces,
+; parse and discard space-delimited words from the parse area,
+; including nested occurrences of [IF] ... [THEN] and [IF] ... [ELSE] ... [THEN],
+; until either the word [ELSE] or the word [THEN] has been parsed and discarded.
+;If the parse area becomes exhausted, it is refilled as with REFILL. [IF] is an immediate word.
+;An ambiguous condition exists if [IF] is POSTPONEd,
+; or if the end of the input buffer is reached and cannot be refilled before the terminating [ELSE] or [THEN] is parsed.
+ FORTHWORDIMM "[IF]" ; flag --
+ CMP #0,TOS
+ MOV @PSP+,TOS
+ JZ BRACKETELSE
+ mNEXT
+
+;[UNDEFINED]
+;https://forth-standard.org/standard/tools/BracketUNDEFINED
+;Compilation:
+;Perform the execution semantics given below.
+;Execution: ( "<spaces>name ..." -- flag )
+;Skip leading space delimiters. Parse name delimited by a space.
+;Return a false flag if name is the name of a word that can be found,
+;otherwise return a true flag.
+ FORTHWORDIMM "[UNDEFINED]"
+ mDOCOL
+ .word FBLANK,WORDD,FIND,NIP,ZEROEQUAL,EXIT
+
+;[DEFINED]
+;https://forth-standard.org/standard/tools/BracketDEFINED
+;Compilation:
+;Perform the execution semantics given below.
+;Execution:
+;( "<spaces>name ..." -- flag )
+;Skip leading space delimiters. Parse name delimited by a space.
+;Return a true flag if name is the name of a word that can be found,
+;otherwise return a false flag. [DEFINED] is an immediate word.
+
+ FORTHWORDIMM "[DEFINED]"
+ mDOCOL
+ .word FBLANK,WORDD,FIND,NIP,EXIT
+
+ .ENDIF ; CONDCOMP
+
+; ------------------------------------------------------------------------------
+; forthMSP430FR : WARM
+; ------------------------------------------------------------------------------
; define FREQ used in WARM message (6)
.IF FREQUENCY = 0.25
; .word DOT ; display SYSSNIV
; .word DOT ; display SYSUNIV
.word XSQUOTE
- .byte 39," FastForth V160",FREQ," (C) J.M.Thoorens "
+ .byte 39," FastForth V162",FREQ," (C) J.M.Thoorens "
.word TYPE
.word LIT,FRAM_FULL,HERE,MINUS,UDOT
.word XSQUOTE ;
.byte 11,"bytes free ";
- .word QABORTYESNOECHO ; NOECHO enables any app to execute COLD without terminal connexion !
+ .word QABORTYESNOECHO ; NOECHO state enables any app to execute COLD or WARM without terminal connexion
;Z WARM -- ; deferred word used to init your application
FORTHWORD "WARM"
WARM: MOV #PARENWARM,PC
+; ------------------------------------------------------------------------------
+; forthMSP430FR : COLD
+; ------------------------------------------------------------------------------
+
;Z COLD -- performs a software reset
FORTHWORD "COLD"
-COLD: MOV #0A500h+PMMSWBOR,&PMMCTL0
+COLD MOV #0A500h+PMMSWBOR,&PMMCTL0
-; -------------------------------------------------------------------------
+;-------------------------------------------------------------------------------
; in addition to <reset>, DEEP_RST restores the program as it was in the forthMSP430FR.txt file and the electronic fuse so.
-; -------------------------------------------------------------------------
+;-------------------------------------------------------------------------------
RESET
-; -------------------------------------------------------------------------
+;-------------------------------------------------------------------------------
; case 1 : Power ON ==> RESET + the volatile program beyond PWR_HERE (not protected by PWR_STATE against POWER OFF) is lost
; SYSRSTIV = 2
; case 3 : TERM_TX wired to GND via 4k7 + <reset> ===> DEEP_RST, works even if the electronic fuse is "blown" !
; case 3.1 : (SYSRSTIV = 0Ah | SYSRSTIV >= 16h) ===> DEEP_RST on failure,
; case 3.2 : writing -1 in SAVE_SYSRSTIV then COLD ===> software DEEP_RST (WARM displays "-1")
-; -------------------------------------------------------------------------
+;-------------------------------------------------------------------------------
-; ------------------------------------------------------------------
+;-------------------------------------------------------------------------------
; RESET : Target Init, limited to FORTH usage : I/O, FRAM, RTC
; all others I/O are set as input with pullup resistor
-; ------------------------------------------------------------------
+;-------------------------------------------------------------------------------
.include "TargetInit.asm" ; include for each target the init code
MOV &INI_TERM,&TERMVEC
MOV #CPUOFF+GIE,&LPM_MODE
-; -----------------------------------------------------------
+;-------------------------------------------------------------------------------
; RESET : INIT FORTH machine
-; -----------------------------------------------------------
+;-------------------------------------------------------------------------------
MOV #RSTACK,SP ; init return stack
MOV #PSTACK,PSP ; init parameter stack
.SWITCH DTC
MOV #10,&BASE
MOV #-1,&CAPS
-; -----------------------------------------------------------
+;-------------------------------------------------------------------------------
; RESET : test TERM_TXD/Deep_RST before init TERM_UART I/O
-; -----------------------------------------------------------
+;-------------------------------------------------------------------------------
BIC #LOCKLPM5,&PM5CTL0 ; activate all previous I/O settings before DEEP_RST test
MOV &SAVE_SYSRSTIV,Y ;
BIT.B #DEEP_RST,&Deep_RST_IN ; TERM TXD wired to GND via 4k7 resistor ?
ADD #1,Y ; to display SAVE_SYSRSTIV as negative value
MOV Y,&SAVE_SYSRSTIV
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
; RESET : INIT TERM_UART
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
TERM_INIT
-
MOV #0081h,&TERMCTLW0 ; Configure TERM_UART UCLK = SMCLK
.include "TERMINALBAUDRATE.asm" ; include code to configure baudrate
BIC #UCSWRST,&TERMCTLW0 ; release from reset...
BIS #UCRXIE,&TERMIE ; ... then enable RX interrupt for wake up on terminal input
-; -----------------------------------------------------------
+;-------------------------------------------------------------------------------
; RESET : Select POWER_ON|<reset>|DEEP_RST
-; -----------------------------------------------------------
+;-------------------------------------------------------------------------------
SelectReset MOV #COLD_END,IP ; define return of WIPE,RST_STATE,PWR_STATE
MOV &SAVE_SYSRSTIV,Y;
JNZ RST_STATE ; else execute RST_STATE
JZ PWR_STATE ; yes execute PWR_STATE
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
; RESET : INIT SD_Card optionally
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
COLD_END
.IFNDEF SD_CARD_LOADER ;
.word WARM ; the next step
JMP WARM
.ENDIF
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
; ASSEMBLER OPTION
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
.IFDEF MSP430ASSEMBLER
.include "forthMSP430FR_ASM.asm"
.ENDIF
-; ----------------------------------------------------------------------
-; SD CARD FAT OPTIONS
-; ----------------------------------------------------------------------
- .IFDEF SD_CARD_LOADER
- .include "forthMSP430FR_SD_LowLvl.asm" ; SD primitives
- .include "forthMSP430FR_SD_LOAD.asm" ; SD LOAD fonctions
- .IFDEF SD_CARD_READ_WRITE
- .include "forthMSP430FR_SD_RW.asm" ; SD Read/Write fonctions
- .ENDIF
- .ENDIF ; SD_CARD_LOADER
-
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
; UTILITY WORDS OPTION
-; ----------------------------------------------------------------------
+;-------------------------------------------------------------------------------
.IFDEF UTILITY
.include "ADDON\UTILITY.asm"
.ENDIF ; UTILITY
-;-----------------------------------------------------------------------
-; SD TOOLS
-;-----------------------------------------------------------------------
- .IFDEF SD_TOOLS
-
- .IFNDEF UTILITY
- .include "ADDON\UTILITY.asm"
+ .IFDEF SD_CARD_LOADER
+;-------------------------------------------------------------------------------
+; SD CARD FAT OPTIONS
+;-------------------------------------------------------------------------------
+ .include "forthMSP430FR_SD_LowLvl.asm" ; SD primitives
+ .include "forthMSP430FR_SD_LOAD.asm" ; SD LOAD driver
+ .IFDEF SD_CARD_READ_WRITE
+ .include "forthMSP430FR_SD_RW.asm" ; SD Read/Write driver
.ENDIF
+;-------------------------------------------------------------------------------
+; SD TOOLS
+;-------------------------------------------------------------------------------
+ .IFDEF SD_TOOLS
.include "ADDON\SD_TOOLS.asm"
.ENDIF ; SD_READ_WRITE_TOOLS
+;-------------------------------------------------------------------------------
+ .ENDIF ; SD_CARD_LOADER
-; -----------------------------------------------------------
+;-------------------------------------------------------------------------------
; IT'S FINISH : RESOLVE ASSEMBLY PTR
-; -----------------------------------------------------------
-ROMDICT ; init DDP
+;-------------------------------------------------------------------------------
+ROMDICT ; init DDP with this current address
lastvoclink .equ voclink
lastforthword .equ forthlink
lastasmword .equ asmlink
.word voclink
voclink .set $-2
- FORTHWORDIMM "HI2LO" ; immediate, switch to low level, add ASSEMBLER context, set interpretation state
+ FORTHWORDIMM "HI2LO" ; immediate, switch to low level, add ASSEMBLER context, set interpretation state
mDOCOL
- .word HERE,CELLPLUS,COMMA
+HI2LO .word HERE,CELLPLUS,COMMA
.word LEFTBRACKET
HI2LONEXT .word ALSO,ASSEMBLER
.word EXIT
- FORTHWORD "CODE" ;
-ASMCODE CALL #HEADER ; same as ":" ...
- SUB #4,&DDP ; ...but compile nothing
+; FORTHWORDIMM "SEMIC" ; same as HI2LO, plus restore IP; counterpart of COLON
+; mDOCOL
+; .word HI2LO
+; .word LIT,413Dh,COMMA ; compile MOV @RSP+,IP
+; .word EXIT
+
+ FORTHWORD "CODE" ; a CODE word must be finished with ENDCODE
+ASMCODE CALL #HEADER ;
+ SUB #4,&DDP ;
mDOCOL
.word SAVE_PSP
.word BRAN,HI2LONEXT
FORTHWORD "ASM" ; used to define an assembler word which is not executable by FORTH interpreter
; i.e. typically an assembler word called by CALL and ended by RET
- ; ASM words are only v in ASSEMBLER CONTEXT
+ ; ASM words are only usable in another ASSEMBLER words
+ ; an ASM word must be finished with ENDASM
MOV &CURRENT,&ASM_CURRENT
MOV #ASSEMBLER_BODY,&CURRENT
JMP ASMCODE
- asmword "ENDASM" ; end of ASM word
+ asmword "ENDASM" ; end of an ASM word
MOV &ASM_CURRENT,&CURRENT
JMP ENDCODE
; Search ARG of <sep>"xxxx(REG)" ; <== PARAM210
SearchARG ASMtoFORTH ; -- separator search word first
.word WORDD,FIND ; -- c-addr
- .word ZEROEQUAL
- .word QBRAN,SearchARGW ; -- c-addr if found
+; .word ZEROEQUAL
+; .word QBRAN,SearchARGW ; -- c-addr if found
+ .word QZBRAN,SearchARGW ; -- c-addr if found
.word QNUMBER ;
.word QBRAN,NotFound ; -- c-addr
.word AsmSrchEnd ; -- value end if number found
MOV @RSP+,PC ; ret
QDOCON CMP #DOCON,X
JNZ QDODOES
- MOV 2(TOS),TOS ; remplace CFA by [PFA] for CONSTANT and CREATE words
+ MOV 2(TOS),TOS ; remplace CFA by [PFA] for CONSTANT (and CREATEd) words
MOV @RSP+,PC ; ret
QDODOES CMP #DODOES,X
JNZ AsmSrchEnd
-
-
-
-; ------------------------------------------------------------------------------------------
-; forthMSP430FR ASSEMBLER : .IF .ELSEIF .ENDIF structure
-; ------------------------------------------------------------------------------------------
-; it's borrows leave stack
-; [IF] interpret next word, if false scans line and refill it until [ELSE] or [IF] or [THEN] found, else do nothing
-; [ELSE] tests address, tests flag, remove them and leave [THEN] address, if false scans line and refill it until [THEN] found
-; [THEN] remove one parameter from leave stack
-
-; ASMWORD ".ELSEIF" ; fall here if [IF] was true
-;brELSE PSUH IP
-; MOV &LEAVEPTR,IP
-; CMP #brIF,-2(IP) ; case of [IF] state was true
-; JZ BrElseNext ; to skip [ELSE] state
-; CMP #BrElse,-2(IP) ; case of [ELSE] state was true
-; JZ BrThenNext ; to terminate with [THEN] state
-; ASMtoFORTH ; else abort
-; .word XSQUOTE
-; .byte 13,"[IF] missing!"
-; .word QABORTYES
-;
-;BrElseNext
-
-
-
-
-; ASMWORD ".ENDIF" ; fall here if [IF] without [ELSE] was true, or if [ELSE] was true
-;brTHEN JMP brELSE ;
-;BrThenNext SUB #2,&LEAVEPTR
-; MOV @RSP+,IP
-; mNEXT
-;
-;
-; ASMWORD ".IF"
-;BrIF mDOCOL
-;BrIf1 .word FBLANK,WORDD ; Z = EOL
-; FORTHtoASM
-; JZ SrchCndEol
-; ASMtoFORTH
-; .word FIND
-; .word ZEROEQUAL
-; .word QBRAN,SrchCOND1 ; -- c-addr if found
-; .word QNUMBER ;
-;SrchCOND1 FORTHtoASM ; -- xt|value|0
-; MOV @TOS,IP
-;cDOVAR CMP #DOVAR,IP
-; JNZ cDOCON
-; MOV 2(IP),TOS
-; MOV @TOS,TOS ; remplace CFA by value of VARIABLE
-; JMP SrchCOND2
-;cDOCON CMP #DOCON,IP
-; JNZ SrchBrIF
-; MOV 2(TOS),TOS ; remplace CFA by value for CONSTANT and CREATEd words
-;SrchBrIF CMP #BrIF,IP ; [IF] found ?
-; JNZ SrchBrELSE
-; ADD #2,&LEAVEPTR ; -- flag LEAVEPTR+2
-; MOV &LEAVEPTR,IP ;
-; CMP #0,TOS
-; JZ SrchBrIF1 ; to scan
-; MOV #BrIf,-2(IP) ; case of [IF] is true
-; MOV @RSP+,IP
-; mNEXT
-;SrchBrIF1 MOV #BrElse,-2(IP) ; case of [IF] is false
-; MOV #BrIf1,IP
-; mNEXT
-
-;SrchBrELSE CMP #BrELSE,IP ; [ELSE] found ?
-; JZ BrELSECond
-;SrchBrTHEN CMP #BrTHEN,IP ; [THEN] found ?
-; JZ BrTHENCond
-;SrchCOND2
-;
-;SrchCndEol FORTHtoASM
-; MOV @PSP+,TOS
-; MOV
-
-;SrchCOND3 JZ BrIF
-;
-; CMP #0,TOS
-; JZ SrchCOND3
-; .word QBRAN,SrchCOND4
-; .word BRAN,SrchCOND3
-;SrchCOND4 .word FTOIN,FETCH
; used variables : BufferPtr, BufferLen
; ----------------------------------;
-; FORTHWORD "SD_ACCEPT" ; TIB TIB len -- PAD|SDIB len'
+; FORTHWORD "SD_ACCEPT" ; TIB TIB TIB_LEN -- PAD|SDIB len'
; ----------------------------------;
SD_ACCEPT ; sequentially move from BUFFER to SDIB (or PAD) a line of chars delimited by CRLF
-; ----------------------------------;
+; ----------------------------------; up to TIB_LEN = 80 chars
PUSH IP ;
MOV #SDA_YEMIT_RET,IP ; set YEMIT return
; ----------------------------------;
StartNewLine ;
; ----------------------------------;
- MOV &CurrentHdl,T ; prepare link for any next LOAD"ed file...
+ MOV &CurrentHdl,T ; prepare a link for the next LOADed file...
MOV &BufferPtr,HDLW_BUFofst(T) ; ...see usage : HandleComplements
; ----------------------------------; -- TIB TIB len
.IFDEF RAM_1K ; use PAD as SD Input Buffer because the lack of RAM
MOV #PAD,W ; W=dst
- MOV #PAD_SIZE-4,0(PSP) ; -- TIB max_count len
.ELSEIF ; use SDIB as SD Input Buffer
MOV #SDIB,W ; W=dst
- MOV #SDIB_SIZE-4,0(PSP) ; -- TIB max_count len
.ENDIF
- MOV W,2(PSP) ; -- StringOrg' max_count len
- MOV #0,TOS ; -- StringOrg' max_count Count
+ MOV W,2(PSP) ; -- StringOrg' TIB TIB_LEN
+ MOV TOS,0(PSP) ; -- StringOrg' TIB_LEN TIB_LEN
+ MOV #0,TOS ; -- StringOrg' TIB_LEN Count
; ----------------------------------;
SDA_InitSrcAddr ; <== SDA_GetFileNextSector
; ----------------------------------;
CMP #0,&BufferLen ; test if input buffer is empty (EOF)
- JZ SDA_GoToInterpret ; yes
+ JZ SDA_GoToInterpret ; yes, to interpret an empty line (to do nothing)
MOV &BufferPtr,X ; X=src
JMP SDA_ComputeChar ;
; ----------------------------------;
ADD #1,X ; 1 increment input BufferPtr
CMP.B #32,Y ; 2 ascii printable char ?
JHS SDA_MoveChar ; 2 yes
- CMP.B #10,Y ; control char = 'LF' ?
- JNZ SDA_ComputeChar ; no
+ CMP.B #10,Y ; 2 control char = 'LF' ?
+ JNZ SDA_ComputeChar ; 2 no
; ----------------------------------;
SDA_EndOfLine ;
; ----------------------------------;
MOV X,&BufferPtr ; yes save BufferPtr for next line
; ----------------------------------;
-SDA_GoToInterpret ; -- StringOrg' max_count len'
+SDA_GoToInterpret ; -- StringOrg' TIB_LEN len'
; ----------------------------------;
ADD #2,PSP ; -- StringOrg' len'
MOV @RSP+,IP ;
; ----------------------------------;
SDA_MoveChar ;
; ----------------------------------;
- CMP TOS,0(PSP) ; 3 count = max_chars_count ?
+ CMP @PSP,TOS ; 2 count = TIB_LEN ?
JZ YEMIT ; 2 yes, don't move char to dst
MOV.B Y,0(W) ; 3 move char to dst
ADD #1,W ; 1 increment dst addr
ADD #1,TOS ; 1 increment count of moved chars
JMP YEMIT ; 9/6~ send echo to terminal if ECHO, do nothing if NOECHO
-; ----------------------------------; 33/30~ char loop, add 14~ for readsectorW ==> 47/44~ ==> 21/23 kbytes/s / MHz
-SDA_GetFileNextSector ;
+; ----------------------------------; 32/29~ char loop, add 14~ for readsectorW ==> 46/43~ ==> 174/186 kbytes/s @ 8MHz
+SDA_GetFileNextSector ; StringOrg' TIB_LEN Count --
; ----------------------------------;
PUSH W ; save dst
CALL #Read_File ; that resets BufferPtr
; ----------------------------------;
-;C ACCEPT addr addr len -- addr' len' get line at addr to interpret len' chars
- FORTHWORD "ACCEPT"
-ACCEPT MOV #PARENACCEPT,PC
-
-;C (ACCEPT) addr addr len -- addr len' get len' (up to len) chars from terminal (TERATERM.EXE) via USBtoUART bridge
- FORTHWORD "(ACCEPT)"
-PARENACCEPT
-
BIC.B #00Eh,&P1REN ; disable pullup resistors for SIMO/SOMI/SCK pins
.ENDIF
+ .IFDEF MY_MSP430FR5738
+
+; COLD default state : Px{DIR,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; PX{OUT,REN} = 1 ; Px{IN,IES} = ?
+
+; P2.3 as SD_CD
+SD_CD .equ 08h
+SD_CDIN .equ P2IN
+; P2.4 as SD_CS
+SD_CS .equ 10h
+SD_CSOUT .equ P2OUT
+ BIS.B #SD_CS,&P2DIR ; SD_CS output high
+
+; P2.2/UCB0CLK ---> SD_CardAdapter CLK (SCK) default value
+; P1.6/UCB0SIMO/UCB0SDA/TA0.0 ---> SD_CardAdapter SDI (MOSI) default value
+; P1.7/UCB0SOMI/UCB0SCL/TA1.0 <--- SD_CardAdapter SDO (MISO) default value
+ BIS #04C0h,&PASEL1 ; Configure UCB0 pins P2.2 as UCB0CLK, P1.6 as UCB0SIMO & P1.7 as UCB0SOMI
+ ; P2DIR.x is controlled by eUSCI_B0 module
+ BIC #04C0h,&PAREN ; disable pullup resistors for SIMO/SOMI/CLK pins
+
+ .ENDIF
+ .IFDEF MY_MSP430FR5738_1
+
+; COLD default state : Px{DIR,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; PX{OUT,REN} = 1 ; Px{IN,IES} = ?
+
+; P2.3 as SD_CD
+SD_CD .equ 08h
+SD_CDIN .equ P2IN
+; P2.4 as SD_CS
+SD_CS .equ 10h
+SD_CSOUT .equ P2OUT
+ BIS.B #SD_CS,&P2DIR ; SD_CS output high
+
+; P2.2/UCB0CLK ---> SD_CardAdapter CLK (SCK) default value
+; P1.6/UCB0SIMO/UCB0SDA/TA0.0 ---> SD_CardAdapter SDI (MOSI) default value
+; P1.7/UCB0SOMI/UCB0SCL/TA1.0 <--- SD_CardAdapter SDO (MISO) default value
+ BIS #04C0h,&PASEL1 ; Configure UCB0 pins P2.2 as UCB0CLK, P1.6 as UCB0SIMO & P1.7 as UCB0SOMI
+ ; P2DIR.x is controlled by eUSCI_B0 module
+ BIC #04C0h,&PAREN ; disable pullup resistors for SIMO/SOMI/CLK pins
+
+ .ENDIF
+ .IFDEF MY_MSP430FR5948
+
+; COLD default state : Px{DIR,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; PX{OUT,REN} = 1 ; Px{IN,IES} = ?
+
+; P2.3 <--- SD_CD (Card Detect)
+SD_CD .equ 08h
+SD_CDIN .equ P2IN
+; P2.7 ---> SD_CS (Card Select)
+SD_CS .equ 80h
+SD_CSOUT .equ P2OUT
+ BIS.B #SD_CS,&P2DIR ; SD_CS output high
+
+; P2.4 UCA1 CLK ---> SD_CLK
+; P2.5 UCA1 TX/SIMO ---> SD_SDI
+; P2.6 UCA1 RX/SOMI <--- SD_SDO
+ BIS.B #070h,&P2SEL1 ; Configure UCA1 pins P2.4 as UCA1CLK, P2.5 as UCA1SIMO & P2.6 as UCA1SOMI
+ ; P2DIR.x is controlled by eUSCI_A0 module
+ BIC.B #070h,&P2REN ; disable pullup resistors for SIMO/SOMI/SCK pins
+
+ .ENDIF
+ .IFDEF MY_MSP430FR5948_1 ; = new version of MY_MSP430FR5948
+
+; COLD default state : Px{DIR,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; PX{OUT,REN} = 1 ; Px{IN,IES} = ?
+
+; P2.7 ---> SD_CD (Card Detect)
+SD_CD .equ 80h
+SD_CDIN .equ P2IN
+; P2.3 <--- SD_CS (Card Select)
+SD_CS .equ 08h
+SD_CSOUT .equ P2OUT
+ BIS.B #SD_CS,&P2DIR ; SD_CS output high
+
+; P2.4 UCA1 CLK ---> SD_CLK
+; P2.5 UCA1 TX/SIMO ---> SD_SDI
+; P2.6 UCA1 RX/SOMI <--- SD_SDO
+ BIS.B #070h,&P2SEL1 ; Configure UCA1 pins P2.4 as UCA1CLK, P2.5 as UCA1SIMO & P2.6 as UCA1SOMI
+ ; P2DIR.x is controlled by eUSCI_A0 module
+ BIC.B #070h,&P2REN ; disable pullup resistors for SIMO/SOMI/SCK pins
+
+ .ENDIF
BIC #1,&SD_CTLW0 ; release eUSCI from reset
; along with this program. If not, see <http://www.gnu.org/licenses/>.
+ FORTHWORD "{SD_LOAD}" ; SD_LOAD words mark
+ mNEXT
+
;-----------------------------------------------------------------------
; SD card OPEN, LOAD subroutines
;-----------------------------------------------------------------------
MOV #MOVEDOWN,PC ;
-
; rules for registers use
; S = error
; T = CurrentHdl, pathname
MOV.B &ClusterL+1,W ;3 W = ClusterLoHI
MOV.B &ClusterL,Y ;3 Y = ClusterLoLo
CMP #2,&FATtype ;3 FAT32?
- JZ ClusterToFAT32sector ;2 yes
- ADD Y,Y ;1 Y = ClusterLoLo << 1
- RET
-
+ JNZ CTF1S_end ;2 no
+; JZ ClusterToFAT32sector ;2 yes
+; ADD Y,Y ;1 Y = ClusterLoLo << 1
+; RET
; input : Cluster n, max = 7FFFFF ==> SDcard up to 256 GB
; ClusterLoLo*4 = displacement in 512 bytes sector ==> FAToffset
ADD X,W ; W = ClusterHiLo:ClusterLoHi
; ----------------------------------;
SWPB Y ; Y = ClusterLoLo:0
- ADD Y,Y ;1 Y = ClusterLoLo:0 * 2 + carry for FATsector
- ADDC W,W ; W = ClusterHiLo:ClusterLoHi * 2 = ClusterHiLo:ClusterL / 128
+ ADD Y,Y ;1 Y = ClusterLoLo:0 << 1 + carry for FATsector
+ ADDC W,W ; W = ClusterHiLo:ClusterLoHi << 1 = ClusterHiLo:ClusterL / 128
SWPB Y
- ADD Y,Y ; Y = 0:ClusterLoLo * 4
+CTF1S_end
+ ADD Y,Y ; Y = 0:ClusterLoLo << 1
RET ;4
; ----------------------------------;
; ----------------------------------;
FirstLoadFileHandle ;
; ----------------------------------;
- MOV &SOURCE_LEN,&SAVEtsLEN ;
- SUB &TOIN,&SAVEtsLEN ; save remaining lenght
- MOV &SOURCE_ADR,&SAVEtsPTR ;
- ADD &TOIN,&SAVEtsPTR ; save new input org address
+ MOV &TOIN,X ;3
+ MOV &SOURCE_LEN,W ;3
+ SUB X,W ;1
+ MOV W,&SAVEtsLEN ;3 save remaining lenght
+ ADD &SOURCE_ADR,X ;3
+ MOV X,&SAVEtsPTR ;3 save new input org address
MOV #SD_ACCEPT,&ACCEPT+2 ; redirect ACCEPT to SD_ACCEPT
- MOV &SOURCE_LEN,&TOIN ; to quit interpret (same as BACKSLASH)
JMP SetBufLenAndLoadCurSector ;
-;; ----------------------------------;
-;FirstLoadFileHandle ;
-;; ----------------------------------;
-; SUB &TOIN,&SOURCE_LEN ;
-; ADD &TOIN,&SOURCE_ADR ;
-; MOV #SD_ACCEPT,&ACCEPT+2 ; redirect ACCEPT to SD_ACCEPT
-; MOV &SOURCE_LEN,&TOIN ; to quit interpret (same as BACKSLASH)
-; JMP SetBufLenAndLoadCurSector ;
; ----------------------------------;
-
; If closed token = -1, restore DefaultInputStream
; if closed token < -1, restore previous context
; ==================================;
CheckCaseOfClosedLoadedFile ;
; ----------------------------------;
ADD.B #1,W ;
- JZ LastFileLoadClosed ; W=0, this closed LOADed file had not a paren
+ JZ CloseFirstLoadedFile ; W=0, this closed LOADed file had not a paren
JGE InitHandleRET ; W>0, for READ, WRITE, DEL files
; ----------------------------------;
RestorePreviousLoadedFileContext ; W<0, this closed LOADed file had a paren
MOV HDLW_BUFofst(T),&BufferPtr ; restore BufferPtr saved by SD_ACCEPT before interpreting LOAD cmd line
JMP SetBufLenAndLoadCurSector ;
; ----------------------------------;
-LastFileLoadClosed ;
+CloseFirstLoadedFile ;
; ----------------------------------;
-RestoreDefaultInputStream ; it was the first LOADed filre
MOV &SAVEtsLEN,TOS ; restore lenght
MOV &SAVEtsPTR,2(PSP) ; restore pointer for interpret
MOV #PARENACCEPT,&ACCEPT+2 ; restore (ACCEPT)
- JMP InitHandleRET ; RET
-; ----------------------------------;
-;RestoreDefaultInputStream ; it was the first LOADed filre
-; MOV &SOURCE_LEN,TOS ; restore lenght
-; MOV &SOURCE_ADR,2(PSP) ; restore pointer for interpret
-; MOV #0,&TOIN ; reset interpret ptr
-; MOV #PARENACCEPT,&ACCEPT+2 ; restore (ACCEPT)
-; JMP InitHandleRET ; RET
+ RET ; RET
; ----------------------------------;
OPEN_COMP ;
mDOCOL ; if compile state
.word lit,lit,COMMA,COMMA ; compile open_type as literal
+ .IFDEF LOWERCASE
+ .word CAPS_ON
+ .ENDIF
.word SQUOTE ; compile string_exec + string
.word lit,SQUOTE2HERE,COMMA ; compile move in-line string to a counted string at HERE
.word lit,ParenOpen,COMMA ; compile (OPEN)
; ----------------------------------;
ParenOpen ; open_type HERE --
; ----------------------------------;
- SUB #2,PSP ; make room for DIRsector
+; SUB #2,PSP ; make room for DIRsector
; ----------------------------------;
OPN_CountedToStringZ ;
; ----------------------------------;
; ----------------------------------;
MOV TOS,&Pathname ; save name addr
CALL #ComputeClusFrstSect ; output: SectorHL
- MOV #32,0(PSP) ; preset countdown for FAT16 RootDIR sectors
+; MOV #32,0(PSP) ; preset countdown for FAT16 RootDIR sectors
+ MOV #32,rDODOES ; preset countdown for FAT16 RootDIR sectors
CMP #2,&FATtype ; FAT32?
JZ OPN_SetDirSectors ; yes
CMP &ClusterL,&FATtype ; FAT16 AND RootDIR ?
JZ OPN_LoadSectorDir ; yes
OPN_SetDirSectors ;
- MOV &SecPerClus,0(PSP) ;
+; MOV &SecPerClus,0(PSP) ;
+ MOV &SecPerClus,rDODOES ;
; ----------------------------------;
OPN_LoadSectorDir ; <=== Dir Sector loopback
; ----------------------------------;
; ----------------------------------;
ADD #1,&SectorL ;
ADDC #0,&SectorH ;
- SUB #1,0(PSP) ; dec count of Dir sectors
+; SUB #1,0(PSP) ; dec count of Dir sectors
+ SUB #1,rDODOES ; dec count of Dir sectors
JNZ OPN_LoadSectorDir ; ===> loopback for next DIR sector
; ----------------------------------;
MOV #4,S ;
; ----------------------------------;
MOV &ClusterL,&DIRClusterL ;
MOV &ClusterH,&DIRclusterH ;
- ADD #4,PSP ; -- ptr
- MOV @PSP+,TOS ; --
- MOV @RSP+,IP ;
- mNEXT ; happy end
+; MOV #THREEDROP,PC ; 3drop
+ MOV #0,0(PSP)
+ JMP OPN_Dir
; ----------------------------------;
OPN_FileFound ; -- open_type DIRsector ptr
; ----------------------------------;
- MOV 2(PSP),W
+; MOV 2(PSP),W ;
+ MOV @PSP,W ;
CALL #GetFreeHandle ;STWXY init handle(HDLL_DIRsect,HDLW_DIRofst,HDLL_FirstClus = HDLL_CurClust,HDLL_CurSize)
; ----------------------------------; output : T = CurrentHdl*, S = ReturnError, Y = DIRentry offset
OPN_NomoreHandle ; S = error 16
OPN_EndOfDIR ; S = error 4
OPN_NoSuchFile ; S = error 2
OPN_NoPathName ; S = error 1
- ADD #2,PSP ; -- open_type ptr
+OPN_Dir
+; ADD #2,PSP ; -- open_type ptr
MOV @PSP+,W ; -- ptr W = open_type
+ MOV #xdodoes,rDODOES ; -- open_type ptr
MOV @PSP+,TOS ; --
; ----------------------------------; then go to selected OpenType subroutine (OpenType = W register)
; ======================================================================
; ----------------------------------;
+OPEN_QDIR ;
+; ----------------------------------;
+ CMP #0,W ;
+ JZ OPEN_LOAD_END ; nothing to do
+; ----------------------------------;
+OPEN_QLOAD ;
+; ----------------------------------;
.IFDEF SD_CARD_READ_WRITE ;
CMP.B #-1,W ; open_type = LOAD"
JNZ OPEN_QREAD ; next step
; ----------------------------------;
CMP #0,S ; open file happy end ?
JNZ OPEN_Error ; no
+ MOV #INTLOOP,IP ; return to sender (QUIT) to get new line.
+OPEN_LOAD_END
mNEXT ;
; ----------------------------------;
-
-
; ----------------------------------;
OPEN_Error ; S= error
; ----------------------------------;
; Formatage FA16 d'une SDSC Card 2GB
; First sector of physical drive (sector 0) content :
; ---------------------------------------------------
-; dec@| HEX@ = HEX decimal
-; 446 |0x1BE : partition table first record ==> logical drive 0
-; 446 |0x1CE : partition table 2th record ==> logical drive 1
-; 446 |0x1DE : partition table 3th record ==> logical drive 2
-; 446 |0x1EE : partition table 4th record ==> logical drive 3
+; dec@| HEX@
+; 446 |0x1BE : partition table first record ==> logical drive 0
+; 446 |0x1CE : partition table 2th record ==> logical drive 1
+; 446 |0x1DE : partition table 3th record ==> logical drive 2
+; 446 |0x1EE : partition table 4th record ==> logical drive 3
; partition record content :
; ---------------------------------------------------
-; dec@|HEX@ = HEX decimal
+; dec@|HEX@ = HEX decimal
; 0 |0x00 = 0x00 : not bootable
; 1 |0x01 = 02 0C 00 : Org Cylinder/Head/Sector offset (CHS-addressing) = not used
; 4 |0x04 = 0x0E : type FAT16 using LBA addressing = 14 ==> FAT16
; 5 |0x05 = ED 3F EE : End Cylinder/Head/Sector offset (CHS-addressing) = not used
-; 8 |0x08 = 00 20 00 00 : sector offset of logical drive = 8192
-; 12 |0x0C = 00 40 74 00 : sector size of logical drive = 7618560 sectors
+; 8 |0x08 = 00 20 00 00 : sectors offset of logical drive = 8192
+; 12 |0x0C = 00 40 74 00 : sectors size of logical drive = 7618560 sectors
; 450 |0x04 = 0x0E : type FAT16 using LBA addressing = 14 ==> set FATtype = FAT16 with byte CMD addressing
; 454 |0x1C6 = 89 00 : FirstSector (of logical drive 0) BS_FirstSector = 137
; FirstSector of logical drive (sector 0) content :
; -------------------------------------------------
-; dec@| HEX@ = HEX decimal
+; dec@| HEX@ = HEX decimal
; 11 | 0x0B = 00 02 : 512 bytes/sector BPB_BytsPerSec = 512
; 13 | 0x0D = 40 : 64 sectors/cluster BPB_SecPerClus = 64
; 14 | 0x0E = 01 00 : 2 reserved sectors BPB_RsvdSecCnt = 1
; Formatage FA32 d'une SDSC Card 8GB
; First sector of physical drive (sector 0) content :
; ---------------------------------------------------
-; dec@| HEX@ = HEX decimal
-; 446 |0x1BE : partition table first record ==> logical block 0
-; 446 |0x1CE : partition table 2th record ==> logical block 1
-; 446 |0x1DE : partition table 3th record ==> logical block 2
-; 446 |0x1EE : partition table 4th record ==> logical block 3
+; dec@| HEX@
+; 446 |0x1BE : partition table first record ==> logical block 0
+; 446 |0x1CE : partition table 2th record ==> logical block 1
+; 446 |0x1DE : partition table 3th record ==> logical block 2
+; 446 |0x1EE : partition table 4th record ==> logical block 3
; partition record content :
; ---------------------------------------------------
; 1 |0x01 = 82 03 00 : Org CHS offset (Cylinder/Head/Sector) = not used
; 4 |0x04 = 0x0C : type FAT32 using LBA addressing = 12 ==> set FATtype = FAT32 with sector CMD addressing
; 5 |0x05 = 82 03 00 : End offset (Cylinder/Head/Sector offset) = not used
-; 8 |0x08 = 00 20 00 00 : sector offset of logical block = 8192
-; 12 |0x0C = 00 40 74 00 : sector size of logical block = 7618560
+; 8 |0x08 = 00 20 00 00 : sectors offset of logical block = 8192
+; 12 |0x0C = 00 40 74 00 : sectors size of logical block = 7618560
; 454 |0x1C6 = 00 20 00 00 : FirstSector (of logical drive 0) = BS_FirstSector = 8192
;
; FirstSector of logical block (sector 0) content :
; -------------------------------------------------
-; dec@| HEX@ = HEX decimal
+; dec@| HEX@ = HEX decimal
; 11 | 0x0B = 00 02 : 512 bytes/sector BPB_BytsPerSec = 512
; 13 | 0x0D = 08 : 8 sectors/cluster BPB_SecPerClus = 8
; 14 | 0x0E = 20 00 : 32 reserved sectors BPB_RsvdSecCnt = 32
; ==================================;
RW_Sector_CMD ;WX <=== CMD17 or CMD24 (read or write Sector CMD)
; ==================================;
- BIC.B #SD_CS,&SD_CSOUT ; SD_CS low
- BIT.B #SD_CD,&SD_CDIN ; memory card present ?
+ BIC.B #SD_CS,&SD_CSOUT ; set SD_CS low
+ BIT.B #SD_CD,&SD_CDIN ; test CD: memory card present ?
JZ ComputePhysicalSector ; yes
MOV #COLD,PC ; no: force COLD
; ----------------------------------;
-ComputePhysicalSector ; input = logical sector, output = physical sector
-; ----------------------------------;
+ComputePhysicalSector ;
+; ----------------------------------; input = logical sector...
ADD &BS_FirstSectorL,W ;3
ADDC &BS_FirstSectorH,X ;3
+; ----------------------------------; ...output = physical sector
+;Compute CMD ;
; ----------------------------------;
- MOV #1,&SD_CMD_FRM ;3 $(01 00 xx xx xx CMD) (set stop bit)
+ MOV #1,&SD_CMD_FRM ;3 $(01 00 xx xx xx CMD) set stop bit in CMD frame
CMP #2,&FATtype ;3 FAT32 ?
JZ FAT32_CMD ;2 yes
FAT16_CMD ; FAT16 : CMD17/24 byte address = Sector * BPB_BytsPerSec
SWPB X ;1
MOV.B X,&SD_CMD_FRM+4 ;3 $(01 ll LL hh HH CMD)
; ==================================;
-WaitIdleBeforeSendCMD ; <=== CMD41, CMD1, CMD16 (R1 expected response = 0 = ready)
+WaitIdleBeforeSendCMD ; <=== CMD41, CMD1, CMD16 (forthMSP430FR_SD_INIT.asm)
; ==================================;
CALL #SPI_GET ;
- CMP.B #-1,W ; FFh expected value <==> MISO = 1 = not busy = idle state
+ CMP.B #-1,W ; FFh = expected value <==> MISO = 1 = not busy = idle state
JNE WaitIdleBeforeSendCMD ; loop back until idle state
- MOV #0,W ; W = expected R1 response = ready = 0 for CMD41,CMD16, CMD17, CMD24
+ MOV #0,W ; W = expected R1 response = ready, for CMD41,CMD16, CMD17, CMD24
; ==================================;
-sendCommand ;X <=== CMD0, CMD8, CMD55 (W = R1 expected response = 1 = idle)
+sendCommand ;X <=== CMD0, CMD8, CMD55: W = R1 expected response = idle (forthMSP430FR_SD_INIT.asm)
; ==================================;
; input : SD_CMD_FRM : {CRC,byte_l,byte_L,byte_h,byte_H,CMD}
; W = expected return value
; output W is unchanged, flag Z is positionned
; reverts CMD bytes before send : $(CMD hh LL ll 00 CRC)
- MOV #5,X ; X = SD_CMD_FRM index AND countdown
+ MOV #5,X ; X = SD_CMD_FRM ptr AND countdown
; ----------------------------------;
Send_CMD_PUT ; performs little endian --> big endian conversion
; ----------------------------------;
MOV.B SD_CMD_FRM(X),&SD_TXBUF ;5
CMP #0,&SD_BRW ;3 full speed ?
JZ FullSpeedSend ;2 yes
-Send_CMD_Loop ; no: case of low speed during memCardInit
- BIT #UCRXIFG,&SD_IFG ;3
+Send_CMD_Loop ;
+ BIT #UCRXIFG,&SD_IFG ;3 no: case of low speed during memCardInit
JZ Send_CMD_Loop ;2
CMP.B #0,&SD_RXBUF ;3 to clear UCRXIFG
FullSpeedSend ;
; MOV #32,X ; to pass Panasonic SD_Card init
; MOV #64,X ; to pass SanDisk SD_Card init
; ----------------------------------;
-Wait_Command_Response ; expect W = return value during X = 255 time
+Wait_Command_Response ; expect W = return value during X = 255 times
; ----------------------------------;
SUB #1,X ;1
- JN SPI_WAIT_RET ;2 error on time out with SR(Z) = 0
+ JN SPI_WAIT_RET ;2 error on time out with flag Z = 0
MOV.B #-1,&SD_TXBUF ;3 PUT FFh
CMP #0,&SD_BRW ;3 full speed ?
JZ FullSpeedGET ;2 yes
BIT #UCRXIFG,&SD_IFG ;3
JZ cardResp_Getloop ;2
FullSpeedGET ;
-; NOP2 ; NOPx adjusted to avoid SD_error
+; NOP ; NOPx adjusted to avoid SD_error
CMP.B &SD_RXBUF,W ;3 return value = ExpectedValue ?
- JNZ Wait_Command_Response ;2 18~ full speed loop
-SPI_WAIT_RET ; SR(Z) = 1 <==> Return value = expected value
+ JNZ Wait_Command_Response ;2 16~ full speed loop
+SPI_WAIT_RET ; flag Z = 1 <==> Returned value = expected value
RET ; W = expected value, unchanged
; ----------------------------------;
; ==================================; output : W = received byte, X = 0 always
MOV #1,X ;1
; ==================================;
-SPI_X_GET ; PUT(FFh) X time
+SPI_X_GET ; PUT(FFh) X times
; ==================================; output : W = last received byte, X = 0
MOV #-1,W ;1
; ==================================;
SPI_PUT ; PUT(W) X time
; ==================================; output : W = last received byte, X = 0
SWPB W ;1
- MOV.B W,&SD_TXBUF ;3 put W high byte then W low byte and so forth that performs little to big endian conversion
+ MOV.B W,&SD_TXBUF ;3 put W high byte then W low byte and so forth, that performs little to big endian conversion
CMP #0,&SD_BRW ;3 full speed ?
JZ FullSpeedPut ;2
SPI_PUTWAIT BIT #UCRXIFG,&SD_IFG ;3
FullSpeedPut
; NOP ; NOPx adjusted to avoid SD error
SUB #1,X ;1
- JNZ SPI_PUT ;2
+ JNZ SPI_PUT ;2 12~ loop
SPI_PUT_END MOV.B &SD_RXBUF,W ;3
RET ;4
; ----------------------------------;
; ==================================;
BIS #1,S ; preset sd_read error
MOV.B #51h,&SD_CMD_FRM+5 ; CMD17 = READ_SINGLE_BLOCK
- CALL #RW_Sector_CMD ; which performs logical sector to physical sector then little endian to big endian conversions
+ CALL #RW_Sector_CMD ; which performs logical sector to physical sector then little endian to big endian conversion
JNE SD_CARD_ERROR ; time out error if R1 <> 0
; ----------------------------------;
WaitFEhResponse ; wait SD_Card response FEh
; ----------------------------------;
; 2.1- Compute Sectors count ; Sectors = HDLL_CurSize/512
; ----------------------------------;
- MOV.B HDLL_CurSize+1(T),Y ; Y = 0:CurSizeLoHi
- MOV.B HDLH_CurSize(T),S ; S = 0:CurSizeHiLo
- SWPB S ; S = CurSizeHiLo:0
- ADD Y,S ; S = CurSizeHiLo:CurSizeLoHi
- MOV.B HDLH_CurSize+1(T),W ; W:S = CurSize / 256
- RRA W ; W = Sectors number_High
- RRC S ; S = Sectors number_Low
-; ----------------------------------;
-; 2.2- Compute Buffer offset ; tested with 4100 bytes and SecPerClus=8
-; ----------------------------------;
- MOV HDLL_CurSize(T),Y ; Y = 1004
- BIC #01FFh,HDLL_CurSize(T) ; substract 4 from HDLL_CurSize
- AND #01FFh,Y ; Y = 4
- MOV Y,&BufferPtr ; init Buffer Pointer with 4
-; ----------------------------------;
-ComputeClustersCount ; with W:S / T ==> quotient = Y:X, remainder = W
-; ----------------------------------;
- MOV.B &SecPerClus,T ;3 T = DIVISOR = SecPerClus
- CALL #UDIVQ32 ; unsigned division 32/16 ==> Q32,R16 i.e. W:S/T ==> Y:X,W use S,T,W,X,Y
- MOV &CurrentHDL,T ;
-; ----------------------------------;
-; 2.3- Compute Cluster offset ;
-; ----------------------------------;
- MOV.B W,HDLB_ClustOfst(T) ;3 update handle with W = R16 (remainder) = sectors offset in cluster
-; ----------------------------------;
-; 2.4- Compute last Cluster ; X = Q32lo = Clusters numberLO, Y = Q32hi = Clusters numberHI
+ MOV.B HDLL_CurSize+1(T),Y ;Y = 0:CurSizeLOHi
+ MOV.B HDLH_CurSize(T),X ;X = 0:CurSizeHILo
+ SWPB X ;X = CurSizeHIlo:0
+ ADD Y,X ;X = CurSizeHIlo:CurSizeLOhi
+ MOV.B HDLH_CurSize+1(T),Y ;Y:X = CurSize / 256
+; RRA Y ;Y = Sectors number_High
+; RRC X ;X = Sectors number_Low
+; ----------------------------------;
+; 2.2 Compute Clusters Count ;
+; ----------------------------------;
+ MOV.B &SecPerClus,T ;3 T = DIVISOR = SecPerClus = 0:SPClo
+DIVSECPERSPC ;
+ MOV #0,W ;1 W = 0:REMlo = 0
+ MOV #8,S ;1 S = CNT
+; RRA T ;1 0>0:SPClo>C preshift one right DIVISOR
+DIVSECPERSPC1 ;
+ RRA Y ;1 0>0:SEC_HI>C
+ RRC X ;1 C>SEC_LO>C
+ RRC.B W ;1 C>REMlo>C
+ SUB #1,S ;1 CNT-1
+ RRA T ;1 0>SPChi:SPClo>C
+ JNC DIVSECPERSPC1 ;2 7~ loopback if carry clear
+DIVSECPERSPC2 ;
+ RRA W ;1 0>0:REMlo>C
+ SUB #1,S ;1 CNT-1
+; JNZ DIVSECPERSPC2 ;2 4~ loopback Wlo = OFFSET, X = CLU_LO, Y = CLU_HI
+ JGE DIVSECPERSPC2 ;2 4~ loopback Wlo = OFFSET, X = CLU_LO, Y = CLU_HI
+; ----------------------------------;
+ MOV &CurrentHDL,T ;3 reload Handle ptr
+; ----------------------------------;
+; 2.3- Compute last Cluster ; X = Clusters numberLO, Y = Clusters numberHI
; ----------------------------------;
ADD HDLL_FirstClus(T),X ;
ADDC HDLH_FirstClus(T),Y ;
MOV X,HDLL_CurClust(T) ; update handle
MOV Y,HDLH_CurClust(T) ;
; ----------------------------------;
+; 2.4- Compute Sectors offset ;
+; ----------------------------------;
+ MOV.B W,HDLB_ClustOfst(T) ;3 update handle with W = REMlo = sectors offset in last cluster
+; ----------------------------------;
; 3- load last sector in BUFFER ;
; ----------------------------------;
+ MOV HDLL_CurSize(T),W ; example : W = 1013
+ BIC #01FFh,HDLL_CurSize(T) ; substract 13 from HDLL_CurSize, because loaded in buffer
+ AND #01FFh,W ; W = 13
+ MOV W,&BufferPtr ; init Buffer Pointer with 13
CALL #LoadHDLcurrentSector ;SWX
- mNEXT ; --
-; ----------------------------------; BufferPtr leaves first free byte offset
+ mNEXT ; BufferPtr = first free byte offset
+; ----------------------------------;
; ======================================================================
MOV.B X,BUFFER(Y) ;3
ADD #1,Y ;1
CMP #BytsPerSec-1,Y ;2
- JZ T2S_XOFF ;2 Y=511 send XOFF after RX 511th char
JLO T2S_FillBufferLoop ;2 Y<511 21 cycles char loop
+ JZ T2S_XOFF ;2 Y=511 send XOFF after RX 511th char
; ----------------------------------;
T2S_WriteFile ;2 Y>511
; ----------------------------------;
FAST FORTH have one pass assembler, not able to make forward jump.
-In my (well written) apps I have never used forward jumps.
-
-But I have added possibility of several "non canonical" jumps, up to 3 backward and up to 3 forward imbricated jumps to label :
+I have added possibility of several "non canonical" jumps, up to 3 backward and up to 3 forward imbricated jumps to label :
\ C UM/MOD udlo|udhi u1 -- ur uq
CODE UM/MOD
example : RRUM #3,R9 \ R9 register is Unsigned Right shifted by n=3
error occurs if 1 > n > 4
+
+
+conditionnal jumps use with symbolic assembler
+
+ 0= { IF UNTIL WHILE ?JMP ?GOTO }
+ 0<> { IF UNTIL WHILE ?JMP ?GOTO }
+ U>= { IF UNTIL WHILE ?JMP ?GOTO }
+ U< { IF UNTIL WHILE ?JMP ?GOTO }
+ S< { IF UNTIL WHILE ?JMP ?GOTO }
+ S>= { IF UNTIL WHILE ?JMP ?GOTO }
+ 0>= { IF UNTIL WHILE }
+ 0< { ?JMP ?GOTO }
+
OSCOFF equ 0020h
SCG0 equ 0040h
SCG1 equ 0080h
-UF1 equ 0200h ; = SR(9) User Flag 1 used by ?NUMBER --> INTERPRET --> LITERAL to process double numbers, else free for use.
-UF2 equ 0400h ; = SR(10) User Flag 2
-UF3 equ 0800h ; = SR(11) User Flag 3
+UF9 equ 0200h ; = SR(9) User Flag 1 used by ?NUMBER --> INTERPRET --> LITERAL to process double numbers, else free for use.
+UF10 equ 0400h ; = SR(10) User Flag 2
+UF11 equ 0800h ; = SR(11) User Flag 3
;----------------------------------------------------------------------------
; Low-Power-Mode Bitmuster