-
Notifications
You must be signed in to change notification settings - Fork 0
/
FORTH.LST
8105 lines (7705 loc) · 324 KB
/
FORTH.LST
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
Turbo Assembler Version 3.1 01/12/20 10:24:08 Page 1
forth.asm
1 ; 253 á«®¢ head
2 ; 103 á«®¢ ¨á¯®«ì§ãîâ $col
3 ; 9 á«®¢ ¨á¯®«ì§ã¥â $con
4 ; 29 á«®¢ ¨á¯®«ì§ã¥â $use
5 ; 1 á«®¢® forth
6
7 masm
8 .8086
9 0000 .MODEL SMALL
10 LOCALS
11 =0000 LINK=0
12 ; Œ ªà®®¯à¥¤¥«¥¨ï
13 ; Ž¯¨á ¨¥ ¯à¨¬¨â¨¢®¢ ¨ á«®¢ ¢ë᮪®£® ã஢ï
14
15 HEAD MACRO length, name, lchar, labl, code
16 LINK$=$
17 DB length ; NFA 7 ¡¨â à ¢¥ 1.
18 ; 6 - ¯à¨§ ª immediate. 5- á«®¢® ¥ ®¯¨á ® smudge
19 IFNB <name>
20 DB name
21 ENDIF
22 DB lchar ; ¯®á«¥¤¨© ᨬ¢®« á«®¢ + 128 (7 ¡¨â = 1).
23
24 DW LINK ; LFA ¯à¥¤ë¤ã饥 á«®¢® ( ¤à¥á ¯¥à¢®£® ᨬ¢®« ¨¬¥¨)
25 LINK=LINK$
26
27 labl LABEL FAR ; CFA
28 IFNB <code> ;
29 DW code
30 ELSE
31 DW $+2
32 ENDIF
33 ENDM
34 HEAD2 MACRO length, name, lchar, labl, code
35 LINK$=$
36 DB length ; NFA 7 ¡¨â à ¢¥ 1.
37 ; 6 - ¯à¨§ ª immediate. 5- á«®¢® ¥ ®¯¨á ® smudge
38 IFNB <name>
39 DB '&name','>'
40 ENDIF
41 DB lchar ; ¯®á«¥¤¨© ᨬ¢®« á«®¢ + 128 (7 ¡¨â = 1).
42
43 DW LINK ; LFA ¯à¥¤ë¤ã饥 á«®¢® ( ¤à¥á ¯¥à¢®£® ᨬ¢®« ¨¬¥¨)
44 LINK=LINK$
45
46 labl LABEL FAR ; CFA
47 IFNB <code> ;
48 DW code
49 ELSE
50 DW $+2
51 ENDIF
52 ENDM
53
54 =0001 debug equ 1
55 NEXT MACRO ; ¯¥à¥å®¤ ª ¨á¯®«¥¨î á«¥¤ãî饣® á«®¢
56 local m1
57 LODSW ; DS:[SI] -> AX ; SI = SI + 2
Turbo Assembler Version 3.1 01/12/20 10:24:08 Page 2
forth.asm
58 MOV BX, AX ; BX à ¢¥ CFA á«¥¤ãî饣® á«®¢
59 ; ------ call debugger --------
60 IF debug
61 cmp byte ptr [di+102Q], 0
62 jz m1
63 call printWORD
64 call pause
65 m1:
66 ENDIF
67 ; -----------------------------
68 JMP WORD PTR [BX]
69 ENDM
70
71
72 0000 ARRAY SEGMENT
73 0000 0000 0000 $TIME DW 0,0 ; TIMER COUNTER
74 0004 0000 $DATE DW 0 ; DATE
75
76 ; ‘¥£¬¥â á⥪ ¨ á«®¢ àì ¯®«ì§®¢ ⥫ï à §¬¥é¥ ¢ ª®æ¥ ⥪áâ
77 ; ¨â¥à¯à¥â â®à . „«ï ¢¥àᨨ, § ¯¨áë¢ ¥¬®© ¢ ‡“, ¨å 㦮
78 ; à §¬¥áâ¨âì §¤¥áì.
79
80 0006 03*(0000 0200*(0000)+ DSKBUF DW 3 DUP(0,512 DUP(0),0) ; ªà ë¥ ¡ãä¥àë 1024 ¡ ©â
81 0000)
82 0C12 0000 ENDBUF DW 0 ; 6 1034 (40Ah) 2062(80Eh) ¤à¥á ¡ãä¥à®¢
83
84 0C14 5C*(0000) XTIB DW 92 DUP(0) ; ‚室®© ¡ãä¥à
85 0CCC 0000 0000 XR0 DW 0,0 ; ‘⥪ ¢®§¢à ⮢ à áâ¥â ¢ ®¡« áâì
86 ; ¬¥ìè¨å ¤à¥á®¢. ADD BP - ã¡à âì ¤ ë¥
87 0CD0 66*(0000) XUP DW 102 DUP(0) ; USER-®¡« áâì ¥¥ 㪠§ë¢ ¥â DI
88
89 0D9C 2FB1r $STI DW TASK-7 ; ; ‘â à⮢ ï â ¡«¨æ PFA á«®¢ TASK
90 0D9E 0CD0r $US DW XUP ; ; ¤à¥á user ®¡« áâ¨
91 ; ¯¥à¥¬¥ë¥
92 0DA0 0080r $STK DW XS0 ;+6 ; SO
93 0DA2 0CCCr $RS DW XR0 ;+8 ; RO á⥪ ¢®§¢à ⮢
94 0DA4 0C14r DW XTIB ;+10 ; ¢å®¤®© ¡ãä¥à
95 0DA6 001F DW 1Fh ;+12 ; WIDTH 31 ¡ãª¢
96 0DA8 0000 DW 0 ;+14 ; WARNING
97 0DAA 3033r DW XDP ;+16 ; á«®¢ àì FENCE (§ ¡®à)
98 0DAC 3033r DW XDP ;+18 ; DP
99 0DAE 2FAFr DW XVOC ;+20 ; á«®¢ àì VOCL ¢ á«®¢¥ Forth
100 0DB0 0006r $BUF DW DSKBUF ;+22 ; íªà ë© ¡ãä¥à FIRST
101 0DB2 0C12r DW ENDBUF ;+24 ¨«¨ 30Q ; LIMIT
102
103 ASSUME CS:ARRAY, DS:ARRAY, ES:ARRAY, SS:STCK
104
105
106 0DB4 $INI PROC FAR
107 0DB4 EB 09 90 JMP ENT
108 ; ** PRIMITIVES **
109 HEAD 83h,'IN',311Q,INIT ;INI
1 110 =ARRAY:0DB7 LINK$=$
1 111 0DB7 83 DB 83h ; NFA 7 ¡¨â à ¢¥ 1.
1 112 ; 6 - ¯à¨§ ª immediate. 5- á«®¢® ¥ ®¯¨á ® smudge
1 113 0DB8 49 4E DB 'IN'
1 114 0DBA C9 DB 311Q ; ¯®á«¥¤¨© ᨬ¢®« á«®¢ + 128 (7 ¡¨â = 1).
Turbo Assembler Version 3.1 01/12/20 10:24:08 Page 3
forth.asm
1 115
1 116 0DBB 0000 DW LINK ; LFA ¯à¥¤ë¤ã饥 á«®¢® ( ¤à¥á ¯¥à¢®£® ᨬ¢®« ¨¬¥¨)
1 117 =ARRAY:0DB7 LINK=LINK$
1 118
1 119 0DBD INIT LABEL FAR ; CFA
1 120 0DBD 0DBFr DW $+2
121 0DBF B9 0000s ENT: MOV CX, ARRAY
122 0DC2 8E D9 MOV DS, CX ; “áâ ®¢ª DX
123 0DC4 8E C1 MOV ES, CX
124 0DC6 A1 0D9Cr MOV AX, $STI ; ‚®ááâ ®¢«¥¨¥ á«®¢ àï (PFA á«®¢ TASK)
125 0DC9 BE 2FADr LEA SI, FORTH+6 ; €¤à¥á ¬¥áâ 宦¤¥¨ï ¢ PFA forth
126 0DCC 89 04 MOV [SI], AX ;
127 0DCE 8B 36 0DB0r MOV SI, $BUF
128 0DD2 B9 06CB MOV CX, 1739 ; “áâ ®¢ª áç¥â稪 1730
129 0DD5 C7 04 0000 XXX: MOV WORD PTR [SI],0 ; Ž¡ã«¥¨¥ ¬ áᨢ®¢
130 0DD9 83 C6 02 ADD SI, 2
131 0DDC E2 F7 LOOP XXX
132
133 ; INIT 'OFFSET, USE, PREV
134 0DDE 8B 1E 0D9Er MOV BX, $US ; xup
135 0DE2 8B 0E 0DB0r MOV CX, $BUF ; TO 'USE'
136 0DE6 89 4F 3A MOV [BX]+72Q,CX ; USE ? ¤à¥á ¡«®ª
137 0DE9 89 4F 3C MOV [BX]+74Q,CX ; PREV ? ¤à¥á ¡«®ª
138 0DEC C7 47 42 0000 MOV word ptr [BX]+102Q,00h ; ®â« ¤ª ¢ëª«îç¥
139 0DF1 B9 000A MOV CX, 10 ; “áâ ®¢ª áç¥â稪 USER (14Q ¤® 2 ¬¥ìè¥ ã¦¥)
140 0DF4 8B 3E 0D9Er MOV DI, $US ; ‡ ¯¨áì ¤à¥á ®¡« á⨠USER
141 0DF8 83 C7 06 ADD DI, 6 ; ¯®ç¥¬ã 6.... ? User ¯¥à¥¬¥ë¥ ç¨ îâáï á 6 ¤à¥á
142 0DFB BE 0DA0r LEA SI, $STK ; ‡ ¯¨áì ç «ì®£® ¤à¥á
143 ; § ¯®«ï¥¬ ç «ìë¥ § ç¥¨ï ¯¥à¥¬¥ëå
144 0DFE F3> A5 REP MOVS WORD PTR ES:[DI], WORD PTR DS:[SI]
145 0E00 8B 2E 0DA2r MOV BP, $RS ; “áâ ®¢ª ç «ì®£® § 票ï
146 ; 㪠§ ⥫ï á⥪ ¢®§¢à ⮢
147 ; ¯¥à¥á¥ª ¥âáï á ®¡« áâìî TIB
148 ; RS à áâ¥â ¢ ®¡« áâì á ¬¥ì訬¨ ¤à¥á ¬¨
149 0E04 8B 3E 0D9Er MOV DI, $US
150 0E08 C7 45 1A 0007 MOV WORD PTR [DI+32Q],7 ; “áâ ®¢ª 梥⠢뢮¤ ⥪áâ
151 0E0D C7 45 22 0000 MOV WORD PTR [DI+42Q],0 ; ‘¡à®á ä« £ ¯¥ç â¨
152 0E12 BE 0E26r LEA SI, GO$
153 NEXT
1 154 0E15 AD LODSW ; DS:[SI] -> AX ; SI = SI + 2
1 155 0E16 8B D8 MOV BX, AX ; BX à ¢¥ CFA á«¥¤ãî饣® á«®¢
1 156 ; ------ call debugger --------
1 157 0E18 80 7D 42 00 cmp byte ptr [di+102Q], 0
1 158 0E1C 74 06 jz ??0000
1 159 0E1E E8 0131 call printWORD
1 160 0E21 E8 0010 call pause
1 161 0E24 ??0000:
1 162 ; -----------------------------
1 163 0E24 FF 27 JMP WORD PTR [BX]
164 ; §¤¥áì ¨áâàãªæ¨¨ ï§ëª ä®àâ. 㪠§ â¥«ì ¨å ¢ SI
165 0E26 18A3r 1E06r 2FA7r + GO$: DW SPSTO,DECIMA,FORTH,DEFIN, ONE,LOA, quit; § £à㧪 ¯¥à¢®£® íªà
166 1EC4r 2064r 29F9r +
167 27CDr
168 0E34 $INI ENDP
169
170 include debug.asm
1 171 ; обработка Ð½Ð°Ð¶Ð°Ñ‚Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ
Turbo Assembler Version 3.1 01/12/20 10:24:08 Page 4
forth.asm
1 172 0E34 pause proc
1 173 0E34 @start:
1 174 0E34 33 C0 xor ax, ax
1 175 0E36 CD 16 int 16h ; AL = ASCII Ñимвол (еÑли AL=0, AH Ñодержит +
176 раÑширенный код ASCII )
1 177 ; AH = Ñканкод или раÑширенный код ASCII
1 178 0E38 80 FC 10 cmp ah, 10h ; клавиша Q (quit)
1 179 0E3B 74 20 je @e
1 180 0E3D 80 FC 20 cmp ah, 20h ; клавиша D (debug off)
1 181 0E40 74 2E je @d
1 182 0E42 80 FC 1F cmp ah, 1Fh ; клавиша S (show parameters stack)
1 183 0E45 74 24 je @s
1 184 0E47 80 FC 13 cmp ah, 13h ; клавиша R (show return stack)
1 185 0E4A 74 1A je @rs
1 186 0E4C 80 FC 31 cmp ah, 31h ; клавиша N (next step)
1 187 0E4F 74 24 je @r
1 188 0E51 80 FC 39 cmp ah, 39h ; клавиша SPACE (next step)
1 189 0E54 74 1F je @r
1 190 0E56 80 FC 11 cmp ah, 11h ; клавиша W(next word from dict)
1 191 0E59 74 06 je @v
1 192 0E5B EB D7 jmp @start
1 193 0E5D B4 4C @e: mov ah, 4Ch ; выход из программы
1 194 0E5F CD 21 int 21h
1 195 0E61 E8 0012 @v: call showWD
1 196 0E64 EB CE jmp @start
1 197 0E66 E8 005B @rs: call showRS
1 198 0E69 EB C9 jmp @start
1 199 0E6B E8 0084 @s: call showStack
1 200 0E6E EB C4 jmp @start
1 201 0E70 C7 45 42 0000 @d: mov word ptr [DI]+102Q,00h ; отладка выключена
1 202 ;jmp @start
1 203 0E75 C3 @r: ret
1 204 0E76 pause endp
1 205
1 206 0E76 proc showWD
1 207 0E76 57 push di
1 208 0E77 53 push bx
1 209 0E78 BA 0E92r mov dx, offset @@caption
1 210 0E7B E8 013C call outText
1 211 0E7E BF 0E9Fr mov di,OFFSET @@ASCII ;
1 212 0E81 8B 04 mov ax, [si]
1 213 0E83 E8 00A0 call toHex
1 214 0E86 BA 0E9Fr mov dx, offset @@ASCII
1 215 0E89 E8 012E call outText
1 216 0E8C E8 0120 call outCR
1 217 0E8F 5B pop bx
1 218 0E90 5F pop di
1 219 0E91 C3 ret
1 220 0E92 4E 45 58 54 20 57 4F+ @@caption DB "NEXT WORD: $"
221 52 44 3A 20 20 24
1 222 0E9F 30 30 30 30 20 20 20+ @@ASCII DB "0000 $"
223 20 24
1 224 0EA8 showWD endp
1 225
1 226 ; печать дампа памÑти в порÑдке Ñтека
1 227 ; cÑ… - чиÑло байт
1 228 ; bx - Ð°Ð´Ñ€ÐµÑ Ð¿Ð°Ð¼Ñти
Turbo Assembler Version 3.1 01/12/20 10:24:08 Page 5
forth.asm
1 229 ; dx - Ð°Ð´Ñ€ÐµÑ Ñтроки
1 230 0EA8 showStDump proc
1 231 0EA8 D1 E9 shr cx, 1 ; байты в Ñлова
1 232 0EAA 0B C9 or cx , cx
1 233 0EAC 74 15 jz @@r
1 234 0EAE 8C D0 mov ax, ss
1 235 0EB0 8E C0 mov es, ax
1 236 0EB2 @@l:
1 237 0EB2 4B dec bx
1 238 0EB3 4B dec bx
1 239 0EB4 26: 8B 07 mov ax, es:[bx]
1 240 0EB7 53 push bx
1 241 0EB8 8B FA mov di, dx
1 242 0EBA E8 0069 call toHex
1 243 ;mov dx, offset @@ASCII
1 244 0EBD E8 00FA call outText
1 245 0EC0 5B pop bx
1 246 0EC1 E2 EF loop @@l
1 247 0EC3 @@r:
1 248 0EC3 C3 ret
1 249 0EC4 showStDump endP
1 250
1 251 ; Ñтек возвратов
1 252 0EC4 showRS proc
1 253 0EC4 57 push di
1 254 0EC5 56 push si
1 255 0EC6 06 push es
1 256 0EC7 53 push bx
1 257 0EC8 BA 0EE6r mov dx, offset @@caption
1 258 0ECB E8 00EC call outText
1 259 0ECE B9 0CCCr mov cx, offset XR0
1 260 0ED1 8B DD mov bx, BP
1 261 0ED3 2B CB sub cx, bx
1 262 0ED5 BA 0EECr mov dx, offset @@ASCII
1 263 0ED8 BB 0CCCr mov bx, offset XR0
1 264 0EDB E8 FFCA call showStDump
1 265 0EDE @@r:
1 266 0EDE E8 00CE call outCR
1 267 0EE1 5B pop bx
1 268 0EE2 07 pop es
1 269 0EE3 5E pop si
1 270 0EE4 5F pop di
1 271 0EE5 C3 ret
1 272 0EE6 52 53 3A 20 20 24 @@caption DB "RS: $"
1 273 0EEC 30 30 30 30 20 24 @@ASCII DB "0000 $"
1 274 0EF2 showRS endP
1 275
1 276 ; Ñтек параметров
1 277 0EF2 showStack proc
1 278 0EF2 57 push di
1 279 0EF3 56 push si
1 280 0EF4 06 push es
1 281 0EF5 53 push bx
1 282 0EF6 BA 0F17r mov dx, offset @@caption
1 283 0EF9 E8 00BE call outText
1 284 0EFC B9 0080 mov cx, 80h
1 285 0EFF 8B DC mov bx, SP
Turbo Assembler Version 3.1 01/12/20 10:24:08 Page 6
forth.asm
1 286 0F01 83 C3 0C add bx, 2*6 ; Ñтолько лишних Ñлементов Ñтеке
1 287 0F04 2B CB sub cx, bx
1 288 0F06 BB 0080 mov bx, 80h
1 289 0F09 BA 0F20r mov dx, offset @@ASCII
1 290 0F0C E8 FF99 call showStDump
1 291 0F0F @@r:
1 292 0F0F E8 009D call outCR
1 293 0F12 5B pop bx
1 294 0F13 07 pop es
1 295 0F14 5E pop si
1 296 0F15 5F pop di
1 297 0F16 C3 ret
1 298 0F17 53 54 41 43 4B 3A 20+ @@caption DB "STACK: $"
299 20 24
1 300 0F20 30 30 30 30 20 24 @@ASCII DB "0000 $"
1 301 0F26 showStack endP
1 302
1 303 ; AX- значение Ð´Ð»Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸ в 16 виде
1 304 ; di - Ð°Ð´Ñ€ÐµÑ Ñтроки Ð´Ð»Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð°
1 305 0F26 toHex PROC
1 306 0F26 51 push cx
1 307 0F27 B1 04 mov cl,4 ; number of ASCII
1 308 0F29 D1 C0 D1 C0 D1 C0 D1+ @@1: rol ax,4 ; 1 Nibble (start with highest byte)
309 C0
1 310 0F31 8A D8 mov bl,al
1 311 0F33 80 E3 0F and bl,0Fh ; only low-Nibble
1 312 0F36 80 C3 30 add bl,30h ; convert to ASCII
1 313 0F39 80 FB 39 cmp bl,39h ; above 9?
1 314 0F3C 76 03 jna short @@2
1 315 0F3E 80 C3 07 add bl,7 ; "A" to "F"
1 316 0F41 88 1D @@2: mov [di],bl ; store ASCII in buffer
1 317 0F43 47 inc di ; increase target address
1 318 0F44 FE C9 dec cl ; decrease loop counter
1 319 0F46 75 E1 jnz @@1 ; jump if cl is not equal 0 (zeroflag is not set)
1 320 0F48 59 pop cx
1 321 0F49 C3 ret
1 322 0F4A toHex endP
1 323
1 324 ; di- Ð°Ð´Ñ€ÐµÑ Ð±ÑƒÑ„ÐµÑ€Ð°
1 325 ; cx - чиÑло Ñимволов
1 326 ; заполнение пробелом
1 327 0F4A blankBuffer proc
1 328 0F4A 57 push di
1 329 0F4B FC cld
1 330 0F4C B0 20 mov al, 32
1 331 0F4E F3> AA rep stosb
1 332 0F50 5F pop di
1 333 0F51 C3 ret
1 334 0F52 blankBuffer endp
1 335
1 336 ; вывод адреÑа и имени Ñлова
1 337 ; AX- значение адреÑа
1 338 0F52 printWORD proc
1 339 0F52 57 push di
1 340 0F53 56 push si
1 341 0F54 53 push bx
1 342 0F55 50 push ax
Turbo Assembler Version 3.1 01/12/20 10:24:08 Page 7
forth.asm
1 343 0F56 BF 0F92r mov di,OFFSET ASCII ; get the offset address
1 344 0F59 B9 0019 mov cx, 25
1 345 0F5C E8 FFEB call blankBuffer
1 346 ; печать адреÑа Ñлова
1 347 0F5F 8B C6 mov ax, si
1 348 0F61 2D 0002 sub ax, 2
1 349 0F64 E8 FFBF call toHex
1 350 0F67 47 inc di
1 351 0F68 47 inc di
1 352 ; печать CFA Ñлова
1 353 0F69 58 pop ax
1 354 0F6A 50 push ax
1 355 0F6B E8 FFB8 call toHex
1 356 0F6E 47 inc di ; вывод имени Ñлова поÑле его адреÑа
1 357 0F6F 5B pop bx ; Ð°Ð´Ñ€ÐµÑ Ñлова CFA?
1 358 ;mov al, byte ptr [bx-3] ; поÑледний Ñимвол Ñлова
1 359 0F70 83 EB 03 SUB bx, 3 ;
1 360 0F73 mm: ; ищем поле длины
1 361 0F73 4B dec bx
1 362 0F74 80 3F 00 CMP BYTE PTR [bx], 0
1 363 0F77 79 FA JNS mm ; JUMP IF POSITIVE
1 364 0F79 8B 0F mov cx, [bx] ; длина Ñлова + вÑÑкие Ñлуж. полÑ
1 365 0F7B 83 E1 3F and cx, 003Fh
1 366 0F7E mmm1:
1 367 0F7E 43 inc bx
1 368 0F7F 8A 07 mov al, byte ptr [bx]
1 369 0F81 24 7F and al, 7Fh ; поÑледний Ñимвол увеличен на 80h
1 370 0F83 88 05 mov [di],al
1 371 0F85 47 inc di
1 372 0F86 E2 F6 loop mmm1
1 373 ; Print string
1 374 0F88 BA 0F92r mov dx,OFFSET ASCII ; DOS 1+ WRITE STRING TO STANDARD OUTPUT
1 375 0F8B E8 002C call outText
1 376 0F8E 5B pop bx
1 377 0F8F 5E pop si
1 378 0F90 5F pop di
1 379 0F91 C3 ret
1 380 0F92 30 30 30 30 3A 20 30+ ASCII DB "0000: 0000 ",0Dh,0Ah,"$" ; buffer for ASCII string
381 30 30 30 20 20 20 20+
382 20 20 20 20 20 20 20+
383 20 20 20 20 20 0D 0A+
384 24
1 385 0FAF printWORD endP
1 386
1 387 0FAF outCR proc
1 388 0FAF B4 09 mov ah,9 ; DS:DX->'$'-terminated string
1 389 0FB1 BA 0FB7r lea dx, @@cr
1 390 0FB4 CD 21 int 21h ; (using pipe character">") or output to printer
1 391 0FB6 C3 ret
1 392 0FB7 0D 0A 24 @@cr DB 0Dh, 0Ah, "$"
1 393 0FBA outCR endp
1 394
1 395 ; вывод текÑта
1 396 0FBA outText proc
1 397 0FBA B4 09 mov ah,9 ; DS:DX->'$'-terminated string
1 398 0FBC CD 21 int 21h ; (using pipe character">") or output to printer
1 399 0FBE C3 ret
Turbo Assembler Version 3.1 01/12/20 10:24:08 Page 8
forth.asm
1 400 0FBF outText endp
1 401
402
403 ; BX - WP 室¨âáï ¤à¥á ¨á¯®«ï¥¬®£® á«®¢
404 ; SI - IP-ॣ¨áâà ¤®«¦¥ á®åà ïâìáï
405 ; DI - 㪠§ â¥«ì ®¡« á⨠USER
406 ; BP - 㪠§ ⥫ì á⥪ ¢®§¢à ⮢
407 ; SP - 㪠§ ⥫ì á⥪ ¯ à ¬¥â஢
408
409 HEAD 87h,'EXECUT',305Q,EXEC ;
1 410 =ARRAY:0FBF LINK$=$
1 411 0FBF 87 DB 87h ; NFA 7 ¡¨â à ¢¥ 1.
1 412 ; 6 - ¯à¨§ ª immediate. 5- á«®¢® ¥ ®¯¨á ® smudge
1 413 0FC0 45 58 45 43 55 54 DB 'EXECUT'
1 414 0FC6 C5 DB 305Q ; ¯®á«¥¤¨© ᨬ¢®« á«®¢ + 128 (7 ¡¨â = 1).
1 415
1 416 0FC7 0DB7r DW LINK ; LFA ¯à¥¤ë¤ã饥 á«®¢® ( ¤à¥á ¯¥à¢®£® ᨬ¢®« ¨¬¥¨)
1 417 =ARRAY:0FBF LINK=LINK$
1 418
1 419 0FC9 EXEC LABEL FAR ; CFA
1 420 0FC9 0FCBr DW $+2
421 ; ¢ á⥪¥ ¤à¥á ¯®«ï CFA (… PFA)
422 0FCB 5B POP BX
423 0FCC FF 27 JMP WORD PTR [ BX ]
424
425 HEAD 83h,'LI',324Q,LIT ; LIT
1 426 =ARRAY:0FCE LINK$=$
1 427 0FCE 83 DB 83h ; NFA 7 ¡¨â à ¢¥ 1.
1 428 ; 6 - ¯à¨§ ª immediate. 5- á«®¢® ¥ ®¯¨á ® smudge
1 429 0FCF 4C 49 DB 'LI'
1 430 0FD1 D4 DB 324Q ; ¯®á«¥¤¨© ᨬ¢®« á«®¢ + 128 (7 ¡¨â = 1).
1 431
1 432 0FD2 0FBFr DW LINK ; LFA ¯à¥¤ë¤ã饥 á«®¢® ( ¤à¥á ¯¥à¢®£® ᨬ¢®« ¨¬¥¨)
1 433 =ARRAY:0FCE LINK=LINK$
1 434
1 435 0FD4 LIT LABEL FAR ; CFA
1 436 0FD4 0FD6r DW $+2
437 0FD6 AD LODSW
438 0FD7 50 PUSH AX
439 NEXT
1 440 0FD8 AD LODSW ; DS:[SI] -> AX ; SI = SI + 2
1 441 0FD9 8B D8 MOV BX, AX ; BX à ¢¥ CFA á«¥¤ãî饣® á«®¢
1 442 ; ------ call debugger --------
1 443 0FDB 80 7D 42 00 cmp byte ptr [di+102Q], 0
1 444 0FDF 74 06 jz ??0001
1 445 0FE1 E8 FF6E call printWORD
1 446 0FE4 E8 FE4D call pause
1 447 0FE7 ??0001:
1 448 ; -----------------------------
1 449 0FE7 FF 27 JMP WORD PTR [BX]
450
451 HEAD 86h,'TERMO',316Q,TERMON ; TERMON
1 452 =ARRAY:0FE9 LINK$=$
1 453 0FE9 86 DB 86h ; NFA 7 ¡¨â à ¢¥ 1.
1 454 ; 6 - ¯à¨§ ª immediate. 5- á«®¢® ¥ ®¯¨á ® smudge
1 455 0FEA 54 45 52 4D 4F DB 'TERMO'
1 456 0FEF CE DB 316Q ; ¯®á«¥¤¨© ᨬ¢®« á«®¢ + 128 (7 ¡¨â = 1).
Turbo Assembler Version 3.1 01/12/20 10:24:08 Page 9
forth.asm
1 457
1 458 0FF0 0FCEr DW LINK ; LFA ¯à¥¤ë¤ã饥 á«®¢® ( ¤à¥á ¯¥à¢®£® ᨬ¢®« ¨¬¥¨)
1 459 =ARRAY:0FE9 LINK=LINK$
1 460
1 461 0FF2 TERMON LABEL FAR ; CFA
1 462 0FF2 0FF4r DW $+2
463 ; NumLock, ScrollLock, CapsLock, Ins. ‘®áâ®ï¨¥ íâ¨å ª« ¢¨è § ¯¨áë¢ ¥âáï
464 ; ¢ ®¡« áâì ¤ ëå BIOS ¢ ¤¢ ¡ ©â á ¤à¥á ¬¨ 0000h:0417h ¨ 0000h:0418h
465 0FF4 58 POP AX
466 0FF5 06 PUSH ES
467 0FF6 B9 0000 MOV CX, 0
468 0FF9 8E C1 MOV ES, CX
469 0FFB 26: A3 0417 MOV ES:417H,AX
470 0FFF 07 POP ES
471 NEXT
1 472 1000 AD LODSW ; DS:[SI] -> AX ; SI = SI + 2
1 473 1001 8B D8 MOV BX, AX ; BX à ¢¥ CFA á«¥¤ãî饣® á«®¢
1 474 ; ------ call debugger --------
1 475 1003 80 7D 42 00 cmp byte ptr [di+102Q], 0
1 476 1007 74 06 jz ??0002
1 477 1009 E8 FF46 call printWORD
1 478 100C E8 FE25 call pause
1 479 100F ??0002:
1 480 ; -----------------------------
1 481 100F FF 27 JMP WORD PTR [BX]
482
483 HEAD 87h,'?BRANC',310Q,ZBRAN ; ?BRANCH
1 484 =ARRAY:1011 LINK$=$
1 485 1011 87 DB 87h ; NFA 7 ¡¨â à ¢¥ 1.
1 486 ; 6 - ¯à¨§ ª immediate. 5- á«®¢® ¥ ®¯¨á ® smudge
1 487 1012 3F 42 52 41 4E 43 DB '?BRANC'
1 488 1018 C8 DB 310Q ; ¯®á«¥¤¨© ᨬ¢®« á«®¢ + 128 (7 ¡¨â = 1).
1 489
1 490 1019 0FE9r DW LINK ; LFA ¯à¥¤ë¤ã饥 á«®¢® ( ¤à¥á ¯¥à¢®£® ᨬ¢®« ¨¬¥¨)
1 491 =ARRAY:1011 LINK=LINK$
1 492
1 493 101B ZBRAN LABEL FAR ; CFA
1 494 101B 101Dr DW $+2
495 ; ¯¥à¥å®¤, ¥á«¨ 0 ¢ á⥪¥ (FALSE)
496 101D 58 POP AX
497 101E 3D 0000 CMP AX, 0
498 1021 74 1F JE CNT
499 1023 83 C6 02 ADD SI, 2 ; ¡¥§ ¯¥à¥å®¤ ¯à®¯ã᪠¥¬ á«¥¤ãî饥 á«®¢® ( ¤à¥á ¯¥à¥å®¤ )
500 NEXT
1 501 1026 AD LODSW ; DS:[SI] -> AX ; SI = SI + 2
1 502 1027 8B D8 MOV BX, AX ; BX à ¢¥ CFA á«¥¤ãî饣® á«®¢
1 503 ; ------ call debugger --------
1 504 1029 80 7D 42 00 cmp byte ptr [di+102Q], 0
1 505 102D 74 06 jz ??0003
1 506 102F E8 FF20 call printWORD
1 507 1032 E8 FDFF call pause
1 508 1035 ??0003:
1 509 ; -----------------------------
1 510 1035 FF 27 JMP WORD PTR [BX]
511
512 HEAD 86h,'BRANC',310Q,BRAN ; BRANCH
1 513 =ARRAY:1037 LINK$=$
Turbo Assembler Version 3.1 01/12/20 10:24:08 Page 10
forth.asm
1 514 1037 86 DB 86h ; NFA 7 ¡¨â à ¢¥ 1.
1 515 ; 6 - ¯à¨§ ª immediate. 5- á«®¢® ¥ ®¯¨á ® smudge
1 516 1038 42 52 41 4E 43 DB 'BRANC'
1 517 103D C8 DB 310Q ; ¯®á«¥¤¨© ᨬ¢®« á«®¢ + 128 (7 ¡¨â = 1).
1 518
1 519 103E 1011r DW LINK ; LFA ¯à¥¤ë¤ã饥 á«®¢® ( ¤à¥á ¯¥à¢®£® ᨬ¢®« ¨¬¥¨)
1 520 =ARRAY:1037 LINK=LINK$
1 521
1 522 1040 BRAN LABEL FAR ; CFA
1 523 1040 1042r DW $+2
524 ; ¡¥§ãá«®¢ë© ¯¥à¥å®¤. SI 㪠§ë¢ ¥â ç¨á«® ¨áâàãªæ¨©,
525 ; ª®â®àë¥ ã¦® ¯à®¯ãáâ¨âì
526 1042 03 34 CNT: ADD SI, [SI] ; si ᮤ¥à¦¨â ç¨á«® ¨áâàãªæ¨©,
527 ; ª®â®àë¥ ¥®¡å®¤¨¬® ¯à®¯ãáâ¨âì
528 NEXT
1 529 1044 AD LODSW ; DS:[SI] -> AX ; SI = SI + 2
1 530 1045 8B D8 MOV BX, AX ; BX à ¢¥ CFA á«¥¤ãî饣® á«®¢
1 531 ; ------ call debugger --------
1 532 1047 80 7D 42 00 cmp byte ptr [di+102Q], 0
1 533 104B 74 06 jz ??0004
1 534 104D E8 FF02 call printWORD
1 535 1050 E8 FDE1 call pause
1 536 1053 ??0004:
1 537 ; -----------------------------
1 538 1053 FF 27 JMP WORD PTR [BX]
539
540 HEAD 84h,'(DO',251Q,XDO ; (DO)
1 541 =ARRAY:1055 LINK$=$
1 542 1055 84 DB 84h ; NFA 7 ¡¨â à ¢¥ 1.
1 543 ; 6 - ¯à¨§ ª immediate. 5- á«®¢® ¥ ®¯¨á ® smudge
1 544 1056 28 44 4F DB '(DO'
1 545 1059 A9 DB 251Q ; ¯®á«¥¤¨© ᨬ¢®« á«®¢ + 128 (7 ¡¨â = 1).
1 546
1 547 105A 1037r DW LINK ; LFA ¯à¥¤ë¤ã饥 á«®¢® ( ¤à¥á ¯¥à¢®£® ᨬ¢®« ¨¬¥¨)
1 548 =ARRAY:1055 LINK=LINK$
1 549
1 550 105C XDO LABEL FAR ; CFA
1 551 105C 105Er DW $+2
552 105E 58 POP AX ; ¢ á⥪ ¤ ëå ç «ì®¥ § 票¥ 横«
553 105F 83 ED 02 SUB BP, 2
554 1062 8F 46 00 POP [BP] ; ª®¥ç®¥ § 票¥ 横«
555 1065 83 ED 02 SUB BP, 2
556 1068 89 46 00 MOV WORD PTR [BP],AX ; ¢ á⥪ ¢®§¢à ⮢ ç «ì®¥ § 票¥ 横«
557 ; RS à áâ¥â ¢ áâ®à®ã á ¬¥ì訬¨ ¤à¥á ¬¨
558 ; BP ¤® ¢å®¤ ¢ á«®¢®.
559 ; BP-2 - ª®¥ç®¥ § 票¥ 横«
560 ; BP-4 - ç «ì®¥ § 票¥
561 NEXT
1 562 106B AD LODSW ; DS:[SI] -> AX ; SI = SI + 2
1 563 106C 8B D8 MOV BX, AX ; BX à ¢¥ CFA á«¥¤ãî饣® á«®¢
1 564 ; ------ call debugger --------
1 565 106E 80 7D 42 00 cmp byte ptr [di+102Q], 0
1 566 1072 74 06 jz ??0005
1 567 1074 E8 FEDB call printWORD
1 568 1077 E8 FDBA call pause
1 569 107A ??0005:
1 570 ; -----------------------------
Turbo Assembler Version 3.1 01/12/20 10:24:08 Page 11
forth.asm
1 571 107A FF 27 JMP WORD PTR [BX]
572
573 HEAD 86h,'(LOOP',251Q,XLOOP ; (LOOP)
1 574 =ARRAY:107C LINK$=$
1 575 107C 86 DB 86h ; NFA 7 ¡¨â à ¢¥ 1.
1 576 ; 6 - ¯à¨§ ª immediate. 5- á«®¢® ¥ ®¯¨á ® smudge
1 577 107D 28 4C 4F 4F 50 DB '(LOOP'
1 578 1082 A9 DB 251Q ; ¯®á«¥¤¨© ᨬ¢®« á«®¢ + 128 (7 ¡¨â = 1).
1 579
1 580 1083 1055r DW LINK ; LFA ¯à¥¤ë¤ã饥 á«®¢® ( ¤à¥á ¯¥à¢®£® ᨬ¢®« ¨¬¥¨)
1 581 =ARRAY:107C LINK=LINK$
1 582
1 583 1085 XLOOP LABEL FAR ; CFA
1 584 1085 1087r DW $+2
585 ; à¨à 饨¥ ¨¤¥ªá 横« LOOP ¨ ¬®¦¥â ¡ëâì ¢¥â¢«¥¨¥
586 1087 FF 46 00 INC WORD PTR [BP] ; ç «ì®¥ § 票¥ 㢥«¨ç¨¢ ¥¬
587 108A 8B 46 00 LOP: MOV AX, [BP] ; ¨¤¥ªá
588 108D 3B 46 02 CMP AX, [BP+2] ; ¯à¥¤¥« 横«
589 1090 7C B0 JL CNT
590 1092 83 C5 04 LV: ADD BP, 4 ; 㤠«ï¥¬ ¯ à ¬¥âàë 横«
591 1095 83 C6 02 ADD SI, 2 ; ¯¥à¥å®¤ ª á«¥¤ãîé¥ã á«®¢ã
592 NEXT
1 593 1098 AD LODSW ; DS:[SI] -> AX ; SI = SI + 2
1 594 1099 8B D8 MOV BX, AX ; BX à ¢¥ CFA á«¥¤ãî饣® á«®¢
1 595 ; ------ call debugger --------
1 596 109B 80 7D 42 00 cmp byte ptr [di+102Q], 0
1 597 109F 74 06 jz ??0006
1 598 10A1 E8 FEAE call printWORD
1 599 10A4 E8 FD8D call pause
1 600 10A7 ??0006:
1 601 ; -----------------------------
1 602 10A7 FF 27 JMP WORD PTR [BX]
603
604 HEAD 87h,'(+LOOP',251Q,XPLOO ; (+LOOP)
1 605 =ARRAY:10A9 LINK$=$
1 606 10A9 87 DB 87h ; NFA 7 ¡¨â à ¢¥ 1.
1 607 ; 6 - ¯à¨§ ª immediate. 5- á«®¢® ¥ ®¯¨á ® smudge
1 608 10AA 28 2B 4C 4F 4F 50 DB '(+LOOP'
1 609 10B0 A9 DB 251Q ; ¯®á«¥¤¨© ᨬ¢®« á«®¢ + 128 (7 ¡¨â = 1).
1 610
1 611 10B1 107Cr DW LINK ; LFA ¯à¥¤ë¤ã饥 á«®¢® ( ¤à¥á ¯¥à¢®£® ᨬ¢®« ¨¬¥¨)
1 612 =ARRAY:10A9 LINK=LINK$
1 613
1 614 10B3 XPLOO LABEL FAR ; CFA
1 615 10B3 10B5r DW $+2
616 ; n ---
617 10B5 58 POP AX
618 10B6 01 46 00 ADD [BP], AX
619 10B9 3D 0000 CMP AX, 0
620 10BC 7C 02 JL $LESS
621 10BE EB CA JMP LOP
622 10C0 8B 4E 00 $LESS: MOV CX, [BP] ; ¡®â á ®âà¨æ ⥫ì묨 ¯à¨à 饨ﬨ
623 10C3 39 4E 02 CMP [BP]+2, CX
624 10C6 7E CA JLE LV
625 10C8 E9 FF77 JMP CNT
626
627 HEAD 86h,'(FIND',251Q,PFIND ; PFIND
Turbo Assembler Version 3.1 01/12/20 10:24:08 Page 12
forth.asm
1 628 =ARRAY:10CB LINK$=$
1 629 10CB 86 DB 86h ; NFA 7 ¡¨â à ¢¥ 1.
1 630 ; 6 - ¯à¨§ ª immediate. 5- á«®¢® ¥ ®¯¨á ® smudge
1 631 10CC 28 46 49 4E 44 DB '(FIND'
1 632 10D1 A9 DB 251Q ; ¯®á«¥¤¨© ᨬ¢®« á«®¢ + 128 (7 ¡¨â = 1).
1 633
1 634 10D2 10A9r DW LINK ; LFA ¯à¥¤ë¤ã饥 á«®¢® ( ¤à¥á ¯¥à¢®£® ᨬ¢®« ¨¬¥¨)
1 635 =ARRAY:10CB LINK=LINK$
1 636
1 637 10D4 PFIND LABEL FAR ; CFA
1 638 10D4 10D6r DW $+2
639 ; addr1 addr2 --- pfa b tf (ok) ®¯¥à â®à ¯®¨áª
640 ; €¤à¥á áâப¨ NFA => PFA ¤«¨ TRUE/FALSE (!ॠ«ì® ‘FA !)
641 10D6 58 POP AX ; NFA ¯®á«¥¤¥£® á«®¢ ¢ context á«®¢ à¥
642 10D7 59 POP CX ; addr1 áâப ¤«ï ¯®¨áª . ¯¥à¢ë© ¡ ©â ¤«¨ ®¡à §æ
643 10D8 55 PUSH BP ; á®åà ¥¨¥ ᮤ¥à¦¨¬®£® ॣ¨áâ஢
644 10D9 56 PUSH SI ; --
645 10DA 57 PUSH DI ; --
646 10DB 8B F1 MOV SI, CX ; ¤à¥á ®¡à §æ
647 10DD 2B ED SUB BP, BP ;
648 10DF 8B F8 MOV DI, AX ; NFA ¯®á«¥¤¥£® á«®¢ ¢ á«®¢ à¥
649 10E1 8B 14 MOV DX,WORD PTR [SI] ; ¤«¨ áâப¨ ¯®¨áª ¨ ¯¥à¢ë© ᨬ¢®«
650 10E3 81 E2 7F7F AND DX, 77577Q ; 7F7f - á¡à®á áâ àè¨å ¡¨â®¢. ª ¦¥âáï «¨è¨¬
651 10E7 FC CLD ; DF=0 (¢¯¥à¥¤)
652 10E8 8B 0D FAST: MOV CX,WORD PTR [DI] ;
653 10EA 81 E1 7F3F AND CX, 77477Q ; á¡à®á 7-ëå ¨ 6 ¡¨â ¢ ¯¥à¢®¬ ¡ ©â¥
654 10EE 3B D1 CMP DX, CX ; áà ¢¨¬ ¤«¨ã ¨ ¯¥à¢ë© ᨬ¢®«
655 10F0 74 14 JE SLOW ; ¥á«¨ à ¢ë, ¬®¦¥â â®, çâ® ¨é¥¬
656 10F2 83 3D 00 MATCH: CMP WORD PTR [DI], 0 ; ¨é¥¬ ª®¥æ nfa
657 10F5 78 03 JS $SIG ; BPL
658 10F7 47 INC DI ; á«¥¤ãî騩 ᨬ¢®« ¢ á«®¢¥
659 10F8 EB F8 JMP MATCH
660 10FA 83 C7 02 $SIG: ADD DI, 2 ; ¯¥à¥å®¤ ª ¯®«î LFA
661 10FD 83 3D 00 CMP WORD PTR [DI],0 ; ᯨ᮪ á«®¢ § ª®ç¨«áï
662 1100 74 36 JE FAIL ; LFA =0, ¯®¨áª ¥ 㤠ç¥
663 1102 8B 3D MOV DI,WORD PTR [DI] ; ¯¥à¥å®¤ ª ¤à㣮¬ã á«®¢ã ¢ á«®¢ à¥
664 1104 EB E2 JMP FAST
665 1106 8B 2D SLOW: MOV BP,WORD PTR [DI] ; ¤«¨ ¨ ¯¥à¢ë© ᨬ¢®« ©¤¥®£® á«®¢
666 1108 8B DE MOV BX, SI ; ¤à¥á ®¡à §æ
667 110A EB 0E 90 JMP SLOW1
668 110D 43 $LOOP: INC BX ; ¯¥à¥¡®à ᨬ¢®«®¢
669 110E 8B 07 MOV AX,WORD PTR [BX]
670 1110 8B 0D MOV CX,WORD PTR [DI]
671 1112 81 E1 7FFF AND CX, 77777Q ; 7FFFh
672 1116 3B C1 CMP AX, CX
673 1118 75 D8 JNE MATCH ; ¥ ᮢ¯ «®, ¯¥à¥å®¤ ç «®
674 111A 47 SLOW1: INC DI
675 111B F7 45 FF 8000 TEST WORD PTR -1[DI],100000Q ; 8000h
676 1120 74 EB JZ $LOOP ; ¯¥à¥å®¤, ¥á«¨ 7 ¡¨â €‚… 0
677 1122 8B D5 MOV DX, BP ; ¤«¨ á«®¢
678 1124 83 C7 05 ADD DI, 5 ; PFA ©¤¥®£® á«®¢
679 1127 8B C7 MOV AX, DI
680 1129 5F POP DI ; ¢®ááâ ®¢«¥¨¥ ᮤ¥à¦¨¬®£® ॣ¨áâ஢
681 112A 5E POP SI
682 112B 5D POP BP
683 112C 2D 0002 SUB AX, 2 ; CFA
684 112F 50 PUSH AX
Turbo Assembler Version 3.1 01/12/20 10:24:08 Page 13
forth.asm
685 1130 81 E2 00FF AND DX, 377Q ; FFh ¢ë¤¥«ï¥¬ ¡ ©â ¤«¨ë ¨ ”‹€ƒŽ‚
686 1134 52 PUSH DX ; ¢ á⥪
687 1135 EB 4E 90 JMP TRUE ; “áâ ®¢ª ä« £ " ©¤¥®"
688 1138 5F FAIL: POP DI
689 1139 5E POP SI
690 113A 5D POP BP
691 113B EB 34 90 JMP FALSE
692
693 HEAD 85h,'DIGI',324Q,DIGIT ; DIGIT
1 694 =ARRAY:113E LINK$=$
1 695 113E 85 DB 85h ; NFA 7 ¡¨â à ¢¥ 1.
1 696 ; 6 - ¯à¨§ ª immediate. 5- á«®¢® ¥ ®¯¨á ® smudge
1 697 113F 44 49 47 49 DB 'DIGI'
1 698 1143 D4 DB 324Q ; ¯®á«¥¤¨© ᨬ¢®« á«®¢ + 128 (7 ¡¨â = 1).
1 699
1 700 1144 10CBr DW LINK ; LFA ¯à¥¤ë¤ã饥 á«®¢® ( ¤à¥á ¯¥à¢®£® ᨬ¢®« ¨¬¥¨)
1 701 =ARRAY:113E LINK=LINK$
1 702
1 703 1146 DIGIT LABEL FAR ; CFA
1 704 1146 1148r DW $+2
705 ; ASCII-DIGIT BASE=>DIGIT-VALUE TRUE (FALSE)
706 1148 58 POP AX ; AX=BASE
707 1149 59 POP CX
708 114A 83 E9 30 SUB CX, 60Q ; VALID DIGIT = ASCII-60
709 114D 7C 22 JL FALSE
710 114F 83 F9 09 CMP CX, 9 ; ɇǬ >9
711 1152 7E 08 JLE M09
712 1154 83 E9 07 SUB CX, 7
713 1157 83 F9 0A CMP CX, 10
714 115A 7C 15 JL FALSE
715 115C 3B C8 M09: CMP CX, AX ; …᫨ ¥ ¬¥ìè¥ BASE, â® ®è¨¡ª
716 115E 7D 11 JGE FALSE
717 1160 51 PUSH CX ; ‡ ¯¨áì æ¨äàë ¢ á⥪
718 1161 EB 22 90 JMP TRUE ; "“ᯥèë©" ¢ë室
719
720 ; ** ‘â ¤ àâë¥ á«®¢ **
721 ; ** “á«®¢ë¥ ®¯¥à â®àë **
722
723 HEAD 82h,'0',275Q,ZEQU ; 0=
1 724 =ARRAY:1164 LINK$=$
1 725 1164 82 DB 82h ; NFA 7 ¡¨â à ¢¥ 1.
1 726 ; 6 - ¯à¨§ ª immediate. 5- á«®¢® ¥ ®¯¨á ® smudge
1 727 1165 30 DB '0'
1 728 1166 BD DB 275Q ; ¯®á«¥¤¨© ᨬ¢®« á«®¢ + 128 (7 ¡¨â = 1).
1 729
1 730 1167 113Er DW LINK ; LFA ¯à¥¤ë¤ã饥 á«®¢® ( ¤à¥á ¯¥à¢®£® ᨬ¢®« ¨¬¥¨)
1 731 =ARRAY:1164 LINK=LINK$
1 732
1 733 1169 ZEQU LABEL FAR ; CFA
1 734 1169 116Br DW $+2
735 116B 58 POP AX
736 116C 3D 0000 CMP AX, 0
737 116F 74 14 JE TRUE
738 1171 2B C0 FALSE: SUB AX, AX
739 1173 50 PUT: PUSH AX
740 NEXT
1 741 1174 AD LODSW ; DS:[SI] -> AX ; SI = SI + 2
Turbo Assembler Version 3.1 01/12/20 10:24:08 Page 14
forth.asm
1 742 1175 8B D8 MOV BX, AX ; BX à ¢¥ CFA á«¥¤ãî饣® á«®¢
1 743 ; ------ call debugger --------
1 744 1177 80 7D 42 00 cmp byte ptr [di+102Q], 0
1 745 117B 74 06 jz ??0007
1 746 117D E8 FDD2 call printWORD
1 747 1180 E8 FCB1 call pause
1 748 1183 ??0007:
1 749 ; -----------------------------
1 750 1183 FF 27 JMP WORD PTR [BX]
751 1185 B8 0001 TRUE: MOV AX, 1
752 1188 EB E9 JMP PUT
753
754 HEAD 83h,'0<','>'+80h,NZEQ ; 0<>
1 755 =ARRAY:118A LINK$=$
1 756 118A 83 DB 83h ; NFA 7 ¡¨â à ¢¥ 1.
1 757 ; 6 - ¯à¨§ ª immediate. 5- á«®¢® ¥ ®¯¨á ® smudge
1 758 118B 30 3C DB '0<'
1 759 118D BE DB '>'+80h ; ¯®á«¥¤¨© ᨬ¢®« á«®¢ + 128 (7 ¡¨â = 1).
1 760
1 761 118E 1164r DW LINK ; LFA ¯à¥¤ë¤ã饥 á«®¢® ( ¤à¥á ¯¥à¢®£® ᨬ¢®« ¨¬¥¨)
1 762 =ARRAY:118A LINK=LINK$
1 763
1 764 1190 NZEQ LABEL FAR ; CFA
1 765 1190 1192r DW $+2
766 1192 58 POP AX
767 1193 3D 0000 CMP AX, 0
768 1196 75 ED JNE TRUE
769 1198 EB D7 JMP FALSE
770
771 HEAD 82h,'0',276Q,ZGRET ; 0>
1 772 =ARRAY:119A LINK$=$
1 773 119A 82 DB 82h ; NFA 7 ¡¨â à ¢¥ 1.
1 774 ; 6 - ¯à¨§ ª immediate. 5- á«®¢® ¥ ®¯¨á ® smudge
1 775 119B 30 DB '0'
1 776 119C BE DB 276Q ; ¯®á«¥¤¨© ᨬ¢®« á«®¢ + 128 (7 ¡¨â = 1).
1 777
1 778 119D 118Ar DW LINK ; LFA ¯à¥¤ë¤ã饥 á«®¢® ( ¤à¥á ¯¥à¢®£® ᨬ¢®« ¨¬¥¨)
1 779 =ARRAY:119A LINK=LINK$
1 780
1 781 119F ZGRET LABEL FAR ; CFA
1 782 119F 11A1r DW $+2
783 11A1 58 POP AX
784 11A2 3D 0000 CMP AX, 0
785 11A5 7F DE JG TRUE
786 11A7 EB C8 JMP FALSE
787
788 HEAD 83h,'0=',276Q,ZEQGR ; 0=>
1 789 =ARRAY:11A9 LINK$=$
1 790 11A9 83 DB 83h ; NFA 7 ¡¨â à ¢¥ 1.
1 791 ; 6 - ¯à¨§ ª immediate. 5- á«®¢® ¥ ®¯¨á ® smudge
1 792 11AA 30 3D DB '0='
1 793 11AC BE DB 276Q ; ¯®á«¥¤¨© ᨬ¢®« á«®¢ + 128 (7 ¡¨â = 1).
1 794
1 795 11AD 119Ar DW LINK ; LFA ¯à¥¤ë¤ã饥 á«®¢® ( ¤à¥á ¯¥à¢®£® ᨬ¢®« ¨¬¥¨)
1 796 =ARRAY:11A9 LINK=LINK$
1 797
1 798 11AF ZEQGR LABEL FAR ; CFA
Turbo Assembler Version 3.1 01/12/20 10:24:08 Page 15
forth.asm
1 799 11AF 11B1r DW $+2
800 11B1 58 POP AX
801 11B2 3D 0000 CMP AX, 0
802 11B5 7D CE JGE TRUE
803 11B7 EB B8 JMP FALSE
804
805 HEAD 82h,'0',274Q,ZLESS ; 0<
1 806 =ARRAY:11B9 LINK$=$
1 807 11B9 82 DB 82h ; NFA 7 ¡¨â à ¢¥ 1.
1 808 ; 6 - ¯à¨§ ª immediate. 5- á«®¢® ¥ ®¯¨á ® smudge
1 809 11BA 30 DB '0'
1 810 11BB BC DB 274Q ; ¯®á«¥¤¨© ᨬ¢®« á«®¢ + 128 (7 ¡¨â = 1).
1 811
1 812 11BC 11A9r DW LINK ; LFA ¯à¥¤ë¤ã饥 á«®¢® ( ¤à¥á ¯¥à¢®£® ᨬ¢®« ¨¬¥¨)
1 813 =ARRAY:11B9 LINK=LINK$
1 814
1 815 11BE ZLESS LABEL FAR ; CFA
1 816 11BE 11C0r DW $+2
817 11C0 58 POP AX
818 11C1 3D 0000 CMP AX, 0
819 11C4 78 BF JS TRUE ; …᫨ ¬¨ãá
820 11C6 EB A9 JMP FALSE
821
822 HEAD 83h,'0=',274Q,ZEQLES ; 0=<
1 823 =ARRAY:11C8 LINK$=$
1 824 11C8 83 DB 83h ; NFA 7 ¡¨â à ¢¥ 1.
1 825 ; 6 - ¯à¨§ ª immediate. 5- á«®¢® ¥ ®¯¨á ® smudge
1 826 11C9 30 3D DB '0='
1 827 11CB BC DB 274Q ; ¯®á«¥¤¨© ᨬ¢®« á«®¢ + 128 (7 ¡¨â = 1).
1 828
1 829 11CC 11B9r DW LINK ; LFA ¯à¥¤ë¤ã饥 á«®¢® ( ¤à¥á ¯¥à¢®£® ᨬ¢®« ¨¬¥¨)
1 830 =ARRAY:11C8 LINK=LINK$
1 831
1 832 11CE ZEQLES LABEL FAR ; CFA
1 833 11CE 11D0r DW $+2
834 11D0 58 POP AX
835 11D1 3D 0000 CMP AX, 0
836 11D4 78 AF JS TRUE ; …᫨ ¬¨ãá
837 11D6 74 AD JE TRUE ; ¨«¨ ®«ì
838 11D8 EB 97 JMP FALSE
839
840 HEAD 81h,,275Q,EQUAL ; =
1 841 =ARRAY:11DA LINK$=$
1 842 11DA 81 DB 81h ; NFA 7 ¡¨â à ¢¥ 1.
1 843 ; 6 - ¯à¨§ ª immediate. 5- á«®¢® ¥ ®¯¨á ® smudge
1 844 11DB BD DB 275Q ; ¯®á«¥¤¨© ᨬ¢®« á«®¢ + 128 (7 ¡¨â = 1).
1 845
1 846 11DC 11C8r DW LINK ; LFA ¯à¥¤ë¤ã饥 á«®¢® ( ¤à¥á ¯¥à¢®£® ᨬ¢®« ¨¬¥¨)
1 847 =ARRAY:11DA LINK=LINK$
1 848
1 849 11DE EQUAL LABEL FAR ; CFA
1 850 11DE 11E0r DW $+2
851 11E0 58 POP AX
852 11E1 59 POP CX
853 11E2 3B C8 CMP CX, AX
854 11E4 74 9F JE TRUE
855 11E6 EB 89 JMP FALSE
Turbo Assembler Version 3.1 01/12/20 10:24:08 Page 16
forth.asm
856
857 HEAD 82h,'<','>'+80h,NEQ ; <>
1 858 =ARRAY:11E8 LINK$=$
1 859 11E8 82 DB 82h ; NFA 7 ¡¨â à ¢¥ 1.
1 860 ; 6 - ¯à¨§ ª immediate. 5- á«®¢® ¥ ®¯¨á ® smudge
1 861 11E9 3C DB '<'
1 862 11EA BE DB '>'+80h ; ¯®á«¥¤¨© ᨬ¢®« á«®¢ + 128 (7 ¡¨â = 1).
1 863
1 864 11EB 11DAr DW LINK ; LFA ¯à¥¤ë¤ã饥 á«®¢® ( ¤à¥á ¯¥à¢®£® ᨬ¢®« ¨¬¥¨)
1 865 =ARRAY:11E8 LINK=LINK$
1 866
1 867 11ED NEQ LABEL FAR ; CFA
1 868 11ED 11EFr DW $+2
869 11EF 58 POP AX
870 11F0 59 POP CX
871 11F1 3B C8 CMP CX, AX
872 11F3 74 60 JE FALSE1
873 11F5 EB 72 90 JMP TRUE1
874
875 HEAD 82h,'U',274Q,ULESS ; U<
1 876 =ARRAY:11F8 LINK$=$
1 877 11F8 82 DB 82h ; NFA 7 ¡¨â à ¢¥ 1.
1 878 ; 6 - ¯à¨§ ª immediate. 5- á«®¢® ¥ ®¯¨á ® smudge
1 879 11F9 55 DB 'U'
1 880 11FA BC DB 274Q ; ¯®á«¥¤¨© ᨬ¢®« á«®¢ + 128 (7 ¡¨â = 1).
1 881
1 882 11FB 11E8r DW LINK ; LFA ¯à¥¤ë¤ã饥 á«®¢® ( ¤à¥á ¯¥à¢®£® ᨬ¢®« ¨¬¥¨)
1 883 =ARRAY:11F8 LINK=LINK$
1 884
1 885 11FD ULESS LABEL FAR ; CFA
1 886 11FD 11FFr DW $+2
887 11FF 58 POP AX
888 1200 59 POP CX
889 1201 3B C8 CMP CX, AX
890 1203 72 64 JB TRUE1 ; ¤«ï ç¨á¥« ¡¥§ § ª
891 1205 EB 4E 90 JMP FALSE1
892
893 HEAD 81h,,274Q,LESS ; <
1 894 =ARRAY:1208 LINK$=$
1 895 1208 81 DB 81h ; NFA 7 ¡¨â à ¢¥ 1.
1 896 ; 6 - ¯à¨§ ª immediate. 5- á«®¢® ¥ ®¯¨á ® smudge
1 897 1209 BC DB 274Q ; ¯®á«¥¤¨© ᨬ¢®« á«®¢ + 128 (7 ¡¨â = 1).
1 898
1 899 120A 11F8r DW LINK ; LFA ¯à¥¤ë¤ã饥 á«®¢® ( ¤à¥á ¯¥à¢®£® ᨬ¢®« ¨¬¥¨)
1 900 =ARRAY:1208 LINK=LINK$
1 901
1 902 120C LESS LABEL FAR ; CFA
1 903 120C 120Er DW $+2
904 120E 58 POP AX
905 120F 59 POP CX
906 1210 3B C1 CMP AX, CX
907 1212 7F 55 JG TRUE1
908 1214 EB 3F 90 JMP FALSE1
909
910 HEAD 82h,'=',274Q,EQLES ; =<
1 911 =ARRAY:1217 LINK$=$
1 912 1217 82 DB 82h ; NFA 7 ¡¨â à ¢¥ 1.
Turbo Assembler Version 3.1 01/12/20 10:24:08 Page 17
forth.asm
1 913 ; 6 - ¯à¨§ ª immediate. 5- á«®¢® ¥ ®¯¨á ® smudge
1 914 1218 3D DB '='
1 915 1219 BC DB 274Q ; ¯®á«¥¤¨© ᨬ¢®« á«®¢ + 128 (7 ¡¨â = 1).