home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / SIMTEL / CPMUG / CPMUG050.ARK / PFET.PAS < prev    next >
Pascal/Delphi Source File  |  1984-04-29  |  11KB  |  487 lines

  1. (*
  2.   TITLE        PASCAL FAST EXECUTION TRANSLATOR
  3.   FILENAME    PFET.PAS
  4.   AUTHOR    Robert A. Van Valzah  10/06/79
  5.   LAST REVISOR    R.A.V.  01/14/80
  6.   REASON    repaired bug in astoi code
  7. *)
  8.  
  9. const
  10.     vhu    = 0;    (* version number hundreds *)
  11.     vtn    = 0;    (* tens *)
  12.     vun    = 8;    (* units *)
  13.     devrel    = 'r';    (* development or release version *)
  14.     nlab    = 500;    (* max number of p-labels *)
  15.     codemax    = 5000;    (* max number of p-instructions *)
  16.     ocode    = 1536;    (* object code base address *)
  17.     rtporg    = 256;    (* run time package base address *)
  18.  
  19.     (* runtime package entry points *)
  20.     base    = rtporg+3;    cmpr    = base+3;
  21.     cspbase    = cmpr+3;    spalit    = cspbase+30;
  22.     spalod    = spalit+3;    spasto    = spalod+3;
  23.     acmpr    = spasto+3;    opr3    = acmpr+3;
  24.     opr4    = opr3+3;    opr5    = opr4+3;
  25.     opr14    = opr5+3;    opr15    = opr14+3;
  26.     spcal0    = opr15+3;    spcal    = spcal0+3;
  27.     spret    = spcal+3;    br    = spret+3;
  28.  
  29.     (* 8080 instructions *)
  30.     lhld    = 42;    shld    = 34;
  31.     pushh    = 229;    pushd    = 213;
  32.     pushb    = 197;    pushpsw    = 245;
  33.     poph    = 225;    popd    = 209;
  34.     popb    = 193;
  35.  
  36.     sphl    = 249;    pchl    = 233;
  37.     xchg    = 235;    xthl    = 227;
  38.  
  39.     dadh    = 41;    dadsp    = 57;
  40.     dadd    = 25;    dadb    = 9;
  41.  
  42.     call    = 205;    jmp    = 195;
  43.     jz    = 202;    jnz    = 194;
  44.     jnc    = 210;    jc    = 218;
  45.  
  46.     mvia    = 62;    adi    = 198;
  47.     mvid    = 22;
  48.  
  49.     lxih    = 33;    lxid    = 17;
  50.     lxib    = 1;
  51.  
  52.     movem    = 94;    movdm    = 86;
  53.     movme    = 115;    movmd    = 114;
  54.     movbh    = 68;    movcl    = 77;
  55.     movam    = 126;    movhm    = 102;
  56.     movla    = 111;    movae    = 123;
  57.     cmc    = 63;    sbba    = 159;
  58.     dcra    = 61;    orad    = 178;
  59.     anad    = 162;
  60.  
  61.     inxsp    = 51;    dcxsp    = 59;
  62.     dcxh    = 43;    inxh    = 35;
  63. type
  64.     pops    = ( (* p-op codes *)
  65.         cal, jpc, jump, lit, opr, lod, sto, int,
  66.         csp, lodx, stox, alit, alod, asto,
  67.         alodx, astox, pshf, clod, csto,
  68.         clodx, cstox, halt, lab,
  69.         peof, (* end of p-code file *)
  70.         laa, lodi, stoi, clodi, cstoi, alodi, astoi,
  71.         indx, aindx, cindx
  72.         );
  73.     fflags    = ( (* flags set when condition is false *)
  74.         ifnz, ifz, ifcz, ifznc, ifnc, ifc
  75.         );
  76.     labtyp    = array[0..nlab] of word;
  77.     codtyp    = array[0..codemax] of word;
  78.  
  79. var
  80.     label    : labtyp;    (* label p-addresses *)
  81.     adr    : labtyp;    (* label 8080 addresses *)
  82.     fla    : codtyp;    (* p-code function & level *)
  83.     aa    : codtyp;    (* p-code address *)
  84.     f    : word;        (* current instruction function *)
  85.     l    : word;        (* current instruction level *)
  86.     a    : word;        (* current instruction address *)
  87.     coa    : word;        (* code out address *)
  88.     cx    : word;        (* p-code array index *)
  89.     cix    : word;        (* number of p-codes read *)
  90.     glram    : word;        (* base address of global ram *)
  91.     pass    : word;        (* pass number *)
  92.     lfl    : fflags;    (* flags set when last
  93.                 translated conditional is
  94.                 false *)
  95.     
  96.     (* global variables for procedure getpcd for speed *)
  97.     adlo, adhi    : word;
  98.  
  99.     (* global variables for function eieiadr for speed *)
  100.     eii, eij, eik    : word;
  101.  
  102.     (* global variables for procedure trans for speed *)
  103.     transi    : word;
  104.  
  105. procedure co1b(ch: word);
  106.  
  107.     begin
  108.     coa:=coa+1;
  109.     if pass=2 then put#0(ch)
  110.     end; (* co1b *)
  111.  
  112. procedure co2b(c1,c2: word);
  113.  
  114.     begin
  115.     coa:=coa+2;
  116.     if pass=2 then put#0(c1,c2)
  117.     end; (* co2b *)
  118.  
  119. procedure co3b(c1,c2,c3: word);
  120.  
  121.     begin
  122.     coa:=coa+3;
  123.     if pass=2 then put#0(c1,c2,c3)
  124.     end; (* co3b *)
  125.  
  126. procedure co4b(c1,c2,c3,c4: word);
  127.  
  128.     begin
  129.     coa:=coa+4;
  130.     if pass=2 then put#0(c1,c2,c3,c4)
  131.     end; (* co4b *)
  132.  
  133. procedure coad(ad: word);
  134.  
  135.     begin
  136.     co1b(ad); co1b(ad/256)
  137.     end; (* coad *)
  138.  
  139. procedure coopad(op,ad: word);
  140.  
  141.     begin
  142.     co1b(op); coad(ad)
  143.     end; (* coopad *)
  144.  
  145. procedure getpcd; (* get next p-code to f, l, and a *)
  146.  
  147.     begin
  148.     if pass=1 then begin
  149.         if cix>codemax then put#1('*cd over');
  150.         get#0(f);
  151.         get#0(l);
  152.         fla[cix]:=f+l*256;
  153.         get#0(adlo); get#0(adhi);
  154.         a:=adlo+adhi*256;
  155.         aa[cix]:=a;
  156.         cix:=cix+1
  157.         end
  158.     else begin (* must be pass 2 *)
  159.         a:=fla[cx]; (* use a as a temp *)
  160.         l:=a/256; f:=a-l*256;
  161.         a:=aa[cx];
  162.         cx:=cx+1
  163.         end
  164.     end; (* getpcd *)
  165.  
  166. procedure wrsym;
  167.  
  168.     var     i    : word;
  169.  
  170.     begin
  171.     for i:=0 to nlab do begin
  172.         put#1('P',label[i]#);
  173.         put#1(' ',adr[i]#);
  174.         put#1(13,10)
  175.         end
  176.     end; (* wrsym *)
  177.  
  178. procedure gencmp;
  179.  
  180.     begin
  181.     if l=0
  182.         then coopad(call,cmpr)
  183.         else coopad(call,acmpr)
  184.     end; (* gencmp *)
  185.  
  186. procedure varadr;
  187.  
  188.     var    lev    : word;
  189.  
  190.     begin
  191.     lev:=l;
  192.     if lev=0 then begin (* local ref *)
  193.         coopad(lxib,0-a);
  194.         coopad(lhld,br); co1b(dadb)
  195.         end
  196.     else if lev=255 then (* global ref *)
  197.         coopad(lxih,a+glram)
  198.     else begin (* intermediate ref *)
  199.         co2b(mvia,lev);
  200.         coopad(call,base); coopad(lxid,0-a);
  201.         co1b(dadd)
  202.         end
  203.     end; (* varadr *)
  204.  
  205. function eieiadr(pad: word (* p-code address *) );
  206.  
  207.     begin
  208.     if pass=2 then
  209.         if adr[pad]<>0 then eieiadr:=adr[pad]
  210.         else put#1('P',pad#,'undefind',13,10)
  211.     end; (* eieiadr *)
  212.  
  213. procedure dw2;
  214.  
  215.     begin
  216.     co4b(f, l, a, a/256)
  217.     end; (* dw2 *)
  218.  
  219. procedure flagtoa;
  220.  
  221.     begin
  222.     case lfl of
  223.     ifnz:    begin
  224.         co4b(adi, 255, cmc, sbba)
  225.         end; (* ifnz *)
  226.     ifz:    begin
  227.         co3b(adi, 255, sbba)
  228.         end; (* ifz *)
  229.     ifcz:    begin
  230.         co2b(mvia, 0);
  231.         coopad(jc,coa+7); coopad(jz,coa+4); co1b(dcra)
  232.         end; (* ifcz *)
  233.     ifznc:    begin
  234.         co2b(mvia, 0);
  235.         coopad(jz,coa+6); coopad(jnc,coa+4); co1b(dcra)
  236.         end; (* ifznc *)
  237.     ifnc:    co1b(sbba);
  238.     ifc:    begin
  239.         co2b(cmc, sbba)
  240.         end (* ifc *)
  241.     end (* case lfl of *)
  242.     end; (* flagtoa *)
  243.  
  244. procedure trans;
  245.  
  246.     begin
  247.     case f of
  248.     lit:    begin
  249.         coopad(lxih,a); co1b(pushh)
  250.         end;
  251.     opr:    case a of
  252.         0:    (* procedure return *)
  253.             coopad(jmp,spret);
  254.         2:    (* (top)=(top)+(top-1) *)
  255.             begin
  256.             co4b(popd, poph, dadd, pushh)
  257.             end; (* case opr sub *)
  258.         3:    (* (top)=(top)-(top-1) *)
  259.             coopad(call,opr3);
  260.         4:    (* multiply *)
  261.             coopad(call,opr4);
  262.         5:    (* divide *)
  263.             coopad(call,opr5);
  264.         8:    begin (* (top)=(top-1) conditional *)
  265.             gencmp; lfl:=ifnz
  266.             end; (* opr 8 *)
  267.         9:    begin (* (top)<>(top-1) condtional *)
  268.             gencmp; lfl:=ifz
  269.             end; (* opr 9 *)
  270.         10:    begin (* (top)<(top-1) conditinal *)
  271.             gencmp; lfl:=ifcz
  272.             end; (* opr 10 *)
  273.         11:    begin (* (top-1)>=(top) conditonal *)
  274.             gencmp; lfl:=ifznc
  275.             end; (* opr 11 *)
  276.         12:    begin (* (top-1)>(top) conditionla *)
  277.             gencmp; lfl:=ifnc
  278.             end; (* opr 12 *)
  279.         13:    begin (* (top-1)<=(top) conditional *)
  280.             gencmp; lfl:=ifc
  281.             end; (* opr 13 *)
  282.         14:    begin (* (top)=(top-1) or (top) *)
  283.             flagtoa; co2b(popd, orad);
  284.             lfl:=ifz
  285.             end; (* opr 14 *)
  286.         15:    begin (* (top)=(top-1) and (top) *)
  287.             flagtoa; co2b(popd, anad);
  288.             lfl:=ifz
  289.             end; (* opr 15 *)
  290.         19:    begin (* increment (top) *)
  291.             co3b(poph, inxh, pushh);
  292.             lfl:=ifz
  293.             end; (* opr 19 *)
  294.         20:    begin (* decrement (top) *)
  295.             co3b(poph, dcxh, pushh)
  296.             end; (* opr 20 *)
  297.         21:    begin (* copy (top) *)
  298.             co3b(poph, pushh, pushh)
  299.             end (* case opr 21 *)
  300.         else    put#1('bad opr ',a#,13,10)
  301.         end; (* case opr *)
  302.     lod:    begin
  303.         if l=255 then begin (* global lod *)
  304.             coopad(lhld,a+glram);
  305.             co1b(pushh)
  306.             end (* global *)
  307.         else begin (* intermediate to local *)
  308.             varadr; co4b(movem, inxh, movdm, pushd);
  309.             end
  310.         end; (* case lod *)
  311.     sto:    begin
  312.         if l=255 then begin (* global sto *)
  313.             co1b(poph);
  314.             coopad(shld,a+glram)
  315.             end
  316.         else begin (* intermediate to local *)
  317.             varadr; co4b(popd, movme, inxh, movmd)
  318.             end
  319.         end; (* sto *)
  320.     cal:    begin
  321.         coopad(lxid,eieiadr(a));
  322.         if l=0
  323.             then coopad(call,spcal0)
  324.             else begin
  325.                 co2b(mvia, l);
  326.                 coopad(call,spcal)
  327.                 end;
  328.         end; (* cal *)
  329.     int:    begin
  330.         if (a>=0-4) and (a<=4) then begin
  331.             for transi:= 1 to a do
  332.                 co1b(dcxsp);
  333.             for transi:= 0-1 downto a do
  334.                 co1b(inxsp)
  335.             end
  336.         else begin
  337.             coopad(lxih,0-a);
  338.             co2b(dadsp, sphl)
  339.             end
  340.         end; (* int *)
  341.     jump:    begin
  342.         coopad(jmp,eieiadr(a))
  343.         end; (* jump *)
  344.     jpc:    begin
  345.         case lfl of
  346.         ifnz:    coopad(jnz,eieiadr(a));
  347.         ifz:    coopad(jz,eieiadr(a));
  348.         ifcz:    begin
  349.             coopad(jc,eieiadr(a));
  350.             coopad(jz,eieiadr(a))
  351.             end; (* ifcz *)
  352.         ifznc:    begin
  353.             coopad(jz,coa+6);
  354.             coopad(jnc,eieiadr(a))
  355.             end; (* ifznc *)
  356.         ifnc:    coopad(jnc,eieiadr(a));
  357.         ifc:    coopad(jc,eieiadr(a))
  358.         end (* case lfl of *)
  359.         end; (* jpc *)
  360.     pshf:    begin
  361.         flagtoa; co1b(pushpsw)
  362.         end; (* pushf *)
  363.     csp:    begin
  364.         co2b(mvia, l);
  365.         coopad(call,cspbase+3*a)
  366.         end; (* csp *)
  367.     lodx:    begin
  368.         varadr; co4b(popd, dadd, dadd, movem);
  369.         co3b(inxh, movdm, pushd)
  370.         end; (* lodx *)
  371.     stox:    begin
  372.         varadr; co4b(popd, popb, dadb, dadb);
  373.         co3b(movme, inxh, movmd)
  374.         end; (* stox *)
  375.     indx:    begin (* index word array *)
  376.         co4b(poph, dadh, popd, dadd);
  377.         co1b(pushh)
  378.         end; (* case indx *)
  379.     clod:    begin
  380.         varadr; co3b(movdm, pushd, inxsp);
  381.         end; (* clod *)
  382.     csto:    begin
  383.         varadr; co3b(popd, dcxsp, movme)
  384.         end; (* csto *)
  385.     clodi:    begin (* character load indirect *)
  386.         co4b(poph, movdm, pushd, inxsp)
  387.         end; (* case clodi *)
  388.     cstoi:    begin (* character store indirect *)
  389.         co4b(popd, dcxsp, poph, movme)
  390.         end; (* case cstoi *)
  391.     cindx:    begin (* character array index *)
  392.         co4b(poph, popd, dadd, pushh)
  393.         end; (* case cindx *)
  394.     clodx:    begin
  395.         varadr; co3b(popd, dadd, movem);
  396.         co3b(mvid, 0, pushd)
  397.         end; (* clodx *)
  398.     cstox:    begin
  399.         varadr; co4b(popd, popb, dadb, movme)
  400.         end; (* cstox *)
  401.     alit:    begin
  402.         coopad(call,spalit);
  403.         getpcd; dw2;
  404.         getpcd; dw2
  405.         end;
  406.     alod:    begin
  407.         varadr; coopad(call,spalod)
  408.         end; (* alod *)
  409.     asto:    begin
  410.         varadr; coopad(call,spasto)
  411.         end; (* asto *)
  412.     aindx:    begin
  413.         co4b(poph, dadh, dadh, dadh);
  414.         co3b(popd, dadd, pushh)
  415.         end; (* case aindx *)
  416.     alodi:    begin (* alfa load indirect *)
  417.         co1b(poph); coopad(call,spalod)
  418.         end; (* case alodi *)
  419.     astoi:    begin (* alfa store indirect *)
  420.         coopad(lxih,8);
  421.         co4b(dadsp, movam, inxh, movhm);
  422.         co1b(movla); coopad(call,spasto);
  423.         co1b(poph)
  424.         end; (* case astoi *)
  425.     alodx:    begin
  426.         varadr; co3b(popd, xchg, dadh);
  427.         co3b(dadh, dadh, dadd);
  428.         coopad(call,spalod)
  429.         end; (* alodx *)
  430.     astox:    begin
  431.         varadr; co1b(xchg); coopad(lxih,8);
  432.         co4b(dadsp, movam, inxh, movhm);
  433.         co3b(movla, dadh, dadh);
  434.         co2b(dadh, dadd); coopad(call,spasto);
  435.         co1b(poph)
  436.         end; (* case astox *)
  437.     laa:    begin
  438.         varadr; co1b(pushh)
  439.         end; (* case laa *)
  440.     lodi:    begin (* load word indirect *)
  441.         co4b(poph,movem,inxh,movdm);
  442.         co1b(pushd)
  443.         end; (* case lodi *)
  444.     stoi:    begin (* store word indirect *)
  445.         co4b(popd,poph,movme,inxh);
  446.         co1b(movmd)
  447.         end; (* case stoi *)
  448.     peof:    begin (* do nothing *)
  449.         end (* case peof *)
  450.     else    put#1('bad p-op',f#,13,10)
  451.     end (* case f of *)
  452.     end; (* trans *)
  453.  
  454. procedure pass12(ps: word);
  455.  
  456.     begin
  457.     pass:=ps;
  458.     coa:=ocode;
  459.     repeat
  460.         getpcd;
  461.         if f<>lab then trans
  462.         else if pass=1 then
  463.                 if a>nlab then put#1('*lb over')
  464.                 else adr[a]:=coa
  465.             else (* pass = 2 *)
  466.                 if adr[a]<>coa then
  467.                     put#1('Phase er',
  468.                     'ror    P',a#)
  469.     until f=peof;
  470.     if pass=1 then glram:=coa
  471.     end; (* pass12 *)
  472.  
  473. begin (* main line *)
  474.     (* zero all addresses for undefined label detection *)
  475.     (* use cix as temp index *)
  476.     put#1('pfet rev',' ',vhu#,'.',vtn#,vun#,devrel,13,10);
  477.     for cix:=0 to nlab do adr[cix]:=0;
  478.     cix:=0;
  479.     put#1('Pass 1  ',13,10);
  480.     pass12(1);
  481.     put#1(cix#,' p-codes', ' read   ',13,10);
  482.     cx:=0;
  483.     put#1('Pass 2  ',13,10);
  484.     pass12(2);
  485.     put#1('done!   ',13,10)
  486. end.
  487.