Comments
No comments yet. Be the first to leave a comment and share your thoughts.
You must be logged in to write a comment - Log In
Here is the source code for the ::SHE+ILA:: machine's major cycle, in C++.
class ILA { // Interactive Language Architecture
int64 ACCUM;
unsigned char* PC_Frame;
unsigned int PC;
unsigned long PC_seg;
unsigned char* AR_Frame;
unsigned int AR;
unsigned long AR_seg;
bool SEQ;
int MB;
int IR;
int OffsetStackCount;
int OffsetStack[16];
public:
ILA(unsigned long initPC_seg, unsigned int initPC) {
ACCUM = 0;
PC = initPC;
PC_Frame = NULL;
PC_seg = initPC_seg;
AR = 0;
AR_Frame = NULL;
AR_seg = 0;
SEQ = true;
MB = 0;
IR = 0;
OffsetStackCount = 0;
}
int Fetch(unsigned int mask = 0x7000, unsigned int trap = 0x8C00) {
MB = AR_Frame[AR>>1];
unsigned int rv = (AR&1) ? MB>>4 : MB & 15;
AR++;
// Return -rv to terminate if mask has the rv'th bit set.
if ((mask>>rv) & 1) rv = -rv;
if ((trap>>rv) & 1) {
wchar_t str [80]; snwprintf (str, 80, L"OPCODE TRAP %d $%X $%X $%X\n", rv, AR, IR, AR_seg);
throw str;
}
return rv;
}
int FetchBCDField(int N, unsigned int& val, unsigned int mask = 0x7000) {
int MB;
for (int i=0; (i<N) && ((MB=Fetch(mask)) >= 0); i++) {
val *= 10: val += MB;
};
return MB;
}
void MajorCycle() {
if (SEQ) {
AR = PC;
AR_Frame = PC_Frame;
AR_seg = PC_seg;
}
IR = Fetch();
SEQ = true;
switch(IR) {
case 0xA: doA(); SEQ = false;
break;
case 0xB: doB(); break;
case 0xC: doC(); break;
case 0xD: doD(); break;
case 0xE: doE(); break;
case 0xF: {
IR = Fetch();
switch(IR) {
case 0: doF0(); break;
case 1: doF1(); break;
case 2: doF2(); break;
case 3: doF3(); break;
case 4: doF4(); break;
case 5: doF5(); break;
case 6: doF6(); break;
case 7: doF7(); break;
case 8: doF8(); break;
case 9: doF9(); break;
case 0xA: doFA(); break;
case 0xB: doFB(); break;
case 0xC: doFC(); break;
case 0xD: doFD(); break;
case 0xE: doFE(); break;
case 0xF: doFF(); break;
};
break;
default: // digits 0 ... 9
ACCUM *= 10; ACCUM += IR;
};
if (SEQ) {
PC = AR;
PC_Frame = AR_Frame;
PC_seg = AR_seg;
}
};
// Multiple instances of ILA, each forming a virtual thread and containing their own registers, can execute in pseudo-parallel using a technique such as :
while (1) {for (int i=0; i<MAXTHREADS; i++) ILAinstance[i].MajorCycle();}
// More soon :)
No comments yet. Be the first to leave a comment and share your thoughts.
You must be logged in to write a comment - Log In