📄 micro.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 + -