Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4867 leency 1
ZZ=D0 ( Поиск слов в словарях и управление порядком поиска.
2
  ОС-независимые определения.
3
  Copyright [C] 1992-1999 A.Cherezov ac@forth.org
4
  Преобразование из 16-разрядного в 32-разрядный код - 1995-96гг
5
  Ревизия - сентябрь 1999
6
  Модифицированно Максимовым М.О.
7
  email:mak@mail.rtc.neva.ru
8
  http://informer.rtc.neva.ru/
9
  т д {812}105-92-03
10
  т р {812}552-47-64
11
)
12
 
13
VECT FIND
14
 
15
5A1F35  50 1F 5A 00  00 04 46 49  4E 44 A3 1E  5A 00 00 00 P.Z...FINDг.Z...
16
5A1F45  00 00 00 00  00 00 00 00  00 00 00 E8  93 01 FA FF ...........шУ.· 
17
5A1F55  40 D2 59 00  E8 A6 01 FA  FF @╥Y.шж.· 
18
 
19
 
20
0x10 CELLS CONSTANT CONTEXT_SIZE
21
 
22
5A1F5E  80 1F 5A 00  00 0C 43 4F  4E 54 45 58  54 5F 53 49 А.Z...CONTEXT_SI
23
5A1F6E  5A 45 3A 1F  5A 00 00 00  00 00 00 00  00 00 00 00 ZE:.Z...........
24
5A1F7E  00 00 E8 B7  00 FA FF 40  00 00 00 ..ш╖.· @...
25
 
26
 
27
CREATE SEARCH-BUFF 0x81 ALLOT
28
 
29
5A1F89   A0 1F 5A 00  00 0B 53 45  41 52 43 48  2D 42 55 46 а.Z...SEARCH-BUF
30
5A1F99   46 63 1F 5A  00 00 00 E8  77 00 FA FF  00 00 00 00 Fc.Z...шw.· ....
31
5A1FA9   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00 ................
32
5A1FB9   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00 ................
33
5A1FC9   00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00 ................
34
5A2026 4D bytes
35
 
36
Code ZSEARCH-WORDLIST ;( z-addr wid -- 0 | xt 1 | xt -1 ) \ 94 SEARCH
37
 
38
5A2026  40 20 5A 00  00 10 5A 53  45 41 52 43  48 2D 57 4F @ Z...ZSEARCH-WO
39
5A2036  52 44 4C 49  53 54 8E 1F  5A 00 RDLISTО.Z.
40
 
41
; Найти определение, заданное строкой c-addr u в списке слов, идентифицируемом
42
; wid. Если определение не найдено, вернуть ноль.
43
; Если определение найдено, вернуть выполнимый токен xt и единицу (1), если
44
; определение немедленного исполнения, иначе минус единицу (-1).
45
 ;	PUSH	WORD PTR [EBP]
46
	MOV	EDX, [EBP]
47
 
48
5A2040  8B 55 00 ЛU.
49
 
50
	PUSH	EDX
51
 
52
5A2043  52 R
53
 
54
	MOV	EAX, [EAX]
55
 
56
5A2044  8B 00 Л.
57
 
58
	PUSH	EAX
59
 
60
5A2046  50 P
61
 
62
    LEA EBP, [EBP+4]
63
 
64
5A2047  8D 6D 04 Нm.
65
 
66
	CALL	{' GETPR}
67
 
68
5A204A  E8 31 9E FC  FF ш1Ю№ 
69
 
70
	TEST	EAX, EAX
71
 
72
5A204F  85 C0 Е└
73
 
74
	JZ	m1
75
 
76
5A2051  0F 84 0E 00  00 00 .Д....
77
 
78
	LEA	EBP, [EBP-4]
79
 
80
5A2057  8D 6D FC Нm№
81
 
82
	MOV	[EBP], EAX
83
 
84
5A205A  89 45 00 ЙE.
85
 
86
	MOVZX	EAX, BYTE PTR [EDX-9]
87
 
88
5A205D  0F B6 42 F7 .╢Bў
89
 
90
	DEC	EAX
91
 
92
5A2061  48 H
93
 
94
	OR	EAX, 1
95
 
96
5A2062  83 C8 01 Г╚.
97
 
98
m1:       RET
99
 
100
5A2065  C3 ├
101
 
102
EndCode
103
 
104
: SEARCH-WORDLIST ( c-addr u wid -- 0 | xt 1 | xt -1 )
105
 
106
5A2066  80 20 5A 00  00 0F 53 45  41 52 43 48  2D 57 4F 52 А Z...SEARCH-WOR
107
5A2076  44 4C 49 53  54 2B 20 5A  00 00 DLIST+ Z..
108
 
109
  >R 0x7F AND SEARCH-BUFF  ASCII-Z
110
 
111
5A2080  50 B8 7F 00  00 00 23 45  00 8D 6D 04  E8 0F FF FF P╕...#E.Нm.ш.  
112
5A2090  FF E8 2A C0  FF FF  ш*└  
113
 
114
  R>  ZSEARCH-WORDLIST
115
 
116
5A2096  89 45 FC 58  8D 6D FC E8  9E FF FF FF ЙE№XНm№шЮ   
117
 
118
 
119
;
120
 
121
5A20A2  C3 ├
122
 
123
 
124
: SFIND ( addr len --- addr len 0| xt 1|xt -1 )
125
 
126
5A20A3  C0 20 5A 00  00 05 53 46  49 4E 44 6B  20 5A 00 00 └ Z...SFINDk Z..
127
5A20B3  00 00 00 00  00 00 00 00  00 00 00 00  00 .............
128
 
129
\ Search all word lists in the search order for the name in the
130
\ counted string at c-addr. If not found return the name address and 0.
131
\ If found return the execution token xt and -1 if the word is non-immediate
132
\ and 1 if the word is immediate.
133
  CONTEXT
134
 
135
5A20C0  E8 23 07 FB  FF ш#.√ 
136
 
137
  BEGIN	DUP @
138
 
139
5A20C5  90 90 90 89  45 FC 8B 00  0B C0 8B РРРЙE№Л..└Л
140
 
141
  WHILE	>R
142
 
143
5A20D0  45 FC 0F 84  41 00 00 00  50 8B 45 00  8B 55 04 E№.ДA...PЛE.ЛU.
144
 
145
	2DUP  R@ @ SEARCH-WORDLIST ?DUP
146
 
147
5A20DF  89 45 00 89  55 FC 89 45  F8 8B 04 24  8B 00 8D 6D ЙE.ЙU№ЙE°Л.$Л.Нm
148
5A20EF  F8 E8 8B FF  FF FF E8 96  AA FF FF °шЛ   шЦк  
149
 
150
	IF    RDROP 2NIP  EXIT \ Exit if found.
151
 
152
5A20FA  0B C0 8B 45  00 8D 6D 04  74 09 83 C4  04 E8 04 C1 .└ЛE.Нm.t.Г─.ш.┴
153
5A210A  FF FF C3   ├
154
 
155
	THEN
156
	R> CELL+
157
 
158
5A210D  89 45 FC 58  8D 40 04 8D  6D FC ЙE№XН@.Нm№
159
 
160
  REPEAT @
161
 
162
5A2117  EB AF 8B 00 ыпЛ.
163
 
164
;
165
 
166
5A211B  C3 ├
167
 
168
 
169
: FIND1 ( c-addr -- c-addr 0 | xt 1 | xt -1 ) \ 94 SEARCH
170
 
171
5A211C  30 21 5A 00  00 05 46 49  4E 44 31 A8  20 5A 00 00 0!Z...FIND1и Z..
172
5A212C  00 00 00 00 ....
173
 
174
\ Расширить семантику CORE FIND следующим:
175
\ Искать определение с именем, заданным строкой со счетчиком c-addr.
176
\ Если определение не найдено после просмотра всех списков в порядке поиска,
177
\ возвратить c-addr и ноль. Если определение найдено, возвратить xt.
178
\ Если определение немедленного исполнения, вернуть также единицу (1);
179
\ иначе также вернуть минус единицу (-1). Для данной строки, значения,
180
\ возвращаемые FIND во время компиляции, могут отличаться от значений,
181
\ возвращаемых не в режиме компиляции.
182
  COUNT SFIND
183
 
184
5A2130  8D 50 01 89  55 FC 0F B6  00 8D 6D FC  E8 7F FF FF НP.ЙU№.╢.Нm№ш  
185
5A2140  FF  
186
 
187
  DUP 0= IF 2DROP 1- 0 THEN ;
188
 
189
5A2141  0B C0 75 0E  8B 45 04 8D  40 FF 89 45  04 33 C0 8D .└u.ЛE.Н@ ЙE.3└Н
190
5A2151  6D 04 C3 m.├
191
 
192
 
193
: DEFINITIONS ( -- ) \ 94 SEARCH
194
 
195
5A2154  70 21 5A 00  00 0B 44 45  46 49 4E 49  54 49 4F 4E p!Z...DEFINITION
196
5A2164  53 21 21 5A  00 00 00 00  00 00 00 00 S!!Z........
197
 
198
\ Сделать списком компиляции тот же список слов, что и первый список в порядке
199
\ поиска. Имена последующих определений будут помещаться в список компиляции.
200
\ Последующие изменения порядка поиска не влияют на список компиляции.
201
  CONTEXT @ SET-CURRENT
202
 
203
5A2170  E8 73 06 FB  FF 8B 00 E8  C0 4E FA FF шs.√ Л.ш└N· 
204
 
205
;
206
 
207
5A217C  C3 ├
208
 
209
 
210
: GET-ORDER_DROP ( CONTEXT -- widn .. wid1 )
211
 
212
5A217D  A0 21 5A 00  00 0E 47 45  54 2D 4F 52  44 45 52 5F а!Z...GET-ORDER_
213
5A218D  44 52 4F 50  59 21 5A 00  00 00 00 00  00 00 00 00 DROPY!Z.........
214
5A219D  00 00 00 ...
215
 
216
  DUP @ DUP IF >R CELL+ RECURSE R> EXIT THEN 2DROP ;
217
 
218
5A21A0  89 45 FC 8B  00 8D 6D FC  0B C0 74 17  50 8B 45 00 ЙE№Л.Нm№.└t.PЛE.
219
5A21B0  8D 40 04 8D  6D 04 E8 E5  FF FF FF 89  45 FC 58 8D Н@.Нm.шх   ЙE№XН
220
5A21C0  6D FC C3 8B  45 04 8D 6D  08 C3 m№├ЛE.Нm.├
221
 
222
 
223
: GET-ORDER     ( -- widn .. wid1 n )
224
 
225
5A21CA  E0 21 5A 00  00 09 47 45  54 2D 4F 52  44 45 52 82 р!Z...GET-ORDERВ
226
5A21DA  21 5A 00 00  00 00 !Z....
227
 
228
	DEPTH >R
229
 
230
5A21E0  E8 EB E4 FF  FF 50 8B 45  00 8D 6D 04 шыф  PЛE.Нm.
231
 
232
	CONTEXT GET-ORDER_DROP
233
 
234
5A21EC  E8 F7 05 FB  FF E8 AA FF  FF FF шў.√ шк   
235
 
236
	DEPTH R> - ;
237
 
238
5A21F6  E8 D5 E4 FF  FF 89 45 FC  58 F7 D8 03  45 FC C3 ш╒ф  ЙE№Xў╪.E№├
239
 
240
 
241
: SET-ORDER     ( widn .. wid1 n -- )
242
 
243
5A2205  20 22 5A 00  00 09 53 45  54 2D 4F 52  44 45 52 CF  "Z...SET-ORDER╧
244
5A2215  21 5A 00 00  00 00 00 00  00 00 00 !Z.........
245
 
246
                DUP 0<
247
 
248
5A2220  0B C0 7D 10  8B 45 00 8D  6D .└}.ЛE.Нm
249
 
250
                IF      DROP ONLY
251
 
252
5A2229  04 E8 A9 07  FB FF E9 63  00 00 .шй.√ щc..
253
 
254
                ELSE    CONTEXT CONTEXT_SIZE ERASE
255
 
256
5A2233  00 E8 AF 05  FB FF E8 42  FD FF FF E8  5D BC FF FF .шп.√ шB¤  ш]╝  
257
 
258
 
259
 
260
5A2243  89 45 FC 33  C0 8D 6D 04 ЙE№3└Нm.
261
 
262
                        ?DO     CONTEXT I CELLS+ !
263
 
264
5A224B  BB 97 22 5A  00 3B 45 F8  75 05 8B 45  FC FF E3 53 ╗Ч"Z.;E°u.ЛE№ уS
265
5A225B  BB 00 00 00  80 2B 5D F8  53 03 D8 53  8B 45 FC E8 ╗...А+]°S.╪SЛE№ш
266
5A226B  79 05 FB FF  89 45 FC 8B  04 24 2B 44  24 04 8D 04 y.√ ЙE№Л.$+D$.Н.
267
5A227B  85 00 00 00  00 03 45 FC  8B 55 00 89  10 8B 45 04 Е.....E№ЛU.Й.ЛE.
268
5A228B  8D 6D 08 Нm.
269
 
270
                        LOOP
271
 
272
5A228E  FF 04 24 71  D7 8D 64 24  0C  .$q╫Нd$.
273
 
274
                THEN    ;
275
 
276
5A2297  C3 ├
277
 
278
 
279
 
280
: FORTH ( -- ) \ 94 SEARCH EXT
281
 
282
5A2298  B0 22 5A 00  00 05 46 4F  52 54 48 0A  22 5A 00 00 ░"Z...FORTH."Z..
283
5A22A8  00 00 00 00  00 00 00 00 ........
284
 
285
\ Преобразовать порядок поиска, состоящий из widn, ...wid2, wid1 (где wid1
286
\ просматривается первым) в widn,... wid2, widFORTH-WORDLIST.
287
  FORTH-WORDLIST CONTEXT !
288
 
289
5A22B0  E8 3F FF FA  FF E8 2E 05  FB FF 8B 55  00 89 10 8B ш? · ш..√ ЛU.Й.Л
290
5A22C0  45 04 8D 6D  08 E.Нm.
291
 
292
;
293
 
294
5A22C5  C3 ├
295
 
296
 
297
: ONLY ( -- ) \ 94 SEARCH EXT
298
 
299
5A22C6  E0 22 5A 00  00 04 4F 4E  4C 59 9D 22  5A 00 00 00 р"Z...ONLYЭ"Z...
300
5A22D6  00 00 00 00  00 00 00 00  00 00 ..........
301
 
302
\ Установить список поиска на зависящий от реализации минимальный список поиска.
303
\ Минимальный список поиска должен включать слова FORTH-WORDLIST и SET-ORDER.
304
  CONTEXT CELL+ 0!
305
 
306
5A22E0  E8 03 05 FB  FF 8D 40 04  C7 00 00 00  00 00 8B 45 ш..√ Н@.╟.....ЛE
307
5A22F0  00 8D 6D 04 .Нm.
308
 
309
  FORTH
310
 
311
5A22F4  E8 B7 FF FF  FF ш╖   
312
 
313
;
314
 
315
5A22F9  C3 ├
316
 
317
 
318
: ALSO ( -- ) \ 94 SEARCH EXT
319
 
320
5A22FA  10 23 5A 00  00 04 41 4C  53 4F CB 22  5A 00 00 00 .#Z...ALSO╦"Z...
321
5A230A  00 00 00 00  00 00 ......
322
 
323
\ Преобразовать порядок поиска, состоящий из widn, ...wid2, wid1 (где wid1
324
\ просматривается первым) в widn,... wid2, wid1, wid1. Неопределенная ситуация
325
\ возникает, если в порядке поиска слишком много списков.
326
 CONTEXT CONTEXT CELL+ CONTEXT_SIZE CMOVE> ;
327
 
328
5A2310  E8 D3 04 FB  FF E8 CE 04  FB FF 8D 40  04 E8 5E FC ш╙.√ ш╬.√ Н@.ш^№
329
5A2320  FF FF E8 E9  B4 FF FF C3   шщ┤  ├
330
 
331
 
332
 
333
: PREVIOUS ( -- ) \ 94 SEARCH EXT
334
 
335
5A2328  40 23 5A 00  00 08 50 52  45 56 49 4F  55 53 FF 22 @#Z...PREVIOUS "
336
5A2338  5A 00 00 00  00 00 00 00 Z.......
337
 
338
\ Преобразовать порядок поиска, состоящий из widn, ...wid2, wid1 (где wid1
339
\ просматривается первым) в widn,... wid2. Неопределенная ситуация возникает,
340
\ если порядок поиска был пуст перед выполнением PREVIOUS.
341
  _PREVIOUS ;
342
 
343
5A2340  E8 9B 9D FC  FF C3 шЫЭ№ ├
344
 
345
 
346
: _PREVIOUS ( -- ) \ 94 SEARCH EXT
347
 
348
5A2346  60 23 5A 00  00 09 5F 50  52 45 56 49  4F 55 53 2D `#Z..._PREVIOUS-
349
5A2356  23 5A 00 00  00 00 00 00  00 00 #Z........
350
 
351
 CONTEXT CELL+ CONTEXT CONTEXT_SIZE CMOVE  ;
352
 
353
5A2360  E8 83 04 FB  FF 8D 40 04  E8 7B 04 FB  FF E8 0E FC шГ.√ Н@.ш{.√ ш.№
354
5A2370  FF FF E8 49  B4 FF FF C3   шI┤  ├
355
 
356
 
357
: VOC-NAME. ( wid -- ) \ напечатать имя списка слов, если он именован
358
 
359
5A2378  90 23 5A 00  00 09 56 4F  43 2D 4E 41  4D 45 2E 4B Р#Z...VOC-NAME.K
360
5A2388  23 5A 00 00  00 00 00 00 #Z......
361
 
362
  DUP FORTH-WORDLIST = IF DROP ." FORTH"  EXIT THEN
363
 
364
5A2390  89 45 FC 8D  6D FC E8 59  FE FA FF 33  45 00 8B 45 ЙE№Нm№шY■· 3E.ЛE
365
5A23A0  04 8D 6D 08  0F 85 18 00  00 00 8B 45  00 8D 6D 04 .Нm..Е....ЛE.Нm.
366
5A23B0  E8 A7 FD F9  FF 05 46 4F  52 54 48 00  E8 2F 9A FC шз¤∙ .FORTH.ш/Ъ№
367
5A23C0  FF C3  ├
368
 
369
\  DUP KERNEL-WORDLIST = IF DROP ." KERNEL"  EXIT THEN
370
  DUP CELL+ @ DUP IF ID. DROP ELSE DROP ." :" U. THEN
371
 
372
5A23C2  89 45 FC 8B  40 04 8D 6D  FC 0B C0 74  10 E8 CC F7 ЙE№Л@.Нm№.└t.ш╠ў
373
5A23D2  FF FF 8B 45  00 8D 6D 04  E9 20 00 00  00 8B 45 00   ЛE.Нm.щ ...ЛE.
374
5A23E2  8D 6D 04 E8  72 FD F9 FF  09 3C 4E 4F  4E 41 4D 45 Нm.шr¤∙ .
375
5A23F2  3E 3A 00 E8  F6 99 FC FF  E8 09 3D FA  FF >:.шЎЩ№ ш.=· 
376
 
377
;
378
 
379
5A23FF  C3 ├
380
 
381
 
382
: ORDER ( -- ) \ 94 SEARCH EXT
383
 
384
5A2400  10 24 5A 00  00 05 4F 52  44 45 52 7D  23 5A 00 00 .$Z...ORDER}#Z..
385
 
386
\ Показать списки в порядке поиска, от первого просматриваемого списка до
387
\ последнего. Также показать список слов, куда помещаются новые определения.
388
\ Формат изображения зависит от реализации.
389
\ ORDER может быть реализован с использованием слов форматного преобразования
390
\ чисел. Следовательно он может разрушить перемещаемую область,
391
\ идентифицируемую #>.
392
  GET-ORDER ." Context: "
393
 
394
5A2410  E8 CB FD FF  FF E8 42 FD  F9 FF 09 43  6F 6E 74 65 ш╦¤  шB¤∙ .Conte
395
5A2420  78 74 3A 20  00 E8 C6 99  FC FF xt: .ш╞Щ№ 
396
 
397
 
398
 
399
5A242A  89 45 FC 33  C0 8D 6D 04  BB 64 24 5A  00 3B 45 F8 ЙE№3└Нm.╗d$Z.;E°
400
5A243A  75 05 8B 45  FC FF E3 53  BB 00 00 00  80 2B 5D F8 u.ЛE№ уS╗...А+]°
401
5A244A  53 03 D8 53  8B 45 FC E8  3A FF FF FF  E8 9D 38 FA S.╪SЛE№ш:   шЭ8·
402
5A245A  FF FF 04 24  71 F1 8D 64  24 0C E8 7F  36 FA FF   .$qёНd$.ш6· 
403
 
404
  ." Current: " GET-CURRENT VOC-NAME. CR
405
 
406
5A2469  E8 EE FC F9  FF 09 43 75  72 72 65 6E  74 3A 20 00 шю№∙ .Current: .
407
5A2479  E8 72 99 FC  FF 89 45 FC  8B 87 58 18  00 00 8D 6D шrЩ№ ЙE№ЛЗX...Нm
408
5A2489  FC E8 01 FF  FF FF E8 54  36 FA FF №ш.   шT6· 
409
 
410
;
411
 
412
5A2494  C3 ├
413
 
414
 
415
: LATEST ( -> NFA )
416
 
417
5A2495  B0 24 5A 00  00 06 4C 41  54 45 53 54  05 24 5A 00 ░$Z...LATEST.$Z.
418
5A24A5  00 00 00 00  00 00 00 00  00 00 00 ...........
419
 
420
  CURRENT @ @
421
 
422
5A24B0  E8 1B 4B FA  FF 8B 00 8B  00 ш.K· Л.Л.
423
 
424
;
425
 
426
5A24B9  C3 ├
427
 
428
ZZ=D0