dsforth: added stack comments to most words
[urasm.git] / dsforth / main_editstr.zas
blobb38ac8ba61071f927d1512bee7b682ee7d7d94b7
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 ;; k8
17 ;; ( -- )
18   (E6WASSCROLL) 0C!
19   (EDITSTR-XY) @ (E6CURXY) !
20   (EDITSTR-ADDR) @  (EDITSTR-CP) @  TYPE
21   (E6CURXY) @  ;; save cursor position
22   (EDITSTR-CURCH) C@ EMIT
23   (EDITSTR-ADDR) @ (EDITSTR-CP) @ +  (EDITSTR-LEN) @ (EDITSTR-CP) @ -  TYPE
25   (EDITSTR-WASBS) @ 0BRANCH editstrdraw_0
26   SPACE
27 editstrdraw_0:
28   (EDITSTR-WASBS) 0!
30 ;; check for possible scroll
31   (E6WASSCROLL) C@ 0BRANCH editstrdraw_1
32   (EDITSTR-XY) C@ (E6WASSCROLL) C@ DUP >R -  (EDITSTR-XY) C!
33   R> -
34 editstrdraw_1:
36 ;; set coords for cursor
37   (E6CURXY) !  ;S
38 $FORTH_END_WORD (EDITSTR-DRAW)
41 ;; draw editing line w/o cursor
42 $FORTH_WORD (EDITSTR-TYPE)
43 ;; k8
44 ;; ( -- )
45   (EDITSTR-XY) @ (E6CURXY) !
46   (EDITSTR-ADDR) @  (EDITSTR-LEN) @  TYPE  SPACE  ;S
47 $FORTH_END_WORD (EDITSTR-TYPE)
50 ;; TYPE editing line, set 0x00 as the last char
51 $FORTH_WORD (EDITSTR-DOENTER)
52 ;; k8
53 ;; ( -- )
54   (EDITSTR-TYPE)  0  (EDITSTR-ADDR) @ (EDITSTR-LEN) @ +  C!  ;S
55 $FORTH_END_WORD (EDITSTR-DOENTER)
58 ;; position cursor to the start of the line
59 $FORTH_WORD (EDITSTR-DOHOME)
60 ;; k8
61 ;; ( -- )
62   (EDITSTR-CP) 0!  ;S
63 $FORTH_END_WORD (EDITSTR-DOHOME)
66 ;; position cursor to the end of the line
67 $FORTH_WORD (EDITSTR-DOEND)
68 ;; k8
69 ;; ( -- )
70   (EDITSTR-LEN) @ (EDITSTR-CP) !  ;S
71 $FORTH_END_WORD (EDITSTR-DOEND)
74 ;; clear editing line
75 $FORTH_WORD (EDITSTR-DOCLEAR)
76 ;; k8
77 ;; ( -- )
78   (EDITSTR-XY) @ (E6CURXY) !  (EDITSTR-LEN) @ 1+ SPACES
79   (EDITSTR-LEN) 0!  (EDITSTR-CP) 0!  ;S
80 $FORTH_END_WORD (EDITSTR-DOCLEAR)
83 ;; move cursor left
84 $FORTH_WORD (EDITSTR-DOLEFT)
85 ;; k8
86 ;; ( -- )
87   (EDITSTR-CP) @ 0BRANCH editstrdoleft_q
88   -1 (EDITSTR-CP) +!
89 editstrdoleft_q:
90   ;S
91 $FORTH_END_WORD (EDITSTR-DOLEFT)
94 ;; move cursor right
95 $FORTH_WORD (EDITSTR-DORIGHT)
96 ;; k8
97 ;; ( -- )
98   (EDITSTR-CP) @ (EDITSTR-LEN) @ < 0BRANCH editstrdoright_q
99   1 (EDITSTR-CP) +!
100 editstrdoright_q:
101   ;S
102 $FORTH_END_WORD (EDITSTR-DORIGHT)
105 ;; delete char before cursor, move cursor left
106 $FORTH_WORD (EDITSTR-DOBS)
107 ;; k8
108 ;; ( -- success_flag)
109   (EDITSTR-LEN) @ 0BRANCH editstrdobs_f
110   (EDITSTR-CP) @ -DUP 0BRANCH editstrdobs_f
111   (EDITSTR-WASBS) 1!
112 editstrdobs_0:
113   DUP (EDITSTR-ADDR) @ +  DUP C@  SWAP 1- C!
114   1+  DUP (EDITSTR-LEN) @ >=
115   0BRANCH editstrdobs_0
116   DROP
117   -1 (EDITSTR-LEN) +!  -1 (EDITSTR-CP) +!
118   1 BRANCH editstrdobs_q
119 editstrdobs_f:
120   0
121 editstrdobs_q:
122   ;S
123 $FORTH_END_WORD (EDITSTR-DOBS)
126 ;; insert char at the currsnt cursor position
127 $FORTH_WORD (EDITSTR-DOINSCHAR)
128 ;; k8
129 ;; ( ch -- success_flag )
130   (EDITSTR-LEN) @ (EDITSTR-MAXLEN) @ < 0BRANCH editstrdoinschar_f
131   (EDITSTR-CP) @ (EDITSTR-LEN) @ < 0BRANCH editstrdoinschar_0
132 ;; make room & insert
133   (EDITSTR-ADDR) @ (EDITSTR-LEN) @ +
134   (EDITSTR-LEN) @ (EDITSTR-CP) @ -
135 editstrdoinschar_l:
136   DUP 0 > 0BRANCH editstrdoinschar_x
137     >R  DUP 1- C@ OVER C!  1-  R> 1-
138   BRANCH editstrdoinschar_l
139 editstrdoinschar_x:
140   2DROP
141 editstrdoinschar_0:
142 ;; just set char
143   (EDITSTR-CP) @ (EDITSTR-ADDR) @ + C!
144   1 (EDITSTR-LEN) +!  1 (EDITSTR-CP) +!
145   1 BRANCH editstrdoinschar_q  ;; set flag & quit
146 editstrdoinschar_f:
147   DROP 0
148 editstrdoinschar_q:
149   ;S
150 $FORTH_END_WORD (EDITSTR-DOINSCHAR)
153 ;; append char to the end of the line, do not move cursor
154 $FORTH_WORD (EDITSTR-DOADDCHAR)
155 ;; k8
156 ;; ( ch -- success_flag)
157   (EDITSTR-LEN) @ (EDITSTR-MAXLEN) @ < 0BRANCH editstrdoaddchar_f
158 ;; just add char
159   (EDITSTR-LEN) @ (EDITSTR-ADDR) @ + C!
160 editstrdoaddchar_0:
161   1 (EDITSTR-LEN) +!
162   1 BRANCH editstrdoaddchar_q
163 editstrdoaddchar_f:
164   DROP 0
165 editstrdoaddchar_q:
166   ;S
167 $FORTH_END_WORD (EDITSTR-DOADDCHAR)
170 $FORTH_WORD (EDITSTR)
171 ;; k8
172 ;; ( -- exkey )
173 ;; init vars
174 ;;  1- (EDITSTR-MAXLEN) !  (EDITSTR-ADDR) !
175 ;;  (EDITSTR-LEN) 0!  (EDITSTR-CP) 0!
176   (EDITSTR-WASBS) 0!
177 xeditstr0:
178   (EDITSTR-DRAW) KEY
179 xeditstr1:
180   DUP LIT 8 = 0BRANCH xeditstr2
181 ;; CS+5 (LEFT)
182   DROP  (EDITSTR-DOLEFT)  BRANCH xeditstr0
183 xeditstr2:
184   DUP LIT 9 = 0BRANCH xeditstr3
185 ;; CS+8 (RIGHT)
186   DROP  (EDITSTR-DORIGHT)  BRANCH xeditstr0
187 xeditstr3:
188   DUP LIT 12 = 0BRANCH xeditstr4
189 ;; BS
190   DROP  (EDITSTR-DOBS) DROP  BRANCH xeditstr0
191 xeditstr4:
192   DUP BL < 0BRANCH xeditstr5
193 ;; control key. just exit
194   BRANCH xeditstr_q
195 xeditstr5:
196   (EDITSTR-DOINSCHAR) DROP  BRANCH xeditstr0
197 xeditstr_q:
198   ;S
199 $FORTH_END_WORD (EDITSTR)
202 $FORTH_WORD XEDITSTR
203 ;; k8
204 ;; ( -- )
205 ;; init vars
206   (E6CURXY) @ (EDITSTR-XY) !
208 exexp0:
209   (EDITSTR)
210   DUP CHCR = 0BRANCH exexp1
211 ;; ENTER
212   DROP  (EDITSTR-DOENTER)  BRANCH exexp_q
213 exexp1:
214   DUP LIT 7 = 0BRANCH exexp2
215 ;; CS+1 (ESC)
216   DROP  (EDITSTR-DOCLEAR)  BRANCH exexp0
217 exexp2:
218   DUP LIT 11 = 0BRANCH exexp3
219 ;; CS+7 (UP -- home)
220   DROP  (EDITSTR-DOHOME)  BRANCH exexp0
221 exexp3:
222   DUP CHLF = 0BRANCH exexp4
223 ;; CS+6 (DOWN -- end)
224   DROP  (EDITSTR-DOEND)
225 exexp4:
226   BRANCH exexp0
227 exexp_q:
228   ;S
229 $FORTH_END_WORD XEDITSTR