last few day's work
[unix-history] / usr / src / usr.bin / pascal / pc2 / langpats.c
index 141fa91..471ddff 100644 (file)
@@ -1,6 +1,6 @@
 /* Copyright (c) 1979 Regents of the University of California */
 
 /* Copyright (c) 1979 Regents of the University of California */
 
-static char sccsid[] = "@(#)langpats.c 1.8 %G%";
+static char sccsid[] = "@(#)langpats.c 1.13 %G%";
 
 #include <stdio.h>
 #include <ctype.h>
 
 #include <stdio.h>
 #include <ctype.h>
@@ -10,15 +10,25 @@ static char sccsid[] = "@(#)langpats.c 1.8 %G%";
  */
 #define HSHSIZ 101
 
  */
 #define HSHSIZ 101
 
+#ifdef vax
+#define CALLTEMPLATE   "calls\t$"
+#define TEMPLATESIZE   7
+#endif vax
+
+#ifdef mc68000
+#define CALLTEMPLATE   "jbsr\t"
+#define TEMPLATESIZE   5
+#endif mc68000
+
 struct pats {
        char    *name;
        char    *replace;
 } ptab[] = {
 
 struct pats {
        char    *name;
        char    *replace;
 } ptab[] = {
 
-       { "1,_ACTFILE\n",
-"      popr    $0x2\n\
-       movl    12(r1),r0\n" },
-
+#ifdef vax
+/*
+ * C library routines
+ */
        { "1,_fgetc\n",
 "      sobgeq  *(sp),1f\n\
        calls   $1,__filbuf\n\
        { "1,_fgetc\n",
 "      sobgeq  *(sp),1f\n\
        calls   $1,__filbuf\n\
@@ -39,9 +49,11 @@ struct pats {
        incl    4(r1)\n\
 2:\n" },
 
        incl    4(r1)\n\
 2:\n" },
 
+/*
+ * VAX special instructions
+ */
        { "3,_blkcpy\n",
        { "3,_blkcpy\n",
-"      popr    $0xb\n\
-       pushl   r0\n\
+"      popr    $0xa\n\
        jbr     2f\n\
 1:\n\
        subl2   r0,(sp)\n\
        jbr     2f\n\
 1:\n\
        subl2   r0,(sp)\n\
@@ -50,11 +62,11 @@ struct pats {
        movzwl  $65535,r0\n\
        cmpl    (sp),r0\n\
        jgtr    1b\n\
        movzwl  $65535,r0\n\
        cmpl    (sp),r0\n\
        jgtr    1b\n\
-       popr    $0x1\n\
+       movl    (sp)+,r0\n\
        movc3   r0,(r1),(r3)\n" },
 
        { "2,_blkclr\n",
        movc3   r0,(r1),(r3)\n" },
 
        { "2,_blkclr\n",
-"      movl    4(sp),r3\n\
+"      movl    (sp)+,r3\n\
        jbr     2f\n\
 1:\n\
        subl2   r0,(sp)\n\
        jbr     2f\n\
 1:\n\
        subl2   r0,(sp)\n\
@@ -63,12 +75,12 @@ struct pats {
        movzwl  $65535,r0\n\
        cmpl    (sp),r0\n\
        jgtr    1b\n\
        movzwl  $65535,r0\n\
        cmpl    (sp),r0\n\
        jgtr    1b\n\
-       popr    $0x3\n\
+       movl    (sp)+,r0\n\
        movc5   $0,(r3),$0,r0,(r3)\n" },
 
        { "3,_LOCC\n",
 "      popr    $0x30\n\
        movc5   $0,(r3),$0,r0,(r3)\n" },
 
        { "3,_LOCC\n",
 "      popr    $0x30\n\
-       popr    $0x2\n\
+       movl    (sp)+,r1\n\
 1:\n\
        movzwl  $65535,r0\n\
        cmpl    r5,r0\n\
 1:\n\
        movzwl  $65535,r0\n\
        cmpl    r5,r0\n\
@@ -88,32 +100,36 @@ struct pats {
        { "2,_TRUNC\n",
 "      cvtdl   (sp)+,r0\n" },
 
        { "2,_TRUNC\n",
 "      cvtdl   (sp)+,r0\n" },
 
-       { "1,_FCALL\n",
-"      movl    (sp),r0\n\
-       ashl    $3,4(r0),r1\n\
-       movc3   r1,__disply+8,8(r0)[r1]\n\
-       movl    (sp),r0\n\
-       ashl    $3,4(r0),r1\n\
-       movc3   r1,8(r0),__disply+8\n\
-       movl    *(sp)+,r0\n" },
+/*
+ * General Pascal library routines
+ */
+       { "1,_ACTFILE\n",
+"      movl    (sp)+,r1\n\
+       movl    12(r1),r0\n" },
+
+       { "2,_FCALL\n",
+"      movl    4(sp),r0\n\
+       movc3   4(r0),__disply+8,*(sp)+\n\
+       movl    (sp)+,r0\n\
+       movc3   4(r0),8(r0),__disply+8\n" },
 
        { "2,_FRTN\n",
 
        { "2,_FRTN\n",
-"      popr    $0x1\n\
-       ashl    $3,4(r0),r1\n\
-       movc3   r1,8(r0)[r1],__disply+8\n\
-       popr    $0x1\n" },
+"      movl    (sp)+,r0\n\
+       movc3   4(r0),*(sp)+,__disply+8\n" },
 
        { "3,_FSAV\n",
 "      movl    8(sp),r0\n\
        movl    (sp)+,(r0)\n\
 
        { "3,_FSAV\n",
 "      movl    8(sp),r0\n\
        movl    (sp)+,(r0)\n\
-       movl    (sp)+,4(r0)\n\
-       ashl    $3,4(r0),r1\n\
-       movc3   r1,__disply+8,8(r0)\n\
-       popr    $0x1\n" },
+       ashl    $3,(sp)+,4(r0)\n\
+       movc3   4(r0),__disply+8,8(r0)\n\
+       movl    (sp)+,r0\n" },
 
 
+/*
+ * Pascal relational comparisons
+ */
        { "3,_RELEQ\n",
        { "3,_RELEQ\n",
-"      popr    $0x10\n\
-       popr    $0xa\n\
+"      popr    $0xb\n\
+       movl    r0,r4\n\
 1:\n\
        movzwl  $65535,r0\n\
        cmpl    r4,r0\n\
 1:\n\
        movzwl  $65535,r0\n\
        cmpl    r4,r0\n\
@@ -131,8 +147,8 @@ struct pats {
 4:\n" },
 
        { "3,_RELNE\n",
 4:\n" },
 
        { "3,_RELNE\n",
-"      popr    $0x10\n\
-       popr    $0xa\n\
+"      popr    $0xb\n\
+       movl    r0,r4\n\
 1:\n\
        movzwl  $65535,r0\n\
        cmpl    r4,r0\n\
 1:\n\
        movzwl  $65535,r0\n\
        cmpl    r4,r0\n\
@@ -149,8 +165,8 @@ struct pats {
 4:\n" },
 
        { "3,_RELSLT\n",
 4:\n" },
 
        { "3,_RELSLT\n",
-"      popr    $0x10\n\
-       popr    $0xa\n\
+"      popr    $0xb\n\
+       movl    r0,r4\n\
        jbr     2f\n\
 1:\n\
        subl2   r0,r4\n\
        jbr     2f\n\
 1:\n\
        subl2   r0,r4\n\
@@ -170,8 +186,8 @@ struct pats {
 5:\n" },
 
        { "3,_RELSLE\n",
 5:\n" },
 
        { "3,_RELSLE\n",
-"      popr    $0x10\n\
-       popr    $0xa\n\
+"      popr    $0xb\n\
+       movl    r0,r4\n\
        jbr     2f\n\
 1:\n\
        subl2   r0,r4\n\
        jbr     2f\n\
 1:\n\
        subl2   r0,r4\n\
@@ -191,8 +207,8 @@ struct pats {
 5:\n" },
 
        { "3,_RELSGT\n",
 5:\n" },
 
        { "3,_RELSGT\n",
-"      popr    $0x10\n\
-       popr    $0xa\n\
+"      popr    $0xb\n\
+       movl    r0,r4\n\
        jbr     2f\n\
 1:\n\
        subl2   r0,r4\n\
        jbr     2f\n\
 1:\n\
        subl2   r0,r4\n\
@@ -212,8 +228,8 @@ struct pats {
 5:\n" },
 
        { "3,_RELSGE\n",
 5:\n" },
 
        { "3,_RELSGE\n",
-"      popr    $0x10\n\
-       popr    $0xa\n\
+"      popr    $0xb\n\
+       movl    r0,r4\n\
        jbr     2f\n\
 1:\n\
        subl2   r0,r4\n\
        jbr     2f\n\
 1:\n\
        subl2   r0,r4\n\
@@ -232,6 +248,9 @@ struct pats {
        movl    $1,r0\n\
 5:\n" },
 
        movl    $1,r0\n\
 5:\n" },
 
+/*
+ * Pascal set operations.
+ */
        { "4,_ADDT\n",
 "      popr    $0x17\n\
        movl    r0,r3\n\
        { "4,_ADDT\n",
 "      popr    $0x17\n\
        movl    r0,r3\n\
@@ -262,7 +281,185 @@ struct pats {
        jgtru   1f\n\
        jbc     r1,(r4),1f\n\
        incl    r0\n\
        jgtru   1f\n\
        jbc     r1,(r4),1f\n\
        incl    r0\n\
-1:\n" }
+1:\n" },
+
+/*
+ * Pascal runtime checks
+ */
+       { "1,_ASRT\n",
+"      tstl    (sp)+\n\
+       jneq    1f\n\
+       pushl   $0\n\
+       pushl   $_EASRT\n\
+       calls   $2,_ERROR\n\
+1:\n" },
+
+       { "2,_ASRTS\n",
+"      popr    $0x03\n\
+       tstl    r0\n\
+       jneq    1f\n\
+       pushl   r1\n\
+       pushl   $_EASRTS\n\
+       calls   $2,_ERROR\n\
+1:\n" },
+
+       { "1,_CHR\n",
+"      movl    (sp)+,r0\n\
+       cmpl    r0,$127\n\
+       jlequ   1f\n\
+       pushl   r0\n\
+       pushl   $_ECHR\n\
+       calls   $2,_ERROR\n\
+1:\n" },
+
+       { "0,_LINO\n",
+"      incl    __stcnt\n\
+       cmpl    __stcnt,__stlim\n\
+       jlss    1f\n\
+       pushl   __stcnt\n\
+       pushl   $_ELINO\n\
+       calls   $2,_ERROR\n\
+1:\n" },
+
+       { "1,_NIL\n",
+"      movl    (sp)+,r0\n\
+       cmpl    r0,__maxptr\n\
+       jgtr    1f\n\
+       cmpl    r0,__minptr\n\
+       jgeq    2f\n\
+1:\n\
+       pushl   $0\n\
+       pushl   $_ENIL\n\
+       calls   $2,_ERROR\n\
+2:\n" },
+
+       { "2,_RANDOM\n",
+"      addl2   $8,sp\n\
+       emul    __seed,$1103515245,$0,r0\n\
+       ediv    $0x7fffffff,r0,r1,r0\n\
+       movl    r0,__seed\n\
+       cvtld   r0,r0\n\
+       divd2   $0d2.147483647e+09,r0\n" },
+
+       { "3,_RANG4\n",
+"      popr    $0x07\n\
+       cmpl    r0,r1\n\
+       jlss    1f\n\
+       cmpl    r0,r2\n\
+       jleq    2f\n\
+1:\n\
+       pushl   r0\n\
+       pushl   $_ERANG\n\
+       calls   $2,_ERROR\n\
+2:\n" },
+
+       { "2,_RSNG4\n",
+"      popr    $0x03\n\
+       cmpl    r0,r1\n\
+       jlequ   1f\n\
+       pushl   r0\n\
+       pushl   $_ERANG\n\
+       calls   $2,_ERROR\n\
+1:\n" },
+
+       { "1,_SEED\n",
+"      movl    __seed,r0\n\
+       movl    (sp)+,__seed\n" },
+
+       { "3,_SUBSC\n",
+"      popr    $0x07\n\
+       cmpl    r0,r1\n\
+       jlss    1f\n\
+       cmpl    r0,r2\n\
+       jleq    2f\n\
+1:\n\
+       pushl   r0\n\
+       pushl   $_ESUBSC\n\
+       calls   $2,_ERROR\n\
+2:\n" },
+
+       { "2,_SUBSCZ\n",
+"      popr    $0x03\n\
+       cmpl    r0,r1\n\
+       jlequ   1f\n\
+       pushl   r0\n\
+       pushl   $_ESUBSC\n\
+       calls   $2,_ERROR\n\
+1:\n" },
+#endif vax
+
+#ifdef mc68000
+
+/*
+ * General Pascal library routines
+ */
+       { "_ACTFILE\n",
+"      movl    sp@,a0\n\
+       movl    a0@(12),d0\n" },
+
+       { "_ADDT\n",
+"      movl    a2,sp@-\n\
+       movl    sp@(8),a2\n\
+       movl    sp@(12),a1\n\
+       movl    sp@(4),a0\n\
+       movl    sp@(16),d1\n\
+       subql   #1,d1\n\
+1:\n\
+       movl    a2@+,d0\n\
+       orl     a1@+,d0\n\
+       movl    d0,a0@+\n\
+       dbra    d1,1b\n\
+       movl    sp@+,a2\n\
+       movl    sp@,d0\n" },
+
+       { "_SUBT\n",
+"      movl    a2,sp@-\n\
+       movl    sp@(8),a2\n\
+       movl    sp@(12),a1\n\
+       movl    sp@(4),a0\n\
+       movl    sp@(16),d1\n\
+       subql   #1,d1\n\
+1:\n\
+       movl    a1@+,d0\n\
+       notl    d0\n\
+       andl    a2@+,d0\n\
+       movl    d0,a0@+\n\
+       dbra    d1,1b\n\
+       movl    sp@+,a2\n\
+       movl    sp@,d0\n" },
+
+       { "_MULT\n",
+"      movl    a2,sp@-\n\
+       movl    sp@(8),a2\n\
+       movl    sp@(12),a1\n\
+       movl    sp@(4),a0\n\
+       movl    sp@(16),d1\n\
+       subql   #1,d1\n\
+1:\n\
+       movl    a2@+,d0\n\
+       andl    a1@+,d0\n\
+       movl    d0,a0@+\n\
+       dbra    d1,1b\n\
+       movl    sp@+,a2\n\
+       movl    sp@,d0\n" },
+
+       { "_IN\n",
+"      movl    sp@,d1\n\
+       subl    sp@(4),d1\n\
+       cmpl    sp@(8),d1\n\
+       jbhi    1f\n\
+       movl    sp@(12),a0\n\
+       movl    d1,d0\n\
+       lsrl    #3,d0\n\
+       btst    d1,a0@(0,d0:l)\n\
+       jbne    1f\n\
+       moveq   #1,d0\n\
+       jbra    2f\n\
+1:\n\
+       moveq   #0,d0\n\
+2:\n" },
+#endif mc68000
+
 };
 
 struct pats            *htbl[HSHSIZ];
 };
 
 struct pats            *htbl[HSHSIZ];
@@ -315,11 +512,11 @@ main(argc, argv)
                lp = index(line, ':');
                for (cp = (lp != NULL) ? ++lp : line; *cp == '\t'; )
                        cp++;
                lp = index(line, ':');
                for (cp = (lp != NULL) ? ++lp : line; *cp == '\t'; )
                        cp++;
-               if (strcmpn(cp, "calls\t$", 7) != 0) {
+               if (strcmpn(cp, CALLTEMPLATE, TEMPLATESIZE) != 0) {
                        fputs(line, stdout);
                        continue;
                }
                        fputs(line, stdout);
                        continue;
                }
-               cp += 7;
+               cp += TEMPLATESIZE;
                HASH(cp, hp);
                while (*hp) {
                        if (strcmpn((*hp)->name, cp, size)==NULL) {
                HASH(cp, hp);
                while (*hp) {
                        if (strcmpn((*hp)->name, cp, size)==NULL) {