Advertisement
Guest User

Untitled

a guest
Jul 16th, 2016
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 8.37 KB | None | 0 0
  1. program test;
  2.  
  3. type
  4.   pchar = ^char;
  5.  
  6. type
  7.   TAxiRPort = record
  8.     AR: TOutPort;
  9.     R: TInPort;
  10.   end;
  11.  
  12.   TAxiPort = record
  13.     AR: TOutPort;
  14.     R: TInPort;
  15.     AW,
  16.     W: TOutPort;
  17.     B: TInPort;
  18.   end;
  19.  
  20. function GetAxiR(A,D: ptrint): TAxiRPort;
  21. begin
  22.   GetAxiR.AR:=GetOutPort(A);
  23.   GetAxiR.R:=GetInPort(D);
  24. end;
  25.  
  26. function GetAxi(A,D: ptrint): TAxiPort;
  27. begin
  28.   GetAxi.AR:=GetOutPort(A);
  29.   GetAxi.R:=GetInPort(D);
  30.   GetAxi.AW:=GetOutPort(A);
  31.   GetAxi.W:=GetOutPort(D);
  32.   GetAxi.B:=GetInPort(2);
  33. end;
  34.  
  35. var
  36.   IPort: TAxiRPort;
  37.   DPort: TAxiPort;
  38.  
  39.   Regs: TMemory;
  40.   PC: TRegister;
  41.  
  42. function ReadData(var APort: TAxiRPort; AAddr: ptrint): ptrint;
  43. begin
  44.   _Write(APort.AR, AAddr);
  45.   ReadData:=_Read(APort.R);
  46. end;
  47.  
  48. procedure WriteB(var APort: TAxiPort; AAddr, AValue: ptrint);
  49. begin
  50.   _Write(APort.AW, AAddr);
  51.   _Write(APort.W, AValue);
  52.   _Read(APort.B);
  53. end;
  54.  
  55. procedure WriteH(var APort: TAxiPort; AAddr, AValue: ptrint);
  56. begin
  57.   _Write(APort.AW, AAddr);
  58.   _Write(APort.W, AValue);
  59.   _Read(APort.B);
  60. end;
  61.  
  62. procedure WriteW(var APort: TAxiPort; AAddr, AValue: ptrint);
  63. begin
  64.   _Write(APort.AW, AAddr);
  65.   _Write(APort.W, AValue);
  66.   _Read(APort.B);
  67. end;
  68.  
  69. procedure WriteQ(var APort: TAxiPort; AAddr, AValue: ptrint);
  70. begin
  71.   _Write(APort.AW, AAddr);
  72.   _Write(APort.W, AValue);
  73.   _Read(APort.B);
  74. end;
  75.  
  76. function ReadB(var APort: TAxiPort; AAddr: ptrint): ptrint;
  77. begin
  78.   _Write(APort.AR, AAddr);
  79.   ReadB:=_Read(APort.R);
  80. end;
  81.  
  82. function ReadH(var APort: TAxiPort; AAddr: ptrint): ptrint;
  83. begin
  84.   _Write(APort.AR, AAddr);
  85.   ReadH:=_Read(APort.R);
  86. end;
  87.  
  88. function ReadW(var APort: TAxiPort; AAddr: ptrint): ptrint;
  89. begin
  90.   _Write(APort.AR, AAddr);
  91.   ReadW:=_Read(APort.R);
  92. end;
  93.  
  94. function ReadQ(var APort: TAxiPort; AAddr: ptrint): ptrint;
  95. begin
  96.   _Write(APort.AR, AAddr);
  97.   ReadQ:=_Read(APort.R);
  98. end;
  99.  
  100. const
  101.   OP_LUI     = $37;
  102.   OP_AUIPC   = $17;
  103.   OP_JAL     = $6F;
  104.   OP_JALR    = $67;
  105.   OP_BEQ     = $63;
  106.   OP_LB      = $03;
  107.   OP_SB      = $23;
  108.   OP_ADDI    = $13;
  109.   OP_ADD     = $33;
  110.   OP_ADDI32  = $1B;
  111.   OP_ADD32   = $3B;
  112.   OP_FENCE   = $0F;
  113.   OP_ECALL   = $73;
  114.  
  115. function SarInt64(a,b: int64): int64; assembler;
  116. asm
  117.   sra a1, a1, a2
  118. end;
  119.  
  120. function Extr(A,lsb,msb: ptrint): ptrint;
  121. begin
  122.   Extr:=(a shr lsb) and ((1 shl (msb-lsb+1))-1);
  123. end;
  124.  
  125. function SExt(A,msb: ptrint): ptrint;
  126. begin
  127.   if msb>=63 then
  128.     SExt:=a
  129.   else
  130.     SExt:=SarInt64(A shl (63-msb), 63-msb);
  131. end;
  132.  
  133. function ESExt(A: ptrint; msb: ptrint): ptrint;
  134. begin
  135.   if msb>=63 then
  136.     ESExt:=a
  137.   else
  138.     ESExt:=SarInt64(A shl (63-msb), 63-msb);
  139. end;
  140.  
  141. const
  142.   IllegalOpcodeAddr = 0;
  143.  
  144. procedure Execute;
  145. var
  146.   NPC, op, aaddr, imm, rd, rs1, rs2, f3, f7: ptrint;
  147.   tmp, a1, a2, a3, a4: ptrint;
  148.   result, va, vb, x: ptrint;
  149. begin
  150.   AAddr:=Load(PC);
  151.   op:=ReadData(IPort, AAddr);
  152.   NPC:=AAddr+4;
  153.  
  154.   case op and $7F of
  155.     OP_LUI,
  156.     OP_AUIPC:
  157.       begin  
  158.         // U
  159.         imm:=SExt(Extr(op,12,31) shl 12, 31);
  160.         rd:=extr(op,7,11);
  161.  
  162.         if rd>0 then
  163.         begin
  164.           if (op and $7F)=OP_LUI then
  165.             Store(regs,rd,imm)
  166.           else
  167.             Store(regs,rd,AAddr+imm);
  168.         end;
  169.       end;
  170.     OP_JAL:
  171.       begin
  172.         // UJ    
  173.         imm:=SExt((Extr(op,21,30) shl 1) or
  174.                   (Extr(op,20,20) shl 11) or
  175.                   (Extr(op,12,19) shl 12) or
  176.                   (Extr(op,31,31) shl 20),20);
  177.         rd:=extr(op,7,11);
  178.  
  179.         if rd>0 then Store(Regs,rd,AAddr+4);
  180.         NPC:=AAddr+imm;
  181.       end;
  182.     OP_SB:
  183.       begin
  184.         // S
  185.         imm:=SExt((Extr(op,7,11) shl 0) or
  186.                   (Extr(op,25,31) shl 5), 11);
  187.  
  188.         rs1:=Extr(op,15,19);
  189.         rs2:=Extr(op,20,24);    
  190.         f3:=Extr(op,12,14);
  191.  
  192.         if f3=0 then WriteB(DPort, (load(regs,rs1)+imm), (load(regs,rs2))) else
  193.         if f3=1 then WriteH(DPort, (load(regs,rs1)+imm), (load(regs,rs2))) else
  194.         if f3=2 then WriteW(DPort, (load(regs,rs1)+imm), (load(regs,rs2))) else
  195.         if f3=3 then WriteQ(DPort, (load(regs,rs1)+imm), (load(regs,rs2))) else
  196.           NPC:=IllegalOpcodeAddr;
  197.       end;
  198.     OP_BEQ:
  199.       begin
  200.         // SB
  201.         imm:=sext((extr(op,7,7) shl 11) or
  202.                   (extr(op,8,11) shl 1) or
  203.                   (extr(op,25,30) shl 5) or
  204.                   (extr(op,31,31) shl 12),12);    
  205.         rs1:=Extr(op,15,19);
  206.         rs2:=Extr(op,20,24);
  207.  
  208.         f3:=Extr(op,12,14);
  209.  
  210.         va:=load(regs,rs1);
  211.         vb:=load(regs,rs2);
  212.  
  213.         if f3=0 then result:=ord(va=vb) else
  214.         if f3=1 then result:=ord(va<>vb) else
  215.         if f3=4 then result:=ord(va<vb) else
  216.         if f3=5 then result:=ord(vb<=va) else
  217.         if f3=6 then result:=ord(qword(va)<qword(vb)) else
  218.         if f3=7 then result:=ord(qword(vb)<=qword(va)) else
  219.         begin
  220.           NPC:=IllegalOpcodeAddr;
  221.         end;
  222.  
  223.         if (result<>0) and (f3<>2) and (f3<>3) then
  224.           NPC:=AAddr+imm;
  225.       end;
  226.     OP_JALR:
  227.       begin
  228.         imm:=SExt(Extr(op,20,31), 11);
  229.         rs1:=Extr(op,15,19);  
  230.         rd:=extr(op,7,11);
  231.  
  232.         if rd>0 then store(regs,rd,npc);
  233.         NPC:=load(regs,rs1)+imm;
  234.       end;
  235.     OP_LB:
  236.       begin
  237.         imm:=SExt(Extr(op,20,31), 11);
  238.         rs1:=Extr(op,15,19);
  239.         rd:=extr(op,7,11);
  240.  
  241.         f3:=Extr(op,12,14);
  242.  
  243.         if rd>0 then
  244.         begin
  245.           if f3=0 then store(regs,rd,ESExt(ReadB(DPort, (load(regs,rs1)+imm)),7)) else
  246.           if f3=1 then store(regs,rd,ESExt(ReadH(DPort, (load(regs,rs1)+imm)),15)) else
  247.           if f3=2 then store(regs,rd,ESExt(ReadW(DPort, (load(regs,rs1)+imm)),31)) else
  248.           if f3=3 then store(regs,rd,ReadQ(DPort, (load(regs,rs1)+imm))) else
  249.           if f3=4 then store(regs,rd,ReadB(DPort, (load(regs,rs1)+imm))) else
  250.           if f3=5 then store(regs,rd,ReadH(DPort, (load(regs,rs1)+imm))) else
  251.           if f3=6 then store(regs,rd,ReadW(DPort, (load(regs,rs1)+imm))) else
  252.           begin
  253.             NPC:=IllegalOpcodeAddr;
  254.           end;
  255.         end;
  256.       end;
  257.     OP_ADDI,
  258.     OP_ADDI32:
  259.       begin
  260.         // I
  261.         rs1:=Extr(op,15,19);
  262.         imm:=SExt(Extr(op,20,31), 11);
  263.         rd:=extr(op,7,11);
  264.  
  265.         f3:=Extr(op,12,14);    
  266.         f7:=Extr(op,25,31);
  267.  
  268.         va:=load(regs,rs1);
  269.         vb:=(imm);
  270.  
  271.         if (op and $7F)=OP_ADDI32 then
  272.         begin
  273.           va:=ESExt(va,31);
  274.           vb:=ESExt(vb,31);
  275.         end;
  276.  
  277.         if f3=0 then result:=va+vb else
  278.         if f3=1 then result:=va shl vb else
  279.         if f3=2 then result:=ord(va < vb) else
  280.         if f3=3 then result:=ord(qword(va)<qword(vb)) else
  281.         if f3=4 then result:=va xor vb else
  282.         if f3=5 then
  283.         begin
  284.           if (f7 and $20)=$20 then
  285.             result:=sarint64(va,vb)
  286.           else
  287.             result:=va shr vb;
  288.         end else
  289.         if f3=6 then result:=va or vb else
  290.         result:=va and vb;
  291.  
  292.         if (op and $7F)=OP_ADDI32 then
  293.           result:=ESExt(result,31);
  294.  
  295.         if rd>0 then store(regs,rd,(result));
  296.       end;
  297.     OP_FENCE,
  298.     OP_ECALL:
  299.       begin
  300.       end;
  301.     OP_ADD,
  302.     OP_ADD32:
  303.       begin
  304.         // R
  305.         rs1:=Extr(op,15,19);
  306.         rs2:=Extr(op,20,24);
  307.         rd:=extr(op,7,11);
  308.  
  309.         f3:=Extr(op,12,14);
  310.         f7:=Extr(op,25,31);
  311.  
  312.         va:=load(regs,rs1);
  313.         vb:=load(regs,rs2);
  314.  
  315.         if (op and $7F)=OP_ADD32 then
  316.         begin
  317.           va:=ESExt(va,31);
  318.           vb:=ESExt(vb,31);
  319.         end;
  320.  
  321.         if f3=0 then
  322.         begin
  323.           if f7=$20 then
  324.             result:=va-vb
  325.           else
  326.             result:=va+vb;
  327.         end else
  328.         if f3=1 then result:=va shl vb else
  329.         if f3=2 then result:=ord(va < vb) else
  330.         if f3=3 then result:=ord(qword(va)<qword(vb)) else
  331.         if f3=4 then result:=va xor vb else
  332.         if f3=5 then
  333.         begin
  334.           if (f7 and $20)=$20 then
  335.             result:=sarint64(va,vb)
  336.           else
  337.             result:=va shr vb;
  338.         end else
  339.         if f3=6 then result:=va or vb else
  340.         result:=va and vb;
  341.  
  342.         if (op and $7F)=OP_ADD32 then
  343.           result:=ESExt(result,31);
  344.  
  345.         if rd>0 then store(regs,rd,result);
  346.       end;
  347.     else
  348.       NPC:=IllegalOpcodeAddr;
  349.   end;
  350.  
  351.   Store(PC,NPC);
  352. end;
  353.  
  354. begin
  355.   IPort:=GetAxiR(64,32);
  356.   DPort:=GetAxi(64,32);
  357.  
  358.   PC:=GetRegister(64);
  359.   Regs:=GetMemory(64,32,2,1);
  360.  
  361.   ClockedTask(@Execute);
  362. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement