From a204bd28a60ae4fa7b7ee0153a0ed03bd968522a Mon Sep 17 00:00:00 2001 From: Jean-Michel THOORENS Date: Wed, 28 Oct 2020 20:04:47 +0100 Subject: [PATCH] V3.7 --- ADDON/CORE_ANS.asm | 22 +- ADDON/FixPoint.asm | 17 - ADDON/SD_TOOLS.asm | 22 +- ADDON/UTILITY.asm | 18 - FastForth.pdf | Bin 114265 -> 113033 bytes FastForthWords.txt | 184 +- FastForth_at_work.pdf | Bin 1754827 -> 1754741 bytes MSP430-FORTH/BOOT.4th | 14 + MSP430-FORTH/CHNGBAUD.f | 206 +- MSP430-FORTH/CORDIC.f | 452 +- MSP430-FORTH/CORETEST.4TH | 38 +- MSP430-FORTH/CORE_ANS.f | 214 +- MSP430-FORTH/DEEP_RST.f | 31 - MSP430-FORTH/DOUBLE.f | 166 +- MSP430-FORTH/FF_SPECS.f | 203 +- MSP430-FORTH/FixPoint.f | 355 +- .../{MSP_EXP430FR5994/FF_SPECS.4TH => LAST.4TH} | 175 +- MSP430-FORTH/MSP_EXP430FR5994/BOOT.4TH | 82 - MSP430-FORTH/MSP_EXP430FR5994/CHNGBAUD.4TH | 425 - MSP430-FORTH/MSP_EXP430FR5994/CORDIC.4TH | 499 - MSP430-FORTH/MSP_EXP430FR5994/CORETEST.4TH | 1113 - MSP430-FORTH/MSP_EXP430FR5994/CORE_ANS.4TH | 1050 - MSP430-FORTH/MSP_EXP430FR5994/DEEP_RST.4TH | 16 - MSP430-FORTH/MSP_EXP430FR5994/DOUBLE.4TH | 1310 - MSP430-FORTH/MSP_EXP430FR5994/FIXPOINT.4TH | 487 - MSP430-FORTH/MSP_EXP430FR5994/MISC/TESTASM.4TH | 508 - MSP430-FORTH/MSP_EXP430FR5994/PROG100K.4TH | 24941 ------------------- MSP430-FORTH/MSP_EXP430FR5994/RC5TOLCD.4TH | 337 - MSP430-FORTH/MSP_EXP430FR5994/RTC.4TH | 393 - MSP430-FORTH/MSP_EXP430FR5994/SD_TEST.4TH | 432 - MSP430-FORTH/MSP_EXP430FR5994/SD_TOOLS.4TH | 252 - MSP430-FORTH/MSP_EXP430FR5994/TESTXASM.4TH | 1081 - MSP430-FORTH/MSP_EXP430FR5994/TSTWORDS.4TH | 90 - MSP430-FORTH/MSP_EXP430FR5994/UARTI2CS.4TH | 352 - MSP430-FORTH/MSP_EXP430FR5994/UTILITY.4TH | 453 - MSP430-FORTH/PROG100k.f | 15 +- MSP430-FORTH/RC5toLCD.f | 183 +- MSP430-FORTH/RTC.f | 853 +- MSP430-FORTH/SD_TEST.f | 41 +- MSP430-FORTH/SD_TOOLS.f | 39 +- MSP430-FORTH/TESTASM.F | 43 +- MSP430-FORTH/TESTXASM.F | 29 - MSP430-FORTH/UARTI2CS.f | 894 +- MSP430-FORTH/UTILITY.f | 49 +- MSP430-FORTH/lib/DEFER.f | 141 + MSP430-FORTH/lib/FACILITY.f | 70 + MSP430-FORTH/lib/I2CF_Soft_Master.f | 18 - MSP430-FORTH/lib/I2CF_Soft_MultiMaster.f | 16 - MSP430-FORTH/lib/I2C_Master.f | 239 +- MSP430-FORTH/lib/I2C_MultiMaster.f | 16 - MSP430-FORTH/lib/I2C_Slave.f | 15 - MSP430-FORTH/lib/I2C_Slave_to_LCD_2x20.f | 16 - MSP430-FORTH/lib/I2C_Soft_Master.f | 16 - MSP430-FORTH/lib/I2C_Soft_MultiMaster.f | 16 - MSP430-FORTH/lib/IR_RC5.f | 16 - MSP430-FORTH/lib/IR_RC5_to_I2CF_Soft_Master.f | 16 - MSP430-FORTH/lib/LCD_2x20.f | 16 - MSP430-FORTH/lib/STRING.f | 123 + README.md | 328 +- SciTEDirectory.properties | 1219 +- binaries/CHIPSTICK_FR2433_16MHz_I2C.txt | 633 +- binaries/CHIPSTICK_FR2433_16MHz_UART.txt | 626 +- binaries/CHIPSTICK_FR2433_1MHz_I2C.txt | 630 +- binaries/CHIPSTICK_FR2433_1MHz_UART.txt | 624 +- binaries/CHIPSTICK_FR2433_8MHz_I2C.txt | 631 +- binaries/CHIPSTICK_FR2433_8MHz_UART.txt | 624 +- binaries/FET_prog.bat - Raccourci.lnk | Bin 0 -> 947 bytes binaries/FET_prog.bat.lnk | Bin 927 -> 0 bytes binaries/LP_MSP430FR2476_16MHz_I2C.txt | 658 +- binaries/LP_MSP430FR2476_16MHz_UART.txt | 655 +- binaries/LP_MSP430FR2476_1MHz_I2C.txt | 656 +- binaries/LP_MSP430FR2476_1MHz_UART.txt | 653 +- binaries/LP_MSP430FR2476_8MHz_I2C.txt | 656 +- binaries/LP_MSP430FR2476_8MHz_UART.txt | 653 +- binaries/MSP_EXP430FR2355_16MHz_I2C.txt | 658 +- binaries/MSP_EXP430FR2355_16MHz_UART.txt | 655 +- binaries/MSP_EXP430FR2355_1MHz_I2C.txt | 643 +- binaries/MSP_EXP430FR2355_1MHz_UART.txt | 618 +- binaries/MSP_EXP430FR2355_24MHz_I2C.txt | 658 +- binaries/MSP_EXP430FR2355_24MHz_UART.txt | 655 +- binaries/MSP_EXP430FR2355_8MHz_I2C.txt | 651 +- binaries/MSP_EXP430FR2355_8MHz_UART.txt | 656 +- binaries/MSP_EXP430FR2433_16MHz_I2C.txt | 656 +- binaries/MSP_EXP430FR2433_16MHz_UART.txt | 654 +- binaries/MSP_EXP430FR2433_1MHz_I2C.txt | 654 +- binaries/MSP_EXP430FR2433_1MHz_UART.txt | 652 +- binaries/MSP_EXP430FR2433_8MHz_I2C.txt | 654 +- binaries/MSP_EXP430FR2433_8MHz_UART.txt | 652 +- binaries/MSP_EXP430FR4133_16MHz_I2C.txt | 656 +- binaries/MSP_EXP430FR4133_16MHz_UART.txt | 629 +- binaries/MSP_EXP430FR4133_1MHz_I2C.txt | 654 +- binaries/MSP_EXP430FR4133_1MHz_UART.txt | 627 +- binaries/MSP_EXP430FR4133_8MHz_I2C.txt | 654 +- binaries/MSP_EXP430FR4133_8MHz_UART.txt | 627 +- binaries/MSP_EXP430FR5739_16MHz_I2C.txt | 658 +- binaries/MSP_EXP430FR5739_16MHz_UART.txt | 655 +- binaries/MSP_EXP430FR5739_1MHz_I2C.txt | 654 +- binaries/MSP_EXP430FR5739_1MHz_UART.txt | 655 +- binaries/MSP_EXP430FR5739_24MHz_I2C.txt | 658 +- binaries/MSP_EXP430FR5739_24MHz_UART.txt | 655 +- binaries/MSP_EXP430FR5739_8MHz_I2C.txt | 658 +- binaries/MSP_EXP430FR5739_8MHz_UART.txt | 655 +- binaries/MSP_EXP430FR5969_16MHz_I2C.txt | 635 +- binaries/MSP_EXP430FR5969_16MHz_UART.txt | 628 +- binaries/MSP_EXP430FR5969_1MHz_I2C.txt | 633 +- binaries/MSP_EXP430FR5969_1MHz_UART.txt | 626 +- binaries/MSP_EXP430FR5969_8MHz_I2C.txt | 632 +- binaries/MSP_EXP430FR5969_8MHz_UART.txt | 625 +- binaries/MSP_EXP430FR5994_16MHz_I2C.txt | 1131 +- binaries/MSP_EXP430FR5994_16MHz_UART.txt | 1245 +- binaries/MSP_EXP430FR5994_1MHz_I2C.txt | 1131 +- binaries/MSP_EXP430FR5994_1MHz_UART.txt | 1245 +- binaries/MSP_EXP430FR5994_8MHz_I2C.txt | 1131 +- binaries/MSP_EXP430FR5994_8MHz_UART.txt | 1247 +- binaries/MSP_EXP430FR6989_16MHz_I2C.txt | 662 +- binaries/MSP_EXP430FR6989_16MHz_UART.txt | 659 +- binaries/MSP_EXP430FR6989_1MHz_I2C.txt | 656 +- binaries/MSP_EXP430FR6989_1MHz_UART.txt | 657 +- binaries/MSP_EXP430FR6989_8MHz_I2C.txt | 659 +- binaries/MSP_EXP430FR6989_8MHz_UART.txt | 656 +- binaries/prog.bat.lnk | Bin 915 -> 927 bytes config/CopySourceFileToTarget_SD_Card.bat | 6 +- config/CopyTo_SD_Card.bat | 20 +- config/PreprocessSourceFile.bat | 4 +- config/Select.bat | 4 +- config/SendFile.ttl | 45 +- config/SendSource.bat | 10 +- config/SendSourceFileToTarget.bat | 8 +- config/SendToSD.ttl | 52 +- config/asm.properties | 3 +- config/forth.properties | 10 +- forthMSP430FR.asm | 1549 +- forthMSP430FR_ASM.asm | 169 +- forthMSP430FR_CONDCOMP.asm | 184 +- forthMSP430FR_EXTD_ASM.asm | 114 +- forthMSP430FR_SD_ACCEPT.asm | 30 +- forthMSP430FR_SD_INIT.asm | 86 +- forthMSP430FR_SD_LOAD.asm | 83 +- forthMSP430FR_SD_LowLvl.asm | 108 +- forthMSP430FR_SD_RW.asm | 142 +- forthMSP430FR_TERM_HALF.asm | 300 + forthMSP430FR_TERM_I2C.asm | 276 +- forthMSP430FR_TERM_UART.asm | 332 +- inc/CHIPSTICK_FR2433.asm | 13 +- inc/FastForthREGtoTI.pat | 40 +- inc/LP_MSP430FR2476.asm | 52 +- inc/MSP430FR2355.inc | 5 +- inc/MSP430FR2355.pat | 135 +- inc/MSP430FR2433.inc | 3 + inc/MSP430FR2433.pat | 123 +- inc/MSP430FR2476.inc | 3 + inc/MSP430FR2476.pat | 127 +- inc/MSP430FR2633.pat | 123 +- inc/MSP430FR4133.inc | 3 + inc/MSP430FR4133.pat | 123 +- inc/MSP430FR5738.inc | 3 + inc/MSP430FR5738.pat | 223 +- inc/MSP430FR5739.inc | 3 + inc/MSP430FR5739.pat | 200 +- inc/MSP430FR5948.inc | 3 + inc/MSP430FR5948.pat | 123 +- inc/MSP430FR5969.inc | 3 + inc/MSP430FR5969.pat | 123 +- inc/MSP430FR5972.inc | 513 + inc/MSP430FR5972.pat | 889 + inc/MSP430FR5994.inc | 3 + inc/MSP430FR5994.pat | 133 +- inc/MSP430FR6989.inc | 3 + inc/MSP430FR6989.pat | 123 +- inc/MSP_EXP430FR2355.asm | 79 +- inc/MSP_EXP430FR2355.pat | 31 +- inc/MSP_EXP430FR2433.asm | 48 +- inc/MSP_EXP430FR4133.asm | 47 +- inc/MSP_EXP430FR5739.asm | 28 +- inc/MSP_EXP430FR5969.asm | 56 +- inc/MSP_EXP430FR5972.asm | 417 + inc/MSP_EXP430FR5972.pat | 279 + inc/MSP_EXP430FR5994.asm | 62 +- inc/MSP_EXP430FR6989.asm | 56 +- inc/TERMINALBAUDRATE.inc | 153 +- inc/TargetInit.asm | 3 - inc/ThingsInFirst.inc | 368 +- inc/ThingsInLast.inc | 140 +- 183 files changed, 29710 insertions(+), 59820 deletions(-) delete mode 100644 MSP430-FORTH/DEEP_RST.f rename MSP430-FORTH/{MSP_EXP430FR5994/FF_SPECS.4TH => LAST.4TH} (71%) delete mode 100644 MSP430-FORTH/MSP_EXP430FR5994/BOOT.4TH delete mode 100644 MSP430-FORTH/MSP_EXP430FR5994/CHNGBAUD.4TH delete mode 100644 MSP430-FORTH/MSP_EXP430FR5994/CORDIC.4TH delete mode 100644 MSP430-FORTH/MSP_EXP430FR5994/CORETEST.4TH delete mode 100644 MSP430-FORTH/MSP_EXP430FR5994/CORE_ANS.4TH delete mode 100644 MSP430-FORTH/MSP_EXP430FR5994/DEEP_RST.4TH delete mode 100644 MSP430-FORTH/MSP_EXP430FR5994/DOUBLE.4TH delete mode 100644 MSP430-FORTH/MSP_EXP430FR5994/FIXPOINT.4TH delete mode 100644 MSP430-FORTH/MSP_EXP430FR5994/MISC/TESTASM.4TH delete mode 100644 MSP430-FORTH/MSP_EXP430FR5994/PROG100K.4TH delete mode 100644 MSP430-FORTH/MSP_EXP430FR5994/RC5TOLCD.4TH delete mode 100644 MSP430-FORTH/MSP_EXP430FR5994/RTC.4TH delete mode 100644 MSP430-FORTH/MSP_EXP430FR5994/SD_TEST.4TH delete mode 100644 MSP430-FORTH/MSP_EXP430FR5994/SD_TOOLS.4TH delete mode 100644 MSP430-FORTH/MSP_EXP430FR5994/TESTXASM.4TH delete mode 100644 MSP430-FORTH/MSP_EXP430FR5994/TSTWORDS.4TH delete mode 100644 MSP430-FORTH/MSP_EXP430FR5994/UARTI2CS.4TH delete mode 100644 MSP430-FORTH/MSP_EXP430FR5994/UTILITY.4TH create mode 100644 MSP430-FORTH/lib/DEFER.f create mode 100644 MSP430-FORTH/lib/FACILITY.f create mode 100644 MSP430-FORTH/lib/STRING.f create mode 100644 binaries/FET_prog.bat - Raccourci.lnk delete mode 100644 binaries/FET_prog.bat.lnk create mode 100644 forthMSP430FR_TERM_HALF.asm create mode 100644 inc/MSP430FR5972.inc create mode 100644 inc/MSP430FR5972.pat create mode 100644 inc/MSP_EXP430FR5972.asm create mode 100644 inc/MSP_EXP430FR5972.pat diff --git a/ADDON/CORE_ANS.asm b/ADDON/CORE_ANS.asm index 8c6285f..d311d55 100644 --- a/ADDON/CORE_ANS.asm +++ b/ADDON/CORE_ANS.asm @@ -1,22 +1,4 @@ ; -*- 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> -; -; 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 . - FORTHWORD "{CORE_ANS}" MOV @IP+,PC @@ -570,9 +552,9 @@ PAD CALL rDOCON MOV @RSP+,IP BIT #UF9,SR ; see TO JNZ VALUENEXT - MOV @TOS,TOS ; execute @ + MOV @TOS,TOS ; execute Fetch MOV @IP+,PC VALUENEXT BIC #UF9,SR ; clear 'TO' flag - MOV @PSP+,0(TOS) ; 4 execute '!' + MOV @PSP+,0(TOS) ; 4 execute Store MOV @PSP+,TOS ; 2 MOV @IP+,PC ; 4 diff --git a/ADDON/FixPoint.asm b/ADDON/FixPoint.asm index 5d96f57..7f69be9 100644 --- a/ADDON/FixPoint.asm +++ b/ADDON/FixPoint.asm @@ -1,21 +1,4 @@ ; -*- 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> -; -; 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 . FORTHWORD "{FIXPOINT}" MOV @IP+,PC diff --git a/ADDON/SD_TOOLS.asm b/ADDON/SD_TOOLS.asm index c28751c..bb01c09 100644 --- a/ADDON/SD_TOOLS.asm +++ b/ADDON/SD_TOOLS.asm @@ -1,22 +1,4 @@ ; -*- 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> -; -; 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 . - .IFNDEF MAX @@ -158,7 +140,7 @@ DUMP4 .word II,CFETCH ; read logical sector and dump it ; ----------------------------------; - FORTHWORD "SECTOR" ; 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) ; ----------------------------------; SECTOR MOV TOS,X ; X = SectorH MOV @PSP,W ; W = sectorL @@ -176,7 +158,7 @@ DisplaySector ; ----------------------------------; ; read first sector of Cluster and dump it ; ----------------------------------; - FORTHWORD "CLUSTER" ; cluster. -- don't forget to add decimal point to your sector number (if < 65536) + FORTHWORD "CLUSTR." ; cluster. -- don't forget to add decimal point to your sector number (if < 65536) ; ----------------------------------; CLUSTER BIT.B #CD_SD,&SD_CDIN ; test Card Detect: memory card present ? JZ CD_CLUST_OK ; diff --git a/ADDON/UTILITY.asm b/ADDON/UTILITY.asm index 7ec6f21..2e0c5e9 100644 --- a/ADDON/UTILITY.asm +++ b/ADDON/UTILITY.asm @@ -1,22 +1,4 @@ ; -*- 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> -; -; 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 . - FORTHWORD "{TOOLS}" MOV @IP+,PC diff --git a/FastForth.pdf b/FastForth.pdf index b8d98fb50708a264a518d0f6cca5f46f913a296a..6ee8457619fed8b98ce22e46ce2576050dcd56d4 100644 GIT binary patch literal 113033 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%0A%^X>PYn?`e;Vg_n2bCC%(y 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
f3Zvm5_t73;9BzPLmi!zHM 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%0D=<>YAGxb>%kue4SzR-mp6oJ?(N)Wv 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 MXB<8al*YCTc1e2b_IYyU{x+%HMTT$r= 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 FIND WORD ." S" . -U. SIGN HOLD #> #S # <# CR -TYPE NOECHO ECHO EMIT KEY ACCEPT - -COLD Software reset - -WARM DEFERed word, by default executes ABORT" " - -WIPE resets the program memory to its original state (Deep_RST adds same effect to COLD). +RST_HERE PWR_HERE RST_STATE PWR_STATE CREATE ; : IMMEDIATE +POSTPONE ] [ \ ' ['] ABORT" INTERPRET +COUNT LITERAL ALLOT , >NUMBER FIND WORD ." +S" . U. SIGN HOLD #> #S # +<# ! @ CR TYPE NOECHO ECHO EMIT +KEY ACCEPT COLD WARM WIPE 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 and also against any error occurring. - RST_STATE removes all words defined after RST_HERE (COLD or have same effet) - PWR_STATE removes all words defined after PWR_HERE (an error has same effect) - -?ID %deviceID% ?ID -- - String sent by Teraterm to target before downloading a file.4TH issued from a source file.f. - ?ID compare %deviceID% with target's value then performs ABORT" DeviceID mismatch!". - -TREAT text interpreter, common part of EVALUATE and QUIT. - +INTERPRET text interpreter, common part of EVALUATE and QUIT. NOECHO stop display on output - ECHO start display on output - CREATE https://forth-standard.org/standard/core/CREATE ; https://forth-standard.org/standard/core/Semi : https://forth-standard.org/standard/core/Colon @@ -57,10 +40,9 @@ POSTPONE https://forth-standard.org/standard/core/POSTPONE ['] https://forth-standard.org/standard/core/BracketTick ' https://forth-standard.org/standard/core/Tick ABORT" https://forth-standard.org/standard/core/ABORTq -ABORT https://forth-standard.org/standard/core/ABORT -QUIT https://forth-standard.org/standard/core/QUIT COUNT https://forth-standard.org/standard/core/COUNT LITERAL https://forth-standard.org/standard/core/LITERAL +ALLOT https://forth-standard.org/standard/core/ALLOT , https://forth-standard.org/standard/core/Comma >NUMBER https://forth-standard.org/standard/core/toNUMBER FIND https://forth-standard.org/standard/core/FIND @@ -75,46 +57,95 @@ HOLD https://forth-standard.org/standard/core/HOLD #S https://forth-standard.org/standard/core/numS # https://forth-standard.org/standard/core/num <# https://forth-standard.org/standard/core/num-start -TYPE https://forth-standard.org/standard/core/TYPE +! https://forth-standard.org/standard/core/Store +@ https://forth-standard.org/standard/core/Fetch CR DEFERed word, https://forth-standard.org/standard/core/CR +TYPE https://forth-standard.org/standard/core/TYPE EMIT DEFERed word, https://forth-standard.org/standard/core/EMIT KEY DEFERed word, https://forth-standard.org/standard/core/KEY ACCEPT DEFERed word, https://forth-standard.org/standard/core/ACCEPT +COLD PFA of COLD content = STOP_APP subroutine address, by default --> STOP_TERM +WARM PFA of WARM content = INI_APP subroutine address, by default --> ENABLE_IO +WIPE resets the program memory to its original state (Deep_RST have same effect). + +words added by the option MSP430ASSEMBLER: + +ASM CODE HI2LO +CODE creates a word written in assembler. + this defined must be ended with ENDCODE unless COLON or LO2HI use. +ASM creates a word written in assembler but not interpretable by FORTH (because ended by RET instr.). + this defined must be ended with ENDASM. Visible only from assembler +HI2LO used to switch compilation from high level (FORTH) to low level (assembler). -ASSEMBLER vocabulary +Other words are useable via the preprocessor GEMA and they address is in \inc\device.pat file : + +SLEEP CODE_WITHOUT_RETURN: CPU shutdown +LIT CODE compiled by LITERAL +XSQUOTE CODE compiled by S" and S_ +HEREXEC CODE HERE and BEGIN execute address +QFBRAN CODE compiled by IF UNTIL +BRAN CODE compiled by ELSE REPEAT AGAIN +NEXT_ADR CODE NEXT instruction (MOV @IP+,PC) +XDO CODE compiled by DO +XPLOOP CODE compiled by +LOOP +XLOOP CODE compiled by LOOP +MUSMOD ASM 32/16 unsigned division, used by ?NUMBER, UM/MOD +MDIV1DIV2 ASM input for 48/16 unsigned division with DVDhi=0, see DOUBLE M*/ +MDIV1 ASM input for 48/16 unsigned division, see DOUBLE M*/ +RET_ADR ASM content of INI_FORTH_PFA and MARKER+8 definitions, +SETIB CODE Set Input Buffer with org & len values, reset >IN pointer +REFILL CODE accept one line from input and leave org len of input buffer +CIB_ADR [CIB_ADR] = TIB_ORG by default; may be redirected to SDIB_ORG +XDODOES restore rDODOES: MOV #XDODOES,rDODOES +XDOCON restore rDOCON: MOV #XDOCON,rDOCON +XDOVAR restore rDOVAR: MOV #XDOVAR,rDOVAR +!to find DTC value, download \MSP430-FORTH\FF_SPECS.4th +!XDOCOL if DTC = 1, restore rDOCOL as this: MOV #TYPE+-16,rDOCOL +!XDOCOL if DTC = 2, restore rDOCOL as this: MOV ##S+16,rDOCOL +! if DTC = 3, nothing to do, R7 is free for use. +INI_FORTH CODE_WITHOUT_RETURN common part of RST and QABORT, starts FORTH engine +QABORT CODE_WITHOUT_RETURN run-time part of ABORT" +3DROP CODE +ABORT_TERM CODE_WITHOUT_RETURN called by QREVEAL and INTERPRET +!------------------------------------------------------------------------------- +UART_COLD_TERM ASM, content of COLD_PFA by default +UART_INIT_TERM ASM, content of WARM_PFA by default +UART_RXON ASM, content of SLEEP_PFA by default +UART_RXOFF ASM, called by ACCEPT before RX char LF. +!------------------------------------------------------------------------------- +I2C_COLD_TERM ASM, content of COLD_PFA by default +I2C_INIT_TERM ASM, content of WARM_PFA by default +I2C_RXON ASM, content of SLEEP_PFA by default +I2C_CTRL_CH ASM, used as is: MOV.B #CTRL_CHAR,Y +! CALL #I2C_CTRL_CH +!------------------------------------------------------------------------------- + +MSP430ASSEMBLER word-set -------------------- ?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 - -ASM CODE HI2LO (added in forth vocabulary) +BW1 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 see: http://www.ece.utep.edu/courses/web3376/Notes_files/ee3376-isa.pdf readme.md for symbolic alias of registers, symbolic jumps (IF ELSE THEN...),.. ?GOTO used after a conditionnal (0=,0<>,U>=,U<,0<,S<,S>=) to branch to a label FWx or BWx GOTO used as unconditionnal branch to a label FWx or BWx - -BW3 BACKWARD branch destination n°3 -BW2 n°2 -BW1 N°1 - -FW3 FORWARD branch destination n°3 -FW2 n°2 -FW1 n°1 - -?JMP used after a conditionnal (0=,0<>,U>=,U<,0<,S<,S>=) to jump to a predefined word -JMP unconditionnal jump to a predefined word - +BW3 BACKWARD branch destination n°3 +BW2 n°2 +BW1 n°1 +FW3 FORWARD branch destination n°3 +FW2 n°2 +FW1 n°1 REPEAT assembler version of the FORTH word REPEAT WHILE idem AGAIN idem @@ -122,35 +153,18 @@ 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 ?GOTO 0>= conditionnal, to use only with IF UNTIL WHILE S< conditionnal S>= conditionnal - LO2HI switches compilation between low level and high level modes without saving IP register. COLON pushes IP then performs LO2HI, used as: CODE ... assembler instr ... COLON ... FORTH words ... ; ENDASM to end an ASM definition. ENDCODE to end a CODE definition. -SLEEP DEFERed word which enables to create a background task, default SLEEP definition: MOV #GIE+LPM0,SR - -next assembler words are set in FORTH vocabulary: - -CODE creates a word written in assembler. - this defined must be ended with ENDCODE unless COLON or LO2HI use. - -ASM creates a word written in assembler but not interpretable by FORTH (because ended by RET instr.). - this defined must be ended with ENDASM. - This word will be recognized only in assembler mode. - -HI2LO used to switch compilation from high level (FORTH) to low level (assembler). - - -ASSEMBLER WORDS set: ADD http://www.ti.com/lit/ug/slau272d/slau272d.pdf#page=135 ADDC http://www.ti.com/lit/ug/slau272d/slau272d.pdf#page=136 @@ -179,7 +193,17 @@ RRCM http://www.ti.com/lit/ug/slau272d/slau272d.pdf#page=214 POPM http://www.ti.com/lit/ug/slau272d/slau272d.pdf#page=204 PUSHM http://www.ti.com/lit/ug/slau272d/slau272d.pdf#page=205 -ASSEMBLER_EXTENDED WORDS set: +EXTENDED_MEM WORDS set: + +POPM.A http://www.ti.com/lit/ug/slau272d/slau272d.pdf#page=204 +PUSHM.A http://www.ti.com/lit/ug/slau272d/slau272d.pdf#page=205 +ADDA http://www.ti.com/lit/ug/slau272d/slau272d.pdf#page=229 +CALLA http://www.ti.com/lit/ug/slau272d/slau272d.pdf#page=232 +CMPA http://www.ti.com/lit/ug/slau272d/slau272d.pdf#page=235 +MOVA http://www.ti.com/lit/ug/slau272d/slau272d.pdf#page=238 +SUBA http://www.ti.com/lit/ug/slau272d/slau272d.pdf#page=241 + +EXTENDED_ASM WORDS set: ADDX http://www.ti.com/lit/ug/slau272d/slau272d.pdf#page=187 ADDCX http://www.ti.com/lit/ug/slau272d/slau272d.pdf#page=188 @@ -200,12 +224,6 @@ SWPBX http://www.ti.com/lit/ug/slau272d/slau272d.pdf#page=223 SXTX http://www.ti.com/lit/ug/slau272d/slau272d.pdf#page=225 XORX http://www.ti.com/lit/ug/slau272d/slau272d.pdf#page=227 -ADDA http://www.ti.com/lit/ug/slau272d/slau272d.pdf#page=229 -CALLA http://www.ti.com/lit/ug/slau272d/slau272d.pdf#page=232 -CMPA http://www.ti.com/lit/ug/slau272d/slau272d.pdf#page=235 -MOVA http://www.ti.com/lit/ug/slau272d/slau272d.pdf#page=238 -SUBA http://www.ti.com/lit/ug/slau272d/slau272d.pdf#page=241 - RPT http://www.ti.com/lit/ug/slau272d/slau272d.pdf#page=219 CONDCOMP ADD-ON @@ -295,8 +313,7 @@ I +LOOP LOOP DO REPEAT UNTIL ELSE THEN IF > < U< = 0< 0= C, C! C@ R> >R NIP DROP SWAP DEPTH EXIT ?DUP -DUP ! @ - + DOES> BEGIN -{CORE_COMP} +DUP - + DOES> BEGIN {CORE_COMP} VALUE https://forth-standard.org/standard/core/VALUE TO https://forth-standard.org/standard/core/TO @@ -320,7 +337,6 @@ EXECUTE https://forth-standard.org/standard/core/EXECUTE ( https://forth-standard.org/standard/core/p DECIMAL https://forth-standard.org/standard/core/DECIMAL HEX https://forth-standard.org/standard/core/HEX -ALLOT https://forth-standard.org/standard/core/ALLOT HERE https://forth-standard.org/standard/core/HERE FILL https://forth-standard.org/standard/core/FILL MOVE https://forth-standard.org/standard/core/MOVE @@ -400,8 +416,6 @@ DEPTH https://forth-standard.org/standard/core/DEPTH EXIT https://forth-standard.org/standard/core/EXIT ?DUP https://forth-standard.org/standard/core/qDUP DUP https://forth-standard.org/standard/core/DUP -! https://forth-standard.org/standard/core/Store -@ https://forth-standard.org/standard/core/Fetch - https://forth-standard.org/standard/core/Minus + https://forth-standard.org/standard/core/Plus {CORE_COMP} @@ -441,7 +455,7 @@ D. https://forth-standard.org/standard/double/Dd 2R> https://forth-standard.org/standard/core/TwoRfrom 2R@ https://forth-standard.org/standard/core/TwoRFetch 2>R https://forth-standard.org/standard/core/TwotoR -{DOUBLE} +{DOUBLE} if you type {DOUBLE}, it and all subsequent words are removed FIXPOINT ADD-ON @@ -459,7 +473,7 @@ F/ s15.16 division F- s15.16 soustraction F+ s15.16 addition HOLDS https://forth-standard.org/standard/core/HOLDS -{FIXPOINT} do nothing if compiled in core, else remove all FIXPOINT add-on. +{FIXPOINT} do nothing if compiled in core, else it and all subsequent loaded words are removed UTILITY ADD-ON -------------- @@ -484,6 +498,6 @@ DIR dump first sector of current directory FAT dump first sector of FAT1 CLUSTER .123 CLUSTER displays first sector of cluster 123 SECTOR .123456789 SECTOR displays sector 123456789 -{SD_TOOLS} if you type {SD_TOOLS} all subsequent loaded words are removed +{SD_TOOLS} if you type {SD_TOOLS}, it and all subsequent words are removed diff --git a/FastForth_at_work.pdf b/FastForth_at_work.pdf index 861e198e760a744c4667b9e0c4322cd2a9ce8334..fc3f946ded5d5570870f27a6cf9416fea92ce8e7 100644 GIT binary patch delta 15029 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�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 delta 15174 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 diff --git a/MSP430-FORTH/BOOT.4th b/MSP430-FORTH/BOOT.4th index 89a2804..578ce46 100644 --- a/MSP430-FORTH/BOOT.4th +++ b/MSP430-FORTH/BOOT.4th @@ -61,6 +61,20 @@ \ -------------------------------------------------------------------------------- +[UNDEFINED] = [IF] +\ https://forth-standard.org/standard/core/Equal +\ = x1 x2 -- flag test x1=x2 +CODE = +SUB @PSP+,TOS \ 2 +0<> IF \ 2 + AND #0,TOS \ 1 + MOV @IP+,PC \ 4 +THEN +XOR #-1,TOS \ 1 flag Z = 1 +MOV @IP+,PC \ 4 +ENDCODE +[THEN] + \ it's an example: $04 = [IF] \ if origin of SYSRST is diff --git a/MSP430-FORTH/CHNGBAUD.f b/MSP430-FORTH/CHNGBAUD.f index 7272f12..8880529 100644 --- a/MSP430-FORTH/CHNGBAUD.f +++ b/MSP430-FORTH/CHNGBAUD.f @@ -1,8 +1,4 @@ \ -*- coding: utf-8 -*- - -; ------------ -; CHNGBAUD.f -; ------------ \ \ TARGET SELECTION ( = the name of \INC\target.pat file without the extension) \ MSP_EXP430FR5739 MSP_EXP430FR5969 MSP_EXP430FR5994 MSP_EXP430FR6989 @@ -18,42 +14,27 @@ \ \ COLD \ uncomment for this TEST which must not disrupt the downloading process -[UNDEFINED] @ [IF] -\ https://forth-standard.org/standard/core/Fetch -\ @ c-addr -- char fetch char from memory -CODE @ -MOV @TOS,TOS -MOV @IP+,PC -ENDCODE -[THEN] - -[UNDEFINED] AND [IF] -\ https://forth-standard.org/standard/core/AND -\ C AND x1 x2 -- x3 logical AND -CODE AND -AND @PSP+,TOS -MOV @IP+,PC -ENDCODE -[THEN] - -[UNDEFINED] 0= [IF] -\ https://forth-standard.org/standard/core/ZeroEqual -\ 0= n/u -- flag return true if TOS=0 -CODE 0= -SUB #1,TOS \ borrow (clear cy) if TOS was 0 -SUBC TOS,TOS \ TOS=-1 if borrow was set -MOV @IP+,PC -ENDCODE -[THEN] - -: I2CTERM_ABORT -$0D EMIT \ return to column 1 -1 ABORT" <-- Ouch! unexpected target with I2C TERMINAL" +CODE I2CTERM_ABORT +SUB #4,PSP +MOV TOS,2(PSP) +MOV &KERNEL_ADDON,TOS +BIT #$7800,TOS +0<> IF MOV #0,TOS THEN \ if TOS <> 0 (UART TERMINAL), set TOS = 0 +MOV TOS,0(PSP) +MOV &VERSION,TOS +SUB #307,TOS \ FastForth V3.7 +COLON +$0D EMIT \ return to column 1 without CR +ABORT" FastForth version = 3.7 please!" +ABORT" <-- Ouch! unexpected I2C_FastForth target!" +PWR_STATE \ remove ABORT_UARTI2CS definition before resuming ; -KERNEL_ADDON @ $7800 AND 0= [IF] ; unexpected I2C TERMINAL ? I2CTERM_ABORT -[THEN] + +; ------------ +; CHNGBAUD.f +; ------------ [UNDEFINED] DUP [IF] \ define DUP and DUP? \ https://forth-standard.org/standard/core/DUP @@ -93,25 +74,6 @@ MOV @IP+,PC ENDCODE [THEN] -[UNDEFINED] @ [IF] -\ https://forth-standard.org/standard/core/Fetch -\ @ c-addr -- char fetch char from memory -CODE @ -MOV @TOS,TOS -MOV @IP+,PC -ENDCODE -[THEN] - -[UNDEFINED] ! [IF] -\ https://forth-standard.org/standard/core/Store -\ ! x a-addr -- store cell in memory -CODE ! -MOV @PSP+,0(TOS) \ 4 -MOV @PSP+,TOS \ 2 -MOV @IP+,PC \ 4 -ENDCODE -[THEN] - [UNDEFINED] 1+ [IF] \ https://forth-standard.org/standard/core/OnePlus \ 1+ n1/u1 -- n2/u2 add 1 to TOS @@ -345,23 +307,25 @@ $20 DUP EMIT ESC [7m \ set reverse video : CHNGBAUD \ only for 1, 4, 8, 16, 24 MHz PWR_STATE \ removes this created word (garbage collector) ECHO -42 0 DO CR LOOP \ don't erase any line of source -ESC [H \ cursor home +ESC [8;42;128t \ set 42L * 128C terminal display +41 0 DO CR LOOP \ to avoid erasing any line of source, create 42-1 empty lines +ESC [H \ cursor home FREQ_KHZ @ DUP >R \ r-- target MCLCK frequency in MHz ." target MCLK = " 1000 U/ . ." MHz" CR ." choose your baudrate:" CR -." 0 --> 6 MBds" CR -." 1 --> 5 MBds" CR -." 2 --> 4 MBds" CR \ linux driver max speed -." 3 --> 2457600 Bds" CR -." 4 --> 921600 Bds" CR -." 5 --> 460800 Bds" CR -." 6 --> 230400 Bds" CR -." 7 --> 115200 Bds" CR -." 8 --> 38400 Bds" CR -." 9 --> 19200 Bds" CR -." A --> 9600 Bds" CR +." 0 --> 6 MBds" CR \ >= 24 MHz +." 1 --> 5 MBds" CR \ >= 20 MHz +." 2 --> 4 MBds" CR \ >= 16 MHz +." 3 --> 3 MBds" CR \ >= 12 MHz +." 4 --> 1843200 Bds" CR \ >= 8 MHz +." 5 --> 921600 Bds" CR \ >= 4 MHz +." 6 --> 460800 Bds" CR \ >= 2 MHz +." 7 --> 230400 Bds" CR \ >= 1 MHz +." 8 --> 115200 Bds" CR \ >= 500 kHz +." 9 --> 38400 Bds" CR +." A --> 19200 Bds" CR +." B --> 9600 Bds" CR ." other --> abort" CR ." your choice: " KEY @@ -379,74 +343,104 @@ CASE #49 OF ." 5 MBds" R> CASE #24000 OF $4 $EE00 ENDOF - #16000 OF $3 $2100 ENDOF - 16000 < - IF OVR_BAUDS \ < 16 MHz --> abort + #20000 OF $4 $0 ENDOF + 20000 < + IF OVR_BAUDS \ < 20 MHz --> abort THEN BAD_MHz \ other MHz --> abort ENDCASE ENDOF #50 OF ." 4 MBds" R> CASE #24000 OF $6 $0 ENDOF + #20000 OF $5 $0 ENDOF #16000 OF $4 $0 ENDOF 16000 < IF OVR_BAUDS \ < 16 MHz --> abort THEN BAD_MHz \ other MHz --> abort ENDCASE ENDOF -#51 OF ." 2457600 Bds" +#51 OF ." 3 MBds" R> CASE - #24000 OF $9 $DD00 ENDOF - #16000 OF $6 $AA00 ENDOF - #8000 OF $3 $4400 ENDOF + #24000 OF $8 $0 ENDOF + #20000 OF $6 $D600 ENDOF + #16000 OF $5 $4900 ENDOF + #12000 OF $4 $0 ENDOF + 12000 < + IF OVR_BAUDS \ < 12 MHz --> abort + THEN BAD_MHz \ other MHz --> abort + ENDCASE + ENDOF +#52 OF ." 1843200 Bds" + R> CASE + #24000 OF $0D $0200 ENDOF + #20000 OF $0A $DF00 ENDOF + #16000 OF $8 $D600 ENDOF + #12000 OF $6 $AA00 ENDOF + #8000 OF $5 $9200 ENDOF 8000 < IF OVR_BAUDS \ < 8 MHz --> abort THEN BAD_MHz \ other MHz --> abort ENDCASE ENDOF -#52 OF ." 921600 Bds" +#53 OF ." 921600 Bds" R> CASE - #24000 OF $1 $00A1 ENDOF - #16000 OF $11 $4A00 ENDOF - #8000 OF $8 $D600 ENDOF - #4000 OF $4 $4900 ENDOF + #24000 OF $1 $00A1 ENDOF + #20000 OF $1 $B751 ENDOF + #16000 OF $11 $4A00 ENDOF + #12000 OF $0D $0200 ENDOF + #8000 OF $8 $D600 ENDOF + #4000 OF $4 $4900 ENDOF 4000 < IF OVR_BAUDS \ < 4 MHz --> abort THEN BAD_MHz \ other MHz --> abort ENDCASE ENDOF -#53 OF ." 460800 Bds" +#54 OF ." 460800 Bds" R> CASE - #24000 OF $6 $0001 ENDOF - #16000 OF $2 $BB21 ENDOF - #8000 OF $11 $4A00 ENDOF - #4000 OF $8 $D600 ENDOF - 4000 < - IF OVR_BAUDS \ < 4 MHz --> abort + #24000 OF $3 $0241 ENDOF + #20000 OF $2 $92B1 ENDOF + #16000 OF $2 $BB21 ENDOF + #12000 OF $1 $00A1 ENDOF + #8000 OF $11 $4A00 ENDOF + #4000 OF $8 $D600 ENDOF + #2000 OF $4 $4900 ENDOF + 2000 < + IF OVR_BAUDS \ < 2 MHz --> abort THEN BAD_MHz \ other MHz --> abort ENDCASE ENDOF -#54 OF ." 230400 Bds" +#55 OF ." 230400 Bds" R> CASE - #24000 OF $3 $0241 ENDOF - #16000 OF $4 $5551 ENDOF - #8000 OF $2 $BB21 ENDOF - #4000 OF $11 $4A00 ENDOF - #1000 OF $4 $4900 ENDOF - BAD_MHz \ other MHz --> abort + #24000 OF $6 $2081 ENDOF + #20000 OF $5 $EE61 ENDOF + #16000 OF $4 $5551 ENDOF + #12000 OF $3 $0241 ENDOF + #8000 OF $2 $BB21 ENDOF + #4000 OF $11 $4A00 ENDOF + #2000 OF $8 $D600 ENDOF + #1000 OF $4 $4900 ENDOF + 1000 < + IF OVR_BAUDS \ < 1 MHz --> abort + THEN BAD_MHz \ other MHz --> abort ENDCASE ENDOF -#55 OF ." 115200 Bds" +#56 OF ." 115200 Bds" R> CASE - #24000 OF $0D $4901 ENDOF - #16000 OF $8 $F7A1 ENDOF - #8000 OF $4 $5551 ENDOF - #4000 OF $2 $BB21 ENDOF - #1000 OF $8 $D600 ENDOF - BAD_MHz \ other MHz --> abort + #24000 OF $0D $4901 ENDOF + #20000 OF $0A $AD01 ENDOF + #16000 OF $8 $F7A1 ENDOF + #12000 OF $6 $2081 ENDOF + #8000 OF $4 $5551 ENDOF + #4000 OF $2 $BB21 ENDOF + #2000 OF $11 $4A00 ENDOF + #1000 OF $8 $D600 ENDOF + #500 OF $4 $4900 ENDOF + 500 < + IF OVR_BAUDS \ < 500 Khz --> abort + THEN BAD_MHz \ other MHz --> abort ENDCASE ENDOF -#56 OF ." 38400 Bds" +#57 OF ." 38400 Bds" R> CASE #24000 OF $27 $0011 ENDOF #16000 OF $1A $D601 ENDOF @@ -456,7 +450,7 @@ CASE BAD_MHz \ other MHz --> abort ENDCASE ENDOF -#57 OF ." 19200 Bds" +#65 OF ." 19200 Bds" R> CASE #24000 OF $4E $0021 ENDOF #16000 OF $34 $4911 ENDOF @@ -466,7 +460,7 @@ CASE BAD_MHz \ other MHz --> abort ENDCASE ENDOF -#65 OF ." 9600 Bds" +#66 OF ." 9600 Bds" R> CASE #24000 OF $9C $0041 ENDOF #16000 OF $68 $D621 ENDOF @@ -476,7 +470,7 @@ CASE BAD_MHz \ other MHz --> abort ENDCASE ENDOF - ." abort" CR ABORT + ." abort" ABORT" " \ ABORT" displays nothing ENDCASE TERMMCTLW_RST ! \ set UCAxMCTLW value in FRAM TERMBRW_RST ! \ set UCAxBRW value in FRAM diff --git a/MSP430-FORTH/CORDIC.f b/MSP430-FORTH/CORDIC.f index 2013907..0ee4d3e 100644 --- a/MSP430-FORTH/CORDIC.f +++ b/MSP430-FORTH/CORDIC.f @@ -1,14 +1,6 @@ \ -*- coding: utf-8 -*- - -; ---------- -; CORDIC.f -; ---------- \ see CORDICforDummies.pdf \ -; ----------------------------------------------------------- -; requires FIXPOINT_INPUT kernel addon, see forthMSP430FR.asm -; ----------------------------------------------------------- -\ \ to see kernel options, download FastForthSpecs.f \ FastForth kernel options: MSP430ASSEMBLER, CONDCOMP, FIXPOINT_INPUT \ @@ -16,7 +8,7 @@ \ TARGET SELECTION ( = the name of \INC\target.pat file without the extension) \ LP_MSP430FR2476 \ MSP_EXP430FR5739 MSP_EXP430FR5969 MSP_EXP430FR5994 MSP_EXP430FR6989 -\ MSP_EXP430FR2433 MSP_EXP430FR2355 CHIPSTICK_FR2433 +\ MSP_EXP430FR2433 CHIPSTICK_FR2433 MSP_EXP430FR2355 \ \ from scite editor : copy your target selection in (shift+F8) parameter 1: \ @@ -42,7 +34,27 @@ \ ASSEMBLER conditionnal usage with IF UNTIL WHILE S< S>= U< U>= 0= 0<> 0>= \ ASSEMBLER conditionnal usage with ?JMP ?GOTO S< S>= U< U>= 0= 0<> 0< -PWR_STATE +CODE ABORT_CORDIC +SUB #4,PSP +MOV TOS,2(PSP) +MOV &KERNEL_ADDON,TOS +BIT #BIT10,TOS +0<> IF MOV #0,TOS THEN \ if TOS <> 0 (FIXPOINT input), set TOS = 0 +MOV TOS,0(PSP) +MOV &VERSION,TOS +SUB #307,TOS \ FastForth V3.7 +COLON +$0D EMIT \ return to column 1 without CR +ABORT" FastForth version = 3.7 please!" +ABORT" build FastForth with FIXPOINT_INPUT addon !" +PWR_STATE \ if no abort remove this word +; + +ABORT_CORDIC + +; ---------- +; CORDIC.f +; ---------- [DEFINED] {CORDIC} [IF] {CORDIC} [THEN] @@ -64,21 +76,21 @@ MARKER {CORDIC} \ CREATE T_ARCTAN \ ArcTan table -11520 , \ 256 * 45 -6801 , \ 256 * 26.565 -3593 , \ 256 * 14.036 -1824 , \ 256 * 7.125 -916 , \ 256 * 3.576 -458 , \ 256 * 1.790 -229 , \ 256 * 0.895 -115 , \ 256 * 0.448 -57 , \ 256 * 0.224 -29 , \ 256 * 0.112 -14 , \ 256 * 0.056 -7 , \ 256 * 0.028 -4 , \ 256 * 0.014 -2 , \ 256 * 0.007 -1 , \ 256 * 0.003 +12870 , \ 286 * 45 = +7598 , \ 286 * 26.565 = 7597,605 +4014 , \ 286 * 14.036 = 4014,366 +2038 , \ 286 * 7.125 = 2037,755 +1023 , \ 286 * 3.576 = 1022,832 +512 , \ 286 * 1.790 = 511,914 +256 , \ 286 * 0.895 = 256,020 +128 , \ 286 * 0.448 = 128,017 +64 , \ 286 * 0.224 = 64,010 +32 , \ 286 * 0.112 = 32,005 +16 , \ 286 * 0.056 = 16,0025 +8 , \ 286 * 0.028 = 8,00126 +4 , \ 286 * 0.014 = 4 +2 , \ 286 * 0.007 = 2 +1 , \ 286 * 0.003 = 1 CREATE T_SCALE \ 1/Gi table 46340 , \ = 65536 * cos(45) @@ -97,26 +109,6 @@ CREATE T_SCALE \ 1/Gi table 39797 , 39797 , -[UNDEFINED] @ [IF] -\ https://forth-standard.org/standard/core/Fetch -\ @ c-addr -- char fetch char from memory -CODE @ -MOV @TOS,TOS -MOV @IP+,PC -ENDCODE -[THEN] - -[UNDEFINED] R> [IF] -\ https://forth-standard.org/standard/core/Rfrom -\ R> -- x R: x -- pop from return stack ; CALL #RFROM performs DOVAR -CODE R> -SUB #2,PSP \ 1 -MOV TOS,0(PSP) \ 3 -MOV @RSP+,TOS \ 2 -MOV @IP+,PC \ 4 -ENDCODE -[THEN] - [UNDEFINED] = [IF] \ https://forth-standard.org/standard/core/Equal \ = x1 x2 -- flag test x1=x2 @@ -161,6 +153,17 @@ MOV @IP+,PC ENDCODE [THEN] +[UNDEFINED] R> [IF] +\ https://forth-standard.org/standard/core/Rfrom +\ R> -- x R: x -- pop from return stack ; CALL #RFROM performs DOVAR +CODE R> +SUB #2,PSP \ 1 +MOV TOS,0(PSP) \ 3 +MOV @RSP+,TOS \ 2 +MOV @IP+,PC \ 4 +ENDCODE +[THEN] + [UNDEFINED] HOLDS [IF] \ https://forth-standard.org/standard/core/HOLDS \ Adds the string represented by addr u to the pictured numeric output string @@ -216,53 +219,27 @@ U>= UNTIL POPM #3,IP \ S=Qhi, T=len ENDCODE [THEN] -ASM XSCALE \ X = X*Cordic_Gain -SUB #4,PSP -MOV TOS,2(PSP) -MOV X,0(PSP) \ 1st operand = X -MOV T_SCALE(W),TOS \ 3 2nd operand = CORDIC Gain * 65536 ; IS UNSIGNED! -\ https://forth-standard.org/standard/core/MTimes -\ M* n1 n2 -- dlo dhi signed 16*16->32 multiply -\ ----------------------------------------------- -\ CODE M* -\ ----------------------------------------------- -MOV @PSP,S \ S= n1 -CMP #0,S \ n1 > -1 ? -S< IF - XOR #-1,0(PSP) \ n1 --> u1 - ADD #1,0(PSP) \ -THEN -\ XOR TOS,S \ S contains sign of result -\ CMP #0,TOS \ n2 > -1 ? -\ S< IF -\ XOR #-1,TOS \ n2 --> u2 -\ ADD #1,TOS \ -\ THEN -\ PUSHM #2,IP \ UMSTAR use S,T,W,X,Y, we save IP,S -PUSHM #6,IP \ UMSTAR use S,T,W,X,Y, we save IP,S,T,W,X,Y -LO2HI \ -- ud1 u2 -UM* -HI2LO -\ POPM #2,IP \ pop S,IP -POPM #6,IP \ pop Y,X,W,T,S,IP -CMP #0,S \ sign of result > -1 ? -S< IF - XOR #-1,0(PSP) \ ud --> d - XOR #-1,TOS - ADD #1,0(PSP) - ADDC #0,TOS -THEN -\ MOV @IP+,PC -\ ENDCODE -\ ----------------------------------------------- -MOV TOS,X \ hi result --> X -ADD #2,PSP -MOV @PSP+,TOS \ restore data stack -MOV @RSP+,PC \ RET +ASM XSCALE \ X --> X*Cordic_Gain +\ T.I. UNSIGNED MULTIPLY SUBROUTINE: U1 x U2 -> Ud +\ https://forth-standard.org/standard/core/UMTimes +\ UM* u1 u2 -- ud unsigned 16x16->32 mult. + MOV T_SCALE(W),rDOCON \ rDOCON=MR, X=MDlo +UMSTAR1 MOV #0,Y \ 1 MDhi=0 + MOV #0,S \ 1 RES0=0 + MOV #0,T \ 1 RES1=0 + MOV #1,W \ 1 BIT TEST REGISTER +BEGIN BIT W,rDOCON \ 1 TEST ACTUAL BIT MRlo + 0<> IF ADD X,S \ 1 IF 1: ADD MDlo TO RES0 + ADDC Y,T \ 1 ADDC MDhi TO RES1 + THEN ADD X,X \ 1 (RLA LSBs) MDlo x 2 + ADDC Y,Y \ 1 (RLC MSBs) MDhi x 2 + ADD W,W \ 1 (RLA) NEXT BIT TO TEST +U>= UNTIL \ S = RESlo, T=REShi + MOV T,X \ 2 IF BIT IN CARRY: FINISHED 10~ loop + MOV #XDOCON,rDOCON \ restore rDOCON + MOV @RSP+,PC \ RET ENDASM - - [ELSE] ; hardware multiplier [UNDEFINED] F#S [IF] @@ -291,61 +268,34 @@ BEGIN MOV @PSP,&MPY \ Load 1st operand ENDCODE [THEN] -ASM XSCALE \ X = X*Cordic_Gain -MOV X,&MPY \ 3 Load 1st operand -MOV T_SCALE(W),&OP2 \ 3 CORDIC Gain * 65536 -MOV &RES1,X \ 3 hi result = hypothenuse -MOV @RSP+,PC \ RET +ASM XSCALE \ X = X*Cordic_Gain +MOV T_SCALE(W),&MPYS32L \ 3 CORDIC Gain * 65536 +MOV #0,&MPYS32H +MOV X,&OP2 \ 3 Load 1st operand +MOV &RES1,X \ 3 hi result +MOV @RSP+,PC \ RET ENDASM -[THEN] ; endcase of hardware multiplier - +[THEN] ; end of hardware multiplier -[UNDEFINED] F. [IF] -CODE F. \ display a Q15.16 number with 4/5/16 digits after comma -MOV TOS,S \ S = sign -MOV #4,T \ T = 4 preset 4 digits for base 16 and by default -MOV &BASEADR,W -CMP ##10,W -0= IF \ if base 10 - ADD #1,T \ T = 5 set 5 digits -ELSE - CMP #%10,W - 0= IF \ if base 2 - MOV #16,T \ T = 16 set 16 digits - THEN -THEN -PUSHM #3,IP \ R-- IP sign #digit -LO2HI - <# DABS \ -- uQlo uQhi R-- IP sign #digit - R> F#S \ -- uQhi 0 R-- IP sign - $2C HOLD \ $2C = char ',' - #S \ -- 0 0 - R> SIGN #> \ -- addr len R-- IP - TYPE $20 EMIT \ -- -; - -[THEN] - -CODE POL2REC \ u f -- X Y -\ input ; u = module {1000...16384}, f = angle (15Q16 number) in degrees {1,0...89,0} +CODE POL2REC \ u F -- X Y +\ input ; u = module {1000...16384}, F = angle (15Q16 number) in degrees {-89,9...89,9} \ output ; X Y -\ TOS = fhi, 0(PSP) = flo, 2(PSP) = u +\ TOS = Fhi, 0(PSP) = Flo, 2(PSP) = u PUSH IP \ save IP before use -MOV @PSP+,Y \ Y = flo -SWPB Y -AND #$00FF,Y -SWPB TOS -AND #$FF00,TOS -BIS Y,TOS \ -- module angle*256 +MOV @PSP+,&MPY32L \ multiply angle by 286 +MOV TOS,&MPY32H +MOV #286,&OP2 +MOV &RES0,Y +MOV &RES1,TOS \ -- module angle*286 \ ===================== \ CORDIC 16 bits engine \ ===================== MOV #-1,IP \ IP = i-1 MOV @PSP,X \ X = Xi MOV #0,Y \ Y = Yi - BEGIN \ i loops with init i = 0 - ADD #1,IP +BEGIN \ i loops with init i = -1 + ADD #1,IP \ i = i+1 MOV X,S \ S = Xi to be right shifted MOV Y,T \ T = Yi to be right shifted MOV #0,W \ @@ -369,8 +319,8 @@ FW1 CMP IP,W \ W = i ? THEN CMP #0,TOS \ if angle*256 = 0 quit loop 0<> WHILE \ search "Extended control-flow patterns" in https://forth-standard.org/standard/rationale - CMP #14,IP - 0= UNTIL + CMP #14,IP \ IP = size of ARC_TAN table ? +0= UNTIL THEN \ search "Extended control-flow patterns" in https://forth-standard.org/standard/rationale \ multiply cos by factor scale CALL #XSCALE @@ -389,7 +339,7 @@ ENDCODE \ -- cos sin \ REC2POL version with inputs scaling, to increase the accuracy of the angle: \ REC2POL X Y -- u f -\ input : X < 16384, |Y| < 16384 +\ input : X < 16384, Y < 16384 \ output ; u = hypothenuse, f = angle (15Q16 number) in degrees \ rounded hypothenuse, 1 mn accuracy angle CODE REC2POL \ X Y -- u f @@ -403,30 +353,39 @@ S< IF XOR #-1,T ADD #1,T THEN -\ 2- abort if null inputs -MOV #-1,TOS \ set TOS TRUE for the two ABORT" below +\ 2- calculate S = |X| MOV X,S -ADD T,S -0= IF - LO2HI - ABORT" null inputs" - HI2LO +CMP #0,S +S< IF + XOR #-1,S + ADD #1,S THEN -\ 3- select max of X,|Y| -CMP X,T -U< IF \ X > |Y| - MOV X,T +\ 3- abort if null inputs +MOV #-1,TOS \ set TOS TRUE for the two ABORT" below +CMP #0,X +0= IF + CMP #0,Y + 0= IF + LO2HI + ABORT" null inputs!" + HI2LO + THEN THEN -\ 4- abort if X or |Y| >= 16384 +\ 4- select max of |X|,|Y| +CMP S,T +U< IF \ |X| > |Y| + MOV S,T +THEN +\ 5- abort if |X| or |Y| >= 16384 CMP #16384,T U>= IF LO2HI - ABORT" x or |y| >= 16384" + ABORT" |x| or |y| >= 16384" HI2LO THEN -\ 5- multiply inputs by 2^n scale factor +\ 6- multiply inputs by 2^n scale factor MOV #1,S \ init scale factor -RLAM #3,T \ test bit 2^13 +RLAM #3,T \ test bit 2^13 of max(X,Y) GOTO FW1 BEGIN ADD X,X \ X=X*2 @@ -435,15 +394,15 @@ BEGIN ADD T,T \ to test next bit 2^(n-1) FW1 U>= UNTIL \ until carry set -\ 6- save IP and scale factor n +\ 7- save IP and scale factor n PUSHM #2,IP \ push IP,S \ ================== \ CORDIC engine \ ================== MOV #-1,IP \ IP = i-1, X = Xi, Y = Yi MOV #0,TOS \ init z=0 - BEGIN \ i loops with init: i = 0 - ADD #1,IP + BEGIN \ i loops with init: i = -1 + ADD #1,IP \ i = i+1 MOV X,S \ S = Xi to be right shifted MOV Y,T \ T = Yi to be right shifted MOV #0,W \ W = right shift loop count @@ -456,7 +415,7 @@ FW1 CMP IP,W \ W = i ? 0= UNTIL \ 6~ loop ADD W,W \ W = 2i = T_SCALE displacement CMP #0,Y \ Y sign ? - 0>= IF \ Y >= 0 : Rotate counter-clockwise + S>= IF \ Y >= 0 : Rotate counter-clockwise ADD T,X \ Xi+1 = Xi + ( Yi >> i) SUB S,Y \ Yi+1 = Yi - ( Xi >> i) ADD T_ARCTAN(W),TOS @@ -483,17 +442,57 @@ BEGIN \ 4~ loop FW1 RRA S \ shift right scale factor U>= UNTIL \ until carry set MOV X,0(PSP) -\ multiply z by 256 to display it as a Q15.16 number -MOV TOS,Y \ Y = future fractional part of f -SWPB TOS -AND #$00FF,TOS -SXT TOS \ integer part of f -SWPB Y -AND #$FF00,Y -SUB #2,PSP -MOV Y,0(PSP) \ fractional part of f + +\ divide z by 286 to display it as a Q15.16 number +SUB #4,PSP \ -- X * * Zhi +MOV TOS,rDOCON \ -- rDOCON as sign of QUOT +CMP #0,rDOCON +S< IF + XOR #-1,TOS + ADD #1,TOS +THEN +MOV #0,2(PSP) \ -- X Zlo * Zhi +MOV TOS,0(PSP) \ -- X Zlo Zhi Zhi +MOV #286,TOS \ -- X Zlo Zhi DIV +CALL #MUSMOD \ -- X rem QUOTlo QUOThi +MOV @PSP+,0(PSP) \ remove remainder +CMP #0,rDOCON +S< IF + XOR #-1,0(PSP) + XOR #-1,TOS + ADD #1,0(PSP) + ADDC #0,TOS +THEN +MOV #XDOCON,rDOCON MOV @IP+,PC -ENDCODE \ +ENDCODE + + +[UNDEFINED] F. [IF] +CODE F. \ display a Q15.16 number with 4/5/16 digits after comma +MOV TOS,S \ S = sign +MOV #4,T \ T = 4 preset 4 digits for base 16 and by default +MOV &BASEADR,W +CMP ##10,W +0= IF \ if base 10 + ADD #1,T \ T = 5 set 5 digits +ELSE + CMP #%10,W + 0= IF \ if base 2 + MOV #16,T \ T = 16 set 16 digits + THEN +THEN +PUSHM #3,IP \ R-- IP sign #digit +LO2HI + <# DABS \ -- uQlo uQhi R-- IP sign #digit + R> F#S \ -- uQhi 0 R-- IP sign + $2C HOLD \ $2C = char ',' + #S \ -- 0 0 + R> SIGN #> \ -- addr len R-- IP + TYPE $20 EMIT \ -- +; + +[THEN] PWR_HERE @@ -508,6 +507,8 @@ MOV @IP+,PC \ 4 ENDCODE [THEN] +ECHO + [UNDEFINED] ROT [IF] \ \ https://forth-standard.org/standard/core/ROT \ ROT x1 x2 x3 -- x2 x3 x1 @@ -520,62 +521,11 @@ MOV @IP+,PC ENDCODE [THEN] -[UNDEFINED] DO [IF] \ define DO LOOP +LOOP -\ https://forth-standard.org/standard/core/DO -\ DO -- DOadr L: -- 0 -CODE DO \ immediate -SUB #2,PSP \ -MOV TOS,0(PSP) \ -ADD #2,&DP \ make room to compile xdo -MOV &DP,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 -MOV @IP+,PC -ENDCODE IMMEDIATE - -\ https://forth-standard.org/standard/core/LOOP -\ LOOP DOadr -- L-- an an-1 .. a1 0 -CODE LOOP \ immediate - MOV #XLOOP,X -BW1 ADD #4,&DP \ make room to compile two words - MOV &DP,W - MOV X,-4(W) \ xloop --> HERE - MOV TOS,-2(W) \ DOadr --> HERE+2 -BEGIN \ resolve all "leave" adr - MOV &LEAVEPTR,TOS \ -- Adr of top LeaveStack cell - SUB #2,&LEAVEPTR \ -- - MOV @TOS,TOS \ -- first LeaveStack value - CMP #0,TOS \ -- = value left by DO ? -0<> WHILE - MOV W,0(TOS) \ move adr after loop as UNLOOP adr -REPEAT - MOV @PSP+,TOS - MOV @IP+,PC -ENDCODE IMMEDIATE - -\ https://forth-standard.org/standard/core/PlusLOOP -\ +LOOP adrs -- L-- an an-1 .. a1 0 -CODE +LOOP \ immediate -MOV #XPLOOP,X -GOTO BW1 -ENDCODE IMMEDIATE -[THEN] - -: 1000CORDIC -500 0 DO - POL2REC REC2POL \ 2 CORDIC op. * 500 loops = 1000 CORDIC -LOOP -; - -ECHO - ; ----------------------------------------------------------- ; requires FIXPOINT_INPUT kernel addon, see forthMSP430FR.asm ; ----------------------------------------------------------- -\ + 10000 89,0 POL2REC . . ; sin, cos --> 10000 75,0 POL2REC . . ; sin, cos --> 10000 60,0 POL2REC . . ; sin, cos --> @@ -587,6 +537,45 @@ ECHO 16384 30,0 POL2REC SWAP . . ; x, y --> 16384 45,0 POL2REC SWAP . . ; x, y --> 16384 60,0 POL2REC SWAP . . ; x, y --> + +\ +10000 -89,0 POL2REC . . ; sin, cos --> +10000 -75,0 POL2REC . . ; sin, cos --> +10000 -60,0 POL2REC . . ; sin, cos --> +10000 -45,0 POL2REC . . ; sin, cos --> +10000 -30,0 POL2REC . . ; sin, cos --> +10000 -15,0 POL2REC . . ; sin, cos --> +10000 -1,0 POL2REC . . ; sin, cos --> +\ module phase -- X Y +16384 -30,0 POL2REC SWAP . . ; x, y --> +16384 -45,0 POL2REC SWAP . . ; x, y --> +16384 -60,0 POL2REC SWAP . . ; x, y --> + +\ +-10000 89,0 POL2REC . . ; sin, cos --> +-10000 75,0 POL2REC . . ; sin, cos --> +-10000 60,0 POL2REC . . ; sin, cos --> +-10000 45,0 POL2REC . . ; sin, cos --> +-10000 30,0 POL2REC . . ; sin, cos --> +-10000 15,0 POL2REC . . ; sin, cos --> +-10000 1,0 POL2REC . . ; sin, cos --> +\ module phase -- X Y +-16384 30,0 POL2REC SWAP . . ; x, y --> +-16384 45,0 POL2REC SWAP . . ; x, y --> +-16384 60,0 POL2REC SWAP . . ; x, y --> +\ + +-10000 -89,0 POL2REC . . ; sin, cos --> +-10000 -75,0 POL2REC . . ; sin, cos --> +-10000 -60,0 POL2REC . . ; sin, cos --> +-10000 -45,0 POL2REC . . ; sin, cos --> +-10000 -30,0 POL2REC . . ; sin, cos --> +-10000 -15,0 POL2REC . . ; sin, cos --> +-10000 -1,0 POL2REC . . ; sin, cos --> +\ module phase -- X Y +-16384 -30,0 POL2REC SWAP . . ; x, y --> +-16384 -45,0 POL2REC SWAP . . ; x, y --> +-16384 -60,0 POL2REC SWAP . . ; x, y --> \ @@ -605,6 +594,20 @@ ECHO \ 16384 -8192 REC2POL F. . ; --> abort \ 0 0 REC2POL F. . ; --> abort +-2 1 REC2POL F. . ; phase module --> +-2 -1 REC2POL F. . ; phase module --> +-20 10 REC2POL F. . ; phase module --> +-20 -10 REC2POL F. . ; phase module --> +-200 100 REC2POL F. . ; phase module --> +-100 -100 REC2POL F. . ; phase module --> +-2000 1000 REC2POL F. . ; phase module --> +-1000 -1000 REC2POL F. . ; phase module --> +-16000 8000 REC2POL F. . ; phase module --> +-16000 -8000 REC2POL F. . ; phase module --> +16000 0 REC2POL F. . ; phase module --> +0 16000 REC2POL F. . ; phase module --> +\ 16384 -8192 REC2POL F. . ; --> abort +\ 0 0 REC2POL F. . ; --> abort 10000 89,0 POL2REC REC2POL ROT . F. 10000 75,0 POL2REC REC2POL ROT . F. @@ -617,15 +620,4 @@ ECHO 10000 7,125 POL2REC REC2POL ROT . F. 10000 1,0 POL2REC REC2POL ROT . F. -10000 89,0 1000CORDIC ROT . F. -10000 75,0 1000CORDIC ROT . F. -10000 60,0 1000CORDIC ROT . F. -10000 45,0 1000CORDIC ROT . F. -10000 30,0 1000CORDIC ROT . F. -10000 26,565 1000CORDIC ROT . F. -10000 15,0 1000CORDIC ROT . F. -10000 14,036 1000CORDIC ROT . F. -10000 7,125 1000CORDIC ROT . F. -10000 1,0 1000CORDIC ROT . F. - -PWR_STATE \ remove tests + diff --git a/MSP430-FORTH/CORETEST.4TH b/MSP430-FORTH/CORETEST.4TH index 89b63ab..ce4261b 100644 --- a/MSP430-FORTH/CORETEST.4TH +++ b/MSP430-FORTH/CORETEST.4TH @@ -3,19 +3,18 @@ ; CORETEST.4TH for any FastForth target ; ------------------------------------- -: COMPNOTFOUND +: ABORT_TEST $0D EMIT \ return to column 1 -1 ABORT" {CORE_ANS} word set not found!" +ABORT" {CORE_ANS} word set not found !" ; -[UNDEFINED] {CORE_ANS} [IF] ; {CORE_ANS} is not found ? -COMPNOTFOUND -[THEN] +[UNDEFINED] {CORE_ANS} +ABORT_TEST : CORETESTSUCCESS $0A BASE ! $0D EMIT \ return to column 1 -1 ABORT" CORE tests success!" +1 ABORT" CORE tests success!" \ that remove all test words ; \ From: John Hayes S1I @@ -1073,9 +1072,8 @@ CREATE ABUF 80 CHARS ALLOT : ACCEPT-TEST CR ." PLEASE TYPE UP TO 80 CHARACTERS: " ABUF 80 \ ACCEPT \ JMT -['] ACCEPT DUP @ $4030 = \ JMT: if CFA content = $4030 (MOV @PC+,PC), ACCEPT is deferred -IF >BODY \ JMT: find default part of deferred ACCEPT -THEN EXECUTE \ JMT: execute ACCEPT + ['] ACCEPT >BODY \ JMT: find default part of deferred ACCEPT + EXECUTE \ JMT: execute ACCEPT CR ." RECEIVED: " [CHAR] " EMIT ABUF SWAP TYPE [CHAR] " EMIT CR ; @@ -1090,8 +1088,9 @@ T{ : GDX 123 ; : GDX GDX 234 ; -> }T T{ GDX -> 123 234 }T \ ------------------------------------------------------------------------ -TESTING TO VALUE +TESTING TO VALUE :NONAME IS DEFER +[DEFINED] VALUE [IF] T{ 111 VALUE v1 -> }T T{ -999 VALUE v2 -> }T T{ v1 -> 111 }T @@ -1100,13 +1099,30 @@ T{ 222 TO v1 -> }T T{ v1 -> 222 }T T{ : vd1 v1 ; -> }T T{ vd1 -> 222 }T - T{ : vd2 TO v2 ; -> }T T{ v2 -> -999 }T T{ -333 vd2 -> }T T{ v2 -> -333 }T T{ v1 -> 222 }T +[THEN] +[DEFINED] :NONAME [IF] +VARIABLE nn1 +VARIABLE nn2 +T{ :NONAME 1234 ; nn1 ! -> }T +T{ :NONAME 9876 ; nn2 ! -> }T +T{ nn1 @ EXECUTE -> 1234 }T +T{ nn2 @ EXECUTE -> 9876 }T +[THEN] + +[DEFINED] IS [IF] +T{ DEFER defer5 -> }T +T{ : is-defer5 IS defer5 ; -> }T +T{ ' * IS defer5 -> }T +T{ 2 3 defer5 -> 6 }T +T{ ' + is-defer5 -> }T +T{ 1 2 defer5 -> 3 }T +[THEN] CR .( End of Core word set tests) diff --git a/MSP430-FORTH/CORE_ANS.f b/MSP430-FORTH/CORE_ANS.f index e7a4399..f4a2a3f 100644 --- a/MSP430-FORTH/CORE_ANS.f +++ b/MSP430-FORTH/CORE_ANS.f @@ -1,10 +1,4 @@ \ -*- coding: utf-8 -*- - -; ----------------------------------------------------- -; CORE_ANS.f -; ----------------------------------------------------- -\ -; words complement to pass CORETEST.4TH \ \ FastForth kernel options: MSP430ASSEMBLER, CONDCOMP \ to see FastForth kernel options, download FF_SPECS.f @@ -21,6 +15,7 @@ \ drag and drop this file onto SendSourceFileToTarget.bat \ then select your TARGET when asked. \ +\ \ REGISTERS USAGE \ rDODOES to rEXIT must be saved before use and restored after \ scratch registers Y to S are free for use @@ -37,7 +32,24 @@ \ ASSEMBLER conditionnal usage with IF UNTIL WHILE S< S>= U< U>= 0= 0<> 0>= \ ASSEMBLER conditionnal usage with ?GOTO S< S>= U< U>= 0= 0<> 0< -PWR_STATE +CODE ABORT_CORE_ANS +SUB #2,PSP +MOV TOS,0(PSP) +MOV &VERSION,TOS +SUB #307,TOS \ FastForth V3.7 +COLON +$0D EMIT \ return to column 1 without CR +ABORT" FastForth version = 3.7 please!" +PWR_STATE \ remove ABORT_UARTI2CS before CORE_ANS downloading +; + +ABORT_CORE_ANS + +; --------------------------------- +; CORE_ANS.f +; --------------------------------- +\ +; words complement to pass CORETEST.4TH [DEFINED] {CORE_ANS} [IF] {CORE_ANS} [THEN] \ remove it if defined out of kernel @@ -65,25 +77,6 @@ MOV @IP+,PC ENDCODE [THEN] -[UNDEFINED] @ [IF] -\ https://forth-standard.org/standard/core/Fetch -\ @ c-addr -- char fetch char from memory -CODE @ -MOV @TOS,TOS -MOV @IP+,PC -ENDCODE -[THEN] - -[UNDEFINED] ! [IF] -\ https://forth-standard.org/standard/core/Store -\ ! x a-addr -- store cell in memory -CODE ! -MOV @PSP+,0(TOS) \ 4 -MOV @PSP+,TOS \ 2 -MOV @IP+,PC \ 4 -ENDCODE -[THEN] - [UNDEFINED] DUP [IF] \ https://forth-standard.org/standard/core/DUP \ DUP x -- x x duplicate top of stack @@ -108,7 +101,7 @@ ENDCODE CODE EXIT MOV @RSP+,IP \ 2 pop previous IP (or next PC) from return stack MOV @IP+,PC \ 4 = NEXT - \ 6 (ITC-2) +\ \ 6 (ITC-2) ENDCODE [THEN] @@ -346,7 +339,7 @@ ENDCODE IMMEDIATE \ https://forth-standard.org/standard/core/BEGIN \ BEGIN -- BEGINadr initialize backward branch CODE BEGIN - MOV #HEREADR,PC + MOV #HEREXEC,PC ENDCODE IMMEDIATE \ https://forth-standard.org/standard/core/UNTIL @@ -557,6 +550,28 @@ MOV @IP+,PC ENDCODE [THEN] +[UNDEFINED] NEGATE [IF] +\ https://forth-standard.org/standard/core/NEGATE +\ C NEGATE x1 -- x2 two's complement +CODE NEGATE +XOR #-1,TOS +ADD #1,TOS +MOV @IP+,PC +ENDCODE +[THEN] + +[UNDEFINED] ABS [IF] +\ https://forth-standard.org/standard/core/ABS +\ C ABS n1 -- +n2 absolute value +CODE ABS +CMP #0,TOS \ 1 +0>= IF + MOV @IP+,PC +THEN +MOV #NEGATE,PC +ENDCODE +[THEN] + [UNDEFINED] LSHIFT [IF] \ https://forth-standard.org/standard/core/LSHIFT \ LSHIFT x1 u -- x2 logical L shift u places @@ -631,44 +646,46 @@ ENDCODE \ -------------------- \ ARITHMETIC OPERATORS \ -------------------- -[UNDEFINED] M* [IF] - TLV_ORG 4 + @ $81F3 U< $81EF TLV_ORG 4 + @ U< = [IF] ; MSP430FR2xxx|MSP430FR4xxx subfamilies without hardware_MPY -\ https://forth-standard.org/standard/core/MTimes -\ M* n1 n2 -- dlo dhi signed 16*16->32 multiply -CODE M* -MOV @PSP,S \ S= n1 -CMP #0,S \ n1 > -1 ? -S< IF - XOR #-1,0(PSP) \ n1 --> u1 - ADD #1,0(PSP) \ -THEN -XOR TOS,S \ S contains sign of result -CMP #0,TOS \ n2 > -1 ? -S< IF - XOR #-1,TOS \ n2 --> u2 - ADD #1,TOS \ -THEN -PUSHM #2,IP \ UMSTAR use S,T,W,X,Y -LO2HI \ -- ud1 u2 -UM* -HI2LO -POPM #2,IP \ pop S,IP -CMP #0,S \ sign of result > -1 ? -S< IF - XOR #-1,0(PSP) \ ud --> d - XOR #-1,TOS - ADD #1,0(PSP) - ADDC #0,TOS -THEN -MOV @IP+,PC -ENDCODE + [UNDEFINED] M* [IF] + + \ https://forth-standard.org/standard/core/MTimes + \ M* n1 n2 -- dlo dhi signed 16*16->32 multiply + CODE M* + MOV @PSP,S \ S= n1 + CMP #0,S \ n1 > -1 ? + S< IF + XOR #-1,0(PSP) \ n1 --> u1 + ADD #1,0(PSP) \ + THEN + XOR TOS,S \ S contains sign of result + CMP #0,TOS \ n2 > -1 ? + S< IF + XOR #-1,TOS \ n2 --> u2 + ADD #1,TOS \ + THEN + PUSHM #2,IP \ UMSTAR use S,T,W,X,Y + LO2HI \ -- ud1 u2 + UM* + HI2LO + POPM #2,IP \ pop S,IP + CMP #0,S \ sign of result > -1 ? + S< IF + XOR #-1,0(PSP) \ ud --> d + XOR #-1,TOS + ADD #1,0(PSP) + ADDC #0,TOS + THEN + MOV @IP+,PC + ENDCODE + [THEN] [ELSE] ; MSP430FRxxxx with hardware_MPY +[UNDEFINED] UM* [IF] \ https://forth-standard.org/standard/core/UMTimes \ UM* u1 u2 -- udlo udhi unsigned 16x16->32 mult. CODE UM* @@ -678,17 +695,18 @@ BW1 MOV TOS,&OP2 \ Load 2nd operand MOV &RES1,TOS \ high result in TOS MOV @IP+,PC ENDCODE +[THEN] +[UNDEFINED] M* [IF] \ https://forth-standard.org/standard/core/MTimes \ M* n1 n2 -- dlo dhi signed 16*16->32 multiply CODE M* MOV @PSP,&MPYS \ Load 1st operand for signed multiplication GOTO BW1 ENDCODE - [THEN] -[THEN] +[THEN] \ endof hardware MPY [UNDEFINED] UM/MOD [IF] \ https://forth-standard.org/standard/core/UMDivMOD @@ -701,10 +719,10 @@ ENDCODE [UNDEFINED] SM/REM [IF] \ https://forth-standard.org/standard/core/SMDivREM -\ SM/REM DVDlo DVDhi DIVlo -- r3 q4 symmetric signed div +\ SM/REM DVDlo DVDhi DIV -- r3 q4 symmetric signed div CODE SM/REM -MOV TOS,S \ S=DIVlo -MOV @PSP,T \ T=DVD_sign==>rem_sign +MOV TOS,S \ S=DIV +MOV @PSP,T \ T=DVDhi CMP #0,TOS \ n2 >= 0 ? S< IF \ XOR #-1,TOS @@ -722,12 +740,12 @@ LO2HI UM/MOD \ -- uREMlo uQUOTlo HI2LO POPM #3,IP \ restore T,S,IP -CMP #0,T \ T=rem_sign +CMP #0,T \ T=DVDhi --> REM_sign S< IF XOR #-1,0(PSP) ADD #1,0(PSP) THEN -XOR S,T \ S=divisor T=quot_sign +XOR S,T \ S=DIV XOR T=DVDhi = Quot_sign CMP #0,T \ -- n3 u4 T=quot_sign S< IF XOR #-1,TOS @@ -737,28 +755,6 @@ MOV @IP+,PC ENDCODE [THEN] -[UNDEFINED] NEGATE [IF] -\ https://forth-standard.org/standard/core/NEGATE -\ C NEGATE x1 -- x2 two's complement -CODE NEGATE -XOR #-1,TOS -ADD #1,TOS -MOV @IP+,PC -ENDCODE -[THEN] - -[UNDEFINED] ABS [IF] -\ https://forth-standard.org/standard/core/ABS -\ C ABS n1 -- +n2 absolute value -CODE ABS -CMP #0,TOS \ 1 -0>= IF - MOV @IP+,PC -THEN -MOV #NEGATE,PC -ENDCODE -[THEN] - [UNDEFINED] FM/MOD [IF] \ https://forth-standard.org/standard/core/FMDivMOD \ FM/MOD d1 n1 -- r q floored signed div'n @@ -1039,7 +1035,7 @@ MOV @PSP+,X \ X = addr1 = src MOV @PSP+,TOS \ pop new TOS CMP #0,W \ count = 0 ? 0<> IF \ if 0, already done ! - CMP X,Y \ Y-X \ dst - src + CMP X,Y \ dst = src ? 0<> IF \ else already done ! U< IF \ U< if src > dst BEGIN \ copy W bytes @@ -1085,17 +1081,7 @@ ENDCODE [UNDEFINED] HERE [IF] CODE HERE -MOV #HEREADR,PC -ENDCODE -[THEN] - -[UNDEFINED] ALLOT [IF] -\ https://forth-standard.org/standard/core/ALLOT -\ ALLOT n -- allocate n bytes -CODE ALLOT -ADD TOS,&DP -MOV @PSP+,TOS -MOV @IP+,PC +MOV #HEREXEC,PC ENDCODE [THEN] @@ -1123,7 +1109,7 @@ ENDCODE \ https://forth-standard.org/standard/core/p \ ( -- skip input until char ) or EOL : ( -$29 WORD DROP +')' WORD DROP ; IMMEDIATE [THEN] @@ -1133,7 +1119,7 @@ $29 WORD DROP CODE .( \ " MOV #0,&CAPS \ CAPS OFF COLON -$29 WORD +')' WORD COUNT TYPE $20 CAPS ! \ CAPS ON ; IMMEDIATE @@ -1168,7 +1154,7 @@ MOV @X+,T \ 2 T = SOURCE_ORG MOV @X+,W \ 2 W = TOIN PUSHM #4,IP \ 6 PUSHM IP,S,T,W LO2HI -TREAT +INTERPRET HI2LO MOV @RSP+,&TOIN \ 4 MOV @RSP+,&SOURCE_ORG \ 4 @@ -1206,7 +1192,7 @@ ENDCODE \ DOES> -- set action for the latest CREATEd definition CODE DOES> MOV &LAST_CFA,W \ W = CFA of CREATEd word -MOV #DODOES,0(W) \ replace CFA (DOCON) by new CFA (DODOES) +MOV #$1285,0(W) \ replace CFA (CALL rDOCON) by new CFA (CALL rDODOES) MOV IP,2(W) \ replace PFA by the address after DOES> as execution address MOV @RSP+,IP MOV @IP+,PC @@ -1219,7 +1205,7 @@ ENDCODE : VARIABLE CREATE HI2LO -MOV #DOVAR,-4(W) \ CFA = DOVAR +MOV #$1287,-4(W) \ CFA = CALL rDOVAR MOV @RSP+,IP MOV @IP+,PC ENDCODE @@ -1272,7 +1258,7 @@ $20 CONSTANT BL \ https://forth-standard.org/standard/core/SPACE \ SPACE -- output a space : SPACE -$20 EMIT ; +'SP' EMIT ; [THEN] [UNDEFINED] SPACES [IF] @@ -1284,7 +1270,7 @@ CMP #0,TOS PUSH IP BEGIN LO2HI - $20 EMIT + 'SP' EMIT HI2LO SUB #2,IP SUB #1,TOS @@ -1322,13 +1308,13 @@ CREATE , DOES> HI2LO MOV @RSP+,IP -BIT #UF9,SR \ see TO -0= IF \ execute @ - MOV @TOS,TOS - MOV @IP+,PC +BIT #UF9,SR \ 2 see TO +0= IF \ 2 execute FETCH + MOV @TOS,TOS \ 2 + MOV @IP+,PC \ 4 THEN -BIC #UF9,SR \ clear 'TO' flag -MOV @PSP+,0(TOS) \ 4 execute '!' +BIC #UF9,SR \ 2 clear 'TO' flag +MOV @PSP+,0(TOS) \ 4 execute STORE MOV @PSP+,TOS \ 2 MOV @IP+,PC \ 4 ENDCODE @@ -1339,4 +1325,4 @@ RST_HERE [THEN] \ end of [UNDEFINED] {CORE_ANS} ECHO -; CORE_ANS.f loaded +; CORE_ANS.f is loaded diff --git a/MSP430-FORTH/DEEP_RST.f b/MSP430-FORTH/DEEP_RST.f deleted file mode 100644 index 9834377..0000000 --- a/MSP430-FORTH/DEEP_RST.f +++ /dev/null @@ -1,31 +0,0 @@ -\ -*- coding: utf-8 -*- - -; ------------ -; DEEP_RST.f -; ------------ - -; restore signatures and vectors area - -\ TARGET SELECTION ( = the name of \INC\target.pat file without the extension) -\ MSP_EXP430FR5739 MSP_EXP430FR5969 MSP_EXP430FR5994 MSP_EXP430FR6989 -\ MSP_EXP430FR2433 MSP_EXP430FR4133 MSP_EXP430FR2355 CHIPSTICK_FR2433 -\ LP_MSP430FR2476 -\ -\ from scite editor : copy your target selection in (shift+F8) parameter 1: -\ -\ OR -\ -\ drag and drop this file onto SendSourceFileToTarget.bat -\ then select your TARGET when asked. -\ -[UNDEFINED] ! [IF] -\ https://forth-standard.org/standard/core/Store -\ ! x a-addr -- store cell in memory -CODE ! -MOV @PSP+,0(TOS) \ 4 -MOV @PSP+,TOS \ 2 -MOV @IP+,PC \ 4 -ENDCODE -[THEN] - -ECHO -1 SAVE_SYSRSTIV ! COLD \ download to unlock JTAG and BSL, last chance... diff --git a/MSP430-FORTH/DOUBLE.f b/MSP430-FORTH/DOUBLE.f index 9e117a5..65560be 100644 --- a/MSP430-FORTH/DOUBLE.f +++ b/MSP430-FORTH/DOUBLE.f @@ -1,12 +1,4 @@ \ -*- coding: utf-8 -*- - -; ----------------------------------------------------- -; DOUBLE.f -; ----------------------------------------------------- - -; ----------------------------------------------------------- -; requires DOUBLE_INPUT kernel addon, see forthMSP430FR.asm -; ----------------------------------------------------------- \ \ to see kernel options, download FastForthSpecs.f \ FastForth kernel options: MSP430ASSEMBLER, CONDCOMP, DOUBLE_INPUT @@ -36,7 +28,27 @@ \ ASSEMBLER conditionnal usage with ?GOTO S< S>= U< U>= 0= 0<> 0< \ -PWR_STATE +CODE ABORT_DOUBLE +SUB #4,PSP +MOV TOS,2(PSP) +MOV &KERNEL_ADDON,TOS +BIT #BIT9,TOS +0<> IF MOV #0,TOS THEN \ if TOS <> 0 (DOUBLE input), set TOS = 0 +MOV TOS,0(PSP) +MOV &VERSION,TOS +SUB #307,TOS \ FastForth V3.7 +COLON +$0D EMIT \ return to column 1 without CR +ABORT" FastForth version = 3.7 please!" +ABORT" build FastForth with DOUBLE_INPUT addon !" +PWR_STATE \ if no abort remove this word +; + +ABORT_DOUBLE + +; ----------------------------------------------------- +; DOUBLE.f +; ----------------------------------------------------- [DEFINED] {DOUBLE} [IF] {DOUBLE} [THEN] @@ -197,7 +209,7 @@ ENDCODE IMMEDIATE [UNDEFINED] TO [IF] \ https://forth-standard.org/standard/core/TO CODE TO -BIS #UF10,SR +BIS #UF9,SR MOV @IP+,PC ENDCODE [THEN] @@ -231,7 +243,7 @@ CMP #0,TOS MOV @RSP+,IP THEN MOV @PSP+,TOS \ -- drop n -NEXT +MOV @IP+,PC ENDCODE [THEN] @@ -419,7 +431,7 @@ MOV #0,TOS \ 1 THEN THEN ADD #6,PSP \ 2 -NEXT \ 4 +MOV @IP+,PC \ 4 ENDCODE [THEN] @@ -439,7 +451,7 @@ THEN THEN THEN ADD #6,PSP \ 2 -NEXT \ 4 +MOV @IP+,PC \ 4 ENDCODE [THEN] @@ -459,7 +471,7 @@ THEN THEN THEN ADD #6,PSP \ 2 -NEXT \ 4 +MOV @IP+,PC \ 4 ENDCODE [THEN] @@ -468,7 +480,7 @@ ENDCODE CODE D+ BW1 ADD @PSP+,2(PSP) ADDC @PSP+,TOS -NEXT \ 4 +MOV @IP+,PC \ 4 ENDCODE [THEN] @@ -492,7 +504,7 @@ CODE D- SUB @PSP+,2(PSP) SUBC TOS,0(PSP) MOV @PSP+,TOS -NEXT \ 4 +MOV @IP+,PC \ 4 ENDCODE [THEN] @@ -503,7 +515,7 @@ XOR #-1,0(PSP) XOR #-1,TOS ADD #1,0(PSP) ADDC #0,TOS -NEXT \ 4 +MOV @IP+,PC \ 4 ENDCODE [THEN] @@ -524,7 +536,7 @@ ENDCODE CODE D2/ RRA TOS RRC 0(PSP) -NEXT \ 4 +MOV @IP+,PC \ 4 ENDCODE [THEN] @@ -533,7 +545,7 @@ ENDCODE CODE D2* ADD @PSP,0(PSP) ADDC TOS,TOS -NEXT \ 4 +MOV @IP+,PC \ 4 ENDCODE [THEN] @@ -559,7 +571,7 @@ ELSE 2>R 2DROP 2R> \ -- d1 d2 THEN \ -- d2 ; -DEVICEID C@ $EF > [IF] ; test tag value for MSP430FR413x devices without hardware_MPY +DEVICEID C@ $EF > [IF] ; test for MSP430FR413x devices without hardware_MPY [UNDEFINED] M*/ [IF] \ https://forth-standard.org/standard/double/MTimesDiv @@ -601,28 +613,49 @@ BEGIN BIT X,S \ 1 test actual bit in uMRlo ADDC rDODOES,rDODOES \ 1 (RLA LSBs) uMDlo *2 ADD X,X \ 1 (RLA) NEXT BIT TO TEST U>= UNTIL \ 1 IF BIT IN CARRY: FINISHED W=uREShi -MOV TOS,T \ T = +n2 -MOV @PSP,TOS \ -- uRESlo uRESmi uRESmi -MOV 2(PSP),S \ S=uRESlo, TOS=uRESmi, W=uREShi - -MOV #32,rDODOES \ 2 init loop count -CALL #MDIV1 \ -- urem ud2lo ud2hi -MOV @PSP+,0(PSP) \ -- d2lo d2hi -BIT #UF9,SR \ sign of RES is set ? -0<> IF \ DNEGATE +\ TOS +n2 +\ W REShi +\ 0(PSP) RESmi +\ 2(PSP) RESlo +MOV TOS,T +MOV @PSP,TOS +MOV 2(PSP),S +\ reg division output +\ -------------------------- +\ S = DVD(15-0) +\ TOS = DVD(31-16) +\ T = DIV(15-0) +\ W = 0|DVD(47-32) REM +\ X = 0 QUOTlo +\ Y = 0 QUOThi +\ rDODOES = count +\ 2(PSP) REM +\ 0(PSP) QUOTlo +\ TOS QUOThi +MOV #32,rDODOES \ 2 init loop count +CMP #0,W \ DVDhi = 0 ? +0= IF \ if yes + MOV TOS,W \ DVDmi --> DVDhi + CALL #MDIV1DIV2 \ with loop count / 2 +ELSE + CALL #MDIV1 \ -- urem ud2lo ud2hi +THEN +MOV @PSP+,0(PSP) \ -- ud2lo ud2hi +BIT #UF9,SR \ sign is set ? +0<> IF \ DNEGATE XOR #-1,0(PSP) XOR #-1,TOS ADD #1,0(PSP) ADDC #0,TOS - BIC #UF9,SR \ clear sign flag + BIC #UF9,SR \ clear sign flag \ now, make floored division, only used if rem<>0 and quot<0 : - CMP #0,W \ remainder <> 0 ? + CMP #0,W \ remainder <> 0 ? 0<> IF - SUB #1,0(PSP) \ decrement quotient + SUB #1,0(PSP) \ decrement quotient SUBC #0,TOS THEN THEN -NEXT \ 4 +MOV @IP+,PC \ 4 ENDCODE [THEN] @@ -648,10 +681,28 @@ S< IF \ DABS if yes ADD #1,S ADDC #0,TOS ADDC #0,W - BIS #UF9,SR \ set RES sign flag + BIS #UF9,SR \ set sign flag THEN +\ reg division output +\ -------------------------- +\ S = DVD(15-0) +\ TOS = DVD(31-16) +\ T = DIV(15-0) +\ W = 0|DVD(47-32) REM +\ X = 0 QUOTlo +\ Y = 0 QUOThi +\ rDODOES = count +\ 2(PSP) REM +\ 0(PSP) QUOTlo +\ TOS QUOThi MOV #32,rDODOES \ 2 init loop count -CALL #MDIV1 \ -- urem ud2lo ud2hi +CMP #0,W \ DVDhi = 0 ? +0= IF \ if yes + MOV TOS,W \ DVDmi --> DVDhi + CALL #MDIV1DIV2 \ with loop count / 2 +ELSE + CALL #MDIV1 \ -- urem ud2lo ud2hi +THEN MOV @PSP+,0(PSP) \ -- d2lo d2hi BIT #UF9,SR \ RES sign is set ? 0<> IF \ DNEGATE @@ -667,7 +718,7 @@ BIT #UF9,SR \ RES sign is set ? SUBC #0,TOS THEN THEN -NEXT \ 52 words +MOV @IP+,PC \ 52 words ENDCODE [THEN] @@ -701,12 +752,12 @@ CREATE , , \ compile Shi then Flo DOES> HI2LO MOV @RSP+,IP -BIT #UF9,SR \ see TO +BIT #UF9,SR \ flag set by TO 0= IF - MOV #2@,PC + MOV #2@,PC \ execute TwoFetch THEN -BIC #UF9,SR -MOV #2!,PC +BIC #UF9,SR \ clear flag +MOV #2!,PC \ execute TwoStore ENDCODE [THEN] @@ -731,11 +782,11 @@ R> OVER - SPACES TYPE RST_HERE -\ -------------------------------------------------------------------------------- -\ -------------------------------------------------------------------------------- +\ ------------------------------------------------------------------------------ +\ ------------------------------------------------------------------------------ \ Complement to test DOUBLE -\ -------------------------------------------------------------------------------- -\ -------------------------------------------------------------------------------- +\ ------------------------------------------------------------------------------ +\ ------------------------------------------------------------------------------ [UNDEFINED] VARIABLE [IF] \ https://forth-standard.org/standard/core/VARIABLE @@ -1120,7 +1171,7 @@ ENDCODE [UNDEFINED] HERE [IF] CODE HERE -MOV #HEREADR,PC +MOV #HEREXEC,PC ENDCODE [THEN] @@ -1226,20 +1277,20 @@ CREATE ACTUAL-RESULTS 20 CELLS ALLOT -1 CONSTANT 1S 0 CONSTANT -1 CONSTANT -0 INVERT 1 RSHIFT CONSTANT MAX-INT ; 011...1 -0 INVERT 1 RSHIFT INVERT CONSTANT MIN-INT ; 100...0 -MAX-INT 2/ CONSTANT HI-INT ; 001...1 -MIN-INT 2/ CONSTANT LO-INT ; 110...0 --1 MAX-INT 2CONSTANT MAX-2INT ; 011...1 -0 MIN-INT 2CONSTANT MIN-2INT ; 100...0 -MAX-2INT 2/ 2CONSTANT HI-2INT ; 001...1 -MIN-2INT 2/ 2CONSTANT LO-2INT ; 110...0 +0 INVERT 1 RSHIFT CONSTANT MAX-INT ; %011...1 +0 INVERT 1 RSHIFT INVERT CONSTANT MIN-INT ; %100...0 +MAX-INT 2/ CONSTANT HI-INT ; %001...1 +MIN-INT 2/ CONSTANT LO-INT ; %110...0 +-1 MAX-INT 2CONSTANT MAX-2INT ; %.011...1 +0 MIN-INT 2CONSTANT MIN-2INT ; %.100...0 +MAX-2INT 2/ 2CONSTANT HI-2INT ; %.001...1 +MIN-2INT 2/ 2CONSTANT LO-2INT ; %.110...0 ECHO -; -------------------------------------------------------------------------------- +; ----------------------------------------------------------------------------- ; DOUBLE tests -; -------------------------------------------------------------------------------- +; ----------------------------------------------------------------------------- \ MAX-INT . \ MIN-INT . @@ -1505,7 +1556,6 @@ T{ MIN-2INT 1 M+ -> MIN-2INT 1. D+ }T T{ LO-2INT -1 M+ -> LO-2INT -1. D+ }T \ M*/ --3 2 / . ; if floored you see -2 --> : ?floored [ -3 2 / -2 = ] LITERAL IF 1. D- THEN ; T{ 5. 7 11 M*/ -> 3. }T @@ -1514,8 +1564,8 @@ T{ -5. 7 11 M*/ -> -3. ?floored }T T{ -5. -7 11 M*/ -> 3. }T T{ MAX-2INT 8 16 M*/ -> HI-2INT }T +T{ MAX-2INT -8 16 M*/ -> HI-2INT DNEGATE ?floored }T T{ MIN-2INT 8 16 M*/ -> LO-2INT }T -T{ MAX-2INT -8 16 M*/ -> HI-2INT DNEGATE ?floored }T \ actual-results = -1. T{ MIN-2INT -8 16 M*/ -> LO-2INT DNEGATE }T T{ MAX-2INT MAX-INT MAX-INT M*/ -> MAX-2INT }T @@ -1549,3 +1599,5 @@ dbl2 d>ascii 2CONSTANT "dbl2" ; T{ DoubleOutput -> }T + +RST_STATE diff --git a/MSP430-FORTH/FF_SPECS.f b/MSP430-FORTH/FF_SPECS.f index c68a122..fcf2c5f 100644 --- a/MSP430-FORTH/FF_SPECS.f +++ b/MSP430-FORTH/FF_SPECS.f @@ -1,26 +1,44 @@ \ -*- coding: utf-8 -*- - -; ------------------ -; FF_SPECS.f -; ------------------ - -; displays all FastForth specifications - -\ TARGET SELECTION ( = the name of \INC\target.pat file without the extension) +\ +\ displays all FastForth specifications +\ 3 kb free mandatory. +\ +\ TARGET ( = the name of \INC\target.pat file without the extension): \ MSP_EXP430FR5739 MSP_EXP430FR5969 MSP_EXP430FR5994 MSP_EXP430FR6989 \ MSP_EXP430FR4133 CHIPSTICK_FR2433 MSP_EXP430FR2433 MSP_EXP430FR2355 \ LP_MSP430FR2476 +\ MY_MSP430FR5738_2 +\ COMPLEMENT: I2C \ -\ from scite editor : copy your target selection in (shift+F8) parameter 1: +\ from scite editor : copy your TARGET selection in (shift+F8) parameter 1: +\ copy COMPLEMENT if used in (shift+F8) parameter 2: \ \ OR \ -\ drag and drop this file onto SendSourceFileToTarget.bat -\ then select your TARGET when asked. +\ from file explorer : drag and drop this file onto SendSourceFileToTarget.bat +\ then select your TARGET + COMPLEMENT when asked. +\ +\ if you choice a bad target, you will obtain an error during downloading: "Device's ID mismatch!" \ \ COLD \ uncomment for this TEST which must not disrupt the downloading process -PWR_STATE \ remove volatile words +; --------------------------------- +; FF_SPECS.f +; --------------------------------- + +\ first, we test for downloading driver only if UART TERMINAL target +CODE ABORT_FF_SPECS +SUB #2,PSP +MOV TOS,0(PSP) +MOV &VERSION,TOS +SUB #307,TOS \ FastForth V3.7 +COLON +'CR' EMIT \ return to column 1 without 'LF' +ABORT" FastForth version = 3.7 please!" +PWR_STATE \ remove ABORT_FF_SPECS definition before resuming +; + +ABORT_FF_SPECS [UNDEFINED] AND [IF] \ https://forth-standard.org/standard/core/AND @@ -203,9 +221,11 @@ ENDCODE IMMEDIATE \ https://forth-standard.org/standard/core/BEGIN \ BEGIN -- BEGINadr initialize backward branch CODE BEGIN - MOV #HEREADR,PC + MOV #HEREXEC,PC ENDCODE IMMEDIATE +[THEN] +[UNDEFINED] UNTIL [IF] \ define BEGIN UNTIL AGAIN WHILE REPEAT \ https://forth-standard.org/standard/core/UNTIL \ UNTIL BEGINadr -- resolve conditional backward branch CODE UNTIL @@ -224,13 +244,17 @@ CODE AGAIN MOV #BRAN,X GOTO BW1 ENDCODE IMMEDIATE +[THEN] +[UNDEFINED] WHILE [IF] \ define DO LOOP +LOOP \ https://forth-standard.org/standard/core/WHILE \ WHILE BEGINadr -- WHILEadr BEGINadr : WHILE POSTPONE IF SWAP ; IMMEDIATE +[THEN] +[UNDEFINED] REPEAT [IF] \ define DO LOOP +LOOP \ https://forth-standard.org/standard/core/REPEAT \ REPEAT WHILEadr BEGINadr -- resolve WHILE loop : REPEAT @@ -296,26 +320,7 @@ ENDCODE [UNDEFINED] HERE [IF] CODE HERE -MOV #HEREADR,PC -ENDCODE -[THEN] - -[UNDEFINED] @ [IF] -\ https://forth-standard.org/standard/core/Fetch -\ @ c-addr -- char fetch char from memory -CODE @ -MOV @TOS,TOS -MOV @IP+,PC -ENDCODE -[THEN] - -[UNDEFINED] ! [IF] -\ https://forth-standard.org/standard/core/Store -\ ! x a-addr -- store cell in memory -CODE ! -MOV @PSP+,0(TOS) \ 4 -MOV @PSP+,TOS \ 2 -MOV @IP+,PC \ 4 +MOV #HEREXEC,PC ENDCODE [THEN] @@ -337,7 +342,7 @@ CMP #0,TOS PUSH IP BEGIN LO2HI - $20 EMIT + 'SP' EMIT HI2LO SUB #2,IP SUB #1,TOS @@ -437,11 +442,11 @@ ENDCODE : WORDS \ -- CR CONTEXT @ PAD_ORG \ -- VOC_BODY PAD MOVE all threads of VOC_BODY in PAD_ORG -INI_THREAD @ 2* \ -- VOC_BODY PAD THREAD*2 +THREADS @ 2* \ -- VOC_BODY PAD THREADS*2 MOVE \ -- vocabulary entries are copied in PAD_ORG BEGIN \ -- 0 DUP \ -- ptr=0 MAX=0 - INI_THREAD @ 2* 0 \ -- ptr=0 MAX=0 THREADS*2 0 + THREADS @ 2* 0 \ -- ptr=0 MAX=0 THREADS*2 0 DO \ -- ptr MAX I = PAD_ptr = thread*2 DUP I PAD_ORG + @ \ -- ptr MAX MAX NFAx U< IF \ -- ptr MAX if MAX U< NFAx @@ -496,21 +501,12 @@ LOOP ; IMMEDIATE [THEN] -[UNDEFINED] >BODY [IF] -\ https://forth-standard.org/standard/core/toBODY -\ >BODY -- addr leave BODY of a CREATEd word\ also leave default ACTION-OF primary DEFERred word -CODE >BODY -ADD #4,TOS -MOV @IP+,PC -ENDCODE -[THEN] - [UNDEFINED] S_ [IF] CODE S_ \ Squote alias with blank instead quote separator MOV #0,&CAPS \ turn CAPS OFF COLON XSQUOTE , \ compile run-time code -$20 WORD \ -- c-addr (= HERE) +'SP' WORD \ -- c-addr (= HERE) HI2LO MOV.B @TOS,TOS \ -- len compile string ADD #1,TOS \ -- len+1 @@ -529,8 +525,8 @@ CMP #0,&STATEADR 0= IF MOV @IP+,PC \ interpret time usage disallowed THEN COLON -$1B \ -- char escape -POSTPONE LITERAL \ compile-time code : lit $1B +'ESC' \ -- char escape +POSTPONE LITERAL \ compile-time code : lit 'ESC' POSTPONE EMIT \ compile-time code : EMIT POSTPONE S_ \ compile-time code : S_ POSTPONE TYPE \ compile-time code : TYPE @@ -540,37 +536,39 @@ POSTPONE TYPE \ compile-time code : TYPE \ ------------------------------------------------------- : SPECS \ to see all FastForth specifications \ ------------------------------------------------------- -PWR_STATE \ before free bytes computing, remove all created words +PWR_STATE \ before computing free bytes, remove all created words ECHO -42 0 DO CR LOOP \ to avoid erasing any line of source, create 42 empty lines +ESC [8;40;80t \ set 40L * 80C terminal display +39 0 DO CR LOOP \ to avoid erasing any line of source, create 42-1 empty lines ESC [H \ then cursor home ESC [7m \ Turn reverse video on -CR ." FastForth V" \ title line in reverse video +$0D EMIT ." FastForth V" \ title line in reverse video VERSION @ -0 <# # 8 HOLD # 46 HOLD #S #> TYPE +0 <# # 'BS' HOLD # '.' HOLD #S #> TYPE ." for MSP430FR" HERE \ HERE - MAIN_ORG = bytes code DEVICEID @ \ value kept in TLV area CASE -\ device_ID OF ." xxxx," $MAIN_ORG ENDOF \ <-- add here your device - $8102 OF ." 5738," $C200 ENDOF - $8103 OF ." 5739," $C200 ENDOF - $8160 OF ." 5948," $4400 ENDOF - $8169 OF ." 5969," $4400 ENDOF - $81A8 OF ." 6989," $4400 ENDOF - $810D OF ." 5986," $4400 ENDOF - $81F0 OF ." 4133," $C400 ENDOF - $8240 OF ." 2433," $C400 ENDOF - $82A1 OF ." 5994," $4000 ENDOF - $82A6 OF ." 5962," $4000 ENDOF - $830C OF ." 2355," $8000 ENDOF - $830D OF ." 2353," $C000 ENDOF - $831E OF ." 2155," $8000 ENDOF - $831D OF ." 2153," $C000 ENDOF - $832A OF ." 2476," $8000 ENDOF - $832B OF ." 2475," $8000 ENDOF - $833C OF ." 2633," $C400 ENDOF - $833D OF ." 2533," $C400 ENDOF +\ device_ID OF ." xxxx," $MAIN_ORG ENDOF \ <-- add here your device + $8102 OF ." 5738," $C200 ENDOF + $8103 OF ." 5739," $C200 ENDOF + $8160 OF ." 5948," $4400 ENDOF + $8169 OF ." 5969," $4400 ENDOF + $825D OF ." 5972," $4400 ENDOF + $81A8 OF ." 6989," $4400 ENDOF + $810D OF ." 5986," $4400 ENDOF + $81F0 OF ." 4133," $C400 ENDOF + $8240 OF ." 2433," $C400 ENDOF + $82A1 OF ." 5994," $4000 ENDOF + $82A6 OF ." 5962," $4000 ENDOF + $830C OF ." 2355," $8000 ENDOF + $830D OF ." 2353," $C000 ENDOF + $831E OF ." 2155," $8000 ENDOF + $831D OF ." 2153," $C000 ENDOF + $832A OF ." 2476," $8000 ENDOF + $832B OF ." 2475," $8000 ENDOF + $833C OF ." 2633," $C400 ENDOF + $833D OF ." 2533," $C400 ENDOF ABORT" xxxx <-- unrecognized device!" ENDCASE \ -- HERE MAIN_ORG ['] ['] DUP @ $1284 = \ DOCOL = CALL rDOCOL opcode @@ -581,12 +579,12 @@ ELSE 2 + @ $1284 = \ THEN THEN $20 EMIT -INI_THREAD @ U. #8 EMIT ." -Entry word sets, " \ number of Entry word sets, +THREADS @ U. 'BS' EMIT ." -Entry word sets, " \ number of Entry word sets, FREQ_KHZ @ 0 1000 UM/MOD U. \ frequency, -?DUP IF #8 EMIT #44 EMIT U. \ if remainder -THEN ." MHz, " \ MCLK -- U. ." bytes" \ HERE - MAIN_ORG = number of bytes code, -ESC [0m \ Turn off character attributes +?DUP IF 'BS' EMIT ',' EMIT U. \ if remainder +THEN ." MHz, " \ MCLK +- U. ." bytes" \ HERE - MAIN_ORG = number of bytes code, +ESC [0m \ Turn off character attributes CR ." /COUNTED-STRING = 255" CR ." /HOLD = 34" CR @@ -606,39 +604,45 @@ ESC [7m ." KERNEL SPECS" ESC [0m \ subtitle in reverse video CR KERNEL_ADDON @ DUP 0< IF ." 32.768kHz XTAL" CR THEN -2* DUP 0< IF 2* ." (RTS/CTS) UART TERMINAL" CR - ELSE 2* DUP +2* DUP 0< IF ." (RTS/CTS) UART TERMINAL" CR 2* + ELSE 2* DUP 0< IF ." (RTS) UART TERMINAL" CR THEN THEN 2* DUP 0< IF ." (XON/XOFF) UART TERMINAL" CR - ELSE ." I2C SLAVE TERMINAL" CR + ELSE ." I2C_Master TERMINAL" CR + THEN +2* DUP 0< IF ." Half-Duplex TERMINAL" CR THEN +2* DUP 0< IF ." Q15.16 input" CR THEN +2* DUP 0< IF ." DOUBLE input" CR THEN +2* DUP 0< IF ." MSP430_X assembler" CR 2* 2* + ELSE 2* DUP + 0< IF ." MSP430 Assembler" + 2* DUP 0< IF ." with 20bits address" THEN + CR + ELSE 2* + THEN THEN -2* DUP 0< IF ." HALF-DUPLEX TERMINAL" CR THEN -2* DUP 0< IF ." ASM DATA ACCESS BEYOND $FFFF" CR THEN -2* DUP 0< IF ." BOOTLOADER" CR THEN -2* DUP 0< IF ." SD_CARD READ/WRITE" CR THEN -2* DUP 0< IF ." SD_CARD LOADER" CR THEN -2* DUP 0< IF ." FIXPOINT INPUT" CR THEN -2* DUP 0< IF ." DOUBLE INPUT" CR THEN -2* DUP 0< IF ." VOCABULARY SET" CR THEN -2* DUP 0< IF ." DEFERRED words" CR THEN -2* DUP 0< IF ." EXTENDED ASSEMBLER" CR THEN -2* DUP 0< IF ." ASSEMBLER" CR THEN -2* DUP 0< IF ." CONDITIONNAL COMPILATION" CR THEN -0< IF \ true if CONDCOMP add-on +2* 2* 2* 2* 2* \ 5 free flags +2* 0< IF \ true if COND. COMPILATION + [DEFINED] DEFER [IF] ." DEFER word set" CR [THEN] + [DEFINED] ALSO [IF] ." VOCABULARY word set" CR [THEN] + [DEFINED] BOOT [IF] ." bootloader" CR [THEN] + [DEFINED] READ" [IF] ." SD_CARD Read/Write" CR [THEN] + [DEFINED] LOAD" [IF] ." SD_CARD Loader" CR [THEN] CR ESC [7m ." OPTIONS" ESC [0m \ subtitle in reverse video CR - [DEFINED] {CORE_ANS} [IF] ." ANS94 CORE COMPLIANT" CR [THEN] - [DEFINED] {DOUBLE} [IF] ." Double-Number word set" CR [THEN] + [DEFINED] {CORE_ANS} [IF] ." ANS94 core" CR [THEN] + [DEFINED] {DOUBLE} [IF] ." DOUBLE word set" CR [THEN] [DEFINED] {TOOLS} [IF] ." UTILITY" CR [THEN] - [DEFINED] {FIXPOINT} [IF] ." FIXPOINT" CR [THEN] + [DEFINED] {FIXPOINT} [IF] ." Q15.16 ADD SUB MUL DIV" CR [THEN] [DEFINED] {CORDIC} [IF] ." CORDIC engine" CR [THEN] [DEFINED] {SD_TOOLS} [IF] ." SD_TOOLS" CR [THEN] [DEFINED] {RTC} [IF] ." RTC utility" CR [THEN] [DEFINED] {UARTI2CS} [IF] ." UART to I2C_FastForth bridge" CR [THEN] - [DEFINED] VOCABULARY [IF] + [DEFINED] ALSO + [IF] CR ESC [7m ." ASSEMBLER word set" ESC [0m \ subtitle in reverse video ALSO ASSEMBLER WORDS PREVIOUS \ type ASSEMBLER word set @@ -649,7 +653,8 @@ CR ESC [7m ." FORTH word set" ESC [0m \ subtitle in reverse video WORDS \ type FORTH word set CR -WARM \ type bytes free -; +HI2LO +MOV #WARM+4,PC \ type count of bytes free without re-executing INI_APP +ENDCODE -SPECS \ here FastForth types a (volatile) message with some informations +SPECS \ here FastForth displays a (volatile) message with some informations diff --git a/MSP430-FORTH/FixPoint.f b/MSP430-FORTH/FixPoint.f index 1d20606..b6632e4 100644 --- a/MSP430-FORTH/FixPoint.f +++ b/MSP430-FORTH/FixPoint.f @@ -1,19 +1,11 @@ \ -*- coding: utf-8 -*- - -; ----------------------------------------------------- -; FIXPOINT.f -; ----------------------------------------------------- - -; ----------------------------------------------------------- -; requires FIXPOINT_INPUT kernel addon, see forthMSP430FR.asm -; ----------------------------------------------------------- \ \ to see kernel options, download FastForthSpecs.f \ FastForth kernel options: MSP430ASSEMBLER, CONDCOMP, FIXPOINT_INPUT \ \ TARGET SELECTION ( = the name of \INC\target.pat file without the extension) \ MSP_EXP430FR5739 MSP_EXP430FR5969 MSP_EXP430FR5994 MSP_EXP430FR6989 -\ MSP_EXP430FR2433 MSP_EXP430FR4133 MSP_EXP430FR2355 CHIPSTICK_FR2433 +\ MSP_EXP430FR2433 MSP_EXP430FR4133 CHIPSTICK_FR2433 MSP_EXP430FR2355 \ LP_MSP430FR2476 \ \ from scite editor : copy your target selection in (shift+F8) parameter 1: @@ -45,11 +37,30 @@ \ ASSEMBLER conditionnal usage with ?JMP ?GOTO S< S>= U< U>= 0= 0<> 0< \ -PWR_STATE +CODE ABORT_FIXPOINT +SUB #4,PSP +MOV TOS,2(PSP) +MOV &KERNEL_ADDON,TOS +BIT #BIT10,TOS +0<> IF MOV #0,TOS THEN \ if TOS <> 0 (FIXPOINT input), set TOS = 0 +MOV TOS,0(PSP) +MOV &VERSION,TOS +SUB #307,TOS \ FastForth V3.7 +COLON +$0D EMIT \ return to column 1 without CR +ABORT" FastForth version = 3.7 please!" +ABORT" buil FastForth with FIXPOINT_INPUT addon !" +PWR_STATE \ if no abort remove this word +$1B EMIT $63 EMIT \ send 'ESC c' (clear screen) +; -[DEFINED] {FIXPOINT} [IF] {FIXPOINT} [THEN] +ABORT_FIXPOINT + +; ----------------------------------------------------- +; FIXPOINT.f +; ----------------------------------------------------- -[UNDEFINED] {FIXPOINT} [IF] +[DEFINED] {FIXPOINT} [IF] {FIXPOINT} [THEN] MARKER {FIXPOINT} @@ -62,15 +73,6 @@ MOV @IP+,PC ENDCODE [THEN] -[UNDEFINED] @ [IF] -\ https://forth-standard.org/standard/core/Fetch -\ @ c-addr -- char fetch char from memory -CODE @ -MOV @TOS,TOS -MOV @IP+,PC -ENDCODE -[THEN] - [UNDEFINED] R> [IF] \ https://forth-standard.org/standard/core/Rfrom \ R> -- x R: x -- pop from return stack ; CALL #RFROM performs DOVAR @@ -215,7 +217,7 @@ THEN COLON MOV @RSP+,IP MOV @PSP+,TOS \ -- RES0 RES1 RES2 MOV @PSP+,0(PSP) \ -- RES1 RES2 -BW2 AND #-1,S \ clear V, set N; process S sign + AND #-1,S \ clear V, set N; process S sign S< IF XOR #-1,0(PSP) \ INV(QUOTlo) XOR #-1,TOS \ INV(QUOThi) ADD #1,0(PSP) \ INV(QUOTlo)+1 @@ -223,66 +225,6 @@ S< IF XOR #-1,0(PSP) \ INV(QUOTlo) THEN MOV @IP+,PC ENDCODE -CODE F/ \ Q15.16 / Q15.16 --> Q15.16 result - PUSHM #4,rDOVAR \ 6 save rDOVAR to rDOCOL regs to use M to R alias - MOV @PSP+,M \ DVRlo - MOV @PSP+,X \ DVDhi --> REMlo - MOV #0,W \ REMhi = 0 - MOV @PSP,Y \ DVDlo --> DVDhi - MOV #0,T \ DVDlo = 0 - MOV X,S \ - XOR TOS,S \ DVDhi XOR DVRhi --> S keep sign of result - AND #-1,X \ DVD < 0 ? -S< IF XOR #-1,Y \ INV(DVDlo) - XOR #-1,X \ INV(DVDhi) - ADD #1,Y \ INV(DVDlo)+1 - ADDC #0,X \ INV(DVDhi)+C -THEN AND #-1,TOS \ DVR < 0 ? -S< IF XOR #-1,M \ INV(DVRlo) - XOR #-1,TOS \ INV(DVRhi) - ADD #1,M \ INV(DVRlo)+1 - ADDC #0,TOS \ INV(DVRhi)+C -THEN -\ don't uncomment lines below ! -\ ------------------------------------------------------------------------ -\ UD/MOD DVDlo DVDhi DVRlo DVRhi -- REMlo REMhi QUOTlo QUOThi -\ ------------------------------------------------------------------------ -\ MOV 4(PSP),T \ DVDlo -\ MOV 2(PSP),Y \ DVDhi -\ MOV #0,X \ REMlo = 0 -\ MOV #0,W \ REMhi = 0 - MOV #32,P \ init loop count -BW1 CMP TOS,W \ 1 REMhi = DVRhi ? - 0= IF CMP M,X \ 1 REMlo U< DVRlo ? - THEN - U>= IF SUB M,X \ 1 no: REMlo - DVRlo (carry is set) - SUBC TOS,W \ 1 REMhi - DVRhi - THEN - BEGIN ADDC R,R \ 1 RLC quotLO - ADDC Q,Q \ 1 RLC quotHI - SUB #1,P \ 1 Decrement loop counter - 0< ?GOTO FW1 \ 2 out of loop if count<0 - ADD T,T \ 1 RLA DVDlo - ADDC Y,Y \ 1 RLC DVDhi - ADDC X,X \ 1 RLC REMlo - ADDC W,W \ 1 RLC REMhi - U< ?GOTO BW1 \ 2 15~ loop - SUB M,X \ 1 REMlo - DVRlo - SUBC TOS,W \ 1 REMhi - DVRhi - BIS #1,SR \ 1 - AGAIN \ 2 16~ loop -FW1 -\ MOV X,4(PSP) \ REMlo -\ MOV W,2(PSP) \ REMhi -\ ADD #4,PSP \ skip REMlo REMhi - MOV R,0(PSP) \ QUOTlo - MOV Q,TOS \ QUOThi - POPM #4,rDOVAR \ 6 restore rDOCOL to rDOVAR -\ MOV @IP+,PC \ end of UD/MOD -\ ------------------------------------------------------------------------ - GOTO BW2 \ to process S sign -ENDCODE - [UNDEFINED] F#S [IF] \ F#S Qlo Qhi len -- Qhi 0 convert fractional part Qlo of Q15.16 fixed point number \ with len digits @@ -315,76 +257,24 @@ ENDCODE [ELSE] ; hardware multiplier -CODE F/ \ Q15.16 / Q15.16 --> Q15.16 result -\ TOS = DVRhi -\ 0(PSP) = DVRlo -\ 2(PSP) = DVDhi -\ 4(PSP) = DVDlo - PUSHM #4,rDOVAR \ 6 PUSHM rDOVAR to rDOCOL to use M to R alias - MOV @PSP+,M \ 2 DVRlo - MOV @PSP+,X \ 2 DVDhi --> REMlo - MOV #0,W \ 1 REMhi = 0 - MOV @PSP,Y \ 2 DVDlo --> DVDhi - MOV #0,T \ 1 DVDlo = 0 - MOV X,S \ 1 - XOR TOS,S \ 1 DVDhi XOR DVRhi --> S keep sign of result - AND #-1,X \ 1 DVD < 0 ? -S< IF XOR #-1,Y \ 1 INV(DVDlo) - XOR #-1,X \ 1 INV(DVDhi) - ADD #1,Y \ 1 INV(DVDlo)+1 - ADDC #0,X \ 1 INV(DVDhi)+C -THEN AND #-1,TOS \ 1 DVRhi < 0 ? -S< IF XOR #-1,M \ 1 INV(DVRlo) - XOR #-1,TOS \ 1 INV(DVRhi) - ADD #1,M \ 1 INV(DVRlo)+1 - ADDC #0,TOS \ 1 INV(DVRhi)+C -THEN -\ don't uncomment lines below ! -\ ------------------------------------------------------------------------ -\ UD/MOD DVDlo DVDhi DVRlo DVRhi -- REMlo REMhi QUOTlo QUOThi -\ ------------------------------------------------------------------------ -\ MOV 4(PSP),T \ DVDlo -\ MOV 2(PSP),Y \ DVDhi -\ MOV #0,X \ REMlo = 0 -\ MOV #0,W \ REMhi = 0 - MOV #32,P \ 2 init loop count -BW1 CMP TOS,W \ 1 REMhi = DVRhi ? - 0= IF CMP M,X \ 1 REMlo U< DVRlo ? - THEN - U>= IF SUB M,X \ 1 no: REMlo - DVRlo (carry is set) - SUBC TOS,W \ 1 REMhi - DVRhi - THEN -BW2 ADDC R,R \ 1 RLC quotLO - ADDC Q,Q \ 1 RLC quotHI - SUB #1,P \ 1 Decrement loop counter - 0< ?GOTO FW1 \ 2 out of loop if count<0 - ADD T,T \ 1 RLA DVDlo - ADDC Y,Y \ 1 RLC DVDhi - ADDC X,X \ 1 RLC REMlo - ADDC W,W \ 1 RLC REMhi - U< ?GOTO BW1 \ 2 19~ loop - SUB M,X \ 1 REMlo - DVRlo - SUBC TOS,W \ 1 REMhi - DVRhi - BIS #1,SR \ 1 - GOTO BW2 \ 2 16~ loop -FW1 AND #-1,S \ 1 clear V, set N; QUOT < 0 ? -S< IF XOR #-1,R \ 1 INV(QUOTlo) - XOR #-1,Q \ 1 INV(QUOThi) - ADD #1,R \ 1 INV(QUOTlo)+1 - ADDC #0,Q \ 1 INV(QUOThi)+C -THEN MOV R,0(PSP) \ 3 QUOTlo - MOV Q,TOS \ 1 QUOThi - POPM #4,rDOVAR \ 6 restore rDOCOL to rDOVAR - MOV @IP+,PC \ 4 +CODE F* \ signed s15.16 multiplication --> s15.16 result + MOV 4(PSP),&MPYS32L \ 5 Load 1st operand + MOV 2(PSP),&MPYS32H \ 5 + MOV @PSP,&OP2L \ 4 load 2nd operand + MOV TOS,&OP2H \ 3 + ADD #4,PSP \ 1 remove 2 cells + MOV &RES1,0(PSP) \ 5 + MOV &RES2,TOS \ 5 + MOV @IP+,PC ENDCODE [UNDEFINED] F#S [IF] -\ F#S Qlo Qhi u -- Qhi 0 convert fractionnal part of Q15.16 fixed point number -\ with u digits +\ F#S Qlo Qhi len -- Qhi 0 convert fractionnal part of Q15.16 fixed point number +\ with len digits CODE F#S - MOV 2(PSP),X \ -- Qlo Qhi u X = Qlo - MOV @PSP,2(PSP) \ -- Qhi Qhi u - MOV X,0(PSP) \ -- Qhi Qlo u + MOV 2(PSP),X \ -- Qlo Qhi len X = Qlo + MOV @PSP,2(PSP) \ -- Qhi Qhi len + MOV X,0(PSP) \ -- Qhi Qlo len MOV TOS,T \ T = len MOV #0,S \ S = count BEGIN MOV @PSP,&MPY \ Load 1st operand @@ -404,19 +294,84 @@ BEGIN MOV @PSP,&MPY \ Load 1st operand ENDCODE [THEN] -CODE F* \ signed s15.16 multiplication --> s15.16 result - MOV 4(PSP),&MPYS32L \ 5 Load 1st operand - MOV 2(PSP),&MPYS32H \ 5 - MOV @PSP,&OP2L \ 4 load 2nd operand - MOV TOS,&OP2H \ 3 - ADD #4,PSP \ 1 remove 2 cells - MOV &RES1,0(PSP) \ 5 - MOV &RES2,TOS \ 5 - MOV @IP+,PC -ENDCODE - [THEN] \ end of hardware/software multiplier +CODE F/ \ Q15.16 / Q15.16 --> Q15.16 result + MOV TOS,Y \ 1 Y=DVRhi + MOV @PSP+,W \ 2 W=DVRlo + MOV @PSP+,X \ 2 X=DVDhi + MOV @PSP,T \ 2 T=DVDlo + PUSHM #5,X \ 7 PUSHM DVDhi,DVRhi, M, P, Q + AND #-1,Y \ 1 Y=DVRhi < 0 ? +S< IF XOR #-1,W \ 1 W=INV(DVRlo) + XOR #-1,Y \ 1 Y=INV(DVRhi) + ADD #1,W \ 1 W=INV(DVRlo)+1 + ADDC #0,Y \ 1 Y=INV(DVRhi)+C +THEN + AND #-1,X \ 1 X=DVDhi < 0 ? +S< IF XOR #-1,T \ 1 T=INV(DVDlo) + XOR #-1,X \ 1 X=INV(DVDhi) + ADD #1,T \ 1 T=INV(DVDlo)+1 + ADDC #0,X \ 1 X=INV(DVDhi)+C +THEN + MOV X,M \ 1 DVDhi --> REMlo to adjust Q15.16 division + MOV T,X \ 1 DVDlo --> DVDhi + MOV #0,T \ 1 0 --> DVDlo +\ ------------------------------------------------------------------------ +\ don't uncomment lines below, don't rub out, please ! +\ ------------------------------------------------------------------------ +\ UD/MOD DVDlo DVDhi DVRlo DVRhi -- REMlo REMhi QUOTlo QUOThi +\ ------------------------------------------------------------------------ +\ MOV TOS,Y \ 1 Y=DVRhi +\ MOV @PSP+,W \ 2 W=DVRlo +\ MOV @PSP+,X \ 2 X=DVDhi +\ MOV @PSP,T \ 2 T=DVDlo +\ PUSHM #5,X \ 7 PUSHM DVDhi,DVRhi, M, P, Q +\ MOV #0,M \ 1 M=REMlo = 0 + MOV #0,P \ 1 P=REMhi = 0 + MOV #32,Q \ 2 Q=count +BW1 CMP Y,P \ 1 REMhi = DVRhi ? + 0= IF CMP W,M \ 1 REMlo U< DVRlo ? + THEN + U>= IF SUB W,M \ 1 no: REMlo - DVRlo (carry is set) + SUBC Y,P \ 1 REMhi - DVRhi + THEN + BEGIN ADDC S,S \ 1 RLC quotLO + ADDC TOS,TOS \ 1 RLC quotHI + SUB #1,Q \ 1 Decrement loop counter + U>= WHILE \ 2 out of loop if count<0 + ADD T,T \ 1 RLA DVDlo + ADDC X,X \ 1 RLC DVDhi + ADDC M,M \ 1 RLC REMlo + ADDC P,P \ 1 RLC REMhi + U< ?GOTO BW1 \ 2 19~ loop + SUB W,M \ 1 REMlo - DVRlo + SUBC Y,P \ 1 REMhi - DVRhi + BIS #1,SR \ 1 + REPEAT \ 2 16~ loop +\ MOV M,T \ 1 T=REMlo +\ MOV P,W \ 1 W=REMhi + POPM #5,X \ 7 X=DVDhi, Y=DVRhi, system regs M,P,Q restored +\ CMP #0,X \ 1 sign of Rem ? +\ S< IF XOR #-1,T \ 1 INV(REMlo) +\ XOR #-1,W \ 1 INV(REMhi) +\ ADD #1,T \ 1 INV(REMlo)+1 +\ ADDC #0,W \ 1 INV(REMhi)+C +\ THEN +\ SUB #4,PSP \ +\ MOV T,4(PSP) \ REMlo +\ MOV W,2(PSP) \ REMhi + XOR X,Y \ Y = sign of Quot + CMP #0,Y \ sign of Quot ? +S< IF XOR #-1,S \ 1 INV(QUOTlo) + XOR #-1,TOS \ 1 INV(QUOThi) + ADD #1,S \ 1 INV(QUOTlo)+1 + ADDC #0,TOS \ 1 INV(QUOThi)+C +THEN + MOV S,0(PSP) \ 3 QUOTlo + MOV @IP+,PC \ 4 +ENDCODE + [UNDEFINED] F. [IF] CODE F. \ display a Q15.16 number with 4/5/16 digits after comma MOV TOS,S \ S = sign @@ -450,10 +405,8 @@ ENDCODE RST_HERE -[THEN] \ end of [UNDEFINED] {FIXPOINT} - ; ----------------------- -; complements (volatile) for tests below +; complement (volatile) for tests below ; ----------------------- [UNDEFINED] ! [IF] @@ -530,56 +483,58 @@ ECHO 3,14159 2CONSTANT PI PI -1,0 F* 2CONSTANT -PI -PI D. ; D. is not appropriate --> +PI D. ; D. is not appropriate --> -PI D. ; D. is not appropriate --> -PI F. ; good value! ------------> --PI F. ; good value! ------------> +PI F. ; F. is a good choice! ---> +-PI F. ; F. is a good choice! ---> -$10 BASE ! PI F. +$10 BASE ! PI F. -PI F. -%10 BASE ! PI F. +%10 BASE ! PI F. -PI F. -#10 BASE ! PI F. +#10 BASE ! PI F. -PI F. -PI 2,0 F* F. -PI -2,0 F* F. --PI 2,0 F* F. --PI -2,0 F* F. + PI 2,0 F* F. + PI -2,0 F* F. +-PI 2,0 F* F. +-PI -2,0 F* F. -PI 2,0 F/ F. -PI -2,0 F/ F. --PI 2,0 F/ F. --PI -2,0 F/ F. + PI 2,0 F/ F. + PI -2,0 F/ F. +-PI 2,0 F/ F. +-PI -2,0 F/ F. -32768,0 1,0 F* F. ; overflow! --> -32768,0 1,0 F/ F. ; overflow! --> + 32768,0 1,0 F* F. ; overflow! --> + 32768,0 1,0 F/ F. ; overflow! --> -32768,0 -1,0 F* F. ; overflow! --> -32768,0 -1,0 F/ F. ; overflow! --> -32767,99999 1,0 F* F. -32767,99999 1,0 F/ F. -32767,99999 2,0 F/ F. -32767,99999 4,0 F/ F. -32767,99999 8,0 F/ F. -32767,99999 16,0 F/ F. - --32768,0 -2,0 F/ F. --32768,0 -4,0 F/ F. --32768,0 -8,0 F/ F. --32768,0 -16,0 F/ F. --32768,0 -32,0 F/ F. --32768,0 -64,0 F/ F. - --3276,80 -1,0 F/ F. --327,680 -1,0 F/ F. --32,7680 -1,0 F/ F. --3,27680 -1,0 F/ F. --0,32768 -1,0 F/ F. +32767,99999 1,0 F* F. +32767,99999 1,0 F/ F. +32767,99999 2,0 F/ F. +32767,99999 4,0 F/ F. +32767,99999 8,0 F/ F. +32767,99999 16,0 F/ F. + +-32768,0 -2,0 F/ F. +-32768,0 -4,0 F/ F. +-32768,0 -8,0 F/ F. +-32768,0 -16,0 F/ F. +-32768,0 -32,0 F/ F. +-32768,0 -64,0 F/ F. + +-3276,80 -1,0 F/ F. +-327,680 -1,0 F/ F. +-32,7680 -1,0 F/ F. +-3,27680 -1,0 F/ F. +-0,32768 -1,0 F/ F. ; SQRT(32768)^2 = 32768 -181,01933598375 181,01933598375 F* F. -181,01933598375 -181,01933598375 F* F. --181,01933598375 181,01933598375 F* F. + 181,01933598375 181,01933598375 F* F. + 181,01933598375 -181,01933598375 F* F. +-181,01933598375 181,01933598375 F* F. -181,01933598375 -181,01933598375 F* F. + +RST_STATE diff --git a/MSP430-FORTH/MSP_EXP430FR5994/FF_SPECS.4TH b/MSP430-FORTH/LAST.4TH similarity index 71% rename from MSP430-FORTH/MSP_EXP430FR5994/FF_SPECS.4TH rename to MSP430-FORTH/LAST.4TH index 436c1e8..8ac5b90 100644 --- a/MSP430-FORTH/MSP_EXP430FR5994/FF_SPECS.4TH +++ b/MSP430-FORTH/LAST.4TH @@ -1,12 +1,20 @@ -; ------------------ +; --------------------------------- ; FF_SPECS.4th for MSP_EXP430FR5994 -; ------------------ - -; displays all FastForth specifications - +; --------------------------------- +CODE ABORT_FF_SPECS +SUB #2,R15 +MOV R14,0(R15) +MOV &$180E,R14 +SUB #307,R14 +COLON +$0D EMIT +ABORT" FastForth version = 3.7 please!" PWR_STATE +; + +ABORT_FF_SPECS [UNDEFINED] AND [IF] CODE AND @@ -129,7 +137,7 @@ SUB #2,R15 MOV R14,0(R15) MOV &$1DC6,R14 ADD #4,&$1DC6 -MOV #$4042,0(R14) +MOV #$4034,0(R14) ADD #2,R14 MOV @R13+,R0 ENDCODE IMMEDIATE @@ -145,7 +153,7 @@ ENDCODE IMMEDIATE CODE ELSE ADD #4,&$1DC6 MOV &$1DC6,R10 -MOV #$403E,-4(R10) +MOV #$403A,-4(R10) MOV R10,0(R14) SUB #2,R10 MOV R10,R14 @@ -155,11 +163,13 @@ ENDCODE IMMEDIATE [UNDEFINED] BEGIN [IF] CODE BEGIN - MOV #$402C,R0 + MOV #$4028,R0 ENDCODE IMMEDIATE +[THEN] +[UNDEFINED] UNTIL [IF] CODE UNTIL - MOV #$4042,R9 + MOV #$4034,R9 BW1 ADD #4,&$1DC6 MOV &$1DC6,R10 MOV R9,-4(R10) @@ -169,14 +179,18 @@ BW1 ADD #4,&$1DC6 ENDCODE IMMEDIATE CODE AGAIN -MOV #$403E,R9 +MOV #$403A,R9 GOTO BW1 ENDCODE IMMEDIATE +[THEN] +[UNDEFINED] WHILE [IF] : WHILE POSTPONE IF SWAP ; IMMEDIATE +[THEN] +[UNDEFINED] REPEAT [IF] : REPEAT POSTPONE AGAIN POSTPONE THEN ; IMMEDIATE @@ -188,7 +202,7 @@ SUB #2,R15 MOV R14,0(R15) ADD #2,&$1DC6 MOV &$1DC6,R14 -MOV #$404C,-2(R14) +MOV #$403E,-2(R14) ADD #2,&$1C00 MOV &$1C00,R10 MOV #0,0(R10) @@ -196,7 +210,7 @@ MOV @R13+,R0 ENDCODE IMMEDIATE CODE LOOP - MOV #$406E,R9 + MOV #$4060,R9 BW1 ADD #4,&$1DC6 MOV &$1DC6,R10 MOV R9,-4(R10) @@ -214,7 +228,7 @@ REPEAT ENDCODE IMMEDIATE CODE +LOOP -MOV #$405C,R9 +MOV #$404E,R9 GOTO BW1 ENDCODE IMMEDIATE [THEN] @@ -231,22 +245,7 @@ ENDCODE [UNDEFINED] HERE [IF] CODE HERE -MOV #$402C,R0 -ENDCODE -[THEN] - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] ! [IF] -CODE ! -MOV @R15+,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 +MOV #$4028,R0 ENDCODE [THEN] @@ -309,7 +308,7 @@ ENDCODE [UNDEFINED] UM/MOD [IF] CODE UM/MOD PUSH #DROP - MOV #$4074,R0 + MOV #$4066,R0 ENDCODE [THEN] @@ -349,11 +348,11 @@ ENDCODE : WORDS CR $1DCA @ $1CE4 -$1800 @ 2* +$1810 @ 2* MOVE BEGIN 0 DUP - $1800 @ 2* 0 + $1810 @ 2* 0 DO DUP I $1CE4 + @ U< IF @@ -404,18 +403,11 @@ LOOP ; IMMEDIATE [THEN] -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - [UNDEFINED] S_ [IF] CODE S_ MOV #0,&$1DB4 COLON -$4018 , +$4014 , $20 WORD HI2LO MOV.B @R14,R14 @@ -446,34 +438,36 @@ POSTPONE TYPE : SPECS PWR_STATE ECHO -42 0 DO CR LOOP +ESC [8;40;80t +39 0 DO CR LOOP ESC [H ESC [7m -CR ." FastForth V" -$1810 @ -0 <# # 8 HOLD # 46 HOLD #S #> TYPE +$0D EMIT ." FastForth V" +$180E @ +0 <# # $08 HOLD # '.' HOLD #S #> TYPE ." for MSP430FR" HERE $1A04 @ CASE - $8102 OF ." 5738," $C200 ENDOF - $8103 OF ." 5739," $C200 ENDOF - $8160 OF ." 5948," $4400 ENDOF - $8169 OF ." 5969," $4400 ENDOF - $81A8 OF ." 6989," $4400 ENDOF - $810D OF ." 5986," $4400 ENDOF - $81F0 OF ." 4133," $C400 ENDOF - $8240 OF ." 2433," $C400 ENDOF - $82A1 OF ." 5994," $4000 ENDOF - $82A6 OF ." 5962," $4000 ENDOF - $830C OF ." 2355," $8000 ENDOF - $830D OF ." 2353," $C000 ENDOF - $831E OF ." 2155," $8000 ENDOF - $831D OF ." 2153," $C000 ENDOF - $832A OF ." 2476," $8000 ENDOF - $832B OF ." 2475," $8000 ENDOF - $833C OF ." 2633," $C400 ENDOF - $833D OF ." 2533," $C400 ENDOF + $8102 OF ." 5738," $C200 ENDOF + $8103 OF ." 5739," $C200 ENDOF + $8160 OF ." 5948," $4400 ENDOF + $8169 OF ." 5969," $4400 ENDOF + $825D OF ." 5972," $4400 ENDOF + $81A8 OF ." 6989," $4400 ENDOF + $810D OF ." 5986," $4400 ENDOF + $81F0 OF ." 4133," $C400 ENDOF + $8240 OF ." 2433," $C400 ENDOF + $82A1 OF ." 5994," $4000 ENDOF + $82A6 OF ." 5962," $4000 ENDOF + $830C OF ." 2355," $8000 ENDOF + $830D OF ." 2353," $C000 ENDOF + $831E OF ." 2155," $8000 ENDOF + $831D OF ." 2153," $C000 ENDOF + $832A OF ." 2476," $8000 ENDOF + $832B OF ." 2475," $8000 ENDOF + $833C OF ." 2633," $C400 ENDOF + $833D OF ." 2533," $C400 ENDOF ABORT" xxxx <-- unrecognized device!" ENDCASE ['] ['] DUP @ $1284 = @@ -484,9 +478,9 @@ ELSE 2 + @ $1284 = THEN THEN $20 EMIT -$1800 @ U. #8 EMIT ." -Entry word sets, " -$1806 @ 0 1000 UM/MOD U. -?DUP IF #8 EMIT #44 EMIT U. +$1810 @ U. $08 EMIT ." -Entry word sets, " +$1800 @ 0 1000 UM/MOD U. +?DUP IF $08 EMIT ',' EMIT U. THEN ." MHz, " - U. ." bytes" ESC [0m @@ -509,39 +503,45 @@ ESC [7m ." KERNEL SPECS" ESC [0m CR $1812 @ DUP 0< IF ." 32.768kHz XTAL" CR THEN -2* DUP 0< IF 2* ." (4/2) UART TERMINAL" CR - ELSE 2* DUP +2* DUP 0< IF ." (4/2) UART TERMINAL" CR 2* + ELSE 2* DUP 0< IF ." (RTS) UART TERMINAL" CR THEN THEN 2* DUP 0< IF ." (XON/XOFF) UART TERMINAL" CR - ELSE ." I2C SLAVE TERMINAL" CR + ELSE ." I2C_Master TERMINAL" CR + THEN +2* DUP 0< IF ." Half-Duplex TERMINAL" CR THEN +2* DUP 0< IF ." Q15.16 input" CR THEN +2* DUP 0< IF ." DOUBLE input" CR THEN +2* DUP 0< IF ." MSP430_X assembler" CR 2* 2* + ELSE 2* DUP + 0< IF ." MSP430 Assembler" + 2* DUP 0< IF ." with 20bits address" THEN + CR + ELSE 2* + THEN THEN -2* DUP 0< IF ." HALF-DUPLEX TERMINAL" CR THEN -2* DUP 0< IF ." ASM DATA ACCESS BEYOND $FFFF" CR THEN -2* DUP 0< IF ." BOOTLOADER" CR THEN -2* DUP 0< IF ." SD_CARD READ/WRITE" CR THEN -2* DUP 0< IF ." SD_CARD LOADER" CR THEN -2* DUP 0< IF ." FIXPOINT INPUT" CR THEN -2* DUP 0< IF ." DOUBLE INPUT" CR THEN -2* DUP 0< IF ." VOCABULARY SET" CR THEN -2* DUP 0< IF ." DEFERRED words" CR THEN -2* DUP 0< IF ." EXTENDED ASSEMBLER" CR THEN -2* DUP 0< IF ." ASSEMBLER" CR THEN -2* DUP 0< IF ." CONDITIONNAL COMPILATION" CR THEN -0< IF +2* 2* 2* 2* 2* +2* 0< IF + [DEFINED] DEFER [IF] ." DEFER word set" CR [THEN] + [DEFINED] ALSO [IF] ." VOCABULARY word set" CR [THEN] + [DEFINED] BOOT [IF] ." bootloader" CR [THEN] + [DEFINED] READ" [IF] ." SD_CARD Read/Write" CR [THEN] + [DEFINED] LOAD" [IF] ." SD_CARD Loader" CR [THEN] CR ESC [7m ." OPTIONS" ESC [0m CR - [DEFINED] {CORE_ANS} [IF] ." ANS94 CORE COMPLIANT" CR [THEN] - [DEFINED] {DOUBLE} [IF] ." Double-Number word set" CR [THEN] + [DEFINED] {CORE_ANS} [IF] ." ANS94 core" CR [THEN] + [DEFINED] {DOUBLE} [IF] ." DOUBLE word set" CR [THEN] [DEFINED] {TOOLS} [IF] ." UTILITY" CR [THEN] - [DEFINED] {FIXPOINT} [IF] ." FIXPOINT" CR [THEN] + [DEFINED] {FIXPOINT} [IF] ." Q15.16 ADD SUB MUL DIV" CR [THEN] [DEFINED] {CORDIC} [IF] ." CORDIC engine" CR [THEN] [DEFINED] {SD_TOOLS} [IF] ." SD_TOOLS" CR [THEN] [DEFINED] {RTC} [IF] ." RTC utility" CR [THEN] [DEFINED] {UARTI2CS} [IF] ." UART to I2C_FastForth bridge" CR [THEN] - [DEFINED] VOCABULARY [IF] + [DEFINED] ALSO + [IF] CR ESC [7m ." ASSEMBLER word set" ESC [0m ALSO ASSEMBLER WORDS PREVIOUS @@ -552,7 +552,8 @@ CR ESC [7m ." FORTH word set" ESC [0m WORDS CR -WARM -; +HI2LO +MOV #WARM+4,R0 +ENDCODE SPECS diff --git a/MSP430-FORTH/MSP_EXP430FR5994/BOOT.4TH b/MSP430-FORTH/MSP_EXP430FR5994/BOOT.4TH deleted file mode 100644 index b1c3798..0000000 --- a/MSP430-FORTH/MSP_EXP430FR5994/BOOT.4TH +++ /dev/null @@ -1,82 +0,0 @@ - -; -------- -; BOOT.4th -; -------- -\ -\ to see kernel options, download FastForthSpecs.f -\ FastForth kernel options: MSP430ASSEMBLER, CONDCOMP, SD_CARD_LOADER, BOOTLOADER -\ -\ TARGET SELECTION -\ MSP_EXP430FR5739 MSP_EXP430FR5969 MSP_EXP430FR5994 MSP_EXP430FR6989 -\ MSP_EXP430FR4133 MSP_EXP430FR2433 MSP_EXP430FR2355 CHIPSTICK_FR2433 -\ -\ SYSRSTIV decimal/hex values for MSP430FR5994 (device specific) -\ ---------------------------------------------------------- -\ #00 $00 No interrupt pending -\ #02 $02 Brownout (BOR) -\ #04 $04 RSTIFG RST/NMI (BOR) -\ #06 $06 PMMSWBOR software BOR (BOR) -\ #08 $08 LPMx.5 wake up (BOR) -\ #10 $0A violation memory protected areas (BOR) -\ #12 $0C Reserved -\ #14 $0E SVSHIFG SVSH event (BOR) -\ #16 $10 Reserved -\ #18 $12 Reserved -\ #20 $14 PMMSWPOR software POR (POR) -\ #22 $16 WDTIFG watchdog timeout (PUC) -\ #24 $18 WDTPW password violation (PUC) -\ #26 $1A FRCTLPW password violation (PUC) -\ #28 $1C Uncorrectable FRAM bit error detection (PUC) -\ #30 $1E Peripheral area fetch (PUC) -\ #32 $20 PMMPW PMM password violation (PUC) -\ #34 $22 MPUPW MPU password violation (PUC) -\ #36 $24 CSPW CS password violation (PUC) -\ #38 $26 MPUSEGIPIFG encapsulated IP memory segment violation (PUC) -\ #40 $28 MPUSEGIIFG information memory segment violation (PUC) -\ #42 $2A MPUSEG1IFG segment 1 memory violation (PUC) -\ #44 $2C MPUSEG2IFG segment 2 memory violation (PUC) -\ #46 $2E MPUSEG3IFG segment 3 memory violation (PUC) - - - - - -\ SYSRSTIV values added by FAST FORTH -\ ----------------------------------- -\ 05 reset after compilation of FAST FORTH kernel -\ -1 hardware DEEP RESET: restores state of the lastest FastForth flashed - - -\ note -\ Origin 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, the SYSRSTIV value is on -\ the paramater stack, ready to test - -\ -------------------------------------------------------------------------------- -\ WARNING ! -\ -------------------------------------------------------------------------------- -\ it is not recommended to compile then execute a word to perform the bootstrap -\ because the risk of crushing thereafter. Interpreting mode as below is required: -\ -------------------------------------------------------------------------------- - - -PWR_STATE - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -\ it's an example: - -$04 = [IF] \ if origin of SYSRST is - LOAD" SD_TEST.4TH" -[THEN] diff --git a/MSP430-FORTH/MSP_EXP430FR5994/CHNGBAUD.4TH b/MSP430-FORTH/MSP_EXP430FR5994/CHNGBAUD.4TH deleted file mode 100644 index d33d5e8..0000000 --- a/MSP430-FORTH/MSP_EXP430FR5994/CHNGBAUD.4TH +++ /dev/null @@ -1,425 +0,0 @@ - -; ------------ -; CHNGBAUD.4th for MSP_EXP430FR5994 -; ------------ - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] AND [IF] -CODE AND -AND @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 0= [IF] -CODE 0= -SUB #1,R14 -SUBC R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -: I2CTERM_ABORT -$0D EMIT -1 ABORT" <-- Ouch! unexpected target with I2C TERMINAL" -; - -$1812 @ $7800 AND 0= [IF] ; unexpected I2C TERMINAL ? -I2CTERM_ABORT -[THEN] - -[UNDEFINED] DUP [IF] -CODE DUP -BW1 SUB #2,R15 - MOV R14,0(R15) - MOV @R13+,R0 -ENDCODE - -CODE ?DUP -CMP #0,R14 -0<> ?GOTO BW1 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] DROP [IF] -CODE DROP -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] OVER [IF] -CODE OVER -MOV R14,-2(R15) -MOV @R15,R14 -SUB #2,R15 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] ! [IF] -CODE ! -MOV @R15+,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 1+ [IF] -CODE 1+ -ADD #1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] U/ [IF] -CODE U/ -SUB #2,R15 -MOV #0,0(R15) -CALL #$4074 -MOV @R15,R14 -ADD #4,R15 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] >R [IF] -CODE >R -PUSH R14 -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] R> [IF] -CODE R> -SUB #2,R15 -MOV R14,0(R15) -MOV @R1+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 -ELSE - XOR #-1,R14 -THEN -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] < [IF] -CODE < - SUB @R15+,R14 - S< ?GOTO FW1 - 0<> IF -BW1 MOV #-1,R14 - THEN - MOV @R13+,R0 -ENDCODE - -CODE > - SUB @R15+,R14 - S< ?GOTO BW1 -FW1 AND #0,R14 - MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] DO [IF] -CODE DO -SUB #2,R15 -MOV R14,0(R15) -ADD #2,&$1DC6 -MOV &$1DC6,R14 -MOV #$404C,-2(R14) -ADD #2,&$1C00 -MOV &$1C00,R10 -MOV #0,0(R10) -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE LOOP - MOV #$406E,R9 -BW1 ADD #4,&$1DC6 - MOV &$1DC6,R10 - MOV R9,-4(R10) - MOV R14,-2(R10) -BEGIN - MOV &$1C00,R14 - SUB #2,&$1C00 - MOV @R14,R14 - CMP #0,R14 -0<> WHILE - MOV R10,0(R14) -REPEAT - MOV @R15+,R14 - MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE +LOOP -MOV #$405C,R9 -GOTO BW1 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] CASE [IF] -: CASE 0 ; IMMEDIATE - -: OF -1+ ->R -POSTPONE OVER POSTPONE = -POSTPONE IF -POSTPONE DROP -R> -; IMMEDIATE - -: ENDOF ->R -POSTPONE ELSE -R> -; IMMEDIATE - -: ENDCASE -POSTPONE DROP -0 DO - POSTPONE THEN -LOOP -; IMMEDIATE -[THEN] - -[UNDEFINED] S_ [IF] -CODE S_ -MOV #0,&$1DB4 -COLON -$4018 , -$20 WORD -HI2LO -MOV.B @R14,R14 -ADD #1,R14 -BIT #1,R14 -ADDC R14,&$1DC6 -MOV @R15+,R14 -MOV @R1+,R13 -MOV #$20,&$1DB4 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ESC [IF] -CODE ESC -CMP #0,&$1DBE -0= IF MOV @R13+,R0 -THEN -COLON -$1B -POSTPONE LITERAL -POSTPONE EMIT -POSTPONE S_ -POSTPONE TYPE -; IMMEDIATE -[THEN] - -: BAD_MHz -$20 DUP EMIT - ABORT" only for 1,4,8,16,24 MHz MCLK!" -; - -: OVR_BAUDS -$20 DUP EMIT ESC [7m - ." with MCLK = " $1806 @ 1000 U/ . - ABORT" MHz? don't dream!" -; - -: CHNGBAUD -PWR_STATE -ECHO -42 0 DO CR LOOP -ESC [H - -$1806 @ DUP >R -." target MCLK = " 1000 U/ . ." MHz" CR -." choose your baudrate:" CR -." 0 --> 6 MBds" CR -." 1 --> 5 MBds" CR -." 2 --> 4 MBds" CR -." 3 --> 2457600 Bds" CR -." 4 --> 921600 Bds" CR -." 5 --> 460800 Bds" CR -." 6 --> 230400 Bds" CR -." 7 --> 115200 Bds" CR -." 8 --> 38400 Bds" CR -." 9 --> 19200 Bds" CR -." A --> 9600 Bds" CR -." other --> abort" CR -." your choice: " -KEY - -CASE -#48 OF ." 6 MBds" - R> CASE - #24000 OF $4 $0 - ENDOF - 24000 < - IF OVR_BAUDS - THEN BAD_MHz - ENDCASE - ENDOF -#49 OF ." 5 MBds" - R> CASE - #24000 OF $4 $EE00 ENDOF - #16000 OF $3 $2100 ENDOF - 16000 < - IF OVR_BAUDS - THEN BAD_MHz - ENDCASE - ENDOF -#50 OF ." 4 MBds" - R> CASE - #24000 OF $6 $0 ENDOF - #16000 OF $4 $0 ENDOF - 16000 < - IF OVR_BAUDS - THEN BAD_MHz - ENDCASE - ENDOF -#51 OF ." 2457600 Bds" - R> CASE - #24000 OF $9 $DD00 ENDOF - #16000 OF $6 $AA00 ENDOF - #8000 OF $3 $4400 ENDOF - 8000 < - IF OVR_BAUDS - THEN BAD_MHz - ENDCASE - ENDOF -#52 OF ." 921600 Bds" - R> CASE - #24000 OF $1 $00A1 ENDOF - #16000 OF $11 $4A00 ENDOF - #8000 OF $8 $D600 ENDOF - #4000 OF $4 $4900 ENDOF - 4000 < - IF OVR_BAUDS - THEN BAD_MHz - ENDCASE - ENDOF -#53 OF ." 460800 Bds" - R> CASE - #24000 OF $6 $0001 ENDOF - #16000 OF $2 $BB21 ENDOF - #8000 OF $11 $4A00 ENDOF - #4000 OF $8 $D600 ENDOF - 4000 < - IF OVR_BAUDS - THEN BAD_MHz - ENDCASE - ENDOF -#54 OF ." 230400 Bds" - R> CASE - #24000 OF $3 $0241 ENDOF - #16000 OF $4 $5551 ENDOF - #8000 OF $2 $BB21 ENDOF - #4000 OF $11 $4A00 ENDOF - #1000 OF $4 $4900 ENDOF - BAD_MHz - ENDCASE - ENDOF -#55 OF ." 115200 Bds" - R> CASE - #24000 OF $0D $4901 ENDOF - #16000 OF $8 $F7A1 ENDOF - #8000 OF $4 $5551 ENDOF - #4000 OF $2 $BB21 ENDOF - #1000 OF $8 $D600 ENDOF - BAD_MHz - ENDCASE - ENDOF -#56 OF ." 38400 Bds" - R> CASE - #24000 OF $27 $0011 ENDOF - #16000 OF $1A $D601 ENDOF - #8000 OF $0D $4901 ENDOF - #4000 OF $6 $2081 ENDOF - #1000 OF $1 $00A1 ENDOF - BAD_MHz - ENDCASE - ENDOF -#57 OF ." 19200 Bds" - R> CASE - #24000 OF $4E $0021 ENDOF - #16000 OF $34 $4911 ENDOF - #8000 OF $1A $D601 ENDOF - #4000 OF $0D $4901 ENDOF - #1000 OF $3 $0241 ENDOF - BAD_MHz - ENDCASE - ENDOF -#65 OF ." 9600 Bds" - R> CASE - #24000 OF $9C $0041 ENDOF - #16000 OF $68 $D621 ENDOF - #8000 OF $34 $4911 ENDOF - #4000 OF $1A $D601 ENDOF - #1000 OF $6 $2081 ENDOF - BAD_MHz - ENDCASE - ENDOF - ." abort" CR ABORT -ENDCASE -$1804 ! -$1802 ! -CR ESC [7m -." Change baudrate in Teraterm, save its setup, then reset target." -; - -CHNGBAUD diff --git a/MSP430-FORTH/MSP_EXP430FR5994/CORDIC.4TH b/MSP430-FORTH/MSP_EXP430FR5994/CORDIC.4TH deleted file mode 100644 index 5c9561a..0000000 --- a/MSP430-FORTH/MSP_EXP430FR5994/CORDIC.4TH +++ /dev/null @@ -1,499 +0,0 @@ - -; ---------- -; CORDIC.4th for MSP_EXP430FR5994 -; ---------- -; ----------------------------------------------------------- -; requires FIXPOINT_INPUT kernel addon, see forthMSP430FR.asm -; ----------------------------------------------------------- - -PWR_STATE - -[DEFINED] {CORDIC} [IF] {CORDIC} [THEN] - -MARKER {CORDIC} - - - -CREATE T_ARCTAN -11520 , -6801 , -3593 , -1824 , -916 , -458 , -229 , -115 , -57 , -29 , -14 , -7 , -4 , -2 , -1 , - -CREATE T_SCALE -46340 , -41448 , -40211 , -39900 , -39822 , -39803 , -39798 , -39797 , -39797 , -39797 , -39797 , -39797 , -39797 , -39797 , -39797 , - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] R> [IF] -CODE R> -SUB #2,R15 -MOV R14,0(R15) -MOV @R1+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] U< [IF] -CODE U< -SUB @R15+,R14 -0<> IF - MOV #-1,R14 - U< IF - AND #0,R14 - THEN -THEN -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] DABS [IF] -CODE DABS -AND #-1,R14 -S< IF - XOR #-1,0(R15) - XOR #-1,R14 - ADD #1,0(R15) - ADDC #0,R14 -THEN -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] HOLDS [IF] -CODE HOLDS - MOV @R15+,R9 -BW3 ADD R14,R9 - MOV &$1DB2,R8 -BEGIN SUB #1,R9 - SUB #1,R14 -U>= WHILE SUB #1,R8 - MOV.B @R9,0(R8) -REPEAT MOV R8,&$1DB2 - MOV @R15+,R14 - MOV @R13+,R0 -ENDCODE -[THEN] - -$81EF $1A04 @ U< -$1A04 @ $81F3 U< -= [IF] ; MSP430FR413x subfamily without hardware_MPY - -[UNDEFINED] F#S [IF] -CODE F#S - MOV @R15,R12 - MOV #0,R11 - PUSHM #3,R13 - MOV 2(R15),0(R15) - MOV R14,2(R15) -BEGIN MOV &$1DDC,R14 - LO2HI - UM* - HI2LO - CMP #10,R14 - U>= IF ADD #7,R14 - THEN ADD #$30,R14 - MOV @R1,R11 - MOV.B R14,$1D90(R11) - ADD #1,R11 - MOV R11,0(R1) - CMP 2(R15),R11 -U>= UNTIL POPM #3,R13 - MOV R11,R14 - MOV R12,2(R15) - MOV #0,0(R15) - MOV #$1D90,R9 - GOTO BW3 -ENDCODE -[THEN] - -ASM XSCALE -SUB #4,R15 -MOV R14,2(R15) -MOV R9,0(R15) -MOV T_SCALE(R10),R14 -MOV @R15,R12 -CMP #0,R12 -S< IF - XOR #-1,0(R15) - ADD #1,0(R15) -THEN -PUSHM #6,R13 -LO2HI -UM* -HI2LO -POPM #6,R13 -CMP #0,R12 -S< IF - XOR #-1,0(R15) - XOR #-1,R14 - ADD #1,0(R15) - ADDC #0,R14 -THEN -MOV R14,R9 -ADD #2,R15 -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - - - -[ELSE] ; hardware multiplier - -[UNDEFINED] F#S [IF] -CODE F#S - MOV 2(R15),R9 - MOV @R15,2(R15) - MOV R9,0(R15) - MOV R14,R11 - MOV #0,R12 -BEGIN MOV @R15,&$4C0 - MOV &$1DDC,&$4C8 - MOV &$4E4,0(R15) - MOV &$4E6,R14 - CMP #10,R14 - U>= IF ADD #7,R14 - THEN ADD #$30,R14 - MOV.B R14,$1D90(R12) - ADD #1,R12 - CMP R11,R12 -0= UNTIL MOV R11,R14 - MOV #0,0(R15) - MOV #$1D90,R9 - GOTO BW3 -ENDCODE -[THEN] - -ASM XSCALE -MOV R9,&$4C0 -MOV T_SCALE(R10),&$4C8 -MOV &$4E6,R9 -MOV @R1+,R0 -ENDASM - -[THEN] ; endcase of hardware multiplier - - -[UNDEFINED] F. [IF] -CODE F. -MOV R14,R12 -MOV #4,R11 -MOV &$1DDC,R10 -CMP ##10,R10 -0= IF - ADD #1,R11 -ELSE - CMP #%10,R10 - 0= IF - MOV #16,R11 - THEN -THEN -PUSHM #3,R13 -LO2HI - <# DABS - R> F#S - $2C HOLD - #S - R> SIGN #> - TYPE $20 EMIT -; - -[THEN] - -CODE POL2REC -PUSH R13 -MOV @R15+,R8 -SWPB R8 -AND #$00FF,R8 -SWPB R14 -AND #$FF00,R14 -BIS R8,R14 -MOV #-1,R13 -MOV @R15,R9 -MOV #0,R8 - BEGIN - ADD #1,R13 - MOV R9,R12 - MOV R8,R11 - MOV #0,R10 - GOTO FW1 - BEGIN - RRA R12 - RRA R11 - ADD #1,R10 -FW1 CMP R13,R10 - 0= UNTIL - ADD R10,R10 - CMP #0,R14 - 0>= IF - SUB R11,R9 - ADD R12,R8 - SUB T_ARCTAN(R10),R14 - ELSE - ADD R11,R9 - SUB R12,R8 - ADD T_ARCTAN(R10),R14 - THEN - CMP #0,R14 - 0<> WHILE - CMP #14,R13 - 0= UNTIL - THEN -CALL #XSCALE -MOV R9,0(R15) -MOV R8,R9 -CALL #XSCALE -MOV R9,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE - - -CODE REC2POL -MOV @R15,R9 -MOV R14,R8 -MOV R8,R11 -CMP #0,R11 -S< IF - XOR #-1,R11 - ADD #1,R11 -THEN -MOV #-1,R14 -MOV R9,R12 -ADD R11,R12 -0= IF - LO2HI - ABORT" null inputs" - HI2LO -THEN -CMP R9,R11 -U< IF - MOV R9,R11 -THEN -CMP #16384,R11 - U>= IF - LO2HI - ABORT" x or |y| >= 16384" - HI2LO - THEN -MOV #1,R12 -RLAM #3,R11 -GOTO FW1 -BEGIN - ADD R9,R9 - ADD R8,R8 - ADD R12,R12 - ADD R11,R11 -FW1 -U>= UNTIL -PUSHM #2,R13 -MOV #-1,R13 -MOV #0,R14 - BEGIN - ADD #1,R13 - MOV R9,R12 - MOV R8,R11 - MOV #0,R10 - GOTO FW1 - BEGIN - RRA R12 - RRA R11 - ADD #1,R10 -FW1 CMP R13,R10 - 0= UNTIL - ADD R10,R10 - CMP #0,R8 - 0>= IF - ADD R11,R9 - SUB R12,R8 - ADD T_ARCTAN(R10),R14 - ELSE - SUB R11,R9 - ADD R12,R8 - SUB T_ARCTAN(R10),R14 - THEN - CMP #0,R8 - 0<> WHILE - CMP #14,R13 - 0= UNTIL - THEN -CALL #XSCALE -POPM #2,R13 -GOTO FW1 -BEGIN - RRA R9 -FW1 RRA R12 -U>= UNTIL -MOV R9,0(R15) -MOV R14,R8 -SWPB R14 -AND #$00FF,R14 -SXT R14 -SWPB R8 -AND #$FF00,R8 -SUB #2,R15 -MOV R8,0(R15) -MOV @R13+,R0 -ENDCODE - -PWR_HERE - -[UNDEFINED] SWAP [IF] -CODE SWAP -MOV @R15,R10 -MOV R14,0(R15) -MOV R10,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] ROT [IF] -CODE ROT -MOV @R15,R10 -MOV R14,0(R15) -MOV 2(R15),R14 -MOV R10,2(R15) -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] DO [IF] -CODE DO -SUB #2,R15 -MOV R14,0(R15) -ADD #2,&$1DC6 -MOV &$1DC6,R14 -MOV #$404C,-2(R14) -ADD #2,&$1C00 -MOV &$1C00,R10 -MOV #0,0(R10) -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE LOOP - MOV #$406E,R9 -BW1 ADD #4,&$1DC6 - MOV &$1DC6,R10 - MOV R9,-4(R10) - MOV R14,-2(R10) -BEGIN - MOV &$1C00,R14 - SUB #2,&$1C00 - MOV @R14,R14 - CMP #0,R14 -0<> WHILE - MOV R10,0(R14) -REPEAT - MOV @R15+,R14 - MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE +LOOP -MOV #$405C,R9 -GOTO BW1 -ENDCODE IMMEDIATE -[THEN] - -: 1000CORDIC -500 0 DO - POL2REC REC2POL -LOOP -; - -ECHO - -; ----------------------------------------------------------- -; requires FIXPOINT_INPUT kernel addon, see forthMSP430FR.asm -; ----------------------------------------------------------- - -10000 89,0 POL2REC . . ; sin, cos --> -10000 75,0 POL2REC . . ; sin, cos --> -10000 60,0 POL2REC . . ; sin, cos --> -10000 45,0 POL2REC . . ; sin, cos --> -10000 30,0 POL2REC . . ; sin, cos --> -10000 15,0 POL2REC . . ; sin, cos --> -10000 1,0 POL2REC . . ; sin, cos --> -16384 30,0 POL2REC SWAP . . ; x, y --> -16384 45,0 POL2REC SWAP . . ; x, y --> -16384 60,0 POL2REC SWAP . . ; x, y --> - - -2 1 REC2POL F. . ; phase module --> -2 -1 REC2POL F. . ; phase module --> -20 10 REC2POL F. . ; phase module --> -20 -10 REC2POL F. . ; phase module --> -200 100 REC2POL F. . ; phase module --> -100 -100 REC2POL F. . ; phase module --> -2000 1000 REC2POL F. . ; phase module --> -1000 -1000 REC2POL F. . ; phase module --> -16000 8000 REC2POL F. . ; phase module --> -16000 -8000 REC2POL F. . ; phase module --> -16000 0 REC2POL F. . ; phase module --> -0 16000 REC2POL F. . ; phase module --> - - -10000 89,0 POL2REC REC2POL ROT . F. -10000 75,0 POL2REC REC2POL ROT . F. -10000 60,0 POL2REC REC2POL ROT . F. -10000 45,0 POL2REC REC2POL ROT . F. -10000 30,0 POL2REC REC2POL ROT . F. -10000 26,565 POL2REC REC2POL ROT . F. -10000 15,0 POL2REC REC2POL ROT . F. -10000 14,036 POL2REC REC2POL ROT . F. -10000 7,125 POL2REC REC2POL ROT . F. -10000 1,0 POL2REC REC2POL ROT . F. - -10000 89,0 1000CORDIC ROT . F. -10000 75,0 1000CORDIC ROT . F. -10000 60,0 1000CORDIC ROT . F. -10000 45,0 1000CORDIC ROT . F. -10000 30,0 1000CORDIC ROT . F. -10000 26,565 1000CORDIC ROT . F. -10000 15,0 1000CORDIC ROT . F. -10000 14,036 1000CORDIC ROT . F. -10000 7,125 1000CORDIC ROT . F. -10000 1,0 1000CORDIC ROT . F. - -PWR_STATE diff --git a/MSP430-FORTH/MSP_EXP430FR5994/CORETEST.4TH b/MSP430-FORTH/MSP_EXP430FR5994/CORETEST.4TH deleted file mode 100644 index 89b63ab..0000000 --- a/MSP430-FORTH/MSP_EXP430FR5994/CORETEST.4TH +++ /dev/null @@ -1,1113 +0,0 @@ - -; ------------------------------------- -; CORETEST.4TH for any FastForth target -; ------------------------------------- - -: COMPNOTFOUND -$0D EMIT \ return to column 1 -1 ABORT" {CORE_ANS} word set not found!" -; - -[UNDEFINED] {CORE_ANS} [IF] ; {CORE_ANS} is not found ? -COMPNOTFOUND -[THEN] - -: CORETESTSUCCESS -$0A BASE ! -$0D EMIT \ return to column 1 -1 ABORT" CORE tests success!" -; - -\ 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 TRUE ABORT" INCORRECT RESULT" THEN \ jmt : abort with colorised message - LOOP - THEN - ELSE \ DEPTH MISMATCH -\ S" WRONG NUMBER OF RESULTS: " ERROR \ jmt - TRUE ABORT" WRONG NUMBER OF RESULTS" \ jmt : abort with colorised message - THEN ; - -: TESTING \ ( -- ) TALKING COMMENT. - SOURCE VERBOSE @ - IF DUP >R TYPE CR R> >IN ! -\ ELSE >IN ! DROP [CHAR] * EMIT - ELSE >IN ! DROP \ [CHAR] * EMIT - THEN ; - -ECHO HEX - -\ 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?... - -\ ------------------------------------------------------------------------ -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 -1S CONSTANT - -T{ 0 0= -> }T -T{ 1 0= -> }T -T{ 2 0= -> }T -T{ -1 0= -> }T -T{ MAX-UINT 0= -> }T -T{ MIN-INT 0= -> }T -T{ MAX-INT 0= -> }T - -T{ 0 0 = -> }T -T{ 1 1 = -> }T -T{ -1 -1 = -> }T -T{ 1 0 = -> }T -T{ -1 0 = -> }T -T{ 0 1 = -> }T -T{ 0 -1 = -> }T - -T{ 0 0< -> }T -T{ -1 0< -> }T -T{ MIN-INT 0< -> }T -T{ 1 0< -> }T -T{ MAX-INT 0< -> }T - -T{ 0 1 < -> }T -T{ 1 2 < -> }T -T{ -1 0 < -> }T -T{ -1 1 < -> }T -T{ MIN-INT 0 < -> }T -T{ MIN-INT MAX-INT < -> }T -T{ 0 MAX-INT < -> }T -T{ 0 0 < -> }T -T{ 1 1 < -> }T -T{ 1 0 < -> }T -T{ 2 1 < -> }T -T{ 0 -1 < -> }T -T{ 1 -1 < -> }T -T{ 0 MIN-INT < -> }T -T{ MAX-INT MIN-INT < -> }T -T{ MAX-INT 0 < -> }T - -T{ 0 1 > -> }T -T{ 1 2 > -> }T -T{ -1 0 > -> }T -T{ -1 1 > -> }T -T{ MIN-INT 0 > -> }T -T{ MIN-INT MAX-INT > -> }T -T{ 0 MAX-INT > -> }T -T{ 0 0 > -> }T -T{ 1 1 > -> }T -T{ 1 0 > -> }T -T{ 2 1 > -> }T -T{ 0 -1 > -> }T -T{ 1 -1 > -> }T -T{ 0 MIN-INT > -> }T -T{ MAX-INT MIN-INT > -> }T -T{ MAX-INT 0 > -> }T - -T{ 0 1 U< -> }T -T{ 1 2 U< -> }T -T{ 0 MID-UINT U< -> }T -T{ 0 MAX-UINT U< -> }T -T{ MID-UINT MAX-UINT U< -> }T -T{ 0 0 U< -> }T -T{ 1 1 U< -> }T -T{ 1 0 U< -> }T -T{ 2 1 U< -> }T -T{ MID-UINT 0 U< -> }T -T{ MAX-UINT 0 U< -> }T -T{ MAX-UINT MID-UINT U< -> }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< -> }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< -> }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< -> }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 < -> }T -T{ 1 CHARS 1 CELLS > -> }T -( TBD: HOW TO FIND NUMBER OF BITS? ) - -( CELLS >= 1 AU, INTEGRAL MULTIPLE OF CHAR SIZE, >= 16 BITS ) -T{ 1 CELLS 1 < -> }T -T{ 1 CELLS 1 CHARS MOD -> 0 }T -T{ 1S BITS 10 < -> }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= -> }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 -> }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 UNLOOP EXIT THEN - SWAP CHAR+ SWAP CHAR+ - LOOP - THEN - 2DROP \ IF WE GET HERE, STRINGS MATCH - ELSE - R> DROP 2DROP \ LENGTHS MISMATCH - THEN ; - -: GP1 <# 41 HOLD 42 HOLD 0 0 #> S" BA" S= ; -T{ GP1 -> }T - -: GP2 <# -1 SIGN 0 SIGN -1 SIGN 0 0 #> S" --" S= ; -T{ GP2 -> }T - -: GP3 <# 1 0 # # #> S" 01" S= ; -T{ GP3 -> }T - -: GP4 <# 1 0 #S #> S" 1" S= ; -T{ GP4 -> }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 @ - 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 -> }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 -> }T - -: GP7 - BASE @ >R MAX-BASE BASE ! - - 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 -> }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: " -ABUF 80 \ ACCEPT \ JMT -['] ACCEPT DUP @ $4030 = \ JMT: if CFA content = $4030 (MOV @PC+,PC), ACCEPT is deferred -IF >BODY \ JMT: find default part of deferred ACCEPT -THEN EXECUTE \ JMT: execute ACCEPT - CR ." RECEIVED: " [CHAR] " EMIT - ABUF SWAP TYPE [CHAR] " EMIT CR -; - -T{ ACCEPT-TEST -> }T -\ ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba -\ ------------------------------------------------------------------------ -TESTING DICTIONARY SEARCH RULES - -T{ : GDX 123 ; : GDX GDX 234 ; -> }T - -T{ GDX -> 123 234 }T - -\ ------------------------------------------------------------------------ -TESTING TO VALUE - -T{ 111 VALUE v1 -> }T -T{ -999 VALUE v2 -> }T -T{ v1 -> 111 }T -T{ v2 -> -999 }T -T{ 222 TO v1 -> }T -T{ v1 -> 222 }T -T{ : vd1 v1 ; -> }T -T{ vd1 -> 222 }T - -T{ : vd2 TO v2 ; -> }T -T{ v2 -> -999 }T -T{ -333 vd2 -> }T -T{ v2 -> -333 }T -T{ v1 -> 222 }T - - -CR .( End of Core word set tests) - -CORETESTSUCCESS diff --git a/MSP430-FORTH/MSP_EXP430FR5994/CORE_ANS.4TH b/MSP430-FORTH/MSP_EXP430FR5994/CORE_ANS.4TH deleted file mode 100644 index 804b285..0000000 --- a/MSP430-FORTH/MSP_EXP430FR5994/CORE_ANS.4TH +++ /dev/null @@ -1,1050 +0,0 @@ - -; ----------------------------------------------------- -; CORE_ANS.4th for MSP_EXP430FR5994 -; ----------------------------------------------------- -; words complement to pass CORETEST.4TH - -PWR_STATE - -[DEFINED] {CORE_ANS} [IF] {CORE_ANS} [THEN] - -[UNDEFINED] {CORE_ANS} [IF] - -MARKER {CORE_ANS} - -[UNDEFINED] + [IF] -CODE + -ADD @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] - [IF] -CODE - -SUB @R15+,R14 -XOR #-1,R14 -ADD #1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] ! [IF] -CODE ! -MOV @R15+,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] DUP [IF] -CODE DUP -BW1 SUB #2,R15 - MOV R14,0(R15) - MOV @R13+,R0 -ENDCODE - -CODE ?DUP -CMP #0,R14 -0<> ?GOTO BW1 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] EXIT [IF] -CODE EXIT -MOV @R1+,R13 -MOV @R13+,R0 - -ENDCODE -[THEN] - -[UNDEFINED] DEPTH [IF] -CODE DEPTH -MOV R14,-2(R15) -MOV #$1C80,R14 -SUB R15,R14 -RRA R14 -SUB #2,R15 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] SWAP [IF] -CODE SWAP -MOV @R15,R10 -MOV R14,0(R15) -MOV R10,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] DROP [IF] -CODE DROP -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] NIP [IF] -CODE NIP -ADD #2,R15 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] >R [IF] -CODE >R -PUSH R14 -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] R> [IF] -CODE R> -SUB #2,R15 -MOV R14,0(R15) -MOV @R1+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] ! [IF] -CODE ! -MOV @R15+,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] C@ [IF] -CODE C@ -MOV.B @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] C! [IF] -CODE C! -MOV.B @R15+,0(R14) -ADD #1,R15 -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] C, [IF] -CODE C, -MOV &$1DC6,R10 -MOV.B R14,0(R10) -ADD #1,&$1DC6 -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 0= [IF] -CODE 0= -SUB #1,R14 -SUBC R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 0< [IF] -CODE 0< -ADD R14,R14 -SUBC R14,R14 -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] U< [IF] -CODE U< -SUB @R15+,R14 -0<> IF - MOV #-1,R14 - U< IF - AND #0,R14 - THEN -THEN -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] < [IF] -CODE < - SUB @R15+,R14 - S< ?GOTO FW1 - 0<> IF -BW1 MOV #-1,R14 - THEN - MOV @R13+,R0 -ENDCODE - -CODE > - SUB @R15+,R14 - S< ?GOTO BW1 -FW1 AND #0,R14 - MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] BEGIN [IF] -CODE BEGIN - MOV #$402C,R0 -ENDCODE IMMEDIATE - -CODE UNTIL - MOV #$4042,R9 -BW1 ADD #4,&$1DC6 - MOV &$1DC6,R10 - MOV R9,-4(R10) - MOV R14,-2(R10) - MOV @R15+,R14 - MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE AGAIN -MOV #$403E,R9 -GOTO BW1 -ENDCODE IMMEDIATE - -: WHILE -POSTPONE IF SWAP -; IMMEDIATE - -: REPEAT -POSTPONE AGAIN POSTPONE THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] DO [IF] -CODE DO -SUB #2,R15 -MOV R14,0(R15) -ADD #2,&$1DC6 -MOV &$1DC6,R14 -MOV #$404C,-2(R14) -ADD #2,&$1C00 -MOV &$1C00,R10 -MOV #0,0(R10) -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE LOOP - MOV #$406E,R9 -BW1 ADD #4,&$1DC6 - MOV &$1DC6,R10 - MOV R9,-4(R10) - MOV R14,-2(R10) -BEGIN - MOV &$1C00,R14 - SUB #2,&$1C00 - MOV @R14,R14 - CMP #0,R14 -0<> WHILE - MOV R10,0(R14) -REPEAT - MOV @R15+,R14 - MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE +LOOP -MOV #$405C,R9 -GOTO BW1 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] I [IF] -CODE I -SUB #2,R15 -MOV R14,0(R15) -MOV @R1,R14 -SUB 2(R1),R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] J [IF] -CODE J -SUB #2,R15 -MOV R14,0(R15) -MOV 4(R1),R14 -SUB 6(R1),R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] UNLOOP [IF] -CODE UNLOOP -ADD #4,R1 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] LEAVE [IF] -CODE LEAVE -MOV &$1DC6,R10 -MOV #UNLOOP,0(R10) -MOV #$403E,2(R10) -ADD #6,&$1DC6 -ADD #2,&$1C00 -ADD #4,R10 -MOV &$1C00,R9 -MOV R10,0(R9) -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] AND [IF] -CODE AND -AND @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] OR [IF] -CODE OR -BIS @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] XOR [IF] -CODE XOR -XOR @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] S>D [IF] -: S>D - DUP 0< -; -[THEN] - -[UNDEFINED] + [IF] -CODE + -ADD @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] - [IF] -CODE - -SUB @R15+,R14 -XOR #-1,R14 -ADD #1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 1+ [IF] -CODE 1+ -ADD #1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 1- [IF] -CODE 1- -SUB #1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] INVERT [IF] -CODE INVERT -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] LSHIFT [IF] -CODE LSHIFT - MOV @R15+,R10 - AND #$1F,R14 -0<> IF - BEGIN ADD R10,R10 - SUB #1,R14 - 0= UNTIL -THEN MOV R10,R14 - MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] RSHIFT [IF] -CODE RSHIFT - MOV @R15+,R10 - AND #$1F,R14 -0<> IF - BEGIN BIC #1,R2 - RRC R10 - SUB #1,R14 - 0= UNTIL -THEN MOV R10,R14 - MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] MAX [IF] -CODE MAX - CMP @R15,R14 - S< ?GOTO FW1 -BW1 ADD #2,R15 - MOV @R13+,R0 -ENDCODE - -CODE MIN - CMP @R15,R14 - S< ?GOTO BW1 -FW1 MOV @R15+,R14 - MOV @R13+,R0 -ENDCODE -[THEN] - -[THEN] - -[UNDEFINED] 2* [IF] -CODE 2* -ADD R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 2/ [IF] -CODE 2/ -RRA R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] M* [IF] - -$1A00 4 + @ $81F3 U< -$81EF $1A00 4 + @ U< -= [IF] ; MSP430FR2xxx|MSP430FR4xxx subfamilies without hardware_MPY - -CODE M* -MOV @R15,R12 -CMP #0,R12 -S< IF - XOR #-1,0(R15) - ADD #1,0(R15) -THEN -XOR R14,R12 -CMP #0,R14 -S< IF - XOR #-1,R14 - ADD #1,R14 -THEN -PUSHM #2,R13 -LO2HI -UM* -HI2LO -POPM #2,R13 -CMP #0,R12 -S< IF - XOR #-1,0(R15) - XOR #-1,R14 - ADD #1,0(R15) - ADDC #0,R14 -THEN -MOV @R13+,R0 -ENDCODE - -[ELSE] ; MSP430FRxxxx with hardware_MPY - -CODE UM* - MOV @R15,&$4C0 -BW1 MOV R14,&$4C8 - MOV &$4E4,0(R15) - MOV &$4E6,R14 - MOV @R13+,R0 -ENDCODE - -CODE M* - MOV @R15,&$4C2 - GOTO BW1 -ENDCODE - -[THEN] - -[THEN] - -[UNDEFINED] UM/MOD [IF] -CODE UM/MOD - PUSH #DROP - MOV #$4074,R0 -ENDCODE -[THEN] - -[UNDEFINED] SM/REM [IF] -CODE SM/REM -MOV R14,R12 -MOV @R15,R11 -CMP #0,R14 -S< IF - XOR #-1,R14 - ADD #1,R14 -THEN -CMP #0,0(R15) -S< IF - XOR #-1,2(R15) - XOR #-1,0(R15) - ADD #1,2(R15) - ADDC #0,0(R15) -THEN -PUSHM #3,R13 -LO2HI - UM/MOD -HI2LO -POPM #3,R13 -CMP #0,R11 -S< IF - XOR #-1,0(R15) - ADD #1,0(R15) -THEN -XOR R12,R11 -CMP #0,R11 -S< IF - XOR #-1,R14 - ADD #1,R14 -THEN -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] NEGATE [IF] -CODE NEGATE -XOR #-1,R14 -ADD #1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] ABS [IF] -CODE ABS -CMP #0,R14 -0>= IF - MOV @R13+,R0 -THEN -MOV #NEGATE,R0 -ENDCODE -[THEN] - -[UNDEFINED] FM/MOD [IF] -: FM/MOD -SM/REM -HI2LO -CMP #0,0(R15) -0<> IF - CMP #1,R14 - S< IF - ADD R12,0(R15) - SUB #1,R14 - THEN -THEN -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] * [IF] -: * -M* DROP -; -[THEN] - -[UNDEFINED] /MOD [IF] -: /MOD ->R DUP 0< R> FM/MOD -; -[THEN] - -[UNDEFINED] / [IF] -: / ->R DUP 0< R> FM/MOD NIP -; -[THEN] - -[UNDEFINED] MOD [IF] -: MOD ->R DUP 0< R> FM/MOD DROP -; -[THEN] - -[UNDEFINED] */MOD [IF] -: */MOD ->R M* R> FM/MOD -; -[THEN] - -[UNDEFINED] */ [IF] -: */ ->R M* R> FM/MOD NIP -; -[THEN] - -[UNDEFINED] OVER [IF] -CODE OVER -MOV R14,-2(R15) -MOV @R15,R14 -SUB #2,R15 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] ROT [IF] -CODE ROT -MOV @R15,R10 -MOV R14,0(R15) -MOV 2(R15),R14 -MOV R10,2(R15) -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] R@ [IF] -CODE R@ -SUB #2,R15 -MOV R14,0(R15) -MOV @R1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 2@ [IF] -CODE 2@ -BW1 SUB #2,R15 - MOV 2(R14),0(R15) - MOV @R14,R14 - MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 2! [IF] -CODE 2! -BW2 MOV @R15+,0(R14) - MOV @R15+,2(R14) - MOV @R15+,R14 - MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 2DUP [IF] -CODE 2DUP -MOV R14,-2(R15) -MOV @R15,-4(R15) -SUB #4,R15 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 2DROP [IF] -CODE 2DROP -ADD #2,R15 -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 2SWAP [IF] -CODE 2SWAP -MOV @R15,R10 -MOV 4(R15),0(R15) -MOV R10,4(R15) -MOV R14,R10 -MOV 2(R15),R14 -MOV R10,2(R15) -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 2OVER [IF] -CODE 2OVER -SUB #4,R15 -MOV R14,2(R15) -MOV 8(R15),0(R15) -MOV 6(R15),R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -[UNDEFINED] ALIGNED [IF] -CODE ALIGNED -BIT #1,R14 -ADDC #0,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] ALIGN [IF] -CODE ALIGN -BIT #1,&$1DC6 -ADDC #0,&$1DC6 -MOV @R13+,R0 -ENDCODE -[THEN] - - -[UNDEFINED] CHARS [IF] -CODE CHARS -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CHAR+ [IF] -CODE CHAR+ -ADD #1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CELLS [IF] -CODE CELLS -ADD R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CELL+ [IF] -CODE CELL+ -ADD #2,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -[UNDEFINED] CHAR [IF] -: CHAR - $20 WORD 1+ C@ -; -[THEN] - -[UNDEFINED] [CHAR] [IF] -: [CHAR] - CHAR POSTPONE LITERAL -; IMMEDIATE -[THEN] - -[UNDEFINED] +! [IF] -CODE +! -ADD @R15+,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] MOVE [IF] -CODE MOVE -MOV R14,R10 -MOV @R15+,R8 -MOV @R15+,R9 -MOV @R15+,R14 -CMP #0,R10 -0<> IF - CMP R9,R8 - 0<> IF - U< IF - BEGIN - MOV.B @R9+,0(R8) - ADD #1,R8 - SUB #1,R10 - 0= UNTIL - MOV @R13+,R0 - THEN - ADD R10,R8 - ADD R10,R9 - BEGIN - SUB #1,R9 - SUB #1,R8 - MOV.B @R9,0(R8) - SUB #1,R10 - 0= UNTIL - THEN -THEN -MOV @R13+,R0 -ENDCODE -[THEN] - - -[UNDEFINED] FILL [IF] -CODE FILL -MOV @R15+,R9 -MOV @R15+,R10 -CMP #0,R9 -0<> IF - BEGIN - MOV.B R14,0(R10) - ADD #1,R10 - SUB #1,R9 - 0= UNTIL -THEN -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] HERE [IF] -CODE HERE -MOV #$402C,R0 -ENDCODE -[THEN] - -[UNDEFINED] ALLOT [IF] -CODE ALLOT -ADD R14,&$1DC6 -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -[UNDEFINED] HEX [IF] -CODE HEX -MOV #$10,&$1DDC -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] DECIMAL [IF] -CODE DECIMAL -MOV #$0A,&$1DDC -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] ( [IF] -: ( -$29 WORD DROP -; IMMEDIATE -[THEN] - -[UNDEFINED] .( [IF] -CODE .( -MOV #0,&$1DB4 -COLON -$29 WORD -COUNT TYPE -$20 $1DB4 ! -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] EXECUTE [IF] -CODE EXECUTE -PUSH R14 -MOV @R15+,R14 -MOV @R1+,R0 -ENDCODE -[THEN] - -[UNDEFINED] EVALUATE [IF] -CODE EVALUATE -MOV #$1DC0,R9 -MOV @R9+,R12 -MOV @R9+,R11 -MOV @R9+,R10 -PUSHM #4,R13 -LO2HI -TREAT -HI2LO -MOV @R1+,&$1DC4 -MOV @R1+,&$1DC2 -MOV @R1+,&$1DC0 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] RECURSE [IF] -CODE RECURSE -MOV &$1DC6,R9 -MOV &$1DBA,0(R9) -ADD #2,&$1DC6 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] SOURCE [IF] -CODE SOURCE -SUB #4,R15 -MOV R14,2(R15) -MOV &$1DC0,R14 -MOV &$1DC2,0(R15) -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] DOES> [IF] -CODE DOES> -MOV &$1DBA,R10 -MOV #$1285,0(R10) -MOV R13,2(R10) -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] VARIABLE [IF] -: VARIABLE -CREATE -HI2LO -MOV #$1287,-4(R10) -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] BASE [IF] -$1DDC CONSTANT BASE -[THEN] - -[UNDEFINED] >IN [IF] -$1DC4 CONSTANT >IN -[THEN] - -[UNDEFINED] PAD [IF] -$1CE4 CONSTANT PAD -[THEN] - -[UNDEFINED] BL [IF] -$20 CONSTANT BL -[THEN] - -[UNDEFINED] SPACE [IF] -: SPACE -$20 EMIT ; -[THEN] - -[UNDEFINED] SPACES [IF] -CODE SPACES -CMP #0,R14 -0<> IF - PUSH R13 - BEGIN - LO2HI - $20 EMIT - HI2LO - SUB #2,R13 - SUB #1,R14 - 0= UNTIL - MOV @R1+,R13 -THEN -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] TO [IF] -CODE TO -BIS #$200,R2 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] VALUE [IF] -: VALUE -CREATE , -DOES> -HI2LO -MOV @R1+,R13 -BIT #$200,R2 -0= IF - MOV @R14,R14 - MOV @R13+,R0 -THEN -BIC #$200,R2 -MOV @R15+,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -RST_HERE - -[THEN] - -ECHO -; CORE_ANS.4th for MSP_EXP430FR5994 loaded diff --git a/MSP430-FORTH/MSP_EXP430FR5994/DEEP_RST.4TH b/MSP430-FORTH/MSP_EXP430FR5994/DEEP_RST.4TH deleted file mode 100644 index e3a3940..0000000 --- a/MSP430-FORTH/MSP_EXP430FR5994/DEEP_RST.4TH +++ /dev/null @@ -1,16 +0,0 @@ - -; ------------ -; DEEP_RST.4th for MSP_EXP430FR5994 -; ------------ - -; restore signatures and vectors area - -[UNDEFINED] ! [IF] -CODE ! -MOV @R15+,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -ECHO -1 $1808 ! COLD diff --git a/MSP430-FORTH/MSP_EXP430FR5994/DOUBLE.4TH b/MSP430-FORTH/MSP_EXP430FR5994/DOUBLE.4TH deleted file mode 100644 index 76d8cfb..0000000 --- a/MSP430-FORTH/MSP_EXP430FR5994/DOUBLE.4TH +++ /dev/null @@ -1,1310 +0,0 @@ - -; ----------------------------------------------------- -; DOUBLE.4th for MSP_EXP430FR5994 -; ----------------------------------------------------- - -; ----------------------------------------------------------- -; requires DOUBLE_INPUT kernel addon, see forthMSP430FR.asm -; ----------------------------------------------------------- - -PWR_STATE - -[DEFINED] {DOUBLE} [IF] {DOUBLE} [THEN] - -MARKER {DOUBLE} - -[UNDEFINED] >R [IF] -CODE >R -PUSH R14 -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] R> [IF] -CODE R> -SUB #2,R15 -MOV R14,0(R15) -MOV @R1+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] ! [IF] -CODE ! -MOV @R15+,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] C@ [IF] -CODE C@ -MOV.B @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] SWAP [IF] -CODE SWAP -MOV @R15,R10 -MOV R14,0(R15) -MOV R10,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] OVER [IF] -CODE OVER -MOV R14,-2(R15) -MOV @R15,R14 -SUB #2,R15 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] ROT [IF] -CODE ROT -MOV @R15,R10 -MOV R14,0(R15) -MOV 2(R15),R14 -MOV R10,2(R15) -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] - [IF] -CODE - -SUB @R15+,R14 -XOR #-1,R14 -ADD #1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] < [IF] -CODE < - SUB @R15+,R14 - S< ?GOTO FW1 - 0<> IF -BW1 MOV #-1,R14 - THEN - MOV @R13+,R0 -ENDCODE - -CODE > - SUB @R15+,R14 - S< ?GOTO BW1 -FW1 AND #0,R14 - MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] TO [IF] -CODE TO -BIS #$400,R2 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] DOES> [IF] -CODE DOES> -MOV &$1DBA,R10 -MOV #$1285,0(R10) -MOV R13,2(R10) -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] SPACES [IF] -CODE SPACES -CMP #0,R14 -0<> IF - PUSH R13 - BEGIN - LO2HI - $20 EMIT - HI2LO - SUB #2,R13 - SUB #1,R14 - 0= UNTIL - MOV @R1+,R13 -THEN -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 2@ [IF] -CODE 2@ -SUB #2,R15 -MOV 2(R14),0(R15) -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 2! [IF] -CODE 2! -MOV @R15+,0(R14) -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 2DUP [IF] -CODE 2DUP -SUB #4,R15 -MOV R14,2(R15) -MOV 4(R15),0(R15) -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 2DROP [IF] -CODE 2DROP -ADD #2,R15 -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 2SWAP [IF] -CODE 2SWAP -MOV @R15,R10 -MOV 4(R15),0(R15) -MOV R10,4(R15) -MOV R14,R10 -MOV 2(R15),R14 -MOV R10,2(R15) -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 2OVER [IF] -CODE 2OVER -SUB #4,R15 -MOV R14,2(R15) -MOV 8(R15),0(R15) -MOV 6(R15),R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 2>R [IF] -CODE 2>R -PUSH @R15+ -PUSH R14 -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 2R@ [IF] -CODE 2R@ -SUB #4,R15 -MOV R14,2(R15) -MOV @R1,R14 -MOV 2(R1),0(R15) -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 2R> [IF] -CODE 2R> -SUB #4,R15 -MOV R14,2(R15) -MOV @R1+,R14 -MOV @R1+,0(R15) -MOV @R13+,R0 -ENDCODE -[THEN] - - -[UNDEFINED] D. [IF] -CODE D. -MOV #U.,R10 -ADD #10,R10 -MOV R10,R0 -ENDCODE -[THEN] - -[UNDEFINED] 2ROT [IF] -CODE 2ROT -MOV 8(R15),R9 -MOV 6(R15),R8 -MOV 4(R15),8(R15) -MOV 2(R15),6(R15) -MOV @R15,4(R15) -MOV R14,2(R15) -MOV R9,0(R15) -MOV R8,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] D>S [IF] -CODE D>S -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] D0= [IF] -CODE D0= -CMP #0,R14 -MOV #0,R14 -0= IF - CMP #0,0(R15) - 0= IF - MOV #-1,R14 - THEN -THEN -ADD #2,R15 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] D0< [IF] -CODE D0< -CMP #0,R14 -MOV #0,R14 -S< IF - MOV #-1,R14 -THEN -ADD #2,R15 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] D= [IF] -CODE D= -CMP R14,2(R15) -MOV #0,R14 -0= IF - CMP @R15,4(R15) - 0= IF - MOV #-1,R14 - THEN -THEN -ADD #6,R15 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] D< [IF] -CODE D< -CMP R14,2(R15) -MOV #0,R14 -S< IF - MOV #-1,R14 -THEN -0= IF - CMP @R15,4(R15) - S< IF - MOV #-1,R14 - THEN -THEN -ADD #6,R15 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] DU< [IF] -CODE DU< -CMP R14,2(R15) -MOV #0,R14 -U< IF - MOV #-1,R14 -THEN -0= IF - CMP @R15,4(R15) - U< IF - MOV #-1,R14 - THEN -THEN -ADD #6,R15 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] D+ [IF] -CODE D+ -BW1 ADD @R15+,2(R15) - ADDC @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] M+ [IF] -CODE M+ -SUB #2,R15 -CMP #0,R14 -MOV R14,0(R15) -MOV #-1,R14 -0>= IF - MOV #0,R14 -THEN -GOTO BW1 -ENDCODE -[THEN] - -[UNDEFINED] D- [IF] -CODE D- -SUB @R15+,2(R15) -SUBC R14,0(R15) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] DNEGATE [IF] -CODE DNEGATE -XOR #-1,0(R15) -XOR #-1,R14 -ADD #1,0(R15) -ADDC #0,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] DABS [IF] -CODE DABS -CMP #0,R14 -0>= IF - MOV @R13+,R0 -THEN -MOV #DNEGATE,R0 -ENDCODE -[THEN] - -[UNDEFINED] D2/ [IF] -CODE D2/ -RRA R14 -RRC 0(R15) -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] D2* [IF] -CODE D2* -ADD @R15,0(R15) -ADDC R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] DMAX [IF] -: DMAX -2OVER 2OVER -D< IF - 2>R 2DROP 2R> -ELSE - 2DROP -THEN -; -[THEN] - -[UNDEFINED] DMIN [IF] -: DMIN -2OVER 2OVER -D< IF - 2DROP -ELSE 2>R 2DROP 2R> -THEN -; - -$1A04 C@ $EF > [IF] ; test tag value for MSP430FR413x devices without hardware_MPY - -[UNDEFINED] M*/ [IF] -CODE M*/ -BIC #$200,R2 -CMP #0,2(R15) -S< IF - XOR #-1,4(R15) - XOR #-1,2(R15) - ADD #1,4(R15) - ADDC #0,2(R15) - BIS #$200,R2 -THEN -CMP #0,0(R15) -S< IF - XOR #-1,0(R15) - ADD #1,0(R15) - BIT #$200,R2 - 0= IF - BIS #$200,R2 - ELSE - BIC #$200,R2 - THEN -THEN - MOV 4(R15),R8 - MOV 2(R15),R11 - MOV @R15+,R12 - MOV #0,R5 - MOV #0,2(R15) - MOV #0,0(R15) - MOV #0,R10 - MOV #1,R9 -BEGIN BIT R9,R12 - 0<> IF ADD R8,2(R15) - ADDC R11,0(R15) - ADDC R5,R10 - THEN ADD R8,R8 - ADDC R11,R11 - ADDC R5,R5 - ADD R9,R9 -U>= UNTIL -MOV R14,R11 -MOV @R15,R14 -MOV 2(R15),R12 - -MOV #32,R5 -CALL #$408E -MOV @R15+,0(R15) -BIT #$200,R2 -0<> IF - XOR #-1,0(R15) - XOR #-1,R14 - ADD #1,0(R15) - ADDC #0,R14 - BIC #$200,R2 - CMP #0,R10 - 0<> IF - SUB #1,0(R15) - SUBC #0,R14 - THEN -THEN -MOV @R13+,R0 -ENDCODE -[THEN] - -[ELSE] - -[UNDEFINED] M*/ [IF] -CODE M*/ -MOV 4(R15),&$4D4 -MOV 2(R15),&$4D6 -MOV @R15+,&$4C8 -MOV R14,R11 -MOV R0,R0 -MOV &$4E4,R12 -MOV &$4E6,R14 -MOV &$4E8,R10 -BIC #$200,R2 -CMP #0,R10 -S< IF - XOR #-1,R12 - XOR #-1,R14 - XOR #-1,R10 - ADD #1,R12 - ADDC #0,R14 - ADDC #0,R10 - BIS #$200,R2 -THEN -MOV #32,R5 -CALL #$408E -MOV @R15+,0(R15) -BIT #$200,R2 -0<> IF - XOR #-1,0(R15) - XOR #-1,R14 - ADD #1,0(R15) - ADDC #0,R14 - BIC #$200,R2 - CMP #0,R10 - 0<> IF - SUB #1,0(R15) - SUBC #0,R14 - THEN -THEN -MOV @R13+,R0 -ENDCODE -[THEN] - -[THEN] ; end of software/hardware_MPY - -[UNDEFINED] 2VARIABLE [IF] -: 2VARIABLE -CREATE -HI2LO -ADD #4,&$1DC6 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 2CONSTANT [IF] -: 2CONSTANT -CREATE -, , -DOES> -2@ -; -[THEN] - -[UNDEFINED] 2VALUE [IF] -: 2VALUE -CREATE , , -DOES> -HI2LO -MOV @R1+,R13 -BIT #$200,R2 -0= IF - MOV #2@,R0 -THEN -BIC #$200,R2 -MOV #2!,R0 -ENDCODE -[THEN] - -[UNDEFINED] 2LITERAL [IF] -CODE 2LITERAL -BIS #$200,R2 -MOV #LITERAL,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] D.R [IF] -: D.R ->R SWAP OVER DABS <# #S ROT SIGN #> -R> OVER - SPACES TYPE -; -[THEN] - -[THEN] - -RST_HERE - - -[UNDEFINED] VARIABLE [IF] -: VARIABLE -CREATE -HI2LO -MOV @R1+,R13 -ADD #2,&$1DC6 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CELLS [IF] -CODE CELLS -ADD R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] ALLOT [IF] -CODE ALLOT -ADD R14,&$1DC6 -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] DEPTH [IF] -CODE DEPTH -MOV R14,-2(R15) -MOV #$1C80,R14 -SUB R15,R14 -RRA R14 -SUB #2,R15 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] DUP [IF] -CODE DUP -BW1 SUB #2,R15 - MOV R14,0(R15) - MOV @R13+,R0 -ENDCODE - -CODE ?DUP -CMP #0,R14 -0<> ?GOTO BW1 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] DO [IF] -CODE DO -SUB #2,R15 -MOV R14,0(R15) -ADD #2,&$1DC6 -MOV &$1DC6,R14 -MOV #$404C,-2(R14) -ADD #2,&$1C00 -MOV &$1C00,R10 -MOV #0,0(R10) -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE LOOP - MOV #$406E,R9 -BW1 ADD #4,&$1DC6 - MOV &$1DC6,R10 - MOV R9,-4(R10) - MOV R14,-2(R10) -BEGIN - MOV &$1C00,R14 - SUB #2,&$1C00 - MOV @R14,R14 - CMP #0,R14 -0<> WHILE - MOV R10,0(R14) -REPEAT - MOV @R15+,R14 - MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE +LOOP -MOV #$405C,R9 -GOTO BW1 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] I [IF] -CODE I -SUB #2,R15 -MOV R14,0(R15) -MOV @R1,R14 -SUB 2(R1),R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] + [IF] -CODE + -ADD @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 0= [IF] -CODE 0= -SUB #1,R14 -SUBC R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] SOURCE [IF] -CODE SOURCE -SUB #4,R15 -MOV R14,2(R15) -MOV &$1DC0,R14 -MOV &$1DC2,0(R15) -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] >IN [IF] -$1DC4 CONSTANT >IN -[THEN] - -[UNDEFINED] SWAP [IF] -CODE SWAP -MOV @R15,R10 -MOV R14,0(R15) -MOV R10,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] DROP [IF] -CODE DROP -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 1+ [IF] -CODE 1+ -ADD #1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CHAR [IF] -: CHAR - $20 WORD 1+ C@ -; -[THEN] - -[UNDEFINED] [CHAR] [IF] -: [CHAR] - CHAR POSTPONE LITERAL -; IMMEDIATE -[THEN] - -[UNDEFINED] 2/ [IF] -CODE 2/ -RRA R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] INVERT [IF] -CODE INVERT -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] RSHIFT [IF] -CODE RSHIFT - MOV @R15+,R10 - AND #$1F,R14 -0<> IF - BEGIN BIC #1,R2 - RRC R10 - SUB #1,R14 - 0= UNTIL -THEN MOV R10,R14 - MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 0< [IF] -CODE 0< -ADD R14,R14 -SUBC R14,R14 -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] S>D [IF] -: S>D - DUP 0< -; -[THEN] - -[UNDEFINED] 1- [IF] -CODE 1- -SUB #1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] UM/MOD [IF] -CODE UM/MOD - PUSH #DROP - MOV #$4074,R0 -ENDCODE -[THEN] - -[UNDEFINED] SM/REM [IF] -CODE SM/REM -MOV R14,R12 -MOV @R15,R11 -CMP #0,R14 -S< IF - XOR #-1,R14 - ADD #1,R14 -THEN -CMP #0,0(R15) -S< IF - XOR #-1,2(R15) - XOR #-1,0(R15) - ADD #1,2(R15) - ADDC #0,0(R15) -THEN -PUSHM #3,R13 -LO2HI - UM/MOD -HI2LO -POPM #3,R13 -CMP #0,R11 -S< IF - XOR #-1,0(R15) - ADD #1,0(R15) -THEN -XOR R12,R11 -CMP #0,R11 -S< IF - XOR #-1,R14 - ADD #1,R14 -THEN -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] FM/MOD [IF] -: FM/MOD -SM/REM -HI2LO -CMP #0,0(R15) -0<> IF - CMP #1,R14 - S< IF - ADD R12,0(R15) - SUB #1,R14 - THEN -THEN -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] NIP [IF] -CODE NIP -ADD #2,R15 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] / [IF] -: / ->R DUP 0< R> FM/MOD NIP -; -[THEN] - -[UNDEFINED] NEGATE [IF] -CODE NEGATE -XOR #-1,R14 -ADD #1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] HERE [IF] -CODE HERE -MOV #$402C,R0 -ENDCODE -[THEN] - -[UNDEFINED] CHARS [IF] -CODE CHARS -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] MOVE [IF] -CODE MOVE -MOV R14,R10 -MOV @R15+,R8 -MOV @R15+,R9 -MOV @R15+,R14 -CMP #0,R10 -0<> IF - CMP R9,R8 - 0<> IF - U< IF - BEGIN - MOV.B @R9+,0(R8) - ADD #1,R8 - SUB #1,R10 - 0= UNTIL - MOV @R13+,R0 - THEN - ADD R10,R8 - ADD R10,R9 - BEGIN - SUB #1,R9 - SUB #1,R8 - MOV.B @R9,0(R8) - SUB #1,R10 - 0= UNTIL - THEN -THEN -MOV @R13+,R0 -ENDCODE -[THEN] - - 0 CONSTANT FALSE --1 CONSTANT TRUE - -VARIABLE VERBOSE - FALSE VERBOSE ! - - -VARIABLE ACTUAL-DEPTH -CREATE ACTUAL-RESULTS 20 CELLS ALLOT - -: T{ - ; - -: -> - DEPTH DUP ACTUAL-DEPTH ! - ?DUP IF - 0 DO ACTUAL-RESULTS I CELLS + ! LOOP - THEN ; - -: }T - - DEPTH ACTUAL-DEPTH @ = IF - DEPTH ?DUP IF - 0 DO - ACTUAL-RESULTS I CELLS + @ - = 0= IF TRUE ABORT" INCORRECT RESULT" THEN - LOOP - THEN - ELSE - TRUE ABORT" WRONG NUMBER OF RESULTS" - THEN ; - -: TESTING - SOURCE VERBOSE @ - IF DUP >R TYPE CR R> >IN ! - ELSE >IN ! DROP [CHAR] * EMIT - THEN ; - --1 CONSTANT 1S -0 CONSTANT --1 CONSTANT -0 INVERT 1 RSHIFT CONSTANT MAX-INT ; 011...1 -0 INVERT 1 RSHIFT INVERT CONSTANT MIN-INT ; 100...0 -MAX-INT 2/ CONSTANT HI-INT ; 001...1 -MIN-INT 2/ CONSTANT LO-INT ; 110...0 --1 MAX-INT 2CONSTANT MAX-2INT ; 011...1 -0 MIN-INT 2CONSTANT MIN-2INT ; 100...0 -MAX-2INT 2/ 2CONSTANT HI-2INT ; 001...1 -MIN-2INT 2/ 2CONSTANT LO-2INT ; 110...0 - -ECHO - -; -------------------------------------------------------------------------------- -; DOUBLE tests -; -------------------------------------------------------------------------------- - -T{ 1 2 2CONSTANT 2c1 -> }T -T{ 2c1 -> 1 2 }T -T{ : cd1 2c1 ; -> }T -T{ cd1 -> 1 2 }T - -T{ : cd2 2CONSTANT ; -> }T -T{ -1 -2 cd2 2c2 -> }T -T{ 2c2 -> -1 -2 }T - -T{ 4 5 2CONSTANT 2c3 IMMEDIATE 2c3 -> 4 5 }T -T{ : cd6 2c3 2LITERAL ; cd6 -> 4 5 }T - -T{ 2VARIABLE 2v1 -> }T -T{ 0. 2v1 2! -> }T -T{ 2v1 2@ -> 0. }T -T{ -1 -2 2v1 2! -> }T -T{ 2v1 2@ -> -1 -2 }T -T{ : cd2 2VARIABLE ; -> }T -T{ cd2 2v2 -> }T -T{ : cd3 2v2 2! ; -> }T -T{ -2 -1 cd3 -> }T -T{ 2v2 2@ -> -2 -1 }T - -T{ 2VARIABLE 2v3 IMMEDIATE 5 6 2v3 2! -> }T -T{ 2v3 2@ -> 5 6 }T - -T{ : cd1 [ MAX-2INT ] 2LITERAL ; -> }T -T{ cd1 -> MAX-2INT }T -T{ 2VARIABLE 2v4 IMMEDIATE 5 6 2v4 2! -> }T -T{ : cd7 2v4 [ 2@ ] 2LITERAL ; cd7 -> 5 6 }T -T{ : cd8 [ 6 7 ] 2v4 [ 2! ] ; 2v4 2@ -> 6 7 }T - -T{ 1 2 2VALUE t2val -> }T -T{ t2val -> 1 2 }T -T{ 3 4 TO t2val -> }T -T{ t2val -> 3 4 }T -: sett2val t2val 2SWAP TO t2val ; -T{ 5 6 sett2val t2val -> 3 4 5 6 }T - -T{ 0. 5. D+ -> 5. }T -T{ -5. 0. D+ -> -5. }T -T{ 1. 2. D+ -> 3. }T -T{ 1. -2. D+ -> -1. }T -T{ -1. 2. D+ -> 1. }T -T{ -1. -2. D+ -> -3. }T -T{ -1. 1. D+ -> 0. }T -T{ 0 0 0 5 D+ -> 0 5 }T -T{ -1 5 0 0 D+ -> -1 5 }T -T{ 0 0 0 -5 D+ -> 0 -5 }T -T{ 0 -5 -1 0 D+ -> -1 -5 }T -T{ 0 1 0 2 D+ -> 0 3 }T -T{ -1 1 0 -2 D+ -> -1 -1 }T -T{ 0 -1 0 2 D+ -> 0 1 }T -T{ 0 -1 -1 -2 D+ -> -1 -3 }T -T{ -1 -1 0 1 D+ -> -1 0 }T - -T{ MIN-INT 0 2DUP D+ -> 0 1 }T -T{ MIN-INT S>D MIN-INT 0 D+ -> 0 0 }T - -T{ HI-2INT 1. D+ -> 0 HI-INT 1+ }T -T{ HI-2INT 2DUP D+ -> 1S 1- MAX-INT }T -T{ MAX-2INT MIN-2INT D+ -> -1. }T -T{ MAX-2INT LO-2INT D+ -> HI-2INT }T -T{ LO-2INT 2DUP D+ -> MIN-2INT }T -T{ HI-2INT MIN-2INT D+ 1. D+ -> LO-2INT }T - -T{ 0. 5. D- -> -5. }T -T{ 5. 0. D- -> 5. }T -T{ 0. -5. D- -> 5. }T -T{ 1. 2. D- -> -1. }T -T{ 1. -2. D- -> 3. }T -T{ -1. 2. D- -> -3. }T -T{ -1. -2. D- -> 1. }T -T{ -1. -1. D- -> 0. }T -T{ 0 0 0 5 D- -> 0 -5 }T -T{ -1 5 0 0 D- -> -1 5 }T -T{ 0 0 -1 -5 D- -> 1 4 }T -T{ 0 -5 0 0 D- -> 0 -5 }T -T{ -1 1 0 2 D- -> -1 -1 }T -T{ 0 1 -1 -2 D- -> 1 2 }T -T{ 0 -1 0 2 D- -> 0 -3 }T -T{ 0 -1 0 -2 D- -> 0 1 }T -T{ 0 0 0 1 D- -> 0 -1 }T -T{ MIN-INT 0 2DUP D- -> 0. }T -T{ MIN-INT S>D MAX-INT 0 D- -> 1 1S }T -T{ MAX-2INT max-2INT D- -> 0. }T -T{ MIN-2INT min-2INT D- -> 0. }T -T{ MAX-2INT hi-2INT D- -> lo-2INT DNEGATE }T -T{ HI-2INT lo-2INT D- -> max-2INT }T -T{ LO-2INT hi-2INT D- -> min-2INT 1. D+ }T -T{ MIN-2INT min-2INT D- -> 0. }T -T{ MIN-2INT lo-2INT D- -> lo-2INT }T - -T{ 0. D0< -> }T -T{ 1. D0< -> }T -T{ MIN-INT 0 D0< -> }T -T{ 0 MAX-INT D0< -> }T -T{ MAX-2INT D0< -> }T -T{ -1. D0< -> }T -T{ MIN-2INT D0< -> }T - -T{ 1. D0= -> }T -T{ MIN-INT 0 D0= -> }T -T{ MAX-2INT D0= -> }T -T{ -1 MAX-INT D0= -> }T -T{ 0. D0= -> }T -T{ -1. D0= -> }T -T{ 0 MIN-INT D0= -> }T - -T{ 0. D2* -> 0. D2* }T -T{ MIN-INT 0 D2* -> 0 1 }T -T{ HI-2INT D2* -> MAX-2INT 1. D- }T -T{ LO-2INT D2* -> MIN-2INT }T - -T{ 0. D2/ -> 0. }T -T{ 1. D2/ -> 0. }T -T{ 0 1 D2/ -> MIN-INT 0 }T -T{ MAX-2INT D2/ -> HI-2INT }T -T{ -1. D2/ -> -1. }T -T{ MIN-2INT D2/ -> LO-2INT }T - -T{ 0. 1. D< -> }T -T{ 0. 0. D< -> }T -T{ 1. 0. D< -> }T -T{ -1. 1. D< -> }T -T{ -1. 0. D< -> }T -T{ -2. -1. D< -> }T -T{ -1. -2. D< -> }T -T{ -1. MAX-2INT D< -> }T -T{ MIN-2INT MAX-2INT D< -> }T -T{ MAX-2INT -1. D< -> }T -T{ MAX-2INT MIN-2INT D< -> }T -T{ MAX-2INT 2DUP -1. D+ D< -> }T -T{ MIN-2INT 2DUP 1. D+ D< -> }T - -T{ -1. -1. D= -> }T -T{ -1. 0. D= -> }T -T{ -1. 1. D= -> }T -T{ 0. -1. D= -> }T -T{ 0. 0. D= -> }T -T{ 0. 1. D= -> }T -T{ 1. -1. D= -> }T -T{ 1. 0. D= -> }T -T{ 1. 1. D= -> }T -T{ 0 -1 0 -1 D= -> }T -T{ 0 -1 0 0 D= -> }T -T{ 0 -1 0 1 D= -> }T -T{ 0 0 0 -1 D= -> }T -T{ 0 0 0 0 D= -> }T -T{ 0 0 0 1 D= -> }T -T{ 0 1 0 -1 D= -> }T -T{ 0 1 0 0 D= -> }T -T{ 0 1 0 1 D= -> }T - -T{ MAX-2INT MIN-2INT D= -> }T -T{ MAX-2INT 0. D= -> }T -T{ MAX-2INT MAX-2INT D= -> }T -T{ MAX-2INT HI-2INT D= -> }T -T{ MAX-2INT MIN-2INT D= -> }T -T{ MIN-2INT MIN-2INT D= -> }T -T{ MIN-2INT LO-2INT D= -> }T -T{ MIN-2INT MAX-2INT D= -> }T - -T{ 1234 0 D>S -> 1234 }T -T{ -1234 -1 D>S -> -1234 }T -T{ MAX-INT 0 D>S -> MAX-INT }T -T{ MIN-INT -1 D>S -> MIN-INT }T - - -T{ 1. DABS -> 1. }T -T{ -1. DABS -> 1. }T -T{ MAX-2INT DABS -> MAX-2INT }T -T{ MIN-2INT 1. D+ DABS -> MAX-2INT }T - -T{ 1. 2. DMAX -> 2. }T -T{ 1. 0. DMAX -> 1. }T -T{ 1. -1. DMAX -> 1. }T -T{ 1. 1. DMAX -> 1. }T -T{ 0. 1. DMAX -> 1. }T -T{ 0. -1. DMAX -> 0. }T -T{ -1. 1. DMAX -> 1. }T -T{ -1. -2. DMAX -> -1. }T -T{ MAX-2INT HI-2INT DMAX -> MAX-2INT }T -T{ MAX-2INT MIN-2INT DMAX -> MAX-2INT }T -T{ MIN-2INT MAX-2INT DMAX -> MAX-2INT }T -T{ MIN-2INT LO-2INT DMAX -> LO-2INT }T - -T{ MAX-2INT 1. DMAX -> MAX-2INT }T -T{ MAX-2INT -1. DMAX -> MAX-2INT }T -T{ MIN-2INT 1. DMAX -> 1. }T -T{ MIN-2INT -1. DMAX -> -1. }T - -T{ 1. 2. DMIN -> 1. }T -T{ 1. 0. DMIN -> 0. }T -T{ 1. -1. DMIN -> -1. }T -T{ 1. 1. DMIN -> 1. }T -T{ 0. 1. DMIN -> 0. }T -T{ 0. -1. DMIN -> -1. }T -T{ -1. 1. DMIN -> -1. }T -T{ -1. -2. DMIN -> -2. }T -T{ MAX-2INT HI-2INT DMIN -> HI-2INT }T -T{ MAX-2INT MIN-2INT DMIN -> MIN-2INT }T -T{ MIN-2INT MAX-2INT DMIN -> MIN-2INT }T -T{ MIN-2INT LO-2INT DMIN -> MIN-2INT }T - -T{ MAX-2INT 1. DMIN -> 1. }T -T{ MAX-2INT -1. DMIN -> -1. }T -T{ MIN-2INT 1. DMIN -> MIN-2INT }T -T{ MIN-2INT -1. DMIN -> MIN-2INT }T - -T{ 0. DNEGATE -> 0. }T -T{ 1. DNEGATE -> -1. }T -T{ -1. DNEGATE -> 1. }T -T{ max-2int DNEGATE -> min-2int SWAP 1+ SWAP }T -T{ min-2int SWAP 1+ SWAP DNEGATE -> max-2int }T - -T{ 1. 2. 3. 2ROT -> 2. 3. 1. }T -T{ MAX-2INT MIN-2INT 1. 2ROT -> MIN-2INT 1. MAX-2INT }T - -T{ 1. 1. DU< -> }T -T{ 1. -1. DU< -> }T -T{ -1. 1. DU< -> }T -T{ -1. -2. DU< -> }T -T{ MAX-2INT HI-2INT DU< -> }T -T{ HI-2INT MAX-2INT DU< -> }T -T{ MAX-2INT MIN-2INT DU< -> }T -T{ MIN-2INT MAX-2INT DU< -> }T -T{ MIN-2INT LO-2INT DU< -> }T - -T{ HI-2INT 1 M+ -> HI-2INT 1. D+ }T -T{ MAX-2INT -1 M+ -> MAX-2INT -1. D+ }T -T{ MIN-2INT 1 M+ -> MIN-2INT 1. D+ }T -T{ LO-2INT -1 M+ -> LO-2INT -1. D+ }T - --3 2 / . ; if floored you see -2 --> -: ?floored [ -3 2 / -2 = ] LITERAL IF 1. D- THEN ; - -T{ 5. 7 11 M*/ -> 3. }T -T{ 5. -7 11 M*/ -> -3. ?floored }T -T{ -5. 7 11 M*/ -> -3. ?floored }T -T{ -5. -7 11 M*/ -> 3. }T - -T{ MAX-2INT 8 16 M*/ -> HI-2INT }T -T{ MIN-2INT 8 16 M*/ -> LO-2INT }T -T{ MAX-2INT -8 16 M*/ -> HI-2INT DNEGATE ?floored }T -T{ MIN-2INT -8 16 M*/ -> LO-2INT DNEGATE }T - -T{ MAX-2INT MAX-INT MAX-INT M*/ -> MAX-2INT }T -T{ MAX-2INT MAX-INT 2/ MAX-INT M*/ -> MAX-INT 1- HI-2INT NIP }T -T{ MIN-2INT LO-2INT NIP DUP NEGATE M*/ -> MIN-2INT }T -T{ MIN-2INT LO-2INT NIP 1- MAX-INT M*/ -> MIN-INT 3 + HI-2INT NIP 2 + }T -T{ MAX-2INT LO-2INT NIP DUP NEGATE M*/ -> MAX-2INT DNEGATE }T -T{ MIN-2INT MAX-INT DUP M*/ -> MIN-2INT }T - -MAX-2INT 71 73 M*/ 2CONSTANT dbl1 -MIN-2INT 73 79 M*/ 2CONSTANT dbl2 -: d>ascii - DUP >R <# DABS #S R> SIGN #> - HERE SWAP 2DUP 2>R CHARS DUP ALLOT MOVE 2R> -; - -dbl1 d>ascii 2CONSTANT "dbl1" -dbl2 d>ascii 2CONSTANT "dbl2" - -: DoubleOutput - CR ." You should see lines duplicated:" CR - 5 SPACES "dbl1" TYPE CR - 5 SPACES dbl1 D. CR - 8 SPACES "dbl1" DUP >R TYPE CR - 5 SPACES dbl1 R> 3 + D.R CR - 5 SPACES "dbl2" TYPE CR - 5 SPACES dbl2 D. CR - 10 SPACES "dbl2" DUP >R TYPE CR - 5 SPACES dbl2 R> 5 + D.R CR -; - -T{ DoubleOutput -> }T diff --git a/MSP430-FORTH/MSP_EXP430FR5994/FIXPOINT.4TH b/MSP430-FORTH/MSP_EXP430FR5994/FIXPOINT.4TH deleted file mode 100644 index eb47c88..0000000 --- a/MSP430-FORTH/MSP_EXP430FR5994/FIXPOINT.4TH +++ /dev/null @@ -1,487 +0,0 @@ - -; ----------------------------------------------------- -; FIXPOINT.4th for MSP_EXP430FR5994 -; ----------------------------------------------------- - -; ----------------------------------------------------------- -; requires FIXPOINT_INPUT kernel addon, see forthMSP430FR.asm -; ----------------------------------------------------------- - -PWR_STATE - -[DEFINED] {FIXPOINT} [IF] {FIXPOINT} [THEN] - -[UNDEFINED] {FIXPOINT} [IF] - -MARKER {FIXPOINT} - -[UNDEFINED] + [IF] -CODE + -ADD @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] R> [IF] -CODE R> -SUB #2,R15 -MOV R14,0(R15) -MOV @R1+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] U< [IF] -CODE U< -SUB @R15+,R14 -0<> IF - MOV #-1,R14 - U< IF - AND #0,R14 - THEN -THEN -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] DABS [IF] -CODE DABS -AND #-1,R14 -S< IF - XOR #-1,0(R15) - XOR #-1,R14 - ADD #1,0(R15) - ADDC #0,R14 -THEN -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] HOLDS [IF] -CODE HOLDS - MOV @R15+,R9 -BW3 ADD R14,R9 - MOV &$1DB2,R8 -BEGIN SUB #1,R9 - SUB #1,R14 -U>= WHILE SUB #1,R8 - MOV.B @R9,0(R8) -REPEAT MOV R8,&$1DB2 - MOV @R15+,R14 - MOV @R13+,R0 -ENDCODE -[THEN] - -CODE F+ - ADD @R15+,2(R15) - ADDC @R15+,R14 - MOV @R13+,R0 -ENDCODE - -CODE F- - SUB @R15+,2(R15) - SUBC R14,0(R15) - MOV @R15+,R14 - MOV @R13+,R0 -ENDCODE - -$1A00 4 + @ $81F3 U< -$81EF $1A00 4 + @ U< -= [IF] ; MSP430FR413x subfamily without hardware_MPY - -CODE UDM* - PUSH R13 - PUSHM #4,R7 - MOV 4(R15),R13 - MOV 2(R15),R11 - MOV @R15,R10 - MOV #0,R7 - MOV #0,R6 - MOV #0,4(R15) - MOV #0,2(R15) - MOV #0,R5 - MOV #0,R4 - MOV #1,R9 - MOV #0,R8 -BEGIN CMP #0,R9 - 0<> IF BIT R9,R10 - ELSE BIT R8,R14 - THEN - 0<> IF ADD R13,4(R15) - ADDC R11,2(R15) - ADDC R7,R5 - ADDC R6,R4 - THEN ADD R13,R13 - ADDC R11,R11 - ADDC R7,R7 - ADDC R6,R6 - ADD R9,R9 - ADDC R8,R8 -U>= UNTIL MOV R5,0(R15) - MOV R4,R14 - POPM #4,R7 - MOV @R1+,R13 - MOV @R13+,R0 -ENDCODE - -CODE F* - MOV 2(R15),R12 - XOR R14,R12 - BIT #$8000,2(R15) -0<> IF XOR #-1,2(R15) - XOR #-1,4(R15) - ADD #1,4(R15) - ADDC #0,2(R15) -THEN COLON - DABS UDM* - HI2LO - MOV @R1+,R13 - MOV @R15+,R14 - MOV @R15+,0(R15) -BW2 AND #-1,R12 -S< IF XOR #-1,0(R15) - XOR #-1,R14 - ADD #1,0(R15) - ADDC #0,R14 -THEN MOV @R13+,R0 -ENDCODE - -CODE F/ - PUSHM #4,R7 - MOV @R15+,R7 - MOV @R15+,R9 - MOV #0,R10 - MOV @R15,R8 - MOV #0,R11 - MOV R9,R12 - XOR R14,R12 - AND #-1,R9 -S< IF XOR #-1,R8 - XOR #-1,R9 - ADD #1,R8 - ADDC #0,R9 -THEN AND #-1,R14 -S< IF XOR #-1,R7 - XOR #-1,R14 - ADD #1,R7 - ADDC #0,R14 -THEN - MOV #32,R6 -BW1 CMP R14,R10 - 0= IF CMP R7,R9 - THEN - U>= IF SUB R7,R9 - SUBC R14,R10 - THEN - BEGIN ADDC R4,R4 - ADDC R5,R5 - SUB #1,R6 - 0< ?GOTO FW1 - ADD R11,R11 - ADDC R8,R8 - ADDC R9,R9 - ADDC R10,R10 - U< ?GOTO BW1 - SUB R7,R9 - SUBC R14,R10 - BIS #1,R2 - AGAIN -FW1 - MOV R4,0(R15) - MOV R5,R14 - POPM #4,R7 - GOTO BW2 -ENDCODE - -[UNDEFINED] F#S [IF] -CODE F#S - MOV @R15,R12 - MOV #0,R11 - PUSHM #3,R13 - MOV 2(R15),0(R15) - MOV R14,2(R15) -BEGIN MOV &$1DDC,R14 - LO2HI - UM* - HI2LO - CMP #10,R14 - U>= IF ADD #7,R14 - THEN ADD #$30,R14 - MOV @R1,R11 - MOV.B R14,$1D90(R11) - ADD #1,R11 - MOV R11,0(R1) - CMP 2(R15),R11 -U>= UNTIL POPM #3,R13 - MOV R11,R14 - MOV R12,2(R15) - MOV #0,0(R15) - MOV #$1D90,R9 - GOTO BW3 -ENDCODE -[THEN] - -[ELSE] ; hardware multiplier - -CODE F/ - PUSHM #4,R7 - MOV @R15+,R7 - MOV @R15+,R9 - MOV #0,R10 - MOV @R15,R8 - MOV #0,R11 - MOV R9,R12 - XOR R14,R12 - AND #-1,R9 -S< IF XOR #-1,R8 - XOR #-1,R9 - ADD #1,R8 - ADDC #0,R9 -THEN AND #-1,R14 -S< IF XOR #-1,R7 - XOR #-1,R14 - ADD #1,R7 - ADDC #0,R14 -THEN - MOV #32,R6 -BW1 CMP R14,R10 - 0= IF CMP R7,R9 - THEN - U>= IF SUB R7,R9 - SUBC R14,R10 - THEN -BW2 ADDC R4,R4 - ADDC R5,R5 - SUB #1,R6 - 0< ?GOTO FW1 - ADD R11,R11 - ADDC R8,R8 - ADDC R9,R9 - ADDC R10,R10 - U< ?GOTO BW1 - SUB R7,R9 - SUBC R14,R10 - BIS #1,R2 - GOTO BW2 -FW1 AND #-1,R12 -S< IF XOR #-1,R4 - XOR #-1,R5 - ADD #1,R4 - ADDC #0,R5 -THEN MOV R4,0(R15) - MOV R5,R14 - POPM #4,R7 - MOV @R13+,R0 -ENDCODE - -[UNDEFINED] F#S [IF] -CODE F#S - MOV 2(R15),R9 - MOV @R15,2(R15) - MOV R9,0(R15) - MOV R14,R11 - MOV #0,R12 -BEGIN MOV @R15,&$4C0 - MOV &$1DDC,&$4C8 - MOV &$4E4,0(R15) - MOV &$4E6,R14 - CMP #10,R14 - U>= IF ADD #7,R14 - THEN ADD #$30,R14 - MOV.B R14,$1D90(R12) - ADD #1,R12 - CMP R11,R12 -0= UNTIL MOV R11,R14 - MOV #0,0(R15) - MOV #$1D90,R9 - GOTO BW3 -ENDCODE -[THEN] - -CODE F* - MOV 4(R15),&$4D4 - MOV 2(R15),&$4D6 - MOV @R15,&$4E0 - MOV R14,&$4E2 - ADD #4,R15 - MOV &$4E6,0(R15) - MOV &$4E8,R14 - MOV @R13+,R0 -ENDCODE - -[THEN] - -[UNDEFINED] F. [IF] -CODE F. -MOV R14,R12 -MOV #4,R11 -MOV &$1DDC,R10 -CMP #$0A,R10 -0= IF - ADD #1,R11 -ELSE - CMP #2,R10 - 0= IF - MOV #$10,R11 - THEN -THEN -PUSHM #3,R13 -LO2HI - <# DABS - R> F#S - $2C HOLD - #S - R> SIGN #> - TYPE $20 EMIT -; - -CODE S>F - SUB #2,R15 - MOV #0,0(R15) - MOV @R13+,R0 -ENDCODE -[THEN] - -RST_HERE - -[THEN] - -; ----------------------- -; complements (volatile) for tests below -; ----------------------- - -[UNDEFINED] ! [IF] -CODE ! -MOV @R15+,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] DOES> [IF] -CODE DOES> -MOV &$1DBA,R10 -MOV #$1285,0(R10) -MOV R13,2(R10) -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 2CONSTANT [IF] -: 2CONSTANT -CREATE , , -DOES> -HI2LO -SUB #2,R15 -MOV 2(R14),0(R15) -MOV @R14,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] D. [IF] -CODE D. -MOV #U.,R10 -ADD #10,R10 -MOV R10,R0 -ENDCODE -[THEN] - -[UNDEFINED] BASE [IF] -$1DDC CONSTANT BASE -[THEN] - -ECHO - -; ----------------------- -; (volatile) tests for FIXPOINT.asm|FIXPOINT.4th for MSP_EXP430FR5994 -; ----------------------- - -3,14159 2CONSTANT PI -PI -1,0 F* 2CONSTANT -PI - -PI D. ; D. is not appropriate --> --PI D. ; D. is not appropriate --> - -PI F. ; good value! ------------> --PI F. ; good value! ------------> - -$10 BASE ! PI F. - -PI F. -%10 BASE ! PI F. - -PI F. -#10 BASE ! PI F. - -PI F. - -PI 2,0 F* F. -PI -2,0 F* F. --PI 2,0 F* F. --PI -2,0 F* F. - -PI 2,0 F/ F. -PI -2,0 F/ F. --PI 2,0 F/ F. --PI -2,0 F/ F. - -32768,0 1,0 F* F. ; overflow! --> -32768,0 1,0 F/ F. ; overflow! --> --32768,0 -1,0 F* F. ; overflow! --> --32768,0 -1,0 F/ F. ; overflow! --> - -32767,99999 1,0 F* F. -32767,99999 1,0 F/ F. -32767,99999 2,0 F/ F. -32767,99999 4,0 F/ F. -32767,99999 8,0 F/ F. -32767,99999 16,0 F/ F. - --32768,0 -2,0 F/ F. --32768,0 -4,0 F/ F. --32768,0 -8,0 F/ F. --32768,0 -16,0 F/ F. --32768,0 -32,0 F/ F. --32768,0 -64,0 F/ F. - --3276,80 -1,0 F/ F. --327,680 -1,0 F/ F. --32,7680 -1,0 F/ F. --3,27680 -1,0 F/ F. --0,32768 -1,0 F/ F. - -; SQRT(32768)^2 = 32768 -181,01933598375 181,01933598375 F* F. -181,01933598375 -181,01933598375 F* F. --181,01933598375 181,01933598375 F* F. --181,01933598375 -181,01933598375 F* F. diff --git a/MSP430-FORTH/MSP_EXP430FR5994/MISC/TESTASM.4TH b/MSP430-FORTH/MSP_EXP430FR5994/MISC/TESTASM.4TH deleted file mode 100644 index 89f6be6..0000000 --- a/MSP430-FORTH/MSP_EXP430FR5994/MISC/TESTASM.4TH +++ /dev/null @@ -1,508 +0,0 @@ - -; ----------------------------------------------------------------------- -; TEST_ASM.4th for MSP_EXP430FR5994 -; ----------------------------------------------------------------------- - -[UNDEFINED] >R [IF] -CODE >R -PUSH R14 -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] R> [IF] -CODE R> -MOV R7,R0 -ENDCODE -[THEN] - -[UNDEFINED] + [IF] -CODE + -ADD @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] - [IF] -CODE - -SUB @R15+,R14 -XOR #-1,R14 -ADD #1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] SWAP [IF] -CODE SWAP -MOV @R15,R10 -MOV R14,0(R15) -MOV R10,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] MAX [IF] - -CODE MAX - CMP @R15,R14 - S< ?GOTO FW1 -BW1 ADD #2,R15 - MOV @R13+,R0 -ENDCODE - -CODE MIN - CMP @R15,R14 - S< ?GOTO BW1 -FW1 MOV @R15+,R14 - MOV @R13+,R0 -ENDCODE - -[THEN] - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] ! [IF] -CODE ! -MOV @R15+,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] C@ [IF] -CODE C@ -MOV.B @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] VARIABLE [IF] -: VARIABLE -CREATE -HI2LO -MOV #$1287,-4(R10) -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] DEFER [IF] - -: DEFER -CREATE -HI2LO -MOV #$4030,-4(R10) -MOV #$4016,-2(R10) -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] SPACE [IF] -: SPACE -$20 EMIT ; -[THEN] - -[UNDEFINED] SPACES [IF] -CODE SPACES -CMP #0,R14 -0<> IF - PUSH R13 - BEGIN - LO2HI - $20 EMIT - HI2LO - SUB #2,R13 - SUB #1,R14 - 0= UNTIL - MOV @R1+,R13 -THEN -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] DUP [IF] -CODE DUP -BW1 SUB #2,R15 - MOV R14,0(R15) - MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] OVER [IF] -CODE OVER -MOV R14,-2(R15) -MOV @R15,R14 -SUB #2,R15 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] U.R [IF] -: U.R - >R <# 0 # #S #> - R> OVER - 0 MAX SPACES TYPE -; -[THEN] - -[UNDEFINED] DO [IF] -CODE DO -SUB #2,R15 -MOV R14,0(R15) -ADD #2,&$1DC6 -MOV &$1DC6,R14 -MOV #$404C,-2(R14) -ADD #2,&$1C00 -MOV &$1C00,R10 -MOV #0,0(R10) -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] LOOP [IF] -CODE LOOP - MOV #$406E,R9 -BW1 ADD #4,&$1DC6 - MOV &$1DC6,R10 - MOV R9,-4(R10) - MOV R14,-2(R10) -BEGIN - MOV &$1C00,R14 - SUB #2,&$1C00 - MOV @R14,R14 - CMP #0,R14 -0<> WHILE - MOV R10,0(R14) -REPEAT - MOV @R15+,R14 - MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] +LOOP [IF] -CODE +LOOP -MOV #$405C,R9 -GOTO BW1 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] I [IF] -CODE I -SUB #2,R15 -MOV R14,0(R15) -MOV @R1,R14 -SUB 2(R1),R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] DUMP [IF] -CODE DUMP -PUSH R13 -PUSH &$1DDC -MOV #$10,&$1DDC -ADD @R15,R14 -LO2HI - SWAP - DO CR - I 4 U.R SPACE - I 8 + I - DO I C@ 3 U.R LOOP - SPACE - I $10 + I 8 + - DO I C@ 3 U.R LOOP - SPACE SPACE - I $10 + I - DO I C@ $7E MIN $20 MAX EMIT LOOP - $10 +LOOP - R> $1DDC ! -; -[THEN] - -CODE TESTPUSHM -BW1 - MOV #22222,R8 - MOV #3,R9 - MOV #2,R10 - MOV #1,R11 - MOV #0,R12 - - PUSHM #4,R13 - POPM #4,R13 - SUB #10,R15 - MOV R14,8(R15) - MOV R12,6(R15) - MOV R11,4(R15) - MOV R10,2(R15) - MOV R9,0(R15) - MOV R8,R14 - RRAM #1,R14 - RLAM #2,R14 - RRCM #1,R14 - RRUM #1,R14 - COLON - space . . . . . - ; - -TESTPUSHM ; you should see 11111 3 2 1 0 --> - -CODE TESTPOPM - GOTO BW1 -ENDCODE - - -TESTPOPM ; you should see 11111 3 2 1 0 --> - - - -CODE TEST1 - - MOV &$1DDC,&$1DDC - CMP #%10,&$1DDC -0<> IF MOV #2,&$1DDC -ELSE MOV #$0A,&$1DDC -THEN - COLON - $1DDC @ U. - ; - - -: TEST2 - $1DDC @ U. - HI2LO - - - CMP #2, &$1DDC -0<> IF MOV #2, &$1DDC -ELSE MOV #10,&$1DDC -THEN - MOV @R1+,R13 - MOV @R13+,R0 -ENDCODE - - -CODE TEST3 - CMP #2, &$1DDC -0<> IF MOV #2, &$1DDC -ELSE MOV #10,&$1DDC -THEN COLON - $1DDC @ U. -; - - - -: TEST5 - SPACE - HI2LO - SUB #2,R15 - MOV R14,0(R15) - MOV #%1010,R14 -BEGIN SUB #$0001,R14 - LO2HI - - DUP U. - HI2LO - CMP #0,R14 -0= UNTIL MOV @R15+,R14 - MOV @R1+,R13 - MOV @R13+,R0 -ENDCODE - -TEST5 ; you should see : 9 8 7 6 5 4 3 2 1 0 --> - - - -[UNDEFINED] C, [IF] -CODE C, -MOV &$1DC6,R10 -MOV.B R14,0(R10) -ADD #1,&$1DC6 -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] C@ [IF] -CODE C@ -MOV.B @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -: BYTES_TABLE_IDX -CREATE -0 DO I C, -LOOP -DOES> -+ -; - -8 BYTES_TABLE_IDX BYTES_TABLE - -2 BYTES_TABLE C@ . ; you should see 2 --> - - -VARIABLE BYTES_TABLE1 - -$0201 BYTES_TABLE1 ! - -CODE IDX_TEST1 - MOV.B BYTES_TABLE1(R14),R14 -COLON - U. -; - -0 IDX_TEST1 ; you should see 1 --> - -CODE TEST6 - MOV 0(R15),0(R15) - MOV @R13+,R0 -ENDCODE - - -1 TEST6 . ; you should see 1 --> - - - - - -CREATE TABLE0 -0 C, -1 C, -2 C, -3 C, - - -CREATE TABLE10 -$10 C, -$11 C, -$12 C, -$13 C, - - - -CREATE TABLE20 -$20 C, -$21 C, -$22 C, -$23 C, - - -CREATE TABLE - - -TABLE 2 - CONSTANT PFA_TABLE - - -CODE REDIRECT ; -- redirects TABLE to argument
-MOV R14,&PFA_TABLE -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -CODE REDIRECT0 ; -- redirects TABLE to TABLE0 -MOV #TABLE0,&PFA_TABLE -MOV @R13+,R0 -ENDCODE - - -CODE REDIRECT10 ; -- redirects TABLE to TABLE10 -MOV #TABLE10,&PFA_TABLE -MOV @R13+,R0 -ENDCODE - - -CODE REDIRECT20 ; -- redirects TABLE to TABLE20 -MOV #TABLE20,&PFA_TABLE -MOV @R13+,R0 -ENDCODE - - -' TABLE0 10 DUMP - -' TABLE10 10 DUMP - -' TABLE20 10 DUMP - - -TABLE0 REDIRECT TABLE 10 DUMP - -TABLE10 REDIRECT TABLE 10 DUMP - -TABLE20 REDIRECT TABLE 10 DUMP - - -REDIRECT0 TABLE 10 DUMP - -REDIRECT10 TABLE 10 DUMP - -REDIRECT20 TABLE 10 DUMP - - -TABLE0 PFA_TABLE ! TABLE 10 DUMP - -TABLE10 PFA_TABLE ! TABLE 10 DUMP - -TABLE20 PFA_TABLE ! TABLE 10 DUMP - - - - -; ----------------------------------------------------------------------- -; create a primary DEFERred assembly word -; ----------------------------------------------------------------------- - - -DEFER TRUC ; here, TRUC is a secondary DEFERred word (i.e. without BODY) - - - -CODENNM ; leaves its execution address (CFA) on stack - SUB #2,R15 - MOV R14,0(R15) - MOV @R13+,R0 -ENDCODE - -DUP . - -IS TRUC ; TRUC becomes a primary DEFERred word - ; with its default action (DUP) located at its BODY addresse. - -TRUC . ; display R14 value --> - - -' TRUC >BODY IS TRUC ; TRUC is reinitialzed with its default action - - -TRUC . ; display R14 value --> - - - - - diff --git a/MSP430-FORTH/MSP_EXP430FR5994/PROG100K.4TH b/MSP430-FORTH/MSP_EXP430FR5994/PROG100K.4TH deleted file mode 100644 index f2e9ef1..0000000 --- a/MSP430-FORTH/MSP_EXP430FR5994/PROG100K.4TH +++ /dev/null @@ -1,24941 +0,0 @@ - -; ----------------------------------- -; PROG100k.4th for MSP_EXP430FR5994 = 76 x RC5toLCD.4th for MSP_EXP430FR5994 -; ----------------------------------- -; download source file sized to compile 100 kbytes -; ----------------------------------- - - -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -ADD #2,R1 -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -MOV @R1+,R0 -ENDASM - -ASM RC5_INT -ADD #2,R1 -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -MOV @R1+,R0 -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -BIS.B #3,&$20D -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE - -ECHO - ; downloading RC5toLCD.4th is done -RST_HERE ; this app is protected against - diff --git a/MSP430-FORTH/MSP_EXP430FR5994/RC5TOLCD.4TH b/MSP430-FORTH/MSP_EXP430FR5994/RC5TOLCD.4TH deleted file mode 100644 index f3a17d5..0000000 --- a/MSP430-FORTH/MSP_EXP430FR5994/RC5TOLCD.4TH +++ /dev/null @@ -1,337 +0,0 @@ - -; ----------------------------------- -; RC5TOLCD.4th for MSP_EXP430FR5994 -; ----------------------------------- - - -PWR_STATE - -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] - -MARKER {RC5TOLCD} - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] IS [IF] - -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -CODE 20_US -BEGIN - BEGIN - BIT #1,&$3C0 - 0<> UNTIL - BIC #1,&$3C0 - SUB #1,R14 -U< UNTIL -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -CODE TOP_LCD - BIS.B #4,&$243 - BIT.B #1,&$241 -0= IF - AND.B #$0F,R14 - MOV.B R14,&$222 - BIC.B #4,&$243 - MOV @R15+,R14 - MOV @R13+,R0 -THEN - SUB #2,R15 - MOV R14,0(R15) - BIC.B #4,&$243 - MOV.B &$220,R14 - AND.B #$0F,R14 - MOV @R13+,R0 -ENDCODE - -CODE LCD_WRC - BIS.B #2,&$243 -BW1 SUB #2,R15 - MOV R14,0(R15) - RRUM #4,R14 - BIC.B #1,&$243 - BIS.B #$0F,&$224 -COLON - TOP_LCD 2 20_US - TOP_LCD 2 20_US -; - -CODE LCD_WRF - BIC.B #2,&$243 - GOTO BW1 -ENDCODE - -: LCD_CLEAR $01 LCD_WRF 100 20_us ; -: LCD_HOME $02 LCD_WRF 100 20_us ; - - - -ASM WDT_INT -BIT.B #$20,&$240 -0= IF - CMP #19,&$3D6 - U< IF - ADD #1,&$3D6 - THEN -ELSE - BIT.B #$40,&$240 - 0= IF - CMP #3,&$3D6 - U>= IF - SUB #1,&$3D6 - THEN - THEN -THEN -BW1 -RETI -ENDASM - -ASM RC5_INT -$1806 @ 16000 = [IF] - MOV #1,&$3A0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3A0 -[THEN] -MOV #1778,R9 -MOV #14,R10 -BEGIN -MOV #%1011100100,&$380 - RRUM #1,R9 - MOV R9,R8 - RRUM #1,R8 - ADD R9,R8 - BEGIN CMP R8,&$390 - U>= UNTIL - BIT.B #4,&$200 - ADDC R11,R11 - MOV.B &$200,&$208 - BIC.B #4,&$20C - SUB #1,R10 -0<> WHILE - ADD R9,R8 - BEGIN - MOV &$390,R9 - CMP R8,R9 - U>= IF - BIC #$30,&$380 - GOTO BW1 - THEN - BIT.B #4,&$20C - 0<> UNTIL -REPEAT -BIC #$30,&$380 -RLAM #1,R11 -MOV.B R11,R9 -RRUM #2,R9 -BIT #$4000,R11 -0= IF BIS #$40,R9 -THEN -RRUM #3,R11 -XOR @R1,R11 -BIT #$400,R11 -0= ?GOTO BW1 -XOR #$400,0(R1) -SUB #8,R15 -MOV R14,6(R15) -MOV &$1DDC,4(R15) -MOV #$10,&$1DDC -MOV R9,0(R15) -MOV #0,R14 -LO2HI - LCD_CLEAR - <# # #S #36 HOLD #> - ['] LCD_WRC IS EMIT - TYPE - ['] EMIT >BODY IS EMIT -HI2LO -MOV @R15+,&$1DDC -MOV @R15+,R14 -RETI -ENDASM - -ASM BACKGROUND -BEGIN - CALL &$1814 - BIS &$180A,R2 -AGAIN -ENDASM - -ASM SYS_OUT - MOV #WARM,R9 - ADD #4,R9 - MOV R9,R0 -ENDASM - -CODE STOP -BW1 MOV #$4000,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #WARM,R9 - MOV #SYS_OUT,2(R9) - BIC.B #4,&$20A - BIC.B #4,&$20C - MOV #0,&$3C0 - MOV #0,&$340 - MOV #0,&$342 - MOV #COLD,R9 - MOV R9,&$FFDE - MOV R9,&$FFEA -COLON -ECHO -." RC5toLCD is removed," -." type START to restart" - WARM -; - -CODE SYS_INIT -MOV #%10_1101_0100,&$3C0 -$1806 @ 16000 = [IF] - MOV #1,&$3E0 -[THEN] -$1806 @ 24000 = [IF] - MOV #2,&$3E0 -[THEN] - MOV #19,&$3D2 -MOV #%0110_0000,&$3C6 - MOV #10,&$3D6 - BIS.B #$20,&$204 - BIS.B #$20,&$20A - BIS.B #7,&$245 - BIC.B #7,&$247 - BIS.B #$0F,&$224 - BIC.B #$0F,&$226 - BIS.B #4,&$20A - BIC.B #4,&$20C - MOV #RC5_INT,&$FFDE -MOV #%01_0001_0100,&$340 - MOV ##3276,&$352 - MOV #%10000,&$342 - MOV #WDT_INT,&$FFEA -BIC #1,&$130 -MOV &$1808,R8 -CMP #4,R8 -0= ?GOTO BW1 -COLON - #1000 20_US - %011 TOP_LCD - #205 20_US - %011 TOP_LCD - #5 20_US - %011 TOP_LCD - #2 20_US - %010 TOP_LCD - #2 20_US - %00101000 LCD_WRF - %1000 LCD_WRF - LCD_CLEAR - %0110 LCD_WRF - %1100 LCD_WRF - LCD_CLEAR - ['] LCD_HOME IS CR - ['] LCD_WRC IS EMIT - CR ." I love you" - ['] CR >BODY IS CR - ['] EMIT >BODY IS EMIT - ." RC5toLCD is running. Type STOP to quit" - PWR_STATE ABORT -; - -CODE START -MOV #$4000,R9 -MOV #BACKGROUND,2(R9) -MOV #WARM,R9 -MOV #SYS_INIT,2(R9) -MOV R9,R0 -ENDCODE - -ECHO - ; downloading RC5toLCD.4th is done -RST_HERE ; this app is protected against - -START diff --git a/MSP430-FORTH/MSP_EXP430FR5994/RTC.4TH b/MSP430-FORTH/MSP_EXP430FR5994/RTC.4TH deleted file mode 100644 index 872ad00..0000000 --- a/MSP430-FORTH/MSP_EXP430FR5994/RTC.4TH +++ /dev/null @@ -1,393 +0,0 @@ - -; -------------------- -; RTC.4th for MSP_EXP430FR5994 -; -------------------- - -PWR_STATE - -[DEFINED] {RTC} [IF] {RTC} [THEN] - -MARKER {RTC} - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -: NORTC -IF - {RTC} - ECHO $0D EMIT - ABORT" no RTC on this device !" -THEN -; - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] U< [IF] -CODE U< -SUB @R15+,R14 -0<> IF - MOV #-1,R14 - U< IF - AND #0,R14 - THEN -THEN -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] = [IF] -CODE = -SUB @R15+,R14 -0<> IF - AND #0,R14 - MOV @R13+,R0 -THEN -XOR #-1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] OR [IF] -CODE OR -BIS @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - ; search devide ID: -$81EF $1A04 @ U< ; MSP430FR4133 or... -$1A04 @ $8241 U< ; ...MSP430FR2433 -= -$830B $1A04 @ U< ; MSP430FR21xx/23xx/24xx/25xx/26xx -OR ; -- flag 0 ==> RTC, -1 ==> no RTC -NORTC - -[UNDEFINED] SWAP [IF] -CODE SWAP -MOV @R15,R10 -MOV R14,0(R15) -MOV R10,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] OVER [IF] -CODE OVER -MOV R14,-2(R15) -MOV @R15,R14 -SUB #2,R15 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] EXECUTE [IF] -CODE EXECUTE -MOV R14,R10 -MOV @R15+,R14 -MOV R10,R0 -ENDCODE -[THEN] - -[UNDEFINED] DO [IF] -CODE DO -SUB #2,R15 -MOV R14,0(R15) -ADD #2,&$1DC6 -MOV &$1DC6,R14 -MOV #$404C,-2(R14) -ADD #2,&$1C00 -MOV &$1C00,R10 -MOV #0,0(R10) -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE LOOP - MOV #$406E,R9 -BW1 ADD #4,&$1DC6 - MOV &$1DC6,R10 - MOV R9,-4(R10) - MOV R14,-2(R10) -BEGIN - MOV &$1C00,R14 - SUB #2,&$1C00 - MOV @R14,R14 - CMP #0,R14 -0<> WHILE - MOV R10,0(R14) -REPEAT - MOV @R15+,R14 - MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE +LOOP -MOV #$405C,R9 -GOTO BW1 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] - [IF] -CODE - -SUB @R15+,R14 -XOR #-1,R14 -ADD #1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] MAX [IF] - -CODE MAX - CMP @R15,R14 - S< ?GOTO FW1 -BW1 ADD #2,R15 - MOV @R13+,R0 -ENDCODE - -CODE MIN - CMP @R15,R14 - S< ?GOTO BW1 -FW1 MOV @R15+,R14 - MOV @R13+,R0 -ENDCODE - -[THEN] - -[UNDEFINED] SPACES [IF] -CODE SPACES -CMP #0,R14 -0<> IF - PUSH R13 - BEGIN - LO2HI - $20 EMIT - HI2LO - SUB #2,R13 - SUB #1,R14 - 0= UNTIL - MOV @R1+,R13 -THEN -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] DUP [IF] -CODE DUP -BW1 SUB #2,R15 - MOV R14,0(R15) - MOV @R13+,R0 -ENDCODE - -CODE ?DUP -CMP #0,R14 -0<> ?GOTO BW1 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] DEPTH [IF] -CODE DEPTH -MOV R14,-2(R15) -MOV #$1C80,R14 -SUB R15,R14 -RRA R14 -SUB #2,R15 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] >R [IF] -CODE >R -PUSH R14 -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] R> [IF] -CODE R> -SUB #2,R15 -MOV R14,0(R15) -MOV @R1+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] EVALUATE [IF] -CODE EVALUATE -MOV #$1DC0,R9 -MOV @R9+,R12 -MOV @R9+,R11 -MOV @R9+,R10 -PUSHM #4,R13 -LO2HI -INTERPRET -HI2LO -MOV @R1+,&$1DC4 -MOV @R1+,&$1DC2 -MOV @R1+,&$1DC0 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] EXECUTE [IF] -CODE EXECUTE -MOV R14,R10 -MOV @R15+,R14 -MOV R10,R0 -ENDCODE -[THEN] - -[UNDEFINED] U.R [IF] -: U.R - >R <# 0 # #S #> - R> OVER - 0 MAX SPACES TYPE -; -[THEN] - -CODE DATE? - SUB #6,R15 - MOV R14,4(R15) - BEGIN - BIT.B #$10,&$4A2 - 0<> UNTIL - MOV &$4B6,2(R15) - MOV.B &$4B5,R14 - MOV R14,0(R15) - MOV.B &$4B4,R14 -COLON - 2 U.R $2F EMIT - 2 U.R $2F EMIT . -; - -: DATE! -2 DEPTH U< IF - HI2LO - MOV R14,&$4B6 - MOV.B @R15,&$4B5 - MOV.B 2(R15),&$4B4 - ADD #4,R15 - MOV @R15+,R14 - LO2HI -THEN - ." we are on " DATE? -; - -CODE TIME? - SUB #6,R15 - MOV R14,4(R15) - BEGIN - BIT.B #$10,&$4A2 - 0<> UNTIL - MOV.B &$4B0,R14 - MOV R14,2(R15) - MOV.B &$4B1,R14 - MOV R14,0(R15) - MOV.B &$4B2,R14 -COLON - 2 U.R $3A EMIT - 2 U.R $3A EMIT 2 U.R -; - -: TIME! -2 DEPTH U< IF - HI2LO - MOV R14,&$4B0 - MOV.B @R15,&$4B1 - MOV.B 2(R15),&$4B2 - ADD #4,R15 - MOV @R15+,R14 - LO2HI -THEN - ." it is " TIME? -; - -PWR_HERE - - -[UNDEFINED] S_ [IF] -CODE S_ -MOV #0,&$1DB4 -COLON -$4018 , -$20 WORD -HI2LO -MOV.B @R14,R14 -ADD #1,R14 -BIT #1,R14 -ADDC R14,&$1DC6 -MOV @R15+,R14 -MOV @R1+,R13 -MOV #$20,&$1DB4 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ESC [IF] -CODE ESC -CMP #0,&$1DBE -0= IF MOV @R13+,R0 -THEN -COLON -$1B -POSTPONE LITERAL -POSTPONE EMIT -POSTPONE S_ -POSTPONE TYPE -; IMMEDIATE -[THEN] - -: PAD_ACCEPT -$1CE4 -DUP #84 - ['] ACCEPT DUP @ - $4030 = - IF >BODY - THEN - EXECUTE -; - -: GET_TIME -PWR_STATE -42 -0 DO CR LOOP -ESC [H - -CR ." DATE (DMY): " -PAD_ACCEPT -EVALUATE CR DATE! - -CR ." TIME (HMS): " -PAD_ACCEPT -EVALUATE CR TIME! -; - -ECHO GET_TIME diff --git a/MSP430-FORTH/MSP_EXP430FR5994/SD_TEST.4TH b/MSP430-FORTH/MSP_EXP430FR5994/SD_TEST.4TH deleted file mode 100644 index 40cdae0..0000000 --- a/MSP430-FORTH/MSP_EXP430FR5994/SD_TEST.4TH +++ /dev/null @@ -1,432 +0,0 @@ - -; ----------- -; SD_TEST.4th for MSP_EXP430FR5994 -; ----------- - -PWR_STATE - -[DEFINED] {SD_TEST} [IF] {SD_TEST} [THEN] - -MARKER {SD_TEST} - -[UNDEFINED] EXIT [IF] -CODE EXIT -MOV @R1+,R13 -MOV @R13+,R0 - -ENDCODE -[THEN] - -[UNDEFINED] SWAP [IF] -CODE SWAP -MOV @R15,R10 -MOV R14,0(R15) -MOV R10,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] >BODY [IF] -CODE >BODY -ADD #4,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 0= [IF] -CODE 0= -SUB #1,R14 -SUBC R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] ELSE [IF] -CODE ELSE -ADD #4,&$1DC6 -MOV &$1DC6,R10 -MOV #$403E,-4(R10) -MOV R10,0(R14) -SUB #2,R10 -MOV R10,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] BEGIN [IF] -CODE BEGIN - MOV #$402C,R0 -ENDCODE IMMEDIATE - -CODE UNTIL - MOV #$4042,R9 -BW1 ADD #4,&$1DC6 - MOV &$1DC6,R10 - MOV R9,-4(R10) - MOV R14,-2(R10) - MOV @R15+,R14 - MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE AGAIN -MOV #$403E,R9 -GOTO BW1 -ENDCODE IMMEDIATE - -: WHILE -POSTPONE IF SWAP -; IMMEDIATE - -: REPEAT -POSTPONE AGAIN POSTPONE THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] DO [IF] -CODE DO -SUB #2,R15 -MOV R14,0(R15) -ADD #2,&$1DC6 -MOV &$1DC6,R14 -MOV #$404C,-2(R14) -ADD #2,&$1C00 -MOV &$1C00,R10 -MOV #0,0(R10) -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE LOOP - MOV #$406E,R9 -BW1 ADD #4,&$1DC6 - MOV &$1DC6,R10 - MOV R9,-4(R10) - MOV R14,-2(R10) -BEGIN - MOV &$1C00,R14 - SUB #2,&$1C00 - MOV @R14,R14 - CMP #0,R14 -0<> WHILE - MOV R10,0(R14) -REPEAT - MOV @R15+,R14 - MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE +LOOP -MOV #$405C,R9 -GOTO BW1 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] I [IF] -CODE I -SUB #2,R15 -MOV R14,0(R15) -MOV @R1,R14 -SUB 2(R1),R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] + [IF] -CODE + -ADD @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] - [IF] -CODE - -SUB @R15+,R14 -XOR #-1,R14 -ADD #1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] MAX [IF] - CODE MAX - CMP @R15,R14 - S< ?GOTO FW1 -BW1 ADD #2,R15 - MOV @R13+,R0 - ENDCODE - - CODE MIN - CMP @R15,R14 - S< ?GOTO BW1 -FW1 MOV @R15+,R14 - MOV @R13+,R0 - ENDCODE -[THEN] - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] C@ [IF] -CODE C@ -MOV.B @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] ! [IF] -CODE ! -MOV @R15+,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] SPACE [IF] -: SPACE -$20 EMIT ; -[THEN] - -[UNDEFINED] SPACES [IF] -CODE SPACES -CMP #0,R14 -0<> IF - PUSH R13 - BEGIN - LO2HI - $20 EMIT - HI2LO - SUB #2,R13 - SUB #1,R14 - 0= UNTIL - MOV @R1+,R13 -THEN -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] DUP [IF] -CODE DUP -BW1 SUB #2,R15 - MOV R14,0(R15) - MOV @R13+,R0 -ENDCODE - -CODE ?DUP -CMP #0,R14 -0<> ?GOTO BW1 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] OVER [IF] -CODE OVER -MOV R14,-2(R15) -MOV @R15,R14 -SUB #2,R15 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] >R [IF] -CODE >R -PUSH R14 -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] R> [IF] -CODE R> -SUB #2,R15 -MOV R14,0(R15) -MOV @R1+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] STATE [IF] -$1DBE CONSTANT STATE -[THEN] - -[UNDEFINED] IS [IF] -CODE DEFER! -MOV @R15+,2(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -: IS -STATE @ -IF POSTPONE ['] POSTPONE DEFER! -ELSE ' DEFER! -THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] U.R [IF] -: U.R ->R <# 0 # #S #> -R> OVER - 0 MAX SPACES TYPE -; -[THEN] - -[UNDEFINED] DUMP [IF] -CODE DUMP -PUSH R13 -PUSH &$1DDC -MOV #$10,&$1DDC -ADD @R15,R14 -LO2HI - SWAP - DO CR - I 4 U.R SPACE - I 8 + I - DO I C@ 3 U.R LOOP - SPACE - I $10 + I 8 + - DO I C@ 3 U.R LOOP - SPACE SPACE - I $10 + I - DO I C@ $7E MIN $20 MAX EMIT LOOP - $10 +LOOP - R> $1DDC ! -; -[THEN] - -[UNDEFINED] HERE [IF] -CODE HERE -MOV #BEGIN,R0 -ENDCODE -[THEN] - - -CODE SD_EMIT -CMP #512,&$201E -U>= IF - MOV #WRITE,R9 - CALL 2(R9) -THEN -MOV &$201E,R8 -MOV.B R14,$1E00(R8) -ADD #1,&$201E -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE - -: SD_TEST -PWR_HERE -CR -." 0 Set date and time" CR -." 1 Load {TOOLS} words" CR -." 2 Load {SD_TOOLS} words" CR -." 3 Load {CORE_COMP} words" CR -." 4 Load ANS core tests" CR -." 5 Load a 100k program " CR -." 6 Read only this source file" CR -." 7 append a dump of FORTH to YOURFILE.TXT" CR -." 8 delete YOURFILE.TXT" CR -." 9 Load TST_WORDS" CR -." your choice : " -KEY -48 - ?DUP -0= IF - ." LOAD RTC.4TH" CR - LOAD" RTC.4TH" -ELSE 1 - ?DUP - 0= IF - ." LOAD UTILITY.4TH" CR - LOAD" UTILITY.4TH" - ELSE 1 - ?DUP - 0= IF - ." LOAD SD_TOOLS.4TH" CR - LOAD" SD_TOOLS.4TH" - ELSE 1 - ?DUP - 0= IF - ." LOAD CORECOMP.4TH" CR - LOAD" CORECOMP.4TH" - ELSE 1 - ?DUP - 0= IF - ." LOAD CORETEST.4TH" CR - LOAD" CORETEST.4TH" - PWR_STATE - ELSE 1 - ?DUP - 0= IF - ." LOAD PROG100K.4TH" CR - NOECHO - LOAD" PROG100K.4TH" - ELSE 1 - ?DUP - 0= IF - ." READ PROG100K.4TH" CR - READ" PROG100K.4TH" - BEGIN - READ - UNTIL - ELSE 1 - ?DUP - 0= IF - ." WRITE YOURFILE.TXT" CR - WRITE" YOURFILE.TXT" - ['] SD_EMIT IS EMIT - $4000 HERE OVER - DUMP - ['] EMIT >BODY IS EMIT - CLOSE - ELSE 1 - ?DUP - 0= IF - ." DEL YOURFILE.TXT" CR - DEL" YOURFILE.TXT" - ELSE 1 - ?DUP - 0= IF - ." LOAD TSTWORDS.4TH" CR - LOAD" TSTWORDS.4TH" - ELSE - ." abort" CR EXIT - THEN - THEN - THEN - THEN - THEN - THEN - THEN - THEN - THEN -THEN -; - - - -RST_HERE - -[THEN] - -ECHO SD_TEST diff --git a/MSP430-FORTH/MSP_EXP430FR5994/SD_TOOLS.4TH b/MSP430-FORTH/MSP_EXP430FR5994/SD_TOOLS.4TH deleted file mode 100644 index 8963c08..0000000 --- a/MSP430-FORTH/MSP_EXP430FR5994/SD_TOOLS.4TH +++ /dev/null @@ -1,252 +0,0 @@ - -; --------------------------------------------------------------- -; SD_TOOLS.4th for MSP_EXP430FR5994 : BASIC TOOLS for SD Card : DIR FAT SECTOR CLUSTER -; --------------------------------------------------------------- - -PWR_STATE - -[DEFINED] {SD_TOOLS} [IF] {SD_TOOLS} [THEN] - -[UNDEFINED] {SD_TOOLS} [IF] - -MARKER {SD_TOOLS} - -[UNDEFINED] + [IF] -CODE + -ADD @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] MAX [IF] - -CODE MAX - CMP @R15,R14 - S< ?GOTO FW1 -BW1 ADD #2,R15 - MOV @R13+,R0 -ENDCODE - -CODE MIN - CMP @R15,R14 - S< ?GOTO BW1 -FW1 MOV @R15+,R14 - MOV @R13+,R0 -ENDCODE - -[THEN] - -[UNDEFINED] C@ [IF] -CODE C@ -MOV.B @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] ! [IF] -CODE ! -MOV @R15+,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] SPACE [IF] -: SPACE -$20 EMIT ; -[THEN] - -[UNDEFINED] SPACES [IF] -CODE SPACES -CMP #0,R14 -0<> IF - PUSH R13 - BEGIN - LO2HI - $20 EMIT - HI2LO - SUB #2,R13 - SUB #1,R14 - 0= UNTIL - MOV @R1+,R13 -THEN -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] SWAP [IF] -CODE SWAP -MOV @R15,R10 -MOV R14,0(R15) -MOV R10,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] OVER [IF] -CODE OVER -MOV R14,-2(R15) -MOV @R15,R14 -SUB #2,R15 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] >R [IF] -CODE >R -PUSH R14 -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] R> [IF] -CODE R> -SUB #2,R15 -MOV R14,0(R15) -MOV @R1+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] - [IF] -CODE - -SUB @R15+,R14 -XOR #-1,R14 -ADD #1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] U.R [IF] -: U.R - >R <# 0 # #S #> - R> OVER - 0 MAX SPACES TYPE -; -[THEN] - -[UNDEFINED] DO [IF] -CODE DO -SUB #2,R15 -MOV R14,0(R15) -ADD #2,&$1DC6 -MOV &$1DC6,R14 -MOV #$404C,-2(R14) -ADD #2,&$1C00 -MOV &$1C00,R10 -MOV #0,0(R10) -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE LOOP - MOV #$406E,R9 -BW1 ADD #4,&$1DC6 - MOV &$1DC6,R10 - MOV R9,-4(R10) - MOV R14,-2(R10) -BEGIN - MOV &$1C00,R14 - SUB #2,&$1C00 - MOV @R14,R14 - CMP #0,R14 -0<> WHILE - MOV R10,0(R14) -REPEAT - MOV @R15+,R14 - MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE +LOOP -MOV #$405C,R9 -GOTO BW1 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] I [IF] -CODE I -SUB #2,R15 -MOV R14,0(R15) -MOV @R1,R14 -SUB 2(R1),R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] DUMP [IF] -CODE DUMP -PUSH R13 -PUSH &$1DDC -MOV #$10,&$1DDC -ADD @R15,R14 -LO2HI - SWAP - DO CR - I 4 U.R SPACE - I 8 + I - DO I C@ 3 U.R LOOP - SPACE - I $10 + I 8 + - DO I C@ 3 U.R LOOP - SPACE SPACE - I $10 + I - DO I C@ $7E MIN $20 MAX EMIT LOOP - $10 +LOOP - R> $1DDC ! -; -[THEN] - -CODE SECTOR -BW1 MOV R14,R9 - MOV @R15,R10 - CALL &$1818 -COLON - <# #S #> TYPE SPACE - $1E00 $200 DUMP CR ; - -CODE CLUSTER -BW2 BIT.B #4,&$260 - 0<> IF - MOV #COLD,R0 - THEN - MOV.B &$2012,R10 - MOV @R15,R9 - GOTO FW1 - BEGIN - ADD R9,R9 - ADDC R14,R14 -FW1 RRA R10 - U>= UNTIL - ADD &$2010,R9 - MOV R9,0(R15) - ADDC #0,R14 - GOTO BW1 -ENDCODE - -CODE FAT - SUB #4,R15 - MOV R14,2(R15) - MOV &$2008,0(R15) - MOV #0,R14 - GOTO BW1 -ENDCODE - -CODE DIR - SUB #4,R15 - MOV R14,2(R15) - MOV &$202C,0(R15) - MOV &$202E,R14 - CMP #0,R14 - 0<> ?GOTO BW2 - CMP #1,0(R15) - 0<> ?GOTO BW2 - MOV &$200E,0(R15) - GOTO BW1 -ENDCODE - - -RST_HERE - -[THEN] -ECHO - diff --git a/MSP430-FORTH/MSP_EXP430FR5994/TESTXASM.4TH b/MSP430-FORTH/MSP_EXP430FR5994/TESTXASM.4TH deleted file mode 100644 index 002741f..0000000 --- a/MSP430-FORTH/MSP_EXP430FR5994/TESTXASM.4TH +++ /dev/null @@ -1,1081 +0,0 @@ - -; ----------------------------------------------------------------------- -; TESTXASM.4th for MSP_EXP430FR5994 -; ----------------------------------------------------------------------- - -PWR_STATE - -[UNDEFINED] + [IF] -CODE + -ADD @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] - [IF] -CODE - -SUB @R15+,R14 -XOR #-1,R14 -ADD #1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] MAX [IF] - -CODE MAX - CMP @R15,R14 - S< ?GOTO FW1 -BW1 ADD #2,R15 - MOV @R13+,R0 -ENDCODE - -CODE MIN - CMP @R15,R14 - S< ?GOTO BW1 -FW1 MOV @R15+,R14 - MOV @R13+,R0 -ENDCODE - -[THEN] - -[UNDEFINED] ! [IF] -CODE ! -MOV @R15+,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] C@ [IF] -CODE C@ -MOV.B @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] BL [IF] -#32 CONSTANT BL -[THEN] - -[UNDEFINED] SPACE [IF] -: SPACE -BL EMIT ; -[THEN] - -[UNDEFINED] SPACES [IF] -CODE SPACES -CMP #0,R14 -0<> IF - PUSH R13 - BEGIN - LO2HI - BL EMIT - HI2LO - SUB #2,R13 - SUB #1,R14 - 0= UNTIL - MOV @R1+,R13 -THEN -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] OVER [IF] -CODE OVER -MOV R14,-2(R15) -MOV @R15,R14 -SUB #2,R15 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] SWAP [IF] -CODE SWAP -MOV @R15,R10 -MOV R14,0(R15) -MOV R10,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] >R [IF] -CODE >R -PUSH R14 -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] R> [IF] -CODE R> -SUB #2,R15 -MOV R14,0(R15) -MOV @R1+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] ! [IF] -CODE ! -MOV @R15+,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] U.R [IF] -: U.R - >R <# 0 # #S #> - R> OVER - 0 MAX SPACES TYPE -; -[THEN] - -[UNDEFINED] DO [IF] -CODE DO -SUB #2,R15 -MOV R14,0(R15) -ADD #2,&$1DC6 -MOV &$1DC6,R14 -MOV #$404C,-2(R14) -ADD #2,&$1C00 -MOV &$1C00,R10 -MOV #0,0(R10) -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE LOOP - MOV #$406E,R9 -BW1 ADD #4,&$1DC6 - MOV &$1DC6,R10 - MOV R9,-4(R10) - MOV R14,-2(R10) -BEGIN - MOV &$1C00,R14 - SUB #2,&$1C00 - MOV @R14,R14 - CMP #0,R14 -0<> WHILE - MOV R10,0(R14) -REPEAT - MOV @R15+,R14 - MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE +LOOP -MOV #$405C,R9 -GOTO BW1 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] I [IF] -CODE I -SUB #2,R15 -MOV R14,0(R15) -MOV @R1,R14 -SUB 2(R1),R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] DUMP [IF] -CODE DUMP -PUSH R13 -PUSH &$1DDC -MOV #$10,&$1DDC -ADD @R15,R14 -LO2HI - SWAP - DO CR - I 4 U.R SPACE - I 8 + I - DO I C@ 3 U.R LOOP - SPACE - I $10 + I 8 + - DO I C@ 3 U.R LOOP - SPACE SPACE - I $10 + I - DO I C@ $7E MIN BL MAX EMIT LOOP - $10 +LOOP - R> $1DDC ! -; -[THEN] - -[UNDEFINED] HERE [IF] -CODE HERE -MOV #$402C,R0 -ENDCODE -[THEN] - -PWR_HERE - - -ECHO -; -------------------------------------------------------------------------------- -; DTCforthMSP430FR5xxx ASSEMBLER, OPCODES IV : Adda|Cmpa|Mova|Suba (without extended word) -; -------------------------------------------------------------------------------- -; absolute and immediate instructions must be written as $x.xxxx (DOUBLE numbers) -; indexed instructions must be written as $.xxxx(REG) (DOUBLE numbers) -; -------------------------------------------------------------------------------- - -HERE -CODE TEST -MOVA @R10,R11 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>0B 0A<04 44 55 4D 50 4F -PWR_STATE - -HERE -CODE TEST -MOVA @R11+,R10 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>1A 0B<04 44 55 4D 50 4F -PWR_STATE - -HERE -CODE TEST -MOVA &$1.2345,R11 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>2B 01 45 23<04 44 55 4D -PWR_STATE - -HERE -CODE TEST -MOVA $.1234(R10),R12 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>3C 0A 34 12<04 44 55 4D -PWR_STATE - -HERE -CODE TEST -MOVA R11,&$1.2345 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>61 0B 45 23<04 44 55 4D -PWR_STATE - -HERE -CODE TEST -MOVA R12,$.1234(R10) -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>7A 0C 34 12<04 44 55 4D -PWR_STATE - -HERE -CODE TEST -MOVA #$0.1,R12 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>8C 00 01 00<04 44 55 4D -PWR_STATE - -HERE -CODE TEST -CMPA #$1.2345,R12 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>9C 01 45 23<04 44 55 4D -PWR_STATE - -HERE -CODE TEST -ADDA #$2.3456,R12 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>AC 02 56 34<04 44 55 4D -PWR_STATE - -HERE -CODE TEST -SUBA #$3.4567,R12 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>BC 03 67 45<04 44 55 4D -PWR_STATE - - - -HERE -CODE TEST -MOVA R10,R11 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>CB 0A<04 44 55 4D 50 4F -PWR_STATE - -HERE -CODE TEST -CMPA R10,R11 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>DB 0A<04 44 55 4D 50 4F -PWR_STATE - -HERE -CODE TEST -ADDA R10,R11 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>EB 0A<04 44 55 4D 50 4F -PWR_STATE - -HERE -CODE TEST -SUBA R10,R11 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>FB 0A<04 44 55 4D 50 4F -PWR_STATE - -; -------------------------------------------------------------------------------- -; DTCforthMSP430FR5xxx ASSEMBLER: CALLA (without extended word) -; -------------------------------------------------------------------------------- -; absolute and immediate instructions must be written as $x.xxxx (DOUBLE numbers) -; indexed instructions must be written as $.xxxx(REG) (DOUBLE numbers) -; -------------------------------------------------------------------------------- - -HERE -CODE TEST -CALLA R10 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>4A 13<04 44 55 4D 50 4F -PWR_STATE - -HERE -CODE TEST -CALLA $.3456(R10) -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>5A 13 56 34<04 44 55 4D -PWR_STATE - -HERE -CODE TEST -CALLA @R10 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>6A 13<04 44 55 4D 50 4F -PWR_STATE - -HERE -CODE TEST -CALLA @R10+ -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>7A 13<04 44 55 4D 50 4F -PWR_STATE - -HERE -CODE TEST -CALLA &$2.3456 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>82 13 56 34<04 44 55 4D -PWR_STATE - -HERE -CODE TEST -CALLA #$5.6789 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>B5 13 89 67<04 44 55 4D -PWR_STATE - -; -------------------------------------------------------------------------------- -; DTCforthMSP430FR5xxx ASSEMBLER, OPCODES V extended double operand -; -------------------------------------------------------------------------------- -; absolute and immediate instructions must be written as $x.xxxx (DOUBLE numbers) -; indexed instructions must be written as $.xxxx(REG) (DOUBLE numbers) -; -------------------------------------------------------------------------------- - -HERE -CODE TEST -MOV R12,R11 -MOVX R12,R11 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>0B 4C 40 18 0B 4C<04 44 -PWR_STATE - -HERE -CODE TEST -ADD R11,R11 -ADDX.A R11,R11 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>0B 5B 00 18 4B 5B<04 44 -PWR_STATE - -HERE -CODE TEST -ADD R11,R11 -RPT R9 -ADDX.A R11,R11 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>0B 5B 89 18 4B 5B<04 44 -PWR_STATE - -HERE -CODE TEST -ADD R11,R11 -RPT #8 -ADDX.A R11,R11 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>0B 5B 07 18 4B 5B<04 44 -PWR_STATE - -HERE -CODE TEST -ADDC #$9876,R11 -ADDCX.A #$5.9876,R11 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>3B 60 76 98 80 1A 7B 60 -; 76 98<04 44 55 4D -PWR_STATE - -HERE -CODE TEST -ADDC &$9876,R11 -ADDCX.A &$5.9876,R11 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>1B 62 76 98 80 1A 5B 62 -; 76 98<04 44 55 4D -PWR_STATE - -HERE -CODE TEST -XOR.B $5432(R12),R11 -XORX.B $6.5432(R12),R11 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>5B EC 32 54 46 18 5B EC -; 32 54<04 44 55 4D -PWR_STATE - -HERE -CODE TEST -SUBC R11,$5432(R12) -SUBCX.A R11,$6.5432(R12) -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>8C 7B 32 54 06 18 CC 7B -; 32 54<04 44 55 4D -PWR_STATE - -HERE -CODE TEST -XOR.B R11,$5432(R12) -XORX.B R11,$6.5432(R12) -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>CC EB 32 54 46 18 CC EB -; 32 54<04 44 55 4D -PWR_STATE - -; -------------------------------------------------------------------------------- -; DTCforthMSP430FR5xxx ASSEMBLER, OPCODES VI extended single operand (take count of RPT) -; -------------------------------------------------------------------------------- -; absolute and immediate instructions must be written as $x.xxxx (DOUBLE numbers) -; indexed instructions must be written as $.xxxx(REG) (DOUBLE numbers) -; -------------------------------------------------------------------------------- - -HERE -CODE TEST -RRA R9 -RRAX R9 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>09 11 40 18 09 11<04 44 -PWR_STATE - -HERE -CODE TEST -RRC @R9 -RRCX.A @R9 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>29 10 00 18 69 10<04 44 -PWR_STATE - -HERE -CODE TEST -RRC @R12 -RRCX.A @R12 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>2C 10 00 18 6C 10<04 44 -PWR_STATE - -HERE -CODE TEST -RRC @R9+ -RRUX.A @R9+ -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>39 10 00 19 79 10<04 44 -PWR_STATE - -HERE -CODE TEST -RRC R11 -RPT #9 -RRUX.A R11 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>0B 10 08 19 4B 10<04 44 -PWR_STATE - -HERE -CODE TEST -RRC R11 -RPT R9 -RRUX.A R11 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>0B 10 89 19 4B 10<04 44 -PWR_STATE - -HERE -CODE TEST -PUSH #$2345 -PUSHX #$0.2345 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>30 12 45 23 40 18 30 12 -; 45 23<04 44 55 4D -PWR_STATE - -HERE -CODE TEST -PUSH &$5678 -PUSHX.A &$4.5678 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>12 12 78 56 00 1A 52 12 -; 78 56<04 44 55 4D -PWR_STATE - -HERE -CODE TEST -PUSH.B &$33 -PUSHX.B &$.33 -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>52 12 33 00 40 18 52 12 -; 33 00<04 44 55 4D -PWR_STATE - -HERE -CODE TEST -PUSH.B $3344(R11) -PUSHX.B $.3344(R11) -ENDCODE -HERE OVER - DUMP -; you should see: 45 53 54 52>5B 12 44 33 40 18 5B 12 -; 44 33<04 44 55 4D -PWR_STATE - - - -: %. -$1DDC @ %10 $1DDC ! SWAP 8 EMIT . $1DDC ! -; - -: %U. -$1DDC @ %10 $1DDC ! SWAP 8 EMIT U. $1DDC ! ; - -PWR_HERE - - -; ================ -; RRUX test -; ================ - - -CODE RRUX_T -MOVX #$.F0F0,R8 -RRUX R8 -SUB #2,R15 -MOV R14,0(R15) -MOV R8,R14 -MOV #%.,R0 -ENDCODE - -RRUX_T ; you should see %111100001111000 --> % - -PWR_STATE - -; ================ -; RRUX repeat test -; ================ - - -CODE RRUX_T -MOV #$F0F0,R8 -RPT #1 -RRUX R8 -SUB #2,R15 -MOV R14,0(R15) -MOV R8,R14 -MOV #%.,R0 -ENDCODE - -RRUX_T ; you should see %111100001111000 --> % - -PWR_STATE - -CODE RRUX_T -MOV #$F0F0,R8 -RPT #4 -RRUX R8 -SUB #2,R15 -MOV R14,0(R15) -MOV R8,R14 -MOV #%.,R0 -ENDCODE - -RRUX_T ; you should see %111100001111 --> % - -PWR_STATE - -CODE RRUX_T -MOV #$F0F0,R8 -RPT #8 -RRUX R8 -SUB #2,R15 -MOV R14,0(R15) -MOV R8,R14 -MOV #%.,R0 -ENDCODE - -RRUX_T ; you should see %11110000 --> % - -PWR_STATE - - -; ================ -; RRCX test -; ================ - - -CODE RRCX_T -MOV #$8000,R8 -BIC #1,R2 -RRCX R8 -SUB #2,R15 -MOV R14,0(R15) -MOV R8,R14 -MOV #%U.,R0 -ENDCODE - -RRCX_T ; you should see %100000000000000 --> % - -PWR_STATE - -; ================ -; RRCX repeat test -; ================ - -CODE RRCX_T -MOV #$8000,R8 -BIC #1,R2 -RPT #1 -RRCX R8 -SUB #2,R15 -MOV R14,0(R15) -MOV R8,R14 -MOV #%U.,R0 -ENDCODE - -RRCX_T ; you should see %100000000000000 --> % - -PWR_STATE - -CODE RRCX_T -MOV #$8000,R8 -BIC #1,R2 -RPT #8 -RRCX R8 -SUB #2,R15 -MOV R14,0(R15) -MOV R8,R14 -MOV #%U.,R0 -ENDCODE - -RRCX_T ; you should see %10000000 --> % - -PWR_STATE - -; ================ -; RRAX test -; ================ - - -CODE RRAX_T -MOV #$8000,R8 -RRAX R8 -SUB #2,R15 -MOV R14,0(R15) -MOV R8,R14 -MOV #%.,R0 -ENDCODE - -RRAX_T ; you should see %-100000000000000 --> % - -PWR_STATE - -; ================ -; RRAX repeat test -; ================ - - -CODE RRAX_T -MOV #$8000,R8 -RPT #1 -RRAX R8 -SUB #2,R15 -MOV R14,0(R15) -MOV R8,R14 -MOV #%.,R0 -ENDCODE - -RRAX_T ; you should see %-100000000000000 --> % - -PWR_STATE - -CODE RRAX_T -MOV #$8000,R8 -RPT #2 -RRAX R8 -SUB #2,R15 -MOV R14,0(R15) -MOV R8,R14 -MOV #%.,R0 -ENDCODE - -RRAX_T ; you should see %-10000000000000 --> % - -PWR_STATE - -CODE RRAX_T -MOV #$8000,R8 -RPT #3 -RRAX R8 -SUB #2,R15 -MOV R14,0(R15) -MOV R8,R14 -MOV #%.,R0 -ENDCODE - -RRAX_T ; you should see %-1000000000000 --> % - -PWR_STATE - -CODE RRAX_T -MOV #$8000,R8 -RPT #7 -RRAX R8 -SUB #2,R15 -MOV R14,0(R15) -MOV R8,R14 -MOV #%.,R0 -ENDCODE - -RRAX_T ; you should see %-100000000 --> % - -PWR_STATE - -; ================ -; RLAX test -; ================ - - -CODE RLAX_T -MOV #-1,R8 -ADDX R8,R8 -SUB #2,R15 -MOV R14,0(R15) -MOV R8,R14 -MOV #.,R0 -ENDCODE - -RLAX_T ; you should see -2 --> - -PWR_STATE - -; ================ -; RLAX repeat test -; ================ - - -CODE RLAX_T -MOV #-1,R8 -RPT #1 -ADDX R8,R8 -SUB #2,R15 -MOV R14,0(R15) -MOV R8,R14 -MOV #.,R0 -ENDCODE - -RLAX_T ; you should see -2 --> - -PWR_STATE - -CODE RLAX_T -MOV #-1,R8 -RPT #2 -ADDX R8,R8 -SUB #2,R15 -MOV R14,0(R15) -MOV R8,R14 -MOV #.,R0 -ENDCODE - -RLAX_T ; you should see -4 --> - -PWR_STATE - -CODE RLAX_T -MOV #-1,R8 -RPT #3 -ADDX R8,R8 -SUB #2,R15 -MOV R14,0(R15) -MOV R8,R14 -MOV #.,R0 -ENDCODE - -RLAX_T ; you should see -8 --> - -PWR_STATE - -CODE RLAX_T -MOV #-1,R8 -RPT #8 -ADDX R8,R8 -SUB #2,R15 -MOV R14,0(R15) -MOV R8,R14 -MOV #.,R0 -ENDCODE - -RLAX_T ; you should see -256 --> - -PWR_STATE - -; ================ -; ADDX test -; ================ - - -CODE ADDX_T -MOV #0,R8 -MOV #-1,R9 -ADDX R9,R8 -SUB #2,R15 -MOV R14,0(R15) -MOV R8,R14 -MOV #.,R0 -ENDCODE - -ADDX_T ; you should see -1 --> - -PWR_STATE - -; ================ -; ADDX repeat test -; ================ - - -CODE ADDX_T -MOV #0,R8 -MOV #-1,R9 -RPT #1 -ADDX R9,R8 -SUB #2,R15 -MOV R14,0(R15) -MOV R8,R14 -MOV #.,R0 -ENDCODE - -ADDX_T ; you should see -1 --> - -PWR_STATE - -CODE ADDX_T -MOV #0,R8 -MOV #-1,R9 -RPT #2 -ADDX R9,R8 -SUB #2,R15 -MOV R14,0(R15) -MOV R8,R14 -MOV #.,R0 -ENDCODE - -ADDX_T ; you should see -2 --> - -PWR_STATE - -CODE ADDX_T -MOV #0,R8 -MOV #-1,R9 -RPT #8 -ADDX R9,R8 -SUB #2,R15 -MOV R14,0(R15) -MOV R8,R14 -MOV #.,R0 -ENDCODE - -ADDX_T ; you should see -8 --> - -PWR_STATE - - -; ================ -; SUBX test -; ================ - - -CODE SUBX_T -MOV #0,R8 -MOV #-1,R9 -SUBX R9,R8 -SUB #2,R15 -MOV R14,0(R15) -MOV R8,R14 -MOV #.,R0 -ENDCODE - -SUBX_T ; you should see 1 --> - -PWR_STATE - -; ================ -; SUBX repeat test -; ================ - - -CODE SUBX_T -MOV #0,R8 -MOV #-1,R9 -RPT #1 -SUBX R9,R8 -SUB #2,R15 -MOV R14,0(R15) -MOV R8,R14 -MOV #.,R0 -ENDCODE - -SUBX_T ; you should see 1 --> - -PWR_STATE - -CODE SUBX_T -MOV #0,R8 -MOV #-1,R9 -RPT #2 -SUBX R9,R8 -SUB #2,R15 -MOV R14,0(R15) -MOV R8,R14 -MOV #.,R0 -ENDCODE - -SUBX_T ; you should see 2 --> - -PWR_STATE - -CODE SUBX_T -MOV #0,R8 -MOV #-1,R9 -RPT #8 -SUBX R9,R8 -SUB #2,R15 -MOV R14,0(R15) -MOV R8,R14 -MOV #.,R0 -ENDCODE - -SUBX_T ; you should see 8 --> - -PWR_STATE - -CODE SUBX_T -MOV #15,R10 -MOV #0,R8 -MOV #-1,R9 -RPT R10 -SUBX R9,R8 -SUB #2,R15 -MOV R14,0(R15) -MOV R8,R14 -MOV #.,R0 -ENDCODE - -SUBX_T ; you should see 16 --> - -PWR_STATE - -CODE SUBX_T -MOV #32,R10 -MOV #0,R8 -MOV #-1,R9 -RPT R10 -SUBX R9,R8 -SUB #2,R15 -MOV R14,0(R15) -MOV R8,R14 -MOV #.,R0 -ENDCODE - -SUBX_T ; you should see 1 --> - -PWR_STATE - -CODE SUBX_T -MOV #33,R10 -MOV #0,R8 -MOV #-1,R9 -RPT R10 -SUBX R9,R8 -SUB #2,R15 -MOV R14,0(R15) -MOV R8,R14 -MOV #.,R0 -ENDCODE - -SUBX_T ; you should see 2 --> - -RST_STATE diff --git a/MSP430-FORTH/MSP_EXP430FR5994/TSTWORDS.4TH b/MSP430-FORTH/MSP_EXP430FR5994/TSTWORDS.4TH deleted file mode 100644 index fb92b9c..0000000 --- a/MSP430-FORTH/MSP_EXP430FR5994/TSTWORDS.4TH +++ /dev/null @@ -1,90 +0,0 @@ -\ ----------------------------- -\ MSP-EXP430FR5969_TSTWORDS.4th -\ ----------------------------- - -PWR_STATE - -\ ----------------------------------------------------------------------- -\ test some assembler words and show how to mix FORTH/ASSEMBLER routines -\ ----------------------------------------------------------------------- -LOAD" \misc\TestASM.4th" - -\ ------------------------------------- -\ here we returned in the TestWords.4th -\ ------------------------------------- -ECHO -\ ---------- -\ 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 --- - - 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 -- - $20 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 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 - ." type a key : " - KEY EMIT \ wait for a KEY, then emit it -; -\ KEY_TEST diff --git a/MSP430-FORTH/MSP_EXP430FR5994/UARTI2CS.4TH b/MSP430-FORTH/MSP_EXP430FR5994/UARTI2CS.4TH deleted file mode 100644 index cd13da6..0000000 --- a/MSP430-FORTH/MSP_EXP430FR5994/UARTI2CS.4TH +++ /dev/null @@ -1,352 +0,0 @@ - -; ---------------------------------------------------------------------- -; UARTI2CS.4th for MSP_EXP430FR5994 -; ---------------------------------------------------------------------- -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] AND [IF] -CODE AND -AND @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 0= [IF] -CODE 0= -SUB #1,R14 -SUBC R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -: I2CTERM_ABORT -$0D EMIT -1 ABORT" <-- Ouch! unexpected target with I2C TERMINAL" -; - -$1812 @ $7800 AND 0= [IF] ; unexpected I2C TERMINAL ? -I2CTERM_ABORT -[THEN] - -PWR_STATE - -[DEFINED] {UARTI2CS} [IF] {UARTI2CS} [THEN] - -MARKER {UARTI2CS} - -[UNDEFINED] < [IF] -CODE < - SUB @R15+,R14 - S< ?GOTO FW1 - 0<> IF -BW1 MOV #-1,R14 - THEN - MOV @R13+,R0 -ENDCODE - -CODE > - SUB @R15+,R14 - S< ?GOTO BW1 -FW1 AND #0,R14 - MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] CONSTANT [IF] -: CONSTANT -CREATE -HI2LO -MOV R14,-2(R10) -MOV @R15+,R14 -MOV @R1+,R13 -MOV @R13+,R0 -ENDCODE -[THEN] - -$FFA2 CONSTANT I2CS_ADR - -ASM QUIT_I2C -BW1 - BIS.B #6,&$267 - BIC.B #6,&$265 - BIS.B #6,&$263 - MOV #$5A88,&$15C - BIC #1,&$100 - MOV #COLD,&$FFF2 - MOV #0,&$3C0 - MOV #COLD,&TB0_x_VEC - MOV &$181C,&$FFF0 - MOV #WARM,R9 - ADD #4,R9 - MOV R9,-2(R9) - MOV #COLD,R0 -ENDASM - -ASM WDT_INT -BIT #8,&$5CA -0<> IF - ADD #4,R1 - GOTO BW1 -THEN -RETI -ENDASM - - -ASM TERM_INT -ADD #4,R1 -MOV &$1CE0,R10 -MOV #$1CE4,R11 -MOV #$0D,R12 -BEGIN - MOV.B &$5CC,R8 - ADD #1,R11 - MOV.B R8,-1(R11) - CMP.B R8,R12 -0<> WHILE - CMP #0,R10 - 0= IF - BEGIN - BIT #2,&$5DC - 0<> UNTIL - MOV.B R8,&$5CE - THEN - BEGIN - BIT #1,&$5DC - 0<> UNTIL -REPEAT -CALL &$1816 -BEGIN - BIT #1,&$5DC -0<> UNTIL -BW1 -MOV.B &$5CC,R12 -MOV.B R12,0(R11) -BIS.B #4,&$265 -MOV.B &I2CS_ADR,R9 -MOV #$1CE4,R8 -MOV R0,R0 -BIS.B #2,&$265 -BEGIN - MOV.B #8,R10 - BEGIN - ADD.B R9,R9 - U>= IF - BIC.B #4,&$265 - ELSE - BIS.B #4,&$265 - THEN - BIC.B #2,&$265 - BEGIN - BIT.B #2,&$261 - 0<> UNTIL - BIS.B #2,&$265 - SUB #1,R10 - 0= UNTIL - BIC.B #4,&$265 - BIC.B #2,&$265 - MOV R0,R0 - BIT.B #4,&$261 - BIS.B #2,&$265 -0= WHILE - CMP R12,R11 -0<> WHILE - MOV.B @R8+,R9 - MOV R9,R11 -REPEAT -THEN - MOV R0,R0 - BIC.B #2,&$265 -GOTO FW1 -ENDASM - -ASM TxIFG_INT -ADD #4,R1 -FW1 -BW3 -$1812 @ 0 < -[IF] - MOV #%0001_1101_0110,&$3C0 -[ELSE] - MOV #%0001_0101_0110,&$3C0 -[THEN] -BEGIN - BEGIN - BIT #8,&$5CA - 0<> IF - MOV #QUIT_I2C,R0 - THEN - BIS.B #4,&$265 - MOV.B &I2CS_ADR,R8 - BIS.B #1,R8 - $3C00 , - BIS.B #2,&$265 - MOV.B #8,R10 - BEGIN - ADD.B R8,R8 - U>= IF - BIC.B #4,&$265 - ELSE - BIS.B #4,&$265 - THEN - BIC.B #2,&$265 - MOV R0,R0 - BIS.B #2,&$265 - SUB #1,R10 - 0= UNTIL - BIC.B #4,&$265 - BIC.B #2,&$265 - BEGIN - BIT.B #2,&$261 - 0<> UNTIL - BIT.B #4,&$261 - BIS.B #2,&$265 - 0<> WHILE - MOV R0,R0 - BIS.B #4,&$265 - MOV R0,R0 - BIC.B #2,&$265 - MOV R0,R0 - MOV R0,R0 - BIC.B #4,&$265 - CMP.B #4,R9 - U>= IF - MOV #$4000,R0 - THEN - REPEAT - BEGIN - BEGIN - BIC.B #4,&$265 - MOV.B #8,R10 - BEGIN - BIC.B #2,&$265 - MOV R0,R0 - BIT.B #4,&$261 - BIS.B #2,&$265 - ADDC.B R9,R9 - SUB #1,R10 - 0= UNTIL - CMP.B #-1,R9 - 0= IF - MOV #2,R9 - THEN - CMP.B #8,R9 - U>= WHILE - BEGIN - BIT #2,&$5DC - 0<> UNTIL - BIS.B #4,&$265 - BIC.B #2,&$265 - BEGIN - BIT.B #2,&$261 - 0<> UNTIL - MOV.B R9,&$5CE - BIS.B #2,&$265 - REPEAT - CMP.B #4,R9 - U>= IF - 0= IF - MOV #1,&$1CE0 - ELSE - MOV #0,&$1CE0 - THEN - BIS.B #4,&$265 - THEN - BIC.B #2,&$265 - BEGIN - BIT.B #2,&$261 - 0<> UNTIL - BIT.B #4,&$261 - BIS.B #2,&$265 - 0<> UNTIL - CMP.B #2,R9 -U>= WHILE - 0= IF - MOV #0,&$1CE0 - CALL &$1814 - BEGIN - BIC #1,&$5DC - MOV &$1806,R8 - BEGIN MOV #32,R10 - BEGIN SUB #1,R10 - 0= UNTIL - SUB #1,R8 - 0= UNTIL - BIT #1,&$5DC - 0= UNTIL - THEN -REPEAT -BIS.B #4,&$265 -BIC.B #2,&$265 -MOV R0,R0 -MOV #$1CE4,R11 -BIC.B #4,&$265 -CMP.B #1,R9 -0= IF - CALL &$1814 - BEGIN - BIT #1,&$5DC - 0<> UNTIL - CALL &$1816 - GOTO BW1 -THEN -MOV #$4000,R0 -ENDASM - - -ASM I2C_WARM -CMP #4,&$1808 -0= IF - BIT.B #$20,&$240 - 0= IF - MOV #QUIT_I2C,R0 - THEN -THEN -CMP #$10,&$1808 -U>= IF - MOV #QUIT_I2C,R0 -THEN -MOV #0,&$1808 -MOV #%0101_1010_0101_1111,&$15C -BIS #1,&$100 -MOV #WDT_INT,&$FFF2 -MOV #$800,&$3D2 -MOV #TxIFG_INT,&TB0_x_VEC -MOV #TERM_INT,&$FFF0 -BIC.B #6,&$267 -BIC.B #6,&$263 -BIC #1,&$130 -MOV.B #4,R9 -GOTO BW3 -ENDASM - -: UARTI2CS -CR -HI2LO -MOV @R1+,R13 -MOV R14,&I2CS_ADR -MOV @R15+,R14 -MOV #WARM,R9 -MOV #I2C_WARM,2(R9) -MOV R9,R0 -ENDCODE - -RST_HERE ECHO - -#16 UARTI2CS ; Alt-B (TERATERM) or S2+RESET (I2C_Master) to quit - -; Since there is no difference in behaviour whether the TERMINAL is connected to the Master -; or bridged to any Slave, WARM is the convenient way to check which target is connected to, -; because, as any ABORT message, WARM displays first the decimal I2C address if applicable: -WARM diff --git a/MSP430-FORTH/MSP_EXP430FR5994/UTILITY.4TH b/MSP430-FORTH/MSP_EXP430FR5994/UTILITY.4TH deleted file mode 100644 index 22a26ba..0000000 --- a/MSP430-FORTH/MSP_EXP430FR5994/UTILITY.4TH +++ /dev/null @@ -1,453 +0,0 @@ - -; ------------------------------------------------------------------------------ -; UTILITY.4th for MSP_EXP430FR5994 -; ------------------------------------------------------------------------------ - - -PWR_HERE - -[DEFINED] {TOOLS} [IF] {TOOLS} [THEN] - -[UNDEFINED] {TOOLS} [IF] - -MARKER {TOOLS} - -[UNDEFINED] EXIT [IF] -CODE EXIT -MOV @R1+,R13 -MOV @R13+,R0 - -ENDCODE -[THEN] - -[UNDEFINED] SWAP [IF] -CODE SWAP -MOV @R15,R10 -MOV R14,0(R15) -MOV R10,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] U< [IF] -CODE U< -SUB @R15+,R14 -0<> IF - MOV #-1,R14 - U< IF - AND #0,R14 - THEN -THEN -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] IF [IF] -CODE IF -SUB #2,R15 -MOV R14,0(R15) -MOV &$1DC6,R14 -ADD #4,&$1DC6 -MOV #$4042,0(R14) -ADD #2,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE THEN -MOV &$1DC6,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] BEGIN [IF] -CODE BEGIN - MOV #$402C,R0 -ENDCODE IMMEDIATE - -CODE UNTIL - MOV #$4042,R9 -BW1 ADD #4,&$1DC6 - MOV &$1DC6,R10 - MOV R9,-4(R10) - MOV R14,-2(R10) - MOV @R15+,R14 - MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE AGAIN -MOV #$403E,R9 -GOTO BW1 -ENDCODE IMMEDIATE - -: WHILE -POSTPONE IF SWAP -; IMMEDIATE - -: REPEAT -POSTPONE AGAIN POSTPONE THEN -; IMMEDIATE -[THEN] - -[UNDEFINED] DO [IF] -CODE DO -SUB #2,R15 -MOV R14,0(R15) -ADD #2,&$1DC6 -MOV &$1DC6,R14 -MOV #$404C,-2(R14) -ADD #2,&$1C00 -MOV &$1C00,R10 -MOV #0,0(R10) -MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE LOOP - MOV #$406E,R9 -BW1 ADD #4,&$1DC6 - MOV &$1DC6,R10 - MOV R9,-4(R10) - MOV R14,-2(R10) -BEGIN - MOV &$1C00,R14 - SUB #2,&$1C00 - MOV @R14,R14 - CMP #0,R14 -0<> WHILE - MOV R10,0(R14) -REPEAT - MOV @R15+,R14 - MOV @R13+,R0 -ENDCODE IMMEDIATE - -CODE +LOOP -MOV #$405C,R9 -GOTO BW1 -ENDCODE IMMEDIATE -[THEN] - -[UNDEFINED] I [IF] -CODE I -SUB #2,R15 -MOV R14,0(R15) -MOV @R1,R14 -SUB 2(R1),R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] DUP [IF] -CODE DUP -BW1 SUB #2,R15 - MOV R14,0(R15) - MOV @R13+,R0 -ENDCODE - -CODE ?DUP -CMP #0,R14 -0<> ?GOTO BW1 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] SWAP [IF] -CODE SWAP -MOV @R15,R10 -MOV R14,0(R15) -MOV R10,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - - -[UNDEFINED] DROP [IF] -CODE DROP -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] >R [IF] -CODE >R -PUSH R14 -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] R> [IF] -CODE R> -SUB #2,R15 -MOV R14,0(R15) -MOV @R1+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] @ [IF] -CODE @ -MOV @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] ! [IF] -CODE ! -MOV @R15+,0(R14) -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] SPACE [IF] -: SPACE -$20 EMIT ; -[THEN] - -[UNDEFINED] SPACES [IF] -CODE SPACES -CMP #0,R14 -0<> IF - PUSH R13 - BEGIN - LO2HI - $20 EMIT - HI2LO - SUB #2,R13 - SUB #1,R14 - 0= UNTIL - MOV @R1+,R13 -THEN -MOV @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 2DUP [IF] -CODE 2DUP -MOV R14,-2(R15) -MOV @R15,-4(R15) -SUB #4,R15 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] 1+ [IF] -CODE 1+ -ADD #1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] + [IF] -CODE + -ADD @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] - [IF] -CODE - -SUB @R15+,R14 -XOR #-1,R14 -ADD #1,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] C@ [IF] -CODE C@ -MOV.B @R14,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] AND [IF] -CODE AND -AND @R15+,R14 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] ROT [IF] -CODE ROT -MOV @R15,R10 -MOV R14,0(R15) -MOV 2(R15),R14 -MOV R10,2(R15) -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] MAX [IF] - CODE MAX - CMP @R15,R14 - S< ?GOTO FW1 -BW1 ADD #2,R15 - MOV @R13+,R0 - ENDCODE - - CODE MIN - CMP @R15,R14 - S< ?GOTO BW1 -FW1 MOV @R15+,R14 - MOV @R13+,R0 - ENDCODE -[THEN] - -[UNDEFINED] OVER [IF] -CODE OVER -MOV R14,-2(R15) -MOV @R15,R14 -SUB #2,R15 -MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] MOVE [IF] -CODE MOVE -MOV R14,R10 -MOV @R15+,R8 -MOV @R15+,R9 -MOV @R15+,R14 -CMP #0,R10 -0<> IF - CMP R9,R8 - 0= ?GOTO FW1 - U< IF - BEGIN - MOV.B @R9+,0(R8) - ADD #1,R8 - SUB #1,R10 - 0= UNTIL - MOV @R13+,R0 - ELSE - ADD R10,R8 - ADD R10,R9 - BEGIN - SUB #1,R9 - SUB #1,R8 - MOV.B @R9,0(R8) - SUB #1,R10 - 0= UNTIL - THEN -THEN -FW1 MOV @R13+,R0 -ENDCODE -[THEN] - -[UNDEFINED] .S [IF] -CODE .S - MOV R14,-2(R15) - MOV R15,R14 - SUB #2,R14 - MOV R14,-6(R15) - MOV #$1C80,R14 - SUB #2,R14 -BW1 MOV R14,-4(R15) - SUB #6,R15 - SUB @R15,R14 - RRA R14 -COLON - $3C EMIT - . - $08 EMIT - $3E EMIT SPACE - 2DUP 1+ - U< IF - DROP DROP EXIT - THEN - $1DDC @ >R - $10 $1DDC ! - DO - I @ U. - 2 +LOOP - R> $1DDC ! -; -[THEN] - -[UNDEFINED] .RS [IF] -CODE .RS - MOV R14,-2(R15) - MOV R1,-6(R15) - MOV #$1CE0,R14 - GOTO BW1 -ENDCODE -[THEN] - -[UNDEFINED] ? [IF] -CODE ? - MOV @R14,R14 - MOV #U.,R0 -ENDCODE -[THEN] - -[UNDEFINED] WORDS [IF] -: WORDS -CR -$1DCA @ $1CE4 -$1800 @ DUP + -MOVE -BEGIN - 0 DUP - $1800 @ DUP + 0 - DO - DUP I $1CE4 + @ - U< IF - DROP DROP - I DUP $1CE4 + @ - THEN - 2 +LOOP - ?DUP -WHILE - DUP - 2 - @ - ROT - $1CE4 + - ! - DUP - COUNT $7F AND - TYPE - C@ $0F AND - $10 SWAP - SPACES -REPEAT -DROP -; -[THEN] - -[UNDEFINED] U.R [IF] -: U.R ->R <# 0 # #S #> -R> OVER - 0 MAX SPACES TYPE -; -[THEN] - -[UNDEFINED] DUMP [IF] -CODE DUMP -PUSH R13 -PUSH &$1DDC -MOV #$10,&$1DDC -ADD @R15,R14 -LO2HI - SWAP 2DUP - U. U. - $FFF0 AND - DO CR - I 4 U.R SPACE - I 8 + I - DO I C@ 3 U.R LOOP - SPACE - I $10 + I 8 + - DO I C@ 3 U.R LOOP - SPACE SPACE - I $10 + I - DO I C@ $7E MIN $20 MAX EMIT LOOP - $10 +LOOP - R> $1DDC ! -; -[THEN] - -RST_HERE - -[THEN] -ECHO diff --git a/MSP430-FORTH/PROG100k.f b/MSP430-FORTH/PROG100k.f index 7dd37cc..22188b2 100644 --- a/MSP430-FORTH/PROG100k.f +++ b/MSP430-FORTH/PROG100k.f @@ -80,7 +80,20 @@ \ \ rc5 <--- OUT IR_Receiver (1 TSOP32236) -PWR_STATE +\ first, we test for downloading driver only if UART TERMINAL target +CODE ABORT_RC5TOLCD +SUB #2,PSP +MOV TOS,0(PSP) +MOV &VERSION,TOS +SUB #307,TOS \ FastForth V3.7 +COLON +'CR' EMIT \ return to column 1 without 'LF' +ABORT" FastForth version = 3.7 please!" +PWR_STATE \ remove ABORT_UARTI2CS definition before resuming +; + +ABORT_RC5TOLCD + [DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] \ remove application diff --git a/MSP430-FORTH/RC5toLCD.f b/MSP430-FORTH/RC5toLCD.f index c81572c..605dfea 100644 --- a/MSP430-FORTH/RC5toLCD.f +++ b/MSP430-FORTH/RC5toLCD.f @@ -20,14 +20,17 @@ \ then select your TARGET when asked. \ \ -\ 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 ! +\ ================================================================================ +\ REGISTERS USAGE for embedded MSP430 ASSEMBLER +\ ================================================================================ +\ don't use R2, R3, R4 +\ R5, R6, R7 must be PUSHed/POPed before/after use, OR restored after: MOV #{XDOCOL|XDOCON|R>},{rDODOES|rDOCON|rDOVAR} +\ scratch registers Y to S are free, +\ under interrupt, IP is free, +\ use FORTH rules for reg. TOS, PSP, RSP. \ -\ PUSHM order : PSP,TOS, IP, S, T, W, X, Y, rEXIT,rDOVAR,rDOCON, rDODOES, R3, SR,RSP, PC -\ PUSHM order : R15,R14,R13,R12,R11,R10, R9, R8, R7 , R6 , R5 , R4 , R3, R2, R1, R0 +\ PUSHM order : PSP,TOS, IP, S , T , W , X , Y ,rDOVAR,rDOCON,rDODOES,rDOCOL, R3, SR,RSP, PC +\ PUSHM order : R15,R14,R13,R12,R11,R10, R9, R8, R7 , R6 , R5 , R4 , R3, R2, R1, R0 \ \ example : PUSHM #6,IP pushes IP,S,T,W,X,Y registers to return stack \ @@ -37,9 +40,8 @@ \ example : POPM #6,IP pop Y,X,W,T,S,IP registers from return stack \ \ 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< +\ ASSEMBLER conditionnal usage before ?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) @@ -82,20 +84,28 @@ \ rc5 <--- OUT IR_Receiver (1 TSOP32236) -PWR_STATE +\ first, we test for downloading driver only if UART TERMINAL target +CODE ABORT_RC5TOLCD +SUB #2,PSP +MOV TOS,0(PSP) +MOV &VERSION,TOS +SUB #307,TOS \ FastForth V3.7 +COLON +'CR' EMIT \ return to column 1 without 'LF' +ABORT" FastForth version = 3.7 please!" +PWR_STATE \ remove ABORT_UARTI2CS definition before resuming +; -[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] \ remove application +ABORT_RC5TOLCD -MARKER {RC5TOLCD} -[UNDEFINED] @ [IF] -\ https://forth-standard.org/standard/core/Fetch -\ @ c-addr -- char fetch char from memory -CODE @ -MOV @TOS,TOS -MOV @IP+,PC -ENDCODE -[THEN] +[DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] \ remove application + +MARKER {RC5TOLCD} \ restore the state before MARKER definition +\ \ {UARTI2CS}+8 = RET_ADR: by default MARKER_DOES does CALL #RET_ADR +6 ALLOT \ {UARTI2CS}+10: make room to save previous INI_APP address + \ {RC5TOLCD}+12: make room to save previous WDT_TIM_0_VEC + \ {RC5TOLCD}+14: make room to save previous IR_VEC [UNDEFINED] CONSTANT [IF] \ https://forth-standard.org/standard/core/CONSTANT @@ -327,7 +337,6 @@ ELSE THEN \ THEN \ THEN \ -BW1 \ <== truncated RC5 message, repeated RC5 command RETI \ 5 ENDASM @@ -384,7 +393,7 @@ MOV #%1011100100,&RC5_TIM_CTL \ (re)start timer_A | SMCLK/8 time interval,free CMP Y,X \ 1 | cycle time out of bound ? U>= IF \ 2 ^ | yes: BIC #$30,&RC5_TIM_CTL \ | | stop timer - GOTO BW1 \ | | quit on truncated RC5 message + RETI \ | | quit on truncated RC5 message THEN \ | | BIT.B #RC5,&IR_IFG \ 3 | | n+1/2 cycles edge is always present 0<> UNTIL \ 2 | | @@ -413,7 +422,7 @@ THEN \ X = 0 C6 C5 C4 C3 C2 C1 C0 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 BW1 \ yes, RETI without UF10 change and without action ! +0= IF RETI THEN \ yes, RETI without UF10 change and without action ! XOR #UF10,0(RSP) \ 5 toggle bit memory \ ******************************\ \ Display IR_RC5 code \ @@ -436,61 +445,67 @@ MOV @PSP+,TOS \ -- TOS RETI ENDASM -\ ******************************\ -ASM BACKGROUND \ -\ ******************************\ -BEGIN -\ ... \ insert here your background task -\ ... \ -\ ... \ - CALL &RXON \ comment this line to disable TERMINAL_INPUT - BIS &LPM_MODE,SR \ -\ ******************************\ -\ here start all interrupts \ -\ ******************************\ -\ here return all interrupts \ -\ ******************************\ -AGAIN \ -ENDASM \ -\ ******************************\ \ ------------------------------\ -ASM SYS_OUT \ system OUT init, replaces WARM at the request of STOP. +ASM STOP_R2L \ define new STOP_APP \ ------------------------------\ -\ ... \ init specific I/O sys as you want -\ ... \ before executing default WARM - MOV #WARM,X \ ['] WARM - ADD #4,X \ >BODY - MOV X,PC \ EXECUTE (which activates IO and TERMINAL) +CMP #RET_ADR,&{RC5TOLCD}+8 \ +0<> IF \ if previous START executing + BIC.B #RC5,&IR_IE \ clear I/O RC5_Int + BIC.B #RC5,&IR_IFG \ clear I/O RC5_Int flag + MOV #0,&LCD_TIM_CTL \ stop LCD_TIMER + MOV #0,&WDT_TIM_CTL \ stop WDT_TIMER + MOV #0,&WDT_TIM_CCTL0 \ clear CCIFG0 disable CCIE0 + MOV #RET_ADR,&{RC5TOLCD}+8 \ clear MARKER_DOES call + MOV &{RC5TOLCD}+10,&WARM+2 \ restore previous ini_APP + MOV &{RC5TOLCD}+12,&WDT_TIM_0_VEC \ restore Vector previous value + MOV &{RC5TOLCD}+14,&IR_VEC \ restore Vector previous value + MOV &{RC5TOLCD}+10,PC \ run previous INI_APP, then RET +THEN +MOV @RSP+,PC \ RET ENDASM -\ ------------------------------\ \ ------------------------------\ -CODE STOP \ stops multitasking, must to be used before downloading app +CODE STOP \ \ ------------------------------\ -BW1 MOV #SLEEP,X \ the ASM word SLEEP is only visible in mode assembler. - ADD #4,X \ X = BODY of SLEEP, X-2 = PFA of SLEEP - MOV X,-2(X) \ restore the default background: SLEEP - MOV #WARM,X - MOV #SYS_OUT,2(X) \ default WARM is replaced by JMJ_BOX SYS_OUT (ended by default WARM) - BIC.B #RC5,&IR_IE \ clear RC5_Int - BIC.B #RC5,&IR_IFG \ clear RC5_Int flag - MOV #0,&LCD_TIM_CTL \ stop LCD_TIMER - MOV #0,&WDT_TIM_CTL \ stop WDT_TIMER - MOV #0,&WDT_TIM_CCTL0 \ clear CCIFG0 disable CCIE0 - MOV #COLD,X \ X = COLD adr = default vectors value - MOV X,&IR_VEC \ - MOV X,&WDT_TIM_0_VEC \ +BW1 \ <-- INI_R2L for some events +CALL #STOP_R2L COLON \ restore default action of primary DEFERred word WARM (FORTH version) ECHO \ ." RC5toLCD is removed," ." type START to restart" - WARM \ performs reset to reset all interrupt vectors. +ABORT" " ; \ ------------------------------\ \ ------------------------------\ -CODE SYS_INIT \ this routine completes the init of system, i.e. FORTH + this app. +ASM INI_R2L \ this routine completes the init of system, i.e. FORTH + this app. +\ ------------------------------\ +\ activate I/O \ +\ ------------------------------\ +BIC #1,&PM5CTL0 \ activate I/O to enable SW2 test +\ ------------------------------\ +\ RESET events handling \ search "SYSRSTIV" in your MSP430FRxxxx datasheet to get listing +\ ------------------------------\ +MOV &RSTIV_MEM,TOS \ SYSRSTIV = $00|$02|$04|$0E|$xx = POWER_ON|RST|SVSH_threshold|SYS_failures +CMP #$0E,TOS \ RSTIV_MEM = SVSHIFG SVSH event ? +0<> IF \ if not + CMP #$0A,TOS \ RSTIV_MEM >= violation memory protected areas ? + U>= ?GOTO BW1 \ execute STOP_R2L then RET to BODY of WARM +THEN \ +BIT.B #SW2,&SW2_IN \ hardware SW2+RST ? +0= ?GOTO BW1 \ hardware SW2+RST execute STOP_U2I then RET to BODY of WARM +\ CMP #4,TOS \ hardware RST +\ 0= ?GOTO BW1 \ hardware RST performs STOP. +\ CMP #2,TOS \ Power_ON event +\ 0= ?GOTO BW1 \ uncomment if you want to loose application in this case... +\ CMP #6,TOS \ +\ 0= ?GOTO BW1 \ COLD event performs STOP... uncomment if it's that you want. +\ CMP #$0A,TOS \ +\ 0= ?GOTO BW1 \ fault event (violation memory protected areas) performs STOP +\ CMP #$16,TOS \ +\ U>= ?GOTO BW1 \ all other fault events + Deep Reset perform STOP +MOV #0,&RSTIV_MEM \ clear RSTIV_MEM after use and before next RST event! \ ------------------------------\ \ LCD_TIM_CTL = %0000 0010 1001 0100\$3C0 \ - - \CNTL Counter lentgh \ 00 = 16 bits @@ -549,7 +564,6 @@ MOV #%0110_0000,&LCD_TIM_CCTLn \ output mode = set/reset \ clear CCIFG \ ******************************\ 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 WDT_TIM_ \ eUSCI_A0 (FORTH terminal) has higher priority than WDT_TIM_ \ ******************************\ @@ -575,32 +589,12 @@ MOV #%01_0001_0100,&WDT_TIM_CTL \ start WDT_TIM_, ACLK, up mode, disable int, \ - \ CCIFGn MOV #%10000,&WDT_TIM_CCTL0 \ enable compare interrupt, clear CCIFG0 \ ------------------------------\ - MOV #WDT_INT,&WDT_TIM_0_VEC \ for only CCIFG0 int, this interrupt clears automatically CCIFG0 -\ ------------------------------\ \ define LPM mode for ACCEPT \ \ ------------------------------\ \ MOV #LPM4+GIE,&LPM_MODE \ with MSP430FR59xx \ MOV #LPM2+GIE,&LPM_MODE \ with MSP430FR57xx, terminal input don't work for LPMx > 2 \ \ with MSP430FR2xxx, terminal input don't work for LPMx > 0 ; LPM0 is the default value \ ------------------------------\ -\ activate I/O \ -\ ------------------------------\ -BIC #1,&PM5CTL0 \ activate all previous I/O settings; if not activated, nothing works after reset ! -\ ------------------------------\ -\ RESET events handling \ search "SYSRSTIV" in your MSP430FRxxxx datasheet -\ ------------------------------\ -MOV &SAVE_SYSRSTIV,Y \ Y = SYSRSTIV register memory -\ CMP #2,Y \ Power_ON event -\ 0= ?GOTO BW1 \ uncomment if you want to loose application in this case... -CMP #4,Y \ -0= ?GOTO BW1 \ hardware RESET performs STOP. Should be mandatory... -\ CMP #6,Y \ -\ 0= ?GOTO BW1 \ COLD event performs STOP... uncomment if it's that you want. -\ CMP #$0A,Y \ -\ 0= ?GOTO BW1 \ fault event (violation memory protected areas) performs STOP -\ CMP #$16,Y \ -\ U>= ?GOTO BW1 \ all other fault events + Deep Reset perform STOP -\ ------------------------------\ COLON \ \ ------------------------------\ \ Init LCD 2x20 \ @@ -626,18 +620,25 @@ COLON \ ['] CR >BODY IS CR \ CR executes its default value ['] EMIT >BODY IS EMIT \ EMIT executes its defaulte value ." RC5toLCD is running. Type STOP to quit" \ display message on FastForth Terminal - PWR_STATE ABORT \ init DP and continues with ABORT + ABORT" " \ ; \ \ ------------------------------\ \ ------------------------------\ -CODE START \ this routine replaces WARM and SLEEP default values by these of this application. +CODE START \ this routine replaces WARM and COLD default values by these of this application. \ ------------------------------\ -MOV #SLEEP,X \ replace default background process SLEEP -MOV #BACKGROUND,2(X) \ by RC5toLCD BACKGROUND -MOV #WARM,X \ replace default WARM -MOV #SYS_INIT,2(X) \ by RC5toLCD SYS_INIT -MOV X,PC \ then execute new WARM +CMP #RET_ADR,&{RC5TOLCD}+8 \ init R2L once, only if MARKER_DOES is not initialized +0= IF \ if not done, customizes MARKER_DOES + MOV #STOP_RTC,&{RC5TOLCD}+8 \ execution of {RC5TOLCD} will perform STOP_RTC. + MOV &WARM+2,&{RC5TOLCD}+10 \ save previous INI_APP subroutine + MOV #INI_R2L,&WARM+2 \ replace it by RC5toLCD INI_APP + MOV &WDT_TIM_0_VEC,&{RC5TOLCD}+12 \ save Vector previous value + MOV #WDT_INT,&WDT_TIM_0_VEC \ for only CCIFG0 int, this interrupt clears automatically CCIFG0 + MOV &IR_VEC,&{RC5TOLCD}+14 \ save Vector previous value + MOV #RC5_INT,&IR_VEC \ init interrupt vector + MOV #INI_R2L,PC \ then execute new INI_APP, without return +THEN +MOV @IP+,PC ENDCODE \ ------------------------------\ diff --git a/MSP430-FORTH/RTC.f b/MSP430-FORTH/RTC.f index f058bca..9e2167c 100644 --- a/MSP430-FORTH/RTC.f +++ b/MSP430-FORTH/RTC.f @@ -1,30 +1,25 @@ \ -*- coding: utf-8 -*- - -; -------------------- -; RTC.f -; -------------------- \ \ ============================================================================== -\ routines RTC for MSP430fr5xxx and MSP430FR6xxx families only +\ routines RTC for MSP430FRxxxx \ your target must have a LF_XTAL 32768Hz -\ if no present, add a LF_XTAL line for your target in ThingsInFirst.inc. \ ============================================================================== \ \ to see kernel options, download FastForthSpecs.f -\ FastForth kernel options: MSP430ASSEMBLER, CONDCOMP +\ FastForth kernel minimal addons: MSP430ASSEMBLER, CONDCOMP \ \ TARGET SELECTION ( = the name of \INC\target.pat file without the extension) \ MSP_EXP430FR5739 MSP_EXP430FR5969 MSP_EXP430FR5994 MSP_EXP430FR6989 +\ MSP_EXP430FR4133 CHIPSTICK_FR2433 MSP_EXP430FR2433 MSP_EXP430FR2355 +\ LP_MSP430FR2476 \ \ from scite editor : copy your target selection in (shift+F8) parameter 1: \ -\ OR -\ +\ or, from windows explorer: \ drag and drop this file onto SendSourceFileToTarget.bat \ then select your TARGET when asked. \ -\ -\ REGISTERS USAGE +\ ASSEMBLER 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 @@ -45,56 +40,164 @@ \ ASSEMBLER conditionnal usage with IF UNTIL WHILE S< S>= U< U>= 0= 0<> 0>= \ ASSEMBLER conditionnal usage with ?JMP ?GOTO S< S>= U< U>= 0= 0<> 0< \ +\ + +CODE ABORT_RTC +SUB #4,PSP +MOV TOS,2(PSP) +MOV &KERNEL_ADDON,TOS +BIT #BIT15,TOS +0<> IF MOV #0,TOS THEN \ if TOS <> 0 (FIXPOINT input), set TOS = 0 +MOV TOS,0(PSP) +MOV &VERSION,TOS +SUB #307,TOS \ FastForth V3.7 +COLON +$0D EMIT \ return to column 1 without CR +ABORT" FastForth version = 3.7 please!" +ABORT" target without LF_XTAL !" +PWR_STATE \ if no abort remove this word +; + +ABORT_RTC + +; -------------------- +; RTC.f +; -------------------- + \ use : \ to set date, type : d m y DATE! \ to view date, type DATE? \ to set time, type : h m s TIME!, or h m TIME! \ to view time, type TIME? \ -\ allow to write a file on a SD_Card with a valid date and a valid time -\ +[DEFINED] {RTC} [IF] {RTC} [THEN] -PWR_STATE +MARKER {RTC} \ restore the state before MARKER definition +\ {RTC}+8 = BODY+4 = RET_ADR: MARKER_DOES does a call to RET_ADR by default +8 ALLOT \ make room for: +\ {RTC}+10 for content of previous RTC_VEC +\ {RTC}+12 for content of previous COLD_PFA +\ {RTC}+14 for content of previous WARM_PFA +\ {RTC}+16 for content of previous SLEEP_PFA -[DEFINED] {RTC} [IF] {RTC} [THEN] -MARKER {RTC} +[UNDEFINED] OR [IF] +\ https://forth-standard.org/standard/core/OR +\ C OR x1 x2 -- x3 logical OR +CODE OR +BIS @PSP+,TOS +MOV @IP+,PC +ENDCODE +[THEN] -[UNDEFINED] IF [IF] \ define IF THEN -\ https://forth-standard.org/standard/core/IF -\ IF -- IFadr initialize conditional forward branch -CODE IF \ immediate -SUB #2,PSP \ -MOV TOS,0(PSP) \ -MOV &DP,TOS \ -- HERE -ADD #4,&DP \ compile one word, reserve one word -MOV #QFBRAN,0(TOS) \ -- HERE compile QFBRAN -ADD #2,TOS \ -- HERE+2=IFadr +[UNDEFINED] C@ [IF] +\ https://forth-standard.org/standard/core/CFetch +\ C@ c-addr -- char fetch char from memory +CODE C@ +MOV.B @TOS,TOS MOV @IP+,PC -ENDCODE IMMEDIATE +ENDCODE +[THEN] -\ https://forth-standard.org/standard/core/THEN -\ THEN IFadr -- resolve forward branch -CODE THEN \ immediate -MOV &DP,0(TOS) \ -- IFadr -MOV @PSP+,TOS \ -- +[UNDEFINED] C! [IF] +\ https://forth-standard.org/standard/core/CStore +\ C! char c-addr -- store char in memory +CODE C! +MOV.B @PSP+,0(TOS) \ 4 +ADD #1,PSP \ 1 +MOV @PSP+,TOS \ 2 MOV @IP+,PC -ENDCODE IMMEDIATE +ENDCODE [THEN] -: NORTC -IF - {RTC} \ remove MARKER - ECHO $0D EMIT \ return to column 0 - ABORT" no RTC on this device !" -THEN -; +[UNDEFINED] SWAP [IF] +\ https://forth-standard.org/standard/core/SWAP +\ SWAP x1 x2 -- x2 x1 swap top two items +CODE SWAP +MOV @PSP,W \ 2 +MOV TOS,0(PSP) \ 3 +MOV W,TOS \ 1 +MOV @IP+,PC \ 4 +ENDCODE +[THEN] + +[UNDEFINED] OVER [IF] +\ https://forth-standard.org/standard/core/OVER +\ OVER x1 x2 -- x1 x2 x1 +CODE OVER +MOV TOS,-2(PSP) \ 3 -- x1 (x2) x2 +MOV @PSP,TOS \ 2 -- x1 (x2) x1 +SUB #2,PSP \ 1 -- x1 x2 x1 +MOV @IP+,PC +ENDCODE +[THEN] + +[UNDEFINED] DUP [IF] \define DUP and DUP? +\ https://forth-standard.org/standard/core/DUP +\ DUP x -- x x duplicate top of stack +CODE DUP +BW1 SUB #2,PSP \ 2 push old TOS.. + MOV TOS,0(PSP) \ 3 ..onto stack + MOV @IP+,PC \ 4 +ENDCODE + +\ https://forth-standard.org/standard/core/qDUP +\ ?DUP x -- 0 | x x DUP if nonzero +CODE ?DUP +CMP #0,TOS \ 2 test for TOS nonzero +0<> ?GOTO BW1 \ 2 +MOV @IP+,PC \ 4 +ENDCODE +[THEN] + +[UNDEFINED] DROP [IF] +\ https://forth-standard.org/standard/core/DROP +\ DROP x -- drop top of stack +CODE DROP +MOV @PSP+,TOS \ 2 +MOV @IP+,PC \ 4 +ENDCODE +[THEN] + +[UNDEFINED] DEPTH [IF] +\ https://forth-standard.org/standard/core/DEPTH +\ DEPTH -- +n number of items on stack, must leave 0 if stack empty +CODE DEPTH +MOV TOS,-2(PSP) +MOV #PSTACK,TOS +SUB PSP,TOS \ PSP-S0--> TOS +RRA TOS \ TOS/2 --> TOS +SUB #2,PSP \ post decrement stack... +MOV @IP+,PC +ENDCODE +[THEN] + +[UNDEFINED] >R [IF] +\ https://forth-standard.org/standard/core/toR +\ >R x -- R: -- x push to return stack +CODE >R +PUSH TOS \ 3 +MOV @PSP+,TOS \ 2 +MOV @IP+,PC \ 4 +ENDCODE +[THEN] + +[UNDEFINED] R> [IF] +\ https://forth-standard.org/standard/core/Rfrom +\ R> -- x R: x -- pop from return stack ; CALL #RFROM performs DOVAR +CODE R> +SUB #2,PSP \ 1 +MOV TOS,0(PSP) \ 3 +MOV @RSP+,TOS \ 2 +MOV @IP+,PC \ 4 +ENDCODE +[THEN] -[UNDEFINED] @ [IF] -\ https://forth-standard.org/standard/core/Fetch -\ @ c-addr -- char fetch char from memory -CODE @ -MOV @TOS,TOS +[UNDEFINED] 1+ [IF] +\ https://forth-standard.org/standard/core/OnePlus +\ 1+ n1/u1 -- n2/u2 add 1 to TOS +CODE 1+ +ADD #1,TOS MOV @IP+,PC ENDCODE [THEN] @@ -126,53 +229,40 @@ MOV @IP+,PC \ 4 ENDCODE [THEN] -[UNDEFINED] OR [IF] -\ https://forth-standard.org/standard/core/OR -\ C OR x1 x2 -- x3 logical OR -CODE OR -BIS @PSP+,TOS +[UNDEFINED] IF [IF] \ define IF THEN +\ https://forth-standard.org/standard/core/IF +\ IF -- IFadr initialize conditional forward branch +CODE IF \ immediate +SUB #2,PSP \ +MOV TOS,0(PSP) \ +MOV &DP,TOS \ -- HERE +ADD #4,&DP \ compile one word, reserve one word +MOV #QFBRAN,0(TOS) \ -- HERE compile QFBRAN +ADD #2,TOS \ -- HERE+2=IFadr MOV @IP+,PC -ENDCODE -[THEN] - - ; search devide ID: -$81EF DEVICEID @ U< ; MSP430FR4133 or... -DEVICEID @ $8241 U< ; ...MSP430FR2433 -= -$830B DEVICEID @ U< ; MSP430FR21xx/23xx/24xx/25xx/26xx -OR ; -- flag 0 ==> RTC, -1 ==> no RTC -NORTC \ - -[UNDEFINED] SWAP [IF] -\ https://forth-standard.org/standard/core/SWAP -\ SWAP x1 x2 -- x2 x1 swap top two items -CODE SWAP -MOV @PSP,W \ 2 -MOV TOS,0(PSP) \ 3 -MOV W,TOS \ 1 -MOV @IP+,PC \ 4 -ENDCODE -[THEN] +ENDCODE IMMEDIATE -[UNDEFINED] OVER [IF] -\ https://forth-standard.org/standard/core/OVER -\ OVER x1 x2 -- x1 x2 x1 -CODE OVER -MOV TOS,-2(PSP) \ 3 -- x1 (x2) x2 -MOV @PSP,TOS \ 2 -- x1 (x2) x1 -SUB #2,PSP \ 1 -- x1 x2 x1 +\ https://forth-standard.org/standard/core/THEN +\ THEN IFadr -- resolve forward branch +CODE THEN \ immediate +MOV &DP,0(TOS) \ -- IFadr +MOV @PSP+,TOS \ -- MOV @IP+,PC -ENDCODE +ENDCODE IMMEDIATE [THEN] -[UNDEFINED] EXECUTE [IF] \ " -\ https://forth-standard.org/standard/core/EXECUTE -\ EXECUTE i*x xt -- j*x execute Forth word at 'xt' -CODE EXECUTE -MOV TOS,W \ 1 put word address into W -MOV @PSP+,TOS \ 2 fetch new TOS -MOV W,PC \ 3 fetch code address into PC -ENDCODE +[UNDEFINED] ELSE [IF] +\ https://forth-standard.org/standard/core/ELSE +\ ELSE IFadr -- ELSEadr resolve forward IF branch, leave ELSEadr on stack +CODE ELSE \ immediate +ADD #4,&DP \ make room to compile two words +MOV &DP,W \ W=HERE+4 +MOV #BRAN,-4(W) +MOV W,0(TOS) \ HERE+4 ==> [IFadr] +SUB #2,W \ HERE+2 +MOV W,TOS \ -- ELSEadr +MOV @IP+,PC +ENDCODE IMMEDIATE [THEN] [UNDEFINED] DO [IF] \ define DO LOOP +LOOP @@ -218,6 +308,45 @@ GOTO BW1 \ goto BW1 LOOP ENDCODE IMMEDIATE [THEN] +[UNDEFINED] CASE [IF] +\ https://forth-standard.org/standard/core/CASE +: CASE 0 ; IMMEDIATE \ -- #of-1 + +\ https://forth-standard.org/standard/core/OF +: OF \ #of-1 -- orgOF #of +1+ \ count OFs +>R \ move off the stack in case the control-flow stack is the data stack. +POSTPONE OVER POSTPONE = \ copy and test case value +POSTPONE IF \ add orig to control flow stack +POSTPONE DROP \ discards case value if = +R> \ we can bring count back now +; IMMEDIATE + +\ https://forth-standard.org/standard/core/ENDOF +: ENDOF \ orgOF #of -- orgENDOF #of +>R \ move off the stack in case the control-flow stack is the data stack. +POSTPONE ELSE +R> \ we can bring count back now +; IMMEDIATE + +\ https://forth-standard.org/standard/core/ENDCASE +: ENDCASE \ orgENDOF1..orgENDOFn #of -- +POSTPONE DROP +0 DO + POSTPONE THEN +LOOP +; IMMEDIATE +[THEN] + +[UNDEFINED] + [IF] +\ https://forth-standard.org/standard/core/Plus +\ + n1/u1 n2/u2 -- n3/u3 +CODE + +ADD @PSP+,TOS +MOV @IP+,PC +ENDCODE +[THEN] + [UNDEFINED] - [IF] \ https://forth-standard.org/standard/core/Minus \ - n1/u1 n2/u2 -- n3/u3 n3 = n1-n2 @@ -247,6 +376,58 @@ ENDCODE [THEN] \ MAX +[UNDEFINED] 2* [IF] +\ https://forth-standard.org/standard/core/TwoTimes +\ 2* x1 -- x2 arithmetic left shift +CODE 2* +ADD TOS,TOS +MOV @IP+,PC +ENDCODE +[THEN] + +[UNDEFINED] UM* [IF] +\ https://forth-standard.org/standard/core/UMTimes +\ UM* u1 u2 -- ud unsigned 16x16->32 mult. +CODE UM* + MOV @PSP,&MPY \ Load 1st operand for unsigned multiplication + MOV TOS,&OP2 \ Load 2nd operand + MOV &RES0,0(PSP) \ low result on stack + MOV &RES1,TOS \ high result in TOS + MOV @IP+,PC +ENDCODE +[THEN] + +[UNDEFINED] UM/MOD [IF] +\ https://forth-standard.org/standard/core/UMDivMOD +\ UM/MOD udlo|udhi u1 -- ur uq unsigned 32/16->r16 q16 +CODE UM/MOD + PUSH #DROP \ + MOV #MUSMOD,PC \ execute MUSMOD then return to DROP +ENDCODE +[THEN] + +[UNDEFINED] U*/ [IF] +\ U*/ u1 u2 u3 -- uq u1*u2/u3 +: U*/ +>R UM* R> UM/MOD SWAP DROP +; +[THEN] + +[UNDEFINED] U/MOD [IF] +\ U/MOD u1 u2 -- ur uq unsigned division +: U/MOD +0 SWAP UM/MOD +; +[THEN] + +[UNDEFINED] U/ [IF] +\ https://forth-standard.org/standard/core/Div +\ U/ u1 u2 -- uq signed quotient +: U/ +U/MOD SWAP DROP +; +[THEN] + [UNDEFINED] SPACES [IF] \ https://forth-standard.org/standard/core/SPACES \ SPACES n -- output n spaces @@ -268,94 +449,9 @@ NEXT ENDCODE [THEN] -[UNDEFINED] DUP [IF] \define DUP and DUP? -\ https://forth-standard.org/standard/core/DUP -\ DUP x -- x x duplicate top of stack -CODE DUP -BW1 SUB #2,PSP \ 2 push old TOS.. - MOV TOS,0(PSP) \ 3 ..onto stack - MOV @IP+,PC \ 4 -ENDCODE - -\ https://forth-standard.org/standard/core/qDUP -\ ?DUP x -- 0 | x x DUP if nonzero -CODE ?DUP -CMP #0,TOS \ 2 test for TOS nonzero -0<> ?GOTO BW1 \ 2 -MOV @IP+,PC \ 4 -ENDCODE -[THEN] - -[UNDEFINED] DEPTH [IF] -\ https://forth-standard.org/standard/core/DEPTH -\ DEPTH -- +n number of items on stack, must leave 0 if stack empty -CODE DEPTH -MOV TOS,-2(PSP) -MOV #PSTACK,TOS -SUB PSP,TOS \ PSP-S0--> TOS -RRA TOS \ TOS/2 --> TOS -SUB #2,PSP \ post decrement stack... -MOV @IP+,PC -ENDCODE -[THEN] - -[UNDEFINED] >R [IF] -\ https://forth-standard.org/standard/core/toR -\ >R x -- R: -- x push to return stack -CODE >R -PUSH TOS -MOV @PSP+,TOS -MOV @IP+,PC -ENDCODE -[THEN] - -[UNDEFINED] R> [IF] -\ https://forth-standard.org/standard/core/Rfrom -\ R> -- x R: x -- pop from return stack ; CALL #RFROM performs DOVAR -CODE R> -SUB #2,PSP \ 1 -MOV TOS,0(PSP) \ 3 -MOV @RSP+,TOS \ 2 -MOV @IP+,PC \ 4 -ENDCODE -[THEN] - -[UNDEFINED] >BODY [IF] -\ https://forth-standard.org/standard/core/toBODY -\ >BODY -- addr leave BODY of a CREATEd word\ also leave default ACTION-OF primary DEFERred word -CODE >BODY -ADD #4,TOS -MOV @IP+,PC -ENDCODE -[THEN] - -[UNDEFINED] EVALUATE [IF] -\ https://forth-standard.org/standard/core/EVALUATE -\ EVALUATE \ i*x c-addr u -- j*x interpret string -CODE EVALUATE -MOV #SOURCE_LEN,X \ 2 -MOV @X+,S \ 2 S = SOURCE_LEN -MOV @X+,T \ 2 T = SOURCE_ORG -MOV @X+,W \ 2 W = TOIN -PUSHM #4,IP \ 6 PUSHM IP,S,T,W -LO2HI -INTERPRET -HI2LO -MOV @RSP+,&TOIN \ 4 -MOV @RSP+,&SOURCE_ORG \ 4 -MOV @RSP+,&SOURCE_LEN \ 4 -MOV @RSP+,IP -MOV @IP+,PC -ENDCODE -[THEN] - -[UNDEFINED] EXECUTE [IF] \ " -\ https://forth-standard.org/standard/core/EXECUTE -\ EXECUTE i*x xt -- j*x execute Forth word at 'xt' -CODE EXECUTE -MOV TOS,W \ 1 put word address into W -MOV @PSP+,TOS \ 2 fetch new TOS -MOV W,PC \ 3 fetch code address into PC +[UNDEFINED] HERE [IF] +CODE HERE +MOV #HEREXEC,PC ENDCODE [THEN] @@ -366,65 +462,296 @@ ENDCODE ; [THEN] \ U.R -CODE DATE? - SUB #6,PSP - MOV TOS,4(PSP) +$81EF DEVICEID @ U< ; search device ID: MSP430FR4133 or... +DEVICEID @ $8241 U< ; ...MSP430FR2433 += +$830B DEVICEID @ U< ; MSP430FR21xx/23xx/24xx/25xx/26xx +OR ; -- flag + +[IF] + +\ ============================================================================== +\ driver for RTC without calendar +\ ============================================================================== + + CREATE RTCSEC 2 ALLOT + CREATE RTCMIN 2 ALLOT + CREATE RTCHOUR 2 ALLOT + CREATE RTCDOW 2 ALLOT + CREATE RTCDAY 2 ALLOT + CREATE RTCMON 2 ALLOT + CREATE RTCYEAR 2 ALLOT + +\ ************************************\ + CODE RTC_INT \ computes sec min hour day month year +\ ************************************\ + ADD #2,RSP \ remove previous_SR + BIT #1,&RTCIV \ clear RTC_IFG + ADD.B #1,&RTCSEC \ sec+1 + CMP.B #60,&RTCSEC + U>= IF + MOV.B #0,&RTCSEC \ sec=0 + ADD.B #1,&RTCMIN \ min+1 + CMP.B #60,&RTCMIN + U>= IF + MOV.B #0,&RTCMIN \ min=0 + ADD.B #1,&RTCHOUR \ hour+1 + CMP.B #24,&RTCHOUR + U>= IF + MOV.B #0,&RTCHOUR \ hour=0 + ADD.B #1,&RTCDOW \ dow+1 + CMP.B #7,&RTCDOW + U>= IF + MOV.B #0,&RTCDOW \ dow=0 + THEN + ADD.B #1,&RTCDAY \ day+1 + CMP.B #2,&RTCMON \ February month ? +\ ------------------------\ here we compute leap year + 0= IF \ yes + COLON + RTCYEAR @ 4 MOD + IF 29 + ELSE + RTCYEAR @ 100 MOD + IF 30 + ELSE + RTCYEAR @ 400 MOD + IF 29 + ELSE 30 + THEN + THEN + THEN + HI2LO + MOV @RSP+,IP + MOV TOS,X \ X = 29|30 + MOV @PSP+,TOS +\ ------------------------\ + ELSE \ month other than Feb + MOV #31,X + MOV.B &RTCMON,W + CMP.B #8,W + 0>= IF \ month >= August? + ADD.B #1,W + THEN + BIT.B #1,W \ + 0<> IF + ADD #1,X \ 31 days / month + THEN + THEN + CMP.B X,&RTCDAY + U>= IF \ max day of month is exceeded + MOV.B #1,&RTCDAY \ day=1 + ADD.B #1,&RTCMON \ mon+1 + CMP.B #13,&RTCMON + U>= IF + MOV.B #1,&RTCMON \ mon=1 + ADD #1,&RTCYEAR \ year+1 + THEN + THEN + THEN + THEN + THEN \ + MOV @RSP+,PC \ RET to BACKGrouND routine, with GIE disabled + ENDCODE + +\ ------------------------\ + ASM STOP_RTC \ define STOP_RTC as new COLD_APP subroutine, called by {RTC}|WIPE|RST|COLD|SYS_failures. +\ ------------------------\ ------------------------------------------ + CMP #RET_ADR,&{RTC}+8 \ + 0<> IF \ and only if RTC_APP is started by START_RTC + MOV #{RTC}+10,X \ + MOV #RET_ADR,-2(X) \ restore {RTC}+8 default value + MOV @X+,&RTC_VEC \ restore previous RTC_VEC content from {RTC}+10 + MOV @X+,&COLD+2 \ restore previous STOP_APP from {RTC}+12 to COLD_PFA + MOV @X+,&WARM+2 \ restore previous INI_APP from {RTC}+14 to WARM_PFA +\ MOV @X+,&SLEEP+2 \ restore previous BACKGND_APP from {RTC}+16 to SLEEP_PFA + THEN +\ ------------------------\ + MOV #0,&RTCCTL \ stops RTC and RTC_INT, see RTC15 in MSP430FR2xxx errata sheet + MOV.B #XIN,X \ X = bit_position of XT1 Xtal + BIC.B X,&XT1_SEL \ XIN as GPIO + BIS.B X,&XT1_DIR \ XIN as output + BIC.B X,&XT1_OUT \ RTC15 :"toggle twice XIN ouput" + BIS.B X,&XT1_OUT \ "with at least 2 rising or falling edges". + BIC.B X,&XT1_OUT \ + BIS.B X,&XT1_OUT \ + BIC.B X,&XT1_DIR \ restore default state of XIN + BIS.B X,&XT1_SEL \ XIN as XT1 input +\ ------------------------\ + MOV &COLD+2,PC \ 5 link (branch) to the previous STOP_APP subroutine, +\ ------------------------\ then RET to MARKER_DOES or to COLD+4 + ENDASM \ +\ ------------------------\ + +\ ----------------------------------------\ + ASM INI_RTC \ define INI_HDWR_APP called first by START_RTC then by WARM +\ ----------------------------------------\ --------------------------------------------------------- + CALL &{RTC}+14 \ call previous INI_APP (which sets TOS = RSTIV_MEM) + CMP #0,&RTCCTL \ if RTCCTL = 0 = reset state, app is STOPPED and must to be started + 0= IF \ and if RTCCTL <> 0, we don't restart app and no time is lost. + MOV #$7F,&RTCMOD \ RTCMOD = 127 + BIT #-1,&RTCIV \ clear RTC_IFG + MOV #%0010_0110_0100_0010,&RTCCTL \ starts RTC with XT1CLK/256, enables RTC_INT + THEN + MOV @RSP+,PC \ RET to BODYWARM|START_RTC + ENDASM \ +\ ----------------------------------------\ + +\\ ------------------------------------------------------------------------------- +\\ WARNING! because RTC_INT have higher priority than eUSCI used for TERMINAL, +\\ BACKGND_APP default subroutine execute pending RTC_INT, so you can download a file without RTC time lost. +\\ but if you manualy type a command, pending RTC_INT may not be executed during this time. +\\ ------------------------------------------------------------------------------- +\\ --------------------\ +\\ ASM BACKGND_RTC \ define BACKGND_RTC to replace actual BACKGND_APP +\\ --------------------\ +\ BEGIN \ +\ MOV &LPM_MODE,SR \ enter to SLEEP mode, waiting RTC_INT +\ AGAIN \ loop back to BEGIN is executed before CPU shut down +\\ --------------------\ +\ ENDASM \ +\\ ------------------------------------------------------------------------------- +\\ WARNING! because unlinked, this BACKGND_APP doesn't execute XON, TERMINAL is MUTEd +\\ but maybe that is what you want: RTC time keeps its accuracy. +\\ ------------------------------------------------------------------------------- + +\ --------------------------------\ + CODE START_RTC \ save current content of WARM_PFA, COLD_PFA, SLEEP_PFA, RTC_VEC +\ --------------------------------\ then replace them by INI_RTC, STOP_RTC, BACKGND_RTC, RTC_INT then execute INI_RTC. + CMP #STOP_RTC,&{RTC}+8 \ content of {RTC}+8 = STOP_RTC ? + 0<> IF \ if not + MOV #STOP_RTC,&{RTC}+8 \ STOP_RTC must be executed by MARKER_DOES of {RTC}, else RTC15 hangs out! + MOV &RTC_VEC,&{RTC}+10 \ save content of RTC_VEC to {RTC}+10... + MOV #RTC_INT,&RTC_VEC \ then set RTC_VEC with RTC_INT + MOV &COLD+2,&{RTC}+12 \ save content of COLD_PFA to {RTC}+12... + MOV #STOP_RTC,&COLD+2 \ ...and replace it by STOP_RTC, else RTC15 hangs out with Deep_RST! + MOV &WARM+2,&{RTC}+14 \ save content of WARM_PFA to {RTC}+14... + MOV #INI_RTC,&WARM+2 \ ...and replace it by INI_RTC +\ MOV &SLEEP+2,&{RTC}+16 \ save content of SLEEP_PFA to {RTC}+16... +\ MOV #BACKGND_RTC,&SLEEP+2 \ ...and replace it by BACKGND_RTC + THEN \ + CALL #INI_RTC \ + MOV @IP+,PC \ +\ --------------------------------\ + ENDCODE +\ --------------------------------\ + + : TIME? \ display time + RTCHOUR C@ 2 U.R $3A EMIT + RTCMIN C@ 2 U.R $3A EMIT + RTCSEC C@ 2 U.R + ; + + : TIME! \ hour min sec --- + START_RTC \ if not yet done, obviously! + 2 DEPTH + U< IF \ if 3 numbers on stack + RTCSEC C! + RTCMIN C! + RTCHOUR C! + THEN + ." it is " TIME? + ; + + : DATE? \ display date + +[ELSE] + +\ ============================================================================== +\ driver RTC for RTC_B|RTC_C hardware with calendar +\ ============================================================================== + + CODE TIME? BEGIN - BIT.B #RTCRDY,&RTCCTL1 \ test RTCRDY flag + BIT.B #RTCRDY,&RTCCTL1 0<> UNTIL \ wait until RTCRDY high - MOV &RTCYEARL,2(PSP) \ year - MOV.B &RTCMON,TOS - MOV TOS,0(PSP) \ month - MOV.B &RTCDAY,TOS \ day -COLON - 2 U.R $2F EMIT - 2 U.R $2F EMIT . -; - -: DATE! -2 DEPTH U< 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 \ - LO2HI -THEN - ." we are on " DATE? -; + COLON + RTCHOUR C@ 2 U.R $3A EMIT + RTCMIN C@ 2 U.R $3A EMIT + RTCSEC C@ 2 U.R + ; + + : TIME! + 2 DEPTH + U< IF \ if 3 numbers on stack + RTCSEC C! + RTCMIN C! + RTCHOUR C! + THEN + ." it is " TIME? + ; -CODE TIME? - SUB #6,PSP - MOV TOS,4(PSP) \ save TOS + CODE DATE? \ display date BEGIN - BIT.B #RTCRDY,&RTCCTL1 \ - 0<> UNTIL \ wait until RTCRDY high - MOV.B &RTCSEC,TOS - MOV TOS,2(PSP) \ seconds - MOV.B &RTCMIN,TOS - MOV TOS,0(PSP) \ minutes - MOV.B &RTCHOUR,TOS \ hours -COLON - 2 U.R $3A EMIT - 2 U.R $3A EMIT 2 U.R + BIT.B #RTCRDY,&RTCCTL1 + 0<> UNTIL \ wait until windows time RTC_ReaDY is high + COLON + +[THEN] + +\ ============================================================================== +\ end of RTC software|harware calendar +\ ============================================================================== +\ resume with common part of DATE? definition: + + RTCDOW C@ \ -- weekday {0=Sat...6=Fri} + CASE + 0 OF ." Sat" ENDOF + 1 OF ." Sun" ENDOF + 2 OF ." Mon" ENDOF + 3 OF ." Tue" ENDOF + 4 OF ." Wed" ENDOF + 5 OF ." Thu" ENDOF + 6 OF ." Fri" ENDOF + ENDCASE + RTCYEAR @ + RTCMON C@ + RTCDAY C@ \ -- year mon day + $20 EMIT + 2 U.R $2F EMIT \ -- year mon + 2 U.R $2F EMIT \ -- year + . \ -- ; -: TIME! -2 DEPTH U< IF - HI2LO - 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 + + +: DATE! \ year mon day -- +2 DEPTH +U< IF \ if 3 numbers on stack + RTCYEAR ! + RTCMON C! + RTCDAY C! THEN - ." it is " TIME? +RTCDAY C@ +RTCMON C@ +RTCYEAR @ \ -- day mon year +\ ------------------------------------------ +\ Zeller's congruence for gregorian calendar +\ see https://www.rosettacode.org/wiki/Day_of_the_week#Forth +\ : ZELLER \ day mon year -- weekday {0=Sat, ..., 6=Fri} +\ OVER 3 < \ +\ IF 1- SWAP 12 + SWAP +\ THEN \ -- d m' y' with m' {3=March, ..., 14=february} +\ 100 /MOD \ -- d m' K J with K = y' in century, J = century +\ DUP 4 / SWAP 2* - \ -- d m' K (J/4 - 2J) +\ SWAP DUP 4 / + + \ -- d m' ((J/4 - 2J) + (K + K/4)) +\ SWAP 1+ 13 5 */ + + \ -- (d + (((J/4 - 2J) + (K + K/4)) + (m+1)*13/5)) +\ 7 MOD \ -- weekday = {0=Sat, ..., 6=Fri} +\ ------------------------------------------ +OVER 3 U< \ +IF 1- SWAP 12 + SWAP +THEN \ -- d m' y' with m' {3=March, ..., 14=february} +100 U/MOD \ -- d m' K J with K = y' in century, J = century +DUP 4 U/ SWAP 2* - \ -- d m' K (J/4 - 2J) +SWAP DUP 4 U/ + + \ -- d m' ((J/4 - 2J) + (K + K/4)) +SWAP 1+ 13 5 U*/ + + \ -- (d + (((J/4 - 2J) + (K + K/4)) + (m+1)*13/5)) +7 U/MOD DROP \ -- weekday = {0=Sat, ..., 6=Fri} +\ ------------------------------------------ +RTCDOW C! \ -- +." we are on " DATE? ; -PWR_HERE - +RST_HERE [UNDEFINED] S_ [IF] CODE S_ \ Squote alias with blank instead quote separator @@ -458,29 +785,63 @@ POSTPONE TYPE \ compile-time code : TYPE ; IMMEDIATE [THEN] -: PAD_ACCEPT \ -- org len -PAD_ORG -DUP PAD_LEN \ -- org org len - ['] ACCEPT DUP @ - $4030 = \ if CFA content = $4030 (MOV @PC+,PC), ACCEPT is deferred - IF >BODY \ find default part address of deferred ACCEPT - THEN - EXECUTE \ -- org len' -; +[UNDEFINED] >BODY [IF] +\ https://forth-standard.org/standard/core/toBODY +\ >BODY -- addr leave BODY of a CREATEd word\ also leave default ACTION-OF primary DEFERred word +CODE >BODY +ADD #4,TOS +MOV @IP+,PC +ENDCODE +[THEN] -: GET_TIME -PWR_STATE \ all words after PWR_HERE marker will be lost -42 \ number of terminal lines -0 DO CR LOOP \ don't erase any line of source -ESC [H \ cursor home +[UNDEFINED] EXECUTE [IF] \ " +\ https://forth-standard.org/standard/core/EXECUTE +\ EXECUTE i*x xt -- j*x execute Forth word at 'xt' +CODE EXECUTE +PUSH TOS \ 3 push xt +MOV @PSP+,TOS \ 2 +MOV @RSP+,PC \ 4 xt --> PC +ENDCODE +[THEN] -CR ." DATE (DMY): " -PAD_ACCEPT -EVALUATE CR DATE! +[UNDEFINED] EVALUATE [IF] +\ https://forth-standard.org/standard/core/EVALUATE +\ EVALUATE \ i*x c-addr u -- j*x interpret string +CODE EVALUATE +MOV #SOURCE_LEN,X \ 2 +MOV @X+,S \ 2 S = SOURCE_LEN +MOV @X+,T \ 2 T = SOURCE_ORG +MOV @X+,W \ 2 W = TOIN +PUSHM #4,IP \ 6 PUSHM IP,S,T,W +LO2HI +INTERPRET +HI2LO +MOV @RSP+,&TOIN \ 4 +MOV @RSP+,&SOURCE_ORG \ 4 +MOV @RSP+,&SOURCE_LEN \ 4 +MOV @RSP+,IP +MOV @IP+,PC +ENDCODE +[THEN] +: SET_TIME +ESC [8;42;96t \ set terminal display 42L * 96C +42 0 DO CR LOOP \ to avoid erasing any line of source, create 42 empty lines +ESC [H \ then set cursor home +CR ." DATE (DMY): " +PAD_ORG DUP PAD_LEN +['] ACCEPT >BODY \ find default part of deferred ACCEPT (from terminal input) +EXECUTE \ wait human input for D M Y +EVALUATE \ interpret this input +CR DATE! \ set date CR ." TIME (HMS): " -PAD_ACCEPT -EVALUATE CR TIME! +PAD_ORG DUP PAD_LEN +['] ACCEPT >BODY \ find default part of deferred ACCEPT (from terminal input) +EXECUTE \ wait human input for H M S +EVALUATE \ interpret this input +CR TIME! \ set time +RST_STATE \ remove code beyond RST_HERE ; - -ECHO GET_TIME + +ECHO +SET_TIME diff --git a/MSP430-FORTH/SD_TEST.f b/MSP430-FORTH/SD_TEST.f index 77b1b75..0584138 100644 --- a/MSP430-FORTH/SD_TEST.f +++ b/MSP430-FORTH/SD_TEST.f @@ -1,5 +1,19 @@ \ -*- coding: utf-8 -*- +\ first, we test for downloading driver only if UART TERMINAL target +CODE ABORT_SD_TEST +SUB #2,PSP +MOV TOS,0(PSP) +MOV &VERSION,TOS +SUB #307,TOS \ FastForth V3.7 +COLON +'CR' EMIT \ return to column 1 without 'LF' +ABORT" FastForth version = 3.7 please!" +PWR_STATE \ remove ABORT_SD_TEST definition before resuming +; + +ABORT_SD_TEST + ; ----------- ; SD_TEST.f ; ----------- @@ -165,7 +179,7 @@ ENDCODE IMMEDIATE \ https://forth-standard.org/standard/core/BEGIN \ BEGIN -- BEGINadr initialize backward branch CODE BEGIN - MOV #HEREADR,PC + MOV #HEREXEC,PC ENDCODE IMMEDIATE \ https://forth-standard.org/standard/core/UNTIL @@ -292,15 +306,6 @@ FW1 MOV @PSP+,TOS ENDCODE [THEN] -[UNDEFINED] @ [IF] -\ https://forth-standard.org/standard/core/Fetch -\ @ c-addr -- char fetch char from memory -CODE @ -MOV @TOS,TOS -MOV @IP+,PC -ENDCODE -[THEN] - [UNDEFINED] C@ [IF] \ https://forth-standard.org/standard/core/CFetch \ C@ c-addr -- char fetch char from memory @@ -310,16 +315,6 @@ MOV @IP+,PC ENDCODE [THEN] -[UNDEFINED] ! [IF] -\ https://forth-standard.org/standard/core/Store -\ ! x a-addr -- store cell in memory -CODE ! -MOV @PSP+,0(TOS) \ 4 -MOV @PSP+,TOS \ 2 -MOV @IP+,PC \ 4 -ENDCODE -[THEN] - [UNDEFINED] SPACE [IF] \ https://forth-standard.org/standard/core/SPACE \ SPACE -- output a space @@ -522,8 +517,8 @@ ELSE 1 - ?DUP LOAD" SD_TOOLS.4TH" ELSE 1 - ?DUP 0= IF - ." LOAD CORECOMP.4TH" CR - LOAD" CORECOMP.4TH" + ." LOAD CORE_ANS.4TH" CR + LOAD" CORE_ANS.4TH" ELSE 1 - ?DUP 0= IF ." LOAD CORETEST.4TH" CR @@ -559,7 +554,7 @@ ELSE 1 - ?DUP ." LOAD TSTWORDS.4TH" CR LOAD" TSTWORDS.4TH" ELSE - ." abort" CR EXIT + ." abort" ABORT" " THEN THEN THEN diff --git a/MSP430-FORTH/SD_TOOLS.f b/MSP430-FORTH/SD_TOOLS.f index 08ca5a2..021cf42 100644 --- a/MSP430-FORTH/SD_TOOLS.f +++ b/MSP430-FORTH/SD_TOOLS.f @@ -1,9 +1,5 @@ \ -*- coding: utf-8 -*- -; --------------------------------------------------------------- -; SD_TOOLS.f : BASIC TOOLS for SD Card : DIR FAT SECTOR CLUSTER -; --------------------------------------------------------------- -\ \ to see kernel options, download FastForthSpecs.f \ FastForth kernel options: MSP430ASSEMBLER, CONDCOMP, DOUBLE_INPUT, SD_CARD_LOADER \ @@ -41,7 +37,24 @@ \ ASSEMBLER conditionnal usage with IF UNTIL WHILE S< S>= U< U>= 0= 0<> 0>= \ ASSEMBLER conditionnal usage with ?JMP ?GOTO S< S>= U< U>= 0= 0<> 0< -PWR_STATE +; --------------------------------------------------------------- +; SD_TOOLS.f : BASIC TOOLS for SD Card : DIR FAT SECTOR CLUSTER +; --------------------------------------------------------------- + +\ first, we test for downloading driver only if UART TERMINAL target +CODE ABORT_SD_TOOLS +SUB #2,PSP +MOV TOS,0(PSP) +MOV &VERSION,TOS +SUB #307,TOS \ FastForth V3.7 +COLON +'CR' EMIT \ return to column 1 without 'LF' +ABORT" FastForth version = 3.7 please!" +PWR_STATE \ remove ABORT_UARTI2CS definition before resuming +; + +ABORT_SD_TOOLS + [DEFINED] {SD_TOOLS} [IF] {SD_TOOLS} [THEN] @@ -85,16 +98,6 @@ MOV @IP+,PC ENDCODE [THEN] -[UNDEFINED] ! [IF] -\ https://forth-standard.org/standard/core/Store -\ ! x a-addr -- store cell in memory -CODE ! -MOV @PSP+,0(TOS) \ 4 -MOV @PSP+,TOS \ 2 -MOV @IP+,PC \ 4 -ENDCODE -[THEN] - [UNDEFINED] SPACE [IF] \ https://forth-standard.org/standard/core/SPACE \ SPACE -- output a space @@ -266,11 +269,11 @@ LO2HI \ display content of a sector \ ----------------------------------\ -CODE SECTOR \ sector. -- don't forget to add decimal point to your sector number +CODE SECTOR. \ sector. -- don't forget to add decimal point to your sector number \ ----------------------------------\ BW1 MOV TOS,X \ X = SectorH MOV @PSP,W \ W = sectorL - CALL &ReadSectorWX \ W = SectorLO X = SectorHI + CALL #READ_SWX \ W = SectorLO X = SectorHI COLON \ <# #S #> TYPE SPACE \ ud -- display the double number SD_BUF $200 DUMP CR ; \ then dump the sector @@ -278,7 +281,7 @@ COLON \ \ display first sector of a Cluster \ ----------------------------------\ -CODE CLUSTER \ cluster. -- don't forget to add decimal point to your cluster number +CODE CLUSTR. \ cluster. -- don't forget to add decimal point to your cluster number \ ----------------------------------\ BW2 BIT.B #CD_SD,&SD_CDIN \ test Card Detect: memory card present ? 0<> IF diff --git a/MSP430-FORTH/TESTASM.F b/MSP430-FORTH/TESTASM.F index e9489e2..856eb28 100644 --- a/MSP430-FORTH/TESTASM.F +++ b/MSP430-FORTH/TESTASM.F @@ -33,6 +33,20 @@ \ \ FORTH conditionnal : 0= 0< = < > U< +\ first, we test for downloading driver only if UART TERMINAL target +CODE ABORT_TEST_ASM +SUB #2,PSP +MOV TOS,0(PSP) +MOV &VERSION,TOS +SUB #307,TOS \ FastForth V3.7 +COLON +'CR' EMIT \ return to column 1 without 'LF' +ABORT" FastForth version = 3.7 please!" +PWR_STATE \ remove ABORT_TEST_ASM definition before resuming +; + +ABORT_TEST_ASM \ abort test + [UNDEFINED] >R [IF] \ https://forth-standard.org/standard/core/toR \ >R x -- R: -- x push to return stack @@ -100,25 +114,6 @@ ENDCODE [THEN] -[UNDEFINED] @ [IF] -\ https://forth-standard.org/standard/core/Fetch -\ @ c-addr -- char fetch char from memory -CODE @ -MOV @TOS,TOS -MOV @IP+,PC -ENDCODE -[THEN] - -[UNDEFINED] ! [IF] -\ https://forth-standard.org/standard/core/Store -\ ! x a-addr -- store cell in memory -CODE ! -MOV @PSP+,0(TOS) \ 4 -MOV @PSP+,TOS \ 2 -MOV @IP+,PC \ 4 -ENDCODE -[THEN] - [UNDEFINED] C@ [IF] \ https://forth-standard.org/standard/core/CFetch \ C@ c-addr -- char fetch char from memory @@ -209,7 +204,7 @@ NEXT ENDCODE [THEN] -[UNDEFINED] DUP [IF] +[UNDEFINED] DUP [IF] \ define DUP and ?DUP \ https://forth-standard.org/standard/core/DUP \ DUP x -- x x duplicate top of stack CODE DUP @@ -217,6 +212,14 @@ BW1 SUB #2,PSP \ 2 push old TOS.. MOV TOS,0(PSP) \ 3 ..onto stack MOV @IP+,PC \ 4 ENDCODE + +\ https://forth-standard.org/standard/core/qDUP +\ ?DUP x -- 0 | x x DUP if nonzero +CODE ?DUP +CMP #0,TOS \ 2 test for TOS nonzero +0<> ?GOTO BW1 \ 2 +MOV @IP+,PC \ 4 +ENDCODE [THEN] [UNDEFINED] OVER [IF] diff --git a/MSP430-FORTH/TESTXASM.F b/MSP430-FORTH/TESTXASM.F index c60ee25..674d250 100644 --- a/MSP430-FORTH/TESTXASM.F +++ b/MSP430-FORTH/TESTXASM.F @@ -70,16 +70,6 @@ ENDCODE [THEN] -[UNDEFINED] ! [IF] -\ https://forth-standard.org/standard/core/Store -\ ! x a-addr -- store cell in memory -CODE ! -MOV @PSP+,0(TOS) \ 4 -MOV @PSP+,TOS \ 2 -MOV @IP+,PC \ 4 -ENDCODE -[THEN] - [UNDEFINED] C@ [IF] \ https://forth-standard.org/standard/core/CFetch \ C@ c-addr -- char fetch char from memory @@ -179,25 +169,6 @@ MOV @IP+,PC \ 4 ENDCODE [THEN] -[UNDEFINED] @ [IF] -\ https://forth-standard.org/standard/core/Fetch -\ @ c-addr -- char fetch char from memory -CODE @ -MOV @TOS,TOS -MOV @IP+,PC -ENDCODE -[THEN] - -[UNDEFINED] ! [IF] -\ https://forth-standard.org/standard/core/Store -\ ! x a-addr -- store cell in memory -CODE ! -MOV @PSP+,0(TOS) \ 4 -MOV @PSP+,TOS \ 2 -MOV @IP+,PC \ 4 -ENDCODE -[THEN] - [UNDEFINED] U.R [IF] \ defined in {UTILITY} : U.R \ u n -- display u unsigned in n width (n >= 2) >R <# 0 # #S #> diff --git a/MSP430-FORTH/UARTI2CS.f b/MSP430-FORTH/UARTI2CS.f index 67ed5ad..deb5dfe 100644 --- a/MSP430-FORTH/UARTI2CS.f +++ b/MSP430-FORTH/UARTI2CS.f @@ -1,30 +1,10 @@ \ -*- coding: utf-8 -*- - -\ Fast Forth For Texas Instrument MSP430FRxxxx FRAM devices -\ Copyright (C) <2019> -\ -\ 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 . -\ -; ---------------------------------------------------------------------- -; UARTI2CS.f -; ---------------------------------------------------------------------- \ \ TARGET SELECTION ( = the name of \INC\target.pat file without the extension) \ MSP_EXP430FR5739 MSP_EXP430FR5969 MSP_EXP430FR5994 MSP_EXP430FR6989 \ MSP_EXP430FR4133 (can't use LED1 because wired on UART TX) \ MSP_EXP430FR2433 CHIPSTICK_FR2433 MSP_EXP430FR2355 -\ LP_MSP430FR2476 +\ LP_MSP430FR2476 MY_MSP430FR5738_1 \ \ from scite editor : copy your target selection in (shift+F8) parameter 1: \ @@ -38,163 +18,144 @@ \ TERMINAL3WIRES, TERMINAL4WIRES \ MSP430ASSEMBLER, CONDCOMP \ +\ ================================================================================ +\ REGISTERS USAGE for embedded MSP430 ASSEMBLER +\ ================================================================================ +\ don't use R2, R3, +\ R4, R5, R6, R7 must be PUSHed/POPed before/after use +\ scratch registers S to Y are free, +\ under interrupt, IP is free, +\ Apply FORTH rules for TOS, PSP, RSP registers use. +\ +\ PUSHM order : PSP,TOS, IP, S , T , W , X , Y ,rDOVAR,rDOCON,rDODOES,rDOCOL, R3, SR,RSP, PC +\ PUSHM order : R15,R14,R13,R12,R11,R10, R9, R8, R7 , R6 , R5 , R4 , R3, R2, R1, R0 +\ +\ example : PUSHM #6,IP pushes IP,S,T,W,X,Y registers to return stack +\ +\ POPM order : PC,RSP, SR, R3, rDODOES,rDOCON,rDOVAR,rEXIT, Y, X, W, T, S, IP,TOS,PSP +\ POPM order : R0, R1, R2, R3, R4 , R5 , R6 , R7 , R8, R9,R10,R11,R12,R13,R14,R15 +\ +\ example : POPM #6,IP pop Y,X,W,T,S,IP registers from return stack +\ +\ ASSEMBLER conditionnal usage before IF UNTIL WHILE : S< S>= U< U>= 0= 0<> 0>= +\ ASSEMBLER conditionnal usage before ?GOTO : S< S>= U< U>= 0= 0<> 0< +\ +\ ================================================================================ \ coupled to a PL2303HXD cable, this driver enables a FastForth target to do an USB to I2C_Slave bridge, -\ thus, any I2C_FastForth target can communicate with TERATERM. -\ In addition, UARTI2CS simulates a full duplex TERMINAL while the I2C bus is half duplex. +\ thus, from TERATERM.exe you can take the entire control of up to 112 I2C_FastForth targets. +\ In addition, it simulates a full duplex communication while the I2C bus is half duplex. +\ Don't forget to wire 3k3 pull up resistors on wires SDA SCL! +\ ================================================================================ \ -\ driver test @ speed maxi: MCLK=24MHz, PL2303HXD with shortened cable (20cm), WIFI off, all windows apps closed else Scite and TERATERM. -\ ------------------------------------ -\ -\ notebook USB to I2C_Slave bridge any I2C_slave target -\ +---------------+ +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +-------------------------------+ -\ | | i PL2303HXD target running UARTI2CS @ 24MHz i +-------------------------------+| -\ | | +---------------+ +--------------------------------+ +-------------------------------+|| -\ | | | | | |RX:1150kHz| ||| -\ | TERATERM -o--> USB --o--> USB2UART --o--> UART --o--> FAST FORTH ---> UARTI2CS --o--> I2C --o--> FAST FORTH @ 24MHz with ||+ -\ | terminal | | | 6 MBds | |TX:750kHz | kernel option TERMINAL_I2C |+ -\ | | +---------------+ +--------------------------------+ +-------------------------------+ -\ | | i |<-L<=20cm->| i -\ +---------------+ +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + -\ -\ I2C frequency = (TX+RX)/2 = 950 kHz @ MCLK=24 MHz, without any error... -\ downloading (+ interpret + compile + execute) CORETEST.4TH to I2C Slave best time = 844ms. -\ downloading (+ interpret + compile + execute) CORETEST.4TH to I2C Master best time = 531ms. -\ nota: the difference (313 ms) is the time of the I2C Half duplex exchange (I2C freq. about 1MHz). +\ driver test : MCLK=24MHz, PL2303HXD with shortened cable (20cm), WIFI off, all windows apps closed else Scite and TERATERM. +\ ----------- +\ / ┌────────────────────────────────┐ +\ notebook USB to I2C_Slave bridge +-- I2C -->| up to 112 I2C_Slave targets | +\ ┌───────────────┐ ╔════════════════════════════════════════════════════════════╗ / ┌───────────────────────────────┐ | +\ | | ║ PL2303HXD target running UARTI2CS @ 24MHz ║ +-- I2C -->| MSP430FR4133 @ 1 MHz | | +\ | | ║───────────────┐ ┌────────────────────────────────║ / ┌───────────────────────────────┐ |──┘ +\ | | ║ | 3 wires | MSP430FR2355 @ 24MHz ║/ | MSP430FR5738 @ 24 MHz | | +\ | TERATERM -o--> USB --o--> USB2UART --o--> UART --o--> FAST FORTH ---> UARTI2CS --o--> I2C --o--> FAST FORTH with option |──┘ +\ | terminal | ║ | 6 MBds | (I2C MASTER) ║ | TERMINAL_I2C (I2C SLAVE) | +\ | | ║───────────────┘ └────────────────────────────────║ └───────────────────────────────┘ +\ | | ║ |<- l=20cm->| ║ +\ └───────────────┘ ╚════════════════════════════════════════════════════════════╝ +\ +\ test results : +\ ------------ +\ +\ downloading (+ interpret + compile + execute) CORETEST.4TH to I2C Master target, best time = 531ms. +\ downloading (+ interpret + compile + execute) CORETEST.4TH to I2C Slave target, best time = 844ms. +\ the difference (313 ms) is the time of the I2C Half duplex exchange (we reach the speed of the I2C Fast-mode Plus (Fm+)). \ -\ also tested with I2C_Master @ 24MHz and I2C_Slave @ 1MHz. +\ also connected to and tested with another I2C_FastForth target with MCLK = 1MHz (I2C CLK = MCLK ! ). \ -\ You can use any pin for SDA and SCL, preferably in the interval Px0...Px3. -\ don't forget to wire 3.3k pullup resitors on pin SDA and SCL. -\ you will find SCA and SCL pin by searching 'SM_BUS' in your \inc\target.pat file +\ The I2C_Slave address is defined as 'MYSLAVEADR' in forthMSP430FR.asm source file of I2C_Slave target. +\ You can use any pin for SDA and SCL, preferably in the interval Px0...Px3. +\ you will find SCA and SCL pin by searching 'SM_BUS' in your \inc\target.pat files (I2C_Master and I2C_Slave) +\ don't forget to add 3.3k pullup resitors on wires SDA and SCL. \ \ \ the LEDs TX and RX work fine, comment/uncomment as you want. \ \ Multi Master Mode works but is not tested in the real word. \ -\ les limitations du bus I2C -\ -------------------------- +\ how it works +\ ------------ \ -\ 1- le bus I2C est orienté Maître vers Esclave, l'esclave ne décide de rien. -\ Cet ordre des choses permet en tout cas d'établir la liaison. -\ On placera donc le maître du côté du TERMINAL de commande et la cible FastForth côté esclave. -\ Mais une fois que la liaison est établie il faut trouver une astuce pour renverser -\ les rôles, afin que l'esclave puisse prendre le contrôle de l'échange de données. +\ 1- the I2C bus is Master to Slave oriented, the Slave does not decide anything. +\ This order of things allows in any case to establish the connection. +\ The I2C Master device is therefore placed on the control TERMINAL side and the FastForth target on the I2C Slave side. +\ But once the link is established, we have to find a trick to reverse the roles, +\ so that the slave can take control of the data exchange. \ -\ 2- le bus I2C fonctionne en Half Duplex. -\ Une autre astuce consistera donc à simuler une liaison I2C_Slave TERMINAL en mode Full Duplex. +\ 2- The I2C bus operates on half duplex. +\ Another trick will be to simulate an I2C_Master TERMINAL in Full Duplex mode. \ -\ Solutions : l'esclave envoie "servilement" des caractères de contrôle au maître, -\ et comme celui-ci obéit à un plus grand que lui, le programmeur, -\ il se fait un devoir "magistral" d'obéir à l'esclave. +\ Solution: The slave "slavishly" sends control characters to the master, +\ and since this one obeys a bigger man than himself: the programmer.., +\ he makes it his "masterly" duty to obey the slave. \ -\ Pour prendre le contrôle du maître, l'esclave lui émet donc 1 parmi 6 CTRL-Char: -\ CTRL-Char $00 envoyé par ACCEPT (1ère partie, avant de s'endormir avec SLEEP), -\ CTRL-Char $01 envoyé par KEY: demande d'envoi d'un caractère unique saisi sur TERMINAL, -\ CTRL-Char $02 envoyé par ABORT: demande d'abandon du fichier en cours de transmission le cas échéant, -\ suivi d'un START RX pour la réception du message envoyé par ABORT, -\ CTRL-Char $03 envoyé par COLD, pour que le maître relance la connexion I2C en mode RX, -\ CTRL-Char $04 envoyé par NOECHO, pour qu'il passe l'UART en mode half duplex, -\ CTRL-Char $05 envoyé par ECHO, pour qu'il rétablisse l'UART en mode full duplex. +\ To take control of the master, the slave emits 1 of 6+1 CTRL-Char: +\ CTRL-Char $00 sent by ACCEPT (before falling asleep with SLEEP), +\ CTRL-Char $01 sent by KEY: request to send a single character entered on TERMINAL, +\ CTRL-Char $02 sent by ABORT": request to abort the file being downloaded if any, +\ followed by a START RX for ABORT" message, +\ CTRL-Char $03 sent by WARM, to do a reSTART RX for WARM message, +\ CTRL-Char $04 sent by NOECHO, to switch the UART to half-duplex mode, +\ CTRL-Char $05 sent by ECHO, to switch the UART to full duplex mode. \ -\ Enfin, si le maître reçoit un caractère $FF, il considère que la liaison est coupée, -\ il effectue ABORT pour forcer le maître à effectuer un START RX en boucle. +\ Finally, if the master receives a $FF as data, he considers the link broken, +\ it performs ABORT which forces a START RX on a loop. \ -\ Une fois que l'esclave a envoyé le CTRL_Char $00, il s'endort, -\ à la reception de ce CTRL_Char, le maître s'endort aussi, dans l'attente d'une interruption UART RX. -\ Tant que le TERMINAL est silencieux, le maître et l'esclave restent en mode SLEEP, -\ LPM0 pour le maître (l'UART ne fonctionne pas si LPMx < LPM0), LPM4 pour l'esclave. +\ Once the slave sends the CTRL_Char $00, he falls asleep, +\ On receipt of this CTRL_Char, the master also falls asleep, awaiting a UART RX interruption. +\ As long as the TERMINAL is silent, the master and the slave remain in SLEEP mode, +\ (a part the Tx0_INT interrupt every 1/2 s). +\ SLEEP mode is LPM0 for the master (UART does not work if LPMx > LPM0), LPM4 for the slave. \ -\ --------------- \ interruptions -\ --------------- -\ -\ TxIFG_INT sert à générer une interruption 1/2 seconde qui est prise en compte uniquement quand le maître fait dodo. -\ Elle effectue un (re)START RX ce qui permet de rétablir la liaison I2C suite à un RESET|COLD effectué sur I2C_Slave. -\ (Le switch RESET est en effet redirigé sur COLD via l'interruption USER NMI). -\ Logique d'établissement de la liaison I2C (START RX): -\ si X U>= 4 (1ère connexion demandée par le maître) ==> un START RX à chaque 1/2s, -\ si X U< 4 (perte de connexion suite à I2C_Slave{COLD|RESET|WARM|ABORT}) ==> START RX répété en boucle. -\ -\ WDT_INT génère une interruption 8 ms qui est prise en compte quand le maître fait dodo. -\ elle permet la sortie du programme UARTI2CS quand Teraterm envoie Alt-B ou quand l'utilisateur actionne SW2+RESET. +\ ------------- +\ Since the slave can't wake up the master with a dedicated interrupt, the master must generate one +\ cyclically to listen to the slave. +\ HALF_S_INT is used to generate a 1/2 second interrupt, obviously taken into account only when the master goes to sleep. +\ It performs a (re)START RX that enables the I2C link to be re-established following a RESET performed on I2C_Slave. \ -\ TERM_INT redirige l'interruption par défaut UART RX_INT +\ This interruption also allows the UARTI2CS program to exit when Teraterm sends a BREAK (Alt-B). \ +\ the other interruption U2I_TERM_INT is used to communicate with TERMINAL, by replacing of the TERM_INT one. \ -[UNDEFINED] @ [IF] -\ https://forth-standard.org/standard/core/Fetch -\ @ c-addr -- char fetch char from memory -CODE @ -MOV @TOS,TOS -MOV @IP+,PC -ENDCODE -[THEN] - -[UNDEFINED] AND [IF] -\ https://forth-standard.org/standard/core/AND -\ C AND x1 x2 -- x3 logical AND -CODE AND -AND @PSP+,TOS -MOV @IP+,PC -ENDCODE -[THEN] - -[UNDEFINED] 0= [IF] -\ https://forth-standard.org/standard/core/ZeroEqual -\ 0= n/u -- flag return true if TOS=0 -CODE 0= -SUB #1,TOS \ borrow (clear cy) if TOS was 0 -SUBC TOS,TOS \ TOS=-1 if borrow was set -MOV @IP+,PC -ENDCODE -[THEN] +; ---------------------------------------------------------------------- +; UARTI2CS.f +; ---------------------------------------------------------------------- -: I2CTERM_ABORT -$0D EMIT \ return to column 1 -1 ABORT" <-- Ouch! unexpected target with I2C TERMINAL" +\ first, we do some tests before downloading application +CODE ABORT_UARTI2CS +SUB #4,PSP +MOV TOS,2(PSP) +MOV &KERNEL_ADDON,TOS +BIT #$7800,TOS +0<> IF MOV #0,TOS THEN \ if TOS <> 0 (UART TERMINAL), set TOS = 0 +MOV TOS,0(PSP) +MOV &VERSION,TOS +SUB #307,TOS \ FastForth V3.7 +COLON +$0D EMIT \ return to column 1 without CR +ABORT" FastForth version = 3.7 please!" +ABORT" <-- Ouch! unexpected I2C_FastForth target!" +PWR_STATE \ remove the ABORT_UARTI2CS definition before continuing the download. ; -KERNEL_ADDON @ $7800 AND 0= [IF] ; unexpected I2C TERMINAL ? -I2CTERM_ABORT -[THEN] - -PWR_STATE \ remove the above words - -[DEFINED] {UARTI2CS} [IF] {UARTI2CS} [THEN] - -MARKER {UARTI2CS} - -[UNDEFINED] < [IF] \ define < and > -\ https://forth-standard.org/standard/core/less -\ < n1 n2 -- flag test n1 IF \ 2 -BW1 MOV #-1,TOS \ 1 flag Z = 0 - THEN - MOV @IP+,PC -ENDCODE +ABORT_UARTI2CS \ abort test -\ https://forth-standard.org/standard/core/more -\ > n1 n2 -- flag test n1>n2, signed -CODE > - SUB @PSP+,TOS \ 2 TOS=n2-n1 - S< ?GOTO BW1 \ 2 --> +5 -FW1 AND #0,TOS \ 1 flag Z = 1 - MOV @IP+,PC -ENDCODE +[DEFINED] {UARTI2CS} +[IF] {UARTI2CS} \ remove {UARTI2CS} if already defined [THEN] -[UNDEFINED] @ [IF] -\ https://forth-standard.org/standard/core/Fetch -\ @ c-addr -- char fetch char from memory -CODE @ -MOV @TOS,TOS -MOV @IP+,PC -ENDCODE -[THEN] +MARKER {UARTI2CS} \ {UARTI2CS}+8 = RET_ADR to do nothing by default +6 ALLOT \ {UARTI2CS}+10 <-- previous INI_APP +\ {UARTI2CS}+12 <-- previous TERM_VEC +\ {UARTI2CS}+14 <-- previous Tx0_x_VEC [UNDEFINED] CONSTANT [IF] \ https://forth-standard.org/standard/core/CONSTANT @@ -209,55 +170,64 @@ MOV @IP+,PC ENDCODE [THEN] -I2CSLA0 CONSTANT I2CS_ADR \ CONSTANT = I2C_Slave address in FRAM (I2CSLA0=$FFA2) +I2CSLA0 CONSTANT I2CS_ADR \ I2CSLA0=$FFA2 +I2CSLA1 CONSTANT HALF_DUPLEX \ I2CSLA1=$FFA4 +0 HALF_DUPLEX ! \ =0 --> ECHO, <>0 --> NOECHO -\ ------------------------------\ -ASM QUIT_I2C \ <== MultiMaster, START_RX loop, I2C_WARM -\ ------------------------------\ -BW1 \ <== WDT_INT -\ \ ------------------------------\ -\ BIC.B #LED2,&LED2_DIR \ RX green led OFF -\ BIC.B #LED2,&LED2_OUT \ RX green led OFF -\ BIC.B #LED1,&LED1_DIR \ TX red led OFF -\ BIC.B #LED1,&LED1_OUT \ TX red led OFF -\ \ ------------------------------\ - BIS.B #SM_BUS,&I2CSM_REN \ reset I/O as reset state - BIC.B #SM_BUS,&I2CSM_DIR \ - BIS.B #SM_BUS,&I2CSM_OUT \ - MOV #$5A88,&WDTCTL \ stop WDT - BIC #1,&SFRIE1 \ disable WDT int - MOV #COLD,&WDT_VEC \ restore default WDT_VEC value -\ MOV #0,&TA0CTL \ stop timer -\ MOV #COLD,&TA0_x_VEC \ restore default TA0_x_VEC value - MOV #0,&TB0CTL \ stop timer - MOV #COLD,&TB0_x_VEC \ restore default TB0_x_VEC value - MOV &TERMINAL_INT,&TERM_VEC \ restore default TERM_VEC value - MOV #WARM,X \ X = CFA of WARM - ADD #4,X \ X = BODY of WARM - MOV X,-2(X) \ restore default WARM: BODY of WARM --> PFA of WARM - MOV #COLD,PC \ explicit return with COLD -ENDASM +\ note: ASM definitions are hidden and cannot be executed from TERMINAL +\---------------------------\ +ASM I2CSTOP \ sends a STOP on I2C_BUS +\---------------------------\ _ +BIS.B #SM_SCL,&I2CSM_DIR \ 3 h v_ force SCL as output (low) +NOP3 \ 3 l _ +BIS.B #SM_SDA,&I2CSM_DIR \ 3 l v_ SDA as output ==> SDA low +NOP3 \ 3 l _ +BIC.B #SM_SCL,&I2CSM_DIR \ 3 l _^ release SCL (high) +NOP3 \ 3 h _ +BIC.B #SM_SDA,&I2CSM_DIR \ 3 h _^ relase SDA (high) when SCL is high = STOP +MOV @RSP+,PC \ +ENDASM \ +\---------------------------\ + +\ note: ASM definitions are hidden and cannot be executed from TERMINAL +\---------------------------\ +ASM STOP_U2I \ STOP_APP subroutine, the next of TERATERM(ALT+B)|SW2+RST|SYS_failures +\ --------------------------\ UARTI2CS can't be stopped by any other means. +BW1 \ <-- I2C_MASTER_RX <-- TERATERM break (Alt+B) +CMP #RET_ADR,&{UARTI2CS}+8 \ +0<> IF \ run STOP_U2I once, only if MARKER_DOES is already initialized +\ \ ----------------------\ +\ BIC.B #LED2,&LED2_DIR \ set RX green led OFF +\ BIC.B #LED2,&LED2_OUT \ set RX green led OFF +\ BIC.B #LED1,&LED1_DIR \ set TX red led OFF +\ BIC.B #LED1,&LED1_OUT \ set TX red led OFF +\ \ ----------------------\ + CALL #I2CSTOP \ stop properly I2C_BUS + MOV #SM_BUS,W \ + BIC.B W,&I2CSM_DIR \ restore I2C_BUS I/O as input + BIS.B W,&I2CSM_OUT \ with pull up resistors + BIS.B W,&I2CSM_REN \ +\ MOV #0,&TA0CTL \ stop timer and clear its interrupt flags IE, IFG + MOV #0,&TB0CTL \ stop timer and clear its interrupt flags IE, IFG +\ --------------------------\ + MOV #{UARTI2CS}+10,W \ W = addr of first saved param after MARKER_DOES + MOV #RET_ADR,-2(W) \ don't forget: restore default MARKER_DOES call address ! + MOV @W+,&WARM+2 \ restore previous (default) INI_APP address + MOV @W+,&TERM_VEC \ restore previous (default) TERM_VEC value +\ MOV @W+,&TA0_X_VEC \ restore previous (default) TB0_x_VEC value + MOV @W+,&TB0_X_VEC \ restore previous (default) TB0_x_VEC value + MOV #1,TOS \ to identify Alt+B|SW2+RST request in WARM message +THEN \ +\ --------------------------\ when STOP_U2I is the next of: TERATERM(ALT+B)|SW2+RESET|SYS_failures +MOV @RSP+,PC \ RET to: WARM_BODY|WARM_BODY|WARM_BODY +ENDASM \ +\ --------------------------\ -\ ******************************\ -ASM WDT_INT \ enables Alt+B when I2C_Master is sleeping -\ ******************************\ -BIT #8,&TERM_STATW \ UART break sent by TERATERM ? -0<> IF - ADD #4,RSP \ remove RETI - GOTO BW1 \ goto QUIT_I2C -THEN -RETI \ return to SLEEP -ENDASM \ \ vvvvvvvMulti-Master-Modevvvvvv\ \ ASM DO_IDLE \ \ MOV #4,W \ 1 wait bus idle time = 5 µs @ 16 MHz \ BEGIN -\ BIT #8,&TERM_STATW \ 3 break sent by TERATERM ? -\ 0<> IF \ 2 -\ ADD #2,RSP \ remove RET -\ MOV #QUIT_I2C,PC \ STOP I2C -\ THEN \ BIT.B #SM_SCL,&I2CSM_IN \ 3 \ 0= IF \ 2 \ MOV #4,W \ 1 if SCL is LOW @@ -272,61 +242,62 @@ ENDASM \ ENDASM \ \ ^^^^^^^Multi-Master-Mode^^^^^^\ +\ note: ASM definitions are hidden and cannot be executed from TERMINAL \ **************************************\ -ASM TERM_INT \ interrupt starts on RX first char of line input from TERMINAL +ASM U2I_TERM_INT \ UART RX interrupt starts on first char of each line sent by TERMINAL \ **************************************\ -ADD #4,RSP \ 1 remove RET and SR +ADD #4,RSP \ 1 remove unused PC_RET and SR_RET \ --------------------------------------\ -MOV &PAD_I2CADR,W \ 3 W = 0 if ECHO, 1 if NOECHO -MOV #PAD_ORG,T \ 2 T = input buffer for I2C_Master TX -MOV #$0D,S \ 2 S = last char to be RXed by UART +MOV &HALF_DUPLEX,W \ 3 W = HALF_DUPLEX = 0 if ECHO, -1 if NOECHO +MOV #PAD_ORG,T \ 2 T = buffer pointer for UART_TERMINAL input +MOV #$0D,S \ 2 S = 'CR' = penultimate char of line to be RXed by UART BEGIN \ MOV.B &TERM_RXBUF,Y \ 3 move char from TERM_RXBUF... ADD #1,T \ 1 - MOV.B Y,-1(T) \ 3 ... to buffer (PAD) - CMP.B Y,S \ 1 char = CR ? -0<> WHILE \ 2 28 cycles loop ==> up to 2.85 Mbds @ 8MHz - CMP #0,W \ 1 - 0= IF \ 2 if echo ON requested by I2C_Slave + MOV.B Y,-1(T) \ 3 ... to input buffer + CMP.B Y,S \ 1 char = CR ? (if yes goto next REPEAT) +0<> WHILE \ 2 if <> + CMP #0,W \ 1 HALF_DUPLEX = 0 ? + 0= IF \ 2 yes, echo is ON BEGIN \ ) - BIT #2,&TERM_IFG \ 3 > Test TX_Buf empty mandatory for low baudrates + BIT #2,&TERM_IFG \ 3 > Test TX_Buf empty, mandatory for low baudrates 0<> UNTIL \ 2 ) - MOV.B Y,&TERM_TXBUF \ 3 - THEN + MOV.B Y,&TERM_TXBUF \ 3 echo char to UART_TERMINAL + THEN \ BEGIN \ - BIT #1,&TERM_IFG \ 3 received char ? + BIT #1,&TERM_IFG \ 3 wait for next char received 0<> UNTIL \ 2 -REPEAT \ 2 -CALL &RXOFF \ stops UART RX still char CR is received and before receiving char LF +REPEAT \ 2 31 cycles loop ==> up to UART 2.58 Mbds @ 8MHz +CALL #UART_RXOFF \ stops UART RX still char CR is received, the LF char is being transmitted. BEGIN \ - BIT #1,&TERM_IFG \ 3 char $0A received ? -0<> UNTIL \ 2 RX_int flag is cleared + BIT #1,&TERM_IFG \ 3 char LF received ? +0<> UNTIL \ 2 \ --------------------------------------\ -BW1 \ <=== Ctrl_char $01 (KEY input) +BW2 \ <=== Ctrl_char $01 (KEY input) \ --------------------------------------\ -MOV.B &TERM_RXBUF,S \ 3 S = last char (LF|KEY_input) ... +MOV.B &TERM_RXBUF,S \ 3 S = last char RXed by UART (LF|KEY) MOV.B S,0(T) \ 4 store it into buffer \ ======================================\ \ ======================================\ -\ I2C MASTER TX \ now we transmit UART RX buffer (PAD) to I2C_Slave, S = last char to transmit +\ I2C MASTER TX \ now we transmit UART RX buffer (PAD) to I2C_Slave, S = LF|KEY = last char to transmit \ ======================================\ \ ======================================\ -\ \ --------------------------------------\ +BW3 \ <=== multi master TX +\ --------------------------------------\ \ BIS.B #LED1,&LED1_DIR \ red led ON = I2C TX \ BIS.B #LED1,&LED1_OUT \ red led ON = I2C TX -\ \ --------------------------------------\ -\ \ vvvvvvvvvvMulti-Master-Modevvvvvvv\ -\ BW2 \ I2C_Master TX Start \ here, SDA and SCL must be in idle state -\ \ ^^^^^^^^^^Multi-Master-Mode^^^^^^^\ _ -BIS.B #SM_SDA,&I2CSM_DIR \ 3 l v_ force SDA as output (low) +\ --------------------------------------\ +\ I2C_Master_TX_Start \ here, SDA and SCL must be in idle state +\ --------------------------------------\ _ +BIS.B #SM_SDA,&I2CSM_DIR \ 3 l v_ force SDA low when SCL is high = START MOV.B &I2CS_ADR,X \ 3 h X = Slave_Address -MOV #PAD_ORG,Y \ 2 h Y = input buffer for I2C_Master TX +MOV #PAD_ORG,Y \ 2 h Y = buffer pointer for I2C_Master TX NOP3 \ 3 h _ BIS.B #SM_SCL,&I2CSM_DIR \ 3 h v_ force SCL as output (low) \ --------------------------------------\ BEGIN \ ------------------------------------\ -\ I2C Master TX address/Data \ +\ I2C_Master_TX address/Data \ \ ------------------------------------\ MOV.B #8,W \ 1 l prepare 8 bits address BEGIN \ @@ -335,12 +306,11 @@ BEGIN BIC.B #SM_SDA,&I2CSM_DIR \ 3 l yes : SDA as input ==> SDA high because pull up resistor ELSE \ 2 l BIS.B #SM_SDA,&I2CSM_DIR \ 3 l no : SDA as output ==> SDA low -\ NOP2 \ 2 uncomment for beautiful code THEN \ l _ BIC.B #SM_SCL,&I2CSM_DIR \ 3 l _^ release SCL (high) - BEGIN \ we must wait I2C_Slave wake up + BEGIN \ we must wait I2C_Slave software BIT.B #SM_SCL,&I2CSM_IN \ 3 h by testing SCL released - 0<> UNTIL \ 2 h + 0<> UNTIL \ 2 h (because Slave can strech SCL low) \ \ vvvvvvvvMulti-Master-Modevvvvvvv\ \ BIT.B #SM_SDA,&I2CSM_IN \ 3 h test SDA \ \ ^^^^^^^^Multi-Master-Mode^^^^^^^\ _ @@ -351,7 +321,7 @@ BEGIN \ 0= IF \ 2 l = collision detected \ BIS.B #SM_SCL,&I2CSM_DIR \ 4 l release SCL first \ CALL #DO_IDLE \ wait stable idle state -\ GOTO BW2 \ 2 l goto START TX +\ GOTO BW3 \ 2 l goto START TX \ THEN \ \ THEN \ \ \ ^^^^^^^^^^^^Multi-Master-Mode^^^^^^^^^^^\ @@ -360,151 +330,129 @@ BEGIN \ ------------------------------------\ BIC.B #SM_SDA,&I2CSM_DIR \ 3 l after TX byte we must release SDA to read Ack/Nack from Slave \ ------------------------------------\ -\ I2C Master get Slave Ack/Nack \ +\ I2C_Master_TX get Slave Ack/Nack \ \ ------------------------------------\ _ BIC.B #SM_SCL,&I2CSM_DIR \ 3 l _^ release SCL (high) \ BEGIN \ \ BIT.B #SM_SCL,&I2CSM_IN \ 3 h testing SCL released is useless -\ 0<> UNTIL \ 2 h replaced by NOP3 - NOP3 \ 3 h +\ 0<> UNTIL \ 2 h because no risk of Slave streching SCL low + NOP3 \ 3 h replaced by NOP3. BIT.B #SM_SDA,&I2CSM_IN \ 3 h _ get SDA state - BIS.B #SM_SCL,&I2CSM_DIR \ 3 h v_ SCL as output : force SCL low + BIS.B #SM_SCL,&I2CSM_DIR \ 3 h v_ SCL as output : force SCL low, to keep I2C_BUS until next I2C_MASTER START (RX|TX) \ ------------------------------------\ -0= WHILE \ 1- Slave Ack received \ 2 l else goto THEN; out of loop if Nack +0= WHILE \ 1- Slave Ack received \ 2 l out of loop if Nack (goto THEN next REPEAT) \ ------------------------------------\ \ I2C_Master_TX_data_loop \ \ ------------------------------------\ - CMP S,T \ 1 T = last char to transmit ? (when address is sent, T = 16bits <> S = 8bits) + CMP S,T \ 1 last char TXed = last char RXed ? (when address is sent, T = 16bits <> S = 8bits) \ ------------------------------------\ -0<> WHILE \ 2- TXed char <> last char \ 2 else out of loop +0<> WHILE \ 2- TXed char <> last char \ 2 out of loop if TXed char T = last char S to be TXed (goto below REPEAT) \ ------------------------------------\ - MOV.B @Y+,X \ 2 l get next byte to TX - MOV X,T \ 1 T = last char TX for comparaison above + MOV.B @Y+,X \ 2 l get next RXed char + MOV X,T \ 1 T = last TX char for comparaison above, on next loop. REPEAT \ <-- WHILE2 search "Extended control-flow patterns"... THEN \ <-- WHILE1 ...in https://forth-standard.org/standard/rationale -\ ------------------------------------\ -\ Nack or Ack on last char \ Nack = I2C_Slave request or I2C_Slave RESET, Ack = last char has been TXed -\ ------------------------------------\ - NOP3 \ 3 l _ delay to reach I2C tLO - BIC.B #SM_SCL,&I2CSM_DIR \ 3 l _^ release SCL to enable START RX \ \ --------------------------------------\ \ BIC.B #LED1,&LED1_DIR \ red led OFF = endof I2C TX \ BIC.B #LED1,&LED1_OUT \ red led OFF = endof I2C TX \ \ --------------------------------------\ -GOTO FW1 \ X > 4 ==> START RX every 1/2s +GOTO FW1 \ X > 4 ==> reSTART RX repeated every 1/2s \ ======================================\ -\ END OF I2C MASTER TX \ -\ ======================================\ -ENDASM +\ END OF I2C MASTER TX \ SCL is kept low until START RX --┐ +\ ======================================\ | +ENDASM \ | +\ **************************************\ v + +\ note: ASM definitions are hidden and cannot be executed from TERMINAL \ **************************************\ -ASM TxIFG_INT +ASM HALF_S_INT \ wakes up every 1/2s to listen I2C Slave or break from TERMINAL. \ **************************************\ -\ I2C MASTER RX \ -\ --------------------------------------\ -ADD #4,RSP \ 1 remove RET and SR -\ --------------------------------------\ -FW1 \ from TERM_INT above -\ --------------------------------------\ -BW3 \ from I2C_WARM below -\ --------------------------------------\ -\ I2C_Master START RX \ -\ --------------------------------------\ -KERNEL_ADDON @ 0 < \ -[IF] \ if LF XTAL - MOV #%0001_1101_0110,&TB0CTL \ 3 (re)starts RX_timer,ACLK=LFXTAL=32738,/8=4096Hz,up mode,clear timer,enable TB0 int, clear IFG -\ MOV #%0001_1101_0110,&TA0CTL \ 3 (re)starts RX_timer,ACLK=LFXTAL=32768,/8=4096Hz,up mode,clear timer,enable TA0 int, clear IFG -[ELSE] \ 2 - MOV #%0001_0101_0110,&TB0CTL \ 3 (re)starts RX_timer,ACLK=VLO=8kHz,/2=4096Hz,up mode,clear timer,enable TB0 int, clear IFG -\ MOV #%0001_0101_0110,&TA0CTL \ 3 (re)starts RX_timer,ACLK=VLO=8kHz,/2=4096Hz,up mode,clear timer,enable TA0 int, clear IFG -[THEN] -\ --------------------------------------\ -\ le driver I2C_Master envoie START RX en boucle continue (X < 4) ou discontinue (X >= 4). -\ le test d'un break en provenance de l'UART est intégré dans cette boucle. -\ --------------------------------------\ -BEGIN \ I2C MASTER RX -\ --------------------------------------\ - BEGIN \ I2C MASTER START RX +ADD #4,RSP \ 1 remove PC_RET and SR_RET | +\ --------------------------------------\ | +FW1 \ <-- the next of TERM_INT above <--┘ +BW3 \ <-- the next of INI_U2I below <--┐ +\ --------------------------------------\ | +CMP #0,&KERNEL_ADDON \ 3 KERNEL_ADDON(BIT15) = LF XTAL flag +0>= IF \ if no LF XTAL +\ MOV #%0001_0101_0110,&TA0CTL \ 3 (re)starts RX_timer,ACLK=VLO=8kHz,/2=4096Hz,up mode,clear timer,enable TA0 int, clear IFG + MOV #%0001_0101_0110,&TB0CTL \ 3 (re)starts RX_timer,ACLK=VLO=8kHz,/2=4096Hz,up mode,clear timer,enable TB0 int, clear IFG +ELSE \ if LF XTAL +\ MOV #%0001_1101_0110,&TA0CTL \ 3 (re)starts RX_timer,ACLK=LFXTAL=32768,/8=4096Hz,up mode,clear timer,enable TA0 int, clear IFG + MOV #%0001_1101_0110,&TB0CTL \ 3 (re)starts RX_timer,ACLK=LFXTAL=32738,/8=4096Hz,up mode,clear timer,enable TB0 int, clear IFG +THEN \ +\ ======================================\ +\ I2C_MASTER RX \ le driver I2C_Master envoie START RX en boucle continue (X < 4) ou discontinue (X >= 4). +\ ======================================\ le test d'un break en provenance de l'UART est intégré dans cette boucle. +BEGIN \ I2C MASTER START RX \ ABORT|WARM loop back +\ ------------------------------------\ _ + BIC.B #SM_SCL,&I2CSM_DIR \ 3 l _^ release SCL to enable ReSTART RX + BIT #8,&TERM_STATW \ 3 break (Alt+B) sent by TERATERM ? + 0<> ?GOTO BW1 \ goto STOP_U2I, exit to WARM+4. \ ------------------------------------\ - BIT #8,&TERM_STATW \ 3 break sent by TERATERM ? - 0<> IF \ 2 - MOV #QUIT_I2C,PC \ 2 STOP I2C - THEN -\ --------------------------------\ -\ I2C_Master_Start_Cond \ here, SDA and SCL must be in idle state -\ --------------------------------\ _ - BIS.B #SM_SDA,&I2CSM_DIR \ 3 l v_ force SDA as output (low) - MOV.B &I2CS_ADR,Y \ 3 h X = Slave_Address - BIS.B #1,Y \ 1 h Master RX - NOP2 \ 2 _ - BIS.B #SM_SCL,&I2CSM_DIR \ 3 h v_ force SCL as output (low) -\ --------------------------------\ -\ I2C_Master_Send_address \ may be SCL is held low by slave -\ --------------------------------\ - MOV.B #8,W \ 1 l prepare 8 bits address - BEGIN \ - ADD.B Y,Y \ 1 l shift one left - U>= IF \ 2 l carry set ? - BIC.B #SM_SDA,&I2CSM_DIR \ 3 l yes : SDA as input ==> SDA high because pull up resistor - ELSE \ 2 l - BIS.B #SM_SDA,&I2CSM_DIR \ 3 l no : SDA as output ==> SDA low -\ NOP2 \ 2 uncomment for beautiful code - THEN \ _ - BIC.B #SM_SCL,&I2CSM_DIR \ 3 l _^ release SCL (high) -\ BEGIN \ -\ BIT.B #SM_SCL,&I2CSM_IN \ 3 h testing SCL released is useless -\ 0<> UNTIL \ 2 h replaced by NOP3 - NOP3 \ 3 -\ \ vvvvvvMulti-Master-Modevvvvv\ -\ BIT.B #SM_SDA,&I2CSM_IN \ 3 h test SDA -\ \ ^^^^^^Multi-Master-Mode^^^^^\ _ - BIS.B #SM_SCL,&I2CSM_DIR \ 3 h v_ force SCL as output (low) -\ \ vvvvvvvvvvvvMulti-Master-Modevvvvvvvvvvv\ -\ 0= IF \ 2 l SDA input low -\ BIT.B #SM_SDA,&I2CSM_DIR \ 3 l + SDA command high -\ 0= IF \ 2 l = collision detected -\ BIS.B #SM_SCL,&I2CSM_DIR \ 4 l release SCL first -\ CALL #DO_IDLE \ wait stable idle state -\ GOTO BW3 \ 2 l goto START RX -\ THEN \ -\ THEN \ -\ \ ^^^^^^^^^^^^Multi-Master-Mode^^^^^^^^^^^\ - SUB #1,W \ 1 l bits count - 1 - 0= UNTIL \ 2 l -\ --------------------------------\ -\ Wait Ack/Nack on address \ -\ --------------------------------\ - BIC.B #SM_SDA,&I2CSM_DIR \ 3 l _ after TX address we must release SDA to read Ack/Nack from Slave - BIC.B #SM_SCL,&I2CSM_DIR \ 3 l _^ release SCL (high) - BEGIN \ - BIT.B #SM_SCL,&I2CSM_IN \ 3 h wait I2C_Slave ready - 0<> UNTIL \ 2 h I2C_Slave releases SCL - BIT.B #SM_SDA,&I2CSM_IN \ 3 h _ get SDA - BIS.B #SM_SCL,&I2CSM_DIR \ 3 h v_ SCL as output : force SCL low -\ --------------------------------\ - 0<> WHILE \ Nack_On_Address \ 2 l +\ I2C_Master_RX_Start_Cond \ here, SDA and SCL must be in idle state +\ ------------------------------------\ _ + BIS.B #SM_SDA,&I2CSM_DIR \ 3 l v_ force SDA as output (low) + MOV.B &I2CS_ADR,Y \ 3 h X = Slave_Address + BIS.B #1,Y \ 1 h set Master RX + NOP2 \ 2 _ + BIS.B #SM_SCL,&I2CSM_DIR \ 3 h v_ force SCL as output (low) +\ ------------------------------------\ +\ I2C_Master_RX_Send_address \ may be SCL is held low by slave +\ ------------------------------------\ + MOV.B #8,W \ 1 l prepare 8 bits address + BEGIN \ + ADD.B Y,Y \ 1 l shift one left + U>= IF \ 2 l carry set ? + BIC.B #SM_SDA,&I2CSM_DIR \ 3 l yes : SDA as input ==> SDA high because pull up resistor + ELSE \ 2 l + BIS.B #SM_SDA,&I2CSM_DIR \ 3 l no : SDA as output ==> SDA low + THEN \ _ + BIC.B #SM_SCL,&I2CSM_DIR \ 3 l _^ release SCL (high) +\ BEGIN \ +\ BIT.B #SM_SCL,&I2CSM_IN \ 3 h testing SCL released is useless +\ 0<> UNTIL \ 2 h because no risk of Slave streching SCL low + NOP3 \ 3 replaced by NOP3 +\ \ vvvvvvMulti-Master-Modevvvvvvvvv\ +\ BIT.B #SM_SDA,&I2CSM_IN \ 3 h test SDA +\ \ ^^^^^^Multi-Master-Mode^^^^^^^^^\ _ + BIS.B #SM_SCL,&I2CSM_DIR \ 3 h v_ force SCL as output (low) +\ \ vvvvvvvvvvvvMulti-Master-Modevvvvvvvvvvv\ +\ 0= IF \ 2 l SDA input low +\ BIT.B #SM_SDA,&I2CSM_DIR \ 3 l + SDA command high +\ 0= IF \ 2 l = collision detected +\ BIS.B #SM_SCL,&I2CSM_DIR \ 4 l release SCL first +\ CALL #DO_IDLE \ wait stable idle state +\ GOTO BW3 \ 2 l goto START RX +\ THEN \ +\ THEN \ +\ \ ^^^^^^^^^^^^Multi-Master-Mode^^^^^^^^^^^\ + SUB #1,W \ 1 l bits count - 1 + 0= UNTIL \ 2 l +\ ------------------------------------\ +\ Wait Ack/Nack on address \ +\ ------------------------------------\ _ + BIC.B #SM_SDA,&I2CSM_DIR \ 3 l _^_ after TX address we must release SDA to read Ack/Nack from Slave + BIC.B #SM_SCL,&I2CSM_DIR \ 3 l _^ release SCL (high) + BEGIN \ we must wait I2C_Slave software + BIT.B #SM_SCL,&I2CSM_IN \ 3 h by testing SCL released + 0<> UNTIL \ 2 h (because Slave can strech SCL low) + BIT.B #SM_SDA,&I2CSM_IN \ 3 h _ get SDA + BIS.B #SM_SCL,&I2CSM_DIR \ 3 h v_ SCL as output : force SCL low +\ ------------------------------------\ + 0<> IF \ Nack_On_Address \ 2 l \ --------------------------------\ - NOP3 \ 3 l delay to reach tLO +\ I2C_Master Send STOP \ \ --------------------------------\ -\ I2C_Master Send STOP \ after Nack_On_Address -\ --------------------------------\ _ - BIS.B #SM_SDA,&I2CSM_DIR \ 3 l v_ SDA as output ==> SDA low - NOP3 \ 3 l _ - BIC.B #SM_SCL,&I2CSM_DIR \ 3 l _^ release SCL (high) - NOP3 \ 3 h - NOP3 \ 3 h _ - BIC.B #SM_SDA,&I2CSM_DIR \ 3 h _^ SDA as input ==> SDA high with pull up resistor - CMP.B #4,X \ last CTRL_char <> ABORT ? - U>= IF \ if X >= 4 goto dodo for 1/2 s.. - MOV #SLEEP,PC \ 4 ..wake up by TxIFG_INT to reSTART RX or by WDT_INT (to QUIT UARTI2CS) - THEN - REPEAT \ 2 + CALL #I2CSTOP \ + MOV #SLEEP,PC \ 4 goto dodo for 1/2 s .. wake up by HALF_S_INT + THEN \ 2 +\ ------------------------------------\ +\ I2C_Master_RX_data \ \ \ ------------------------------------\ \ BIS.B #LED2,&LED2_DIR \ green led ON = I2C RX \ BIS.B #LED2,&LED2_OUT \ green led ON = I2C RX \ \ ------------------------------------\ -\ I2C_Master_RX_data \ -\ ------------------------------------\ BEGIN BEGIN BIC.B #SM_SDA,&I2CSM_DIR \ 4 l after Ack and before RX next byte, we must release SDA @@ -515,21 +463,23 @@ BEGIN \ I2C MASTER RX \ do SCL pulse \ SCL _| |_ \ -------------------------\ _ BIC.B #SM_SCL,&I2CSM_DIR \ 3 l _^ release SCL (high) -\ BEGIN \ 9/16~l +\ BEGIN \ \ BIT.B #SM_SCL,&I2CSM_IN \ 3 h testing SCL released is useless -\ 0<> UNTIL \ 2 h replaced by NOP3 - NOP3 +\ 0<> UNTIL \ 2 h because no risk of Slave streching SCL low + NOP3 \ 3 replaced by NOP3 BIT.B #SM_SDA,&I2CSM_IN \ 3 h _ get SDA BIS.B #SM_SCL,&I2CSM_DIR \ 3 h v_ SCL as output : force SCL low 13~ ADDC.B X,X \ 1 l C <--- X(7) ... X(0) <--- SDA SUB #1,W \ 1 l count down of bits - 0= UNTIL \ 2 l -\ --------------------------------\ - CMP.B #-1,X \ 1 - 0= IF \ 2 received char $FF: let's consider that the slave is lost... - MOV #2,X \ to do ABORT action - THEN \ -\ --------------------------------\ + 0= UNTIL \ 2 l here, slave releases SDA +\ ----------------------------\ +\ case of RX data $FF \ +\ ----------------------------\ + CMP.B #-1,X \ 1 + 0= IF \ 2 received char $FF: let's consider that the slave is lost... + MOV #2,X \ to do ABORT action + THEN \ +\ ----------------------------\ CMP.B #8,X \ 1 l $08 = char BS U>= WHILE \ 2 l ASCII char received, from char 'BS' up to char $7F. \ ----------------------------\ @@ -539,52 +489,53 @@ BEGIN \ I2C MASTER RX \ ----------------------------\ BIS.B #SM_SDA,&I2CSM_DIR \ 3 l prepare Ack \ ----------------------------\ -\ I2C_Master Send Ack \ +\ I2C_Master_RX Send Ack \ on ASCII char >= $08 \ ----------------------------\ _ BIC.B #SM_SCL,&I2CSM_DIR \ 3 l _^ release SCL (high) - BEGIN \ - BIT.B #SM_SCL,&I2CSM_IN \ 3 h wait I2C_Slave ready - 0<> UNTIL \ 2 h I2C_Slave releases SCL - MOV.B X,&TERM_TXBUF \ 3 h _ send RX char to UART TERMINAL + BEGIN \ we must wait I2C_Slave software + BIT.B #SM_SCL,&I2CSM_IN \ 3 h by testing SCL released + 0<> UNTIL \ 2 h (because Slave can strech SCL low) +\ ----------------------------\ + MOV.B X,&TERM_TXBUF \ 3 h send RXed ASCII char to UART TERMINAL +\ ----------------------------\ _ BIS.B #SM_SCL,&I2CSM_DIR \ 3 h v_ SCL as output : force SCL low - REPEAT \ 2 l loop back to I2C_Master_RX_data + REPEAT \ 2 l loop back to I2C_Master_RX_data for chars >= 8 \ --------------------------------\ -\ case of Ctrl_char received \ here Master holds SCL low, Slave can test it: CMP #8,&TERM_STATW -\ --------------------------------\ +\ case of RX CTRL_Chars < $08 \ here Master holds SCL low, Slave can test it: CMP #8,&TERM_STATW +\ --------------------------------\ see forthMSP430FR_TERM_I2C.asm CMP.B #4,X \ 1 U>= IF \ 2 + MOV #0,&HALF_DUPLEX \ preset ECHO 0= IF \ 2 - MOV #1,&PAD_I2CADR \ 3 set NOECHO if char $04 - ELSE \ - MOV #0,&PAD_I2CADR \ set ECHO if char >$04 + MOV #-1,&HALF_DUPLEX \ 3 set NOECHO if char $04 THEN - BIS.B #SM_SDA,&I2CSM_DIR \ 3 l prepare Ack + BIS.B #SM_SDA,&I2CSM_DIR \ 3 l prepare Ack for Ctrl_Chars $04 $05 THEN \ --------------------------------\ -\ I2C_Master send Ack/Nack \ +\ Master_RX send Ack/Nack on data \ Ack for $04, $05, Nack for $00, $01, $02, $03 \ --------------------------------\ _ BIC.B #SM_SCL,&I2CSM_DIR \ 3 l _^ release SCL (high) - BEGIN \ - BIT.B #SM_SCL,&I2CSM_IN \ 3 h wait I2C_Slave ready - 0<> UNTIL \ 2 h I2C_Slave releases SCL - BIT.B #SM_SDA,&I2CSM_IN \ 3 h _ get SDA + BEGIN \ we must wait I2C_Slave software + BIT.B #SM_SCL,&I2CSM_IN \ 3 h by testing SCL released + 0<> UNTIL \ 2 h (because Slave can strech SCL low) + BIT.B #SM_SDA,&I2CSM_IN \ 3 h _ get SDA as TX Ack/Nack state BIS.B #SM_SCL,&I2CSM_DIR \ 3 h v_ SCL as output : force SCL low -\ --------------------------------\ - 0<> UNTIL \ 2 l until Nack sent by Master for CTRL-Char {$00|$01|$02|$03} +\ --------------------------------\ l + 0<> UNTIL \ if Ack, loop back to Master_RX data for CTRL_Char $04,$05 \ ------------------------------------\ -\ Nack is sent by Master \ +\ Nack is sent by Master \ l case of CTRL-Char {$00|$01|$02|$03} \ ------------------------------------\ - CMP.B #2,X \ 1 l $02 = ctrl_char for ABORT request -U>= WHILE \ 2 l + CMP.B #2,X \ $02 = ctrl_char for ABORT request +U>= WHILE \ $03 = Ctrl_Char for WARM request \ ------------------------------------\ -\ CTRL_Char $02|$03 \ if ABORT|COLD requests +\ CTRL_Char $02|$03 \ l if ABORT|WARM requests, SDA is high, SCL is low \ ------------------------------------\ - 0= IF \ if ctrl_char $02 = ABORT request - MOV #0,&PAD_I2CADR \ set echo ON I2C_Master side (I use the useless address PAD_I2CADR) - CALL &RXON \ resume UART downloading source file - BEGIN \ - BIC #UCRXIFG,&TERM_IFG \ clear UCRXIFG - MOV &FREQ_KHZ,Y \ 1000, 2000, 4000, 8000, 16000, 240000 + 0= IF \ if ABORT request: + MOV #0,&HALF_DUPLEX \ set echo ON I2C_Master side + CALL #UART_RXON \ resume UART downloading source file + BEGIN \ + BIC #UCRXIFG,&TERM_IFG \ clear UCRXIFG + MOV &FREQ_KHZ,Y \ 1000, 2000, 4000, 8000, 16000, 240000 BEGIN MOV #32,W \ 2~ <-------+ windows 10 seems very slow... BEGIN SUB #1,W \ 1~ <---+ | ==> ((32*3)+5)*1000 = 101ms delay 0= UNTIL \ 2~ 3~ loop ---+ | to refill its USB buffer @@ -595,46 +546,34 @@ U>= WHILE \ 2 l \ 0= UNTIL \ 3~ loop ---+ | to refill its USB buffer \ SUB #1,Y \ | \ 0= UNTIL \ 200~ loop -----+ - BIT #UCRXIFG,&TERM_IFG \ 4 new char in TERMRXBUF during this delay ? - 0= UNTIL \ 2 yes, the input stream may be still active: loop back -\ ELSE \ do nothing if Ctrl_char = $03 - THEN -REPEAT \ loop back to I2C MASTER reSTART RX -\ --------------------------------------\ -\ CTRL_Char $00|$01 \ if ACCEPT|KEY requests + BIT #UCRXIFG,&TERM_IFG \ 4 new char in TERMRXBUF during this delay ? + 0= UNTIL \ 2 yes, the input stream may be still active: loop back + THEN \ +REPEAT \ l loop back to reSTART RX \ --------------------------------------\ -\ I2C_Master RX Send STOP \ -\ --------------------------------------\ -BIS.B #SM_SDA,&I2CSM_DIR \ 3 before STOP, we must pull SDA low -\ ------------------------------------\ _ -BIC.B #SM_SCL,&I2CSM_DIR \ 3 l _^ release SCL (high) -NOP3 \ 3 h -MOV #PAD_ORG,T \ 2 h _ ready to store KEY char: MOV.B S,0(T) -BIC.B #SM_SDA,&I2CSM_DIR \ 3 h _^ SDA as input ==> SDA high with pull up resistor +\ I2C_Master_RX Send STOP \ l remainder: CTRL_Chars $00,$01 +\ --------------------------------------\ +CALL #I2CSTOP \ \ \ --------------------------------------\ -\ BIC.B #LED2,&LED2_DIR \ 4 l green led OFF = endof I2C RX -\ BIC.B #LED2,&LED2_OUT \ 4 l green led OFF = endof I2C RX -\ \ --------------------------------------\ -\ ======================================\ +\ BIC.B #LED2,&LED2_DIR \ green led OFF = endof I2C RX +\ BIC.B #LED2,&LED2_OUT \ green led OFF = endof I2C RX \ ======================================\ -\ END OF I2C MASTER RX \ here I2C_bus is freed and Nack on Ctrl_char $FF|$00|$01 remains to be processed. +\ END OF I2C MASTER RX \ here I2C_bus is freed, Nack on Ctrl_char $FF|$00|$01 remains to be processed. \ ======================================\ -\ ======================================\ -\ TERMINAL TX --> UART RX \ -\ --------------------------------------\ \ I2C_Slave KEY ctl_char $01 \ I2C_Slave request for KEY input \ --------------------------------------\ -CMP.B #1,X \ 1 l +CMP.B #1,X \ \ Quand I2C_Master reçoit ce caractère de contrôle, \ il attend un caractère en provenance de TERMINAL UART \ et une fois ce caractère reçu reSTART TX pour l'envoyer à I2C_Slave -0= IF \ 2 l - CALL &RXON \ 4 l enables TERMINAL to TX; use no registers - BEGIN \ wait for a char or for a break - BIT #UCRXIFG,&TERM_IFG \ 3 received char ? - 0<> UNTIL \ 2 - CALL &RXOFF \ stops UART RX then - GOTO BW1 \ goto end of UART RX line input, for receiving last char +0= IF \ + MOV #PAD_ORG,T \ ready to store KEY char: MOV.B S,0(T) + CALL #UART_RXON \ enables TERMINAL to TX; use no registers + BEGIN \ wait for a char + BIT #UCRXIFG,&TERM_IFG \ received char ? + 0<> UNTIL \ + CALL #UART_RXOFF \ stops UART RX then + GOTO BW2 \ goto end of UART RX line input, for receiving last char THEN \ \ --------------------------------------\ \ I2C_Slave ACCEPT ctrl_char $00 \ I2C_Slave requests I2C_Master to stop RX and start TX @@ -645,82 +584,69 @@ THEN \ \ --------------------------------------\ \ et si I2C_Slave est sorti de son sommeil par un START RX, idem. \ --------------------------------------\ -MOV #SLEEP,PC \ execute RXON (that enables TERMINAL to TX) then goto dodo +MOV #SLEEP,PC \ executes RXON (that enables TERMINAL to TX) before LPM0 shut down. \ --------------------------------------\ \ I2C_Master se réveillera au premier caractère saisi sur le TERMINAL ==> TERM_INT, -\ ou en fin du temps TxIFG ==> TxIFG_INT\ -\ ou par un break opérateur ==> WDT_INT \ +\ ou en fin du temps TxIFG ==> HALF_S_INT\ ENDASM \ -\ --------------------------------------\ - +\ **************************************\ -\ --------------------------------------\ -ASM I2C_WARM \ replace default WARM -\ --------------------------------------\ -CMP #4,&SAVE_SYSRSTIV \ hard RESET ? -0= IF \ yes - BIT.B #SW2,&SW2_IN \ SW2 pressed ? ( SW2 <> SW1 = Deep RESET) - 0= IF \ yes - MOV #QUIT_I2C,PC \ quit I2C only if SW2+RESET - THEN \ -THEN \ -CMP #$10,&SAVE_SYSRSTIV \ -U>= IF \ if SYS failure >= $10 then STOP I2C - MOV #QUIT_I2C,PC \ -THEN \ -MOV #0,&SAVE_SYSRSTIV \ clear SAVE_SYSRSTIV after use -\ --------------------------------------\ -\ init WDT_INT \ -\ --------------------------------------\ -MOV #%0101_1010_0101_1111,&WDTCTL \ start Watchdog Timer : XDTPW, WDTSSEL=VLOCLK, WDTCNTCL=1, WDTIS=2^6 (8ms) -BIS #1,&SFRIE1 \ enable WDT -MOV #WDT_INT,&WDT_VEC \ replace WDT_VEC default COLD value by WDT_INT -\ --------------------------------------\ -\ init TxIFG_INT \ used to scan I2C_Slave hard RESET during SLEEP and to slow START RX loop -\ --------------------------------------\ -MOV #$800,&TB0CCR0 \ be careful: RX_Int time = (2047+1)/4096 = 0.5s must be >> COLD time ! -MOV #TxIFG_INT,&TB0_x_VEC \ replace TB0_x_VEC default COLD value by TxIFG_INT -\ MOV #$800,&TA0CCR0 \ be careful: RX_Int time = (2047+1)/4096 = 0.5s must be >> COLD time ! -\ MOV #TxIFG_INT,&TA0_x_VEC \ replace TA0_x_VEC default COLD value by TxIFG_INT -\ --------------------------------------\ -\ init UART_INT \ -\ --------------------------------------\ -MOV #TERM_INT,&TERM_VEC \ replace TERM_VEC default value (TERMINAL_INT) by TERM_INT -\ --------------------------------------\ -\ init I2C_MASTER I/O \ see \inc\your_target.pat -\ --------------------------------------\ -BIC.B #SM_BUS,&I2CSM_REN \ remove internal pullup resistors because of external 3.3k pullup resistor -BIC.B #SM_BUS,&I2CSM_OUT \ preset SDA + SCL output LOW -\ --------------------------------------\ -\ activate I/O \ SYSRSTIV = $02 | $0E = POWER ON | SVSH threshold -\ --------------------------------------\ -BIC #1,&PM5CTL0 \ activate all previous I/O settings; if not activated, nothing works after reset ! -\ --------------------------------------\ else CLOCK -MOV.B #4,X \ to enable sleep during START RX loop -GOTO BW3 \ goto I2C_Master START RX loop -ENDASM +\ note: ASM definitions are hidden and cannot be executed from TERMINAL +\---------------------------\ +ASM INI_U2I \ define INI_HARD_APP subroutine called by WARM +\ --------------------------\ +CALL &{UARTI2CS}+10 \ previous INI_APP executing init TERM_UC, activates I/O and sets TOS = RSTIV_MEM. +\ --------------------------\ TOS = SYSRSTIV = $00|$02|$04|$0E|$xx = POWER_ON|RST|SVSH_threshold|SYS_failures +CMP #$0E,TOS \ SVSHIFG SVSH event ? +0<> IF \ if not + CMP #$0A,TOS \ RSTIV_MEM >= violation memory protected areas ? + U>= ?GOTO BW1 \ execute STOP_U2I then RET to BODY of WARM +THEN \ RSTIV_MEM = {$00,$02,$04,$6,$0E} as: {WARM,PWR_ON,RST,COLD,SVSH_Threshold} +BIT.B #SW2,&SW2_IN \ SW2 pressed ? +0= ?GOTO BW1 \ if yes execute STOP_U2I then RET to BODY of WARM +MOV #0,&RSTIV_MEM \ clear RSTIV_MEM before next RST event! +\ --------------------------\ +\ init HALF_S_INT \ used to scan I2C_Slave hard RESET and to slow (re)START RX loop +\ --------------------------\ +MOV #$800,&TB0CCR0 \ time = (2047+1)/4096 = 0.5s +\ MOV #$800,&TA0CCR0 \ time = (2047+1)/4096 = 0.5s +\ --------------------------\ +\ init I2C_MASTER I/O \ see \inc\your_target.pat to find I2C MASTER SDA & SCL pins (as SM_BUS) +\ --------------------------\ +BIC.B #SM_BUS,&I2CSM_REN \ remove internal pullup resistors to avoid pulling down resistors with next instruction: +BIC.B #SM_BUS,&I2CSM_OUT \ preset SDA + SCL output LOW +\ --------------------------\ +GOTO BW3 \ goto I2C_Master START RX loop, with no other return than ALT+B|SW2+RST +\ --------------------------\ +ENDASM \ +\ --------------------------\ +\ +\ +\ ======================================================== +\ Driver UART to I2CM to do an USB to I2C_FastForth bridge +\ ======================================================== -\ ================================================================================ -\ Driver UART to I2CM : any FastForth launchpad becomes an USB to I2C_Slave bridge -\ ================================================================================ -\ type on TERMINAL "$10 UARTI2CS" to link TERMINAL with FastForth I2C_Slave at address hex $10 +\ I2C address mini = 10h, maxi = 0EEh (I2C-bus specification and user manual V6) +\ type on TERMINAL "16 UARTI2CS" to link teraterm TERMINAL with FastForth I2C_Slave at address $10 +\ you can also link with last known I2C_Slave address : "I2CS_ADR @ UARTI2CS" \ -: UARTI2CS \ SlaveAddress -- -CR \ to compensate the lack of one INTERPRET -HI2LO -MOV @RSP+,IP -MOV TOS,&I2CS_ADR \ save in FRAM -MOV @PSP+,TOS -MOV #WARM,X -MOV #I2C_WARM,2(X) \ replace WARM by I2C_WARM, so POR falls down to I2C_WARM -MOV X,PC \ execute I2C_WARM -ENDCODE +CODE UARTI2CS \ I2C_Slave_Address_%0 -- +CMP #RET_ADR,&{UARTI2CS}+8 \ +0= IF \ save parameters only if MARKER_DOES is not initialized + MOV #STOP_U2I,&{UARTI2CS}+8 \ MARKER_DOES of {UARTI2CS} will do CALL &{UARTI2CS}+8 = CALL #STOP_U2I + MOV &WARM+2,&{UARTI2CS}+10 \ save previous INI_APP from WARM PFA to {UARTI2CS}+10 + MOV #INI_U2I,&WARM+2 \ and replace it by new INI_APP + MOV &TERM_VEC,&{UARTI2CS}+12 \ save previous TERM_VEC value to {UARTI2CS}+12, see target.pat + MOV #U2I_TERM_INT,&TERM_VEC \ and replace it by U2I_TERM_INT + \ MOV &TA0_X_VEC,&{UARTI2CS}+14 \ save previous TA0_x_VEC value to {UARTI2CS}+14 + \ MOV #HALF_S_INT,&TA0_X_VEC \ and replace it by HALF_S_INT + MOV &TB0_X_VEC,&{UARTI2CS}+14 \ save previous TB0_x_VEC value to {UARTI2CS}+14 + MOV #HALF_S_INT,&TB0_X_VEC \ and replace it by HALF_S_INT +THEN +COLON +CR I2CS_ADR ! \ -- save I2C_Slave_Address_%0 +WARM \ execute INI_U2I then goto BW3; abort with Alt-B or SW2+RST. +; RST_HERE ECHO - -#16 UARTI2CS ; Alt-B (TERATERM) or S2+RESET (I2C_Master) to quit - -; Since there is no difference in behaviour whether the TERMINAL is connected to the Master -; or bridged to any Slave, WARM is the convenient way to check which target is connected to, -; because, as any ABORT message, WARM displays first the decimal I2C address if applicable: -WARM +18 UARTI2CS ; TERATERM(Alt-B) or I2C_Master(SW2+RST) to quit diff --git a/MSP430-FORTH/UTILITY.f b/MSP430-FORTH/UTILITY.f index 463d81e..3395b65 100644 --- a/MSP430-FORTH/UTILITY.f +++ b/MSP430-FORTH/UTILITY.f @@ -1,15 +1,12 @@ \ -*- coding: utf-8 -*- -; ------------------------------------------------------------------------------ -; UTILITY.f -; ------------------------------------------------------------------------------ \ \ to see kernel options, download FastForthSpecs.f \ FastForth kernel options: MSP430ASSEMBLER, CONDCOMP \ \ TARGET SELECTION ( = the name of \INC\target.pat file without the extension) \ MSP_EXP430FR5739 MSP_EXP430FR5969 MSP_EXP430FR5994 MSP_EXP430FR6989 -\ MSP_EXP430FR4133 MSP_EXP430FR2433 MSP_EXP430FR2355 CHIPSTICK_FR2433 +\ MSP_EXP430FR4133 MSP_EXP430FR2433 CHIPSTICK_FR2433 MSP_EXP430FR2355 \ LP_MSP430FR2476 \ \ from scite editor : copy your target selection in (shift+F8) parameter 1: @@ -41,8 +38,25 @@ \ ASSEMBLER conditionnal usage with IF UNTIL WHILE S< S>= U< U>= 0= 0<> 0>= \ ASSEMBLER conditionnal usage with ?JMP ?GOTO S< S>= U< U>= 0= 0<> 0< +; ------------------------------------------------------------------------------ +; UTILITY.f +; ------------------------------------------------------------------------------ + +\ first, we test for downloading driver only if UART TERMINAL target +CODE ABORT_UTILITY +SUB #2,PSP +MOV TOS,0(PSP) +MOV &VERSION,TOS +SUB #307,TOS \ FastForth V3.7 +COLON +'CR' EMIT \ return to column 1 without 'LF' +ABORT" FastForth version = 3.7 please!" +PWR_STATE \ remove ABORT_UTILITY definition before resuming +; + +ABORT_UTILITY -PWR_HERE +PWR_STATE [DEFINED] {TOOLS} [IF] {TOOLS} [THEN] @@ -113,7 +127,7 @@ ENDCODE IMMEDIATE \ https://forth-standard.org/standard/core/BEGIN \ BEGIN -- BEGINadr initialize backward branch CODE BEGIN - MOV #HEREADR,PC + MOV #HEREXEC,PC ENDCODE IMMEDIATE \ https://forth-standard.org/standard/core/UNTIL @@ -264,25 +278,6 @@ MOV @IP+,PC \ 4 ENDCODE [THEN] -[UNDEFINED] @ [IF] -\ https://forth-standard.org/standard/core/Fetch -\ @ c-addr -- char fetch char from memory -CODE @ -MOV @TOS,TOS -MOV @IP+,PC -ENDCODE -[THEN] - -[UNDEFINED] ! [IF] -\ https://forth-standard.org/standard/core/Store -\ ! x a-addr -- store cell in memory -CODE ! -MOV @PSP+,0(TOS) \ 4 -MOV @PSP+,TOS \ 2 -MOV @IP+,PC \ 4 -ENDCODE -[THEN] - [UNDEFINED] SPACE [IF] \ https://forth-standard.org/standard/core/SPACE \ SPACE -- output a space @@ -500,11 +495,11 @@ ENDCODE : WORDS \ -- CR CONTEXT @ PAD_ORG \ -- VOC_BODY PAD_ORG MOVE all threads of VOC_BODY in PAD_ORG -INI_THREAD @ DUP + \ -- VOC_BODY PAD_ORG THREAD*2 +THREADS @ DUP + \ -- VOC_BODY PAD_ORG THREAD*2 MOVE \ -- vocabumary entries are copied in PAD_ORG BEGIN \ -- 0 DUP \ -- ptr=0 MAX=0 - INI_THREAD @ DUP + 0 \ -- ptr=0 MAX=0 THREADS*2 0 + THREADS @ DUP + 0 \ -- ptr=0 MAX=0 THREADS*2 0 DO \ -- ptr MAX I = PAD_ptr = thread*2 DUP I PAD_ORG + @ \ -- ptr MAX MAX NFAx U< IF \ -- ptr MAX if MAX U< NFAx diff --git a/MSP430-FORTH/lib/DEFER.f b/MSP430-FORTH/lib/DEFER.f new file mode 100644 index 0000000..cbafde3 --- /dev/null +++ b/MSP430-FORTH/lib/DEFER.f @@ -0,0 +1,141 @@ +\ -*- coding: utf-8 -*- + +; -------------------- +; DEFER.f +; -------------------- +\ +\ TARGET SELECTION +\ LP_MSP430FR2476 +\ MSP_EXP430FR5739 MSP_EXP430FR5969 MSP_EXP430FR5994 MSP_EXP430FR6989 +\ MSP_EXP430FR4133 MSP_EXP430FR2433 CHIPSTICK_FR2433 MSP_EXP430FR2355 +\\ +\ from scite editor : copy your target selection in (shift+F8) parameter 1: +\ +\ OR +\ +\ drag and drop this file onto SendSourceFileToTarget.bat +\ then select your TARGET when asked. +\ +\ FastForth kernel compilation minimal options: +\ TERMINAL3WIRES, TERMINAL4WIRES +\ MSP430ASSEMBLER, CONDCOMP +\ +\ to see kernel options, download FastForthSpecs.f +\ +\ 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, rEXIT,rDOVAR,rDOCON, rDODOES, R3, SR,RSP, PC +\ PUSHM order : R15,R14,R13,R12,R11,R10, R9, R8, R7 , R6 , R5 , R4 , R3, R2, R1, R0 +\ +\ example : PUSHM #6,IP pushes IP,S,T,W,X,Y registers to return stack +\ +\ POPM order : PC,RSP, SR, R3, rDODOES,rDOCON,rDOVAR,rEXIT, Y, X, W, T, S, IP,TOS,PSP +\ POPM order : R0, R1, R2, R3, R4 , R5 , R6 , R7 , R8, R9,R10,R11,R12,R13,R14,R15 +\ +\ example : POPM #6,IP pop Y,X,W,T,S,IP registers from return stack +\ +\ +\ FORTH conditionnals: unary{ 0= 0< 0> }, binary{ = < > U< } +\ +\ ASSEMBLER conditionnal usage with IF UNTIL WHILE S< S>= U< U>= 0= 0<> 0>= +\ ASSEMBLER conditionnal usage with ?JMP ?GOTO S< S>= U< U>= 0= 0<> 0< +\ + +PWR_STATE + +[UNDEFINED] @ [IF] +\ https://forth-standard.org/standard/core/Fetch +\ @ c-addr -- char fetch char from memory +CODE @ +MOV @TOS,TOS +MOV @IP+,PC +ENDCODE +[THEN] + +[UNDEFINED] IF [IF] \ define IF and THEN +\ https://forth-standard.org/standard/core/IF +\ IF -- IFadr initialize conditional forward branch +CODE IF \ immediate +SUB #2,PSP \ +MOV TOS,0(PSP) \ +MOV &DP,TOS \ -- HERE +ADD #4,&DP \ compile one word, reserve one word +MOV #QFBRAN,0(TOS) \ -- HERE compile QFBRAN +ADD #2,TOS \ -- HERE+2=IFadr +MOV @IP+,PC +ENDCODE IMMEDIATE + +\ https://forth-standard.org/standard/core/THEN +\ THEN IFadr -- resolve forward branch +CODE THEN \ immediate +MOV &DP,0(TOS) \ -- IFadr +MOV @PSP+,TOS \ -- +MOV @IP+,PC +ENDCODE IMMEDIATE +[THEN] + +[UNDEFINED] ELSE [IF] +\ https://forth-standard.org/standard/core/ELSE +\ ELSE IFadr -- ELSEadr resolve forward IF branch, leave ELSEadr on stack +CODE ELSE \ immediate +ADD #4,&DP \ make room to compile two words +MOV &DP,W \ W=HERE+4 +MOV #BRAN,-4(W) +MOV W,0(TOS) \ HERE+4 ==> [IFadr] +SUB #2,W \ HERE+2 +MOV W,TOS \ -- ELSEadr +MOV @IP+,PC +ENDCODE IMMEDIATE +[THEN] + +[UNDEFINED] DEFER [IF] +\ https://forth-standard.org/standard/core/DEFER +\ DEFER "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. +: DEFER +CREATE +HI2LO +MOV #$4030,-4(W) \ CFA = MOV @PC+,PC = BR MOV @IP+,PC +MOV #BR@IP+_ADR,-2(W) \ PFA = address of MOV @IP+,PC to do nothing. +MOV @RSP+,IP +MOV @IP+,PC +ENDCODE +[THEN] + +[UNDEFINED] DEFER! [IF] +\ https://forth-standard.org/standard/core/DEFERStore +\ Set the word xt1 to execute xt2. An ambiguous condition exists if xt1 is not for a word defined by DEFER. +CODE DEFER! \ xt2 xt1 -- +MOV @PSP+,2(TOS) \ -- xt1=CFA_DEFER xt2 --> [CFA_DEFER+2] +MOV @PSP+,TOS \ -- +MOV @IP+,PC +ENDCODE +[THEN] + +[UNDEFINED] IS [IF] +\ https://forth-standard.org/standard/core/IS +\ IS 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 examples of DEFERred words +\ +\ as IS replaces the PFA value of any word, it's a TO alias for VARIABLE and CONSTANT words... +: IS +STATEADR @ +IF POSTPONE ['] POSTPONE DEFER! +ELSE ' DEFER! +THEN +; IMMEDIATE +[THEN] + +PWR_HERE diff --git a/MSP430-FORTH/lib/FACILITY.f b/MSP430-FORTH/lib/FACILITY.f new file mode 100644 index 0000000..eb353a2 --- /dev/null +++ b/MSP430-FORTH/lib/FACILITY.f @@ -0,0 +1,70 @@ + +; ------------------------------------------------------------------------------ +; FACILITY.f +; ------------------------------------------------------------------------------ +\ +\ TARGET SELECTION ( = the name of \INC\target.pat file without the extension) +\ MSP_EXP430FR5739 MSP_EXP430FR5969 MSP_EXP430FR5994 MSP_EXP430FR6989 +\ MSP_EXP430FR4133 +\ MSP_EXP430FR2433 CHIPSTICK_FR2433 MSP_EXP430FR2355 +\ LP_MSP430FR2476 +\ +\ from scite editor : copy your target selection in (shift+F8) parameter 1: +\ +\ OR +\ +\ drag and drop this file onto SendSourceFileToTarget.bat +\ then select your TARGET when asked. +\ +\ +\ FastForth kernel minimal options: +\ TERMINAL3WIRES, TERMINAL4WIRES +\ MSP430ASSEMBLER, CONDCOMP, DEFERRED +\ + +PWR_STATE + +[UNDEFINED] MS [IF] +\ https://forth-standard.org/standard/facility/MS +\ ( u -- ) Wait at least u milliseconds. +\ exact time if the clock speed expressed in kHz - 12 is divisible by 4. +CODE MS \ if u=0, wait 65536 ms +BEGIN \ j_loop + MOV &FREQ_KHZ,X \ 3~ FREQ_KHZ = cycles/ms + SUB #12,X \ 2~ FREQ_KHZ-12, because 12 cycles by j_loop (out of i_loop) + RRUM #2,X \ 2~ i_count = (FREQ_KHZ-12)/4, because 4 cycles by i_loop + NOP2 \ 2~ + BEGIN \ i_loop + NOP \ 1~ + SUB #1,X \ 1~ decrement i_count + 0= UNTIL \ 2~ i_loop time = FREQ_KHZ - 12~ --> 1ms - 12~ + SUB #1,TOS \ 1~ decrement j_count +0= UNTIL \ 2~ j_loop time = (1ms - 12~) + 12~ = 1.0000000 ms +MOV @PSP+,TOS \ 2~ +MOV @IP+,PC \ 4~ SR(Z)=1 +ENDCODE \ +[THEN] + +[UNDEFINED] KEY? [IF] +\ https://forth-standard.org/standard/facility/KEYq +\ If a character is available, return true. Otherwise, return false. +\ If non-character keyboard events are available before the first valid character, +\ they are discarded and are subsequently unavailable. +\ The character shall be returned by the next execution of KEY. +\ After KEY? returns with a value of true, subsequent executions of KEY? prior to +\ the execution of KEY or EKEY also return true, without discarding keyboard events. + +DEFER KEY? \ DEFERred word, as KEY is. +CODENNM \ -- flag + SUB #2,PSP + MOV TOS,0(PSP) + MOV #0,TOS + BIT #RX_TERM,&TERM_IFG + 0<> IF + MOV #-1,TOS + THEN + MOV @IP+,PC +ENDCODE IS KEY? \ this code becomes default action of DEFERred word KEY? +[THEN] + +PWR_HERE diff --git a/MSP430-FORTH/lib/I2CF_Soft_Master.f b/MSP430-FORTH/lib/I2CF_Soft_Master.f index 912c521..55eec46 100644 --- a/MSP430-FORTH/lib/I2CF_Soft_Master.f +++ b/MSP430-FORTH/lib/I2CF_Soft_Master.f @@ -3,22 +3,6 @@ WIPE \ NOECHO -\ Copyright (C) <2015> -\ -\ 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 . - - \ version 2.0 2015-07-30 \ \ @@ -72,8 +56,6 @@ BEGIN \ 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 \ diff --git a/MSP430-FORTH/lib/I2CF_Soft_MultiMaster.f b/MSP430-FORTH/lib/I2CF_Soft_MultiMaster.f index 0e9d4ca..5c4fe5a 100644 --- a/MSP430-FORTH/lib/I2CF_Soft_MultiMaster.f +++ b/MSP430-FORTH/lib/I2CF_Soft_MultiMaster.f @@ -1,21 +1,5 @@ \ name : msp430FR5xxx_I2CF_Soft_MultiMaster.asm -\ Copyright (C) <2015> -\ -\ 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 . - - \ 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 diff --git a/MSP430-FORTH/lib/I2C_Master.f b/MSP430-FORTH/lib/I2C_Master.f index 48590ae..1074996 100644 --- a/MSP430-FORTH/lib/I2C_Master.f +++ b/MSP430-FORTH/lib/I2C_Master.f @@ -1,21 +1,5 @@ \ name : msp430FR5xxx_I2C_Master.asm \ -\ Copyright (C) <2016> -\ -\ 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 . -\ -\ \ I2C MASTER Standard Mode software driver without interrupt \ Target: MSP-EXP430FR5969 @ 8,16MHz \ version 1.1 2016-03-18 @@ -96,82 +80,153 @@ VARIABLE I2CM_BUF \ low(I2CM_BUF) = RX or TX lentgh, high(I2CM_BUF) = TX buffe -\ ----------------------------------\ -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 - \ +\ \ ----------------------------------\ +\ 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 +\ \ + +\ ------------------------------\ +ASM I2C_M \ +\ ------------------------------\ +\ \ in I2CS_ADR(S) = -4(S) = I2C address +\ \ I2CS_CNT(S) = -2(S) = count of data to be exchanged +\ \ 0(S) = data1 +\ \ 1(S) = data2... +\ \ used S = BUF ptr, W +\ \ out I2CS_EXG(S) = -1(S) = count of bytes exchanged +\ +BIS #1,&UCB0CTLW0 \ SWRST +MOV #$0FD3,&UCB0CTLW0 \ master mode + UCTR + START + SWRST, IFG=IE=0 +MOV #$00C8,&UCB0CTLW1 \ set automatic stop (count byte reached) +FREQ_KHZ @ 16000 = \ 16 MHz or 8 MHz ? +[IF] \ if 16 MHz + MOV #$40,&UCB0BRW \ baudrate = SMCLK/40 = 400 kHz @16MHz ; 340 kHz measured +[ELSE] \ if 8 MHz + MOV #$20,&UCB0BRW \ baudrate = SMCLK/20 = 400 kHz @8MHz ; 340 kHz measured +[THEN] \ +MOV.B I2C_CNT(S),W \ W = count of data +CMP.B #0,W \ +0= IF \ if count = 0 + BIS #4,&UCB0CTLW0 \ add Stop cmd ==> Master send only I2C address then STOP (doesn't work with MASTER RX!) +THEN \ +MOV.B W,&UCB0TBCNT \ set threshold byte count to generate automatic STOP +MOV.B I2C_ADR(S),W \ 3 W = slave_address & R/w bit +RRA.B W \ 1 C flag = R/w bit +U>= IF \ if read + BIC #$10,&UCB0CTLW0 \ UCB0CTLW0 <-- UCTR=0 +THEN \ +MOV W,&UCB0I2CSA \ 3 UCB0I2CSA = slave_address +MOV.B #0,W \ clear buffer pointer +\ ------------------------------\ +BIC #1,&UCB0CTLW0 \ UCB0CTLW0 : clear SWRST ==> start I2C MASTER +\ ------------------------------\ +BW2 \ +BIT #$20,&UCB0IFG \ test Nack flag UCNACKIFG (on address | on TX data) from slave +0<> IF \ + BIS #4,&UCB0CTLW0 \ generate STOP + CMP.B #0,W \ Nack on TX data ? + 0<> IF \ yes + SUB.B #1,W \ remove this TX data from count + THEN \ + GOTO BW2 \ +THEN \ +BIT #8,&UCB0IFG \ test stop flag UCSTPIFG +0<> IF \ + MOV.B W,I2C_EXG(S) \ store count of bytes + BIS #1,&UCB0CTLW0 \ SWRST + RET \ ===================> end of I2C_M driver +THEN \ +BIT #2,&UCB0IFG \ test TX flag UCTXIFG0 +0<> IF \ +\ ----------------------------\ +\ MASTER TX \ +\ ----------------------------\ + MOV.B I2C_BUF(W),&UCB0TXBUF \ load byte into UCB0TXBUF + ADD.B #1,W \ + GOTO BW2 \ +THEN \ +BIT #1,&UCB0IFG \ test RX flag UCRXIFG0 +0<> IF \ +\ ----------------------------\ +\ MASTER RX \ +\ ----------------------------\ + MOV.B &UCB0RXBUF,I2C_BUF(W) \ load byte from UCB0RXBUF + ADD.B #1,W \ +THEN +GOTO BW2 \ +ENDASM \ 64 words \ ------------------------------\ CODE START \ init diff --git a/MSP430-FORTH/lib/I2C_MultiMaster.f b/MSP430-FORTH/lib/I2C_MultiMaster.f index 08d1713..ee7646c 100644 --- a/MSP430-FORTH/lib/I2C_MultiMaster.f +++ b/MSP430-FORTH/lib/I2C_MultiMaster.f @@ -1,21 +1,5 @@ \ name : msp430FR5xxx_I2C_MMultiMaster.f \ -\ Copyright (C) <2016> -\ -\ 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 . -\ -\ \ I2C MASTER Standard Mode software driver without interrupt \ Target: MSP-EXP430FR5969 @ 8,16MHz \ version 1.1 2016-03-18 diff --git a/MSP430-FORTH/lib/I2C_Slave.f b/MSP430-FORTH/lib/I2C_Slave.f index e22df99..38d6af5 100644 --- a/MSP430-FORTH/lib/I2C_Slave.f +++ b/MSP430-FORTH/lib/I2C_Slave.f @@ -2,21 +2,6 @@ RST_STATE \ NOECHO -\ Copyright (C) <2015> -\ -\ 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 . -\ \ driver I2C SLAVE with START interrupt only, for any I2C_Slave addresses \ Target: MSP430FR5xxx @ 8,16,24 MHz \ version 1.0 2015-03-17 diff --git a/MSP430-FORTH/lib/I2C_Slave_to_LCD_2x20.f b/MSP430-FORTH/lib/I2C_Slave_to_LCD_2x20.f index d5161fd..1a315c1 100644 --- a/MSP430-FORTH/lib/I2C_Slave_to_LCD_2x20.f +++ b/MSP430-FORTH/lib/I2C_Slave_to_LCD_2x20.f @@ -1,21 +1,5 @@ \ name : I2C_Slave_to_LCD_2x20.f -\ Copyright (C) <2015> -\ -\ 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 . -\ - \ --------------------------------------\ \ example of App running under interrupt \ --------------------------------------\ diff --git a/MSP430-FORTH/lib/I2C_Soft_Master.f b/MSP430-FORTH/lib/I2C_Soft_Master.f index 9bdb3ce..7a888b9 100644 --- a/MSP430-FORTH/lib/I2C_Soft_Master.f +++ b/MSP430-FORTH/lib/I2C_Soft_Master.f @@ -2,22 +2,6 @@ WIPE -\ Copyright (C) <2015> -\ -\ 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 . - - \ version 2.0 2015-07-30 \ ---------------------------------------------------------------------------------------------------------------------\ \ SCL clock generation, timing, and test of data(s) number are made by I2C_Master. diff --git a/MSP430-FORTH/lib/I2C_Soft_MultiMaster.f b/MSP430-FORTH/lib/I2C_Soft_MultiMaster.f index 26ec111..a360b43 100644 --- a/MSP430-FORTH/lib/I2C_Soft_MultiMaster.f +++ b/MSP430-FORTH/lib/I2C_Soft_MultiMaster.f @@ -1,21 +1,5 @@ \ name : msp430FR5xxx_I2C_Soft_MultiMaster.f -\ Copyright (C) <2015> -\ -\ 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 . - - \ 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 diff --git a/MSP430-FORTH/lib/IR_RC5.f b/MSP430-FORTH/lib/IR_RC5.f index 3f8627e..b7ecf37 100644 --- a/MSP430-FORTH/lib/IR_RC5.f +++ b/MSP430-FORTH/lib/IR_RC5.f @@ -3,22 +3,6 @@ \ --------------- RST_STATE \ to rub out this test with or RST_STATE or COLD -\ Copyright (C) <2014> -\ -\ 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 . - - \ FORTH driver for IR remote compatible with the PHILIPS RC5 protocol, with select new/repeated command \ target : see IR_RC5.pat diff --git a/MSP430-FORTH/lib/IR_RC5_to_I2CF_Soft_Master.f b/MSP430-FORTH/lib/IR_RC5_to_I2CF_Soft_Master.f index 2327db2..861acae 100644 --- a/MSP430-FORTH/lib/IR_RC5_to_I2CF_Soft_Master.f +++ b/MSP430-FORTH/lib/IR_RC5_to_I2CF_Soft_Master.f @@ -1,21 +1,5 @@ \ IR_RC5_to_I2CF_Soft_Master.f -\ Copyright (C) <2016> -\ -\ 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 . - - \ --------------------------------------\ \ example of App running under interrupt \ --------------------------------------\ diff --git a/MSP430-FORTH/lib/LCD_2x20.f b/MSP430-FORTH/lib/LCD_2x20.f index 7f4a459..77724ca 100644 --- a/MSP430-FORTH/lib/LCD_2x20.f +++ b/MSP430-FORTH/lib/LCD_2x20.f @@ -3,22 +3,6 @@ \ ------------------------------ RST_STATE \ NOECHO -\ Copyright (C) <2014> -\ -\ 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 . - - \ driver for LCD 2x20 characters display with 4 bits data interface \ without usage of an auxiliary 5V to feed the Vo of LCD diff --git a/MSP430-FORTH/lib/STRING.f b/MSP430-FORTH/lib/STRING.f new file mode 100644 index 0000000..41c3da0 --- /dev/null +++ b/MSP430-FORTH/lib/STRING.f @@ -0,0 +1,123 @@ +\ -*- coding: utf-8 -*- +; ----------------------------------------------------- +; STRING.f +; ----------------------------------------------------- + +\ FastForth kernel options: MSP430ASSEMBLER, CONDCOMP +\ to see FastForth kernel options, download FF_SPECS.f +\ +\ TARGET SELECTION ( = the name of \INC\target.pat file without the extension) +\ MSP_EXP430FR5739 MSP_EXP430FR5969 MSP_EXP430FR5994 MSP_EXP430FR6989 +\ MSP_EXP430FR4133 MSP_EXP430FR2433 CHIPSTICK_FR2433 MSP_EXP430FR2355 +\ LP_MSP430FR2476 +\ +\ from scite editor : copy your target selection in (shift+F8) parameter 1: +\ +\ OR +\ +\ drag and drop this file onto SendSourceFileToTarget.bat +\ then select your TARGET when asked. +\ +\ +\ FastForth kernel minimal options: +\ TERMINAL3WIRES, TERMINAL4WIRES +\ MSP430ASSEMBLER, CONDCOMP +\ +\ +\ +\ Fast Forth For Texas Instrument MSP430FRxxxx FRAM devices +\ Copyright (C) <2015> +\ +\ 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 . +\ +\ REGISTERS USAGE +\ 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 +\ +\ FORTH conditionnals: unary{ 0= 0< 0> }, binary{ = < > U< } +\ +\ ASSEMBLER conditionnal usage with IF UNTIL WHILE S< S>= U< U>= 0= 0<> 0>= +\ +\ ASSEMBLER conditionnal usage with ?GOTO S< S>= U< U>= 0= 0<> 0< +\ + +\ https://forth-standard.org/standard/string/COMPARE +\ COMPARE ( c-addr1 u1 c-addr2 u2 -- n ) +\ 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 S = u2 + MOV @PSP+,Y \ 2 Y = addr2 + MOV @PSP+,T \ 2 T = u1 + MOV @PSP+,X \ 2 X = addr1 +BEGIN MOV T,TOS \ 1 TOS = u1 + ADD S,TOS \ 1 TOS = u1+u2 + 0= ?GOTO FW3 \ 2 COMPEQUAL exit if u1=u2=0 and Z=1 + SUB #1,T \ 1 u1-1 + 0< ?GOTO FW2 \ 2 if u1<0 (if u1u2) + ADD #1,X \ 1 + CMP.B @Y+,-1(X) \ 4 char1-char2 +0<> UNTIL \ 2 loop back if char1=char2 17~ loop +0>= IF +FW1 MOV #1,TOS \ COMPGREATER: u1>u2 | char1>char2 and Z=0 + MOV @IP+,PC +THEN +FW2 MOV #-1,TOS \ COMPLESS: u1 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 +\ +\ [THEN] \ COMPARE + diff --git a/README.md b/README.md index 6bae10a..6a0f0c2 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,37 @@ -#FastForth for MSP430FRxxxx TI's devices +#FastForth for MSP430FRxxxx TI's devices, light, fast, efficient, reliable. -Small, smart, fast, efficient, versatile, reliable. +Tested on TI MSP-EXP430FR(5739,5969,5994,6989,4133,2355,2433) launchpads, at 1, 2, 4, 8, 12, 16 MHz plus 20MHz & 24MHz with MSP430FR(23xx,57xx) devices. -Tested on TI MSP-EXP430FR5739,5969,5994,6989,4133,2355,2433,2476 launchpads, at 0.5, 1, 2, 4, 8, 12, 16 MHz plus 20MHz and 24MHz with FR23xx,FR57xx devices. +It's an "interpret and compile" operating system for MSP430 devices with FRAM, very interesting because of its 5kB size. -It's an "interpret and compile" operating system for MSP430, very interesting because of its 5kB size. -That includes the kernel FORTH with double numbers and Q15.16 numbers interpreting, -an amazing assembler "label free" with conditional compilation, a 16-input search engine that speeds up the interpreter by 4, -and the choice between a connection with a serial terminal up to 6MBds, software (XON/XOFF) + hardware (RTS) control flow, -or with an I2C_Slave terminal up to 1MHz. +That includes: -FastForth is a true ANS FORTH for afficionados but also it is used as superstructure for the embedded assembler. -So, if your goal is to program a MSP430FRxxxx in assembler or just to learn assembler, enjoy yourself: try it! -To discover how it works, compare the content of \ADDON\files.asm with their FORTH equivalent in \MSP430-FORTH\files.f +* the kernel FORTH with interpreting double numbers and Q15.16 numbers, -However, if the IDE works well with Windows 10, it works less well with Linux due to the lack of a good alternative to TERATERM... +* an assembler with TI's syntax, "label free", with conditional compilation, + +* a 16-input search engine that speeds up the interpreter by 4, + +* an UART TERMINAL up to 6MBds, with software (XON/XOFF) + hardware (RTS) control flow, + +* or an I2C TERMINAL up to 1MHz (overruns 2.5 times the TI specifications), see \MSP430-FORTH\UARTI2CS.f. + +After downloading \MSP430-FORTH\ANS_COMP.f, FastForth becomes a true ANS FORTH for afficionados. +Personally I use it mainly as super OS for real time programs. + +If your goal is to learn or to teach programming with assembler, don't miss it, try it! For only 3 kbytes in addition, you have the primitives to access the SD\_CARD FAT16 and FAT32: read, write, del, download source files and to copy them from PC to the SD_Card. It works with all SD\_CARD memories from 64MB to 64GB. The cycle of read/write a byte is below 1 us @ 16 MHz. -This enables to make a fast data logger with a small footprint as a MSP430FR5738 QFN24. -With all the kernel addons, including extended\_ASM and SD\_Card driver, FastForth size is under 10 kB. + +With all the kernel addons, including extended\_ASM and SD\_Card driver, FastForth size is 10 kB. + +However, if all works well with Windows 10, it works less well with Linux due to the lack of a good alternative to TERATERM... + +Note: for every update, download all subdirectories to correctly update the project, without missing configurations files. ##how to connect TERMINAL - The files launchpad_xMHz.txt are the executables ready to use with a serial terminal + The files \binaries\launchpad_xMHz.txt are the executables ready to use with a serial terminal (TERATERM.exe), 115200Bds, with XON/XOFF or RTS_hardware flow controls and a PL2303TA/CP2102 cable. ------------------------------------------------------------------------------------------ WARNING! doesn't use them to supply your launchpad: red wire is 5V ==> MSP430FRxxxx destroyed! @@ -32,7 +41,6 @@ With all the kernel addons, including extended\_ASM and SD\_Card driver, FastFor programming with MSP430Flasher.exe and FET interface TI Launchpad <--> CP2102/PL2302TA cable <------> USB <-------------> TERATERM.exe - Vcc <--- 3V3 ) RX <--- TX ) GND <--> GND > used by FastForth TERMINAL TX ---> RX ) @@ -50,7 +58,7 @@ programming with BSL_Scripter.exe RX <--- TX ) | GND <--> GND > used by FastForth TERMINAL +<--> BSL_Scripter.exe TX ---> RX ) - Vcc <--- 3V3 ) ) + Vcc <--- 3V3 ) TST/SBWTCK <--- RTS ) GND <--> GND > used by BSL_Scripter RST/SBWTDIO <--> DTR ) @@ -60,23 +68,24 @@ programming with BSL_Scripter.exe - - Another interest of XON/XOFF flow control is to allow 3.75kV galvanic isolation of terminal input - with SOIC8 Si8622EC|ISO7421E. - Once FastForth is loaded in the target FRAM memory, you add assembly code or FORTH code, or both, - by downloading your source files that FastForth and its assembler interpret and compile. + by downloading your source files which embedded FastForth and its assembler interpret and compile. Beforehand, the preprocessor GEMA, by means of a \config\gema\target.pat file, will have translated - your generic source file.f in a targeted source file.4th, allowing you to use - symbolic addresses for all peripheral registers, without having to declare them via FORTH words. + your generic MSP430FR source file.f in a targeted MSP430FRxxxx source file.4th, allowing you to use + symbolic addressing for all peripheral registers, without having to do declarations via FORTH words. A set of .bat files in \MSP430-FORTH folder is furnished to do all this automatically. - If you want to change the terminal baudrate on the fly (230400 Bds up to 6 MBds), - download to your launchpad the file \MSP430-FORTH\CHNGBAUD.f. - - To see all compilation options, download \MSP430-FORTH\FF_SPECS.f. + To see all specifications of FastForth, download \MSP430-FORTH\FF_SPECS.f. - If you choose for your target FastForth with I2C terminal, you will need a second launchpad to make the USBtoI2C bridge. + To change the terminal baudrate on the fly, 9600 Bauds up to 6 MBds, + download the file \MSP430-FORTH\CHNGBAUD.f. + Beyond 1 MBds, shorten the PL2303HXD cable, down to 20 cm for 6MBds. + + XON/XOFF flow control allows 3.75kV galvanic isolation of terminal input with SOIC8 Si8622EC|ISO7021. + With powered SOIC16W ISOW7821, you have 5kV rms isolation for both XON/XOFF TERMINAL and a 3V3 75mA supply. + + If you choose I2C_FastForth for your target, you will need of one more to make the USBtoI2C bridge. After downloading of complementary words in \MSP430-FORTH\ANS_COMP.f, FastForth executes CORETEST.4th in less than a second, and without errors which ensures its compatibility with the FORTH CORE ANS94 standard. @@ -90,9 +99,79 @@ programming with BSL_Scripter.exe What is new ? ------------- +V307 + + 54 bytes added to (Kernel + Conditional_Compilation + Assembler). + + Source file copy from I2C_TERMINAL to the SD_Card of any I2C_target works now. + + The bootstrap call is modified: ' BOOT IS WARM to start it, + ' BOOT 2 + @ IS WARM to stop it. + + In addition of target's ID test made by Teraterm macro, a preamble has been added to all + \MSP430-FORTH\source.f files to prohibit their downloading with another version of FastForth. + + Words @ ! ALLOT come back from "ANS_COMP" add-on to core. + + Recognized prefixes are $ # % and ' respectively for hex decimal binary and ASCII 'char' numbers. + Examples: 'U' - $55 = 0, '3' - #33 = 0, '@' - %0100_0000 = 0. + When use in source.f files, all ASCII special chars are available. See \inc\FastForthREGtoTI.pat. + + Assembler allows "argument+offset" into FORTH area (0 to $FFFF). + Examples: MOV #RXON,&SLEEP+2 to store RXON addr at SLEEP+2 addr. + MOV.B BUFFER+-1(X),TOS to load the byte at BUFFER-1(X) addr in the register TOS. + + COLD does same than hardware RST. + WIPE does same than hardware SW1+RST (DEEP_RESET). + + + More complicated: + + In the FastForth init process, COLD WARM SLEEP are modified and INI_FORTH is added. + They start each with an immediate call to a paired assembly subroutine: + + RST_SYS failures ->+ +<- ABORT_TERM <- ABORT" <-(error)<-+-<-COMPILE/EXECUTE<-INTERPRET<-+ + | | | ^ + | v v | + SW1+RST->+<-RST | +--> INI_FORTH -> ABORT" ->+->QUIT>-+->ACCEPT->+ +->ACCEPT->+ + | | --------- ^ | ^ + v v | v | + words: WIPE -->+->COLD-->+-> RESET -> INI_FORTH --> WARM -->+ +->SLEEP->+ + ---- --------- ---- ----- + + subroutine: COLD_APP INI_SOFT_APP INI_HARD_APP BACKGND_APP + default CALL# COLD_TERM RET_ADR INIT_TERM RXON + Default action: wait TERMINAL idle do nothing init TERM UCAx enable TERMINAL TX + + unlock I/O's (send RXON + /RTS) + + + On the other hand, MARKER is modified in such a way that MARKER_DOES executes a CALL to + the content of BODY+4, by default RET_ADR: + + MARKER [CFA] = DODOES + [PFA] = MARKER_DOES + [BODY] = previous DP (Dictionnary Pointer) + [BODY+2] = previous VOCLINK (if word-set addon) + [BODY+4] = RET_ADR + + By replacing [BODY+4] with the address of a new defined subroutine (named for example: STOP_XXX), + MARKER_DOES will execute it to restore all critical pointers saved at BODY+6, BODY+8... + + Thus, with MARKER and the definition of subroutines COLD_XXX, INI_SOFT_XXX, INI_HARD_XXX, BACKGND_XXX + the programmer has full control of his "XXX" real time application using interrupts, + with everything he needs to start it, stop it, and also to properly remove it with + a 'soft' MARKER word, avoiding the use of a WIPE or a SW1+RST of the last chance. + + See examples in /MSP430-FORTH/UARTI2CS.f, /MSP430-FORTH/RTC.f. + + notes: RST and SW1+RST (deep RST) are hardware redirected to COLD via NMI and the USER_NMI vector. + INI_SOFT_SD is used as INI_SOFT_APP alias by the SD_CARD driver to reinit handles. + WIPE|SW1+RST initialises this four APP calls plus TERMINAL_INT Vector. + + V306 - +8 bytes. + 8 bytes added to (Kernel + Conditional_Compilation + Assembler). Fixed the crash caused by forgetting the prefix '&' in the last term of an assembly instruction. (the TI's symbolic mode is not implemented). @@ -102,9 +181,9 @@ V306 When downloading a source_file.f asked from the scite editor or by the use of SendSourceFileToTarget.bat, Teraterm macro first sends ?ID definition then the string: %deviceID% ?ID. - By executing ?ID, FastForth substracts this %deviceID% value from the target's one then + By executing ?ID, FastForth substracts %deviceID% value from the target's one then executes ABORT" DeviceID mismatch!" : the downloading is aborted if DeviceID mismatch. - %deviceID% is provided by the \config\select.bat file. + %deviceID% is provided by the file \config\select.bat. When downloading a source_file.4TH, it's up to you to be careful because Teraterm sends the string 0 ?ID, so that ?ID bypasses the substraction. @@ -153,36 +232,31 @@ V304 pin RESET is software replaced by pin NMI and so, RESET executes COLD, allowing code insert before BOR. however SYSRSTIV numbering remains unchanged: = 4 for RESET, = 6 for COLD. - Deep RESET reinitializes vectors interrupts and SIGNATURES area, instead of WIPE. + Deep RESET reinitializes vectors interrupts and SIGNATURES area, as WIPE. Fast Forth Deep RESET is done by switches S1 + RST. A newcomer: FastForth for I2C TERMINAL. With the driver UART2I2CS running on another FastForth target, - we have the USB to I2C_Slave bridge we need: - only one TERMINAL interacts with all FastForth targets connected to an I2C network. - - notebook USB to I2C_Master bridge any I2C_slave with I2C TERMINAL - +-----------+ +- - - - - - - - - - - - - - - - - - - - - - - - - --+ +-------------------------------+ - | | | master with UART TERMINAL | +-------------------------------+| - | | +-----------+ +----------------------------+ +-------------------------------+|| - | | | PL2303TA |2457600 Bds| MCLK = 16 MHz | | ||| - | TERATERM -o-> USB -o-> or -o--> UART --o--> FAST FORTH + UARTI2CS --o-> I2C -o--> FAST FORTH @ 16MHz with ||+ - | terminal | | CP2102 | XON/XOFF | | 660kHz | kernel option: TERMINAL_I2C |+ - | | +-----------+ +----------------------------+ +-------------------------------+ - | | | | - +-----------+ +- - - - - - - - - - - - - - - - - - - - - - - - - --+ - - With the indicated MCLK and UART speeds, Coretest.4th is downloaded (and executed) to any I2C_Slave in 1,3s. + we have the USB to I2C_Slave bridge we need: one TERMINAL for up to 112 I2C_FastForth targets. + + +---------------------------+ + notebook USB to I2C_Slave bridge +-I2C-| others I2C_slave target | + +-----------+ +-------------------------------------------------+ / +--------------------------+ | + | | ¦ PL2303HXD target running UARTI2CS @24MHz¦ +-I2C-| MSP430FR4133 @ 1 MHz | | + | | ¦------------+ +----------------------------¦ / +--------------------------+ |--+ + | | ¦ | 3wires| MSP430FR2355 @ 24MHz ¦/ | MSP430FR5738 @ 24 MHz | | + | TERATERM -o->USB-o->USB2UART->o->UART-o-> FAST FORTH -> UARTI2CS -o-I2C-o-> FAST FORTH with option |--+ + | terminal | ¦ | 6MBds | (I2C MASTER) ¦ | TERMINAL_I2C (I2C SLAVE)| + | | ¦------------+ +----------------------------¦ +--------------------------+ + | | ¦ |< 20cm>| ¦ up to 112 I2C_Slave targets + +-----------+ +-------------------------------------------------+ + + With the indicated MCLK and UART speeds, Coretest.4th is downloaded to (and executed by) I2C_Slave in 800ms. The driver UARTI2CS works without error from 1MHz up to 24MHz MCLK and from 115200Bds up to 6MBds UART. With I2C_Master running at 24 MHz, the I2C bus frequency is about 1MHz, and it works fine even if I2C_slave is running at 1 MHz. + Don't forget to add two 3k3 pullup resistors on SCL and SDA... - The user could not tell the difference between using a uart terminal or using an I2C terminal, - if the WARM message did not mention the I2C address. - -- - - the copy of a file to I2C target SD_Card doesn't work. the Multi Master Mode works but is not tested in multi master environment. @@ -192,15 +266,13 @@ V304 Sleep modes down to LPM4 are available for I2C_Slave devices. The driver UART2I2CS doesn't use the UCBx I2C_Master hardware, really too bad, but - profitably its software version, faster, which consumes just two I/O (better in the range Px0-Px3), - the UCBx remaining available typically for another I2C_Slave or SPI driver. + profitably its software version, much more faster, which consumes just two I/O (better in the range Px0-Px3), + the UCBx remaining available for another I2C_Slave or SPI driver. On the side of I2C_Slave, pins SDA SCL are those defined as BUS_TERM in the file \inc\your_target.asm. I2CSLA0, in the file forthMSP430FR.asm, defines the I2C_Slave address of the I2C FastForth module. - for I2C_Master, see \inc\your_UARTI2CS_bridge.pat the correnpodence of SM_SCL and SM_SDA. + for I2C_Master, see \inc\your_UARTI2CS_bridge.pat the correspondence of SM_SCL and SM_SDA. - if you are uncomfortable with the flashing of leds, - comment on their lines in the files forthMSP430FR_TERM_I2C.asm and MSP430-FORTH/UART2I2CS.f". #####HOW TO DO ? @@ -223,7 +295,7 @@ V302 -646 bytes Kernel + FIXPOINT input + DOUBLE input + :NONAME + Conditional Compilation + Assembler under 5 kB. - the FORTH kernel is drastically reduced to 55 strutural words. + the FORTH kernel is drastically reduced to 55 words. All others are moved in the \ADDON\ANS_COMPLEMENT.asm file, the conditionnal compilation with the assembler allowing to reuse them on request. @@ -411,8 +483,8 @@ V201 Note that with MSP430FR57xx family, SDIB uses PAD, due to lack of RAM. With the BOOTLOADER option, QUIT becomes a DEFERed word to easily enable/disable bootloader: - ' BOOT IS QUIT enables bootloader. - ' QUIT >BODY IS QUIT disables bootloader. + ' BOOT IS WARM enables bootloader. + WIPE disables bootloader. V162 @@ -527,17 +599,17 @@ And that's the magic: After I finished editing (or modify) the source file, I pr Content ------- -See FastForth.pdf +See [FastForth.pdf](https://gitlab.com/Jean-Michel/FastForthForMSP430fr5xxx/-/blob/master/FastForth.pdf) Organize your gitlab copy of FastForth ------- -See FastForth.pdf +See [FastForth.pdf](https://gitlab.com/Jean-Michel/FastForthForMSP430fr5xxx/-/blob/master/FastForth.pdf) Minimal Software ----- -See FastForth.pdf +See [FastForth.pdf](https://gitlab.com/Jean-Michel/FastForthForMSP430fr5xxx/-/blob/master/FastForth.pdf) Build the program file ---------------------- @@ -578,24 +650,24 @@ Connect the FAST FORTH target to a serial terminal you will need an USBtoUART cable with a PL2303TA or PL2303HXD device that allows both XON/XOFF and hardware control flow : - http://www.google.com/search?q=PL2303TA - http://www.google.com/search?q=PL2303HXD +[PL2303HXD 3.3V](http://www.google.com/search?q=PL2303HXD+3.3V+cable) +[PL2303 driver](http://www.prolific.com.tw/US/ShowProduct.aspx?p_id=225&pcid=41) -or USBtoUART bridge, with a CP2102 device and 3.3V/5V that allows XON/XOFF control flow : +WARNING! always verify VCC PIN = 3.3V before use to supply your target with. - search google: cp2102 module 3.3V - http://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx - - you must program CP2102 device for speeds beyond 1MBds - http://www.silabs.com/Support%20Documents/Software/install_USBXpress_SDK.exe - http://www.silabs.com/Support%20Documents/TechnicalDocs/an169.pdf +or with a CP2102 device and 3.3V/5V that allows XON/XOFF control flow up to 921600 Bds: -or a USBtoUART bridge, with a FT232RL device and 3.3V/5V for only hardware control flow: +[CP2102 3.3V](https://www.google.com/search?q=cp2102+3.3V+6PIN) +[CP2102 driver](https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers) - WARNING! buy a FT232RL module with a switch 5V/3V3 and select 3V3. - - http://www.google.com/search?q=FT232RL+module+3.3V - http://www.ftdichip.com +WARNING! always verify VCC PIN = 3.3V before use to supply your target with. + +or with a FT232RL device and 3.3V/5V but without XON/XOFF control flow: + +[FT232RL 3.3V](http://www.google.com/search?q=FT232RL+3.3V) +[FT232RL driver](https://www.ftdichip.com/Drivers/VCP.htm) + +WARNING! always verify VCC PIN = 3.3V before use to supply your target with. or compatible 921600bds wireless module: RN42 (bluesmirf), RN4878... @@ -701,15 +773,6 @@ or use scite. If you have any downloading error, first verify in "LAST.4th" that all lines are correctly ended with CR+LF. -I2C DRIVERS -=========== - -The I2C\_Soft\_Master driver with normal/fast mode allows you to add then use any couple of pins to drive a bus I2C : - -- without use of eUSCI UCBx -- I2C\_Soft\_MultiMaster driver : same plus detection collision -- plus I2C\_Slave driver that uses the eUSCI UCBx hardware - Other interesting specificities : ===== @@ -718,7 +781,7 @@ VOCABULARY, DEFINITIONS, ONLY, ALSO, PREVIOUS, CONTEXT, CURRENT, FORTH, ASSEMBLE In fact, it's the the assembler that requires the vocabularies management. Recognizing prefixed numbers %101011 (bin), $00FE (hex) and #220 (decimal). -you can insert underscores in numbers: %1100_1101_0000_0001 instead of %1100110100000001. +you can insert underscores in numbers: %1100\_1101\_0000\_0001 instead of %1100110100000001. ECHO / NOECHO @@ -736,57 +799,68 @@ See examples in the TstWords.f file. This is perhaps the most interesting featur The system is not responding ? ====== -First, swich off then switch on. FORTH restarts as it was after the last PWR\_HERE command. +First, remove the USBtoUART bridge then reconnect it. Perhaps it was in suspend state... -If the system is not restarted, press button on the MSP-EXP430FR5xxx ; FORTH restarts +If the system is always freezed, press button on the MSP-EXP430FR5xxx ; FORTH restarts as it was after the last RST_HERE command. -If the system does not restart again, press `SW2+RESET`. -FORTH restarts as it is in the HEX file. Equivalent software : WIPE + COLD. +If the system does not restart again, press `SW1+RESET`. +FORTH restarts in the state it is in its object txt file. -Here is the FastForth init architecture : +Here is the FastForth initialization process, in itself one of its major assets : - case 0 : when you type `WARM`, FORTH interpreter is restarted, no program lost. - the WARM display is preceded by "#0". - - case 1 : Power ON ==> performs reset and the program beyond PWR_HERE is lost. - the WARM display is preceded by the SYSRSTIV value "#2". + case 1 : when you type `PWR_STATE` ==> the program beyond PWR_HERE is lost. + + case 1.1 : when you type `WARM`, FORTH interpreter is restarted, the program + beyond of last PWR_HERE (or last RST_HERE) is lost. + The WARM display is preceded by "#0". - case 1.1 : when you type `PWR_STATE` ==> the program beyond PWR_HERE is lost. + case 1.2 : Power ON ==> performs a reset and the program beyond PWR_HERE is lost. + the WARM display is preceded by the SYSRSTIV value "#2". - case 1.2 : If an error message (reverse video) occurs from the interpreter, - PWR_STATE is automatically executed and the program beyond PWR_HERE is lost. - In this way, any error is followed by the complete erasure of the uncompleted word, - or by that of the downloading source file causing this error. - It is recommended to finish a source file with at least PWR_HERE to protect it - against any subsequent error. + case 1.3 : SVSHIFG SVSH event ==> same effects, + the WARM display is preceded by the SYSRSTIV decimal value "#14". + + - case 2 : ==> performs reset and the program beyond RST_HERE is lost. - the WARM display is preceded by the SYSRSTIV value "#4". + case 2 : when you type `RST_STATE` ==> the program beyond RST_HERE is lost. + + case 2.1 : ==> performs reset and the program beyond RST_HERE is lost, + the WARM display is preceded by the SYSRSTIV value "#4". - case 2.1 : when you type `COLD` (software reset) ==> same effects. + case 2.2 : when you type `COLD` (software reset) ==> same effects, the WARM display is preceded by the SYSRSTIV value "#6". - case 2.2 : when you type `RST_STATE` ==> the program beyond RST_HERE is lost. - - - case 3 : when you type `WIPE` ==> all programs donwloaded from the terminal or the SD_Card are lost. - - - case 4 : `SW2+RESET` ===> performs deep reset, and all programs - donwloaded from the terminal or the SD_Card are lost. The WARM display is preceded by #-4. + case 2.3 : PUC on failure ===> same effects, + The WARM display is preceded by the SYSRSTIV decimal value. + + - case 4.1 : reset on failure (SYSRSTIV = #10 | SYSRSTIV >= #22) ===> same effects - The WARM display is preceded by the SYSRSTIV negative value. + case 3 : when you type `WIPE` ==> all programs donwloaded from the terminal or the SD_Card + are lost, the default state of COLD_APP, INI_SOFT_APP, INI_HARD_APP and BACKGND_APP + are restored, all "defered" words are initialised with their default value, + same thing for interrupts vectors, and SIGNATURES area is cleared (FFh). + The WARM display is preceded by #-1. + + case 3.1 : ==> performs deep reset, same effects. + The WARM display is preceded by #-1. - case 4.2 : writing -1 in SAVE_SYSRSTIV before COLD = software DEEP_RST ===> same effects - The WARM display is preceded by "-1". + case 3.2 : after compiling new FastForth ==> same effects, obviously! + The WARM display is preceded by #-3. + - case 5 : after FAST FORTH core compilation, the WARM displays #5. User may use this - information before WARM occurs. + If you have previously set 'NOECHO', there is no WARM display. + + + If an error occurs from the interpreter, FORTH is restarted, + The error is always displayed and the program beyond PWR_HERE is lost. + + In this way, any error is followed by the complete erasure of a bad definined word causing this error, + or by that of the downloaded source file including it. + + It is therefore recommended to end a source file with at least 'PWR_HERE' to protect it + from any subsequent error. -If SD\_CARD extention and SD\_CARD memory with \BOOT.4TH included, the cases 1 to 4 starts it -after displaying of WARM message. VOCABULARY ADD-ON ==== @@ -819,7 +893,7 @@ EMBEDDED ASSEMBLER With the preprocessor GEMA the embedded assembler allows access to all system variables. See files \\inc\\Target.pat. -You can also access to VARIABLE, CONSTANT or DOES type words. See \\MSP430-FORTH\\TESTASM.4th. +You can also access to VARIABLE. See \\MSP430-FORTH\\TESTASM.4th. HOW TO MIX assembly and FORTH ? --- @@ -1240,7 +1314,7 @@ First you create two files : project.f and test.f PROJECT.f : ; ---------------------------------------------------- - ; MSP430FR5969 MSP_EXP430FR5969 8MHZ 921600bds PROJECT.f + ; MSP_EXP430FR5969 16MHZ 4Mbds PROJECT.f ; ---------------------------------------------------- [DEFINED] {PROJECT} [IF] {PROJECT} [THEN] \ remove {PROJECT} if exist (memory managment) @@ -1372,7 +1446,7 @@ ANNEXE == Here you have a good view of MSP430 assembly: -http://www.ece.utep.edu/courses/web3376/Notes_files/ee3376-isa.pdf +[MSP430 ISA](http://www.ece.utep.edu/courses/web3376/Notes_files/ee3376-isa.pdf) FastForth embedded assembler doesn't recognize the (useless) TI's symbolic addressing mode: ADD.B EDE,TONI. diff --git a/SciTEDirectory.properties b/SciTEDirectory.properties index 9c33bd9..e6b86fa 100644 --- a/SciTEDirectory.properties +++ b/SciTEDirectory.properties @@ -1,637 +1,582 @@ -# 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=82 -edge.mode=1 -edge.colour=#404040 -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=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: $(SelHeight) lines, $(SelLength) chars. -statusbar.text.3=\ -Now is: Date=$(CurrentDate) Time=$(CurrentTime) -statusbar.text.4=\ -$(FileNameExt) : $(FileDate) — $(FileTime) | $(FileAttr) - -if PLAT_WIN - command.scite.help="https://www.scintilla.org/SciTEDoc.html" - command.scite.help.subsystem=2 -if PLAT_GTK - command.print.*=a2ps "$(FileNameExt)" - command.scite.help=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=-2 -# 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 -export.pdf.pagesize=842,595 -# Margins (in points): left, right, top, bottom -export.pdf.margins=28,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=ŠšŒœŸÿÀàÁáÂâÃãÄäÅåÆæÇçÈèÉéÊêËëÌìÍíÎîÏïÐðÑñÒòÓóÔôÕõÖØøÙùÚúÛûÜüÝýÞþßö -# 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. -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.files)All Source|$(source.files)| -if PLAT_GTK - all.files=All Files (*)|*|Hidden Files (.*)|.*| - top.filters=$(all.files)|All Source|$(source.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:Bitstream Vera Sans Mono,size:10 - font.small=font:Bitstream Vera Sans Mono,size:10 - font.comment=font:Bitstream Vera Sans Mono,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:Bitstream Vera Sans Mono,size:10 - font.text.comment=font:Bitstream Vera Sans Mono,size:10 - font.embedded.base=font:Bitstream Vera Sans Mono,size:10 - font.embedded.comment=font:Bitstream Vera Sans Mono,size:10 - font.monospace=font:Bitstream Vera Sans Mono,size:10 - font.vbs=font:Bitstream Vera Sans Mono,size:10 -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) — Printed on $(CurrentDate), $(CurrentTime) — Page $(CurrentPage) - print.footer.format=$(FilePath) — File date: $(FileDate) — 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| - -#if PLAT_WIN -import \config\asm -import \config\forth -import \config\fortran -import \config\hex -import \config\others - -#if PLAT_GTK -import /media/jeanmi/DATA/CloudStation/projets/msp430/config/asm -import /media/jeanmi/DATA/CloudStation/projets/msp430/config/forth -import /media/jeanmi/DATA/CloudStation/projets/msp430/config/fortran -import /media/jeanmi/DATA/CloudStation/projets/msp430/config/hex -import /media/jeanmi/DATA/CloudStation/projets/msp430/config/others - - -# 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 - - - - +# 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=-1 +#position.height=-1 +#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=80 +edge.mode=1 +edge.colour=#404040 +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.session=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=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: $(SelHeight) lines, $(SelLength) chars. +statusbar.text.3=\ +Now is: Date=$(CurrentDate) Time=$(CurrentTime) +statusbar.text.4=\ +$(FileNameExt) : $(FileDate) — $(FileTime) | $(FileAttr) + +if PLAT_WIN + command.scite.help="https://www.scintilla.org/SciTEDoc.html" + command.scite.help.subsystem=2 +if PLAT_GTK + command.print.*=a2ps "$(FileNameExt)" + command.scite.help=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=-2 +# 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 +export.pdf.pagesize=842,595 +# Margins (in points): left, right, top, bottom +export.pdf.margins=28,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=ŠšŒœŸÿÀàÁáÂâÃãÄäÅåÆæÇçÈèÉéÊêËëÌìÍíÎîÏïÐðÑñÒòÓóÔôÕõÖØøÙùÚúÛûÜüÝýÞþßö +# 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. +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.files)All Source|$(source.files)| +if PLAT_GTK + all.files=All Files (*)|*|Hidden Files (.*)|.*| + top.filters=$(all.files)|All Source|$(source.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:Bitstream Vera Sans Mono,size:10 + font.small=font:Bitstream Vera Sans Mono,size:10 + font.comment=font:Bitstream Vera Sans Mono,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:Bitstream Vera Sans Mono,size:10 + font.text.comment=font:Bitstream Vera Sans Mono,size:10 + font.embedded.base=font:Bitstream Vera Sans Mono,size:10 + font.embedded.comment=font:Bitstream Vera Sans Mono,size:10 + font.monospace=font:Bitstream Vera Sans Mono,size:10 + font.vbs=font:Bitstream Vera Sans Mono,size:10 + +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) — Printed on $(CurrentDate), $(CurrentTime) — Page $(CurrentPage) + print.footer.format=$(FilePath) — File date: $(FileDate) — 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|\ +&Batch|bat||\ +&Difference|diff||\ +&Errorlist|err||\ +H&ypertext|html|F12|\ +&Makefile|mak|Ctrl+Shift+F11|\ +&Properties|properties||\ + +# 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| + +if PLAT_WIN + import \config\asm + import \config\forth + import \config\fortran + import \config\hex + import \config\others +#if PLAT_GTK +# import /home/thoorens/CloudStation/projets/msp430/config/asm # import /home/thoorens/CloudStation/projets/msp430/config/forth # import /home/thoorens/CloudStation/projets/msp430/config/fortran # import /home/thoorens/CloudStation/projets/msp430/config/hex # import /home/thoorens/CloudStation/projets/msp430/config/others import Z:\config\asm +import Z:\config\forth +import Z:\config\fortran +import Z:\config\hex +import Z:\config\others + +import /home/thoorens/CloudStation/projets/msp430/config/asm +import /home/thoorens/CloudStation/projets/msp430/config/forth +import /home/thoorens/CloudStation/projets/msp430/config/fortran +import /home/thoorens/CloudStation/projets/msp430/config/hex +import /home/thoorens/CloudStation/projets/msp430/config/others + +# 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 + + + + diff --git a/binaries/CHIPSTICK_FR2433_16MHz_I2C.txt b/binaries/CHIPSTICK_FR2433_16MHz_I2C.txt index 6487f06..55517a4 100644 --- a/binaries/CHIPSTICK_FR2433_16MHz_I2C.txt +++ b/binaries/CHIPSTICK_FR2433_16MHz_I2C.txt @@ -1,331 +1,336 @@ @1800 -10 00 10 00 00 00 80 3E 05 00 F8 00 C2 D7 00 CF -32 01 63 00 64 C5 78 C5 40 D0 40 D0 18 C5 +80 3E 12 00 00 00 F8 00 F9 FF FE D7 0A D0 33 01 +10 00 81 06 B4 C5 AA C4 B6 C5 8A C5 82 C6 FE D7 +0A D0 70 C6 92 C7 FE C6 DA C6 3C 21 60 C8 D4 C4 +E2 C4 EE C4 20 00 0A 00 28 CC 42 CC 00 00 00 00 @C400 -30 40 04 C4 B0 12 64 C5 12 D2 0A 18 F9 3F 2F 83 -8F 4E 00 00 3E 4D 30 4D 2F 82 8F 4E 02 00 7E 4D -8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D 2F 83 8F 4E -00 00 1E 42 C6 21 30 4D 0E 93 3E 4F 05 24 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 21 52 2D 53 30 4D 91 53 -00 00 F7 3F 0B 4E 1C 4F 02 00 2E 4F 0A 43 35 40 -20 00 0E 93 04 20 05 11 0E 4C 0C 43 09 43 0A 9B -01 28 0A 8B 09 69 08 68 15 83 07 30 0C 5C 0E 6E -0A 6A F5 2B 0A 8B 12 D3 F5 3F 35 40 E2 C4 8F 4A -02 00 8F 49 00 00 0E 48 30 41 82 4E C0 21 B2 4F -C2 21 3E 4F 82 43 C4 21 30 4D 3F 80 06 00 8F 4E -04 00 3E 40 54 00 BF 40 3C 21 00 00 AF 4F 02 00 -12 3C 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E 30 4D -2F 83 8F 4E 00 00 3E 41 2E 4E 30 4D 00 00 06 41 -43 43 45 50 54 00 0A 4E 2E 4F 0A 5E 3B 40 0A 00 -3C 40 20 00 3D 15 74 3F 21 52 A2 C2 6C 05 B2 B0 -10 00 40 05 6D 23 3A 17 92 B3 6C 05 FD 27 58 42 -4C 05 48 9B 0E 24 48 9C 06 2C 78 92 F5 23 2E 9F -F3 27 1E 83 F1 3F 0E 9A EF 27 CE 48 00 00 1E 53 -EB 3F 82 93 DE 21 02 24 92 53 DE 21 3E 8F B0 12 -70 C5 30 4D 48 43 A2 B3 6C 05 FD 27 C2 48 4E 05 -B2 B0 40 00 48 05 FC 27 30 41 B2 40 4F 5A CC 01 -A2 B3 6C 05 FD 27 F2 40 03 00 4E 05 B0 12 70 C5 -B2 40 04 A5 20 01 00 00 03 4B 45 59 30 40 A0 C5 -2F 83 8F 4E 00 00 58 43 B0 12 66 C5 92 B3 6C 05 -FD 27 1E 42 4C 05 30 4D 00 00 04 45 4D 49 54 00 -30 40 C4 C5 08 4E 3E 4F A2 B3 6C 05 FD 27 82 48 -4E 05 30 4D BA C5 04 45 43 48 4F 00 B2 40 82 48 -CE C5 82 43 DE 21 38 40 05 00 B0 12 66 C5 30 4D -00 00 06 4E 4F 45 43 48 4F 00 B2 40 30 4D CE C5 -92 43 DE 21 28 42 F1 3F 00 00 04 54 59 50 45 00 -0E 93 10 24 0D 12 3D 40 2A C6 28 4F 2F 83 8F 4E -00 00 7E 48 8F 48 02 00 CB 3F 2C C6 2D 83 1E 83 -F4 23 3D 41 2F 53 3E 4F 30 4D 00 00 02 43 52 00 -30 40 44 C6 0D 12 84 12 18 C4 02 0D 0A 00 10 C6 -10 C7 2F 83 8F 4E 00 00 30 4D 0E 93 FA 23 30 4D -8F 4E FE FF AF 4F FC FF 2F 82 30 4D 2A 4F 8F 4E -00 00 0E 4A 30 4D 8F 4E FE FF 3E 40 80 20 0E 8F -0E 11 2F 83 30 4D 2F 83 8F 4E 00 00 3E 41 30 4D -3E 8F 3E E3 1E 53 30 4D BE 4F 00 00 3E 4F 30 4D +B0 12 B6 C5 12 D2 06 18 FB 3F 2F 83 8F 4E 00 00 +3E 4D 30 4D 2F 82 8F 4E 02 00 7E 4D 8F 4D 00 00 +0D 5E 1D B3 0D 63 30 4D 2F 83 8F 4E 00 00 1E 42 +C6 21 30 4D 0E 93 3E 4F 11 20 2D 4D 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 F0 27 21 52 2D 53 30 4D +91 53 00 00 F7 3F 0B 4E 1C 4F 02 00 2E 4F 0A 43 +35 40 20 00 0E 93 04 20 05 11 0E 4C 0C 43 09 43 +0A 9B 01 28 0A 8B 09 69 08 68 15 83 07 30 0C 5C +0E 6E 0A 6A F5 2B 0A 8B 12 D3 F5 3F 35 40 D4 C4 +8F 4A 02 00 8F 49 00 00 0E 48 30 41 82 4E C0 21 +B2 4F C2 21 82 43 C4 21 3E 4F 30 4D 3F 80 06 00 +8F 4E 04 00 3E 40 54 00 BF 40 3C 21 00 00 AF 4F +02 00 CC 3C 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E +30 4D 2F 83 8F 4E 00 00 3E 41 2E 4E 30 4D 2F 83 +8F 4E 00 00 3E 41 30 4D B0 12 AA C4 39 40 22 18 +B2 49 6E C6 B2 49 90 C7 B2 49 FC C6 B2 49 D8 C6 +B2 49 CA C4 34 49 35 49 36 49 37 49 B2 49 B4 21 +B2 49 DC 21 3D 41 30 40 D6 D0 8F 93 02 00 03 20 +2F 52 3E 4F 30 4D 68 43 B0 12 B8 C5 B0 12 F8 C4 +0A C4 DE 21 E0 C7 16 C7 4A C7 34 C4 28 CC 14 C4 +05 1B 5B 37 6D 40 5C C7 0A C4 02 18 E0 C7 D6 C8 +A8 C7 34 C4 7C C5 14 C4 0F 4C 41 53 54 2E 34 54 +48 2C 20 6C 69 6E 65 20 5C C7 A0 C8 5C C7 14 C4 +04 1B 5B 30 6D 00 5C C7 28 CC 2E 93 13 28 B2 D0 +C0 07 40 05 18 42 02 18 08 11 38 D0 00 04 82 48 +54 05 F2 D0 0C 00 0A 02 92 C3 40 05 A2 D2 6A 05 +92 C3 30 01 30 41 48 43 A2 B3 6C 05 FD 27 C2 48 +4E 05 A2 B2 6C 05 FD 27 30 41 00 00 04 57 49 50 +45 00 B2 43 08 18 04 3C 00 00 04 43 4F 4C 44 00 +B0 12 B4 C5 F2 B0 10 00 00 02 02 20 B2 43 08 18 +B2 40 04 A5 20 01 CC C5 04 57 41 52 4D 00 B0 12 +8A C5 78 40 03 00 B0 12 B8 C5 84 12 14 C4 07 0D +0A 1B 5B 37 6D 40 5C C7 0A C4 02 18 E0 C7 D6 C8 +0A C4 23 00 FA C6 D6 C8 14 C4 19 46 61 73 74 46 +6F 72 74 68 20 C2 A9 4A 2E 4D 2E 54 68 6F 6F 72 +65 6E 73 20 5C C7 0A C4 40 FF 28 C4 D4 C7 A0 C8 +14 C4 0A 62 79 74 65 73 20 66 72 65 65 00 3A C4 +7C C5 00 00 06 41 43 43 45 50 54 00 30 40 70 C6 +0A 4E 2E 4F 0A 5E 3B 40 0A 00 3C 40 20 00 3D 15 +BF 3E 21 52 A2 C2 6C 05 B2 B0 10 00 40 05 B8 22 +3A 17 92 B3 6C 05 FD 27 58 42 4C 05 48 9B 0E 24 +48 9C 06 2C 78 92 F5 23 2E 9F F3 27 1E 83 F1 3F +0E 9A EF 27 CE 48 00 00 1E 53 EB 3F 3E 8F B0 12 +C2 C5 82 93 DE 21 02 24 92 53 DE 21 08 4C 19 3C +00 00 03 4B 45 59 30 40 DA C6 2F 83 8F 4E 00 00 +58 43 B0 12 B8 C5 92 B3 6C 05 FD 27 1E 42 4C 05 +30 4D 00 00 04 45 4D 49 54 00 30 40 FE C6 08 4E +3E 4F A2 B3 6C 05 FD 27 C2 48 4E 05 30 4D F4 C6 +04 45 43 48 4F 00 B2 40 C2 48 08 C7 82 43 DE 21 +38 40 05 00 B0 12 B8 C5 30 4D 00 00 06 4E 4F 45 +43 48 4F 00 B2 40 30 4D 08 C7 92 43 DE 21 28 42 +F1 3F 2C C7 04 4F 56 45 52 00 8F 4E FE FF 2E 4F +2F 83 30 4D 00 00 04 54 59 50 45 00 0E 93 11 24 +0D 12 3D 40 78 C7 28 4F 2F 83 8F 4E 00 00 7E 48 +8F 48 02 00 10 42 FC C6 7A C7 2D 83 1E 83 F3 23 +3D 41 2F 53 3E 4F 30 4D DA C5 02 43 52 00 30 40 +92 C7 0D 12 84 12 14 C4 02 0D 0A 00 5C C7 60 C8 +2F 83 8F 4E 00 00 30 4D 0E 93 FA 23 30 4D 8F 4E +FE FF AF 4F FC FF 2F 82 30 4D 2A 4F 8F 4E 00 00 +0E 4A 30 4D 8F 4E FE FF 3E 40 80 20 0E 8F 0E 11 +2F 83 30 4D 3E 8F 3E E3 1E 53 30 4D 64 C6 01 40 +2E 4E 30 4D DE C7 01 21 BE 4F 00 00 3E 4F 30 4D 1E 83 0E 7E 30 4D 0E 5E 0E 7E 3E E3 30 4D 3E 8F 03 24 3E 43 01 2C 0E F3 30 4D 00 00 02 3C 23 00 -B2 40 B2 21 B2 21 30 4D 3C C6 01 23 1B 42 DC 21 -2C 4F 2F 83 B0 12 7C C4 BF 4F 00 00 7A 90 0A 00 +B2 40 B2 21 B2 21 30 4D 8A C7 01 23 1B 42 DC 21 +2C 4F 2F 83 B0 12 6E C4 BF 4F 00 00 7A 90 0A 00 02 28 7A 50 07 00 7A 50 30 00 92 83 B2 21 18 42 -B2 21 C8 4A 00 00 30 4D CA C6 02 23 53 00 0D 12 -84 12 CC C6 06 C7 2D 83 09 93 E2 23 0E 93 E0 23 -3D 41 30 4D FA C6 02 23 3E 00 9F 42 B2 21 00 00 +B2 21 C8 4A 00 00 30 4D 1A C8 02 23 53 00 0D 12 +84 12 1C C8 56 C8 2D 83 09 93 E2 23 0E 93 E0 23 +3D 41 30 4D 4A C8 02 23 3E 00 9F 42 B2 21 00 00 3E 40 B2 21 2E 8F 30 4D 00 00 04 48 4F 4C 44 00 4A 4E 3E 4F DA 3F 00 00 04 53 49 47 4E 00 0E 93 -3E 4F 7A 40 2D 00 D1 33 30 4D 0A C6 02 55 2E 00 +3E 4F 7A 40 2D 00 D1 33 30 4D 56 C7 02 55 2E 00 08 43 2F 83 8F 4E 00 00 0E 48 0D 12 0E 12 3E F3 06 34 BF E3 00 00 3E E3 9F 53 00 00 0E 63 84 12 -C0 C6 FE C6 86 C6 3E C7 1A C7 10 C6 AC CA C0 C5 -10 C7 F2 C5 01 2E 0E 93 E3 37 38 43 E2 3F 38 C7 -82 53 22 00 82 43 B4 21 0D 12 84 12 0E C4 18 C4 -F4 C9 0E C4 22 00 DC C7 AA C7 B2 40 20 00 B4 21 -6E 4E 1E 53 1E B3 82 6E C6 21 3D 41 3E 4F 30 4D -84 C7 82 2E 22 00 0D 12 84 12 94 C7 0E C4 10 C6 -F4 C9 10 C7 00 00 04 57 4F 52 44 00 3C 40 C0 21 -39 4C 3A 4C 09 5A 3A 5C 28 4C 09 9A 18 24 7E 9A -FC 27 1A 83 3B 40 60 00 15 42 B4 21 C8 4C 00 00 -09 9A 0B 24 7C 4A 4E 9C 08 24 18 53 4B 9C F6 2F -7C 90 7B 00 F3 2F 4C 85 F1 3F 35 40 E2 C4 1A 82 -C2 21 82 4A C4 21 1E 42 C6 21 08 8E CE 48 00 00 -30 4D 00 00 04 46 49 4E 44 00 2F 83 0C 4E 66 4C -75 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 C5 48 96 F7 23 0A 4C FA 99 -01 00 F3 23 1A 53 58 83 FA 23 19 B3 09 63 0C 49 -CE 93 00 00 1E 43 01 30 2E 83 8F 4C 00 00 36 40 -F0 C4 35 40 E2 C4 30 4D 00 00 07 3E 4E 55 4D 42 -45 52 3C 4F 38 4F 29 4F 2F 82 1B 42 DC 21 6A 4C -7A 80 30 00 7A 90 0A 00 05 28 7A 80 07 00 7A 90 -0A 00 12 28 0A 9B 22 C3 0F 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 E3 23 8F 4C 00 00 8F 48 02 00 -8F 49 04 00 30 4D 32 C0 00 02 1B 42 DC 21 0C 43 -2D 15 3D 40 42 C9 09 43 08 43 3F 82 8F 4E 06 00 -0C 4E 7E 4C 6A 4C 7A 90 2D 00 04 28 C9 23 B1 43 -02 00 0B 3C 2B 43 7A 80 25 00 07 24 3B 52 6A 53 -04 24 3B 40 10 00 5A 83 3A 20 1C 53 1E 83 EA 23 -09 24 44 C9 34 24 2D 83 7A 90 28 00 03 20 8F 93 -04 00 C7 23 32 B0 00 02 2A 20 32 D0 00 02 7A 90 -F7 00 BF 27 7A 90 F5 00 22 20 0A 4E 09 43 8F 49 -02 00 5A 83 09 4A 09 5C 69 49 79 80 30 00 79 90 -0A 00 05 28 79 80 07 00 79 90 0A 00 0A 28 09 9B -08 2C 8F 49 00 00 0E 4B 2C 15 B0 12 74 C4 2A 17 -E6 3F 9F 4F 04 00 02 00 AF 4F 04 00 4A 93 2B 17 -0E 4C 82 4B DC 21 06 24 32 C0 00 02 3F 50 06 00 -0E F3 30 4D 2F 53 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 -00 00 01 2C 1A 42 C6 21 8A 4E 00 00 A2 53 C6 21 -3E 4F 30 4D F2 C9 87 4C 49 54 45 52 41 4C 82 93 -BE 21 0C 24 1A 42 C6 21 A2 52 C6 21 BA 40 0E C4 -00 00 8A 4E 02 00 3E 4F 32 B0 00 02 32 C0 00 02 -06 24 19 4A 02 00 8A 4E 02 00 0E 49 EB 3F 30 4D -16 C7 05 43 4F 55 4E 54 2F 83 1E 53 8F 4E 00 00 -5E 4E FF FF 30 4D 4C C7 05 54 52 45 41 54 0D 12 -84 12 BA C4 AC CA DC C7 6A CA A7 26 3D 40 72 CA -E4 3E 74 CA 0A 4E 3E 4F 3D 40 8E CA 3C 27 3D 40 -64 CA 1A E2 BE 21 B6 27 0E 12 3E 4F 30 41 90 CA -3E 4F 3D 40 64 CA BB 23 DE 53 00 00 68 4E 08 5E -F8 40 3F 00 00 00 3D 40 A6 CC CE 3F 86 12 20 00 -00 00 04 51 55 49 54 00 82 43 08 18 31 40 E0 20 -B2 40 00 20 00 20 82 43 BE 21 84 12 40 C6 CA C4 -AC CA C0 C5 5E CA 76 C6 A6 C6 18 C4 0C 73 74 61 -63 6B 20 65 6D 70 74 79 21 00 2E CB 0E C4 40 FF -2C C4 AE C6 18 C4 0A 46 52 41 4D 20 66 75 6C 6C -21 00 2E CB 3E C4 CC CA FE C4 05 41 42 4F 52 54 -3F 40 80 20 D1 3F 0A CB 86 41 42 4F 52 54 22 00 -0D 12 84 12 94 C7 0E C4 2E CB F4 C9 10 C7 8F 93 -02 00 03 20 2F 52 3E 4F 30 4D B0 12 02 D0 68 43 -B0 12 66 C5 0D 12 84 12 88 CF 0E C4 DE 21 F8 C4 -DC C5 18 C4 05 1B 5B 37 6D 40 10 C6 0E C4 02 18 -F8 C4 86 C7 5A C6 42 C4 76 CB 18 C4 05 6C 69 6E -65 3A 10 C6 50 C7 10 C6 18 C4 04 1B 5B 30 6D 00 -10 C6 10 CB 00 00 83 5B 27 5D 0D 12 84 12 9E CB -0E C4 0E C4 F4 C9 F4 C9 10 C7 34 C8 01 27 0D 12 -84 12 AC CA DC C7 3A C8 42 C4 AE CB 10 C7 98 CA -BC C6 81 5C 92 42 C0 21 C4 21 30 4D 86 CB 81 5B -82 43 BE 21 30 4D B2 CB 01 5D B2 43 BE 21 30 4D -B2 CA 88 50 4F 53 54 50 4F 4E 45 00 0D 12 84 12 -AC CA DC C7 3A C8 5A C6 42 C4 AE CB A6 C6 42 C4 -FE CB 0E C4 0E C4 F4 C9 F4 C9 0E C4 F4 C9 F4 C9 -10 C7 2A C7 09 49 4D 4D 45 44 49 41 54 45 1A 42 -B6 21 FA D0 80 00 00 00 30 4D BE CB 01 3A 30 12 -66 CC 92 B3 C6 21 A2 63 C6 21 0D 12 84 12 AC CA -DC C7 34 CC 3D 41 08 4E 7A 4E 5A D3 5A 53 0A 58 +10 C8 4E C8 EE C4 8E C8 6A C8 5C C7 24 CC FA C6 +60 C8 44 C7 01 2E 0E 93 E3 37 38 43 E2 3F 88 C8 +82 53 22 00 82 43 B4 21 0D 12 84 12 0A C4 14 C4 +5A CB 0A C4 22 00 2C C9 FA C8 B2 40 20 00 B4 21 +6E 4E 1E 53 1E B3 82 6E C6 21 3E 4F 3D 41 30 4D +D4 C8 82 2E 22 00 0D 12 84 12 E4 C8 0A C4 5C C7 +5A CB 60 C8 F8 C5 04 57 4F 52 44 00 3C 40 C0 21 +39 4C 3A 4C 09 5A 3A 5C 28 4C 09 9A 1D 24 7E 9A +FC 27 1A 83 3B 40 60 00 15 42 B4 21 FA 90 27 00 +00 00 01 20 05 43 C8 4C 00 00 09 9A 0B 24 7C 4A +4E 9C 08 24 18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F +4C 85 F1 3F 35 40 D4 C4 1A 82 C2 21 82 4A C4 21 +1E 42 C6 21 08 8E CE 48 00 00 30 4D 00 00 04 46 +49 4E 44 00 2F 83 0C 4E 66 4C 75 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 C5 48 96 F7 23 0A 4C FA 99 01 00 F3 23 1A 53 +58 83 FA 23 19 B3 09 63 0C 49 CE 93 00 00 1E 43 +01 30 2E 83 8F 4C 00 00 36 40 E2 C4 35 40 D4 C4 +30 4D 00 00 07 3E 4E 55 4D 42 45 52 3C 4F 38 4F +29 4F 2F 82 1B 42 DC 21 6A 4C 7A 80 30 00 7A 90 +0A 00 05 28 7A 80 07 00 7A 90 0A 00 12 28 0A 9B +22 C3 0F 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 +E3 23 8F 4C 00 00 8F 48 02 00 8F 49 04 00 30 4D +32 C0 00 02 1B 42 DC 21 0C 43 2D 15 3D 40 AE CA +09 43 08 43 3F 82 8F 4E 06 00 0C 4E 7E 4C FC 90 +27 00 00 00 07 20 5C 4C 01 00 8F 4C 04 00 7E 90 +03 00 48 3C 6A 4C 7A 80 2D 00 04 28 BD 23 B1 43 +02 00 0A 3C 2B 43 7A 52 07 24 3B 52 6A 53 04 24 +3B 40 10 00 7A 53 36 20 1C 53 1E 83 EB 3F B0 CA +31 24 2D 83 7A 90 28 00 C1 27 32 B0 00 02 2A 20 +32 D0 00 02 7A 90 F7 00 B9 27 7A 90 F5 00 22 20 +0A 4E 09 43 8F 49 02 00 5A 83 09 4A 09 5C 69 49 +79 80 30 00 79 90 0A 00 05 28 79 80 07 00 79 90 +0A 00 0A 28 09 9B 08 2C 8F 49 00 00 0E 4B 2C 15 +B0 12 66 C4 2A 17 E6 3F 9F 4F 04 00 02 00 AF 4F +04 00 4A 93 2B 17 0E 4C 82 4B DC 21 06 24 32 C0 +00 02 3F 50 06 00 0E F3 30 4D 2F 53 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 00 00 01 2C 1A 42 C6 21 8A 4E +00 00 A2 53 C6 21 3E 4F 30 4D E6 C7 05 41 4C 4C +4F 54 82 5E C6 21 3E 4F 30 4D 58 CB 87 4C 49 54 +45 52 41 4C 82 93 BE 21 0D 24 09 4E 1A 42 C6 21 +A2 52 C6 21 BA 40 0A C4 00 00 8A 49 02 00 3E 4F +32 B0 00 02 32 C0 00 02 03 24 8A 4E 02 00 EE 3F +30 4D 66 C8 05 43 4F 55 4E 54 2F 83 1E 53 8F 4E +00 00 5E 4E FF FF 30 4D 7A C8 09 49 4E 54 45 52 +50 52 45 54 0D 12 84 12 AC C4 24 CC 2C C9 E0 CB +94 26 3D 40 E8 CB D6 3E EA CB 0A 4E 3E 4F 3D 40 +04 CC 2E 27 3D 40 DA CB 1A E2 BE 21 AE 27 0E 12 +3E 4F 30 41 06 CC 3E 4F 3D 40 DA CB BB 23 DE 53 +00 00 68 4E 08 5E F8 40 3F 00 00 00 3D 40 96 CD +CC 3F 0E CC 86 12 20 00 3F 40 80 20 0E 43 31 40 +E0 20 B2 40 00 20 00 20 82 43 BE 21 84 12 8E C7 +BC C4 D4 CB C4 C7 F6 C7 14 C4 0C 73 74 61 63 6B +20 65 6D 70 74 79 21 00 2A C5 0A C4 40 FF 28 C4 +FE C7 14 C4 0A 46 52 41 4D 20 66 75 6C 6C 21 00 +2A C5 3A C4 3E CC 6C CB 86 41 42 4F 52 54 22 00 +0D 12 84 12 E4 C8 0A C4 2A C5 5A CB 60 C8 8E C9 +01 27 0D 12 84 12 24 CC 2C C9 94 C9 34 C4 22 CC +60 C8 00 00 83 5B 27 5D 0D 12 84 12 92 CC 0A C4 +0A C4 5A CB 5A CB 60 C8 A4 CC 81 5B 82 43 BE 21 +30 4D 0C C8 01 5D B2 43 BE 21 30 4D C4 CC 81 5C +92 42 C0 21 C4 21 30 4D 00 00 88 50 4F 53 54 50 +4F 4E 45 00 0D 12 84 12 24 CC 2C C9 94 C9 A8 C7 +34 C4 22 CC F6 C7 34 C4 06 CD 0A C4 0A C4 5A CB +5A CB 0A C4 5A CB 5A CB 60 C8 BA CC 01 3A 30 12 +56 CD 92 B3 C6 21 A2 63 C6 21 0D 12 84 12 24 CC +2C C9 24 CD 3D 41 08 4E 7A 4E 5A D3 5A 53 0A 58 19 42 DA 21 6E 4E 3E F0 1E 00 09 5E 3E 4F 82 48 B6 21 82 49 B8 21 82 4A BA 21 82 4F BC 21 2A 52 82 4A C6 21 30 41 BA 40 0D 12 FC FF BA 40 84 12 FE FF B2 43 BE 21 30 4D 82 9F BC 21 09 20 18 42 B6 21 19 42 B8 21 A8 49 FE FF 89 48 00 00 30 4D -0D 12 84 12 18 C4 0F 73 74 61 63 6B 20 6D 69 73 -6D 61 74 63 68 21 3A CB 1C CC 81 3B 82 93 BE 21 -81 27 0D 12 84 12 0E C4 10 C7 F4 C9 78 CC C0 CB -10 C7 42 CA 06 43 52 45 41 54 45 00 B0 12 22 CC -BA 40 86 12 FC FF 8A 4A FE FF D5 3F C4 CC 04 43 -4F 44 45 00 B0 12 22 CC A2 82 C6 21 0D 12 84 12 -02 CF DC CE 10 C7 00 00 07 45 4E 44 43 4F 44 45 -0D 12 84 12 78 CC 1C CF 10 C7 18 CB 03 41 53 4D -B2 40 E0 CE DA 21 E6 3F F8 CC 06 45 4E 44 41 53 -4D 00 0D 12 84 12 00 CD 3A CF 10 C7 00 00 05 43 -4F 4C 4F 4E 1A 42 C6 21 BA 40 0D 12 00 00 BA 40 -84 12 02 00 A2 52 C6 21 B2 43 BE 21 30 40 1C CF -00 00 05 4C 4F 32 48 49 A2 83 C6 21 1A 42 C6 21 -EE 3F 04 CC 85 48 49 32 4C 4F 0D 12 84 12 2C C4 -AA CE F4 C9 C0 CB EC CC 10 C7 AA CC 86 5B 54 48 -45 4E 5D 00 30 4D 0C 4E 38 4F 3B 4F 39 4F 0E 4B -0E 5C 10 24 1B 83 06 30 1C 83 04 30 19 53 F9 98 -FF FF F5 27 2D 4D 3E 4F 30 4D 2F 53 9F 83 00 00 -F9 23 2F 53 2D 53 F7 3F 7C CD 86 5B 45 4C 53 45 -5D 00 0D 12 84 12 0E C4 00 00 94 C6 AC CA DC C7 -48 CA 52 C6 42 C4 14 CE 60 C6 18 C4 06 5B 54 48 -45 4E 5D 00 86 CD EE CD AA CD CC CD 10 C7 60 C6 -18 C4 06 5B 45 4C 53 45 5D 00 86 CD 04 CE AA CD -CA CD 10 C7 18 C4 04 5B 49 46 5D 00 86 CD CC CD -3E C4 CA CD 34 C6 18 C4 05 0D 0A 6B 6F 20 10 C6 -CA C4 BA C4 3E C4 CC CD BA CD 84 5B 49 46 5D 00 -0E 93 3E 4F C6 27 30 4D 2F 53 30 4D 2A CE 89 5B -44 45 46 49 4E 45 44 5D 0D 12 84 12 AC CA DC C7 -3A C8 38 CE 10 C7 3E CE 8B 5B 55 4E 44 45 46 49 -4E 45 44 5D 0D 12 84 12 48 CE A0 C6 10 C7 70 CE -3D 41 B2 4E 0E 18 A2 4E 0C 18 3E 4F 8F 3C 06 CA -06 4D 41 52 4B 45 52 00 B0 12 22 CC BA 40 85 12 -FC FF BA 40 6E CE FE FF 9A 42 C8 21 00 00 28 83 -8A 48 02 00 A2 52 C6 21 EA 3E 2E 53 30 4D 0E C4 -CA 21 98 C6 10 C7 85 12 AE CE 0C CD EE D0 D6 C5 -9C CB 64 CD 98 C5 80 CE C2 C7 AC CF C6 CF 58 CA -3A D0 00 00 58 CE C8 CB 9A C8 00 00 85 12 AE CE -38 D6 9E D6 E0 D5 EE D6 A6 D5 00 00 72 D3 00 00 -B6 D7 9A D7 0A D6 48 D6 82 D4 00 00 00 00 0A D7 -DA CE 3A 40 0C 00 39 40 D6 21 08 49 28 53 19 83 -18 83 E8 49 00 00 1A 83 FA 23 30 4D 3A 40 0E 00 -38 40 CA 21 09 48 29 53 F8 49 00 00 18 53 1A 83 -FB 23 30 4D 82 43 CC 21 30 4D 92 42 CA 21 DA 21 -30 4D B6 CE 34 CF 3A CF 4A CF 3A 4E 82 4A C8 21 -2E 4E 82 4E C6 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 D2 CB 09 50 -57 52 5F 53 54 41 54 45 85 12 42 CF 00 CF C2 D7 -90 C7 09 52 53 54 5F 53 54 41 54 45 92 42 0E 18 -8C CF 92 42 0C 18 8E CF EF 3F 7E CF 08 50 57 52 -5F 48 45 52 45 00 92 42 C8 21 8C CF 92 42 C6 21 -8E CF 30 4D 92 CF 08 52 53 54 5F 48 45 52 45 00 -92 42 C8 21 0E 18 92 42 C6 21 0C 18 EC 3F D6 C7 -04 57 49 50 45 00 B2 40 00 CF 0E 18 B2 40 C2 D7 -0C 18 30 12 9C CF B2 40 04 C4 02 C4 B2 40 44 D0 -42 D0 B2 40 C4 C5 C2 C5 B2 40 44 C6 42 C6 B2 40 -A0 C5 9E C5 B2 40 F8 00 0A 18 34 40 10 C7 37 40 -86 C6 36 40 F0 C4 35 40 E2 C4 B2 40 20 00 B4 21 -B2 40 0A 00 DC 21 30 41 E0 CF 04 57 41 52 4D 00 -30 40 44 D0 3D 40 96 D0 92 C3 30 01 1E 42 08 18 -00 40 F2 B0 10 00 00 02 02 20 3E E3 1E 53 0E 93 -19 24 13 34 39 40 10 00 29 83 B9 43 80 FF FC 23 -B9 40 F8 D0 FE FF 29 83 B9 40 F4 D0 FE FF 39 90 -AC FF F9 23 B2 40 18 C5 E0 FF 0E 93 AC 33 2E 93 -7B 27 84 2F 30 4D 18 C4 07 0D 0A 1B 5B 37 6D 40 -10 C6 0E C4 02 18 F8 C4 86 C7 0E C4 23 00 C0 C5 -86 C7 18 C4 19 46 61 73 74 46 6F 72 74 68 20 C2 -A9 4A 2E 4D 2E 54 68 6F 6F 72 65 6E 73 20 10 C6 -0E C4 40 FF 2C C4 90 C6 50 C7 18 C4 0A 62 79 74 -65 73 20 66 72 65 65 00 3E C4 76 CB DE CC 04 43 -4F 4C 44 00 30 40 7A C5 B2 D0 03 00 04 01 B2 D0 -10 00 00 01 B2 40 80 5A CC 01 B2 43 02 02 B2 D3 -06 02 D2 43 24 02 F2 D3 26 02 F2 40 FD 00 22 02 -E2 D2 24 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 00 01 -B2 D0 10 00 86 01 92 D2 5E 01 08 18 38 40 59 14 -18 83 FE 23 19 83 FA 23 B2 D0 C0 07 40 05 18 42 -02 18 08 11 38 D0 00 04 82 48 54 05 F2 D0 0C 00 -0A 02 92 C3 40 05 A2 D2 6A 05 39 40 00 10 29 83 -89 43 00 20 FC 23 31 40 E0 20 3F 40 80 20 30 12 -40 D0 2F 3F 38 40 C0 21 0A 4E 39 48 2E 48 09 5E -1E 52 C4 21 09 9E 03 24 7A 9E FC 27 1E 83 0A 4E -2A 88 82 4A C4 21 30 4D 1C 15 84 12 DC C7 3A C8 -38 C4 DC D1 F6 C8 42 C4 AE CB F6 D1 DE D1 3C 4E -3C 80 87 12 08 24 1C 53 02 20 2E 4E 04 3C 2E 53 -1C 53 01 24 2E 82 1B 17 30 41 3E 40 28 00 B0 12 -C8 D1 19 42 C6 21 A2 53 C6 21 89 4E 00 00 3E 40 -29 00 1C 15 92 92 C0 21 C4 21 02 20 30 40 90 CC -12 12 C4 21 92 53 C4 21 84 12 DC C7 F6 C8 42 C4 -3E D2 34 D2 21 53 3E 90 10 00 80 2D DC 2B 40 D2 -B2 41 C4 21 D8 3F 0D 12 84 12 AC CA A4 D1 50 D2 -0C 43 1B 42 C6 21 A2 53 C6 21 6A 4E 3E 4F 7A 90 -23 00 27 20 92 53 C4 21 B0 12 C8 D1 3C 40 00 03 -0E 93 1C 24 3C 40 10 03 1E 93 18 24 3C 40 20 03 -2E 93 14 24 3C 40 20 02 2E 92 10 24 3C 40 30 02 -3E 92 0C 24 3C 40 30 03 3E 93 08 24 3C 40 30 00 -19 42 C6 21 A2 53 C6 21 89 4E 00 00 3E 4F 3D 41 -30 4D 7A 90 26 00 07 20 3C 40 10 02 92 53 C4 21 -B0 12 C8 D1 ED 3F 7A 90 40 00 16 20 3C 40 20 00 -92 53 C4 21 B0 12 12 D2 0C 20 3C 50 10 00 3E 40 -2B 00 B0 12 12 D2 92 92 C0 21 C4 21 02 24 92 53 -C4 21 8E 10 0C 5E DA 3F B0 12 12 D2 FA 23 3C 50 -10 00 B0 12 FA D1 EF 3F 0C 43 1B 42 C6 21 A2 53 -C6 21 0D 12 84 12 AC CA A4 D1 1C D3 FE 90 26 00 -00 00 3E 40 20 00 03 20 3C 50 82 00 C7 3F B0 12 -12 D2 E0 23 3C 50 80 00 B0 12 FA D1 DB 3F 00 00 -04 52 45 54 49 00 0D 12 84 12 0E C4 00 13 F4 C9 -10 C7 0E C4 2C 00 46 D2 12 D3 5C D3 09 4B 2E 4E -0E DC A2 3F 52 CD 03 4D 4F 56 85 12 52 D3 00 40 -66 D3 05 4D 4F 56 2E 42 85 12 52 D3 40 40 00 00 -03 41 44 44 85 12 52 D3 00 50 80 D3 05 41 44 44 -2E 42 85 12 52 D3 40 50 8C D3 04 41 44 44 43 00 -85 12 52 D3 00 60 9A D3 06 41 44 44 43 2E 42 00 -85 12 52 D3 40 60 40 D3 04 53 55 42 43 00 85 12 -52 D3 00 70 B8 D3 06 53 55 42 43 2E 42 00 85 12 -52 D3 40 70 C6 D3 03 53 55 42 85 12 52 D3 00 80 -D6 D3 05 53 55 42 2E 42 85 12 52 D3 40 80 2E CD -03 43 4D 50 85 12 52 D3 00 90 F0 D3 05 43 4D 50 -2E 42 85 12 52 D3 40 90 1A CD 04 44 41 44 44 00 -85 12 52 D3 00 A0 0A D4 06 44 41 44 44 2E 42 00 -85 12 52 D3 40 A0 FC D3 03 42 49 54 85 12 52 D3 -00 B0 28 D4 05 42 49 54 2E 42 85 12 52 D3 40 B0 -34 D4 03 42 49 43 85 12 52 D3 00 C0 42 D4 05 42 -49 43 2E 42 85 12 52 D3 40 C0 4E D4 03 42 49 53 -85 12 52 D3 00 D0 5C D4 05 42 49 53 2E 42 85 12 -52 D3 40 D0 00 00 03 58 4F 52 85 12 52 D3 00 E0 -76 D4 05 58 4F 52 2E 42 85 12 52 D3 40 E0 A8 D3 -03 41 4E 44 85 12 52 D3 00 F0 90 D4 05 41 4E 44 -2E 42 85 12 52 D3 40 F0 AC CA 46 D2 AE D4 0A 4C -3C F0 70 00 8A 10 3A F0 0F 00 0C DA 4F 3F E2 D3 -03 52 52 43 85 12 A8 D4 00 10 C0 D4 05 52 52 43 -2E 42 85 12 A8 D4 40 10 CC D4 04 53 57 50 42 00 -85 12 A8 D4 80 10 DA D4 03 52 52 41 85 12 A8 D4 -00 11 E8 D4 05 52 52 41 2E 42 85 12 A8 D4 40 11 -F4 D4 03 53 58 54 85 12 A8 D4 80 11 00 00 04 50 -55 53 48 00 85 12 A8 D4 00 12 0E D5 06 50 55 53 -48 2E 42 00 85 12 A8 D4 40 12 68 D4 04 43 41 4C -4C 00 85 12 A8 D4 80 12 1A 53 0E 4A 0D 12 84 12 -86 C7 18 C4 0D 6F 75 74 20 6F 66 20 62 6F 75 6E -64 73 3A CB 02 D5 03 53 3E 3D 86 12 00 38 56 D5 -02 53 3C 00 86 12 00 34 1C D5 03 30 3E 3D 86 12 -00 30 6A D5 02 30 3C 00 86 12 00 30 00 00 02 55 -3C 00 86 12 00 2C 7E D5 03 55 3E 3D 86 12 00 28 -74 D5 03 30 3C 3E 86 12 00 24 92 D5 02 30 3D 00 -86 12 00 20 00 00 02 49 46 00 1A 42 C6 21 8A 4E -00 00 A2 53 C6 21 0E 4A 30 4D 88 D5 04 54 48 45 -4E 00 1A 42 C6 21 08 4E 3E 4F 09 48 29 53 0A 89 -0A 11 3A 90 00 02 B1 2F 88 DA 00 00 30 4D 18 D4 -04 45 4C 53 45 00 1A 42 C6 21 BA 40 00 3C 00 00 -A2 53 C6 21 2F 83 8F 4A 00 00 E3 3F 2C D5 05 42 -45 47 49 4E 30 40 2C C4 BC D5 05 55 4E 54 49 4C -3A 4F 08 4E 3E 4F 19 42 C6 21 2A 83 0A 89 0A 11 -3A 90 00 FE 8A 3B 3A F0 FF 03 08 DA 89 48 00 00 -A2 53 C6 21 30 4D 9C D4 05 41 47 41 49 4E 0A 4E -38 40 00 3C E7 3F 00 00 05 57 48 49 4C 45 0D 12 -84 12 AA D5 6C C6 10 C7 60 D5 06 52 45 50 45 41 -54 00 0D 12 84 12 3E D6 C2 D5 10 C7 6E D6 3D 41 -08 4E 3E 4F 2A 48 B2 92 C4 21 CB 2F 98 42 C6 21 -00 00 30 4D FE D5 03 42 57 31 85 12 6C D6 00 00 -86 D6 03 42 57 32 85 12 6C D6 00 00 92 D6 03 42 -57 33 85 12 6C D6 00 00 AA D6 3D 41 1A 42 C6 21 -28 4E B2 92 C4 21 88 2B BA 4F 00 00 A2 53 C6 21 -8E 4A 00 00 3E 4F 30 4D 00 00 03 46 57 31 85 12 -A8 D6 00 00 CA D6 03 46 57 32 85 12 A8 D6 00 00 -D6 D6 03 46 57 33 85 12 A8 D6 00 00 E2 D6 04 47 -4F 54 4F 00 2F 83 8F 4E 00 00 3E 40 00 3C 0D 12 -84 12 9E CB 88 CA 10 C7 00 00 05 3F 47 4F 54 4F -3E 90 00 30 F4 27 3E E0 00 04 3E B0 00 10 EF 27 -3E E0 00 08 EC 3F AC CA A4 D1 2C D7 92 53 C4 21 -3E 40 2C 00 84 12 DC C7 F6 C8 42 C4 AE CB 08 D3 -42 D7 0A 4E 3E 4F 1A 83 F7 32 29 4E 59 0E 0A 28 -08 4C 59 0A 01 28 0C 8A 08 8A 38 90 10 00 EC 2E -5A 0E AB 3E 2A 92 E8 2E 8A 10 5A 06 A6 3E 5A D6 -04 52 52 43 4D 00 85 12 26 D7 50 00 70 D7 04 52 -52 41 4D 00 85 12 26 D7 50 01 7E D7 04 52 4C 41 -4D 00 85 12 26 D7 50 02 8C D7 04 52 52 55 4D 00 -85 12 26 D7 50 03 9C D5 05 50 55 53 48 4D 85 12 -26 D7 00 15 A8 D7 04 50 4F 50 4D 00 85 12 26 D7 -00 17 +0D 12 84 12 14 C4 0F 73 74 61 63 6B 20 6D 69 73 +6D 61 74 63 68 21 36 C5 0C CD 81 3B 82 93 BE 21 +97 27 0D 12 84 12 0A C4 60 C8 5A CB 68 CD BC CC +60 C8 CA CB 09 49 4D 4D 45 44 49 41 54 45 18 42 +B6 21 F8 D0 80 00 00 00 30 4D B4 CB 06 43 52 45 +41 54 45 00 B0 12 12 CD BA 40 86 12 FC FF 8A 4A +FE FF C9 3F CC CD 04 43 4F 44 45 00 B0 12 12 CD +A2 82 C6 21 0D 12 84 12 0C D0 E6 CF 60 C8 00 00 +07 45 4E 44 43 4F 44 45 0D 12 84 12 68 CD 26 D0 +60 C8 78 CC 03 41 53 4D B2 40 EA CF DA 21 E6 3F +00 CE 06 45 4E 44 41 53 4D 00 0D 12 84 12 08 CE +44 D0 60 C8 00 00 05 43 4F 4C 4F 4E 1A 42 C6 21 +BA 40 0D 12 00 00 BA 40 84 12 02 00 A2 52 C6 21 +B2 43 BE 21 30 40 26 D0 00 00 05 4C 4F 32 48 49 +A2 83 C6 21 1A 42 C6 21 EE 3F B4 CD 85 48 49 32 +4C 4F 0D 12 84 12 28 C4 B4 CF 5A CB BC CC F4 CD +60 C8 9A CD 86 5B 54 48 45 4E 5D 00 30 4D 0C 4E +38 4F 3B 4F 39 4F 0E 4B 0E 5C 10 24 1B 83 06 30 +1C 83 04 30 19 53 F9 98 FF FF F5 27 2D 4D 3E 4F +30 4D 2F 53 9F 83 00 00 F9 23 2F 53 2D 53 F7 3F +84 CE 86 5B 45 4C 53 45 5D 00 0D 12 84 12 0A C4 +00 00 D8 C7 24 CC 2C C9 BA CB A0 C7 34 C4 1C CF +AE C7 14 C4 06 5B 54 48 45 4E 5D 00 8E CE F6 CE +B2 CE D4 CE 60 C8 AE C7 14 C4 06 5B 45 4C 53 45 +5D 00 8E CE 0C CF B2 CE D2 CE 60 C8 14 C4 04 5B +49 46 5D 00 8E CE D4 CE 3A C4 D2 CE 82 C7 14 C4 +05 0D 0A 6B 6F 20 5C C7 BC C4 AC C4 3A C4 D4 CE +C2 CE 84 5B 49 46 5D 00 0E 93 3E 4F C6 27 30 4D +2F 53 30 4D 32 CF 89 5B 44 45 46 49 4E 45 44 5D +0D 12 84 12 24 CC 2C C9 94 C9 40 CF 60 C8 46 CF +8B 5B 55 4E 44 45 46 49 4E 45 44 5D 0D 12 84 12 +50 CF F0 C7 60 C8 78 CF B2 4E 0A 18 2E 53 BE 12 +3E 4F 3D 41 90 3C 7C CB 06 4D 41 52 4B 45 52 00 +B0 12 12 CD BA 40 85 12 FC FF BA 40 76 CF FE FF +28 83 8A 48 00 00 BA 40 AA C4 04 00 B2 50 06 00 +C6 21 DD 3E 2E 53 30 4D 0A C4 CA 21 E8 C7 60 C8 +85 12 B8 CF 14 CE E6 CD 10 C7 90 CC 6C CE D2 C6 +88 CF 12 C9 B0 D0 C4 D0 9C C8 26 C9 00 00 60 CF +CE CC F4 C9 00 00 85 12 B8 CF 74 D6 DA D6 1C D6 +2A D7 E2 D5 00 00 AE D3 00 00 F2 D7 D6 D7 46 D6 +84 D6 BE D4 00 00 00 00 46 D7 E4 CF 3A 40 0C 00 +39 40 D6 21 08 49 28 53 19 83 18 83 E8 49 00 00 +1A 83 FA 23 30 4D 3A 40 0E 00 38 40 CA 21 09 48 +29 53 F8 49 00 00 18 53 1A 83 FB 23 30 4D 82 43 +CC 21 30 4D 92 42 CA 21 DA 21 30 4D C0 CF 3E D0 +44 D0 54 D0 1A 42 20 18 82 4A C8 21 2E 4E 82 4E +C6 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 DA CC 09 50 57 52 5F 53 +54 41 54 45 85 12 4C D0 FE D7 E0 C8 09 52 53 54 +5F 53 54 41 54 45 92 42 0A 18 98 D0 F3 3F 8A D0 +08 50 57 52 5F 48 45 52 45 00 92 42 C6 21 98 D0 +30 4D 9C D0 08 52 53 54 5F 48 45 52 45 00 92 42 +C6 21 0A 18 F2 3F 3E 90 0E 00 DC 27 2E 92 E3 37 +0E 93 D8 37 39 40 10 00 29 83 B9 43 80 FF FC 23 +B9 40 22 D1 FE FF 29 83 B9 40 E0 C5 FE FF 39 90 +AE FF F9 23 39 40 14 18 B2 49 E2 C5 B2 49 FA C4 +B2 49 02 C4 B2 49 00 C6 B2 49 E0 FF B2 49 0A 18 +C2 3F B2 D0 03 00 04 01 B2 D0 10 00 00 01 B2 40 +80 5A CC 01 31 40 E0 20 3F 40 80 20 39 40 00 10 +29 83 89 43 00 20 FC 23 B2 43 02 02 B2 D3 06 02 +D2 43 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 00 01 B2 D0 10 00 86 01 +38 40 17 11 18 83 FE 23 19 83 FA 23 1E 42 08 18 +82 43 08 18 1E D2 5E 01 B0 12 F8 C4 FE C5 38 40 +C0 21 0A 4E 39 48 2E 48 09 5E 1E 52 C4 21 09 9E +03 24 7A 9E FC 27 1E 83 0A 4E 2A 88 82 4A C4 21 +30 4D 1C 15 0E 12 12 12 C4 21 84 12 2C C9 94 C9 +F0 C7 34 C4 EE D1 50 CA 34 C4 08 D2 02 D2 F0 D1 +3C 4E 3C 80 87 12 05 24 1C 53 02 20 2E 4E 01 3C +2E 83 21 52 1B 17 30 41 0A D2 B2 41 C4 21 3E 41 +84 12 0A C4 2B 00 2C C9 94 C9 F0 C7 34 C4 26 D2 +50 CA 34 C4 22 CC BA C7 2C C9 50 CA 34 C4 22 CC +32 D2 3E 5F E7 3F 3E 40 28 00 B0 12 D2 D1 19 42 +C6 21 A2 53 C6 21 89 4E 00 00 3E 40 29 00 92 92 +C0 21 C4 21 02 20 30 40 80 CD 1C 15 12 12 C4 21 +92 53 C4 21 84 12 2C C9 50 CA 34 C4 7A D2 70 D2 +21 53 3E 90 10 00 C6 2B 7F 2D 7C D2 B2 41 C4 21 +C1 3F 0D 12 84 12 24 CC AE D1 8C D2 0C 43 1B 42 +C6 21 A2 53 C6 21 6A 4E 3E 4F 7A 90 23 00 27 20 +92 53 C4 21 B0 12 D2 D1 3C 40 00 03 0E 93 1C 24 +3C 40 10 03 1E 93 18 24 3C 40 20 03 2E 93 14 24 +3C 40 20 02 2E 92 10 24 3C 40 30 02 3E 92 0C 24 +3C 40 30 03 3E 93 08 24 3C 40 30 00 19 42 C6 21 +A2 53 C6 21 89 4E 00 00 3E 4F 3D 41 30 4D 7A 90 +26 00 07 20 3C 40 10 02 92 53 C4 21 B0 12 D2 D1 +ED 3F 7A 90 40 00 16 20 3C 40 20 00 92 53 C4 21 +B0 12 5A D2 0C 20 3C 50 10 00 3E 40 2B 00 B0 12 +5A D2 92 92 C0 21 C4 21 02 24 92 53 C4 21 8E 10 +0C 5E DA 3F B0 12 5A D2 FA 23 3C 50 10 00 B0 12 +36 D2 EF 3F 0C 43 1B 42 C6 21 A2 53 C6 21 0D 12 +84 12 24 CC AE D1 58 D3 FE 90 26 00 00 00 3E 40 +20 00 03 20 3C 50 82 00 C7 3F B0 12 5A D2 E0 23 +3C 50 80 00 B0 12 36 D2 DB 3F 00 00 04 52 45 54 +49 00 0D 12 84 12 0A C4 00 13 5A CB 60 C8 0A C4 +2C 00 82 D2 4E D3 98 D3 09 4B 2E 4E 0E DC A2 3F +5A CE 03 4D 4F 56 85 12 8E D3 00 40 A2 D3 05 4D +4F 56 2E 42 85 12 8E D3 40 40 00 00 03 41 44 44 +85 12 8E D3 00 50 BC D3 05 41 44 44 2E 42 85 12 +8E D3 40 50 C8 D3 04 41 44 44 43 00 85 12 8E D3 +00 60 D6 D3 06 41 44 44 43 2E 42 00 85 12 8E D3 +40 60 7C D3 04 53 55 42 43 00 85 12 8E D3 00 70 +F4 D3 06 53 55 42 43 2E 42 00 85 12 8E D3 40 70 +02 D4 03 53 55 42 85 12 8E D3 00 80 12 D4 05 53 +55 42 2E 42 85 12 8E D3 40 80 36 CE 03 43 4D 50 +85 12 8E D3 00 90 2C D4 05 43 4D 50 2E 42 85 12 +8E D3 40 90 22 CE 04 44 41 44 44 00 85 12 8E D3 +00 A0 46 D4 06 44 41 44 44 2E 42 00 85 12 8E D3 +40 A0 38 D4 03 42 49 54 85 12 8E D3 00 B0 64 D4 +05 42 49 54 2E 42 85 12 8E D3 40 B0 70 D4 03 42 +49 43 85 12 8E D3 00 C0 7E D4 05 42 49 43 2E 42 +85 12 8E D3 40 C0 8A D4 03 42 49 53 85 12 8E D3 +00 D0 98 D4 05 42 49 53 2E 42 85 12 8E D3 40 D0 +00 00 03 58 4F 52 85 12 8E D3 00 E0 B2 D4 05 58 +4F 52 2E 42 85 12 8E D3 40 E0 E4 D3 03 41 4E 44 +85 12 8E D3 00 F0 CC D4 05 41 4E 44 2E 42 85 12 +8E D3 40 F0 24 CC 82 D2 EA D4 0A 4C 3C F0 70 00 +8A 10 3A F0 0F 00 0C DA 4F 3F 1E D4 03 52 52 43 +85 12 E4 D4 00 10 FC D4 05 52 52 43 2E 42 85 12 +E4 D4 40 10 08 D5 04 53 57 50 42 00 85 12 E4 D4 +80 10 16 D5 03 52 52 41 85 12 E4 D4 00 11 24 D5 +05 52 52 41 2E 42 85 12 E4 D4 40 11 30 D5 03 53 +58 54 85 12 E4 D4 80 11 00 00 04 50 55 53 48 00 +85 12 E4 D4 00 12 4A D5 06 50 55 53 48 2E 42 00 +85 12 E4 D4 40 12 A4 D4 04 43 41 4C 4C 00 85 12 +E4 D4 80 12 1A 53 0E 4A 0D 12 84 12 D6 C8 14 C4 +0D 6F 75 74 20 6F 66 20 62 6F 75 6E 64 73 36 C5 +3E D5 03 53 3E 3D 86 12 00 38 92 D5 02 53 3C 00 +86 12 00 34 58 D5 03 30 3E 3D 86 12 00 30 A6 D5 +02 30 3C 00 86 12 00 30 00 00 02 55 3C 00 86 12 +00 2C BA D5 03 55 3E 3D 86 12 00 28 B0 D5 03 30 +3C 3E 86 12 00 24 CE D5 02 30 3D 00 86 12 00 20 +00 00 02 49 46 00 1A 42 C6 21 8A 4E 00 00 A2 53 +C6 21 0E 4A 30 4D C4 D5 04 54 48 45 4E 00 1A 42 +C6 21 08 4E 3E 4F 09 48 29 53 0A 89 0A 11 3A 90 +00 02 B1 2F 88 DA 00 00 30 4D 54 D4 04 45 4C 53 +45 00 1A 42 C6 21 BA 40 00 3C 00 00 A2 53 C6 21 +2F 83 8F 4A 00 00 E3 3F 68 D5 05 42 45 47 49 4E +30 40 28 C4 F8 D5 05 55 4E 54 49 4C 3A 4F 08 4E +3E 4F 19 42 C6 21 2A 83 0A 89 0A 11 3A 90 00 FE +8A 3B 3A F0 FF 03 08 DA 89 48 00 00 A2 53 C6 21 +30 4D D8 D4 05 41 47 41 49 4E 0A 4E 38 40 00 3C +E7 3F 00 00 05 57 48 49 4C 45 0D 12 84 12 E6 D5 +BA C7 60 C8 9C D5 06 52 45 50 45 41 54 00 0D 12 +84 12 7A D6 FE D5 60 C8 AA D6 3D 41 08 4E 3E 4F +2A 48 B2 92 C4 21 CB 2F 98 42 C6 21 00 00 30 4D +3A D6 03 42 57 31 85 12 A8 D6 00 00 C2 D6 03 42 +57 32 85 12 A8 D6 00 00 CE D6 03 42 57 33 85 12 +A8 D6 00 00 E6 D6 3D 41 1A 42 C6 21 28 4E B2 92 +C4 21 88 2B BA 4F 00 00 A2 53 C6 21 8E 4A 00 00 +3E 4F 30 4D 00 00 03 46 57 31 85 12 E4 D6 00 00 +06 D7 03 46 57 32 85 12 E4 D6 00 00 12 D7 03 46 +57 33 85 12 E4 D6 00 00 1E D7 04 47 4F 54 4F 00 +2F 83 8F 4E 00 00 3E 40 00 3C 0D 12 84 12 92 CC +FE CB 60 C8 00 00 05 3F 47 4F 54 4F 3E 90 00 30 +F4 27 3E E0 00 04 3E B0 00 10 EF 27 3E E0 00 08 +EC 3F 24 CC AE D1 68 D7 92 53 C4 21 3E 40 2C 00 +84 12 2C C9 50 CA 34 C4 22 CC 44 D3 7E D7 0A 4E +3E 4F 1A 83 F7 32 29 4E 59 0E 0A 28 08 4C 59 0A +01 28 0C 8A 08 8A 38 90 10 00 EC 2E 5A 0E AB 3E +2A 92 E8 2E 8A 10 5A 06 A6 3E 96 D6 04 52 52 43 +4D 00 85 12 62 D7 50 00 AC D7 04 52 52 41 4D 00 +85 12 62 D7 50 01 BA D7 04 52 4C 41 4D 00 85 12 +62 D7 50 02 C8 D7 04 52 52 55 4D 00 85 12 62 D7 +50 03 D8 D5 05 50 55 53 48 4D 85 12 62 D7 00 15 +E4 D7 04 50 4F 50 4D 00 85 12 62 D7 00 17 @FF80 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -10 00 10 00 20 00 30 00 40 00 00 00 F4 D0 F4 D0 -F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 -F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 -F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 -18 C5 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 -F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F8 D0 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +77 00 10 00 12 00 14 00 16 00 00 00 E0 C5 E0 C5 +E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 +E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 +E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 +82 C6 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 +E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 22 D1 q diff --git a/binaries/CHIPSTICK_FR2433_16MHz_UART.txt b/binaries/CHIPSTICK_FR2433_16MHz_UART.txt index 9dc3882..db96a7c 100644 --- a/binaries/CHIPSTICK_FR2433_16MHz_UART.txt +++ b/binaries/CHIPSTICK_FR2433_16MHz_UART.txt @@ -1,331 +1,337 @@ @1800 -10 00 08 00 A1 F7 80 3E 05 00 18 00 CE D7 1C CF -32 01 63 30 7E C5 90 C5 5C D0 5C D0 20 C5 +80 3E 08 00 A1 F7 18 00 F9 FF 04 D8 0C D0 33 01 +10 00 81 36 94 C5 AA C4 C6 C5 9C C5 96 C6 04 D8 +0C D0 7C C6 94 C7 26 C7 00 C7 3C 21 62 C8 D4 C4 +E2 C4 EE C4 20 00 0A 00 2A CC 44 CC 00 00 00 00 @C400 -30 40 04 C4 B0 12 7E C5 12 D2 0A 18 F9 3F 2F 83 -8F 4E 00 00 3E 4D 30 4D 2F 82 8F 4E 02 00 7E 4D -8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D 2F 83 8F 4E -00 00 1E 42 C6 21 30 4D 0E 93 3E 4F 05 24 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 21 52 2D 53 30 4D 91 53 -00 00 F7 3F 0B 4E 1C 4F 02 00 2E 4F 0A 43 35 40 -20 00 0E 93 04 20 05 11 0E 4C 0C 43 09 43 0A 9B -01 28 0A 8B 09 69 08 68 15 83 07 30 0C 5C 0E 6E -0A 6A F5 2B 0A 8B 12 D3 F5 3F 35 40 E2 C4 8F 4A -02 00 8F 49 00 00 0E 48 30 41 82 4E C0 21 B2 4F -C2 21 3E 4F 82 43 C4 21 30 4D 3F 80 06 00 8F 4E -04 00 3E 40 54 00 BF 40 3C 21 00 00 AF 4F 02 00 -12 3C 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E 30 4D -2F 83 8F 4E 00 00 3E 41 2E 4E 30 4D 00 00 06 41 -43 43 45 50 54 00 08 4E 2E 4F 08 5E 39 40 0D 00 -3A 40 20 00 3B 40 52 C5 3C 40 5E C5 5D 15 70 3F -21 52 3A 17 58 42 0C 05 48 9C 08 2C 48 9B 30 24 -78 92 11 20 2E 9F 0F 24 1E 83 05 3C 0E 9A 03 24 -CE 48 00 00 1E 53 A2 B3 1C 05 FD 27 82 48 0E 05 -30 4D 54 C5 2D 83 92 B3 1C 05 E4 23 FC 27 82 93 -DE 21 02 24 92 53 DE 21 3E 8F 3D 41 B2 40 18 00 -0A 18 92 B3 1C 05 FD 27 58 42 0C 05 30 4D A2 B3 -1C 05 FD 27 B2 40 11 00 0E 05 E2 C2 22 02 30 41 -A2 B3 1C 05 FD 27 B2 40 13 00 0E 05 E2 D2 22 02 -30 41 B2 40 4F 5A CC 01 92 B3 0A 05 FD 23 B2 40 -04 A5 20 01 00 00 03 4B 45 59 30 40 BE C5 2F 83 -8F 4E 00 00 B0 12 7E C5 92 B3 1C 05 FD 27 1E 42 -0C 05 B0 12 90 C5 30 4D 00 00 04 45 4D 49 54 00 -30 40 E4 C5 08 4E 3E 4F AE 3F DA C5 04 45 43 48 -4F 00 B2 40 82 48 4C C5 82 43 DE 21 30 4D 00 00 -06 4E 4F 45 43 48 4F 00 B2 40 30 4D 4C C5 92 43 -DE 21 30 4D 00 00 04 54 59 50 45 00 0E 93 10 24 -0D 12 3D 40 36 C6 28 4F 2F 83 8F 4E 00 00 7E 48 -8F 48 02 00 D5 3F 38 C6 2D 83 1E 83 F4 23 3D 41 -2F 53 3E 4F 30 4D 00 00 02 43 52 00 30 40 50 C6 -0D 12 84 12 18 C4 02 0D 0A 00 1C C6 1C C7 2F 83 -8F 4E 00 00 30 4D 0E 93 FA 23 30 4D 8F 4E FE FF -AF 4F FC FF 2F 82 30 4D 2A 4F 8F 4E 00 00 0E 4A -30 4D 8F 4E FE FF 3E 40 80 20 0E 8F 0E 11 2F 83 -30 4D 2F 83 8F 4E 00 00 3E 41 30 4D 3E 8F 3E E3 -1E 53 30 4D BE 4F 00 00 3E 4F 30 4D 1E 83 0E 7E -30 4D 0E 5E 0E 7E 3E E3 30 4D 3E 8F 03 24 3E 43 -01 2C 0E F3 30 4D 00 00 02 3C 23 00 B2 40 B2 21 -B2 21 30 4D 48 C6 01 23 1B 42 DC 21 2C 4F 2F 83 -B0 12 7C C4 BF 4F 00 00 7A 90 0A 00 02 28 7A 50 -07 00 7A 50 30 00 92 83 B2 21 18 42 B2 21 C8 4A -00 00 30 4D D6 C6 02 23 53 00 0D 12 84 12 D8 C6 -12 C7 2D 83 09 93 E2 23 0E 93 E0 23 3D 41 30 4D -06 C7 02 23 3E 00 9F 42 B2 21 00 00 3E 40 B2 21 -2E 8F 30 4D 00 00 04 48 4F 4C 44 00 4A 4E 3E 4F -DA 3F 00 00 04 53 49 47 4E 00 0E 93 3E 4F 7A 40 -2D 00 D1 33 30 4D 16 C6 02 55 2E 00 08 43 2F 83 -8F 4E 00 00 0E 48 0D 12 0E 12 3E F3 06 34 BF E3 -00 00 3E E3 9F 53 00 00 0E 63 84 12 CC C6 0A C7 -92 C6 4A C7 26 C7 1C C6 B8 CA E0 C5 1C C7 00 C6 -01 2E 0E 93 E3 37 38 43 E2 3F 44 C7 82 53 22 00 -82 43 B4 21 0D 12 84 12 0E C4 18 C4 00 CA 0E C4 -22 00 E8 C7 B6 C7 B2 40 20 00 B4 21 6E 4E 1E 53 -1E B3 82 6E C6 21 3D 41 3E 4F 30 4D 90 C7 82 2E -22 00 0D 12 84 12 A0 C7 0E C4 1C C6 00 CA 1C C7 -00 00 04 57 4F 52 44 00 3C 40 C0 21 39 4C 3A 4C -09 5A 3A 5C 28 4C 09 9A 18 24 7E 9A FC 27 1A 83 -3B 40 60 00 15 42 B4 21 C8 4C 00 00 09 9A 0B 24 +B0 12 C6 C5 12 D2 06 18 FB 3F 2F 83 8F 4E 00 00 +3E 4D 30 4D 2F 82 8F 4E 02 00 7E 4D 8F 4D 00 00 +0D 5E 1D B3 0D 63 30 4D 2F 83 8F 4E 00 00 1E 42 +C6 21 30 4D 0E 93 3E 4F 11 20 2D 4D 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 F0 27 21 52 2D 53 30 4D +91 53 00 00 F7 3F 0B 4E 1C 4F 02 00 2E 4F 0A 43 +35 40 20 00 0E 93 04 20 05 11 0E 4C 0C 43 09 43 +0A 9B 01 28 0A 8B 09 69 08 68 15 83 07 30 0C 5C +0E 6E 0A 6A F5 2B 0A 8B 12 D3 F5 3F 35 40 D4 C4 +8F 4A 02 00 8F 49 00 00 0E 48 30 41 82 4E C0 21 +B2 4F C2 21 82 43 C4 21 3E 4F 30 4D 3F 80 06 00 +8F 4E 04 00 3E 40 54 00 BF 40 3C 21 00 00 AF 4F +02 00 D2 3C 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E +30 4D 2F 83 8F 4E 00 00 3E 41 2E 4E 30 4D 2F 83 +8F 4E 00 00 3E 41 30 4D B0 12 AA C4 39 40 22 18 +B2 49 7A C6 B2 49 92 C7 B2 49 24 C7 B2 49 FE C6 +B2 49 CA C4 34 49 35 49 36 49 37 49 B2 49 B4 21 +B2 49 DC 21 3D 41 30 40 D8 D0 8F 93 02 00 03 20 +2F 52 3E 4F 30 4D B0 12 C6 C5 92 C3 1C 05 18 42 +00 18 39 40 41 00 19 83 FE 23 18 83 FA 23 92 B3 +1C 05 F3 23 B0 12 F8 C4 0A C4 DE 21 E2 C7 34 C7 +14 C4 04 1B 5B 37 6D 00 5E C7 AA C7 34 C4 86 C5 +14 C4 0F 4C 41 53 54 2E 34 54 48 2C 20 6C 69 6E +65 20 5E C7 A2 C8 5E C7 14 C4 04 1B 5B 30 6D 00 +5E C7 2A CC 92 B3 0A 05 FD 23 30 41 2E 93 12 28 +B2 40 81 00 00 05 92 42 02 18 06 05 92 42 04 18 +08 05 F2 D0 30 00 0A 02 92 C3 00 05 92 D3 1A 05 +92 C3 30 01 30 41 09 3C A2 B3 1C 05 FD 27 B2 40 +13 00 0E 05 E2 D2 22 02 30 41 A2 B3 1C 05 FD 27 +B2 40 11 00 0E 05 E2 C2 22 02 30 41 00 00 04 57 +49 50 45 00 B2 43 08 18 04 3C 00 00 04 43 4F 4C +44 00 B0 12 94 C5 F2 B0 10 00 00 02 02 20 B2 43 +08 18 B2 40 04 A5 20 01 EE C5 04 57 41 52 4D 00 +B0 12 9C C5 84 12 14 C4 07 0D 0A 1B 5B 37 6D 23 +5E C7 D8 C8 14 C4 19 46 61 73 74 46 6F 72 74 68 +20 C2 A9 4A 2E 4D 2E 54 68 6F 6F 72 65 6E 73 20 +5E C7 0A C4 40 FF 28 C4 D6 C7 A2 C8 14 C4 0A 62 +79 74 65 73 20 66 72 65 65 00 3A C4 86 C5 00 00 +06 41 43 43 45 50 54 00 30 40 7C C6 08 4E 2E 4F +08 5E 39 40 0D 00 3A 40 20 00 3B 40 C8 C6 3C 40 +D4 C6 5D 15 B5 3E 21 52 3A 17 58 42 0C 05 48 9B +93 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 A2 B3 1C 05 +FD 27 C2 48 0E 05 30 4D CA C6 2D 83 92 B3 1C 05 +E4 23 FC 3F 3E 8F 3D 41 B2 40 18 00 06 18 92 B3 +1C 05 FD 27 58 42 0C 05 82 93 DE 21 02 24 92 53 +DE 21 08 4C E3 3F 00 00 03 4B 45 59 30 40 00 C7 +2F 83 8F 4E 00 00 B0 12 C6 C5 92 B3 1C 05 FD 27 +1E 42 0C 05 B0 12 C8 C5 30 4D 00 00 04 45 4D 49 +54 00 30 40 26 C7 08 4E 3E 4F C8 3F 1C C7 04 45 +43 48 4F 00 B2 40 C2 48 C2 C6 82 43 DE 21 30 4D +00 00 06 4E 4F 45 43 48 4F 00 B2 40 30 4D C2 C6 +92 43 DE 21 30 4D 00 00 04 54 59 50 45 00 0E 93 +11 24 0D 12 3D 40 7A C7 28 4F 2F 83 8F 4E 00 00 +7E 48 8F 48 02 00 10 42 24 C7 7C C7 2D 83 1E 83 +F3 23 3D 41 2F 53 3E 4F 30 4D FC C5 02 43 52 00 +30 40 94 C7 0D 12 84 12 14 C4 02 0D 0A 00 5E C7 +62 C8 2F 83 8F 4E 00 00 30 4D 0E 93 FA 23 30 4D +8F 4E FE FF AF 4F FC FF 2F 82 30 4D 2A 4F 8F 4E +00 00 0E 4A 30 4D 8F 4E FE FF 3E 40 80 20 0E 8F +0E 11 2F 83 30 4D 3E 8F 3E E3 1E 53 30 4D 70 C6 +01 40 2E 4E 30 4D E0 C7 01 21 BE 4F 00 00 3E 4F +30 4D 1E 83 0E 7E 30 4D 0E 5E 0E 7E 3E E3 30 4D +3E 8F 03 24 3E 43 01 2C 0E F3 30 4D 00 00 02 3C +23 00 B2 40 B2 21 B2 21 30 4D 8C C7 01 23 1B 42 +DC 21 2C 4F 2F 83 B0 12 6E C4 BF 4F 00 00 7A 90 +0A 00 02 28 7A 50 07 00 7A 50 30 00 92 83 B2 21 +18 42 B2 21 C8 4A 00 00 30 4D 1C C8 02 23 53 00 +0D 12 84 12 1E C8 58 C8 2D 83 09 93 E2 23 0E 93 +E0 23 3D 41 30 4D 4C C8 02 23 3E 00 9F 42 B2 21 +00 00 3E 40 B2 21 2E 8F 30 4D 00 00 04 48 4F 4C +44 00 4A 4E 3E 4F DA 3F 00 00 04 53 49 47 4E 00 +0E 93 3E 4F 7A 40 2D 00 D1 33 30 4D 58 C7 02 55 +2E 00 08 43 2F 83 8F 4E 00 00 0E 48 0D 12 0E 12 +3E F3 06 34 BF E3 00 00 3E E3 9F 53 00 00 0E 63 +84 12 12 C8 50 C8 EE C4 90 C8 6C C8 5E C7 26 CC +22 C7 62 C8 42 C7 01 2E 0E 93 E3 37 38 43 E2 3F +8A C8 82 53 22 00 82 43 B4 21 0D 12 84 12 0A C4 +14 C4 5C CB 0A C4 22 00 2E C9 FC C8 B2 40 20 00 +B4 21 6E 4E 1E 53 1E B3 82 6E C6 21 3E 4F 3D 41 +30 4D D6 C8 82 2E 22 00 0D 12 84 12 E6 C8 0A C4 +5E C7 5C CB 62 C8 1A C6 04 57 4F 52 44 00 3C 40 +C0 21 39 4C 3A 4C 09 5A 3A 5C 28 4C 09 9A 1D 24 +7E 9A FC 27 1A 83 3B 40 60 00 15 42 B4 21 FA 90 +27 00 00 00 01 20 05 43 C8 4C 00 00 09 9A 0B 24 7C 4A 4E 9C 08 24 18 53 4B 9C F6 2F 7C 90 7B 00 -F3 2F 4C 85 F1 3F 35 40 E2 C4 1A 82 C2 21 82 4A +F3 2F 4C 85 F1 3F 35 40 D4 C4 1A 82 C2 21 82 4A C4 21 1E 42 C6 21 08 8E CE 48 00 00 30 4D 00 00 04 46 49 4E 44 00 2F 83 0C 4E 66 4C 75 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 C5 48 96 F7 23 0A 4C FA 99 01 00 F3 23 1A 53 58 83 FA 23 19 B3 09 63 0C 49 CE 93 00 00 -1E 43 01 30 2E 83 8F 4C 00 00 36 40 F0 C4 35 40 -E2 C4 30 4D 00 00 07 3E 4E 55 4D 42 45 52 3C 4F +1E 43 01 30 2E 83 8F 4C 00 00 36 40 E2 C4 35 40 +D4 C4 30 4D 00 00 07 3E 4E 55 4D 42 45 52 3C 4F 38 4F 29 4F 2F 82 1B 42 DC 21 6A 4C 7A 80 30 00 7A 90 0A 00 05 28 7A 80 07 00 7A 90 0A 00 12 28 0A 9B 22 C3 0F 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 E3 23 8F 4C 00 00 8F 48 02 00 8F 49 04 00 30 4D 32 C0 00 02 1B 42 DC 21 0C 43 2D 15 3D 40 -4E C9 09 43 08 43 3F 82 8F 4E 06 00 0C 4E 7E 4C -6A 4C 7A 90 2D 00 04 28 C9 23 B1 43 02 00 0B 3C -2B 43 7A 80 25 00 07 24 3B 52 6A 53 04 24 3B 40 -10 00 5A 83 3A 20 1C 53 1E 83 EA 23 09 24 50 C9 -34 24 2D 83 7A 90 28 00 03 20 8F 93 04 00 C7 23 -32 B0 00 02 2A 20 32 D0 00 02 7A 90 F7 00 BF 27 -7A 90 F5 00 22 20 0A 4E 09 43 8F 49 02 00 5A 83 -09 4A 09 5C 69 49 79 80 30 00 79 90 0A 00 05 28 -79 80 07 00 79 90 0A 00 0A 28 09 9B 08 2C 8F 49 -00 00 0E 4B 2C 15 B0 12 74 C4 2A 17 E6 3F 9F 4F -04 00 02 00 AF 4F 04 00 4A 93 2B 17 0E 4C 82 4B -DC 21 06 24 32 C0 00 02 3F 50 06 00 0E F3 30 4D -2F 53 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 00 00 01 2C -1A 42 C6 21 8A 4E 00 00 A2 53 C6 21 3E 4F 30 4D -FE C9 87 4C 49 54 45 52 41 4C 82 93 BE 21 0C 24 -1A 42 C6 21 A2 52 C6 21 BA 40 0E C4 00 00 8A 4E -02 00 3E 4F 32 B0 00 02 32 C0 00 02 06 24 19 4A -02 00 8A 4E 02 00 0E 49 EB 3F 30 4D 22 C7 05 43 -4F 55 4E 54 2F 83 1E 53 8F 4E 00 00 5E 4E FF FF -30 4D 58 C7 05 54 52 45 41 54 0D 12 84 12 BA C4 -B8 CA E8 C7 76 CA A7 26 3D 40 7E CA E4 3E 80 CA -0A 4E 3E 4F 3D 40 9A CA 3C 27 3D 40 70 CA 1A E2 -BE 21 B6 27 0E 12 3E 4F 30 41 9C CA 3E 4F 3D 40 -70 CA BB 23 DE 53 00 00 68 4E 08 5E F8 40 3F 00 -00 00 3D 40 C2 CC CE 3F 86 12 20 00 00 00 04 51 -55 49 54 00 82 43 08 18 31 40 E0 20 B2 40 00 20 -00 20 82 43 BE 21 84 12 4C C6 CA C4 B8 CA E0 C5 -6A CA 82 C6 B2 C6 18 C4 0C 73 74 61 63 6B 20 65 -6D 70 74 79 21 00 3A CB 0E C4 40 FF 2C C4 BA C6 -18 C4 0A 46 52 41 4D 20 66 75 6C 6C 21 00 3A CB -3E C4 D8 CA FE C4 05 41 42 4F 52 54 3F 40 80 20 -D1 3F 16 CB 86 41 42 4F 52 54 22 00 0D 12 84 12 -A0 C7 0E C4 3A CB 00 CA 1C C7 8F 93 02 00 03 20 -2F 52 3E 4F 30 4D B0 12 1E D0 B0 12 7E C5 92 C3 -1C 05 18 42 06 18 39 40 41 00 19 83 FE 23 18 83 -FA 23 92 B3 1C 05 F3 23 0D 12 84 12 A4 CF 0E C4 -DE 21 F8 C4 F2 C5 18 C4 04 1B 5B 37 6D 00 1C C6 -66 C6 42 C4 92 CB 18 C4 05 6C 69 6E 65 3A 1C C6 -5C C7 1C C6 18 C4 04 1B 5B 30 6D 00 1C C6 1C CB -00 00 83 5B 27 5D 0D 12 84 12 BA CB 0E C4 0E C4 -00 CA 00 CA 1C C7 40 C8 01 27 0D 12 84 12 B8 CA -E8 C7 46 C8 42 C4 CA CB 1C C7 A4 CA C8 C6 81 5C -92 42 C0 21 C4 21 30 4D A2 CB 81 5B 82 43 BE 21 -30 4D CE CB 01 5D B2 43 BE 21 30 4D BE CA 88 50 -4F 53 54 50 4F 4E 45 00 0D 12 84 12 B8 CA E8 C7 -46 C8 66 C6 42 C4 CA CB B2 C6 42 C4 1A CC 0E C4 -0E C4 00 CA 00 CA 0E C4 00 CA 00 CA 1C C7 36 C7 -09 49 4D 4D 45 44 49 41 54 45 1A 42 B6 21 FA D0 -80 00 00 00 30 4D DA CB 01 3A 30 12 82 CC 92 B3 -C6 21 A2 63 C6 21 0D 12 84 12 B8 CA E8 C7 50 CC -3D 41 08 4E 7A 4E 5A D3 5A 53 0A 58 19 42 DA 21 -6E 4E 3E F0 1E 00 09 5E 3E 4F 82 48 B6 21 82 49 -B8 21 82 4A BA 21 82 4F BC 21 2A 52 82 4A C6 21 -30 41 BA 40 0D 12 FC FF BA 40 84 12 FE FF B2 43 -BE 21 30 4D 82 9F BC 21 09 20 18 42 B6 21 19 42 -B8 21 A8 49 FE FF 89 48 00 00 30 4D 0D 12 84 12 -18 C4 0F 73 74 61 63 6B 20 6D 69 73 6D 61 74 63 -68 21 46 CB 38 CC 81 3B 82 93 BE 21 81 27 0D 12 -84 12 0E C4 1C C7 00 CA 94 CC DC CB 1C C7 4E CA -06 43 52 45 41 54 45 00 B0 12 3E CC BA 40 86 12 -FC FF 8A 4A FE FF D5 3F E0 CC 04 43 4F 44 45 00 -B0 12 3E CC A2 82 C6 21 0D 12 84 12 1E CF F8 CE -1C C7 00 00 07 45 4E 44 43 4F 44 45 0D 12 84 12 -94 CC 38 CF 1C C7 24 CB 03 41 53 4D B2 40 FC CE -DA 21 E6 3F 14 CD 06 45 4E 44 41 53 4D 00 0D 12 -84 12 1C CD 56 CF 1C C7 00 00 05 43 4F 4C 4F 4E -1A 42 C6 21 BA 40 0D 12 00 00 BA 40 84 12 02 00 -A2 52 C6 21 B2 43 BE 21 30 40 38 CF 00 00 05 4C -4F 32 48 49 A2 83 C6 21 1A 42 C6 21 EE 3F 20 CC -85 48 49 32 4C 4F 0D 12 84 12 2C C4 C6 CE 00 CA -DC CB 08 CD 1C C7 C6 CC 86 5B 54 48 45 4E 5D 00 -30 4D 0C 4E 38 4F 3B 4F 39 4F 0E 4B 0E 5C 10 24 -1B 83 06 30 1C 83 04 30 19 53 F9 98 FF FF F5 27 -2D 4D 3E 4F 30 4D 2F 53 9F 83 00 00 F9 23 2F 53 -2D 53 F7 3F 98 CD 86 5B 45 4C 53 45 5D 00 0D 12 -84 12 0E C4 00 00 A0 C6 B8 CA E8 C7 54 CA 5E C6 -42 C4 30 CE 6C C6 18 C4 06 5B 54 48 45 4E 5D 00 -A2 CD 0A CE C6 CD E8 CD 1C C7 6C C6 18 C4 06 5B -45 4C 53 45 5D 00 A2 CD 20 CE C6 CD E6 CD 1C C7 -18 C4 04 5B 49 46 5D 00 A2 CD E8 CD 3E C4 E6 CD -40 C6 18 C4 05 0D 0A 6B 6F 20 1C C6 CA C4 BA C4 -3E C4 E8 CD D6 CD 84 5B 49 46 5D 00 0E 93 3E 4F -C6 27 30 4D 2F 53 30 4D 46 CE 89 5B 44 45 46 49 -4E 45 44 5D 0D 12 84 12 B8 CA E8 C7 46 C8 54 CE -1C C7 5A CE 8B 5B 55 4E 44 45 46 49 4E 45 44 5D -0D 12 84 12 64 CE AC C6 1C C7 8C CE 3D 41 B2 4E -0E 18 A2 4E 0C 18 3E 4F 8F 3C 12 CA 06 4D 41 52 -4B 45 52 00 B0 12 3E CC BA 40 85 12 FC FF BA 40 -8A CE FE FF 9A 42 C8 21 00 00 28 83 8A 48 02 00 -A2 52 C6 21 EA 3E 2E 53 30 4D 0E C4 CA 21 A4 C6 -1C C7 85 12 CA CE 28 CD FC D0 EC C5 B8 CB 80 CD -B6 C5 9C CE CE C7 C8 CF E2 CF 64 CA 56 D0 00 00 -74 CE E4 CB A6 C8 00 00 85 12 CA CE 44 D6 AA D6 -EC D5 FA D6 B2 D5 00 00 7E D3 00 00 C2 D7 A6 D7 -16 D6 54 D6 8E D4 00 00 00 00 16 D7 F6 CE 3A 40 +B0 CA 09 43 08 43 3F 82 8F 4E 06 00 0C 4E 7E 4C +FC 90 27 00 00 00 07 20 5C 4C 01 00 8F 4C 04 00 +7E 90 03 00 48 3C 6A 4C 7A 80 2D 00 04 28 BD 23 +B1 43 02 00 0A 3C 2B 43 7A 52 07 24 3B 52 6A 53 +04 24 3B 40 10 00 7A 53 36 20 1C 53 1E 83 EB 3F +B2 CA 31 24 2D 83 7A 90 28 00 C1 27 32 B0 00 02 +2A 20 32 D0 00 02 7A 90 F7 00 B9 27 7A 90 F5 00 +22 20 0A 4E 09 43 8F 49 02 00 5A 83 09 4A 09 5C +69 49 79 80 30 00 79 90 0A 00 05 28 79 80 07 00 +79 90 0A 00 0A 28 09 9B 08 2C 8F 49 00 00 0E 4B +2C 15 B0 12 66 C4 2A 17 E6 3F 9F 4F 04 00 02 00 +AF 4F 04 00 4A 93 2B 17 0E 4C 82 4B DC 21 06 24 +32 C0 00 02 3F 50 06 00 0E F3 30 4D 2F 53 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 00 00 01 2C 1A 42 C6 21 +8A 4E 00 00 A2 53 C6 21 3E 4F 30 4D E8 C7 05 41 +4C 4C 4F 54 82 5E C6 21 3E 4F 30 4D 5A CB 87 4C +49 54 45 52 41 4C 82 93 BE 21 0D 24 09 4E 1A 42 +C6 21 A2 52 C6 21 BA 40 0A C4 00 00 8A 49 02 00 +3E 4F 32 B0 00 02 32 C0 00 02 03 24 8A 4E 02 00 +EE 3F 30 4D 68 C8 05 43 4F 55 4E 54 2F 83 1E 53 +8F 4E 00 00 5E 4E FF FF 30 4D 7C C8 09 49 4E 54 +45 52 50 52 45 54 0D 12 84 12 AC C4 26 CC 2E C9 +E2 CB 94 26 3D 40 EA CB D6 3E EC CB 0A 4E 3E 4F +3D 40 06 CC 2E 27 3D 40 DC CB 1A E2 BE 21 AE 27 +0E 12 3E 4F 30 41 08 CC 3E 4F 3D 40 DC CB BB 23 +DE 53 00 00 68 4E 08 5E F8 40 3F 00 00 00 3D 40 +98 CD CC 3F 10 CC 86 12 20 00 3F 40 80 20 0E 43 +31 40 E0 20 B2 40 00 20 00 20 82 43 BE 21 84 12 +90 C7 BC C4 D6 CB C6 C7 F8 C7 14 C4 0C 73 74 61 +63 6B 20 65 6D 70 74 79 21 00 2A C5 0A C4 40 FF +28 C4 00 C8 14 C4 0A 46 52 41 4D 20 66 75 6C 6C +21 00 2A C5 3A C4 40 CC 6E CB 86 41 42 4F 52 54 +22 00 0D 12 84 12 E6 C8 0A C4 2A C5 5C CB 62 C8 +90 C9 01 27 0D 12 84 12 26 CC 2E C9 96 C9 34 C4 +24 CC 62 C8 00 00 83 5B 27 5D 0D 12 84 12 94 CC +0A C4 0A C4 5C CB 5C CB 62 C8 A6 CC 81 5B 82 43 +BE 21 30 4D 0E C8 01 5D B2 43 BE 21 30 4D C6 CC +81 5C 92 42 C0 21 C4 21 30 4D 00 00 88 50 4F 53 +54 50 4F 4E 45 00 0D 12 84 12 26 CC 2E C9 96 C9 +AA C7 34 C4 24 CC F8 C7 34 C4 08 CD 0A C4 0A C4 +5C CB 5C CB 0A C4 5C CB 5C CB 62 C8 BC CC 01 3A +30 12 58 CD 92 B3 C6 21 A2 63 C6 21 0D 12 84 12 +26 CC 2E C9 26 CD 3D 41 08 4E 7A 4E 5A D3 5A 53 +0A 58 19 42 DA 21 6E 4E 3E F0 1E 00 09 5E 3E 4F +82 48 B6 21 82 49 B8 21 82 4A BA 21 82 4F BC 21 +2A 52 82 4A C6 21 30 41 BA 40 0D 12 FC FF BA 40 +84 12 FE FF B2 43 BE 21 30 4D 82 9F BC 21 09 20 +18 42 B6 21 19 42 B8 21 A8 49 FE FF 89 48 00 00 +30 4D 0D 12 84 12 14 C4 0F 73 74 61 63 6B 20 6D +69 73 6D 61 74 63 68 21 36 C5 0E CD 81 3B 82 93 +BE 21 97 27 0D 12 84 12 0A C4 62 C8 5C CB 6A CD +BE CC 62 C8 CC CB 09 49 4D 4D 45 44 49 41 54 45 +18 42 B6 21 F8 D0 80 00 00 00 30 4D B6 CB 06 43 +52 45 41 54 45 00 B0 12 14 CD BA 40 86 12 FC FF +8A 4A FE FF C9 3F CE CD 04 43 4F 44 45 00 B0 12 +14 CD A2 82 C6 21 0D 12 84 12 0E D0 E8 CF 62 C8 +00 00 07 45 4E 44 43 4F 44 45 0D 12 84 12 6A CD +28 D0 62 C8 7A CC 03 41 53 4D B2 40 EC CF DA 21 +E6 3F 02 CE 06 45 4E 44 41 53 4D 00 0D 12 84 12 +0A CE 46 D0 62 C8 00 00 05 43 4F 4C 4F 4E 1A 42 +C6 21 BA 40 0D 12 00 00 BA 40 84 12 02 00 A2 52 +C6 21 B2 43 BE 21 30 40 28 D0 00 00 05 4C 4F 32 +48 49 A2 83 C6 21 1A 42 C6 21 EE 3F B6 CD 85 48 +49 32 4C 4F 0D 12 84 12 28 C4 B6 CF 5C CB BE CC +F6 CD 62 C8 9C CD 86 5B 54 48 45 4E 5D 00 30 4D +0C 4E 38 4F 3B 4F 39 4F 0E 4B 0E 5C 10 24 1B 83 +06 30 1C 83 04 30 19 53 F9 98 FF FF F5 27 2D 4D +3E 4F 30 4D 2F 53 9F 83 00 00 F9 23 2F 53 2D 53 +F7 3F 86 CE 86 5B 45 4C 53 45 5D 00 0D 12 84 12 +0A C4 00 00 DA C7 26 CC 2E C9 BC CB A2 C7 34 C4 +1E CF B0 C7 14 C4 06 5B 54 48 45 4E 5D 00 90 CE +F8 CE B4 CE D6 CE 62 C8 B0 C7 14 C4 06 5B 45 4C +53 45 5D 00 90 CE 0E CF B4 CE D4 CE 62 C8 14 C4 +04 5B 49 46 5D 00 90 CE D6 CE 3A C4 D4 CE 84 C7 +14 C4 05 0D 0A 6B 6F 20 5E C7 BC C4 AC C4 3A C4 +D6 CE C4 CE 84 5B 49 46 5D 00 0E 93 3E 4F C6 27 +30 4D 2F 53 30 4D 34 CF 89 5B 44 45 46 49 4E 45 +44 5D 0D 12 84 12 26 CC 2E C9 96 C9 42 CF 62 C8 +48 CF 8B 5B 55 4E 44 45 46 49 4E 45 44 5D 0D 12 +84 12 52 CF F2 C7 62 C8 7A CF B2 4E 0A 18 2E 53 +BE 12 3E 4F 3D 41 90 3C 7E CB 06 4D 41 52 4B 45 +52 00 B0 12 14 CD BA 40 85 12 FC FF BA 40 78 CF +FE FF 28 83 8A 48 00 00 BA 40 AA C4 04 00 B2 50 +06 00 C6 21 DD 3E 2E 53 30 4D 0A C4 CA 21 EA C7 +62 C8 85 12 BA CF 16 CE E8 CD 2E C7 92 CC 6E CE +F8 C6 8A CF 14 C9 B2 D0 C6 D0 9E C8 28 C9 00 00 +62 CF D0 CC F6 C9 00 00 85 12 BA CF 7A D6 E0 D6 +22 D6 30 D7 E8 D5 00 00 B4 D3 00 00 F8 D7 DC D7 +4C D6 8A D6 C4 D4 00 00 00 00 4C D7 E6 CF 3A 40 0C 00 39 40 D6 21 08 49 28 53 19 83 18 83 E8 49 00 00 1A 83 FA 23 30 4D 3A 40 0E 00 38 40 CA 21 09 48 29 53 F8 49 00 00 18 53 1A 83 FB 23 30 4D -82 43 CC 21 30 4D 92 42 CA 21 DA 21 30 4D D2 CE -50 CF 56 CF 66 CF 3A 4E 82 4A C8 21 2E 4E 82 4E -C6 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 EE CB 09 50 57 52 5F 53 -54 41 54 45 85 12 5E CF 1C CF CE D7 9C C7 09 52 -53 54 5F 53 54 41 54 45 92 42 0E 18 A8 CF 92 42 -0C 18 AA CF EF 3F 9A CF 08 50 57 52 5F 48 45 52 -45 00 92 42 C8 21 A8 CF 92 42 C6 21 AA CF 30 4D -AE CF 08 52 53 54 5F 48 45 52 45 00 92 42 C8 21 -0E 18 92 42 C6 21 0C 18 EC 3F E2 C7 04 57 49 50 -45 00 B2 40 1C CF 0E 18 B2 40 CE D7 0C 18 30 12 -B8 CF B2 40 04 C4 02 C4 B2 40 60 D0 5E D0 B2 40 -E4 C5 E2 C5 B2 40 50 C6 4E C6 B2 40 BE C5 BC C5 -B2 40 18 00 0A 18 34 40 1C C7 37 40 92 C6 36 40 -F0 C4 35 40 E2 C4 B2 40 20 00 B4 21 B2 40 0A 00 -DC 21 30 41 FC CF 04 57 41 52 4D 00 30 40 60 D0 -3D 40 B2 D0 92 C3 30 01 1E 42 08 18 00 40 F2 B0 -10 00 00 02 02 20 3E E3 1E 53 0E 93 19 24 13 34 -39 40 10 00 29 83 B9 43 80 FF FC 23 B9 40 06 D1 -FE FF 29 83 B9 40 02 D1 FE FF 39 90 AC FF F9 23 -B2 40 20 C5 E4 FF 0E 93 AC 33 2E 93 7B 27 84 2F -30 4D 18 C4 07 0D 0A 1B 5B 37 6D 23 1C C6 92 C7 -18 C4 19 46 61 73 74 46 6F 72 74 68 20 C2 A9 4A -2E 4D 2E 54 68 6F 6F 72 65 6E 73 20 1C C6 0E C4 -40 FF 2C C4 9C C6 5C C7 18 C4 0A 62 79 74 65 73 -20 66 72 65 65 00 3E C4 92 CB FA CC 04 43 4F 4C -44 00 30 40 A2 C5 B2 D0 03 00 04 01 B2 D0 10 00 -00 01 B2 40 80 5A CC 01 B2 43 02 02 B2 D3 06 02 -D2 43 24 02 F2 D3 26 02 F2 40 FD 00 22 02 E2 D2 -24 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 00 01 B2 D0 -10 00 86 01 92 D2 5E 01 08 18 38 40 59 14 18 83 -FE 23 19 83 FA 23 B2 40 81 00 00 05 92 42 02 18 -06 05 92 42 04 18 08 05 F2 D0 30 00 0A 02 92 C3 -00 05 92 D3 1A 05 39 40 00 10 29 83 89 43 00 20 -FC 23 31 40 E0 20 3F 40 80 20 30 12 5C D0 37 3F -38 40 C0 21 0A 4E 39 48 2E 48 09 5E 1E 52 C4 21 -09 9E 03 24 7A 9E FC 27 1E 83 0A 4E 2A 88 82 4A -C4 21 30 4D 1C 15 84 12 E8 C7 46 C8 38 C4 E8 D1 -02 C9 42 C4 CA CB 02 D2 EA D1 3C 4E 3C 80 87 12 -08 24 1C 53 02 20 2E 4E 04 3C 2E 53 1C 53 01 24 -2E 82 1B 17 30 41 3E 40 28 00 B0 12 D4 D1 19 42 -C6 21 A2 53 C6 21 89 4E 00 00 3E 40 29 00 1C 15 -92 92 C0 21 C4 21 02 20 30 40 AC CC 12 12 C4 21 -92 53 C4 21 84 12 E8 C7 02 C9 42 C4 4A D2 40 D2 -21 53 3E 90 10 00 80 2D DC 2B 4C D2 B2 41 C4 21 -D8 3F 0D 12 84 12 B8 CA B0 D1 5C D2 0C 43 1B 42 -C6 21 A2 53 C6 21 6A 4E 3E 4F 7A 90 23 00 27 20 -92 53 C4 21 B0 12 D4 D1 3C 40 00 03 0E 93 1C 24 -3C 40 10 03 1E 93 18 24 3C 40 20 03 2E 93 14 24 -3C 40 20 02 2E 92 10 24 3C 40 30 02 3E 92 0C 24 -3C 40 30 03 3E 93 08 24 3C 40 30 00 19 42 C6 21 -A2 53 C6 21 89 4E 00 00 3E 4F 3D 41 30 4D 7A 90 -26 00 07 20 3C 40 10 02 92 53 C4 21 B0 12 D4 D1 -ED 3F 7A 90 40 00 16 20 3C 40 20 00 92 53 C4 21 -B0 12 1E D2 0C 20 3C 50 10 00 3E 40 2B 00 B0 12 -1E D2 92 92 C0 21 C4 21 02 24 92 53 C4 21 8E 10 -0C 5E DA 3F B0 12 1E D2 FA 23 3C 50 10 00 B0 12 -06 D2 EF 3F 0C 43 1B 42 C6 21 A2 53 C6 21 0D 12 -84 12 B8 CA B0 D1 28 D3 FE 90 26 00 00 00 3E 40 -20 00 03 20 3C 50 82 00 C7 3F B0 12 1E D2 E0 23 -3C 50 80 00 B0 12 06 D2 DB 3F 00 00 04 52 45 54 -49 00 0D 12 84 12 0E C4 00 13 00 CA 1C C7 0E C4 -2C 00 52 D2 1E D3 68 D3 09 4B 2E 4E 0E DC A2 3F -6E CD 03 4D 4F 56 85 12 5E D3 00 40 72 D3 05 4D -4F 56 2E 42 85 12 5E D3 40 40 00 00 03 41 44 44 -85 12 5E D3 00 50 8C D3 05 41 44 44 2E 42 85 12 -5E D3 40 50 98 D3 04 41 44 44 43 00 85 12 5E D3 -00 60 A6 D3 06 41 44 44 43 2E 42 00 85 12 5E D3 -40 60 4C D3 04 53 55 42 43 00 85 12 5E D3 00 70 -C4 D3 06 53 55 42 43 2E 42 00 85 12 5E D3 40 70 -D2 D3 03 53 55 42 85 12 5E D3 00 80 E2 D3 05 53 -55 42 2E 42 85 12 5E D3 40 80 4A CD 03 43 4D 50 -85 12 5E D3 00 90 FC D3 05 43 4D 50 2E 42 85 12 -5E D3 40 90 36 CD 04 44 41 44 44 00 85 12 5E D3 -00 A0 16 D4 06 44 41 44 44 2E 42 00 85 12 5E D3 -40 A0 08 D4 03 42 49 54 85 12 5E D3 00 B0 34 D4 -05 42 49 54 2E 42 85 12 5E D3 40 B0 40 D4 03 42 -49 43 85 12 5E D3 00 C0 4E D4 05 42 49 43 2E 42 -85 12 5E D3 40 C0 5A D4 03 42 49 53 85 12 5E D3 -00 D0 68 D4 05 42 49 53 2E 42 85 12 5E D3 40 D0 -00 00 03 58 4F 52 85 12 5E D3 00 E0 82 D4 05 58 -4F 52 2E 42 85 12 5E D3 40 E0 B4 D3 03 41 4E 44 -85 12 5E D3 00 F0 9C D4 05 41 4E 44 2E 42 85 12 -5E D3 40 F0 B8 CA 52 D2 BA D4 0A 4C 3C F0 70 00 -8A 10 3A F0 0F 00 0C DA 4F 3F EE D3 03 52 52 43 -85 12 B4 D4 00 10 CC D4 05 52 52 43 2E 42 85 12 -B4 D4 40 10 D8 D4 04 53 57 50 42 00 85 12 B4 D4 -80 10 E6 D4 03 52 52 41 85 12 B4 D4 00 11 F4 D4 -05 52 52 41 2E 42 85 12 B4 D4 40 11 00 D5 03 53 -58 54 85 12 B4 D4 80 11 00 00 04 50 55 53 48 00 -85 12 B4 D4 00 12 1A D5 06 50 55 53 48 2E 42 00 -85 12 B4 D4 40 12 74 D4 04 43 41 4C 4C 00 85 12 -B4 D4 80 12 1A 53 0E 4A 0D 12 84 12 92 C7 18 C4 -0D 6F 75 74 20 6F 66 20 62 6F 75 6E 64 73 46 CB -0E D5 03 53 3E 3D 86 12 00 38 62 D5 02 53 3C 00 -86 12 00 34 28 D5 03 30 3E 3D 86 12 00 30 76 D5 -02 30 3C 00 86 12 00 30 00 00 02 55 3C 00 86 12 -00 2C 8A D5 03 55 3E 3D 86 12 00 28 80 D5 03 30 -3C 3E 86 12 00 24 9E D5 02 30 3D 00 86 12 00 20 -00 00 02 49 46 00 1A 42 C6 21 8A 4E 00 00 A2 53 -C6 21 0E 4A 30 4D 94 D5 04 54 48 45 4E 00 1A 42 -C6 21 08 4E 3E 4F 09 48 29 53 0A 89 0A 11 3A 90 -00 02 B1 2F 88 DA 00 00 30 4D 24 D4 04 45 4C 53 -45 00 1A 42 C6 21 BA 40 00 3C 00 00 A2 53 C6 21 -2F 83 8F 4A 00 00 E3 3F 38 D5 05 42 45 47 49 4E -30 40 2C C4 C8 D5 05 55 4E 54 49 4C 3A 4F 08 4E -3E 4F 19 42 C6 21 2A 83 0A 89 0A 11 3A 90 00 FE -8A 3B 3A F0 FF 03 08 DA 89 48 00 00 A2 53 C6 21 -30 4D A8 D4 05 41 47 41 49 4E 0A 4E 38 40 00 3C -E7 3F 00 00 05 57 48 49 4C 45 0D 12 84 12 B6 D5 -78 C6 1C C7 6C D5 06 52 45 50 45 41 54 00 0D 12 -84 12 4A D6 CE D5 1C C7 7A D6 3D 41 08 4E 3E 4F -2A 48 B2 92 C4 21 CB 2F 98 42 C6 21 00 00 30 4D -0A D6 03 42 57 31 85 12 78 D6 00 00 92 D6 03 42 -57 32 85 12 78 D6 00 00 9E D6 03 42 57 33 85 12 -78 D6 00 00 B6 D6 3D 41 1A 42 C6 21 28 4E B2 92 -C4 21 88 2B BA 4F 00 00 A2 53 C6 21 8E 4A 00 00 -3E 4F 30 4D 00 00 03 46 57 31 85 12 B4 D6 00 00 -D6 D6 03 46 57 32 85 12 B4 D6 00 00 E2 D6 03 46 -57 33 85 12 B4 D6 00 00 EE D6 04 47 4F 54 4F 00 -2F 83 8F 4E 00 00 3E 40 00 3C 0D 12 84 12 BA CB -94 CA 1C C7 00 00 05 3F 47 4F 54 4F 3E 90 00 30 -F4 27 3E E0 00 04 3E B0 00 10 EF 27 3E E0 00 08 -EC 3F B8 CA B0 D1 38 D7 92 53 C4 21 3E 40 2C 00 -84 12 E8 C7 02 C9 42 C4 CA CB 14 D3 4E D7 0A 4E -3E 4F 1A 83 F7 32 29 4E 59 0E 0A 28 08 4C 59 0A -01 28 0C 8A 08 8A 38 90 10 00 EC 2E 5A 0E AB 3E -2A 92 E8 2E 8A 10 5A 06 A6 3E 66 D6 04 52 52 43 -4D 00 85 12 32 D7 50 00 7C D7 04 52 52 41 4D 00 -85 12 32 D7 50 01 8A D7 04 52 4C 41 4D 00 85 12 -32 D7 50 02 98 D7 04 52 52 55 4D 00 85 12 32 D7 -50 03 A8 D5 05 50 55 53 48 4D 85 12 32 D7 00 15 -B4 D7 04 50 4F 50 4D 00 85 12 32 D7 00 17 +82 43 CC 21 30 4D 92 42 CA 21 DA 21 30 4D C2 CF +40 D0 46 D0 56 D0 1A 42 20 18 82 4A C8 21 2E 4E +82 4E C6 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 DC CC 09 50 57 52 +5F 53 54 41 54 45 85 12 4E D0 04 D8 E2 C8 09 52 +53 54 5F 53 54 41 54 45 92 42 0A 18 9A D0 F3 3F +8C D0 08 50 57 52 5F 48 45 52 45 00 92 42 C6 21 +9A D0 30 4D 9E D0 08 52 53 54 5F 48 45 52 45 00 +92 42 C6 21 0A 18 F2 3F 3E 90 0E 00 DC 27 2E 92 +E3 37 0E 93 D8 37 39 40 10 00 29 83 B9 43 80 FF +FC 23 B9 40 24 D1 FE FF 29 83 B9 40 02 C6 FE FF +39 90 AE FF F9 23 39 40 14 18 B2 49 04 C6 B2 49 +FA C4 B2 49 02 C4 B2 49 22 C6 B2 49 E4 FF B2 49 +0A 18 C2 3F B2 D0 03 00 04 01 B2 D0 10 00 00 01 +B2 40 80 5A CC 01 31 40 E0 20 3F 40 80 20 39 40 +00 10 29 83 89 43 00 20 FC 23 B2 43 02 02 B2 D3 +06 02 D2 43 24 02 F2 D3 26 02 F2 40 FD 00 22 02 +E2 D2 24 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 00 01 +B2 D0 10 00 86 01 38 40 17 11 18 83 FE 23 19 83 +FA 23 1E 42 08 18 82 43 08 18 1E D2 5E 01 B0 12 +F8 C4 20 C6 38 40 C0 21 0A 4E 39 48 2E 48 09 5E +1E 52 C4 21 09 9E 03 24 7A 9E FC 27 1E 83 0A 4E +2A 88 82 4A C4 21 30 4D 1C 15 0E 12 12 12 C4 21 +84 12 2E C9 96 C9 F2 C7 34 C4 F4 D1 52 CA 34 C4 +0E D2 08 D2 F6 D1 3C 4E 3C 80 87 12 05 24 1C 53 +02 20 2E 4E 01 3C 2E 83 21 52 1B 17 30 41 10 D2 +B2 41 C4 21 3E 41 84 12 0A C4 2B 00 2E C9 96 C9 +F2 C7 34 C4 2C D2 52 CA 34 C4 24 CC BC C7 2E C9 +52 CA 34 C4 24 CC 38 D2 3E 5F E7 3F 3E 40 28 00 +B0 12 D8 D1 19 42 C6 21 A2 53 C6 21 89 4E 00 00 +3E 40 29 00 92 92 C0 21 C4 21 02 20 30 40 82 CD +1C 15 12 12 C4 21 92 53 C4 21 84 12 2E C9 52 CA +34 C4 80 D2 76 D2 21 53 3E 90 10 00 C6 2B 7F 2D +82 D2 B2 41 C4 21 C1 3F 0D 12 84 12 26 CC B4 D1 +92 D2 0C 43 1B 42 C6 21 A2 53 C6 21 6A 4E 3E 4F +7A 90 23 00 27 20 92 53 C4 21 B0 12 D8 D1 3C 40 +00 03 0E 93 1C 24 3C 40 10 03 1E 93 18 24 3C 40 +20 03 2E 93 14 24 3C 40 20 02 2E 92 10 24 3C 40 +30 02 3E 92 0C 24 3C 40 30 03 3E 93 08 24 3C 40 +30 00 19 42 C6 21 A2 53 C6 21 89 4E 00 00 3E 4F +3D 41 30 4D 7A 90 26 00 07 20 3C 40 10 02 92 53 +C4 21 B0 12 D8 D1 ED 3F 7A 90 40 00 16 20 3C 40 +20 00 92 53 C4 21 B0 12 60 D2 0C 20 3C 50 10 00 +3E 40 2B 00 B0 12 60 D2 92 92 C0 21 C4 21 02 24 +92 53 C4 21 8E 10 0C 5E DA 3F B0 12 60 D2 FA 23 +3C 50 10 00 B0 12 3C D2 EF 3F 0C 43 1B 42 C6 21 +A2 53 C6 21 0D 12 84 12 26 CC B4 D1 5E D3 FE 90 +26 00 00 00 3E 40 20 00 03 20 3C 50 82 00 C7 3F +B0 12 60 D2 E0 23 3C 50 80 00 B0 12 3C D2 DB 3F +00 00 04 52 45 54 49 00 0D 12 84 12 0A C4 00 13 +5C CB 62 C8 0A C4 2C 00 88 D2 54 D3 9E D3 09 4B +2E 4E 0E DC A2 3F 5C CE 03 4D 4F 56 85 12 94 D3 +00 40 A8 D3 05 4D 4F 56 2E 42 85 12 94 D3 40 40 +00 00 03 41 44 44 85 12 94 D3 00 50 C2 D3 05 41 +44 44 2E 42 85 12 94 D3 40 50 CE D3 04 41 44 44 +43 00 85 12 94 D3 00 60 DC D3 06 41 44 44 43 2E +42 00 85 12 94 D3 40 60 82 D3 04 53 55 42 43 00 +85 12 94 D3 00 70 FA D3 06 53 55 42 43 2E 42 00 +85 12 94 D3 40 70 08 D4 03 53 55 42 85 12 94 D3 +00 80 18 D4 05 53 55 42 2E 42 85 12 94 D3 40 80 +38 CE 03 43 4D 50 85 12 94 D3 00 90 32 D4 05 43 +4D 50 2E 42 85 12 94 D3 40 90 24 CE 04 44 41 44 +44 00 85 12 94 D3 00 A0 4C D4 06 44 41 44 44 2E +42 00 85 12 94 D3 40 A0 3E D4 03 42 49 54 85 12 +94 D3 00 B0 6A D4 05 42 49 54 2E 42 85 12 94 D3 +40 B0 76 D4 03 42 49 43 85 12 94 D3 00 C0 84 D4 +05 42 49 43 2E 42 85 12 94 D3 40 C0 90 D4 03 42 +49 53 85 12 94 D3 00 D0 9E D4 05 42 49 53 2E 42 +85 12 94 D3 40 D0 00 00 03 58 4F 52 85 12 94 D3 +00 E0 B8 D4 05 58 4F 52 2E 42 85 12 94 D3 40 E0 +EA D3 03 41 4E 44 85 12 94 D3 00 F0 D2 D4 05 41 +4E 44 2E 42 85 12 94 D3 40 F0 26 CC 88 D2 F0 D4 +0A 4C 3C F0 70 00 8A 10 3A F0 0F 00 0C DA 4F 3F +24 D4 03 52 52 43 85 12 EA D4 00 10 02 D5 05 52 +52 43 2E 42 85 12 EA D4 40 10 0E D5 04 53 57 50 +42 00 85 12 EA D4 80 10 1C D5 03 52 52 41 85 12 +EA D4 00 11 2A D5 05 52 52 41 2E 42 85 12 EA D4 +40 11 36 D5 03 53 58 54 85 12 EA D4 80 11 00 00 +04 50 55 53 48 00 85 12 EA D4 00 12 50 D5 06 50 +55 53 48 2E 42 00 85 12 EA D4 40 12 AA D4 04 43 +41 4C 4C 00 85 12 EA D4 80 12 1A 53 0E 4A 0D 12 +84 12 D8 C8 14 C4 0D 6F 75 74 20 6F 66 20 62 6F +75 6E 64 73 36 C5 44 D5 03 53 3E 3D 86 12 00 38 +98 D5 02 53 3C 00 86 12 00 34 5E D5 03 30 3E 3D +86 12 00 30 AC D5 02 30 3C 00 86 12 00 30 00 00 +02 55 3C 00 86 12 00 2C C0 D5 03 55 3E 3D 86 12 +00 28 B6 D5 03 30 3C 3E 86 12 00 24 D4 D5 02 30 +3D 00 86 12 00 20 00 00 02 49 46 00 1A 42 C6 21 +8A 4E 00 00 A2 53 C6 21 0E 4A 30 4D CA D5 04 54 +48 45 4E 00 1A 42 C6 21 08 4E 3E 4F 09 48 29 53 +0A 89 0A 11 3A 90 00 02 B1 2F 88 DA 00 00 30 4D +5A D4 04 45 4C 53 45 00 1A 42 C6 21 BA 40 00 3C +00 00 A2 53 C6 21 2F 83 8F 4A 00 00 E3 3F 6E D5 +05 42 45 47 49 4E 30 40 28 C4 FE D5 05 55 4E 54 +49 4C 3A 4F 08 4E 3E 4F 19 42 C6 21 2A 83 0A 89 +0A 11 3A 90 00 FE 8A 3B 3A F0 FF 03 08 DA 89 48 +00 00 A2 53 C6 21 30 4D DE D4 05 41 47 41 49 4E +0A 4E 38 40 00 3C E7 3F 00 00 05 57 48 49 4C 45 +0D 12 84 12 EC D5 BC C7 62 C8 A2 D5 06 52 45 50 +45 41 54 00 0D 12 84 12 80 D6 04 D6 62 C8 B0 D6 +3D 41 08 4E 3E 4F 2A 48 B2 92 C4 21 CB 2F 98 42 +C6 21 00 00 30 4D 40 D6 03 42 57 31 85 12 AE D6 +00 00 C8 D6 03 42 57 32 85 12 AE D6 00 00 D4 D6 +03 42 57 33 85 12 AE D6 00 00 EC D6 3D 41 1A 42 +C6 21 28 4E B2 92 C4 21 88 2B BA 4F 00 00 A2 53 +C6 21 8E 4A 00 00 3E 4F 30 4D 00 00 03 46 57 31 +85 12 EA D6 00 00 0C D7 03 46 57 32 85 12 EA D6 +00 00 18 D7 03 46 57 33 85 12 EA D6 00 00 24 D7 +04 47 4F 54 4F 00 2F 83 8F 4E 00 00 3E 40 00 3C +0D 12 84 12 94 CC 00 CC 62 C8 00 00 05 3F 47 4F +54 4F 3E 90 00 30 F4 27 3E E0 00 04 3E B0 00 10 +EF 27 3E E0 00 08 EC 3F 26 CC B4 D1 6E D7 92 53 +C4 21 3E 40 2C 00 84 12 2E C9 52 CA 34 C4 24 CC +4A D3 84 D7 0A 4E 3E 4F 1A 83 F7 32 29 4E 59 0E +0A 28 08 4C 59 0A 01 28 0C 8A 08 8A 38 90 10 00 +EC 2E 5A 0E AB 3E 2A 92 E8 2E 8A 10 5A 06 A6 3E +9C D6 04 52 52 43 4D 00 85 12 68 D7 50 00 B2 D7 +04 52 52 41 4D 00 85 12 68 D7 50 01 C0 D7 04 52 +4C 41 4D 00 85 12 68 D7 50 02 CE D7 04 52 52 55 +4D 00 85 12 68 D7 50 03 DE D5 05 50 55 53 48 4D +85 12 68 D7 00 15 EA D7 04 50 4F 50 4D 00 85 12 +68 D7 00 17 @FF80 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -10 00 10 00 20 00 30 00 40 00 00 00 02 D1 02 D1 -02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 -02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 -02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 -02 D1 02 D1 20 C5 02 D1 02 D1 02 D1 02 D1 02 D1 -02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 06 D1 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +77 00 10 00 12 00 14 00 16 00 00 00 02 C6 02 C6 +02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 +02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 +02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 +02 C6 02 C6 96 C6 02 C6 02 C6 02 C6 02 C6 02 C6 +02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 24 D1 q diff --git a/binaries/CHIPSTICK_FR2433_1MHz_I2C.txt b/binaries/CHIPSTICK_FR2433_1MHz_I2C.txt index e49d060..04d25aa 100644 --- a/binaries/CHIPSTICK_FR2433_1MHz_I2C.txt +++ b/binaries/CHIPSTICK_FR2433_1MHz_I2C.txt @@ -1,329 +1,335 @@ @1800 -10 00 10 00 00 00 E8 03 05 00 F8 00 B0 D7 00 CF -32 01 63 00 64 C5 78 C5 40 D0 40 D0 18 C5 +E8 03 12 00 00 00 F8 00 F9 FF EC D7 0A D0 33 01 +10 00 81 06 B4 C5 AA C4 B6 C5 8A C5 82 C6 EC D7 +0A D0 70 C6 92 C7 FE C6 DA C6 3C 21 60 C8 D4 C4 +E2 C4 EE C4 20 00 0A 00 28 CC 42 CC 00 00 00 00 @C400 -30 40 04 C4 B0 12 64 C5 12 D2 0A 18 F9 3F 2F 83 -8F 4E 00 00 3E 4D 30 4D 2F 82 8F 4E 02 00 7E 4D -8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D 2F 83 8F 4E -00 00 1E 42 C6 21 30 4D 0E 93 3E 4F 05 24 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 21 52 2D 53 30 4D 91 53 -00 00 F7 3F 0B 4E 1C 4F 02 00 2E 4F 0A 43 35 40 -20 00 0E 93 04 20 05 11 0E 4C 0C 43 09 43 0A 9B -01 28 0A 8B 09 69 08 68 15 83 07 30 0C 5C 0E 6E -0A 6A F5 2B 0A 8B 12 D3 F5 3F 35 40 E2 C4 8F 4A -02 00 8F 49 00 00 0E 48 30 41 82 4E C0 21 B2 4F -C2 21 3E 4F 82 43 C4 21 30 4D 3F 80 06 00 8F 4E -04 00 3E 40 54 00 BF 40 3C 21 00 00 AF 4F 02 00 -12 3C 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E 30 4D -2F 83 8F 4E 00 00 3E 41 2E 4E 30 4D 00 00 06 41 -43 43 45 50 54 00 0A 4E 2E 4F 0A 5E 3B 40 0A 00 -3C 40 20 00 3D 15 74 3F 21 52 A2 C2 6C 05 B2 B0 -10 00 40 05 6D 23 3A 17 92 B3 6C 05 FD 27 58 42 -4C 05 48 9B 0E 24 48 9C 06 2C 78 92 F5 23 2E 9F -F3 27 1E 83 F1 3F 0E 9A EF 27 CE 48 00 00 1E 53 -EB 3F 82 93 DE 21 02 24 92 53 DE 21 3E 8F B0 12 -70 C5 30 4D 48 43 A2 B3 6C 05 FD 27 C2 48 4E 05 -B2 B0 40 00 48 05 FC 27 30 41 B2 40 4F 5A CC 01 -A2 B3 6C 05 FD 27 F2 40 03 00 4E 05 B0 12 70 C5 -B2 40 04 A5 20 01 00 00 03 4B 45 59 30 40 A0 C5 -2F 83 8F 4E 00 00 58 43 B0 12 66 C5 92 B3 6C 05 -FD 27 1E 42 4C 05 30 4D 00 00 04 45 4D 49 54 00 -30 40 C4 C5 08 4E 3E 4F A2 B3 6C 05 FD 27 82 48 -4E 05 30 4D BA C5 04 45 43 48 4F 00 B2 40 82 48 -CE C5 82 43 DE 21 38 40 05 00 B0 12 66 C5 30 4D -00 00 06 4E 4F 45 43 48 4F 00 B2 40 30 4D CE C5 -92 43 DE 21 28 42 F1 3F 00 00 04 54 59 50 45 00 -0E 93 10 24 0D 12 3D 40 2A C6 28 4F 2F 83 8F 4E -00 00 7E 48 8F 48 02 00 CB 3F 2C C6 2D 83 1E 83 -F4 23 3D 41 2F 53 3E 4F 30 4D 00 00 02 43 52 00 -30 40 44 C6 0D 12 84 12 18 C4 02 0D 0A 00 10 C6 -10 C7 2F 83 8F 4E 00 00 30 4D 0E 93 FA 23 30 4D -8F 4E FE FF AF 4F FC FF 2F 82 30 4D 2A 4F 8F 4E -00 00 0E 4A 30 4D 8F 4E FE FF 3E 40 80 20 0E 8F -0E 11 2F 83 30 4D 2F 83 8F 4E 00 00 3E 41 30 4D -3E 8F 3E E3 1E 53 30 4D BE 4F 00 00 3E 4F 30 4D +B0 12 B6 C5 12 D2 06 18 FB 3F 2F 83 8F 4E 00 00 +3E 4D 30 4D 2F 82 8F 4E 02 00 7E 4D 8F 4D 00 00 +0D 5E 1D B3 0D 63 30 4D 2F 83 8F 4E 00 00 1E 42 +C6 21 30 4D 0E 93 3E 4F 11 20 2D 4D 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 F0 27 21 52 2D 53 30 4D +91 53 00 00 F7 3F 0B 4E 1C 4F 02 00 2E 4F 0A 43 +35 40 20 00 0E 93 04 20 05 11 0E 4C 0C 43 09 43 +0A 9B 01 28 0A 8B 09 69 08 68 15 83 07 30 0C 5C +0E 6E 0A 6A F5 2B 0A 8B 12 D3 F5 3F 35 40 D4 C4 +8F 4A 02 00 8F 49 00 00 0E 48 30 41 82 4E C0 21 +B2 4F C2 21 82 43 C4 21 3E 4F 30 4D 3F 80 06 00 +8F 4E 04 00 3E 40 54 00 BF 40 3C 21 00 00 AF 4F +02 00 CC 3C 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E +30 4D 2F 83 8F 4E 00 00 3E 41 2E 4E 30 4D 2F 83 +8F 4E 00 00 3E 41 30 4D B0 12 AA C4 39 40 22 18 +B2 49 6E C6 B2 49 90 C7 B2 49 FC C6 B2 49 D8 C6 +B2 49 CA C4 34 49 35 49 36 49 37 49 B2 49 B4 21 +B2 49 DC 21 3D 41 30 40 D6 D0 8F 93 02 00 03 20 +2F 52 3E 4F 30 4D 68 43 B0 12 B8 C5 B0 12 F8 C4 +0A C4 DE 21 E0 C7 16 C7 4A C7 34 C4 28 CC 14 C4 +05 1B 5B 37 6D 40 5C C7 0A C4 02 18 E0 C7 D6 C8 +A8 C7 34 C4 7C C5 14 C4 0F 4C 41 53 54 2E 34 54 +48 2C 20 6C 69 6E 65 20 5C C7 A0 C8 5C C7 14 C4 +04 1B 5B 30 6D 00 5C C7 28 CC 2E 93 13 28 B2 D0 +C0 07 40 05 18 42 02 18 08 11 38 D0 00 04 82 48 +54 05 F2 D0 0C 00 0A 02 92 C3 40 05 A2 D2 6A 05 +92 C3 30 01 30 41 48 43 A2 B3 6C 05 FD 27 C2 48 +4E 05 A2 B2 6C 05 FD 27 30 41 00 00 04 57 49 50 +45 00 B2 43 08 18 04 3C 00 00 04 43 4F 4C 44 00 +B0 12 B4 C5 F2 B0 10 00 00 02 02 20 B2 43 08 18 +B2 40 04 A5 20 01 CC C5 04 57 41 52 4D 00 B0 12 +8A C5 78 40 03 00 B0 12 B8 C5 84 12 14 C4 07 0D +0A 1B 5B 37 6D 40 5C C7 0A C4 02 18 E0 C7 D6 C8 +0A C4 23 00 FA C6 D6 C8 14 C4 19 46 61 73 74 46 +6F 72 74 68 20 C2 A9 4A 2E 4D 2E 54 68 6F 6F 72 +65 6E 73 20 5C C7 0A C4 40 FF 28 C4 D4 C7 A0 C8 +14 C4 0A 62 79 74 65 73 20 66 72 65 65 00 3A C4 +7C C5 00 00 06 41 43 43 45 50 54 00 30 40 70 C6 +0A 4E 2E 4F 0A 5E 3B 40 0A 00 3C 40 20 00 3D 15 +BF 3E 21 52 A2 C2 6C 05 B2 B0 10 00 40 05 B8 22 +3A 17 92 B3 6C 05 FD 27 58 42 4C 05 48 9B 0E 24 +48 9C 06 2C 78 92 F5 23 2E 9F F3 27 1E 83 F1 3F +0E 9A EF 27 CE 48 00 00 1E 53 EB 3F 3E 8F B0 12 +C2 C5 82 93 DE 21 02 24 92 53 DE 21 08 4C 19 3C +00 00 03 4B 45 59 30 40 DA C6 2F 83 8F 4E 00 00 +58 43 B0 12 B8 C5 92 B3 6C 05 FD 27 1E 42 4C 05 +30 4D 00 00 04 45 4D 49 54 00 30 40 FE C6 08 4E +3E 4F A2 B3 6C 05 FD 27 C2 48 4E 05 30 4D F4 C6 +04 45 43 48 4F 00 B2 40 C2 48 08 C7 82 43 DE 21 +38 40 05 00 B0 12 B8 C5 30 4D 00 00 06 4E 4F 45 +43 48 4F 00 B2 40 30 4D 08 C7 92 43 DE 21 28 42 +F1 3F 2C C7 04 4F 56 45 52 00 8F 4E FE FF 2E 4F +2F 83 30 4D 00 00 04 54 59 50 45 00 0E 93 11 24 +0D 12 3D 40 78 C7 28 4F 2F 83 8F 4E 00 00 7E 48 +8F 48 02 00 10 42 FC C6 7A C7 2D 83 1E 83 F3 23 +3D 41 2F 53 3E 4F 30 4D DA C5 02 43 52 00 30 40 +92 C7 0D 12 84 12 14 C4 02 0D 0A 00 5C C7 60 C8 +2F 83 8F 4E 00 00 30 4D 0E 93 FA 23 30 4D 8F 4E +FE FF AF 4F FC FF 2F 82 30 4D 2A 4F 8F 4E 00 00 +0E 4A 30 4D 8F 4E FE FF 3E 40 80 20 0E 8F 0E 11 +2F 83 30 4D 3E 8F 3E E3 1E 53 30 4D 64 C6 01 40 +2E 4E 30 4D DE C7 01 21 BE 4F 00 00 3E 4F 30 4D 1E 83 0E 7E 30 4D 0E 5E 0E 7E 3E E3 30 4D 3E 8F 03 24 3E 43 01 2C 0E F3 30 4D 00 00 02 3C 23 00 -B2 40 B2 21 B2 21 30 4D 3C C6 01 23 1B 42 DC 21 -2C 4F 2F 83 B0 12 7C C4 BF 4F 00 00 7A 90 0A 00 +B2 40 B2 21 B2 21 30 4D 8A C7 01 23 1B 42 DC 21 +2C 4F 2F 83 B0 12 6E C4 BF 4F 00 00 7A 90 0A 00 02 28 7A 50 07 00 7A 50 30 00 92 83 B2 21 18 42 -B2 21 C8 4A 00 00 30 4D CA C6 02 23 53 00 0D 12 -84 12 CC C6 06 C7 2D 83 09 93 E2 23 0E 93 E0 23 -3D 41 30 4D FA C6 02 23 3E 00 9F 42 B2 21 00 00 +B2 21 C8 4A 00 00 30 4D 1A C8 02 23 53 00 0D 12 +84 12 1C C8 56 C8 2D 83 09 93 E2 23 0E 93 E0 23 +3D 41 30 4D 4A C8 02 23 3E 00 9F 42 B2 21 00 00 3E 40 B2 21 2E 8F 30 4D 00 00 04 48 4F 4C 44 00 4A 4E 3E 4F DA 3F 00 00 04 53 49 47 4E 00 0E 93 -3E 4F 7A 40 2D 00 D1 33 30 4D 0A C6 02 55 2E 00 +3E 4F 7A 40 2D 00 D1 33 30 4D 56 C7 02 55 2E 00 08 43 2F 83 8F 4E 00 00 0E 48 0D 12 0E 12 3E F3 06 34 BF E3 00 00 3E E3 9F 53 00 00 0E 63 84 12 -C0 C6 FE C6 86 C6 3E C7 1A C7 10 C6 AC CA C0 C5 -10 C7 F2 C5 01 2E 0E 93 E3 37 38 43 E2 3F 38 C7 -82 53 22 00 82 43 B4 21 0D 12 84 12 0E C4 18 C4 -F4 C9 0E C4 22 00 DC C7 AA C7 B2 40 20 00 B4 21 -6E 4E 1E 53 1E B3 82 6E C6 21 3D 41 3E 4F 30 4D -84 C7 82 2E 22 00 0D 12 84 12 94 C7 0E C4 10 C6 -F4 C9 10 C7 00 00 04 57 4F 52 44 00 3C 40 C0 21 -39 4C 3A 4C 09 5A 3A 5C 28 4C 09 9A 18 24 7E 9A -FC 27 1A 83 3B 40 60 00 15 42 B4 21 C8 4C 00 00 -09 9A 0B 24 7C 4A 4E 9C 08 24 18 53 4B 9C F6 2F -7C 90 7B 00 F3 2F 4C 85 F1 3F 35 40 E2 C4 1A 82 -C2 21 82 4A C4 21 1E 42 C6 21 08 8E CE 48 00 00 -30 4D 00 00 04 46 49 4E 44 00 2F 83 0C 4E 66 4C -75 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 C5 48 96 F7 23 0A 4C FA 99 -01 00 F3 23 1A 53 58 83 FA 23 19 B3 09 63 0C 49 -CE 93 00 00 1E 43 01 30 2E 83 8F 4C 00 00 36 40 -F0 C4 35 40 E2 C4 30 4D 00 00 07 3E 4E 55 4D 42 -45 52 3C 4F 38 4F 29 4F 2F 82 1B 42 DC 21 6A 4C -7A 80 30 00 7A 90 0A 00 05 28 7A 80 07 00 7A 90 -0A 00 12 28 0A 9B 22 C3 0F 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 E3 23 8F 4C 00 00 8F 48 02 00 -8F 49 04 00 30 4D 32 C0 00 02 1B 42 DC 21 0C 43 -2D 15 3D 40 42 C9 09 43 08 43 3F 82 8F 4E 06 00 -0C 4E 7E 4C 6A 4C 7A 90 2D 00 04 28 C9 23 B1 43 -02 00 0B 3C 2B 43 7A 80 25 00 07 24 3B 52 6A 53 -04 24 3B 40 10 00 5A 83 3A 20 1C 53 1E 83 EA 23 -09 24 44 C9 34 24 2D 83 7A 90 28 00 03 20 8F 93 -04 00 C7 23 32 B0 00 02 2A 20 32 D0 00 02 7A 90 -F7 00 BF 27 7A 90 F5 00 22 20 0A 4E 09 43 8F 49 -02 00 5A 83 09 4A 09 5C 69 49 79 80 30 00 79 90 -0A 00 05 28 79 80 07 00 79 90 0A 00 0A 28 09 9B -08 2C 8F 49 00 00 0E 4B 2C 15 B0 12 74 C4 2A 17 -E6 3F 9F 4F 04 00 02 00 AF 4F 04 00 4A 93 2B 17 -0E 4C 82 4B DC 21 06 24 32 C0 00 02 3F 50 06 00 -0E F3 30 4D 2F 53 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 -00 00 01 2C 1A 42 C6 21 8A 4E 00 00 A2 53 C6 21 -3E 4F 30 4D F2 C9 87 4C 49 54 45 52 41 4C 82 93 -BE 21 0C 24 1A 42 C6 21 A2 52 C6 21 BA 40 0E C4 -00 00 8A 4E 02 00 3E 4F 32 B0 00 02 32 C0 00 02 -06 24 19 4A 02 00 8A 4E 02 00 0E 49 EB 3F 30 4D -16 C7 05 43 4F 55 4E 54 2F 83 1E 53 8F 4E 00 00 -5E 4E FF FF 30 4D 4C C7 05 54 52 45 41 54 0D 12 -84 12 BA C4 AC CA DC C7 6A CA A7 26 3D 40 72 CA -E4 3E 74 CA 0A 4E 3E 4F 3D 40 8E CA 3C 27 3D 40 -64 CA 1A E2 BE 21 B6 27 0E 12 3E 4F 30 41 90 CA -3E 4F 3D 40 64 CA BB 23 DE 53 00 00 68 4E 08 5E -F8 40 3F 00 00 00 3D 40 A6 CC CE 3F 86 12 20 00 -00 00 04 51 55 49 54 00 82 43 08 18 31 40 E0 20 -B2 40 00 20 00 20 82 43 BE 21 84 12 40 C6 CA C4 -AC CA C0 C5 5E CA 76 C6 A6 C6 18 C4 0C 73 74 61 -63 6B 20 65 6D 70 74 79 21 00 2E CB 0E C4 40 FF -2C C4 AE C6 18 C4 0A 46 52 41 4D 20 66 75 6C 6C -21 00 2E CB 3E C4 CC CA FE C4 05 41 42 4F 52 54 -3F 40 80 20 D1 3F 0A CB 86 41 42 4F 52 54 22 00 -0D 12 84 12 94 C7 0E C4 2E CB F4 C9 10 C7 8F 93 -02 00 03 20 2F 52 3E 4F 30 4D B0 12 02 D0 68 43 -B0 12 66 C5 0D 12 84 12 88 CF 0E C4 DE 21 F8 C4 -DC C5 18 C4 05 1B 5B 37 6D 40 10 C6 0E C4 02 18 -F8 C4 86 C7 5A C6 42 C4 76 CB 18 C4 05 6C 69 6E -65 3A 10 C6 50 C7 10 C6 18 C4 04 1B 5B 30 6D 00 -10 C6 10 CB 00 00 83 5B 27 5D 0D 12 84 12 9E CB -0E C4 0E C4 F4 C9 F4 C9 10 C7 34 C8 01 27 0D 12 -84 12 AC CA DC C7 3A C8 42 C4 AE CB 10 C7 98 CA -BC C6 81 5C 92 42 C0 21 C4 21 30 4D 86 CB 81 5B -82 43 BE 21 30 4D B2 CB 01 5D B2 43 BE 21 30 4D -B2 CA 88 50 4F 53 54 50 4F 4E 45 00 0D 12 84 12 -AC CA DC C7 3A C8 5A C6 42 C4 AE CB A6 C6 42 C4 -FE CB 0E C4 0E C4 F4 C9 F4 C9 0E C4 F4 C9 F4 C9 -10 C7 2A C7 09 49 4D 4D 45 44 49 41 54 45 1A 42 -B6 21 FA D0 80 00 00 00 30 4D BE CB 01 3A 30 12 -66 CC 92 B3 C6 21 A2 63 C6 21 0D 12 84 12 AC CA -DC C7 34 CC 3D 41 08 4E 7A 4E 5A D3 5A 53 0A 58 +10 C8 4E C8 EE C4 8E C8 6A C8 5C C7 24 CC FA C6 +60 C8 44 C7 01 2E 0E 93 E3 37 38 43 E2 3F 88 C8 +82 53 22 00 82 43 B4 21 0D 12 84 12 0A C4 14 C4 +5A CB 0A C4 22 00 2C C9 FA C8 B2 40 20 00 B4 21 +6E 4E 1E 53 1E B3 82 6E C6 21 3E 4F 3D 41 30 4D +D4 C8 82 2E 22 00 0D 12 84 12 E4 C8 0A C4 5C C7 +5A CB 60 C8 F8 C5 04 57 4F 52 44 00 3C 40 C0 21 +39 4C 3A 4C 09 5A 3A 5C 28 4C 09 9A 1D 24 7E 9A +FC 27 1A 83 3B 40 60 00 15 42 B4 21 FA 90 27 00 +00 00 01 20 05 43 C8 4C 00 00 09 9A 0B 24 7C 4A +4E 9C 08 24 18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F +4C 85 F1 3F 35 40 D4 C4 1A 82 C2 21 82 4A C4 21 +1E 42 C6 21 08 8E CE 48 00 00 30 4D 00 00 04 46 +49 4E 44 00 2F 83 0C 4E 66 4C 75 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 C5 48 96 F7 23 0A 4C FA 99 01 00 F3 23 1A 53 +58 83 FA 23 19 B3 09 63 0C 49 CE 93 00 00 1E 43 +01 30 2E 83 8F 4C 00 00 36 40 E2 C4 35 40 D4 C4 +30 4D 00 00 07 3E 4E 55 4D 42 45 52 3C 4F 38 4F +29 4F 2F 82 1B 42 DC 21 6A 4C 7A 80 30 00 7A 90 +0A 00 05 28 7A 80 07 00 7A 90 0A 00 12 28 0A 9B +22 C3 0F 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 +E3 23 8F 4C 00 00 8F 48 02 00 8F 49 04 00 30 4D +32 C0 00 02 1B 42 DC 21 0C 43 2D 15 3D 40 AE CA +09 43 08 43 3F 82 8F 4E 06 00 0C 4E 7E 4C FC 90 +27 00 00 00 07 20 5C 4C 01 00 8F 4C 04 00 7E 90 +03 00 48 3C 6A 4C 7A 80 2D 00 04 28 BD 23 B1 43 +02 00 0A 3C 2B 43 7A 52 07 24 3B 52 6A 53 04 24 +3B 40 10 00 7A 53 36 20 1C 53 1E 83 EB 3F B0 CA +31 24 2D 83 7A 90 28 00 C1 27 32 B0 00 02 2A 20 +32 D0 00 02 7A 90 F7 00 B9 27 7A 90 F5 00 22 20 +0A 4E 09 43 8F 49 02 00 5A 83 09 4A 09 5C 69 49 +79 80 30 00 79 90 0A 00 05 28 79 80 07 00 79 90 +0A 00 0A 28 09 9B 08 2C 8F 49 00 00 0E 4B 2C 15 +B0 12 66 C4 2A 17 E6 3F 9F 4F 04 00 02 00 AF 4F +04 00 4A 93 2B 17 0E 4C 82 4B DC 21 06 24 32 C0 +00 02 3F 50 06 00 0E F3 30 4D 2F 53 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 00 00 01 2C 1A 42 C6 21 8A 4E +00 00 A2 53 C6 21 3E 4F 30 4D E6 C7 05 41 4C 4C +4F 54 82 5E C6 21 3E 4F 30 4D 58 CB 87 4C 49 54 +45 52 41 4C 82 93 BE 21 0D 24 09 4E 1A 42 C6 21 +A2 52 C6 21 BA 40 0A C4 00 00 8A 49 02 00 3E 4F +32 B0 00 02 32 C0 00 02 03 24 8A 4E 02 00 EE 3F +30 4D 66 C8 05 43 4F 55 4E 54 2F 83 1E 53 8F 4E +00 00 5E 4E FF FF 30 4D 7A C8 09 49 4E 54 45 52 +50 52 45 54 0D 12 84 12 AC C4 24 CC 2C C9 E0 CB +94 26 3D 40 E8 CB D6 3E EA CB 0A 4E 3E 4F 3D 40 +04 CC 2E 27 3D 40 DA CB 1A E2 BE 21 AE 27 0E 12 +3E 4F 30 41 06 CC 3E 4F 3D 40 DA CB BB 23 DE 53 +00 00 68 4E 08 5E F8 40 3F 00 00 00 3D 40 96 CD +CC 3F 0E CC 86 12 20 00 3F 40 80 20 0E 43 31 40 +E0 20 B2 40 00 20 00 20 82 43 BE 21 84 12 8E C7 +BC C4 D4 CB C4 C7 F6 C7 14 C4 0C 73 74 61 63 6B +20 65 6D 70 74 79 21 00 2A C5 0A C4 40 FF 28 C4 +FE C7 14 C4 0A 46 52 41 4D 20 66 75 6C 6C 21 00 +2A C5 3A C4 3E CC 6C CB 86 41 42 4F 52 54 22 00 +0D 12 84 12 E4 C8 0A C4 2A C5 5A CB 60 C8 8E C9 +01 27 0D 12 84 12 24 CC 2C C9 94 C9 34 C4 22 CC +60 C8 00 00 83 5B 27 5D 0D 12 84 12 92 CC 0A C4 +0A C4 5A CB 5A CB 60 C8 A4 CC 81 5B 82 43 BE 21 +30 4D 0C C8 01 5D B2 43 BE 21 30 4D C4 CC 81 5C +92 42 C0 21 C4 21 30 4D 00 00 88 50 4F 53 54 50 +4F 4E 45 00 0D 12 84 12 24 CC 2C C9 94 C9 A8 C7 +34 C4 22 CC F6 C7 34 C4 06 CD 0A C4 0A C4 5A CB +5A CB 0A C4 5A CB 5A CB 60 C8 BA CC 01 3A 30 12 +56 CD 92 B3 C6 21 A2 63 C6 21 0D 12 84 12 24 CC +2C C9 24 CD 3D 41 08 4E 7A 4E 5A D3 5A 53 0A 58 19 42 DA 21 6E 4E 3E F0 1E 00 09 5E 3E 4F 82 48 B6 21 82 49 B8 21 82 4A BA 21 82 4F BC 21 2A 52 82 4A C6 21 30 41 BA 40 0D 12 FC FF BA 40 84 12 FE FF B2 43 BE 21 30 4D 82 9F BC 21 09 20 18 42 B6 21 19 42 B8 21 A8 49 FE FF 89 48 00 00 30 4D -0D 12 84 12 18 C4 0F 73 74 61 63 6B 20 6D 69 73 -6D 61 74 63 68 21 3A CB 1C CC 81 3B 82 93 BE 21 -81 27 0D 12 84 12 0E C4 10 C7 F4 C9 78 CC C0 CB -10 C7 42 CA 06 43 52 45 41 54 45 00 B0 12 22 CC -BA 40 86 12 FC FF 8A 4A FE FF D5 3F C4 CC 04 43 -4F 44 45 00 B0 12 22 CC A2 82 C6 21 0D 12 84 12 -02 CF DC CE 10 C7 00 00 07 45 4E 44 43 4F 44 45 -0D 12 84 12 78 CC 1C CF 10 C7 18 CB 03 41 53 4D -B2 40 E0 CE DA 21 E6 3F F8 CC 06 45 4E 44 41 53 -4D 00 0D 12 84 12 00 CD 3A CF 10 C7 00 00 05 43 -4F 4C 4F 4E 1A 42 C6 21 BA 40 0D 12 00 00 BA 40 -84 12 02 00 A2 52 C6 21 B2 43 BE 21 30 40 1C CF -00 00 05 4C 4F 32 48 49 A2 83 C6 21 1A 42 C6 21 -EE 3F 04 CC 85 48 49 32 4C 4F 0D 12 84 12 2C C4 -AA CE F4 C9 C0 CB EC CC 10 C7 AA CC 86 5B 54 48 -45 4E 5D 00 30 4D 0C 4E 38 4F 3B 4F 39 4F 0E 4B -0E 5C 10 24 1B 83 06 30 1C 83 04 30 19 53 F9 98 -FF FF F5 27 2D 4D 3E 4F 30 4D 2F 53 9F 83 00 00 -F9 23 2F 53 2D 53 F7 3F 7C CD 86 5B 45 4C 53 45 -5D 00 0D 12 84 12 0E C4 00 00 94 C6 AC CA DC C7 -48 CA 52 C6 42 C4 14 CE 60 C6 18 C4 06 5B 54 48 -45 4E 5D 00 86 CD EE CD AA CD CC CD 10 C7 60 C6 -18 C4 06 5B 45 4C 53 45 5D 00 86 CD 04 CE AA CD -CA CD 10 C7 18 C4 04 5B 49 46 5D 00 86 CD CC CD -3E C4 CA CD 34 C6 18 C4 05 0D 0A 6B 6F 20 10 C6 -CA C4 BA C4 3E C4 CC CD BA CD 84 5B 49 46 5D 00 -0E 93 3E 4F C6 27 30 4D 2F 53 30 4D 2A CE 89 5B -44 45 46 49 4E 45 44 5D 0D 12 84 12 AC CA DC C7 -3A C8 38 CE 10 C7 3E CE 8B 5B 55 4E 44 45 46 49 -4E 45 44 5D 0D 12 84 12 48 CE A0 C6 10 C7 70 CE -3D 41 B2 4E 0E 18 A2 4E 0C 18 3E 4F 8F 3C 06 CA -06 4D 41 52 4B 45 52 00 B0 12 22 CC BA 40 85 12 -FC FF BA 40 6E CE FE FF 9A 42 C8 21 00 00 28 83 -8A 48 02 00 A2 52 C6 21 EA 3E 2E 53 30 4D 0E C4 -CA 21 98 C6 10 C7 85 12 AE CE 0C CD EE D0 D6 C5 -9C CB 64 CD 98 C5 80 CE C2 C7 AC CF C6 CF 58 CA -3A D0 00 00 58 CE C8 CB 9A C8 00 00 85 12 AE CE -26 D6 8C D6 CE D5 DC D6 94 D5 00 00 60 D3 00 00 -A4 D7 88 D7 F8 D5 36 D6 70 D4 00 00 00 00 F8 D6 -DA CE 3A 40 0C 00 39 40 D6 21 08 49 28 53 19 83 -18 83 E8 49 00 00 1A 83 FA 23 30 4D 3A 40 0E 00 -38 40 CA 21 09 48 29 53 F8 49 00 00 18 53 1A 83 -FB 23 30 4D 82 43 CC 21 30 4D 92 42 CA 21 DA 21 -30 4D B6 CE 34 CF 3A CF 4A CF 3A 4E 82 4A C8 21 -2E 4E 82 4E C6 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 D2 CB 09 50 -57 52 5F 53 54 41 54 45 85 12 42 CF 00 CF B0 D7 -90 C7 09 52 53 54 5F 53 54 41 54 45 92 42 0E 18 -8C CF 92 42 0C 18 8E CF EF 3F 7E CF 08 50 57 52 -5F 48 45 52 45 00 92 42 C8 21 8C CF 92 42 C6 21 -8E CF 30 4D 92 CF 08 52 53 54 5F 48 45 52 45 00 -92 42 C8 21 0E 18 92 42 C6 21 0C 18 EC 3F D6 C7 -04 57 49 50 45 00 B2 40 00 CF 0E 18 B2 40 B0 D7 -0C 18 30 12 9C CF B2 40 04 C4 02 C4 B2 40 44 D0 -42 D0 B2 40 C4 C5 C2 C5 B2 40 44 C6 42 C6 B2 40 -A0 C5 9E C5 B2 40 F8 00 0A 18 34 40 10 C7 37 40 -86 C6 36 40 F0 C4 35 40 E2 C4 B2 40 20 00 B4 21 -B2 40 0A 00 DC 21 30 41 E0 CF 04 57 41 52 4D 00 -30 40 44 D0 3D 40 96 D0 92 C3 30 01 1E 42 08 18 -00 40 F2 B0 10 00 00 02 02 20 3E E3 1E 53 0E 93 -19 24 13 34 39 40 10 00 29 83 B9 43 80 FF FC 23 -B9 40 F8 D0 FE FF 29 83 B9 40 F4 D0 FE FF 39 90 -AC FF F9 23 B2 40 18 C5 E0 FF 0E 93 AC 33 2E 93 -7B 27 84 2F 30 4D 18 C4 07 0D 0A 1B 5B 37 6D 40 -10 C6 0E C4 02 18 F8 C4 86 C7 0E C4 23 00 C0 C5 -86 C7 18 C4 19 46 61 73 74 46 6F 72 74 68 20 C2 -A9 4A 2E 4D 2E 54 68 6F 6F 72 65 6E 73 20 10 C6 -0E C4 40 FF 2C C4 90 C6 50 C7 18 C4 0A 62 79 74 -65 73 20 66 72 65 65 00 3E C4 76 CB DE CC 04 43 -4F 4C 44 00 30 40 7A C5 B2 D0 03 00 04 01 B2 D0 -10 00 00 01 B2 40 80 5A CC 01 B2 43 02 02 B2 D3 -06 02 D2 43 24 02 F2 D3 26 02 F2 40 FD 00 22 02 -E2 D2 24 02 B2 40 00 A5 60 01 B2 40 B4 00 80 01 -92 43 82 01 B2 40 1E 00 84 01 39 40 10 00 B2 D0 -10 00 86 01 92 D2 5E 01 08 18 38 40 59 14 18 83 -FE 23 19 83 FA 23 B2 D0 C0 07 40 05 18 42 02 18 -08 11 38 D0 00 04 82 48 54 05 F2 D0 0C 00 0A 02 -92 C3 40 05 A2 D2 6A 05 39 40 00 10 29 83 89 43 -00 20 FC 23 31 40 E0 20 3F 40 80 20 30 12 40 D0 -38 3F 38 40 C0 21 0A 4E 39 48 2E 48 09 5E 1E 52 -C4 21 09 9E 03 24 7A 9E FC 27 1E 83 0A 4E 2A 88 -82 4A C4 21 30 4D 1C 15 84 12 DC C7 3A C8 38 C4 -CA D1 F6 C8 42 C4 AE CB E4 D1 CC D1 3C 4E 3C 80 -87 12 08 24 1C 53 02 20 2E 4E 04 3C 2E 53 1C 53 -01 24 2E 82 1B 17 30 41 3E 40 28 00 B0 12 B6 D1 -19 42 C6 21 A2 53 C6 21 89 4E 00 00 3E 40 29 00 -1C 15 92 92 C0 21 C4 21 02 20 30 40 90 CC 12 12 -C4 21 92 53 C4 21 84 12 DC C7 F6 C8 42 C4 2C D2 -22 D2 21 53 3E 90 10 00 80 2D DC 2B 2E D2 B2 41 -C4 21 D8 3F 0D 12 84 12 AC CA 92 D1 3E D2 0C 43 -1B 42 C6 21 A2 53 C6 21 6A 4E 3E 4F 7A 90 23 00 -27 20 92 53 C4 21 B0 12 B6 D1 3C 40 00 03 0E 93 -1C 24 3C 40 10 03 1E 93 18 24 3C 40 20 03 2E 93 -14 24 3C 40 20 02 2E 92 10 24 3C 40 30 02 3E 92 -0C 24 3C 40 30 03 3E 93 08 24 3C 40 30 00 19 42 -C6 21 A2 53 C6 21 89 4E 00 00 3E 4F 3D 41 30 4D -7A 90 26 00 07 20 3C 40 10 02 92 53 C4 21 B0 12 -B6 D1 ED 3F 7A 90 40 00 16 20 3C 40 20 00 92 53 -C4 21 B0 12 00 D2 0C 20 3C 50 10 00 3E 40 2B 00 -B0 12 00 D2 92 92 C0 21 C4 21 02 24 92 53 C4 21 -8E 10 0C 5E DA 3F B0 12 00 D2 FA 23 3C 50 10 00 -B0 12 E8 D1 EF 3F 0C 43 1B 42 C6 21 A2 53 C6 21 -0D 12 84 12 AC CA 92 D1 0A D3 FE 90 26 00 00 00 -3E 40 20 00 03 20 3C 50 82 00 C7 3F B0 12 00 D2 -E0 23 3C 50 80 00 B0 12 E8 D1 DB 3F 00 00 04 52 -45 54 49 00 0D 12 84 12 0E C4 00 13 F4 C9 10 C7 -0E C4 2C 00 34 D2 00 D3 4A D3 09 4B 2E 4E 0E DC -A2 3F 52 CD 03 4D 4F 56 85 12 40 D3 00 40 54 D3 -05 4D 4F 56 2E 42 85 12 40 D3 40 40 00 00 03 41 -44 44 85 12 40 D3 00 50 6E D3 05 41 44 44 2E 42 -85 12 40 D3 40 50 7A D3 04 41 44 44 43 00 85 12 -40 D3 00 60 88 D3 06 41 44 44 43 2E 42 00 85 12 -40 D3 40 60 2E D3 04 53 55 42 43 00 85 12 40 D3 -00 70 A6 D3 06 53 55 42 43 2E 42 00 85 12 40 D3 -40 70 B4 D3 03 53 55 42 85 12 40 D3 00 80 C4 D3 -05 53 55 42 2E 42 85 12 40 D3 40 80 2E CD 03 43 -4D 50 85 12 40 D3 00 90 DE D3 05 43 4D 50 2E 42 -85 12 40 D3 40 90 1A CD 04 44 41 44 44 00 85 12 -40 D3 00 A0 F8 D3 06 44 41 44 44 2E 42 00 85 12 -40 D3 40 A0 EA D3 03 42 49 54 85 12 40 D3 00 B0 -16 D4 05 42 49 54 2E 42 85 12 40 D3 40 B0 22 D4 -03 42 49 43 85 12 40 D3 00 C0 30 D4 05 42 49 43 -2E 42 85 12 40 D3 40 C0 3C D4 03 42 49 53 85 12 -40 D3 00 D0 4A D4 05 42 49 53 2E 42 85 12 40 D3 -40 D0 00 00 03 58 4F 52 85 12 40 D3 00 E0 64 D4 -05 58 4F 52 2E 42 85 12 40 D3 40 E0 96 D3 03 41 -4E 44 85 12 40 D3 00 F0 7E D4 05 41 4E 44 2E 42 -85 12 40 D3 40 F0 AC CA 34 D2 9C D4 0A 4C 3C F0 -70 00 8A 10 3A F0 0F 00 0C DA 4F 3F D0 D3 03 52 -52 43 85 12 96 D4 00 10 AE D4 05 52 52 43 2E 42 -85 12 96 D4 40 10 BA D4 04 53 57 50 42 00 85 12 -96 D4 80 10 C8 D4 03 52 52 41 85 12 96 D4 00 11 -D6 D4 05 52 52 41 2E 42 85 12 96 D4 40 11 E2 D4 -03 53 58 54 85 12 96 D4 80 11 00 00 04 50 55 53 -48 00 85 12 96 D4 00 12 FC D4 06 50 55 53 48 2E -42 00 85 12 96 D4 40 12 56 D4 04 43 41 4C 4C 00 -85 12 96 D4 80 12 1A 53 0E 4A 0D 12 84 12 86 C7 -18 C4 0D 6F 75 74 20 6F 66 20 62 6F 75 6E 64 73 -3A CB F0 D4 03 53 3E 3D 86 12 00 38 44 D5 02 53 -3C 00 86 12 00 34 0A D5 03 30 3E 3D 86 12 00 30 -58 D5 02 30 3C 00 86 12 00 30 00 00 02 55 3C 00 -86 12 00 2C 6C D5 03 55 3E 3D 86 12 00 28 62 D5 -03 30 3C 3E 86 12 00 24 80 D5 02 30 3D 00 86 12 -00 20 00 00 02 49 46 00 1A 42 C6 21 8A 4E 00 00 -A2 53 C6 21 0E 4A 30 4D 76 D5 04 54 48 45 4E 00 -1A 42 C6 21 08 4E 3E 4F 09 48 29 53 0A 89 0A 11 -3A 90 00 02 B1 2F 88 DA 00 00 30 4D 06 D4 04 45 -4C 53 45 00 1A 42 C6 21 BA 40 00 3C 00 00 A2 53 -C6 21 2F 83 8F 4A 00 00 E3 3F 1A D5 05 42 45 47 -49 4E 30 40 2C C4 AA D5 05 55 4E 54 49 4C 3A 4F -08 4E 3E 4F 19 42 C6 21 2A 83 0A 89 0A 11 3A 90 -00 FE 8A 3B 3A F0 FF 03 08 DA 89 48 00 00 A2 53 -C6 21 30 4D 8A D4 05 41 47 41 49 4E 0A 4E 38 40 -00 3C E7 3F 00 00 05 57 48 49 4C 45 0D 12 84 12 -98 D5 6C C6 10 C7 4E D5 06 52 45 50 45 41 54 00 -0D 12 84 12 2C D6 B0 D5 10 C7 5C D6 3D 41 08 4E -3E 4F 2A 48 B2 92 C4 21 CB 2F 98 42 C6 21 00 00 -30 4D EC D5 03 42 57 31 85 12 5A D6 00 00 74 D6 -03 42 57 32 85 12 5A D6 00 00 80 D6 03 42 57 33 -85 12 5A D6 00 00 98 D6 3D 41 1A 42 C6 21 28 4E -B2 92 C4 21 88 2B BA 4F 00 00 A2 53 C6 21 8E 4A -00 00 3E 4F 30 4D 00 00 03 46 57 31 85 12 96 D6 -00 00 B8 D6 03 46 57 32 85 12 96 D6 00 00 C4 D6 -03 46 57 33 85 12 96 D6 00 00 D0 D6 04 47 4F 54 -4F 00 2F 83 8F 4E 00 00 3E 40 00 3C 0D 12 84 12 -9E CB 88 CA 10 C7 00 00 05 3F 47 4F 54 4F 3E 90 -00 30 F4 27 3E E0 00 04 3E B0 00 10 EF 27 3E E0 -00 08 EC 3F AC CA 92 D1 1A D7 92 53 C4 21 3E 40 -2C 00 84 12 DC C7 F6 C8 42 C4 AE CB F6 D2 30 D7 -0A 4E 3E 4F 1A 83 F7 32 29 4E 59 0E 0A 28 08 4C -59 0A 01 28 0C 8A 08 8A 38 90 10 00 EC 2E 5A 0E -AB 3E 2A 92 E8 2E 8A 10 5A 06 A6 3E 48 D6 04 52 -52 43 4D 00 85 12 14 D7 50 00 5E D7 04 52 52 41 -4D 00 85 12 14 D7 50 01 6C D7 04 52 4C 41 4D 00 -85 12 14 D7 50 02 7A D7 04 52 52 55 4D 00 85 12 -14 D7 50 03 8A D5 05 50 55 53 48 4D 85 12 14 D7 -00 15 96 D7 04 50 4F 50 4D 00 85 12 14 D7 00 17 +0D 12 84 12 14 C4 0F 73 74 61 63 6B 20 6D 69 73 +6D 61 74 63 68 21 36 C5 0C CD 81 3B 82 93 BE 21 +97 27 0D 12 84 12 0A C4 60 C8 5A CB 68 CD BC CC +60 C8 CA CB 09 49 4D 4D 45 44 49 41 54 45 18 42 +B6 21 F8 D0 80 00 00 00 30 4D B4 CB 06 43 52 45 +41 54 45 00 B0 12 12 CD BA 40 86 12 FC FF 8A 4A +FE FF C9 3F CC CD 04 43 4F 44 45 00 B0 12 12 CD +A2 82 C6 21 0D 12 84 12 0C D0 E6 CF 60 C8 00 00 +07 45 4E 44 43 4F 44 45 0D 12 84 12 68 CD 26 D0 +60 C8 78 CC 03 41 53 4D B2 40 EA CF DA 21 E6 3F +00 CE 06 45 4E 44 41 53 4D 00 0D 12 84 12 08 CE +44 D0 60 C8 00 00 05 43 4F 4C 4F 4E 1A 42 C6 21 +BA 40 0D 12 00 00 BA 40 84 12 02 00 A2 52 C6 21 +B2 43 BE 21 30 40 26 D0 00 00 05 4C 4F 32 48 49 +A2 83 C6 21 1A 42 C6 21 EE 3F B4 CD 85 48 49 32 +4C 4F 0D 12 84 12 28 C4 B4 CF 5A CB BC CC F4 CD +60 C8 9A CD 86 5B 54 48 45 4E 5D 00 30 4D 0C 4E +38 4F 3B 4F 39 4F 0E 4B 0E 5C 10 24 1B 83 06 30 +1C 83 04 30 19 53 F9 98 FF FF F5 27 2D 4D 3E 4F +30 4D 2F 53 9F 83 00 00 F9 23 2F 53 2D 53 F7 3F +84 CE 86 5B 45 4C 53 45 5D 00 0D 12 84 12 0A C4 +00 00 D8 C7 24 CC 2C C9 BA CB A0 C7 34 C4 1C CF +AE C7 14 C4 06 5B 54 48 45 4E 5D 00 8E CE F6 CE +B2 CE D4 CE 60 C8 AE C7 14 C4 06 5B 45 4C 53 45 +5D 00 8E CE 0C CF B2 CE D2 CE 60 C8 14 C4 04 5B +49 46 5D 00 8E CE D4 CE 3A C4 D2 CE 82 C7 14 C4 +05 0D 0A 6B 6F 20 5C C7 BC C4 AC C4 3A C4 D4 CE +C2 CE 84 5B 49 46 5D 00 0E 93 3E 4F C6 27 30 4D +2F 53 30 4D 32 CF 89 5B 44 45 46 49 4E 45 44 5D +0D 12 84 12 24 CC 2C C9 94 C9 40 CF 60 C8 46 CF +8B 5B 55 4E 44 45 46 49 4E 45 44 5D 0D 12 84 12 +50 CF F0 C7 60 C8 78 CF B2 4E 0A 18 2E 53 BE 12 +3E 4F 3D 41 90 3C 7C CB 06 4D 41 52 4B 45 52 00 +B0 12 12 CD BA 40 85 12 FC FF BA 40 76 CF FE FF +28 83 8A 48 00 00 BA 40 AA C4 04 00 B2 50 06 00 +C6 21 DD 3E 2E 53 30 4D 0A C4 CA 21 E8 C7 60 C8 +85 12 B8 CF 14 CE E6 CD 10 C7 90 CC 6C CE D2 C6 +88 CF 12 C9 B0 D0 C4 D0 9C C8 26 C9 00 00 60 CF +CE CC F4 C9 00 00 85 12 B8 CF 62 D6 C8 D6 0A D6 +18 D7 D0 D5 00 00 9C D3 00 00 E0 D7 C4 D7 34 D6 +72 D6 AC D4 00 00 00 00 34 D7 E4 CF 3A 40 0C 00 +39 40 D6 21 08 49 28 53 19 83 18 83 E8 49 00 00 +1A 83 FA 23 30 4D 3A 40 0E 00 38 40 CA 21 09 48 +29 53 F8 49 00 00 18 53 1A 83 FB 23 30 4D 82 43 +CC 21 30 4D 92 42 CA 21 DA 21 30 4D C0 CF 3E D0 +44 D0 54 D0 1A 42 20 18 82 4A C8 21 2E 4E 82 4E +C6 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 DA CC 09 50 57 52 5F 53 +54 41 54 45 85 12 4C D0 EC D7 E0 C8 09 52 53 54 +5F 53 54 41 54 45 92 42 0A 18 98 D0 F3 3F 8A D0 +08 50 57 52 5F 48 45 52 45 00 92 42 C6 21 98 D0 +30 4D 9C D0 08 52 53 54 5F 48 45 52 45 00 92 42 +C6 21 0A 18 F2 3F 3E 90 0E 00 DC 27 2E 92 E3 37 +0E 93 D8 37 39 40 10 00 29 83 B9 43 80 FF FC 23 +B9 40 22 D1 FE FF 29 83 B9 40 E0 C5 FE FF 39 90 +AE FF F9 23 39 40 14 18 B2 49 E2 C5 B2 49 FA C4 +B2 49 02 C4 B2 49 00 C6 B2 49 E0 FF B2 49 0A 18 +C2 3F B2 D0 03 00 04 01 B2 D0 10 00 00 01 B2 40 +80 5A CC 01 31 40 E0 20 3F 40 80 20 39 40 00 10 +29 83 89 43 00 20 FC 23 B2 43 02 02 B2 D3 06 02 +D2 43 24 02 F2 D3 26 02 F2 40 FD 00 22 02 B2 40 +00 A5 60 01 B2 40 B4 00 80 01 92 43 82 01 B2 40 +1E 00 84 01 39 40 10 00 B2 D0 10 00 86 01 38 40 +17 11 18 83 FE 23 19 83 FA 23 1E 42 08 18 82 43 +08 18 1E D2 5E 01 B0 12 F8 C4 FE C5 38 40 C0 21 +0A 4E 39 48 2E 48 09 5E 1E 52 C4 21 09 9E 03 24 +7A 9E FC 27 1E 83 0A 4E 2A 88 82 4A C4 21 30 4D +1C 15 0E 12 12 12 C4 21 84 12 2C C9 94 C9 F0 C7 +34 C4 DC D1 50 CA 34 C4 F6 D1 F0 D1 DE D1 3C 4E +3C 80 87 12 05 24 1C 53 02 20 2E 4E 01 3C 2E 83 +21 52 1B 17 30 41 F8 D1 B2 41 C4 21 3E 41 84 12 +0A C4 2B 00 2C C9 94 C9 F0 C7 34 C4 14 D2 50 CA +34 C4 22 CC BA C7 2C C9 50 CA 34 C4 22 CC 20 D2 +3E 5F E7 3F 3E 40 28 00 B0 12 C0 D1 19 42 C6 21 +A2 53 C6 21 89 4E 00 00 3E 40 29 00 92 92 C0 21 +C4 21 02 20 30 40 80 CD 1C 15 12 12 C4 21 92 53 +C4 21 84 12 2C C9 50 CA 34 C4 68 D2 5E D2 21 53 +3E 90 10 00 C6 2B 7F 2D 6A D2 B2 41 C4 21 C1 3F +0D 12 84 12 24 CC 9C D1 7A D2 0C 43 1B 42 C6 21 +A2 53 C6 21 6A 4E 3E 4F 7A 90 23 00 27 20 92 53 +C4 21 B0 12 C0 D1 3C 40 00 03 0E 93 1C 24 3C 40 +10 03 1E 93 18 24 3C 40 20 03 2E 93 14 24 3C 40 +20 02 2E 92 10 24 3C 40 30 02 3E 92 0C 24 3C 40 +30 03 3E 93 08 24 3C 40 30 00 19 42 C6 21 A2 53 +C6 21 89 4E 00 00 3E 4F 3D 41 30 4D 7A 90 26 00 +07 20 3C 40 10 02 92 53 C4 21 B0 12 C0 D1 ED 3F +7A 90 40 00 16 20 3C 40 20 00 92 53 C4 21 B0 12 +48 D2 0C 20 3C 50 10 00 3E 40 2B 00 B0 12 48 D2 +92 92 C0 21 C4 21 02 24 92 53 C4 21 8E 10 0C 5E +DA 3F B0 12 48 D2 FA 23 3C 50 10 00 B0 12 24 D2 +EF 3F 0C 43 1B 42 C6 21 A2 53 C6 21 0D 12 84 12 +24 CC 9C D1 46 D3 FE 90 26 00 00 00 3E 40 20 00 +03 20 3C 50 82 00 C7 3F B0 12 48 D2 E0 23 3C 50 +80 00 B0 12 24 D2 DB 3F 00 00 04 52 45 54 49 00 +0D 12 84 12 0A C4 00 13 5A CB 60 C8 0A C4 2C 00 +70 D2 3C D3 86 D3 09 4B 2E 4E 0E DC A2 3F 5A CE +03 4D 4F 56 85 12 7C D3 00 40 90 D3 05 4D 4F 56 +2E 42 85 12 7C D3 40 40 00 00 03 41 44 44 85 12 +7C D3 00 50 AA D3 05 41 44 44 2E 42 85 12 7C D3 +40 50 B6 D3 04 41 44 44 43 00 85 12 7C D3 00 60 +C4 D3 06 41 44 44 43 2E 42 00 85 12 7C D3 40 60 +6A D3 04 53 55 42 43 00 85 12 7C D3 00 70 E2 D3 +06 53 55 42 43 2E 42 00 85 12 7C D3 40 70 F0 D3 +03 53 55 42 85 12 7C D3 00 80 00 D4 05 53 55 42 +2E 42 85 12 7C D3 40 80 36 CE 03 43 4D 50 85 12 +7C D3 00 90 1A D4 05 43 4D 50 2E 42 85 12 7C D3 +40 90 22 CE 04 44 41 44 44 00 85 12 7C D3 00 A0 +34 D4 06 44 41 44 44 2E 42 00 85 12 7C D3 40 A0 +26 D4 03 42 49 54 85 12 7C D3 00 B0 52 D4 05 42 +49 54 2E 42 85 12 7C D3 40 B0 5E D4 03 42 49 43 +85 12 7C D3 00 C0 6C D4 05 42 49 43 2E 42 85 12 +7C D3 40 C0 78 D4 03 42 49 53 85 12 7C D3 00 D0 +86 D4 05 42 49 53 2E 42 85 12 7C D3 40 D0 00 00 +03 58 4F 52 85 12 7C D3 00 E0 A0 D4 05 58 4F 52 +2E 42 85 12 7C D3 40 E0 D2 D3 03 41 4E 44 85 12 +7C D3 00 F0 BA D4 05 41 4E 44 2E 42 85 12 7C D3 +40 F0 24 CC 70 D2 D8 D4 0A 4C 3C F0 70 00 8A 10 +3A F0 0F 00 0C DA 4F 3F 0C D4 03 52 52 43 85 12 +D2 D4 00 10 EA D4 05 52 52 43 2E 42 85 12 D2 D4 +40 10 F6 D4 04 53 57 50 42 00 85 12 D2 D4 80 10 +04 D5 03 52 52 41 85 12 D2 D4 00 11 12 D5 05 52 +52 41 2E 42 85 12 D2 D4 40 11 1E D5 03 53 58 54 +85 12 D2 D4 80 11 00 00 04 50 55 53 48 00 85 12 +D2 D4 00 12 38 D5 06 50 55 53 48 2E 42 00 85 12 +D2 D4 40 12 92 D4 04 43 41 4C 4C 00 85 12 D2 D4 +80 12 1A 53 0E 4A 0D 12 84 12 D6 C8 14 C4 0D 6F +75 74 20 6F 66 20 62 6F 75 6E 64 73 36 C5 2C D5 +03 53 3E 3D 86 12 00 38 80 D5 02 53 3C 00 86 12 +00 34 46 D5 03 30 3E 3D 86 12 00 30 94 D5 02 30 +3C 00 86 12 00 30 00 00 02 55 3C 00 86 12 00 2C +A8 D5 03 55 3E 3D 86 12 00 28 9E D5 03 30 3C 3E +86 12 00 24 BC D5 02 30 3D 00 86 12 00 20 00 00 +02 49 46 00 1A 42 C6 21 8A 4E 00 00 A2 53 C6 21 +0E 4A 30 4D B2 D5 04 54 48 45 4E 00 1A 42 C6 21 +08 4E 3E 4F 09 48 29 53 0A 89 0A 11 3A 90 00 02 +B1 2F 88 DA 00 00 30 4D 42 D4 04 45 4C 53 45 00 +1A 42 C6 21 BA 40 00 3C 00 00 A2 53 C6 21 2F 83 +8F 4A 00 00 E3 3F 56 D5 05 42 45 47 49 4E 30 40 +28 C4 E6 D5 05 55 4E 54 49 4C 3A 4F 08 4E 3E 4F +19 42 C6 21 2A 83 0A 89 0A 11 3A 90 00 FE 8A 3B +3A F0 FF 03 08 DA 89 48 00 00 A2 53 C6 21 30 4D +C6 D4 05 41 47 41 49 4E 0A 4E 38 40 00 3C E7 3F +00 00 05 57 48 49 4C 45 0D 12 84 12 D4 D5 BA C7 +60 C8 8A D5 06 52 45 50 45 41 54 00 0D 12 84 12 +68 D6 EC D5 60 C8 98 D6 3D 41 08 4E 3E 4F 2A 48 +B2 92 C4 21 CB 2F 98 42 C6 21 00 00 30 4D 28 D6 +03 42 57 31 85 12 96 D6 00 00 B0 D6 03 42 57 32 +85 12 96 D6 00 00 BC D6 03 42 57 33 85 12 96 D6 +00 00 D4 D6 3D 41 1A 42 C6 21 28 4E B2 92 C4 21 +88 2B BA 4F 00 00 A2 53 C6 21 8E 4A 00 00 3E 4F +30 4D 00 00 03 46 57 31 85 12 D2 D6 00 00 F4 D6 +03 46 57 32 85 12 D2 D6 00 00 00 D7 03 46 57 33 +85 12 D2 D6 00 00 0C D7 04 47 4F 54 4F 00 2F 83 +8F 4E 00 00 3E 40 00 3C 0D 12 84 12 92 CC FE CB +60 C8 00 00 05 3F 47 4F 54 4F 3E 90 00 30 F4 27 +3E E0 00 04 3E B0 00 10 EF 27 3E E0 00 08 EC 3F +24 CC 9C D1 56 D7 92 53 C4 21 3E 40 2C 00 84 12 +2C C9 50 CA 34 C4 22 CC 32 D3 6C D7 0A 4E 3E 4F +1A 83 F7 32 29 4E 59 0E 0A 28 08 4C 59 0A 01 28 +0C 8A 08 8A 38 90 10 00 EC 2E 5A 0E AB 3E 2A 92 +E8 2E 8A 10 5A 06 A6 3E 84 D6 04 52 52 43 4D 00 +85 12 50 D7 50 00 9A D7 04 52 52 41 4D 00 85 12 +50 D7 50 01 A8 D7 04 52 4C 41 4D 00 85 12 50 D7 +50 02 B6 D7 04 52 52 55 4D 00 85 12 50 D7 50 03 +C6 D5 05 50 55 53 48 4D 85 12 50 D7 00 15 D2 D7 +04 50 4F 50 4D 00 85 12 50 D7 00 17 @FF80 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -10 00 10 00 20 00 30 00 40 00 00 00 F4 D0 F4 D0 -F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 -F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 -F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 -18 C5 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 -F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F8 D0 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +77 00 10 00 12 00 14 00 16 00 00 00 E0 C5 E0 C5 +E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 +E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 +E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 +82 C6 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 +E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 22 D1 q diff --git a/binaries/CHIPSTICK_FR2433_1MHz_UART.txt b/binaries/CHIPSTICK_FR2433_1MHz_UART.txt index 0d1db1c..7e16da2 100644 --- a/binaries/CHIPSTICK_FR2433_1MHz_UART.txt +++ b/binaries/CHIPSTICK_FR2433_1MHz_UART.txt @@ -1,330 +1,336 @@ @1800 -10 00 08 00 00 D6 E8 03 05 00 18 00 BC D7 1C CF -32 01 63 30 7E C5 90 C5 5C D0 5C D0 20 C5 +E8 03 08 00 00 D6 18 00 F9 FF F2 D7 0C D0 33 01 +10 00 81 36 94 C5 AA C4 C6 C5 9C C5 96 C6 F2 D7 +0C D0 7C C6 94 C7 26 C7 00 C7 3C 21 62 C8 D4 C4 +E2 C4 EE C4 20 00 0A 00 2A CC 44 CC 00 00 00 00 @C400 -30 40 04 C4 B0 12 7E C5 12 D2 0A 18 F9 3F 2F 83 -8F 4E 00 00 3E 4D 30 4D 2F 82 8F 4E 02 00 7E 4D -8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D 2F 83 8F 4E -00 00 1E 42 C6 21 30 4D 0E 93 3E 4F 05 24 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 21 52 2D 53 30 4D 91 53 -00 00 F7 3F 0B 4E 1C 4F 02 00 2E 4F 0A 43 35 40 -20 00 0E 93 04 20 05 11 0E 4C 0C 43 09 43 0A 9B -01 28 0A 8B 09 69 08 68 15 83 07 30 0C 5C 0E 6E -0A 6A F5 2B 0A 8B 12 D3 F5 3F 35 40 E2 C4 8F 4A -02 00 8F 49 00 00 0E 48 30 41 82 4E C0 21 B2 4F -C2 21 3E 4F 82 43 C4 21 30 4D 3F 80 06 00 8F 4E -04 00 3E 40 54 00 BF 40 3C 21 00 00 AF 4F 02 00 -12 3C 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E 30 4D -2F 83 8F 4E 00 00 3E 41 2E 4E 30 4D 00 00 06 41 -43 43 45 50 54 00 08 4E 2E 4F 08 5E 39 40 0D 00 -3A 40 20 00 3B 40 52 C5 3C 40 5E C5 5D 15 70 3F -21 52 3A 17 58 42 0C 05 48 9C 08 2C 48 9B 30 24 -78 92 11 20 2E 9F 0F 24 1E 83 05 3C 0E 9A 03 24 -CE 48 00 00 1E 53 A2 B3 1C 05 FD 27 82 48 0E 05 -30 4D 54 C5 2D 83 92 B3 1C 05 E4 23 FC 27 82 93 -DE 21 02 24 92 53 DE 21 3E 8F 3D 41 B2 40 18 00 -0A 18 92 B3 1C 05 FD 27 58 42 0C 05 30 4D A2 B3 -1C 05 FD 27 B2 40 11 00 0E 05 E2 C2 22 02 30 41 -A2 B3 1C 05 FD 27 B2 40 13 00 0E 05 E2 D2 22 02 -30 41 B2 40 4F 5A CC 01 92 B3 0A 05 FD 23 B2 40 -04 A5 20 01 00 00 03 4B 45 59 30 40 BE C5 2F 83 -8F 4E 00 00 B0 12 7E C5 92 B3 1C 05 FD 27 1E 42 -0C 05 B0 12 90 C5 30 4D 00 00 04 45 4D 49 54 00 -30 40 E4 C5 08 4E 3E 4F AE 3F DA C5 04 45 43 48 -4F 00 B2 40 82 48 4C C5 82 43 DE 21 30 4D 00 00 -06 4E 4F 45 43 48 4F 00 B2 40 30 4D 4C C5 92 43 -DE 21 30 4D 00 00 04 54 59 50 45 00 0E 93 10 24 -0D 12 3D 40 36 C6 28 4F 2F 83 8F 4E 00 00 7E 48 -8F 48 02 00 D5 3F 38 C6 2D 83 1E 83 F4 23 3D 41 -2F 53 3E 4F 30 4D 00 00 02 43 52 00 30 40 50 C6 -0D 12 84 12 18 C4 02 0D 0A 00 1C C6 1C C7 2F 83 -8F 4E 00 00 30 4D 0E 93 FA 23 30 4D 8F 4E FE FF -AF 4F FC FF 2F 82 30 4D 2A 4F 8F 4E 00 00 0E 4A -30 4D 8F 4E FE FF 3E 40 80 20 0E 8F 0E 11 2F 83 -30 4D 2F 83 8F 4E 00 00 3E 41 30 4D 3E 8F 3E E3 -1E 53 30 4D BE 4F 00 00 3E 4F 30 4D 1E 83 0E 7E -30 4D 0E 5E 0E 7E 3E E3 30 4D 3E 8F 03 24 3E 43 -01 2C 0E F3 30 4D 00 00 02 3C 23 00 B2 40 B2 21 -B2 21 30 4D 48 C6 01 23 1B 42 DC 21 2C 4F 2F 83 -B0 12 7C C4 BF 4F 00 00 7A 90 0A 00 02 28 7A 50 -07 00 7A 50 30 00 92 83 B2 21 18 42 B2 21 C8 4A -00 00 30 4D D6 C6 02 23 53 00 0D 12 84 12 D8 C6 -12 C7 2D 83 09 93 E2 23 0E 93 E0 23 3D 41 30 4D -06 C7 02 23 3E 00 9F 42 B2 21 00 00 3E 40 B2 21 -2E 8F 30 4D 00 00 04 48 4F 4C 44 00 4A 4E 3E 4F -DA 3F 00 00 04 53 49 47 4E 00 0E 93 3E 4F 7A 40 -2D 00 D1 33 30 4D 16 C6 02 55 2E 00 08 43 2F 83 -8F 4E 00 00 0E 48 0D 12 0E 12 3E F3 06 34 BF E3 -00 00 3E E3 9F 53 00 00 0E 63 84 12 CC C6 0A C7 -92 C6 4A C7 26 C7 1C C6 B8 CA E0 C5 1C C7 00 C6 -01 2E 0E 93 E3 37 38 43 E2 3F 44 C7 82 53 22 00 -82 43 B4 21 0D 12 84 12 0E C4 18 C4 00 CA 0E C4 -22 00 E8 C7 B6 C7 B2 40 20 00 B4 21 6E 4E 1E 53 -1E B3 82 6E C6 21 3D 41 3E 4F 30 4D 90 C7 82 2E -22 00 0D 12 84 12 A0 C7 0E C4 1C C6 00 CA 1C C7 -00 00 04 57 4F 52 44 00 3C 40 C0 21 39 4C 3A 4C -09 5A 3A 5C 28 4C 09 9A 18 24 7E 9A FC 27 1A 83 -3B 40 60 00 15 42 B4 21 C8 4C 00 00 09 9A 0B 24 +B0 12 C6 C5 12 D2 06 18 FB 3F 2F 83 8F 4E 00 00 +3E 4D 30 4D 2F 82 8F 4E 02 00 7E 4D 8F 4D 00 00 +0D 5E 1D B3 0D 63 30 4D 2F 83 8F 4E 00 00 1E 42 +C6 21 30 4D 0E 93 3E 4F 11 20 2D 4D 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 F0 27 21 52 2D 53 30 4D +91 53 00 00 F7 3F 0B 4E 1C 4F 02 00 2E 4F 0A 43 +35 40 20 00 0E 93 04 20 05 11 0E 4C 0C 43 09 43 +0A 9B 01 28 0A 8B 09 69 08 68 15 83 07 30 0C 5C +0E 6E 0A 6A F5 2B 0A 8B 12 D3 F5 3F 35 40 D4 C4 +8F 4A 02 00 8F 49 00 00 0E 48 30 41 82 4E C0 21 +B2 4F C2 21 82 43 C4 21 3E 4F 30 4D 3F 80 06 00 +8F 4E 04 00 3E 40 54 00 BF 40 3C 21 00 00 AF 4F +02 00 D2 3C 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E +30 4D 2F 83 8F 4E 00 00 3E 41 2E 4E 30 4D 2F 83 +8F 4E 00 00 3E 41 30 4D B0 12 AA C4 39 40 22 18 +B2 49 7A C6 B2 49 92 C7 B2 49 24 C7 B2 49 FE C6 +B2 49 CA C4 34 49 35 49 36 49 37 49 B2 49 B4 21 +B2 49 DC 21 3D 41 30 40 D8 D0 8F 93 02 00 03 20 +2F 52 3E 4F 30 4D B0 12 C6 C5 92 C3 1C 05 18 42 +00 18 39 40 41 00 19 83 FE 23 18 83 FA 23 92 B3 +1C 05 F3 23 B0 12 F8 C4 0A C4 DE 21 E2 C7 34 C7 +14 C4 04 1B 5B 37 6D 00 5E C7 AA C7 34 C4 86 C5 +14 C4 0F 4C 41 53 54 2E 34 54 48 2C 20 6C 69 6E +65 20 5E C7 A2 C8 5E C7 14 C4 04 1B 5B 30 6D 00 +5E C7 2A CC 92 B3 0A 05 FD 23 30 41 2E 93 12 28 +B2 40 81 00 00 05 92 42 02 18 06 05 92 42 04 18 +08 05 F2 D0 30 00 0A 02 92 C3 00 05 92 D3 1A 05 +92 C3 30 01 30 41 09 3C A2 B3 1C 05 FD 27 B2 40 +13 00 0E 05 E2 D2 22 02 30 41 A2 B3 1C 05 FD 27 +B2 40 11 00 0E 05 E2 C2 22 02 30 41 00 00 04 57 +49 50 45 00 B2 43 08 18 04 3C 00 00 04 43 4F 4C +44 00 B0 12 94 C5 F2 B0 10 00 00 02 02 20 B2 43 +08 18 B2 40 04 A5 20 01 EE C5 04 57 41 52 4D 00 +B0 12 9C C5 84 12 14 C4 07 0D 0A 1B 5B 37 6D 23 +5E C7 D8 C8 14 C4 19 46 61 73 74 46 6F 72 74 68 +20 C2 A9 4A 2E 4D 2E 54 68 6F 6F 72 65 6E 73 20 +5E C7 0A C4 40 FF 28 C4 D6 C7 A2 C8 14 C4 0A 62 +79 74 65 73 20 66 72 65 65 00 3A C4 86 C5 00 00 +06 41 43 43 45 50 54 00 30 40 7C C6 08 4E 2E 4F +08 5E 39 40 0D 00 3A 40 20 00 3B 40 C8 C6 3C 40 +D4 C6 5D 15 B5 3E 21 52 3A 17 58 42 0C 05 48 9B +93 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 A2 B3 1C 05 +FD 27 C2 48 0E 05 30 4D CA C6 2D 83 92 B3 1C 05 +E4 23 FC 3F 3E 8F 3D 41 B2 40 18 00 06 18 92 B3 +1C 05 FD 27 58 42 0C 05 82 93 DE 21 02 24 92 53 +DE 21 08 4C E3 3F 00 00 03 4B 45 59 30 40 00 C7 +2F 83 8F 4E 00 00 B0 12 C6 C5 92 B3 1C 05 FD 27 +1E 42 0C 05 B0 12 C8 C5 30 4D 00 00 04 45 4D 49 +54 00 30 40 26 C7 08 4E 3E 4F C8 3F 1C C7 04 45 +43 48 4F 00 B2 40 C2 48 C2 C6 82 43 DE 21 30 4D +00 00 06 4E 4F 45 43 48 4F 00 B2 40 30 4D C2 C6 +92 43 DE 21 30 4D 00 00 04 54 59 50 45 00 0E 93 +11 24 0D 12 3D 40 7A C7 28 4F 2F 83 8F 4E 00 00 +7E 48 8F 48 02 00 10 42 24 C7 7C C7 2D 83 1E 83 +F3 23 3D 41 2F 53 3E 4F 30 4D FC C5 02 43 52 00 +30 40 94 C7 0D 12 84 12 14 C4 02 0D 0A 00 5E C7 +62 C8 2F 83 8F 4E 00 00 30 4D 0E 93 FA 23 30 4D +8F 4E FE FF AF 4F FC FF 2F 82 30 4D 2A 4F 8F 4E +00 00 0E 4A 30 4D 8F 4E FE FF 3E 40 80 20 0E 8F +0E 11 2F 83 30 4D 3E 8F 3E E3 1E 53 30 4D 70 C6 +01 40 2E 4E 30 4D E0 C7 01 21 BE 4F 00 00 3E 4F +30 4D 1E 83 0E 7E 30 4D 0E 5E 0E 7E 3E E3 30 4D +3E 8F 03 24 3E 43 01 2C 0E F3 30 4D 00 00 02 3C +23 00 B2 40 B2 21 B2 21 30 4D 8C C7 01 23 1B 42 +DC 21 2C 4F 2F 83 B0 12 6E C4 BF 4F 00 00 7A 90 +0A 00 02 28 7A 50 07 00 7A 50 30 00 92 83 B2 21 +18 42 B2 21 C8 4A 00 00 30 4D 1C C8 02 23 53 00 +0D 12 84 12 1E C8 58 C8 2D 83 09 93 E2 23 0E 93 +E0 23 3D 41 30 4D 4C C8 02 23 3E 00 9F 42 B2 21 +00 00 3E 40 B2 21 2E 8F 30 4D 00 00 04 48 4F 4C +44 00 4A 4E 3E 4F DA 3F 00 00 04 53 49 47 4E 00 +0E 93 3E 4F 7A 40 2D 00 D1 33 30 4D 58 C7 02 55 +2E 00 08 43 2F 83 8F 4E 00 00 0E 48 0D 12 0E 12 +3E F3 06 34 BF E3 00 00 3E E3 9F 53 00 00 0E 63 +84 12 12 C8 50 C8 EE C4 90 C8 6C C8 5E C7 26 CC +22 C7 62 C8 42 C7 01 2E 0E 93 E3 37 38 43 E2 3F +8A C8 82 53 22 00 82 43 B4 21 0D 12 84 12 0A C4 +14 C4 5C CB 0A C4 22 00 2E C9 FC C8 B2 40 20 00 +B4 21 6E 4E 1E 53 1E B3 82 6E C6 21 3E 4F 3D 41 +30 4D D6 C8 82 2E 22 00 0D 12 84 12 E6 C8 0A C4 +5E C7 5C CB 62 C8 1A C6 04 57 4F 52 44 00 3C 40 +C0 21 39 4C 3A 4C 09 5A 3A 5C 28 4C 09 9A 1D 24 +7E 9A FC 27 1A 83 3B 40 60 00 15 42 B4 21 FA 90 +27 00 00 00 01 20 05 43 C8 4C 00 00 09 9A 0B 24 7C 4A 4E 9C 08 24 18 53 4B 9C F6 2F 7C 90 7B 00 -F3 2F 4C 85 F1 3F 35 40 E2 C4 1A 82 C2 21 82 4A +F3 2F 4C 85 F1 3F 35 40 D4 C4 1A 82 C2 21 82 4A C4 21 1E 42 C6 21 08 8E CE 48 00 00 30 4D 00 00 04 46 49 4E 44 00 2F 83 0C 4E 66 4C 75 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 C5 48 96 F7 23 0A 4C FA 99 01 00 F3 23 1A 53 58 83 FA 23 19 B3 09 63 0C 49 CE 93 00 00 -1E 43 01 30 2E 83 8F 4C 00 00 36 40 F0 C4 35 40 -E2 C4 30 4D 00 00 07 3E 4E 55 4D 42 45 52 3C 4F +1E 43 01 30 2E 83 8F 4C 00 00 36 40 E2 C4 35 40 +D4 C4 30 4D 00 00 07 3E 4E 55 4D 42 45 52 3C 4F 38 4F 29 4F 2F 82 1B 42 DC 21 6A 4C 7A 80 30 00 7A 90 0A 00 05 28 7A 80 07 00 7A 90 0A 00 12 28 0A 9B 22 C3 0F 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 E3 23 8F 4C 00 00 8F 48 02 00 8F 49 04 00 30 4D 32 C0 00 02 1B 42 DC 21 0C 43 2D 15 3D 40 -4E C9 09 43 08 43 3F 82 8F 4E 06 00 0C 4E 7E 4C -6A 4C 7A 90 2D 00 04 28 C9 23 B1 43 02 00 0B 3C -2B 43 7A 80 25 00 07 24 3B 52 6A 53 04 24 3B 40 -10 00 5A 83 3A 20 1C 53 1E 83 EA 23 09 24 50 C9 -34 24 2D 83 7A 90 28 00 03 20 8F 93 04 00 C7 23 -32 B0 00 02 2A 20 32 D0 00 02 7A 90 F7 00 BF 27 -7A 90 F5 00 22 20 0A 4E 09 43 8F 49 02 00 5A 83 -09 4A 09 5C 69 49 79 80 30 00 79 90 0A 00 05 28 -79 80 07 00 79 90 0A 00 0A 28 09 9B 08 2C 8F 49 -00 00 0E 4B 2C 15 B0 12 74 C4 2A 17 E6 3F 9F 4F -04 00 02 00 AF 4F 04 00 4A 93 2B 17 0E 4C 82 4B -DC 21 06 24 32 C0 00 02 3F 50 06 00 0E F3 30 4D -2F 53 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 00 00 01 2C -1A 42 C6 21 8A 4E 00 00 A2 53 C6 21 3E 4F 30 4D -FE C9 87 4C 49 54 45 52 41 4C 82 93 BE 21 0C 24 -1A 42 C6 21 A2 52 C6 21 BA 40 0E C4 00 00 8A 4E -02 00 3E 4F 32 B0 00 02 32 C0 00 02 06 24 19 4A -02 00 8A 4E 02 00 0E 49 EB 3F 30 4D 22 C7 05 43 -4F 55 4E 54 2F 83 1E 53 8F 4E 00 00 5E 4E FF FF -30 4D 58 C7 05 54 52 45 41 54 0D 12 84 12 BA C4 -B8 CA E8 C7 76 CA A7 26 3D 40 7E CA E4 3E 80 CA -0A 4E 3E 4F 3D 40 9A CA 3C 27 3D 40 70 CA 1A E2 -BE 21 B6 27 0E 12 3E 4F 30 41 9C CA 3E 4F 3D 40 -70 CA BB 23 DE 53 00 00 68 4E 08 5E F8 40 3F 00 -00 00 3D 40 C2 CC CE 3F 86 12 20 00 00 00 04 51 -55 49 54 00 82 43 08 18 31 40 E0 20 B2 40 00 20 -00 20 82 43 BE 21 84 12 4C C6 CA C4 B8 CA E0 C5 -6A CA 82 C6 B2 C6 18 C4 0C 73 74 61 63 6B 20 65 -6D 70 74 79 21 00 3A CB 0E C4 40 FF 2C C4 BA C6 -18 C4 0A 46 52 41 4D 20 66 75 6C 6C 21 00 3A CB -3E C4 D8 CA FE C4 05 41 42 4F 52 54 3F 40 80 20 -D1 3F 16 CB 86 41 42 4F 52 54 22 00 0D 12 84 12 -A0 C7 0E C4 3A CB 00 CA 1C C7 8F 93 02 00 03 20 -2F 52 3E 4F 30 4D B0 12 1E D0 B0 12 7E C5 92 C3 -1C 05 18 42 06 18 39 40 41 00 19 83 FE 23 18 83 -FA 23 92 B3 1C 05 F3 23 0D 12 84 12 A4 CF 0E C4 -DE 21 F8 C4 F2 C5 18 C4 04 1B 5B 37 6D 00 1C C6 -66 C6 42 C4 92 CB 18 C4 05 6C 69 6E 65 3A 1C C6 -5C C7 1C C6 18 C4 04 1B 5B 30 6D 00 1C C6 1C CB -00 00 83 5B 27 5D 0D 12 84 12 BA CB 0E C4 0E C4 -00 CA 00 CA 1C C7 40 C8 01 27 0D 12 84 12 B8 CA -E8 C7 46 C8 42 C4 CA CB 1C C7 A4 CA C8 C6 81 5C -92 42 C0 21 C4 21 30 4D A2 CB 81 5B 82 43 BE 21 -30 4D CE CB 01 5D B2 43 BE 21 30 4D BE CA 88 50 -4F 53 54 50 4F 4E 45 00 0D 12 84 12 B8 CA E8 C7 -46 C8 66 C6 42 C4 CA CB B2 C6 42 C4 1A CC 0E C4 -0E C4 00 CA 00 CA 0E C4 00 CA 00 CA 1C C7 36 C7 -09 49 4D 4D 45 44 49 41 54 45 1A 42 B6 21 FA D0 -80 00 00 00 30 4D DA CB 01 3A 30 12 82 CC 92 B3 -C6 21 A2 63 C6 21 0D 12 84 12 B8 CA E8 C7 50 CC -3D 41 08 4E 7A 4E 5A D3 5A 53 0A 58 19 42 DA 21 -6E 4E 3E F0 1E 00 09 5E 3E 4F 82 48 B6 21 82 49 -B8 21 82 4A BA 21 82 4F BC 21 2A 52 82 4A C6 21 -30 41 BA 40 0D 12 FC FF BA 40 84 12 FE FF B2 43 -BE 21 30 4D 82 9F BC 21 09 20 18 42 B6 21 19 42 -B8 21 A8 49 FE FF 89 48 00 00 30 4D 0D 12 84 12 -18 C4 0F 73 74 61 63 6B 20 6D 69 73 6D 61 74 63 -68 21 46 CB 38 CC 81 3B 82 93 BE 21 81 27 0D 12 -84 12 0E C4 1C C7 00 CA 94 CC DC CB 1C C7 4E CA -06 43 52 45 41 54 45 00 B0 12 3E CC BA 40 86 12 -FC FF 8A 4A FE FF D5 3F E0 CC 04 43 4F 44 45 00 -B0 12 3E CC A2 82 C6 21 0D 12 84 12 1E CF F8 CE -1C C7 00 00 07 45 4E 44 43 4F 44 45 0D 12 84 12 -94 CC 38 CF 1C C7 24 CB 03 41 53 4D B2 40 FC CE -DA 21 E6 3F 14 CD 06 45 4E 44 41 53 4D 00 0D 12 -84 12 1C CD 56 CF 1C C7 00 00 05 43 4F 4C 4F 4E -1A 42 C6 21 BA 40 0D 12 00 00 BA 40 84 12 02 00 -A2 52 C6 21 B2 43 BE 21 30 40 38 CF 00 00 05 4C -4F 32 48 49 A2 83 C6 21 1A 42 C6 21 EE 3F 20 CC -85 48 49 32 4C 4F 0D 12 84 12 2C C4 C6 CE 00 CA -DC CB 08 CD 1C C7 C6 CC 86 5B 54 48 45 4E 5D 00 -30 4D 0C 4E 38 4F 3B 4F 39 4F 0E 4B 0E 5C 10 24 -1B 83 06 30 1C 83 04 30 19 53 F9 98 FF FF F5 27 -2D 4D 3E 4F 30 4D 2F 53 9F 83 00 00 F9 23 2F 53 -2D 53 F7 3F 98 CD 86 5B 45 4C 53 45 5D 00 0D 12 -84 12 0E C4 00 00 A0 C6 B8 CA E8 C7 54 CA 5E C6 -42 C4 30 CE 6C C6 18 C4 06 5B 54 48 45 4E 5D 00 -A2 CD 0A CE C6 CD E8 CD 1C C7 6C C6 18 C4 06 5B -45 4C 53 45 5D 00 A2 CD 20 CE C6 CD E6 CD 1C C7 -18 C4 04 5B 49 46 5D 00 A2 CD E8 CD 3E C4 E6 CD -40 C6 18 C4 05 0D 0A 6B 6F 20 1C C6 CA C4 BA C4 -3E C4 E8 CD D6 CD 84 5B 49 46 5D 00 0E 93 3E 4F -C6 27 30 4D 2F 53 30 4D 46 CE 89 5B 44 45 46 49 -4E 45 44 5D 0D 12 84 12 B8 CA E8 C7 46 C8 54 CE -1C C7 5A CE 8B 5B 55 4E 44 45 46 49 4E 45 44 5D -0D 12 84 12 64 CE AC C6 1C C7 8C CE 3D 41 B2 4E -0E 18 A2 4E 0C 18 3E 4F 8F 3C 12 CA 06 4D 41 52 -4B 45 52 00 B0 12 3E CC BA 40 85 12 FC FF BA 40 -8A CE FE FF 9A 42 C8 21 00 00 28 83 8A 48 02 00 -A2 52 C6 21 EA 3E 2E 53 30 4D 0E C4 CA 21 A4 C6 -1C C7 85 12 CA CE 28 CD FC D0 EC C5 B8 CB 80 CD -B6 C5 9C CE CE C7 C8 CF E2 CF 64 CA 56 D0 00 00 -74 CE E4 CB A6 C8 00 00 85 12 CA CE 32 D6 98 D6 -DA D5 E8 D6 A0 D5 00 00 6C D3 00 00 B0 D7 94 D7 -04 D6 42 D6 7C D4 00 00 00 00 04 D7 F6 CE 3A 40 +B0 CA 09 43 08 43 3F 82 8F 4E 06 00 0C 4E 7E 4C +FC 90 27 00 00 00 07 20 5C 4C 01 00 8F 4C 04 00 +7E 90 03 00 48 3C 6A 4C 7A 80 2D 00 04 28 BD 23 +B1 43 02 00 0A 3C 2B 43 7A 52 07 24 3B 52 6A 53 +04 24 3B 40 10 00 7A 53 36 20 1C 53 1E 83 EB 3F +B2 CA 31 24 2D 83 7A 90 28 00 C1 27 32 B0 00 02 +2A 20 32 D0 00 02 7A 90 F7 00 B9 27 7A 90 F5 00 +22 20 0A 4E 09 43 8F 49 02 00 5A 83 09 4A 09 5C +69 49 79 80 30 00 79 90 0A 00 05 28 79 80 07 00 +79 90 0A 00 0A 28 09 9B 08 2C 8F 49 00 00 0E 4B +2C 15 B0 12 66 C4 2A 17 E6 3F 9F 4F 04 00 02 00 +AF 4F 04 00 4A 93 2B 17 0E 4C 82 4B DC 21 06 24 +32 C0 00 02 3F 50 06 00 0E F3 30 4D 2F 53 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 00 00 01 2C 1A 42 C6 21 +8A 4E 00 00 A2 53 C6 21 3E 4F 30 4D E8 C7 05 41 +4C 4C 4F 54 82 5E C6 21 3E 4F 30 4D 5A CB 87 4C +49 54 45 52 41 4C 82 93 BE 21 0D 24 09 4E 1A 42 +C6 21 A2 52 C6 21 BA 40 0A C4 00 00 8A 49 02 00 +3E 4F 32 B0 00 02 32 C0 00 02 03 24 8A 4E 02 00 +EE 3F 30 4D 68 C8 05 43 4F 55 4E 54 2F 83 1E 53 +8F 4E 00 00 5E 4E FF FF 30 4D 7C C8 09 49 4E 54 +45 52 50 52 45 54 0D 12 84 12 AC C4 26 CC 2E C9 +E2 CB 94 26 3D 40 EA CB D6 3E EC CB 0A 4E 3E 4F +3D 40 06 CC 2E 27 3D 40 DC CB 1A E2 BE 21 AE 27 +0E 12 3E 4F 30 41 08 CC 3E 4F 3D 40 DC CB BB 23 +DE 53 00 00 68 4E 08 5E F8 40 3F 00 00 00 3D 40 +98 CD CC 3F 10 CC 86 12 20 00 3F 40 80 20 0E 43 +31 40 E0 20 B2 40 00 20 00 20 82 43 BE 21 84 12 +90 C7 BC C4 D6 CB C6 C7 F8 C7 14 C4 0C 73 74 61 +63 6B 20 65 6D 70 74 79 21 00 2A C5 0A C4 40 FF +28 C4 00 C8 14 C4 0A 46 52 41 4D 20 66 75 6C 6C +21 00 2A C5 3A C4 40 CC 6E CB 86 41 42 4F 52 54 +22 00 0D 12 84 12 E6 C8 0A C4 2A C5 5C CB 62 C8 +90 C9 01 27 0D 12 84 12 26 CC 2E C9 96 C9 34 C4 +24 CC 62 C8 00 00 83 5B 27 5D 0D 12 84 12 94 CC +0A C4 0A C4 5C CB 5C CB 62 C8 A6 CC 81 5B 82 43 +BE 21 30 4D 0E C8 01 5D B2 43 BE 21 30 4D C6 CC +81 5C 92 42 C0 21 C4 21 30 4D 00 00 88 50 4F 53 +54 50 4F 4E 45 00 0D 12 84 12 26 CC 2E C9 96 C9 +AA C7 34 C4 24 CC F8 C7 34 C4 08 CD 0A C4 0A C4 +5C CB 5C CB 0A C4 5C CB 5C CB 62 C8 BC CC 01 3A +30 12 58 CD 92 B3 C6 21 A2 63 C6 21 0D 12 84 12 +26 CC 2E C9 26 CD 3D 41 08 4E 7A 4E 5A D3 5A 53 +0A 58 19 42 DA 21 6E 4E 3E F0 1E 00 09 5E 3E 4F +82 48 B6 21 82 49 B8 21 82 4A BA 21 82 4F BC 21 +2A 52 82 4A C6 21 30 41 BA 40 0D 12 FC FF BA 40 +84 12 FE FF B2 43 BE 21 30 4D 82 9F BC 21 09 20 +18 42 B6 21 19 42 B8 21 A8 49 FE FF 89 48 00 00 +30 4D 0D 12 84 12 14 C4 0F 73 74 61 63 6B 20 6D +69 73 6D 61 74 63 68 21 36 C5 0E CD 81 3B 82 93 +BE 21 97 27 0D 12 84 12 0A C4 62 C8 5C CB 6A CD +BE CC 62 C8 CC CB 09 49 4D 4D 45 44 49 41 54 45 +18 42 B6 21 F8 D0 80 00 00 00 30 4D B6 CB 06 43 +52 45 41 54 45 00 B0 12 14 CD BA 40 86 12 FC FF +8A 4A FE FF C9 3F CE CD 04 43 4F 44 45 00 B0 12 +14 CD A2 82 C6 21 0D 12 84 12 0E D0 E8 CF 62 C8 +00 00 07 45 4E 44 43 4F 44 45 0D 12 84 12 6A CD +28 D0 62 C8 7A CC 03 41 53 4D B2 40 EC CF DA 21 +E6 3F 02 CE 06 45 4E 44 41 53 4D 00 0D 12 84 12 +0A CE 46 D0 62 C8 00 00 05 43 4F 4C 4F 4E 1A 42 +C6 21 BA 40 0D 12 00 00 BA 40 84 12 02 00 A2 52 +C6 21 B2 43 BE 21 30 40 28 D0 00 00 05 4C 4F 32 +48 49 A2 83 C6 21 1A 42 C6 21 EE 3F B6 CD 85 48 +49 32 4C 4F 0D 12 84 12 28 C4 B6 CF 5C CB BE CC +F6 CD 62 C8 9C CD 86 5B 54 48 45 4E 5D 00 30 4D +0C 4E 38 4F 3B 4F 39 4F 0E 4B 0E 5C 10 24 1B 83 +06 30 1C 83 04 30 19 53 F9 98 FF FF F5 27 2D 4D +3E 4F 30 4D 2F 53 9F 83 00 00 F9 23 2F 53 2D 53 +F7 3F 86 CE 86 5B 45 4C 53 45 5D 00 0D 12 84 12 +0A C4 00 00 DA C7 26 CC 2E C9 BC CB A2 C7 34 C4 +1E CF B0 C7 14 C4 06 5B 54 48 45 4E 5D 00 90 CE +F8 CE B4 CE D6 CE 62 C8 B0 C7 14 C4 06 5B 45 4C +53 45 5D 00 90 CE 0E CF B4 CE D4 CE 62 C8 14 C4 +04 5B 49 46 5D 00 90 CE D6 CE 3A C4 D4 CE 84 C7 +14 C4 05 0D 0A 6B 6F 20 5E C7 BC C4 AC C4 3A C4 +D6 CE C4 CE 84 5B 49 46 5D 00 0E 93 3E 4F C6 27 +30 4D 2F 53 30 4D 34 CF 89 5B 44 45 46 49 4E 45 +44 5D 0D 12 84 12 26 CC 2E C9 96 C9 42 CF 62 C8 +48 CF 8B 5B 55 4E 44 45 46 49 4E 45 44 5D 0D 12 +84 12 52 CF F2 C7 62 C8 7A CF B2 4E 0A 18 2E 53 +BE 12 3E 4F 3D 41 90 3C 7E CB 06 4D 41 52 4B 45 +52 00 B0 12 14 CD BA 40 85 12 FC FF BA 40 78 CF +FE FF 28 83 8A 48 00 00 BA 40 AA C4 04 00 B2 50 +06 00 C6 21 DD 3E 2E 53 30 4D 0A C4 CA 21 EA C7 +62 C8 85 12 BA CF 16 CE E8 CD 2E C7 92 CC 6E CE +F8 C6 8A CF 14 C9 B2 D0 C6 D0 9E C8 28 C9 00 00 +62 CF D0 CC F6 C9 00 00 85 12 BA CF 68 D6 CE D6 +10 D6 1E D7 D6 D5 00 00 A2 D3 00 00 E6 D7 CA D7 +3A D6 78 D6 B2 D4 00 00 00 00 3A D7 E6 CF 3A 40 0C 00 39 40 D6 21 08 49 28 53 19 83 18 83 E8 49 00 00 1A 83 FA 23 30 4D 3A 40 0E 00 38 40 CA 21 09 48 29 53 F8 49 00 00 18 53 1A 83 FB 23 30 4D -82 43 CC 21 30 4D 92 42 CA 21 DA 21 30 4D D2 CE -50 CF 56 CF 66 CF 3A 4E 82 4A C8 21 2E 4E 82 4E -C6 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 EE CB 09 50 57 52 5F 53 -54 41 54 45 85 12 5E CF 1C CF BC D7 9C C7 09 52 -53 54 5F 53 54 41 54 45 92 42 0E 18 A8 CF 92 42 -0C 18 AA CF EF 3F 9A CF 08 50 57 52 5F 48 45 52 -45 00 92 42 C8 21 A8 CF 92 42 C6 21 AA CF 30 4D -AE CF 08 52 53 54 5F 48 45 52 45 00 92 42 C8 21 -0E 18 92 42 C6 21 0C 18 EC 3F E2 C7 04 57 49 50 -45 00 B2 40 1C CF 0E 18 B2 40 BC D7 0C 18 30 12 -B8 CF B2 40 04 C4 02 C4 B2 40 60 D0 5E D0 B2 40 -E4 C5 E2 C5 B2 40 50 C6 4E C6 B2 40 BE C5 BC C5 -B2 40 18 00 0A 18 34 40 1C C7 37 40 92 C6 36 40 -F0 C4 35 40 E2 C4 B2 40 20 00 B4 21 B2 40 0A 00 -DC 21 30 41 FC CF 04 57 41 52 4D 00 30 40 60 D0 -3D 40 B2 D0 92 C3 30 01 1E 42 08 18 00 40 F2 B0 -10 00 00 02 02 20 3E E3 1E 53 0E 93 19 24 13 34 -39 40 10 00 29 83 B9 43 80 FF FC 23 B9 40 06 D1 -FE FF 29 83 B9 40 02 D1 FE FF 39 90 AC FF F9 23 -B2 40 20 C5 E4 FF 0E 93 AC 33 2E 93 7B 27 84 2F -30 4D 18 C4 07 0D 0A 1B 5B 37 6D 23 1C C6 92 C7 -18 C4 19 46 61 73 74 46 6F 72 74 68 20 C2 A9 4A -2E 4D 2E 54 68 6F 6F 72 65 6E 73 20 1C C6 0E C4 -40 FF 2C C4 9C C6 5C C7 18 C4 0A 62 79 74 65 73 -20 66 72 65 65 00 3E C4 92 CB FA CC 04 43 4F 4C -44 00 30 40 A2 C5 B2 D0 03 00 04 01 B2 D0 10 00 -00 01 B2 40 80 5A CC 01 B2 43 02 02 B2 D3 06 02 -D2 43 24 02 F2 D3 26 02 F2 40 FD 00 22 02 E2 D2 -24 02 B2 40 00 A5 60 01 B2 40 B4 00 80 01 92 43 -82 01 B2 40 1E 00 84 01 39 40 10 00 B2 D0 10 00 -86 01 92 D2 5E 01 08 18 38 40 59 14 18 83 FE 23 -19 83 FA 23 B2 40 81 00 00 05 92 42 02 18 06 05 -92 42 04 18 08 05 F2 D0 30 00 0A 02 92 C3 00 05 -92 D3 1A 05 39 40 00 10 29 83 89 43 00 20 FC 23 -31 40 E0 20 3F 40 80 20 30 12 5C D0 40 3F 38 40 -C0 21 0A 4E 39 48 2E 48 09 5E 1E 52 C4 21 09 9E -03 24 7A 9E FC 27 1E 83 0A 4E 2A 88 82 4A C4 21 -30 4D 1C 15 84 12 E8 C7 46 C8 38 C4 D6 D1 02 C9 -42 C4 CA CB F0 D1 D8 D1 3C 4E 3C 80 87 12 08 24 -1C 53 02 20 2E 4E 04 3C 2E 53 1C 53 01 24 2E 82 -1B 17 30 41 3E 40 28 00 B0 12 C2 D1 19 42 C6 21 -A2 53 C6 21 89 4E 00 00 3E 40 29 00 1C 15 92 92 -C0 21 C4 21 02 20 30 40 AC CC 12 12 C4 21 92 53 -C4 21 84 12 E8 C7 02 C9 42 C4 38 D2 2E D2 21 53 -3E 90 10 00 80 2D DC 2B 3A D2 B2 41 C4 21 D8 3F -0D 12 84 12 B8 CA 9E D1 4A D2 0C 43 1B 42 C6 21 -A2 53 C6 21 6A 4E 3E 4F 7A 90 23 00 27 20 92 53 -C4 21 B0 12 C2 D1 3C 40 00 03 0E 93 1C 24 3C 40 -10 03 1E 93 18 24 3C 40 20 03 2E 93 14 24 3C 40 -20 02 2E 92 10 24 3C 40 30 02 3E 92 0C 24 3C 40 -30 03 3E 93 08 24 3C 40 30 00 19 42 C6 21 A2 53 -C6 21 89 4E 00 00 3E 4F 3D 41 30 4D 7A 90 26 00 -07 20 3C 40 10 02 92 53 C4 21 B0 12 C2 D1 ED 3F -7A 90 40 00 16 20 3C 40 20 00 92 53 C4 21 B0 12 -0C D2 0C 20 3C 50 10 00 3E 40 2B 00 B0 12 0C D2 -92 92 C0 21 C4 21 02 24 92 53 C4 21 8E 10 0C 5E -DA 3F B0 12 0C D2 FA 23 3C 50 10 00 B0 12 F4 D1 -EF 3F 0C 43 1B 42 C6 21 A2 53 C6 21 0D 12 84 12 -B8 CA 9E D1 16 D3 FE 90 26 00 00 00 3E 40 20 00 -03 20 3C 50 82 00 C7 3F B0 12 0C D2 E0 23 3C 50 -80 00 B0 12 F4 D1 DB 3F 00 00 04 52 45 54 49 00 -0D 12 84 12 0E C4 00 13 00 CA 1C C7 0E C4 2C 00 -40 D2 0C D3 56 D3 09 4B 2E 4E 0E DC A2 3F 6E CD -03 4D 4F 56 85 12 4C D3 00 40 60 D3 05 4D 4F 56 -2E 42 85 12 4C D3 40 40 00 00 03 41 44 44 85 12 -4C D3 00 50 7A D3 05 41 44 44 2E 42 85 12 4C D3 -40 50 86 D3 04 41 44 44 43 00 85 12 4C D3 00 60 -94 D3 06 41 44 44 43 2E 42 00 85 12 4C D3 40 60 -3A D3 04 53 55 42 43 00 85 12 4C D3 00 70 B2 D3 -06 53 55 42 43 2E 42 00 85 12 4C D3 40 70 C0 D3 -03 53 55 42 85 12 4C D3 00 80 D0 D3 05 53 55 42 -2E 42 85 12 4C D3 40 80 4A CD 03 43 4D 50 85 12 -4C D3 00 90 EA D3 05 43 4D 50 2E 42 85 12 4C D3 -40 90 36 CD 04 44 41 44 44 00 85 12 4C D3 00 A0 -04 D4 06 44 41 44 44 2E 42 00 85 12 4C D3 40 A0 -F6 D3 03 42 49 54 85 12 4C D3 00 B0 22 D4 05 42 -49 54 2E 42 85 12 4C D3 40 B0 2E D4 03 42 49 43 -85 12 4C D3 00 C0 3C D4 05 42 49 43 2E 42 85 12 -4C D3 40 C0 48 D4 03 42 49 53 85 12 4C D3 00 D0 -56 D4 05 42 49 53 2E 42 85 12 4C D3 40 D0 00 00 -03 58 4F 52 85 12 4C D3 00 E0 70 D4 05 58 4F 52 -2E 42 85 12 4C D3 40 E0 A2 D3 03 41 4E 44 85 12 -4C D3 00 F0 8A D4 05 41 4E 44 2E 42 85 12 4C D3 -40 F0 B8 CA 40 D2 A8 D4 0A 4C 3C F0 70 00 8A 10 -3A F0 0F 00 0C DA 4F 3F DC D3 03 52 52 43 85 12 -A2 D4 00 10 BA D4 05 52 52 43 2E 42 85 12 A2 D4 -40 10 C6 D4 04 53 57 50 42 00 85 12 A2 D4 80 10 -D4 D4 03 52 52 41 85 12 A2 D4 00 11 E2 D4 05 52 -52 41 2E 42 85 12 A2 D4 40 11 EE D4 03 53 58 54 -85 12 A2 D4 80 11 00 00 04 50 55 53 48 00 85 12 -A2 D4 00 12 08 D5 06 50 55 53 48 2E 42 00 85 12 -A2 D4 40 12 62 D4 04 43 41 4C 4C 00 85 12 A2 D4 -80 12 1A 53 0E 4A 0D 12 84 12 92 C7 18 C4 0D 6F -75 74 20 6F 66 20 62 6F 75 6E 64 73 46 CB FC D4 -03 53 3E 3D 86 12 00 38 50 D5 02 53 3C 00 86 12 -00 34 16 D5 03 30 3E 3D 86 12 00 30 64 D5 02 30 -3C 00 86 12 00 30 00 00 02 55 3C 00 86 12 00 2C -78 D5 03 55 3E 3D 86 12 00 28 6E D5 03 30 3C 3E -86 12 00 24 8C D5 02 30 3D 00 86 12 00 20 00 00 -02 49 46 00 1A 42 C6 21 8A 4E 00 00 A2 53 C6 21 -0E 4A 30 4D 82 D5 04 54 48 45 4E 00 1A 42 C6 21 -08 4E 3E 4F 09 48 29 53 0A 89 0A 11 3A 90 00 02 -B1 2F 88 DA 00 00 30 4D 12 D4 04 45 4C 53 45 00 -1A 42 C6 21 BA 40 00 3C 00 00 A2 53 C6 21 2F 83 -8F 4A 00 00 E3 3F 26 D5 05 42 45 47 49 4E 30 40 -2C C4 B6 D5 05 55 4E 54 49 4C 3A 4F 08 4E 3E 4F -19 42 C6 21 2A 83 0A 89 0A 11 3A 90 00 FE 8A 3B -3A F0 FF 03 08 DA 89 48 00 00 A2 53 C6 21 30 4D -96 D4 05 41 47 41 49 4E 0A 4E 38 40 00 3C E7 3F -00 00 05 57 48 49 4C 45 0D 12 84 12 A4 D5 78 C6 -1C C7 5A D5 06 52 45 50 45 41 54 00 0D 12 84 12 -38 D6 BC D5 1C C7 68 D6 3D 41 08 4E 3E 4F 2A 48 -B2 92 C4 21 CB 2F 98 42 C6 21 00 00 30 4D F8 D5 -03 42 57 31 85 12 66 D6 00 00 80 D6 03 42 57 32 -85 12 66 D6 00 00 8C D6 03 42 57 33 85 12 66 D6 -00 00 A4 D6 3D 41 1A 42 C6 21 28 4E B2 92 C4 21 -88 2B BA 4F 00 00 A2 53 C6 21 8E 4A 00 00 3E 4F -30 4D 00 00 03 46 57 31 85 12 A2 D6 00 00 C4 D6 -03 46 57 32 85 12 A2 D6 00 00 D0 D6 03 46 57 33 -85 12 A2 D6 00 00 DC D6 04 47 4F 54 4F 00 2F 83 -8F 4E 00 00 3E 40 00 3C 0D 12 84 12 BA CB 94 CA -1C C7 00 00 05 3F 47 4F 54 4F 3E 90 00 30 F4 27 -3E E0 00 04 3E B0 00 10 EF 27 3E E0 00 08 EC 3F -B8 CA 9E D1 26 D7 92 53 C4 21 3E 40 2C 00 84 12 -E8 C7 02 C9 42 C4 CA CB 02 D3 3C D7 0A 4E 3E 4F -1A 83 F7 32 29 4E 59 0E 0A 28 08 4C 59 0A 01 28 -0C 8A 08 8A 38 90 10 00 EC 2E 5A 0E AB 3E 2A 92 -E8 2E 8A 10 5A 06 A6 3E 54 D6 04 52 52 43 4D 00 -85 12 20 D7 50 00 6A D7 04 52 52 41 4D 00 85 12 -20 D7 50 01 78 D7 04 52 4C 41 4D 00 85 12 20 D7 -50 02 86 D7 04 52 52 55 4D 00 85 12 20 D7 50 03 -96 D5 05 50 55 53 48 4D 85 12 20 D7 00 15 A2 D7 -04 50 4F 50 4D 00 85 12 20 D7 00 17 +82 43 CC 21 30 4D 92 42 CA 21 DA 21 30 4D C2 CF +40 D0 46 D0 56 D0 1A 42 20 18 82 4A C8 21 2E 4E +82 4E C6 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 DC CC 09 50 57 52 +5F 53 54 41 54 45 85 12 4E D0 F2 D7 E2 C8 09 52 +53 54 5F 53 54 41 54 45 92 42 0A 18 9A D0 F3 3F +8C D0 08 50 57 52 5F 48 45 52 45 00 92 42 C6 21 +9A D0 30 4D 9E D0 08 52 53 54 5F 48 45 52 45 00 +92 42 C6 21 0A 18 F2 3F 3E 90 0E 00 DC 27 2E 92 +E3 37 0E 93 D8 37 39 40 10 00 29 83 B9 43 80 FF +FC 23 B9 40 24 D1 FE FF 29 83 B9 40 02 C6 FE FF +39 90 AE FF F9 23 39 40 14 18 B2 49 04 C6 B2 49 +FA C4 B2 49 02 C4 B2 49 22 C6 B2 49 E4 FF B2 49 +0A 18 C2 3F B2 D0 03 00 04 01 B2 D0 10 00 00 01 +B2 40 80 5A CC 01 31 40 E0 20 3F 40 80 20 39 40 +00 10 29 83 89 43 00 20 FC 23 B2 43 02 02 B2 D3 +06 02 D2 43 24 02 F2 D3 26 02 F2 40 FD 00 22 02 +E2 D2 24 02 B2 40 00 A5 60 01 B2 40 B4 00 80 01 +92 43 82 01 B2 40 1E 00 84 01 39 40 10 00 B2 D0 +10 00 86 01 38 40 17 11 18 83 FE 23 19 83 FA 23 +1E 42 08 18 82 43 08 18 1E D2 5E 01 B0 12 F8 C4 +20 C6 38 40 C0 21 0A 4E 39 48 2E 48 09 5E 1E 52 +C4 21 09 9E 03 24 7A 9E FC 27 1E 83 0A 4E 2A 88 +82 4A C4 21 30 4D 1C 15 0E 12 12 12 C4 21 84 12 +2E C9 96 C9 F2 C7 34 C4 E2 D1 52 CA 34 C4 FC D1 +F6 D1 E4 D1 3C 4E 3C 80 87 12 05 24 1C 53 02 20 +2E 4E 01 3C 2E 83 21 52 1B 17 30 41 FE D1 B2 41 +C4 21 3E 41 84 12 0A C4 2B 00 2E C9 96 C9 F2 C7 +34 C4 1A D2 52 CA 34 C4 24 CC BC C7 2E C9 52 CA +34 C4 24 CC 26 D2 3E 5F E7 3F 3E 40 28 00 B0 12 +C6 D1 19 42 C6 21 A2 53 C6 21 89 4E 00 00 3E 40 +29 00 92 92 C0 21 C4 21 02 20 30 40 82 CD 1C 15 +12 12 C4 21 92 53 C4 21 84 12 2E C9 52 CA 34 C4 +6E D2 64 D2 21 53 3E 90 10 00 C6 2B 7F 2D 70 D2 +B2 41 C4 21 C1 3F 0D 12 84 12 26 CC A2 D1 80 D2 +0C 43 1B 42 C6 21 A2 53 C6 21 6A 4E 3E 4F 7A 90 +23 00 27 20 92 53 C4 21 B0 12 C6 D1 3C 40 00 03 +0E 93 1C 24 3C 40 10 03 1E 93 18 24 3C 40 20 03 +2E 93 14 24 3C 40 20 02 2E 92 10 24 3C 40 30 02 +3E 92 0C 24 3C 40 30 03 3E 93 08 24 3C 40 30 00 +19 42 C6 21 A2 53 C6 21 89 4E 00 00 3E 4F 3D 41 +30 4D 7A 90 26 00 07 20 3C 40 10 02 92 53 C4 21 +B0 12 C6 D1 ED 3F 7A 90 40 00 16 20 3C 40 20 00 +92 53 C4 21 B0 12 4E D2 0C 20 3C 50 10 00 3E 40 +2B 00 B0 12 4E D2 92 92 C0 21 C4 21 02 24 92 53 +C4 21 8E 10 0C 5E DA 3F B0 12 4E D2 FA 23 3C 50 +10 00 B0 12 2A D2 EF 3F 0C 43 1B 42 C6 21 A2 53 +C6 21 0D 12 84 12 26 CC A2 D1 4C D3 FE 90 26 00 +00 00 3E 40 20 00 03 20 3C 50 82 00 C7 3F B0 12 +4E D2 E0 23 3C 50 80 00 B0 12 2A D2 DB 3F 00 00 +04 52 45 54 49 00 0D 12 84 12 0A C4 00 13 5C CB +62 C8 0A C4 2C 00 76 D2 42 D3 8C D3 09 4B 2E 4E +0E DC A2 3F 5C CE 03 4D 4F 56 85 12 82 D3 00 40 +96 D3 05 4D 4F 56 2E 42 85 12 82 D3 40 40 00 00 +03 41 44 44 85 12 82 D3 00 50 B0 D3 05 41 44 44 +2E 42 85 12 82 D3 40 50 BC D3 04 41 44 44 43 00 +85 12 82 D3 00 60 CA D3 06 41 44 44 43 2E 42 00 +85 12 82 D3 40 60 70 D3 04 53 55 42 43 00 85 12 +82 D3 00 70 E8 D3 06 53 55 42 43 2E 42 00 85 12 +82 D3 40 70 F6 D3 03 53 55 42 85 12 82 D3 00 80 +06 D4 05 53 55 42 2E 42 85 12 82 D3 40 80 38 CE +03 43 4D 50 85 12 82 D3 00 90 20 D4 05 43 4D 50 +2E 42 85 12 82 D3 40 90 24 CE 04 44 41 44 44 00 +85 12 82 D3 00 A0 3A D4 06 44 41 44 44 2E 42 00 +85 12 82 D3 40 A0 2C D4 03 42 49 54 85 12 82 D3 +00 B0 58 D4 05 42 49 54 2E 42 85 12 82 D3 40 B0 +64 D4 03 42 49 43 85 12 82 D3 00 C0 72 D4 05 42 +49 43 2E 42 85 12 82 D3 40 C0 7E D4 03 42 49 53 +85 12 82 D3 00 D0 8C D4 05 42 49 53 2E 42 85 12 +82 D3 40 D0 00 00 03 58 4F 52 85 12 82 D3 00 E0 +A6 D4 05 58 4F 52 2E 42 85 12 82 D3 40 E0 D8 D3 +03 41 4E 44 85 12 82 D3 00 F0 C0 D4 05 41 4E 44 +2E 42 85 12 82 D3 40 F0 26 CC 76 D2 DE D4 0A 4C +3C F0 70 00 8A 10 3A F0 0F 00 0C DA 4F 3F 12 D4 +03 52 52 43 85 12 D8 D4 00 10 F0 D4 05 52 52 43 +2E 42 85 12 D8 D4 40 10 FC D4 04 53 57 50 42 00 +85 12 D8 D4 80 10 0A D5 03 52 52 41 85 12 D8 D4 +00 11 18 D5 05 52 52 41 2E 42 85 12 D8 D4 40 11 +24 D5 03 53 58 54 85 12 D8 D4 80 11 00 00 04 50 +55 53 48 00 85 12 D8 D4 00 12 3E D5 06 50 55 53 +48 2E 42 00 85 12 D8 D4 40 12 98 D4 04 43 41 4C +4C 00 85 12 D8 D4 80 12 1A 53 0E 4A 0D 12 84 12 +D8 C8 14 C4 0D 6F 75 74 20 6F 66 20 62 6F 75 6E +64 73 36 C5 32 D5 03 53 3E 3D 86 12 00 38 86 D5 +02 53 3C 00 86 12 00 34 4C D5 03 30 3E 3D 86 12 +00 30 9A D5 02 30 3C 00 86 12 00 30 00 00 02 55 +3C 00 86 12 00 2C AE D5 03 55 3E 3D 86 12 00 28 +A4 D5 03 30 3C 3E 86 12 00 24 C2 D5 02 30 3D 00 +86 12 00 20 00 00 02 49 46 00 1A 42 C6 21 8A 4E +00 00 A2 53 C6 21 0E 4A 30 4D B8 D5 04 54 48 45 +4E 00 1A 42 C6 21 08 4E 3E 4F 09 48 29 53 0A 89 +0A 11 3A 90 00 02 B1 2F 88 DA 00 00 30 4D 48 D4 +04 45 4C 53 45 00 1A 42 C6 21 BA 40 00 3C 00 00 +A2 53 C6 21 2F 83 8F 4A 00 00 E3 3F 5C D5 05 42 +45 47 49 4E 30 40 28 C4 EC D5 05 55 4E 54 49 4C +3A 4F 08 4E 3E 4F 19 42 C6 21 2A 83 0A 89 0A 11 +3A 90 00 FE 8A 3B 3A F0 FF 03 08 DA 89 48 00 00 +A2 53 C6 21 30 4D CC D4 05 41 47 41 49 4E 0A 4E +38 40 00 3C E7 3F 00 00 05 57 48 49 4C 45 0D 12 +84 12 DA D5 BC C7 62 C8 90 D5 06 52 45 50 45 41 +54 00 0D 12 84 12 6E D6 F2 D5 62 C8 9E D6 3D 41 +08 4E 3E 4F 2A 48 B2 92 C4 21 CB 2F 98 42 C6 21 +00 00 30 4D 2E D6 03 42 57 31 85 12 9C D6 00 00 +B6 D6 03 42 57 32 85 12 9C D6 00 00 C2 D6 03 42 +57 33 85 12 9C D6 00 00 DA D6 3D 41 1A 42 C6 21 +28 4E B2 92 C4 21 88 2B BA 4F 00 00 A2 53 C6 21 +8E 4A 00 00 3E 4F 30 4D 00 00 03 46 57 31 85 12 +D8 D6 00 00 FA D6 03 46 57 32 85 12 D8 D6 00 00 +06 D7 03 46 57 33 85 12 D8 D6 00 00 12 D7 04 47 +4F 54 4F 00 2F 83 8F 4E 00 00 3E 40 00 3C 0D 12 +84 12 94 CC 00 CC 62 C8 00 00 05 3F 47 4F 54 4F +3E 90 00 30 F4 27 3E E0 00 04 3E B0 00 10 EF 27 +3E E0 00 08 EC 3F 26 CC A2 D1 5C D7 92 53 C4 21 +3E 40 2C 00 84 12 2E C9 52 CA 34 C4 24 CC 38 D3 +72 D7 0A 4E 3E 4F 1A 83 F7 32 29 4E 59 0E 0A 28 +08 4C 59 0A 01 28 0C 8A 08 8A 38 90 10 00 EC 2E +5A 0E AB 3E 2A 92 E8 2E 8A 10 5A 06 A6 3E 8A D6 +04 52 52 43 4D 00 85 12 56 D7 50 00 A0 D7 04 52 +52 41 4D 00 85 12 56 D7 50 01 AE D7 04 52 4C 41 +4D 00 85 12 56 D7 50 02 BC D7 04 52 52 55 4D 00 +85 12 56 D7 50 03 CC D5 05 50 55 53 48 4D 85 12 +56 D7 00 15 D8 D7 04 50 4F 50 4D 00 85 12 56 D7 +00 17 @FF80 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -10 00 10 00 20 00 30 00 40 00 00 00 02 D1 02 D1 -02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 -02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 -02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 -02 D1 02 D1 20 C5 02 D1 02 D1 02 D1 02 D1 02 D1 -02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 06 D1 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +77 00 10 00 12 00 14 00 16 00 00 00 02 C6 02 C6 +02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 +02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 +02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 +02 C6 02 C6 96 C6 02 C6 02 C6 02 C6 02 C6 02 C6 +02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 24 D1 q diff --git a/binaries/CHIPSTICK_FR2433_8MHz_I2C.txt b/binaries/CHIPSTICK_FR2433_8MHz_I2C.txt index 7282632..4ee0e69 100644 --- a/binaries/CHIPSTICK_FR2433_8MHz_I2C.txt +++ b/binaries/CHIPSTICK_FR2433_8MHz_I2C.txt @@ -1,330 +1,335 @@ @1800 -10 00 10 00 00 00 40 1F 05 00 F8 00 B2 D7 00 CF -32 01 63 00 64 C5 78 C5 40 D0 40 D0 18 C5 +40 1F 12 00 00 00 F8 00 F9 FF EE D7 0A D0 33 01 +10 00 81 06 B4 C5 AA C4 B6 C5 8A C5 82 C6 EE D7 +0A D0 70 C6 92 C7 FE C6 DA C6 3C 21 60 C8 D4 C4 +E2 C4 EE C4 20 00 0A 00 28 CC 42 CC 00 00 00 00 @C400 -30 40 04 C4 B0 12 64 C5 12 D2 0A 18 F9 3F 2F 83 -8F 4E 00 00 3E 4D 30 4D 2F 82 8F 4E 02 00 7E 4D -8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D 2F 83 8F 4E -00 00 1E 42 C6 21 30 4D 0E 93 3E 4F 05 24 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 21 52 2D 53 30 4D 91 53 -00 00 F7 3F 0B 4E 1C 4F 02 00 2E 4F 0A 43 35 40 -20 00 0E 93 04 20 05 11 0E 4C 0C 43 09 43 0A 9B -01 28 0A 8B 09 69 08 68 15 83 07 30 0C 5C 0E 6E -0A 6A F5 2B 0A 8B 12 D3 F5 3F 35 40 E2 C4 8F 4A -02 00 8F 49 00 00 0E 48 30 41 82 4E C0 21 B2 4F -C2 21 3E 4F 82 43 C4 21 30 4D 3F 80 06 00 8F 4E -04 00 3E 40 54 00 BF 40 3C 21 00 00 AF 4F 02 00 -12 3C 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E 30 4D -2F 83 8F 4E 00 00 3E 41 2E 4E 30 4D 00 00 06 41 -43 43 45 50 54 00 0A 4E 2E 4F 0A 5E 3B 40 0A 00 -3C 40 20 00 3D 15 74 3F 21 52 A2 C2 6C 05 B2 B0 -10 00 40 05 6D 23 3A 17 92 B3 6C 05 FD 27 58 42 -4C 05 48 9B 0E 24 48 9C 06 2C 78 92 F5 23 2E 9F -F3 27 1E 83 F1 3F 0E 9A EF 27 CE 48 00 00 1E 53 -EB 3F 82 93 DE 21 02 24 92 53 DE 21 3E 8F B0 12 -70 C5 30 4D 48 43 A2 B3 6C 05 FD 27 C2 48 4E 05 -B2 B0 40 00 48 05 FC 27 30 41 B2 40 4F 5A CC 01 -A2 B3 6C 05 FD 27 F2 40 03 00 4E 05 B0 12 70 C5 -B2 40 04 A5 20 01 00 00 03 4B 45 59 30 40 A0 C5 -2F 83 8F 4E 00 00 58 43 B0 12 66 C5 92 B3 6C 05 -FD 27 1E 42 4C 05 30 4D 00 00 04 45 4D 49 54 00 -30 40 C4 C5 08 4E 3E 4F A2 B3 6C 05 FD 27 82 48 -4E 05 30 4D BA C5 04 45 43 48 4F 00 B2 40 82 48 -CE C5 82 43 DE 21 38 40 05 00 B0 12 66 C5 30 4D -00 00 06 4E 4F 45 43 48 4F 00 B2 40 30 4D CE C5 -92 43 DE 21 28 42 F1 3F 00 00 04 54 59 50 45 00 -0E 93 10 24 0D 12 3D 40 2A C6 28 4F 2F 83 8F 4E -00 00 7E 48 8F 48 02 00 CB 3F 2C C6 2D 83 1E 83 -F4 23 3D 41 2F 53 3E 4F 30 4D 00 00 02 43 52 00 -30 40 44 C6 0D 12 84 12 18 C4 02 0D 0A 00 10 C6 -10 C7 2F 83 8F 4E 00 00 30 4D 0E 93 FA 23 30 4D -8F 4E FE FF AF 4F FC FF 2F 82 30 4D 2A 4F 8F 4E -00 00 0E 4A 30 4D 8F 4E FE FF 3E 40 80 20 0E 8F -0E 11 2F 83 30 4D 2F 83 8F 4E 00 00 3E 41 30 4D -3E 8F 3E E3 1E 53 30 4D BE 4F 00 00 3E 4F 30 4D +B0 12 B6 C5 12 D2 06 18 FB 3F 2F 83 8F 4E 00 00 +3E 4D 30 4D 2F 82 8F 4E 02 00 7E 4D 8F 4D 00 00 +0D 5E 1D B3 0D 63 30 4D 2F 83 8F 4E 00 00 1E 42 +C6 21 30 4D 0E 93 3E 4F 11 20 2D 4D 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 F0 27 21 52 2D 53 30 4D +91 53 00 00 F7 3F 0B 4E 1C 4F 02 00 2E 4F 0A 43 +35 40 20 00 0E 93 04 20 05 11 0E 4C 0C 43 09 43 +0A 9B 01 28 0A 8B 09 69 08 68 15 83 07 30 0C 5C +0E 6E 0A 6A F5 2B 0A 8B 12 D3 F5 3F 35 40 D4 C4 +8F 4A 02 00 8F 49 00 00 0E 48 30 41 82 4E C0 21 +B2 4F C2 21 82 43 C4 21 3E 4F 30 4D 3F 80 06 00 +8F 4E 04 00 3E 40 54 00 BF 40 3C 21 00 00 AF 4F +02 00 CC 3C 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E +30 4D 2F 83 8F 4E 00 00 3E 41 2E 4E 30 4D 2F 83 +8F 4E 00 00 3E 41 30 4D B0 12 AA C4 39 40 22 18 +B2 49 6E C6 B2 49 90 C7 B2 49 FC C6 B2 49 D8 C6 +B2 49 CA C4 34 49 35 49 36 49 37 49 B2 49 B4 21 +B2 49 DC 21 3D 41 30 40 D6 D0 8F 93 02 00 03 20 +2F 52 3E 4F 30 4D 68 43 B0 12 B8 C5 B0 12 F8 C4 +0A C4 DE 21 E0 C7 16 C7 4A C7 34 C4 28 CC 14 C4 +05 1B 5B 37 6D 40 5C C7 0A C4 02 18 E0 C7 D6 C8 +A8 C7 34 C4 7C C5 14 C4 0F 4C 41 53 54 2E 34 54 +48 2C 20 6C 69 6E 65 20 5C C7 A0 C8 5C C7 14 C4 +04 1B 5B 30 6D 00 5C C7 28 CC 2E 93 13 28 B2 D0 +C0 07 40 05 18 42 02 18 08 11 38 D0 00 04 82 48 +54 05 F2 D0 0C 00 0A 02 92 C3 40 05 A2 D2 6A 05 +92 C3 30 01 30 41 48 43 A2 B3 6C 05 FD 27 C2 48 +4E 05 A2 B2 6C 05 FD 27 30 41 00 00 04 57 49 50 +45 00 B2 43 08 18 04 3C 00 00 04 43 4F 4C 44 00 +B0 12 B4 C5 F2 B0 10 00 00 02 02 20 B2 43 08 18 +B2 40 04 A5 20 01 CC C5 04 57 41 52 4D 00 B0 12 +8A C5 78 40 03 00 B0 12 B8 C5 84 12 14 C4 07 0D +0A 1B 5B 37 6D 40 5C C7 0A C4 02 18 E0 C7 D6 C8 +0A C4 23 00 FA C6 D6 C8 14 C4 19 46 61 73 74 46 +6F 72 74 68 20 C2 A9 4A 2E 4D 2E 54 68 6F 6F 72 +65 6E 73 20 5C C7 0A C4 40 FF 28 C4 D4 C7 A0 C8 +14 C4 0A 62 79 74 65 73 20 66 72 65 65 00 3A C4 +7C C5 00 00 06 41 43 43 45 50 54 00 30 40 70 C6 +0A 4E 2E 4F 0A 5E 3B 40 0A 00 3C 40 20 00 3D 15 +BF 3E 21 52 A2 C2 6C 05 B2 B0 10 00 40 05 B8 22 +3A 17 92 B3 6C 05 FD 27 58 42 4C 05 48 9B 0E 24 +48 9C 06 2C 78 92 F5 23 2E 9F F3 27 1E 83 F1 3F +0E 9A EF 27 CE 48 00 00 1E 53 EB 3F 3E 8F B0 12 +C2 C5 82 93 DE 21 02 24 92 53 DE 21 08 4C 19 3C +00 00 03 4B 45 59 30 40 DA C6 2F 83 8F 4E 00 00 +58 43 B0 12 B8 C5 92 B3 6C 05 FD 27 1E 42 4C 05 +30 4D 00 00 04 45 4D 49 54 00 30 40 FE C6 08 4E +3E 4F A2 B3 6C 05 FD 27 C2 48 4E 05 30 4D F4 C6 +04 45 43 48 4F 00 B2 40 C2 48 08 C7 82 43 DE 21 +38 40 05 00 B0 12 B8 C5 30 4D 00 00 06 4E 4F 45 +43 48 4F 00 B2 40 30 4D 08 C7 92 43 DE 21 28 42 +F1 3F 2C C7 04 4F 56 45 52 00 8F 4E FE FF 2E 4F +2F 83 30 4D 00 00 04 54 59 50 45 00 0E 93 11 24 +0D 12 3D 40 78 C7 28 4F 2F 83 8F 4E 00 00 7E 48 +8F 48 02 00 10 42 FC C6 7A C7 2D 83 1E 83 F3 23 +3D 41 2F 53 3E 4F 30 4D DA C5 02 43 52 00 30 40 +92 C7 0D 12 84 12 14 C4 02 0D 0A 00 5C C7 60 C8 +2F 83 8F 4E 00 00 30 4D 0E 93 FA 23 30 4D 8F 4E +FE FF AF 4F FC FF 2F 82 30 4D 2A 4F 8F 4E 00 00 +0E 4A 30 4D 8F 4E FE FF 3E 40 80 20 0E 8F 0E 11 +2F 83 30 4D 3E 8F 3E E3 1E 53 30 4D 64 C6 01 40 +2E 4E 30 4D DE C7 01 21 BE 4F 00 00 3E 4F 30 4D 1E 83 0E 7E 30 4D 0E 5E 0E 7E 3E E3 30 4D 3E 8F 03 24 3E 43 01 2C 0E F3 30 4D 00 00 02 3C 23 00 -B2 40 B2 21 B2 21 30 4D 3C C6 01 23 1B 42 DC 21 -2C 4F 2F 83 B0 12 7C C4 BF 4F 00 00 7A 90 0A 00 +B2 40 B2 21 B2 21 30 4D 8A C7 01 23 1B 42 DC 21 +2C 4F 2F 83 B0 12 6E C4 BF 4F 00 00 7A 90 0A 00 02 28 7A 50 07 00 7A 50 30 00 92 83 B2 21 18 42 -B2 21 C8 4A 00 00 30 4D CA C6 02 23 53 00 0D 12 -84 12 CC C6 06 C7 2D 83 09 93 E2 23 0E 93 E0 23 -3D 41 30 4D FA C6 02 23 3E 00 9F 42 B2 21 00 00 +B2 21 C8 4A 00 00 30 4D 1A C8 02 23 53 00 0D 12 +84 12 1C C8 56 C8 2D 83 09 93 E2 23 0E 93 E0 23 +3D 41 30 4D 4A C8 02 23 3E 00 9F 42 B2 21 00 00 3E 40 B2 21 2E 8F 30 4D 00 00 04 48 4F 4C 44 00 4A 4E 3E 4F DA 3F 00 00 04 53 49 47 4E 00 0E 93 -3E 4F 7A 40 2D 00 D1 33 30 4D 0A C6 02 55 2E 00 +3E 4F 7A 40 2D 00 D1 33 30 4D 56 C7 02 55 2E 00 08 43 2F 83 8F 4E 00 00 0E 48 0D 12 0E 12 3E F3 06 34 BF E3 00 00 3E E3 9F 53 00 00 0E 63 84 12 -C0 C6 FE C6 86 C6 3E C7 1A C7 10 C6 AC CA C0 C5 -10 C7 F2 C5 01 2E 0E 93 E3 37 38 43 E2 3F 38 C7 -82 53 22 00 82 43 B4 21 0D 12 84 12 0E C4 18 C4 -F4 C9 0E C4 22 00 DC C7 AA C7 B2 40 20 00 B4 21 -6E 4E 1E 53 1E B3 82 6E C6 21 3D 41 3E 4F 30 4D -84 C7 82 2E 22 00 0D 12 84 12 94 C7 0E C4 10 C6 -F4 C9 10 C7 00 00 04 57 4F 52 44 00 3C 40 C0 21 -39 4C 3A 4C 09 5A 3A 5C 28 4C 09 9A 18 24 7E 9A -FC 27 1A 83 3B 40 60 00 15 42 B4 21 C8 4C 00 00 -09 9A 0B 24 7C 4A 4E 9C 08 24 18 53 4B 9C F6 2F -7C 90 7B 00 F3 2F 4C 85 F1 3F 35 40 E2 C4 1A 82 -C2 21 82 4A C4 21 1E 42 C6 21 08 8E CE 48 00 00 -30 4D 00 00 04 46 49 4E 44 00 2F 83 0C 4E 66 4C -75 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 C5 48 96 F7 23 0A 4C FA 99 -01 00 F3 23 1A 53 58 83 FA 23 19 B3 09 63 0C 49 -CE 93 00 00 1E 43 01 30 2E 83 8F 4C 00 00 36 40 -F0 C4 35 40 E2 C4 30 4D 00 00 07 3E 4E 55 4D 42 -45 52 3C 4F 38 4F 29 4F 2F 82 1B 42 DC 21 6A 4C -7A 80 30 00 7A 90 0A 00 05 28 7A 80 07 00 7A 90 -0A 00 12 28 0A 9B 22 C3 0F 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 E3 23 8F 4C 00 00 8F 48 02 00 -8F 49 04 00 30 4D 32 C0 00 02 1B 42 DC 21 0C 43 -2D 15 3D 40 42 C9 09 43 08 43 3F 82 8F 4E 06 00 -0C 4E 7E 4C 6A 4C 7A 90 2D 00 04 28 C9 23 B1 43 -02 00 0B 3C 2B 43 7A 80 25 00 07 24 3B 52 6A 53 -04 24 3B 40 10 00 5A 83 3A 20 1C 53 1E 83 EA 23 -09 24 44 C9 34 24 2D 83 7A 90 28 00 03 20 8F 93 -04 00 C7 23 32 B0 00 02 2A 20 32 D0 00 02 7A 90 -F7 00 BF 27 7A 90 F5 00 22 20 0A 4E 09 43 8F 49 -02 00 5A 83 09 4A 09 5C 69 49 79 80 30 00 79 90 -0A 00 05 28 79 80 07 00 79 90 0A 00 0A 28 09 9B -08 2C 8F 49 00 00 0E 4B 2C 15 B0 12 74 C4 2A 17 -E6 3F 9F 4F 04 00 02 00 AF 4F 04 00 4A 93 2B 17 -0E 4C 82 4B DC 21 06 24 32 C0 00 02 3F 50 06 00 -0E F3 30 4D 2F 53 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 -00 00 01 2C 1A 42 C6 21 8A 4E 00 00 A2 53 C6 21 -3E 4F 30 4D F2 C9 87 4C 49 54 45 52 41 4C 82 93 -BE 21 0C 24 1A 42 C6 21 A2 52 C6 21 BA 40 0E C4 -00 00 8A 4E 02 00 3E 4F 32 B0 00 02 32 C0 00 02 -06 24 19 4A 02 00 8A 4E 02 00 0E 49 EB 3F 30 4D -16 C7 05 43 4F 55 4E 54 2F 83 1E 53 8F 4E 00 00 -5E 4E FF FF 30 4D 4C C7 05 54 52 45 41 54 0D 12 -84 12 BA C4 AC CA DC C7 6A CA A7 26 3D 40 72 CA -E4 3E 74 CA 0A 4E 3E 4F 3D 40 8E CA 3C 27 3D 40 -64 CA 1A E2 BE 21 B6 27 0E 12 3E 4F 30 41 90 CA -3E 4F 3D 40 64 CA BB 23 DE 53 00 00 68 4E 08 5E -F8 40 3F 00 00 00 3D 40 A6 CC CE 3F 86 12 20 00 -00 00 04 51 55 49 54 00 82 43 08 18 31 40 E0 20 -B2 40 00 20 00 20 82 43 BE 21 84 12 40 C6 CA C4 -AC CA C0 C5 5E CA 76 C6 A6 C6 18 C4 0C 73 74 61 -63 6B 20 65 6D 70 74 79 21 00 2E CB 0E C4 40 FF -2C C4 AE C6 18 C4 0A 46 52 41 4D 20 66 75 6C 6C -21 00 2E CB 3E C4 CC CA FE C4 05 41 42 4F 52 54 -3F 40 80 20 D1 3F 0A CB 86 41 42 4F 52 54 22 00 -0D 12 84 12 94 C7 0E C4 2E CB F4 C9 10 C7 8F 93 -02 00 03 20 2F 52 3E 4F 30 4D B0 12 02 D0 68 43 -B0 12 66 C5 0D 12 84 12 88 CF 0E C4 DE 21 F8 C4 -DC C5 18 C4 05 1B 5B 37 6D 40 10 C6 0E C4 02 18 -F8 C4 86 C7 5A C6 42 C4 76 CB 18 C4 05 6C 69 6E -65 3A 10 C6 50 C7 10 C6 18 C4 04 1B 5B 30 6D 00 -10 C6 10 CB 00 00 83 5B 27 5D 0D 12 84 12 9E CB -0E C4 0E C4 F4 C9 F4 C9 10 C7 34 C8 01 27 0D 12 -84 12 AC CA DC C7 3A C8 42 C4 AE CB 10 C7 98 CA -BC C6 81 5C 92 42 C0 21 C4 21 30 4D 86 CB 81 5B -82 43 BE 21 30 4D B2 CB 01 5D B2 43 BE 21 30 4D -B2 CA 88 50 4F 53 54 50 4F 4E 45 00 0D 12 84 12 -AC CA DC C7 3A C8 5A C6 42 C4 AE CB A6 C6 42 C4 -FE CB 0E C4 0E C4 F4 C9 F4 C9 0E C4 F4 C9 F4 C9 -10 C7 2A C7 09 49 4D 4D 45 44 49 41 54 45 1A 42 -B6 21 FA D0 80 00 00 00 30 4D BE CB 01 3A 30 12 -66 CC 92 B3 C6 21 A2 63 C6 21 0D 12 84 12 AC CA -DC C7 34 CC 3D 41 08 4E 7A 4E 5A D3 5A 53 0A 58 +10 C8 4E C8 EE C4 8E C8 6A C8 5C C7 24 CC FA C6 +60 C8 44 C7 01 2E 0E 93 E3 37 38 43 E2 3F 88 C8 +82 53 22 00 82 43 B4 21 0D 12 84 12 0A C4 14 C4 +5A CB 0A C4 22 00 2C C9 FA C8 B2 40 20 00 B4 21 +6E 4E 1E 53 1E B3 82 6E C6 21 3E 4F 3D 41 30 4D +D4 C8 82 2E 22 00 0D 12 84 12 E4 C8 0A C4 5C C7 +5A CB 60 C8 F8 C5 04 57 4F 52 44 00 3C 40 C0 21 +39 4C 3A 4C 09 5A 3A 5C 28 4C 09 9A 1D 24 7E 9A +FC 27 1A 83 3B 40 60 00 15 42 B4 21 FA 90 27 00 +00 00 01 20 05 43 C8 4C 00 00 09 9A 0B 24 7C 4A +4E 9C 08 24 18 53 4B 9C F6 2F 7C 90 7B 00 F3 2F +4C 85 F1 3F 35 40 D4 C4 1A 82 C2 21 82 4A C4 21 +1E 42 C6 21 08 8E CE 48 00 00 30 4D 00 00 04 46 +49 4E 44 00 2F 83 0C 4E 66 4C 75 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 C5 48 96 F7 23 0A 4C FA 99 01 00 F3 23 1A 53 +58 83 FA 23 19 B3 09 63 0C 49 CE 93 00 00 1E 43 +01 30 2E 83 8F 4C 00 00 36 40 E2 C4 35 40 D4 C4 +30 4D 00 00 07 3E 4E 55 4D 42 45 52 3C 4F 38 4F +29 4F 2F 82 1B 42 DC 21 6A 4C 7A 80 30 00 7A 90 +0A 00 05 28 7A 80 07 00 7A 90 0A 00 12 28 0A 9B +22 C3 0F 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 +E3 23 8F 4C 00 00 8F 48 02 00 8F 49 04 00 30 4D +32 C0 00 02 1B 42 DC 21 0C 43 2D 15 3D 40 AE CA +09 43 08 43 3F 82 8F 4E 06 00 0C 4E 7E 4C FC 90 +27 00 00 00 07 20 5C 4C 01 00 8F 4C 04 00 7E 90 +03 00 48 3C 6A 4C 7A 80 2D 00 04 28 BD 23 B1 43 +02 00 0A 3C 2B 43 7A 52 07 24 3B 52 6A 53 04 24 +3B 40 10 00 7A 53 36 20 1C 53 1E 83 EB 3F B0 CA +31 24 2D 83 7A 90 28 00 C1 27 32 B0 00 02 2A 20 +32 D0 00 02 7A 90 F7 00 B9 27 7A 90 F5 00 22 20 +0A 4E 09 43 8F 49 02 00 5A 83 09 4A 09 5C 69 49 +79 80 30 00 79 90 0A 00 05 28 79 80 07 00 79 90 +0A 00 0A 28 09 9B 08 2C 8F 49 00 00 0E 4B 2C 15 +B0 12 66 C4 2A 17 E6 3F 9F 4F 04 00 02 00 AF 4F +04 00 4A 93 2B 17 0E 4C 82 4B DC 21 06 24 32 C0 +00 02 3F 50 06 00 0E F3 30 4D 2F 53 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 00 00 01 2C 1A 42 C6 21 8A 4E +00 00 A2 53 C6 21 3E 4F 30 4D E6 C7 05 41 4C 4C +4F 54 82 5E C6 21 3E 4F 30 4D 58 CB 87 4C 49 54 +45 52 41 4C 82 93 BE 21 0D 24 09 4E 1A 42 C6 21 +A2 52 C6 21 BA 40 0A C4 00 00 8A 49 02 00 3E 4F +32 B0 00 02 32 C0 00 02 03 24 8A 4E 02 00 EE 3F +30 4D 66 C8 05 43 4F 55 4E 54 2F 83 1E 53 8F 4E +00 00 5E 4E FF FF 30 4D 7A C8 09 49 4E 54 45 52 +50 52 45 54 0D 12 84 12 AC C4 24 CC 2C C9 E0 CB +94 26 3D 40 E8 CB D6 3E EA CB 0A 4E 3E 4F 3D 40 +04 CC 2E 27 3D 40 DA CB 1A E2 BE 21 AE 27 0E 12 +3E 4F 30 41 06 CC 3E 4F 3D 40 DA CB BB 23 DE 53 +00 00 68 4E 08 5E F8 40 3F 00 00 00 3D 40 96 CD +CC 3F 0E CC 86 12 20 00 3F 40 80 20 0E 43 31 40 +E0 20 B2 40 00 20 00 20 82 43 BE 21 84 12 8E C7 +BC C4 D4 CB C4 C7 F6 C7 14 C4 0C 73 74 61 63 6B +20 65 6D 70 74 79 21 00 2A C5 0A C4 40 FF 28 C4 +FE C7 14 C4 0A 46 52 41 4D 20 66 75 6C 6C 21 00 +2A C5 3A C4 3E CC 6C CB 86 41 42 4F 52 54 22 00 +0D 12 84 12 E4 C8 0A C4 2A C5 5A CB 60 C8 8E C9 +01 27 0D 12 84 12 24 CC 2C C9 94 C9 34 C4 22 CC +60 C8 00 00 83 5B 27 5D 0D 12 84 12 92 CC 0A C4 +0A C4 5A CB 5A CB 60 C8 A4 CC 81 5B 82 43 BE 21 +30 4D 0C C8 01 5D B2 43 BE 21 30 4D C4 CC 81 5C +92 42 C0 21 C4 21 30 4D 00 00 88 50 4F 53 54 50 +4F 4E 45 00 0D 12 84 12 24 CC 2C C9 94 C9 A8 C7 +34 C4 22 CC F6 C7 34 C4 06 CD 0A C4 0A C4 5A CB +5A CB 0A C4 5A CB 5A CB 60 C8 BA CC 01 3A 30 12 +56 CD 92 B3 C6 21 A2 63 C6 21 0D 12 84 12 24 CC +2C C9 24 CD 3D 41 08 4E 7A 4E 5A D3 5A 53 0A 58 19 42 DA 21 6E 4E 3E F0 1E 00 09 5E 3E 4F 82 48 B6 21 82 49 B8 21 82 4A BA 21 82 4F BC 21 2A 52 82 4A C6 21 30 41 BA 40 0D 12 FC FF BA 40 84 12 FE FF B2 43 BE 21 30 4D 82 9F BC 21 09 20 18 42 B6 21 19 42 B8 21 A8 49 FE FF 89 48 00 00 30 4D -0D 12 84 12 18 C4 0F 73 74 61 63 6B 20 6D 69 73 -6D 61 74 63 68 21 3A CB 1C CC 81 3B 82 93 BE 21 -81 27 0D 12 84 12 0E C4 10 C7 F4 C9 78 CC C0 CB -10 C7 42 CA 06 43 52 45 41 54 45 00 B0 12 22 CC -BA 40 86 12 FC FF 8A 4A FE FF D5 3F C4 CC 04 43 -4F 44 45 00 B0 12 22 CC A2 82 C6 21 0D 12 84 12 -02 CF DC CE 10 C7 00 00 07 45 4E 44 43 4F 44 45 -0D 12 84 12 78 CC 1C CF 10 C7 18 CB 03 41 53 4D -B2 40 E0 CE DA 21 E6 3F F8 CC 06 45 4E 44 41 53 -4D 00 0D 12 84 12 00 CD 3A CF 10 C7 00 00 05 43 -4F 4C 4F 4E 1A 42 C6 21 BA 40 0D 12 00 00 BA 40 -84 12 02 00 A2 52 C6 21 B2 43 BE 21 30 40 1C CF -00 00 05 4C 4F 32 48 49 A2 83 C6 21 1A 42 C6 21 -EE 3F 04 CC 85 48 49 32 4C 4F 0D 12 84 12 2C C4 -AA CE F4 C9 C0 CB EC CC 10 C7 AA CC 86 5B 54 48 -45 4E 5D 00 30 4D 0C 4E 38 4F 3B 4F 39 4F 0E 4B -0E 5C 10 24 1B 83 06 30 1C 83 04 30 19 53 F9 98 -FF FF F5 27 2D 4D 3E 4F 30 4D 2F 53 9F 83 00 00 -F9 23 2F 53 2D 53 F7 3F 7C CD 86 5B 45 4C 53 45 -5D 00 0D 12 84 12 0E C4 00 00 94 C6 AC CA DC C7 -48 CA 52 C6 42 C4 14 CE 60 C6 18 C4 06 5B 54 48 -45 4E 5D 00 86 CD EE CD AA CD CC CD 10 C7 60 C6 -18 C4 06 5B 45 4C 53 45 5D 00 86 CD 04 CE AA CD -CA CD 10 C7 18 C4 04 5B 49 46 5D 00 86 CD CC CD -3E C4 CA CD 34 C6 18 C4 05 0D 0A 6B 6F 20 10 C6 -CA C4 BA C4 3E C4 CC CD BA CD 84 5B 49 46 5D 00 -0E 93 3E 4F C6 27 30 4D 2F 53 30 4D 2A CE 89 5B -44 45 46 49 4E 45 44 5D 0D 12 84 12 AC CA DC C7 -3A C8 38 CE 10 C7 3E CE 8B 5B 55 4E 44 45 46 49 -4E 45 44 5D 0D 12 84 12 48 CE A0 C6 10 C7 70 CE -3D 41 B2 4E 0E 18 A2 4E 0C 18 3E 4F 8F 3C 06 CA -06 4D 41 52 4B 45 52 00 B0 12 22 CC BA 40 85 12 -FC FF BA 40 6E CE FE FF 9A 42 C8 21 00 00 28 83 -8A 48 02 00 A2 52 C6 21 EA 3E 2E 53 30 4D 0E C4 -CA 21 98 C6 10 C7 85 12 AE CE 0C CD EE D0 D6 C5 -9C CB 64 CD 98 C5 80 CE C2 C7 AC CF C6 CF 58 CA -3A D0 00 00 58 CE C8 CB 9A C8 00 00 85 12 AE CE -28 D6 8E D6 D0 D5 DE D6 96 D5 00 00 62 D3 00 00 -A6 D7 8A D7 FA D5 38 D6 72 D4 00 00 00 00 FA D6 -DA CE 3A 40 0C 00 39 40 D6 21 08 49 28 53 19 83 -18 83 E8 49 00 00 1A 83 FA 23 30 4D 3A 40 0E 00 -38 40 CA 21 09 48 29 53 F8 49 00 00 18 53 1A 83 -FB 23 30 4D 82 43 CC 21 30 4D 92 42 CA 21 DA 21 -30 4D B6 CE 34 CF 3A CF 4A CF 3A 4E 82 4A C8 21 -2E 4E 82 4E C6 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 D2 CB 09 50 -57 52 5F 53 54 41 54 45 85 12 42 CF 00 CF B2 D7 -90 C7 09 52 53 54 5F 53 54 41 54 45 92 42 0E 18 -8C CF 92 42 0C 18 8E CF EF 3F 7E CF 08 50 57 52 -5F 48 45 52 45 00 92 42 C8 21 8C CF 92 42 C6 21 -8E CF 30 4D 92 CF 08 52 53 54 5F 48 45 52 45 00 -92 42 C8 21 0E 18 92 42 C6 21 0C 18 EC 3F D6 C7 -04 57 49 50 45 00 B2 40 00 CF 0E 18 B2 40 B2 D7 -0C 18 30 12 9C CF B2 40 04 C4 02 C4 B2 40 44 D0 -42 D0 B2 40 C4 C5 C2 C5 B2 40 44 C6 42 C6 B2 40 -A0 C5 9E C5 B2 40 F8 00 0A 18 34 40 10 C7 37 40 -86 C6 36 40 F0 C4 35 40 E2 C4 B2 40 20 00 B4 21 -B2 40 0A 00 DC 21 30 41 E0 CF 04 57 41 52 4D 00 -30 40 44 D0 3D 40 96 D0 92 C3 30 01 1E 42 08 18 -00 40 F2 B0 10 00 00 02 02 20 3E E3 1E 53 0E 93 -19 24 13 34 39 40 10 00 29 83 B9 43 80 FF FC 23 -B9 40 F8 D0 FE FF 29 83 B9 40 F4 D0 FE FF 39 90 -AC FF F9 23 B2 40 18 C5 E0 FF 0E 93 AC 33 2E 93 -7B 27 84 2F 30 4D 18 C4 07 0D 0A 1B 5B 37 6D 40 -10 C6 0E C4 02 18 F8 C4 86 C7 0E C4 23 00 C0 C5 -86 C7 18 C4 19 46 61 73 74 46 6F 72 74 68 20 C2 -A9 4A 2E 4D 2E 54 68 6F 6F 72 65 6E 73 20 10 C6 -0E C4 40 FF 2C C4 90 C6 50 C7 18 C4 0A 62 79 74 -65 73 20 66 72 65 65 00 3E C4 76 CB DE CC 04 43 -4F 4C 44 00 30 40 7A C5 B2 D0 03 00 04 01 B2 D0 -10 00 00 01 B2 40 80 5A CC 01 B2 43 02 02 B2 D3 -06 02 D2 43 24 02 F2 D3 26 02 F2 40 FD 00 22 02 -E2 D2 24 02 B2 40 00 A5 60 01 B2 40 F3 00 80 01 -B2 40 07 00 82 01 B2 40 FC 00 84 01 39 40 80 00 -B2 D0 10 00 86 01 92 D2 5E 01 08 18 38 40 59 14 -18 83 FE 23 19 83 FA 23 B2 D0 C0 07 40 05 18 42 -02 18 08 11 38 D0 00 04 82 48 54 05 F2 D0 0C 00 -0A 02 92 C3 40 05 A2 D2 6A 05 39 40 00 10 29 83 -89 43 00 20 FC 23 31 40 E0 20 3F 40 80 20 30 12 -40 D0 37 3F 38 40 C0 21 0A 4E 39 48 2E 48 09 5E -1E 52 C4 21 09 9E 03 24 7A 9E FC 27 1E 83 0A 4E -2A 88 82 4A C4 21 30 4D 1C 15 84 12 DC C7 3A C8 -38 C4 CC D1 F6 C8 42 C4 AE CB E6 D1 CE D1 3C 4E -3C 80 87 12 08 24 1C 53 02 20 2E 4E 04 3C 2E 53 -1C 53 01 24 2E 82 1B 17 30 41 3E 40 28 00 B0 12 -B8 D1 19 42 C6 21 A2 53 C6 21 89 4E 00 00 3E 40 -29 00 1C 15 92 92 C0 21 C4 21 02 20 30 40 90 CC -12 12 C4 21 92 53 C4 21 84 12 DC C7 F6 C8 42 C4 -2E D2 24 D2 21 53 3E 90 10 00 80 2D DC 2B 30 D2 -B2 41 C4 21 D8 3F 0D 12 84 12 AC CA 94 D1 40 D2 -0C 43 1B 42 C6 21 A2 53 C6 21 6A 4E 3E 4F 7A 90 -23 00 27 20 92 53 C4 21 B0 12 B8 D1 3C 40 00 03 -0E 93 1C 24 3C 40 10 03 1E 93 18 24 3C 40 20 03 -2E 93 14 24 3C 40 20 02 2E 92 10 24 3C 40 30 02 -3E 92 0C 24 3C 40 30 03 3E 93 08 24 3C 40 30 00 -19 42 C6 21 A2 53 C6 21 89 4E 00 00 3E 4F 3D 41 -30 4D 7A 90 26 00 07 20 3C 40 10 02 92 53 C4 21 -B0 12 B8 D1 ED 3F 7A 90 40 00 16 20 3C 40 20 00 -92 53 C4 21 B0 12 02 D2 0C 20 3C 50 10 00 3E 40 -2B 00 B0 12 02 D2 92 92 C0 21 C4 21 02 24 92 53 -C4 21 8E 10 0C 5E DA 3F B0 12 02 D2 FA 23 3C 50 -10 00 B0 12 EA D1 EF 3F 0C 43 1B 42 C6 21 A2 53 -C6 21 0D 12 84 12 AC CA 94 D1 0C D3 FE 90 26 00 -00 00 3E 40 20 00 03 20 3C 50 82 00 C7 3F B0 12 -02 D2 E0 23 3C 50 80 00 B0 12 EA D1 DB 3F 00 00 -04 52 45 54 49 00 0D 12 84 12 0E C4 00 13 F4 C9 -10 C7 0E C4 2C 00 36 D2 02 D3 4C D3 09 4B 2E 4E -0E DC A2 3F 52 CD 03 4D 4F 56 85 12 42 D3 00 40 -56 D3 05 4D 4F 56 2E 42 85 12 42 D3 40 40 00 00 -03 41 44 44 85 12 42 D3 00 50 70 D3 05 41 44 44 -2E 42 85 12 42 D3 40 50 7C D3 04 41 44 44 43 00 -85 12 42 D3 00 60 8A D3 06 41 44 44 43 2E 42 00 -85 12 42 D3 40 60 30 D3 04 53 55 42 43 00 85 12 -42 D3 00 70 A8 D3 06 53 55 42 43 2E 42 00 85 12 -42 D3 40 70 B6 D3 03 53 55 42 85 12 42 D3 00 80 -C6 D3 05 53 55 42 2E 42 85 12 42 D3 40 80 2E CD -03 43 4D 50 85 12 42 D3 00 90 E0 D3 05 43 4D 50 -2E 42 85 12 42 D3 40 90 1A CD 04 44 41 44 44 00 -85 12 42 D3 00 A0 FA D3 06 44 41 44 44 2E 42 00 -85 12 42 D3 40 A0 EC D3 03 42 49 54 85 12 42 D3 -00 B0 18 D4 05 42 49 54 2E 42 85 12 42 D3 40 B0 -24 D4 03 42 49 43 85 12 42 D3 00 C0 32 D4 05 42 -49 43 2E 42 85 12 42 D3 40 C0 3E D4 03 42 49 53 -85 12 42 D3 00 D0 4C D4 05 42 49 53 2E 42 85 12 -42 D3 40 D0 00 00 03 58 4F 52 85 12 42 D3 00 E0 -66 D4 05 58 4F 52 2E 42 85 12 42 D3 40 E0 98 D3 -03 41 4E 44 85 12 42 D3 00 F0 80 D4 05 41 4E 44 -2E 42 85 12 42 D3 40 F0 AC CA 36 D2 9E D4 0A 4C -3C F0 70 00 8A 10 3A F0 0F 00 0C DA 4F 3F D2 D3 -03 52 52 43 85 12 98 D4 00 10 B0 D4 05 52 52 43 -2E 42 85 12 98 D4 40 10 BC D4 04 53 57 50 42 00 -85 12 98 D4 80 10 CA D4 03 52 52 41 85 12 98 D4 -00 11 D8 D4 05 52 52 41 2E 42 85 12 98 D4 40 11 -E4 D4 03 53 58 54 85 12 98 D4 80 11 00 00 04 50 -55 53 48 00 85 12 98 D4 00 12 FE D4 06 50 55 53 -48 2E 42 00 85 12 98 D4 40 12 58 D4 04 43 41 4C -4C 00 85 12 98 D4 80 12 1A 53 0E 4A 0D 12 84 12 -86 C7 18 C4 0D 6F 75 74 20 6F 66 20 62 6F 75 6E -64 73 3A CB F2 D4 03 53 3E 3D 86 12 00 38 46 D5 -02 53 3C 00 86 12 00 34 0C D5 03 30 3E 3D 86 12 -00 30 5A D5 02 30 3C 00 86 12 00 30 00 00 02 55 -3C 00 86 12 00 2C 6E D5 03 55 3E 3D 86 12 00 28 -64 D5 03 30 3C 3E 86 12 00 24 82 D5 02 30 3D 00 -86 12 00 20 00 00 02 49 46 00 1A 42 C6 21 8A 4E -00 00 A2 53 C6 21 0E 4A 30 4D 78 D5 04 54 48 45 -4E 00 1A 42 C6 21 08 4E 3E 4F 09 48 29 53 0A 89 -0A 11 3A 90 00 02 B1 2F 88 DA 00 00 30 4D 08 D4 -04 45 4C 53 45 00 1A 42 C6 21 BA 40 00 3C 00 00 -A2 53 C6 21 2F 83 8F 4A 00 00 E3 3F 1C D5 05 42 -45 47 49 4E 30 40 2C C4 AC D5 05 55 4E 54 49 4C -3A 4F 08 4E 3E 4F 19 42 C6 21 2A 83 0A 89 0A 11 -3A 90 00 FE 8A 3B 3A F0 FF 03 08 DA 89 48 00 00 -A2 53 C6 21 30 4D 8C D4 05 41 47 41 49 4E 0A 4E -38 40 00 3C E7 3F 00 00 05 57 48 49 4C 45 0D 12 -84 12 9A D5 6C C6 10 C7 50 D5 06 52 45 50 45 41 -54 00 0D 12 84 12 2E D6 B2 D5 10 C7 5E D6 3D 41 -08 4E 3E 4F 2A 48 B2 92 C4 21 CB 2F 98 42 C6 21 -00 00 30 4D EE D5 03 42 57 31 85 12 5C D6 00 00 -76 D6 03 42 57 32 85 12 5C D6 00 00 82 D6 03 42 -57 33 85 12 5C D6 00 00 9A D6 3D 41 1A 42 C6 21 -28 4E B2 92 C4 21 88 2B BA 4F 00 00 A2 53 C6 21 -8E 4A 00 00 3E 4F 30 4D 00 00 03 46 57 31 85 12 -98 D6 00 00 BA D6 03 46 57 32 85 12 98 D6 00 00 -C6 D6 03 46 57 33 85 12 98 D6 00 00 D2 D6 04 47 -4F 54 4F 00 2F 83 8F 4E 00 00 3E 40 00 3C 0D 12 -84 12 9E CB 88 CA 10 C7 00 00 05 3F 47 4F 54 4F -3E 90 00 30 F4 27 3E E0 00 04 3E B0 00 10 EF 27 -3E E0 00 08 EC 3F AC CA 94 D1 1C D7 92 53 C4 21 -3E 40 2C 00 84 12 DC C7 F6 C8 42 C4 AE CB F8 D2 -32 D7 0A 4E 3E 4F 1A 83 F7 32 29 4E 59 0E 0A 28 -08 4C 59 0A 01 28 0C 8A 08 8A 38 90 10 00 EC 2E -5A 0E AB 3E 2A 92 E8 2E 8A 10 5A 06 A6 3E 4A D6 -04 52 52 43 4D 00 85 12 16 D7 50 00 60 D7 04 52 -52 41 4D 00 85 12 16 D7 50 01 6E D7 04 52 4C 41 -4D 00 85 12 16 D7 50 02 7C D7 04 52 52 55 4D 00 -85 12 16 D7 50 03 8C D5 05 50 55 53 48 4D 85 12 -16 D7 00 15 98 D7 04 50 4F 50 4D 00 85 12 16 D7 -00 17 +0D 12 84 12 14 C4 0F 73 74 61 63 6B 20 6D 69 73 +6D 61 74 63 68 21 36 C5 0C CD 81 3B 82 93 BE 21 +97 27 0D 12 84 12 0A C4 60 C8 5A CB 68 CD BC CC +60 C8 CA CB 09 49 4D 4D 45 44 49 41 54 45 18 42 +B6 21 F8 D0 80 00 00 00 30 4D B4 CB 06 43 52 45 +41 54 45 00 B0 12 12 CD BA 40 86 12 FC FF 8A 4A +FE FF C9 3F CC CD 04 43 4F 44 45 00 B0 12 12 CD +A2 82 C6 21 0D 12 84 12 0C D0 E6 CF 60 C8 00 00 +07 45 4E 44 43 4F 44 45 0D 12 84 12 68 CD 26 D0 +60 C8 78 CC 03 41 53 4D B2 40 EA CF DA 21 E6 3F +00 CE 06 45 4E 44 41 53 4D 00 0D 12 84 12 08 CE +44 D0 60 C8 00 00 05 43 4F 4C 4F 4E 1A 42 C6 21 +BA 40 0D 12 00 00 BA 40 84 12 02 00 A2 52 C6 21 +B2 43 BE 21 30 40 26 D0 00 00 05 4C 4F 32 48 49 +A2 83 C6 21 1A 42 C6 21 EE 3F B4 CD 85 48 49 32 +4C 4F 0D 12 84 12 28 C4 B4 CF 5A CB BC CC F4 CD +60 C8 9A CD 86 5B 54 48 45 4E 5D 00 30 4D 0C 4E +38 4F 3B 4F 39 4F 0E 4B 0E 5C 10 24 1B 83 06 30 +1C 83 04 30 19 53 F9 98 FF FF F5 27 2D 4D 3E 4F +30 4D 2F 53 9F 83 00 00 F9 23 2F 53 2D 53 F7 3F +84 CE 86 5B 45 4C 53 45 5D 00 0D 12 84 12 0A C4 +00 00 D8 C7 24 CC 2C C9 BA CB A0 C7 34 C4 1C CF +AE C7 14 C4 06 5B 54 48 45 4E 5D 00 8E CE F6 CE +B2 CE D4 CE 60 C8 AE C7 14 C4 06 5B 45 4C 53 45 +5D 00 8E CE 0C CF B2 CE D2 CE 60 C8 14 C4 04 5B +49 46 5D 00 8E CE D4 CE 3A C4 D2 CE 82 C7 14 C4 +05 0D 0A 6B 6F 20 5C C7 BC C4 AC C4 3A C4 D4 CE +C2 CE 84 5B 49 46 5D 00 0E 93 3E 4F C6 27 30 4D +2F 53 30 4D 32 CF 89 5B 44 45 46 49 4E 45 44 5D +0D 12 84 12 24 CC 2C C9 94 C9 40 CF 60 C8 46 CF +8B 5B 55 4E 44 45 46 49 4E 45 44 5D 0D 12 84 12 +50 CF F0 C7 60 C8 78 CF B2 4E 0A 18 2E 53 BE 12 +3E 4F 3D 41 90 3C 7C CB 06 4D 41 52 4B 45 52 00 +B0 12 12 CD BA 40 85 12 FC FF BA 40 76 CF FE FF +28 83 8A 48 00 00 BA 40 AA C4 04 00 B2 50 06 00 +C6 21 DD 3E 2E 53 30 4D 0A C4 CA 21 E8 C7 60 C8 +85 12 B8 CF 14 CE E6 CD 10 C7 90 CC 6C CE D2 C6 +88 CF 12 C9 B0 D0 C4 D0 9C C8 26 C9 00 00 60 CF +CE CC F4 C9 00 00 85 12 B8 CF 64 D6 CA D6 0C D6 +1A D7 D2 D5 00 00 9E D3 00 00 E2 D7 C6 D7 36 D6 +74 D6 AE D4 00 00 00 00 36 D7 E4 CF 3A 40 0C 00 +39 40 D6 21 08 49 28 53 19 83 18 83 E8 49 00 00 +1A 83 FA 23 30 4D 3A 40 0E 00 38 40 CA 21 09 48 +29 53 F8 49 00 00 18 53 1A 83 FB 23 30 4D 82 43 +CC 21 30 4D 92 42 CA 21 DA 21 30 4D C0 CF 3E D0 +44 D0 54 D0 1A 42 20 18 82 4A C8 21 2E 4E 82 4E +C6 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 DA CC 09 50 57 52 5F 53 +54 41 54 45 85 12 4C D0 EE D7 E0 C8 09 52 53 54 +5F 53 54 41 54 45 92 42 0A 18 98 D0 F3 3F 8A D0 +08 50 57 52 5F 48 45 52 45 00 92 42 C6 21 98 D0 +30 4D 9C D0 08 52 53 54 5F 48 45 52 45 00 92 42 +C6 21 0A 18 F2 3F 3E 90 0E 00 DC 27 2E 92 E3 37 +0E 93 D8 37 39 40 10 00 29 83 B9 43 80 FF FC 23 +B9 40 22 D1 FE FF 29 83 B9 40 E0 C5 FE FF 39 90 +AE FF F9 23 39 40 14 18 B2 49 E2 C5 B2 49 FA C4 +B2 49 02 C4 B2 49 00 C6 B2 49 E0 FF B2 49 0A 18 +C2 3F B2 D0 03 00 04 01 B2 D0 10 00 00 01 B2 40 +80 5A CC 01 31 40 E0 20 3F 40 80 20 39 40 00 10 +29 83 89 43 00 20 FC 23 B2 43 02 02 B2 D3 06 02 +D2 43 24 02 F2 D3 26 02 F2 40 FD 00 22 02 B2 40 +00 A5 60 01 B2 40 F3 00 80 01 B2 40 07 00 82 01 +B2 40 FC 00 84 01 39 40 80 00 B2 D0 10 00 86 01 +38 40 17 11 18 83 FE 23 19 83 FA 23 1E 42 08 18 +82 43 08 18 1E D2 5E 01 B0 12 F8 C4 FE C5 38 40 +C0 21 0A 4E 39 48 2E 48 09 5E 1E 52 C4 21 09 9E +03 24 7A 9E FC 27 1E 83 0A 4E 2A 88 82 4A C4 21 +30 4D 1C 15 0E 12 12 12 C4 21 84 12 2C C9 94 C9 +F0 C7 34 C4 DE D1 50 CA 34 C4 F8 D1 F2 D1 E0 D1 +3C 4E 3C 80 87 12 05 24 1C 53 02 20 2E 4E 01 3C +2E 83 21 52 1B 17 30 41 FA D1 B2 41 C4 21 3E 41 +84 12 0A C4 2B 00 2C C9 94 C9 F0 C7 34 C4 16 D2 +50 CA 34 C4 22 CC BA C7 2C C9 50 CA 34 C4 22 CC +22 D2 3E 5F E7 3F 3E 40 28 00 B0 12 C2 D1 19 42 +C6 21 A2 53 C6 21 89 4E 00 00 3E 40 29 00 92 92 +C0 21 C4 21 02 20 30 40 80 CD 1C 15 12 12 C4 21 +92 53 C4 21 84 12 2C C9 50 CA 34 C4 6A D2 60 D2 +21 53 3E 90 10 00 C6 2B 7F 2D 6C D2 B2 41 C4 21 +C1 3F 0D 12 84 12 24 CC 9E D1 7C D2 0C 43 1B 42 +C6 21 A2 53 C6 21 6A 4E 3E 4F 7A 90 23 00 27 20 +92 53 C4 21 B0 12 C2 D1 3C 40 00 03 0E 93 1C 24 +3C 40 10 03 1E 93 18 24 3C 40 20 03 2E 93 14 24 +3C 40 20 02 2E 92 10 24 3C 40 30 02 3E 92 0C 24 +3C 40 30 03 3E 93 08 24 3C 40 30 00 19 42 C6 21 +A2 53 C6 21 89 4E 00 00 3E 4F 3D 41 30 4D 7A 90 +26 00 07 20 3C 40 10 02 92 53 C4 21 B0 12 C2 D1 +ED 3F 7A 90 40 00 16 20 3C 40 20 00 92 53 C4 21 +B0 12 4A D2 0C 20 3C 50 10 00 3E 40 2B 00 B0 12 +4A D2 92 92 C0 21 C4 21 02 24 92 53 C4 21 8E 10 +0C 5E DA 3F B0 12 4A D2 FA 23 3C 50 10 00 B0 12 +26 D2 EF 3F 0C 43 1B 42 C6 21 A2 53 C6 21 0D 12 +84 12 24 CC 9E D1 48 D3 FE 90 26 00 00 00 3E 40 +20 00 03 20 3C 50 82 00 C7 3F B0 12 4A D2 E0 23 +3C 50 80 00 B0 12 26 D2 DB 3F 00 00 04 52 45 54 +49 00 0D 12 84 12 0A C4 00 13 5A CB 60 C8 0A C4 +2C 00 72 D2 3E D3 88 D3 09 4B 2E 4E 0E DC A2 3F +5A CE 03 4D 4F 56 85 12 7E D3 00 40 92 D3 05 4D +4F 56 2E 42 85 12 7E D3 40 40 00 00 03 41 44 44 +85 12 7E D3 00 50 AC D3 05 41 44 44 2E 42 85 12 +7E D3 40 50 B8 D3 04 41 44 44 43 00 85 12 7E D3 +00 60 C6 D3 06 41 44 44 43 2E 42 00 85 12 7E D3 +40 60 6C D3 04 53 55 42 43 00 85 12 7E D3 00 70 +E4 D3 06 53 55 42 43 2E 42 00 85 12 7E D3 40 70 +F2 D3 03 53 55 42 85 12 7E D3 00 80 02 D4 05 53 +55 42 2E 42 85 12 7E D3 40 80 36 CE 03 43 4D 50 +85 12 7E D3 00 90 1C D4 05 43 4D 50 2E 42 85 12 +7E D3 40 90 22 CE 04 44 41 44 44 00 85 12 7E D3 +00 A0 36 D4 06 44 41 44 44 2E 42 00 85 12 7E D3 +40 A0 28 D4 03 42 49 54 85 12 7E D3 00 B0 54 D4 +05 42 49 54 2E 42 85 12 7E D3 40 B0 60 D4 03 42 +49 43 85 12 7E D3 00 C0 6E D4 05 42 49 43 2E 42 +85 12 7E D3 40 C0 7A D4 03 42 49 53 85 12 7E D3 +00 D0 88 D4 05 42 49 53 2E 42 85 12 7E D3 40 D0 +00 00 03 58 4F 52 85 12 7E D3 00 E0 A2 D4 05 58 +4F 52 2E 42 85 12 7E D3 40 E0 D4 D3 03 41 4E 44 +85 12 7E D3 00 F0 BC D4 05 41 4E 44 2E 42 85 12 +7E D3 40 F0 24 CC 72 D2 DA D4 0A 4C 3C F0 70 00 +8A 10 3A F0 0F 00 0C DA 4F 3F 0E D4 03 52 52 43 +85 12 D4 D4 00 10 EC D4 05 52 52 43 2E 42 85 12 +D4 D4 40 10 F8 D4 04 53 57 50 42 00 85 12 D4 D4 +80 10 06 D5 03 52 52 41 85 12 D4 D4 00 11 14 D5 +05 52 52 41 2E 42 85 12 D4 D4 40 11 20 D5 03 53 +58 54 85 12 D4 D4 80 11 00 00 04 50 55 53 48 00 +85 12 D4 D4 00 12 3A D5 06 50 55 53 48 2E 42 00 +85 12 D4 D4 40 12 94 D4 04 43 41 4C 4C 00 85 12 +D4 D4 80 12 1A 53 0E 4A 0D 12 84 12 D6 C8 14 C4 +0D 6F 75 74 20 6F 66 20 62 6F 75 6E 64 73 36 C5 +2E D5 03 53 3E 3D 86 12 00 38 82 D5 02 53 3C 00 +86 12 00 34 48 D5 03 30 3E 3D 86 12 00 30 96 D5 +02 30 3C 00 86 12 00 30 00 00 02 55 3C 00 86 12 +00 2C AA D5 03 55 3E 3D 86 12 00 28 A0 D5 03 30 +3C 3E 86 12 00 24 BE D5 02 30 3D 00 86 12 00 20 +00 00 02 49 46 00 1A 42 C6 21 8A 4E 00 00 A2 53 +C6 21 0E 4A 30 4D B4 D5 04 54 48 45 4E 00 1A 42 +C6 21 08 4E 3E 4F 09 48 29 53 0A 89 0A 11 3A 90 +00 02 B1 2F 88 DA 00 00 30 4D 44 D4 04 45 4C 53 +45 00 1A 42 C6 21 BA 40 00 3C 00 00 A2 53 C6 21 +2F 83 8F 4A 00 00 E3 3F 58 D5 05 42 45 47 49 4E +30 40 28 C4 E8 D5 05 55 4E 54 49 4C 3A 4F 08 4E +3E 4F 19 42 C6 21 2A 83 0A 89 0A 11 3A 90 00 FE +8A 3B 3A F0 FF 03 08 DA 89 48 00 00 A2 53 C6 21 +30 4D C8 D4 05 41 47 41 49 4E 0A 4E 38 40 00 3C +E7 3F 00 00 05 57 48 49 4C 45 0D 12 84 12 D6 D5 +BA C7 60 C8 8C D5 06 52 45 50 45 41 54 00 0D 12 +84 12 6A D6 EE D5 60 C8 9A D6 3D 41 08 4E 3E 4F +2A 48 B2 92 C4 21 CB 2F 98 42 C6 21 00 00 30 4D +2A D6 03 42 57 31 85 12 98 D6 00 00 B2 D6 03 42 +57 32 85 12 98 D6 00 00 BE D6 03 42 57 33 85 12 +98 D6 00 00 D6 D6 3D 41 1A 42 C6 21 28 4E B2 92 +C4 21 88 2B BA 4F 00 00 A2 53 C6 21 8E 4A 00 00 +3E 4F 30 4D 00 00 03 46 57 31 85 12 D4 D6 00 00 +F6 D6 03 46 57 32 85 12 D4 D6 00 00 02 D7 03 46 +57 33 85 12 D4 D6 00 00 0E D7 04 47 4F 54 4F 00 +2F 83 8F 4E 00 00 3E 40 00 3C 0D 12 84 12 92 CC +FE CB 60 C8 00 00 05 3F 47 4F 54 4F 3E 90 00 30 +F4 27 3E E0 00 04 3E B0 00 10 EF 27 3E E0 00 08 +EC 3F 24 CC 9E D1 58 D7 92 53 C4 21 3E 40 2C 00 +84 12 2C C9 50 CA 34 C4 22 CC 34 D3 6E D7 0A 4E +3E 4F 1A 83 F7 32 29 4E 59 0E 0A 28 08 4C 59 0A +01 28 0C 8A 08 8A 38 90 10 00 EC 2E 5A 0E AB 3E +2A 92 E8 2E 8A 10 5A 06 A6 3E 86 D6 04 52 52 43 +4D 00 85 12 52 D7 50 00 9C D7 04 52 52 41 4D 00 +85 12 52 D7 50 01 AA D7 04 52 4C 41 4D 00 85 12 +52 D7 50 02 B8 D7 04 52 52 55 4D 00 85 12 52 D7 +50 03 C8 D5 05 50 55 53 48 4D 85 12 52 D7 00 15 +D4 D7 04 50 4F 50 4D 00 85 12 52 D7 00 17 @FF80 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -10 00 10 00 20 00 30 00 40 00 00 00 F4 D0 F4 D0 -F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 -F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 -F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 -18 C5 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 -F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F4 D0 F8 D0 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +77 00 10 00 12 00 14 00 16 00 00 00 E0 C5 E0 C5 +E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 +E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 +E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 +82 C6 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 +E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 E0 C5 22 D1 q diff --git a/binaries/CHIPSTICK_FR2433_8MHz_UART.txt b/binaries/CHIPSTICK_FR2433_8MHz_UART.txt index c8ba006..65d25ed 100644 --- a/binaries/CHIPSTICK_FR2433_8MHz_UART.txt +++ b/binaries/CHIPSTICK_FR2433_8MHz_UART.txt @@ -1,330 +1,336 @@ @1800 -10 00 04 00 51 55 40 1F 05 00 18 00 BE D7 1C CF -32 01 63 30 7E C5 90 C5 5C D0 5C D0 20 C5 +40 1F 04 00 51 55 18 00 F9 FF F4 D7 0C D0 33 01 +10 00 81 36 94 C5 AA C4 C6 C5 9C C5 96 C6 F4 D7 +0C D0 7C C6 94 C7 26 C7 00 C7 3C 21 62 C8 D4 C4 +E2 C4 EE C4 20 00 0A 00 2A CC 44 CC 00 00 00 00 @C400 -30 40 04 C4 B0 12 7E C5 12 D2 0A 18 F9 3F 2F 83 -8F 4E 00 00 3E 4D 30 4D 2F 82 8F 4E 02 00 7E 4D -8F 4D 00 00 0D 5E 1D B3 0D 63 30 4D 2F 83 8F 4E -00 00 1E 42 C6 21 30 4D 0E 93 3E 4F 05 24 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 21 52 2D 53 30 4D 91 53 -00 00 F7 3F 0B 4E 1C 4F 02 00 2E 4F 0A 43 35 40 -20 00 0E 93 04 20 05 11 0E 4C 0C 43 09 43 0A 9B -01 28 0A 8B 09 69 08 68 15 83 07 30 0C 5C 0E 6E -0A 6A F5 2B 0A 8B 12 D3 F5 3F 35 40 E2 C4 8F 4A -02 00 8F 49 00 00 0E 48 30 41 82 4E C0 21 B2 4F -C2 21 3E 4F 82 43 C4 21 30 4D 3F 80 06 00 8F 4E -04 00 3E 40 54 00 BF 40 3C 21 00 00 AF 4F 02 00 -12 3C 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E 30 4D -2F 83 8F 4E 00 00 3E 41 2E 4E 30 4D 00 00 06 41 -43 43 45 50 54 00 08 4E 2E 4F 08 5E 39 40 0D 00 -3A 40 20 00 3B 40 52 C5 3C 40 5E C5 5D 15 70 3F -21 52 3A 17 58 42 0C 05 48 9C 08 2C 48 9B 30 24 -78 92 11 20 2E 9F 0F 24 1E 83 05 3C 0E 9A 03 24 -CE 48 00 00 1E 53 A2 B3 1C 05 FD 27 82 48 0E 05 -30 4D 54 C5 2D 83 92 B3 1C 05 E4 23 FC 27 82 93 -DE 21 02 24 92 53 DE 21 3E 8F 3D 41 B2 40 18 00 -0A 18 92 B3 1C 05 FD 27 58 42 0C 05 30 4D A2 B3 -1C 05 FD 27 B2 40 11 00 0E 05 E2 C2 22 02 30 41 -A2 B3 1C 05 FD 27 B2 40 13 00 0E 05 E2 D2 22 02 -30 41 B2 40 4F 5A CC 01 92 B3 0A 05 FD 23 B2 40 -04 A5 20 01 00 00 03 4B 45 59 30 40 BE C5 2F 83 -8F 4E 00 00 B0 12 7E C5 92 B3 1C 05 FD 27 1E 42 -0C 05 B0 12 90 C5 30 4D 00 00 04 45 4D 49 54 00 -30 40 E4 C5 08 4E 3E 4F AE 3F DA C5 04 45 43 48 -4F 00 B2 40 82 48 4C C5 82 43 DE 21 30 4D 00 00 -06 4E 4F 45 43 48 4F 00 B2 40 30 4D 4C C5 92 43 -DE 21 30 4D 00 00 04 54 59 50 45 00 0E 93 10 24 -0D 12 3D 40 36 C6 28 4F 2F 83 8F 4E 00 00 7E 48 -8F 48 02 00 D5 3F 38 C6 2D 83 1E 83 F4 23 3D 41 -2F 53 3E 4F 30 4D 00 00 02 43 52 00 30 40 50 C6 -0D 12 84 12 18 C4 02 0D 0A 00 1C C6 1C C7 2F 83 -8F 4E 00 00 30 4D 0E 93 FA 23 30 4D 8F 4E FE FF -AF 4F FC FF 2F 82 30 4D 2A 4F 8F 4E 00 00 0E 4A -30 4D 8F 4E FE FF 3E 40 80 20 0E 8F 0E 11 2F 83 -30 4D 2F 83 8F 4E 00 00 3E 41 30 4D 3E 8F 3E E3 -1E 53 30 4D BE 4F 00 00 3E 4F 30 4D 1E 83 0E 7E -30 4D 0E 5E 0E 7E 3E E3 30 4D 3E 8F 03 24 3E 43 -01 2C 0E F3 30 4D 00 00 02 3C 23 00 B2 40 B2 21 -B2 21 30 4D 48 C6 01 23 1B 42 DC 21 2C 4F 2F 83 -B0 12 7C C4 BF 4F 00 00 7A 90 0A 00 02 28 7A 50 -07 00 7A 50 30 00 92 83 B2 21 18 42 B2 21 C8 4A -00 00 30 4D D6 C6 02 23 53 00 0D 12 84 12 D8 C6 -12 C7 2D 83 09 93 E2 23 0E 93 E0 23 3D 41 30 4D -06 C7 02 23 3E 00 9F 42 B2 21 00 00 3E 40 B2 21 -2E 8F 30 4D 00 00 04 48 4F 4C 44 00 4A 4E 3E 4F -DA 3F 00 00 04 53 49 47 4E 00 0E 93 3E 4F 7A 40 -2D 00 D1 33 30 4D 16 C6 02 55 2E 00 08 43 2F 83 -8F 4E 00 00 0E 48 0D 12 0E 12 3E F3 06 34 BF E3 -00 00 3E E3 9F 53 00 00 0E 63 84 12 CC C6 0A C7 -92 C6 4A C7 26 C7 1C C6 B8 CA E0 C5 1C C7 00 C6 -01 2E 0E 93 E3 37 38 43 E2 3F 44 C7 82 53 22 00 -82 43 B4 21 0D 12 84 12 0E C4 18 C4 00 CA 0E C4 -22 00 E8 C7 B6 C7 B2 40 20 00 B4 21 6E 4E 1E 53 -1E B3 82 6E C6 21 3D 41 3E 4F 30 4D 90 C7 82 2E -22 00 0D 12 84 12 A0 C7 0E C4 1C C6 00 CA 1C C7 -00 00 04 57 4F 52 44 00 3C 40 C0 21 39 4C 3A 4C -09 5A 3A 5C 28 4C 09 9A 18 24 7E 9A FC 27 1A 83 -3B 40 60 00 15 42 B4 21 C8 4C 00 00 09 9A 0B 24 +B0 12 C6 C5 12 D2 06 18 FB 3F 2F 83 8F 4E 00 00 +3E 4D 30 4D 2F 82 8F 4E 02 00 7E 4D 8F 4D 00 00 +0D 5E 1D B3 0D 63 30 4D 2F 83 8F 4E 00 00 1E 42 +C6 21 30 4D 0E 93 3E 4F 11 20 2D 4D 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 F0 27 21 52 2D 53 30 4D +91 53 00 00 F7 3F 0B 4E 1C 4F 02 00 2E 4F 0A 43 +35 40 20 00 0E 93 04 20 05 11 0E 4C 0C 43 09 43 +0A 9B 01 28 0A 8B 09 69 08 68 15 83 07 30 0C 5C +0E 6E 0A 6A F5 2B 0A 8B 12 D3 F5 3F 35 40 D4 C4 +8F 4A 02 00 8F 49 00 00 0E 48 30 41 82 4E C0 21 +B2 4F C2 21 82 43 C4 21 3E 4F 30 4D 3F 80 06 00 +8F 4E 04 00 3E 40 54 00 BF 40 3C 21 00 00 AF 4F +02 00 D2 3C 2F 83 8F 4E 00 00 3E 41 0D 12 3D 4E +30 4D 2F 83 8F 4E 00 00 3E 41 2E 4E 30 4D 2F 83 +8F 4E 00 00 3E 41 30 4D B0 12 AA C4 39 40 22 18 +B2 49 7A C6 B2 49 92 C7 B2 49 24 C7 B2 49 FE C6 +B2 49 CA C4 34 49 35 49 36 49 37 49 B2 49 B4 21 +B2 49 DC 21 3D 41 30 40 D8 D0 8F 93 02 00 03 20 +2F 52 3E 4F 30 4D B0 12 C6 C5 92 C3 1C 05 18 42 +00 18 39 40 41 00 19 83 FE 23 18 83 FA 23 92 B3 +1C 05 F3 23 B0 12 F8 C4 0A C4 DE 21 E2 C7 34 C7 +14 C4 04 1B 5B 37 6D 00 5E C7 AA C7 34 C4 86 C5 +14 C4 0F 4C 41 53 54 2E 34 54 48 2C 20 6C 69 6E +65 20 5E C7 A2 C8 5E C7 14 C4 04 1B 5B 30 6D 00 +5E C7 2A CC 92 B3 0A 05 FD 23 30 41 2E 93 12 28 +B2 40 81 00 00 05 92 42 02 18 06 05 92 42 04 18 +08 05 F2 D0 30 00 0A 02 92 C3 00 05 92 D3 1A 05 +92 C3 30 01 30 41 09 3C A2 B3 1C 05 FD 27 B2 40 +13 00 0E 05 E2 D2 22 02 30 41 A2 B3 1C 05 FD 27 +B2 40 11 00 0E 05 E2 C2 22 02 30 41 00 00 04 57 +49 50 45 00 B2 43 08 18 04 3C 00 00 04 43 4F 4C +44 00 B0 12 94 C5 F2 B0 10 00 00 02 02 20 B2 43 +08 18 B2 40 04 A5 20 01 EE C5 04 57 41 52 4D 00 +B0 12 9C C5 84 12 14 C4 07 0D 0A 1B 5B 37 6D 23 +5E C7 D8 C8 14 C4 19 46 61 73 74 46 6F 72 74 68 +20 C2 A9 4A 2E 4D 2E 54 68 6F 6F 72 65 6E 73 20 +5E C7 0A C4 40 FF 28 C4 D6 C7 A2 C8 14 C4 0A 62 +79 74 65 73 20 66 72 65 65 00 3A C4 86 C5 00 00 +06 41 43 43 45 50 54 00 30 40 7C C6 08 4E 2E 4F +08 5E 39 40 0D 00 3A 40 20 00 3B 40 C8 C6 3C 40 +D4 C6 5D 15 B5 3E 21 52 3A 17 58 42 0C 05 48 9B +93 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 A2 B3 1C 05 +FD 27 C2 48 0E 05 30 4D CA C6 2D 83 92 B3 1C 05 +E4 23 FC 3F 3E 8F 3D 41 B2 40 18 00 06 18 92 B3 +1C 05 FD 27 58 42 0C 05 82 93 DE 21 02 24 92 53 +DE 21 08 4C E3 3F 00 00 03 4B 45 59 30 40 00 C7 +2F 83 8F 4E 00 00 B0 12 C6 C5 92 B3 1C 05 FD 27 +1E 42 0C 05 B0 12 C8 C5 30 4D 00 00 04 45 4D 49 +54 00 30 40 26 C7 08 4E 3E 4F C8 3F 1C C7 04 45 +43 48 4F 00 B2 40 C2 48 C2 C6 82 43 DE 21 30 4D +00 00 06 4E 4F 45 43 48 4F 00 B2 40 30 4D C2 C6 +92 43 DE 21 30 4D 00 00 04 54 59 50 45 00 0E 93 +11 24 0D 12 3D 40 7A C7 28 4F 2F 83 8F 4E 00 00 +7E 48 8F 48 02 00 10 42 24 C7 7C C7 2D 83 1E 83 +F3 23 3D 41 2F 53 3E 4F 30 4D FC C5 02 43 52 00 +30 40 94 C7 0D 12 84 12 14 C4 02 0D 0A 00 5E C7 +62 C8 2F 83 8F 4E 00 00 30 4D 0E 93 FA 23 30 4D +8F 4E FE FF AF 4F FC FF 2F 82 30 4D 2A 4F 8F 4E +00 00 0E 4A 30 4D 8F 4E FE FF 3E 40 80 20 0E 8F +0E 11 2F 83 30 4D 3E 8F 3E E3 1E 53 30 4D 70 C6 +01 40 2E 4E 30 4D E0 C7 01 21 BE 4F 00 00 3E 4F +30 4D 1E 83 0E 7E 30 4D 0E 5E 0E 7E 3E E3 30 4D +3E 8F 03 24 3E 43 01 2C 0E F3 30 4D 00 00 02 3C +23 00 B2 40 B2 21 B2 21 30 4D 8C C7 01 23 1B 42 +DC 21 2C 4F 2F 83 B0 12 6E C4 BF 4F 00 00 7A 90 +0A 00 02 28 7A 50 07 00 7A 50 30 00 92 83 B2 21 +18 42 B2 21 C8 4A 00 00 30 4D 1C C8 02 23 53 00 +0D 12 84 12 1E C8 58 C8 2D 83 09 93 E2 23 0E 93 +E0 23 3D 41 30 4D 4C C8 02 23 3E 00 9F 42 B2 21 +00 00 3E 40 B2 21 2E 8F 30 4D 00 00 04 48 4F 4C +44 00 4A 4E 3E 4F DA 3F 00 00 04 53 49 47 4E 00 +0E 93 3E 4F 7A 40 2D 00 D1 33 30 4D 58 C7 02 55 +2E 00 08 43 2F 83 8F 4E 00 00 0E 48 0D 12 0E 12 +3E F3 06 34 BF E3 00 00 3E E3 9F 53 00 00 0E 63 +84 12 12 C8 50 C8 EE C4 90 C8 6C C8 5E C7 26 CC +22 C7 62 C8 42 C7 01 2E 0E 93 E3 37 38 43 E2 3F +8A C8 82 53 22 00 82 43 B4 21 0D 12 84 12 0A C4 +14 C4 5C CB 0A C4 22 00 2E C9 FC C8 B2 40 20 00 +B4 21 6E 4E 1E 53 1E B3 82 6E C6 21 3E 4F 3D 41 +30 4D D6 C8 82 2E 22 00 0D 12 84 12 E6 C8 0A C4 +5E C7 5C CB 62 C8 1A C6 04 57 4F 52 44 00 3C 40 +C0 21 39 4C 3A 4C 09 5A 3A 5C 28 4C 09 9A 1D 24 +7E 9A FC 27 1A 83 3B 40 60 00 15 42 B4 21 FA 90 +27 00 00 00 01 20 05 43 C8 4C 00 00 09 9A 0B 24 7C 4A 4E 9C 08 24 18 53 4B 9C F6 2F 7C 90 7B 00 -F3 2F 4C 85 F1 3F 35 40 E2 C4 1A 82 C2 21 82 4A +F3 2F 4C 85 F1 3F 35 40 D4 C4 1A 82 C2 21 82 4A C4 21 1E 42 C6 21 08 8E CE 48 00 00 30 4D 00 00 04 46 49 4E 44 00 2F 83 0C 4E 66 4C 75 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 C5 48 96 F7 23 0A 4C FA 99 01 00 F3 23 1A 53 58 83 FA 23 19 B3 09 63 0C 49 CE 93 00 00 -1E 43 01 30 2E 83 8F 4C 00 00 36 40 F0 C4 35 40 -E2 C4 30 4D 00 00 07 3E 4E 55 4D 42 45 52 3C 4F +1E 43 01 30 2E 83 8F 4C 00 00 36 40 E2 C4 35 40 +D4 C4 30 4D 00 00 07 3E 4E 55 4D 42 45 52 3C 4F 38 4F 29 4F 2F 82 1B 42 DC 21 6A 4C 7A 80 30 00 7A 90 0A 00 05 28 7A 80 07 00 7A 90 0A 00 12 28 0A 9B 22 C3 0F 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 E3 23 8F 4C 00 00 8F 48 02 00 8F 49 04 00 30 4D 32 C0 00 02 1B 42 DC 21 0C 43 2D 15 3D 40 -4E C9 09 43 08 43 3F 82 8F 4E 06 00 0C 4E 7E 4C -6A 4C 7A 90 2D 00 04 28 C9 23 B1 43 02 00 0B 3C -2B 43 7A 80 25 00 07 24 3B 52 6A 53 04 24 3B 40 -10 00 5A 83 3A 20 1C 53 1E 83 EA 23 09 24 50 C9 -34 24 2D 83 7A 90 28 00 03 20 8F 93 04 00 C7 23 -32 B0 00 02 2A 20 32 D0 00 02 7A 90 F7 00 BF 27 -7A 90 F5 00 22 20 0A 4E 09 43 8F 49 02 00 5A 83 -09 4A 09 5C 69 49 79 80 30 00 79 90 0A 00 05 28 -79 80 07 00 79 90 0A 00 0A 28 09 9B 08 2C 8F 49 -00 00 0E 4B 2C 15 B0 12 74 C4 2A 17 E6 3F 9F 4F -04 00 02 00 AF 4F 04 00 4A 93 2B 17 0E 4C 82 4B -DC 21 06 24 32 C0 00 02 3F 50 06 00 0E F3 30 4D -2F 53 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 00 00 01 2C -1A 42 C6 21 8A 4E 00 00 A2 53 C6 21 3E 4F 30 4D -FE C9 87 4C 49 54 45 52 41 4C 82 93 BE 21 0C 24 -1A 42 C6 21 A2 52 C6 21 BA 40 0E C4 00 00 8A 4E -02 00 3E 4F 32 B0 00 02 32 C0 00 02 06 24 19 4A -02 00 8A 4E 02 00 0E 49 EB 3F 30 4D 22 C7 05 43 -4F 55 4E 54 2F 83 1E 53 8F 4E 00 00 5E 4E FF FF -30 4D 58 C7 05 54 52 45 41 54 0D 12 84 12 BA C4 -B8 CA E8 C7 76 CA A7 26 3D 40 7E CA E4 3E 80 CA -0A 4E 3E 4F 3D 40 9A CA 3C 27 3D 40 70 CA 1A E2 -BE 21 B6 27 0E 12 3E 4F 30 41 9C CA 3E 4F 3D 40 -70 CA BB 23 DE 53 00 00 68 4E 08 5E F8 40 3F 00 -00 00 3D 40 C2 CC CE 3F 86 12 20 00 00 00 04 51 -55 49 54 00 82 43 08 18 31 40 E0 20 B2 40 00 20 -00 20 82 43 BE 21 84 12 4C C6 CA C4 B8 CA E0 C5 -6A CA 82 C6 B2 C6 18 C4 0C 73 74 61 63 6B 20 65 -6D 70 74 79 21 00 3A CB 0E C4 40 FF 2C C4 BA C6 -18 C4 0A 46 52 41 4D 20 66 75 6C 6C 21 00 3A CB -3E C4 D8 CA FE C4 05 41 42 4F 52 54 3F 40 80 20 -D1 3F 16 CB 86 41 42 4F 52 54 22 00 0D 12 84 12 -A0 C7 0E C4 3A CB 00 CA 1C C7 8F 93 02 00 03 20 -2F 52 3E 4F 30 4D B0 12 1E D0 B0 12 7E C5 92 C3 -1C 05 18 42 06 18 39 40 41 00 19 83 FE 23 18 83 -FA 23 92 B3 1C 05 F3 23 0D 12 84 12 A4 CF 0E C4 -DE 21 F8 C4 F2 C5 18 C4 04 1B 5B 37 6D 00 1C C6 -66 C6 42 C4 92 CB 18 C4 05 6C 69 6E 65 3A 1C C6 -5C C7 1C C6 18 C4 04 1B 5B 30 6D 00 1C C6 1C CB -00 00 83 5B 27 5D 0D 12 84 12 BA CB 0E C4 0E C4 -00 CA 00 CA 1C C7 40 C8 01 27 0D 12 84 12 B8 CA -E8 C7 46 C8 42 C4 CA CB 1C C7 A4 CA C8 C6 81 5C -92 42 C0 21 C4 21 30 4D A2 CB 81 5B 82 43 BE 21 -30 4D CE CB 01 5D B2 43 BE 21 30 4D BE CA 88 50 -4F 53 54 50 4F 4E 45 00 0D 12 84 12 B8 CA E8 C7 -46 C8 66 C6 42 C4 CA CB B2 C6 42 C4 1A CC 0E C4 -0E C4 00 CA 00 CA 0E C4 00 CA 00 CA 1C C7 36 C7 -09 49 4D 4D 45 44 49 41 54 45 1A 42 B6 21 FA D0 -80 00 00 00 30 4D DA CB 01 3A 30 12 82 CC 92 B3 -C6 21 A2 63 C6 21 0D 12 84 12 B8 CA E8 C7 50 CC -3D 41 08 4E 7A 4E 5A D3 5A 53 0A 58 19 42 DA 21 -6E 4E 3E F0 1E 00 09 5E 3E 4F 82 48 B6 21 82 49 -B8 21 82 4A BA 21 82 4F BC 21 2A 52 82 4A C6 21 -30 41 BA 40 0D 12 FC FF BA 40 84 12 FE FF B2 43 -BE 21 30 4D 82 9F BC 21 09 20 18 42 B6 21 19 42 -B8 21 A8 49 FE FF 89 48 00 00 30 4D 0D 12 84 12 -18 C4 0F 73 74 61 63 6B 20 6D 69 73 6D 61 74 63 -68 21 46 CB 38 CC 81 3B 82 93 BE 21 81 27 0D 12 -84 12 0E C4 1C C7 00 CA 94 CC DC CB 1C C7 4E CA -06 43 52 45 41 54 45 00 B0 12 3E CC BA 40 86 12 -FC FF 8A 4A FE FF D5 3F E0 CC 04 43 4F 44 45 00 -B0 12 3E CC A2 82 C6 21 0D 12 84 12 1E CF F8 CE -1C C7 00 00 07 45 4E 44 43 4F 44 45 0D 12 84 12 -94 CC 38 CF 1C C7 24 CB 03 41 53 4D B2 40 FC CE -DA 21 E6 3F 14 CD 06 45 4E 44 41 53 4D 00 0D 12 -84 12 1C CD 56 CF 1C C7 00 00 05 43 4F 4C 4F 4E -1A 42 C6 21 BA 40 0D 12 00 00 BA 40 84 12 02 00 -A2 52 C6 21 B2 43 BE 21 30 40 38 CF 00 00 05 4C -4F 32 48 49 A2 83 C6 21 1A 42 C6 21 EE 3F 20 CC -85 48 49 32 4C 4F 0D 12 84 12 2C C4 C6 CE 00 CA -DC CB 08 CD 1C C7 C6 CC 86 5B 54 48 45 4E 5D 00 -30 4D 0C 4E 38 4F 3B 4F 39 4F 0E 4B 0E 5C 10 24 -1B 83 06 30 1C 83 04 30 19 53 F9 98 FF FF F5 27 -2D 4D 3E 4F 30 4D 2F 53 9F 83 00 00 F9 23 2F 53 -2D 53 F7 3F 98 CD 86 5B 45 4C 53 45 5D 00 0D 12 -84 12 0E C4 00 00 A0 C6 B8 CA E8 C7 54 CA 5E C6 -42 C4 30 CE 6C C6 18 C4 06 5B 54 48 45 4E 5D 00 -A2 CD 0A CE C6 CD E8 CD 1C C7 6C C6 18 C4 06 5B -45 4C 53 45 5D 00 A2 CD 20 CE C6 CD E6 CD 1C C7 -18 C4 04 5B 49 46 5D 00 A2 CD E8 CD 3E C4 E6 CD -40 C6 18 C4 05 0D 0A 6B 6F 20 1C C6 CA C4 BA C4 -3E C4 E8 CD D6 CD 84 5B 49 46 5D 00 0E 93 3E 4F -C6 27 30 4D 2F 53 30 4D 46 CE 89 5B 44 45 46 49 -4E 45 44 5D 0D 12 84 12 B8 CA E8 C7 46 C8 54 CE -1C C7 5A CE 8B 5B 55 4E 44 45 46 49 4E 45 44 5D -0D 12 84 12 64 CE AC C6 1C C7 8C CE 3D 41 B2 4E -0E 18 A2 4E 0C 18 3E 4F 8F 3C 12 CA 06 4D 41 52 -4B 45 52 00 B0 12 3E CC BA 40 85 12 FC FF BA 40 -8A CE FE FF 9A 42 C8 21 00 00 28 83 8A 48 02 00 -A2 52 C6 21 EA 3E 2E 53 30 4D 0E C4 CA 21 A4 C6 -1C C7 85 12 CA CE 28 CD FC D0 EC C5 B8 CB 80 CD -B6 C5 9C CE CE C7 C8 CF E2 CF 64 CA 56 D0 00 00 -74 CE E4 CB A6 C8 00 00 85 12 CA CE 34 D6 9A D6 -DC D5 EA D6 A2 D5 00 00 6E D3 00 00 B2 D7 96 D7 -06 D6 44 D6 7E D4 00 00 00 00 06 D7 F6 CE 3A 40 +B0 CA 09 43 08 43 3F 82 8F 4E 06 00 0C 4E 7E 4C +FC 90 27 00 00 00 07 20 5C 4C 01 00 8F 4C 04 00 +7E 90 03 00 48 3C 6A 4C 7A 80 2D 00 04 28 BD 23 +B1 43 02 00 0A 3C 2B 43 7A 52 07 24 3B 52 6A 53 +04 24 3B 40 10 00 7A 53 36 20 1C 53 1E 83 EB 3F +B2 CA 31 24 2D 83 7A 90 28 00 C1 27 32 B0 00 02 +2A 20 32 D0 00 02 7A 90 F7 00 B9 27 7A 90 F5 00 +22 20 0A 4E 09 43 8F 49 02 00 5A 83 09 4A 09 5C +69 49 79 80 30 00 79 90 0A 00 05 28 79 80 07 00 +79 90 0A 00 0A 28 09 9B 08 2C 8F 49 00 00 0E 4B +2C 15 B0 12 66 C4 2A 17 E6 3F 9F 4F 04 00 02 00 +AF 4F 04 00 4A 93 2B 17 0E 4C 82 4B DC 21 06 24 +32 C0 00 02 3F 50 06 00 0E F3 30 4D 2F 53 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 00 00 01 2C 1A 42 C6 21 +8A 4E 00 00 A2 53 C6 21 3E 4F 30 4D E8 C7 05 41 +4C 4C 4F 54 82 5E C6 21 3E 4F 30 4D 5A CB 87 4C +49 54 45 52 41 4C 82 93 BE 21 0D 24 09 4E 1A 42 +C6 21 A2 52 C6 21 BA 40 0A C4 00 00 8A 49 02 00 +3E 4F 32 B0 00 02 32 C0 00 02 03 24 8A 4E 02 00 +EE 3F 30 4D 68 C8 05 43 4F 55 4E 54 2F 83 1E 53 +8F 4E 00 00 5E 4E FF FF 30 4D 7C C8 09 49 4E 54 +45 52 50 52 45 54 0D 12 84 12 AC C4 26 CC 2E C9 +E2 CB 94 26 3D 40 EA CB D6 3E EC CB 0A 4E 3E 4F +3D 40 06 CC 2E 27 3D 40 DC CB 1A E2 BE 21 AE 27 +0E 12 3E 4F 30 41 08 CC 3E 4F 3D 40 DC CB BB 23 +DE 53 00 00 68 4E 08 5E F8 40 3F 00 00 00 3D 40 +98 CD CC 3F 10 CC 86 12 20 00 3F 40 80 20 0E 43 +31 40 E0 20 B2 40 00 20 00 20 82 43 BE 21 84 12 +90 C7 BC C4 D6 CB C6 C7 F8 C7 14 C4 0C 73 74 61 +63 6B 20 65 6D 70 74 79 21 00 2A C5 0A C4 40 FF +28 C4 00 C8 14 C4 0A 46 52 41 4D 20 66 75 6C 6C +21 00 2A C5 3A C4 40 CC 6E CB 86 41 42 4F 52 54 +22 00 0D 12 84 12 E6 C8 0A C4 2A C5 5C CB 62 C8 +90 C9 01 27 0D 12 84 12 26 CC 2E C9 96 C9 34 C4 +24 CC 62 C8 00 00 83 5B 27 5D 0D 12 84 12 94 CC +0A C4 0A C4 5C CB 5C CB 62 C8 A6 CC 81 5B 82 43 +BE 21 30 4D 0E C8 01 5D B2 43 BE 21 30 4D C6 CC +81 5C 92 42 C0 21 C4 21 30 4D 00 00 88 50 4F 53 +54 50 4F 4E 45 00 0D 12 84 12 26 CC 2E C9 96 C9 +AA C7 34 C4 24 CC F8 C7 34 C4 08 CD 0A C4 0A C4 +5C CB 5C CB 0A C4 5C CB 5C CB 62 C8 BC CC 01 3A +30 12 58 CD 92 B3 C6 21 A2 63 C6 21 0D 12 84 12 +26 CC 2E C9 26 CD 3D 41 08 4E 7A 4E 5A D3 5A 53 +0A 58 19 42 DA 21 6E 4E 3E F0 1E 00 09 5E 3E 4F +82 48 B6 21 82 49 B8 21 82 4A BA 21 82 4F BC 21 +2A 52 82 4A C6 21 30 41 BA 40 0D 12 FC FF BA 40 +84 12 FE FF B2 43 BE 21 30 4D 82 9F BC 21 09 20 +18 42 B6 21 19 42 B8 21 A8 49 FE FF 89 48 00 00 +30 4D 0D 12 84 12 14 C4 0F 73 74 61 63 6B 20 6D +69 73 6D 61 74 63 68 21 36 C5 0E CD 81 3B 82 93 +BE 21 97 27 0D 12 84 12 0A C4 62 C8 5C CB 6A CD +BE CC 62 C8 CC CB 09 49 4D 4D 45 44 49 41 54 45 +18 42 B6 21 F8 D0 80 00 00 00 30 4D B6 CB 06 43 +52 45 41 54 45 00 B0 12 14 CD BA 40 86 12 FC FF +8A 4A FE FF C9 3F CE CD 04 43 4F 44 45 00 B0 12 +14 CD A2 82 C6 21 0D 12 84 12 0E D0 E8 CF 62 C8 +00 00 07 45 4E 44 43 4F 44 45 0D 12 84 12 6A CD +28 D0 62 C8 7A CC 03 41 53 4D B2 40 EC CF DA 21 +E6 3F 02 CE 06 45 4E 44 41 53 4D 00 0D 12 84 12 +0A CE 46 D0 62 C8 00 00 05 43 4F 4C 4F 4E 1A 42 +C6 21 BA 40 0D 12 00 00 BA 40 84 12 02 00 A2 52 +C6 21 B2 43 BE 21 30 40 28 D0 00 00 05 4C 4F 32 +48 49 A2 83 C6 21 1A 42 C6 21 EE 3F B6 CD 85 48 +49 32 4C 4F 0D 12 84 12 28 C4 B6 CF 5C CB BE CC +F6 CD 62 C8 9C CD 86 5B 54 48 45 4E 5D 00 30 4D +0C 4E 38 4F 3B 4F 39 4F 0E 4B 0E 5C 10 24 1B 83 +06 30 1C 83 04 30 19 53 F9 98 FF FF F5 27 2D 4D +3E 4F 30 4D 2F 53 9F 83 00 00 F9 23 2F 53 2D 53 +F7 3F 86 CE 86 5B 45 4C 53 45 5D 00 0D 12 84 12 +0A C4 00 00 DA C7 26 CC 2E C9 BC CB A2 C7 34 C4 +1E CF B0 C7 14 C4 06 5B 54 48 45 4E 5D 00 90 CE +F8 CE B4 CE D6 CE 62 C8 B0 C7 14 C4 06 5B 45 4C +53 45 5D 00 90 CE 0E CF B4 CE D4 CE 62 C8 14 C4 +04 5B 49 46 5D 00 90 CE D6 CE 3A C4 D4 CE 84 C7 +14 C4 05 0D 0A 6B 6F 20 5E C7 BC C4 AC C4 3A C4 +D6 CE C4 CE 84 5B 49 46 5D 00 0E 93 3E 4F C6 27 +30 4D 2F 53 30 4D 34 CF 89 5B 44 45 46 49 4E 45 +44 5D 0D 12 84 12 26 CC 2E C9 96 C9 42 CF 62 C8 +48 CF 8B 5B 55 4E 44 45 46 49 4E 45 44 5D 0D 12 +84 12 52 CF F2 C7 62 C8 7A CF B2 4E 0A 18 2E 53 +BE 12 3E 4F 3D 41 90 3C 7E CB 06 4D 41 52 4B 45 +52 00 B0 12 14 CD BA 40 85 12 FC FF BA 40 78 CF +FE FF 28 83 8A 48 00 00 BA 40 AA C4 04 00 B2 50 +06 00 C6 21 DD 3E 2E 53 30 4D 0A C4 CA 21 EA C7 +62 C8 85 12 BA CF 16 CE E8 CD 2E C7 92 CC 6E CE +F8 C6 8A CF 14 C9 B2 D0 C6 D0 9E C8 28 C9 00 00 +62 CF D0 CC F6 C9 00 00 85 12 BA CF 6A D6 D0 D6 +12 D6 20 D7 D8 D5 00 00 A4 D3 00 00 E8 D7 CC D7 +3C D6 7A D6 B4 D4 00 00 00 00 3C D7 E6 CF 3A 40 0C 00 39 40 D6 21 08 49 28 53 19 83 18 83 E8 49 00 00 1A 83 FA 23 30 4D 3A 40 0E 00 38 40 CA 21 09 48 29 53 F8 49 00 00 18 53 1A 83 FB 23 30 4D -82 43 CC 21 30 4D 92 42 CA 21 DA 21 30 4D D2 CE -50 CF 56 CF 66 CF 3A 4E 82 4A C8 21 2E 4E 82 4E -C6 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 EE CB 09 50 57 52 5F 53 -54 41 54 45 85 12 5E CF 1C CF BE D7 9C C7 09 52 -53 54 5F 53 54 41 54 45 92 42 0E 18 A8 CF 92 42 -0C 18 AA CF EF 3F 9A CF 08 50 57 52 5F 48 45 52 -45 00 92 42 C8 21 A8 CF 92 42 C6 21 AA CF 30 4D -AE CF 08 52 53 54 5F 48 45 52 45 00 92 42 C8 21 -0E 18 92 42 C6 21 0C 18 EC 3F E2 C7 04 57 49 50 -45 00 B2 40 1C CF 0E 18 B2 40 BE D7 0C 18 30 12 -B8 CF B2 40 04 C4 02 C4 B2 40 60 D0 5E D0 B2 40 -E4 C5 E2 C5 B2 40 50 C6 4E C6 B2 40 BE C5 BC C5 -B2 40 18 00 0A 18 34 40 1C C7 37 40 92 C6 36 40 -F0 C4 35 40 E2 C4 B2 40 20 00 B4 21 B2 40 0A 00 -DC 21 30 41 FC CF 04 57 41 52 4D 00 30 40 60 D0 -3D 40 B2 D0 92 C3 30 01 1E 42 08 18 00 40 F2 B0 -10 00 00 02 02 20 3E E3 1E 53 0E 93 19 24 13 34 -39 40 10 00 29 83 B9 43 80 FF FC 23 B9 40 06 D1 -FE FF 29 83 B9 40 02 D1 FE FF 39 90 AC FF F9 23 -B2 40 20 C5 E4 FF 0E 93 AC 33 2E 93 7B 27 84 2F -30 4D 18 C4 07 0D 0A 1B 5B 37 6D 23 1C C6 92 C7 -18 C4 19 46 61 73 74 46 6F 72 74 68 20 C2 A9 4A -2E 4D 2E 54 68 6F 6F 72 65 6E 73 20 1C C6 0E C4 -40 FF 2C C4 9C C6 5C C7 18 C4 0A 62 79 74 65 73 -20 66 72 65 65 00 3E C4 92 CB FA CC 04 43 4F 4C -44 00 30 40 A2 C5 B2 D0 03 00 04 01 B2 D0 10 00 -00 01 B2 40 80 5A CC 01 B2 43 02 02 B2 D3 06 02 -D2 43 24 02 F2 D3 26 02 F2 40 FD 00 22 02 E2 D2 -24 02 B2 40 00 A5 60 01 B2 40 F3 00 80 01 B2 40 -07 00 82 01 B2 40 FC 00 84 01 39 40 80 00 B2 D0 -10 00 86 01 92 D2 5E 01 08 18 38 40 59 14 18 83 -FE 23 19 83 FA 23 B2 40 81 00 00 05 92 42 02 18 -06 05 92 42 04 18 08 05 F2 D0 30 00 0A 02 92 C3 -00 05 92 D3 1A 05 39 40 00 10 29 83 89 43 00 20 -FC 23 31 40 E0 20 3F 40 80 20 30 12 5C D0 3F 3F -38 40 C0 21 0A 4E 39 48 2E 48 09 5E 1E 52 C4 21 -09 9E 03 24 7A 9E FC 27 1E 83 0A 4E 2A 88 82 4A -C4 21 30 4D 1C 15 84 12 E8 C7 46 C8 38 C4 D8 D1 -02 C9 42 C4 CA CB F2 D1 DA D1 3C 4E 3C 80 87 12 -08 24 1C 53 02 20 2E 4E 04 3C 2E 53 1C 53 01 24 -2E 82 1B 17 30 41 3E 40 28 00 B0 12 C4 D1 19 42 -C6 21 A2 53 C6 21 89 4E 00 00 3E 40 29 00 1C 15 -92 92 C0 21 C4 21 02 20 30 40 AC CC 12 12 C4 21 -92 53 C4 21 84 12 E8 C7 02 C9 42 C4 3A D2 30 D2 -21 53 3E 90 10 00 80 2D DC 2B 3C D2 B2 41 C4 21 -D8 3F 0D 12 84 12 B8 CA A0 D1 4C D2 0C 43 1B 42 -C6 21 A2 53 C6 21 6A 4E 3E 4F 7A 90 23 00 27 20 -92 53 C4 21 B0 12 C4 D1 3C 40 00 03 0E 93 1C 24 -3C 40 10 03 1E 93 18 24 3C 40 20 03 2E 93 14 24 -3C 40 20 02 2E 92 10 24 3C 40 30 02 3E 92 0C 24 -3C 40 30 03 3E 93 08 24 3C 40 30 00 19 42 C6 21 -A2 53 C6 21 89 4E 00 00 3E 4F 3D 41 30 4D 7A 90 -26 00 07 20 3C 40 10 02 92 53 C4 21 B0 12 C4 D1 -ED 3F 7A 90 40 00 16 20 3C 40 20 00 92 53 C4 21 -B0 12 0E D2 0C 20 3C 50 10 00 3E 40 2B 00 B0 12 -0E D2 92 92 C0 21 C4 21 02 24 92 53 C4 21 8E 10 -0C 5E DA 3F B0 12 0E D2 FA 23 3C 50 10 00 B0 12 -F6 D1 EF 3F 0C 43 1B 42 C6 21 A2 53 C6 21 0D 12 -84 12 B8 CA A0 D1 18 D3 FE 90 26 00 00 00 3E 40 -20 00 03 20 3C 50 82 00 C7 3F B0 12 0E D2 E0 23 -3C 50 80 00 B0 12 F6 D1 DB 3F 00 00 04 52 45 54 -49 00 0D 12 84 12 0E C4 00 13 00 CA 1C C7 0E C4 -2C 00 42 D2 0E D3 58 D3 09 4B 2E 4E 0E DC A2 3F -6E CD 03 4D 4F 56 85 12 4E D3 00 40 62 D3 05 4D -4F 56 2E 42 85 12 4E D3 40 40 00 00 03 41 44 44 -85 12 4E D3 00 50 7C D3 05 41 44 44 2E 42 85 12 -4E D3 40 50 88 D3 04 41 44 44 43 00 85 12 4E D3 -00 60 96 D3 06 41 44 44 43 2E 42 00 85 12 4E D3 -40 60 3C D3 04 53 55 42 43 00 85 12 4E D3 00 70 -B4 D3 06 53 55 42 43 2E 42 00 85 12 4E D3 40 70 -C2 D3 03 53 55 42 85 12 4E D3 00 80 D2 D3 05 53 -55 42 2E 42 85 12 4E D3 40 80 4A CD 03 43 4D 50 -85 12 4E D3 00 90 EC D3 05 43 4D 50 2E 42 85 12 -4E D3 40 90 36 CD 04 44 41 44 44 00 85 12 4E D3 -00 A0 06 D4 06 44 41 44 44 2E 42 00 85 12 4E D3 -40 A0 F8 D3 03 42 49 54 85 12 4E D3 00 B0 24 D4 -05 42 49 54 2E 42 85 12 4E D3 40 B0 30 D4 03 42 -49 43 85 12 4E D3 00 C0 3E D4 05 42 49 43 2E 42 -85 12 4E D3 40 C0 4A D4 03 42 49 53 85 12 4E D3 -00 D0 58 D4 05 42 49 53 2E 42 85 12 4E D3 40 D0 -00 00 03 58 4F 52 85 12 4E D3 00 E0 72 D4 05 58 -4F 52 2E 42 85 12 4E D3 40 E0 A4 D3 03 41 4E 44 -85 12 4E D3 00 F0 8C D4 05 41 4E 44 2E 42 85 12 -4E D3 40 F0 B8 CA 42 D2 AA D4 0A 4C 3C F0 70 00 -8A 10 3A F0 0F 00 0C DA 4F 3F DE D3 03 52 52 43 -85 12 A4 D4 00 10 BC D4 05 52 52 43 2E 42 85 12 -A4 D4 40 10 C8 D4 04 53 57 50 42 00 85 12 A4 D4 -80 10 D6 D4 03 52 52 41 85 12 A4 D4 00 11 E4 D4 -05 52 52 41 2E 42 85 12 A4 D4 40 11 F0 D4 03 53 -58 54 85 12 A4 D4 80 11 00 00 04 50 55 53 48 00 -85 12 A4 D4 00 12 0A D5 06 50 55 53 48 2E 42 00 -85 12 A4 D4 40 12 64 D4 04 43 41 4C 4C 00 85 12 -A4 D4 80 12 1A 53 0E 4A 0D 12 84 12 92 C7 18 C4 -0D 6F 75 74 20 6F 66 20 62 6F 75 6E 64 73 46 CB -FE D4 03 53 3E 3D 86 12 00 38 52 D5 02 53 3C 00 -86 12 00 34 18 D5 03 30 3E 3D 86 12 00 30 66 D5 -02 30 3C 00 86 12 00 30 00 00 02 55 3C 00 86 12 -00 2C 7A D5 03 55 3E 3D 86 12 00 28 70 D5 03 30 -3C 3E 86 12 00 24 8E D5 02 30 3D 00 86 12 00 20 -00 00 02 49 46 00 1A 42 C6 21 8A 4E 00 00 A2 53 -C6 21 0E 4A 30 4D 84 D5 04 54 48 45 4E 00 1A 42 -C6 21 08 4E 3E 4F 09 48 29 53 0A 89 0A 11 3A 90 -00 02 B1 2F 88 DA 00 00 30 4D 14 D4 04 45 4C 53 -45 00 1A 42 C6 21 BA 40 00 3C 00 00 A2 53 C6 21 -2F 83 8F 4A 00 00 E3 3F 28 D5 05 42 45 47 49 4E -30 40 2C C4 B8 D5 05 55 4E 54 49 4C 3A 4F 08 4E -3E 4F 19 42 C6 21 2A 83 0A 89 0A 11 3A 90 00 FE -8A 3B 3A F0 FF 03 08 DA 89 48 00 00 A2 53 C6 21 -30 4D 98 D4 05 41 47 41 49 4E 0A 4E 38 40 00 3C -E7 3F 00 00 05 57 48 49 4C 45 0D 12 84 12 A6 D5 -78 C6 1C C7 5C D5 06 52 45 50 45 41 54 00 0D 12 -84 12 3A D6 BE D5 1C C7 6A D6 3D 41 08 4E 3E 4F -2A 48 B2 92 C4 21 CB 2F 98 42 C6 21 00 00 30 4D -FA D5 03 42 57 31 85 12 68 D6 00 00 82 D6 03 42 -57 32 85 12 68 D6 00 00 8E D6 03 42 57 33 85 12 -68 D6 00 00 A6 D6 3D 41 1A 42 C6 21 28 4E B2 92 -C4 21 88 2B BA 4F 00 00 A2 53 C6 21 8E 4A 00 00 -3E 4F 30 4D 00 00 03 46 57 31 85 12 A4 D6 00 00 -C6 D6 03 46 57 32 85 12 A4 D6 00 00 D2 D6 03 46 -57 33 85 12 A4 D6 00 00 DE D6 04 47 4F 54 4F 00 -2F 83 8F 4E 00 00 3E 40 00 3C 0D 12 84 12 BA CB -94 CA 1C C7 00 00 05 3F 47 4F 54 4F 3E 90 00 30 -F4 27 3E E0 00 04 3E B0 00 10 EF 27 3E E0 00 08 -EC 3F B8 CA A0 D1 28 D7 92 53 C4 21 3E 40 2C 00 -84 12 E8 C7 02 C9 42 C4 CA CB 04 D3 3E D7 0A 4E -3E 4F 1A 83 F7 32 29 4E 59 0E 0A 28 08 4C 59 0A -01 28 0C 8A 08 8A 38 90 10 00 EC 2E 5A 0E AB 3E -2A 92 E8 2E 8A 10 5A 06 A6 3E 56 D6 04 52 52 43 -4D 00 85 12 22 D7 50 00 6C D7 04 52 52 41 4D 00 -85 12 22 D7 50 01 7A D7 04 52 4C 41 4D 00 85 12 -22 D7 50 02 88 D7 04 52 52 55 4D 00 85 12 22 D7 -50 03 98 D5 05 50 55 53 48 4D 85 12 22 D7 00 15 -A4 D7 04 50 4F 50 4D 00 85 12 22 D7 00 17 +82 43 CC 21 30 4D 92 42 CA 21 DA 21 30 4D C2 CF +40 D0 46 D0 56 D0 1A 42 20 18 82 4A C8 21 2E 4E +82 4E C6 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 DC CC 09 50 57 52 +5F 53 54 41 54 45 85 12 4E D0 F4 D7 E2 C8 09 52 +53 54 5F 53 54 41 54 45 92 42 0A 18 9A D0 F3 3F +8C D0 08 50 57 52 5F 48 45 52 45 00 92 42 C6 21 +9A D0 30 4D 9E D0 08 52 53 54 5F 48 45 52 45 00 +92 42 C6 21 0A 18 F2 3F 3E 90 0E 00 DC 27 2E 92 +E3 37 0E 93 D8 37 39 40 10 00 29 83 B9 43 80 FF +FC 23 B9 40 24 D1 FE FF 29 83 B9 40 02 C6 FE FF +39 90 AE FF F9 23 39 40 14 18 B2 49 04 C6 B2 49 +FA C4 B2 49 02 C4 B2 49 22 C6 B2 49 E4 FF B2 49 +0A 18 C2 3F B2 D0 03 00 04 01 B2 D0 10 00 00 01 +B2 40 80 5A CC 01 31 40 E0 20 3F 40 80 20 39 40 +00 10 29 83 89 43 00 20 FC 23 B2 43 02 02 B2 D3 +06 02 D2 43 24 02 F2 D3 26 02 F2 40 FD 00 22 02 +E2 D2 24 02 B2 40 00 A5 60 01 B2 40 F3 00 80 01 +B2 40 07 00 82 01 B2 40 FC 00 84 01 39 40 80 00 +B2 D0 10 00 86 01 38 40 17 11 18 83 FE 23 19 83 +FA 23 1E 42 08 18 82 43 08 18 1E D2 5E 01 B0 12 +F8 C4 20 C6 38 40 C0 21 0A 4E 39 48 2E 48 09 5E +1E 52 C4 21 09 9E 03 24 7A 9E FC 27 1E 83 0A 4E +2A 88 82 4A C4 21 30 4D 1C 15 0E 12 12 12 C4 21 +84 12 2E C9 96 C9 F2 C7 34 C4 E4 D1 52 CA 34 C4 +FE D1 F8 D1 E6 D1 3C 4E 3C 80 87 12 05 24 1C 53 +02 20 2E 4E 01 3C 2E 83 21 52 1B 17 30 41 00 D2 +B2 41 C4 21 3E 41 84 12 0A C4 2B 00 2E C9 96 C9 +F2 C7 34 C4 1C D2 52 CA 34 C4 24 CC BC C7 2E C9 +52 CA 34 C4 24 CC 28 D2 3E 5F E7 3F 3E 40 28 00 +B0 12 C8 D1 19 42 C6 21 A2 53 C6 21 89 4E 00 00 +3E 40 29 00 92 92 C0 21 C4 21 02 20 30 40 82 CD +1C 15 12 12 C4 21 92 53 C4 21 84 12 2E C9 52 CA +34 C4 70 D2 66 D2 21 53 3E 90 10 00 C6 2B 7F 2D +72 D2 B2 41 C4 21 C1 3F 0D 12 84 12 26 CC A4 D1 +82 D2 0C 43 1B 42 C6 21 A2 53 C6 21 6A 4E 3E 4F +7A 90 23 00 27 20 92 53 C4 21 B0 12 C8 D1 3C 40 +00 03 0E 93 1C 24 3C 40 10 03 1E 93 18 24 3C 40 +20 03 2E 93 14 24 3C 40 20 02 2E 92 10 24 3C 40 +30 02 3E 92 0C 24 3C 40 30 03 3E 93 08 24 3C 40 +30 00 19 42 C6 21 A2 53 C6 21 89 4E 00 00 3E 4F +3D 41 30 4D 7A 90 26 00 07 20 3C 40 10 02 92 53 +C4 21 B0 12 C8 D1 ED 3F 7A 90 40 00 16 20 3C 40 +20 00 92 53 C4 21 B0 12 50 D2 0C 20 3C 50 10 00 +3E 40 2B 00 B0 12 50 D2 92 92 C0 21 C4 21 02 24 +92 53 C4 21 8E 10 0C 5E DA 3F B0 12 50 D2 FA 23 +3C 50 10 00 B0 12 2C D2 EF 3F 0C 43 1B 42 C6 21 +A2 53 C6 21 0D 12 84 12 26 CC A4 D1 4E D3 FE 90 +26 00 00 00 3E 40 20 00 03 20 3C 50 82 00 C7 3F +B0 12 50 D2 E0 23 3C 50 80 00 B0 12 2C D2 DB 3F +00 00 04 52 45 54 49 00 0D 12 84 12 0A C4 00 13 +5C CB 62 C8 0A C4 2C 00 78 D2 44 D3 8E D3 09 4B +2E 4E 0E DC A2 3F 5C CE 03 4D 4F 56 85 12 84 D3 +00 40 98 D3 05 4D 4F 56 2E 42 85 12 84 D3 40 40 +00 00 03 41 44 44 85 12 84 D3 00 50 B2 D3 05 41 +44 44 2E 42 85 12 84 D3 40 50 BE D3 04 41 44 44 +43 00 85 12 84 D3 00 60 CC D3 06 41 44 44 43 2E +42 00 85 12 84 D3 40 60 72 D3 04 53 55 42 43 00 +85 12 84 D3 00 70 EA D3 06 53 55 42 43 2E 42 00 +85 12 84 D3 40 70 F8 D3 03 53 55 42 85 12 84 D3 +00 80 08 D4 05 53 55 42 2E 42 85 12 84 D3 40 80 +38 CE 03 43 4D 50 85 12 84 D3 00 90 22 D4 05 43 +4D 50 2E 42 85 12 84 D3 40 90 24 CE 04 44 41 44 +44 00 85 12 84 D3 00 A0 3C D4 06 44 41 44 44 2E +42 00 85 12 84 D3 40 A0 2E D4 03 42 49 54 85 12 +84 D3 00 B0 5A D4 05 42 49 54 2E 42 85 12 84 D3 +40 B0 66 D4 03 42 49 43 85 12 84 D3 00 C0 74 D4 +05 42 49 43 2E 42 85 12 84 D3 40 C0 80 D4 03 42 +49 53 85 12 84 D3 00 D0 8E D4 05 42 49 53 2E 42 +85 12 84 D3 40 D0 00 00 03 58 4F 52 85 12 84 D3 +00 E0 A8 D4 05 58 4F 52 2E 42 85 12 84 D3 40 E0 +DA D3 03 41 4E 44 85 12 84 D3 00 F0 C2 D4 05 41 +4E 44 2E 42 85 12 84 D3 40 F0 26 CC 78 D2 E0 D4 +0A 4C 3C F0 70 00 8A 10 3A F0 0F 00 0C DA 4F 3F +14 D4 03 52 52 43 85 12 DA D4 00 10 F2 D4 05 52 +52 43 2E 42 85 12 DA D4 40 10 FE D4 04 53 57 50 +42 00 85 12 DA D4 80 10 0C D5 03 52 52 41 85 12 +DA D4 00 11 1A D5 05 52 52 41 2E 42 85 12 DA D4 +40 11 26 D5 03 53 58 54 85 12 DA D4 80 11 00 00 +04 50 55 53 48 00 85 12 DA D4 00 12 40 D5 06 50 +55 53 48 2E 42 00 85 12 DA D4 40 12 9A D4 04 43 +41 4C 4C 00 85 12 DA D4 80 12 1A 53 0E 4A 0D 12 +84 12 D8 C8 14 C4 0D 6F 75 74 20 6F 66 20 62 6F +75 6E 64 73 36 C5 34 D5 03 53 3E 3D 86 12 00 38 +88 D5 02 53 3C 00 86 12 00 34 4E D5 03 30 3E 3D +86 12 00 30 9C D5 02 30 3C 00 86 12 00 30 00 00 +02 55 3C 00 86 12 00 2C B0 D5 03 55 3E 3D 86 12 +00 28 A6 D5 03 30 3C 3E 86 12 00 24 C4 D5 02 30 +3D 00 86 12 00 20 00 00 02 49 46 00 1A 42 C6 21 +8A 4E 00 00 A2 53 C6 21 0E 4A 30 4D BA D5 04 54 +48 45 4E 00 1A 42 C6 21 08 4E 3E 4F 09 48 29 53 +0A 89 0A 11 3A 90 00 02 B1 2F 88 DA 00 00 30 4D +4A D4 04 45 4C 53 45 00 1A 42 C6 21 BA 40 00 3C +00 00 A2 53 C6 21 2F 83 8F 4A 00 00 E3 3F 5E D5 +05 42 45 47 49 4E 30 40 28 C4 EE D5 05 55 4E 54 +49 4C 3A 4F 08 4E 3E 4F 19 42 C6 21 2A 83 0A 89 +0A 11 3A 90 00 FE 8A 3B 3A F0 FF 03 08 DA 89 48 +00 00 A2 53 C6 21 30 4D CE D4 05 41 47 41 49 4E +0A 4E 38 40 00 3C E7 3F 00 00 05 57 48 49 4C 45 +0D 12 84 12 DC D5 BC C7 62 C8 92 D5 06 52 45 50 +45 41 54 00 0D 12 84 12 70 D6 F4 D5 62 C8 A0 D6 +3D 41 08 4E 3E 4F 2A 48 B2 92 C4 21 CB 2F 98 42 +C6 21 00 00 30 4D 30 D6 03 42 57 31 85 12 9E D6 +00 00 B8 D6 03 42 57 32 85 12 9E D6 00 00 C4 D6 +03 42 57 33 85 12 9E D6 00 00 DC D6 3D 41 1A 42 +C6 21 28 4E B2 92 C4 21 88 2B BA 4F 00 00 A2 53 +C6 21 8E 4A 00 00 3E 4F 30 4D 00 00 03 46 57 31 +85 12 DA D6 00 00 FC D6 03 46 57 32 85 12 DA D6 +00 00 08 D7 03 46 57 33 85 12 DA D6 00 00 14 D7 +04 47 4F 54 4F 00 2F 83 8F 4E 00 00 3E 40 00 3C +0D 12 84 12 94 CC 00 CC 62 C8 00 00 05 3F 47 4F +54 4F 3E 90 00 30 F4 27 3E E0 00 04 3E B0 00 10 +EF 27 3E E0 00 08 EC 3F 26 CC A4 D1 5E D7 92 53 +C4 21 3E 40 2C 00 84 12 2E C9 52 CA 34 C4 24 CC +3A D3 74 D7 0A 4E 3E 4F 1A 83 F7 32 29 4E 59 0E +0A 28 08 4C 59 0A 01 28 0C 8A 08 8A 38 90 10 00 +EC 2E 5A 0E AB 3E 2A 92 E8 2E 8A 10 5A 06 A6 3E +8C D6 04 52 52 43 4D 00 85 12 58 D7 50 00 A2 D7 +04 52 52 41 4D 00 85 12 58 D7 50 01 B0 D7 04 52 +4C 41 4D 00 85 12 58 D7 50 02 BE D7 04 52 52 55 +4D 00 85 12 58 D7 50 03 CE D5 05 50 55 53 48 4D +85 12 58 D7 00 15 DA D7 04 50 4F 50 4D 00 85 12 +58 D7 00 17 @FF80 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF -10 00 10 00 20 00 30 00 40 00 00 00 02 D1 02 D1 -02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 -02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 -02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 -02 D1 02 D1 20 C5 02 D1 02 D1 02 D1 02 D1 02 D1 -02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 02 D1 06 D1 +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +77 00 10 00 12 00 14 00 16 00 00 00 02 C6 02 C6 +02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 +02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 +02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 +02 C6 02 C6 96 C6 02 C6 02 C6 02 C6 02 C6 02 C6 +02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 02 C6 24 D1 q diff --git a/binaries/FET_prog.bat - Raccourci.lnk b/binaries/FET_prog.bat - Raccourci.lnk new file mode 100644 index 0000000000000000000000000000000000000000..bff048f46e2eb8eff5cb57604dfabf6d9dca5df9 GIT binary patch literal 947 zcmah|Ur19?82{a6;38|%GFOooNiu44_Ta;y$c=3(r57C7!womrw(h`fsH{gRFbaE! zpoa)c`il|tR6P}=_izbDrVj~GWQ6$=K|S>Q?%i?~qjULv=R4o|o$t^2&OHV|aoQ+> zf+-QYj#{YHA9X|z{`fYpl;^KEn}2>-npc(;i&&bh1?49=(WJfWE2=9#!*T0PEe?3S zQ!cdmefn?Gx)MRVxfs_Lt~n6TW|Bq8_A|TL$NWSr{p=UU7iq#=Q@}8+bp7DINm=&2th3BLxqJ5Ch#{H!)C}t&6jciakK=BQ_9DVlM&MpzB(|-4pEWJ>IRSj4}9qrGoW8 za%^B24|G(PrB_YG4nKT}>!S!}q@zx7`^{Ht(nXl*DQx zAP2yxfcC+Q;q>iZG3}8F=w-PuiqA_be zSuvVj6{Y-MyQ$X@W^U505Z_H4rzsQcvdY90l#=lqt^eoO`l;_0h7Qzf! s{wrjCl8}P#rQ@xKug=v!evLxkLSwO$_B}$7f_4!9Hm-V`n+a literal 0 HcmV?d00001 diff --git a/binaries/FET_prog.bat.lnk b/binaries/FET_prog.bat.lnk deleted file mode 100644 index 00630b678d78bc37473c74033a4d797f085cd0c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 927 zcma)4T}V@57=E@4G|VO~%ZN6lkr7+7%Yj23+f-^EaG=Bq-PX3wU_YrTT|^KB#kvZ* zv_@F5=&~PgiqT~dt;p!d3x$4Y5@vMKMHfBq*;&gAsdIRq@BRDU_x;}QI|9IDHIspo z&Ishu2s`EZ??28ouPm5a5}O^T=3kkq}{Y^nwtOI0C%ffY7oX{cW;l7JUYXu#^@3!(mL@wgasWs3v`_2@bk zPumbf78xXq}{Y^nwtOI0C%ffY7oX{cW;l7JUYXu#^@3!(mL@wgasWs3v`_2@bk zPumbf78xX3@()DB^DOTq5cdfYQtYT^6qbb-Er%k9ou}q z5f`=x{n}zu(Kw0*)7ckVdBA~~kxuAIAb@g|VSaL`{lZn*@iOO#LlW1S*+q5Z$}YrU zAdLic@F>>f6dEDF7YJ#p8=0(;^mavif#4EWVHQ@sQn+eGEfH6r4H;y~n}io#h=Rva zO+<(dgf%Q06!BGJ3$cQ55}OIh(zLKzf2g@B)ZV5g^@2RE!a8-u7AJpVSJTj2q~+VbS-;wr;G9j7R0#U diff --git a/config/CopySourceFileToTarget_SD_Card.bat b/config/CopySourceFileToTarget_SD_Card.bat index b34180d..f97083b 100644 --- a/config/CopySourceFileToTarget_SD_Card.bat +++ b/config/CopySourceFileToTarget_SD_Card.bat @@ -5,16 +5,16 @@ IF /I "%~x1" == ".f" goto sendF :send4th -start SendSource.bat %1 NOECHO +start %~d1\config\SendSource.bat %1 NOECHO ::PAUSE > NUL exit :sendF -call Select.bat SelectTemplate +call %~d1\config\Select.bat SelectTemplate -@start CopyTo_SD_Card.bat %1 %~d1\inc\%template% %2 +@start %~d1\config\CopyTo_SD_Card.bat %1 %~d1\inc\%template% %2 ::PAUSE > NUL exit diff --git a/config/CopyTo_SD_Card.bat b/config/CopyTo_SD_Card.bat index 8258b80..a8582d7 100644 --- a/config/CopyTo_SD_Card.bat +++ b/config/CopyTo_SD_Card.bat @@ -18,6 +18,11 @@ IF /I "%~x1" == ".4TH" GOTO 4TH :: %~d1 is the drive of arg %1 :: %~n2 is your selected template by SelectTarget.bat or your scite $(1) +::echo %1 +::echo %2 +::echo %3 +::pause + IF "%~x1" == "" ( echo no file to be preprocessed! goto badend @@ -46,22 +51,21 @@ exit :preprocessF -::@%~d1\prog\gema.exe -nobackup -line -t '\n=\r\n;\r\n=\r\n' -f %~d1\inc\%~n2.pat %~dpn1.f %~dpn1.4TH @%~d1\prog\gema.exe -nobackup -line -t '-\r\n=\r\n' -f %~d1\inc\%~n2.pat %~dpn1.f %~dpn1.4TH -call %~d1\config\Select.bat SelectDeviceId %~d1\inc\%~n2.pat +@call %~d1\config\Select.bat SelectDeviceId %~d1\inc\%~n2.pat :DownloadF @taskkill /F /IM ttermpro.exe 1> NUL 2>&1 :win32F -@"C:\Program Files\teraterm\ttpmacro.exe" /V %~d0\config\SendToSDf.ttl %~dpn1.4TH /C %deviceid% 1> NUL 2>&1 +@"C:\Program Files\teraterm\ttpmacro.exe" /V %~d1\config\SendToSD.ttl %~dpn1.4TH /C %deviceid% 1> NUL 2>&1 @IF NOT ERRORLEVEL 1 GOTO EndF :win64F -@"C:\Program Files (x86)\teraterm\ttpmacro.exe" /V %~d0\config\SendToSDf.ttl %~dpn1.4TH /C %deviceid% +@"C:\Program Files (x86)\teraterm\ttpmacro.exe" /V %~d1\config\SendToSD.ttl %~dpn1.4TH /C %deviceid% :EndF -@MOVE "%~dpn1.4TH" "%~dp1\LAST.4TH" > NUL +MOVE "%~dpn1.4TH" "%~dp1\LAST.4TH" > NUL exit @@ -98,13 +102,13 @@ goto badend @taskkill /F /IM ttermpro.exe 1> NUL 2>&1 :win324th -@"C:\Program Files\teraterm\ttpmacro.exe" /V %~d0\config\SendtoSD4th.ttl %~dpn1.4TH /C 0 1> NUL 2>&1 +@"C:\Program Files\teraterm\ttpmacro.exe" /V %~d0\config\SendtoSD.ttl %~dpn1.4TH /C 0 1> NUL 2>&1 @IF NOT ERRORLEVEL 1 GOTO End4th :win644th -@"C:\Program Files (x86)\teraterm\ttpmacro.exe" /V %~d0\config\SendtoSD4th.ttl %~dpn1.4TH /C 0 +@"C:\Program Files (x86)\teraterm\ttpmacro.exe" /V %~d0\config\SendtoSD.ttl %~dpn1.4TH /C 0 :End4th -::@COPY "%~dpn1.4TH" "%~dp1\LAST.4TH" > NUL +@COPY "%~dpn1.4TH" "%~dp1\LAST.4TH" > NUL exit diff --git a/config/PreprocessSourceFile.bat b/config/PreprocessSourceFile.bat index 718ebf3..ac0b22c 100644 --- a/config/PreprocessSourceFile.bat +++ b/config/PreprocessSourceFile.bat @@ -1,8 +1,8 @@ ::PreProcessSourceFile.bat ::used as link in any folder to drag and drop file.f on it. ::@call SelectTarget.bat -@call Select.bat SelectTemplate -@start Preprocess.bat %1 %~d1\inc\%template% %2 +@call %~d1\config\Select.bat SelectTemplate +@start %~d1\config\Preprocess.bat %1 %~d1\inc\%template% %2 exit :: %1 is file.f to be preprocessed :: %2 is used by Preprocess.bat as an unexpected third parameter \ No newline at end of file diff --git a/config/Select.bat b/config/Select.bat index 387481a..7e2e7f2 100644 --- a/config/Select.bat +++ b/config/Select.bat @@ -37,7 +37,7 @@ ::%1 = "SelectDevice" ::%2 = file.pat name -set device=%~n2 +@set device=%~n2 @if /I %device:~0,16% == MSP_EXP430FR5739 set device=MSP430FR5739 @if /I %device:~0,16% == MSP_EXP430FR5969 set device=MSP430FR5969 @if /I %device:~0,16% == MSP_EXP430FR5994 set device=MSP430FR5994 @@ -54,7 +54,7 @@ set device=%~n2 :: fonction called by SendSource.bat ::echo %~n2 -set deviceid=%~n2 +@set deviceid=%~n2 @if /I %deviceid:~0,16% == MSP_EXP430FR5739 set deviceid=$8103 @if /I %deviceid:~0,16% == MSP_EXP430FR5969 set deviceid=$8169 @if /I %deviceid:~0,16% == MSP_EXP430FR5994 set deviceid=$82A1 diff --git a/config/SendFile.ttl b/config/SendFile.ttl index 60461f5..eb4e62e 100644 --- a/config/SendFile.ttl +++ b/config/SendFile.ttl @@ -1,27 +1,39 @@ ; macro called by SendSource.bat ; param1 = this macro ; param2 = file.4TH to send -; param3 = "/C" i.e. connect to current COMx -; param4 = "ECHO" | "NOECHO" | "HALF" | "" -; param5 = deviceID, see select.bat +; param3 = /C = default COMx saved in TERATERM.INI. +; param4 = "ECHO" | "NOECHO" | "HALF" +; param5 = %deviceID% from select.bat connect param3 inputbox 'Send this file to the MSP430FR target:' ' ' param2 +setecho 0 ; no echo from Teraterm +showtt 0 ; close teraterm windows + + +;logfile = '\teraterm.log' +;dirname logdir param2 ; logir = dir of file.4TH to be sent +;strconcat logdir logfile +;logopen logdir 1 + + +; DEVICE ID TEST +; ============== + sendln 'CODE ?ID'; CODE ?ID sendln 'CMP #0,R14 0<> IF SUB &$1A04,R14 THEN'; CMP #0,TOS 0<> IF SUB &DEVICEID,TOS THEN -sendln 'COLON $1B EMIT $63 EMIT'; COLON $1B EMIT $63 EMIT \ send 'ESC c' -sendln 'ABORT" DeviceID mismatch!" '; ABORT" DeviceID mismatch!" -sendln '[DEFINED] STOP [IF] STOP [THEN]'; compile STOP if defined -sendln 'NOECHO ;'; NOECHO ; +sendln 'COLON '; COLON +sendln '$1B EMIT $63 EMIT'; $1B EMIT $63 EMIT \ send 'ESC c' (clear screen) +sendln 'CR ABORT" Device'39's ID mismatch!" ' ; CR ABORT" Device's ID mismatch!" +sendln 'PWR_STATE ;' ; PWR_STATE ; -send param5 ' ?ID ' ; %deviceID% ?ID +sendln param5 ' ?ID NOECHO' ; send: %deviceID% ?ID NOECHO strcompare param4 'NOECHO' if result = 0 then - setecho 0 ; no echo from Teraterm - showtt 0 + send 'NOECHO ' ; clear LINE again but doesn't send new line uptime timestart ; starts chrono... sendfile inputstr 0 goto end @@ -29,8 +41,7 @@ endif strcompare param4 'HALF' if result = 0 then - setecho 0 - showtt 0 + send 'NOECHO ' ; clear LINE again but doesn't send new line uptime timestart ; starts chrono... sendfile inputstr 0 send #4 @@ -39,22 +50,22 @@ if result = 0 then endif ; default mode = ECHO - sendln 'ECHO' - setecho 0 ; no echo from Teraterm - showtt 0 + sendln ' ECHO' uptime timestart ; starts chrono... sendfile inputstr 0 :end uptime timeend ; stops chrono... +diff = timeend - timestart -showtt 1 +showtt 1 ; display teraterm window -diff = timeend - timestart sprintf2 resultat " %s download and execute: %d msec" param2 diff messagebox resultat "teraterm.exe" +;logclose + unlink ;end diff --git a/config/SendSource.bat b/config/SendSource.bat index 13a901e..6f711f6 100644 --- a/config/SendSource.bat +++ b/config/SendSource.bat @@ -14,7 +14,7 @@ IF /I "%~x1" == ".4TH" GOTO 4TH :: source file.f part :: %~dpn1.f is the symbolic source file.f described as drive\path\name.f :: %~d1\inc\%~n2.pat is the pattern file for preprocessor gema.exe -:: %~dpn1.4TH is the source file.4TH to be preprocessed then sent to the target +:: %~dpn1.4TH is the source file.4TH to be sent to the target :: %~d1 is the drive of arg %1 :: %~n2 is your selected template by SelectTarget.bat or your scite $(1) @@ -46,15 +46,13 @@ IF /I "%3" == "HALF" GOTO preprocessF echo unexpected third parameter %3 ! :badend -::pause > nul - +pause > nul exit :preprocessF -::@%~d1\prog\gema.exe -nobackup -line -t '\n=\r\n;\r\n=\r\n' -f %~d1\inc\%~n2.pat %~dpn1.f %~dpn1.4TH @%~d1\prog\gema.exe -nobackup -line -t '-\r\n=\r\n' -f %~d1\inc\%~n2.pat %~dpn1.f %~dpn1.4TH -call %~d1\config\Select.bat SelectDeviceId %~d1\inc\%~n2.pat +@call %~d1\config\Select.bat SelectDeviceId %~d1\inc\%~n2.pat :DownloadF @taskkill /F /IM ttermpro.exe 1> NUL 2>&1 @@ -112,6 +110,6 @@ goto badend @"C:\Program Files (x86)\teraterm\ttpmacro.exe" /V %~d1\config\SendFile.ttl %~dpn1.4TH /C %2 0 :End4th -::@COPY "%~dpn1.4TH" "%~dp1\LAST.4TH" > NUL +@COPY "%~dpn1.4TH" "%~dp1\LAST.4TH" > NUL exit diff --git a/config/SendSourceFileToTarget.bat b/config/SendSourceFileToTarget.bat index 2623a1e..a149d20 100644 --- a/config/SendSourceFileToTarget.bat +++ b/config/SendSourceFileToTarget.bat @@ -1,20 +1,22 @@ ::SendSourceFileToTarget.bat ::used as link in any folder to drag and drop file.f or file.4th on it. +@ECHO OFF + IF /I "%~x1" == ".f" goto sendF :send4th -start SendSource.bat %1 ECHO +start %~d1\config\SendSource.bat %1 ECHO ::PAUSE > NUL exit :sendF -call Select.bat SelectTemplate +call %~d1\config\Select.bat SelectTemplate -start SendSource.bat %1 %~d1\inc\%template% ECHO +start %~d1\config\SendSource.bat %1 %~d1\inc\%template% ECHO ::PAUSE > NUL exit diff --git a/config/SendToSD.ttl b/config/SendToSD.ttl index 1a9b29b..76a816f 100644 --- a/config/SendToSD.ttl +++ b/config/SendToSD.ttl @@ -1,30 +1,56 @@ - -; param1 = this macro filename -; param2 = pathname of file to write in SD_CARD -; param3 = /C = default COM saved in TERATERM.INI with all its parameters. -; param4 = deviceID +; macro called by SendSource.bat +; param1 = this macro +; param2 = %~dpn1.4TH to write in SD_CARD +; param3 = /C = default COMx saved in TERATERM.INI. +; param4 = %deviceID% from select.bat basename fname param2 ; fname = file.ext of param2 strinsert fname 1 '\' ; fname = \file.ext, to force absolute path -testlink -if result=0 connect param3 +connect param3 + +;logfile = '\teraterm.log' +;dirname logdir param2 ; logir = dir of file.4TH to be sent +;strconcat logdir logfile +;logopen logdir 0 + inputbox 'here you can change path of the file: ' 'Send this file to SD_CARD target' fname +setecho 0 ; no echo from Teraterm +showtt 0 ; close teraterm windows + +; DEVICE ID TEST +; ============== + sendln 'CODE ?ID'; CODE ?ID sendln 'CMP #0,R14 0<> IF SUB &$1A04,R14 THEN'; CMP #0,TOS 0<> IF SUB &DEVICEID,TOS THEN -sendln 'COLON $1B EMIT $63 EMIT'; COLON $1B EMIT $63 EMIT \ send 'ESC c' -sendln 'ABORT" DeviceID mismatch!" ;'; ABORT" DeviceID mismatch!" ; - -sendln param5 ' ?ID NOECHO' ; send : "%deviceID% ?ID NOECHO" +sendln 'COLON '; COLON +sendln '$1B EMIT $63 EMIT'; $1B EMIT $63 EMIT \ send 'ESC c' (clear screen) +sendln 'CR ABORT" Device'39's ID mismatch!" ' ; CR ABORT" Device's ID mismatch!" +sendln 'PWR_STATE ;' ; PWR_STATE ; -sendln 'ECHO [DEFINED] STOP [IF] STOP [THEN]' ; execute STOP if defined +sendln param4 ' ?ID NOECHO' ; send: %deviceID% ?ID sendln 'TERM2SD" ' inputstr '"' ; send to FastForth the command TERM2SD" \file.4TH" ...with optionnal path added in inputbox +uptime timestart ; starts chrono... + sendfile param2 0 ; binary flag = 0 to send text file sendln #4 ; send ETX to ask TERM2SD" to close file -; end +uptime timeend ; stops chrono... +diff = timeend - timestart + +sendln 'ECHO' + +showtt 1 ; display teraterm window + +sprintf2 resultat " %s download to SD Card: %d msec" param2 diff +messagebox resultat "teraterm.exe" + + +;logclose + +unlink diff --git a/config/asm.properties b/config/asm.properties index b4cb339..ba2a207 100644 --- a/config/asm.properties +++ b/config/asm.properties @@ -1,3 +1,4 @@ +position.maximize=1 # Define SciTE settings for MACROASSEMBLER AS for MSP430 file.patterns.asm=*.asm;*.inc;*.lst;*.mac @@ -49,7 +50,7 @@ keywords3.$(file.patterns.asm)=.align .cpu .byte .word .endm .endmacro \ .warning .error # my macros -keywords4.$(file.patterns.asm)=NEXT DOALIAS DEST +keywords4.$(file.patterns.asm)=NEXT mDOCOL # Default style.asm.32=$(font.base) diff --git a/config/forth.properties b/config/forth.properties index 40a6f4f..3cf4a56 100644 --- a/config/forth.properties +++ b/config/forth.properties @@ -122,19 +122,19 @@ style.forth.11=fore:#0077FF,$(font.base) if PLAT_WIN command.name.0.*.f=preprocess file.f with 1:[target].pat then download file.4TH - command.0.*.f=*\config\SendSource.bat $(FileDir)\$(FileName).f $(1) NOECHO + command.0.*.f=*\config\SendSource.bat $(FileDir)\$(FileName).f $(1)$(2) NOECHO command.name.1.*.f=preprocess file.f with 1:[target].pat then download file.4TH with ECHO - command.1.*.f=*\config\SendSource.bat $(FileDir)\$(FileName).f $(1) ECHO + command.1.*.f=*\config\SendSource.bat $(FileDir)\$(FileName).f $(1)$(2) ECHO command.name.2.*.f=preprocess file.f with 1:[target].pat then download file.4th HALFDUPLEX - command.2.*.f=*\config\SendSource.bat $(FileDir)/$(FileName).f $(1) HALF + command.2.*.f=*\config\SendSource.bat $(FileDir)/$(FileName).f $(1)$(2) HALF command.name.3.*.f=preprocess file.f with 1:[target].pat then download file.4TH to target SD_CARD - command.3.*.f=*\config\CopyTo_SD_Card.bat $(FileDir)\$(FileName).f $(1) + command.3.*.f=*\config\CopyTo_SD_Card.bat $(FileDir)\$(FileName).f $(1)$(2) command.name.4.*.f=preprocess file.f with 1:[target].pat to LAST.4th (for debug) - command.4.*.f=*\config\Preprocess.bat $(FileDir)\$(FileName).f $(1) + command.4.*.f=*\config\Preprocess.bat $(FileDir)\$(FileName).f $(1)$(2) command.name.5.*.f=preprocess file.f with target CurrentSelection then download command.5.*.f=\config\SendSource.bat $(FileDir)\$(FileName).f $(CurrentSelection) NOECHO diff --git a/forthMSP430FR.asm b/forthMSP430FR.asm index 7787df0..0830d89 100644 --- a/forthMSP430FR.asm +++ b/forthMSP430FR.asm @@ -1,41 +1,22 @@ ; -*- coding: utf-8 -*- -; http://patorjk.com/software/taag/#p=display&f=Banner&t=Fast Forth - -; Fast Forth For Texas Instrument MSP430FRxxxx FRAM devices with UART TERMINAL -; Copyright (C) <2019> -; -; 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 . - ;------------------------------------------------------------------------------- ; 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 ;------------------------------------------------------------------------------- -; Purgare ... et repurgare. Molière, Le Malade imaginaire ;-) -;------------------------------------------------------------------------------- ;------------------------------------------------------------------------------- ; SCITE editor: copy https://www.scintilla.org/Sc4xx.exe to \prog\scite.exe ;------------------------------------------------------------------------------- ; MACRO ASSEMBLER AS -; unzip http://john.ccac.rwth-aachen.de:8000/ftp/as/precompiled/i386-unknown-win32/aswcurr.zip to \prog\ +; unzip http://john.ccac.rwth-aachen.de:8000/ftp/as/precompiled/i386-unknown-win32/aswcurr.zip ;------------------------------------------------------------------------------- .listing purecode ; reduce listing to true conditionnal parts MACEXP_DFT noif ; reduce macros listing to true part ;------------------------------------------------------------------------------- -VER .equ "V306" ; FORTH version +VER .equ "V307" ; FORTH version ;=============================================================================== ; before assembling or programming you must set TARGET in scite param1 (SHIFT+F8) @@ -47,15 +28,16 @@ VER .equ "V306" ; FORTH version ; kernel size below are for 8MHz, DTC=1, THREADS=1, 4WIRES (RTS) options ;=============================================================================== ; TARGET ; ;INFO+VECTORS+ MAIN bytes -;MSP_EXP430FR5739 ; compile for MSP-EXP430FR5739 launchpad ; 30 + 128 + 2766 bytes -;MSP_EXP430FR5969 ; compile for MSP-EXP430FR5969 launchpad ; 30 + 128 + 2756 bytes -MSP_EXP430FR5994 ; compile for MSP-EXP430FR5994 launchpad ; 30 + 128 + 2778 bytes -;MSP_EXP430FR6989 ; compile for MSP-EXP430FR6989 launchpad ; 30 + 128 + 2790 bytes -;MSP_EXP430FR4133 ; compile for MSP-EXP430FR4133 launchpad ; 30 + 128 + 2820 bytes -;MSP_EXP430FR2355 ; compile for MSP-EXP430FR2355 launchpad ; 30 + 128 + 2754 bytes -;MSP_EXP430FR2433 ; compile for MSP-EXP430FR2433 launchpad ; 30 + 128 + 2746 bytes -;LP_MSP430FR2476 ; compile for LP_MSP430FR2476 launchpad ; 30 + 128 + 2758 bytes -;CHIPSTICK_FR2433 ; compile for "CHIPSTICK" of M. Ken BOAK ; 30 + 128 + 2746 bytes +;MSP_EXP430FR5739 ; compile for MSP-EXP430FR5739 launchpad ; 64 + 128 + 2778 bytes +;MSP_EXP430FR5969 ; compile for MSP-EXP430FR5969 launchpad ; 64 + 128 + 2768 bytes +MSP_EXP430FR5994 ; compile for MSP-EXP430FR5994 launchpad ; 64 + 128 + 2790 bytes +;MSP_EXP430FR6989 ; compile for MSP-EXP430FR6989 launchpad ; 64 + 128 + 2792 bytes +;MSP_EXP430FR4133 ; compile for MSP-EXP430FR4133 launchpad ; 64 + 128 + 2832 bytes +;MSP_EXP430FR2355 ; compile for MSP-EXP430FR2355 launchpad ; 64 + 128 + 2766 bytes +;MSP_EXP430FR2433 ; compile for MSP-EXP430FR2433 launchpad ; 64 + 128 + 2758 bytes +;LP_MSP430FR2476 ; compile for LP_MSP430FR2476 launchpad ; 64 + 128 + 2770 bytes +;CHIPSTICK_FR2433 ; compile for "CHIPSTICK" of M. Ken BOAK ; 64 + 128 + 2758 bytes +;MSP_EXP430FR5972 ; compile for a virtual launchpad ; 64 + 128 + 2804 bytes ; choose DTC model (Direct Threaded Code); if you don't know, choose 2, because DOCOL routine without using scratch register DTC .equ 2 ; DTC model 1 : DOCOL = CALL rDOCOL 14 cycles 1 word shortest DTC model @@ -66,18 +48,25 @@ THREADS .equ 16 ; 1, 2 , 4 , 8 , 16, 32 search entries in dictionnary ; +0, +28, +48, +56, +90, +154 bytes, usefull to speed up compilation; ; the FORTH interpreter is speed up by about a square root factor of THREADS. -FREQUENCY .equ 16 ; fully tested at 1,2,4,8,16,24 MHz (24 MHz for MSP430FR57xx,MSP430FR2355) +FREQUENCY .equ 1 ; fully tested at 1,2,4,8,16,24 MHz (24 MHz for MSP430FR57xx,MSP430FR2355) ;=============================================================================== -;TERMINAL_I2C ; uncomment to select I2C Slave TERMINAL instead of UART TERMINAL below +TERMINAL_I2C ; uncomment to select I2C_Master TERMINAL instead of UART TERMINAL +;=============================================================================== + .IFDEF TERMINAL_I2C +MYSLAVEADR .equ 18 ; +;=============================================================================== + .ELSE ; UART TERMINAL ;=============================================================================== TERMINALBAUDRATE .equ 115200 ; choose value considering the frequency and the UART2USB bridge, see explanations below. +;------------------------------------------------------------------------------- TERMINAL3WIRES ; + 18 bytes enable 3 wires (GND,TX,RX) with XON/XOFF software flow control (PL2303TA/HXD, CP2102) TERMINAL4WIRES ; + 12 bytes enable 4 wires with hardware flow control on RX with RTS (PL2303TA/HXD, FT232RL) ;TERMINAL5WIRES ; + 10 bytes enable 5 wires with hardware flow control on RX/TX with RTS/CTS (PL2303TA/HXD, FT232RL)... +;------------------------------------------------------------------------------- ;HALFDUPLEX ; switch to UART half duplex TERMINAL input ;=============================================================================== - + .ENDIF ;=============================================================================== ; MINIMAL ADDONS if you want a canonical FORTH: CORE_COMPLEMENT + CONDCOMP + PROMPT ;=============================================================================== @@ -87,17 +76,17 @@ TERMINAL4WIRES ; + 12 bytes enable 4 wires with hardware flow control on ;------------------------------------------------------------------------------- ; KERNEL ADDONs that can't be added later ;------------------------------------------------------------------------------- -MSP430ASSEMBLER ; + 1722 bytes : adds embedded assembler with TI syntax; without, you can do all but bigger and slower... -CONDCOMP ; + 302 bytes : adds conditionnal compilation [IF] [ELSE] [THEN] [DEFINED] [UNDEFINED] -DOUBLE_INPUT ; + 58 bytes : adds the interpretation engine for double numbers (numbers with dot) -FIXPOINT_INPUT ; + 128 bytes : adds the interpretation engine for Q15.16 numbers (numbers with comma) -DEFERRED ; + 122 bytes : adds DEFER IS :NONAME CODENNM (CODE_No_NaMe). -VOCABULARY_SET ; + 106 bytes : adds words: VOCABULARY FORTH ASSEMBLER ALSO PREVIOUS ONLY DEFINITIONS (FORTH83) -EXTENDED_MEM ; + 318 bytes : allows assembler to execute code up to 1MB. -EXTENDED_ASM ; + 1488 bytes : extended assembler to 20 bits Datas. +MSP430ASSEMBLER ; + 1812 bytes : adds embedded assembler with TI syntax; without, you can do all but bigger and slower... +CONDCOMP ; + 306 bytes : adds conditionnal compilation [IF] [ELSE] [THEN] [DEFINED] [UNDEFINED] +DOUBLE_INPUT ; + 56 bytes : adds the interpretation engine for double numbers (numbers with dot) +FIXPOINT_INPUT ; + 74 bytes : adds the interpretation engine for Q15.16 numbers (numbers with comma) +DEFERRED ; + 124 bytes : adds DEFER IS :NONAME CODENNM (CODE_No_NaMe), useful for interrupts start and stop. +VOCABULARY_SET ; + 174 bytes : adds words: VOCABULARY FORTH ASSEMBLER ALSO PREVIOUS ONLY DEFINITIONS (FORTH83) +EXTENDED_MEM ; + 740 bytes : allows assembler to execute code up to 1MB (LARGE_CODE). +EXTENDED_ASM ; + 1260 bytes : extended assembler to 20 bits datas (LARGE_DATA + LARGE_CODE). SD_CARD_LOADER ; + 1766 bytes : to load source files from SD_card SD_CARD_READ_WRITE ; + 1148 bytes : to read, create, write and del files + copy text files from PC to target SD_Card -BOOTLOADER ; + 128 bytes : includes in WARM the bootloader SD_CARD\BOOT.4TH. +BOOTLOADER ; + 132 bytes : includes in WARM process the bootloader SD_CARD\BOOT.4TH. ;PROMPT ; + 22 bytes : to display prompt "ok " ;------------------------------------------------------------------------------- @@ -108,20 +97,20 @@ BOOTLOADER ; + 128 bytes : includes in WARM the bootloader SD_CARD\BOO ;CORE_COMPLEMENT ; + 1974 bytes : MINIMAL OPTIONS if you want a conventional FORTH CORECOMP.f ;FIXPOINT ; + 422/528 bytes add HOLDS F+ F- F/ F* F#S F. S>F FIXPOINT.f ;UTILITY ; + 434/524 bytes (1/16threads) : add .S .RS WORDS U.R DUMP ? UTILITY.f -;SD_TOOLS ; + 142 bytes for trivial DIR, FAT, CLUSTER and SECTOR view, (adds UTILITY) SD_TOOLS.f +;SD_TOOLS ; + 142 bytes for trivial DIR, FAT, CLUSTR. and SECTOR. view, (adds UTILITY) SD_TOOLS.f .save .listing off ;=============================================================================== ; Software control flow XON/XOFF configuration: ;=============================================================================== -; Launchpad --- UARTtoUSB device +; Launchpad <-> UARTtoUSB device <-> TeraTerm TERMINAL ; RX <-- TX ; TX --> RX ; GND <-> GND ; ; TERATERM config terminal: NewLine receive : LF, ; NewLine transmit : CR+LF -; Size : 128 chars x 49 lines (adjust lines according to your display) +; Size : 96 chars x 49 lines (adjust lines according to your display) ; ; TERATERM config serial port: TERMINALBAUDRATE value, ; 8 bits, no parity, 1 Stop bit, @@ -130,34 +119,35 @@ BOOTLOADER ; + 128 bytes : includes in WARM the bootloader SD_CARD\BOO ; ; don't forget to save always new TERATERM configuration ! -; -------------------------------------------------------------------------------------------- +; ------------------------------------------------------------------------------ ; Only two usb2uart bridges correctly handle XON / XOFF: cp2102 and pl2303. -; -------------------------------------------------------------------------------------------- +; ------------------------------------------------------------------------------ ; the best and cheapest: UARTtoUSB cable with Prolific PL2303HXD (or PL2303TA) ; works well in 3 WIRES (XON/XOFF) and 4WIRES (GND,RX,TX,RTS) config -; -------------------------------------------------------------------------------------------- +; ------------------------------------------------------------------------------ ; PL2303TA 4 wires CABLE PL2303HXD 6 wires CABLE ; pads upside: 3V3,txd,rxd,gnd,5V pads upside: gnd, 3V3,txd,rxd,5V ; downside: cts,dcd,dsr,rts,dtr downside: rts,cts -; -------------------------------------------------------------------------------------------- +; ------------------------------------------------------------------------------ ; WARNING ! if you use PL2303TA/HXD cable as supply, open the box before to weld red wire on 3v3 pad ! -; -------------------------------------------------------------------------------------------- -; up to 134400 Bds (500kHz,FR5xxx) -; up to 268800 Bds (1MHz,FR5xxx) -; up to 614400 Bds (2MHz,FR5xxx) -; up to 1228800 Bds (4MHz,FR5xxx) -; up to 2457600 Bds (8MHz,FR5xxx) -; up to 3MBds (16MHz,FR5xxx,PL2303TA) -; up to 5MBds (16MHz,FR5xxx,PL2303HXD with shortened cable) 5MBds at 16MHz, not too lazy !:-) -; up to 6MBds (24MHz,PL2303HXD with shortened cable) +; ------------------------------------------------------------------------------ +; up to 115200 Bds (500kHz) +; up to 230400 Bds (1MHz) +; up to 460800 Bds (2MHz) +; up to 921600 Bds (4MHz) +; up to 1843200 Bds (8MHz) +; up to 3 MBds (12MHz,PL2303HXD with shortened cable < 20cm) +; up to 4 MBds (16MHz,PL2303HXD with shortened cable < 20cm) +; up to 5 MBds (20MHz,PL2303HXD with shortened cable < 20cm) +; up to 6 MBds (24MHz,PL2303HXD with shortened cable < 20cm) ; UARTtoUSB module with Silabs CP2102 (supply current = 20 mA) -; --------------------------------------------------------------------------------------------------- +; ------------------------------------------------------------------------------ ; WARNING ! if you use it as supply, buy a CP2102 module with a VCC switch 5V/3V3 and swith on 3V3 ! -; --------------------------------------------------------------------------------------------------- +; ------------------------------------------------------------------------------ ; 9600,19200,38400 (250kHz) -; + 57600 (500kHz) -; + 115200,134400,230400 (1MHz) +; + 57600, 115200 (500kHz) +; + 134400,230400 (1MHz) ; + 460800 (2MHz) ; + 921600 (4MHz,8MHz,16MHz,24MHz) @@ -175,7 +165,7 @@ BOOTLOADER ; + 128 bytes : includes in WARM the bootloader SD_CARD\BOO ; TERATERM config terminal : NewLine receive : LF, ; NewLine transmit : CR+LF -; Size : 128 chars x 49 lines (adjust lines to your display) +; Size : 96 chars x 49 lines (adjust lines to your display) ; TERATERM config serial port : TERMINALBAUDRATE value, ; 8bits, no parity, 1Stopbit, @@ -187,16 +177,20 @@ BOOTLOADER ; + 128 bytes : includes in WARM the bootloader SD_CARD\BOO ; notice that the control flow seems not necessary for TX (CTS <-- RTS) ; UARTtoUSB module with PL2303TA/HXD -; -------------------------------------------------------------------------------------------- +; ------------------------------------------------------------------------------ ; WARNING ! if you use PL2303TA/HXD cable as supply, open the box before to weld red wire on 3v3 pad ! -; -------------------------------------------------------------------------------------------- +; ------------------------------------------------------------------------------ +; up to 250 kbds / MHz +; ---------------------------------- ; 9600,19200,38400,57600 (250kHz) -; + 115200,134400 (500kHz) -; + 201600,230400,268800 (1MHz) -; + 403200,460800,614400 (2MHz) -; + 806400,921600,1228800 (4MHz) -; + 2457600,3000000 (8MHz) -; + 4000000,5000000 (16MHz) +; + 115200 (500kHz) +; + 201600,230400,250000 (1MHz) +; + 403200,460800 (2MHz) +; + 806400,921600 (4MHz) +; + 1843200 (8MHz) +; + 2764800 (12MHz) +; + 4000000 (16MHz) +; + 5000000 (20MHz) ; + 6000000 (24MHz) ; UARTtoUSB module with FTDI FT232RL (FT230X don't work correctly) @@ -332,10 +326,10 @@ CURRENT .equ HOLD_BASE+40 ; CURRENT dictionnary ptr BASE .equ HOLD_BASE+42 LINE .equ HOLD_BASE+44 ; line in interpretation (see NOECHO, ECHO) -; --------------------------------------------------------------; -; RAM_ORG + $1E0 : free for user after source file compilation ; -; --------------------------------------------------------------; - +; --------------------------; +; RAM_ORG + $1E0 : free use ; +; --------------------------; + .IFDEF SD_CARD_LOADER ; -------------------------------------------------- ; RAM_ORG + $1FC : RAM SD_CARD SD_BUF 4 + 512 bytes ; -------------------------------------------------- @@ -343,63 +337,87 @@ SD_BUF_I2CADR .equ SD_BUF-4 SD_BUF_I2CCNT .equ SD_BUF-2 SD_BUF .equ HOLD_BASE+78 SD_BUF_END .equ SD_BUF + 200h ; 512bytes + .ENDIF .org INFO_ORG ;------------------------------------------------------------------------------- ; INFO(DCBA) >= 256 bytes memory map (FRAM) : ;------------------------------------------------------------------------------- -; FRAM INFO KERNEL CONSTANTS -; -------------------------- -INI_THREAD .word THREADS ; used by ADDON_UTILITY.f +; FRAM INFO: KERNEL INIT CONSTANTS and VARIABLES +; ---------------------------------------------- +FREQ_KHZ .word FREQUENCY*1000 ; used to stabilize MCLK before start, see MSP430FRxxxx.asm .IFDEF TERMINAL_I2C -I2CSLAVEADR .word 010h ; on MSP430FR2xxx devices with BSL I2C, Slave address is FFA0h +I2CSLAVEADR .word MYSLAVEADR ; on MSP430FR2xxx devices with BSL I2C, Slave address is FFA0h I2CSLAVEADR1 .word 0 +LPM_MODE .word GIE+LPM4 ; LPM4 is the default mode for I2C TERMINAL .ELSE ; TERMINAL_UART TERMBRW_RST .word TERMBRW_INI ; set by TERMINALBAUDRATE.inc TERMMCTLW_RST .word TERMMCTLW_INI ; set by TERMINALBAUDRATE.inc - .ENDIF ; TERMINAL_I2C - .IF FREQUENCY = 0.25 -FREQ_KHZ .word 250 ; - .ELSEIF FREQUENCY = 0.5 -FREQ_KHZ .word 500 ; - .ELSE -FREQ_KHZ .word FREQUENCY*1000 ; user use - .ENDIF ; FREQUENCY -SAVE_SYSRSTIV .word 5 ; to identify reset after compiling kernel - .IFDEF TERMINAL_I2C -LPM_MODE .word GIE+LPM4 ; LPM4 is the default mode for I2C TERMINAL - .ELSE ; TERMINAL_UART LPM_MODE .word GIE+LPM0 ; LPM0 is the default mode for UART TERMINAL -;LPM_MODE .word GIE+LPM1 ; LPM1 is the default mode (disable FLL) - .ENDIF ; TERMINAL_I2C -INIDP .word ROMDICT ; define RST_STATE -INIVOC .word lastvoclink ; define RST_STATE -FORTHVERSION .word VAL(SUBSTR(VER,1,0)); -FORTHADDON .word FADDON ; - .word RXON ; 1814h for user use: CALL &RXON - .word RXOFF ; 1816h for user use: CALL &RXOFF - .IFDEF SD_CARD_LOADER - .word ReadSectorWX ; 1818h used by SD_TOOLS.f - .IFDEF SD_CARD_READ_WRITE - .word WriteSectorWX ; 181Ah - .ELSE - .word WARM ; - .ENDIF - .ELSE - .word WARM ; - .word WARM + .ENDIF +RSTIV_MEM .word -7 ; to do RESET = -3 when compiling new kernel +RST_DP .word ROMDICT ; define RST_STATE +RST_VOC .word lastvoclink ; define RST_STATE +FORTHVERSION .word VAL(SUBSTR(VER,1,0)); used by WARM +INI_THREAD .word THREADS ; used by FF_SPECS.f, UTILITY.f +FORTHADDON .word FADDON ; used by FF_SPECS.f and to secure donwloading of any application.f files. +; --------------------------------------; +WIPE_INI ; MOV #WIPE_INI,X ; WIPE_INI constants are in FRAM INFO= DEEP_RESET init +; --------------------------------------; + .IFNDEF SD_CARD_LOADER +WIPE_COLD .word COLD_TERM ; MOV @X+,&PFACOLD ; COLD_TERM --> PFACOLD +WIPE_INI_FORTH .word RET_ADR ; MOV @X+,&PFA_INI_FORTH; RET_ADR --> PFA_INI_FORTH +WIPE_SLEEP .word RXON ; MOV @X+,&PFASLEEP ; RXON --> PFASLEEP +WIPE_WARM .word INIT_TERM ; MOV @X+,&PFAWARM ; INIT_TERM --> PFAWARM + .ELSE +WIPE_COLD .word COLD_TERM ; MOV @X+,&PFACOLD ; COLD_TERM --> PFACOLD +WIPE_INI_FORTH .word INI_FORTH_SD ; MOV @X+,&PFA_INI_FORTH; INI_FORTH_SD --> PFA_INI_FORTH +WIPE_SLEEP .word RXON ; MOV @X+,&PFASLEEP ; RXON --> PFASLEEP +WIPE_WARM .word INIT_SD ; MOV @X+,&PFAWARM ; INIT_SD --> PFAWARM .ENDIF -INT_TERMINAL .word TERMINAL_INT ; to init TERM_VEC +WIPE_TERM_INT .word TERMINAL_INT ; MOV @X+,&TERM_VEC ; TERMINAL_INT --> TERM_VEC +WIPE_DP .word ROMDICT ; MOV @X+,&RST_DP ; ROMDICT --> RST_DP +WIPE_VOC .word lastvoclink ; MOV @X+,&RST_VOC ; lastvoclink --> RST_VOC +; --------------------------------------; +INI_FORTH_INI ; MOV #INI_FORTH_INI,X, to reset all kernel variables +; --------------------------------------; +WIPE_ACCEPT .word BODYACCEPT ; MOV @X+,&PFAACCEPT ; BODYACCEPT --> PFAACCEPT +WIPE_CR .word BODYCR ; MOV @X+,&PFACR ; BODYCR --> PFACR +INI_FORTH_EMIT .word BODYEMIT ; MOV @X+,&PFAEMIT ; BODYEMIT --> PFAEMIT +WIPE_KEY .word BODYKEY ; MOV @X+,&PFAKEY ; BODYKEY --> PFAKEY +WIPE_CIB .word TIB_ORG ; MOV @X+,&CIB_ADR ; TIB_ORG --> CIB_ADR +; --------------------------------------; +HALF_FORTH_INI ; MOV #HALF_FORTH_INI,X to preserve defered words +; --------------------------------------; + .SWITCH DTC + .CASE 1 +INI_FORTH_COL .word xDOCOL ; MOV @X+,rDOCOL ; init rDOCOL (R4) + .CASE 2 +INI_FORTH_COL .word EXIT ; MOV @X+,rDOCOL ; init rDOCOL (R4) + .CASE 3 + .word 0 ; MOV @X+,R4 ; rDOCOL doesn't exist + .ENDCASE +INI_FORTH_DOES .word xDODOES ; MOV @X+,rDODOES ; init rDODOES (R5) +INI_FORTH_CON .word xDOCON ; MOV @X+,rDOCON ; init rDOCON (R6) +INI_FORTH_VAR .word RFROM ; MOV @X+,rDOVAR ; init rDOVAR (R7) +INI_FORTH_CAPS .word 32 ; MOV @X+,&CAPS ; 32 --> CAPS +INI_FORTH_BASE .word 10 ; MOV @X+,&BASE ; 10 --> BASE +; --------------------------------------; +ABORT_ADR .word ABORT ; user use, QUIT_ADR = ABORT_ADR + 6 +QUIT4_ADR .word QUIT4 ; used by BOOTLOADER + .word 0 ; use free + .word 0 ; use free + .IFDEF SD_CARD_LOADER ; --------------------------------------- ; VARIABLES that should be in RAM ; --------------------------------------- .IF RAM_LEN < 2048 ; if RAM < 2K (FR57xx) the variables below are in INFO space (FRAM) -SD_ORG .equ INFO_ORG+2Ch ; +SD_ORG .equ INFO_ORG+5Ah ; .ELSE ; if RAM >= 2k the variables below are in RAM SD_ORG .equ SD_BUF_END+2 ; 1 word guard - .ENDIF + .ENDIF .org SD_ORG ; --------------------------------------- @@ -415,10 +433,10 @@ OrgRootDIR .equ SD_ORG+12 ; init by SD_Init, (FAT16 specific) OrgClusters .equ SD_ORG+14 ; init by SD_Init, Sector of Cluster 0 SecPerClus .equ SD_ORG+16 ; init by SD_Init, byte size -SD_LOW_LEVEL .equ SD_ORG+18 ; --------------------------------------- ; SD command ; --------------------------------------- +SD_LOW_LEVEL .equ SD_ORG+18 SD_CMD_FRM .equ SD_LOW_LEVEL ; SD_CMDx inverted frame ${CRC7,ll,LL,hh,HH,CMD} SectorL .equ SD_LOW_LEVEL+6 SectorH .equ SD_LOW_LEVEL+8 @@ -427,10 +445,10 @@ SectorH .equ SD_LOW_LEVEL+8 ; --------------------------------------- BufferPtr .equ SD_LOW_LEVEL+10 BufferLen .equ SD_LOW_LEVEL+12 -SD_FAT_LEVEL .equ SD_LOW_LEVEL+14 ; --------------------------------------- ; FAT entry ; --------------------------------------- +SD_FAT_LEVEL .equ SD_LOW_LEVEL+14 ClusterL .equ SD_FAT_LEVEL ; ClusterH .equ SD_FAT_LEVEL+2 ; NewClusterL .equ SD_FAT_LEVEL+4 ; @@ -478,9 +496,10 @@ HDLW_BUFofst .equ 22 ; SD_BUF offset ; used by LOAD" HDLW_PrevLEN .equ 24 ; previous LEN HDLW_PrevORG .equ 26 ; previous ORG - .IF RAM_LEN < 2048 ; due to the lack of RAM, only 5 handles and PAD replaces SDIB -HandleMax .equ 5 ; and not 8 to respect INFO size (FRAM) + .IF RAM_LEN < 2048 ; due to the lack of RAM, only 4 handles and PAD replaces SDIB +HandleMax .equ 4 ; and not 8 to respect INFO size (FRAM) HandleLenght .equ 28 +HandlesLen .equ handleMax*HandleLenght HandleEnd .equ FirstHandle+handleMax*HandleLenght SD_END .equ HandleEnd SDIB_I2CADR .equ PAD_ORG-4 @@ -489,6 +508,7 @@ SDIB_ORG .equ PAD_ORG .ELSE ; RAM_Size >= 2k all is in RAM HandleMax .equ 8 HandleLenght .equ 28 +HandlesLen .equ handleMax*HandleLenght HandleEnd .equ FirstHandle+handleMax*HandleLenght SDIB_I2CADR .equ SDIB_ORG-4 SDIB_I2CCNT .equ SDIB_ORG-2 @@ -498,61 +518,53 @@ SD_END .equ SDIB_ORG+SDIB_LEN .ENDIF ; RAM_Size SD_LEN .equ SD_END-SD_ORG .ENDIF ; SD_CARD_LOADER +; --------------------------; +; INFO_ORG + $40 : free use ; +; --------------------------; .org MAIN_ORG ;------------------------------------------------------------------------------- ; DTCforthMSP430FR5xxx program (FRAM) memory ;------------------------------------------------------------------------------- -; here we place maximum of primitives without associated word FORTH. -; as their addresses are options independent, FORTH can access via declarations made in MSP430xxxx.pat - -;############################################################################################################### -;############################################################################################################### -SLEEP MOV @PC+,PC ;3 Code Field Address (CFA) of SLEEP -PFASLEEP .word BODYSLEEP ; Parameter Field Address (PFA) of SLEEP, with BODYSLEEP as default exec addr -BODYSLEEP CALL #RXON ;4 enable TERMINAL RX - BIS &LPM_MODE,SR ;3 enter in LPMx sleep mode with GIE=1 -; ----------------------------------; default FAST FORTH mode (for its input terminal use) : LPM0. - -; ### # # ####### ####### ###### ###### # # ###### ####### ##### # # ####### ###### ####### -; # ## # # # # # # # # # # # # # # # # # # # # -; # # # # # # # # # # # # # # # # # # # # # # -; # # # # # ##### ###### ###### # # ###### # ##### ####### ##### ###### ##### -; # # # # # # # # # # # # # # # # # # # # # -; # # ## # # # # # # # # # # # # # # # # # # -; ### # # # ####### # # # # ##### # # ##### # # ####### # # ####### - -; here, FAST FORTH sleeps, waiting any interrupt. -; And any interruption must interrupt FAST FORTH only here.. -; 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 to force SLEEP executing. -; You can reuse UF9 UF10 UF11 SR flags saved in 0(RSP) -; or simply (previous SR flags will be lost) : ADD #2 RSP, then RET instead of RETI - -; ==================================; - JMP SLEEP ;2 here is the return for any interrupts, else TERMINAL_INT :-) -;############################################################################################################### -;############################################################################################################### +; here we place the FORTH primitives without name. +; Users can access them via declarations made in \inc\MSP430FRxxxx.pat +; +;############################################################################### +; ╦┌┐┌┌┬┐┌─┐┬─┐┬─┐┬ ┬┌─┐┌┬┐┌─┐ ┌─┐┌─┐┬ ┬ ┌┬┐┌─┐┬ ┬┌┐┌ ┬ ┬┌─┐┬─┐┌─┐ +; ║│││ │ ├┤ ├┬┘├┬┘│ │├─┘ │ └─┐ ├┤ ├─┤│ │ │││ │││││││ ├─┤├┤ ├┬┘├┤ +; ╩┘└┘ ┴ └─┘┴└─┴└─└─┘┴ ┴ └─┘ └ ┴ ┴┴─┘┴─┘ ─┴┘└─┘└┴┘┘└┘ ┴ ┴└─┘┴└─└─┘ +;############################################################################### +SLEEP +; here, FAST FORTH sleeps, waiting any interrupt. With LPM4, supply current is below 1uA. +; IP,S,T,W,X,Y registers (R13 to R8) are free... +; ...and so TOS, PSP and RSP stacks within their rules of use. +; remember: in any interrupt routine you must include : BIC #0xF8,0(RSP) before RETI to force SLEEP execution. +; or simply : ADD #2 RSP, then RET instead of RETI (but previous SR flags will be lost) + CALL @PC+ ; SLEEP first calls BACKGND_APP +PFASLEEP .word RXON ; BACKGND_DEF = RXON as default BACKGND_APP; value set by WIPE. + BIS &LPM_MODE,SR ; enter in LPMx mode with GIE=1 (after next instruction executing). + JMP SLEEP ; +; +;############################################################################### ; ------------------------------------------------------------------------------ ; COMPILING OPERATORS ; ------------------------------------------------------------------------------ ; Primitive LIT; compiled by LITERAL ; lit -- x fetch inline literal to stack -; This is the execution part of LITERAL. +; This is the run-time code of LITERAL. ; FORTHWORD "LIT" LIT SUB #2,PSP ; 2 push old TOS.. MOV TOS,0(PSP) ; 3 ..onto stack MOV @IP+,TOS ; 2 fetch new TOS value -NEXT_ADR MOV @IP+,PC ; 4 NEXT + MOV @IP+,PC ; 4 NEXT ; Primitive XSQUOTE; compiled by SQUOTE ; (S") -- addr u run-time code to get address and length of a compiled string. XSQUOTE SUB #4,PSP ; 1 -- x x TOS ; push old TOS on stack MOV TOS,2(PSP) ; 3 -- TOS x x ; and reserve one cell on stack MOV.B @IP+,TOS ; 2 -- x u ; u = lenght of string - MOV IP,0(PSP) ; 3 -- addr u + MOV IP,0(PSP) ; 3 -- addr u IP is odd... ADD TOS,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 @@ -565,30 +577,20 @@ HERE SUB #2,PSP MOV &DDP,TOS MOV @IP+,PC ;------------------------------------------------------------------------------- -; BRANCH OPERATORS +; BRANCH run-time ;------------------------------------------------------------------------------- -; Primitive QTBRAN -;Z ?TrueBranch x -- ; branch if TOS is true (TOS <> 0) -QTBRAN CMP #0,TOS ; 1 test TOS value +; Primitive QFBRAN; compiled by IF UNTIL +;Z ?FalseBranch x -- ; branch if TOS is FALSE (TOS = 0) +QFBRAN CMP #0,TOS ; 1 test TOS value MOV @PSP+,TOS ; 2 pop new TOS value (doesn't change flags) - JZ SKIPBRAN ; 2 if TOS was = 0, skip the branch + JNZ SKIPBRANCH ; 2 if TOS was <> 0, skip the branch; 10 cycles ; Primitive BRAN ;Z branch -- ; BRAN MOV @IP,IP ; 2 take the branch destination MOV @IP+,PC ; 4 ==> branch taken = 11 cycles - -; Primitive QFBRAN; compiled by IF UNTIL -;Z ?FalseBranch x -- ; branch if TOS is FALSE (TOS = 0) -QFBRAN CMP #0,TOS ; 1 test TOS value - MOV @PSP+,TOS ; 2 pop new TOS value (doesn't change flags) - JZ BRAN ; 2 if TOS was = 0, take the branch -; Primitive SKIPBRAN -;Z SkipBranch -- ; -SKIPBRAN ADD #2,IP ; 1 skip the branch destination - MOV @IP+,PC ; 4 ==> branch not taken = 10 cycles ;------------------------------------------------------------------------------- -; LOOP OPERATORS +; LOOP run-time ;------------------------------------------------------------------------------- ; Primitive XDO; compiled by DO ;Z (do) n1|u1 n2|u2 -- R: -- sys1 sys2 run-time code for DO @@ -611,7 +613,7 @@ XPLOOP ADD TOS,0(RSP) ;4 increment INDEX by TOS value XLOOPNEXT BIT #100h,SR ;2 is overflow bit set? JZ BRAN ;2 no overflow = loop ADD #4,RSP ;1 empty RSP - ADD #2,IP ;1 overflow = loop done, skip branch ofs +SKIPBRANCH ADD #2,IP ;1 overflow = loop done, skip branch ofs MOV @IP+,PC ;4 16~ taken or not taken xloop/loop ; Primitive XLOOP; compiled by LOOP @@ -639,48 +641,49 @@ XLOOP ADD #1,0(RSP) ;4 increment INDEX ; Y = QUOThi = ud2hi = ud2hi ; rDODOES = count -MUSMOD MOV TOS,T ;1 T = DIVlo - MOV 2(PSP),S ;3 S = DVDlo - MOV @PSP,TOS ;2 TOS = DVDhi -MUSMOD1 MOV #0,W ;1 W = REMlo = 0 - MOV #32,rDODOES ;2 init loop count - CMP #0,TOS ;1 DVDhi=0 ? - JNZ MDIV1 ;2 no +MUSMOD MOV TOS,T ;1 T = DIVlo + MOV 2(PSP),S ;3 S = DVDlo + MOV @PSP,TOS ;2 TOS = DVDhi +MUSMOD1 MOV #0,W ;1 W = REMlo = 0 + MOV #32,rDODOES ;2 init loop count + CMP #0,TOS ;1 DVDhi=0 ? + JNZ MDIV1 ;2 no ; ----------------------------------------- - RRA rDODOES ;1 yes: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) +MDIV1DIV2 RRA rDODOES ;1 yes: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>= DIV ? - JNC MDIV2 ;2 no : carry is reset - SUB T,W ;1 yes: REMlo - DIV ; carry is set -MDIV2 ADDC X,X ;1 RLC quotLO - ADDC Y,Y ;1 RLC quotHI - SUB #1,rDODOES ;1 Decrement loop counter - JN ENDMDIV ;2 - ADD S,S ;1 RLA DVDlo - ADDC TOS,TOS ;1 RLC DVDhi - ADDC W,W ;1 RLC REMlo - JNC MDIV1 ;2 - SUB T,W ;1 REMlo - DIV - BIS #1,SR ;1 SETC - JMP MDIV2 ;2 -ENDMDIV MOV #xdodoes,rDODOES;2 restore rDODOES - MOV W,2(PSP) ;3 REMlo in 2(PSP) - MOV X,0(PSP) ;3 QUOTlo in 0(PSP) - MOV Y,TOS ;1 QUOThi in TOS - MOV @RSP+,PC ;4 35 words, about 473 cycles, not FORTH executable ! +MDIV1 CMP T,W ;1 REMlo U>= DIV ? + JNC MDIV2 ;2 no : carry is reset + SUB T,W ;1 yes: REMlo - DIV ; carry is set +MDIV2 ADDC X,X ;1 RLC quotLO + ADDC Y,Y ;1 RLC quotHI + SUB #1,rDODOES ;1 Decrement loop counter + JN ENDMDIV ;2 + ADD S,S ;1 RLA DVDlo + ADDC TOS,TOS ;1 RLC DVDhi + ADDC W,W ;1 RLC REMlo + JNC MDIV1 ;2 + SUB T,W ;1 REMlo - DIV + BIS #1,SR ;1 SETC + JMP MDIV2 ;2 +ENDMDIV MOV #XDODOES,rDODOES ;2 restore rDODOES + MOV W,2(PSP) ;3 REMlo in 2(PSP) + MOV X,0(PSP) ;3 QUOTlo in 0(PSP) + MOV Y,TOS ;1 QUOThi in TOS +RET_ADR MOV @RSP+,PC ;4 35 words, about 473 cycles, not FORTH executable ! ; : SETIB SOURCE 2! 0 >IN ! ; ; SETIB org len -- set Input Buffer, shared by INTERPRET and [ELSE] SETIB MOV TOS,&SOURCE_LEN ; -- org len MOV @PSP+,&SOURCE_ORG ; -- len - MOV @PSP+,TOS ; -- MOV #0,&TOIN ; + MOV @PSP+,TOS ; -- MOV @IP+,PC ; -; REFILL accept one line from input and leave org len of input buffer +; REFILL accept one line to input buffer and leave org len' of the filled input buffer +; as it has no more host OS and as waiting command is done by ACCEPT, REFILL's flag is useless ; : REFILL TIB DUP TIB_LEN ACCEPT ; -- org len' shared by QUIT and [ELSE] REFILL SUB #6,PSP ;2 MOV TOS,4(PSP) ;3 @@ -691,58 +694,78 @@ CIB_ADR .word TIB_ORG ; imm=TIB_ORG MOV @PSP,2(PSP) ;4 -- org org len JMP ACCEPT ;2 org org len -- org len' -XDODOES ; -- addr ; 4 for CALL rDODOES S-- BODY PFA R-- - SUB #2,PSP ; 1 - MOV TOS,0(PSP) ; 3 save TOS on parameters stack - MOV @RSP+,TOS ; 2 TOS = PFA 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 address of created word - MOV @IP+,PC ; 4 Execute Master word - -XDOCON ; 4 for CALL rDOCON S-- CTE PFA R-- - SUB #2,PSP ; 1 - MOV TOS,0(PSP) ; 3 save TOS on parameters stack - MOV @RSP+,TOS ; 2 TOS = PFA address of master word CONSTANT -FETCH MOV @TOS,TOS ; 2 TOS = CONSTANT value - MOV @IP+,PC ; 4 execute next word - ; 16 = ITC (+4) - - .IF DTC = 1 ; DOCOL = CALL rDOCOL, [rDOCOL] = xdocol -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 - ; 10 cycles - .ENDIF -;------------------------------------------------------------------------------- -; INTERPRETER INPUT -;------------------------------------------------------------------------------- - .IFDEF SD_CARD_LOADER - .include "forthMSP430FR_SD_ACCEPT.asm" ; to enable SD CARD access, adds word SD_ACCEPT - .ENDIF +XDODOES ; -- addr ; 4 for CALL rDODOES S-- BODY PFA R-- + SUB #2,PSP ;+1 + MOV TOS,0(PSP) ;+3 save TOS on parameters stack + MOV @RSP+,TOS ;+2 TOS = PFA 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 address of created word + MOV @IP+,PC ;+4 = 19~ = ITC-2 + +XDOCON ; 4 for CALL rDOCON S-- CTE PFA R-- + SUB #2,PSP ;+1 + MOV TOS,0(PSP) ;+3 save TOS on parameters stack + MOV @RSP+,TOS ;+2 TOS = PFA address of master word CONSTANT + MOV @TOS,TOS ;+2 TOS = CONSTANT value + MOV @IP+,PC ;+4 = 16~ = ITC+4 + +; https://forth-standard.org/standard/core/Rfrom +; R> -- x R: x -- pop from return stack +RFROM +XDOVAR ; 4 for CALL rDOVAR ADR -- VAR + SUB #2,PSP ;+1 + MOV TOS,0(PSP) ;+3 + MOV @RSP+,TOS ;+2 + MOV @IP+,PC ;+4 = 14~ = ITC+4 - .IFDEF DEFER_ACCEPT - FORTHWORD "ACCEPT" -;https://forth-standard.org/standard/core/ACCEPT -;C ACCEPT addr addr len -- addr len' get line at addr to interpret len' chars -ACCEPT MOV @PC+,PC ;3 Code Field Address (CFA) of ACCEPT -PFAACCEPT .word BODYACCEPT ; Parameter Field Address (PFA) of ACCEPT -BODYACCEPT ; BODY of ACCEPT = default execution of ACCEPT +;-----------------------------------; +; RESET 6.1: init Forth engine ; common part of QABORT|RESET +;-----------------------------------; +INI_FORTH ; + CALL @PC+ ; +PFA_INI_FORTH + .IFNDEF SD_CARD_LOADER + .word RET_ADR ; INI_SOFT_DEF: default value, to do nothing .ELSE - FORTHWORD "ACCEPT" -;https://forth-standard.org/standard/core/ACCEPT -;C ACCEPT addr addr len -- addr len' get line at addr to interpret len' chars -ACCEPT - .ENDIF ; DEFER_ACCEPT + .word INI_FORTH_SD ; INI_SOFT_SD : close all handles, set default ACCEPT and TIB + .ENDIF + MOV #INI_FORTH_INI,X ; in FRAM INFO + MOV @X+,&PFAACCEPT ; BODYACCEPT --> PFAACCEPT + MOV @X+,&PFACR ; BODYCR --> PFACR + MOV @X+,&PFAEMIT ; BODYEMIT --> PFAEMIT + MOV @X+,&PFAKEY ; BODYKEY --> PFAKEY + MOV @X+,&CIB_ADR ; TIB_ORG --> CIB_ADR + MOV @X+,rDOCOL ; --> rDOCOL + MOV @X+,rDODOES ; xDODOES --> rDODOES + MOV @X+,rDOCON ; xDOCON --> rDOCON + MOV @X+,rDOVAR ; RFROM --> rDOVAR + MOV @X+,&CAPS ; 32 --> CAPS init CAPS ON + MOV @X+,&BASE ; 10 --> BASE init decimal base + MOV @RSP+,IP ; init IP with RET_ADR = LIT|WARM from resp. QABORT|RESET + MOV #SEL_P_R_D,PC ; goto RESET 6.2 to select PWR_STATE|RST_STATE|DEEP_RESET ;------------------------------------------------------------------------------- -; SELECT TERMINAL : I2C_SLave, UART_HalfDuplex, UART ; words ACCEPT KEY EMIT ECHO NOECHO +; SELECT TERMINAL: I2C_SLave, UART, HalfDuplex; ACCEPT KEY EMIT WIPE COLD WARM ;------------------------------------------------------------------------------- - .IFDEF TERMINAL_I2C ; FAST FORTH with TERMINAL I/O via I2C_Slave (half duplex) + .IFDEF TERMINAL_I2C .include "forthMSP430FR_TERM_I2C.asm" .ELSE - .include "forthMSP430FR_TERM_UART.asm" + .IFDEF HALFDUPLEX + .include "forthMSP430FR_TERM_HALF.asm" + .ELSE + .include "forthMSP430FR_TERM_UART.asm" + .ENDIF .ENDIF + .IFDEF SD_CARD_LOADER + .include "forthMSP430FR_SD_ACCEPT.asm" + .ENDIF + + .IF DTC = 1 ; DOCOL = CALL rDOCOL, [rDOCOL] = xdocol +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 + .ENDIF ; 10 cycles FORTHWORD "TYPE" ;https://forth-standard.org/standard/core/TYPE @@ -756,11 +779,11 @@ TYPELOOP MOV @PSP,Y ;2 -- adr len Y = adr MOV TOS,0(PSP) ;3 -- adr len len MOV.B @Y+,TOS ;2 -- adr len char MOV Y,2(PSP) ;3 -- adr+1 len char - JMP EMIT ;2+13 all scratch registers must be and are free + MOV &PFAEMIT,PC ;5+17 all scratch registers must be and are free TYPE_NEXT .word $+2 ; -- adr+1 len SUB #2,IP ;1 [IP] = TYPE_NEXT SUB #1,TOS ;1 -- adr+1 len-1 - JNZ TYPELOOP ;2 30~ EMIT loop + JNZ TYPELOOP ;2 37~ EMIT loop MOV @RSP+,IP ;3 -- adr+len 0 TWODROP ADD #2,PSP ;1 -- 0 DROP MOV @PSP+,TOS ;2 -- @@ -830,6 +853,7 @@ SWAP MOV @PSP,W ; 2 ADD #2,PSP ; 1 MOV @IP+,PC ; 4 + .IFNDEF OVER FORTHWORD "OVER" ;https://forth-standard.org/standard/core/OVER ;C OVER x1 x2 -- x1 x2 x1 @@ -837,6 +861,7 @@ SWAP MOV @PSP,W ; 2 MOV @PSP,TOS ; 2 -- x1 (x2) x1 SUB #2,PSP ; 1 -- x1 x2 x1 MOV @IP+,PC ; 4 + .ENDIF FORTHWORD "ROT" ;https://forth-standard.org/standard/core/ROT @@ -859,47 +884,40 @@ DEPTH MOV TOS,-2(PSP) MOV @IP+,PC .IFDEF CORE_COMPLEMENT + FORTHWORD "R@" +;https://forth-standard.org/standard/core/RFetch +;C R@ -- x R: x -- x fetch from rtn stk + SUB #2,PSP + MOV TOS,0(PSP) + MOV @RSP,TOS + MOV @IP+,PC + FORTHWORD ">R" ; https://forth-standard.org/standard/core/toR ; >R x -- R: -- x push to return stack TOR PUSH TOS MOV @PSP+,TOS MOV @IP+,PC - .ENDIF - .IFDEF CORE_COMPLEMENT + FORTHWORD "R>" - .ENDIF ; https://forth-standard.org/standard/core/Rfrom ; R> -- x R: x -- pop from return stack -RFROM SUB #2,PSP ; 1 + SUB #2,PSP ; 1 MOV TOS,0(PSP) ; 3 MOV @RSP+,TOS ; 2 MOV @IP+,PC ; 4 - .IFDEF CORE_COMPLEMENT - FORTHWORD "R@" -;https://forth-standard.org/standard/core/RFetch -;C R@ -- x R: x -- x fetch from rtn stk - SUB #2,PSP - MOV TOS,0(PSP) - MOV @RSP,TOS - MOV @IP+,PC .ENDIF - ;------------------------------------------------------------------------------- ; ARITHMETIC OPERATIONS ;------------------------------------------------------------------------------- .IFDEF CORE_COMPLEMENT - FORTHWORD "-" - .ENDIF -; https://forth-standard.org/standard/core/Minus -; - n1/u1 n2/u2 -- n3/u3 n3 = n1-n2 -MINUS SUB @PSP+,TOS ;2 -- n2-n1 -NEGATE XOR #-1,TOS ;1 -ONEPLUS ADD #1,TOS ;1 -- n3 = -(n2-n1) = n1-n2 + FORTHWORD "1+" +; https://forth-standard.org/standard/core/OnePlus +; 1+ n1/u1 -- n2/u2 add 1 to TOS + ADD #1,TOS MOV @IP+,PC - .IFDEF CORE_COMPLEMENT FORTHWORD "1-" ; https://forth-standard.org/standard/core/OneMinus ; 1- n1/u1 -- n2/u2 subtract 1 from TOS @@ -912,25 +930,25 @@ ONEPLUS ADD #1,TOS ;1 -- n3 = -(n2-n1) = n1-n2 ADD @PSP+,TOS MOV @IP+,PC - FORTHWORD "1+" -; https://forth-standard.org/standard/core/OnePlus -; 1+ n1/u1 -- n2/u2 add 1 to TOS - ADD #1,TOS - MOV @IP+,PC + FORTHWORD "-" .ENDIF +; https://forth-standard.org/standard/core/Minus +; - n1/u1 n2/u2 -- n3/u3 n3 = n1-n2 +MINUS SUB @PSP+,TOS ;2 -- n2-n1 +NEGATE XOR #-1,TOS ;1 +ONEPLUS ADD #1,TOS ;1 -- n3 = -(n2-n1) = n1-n2 + MOV @IP+,PC ;------------------------------------------------------------------------------- ; MEMORY OPERATIONS ;------------------------------------------------------------------------------- - .IFDEF CORE_COMPLEMENT FORTHWORD "@" ; https://forth-standard.org/standard/core/Fetch ; @ a-addr -- x fetch cell from memory - MOV @TOS,TOS +FETCH MOV @TOS,TOS MOV @IP+,PC FORTHWORD "!" - .ENDIF ; https://forth-standard.org/standard/core/Store ; ! x a-addr -- store cell in memory STORE MOV @PSP+,0(TOS);4 @@ -947,7 +965,7 @@ STORE MOV @PSP+,0(TOS);4 ; 0= n/u -- flag return true if TOS=0 ZEROEQUAL SUB #1,TOS ;1 borrow (clear cy) if TOS was 0 SUBC TOS,TOS ;1 TOS=-1 if borrow was set - MOV @IP+,PC + MOV @IP+,PC ;4 .IFDEF CORE_COMPLEMENT FORTHWORD "0<" @@ -965,17 +983,17 @@ INVERT XOR #-1,TOS ;1 TOS=-1 if carry was set ; https://forth-standard.org/standard/core/Uless ; U< u1 u2 -- flag test u1 -[HP] - MOV &HP,Y ;3 - MOV.B W,0(Y) ;3 - MOV @IP+,PC ;4 23 words +NUM MOV &BASE,T ;3 T = Divisor +NUM1 MOV @PSP,S ;2 -- DVDlo DVDhi S = DVDlo + SUB #2,PSP ;1 -- x x DVDhi TOS = DVDhi + CALL #MUSMOD1 ;4 -- REMlo QUOTlo QUOThi T is unchanged + MOV @PSP+,0(PSP) ;4 -- QUOTlo QUOThi +TODIGIT CMP.B #10,W ;2 W = REMlo + JNC TODIGIT1 ;2 jump if U< + ADD.B #7,W ;2 +TODIGIT1 ADD.B #30h,W ;2 +HOLDW SUB #1,&HP ;4 store W=char --> -[HP] + MOV &HP,Y ;3 + MOV.B W,0(Y) ;3 + MOV @IP+,PC ;4 23 words FORTHWORD "#S" ; https://forth-standard.org/standard/core/numS ; #S udlo udhi -- 0 0 convert remaining digits NUMS mDOCOL - .word NUM ; X=QUOTlo -NUM_RETURN .word $+2 ; next adr - SUB #2,IP ;1 restore NUM return - CMP #0,X ;1 test ud2lo first (generally <>0) - JNZ NUM1 ;2 - CMP #0,TOS ;1 then test ud2hi (generally =0) - JNZ NUM1 ;2 -EXIT MOV @RSP+,IP - MOV @IP+,PC ;6 10 words, about 241/417 cycles/char + .word NUM ; X=QUOTlo +NUM_RETURN .word $+2 ; next adr + SUB #2,IP ;1 restore NUM return + CMP #0,X ;1 test ud2lo first (generally <>0) + JNZ NUM1 ;2 + CMP #0,TOS ;1 then test ud2hi (generally =0) + JNZ NUM1 ;2 +EXIT MOV @RSP+,IP + MOV @IP+,PC ;6 10 words, about 241/417 cycles/char FORTHWORD "#>" ; https://forth-standard.org/standard/core/num-end @@ -1057,9 +1075,9 @@ NUMGREATER MOV &HP,0(PSP) FORTHWORD "HOLD" ; https://forth-standard.org/standard/core/HOLD ; HOLD char -- add char to output string -HOLD MOV.B TOS,W ;1 - MOV @PSP+,TOS ;2 - JMP HOLDW ;15 +HOLD MOV.B TOS,W ;1 + MOV @PSP+,TOS ;2 + JMP HOLDW ;15 FORTHWORD "SIGN" ; https://forth-standard.org/standard/core/SIGN @@ -1067,25 +1085,26 @@ HOLD MOV.B TOS,W ;1 SIGN CMP #0,TOS MOV @PSP+,TOS MOV.B #'-',W - JN HOLDW ; jump if 0< + JN HOLDW ; jump if 0< MOV @IP+,PC FORTHWORD "U." ; https://forth-standard.org/standard/core/Ud ; U. u -- display u (unsigned) -UDOT MOV #0,Y ; 1 -DOTTODDOT SUB #2,PSP ; 1 convert n|u to d|ud with Y = -1|0 - MOV TOS,0(PSP) ; 3 - MOV Y,TOS ; 1 -DDOT PUSH IP ; paired with EXIT R-- IP - PUSH TOS ; paired with RFROM R-- IP sign - AND #-1,TOS ; clear V, set N - JGE DDOTNEXT ; if positive (N=0) - XOR #-1,0(PSP) ;4 - XOR #-1,TOS ;1 - ADD #1,0(PSP) ;4 - ADDC #0,TOS ;1 -DDOTNEXT ASMTOFORTH ;10 +; note: DDOT = UDOT + 10 +UDOT MOV #0,Y ; 1 +DOTTODDOT SUB #2,PSP ; 1 convert n|u to d|ud with Y = -1|0 + MOV TOS,0(PSP) ; 3 + MOV Y,TOS ; 1 +DDOT PUSH IP ; paired with EXIT R-- IP + PUSH TOS ; paired with RFROM R-- IP sign + AND #-1,TOS ; clear V, set N + JGE DDOTNEXT ; if positive (N=0) + XOR #-1,0(PSP) ;4 + XOR #-1,TOS ;1 + ADD #1,0(PSP) ;4 + ADDC #0,TOS ;1 +DDOTNEXT ASMTOFORTH ;10 .word LESSNUM,NUMS .word RFROM,SIGN,NUMGREATER,TYPE .word FBLANK,EMIT,EXIT @@ -1104,22 +1123,22 @@ DOT CMP #0,TOS FORTHWORDIMM "S\34" ; immediate ; https://forth-standard.org/standard/core/Sq ; S" -- compile in-line string -SQUOTE MOV #0,&CAPS ; CAPS OFF +SQUOTE MOV #0,&CAPS ; CAPS OFF mDOCOL .word lit,XSQUOTE,COMMA -SQUOTE1 .word lit,'"' ; separator for WORD - .word WORDD ; -- c-addr (= HERE) +SQUOTE1 .word lit,'"' ; separator for WORD + .word WORDD ; -- c-addr (= HERE) .word $+2 - MOV #32,&CAPS ; CAPS ON - MOV.B @TOS,TOS ; -- u - ADD #1,TOS ; -- u+1 - BIT #1,TOS ;1 C = ~Z + MOV #32,&CAPS ; CAPS ON + MOV.B @TOS,TOS ; -- u + ADD #1,TOS ; -- u+1 + BIT #1,TOS ;1 C = ~Z ADDC TOS,&DDP -DROPEXIT MOV @RSP+,IP - MOV @PSP+,TOS +DROPEXIT MOV @PSP+,TOS + MOV @RSP+,IP MOV @IP+,PC - FORTHWORDIMM ".\34" ; immediate + FORTHWORDIMM ".\34" ; immediate ; https://forth-standard.org/standard/core/Dotq ; ." -- compile string to print DOTQUOTE mDOCOL @@ -1132,8 +1151,8 @@ DOTQUOTE mDOCOL FORTHWORD "WORD" ; https://forth-standard.org/standard/core/WORD ; WORD char -- addr Z=1 if len=0 -; parse a word delimited by char separator; by default (CAPS=$20), this "word" is capitalized -; when used by S" (CAPS=0), this "word" will not be capitalized. +; parse a word delimited by char separator; by default (CAPS=$20), this word is capitalized. +; if first char is TICK, the entire word is not capitalized. WORDD MOV #SOURCE_LEN,S ;2 -- separator MOV @S+,X ;2 X = src_len MOV @S+,W ;2 W = src_org @@ -1146,7 +1165,10 @@ SKIPCHARLOO CMP W,X ;1 src_ptr = src_end ? JZ SKIPCHARLOO ;2 if yes; 7~ loop SUB #1,W ;1 move back one the (post incremented) pointer SCANWORD MOV #96,T ;2 T = 96 = ascii(a)-1 (test value set in a register before SCANWORD loop) - MOV &CAPS,rDODOES ;3 + MOV &CAPS,rDODOES ;3 CAPS OFF = 0, CAPS ON = $20. +QSCANTICK CMP.B #27h,0(W) ;4 first char = TICK ? + JNZ SCANWORDLOO ;2 no + MOV #0,rDODOES ;1 yes, don't change to upper case SCANWORDLOO MOV.B S,0(Y) ;3 first time make room in dst for word length; next, put char @ dst. CMP W,X ;1 src_ptr = src_end ? JZ SCANWORDEND ;2 if yes @@ -1158,7 +1180,7 @@ SCANWORDLOO MOV.B S,0(Y) ;3 first time make room in dst JC SCANWORDLOO ;2 15~ upper case char loop CMP.B #123,S ;2 char U>= 'z'+1 ? JC SCANWORDLOO ;2 loopback if yes - SUB.B rDODOES,S ;1 convert a...z to A...Z if CAPS ON (rDODOES=32) + SUB.B rDODOES,S ;1 convert a...z to A...Z if CAPS ON (rDODOES=$20) JMP SCANWORDLOO ;2 22~ lower case char loop SCANWORDEND MOV #XDODOES,rDODOES ;2 SKIPCHAREND SUB &SOURCE_ORG,W ;3 -- separator W=src_ptr - src_org = new >IN (first char separator next) @@ -1166,11 +1188,11 @@ SKIPCHAREND SUB &SOURCE_ORG,W ;3 -- separator W=src_ptr - src_org = new >I MOV &DDP,TOS ;3 -- c-addr SUB TOS,Y ;1 Y=Word_Length MOV.B Y,0(TOS) ;3 - MOV @IP+,PC ;4 -- c-addr 43 words Z=1 <==> lenght=0 <==> EOL + MOV @IP+,PC ;4 -- c-addr 48 words Z=1 <==> lenght=0 <==> EOL, Z is tested by INTERPRET - FORTHWORD "FIND" ; -- c-addr at transient RAM area (HERE) + FORTHWORD "FIND" ; ; https://forth-standard.org/standard/core/FIND -; FIND c-addr -- c-addr 0 if not found ; flag Z=1 +; FIND c-addr -- c-addr 0 if not found ; flag Z=1 c-addr at transient RAM area (HERE) ; CFA -1 if found ; flag Z=0 ; CFA 1 if immediate ; flag Z=0 ; compare WORD at c-addr (HERE) with each of words in each of listed vocabularies in CONTEXT @@ -1182,8 +1204,8 @@ SKIPCHAREND SUB &SOURCE_ORG,W ;3 -- separator W=src_ptr - src_org = new >I ; note: with 16 threads vocabularies, FIND takes only! 75% of CORETEST.4th processing time FIND SUB #2,PSP ;1 -- ???? c-addr reserve one cell, not at FINDEND because kill flag Z MOV TOS,S ;1 S=c-addr - MOV.B @S,rDOCON ;2 R5= string count - MOV.B #80h,rDODOES ;2 R4= immediate mask + MOV.B @S,rDOCON ;2 rDOCON= string count + MOV.B #80h,rDODOES ;2 rDODOES= immediate mask MOV #CONTEXT,T ;2 VOCLOOP MOV @T+,TOS ;2 -- ???? VOC_PFA T=CTXT+2 CMP #0,TOS ;1 no more vocabulary in CONTEXT ? @@ -1191,12 +1213,12 @@ VOCLOOP MOV @T+,TOS ;2 -- ???? VOC_PFA T=CTXT+2 .SWITCH THREADS .CASE 1 .ELSECASE ; search thread add 6cycles 5words -MAKETHREAD MOV.B 1(S),Y ;3 -- ???? VOC_PFA0 S=c-addr Y=first char of c-addr string + MOV.B 1(S),Y ;3 -- ???? VOC_PFA0 S=c-addr Y=first char of c-addr string AND.B #(THREADS-1)*2,Y ;2 -- ???? VOC_PFA0 Y=thread offset ADD Y,TOS ;1 -- ???? VOC_PFAx TOS = words set entry .ENDCASE ADD #2,TOS ;1 -- ???? VOC_PFA+2 -WORDLOOP MOV -2(TOS),TOS ;3 -- ???? [VOC_PFA] [VOC_PFA] first, then [LFA] +WORDLOOP MOV -2(TOS),TOS ;3 -- ???? NFA [VOC_PFA] first, then [LFA] CMP #0,TOS ;1 -- ???? NFA no more word in the thread ? JZ VOCLOOP ;2 -- ???? NFA yes ==> search next voc in context MOV TOS,X ;1 @@ -1216,7 +1238,7 @@ WORDFOUND BIT #1,X ;1 MOV X,S ;1 S=aligned CFA CMP.B #0,0(TOS) ;3 -- ???? NFA 0(TOS)=NFA_first_char MOV #1,TOS ;1 -- ???? 1 preset immediate flag - JN FINDEND ;2 -- ???? 1 jump if negative = immediate + JN FINDEND ;2 -- ???? 1 jump if negative: NFA have immediate bit set SUB #2,TOS ;1 -- ???? -1 FINDEND MOV S,0(PSP) ;3 not found: -- c-addr 0 flag Z=1 MOV #xdocon,rDOCON ;2 found: -- xt -1|+1 (not immediate|immediate) flag Z=0 @@ -1266,17 +1288,16 @@ TONUMEND MOV S,0(PSP) ;3 -- x x addr2 cnt2 MOV @IP+,PC ;4 42 words ; ?NUMBER makes the interface between INTERPRET and >NUMBER; it's a subset of INTERPRET. -; can't be simplified because also used by assembler. -; convert a string to a signed number; FORTH 2012 prefixes $, %, # are recognized, -; digits separator '_' also. +; convert a string to a signed number; FORTH 2012 prefixes $ % # are recognized, +; FORTH 2012 'char' numbers also, digits separator '_' also. ; with DOUBLE_INPUT switched ON, 32 bits signed numbers (with decimal point) are recognized, ; with FIXPOINT_INPUT switched ON, Q15.16 signed numbers (with comma) are recognized. -; prefixed chars - # % $ are processed before calling >NUMBER, +; prefixes ' # % $ - are processed before calling >NUMBER ; chars . , _ are processed as >NUMBER exits. ;Z ?NUMBER addr -- n|d -1 if convert ok ; flag Z=0, UF9=1 if double ;Z addr -- addr 0 if convert ko ; flag Z=1 QNUMBER - .IFDEF DOUBLE_NUMBERS ; DOUBLE_NUMBERS = DOUBLE_INPUT | FIXPOINT_INPUT + .IFDEF DOUBLE_NUMBERS ; DOUBLE_NUMBERS = DOUBLE_INPUT | FIXPOINT_INPUT BIC #UF9,SR ;2 reset UF9 used as double number flag .ENDIF ; MOV &BASE,T ;3 T=BASE @@ -1285,31 +1306,34 @@ QNUMBER MOV #TONUMEXIT,IP ;2 set TONUMEXIT as return from >NUMBER MOV #0,X ;1 X=ud1lo MOV #0,Y ;1 Y=ud1hi - SUB #8,PSP ;1 -- x x x x addr save TOS and make room for >NUMBER + SUB #8,PSP ;1 -- x x x x addr make room for TOS and >NUMBER MOV TOS,6(PSP) ;3 -- addr x x x addr MOV TOS,S ;1 S=addr MOV.B @S+,TOS ;2 -- addr x x x cnt TOS=count +QTICK CMP.B #027h,0(S) ;4 prefix = ' ? + JNZ QNUMLDCHAR ;2 no + MOV.B 1(S),S ;3 + MOV S,4(PSP) ;3 -- addr ud2lo x x cnt ud2lo = ASCII code of 'char' + CMP.B #3,TOS ;2 string must be 3 chars long + JMP QNUMNEXT ;2 QNUMLDCHAR MOV.B @S,W ;2 W=char -; CMP.B W,-1(S) ;3 for purists: -; JZ BADPPFIX ;2 if already same prefix - CMP.B #'-',W ;2 +QMINUS SUB.B #'-',W ;2 sign minus ? JNC QBINARY ;2 jump if char < '-' - JNZ DDIGITQ ;2 -- addr x x x cnt jump if char > '-' + JNZ TONUMLOOP ;2 -- addr x x x cnt jump if char > '-' MOV #-1,2(RSP) ;3 R-- IP sign base set sign flag JMP PREFIXED ;2 QBINARY MOV #2,T ;1 preset base 2 - SUB.B #'%',W ;2 binary number ? - JZ PREFIXED ;2 -QDECIMAL ADD #8,T ;1 - ADD.B #2,W ;1 decimal number ? - JZ PREFIXED ;2 -QHEXA MOV #16,T ;2 - SUB.B #1,W ;1 hex number ? + ADD.B #8,W ;1 binary '%' prefix ? + JZ PREFIXED ;2 yes +QDECIMAL ADD #8,T ;1 preset base 10 + ADD.B #2,W ;1 decimal '#' prefix ? + JZ PREFIXED ;2 yes +QHEXA MOV #16,T ;2 preset base 16 + ADD.B #-1,W ;1 hex '$' prefix ? JNZ QNUMNEXT ;2 -- addr x x x cnt abort if not recognized prefix PREFIXED ADD #1,S ;1 SUB #1,TOS ;1 -- addr x x x cnt-1 S=adr+1 TOS=count-1 - JNZ QNUMLDCHAR ;2 - JZ BADPPFIX ;2 abort if count = 0, because no number after Prefix ! + JMP QNUMLDCHAR ;2 ; ----------------------------------; TONUMEXIT .word $+2 ; -- addr ud2lo-hi addr2 cnt2 R-- IP sign BASE S=addr2 @@ -1318,24 +1342,22 @@ TONUMEXIT .word $+2 ; -- addr ud2lo-hi addr2 cnt2 R-- IP s ; ----------------------------------; SUB #2,IP ; redefines TONUMEXIT as >NUMBER return, if loopback applicable CMP.B #28h,W ; rejected char by >NUMBER is a underscore ? ('_'-30h-7 = 28h) - JNZ BADPPFIX ; goto next test if no - CMP #0,4(PSP) ; authorized underscore ? (udlo <> 0 ?) - JNZ TONUMPLUS ; yes loopback to >NUMBER to skip char -BADPPFIX ; if Bad Prefix|Postfix, goto QNUMKO + JZ TONUMPLUS ; yes: loopback to >NUMBER to skip char +; ----------------------------------; .IFDEF DOUBLE_NUMBERS ; DOUBLE_NUMBERS = DOUBLE_INPUT | FIXPOINT_INPUT BIT #UF9,SR ; UF9 already set ? ( when you have typed .. ) JNZ QNUMNEXT ; yes, goto QNUMKO BIS #UF9,SR ;2 set double number flag - .ELSE - BIC #Z,SR ; case of BADPPFIX without DOUBLE_NUMBERS, Z=0 forces QNUMKO .ENDIF +; ----------------------------------; .IFDEF DOUBLE_INPUT ; - CMP.B #0F7h,W ;2 rejected char by >NUMBER is a decimal point ? ('.'-30h-7 = -9) - JZ TONUMPLUS ;2 yes, loopback to >NUMBER with skip char + CMP.B #0F7h,W ;2 rejected char by >NUMBER is a decimal point ? ('.'-37h = -9) + JZ TONUMPLUS ;2 yes, loopback to >NUMBER to skip char .ENDIF ; +; ----------------------------------; .IFDEF FIXPOINT_INPUT ; - CMP.B #0F5h,W ;2 rejected char by >NUMBER is a comma ? (','-30h-7 = -7) - JNZ QNUMNEXT ;2 no, goto QNUMKO + CMP.B #0F5h,W ;2 rejected char by >NUMBER is a comma ? (','-37h = -0Bh) + JNZ QNUMNEXT ;2 no: with Z=0 ==> goto QNUMKO ; ----------------------------------; S15Q16 MOV TOS,W ;1 -- addr ud2lo x x x W=cnt2 MOV #0,X ;1 -- addr ud2lo x 0 x init X = ud2lo' = 0 @@ -1351,11 +1373,11 @@ S15Q16LOOP MOV X,2(PSP) ;3 -- addr ud2lo ud2lo' ud2lo' x 0(PSP) = CMP.B #10,X ;2 to skip all chars between "9" and "A" JNC S15Q16EOC ;2 QS15Q16DIGI CMP T,X ;1 R-- IP sign BASE is X a digit ? - JC S15Q16EOC ;2 -- addr ud2lo ud2lo' x ud2lo' if no goto QNUMNEXT (abort then) + JC S15Q16EOC ;2 -- addr ud2lo ud2lo' x ud2lo' if X>=base MOV X,0(PSP) ;3 -- addr ud2lo ud2lo' digit x MOV T,TOS ;1 -- addr ud2lo ud2lo' digit base R-- IP sign base PUSHM #3,S ;5 PUSH S,T,W: R-- IP sign base addr2 base cnt2 - CALL #MUSMOD ;4 -- addr ud2lo ur uqlo uqhi + CALL #MUSMOD ;4 -- addr ud2lo ur uqlo uqhi CALL MU/MOD POPM #3,S ;5 restore W,T,S: R-- IP sign BASE JMP S15Q16LOOP ;2 W=cnt S15Q16EOC MOV 4(PSP),2(PSP) ;5 -- addr ud2lo ud2hi uqlo x ud2lo from >NUMBER becomes here ud2hi part of Q15.16 @@ -1369,7 +1391,7 @@ QNUMNEXT POPM #3,IP ;5 -- addr ud2lo-hi x x POPM T,S JZ QNUMOK ;2 -- addr ud2lo-hi x sign conversion OK if Z=1 QNUMKO .IFDEF DOUBLE_NUMBERS ; - BIC #UF9,SR ;2 reset flag UF9, before use as double number flag + BIC #UF9,SR ;2 reset flag UF9, before next use as double number flag .ENDIF ADD #6,PSP ;1 -- addr sign AND #0,TOS ;1 -- addr ff TOS=0 and Z=1 ==> conversion ko @@ -1377,12 +1399,12 @@ QNUMKO ; ----------------------------------; .IFDEF DOUBLE_NUMBERS ; -- addr ud2lo-hi x sign QNUMOK ADD #2,PSP ;1 -- addr ud2lo-hi sign - MOV 2(PSP),4(PSP) ; -- udlo udlo udhi sign + MOV 2(PSP),4(PSP) ;5 -- udlo udlo udhi sign MOV @PSP+,0(PSP) ;4 -- udlo udhi sign note : PSP is incremented before write back. XOR #-1,TOS ;1 -- udlo udhi inv(sign) JNZ QDOUBLE ;2 if jump : TOS=-1 and Z=0 ==> conversion ok -QDNEGATE XOR #-1,TOS ;1 -- udlo udhi tf - XOR #-1,2(PSP) ;3 + XOR #-1,TOS ;1 -- udlo udhi tf +QDNEGATE XOR #-1,2(PSP) ;3 XOR #-1,0(PSP) ;3 -- (dlo dhi)-1 tf ADD #1,2(PSP) ;3 ADDC #0,0(PSP) ;3 @@ -1395,12 +1417,11 @@ QNUMOK ADD #4,PSP ;1 -- addr ud2lo sign MOV @PSP+,0(PSP) ;4 -- udlo sign note : PSP is incremented before write back !!! XOR #-1,TOS ;1 -- udlo inv(sign) JNZ QNUMEND ;2 if jump : TOS=-1 and Z=0 ==> conversion ok + XOR #-1,TOS ;1 -- udlo tf TOS=-1 and Z=0 QNEGATE XOR #-1,0(PSP) ;3 ADD #1,0(PSP) ;3 -- n tf - XOR #-1,TOS ;1 -- udlo udhi tf TOS=-1 and Z=0 QNUMEND MOV @IP+,PC ;4 TOS=-1 and Z=0 ==> conversion ok .ENDIF ; DOUBLE_NUMBERS ; -; ----------------------------------;119 words .ELSE ; no hardware MPY @@ -1473,52 +1494,52 @@ TONUMEND MOV S,0(PSP) ;3 -- ud2lo ud2hi adr2 count2 MOV @IP+,PC ;4 50/82 words/cycles, W = BASE ; ?NUMBER makes the interface between >NUMBER and INTERPRET; it's a subset of INTERPRET. -; convert a string to a signed number; FORTH 2012 prefixes $, %, # are recognized -; digits separator '_' is recognized +; convert a string to a signed number; FORTH 2012 prefixes ' $, %, # are recognized +; digits separator '_' also. ; with DOUBLE_INPUT switched ON, 32 bits signed numbers (with decimal point) are recognized ; with FIXPOINT_INPUT switched ON, Q15.16 signed numbers (with comma) are recognized. -; prefixes # % $ - are processed before calling >NUMBER +; prefixes ' # % $ - are processed before calling >NUMBER ; chars . , _ are processed as >NUMBER exits ;Z ?NUMBER addr -- n|d -1 if convert ok ; flag Z=0, UF9=1 if double ;Z addr -- addr 0 if convert ko ; flag Z=1 QNUMBER - .IFDEF DOUBLE_NUMBERS ; DOUBLE_NUMBERS = DOUBLE_INPUT | FIXPOINT_INPUT - BIC #UF9,SR ;2 reset flag UF9, before use as double number flag + .IFDEF DOUBLE_NUMBERS ; DOUBLE_NUMBERS = DOUBLE_INPUT | FIXPOINT_INPUT + BIC #UF9,SR ;2 reset flag UF9, before use as double number flag .ENDIF ; MOV &BASE,T ;3 T=BASE MOV #0,S ;1 PUSHM #3,IP ;5 R-- IP sign base (push IP,S,T) - MOV #TONUMEXIT,IP ;2 define >NUMBER return + MOV #TONUMEXIT,IP ;2 define >NUMBER return MOV T,W ;1 W=BASE SUB #8,PSP ;1 -- x x x x addr MOV TOS,6(PSP) ;3 -- addr x x x addr MOV #0,4(PSP) ;3 - MOV #0,2(PSP) ;3 -- addr ud=0 x addr - MOV TOS,S ;1 - MOV.B @S+,T ;2 -- addr ud=0 x x S=adr, T=count + MOV #0,2(PSP) ;3 -- addr 0 0 x addr + MOV TOS,S ;1 -- addr ud=0 x x + MOV.B @S+,T ;2 S=addr, T=count +QTICK CMP.B #27h,0(S) ;4 prefix = ' ? + JNZ QNUMLDCHAR ;2 no + MOV.B 1(S),4(PSP) ;5 -- addr ud2lo 0 x x ud2lo = ASCII code of 'char' + CMP.B #3,TOS ;2 string must be 3 chars long + JMP QNUMNEXT ;2 QNUMLDCHAR MOV.B @S,Y ;2 Y=char -; CMP.B W,-1(S) ;3 -; JZ BADPPFIX ;2 if already same Prefix - CMP.B #'-',Y ;2 - JNC QBINARY ;2 if char < '-' - JNZ DDIGITQ ;2 if char > '-' +QMINUS SUB.B #'-',Y ;2 -- addr ud=0 x x sign minus ? + JNC QBINARY ;2 if char U< '-' + JNZ TONUMLOOP ;2 if char U> '-' MOV #-1,2(RSP) ;3 R-- IP sign base JMP PREFIXED ;2 QBINARY MOV #2,W ;1 preset base 2 - SUB.B #'%',Y ;2 binary number ? - JZ PREFIXED ;2 -QDECIMAL ADD #8,W ;1 - ADD.B #2,Y ;1 decimal number ? - JZ PREFIXED ;2 -QHEXA MOV #16,W ;1 - SUB.B #1,Y ;2 hex number ? - JNZ QNUMNEXT ;2 -- addr ud=0 x x abort if not recognized prefix -PREFIXED CMP.B #2,T ; - JNC QNUMNEXT ; abort if T = 1 <==> no char after prefix! - ADD #1,S ;1 - SUB #1,T ;1 -- addr ud=0 x x S=adr+1 T=count-1 - JNZ QNUMLDCHAR ;2 - JZ BADPPFIX ;2 abort if count = 0, because no number after Prefix ! + ADD.B #8,Y ;1 binary prefix ? + JZ PREFIXED ;2 yes +QDECIMAL ADD #8,W ;1 preset base 10 + ADD.B #2,Y ;1 decimal prefix ? + JZ PREFIXED ;2 yes +QHEXA MOV #16,W ;1 preset base 16 + ADD.B #-1,Y ;2 hex prefix ? + JNZ QNUMNEXT ;2 -- addr x x x cnt abort if not recognized prefix +PREFIXED ADD #1,S ;1 + SUB #1,T ;1 S=adr+1 T=count-1 + JMP QNUMLDCHAR ;2 ; ----------------------------------;42 TONUMEXIT .word $+2 ; -- addr ud2lo-hi addr2 cnt2 R-- IP sign BASE S=addr2,T=cnt2 @@ -1527,16 +1548,11 @@ TONUMEXIT .word $+2 ; -- addr ud2lo-hi addr2 cnt2 R-- IP s ; ----------------------------------; SUB #2,IP CMP.B #28h,Y ; rejected char by >NUMBER is a underscore ? - JNZ BADPPFIX ; goto next test if no - CMP #0,4(PSP) ; authorized underscore ? (udlo <> 0) - JNZ TONUMPLUS ; yes loopback to >NUMBER to skip char -BADPPFIX ; if Bad Prefix|Postfix, goto QNUMKO + JZ TONUMPLUS ; yes: loopback to >NUMBER to skip char .IFDEF DOUBLE_NUMBERS ; DOUBLE_NUMBERS = DOUBLE_INPUT | FIXPOINT_INPUT - BIT #UF9,SR ; UF9 already set ? ( when you have typed .. ) + BIT #UF9,SR ; UF9 already set ? (you have wrongly typed two points) JNZ QNUMNEXT ; yes, goto QNUMKO BIS #UF9,SR ;2 set double number flag - .ELSE - BIC #Z,SR ; case of BADPPFIX without DOUBLE_NUMBERS, Z=0 forces QNUMKO .ENDIF .IFDEF DOUBLE_INPUT CMP.B #0F7h,Y ;2 rejected char by >NUMBER is a decimal point ? @@ -1574,8 +1590,8 @@ S15Q16EOC MOV 4(PSP),2(PSP) ;5 -- addr ud2lo ud2lo uqlo x ud2lo fr QNUMNEXT POPM #3,IP ;4 -- addr ud2lo-hi x cnt2 POPM T,S,IP S = sign flag = {-1;0} MOV S,TOS ;1 -- addr ud2lo-hi x sign MOV T,&BASE ;3 - JZ QNUMOK ;2 -- addr ud2lo-hi x sign conversion OK -QNUMKO + JZ QNUMOK ;2 -- addr ud2lo-hi x sign flag Z=1: conversion OK +QNUMKO ; flag Z=0 .IFDEF DOUBLE_NUMBERS BIC #UF9,SR .ENDIF @@ -1589,8 +1605,8 @@ QNUMOK ADD #2,PSP ;1 -- addr ud2lo ud2hi sign MOV @PSP+,0(PSP) ;4 -- udlo udhi sign note : PSP is incremented before write back !!! XOR #-1,TOS ;1 -- udlo udhi inv(sign) JNZ QDOUBLE ;2 if jump : TOS=-1 and Z=0 ==> conversion ok -Q2NEGATE XOR #-1,TOS ;1 -- udlo udhi tf - XOR #-1,2(PSP) ;3 + XOR #-1,TOS ;1 -- udlo udhi tf +Q2NEGATE XOR #-1,2(PSP) ;3 XOR #-1,0(PSP) ;3 ADD #1,2(PSP) ;3 ADDC #0,0(PSP) ;3 -- dlo dhi tf @@ -1600,12 +1616,12 @@ QDOUBLE BIT #UF9,SR ;2 -- dlo dhi tf decimal poin QNUMEND MOV @IP+,PC ;4 TOS=-1 and Z=0 ==> conversion ok .ELSE QNUMOK ADD #4,PSP ;1 -- addr ud2lo sign - MOV @PSP+,0(PSP) ;4 -- udlo sign note : PSP is incremented before write back !!! - XOR #-1,TOS ;1 -- udlo udhi inv(sign) - JNZ QNUMEND ;2 if jump : TOS=-1 and Z=0 ==> conversion ok + MOV @PSP+,0(PSP) ;4 -- udlo sign note : PSP is incremented before write back !!! + XOR #-1,TOS ;1 -- udlo inv(sign) + JNZ QNUMEND ;2 if jump : TOS=-1 and Z=0 ==> conversion ok + XOR #-1,TOS ;1 -- udlo tf TOS=-1 and Z=0 QNEGATE XOR #-1,0(PSP) ;3 ADD #1,0(PSP) ;3 -- n tf - XOR #-1,TOS ;1 -- udlo udhi tf TOS=-1 and Z=0 QNUMEND MOV @IP+,PC ;4 TOS=-1 and Z=0 ==> conversion ok .ENDIF ; DOUBLE_NUMBERS @@ -1623,7 +1639,6 @@ COMMA MOV &DDP,W ;3 MOV @PSP+,TOS ;2 MOV @IP+,PC ;4 15~ - .IFDEF CORE_COMPLEMENT FORTHWORD "ALLOT" ; https://forth-standard.org/standard/core/ALLOT ; ALLOT n -- allocate n bytes @@ -1631,6 +1646,7 @@ COMMA MOV &DDP,W ;3 MOV @PSP+,TOS MOV @IP+,PC + .IFDEF CORE_COMPLEMENT FORTHWORD "EXECUTE" ; https://forth-standard.org/standard/core/EXECUTE ; EXECUTE i*x xt -- j*x execute Forth word at 'xt' @@ -1641,30 +1657,31 @@ COMMA MOV &DDP,W ;3 ; https://forth-standard.org/standard/core/LITERAL ; LITERAL n -- append single numeric literal if compiling state ; d -- append two numeric literals if compiling state and UF9<>0 (not ANS) -LITERAL CMP #0,&STATE ;3 .IFDEF DOUBLE_NUMBERS ; are recognized +LITERAL CMP #0,&STATE ;3 JZ LITERAL2 ;2 if interpreting state, clear UF9 flag then NEXT -LITERAL1 MOV &DDP,W ;3 + MOV TOS,X ;1 +LITERAL1 MOV &DDP,W ;3 X = n|HId ADD #4,&DDP ;3 - MOV #lit,0(W) ;4 - MOV TOS,2(W) ;3 + MOV #LIT,0(W) ;4 + MOV X,2(W) ;3 MOV @PSP+,TOS ;2 BIT #UF9,SR ;2 double number ? LITERAL2 BIC #UF9,SR ;2 in all case, clear UF9 JZ LITERALEND ;2 no - MOV 2(W),X ;3 yes, invert literals MOV TOS,2(W) ;3 - MOV X,TOS ;1 JMP LITERAL1 ;2 +LITERALEND MOV @IP+,PC ;4 .ELSE +LITERAL CMP #0,&STATE ;3 JZ LITERALEND ;2 if interpreting state, do nothing LITERAL1 MOV &DDP,W ;3 ADD #4,&DDP ;3 - MOV #lit,0(W) ;4 + MOV #LIT,0(W) ;4 MOV TOS,2(W) ;3 MOV @PSP+,TOS ;2 - .ENDIF LITERALEND MOV @IP+,PC ;4 + .ENDIF FORTHWORD "COUNT" ; https://forth-standard.org/standard/core/COUNT @@ -1675,40 +1692,41 @@ COUNT SUB #2,PSP ;1 MOV.B -1(TOS),TOS ;3 MOV @IP+,PC ;4 15~ - FORTHWORD "TREAT" + FORTHWORD "INTERPRET" ; INTERPRET i*x addr u -- j*x interpret given buffer ; This is the common factor of EVALUATE and QUIT. ; set addr u as input buffer then parse it word by word INTERPRET mDOCOL ; - .word SETIB -INTLOOP .word FBLANK,WORDD ; -- c-addr Z = End Of Line + .word SETIB ; +INTLOOP .word FBLANK,WORDD ; -- c-addr Z = 1 --> End Of Line .word $+2 ; - JZ DROPEXIT ;2 Z=1, EOL reached + JZ DROPEXIT ;2 Z = 1 --> EOL reached MOV #INTFINDNEXT,IP ;2 define INTFINDNEXT as FIND return - JMP FIND ;2 Z=0, EOL not reached -INTFINDNEXT .word $+2 ; -- c-addr fl Z = not found + JMP FIND ;2 +INTFINDNEXT .word $+2 ; -- c-addr fl Z = 1 -->not found MOV TOS,W ; W = flag =(-1|0|+1) as (normal|not_found|immediate) MOV @PSP+,TOS ; -- c-addr MOV #INTQNUMNEXT,IP ;2 define QNUMBER return - JZ QNUMBER ;2 c-addr -- Z=1, not found, search a number + JZ QNUMBER ;2 Z = 1 --> not found, search a number MOV #INTLOOP,IP ;2 define (EXECUTE | COMMA) return XOR &STATE,W ;3 - JZ COMMA ;2 c-addr -- if W xor STATE = 0 compile xt then loop back to INTLOOP -EXECUTE PUSH TOS ; 3 - MOV @PSP+,TOS ; 2 fetch new TOS - MOV @RSP+,PC ; 4 xt --> PC + JZ COMMA ;2 if W xor STATE = 0 compile xt then loop back to INTLOOP +EXECUTE PUSH TOS ;3 + MOV @PSP+,TOS ;2 -- + MOV @RSP+,PC ;4 xt --> PC -INTQNUMNEXT .word $+2 ; -- n|c-addr fl Z = not a number, SR(UF9) double number request +INTQNUMNEXT .word $+2 ; -- n|c-addr fl Z = 1 --> not a number, SR(UF9) double number request MOV @PSP+,TOS ;2 MOV #INTLOOP,IP ;2 -- n|c-addr define LITERAL return - JNZ LITERAL ;2 n -- Z=0, is a number, execute LITERAL then loop back to INTLOOP + JNZ LITERAL ;2 n -- Z = 0 --> is a number, execute LITERAL then loop back to INTLOOP -NotFoundExe ADD.B #1,0(TOS) ;3 c-addr -- Z=1, Not a Number : incr string count to add '?' +NotFoundexe ADD.B #1,0(TOS) ;3 c-addr -- Z = 1 --> Not a Number : incr string count to add '?' MOV.B @TOS,Y ;2 Y=count+1 ADD TOS,Y ;1 Y=end of string addr MOV.B #'?',0(Y) ;5 add '?' to end of string - MOV #FQABORTYES,IP ;2 define the return of COUNT + MOV #FABORT_TERM,IP ;2 define the return of COUNT JMP COUNT ;2 -- addr len 35 words +NotFound .word NotFoundExe ; .IFDEF CORE_COMPLEMENT FORTHWORD "EVALUATE" @@ -1735,54 +1753,19 @@ EVALUATE MOV #SOURCE_LEN,X ;2 FBLANK CALL rDOCON .word 20h - .IFDEF DEFER_QUIT ; defined in ThingsInFirst.inc - -QUIT0 MOV #0,&SAVE_SYSRSTIV ; clear SAVE_SYSRSTIV, usefull for next ABORT... - MOV #RSTACK,RSP ; ANS mandatory for QUIT - MOV #LSTACK,&LEAVEPTR ; - MOV #0,&STATE ; ANS mandatory for QUIT - MOV @IP+,PC - - FORTHWORD "BOOT" -;c BOOT -- load BOOT.4th file from SD_Card then loop to QUIT1 - CMP #0,&SAVE_SYSRSTIV ; = 0 if WARM - JZ BODYQUIT ; no boostrap if no reset event, default QUIT instead - BIT.B #CD_SD,&SD_CDIN ; SD_memory in SD_Card module ? - JNZ BODYQUIT ; if not, no bootstrap, default QUIT instead - SUB #2,PSP ; - MOV TOS,0(PSP) ; - MOV &SAVE_SYSRSTIV,TOS ; -- SAVE_SYSRSTIV TOS = reset event, for tests in BOOT.4TH - ASMtoFORTH ; - .word NOECHO ; - .word QUIT0 ; - .word XSQUOTE ; -- addr u - .byte 15,"LOAD\34 BOOT.4TH\34" ; LOAD" BOOT.4TH" issues error 2 if no such file... - .word BRAN,QUIT4 ; to interpret this string - - FORTHWORD "QUIT" -; https://forth-standard.org/standard/core/QUIT -; QUIT -- interpret line by line the input stream, primary DEFERred word -; to enable bootstrap type: ' BOOT IS QUIT -; to disable bootstrap type: ' QUIT >BODY IS QUIT -QUIT MOV @PC+,PC ;3 Code Field Address (CFA) of QUIT -PFAQUIT .word BODYQUIT ; Parameter Field Address (PFA) of QUIT -BODYQUIT ASMtoFORTH ; BODY of QUIT = default execution of QUIT - .word QUIT0 ; - - .ELSE ; if no BOOTLOADER, QUIT is not DEFERred - - FORTHWORD "QUIT" +; FORTHWORD "ABORT" +; https://forth-standard.org/standard/core/ABORT +; Empty the data stack and perform the function of QUIT, +; which includes emptying the return stack, without displaying a message. +; ABORT is the common next of WARM and ABORT" +ABORT MOV #PSTACK,PSP ; + MOV #0,TOS ; to set first PSP cell = 0, used next by WARM ; https://forth-standard.org/standard/core/QUIT ; QUIT -- interpret line by line the input stream -QUIT -QUIT0 MOV #0,&SAVE_SYSRSTIV ; clear SAVE_SYSRSTIV, usefull for next ABORT... - MOV #RSTACK,RSP ; ANS mandatory for QUIT +QUIT MOV #RSTACK,RSP ; MOV #LSTACK,&LEAVEPTR ; - MOV #0,&STATE ; ANS mandatory for QUIT - ASMtoFORTH ; - - .ENDIF ; bootloader - + MOV #0,&STATE ; + ASMtoFORTH .IFDEF PROMPT QUIT1 .word XSQUOTE ; .byte 5,13,10,"ok " ; CR+LF + Forth prompt @@ -1790,18 +1773,17 @@ QUIT2 .word TYPE ; display it .ELSE QUIT2 .word CR .ENDIF - .word REFILL ; -- org len refill input buffer from ACCEPT (one line) -QUIT3 .word FBLANK,EMIT ; +QUIT3 .word REFILL ; -- org len refill input buffer from ACCEPT (one line) QUIT4 .word INTERPRET ; interpret this line|string .word DEPTH,ZEROLESS ; stack empty test .word XSQUOTE ; ABORT" stack empty! " .byte 12,"stack empty!" ; - .word QABORT ; + .word QABORT ; see QABORT in forthMSP430FR_TERM_xxx.asm .word lit,FRAM_FULL ; .word HERE,ULESS ; FRAM full test .word XSQUOTE ; ABORT" FRAM full! " .byte 10,"FRAM full!" ; - .word QABORT ; + .word QABORT ; see QABORT in forthMSP430FR_TERM_xxx.asm .IFDEF PROMPT .word LIT,STATE,FETCH ; STATE @ .word QFBRAN,QUIT1 ; 0= case of interpretion state @@ -1810,114 +1792,34 @@ QUIT4 .word INTERPRET ; interpret this line|string .ENDIF .word BRAN,QUIT2 - FORTHWORD "ABORT" -; https://forth-standard.org/standard/core/ABORT -; ABORT i*x -- R: j*x -- clear stack & QUIT -ABORT MOV #PSTACK,PSP - JMP QUIT - FORTHWORDIMM "ABORT\34" ; immediate ; https://forth-standard.org/standard/core/ABORTq ; ABORT" i*x flag -- i*x R: j*x -- j*x flag=0 ; i*x flag -- R: j*x -- flag<>0 -ABORTQUOTE mDOCOL ; ABORT address + 10 +; ABORT" " displays nothing +ABORTQUOTE mDOCOL .word SQUOTE - .word lit,QABORT,COMMA + .word lit,QABORT,COMMA ; see QABORT in forthMSP430FR_TERM_xxx.asm .word EXIT -; define run-time part of ABORT" -;Z ?ABORT f c-addr u -- abort & print msg, -; FORTHWORD "?ABORT" -QABORT CMP #0,2(PSP) ; -- f c-addr u flag test - JNZ QABORTYES ; -THREEDROP ADD #4,PSP ; - MOV @PSP+,TOS ; - MOV @IP+,PC ; -; ----------------------------------; QABORTYES = QABORT + 14 -QABORTYES CALL #QAB_DEFER ; init some variables, common part with WIPE, see WIPE -; ----------------------------------; - .IFDEF TERMINAL_I2C - MOV.B #2,Y ; send ctrl_char $02 to I2C_Master which will execute on its side QABORT_TERM - CALL #CTRLCHARTX - mDOCOL - .word PWR_STATE ; remove all words beyond PWR_HERE, including the definition leading to an error - .word lit,LINE,FETCH ; -- c-addr u line fetch line number before set ECHO ! - .word ECHO ; to see abort message - .word XSQUOTE - .byte 5,27,"[7m",'@' ; - .word TYPE ; cmd "reverse video" + displays "@" - .word LIT,I2CSLAVEADR - .word FETCH,DOT ; displays -; ----------------------------------; - .ELSE ; TERMINAL_UART -QABORT_TERM CALL #RXON ; resume downloading source file then wait the end of downloading. -QABORTLOOP BIC #RX_TERM,&TERM_IFG ; clear RX_TERM - MOV &FREQ_KHZ,Y ; 1000, 2000, 4000, 8000, 16000, 240000 -;QABUSBLOOPJ MOV #32,X ; 2~ <-------+ windows 10 seems very slow... ==> ((32*3)+5)*1000 = 101ms delay -;QABUSBLOOPI SUB #1,X ; 1~ <---+ | -; JNZ QABUSBLOOPI ; 2~ 3~ loop ---+ | to refill its USB buffer -; SUB #1,Y ; 1~ | -; JNZ QABUSBLOOPJ ; 2~ 101~ loop -----+ -QABUSBLOOPJ MOV #65,X ; 2~ <-------+ linux with minicom seems very very slow... -QABUSBLOOPI SUB #1,X ; 1~ <---+ | ==> ((65*3)+5)*1000 = 200ms delay - JNZ QABUSBLOOPI ; 2~ 3~ loop ---+ | to refill its USB buffer - SUB #1,Y ; 1~ | - JNZ QABUSBLOOPJ ; 2~ 200~ loop -----+ - BIT #RX_TERM,&TERM_IFG ; 4 new char in TERMRXBUF after QABUSBLOOPJ delay ? - JNZ QABORTLOOP ; 2 yes, the input stream is still active: loop back - mDOCOL ; - .word PWR_STATE ; remove all words beyond PWR_HERE, including the definition leading to an error - .word lit,LINE,FETCH ; -- c-addr u line fetch line number before set ECHO ! - .word ECHO ; to see abort message - .word XSQUOTE ; - .byte 4,27,"[7m" ; type ESC[7m (set reverse video) - .word TYPE ; -; ----------------------------------; - .ENDIF ; TERMINAL ; -- c-addr u line -; ----------------------------------; -; Display error "line:xxx" ; -; ----------------------------------; - .word QDUP,QFBRAN ; - .word QAB_DISPLAY ; do nothing if LINE = 0 - .word XSQUOTE ; -- c-addr u line c-addr1 u1 displays the line where error occured - .byte 5,"line:" ; - .word TYPE ; -- c-addr u line - .word UDOT ; -- c-addr u -; ----------------------------------; -; Display ABORT" message" ; <== WARM jumps here -; ----------------------------------; -QAB_DISPLAY .word TYPE ; -- type abort message - .word XSQUOTE ; -- c-addr u - .byte 4,27,"[0m" ; - .word TYPE ; -- set normal video -FABORT .word ABORT ; no return; FABORT = BRACTICK-8 - ;------------------------------------------------------------------------------- ; COMPILER ;------------------------------------------------------------------------------- - FORTHWORDIMM "[']" ; immediate word, i.e. word executed during compilation -; https://forth-standard.org/standard/core/BracketTick -; ['] -- find word & compile it as literal -BRACTICK mDOCOL - .word TICK ; get xt of - .word lit,lit,COMMA ; append LIT action - .word COMMA,EXIT ; append xt literal - FORTHWORD "'" ; https://forth-standard.org/standard/core/Tick ; ' -- xt find word in dictionary and leave on stack its execution address TICK mDOCOL .word FBLANK,WORDD,FIND - .word QFBRAN,NotFound + .word QFBRAN,NotFound ; see INTERPRET .word EXIT -NotFound .word NotFoundExe ; see INTERPRET - FORTHWORDIMM "\\" ; immediate -; https://forth-standard.org/standard/block/bs -; \ -- backslash -; everything up to the end of the current line is a comment. -BACKSLASH MOV &SOURCE_LEN,&TOIN ; - MOV @IP+,PC + FORTHWORDIMM "[']" ; immediate word, i.e. word executed during compilation +; https://forth-standard.org/standard/core/BracketTick +; ['] -- find word & compile it as literal +BRACTICK mDOCOL + .word TICK ; get xt of + .word lit,lit,COMMA ; append LIT action + .word COMMA,EXIT ; append xt literal FORTHWORDIMM "[" ; immediate ; https://forth-standard.org/standard/core/Bracket @@ -1933,11 +1835,18 @@ RIGHTBRACKET MOV #-1,&STATE MOV @IP+,PC - FORTHWORDIMM "POSTPONE" ; immediate + FORTHWORDIMM "\\" ; immediate +; https://forth-standard.org/standard/block/bs +; \ -- backslash +; everything up to the end of the current line is a comment. +BACKSLASH MOV &SOURCE_LEN,&TOIN ; + MOV @IP+,PC + + FORTHWORDIMM "POSTPONE" ; https://forth-standard.org/standard/core/POSTPONE POSTPONE mDOCOL .word FBLANK,WORDD,FIND,QDUP - .word QFBRAN,NotFound + .word QFBRAN,NotFound ; see INTERPRET .word ZEROLESS ; immediate word ? .word QFBRAN,POST1 ; if immediate .word lit,lit,COMMA ; else compile lit @@ -1945,18 +1854,11 @@ POSTPONE mDOCOL .word lit,COMMA ; CFA of COMMA POST1 .word COMMA,EXIT ; then compile: if immediate xt of word found else CFA of COMMA - FORTHWORD "IMMEDIATE" -; https://forth-standard.org/standard/core/IMMEDIATE -; IMMEDIATE -- make last definition immediate -IMMEDIATE MOV &LAST_NFA,W - BIS.B #80h,0(W) - MOV @IP+,PC - FORTHWORD ":" ; https://forth-standard.org/standard/core/Colon ; : -- begin a colon definition ; HEADER is CALLed by all compiling words -COLON PUSH #COLONNEXT ;3 define COLONNEXT as HEADER RET +COLON PUSH #COLONNEXT ;3 define COLONNEXT as HEADER return ;-----------------------------------; HEADER BIT #1,&DDP ;3 carry set if odd ADDC #2,&DDP ;4 (DP+2|DP+3) bytes, make room for LFA @@ -1989,16 +1891,16 @@ HEADEREND MOV Y,&LAST_NFA ; NFA --> LAST_NFA COLONNEXT ; Y is NFA ) .SWITCH DTC ; Direct Threaded Code select .CASE 1 ; - MOV #DOCOL1,-4(W) ; compile CALL rDOCOL ([rDOCOL] = XDOCOL) + MOV #1284h,-4(W) ; compile CALL R4 = rDOCOL ([rDOCOL] = XDOCOL) SUB #2,&DDP ; .CASE 2 ; - MOV #DOCOL1,-4(W) ; compile PUSH IP 3~ - MOV #DOCOL2,-2(W) ; compile CALL rDOCOL ([rDOCOL] = EXIT) + MOV #120Dh,-4(W) ; compile PUSH IP 3~ + MOV #1284h,-2(W) ; compile CALL R4 = rDOCOL ([rDOCOL] = EXIT) .CASE 3 ; - 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~ + MOV #120Dh,-4(W) ; compile PUSH IP 3~ + MOV #400Dh,-2(W) ; compile MOV PC,IP 1~ + MOV #522Dh,0(W) ; compile ADD #4,IP 1~ + MOV #4D30h,+2(W) ; compile MOV @IP+,PC 4~ ADD #4,&DDP ; .ENDCASE ; MOV #-1,&STATE ; enter compiling state @@ -2008,18 +1910,18 @@ COLONNEXT ; Y is NFA ) ;;Z ?REVEAL -- if no stack mismatch, link this new word in the CURRENT vocabulary QREVEAL CMP PSP,&LAST_PSP ; Check SP with its saved value by :, :NONAME, CODE... JNZ BAD_CSP ; if stack mismatch. -GOOD_CSP MOV &LAST_NFA,Y ; GOOD_CSP is the end of word MARKER +GOOD_CSP MOV &LAST_NFA,Y ; MOV &LAST_THREAD,X ; REVEAL MOV @X,-2(Y) ; [LAST_THREAD] --> LFA (for NONAME: [LAST_THREAD] --> unused PA reg) MOV Y,0(X) ; LAST_NFA --> [LAST_THREAD] (for NONAME: LAST_NFA --> unused PA reg) -NEXTADR MOV @IP+,PC + MOV @IP+,PC BAD_CSP mDOCOL .word XSQUOTE .byte 15,"stack mismatch!" -FQABORTYES .word QABORTYES +FABORT_TERM .word ABORT_TERM - FORTHWORDIMM ";" ; immediate + FORTHWORDIMM ";" ; https://forth-standard.org/standard/core/Semi ; ; -- end a colon definition SEMICOLON CMP #0,&STATE ; if interpret mode, semicolon becomes a comment identifier @@ -2028,41 +1930,48 @@ SEMICOLON CMP #0,&STATE ; if interpret mode, semicolon becomes a com .word lit,EXIT,COMMA .word QREVEAL,LEFTBRACKET,EXIT + FORTHWORD "IMMEDIATE" +; https://forth-standard.org/standard/core/IMMEDIATE +; IMMEDIATE -- make last definition immediate +IMMEDIATE MOV &LAST_NFA,Y ; Y = NFA|unused_PA_reg as lure for :NONAME + BIS.B #BIT7,0(Y) ; + MOV @IP+,PC + FORTHWORD "CREATE" ; https://forth-standard.org/standard/core/CREATE ; CREATE -- 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> CREATE CALL #HEADER ; -- W = DDP - MOV #DOCON,-4(W) ;4 -4(W) = CFA = DOCON + MOV #1286h,-4(W) ;4 -4(W) = CFA = CALL R6 = rDOCON MOV W,-2(W) ;3 -2(W) = PFA = W = next address - JMP REVEAL ; to link created VARIABLE in vocabulary + JMP REVEAL ; to link the definition in vocabulary .IFDEF CORE_COMPLEMENT FORTHWORD "DOES>" ; https://forth-standard.org/standard/core/DOES ; DOES> -- set action for the latest CREATEd definition DOES MOV &LAST_CFA,W ; W = CFA of CREATEd word - MOV #DODOES,0(W) ; replace CFA (DOCON) by new CFA (DODOES) + MOV #1285h,0(W) ; replace old CFA of CREATE by new CFA CALL R5 = rDODOES MOV IP,2(W) ; replace PFA by the address after DOES> as execution address MOV @RSP+,IP ; MOV @IP+,PC ; exit of the new created word + FORTHWORD "CONSTANT" +;https://forth-standard.org/standard/core/CONSTANT +;C CONSTANT n -- define a Forth CONSTANT +CONSTANT CALL #HEADER ; W = DDP = CFA + 2 words + MOV #1286h,-4(W) ; CFA = CALL R6 = rDOCON + MOV TOS,-2(W) ; PFA = n + MOV @PSP+,TOS ; -- + JMP REVEAL ; to link the definition in vocabulary + FORTHWORD "VARIABLE" ;https://forth-standard.org/standard/core/VARIABLE ;C VARIABLE -- define a Forth VARIABLE VARIABLE CALL #HEADER ; W = DDP = CFA + 2 words - MOV #DOVAR,-4(W) ; CFA = DOVAR, PFA is undefined - JMP REVEAL ; to link created VARIABLE in vocabulary - - FORTHWORD "CONSTANT" -;https://forth-standard.org/standard/core/CONSTANT -;C CONSTANT n -- define a Forth 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 ; to link created VARIABLE in vocabulary + MOV #1287h,-4(W) ; CFA = CALL R7 = rDOVAR, PFA is undefined + JMP REVEAL ; to link created VARIABLE in vocabulary .ENDIF ; CORE_COMPLEMENT @@ -2070,17 +1979,21 @@ CONSTANT CALL #HEADER ; W = DDP = CFA + 2 words FORTHWORD ":NONAME" ; https://forth-standard.org/standard/core/ColonNONAME ; :NONAME -- xt +; W is DP +; X is the LAST_THREAD lure value for REVEAL +; Y is the LAST_NFA lure value for REVEAL and IMMEDIATE +; ...because we don't want to modify the word set ! PUSH #COLONNEXT ; define COLONNEXT as HEADERLESS RET HEADERLESS SUB #2,PSP ; common part of :NONAME and CODENNM MOV TOS,0(PSP) ; - MOV &DDP,TOS ; -- HERE - BIT #1,TOS ; - ADDC #0,TOS ; -- xt aligned CFA of this NONAME or CODENNM word - MOV TOS,W ; W=CFA - MOV #210h,X ;2 MOV Y,0(X) will write to a unused PA register = first lure for semicolon REVEAL... + MOV &DDP,W ; + BIT #1,W ; + ADDC #0,W ; W = aligned CFA + MOV W,TOS ; -- xt aligned CFA of :NONAME | CODENNM + MOV #210h,X ; X = 210h = unused PA register address (lure for REVEAL) MOV X,Y ;1 - ADD #2,Y ;1 MOV @X,-2(Y) also will write to same register = 2th lure for semicolon REVEAL... - JMP HEADEREND ; ...because we don't want to write a preamble in dictionnary! + ADD #2,Y ;1 Y = 212h = unused PA register address (lure for REVEAL and IMMEDIATE) + JMP HEADEREND ; ; https://forth-standard.org/standard/core/DEFER ; Skip leading space delimiters. Parse name delimited by a space. @@ -2092,7 +2005,7 @@ HEADERLESS SUB #2,PSP ; common part of :NONAME and CODENNM FORTHWORD "DEFER" CALL #HEADER MOV #4030h,-4(W) ;4 first CELL = MOV @PC+,PC = BR... - MOV #NEXTADR,-2(W) ;3 second CELL = ...mNEXT : do nothing by default + MOV #NEXT_ADR,-2(W) ;3 second CELL = ...mNEXT : do nothing by default JMP REVEAL ; to link created word in vocabulary ; DEFER! ( xt CFA_DEFERed_WORD -- ) @@ -2102,19 +2015,20 @@ DEFERSTORE MOV @PSP+,2(TOS) ; -- CFA_DEFERed_WORD xt --> [CFA_D MOV @IP+,PC ; ; IS xt -- -; used as is : +; used like this: ; 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 examples of DEFERred words FORTHWORDIMM "IS" ; immediate -IS CMP #0,&STATE +IS PUSH IP + CMP #0,&STATE JZ IS_EXEC -IS_COMPILE mDOCOL +IS_COMPILE ASMtoFORTH .word BRACTICK ; find the word, compile its CFA as literal .word lit,DEFERSTORE,COMMA ; compile DEFERSTORE .word EXIT -IS_EXEC mDOCOL +IS_EXEC ASMtoFORTH .word TICK,DEFERSTORE ; find the word, leave its CFA on the stack and execute DEFERSTORE .word EXIT @@ -2160,22 +2074,22 @@ ENDCODE mDOCOL MOV &DDP,W .SWITCH DTC .CASE 1 - MOV #DOCOL1,0(W) ; compile CALL xDOCOL + MOV #1284h,0(W) ; compile CALL R4 = rDOCOL ([rDOCOL] = XDOCOL) ADD #2,&DDP .CASE 2 - MOV #DOCOL1,0(W) ; compile PUSH IP -COLON1 MOV #DOCOL2,2(W) ; compile CALL rEXIT + MOV #120Dh,0(W) ; compile PUSH IP +COLON1 MOV #1284h,2(W) ; compile CALL R4 = rDOCOL ADD #4,&DDP .CASE 3 ; inlined DOCOL - MOV #DOCOL1,0(W) ; compile PUSH IP -COLON1 MOV #DOCOL2,2(W) ; compile MOV PC,IP - MOV #DOCOL3,4(W) ; compile ADD #4,IP - MOV #NEXT,6(W) ; compile MOV @IP+,PC + MOV #120Dh,0(W) ; compile PUSH IP +COLON1 MOV #400Dh,2(W) ; compile MOV PC,IP + MOV #522Dh,4(W) ; compile ADD #4,IP + MOV #4D30h,6(W) ; compile MOV @IP+,PC ADD #8,&DDP ; .ENDCASE ; DTC COLON2 MOV #-1,&STATE ; enter in compile state - MOV #PREVIOUS,PC ; restore previous state of CONTEXT + MOV #PREVIOUS,PC ; restore previous state of CONTEXT (remove ASSEMBLER) asmword "LO2HI" ; same as COLON but without saving IP .SWITCH DTC @@ -2250,7 +2164,7 @@ THEN MOV &DDP,0(TOS) ; -- IFadr FORTHWORDIMM "BEGIN" ; immediate ; https://forth-standard.org/standard/core/BEGIN ; BEGIN -- BEGINadr initialize backward branch - MOV #HERE,PC + MOV #HERE,PC ; -- HERE FORTHWORDIMM "UNTIL" ; immediate ; https://forth-standard.org/standard/core/UNTIL @@ -2339,7 +2253,7 @@ PLUSLOOP MOV #xploop,X ; https://forth-standard.org/standard/core/DOES ; DOES> -- set action for the latest CREATEd definition DOES MOV &LAST_CFA,W ; W = CFA of CREATEd word - MOV #DODOES,0(W) ; replace CFA (DOCON) by new CFA (DODOES) + MOV #1285h,0(W) ; replace CFA (DOCON) by new CFA (DODOES) MOV IP,2(W) ; replace PFA by the address after DOES> as execution address MOV @RSP+,IP ; MOV @IP+,PC ; exit of the new created word @@ -2360,11 +2274,9 @@ VOCABULOOP .word lit,0,COMMA .word HERE ; link via LASTVOC the future created vocabulary .word LIT,LASTVOC,DUP .word FETCH,COMMA ; compile [LASTVOC] to HERE+ - .word STORE ; store (HERE - CELL) to LASTVOC + .word STORE ; store (HERE - 2) to LASTVOC .word DOES ; compile CFA and PFA for the future defined vocabulary - .ENDIF ; VOCABULARY_SET - VOCDOES .word LIT,CONTEXT,STORE .word EXIT @@ -2536,7 +2448,7 @@ MOVEUP SUB #1,X MOV.B @X,0(Y) ; if X=src < Y=dst copy W bytes beginning with the end SUB #1,W JNZ MOVEUP -MOVEND MOV @IP+,PC + MOV @IP+,PC .IFDEF VOCABULARY_SET FORTHWORD "PREVIOUS" @@ -2550,7 +2462,7 @@ MOVEDOWN MOV.B @X+,0(Y) ; if X=src > Y=dst copy W bytes ADD #1,Y SUB #1,W JNZ MOVEDOWN - MOV @IP+,PC +MOVEND MOV @IP+,PC .IFDEF VOCABULARY_SET FORTHWORD "ONLY" @@ -2566,9 +2478,6 @@ ONLY MOV #0,&CONTEXT+2 DEFINITIONS MOV &CONTEXT,&CURRENT MOV @IP+,PC -;------------------------------------------------------------------------------- -; MEMORY MANAGEMENT -;------------------------------------------------------------------------------- .IFDEF USE_MOVE FORTHWORD "MOVE" ; https://forth-standard.org/standard/core/MOVE @@ -2579,30 +2488,37 @@ MOVE MOV TOS,W ; W = cnt MOV @PSP+,X ; X = addr1 = src MOV @PSP+,TOS ; pop new TOS CMP #0,W ; count = 0 ? - JZ MOVEND ; already done ! see ALSO - CMP X,Y ; Y-X ; dst - src JZ MOVEND ; already done ! - JNC MOVEDOWN ; see PREVIOUS + CMP X,Y ; Y=dst = X=src ? + JZ MOVEND ; already done ! + JNC MOVEDOWN ; if Y=dst < X=src ; see PREVIOUS ADD W,Y ; move beginning with the end ADD W,X ; - JMP MOVEUP ; see ALSO + JMP MOVEUP ; if Y=dst > X=src ; see ALSO .ENDIF +;------------------------------------------------------------------------------- +; MEMORY MANAGEMENT +;------------------------------------------------------------------------------- STATE_DOES ; execution part of PWR_STATE ; sorry, doesn't restore search order pointers .word FORTH,ONLY,DEFINITIONS .word $+2 ; -- BODY IP is free + .IFDEF VOCABULARY_SET MOV @TOS+,W ; -- BODY+2 W = old VOCLINK = VLK - MOV W,&LASTVOC ; restore LASTVOC + .ELSE + MOV &WIPE_VOC,W ; W = VOCLINK = VLK + .ENDIF + MOV W,&LASTVOC ; restore (or init) LASTVOC in RAM MOV @TOS,TOS ; -- OLD_DP - MOV TOS,&DDP ; -- DP restore DP - ; then restore words link(s) with it value < old DP + MOV TOS,&DDP ; -- DP restore (or init) DP in RAM + ; then restore words link(s) with their value < old DP .SWITCH THREADS .CASE 1 ; mono thread vocabularies MARKALLVOC MOV W,Y ; -- DP W=VLK Y=VLK MRKWORDLOOP MOV -2(Y),Y ; -- DP W=VLK Y=NFA CMP Y,TOS ; -- DP CMP = TOS-Y : OLD_DP-NFA - JNC MRKWORDLOOP ; loop back if TOS, COLD, SYSRSTIV error; does RST_HERE word set -RST_STATE MOV &INIVOC,&MARKVOC ; INIT value above (FRAM value) - MOV &INIDP,&MARKDP ; INIT value above (FRAM value) +RST_STATE MOV &RST_DP,&MARKDP ; INIT value above (FRAM value) + .IFDEF VOCABULARY_SET + MOV &RST_VOC,&MARKVOC ; INIT value above (FRAM value) + .ENDIF JMP PWR_STATE - FORTHWORD "PWR_HERE" ; define word set bound for POWER_ON, ABORT. -PWR_HERE MOV &LASTVOC,&MARKVOC - MOV &DDP,&MARKDP + FORTHWORD "PWR_HERE" ; define word set bound for POWER_ON, ABORT_TERM. +PWR_HERE MOV &DDP,&MARKDP + .IFDEF VOCABULARY_SET + MOV &LASTVOC,&MARKVOC + .ENDIF MOV @IP+,PC FORTHWORD "RST_HERE" ; define word set bound for , COLD, SYSRSTIV error. -RST_HERE MOV &LASTVOC,&INIVOC - MOV &DDP,&INIDP +RST_HERE MOV &DDP,&RST_DP + .IFDEF VOCABULARY_SET + MOV &LASTVOC,&RST_VOC + .ENDIF JMP PWR_HERE ; and obviously the same for POWER_ON... - FORTHWORD "WIPE" ; restore the word set as defined by forthMSP430FR.txt program file -WIPE - MOV #lastvoclink,&INIVOC; reinit this 2 factory values - MOV #ROMDICT,&INIDP - PUSH #RST_STATE ; define the next of WIPE - MOV #BODYSLEEP,&PFASLEEP;4 restore default background task - MOV #BODYWARM,&PFAWARM ;4 restore default WARM - .IFDEF DEFER_QUIT ; - MOV #BODYQUIT,&PFAQUIT ;4 restore QUIT - .ENDIF +;------------------------------------------------------------------------------- +; RESET 6.2: SELECT PWR_STATE|RST_STATE|DEEP_RESET <== INI_FORTH +;------------------------------------------------------------------------------- +SEL_P_R_D CMP #0Eh,TOS ; + JZ PWR_STATE ; if RSTIV_MEM = 14 (SYSSVSH event) + CMP #4,TOS ; + JGE RST_STATE ; if RSTIV_MEM >= 4 (RESET,COLD,SYS_FAILURES) + CMP #0,TOS ; + JGE PWR_STATE ; if RSTIV_MEM >= 0 (POWER_ON,WARM,ABORT") +;-----------------------------------; +; DEEP RESET ; if RSTIV_MEM < 0 +;-----------------------------------; +; INIT SIGNATURES AREA ; +;-----------------------------------; + MOV #16,X ; max known SIGNATURES length = 12 bytes +SIGNATLOOP SUB #2,X ; + MOV #-1,SIGNATURES(X) ; reset signature; WARNING ! DON'T CHANGE IMMEDIATE VALUE ! + JNZ SIGNATLOOP ; +;-----------------------------------; X = 0 ;-) +; INIT VECTORS INT ; ;-----------------------------------; -; WIPE, QABORT, COLD common subrouti; <--- COLD, reset and PUC calls here + MOV #RESET,-2(X) ; write RESET at addr X-2 = FFFEh +INIVECLOOP SUB #2,X ; + MOV #COLD,-2(X) ; -2(X) = FFFCh first + CMP #0FFAEh,X ; init 41 vectors, FFFCh down to 0FFACh + JNZ INIVECLOOP ; all vectors are initialised to execute COLD routine ;-----------------------------------; -RST_INIT +; INIT all "CALL #xxx_APP" ; ;-----------------------------------; -; WIPE, QABORT common subroutine ; <--- ?ABORT calls here + MOV #WIPE_INI,X ; WIPE_INI constants are in FRAM INFO + MOV @X+,&PFACOLD ; COLD_TERM as default COLD_APP --> PFACOLD + MOV @X+,&PFA_INI_FORTH ; RET_ADR|INI_FORTH_SD as default INI_SOFT_APP --> PFA_INI_FORTH + MOV @X+,&PFASLEEP ; RXON as default BACKGND_APP --> PFASLEEP + MOV @X+,&PFAWARM ; INIT_TERM|INIT_SD as default INI_HARD_APP --> PFAWARM + MOV @X+,&TERM_VEC ; TERMINAL_INT as default vector --> TERM_VEC ;-----------------------------------; -QAB_DEFER - MOV #BODYEMIT,&PFAEMIT ;4 ' EMIT >BODY IS EMIT default console output - MOV #BODYCR,&PFACR ;4 ' CR >BODY IS CR default CR - MOV #BODYKEY,&PFAKEY ;4 ' KEY >BODY IS KEY default KEY - .IFDEF DEFER_ACCEPT ; true if SD_CARD_LOADER - MOV #BODYACCEPT,&PFAACCEPT ;4 ' ACCEPT >BODY IS ACCEPT - MOV #TIB_ORG,&CIB_ADR ;4 TIB_ORG TO CIB (Current Input Buffer) - .ENDIF - .IFDEF SD_CARD_LOADER ; close all handles - MOV &CurrentHdl,T ; - JMP QAB_QCLOSE ; -QAB_CLOSE MOV.B #0,HDLB_Token(T) ; - MOV @T,T ; -QAB_QCLOSE CMP #0,T ; - JNZ QAB_CLOSE ; - .ENDIF ; - .IFDEF TERMINAL_I2C - MOV #LPM4+GIE,&LPM_MODE ; I2C Slave START interrupt works down to LPM4 - .ELSE - MOV #LPM0+GIE,&LPM_MODE ; UART RX interrupt works down to LPM0 - .ENDIF - .SWITCH DTC - .CASE 1 - MOV #xdocol,rDOCOL - .CASE 2 - MOV #EXIT,rDOCOL - .ENDCASE - MOV #RFROM,rDOVAR - MOV #xdocon,rDOCON - MOV #xdodoes,rDODOES - MOV #32,&CAPS ; init CAPS ON - MOV #10,&BASE ; init decimal base - MOV @RSP+,PC ; RET +; INIT DP VOC_link ; ;-----------------------------------; - -; -------------------------------------------------------------------------------- -; forthMSP430FR : WARM -; -------------------------------------------------------------------------------- - FORTHWORD "WARM" -;Z WARM -- ; deferred word, enabling the initialisation of your application -WARM MOV @PC+,PC ;3 MOV #BODYWARM,PC -PFAWARM .word BODYWARM ; Parameter Field Address of WARM, may be redirected. -BODYWARM MOV @PC+,IP ; MOV #WARMTYPE,IP -ENDOFWARM .word WARMTYPE ; define next step of WARM, examples: WARMTYPE, ABORT, BOOT... -;================================================================================= -; WARM 1: activates I/O: inputs and outputs are active only here (hiZ before here) -;================================================================================= - BIC #LOCKLPM5,&PM5CTL0 ; activate all previous I/O settings (before I/O tests below). - ; Moved in WARM area to be redirected in your app START routine, - ; enabling you full control of the I/O RESET state. -;================================================================================= -; RESET 7: test DEEP RESET -;--------------------------------------------------------------------------------- -RST_EVENT MOV &SAVE_SYSRSTIV,TOS ; - NOP3 ; UNLOCK LPM5 can take a longer time (case of MSP430FR2433) - BIT.B #IO_WIPE,&WIPE_IN ; IO_WIPE is low ? - JNZ Q_DEEP_RST ; no - XOR #-1,TOS ; yes : force DEEP_RST (RESET + WIPE + restore vectors + signatures) - ADD #1,TOS ; to display SAVE_SYSRSTIV as negative value + MOV @X+,&RST_DP ; ROMDICT --> RST_DP + .IFDEF VOCABULARY_SET + MOV @X+,&RST_VOC ; lastvoclink --> RST_VOC + .ENDIF ;-----------------------------------; -Q_DEEP_RST CMP #0,TOS - JZ RST_SEL_END ; if WARM event - JGE RST_EVENT_END ; if TOS positive -;-----------------------------------; if TOS negative - MOV #16,X ; max known SIGNATURES length = 16 -SIGNLOO SUB #2,X ; - MOV #-1,SIGNATURES(X) ; reset signature; WARNING ! DON'T CHANGE THIS IMMEDIATE VALUE ! - JNZ SIGNLOO ; -;-----------------------------------; X = 0 - MOV #RESET,-2(X) ; write RESET vector FFFEh -INITVECLOOP SUB #2,X ; - MOV #RESET-4,-2(X) ; -2(X) = FFFCh first, [RESET-4] = BR COLD - CMP #-84,X ; init 42 vectors (down to 0FFAAh) - JNZ INITVECLOOP ; - MOV #TERMINAL_INT,&TERM_VEC ; + JMP RST_STATE ; then return to LIT|WARM from resp. QABORT|RESET ;-----------------------------------; -RST_EVENT_END -;--------------------------------------------------------------------------------- -; RESET 8: INIT SD_Card, after activating I/O: -;--------------------------------------------------------------------------------- - .IFDEF SD_CARD_LOADER ; - BIT.B #CD_SD,&SD_CDIN ; SD_memory in SD_Card module ? - JNZ RST_SEL ; no - .IF RAM_LEN < 2048 ; case of MSP430FR57xx : SD datas are in FRAM - MOV #SD_LEN,X ; not initialised by RESET. -ClearSDdata SUB #2,X ; 1 - MOV #0,SD_ORG(X) ; 3 - JNZ ClearSDdata ; 2 - .ENDIF - .include "forthMSP430FR_SD_INIT.asm"; no use of IP,TOS - .ENDIF ; SD_CARD_LOADER -;--------------------------------------------------------------------------------- -; RESET 9: RESET events handler: Select POWER_ON||DEEP_RST -;--------------------------------------------------------------------------------- -RST_SEL CMP #0,TOS ; SYSRSTIV is negative : DEEP_RST request... - JN WIPE ; ...adds WIPE to achieve DEEP_RST - CMP #2,TOS ; SYSRSTIV = BOR ? - JZ PWR_STATE ; yes execute PWR_STATE, return to [ENDOFWARM] - JC RST_STATE ; if SYSRSTIV > BOR execute RST_STATE, return to [ENDOFWARM] -RST_SEL_END MOV @IP+,PC ; if SYSRSTIV =0, return to [ENDOFWARM] - -;--------------------------------------------------------------------------------- -; WARM 2: type message on console output (if ECHO) -;--------------------------------------------------------------------------------- -WARMTYPE - .IFDEF TERMINAL_I2C - .word XSQUOTE - .byte 7,13,10,27,"[7m@" ; CR + cmd "reverse video" + @ - .word TYPE - .word LIT,I2CSLAVEADR,FETCH,DOT - .word LIT,'#',EMIT - .ELSE - .word XSQUOTE - .byte 7,13,10,27,"[7m#" ; CR + cmd "reverse video" + $ - .word TYPE - .ENDIF - .word DOT ; display signed SAVE_SYSRSTIV - .word XSQUOTE - .byte 25,"FastForth ©J.M.Thoorens " - .word TYPE - .word LIT,FRAM_FULL,HERE,MINUS,UDOT - .word XSQUOTE - .byte 10,"bytes free" - .word BRAN,QAB_DISPLAY - - FORTHWORD "COLD" -;Z COLD -- performs a software reset -; as pin RST is replaced by pin NMI, hard RESET falls down here via USER NMI vector -; COLD address = RESET address - 4 - MOV @PC+,PC - .word COLD ; see forthMSP430FR_TERM_xxxx.asm - -RESET ; hard RESET falls down here once, only after reprogramming device -;--------------------------------------------------------------------------------- -; RESET 1: INIT NMI, stops WDT_RESET -;--------------------------------------------------------------------------------- - BIS #3,&SFRRPCR ; pin RST becomes falling edge pin NMI, with SYSRSTIV = 4 - BIS #10h,&SFRIE1 ; enable NMI interrupt, --> USERNMI, that executes COLD - MOV #5A80h,&WDTCTL ; stop RESET on WDT -;--------------------------------------------------------------------------------- -; RESET 2: Initialisation limited to FastForth usage : I/O, RAM, RTC, CS, SYS -; all unused I/O are set as input with pullup resistor -;--------------------------------------------------------------------------------- - .include "TargetInit.asm" ; include target specific FastForth init code -;--------------------------------------------------------------------------------- -; RESET 3: INIT TERMINAL + optionnal SD_CARD -;--------------------------------------------------------------------------------- - .IFDEF TERMINAL_I2C - BIS #07C0h,&TERM_CTLW0 ; set I2C_Slave in RX mode to receive I2C_address - MOV &I2CSLAVEADR,Y ; init value found in FRAM INFO - RRA Y ; I2C Slave address minus R/W bit - BIS #400h,Y ; enable I2COA0 Slave address - MOV Y,&TERM_I2COA0 ; - .ELSE ; TERMINAL UART - MOV #0081h,&TERM_CTLW0 ; UC SWRST + UCLK = SMCLK - MOV &TERMBRW_RST,&TERM_BRW ; RST value in FRAM - MOV &TERMMCTLW_RST,&TERM_MCTLW ; RST value in FRAM - .ENDIF ; TERMINAL select - BIS.B #BUS_TERM,&TERM_SEL ; Configure pins TERM_UART|TERM_I2C - BIC #1,&TERM_CTLW0 ; release UC_TERM from reset... - BIS #WAKE_UP,&TERM_IE ; then enable interrupt for wake up on terminal input - - .IFDEF SD_CARD_LOADER ; - MOV #0A981h,&SD_CTLW0 ; UCxxCTL1 = CKPH, MSB, MST, SPI_3, SMCLK + UCSWRST - MOV #FREQUENCY*3,&SD_BRW ; UCxxBRW init SPI CLK = 333 kHz ( < 400 kHz) for SD_Card init - BIS.B #CS_SD,&SD_CSDIR ; SD_CS as output high - BIS #BUS_SD,&SD_SEL ; Configure pins as SIMO, SOMI & SCK (PxDIR.y are controlled by eUSCI module) - BIC #1,&SD_CTLW0 ; release eUSCI from reset - .ENDIF -;--------------------------------------------------------------------------------- -; RESET 4: init RAM -;--------------------------------------------------------------------------------- + +;=============================================================================== +; ┌┐ ┌─┐┬─┐ ┌─┐┌─┐┬─┐ ┌─┐┬ ┬┌─┐ ┌─┐┌─┐┬┬ ┬ ┬┬─┐┌─┐┌─┐ ┌─┐┌─┐┬ ┬ ┬ ┬┌─┐┬─┐┌─┐ +; ├┴┐│ │├┬┘ ├─┘│ │├┬┘ ├─┘│ ││ ├┤ ├─┤││ │ │├┬┘├┤ └─┐ ├┤ ├─┤│ │ ├─┤├┤ ├┬┘├┤ +; └─┘└─┘┴└─ ┴ └─┘┴└─ ┴ └─┘└─┘ └ ┴ ┴┴┴─┘└─┘┴└─└─┘└─┘ └ ┴ ┴┴─┘┴─┘ ┴ ┴└─┘┴└─└─┘ +;=============================================================================== +RESET +;=============================================================================== +; RESET 1: replace pin RESET by pin NMI, stops WDT_RESET +;------------------------------------------------------------------------------- + BIS #3,&SFRRPCR ; pin RST becomes pin NMI with falling edge, so SYSRSTIV = 4 + BIS #10h,&SFRIE1 ; enable NMI interrupt ==> hardware RESET is redirected to COLD. + MOV #5A80h,&WDTCTL ; disable WDT RESET +;------------------------------------------------------------------------------- +; RESET 2: INIT STACKS +;------------------------------------------------------------------------------- + MOV #RSTACK,RSP ; init return stack + MOV #PSTACK,PSP ; init parameter stack +;------------------------------------------------------------------------------- +; RESET 3: init RAM to 0 +;------------------------------------------------------------------------------- MOV #RAM_LEN,X -INITRAMLOOP SUB #2,X - MOV #0,RAM_ORG(X) - JNZ INITRAMLOOP ; 6~ loop -;--------------------------------------------------------------------------------- -; RESET 5: INIT STACKS -;--------------------------------------------------------------------------------- - MOV #RSTACK,RSP ; init return stack - MOV #PSTACK,PSP ; init parameter stack -;--------------------------------------------------------------------------------- -; RESET 6: INIT FORTH machine -;--------------------------------------------------------------------------------- - PUSH #WARM ; WARM = return of RST_INIT - JMP RST_INIT -;--------------------------------------------------------------------------------- +INITRAMLOOP SUB #2,X ; 1 + MOV #0,RAM_ORG(X) ; 3 + JNZ INITRAMLOOP ; 2 6 cycles loop ! +;------------------------------------------------------------------------------- +; RESET 4: I/O, RAM, RTC, CS, SYS initialisation limited to FastForth usage. +; All unused I/O are set as input with pullup resistor. +;------------------------------------------------------------------------------- + .include "TargetInit.asm" ; include target specific init code +;------------------------------------------------------------------------------- +; RESET 5: GET SYSRSTIV +;------------------------------------------------------------------------------- + MOV &RSTIV_MEM,TOS ; get RSTIV_MEM = Soft_SYSRSTIV + MOV #0,&RSTIV_MEM ; clear RSTIV_MEM + BIS &SYSRSTIV,TOS ; hard_SYSRSTIV|soft_SYSRSTIV --> TOS; SYSRSTIV = 0 +;------------------------------------------------------------------------------- +; RESET 6: START FORTH engine +;------------------------------------------------------------------------------- + CALL #INI_FORTH ; common ?ABORT|RESET "hybrid" subroutine with return to FORTH interpreter + .word WARM ; goto WARM, without return. See forthMSP430FR_TERM_xxx.asm +;-----------------------------------; .IFDEF MSP430ASSEMBLER -;------------------------------------------------------------------------------- +;=============================================================================== ; ASSEMBLER OPTION -;------------------------------------------------------------------------------- +;=============================================================================== .IFDEF EXTENDED_ASM .include "forthMSP430FR_EXTD_ASM.asm" .ELSE @@ -2875,9 +2685,10 @@ INITRAMLOOP SUB #2,X .ENDIF .IFDEF SD_CARD_LOADER ;------------------------------------------------------------------------------- -; SD CARD FAT OPTIONS +; SD CARD OPTIONS ;------------------------------------------------------------------------------- .include "forthMSP430FR_SD_LowLvl.asm" ; SD primitives + .include "forthMSP430FR_SD_INIT.asm" ; return to INIT_TERM; without use of IP,TOS .include "forthMSP430FR_SD_LOAD.asm" ; SD LOAD driver .IFDEF SD_CARD_READ_WRITE .include "forthMSP430FR_SD_RW.asm" ; SD Read/Write driver diff --git a/forthMSP430FR_ASM.asm b/forthMSP430FR_ASM.asm index 29ba972..aa1cec1 100644 --- a/forthMSP430FR_ASM.asm +++ b/forthMSP430FR_ASM.asm @@ -1,22 +1,4 @@ ; -*- 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) <2017> -; -; 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 . - ; ---------------------------------------------------------------------- ;forthMSP430FR_asm.asm @@ -65,34 +47,55 @@ SKIPEND MOV TOS,W ; ; ---------------------------------------------------------------------- ; DTCforthMSP430FR5xxx ASSEMBLER : search argument "xxxx", IP is free ; ---------------------------------------------------------------------- - SearchARG ; separator -- n|d or abort" not found" ; Search ARG of "#xxxx," ; <== PARAM10 ; Search ARG of "&xxxx," ; <== PARAM111 -; Search ARG of "xxxx(REG)," ; <== PARAM130 +; Search ARG of "xxxx(REG)," ; <== ComputeARGpREG <== PARAM130 ; Search ARG of ",&xxxx" ; <== PARAM111 <== PARAM20 -; Search ARG of ",xxxx(REG)" ; <== PARAM210 - PUSHM #2,S ; PUSHM S,T as OPCODE, OPCODEADR - ASMtoFORTH ; -- separator search word first - .word WORDD,FIND ; -- addr - .word QTBRAN,ARGWORD ; -- addr if Word found +; Search ARG of ",xxxx(REG)" ; <== ComputeARGpREG <== PARAM210 + PUSHM #2,S ; PUSHM S,T as OPCODE,OPCODEADR + PUSH TOS ; push sep, for SrchARGPO + PUSH &TOIN ; push TOIN, for SrchARGPO +;-----------------------------------; + ASMtoFORTH ; -- sep sep = ','|'('|' ' + .word WORDD,FIND ; -- addr search word first + .word ZEROEQUAL + .word QFBRAN,ARGWORD ; -- addr if Word found .word QNUMBER ; - .word QFBRAN,NotFound ; -- addr ABORT if not found - .word SearchEnd ; -- value goto SearchEnd if number found + .word QFBRAN,SrchARGPO; -- addr search ARG Plus Offset if not found + .word SrchNext ; -- value goto SrchNext if number found ARGWORD .word $+2 ; -- CFA - MOV @TOS+,S ; -- PFA S=DOxxx -QDOVAR SUB #DOVAR,S ; DOVAR = 1287h -ISDOVAR JZ SearchEnd ; -- adr -QDOCON ADD #1,S ; DOCON = 1286h -ISNOTDOCON JNZ QDODOES ; -ISDOCON MOV @TOS,TOS ; -- cte - JMP SearchEnd ; -QDODOES ADD #2,TOS ; - ADD #1,S ; DODOES = 1285h -ISDODOES JZ SearchEnd ; -- BODY leave BODY address for DOES words -ISOTHER SUB #4,TOS ; -- CFA leave execute adr -SearchEnd POPM #2,S ; POPM T,S - MOV @RSP+,PC ; RET + MOV @TOS+,S ; -- PFA S=DOxxx +QDOVAR SUB #1287h,S ; DOxxx = 1287h = CALL R7 = rDOVAR +ISDOVAR JZ SrchNext ; -- addr PFA = adr of VARIABLE +QDOCON ADD #1,S ; DOxxx = 1286h = DOCON + JNZ ISOTHER ; +ISDOCON MOV @TOS,TOS ; + JMP SrchNext ; -- cte +ISOTHER SUB #2,TOS ; -- CFA +SrchNext ADD #4,RSP ; remove TOIN,sep +SearchEnd POPM #2,S ; POPM T,S + MOV @RSP+,PC ; RET + +;-----------------------------------; +; search for ARGUMENT16+OFFSET ; up to $FFFF only (FORTH area) +;-----------------------------------; +SrchARGPO .word $+2 + MOV @RSP+,&TOIN ; TOIN back + MOV @RSP+,TOS ; -- sep + ASMtoFORTH ; + .word LIT,'+' ; -- sep '+' search argument + .word WORDD,FIND ; -- sep CFA + .word ZEROEQUAL ; + .word QFBRAN,SrchOffst; + .word QNUMBER ; -- sep number + .word QFBRAN,NotFound ; see INTERPRET +SrchOffst .word SWAP ; -- CFA|number sep + .word WORDD,QNUMBER ; Search 'Offset,'|'Offset('|'Offset' + .word QFBRAN,NotFound ; see INTERPRET + .word $+2 ; -- CFA|number offset + ADD @PSP+,TOS ; -- (CFA|number + offset) + JMP SearchEnd ; ; ---------------------------------------------------------------------- ; DTCforthMSP430FR5xxx ASSEMBLER : search REG @@ -108,6 +111,10 @@ ComputeARGpREG ; sep -- Rn MOV TOS,0(X) ; -- xxxx compile xxxx MOV #')',TOS ; -- ")" prepare separator to search REG of "xxxx(REG)" + CMP &SOURCE_LEN,&TOIN ; bad case of ,xxxx (without prefix &) + JNZ SearchREG ; + MOV #BAD_CSP,PC ; génère une erreur bidon + ; search REG of "xxxx(REG)," separator = ')' ; search REG of ",xxxx(REG)" separator = ')' ; search REG of "@REG," separator = ',' <== PARAM120 @@ -116,10 +123,7 @@ ComputeARGpREG ; sep -- Rn ; search REG of ",REG" separator = BL <== PARAM21 SearchREG PUSHM #2,S ; PUSHM S,T as OPCODE, OPCODEADR - CMP &SOURCE_LEN,&TOIN ; bad case of ,xxxx without prefix & - JNZ SearchREG1 ; - MOV #BAD_CSP,PC ; génère une erreur bidon -SearchREG1 PUSH &TOIN ; -- sep save >IN + PUSH &TOIN ; -- sep save >IN ADD #1,&TOIN ; skip "R" ASMtoFORTH ; search xx of Rxx .word WORDD,QNUMBER ; @@ -127,8 +131,8 @@ SearchREG1 PUSH &TOIN ; -- sep save >IN .word $+2 ; -- Rn number is found ADD #2,RSP ; remove >IN CMP #16,TOS ; -- Rn - JC BOUNDERROR ; abort if Rn out of bounds JNC SearchEnd ; -- Rn + JC BOUNDERROR ; abort if Rn out of bounds NOTaREG .word $+2 ; -- addr Z=1 MOV @RSP+,&TOIN ; -- addr restore >IN @@ -262,7 +266,7 @@ PARAM210 ADD #0080h,S ; set AD=1 JMP PARAM124 ; -- 000R REG of "(REG) found ; ---------------------------------------------------------------------- -; DTCforthMSP430FR5xxx ASSEMBLER: OPCODES TYPE 0 : zero operand f:-) +; DTCforthMSP430FR5xxx ASSEMBLER: OPCODES TYPE 0 : zero operand :-) ; ---------------------------------------------------------------------- asmword "RETI" mDOCOL @@ -271,25 +275,24 @@ PARAM210 ADD #0080h,S ; set AD=1 ; ---------------------------------------------------------------------- ; DTCforthMSP430FR5xxx ASSEMBLER: OPCODES TYPE I : double operand ; ---------------------------------------------------------------------- -; OPCODE(FEDC) -; OPCODE(code) for TYPE I = 0bxxxx opcode I -; OPCODE(BA98) -; = 0bxxxx src register -; OPCODE(7) AD (dst addr type) -; = 0b0 register -; = 0b1 x(Rn),&adr -; OPCODE(6) size -; OPCODE(B) for TYPE I or TYPE II = 0b0 word -; = 0b1 byte -; OPCODE(54) AS (src addr type) -; OPCODE(AS) for TYPE I or OPCODE(AD) for TYPE II = 0b00 register -; = 0b01 x(Rn),&adr -; = 0b10 @Rn -; = 0b11 @Rn+ -; OPCODE(3210) -; OPCODE(dst) for TYPE I or TYPE II = 0bxxxx dst register +; OPCODE(FEDC) +; OPCODE(code) = 0bxxxx opcode +; OPCODE(BA98) +; = 0bxxxx src_register, +; OPCODE(7) AD (dst addr type) +; = 0b0 ,register +; = 0b1 ,x(Rn),&adr +; OPCODE(6) size +; OPCODE(B) = 0b0 word +; = 0b1 byte +; OPCODE(54) AS (src addr type) +; OPCODE(AS) = 0b00 register, +; = 0b01 x(Rn),&adr, +; = 0b10 @Rn, +; = 0b11 @Rn+, +; OPCODE(3210) +; OPCODE(dst) = 0bxxxx ,dst_register ; ---------------------------------------------------------------------- - TYPE1DOES .word lit,',',PARAM1 ; -- BODYDOES .word PARAM2 ; -- BODYDOES char separator (BL) included in PARAM2 .word $+2 ; @@ -374,20 +377,19 @@ MAKEOPCODE MOV T,X ; -- opcode X= OPCODEADR to comp ; ---------------------------------------------------------------------- ; DTCforthMSP430FR5xxx ASSEMBLER, OPCODES TYPE II : single operand ; ---------------------------------------------------------------------- -; OPCODE(FEDCBA987) opcodeII -; OPCODE(code) for TYPE II = 0bxxxxxxxxx -; OPCODE(6) size -; OPCODE(B) for TYPE I or TYPE II = 0b0 word -; = 0b1 byte -; OPCODE(54) (dst addr type) -; OPCODE(AS) for TYPE I or OPCODE(AD) for TYPE II = 0b00 register -; = 0b01 x(Rn),&adr -; = 0b10 @Rn -; = 0b11 @Rn+ -; OPCODE(3210) -; OPCODE(dst) for TYPE I or TYPE II = 0bxxxx dst register +; OPCODE(FEDCBA987) +; OPCODE(code) = 0bxxxxxxxxx +; OPCODE(6) size +; OPCODE(B) = 0b0 word +; = 0b1 byte +; OPCODE(54) (dst addr type) +; OPCODE(AS) = 0b00 register +; = 0b01 x(Rn),&adr +; = 0b10 @Rn +; = 0b11 @Rn+ +; OPCODE(3210) +; OPCODE(dst) = 0bxxxx dst register ; ---------------------------------------------------------------------- - TYPE2DOES .word FBLANK,PARAM1 ; -- BODYDOES .word $+2 ; MOV S,W ; @@ -431,12 +433,12 @@ BOUNDERROR ; <== REG number error mDOCOL ; -- n n = value out of bounds .word DOT,XSQUOTE .byte 13,"out of bounds" - .word QABORTYES + .word ABORT_TERM ; ---------------------------------------------------------------------- ; DTCforthMSP430FR5xxx ASSEMBLER, CONDITIONAL BRANCHS ; ---------------------------------------------------------------------- -; ASSEMBLER FORTH OPCODE(FEDC) +; ASSEMBLER FORTH OPCODE(FEDC) ; OPCODE(code) for TYPE JNE,JNZ 0<>, <> = 0x20xx + (offset AND 3FF) ; branch if Z = 0 ; OPCODE(code) for TYPE JEQ,JZ 0=, = = 0x24xx + (offset AND 3FF) ; branch if Z = 1 ; OPCODE(code) for TYPE JNC,JLO U< = 0x28xx + (offset AND 3FF) ; branch if C = 0 @@ -689,7 +691,7 @@ TYPE3DOES .word FBLANK,SKIP ; skip spaces if any MOV #',',TOS ; -- BODYDOES "," ASMtoFORTH .word WORDD,QNUMBER - .word QFBRAN,NotFound ; ABORT + .word QFBRAN,NotFound ; see INTERPRET .word PARAM3 ; -- BODYDOES 0x000N S=OPCODE = 0x000R .word $+2 MOV TOS,W ; -- BODYDOES n W = n @@ -734,7 +736,6 @@ RxxMINSTRU CMP #4,W ; .word TYPE3DOES,1700h .IFDEF EXTENDED_MEM - asmword "RRCM.A" CALL rDODOES .word TYPE3DOES,0040h @@ -762,7 +763,6 @@ RxxMINSTRU CMP #4,W ; ; -------------------------------------------------------------------------------- ; may be usefull to access ROM libraries beyond $FFFF ; -------------------------------------------------------------------------------- - asmword "CALLA" mDOCOL .word FBLANK,SKIP ; -- addr @@ -844,7 +844,8 @@ ACMS102 RLAM #4,TOS ; 8< -; -; 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 . - -; ------------------------------------------------------------------------------ -; forthMSP430FR : CONDITIONNAL COMPILATION -; ------------------------------------------------------------------------------ - FORTHWORDIMM "[THEN]" ; do nothing ; https://forth-standard.org/standard/tools/BracketTHEN ; [THEN] MOV @IP+,PC - .save - .listing off ; ; https://forth-standard.org/standard/string/COMPARE ; ; COMPARE ( c-addr1 u1 c-addr2 u2 -- n ) @@ -44,7 +22,7 @@ ; MOV @PSP+,Y ;2 Y = addr2 ; MOV @PSP+,T ;2 T = u1 ; MOV @PSP+,X ;2 X = addr1 -; COMPAR1 MOV T,TOS ;1 +; COMPLOOP MOV T,TOS ;1 ; ADD S,TOS ;1 TOS = u1+u2 ; JZ COMPEQUAL ;2 u1=u2=0, Z=1, end of all successfull comparisons ; SUB #1,T ;1 @@ -53,7 +31,7 @@ ; JN COMPGREATER ;2 u1>u2 if u2 < 0 ; ADD #1,X ;1 ; CMP.B @Y+,-1(X) ;4 char1-char2 -; JZ COMPAR1 ;2 char1=char2 17~ loop +; JZ COMPLOOP ;2 char1=char2 17~ loop ; JC COMPGREATER ;2 char1>char2 ; COMPLESS ; char1 refill buffer then loop back +; .word FBLANK,WORDD,COUNT ; -- cnt addr u +; .word DUP,QFBRAN,BRACKETELSE5 ; u = 0 if end of line --> refill buffer then loop back ; .word TWODUP ; ; .word XSQUOTE ; ; .byte 6,"[THEN]" ; -; .word COMPARE ; -; .word QTBRAN,BRACKETELSE2 ; if bad comparaison, jump for next comparaison -; .word TWODROP,ONEMINUS ; 2DROP, decrement count -; .word QDUP,QTBRAN,BRACKETELSE1; loop back if count <> 0 -; .word EXIT ; else exit +; .word COMPARE,ZEROEQUAL ; +; .word QFBRAN,BRACKETELSE2 ; -- cnt addr u if bad comparaison, jump for next comparaison +; .word TWODROP,ONEMINUS ; -- cnt-1 2DROP, decrement count +; .word QDUP,ZEROEQUAL ; +; .word QFBRAN,BRACKETELSE1 ; -- cnt-1 loop back if count <> 0 +; .word EXIT ; -- else exit ; BRACKETELSE2 ; -; .word TWODUP ; +; .word TWODUP ; -- cnt addr u addr u ; .word XSQUOTE ; ; .byte 6,"[ELSE]" ; -; .word COMPARE ; -; .word QTBRAN,BRACKETELSE3 ; if bad comparaison, jump for next comparaison -; .word TWODROP,ONEMINUS ; 2DROP, decrement count -; .word QDUP,QTBRAN,BRACKETELSE0; if count <> 0 restore old count with loop back increment -; .word EXIT ; else exit +; .word COMPARE,ZEROEQUAL ; -- cnt addr u ff +; .word QFBRAN,BRACKETELSE3 ; -- cnt addr u if bad comparaison, jump for next comparaison +; .word TWODROP,ONEMINUS ; -- cnt-1 2DROP, decrement count +; .word QDUP,ZEROEQUAL ; +; .word QFBRAN,BRACKETELSE0 ; -- cnt-1 if count <> 0 restore old count with loop back increment +; .word EXIT ; -- else exit ; BRACKETELSE3 ; ; .word XSQUOTE ; ; .byte 4,"[IF]" ; -; .word COMPARE ; -; .word QTBRAN,BRACKETELSE1 ; if bad comparaison, loop back -; .word BRAN,BRACKETELSE0 ; else increment loop back +; .word COMPARE,ZEROEQUAL ; +; .word QFBRAN,BRACKETELSE1 ; -- cnt if bad comparaison, loop back +; .word BRAN,BRACKETELSE0 ; -- cnt else increment loop back ; BRACKETELSE5 ; -; .word TWODROP ; +; .word TWODROP ; -- cnt ; ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^; ; ; OPTION ; plus 5 words option ; ;vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv; ; .word XSQUOTE ; ; .byte 5,13,10,"ko " ; -; .word TYPE ; CR+LF ." ko " to show false branch of conditionnal compilation +; .word TYPE ; CR+LF ." ko" to show false branch of conditionnal compilation ; ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^; -; .word REFILL ; REFILL Input Buffer with next line -; .word SETIB ; SET Input Buffer pointers SOURCE_LEN, SOURCE_ORG and clear >IN -; .word BRAN,BRACKETELSE1 ; then loop back 54 words without options +; .word REFILL ; REFILL Input Buffer with next line +; .word SETIB ; SET Input Buffer pointers SOURCE_LEN, SOURCE_ORG and clear >IN +; .word BRAN,BRACKETELSE1 ; -- cnt then loop back 54 words without options - .restore -BADCOMPBR ; branch if string compare is false; [COMPARE,QTBRAN] replacement - MOV TOS,S ;1 S = u2 - MOV @PSP+,Y ;2 Y = addr2 - MOV @PSP+,T ;2 T = u1 - MOV @PSP+,X ;2 X = addr1 -COMPAR1 MOV T,TOS ;1 - ADD S,TOS ;1 TOS = u1+u2 - JZ COMPEQU ;2 u1=u2=0, Z=1, end of all successfull comparisons - SUB #1,T ;1 - JN COMPDIF ;2 u1u2 if u2 < 0 - ADD #1,X ;1 - CMP.B @Y+,-1(X) ;4 char1-char2 - JZ COMPAR1 ;2 char1=char2 17~ loop -COMPDIF MOV @IP,IP ; take branch -CMPEND MOV @PSP+,TOS +; BRanch if string BAD COMParaison, [COMPARE,ZEROEQUAL,QFBRAN] replacement +BRBADCOMP ; -- cnt addr1 u1 addr1 u1 addr2 u2 + MOV TOS,S ;1 S = u2 + MOV @PSP+,Y ;2 Y = addr2 + MOV @PSP+,T ;2 T = u1 + MOV @PSP+,X ;2 X = addr1 +COMPLOOP MOV T,TOS ;1 -- cnt addr1 u1 u1 + ADD S,TOS ;1 -- cnt addr1 u1 u1+u2 + JZ COMPEQU ;2 u1=u2=0, Z=1, end of all successfull comparisons + SUB #1,T ;1 + JN COMPDIF ;2 u1u2 if u2 < 0 + ADD #1,X ;1 + CMP.B @Y+,-1(X) ;4 char1-char2 + JZ COMPLOOP ;2 char1=char2 17~ loop +COMPDIF MOV @IP,IP ;1 take branch +CMPEND MOV @PSP+,TOS ; MOV @IP+,PC ;4 -TOQTB ; [TWODROP,ONEMINUS,?DUP,QTBRAN] replacement - ADD #2,PSP ;1 -- savedTOS TOS - SUB #1,0(PSP) ;3 -- savedTOS-1 TOS - JNZ COMPDIF ;2 -- cnt take branch - ADD #2,PSP ;1 -- +; BRanch if string GOOD COMParaison, [TWODROP,ONEMINUS,?DUP,ZEROEQUAL,QFBRAN] replacement +BRGOODCMP ; -- cnt addr u + ADD #2,PSP ;1 -- cnt u + SUB #1,0(PSP) ;3 -- cnt-1 u + JNZ COMPDIF ;2 -- cnt-1 u take branch + ADD #2,PSP ;1 -- u COMPEQU ADD #2,IP ; skip branch JMP CMPEND ; 25 words @@ -168,31 +149,31 @@ BRACKETELSE1 ; .word TWODUP ; .word XSQUOTE ; .byte 6,"[THEN]" ; - .word BADCOMPBR,BRACKETELSE2 ; if bad string comparaison, jump for next comparaison - .word TOQTB,BRACKETELSE1 ; 2DROP, count-1, loop back if count <> 0, else DROP + .word BRBADCOMP,BRACKETELSE2 ; if bad string comparaison, jump for next comparaison + .word BRGOODCMP,BRACKETELSE1 ; 2DROP, count-1, loop back if count <> 0, else DROP .word EXIT ; then exit BRACKETELSE2 ; .word TWODUP ; .word XSQUOTE ; .byte 6,"[ELSE]" ; - .word BADCOMPBR,BRACKETELSE3 ; if bad string comparaison, jump for next comparaison - .word TOQTB,BRACKETELSE0 ; 2DROP, count-1, loop back with count+1 if count <> 0, else DROP + .word BRBADCOMP,BRACKETELSE3 ; if bad string comparaison, jump for next comparaison + .word BRGOODCMP,BRACKETELSE0 ; 2DROP, count-1, loop back with count+1 if count <> 0, else DROP .word EXIT ; then exit BRACKETELSE3 ; .word XSQUOTE ; .byte 4,"[IF]" ; - .word BADCOMPBR,BRACKETELSE1 ; if bad string comparaison, loop back + .word BRBADCOMP,BRACKETELSE1 ; if bad string comparaison, loop back .word BRAN,BRACKETELSE0 ; else loop back with count+1 BRACKETELSE5 ; .word TWODROP ; ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^; -; OPTION ; plus 5 words option +; OPTION ; +5 words option ;vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv; .word XSQUOTE ; .byte 5,13,10,"ko " ; .word TYPE ; CR+LF ." ko " to show false branch of conditionnal compilation ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^; - .word REFILL ; REFILL Input Buffer with next line +BRKTELSEND .word REFILL ; REFILL Input Buffer with next line .word SETIB ; SET Input Buffer pointers SOURCE_LEN, SOURCE_ORG and clear >IN .word BRAN,BRACKETELSE1 ; then loop back 44 words without options @@ -209,10 +190,10 @@ BRACKETELSE5 ; ;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. -BRACKETIF CMP #0,TOS - MOV @PSP+,TOS - JZ BRACKETELSE - MOV @IP+,PC +BRACKETIF CMP #0,TOS ; -- f + MOV @PSP+,TOS ; -- + JZ BRACKETELSE ; false flag output + MOV @IP+,PC ; true flag output .IFNDEF NIP ; https://forth-standard.org/standard/core/NIP @@ -246,10 +227,6 @@ DEFINED mDOCOL ;otherwise return a true flag. mDOCOL .word DEFINED,ZEROEQUAL,EXIT -; .word $+2 -; MOV @RSP+,IP -; MOV #ZEROEQUAL,PC -; .word FBLANK,WORDD,FIND,NIP,ZEROEQUAL,EXIT ; https://forth-standard.org/standard/core/MARKER @@ -258,24 +235,37 @@ DEFINED mDOCOL ;Restore all dictionary allocation and search order pointers to the state they had just prior to the ;definition of name. Remove the definition of name and all subsequent definitions. Restoration ;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 -MARKER_DOES .word $+2 ; 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 +;not necessarily provided. No other contextual information such as numeric base is affected. + + +; FastForth provides all that is necessary for a real time application next MARKER definition, +; by adding a call to a custom subroutine, with the default parameters to be restored saved next MARKER definition. +MARKER_DOES ; execution part of MARKER, same effect than RST_STATE, but to restore state before MARKER defn. + .word $+2 ; -- BODY + MOV @TOS+,&RST_DP ; -- BODY+2 thus RST_STATE will restore the word-set state before MARKER + .IFDEF VOCABULARY_SET + MOV @TOS+,&RST_VOC ; -- BODY+4 thus RST_STATE will restore the word-set state before MARKER + .ELSE + ADD #2,TOS ; -- BODY+4 + .ENDIF + CALL @TOS+ ; -- BODY+6 @TOS = RET_ADR|STOP_APP_ADR (default|custom) MOV @PSP+,TOS ; -- - JMP RST_STATE ; execute RST_STATE, PWR_STATE then STATE_DOES + MOV @RSP+,IP ; + JMP RST_STATE ; then next FORTHWORD "MARKER" ; definition part ;( "name" -- ) ;Skip leading space delimiters. Parse name delimited by a space. Create a definition for name ;with the execution semantics defined below. - CALL #HEADER ;4 W = DP+4 - MOV #DODOES,-4(W) ;4 CFA = DODOES + CALL #HEADER ;4 W = DP+4, Y = NFA, + MOV #1285h,-4(W) ;4 CFA = CALL R5 = rDODOES 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 + SUB #2,Y ;1 Y = NFA-2 = LFA + MOV Y,0(W) ;3 BODY = DP value before this MARKER definition + .IFDEF VOCABULARY_SET + MOV &LASTVOC,2(W) ;5 BODY+2 = current VOCLINK + .ENDIF + MOV #RET_ADR,4(W) ; BODY+4 = RET addr, to do nothing by default + ADD #6,&DDP ;4 JMP GOOD_CSP ; diff --git a/forthMSP430FR_EXTD_ASM.asm b/forthMSP430FR_EXTD_ASM.asm index 4b35cb8..4604adf 100644 --- a/forthMSP430FR_EXTD_ASM.asm +++ b/forthMSP430FR_EXTD_ASM.asm @@ -1,23 +1,5 @@ ; -*- 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) <2017> -; -; 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 . - - ; ---------------------------------------------------------------------- ;forthMSP430FR_EXTD_ASM.asm ; ---------------------------------------------------------------------- @@ -66,33 +48,81 @@ SKIPEND MOV TOS,W ; ; DTCforthMSP430FR5xxx ASSEMBLER : search argument "xxxx", IP is free ; ---------------------------------------------------------------------- +; SearchARG ; separator -- n|d or abort" not found" +; ; Search ARG of "#xxxx," ; <== PARAM10 +; ; Search ARG of "&xxxx," ; <== PARAM111 +; ; Search ARG of "xxxx(REG)," ; <== PARAM130 +; ; Search ARG of ",&xxxx" ; <== PARAM111 <== PARAM20 +; ; Search ARG of ",xxxx(REG)" ; <== PARAM210 +; PUSHM #2,S ; PUSHM S,T as OPCODE, OPCODEADR +; ASMtoFORTH ; -- separator search word first +; .word WORDD,FIND ; -- addr +; .word ZEROEQUAL +; .word QFBRAN,ARGWORD ; -- addr if Word found +; .word QNUMBER ; +; .word QFBRAN,NotFound ; -- addr ABORT if not found +; FSearchEnd .word SearchEnd ; -- value goto SearchEnd if number found +; ARGWORD .word $+2 ; -- CFA +; MOV @TOS+,S ; -- PFA S=DOxxx +; QDOVAR SUB #DOVAR,S ; DOxxx = 1287h = DOVAR +; ISDOVAR JZ SearchEnd ; -- addr PFA = adr of VARIABLE +; QDOCON ADD #1,S ; DOxxx = 1286h = DOCON +; JNZ ISOTHER ; +; ISDOCON MOV @TOS,TOS ; +; JMP SearchEnd ; -- cte +; ISOTHER SUB #2,TOS ; -- CFA +; SearchEnd POPM #2,S ; POPM T,S +; MOV @RSP+,PC ; RET + SearchARG ; separator -- n|d or abort" not found" ; Search ARG of "#xxxx," ; <== PARAM10 ; Search ARG of "&xxxx," ; <== PARAM111 -; Search ARG of "xxxx(REG)," ; <== PARAM130 +; Search ARG of "xxxx(REG)," ; <== ComputeARGpREG <== PARAM130 ; Search ARG of ",&xxxx" ; <== PARAM111 <== PARAM20 -; Search ARG of ",xxxx(REG)" ; <== PARAM210 - PUSHM #2,S ; PUSHM S,T as OPCODE, OPCODEADR - ASMtoFORTH ; -- separator search word first - .word WORDD,FIND ; -- addr - .word QTBRAN,ARGWORD ; -- addr if Word found +; Search ARG of ",xxxx(REG)" ; <== ComputeARGpREG <== PARAM210 + PUSHM #2,S ; PUSHM S,T as OPCODE,OPCODEADR + PUSH TOS ; push sep, for SrchARGPO + PUSH &TOIN ; push TOIN, for SrchARGPO +;-----------------------------------; + ASMtoFORTH ; -- sep sep = ','|'('|' ' + .word WORDD,FIND ; -- addr search word first + .word ZEROEQUAL + .word QFBRAN,ARGWORD ; -- addr if Word found .word QNUMBER ; - .word QFBRAN,NotFound ; -- addr ABORT if not found -FSearchEnd .word SearchEnd ; -- value goto SearchEnd if number found -ARGWORD .word $+2 ; -- xt xt = CFA - MOV @TOS+,X ; -- PFA -QDOVAR SUB #DOVAR,X ; DOVAR = 1286h -ISDOVAR JZ SearchEnd ; -QDOCON ADD #1,X ; -- PFA DOCON = 1285h -ISNOTDOCON JNZ QDODOES ; -ISDOCON MOV @TOS,TOS ; -- cte - JMP SearchEnd ; -QDODOES ADD #2,TOS ; -- BODY leave BODY address for DOES words - ADD #1,X ; DODOES = 1284h -ISDODOES JZ SearchEnd ; -ISOTHER SUB #4,TOS ; -- CFA -SearchEnd POPM #2,S ; POPM T,S - MOV @RSP+,PC ; RET + .word QFBRAN,SrchARGPO; -- addr search ARG Plus Offset if not found + .word SrchNext ; -- value goto SrchNext if number found +ARGWORD .word $+2 ; -- CFA + MOV @TOS+,S ; -- PFA S=DOxxx +QDOVAR SUB #1287h,S ; DOxxx = 1287h = CALL R7 = rDOVAR +ISDOVAR JZ SrchNext ; -- addr PFA = adr of VARIABLE +QDOCON ADD #1,S ; DOxxx = 1286h = DOCON + JNZ ISOTHER ; +ISDOCON MOV @TOS,TOS ; + JMP SrchNext ; -- cte +ISOTHER SUB #2,TOS ; -- CFA +SrchNext ADD #4,RSP ; remove TOIN,sep +SearchEnd POPM #2,S ; POPM T,S + MOV @RSP+,PC ; RET + +;-----------------------------------; +; search for ARGUMENT16+OFFSET ; up to $FFFF only (FORTH area) +;-----------------------------------; +SrchARGPO .word $+2 + MOV @RSP+,&TOIN ; TOIN back + MOV @RSP+,TOS ; -- sep + ASMtoFORTH ; + .word LIT,'+' ; -- sep '+' search argument + .word WORDD,FIND ; -- sep CFA + .word ZEROEQUAL ; + .word QFBRAN,SrchOffst; + .word QNUMBER ; -- sep number + .word QFBRAN,NotFound ; see INTERPRET +SrchOffst .word SWAP ; -- CFA|number sep + .word WORDD,QNUMBER ; Search 'Offset,'|'Offset('|'Offset' + .word QFBRAN,NotFound ; see INTERPRET + .word $+2 ; -- CFA|number offset + ADD @PSP+,TOS ; -- (CFA|number + offset) + JMP SearchEnd ; ; Arg_Double_to_single conversion needed only for OPCODE type V|VI, 2th pass. ARGD2S BIT #UF9,SR ; -- Lo Hi @@ -204,7 +234,7 @@ PARAM110 MOV #0210h,S ; -- sep set code type : xxxx(SR) wit ; case of ",&xxxx" ; <== PARAM20 PARAM111 ADD #1,&TOIN ; -- sep skip "&" prefix CALL #SearchARG ; -- arg abort if not found - CALL #ARGD2S ; skip arg_hi of opcode type V + CALL #ARGD2S ; skip argD_hi of opcode type V JMP StoreArg ; -- then ret ; ----------------------------------; PARAM12 CMP.B #'@',W ; -- sep @@ -444,7 +474,7 @@ BOUNDERROR ; <== REG number error mDOCOL ; -- n n = value out of bounds .word DOT,XSQUOTE .byte 13,"out of bounds" - .word QABORTYES + .word ABORT_TERM ; ---------------------------------------------------------------------- ; DTCforthMSP430FR5xxx ASSEMBLER, CONDITIONAL BRANCHS diff --git a/forthMSP430FR_SD_ACCEPT.asm b/forthMSP430FR_SD_ACCEPT.asm index 87a7df6..24091b7 100644 --- a/forthMSP430FR_SD_ACCEPT.asm +++ b/forthMSP430FR_SD_ACCEPT.asm @@ -1,23 +1,5 @@ ; -*- 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) <2017> -; -; 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 . - - ;Z SD_ACCEPT addr addr len -- addr' len' get line to interpret from a SD Card file ; no interrupt allowed ; defered word ACCEPT is redirected here by the word LOAD" @@ -30,7 +12,6 @@ ; used variables : BufferPtr, BufferLen - ; ----------------------------------; ; FORTHWORD "SD_ACCEPT" ; CIB CIB CPL -- CIB len ; ----------------------------------; @@ -41,7 +22,7 @@ SD_ACCEPT ; sequentially move from SD_BUF to SDIB (PAD ; ----------------------------------; StartNewLine ; -- CIB CIB CPL ; ----------------------------------; - MOV &CurrentHdl,T ; prepare a link for the next LOADed file... + MOV &CurrentHdl,T ; prepare a link for the next LOADed file, if any... MOV &BufferPtr,HDLW_BUFofst(T) ; ...see usage : GetFreeHandle(CheckCaseOfLoadFileToken) ; ----------------------------------; MOV @PSP+,W ; -- CIB CPL W=dst_ptr @@ -72,18 +53,19 @@ SDA_ComputeChar ; -- CIB cnt ; ----------------------------------; SDA_EndOfLine ; -- org cnt ; ----------------------------------; - MOV S,&BufferPtr ; yes save BufferPtr for next line MOV @RSP+,IP ; - MOV @IP+,PC ; ===> unique output + MOV S,&BufferPtr ; yes save BufferPtr for next line + MOV #32,S ; S = BL + JMP ACCEPT_EOL ; ==> output ; ----------------------------------; SDA_MoveChar ; ; ----------------------------------; CMP X,TOS ; 1 cnt = dst_len ? - JZ YEMIT1 ; 2 yes, don't move char to dst + 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 YEMIT1 ; 9/6~ send echo to terminal if ECHO, do nothing if NOECHO + JMP YEMIT ; 9/6~ send echo to terminal if ECHO, do nothing if NOECHO ; ----------------------------------; 29/26~ char loop, add 14~ for readsectorW ==> 43/40~ ==> 186/200 kbytes/s @ 8MHz SDA_GetFileNextSector ; CIB cnt -- ; ----------------------------------; diff --git a/forthMSP430FR_SD_INIT.asm b/forthMSP430FR_SD_INIT.asm index c06603d..7444ba7 100644 --- a/forthMSP430FR_SD_INIT.asm +++ b/forthMSP430FR_SD_INIT.asm @@ -2,24 +2,6 @@ ; forthMSP430FR_SD_INIT.asm .save .listing off -; http://patorjk.com/software/taag/#p=display&f=Banner&t=Fast Forth - -; Fast Forth For Texas Instrument MSP430FRxxxx FRAM devices -; Copyright (C) <2017> -; -; 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 . - ; =========================================================== ; ABOUT INIT SD_CARD AND HOW TO SELECT FAT16/FAT32 FORMAT ; =========================================================== @@ -137,18 +119,43 @@ ; OrgDatas = OrgRootDir + RootDirSize = 30336 ; FirstSectorOfCluster(n) = OrgCluster + n*BPB_SecPerClus ==> cluster(6) = 30368 + .restore + ; =========================================================== -; Init SD_Card +; Init hardware SD_Card, called by WARM ; =========================================================== - .restore +;-----------------------------------; +INIT_SD CALL @PC+ ; link to previous INI_APP +INIT_SD_PFA .word INIT_TERM ; which activates all previous I/O settings and set TOS = RSTIV_MEM. +;-----------------------------------; + CMP #0,TOS ; RSTIV_MEM = WARM ? + JZ INI_SD_END ; no init if RSTIV_MEM = WARM +;-----------------------------------; + BIT.B #CD_SD,&SD_CDIN ; SD_memory in SD_Card module ? + JNZ INI_SD_END ; no +;-----------------------------------; + MOV #0A981h,&SD_CTLW0 ; UCxxCTL1 = CKPH, MSB, MST, SPI_3, SMCLK + UCSWRST + MOV #FREQUENCY*3,&SD_BRW; UCxxBRW init SPI CLK = 333 kHz ( < 400 kHz) for SD_Card initialisation + BIS.B #CS_SD,&SD_CSDIR ; SD Chip Select as output high + BIS #BUS_SD,&SD_SEL ; Configure pins as SIMO, SOMI & SCK (PxDIR.y are controlled by eUSCI module) + BIC #1,&SD_CTLW0 ; release eUSCI from reset +;-----------------------------------; + .IF RAM_LEN < 2048 ; case of MSP430FR57xx : SD datas are in FRAM not initialized by RESET. + MOV #SD_LEN,X ; clear all SD datas +ClearSDdata SUB #2,X ; 1 + MOV #0,SD_ORG(X) ; 3 + JNZ ClearSDdata ; 2 + .ENDIF ; +;-----------------------------------; SD_POWER_ON +; ----------------------------------; MOV #8,X ; send 64 clk on SD_clk CALL #SPI_X_GET ; BIC.B #CS_SD,&SD_CSOUT ; preset Chip Select output low to switch in SPI mode - MOV #4,S ; preset error 4R1 ; ----------------------------------; INIT_CMD0 ; all SD area is 0 filled ; ----------------------------------; + MOV #4,S ; preset error 4R1 for CMD0 MOV #95h,&SD_CMD_FRM ; $(95 00 00 00 00 00) MOV #4000h,&SD_CMD_FRM+4 ; $(95 00 00 00 00 40); send CMD0 ; ----------------------------------; @@ -182,10 +189,10 @@ INIT_ACMD41 ; no more CRC needed from here ; MOV.B #16,Y ; init 16 * ACMD41 repeats (power on fails with SanDisk ultra 8GB "HC I" and Transcend 2GB) ; MOV.B #32,Y ; init 32 * ACMD41 repeats ==> ~400ms time out MOV.B #-1,Y ; init 255 * ACMD41 repeats ==> ~3 s time out + MOV #8,S ; preset error 8R1 for ACMD41 ; ----------------------------------; SEND_ACMD41 ; send CMD55+CMD41 ; ----------------------------------; - MOV #8,S ; preset error 8R1 for ACMD41 INIT_CMD55 ; MOV #7700h,&SD_CMD_FRM+4 ; $(01 00 00 00 00 77) SEND_CMD55 ; CMD55 = APP_CMD; expected SPI_R1 response = 1 : idle @@ -196,7 +203,7 @@ SEND_CMD41 ; CMD41 = APP OPERATING CONDITION JZ SetBLockLength ; if SD_Card ready (R1=0) SUB.B #1,Y ; else decr time out delay JNZ INIT_CMD55 ; then loop back while count of repeat not reached - JMP SD_INIT_ERROR ; ReturnError on time out : unusable card + JMP SD_INIT_ERROR ; ReturnError on time out : unusable card (or insufficient Vdd SD) ; ----------------------------------; setBLockLength ; set block = 512 bytes (buffer size), usefull only for FAT16 SD Cards ; ----------------------------------; @@ -206,8 +213,8 @@ SEND_CMD16 ; CMD16 = SET_BLOCKLEN MOV #5000h,&SD_CMD_FRM+4 ; $(01 00 02 00 00 50) CALL #WaitIdleBeforeSendCMD ; wait until idle then send CMD16 JNZ SD_INIT_ERROR ; if W = R1 <> 0, ReturnError = $20R1 ; send command ko -; ----------------------------------; -SetHighSpeed ; end of SD init ==> SD_CLK = SMCLK +; ----------------------------------; W = R1 = 0 +SwitchSPIhighSpeed ; end of SD init ==> SD_CLK = SMCLK ; ----------------------------------; BIS #1,&SD_CTLW0 ; Software reset MOV #0,&SD_BRW ; UCxxBRW = 0 ==> SPI_CLK = MCLK @@ -215,7 +222,8 @@ SetHighSpeed ; end of SD init ==> SD_CLK = SMCLK ; ----------------------------------; Read_EBP_FirstSector ; W=0, BS_FirstSectorHL=0 ; ----------------------------------; - CALL #readSectorW ; read physical first sector + MOV #0,X ; + CALL #readSectorWX ; read physical first sector MOV #SD_BUF,Y ; MOV 454(Y),&BS_FirstSectorL ; so, sectors become logical MOV 456(Y),&BS_FirstSectorH ; @@ -245,8 +253,9 @@ FAT32_CHS_LBA_Test ; MOV #SD_CARD_ID_ERROR,PC ; S = ReturnError = $20xx with xx = partition ID ; ----------------------------------; see: https://en.wikipedia.org/wiki/Partition_type Read_MBR_FirstSector ; read first logical sector -; ----------------------------------; - CALL #readSectorW ; ...with the good CMD17 bytes/sectors frame ! (good switch FAT16/FAT32) +; ----------------------------------; W = 0 + MOV #0,X ; + CALL #readSectorWX ; ...with the good CMD17 bytes/sectors frame ! (good switch FAT16/FAT32) ; ----------------------------------; FATxx_SetFileSystem ; ; ----------------------------------; @@ -272,4 +281,23 @@ FATxx_SetFileSystemNext ; SUB &SecPerClus,X ; no borrow expected MOV X,&OrgClusters ; X = virtual cluster 0 address (clusters 0 and 1 don't exist) MOV &FATtype,&DIRClusterL ; init DIRcluster as RootDIR -; ----------------------------------; +INI_SD_END ; + MOV @RSP+,PC ; RET +;-----------------------------------; + +; =========================================================== +; Init FORTH SD_Card, called by ?ABORT|RST +; =========================================================== +;-----------------------------------; +INI_FORTH_SD ; common part of ?ABORT|RST +;-----------------------------------; + CALL @PC+ ; link to previous INI_FORTH_APP +RSAB_SD_PFA .word RET_ADR ; which does nothing +;-----------------------------------; + MOV #HandlesLen,X ; clear all handles +ClearHandle SUB #2,X ; 1 + MOV #0,FirstHandle(X) ; 3 + JNZ ClearHandle ; 2 + MOV #0,&CurrentHdl ; + MOV @RSP+,PC ; RET +;-----------------------------------; diff --git a/forthMSP430FR_SD_LOAD.asm b/forthMSP430FR_SD_LOAD.asm index f58bf11..c191ff7 100644 --- a/forthMSP430FR_SD_LOAD.asm +++ b/forthMSP430FR_SD_LOAD.asm @@ -1,22 +1,15 @@ ; -*- coding: utf-8 -*- ; forthMSP430FR_SD_LOAD.asm -; Tested with MSP-EXP430FR5994 launchpad -; Copyright (C) <2019> -; -; 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 . - +;Z SD_ACCEPT addr addr len -- addr' len' get line to interpret from a SD Card file +; no interrupt allowed +; defered word ACCEPT is redirected here by the word LOAD" +; "defered" word CIB is redirected to SDIB (PAD if RAM<2k) by the word LOAD" +; sequentially move an input line ended by CRLF from SD_BUF to PAD +; if end of SD_BUF is reached before CRLF, asks Read_HandledFile to refill buffer with next sector +; then load the end of the line to PAD ptr. +; when all LOAD"ed files are read, redirects defered word ACCEPT to default ACCEPT and restore interpret pointers. +; see CloseHandleT. ; used variables : BufferPtr, BufferLen @@ -24,6 +17,8 @@ ; SD card OPEN, LOAD subroutines ;----------------------------------------------------------------------- +; used variables : BufferPtr, BufferLen + ; rules for registers use ; S = error ; T = CurrentHdl, pathname @@ -125,8 +120,6 @@ ComputeHDLcurrentSector ; input: currentHandle, output: Cluster, Sec ; ----------------------------------; - - ; ----------------------------------; input : X = countdown_of_spaces, Y = name pointer in buffer ParseEntryNameSpaces ;XY ; ----------------------------------; output: Z flag, Y is set after the last space char @@ -168,7 +161,9 @@ Read_File ; <== SD_ACCEPT, READ ; ----------------------------------; MOV.B #0,HDLB_ClustOfst(T) ; reset Current_Cluster sectors offset CALL #HDLCurClusToFAT1sectWofstY;WXY Output: W=FATsector, Y=FAToffset, Cluster=HDL_CurCluster - CALL #ReadFAT1SectorW ;SWX (< 65536) + ADD &OrgFAT1,W ; + MOV #0,X ; + CALL #ReadSectorWX ;SWX (< 65536) MOV #0,HDLH_CurClust(T) ; MOV SD_BUF(Y),HDLL_CurClust(T) ; CMP #1,&FATtype ; FAT16? @@ -305,7 +300,7 @@ RestorePreviousLoadedBuffer ; BIC #Z,SR ; ; ----------------------------------; CloseHandleRet ; - MOV @RSP+,PC ; Z = 1 if no more handle + MOV @RSP+,PC ; Z = 1 if no more handle ; ----------------------------------; @@ -340,7 +335,7 @@ RestoreSD_ACCEPTContext ; ; ----------------------------------; ReturnOfSD_ACCEPT ; ; ----------------------------------; - ADD #6,RSP ; R-- QUIT3 empties return stack + ADD #6,RSP ; R-- QUIT4 empties return stack MOV @RSP+,IP ; skip return to SD_ACCEPT ; ----------------------------------; CALL #CloseHandleHere ; Z = 1 if no more handle @@ -702,7 +697,49 @@ OPEN_Error ; S= error ; Error 16 : NomoreHandle ; S = error 16 ; ----------------------------------; mDOCOL ; set ECHO, type Pathname, type #error, type "< OpenError"; no return + .word ECHO ; .word XSQUOTE ; don't use S register .byte 11,"< OpenError" ; - .word BRAN,SD_QABORTYES ; to insert S error as flag, no return -; ----------------------------------; + .word BRAN,ABORT_SD ; to insert S error as flag, no return +; ----------------------------------; + + + .IFDEF BOOTLOADER + .IFNDEF CORE_COMPLEMENT + FORTHWORD "+" +; https://forth-standard.org/standard/core/Plus +; + n1/u1 n2/u2 -- n3/u3 add n1+n2 + ADD @PSP+,TOS + MOV @IP+,PC + .ENDIF + + FORTHWORD "BOOT" +; BOOT RSTIV_MEM -- ; bootstrap on SD_CARD\BOOT.4th file +; ; called by WARM +; to enable bootstrap type: ' BOOT IS WARM +; to disable bootstrap type: ' BOOT 2 + @ IS WARM + MOV @PC+,X +PFA_BOOT .word INIT_SD ; X = INIT_SD + CMP #2,TOS ; RSTIV_MEM <> WARM ? + JC QSD_MEM ; yes + MOV @RSP+,PC ; if RSTIV_MEM U< 2, return to BODYWARM +QSD_MEM BIT.B #CD_SD,&SD_CDIN ; SD_memory in SD_Card socket ? + JZ BOOT_YES ; + MOV 2(X),PC ; if no, goto previous INIT: INIT TERMINAL then ret to PFAWARM +;--------------------------------------------------------------------------------- +; RESET 6: if RSTIV_MEM <> WARM, init TERM, init SD +;--------------------------------------------------------------------------------- +BOOT_YES CALL X ; init TERM UC first then init SD card, TOS = RSTIV_MEM +;--------------------------------------------------------------------------------- +; END OF RESET +;--------------------------------------------------------------------------------- + MOV #PSTACK-2,PSP ; PUSH 0 on Stack + MOV #0,0(PSP) ; + MOV #0,&STATE ; ) + MOV #LSTACK,&LEAVEPTR ; > same as QUIT + MOV #RSTACK,RSP ; ) + ASMtoFORTH ; + .word XSQUOTE ; -- RSTIV_MEM addr u + .byte 15,"LOAD\34 BOOT.4TH\34" ; LOAD" BOOT.4TH" issues error 2 if no such file... + .word BRAN,QUIT4 ; to interpret this string + .ENDIF diff --git a/forthMSP430FR_SD_LowLvl.asm b/forthMSP430FR_SD_LowLvl.asm index bc0cd17..400fd52 100644 --- a/forthMSP430FR_SD_LowLvl.asm +++ b/forthMSP430FR_SD_LowLvl.asm @@ -1,31 +1,10 @@ ; -*- coding: utf-8 -*- ; forthMSP430FR_SD_lowLvl.asm -; Copyright (C) <2017> -; -; 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 . - - - BytsPerSec .equ 512 ; all sectors are computed as logical, then physically translated at last time by RW_Sector_CMD -sendCommandIdleRet ; <=== CMD0, CMD8, CMD55: W = 1 = R1 expected response = idle (forthMSP430FR_SD_INIT.asm) - MOV #1,W ; expected R1 response (first byte of SPI R7) = 01h : idle state - JMP sendCommand ; - ; in SPI mode CRC is not required, but CMD frame must be ended with a stop bit ; ==================================; RW_Sector_CMD ;WX <=== CMD17 or CMD24 (read or write Sector CMD) @@ -35,8 +14,8 @@ RW_Sector_CMD ;WX <=== CMD17 or CMD24 (read or write Secto JZ ComputePhysicalSector ; yes MOV #COLD,PC ; no: force COLD ; ----------------------------------; -ComputePhysicalSector ; -; ----------------------------------; input = logical sector... +ComputePhysicalSector ; input = logical sector... +; ----------------------------------; ADD &BS_FirstSectorL,W ;3 ADDC &BS_FirstSectorH,X ;3 ; ----------------------------------; ...output = physical sector @@ -62,10 +41,10 @@ FAT32_CMD ; FAT32 : CMD17/24 sector address WaitIdleBeforeSendCMD ; <=== CMD41, CMD1, CMD16 (forthMSP430FR_SD_INIT.asm) ; ==================================; CALL #SPI_GET ; - ADD.B #1,W ; expected value = FFh <==> MISO = 1 = not busy = idle state - JNE WaitIdleBeforeSendCMD ; loop back if <> FFh -; ==================================; W = 0 = expected R1 response = ready, for CMD41,CMD16, CMD17, CMD24 -sendCommand ;X + ADD.B #1,W ; expected value = FFh <==> MISO = 1 = SPI idle state + JNZ WaitIdleBeforeSendCMD ; loop back if <> FFh +; ==================================; W = 0 = expected R1 response = ready, for CMD41,CMD16, CMD17, CMD24 +sendCommand ; ; ==================================; ; input : SD_CMD_FRM : {CRC,byte_l,byte_L,byte_h,byte_H,CMD} ; W = expected return value @@ -78,8 +57,8 @@ Send_CMD_PUT ; performs little endian --> big endian conv MOV.B SD_CMD_FRM(X),&SD_TXBUF ;5 CMP #0,&SD_BRW ;3 full speed ? JZ FullSpeedSend ;2 yes -Send_CMD_Loop ; - BIT #RX_SD,&SD_IFG ;3 no: case of low speed during memCardInit +Send_CMD_Loop ; case of low speed during memCardInit + BIT #RX_SD,&SD_IFG ;3 JZ Send_CMD_Loop ;2 CMP.B #0,&SD_RXBUF ;3 to clear UCRXIFG FullSpeedSend ; @@ -102,7 +81,7 @@ Wait_Command_Response ; expect W = return value during X = 255 tim MOV.B #-1,&SD_TXBUF ;3 PUT FFh CMP #0,&SD_BRW ;3 full speed ? JZ FullSpeedGET ;2 yes -cardResp_Getloop ; no: case of low speed during memCardInit (CMD0,CMD8,ACMD41,CMD16) +cardResp_Getloop ; case of low speed during memCardInit (CMD0,CMD8,ACMD41,CMD16) BIT #RX_SD,&SD_IFG ;3 JZ cardResp_Getloop ;2 FullSpeedGET ; @@ -113,22 +92,29 @@ SPI_WAIT_RET ; flag Z = 1 <==> Returned value = expected MOV @RSP+,PC ; W = expected value, unchanged ; ----------------------------------; +; ----------------------------------; +sendCommandIdleRet ; <=== CMD0, CMD8, CMD55: W = 1 = R1 expected response = idle (forthMSP430FR_SD_INIT.asm) +; ----------------------------------; + MOV #1,W ; expected R1 response (first byte of SPI R7) = 01h : idle state + JMP sendCommand ; +; ----------------------------------; + ; SPI_GET and SPI_PUT are adjusted for SD_CLK = MCLK ; PUT value must be a word or byte:byte because little endian to big endian conversion ; ==================================; -SPI_GET ; PUT(FFh), output : W = received byte, X = 0 +SPI_GET ; PUT(FFh) one time, output : W = received byte, X = 0 ; ==================================; - MOV #1,X ;1 + MOV #1,X ; ; ==================================; SPI_X_GET ; PUT(FFh) X times, output : W = last received byte, X = 0 ; ==================================; - MOV #-1,W ;1 W = FFFFh + MOV #-1,W ; ; ==================================; -SPI_PUT ; PUT(W) X time, output : W = last received byte, X = 0 +SPI_PUT ; PUT(W) X times, output : W = last received byte, X = 0 ; ==================================; - SWPB W ;1 + 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 CMP #0,&SD_BRW ;3 full speed ? JZ FullSpeedPut ;2 @@ -143,16 +129,9 @@ SPI_PUT_END MOV.B &SD_RXBUF,W ;3 MOV @RSP+,PC ;4 ; ----------------------------------; + ASMWORD "READ_SWX" ; ==================================; -readFAT1SectorW ; read a FAT1 sector -; ==================================; - ADD &OrgFAT1,W ; -; ==================================; -readSectorW ; read a logical sector < 65536 -; ==================================; - MOV #0,X ; -; ==================================; -readSectorWX ; SWX read a logical sector +ReadSectorWX ; SWX read a logical sector ; ==================================; BIS #1,S ; preset sd_read error MOV.B #51h,&SD_CMD_FRM+5 ; CMD17 = READ_SINGLE_BLOCK @@ -176,21 +155,18 @@ ReadSectorFirstByte ; CMP #BytsPerSec+1,X ; 2 JNZ ReadSectorLoop ; 2 14 cycles loop read byte ; ----------------------------------; - MOV.B #-1,&SD_TXBUF ; 3 put only one FF because first CRC byte is already received... + MOV.B #-1,&SD_TXBUF ; 3 put only one FF because first CRC byte is already received... ; ----------------------------------; ReadWriteHappyEnd ; <==== WriteSector ; ----------------------------------; - BIC #3,S ; reset read and write errors - BIS.B #CS_SD,&SD_CSOUT ; Chip Select high + BIC #3,S ; reset read and write errors + BIS.B #CS_SD,&SD_CSOUT ; Chip Select high MOV @RSP+,PC ; ; ----------------------------------; .IFDEF SD_CARD_READ_WRITE -; ==================================; -WriteSectorW ; write a logical sector up to 65535 (FAT1,FAT2) -; ==================================; - MOV #0,X ; + ASMWORD "WRITE_SWX" ; ==================================; WriteSectorWX ; write a logical sector ; ==================================; @@ -210,7 +186,7 @@ WriteSectorLoop ; 11 cycles loop write, starts with X = 0 CMP #BytsPerSec,X ; 2 JNZ WriteSectorLoop ; 2 ; ----------------------------------; -WriteSkipCRC16 ; CRC not used in SPI mode +WriteSkipCRC16 ; CRC16 not used in SPI mode ; ----------------------------------; MOV #3,X ; PUT 2 bytes to skip CRC16 CALL #SPI_X_GET ; + 1 byte to get data token in W @@ -226,14 +202,14 @@ CheckWriteState ; ; SD Error n° ; High byte -; 1 = CMD17 read error -; 2 = CMD24 write error -; 4 = CMD0 time out (GO_IDLE_STATE) -; 8 = ACMD41 time out (APP_SEND_OP_COND) -; 10 = CMD16 time out (SET_BLOCKLEN) -; 20 = not FAT16/FAT32 media, low byte = partition ID - -; low byte, if CMD R1 response : |0|7|6|5|4|3|2|1| +; 1 = CMD17 read error +; 2 = CMD24 write error +; 4 = CMD0 time out (GO_IDLE_STATE) +; 8 = ACMD41 time out (APP_SEND_OP_COND) +; $10 = CMD16 time out (SET_BLOCKLEN) +; $20 = not FAT16/FAT32 media, low byte = partition ID + +; low byte, if CMD R1 response : %0xxx_xxxx ; 1th bit = In Idle state ; 2th bit = Erase reset ; 3th bit = Illegal command @@ -245,25 +221,25 @@ CheckWriteState ; ; Data Response Token ; Every data block written to the card will be acknowledged by a data response token. ; It is one byte long and has the following format: -; 7 6 5 4 3 2 1 0 -; x x x 0 Status 1 +; %xxxx_sss0 with bits(3-1) = Status ;The meaning of the status bits is defined as follows: ;'010' - Data accepted. ;'101' - Data rejected due to a CRC error. ;'110' - Data Rejected due to a Write Error ; ----------------------------------; -SD_CARD_ERROR ; <=== SD_INIT errors 4,8,$10 +SD_CARD_ERROR ; <=== SD_INIT errors 4,8,$10 from forthMSP430FR_SD_INIT.asm ; ----------------------------------; SWPB S ; High Level error in High byte ADD &SD_RXBUF,S ; add SPI(GET) return value as low byte error -SD_CARD_ID_ERROR ; <=== SD_INIT error $20 from forthMSP430FR_SD_LowLvl.asm +SD_CARD_ID_ERROR ; <=== SD_INIT error $20 from forthMSP430FR_SD_INIT.asm BIS.B #CS_SD,&SD_CSOUT ; Chip Select high mDOCOL ; + .word ECHO .word XSQUOTE ; don't use S register .byte 11,"< SD Error!" ; ; ----------------------------------; -SD_QABORTYES ; <=== OPEN file errors from forthMSP430FR_SD_LOAD.asm +ABORT_SD ; <=== OPEN file errors from forthMSP430FR_SD_LOAD.asm ; ----------------------------------; .word $+2 ; SUB #2,PSP ; @@ -271,6 +247,6 @@ SD_QABORTYES ; <=== OPEN file errors from forthMSP430FR_S MOV #10h,&BASE ; select hex MOV S,TOS ; ASMtoFORTH ; - .word UDOT,QABORTYES ; no return... + .word UDOT,ABORT_TERM ; no return... ; ----------------------------------; diff --git a/forthMSP430FR_SD_RW.asm b/forthMSP430FR_SD_RW.asm index 5ae8876..6bf7957 100644 --- a/forthMSP430FR_SD_RW.asm +++ b/forthMSP430FR_SD_RW.asm @@ -1,26 +1,6 @@ ; -*- coding: utf-8 -*- ; DTCforthMSP430FR5xxxSD_RW.asm -; and only for FR5xxx and FR6xxx with RTC_B or RTC_C hardware if you want write file with date and time. - -; Tested with MSP-EXP430FR5969 launchpad -; Copyright (C) <2015> -; -; 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 . - - - ; ====================================================================== ; READ" primitive as part of OpenPathName ; input from open: S = OpenError, W = open_type, SectorHL = DIRsectorHL, @@ -38,7 +18,7 @@ OPEN_READ ; ; ----------------------------------; CMP #0,S ; open file happy end ? JNZ OPEN_Error ; no - MOV @IP+,PC ; + MOV @IP+,PC ; ; ----------------------------------; ;Z READ -- f @@ -56,7 +36,7 @@ READ CALL #Read_File ;SWX READ_END SUB &CurrentHdl,TOS ; -- fl if fl <>0 (if Z=0) handle is closed - MOV @IP+,PC ; + MOV @IP+,PC ; ; ----------------------------------; @@ -86,7 +66,9 @@ LoadFATsectorInBUF ; <== IncrementFATsector MOV @RSP,W ; W = FATsector CMP W,&FATSize ; JZ OPW_Error ; FATsector = FATSize ===> abort disk full - CALL #ReadFAT1SectorW ;SWX + ADD &OrgFAT1,W ; + MOV #0,X ; + CALL #ReadSectorWX ;SWX (< 65536) MOV #0,X ; init FAToffset ; ----------------------------------; SearchFreeClustInBUF ; <== SearchNextCluster @@ -151,10 +133,12 @@ UpdateFATsSectorW ; ; ----------------------------------; PUSH W ; ADD &OrgFAT1,W ; update FAT#1 - CALL #WriteSectorW ; SWX + MOV #0,X ; + CALL #WriteSectorWX ; write a logical sector MOV @RSP+,W ; ADD &OrgFAT2,W ; update FAT#2 - MOV #WriteSectorW,PC ; then ret + MOV #0,X ; + CALL #WriteSectorWX ; write a logical sector ; ----------------------------------; @@ -304,7 +288,7 @@ OPW_Error ; set ECHO, type Pathname, type #error, type mDOCOL ; .word XSQUOTE ; .byte 12,"< WriteError",0 ; - .word BRAN,SD_QABORTYES ; to insert S error as flag, no return + .word BRAN,ABORT_SD ; to insert S error as flag, no return ; ----------------------------------; @@ -442,7 +426,9 @@ GetNewCluster ; input : T=CurrentHdl UpdateNewClusterFATs ; CALL #UpdateFATsSectorW ;SWX no: UpdateFATsSectorW with buffer of new FATsector MOV @RSP,W ; W = current FATsector - CALL #ReadFAT1SectorW ;SWX reload current FATsector in buffer to link clusters + ADD &OrgFAT1,W ; + MOV #0,X ; + CALL #ReadSectorWX ;SWX (< 65536) LinkClusters ; MOV @RSP+,W ; W = current FATsector MOV @RSP+,Y ; pop current FAToffset @@ -464,7 +450,7 @@ Write_File_End ;Z WRITE -- ; sequentially write the entire SD_BUF in a file opened by WRITE" ; ----------------------------------; - FORTHWORD "WRITE" ; in assembly : CALL #WRITE,X CALL 2(X) + FORTHWORD "WRITE" ; in assembly : CALL &WRITE+2 ; ----------------------------------; CALL #Write_File ; MOV @IP+,PC ; @@ -586,7 +572,9 @@ ComputeClusterSectWofstY ; LoadFAT1sector ; ----------------------------------; MOV W,T ; T = W = current FATsector memory - CALL #ReadFAT1SectorW ;SWX + ADD &OrgFAT1,W ; + MOV #0,X ; + CALL #ReadSectorWX ;SWX (< 65536) ; ----------------------------------; GetAndFreeClusterLo ; ; ----------------------------------; @@ -634,10 +622,11 @@ DEL_END ; + .IFNDEF TERMINAL_I2C ; if UART_TERMINAL + ; first TERATERM sends the command TERM2SD" file.ext" to FastForth which returns XOFF at the end of the line. ; then when XON is sent below, TERATERM sends "file.ext" up to XOFF sent by TERM2SD" (slices of 512 bytes), -; then TERATERM sends char ETX that closes the file on SD_CARD. - +; then TERATERM sends char EOT that closes the file on SD_CARD. FORTHWORD "TERM2SD\34" mDOCOL @@ -647,11 +636,10 @@ DEL_END ; .word PARENOPEN ; reopen same filepath but as write .word $+2 ; MOV @RSP+,IP ; - BIC #RX_TERM,&TERM_IFG ; clean up UCRX buffer ; ----------------------------------; T2S_GetSliceLoop ; tranfert by slices of 512 bytes terminal input to file on SD_CARD via SD_BUF ; ----------------------------------; - MOV #0,Y ;1 reset Y = BufferPtr + MOV #0,W ;1 reset W = BufferPtr CALL #RXON ; use no registers ; ----------------------------------; T2S_FillBufferLoop ; @@ -659,15 +647,16 @@ T2S_FillBufferLoop ; BIT #RX_TERM,&TERM_IFG ;3 new char in TERMRXBUF ? JZ T2S_FillBufferLoop ;2 MOV.B &TERM_RXBUF,X ;3 + MOV.B X,&TERM_TXBUF CMP.B #4,X ;1 EOT sent by TERATERM ? - JZ T2S_END ;2 yes - MOV.B X,SD_BUF(Y) ;3 - ADD #1,Y ;1 - CMP #BytsPerSec-1,Y ;2 - JNC T2S_FillBufferLoop ;2 Y < BytsPerSec-1 21 cycles char loop - JZ T2S_XOFF ;2 Y = BytsPerSec-1 send XOFF after RX 511th char + JZ T2S_End_Of_File ;2 yes + MOV.B X,SD_BUF(W) ;3 + ADD #1,W ;1 + CMP #BytsPerSec-1,W ;2 + JNC T2S_FillBufferLoop ;2 W < BytsPerSec-1 21 cycles char loop + JZ T2S_XOFF ;2 W = BytsPerSec-1 send XOFF after RX 511th char ; ----------------------------------; -T2S_WriteFile ;2 Y = BytsPerSec +T2S_WriteFile ;2 W = BytsPerSec ; ----------------------------------; CALL #Write_File ;TSWXY write all the buffer JMP T2S_GetSliceLoop ;2 @@ -677,12 +666,79 @@ T2S_XOFF ; 27 cycles between XON and XOFF CALL #RXOFF ;4 use no registers JMP T2S_FillBufferLoop ;2 loop back once to get last char ; ----------------------------------; -T2S_END ; +T2S_End_Of_File ; ; ----------------------------------; CALL #RXOFF ;4 use no registers - MOV Y,&BufferPtr ;3 + MOV W,&BufferPtr ;3 CALL #CloseHandleT ;4 -TERM2SD_END ; MOV @IP+,PC ;4 ; ----------------------------------; + .ELSE ; if I2C_TERMINAL + + FORTHWORD "TERM2SD\34" + CALL #WAITCHAREND ; wait I2C_Master (re)START RX + BIC #WAKE_UP,&TERM_IFG ; clear UCSTTIFG before next test + mDOCOL + .word DELDQ ; DEL file if already exist + .word lit,2 ; -- open_type + .word HERE,COUNT ; -- open_type addr cnt + .word PARENOPEN ; reopen same filepath but as write + .word $+2 ; +; ----------------------------------; + CALL #RXON ; + BIC #WAKE_UP,&TERM_IFG ; clear UCSTTIFG before next test +; ----------------------------------; +T2S_ClearBuffer +; ----------------------------------; + MOV #0,W ;1 reset W = BufferPtr +; ----------------------------------; +T2S_FillBufferLoop ; move by slices of 512 bytes from TERMINAL input to file on SD_CARD via SD_BUF +; ----------------------------------; + BIT #RX_TERM,&TERM_IFG ;3 new char in TERMRXBUF ? + JZ T2S_FillBufferLoop ;2 no + MOV.B &TERM_RXBUF,X ;3 + CMP.B #4,X ;1 EOT sent by TERATERM ? + JZ T2S_End_Of_File ;2 yes + MOV.B X,SD_BUF(W) ;3 + ADD #1,W ;1 + CMP.B #0Ah,X ;2 Char LF ? + JNZ T2S_Q_BufferFull ;2 no +; ----------------------------------; +T2S_GetNewLine ; after LF sent, I2C_Master automaticaly (re)STARTs in RX mode +; ----------------------------------; + CALL #WAITCHAREND ; wait I2C_Master (re)START RX + BIC #WAKE_UP,&TERM_IFG ; clear UCSTTIFG before next test + ASMtoFORTH + .word LIT,0Ah,EMIT ; use Y reg + .word $+2 ; + CALL #RXON ; tells I2C_Master to(re)START in TX mode and waits I2C_Master TX (re)STARTed, use Y register + BIC #WAKE_UP,&TERM_IFG ; clear UCSTTIFG before next test +; ----------------------------------; +T2S_Q_BufferFull ; +; ----------------------------------; + CMP #BytsPerSec,W ;2 buffer full ? + JNC T2S_FillBufferLoop ;2 no 21 cycles char loop +; ----------------------------------; +T2S_WriteFile ;2 yes +; ----------------------------------; + CALL #Write_File ;4 TSWXY write all the buffer + JMP T2S_ClearBuffer ;2 +; ----------------------------------; +T2S_End_Of_File ; +; ----------------------------------; + MOV @RSP+,IP ; before CloseHandleT + MOV W,&BufferPtr ;3 + CALL #CloseHandleT ;4 +T2S_End_Of_EOT_Line ; + BIT #RX_TERM,&TERM_IFG ;3 new char in TERMRXBUF ? + JZ T2S_End_Of_EOT_Line ;2 no + MOV.B &TERM_RXBUF,X ;3 + CMP.B #0Ah,X ;2 Char LF ? + JNZ T2S_End_Of_EOT_Line ; + CALL #WAITCHAREND ; wait I2C_Master (re)START RX + BIC #WAKE_UP,&TERM_IFG ; clear UCSTTIFG before next test... + MOV @IP+,PC ; ... i.e. ready for return to SLEEP via RXON. +; ----------------------------------; + + .ENDIF diff --git a/forthMSP430FR_TERM_HALF.asm b/forthMSP430FR_TERM_HALF.asm new file mode 100644 index 0000000..0a24d7a --- /dev/null +++ b/forthMSP430FR_TERM_HALF.asm @@ -0,0 +1,300 @@ +; -*- coding: utf-8 -*- + +; define run-time part of ABORT" +;Z ?ABORT xi f c-addr u -- abort & print msg. +; FORTHWORD "?ABORT" +QABORT CMP #0,2(PSP) ; -- f c-addr u test flag f + JNZ ABORT_TERM ; +THREEDROP ADD #4,PSP ; -- u + MOV @PSP+,TOS ; -- + MOV @IP+,PC ; +; ----------------------------------; +ABORT_TERM ; exit from downloading file then reinit some variables via INI_FORTH +; ----------------------------------; + CALL #RXON ; PFA resume downloading source file if any +A_UART_LOOP BIC #RX_TERM,&TERM_IFG ; clear RX_TERM + MOV &FREQ_KHZ,Y ; 1000, 2000, 4000, 8000, 16000, 240000 +A_USB_LOOPJ MOV #65,X ; 2~ <-------+ linux with minicom seems very very slow... +A_USB_LOOPI SUB #1,X ; 1~ <---+ | ==> ((65*3)+5)*1000 = 200ms delay + JNZ A_USB_LOOPI ; 2~ 3~ loop ---+ | to refill its USB buffer + SUB #1,Y ; 1~ | + JNZ A_USB_LOOPJ ; 2~ 200~ loop -----+ + BIT #RX_TERM,&TERM_IFG ; 4 new char in TERMRXBUF after A_USB_LOOPJ delay ? + JNZ A_UART_LOOP ; 2 yes, the input stream is still active: loop back + CALL #INI_FORTH ; common ?ABORT|RST subroutine +; ----------------------------------; + .word lit,LINE,FETCH ; -- f c-addr u line fetch line number before set ECHO ! + .word ECHO ; + .word XSQUOTE ; + .byte 4,27,"[7m" ; type ESC[7m (set reverse video) + .word TYPE ; +; ----------------------------------; + .word QDUP,QFBRAN ; do nothing if line = 0 + .word ABORT_TYPE ; +; ----------------------------------; +; Display error "line:xxx" ; -- f c-addr u line +; ----------------------------------; + .word XSQUOTE ; -- f c-addr u line c-addr1 u1 displays the line where error occured + .byte 15,"LAST.4TH, line " ; + .word TYPE ; -- f c-addr u line + .word UDOT ; -- f c-addr u +; ----------------------------------; +; Display ABORT message ; <== WARM jumps here +; ----------------------------------; +ABORT_TYPE .word TYPE ; -- f type abort message + .word XSQUOTE ; -- f c-addr u + .byte 4,27,"[0m" ; + .word TYPE ; -- f set normal video + .word ABORT ; no return + + +; ----------------------------------; +COLD_TERM ; default STOP_APP: wait TERMINAL idle +; ----------------------------------; +UART_COLD_TERM + BIT #1,&TERM_STATW ;3 + JNZ COLD_TERM ;2 loop back while TERM_UART is busy + MOV @RSP+,PC ; return to software_BOR +; ----------------------------------; + +; ----------------------------------; +INIT_TERM ; TOS = RSTIV_MEM +; ----------------------------------; +UART_INIT_TERM ; + CMP #2,TOS ; + JNC UART_INIT_TERM_END ; no INIT_TERM if RSTIV_MEM U< 2 (WARM) +; ----------------------------------; + MOV #0081h,&TERM_CTLW0 ; UC SWRST + UCLK = SMCLK + MOV &TERMBRW_RST,&TERM_BRW ; init value in FRAM + MOV &TERMMCTLW_RST,&TERM_MCTLW ; init value in FRAM + BIS.B #BUS_TERM,&TERM_SEL ; Configure pins TERM_UART|TERM_I2C + BIC #1,&TERM_CTLW0 ; release UC_TERM from reset... + BIS #WAKE_UP,&TERM_IE ; then enable interrupt for wake up on terminal input + BIC #LOCKLPM5,&PM5CTL0 ; activate all previous I/O settings. +UART_INIT_TERM_END + MOV @RSP+,PC ; RET +; ----------------------------------; + + +; ----------------------------------; +RXON ; default BACKGND_APP +; ----------------------------------; +UART_RXON JMP RXON_EXE ; Software and/or hardware flow control, to start Terminal UART for one line +; ----------------------------------; + +; ----------------------------------; +RXOFF ; Software and/or hardware flow control, to stop Terminal UART comunication +; ----------------------------------; +UART_RXOFF ; + .IFDEF TERMINAL3WIRES ; first software flow control +RXOFF_LOOP BIT #TX_TERM,&TERM_IFG ;3 wait the sending of last char + JZ RXOFF_LOOP ;2 + MOV #19,&TERM_TXBUF ;4 move XOFF char into TX_buf + .ENDIF ; + .IFDEF TERMINAL4WIRES ; and hardware flow control after + BIS.B #RTS,&HANDSHAKOUT ;3 set RTS high + .ENDIF ; + MOV @RSP+,PC ;4 to CR_NEXT, ...or user defined +; ----------------------------------; + +; ----------------------------------; +RXON_EXE +; ----------------------------------; + .IFDEF TERMINAL3WIRES ; first software flow control +RXON_LOOP BIT #TX_TERM,&TERM_IFG ;3 wait the sending of last char, useless at high baudrates + JZ RXON_LOOP ;2 + MOV #17,&TERM_TXBUF ;4 move char XON into TX_buf + .ENDIF ; + .IFDEF TERMINAL4WIRES ; and hardware flow control after + BIC.B #RTS,&HANDSHAKOUT ;3 set RTS low + .ENDIF ; + MOV @RSP+,PC ;4 to BACKGND (End of file download or quiet input) or AKEYREAD... +; ----------------------------------; ... (get next line of file downloading), or user defined + + +;=============================================================================== + FORTHWORD "WIPE" ; software DEEP_RESET +;=============================================================================== + MOV #-1,&RSTIV_MEM ; negative value ==> DEEP_RESET + JMP COLD + +;=============================================================================== + FORTHWORD "COLD" +;=============================================================================== +;Z COLD -- performs a software RESET +; as pin RST is replaced by pin NMI, RESET by pin activation is redirected here via USER NMI vector +; that allows actions to be performed before executing software BOR. +COLD CALL @PC+ ; COLD first calls STOP_APP, in this instance: CALL #COLD_TERM by default +PFACOLD .word COLD_TERM ; INI_COLD_DEF: default value set by WIPE. see forthMSP430FR_TERM_xxxx.asm + BIT.B #IO_WIPE,&WIPE_IN ; hardware Deep_RESET request (low) ? + JNZ COLDEXE ; no + MOV #-1,&RSTIV_MEM ; yes, set negative value to force DEEP_RESET +COLDEXE MOV #0A504h,&PMMCTL0 ; performs software_BOR, see RESET in forthMSP430FR.asm +; ----------------------------------; + +;=============================================================================== + FORTHWORD "WARM" +;=============================================================================== +;Z WARM xi -- ; the next of RESET +WARM ; +;------------------------------------------------------------------------------- +; RESET 6.2: if RSTIV_MEM <> WARM, init TERM and enable I/O +;------------------------------------------------------------------------------- + CALL @PC+ ; init TERM, only if TOS U>= 2 (RSTIV_MEM <> WARM) + .IFNDEF SD_CARD_LOADER ; +PFAWARM .word INIT_TERM ; default value, init TERM UC, unlock I/O's, TOS = RSTIV_MEM + .ELSE +PFAWARM .word INIT_SD ; init TERM first then init SD Card + .ENDIF +;------------------------------------------------------------------------------- +; END OF RESET +;------------------------------------------------------------------------------- + ASMtoFORTH + .word XSQUOTE + .byte 7,13,10,27,"[7m#" ; CR + cmd "reverse video" + # + .word TYPE + .word DOT ; display TOS = RSTIV_MEM value + .word XSQUOTE + .byte 25,"FastForth ©J.M.Thoorens " + .word TYPE + .word LIT,FRAM_FULL,HERE,MINUS,UDOT + .word XSQUOTE + .byte 10,"bytes free" + .word BRAN,ABORT_TYPE ; without return + +;------------------------------------------------------------------------------- +; INTERPRETER INPUT +;------------------------------------------------------------------------------- + FORTHWORD "ACCEPT" +;https://forth-standard.org/standard/core/ACCEPT +;C ACCEPT addr addr len -- addr len' get line at addr to interpret len' chars +ACCEPT MOV @PC+,PC ;3 Code Field Address (CFA) of ACCEPT +PFAACCEPT .word BODYACCEPT ; Parameter Field Address (PFA) of ACCEPT +BODYACCEPT ; BODY of ACCEPT = default execution of ACCEPT +; ----------------------------------; +; ACCEPT part I prepare TERMINAL_INT; +; ----------------------------------; + MOV TOS,X ;1 -- addr len + MOV @PSP,TOS ;2 -- org ptr + ADD TOS,X ;1 -- org ptr X = buf_end + MOV #0Dh,W ;2 W = 'CR' to speed up char loop in part II + MOV #20h,T ;2 T = 'BL' to speed up char loop in part II + MOV IP,S ; S = ACCEPT_ret + MOV #CR_NEXT,IP ;2 IP = XOFF_ret + PUSHM #5,IP ;5 PUSHM IP,S,T,W,X r-- XOFF_ret ACCEPT_ret BL CR buf_end + JMP SLEEP ;2 which calls RXON before falling down to LPMx mode +; ----------------------------------; + +; **********************************; +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, SR flags are lost (unused by FORTH interpreter) + POPM #4,IP ;6 POPM W=buffer_bound, T=0Dh, S=20h, IP=ACCEPT_RET r-- XOFF_ret +; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv; +; starts the 2th stopwatch ; +; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^; +AKEYREAD MOV.B &TERM_RXBUF,Y ;3 read character into Y, RX_TERM is cleared +; ----------------------------------; + CMP.B T,Y ;1 CR ? + JZ RXOFF ;2 then RET to CR_NEXT +; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv;+ 12 to send RXOFF +; stops the first stopwatch ;= first bottleneck, best case result: 25~ + LPMx wake_up time.. +; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^; + CMP.B S,Y ;1 printable char ? + JC ASTORETEST ;2 yes +; ----------------------------------; + CMP.B #8,Y ;1 char = BS ? + JNE WAITaKEY ;2 case of other control chars +; ----------------------------------; +; start of backspace ; made only by an human +; ----------------------------------; + CMP @PSP,TOS ; Ptr = Org ? + JZ WAITaKEY ; yes: do nothing + SUB #1,TOS ; no : dec Ptr + JMP WAITaKEY ; don't store BS +; ----------------------------------; +; end of backspace ; +; ----------------------------------; +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 +; ----------------------------------; +WAITaKEY BIT #RX_TERM,&TERM_IFG ; 3 new char in TERMRXBUF ? + JNZ AKEYREAD ; 2 yes +; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv; +; stops the 2th stopwatch ; best case result: 26~/22~ (with/without echo) ==> 385/455 kBds/MHz +; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^; + JZ WAITaKEY ; 2 no +; ----------------------------------; + +; ----------------------------------; +; return of RXOFF +; ----------------------------------; +CR_NEXT SUB @PSP+,TOS ; -- len' +; ----------------------------------; + MOV #LPM0+GIE,&LPM_MODE ; reset LPM_MODE to default mode LPM0 for next line of input stream +; ----------------------------------; +WAITLF BIT #RX_TERM,&TERM_IFG ; char 'LF' is received ? + JZ WAITLF ; no + MOV.B &TERM_RXBUF,Y ; yes, clear RX_int flag after LF received +; ----------------------------------; +ACCEPT_EOL CMP #0,&LINE ; if LINE <> 0 increment LINE + JZ ACCEPT_END ; + ADD #1,&LINE ; +ACCEPT_END +; ----------------------------------; + MOV S,Y ; output a BL on TERMINAL (for the case of error occuring) + JMP YEMIT ; before interpret line +; **********************************; + +; ------------------------------------------------------------------------------ +; TERMINAL I/O, input part +; ------------------------------------------------------------------------------ + FORTHWORD "KEY" +; https://forth-standard.org/standard/core/KEY +; KEY -- c wait character from input device ; primary DEFERred word +KEY MOV @PC+,PC ;4 Code Field Address (CFA) of KEY +PFAKEY .word BODYKEY ; Parameter Field Address (PFA) of KEY, with default value +BODYKEY SUB #2,PSP ;1 push old TOS.. + MOV TOS,0(PSP) ;3 ..onto stack + CALL #RXON +KEYLOOP BIT #RX_TERM,&TERM_IFG ; loop if bit0 = 0 in interupt flag register + JZ KEYLOOP ; + MOV &TERM_RXBUF,TOS ; + CALL #RXOFF ; + MOV @IP+,PC + +; ------------------------------------------------------------------------------ +; TERMINAL I/O, output part +; ------------------------------------------------------------------------------ + FORTHWORD "EMIT" +; https://forth-standard.org/standard/core/EMIT +; EMIT c -- output character to the selected output device ; primary DEFERred word +EMIT MOV @PC+,PC ;4 Code Field Address (CFA) of EMIT +PFAEMIT .word BODYEMIT ; Parameter Field Address (PFA) of EMIT, with its default value +BODYEMIT MOV TOS,Y ;1 output character to the default output: TERMINAL + MOV @PSP+,TOS ;2 +YEMIT BIT #TX_TERM,&TERM_IFG ; 3 wait the sending end of previous char, useless at high baudrates + JZ YEMIT ; 2 + .IFDEF TERMINAL5WIRES ; +YEMIT1 BIT.B #CTS,&HANDSHAKIN ; + JNZ YEMIT1 + .ENDIF +QYEMIT .word 48C2h ;3 48C2h = MOV.B Y,& + .word TERM_TXBUF ; 3 MOV Y,&TERMTXBUF + MOV @IP+,PC ; + + FORTHWORD "ECHO" +;Z ECHO -- connect terminal output (default) +ECHO MOV #48C2h,&QYEMIT ; 48C2h = MOV.B Y,& + MOV #0,&LINE ; + MOV @IP+,PC + + FORTHWORD "NOECHO" +;Z NOECHO -- disconnect terminal output +NOECHO MOV #NEXT,&QYEMIT ; NEXT = 4030h = MOV @IP+,PC + MOV #1,&LINE ; + MOV @IP+,PC diff --git a/forthMSP430FR_TERM_I2C.asm b/forthMSP430FR_TERM_I2C.asm index e1fe8fe..f094fb3 100644 --- a/forthMSP430FR_TERM_I2C.asm +++ b/forthMSP430FR_TERM_I2C.asm @@ -1,21 +1,153 @@ ; -*- coding: utf-8 -*- -; Fast Forth For Texas Instrument MSP430FRxxxx FRAM devices with I2C TERMINAL -; Copyright (C) <2019> -; -; 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 . +; define run-time part of ABORT" +;Z ?ABORT xi f c-addr u -- abort & print msg. +; FORTHWORD "?ABORT" +QABORT CMP #0,2(PSP) ; -- f c-addr u test flag f + JNZ ABORT_TERM ; +THREEDROP ADD #4,PSP ; -- u + MOV @PSP+,TOS ; -- + MOV @IP+,PC ; +; ----------------------------------; +ABORT_TERM ; exit from downloading then reinit some variables via INI_FORTH +; ----------------------------------; + MOV.B #2,Y ; ABORT request Ctrl_Char = $02 + CALL #I2C_CTRL_CH ; send it to I2C_Master to run QABORT_TERM on its side + CALL #INI_FORTH ; common ?ABORT|RST subroutine +; ----------------------------------; + .word lit,LINE,FETCH ; -- f c-addr u line fetch line number before set ECHO ON ! + .word ECHO ; +; ----------------------------------; + .word OVER ; -- f c-addr u line u + .word QFBRAN,ABORT ; -- display nothing when ABORT" with empty string +; ----------------------------------; + .word XSQUOTE ; + .byte 5,27,"[7m",'@' ; + .word TYPE ; cmd "reverse video" + displays "@" + .word LIT,I2CSLAVEADR ; + .word FETCH,DOT ; displays + .word QDUP,QFBRAN ; don't display line if line = 0 (ECHO was ON) + .word ABORT_TYPE ; + .word XSQUOTE ; -- f c-addr u line c-addr1 u1 displays the line where error occured + .byte 15,"LAST.4TH, line " ; + .word TYPE ; -- f c-addr u line + .word UDOT ; -- f c-addr u +; ----------------------------------; +; Display ABORT|WARM message ; <== WARM jumps here +; ----------------------------------; +ABORT_TYPE .word TYPE ; -- f type abort message + .word XSQUOTE ; -- f c-addr u + .byte 4,27,"[0m" ; + .word TYPE ; -- f set normal video + .word ABORT ; -- f no return +; ----------------------------------; + +; ----------------------------------; +INIT_TERM ; TOS = RSTIV_MEM +; ----------------------------------; +I2C_INIT_TERM + CMP #2,TOS ; + JNC I2C_INIT_TERM_END ; no INIT_TERM if RSTIV_MEM U< 2 (WARM) +; ----------------------------------; +I2C_INIT_TERM_BODY + BIS #07C0h,&TERM_CTLW0 ; set I2C_Slave in RX mode to receive I2C_address + MOV &I2CSLAVEADR,Y ; init value found in FRAM INFO + RRA Y ; I2C Slave address without R/W bit + BIS #400h,Y ; enable I2COA0 Slave address + MOV Y,&TERM_I2COA0 ; + BIS.B #BUS_TERM,&TERM_SEL ; Configure pins TERM_UART|TERM_I2C + BIC #1,&TERM_CTLW0 ; release UC_TERM from reset... + BIS #WAKE_UP,&TERM_IE ; then enable interrupt for wake up on terminal input + BIC #LOCKLPM5,&PM5CTL0 ; activate all previous I/O settings. +I2C_INIT_TERM_END +; ----------------------------------; +COLD_TERM ; nothing to do +; ----------------------------------; + MOV @RSP+,PC ; +; ----------------------------------; + + +; ----------------------------------; +RXON ; send ctrl_char $00 as ACCEPT request +; ----------------------------------; +I2C_RXON MOV.B #0,Y ; ACCEPT request Ctrl_Char = $00 +; ----------------------------------; +I2C_CTRL_CH ; send it to I2C_Master_RX to restart it in TX mode +; ----------------------------------; + BIT #TX_TERM,&TERM_IFG ;3 + JZ I2C_CTRL_CH ;2 wait TX buffer empty + MOV.B Y,&TERM_TXBUF ;3 send Ctrl_Char +WAITCHAREND +; BIT #40h,&TERM_STATW ; SCL held low (after I2C_Master (re)START) ? + BIT #4,&TERM_IFG ; I2C_Master (re)START ? + JZ WAITCHAREND ; no + MOV @RSP+,PC ; yes +; ----------------------------------; +;=============================================================================== + FORTHWORD "WIPE" ; software DEEP_RESET +;=============================================================================== + MOV #-1,&RSTIV_MEM ; negative value ==> DEEP_RESET + JMP COLD + +;=============================================================================== + FORTHWORD "COLD" +;=============================================================================== +;Z COLD -- performs a software reset +; as pin RST is replaced by pin NMI, RESET by pin activation is redirected here via USER NMI vector +; that allows actions to be performed before executing software BOR. +COLD CALL @PC+ ; COLD first calls STOP_APP, in this instance: CALL #COLD_TERM by default +PFACOLD .word COLD_TERM ; PFACOLD default value set by WIPE. +BODYCOLD BIT.B #IO_WIPE,&WIPE_IN ; hardware Deep_RESET request (low) ? + JNZ COLDEXE ; no + MOV #-1,&RSTIV_MEM ; yes, set negative value to force DEEP_RESET +COLDEXE MOV #0A504h,&PMMCTL0 ; performs software_BOR, see RESET in forthMSP430FR.asm +; ----------------------------------; + +;=============================================================================== + FORTHWORD "WARM" +;=============================================================================== +;Z WARM xi -- ; the next of RESET +WARM ; +;------------------------------------------------------------------------------- +; RESET 6.2: if RSTIV_MEM <> WARM, init TERM and enable I/O +;------------------------------------------------------------------------------- + CALL @PC+ ; init TERM, only if TOS U>= 2 (RSTIV_MEM <> WARM) + .IFNDEF SD_CARD_LOADER ; +PFAWARM .word INIT_TERM ; default value, init TERM UC, unlock I/O's, TOS = RSTIV_MEM + .ELSE +PFAWARM .word INIT_SD ; init TERM first then init SD Card + .ENDIF +;------------------------------------------------------------------------------- +; END OF RESET +;------------------------------------------------------------------------------- + MOV.B #3,Y ; WARM request Ctrl_Char = $03 + CALL #I2C_CTRL_CH ; send it to I2C_Master to reSTART in RX mode + ASMtoFORTH + .word XSQUOTE + .byte 7,13,10,27,"[7m@" ; CR + cmd "reverse video" + @ + .word TYPE + .word LIT,I2CSLAVEADR,FETCH,DOT + .word LIT,'#',EMIT + .word DOT ; display signed RSTIV_MEM + .word XSQUOTE + .byte 25,"FastForth ©J.M.Thoorens " + .word TYPE + .word LIT,FRAM_FULL,HERE,MINUS,UDOT + .word XSQUOTE + .byte 10,"bytes free" + .word BRAN,ABORT_TYPE ; without return! + + +;------------------------------------------------------------------------------- +; INTERPRETER INPUT +;------------------------------------------------------------------------------- + FORTHWORD "ACCEPT" +;https://forth-standard.org/standard/core/ACCEPT +;C ACCEPT addr addr len -- addr len' get line at addr to interpret len' chars +ACCEPT MOV @PC+,PC ;3 Code Field Address (CFA) of ACCEPT +PFAACCEPT .word BODYACCEPT ; Parameter Field Address (PFA) of ACCEPT +BODYACCEPT ; BODY of ACCEPT = default execution of ACCEPT ; ----------------------------------; ; ACCEPT part I prepare TERMINAL_INT; ; ----------------------------------; @@ -25,9 +157,11 @@ MOV #0Ah,T ;2 T = 'LF' to speed up char loop in part II > prepare stack and registers for TERMINAL_INT use MOV #20h,S ;2 S = 'BL' to speed up char loop in part II ) PUSHM #4,IP ;6 PUSH IP,S,T,W r-- IP, 'BL', 'LF', buf_end ) -; BIC.B #LED1,&LED1_DIR ; Red led OFF, end of Slave TX -; BIC.B #LED1,&LED1_OUT ; Red led OFF, end of Slave TX - JMP SLEEP ; which calls RXON before goto sleep +;vvvvvvvvvvvvv OPTION vvvvvvvvvvvvvv; +; BIC.B #LED1,&LED1_DIR ; Red led OFF, +; BIC.B #LED1,&LED1_OUT ; end of Slave TX +;^^^^^^^^^^^^^ OPTION ^^^^^^^^^^^^^^; + JMP SLEEP ; which calls RXON before goto sleep ; ----------------------------------; ; **********************************; @@ -40,13 +174,17 @@ TERMINAL_INT ; <--- START interrupt vector, bus is stalle BIT #10h,&TERM_CTLW0 ;4 test UCTR JNZ SLEEP ; if I2C_Master RX, loop back to SLEEP POPM #4,IP ;6 POPM IP=ret_IP,W=src_end,T=0Ah,S=20h -; BIS.B #LED2,&LED2_OUT ; green led ON, start of Slave RX -; BIS.B #LED2,&LED2_DIR ; green led ON, start of Slave RX +;vvvvvvvvvvvvv OPTION vvvvvvvvvvvvvv; +; BIS.B #LED2,&LED2_OUT ; green led ON, +; BIS.B #LED2,&LED2_DIR ; start of Slave RX +;^^^^^^^^^^^^^ OPTION ^^^^^^^^^^^^^^; QNEWCHAR BIT #RX_TERM,&TERM_IFG ;3 test RX BUF IFG JZ QNEWCHAR ;2 wait RX BUF full - MOV.B &TERM_RXBUF,Y ;3 read char into Y, RX_IFG is cleared, bus unstalled by I2C_Slave - CMP.B T,Y ;1 - JZ ENDACCEPT ;2 jump if char = LF +; ----------------------------------; +AKEYREAD MOV.B &TERM_RXBUF,Y ;3 read char into Y, RX_IFG is cleared, bus unstalled by I2C_Slave +; ----------------------------------; + CMP.B T,Y ;1 char = LF ? + JZ LF_NEXT ;2 jump if char = LF CMP.B S,Y ;1 printable char ? JC ASTORETEST ;2 jump if char U>= BL ; ----------------------------------; @@ -66,50 +204,27 @@ ASTORETEST CMP W,TOS ; 1 end of buffer is reached ? ADD #1,TOS ; 1 increment dst_Ptr JMP QNEWCHAR ; ----------------------------------; -ENDACCEPT ; -- Org Ptr -; BIC.B #LED2,&LED2_DIR ; green led OFF, end of Slave RX -; BIC.B #LED2,&LED2_OUT ; green led OFF, end of Slave RX -; BIS.B #LED1,&LED1_DIR ; Red led ON, start of Slave TX -; BIS.B #LED1,&LED1_OUT ; Red led ON, start of Slave TX - CMP #0,&LINE ; - JZ ACCEPTEND ; - ADD #1,&LINE ; increment LINE if <> 0 -ACCEPTEND SUB @PSP+,TOS ; -- len' -; ----------------------------------; -; MOV #LPMx+GIE,&LPM_MODE ; no need to redefine LPM_MODE because I2C START works down to LPM4 mode -; ----------------------------------; - CALL #WAITCHAREND ; wait SCL held low, i.e. I2C_Master RX waits first char; - MOV @IP+,PC ; we want to synchronize Slave TX with Master RX before running INTERPRET -; **********************************; - -; ----------------------------------; -RXON ; send ctrl_char $00 as ACCEPT request -; ----------------------------------; - MOV.B #0,Y ; Y = ctrl_char $00 -; ----------------------------------; -CTRLCHARTX ; send Y = ctrl_char +LF_NEXT ; -- Org Ptr ; ----------------------------------; -CTRLCH_WAIT BIT #TX_TERM,&TERM_IFG ;3 - JZ CTRLCH_WAIT ;2 wait TX buffer empty - MOV.B Y,&TERM_TXBUF ; -WAITCHAREND BIT #40h,&TERM_STATW ; - JZ WAITCHAREND ; wait SCL held low by Master RX, i.e. I2C_Master RX processes this Ctrl_char -; ----------------------------------; -RXOFF MOV @RSP+,PC ; Calling RXOFF does nothing. -; ----------------------------------; - + SUB @PSP+,TOS ; -- len' ; ----------------------------------; -COLD MOV #5A4Fh,&WDTCTL ; start Watchdog Reset : XDTPW, WDTSSEL=VLOCLK, WDTCNTCL=1, WDTIS=2^6 (8ms) -; ----------------------------------; -COLD_TERM BIT #TX_TERM,&TERM_IFG ;3 - JZ COLD_TERM ;2 wait complete send of previous char -; ----------------------------------; -; send ctrl_char $03 (COLD request) ; -; ----------------------------------; - MOV.B #3,&TERM_TXBUF ; send ctrl_char $03 to I2C_Master which will execute QABORT_TERM - CALL #WAITCHAREND ; - MOV #0A504h,&PMMCTL0 ; performs BOR +; MOV #LPMx+GIE,&LPM_MODE ; no need to redefine LPM_MODE because I2C START works down to LPM4 mode +; ----------------------------------; after the sent of 'LF', I2C_Master automaticaly reSTARTs in RX mode: + CALL #WAITCHAREND ; wait I2C_Master (re)START RX +;vvvvvvvvvvvvv OPTION vvvvvvvvvvvvvv; +; BIC.B #LED2,&LED2_DIR ; green led OFF, +; BIC.B #LED2,&LED2_OUT ; end of Slave RX +; BIS.B #LED1,&LED1_DIR ; Red led ON, +; BIS.B #LED1,&LED1_OUT ; start of Slave TX +;^^^^^^^^^^^^^ OPTION ^^^^^^^^^^^^^^; +ACCEPT_EOL CMP #0,&LINE ; + JZ ACCEPT_END ; + ADD #1,&LINE ; if LINE <> 0 increment LINE +ACCEPT_END ; ----------------------------------; + MOV S,Y ; output a BL on TERMINAL (for the case of error occuring) + JMP YEMIT ; before interpret line +; **********************************; ; ------------------------------------------------------------------------------ ; TERMINAL I/O, input part @@ -121,8 +236,8 @@ KEY MOV @PC+,PC ; Code Field Address (CFA) of KEY PFAKEY .word BODYKEY ; Param Field Address (PFA) of KEY, with its default value BODYKEY SUB #2,PSP ; push old TOS.. MOV TOS,0(PSP) ; ..onto stack - MOV.B #1,Y ; send $01 to I2C_Master RX as KEY request - CALL #CTRLCHARTX ; + MOV.B #1,Y ; KEY request Ctrl_Char = $01 + CALL #I2C_CTRL_CH ; send it to I2C_Master to restart UART in RX mode BKEYLOOP BIT #RX_TERM,&TERM_IFG ; received char ? JZ BKEYLOOP ; wait char received MOV &TERM_RXBUF,TOS ; -- char @@ -138,26 +253,31 @@ EMIT MOV @PC+,PC ;3 Code Field Address (CFA) of EMIT PFAEMIT .word BODYEMIT ; Parameter Field Address (PFA) of EMIT, with its default value BODYEMIT MOV TOS,Y ;1 sends character to the default output TERMINAL MOV @PSP+,TOS ;2 -YEMIT1 -; BIT #10h,&TERM_CTLW0 ;4 test UCTR -; JZ YEMITEND -YEMIT2 BIT #TX_TERM,&TERM_IFG ;3 - JZ YEMIT2 ;2 wait TX buffer empty -YEMIT .word 4882h ;3 4882h = MOV Y,& +YEMIT BIT #TX_TERM,&TERM_IFG ;3 + JZ YEMIT ;2 wait TX buffer empty +QYEMIT .word 48C2h ;3 48C2h = MOV.B Y,& .word TERM_TXBUF ; YEMITEND MOV @IP+,PC ;4 11 words FORTHWORD "ECHO" ;Z ECHO -- connect EMIT to TERMINAL (default) -ECHO MOV #4882h,&YEMIT ; 4882h = MOV Y,& +ECHO MOV #48C2h,&QYEMIT ; 48C2h = MOV.B Y,& MOV #0,&LINE ; - MOV #5,Y ; tell I2C_Master to echo chars received from the TERMINAL -ECHOEND CALL #CTRLCHARTX + MOV #5,Y ; ECHO request Ctrl_Char = $05 +ECHOEND CALL #I2C_CTRL_CH ; send it to I2C_Master to do it echo char to TERMINAL MOV @IP+,PC FORTHWORD "NOECHO" ;Z NOECHO -- disconnect EMIT to TERMINAL -NOECHO MOV #NEXT,&YEMIT ; NEXT = 4030h = MOV @IP+,PC +NOECHO MOV #4D30h,&QYEMIT ; NEXT = 4D30h = MOV @IP+,PC MOV #1,&LINE ; - MOV #4,Y ; tell I2C_Master not to echo chars received from the TERMINAL - JMP ECHOEND + MOV #4,Y ; NOECHO request Ctrl_Char = $04 + JMP ECHOEND ; send it to I2C_Master, to not do it echo to TERMINAL + + FORTHWORD "OVER" +;https://forth-standard.org/standard/core/OVER +;C OVER x1 x2 -- x1 x2 x1 +OVER MOV TOS,-2(PSP) ; 3 -- x1 (x2) x2 + MOV @PSP,TOS ; 2 -- x1 (x2) x1 + SUB #2,PSP ; 1 -- x1 x2 x1 + MOV @IP+,PC ; 4 diff --git a/forthMSP430FR_TERM_UART.asm b/forthMSP430FR_TERM_UART.asm index bb94abe..32b81a9 100644 --- a/forthMSP430FR_TERM_UART.asm +++ b/forthMSP430FR_TERM_UART.asm @@ -1,56 +1,202 @@ ; -*- coding: utf-8 -*- - -; Fast Forth For Texas Instrument MSP430FRxxxx FRAM devices with UART TERMINAL -; Copyright (C) <2019> -; -; 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 . +; define run-time part of ABORT" +;Z ?ABORT xi f c-addr u -- abort & print msg. +; FORTHWORD "?ABORT" +QABORT CMP #0,2(PSP) ; -- f c-addr u test flag f + JNZ ABORT_TERM ; +THREEDROP ADD #4,PSP ; -- u + MOV @PSP+,TOS ; -- + MOV @IP+,PC ; +; ----------------------------------; +ABORT_TERM ; exit from downloading file then reinit some variables via INI_FORTH +; ----------------------------------; + CALL #RXON ; PFA resume downloading source file if any +A_UART_LOOP BIC #RX_TERM,&TERM_IFG ; clear RX_TERM + MOV &FREQ_KHZ,Y ; 1000, 2000, 4000, 8000, 16000, 240000 +A_USB_LOOPJ MOV #65,X ; 2~ <-------+ linux with minicom seems very very slow... +A_USB_LOOPI SUB #1,X ; 1~ <---+ | ==> ((65*3)+5)*1000 = 200ms delay + JNZ A_USB_LOOPI ; 2~ 3~ loop ---+ | to refill its USB buffer + SUB #1,Y ; 1~ | + JNZ A_USB_LOOPJ ; 2~ 200~ loop -----+ + BIT #RX_TERM,&TERM_IFG ; 4 new char in TERMRXBUF after A_USB_LOOPJ delay ? + JNZ A_UART_LOOP ; 2 yes, the input stream is still active: loop back + CALL #INI_FORTH ; common ?ABORT|RST, "hybrid" subroutine with return to FORTH interpreter +; ----------------------------------; + .word lit,LINE,FETCH ; -- f c-addr u line fetch line number before set ECHO ! + .word ECHO ; + .word XSQUOTE ; + .byte 4,27,"[7m" ; type ESC[7m (set reverse video) + .word TYPE ; + .word QDUP,QFBRAN ; don't display line if line = 0 (ECHO was ON) + .word ABORT_TYPE ; + .word XSQUOTE ; -- f c-addr u line c-addr1 u1 displays the line where error occured + .byte 15,"LAST.4TH, line " ; + .word TYPE ; -- f c-addr u line + .word UDOT ; -- f c-addr u +; ----------------------------------; +; Display ABORT|WARM message ; <== WARM jumps here +; ----------------------------------; +ABORT_TYPE .word TYPE ; -- f type abort message + .word XSQUOTE ; -- f c-addr u + .byte 4,27,"[0m" ; + .word TYPE ; -- f set normal video + .word ABORT ; without return +; ----------------------------------; + +; ----------------------------------; +COLD_TERM ; default STOP_APP: wait TERMINAL idle +; ----------------------------------; +UART_COLD_TERM ; + BIT #1,&TERM_STATW ;3 uart busy ? + JNZ COLD_TERM ;2 loop back while TERM_UART is busy + MOV @RSP+,PC ; return to software_BOR +; ----------------------------------; + +; ----------------------------------; +INIT_TERM ; TOS = RSTIV_MEM +; ----------------------------------; +UART_INIT_TERM ; + CMP #2,TOS ; + JNC UART_INIT_TERM_END ; no INIT_TERM if RSTIV_MEM U< 2 (WARM) +; ----------------------------------; + MOV #0081h,&TERM_CTLW0 ; UC SWRST + UCLK = SMCLK + MOV &TERMBRW_RST,&TERM_BRW ; init value in FRAM + MOV &TERMMCTLW_RST,&TERM_MCTLW ; init value in FRAM + BIS.B #BUS_TERM,&TERM_SEL ; Configure pins TERM_UART|TERM_I2C + BIC #1,&TERM_CTLW0 ; release UC_TERM from reset... + BIS #WAKE_UP,&TERM_IE ; then enable interrupt for wake up on terminal input + BIC #LOCKLPM5,&PM5CTL0 ; activate all previous I/O settings. +UART_INIT_TERM_END + MOV @RSP+,PC ; RET +; ----------------------------------; + + +; ----------------------------------; +RXON ; default BACKGND_APP +; ----------------------------------; +UART_RXON JMP RXON_EXE ; Software and/or hardware flow control, to start Terminal UART for one line +; ----------------------------------; + +; ----------------------------------; +RXOFF ; Software and/or hardware flow control, to stop Terminal UART comunication +; ----------------------------------; +UART_RXOFF ; + .IFDEF TERMINAL3WIRES ; first software flow control +RXOFF_LOOP BIT #TX_TERM,&TERM_IFG ;3 wait the sending of last char + JZ RXOFF_LOOP ;2 + MOV #19,&TERM_TXBUF ;4 move XOFF char into TX_buf + .ENDIF ; + .IFDEF TERMINAL4WIRES ; and hardware flow control after + BIS.B #RTS,&HANDSHAKOUT ;3 set RTS high + .ENDIF ; + MOV @RSP+,PC ;4 to CR_NEXT, ...or user defined +; ----------------------------------; ; ----------------------------------; -; ACCEPT part I prepare TERMINAL_INT; +RXON_EXE +; ----------------------------------; + .IFDEF TERMINAL3WIRES ; first software flow control +RXON_LOOP BIT #TX_TERM,&TERM_IFG ;3 wait the sending of last char, useless at high baudrates + JZ RXON_LOOP ;2 + MOV #17,&TERM_TXBUF ;4 move char XON into TX_buf + .ENDIF ; + .IFDEF TERMINAL4WIRES ; and hardware flow control after + BIC.B #RTS,&HANDSHAKOUT ;3 set RTS low + .ENDIF ; + MOV @RSP+,PC ;4 to BACKGND (End of file download or quiet input) or AKEYREAD... +; ----------------------------------; ... (get next line of file downloading), or user defined + + +;=============================================================================== + FORTHWORD "WIPE" ; software DEEP_RESET +;=============================================================================== + MOV #-1,&RSTIV_MEM ; negative value ==> DEEP_RESET + JMP COLD + +;=============================================================================== + FORTHWORD "COLD" +;=============================================================================== +;Z COLD -- performs a software RESET +; as pin RST is replaced by pin NMI, RESET by pin activation is redirected here via USER NMI vector +; that allows actions to be performed before executing software BOR. +COLD CALL @PC+ ; COLD first calls STOP_APP, in this instance: CALL #COLD_TERM by default +PFACOLD .word COLD_TERM ; INI_COLD_DEF: default value set by WIPE. see forthMSP430FR_TERM_xxxx.asm + BIT.B #IO_WIPE,&WIPE_IN ; hardware Deep_RESET request (low) ? + JNZ COLDEXE ; no + MOV #-1,&RSTIV_MEM ; yes, set negative value to force DEEP_RESET +COLDEXE MOV #0A504h,&PMMCTL0 ; performs software_BOR, see RESET in forthMSP430FR.asm +; ----------------------------------; + +;=============================================================================== + FORTHWORD "WARM" +;=============================================================================== +;Z WARM xi -- ; the next of RESET +WARM ; +;------------------------------------------------------------------------------- +; RESET 6.2: if RSTIV_MEM <> WARM, init TERM and enable I/O +;------------------------------------------------------------------------------- + CALL @PC+ ; init TERM, only if TOS U>= 2 (RSTIV_MEM <> WARM) + .IFNDEF SD_CARD_LOADER ; +PFAWARM .word INIT_TERM ; INI_HARD_DEF: default value, init TERM UC, unlock I/O's, TOS = RSTIV_MEM + .ELSE +PFAWARM .word INIT_SD ; INI_HARD_SD : init TERM first then init SD Card + .ENDIF ; TOS = RSTIV_MEM +;------------------------------------------------------------------------------- +; END OF RESET +;------------------------------------------------------------------------------- + ASMtoFORTH ; display a message then goto QUIT, without return + .word XSQUOTE + .byte 7,13,10,27,"[7m#" ; CR + cmd "reverse video" + # + .word TYPE + .word DOT ; display TOS = RSTIV_MEM value + .word XSQUOTE + .byte 25,"FastForth ©J.M.Thoorens " + .word TYPE + .word LIT,FRAM_FULL,HERE,MINUS,UDOT + .word XSQUOTE + .byte 10,"bytes free" + .word BRAN,ABORT_TYPE +; ----------------------------------; + +;------------------------------------------------------------------------------- +; INTERPRETER INPUT +;------------------------------------------------------------------------------- + FORTHWORD "ACCEPT" +;https://forth-standard.org/standard/core/ACCEPT +;C ACCEPT addr addr len -- addr len' from REFILL, get line at addr to interpret len' chars +ACCEPT MOV @PC+,PC ;3 Code Field Address (CFA) of ACCEPT +PFAACCEPT .word BODYACCEPT ; Parameter Field Address (PFA) of ACCEPT +BODYACCEPT ; BODY of ACCEPT = default execution of ACCEPT +; ----------------------------------; +; ACCEPT part I prepare TERMINAL_INT; this version allows to RX one char (LF) after sending XOFF ; ----------------------------------; MOV TOS,Y ;1 -- addr len MOV @PSP,TOS ;2 -- org ptr - ADD TOS,Y ;1 -- org ptr Y = buf_end - MOV #0Dh,X ;2 X = 'CR' to speed up char loop in part II - MOV #20h,W ;2 W = 'BL' to speed up char loop in part II - MOV #AYEMIT_RET,T ;2 T = return for YEMIT - MOV #ENDACCEPT,S ;2 S = XOFF_ret - PUSHM #6,IP ;5 PUSHM IP,S,T,W,X,Y r-- ACCEPT_ret XOFF_ret yemit_ret BL CR buf_end + ADD TOS,Y ;1 -- org ptr Y = buf_end ) + MOV #0Dh,X ;2 X = 'CR' to speed up char loop in part II ) + MOV #20h,W ;2 W = 'BL' to speed up char loop in part II > + MOV #YEMIT_NEXT,T ;2 T = return for QYEMIT ) + MOV #CR_NEXT,S ;2 S = CR_NEXT ) + PUSHM #6,IP ;8 PUSHM IP,S,T,W,X,Y r-- ACCEPT_ret CR_NEXT YEMIT_NEXT BL CR buf_end JMP SLEEP ;2 which calls RXON before falling down to LPMx mode ; ----------------------------------; ; **********************************; 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' +; ACCEPT part II under interrupt ; Org Ptr -- len' +; ----------------------------------; + ADD #4,RSP ;1 remove SR and PC from stack, cleared flags: V SCG1 OSCOFF CPUOFF GIE N Z C + POPM #4,IP ;6 POPM W=buffer_bound, T=0Dh, S=20h, IP=YEMIT_NEXT r-- ACCEPT_ret CR_NEXT ; ----------------------------------; - ADD #4,RSP ;1 remove SR and PC from stack, SR flags are lost (unused by FORTH interpreter) - POPM #4,IP ;6 POPM W=buffer_bound, T=0Dh, S=20h, IP=AYEMIT_RET r-- ACCEPT_ret XOFF_ret -; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv; -; starts the 2th stopwatch ; -; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^; AKEYREAD MOV.B &TERM_RXBUF,Y ;3 read character into Y, RX_TERM is cleared -; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv; -; stops the 3th stopwatch ; 3th bottleneck result : 17~ + LPMx wake_up time ( + 5~ XON loop if F/Bds<230400 ) -; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^; -AKEYREAD1 CMP.B S,Y ;1 printable char ? - JC ASTORETEST ;2 yes +; ----------------------------------; CMP.B T,Y ;1 CR ? - JZ RXOFF ;2 then RET to ENDACCEPT -; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv;+ 4 to send RXOFF -; stops the first stopwatch ;= first bottleneck, best case result: 27~ + LPMx wake_up time.. -; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^; ...or 14~ in case of empty line + JZ RXOFF ;2 then RET to CR_NEXT + CMP.B S,Y ;1 printable char ? + JC ASTORETEST ;2 yes +; ----------------------------------; CMP.B #8,Y ;1 char = BS ? JNE WAITaKEY ;2 case of other control chars ; ----------------------------------; @@ -59,93 +205,51 @@ AKEYREAD1 CMP.B S,Y ;1 printable char ? CMP @PSP,TOS ; Ptr = Org ? JZ WAITaKEY ; yes: do nothing SUB #1,TOS ; no : dec Ptr - JMP ASTOREEND ; don't store BS -; ----------------------------------; -; end of backspace ; + JMP YEMIT ; don't store BS ; ----------------------------------; ASTORETEST CMP W,TOS ; 1 Bound is reached ? - JZ YEMIT1 ; 2 yes: send echo then loopback - MOV.B Y,0(TOS) ; 3 no: store char @ Ptr, send echo then loopback + JZ YEMIT ; 2 yes: don't store char @ Ptr + MOV.B Y,0(TOS) ; 3 no: store char @ Ptr ADD #1,TOS ; 1 increment Ptr -ASTOREEND ; ----------------------------------; - .IFNDEF HALFDUPLEX -YEMIT1 BIT #TX_TERM,&TERM_IFG ; 3 wait the sending end of previous char, useless at high baudrates - JZ YEMIT1 ; 2 but there's no point in wanting to save time here: +YEMIT BIT #TX_TERM,&TERM_IFG ; 3 wait the sending end of previous char, useless at high baudrates, + JZ YEMIT ; 2 but there's no point in wanting to save time here: .IFDEF TERMINAL5WIRES ; -YEMIT2 BIT.B #CTS,&HANDSHAKIN ; 3 - JNZ YEMIT2 ; 2 +YEMIT1 BIT.B #CTS,&HANDSHAKIN ; 3 CTS is pulled low if unwired. + JNZ YEMIT1 ; 2 .ENDIF ; -YEMIT .word 4882h ; 4882h = MOV Y,& +QYEMIT .word 48C2h ; 48C2h = MOV.B Y,& .word TERM_TXBUF ; 3 MOV @IP+,PC ; 4 ; ----------------------------------; -AYEMIT_RET .word $+2 ; 0 YEMII NEXT address - SUB #2,IP ; 1 restore AYEMIT_RET +YEMIT_NEXT .word $+2 ; 0 YEMII NEXT address + SUB #2,IP ; 1 restore YEMIT_NEXT ; ----------------------------------; - .ELSE -AYEMIT_RET - .ENDIF ; HALDUPLEX WAITaKEY BIT #RX_TERM,&TERM_IFG ; 3 new char in TERMRXBUF ? - JNZ AKEYREAD ; 2 yes - JZ WAITaKEY ; 2 no -; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv; -; stops the 2th stopwatch ; best case result: 26~/22~ (with/without echo) ==> 385/455 kBds/MHz -; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^; - -; ----------------------------------; -; return of RXOFF + JNZ AKEYREAD ; 2 yes, loop = 34~/31~ by char (with/without echo) ==> 294/322 kBds/MHz + JMP WAITaKEY ; 2 no ; ----------------------------------; -ENDACCEPT CMP #0,&LINE ; --- Org Ptr r-- ACCEPT_ret - JZ ENDACCEPT1 ; - ADD #1,&LINE ; if LINE <> 0 increment LINE -ENDACCEPT1 SUB @PSP+,TOS ; -- len' - MOV @RSP+,IP ; 2 return to INTERPRET with GIE=0: FORTH is protected against any interrupt... -; ----------------------------------; - MOV #LPM0+GIE,&LPM_MODE ; reset LPM_MODE to default mode LPM0 for next line of input stream -; ----------------------------------; -WAITLF BIT #1,&TERM_IFG ; - JZ WAITLF ; - MOV.B &TERM_RXBUF,Y ; to clear RX_int flag after LF received -; ----------------------------------; - MOV @IP+,PC ; -- org len -; **********************************; 61 words ; ----------------------------------; -RXON ; Software and/or hardware flow control, to start Terminal UART communication +; return of RXOFF ; --- Org Ptr r-- ACCEPT_NEXT ; ----------------------------------; - .IFDEF TERMINAL3WIRES ; first software flow control -RXON_LOOP BIT #TX_TERM,&TERM_IFG ;3 wait the sending of last char, useless at high baudrates - JZ RXON_LOOP ;2 - MOV #17,&TERM_TXBUF ;4 move char XON into TX_buf - .ENDIF ; - .IFDEF TERMINAL4WIRES ; and hardware flow control after - BIC.B #RTS,&HANDSHAKOUT ;3 set RTS low - .ENDIF ; - MOV @RSP+,PC ;4 to BACKGND (End of file download or quiet input) or AKEYREAD1... -; ----------------------------------; ... (get next line of file downloading), or user defined - -; ----------------------------------; -RXOFF ; Software and/or hardware flow control, to stop Terminal UART comunication +CR_NEXT SUB @PSP+,TOS ; -- len' + MOV @RSP+,IP ; ; ----------------------------------; - .IFDEF TERMINAL3WIRES ; first software flow control -RXOFF_LOOP BIT #TX_TERM,&TERM_IFG ;3 wait the sending of last char - JZ RXOFF_LOOP ;2 - MOV #19,&TERM_TXBUF ;4 move XOFF char into TX_buf - .ENDIF ; - .IFDEF TERMINAL4WIRES ; and hardware flow control after - BIS.B #RTS,&HANDSHAKOUT ;3 set RTS high - .ENDIF ; - MOV @RSP+,PC ;4 to ENDACCEPT, ...or user defined + MOV #LPM0+GIE,&LPM_MODE ; reset LPM_MODE to default mode LPM0 for next line of input stream ; ----------------------------------; - -; ----------------------------------; to avoid any lock out, watchdog RST is configured first. -COLD MOV #5A4Fh,&WDTCTL ; start Watchdog Reset : XDTPW, WDTSSEL=VLOCLK, WDTCNTCL=1, WDTIS=2^6 (8ms) +WAITLF BIT #RX_TERM,&TERM_IFG ; char 'LF' is received ? + JZ WAITLF ; no + MOV.B &TERM_RXBUF,Y ; yes, clear RX_int flag after LF received ; ----------------------------------; -COLD_TERM BIT #1,&TERM_STATW ;3 to stop correctly TX to TERMINAL in progress - JNZ COLD_TERM ;2 loop back while TERM_UART is busy - MOV #0A504h,&PMMCTL0 ; performs BOR +ACCEPT_EOL CMP #0,&LINE ; if LINE <> 0 increment LINE + JZ ACCEPT_END ; + ADD #1,&LINE ; +ACCEPT_END ; ----------------------------------; + MOV S,Y ; output a BL on TERMINAL (for the case of error occuring) + JMP YEMIT ; before return to ABORT to interpret line +; **********************************; UF9 to UF11 are reset. ; ------------------------------------------------------------------------------ ; TERMINAL I/O, input part @@ -174,28 +278,16 @@ EMIT MOV @PC+,PC ;4 Code Field Address (CFA) of EMIT PFAEMIT .word BODYEMIT ; Parameter Field Address (PFA) of EMIT, with its default value BODYEMIT MOV TOS,Y ;1 output character to the default output: TERMINAL MOV @PSP+,TOS ;2 - .IFNDEF HALFDUPLEX - JMP YEMIT1 ;2 + 12~ - .ELSE -YEMIT1 BIT #TX_TERM,&TERM_IFG ; 3 wait the sending end of previous char, useless at high baudrates - JZ YEMIT1 ; 2 - .IFDEF TERMINAL5WIRES ; -YEMIT2 BIT.B #CTS,&HANDSHAKIN ; - JNZ YEMIT2 - .ENDIF -YEMIT .word 4882h ; hi7/4~ lo:12/4~ send/send_not echo to terminal - .word TERM_TXBUF ; 3 MOV Y,&TERMTXBUF - MOV @IP+,PC ; - .ENDIF + JMP YEMIT ;2 + 12~ FORTHWORD "ECHO" ;Z ECHO -- connect terminal output (default) -ECHO MOV #4882h,&YEMIT ; 4882h = MOV Y,& +ECHO MOV #48C2h,&QYEMIT ; 48C2h = MOV.B Y,& MOV #0,&LINE ; MOV @IP+,PC FORTHWORD "NOECHO" ;Z NOECHO -- disconnect terminal output -NOECHO MOV #NEXT,&YEMIT ; NEXT = 4030h = MOV @IP+,PC +NOECHO MOV #4D30h,&QYEMIT ; NEXT = 4D30h = MOV @IP+,PC MOV #1,&LINE ; MOV @IP+,PC diff --git a/inc/CHIPSTICK_FR2433.asm b/inc/CHIPSTICK_FR2433.asm index 208dbb1..da9ae18 100644 --- a/inc/CHIPSTICK_FR2433.asm +++ b/inc/CHIPSTICK_FR2433.asm @@ -356,17 +356,12 @@ RTS .equ 4 ; P3.2 ; MOV #0100h,&CSCTL4 ; ACLOCK select REFO, MCLK & SMCLK select DCOCLKDIV (default value) .ENDIF - BIS &SYSRSTIV,&SAVE_SYSRSTIV; store volatile SYSRSTIV preserving a pending request for DEEP_RST -; MOV &SAVE_SYSRSTIV,TOS ; -; CMP #2,TOS ; POWER ON ? -; JZ ClockWaitX ; yes -; RRUM #1,X ; wait only 250 ms -ClockWaitX MOV #5209,Y ; wait 0.5s before starting after POR +ClockWaitX MOV #4375,Y ; wait 0.42s before starting after POR ; ...because FLL lock time = 280 ms ClockWaitY SUB #1,Y ;1 - JNZ ClockWaitY ;2 5209x3 = 15625 cycles delay = 15.625ms @ 1MHz - SUB #1,X ; x 32 @ 1 MHZ = 500ms - JNZ ClockWaitX ; time to stabilize power source ( 500ms ) + JNZ ClockWaitY ;2 4375x3 = 13125 cycles delay = 13.125ms @ 1MHz + SUB #1,X ; x 32 @ 1 MHZ = 330ms + JNZ ClockWaitX ; ;WAITFLL BIT #300h,&CSCTL7 ; wait FLL lock ; JNZ WAITFLL diff --git a/inc/FastForthREGtoTI.pat b/inc/FastForthREGtoTI.pat index 16f24a0..4f6645f 100644 --- a/inc/FastForthREGtoTI.pat +++ b/inc/FastForthREGtoTI.pat @@ -53,6 +53,43 @@ T\{=T\{! U\.R=U\.R! +! ASCII numbers interpreter complement +\'NUL\'=\$00! +\'SOH\'=\$01! +\'STX\'=\$02! +\'ETX\'=\$03! +\'EOT\'=\$04! +\'ENQ\'=\$05! +\'ACK\'=\$06! +\'BEL\'=\$07! +\'BS\'=\$08! Backspace +\'HT\'=\$09! Horizontal Tabulation +\'LF\'=\$0A! +\'VT\'=\$0B! +\'FF\'=\$0C! +\'CR\'=\$0D! +\'SO\'=\$0E! +\'SI\'=\$0F! +\'DLE\'=\$10! +\'DC1\'=\$11! XON +\'DC2\'=\$12! +\'DC3\'=\$13! XOFF +\'DC4\'=\$14! +\'NAK\'=\$15! +\'SYN\'=\$16! +\'ETB\'=\$17! +\'CAN\'=\$18! +\'EM\'=\$19! +\'SUB\'=\$1A! +\'ESC\'=\$1B! +\'FS\'=\$1C! +\'GS\'=\$1D! +\'RS\'=\$1E! +\'US\'=\$1F! +\'SP\'=\$20! +\'\'\'=\$27!' QNUMBER can't interpret ''' ! +\'DEL\'=\$7F! + \(RTS\)=\(RTS\)! \(CTS\)=\(CTS\)! @@ -115,6 +152,3 @@ 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 -DOVAR=\$1287! \ CALL rDOVAR -DOCON=\$1286! \ CALL rDOCON -DODOES=\$1285! \ CALL rDODOES diff --git a/inc/LP_MSP430FR2476.asm b/inc/LP_MSP430FR2476.asm index d6fd057..d6c9a0a 100644 --- a/inc/LP_MSP430FR2476.asm +++ b/inc/LP_MSP430FR2476.asm @@ -211,7 +211,6 @@ CTS .equ 4 ; P6.2 ; ---------------------------------------------------------------------- ; FRAM config ; ---------------------------------------------------------------------- - .IF FREQUENCY > 8 MOV.B #0A5h,&FRCTL0_H ; enable FRCTL0 access MOV.B #10h,&FRCTL0 ; 1 waitstate @ 16 MHz @@ -221,7 +220,6 @@ CTS .equ 4 ; P6.2 ; ---------------------------------------------------------------------- ; POWER ON RESET SYS config ; ---------------------------------------------------------------------- - ; SYS code ; BIC #1,&SYSCFG0 ; enable write program in FRAM MOV #0A500h,&SYSCFG0 ; enable write MAIN and INFO @@ -229,7 +227,6 @@ CTS .equ 4 ; P6.2 ; ---------------------------------------------------------------------- ; POWER ON RESET AND INITIALIZATION : CLOCK SYSTEM ; ---------------------------------------------------------------------- - ; CS code for MSP430FR2476 ; to measure REFO frequency, output ACLK on P2.2: @@ -237,8 +234,8 @@ CTS .equ 4 ; P6.2 ; BIS.B #4,&P2DIR ; result : REFO = xx.xx kHz +; ===================================== .IF FREQUENCY = 0.5 - ; MOV #058h,&CSCTL0 ; preset DCO = measured value @ 0x180 (88) ; MOV #0001h,&CSCTL1 ; Set 1MHZ DCORSEL,disable DCOFTRIM,Modulation MOV #1ED1h,&CSCTL0 ; preset MOD=31, DCO = measured value @ 0x180 (209) @@ -251,10 +248,7 @@ CTS .equ 4 ; P6.2 MOV #100Fh,&CSCTL2 ; Set FLLD=1 (DCOCLKCDIV=DCO/2),set FLLN=0Fh ; fCOCLKDIV = 32768 x (15+1) = 0.524 MHz ; measured : MHz ; ===================================== - MOV #8,X - .ELSEIF FREQUENCY = 1 - ; MOV #100h,&CSCTL0 ; preset DCO = 256 ; MOV #00B1h,&CSCTL1 ; Set 1MHZ DCORSEL,enable DCOFTRIM=3h ,disable Modulation MOV #1EFFh,&CSCTL0 ; preset MOD=31, DCO=255 @@ -267,10 +261,7 @@ CTS .equ 4 ; P6.2 ; MOV #001Fh,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=1Fh ; fCOCLKDIV = 32768 x (31+1) = 1.049 MHz ; measured : 1.046MHz ; ===================================== - MOV #16,X - .ELSEIF FREQUENCY = 2 - ; MOV #100h,&CSCTL0 ; preset DCO = 256 ; MOV #00B3h,&CSCTL1 ; Set 2MHZ DCORSEL,enable DCOFTRIM=3h ,disable Modulation MOV #1EFFh,&CSCTL0 ; preset MOD=31, DCO=255 @@ -283,10 +274,7 @@ CTS .equ 4 ; P6.2 ; MOV #003Dh,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=3Dh ; fCOCLKDIV = 32768 x (61+1) = 2.031 MHz ; measured : MHz ; ===================================== - MOV #32,X - .ELSEIF FREQUENCY = 4 - ; MOV #100h,&CSCTL0 ; preset DCO = 256 ; MOV #00B5h,&CSCTL1 ; Set 4MHZ DCORSEL,enable DCOFTRIM=3h ,disable Modulation MOV #1EFFh,&CSCTL0 ; preset MOD=31, DCO=255 @@ -294,17 +282,12 @@ CTS .equ 4 ; P6.2 ; ===================================== ; fCOCLKDIV = REFO x (FLLN+1) ; MOV #0078h,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=78h ; fCOCLKDIV = 32768 x (120+1) = 3.965 MHz ; measured : 3.96MHz - MOV #0079h,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=79h ; fCOCLKDIV = 32768 x (121+1) = 3.997 MHz ; measured : 3.99MHz - ; MOV #007Ah,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=7Ah ; fCOCLKDIV = 32768 x (122+1) = 4.030 MHz ; measured : 4.020MHz ; ===================================== - MOV #64,X - .ELSEIF FREQUENCY = 8 - ; MOV #100h,&CSCTL0 ; preset DCO = 256 ; MOV #00B7h,&CSCTL1 ; Set 8MHZ DCORSEL,enable DCOFTRIM=3h ,disable Modulation MOV #1EFFh,&CSCTL0 ; preset MOD=31, DCO=255 @@ -316,18 +299,13 @@ CTS .equ 4 ; P6.2 ; fCOCLKDIV = 32768 x (243+1) = 7.995 MHz ; measured : 7.976MHz MOV #00F4h,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=F4h ; fCOCLKDIV = 32768 x (244+1) = 8.028 MHz ; measured : 8.009MHz - ; MOV #00F5h,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=F5h ; fCOCLKDIV = 32768 x (245+1) = 8.061 MHz ; measured : 8.042MHz - ; MOV #00F8h,&CSCTL2 ; don't work with cp2102 (by low value) ; MOV #00FAh,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=FAh ; ===================================== - MOV #128,X - .ELSEIF FREQUENCY = 12 - ; MOV #100h,&CSCTL0 ; preset DCO = 256 ; MOV #00B9h,&CSCTL1 ; Set 12MHZ DCORSEL,enable DCOFTRIM=3h ,disable Modulation MOV #1EFFh,&CSCTL0 ; preset MOD=31, DCO=255 @@ -342,10 +320,7 @@ CTS .equ 4 ; P6.2 ; MOV #016Fh,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=1E9h ; fCOCLKDIV = 32768 x 367+1) = 12.058 MHz ; measured : 12.xxxMHz ; ===================================== - MOV #192,X - .ELSEIF FREQUENCY = 16 - ; MOV #100h,&CSCTL0 ; preset DCO = 256 ; MOV #00BBh,&CSCTL1 ; Set 16MHZ DCORSEL,enable DCOFTRIM=3h ,disable Modulation MOV #1EFFh,&CSCTL0 ; preset MOD=31, DCO=255 @@ -360,37 +335,22 @@ CTS .equ 4 ; P6.2 ; MOV #01E9h,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=1E9h ; fCOCLKDIV = 32768 x 489+1) = 16.056 MHz ; measured : 16.02MHz ; ===================================== - MOV #256,X - .ELSEIF .error "bad frequency setting, only 0.5,1,2,4,8,12,16 MHz" .ENDIF - .IFDEF LF_XTAL ; MOV #0000h,&CSCTL3 ; FLL select XT1, FLLREFDIV=0 (default value) MOV #0000h,&CSCTL4 ; ACLOCK select XT1, MCLK & SMCLK select DCOCLKDIV - BIS.B #03,&P2SEL0 ; P2.0 as XOUT, P2.1 as XIN - .ELSE BIS #0010h,&CSCTL3 ; FLL select REFCLOCK MOV #0200h,&CSCTL4 ; ACLOCK select VLOCLK, MCLK & SMCLK select DCOCLKDIV (default value) - .ENDIF - BIS &SYSRSTIV,&SAVE_SYSRSTIV; store volatile SYSRSTIV preserving a pending request for DEEP_RST -; MOV &SAVE_SYSRSTIV,TOS ; -; CMP #2,TOS ; POWER ON ? -; JZ ClockWaitX ; yes -; RRUM #1,X ; wait only 250 ms -ClockWaitX MOV #5209,Y ; wait 0.5s before starting after POR - ; ...because FLL lock time = 280 ms + MOV #92,X ; 96* 3 ms = 288 ms delay, because FLL lock time = 200 ms +ClockWaitX MOV &FREQ_KHZ,Y ; ClockWaitY SUB #1,Y ;1 - JNZ ClockWaitY ;2 5209x3 = 15625 cycles delay = 15.625ms @ 1MHz - SUB #1,X ; x 32 @ 1 MHZ = 500ms - JNZ ClockWaitX ; time to stabilize power source ( 500ms ) - -;WAITFLL BIT #300h,&CSCTL7 ; wait FLL lock -; JNZ WAITFLL - + JNZ ClockWaitY ;2 FREQ_KHZ x 3 ==> 3ms + SUB #1,X ; + JNZ ClockWaitX ; diff --git a/inc/MSP430FR2355.inc b/inc/MSP430FR2355.inc index 6a5cf49..14b1478 100644 --- a/inc/MSP430FR2355.inc +++ b/inc/MSP430FR2355.inc @@ -1,5 +1,8 @@ ; MSP430fr2355.inc ; MSP430FR2355 minimal declarations for FastForth usage + .save + .listing off + DEVICE = "MSP430FR2355" FR2_FAMILY @@ -389,5 +392,3 @@ SD_IFG .equ eUSCI_B1_SFR + 2Ch ; USCI_B1 Interrupt Flags Register RX_SD .equ 1 TX_SD .equ 2 .ENDIF ;UCB1_SD - - diff --git a/inc/MSP430FR2355.pat b/inc/MSP430FR2355.pat index b3c23f6..eeb04a1 100644 --- a/inc/MSP430FR2355.pat +++ b/inc/MSP430FR2355.pat @@ -46,22 +46,48 @@ INFO_LEN=\$0200! ! ---------------------------------------------- ! FastForth INFO ! ---------------------------------------------- -INI_THREAD=\$1800! .word THREADS -TERMBRW_RST=\$1802! .word TERMBRW_RST -TERMMCTLW_RST=\$1804! .word TERMMCTLW_RST -FREQ_KHZ=\$1806! .word FREQUENCY - -SAVE_SYSRSTIV=\$1808! to enable SYSRSTIV read -LPM_MODE=\$180A! LPM0+GIE is the default mode -INIDP=\$180C! define RST_STATE, init by wipe -INIVOC=\$180E! define RST_STATE, init by wipe -VERSION=\$1810! +FREQ_KHZ=\$1800! FREQUENCY (in kHz) +TERMBRW_RST=\$1802! TERMBRW_RST +TERMMCTLW_RST=\$1804! TERMMCTLW_RST +I2CSLAVEADR=\$1802! I2C_SLAVE address +I2CSLAVEADR1=\$1804! +LPM_MODE=\$1806! LPM_MODE value, LPM0+GIE is the default value +RSTIV_MEM=\$1808! SYSRSTIV memory, set to -1 to do Deep RESET +RST_DP=\$180A! RST value for DP +RST_VOC=\$180C! RST value for VOClink +VERSION=\$180E! +THREADS=\$1810! THREADS KERNEL_ADDON=\$1812! -RXON=\$1814! -RXOFF=\$1816! -ReadSectorWX=\$1818! call with W = SectorLO X = SectorHI -WriteSectorWX=\$181A! call with W = SectorLO X = SectorHI -TERMINAL_INT=\$181C! value for TERMINAL vector + +WIPE_INI_=\$1814! MOV #WIPE_INI,X +WIPE_COLD=\$1814! WIPE value for PFA_COLD +WIPE_INI_FORTH=\$1816! WIPE value for PFA_INI_FORTH +WIPE_SLEEP=\$1818! WIPE value for PFA_SLEEP +WIPE_WARM=\$181A! WIPE value for PFA_WARM +WIPE_TERM_INT=\$181C! WIPE value for TERMINAL vector +WIPE_DP=\$182E! WIPE value for RST_DP +WIPE_VOC=\$1820! WIPE value for RST_VOC + +INI_FORTH_INI=\$1822! MOV #INI_FORTH_INI,X \ >BODY instruction of INI_FORTH subroutine +INIT_ACCEPT=\$1822! WIPE value for PFAACCEPT +INIT_CR=\$1824! WIPE value for PFACR +INIT_EMIT=\$1826! FORTH value for PFAEMIT +INIT_KEY=\$1828! WIPE value for PFAKEY +INIT_CIB=\$182A! WIPE value for CIB_ADR +HALF_FORTH_INI=\$182C! to preserve the state of DEFERed words, used by user INI_SOFT_APP as: +! ADD #4,0(RSP) \ skip INI_FORTH >BODY instruction "MOV #INI_FORTH_INI,X" +! MOV #HALF_FORTH_INI,X \ replace it by "MOV #HALF_FORTH_INI,X" +! MOV @RSP+,PC \ then RET +INIT_DOCOL=\$182C! FORTH value for rDOCOL (R4) +INIT_DODOES=\$182E! FORTH value for rDODOES (R5) +INIT_DOCON=\$1830! FORTH value for rDOCON (R6) +INIT_DOVAR=\$1832! FORTH value for rDOVAR (R7) +INIT_CAPS=\$1834! FORTH value for CAPS +INIT_BASE=\$1836! FORTH value for BASE + +ABORT_ADR=\$1838! ABORT address +QUIT4_ADR=\$183A! QUIT4 used by BOOTLOADER +! free EPROM ! ============================================ ! FRAM TLV @@ -243,34 +269,49 @@ SD_LEN=\$16E! ! ============================================ ! FRAM MAIN ! ============================================ -MAIN_ORG=\$8000! Code space start - -SLEEP=\$8000! -BODYSLEEP=\$8004! -LIT=\$800E! -NEXT_ADR=\$8016! -XSQUOTE=\$8018! -HEREADR=\$802C! -QTBRAN=\$8038! -BRAN=\$803E! -QFBRAN=\$8042! -SKIPBRAN=\$8048! -XDO=\$804C! -XPLOOP=\$805C! -XLOOP=\$806E! -MUSMOD=\$8074! 32/16 unsigned division -MDIV1=\$808E! input for 48/16 unsigned division -SETIB=\$80BA! Set Input Buffer with org len values, reset >IN -REFILL=\$80CA! accept one line from input and leave org len of input buffer -CIB_ADR=\$80D8! contents currently TIB_ORG; may be redirected to SDIB_ORG -XDODOES=\$80E2! restore rDODOES: MOV #XDODOES,rDODOES -XDOCON=\$80F0! restore rDOCON: MOV #XDOCON,rDOCON -XDOCOL=\$80FC! restore rDOCOL: MOV #XDOCOL,rDOCOL only for DTC model = 1 - -! to find DTC value, download \MSP430-FORTH\FastForthSpecs.4th -! if DTC = 1, restore rDOCOL as this : MOV #xdocol,rDOCOL -! if DTC = 2, restore rDOCOL as this : MOV #EXIT,rDOCOL -! if DTC = 3, nothing to do, R7 is free for use. +MAIN_ORG=\$8000! Code space start + +SLEEP=\$8000! CODE_WITHOUT_RETURN: CPU shutdown +LIT=\$800A! CODE compiled by LITERAL +XSQUOTE=\$8014! CODE compiled by S" and S_ +HEREXEC=\$8028! CODE HERE and BEGIN execute address +QFBRAN=\$8034! CODE compiled by IF UNTIL +BRAN=\$803A! CODE compiled by ELSE REPEAT AGAIN +NEXT_ADR=\$803C! CODE NEXT instruction (MOV @IP+,PC) +XDO=\$803E! CODE compiled by DO +XPLOOP=\$804E! CODE compiled by +LOOP +XLOOP=\$8060! CODE compiled by LOOP +MUSMOD=\$8066! ASM 32/16 unsigned division, used by ?NUMBER, UM/MOD +MDIV1DIV2=\$8078! ASM input for 48/16 unsigned division with DVDhi=0, see DOUBLE M*/ +MDIV1=\$8080! ASM input for 48/16 unsigned division, see DOUBLE M*/ +RET_ADR=\$80AA! ASM content of INI_FORTH_PFA and MARKER+8 definitions, +SETIB=\$80AC! CODE Set Input Buffer with org & len values, reset >IN pointer +REFILL=\$80BC! CODE accept one line from input and leave org len of input buffer +CIB_ADR=\$80CA! [CIB_ADR] = TIB_ORG by default; may be redirected to SDIB_ORG +XDODOES=\$80D4! restore rDODOES: MOV #XDODOES,rDODOES +XDOCON=\$80E2! restore rDOCON: MOV #XDOCON,rDOCON +XDOVAR=\$80EE! restore rDOVAR: MOV #XDOVAR,rDOVAR +!to find DTC value, download \MSP430-FORTH\FF_SPECS.4th +!XDOCOL=TYPE\+\-16 if DTC = 1, restore rDOCOL as this: MOV #TYPE+-16,rDOCOL +!XDOCOL=\#S\+16 if DTC = 2, restore rDOCOL as this: MOV ##S+16,rDOCOL +! if DTC = 3, nothing to do, R7 is free for use. +INI_FORTH=\$80F8! CODE_WITHOUT_RETURN common part of RST and QABORT, starts FORTH engine +QABORT=\$812A! CODE_WITHOUT_RETURN run-time part of ABORT" +3DROP=\$8130! CODE +ABORT_TERM=\$8136! CODE_WITHOUT_RETURN, called by QREVEAL and INTERPRET +!------------------------------------------------------------------------------- +UART_COLD_TERM=\$8194! ASM, content of COLD_PFA by default +UART_INIT_TERM=\$819C! ASM, content of WARM_PFA by default +UART_RXON=\$81C6! ASM, content of SLEEP_PFA by default +UART_RXOFF=\$81C8! ASM, called by ACCEPT before RX char LF. +!------------------------------------------------------------------------------- +I2C_COLD_TERM=\$81B4! ASM, content of COLD_PFA by default +I2C_INIT_TERM=\$818A! ASM, content of WARM_PFA by default +I2C_RXON=\$81B6! ASM, content of SLEEP_PFA by default +I2C_CTRL_CH=\$81B8! ASM, used as is: MOV.B #CTRL_CHAR,Y +! CALL #I2C_CTRL_CH +!------------------------------------------------------------------------------- + ! ---------------------------------------------- ! Interrupt Vectors and signatures - MSP430FR2355 ! ---------------------------------------------- @@ -306,13 +347,13 @@ EUSCI_A1_VEC=\$FFE2! EUSCI_A0_VEC=\$FFE4! WDT_VEC=\$FFE6! RTC_VEC=\$FFE8! -TB3_x_VEC=\$FFEA! +TB3_X_VEC=\$FFEA! TB3_0_VEC=\$FFEC! -TB2_x_VEC=\$FFEE! +TB2_X_VEC=\$FFEE! TB2_0_VEC=\$FFF0! -TB1_x_VEC=\$FFF2! +TB1_X_VEC=\$FFF2! TB1_0_VEC=\$FFF4! -TB0_x_VEC=\$FFF6! +TB0_X_VEC=\$FFF6! TB0_0_VEC=\$FFF8! U_NMI_VEC=\$FFFA! S_NMI_VEC=\$FFFC! diff --git a/inc/MSP430FR2433.inc b/inc/MSP430FR2433.inc index 74416f3..d117a81 100644 --- a/inc/MSP430FR2433.inc +++ b/inc/MSP430FR2433.inc @@ -1,5 +1,8 @@ ; MSP430fr2433.inc ; MSP430fr2433 minimal declarations for Fast FORTH usage + .save + .listing off + DEVICE = "MSP430FR2433" FR2_FAMILY diff --git a/inc/MSP430FR2433.pat b/inc/MSP430FR2433.pat index b90c618..2e825a2 100644 --- a/inc/MSP430FR2433.pat +++ b/inc/MSP430FR2433.pat @@ -32,22 +32,48 @@ INFO_LEN=\$0200! ! ---------------------------------------------- ! FastForth INFO ! ---------------------------------------------- -INI_THREAD=\$1800! .word THREADS -TERMBRW_RST=\$1802! .word TERMBRW_RST -TERMMCTLW_RST=\$1804! .word TERMMCTLW_RST -FREQ_KHZ=\$1806! .word FREQUENCY - -SAVE_SYSRSTIV=\$1808! to enable SYSRSTIV read -LPM_MODE=\$180A! LPM0+GIE is the default mode -INIDP=\$180C! define RST_STATE, init by wipe -INIVOC=\$180E! define RST_STATE, init by wipe -VERSION=\$1810! +FREQ_KHZ=\$1800! FREQUENCY (in kHz) +TERMBRW_RST=\$1802! TERMBRW_RST +TERMMCTLW_RST=\$1804! TERMMCTLW_RST +I2CSLAVEADR=\$1802! I2C_SLAVE address +I2CSLAVEADR1=\$1804! +LPM_MODE=\$1806! LPM_MODE value, LPM0+GIE is the default value +RSTIV_MEM=\$1808! SYSRSTIV memory, set to -1 to do Deep RESET +RST_DP=\$180A! RST value for DP +RST_VOC=\$180C! RST value for VOClink +VERSION=\$180E! +THREADS=\$1810! THREADS KERNEL_ADDON=\$1812! -RXON=\$1814! -RXOFF=\$1816! -ReadSectorWX=\$1818! call with W = SectorLO X = SectorHI -WriteSectorWX=\$181A! call with W = SectorLO X = SectorHI -TERMINAL_INT=\$181C! value for TERMINAL vector + +WIPE_INI_=\$1814! MOV #WIPE_INI,X +WIPE_COLD=\$1814! WIPE value for PFA_COLD +WIPE_INI_FORTH=\$1816! WIPE value for PFA_INI_FORTH +WIPE_SLEEP=\$1818! WIPE value for PFA_SLEEP +WIPE_WARM=\$181A! WIPE value for PFA_WARM +WIPE_TERM_INT=\$181C! WIPE value for TERMINAL vector +WIPE_DP=\$182E! WIPE value for RST_DP +WIPE_VOC=\$1820! WIPE value for RST_VOC + +INI_FORTH_INI=\$1822! MOV #INI_FORTH_INI,X \ >BODY instruction of INI_FORTH subroutine +INIT_ACCEPT=\$1822! WIPE value for PFAACCEPT +INIT_CR=\$1824! WIPE value for PFACR +INIT_EMIT=\$1826! FORTH value for PFAEMIT +INIT_KEY=\$1828! WIPE value for PFAKEY +INIT_CIB=\$182A! WIPE value for CIB_ADR +HALF_FORTH_INI=\$182C! to preserve the state of DEFERed words, used by user INI_SOFT_APP as: +! ADD #4,0(RSP) \ skip INI_FORTH >BODY instruction "MOV #INI_FORTH_INI,X" +! MOV #HALF_FORTH_INI,X \ replace it by "MOV #HALF_FORTH_INI,X" +! MOV @RSP+,PC \ then RET +INIT_DOCOL=\$182C! FORTH value for rDOCOL (R4) +INIT_DODOES=\$182E! FORTH value for rDODOES (R5) +INIT_DOCON=\$1830! FORTH value for rDOCON (R6) +INIT_DOVAR=\$1832! FORTH value for rDOVAR (R7) +INIT_CAPS=\$1834! FORTH value for CAPS +INIT_BASE=\$1836! FORTH value for BASE + +ABORT_ADR=\$1838! ABORT address +QUIT4_ADR=\$183A! QUIT4 used by BOOTLOADER +! free EPROM ! ============================================ ! FRAM TLV @@ -232,32 +258,47 @@ SD_LEN=\$16E! ! ============================================ MAIN_ORG=\$C400! Code space start -SLEEP=\$C400! -BODYSLEEP=\$C404! -LIT=\$C40E! -NEXT_ADR=\$C416! -XSQUOTE=\$C418! -HEREADR=\$C42C! -QTBRAN=\$C438! -BRAN=\$C43E! -QFBRAN=\$C442! -SKIPBRAN=\$C448! -XDO=\$C44C! -XPLOOP=\$C45C! -XLOOP=\$C46E! -MUSMOD=\$C474! 32/16 unsigned division -MDIV1=\$C48E! input for 48/16 unsigned division -SETIB=\$C4BA! Set Input Buffer with org len values, reset >IN -REFILL=\$C4CA! accept one line from input and leave org len of input buffer -CIB_ADR=\$C4D8! contents currently TIB_ORG; may be redirected to SDIB_ORG -XDODOES=\$C4E2! restore rDODOES: MOV #XDODOES,rDODOES -XDOCON=\$C4F0! restore rDOCON: MOV #XDOCON,rDOCON -XDOCOL=\$C4FC! restore rDOCOL: MOV #XDOCOL,rDOCOL only for DTC model = 1 - -! to find DTC value, download \MSP430-FORTH\FastForthSpecs.4th -! if DTC = 1, restore rDOCOL as this : MOV #xdocol,rDOCOL -! if DTC = 2, restore rDOCOL as this : MOV #EXIT,rDOCOL -! if DTC = 3, nothing to do, R7 is free for use. +SLEEP=\$C400! CODE_WITHOUT_RETURN: CPU shutdown +LIT=\$C40A! CODE compiled by LITERAL +XSQUOTE=\$C414! CODE compiled by S" and S_ +HEREXEC=\$C428! CODE HERE and BEGIN execute address +QFBRAN=\$C434! CODE compiled by IF UNTIL +BRAN=\$C43A! CODE compiled by ELSE REPEAT AGAIN +NEXT_ADR=\$C43C! CODE NEXT instruction (MOV @IP+,PC) +XDO=\$C43E! CODE compiled by DO +XPLOOP=\$C44E! CODE compiled by +LOOP +XLOOP=\$C460! CODE compiled by LOOP +MUSMOD=\$C466! ASM 32/16 unsigned division, used by ?NUMBER, UM/MOD +MDIV1DIV2=\$C478! ASM input for 48/16 unsigned division with DVDhi=0, see DOUBLE M*/ +MDIV1=\$C480! ASM input for 48/16 unsigned division, see DOUBLE M*/ +RET_ADR=\$C4AA! ASM content of INI_FORTH_PFA and MARKER+8 definitions, +SETIB=\$C4AC! CODE Set Input Buffer with org & len values, reset >IN pointer +REFILL=\$C4BC! CODE accept one line from input and leave org len of input buffer +CIB_ADR=\$C4CA! [CIB_ADR] = TIB_ORG by default; may be redirected to SDIB_ORG +XDODOES=\$C4D4! restore rDODOES: MOV #XDODOES,rDODOES +XDOCON=\$C4E2! restore rDOCON: MOV #XDOCON,rDOCON +XDOVAR=\$C4EE! restore rDOVAR: MOV #XDOVAR,rDOVAR +!to find DTC value, download \MSP430-FORTH\FF_SPECS.4th +!XDOCOL=TYPE\+\-16 if DTC = 1, restore rDOCOL as this: MOV #TYPE+-16,rDOCOL +!XDOCOL=\#S\+16 if DTC = 2, restore rDOCOL as this: MOV ##S+16,rDOCOL +! if DTC = 3, nothing to do, R7 is free for use. +INI_FORTH=\$C4F8! CODE_WITHOUT_RETURN common part of RST and QABORT, starts FORTH engine +QABORT=\$C52A! CODE_WITHOUT_RETURN run-time part of ABORT" +3DROP=\$C530! CODE +ABORT_TERM=\$C536! CODE_WITHOUT_RETURN, called by QREVEAL and INTERPRET +!------------------------------------------------------------------------------- +UART_COLD_TERM=\$C594! ASM, content of COLD_PFA by default +UART_INIT_TERM=\$C59C! ASM, content of WARM_PFA by default +UART_RXON=\$C5C6! ASM, content of SLEEP_PFA by default +UART_RXOFF=\$C5C8! ASM, called by ACCEPT before RX char LF. +!------------------------------------------------------------------------------- +I2C_COLD_TERM=\$C5B4! ASM, content of COLD_PFA by default +I2C_INIT_TERM=\$C58A! ASM, content of WARM_PFA by default +I2C_RXON=\$C5B6! ASM, content of SLEEP_PFA by default +I2C_CTRL_CH=\$C5B8! ASM, used as is: MOV.B #CTRL_CHAR,Y +! CALL #I2C_CTRL_CH +!------------------------------------------------------------------------------- + ! ---------------------------------------------- ! Interrupt Vectors and signatures - MSP430FR2433 ! ---------------------------------------------- diff --git a/inc/MSP430FR2476.inc b/inc/MSP430FR2476.inc index df95c21..d506fb3 100644 --- a/inc/MSP430FR2476.inc +++ b/inc/MSP430FR2476.inc @@ -1,5 +1,8 @@ ; MSP430fr2433.inc ; MSP430fr2433 minimal declarations for Fast FORTH usage + .save + .listing off + DEVICE = "MSP430FR2476" FR2_FAMILY diff --git a/inc/MSP430FR2476.pat b/inc/MSP430FR2476.pat index c1a1539..874efda 100644 --- a/inc/MSP430FR2476.pat +++ b/inc/MSP430FR2476.pat @@ -43,22 +43,48 @@ INFO_LEN=\$0200! ! ---------------------------------------------- ! FastForth INFO(DCBA) memory map (256 bytes): ! ---------------------------------------------- -INI_THREAD=\$1800! .word THREADS -TERMBRW_RST=\$1802! .word TERMBRW_RST -TERMMCTLW_RST=\$1804! .word TERMMCTLW_RST -FREQ_KHZ=\$1806! .word FREQUENCY - -SAVE_SYSRSTIV=\$1808! to enable SYSRSTIV read -LPM_MODE=\$180A! LPM0+GIE is the default mode -INIDP=\$180C! define RST_STATE, init by wipe -INIVOC=\$180E! define RST_STATE, init by wipe -VERSION=\$1810! +FREQ_KHZ=\$1800! FREQUENCY (in kHz) +TERMBRW_RST=\$1802! TERMBRW_RST +TERMMCTLW_RST=\$1804! TERMMCTLW_RST +I2CSLAVEADR=\$1802! I2C_SLAVE address +I2CSLAVEADR1=\$1804! +LPM_MODE=\$1806! LPM_MODE value, LPM0+GIE is the default value +RSTIV_MEM=\$1808! SYSRSTIV memory, set to -1 to do Deep RESET +RST_DP=\$180A! RST value for DP +RST_VOC=\$180C! RST value for VOClink +VERSION=\$180E! +THREADS=\$1810! THREADS KERNEL_ADDON=\$1812! -RXON=\$1814! -RXOFF=\$1816! -ReadSectorWX=\$1818! call with W = SectorLO X = SectorHI -WriteSectorWX=\$181A! call with W = SectorLO X = SectorHI -TERMINAL_INT=\$181C! value for TERMINAL vector + +WIPE_INI_=\$1814! MOV #WIPE_INI,X +WIPE_COLD=\$1814! WIPE value for PFA_COLD +WIPE_INI_FORTH=\$1816! WIPE value for PFA_INI_FORTH +WIPE_SLEEP=\$1818! WIPE value for PFA_SLEEP +WIPE_WARM=\$181A! WIPE value for PFA_WARM +WIPE_TERM_INT=\$181C! WIPE value for TERMINAL vector +WIPE_DP=\$182E! WIPE value for RST_DP +WIPE_VOC=\$1820! WIPE value for RST_VOC + +INI_FORTH_INI=\$1822! MOV #INI_FORTH_INI,X \ >BODY instruction of INI_FORTH subroutine +INIT_ACCEPT=\$1822! WIPE value for PFAACCEPT +INIT_CR=\$1824! WIPE value for PFACR +INIT_EMIT=\$1826! FORTH value for PFAEMIT +INIT_KEY=\$1828! WIPE value for PFAKEY +INIT_CIB=\$182A! WIPE value for CIB_ADR +HALF_FORTH_INI=\$182C! to preserve the state of DEFERed words, used by user INI_SOFT_APP as: +! ADD #4,0(RSP) \ skip INI_FORTH >BODY instruction "MOV #INI_FORTH_INI,X" +! MOV #HALF_FORTH_INI,X \ replace it by "MOV #HALF_FORTH_INI,X" +! MOV @RSP+,PC \ then RET +INIT_DOCOL=\$182C! FORTH value for rDOCOL (R4) +INIT_DODOES=\$182E! FORTH value for rDODOES (R5) +INIT_DOCON=\$1830! FORTH value for rDOCON (R6) +INIT_DOVAR=\$1832! FORTH value for rDOVAR (R7) +INIT_CAPS=\$1834! FORTH value for CAPS +INIT_BASE=\$1836! FORTH value for BASE + +ABORT_ADR=\$1838! ABORT address +QUIT4_ADR=\$183A! QUIT4 used by BOOTLOADER +! free EPROM ! ============================================ ! FRAM TLV @@ -241,34 +267,49 @@ SD_LEN=\$16E! ! ============================================ ! FRAM MAIN ! ============================================ -MAIN_ORG=\$8000! Code space start - -SLEEP=\$8000! -BODYSLEEP=\$8004! -LIT=\$800E! -NEXT_ADR=\$8016! -XSQUOTE=\$8018! -HEREADR=\$802C! -QTBRAN=\$8038! -BRAN=\$803E! -QFBRAN=\$8042! -SKIPBRAN=\$8048! -XDO=\$804C! -XPLOOP=\$805C! -XLOOP=\$806E! -MUSMOD=\$8074! 32/16 unsigned division -MDIV1=\$808E! input for 48/16 unsigned division -SETIB=\$80BA! Set Input Buffer with org len values, reset >IN -REFILL=\$80CA! accept one line from input and leave org len of input buffer -CIB_ADR=\$80D8! contents currently TIB_ORG; may be redirected to SDIB_ORG -XDODOES=\$80E2! restore rDODOES: MOV #XDODOES,rDODOES -XDOCON=\$80F0! restore rDOCON: MOV #XDOCON,rDOCON -XDOCOL=\$80FC! restore rDOCOL: MOV #XDOCOL,rDOCOL only for DTC model = 1 - -! to find DTC value, download \MSP430-FORTH\FastForthSpecs.4th -! if DTC = 1, restore rDOCOL as this : MOV #xdocol,rDOCOL -! if DTC = 2, restore rDOCOL as this : MOV #EXIT,rDOCOL -! if DTC = 3, nothing to do, R7 is free for use. +MAIN_ORG=\$8000! Code space start + +SLEEP=\$8000! CODE_WITHOUT_RETURN: CPU shutdown +LIT=\$800A! CODE compiled by LITERAL +XSQUOTE=\$8014! CODE compiled by S" and S_ +HEREXEC=\$8028! CODE HERE and BEGIN execute address +QFBRAN=\$8034! CODE compiled by IF UNTIL +BRAN=\$803A! CODE compiled by ELSE REPEAT AGAIN +NEXT_ADR=\$803C! CODE NEXT instruction (MOV @IP+,PC) +XDO=\$803E! CODE compiled by DO +XPLOOP=\$804E! CODE compiled by +LOOP +XLOOP=\$8060! CODE compiled by LOOP +MUSMOD=\$8066! ASM 32/16 unsigned division, used by ?NUMBER, UM/MOD +MDIV1DIV2=\$8078! ASM input for 48/16 unsigned division with DVDhi=0, see DOUBLE M*/ +MDIV1=\$8080! ASM input for 48/16 unsigned division, see DOUBLE M*/ +RET_ADR=\$80AA! ASM content of INI_FORTH_PFA and MARKER+8 definitions, +SETIB=\$80AC! CODE Set Input Buffer with org & len values, reset >IN pointer +REFILL=\$80BC! CODE accept one line from input and leave org len of input buffer +CIB_ADR=\$80CA! [CIB_ADR] = TIB_ORG by default; may be redirected to SDIB_ORG +XDODOES=\$80D4! restore rDODOES: MOV #XDODOES,rDODOES +XDOCON=\$80E2! restore rDOCON: MOV #XDOCON,rDOCON +XDOVAR=\$80EE! restore rDOVAR: MOV #XDOVAR,rDOVAR +!to find DTC value, download \MSP430-FORTH\FF_SPECS.4th +!XDOCOL=TYPE\+\-16 if DTC = 1, restore rDOCOL as this: MOV #TYPE+-16,rDOCOL +!XDOCOL=\#S\+16 if DTC = 2, restore rDOCOL as this: MOV ##S+16,rDOCOL +! if DTC = 3, nothing to do, R7 is free for use. +INI_FORTH=\$80F8! CODE_WITHOUT_RETURN common part of RST and QABORT, starts FORTH engine +QABORT=\$812A! CODE_WITHOUT_RETURN run-time part of ABORT" +3DROP=\$8130! CODE +ABORT_TERM=\$8136! CODE_WITHOUT_RETURN, called by QREVEAL and INTERPRET +!------------------------------------------------------------------------------- +UART_COLD_TERM=\$8194! ASM, content of COLD_PFA by default +UART_INIT_TERM=\$819C! ASM, content of WARM_PFA by default +UART_RXON=\$81C6! ASM, content of SLEEP_PFA by default +UART_RXOFF=\$81C8! ASM, called by ACCEPT before RX char LF. +!------------------------------------------------------------------------------- +I2C_COLD_TERM=\$81B4! ASM, content of COLD_PFA by default +I2C_INIT_TERM=\$818A! ASM, content of WARM_PFA by default +I2C_RXON=\$81B6! ASM, content of SLEEP_PFA by default +I2C_CTRL_CH=\$81B8! ASM, used as is: MOV.B #CTRL_CHAR,Y +! CALL #I2C_CTRL_CH +!------------------------------------------------------------------------------- + ! ---------------------------------------------- ! Interrupt Vectors and signatures - MSP430FR2476 ! ---------------------------------------------- diff --git a/inc/MSP430FR2633.pat b/inc/MSP430FR2633.pat index 7a13e5b..089407f 100644 --- a/inc/MSP430FR2633.pat +++ b/inc/MSP430FR2633.pat @@ -32,22 +32,48 @@ INFO_LEN=\$0200! ! ---------------------------------------------- ! FastForth INFO ! ---------------------------------------------- -INI_THREAD=\$1800! .word THREADS -TERMBRW_RST=\$1802! .word TERMBRW_RST -TERMMCTLW_RST=\$1804! .word TERMMCTLW_RST -FREQ_KHZ=\$1806! .word FREQUENCY - -SAVE_SYSRSTIV=\$1808! to enable SYSRSTIV read -LPM_MODE=\$180A! LPM0+GIE is the default mode -INIDP=\$180C! define RST_STATE, init by wipe -INIVOC=\$180E! define RST_STATE, init by wipe -VERSION=\$1810! +FREQ_KHZ=\$1800! FREQUENCY (in kHz) +TERMBRW_RST=\$1802! TERMBRW_RST +TERMMCTLW_RST=\$1804! TERMMCTLW_RST +I2CSLAVEADR=\$1802! I2C_SLAVE address +I2CSLAVEADR1=\$1804! +LPM_MODE=\$1806! LPM_MODE value, LPM0+GIE is the default value +RSTIV_MEM=\$1808! SYSRSTIV memory, set to -1 to do Deep RESET +RST_DP=\$180A! RST value for DP +RST_VOC=\$180C! RST value for VOClink +VERSION=\$180E! +THREADS=\$1810! THREADS KERNEL_ADDON=\$1812! -RXON=\$1814! -RXOFF=\$1816! -ReadSectorWX=\$1818! call with W = SectorLO X = SectorHI -WriteSectorWX=\$181A! call with W = SectorLO X = SectorHI -TERMINAL_INT=\$181C! value for TERMINAL vector + +WIPE_INI_=\$1814! MOV #WIPE_INI,X +WIPE_COLD=\$1814! WIPE value for PFA_COLD +WIPE_INI_FORTH=\$1816! WIPE value for PFA_INI_FORTH +WIPE_SLEEP=\$1818! WIPE value for PFA_SLEEP +WIPE_WARM=\$181A! WIPE value for PFA_WARM +WIPE_TERM_INT=\$181C! WIPE value for TERMINAL vector +WIPE_DP=\$182E! WIPE value for RST_DP +WIPE_VOC=\$1820! WIPE value for RST_VOC + +INI_FORTH_INI=\$1822! MOV #INI_FORTH_INI,X \ >BODY instruction of INI_FORTH subroutine +INIT_ACCEPT=\$1822! WIPE value for PFAACCEPT +INIT_CR=\$1824! WIPE value for PFACR +INIT_EMIT=\$1826! FORTH value for PFAEMIT +INIT_KEY=\$1828! WIPE value for PFAKEY +INIT_CIB=\$182A! WIPE value for CIB_ADR +HALF_FORTH_INI=\$182C! to preserve the state of DEFERed words, used by user INI_SOFT_APP as: +! ADD #4,0(RSP) \ skip INI_FORTH >BODY instruction "MOV #INI_FORTH_INI,X" +! MOV #HALF_FORTH_INI,X \ replace it by "MOV #HALF_FORTH_INI,X" +! MOV @RSP+,PC \ then RET +INIT_DOCOL=\$182C! FORTH value for rDOCOL (R4) +INIT_DODOES=\$182E! FORTH value for rDODOES (R5) +INIT_DOCON=\$1830! FORTH value for rDOCON (R6) +INIT_DOVAR=\$1832! FORTH value for rDOVAR (R7) +INIT_CAPS=\$1834! FORTH value for CAPS +INIT_BASE=\$1836! FORTH value for BASE + +ABORT_ADR=\$1838! ABORT address +QUIT4_ADR=\$183A! QUIT4 used by BOOTLOADER +! free EPROM ! ============================================ ! FRAM TLV @@ -231,32 +257,47 @@ SD_LEN=\$16E! ! ============================================ MAIN_ORG=\$C400! Code space start -SLEEP=\$C400! -BODYSLEEP=\$C404! -LIT=\$C40E! -NEXT_ADR=\$C416! -XSQUOTE=\$C418! -HEREADR=\$C42C! -QTBRAN=\$C438! -BRAN=\$C43E! -QFBRAN=\$C442! -SKIPBRAN=\$C448! -XDO=\$C44C! -XPLOOP=\$C45C! -XLOOP=\$C46E! -MUSMOD=\$C474! 32/16 unsigned division -MDIV1=\$C48E! input for 48/16 unsigned division -SETIB=\$C4BA! Set Input Buffer with org len values, reset >IN -REFILL=\$C4CA! accept one line from input and leave org len of input buffer -CIB_ADR=\$C4D8! contents currently TIB_ORG; may be redirected to SDIB_ORG -XDODOES=\$C4E2! restore rDODOES: MOV #XDODOES,rDODOES -XDOCON=\$C4F0! restore rDOCON: MOV #XDOCON,rDOCON -XDOCOL=\$C4FC! restore rDOCOL: MOV #XDOCOL,rDOCOL only for DTC model = 1 - -! to find DTC value, download \MSP430-FORTH\FastForthSpecs.4th -! if DTC = 1, restore rDOCOL as this : MOV #xdocol,rDOCOL -! if DTC = 2, restore rDOCOL as this : MOV #EXIT,rDOCOL -! if DTC = 3, nothing to do, R7 is free for use. +SLEEP=\$C400! CODE_WITHOUT_RETURN: CPU shutdown +LIT=\$C40A! CODE compiled by LITERAL +XSQUOTE=\$C414! CODE compiled by S" and S_ +HEREXEC=\$C428! CODE HERE and BEGIN execute address +QFBRAN=\$C434! CODE compiled by IF UNTIL +BRAN=\$C43A! CODE compiled by ELSE REPEAT AGAIN +NEXT_ADR=\$C43C! CODE NEXT instruction (MOV @IP+,PC) +XDO=\$C43E! CODE compiled by DO +XPLOOP=\$C44E! CODE compiled by +LOOP +XLOOP=\$C460! CODE compiled by LOOP +MUSMOD=\$C466! ASM 32/16 unsigned division, used by ?NUMBER, UM/MOD +MDIV1DIV2=\$C478! ASM input for 48/16 unsigned division with DVDhi=0, see DOUBLE M*/ +MDIV1=\$C480! ASM input for 48/16 unsigned division, see DOUBLE M*/ +RET_ADR=\$C4AA! ASM content of INI_FORTH_PFA and MARKER+8 definitions, +SETIB=\$C4AC! CODE Set Input Buffer with org & len values, reset >IN pointer +REFILL=\$C4BC! CODE accept one line from input and leave org len of input buffer +CIB_ADR=\$C4CA! [CIB_ADR] = TIB_ORG by default; may be redirected to SDIB_ORG +XDODOES=\$C4D4! restore rDODOES: MOV #XDODOES,rDODOES +XDOCON=\$C4E2! restore rDOCON: MOV #XDOCON,rDOCON +XDOVAR=\$C4EE! restore rDOVAR: MOV #XDOVAR,rDOVAR +!to find DTC value, download \MSP430-FORTH\FF_SPECS.4th +!XDOCOL=TYPE\+\-16 if DTC = 1, restore rDOCOL as this: MOV #TYPE+-16,rDOCOL +!XDOCOL=\#S\+16 if DTC = 2, restore rDOCOL as this: MOV ##S+16,rDOCOL +! if DTC = 3, nothing to do, R7 is free for use. +INI_FORTH=\$C4F8! CODE_WITHOUT_RETURN common part of RST and QABORT, starts FORTH engine +QABORT=\$C52A! CODE_WITHOUT_RETURN run-time part of ABORT" +3DROP=\$C530! CODE +ABORT_TERM=\$C536! CODE_WITHOUT_RETURN, called by QREVEAL and INTERPRET +!------------------------------------------------------------------------------- +UART_COLD_TERM=\$C594! ASM, content of COLD_PFA by default +UART_INIT_TERM=\$C59C! ASM, content of WARM_PFA by default +UART_RXON=\$C5C6! ASM, content of SLEEP_PFA by default +UART_RXOFF=\$C5C8! ASM, called by ACCEPT before RX char LF. +!------------------------------------------------------------------------------- +I2C_COLD_TERM=\$C5B4! ASM, content of COLD_PFA by default +I2C_INIT_TERM=\$C58A! ASM, content of WARM_PFA by default +I2C_RXON=\$C5B6! ASM, content of SLEEP_PFA by default +I2C_CTRL_CH=\$C5B8! ASM, used as is: MOV.B #CTRL_CHAR,Y +! CALL #I2C_CTRL_CH +!------------------------------------------------------------------------------- + ! ---------------------------------------------- ! Interrupt Vectors and signatures - MSP430FR2633 ! ---------------------------------------------- diff --git a/inc/MSP430FR4133.inc b/inc/MSP430FR4133.inc index 0fb4e96..8823ca4 100644 --- a/inc/MSP430FR4133.inc +++ b/inc/MSP430FR4133.inc @@ -1,5 +1,8 @@ ; MSP430fr4133.inc ; MSP430FR4133 minimal declarations for FAST FORTH usage + .save + .listing off + DEVICE = "MSP430FR4133" FR2_FAMILY diff --git a/inc/MSP430FR4133.pat b/inc/MSP430FR4133.pat index 05da6dd..a29b770 100644 --- a/inc/MSP430FR4133.pat +++ b/inc/MSP430FR4133.pat @@ -28,22 +28,48 @@ INFO_LEN=\$0200! ! ---------------------------------------------- ! FastForth INFO ! ---------------------------------------------- -INI_THREAD=\$1800! .word THREADS -TERMBRW_RST=\$1802! .word TERMBRW_RST -TERMMCTLW_RST=\$1804! .word TERMMCTLW_RST -FREQ_KHZ=\$1806! .word FREQUENCY - -SAVE_SYSRSTIV=\$1808! to enable SYSRSTIV read -LPM_MODE=\$180A! LPM0+GIE is the default mode -INIDP=\$180C! define RST_STATE, init by wipe -INIVOC=\$180E! define RST_STATE, init by wipe -VERSION=\$1810! +FREQ_KHZ=\$1800! FREQUENCY (in kHz) +TERMBRW_RST=\$1802! TERMBRW_RST +TERMMCTLW_RST=\$1804! TERMMCTLW_RST +I2CSLAVEADR=\$1802! I2C_SLAVE address +I2CSLAVEADR1=\$1804! +LPM_MODE=\$1806! LPM_MODE value, LPM0+GIE is the default value +RSTIV_MEM=\$1808! SYSRSTIV memory, set to -1 to do Deep RESET +RST_DP=\$180A! RST value for DP +RST_VOC=\$180C! RST value for VOClink +VERSION=\$180E! +THREADS=\$1810! THREADS KERNEL_ADDON=\$1812! -RXON=\$1814! -RXOFF=\$1816! -ReadSectorWX=\$1818! call with W = SectorLO X = SectorHI -WriteSectorWX=\$181A! call with W = SectorLO X = SectorHI -TERMINAL_INT=\$181C! value for TERMINAL vector + +WIPE_INI_=\$1814! MOV #WIPE_INI,X +WIPE_COLD=\$1814! WIPE value for PFA_COLD +WIPE_INI_FORTH=\$1816! WIPE value for PFA_INI_FORTH +WIPE_SLEEP=\$1818! WIPE value for PFA_SLEEP +WIPE_WARM=\$181A! WIPE value for PFA_WARM +WIPE_TERM_INT=\$181C! WIPE value for TERMINAL vector +WIPE_DP=\$182E! WIPE value for RST_DP +WIPE_VOC=\$1820! WIPE value for RST_VOC + +INI_FORTH_INI=\$1822! MOV #INI_FORTH_INI,X \ >BODY instruction of INI_FORTH subroutine +INIT_ACCEPT=\$1822! WIPE value for PFAACCEPT +INIT_CR=\$1824! WIPE value for PFACR +INIT_EMIT=\$1826! FORTH value for PFAEMIT +INIT_KEY=\$1828! WIPE value for PFAKEY +INIT_CIB=\$182A! WIPE value for CIB_ADR +HALF_FORTH_INI=\$182C! to preserve the state of DEFERed words, used by user INI_SOFT_APP as: +! ADD #4,0(RSP) \ skip INI_FORTH >BODY instruction "MOV #INI_FORTH_INI,X" +! MOV #HALF_FORTH_INI,X \ replace it by "MOV #HALF_FORTH_INI,X" +! MOV @RSP+,PC \ then RET +INIT_DOCOL=\$182C! FORTH value for rDOCOL (R4) +INIT_DODOES=\$182E! FORTH value for rDODOES (R5) +INIT_DOCON=\$1830! FORTH value for rDOCON (R6) +INIT_DOVAR=\$1832! FORTH value for rDOVAR (R7) +INIT_CAPS=\$1834! FORTH value for CAPS +INIT_BASE=\$1836! FORTH value for BASE + +ABORT_ADR=\$1838! ABORT address +QUIT4_ADR=\$183A! QUIT4 used by BOOTLOADER +! free EPROM ! ============================================ ! FRAM TLV @@ -227,32 +253,47 @@ SD_LEN=\$16E! ! ============================================ MAIN_ORG=\$C400! Code space start -SLEEP=\$C400! -BODYSLEEP=\$C404! -LIT=\$C40E! -NEXT_ADR=\$C416! -XSQUOTE=\$C418! -HEREADR=\$C42C! -QTBRAN=\$C438! -BRAN=\$C43E! -QFBRAN=\$C442! -SKIPBRAN=\$C448! -XDO=\$C44C! -XPLOOP=\$C45C! -XLOOP=\$C46E! -MUSMOD=\$C474! 32/16 unsigned division -MDIV1=\$C48E! input for 48/16 unsigned division -SETIB=\$C4BA! Set Input Buffer with org len values, reset >IN -REFILL=\$C4CA! accept one line from input and leave org len of input buffer -CIB_ADR=\$C4D8! contents currently TIB_ORG; may be redirected to SDIB_ORG -XDODOES=\$C4E2! restore rDODOES: MOV #XDODOES,rDODOES -XDOCON=\$C4F0! restore rDOCON: MOV #XDOCON,rDOCON -XDOCOL=\$C4FC! restore rDOCOL: MOV #XDOCOL,rDOCOL only for DTC model = 1 - -! to find DTC value, download \MSP430-FORTH\FastForthSpecs.4th -! if DTC = 1, restore rDOCOL as this : MOV #xdocol,rDOCOL -! if DTC = 2, restore rDOCOL as this : MOV #EXIT,rDOCOL -! if DTC = 3, nothing to do, R7 is free for use. +SLEEP=\$C400! CODE_WITHOUT_RETURN: CPU shutdown +LIT=\$C40A! CODE compiled by LITERAL +XSQUOTE=\$C414! CODE compiled by S" and S_ +HEREXEC=\$C428! CODE HERE and BEGIN execute address +QFBRAN=\$C434! CODE compiled by IF UNTIL +BRAN=\$C43A! CODE compiled by ELSE REPEAT AGAIN +NEXT_ADR=\$C43C! CODE NEXT instruction (MOV @IP+,PC) +XDO=\$C43E! CODE compiled by DO +XPLOOP=\$C44E! CODE compiled by +LOOP +XLOOP=\$C460! CODE compiled by LOOP +MUSMOD=\$C466! ASM 32/16 unsigned division, used by ?NUMBER, UM/MOD +MDIV1DIV2=\$C478! ASM input for 48/16 unsigned division with DVDhi=0, see DOUBLE M*/ +MDIV1=\$C480! ASM input for 48/16 unsigned division, see DOUBLE M*/ +RET_ADR=\$C4AA! ASM content of INI_FORTH_PFA and MARKER+8 definitions, +SETIB=\$C4AC! CODE Set Input Buffer with org & len values, reset >IN pointer +REFILL=\$C4BC! CODE accept one line from input and leave org len of input buffer +CIB_ADR=\$C4CA! [CIB_ADR] = TIB_ORG by default; may be redirected to SDIB_ORG +XDODOES=\$C4D4! restore rDODOES: MOV #XDODOES,rDODOES +XDOCON=\$C4E2! restore rDOCON: MOV #XDOCON,rDOCON +XDOVAR=\$C4EE! restore rDOVAR: MOV #XDOVAR,rDOVAR +!to find DTC value, download \MSP430-FORTH\FF_SPECS.4th +!XDOCOL=TYPE\+\-16 if DTC = 1, restore rDOCOL as this: MOV #TYPE+-16,rDOCOL +!XDOCOL=\#S\+16 if DTC = 2, restore rDOCOL as this: MOV ##S+16,rDOCOL +! if DTC = 3, nothing to do, R7 is free for use. +INI_FORTH=\$C4F8! CODE_WITHOUT_RETURN common part of RST and QABORT, starts FORTH engine +QABORT=\$C52A! CODE_WITHOUT_RETURN run-time part of ABORT" +3DROP=\$C530! CODE +ABORT_TERM=\$C536! CODE_WITHOUT_RETURN, called by QREVEAL and INTERPRET +!------------------------------------------------------------------------------- +UART_COLD_TERM=\$C594! ASM, content of COLD_PFA by default +UART_INIT_TERM=\$C59C! ASM, content of WARM_PFA by default +UART_RXON=\$C5C6! ASM, content of SLEEP_PFA by default +UART_RXOFF=\$C5C8! ASM, called by ACCEPT before RX char LF. +!------------------------------------------------------------------------------- +I2C_COLD_TERM=\$C5B4! ASM, content of COLD_PFA by default +I2C_INIT_TERM=\$C58A! ASM, content of WARM_PFA by default +I2C_RXON=\$C5B6! ASM, content of SLEEP_PFA by default +I2C_CTRL_CH=\$C5B8! ASM, used as is: MOV.B #CTRL_CHAR,Y +! CALL #I2C_CTRL_CH +!------------------------------------------------------------------------------- + ! ---------------------------------------------- ! Interrupt Vectors and signatures - MSP430FR4133 ! ---------------------------------------------- diff --git a/inc/MSP430FR5738.inc b/inc/MSP430FR5738.inc index 893c7ed..68e0263 100644 --- a/inc/MSP430FR5738.inc +++ b/inc/MSP430FR5738.inc @@ -1,5 +1,8 @@ ; MSP430fr5738.inc ; MSP430FR5738 minimal declarations for FastForth usage + .save + .listing off + DEVICE = "MSP430FR5738" ; ---------------------------------------------- diff --git a/inc/MSP430FR5738.pat b/inc/MSP430FR5738.pat index 86cc090..7589972 100644 --- a/inc/MSP430FR5738.pat +++ b/inc/MSP430FR5738.pat @@ -29,81 +29,107 @@ INFO_LEN=\$0100! ! ---------------------------------------------- ! FastForth INFO ! ---------------------------------------------- -INI_THREAD=\$1800! .word THREADS -TERMBRW_RST=\$1802! .word TERMBRW_RST -TERMMCTLW_RST=\$1804! .word TERMMCTLW_RST -FREQ_KHZ=\$1806! .word FREQUENCY - -SAVE_SYSRSTIV=\$1808! to enable SYSRSTIV read -LPM_MODE=\$180A! LPM0+GIE is the default mode -INIDP=\$180C! define RST_STATE, init by wipe -INIVOC=\$180E! define RST_STATE, init by wipe -VERSION=\$1810! +FREQ_KHZ=\$1800! FREQUENCY (in kHz) +TERMBRW_RST=\$1802! TERMBRW_RST +TERMMCTLW_RST=\$1804! TERMMCTLW_RST +I2CSLAVEADR=\$1802! I2C_SLAVE address +I2CSLAVEADR1=\$1804! +LPM_MODE=\$1806! LPM_MODE value, LPM0+GIE is the default value +RSTIV_MEM=\$1808! SYSRSTIV memory, set to -1 to do Deep RESET +RST_DP=\$180A! RST value for DP +RST_VOC=\$180C! RST value for VOClink +VERSION=\$180E! +THREADS=\$1810! THREADS KERNEL_ADDON=\$1812! -RXON=\$1814! -RXOFF=\$1816! -ReadSectorWX=\$1818! call with W = SectorLO X = SectorHI -WriteSectorWX=\$181A! call with W = SectorLO X = SectorHI -TERMINAL_INT=\$181C! value for TERMINAL vector + +WIPE_INI_=\$1814! MOV #WIPE_INI,X +WIPE_COLD=\$1814! WIPE value for PFA_COLD +WIPE_INI_FORTH=\$1816! WIPE value for PFA_INI_FORTH +WIPE_SLEEP=\$1818! WIPE value for PFA_SLEEP +WIPE_WARM=\$181A! WIPE value for PFA_WARM +WIPE_TERM_INT=\$181C! WIPE value for TERMINAL vector +WIPE_DP=\$182E! WIPE value for RST_DP +WIPE_VOC=\$1820! WIPE value for RST_VOC + +INI_FORTH_INI=\$1822! MOV #INI_FORTH_INI,X \ >BODY instruction of INI_FORTH subroutine +INIT_ACCEPT=\$1822! WIPE value for PFAACCEPT +INIT_CR=\$1824! WIPE value for PFACR +INIT_EMIT=\$1826! FORTH value for PFAEMIT +INIT_KEY=\$1828! WIPE value for PFAKEY +INIT_CIB=\$182A! WIPE value for CIB_ADR +HALF_FORTH_INI=\$182C! to preserve the state of DEFERed words, used by user INI_SOFT_APP as: +! ADD #4,0(RSP) \ skip INI_FORTH >BODY instruction "MOV #INI_FORTH_INI,X" +! MOV #HALF_FORTH_INI,X \ replace it by "MOV #HALF_FORTH_INI,X" +! MOV @RSP+,PC \ then RET +INIT_DOCOL=\$182C! FORTH value for rDOCOL (R4) +INIT_DODOES=\$182E! FORTH value for rDODOES (R5) +INIT_DOCON=\$1830! FORTH value for rDOCON (R6) +INIT_DOVAR=\$1832! FORTH value for rDOVAR (R7) +INIT_CAPS=\$1834! FORTH value for CAPS +INIT_BASE=\$1836! FORTH value for BASE + +ABORT_ADR=\$1838! ABORT address +QUIT4_ADR=\$183A! QUIT4 used by BOOTLOADER +! free EPROM ! --------------------------------------- ! FAT16 FileSystemInfos ! --------------------------------------- -FATtype=\$182C! -BS_FirstSectorL=\$182E! -BS_FirstSectorH=\$1830! -OrgFAT1=\$1832! -FATSize=\$1834! -OrgFAT2=\$1836! -OrgRootDir=\$1838! -OrgClusters=\$183A! Sector of Cluster 0 -SecPerClus=\$183C! +FATtype=\$185A! +BS_FirstSectorL=\$185C! +BS_FirstSectorH=\$185E! +OrgFAT1=\$1860! +FATSize=\$1862! +OrgFAT2=\$1864! +OrgRootDir=\$1866! +OrgClusters=\$1868! Sector of Cluster 0 +SecPerClus=\$186A! ! --------------------------------------- ! SD command ! --------------------------------------- -SD_CMD_FRM=\$183E! 6 bytes SD_CMDx inverted frame \${CRC,ll,LL,hh,HH,CMD} -SD_CMD_FRM0=\$183E! CRC:ll word access -SD_CMD_FRM1=\$183F! ll byte access -SD_CMD_FRM2=\$1840! LL:hh word access -SD_CMD_FRM3=\$1841! hh byte access -SD_CMD_FRM4=\$1842! HH:CMD word access -SD_CMD_FRM5=\$1843! CMD byte access -SectorL=\$1844! 2 words -SectorH=\$1846! +SD_CMD_FRM=\$186C! 6 bytes SD_CMDx inverted frame \${CRC,ll,LL,hh,HH,CMD} +SD_CMD_FRM0=\$186C! CRC:ll word access +SD_CMD_FRM1=\$186D! ll byte access +SD_CMD_FRM2=\$186E! LL:hh word access +SD_CMD_FRM3=\$186F! hh byte access +SD_CMD_FRM4=\$1870! HH:CMD word access +SD_CMD_FRM5=\$1871! CMD byte access +SectorL=\$1872! 2 words +SectorH=\$1874! ! --------------------------------------- ! BUFFER management ! --------------------------------------- -BufferPtr=\$1848! -BufferLen=\$184A! +BufferPtr=\$1876! +BufferLen=\$1878! ! --------------------------------------- ! FAT entry ! --------------------------------------- -ClusterL=\$184C! 16 bits wide (FAT16) -ClusterH=\$184E! 16 bits wide (FAT16) -NewClusterL=\$1850! 16 bits wide (FAT16) -NewClusterH=\$1852! 16 bits wide (FAT16) -CurFATsector=\$1854! +ClusterL=\$187A! 16 bits wide (FAT16) +ClusterH=\$187C! 16 bits wide (FAT16) +NewClusterL=\$187E! 16 bits wide (FAT16) +NewClusterH=\$1880! 16 bits wide (FAT16) +CurFATsector=\$1882! ! --------------------------------------- ! DIR entry ! --------------------------------------- -DIRclusterL=\$1856! contains the Cluster of current directory ; 1 if FAT16 root directory -DIRclusterH=\$1858! contains the Cluster of current directory ; 1 if FAT16 root directory -EntryOfst=\$185A! +DIRclusterL=\$1884! contains the Cluster of current directory ; 1 if FAT16 root directory +DIRclusterH=\$1886! contains the Cluster of current directory ; 1 if FAT16 root directory +EntryOfst=\$1888! ! --------------------------------------- ! Handle Pointer ! --------------------------------------- -CurrentHdl=\$185C! contains the address of the last opened file structure, or 0 +CurrentHdl=\$188A! contains the address of the last opened file structure, or 0 ! --------------------------------------- ! Load file operation ! --------------------------------------- -pathname=\$185E! address of pathname string -EndOfPath=\$1860! +pathname=\$188C! address of pathname string +EndOfPath=\$188E! ! --------------------------------------- ! Handle structure @@ -132,18 +158,13 @@ HDLW_PrevLEN=24! previous LEN HDLW_PrevORG=26! previous ORG !OpenedFirstFile ; "openedFile" structure -HandleMax=5! +HandleMax=4! HandleLenght=28! -FirstHandle=\$1862! -HandleEnd=\$18EE! - -SD_END=\$18EE! -SD_LEN=\$C2! +FirstHandle=\$1890! +HandleEnd=\$1900! -!SD_card Input Buffer = PAD -SDIB_I2CADR=\$1CE0! -SDIB_I2CCNT=\$1CE2! -SDIB_ORG=\$1CE4! +SD_END=\$1900! +SD_LEN=\$A6! ! ============================================ ! FRAM TLV @@ -168,6 +189,12 @@ PAD_LEN=\#84! bytes TIB_LEN=\#84! bytes HOLD_SIZE=\#34! bytes +!SD_card Input Buffer = PAD +SDIB_I2CADR=\$1CE0! +SDIB_I2CCNT=\$1CE2! +SDIB_ORG=\$1CE4! +SDIB_LEN=\$54! + ! --------------------------------------- ! FastForth RAM memory map (= 1k) ! --------------------------------------- @@ -230,32 +257,47 @@ MAIN_ORG=\$C200! Code space start MAIN_LEN=\$3E00! 15.5 k FRAM ! ---------------------------------------------- -SLEEP=\$C200! -BODYSLEEP=\$C204! -LIT=\$C20E! -NEXT_ADR=\$C216! -XSQUOTE=\$C218! -HEREADR=\$C22C! -QTBRAN=\$C238! -BRAN=\$C23E! -QFBRAN=\$C242! -SKIPBRAN=\$C248! -XDO=\$C24C! -XPLOOP=\$C25C! -XLOOP=\$C26E! -MUSMOD=\$C274! 32/16 unsigned division -MDIV1=\$C28E! input for 48/16 unsigned division -SETIB=\$C2BA! Set Input Buffer with org len values, reset >IN -REFILL=\$C2CA! accept one line from input and leave org len of input buffer -CIB_ADR=\$C2D8! contents currently TIB_ORG; may be redirected to SDIB_ORG -XDODOES=\$C2E2! restore rDODOES: MOV #XDODOES,rDODOES -XDOCON=\$C2F0! restore rDOCON: MOV #XDOCON,rDOCON -XDOCOL=\$C2FC! restore rDOCOL: MOV #XDOCOL,rDOCOL only for DTC model = 1 - -! to find DTC value, download \MSP430-FORTH\FastForthSpecs.4th -! if DTC = 1, restore rDOCOL as this : MOV #xdocol,rDOCOL -! if DTC = 2, restore rDOCOL as this : MOV #EXIT,rDOCOL -! if DTC = 3, nothing to do, R7 is free for use. +SLEEP=\$C200! CODE_WITHOUT_RETURN: CPU shutdown +LIT=\$C20A! CODE compiled by LITERAL +XSQUOTE=\$C214! CODE compiled by S" and S_ +HEREXEC=\$C228! CODE HERE and BEGIN execute address +QFBRAN=\$C234! CODE compiled by IF UNTIL +BRAN=\$C23A! CODE compiled by ELSE REPEAT AGAIN +NEXT_ADR=\$C23C! CODE NEXT instruction (MOV @IP+,PC) +XDO=\$C23E! CODE compiled by DO +XPLOOP=\$C24E! CODE compiled by +LOOP +XLOOP=\$C260! CODE compiled by LOOP +MUSMOD=\$C266! ASM 32/16 unsigned division, used by ?NUMBER, UM/MOD +MDIV1DIV2=\$C278! ASM input for 48/16 unsigned division with DVDhi=0, see DOUBLE M*/ +MDIV1=\$C280! ASM input for 48/16 unsigned division, see DOUBLE M*/ +RET_ADR=\$C2AA! ASM content of INI_FORTH_PFA and MARKER+8 definitions, +SETIB=\$C2AC! CODE Set Input Buffer with org & len values, reset >IN pointer +REFILL=\$C2BC! CODE accept one line from input and leave org len of input buffer +CIB_ADR=\$C2CA! [CIB_ADR] = TIB_ORG by default; may be redirected to SDIB_ORG +XDODOES=\$C2D4! restore rDODOES: MOV #XDODOES,rDODOES +XDOCON=\$C2E2! restore rDOCON: MOV #XDOCON,rDOCON +XDOVAR=\$C2EE! restore rDOVAR: MOV #XDOVAR,rDOVAR +!to find DTC value, download \MSP430-FORTH\FF_SPECS.4th +!XDOCOL=TYPE\+\-16 if DTC = 1, restore rDOCOL as this: MOV #TYPE+-16,rDOCOL +!XDOCOL=\#S\+16 if DTC = 2, restore rDOCOL as this: MOV ##S+16,rDOCOL +! if DTC = 3, nothing to do, R7 is free for use. +INI_FORTH=\$C2F8! CODE_WITHOUT_RETURN common part of RST and QABORT, starts FORTH engine +QABORT=\$C32A! CODE_WITHOUT_RETURN run-time part of ABORT" +3DROP=\$C330! CODE +ABORT_TERM=\$C336! CODE_WITHOUT_RETURN, called by QREVEAL and INTERPRET +!------------------------------------------------------------------------------- +UART_COLD_TERM=\$C394! ASM, content of COLD_PFA by default +UART_INIT_TERM=\$C39C! ASM, content of WARM_PFA by default +UART_RXON=\$C3C6! ASM, content of SLEEP_PFA by default +UART_RXOFF=\$C3C8! ASM, called by ACCEPT before RX char LF. +!------------------------------------------------------------------------------- +I2C_COLD_TERM=\$C3B4! ASM, content of COLD_PFA by default +I2C_INIT_TERM=\$C38A! ASM, content of WARM_PFA by default +I2C_RXON=\$C3B6! ASM, content of SLEEP_PFA by default +I2C_CTRL_CH=\$C3B8! ASM, used as is: MOV.B #CTRL_CHAR,Y +! CALL #I2C_CTRL_CH +!------------------------------------------------------------------------------- + ! ---------------------------------------------- ! Interrupt Vectors and signatures - MSP430FR5738 ! ---------------------------------------------- @@ -278,24 +320,23 @@ VECT_LEN=\$32! RTC_VEC=\$FFCE! P4_VEC=\$FFD0! P3_VEC=\$FFD2! -TB2_x_VEC=\$FFD4! All others +TB2_X_VEC=\$FFD4! All others TB2_0_VEC=\$FFD6! only CCIFG0 P2_VEC=\$FFD8! -TB1_x_VEC=\$FFDA! All others +TB1_X_VEC=\$FFDA! All others TB1_0_VEC=\$FFDC! only CCIFG0 P1_VEC=\$FFDE! -TA1_x_VEC=\$FFE0! All others +TA1_X_VEC=\$FFE0! All others TA1_0_VEC=\$FFE2! only CCIFG0 DMA_VEC=\$FFE4! -!eUSCI_A1_VEC=\$FFE6! -TA0_x_VEC=\$FFE8! All others +!EUSCI_A1_VEC=\$FFE6! +TA0_X_VEC=\$FFE8! All others TA0_0_VEC=\$FFEA! only CCIFG0 ADC10_B_VEC=\$FFEC! -eUSCI_B0_VEC=\$FFEE! -eUSCI_A0_VEC=\$FFF0! -TERM_VEC=\$FFF0! +EUSCI_B0_VEC=\$FFEE! +EUSCI_A0_VEC=\$FFF0! WDT_VEC=\$FFF2! -TB0_x_VEC=\$FFF4! All others +TB0_X_VEC=\$FFF4! All others TB0_0_VEC=\$FFF6! only CCIFG0 COMP_D_VEC=\$FFF8! USER_NMI_VEC=\$FFFA! diff --git a/inc/MSP430FR5739.inc b/inc/MSP430FR5739.inc index 22afe36..03e50c1 100644 --- a/inc/MSP430FR5739.inc +++ b/inc/MSP430FR5739.inc @@ -1,5 +1,8 @@ ; MSP430fr5739.inc ; MSP430FR5739 minimal declarations for FastForth usage + .save + .listing off + DEVICE = "MSP430FR5739" diff --git a/inc/MSP430FR5739.pat b/inc/MSP430FR5739.pat index 09179b1..b893d48 100644 --- a/inc/MSP430FR5739.pat +++ b/inc/MSP430FR5739.pat @@ -33,87 +33,112 @@ INFO_LEN=\$0100! ! ============================================ ! FastForth INFO(DCBA) memory map (256 bytes): ! ============================================ - -INI_THREAD=\$1800! .word THREADS -TERMBRW_RST=\$1802! .word TERMBRW_RST -TERMMCTLW_RST=\$1804! .word TERMMCTLW_RST -FREQ_KHZ=\$1806! .word FREQUENCY - -SAVE_SYSRSTIV=\$1808! to enable SYSRSTIV read -LPM_MODE=\$180A! LPM0+GIE is the default mode -INIDP=\$180C! define RST_STATE, init by wipe -INIVOC=\$180E! define RST_STATE, init by wipe -VERSION=\$1810! +FREQ_KHZ=\$1800! FREQUENCY (in kHz) +TERMBRW_RST=\$1802! TERMBRW_RST +TERMMCTLW_RST=\$1804! TERMMCTLW_RST +I2CSLAVEADR=\$1802! I2C_SLAVE address +I2CSLAVEADR1=\$1804! +LPM_MODE=\$1806! LPM_MODE value, LPM0+GIE is the default value +RSTIV_MEM=\$1808! SYSRSTIV memory, set to -1 to do Deep RESET +RST_DP=\$180A! RST value for DP +RST_VOC=\$180C! RST value for VOClink +VERSION=\$180E! +THREADS=\$1810! THREADS KERNEL_ADDON=\$1812! -RXON=\$1814! -RXOFF=\$1816! -ReadSectorWX=\$1818! call with W = SectorLO X = SectorHI -WriteSectorWX=\$181A! call with W = SectorLO X = SectorHI -TERMINAL_INT=\$181C! value for TERMINAL vector + +WIPE_INI_=\$1814! MOV #WIPE_INI,X +WIPE_COLD=\$1814! WIPE value for PFA_COLD +WIPE_INI_FORTH=\$1816! WIPE value for PFA_INI_FORTH +WIPE_SLEEP=\$1818! WIPE value for PFA_SLEEP +WIPE_WARM=\$181A! WIPE value for PFA_WARM +WIPE_TERM_INT=\$181C! WIPE value for TERMINAL vector +WIPE_DP=\$182E! WIPE value for RST_DP +WIPE_VOC=\$1820! WIPE value for RST_VOC + +INI_FORTH_INI=\$1822! MOV #INI_FORTH_INI,X \ >BODY instruction of INI_FORTH subroutine +INIT_ACCEPT=\$1822! WIPE value for PFAACCEPT +INIT_CR=\$1824! WIPE value for PFACR +INIT_EMIT=\$1826! FORTH value for PFAEMIT +INIT_KEY=\$1828! WIPE value for PFAKEY +INIT_CIB=\$182A! WIPE value for CIB_ADR +HALF_FORTH_INI=\$182C! to preserve the state of DEFERed words, used by user INI_SOFT_APP as: +! ADD #4,0(RSP) \ skip INI_FORTH >BODY instruction "MOV #INI_FORTH_INI,X" +! MOV #HALF_FORTH_INI,X \ replace it by "MOV #HALF_FORTH_INI,X" +! MOV @RSP+,PC \ then RET +INIT_DOCOL=\$182C! FORTH value for rDOCOL (R4) +INIT_DODOES=\$182E! FORTH value for rDODOES (R5) +INIT_DOCON=\$1830! FORTH value for rDOCON (R6) +INIT_DOVAR=\$1832! FORTH value for rDOVAR (R7) +INIT_CAPS=\$1834! FORTH value for CAPS +INIT_BASE=\$1836! FORTH value for BASE + +ABORT_ADR=\$1838! ABORT address +QUIT4_ADR=\$183A! QUIT4 used by BOOTLOADER +! free EPROM ! --------------------------------------- -! FAT16 FileSystemInfos +! FAT16 FileSystemInfos ! --------------------------------------- -FATtype=\$182C! -BS_FirstSectorL=\$182E! -BS_FirstSectorH=\$1830! -OrgFAT1=\$1832! -FATSize=\$1834! -OrgFAT2=\$1836! -OrgRootDir=\$1838! -OrgClusters=\$183A! Sector of Cluster 0 -SecPerClus=\$183C! +FATtype=\$185A! +BS_FirstSectorL=\$185C! +BS_FirstSectorH=\$185E! +OrgFAT1=\$1860! +FATSize=\$1862! +OrgFAT2=\$1864! +OrgRootDir=\$1866! +OrgClusters=\$1868! Sector of Cluster 0 +SecPerClus=\$186A! ! --------------------------------------- ! SD command ! --------------------------------------- -SD_CMD_FRM=\$183E! 6 bytes SD_CMDx inverted frame \${CRC,ll,LL,hh,HH,CMD} -SD_CMD_FRM0=\$183E! CRC:ll word access -SD_CMD_FRM1=\$183F! ll byte access -SD_CMD_FRM2=\$1840! LL:hh word access -SD_CMD_FRM3=\$1841! hh byte access -SD_CMD_FRM4=\$1842! HH:CMD word access -SD_CMD_FRM5=\$1843! CMD byte access -SectorL=\$1844! 2 words -SectorH=\$1846! +SD_CMD_FRM=\$186C! 6 bytes SD_CMDx inverted frame \${CRC,ll,LL,hh,HH,CMD} +SD_CMD_FRM0=\$186C! CRC:ll word access +SD_CMD_FRM1=\$186D! ll byte access +SD_CMD_FRM2=\$186E! LL:hh word access +SD_CMD_FRM3=\$186F! hh byte access +SD_CMD_FRM4=\$1870! HH:CMD word access +SD_CMD_FRM5=\$1871! CMD byte access +SectorL=\$1872! 2 words +SectorH=\$1874! ! --------------------------------------- ! BUFFER management ! --------------------------------------- -BufferPtr=\$1848! -BufferLen=\$184A! +BufferPtr=\$1876! +BufferLen=\$1878! ! --------------------------------------- ! FAT entry ! --------------------------------------- -ClusterL=\$184C! 16 bits wide (FAT16) -ClusterH=\$184E! 16 bits wide (FAT16) -NewClusterL=\$1850! 16 bits wide (FAT16) -NewClusterH=\$1852! 16 bits wide (FAT16) -CurFATsector=\$1854! +ClusterL=\$187A! 16 bits wide (FAT16) +ClusterH=\$187C! 16 bits wide (FAT16) +NewClusterL=\$187E! 16 bits wide (FAT16) +NewClusterH=\$1880! 16 bits wide (FAT16) +CurFATsector=\$1882! ! --------------------------------------- ! DIR entry ! --------------------------------------- -DIRclusterL=\$1856! contains the Cluster of current directory ; 1 if FAT16 root directory -DIRclusterH=\$1858! contains the Cluster of current directory ; 1 if FAT16 root directory -EntryOfst=\$185A! +DIRclusterL=\$1884! contains the Cluster of current directory ; 1 if FAT16 root directory +DIRclusterH=\$1886! contains the Cluster of current directory ; 1 if FAT16 root directory +EntryOfst=\$1888! ! --------------------------------------- ! Handle Pointer ! --------------------------------------- -CurrentHdl=\$185C! contains the address of the last opened file structure, or 0 +CurrentHdl=\$188A! contains the address of the last opened file structure, or 0 ! --------------------------------------- ! Load file operation ! --------------------------------------- -pathname=\$185E! address of pathname string -EndOfPath=\$1860! +pathname=\$188C! address of pathname string +EndOfPath=\$188E! ! --------------------------------------- ! Handle structure ! --------------------------------------- -! three handle tokens : +! three handle tokens : ! token = 0 : free handle ! token = 1 : file to read ! token = 2 : file updated (write) @@ -137,13 +162,13 @@ HDLW_PrevLEN=24! previous LEN HDLW_PrevORG=26! previous ORG !OpenedFirstFile ; "openedFile" structure -HandleMax=5! +HandleMax=4! HandleLenght=28! -FirstHandle=\$1862! -HandleEnd=\$18EE! +FirstHandle=\$1890! +HandleEnd=\$1900! -SD_END=\$18EE! -SD_LEN=\$C2! +SD_END=\$1900! +SD_LEN=\$A6! ! ============================================ ! FRAM TLV @@ -236,32 +261,47 @@ MAIN_ORG=\$C200! Code space start MAIN_LEN=\$3E00! 15.5 k FRAM ! ---------------------------------------------- -SLEEP=\$C200! -BODYSLEEP=\$C204! -LIT=\$C20E! -NEXT_ADR=\$C216! -XSQUOTE=\$C218! -HEREADR=\$C22C! -QTBRAN=\$C238! -BRAN=\$C23E! -QFBRAN=\$C242! -SKIPBRAN=\$C248! -XDO=\$C24C! -XPLOOP=\$C25C! -XLOOP=\$C26E! -MUSMOD=\$C274! 32/16 unsigned division -MDIV1=\$C28E! input for 48/16 unsigned division -SETIB=\$C2BA! Set Input Buffer with org len values, reset >IN -REFILL=\$C2CA! accept one line from input and leave org len of input buffer -CIB_ADR=\$C2D8! contents currently TIB_ORG; may be redirected to SDIB_ORG -XDODOES=\$C2E2! restore rDODOES: MOV #XDODOES,rDODOES -XDOCON=\$C2F0! restore rDOCON: MOV #XDOCON,rDOCON -XDOCOL=\$C2FC! restore rDOCOL: MOV #XDOCOL,rDOCOL only for DTC model = 1 - -! to find DTC value, download \MSP430-FORTH\FastForthSpecs.4th -! if DTC = 1, restore rDOCOL as this : MOV #xdocol,rDOCOL -! if DTC = 2, restore rDOCOL as this : MOV #EXIT,rDOCOL -! if DTC = 3, nothing to do, R7 is free for use. +SLEEP=\$C200! CODE_WITHOUT_RETURN: CPU shutdown +LIT=\$C20A! CODE compiled by LITERAL +XSQUOTE=\$C214! CODE compiled by S" and S_ +HEREXEC=\$C228! CODE HERE and BEGIN execute address +QFBRAN=\$C234! CODE compiled by IF UNTIL +BRAN=\$C23A! CODE compiled by ELSE REPEAT AGAIN +NEXT_ADR=\$C23C! CODE NEXT instruction (MOV @IP+,PC) +XDO=\$C23E! CODE compiled by DO +XPLOOP=\$C24E! CODE compiled by +LOOP +XLOOP=\$C260! CODE compiled by LOOP +MUSMOD=\$C266! ASM 32/16 unsigned division, used by ?NUMBER, UM/MOD +MDIV1DIV2=\$C278! ASM input for 48/16 unsigned division with DVDhi=0, see DOUBLE M*/ +MDIV1=\$C280! ASM input for 48/16 unsigned division, see DOUBLE M*/ +RET_ADR=\$C2AA! ASM content of INI_FORTH_PFA and MARKER+8 definitions, +SETIB=\$C2AC! CODE Set Input Buffer with org & len values, reset >IN pointer +REFILL=\$C2BC! CODE accept one line from input and leave org len of input buffer +CIB_ADR=\$C2CA! [CIB_ADR] = TIB_ORG by default; may be redirected to SDIB_ORG +XDODOES=\$C2D4! restore rDODOES: MOV #XDODOES,rDODOES +XDOCON=\$C2E2! restore rDOCON: MOV #XDOCON,rDOCON +XDOVAR=\$C2EE! restore rDOVAR: MOV #XDOVAR,rDOVAR +!to find DTC value, download \MSP430-FORTH\FF_SPECS.4th +!XDOCOL=TYPE\+\-16 if DTC = 1, restore rDOCOL as this: MOV #TYPE+-16,rDOCOL +!XDOCOL=\#S\+16 if DTC = 2, restore rDOCOL as this: MOV ##S+16,rDOCOL +! if DTC = 3, nothing to do, R7 is free for use. +INI_FORTH=\$C2F8! CODE_WITHOUT_RETURN common part of RST and QABORT, starts FORTH engine +QABORT=\$C32A! CODE_WITHOUT_RETURN run-time part of ABORT" +3DROP=\$C330! CODE +ABORT_TERM=\$C336! CODE_WITHOUT_RETURN, called by QREVEAL and INTERPRET +!------------------------------------------------------------------------------- +UART_COLD_TERM=\$C394! ASM, content of COLD_PFA by default +UART_INIT_TERM=\$C39C! ASM, content of WARM_PFA by default +UART_RXON=\$C3C6! ASM, content of SLEEP_PFA by default +UART_RXOFF=\$C3C8! ASM, called by ACCEPT before RX char LF. +!------------------------------------------------------------------------------- +I2C_COLD_TERM=\$C3B4! ASM, content of COLD_PFA by default +I2C_INIT_TERM=\$C38A! ASM, content of WARM_PFA by default +I2C_RXON=\$C3B6! ASM, content of SLEEP_PFA by default +I2C_CTRL_CH=\$C3B8! ASM, used as is: MOV.B #CTRL_CHAR,Y +! CALL #I2C_CTRL_CH +!------------------------------------------------------------------------------- + ! ---------------------------------------------- ! Interrupt Vectors and signatures - MSP430FR5739 ! ---------------------------------------------- diff --git a/inc/MSP430FR5948.inc b/inc/MSP430FR5948.inc index 9f8f339..90f331b 100644 --- a/inc/MSP430FR5948.inc +++ b/inc/MSP430FR5948.inc @@ -1,5 +1,8 @@ ; MSP430FR5948.inc ; MSP430FR569 minimal declarations for FastForth usage + .save + .listing off + DEVICE = "MSP430FR5948" ; ---------------------------------------------- diff --git a/inc/MSP430FR5948.pat b/inc/MSP430FR5948.pat index 7ae2f81..6c9b8a3 100644 --- a/inc/MSP430FR5948.pat +++ b/inc/MSP430FR5948.pat @@ -28,22 +28,48 @@ INFO_LEN=\$0200! ! ---------------------------------------------- ! FastForth INFO ! ---------------------------------------------- -INI_THREAD=\$1800! .word THREADS -TERMBRW_RST=\$1802! .word TERMBRW_RST -TERMMCTLW_RST=\$1804! .word TERMMCTLW_RST -FREQ_KHZ=\$1806! .word FREQUENCY - -SAVE_SYSRSTIV=\$1808! to enable SYSRSTIV read -LPM_MODE=\$180A! LPM0+GIE is the default mode -INIDP=\$180C! define RST_STATE, init by wipe -INIVOC=\$180E! define RST_STATE, init by wipe -VERSION=\$1810! +FREQ_KHZ=\$1800! FREQUENCY (in kHz) +TERMBRW_RST=\$1802! TERMBRW_RST +TERMMCTLW_RST=\$1804! TERMMCTLW_RST +I2CSLAVEADR=\$1802! I2C_SLAVE address +I2CSLAVEADR1=\$1804! +LPM_MODE=\$1806! LPM_MODE value, LPM0+GIE is the default value +RSTIV_MEM=\$1808! SYSRSTIV memory, set to -1 to do Deep RESET +RST_DP=\$180A! RST value for DP +RST_VOC=\$180C! RST value for VOClink +VERSION=\$180E! +THREADS=\$1810! THREADS KERNEL_ADDON=\$1812! -RXON=\$1814! -RXOFF=\$1816! -ReadSectorWX=\$1818! call with W = SectorLO X = SectorHI -WriteSectorWX=\$181A! call with W = SectorLO X = SectorHI -TERMINAL_INT=\$181C! value for TERMINAL vector + +WIPE_INI_=\$1814! MOV #WIPE_INI,X +WIPE_COLD=\$1814! WIPE value for PFA_COLD +WIPE_INI_FORTH=\$1816! WIPE value for PFA_INI_FORTH +WIPE_SLEEP=\$1818! WIPE value for PFA_SLEEP +WIPE_WARM=\$181A! WIPE value for PFA_WARM +WIPE_TERM_INT=\$181C! WIPE value for TERMINAL vector +WIPE_DP=\$182E! WIPE value for RST_DP +WIPE_VOC=\$1820! WIPE value for RST_VOC + +INI_FORTH_INI=\$1822! MOV #INI_FORTH_INI,X \ >BODY instruction of INI_FORTH subroutine +INIT_ACCEPT=\$1822! WIPE value for PFAACCEPT +INIT_CR=\$1824! WIPE value for PFACR +INIT_EMIT=\$1826! FORTH value for PFAEMIT +INIT_KEY=\$1828! WIPE value for PFAKEY +INIT_CIB=\$182A! WIPE value for CIB_ADR +HALF_FORTH_INI=\$182C! to preserve the state of DEFERed words, used by user INI_SOFT_APP as: +! ADD #4,0(RSP) \ skip INI_FORTH >BODY instruction "MOV #INI_FORTH_INI,X" +! MOV #HALF_FORTH_INI,X \ replace it by "MOV #HALF_FORTH_INI,X" +! MOV @RSP+,PC \ then RET +INIT_DOCOL=\$182C! FORTH value for rDOCOL (R4) +INIT_DODOES=\$182E! FORTH value for rDODOES (R5) +INIT_DOCON=\$1830! FORTH value for rDOCON (R6) +INIT_DOVAR=\$1832! FORTH value for rDOVAR (R7) +INIT_CAPS=\$1834! FORTH value for CAPS +INIT_BASE=\$1836! FORTH value for BASE + +ABORT_ADR=\$1838! ABORT address +QUIT4_ADR=\$183A! QUIT4 used by BOOTLOADER +! free EPROM ! ============================================ ! FRAM TLV @@ -232,32 +258,47 @@ MAIN_ORG=\$4400! Code space start MAIN_LEN=\$BC00! 47 k FRAM ! ---------------------------------------------- -SLEEP=\$4400! -BODYSLEEP=\$4404! -LIT=\$440E! -NEXT_ADR=\$4416! -XSQUOTE=\$4418! -HEREADR=\$442C! -QTBRAN=\$4438! -BRAN=\$443E! -QFBRAN=\$4442! -SKIPBRAN=\$4448! -XDO=\$444C! -XPLOOP=\$445C! -XLOOP=\$446E! -MUSMOD=\$4474! 32/16 unsigned division -MDIV1=\$448E! input for 48/16 unsigned division -SETIB=\$44BA! Set Input Buffer with org len values, reset >IN -REFILL=\$44CA! accept one line from input and leave org len of input buffer -CIB_ADR=\$44D8! contents currently TIB_ORG; may be redirected to SDIB_ORG -XDODOES=\$44E2! restore rDODOES: MOV #XDODOES,rDODOES -XDOCON=\$44F0! restore rDOCON: MOV #XDOCON,rDOCON -XDOCOL=\$44FC! restore rDOCOL: MOV #XDOCOL,rDOCOL only for DTC model = 1 - -! to find DTC value, download \MSP430-FORTH\FastForthSpecs.4th -! if DTC = 1, restore rDOCOL as this : MOV #xdocol,rDOCOL -! if DTC = 2, restore rDOCOL as this : MOV #EXIT,rDOCOL -! if DTC = 3, nothing to do, R7 is free for use. +SLEEP=\$4400! CODE_WITHOUT_RETURN: CPU shutdown +LIT=\$440A! CODE compiled by LITERAL +XSQUOTE=\$4414! CODE compiled by S" and S_ +HEREXEC=\$4428! CODE HERE and BEGIN execute address +QFBRAN=\$4434! CODE compiled by IF UNTIL +BRAN=\$443A! CODE compiled by ELSE REPEAT AGAIN +NEXT_ADR=\$443C! CODE NEXT instruction (MOV @IP+,PC) +XDO=\$443E! CODE compiled by DO +XPLOOP=\$444E! CODE compiled by +LOOP +XLOOP=\$4460! CODE compiled by LOOP +MUSMOD=\$4466! ASM 32/16 unsigned division, used by ?NUMBER, UM/MOD +MDIV1DIV2=\$4478! ASM input for 48/16 unsigned division with DVDhi=0, see DOUBLE M*/ +MDIV1=\$4480! ASM input for 48/16 unsigned division, see DOUBLE M*/ +RET_ADR=\$44AA! ASM content of INI_FORTH_PFA and MARKER+8 definitions, +SETIB=\$44AC! CODE Set Input Buffer with org & len values, reset >IN pointer +REFILL=\$44BC! CODE accept one line from input and leave org len of input buffer +CIB_ADR=\$44CA! [CIB_ADR] = TIB_ORG by default; may be redirected to SDIB_ORG +XDODOES=\$44D4! restore rDODOES: MOV #XDODOES,rDODOES +XDOCON=\$44E2! restore rDOCON: MOV #XDOCON,rDOCON +XDOVAR=\$44EE! restore rDOVAR: MOV #XDOVAR,rDOVAR +!to find DTC value, download \MSP430-FORTH\FF_SPECS.4th +!XDOCOL=TYPE\+\-16 if DTC = 1, restore rDOCOL as this: MOV #TYPE+-16,rDOCOL +!XDOCOL=\#S\+16 if DTC = 2, restore rDOCOL as this: MOV ##S+16,rDOCOL +! if DTC = 3, nothing to do, R7 is free for use. +INI_FORTH=\$44F8! CODE_WITHOUT_RETURN common part of RST and QABORT, starts FORTH engine +QABORT=\$452A! CODE_WITHOUT_RETURN run-time part of ABORT" +3DROP=\$4530! CODE +ABORT_TERM=\$4536! CODE_WITHOUT_RETURN, called by QREVEAL and INTERPRET +!------------------------------------------------------------------------------- +UART_COLD_TERM=\$4594! ASM, content of COLD_PFA by default +UART_INIT_TERM=\$459C! ASM, content of WARM_PFA by default +UART_RXON=\$45C6! ASM, content of SLEEP_PFA by default +UART_RXOFF=\$45C8! ASM, called by ACCEPT before RX char LF. +!------------------------------------------------------------------------------- +I2C_COLD_TERM=\$45B4! ASM, content of COLD_PFA by default +I2C_INIT_TERM=\$458A! ASM, content of WARM_PFA by default +I2C_RXON=\$45B6! ASM, content of SLEEP_PFA by default +I2C_CTRL_CH=\$45B8! ASM, used as is: MOV.B #CTRL_CHAR,Y +! CALL #I2C_CTRL_CH +!------------------------------------------------------------------------------- + ! ---------------------------------------------- ! Interrupt Vectors and signatures - MSP430FR5948 ! ---------------------------------------------- diff --git a/inc/MSP430FR5969.inc b/inc/MSP430FR5969.inc index 6cae1ff..fed66a4 100644 --- a/inc/MSP430FR5969.inc +++ b/inc/MSP430FR5969.inc @@ -1,5 +1,8 @@ ; MSP430FR5969.inc ; MSP430FR569 minimal declarations for FastForth usage + .save + .listing off + DEVICE = "MSP430FR5969" ; ---------------------------------------------- diff --git a/inc/MSP430FR5969.pat b/inc/MSP430FR5969.pat index a0e24da..6578492 100644 --- a/inc/MSP430FR5969.pat +++ b/inc/MSP430FR5969.pat @@ -27,22 +27,48 @@ INFO_LEN=\$0200! ! ---------------------------------------------- ! FastForth INFO ! ---------------------------------------------- -INI_THREAD=\$1800! .word THREADS -TERMBRW_RST=\$1802! .word TERMBRW_RST -TERMMCTLW_RST=\$1804! .word TERMMCTLW_RST -FREQ_KHZ=\$1806! .word FREQUENCY - -SAVE_SYSRSTIV=\$1808! to enable SYSRSTIV read -LPM_MODE=\$180A! LPM0+GIE is the default mode -INIDP=\$180C! define RST_STATE, init by wipe -INIVOC=\$180E! define RST_STATE, init by wipe -VERSION=\$1810! +FREQ_KHZ=\$1800! FREQUENCY (in kHz) +TERMBRW_RST=\$1802! TERMBRW_RST +TERMMCTLW_RST=\$1804! TERMMCTLW_RST +I2CSLAVEADR=\$1802! I2C_SLAVE address +I2CSLAVEADR1=\$1804! +LPM_MODE=\$1806! LPM_MODE value, LPM0+GIE is the default value +RSTIV_MEM=\$1808! SYSRSTIV memory, set to -1 to do Deep RESET +RST_DP=\$180A! RST value for DP +RST_VOC=\$180C! RST value for VOClink +VERSION=\$180E! +THREADS=\$1810! THREADS KERNEL_ADDON=\$1812! -RXON=\$1814! -RXOFF=\$1816! -ReadSectorWX=\$1818! call with W = SectorLO X = SectorHI -WriteSectorWX=\$181A! call with W = SectorLO X = SectorHI -TERMINAL_INT=\$181C! value for TERMINAL vector + +WIPE_INI_=\$1814! MOV #WIPE_INI,X +WIPE_COLD=\$1814! WIPE value for PFA_COLD +WIPE_INI_FORTH=\$1816! WIPE value for PFA_INI_FORTH +WIPE_SLEEP=\$1818! WIPE value for PFA_SLEEP +WIPE_WARM=\$181A! WIPE value for PFA_WARM +WIPE_TERM_INT=\$181C! WIPE value for TERMINAL vector +WIPE_DP=\$182E! WIPE value for RST_DP +WIPE_VOC=\$1820! WIPE value for RST_VOC + +INI_FORTH_INI=\$1822! MOV #INI_FORTH_INI,X \ >BODY instruction of INI_FORTH subroutine +INIT_ACCEPT=\$1822! WIPE value for PFAACCEPT +INIT_CR=\$1824! WIPE value for PFACR +INIT_EMIT=\$1826! FORTH value for PFAEMIT +INIT_KEY=\$1828! WIPE value for PFAKEY +INIT_CIB=\$182A! WIPE value for CIB_ADR +HALF_FORTH_INI=\$182C! to preserve the state of DEFERed words, used by user INI_SOFT_APP as: +! ADD #4,0(RSP) \ skip INI_FORTH >BODY instruction "MOV #INI_FORTH_INI,X" +! MOV #HALF_FORTH_INI,X \ replace it by "MOV #HALF_FORTH_INI,X" +! MOV @RSP+,PC \ then RET +INIT_DOCOL=\$182C! FORTH value for rDOCOL (R4) +INIT_DODOES=\$182E! FORTH value for rDODOES (R5) +INIT_DOCON=\$1830! FORTH value for rDOCON (R6) +INIT_DOVAR=\$1832! FORTH value for rDOVAR (R7) +INIT_CAPS=\$1834! FORTH value for CAPS +INIT_BASE=\$1836! FORTH value for BASE + +ABORT_ADR=\$1838! ABORT address +QUIT4_ADR=\$183A! QUIT4 used by BOOTLOADER +! free EPROM ! ============================================ ! FRAM TLV @@ -231,32 +257,47 @@ MAIN_ORG=\$4400! Code space start MAIN_LEN=\$BC00! 47 k FRAM ! ---------------------------------------------- -SLEEP=\$4400! -BODYSLEEP=\$4404! -LIT=\$440E! -NEXT_ADR=\$4416! -XSQUOTE=\$4418! -HEREADR=\$442C! -QTBRAN=\$4438! -BRAN=\$443E! -QFBRAN=\$4442! -SKIPBRAN=\$4448! -XDO=\$444C! -XPLOOP=\$445C! -XLOOP=\$446E! -MUSMOD=\$4474! 32/16 unsigned division -MDIV1=\$448E! input for 48/16 unsigned division -SETIB=\$44BA! Set Input Buffer with org len values, reset >IN -REFILL=\$44CA! accept one line from input and leave org len of input buffer -CIB_ADR=\$44D8! contents currently TIB_ORG; may be redirected to SDIB_ORG -XDODOES=\$44E2! restore rDODOES: MOV #XDODOES,rDODOES -XDOCON=\$44F0! restore rDOCON: MOV #XDOCON,rDOCON -XDOCOL=\$44FC! restore rDOCOL: MOV #XDOCOL,rDOCOL only for DTC model = 1 - -! to find DTC value, download \MSP430-FORTH\FastForthSpecs.4th -! if DTC = 1, restore rDOCOL as this : MOV #xdocol,rDOCOL -! if DTC = 2, restore rDOCOL as this : MOV #EXIT,rDOCOL -! if DTC = 3, nothing to do, R7 is free for use. +SLEEP=\$4400! CODE_WITHOUT_RETURN: CPU shutdown +LIT=\$440A! CODE compiled by LITERAL +XSQUOTE=\$4414! CODE compiled by S" and S_ +HEREXEC=\$4428! CODE HERE and BEGIN execute address +QFBRAN=\$4434! CODE compiled by IF UNTIL +BRAN=\$443A! CODE compiled by ELSE REPEAT AGAIN +NEXT_ADR=\$443C! CODE NEXT instruction (MOV @IP+,PC) +XDO=\$443E! CODE compiled by DO +XPLOOP=\$444E! CODE compiled by +LOOP +XLOOP=\$4460! CODE compiled by LOOP +MUSMOD=\$4466! ASM 32/16 unsigned division, used by ?NUMBER, UM/MOD +MDIV1DIV2=\$4478! ASM input for 48/16 unsigned division with DVDhi=0, see DOUBLE M*/ +MDIV1=\$4480! ASM input for 48/16 unsigned division, see DOUBLE M*/ +RET_ADR=\$44AA! ASM content of INI_FORTH_PFA and MARKER+8 definitions, +SETIB=\$44AC! CODE Set Input Buffer with org & len values, reset >IN pointer +REFILL=\$44BC! CODE accept one line from input and leave org len of input buffer +CIB_ADR=\$44CA! [CIB_ADR] = TIB_ORG by default; may be redirected to SDIB_ORG +XDODOES=\$44D4! restore rDODOES: MOV #XDODOES,rDODOES +XDOCON=\$44E2! restore rDOCON: MOV #XDOCON,rDOCON +XDOVAR=\$44EE! restore rDOVAR: MOV #XDOVAR,rDOVAR +!to find DTC value, download \MSP430-FORTH\FF_SPECS.4th +!XDOCOL=TYPE\+\-16 if DTC = 1, restore rDOCOL as this: MOV #TYPE+-16,rDOCOL +!XDOCOL=\#S\+16 if DTC = 2, restore rDOCOL as this: MOV ##S+16,rDOCOL +! if DTC = 3, nothing to do, R7 is free for use. +INI_FORTH=\$44F8! CODE_WITHOUT_RETURN common part of RST and QABORT, starts FORTH engine +QABORT=\$452A! CODE_WITHOUT_RETURN run-time part of ABORT" +3DROP=\$4530! CODE +ABORT_TERM=\$4536! CODE_WITHOUT_RETURN, called by QREVEAL and INTERPRET +!------------------------------------------------------------------------------- +UART_COLD_TERM=\$4594! ASM, content of COLD_PFA by default +UART_INIT_TERM=\$459C! ASM, content of WARM_PFA by default +UART_RXON=\$45C6! ASM, content of SLEEP_PFA by default +UART_RXOFF=\$45C8! ASM, called by ACCEPT before RX char LF. +!------------------------------------------------------------------------------- +I2C_COLD_TERM=\$45B4! ASM, content of COLD_PFA by default +I2C_INIT_TERM=\$458A! ASM, content of WARM_PFA by default +I2C_RXON=\$45B6! ASM, content of SLEEP_PFA by default +I2C_CTRL_CH=\$45B8! ASM, used as is: MOV.B #CTRL_CHAR,Y +! CALL #I2C_CTRL_CH +!------------------------------------------------------------------------------- + ! ---------------------------------------------- ! Interrupt Vectors and signatures - MSP430FR5969 ! ---------------------------------------------- diff --git a/inc/MSP430FR5972.inc b/inc/MSP430FR5972.inc new file mode 100644 index 0000000..d718445 --- /dev/null +++ b/inc/MSP430FR5972.inc @@ -0,0 +1,513 @@ +; MSP430FR5972.inc, duplicated from MSP430FR6989.inc +; MSP430FR5972 minimal declarations for FastForth usage + .save + .listing off + +DEVICE = "MSP430FR5972" + + +; ---------------------------------------------- +; MSP430FR5972 MEMORY MAP +; ---------------------------------------------- + +; 0006-001F = tiny RAM (26 B) +; 0020-0FFF = peripherals (4 KB) +; 1000-17FF = BootStrap Loader BSL0..3 (ROM 4x512 B) +; 1800-187F = info D (FRAM 128 B) +; 1880-18FF = info C (FRAM 128 B) +; 1900-197F = info B (FRAM 128 B) +; 1980-19FF = info A (FRAM 128 B) +; 1A00-1AFF = TLV device descriptor info (FRAM 256 B) +; 1C00-23FF = RAM (2 KB) +; 2000-43FF = unused +; 4400-FF7F = code memory (FRAM 47999 B) +; FF80-FFFF = interrupt vectors (FRAM 128 B) +; 10000-13FFF = FRAM +; ---------------------------------------------- +PAGESIZE .equ 512 ; MPU unit +; ---------------------------------------------- +; FRAM ; INFO{D,C,B,A},TLV +; ---------------------------------------------- +INFO_ORG .equ 01800h +INFO_LEN .equ 00200h +INFOD_ORG .equ 01800h +INFOD_LEN .equ 00080h +INFOC_ORG .equ 01880h +INFOC_LEN .equ 00080h +INFOB_ORG .equ 01900h +INFOB_LEN .equ 00080h +INFOA_ORG .equ 01980h +INFOA_LEN .equ 00080h +TLV_ORG .equ 01A00h ; Device Descriptor Info (Tag-Lenght-Value) +TLV_LEN .equ 00100h ; +; ---------------------------------------------- +; RAM +; ---------------------------------------------- +RAM_ORG .equ 01C00h +RAM_LEN .equ 00800h +; ---------------------------------------------- +; FRAM +; ---------------------------------------------- +MAIN_ORG .equ 04400h ; Code space start +MAIN_LEN .equ 0FC00h ; 64 k FRAM +; ---------------------------------------------- +; Interrupt Vectors and signatures +; ---------------------------------------------- +SIGNATURES .equ 0FF80h ; JTAG, BSL and IP Encapsulation signatures 1 and 2 +JTAG_SIG1 .equ 0FF80h ; if 0, enable JTAG/SBW +JTAG_SIG2 .equ 0FF82h ; if JTAG_SIG1=0xAAAA, length of password string @ JTAG_PASSWORD +BSL_SIG1 .equ 0FF84h ; +BSL_SIG2 .equ 0FF86h ; +JTAG_PASSWORD .equ 0FF86h ; up to 0FFC5h : 256 bits +I2CSLA0 .equ 0FFA2h ; UCBxI2COA0 default value address +I2CSLA1 .equ 0FFA4h ; UCBxI2COA1 default value address +I2CSLA2 .equ 0FFA6h ; UCBxI2COA2 default value address +I2CSLA3 .equ 0FFA8h ; UCBxI2COA3 default value address +VECT_ORG .equ 0FFC6h ; FFC6-FFFF +VECT_LEN .equ 3Ah +BSL_PASSWORD .equ 0FFE0h ; up to 0FFFFh : 256 bits +; +; ---------------------------------------------------------------------- +; MSP430FR5972 Peripheral File Map +; ---------------------------------------------------------------------- +SFR_SFR .set 0100h ; Special function +PMM_SFR .set 0120h ; PMM +FRAM_SFR .set 0140h ; FRAM control +CRC16_SFR .set 0150h +RAMC_SFR .set 0158h ; RAM controller +WDT_A_SFR .set 015Ch ; Watchdog +CS_SFR .set 0160h ; Clock System +SYS_SFR .set 0180h ; SYS +REF_SFR .set 01B0h ; shared REF +PA_SFR .set 0200h ; PORT1/2 +PB_SFR .set 0220h ; PORT3/4 +PC_SFR .set 0240h ; PORT5/6 +P7_SFR .set 0260h ; PORT7 +P9_SFR .set 0280h ; PORT9 +PJ_SFR .set 0320h ; PORTJ +TA0_SFR .set 0340h +TA1_SFR .set 0380h +TB0_SFR .set 03C0h +TA2_SFR .set 0400h +CTIO0_SFR .set 0430h ; Capacitive Touch IO +TA3_SFR .set 0440h +CTIO1_SFR .set 0470h ; Capacitive Touch IO +RTC_C_SFR .set 04A0h +MPY_SFR .set 04C0h +DMA_CTRL_SFR .set 0500h +DMA_CHN0_SFR .set 0510h +DMA_CHN1_SFR .set 0520h +DMA_CHN2_SFR .set 0530h +MPU_SFR .set 05A0h ; memory protect unit +eUSCI_A0_SFR .set 05C0h ; eUSCI_A0 +eUSCI_A1_SFR .set 05E0h ; eUSCI_A1 +eUSCI_B0_SFR .set 0640h ; eUSCI_B0 +eUSCI_B1_SFR .set 0680h ; eUSCI_B1 +ADC12_B_SFR .set 0800h +COMP_E_SFR .set 08C0h +CRC32_SFR .set 0980h +AES_SFR .set 09C0h + +UCSWRST .equ 1 ; eUSCI Software Reset +UCTXIE .equ 2 ; eUSCI Transmit Interrupt Enable +UCRXIE .equ 1 ; eUSCI Receive Interrupt Enable +UCTXIFG .equ 2 ; eUSCI Transmit Interrupt Flag +UCRXIFG .equ 1 ; eUSCI Receive Interrupt Flag + + +; ---------------------------------------------------------------------- +; POWER ON RESET AND INITIALIZATION : LOCK PMM_LOCKLPM5 +; ---------------------------------------------------------------------- +SFRIE1 .equ SFR_SFR +SFRIFG1 .equ SFR_SFR + 2 +SFRRPCR .equ SFR_SFR + 4 + +PMMCTL0 .set PMM_SFR +PMMSWBOR .set 4 + +PM5CTL0 .set PMM_SFR + 10h ; Power mode 5 control register 0 +LOCKLPM5 .set 1 + +; ---------------------------------------------------------------------- +; FRAM config +; ---------------------------------------------------------------------- +FRCTL0 .set FRAM_SFR + 00h ; FRAM Controller Control 0 +FRCTL0_H .set FRAM_SFR + 01h ; FRAM Controller Control 0 high byte + +; ---------------------------------------------------------------------- +; POWER ON RESET AND INITIALIZATION : WATCHDOG TIMER A +; ---------------------------------------------------------------------- + +WDTCTL .equ WDT_A_SFR + 00h ; Watchdog Timer Control */ + +; WDTCTL Control Bits +WDTPW .equ 5A00h +WDTHOLD .equ 0080h ; WDT - Timer hold +WDTCNTCL .equ 0008h ; WDT timer counter clear + +; ---------------------------------------------------------------------- +; POWER ON RESET AND INITIALIZATION : CLOCK SYSTEM +; ---------------------------------------------------------------------- + +CSCTL0 .equ CS_SFR + 00h ; CS Control Register 0 +CSCTL0_H .equ CS_SFR + 01h ; CS Control Register 0 high byte +CSCTL1 .equ CS_SFR + 02h ; CS Control Register 1 +CSCTL2 .equ CS_SFR + 04h ; CS Control Register 2 +CSCTL3 .equ CS_SFR + 06h ; CS Control Register 3 + +; CSCTL0 Control Bits +CSKEY .equ 0A5h ; CS Password +; CSCTL1 Control Bits +DCORSEL .equ 0040h +DCOFSEL0 .equ 0002h ; DCO frequency select Bit: 0 +DCOFSEL1 .equ 0004h ; DCO frequency select Bit: 1 +DCOFSEL2 .equ 0008h ; DCO frequency select Bit: 2 +DCOFSEL3 .equ 000Ch ; DCO frequency select Bit: 21 +; CSCTL2 Control Bits +SELA_LFXCLK .equ 0000h ; 0 : ACLK Source Select LFXCLK +SELA_VLOCLK .equ 0100h ; 1 ACLK Source Select VLOCLK 10kHz +SELS_DCOCLK .equ 0030h ; 3 : SMCLK Source Select DCOCLK +SELM_DCOCLK .equ 0003h ; 3 : MCLK Source Select DCOCLK +; CSCTL3 Control Bits +DIVA_0 .equ 0000h ; ACLK Source Divider 0 +DIVS_0 .equ 0000h ; SMCLK Source Divider 0 +DIVM_0 .equ 0000h ; MCLK Source Divider 0 +DIVA_2 .equ 0100h ; ACLK Source Divider 0 +DIVS_2 .equ 0010h ; SMCLK Source Divider 0 +DIVM_2 .equ 0001h ; MCLK Source Divider 0 +DIVA_4 .equ 0200h ; ACLK Source Divider 0 +DIVS_4 .equ 0020h ; SMCLK Source Divider 0 +DIVM_4 .equ 0002h ; MCLK Source Divider 0 +DIVA_8 .equ 0300h ; ACLK Source Divider 0 +DIVS_8 .equ 0030h ; SMCLK Source Divider 0 +DIVM_8 .equ 0003h ; MCLK Source Divider 0 +DIVA_16 .equ 0400h ; ACLK Source Divider 0 +DIVS_16 .equ 0040h ; SMCLK Source Divider 0 +DIVM_16 .equ 0004h ; MCLK Source Divider 0 +DIVA_32 .equ 0500h ; ACLK Source Divider 0 +DIVS_32 .equ 0050h ; SMCLK Source Divider 0 +DIVM_32 .equ 0005h ; MCLK Source Divider 0 + +; ---------------------------------------------------------------------- +; POWER ON RESET AND INITIALIZATION : SYS REGISTERS +; ---------------------------------------------------------------------- + +SYSUNIV .equ SYS_SFR + 001Ah +SYSSNIV .equ SYS_SFR + 001Ch +SYSRSTIV .equ SYS_SFR + 001Eh + +; SYS Control Bits +; ... +; ---------------------------------------------------------------------- +; POWER ON RESET AND INITIALIZATION : REF +; ---------------------------------------------------------------------- + +REFCTL equ REF_SFR + 00h ; REF Shared Reference control register 0 + +; REFCTL0 Control Bits +REFON equ 0001h ; REF Reference On +REFTCOFF equ 0008h ; REF Temp.Sensor off + +; ---------------------------------------------------------------------- +; POWER ON RESET AND INITIALIZATION : PORT1/2 +; ---------------------------------------------------------------------- + +PAIN .equ PA_SFR + 00h ; Port A INput +PAOUT .equ PA_SFR + 02h ; Port A OUTput +PADIR .equ PA_SFR + 04h ; Port A DIRection +PAREN .equ PA_SFR + 06h ; Port A Resistor ENable +PASEL0 .equ PA_SFR + 0Ah ; Port A SELection 0 +PASEL1 .equ PA_SFR + 0Ch ; Port A SELection 1 +PASELC .equ PA_SFR + 16h ; Port A SELection Complement +PAIES .equ PA_SFR + 18h ; Port A Interrupt Edge Select +PAIE .equ PA_SFR + 1Ah ; Port A Interrupt Enable +PAIFG .equ PA_SFR + 1Ch ; Port A Interrupt FlaG + +P1IN .equ PA_SFR + 00h ; Port 1 INput +P1OUT .equ PA_SFR + 02h ; Port 1 OUTput +P1DIR .equ PA_SFR + 04h ; Port 1 DIRection +P1REN .equ PA_SFR + 06h ; Port 1 Resistor ENable +P1SEL0 .equ PA_SFR + 0Ah ; Port 1 SELection 0 +P1SEL1 .equ PA_SFR + 0Ch ; Port 1 SELection 1 +P1SELC .equ PA_SFR + 16h ; Port 1 SELection Complement +P1IES .equ PA_SFR + 18h ; Port 1 Interrupt Edge Select +P1IE .equ PA_SFR + 1Ah ; Port 1 Interrupt Enable +P1IFG .equ PA_SFR + 1Ch ; Port 1 Interrupt FlaG +P1IV .equ PA_SFR + 0Eh ; Port 1 Interrupt Vector word + +P2IN .equ PA_SFR + 01h ; Port 2 INput +P2OUT .equ PA_SFR + 03h ; Port 2 OUTput +P2DIR .equ PA_SFR + 05h ; Port 2 DIRection +P2REN .equ PA_SFR + 07h ; Port 2 Resistor ENable +P2SEL0 .equ PA_SFR + 0Bh ; Port 2 SELection 0 +P2SEL1 .equ PA_SFR + 0Dh ; Port 2 SELection 1 +P2SELC .equ PA_SFR + 17h ; Port 2 SELection Complement +P2IES .equ PA_SFR + 19h ; Port 2 Interrupt Edge Select +P2IE .equ PA_SFR + 1Bh ; Port 2 Interrupt Enable +P2IFG .equ PA_SFR + 1Dh ; Port 2 Interrupt FlaG +P2IV .equ PA_SFR + 1Eh ; Port 2 Interrupt Vector word + +; ---------------------------------------------------------------------- +; POWER ON RESET AND INITIALIZATION : PORT3/4 +; ---------------------------------------------------------------------- + +PBIN .equ PB_SFR + 00h ; Port B Input +PBOUT .equ PB_SFR + 02h ; Port B Output 1/0 or pullup/pulldown resistor +PBDIR .equ PB_SFR + 04h ; Port B Direction +PBREN .equ PB_SFR + 06h ; Port B Resistor Enable +PBSEL0 .equ PB_SFR + 0Ah ; Port B Selection 0 +PBSEL1 .equ PB_SFR + 0Ch ; Port B Selection 1 +PBSELC .equ PB_SFR + 16h ; Port B Complement Selection +PBIES .equ PB_SFR + 18h ; Port B Interrupt Edge Select +PBIE .equ PB_SFR + 1Ah ; Port B Interrupt Enable +PBIFG .equ PB_SFR + 1Ch ; Port B Interrupt Flag + +P3IN .equ PB_SFR + 00h ; Port 3 Input */ +P3OUT .equ PB_SFR + 02h ; Port 3 Output +P3DIR .equ PB_SFR + 04h ; Port 3 Direction +P3REN .equ PB_SFR + 06h ; Port 3 Resistor Enable +P3SEL0 .equ PB_SFR + 0Ah ; Port 3 Selection 0 +P3SEL1 .equ PB_SFR + 0Ch ; Port 3 Selection 1 +P3SELC .equ PB_SFR + 16h ; Port 3 Complement Selection +P3IES .equ PB_SFR + 18h ; Port 3 Interrupt Edge Select +P3IE .equ PB_SFR + 1Ah ; Port 3 Interrupt Enable +P3IFG .equ PB_SFR + 1Ch ; Port 3 Interrupt Flag +P3IV .equ PB_SFR + 0Eh ; Port 3 Interrupt Vector word + +P4IN .equ PB_SFR + 01h ; Port 4 Input */ +P4OUT .equ PB_SFR + 03h ; Port 4 Output +P4DIR .equ PB_SFR + 05h ; Port 4 Direction +P4REN .equ PB_SFR + 07h ; Port 4 Resistor Enable +P4SEL0 .equ PB_SFR + 0Bh ; Port 4 Selection 0 +P4SEL1 .equ PB_SFR + 0Dh ; Port 4 Selection 1 +P4SELC .equ PB_SFR + 17h ; Port 4 Complement Selection +P4IES .equ PB_SFR + 19h ; Port 4 Interrupt Edge Select +P4IE .equ PB_SFR + 1Bh ; Port 4 Interrupt Enable +P4IFG .equ PB_SFR + 1Dh ; Port 4 Interrupt Flag +P4IV .equ PB_SFR + 1Eh ; Port 4 Interrupt Vector word + +; ---------------------------------------------------------------------- +; POWER ON RESET AND INITIALIZATION : PORT5/6 +; ---------------------------------------------------------------------- + +PCIN .set PC_SFR + 00h ; Port C Input +PCOUT .set PC_SFR + 02h ; Port C Output 1/0 or pullup/pulldown resistor +PCDIR .set PC_SFR + 04h ; Port C Direction +PCREN .set PC_SFR + 06h ; Port C Resistor Enable +PCSEL0 .set PC_SFR + 0Ah ; Port C Selection 0 +PCSEL1 .set PC_SFR + 0Ch ; Port C Selection 1 +PCSELC .set PC_SFR + 16h ; Port C Complement Selection + +P5IN .set PC_SFR + 00h ; Port 5 Input */ +P5OUT .set PC_SFR + 02h ; Port 5 Output +P5DIR .set PC_SFR + 04h ; Port 5 Direction +P5REN .set PC_SFR + 06h ; Port 5 Resistor Enable +P5SEL0 .set PC_SFR + 0Ah ; Port 5 Selection 0 +P5SEL1 .set PC_SFR + 0Ch ; Port 5 Selection 1 +P5SELC .set PC_SFR + 16h ; Port 5 Complement Selection + +P6IN .set PC_SFR + 01h ; Port 6 Input */ +P6OUT .set PC_SFR + 03h ; Port 6 Output +P6DIR .set PC_SFR + 05h ; Port 6 Direction +P6REN .set PC_SFR + 07h ; Port 6 Resistor Enable +P6SEL0 .set PC_SFR + 0Bh ; Port 6 Selection 0 +P6SEL1 .set PC_SFR + 0Dh ; Port 6 Selection 1 +P6SELC .set PC_SFR + 17h ; Port 6 Complement Selection + +; ---------------------------------------------------------------------- +; POWER ON RESET AND INITIALIZATION : PORT7 +; ---------------------------------------------------------------------- + +P7IN .set PD_SFR + 00h ; Port 7 Input */ +P7OUT .set PD_SFR + 02h ; Port 7 Output +P7DIR .set PD_SFR + 04h ; Port 7 Direction +P7REN .set PD_SFR + 06h ; Port 7 Resistor Enable +P7SEL0 .set PD_SFR + 0Ah ; Port 7 Selection 0 +P7SEL1 .set PD_SFR + 0Ch ; Port 7 Selection 1 +P7SELC .set PD_SFR + 16h ; Port 7 Complement Selection + +; ---------------------------------------------------------------------- +; POWER ON RESET AND INITIALIZATION : PORT9 +; ---------------------------------------------------------------------- + +P9IN .set PE_SFR + 00h ; Port 9 Input */ +P9OUT .set PE_SFR + 02h ; Port 9 Output +P9DIR .set PE_SFR + 04h ; Port 9 Direction +P9REN .set PE_SFR + 06h ; Port 9 Resistor Enable +P9SEL0 .set PE_SFR + 0Ah ; Port 9 Selection 0 +P9SEL1 .set PE_SFR + 0Ch ; Port 9 Selection 1 +P9SELC .set PE_SFR + 16h ; Port 9 Complement Selection + +; ---------------------------------------------------------------------- +; POWER ON RESET AND INITIALIZATION : PORTJ +; ---------------------------------------------------------------------- + +PJIN .equ PJ_SFR + 00h ; Port J INput +PJOUT .equ PJ_SFR + 02h ; Port J OUTput +PJDIR .equ PJ_SFR + 04h ; Port J DIRection +PJREN .equ PJ_SFR + 06h ; Port J Resistor ENable +PJSEL0 .equ PJ_SFR + 0Ah ; Port 2 SELection 0 +PJSEL1 .equ PJ_SFR + 0Ch ; Port 2 SELection 1 +PJSELC .equ PJ_SFR + 16h ; Port 2 SELection Complement; PJ 5-0 usage + +; ---------------------------------------------------------------------- +RTC_C +; ---------------------------------------------------------------------- +RTCCTL0_L .set RTC_C_SFR + 00h +RTCCTL0_H .set RTC_C_SFR + 01h +RTCCTL1 .set RTC_C_SFR + 02h +RTCCTL3 .set RTC_C_SFR + 03h +RTCOCAL .set RTC_C_SFR + 04h +RTCTCMP .set RTC_C_SFR + 06h +RTCPS0CTL .set RTC_C_SFR + 08h +RTCPS1CTL .set RTC_C_SFR + 0Ah +RTCPS .set RTC_C_SFR + 0Ch ; = RT1PS:RT0PS +RTCIV .set RTC_C_SFR + 0Eh +RTCSEC .set RTC_C_SFR + 10h +RTCCNT1 .set RTC_C_SFR + 10h +RTCMIN .set RTC_C_SFR + 11h +RTCCNT2 .set RTC_C_SFR + 11h +RTCHOUR .set RTC_C_SFR + 12h +RTCCNT3 .set RTC_C_SFR + 12h +RTCDOW .set RTC_C_SFR + 13h +RTCCNT4 .set RTC_C_SFR + 13h +RTCDAY .set RTC_C_SFR + 14h +RTCMON .set RTC_C_SFR + 15h +RTCYEAR .set RTC_C_SFR + 16h + +RTCHOLD .set 40h +RTCRDY .set 10h + +; ---------------------------------------------------------------------- +MPY_32 +; ---------------------------------------------------------------------- + +MPY .equ MPY_SFR + 00h ; Multiply16 Unsigned/Operand 1 */ +MPYS .equ MPY_SFR + 02h ; Multiply16 signed/Operand 1 +MAC .equ MPY_SFR + 04h ; MultiplyAccumulate16 Unsigned/Operand 1 */ +MACS .equ MPY_SFR + 06h ; MultiplyAccumulate16 signed/Operand 1 +OP2 .equ MPY_SFR + 08h ; Operand2_16 */ +RESLO .equ MPY_SFR + 0Ah ; 16x16-bit result low - least significant word */ +RESHI .equ MPY_SFR + 0Ch ; 16x16-bit result high */ +SUMEXT .equ MPY_SFR + 0Eh ; 16x16-bit sum extension register +MPY32L .equ MPY_SFR + 10h ; Multiply32 Unsigned/Operand 1 +MPY32H .equ MPY_SFR + 12h ; Multiply32 Unsigned/Operand 1 +MPYS32L .equ MPY_SFR + 14h ; Multiply32 signed/Operand 1 +MPYS32H .equ MPY_SFR + 16h ; Multiply32 signed/Operand 1 +MAC32L .equ MPY_SFR + 18h ; MultiplyAccumulate32 Unsigned/Operand 1 +MAC32H .equ MPY_SFR + 1Ah ; MultiplyAccumulate32 Unsigned/Operand 1 +MACS32L .equ MPY_SFR + 1Ch ; MultiplyAccumulate32 signed/Operand 1 +MACS32H .equ MPY_SFR + 1Eh ; MultiplyAccumulate32 signed/Operand 1 +OP2L .equ MPY_SFR + 20h ; Multiply32 Operand 2 +OP2H .equ MPY_SFR + 22h ; Multiply32 Operand 2 +RES0 .equ MPY_SFR + 24h ; 32x32-bit result 0 - least significant word */ +RES1 .equ MPY_SFR + 26h ; 32x32-bit result 1 */ +RES2 .equ MPY_SFR + 28h ; 32x32-bit result 2 */ +RES3 .equ MPY_SFR + 2Ah ; 32x32-bit result 3 */ +MPY32CTL0 .equ MPY_SFR + 2Ch ; MPY32 control register 0 + + +MPUCTL0 .equ MPU_SFR + 00h ; MPU control 0 +MPUCTL1 .equ MPU_SFR + 02h ; MPU control 1 +MPUSEGB2 .equ MPU_SFR + 04h ; MPU Segmentation Border 2 +MPUSEGB1 .equ MPU_SFR + 06h ; MPU Segmentation Border 1 +MPUSAM .equ MPU_SFR + 08h ; MPU access management +MPUIPC0 .equ MPU_SFR + 0Ah ; MPU IP control 0 +MPUIPSEGB2 .equ MPU_SFR + 0Ch ; MPU IP Encapsulation Segment Border 2 +MPUIPSEGB1 .equ MPU_SFR + 0Eh ; MPU IP Encapsulation Segment Border 1 + +; ---------------------------------------------------------------------- +; eUSCI_A0 +; ---------------------------------------------------------------------- + + .IFDEF UCA0_TERM +TERM_CTLW0 .equ eUSCI_A0_SFR + 00h ; eUSCI_A0 Control Word Register 0 +TERM_BRW .equ eUSCI_A0_SFR + 06h ; eUSCI_A0 Baud Word Rate 0 +TERM_MCTLW .equ eUSCI_A0_SFR + 08h ; eUSCI_A0 Modulation Control +TERM_STATW .equ eUSCI_A0_SFR + 0Ah ; eUSCI_A0 status Word Register +TERM_RXBUF .equ eUSCI_A0_SFR + 0Ch ; eUSCI_A0 Receive Buffer +TERM_TXBUF .equ eUSCI_A0_SFR + 0Eh ; eUSCI_A0 Transmit Buffer +TERM_IE .equ eUSCI_A0_SFR + 1Ah ; eUSCI_A0 Interrupt Enable Register +TERM_IFG .equ eUSCI_A0_SFR + 1Ch ; eUSCI_A0 Interrupt Flags Register +TERM_VEC .equ 0FFEEh ; interrupt vector for eUSCI_A0 +RX_TERM .equ 1 +TX_TERM .equ 2 + .ENDIF ;UCA0_TERM + + .IFDEF UCA0_SD +SD_CTLW0 .equ eUSCI_A0_SFR + 00h ; eUSCI_A0 Control Word Register 0 +SD_BRW .equ eUSCI_A0_SFR + 06h ; eUSCI_A0 Baud Word Rate 0 +SD_RXBUF .equ eUSCI_A0_SFR + 0Ch ; eUSCI_A0 Receive Buffer 8 +SD_TXBUF .equ eUSCI_A0_SFR + 0Eh ; eUSCI_A0 Transmit Buffer 8 +SD_IFG .equ eUSCI_A0_SFR + 1Ch ; eUSCI_A0 Interrupt Flags Register +RX_SD .equ 1 +TX_SD .equ 2 + .ENDIF ;UCA0_SD + +; ---------------------------------------------------------------------- +; eUSCI_A1 +; ---------------------------------------------------------------------- + + .IFDEF UCA1_TERM +TERM_CTLW0 .equ eUSCI_A1_SFR + 00h ; eUSCI_A1 Control Word Register 0 +TERM_BRW .equ eUSCI_A1_SFR + 06h ; eUSCI_A1 Baud Word Rate 0 +TERM_MCTLW .equ eUSCI_A1_SFR + 08h ; eUSCI_A1 Modulation Control +TERM_STATW .equ eUSCI_A1_SFR + 0Ah ; eUSCI_A1 status Word Register +TERM_RXBUF .equ eUSCI_A1_SFR + 0Ch ; eUSCI_A1 Receive Buffer +TERM_TXBUF .equ eUSCI_A1_SFR + 0Eh ; eUSCI_A1 Transmit Buffer +TERM_IE .equ eUSCI_A1_SFR + 1Ah ; eUSCI_A1 Interrupt Enable Register +TERM_IFG .equ eUSCI_A1_SFR + 1Ch ; eUSCI_A1 Interrupt Flags Register + +TERM_VEC .equ 0FFE4h ; interrupt vector for eUSCI_A1 +WAKE_UP .equ 1 ; UART RX interrupt + +RX_TERM .equ 1 +TX_TERM .equ 2 + .ENDIF ;UCA1_TERM + + .IFDEF UCA1_SD +SD_CTLW0 .equ eUSCI_A1_SFR + 00h ; eUSCI_A1 Control Word Register 0 +SD_BRW .equ eUSCI_A1_SFR + 06h ; eUSCI_A1 Baud Word Rate 0 +SD_RXBUF .equ eUSCI_A1_SFR + 0Ch ; eUSCI_A1 Receive Buffer 8 +SD_TXBUF .equ eUSCI_A1_SFR + 0Eh ; eUSCI_A1 Transmit Buffer 8 +SD_IFG .equ eUSCI_A1_SFR + 1Ch ; eUSCI_A1 Interrupt Flags Register +RX_SD .equ 1 +TX_SD .equ 2 + .ENDIF ;UCA1_SD + + +; ---------------------------------------------------------------------- +; eUSCI_B0 +; ---------------------------------------------------------------------- + .IFDEF UCB0_SD +SD_CTLW0 .equ eUSCI_B0_SFR + 00h ; eUSCI_B0 Control Word Register 0 +SD_BRW .equ eUSCI_B0_SFR + 06h ; eUSCI_B0 Baud Word Rate 0 +SD_RXBUF .equ eUSCI_B0_SFR + 0Ch ; eUSCI_B0 Receive Buffer 8 +SD_TXBUF .equ eUSCI_B0_SFR + 0Eh ; eUSCI_B0 Transmit Buffer 8 +SD_IFG .equ eUSCI_B0_SFR + 2Ch ; eUSCI_B0 Interrupt Flags Register +RX_SD .equ 1 +TX_SD .equ 2 + .ENDIF ;UCB0_SD + + .IFDEF UCB0_TERM +TERM_CTLW0 .equ eUSCI_B0_SFR + 00h ; USCI_B0 Control Word Register 0 +TERM_CTLW1 .equ eUSCI_B0_SFR + 02h ; USCI_B0 Control Word Register 1 +TERM_BRW .equ eUSCI_B0_SFR + 06h ; USCI_B0 Baud Word Rate 0 +TERM_STATW .equ eUSCI_B0_SFR + 08h ; USCI_B0 Status Word +TERM_RXBUF .equ eUSCI_B0_SFR + 0Ch ; USCI_B0 Receive Buffer 8 +TERM_TXBUF .equ eUSCI_B0_SFR + 0Eh ; USCI_B0 Transmit Buffer 8 +TERM_I2COA0 .equ eUSCI_B0_SFR + 14h ; USCI_B0 I2C Own Address 0 +TERM_ADDRX .equ eUSCI_B0_SFR + 1Ch ; USCI_B0 Received Address Register +TERM_I2CSA .equ eUSCI_B0_SFR + 20h ; USCI_B0 I2C Slave Address +TERM_IE .equ eUSCI_B0_SFR + 2Ah ; USCI_B0 Interrupt Enable +TERM_IFG .equ eUSCI_B0_SFR + 2Ch ; USCI_B0 Interrupt Flags Register + +TERM_VEC .equ 0FFECh ; interrupt vector for eUSCI_B0 +WAKE_UP .equ 4 ; START interrupt + +RX_TERM .equ 1 +TX_TERM .equ 2 + .ENDIF ;UCB0_TERM + + + diff --git a/inc/MSP430FR5972.pat b/inc/MSP430FR5972.pat new file mode 100644 index 0000000..49923d0 --- /dev/null +++ b/inc/MSP430FR5972.pat @@ -0,0 +1,889 @@ +!MSP430FR5972.pat, duplicated from MSP430fr6989.pat + +! ---------------------------------------------- +! MSP430FR5972 MEMORY MAP +! ---------------------------------------------- +! 0000-0005 = reserved ROM +! 0006-001F = tiny RAM 26 bytes +! 0020-0FFF = peripherals (4 KB) +! 1000-17FF = ROM bootstrap loader BSL0..3 (4x512 B) +! 1800-19FF = FRAM INFO 512 B +! 1A00-1AFF = TLV device descriptor info (FRAM 256 B) +! 1B00-1BFF = ROM boot memory +! 1C00-23FF = RAM (2 KB) +! 4400-FF7F = code memory (FRAM 48 kB) +! FF80-FFFF = interrupt vectors (FRAM 127 B) +! ---------------------------------------------- + + +! ============================================ +! TINY RAM +! ============================================ +TinyRAM_ORG=\$06! +TinyRAM_LEN=\$20! + +! ============================================ +! BSL +! ============================================ +BSL1=\$1000! + +! ============================================ +! FRAM INFO +! ============================================ +INFO_ORG=\$1800! +INFO_LEN=\$0200! + +! You can check the addresses below by comparing their values in DTCforthMSP430FRxxxx.lst +! those addresses are usable with the symbolic assembler +! ---------------------------------------------- +! FastForth INFO +! ---------------------------------------------- +FREQ_KHZ=\$1800! FREQUENCY (in kHz) +TERMBRW_RST=\$1802! TERMBRW_RST +TERMMCTLW_RST=\$1804! TERMMCTLW_RST +I2CSLAVEADR=\$1802! I2C_SLAVE address +I2CSLAVEADR1=\$1804! +LPM_MODE=\$1806! LPM_MODE value, LPM0+GIE is the default value +RSTIV_MEM=\$1808! SYSRSTIV memory, set to -1 to do Deep RESET +RST_DP=\$180A! RST value for DP +RST_VOC=\$180C! RST value for VOClink +VERSION=\$180E! +THREADS=\$1810! THREADS +KERNEL_ADDON=\$1812! + +WIPE_INI_=\$1814! MOV #WIPE_INI,X +WIPE_COLD=\$1814! WIPE value for PFA_COLD +WIPE_INI_FORTH=\$1816! WIPE value for PFA_INI_FORTH +WIPE_SLEEP=\$1818! WIPE value for PFA_SLEEP +WIPE_WARM=\$181A! WIPE value for PFA_WARM +WIPE_TERM_INT=\$181C! WIPE value for TERMINAL vector +WIPE_DP=\$182E! WIPE value for RST_DP +WIPE_VOC=\$1820! WIPE value for RST_VOC + +INI_FORTH_INI=\$1822! MOV #INI_FORTH_INI,X \ >BODY instruction of INI_FORTH subroutine +INIT_ACCEPT=\$1822! WIPE value for PFAACCEPT +INIT_CR=\$1824! WIPE value for PFACR +INIT_EMIT=\$1826! FORTH value for PFAEMIT +INIT_KEY=\$1828! WIPE value for PFAKEY +INIT_CIB=\$182A! WIPE value for CIB_ADR +HALF_FORTH_INI=\$182C! to preserve the state of DEFERed words, used by user INI_SOFT_APP as: +! ADD #4,0(RSP) \ skip INI_FORTH >BODY instruction "MOV #INI_FORTH_INI,X" +! MOV #HALF_FORTH_INI,X \ replace it by "MOV #HALF_FORTH_INI,X" +! MOV @RSP+,PC \ then RET +INIT_DOCOL=\$182C! FORTH value for rDOCOL (R4) +INIT_DODOES=\$182E! FORTH value for rDODOES (R5) +INIT_DOCON=\$1830! FORTH value for rDOCON (R6) +INIT_DOVAR=\$1832! FORTH value for rDOVAR (R7) +INIT_CAPS=\$1834! FORTH value for CAPS +INIT_BASE=\$1836! FORTH value for BASE + +ABORT_ADR=\$1838! ABORT address +QUIT4_ADR=\$183A! QUIT4 used by BOOTLOADER +! free EPROM + +! ============================================ +! FRAM TLV +! ============================================ +TLV_ORG=\$1A00! ; Device Descriptor Info (Tag-Lenght-Value) +TLV_LEN=\$0100! ; +DEVICEID=\$1A04! + + +! ============================================ +! RAM +! ============================================ +RAM_ORG=\$1C00! +RAM_LEN=\$0800! + +! --------------------------------------- +! FORTH RAM areas : +! --------------------------------------- +LSTACK_SIZE=\#16! words +PSTACK_SIZE=\#48! words +RSTACK_SIZE=\#48! words +PAD_LEN=\#84! bytes +TIB_LEN=\#84! bytes +HOLD_SIZE=\#34! bytes + +! ---------------------------------------------- +! FastForth RAM memory map (>= 1k): +! ---------------------------------------------- +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_I2CADR=\$1CE0! \ RX I2C address +PAD_I2CCNT=\$1CE2! \ count max +PAD_ORG=\$1CE4! \ user scratch pad buffer, 84 bytes, grow up + +TIB_I2CADR=\$1D38! \ TX I2C address +TIB_I2CCNT=\$1D3A! \ count of bytes +TIB_ORG=\$1D3C! \ Terminal input buffer, 84 bytes, grow up + +HOLDS_ORG=\$1D90! \ base address for HOLDS +HOLD_BASE=\$1DB2! \ BASE HOLD area, grow down + +! ---------------------- +! NOT SAVED VARIABLES +! ---------------------- + +HP=\$1DB2! HOLD ptr +CAPS=\$1DB4! CAPS ON/OFF flag, must be set to -1 before first reset ! +LAST_NFA=\$1DB6! +LAST_THREAD=\$1DB8! +LAST_CFA=\$1DBA! +LAST_PSP=\$1DBC! + +STATEADR=\$1DBE! Interpreter state + +SOURCE_LEN=\$1DC0! len of input stream +SOURCE_ORG=\$1DC2! adr of input stream +TOIN=\$1DC4! >IN +DP=\$1DC6! dictionary ptr + +LASTVOC=\$1DC8! keep VOC-LINK +CONTEXT=\$1DCA! CONTEXT dictionnary space (8 CELLS) +CURRENT=\$1DDA! CURRENT dictionnary ptr + +BASEADR=\$1DDC! numeric base, must be defined before first reset ! +LINE=\$1DDE! line in interpretation, activated with NOECHO, desactivated with ECHO +! --------------------------------------- +!1DE0! 28 RAM bytes free +! --------------------------------------- + +! --------------------------------------- +! SD buffer +! --------------------------------------- +SD_BUF_I2ADR=\$1DFC! +SD_BUF_I2CNT=\$1DFE! +SD_BUF=\$1E00! \ SD_Card buffer +BUFEND=\$2000! + +! --------------------------------------- +! FAT16 FileSystemInfos +! --------------------------------------- +FATtype=\$2002! +BS_FirstSectorL=\$2004! +BS_FirstSectorH=\$2006! +OrgFAT1=\$2008! +FATSize=\$200A! +OrgFAT2=\$200C! +OrgRootDir=\$200E! +OrgClusters=\$2010! Sector of Cluster 0 +SecPerClus=\$2012! + +! --------------------------------------- +! SD command +! --------------------------------------- +SD_CMD_FRM=\$2014! 6 bytes SD_CMDx inverted frame \${CRC,ll,LL,hh,HH,CMD} +SD_CMD_FRM0=\$2014! CRC:ll word access +SD_CMD_FRM1=\$2015! ll byte access +SD_CMD_FRM2=\$2016! LL:hh word access +SD_CMD_FRM3=\$2017! hh byte access +SD_CMD_FRM4=\$2018! HH:CMD word access +SD_CMD_FRM5=\$2019! CMD byte access +SectorL=\$201A! 2 words +SectorH=\$201C! + +! --------------------------------------- +! BUFFER management +! --------------------------------------- +BufferPtr=\$201E! +BufferLen=\$2020! + +! --------------------------------------- +! FAT entry +! --------------------------------------- +ClusterL=\$2022! 16 bits wide (FAT16) +ClusterH=\$2024! 16 bits wide (FAT16) +NewClusterL=\$2026! 16 bits wide (FAT16) +NewClusterH=\$2028! 16 bits wide (FAT16) +CurFATsector=\$202A! + +! --------------------------------------- +! DIR entry +! --------------------------------------- +DIRclusterL=\$202C! contains the Cluster of current directory ; 1 if FAT16 root directory +DIRclusterH=\$202E! contains the Cluster of current directory ; 1 if FAT16 root directory +EntryOfst=\$2030! + +! --------------------------------------- +! Handle Pointer +! --------------------------------------- +CurrentHdl=\$2032! contains the address of the last opened file structure, or 0 + +! --------------------------------------- +! Load file operation +! --------------------------------------- +pathname=\$2034! +EndOfPath=\$2036! + +! --------------------------------------- +! Handle structure +! --------------------------------------- +! three handle tokens : +! token = 0 : free handle +! token = 1 : file to read +! token = 2 : file updated (write) +! token =-1 : LOAD"ed file (source file) + +! offset values +HDLW_PrevHDL=0! previous handle ; used by LOAD" +HDLB_Token=2! token +HDLB_ClustOfst=3! Current sector offset in current cluster (Byte) +HDLL_DIRsect=4! Dir SectorL (Long) +HDLH_DIRsect=6! +HDLW_DIRofst=8! BUFFER offset of Dir entry +HDLL_FirstClus=10! File First ClusterLo (identify the file) +HDLH_FirstClus=12! File First ClusterHi (byte) +HDLL_CurClust=14! Current ClusterLo +HDLH_CurClust=16! Current ClusterHi (T as 3Th byte) +HDLL_CurSize=18! written size / not yet read size (Long) +HDLH_CurSize=20! written size / not yet read size (Long) +HDLW_BUFofst=22! BUFFER offset ; used by LOAD" and by WRITE" +HDLW_PrevLEN=24! previous LEN +HDLW_PrevORG=26! previous ORG + + +!OpenedFirstFile ; "openedFile" structure +HandleMax=8! +HandleLenght=28! +FirstHandle=\$2038! +HandleEnd=\$2118! + +!SD_card Input Buffer +SDIB_I2CADR=\$2118! +SDIB_I2CCNT=\$211A! +SDIB_ORG=\$211C! +SDIB_LEN=\$54! + +SD_END=\$2170! +SD_LEN=\$16E! + +! ---------------------------------------------- +! FRAM +! ---------------------------------------------- +MAIN_ORG=\$4400! Code space start +MAIN_LEN=\$24000! 127 k FRAM +! ---------------------------------------------- + +SLEEP=\$4400! CODE_WITHOUT_RETURN: CPU shutdown +LIT=\$440A! CODE compiled by LITERAL +XSQUOTE=\$4414! CODE compiled by S" and S_ +HEREXEC=\$4428! CODE HERE and BEGIN execute address +QFBRAN=\$4434! CODE compiled by IF UNTIL +BRAN=\$443A! CODE compiled by ELSE REPEAT AGAIN +NEXT_ADR=\$443C! CODE NEXT instruction (MOV @IP+,PC) +XDO=\$443E! CODE compiled by DO +XPLOOP=\$444E! CODE compiled by +LOOP +XLOOP=\$4460! CODE compiled by LOOP +MUSMOD=\$4466! ASM 32/16 unsigned division, used by ?NUMBER, UM/MOD +MDIV1DIV2=\$4478! ASM input for 48/16 unsigned division with DVDhi=0, see DOUBLE M*/ +MDIV1=\$4480! ASM input for 48/16 unsigned division, see DOUBLE M*/ +RET_ADR=\$44AA! ASM content of INI_FORTH_PFA and MARKER+8 definitions, +SETIB=\$44AC! CODE Set Input Buffer with org & len values, reset >IN pointer +REFILL=\$44BC! CODE accept one line from input and leave org len of input buffer +CIB_ADR=\$44CA! [CIB_ADR] = TIB_ORG by default; may be redirected to SDIB_ORG +XDODOES=\$44D4! restore rDODOES: MOV #XDODOES,rDODOES +XDOCON=\$44E2! restore rDOCON: MOV #XDOCON,rDOCON +XDOVAR=\$44EE! restore rDOVAR: MOV #XDOVAR,rDOVAR +!to find DTC value, download \MSP430-FORTH\FF_SPECS.4th +!XDOCOL=TYPE\+\-16 if DTC = 1, restore rDOCOL as this: MOV #TYPE+-16,rDOCOL +!XDOCOL=\#S\+16 if DTC = 2, restore rDOCOL as this: MOV ##S+16,rDOCOL +! if DTC = 3, nothing to do, R7 is free for use. +INI_FORTH=\$44F8! CODE_WITHOUT_RETURN common part of RST and QABORT, starts FORTH engine +QABORT=\$452A! CODE_WITHOUT_RETURN run-time part of ABORT" +3DROP=\$4530! CODE +ABORT_TERM=\$4536! CODE_WITHOUT_RETURN, called by QREVEAL and INTERPRET +!------------------------------------------------------------------------------- +UART_COLD_TERM=\$4594! ASM, content of COLD_PFA by default +UART_INIT_TERM=\$459C! ASM, content of WARM_PFA by default +UART_RXON=\$45C6! ASM, content of SLEEP_PFA by default +UART_RXOFF=\$45C8! ASM, called by ACCEPT before RX char LF. +!------------------------------------------------------------------------------- +I2C_COLD_TERM=\$45B4! ASM, content of COLD_PFA by default +I2C_INIT_TERM=\$458A! ASM, content of WARM_PFA by default +I2C_RXON=\$45B6! ASM, content of SLEEP_PFA by default +I2C_CTRL_CH=\$45B8! ASM, used as is: MOV.B #CTRL_CHAR,Y +! CALL #I2C_CTRL_CH +!------------------------------------------------------------------------------- + +! ---------------------------------------------- +! Interrupt Vectors and signatures - MSP430FR6989 +! ---------------------------------------------- +MAIN_LEN=\$1FC00! 127 k FRAM +FRAM_FULL=\$FF30! 80 bytes are sufficient considering what can be compiled in one line and WORD use. +SIGNATURES=\$FF80! JTAG/BSL signatures +JTAG_SIG1=\$FF80! if 0 (electronic fuse=0) enable JTAG/SBW; must be reset by wipe. +JTAG_SIG2=\$FF82! if JTAG_SIG1=\$AAAA, length of password string @ JTAG_PASSWORD +BSL_SIG1=\$FF84! +BSL_SIG2=\$FF86! +I2CSLA0=\$FFA2! UCBxI2COA0 default value address +I2CSLA1=\$FFA4! UCBxI2COA1 default value address +I2CSLA2=\$FFA6! UCBxI2COA2 default value address +I2CSLA3=\$FFA8! UCBxI2COA3 default value address +JTAG_PASSWORD=\$FF88! 256 bits +BSL_PASSWORD=\$FFE0! 256 bits +VECT_ORG=\$FFC6! FFC6-FFFF +VECT_LEN=\$3A! + + +AES_VEC=\$FFC6! +RTC_VEC=\$FFC8! +P4_VEC=\$FFCC! +P3_VEC=\$FFCE! +TA3_X_VEC=\$FFD0! +TA3_0_VEC=\$FFD2! +P2_VEC=\$FFD4! +TA2_X_VEC=\$FFD6! +TA2_0_VEC=\$FFD8! +P1_VEC=\$FFDA! +TA1_X_VEC=\$FFDC! +TA1_0_VEC=\$FFDE! +DMA_VEC=\$FFE0! +EUSCI_B1_VEC=\$FFE2! +EUSCI_A1_VEC=\$FFE4! +TA0_X_VEC=\$FFE6! +TA0_0_VEC=\$FFE8! +ADC12_B_VEC=\$FFEA! +EUSCI_B0_VEC=\$FFEC! +EUSCI_A0_VEC=\$FFEE! +WDT_VEC=\$FFF2! +TB0_X_VEC=\$FFF4! +TB0_0_VEC=\$FFF6! +COMP_E_VEC=\$FFF8! +U_NMI_VEC=\$FFFA! +S_NMI_VEC=\$FFFC! +RST_VEC=\$FFFE! + +! ============================================ +! Special Fonction Registers (SFR) +! ============================================ + +SFRIE1=\$100! \ SFR enable register +SFRIFG1=\$102! \ SFR flag register +SFRRPCR=\$104! \ SFR reset pin control + +PMMCTL0=\$120! \ PMM Control 0 +PMMIFG=\$12A! \ PMM interrupt flags +PM5CTL0=\$130! \ PM5 Control 0 + +FRCTLCTL0=\$140! \ FRAM control 0 +GCCTL0=\$144! \ General control 0 +GCCTL1=\$146! \ General control 1 + +CRC16DI=\$150! \ CRC data input +CRCDIRB=\$152! \ CRC data input reverse byte +CRCINIRES=\$154! \ CRC initialization and result +CRCRESR=\$156! \ CRC result reverse byte + +RCCTL0=\$158! \ RAM controller control 0 + +WDTCTL=\$15C! \ WDT control register + +CSCTL0=\$160! \ CS control 0 +CSCTL1=\$162! \ CS control 1 +CSCTL2=\$164! \ CS control 2 +CSCTL3=\$166! \ CS control 3 +CSCTL4=\$168! \ CS control 4 +CSCTL5=\$16A! \ CS control 5 +CSCTL6=\$16C! \ CS control 6 + +SYSCTL=\$180! \ System control +SYSJMBC=\$186! \ JTAG mailbox control +SYSJMBI0=\$188! \ JTAG mailbox input 0 +SYSJMBI1=\$18A! \ JTAG mailbox input 1 +SYSJMBO0=\$18C! \ JTAG mailbox output 0 +SYSJMBO1=\$18E! \ JTAG mailbox output 1 +SYSUNIV=\$19A! \ User NMI vector generator +SYSSNIV=\$19C! \ System NMI vector generator +SYSRSTIV=\$19E! \ Reset vector generator + +REFCTL=\$1B0! \ Shared reference control + +PAIN=\$200! +PAOUT=\$202! +PADIR=\$204! +PAREN=\$206! +PASEL0=\$20A! +PASEL1=\$20C! +PASELC=\$216! +PAIES=\$218! +PAIE=\$21A! +PAIFG=\$21C! + +P1IN=\$200! +P1OUT=\$202! +P1DIR=\$204! +P1REN=\$206! +P1SEL0=\$20A! +P1SEL1=\$20C! +P1IV=\$20E! +P1SELC=\$216! +P1IES=\$218! +P1IE=\$21A! +P1IFG=\$21C! + +P2IN=\$201! +P2OUT=\$203! +P2DIR=\$205! +P2REN=\$207! +P2SEL0=\$20B! +P2SEL1=\$20D! +P2SELC=\$217! +P2IES=\$219! +P2IE=\$21B! +P2IFG=\$21D! +P2IV=\$21E! + +PBIN=\$220! +PBOUT=\$222! +PBDIR=\$224! +PBREN=\$226! +PBSEL0=\$22A! +PBSEL1=\$22C! +PBSELC=\$236! +PBIES=\$238! +PBIE=\$23A! +PBIFG=\$23C! + +P3IN=\$220! +P3OUT=\$222! +P3DIR=\$224! +P3REN=\$226! +P3SEL0=\$22A! +P3SEL1=\$22C! +P3IV=\$22E! +P3SELC=\$236! +P3IES=\$238! +P3IE=\$23A! +P3IFG=\$23C! + +P4IN=\$221! +P4OUT=\$223! +P4DIR=\$225! +P4REN=\$227! +P4SEL0=\$22B! +P4SEL1=\$22D! +P4SELC=\$237! +P4IES=\$239! +P4IE=\$23B! +P4IFG=\$23D! +P4IV=\$23E! + +PCIN=\$240! +PCOUT=\$242! +PCDIR=\$244! +PCREN=\$246! +PCSEL0=\$24A! +PCSEL1=\$24C! +PCSELC=\$256! + +P5IN=\$240! +P5OUT=\$242! +P5DIR=\$244! +P5REN=\$246! +P5SEL0=\$24A! +P5SEL1=\$24C! +P5SELC=\$256! + +P6IN=\$241! +P6OUT=\$243! +P6DIR=\$245! +P6REN=\$247! +P6SEL0=\$24B! +P6SEL1=\$24D! +P6SELC=\$257! + +P7IN=\$260! +P7OUT=\$262! +P7DIR=\$264! +P7REN=\$266! +P7SEL0=\$26A! +P7SEL1=\$26C! +P7SELC=\$276! + +P9IN=\$280! +P9OUT=\$282! +P9DIR=\$284! +P9REN=\$286! +P9SEL0=\$28A! +P9SEL1=\$28C! +P9SELC=\$296! + +PJIN=\$320! +PJOUT=\$322! +PJDIR=\$324! +PJREN=\$326! +PJSEL0=\$32A! +PJSEL1=\$32C! +PJSELC=\$336! + + +TACLR=4! +TAIFG=1! +TBCLR=2! +TBIFG=1! +CCIFG=1! + +TA0CTL=\$340! \ TA0 control +TA0CCTL0=\$342! \ Capture/compare control 0 +TA0CCTL1=\$344! \ Capture/compare control 1 +TA0CCTL2=\$346! \ Capture/compare control 2 +TA0CCTL3=\$348! \ Capture/compare control 3 +TA0CCTL4=\$34A! \ Capture/compare control 4 +TA0R=\$350! \ TA0 counter register +TA0CCR0=\$352! \ Capture/compare register 0 +TA0CCR1=\$354! \ Capture/compare register 1 +TA0CCR2=\$356! \ Capture/compare register 2 +TA0CCR2=\$358! \ Capture/compare register 3 +TA0CCR2=\$35A! \ Capture/compare register 4 +TA0EX0=\$360! \ TA0 expansion register 0 +TA0IV=\$36E! \ TA0 interrupt vector + +TA1CTL=\$380! \ TA1 control +TA1CCTL0=\$382! \ Capture/compare control 0 +TA1CCTL1=\$384! \ Capture/compare control 1 +TA1CCTL2=\$386! \ Capture/compare control 2 +TA1R=\$390! \ TA1 counter register +TA1CCR0=\$392! \ Capture/compare register 0 +TA1CCR1=\$394! \ Capture/compare register 1 +TA1CCR2=\$396! \ Capture/compare register 2 +TA1EX0=\$3A0! \ TA1 expansion register 0 +TA1IV=\$3AE! \ TA1 interrupt vector + +TB0CTL=\$3C0! \ TB0 control +TB0CCTL0=\$3C2! \ Capture/compare control 0 +TB0CCTL1=\$3C4! \ Capture/compare control 1 +TB0CCTL2=\$3C6! \ Capture/compare control 2 +TB0CCTL3=\$3C8! \ Capture/compare control 3 +TB0CCTL4=\$3CA! \ Capture/compare control 4 +TB0CCTL5=\$3CC! \ Capture/compare control 5 +TB0CCTL6=\$3CE! \ Capture/compare control 6 +TB0R=\$3D0! \ TB0 counter register +TB0CCR0=\$3D2! \ Capture/compare register 0 +TB0CCR1=\$3D4! \ Capture/compare register 1 +TB0CCR2=\$3D6! \ Capture/compare register 2 +TB0CCR3=\$3D8! \ Capture/compare register 3 +TB0CCR5=\$3DA! \ Capture/compare register 4 +TB0CCR5=\$3DC! \ Capture/compare register 5 +TB0CCR6=\$3DE! \ Capture/compare register 6 +TB0EX0=\$3E0! \ TB0 expansion register 0 +TB0IV=\$3EE! \ TB0 interrupt vector + +TA2CTL=\$400! \ TA2 control +TA2CCTL0=\$402! \ Capture/compare control 0 +TA2CCTL1=\$404! \ Capture/compare control 1 +TA2R=\$410! \ TA2 counter register +TA2CCR0=\$412! \ Capture/compare register 0 +TA2CCR1=\$414! \ Capture/compare register 1 +TA2EX0=\$420! \ TA2 expansion register 0 +TA2IV=\$42E! \ TA2 interrupt vector + +CAPTIO0CTL=\$43E! \ Capacitive Touch IO 0 control + +TA3CTL=\$440! \ TA3 control +TA3CCTL0=\$442! \ Capture/compare control 0 +TA3CCTL1=\$444! \ Capture/compare control 1 +TA3CCTL2=\$446! \ Capture/compare control 2 +TA3CCTL3=\$448! \ Capture/compare control 3 +TA3CCTL4=\$44A! \ Capture/compare control 4 +TA3R=\$450! \ TA3 counter register +TA3CCR0=\$452! \ Capture/compare register 0 +TA3CCR1=\$454! \ Capture/compare register 1 +TA3CCR2=\$456! \ Capture/compare register 2 +TA3CCR3=\$458! \ Capture/compare register 3 +TA3CCR4=\$45A! \ Capture/compare register 4 +TA3EX0=\$460! \ TA3 expansion register 0 +TA3IV=\$46E! \ TA3 interrupt vector + +CAPTIO1CTL=\$47E! \ Capacitive Touch IO 1 control + +! \ 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 +RTCPS=\$4AC! \ RTC prescaler +RT0PS=\$4AC! \ RTC prescaler 0 +RT1PS=\$4AD! \ RTC prescaler 1 +RTCIV=\$4AE! \ RTC interrupt vector word +RTCSEC=\$4B0! \ RTC seconds, RTC counter register 1 RTCSEC, +RTCCNT1=\$4B0! \ Real-Time Counter 1 +RTCMIN=\$4B1! \ RTC minutes, RTC counter register 2 RTCMIN, +RTCCNT2=\$4B1! \ Real-Time Counter 2 +RTCHOUR=\$4B2! \ RTC hours, RTC counter register 3 RTCHOUR, +RTCCNT3=\$4B2! \ Real-Time Counter 3 +RTCDOW=\$4B3! \ RTC day of week, RTC counter register 4 RTCDOW, +RTCCNT4=\$4B3! \ Real-Time Counter 4 +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! + +MPY=\$4C0! \ 16-bit operand 1 - multiply +MPYS=\$4C2! \ 16-bit operand 1 - signed multiply +MAC=\$4C4! \ 16-bit operand 1 - multiply accumulate +MACS=\$4C6! \ 16-bit operand 1 - signed multiply accumulate +OP2=\$4C8! \ 16-bit operand 2 +RESLO=\$4CA! \ 16 x 16 result low word +RESHI=\$4CC! \ 16 x 16 result high word +SUMEXT=\$4CE! \ 16 x 16 sum extension register +MPY32L=\$4D0! \ 32-bit operand 1 - multiply low word +MPY32H=\$4D2! \ 32-bit operand 1 - multiply high word +MPYS32L=\$4D4! \ 32-bit operand 1 - signed multiply low word +MPYS32H=\$4D6! \ 32-bit operand 1 - signed multiply high word +MAC32L=\$4D8! \ 32-bit operand 1 - multiply accumulate low word +MAC32H=\$4DA! \ 32-bit operand 1 - multiply accumulate high word +MACS32L=\$4DC! \ 32-bit operand 1 - signed multiply accumulate low word +MACS32H=\$4DE! \ 32-bit operand 1 - signed multiply accumulate high word +OP2L=\$4E0! \ 32-bit operand 2 - low word +OP2H=\$4E2! \ 32-bit operand 2 - high word +RES0=\$4E4! \ 32 x 32 result 0 - least significant word +RES1=\$4E6! \ 32 x 32 result 1 +RES2=\$4E8! \ 32 x 32 result 2 +RES3=\$4EA! \ 32 x 32 result 3 - most significant word +MPY32CTL0=\$4EC! \ MPY32 control register 0 + +DMAIFG=8! + +DMACTL0=\$500! \ DMA module control 0 +DMACTL1=\$502! \ DMA module control 1 +DMACTL2=\$504! \ DMA module control 2 +DMACTL3=\$506! \ DMA module control 3 +DMACTL4=\$508! \ DMA module control 4 +DMAIV=\$50A! \ DMA interrupt vector + +DMA0CTL=\$510! \ DMA channel 0 control +DMA0SAL=\$512! \ DMA channel 0 source address low +DMA0SAH=\$514! \ DMA channel 0 source address high +DMA0DAL=\$516! \ DMA channel 0 destination address low +DMA0DAH=\$518! \ DMA channel 0 destination address high +DMA0SZ=\$51A! \ DMA channel 0 transfer size + +DMA1CTL=\$520! \ DMA channel 1 control +DMA1SAL=\$522! \ DMA channel 1 source address low +DMA1SAH=\$524! \ DMA channel 1 source address high +DMA1DAL=\$526! \ DMA channel 1 destination address low +DMA1DAH=\$528! \ DMA channel 1 destination address high +DMA1SZ=\$52A! \ DMA channel 1 transfer size + +DMA2CTL=\$530! \ DMA channel 2 control +DMA2SAL=\$532! \ DMA channel 2 source address low +DMA2SAH=\$534! \ DMA channel 2 source address high +DMA2DAL=\$536! \ DMA channel 2 destination address low +DMA2DAH=\$538! \ DMA channel 2 destination address high +DMA2SZ=\$53A! \ DMA channel 2 transfer size + + +MPUCTL0=\$5A0! \ MPU control 0 +MPUCTL1=\$5A2! \ MPU control 1 +MPUSEGB2=\$5A4! \ MPU Segmentation Border2 +MPUSEGB1=\$5A6! \ MPU Segmentation Border1 +MPUSAM=\$5A8! \ MPU access management +MPUIPC0=\$5AA! \ MPU IP control 0 +MPUIPSEGB2=\$5AC! \ MPU IP Encapsulation Segment Border 2 +MPUIPSEGB1=\$5AE! \ MPU IP Encapsulation Segment Border 1 + +UCA0CTLW0=\$5C0! \ eUSCI_A control word 0 +UCA0CTLW1=\$5C2! \ eUSCI_A control word 1 +UCA0BRW=\$5C6! +UCA0BR0=\$5C6! \ eUSCI_A baud rate 0 +UCA0BR1=\$5C7! \ eUSCI_A baud rate 1 +UCA0MCTLW=\$5C8! \ eUSCI_A modulation control +UCA0STAT=\$5CA! \ eUSCI_A status +UCA0RXBUF=\$5CC! \ eUSCI_A receive buffer +UCA0TXBUF=\$5CE! \ eUSCI_A transmit buffer +UCA0ABCTL=\$5D0! \ eUSCI_A LIN control +UCA0IRTCTL=\$5D2! \ eUSCI_A IrDA transmit control +UCA0IRRCTL=\$5D3! \ eUSCI_A IrDA receive control +UCA0IE=\$5DA! \ eUSCI_A interrupt enable +UCA0IFG=\$5DC! \ eUSCI_A interrupt flags +UCA0IV=\$5DE! \ eUSCI_A interrupt vector word + +UCA1CTLW0=\$5E0! \ eUSCI_A control word 0 +UCA1CTLW1=\$5E2! \ eUSCI_A control word 1 +UCA1BRW=\$5E6! +UCA1BR0=\$5E6! \ eUSCI_A baud rate 0 +UCA1BR1=\$5E7! \ eUSCI_A baud rate 1 +UCA1MCTLW=\$5E8! \ eUSCI_A modulation control +UCA1STAT=\$5EA! \ eUSCI_A status +UCA1RXBUF=\$5EC! \ eUSCI_A receive buffer +UCA1TXBUF=\$5EE! \ eUSCI_A transmit buffer +UCA1ABCTL=\$5F0! \ eUSCI_A LIN control +UCA1IRTCTL=\$5F2! \ eUSCI_A IrDA transmit control +UCA1IRRCTL=\$5F3! \ eUSCI_A IrDA receive control +UCA1IE=\$5FA! \ eUSCI_A interrupt enable +UCA1IFG=\$5FC! \ eUSCI_A interrupt flags +UCA1IV=\$5FE! \ eUSCI_A interrupt vector word + + +UCB0CTLW0=\$640! \ eUSCI_B control word 0 +UCB0CTLW1=\$642! \ eUSCI_B control word 1 +UCB0BRW=\$646! +UCB0BR0=\$646! \ eUSCI_B bit rate 0 +UCB0BR1=\$647! \ eUSCI_B bit rate 1 +UCB0STATW=\$648! \ eUSCI_B status word +UCBCNT0=\$649! \ eUSCI_B hardware count +UCB0TBCNT=\$64A! \ eUSCI_B byte counter threshold +UCB0RXBUF=\$64C! \ eUSCI_B receive buffer +UCB0TXBUF=\$64E! \ eUSCI_B transmit buffer +UCB0I2COA0=\$654! \ eUSCI_B I2C own address 0 +UCB0I2COA1=\$656! \ eUSCI_B I2C own address 1 +UCB0I2COA2=\$658! \ eUSCI_B I2C own address 2 +UCB0I2COA3=\$65A! \ eUSCI_B I2C own address 3 +UCB0ADDRX=\$65C! \ eUSCI_B received address +UCB0ADDMASK=\$65E! \ eUSCI_B address mask +UCB0I2CSA=\$660! \ eUSCI I2C slave address +UCB0IE=\$66A! \ eUSCI interrupt enable +UCB0IFG=\$66C! \ eUSCI interrupt flags +UCB0IV=\$66E! \ eUSCI interrupt vector word + +UCB1CTLW0=\$680! \ eUSCI_B control word 0 +UCB1CTLW1=\$682! \ eUSCI_B control word 1 +UCB1BRW=\$686! +UCB1BR0=\$686! \ eUSCI_B bit rate 0 +UCB1BR1=\$687! \ eUSCI_B bit rate 1 +UCB1STATW=\$688! \ eUSCI_B status word +UCB1NT0=\$689! \ eUSCI_B hardware count +UCB1TBCNT=\$68A! \ eUSCI_B byte counter threshold +UCB1RXBUF=\$68C! \ eUSCI_B receive buffer +UCB1TXBUF=\$68E! \ eUSCI_B transmit buffer +UCB1I2COA0=\$694! \ eUSCI_B I2C own address 0 +UCB1I2COA1=\$696! \ eUSCI_B I2C own address 1 +UCB1I2COA2=\$698! \ eUSCI_B I2C own address 2 +UCB1I2COA3=\$69A! \ eUSCI_B I2C own address 3 +UCB1ADDRX=\$69C! \ eUSCI_B received address +UCB1ADDMASK=\$69E! \ eUSCI_B address mask +UCB1I2CSA=\$6A0! \ eUSCI I2C slave address +UCB1IE=\$6AA! \ eUSCI interrupt enable +UCB1IFG=\$6AC! \ eUSCI interrupt flags +UCB1IV=\$6AE! \ eUSCI interrupt vector word + +UCTXACK=\$20! +UCTR=\$10! + + +ADC12CTL0=\$800! \ ADC12_B Control 0 +ADC12CTL1=\$802! \ ADC12_B Control 1 +ADC12CTL2=\$804! \ ADC12_B Control 2 +ADC12CTL3=\$806! \ ADC12_B Control 3 +ADC12LO=\$808! \ ADC12_B Window Comparator Low Threshold Register +ADC12HI=\$80A! \ ADC12_B Window Comparator High Threshold Register +ADC12IFGR0=\$80C! \ ADC12_B Interrupt Flag Register 0 +ADC12IFGR1=\$80E! \ ADC12_B Interrupt Flag Register 1 +ADC12IFGR2=\$810! \ ADC12_B Interrupt Flag Register 2 +ADC12IER0=\$812! \ ADC12_B Interrupt Enable Register 0 +ADC12IER1=\$814! \ ADC12_B Interrupt Enable Register 1 +ADC12IER2=\$816! \ ADC12_B Interrupt Enable Register 2 +ADC12IV=\$818! \ ADC12_B Interrupt Vector +ADC12MCTL0=\$820! \ ADC12_B Memory Control 0 +ADC12MCTL1=\$822! \ ADC12_B Memory Control 1 +ADC12MCTL2=\$824! \ ADC12_B Memory Control 2 +ADC12MCTL3=\$826! \ ADC12_B Memory Control 3 +ADC12MCTL4=\$828! \ ADC12_B Memory Control 4 +ADC12MCTL5=\$82A! \ ADC12_B Memory Control 5 +ADC12MCTL6=\$82C! \ ADC12_B Memory Control 6 +ADC12MCTL7=\$82E! \ ADC12_B Memory Control 7 +ADC12MCTL8=\$830! \ ADC12_B Memory Control 8 +ADC12MCTL9=\$832! \ ADC12_B Memory Control 9 +ADC12MCTL10=\$834! \ ADC12_B Memory Control 10 +ADC12MCTL11=\$836! \ ADC12_B Memory Control 11 +ADC12MCTL12=\$838! \ ADC12_B Memory Control 12 +ADC12MCTL13=\$83A! \ ADC12_B Memory Control 13 +ADC12MCTL14=\$83C! \ ADC12_B Memory Control 14 +ADC12MCTL15=\$83E! \ ADC12_B Memory Control 15 +ADC12MCTL16=\$840! \ ADC12_B Memory Control 16 +ADC12MCTL17=\$842! \ ADC12_B Memory Control 17 +ADC12MCTL18=\$844! \ ADC12_B Memory Control 18 +ADC12MCTL19=\$846! \ ADC12_B Memory Control 19 +ADC12MCTL20=\$848! \ ADC12_B Memory Control 20 +ADC12MCTL21=\$84A! \ ADC12_B Memory Control 21 +ADC12MCTL22=\$84C! \ ADC12_B Memory Control 22 +ADC12MCTL23=\$84E! \ ADC12_B Memory Control 23 +ADC12MCTL24=\$850! \ ADC12_B Memory Control 24 +ADC12MCTL25=\$852! \ ADC12_B Memory Control 25 +ADC12MCTL26=\$854! \ ADC12_B Memory Control 26 +ADC12MCTL27=\$856! \ ADC12_B Memory Control 27 +ADC12MCTL28=\$858! \ ADC12_B Memory Control 28 +ADC12MCTL29=\$85A! \ ADC12_B Memory Control 29 +ADC12MCTL30=\$85C! \ ADC12_B Memory Control 30 +ADC12MCTL31=\$85E! \ ADC12_B Memory Control 31 +ADC12MEM0=\$860! \ ADC12_B Memory 0 +ADC12MEM1=\$862! \ ADC12_B Memory 1 +ADC12MEM2=\$864! \ ADC12_B Memory 2 +ADC12MEM3=\$866! \ ADC12_B Memory 3 +ADC12MEM4=\$868! \ ADC12_B Memory 4 +ADC12MEM5=\$86A! \ ADC12_B Memory 5 +ADC12MEM6=\$86C! \ ADC12_B Memory 6 +ADC12MEM7=\$86E! \ ADC12_B Memory 7 +ADC12MEM8=\$870! \ ADC12_B Memory 8 +ADC12MEM9=\$872! \ ADC12_B Memory 9 +ADC12MEM10=\$874! \ ADC12_B Memory 10 +ADC12MEM11=\$876! \ ADC12_B Memory 11 +ADC12MEM12=\$878! \ ADC12_B Memory 12 +ADC12MEM13=\$87A! \ ADC12_B Memory 13 +ADC12MEM14=\$87C! \ ADC12_B Memory 14 +ADC12MEM15=\$87E! \ ADC12_B Memory 15 +ADC12MEM16=\$880! \ ADC12_B Memory 16 +ADC12MEM17=\$882! \ ADC12_B Memory 17 +ADC12MEM18=\$884! \ ADC12_B Memory 18 +ADC12MEM19=\$886! \ ADC12_B Memory 19 +ADC12MEM20=\$888! \ ADC12_B Memory 20 +ADC12MEM21=\$88A! \ ADC12_B Memory 21 +ADC12MEM22=\$88C! \ ADC12_B Memory 22 +ADC12MEM23=\$88E! \ ADC12_B Memory 23 +ADC12MEM24=\$890! \ ADC12_B Memory 24 +ADC12MEM25=\$892! \ ADC12_B Memory 25 +ADC12MEM26=\$894! \ ADC12_B Memory 26 +ADC12MEM27=\$896! \ ADC12_B Memory 27 +ADC12MEM28=\$898! \ ADC12_B Memory 28 +ADC12MEM29=\$89A! \ ADC12_B Memory 29 +ADC12MEM30=\$89C! \ ADC12_B Memory 30 +ADC12MEM31=\$89E! \ ADC12_B Memory 31 + +ADCON=\$10! +ADCSTART=\$03! + +CDIFG=1! +CDIIFG=2! + +CDCTL0=\$8C0! \ Comparator_E control register 0 +CDCTL1=\$8C2! \ Comparator_E control register 1 +CDCTL2=\$8C4! \ Comparator_E control register 2 +CDCTL3=\$8C6! \ Comparator_E control register 3 +CDINT=\$8CC! \ Comparator_E interrupt register +CDIV=\$8CE! \ Comparator_E interrupt vector word + +CRC32DIW0=\$980! \ CRC32 data input +CRC32DIRBW0=\$986! \ CRC32 data input reverse +CRC32INIRESW0=\$988! \ CRC32 initialization and result word 0 +CRC32INIRESW1=\$98A! \ CRC32 initialization and result word 1 +CRC32RESRW1=\$98! \ CRC32 result reverse word 1 +CRC32RESRW1=\$98E! \ CRC32 result reverse word 0 +CRC16DIW0=\$990! \ CRC16 data input +CRC16DIRBW0=\$996! \ CRC16 data input reverse +CRC16INIRESW0=\$998! \ CRC16 initialization and result word 0 +CRC16RESRW1=\$99E! \ CRC16 result reverse word 0 + + +AESACTL0=\$9C0! \ AES accelerator control register 0 +AESASTAT=\$9C4! \ AES accelerator status register +AESAKEY=\$9C6! \ AES accelerator key register +AESADIN=\$9C8! \ AES accelerator data in register +AESADOUT=\$9CA! \ AES accelerator data out register +AESAXDIN=\$9CC! \ AES accelerator XORed data in register +AESAXIN =\$9CE! \ AES accelerator XORed data in register (no trigger) diff --git a/inc/MSP430FR5994.inc b/inc/MSP430FR5994.inc index 95f048d..aad7bf6 100644 --- a/inc/MSP430FR5994.inc +++ b/inc/MSP430FR5994.inc @@ -1,5 +1,8 @@ ; MSP430FR5994.inc ; MSP430FR5994 minimal declarations for FastForth usage + .save + .listing off + DEVICE = "MSP430FR5994" diff --git a/inc/MSP430FR5994.pat b/inc/MSP430FR5994.pat index 35f7cd9..7ba5dc9 100644 --- a/inc/MSP430FR5994.pat +++ b/inc/MSP430FR5994.pat @@ -38,24 +38,50 @@ INFO_LEN=\$0200! ! You can check the addresses below by comparing their values in DTCforthMSP430FRxxxx.lst ! those addresses are usable with the symbolic assembler ! ---------------------------------------------- -! FastForth INFO +! FastForth INFO, system addresses (in EPROM) ! ---------------------------------------------- -INI_THREAD=\$1800! .word THREADS -TERMBRW_RST=\$1802! .word TERMBRW_RST -TERMMCTLW_RST=\$1804! .word TERMMCTLW_RST -FREQ_KHZ=\$1806! .word FREQUENCY - -SAVE_SYSRSTIV=\$1808! to enable SYSRSTIV read -LPM_MODE=\$180A! LPM0+GIE is the default mode -INIDP=\$180C! define RST_STATE, init by wipe -INIVOC=\$180E! define RST_STATE, init by wipe -VERSION=\$1810! +FREQ_KHZ=\$1800! FREQUENCY (in kHz) +TERMBRW_RST=\$1802! TERMBRW_RST +TERMMCTLW_RST=\$1804! TERMMCTLW_RST +I2CSLAVEADR=\$1802! I2C_SLAVE address +I2CSLAVEADR1=\$1804! +LPM_MODE=\$1806! LPM_MODE value, LPM0+GIE is the default value +RSTIV_MEM=\$1808! SYSRSTIV memory, set to -1 to do Deep RESET +RST_DP=\$180A! RST value for DP +RST_VOC=\$180C! RST value for VOClink +VERSION=\$180E! +THREADS=\$1810! THREADS KERNEL_ADDON=\$1812! -RXON=\$1814! -RXOFF=\$1816! -ReadSectorWX=\$1818! call with W = SectorLO X = SectorHI -WriteSectorWX=\$181A! call with W = SectorLO X = SectorHI -TERMINAL_INT=\$181C! value for TERMINAL vector + +WIPE_INI_=\$1814! MOV #WIPE_INI,X see WIPE +WIPE_COLD=\$1814! WIPE value for PFA_COLD +WIPE_INI_FORTH=\$1816! WIPE value for PFA_INI_FORTH +WIPE_SLEEP=\$1818! WIPE value for PFA_SLEEP +WIPE_WARM=\$181A! WIPE value for PFA_WARM +WIPE_TERM_INT=\$181C! WIPE value for TERMINAL vector +WIPE_DP=\$182E! WIPE value for RST_DP +WIPE_VOC=\$1820! WIPE value for RST_VOC +! +INI_FORTH_INI=\$1822! MOV #INI_FORTH_INI,X \ >BODY instruction of INI_FORTH subroutine +INIT_ACCEPT=\$1822! WIPE value for PFAACCEPT +INIT_CR=\$1824! WIPE value for PFACR +INIT_EMIT=\$1826! FORTH value for PFAEMIT +INIT_KEY=\$1828! WIPE value for PFAKEY +INIT_CIB=\$182A! WIPE value for CIB_ADR +HALF_FORTH_INI=\$182C! to preserve the state of DEFERed words, used by user INI_SOFT_APP as: +! ADD #4,0(RSP) \ skip INI_FORTH >BODY instruction "MOV #INI_FORTH_INI,X" +! MOV #HALF_FORTH_INI,X \ replace it by "MOV #HALF_FORTH_INI,X" +! MOV @RSP+,PC \ then RET +INIT_DOCOL=\$182C! FORTH value for rDOCOL (R4) +INIT_DODOES=\$182E! FORTH value for rDODOES (R5) +INIT_DOCON=\$1830! FORTH value for rDOCON (R6) +INIT_DOVAR=\$1832! FORTH value for rDOVAR (R7) +INIT_CAPS=\$1834! FORTH value for CAPS +INIT_BASE=\$1836! FORTH value for BASE + +ABORT_ADR=\$1838! ABORT address +QUIT4_ADR=\$183A! QUIT4 used by BOOTLOADER +! free EPROM ! ============================================ ! FRAM TLV @@ -238,39 +264,60 @@ SDIB_LEN=\$54! SD_END=\$2170! SD_LEN=\$16E! +SPI_X_GET=SPI_GET+2! +SPI_PUT=SPI_GET+4! +SD_CARD_ID_ERROR=SD_ERROR+6! +ReadSectorWX=READ_SECT+8! +WriteSectorWX=WRITE_SECT+8! + ! ============================================ ! FRAM MAIN ! ============================================ MAIN_ORG=\$4000! Code space start -MAIN_LEN=\$40000! 240 k FRAM +MAIN_LEN=\$40000! 240 kb FRAM ! ---------------------------------------------- -SLEEP=\$4000! -BODYSLEEP=\$4004! -LIT=\$400E! -NEXT_ADR=\$4016! -XSQUOTE=\$4018! -HEREADR=\$402C! -QTBRAN=\$4038! -BRAN=\$403E! -QFBRAN=\$4042! -SKIPBRAN=\$4048! -XDO=\$404C! -XPLOOP=\$405C! -XLOOP=\$406E! -MUSMOD=\$4074! 32/16 unsigned division -MDIV1=\$408E! input for 48/16 unsigned division -SETIB=\$40BA! Set Input Buffer with org len values, reset >IN -REFILL=\$40CA! accept one line from input and leave org len of input buffer -CIB_ADR=\$40D8! contents currently TIB_ORG; may be redirected to SDIB_ORG -XDODOES=\$40E2! restore rDODOES: MOV #XDODOES,rDODOES -XDOCON=\$40F0! restore rDOCON: MOV #XDOCON,rDOCON -XDOCOL=\$40FC! restore rDOCOL: MOV #XDOCOL,rDOCOL only for DTC model = 1 - -! to find DTC value, download \MSP430-FORTH\FastForthSpecs.4th -! if DTC = 1, restore rDOCOL as this : MOV #xdocol,rDOCOL -! if DTC = 2, restore rDOCOL as this : MOV #EXIT,rDOCOL -! if DTC = 3, nothing to do, R7 is free for use. +SLEEP=\$4000! CODE_WITHOUT_RETURN: CPU shutdown +LIT=\$400A! CODE compiled by LITERAL +XSQUOTE=\$4014! CODE compiled by S" and S_ +HEREXEC=\$4028! CODE HERE and BEGIN execute address +QFBRAN=\$4034! CODE compiled by IF UNTIL +BRAN=\$403A! CODE compiled by ELSE REPEAT AGAIN +NEXT_ADR=\$403C! CODE NEXT instruction (MOV @IP+,PC) +XDO=\$403E! CODE compiled by DO +XPLOOP=\$404E! CODE compiled by +LOOP +XLOOP=\$4060! CODE compiled by LOOP +MUSMOD=\$4066! ASM 32/16 unsigned division, used by ?NUMBER, UM/MOD +MDIV1DIV2=\$4078! ASM input for 48/16 unsigned division with DVDhi=0, see DOUBLE M*/ +MDIV1=\$4080! ASM input for 48/16 unsigned division, see DOUBLE M*/ +RET_ADR=\$40AA! ASM content of INI_FORTH_PFA and MARKER+8 definitions, +SETIB=\$40AC! CODE Set Input Buffer with org & len values, reset >IN pointer +REFILL=\$40BC! CODE accept one line from input and leave org len of input buffer +CIB_ADR=\$40CA! [CIB_ADR] = TIB_ORG by default; may be redirected to SDIB_ORG +XDODOES=\$40D4! restore rDODOES: MOV #XDODOES,rDODOES +XDOCON=\$40E2! restore rDOCON: MOV #XDOCON,rDOCON +XDOVAR=\$40EE! restore rDOVAR: MOV #XDOVAR,rDOVAR +!to find DTC value, download \MSP430-FORTH\FF_SPECS.4th +!XDOCOL=TYPE\+\-16 if DTC = 1, restore rDOCOL as this: MOV #TYPE+-16,rDOCOL +!XDOCOL=\#S\+16 if DTC = 2, restore rDOCOL as this: MOV ##S+16,rDOCOL +! if DTC = 3, nothing to do, R7 is free for use. +INI_FORTH=\$40F8! CODE_WITHOUT_RETURN common part of RST and QABORT, starts FORTH engine +QABORT=\$412A! CODE_WITHOUT_RETURN run-time part of ABORT" +3DROP=\$4130! CODE +ABORT_TERM=\$4136! CODE_WITHOUT_RETURN, called by QREVEAL and INTERPRET +!------------------------------------------------------------------------------- +UART_COLD_TERM=\$4194! ASM, content of COLD_PFA by default +UART_INIT_TERM=\$419C! ASM, content of WARM_PFA by default +UART_RXON=\$41C6! ASM, content of SLEEP_PFA by default +UART_RXOFF=\$41C8! ASM, called by ACCEPT before RX char LF. +!------------------------------------------------------------------------------- +I2C_COLD_TERM=\$41B4! ASM, content of COLD_PFA by default +I2C_INIT_TERM=\$418A! ASM, content of WARM_PFA by default +I2C_RXON=\$41B6! ASM, content of SLEEP_PFA by default +I2C_CTRL_CH=\$41B8! ASM, used as is: MOV.B #CTRL_CHAR,Y +! CALL #I2C_CTRL_CH +!------------------------------------------------------------------------------- + ! ---------------------------------------------- ! Interrupt Vectors and signatures - MSP430FR5994 ! ---------------------------------------------- diff --git a/inc/MSP430FR6989.inc b/inc/MSP430FR6989.inc index 2fe9375..8c54a7f 100644 --- a/inc/MSP430FR6989.inc +++ b/inc/MSP430FR6989.inc @@ -1,5 +1,8 @@ ; MSP430FR6989.inc ; MSP430FR6989 minimal declarations for FastForth usage + .save + .listing off + DEVICE = "MSP430FR6989" diff --git a/inc/MSP430FR6989.pat b/inc/MSP430FR6989.pat index fd711b6..25a34ef 100644 --- a/inc/MSP430FR6989.pat +++ b/inc/MSP430FR6989.pat @@ -38,22 +38,48 @@ INFO_LEN=\$0200! ! ---------------------------------------------- ! FastForth INFO ! ---------------------------------------------- -INI_THREAD=\$1800! .word THREADS -TERMBRW_RST=\$1802! .word TERMBRW_RST -TERMMCTLW_RST=\$1804! .word TERMMCTLW_RST -FREQ_KHZ=\$1806! .word FREQUENCY - -SAVE_SYSRSTIV=\$1808! to enable SYSRSTIV read -LPM_MODE=\$180A! LPM0+GIE is the default mode -INIDP=\$180C! define RST_STATE, init by wipe -INIVOC=\$180E! define RST_STATE, init by wipe -VERSION=\$1810! +FREQ_KHZ=\$1800! FREQUENCY (in kHz) +TERMBRW_RST=\$1802! TERMBRW_RST +TERMMCTLW_RST=\$1804! TERMMCTLW_RST +I2CSLAVEADR=\$1802! I2C_SLAVE address +I2CSLAVEADR1=\$1804! +LPM_MODE=\$1806! LPM_MODE value, LPM0+GIE is the default value +RSTIV_MEM=\$1808! SYSRSTIV memory, set to -1 to do Deep RESET +RST_DP=\$180A! RST value for DP +RST_VOC=\$180C! RST value for VOClink +VERSION=\$180E! +THREADS=\$1810! THREADS KERNEL_ADDON=\$1812! -RXON=\$1814! -RXOFF=\$1816! -ReadSectorWX=\$1818! call with W = SectorLO X = SectorHI -WriteSectorWX=\$181A! call with W = SectorLO X = SectorHI -TERMINAL_INT=\$181C! value for TERMINAL vector + +WIPE_INI_=\$1814! MOV #WIPE_INI,X +WIPE_COLD=\$1814! WIPE value for PFA_COLD +WIPE_INI_FORTH=\$1816! WIPE value for PFA_INI_FORTH +WIPE_SLEEP=\$1818! WIPE value for PFA_SLEEP +WIPE_WARM=\$181A! WIPE value for PFA_WARM +WIPE_TERM_INT=\$181C! WIPE value for TERMINAL vector +WIPE_DP=\$182E! WIPE value for RST_DP +WIPE_VOC=\$1820! WIPE value for RST_VOC + +INI_FORTH_INI=\$1822! MOV #INI_FORTH_INI,X \ >BODY instruction of INI_FORTH subroutine +INIT_ACCEPT=\$1822! WIPE value for PFAACCEPT +INIT_CR=\$1824! WIPE value for PFACR +INIT_EMIT=\$1826! FORTH value for PFAEMIT +INIT_KEY=\$1828! WIPE value for PFAKEY +INIT_CIB=\$182A! WIPE value for CIB_ADR +HALF_FORTH_INI=\$182C! to preserve the state of DEFERed words, used by user INI_SOFT_APP as: +! ADD #4,0(RSP) \ skip INI_FORTH >BODY instruction "MOV #INI_FORTH_INI,X" +! MOV #HALF_FORTH_INI,X \ replace it by "MOV #HALF_FORTH_INI,X" +! MOV @RSP+,PC \ then RET +INIT_DOCOL=\$182C! FORTH value for rDOCOL (R4) +INIT_DODOES=\$182E! FORTH value for rDODOES (R5) +INIT_DOCON=\$1830! FORTH value for rDOCON (R6) +INIT_DOVAR=\$1832! FORTH value for rDOVAR (R7) +INIT_CAPS=\$1834! FORTH value for CAPS +INIT_BASE=\$1836! FORTH value for BASE + +ABORT_ADR=\$1838! ABORT address +QUIT4_ADR=\$183A! QUIT4 used by BOOTLOADER +! free EPROM ! ============================================ ! FRAM TLV @@ -242,32 +268,47 @@ MAIN_ORG=\$4400! Code space start MAIN_LEN=\$24000! 127 k FRAM ! ---------------------------------------------- -SLEEP=\$4400! -BODYSLEEP=\$4404! -LIT=\$440E! -NEXT_ADR=\$4416! -XSQUOTE=\$4418! -HEREADR=\$442C! -QTBRAN=\$4438! -BRAN=\$443E! -QFBRAN=\$4442! -SKIPBRAN=\$4448! -XDO=\$444C! -XPLOOP=\$445C! -XLOOP=\$446E! -MUSMOD=\$4474! 32/16 unsigned division -MDIV1=\$448E! input for 48/16 unsigned division -SETIB=\$44BA! Set Input Buffer with org len values, reset >IN -REFILL=\$44CA! accept one line from input and leave org len of input buffer -CIB_ADR=\$44D8! contents currently TIB_ORG; may be redirected to SDIB_ORG -XDODOES=\$44E2! restore rDODOES: MOV #XDODOES,rDODOES -XDOCON=\$44F0! restore rDOCON: MOV #XDOCON,rDOCON -XDOCOL=\$44FC! restore rDOCOL: MOV #XDOCOL,rDOCOL only for DTC model = 1 - -! to find DTC value, download \MSP430-FORTH\FastForthSpecs.4th -! if DTC = 1, restore rDOCOL as this : MOV #xdocol,rDOCOL -! if DTC = 2, restore rDOCOL as this : MOV #EXIT,rDOCOL -! if DTC = 3, nothing to do, R7 is free for use. +SLEEP=\$4400! CODE_WITHOUT_RETURN: CPU shutdown +LIT=\$440A! CODE compiled by LITERAL +XSQUOTE=\$4414! CODE compiled by S" and S_ +HEREXEC=\$4428! CODE HERE and BEGIN execute address +QFBRAN=\$4434! CODE compiled by IF UNTIL +BRAN=\$443A! CODE compiled by ELSE REPEAT AGAIN +NEXT_ADR=\$443C! CODE NEXT instruction (MOV @IP+,PC) +XDO=\$443E! CODE compiled by DO +XPLOOP=\$444E! CODE compiled by +LOOP +XLOOP=\$4460! CODE compiled by LOOP +MUSMOD=\$4466! ASM 32/16 unsigned division, used by ?NUMBER, UM/MOD +MDIV1DIV2=\$4478! ASM input for 48/16 unsigned division with DVDhi=0, see DOUBLE M*/ +MDIV1=\$4480! ASM input for 48/16 unsigned division, see DOUBLE M*/ +RET_ADR=\$44AA! ASM content of INI_FORTH_PFA and MARKER+8 definitions, +SETIB=\$44AC! CODE Set Input Buffer with org & len values, reset >IN pointer +REFILL=\$44BC! CODE accept one line from input and leave org len of input buffer +CIB_ADR=\$44CA! [CIB_ADR] = TIB_ORG by default; may be redirected to SDIB_ORG +XDODOES=\$44D4! restore rDODOES: MOV #XDODOES,rDODOES +XDOCON=\$44E2! restore rDOCON: MOV #XDOCON,rDOCON +XDOVAR=\$44EE! restore rDOVAR: MOV #XDOVAR,rDOVAR +!to find DTC value, download \MSP430-FORTH\FF_SPECS.4th +!XDOCOL=TYPE\+\-16 if DTC = 1, restore rDOCOL as this: MOV #TYPE+-16,rDOCOL +!XDOCOL=\#S\+16 if DTC = 2, restore rDOCOL as this: MOV ##S+16,rDOCOL +! if DTC = 3, nothing to do, R7 is free for use. +INI_FORTH=\$44F8! CODE_WITHOUT_RETURN common part of RST and QABORT, starts FORTH engine +QABORT=\$452A! CODE_WITHOUT_RETURN run-time part of ABORT" +3DROP=\$4530! CODE +ABORT_TERM=\$4536! CODE_WITHOUT_RETURN, called by QREVEAL and INTERPRET +!------------------------------------------------------------------------------- +UART_COLD_TERM=\$4594! ASM, content of COLD_PFA by default +UART_INIT_TERM=\$459C! ASM, content of WARM_PFA by default +UART_RXON=\$45C6! ASM, content of SLEEP_PFA by default +UART_RXOFF=\$45C8! ASM, called by ACCEPT before RX char LF. +!------------------------------------------------------------------------------- +I2C_COLD_TERM=\$45B4! ASM, content of COLD_PFA by default +I2C_INIT_TERM=\$458A! ASM, content of WARM_PFA by default +I2C_RXON=\$45B6! ASM, content of SLEEP_PFA by default +I2C_CTRL_CH=\$45B8! ASM, used as is: MOV.B #CTRL_CHAR,Y +! CALL #I2C_CTRL_CH +!------------------------------------------------------------------------------- + ! ---------------------------------------------- ! Interrupt Vectors and signatures - MSP430FR6989 ! ---------------------------------------------- diff --git a/inc/MSP_EXP430FR2355.asm b/inc/MSP_EXP430FR2355.asm index 7084e2f..5cbf7e9 100644 --- a/inc/MSP_EXP430FR2355.asm +++ b/inc/MSP_EXP430FR2355.asm @@ -244,25 +244,11 @@ LED2 .equ 40h ; P6.6 LED2 green ; BIS.B #2,&P1SEL1 ; BIS.B #2,&P1DIR - .IF FREQUENCY = 0.5 - - MOV #1ED1h,&CSCTL0 ; preset MOD=31, DCO = measured value @ 0x180 (209) - MOV #00B0h,&CSCTL1 ; Set 1MHZ DCORSEL,enable DCOFTRIM=3h ,enable Modulation to reduce EMI -; ===================================== ; fCOCLKDIV = REFO x (FLLN+1) -; MOV #100Dh,&CSCTL2 ; Set FLLD=1 (DCOCLKCDIV=DCO/2),set FLLN=0Dh - ; fCOCLKDIV = 32768 x (13+1) = 0.459 MHz ; measured : MHz - MOV #100Eh,&CSCTL2 ; Set FLLD=1 (DCOCLKCDIV=DCO/2),set FLLN=0Eh - ; fCOCLKDIV = 32768 x (14+1) = 0.491 MHz ; measured : MHz -; MOV #100Fh,&CSCTL2 ; Set FLLD=1 (DCOCLKCDIV=DCO/2),set FLLN=0Fh - ; fCOCLKDIV = 32768 x (15+1) = 0.524 MHz ; measured : MHz ; ===================================== - MOV #8,X - - .ELSEIF FREQUENCY = 1 - + .IF FREQUENCY = 1 MOV #1EFFh,&CSCTL0 ; preset MOD=31, DCO=255 MOV #00B0h,&CSCTL1 ; Set 1MHZ DCORSEL,enable DCOFTRIM=3h ,enable Modulation to reduce EMI -; ===================================== ; fCOCLKDIV = REFO x (FLLN+1) +; ------------------------------------- ; fCOCLKDIV = REFO x (FLLN+1) ; MOV #001Dh,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=1Dh ; fCOCLKDIV = 32768 x (29+1) = 0.983 MHz ; measured : 0.989MHz MOV #001Eh,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=1Eh @@ -270,13 +256,10 @@ LED2 .equ 40h ; P6.6 LED2 green ; MOV #001Fh,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=1Fh ; fCOCLKDIV = 32768 x (31+1) = 1.049 MHz ; measured : 1.046MHz ; ===================================== - MOV #16,X - .ELSEIF FREQUENCY = 2 - MOV #1EFFh,&CSCTL0 ; preset MOD=31, DCO=255 MOV #00B2h,&CSCTL1 ; Set 2MHZ DCORSEL,enable DCOFTRIM=3h ,enable Modulation to reduce EMI -; ===================================== ; fCOCLKDIV = REFO x (FLLN+1) +; ------------------------------------- ; fCOCLKDIV = REFO x (FLLN+1) ; MOV #003Bh,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=3Bh ; fCOCLKDIV = 32768 x (59+1) = 1.966 MHz ; measured : MHz MOV #003Ch,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=3Ch @@ -284,44 +267,32 @@ LED2 .equ 40h ; P6.6 LED2 green ; MOV #003Dh,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=3Dh ; fCOCLKDIV = 32768 x (61+1) = 2.031 MHz ; measured : MHz ; ===================================== - MOV #32,X - .ELSEIF FREQUENCY = 4 - MOV #1EFFh,&CSCTL0 ; preset MOD=31, DCO=255 MOV #00B4h,&CSCTL1 ; Set 4MHZ DCORSEL,enable DCOFTRIM=3h ,enable Modulation to reduce EMI -; ===================================== ; fCOCLKDIV = REFO x (FLLN+1) +; ------------------------------------- ; fCOCLKDIV = REFO x (FLLN+1) ; MOV #0078h,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=78h ; fCOCLKDIV = 32768 x (120+1) = 3.965 MHz ; measured : 3.96MHz - MOV #0079h,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=79h ; fCOCLKDIV = 32768 x (121+1) = 3.997 MHz ; measured : 3.99MHz - ; MOV #007Ah,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=7Ah ; fCOCLKDIV = 32768 x (122+1) = 4.030 MHz ; measured : 4.020MHz ; ===================================== - MOV #64,X - .ELSEIF FREQUENCY = 8 - MOV #1EFFh,&CSCTL0 ; preset MOD=31, DCO=255 MOV #00B6h,&CSCTL1 ; Set 8MHZ DCORSEL,enable DCOFTRIM=3h ,enable Modulation to reduce EMI -; ===================================== ; fCOCLKDIV = REFO x (FLLN+1) +; ------------------------------------- ; fCOCLKDIV = REFO x (FLLN+1) MOV #00F3h,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=F3h ; fCOCLKDIV = 32768 x (243+1) = 7.995 MHz ; measured : 7.976MHz ; MOV #00F4h,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=F4h ; fCOCLKDIV = 32768 x (244+1) = 8.028 MHz ; measured : 8.009MHz - ; MOV #00F5h,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=F5h ; fCOCLKDIV = 32768 x (245+1) = 8.061 MHz ; measured : 8.042MHz ; ===================================== - MOV #128,X - .ELSEIF FREQUENCY = 12 - MOV #1EFFh,&CSCTL0 ; preset MOD=31, DCO=255 MOV #00B8h,&CSCTL1 ; Set 12MHZ DCORSEL,enable DCOFTRIM=3h ,enable Modulation to reduce EMI -; ===================================== ; fCOCLKDIV = REFO x (FLLN+1) +; ------------------------------------- ; fCOCLKDIV = REFO x (FLLN+1) MOV #016Dh,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=1E7h ; fCOCLKDIV = 32768 x 365+1) = 11.993 MHz ; measured : 11.xxxMHz ; MOV #016Eh,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=1E8h @@ -329,13 +300,10 @@ LED2 .equ 40h ; P6.6 LED2 green ; MOV #016Fh,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=1E9h ; fCOCLKDIV = 32768 x 367+1) = 12.058 MHz ; measured : 12.xxxMHz ; ===================================== - MOV #192,X - .ELSEIF FREQUENCY = 16 - MOV #1EFFh,&CSCTL0 ; preset MOD=31, DCO=255 MOV #00BAh,&CSCTL1 ; Set 16MHZ DCORSEL,enable DCOFTRIM=3h ,enable Modulation to reduce EMI -; ===================================== ; fCOCLKDIV = REFO x (FLLN+1) +; ------------------------------------- ; fCOCLKDIV = REFO x (FLLN+1) ; MOV #01E7h,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=1E7h ; fCOCLKDIV = 32768 x 487+1) = 15.991 MHz ; measured : 15.95MHz MOV #01E8h,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=1E8h @@ -343,13 +311,10 @@ LED2 .equ 40h ; P6.6 LED2 green ; MOV #01E9h,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=1E9h ; fCOCLKDIV = 32768 x 489+1) = 16.056 MHz ; measured : 16.02MHz ; ===================================== - MOV #256,X - .ELSEIF FREQUENCY = 20 - MOV #1EFFh,&CSCTL0 ; preset MOD=31, DCO=255 MOV #00BCh,&CSCTL1 ; Set 20MHZ DCORSEL,enable DCOFTRIM=3h ,enable Modulation to reduce EMI -; ===================================== ; fCOCLKDIV = REFO x (FLLN+1) +; ------------------------------------- ; fCOCLKDIV = REFO x (FLLN+1) ; MOV #0261h,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=261h ; fCOCLKDIV = 32768 x 609+1) = 19.988 MHz ; measured : 19.xxxMHz MOV #0262h,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=262h @@ -357,13 +322,10 @@ LED2 .equ 40h ; P6.6 LED2 green ; MOV #0263h,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=263h ; fCOCLKDIV = 32768 x 611+1) = 20.054 MHz ; measured : 20.xxxMHz ; ===================================== - MOV #320,X - .ELSEIF FREQUENCY = 24 - MOV #1EFFh,&CSCTL0 ; preset MOD=31, DCO=255 MOV #00BEh,&CSCTL1 ; Set 24MHZ DCORSEL,enable DCOFTRIM=3h ,enable Modulation to reduce EMI -; ===================================== ; fCOCLKDIV = REFO x (FLLN+1) +; ------------------------------------- ; fCOCLKDIV = REFO x (FLLN+1) ; MOV #02DBh,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=2DBh ; fCOCLKDIV = 32768 x 731+1) = 23.986 MHz ; measured : 23.xxxMHz MOV #02DCh,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=2DCh @@ -371,13 +333,10 @@ LED2 .equ 40h ; P6.6 LED2 green ; MOV #02DDh,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=2DDh ; fCOCLKDIV = 32768 x 733+1) = 24.051 MHz ; measured : 24.xxxMHz ; ===================================== - MOV #384,X - .ELSEIF .error "bad frequency setting, only 0.5,1,2,4,8,12,16,20,24 MHz" .ENDIF - .IFDEF LF_XTAL ; because LOCKLPM5 is ON, XT1 is replaced by REFO automaticaly until WARM clears LOCKLPM5 ; MOV #0000h,&CSCTL3 ; FLL select XT1, FLLREFDIV=0 (default value) @@ -388,19 +347,9 @@ LED2 .equ 40h ; P6.6 LED2 green ; MOV #0100h,&CSCTL4 ; ACLOCK select REFOCLK, MCLK & SMCLK select DCOCLKDIV (default value) .ENDIF - - BIS &SYSRSTIV,&SAVE_SYSRSTIV; store volatile SYSRSTIV preserving a pending request for DEEP_RST -; MOV &SAVE_SYSRSTIV,TOS ; -; CMP #2,TOS ; POWER ON ? -; JZ ClockWaitX ; yes -; RRUM #1,X ; wait only 250 ms -ClockWaitX MOV #5209,Y ; wait 0.5s before starting after POR - ; ...because FLL lock time = 280 ms + MOV #92,X ; 96* 3 ms = 288 ms delay, because FLL lock time = 200 ms +ClockWaitX MOV &FREQ_KHZ,Y ; ClockWaitY SUB #1,Y ;1 - JNZ ClockWaitY ;2 5209x3 = 15625 cycles delay = 15.625ms @ 1MHz - SUB #1,X ; x 32 @ 1 MHZ = 500ms - JNZ ClockWaitX ; time to stabilize power source ( 500ms ) - -;WAITFLL BIT #300h,&CSCTL7 ; wait FLL lock -; JNZ WAITFLL - + JNZ ClockWaitY ;2 FREQ_KHZ x 3 ==> 3ms + SUB #1,X ; + JNZ ClockWaitX ; diff --git a/inc/MSP_EXP430FR2355.pat b/inc/MSP_EXP430FR2355.pat index edec363..bb4f858 100644 --- a/inc/MSP_EXP430FR2355.pat +++ b/inc/MSP_EXP430FR2355.pat @@ -136,18 +136,29 @@ ! ============================================ -! FORTH I/O : +! FORTH TERMINAL I/O : ! ============================================ !TERMINAL BUS_TERM=\$0C! P4.2 = RX, P4.3 = TX TERM_IN=\$221! P4 TERM_REN=\$227! -TERM_SEL=\$22B! \ SEL0 +TERM_SEL=\$22B! SEL0 -TERM_VEC=\$FFE2! \ UCA1 -WAKE_UP=1! \ RX int +RTS=1! P2.0 +CTS=2! P2.1 +HANDSHAKIN=\$201! +HANDSHAKOUT=\$203! +XT1_OUT=\$203! P2 +XT1_DIR=\$205! P2 +XT1_SEL=\$20D! P2SEL1 +XIN=\$80! +XOUT=\$40! + +! ============================================ +! FORTH TERMINAL hardware +! ============================================ TERM_CTLW0=\$580! \ eUSCI_A1 control word 0 TERM_CTLW1=\$582! \ eUSCI_A1 control word 1 TERM_BRW=\$586! @@ -164,10 +175,14 @@ TERM_IE=\$59A! \ eUSCI_A1 interrupt enable TERM_IFG=\$59C! \ eUSCI_A1 interrupt flags TERM_IV=\$59E! \ eUSCI_A1 interrupt vector word -RTS=1! P2.0 -CTS=2! P2.1 -HANDSHAKIN=\$201! -HANDSHAKOUT=\$203! +WAKE_UP=1! UART RX interrupt +RX_TERM=1! RX flag ifg +TX_TERM=2! Tx flag ifg + +! ============================================ +! FRAM MAIN +! ============================================ +TERM_VEC=\$FFE2! vector for eUSCI_A1 ! ============================================ ! APPLICATION I/O : diff --git a/inc/MSP_EXP430FR2433.asm b/inc/MSP_EXP430FR2433.asm index 9f0c0b7..50facde 100644 --- a/inc/MSP_EXP430FR2433.asm +++ b/inc/MSP_EXP430FR2433.asm @@ -216,9 +216,7 @@ SW2 .equ 80h ; P2.7 = S2 ; need to adjust FLLN (and DCO) for each device of MSP430fr2xxx family ? ; (no problem with MSP430FR5xxx families without FLL). ; =================================================================== - .IF FREQUENCY = 0.5 - ; MOV #058h,&CSCTL0 ; preset DCO = measured value @ 0x180 (88) ; MOV #0001h,&CSCTL1 ; Set 1MHZ DCORSEL,disable DCOFTRIM,Modulation MOV #1ED1h,&CSCTL0 ; preset MOD=31, DCO = measured value @ 0x180 (209) @@ -231,8 +229,6 @@ SW2 .equ 80h ; P2.7 = S2 MOV #100Fh,&CSCTL2 ; Set FLLD=1 (DCOCLKCDIV=DCO/2),set FLLN=0Fh ; fCOCLKDIV = 32768 x (15+1) = 0.524 MHz ; measured : MHz ; ===================================== - MOV #8,X - .ELSEIF FREQUENCY = 1 ; MOV #100h,&CSCTL0 ; preset DCO = 256 @@ -247,8 +243,6 @@ SW2 .equ 80h ; P2.7 = S2 ; MOV #001Fh,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=1Fh ; fCOCLKDIV = 32768 x (31+1) = 1.049 MHz ; measured : 1.046MHz ; ===================================== - MOV #16,X - .ELSEIF FREQUENCY = 2 ; MOV #100h,&CSCTL0 ; preset DCO = 256 @@ -263,8 +257,6 @@ SW2 .equ 80h ; P2.7 = S2 ; MOV #003Dh,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=3Dh ; fCOCLKDIV = 32768 x (61+1) = 2.031 MHz ; measured : MHz ; ===================================== - MOV #32,X - .ELSEIF FREQUENCY = 4 ; MOV #100h,&CSCTL0 ; preset DCO = 256 @@ -281,8 +273,6 @@ SW2 .equ 80h ; P2.7 = S2 ; MOV #007Ah,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=7Ah ; fCOCLKDIV = 32768 x (122+1) = 4.030 MHz ; measured : 4.020MHz ; ===================================== - MOV #64,X - .ELSEIF FREQUENCY = 8 ; MOV #100h,&CSCTL0 ; preset DCO = 256 @@ -304,8 +294,6 @@ SW2 .equ 80h ; P2.7 = S2 ; MOV #00FAh,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=FAh ; ===================================== - MOV #128,X - .ELSEIF FREQUENCY = 12 ; MOV #100h,&CSCTL0 ; preset DCO = 256 @@ -322,8 +310,6 @@ SW2 .equ 80h ; P2.7 = S2 ; MOV #016Fh,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=1E9h ; fCOCLKDIV = 32768 x 367+1) = 12.058 MHz ; measured : 12.xxxMHz ; ===================================== - MOV #192,X - .ELSEIF FREQUENCY = 16 ; MOV #100h,&CSCTL0 ; preset DCO = 256 @@ -340,34 +326,22 @@ SW2 .equ 80h ; P2.7 = S2 ; MOV #01E9h,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=1E9h ; fCOCLKDIV = 32768 x 489+1) = 16.056 MHz ; measured : 16.02MHz ; ===================================== - MOV #256,X - .ELSEIF .error "bad frequency setting, only 0.5,1,2,4,8,12,16 MHz" .ENDIF .IFDEF LF_XTAL -; MOV #0000h,&CSCTL3 ; FLL select XT1, FLLREFDIV=0 (default value) - MOV #0000h,&CSCTL4 ; ACLOCK select XT1, MCLK & SMCLK select DCOCLKDIV - - BIS.B #03,&P2SEL0 ; P2.0 as XOUT, P2.1 as XIN - - .ELSE - BIS #0010h,&CSCTL3 ; FLL select REFCLOCK - MOV #0200h,&CSCTL4 ; ACLOCK select VLOCLK, MCLK & SMCLK select DCOCLKDIV (default value) +; MOV #0000h,&CSCTL3 ; FLL select XT1, FLLREFDIV=0 (default value) + MOV #0000h,&CSCTL4 ; ACLOCK select XT1, MCLK & SMCLK select DCOCLKDIV + BIS.B #03,&P2SEL0 ; P2.0 as XOUT, P2.1 as XIN + .ELSE + BIS #0010h,&CSCTL3 ; FLL select REFCLOCK + MOV #0200h,&CSCTL4 ; ACLOCK select VLOCLK, MCLK & SMCLK select DCOCLKDIV (default value) .ENDIF - BIS &SYSRSTIV,&SAVE_SYSRSTIV; store volatile SYSRSTIV preserving a pending request for DEEP_RST -; MOV &SAVE_SYSRSTIV,TOS ; -; CMP #2,TOS ; POWER ON ? -; JZ ClockWaitX ; yes -; RRUM #1,X ; wait only 250 ms -ClockWaitX MOV #5209,Y ; wait 0.5s before starting after POR - ; ...because FLL lock time = 280 ms + MOV #128,X ; 128* 3 ms = 384 ms delay, because FLL lock time = 280 ms +ClockWaitX MOV &FREQ_KHZ,Y ; ClockWaitY SUB #1,Y ;1 - JNZ ClockWaitY ;2 5209x3 = 15625 cycles delay = 15.625ms @ 1MHz - SUB #1,X ; x 32 @ 1 MHZ = 500ms - JNZ ClockWaitX ; time to stabilize power source ( 500ms ) - -;WAITFLL BIT #300h,&CSCTL7 ; wait FLL lock -; JNZ WAITFLL + JNZ ClockWaitY ;2 FREQ_KHZ x 3 ==> 3ms + SUB #1,X ; + JNZ ClockWaitX ; diff --git a/inc/MSP_EXP430FR4133.asm b/inc/MSP_EXP430FR4133.asm index b05f804..4a2aff5 100644 --- a/inc/MSP_EXP430FR4133.asm +++ b/inc/MSP_EXP430FR4133.asm @@ -288,9 +288,7 @@ CS_SD .equ 2 ; P8.1 ; need to adjust FLLN (and DCO) for each device of MSP430fr2xxx family ? ; (no problem with MSP430FR5xxx families without FLL). ; =================================================================== - .IF FREQUENCY = 0.5 - ; MOV #058h,&CSCTL0 ; preset DCO = measured value @ 0x180 (88) ; MOV #0001h,&CSCTL1 ; Set 1MHZ DCORSEL,disable DCOFTRIM,Modulation MOV #1ED1h,&CSCTL0 ; preset MOD=31, DCO = measured value @ 0x180 (209) @@ -303,10 +301,7 @@ CS_SD .equ 2 ; P8.1 MOV #100Fh,&CSCTL2 ; Set FLLD=1 (DCOCLKCDIV=DCO/2),set FLLN=0Fh ; fCOCLKDIV = 32768 x (15+1) = 0.524 MHz ; measured : MHz ; ===================================== - MOV #8,X - .ELSEIF FREQUENCY = 1 - ; MOV #100h,&CSCTL0 ; preset DCO = 256 ; MOV #00B1h,&CSCTL1 ; Set 1MHZ DCORSEL,enable DCOFTRIM=3h ,disable Modulation MOV #1EFFh,&CSCTL0 ; preset MOD=31, DCO=255 @@ -319,10 +314,7 @@ CS_SD .equ 2 ; P8.1 ; MOV #001Fh,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=1Fh ; fCOCLKDIV = 32768 x (31+1) = 1.049 MHz ; measured : 1.046MHz ; ===================================== - MOV #16,X - .ELSEIF FREQUENCY = 2 - ; MOV #100h,&CSCTL0 ; preset DCO = 256 ; MOV #00B3h,&CSCTL1 ; Set 2MHZ DCORSEL,enable DCOFTRIM=3h ,disable Modulation MOV #1EFFh,&CSCTL0 ; preset MOD=31, DCO=255 @@ -335,10 +327,7 @@ CS_SD .equ 2 ; P8.1 ; MOV #003Dh,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=3Dh ; fCOCLKDIV = 32768 x (61+1) = 2.031 MHz ; measured : MHz ; ===================================== - MOV #32,X - .ELSEIF FREQUENCY = 4 - ; MOV #100h,&CSCTL0 ; preset DCO = 256 ; MOV #00B5h,&CSCTL1 ; Set 4MHZ DCORSEL,enable DCOFTRIM=3h ,disable Modulation MOV #1EFFh,&CSCTL0 ; preset MOD=31, DCO=255 @@ -353,10 +342,7 @@ CS_SD .equ 2 ; P8.1 ; MOV #007Ah,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=7Ah ; fCOCLKDIV = 32768 x (122+1) = 4.030 MHz ; measured : 4.020MHz ; ===================================== - MOV #64,X - .ELSEIF FREQUENCY = 8 - ; MOV #100h,&CSCTL0 ; preset DCO = 256 ; MOV #00B7h,&CSCTL1 ; Set 8MHZ DCORSEL,enable DCOFTRIM=3h ,disable Modulation MOV #1EFFh,&CSCTL0 ; preset MOD=31, DCO=255 @@ -368,7 +354,6 @@ CS_SD .equ 2 ; P8.1 ; fCOCLKDIV = 32768 x (243+1) = 7.995 MHz ; measured : 7.976MHz MOV #00F4h,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=F4h ; fCOCLKDIV = 32768 x (244+1) = 8.028 MHz ; measured : 8.009MHz - ; MOV #00F5h,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=F5h ; fCOCLKDIV = 32768 x (245+1) = 8.061 MHz ; measured : 8.042MHz @@ -376,10 +361,7 @@ CS_SD .equ 2 ; P8.1 ; MOV #00FAh,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=FAh ; ===================================== - MOV #128,X - .ELSEIF FREQUENCY = 12 - ; MOV #100h,&CSCTL0 ; preset DCO = 256 ; MOV #00B9h,&CSCTL1 ; Set 12MHZ DCORSEL,enable DCOFTRIM=3h ,disable Modulation MOV #1EFFh,&CSCTL0 ; preset MOD=31, DCO=255 @@ -394,10 +376,7 @@ CS_SD .equ 2 ; P8.1 ; MOV #016Fh,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=1E9h ; fCOCLKDIV = 32768 x 367+1) = 12.058 MHz ; measured : 12.xxxMHz ; ===================================== - MOV #192,X - .ELSEIF FREQUENCY = 16 - ; MOV #100h,&CSCTL0 ; preset DCO = 256 ; MOV #00BBh,&CSCTL1 ; Set 16MHZ DCORSEL,enable DCOFTRIM=3h ,disable Modulation MOV #1EFFh,&CSCTL0 ; preset MOD=31, DCO=255 @@ -412,8 +391,6 @@ CS_SD .equ 2 ; P8.1 ; MOV #01E9h,&CSCTL2 ; Set FLLD=0 (DCOCLKCDIV=DCO),set FLLN=1E9h ; fCOCLKDIV = 32768 x 489+1) = 16.056 MHz ; measured : 16.02MHz ; ===================================== - MOV #256,X - .ELSEIF .error "bad frequency setting, only 0.5,1,2,4,8,12,16 MHz" .ENDIF @@ -421,26 +398,14 @@ CS_SD .equ 2 ; P8.1 .IFDEF LF_XTAL ; MOV #0000h,&CSCTL3 ; FLL select XT1, FLLREFDIV=0 (default value) MOV #0000h,&CSCTL4 ; ACLOCK select XT1, MCLK & SMCLK select DCOCLKDIV - BIS.B #06,&P4SEL0 ; P4.2 as XOUT, P4.1 as XIN - .ELSE BIS #0010h,&CSCTL3 ; FLL select REFCLOCK MOV #0200h,&CSCTL4 ; ACLOCK select VLOCLK, MCLK & SMCLK select DCOCLKDIV (default value) .ENDIF - - BIS &SYSRSTIV,&SAVE_SYSRSTIV; store volatile SYSRSTIV preserving a pending request for DEEP_RST -; MOV &SAVE_SYSRSTIV,TOS ; -; CMP #2,TOS ; POWER ON ? -; JZ ClockWaitX ; yes -; RRUM #1,X ; wait only 250 ms -ClockWaitX MOV #5209,Y ; wait 0.5s before starting after POR - ; ...because FLL lock time = 280 ms -ClockWaitY SUB #1,Y ;1 - JNZ ClockWaitY ;2 5209x3 = 15625 cycles delay = 15.625ms @ 1MHz - SUB #1,X ; x 32 @ 1 MHZ = 500ms - JNZ ClockWaitX ; time to stabilize power source ( 500ms ) - -;WAITFLL BIT #300h,&CSCTL7 ; wait FLL lock -; JNZ WAITFLL - + MOV #64,X ; 64* 3 ms = 192 ms delay, because FLL lock time = 120 ms +ClockWaitX MOV &FREQ_KHZ,Y ; +ClockWaitY SUB #1,Y ;1 + JNZ ClockWaitY ;2 FREQ_KHZ x 3 ==> 3ms + SUB #1,X ; + JNZ ClockWaitX ; diff --git a/inc/MSP_EXP430FR5739.asm b/inc/MSP_EXP430FR5739.asm index 43e0941..586e67a 100644 --- a/inc/MSP_EXP430FR5739.asm +++ b/inc/MSP_EXP430FR5739.asm @@ -1,7 +1,7 @@ ; -*- coding: utf-8 -*- ; ---------------------------------------------------------------------- -; MSP_EXP430FR739.inc +; MSP_EXP430FR739.asm ; ---------------------------------------------------------------------- ; ---------------------------------------------------------------------- ; MSP430FR57xx BOOTSTRAP @@ -291,32 +291,26 @@ LED2 .equ 2 ; PJ.1 LED2 blue .IF FREQUENCY = 0.25 ; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value) MOV #DIVA_0 + DIVS_32 + DIVM_32,&CSCTL3 - MOV #4,X .ELSEIF FREQUENCY = 0.5 ; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value) MOV #DIVA_0 + DIVS_16 + DIVM_16,&CSCTL3 - MOV #8,X .ELSEIF FREQUENCY = 1 ; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value) MOV #DIVA_0 + DIVS_8 + DIVM_8,&CSCTL3 - MOV #16,X .ELSEIF FREQUENCY = 2 ; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value) MOV #DIVA_0 + DIVS_4 + DIVM_4,&CSCTL3 - MOV #32,X .ELSEIF FREQUENCY = 4 ; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value) MOV #DIVA_0 + DIVS_2 + DIVM_2,&CSCTL3 - MOV #64,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 #128,X .ELSEIF FREQUENCY = 10 MOV #DCORSEL+DCOFSEL1,&CSCTL1 ; Set 20 MHZ DCO setting @@ -326,22 +320,18 @@ LED2 .equ 2 ; PJ.1 LED2 blue .ELSEIF FREQUENCY = 12 MOV #DCORSEL+DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 24 MHZ DCO setting MOV #DIVA_0 + DIVS_2 + DIVM_2,&CSCTL3 ; then SMCLK/2 MCLK/2 - MOV #192,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 #256,X .ELSEIF FREQUENCY = 20 MOV #DCORSEL+DCOFSEL1,&CSCTL1 ; Set 20 MHZ DCO setting MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0 - MOV #320,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 #384,X .ELSEIF .error "bad frequency setting, only 0.25,0.5,1,2,4,8,12,16,20,24 MHz" @@ -354,25 +344,19 @@ LED2 .equ 2 ; PJ.1 LED2 blue .ENDIF MOV.B #01h, &CSCTL0_H ; Lock CS Registers - BIS &SYSRSTIV,&SAVE_SYSRSTIV ; store volatile SYSRSTIV preserving a pending request for DEEP_RST -; MOV &SAVE_SYSRSTIV,TOS ; -; CMP #2,TOS ; POWER ON ? -; JZ ClockWaitX ; yes -; RRUM #2,X ; wait only 125 ms -ClockWaitX MOV #5209,Y ; wait 0.5s before starting after POWER ON + MOV #64,X ; 64* 3 ms = 192 ms delay (by default of specification) +ClockWaitX MOV &FREQ_KHZ,Y ; ClockWaitY SUB #1,Y ;1 - JNZ ClockWaitY ;2 5209x3 = 15625 cycles delay = 15.625ms @ 1MHz - SUB #1,X ; x 32 @ 1 MHZ = 500ms - JNZ ClockWaitX ; time to stabilize power source ( 500ms ) + JNZ ClockWaitY ;2 FREQ_KHZ x 3 ==> 3ms + SUB #1,X ; + JNZ ClockWaitX ; ; ---------------------------------------------------------------------- ; POWER ON RESET AND INITIALIZATION : REF ; ---------------------------------------------------------------------- - BIS.W #REFTCOFF, &REFCTL ; Turn off temp. BIC.W #REFON, &REFCTL - ; ---------------------------------------------------------------------- ; POWER ON RESET AND INITIALIZATION : RTC REGISTERS ; ---------------------------------------------------------------------- diff --git a/inc/MSP_EXP430FR5969.asm b/inc/MSP_EXP430FR5969.asm index bb37346..2d09033 100644 --- a/inc/MSP_EXP430FR5969.asm +++ b/inc/MSP_EXP430FR5969.asm @@ -298,47 +298,41 @@ LED1 .equ 40h ; P4.6 LED1 red ; DCOCLK: Internal digitally controlled oscillator (DCO). - -; CS code for MSP430FR5948 - MOV.B #CSKEY,&CSCTL0_H ; Unlock CS registers - + MOV.B #CSKEY,&CSCTL0_H ; Unlock CS registers .IF FREQUENCY = 0.25 -; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value) +; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value) MOV #DIVA_0 + DIVS_32 + DIVM_32,&CSCTL3 - MOV #4,X .ELSEIF FREQUENCY = 0.5 - MOV #0,&CSCTL1 ; Set 1MHZ DCO setting - MOV #DIVA_2 + DIVS_2 + DIVM_2,&CSCTL3 ; set all dividers as 2 - MOV #8,X + MOV #0,&CSCTL1 ; Set 1MHZ DCO setting + MOV #DIVA_2 + DIVS_2 + DIVM_2,&CSCTL3 ; set all dividers as 2 .ELSEIF FREQUENCY = 1 - MOV #0,&CSCTL1 ; Set 1MHZ DCO setting - MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0 - MOV #16,X + MOV #0,&CSCTL1 ; Set 1MHZ DCO setting + MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0 .ELSEIF FREQUENCY = 2 - MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 4MHZ DCO setting + MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 4MHZ DCO setting MOV #DIVA_0 + DIVS_2 + DIVM_2,&CSCTL3 - MOV #32,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 #64,X + MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 4MHZ DCO setting + MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0 .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 #128,X +; MOV #DCOFSEL2+DCOFSEL1,&CSCTL1 ; Set 8MHZ DCO setting (default value) + MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0 + + .ELSEIF FREQUENCY = 12 + MOV #DCORSEL+DCOFSEL2+DCOFSEL1,&CSCTL1 ; Set 24MHZ DCO setting + MOV #DIVA_0 + DIVS_2 + DIVM_2,&CSCTL3 ; .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 #256,X + MOV #DCORSEL+DCOFSEL2,&CSCTL1 ; Set 16MHZ DCO setting + MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0 .ELSEIF - .error "bad frequency setting, only 0.5,1,2,4,8,16 MHz" + .error "bad frequency setting, only 0.5,1,2,4,8,12,16 MHz" .ENDIF .IFDEF LF_XTAL @@ -348,16 +342,12 @@ LED1 .equ 40h ; P4.6 LED1 red .ENDIF MOV.B #01h, &CSCTL0_H ; Lock CS Registers - BIS &SYSRSTIV,&SAVE_SYSRSTIV ; store volatile SYSRSTIV preserving a pending request for DEEP_RST -; MOV &SAVE_SYSRSTIV,TOS ; -; CMP #2,TOS ; POWER ON ? -; JZ ClockWaitX ; yes -; RRUM #2,X ; wait only 125 ms -ClockWaitX MOV #5209,Y ; wait 0.5s before starting after POWER ON + MOV #64,X ; 64* 3 ms = 192 ms delay (by default of specification) +ClockWaitX MOV &FREQ_KHZ,Y ; ClockWaitY SUB #1,Y ;1 - JNZ ClockWaitY ;2 5209x3 = 15625 cycles delay = 15.625ms @ 1MHz - SUB #1,X ; x 32 @ 1 MHZ = 500ms - JNZ ClockWaitX ; time to stabilize power source ( 500ms ) + JNZ ClockWaitY ;2 FREQ_KHZ x 3~ ==> 3ms + SUB #1,X ; + JNZ ClockWaitX ; ; ---------------------------------------------------------------------- ; POWER ON RESET AND INITIALIZATION : REF diff --git a/inc/MSP_EXP430FR5972.asm b/inc/MSP_EXP430FR5972.asm new file mode 100644 index 0000000..8bdf083 --- /dev/null +++ b/inc/MSP_EXP430FR5972.asm @@ -0,0 +1,417 @@ +; -*- coding: utf-8 -*- + +; ====================================================================== +; INIT MSP-EXP430FR5972 virtual board +; ====================================================================== + +; my USBtoUart : +; http://www.ebay.fr/itm/CP2102-USB-UART-Board-mini-Data-Transfer-Convertor-Module-Development-Board-/251433941479 + +; for sd card socket be carefull : pin CD must be present ! +; http://www.ebay.com/itm/2-PCS-SD-Card-Module-Slot-Socket-Reader-For-Arduino-MCU-/181211954262?pt=LH_DefaultDomain_0&hash=item2a3112fc56 + + +; J101 eZ-FET <-> target +; ----------------------- +; P1 <-> P2 - NC +; P3 <-> P4 - TEST - TEST +; P5 <-> P6 - RST - RST +; P7 <-> P8 - TX1 - P3.4 UCA1 TXD ---> RX UARTtoUSB module +; P9 <->P10 - RX1 - P3.5 UCA1 RXD <--- TX UARTtoUSB module +; P11<->P12 - CTS - P3.1 +; P13<->P14 - RTS - P3.0 +; P15<->P16 - VCC - 3V3 +; P17<->P18 - 5V +; P19<->P20 - GND - VSS + +; Launchpad Header Left J1 +; ------------------------ +; P1 - 3V3 +; P2 - P9.2 ESICH2 +; P3 - P4.3 UCA0 RXD +; P4 - P4.2 UCA0 TXD +; P5 - P3.2 UCB1 SCL +; P6 - P9.3 ESICH3 +; P7 - P1.4 UCB0 CLK +; P8 - P2.0 TB0.6 +; P9 - P4.1 UCB1 SCL +; P10- P4.0 UCB1 SDA + +; Launchpad Header Left J3 +; ------------------------ +; P21 - 5V0 +; P22 - GND +; P23 - P8.4 A7 +; P24 - P8.5 A6 +; P25 - P8.6 A5 +; P26 - P8.7 A4 +; P27 - P9.0 A8 +; P28 - P9.1 A9 +; P29 - P9.5 A13 +; P30 - P9.6 A14 + +; Launchpad Header Right J2 +; ------------------------- +; P20- GND +; P19- P2.1 TB0.5 +; P18- P1.5 TA0.0 UCA0 CLK +; P17- P9.4 ESIC10 +; P16- RST +; P15- P1.6 UCB0 SDA +; P14- P1.7 UCB0 SCL +; P13- P2.5 TB0.4 +; P12- P2.4 TB0.3 +; P11- P4.7 TA1.2 UCB1 SOMI/SCL + +; Launchpad Header Right J4 +; ------------------------- +; P40- P2.7 TB0.6 +; P39- P2.6 TB0.5 +; P38- P3.3 TA1.1 +; P37- P3.6 TB0.2 +; P36- P3.7 TB0.3 +; P35- P2.2 UCA0 CLK +; P34- P1.3 TA1.2 +; P33- P3.0 UCB1 CLK +; P32- P3.1 UCB1 SIMO/SDA +; P31- P2.3 + + +; switch-keys: +; S1 - P1.1 +; S2 - P1.2 +; S3 - RST + +; LEDS: +; LED1 - J7 - P1.0 +; LED2 - J8 - P9.7 + +; XTAL LF 32768 Hz +; Y4 - PJ.4 +; Y4 - PJ.5 + +; Clocks: +; 8 MHz DCO intern + +; =================================================================================== +; 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-EXP430FR5972 virtual 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 ;-) + +; GND <-------+---0V0----------> 1 LCD_Vss +; VCC >------ | --3V3-----+----> 2 LCD_Vdd +; | | +; |___ 470n --- +; ^ | --- +; / \ BAT54 | +; --- | +; 100n | 2k2 | +; P3.6 - UCA1 CLK TB0.2 >---||--+--^/\/\/v--+----> 3 LCD_Vo (=0V6 without modulation) +; P7.0/ <------------------------> 11 LCD_DB4 +; P7.1/ <------------------------> 12 LCD_DB5 +; P7.2/ <------------------------> 13 LCD_DB5 +; P7.3/ <------------------------> 14 LCD_DB7 +; P9.4/A12/C12 -------------------------> 4 LCD_RS +; P9.5/A13/C13 -------------------------> 5 LCD_R/W +; P9.6/A14/C14 -------------------------> 6 LCD_EN + +; +--4k7-< DeepRST <-- GND +; | +; P3.4 - UCA1 TXD <-+-> RX UARTtoUSB bridge +; P3.5 - UCA1 RXD <---- TX UARTtoUSB bridge +; P3.0 - RTS ----> CTS UARTtoUSB bridge (optional hardware control flow) +; VCC - <---- VCC (optional supply from UARTtoUSB bridge - WARNING ! 3.3V !) +; GND - <---> GND (optional supply from UARTtoUSB bridge) + +; VCC - ----> VCC SD_CardAdapter +; GND - <---> GND SD_CardAdapter +; P2.2 - UCA0 CLK ----> CLK SD_CardAdapter (SCK) +; P2.6 - ----> CS SD_CardAdapter (Card Select) +; P2.0 - UCA0 TXD/SIMO ----> SDI SD_CardAdapter (MOSI) +; P2.1 - UCA0 RXD/SOMI <---- SDO SD_CardAdapter (MISO) +; P2.7 - <---- CD SD_CardAdapter (Card Detect) + +; P4.0 - <---- OUT IR_Receiver (1 TSOP32236) +; VCC - ----> VCC IR_Receiver (2 TSOP32236) +; GND - <---> GND IR_Receiver (3 TSOP32236) + +; P1.3 - <---> SDA software I2C Master +; P1.5 - ----> SCL software I2C Master + +; P1.4 -UCB0 CLK TA1.0 <---> free + +; P1.6 -UCB0 SDA/SIMO <---> SDA hardware I2C Master or Slave +; P1.7 -UCB0 SCL/SOMI ----> SCL hardware I2C Master or Slave + +; P3.0 -UCB1 CLK ----> free (if UARTtoUSB with software control flow) +; P3.1 -UCB1 SDA/SIMO <---> free +; P3.2 -UCB1 SCL/SOMI ----> free +; P3.3 - TA1.1 <---> free + +; PJ.4 - LFXI 32768Hz quartz +; PJ.5 - LFXO 32768Hz quartz +; PJ.6 - HFXI +; PJ.7 - HFXO + + +; ---------------------------------------------------------------------- +; 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} = ? + +; PORTA usage + .IFDEF UCA0_SD +SD_SEL .equ PASEL0 ; to configure UCB0 +SD_REN .equ PAREN ; to configure pullup resistors +BUS_SD .equ 0700h ; pins P2.2 as UCA0CLK, P2.0 as UCA0SIMO & P2.1 as UCA0SOMI + .ENDIF ;UCA0_SD + +; PORT1 usage +; P1.0 - LED1 red output low +LED1_OUT .equ P1OUT +LED1_DIR .equ P1DIR +LED1 .equ 1 ; P1.0 LED1 red + +; P1.1 - Switch S1 +SW1_IN .set P1IN ; port +SW1 .set 2 ; P1.1 = S1 + +WIPE_IN .equ P1IN +IO_WIPE .equ 2 ; P1.1 = S1 = FORTH Deep_RST pin + +; P1.2 - Switch S2 +SW2_IN .set P1IN ; port +SW2 .set 4 ; P1.2 = S2 + +; 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 + .IFDEF UCB0_TERM +TERM_IN .equ P1IN +TERM_SEL .equ P1SEL1 +TERM_REN .equ P1REN +SDA .equ 40h ; P1.6 = SDA +SCL .equ 80h ; P1.7 = SCL +BUS_TERM .equ 0C0h + .ENDIF + + + +; PORT2 usage + +SD_CDIN .equ P2IN +SD_CSOUT .equ P2OUT +SD_CSDIR .equ P2DIR +CS_SD .equ 40h ; P2.6 Chip Select +CD_SD .equ 80h ; P2.7 Card Detect + +; PORTx default wanted state : pins as input with pullup resistor + + BIS #-1,&PAREN ; all pins with pull up/down resistor + MOV #-2,&PAOUT ; all pins with pullup resistors else P1.0 + +; ---------------------------------------------------------------------- +; POWER ON RESET AND INITIALIZATION : PORT3/4 +; ---------------------------------------------------------------------- + +; reset state : Px{DIR,REN,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; Px{IN,OUT,IES} = ? +; PORTx default wanted state : pins as input with pullup resistor + +; PORT3 usage +; P3.0 = RTS +; P3.1 = CTS +; P3.4 = TX1 +; P3.5 = RX1 + +HANDSHAKOUT .equ P3OUT +HANDSHAKIN .equ P3IN +RTS .equ 1 ; P3.0 +CTS .equ 2 ; P3.1 + + .IFDEF UCA1_TERM +TERM_IN .equ P3IN ; +TERM_REN .equ P3REN +TERM_SEL .equ P3SEL0 +TXD .equ 10h ; P3.4 = TXD +RXD .equ 20h ; P3.4 = RXD +BUS_TERM .equ 30h ; P3.5 = RX + .ENDIF ;UCA1_TERM + +; PORT4 usage + + MOV #-1,&PBREN ; all pins as input with resistor + MOV #-1,&PBOUT ; all pins as input with resistor + + .IFDEF TERMINAL4WIRES +; RTS output is wired to the CTS input of UART2USB bridge +; configure RTS as output high to disable RX TERM during start FORTH + BIS.B #RTS,&P3DIR ; RTS as output high + .IFDEF TERMINAL5WIRES +; CTS input must be wired to the RTS output of UART2USB bridge +; configure CTS as input low (true) to avoid lock when CTS is not wired + BIC.B #CTS,&P3OUT ; CTS input pulled down + .ENDIF ; TERMINAL5WIRES + .ENDIF ; TERMINAL4WIRES + +; ---------------------------------------------------------------------- +; POWER ON RESET AND INITIALIZATION : PORT5/6 +; ---------------------------------------------------------------------- + +; reset state : Px{DIR,REN,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; Px{IN,OUT,IES} = ? + +; PORT5 usage + +; PORT6 usage + +; PORTx default wanted state : pins as input with pullup resistor + + MOV #-1,&PCREN ; all pins with pull resistors + MOV #-1,&PCOUT ; all pins 1 + + +; ---------------------------------------------------------------------- +; POWER ON RESET AND INITIALIZATION : PORT7 +; ---------------------------------------------------------------------- + +; reset state : Px{DIR,REN,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; Px{IN,OUT,IES} = ? + +; PORT7 usage + +; PORT8 usage + +; PORTx default wanted state : pins as input with pullup resistor + + MOV.B #-1,&P7REN ; all pins with pull resistors + MOV.B #-1,&P7OUT ; all pins 1 + + + +; ---------------------------------------------------------------------- +; POWER ON RESET AND INITIALIZATION : PORT9 +; ---------------------------------------------------------------------- + +; reset state : Px{DIR,REN,SEL0,SEL1,SELC,IE,IFG,IV} = 0 ; Px{IN,OUT,IES} = ? + +; PORT9 usage +; P9.7 Green LED2 as output low +LED2_OUT .equ P9OUT +LED2_DIR .equ P9DIR +LED2 .equ 80h ; P9.7 LED2 green + + +; PORT10 usage + +; PORTx default wanted state : pins as input with pullup resistor + + MOV.B #-1,&P9REN ; all pins with pull resistors else P9.7 + MOV.B #7Fh,&P9OUT ; all pins high else P9.7 + +; ---------------------------------------------------------------------- +; 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,&PJREN ; enable pullup/pulldown resistors + MOV.B #-1,&PJOUT ; pullup resistors + +; ---------------------------------------------------------------------- +; FRAM config +; ---------------------------------------------------------------------- + + .IF FREQUENCY > 8 + 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). + + MOV.B #CSKEY,&CSCTL0_H ; Unlock CS registers + .IF FREQUENCY = 0.25 +; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value) + MOV #DIVA_0 + DIVS_32 + DIVM_32,&CSCTL3 + + .ELSEIF FREQUENCY = 0.5 + MOV #0,&CSCTL1 ; Set 1MHZ DCO setting + MOV #DIVA_2 + DIVS_2 + DIVM_2,&CSCTL3 ; set all dividers as 2 + + .ELSEIF FREQUENCY = 1 + MOV #0,&CSCTL1 ; Set 1MHZ DCO setting + MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0 + + .ELSEIF FREQUENCY = 2 + MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 4MHZ DCO setting + MOV #DIVA_0 + DIVS_2 + DIVM_2,&CSCTL3 + + .ELSEIF FREQUENCY = 4 + MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 4MHZ DCO setting + MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0 + + .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 + + .ELSEIF FREQUENCY = 12 + MOV #DCORSEL+DCOFSEL2+DCOFSEL1,&CSCTL1 ; Set 24MHZ DCO setting + MOV #DIVA_0 + DIVS_2 + DIVM_2,&CSCTL3 ; + + .ELSEIF FREQUENCY = 16 + MOV #DCORSEL+DCOFSEL2,&CSCTL1 ; Set 16MHZ DCO setting + MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0 + + .ELSEIF + .error "bad frequency setting, only 0.5,1,2,4,8,12,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 + + MOV #64,X ; 64* 3 ms = 192 ms delay (by default of specification) +ClockWaitX MOV &FREQ_KHZ,Y ; +ClockWaitY SUB #1,Y ;1 + JNZ ClockWaitY ;2 FREQ_KHZ x 3~ ==> 3ms + SUB #1,X ; + JNZ ClockWaitX ; + +; ---------------------------------------------------------------------- +; POWER ON RESET AND INITIALIZATION : REF +; ---------------------------------------------------------------------- + + MOV #REFTCOFF, &REFCTL + +; ---------------------------------------------------------------------- +; POWER ON RESET AND INITIALIZATION : RTC_C REGISTERS +; ---------------------------------------------------------------------- + + .IFDEF LF_XTAL +; LFXIN : PJ.4, LFXOUT : PJ.5 + BIS.B #010h,&PJSEL0 ; SEL0 for only LXIN + BIC.B #RTCHOLD,&RTCCTL1 ; Clear RTCHOLD = start RTC_B + .ENDIF + diff --git a/inc/MSP_EXP430FR5972.pat b/inc/MSP_EXP430FR5972.pat new file mode 100644 index 0000000..684fddd --- /dev/null +++ b/inc/MSP_EXP430FR5972.pat @@ -0,0 +1,279 @@ +! -*- coding: utf-8 -*- +! virtual MSP_EXP430FR5972.pat from MSP_EXP430FR6989.pat +! +\.f=\.4th for MSP_EXP430FR5972! to change file type +! +!======================== +! remove comments +!======================== +\\*\n= +\s\\*\n=\n +! ====================================================================== +! MSP430FR6989 Config +! ====================================================================== +@define{@read{@mergepath{@inpath{};MSP430FR5972.pat;}}} +@define{@read{@mergepath{@inpath{};FastForthREGtoTI.pat;}}} + +! ====================================================================== +! MSP_EXP430FR5972 board +! ====================================================================== + +! --------------------------------------------------- +! MSP - MSP-EXP430FR5972 virtual 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 ;-) +! +! GND <-------+---0V0----------> 1 LCD_Vss +! VCC >------ | --3V3-----+----> 2 LCD_Vdd +! | | +! |___ 470n --- +! ^ | --- +! / \ BAT54 | +! --- | +! 100n | 2k2 | +! P3.6 - UCA1 CLK TB0.2 >---||--+--^/\/\/v--+----> 3 LCD_Vo (=0V6 without modulation) +! P7.0/ <------------------------> 11 LCD_DB4 +! P7.1/ <------------------------> 12 LCD_DB5 +! P7.2/ <------------------------> 13 LCD_DB5 +! P7.3/ <------------------------> 14 LCD_DB7 +! P9.4/A12/C12 -------------------------> 4 LCD_RS +! P9.5/A13/C13 -------------------------> 5 LCD_R/W +! P9.6/A14/C14 -------------------------> 6 LCD_EN +! +! +--4k7-< DeepRST <-- GND +! | +! P3.4 - UCA1 TXD <-+-> RX UARTtoUSB bridge +! P3.5 - UCA1 RXD <---- TX UARTtoUSB bridge +! P3.0 - RTS ----> CTS UARTtoUSB bridge (optional hardware control flow) +! VCC - <---- VCC (optional supply from UARTtoUSB bridge - WARNING ! 3.3V !) +! GND - <---> GND (optional supply from UARTtoUSB bridge) +! +! VCC - ----> VCC SD_CardAdapter +! GND - <---> GND SD_CardAdapter +! P2.2 - UCA0 CLK ----> CLK SD_CardAdapter (SCK) +! P2.6 - ----> CS SD_CardAdapter (Card Select) +! P2.0 - UCA0 TXD/SIMO ----> SDI SD_CardAdapter (MOSI) +! P2.1 - UCA0 RXD/SOMI <---- SDO SD_CardAdapter (MISO) +! P2.7 - <---- CD SD_CardAdapter (Card Detect) +! +! P4.0 - <---- OUT IR_Receiver (1 TSOP32236) +! VCC - ----> VCC IR_Receiver (2 TSOP32236) +! GND - <---> GND IR_Receiver (3 TSOP32236) +! +! P1.3 - <---> SDA software I2C Master +! P1.5 - ----> SCL software I2C Master +! +! P1.4 -UCB0 CLK TA1.0 <---> free +! +! P1.6 -UCB0 SDA/SIMO <---> SDA hardware I2C Master or Slave +! P1.7 -UCB0 SCL/SOMI ----> SCL hardware I2C Master or Slave +! +! P3.0 -UCB1 CLK ----> free (if UARTtoUSB with software control flow) +! P3.1 -UCB1 SDA/SIMO <---> free +! P3.2 -UCB1 SCL/SOMI ----> free +! P3.3 - TA1.1 <---> free +! +! PJ.4 - LFXI 32768Hz quartz +! PJ.5 - LFXO 32768Hz quartz +! PJ.6 - HFXI +! PJ.7 - HFXO + + +! ============================================ +! FORTH I/O : +! ============================================ +BUS_TERM=\$30! \ P3.5 = RX, P3.4 = TX + +TERM_IN=\$220! +TERM_REN=\$226! +TERM_SEL=\$22C! \ SEL0 + +TERM_VEC=\$FFE4! \ UCA1 +WAKE_UP=1! \ RX int + +TERM_CTLW0=\$5E0! \ eUSCI_A control word 0 +TERM_CTLW1=\$5E2! \ eUSCI_A control word 1 +TERM_BRW=\$5E6! +TERM_BR0=\$5E6! \ eUSCI_A baud rate 0 +TERM_BR1=\$5E7! \ eUSCI_A baud rate 1 +TERM_MCTLW=\$5E8! \ eUSCI_A modulation control +TERM_STAT=\$5EA! \ eUSCI_A status +TERM_RXBUF=\$5EC! \ eUSCI_A receive buffer +TERM_TXBUF=\$5EE! \ eUSCI_A transmit buffer +TERM_ABCTL=\$5F0! \ eUSCI_A LIN control +TERM_IRTCTL=\$5F2! \ eUSCI_A IrDA transmit control +TERM_IRRCTL=\$5F3! \ eUSCI_A IrDA receive control +TERM_IE=\$5FA! \ eUSCI_A interrupt enable +TERM_IFG=\$5FC! \ eUSCI_A interrupt flags +TERM_IV=\$5FE! \ eUSCI_A interrupt vector word + +RTS=1! ; P3.0 +CTS=2! ; P3.1 +HANDSHAKIN=\$220! +HANDSHAKOUT=\$222! + + +CD_SD=\$80! ; P2.7 as Card Detect +SD_CDIN=\$201! + +CS_SD=\$40! ; P2.6 as Card Select +SD_CSOUT=\$203! +SD_CSDIR=\$205! + +BUS_SD=\$07! ; pins P2.2 as UCB0CLK, P2.0 as UCB0SIMO & P2.1 as UCB0SOMI +SD_SEL=\$20C! ; to configure UCB0 +SD_REN=\$206! ; to configure pullup resistors + + +! ============================================ +! APPLICATION I/O : +! ============================================ +LED1_OUT=\$202! +LED1=1! P1.0 + +LED2_OUT=\$282! +LED2=\$80! P9.7 + +SW1_IN=\$200! +SW1=2! P1.1 + +WIPE_IN=\$200! ; pin as FORTH Deep_RST +IO_WIPE=2! ; P1.1 = S1 + +SW2_IN=\$200! +SW2=4! P1.2 + +LCDVo_DIR=\$224! +LCDVo_SEL=\$22C! SEL1 +LCDVo=\$40! P3.6 + +!LCD timer +LCD_TIM_CTL=\$3C0! TB0CTL +LCD_TIM_CCTLn=\$3C6! TB0CCTL2 +LCD_TIM_CCR0=\$3D2! TB0CCR0 +LCD_TIM_CCRn=\$3D6! TB0CCR2 +LCD_TIM_EX0=\$3E0! TB0EX0 + +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 + + +!WATCHDOG timer +WDT_TIM_CTL=\$340! TA0CTL +WDT_TIM_CCTL0=\$342! TA0CCTL0 +WDT_TIM_CCR0=\$352! TA0CCR0 +WDT_TIM_EX0=\$360! TA0EX0 +WDT_TIM_0_Vec=\$FFE8! TA0_0_Vec + +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! +SM_SDA=8! P1.3 +SM_SCL=\$20! P1.5 +SM_BUS=\$28! + +I2CSMM_IN=\$200! +I2CSMM_OUT=\$202! +I2CSMM_DIR=\$204! +I2CSMM_REN=\$206! +SMM_SDA=8! P1.3 +SMM_SCL=\$20! P1.5 +SMM_BUS=\$28! +RC5_TIM_CTL=\$380! TA1CTL +RC5_TIM_R=\$390! TA1R +RC5_TIM_EX0=\$3A0! TA1EX0 + + +I2CMM_IN=\$200! +I2CMM_OUT=\$202! +I2CMM_DIR=\$204! +I2CMM_REN=\$206! +I2CMM_SEL=\$20A! SEL0 +I2CMM_Vec=\$FFEC! UCBO_Vec +MM_SDA=\$40! P1.6 +MM_SCL=\$80! P1.7 +MM_BUS=\$C0! + +I2CM_IN=\$200! +I2CM_OUT=\$202! +I2CM_DIR=\$204! +I2CM_REN=\$206! +I2CM_SEL=\$20A! SEL0 +I2CM_Vec=\$FFEC! UCBO_Vec +M_SDA=\$40! P1.6 +M_SCL=\$80! P1.7 +M_BUS=\$C0! + +I2CS_IN=\$200! +I2CS_OUT=\$202! +I2CS_DIR=\$204! +I2CS_REN=\$206! +I2CS_SEL=\$20A! SEL0 +I2CS_Vec=\$FFEC! UCBO_Vec +S_SDA=\$40! P1.6 +S_SCL=\$80! P1.7 +S_BUS=\$C0! + +UCSWRST=1! eUSCI Software Reset +UCTXIE=2! eUSCI Transmit Interrupt Enable +UCRXIE=1! eUSCI Receive Interrupt Enable +UCTXIFG=2! eUSCI Transmit Interrupt Flag +UCRXIFG=1! eUSCI Receive Interrupt Flag +UCTXIE0=2! eUSCI_B Transmit Interrupt Enable +UCRXIE0=1! eUSCI_B Receive Interrupt Enable +UCTXIFG0=2! eUSCI_B Transmit Interrupt Flag +UCRXIFG0=1! eUSCI_B Receive Interrupt Flag + +I2CM_CTLW0=\$640! USCI_B0 Control Word Register 0 +I2CM_CTLW1=\$642! USCI_B0 Control Word Register 1 +I2CM_BRW=\$646! USCI_B0 Baud Word Rate 0 +I2CM_STATW=\$648! USCI_B0 status word +I2CM_TBCNT=\$64A! USCI_B0 byte counter threshold +I2CM_RXBUF=\$64C! USCI_B0 Receive Buffer 8 +I2CM_TXBUF=\$64E! USCI_B0 Transmit Buffer 8 +I2CM_I2COA0=\$654! USCI_B0 I2C Own Address 0 +I2CM_ADDRX=\$65C! USCI_B0 Received Address Register +I2CM_I2CSA=\$660! USCI_B0 I2C Slave Address +I2CM_IE=\$66A! USCI_B0 Interrupt Enable +I2CM_IFG=\$66C! USCI_B0 Interrupt Flags Register + +I2CS_CTLW0=\$640! USCI_B0 Control Word Register 0 +I2CS_CTLW1=\$642! USCI_B0 Control Word Register 1 +I2CS_BRW=\$646! USCI_B0 Baud Word Rate 0 +I2CS_STATW=\$648! USCI_B0 status word +I2CS_TBCNT=\$64A! USCI_B0 byte counter threshold +I2CS_RXBUF=\$64C! USCI_B0 Receive Buffer 8 +I2CS_TXBUF=\$64E! USCI_B0 Transmit Buffer 8 +I2CS_I2COA0=\$654! USCI_B0 I2C Own Address 0 +I2CS_ADDRX=\$65C! USCI_B0 Received Address Register +I2CS_I2CSA=\$660! USCI_B0 I2C Slave Address +I2CS_IE=\$66A! USCI_B0 Interrupt Enable +I2CS_IFG=\$66C! USCI_B0 Interrupt Flags Register diff --git a/inc/MSP_EXP430FR5994.asm b/inc/MSP_EXP430FR5994.asm index fd0db53..b2524c3 100644 --- a/inc/MSP_EXP430FR5994.asm +++ b/inc/MSP_EXP430FR5994.asm @@ -259,39 +259,41 @@ SD_CDIN .equ P7IN ; DCOCLK: Internal digitally controlled oscillator (DCO). -; CS code for MSP430FR5948 - MOV.B #CSKEY,&CSCTL0_H ; Unlock CS registers - + MOV.B #CSKEY,&CSCTL0_H ; Unlock CS registers .IF FREQUENCY = 0.25 -; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value) +; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value) MOV #DIVA_0 + DIVS_32 + DIVM_32,&CSCTL3 - MOV #4,X + .ELSEIF FREQUENCY = 0.5 - MOV #0,&CSCTL1 ; Set 1MHZ DCO setting - MOV #DIVA_0 + DIVS_2 + DIVM_2,&CSCTL3 ; set all dividers as 2 - MOV #8,X + MOV #0,&CSCTL1 ; Set 1MHZ DCO setting + MOV #DIVA_2 + DIVS_2 + DIVM_2,&CSCTL3 ; set all dividers as 2 + .ELSEIF FREQUENCY = 1 - MOV #0,&CSCTL1 ; Set 1MHZ DCO setting - MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0 - MOV #16,X + MOV #0,&CSCTL1 ; Set 1MHZ DCO setting + MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0 + .ELSEIF FREQUENCY = 2 - MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 4MHZ DCO setting + MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 4MHZ DCO setting MOV #DIVA_0 + DIVS_2 + DIVM_2,&CSCTL3 - MOV #32,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 #64,X + MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 4MHZ DCO setting + MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0 + .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 #128,X +; MOV #DCOFSEL2+DCOFSEL1,&CSCTL1 ; Set 8MHZ DCO setting (default value) + MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0 + + .ELSEIF FREQUENCY = 12 + MOV #DCORSEL+DCOFSEL2+DCOFSEL1,&CSCTL1 ; Set 24MHZ DCO setting + MOV #DIVA_0 + DIVS_2 + DIVM_2,&CSCTL3 ; + .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 #256,X + MOV #DCORSEL+DCOFSEL2,&CSCTL1 ; Set 16MHZ DCO setting + MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0 + .ELSEIF - .error "bad frequency setting, only 0.5,1,2,4,8,16 MHz" + .error "bad frequency setting, only 0.5,1,2,4,8,12,16 MHz" .ENDIF .IFDEF LF_XTAL @@ -301,16 +303,12 @@ SD_CDIN .equ P7IN .ENDIF MOV.B #1, &CSCTL0_H ; Lock CS Registers - BIS &SYSRSTIV,&SAVE_SYSRSTIV ; store volatile SYSRSTIV preserving a pending request for DEEP_RST -; MOV &SAVE_SYSRSTIV,TOS ; -; CMP #2,TOS ; POWER ON ? -; JZ ClockWaitX ; yes -; RRUM #2,X ; no: wait only 125 ms -ClockWaitX MOV #5209,Y ; wait 0.5s before starting after POWER ON + MOV #64,X ; 64* 3 ms = 192 ms delay (by default of specification) +ClockWaitX MOV &FREQ_KHZ,Y ; ClockWaitY SUB #1,Y ;1 - JNZ ClockWaitY ;2 5209x3 = 15625 cycles delay = 15.625ms @ 1MHz - SUB #1,X ; x 32 @ 1 MHZ = 500ms - JNZ ClockWaitX ; time to stabilize power source ( 500ms ) + JNZ ClockWaitY ;2 FREQ_KHZ x 3~ ==> 3ms + SUB #1,X ; + JNZ ClockWaitX ; ; ---------------------------------------------------------------------- ; POWER ON RESET AND INITIALIZATION : RTC_C REGISTERS diff --git a/inc/MSP_EXP430FR6989.asm b/inc/MSP_EXP430FR6989.asm index 9a0f127..a150cfd 100644 --- a/inc/MSP_EXP430FR6989.asm +++ b/inc/MSP_EXP430FR6989.asm @@ -393,47 +393,41 @@ LED2 .equ 80h ; P9.7 LED2 green ; DCOCLK: Internal digitally controlled oscillator (DCO). - -; CS code for MSP430FR5948 - MOV.B #CSKEY,&CSCTL0_H ; Unlock CS registers - + MOV.B #CSKEY,&CSCTL0_H ; Unlock CS registers .IF FREQUENCY = 0.25 -; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value) +; MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 8MHZ DCO setting (default value) MOV #DIVA_0 + DIVS_32 + DIVM_32,&CSCTL3 - MOV #4,X .ELSEIF FREQUENCY = 0.5 - MOV #0,&CSCTL1 ; Set 1MHZ DCO setting - MOV #DIVA_2 + DIVS_2 + DIVM_2,&CSCTL3 ; set all dividers as 2 - MOV #8,X + MOV #0,&CSCTL1 ; Set 1MHZ DCO setting + MOV #DIVA_2 + DIVS_2 + DIVM_2,&CSCTL3 ; set all dividers as 2 .ELSEIF FREQUENCY = 1 - MOV #0,&CSCTL1 ; Set 1MHZ DCO setting - MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0 - MOV #16,X + MOV #0,&CSCTL1 ; Set 1MHZ DCO setting + MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0 .ELSEIF FREQUENCY = 2 - MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 4MHZ DCO setting + MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 4MHZ DCO setting MOV #DIVA_0 + DIVS_2 + DIVM_2,&CSCTL3 - MOV #32,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 #64,X + MOV #DCOFSEL1+DCOFSEL0,&CSCTL1 ; Set 4MHZ DCO setting + MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0 .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 #128,X +; MOV #DCOFSEL2+DCOFSEL1,&CSCTL1 ; Set 8MHZ DCO setting (default value) + MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0 + + .ELSEIF FREQUENCY = 12 + MOV #DCORSEL+DCOFSEL2+DCOFSEL1,&CSCTL1 ; Set 24MHZ DCO setting + MOV #DIVA_0 + DIVS_2 + DIVM_2,&CSCTL3 ; .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 #256,X + MOV #DCORSEL+DCOFSEL2,&CSCTL1 ; Set 16MHZ DCO setting + MOV #DIVA_0 + DIVS_0 + DIVM_0,&CSCTL3 ; set all dividers as 0 .ELSEIF - .error "bad frequency setting, only 0.5,1,2,4,8,16 MHz" + .error "bad frequency setting, only 0.5,1,2,4,8,12,16 MHz" .ENDIF .IFDEF LF_XTAL @@ -443,16 +437,12 @@ LED2 .equ 80h ; P9.7 LED2 green .ENDIF MOV.B #01h, &CSCTL0_H ; Lock CS Registers - BIS &SYSRSTIV,&SAVE_SYSRSTIV ; store volatile SYSRSTIV preserving a pending request for DEEP_RST -; MOV &SAVE_SYSRSTIV,TOS ; -; CMP #2,TOS ; POWER ON ? -; JZ ClockWaitX ; yes -; RRUM #2,X ; wait only 125 ms -ClockWaitX MOV #5209,Y ; wait 0.5s before starting after POWER ON + MOV #64,X ; 64* 3 ms = 192 ms delay (by default of specification) +ClockWaitX MOV &FREQ_KHZ,Y ; ClockWaitY SUB #1,Y ;1 - JNZ ClockWaitY ;2 5209x3 = 15625 cycles delay = 15.625ms @ 1MHz - SUB #1,X ; x 32 @ 1 MHZ = 500ms - JNZ ClockWaitX ; time to stabilize power source ( 500ms ) + JNZ ClockWaitY ;2 FREQ_KHZ x 3~ ==> 3ms + SUB #1,X ; + JNZ ClockWaitX ; ; ---------------------------------------------------------------------- ; POWER ON RESET AND INITIALIZATION : REF diff --git a/inc/TERMINALBAUDRATE.inc b/inc/TERMINALBAUDRATE.inc index 0b1af1b..95f2c42 100644 --- a/inc/TERMINALBAUDRATE.inc +++ b/inc/TERMINALBAUDRATE.inc @@ -90,12 +90,12 @@ TERMMCTLW_INI .equ 0FE00h TERMBRW_INI .equ 4 TERMMCTLW_INI .equ 04900h - .CASE 134400 ; PL2303TA baudrate -; Configure UART_TERM @ 268800 bauds / 1MHz -; N=1000000/134400=3.72024 ==> UCOS16=0, UCBR0=int(N)=3, UCBRF0=dont_care=0, UCBRS0= fn(frac(N))=fn(0.72024)=0xBB -; TERMBRW=UCBR0, TERMMCTLW= (UCBRS0<<8)|(UCBRF0<<4)|UCOS16 -TERMBRW_INI .equ 3 -TERMMCTLW_INI .equ 0BB00h +; .CASE 134400 ; PL2303TA baudrate +; ; Configure UART_TERM @ 268800 bauds / 1MHz +; ; N=1000000/134400=3.72024 ==> UCOS16=0, UCBR0=int(N)=3, UCBRF0=dont_care=0, UCBRS0= fn(frac(N))=fn(0.72024)=0xBB +; ; TERMBRW=UCBR0, TERMMCTLW= (UCBRS0<<8)|(UCBRF0<<4)|UCOS16 +; TERMBRW_INI .equ 3 +; TERMMCTLW_INI .equ 0BB00h ; .CASE 161280 ; PL2303TA baudrate ;; Configure UART_TERM @ 161280 bauds / 500kHz @@ -198,12 +198,12 @@ TERMMCTLW_INI .equ 04900h TERMBRW_INI .equ 4 TERMMCTLW_INI .equ 0000h - .CASE 268800 ; PL2303TA baudrate -; Configure UART_TERM @ 268800 bauds / 1MHz -; N=1000000/268800=3.72024 ==> UCOS16=0, UCBR0=int(N)=3, UCBRF0=dont_care=0, UCBRS0= fn(frac(N))=fn(0.72024)=0xBB -; TERMBRW=UCBR0, TERMMCTLW= (UCBRS0<<8)|(UCBRF0<<4)|UCOS16 -TERMBRW_INI .equ 3 -TERMMCTLW_INI .equ 0BB00h +; .CASE 268800 ; PL2303TA baudrate +;; Configure UART_TERM @ 268800 bauds / 1MHz +;; N=1000000/268800=3.72024 ==> UCOS16=0, UCBR0=int(N)=3, UCBRF0=dont_care=0, UCBRS0= fn(frac(N))=fn(0.72024)=0xBB +;; TERMBRW=UCBR0, TERMMCTLW= (UCBRS0<<8)|(UCBRF0<<4)|UCOS16 +;TERMBRW_INI .equ 3 +;TERMMCTLW_INI .equ 0BB00h ; .CASE 403200 ; PL2303TA baudrate ;; Configure UART_TERM @ 403200 bauds / 1MHz @@ -214,6 +214,7 @@ TERMMCTLW_INI .equ 0BB00h .ELSECASE .error "UART_TERM / 1 MHz : baudrate not implemented" .ENDCASE + .ELSEIF FREQUENCY = 2 .SWITCH TERMINALBAUDRATE .CASE 9600 @@ -283,32 +284,35 @@ TERMMCTLW_INI .equ 0000h ; TERMBRW=UCBR0, TERMMCTLW= (UCBRS0<<8)|(UCBRF0<<4)|UCOS16 TERMBRW_INI .equ 7 TERMMCTLW_INI .equ 05500h + .CASE 403200 ; PL2303TA baudrate ; Configure UART_TERM @ 201600 bauds / 1MHz ; N=1000000/201600=4.955401 ==> UCOS16=0, UCBR0=int(N)=4, UCBRF0=dont_care=0, UCBRS0= fn(frac(N))=fn(0.200396)=0xFE ; TERMBRW=UCBR0, TERMMCTLW= (UCBRS0<<8)|(UCBRF0<<4)|UCOS16 TERMBRW_INI .equ 4 TERMMCTLW_INI .equ 0FE00h + .CASE 460800 ; CP2102 baudrate ; Configure UART_TERM @ 921600 bauds / 4MHz ; N = 4000000/460800 = 4.34027... ==> {UCOS16=0, UCBR1=int(N)=4, UCBRF1=dont_care=0 UCBRS1=fn(frac(N))=fn(0.34027)=0x49 ; TERMBRW=UCBR0, TERMMCTLW= (UCBRS0<<8)|(UCBRF0<<4)|UCOS16 TERMBRW_INI .equ 4 TERMMCTLW_INI .equ 04900h - .CASE 614400 ; PL2303TA baudrate -; Configure UART_TERM @ 2457600 bauds / 8MHz -; N = 8000000/2457600 = 3.25521... ==> {UCOS16=0, UCBR0=int(N)=3, UCBRF0=dont_care=0, UCBRS0=fn(frac(N))=fn(0.25521)=0x44 -; TERMBRW=UCBR0, TERMMCTLW= (UCBRS0<<8)|(UCBRF0<<4)|UCOS16 -TERMBRW_INI .equ 3 -TERMMCTLW_INI .equ 04400h - .CASE 806400 ; PL2303TA baudrate -; Configure UART_TERM @ 806400 bauds / 2MHz -; Configure UART_TERM @ 403200 bauds / 1MHz -; N=1000000/403200=2.48016 ==> UCOS16=0, UCBR0=int(N)=2, UCBRF0=dont_care=0, UCBRS0= fn(frac(N))=fn(0.48016)=0x55 -; TERMBRW=UCBR0, TERMMCTLW= (UCBRS0<<8)|(UCBRF0<<4)|UCOS16 -TERMBRW_INI .equ 2 -TERMMCTLW_INI .equ 05500h +; .CASE 614400 ; PL2303TA baudrate +; ; Configure UART_TERM @ 2457600 bauds / 8MHz +; ; N = 8000000/2457600 = 3.25521... ==> {UCOS16=0, UCBR0=int(N)=3, UCBRF0=dont_care=0, UCBRS0=fn(frac(N))=fn(0.25521)=0x44 +; ; TERMBRW=UCBR0, TERMMCTLW= (UCBRS0<<8)|(UCBRF0<<4)|UCOS16 +; TERMBRW_INI .equ 3 +; TERMMCTLW_INI .equ 04400h +; +; .CASE 806400 ; PL2303TA baudrate +; ; Configure UART_TERM @ 806400 bauds / 2MHz +; ; Configure UART_TERM @ 403200 bauds / 1MHz +; ; N=1000000/403200=2.48016 ==> UCOS16=0, UCBR0=int(N)=2, UCBRF0=dont_care=0, UCBRS0= fn(frac(N))=fn(0.48016)=0x55 +; ; TERMBRW=UCBR0, TERMMCTLW= (UCBRS0<<8)|(UCBRF0<<4)|UCOS16 +; TERMBRW_INI .equ 2 +; TERMMCTLW_INI .equ 05500h ; .CASE 921600 ;; Configure UART_TERM @ 921600 bauds / 2MHz @@ -319,6 +323,7 @@ TERMMCTLW_INI .equ 05500h .ELSECASE .error "UART_TERM / 2 MHz : baudrate not implemented" .ENDCASE + .ELSEIF FREQUENCY = 4 .SWITCH TERMINALBAUDRATE .CASE 9600 @@ -403,15 +408,16 @@ TERMMCTLW_INI .equ 0FE00h TERMBRW_INI .equ 4 TERMMCTLW_INI .equ 04900h - .CASE 1228800 ; PL2303TA baudrate -; Configure UART_TERM @ 2457600 bauds / 8MHz -; N = 8000000/1228800 = 3.25521... ==> {UCOS16=0, UCBR0=int(N)=3, UCBRF0=dont_care=0, UCBRS0=fn(frac(N))=fn(0.25521)=0x44 -; TERMBRW=UCBR0, TERMMCTLW= (UCBRS0<<8)|(UCBRF0<<4)|UCOS16 -TERMBRW_INI .equ 3 -TERMMCTLW_INI .equ 04400h +; .CASE 1228800 ; PL2303TA baudrate +; ; Configure UART_TERM @ 2457600 bauds / 8MHz +; ; N = 8000000/1228800 = 3.25521... ==> {UCOS16=0, UCBR0=int(N)=3, UCBRF0=dont_care=0, UCBRS0=fn(frac(N))=fn(0.25521)=0x44 +; ; TERMBRW=UCBR0, TERMMCTLW= (UCBRS0<<8)|(UCBRF0<<4)|UCOS16 +; TERMBRW_INI .equ 3 +; TERMMCTLW_INI .equ 04400h .ELSECASE .error "UART_TERM / 4 MHz : baudrate not implemented" .ENDCASE ; UART_TERM / 4 MHz baudrates + .ELSEIF FREQUENCY = 8 .SWITCH TERMINALBAUDRATE .CASE 9600 @@ -530,22 +536,23 @@ TERMMCTLW_INI .equ 0DD00h TERMBRW_INI .equ 4 TERMMCTLW_INI .equ 04900h - .CASE 2457600 ; PL2303TA baudrate -; Configure UART_TERM @ 2457600 bauds / 8MHz -; N = 8000000/1228800 = 3.25521... ==> {UCOS16=0, UCBR0=int(N)=3, UCBRF0=dont_care=0, UCBRS0=fn(frac(N))=fn(0.25521)=0x44 -; TERMBRW=UCBR0, TERMMCTLW= (UCBRS0<<8)|(UCBRF0<<4)|UCOS16 -TERMBRW_INI .equ 3 -TERMMCTLW_INI .equ 04400h - - .CASE 3000000 ; PL2303TA baudrate -; Configure UART_TERM @ 3000000 bauds / 8MHz -; Configure UART_TERM @ 6000000 bauds / 16MHz -; N = 16000000/6000000 = 2.6666.. ==> {UCOS16=0, UCBR0=int(N)=2, UCBRF0=dont_care=0 UCBRS0=fn(frac(N))=fn(0.6666)=0xB6 -TERMBRW_INI .equ 2 -TERMMCTLW_INI .equ 0B600h +; .CASE 2457600 ; PL2303TA baudrate +; ; Configure UART_TERM @ 2457600 bauds / 8MHz +; ; N = 8000000/1228800 = 3.25521... ==> {UCOS16=0, UCBR0=int(N)=3, UCBRF0=dont_care=0, UCBRS0=fn(frac(N))=fn(0.25521)=0x44 +; ; TERMBRW=UCBR0, TERMMCTLW= (UCBRS0<<8)|(UCBRF0<<4)|UCOS16 +; TERMBRW_INI .equ 3 +; TERMMCTLW_INI .equ 04400h +; +; .CASE 3000000 ; PL2303TA baudrate +; ; Configure UART_TERM @ 3000000 bauds / 8MHz +; ; Configure UART_TERM @ 6000000 bauds / 16MHz +; ; N = 16000000/6000000 = 2.6666.. ==> {UCOS16=0, UCBR0=int(N)=2, UCBRF0=dont_care=0 UCBRS0=fn(frac(N))=fn(0.6666)=0xB6 +; TERMBRW_INI .equ 2 +; TERMMCTLW_INI .equ 0B600h .ELSECASE .error "UART_TERM / 8 MHz : baudrate not implemented" .ENDCASE ; UART_TERM / 8 MHz baudrates + .ELSEIF FREQUENCY = 10 .SWITCH TERMINALBAUDRATE .CASE 9600 @@ -679,12 +686,12 @@ TERMMCTLW_INI .equ 09200h TERMBRW_INI .equ 4 TERMMCTLW_INI .equ 00100h - .CASE 3000000 ; PL2303TA baudrate -; Configure UART_TERM @ 3000000 bauds / 10MHz -; Configure UART_TERM @ 6000000 bauds / 20MHz -; N = 20000000/6000000 = 3.3333333 ==> {UCOS16=0, UCBR0=int(N)=3, UCBRF0=dont_care=0 UCBRS0=fn(frac(N))=fn(0.33333)=0x49 -TERMBRW_INI .equ 3 -TERMMCTLW_INI .equ 04900h +; .CASE 3000000 ; PL2303TA baudrate +; ; Configure UART_TERM @ 3000000 bauds / 10MHz +; ; Configure UART_TERM @ 6000000 bauds / 20MHz +; ; N = 20000000/6000000 = 3.3333333 ==> {UCOS16=0, UCBR0=int(N)=3, UCBRF0=dont_care=0 UCBRS0=fn(frac(N))=fn(0.33333)=0x49 +; TERMBRW_INI .equ 3 +; TERMMCTLW_INI .equ 04900h .ELSECASE .error "UART_TERM / 10 MHz : baudrate not implemented" @@ -787,8 +794,8 @@ TERMMCTLW_INI .equ 0AA31h ; Configure UART_TERM @ 1843200 bauds / 24MHz ; N = 24000000/1843200 = 13.08203... {UCOS16=0, UCBR0=int(N)=13, UCBRF0=dont_care=0 UCBRS0=fn(frac(N))=fn(0.08203)=0x02 ; TERMBRW=UCBR0, TERMMCTLW= (UCBRS0<<8)|(UCBRF0<<4)|UCOS16 -TERMBRW_INI .equ 17 -TERMMCTLW_INI .equ 04A00h +TERMBRW_INI .equ 13 +TERMMCTLW_INI .equ 00200h .CASE 1000000 ; Configure UART_TERM @ 1000000 bauds / 12MHz @@ -989,18 +996,18 @@ TERMMCTLW_INI .equ 04900h TERMBRW_INI .equ 4 TERMMCTLW_INI .equ 0 - .CASE 5000000 ; PL203HXD baudrate -; Configure UART_TERM @ 5000000 bauds / 16MHz -; N = 16000000/5000000 = 3.2... ==> {UCOS16=0, UCBR0=int(N)=0, UCBRF0=dont_care=0, UCBRS0=fn(frac(N))=fn(0.2)=0x11 -; TERMBRW=UCBR0, TERMMCTLW= (UCBRS0<<8)|(UCBRF0<<4)|UCOS16 -TERMBRW_INI .equ 3 -TERMMCTLW_INI .equ 02100h - - .CASE 6000000 ; PL2303TA baudrate -; Configure UART_TERM @ 6000000 bauds / 24MHz -; N = 16000000/6000000 = 2.6666.. ==> {UCOS16=0, UCBR0=int(N)=2, UCBRF0=dont_care=0 UCBRS0=fn(frac(N))=fn(0.6666)=0xB6 -TERMBRW_INI .equ 2 -TERMMCTLW_INI .equ 0B600h +; .CASE 5000000 ; PL203HXD baudrate +; ; Configure UART_TERM @ 5000000 bauds / 16MHz +; ; N = 16000000/5000000 = 3.2... ==> {UCOS16=0, UCBR0=int(N)=0, UCBRF0=dont_care=0, UCBRS0=fn(frac(N))=fn(0.2)=0x11 +; ; TERMBRW=UCBR0, TERMMCTLW= (UCBRS0<<8)|(UCBRF0<<4)|UCOS16 +; TERMBRW_INI .equ 3 +; TERMMCTLW_INI .equ 02100h +; +; .CASE 6000000 ; PL2303TA baudrate +; ; Configure UART_TERM @ 6000000 bauds / 24MHz +; ; N = 16000000/6000000 = 2.6666.. ==> {UCOS16=0, UCBR0=int(N)=2, UCBRF0=dont_care=0 UCBRS0=fn(frac(N))=fn(0.6666)=0xB6 +; TERMBRW_INI .equ 2 +; TERMMCTLW_INI .equ 0B600h .ELSECASE .error "UART_TERM / 16 MHz : baudrate not implemented" @@ -1143,11 +1150,11 @@ TERMMCTLW_INI .equ 0 TERMBRW_INI .equ 4 TERMMCTLW_INI .equ 0 - .CASE 6000000 ; PL2303TA baudrate -; Configure UART_TERM @ 6000000 bauds / 20MHz -; N = 20000000/6000000 = 3.3333333 ==> {UCOS16=0, UCBR0=int(N)=3, UCBRF0=dont_care=0 UCBRS0=fn(frac(N))=fn(0.33333)=0x49 -TERMBRW_INI .equ 3 -TERMMCTLW_INI .equ 04900h +; .CASE 6000000 ; PL2303TA baudrate +; ; Configure UART_TERM @ 6000000 bauds / 20MHz +; ; N = 20000000/6000000 = 3.3333333 ==> {UCOS16=0, UCBR0=int(N)=3, UCBRF0=dont_care=0 UCBRS0=fn(frac(N))=fn(0.33333)=0x49 +; TERMBRW_INI .equ 3 +; TERMMCTLW_INI .equ 04900h .ELSECASE .error "UART_TERM / 20 MHz : baudrate not implemented" @@ -1285,7 +1292,7 @@ TERMMCTLW_INI .equ 0 .CASE 5000000 ; PL203HXD baudrate ; Configure UART_TERM @ 5000000 bauds / 24MHz -; N = 24000000/5000000 = 4.8... ==> {UCOS16=0, UCBR0=int(N)=0, UCBRF0=dont_care=0, UCBRS0=fn(frac(N))=fn(0.2)=0x11 +; N = 24000000/5000000 = 4.8... ==> {UCOS16=0, UCBR0=int(N)=0, UCBRF0=dont_care=0, UCBRS0=fn(frac(N))=fn(0.8)=0xEE ; TERMBRW=UCBR0, TERMMCTLW= (UCBRS0<<8)|(UCBRF0<<4)|UCOS16 TERMBRW_INI .equ 4 TERMMCTLW_INI .equ 0EE00h @@ -1296,6 +1303,12 @@ TERMMCTLW_INI .equ 0EE00h TERMBRW_INI .equ 4 TERMMCTLW_INI .equ 0 +; .CASE 7500000 ; PL2303TA baudrate +; ; Configure UART_TERM @ 7500000 bauds / 24MHz +; ; N = 24000000/7500000 = 3.2 ==> {UCOS16=0, UCBR0=int(N)=3, UCBRF0=dont_care=0 UCBRS0=fn(frac(N))=fn(0.2)=0x11 +; TERMBRW_INI .equ 3 +; TERMMCTLW_INI .equ 01100h + .ELSECASE .error "UART_TERM / 24 MHz : baudrate not implemented" .ENDCASE ; UART_TERM / 24MHz baudrates diff --git a/inc/TargetInit.asm b/inc/TargetInit.asm index 02f3b7c..18656d0 100644 --- a/inc/TargetInit.asm +++ b/inc/TargetInit.asm @@ -31,8 +31,5 @@ .listing off ; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv ; add here your target.asm item: -; .IFDEF MY_MSP430FR5738_1 -; .include MY_MSP430FR5738_1.asm -; .ENDIF ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .restore diff --git a/inc/ThingsInFirst.inc b/inc/ThingsInFirst.inc index 33abfd6..f5ee7fd 100644 --- a/inc/ThingsInFirst.inc +++ b/inc/ThingsInFirst.inc @@ -2,10 +2,26 @@ .cpu MSP430X ; define CPU +BIT0 .equ 1 +BIT1 .equ 2 +BIT2 .equ 4 +BIT3 .equ 8 +BIT4 .equ 16 +BIT5 .equ 32 +BIT6 .equ 64 +BIT7 .equ 128 +BIT8 .equ 256 +BIT9 .equ 512 +BIT10 .equ 1024 +BIT11 .equ 2048 +BIT12 .equ 4096 +BIT13 .equ 8192 +BIT14 .equ 16384 +BIT15 .equ 32768 + ; ---------------------------------------------- ; MACROS FOR assembly instructions ; ---------------------------------------------- - NOP .macro ; 1 word, 1 cycle .word 4303h ; mov #0, r3 .endm @@ -29,7 +45,7 @@ SCG0 .equ 0040h ; System Clock Generator 0. 1=turn_off_DCO SCG1 .equ 0080h ; System Clock Generator 1. 1=turn_off_SMCLK V .equ 0100h UF9 .equ 0200h ; = SR(9) User Flag 9 -UF10 .equ 0400h ; = SR(10) User Flag 1 +UF10 .equ 0400h ; = SR(10) User Flag 10 UF11 .equ 0800h ; = SR(11) User Flag 11 ;---------------------------------------------------------------------------- LPM0 .equ CPUOFF @@ -65,29 +81,9 @@ IP .reg R13 ; interpretative pointer TOS .reg R14 ; first PSP cell PSP .reg R15 ; PSP = Parameters Stack Pointer (stack data) - - ; ---------------------------------------------- ; EXECUTIVE WORDS FOR Direct-Threaded Code (DTC) ; ---------------------------------------------- - -;------------------------------------------------------------------------------- -; DODOES leave on parameter stack the PFA of a CREATE definition and execute Master word -;------------------------------------------------------------------------------- -DODOES .equ 1285h ; CALL rDODOES ; [rDODOES] is defined as xdodoes by COLD - -;------------------------------------------------------------------------------- -; DOCON leave on parameter stack the [PFA] of a CONSTANT definition -;------------------------------------------------------------------------------- -DOCON .equ 1286h ; 4 CALL rDOCON ; [rDOCON] is defined as xdocon by COLD - -;------------------------------------------------------------------------------- -; DOVAR leave on parameter stack the PFA of a VARIABLE definition -;------------------------------------------------------------------------------- -DOVAR .equ 1287h ; 4 for CALL rDOVAR S-- VAR PFA R-- - ; [rDOVAR] is defined as RFROM by COLD -;------------------------------------------------------------------------------- -; DOCOL starts high level words ;------------------------------------------------------------------------------- ; very nice FAST FORTH feature: ; as IP is always computed from the PC value, we can place low to high level @@ -96,62 +92,46 @@ DOVAR .equ 1287h ; 4 for CALL rDOVAR S-- VAR PFA R-- ;------------------------------------------------------------------------------- .SWITCH DTC - .CASE 1 ; DOCOL = CALL rDOCOL, [rDOCOL] = xdocol - -DOCOL1 .equ 1284h ; 4 CALL rDOCOL - -ASMtoFORTH .MACRO ; compiled by LO2HI - CALL #EXIT ; 10 cycles - .ENDM ; 2 words, 10 cycles - ; LO2HI + HI2LO = 3 words, 10 cycles. - -mDOCOL .MACRO ; compiled by : and by colon - CALL rDOCOL ; 10 [rDOCOL] = xdocol - .ENDM ; 1 word, 14 cycles (CALL included) (ITC+4) - ; COLON + SEMI = 2 words, 20 cycles (ITC+2) + .CASE 1 ; DOCOL = CALL rDOCOL, [rDOCOL] = XDOCOL +ASMtoFORTH .MACRO ; compiled by LO2HI + CALL #EXIT ; 10 cycles + .ENDM ; 2 words, 10 cycles + ; LO2HI + HI2LO = 3 words, 10 cycles. +mDOCOL .MACRO ; compiled by : and by colon + CALL rDOCOL ; 10 [rDOCOL] = XDOCOL + .ENDM ; 1 word, 14 cycles (CALL included) (ITC+4) + ; COLON + SEMI = 2 words, 20 cycles (ITC+2) .CASE 2 ; DOCOL = PUSH IP + CALL rDOCOL, [rDOCOL] = EXIT - -DOCOL1 .equ 120Dh ; 3 PUSH IP -DOCOL2 .equ 1284h ; 4 CALL rDOCOL - -ASMtoFORTH .MACRO ; compiled by LO2HI - CALL rDOCOL ; 10 [rDOCOL] = EXIT - .ENDM ; 1 word, 10 cycles. - ; LO2HI + HI2LO = 2 words, 10 cycles. - -mDOCOL .MACRO ; compiled by : and by COLON - PUSH IP ; 3 - CALL rDOCOL ; 10 [rDOCOL] = EXIT - .ENDM ; 2 words, 13 cycles (ITC+3) - ; COLON + SEMI = 3 words, 19 cycles (ITC+1) - +ASMtoFORTH .MACRO ; compiled by LO2HI + CALL rDOCOL ; 10 [rDOCOL] = EXIT + .ENDM ; 1 word, 10 cycles. + ; LO2HI + HI2LO = 2 words, 10 cycles. + +mDOCOL .MACRO ; compiled by : and by COLON + PUSH IP ; 3 + CALL rDOCOL ; 10 [rDOCOL] = EXIT + .ENDM ; 2 words, 13 cycles (ITC+3) + ; COLON + SEMI = 3 words, 19 cycles (ITC+1) .CASE 3 ; inlined DOCOL - -DOCOL1 .equ 120Dh ; 3 PUSH IP -DOCOL2 .equ 400Dh ; 1 MOV PC,IP -DOCOL3 .equ 522Dh ; 1 ADD #4,IP - -ASMtoFORTH .MACRO ; compiled by LO2HI - MOV PC,IP ; 1 - ADD #4,IP ; 1 - MOV @IP+,PC ; 4 NEXT - .ENDM ; 6 cycles, 3 words - ; LO2HI + HI2LO = 4 words, 6 cycles. - -mDOCOL .MACRO ; compiled by : and by COLON - PUSH IP ; 3 - MOV PC,IP ; 1 - ADD #4,IP ; 1 - MOV @IP+,PC ; 4 NEXT - .ENDM ; 4 words, 9 cycles (ITC-1) - ; COLON + SEMI = 5 words, 15 cycles (ITC-3) +ASMtoFORTH .MACRO ; compiled by LO2HI + MOV PC,IP ; 1 + ADD #4,IP ; 1 + MOV @IP+,PC ; 4 NEXT + .ENDM ; 6 cycles, 3 words + ; LO2HI + HI2LO = 4 words, 6 cycles. + +mDOCOL .MACRO ; compiled by : and by COLON + PUSH IP ; 3 + MOV PC,IP ; 1 + ADD #4,IP ; 1 + MOV @IP+,PC ; 4 NEXT + .ENDM ; 4 words, 9 cycles (ITC-1) + ; COLON + SEMI = 5 words, 15 cycles (ITC-3) .ENDCASE ; DTC -;low level return -NEXT .equ 4D30h ; 4 MOV @IP+,PC - ; jump from Asm word to NEXT Asm word: 1 word, 4 cycles (ITC-2) - + .save + .listing off ; ---------------------------------------------- ; INIT VOCABULARY POINTERS and MACROS FOR HEADER ; ---------------------------------------------- @@ -159,9 +139,6 @@ voclink .set 0 ; init vocabulary links forthlink .set 0 asmlink .set 0 - .save - .listing off - .IF THREADS = 1 FORTHWORD .MACRO name @@ -570,21 +547,84 @@ asmlink31 .set $ .endif ; thread case - .restore - .IFNDEF TERMINAL_I2C -; -------------------------- -; COMPUTE BAUDRATE registers = fn(FREQUENCY,BAUDS) -; -------------------------- - .include "TERMINALBAUDRATE.inc" - .ENDIF - ; ------------------------------------- ; define MAIN max bound ; ------------------------------------- FRAM_FULL .equ SIGNATURES-40h ; set to protect JTAG and BSL signatures against overwrite. ; 64 bytes are sufficient considering what can be compiled in one line + WORD use. ; take care with ALLOT : don't ALLOT more than 32 words by line! + .restore +; -------------------------- +; COMPUTE ASSEMBLY SWITCHES +; -------------------------- + .IFDEF CORE_COMPLEMENT + .IFNDEF USE_MOVE +USE_MOVE + .ENDIF + .ENDIF + .IFDEF UTILITY + .IFNDEF USE_MOVE +USE_MOVE + .ENDIF + .ENDIF + .IFDEF FIXPOINT_INPUT + .IFNDEF DOUBLE_INPUT +DOUBLE_INPUT + .ENDIF + .ENDIF + .IFDEF SD_CARD_LOADER +; define if QUIT is DEFERed + .IFNDEF DOUBLE_INPUT +DOUBLE_INPUT + .ENDIF + .IFNDEF DEFER_ACCEPT +DEFER_ACCEPT + .ENDIF + .IFDEF BOOTLOADER + .IFNDEF CONDCOMP +CONDCOMP ; mandatory for Bootstrap + .ENDIF + .IFNDEF DEFER_QUIT +DEFER_QUIT + .ENDIF + .ENDIF + .ENDIF + .IFDEF EXTENDED_ASM + .IFNDEF DOUBLE_INPUT +DOUBLE_INPUT + .ENDIF + .ELSE + .IFDEF EXTENDED_MEM + .IFNDEF MSP430ASSEMBLER +MSP430ASSEMBLER + .ENDIF + .IFNDEF DOUBLE_INPUT +DOUBLE_INPUT + .ENDIF + .ENDIF + .ENDIF + .IFDEF FIXPOINT + .IFNDEF FIXPOINT_INPUT +FIXPOINT_INPUT ; to interpret fixpoint numbers + .ENDIF + .ENDIF + .IFDEF FIXPOINT_INPUT + .IFNDEF DOUBLE_NUMBERS +DOUBLE_NUMBERS ; to process double numbers + .ENDIF + .ENDIF + .IFDEF DOUBLE_INPUT + .IFNDEF DOUBLE_NUMBERS +DOUBLE_NUMBERS ; to process double numbers + .ENDIF + .ENDIF +; -------------------------- +; COMPUTE BAUDRATE registers = fn(FREQUENCY,BAUDS) +; -------------------------- + .IFNDEF TERMINAL_I2C + .include "TERMINALBAUDRATE.inc" + .ENDIF ;----------------------------------------------------------------------- ; DEVICE I/O, MEMORY, SFR, vectors and minimum FORTH I/O declarations ;----------------------------------------------------------------------- @@ -631,7 +671,19 @@ UCA1_TERM UCA0_SD .INCLUDE "MSP430FR6989.inc" .ENDIF + .IFDEF MSP_EXP430FR5972 +;EXTENDED_MEM +LF_XTAL + .IFDEF TERMINAL_I2C +UCB0_TERM + .ELSE +UCA1_TERM + .ENDIF +UCA0_SD + .INCLUDE "MSP430FR5972.inc" + .ENDIF .IFDEF MSP_EXP430FR4133 +FLL LF_XTAL .IFDEF TERMINAL_I2C UCB0_TERM @@ -642,6 +694,7 @@ UCB0_SD .INCLUDE "MSP430FR4133.inc" .ENDIF .IFDEF MSP_EXP430FR2433 +FLL LF_XTAL .IFDEF TERMINAL_I2C UCB0_TERM @@ -652,6 +705,7 @@ UCA1_SD .include "MSP430FR2433.inc" .ENDIF .IFDEF CHIPSTICK_FR2433 +FLL ; no LF_XTAL to select ACLK = REFOCLK .IFDEF TERMINAL_I2C UCB0_TERM @@ -663,6 +717,7 @@ UCB0_SD .include "MSP430FR2433.inc" .ENDIF .IFDEF MSP_EXP430FR2355 +FLL LF_XTAL .IFDEF TERMINAL_I2C UCB0_TERM @@ -673,6 +728,7 @@ UCB1_SD .include "MSP430FR2355.inc" .ENDIF .IFDEF LP_MSP430FR2476 +FLL ;EXTENDED_MEM ; LF_XTAL ; connect resistors R2=0k, R3=0k before uncomment this line .IFDEF TERMINAL_I2C @@ -683,143 +739,51 @@ UCA0_TERM UCA1_SD .include "MSP430FR2476.inc" .ENDIF - + .IFDEF YOUR_TARGET ; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv ; add here your device.inc item: -; .IFDEF MY_MSP430FR5738_1 -; UCA0_UART ; defines uart used by FORTH input terminal -; LF_XTAL ; defines if your module have a 32768 Hz xtal, to enable it. -; UCB0_SD ; defines UC used for SD Card driver if used -; .include "MSP430FR5738.inc" ; include device declarations -; .ENDIF ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -; -------------------------- -; COMPUTE SWITCHES -; -------------------------- - .IFDEF CORE_COMPLEMENT - .IFNDEF USE_MOVE -USE_MOVE - .ENDIF - .ENDIF - - .IFDEF UTILITY - .IFNDEF USE_MOVE -USE_MOVE - .ENDIF .ENDIF - .IFDEF FIXPOINT_INPUT - .IFNDEF DOUBLE_INPUT -DOUBLE_INPUT - .ENDIF + .restore +; --------------------------- +; compute value of FORTHADDON +; --------------------------- +FADDON .set 0 + .IFDEF LF_XTAL +FADDON .SET FADDON | BIT15 ; LFXTAL = 32768 Hz .ENDIF - -; define if QUIT is DEFERed - .IFDEF SD_CARD_LOADER - .IFNDEF DOUBLE_INPUT -DOUBLE_INPUT - .ENDIF - .IFNDEF DEFER_ACCEPT -DEFER_ACCEPT - .ENDIF - - .IFDEF BOOTLOADER - .IFNDEF CONDCOMP -CONDCOMP ; mandatory for Bootstrap - .ENDIF - .IFNDEF DEFER_QUIT -DEFER_QUIT - .ENDIF + .IFNDEF TERMINAL_I2C ; if TERMINAL UART... + .IFDEF TERMINAL5WIRES +FADDON .SET FADDON | BIT14 ; UART CTS .ENDIF - .ENDIF - - .IFDEF EXTENDED_ASM - .IFNDEF DOUBLE_INPUT -DOUBLE_INPUT + .IFDEF TERMINAL4WIRES +FADDON .SET FADDON | BIT13 ; UART RTS .ENDIF - .ELSE - .IFDEF EXTENDED_MEM - .IFNDEF MSP430ASSEMBLER -MSP430ASSEMBLER - .ENDIF - .IFNDEF DOUBLE_INPUT -DOUBLE_INPUT - .ENDIF + .IFDEF TERMINAL3WIRES +FADDON .SET FADDON | BIT12 ; UART XON/XOFF .ENDIF - .ENDIF - - .IFDEF FIXPOINT - .IFNDEF FIXPOINT_INPUT -FIXPOINT_INPUT ; to interpret fixpoint numbers + .IFDEF HALFDUPLEX +FADDON .SET FADDON | BIT11 ; UART Half Duplex .ENDIF - .ENDIF - + .ENDIF ; TERMINAL UART .IFDEF FIXPOINT_INPUT - .IFNDEF DOUBLE_NUMBERS -DOUBLE_NUMBERS ; to process double numbers +FADDON .SET FADDON | BIT10 ; FIXPOINT INPUT .ENDIF - .ENDIF - .IFDEF DOUBLE_INPUT - .IFNDEF DOUBLE_NUMBERS -DOUBLE_NUMBERS ; to process double numbers - .ENDIF +FADDON .SET FADDON | BIT9 ; DOUBLE INPUT .ENDIF - -; --------------------------- -; compute value of FORTHADDON -; --------------------------- -FADDON .set 0 - .IFDEF CONDCOMP -FADDON .SET FADDON | 01h ; Conditionnal Compilation + .IFDEF EXTENDED_ASM ; Assembler 20 bits +FADDON .SET FADDON | BIT8 .ENDIF .IFDEF MSP430ASSEMBLER -FADDON .SET FADDON | 02h ; MSP430 Assembler (16 bits addresses) - .ENDIF - .IFDEF EXTENDED_ASM ; MSP430X Assembler (16+20 bits addresses) -FADDON .SET FADDON | 04h - .ENDIF - .IFDEF DEFERRED -FADDON .SET FADDON | 08h ; DEFERRED, adds DEFER IS :NONAME CODENNM - .ENDIF - .IFDEF VOCABULARY_SET -FADDON .SET FADDON | 10h ; VOCABULERY SET, adds VOCABULARY FORTH ASSEMBLER ALSO PREVIOUS ONLY DEFINITIONS (FORTH83) - .ENDIF - .IFDEF DOUBLE_INPUT -FADDON .SET FADDON | 20h ; DOUBLE INPUT - .ENDIF - .IFDEF FIXPOINT_INPUT -FADDON .SET FADDON | 40h ; FIXPOINT INPUT - .ENDIF - .IFDEF SD_CARD_LOADER -FADDON .SET FADDON | 80h ; SD_CARD Loader - .ENDIF - .IFDEF SD_CARD_READ_WRITE -FADDON .SET FADDON | 100h ; SD_CARD Read Write Delete - .ENDIF - .IFDEF BOOTLOADER -FADDON .SET FADDON | 200h ; BOOTLOADER +FADDON .SET FADDON | BIT7 ; Assembler 16 bits .ENDIF .IFDEF EXTENDED_MEM .IFNDEF EXTENDED_ASM -FADDON .SET FADDON | 400h ; MSP430 Assembler with Address access beyond $FFFF +FADDON .SET FADDON | BIT6 ; Assembler 16 bits with Address access beyond $FFFF .ENDIF .ENDIF - .IFNDEF TERMINAL_I2C ; if TERMINAL UART... - .IFDEF HALFDUPLEX -FADDON .SET FADDON | 800h ; UART Half Duplex - .ENDIF - .IFDEF TERMINAL3WIRES -FADDON .SET FADDON | 1000h ; UART XON/XOFF - .ENDIF - .IFDEF TERMINAL4WIRES -FADDON .SET FADDON | 2000h ; UART RTS - .ENDIF - .IFDEF TERMINAL5WIRES -FADDON .SET FADDON | 4000h ; UART CTS - .ENDIF - .ENDIF ; TERMINAL UART - .IFDEF LF_XTAL -FADDON .SET FADDON | 8000h ; LFXTAL = 32768 Hz + .IFDEF CONDCOMP +FADDON .SET FADDON | BIT0 ; Conditionnal Compilation .ENDIF diff --git a/inc/ThingsInLast.inc b/inc/ThingsInLast.inc index 0034450..6282f4c 100644 --- a/inc/ThingsInLast.inc +++ b/inc/ThingsInLast.inc @@ -73,77 +73,93 @@ lastasmword31 .equ asmlink31 .ENDIF -; .org 0FF88h ; JTAG_PASSWORD, up to 0FFFEh -; .org 0FFE0h ; BSL_PASSWORD, 16 words - .org 0FF80h ; erase SIGNATURES area - .word -1 - .word -1 - .word -1 - .word -1 - .word -1 - .word -1 - .word -1 - .word -1 - .word -1 - .word -1 +;---------------- +; 0FF40h = FRAM_FULL threshold = SIGNATURES - 40h +;---------------- + +;---------------- +; 0FF80h = SIGNATURES AREA, Deep_RST erases only 8 words from 0FF80h to 0FF90h +;---------------- + .org 0FF80h ; JTAG signature (2 words) + .word -1 .word -1 +; .org 0FF84h ; BSL signature (2 words) + .word -1 .word -1 +; .org 0FF88h ; MSP430FR5xxx|MSP430FR6xxx JTAG_PASSWORD, up to 0FFFFh +; .org 0FF88h ; MSP430FR5xxx|MSP430FR6xxx encapsulation signature (2 words) .word -1 .word -1 .word -1 .word -1 +; .org 0FF90h ; free for 8 x I2C addresses UCBx + .word 0 ; I2C address mini = 10h, maxi = 0EEh (I2C-bus specification and user manual V6) + .word 0 ; (112 x I2C addresses with R/W flag = 0) + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 - .org 0FFA0h ; MSP430FR2355/2476 BSL I2C Address, a good idea for I2C_SLAVE_ADR(s) area, isn't it? - .word 10h ; --> BSL I2C - .word 10h ; --> UCBxI2COA0 - .word 20h ; --> UCBxI2COA1 - .word 30h ; --> UCBxI2COA2 - .word 40h ; --> UCBxI2COA3 +;---------------- +; FFA0h = MSP430FR2355/2476 BSL I2C Address, a good idea for I2C_SLAVE_ADR(s) area, isn't it? +;---------------- + .org 0FFA0h ; + .word 077h ; --> MSP430FR2355/2476 BSL I2C 7 bits address (without R/W flag) + .word 10h ; --> UCBxI2COA0 8 bits address (with R/W flag=0) + .word 12h ; --> UCBxI2COA1 + .word 14h ; --> UCBxI2COA2 + .word 16h ; --> UCBxI2COA3 .word 0 -; .org 0FFACh ; lowest known vector interrupt - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 - .word RESET-4 ; USER NMI vestor, don't change this value ! - .word RESET-4 ; SYS NMI vector - .word RESET ; RST vector +;---------------- +; FFACh = VECTORS AREA (lowest known vector interrupt) +;---------------- + .org 0FFACh + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD +; .org 0FFE0h ; BSL_PASSWORD, 32 bytes + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD + .word COLD ; USER_NMI vector, don't change this value ! + .word COLD ; SYS_NMI vector + .word RESET ; RST vector, used once after programming, because RESET code changes RST PIN to USER_NMI PIN .org TERM_VEC ; will generate overlap warning, don't care .word TERMINAL_INT ; TERMINAL vector (UART or I2C_Slave) -- 2.11.0