dsforth: some optimisations
[urasm.git] / dsforth / editstr.zas
blob4c0ae4ea0b864ab95bde1e06a6a6fc25383ed098
1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;; string editor engine
3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5 $FORTH_VAR (EDITSTR-MAXLEN) 0
6 $FORTH_VAR (EDITSTR-XY)     0
7 $FORTH_VAR (EDITSTR-CP)     0
8 $FORTH_VAR (EDITSTR-ADDR)   0
9 $FORTH_VAR (EDITSTR-LEN)    0
10 $FORTH_VAR (EDITSTR-WASBS)  0
11 $FORTH_VAR (EDITSTR-CURCH)  177
14 ;; draw editing line with cursor
15 $FORTH_WORD (EDITSTR-DRAW)
16 ;; ( -- )
17   (E6WASSCROLL) 0C!
18   (EDITSTR-XY) @ (E6CURXY) !
19   (EDITSTR-ADDR) @  (EDITSTR-CP) @  TYPE
20   (E6CURXY) @  ;; save cursor position
21   (EDITSTR-CURCH) C@ EMIT
22   (EDITSTR-ADDR) @ (EDITSTR-CP) @ +  (EDITSTR-LEN) @ (EDITSTR-CP) @ -  TYPE
24   (EDITSTR-WASBS) @ 0BRANCH editstrdraw_0
25   SPACE
26 editstrdraw_0:
27   (EDITSTR-WASBS) 0!
29 ;; check for possible scroll
30   (E6WASSCROLL) C@ 0BRANCH editstrdraw_1
31   (EDITSTR-XY) C@ (E6WASSCROLL) C@ DUP >R -  (EDITSTR-XY) C!
32   R> -
33 editstrdraw_1:
35 ;; set coords for cursor
36   (E6CURXY) !  ;S
37 $FORTH_END_WORD (EDITSTR-DRAW)
39 ;; draw editing line w/o cursor
40 $FORTH_WORD (EDITSTR-TYPE)
41 ;; ( -- )
42   (EDITSTR-XY) @ (E6CURXY) !
43   (EDITSTR-ADDR) @  (EDITSTR-LEN) @  TYPE  SPACE  ;S
44 $FORTH_END_WORD (EDITSTR-TYPE)
46 ;; TYPE editing line, set 0x00 as the last char
47 $FORTH_WORD (EDITSTR-DOENTER)
48 ;; ( -- )
49   (EDITSTR-TYPE)  0  (EDITSTR-ADDR) @ (EDITSTR-LEN) @ +  C!  ;S
50 $FORTH_END_WORD (EDITSTR-DOENTER)
52 ;; position cursor to the start of the line
53 $FORTH_WORD (EDITSTR-DOHOME)
54 ;; ( -- )
55   (EDITSTR-CP) 0!  ;S
56 $FORTH_END_WORD (EDITSTR-DOHOME)
58 ;; position cursor to the end of the line
59 $FORTH_WORD (EDITSTR-DOEND)
60 ;; ( -- )
61   (EDITSTR-LEN) @ (EDITSTR-CP) !  ;S
62 $FORTH_END_WORD (EDITSTR-DOEND)
64 ;; clear editing line
65 $FORTH_WORD (EDITSTR-DOCLEAR)
66 ;; ( -- )
67   (EDITSTR-XY) @ (E6CURXY) !  (EDITSTR-LEN) @ 1+ SPACES
68   (EDITSTR-LEN) 0!  (EDITSTR-CP) 0!  ;S
69 $FORTH_END_WORD (EDITSTR-DOCLEAR)
71 ;; move cursor left
72 $FORTH_WORD (EDITSTR-DOLEFT)
73 ;; ( -- )
74   (EDITSTR-CP) @ 0BRANCH editstrdoleft_q
75   LIT -1 (EDITSTR-CP) +!
76 editstrdoleft_q:
77   ;S
78 $FORTH_END_WORD (EDITSTR-DOLEFT)
80 ;; move cursor right
81 $FORTH_WORD (EDITSTR-DORIGHT)
82 ;; ( -- )
83   (EDITSTR-CP) @ (EDITSTR-LEN) @ < 0BRANCH editstrdoright_q
84   1 (EDITSTR-CP) +!
85 editstrdoright_q:
86   ;S
87 $FORTH_END_WORD (EDITSTR-DORIGHT)
89 ;; delete char before cursor, move cursor left
90 $FORTH_WORD (EDITSTR-DOBS)
91 ;; ( -- success_flag)
92   (EDITSTR-LEN) @ 0BRANCH editstrdobs_f
93   (EDITSTR-CP) @ -DUP 0BRANCH editstrdobs_f
94   (EDITSTR-WASBS) 1!
95 editstrdobs_0:
96   DUP (EDITSTR-ADDR) @ +  DUP C@  SWAP 1- C!
97   1+  DUP (EDITSTR-LEN) @ >=
98   0BRANCH editstrdobs_0
99   DROP
100   LIT -1 (EDITSTR-LEN) +!  LIT -1 (EDITSTR-CP) +!
101   1 BRANCH editstrdobs_q
102 editstrdobs_f:
103   0
104 editstrdobs_q:
105   ;S
106 $FORTH_END_WORD (EDITSTR-DOBS)
108 ;; insert char at the currsnt cursor position
109 $FORTH_WORD (EDITSTR-DOINSCHAR)
110 ;; ( ch -- success_flag )
111   (EDITSTR-LEN) @ (EDITSTR-MAXLEN) @ < 0BRANCH editstrdoinschar_f
112   (EDITSTR-CP) @ (EDITSTR-LEN) @ < 0BRANCH editstrdoinschar_0
113 ;; make room & insert
114   (EDITSTR-ADDR) @ (EDITSTR-LEN) @ +
115   (EDITSTR-LEN) @ (EDITSTR-CP) @ -
116 editstrdoinschar_l:
117   DUP 0 > 0BRANCH editstrdoinschar_x
118     >R  DUP 1- C@ OVER C!  1-  R> 1-
119   BRANCH editstrdoinschar_l
120 editstrdoinschar_x:
121   2DROP
122 editstrdoinschar_0:
123 ;; just set char
124   (EDITSTR-CP) @ (EDITSTR-ADDR) @ + C!
125   1 (EDITSTR-LEN) +!  1 (EDITSTR-CP) +!
126   1 BRANCH editstrdoinschar_q  ;; set flag & quit
127 editstrdoinschar_f:
128   DROP 0
129 editstrdoinschar_q:
130   ;S
131 $FORTH_END_WORD (EDITSTR-DOINSCHAR)
133 ;; append char to the end of the line, do not move cursor
134 $FORTH_WORD (EDITSTR-DOADDCHAR)
135 ;; ( ch -- success_flag)
136   (EDITSTR-LEN) @ (EDITSTR-MAXLEN) @ < 0BRANCH editstrdoaddchar_f
137 ;; just add char
138   (EDITSTR-LEN) @ (EDITSTR-ADDR) @ + C!
139 editstrdoaddchar_0:
140   1 (EDITSTR-LEN) +!
141   1 BRANCH editstrdoaddchar_q
142 editstrdoaddchar_f:
143   DROP 0
144 editstrdoaddchar_q:
145   ;S
146 $FORTH_END_WORD (EDITSTR-DOADDCHAR)
149 $FORTH_WORD (EDITSTR)
150 ;; k8
151 ;; ( -- exkey )
152 ;; init vars
153 ;;  1- (EDITSTR-MAXLEN) !  (EDITSTR-ADDR) !
154 ;;  (EDITSTR-LEN) 0!  (EDITSTR-CP) 0!
155   (EDITSTR-WASBS) 0!
156 xeditstr0:
157   (EDITSTR-DRAW) KEY
158 xeditstr1:
159   DUP LIT 8 = 0BRANCH xeditstr2
160 ;; CS+5 (LEFT)
161   DROP  (EDITSTR-DOLEFT)  BRANCH xeditstr0
162 xeditstr2:
163   DUP LIT 9 = 0BRANCH xeditstr3
164 ;; CS+8 (RIGHT)
165   DROP  (EDITSTR-DORIGHT)  BRANCH xeditstr0
166 xeditstr3:
167   DUP LIT 12 = 0BRANCH xeditstr4
168 ;; BS
169   DROP  (EDITSTR-DOBS) DROP  BRANCH xeditstr0
170 xeditstr4:
171   DUP LIT 32 < 0BRANCH xeditstr5
172 ;; control key. just exit
173   BRANCH xeditstr_q
174 xeditstr5:
175   (EDITSTR-DOINSCHAR) DROP  BRANCH xeditstr0
176 xeditstr_q:
177   ;S
178 $FORTH_END_WORD (EDITSTR)
180 $FORTH_WORD XEDITSTR
181 ;; k8
182 ;; ( -- )
183 ;; init vars
184   (E6CURXY) @ (EDITSTR-XY) !
186 exexp0:
187   (EDITSTR)
188   DUP LIT 13 = 0BRANCH exexp1
189 ;; ENTER
190   DROP  (EDITSTR-DOENTER)  BRANCH exexp_q
191 exexp1:
192   DUP LIT 7 = 0BRANCH exexp2
193 ;; CS+1 (ESC)
194   DROP  (EDITSTR-DOCLEAR)  BRANCH exexp0
195 exexp2:
196   DUP LIT 11 = 0BRANCH exexp3
197 ;; CS+7 (UP -- home)
198   DROP  (EDITSTR-DOHOME)  BRANCH exexp0
199 exexp3:
200   DUP LIT 10 = 0BRANCH exexp4
201 ;; CS+6 (DOWN -- end)
202   DROP  (EDITSTR-DOEND)
203 exexp4:
204   BRANCH exexp0
205 exexp_q:
206   ;S
207 $FORTH_END_WORD XEDITSTR