OSDN Git Service

v 162, added Conditionnal Compilation and bootloader
[fast-forth/master.git] / MSP430-FORTH / COMPSMPY.f
diff --git a/MSP430-FORTH/COMPSMPY.f b/MSP430-FORTH/COMPSMPY.f
deleted file mode 100644 (file)
index 73fb878..0000000
+++ /dev/null
@@ -1,471 +0,0 @@
-; ----------------------------------------------------------------------------------
-; ANS complement for MSP430FR4xxx devices without hardware_MPY, to pass CORETEST.4th
-; ----------------------------------------------------------------------------------
-
-\ REGISTERS USAGE
-\ R4 to R7 must be saved before use and restored after
-\ scratch registers Y to S are free for use
-\ under interrupt, IP is free for use
-
-\ PUSHM order : PSP,TOS, IP,  S,  T,  W,  X,  Y, R7, R6, R5, R4
-\ example : PUSHM IP,Y
-\
-\ POPM  order :  R4, R5, R6, R7,  Y,  X,  W,  T,  S, IP,TOS,PSP
-\ example : POPM Y,IP
-
-\ ASSEMBLER conditionnal usage before 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 usage before IF UNTIL WHILE : 0= 0< = < > U<
-
-
-
-\ ECHO      ; if an error occurs, uncomment this line before new download to find it.
-    \
-
-CODE INVERT     \   x1 -- x2            bitwise inversion
-            XOR #-1,TOS
-            MOV @IP+,PC
-ENDCODE
-    \
-
-CODE LSHIFT     \   x1 u -- x2    logical L shift u places
-            MOV @PSP+,W
-            AND #$1F,TOS        \ no need to shift more than 16
-0<> IF
-    BEGIN   ADD W,W
-            SUB #1,TOS
-    0= UNTIL
-THEN        MOV W,TOS
-            MOV @IP+,PC
-ENDCODE
-    \
-
-CODE RSHIFT \   x1 u -- x2    logical R shift u places
-            MOV @PSP+,W
-            AND #$1F,TOS       \ no need to shift more than 16
-0<> IF
-    BEGIN   BIC #C,SR           \ Clr Carry
-            RRC W
-            SUB #1,TOS
-    0= UNTIL
-THEN        MOV W,TOS
-            MOV @IP+,PC
-ENDCODE
-    \
-
-CODE 1+     \    n1/u1 -- n2/u2       add 1 to TOS
-            ADD #1,TOS
-            MOV @IP+,PC
-ENDCODE
-    \
-
-CODE 1-     \ n1/u1 -- n2/u2     subtract 1 from TOS
-            SUB #1,TOS
-            MOV @IP+,PC
-ENDCODE
-    \
-
-CODE MAX    \    n1 n2 -- n3       signed maximum
-            CMP     @PSP,TOS    \ n2-n1
-            S<      ?GOTO FW1   \ n2<n1
-BW1         ADD     #2,PSP
-            MOV     @IP+,PC
-ENDCODE
-    \
-
-CODE MIN    \    n1 n2 -- n3       signed minimum
-            CMP     @PSP,TOS     \ n2-n1
-            S<      ?GOTO BW1    \ n2<n1
-FW1         MOV     @PSP+,TOS
-            MOV     @IP+,PC
-ENDCODE
-    \
-
-CODE 2*     \   x1 -- x2        arithmetic left shift
-            ADD TOS,TOS
-            MOV @IP+,PC
-ENDCODE
-    \
-
-CODE 2/     \   x1 -- x2        arithmetic right shift
-            RRA TOS
-            MOV @IP+,PC
-ENDCODE
-    \
-
-\ --------------------
-\ ARITHMETIC OPERATORS
-\ --------------------
-
-CODE NIP        \ a b c -- a c
-ADD #2,PSP
-MOV @IP+,PC
-ENDCODE
-    \
-
-: S>D           \ n -- d      single -> double
-    DUP 0<
-;
-    \
-
-\ \ C UM*     u1 u2 -- ud   unsigned 16x16->32 mult.
-\ CODE UM*
-\             MOV @PSP,S
-\ \ u2          = TOS register
-\ \ MULTIPLIERl = S
-\ \ MULTIPLIERh = W
-\ \ BIT         = X
-\ \ RESULTlo    = Y
-\ \ RESULThi    = T
-\ \ T.I. SIGNED MULTIPLY SUBROUTINE: u2 x u1 -> ud
-\             MOV #0,Y        \  0 -> LSBs RESULT
-\             MOV #0,T        \  0 -> MSBs RESULT
-\             MOV #0,W        \  0 -> MSBs MULTIPLIER
-\             MOV #1,X        \  BIT TEST REGISTER
-\ BEGIN       BIT X,TOS       \ 1 TEST ACTUAL BIT ; IF 0: DO NOTHING
-\     0<> IF                  \ 2 IF 1: ADD MULTIPLIER TO RESULT
-\             ADD S,Y         \ 1 
-\             ADDC W,T        \ 1
-\     THEN    ADD S,S         \ 1 (RLA LSBs) MULTIPLIER x 2
-\             ADDC W,W        \ 1 (RLC MSBs)
-\             ADD X,X         \ 1 (RLA) NEXT BIT TO TEST
-\ U>= UNTIL                   \ 2 IF BIT IN CARRY: FINISHED    10~ loop
-\             MOV Y,0(PSP)    \  low result on stack
-\             MOV T,TOS       \  high result in TOS
-\             MOV @IP+,PC
-\ ENDCODE
-\     \
-
-CODE M*             \ n1 n2 -- dlo dhi  signed 16*16->32 multiply             
-MOV TOS,S           \ TOS= n2
-XOR @PSP,S          \ S contains sign of result
-CMP #0,0(PSP)       \ n1 > -1 ?
-S< IF
-    XOR #-1,0(PSP)  \ n1 --> u1
-    ADD #1,0(PSP)   \
-THEN
-CMP #0,TOS          \ n2 > -1 ?
-S< IF
-    XOR #-1,TOS     \ n2 --> u2 
-    ADD #1,TOS      \
-THEN
-PUSHM IP,S
-LO2HI               \ -- ud1 u2
-UM*                 \ UMSTAR use S,T,W,X,Y
-HI2LO
-POPM 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
-    \
-
-\ TOS = DIVISOR
-\ S   = DIVIDENDlo
-\ W   = DIVIDENDhi
-\ X   = count
-\ Y   = QUOTIENT
-\ DVDhi|DVDlo : DIVISOR -> QUOT in Y, REM in DVDhi
-\ RETURN: CARRY = 0: OK CARRY = 1: QUOTIENT > 16 BITS
-
-\ C UM/MOD   udlo|udhi u1 -- ur uq
-CODE UM/MOD
-    MOV @PSP+,W     \ 2 W = DIVIDENDhi
-    MOV @PSP,S      \ 2 S = DIVIDENDlo
-    MOV #16,X       \ 2 INITIALIZE LOOP COUNTER
-BW1 CMP TOS,W       \ 1 dividendHI-divisor
-    U< ?GOTO FW1    \ 2 if not carry
-    SUB TOS,W       \ 1 if carry
-FW1                 \   FW1 is resolved therefore reusable
-BW2 ADDC Y,Y        \ 1 RLC quotient
-    SUB #1,X        \ 1 Decrement loop counter
-    0< ?GOTO FW1    \ 2 if 0< terminate
-    ADD S,S         \ 1 RLA
-    ADDC W,W        \ 1 RLC
-    U< ?GOTO BW1    \ 2 if not carry    14~ loop
-    SUB TOS,W       \ 1
-    BIS #1,SR       \ 1 SETC
-    GOTO BW2        \ 2                 14~ loop
-FW1 MOV W,0(PSP)    \ 3 remainder on stack
-    MOV Y,TOS       \ 1 quotient in TOS
-    MOV @IP+,PC     \ 4
-ENDCODE
-    \
-
-CODE SM/REM         \ d1lo d1hi n2 -- n3 n4  symmetric signed div
-MOV TOS,S           \           S=divisor
-MOV @PSP,T          \           T=dividend_sign=rem_sign
-CMP #0,TOS          \           n2 >= 0 ?
-S< IF               \
-    XOR #-1,TOS
-    ADD #1,TOS      \ -- d1 u2
-THEN
-CMP #0,0(PSP)       \           d1hi >= 0 ?
-S< IF               \
-    XOR #-1,2(PSP)  \           d1lo
-    XOR #-1,0(PSP)  \           d1hi
-    ADD #1,2(PSP)   \           d1lo+1
-    ADDC #0,0(PSP)  \           d1hi+C
-THEN
-PUSHM IP,S
-LO2HI               \ -- ud1 u2
-UM/MOD              \           UM/MOD use S,W,X,Y, not T
-HI2LO               \ -- u3 u4
-POPM S,IP
-CMP #0,T          \           T=rem_sign
-S< IF
-    XOR #-1,0(PSP)
-    ADD #1,0(PSP)
-THEN                \ -- n3 u4
-XOR S,T         \           S=divisor T=quot_sign
-CMP #0,T          \           T=quot_sign
-S< IF
-    XOR #-1,TOS
-    ADD #1,TOS
-THEN                \ -- n3 n4  S=divisor
-MOV @IP+,PC
-ENDCODE
-    \
-
-
-: FM/MOD            \ d1 n1 -- n2 n3   floored signed div'n
-SM/REM
-HI2LO               \ -- remainder quotient       S=divisor
-CMP #0,0(PSP)       \
-0<> IF
-    CMP #1,TOS      \ quotient < 1 ?
-    S< IF
-      ADD S,0(PSP)  \ add divisor to remainder
-      SUB #1,TOS    \ decrement quotient
-    THEN
-THEN
-MOV @RSP+,IP
-MOV @IP+,PC
-ENDCODE
-    \
-
-: *         \ n1 n2 -- n3           n1*n2 --> n3
-M* DROP
-;
-    \
-
-: /MOD      \ n1 n2 -- n3 n4        n1/n2 --> rem quot
->R DUP 0< R> FM/MOD
-;
-    \
-
-: /         \ n1 n2 -- n3           n1/n2 --> quot
->R DUP 0< R> FM/MOD NIP
-;
-    \
-
-: MOD       \ n1 n2 -- n3           n1/n2 --> rem
->R DUP 0< R> FM/MOD DROP
-;
-    \
-
-: */MOD     \ n1 n2 n3 -- n4 n5     n1*n2/n3 --> rem quot
->R M* R> FM/MOD
-;
-    \
-
-: */        \ n1 n2 n3 -- n4        n1*n2/n3 --> quot
->R M* R> FM/MOD NIP
-;
-    \
-
-\ ----------------------------------------------------------------------
-\ DOUBLE OPERATORS
-\ ----------------------------------------------------------------------
-
-CODE 2@        \ a-addr -- x1 x2    fetch 2 cells \ the lower address will appear on top of stack
-SUB     #2, PSP
-MOV     2(TOS),0(PSP)
-MOV     @TOS,TOS
-MOV     @IP+,PC
-ENDCODE
-    \
-
-CODE 2!         \ x1 x2 a-addr --    store 2 cells \ the top of stack is stored at the lower adr
-MOV     @PSP+,0(TOS)
-MOV     @PSP+,2(TOS)
-MOV     @PSP+,TOS
-MOV     @IP+,PC
-ENDCODE
-    \
-
-CODE 2DUP       \ x1 x2 -- x1 x2 x1 x2   dup top 2 cells
-SUB     #4,PSP          \ -- x1 x x x2
-MOV     TOS,2(PSP)      \ -- x1 x2 x x2
-MOV     4(PSP),0(PSP)   \ -- x1 x2 x1 x2
-MOV     @IP+,PC
-ENDCODE
-    \
-
-CODE 2DROP      \ x1 x2 --      drop 2 cells
-ADD     #2,PSP
-MOV     @PSP+,TOS
-MOV     @IP+,PC
-ENDCODE
-    \
-
-CODE 2SWAP      \ x1 x2 x3 x4 -- x3 x4 x1 x2
-MOV     @PSP,W          \ -- x1 x2 x3 x4    W=x3
-MOV     4(PSP),0(PSP)   \ -- x1 x2 x1 x4
-MOV     W,4(PSP)        \ -- x3 x2 x1 x4
-MOV     TOS,W           \ -- x3 x2 x1 x4    W=x4
-MOV     2(PSP),TOS      \ -- x3 x2 x1 x2    W=x4
-MOV     W,2(PSP)        \ -- x3 x4 x1 x2
-MOV     @IP+,PC
-ENDCODE
-    \
-
-CODE 2OVER      \ x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2
-SUB     #4,PSP          \ -- x1 x2 x3 x x x4
-MOV     TOS,2(PSP)      \ -- x1 x2 x3 x4 x x4
-MOV     8(PSP),0(PSP)   \ -- x1 x2 x3 x4 x1 x4
-MOV     6(PSP),TOS      \ -- x1 x2 x3 x4 x1 x2
-MOV     @IP+,PC
-ENDCODE
-    \
-
-
-\ ----------------------------------------------------------------------
-\ ALIGNMENT OPERATORS
-\ ----------------------------------------------------------------------
-
-CODE ALIGNED    \ addr -- a-addr       align given addr
-BIT     #1,TOS
-ADDC    #0,TOS
-MOV     @IP+,PC
-ENDCODE
-    \
-
-CODE ALIGN      \ --                         align HERE
-BIT     #1,&DP  \ 3
-ADDC    #0,&DP  \ 4
-MOV     @IP+,PC
-ENDCODE
-    \
-
-\ ---------------------
-\ PORTABILITY OPERATORS
-\ ---------------------
-
-CODE CHARS      \ n1 -- n2            chars->adrs units
-MOV     @IP+,PC
-ENDCODE
-    \
-
-CODE CHAR+      \ c-addr1 -- c-addr2   add char size
-ADD     #1,TOS
-MOV     @IP+,PC
-ENDCODE
-    \
-
-CODE CELLS      \ n1 -- n2            cells->adrs units
-ADD     TOS,TOS
-MOV     @IP+,PC
-ENDCODE
-    \
-
-CODE CELL+      \ a-addr1 -- a-addr2      add cell size
-ADD     #2,TOS
-MOV     @IP+,PC
-ENDCODE
-    \
-\ ---------------------------
-\ BLOCK AND STRING COMPLEMENT
-\ ---------------------------
-
-: CHAR      \ -- char       parse ASCII character
-    BL WORD 1+ C@
-;
-    \
-
-: [CHAR]    \ --            compile character literal
-    CHAR lit lit , ,
-; IMMEDIATE
-    \
-
-CODE +!         \ n/u a-addr --     add to memory
-ADD @PSP+,0(TOS)
-MOV @PSP+,TOS
-MOV @IP+,PC
-ENDCODE
-    \ 
-
-
-CODE FILL       \ c-addr u char --  fill memory with char
-MOV @PSP+,X     \ count
-MOV @PSP+,W     \ address
-CMP #0,X
-0<> IF
-    BEGIN
-        MOV.B TOS,0(W)    \ store char in memory
-        ADD #1,W
-        SUB #1,X
-    0= UNTIL
-THEN
-MOV @PSP+,TOS     \ empties stack
-MOV @IP+,PC
-ENDCODE
-    \
-
-\ --------------------
-\ INTERPRET COMPLEMENT
-\ --------------------
-
-CODE HEX
-MOV     #$10,&BASE
-MOV     @IP+,PC
-ENDCODE
-    \
-
-CODE DECIMAL
-MOV     #$0A,&BASE
-MOV     @IP+,PC
-ENDCODE
-    \
-: (                 \
-$29 WORD DROP
-; IMMEDIATE
-    \
-
-: .(             \  --     dotparen \ type comment immediatly.
-\ CAPS_OFF        \  --     set CAPS_OFF  (recompile FORTH with LOWERCASE swith ON before, must be paired with set CAP_ON)
-$29 WORD
-COUNT TYPE
-\ CAPS_ON               \  --     set CAPS_OFF  (recompile FORTH with LOWERCASE swith ON before, must be paired with set CAP_ON)
-; IMMEDIATE
-    \
-
-CODE SOURCE         \ -- adr u    current input buffer
-SUB #4,PSP
-MOV TOS,2(PSP)
-MOV &SOURCE_LEN,TOS
-MOV &SOURCE_ADR,0(PSP)
-MOV @IP+,PC
-ENDCODE
-    \
-
-CODE >BODY
-ADD #4,TOS
-MOV @IP+,PC
-ENDCODE
-    \
-
-ECHO
-PWR_HERE    ; to protect this app against a RESET, type: RST_HERE
-
-            ; added : INVERT LSHIFT RSHIFT 1+ 1- MAX MIN 2* 2/ CHAR [CHAR] +! FILL HEX DECIMAL ( .( SOURCE >BODY
-            ; added ARITHMETIC : NIP S>D M* UM/MOD SM/REM FM/MOD * /MOD / MOD */MOD */
-            ; added DOUBLE : 2@ 2! 2DUP 2DROP 2SWAP 2OVER
-            ; added ALIGMENT : ALIGNED ALIGN
-            ; added PORTABIITY : CHARS CHAR+ CELLS CELL+