⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 micro.cpp

📁 eC++编译器源码
💻 CPP
字号:
#pragma Micro
#include <stdio.h>
#include <march.h>
#include <sinout.h>
#include <string.h> 
#include <cstring.h>
#include <SYSTEM.h> 

	const unsigned int APLUSB =   0;
	const unsigned int AANDB =    1;
	const unsigned int NOTA =     3;
	const unsigned int AAA =      2;
	const unsigned int RIGHT =    1;
	const unsigned int LEFT =     2;
	const unsigned int NOJUMP =   0;
	const unsigned int JUMP =     3;
	const unsigned int JUMPNEG =  1;
	const unsigned int JUMPZERO = 2;
		
	typedef struct {
		int AMUX,MBR,MAR,RD,WR,WRC;
	} sFlags;

	typedef struct {
		unsigned int address;
		unsigned int A,B,C,SH,ALU,COND;
		sFlags flags;
	} ExpandedControlStore;

	typedef struct {
		unsigned int microInstructionCounter;
		long clocks;
		ExpandedControlStore controlStore[256];
		unsigned int memory[4096];
		unsigned int registers[18];
	} Machine;

Micro x;

void dump(Machine &m, unsigned int mar, unsigned int mbr)
     {
	 unsigned int i;
	 char c;
	 long l;
	 sFlags f; 
	
	 for (i=0; i<=15; i=i+1) x.r[i].value = m.registers[i]; 
		 
	 f = m.controlStore[m.microInstructionCounter].flags;
	 l = LONG(m.controlStore[m.microInstructionCounter].address);

	 INC(l, LONG(ORD(m.controlStore[m.microInstructionCounter].A)) * 0x000100L);
	 INC(l, LONG(ORD(m.controlStore[m.microInstructionCounter].B)) * 0x0001000L);
	 INC(l, LONG(ORD(m.controlStore[m.microInstructionCounter].C)) * 0x10000L);
	 INC(l, LONG(ORD(m.controlStore[m.microInstructionCounter].SH)) * 0x200000L);
	 INC(l, LONG(ORD(m.controlStore[m.microInstructionCounter].ALU)) * 0x800000L);
	 INC(l, LONG(ORD(m.controlStore[m.microInstructionCounter].COND)) * 0x2000000L);
	 
	 if (f.AMUX == 1) INC(l, 0x8000000L);
	 if (f.MBR == 1) INC(l, 0x1000000L); 
	 if (f.MAR == 1) INC(l, 0x800000L); 
	 if (f.RD == 1) INC(l, 0x400000L);
	 if (f.WR == 1) INC(l, 0x200000L); 
	 if (f.WRC == 1) INC(l, 0x100000L); 
	 
	 x.mar = mar;
	 x.mbr = mbr;
	 x.mir = l;
	 x.mic = m.microInstructionCounter;
	 x.clock = m.clocks;
	 x.pMem = ADR(m.memory);  
	 Paint(x);
	 Step(x);
   };   
	
	 
void Engine (Machine &m) 
   {
     unsigned int mir;
     unsigned int aluLeft, aluRight, mar, mart, mbr, mbrt;
     sFlags f;
     int i, memop;
     boolean N, Z;

     memop = 0;
     for (;;) {
	   if (memop > 0) 
	      if (memop == 2) 
		  memop = 1;
	      else {
		  memop = 0;
		  mbr = m.memory[mart];
	      }
	   else 
	      if (memop < 0) 
		 if (memop == -2) 
		     memop = -1;
		  else {
		      memop = 0;
		      m.memory[mart] = mbrt;
		  }
	   dump(m,mar,mbr); 
	   INC(m.clocks);
	   mir = m.microInstructionCounter;
	   if (mir == 0xFF) return;
	   INC(m.microInstructionCounter);
	   f = m.controlStore[mir].flags;
	   if (f.AMUX == 1) aluLeft = mbr;
	   else aluLeft = m.registers[m.controlStore[mir].A];
	   aluRight = m.registers[m.controlStore[mir].B];
	   if (f.MAR == 1) mar = m.registers[m.controlStore[mir].B] % 4096;
	   switch (m.controlStore[mir].ALU) {
		   case APLUSB:  INC(aluLeft, aluRight); break;
		   case AANDB:   aluLeft = (aluLeft & aluRight); break;
		   case NOTA:    aluLeft = ~ aluLeft; break;
		   default : break;
	   }
	   N = (aluLeft & 0x8000 == 0x8000);
	   Z = (aluLeft == 0);
	   if (m.controlStore[mir].SH == RIGHT) aluLeft = aluLeft / 2;
	   else {
		if (m.controlStore[mir].SH == LEFT) {
		    if (aluLeft >= 0x8000) DEC(aluLeft, 0x8000);
		    aluLeft = aluLeft * 2;
		}
	   }
	   if (f.MBR == 1) mbr = aluLeft;
	   if (f.WRC == 1) m.registers[m.controlStore[mir].C] = aluLeft;
	   if (f.RD == 1) 
	      if (memop == 0) {
		  mart = mar;
		  memop = 2;
	      }
	      else { 
		  if (memop != 1) HALT;
	      }
	   else {
	     if (memop == 1) HALT;
	     if (f.WR == 1) 
		 if (memop == 0) {
		     memop = -2;
		     mart = mar;
		     mbrt = mbr;
		 }  
	    }
	    if (m.controlStore[mir].COND == NOJUMP)  
	    else
	       if ((m.controlStore[mir].COND == JUMP) ||
		  (N && (m.controlStore[mir].COND == JUMPNEG)) ||
		  (Z && (m.controlStore[mir].COND==  JUMPZERO)))  
		     m.microInstructionCounter = m.controlStore[mir].address;         
     }
  };


void ClearControlStore(Machine &m,  unsigned int index) 
   {
     sFlags f;
	 
     m.controlStore[index].flags = f; 
     m.controlStore[index].A = 0;
     m.controlStore[index].B = 0;
     m.controlStore[index].C = 0;
     m.controlStore[index].address = 0;
     m.controlStore[index].COND = NOJUMP;
     m.controlStore[index].ALU = AAA;
     m.controlStore[index].SH = 0; 
  };


Machine m;

void StoreControl (unsigned int index, char s[], char &nameTable[])
   {
    unsigned int j,k,n;
    int i, posn;
    char temp[24];
    
unsigned int field ()
      {
       n = j;
       if (ReadCard(s,j,k)) DEC(i, j-n);
       else 
	  if (ReadString(s,j,temp)) {
	      DEC(i, j-n);
	      strcat(temp, ":"); 
	      posn = strstr(nameTable, temp);
	      if (posn == -1) HALT;
	      n = posn; 
	      INC(n, Length(temp));
	      if (!ReadCard(nameTable, n, k)) HALT;
	  }
	  else 
	      HALT;
       return k;
   }; 

     ClearControlStore(m, index); 
     j = 0;
     i = Length(s); 
     for(;;) {
	  k = j;
	  if ((i <= 0) || !ReadString(s,j,temp)) break;
	  DEC(i, j-k);
	  if (CompareCS(temp, "AMUX") == 0) 
	      m.controlStore[index].flags.AMUX = 1;
	  else if (CompareCS(temp,"AMBR") == 0) 
	      m.controlStore[index].flags.MBR = 1;
	  else if (CompareCS(temp,"MAR") == 0) 
	      m.controlStore[index].flags.MAR = 1;
	  else if (CompareCS(temp,"RD") == 0) 
	      m.controlStore[index].flags.RD = 1;
	  else if (CompareCS(temp,"WR") == 0) 
	      m.controlStore[index].flags.WR = 1;
	  else if (CompareCS(temp,"COND") == 0) 
	      m.controlStore[index].COND = field(); 
	  else if (CompareCS(temp,"ALU") == 0) 
	      m.controlStore[index].ALU = field(); 
	  else if (CompareCS(temp,"SH") == 0) 
	      m.controlStore[index].SH = field();  
	  else if (CompareCS(temp,"ADR") == 0) 
	      m.controlStore[index].address = field();  
	  else if (CompareCS(temp,"C") == 0) {
	      m.controlStore[index].flags.WRC = 1;
	      m.controlStore[index].C = field();  
	      }
	  else if (CompareCS(temp,"B") == 0) 
	      m.controlStore[index].B = field();  
	  else if (CompareCS(temp,"A") == 0) 
	      m.controlStore[index].A = field(); 
	  else {
	      printf("Error Encountered\n"); 
	      HALT;
	  }
     }
   };
 

void Run(char &nameTable[], char st[]) 
   {
     unsigned int i,j,k,mm,n; 
     char t[13];
     int posn;
     sFlags f; 

     f.AMUX = 0; f.MBR = 0; f.MAR = 0; f.RD = 0; f.WR = 0; f.WRC = 0;
     m.microInstructionCounter = 0;
     m.clocks = LONG(0);
     m.registers[5] = 0;
     m.registers[6] = 1;
     m.registers[7] = 0x0FFFF;
     m.registers[8] = 0x0FFF;
     m.registers[9] = 0x0FF;
     i = 0;
     j = 0;
     
     for (;;) {
	 if  (!ReadString(st,i,t)) break;
	 if (!ReadCard(st,i,k)) break;
	 strcat(t, ":");
	 posn = strstr(nameTable, t); 
	 if (posn == -1) break;
	 n = posn;
	 INC(n, Length(t)); 
	 if (!ReadBase(nameTable,n,mm,16)) break;
	 m.memory[j] = mm+k;
	 INC(j);
     }
     printf("%4d", j);
     printf("instructions loaded; ok to proceed y/n?\n");
     if (scanf("%s",t) == 1) {
	  if (CAP(t[0]) != 'Y') return; 
     }
     Open(x); 
     Engine(m);
     Close(x); 
   };

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -