From 3bc1014fd0703b7bd40c4d5e440912237de50bab Mon Sep 17 00:00:00 2001 From: Jean-Michel THOORENS Date: Sat, 29 Sep 2018 14:29:51 +0200 Subject: [PATCH] improve pat files --- FastForth.pdf | Bin 86472 -> 90125 bytes MSP430-FORTH/RC5toLCD.f | 141 ++++++++++++++++------------- config/gema/CHIPSTICK_FR2433.pat | 42 ++++++--- config/gema/MSP430FR5738.pat | 10 +-- config/gema/MSP430FR5994.pat | 2 - config/gema/MSP_EXP430FR2355.pat | 42 ++++++--- config/gema/MSP_EXP430FR2433.pat | 46 ++++++---- config/gema/MSP_EXP430FR4133.pat | 42 ++++++--- config/gema/MSP_EXP430FR5739.pat | 44 +++++++--- config/gema/MSP_EXP430FR5969.pat | 20 ++++- config/gema/MSP_EXP430FR5994.pat | 42 ++++++++- config/gema/MSP_EXP430FR6989.pat | 20 ++++- config/gema/RemoveComments.pat | 41 +++++++-- config/msp430/.minirc.dfl | 21 +++++ config/msp430/.profile | 30 +++++++ config/msp430/CopyTo_SD_Card | 2 +- config/msp430/CopyTo_SD_Card.bat | 14 +-- config/msp430/Preprocess | 5 +- config/msp430/Preprocess.bat | 2 +- config/msp430/SendFile.ttl | 37 ++++---- config/msp430/SendSource | 9 +- config/msp430/SendSource.bat | 15 ++-- config/msp430/build | 2 +- config/msp430/prog | 32 +++---- config/scite/AS_MSP430/forth.properties | 57 +++++++----- forthMSP430FR.asm | 151 +++++++++++++++++--------------- forthMSP430FR_CONDCOMP.asm | 4 - forthMSP430FR_SD_INIT.asm | 14 +-- 28 files changed, 565 insertions(+), 322 deletions(-) create mode 100644 config/msp430/.minirc.dfl create mode 100644 config/msp430/.profile diff --git a/FastForth.pdf b/FastForth.pdf index 439675b5337e11d0fc6065866e9aa2d993e9be0a..cf16e3fc64cf5014807f751fe8a6469b03ed5474 100644 GIT binary patch delta 52002 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

DP{?w%+C)WRJ zov41_JIe=34AXy_Ub5HO(oP;T_Dq@?I`%AFqc~VXxbkZ4K%BOcp-!#iKMzj&XeWH_wMTjgc|4lwNPkSR-;dim;OAM{=Vk;$0S zSh#-pcRtA~xOx-^uEgaW;9{zXfDq(8-SP2Gb+(v(0wXKSnsMWzZD6w5$9wP@A4I(X zt(N9g?*An}VI!KfK&>pi#4z0t_-p&4@qC$W)sPH7gWyln5CYEoe0Q)-!t!Zvy0P&g z)KEIa%eQJ_6)RapZ8gV#oag;Wu)x|J2ge{s+{u!0u#`Se%l;8}+dkWPepKR``lBsJ z(yZ>6tg4#fRTgtiq9eL4>!4)$9{nkqu}bXcJJCUA&&nK^-5>7bgSbut zeUYiAUH|Fe`!2N=;7jaV&mmhnsV#lCSyss2BrujV<>;QZklaq-PG&gv%k2r|ZNduNZWGoI!! zyO7&yDql&hv2$MRh~+~6%g*UnlH;g@FoMjX2eIL?I{cTOyMB*@II-)-!KC~GmyW}| zzohKLkpc5&c1fR8MfZgh`TXC~M&Zm=py45(MS2D54y3I_9i+$I?~q>E8Oo@ND29Xc zn2iI>%In|+&;9^g7b?yq_T-|$vHTAyosp4~lQHo-06p!A1pxk->4�Tq0gSH91w9TQxC!;n}s;hs66{xmM*3>48p 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 diff --git a/MSP430-FORTH/RC5toLCD.f b/MSP430-FORTH/RC5toLCD.f index fadd07e..1a2dfaa 100644 --- a/MSP430-FORTH/RC5toLCD.f +++ b/MSP430-FORTH/RC5toLCD.f @@ -1,12 +1,16 @@ ; ----------------------------------- -; RC5toLCD.4th +; RC5toLCD.f ; ----------------------------------- +\ +\ FastForth Compiling options used : +\ DTC=2, FREQUENCY=8/16/24MHz, THREADS=16, +\ nnn bauds, 3WIRES, 4WIRES, +\ ASSEMBLER, CONDCOMP, NONAME, UTILITY. \ TARGET SELECTION \ MSP_EXP430FR5739 MSP_EXP430FR5969 MSP_EXP430FR5994 MSP_EXP430FR6989 \ MSP_EXP430FR2355 - - \ +\ \ Copyright (C) <2016> \ \ This program is free software: you can redistribute it and/or modify @@ -21,52 +25,52 @@ \ \ You should have received a copy of the GNU General Public License \ along with this program. If not, see . - - +\ +\ \ =========================================================================== \ remember: for good downloading to target, all lines must be ended with CR+LF ! \ =========================================================================== - - +\ +\ \ REGISTERS USAGE \ R4 to R7 must be saved before use and restored after \ scratch registers Y to S are free for use \ under interrupt, IP is free for use \ interrupts reset SR register ! - +\ \ PUSHM order : PSP,TOS, IP, S, T, W, X, Y, 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 - +\ \ ASSEMBLER conditionnal usage after IF UNTIL WHILE : S< S>= U< U>= 0= 0<> 0>= \ ASSEMBLER conditionnal usage before ?JMP ?GOTO : S< S>= U< U>= 0= 0<> 0< - +\ \ FORTH conditionnal : 0= 0< = < > U< - +\ \ display on a LCD 2x20 CHAR the code sent by an IR remote under philips RC5 protocol \ target : any TI MSP-EXP430FRxxxx launchpad (FRAM) \ LPM_MODE = LPM0 because use SMCLK for LCDVo - +\ \ DEMO : driver for IR remote compatible with the PHILIPS RC5 protocol \ plus : driver for 5V LCD 2x20 characters display with 4 bits data interface \ without usage of an auxiliary 5V to feed the LCD_Vo \ and without potentiometer to adjust the LCD contrast : \ to adjust LCD contrast, just press S1 (-) or S2 (+) \ LCDVo current consumption ~ 500 uA. - +\ \ =================================================================================== \ notice : adjust WDT_TIM_EX0,LCD_TIM_CTL,LCD_TIM_EX0 and 20_us to the target frequency if <> 8MHz ! \ =================================================================================== - - +\ +\ \ layout : I/O are defined in the launchpad.pat file (don't work with ChipStick_FR2433) - +\ \ GND <-------+---0V0----------> 1 LCD_Vss \ VCC >------ | --3V6-----+----> 2 LCD_Vdd \ | | @@ -83,27 +87,26 @@ \ <------------------------> 12 LCD_DB5 \ <------------------------> 13 LCD_DB5 \ <------------------------> 14 LCD_DB7 - +\ \ <----- LCD contrast + <--- Sw1 <--- (finger) :-) \ <----- LCD contrast - <--- Sw2 <--- (finger) :-) - +\ \ rc5 <--- OUT IR_Receiver (1 TSOP32236) [DEFINED] {RC5TOLCD} [IF] {RC5TOLCD} [THEN] \ remove application [DEFINED] ASM [IF] \ security test - \ + MARKER {RC5TOLCD} - \ + [UNDEFINED] MAX [IF] \ MAX and MIN are defined in {ANS_COMP} - \ + CODE MAX \ n1 n2 -- n3 signed maximum CMP @PSP,TOS \ n2-n1 S< ?GOTO FW1 \ n2= 2) @@ -121,7 +123,6 @@ ENDCODE R> OVER - 0 MAX SPACES TYPE ; [THEN] - \ \ CODE 20_US \ n -- n * 20 us \ BEGIN \ 3 cycles loop + 6~ @@ -138,7 +139,6 @@ ENDCODE \ MOV @PSP+,TOS \ 2 \ MOV @IP+,PC \ 4 \ ENDCODE -\ \ CODE 20_US \ n -- n * 20 us BEGIN \ here we presume that LCD_TIM_IFG = 1... @@ -151,7 +151,6 @@ U< UNTIL \ 2 ...so add a dummy loop with U< instead of 0= MOV @PSP+,TOS \ 2 MOV @IP+,PC \ 4 ENDCODE - \ CODE TOP_LCD \ LCD Sample \ \ if write : %xxxxWWWW -- @@ -172,7 +171,6 @@ THEN \ read LCD bits pattern AND.B #LCD_DB,TOS \ MOV @IP+,PC ENDCODE - \ CODE LCD_W \ byte -- write byte to LCD SUB #2,PSP \ @@ -184,54 +182,48 @@ COLON \ high level word starts here TOP_LCD 2 20_US \ write high nibble first TOP_LCD 2 20_US ; - \ CODE LCD_WrC \ char -- Write Char BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1 JMP LCD_W ENDCODE - \ CODE LCD_WrF \ func -- Write Fonction BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0 JMP LCD_W ENDCODE - \ : LCD_Clear $01 LCD_WrF 100 20_us \ $01 LCD_WrF 80 20_us ==> bad init ! ; - \ : LCD_Home $02 LCD_WrF 100 20_us ; - \ [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] - \ + : LCD_Entry_set $04 OR LCD_WrF ; - \ + : LCD_DSP_Ctrl $08 OR LCD_WrF ; - \ + : LCD_DSP_Shift $10 OR LCD_WrF ; - \ + : LCD_Fn_Set $20 OR LCD_WrF ; - \ + : LCD_CGRAM_Set $40 OR LCD_WrF ; - \ + : LCD_Goto $80 OR LCD_WrF ; - \ + CODE LCD_R \ -- byte read byte from LCD BIC.B #LCD_DB,&LCD_DB_DIR \ LCD_Data as intput BIS.B #LCD_RW,&LCD_CMD_OUT \ lcd_rw=1 @@ -244,19 +236,16 @@ HI2LO \ switch from FORTH to assembler MOV @RSP+,IP \ restore IP saved by COLON MOV @IP+,PC \ ENDCODE - \ CODE LCD_RdS \ -- status Read Status BIC.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=0 JMP LCD_R ENDCODE - \ CODE LCD_RdC \ -- char Read Char BIS.B #LCD_RS,&LCD_CMD_OUT \ lcd_rs=1 JMP LCD_R ENDCODE - \ \ ******************************\ @@ -284,7 +273,6 @@ BW3 \ from end of RC5_INT BIC #$78,0(RSP) \ 4 SCG0,OSCOFF,CPUOFF and GIE are OFF in retiSR to force LPM0_LOOP despite pending interrupt RETI \ 5 ENDASM - \ \ ******************************\ ASM RC5_INT \ wake up on Px.RC5 change interrupt @@ -299,9 +287,15 @@ ASM RC5_INT \ wake up on Px.RC5 change interrupt \ ******************************\ \ RC5_FirstStartBitHalfCycle: \ \ ******************************\ division in RC5_TIM_CTL (SMCLK/1|SMCLK/1|SMCLK/2|SMCLK/4|SMCLK/8) -\ MOV #0,&RC5_TIM_EX0 \ predivide by 1 in RC5_TIM_EX0 register ( 125kHz| 1MHz | 2MHZ | 4MHZ | 8MHZ ), reset value - MOV #1,&RC5_TIM_EX0 \ predivide by 2 in RC5_TIM_EX0 register ( 250kHZ| 2MHz | 4MHZ | 8MHZ | 16MHZ ) -\ MOV #2,&RC5_TIM_EX0 \ predivide by 3 in RC5_TIM_EX0 register ( 375kHz| 3MHz | 6MHZ | 12MHZ | 24MHZ ) +\ FREQ_KHZ @ 8000 = [IF] \ 8 MHz ? +\ MOV #0,&RC5_TIM_EX0 \ predivide by 1 in RC5_TIM_EX0 register ( 125kHz| 1MHz | 2MHZ | 4MHZ | 8MHZ ), reset value +\ [THEN] +FREQ_KHZ @ 16000 = [IF] \ 16 MHz ? + MOV #1,&RC5_TIM_EX0 \ predivide by 2 in RC5_TIM_EX0 register ( 250kHZ| 2MHz | 4MHZ | 8MHZ | 16MHZ ) +[THEN] +FREQ_KHZ @ 24000 = [IF] \ 24 MHz ? + MOV #2,&RC5_TIM_EX0 \ predivide by 3 in RC5_TIM_EX0 register ( 375kHz| 3MHz | 6MHZ | 12MHZ | 24MHZ ) +[THEN] \ MOV #3,&RC5_TIM_EX0 \ predivide by 4 in RC5_TIM_EX0 register ( 500kHZ| 4MHz | 8MHZ | 16MHZ ) \ MOV #4,&RC5_TIM_EX0 \ predivide by 6 in RC5_TIM_EX0 register ( 625kHz| 5MHz | 10MHZ | 20MHZ ) \ MOV #5,&RC5_TIM_EX0 \ predivide by 6 in RC5_TIM_EX0 register ( 750kHz| 6MHz | 12MHZ | 24MHZ ) @@ -394,20 +388,23 @@ MOV @PSP+,TOS \ GOTO BW3 \ ******************************\ ENDASM - \ \ ------------------------------\ -ASM BACKGROUND \ +ASM BACKGROUND \ \ ------------------------------\ \ ... \ insert here your background task \ ... \ \ ... \ -MOV #SLEEP,X \ 2 Must be the last statement of BACKGROUND -ADD #4,X \ 1 X = BODY of SLEEP -MOV X,PC \ 3 +BIS #LPM_MODE,SR \ ENDASM \ -\ ------------------------------\ - \ +\ ******************************\ +\ here start all interrupts \ +\ ******************************\ +\ here return all interrupts \ +\ ******************************\ +CODENNM \ +JMP BACKGROUND \ +ENDCODE DROP \ CODE START \ \ ------------------------------\ @@ -549,26 +546,44 @@ LO2HI \ no need to push IP because (WARM) resets the R LIT RECURSE IS WARM \ replace WARM by this START routine ABORT \ and continue with the next word after WARM... ; \ ...until interpreter falls in sleep mode within ACCEPT. - \ CODE STOP \ stops multitasking, must to be used before downloading app \ restore default action of primary DEFERred word SLEEP, assembly version MOV #SLEEP,X \ the ASM word SLEEP is only visible in mode assembler. ADD #4,X \ X = BODY of SLEEP MOV X,-2(X) \ restore the default background - COLON \ restore default action of primary DEFERred word WARM, FORTH version ['] WARM >BODY IS WARM \ remove START app from FORTH init process - COLD \ because we want to reset CPU and interrupt vectors ; - \ ECHO ; downloading RC5toLCD.4th is done RST_HERE ; this app is protected against - \ + [THEN] \ ASM - \ + + +: BS 8 EMIT ; \ 8 EMIT = BackSpace EMIT +: ESC #27 EMIT ; +: specs \ to see Fast Forth specifications +PWR_STATE \ remove specs definition when running, and before bytes free processing +6 0 DO BS LOOP \ to reach start of line +ESC ." [7m" \ set reverse video +." FastForth " +INI_THREAD @ U. BS ." Threads " \ vocabularies threads +." DeviceID=$" +$10 BASE ! $1A04 @ U. #10 BASE ! +FREQ_KHZ @ 0 1000 UM/MOD U. BS +?DUP +IF ." ," U. BS \ if remainder +THEN ." MHz " \ MCLK +FRAM_FULL HERE - U. ." bytes free" +ESC ." [0m" \ clear reverse video +; + +specs \ here FastForth type a (volatile) message with some informations + + START diff --git a/config/gema/CHIPSTICK_FR2433.pat b/config/gema/CHIPSTICK_FR2433.pat index 4551c99..e6396ec 100644 --- a/config/gema/CHIPSTICK_FR2433.pat +++ b/config/gema/CHIPSTICK_FR2433.pat @@ -18,15 +18,15 @@ ! You should have received a copy of the GNU General Public License ! along with this program. If not, see . ! +\.f=\.4th! to change file type ! +@define{@read{@mergepath{@inpath{};RemoveComments.pat;}}} ! ! ====================================================================== ! MSP430FR2433 Config ! ====================================================================== - @define{@read{@mergepath{@inpath{};MSP430FR2433.pat;}}} @define{@read{@mergepath{@inpath{};FastForthREGtoTI.pat;}}} -@define{@read{@mergepath{@inpath{};RemoveComments.pat;}}} ! --------------------------------------------------- ! CHIPSTICK_FR2433 <--> OUTPUT WORLD @@ -76,22 +76,27 @@ TERM_SEL=\$20C! TERM_IE=\$21A! TERM_IFG=\$21C! +TERM_CTLW0=\$500! \ eUSCI_A control word 0 +TERM_CTLW1=\$502! \ eUSCI_A control word 1 +TERM_BRW=\$506! +TERM_BR0=\$506! \ eUSCI_A baud rate 0 +TERM_BR1=\$507! \ eUSCI_A baud rate 1 +TERM_MCTLW=\$508! \ eUSCI_A modulation control +TERM_STATW=\$50A! \ eUSCI_A status +TERM_RXBUF=\$50C! \ eUSCI_A receive buffer +TERM_TXBUF=\$50E! \ eUSCI_A transmit buffer +TERM_ABCTL=\$510! \ eUSCI_A LIN control +TERM_IRTCTL=\$512! \ eUSCI_A IrDA transmit control +TERM_IRRCTL=\$513! \ eUSCI_A IrDA receive control +TERM_IE=\$51A! \ eUSCI_A interrupt enable +TERM_IFG=\$51C! \ eUSCI_A interrupt flags +TERM_IV=\$51E! \ eUSCI_A interrupt vector word + RTS=4! ; P3.2 CTS=1! ; P3.0 HANDSHAKIN=\$220! HANDSHAKOUT=\$222! -SD_CD=8! ; P2.3 as SD_CD -SD_CS=4! ; P2.2 as SD_CS -SD_CDIN=\$201! -SD_CSOUT=\$203! -SD_CSDIR=\$205! - -SD_SEL=\$20C! ; to configure UCB0 -SD_REN=\$206! ; to configure pullup resistors -SD_BUS=\$0E! ; pins P1.1 as UCB0CLK, P1.2 as UCB0SIMO & P1.3 as UCB0SOMI - - ! ============================================ ! APPLICATION I/O : ! ============================================ @@ -162,3 +167,14 @@ SSDA=\$40! P1.2 SSCL=\$80! P1.3 S_BUS=\$C0! + +SD_CD=8! ; P2.3 as SD_CD +SD_CS=4! ; P2.2 as SD_CS +SD_CDIN=\$201! +SD_CSOUT=\$203! +SD_CSDIR=\$205! + +SD_SEL=\$20C! ; to configure UCB0 +SD_REN=\$206! ; to configure pullup resistors +SD_BUS=\$0E! ; pins P1.1 as UCB0CLK, P1.2 as UCB0SIMO & P1.3 as UCB0SOMI + diff --git a/config/gema/MSP430FR5738.pat b/config/gema/MSP430FR5738.pat index adc757e..b53aad9 100644 --- a/config/gema/MSP430FR5738.pat +++ b/config/gema/MSP430FR5738.pat @@ -296,10 +296,10 @@ CURRENT=\$1DDA! CURRENT dictionnary ptr !BASE=\$1DDC! numeric base, must be defined before first reset ! LINE=\$1DDE! line in interpretation, activated with NOECHO, desactivated with ECHO -! --------------------------------------- -!1DE0! 14 RAM bytes free conditionnaly -! --------------------------------------- -!SAV_CURRENT=\$21E0! preserve CURRENT when create assembler words +! ----------------------------------------- +!1DE0! 14 RAM bytes free out of compilation +! ----------------------------------------- +!SAV_CURRENT=\$1DE0! preserve CURRENT when create assembler words !ASMBW1=\$1DE2 assembler backward reference 1 !ASMBW2=\$1DE4 assembler backward reference 2 !ASMBW3=\$1DE6 assembler backward reference 3 @@ -541,7 +541,7 @@ 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 +UCA0STATW=\$5CA! \ eUSCI_A status UCA0RXBUF=\$5CC! \ eUSCI_A receive buffer UCA0TXBUF=\$5CE! \ eUSCI_A transmit buffer UCA0ABCTL=\$5D0! \ eUSCI_A LIN control diff --git a/config/gema/MSP430FR5994.pat b/config/gema/MSP430FR5994.pat index 89a085b..11268a4 100644 --- a/config/gema/MSP430FR5994.pat +++ b/config/gema/MSP430FR5994.pat @@ -164,7 +164,6 @@ NOP=MOV \#0,R3! \ one word one cycle NOP2=\$3C00 ,! \ compile JMP 0 one word two cycles NOP3=MOV R0,R0! \ MOV PC,PC one word three cycles NEXT=MOV \@R13+,R0! \ MOV @IP+,PC -SEMI=MOV \@R1+,R13\nMOV \@R13+,R0! ! ================================================= @@ -758,7 +757,6 @@ 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! diff --git a/config/gema/MSP_EXP430FR2355.pat b/config/gema/MSP_EXP430FR2355.pat index 033290e..bc7c21b 100644 --- a/config/gema/MSP_EXP430FR2355.pat +++ b/config/gema/MSP_EXP430FR2355.pat @@ -16,15 +16,15 @@ ! You should have received a copy of the GNU General Public License ! along with this program. If not, see . ! +\.f=\.4th! to change file type ! +@define{@read{@mergepath{@inpath{};RemoveComments.pat;}}} ! ! ====================================================================== ! MSP430FR2355 Config ! ====================================================================== - @define{@read{@mergepath{@inpath{};MSP430FR2355.pat;}}} @define{@read{@mergepath{@inpath{};FastForthREGtoTI.pat;}}} -!@define{@read{@mergepath{@inpath{};RemoveComments.pat;}}} ! ====================================================================== ! INIT MSP-EXP430FR2355 board @@ -162,22 +162,27 @@ TERM_IE=\$23B! TERM_IFG=\$23D! TERM_Vec=\$FFE2! UCA1 +TERM_CTLW0=\$580! \ eUSCI_A1 control word 0 +TERM_CTLW1=\$582! \ eUSCI_A1 control word 1 +TERM_BRW=\$586! +TERM_BR0=\$586! \ eUSCI_A1 baud rate 0 +TERM_BR1=\$587! \ eUSCI_A1 baud rate 1 +TERM_MCTLW=\$588! \ eUSCI_A1 modulation control +TERM_STATW=\$58A! \ eUSCI_A1 status +TERM_RXBUF=\$58C! \ eUSCI_A1 receive buffer +TERM_TXBUF=\$58E! \ eUSCI_A1 transmit buffer +TERM_ABCTL=\$590! \ eUSCI_A1 LIN control +TERM_IRTCTL=\$592! \ eUSCI_A1 IrDA transmit control +TERM_IRRCTL=\$593! \ eUSCI_A1 IrDA receive control +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! -SD_CD=\$10! P4.4 as SD_CD -SD_CDIN=\$221! -SD_CS=\$20! P2.5 as SD_CS -SD_CSOUT=\$203! -SD_CSDIR=\$205! - -SD_SEL=\$22D! P4SEL0 to configure UCB1 -SD_REN=\$227! P4REN to configure pullup resistors -SD_BUS=\$7000! pins P4.5 as UCB1CLK, P4.6 as UCB1SIMO & P4.7 as UCB1SOMI - - ! ============================================ ! APPLICATION I/O : ! ============================================ @@ -296,3 +301,14 @@ SSDA=4! P1.2 SSCL=8! P1.3 S_BUS=\$0C! +SD_CD=\$10! P4.4 as SD_CD +SD_CDIN=\$221! +SD_CS=\$20! P2.5 as SD_CS +SD_CSOUT=\$203! +SD_CSDIR=\$205! + +SD_SEL=\$22D! P4SEL0 to configure UCB1 +SD_REN=\$227! P4REN to configure pullup resistors +SD_BUS=\$7000! pins P4.5 as UCB1CLK, P4.6 as UCB1SIMO & P4.7 as UCB1SOMI + + diff --git a/config/gema/MSP_EXP430FR2433.pat b/config/gema/MSP_EXP430FR2433.pat index 49fcbb9..28bd125 100644 --- a/config/gema/MSP_EXP430FR2433.pat +++ b/config/gema/MSP_EXP430FR2433.pat @@ -1,7 +1,8 @@ ! -*- coding: utf-8 -*- -! ChipStick_FR2433.pat +! MSP_EXP430FR2433.pat ! -! Fast Forth For M. Ken Boak "ChipStick" +! +! FastForth declarations for MSP-EXP430FR2433 launchpad ! ! Copyright (C) <2016> ! @@ -18,15 +19,15 @@ ! You should have received a copy of the GNU General Public License ! along with this program. If not, see . ! +\.f=\.4th! to change file type ! +@define{@read{@mergepath{@inpath{};RemoveComments.pat;}}} ! ! ====================================================================== ! MSP430FR2433 Config ! ====================================================================== - @define{@read{@mergepath{@inpath{};MSP430FR2433.pat;}}} @define{@read{@mergepath{@inpath{};FastForthREGtoTI.pat;}}} -!@define{@read{@mergepath{@inpath{};RemoveComments.pat;}}} ! ====================================================================== ! INIT MSP-EXP430FR2433 board @@ -114,22 +115,27 @@ TERM_SEL=\$20C! TERM_IE=\$21A! TERM_IFG=\$21C! +TERM_CTLW0=\$500! \ eUSCI_A control word 0 +TERM_CTLW1=\$502! \ eUSCI_A control word 1 +TERM_BRW=\$506! +TERM_BR0=\$506! \ eUSCI_A baud rate 0 +TERM_BR1=\$507! \ eUSCI_A baud rate 1 +TERM_MCTLW=\$508! \ eUSCI_A modulation control +TERM_STATW=\$50A! \ eUSCI_A status +TERM_RXBUF=\$50C! \ eUSCI_A receive buffer +TERM_TXBUF=\$50E! \ eUSCI_A transmit buffer +TERM_ABCTL=\$510! \ eUSCI_A LIN control +TERM_IRTCTL=\$512! \ eUSCI_A IrDA transmit control +TERM_IRRCTL=\$513! \ eUSCI_A IrDA receive control +TERM_IE=\$51A! \ eUSCI_A interrupt enable +TERM_IFG=\$51C! \ eUSCI_A interrupt flags +TERM_IV=\$51E! \ eUSCI_A interrupt vector word + RTS=1! ; P1.0 CTS=2! ; P1.1 HANDSHAKIN=\$200! HANDSHAKOUT=\$202! -SD_CD=2! ; P2.1 as SD_CD -SD_CS=1! ; P2.0 as SD_CS -SD_CDIN=\$201! -SD_CSOUT=\$203! -SD_CSDIR=\$205! - -SD_SEL=\$20D! ; P2SEL0 to configure UCB0 -SD_REN=\$207! ; P2REN to configure pullup resistors -SD_BUS=\$070! ; pins P2.4 as UCB0CLK, P2.6 as UCB0SIMO & P25 as UCB0SOMI - - ! ============================================ ! APPLICATION I/O : ! ============================================ @@ -209,3 +215,13 @@ SSDA=\$40! P1.2 SSCL=\$80! P1.3 S_BUS=\$C0! +SD_CD=2! ; P2.1 as SD_CD +SD_CS=1! ; P2.0 as SD_CS +SD_CDIN=\$201! +SD_CSOUT=\$203! +SD_CSDIR=\$205! + +SD_SEL=\$20D! ; P2SEL0 to configure UCB0 +SD_REN=\$207! ; P2REN to configure pullup resistors +SD_BUS=\$070! ; pins P2.4 as UCB0CLK, P2.6 as UCB0SIMO & P25 as UCB0SOMI + diff --git a/config/gema/MSP_EXP430FR4133.pat b/config/gema/MSP_EXP430FR4133.pat index d593eea..c1f3dc0 100644 --- a/config/gema/MSP_EXP430FR4133.pat +++ b/config/gema/MSP_EXP430FR4133.pat @@ -18,15 +18,15 @@ ! You should have received a copy of the GNU General Public License ! along with this program. If not, see . ! +\.f=\.4th! to change file type ! +@define{@read{@mergepath{@inpath{};RemoveComments.pat;}}} ! ! ====================================================================== ! MSP430FR4133 Config ! ====================================================================== - @define{@read{@mergepath{@inpath{};MSP430FR4133.pat;}}} @define{@read{@mergepath{@inpath{};FastForthREGtoTI.pat;}}} -@define{@read{@mergepath{@inpath{};RemoveComments.pat;}}} ! ====================================================================== ! MSP_EXP430FR4133 board @@ -198,23 +198,28 @@ TERM_SEL=\$20C! TERM_IE=\$21A! TERM_IFG=\$21C! +TERM_CTLW0=\$500! \ eUSCI_A control word 0 +TERM_CTLW1=\$502! \ eUSCI_A control word 1 +TERM_BRW=\$506! +TERM_BR0=\$506! \ eUSCI_A baud rate 0 +TERM_BR1=\$507! \ eUSCI_A baud rate 1 +TERM_MCTLW=\$508! \ eUSCI_A modulation control +TERM_STATW=\$50A! \ eUSCI_A status +TERM_RXBUF=\$50C! \ eUSCI_A receive buffer +TERM_TXBUF=\$50E! \ eUSCI_A transmit buffer +TERM_ABCTL=\$510! \ eUSCI_A LIN control +TERM_IRTCTL=\$512! \ eUSCI_A IrDA transmit control +TERM_IRRCTL=\$513! \ eUSCI_A IrDA receive control +TERM_IE=\$51A! \ eUSCI_A interrupt enable +TERM_IFG=\$51C! \ eUSCI_A interrupt flags +TERM_IV=\$51E! \ eUSCI_A interrupt vector word + RTS=8! ; P2.3 CTS=\$10! ; P2.4 HANDSHAKIN=\$201! HANDSHAKOUT=\$203! -SD_CS=2! ; P8.1 as SD_CS -SD_CD=1! ; P8.0 as SD_CD -SD_CDIN=\$261! -SD_CSOUT=\$263! -SD_CSDIR=\$265! - -SD_SEL1=\$24C! ; to configure UCB0 -SD_REN=\$246! ; to configure pullup resistors -SD_BUS=\$0E! ; pins P5.1 as UCB0CLK, P5.2 as UCB0SIMO & P5.3 as UCB0SOMI - - ! ============================================ ! APPLICATION I/O : ! ============================================ @@ -332,3 +337,14 @@ SSDA=\$04! P5.2 SDA hadware SLAVE SSCL=\$08! P5.3 SCL hadware SLAVE S_BUS=\$0C! + +SD_CS=2! ; P8.1 as SD_CS +SD_CD=1! ; P8.0 as SD_CD +SD_CDIN=\$261! +SD_CSOUT=\$263! +SD_CSDIR=\$265! + +SD_SEL1=\$24C! ; to configure UCB0 +SD_REN=\$246! ; to configure pullup resistors +SD_BUS=\$0E! ; pins P5.1 as UCB0CLK, P5.2 as UCB0SIMO & P5.3 as UCB0SOMI + diff --git a/config/gema/MSP_EXP430FR5739.pat b/config/gema/MSP_EXP430FR5739.pat index a71abb9..2a62533 100644 --- a/config/gema/MSP_EXP430FR5739.pat +++ b/config/gema/MSP_EXP430FR5739.pat @@ -19,15 +19,15 @@ ! along with this program. If not, see . ! ! +\.f=\.4th! to change file.f to file.4th +@define{@read{@mergepath{@inpath{};RemoveComments.pat;}}} ! ! ====================================================================== ! MSP430FR5739 Config ! ====================================================================== - @define{@read{@mergepath{@inpath{};MSP430FR5739.pat;}}} @define{@read{@mergepath{@inpath{};FastForthREGtoTI.pat;}}} -!@define{@read{@mergepath{@inpath{};RemoveComments.pat;}}} - +! ! ====================================================================== ! MSP_EXP430FR5739 board ! ====================================================================== @@ -164,22 +164,27 @@ TERM_SEL=\$20D! TERM_IE=\$21B! TERM_IFG=\$21D! +TERM_CTLW0=\$5C0! \ eUSCI_A control word 0 +TERM_CTLW1=\$5C2! \ eUSCI_A control word 1 +TERM_BRW=\$5C6! +TERM_BR0=\$5C6! \ eUSCI_A baud rate 0 +TERM_BR1=\$5C7! \ eUSCI_A baud rate 1 +TERM_MCTLW=\$5C8! \ eUSCI_A modulation control +TERM_STATW=\$5CA! \ eUSCI_A status +TERM_RXBUF=\$5CC! \ eUSCI_A receive buffer +TERM_TXBUF=\$5CE! \ eUSCI_A transmit buffer +TERM_ABCTL=\$5D0! \ eUSCI_A LIN control +TERM_IRTCTL=\$5D2! \ eUSCI_A IrDA transmit control +TERM_IRRCTL=\$5D3! \ eUSCI_A IrDA receive control +TERM_IE=\$5DA! \ eUSCI_A interrupt enable +TERM_IFG=\$5DC! \ eUSCI_A interrupt flags +TERM_IV=\$5DE! \ eUSCI_A interrupt vector word + RTS=4! CTS=8! HANDSHAKIN=\$201! HANDSHAKOUT=\$203! -SD_CD=4! P2.2 as SD_CD -SD_CS=8! P2.3 as SD_CS -SD_CDIN=\$201! -SD_CSOUT=\$203! -SD_CSDIR=\$205! - -SD_SEL=\$20D! to configure UCB0 -SD_REN=\$207! to configure pullup resistors -SD_BUS=\$70! pins P2.4 as UCB0CLK, P2.5 as UCB0SIMO & P2.6 as UCB0SOMI - - ! ============================================ ! APPLICATION I/O : ! ============================================ @@ -289,3 +294,14 @@ SSDA=\$40! P1.6 SSCL=\$80! P1.7 S_BUS=\$C0! +SD_CD=4! P2.2 as SD_CD +SD_CS=8! P2.3 as SD_CS +SD_CDIN=\$201! +SD_CSOUT=\$203! +SD_CSDIR=\$205! + +SD_SEL=\$20D! to configure UCB0 +SD_REN=\$207! to configure pullup resistors +SD_BUS=\$70! pins P2.4 as UCB0CLK, P2.5 as UCB0SIMO & P2.6 as UCB0SOMI + + diff --git a/config/gema/MSP_EXP430FR5969.pat b/config/gema/MSP_EXP430FR5969.pat index 9ea5cd8..478d2c6 100644 --- a/config/gema/MSP_EXP430FR5969.pat +++ b/config/gema/MSP_EXP430FR5969.pat @@ -18,15 +18,15 @@ ! You should have received a copy of the GNU General Public License ! along with this program. If not, see . ! +\.f=\.4th! to change file type ! +@define{@read{@mergepath{@inpath{};RemoveComments.pat;}}} ! ! ====================================================================== ! MSP430FR5969 Config ! ====================================================================== - @define{@read{@mergepath{@inpath{};MSP430FR5969.pat;}}} @define{@read{@mergepath{@inpath{};FastForthREGtoTI.pat;}}} -@define{@read{@mergepath{@inpath{};RemoveComments.pat;}}} ! ====================================================================== ! MSP_EXP430FR5969 board @@ -203,6 +203,22 @@ TERM_SEL=\$20D! TERM_IE=\$21B! TERM_IFG=\$21D! +TERM_CTLW0=\$5C0! \ eUSCI_A control word 0 +TERM_CTLW1=\$5C2! \ eUSCI_A control word 1 +TERM_BRW=\$5C6! +TERM_BR0=\$5C6! \ eUSCI_A baud rate 0 +TERM_BR1=\$5C7! \ eUSCI_A baud rate 1 +TERM_MCTLW=\$5C8! \ eUSCI_A modulation control +TERM_STAT=\$5CA! \ eUSCI_A status +TERM_RXBUF=\$5CC! \ eUSCI_A receive buffer +TERM_TXBUF=\$5CE! \ eUSCI_A transmit buffer +TERM_ABCTL=\$5D0! \ eUSCI_A LIN control +TERM_IRTCTL=\$5D2! \ eUSCI_A IrDA transmit control +TERM_IRRCTL=\$5D3! \ eUSCI_A IrDA receive control +TERM_IE=\$5DA! \ eUSCI_A interrupt enable +TERM_IFG=\$5DC! \ eUSCI_A interrupt flags +TERM_IV=\$5DE! \ eUSCI_A interrupt vector word + RTS=2! ; P4.1 CTS=1! ; P4.0 HANDSHAKIN=\$221! diff --git a/config/gema/MSP_EXP430FR5994.pat b/config/gema/MSP_EXP430FR5994.pat index 892a96f..7a05e52 100644 --- a/config/gema/MSP_EXP430FR5994.pat +++ b/config/gema/MSP_EXP430FR5994.pat @@ -18,15 +18,14 @@ ! You should have received a copy of the GNU General Public License ! along with this program. If not, see . ! -! +\.f=\.4th! to change file type +@define{@read{@mergepath{@inpath{};RemoveComments.pat;}}} ! ! ====================================================================== ! MSP430FR5994 Config ! ====================================================================== - @define{@read{@mergepath{@inpath{};MSP430FR5994.pat;}}} @define{@read{@mergepath{@inpath{};FastForthREGtoTI.pat;}}} -@define{@read{@mergepath{@inpath{};RemoveComments.pat;}}} ! ====================================================================== ! MSP_EXP430FR5994 board @@ -154,6 +153,22 @@ TERM_SEL=\$20D! TERM_IE=\$21B! TERM_IFG=\$21D! +TERM_CTLW0=\$5C0! \ eUSCI_A control word 0 +TERM_CTLW1=\$5C2! \ eUSCI_A control word 1 +TERM_BRW=\$5C6! +TERM_BR0=\$5C6! \ eUSCI_A baud rate 0 +TERM_BR1=\$5C7! \ eUSCI_A baud rate 1 +TERM_MCTLW=\$5C8! \ eUSCI_A modulation control +TERM_STATW=\$5CA! \ eUSCI_A status +TERM_RXBUF=\$5CC! \ eUSCI_A receive buffer +TERM_TXBUF=\$5CE! \ eUSCI_A transmit buffer +TERM_ABCTL=\$5D0! \ eUSCI_A LIN control +TERM_IRTCTL=\$5D2! \ eUSCI_A IrDA transmit control +TERM_IRRCTL=\$5D3! \ eUSCI_A IrDA receive control +TERM_IE=\$5DA! \ eUSCI_A interrupt enable +TERM_IFG=\$5DC! \ eUSCI_A interrupt flags +TERM_IV=\$5DE! \ eUSCI_A interrupt vector word + RTS=4! ; P4.2 CTS=2! ; P4.1 HANDSHAKIN=\$221! @@ -170,6 +185,27 @@ SD_SEL1=\$20C! ; word access, to configure UCB0 SD_REN=\$206! ; word access, to configure pullup resistors SD_BUS=\$04C0! ; pins P2.2 as UCB0CLK, P1.6 as UCB0SIMO & P1.7 as UCB0SOMI +SD_CTLW0=\$640! \ eUSCI_B control word 0 +SD_CTLW1=\$642! \ eUSCI_B control word 1 +SD_BRW=\$646! +SD_BR0=\$646! \ eUSCI_B bit rate 0 +SD_BR1=\$647! \ eUSCI_B bit rate 1 +SD_STATW=\$648! \ eUSCI_B status word +SD_NT0=\$649! \ eUSCI_B hardware count +SD_TBCNT=\$64A! \ eUSCI_B byte counter threshold +SD_RXBUF=\$64C! \ eUSCI_B receive buffer +SD_TXBUF=\$64E! \ eUSCI_B transmit buffer +SD_I2COA0=\$654! \ eUSCI_B I2C own address 0 +SD_I2COA1=\$656! \ eUSCI_B I2C own address 1 +SD_I2COA2=\$658! \ eUSCI_B I2C own address 2 +SD_I2COA3=\$65A! \ eUSCI_B I2C own address 3 +SD_ADDRX=\$65C! \ eUSCI_B received address +SD_ADDMASK=\$65E! \ eUSCI_B address mask +SD_I2CSA=\$660! \ eUSCI I2C slave address +SD_IE=\$66A! \ eUSCI interrupt enable +SD_IFG=\$66C! \ eUSCI interrupt flags +SD_IV=\$66E! \ eUSCI interrupt vector word + ! ============================================ ! APPLICATION I/O : diff --git a/config/gema/MSP_EXP430FR6989.pat b/config/gema/MSP_EXP430FR6989.pat index dd9bfec..b475824 100644 --- a/config/gema/MSP_EXP430FR6989.pat +++ b/config/gema/MSP_EXP430FR6989.pat @@ -18,15 +18,15 @@ ! You should have received a copy of the GNU General Public License ! along with this program. If not, see . ! +\.f=\.4th! to change file type ! +@define{@read{@mergepath{@inpath{};RemoveComments.pat;}}} ! ! ====================================================================== ! MSP430FR6989 Config ! ====================================================================== - @define{@read{@mergepath{@inpath{};MSP430FR6989.pat;}}} @define{@read{@mergepath{@inpath{};FastForthREGtoTI.pat;}}} -@define{@read{@mergepath{@inpath{};RemoveComments.pat;}}} ! ====================================================================== ! MSP_EXP430FR6989 board @@ -112,6 +112,22 @@ TERM_SEL=\$22C! TERM_IE=\$23A! TERM_IFG=\$23C! +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=2! ; P3.1 CTS=1! ; P3.0 HANDSHAKIN=\$220! diff --git a/config/gema/RemoveComments.pat b/config/gema/RemoveComments.pat index ae8d55b..fb0c455 100644 --- a/config/gema/RemoveComments.pat +++ b/config/gema/RemoveComments.pat @@ -1,7 +1,34 @@ - -! remove comments -\\*\n=! remove line beginning with \ -\s\\*\n=\n - -! remove some lines... -\n=\N +! -*- coding: utf-8 -*- +! RemoveComments.pat +! +! Fast Forth For Texas Instrument MSP_EXP430FR5739 +! +! 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 . +! +! +! +!======================== +! WINDOWS remove comments +!======================== +!\\*\n= +!\s\\*\n=\n +! +!======================== +! LINUX remove comments +!======================== +\\*\n= +\s\\*\n=\r\n +! diff --git a/config/msp430/.minirc.dfl b/config/msp430/.minirc.dfl new file mode 100644 index 0000000..e29d5b0 --- /dev/null +++ b/config/msp430/.minirc.dfl @@ -0,0 +1,21 @@ +# Fichier généré automatiquement - utilisez le menu de configuration de +# minicom pour changer les paramètres. +pu pname9 YUYNNascii +pu pprog9 /usr/bin/ascii-xfr -sv +pu port /dev/ttyUSB0 +pu baudrate 4000000 +pu updir /media/jeanmi/DATA/CloudStation/projets/msp430/MSP430-FORTH +pu rtscts No +pu xonxoff Yes +pu zauto I +pu mfcolor GREEN +pu mbcolor BLACK +pu tfcolor GREEN +pu sfcolor GREEN +pu macenab No +pu histlines 5000 +pu convcap No +pu askdndir Yes +pu addlinefeed No +pu linewrap Yes +pu addcarreturn Yes diff --git a/config/msp430/.profile b/config/msp430/.profile new file mode 100644 index 0000000..127d760 --- /dev/null +++ b/config/msp430/.profile @@ -0,0 +1,30 @@ +# ~/.profile: executed by the command interpreter for login shells. +# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login +# exists. +# see /usr/share/doc/bash/examples/startup-files for examples. +# the files are located in the bash-doc package. + +# the default umask is set in /etc/profile; for setting the umask +# for ssh logins, install and configure the libpam-umask package. +#umask 022 + +# if running bash +if [ -n "$BASH_VERSION" ]; then + # include .bashrc if it exists + if [ -f "$HOME/.bashrc" ]; then + . "$HOME/.bashrc" + fi +fi + +# set PATH so it includes user's private bin if it exists +if [ -d "$HOME/bin" ] ; then + PATH="$HOME/bin:$PATH" +fi + +# set PATH so it includes user's private bin if it exists +if [ -d "$HOME/.local/bin" ] ; then + PATH="$HOME/.local/bin:$PATH" +fi + +FF="/media/jeanmi/DATA/CloudStation" +export FF diff --git a/config/msp430/CopyTo_SD_Card b/config/msp430/CopyTo_SD_Card index b755004..4230508 100644 --- a/config/msp430/CopyTo_SD_Card +++ b/config/msp430/CopyTo_SD_Card @@ -25,7 +25,7 @@ IF /I "%3" == "" GOTO preprocessF exit :preprocessF -@%~d1\prog\gema\gema.exe -nobackup -line -t -f %~dpn2.pat %~dpn1.f %~dpn1.4th +@%~d1\prog\gema\gema.exe -nobackup -line -t '\n=\r\n;\r\n=\r\n' -f %~dpn2.pat %~dpn1.f %~dpn1.4th :DownloadF @taskkill /F /IM ttermpro.exe 1> NULL 2>&1 diff --git a/config/msp430/CopyTo_SD_Card.bat b/config/msp430/CopyTo_SD_Card.bat index f5c60ed..133ed72 100644 --- a/config/msp430/CopyTo_SD_Card.bat +++ b/config/msp430/CopyTo_SD_Card.bat @@ -18,19 +18,19 @@ 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) -IF "%~x1" == "" ( +IF "%~x1" == "" ( echo no file to be preprocessed! -goto badend +goto badend ) IF NOT EXIST %~dpn1.f ( echo %~dpn1.f not found! -goto badend +goto badend ) IF NOT EXIST %~d1\config\gema\%~n2.pat ( echo %~d1\config\gema\%~n2.pat not found! -goto badend +goto badend ) IF /I "%3" == "" GOTO preprocessF @@ -46,7 +46,7 @@ exit :preprocessF -@%~d1\prog\gema\gema.exe -nobackup -line -t -f %~d1\config\gema\%~n2.pat %~dpn1.f %~dpn1.4th +@%~d1\prog\gema\gema.exe -nobackup -line -t '\n=\r\n;\r\n=\r\n' -f %~d1\config\gema\%~n2.pat %~dpn1.f %~dpn1.4th :DownloadF @taskkill /F /IM ttermpro.exe 1> NUL 2>&1 @@ -80,7 +80,7 @@ shift /2 IF NOT EXIST %~dpn1.4th ( echo %~dpn1.4th not found! -goto badend +goto badend ) if /I "%2"=="" GOTO Download4th @@ -89,7 +89,7 @@ if /I "%2"=="NOECHO" GOTO Download4th if /I "%2"=="HALF" GOTO Download4th echo unexpected 2th parameter %2 ! -goto badend +goto badend :Download4th diff --git a/config/msp430/Preprocess b/config/msp430/Preprocess index 3e9e27b..68e92cf 100644 --- a/config/msp430/Preprocess +++ b/config/msp430/Preprocess @@ -1 +1,4 @@ -gema -nobackup -line -t -f $FF/config/gema/$2.pat $1.f $1.4th +gema -nobackup -line -t '\n=\r\n;\r\n=\r\n' -f $FF/config/gema/$2.pat $1.f LAST.4th + +cat LAST.4th | sed -i -e 's/\n/\r\n/g' LAST.4th > /dev/ttyUSB0 + diff --git a/config/msp430/Preprocess.bat b/config/msp430/Preprocess.bat index 88b8b58..ac08045 100644 --- a/config/msp430/Preprocess.bat +++ b/config/msp430/Preprocess.bat @@ -31,7 +31,7 @@ exit :preprocess -%~d1\prog\gema\gema.exe -nobackup -line -t -f %~d1\config\gema\%~n2.pat %1 %~dp1\last.4th +%~d1\prog\gema\gema.exe -nobackup -line -t '\n=\r\n;\r\n=\r\n' -f %~d1\config\gema\%~n2.pat %1 %~dp1\last.4th exit :: %~dpn1.f is the symbolic source file diff --git a/config/msp430/SendFile.ttl b/config/msp430/SendFile.ttl index 3c69363..704ff4e 100644 --- a/config/msp430/SendFile.ttl +++ b/config/msp430/SendFile.ttl @@ -1,43 +1,42 @@ -connect param3 +;connect param3 +testlink +if result=0 connect param3 + sendln ' $0A BASE ! ECHO STOP' ; blanks are to pass LPMx wake up time... inputbox 'Send a File' 'Select File : ' param2 -strcompare param4 'ECHO' +strcompare param4 'NOECHO' if result = 0 then - sendln 'ECHO' ; echo from FastForth - setecho 0 ; no echo from Teraterm + send 'NOECHO' ; set no echo from FastForth + setecho 1 ; add echo from Teraterm... + sendln ; ...to send CR LF + setecho 0 ; suppr. echo from Teraterm showtt 0 - clearscreen 1 +; clearscreen 1 sendfile inputstr 0 showtt 1 + sendln 'ECHO' goto end endif -strcompare param4 'NOECHO' +strcompare param4 'HALF' if result = 0 then - sendln 'NOECHO' ; no echo from FastForth + sendln 'NOECHO' setecho 1 ; add echo from Teraterm -; setecho 0 ; don't add echo from Teraterm showtt 0 - clearscreen 1 +; clearscreen 1 sendfile inputstr 0 - setecho 0 + setecho 1 showtt 1 - goto end endif -strcompare param4 'HALF' -if result = 0 then - sendln 'NOECHO' -; setecho 0 ; don't add echo from Teraterm - setecho 1 +; default mode = ECHO + setecho 0 ; no echo from Teraterm showtt 0 - clearscreen 1 +; clearscreen 1 sendfile inputstr 0 - setecho 1 showtt 1 -endif :end end diff --git a/config/msp430/SendSource b/config/msp430/SendSource index 38e7b31..e8a9f7b 100644 --- a/config/msp430/SendSource +++ b/config/msp430/SendSource @@ -1,6 +1,5 @@ -gema -nobackup -line -t -f $FF/config/gema/$2.pat $1.f $1.4th - -mate-terminal -x minicom <$1.4th -#mate-terminal minicom --capturefile=$1.4th -#minicom -C $1.4th +gema -nobackup -line -t '\n=\r\n;\r\n=\r\n' -f $FF/config/gema/${2%%\/*}.pat $1.f LAST.4th +#cp LAST.4th /dev/ttyUSB0 +#sed -i -e 's/\n/\r\n/g' LAST.4th > /dev/ttyUSB0 +cp LAST.4th /dev/ttyUSB0 diff --git a/config/msp430/SendSource.bat b/config/msp430/SendSource.bat index ecefc84..bc028b8 100644 --- a/config/msp430/SendSource.bat +++ b/config/msp430/SendSource.bat @@ -18,19 +18,19 @@ 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) -IF "%~x1" == "" ( +IF "%~x1" == "" ( echo no file to be preprocessed! -goto badend +goto badend ) IF NOT EXIST %~dpn1.f ( echo %~dpn1.f not found! -goto badend +goto badend ) IF NOT EXIST %~d1\config\gema\%~n2.pat ( echo %~d1\config\gema\%~n2.pat not found! -goto badend +goto badend ) IF /I "%3" == "" GOTO preprocessF @@ -46,7 +46,7 @@ exit :preprocessF -@%~d1\prog\gema\gema.exe -nobackup -line -t -f %~d1\config\gema\%~n2.pat %~dpn1.f %~dpn1.4th +@%~d1\prog\gema\gema.exe -nobackup -line -t '\n=\r\n;\r\n=\r\n' -f %~d1\config\gema\%~n2.pat %~dpn1.f %~dpn1.4th :DownloadF @taskkill /F /IM ttermpro.exe 1> NUL 2>&1 @@ -80,7 +80,7 @@ shift /3 IF NOT EXIST %~dpn1.4th ( echo %~dpn1.4th not found! -goto badend +goto badend ) if /I "%2"=="" GOTO Download4th @@ -89,10 +89,11 @@ if /I "%2"=="NOECHO" GOTO Download4th if /I "%2"=="HALF" GOTO Download4th echo unexpected 2th parameter %2 ! -goto badend +goto badend :Download4th + @taskkill /F /IM ttermpro.exe 1> NUL 2>&1 :Win324th diff --git a/config/msp430/build b/config/msp430/build index a54220a..f9a2d4c 100644 --- a/config/msp430/build +++ b/config/msp430/build @@ -1,4 +1,4 @@ -asl -L $1 -o $2.p +asl -i $FF/projets/msp430 -L $1 -o $2.p p2hex $2.p -r 0000h-FFFFh srec_cat $2.hex -intel -output $2.txt -ti-text rm $2.p diff --git a/config/msp430/prog b/config/msp430/prog index 25f1b6f..a680ea4 100644 --- a/config/msp430/prog +++ b/config/msp430/prog @@ -1,33 +1,23 @@ #!/bin/bash device=$1 if [ ${device:0:16} == "MSP_EXP430FR5739" ]; then - device=MSP430FR5739 -elif [ ${device:0:16} == "MSP_EXP430FR5969" ]; then + device=MSP430FR5739 +elif [ ${device:0:16} == "MSP_EXP430FR5969" ]; then device=MSP430FR5969 -elif [ ${device:0:16} == "MSP_EXP430FR5994" ]; then +elif [ ${device:0:16} == "MSP_EXP430FR5994" ]; then device=MSP430FR5994 -elif [ ${device:0:16} == "MSP_EXP430FR6989" ]; then +elif [ ${device:0:16} == "MSP_EXP430FR6989" ]; then device=MSP430FR6989 -elif [ ${device:0:16} == "MSP_EXP430FR4133" ]; then +elif [ ${device:0:16} == "MSP_EXP430FR4133" ]; then device=MSP430FR4133 -elif [ ${device:0:16} == "CHIPSTICK_FR2433" ]; then +elif [ ${device:0:16} == "CHIPSTICK_FR2433" ]; then device=MSP430FR2433 -elif [ ${device:0:15} == "MY_MSP430FR5738" ]; then - device=MSP430FR5738 -elif [ ${device:0:15} == "MY_MSP430FR5948" ]; then - device=MSP430FR5948 -elif [c${device:0:7} == "JMJ_BOX" ]; then - device=MSP430FR5738 +elif [ ${device:0:16} == "MSP_EXP430FR2433" ]; then + device=MSP430FR2433 +elif [ ${device:0:16} == "MSP_EXP430FR2355" ]; then + device=MSP430FR2355 fi -echo $device - +echo $device -$HOME/MSP430Flasher/MSP430Flasher -s -m SBW2 -n $device -v -w $1.txt -z [RESET,VCC] MSP430Flasher -s -m SBW2 -n $device -v -w $1.txt -z [RESET,VCC] -#mspdebug ezfet prog $1.txt -#mspdebug --allow-fw-update tilib - -#mspdebug tilib prog $device $1.txt -#mspdebug --fet-list tilib -#mspdebug --fet-list ezfet diff --git a/config/scite/AS_MSP430/forth.properties b/config/scite/AS_MSP430/forth.properties index 0a8958a..0aeee95 100644 --- a/config/scite/AS_MSP430/forth.properties +++ b/config/scite/AS_MSP430/forth.properties @@ -121,7 +121,7 @@ style.forth.11=fore:#0077FF,$(font.base) #command.compile.*.f=spf.cmd $(FileNameExt) if PLAT_WIN - command.name.0.*.f=preprocess file.f with 1:[target].pat then download file.4TH without ECHO + command.name.0.*.f=preprocess file.f with 1:[target].pat then download file.4TH command.0.*.f=*\config\msp430\SendSource.bat $(FileDir)\$(FileName).f $(1) NOECHO command.name.1.*.f=preprocess file.f with 1:[target].pat then download file.4TH with ECHO @@ -137,7 +137,7 @@ if PLAT_WIN command.4.*.f=*\config\msp430\Preprocess.bat $(FileDir)\$(FileName).f $(1) command.name.5.*.f=preprocess file.f with for target CurrentSelection then download - command.5.*.f=\config\msp430\SendSource.bat $(FileDir)\$(FileName).f $(CurrentSelection) + command.5.*.f=\config\msp430\SendSource.bat $(FileDir)\$(FileName).f $(CurrentSelection) NOECHO command.name.6.*.f=preprocess file.f with for target CurrentSelection then download with ECHO command.6.*.f=\config\msp430\SendSource.bat $(FileDir)\$(FileName).f $(CurrentSelection) ECHO @@ -157,7 +157,7 @@ if PLAT_WIN command.name.11.*.f=convert TI registers to FORTH's ones command.11.*.f=\prog\gema\gema -line -t -f \config\gema\TiREGtoFastForth.pat $(FileNameExt) $(FileNameExt) - command.name.0.*.4th=send file.4th to target without ECHO + command.name.0.*.4th=send file.4th to target command.0.*.4th=\config\msp430\SendSource.bat $(FileDir)\$(FileName).4TH NOECHO command.name.1.*.4th=send file.4th to target with ECHO @@ -178,54 +178,71 @@ if PLAT_WIN if PLAT_GTK # variable $FF = /media/jeanmi/DATA/CloudStation is defined in my ~.profile command.name.0.*.f=preprocess file.f with 1:[target].pat then download file.4th without ECHO - command.0.*.f=*$FF/config/msp430/SendSource $(FileDir)/$(FileName) $(1) NOECHO + command.0.*.f=*/media/jeanmi/DATA/CloudStation/config/msp430/SendSource $(FileDir)/$(FileName) $(1) NOECHO + #command.0.*.f=*$FF/config/msp430/SendSource $(FileDir)/$(FileName) $(1) NOECHO command.name.1.*.f=preprocess file.f with 1:[target].pat then download file.4th with ECHO - command.1.*.f=*$FF/config/msp430/SendSource $(FileDir)/$(FileName) $(1) ECHO + command.1.*.f=*/media/jeanmi/DATA/CloudStation/config/msp430/SendSource $(FileDir)/$(FileName) $(1) ECHO + #command.1.*.f=*$FF/config/msp430/SendSource $(FileDir)/$(FileName) $(1) ECHO command.name.2.*.f=preprocess file.f with 1:[target].pat then download file.4th HALFDUPLEX - command.2.*.f=*$FF/config/msp430/SendSource $(FileDir)/$(FileName) $(1) HALF + command.2.*.f=*/media/jeanmi/DATA/CloudStation/config/msp430/SendSource $(FileDir)/$(FileName) $(1) HALF + #command.2.*.f=*/media/jeanmi/DATA/CloudStation/config/msp430/SendSource $(FileDir)/$(FileName) $(1) HALF command.name.3.*.f=preprocess file.f with 1:[target].pat then download file.4th to target SD_CARD - command.3.*.f=*$FF/config/msp430/CopyTo_SD_Card $(FileDir)/$(FileName) $(1) + command.3.*.f=*/media/jeanmi/DATA/CloudStation/config/msp430/CopyTo_SD_Card $(FileDir)/$(FileName) $(1) + #command.3.*.f=*$FF/config/msp430/CopyTo_SD_Card $(FileDir)/$(FileName) $(1) command.name.4.*.f=preprocess file.f with 1:[target].pat to LAST.4th (for debug) - command.4.*.f=*$FF/config/msp430/Preprocess $(FileDir)/$(FileName) $(1) + command.4.*.f=*/media/jeanmi/DATA/CloudStation/config/msp430/Preprocess $(FileDir)/$(FileName) $(1) + #command.4.*.f=*$FF/config/msp430/Preprocess $(FileDir)/$(FileName) $(1) command.name.5.*.f=preprocess file.f with for target CurrentSelection then download - command.5.*.f=$FF/config/msp430/SendSourceFileToTarget $(FileDir)/$(FileName) $(CurrentSelection) + command.5.*.f=/media/jeanmi/DATA/CloudStation/config/msp430/SendSource $(FileDir)/$(FileName) $(CurrentSelection) + #command.5.*.f=$FF/config/msp430/SendSource $(FileDir)/$(FileName) $(CurrentSelection) command.name.6.*.f=preprocess file.f with for target CurrentSelection then download with ECHO - command.6.*.f=$FF/config/msp430/SendSource $(FileDir)/$(FileName) $(CurrentSelection) ECHO + command.6.*.f=/media/jeanmi/DATA/CloudStation/config/msp430/SendSource $(FileDir)/$(FileName) $(CurrentSelection) ECHO + #command.6.*.f=$FF/config/msp430/SendSource $(FileDir)/$(FileName) $(CurrentSelection) ECHO command.name.7.*.f=preprocess file.f with for target CurrentSelection then download file.4th to target SD_CARD - command.7.*.f=$FF/config/msp430/CopyTo_SD_Card $(FileDir)/$(FileName).f $(CurrentSelection) + command.7.*.f=/media/jeanmi/DATA/CloudStation/config/msp430/CopyTo_SD_Card $(FileDir)/$(FileName).f $(CurrentSelection) + #command.7.*.f=$FF/config/msp430/CopyTo_SD_Card $(FileDir)/$(FileName).f $(CurrentSelection) command.name.8.*.f=preprocess file.f with for target CurrentSelection to LAST.4th (for debug) - command.8.*.f=$FF/config/msp430/Preprocess $(FileDir)/$(FileName) $(CurrentSelection) + command.8.*.f=/media/jeanmi/DATA/CloudStation/config/msp430/Preprocess $(FileDir)/$(FileName) $(CurrentSelection) + #command.8.*.f=$FF/config/msp430/Preprocess $(FileDir)/$(FileName) $(CurrentSelection) command.name.9.*.f=convert FORTH registers to TI's ones - command.9.*.f=gema -line -t -f $FF/config/gema/FastForthREGtoTI.pat $(FileNameExt) $(FileNameExt) + command.9.*.f=gema -line -t -f /media/jeanmi/DATA/CloudStation/config/gema/FastForthREGtoTI.pat $(FileNameExt) $(FileNameExt) + #command.9.*.f=gema -line -t -f $FF/config/gema/FastForthREGtoTI.pat $(FileNameExt) $(FileNameExt) command.name.10.*.f=convert TI registers to FORTH's ones - command.10.*.f=gema -line -t -f $FF/config/gema/tiREGtoFastForth.pat $(FileNameExt) $(FileNameExt) + command.10.*.f=gema -line -t -f /media/jeanmi/DATA/CloudStation/config/gema/tiREGtoFastForth.pat $(FileNameExt) $(FileNameExt) + #command.10.*.f=gema -line -t -f $FF/config/gema/tiREGtoFastForth.pat $(FileNameExt) $(FileNameExt) command.name.0.*.4th=send file.4th to target without ECHO - command.0.*.4th=$FF/config/msp430/SendSource $(FileDir)/$(FileName).4th NOECHO + command.0.*.4th=/media/jeanmi/DATA/CloudStation/config/msp430/SendSource $(FileDir)/$(FileName).4th NOECHO + #command.0.*.4th=$FF/config/msp430/SendSource $(FileDir)/$(FileName).4th NOECHO command.name.1.*.4th=send file.4th to target with ECHO - command.1.*.4th=$FF/config/msp430/SendSource $(FileDir)/$(FileName).4th ECHO + command.1.*.4th=/media/jeanmi/DATA/CloudStation/config/msp430/SendSource $(FileDir)/$(FileName).4th ECHO + #command.1.*.4th=$FF/config/msp430/SendSource $(FileDir)/$(FileName).4th ECHO command.name.2.*.4th=send file.4th to target with HALFDUPLEX - command.2.*.4th=$FF/config/msp430/SendSource $(FileDir)/$(FileName).4th HALF + command.2.*.4th=/media/jeanmi/DATA/CloudStation/config/msp430/SendSource $(FileDir)/$(FileName).4th HALF + #command.2.*.4th=$FF/config/msp430/SendSource $(FileDir)/$(FileName).4th HALF command.name.3.*.4th=send file.4th to target SD_CARD - command.3.*.4th=$FF/config/msp430/CopyTo_SD_Card $(FileDir)/$(FileName).4th + command.3.*.4th=$/media/jeanmi/DATA/CloudStation/config/msp430/CopyTo_SD_Card $(FileDir)/$(FileName).4th + #command.3.*.4th=$FF/config/msp430/CopyTo_SD_Card $(FileDir)/$(FileName).4th command.name.4.*.4th=convert TI registers to FORTH's ones - command.4.*.4th=gema -line -t -f $FF/config/gema/TiREGtoFastForth.pat $(FileNameExt) $(FileNameExt) + command.4.*.4th=gema -line -t -f /media/jeanmi/DATA/CloudStation/config/gema/TiREGtoFastForth.pat $(FileNameExt) $(FileNameExt) + #command.4.*.4th=gema -line -t -f $FF/config/gema/TiREGtoFastForth.pat $(FileNameExt) $(FileNameExt) command.name.5.*.4th=convert FORTH registers to TI's ones - command.5.*.4th=gema -line -t -f $FF/config/gema/FastForthREGtoTI.pat $(FileNameExt) $(FileNameExt) + command.5.*.4th=gema -line -t -f /media/jeanmi/DATA/CloudStation/config/gema/FastForthREGtoTI.pat $(FileNameExt) $(FileNameExt) + #command.5.*.4th=gema -line -t -f $FF/config/gema/FastForthREGtoTI.pat $(FileNameExt) $(FileNameExt) diff --git a/forthMSP430FR.asm b/forthMSP430FR.asm index ac87a9e..486b98f 100644 --- a/forthMSP430FR.asm +++ b/forthMSP430FR.asm @@ -48,8 +48,8 @@ VER .equ "V206" ;MSP_EXP430FR5969 ; compile for MSP-EXP430FR5969 launchpad ; 26 + 3950 bytes ;MSP_EXP430FR5994 ; compile for MSP-EXP430FR5994 launchpad ; 26 + 3968 bytes ;MSP_EXP430FR6989 ; compile for MSP-EXP430FR6989 launchpad ; 26 + 3978 bytes -MSP_EXP430FR4133 ;; compile for MSP-EXP430FR4133 launchpad ; 26 + 4012 bytes -;MSP_EXP430FR2355 ; compile for MSP-EXP430FR2355 launchpad ; 26 + 3944 bytes +;MSP_EXP430FR4133 ; compile for MSP-EXP430FR4133 launchpad ; 26 + 4012 bytes +MSP_EXP430FR2355 ;; compile for MSP-EXP430FR2355 launchpad ; 26 + 3944 bytes ;MSP_EXP430FR2433 ; compile for MSP-EXP430FR2433 launchpad ; 26 + 3930 bytes ;CHIPSTICK_FR2433 ; compile for the "CHIPSTICK" of M. Ken BOAK ; 26 + 3922 bytes @@ -62,7 +62,7 @@ THREADS .equ 16 ; 1, 2 , 4 , 8 , 16, 32 search entries in dictionnary ; +0, +28, +40, +56, +90, +154 bytes, usefull to speed compilation; ; choose 16 -FREQUENCY .equ 16 ; fully tested at 0.25,0.5,1,2,4,8,16 (and 24 for MSP430FR57xx) MHz +FREQUENCY .equ 24 ; fully tested at 0.25,0.5,1,2,4,8,16 (and 24 for MSP430FR57xx) MHz ;------------------------------------------------------------------------------- ; KERNEL ADD-ON SWITCHES @@ -70,7 +70,7 @@ FREQUENCY .equ 16 ; fully tested at 0.25,0.5,1,2,4,8,16 (and 24 for MSP430FR5 MSP430ASSEMBLER ;; + 1814 bytes : adds embedded assembler with TI syntax; without, you can do all but all much more slowly... CONDCOMP ;; + 324 bytes : adds conditionnal compilation : MARKER [UNDEFINED] [DEFINED] [IF] [ELSE] [THEN] COMPARE FIXPOINT_INPUT ;; + 78 bytes : adds the interpretation input for S15.16 numbers, mandatory for FIXPOINT -LOWERCASE ;; + 46 bytes : enables to write strings in lowercase. +LOWERCASE ;; + 46 bytes : enables to write strings in lowercase (whose VT100 set_up sequences...) VOCABULARY_SET ;; + 104 bytes : adds words: VOCABULARY FORTH ASSEMBLER ALSO PREVIOUS ONLY DEFINITIONS (FORTH83) ;SD_CARD_LOADER ; + 1748 bytes : to LOAD source files from SD_card ;SD_CARD_READ_WRITE ; + 1192 bytes : to read, create, write and del files + source files direct copy from PC to SD_Card @@ -84,7 +84,7 @@ NONAME ;; + 64 bytes : adds :NONAME CODENNM (CODENoNaMe) ; Tip: when added here, ADD-ONs become protected against WIPE and Deep Reset... | ;------------------------------------------------------------------------------- v ;UARTtoI2C ; to redirect source file to a I2C TERMINAL FastForth device UART2IIC.f -;FIXPOINT ; + 422/532 bytes (MPY/noMPY): add HOLDS F+ F- F/ F* F#S F. S>F 2@ 2CONSTANT FIXPOINT.f +;FIXPOINT ; + 422/528 bytes (MPY/noMPY): add HOLDS F+ F- F/ F* F#S F. S>F 2@ 2CONSTANT 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 ;ANS_CORE_COMPLIANT ; + 876 bytes : required to pass coretest.4th ; (includes items below) ANS_COMP.f @@ -98,7 +98,7 @@ UTILITY ;; + 434/524 bytes (1/16threads) : add .S .RS WORDS U.R DUM ; FAST FORTH TERMINAL configuration ;------------------------------------------------------------------------------- -TERMINALBAUDRATE .equ 115200 ; choose value considering the frequency and the UART2USB bridge, see explanations below. +TERMINALBAUDRATE .equ 6000000 ; choose value considering the frequency and the UART2USB bridge, see explanations below. .include "TERMINALBAUDRATE.inc" ;HALFDUPLEX ; to use FAST FORTH with half duplex terminal @@ -1063,35 +1063,35 @@ FSTATE mDOCON ; ANS complement OPTION ;------------------------------------------------------------------------------- .IFDEF ANS_CORE_COMPLIANT - .include "ADDON\ANS_COMPLEMENT.asm" + .include "ADDON/ANS_COMPLEMENT.asm" .ELSEIF ;------------------------------------------------------------------------------- ; ALIGNMENT OPERATORS OPTION ;------------------------------------------------------------------------------- .IFDEF ALIGNMENT ; included in ANS_COMPLEMENT - .include "ADDON\ALIGNMENT.asm" + .include "ADDON/ALIGNMENT.asm" .ENDIF ; ALIGNMENT ;------------------------------------------------------------------------------- ; PORTABILITY OPERATORS OPTION ;------------------------------------------------------------------------------- .IFDEF PORTABILITY - .include "ADDON\PORTABILITY.asm" + .include "ADDON/PORTABILITY.asm" .ENDIF ; PORTABILITY ;------------------------------------------------------------------------------- ; DOUBLE OPERATORS OPTION ;------------------------------------------------------------------------------- .IFDEF DOUBLE ; included in ANS_COMPLEMENT - .include "ADDON\DOUBLE.asm" + .include "ADDON/DOUBLE.asm" .ENDIF ; DOUBLE ;------------------------------------------------------------------------------- ; ARITHMETIC OPERATORS OPTION ;------------------------------------------------------------------------------- .IFDEF ARITHMETIC ; included in ANS_COMPLEMENT - .include "ADDON\ARITHMETIC.asm" + .include "/ADDON/ARITHMETIC.asm" .ENDIF ; ARITHMETIC .ENDIF ; ANS_COMPLEMENT @@ -1269,13 +1269,13 @@ CCOMMA MOV &DDP,W ; TERMINAL I/O, input part ; ------------------------------------------------------------------------------ - ;https://forth-standard.org/standard/core/KEY ;C KEY -- c wait character from input device ; primary DEFERred word FORTHWORD "KEY" -KEY MOV @PC+,PC - .word BODYKEY -BODYKEY MOV &TERMRXBUF,Y ; empty buffer +KEY MOV @PC+,PC ;3 Code Field Address (CFA) of KEY +PFAKEY .word BODYKEY ; Parameter Field Address (PFA) of KEY +BODYKEY ; BODY of KEY = default execution of KEY + MOV &TERMRXBUF,Y ; empty buffer SUB #2,PSP ; 1 push old TOS.. MOV TOS,0(PSP) ; 4 ..onto stack CALL #RXON @@ -1291,47 +1291,47 @@ KEYLOOP BIT #UCRXIFG,&TERMIFG ; loop if bit0 = 0 in interupt flag register .IFDEF SD_CARD_LOADER .include "forthMSP430FR_SD_ACCEPT.asm" -DEFER_INPUT ; CIB (Current Input Buffer) and ACCEPT must to be redirected for SD_LOAD usage +DEFER_ACCEPT ; CIB (Current Input Buffer) and ACCEPT must to be redirected for SD_LOAD usage .ENDIF - .IFDEF DEFER_INPUT - -; CIB -- addr of Current Input Buffer - FORTHWORD "CIB" -FCIB mDOCON - .WORD TIB_ORG ; constant, may be redirected as SDIB_ORG by OPEN. + .IFNDEF DEFER_ACCEPT -; : REFILL CIB DUP TIB_LEN ACCEPT ; -- CIB CIB len shared by QUIT and [ELSE] +; : REFILL TIB DUP TIB_LEN ACCEPT ; -- TIB TIB len shared by QUIT and [ELSE] REFILL SUB #6,PSP ;2 MOV TOS,4(PSP) ;3 MOV #TIB_LEN,TOS ;2 - MOV &FCIB+2,0(PSP) ;5 + MOV #TIB_ORG,0(PSP) ;4 MOV @PSP,2(PSP) ;4 JMP ACCEPT ;2 ;https://forth-standard.org/standard/core/ACCEPT ;C ACCEPT addr addr len -- addr len' get line at addr to interpret len' chars FORTHWORD "ACCEPT" -ACCEPT MOV @PC+,PC ;3 - .word BODYACCEPT -BODYACCEPT +ACCEPT .ELSE -; : REFILL TIB DUP TIB_LEN ACCEPT ; -- TIB TIB len shared by QUIT and [ELSE] +; CIB -- addr of Current Input Buffer + FORTHWORD "CIB" ; constant, may be redirected as SDIB_ORG by OPEN. +FCIB mDOCON ; Code Field Address (CFA) of FCIB +PFACIB .WORD TIB_ORG ; Parameter Field Address (PFA) of FCIB + +; : REFILL CIB DUP TIB_LEN ACCEPT ; -- CIB CIB len shared by QUIT and [ELSE] REFILL SUB #6,PSP ;2 MOV TOS,4(PSP) ;3 MOV #TIB_LEN,TOS ;2 - MOV #TIB_ORG,0(PSP) ;4 + MOV &PFACIB,0(PSP) ;5 MOV @PSP,2(PSP) ;4 JMP ACCEPT ;2 ;https://forth-standard.org/standard/core/ACCEPT ;C ACCEPT addr addr len -- addr len' get line at addr to interpret len' chars FORTHWORD "ACCEPT" -ACCEPT +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 - .ENDIF ; DEFER_INPUT + .ENDIF ; DEFER_ACCEPT .IFDEF HALFDUPLEX ; to use FAST FORTH with half duplex input terminal (bluetooth or wifi connexion) @@ -1345,7 +1345,7 @@ ACCEPT ; 3- the time between sending XON/RTS_low and clearing UCRXIFG on first received char, ; everything must be done to reduce these times, taking into account the necessity of switching to SLEEP (LPMx mode). ; ----------------------------------; -; (ACCEPT) I prepare TERMINAL_INT ; +; ACCEPT part I prepare TERMINAL_INT; ; ----------------------------------; .IFDEF TOTAL PUSHM #4,R7 ;6 push R7,R6,R5,R4 @@ -1401,10 +1401,11 @@ RXOFF ; ; ----------------------------------; - ASMWORD "SLEEP" ; may be redirected -SLEEP MOV @PC+,PC ;3 - .word BODYSLEEP ; -BODYSLEEP BIS &LPM_MODE,SR ;3 enter in LPMx sleep mode with GIE=1 + ASMWORD "SLEEP" ; may be redirected +SLEEP MOV @PC+,PC ;3 Code Field Address (CFA) of SLEEP +PFASLEEP .word BODYSLEEP ; Parameter Field Address (PFA) of SLEEP +BODYSLEEP ; BODY of SLEEP = default execution of SLEEP + BIS &LPM_MODE,SR ;3 enter in LPMx sleep mode with GIE=1 ; ----------------------------------; default FAST FORTH mode (for its input terminal use) : LPM0. ;############################################################################################################### @@ -1520,15 +1521,15 @@ ACCEPTEND SUB @PSP+,TOS ; Org Ptr -- len' ;https://forth-standard.org/standard/core/EMIT ;C EMIT c -- output character to the output device ; primary DEFERred word FORTHWORD "EMIT" -EMIT MOV @PC+,PC ;3 15~ - .word BODYEMIT -BODYEMIT MOV TOS,Y ; 1 +EMIT MOV @PC+,PC ;3 Code Field Address (CFA) of EMIT +PFAEMIT .word BODYEMIT ; Parameter Field Address (PFA) of EMIT +BODYEMIT ; BODY of EMIT = default execution of EMIT + MOV TOS,Y ; 1 MOV @PSP+,TOS ; 2 JMP YEMIT1 ;9 12~ .ENDIF ; HALFDUPLEX - ;Z ECHO -- connect console output (default) FORTHWORD "ECHO" ECHO MOV #4882h,&YEMIT ; 4882h = MOV Y,& @@ -1589,9 +1590,10 @@ TWODROP ADD #2,PSP ; ;https://forth-standard.org/standard/core/CR ;C CR -- send CR to the output device FORTHWORD "CR" -CR MOV @PC+,PC - .word BODYCR -BODYCR mDOCOL +CR MOV @PC+,PC ;3 Code Field Address (CFA) of CR +PFACR .word BODYCR ; Parameter Field Address (PFA) of CR +BODYCR ; BODY of CR = default execution of CR + mDOCOL .word XSQUOTE .byte 2,13,10 .word TYPE,EXIT @@ -1709,7 +1711,6 @@ EOL_END MOV &DDP,TOS ;3 -- c-addr MOV.B Y,0(TOS) ;3 mNEXT ;4 -- c-addr 40 words Z=1 <==> lenght=0 <==> EOL - ;https://forth-standard.org/standard/core/FIND ;C FIND c-addr -- c-addr 0 if not found ; flag Z=1 ;C xt -1 if found ; flag Z=0 @@ -1802,7 +1803,6 @@ TONUMEND MOV S,0(PSP) ;3 -- ud1lo ud1hi adr2 count2 MOV X,4(PSP) ;3 -- ud2lo ud2hi adr2 count2 mNEXT ;4 41 words - ; ?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 ; 32 bits numbers (with decimal point) and fixed point signed numbers (with a comma) are recognized. @@ -2228,9 +2228,9 @@ BOOT ASMtoFORTH ; ;https://forth-standard.org/standard/core/QUIT ;c QUIT -- interpret line by line the input stream, primary DEFERred word FORTHWORD "QUIT" -QUIT MOV @PC+,PC - .word BODYQUIT ; this word may be replaced by BOOT -BODYQUIT +QUIT MOV @PC+,PC ;3 Code Field Address (CFA) of QUIT +PFAQUIT .word BODYQUIT ; Parameter Field Address (PFA) of QUIT +BODYQUIT ; BODY of QUIT = default execution of QUIT .ELSE ; if no BOOTLOADER, QUIT is not DEFERred @@ -2270,16 +2270,16 @@ ABORT MOV #PSTACK,PSP JMP QUIT WIP_DEFER ; WIPE resets ALL factory primary DEFERred words - MOV #BODYWARM,&WARM+2 ; ' WARM >BODY IS WARM default init - MOV #SLEEP+4,&SLEEP+2 ; MOV #SLEEP,X ADD #4,X MOV X,-2(X) default background task + MOV #BODYWARM,&PFAWARM ; ' WARM >BODY IS WARM default init + MOV #BODYSLEEP,&PFASLEEP ; MOV #SLEEP,X ADD #4,X MOV X,-2(X) default background task QAB_DEFER ; QABORT resets some primary DEFERred words - MOV #BODYEMIT,&EMIT+2 ;4 ' EMIT >BODY IS EMIT default console output - MOV #BODYCR,&CR+2 ;4 ' CR >BODY IS CR default CR - MOV #BODYKEY,&KEY+2 ;4 ' KEY >BODY IS KEY default KEY + 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_INPUT ; true if SD_LOADER - MOV #BODYACCEPT,&ACCEPT+2 ;4 ' ACCEPT >BODY IS ACCEPT - MOV #TIB_ORG,&FCIB+2 ;4 TIB_ORG TO CIB (Current Input Buffer) + .IFDEF DEFER_ACCEPT ; true if SD_LOADER + MOV #BODYACCEPT,&PFAACCEPT ;4 ' ACCEPT >BODY IS ACCEPT + MOV #TIB_ORG,&PFACIB ;4 TIB_ORG TO CIB (Current Input Buffer) .ENDIF .IFDEF MSP430ASSEMBLER ; reset all 6 branch labels MOV #10,Y @@ -2303,6 +2303,9 @@ THREEDROP ADD #4,PSP mNEXT QABORTYES MOV #4882h,&YEMIT ; restore default YEMIT = set ECHO +; ----------------------------------; +QABORT_SDCARD ; +; ----------------------------------; .IFDEF SD_CARD_LOADER ; close all handles MOV &CurrentHdl,T QABORTCLOSE CMP #0,T @@ -2315,13 +2318,14 @@ QABORTCLOSEND ; ----------------------------------; QABORTYESNOECHO ; <== WARM jumps here, thus, if NOECHO, TERMINAL can be disconnected without freezing the app ; ----------------------------------; - CALL #QAB_DEFER ; restore default part of primary DEFERred words ....except WARM and SLEEP. + CALL #QAB_DEFER ; ----------------------------------; QABORTTERM ; wait the end of source file downloading ; ----------------------------------; .IFDEF TERMINAL3WIRES ; BIT #UCTXIFG,&TERMIFG ; TX buffer empty ? JZ QABORTTERM ; no +; ----------------------------------; MOV #17,&TERMTXBUF ; yes move XON char into TX_buf .ENDIF ; .IFDEF TERMINAL4WIRES ; @@ -2335,22 +2339,23 @@ QABUSBLOOPI NOP ; 1~ <---+ | JNZ QABUSBLOOPI ; 2~ > 4~ loop -+ | SUB #1,Y ; 1~ | JNZ QABUSBLOOPJ ; 2~ --> 36~ loop --+ - BIT #UCRXIFG,&TERMIFG ; 4 new char in TERMXBUF after refill time out ? + BIT #UCRXIFG,&TERMIFG ; 4 new char in TERMRXBUF after refill time out ? JNZ QABORTLOOP ; 2 yes, the input stream (download source file) is still active ; ----------------------------------; -; Display WARM/ABORT message ; no, the input stream is quiet (end of download source file) +; Display ABORT message ; no, the input stream is quiet (end of download source file) ; ----------------------------------; mDOCOL ; .word XSQUOTE ; -- c-addr u c-addr1 u1 - .byte 4,27,"[7m" ; + .byte 4,27,"[7m" ; type ESC[7m .word TYPE ; -- c-addr u set reverse video ERRLINE .word lit,LINE,FETCH,QDUP; if LINE <> 0 .word QBRAN,ERRLINE_END + .word ECHO ; .word XSQUOTE ; displays the line where error occured .byte 5,"line:" ; .word TYPE ; - .word ONEMINUS,UDOT ; - .word ECHO ; + .word ONEMINUS ; + .word UDOT ; ERRLINE_END .word TYPE ; -- type abort message .word XSQUOTE ; -- c-addr2 u2 .byte 4,27,"[0m" ; @@ -2626,7 +2631,7 @@ DEFER CALL #HEADER ; that create a secondary DEFERred word (wh JMP REVEAL ;https://forth-standard.org/standard/core/toBODY -; >BODY -- PFA leave BODY of a CREATEd word or of a primary DEFERred word +; >BODY -- addr leave BODY of a CREATEd word or of a primary DEFERred word FORTHWORD ">BODY" ADD #4,TOS mNEXT @@ -2798,6 +2803,7 @@ MOVUP2 MOV.B @X,0(Y) ; if X=src < Y=dst copy W bytes up JNZ MOVUP1 MOVE_X mNEXT + ;------------------------------------------------------------------------------- ; WORDS SET for VOCABULARY, not ANS compliant ;------------------------------------------------------------------------------- @@ -2832,9 +2838,11 @@ VOCDOES .word LIT,CONTEXT,STORE .IFDEF VOCABULARY_SET FORTHWORD "FORTH" .ENDIF ; VOCABULARY_SET -FORTH mDODOES ; leave BODYFORTH on the stack and run VOCDOES - .word VOCDOES -BODYFORTH .word lastforthword +FORTH ; leave BODYFORTH on the stack and run VOCDOES + mDODOES ; Code Field Address (CFA) of FORTH +PFAFORTH .word VOCDOES ; Parameter Field Address (PFA) of FORTH +BODYFORTH ; BODY of FORTH + .word lastforthword .SWITCH THREADS .CASE 2 .word lastforthword1 @@ -3018,9 +3026,9 @@ SIGNLOOP SUB #2,X ;Z WARM -- ; deferred word used to init your application ; define this word: : START ...init app here... LIT RECURSE IS WARM (WARM) ; FORTHWORD "WARM" -WARM MOV @PC+,PC ;3 - .word BODYWARM -BODYWARM +WARM MOV @PC+,PC ;3 Code Field Address (CFA) of WARM +PFAWARM .word BODYWARM ; Parameter Field Address (PFA) of WARM +BODYWARM ; BODY of WARM (default execution of WARM) ; SUB #4,PSP ; MOV &SYSSNIV,0(PSP) ; MOV &SYSUNIV,2(PSP) @@ -3134,7 +3142,10 @@ COLD_END .ELSE FORTHtoASM .IF RAM_LEN < 2048 ; case of MSP430FR57xx : SD datas are in FRAM - MOV #0,&CurrentHDL ; init this FRAM area to pass QABORT + MOV #SD_LEN,X ; so are not initialised by COLD/RESET +ClearSDdata SUB #2,X ; + MOV #0,SD_ORG(X) ; + JNZ ClearSDdata ; .ENDIF BIT.B #SD_CD,&SD_CDIN ; SD_memory in SD_Card module ? JNZ WARM ; no diff --git a/forthMSP430FR_CONDCOMP.asm b/forthMSP430FR_CONDCOMP.asm index 39f6ca7..b6d20dd 100644 --- a/forthMSP430FR_CONDCOMP.asm +++ b/forthMSP430FR_CONDCOMP.asm @@ -1,9 +1,5 @@ - .IFNDEF LOWERCASE - .WARNING "uncomment LOWERCASE ADD-ON to pass coretest COMPARE !" - .ENDIF ; LOWERCASE - ;COMPARE ( c-addr1 u1 c-addr2 u2 -- n ) ;https://forth-standard.org/standard/string/COMPARE ;Compare the string specified by c-addr1 u1 to the string specified by c-addr2 u2. diff --git a/forthMSP430FR_SD_INIT.asm b/forthMSP430FR_SD_INIT.asm index 7bed4ed..b114f19 100644 --- a/forthMSP430FR_SD_INIT.asm +++ b/forthMSP430FR_SD_INIT.asm @@ -137,18 +137,6 @@ ; FirstSectorOfCluster(n) = OrgCluster + n*BPB_SecPerClus ==> cluster(6) = 30368 ; =========================================================== -; 0- Init FRAM SD datas, case of MSP430FR57xx -; =========================================================== - - .IF RAM_LEN < 2048 ; case of MSP430FR57xx : SD datas are in FRAM - MOV #SD_LEN_DATA,X ; so are not initialised by COLD/RESET -InitSDdata ; - SUB #2,X - MOV #0,SD_ORG_DATA(X) ; - JNZ InitSDdata ; - .ENDIF - -; =========================================================== ; 1- Init eUSCI dedicated to SD_Card SPI driver ; =========================================================== @@ -180,7 +168,7 @@ SEND_CMD0 ; CMD0 : GO_IDLE_STATE expected SPI_R1 respo JZ INIT_CMD8 ; if idle state SD_INIT_ERROR ; MOV #SD_CARD_ERROR,PC ; ReturnError = $04R1, case of defectuous card (or insufficient SD_POWER_ON clk) -; ----------------------------------; +; ----------------------------------; see forthMSP430FR_SD_lowLvl.asm INIT_CMD8 ; mandatory if SD_Card >= V2.x [11:8]supply voltage(VHS) ; ----------------------------------; CALL #SPI_GET ; (needed to pass SanDisk ultra 8GB "HC I") -- 2.11.0