Annotation of gforth/arch/misc/prim.fs, revision 1.5
1.1 pazsan 1: \ pie primitives
2:
3: $20 allot
4:
1.2 pazsan 5: Label start ahere $21 + , jmp ,
1.1 pazsan 6:
7: Label #0 0 ,
8: Label #1 1 ,
9: Label RP 0 ,
10: Label SP 0 ,
11: Label UP 0 ,
12: Label IP 0 ,
13: Label W 0 ,
1.2 pazsan 14: Label t0 0 ,
15: Label t1 0 ,
16: Label t2 0 ,
17: Label t3 0 ,
18: Label srcx 0 ,
19: Label dstx 0 ,
20:
21: \ Up to here it's self modified
22: \ If there's a gap here, add a jump to Next after dstx
23:
1.1 pazsan 24: Label Next #0 , add ,
25: IP , shr ,
26: sym Next
1.2 pazsan 27: *accu , W ,
1.1 pazsan 28: #1 , add ,
29: accu , add ,
30: accu , IP ,
1.2 pazsan 31: Label Next1 W , shr ,
32: *accu , shr ,
1.1 pazsan 33: accu , jmp ,
34: Label "Next" Next ,
35: Label "Next1" Next1 ,
1.2 pazsan 36: Label "xmov" srcx ,
37:
38: Label #2 2 ,
39: Label #4 4 ,
40: Label #FF $FF ,
41: Label #$8000 $8000 ,
42: Label #-1 -1 ,
1.1 pazsan 43:
44: Label "0" '< ,
45: Label "1" '1 ,
46: Label "2" '2 ,
47: Label "3" '3 ,
48: Label "4" '4 ,
49: Label "5" '5 ,
50: Label "6" '6 ,
51: Label "A" 'A ,
52: Label "B" 'B ,
53: Label "C" 'C ,
54: Label "D" 'D ,
55: Label "E" 'E ,
56: Label "F" '> ,
57: Label "?" '? ,
58: Label "+" '+ ,
59: Label "/" '/ ,
60: Label "H" 'H ,
61: Label "I" 'I ,
62: Label "J" 'J ,
63: Label "K" 'K ,
64: Label "L" 'L ,
65: Label "M" 'M ,
66: Label "N" 'N ,
67: Label "O" 'O ,
68: Label "P" 'P ,
69: Label "Q" 'Q ,
70: Label "R" 'R ,
71: Label "S" 'S ,
72: Label "T" 'T ,
73: Label "#" '# ,
74:
75: end-label
76:
77: Code: :docol sym docol
78: \ "0" , tx ,
79: RP , accu ,
80: #1 , sub ,
81: accu , RP ,
1.2 pazsan 82: IP , *accu ,
1.1 pazsan 83: W , accu ,
84: #4 , add ,
85: accu , IP ,
86: "Next" , jmp ,
87: end-code
88:
89: Code: :docon sym docon
90: \ "1" , tx ,
1.2 pazsan 91: #0 , add ,
92: W , shr ,
93: #2 , add ,
94: *accu , t0 ,
1.1 pazsan 95: SP , accu ,
96: #1 , sub ,
97: accu , SP ,
1.2 pazsan 98: t0 , *accu ,
1.1 pazsan 99: "Next" , jmp ,
100: end-code
101:
102: Code: :dovar sym dovar
103: \ "2" , tx ,
1.2 pazsan 104: W , accu ,
105: #4 , add ,
106: accu , t0 ,
1.1 pazsan 107: SP , accu ,
108: #1 , sub ,
109: accu , SP ,
1.2 pazsan 110: t0 , *accu ,
1.1 pazsan 111: "Next" , jmp ,
112: end-code
113:
114: Code: :douser sym douser
115: \ "3" , tx ,
116: #0 , add ,
117: W , shr ,
118: #2 , add ,
1.2 pazsan 119: *accu , accu ,
1.1 pazsan 120: UP , add ,
1.2 pazsan 121: accu , t0 ,
122: SP , accu ,
123: #1 , sub ,
124: accu , SP ,
125: t0 , *accu ,
1.1 pazsan 126: "Next" , jmp ,
127: end-code
128:
129: Code: :dodefer sym dodefer
130: \ "4" , tx ,
131: #0 , add ,
132: W , shr ,
133: #2 , add ,
1.2 pazsan 134: *accu , W ,
1.1 pazsan 135: "Next1" , jmp ,
136: end-code
137:
138: Code: :dofield sym dofield
139: \ "5" , tx ,
140: #0 , add ,
141: W , shr ,
142: #2 , add ,
1.2 pazsan 143: *accu , accu ,
144: accu , t0 ,
145: SP , accu ,
146: *accu , accu ,
147: t0 , add ,
148: accu , t0 ,
149: SP , accu ,
150: t0 , *accu ,
1.1 pazsan 151: "Next" , jmp ,
152: end-code
153:
154: Code: :dodoes sym dodoes
155: \ "6" , tx ,
156: RP , accu ,
157: #1 , sub ,
158: accu , RP ,
1.2 pazsan 159: IP , *accu ,
160: W , accu ,
161: #4 , add ,
162: accu , t0 ,
1.1 pazsan 163: SP , accu ,
164: #1 , sub ,
165: accu , SP ,
1.2 pazsan 166: t0 , *accu ,
167: t0 , accu ,
1.1 pazsan 168: #2 , sub ,
169: #0 , add ,
170: accu , shr ,
1.2 pazsan 171: *accu , IP ,
1.1 pazsan 172: "Next" , jmp ,
173: end-code
174:
1.4 jwilke 175: Code: :doesjump
176: end-code
177:
1.1 pazsan 178: Code ! sym !
179: \ "A" , tx ,
180: SP , accu ,
1.2 pazsan 181: *accu , t0 ,
1.1 pazsan 182: #1 , add ,
1.2 pazsan 183: *accu , t1 ,
1.1 pazsan 184: #1 , add ,
185: accu , SP ,
1.2 pazsan 186: t0 , shr ,
187: t1 , *accu ,
1.1 pazsan 188: "Next" , jmp ,
189: end-code
190:
191: Code @ sym @
192: \ "B" , tx ,
193: #0 , add ,
1.2 pazsan 194: SP , accu ,
195: *accu , shr ,
196: *accu , t0 ,
197: SP , accu ,
198: t0 , *accu ,
1.1 pazsan 199: "Next" , jmp ,
200: end-code
201:
202: Code x! sym x!
203: \ "C" , tx ,
204: SP , accu ,
1.2 pazsan 205: *accu , dstx ,
1.1 pazsan 206: #1 , add ,
1.2 pazsan 207: accu , srcx ,
1.1 pazsan 208: #1 , add ,
209: accu , SP ,
1.2 pazsan 210: "xmov" , jmp ,
1.1 pazsan 211: end-code
212:
213: Code x@ sym x@
214: \ "D" , tx ,
1.2 pazsan 215: SP , accu ,
216: *accu , srcx ,
217: accu , dstx ,
218: "xmov" , jmp ,
1.1 pazsan 219: end-code
220:
221: Code execute sym execute
222: \ "E" , tx ,
223: SP , accu ,
1.2 pazsan 224: *accu , W ,
1.1 pazsan 225: #1 , add ,
226: accu , SP ,
227: "Next1" , jmp ,
228: end-code
229:
230: Code ;s sym ;s
231: \ "F" , tx ,
232: RP , accu ,
233: #1 , add ,
234: accu , RP ,
1.2 pazsan 235: #1 , sub ,
236: *accu , IP ,
1.1 pazsan 237: "Next" , jmp ,
238: end-code
239:
240: Code ?branch sym ?branch
241: \ "?" , tx ,
242: #0 , add ,
243: IP , shr ,
1.2 pazsan 244: accu , t0 ,
1.1 pazsan 245: #1 , add ,
246: accu , add ,
247: accu , IP ,
248: SP , accu ,
249: accu , 1 m ,
250: #1 , add ,
251: accu , SP ,
252: 1 r , accu ,
253: pc+4 , jz ,
254: sym no-branch
255: "Next" , jmp ,
256: \ "+" , tx ,
1.2 pazsan 257: t0 , accu ,
258: *accu , accu ,
1.1 pazsan 259: Label >branch sym branch-o
260: IP , add ,
261: #2 , sub ,
262: sym branch-to
263: accu , IP ,
264: "Next" , jmp ,
265: Label "branch" >branch ,
266: end-code
267:
268: Code branch sym branch
269: \ "/" , tx ,
270: #0 , add ,
271: IP , shr ,
1.2 pazsan 272: *accu , accu ,
1.1 pazsan 273: IP , add ,
274: accu , IP ,
275: "Next" , jmp ,
276: end-code
277:
278: Code (loop) sym (loop)
279: #0 , add ,
280: IP , shr ,
1.2 pazsan 281: *accu , t0 ,
1.1 pazsan 282: #1 , add ,
283: accu , add ,
284: accu , IP ,
285: RP , accu ,
1.2 pazsan 286: *accu , t2 ,
1.1 pazsan 287: #1 , add ,
1.2 pazsan 288: *accu , t3 ,
289: t2 , accu ,
1.1 pazsan 290: #1 , add ,
1.2 pazsan 291: accu , t1 ,
292: RP , accu ,
293: t1 , *accu ,
294: t1 , accu ,
295: t3 , sub ,
1.1 pazsan 296: "Next" , jz ,
1.2 pazsan 297: t0 , accu ,
1.1 pazsan 298: "branch" , jmp ,
299: end-code
300:
301: Code xor sym xor
302: \ "H" , tx ,
303: SP , accu ,
1.2 pazsan 304: *accu , t0 ,
1.1 pazsan 305: #1 , add ,
306: accu , SP ,
1.2 pazsan 307: *accu , accu ,
308: t0 , xor ,
309: accu , t0 ,
310: SP , accu ,
311: t0 , *accu ,
1.1 pazsan 312: "Next" , jmp ,
313: end-code
314:
315: Code or sym or
316: \ "I" , tx ,
317: SP , accu ,
1.2 pazsan 318: *accu , t0 ,
1.1 pazsan 319: #1 , add ,
320: accu , SP ,
1.2 pazsan 321: *accu , accu ,
322: t0 , or ,
323: accu , t0 ,
324: SP , accu ,
325: t0 , *accu ,
1.1 pazsan 326: "Next" , jmp ,
327: end-code
328:
329: Code and sym and
330: \ "J" , tx ,
331: SP , accu ,
1.2 pazsan 332: *accu , t0 ,
1.1 pazsan 333: #1 , add ,
334: accu , SP ,
1.2 pazsan 335: *accu , accu ,
336: t0 , and ,
337: accu , t0 ,
338: SP , accu ,
339: t0 , *accu ,
1.1 pazsan 340: "Next" , jmp ,
341: end-code
342:
343: Code + sym +
344: \ "K" , tx ,
345: SP , accu ,
1.2 pazsan 346: *accu , t0 ,
1.1 pazsan 347: #1 , add ,
348: accu , SP ,
1.2 pazsan 349: *accu , accu ,
350: t0 , add ,
351: accu , t0 ,
352: SP , accu ,
353: t0 , *accu ,
1.1 pazsan 354: "Next" , jmp ,
355: end-code
356:
357: Code - sym -
358: \ "L" , tx ,
359: SP , accu ,
1.2 pazsan 360: *accu , t0 ,
1.1 pazsan 361: #1 , add ,
362: accu , SP ,
1.2 pazsan 363: *accu , accu ,
364: t0 , sub ,
365: accu , t0 ,
366: SP , accu ,
367: t0 , *accu ,
1.1 pazsan 368: "Next" , jmp ,
369: end-code
370:
371: Code 2/ sym 2\/
372: \ "M" , tx ,
373: #0 , add ,
1.2 pazsan 374: SP , accu ,
375: *accu , accu ,
1.1 pazsan 376: PC+6 , js ,
377: accu , shr ,
378: PC+6 , jmp ,
379: accu , shr ,
380: #$8000 , or ,
1.2 pazsan 381: accu , t0 ,
382: SP , accu ,
383: t0 , *accu ,
1.1 pazsan 384: "Next" , jmp ,
385: end-code
386:
387: Code 0= sym 0=
1.2 pazsan 388: SP , accu ,
389: *accu , accu ,
1.1 pazsan 390: ZF , accu ,
1.2 pazsan 391: #1 , xor ,
392: #1 , sub ,
393: accu , t0 ,
394: SP , accu ,
395: t0 , *accu ,
1.1 pazsan 396: "Next" , jmp ,
397: end-code
398:
399: Code 0<> sym 0<>
1.2 pazsan 400: SP , accu ,
401: *accu , accu ,
1.1 pazsan 402: ZF , accu ,
1.2 pazsan 403: #1 , sub ,
404: accu , t0 ,
405: SP , accu ,
406: t0 , *accu ,
1.1 pazsan 407: "Next" , jmp ,
408: end-code
409:
410: Code = sym =
411: SP , accu ,
1.2 pazsan 412: *accu , t0 ,
1.1 pazsan 413: #1 , add ,
414: accu , SP ,
1.2 pazsan 415: *accu , accu ,
416: t0 , sub ,
1.1 pazsan 417: ZF , accu ,
1.2 pazsan 418: #1 , xor ,
419: #1 , sub ,
420: accu , t0 ,
421: SP , accu ,
422: t0 , *accu ,
1.1 pazsan 423: "Next" , jmp ,
424: end-code
425:
426: Code u< sym u<
427: SP , accu ,
1.2 pazsan 428: *accu , t0 ,
1.1 pazsan 429: #1 , add ,
430: accu , SP ,
1.2 pazsan 431: *accu , accu ,
432: t0 , sub ,
1.1 pazsan 433: CF , accu ,
1.2 pazsan 434: #1 , xor ,
435: #1 , sub ,
436: accu , t0 ,
437: SP , accu ,
438: t0 , *accu ,
1.1 pazsan 439: "Next" , jmp ,
440: end-code
441:
442: Code 1+ sym 1+
1.2 pazsan 443: SP , accu ,
444: *accu , accu ,
1.1 pazsan 445: #1 , add ,
1.2 pazsan 446: accu , t0 ,
447: SP , accu ,
448: t0 , *accu ,
1.1 pazsan 449: "Next" , jmp ,
450: end-code
451:
452: Code cell+ sym cell+
1.2 pazsan 453: SP , accu ,
454: *accu , accu ,
1.1 pazsan 455: #2 , add ,
1.2 pazsan 456: accu , t0 ,
457: SP , accu ,
458: t0 , *accu ,
1.1 pazsan 459: "Next" , jmp ,
460: end-code
461:
462: Code 8<< sym 8<<
463: \ "T" , tx ,
464: #0 , add ,
465: SP , accu ,
1.2 pazsan 466: *accu , accu ,
1.1 pazsan 467: accu , add ,
468: accu , add ,
469: accu , add ,
470: accu , add ,
471: accu , add ,
472: accu , add ,
473: accu , add ,
474: accu , add ,
1.2 pazsan 475: accu , t0 ,
476: SP , accu ,
477: t0 , *accu ,
1.1 pazsan 478: "Next" , jmp ,
479: end-code
480:
481: Code 8>> sym 8>>
482: \ "T" , tx ,
483: #0 , add ,
484: SP , accu ,
1.2 pazsan 485: Label c-even@ *accu , shr ,
1.1 pazsan 486: accu , shr ,
487: accu , shr ,
488: accu , shr ,
489: accu , shr ,
490: accu , shr ,
491: accu , shr ,
492: accu , shr ,
493: #FF , and ,
1.2 pazsan 494: accu , t0 ,
495: SP , accu ,
496: t0 , *accu ,
1.1 pazsan 497: "Next" , jmp ,
498: Label "c-even@" c-even@ ,
499: end-code
500:
501: Code c@ sym c@
502: #0 , add ,
1.2 pazsan 503: SP , accu ,
504: *accu , shr ,
1.1 pazsan 505: PC+4 , jc ,
506: "c-even@" , jmp ,
1.2 pazsan 507: *accu , accu ,
1.1 pazsan 508: #FF , and ,
1.2 pazsan 509: accu , t0 ,
510: SP , accu ,
511: t0 , *accu ,
1.1 pazsan 512: "Next" , jmp ,
513:
514: Code 2* sym 2*
515: \ "N" , tx ,
1.2 pazsan 516: SP , accu ,
517: *accu , accu ,
1.1 pazsan 518: accu , add ,
1.2 pazsan 519: accu , t0 ,
520: SP , accu ,
521: t0 , *accu ,
1.1 pazsan 522: "Next" , jmp ,
523: end-code
524:
525: Code >r sym >r
526: \ "O" , tx ,
1.2 pazsan 527: SP , accu ,
528: *accu , t0 ,
529: #1 , add ,
530: accu , SP ,
1.1 pazsan 531: RP , accu ,
532: #1 , sub ,
533: accu , RP ,
1.2 pazsan 534: t0 , *accu ,
1.1 pazsan 535: "Next" , jmp ,
536: end-code
537:
538: Code r> sym r>
539: \ "P" , tx ,
540: RP , accu ,
1.2 pazsan 541: *accu , t0 ,
1.1 pazsan 542: #1 , add ,
543: accu , RP ,
544: SP , accu ,
545: #1 , sub ,
546: accu , SP ,
1.2 pazsan 547: t0 , *accu ,
1.1 pazsan 548: "Next" , jmp ,
549: end-code
550:
551: Code sp@ sym sp@
552: \ "Q" , tx ,
553: SP , accu ,
1.2 pazsan 554: accu , add ,
555: accu , t0 ,
556: SP , accu ,
1.1 pazsan 557: #1 , sub ,
558: accu , SP ,
1.2 pazsan 559: t0 , *accu ,
1.1 pazsan 560: "Next" , jmp ,
561: end-code
562:
563: Code sp! sym sp!
564: #0 , add ,
1.2 pazsan 565: SP , accu ,
566: *accu , shr ,
1.1 pazsan 567: accu , SP ,
568: "Next" , jmp ,
569: end-code
570:
571: Code rp@ sym rp@
572: \ "R" , tx ,
1.2 pazsan 573: RP , accu ,
574: accu , add ,
575: accu , t0 ,
1.1 pazsan 576: SP , accu ,
577: #1 , sub ,
578: accu , SP ,
1.2 pazsan 579: t0 , *accu ,
1.1 pazsan 580: "Next" , jmp ,
581: end-code
582:
583: Code rp! sym rp!
584: SP , accu ,
1.2 pazsan 585: *accu , t0 ,
1.1 pazsan 586: #1 , add ,
587: accu , SP ,
588: #0 , add ,
1.2 pazsan 589: t0 , shr ,
1.1 pazsan 590: accu , RP ,
591: "Next" , jmp ,
592: end-code
593:
594: Code drop sym drop
595: \ "S" , tx ,
596: SP , accu ,
597: #1 , add ,
598: accu , SP ,
599: "Next" , jmp ,
600: end-code
601:
602: Code lit sym lit
603: \ "#" , tx ,
604: IP , shr ,
1.2 pazsan 605: *accu , t0 ,
1.1 pazsan 606: #1 , add ,
607: accu , add ,
608: accu , IP ,
1.2 pazsan 609: SP , accu ,
610: #1 , sub ,
611: accu , SP ,
612: t0 , *accu ,
1.1 pazsan 613: "Next" , jmp ,
614: end-code
615:
616: Code dup sym dup
617: SP , accu ,
1.2 pazsan 618: *accu , t0 ,
1.1 pazsan 619: #1 , sub ,
620: accu , SP ,
1.2 pazsan 621: t0 , *accu ,
1.1 pazsan 622: "Next" , jmp ,
623: end-code
624:
625: Code I sym r@
1.2 pazsan 626: RP , accu ,
627: *accu , t0 ,
1.1 pazsan 628: SP , accu ,
629: #1 , sub ,
630: accu , SP ,
1.2 pazsan 631: t0 , *accu ,
1.1 pazsan 632: "Next" , jmp ,
633: end-code
634:
635: Code over sym over
636: SP , accu ,
637: #1 , add ,
1.2 pazsan 638: *accu , t0 ,
1.1 pazsan 639: #2 , sub ,
640: accu , SP ,
1.2 pazsan 641: t0 , *accu ,
1.1 pazsan 642: "Next" , jmp ,
643: end-code
644:
645: Code swap sym swap
646: SP , accu ,
1.2 pazsan 647: *accu , t0 ,
1.1 pazsan 648: #1 , add ,
1.2 pazsan 649: *accu , t1 ,
650: t0 , *accu ,
651: #1 , sub ,
652: t1 , *accu ,
1.1 pazsan 653: "Next" , jmp ,
654: end-code
655:
656: Code d+ sym d+
657: SP , accu ,
1.2 pazsan 658: *accu , t0 ,
1.1 pazsan 659: #1 , add ,
1.2 pazsan 660: *accu , t1 ,
1.1 pazsan 661: #1 , add ,
1.2 pazsan 662: *accu , t2 ,
1.1 pazsan 663: accu , SP ,
664: #1 , add ,
1.2 pazsan 665: *accu , accu ,
666: t1 , add ,
667: accu , t1 ,
1.1 pazsan 668: CF , accu ,
1.2 pazsan 669: t2 , add ,
670: t0 , add ,
671: accu , t0 ,
672: SP , accu ,
673: t0 , *accu ,
674: #1 , add ,
675: t1 , *accu ,
1.1 pazsan 676: "Next" , jmp ,
677: end-code
678:
679: Label cf1 0 ,
680: Code d2*+ sym d2*+
1.2 pazsan 681: SP , accu ,
682: Label >d2*+ *accu , t0 ,
683: #1 , add ,
684: *accu , t1 ,
1.1 pazsan 685: #1 , add ,
1.2 pazsan 686: *accu , t2 ,
687: accu , t3 ,
688: t0 , accu ,
689: t2 , add ,
690: t2 , add ,
691: accu , t2 ,
692: CF , accu ,
693: t1 , add ,
694: t1 , add ,
695: accu , t0 ,
696: t1 , accu ,
1.1 pazsan 697: #$8000 , and ,
1.2 pazsan 698: accu , t1 ,
699: t3 , accu ,
700: t2 , *accu ,
701: #1 , sub ,
702: t0 , *accu ,
703: #1 , sub ,
704: t1 , *accu ,
1.1 pazsan 705: "Next" , jmp ,
706: end-code
707:
708: Label res1 0 ,
709: Label "d2*+" >d2*+ ,
710: Code /modstep ( ud c R: u -- ud-?u 0/1 )
711: sym /modstep
712: SP , accu ,
1.2 pazsan 713: *accu , t0 ,
714: #1 , add ,
715: *accu , t1 ,
1.1 pazsan 716: #1 , add ,
1.2 pazsan 717: *accu , t2 ,
718: t2 , accu ,
719: t0 , sub ,
720: accu , t0 ,
1.1 pazsan 721: CF , accu ,
1.2 pazsan 722: t1 , or ,
1.1 pazsan 723: PC+6 , JZ ,
724: #0 , accu ,
725: PC+6 , jmp ,
1.2 pazsan 726: t0 , t2 ,
1.1 pazsan 727: #1 , accu ,
1.2 pazsan 728: accu , t0 ,
729: SP , accu ,
730: #1 , add ,
731: t0 , *accu ,
732: #1 , add ,
733: t2 , *accu ,
734: #1 , sub ,
1.1 pazsan 735: "d2*+" , jmp ,
736: end-code
737:
738: RP 2* Constant RP
739: SP 2* Constant SP
740: UP 2* Constant UP
741: IP 2* Constant IP
742:
1.5 ! pazsan 743: \ c: sp! 2/ sp ! ;
! 744: \ c: sp@ sp @ 1+ 2* ;
! 745: \ c: rp@ rp @ 2* ;
! 746: \ c: rp! r> swap 2/ rp ! >r ;
! 747: : up@ up @ ;
! 748: : up! up ! ;
1.1 pazsan 749:
1.3 pazsan 750: include ./key.fs
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>