OSDN Git Service

raz
[fast-forth/master.git] / ADDON / ANS_COMPLEMENT.asm
1 ; -*- coding: utf-8 -*-
2 ; http://patorjk.com/software/taag/#p=display&f=Banner&t=Fast Forth
3
4 ; Fast Forth For Texas Instrument MSP430FRxxxx FRAM devices
5 ; Copyright (C) <2015>  <J.M. THOORENS>
6 ;
7 ; This program is free software: you can redistribute it and/or modify
8 ; it under the terms of the GNU General Public License as published by
9 ; the Free Software Foundation, either version 3 of the License, or
10 ; (at your option) any later version.
11 ;
12 ; This program is distributed in the hope that it will be useful,
13 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 ; GNU General Public License for more details.
16 ;
17 ; You should have received a copy of the GNU General Public License
18 ; along with this program.  If not, see <http://www.gnu.org/licenses/>.
19
20
21     .IFNDEF ALIGNMENT
22     .include "ADDON\ALIGNMENT.asm"
23     .ENDIF
24     .IFNDEF ARITHMETIC
25     .include "ADDON\ARITHMETIC.asm"
26     .ENDIF
27     .IFNDEF PORTABILITY
28     .include "ADDON\PORTABILITY.asm"
29     .ENDIF
30     .IFNDEF DOUBLE
31     .include "ADDON\DOUBLE.asm"
32     .ENDIF
33
34 ;C INVERT   x1 -- x2            bitwise inversion
35             FORTHWORD "INVERT"
36 INVERT      XOR     #-1,TOS
37             mNEXT
38
39 ;C LSHIFT  x1 u -- x2    logical L shift u places
40             FORTHWORD "LSHIFT"
41 LSHIFT      MOV     @PSP+,W
42             AND     #1Fh,TOS        ; no need to shift more than 16
43             JZ      LSH_X
44 LSH_1:      ADD     W,W
45             SUB     #1,TOS
46             JNZ     LSH_1
47 LSH_X:      MOV     W,TOS
48             mNEXT
49
50 ;C RSHIFT  x1 u -- x2    logical R shift u places
51             FORTHWORD "RSHIFT"
52 RSHIFT      MOV     @PSP+,W
53             AND     #1Fh,TOS        ; no need to shift more than 16
54             JZ      RSH_X
55 RSH_1:      BIC     #1,SR           ; CLRC
56             RRC     W
57             SUB     #1,TOS
58             JNZ     RSH_1
59 RSH_X:      MOV     W,TOS
60             mNEXT
61
62 ;C 1+      n1/u1 -- n2/u2       add 1 to TOS
63             FORTHWORD "1+"
64 ONEPLUS     ADD     #1,TOS
65             mNEXT
66
67 ;C 1-      n1/u1 -- n2/u2     subtract 1 from TOS
68             FORTHWORD "1-"
69 ONEMINUS    SUB     #1,TOS
70             mNEXT
71
72 ;C 2*      x1 -- x2         arithmetic left shift
73             FORTHWORD "2*"
74 TWOSTAR     ADD     TOS,TOS
75             mNEXT
76
77 ;C 2/      x1 -- x2        arithmetic right shift
78             FORTHWORD "2/"
79 TWOSLASH    RRA     TOS
80             mNEXT
81
82 ;C MAX    n1 n2 -- n3       signed maximum
83             FORTHWORD "MAX"
84 MAX:        CMP     @PSP,TOS    ; n2-n1
85             JL      SELn1       ; n2<n1
86 SELn2:      ADD     #2,PSP
87             mNEXT
88
89 ;C MIN    n1 n2 -- n3       signed minimum
90             FORTHWORD "MIN"
91 MIN:        CMP     @PSP,TOS    ; n2-n1
92             JL      SELn2       ; n2<n1
93 SELn1:      MOV     @PSP+,TOS
94             mNEXT
95
96 ;C +!     n/u a-addr --       add to memory
97             FORTHWORD "+!"
98 PLUSSTORE   ADD     @PSP+,0(TOS)
99             MOV     @PSP+,TOS
100             mNEXT
101
102 ;C CHAR   -- char           parse ASCII character
103             FORTHWORD "CHAR"
104 CHARR       mDOCOL
105             .word   FBLANK,WORDD,ONEPLUS,CFETCH,EXIT
106
107 ;C [CHAR]   --          compile character literal
108             FORTHWORDIMM "[CHAR]"        ; immediate
109 BRACCHAR    mDOCOL
110             .word   CHARR
111             .word   lit,lit,COMMA
112             .word   COMMA,EXIT
113
114 ;C FILL   c-addr u char --  fill memory with char
115             FORTHWORD "FILL"
116 FILL        MOV     @PSP+,X     ; count
117             MOV     @PSP+,W     ; address
118             CMP     #0,X
119             JZ      FILL_X
120 FILL_1:     MOV.B   TOS,0(W)    ; store char in memory
121             ADD     #1,W
122             SUB     #1,X
123             JNZ     FILL_1
124 FILL_X:     MOV     @PSP+,TOS   ; pop new TOS
125             mNEXT
126
127             FORTHWORD "HEX"
128 HEX         MOV     #16,&BASE
129             mNEXT
130
131             FORTHWORD "DECIMAL"
132 DECIMAL     MOV     #10,&BASE
133             mNEXT
134
135 ;C (                \  --     paren ; skip input until )
136             FORTHWORDIMM "\40"      ; immediate
137 LPAREN      mDOCOL
138             .word   lit,')',WORDD,DROP,EXIT
139
140     .IFDEF LOWERCASE
141
142 ; .(                \  --     dotparen ; type comment immediatly.
143             FORTHWORDIMM ".\40"        ; immediate
144 DOTLPAREN   mDOCOL
145             .word   CAPS_OFF
146             .word   lit,')',WORDD
147             .word   CAPS_ON
148             .word   COUNT,TYPE
149             .word   EXIT
150     .ELSE
151
152 ; .(                \  --     dotparen ; type comment immediatly.
153             FORTHWORDIMM ".\40"        ; immediate
154 DOTLPAREN   mDOCOL
155             .word   lit,')',WORDD
156             .word   COUNT,TYPE
157             .word   EXIT
158     .ENDIF ; LOWERCASE
159
160 ;C SOURCE   -- adr u    current input buffer
161             FORTHWORD "SOURCE"
162             SUB     #4,PSP
163             MOV     TOS,2(PSP)
164             MOV     &SOURCE_LEN,TOS
165             MOV     &SOURCE_ADR,0(PSP)
166             mNEXT
167
168 ; >BODY     -- PFA      leave PFA of created word
169             FORTHWORD ">BODY"
170             ADD     #4,TOS
171             mNEXT