Добавил:
Eatmore
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#include "X51.h"
X51::X51()
:DPTR(0), PC(0), RA(0), RB(0), IR(0), WRK(0), WRK1(0), WRK2(0), step(0),
byte1(0), byte2(0)
{
Ram = new unsigned char[256];
Data = Ram;
Idata = Data;
Reg = Data;
Bit = Ram + 0x20;
Stack = Ram + 0x30;
SFR = Ram + 0x80;
for (int i = 0; i < 1024; i++)
{
Code[i] = 0;
Xdata[i] = 0;
}
for (int i = 0; i < 256; i++)
{
Ram[i] = 0;
Rom[i] = 0;
}
SP = 7;
//RR A
Rom[0x03] = copRr;
//ACALL a11
Rom[0x11] = copAcall;
Rom[0x31] = copAcall;
Rom[0x51] = copAcall;
Rom[0x71] = copAcall;
Rom[0x91] = copAcall;
Rom[0xB1] = copAcall;
Rom[0xD1] = copAcall;
Rom[0xF1] = copAcall;
//LCALL a16
Rom[0x12] =copLcall;
//XRL ad, A
Rom[0x62] = copXrl_ad_A;
//XRL ad, #d
Rom[0x63] = copXrl_ad_d;
//SUBB A, #d
Rom[0x94] = copSubb_A_d;
//SUBB A, @Ri
Rom[0x96] = copSubb_A_aR;
Rom[0x97] = copSubb_A_aR;
//XCH A, ad
Rom[0xC5] = copXch_ad;
//XCH A, Ri
Rom[0xC8] = copXch_R;
Rom[0xC9] = copXch_R;
Rom[0xCA] = copXch_R;
Rom[0xCB] = copXch_R;
Rom[0xCC] = copXch_R;
Rom[0xCD] = copXch_R;
Rom[0xCE] = copXch_R;
Rom[0xCF] = copXch_R;
//SETB bit
Rom[0xD2] = copSetb_bit;
//SETB C
Rom[0xD3] = copSetb_C;
//MOV A, @Ri
Rom[0xE6] = copMov_A_aR;
Rom[0xE7] = copMov_A_aR;
}
X51::~X51()
{
delete[] Ram;
}
unsigned char& X51::R(const unsigned int i)
{
return Ram[i + 8*(PSW[3]+PSW[4]*2)];
}
bool X51::isP(unsigned char res)
{
return 1 & (res + (res >> 1) + (res >> 2) + (res >> 3) + (res >> 4) + (res >> 5) + (res >> 6) + (res >> 7));
}
bool X51::isOV(unsigned char res)
{
return ((RA ^ RB) >> 7) && ((RB ^ res) >> 7);
}
bool X51::isC()
{
return RA < (RB + PSW[7]);
}
void X51::Reset()
{
DPTR = 0;
PC = 0;
RA = 0;
RB = 0;
IR = 0;
WRK = 0;
WRK1 = 0;
WRK2 = 0;
byte1 = 0;
byte2 = 0;
step = 0;
PSW = 0;
for (int i = 0; i < 256; i++)
{
Ram[i] = 0;
}
SP = 7;
}
void X51::operator() ()
{
switch(Rom[IR])
{
//rr A
case copRr:
switch(step)
{
//0 { sra, step }
case 0: A = (A >> 1) + ((A & 1) << 7); step++; break;
//1 { Acx = PC, BasB = Code, IR = BasB, step0 }
case 1: IR = Code[PC++]; step = 0; break;
}
break;
//acall a11
case copAcall:
switch(step)
{
//0 { Acx = PC, BasB = Code, Wrk = BasB, incPC, incSP, step }
case 0: WRK = Code[PC++]; SP++; step++; break;
//1 { BasA =SP, BasC = PCL, SFR = BasC, incSP, step }
case 1: Stack[SP++] = PC; step++; break;
//2 { BasA =SP, BasC = PCH, SFR = BasC, step }
case 2: Stack[SP] = PC >> 8; step++; break;
//3 { BasB = WRK, PCL = BasB, BasC = IrPc, PCH = BasC, step}
case 3: PC = WRK + ((IR & 0xE0) << 3) + (PC & 0xF800); step++; break;
//4 { Acx = PC, BasB = Code, IR = BasB, PC++, step0 }
case 4: IR = Code[PC++]; step = 0; break;
}
break;
//lcall a16
case copLcall:
switch(step)
{
//0 { Acx = PC, BasB = Code, Wrk = BasB, incPC, step }
case 0: WRK = Code[PC++]; step++; break;
//1 { Acx = PC, BasB = Code, Wrk1 = BasB, incPC, incSP, step }
case 1: WRK1 = Code[PC++]; SP++; step++; break;
//2 { BasA =SP, BasC = PCL, SFR = BasC, incSP, step }
case 2: Stack[SP++] = PC; step++; break;
//3 { BasA =SP, BasC = PCH, SFR = BasC, step }
case 3: Stack[SP] = PC >> 8; step++; break;
//4 { BasB = WRK, PCL = BasB, BasC = WRK1, PCH = BasC, step }
case 4: PC = WRK + (WRK1 << 8); step++; break;
//5 { Acx = PC, BasB = Code, IR = BasB, PC++, step0 }
case 5: IR = Code[PC++]; step = 0; break;
}
break;
// xrl ad, A
case copXrl_ad_A:
switch(step)
{
//0 { Acx = PC, BasB = Code, Wrk = BasB, incPC, step }
case 0: WRK = Code[PC++]; step++; break;
//1 { BasA = Wrk, BasB = RAM, RA = BasB, BasC = ACC, RB = ACC, step }
case 1: RA = Ram[WRK]; RB = A; step++; break;
//2 { BasA = Wrk, XRL, BasC = F, RAM = BasC, wpsw , step }
case 2: Ram[WRK] = RA ^ RB; PSW[7] = 0; PSW[2] = isP(Ram[WRK]); step++; break;
//3 { Acx = PC, BasB = Code, IR = BasB, PC++, step0 }
case 3: IR = Code[PC++]; step = 0; break;
}
break;
// xrl ad, #d
case copXrl_ad_d:
switch(step)
{
//0 { Acx = PC, BasB = Code, Wrk = BasB, incPC, step }
case 0: WRK = Code[PC++]; step++; break;
//1 { BasA = Wrk, BasB = RAM, RA = BasB, step }
case 1: RA = Ram[WRK]; step++; break;
//2 { Acx = PC, BasB = Code, Wrk1 = BasB, incPC, step }
case 2: WRK1 = Code[PC++]; step++; break;
//3 { BasC = Wrk1, RB = BasC, step }
case 3: RB = WRK1; step++; break;
//4 { BasA = Wrk, XRL, BasC = F, RAM = BasC, wpsw , step }
case 4: Ram[WRK] = RA ^ RB; PSW[7] = 0; PSW[2] = isP(Ram[WRK]); step++; break;
//5 { Acx = PC, BasB = Code, IR = BasB,PC++, step0 }
case 5: IR = Code[PC++]; step = 0; break;
}
break;
//subb A, #d
case copSubb_A_d:
switch (step)
{
//0 { Acx = PC, BasB = Code, RA = BasB, BasC = ACC, RB = BasC, incPC, step }
case 0: RA = Code[PC++]; RB = A; step++; break;
//1 { SUBB, wpsw, step }
case 1: A = RB - RA - PSW[7]; PSW[7] = isC(); PSW[2] = isOV(A); step++; break;
//2 { Acx = PC, BasB = Code, IR = BasB, PC++, step0 }
case 2: IR = Code[PC++]; step = 0; break;
}
break;
//subb A, @Ri
case copSubb_A_aR:
switch (step)
{
//0 { BasA = Rj, BasB = RAM, WRK = BasB, step }
case 0: WRK = R(IR&1); step++; break;
//1 { BasA = WRK, BasB = RAM, RA = BasB, BasC = ACC, RB = BasC, step }
case 1: RB = A; RA = Ram[WRK]; step++; break;
//2 { SUBB, wpsw, step }
case 2: A = RB - RA - PSW[7]; PSW[7] = isC(); PSW[2] = isOV(A); step++; break;
//3 { Acx = PC, BasB = Code, IR = BasB, PC++, step0 }
case 3: IR = Code[PC++]; step = 0; break;
}
break;
//xch A, ad
case copXch_ad:
switch(step)
{
//0 { Acx = PC, BasB = Code, Wrk = BasB, incPC, step }
case 0: WRK = Code[PC++]; step++; break;
//1 { BasA = WRK, BasB = RAM, WRK1 = BasB, step }
case 1: WRK1 = Ram[WRK]; step++; break;
//2 { BasA = WRK, BasC = ACC, RAM = BasC, step }
case 2: Ram[WRK] = A; step++; break;
//3 { BasC = WRK1, ACC = BasC, Acx = PC, BasB = Code, IR = BasB, PC++, step0 }
case 3: A = WRK1; IR = Code[PC++]; step = 0; break;
}
break;
//xch A, Ri
case copXch_R:
switch(step)
{
//0 { BasB = ACC, WRK = BasB, step }
case 0: WRK = A; step++; break;
//1 { BasA = Ri, BasB = RAM, WRK1 = BasB, step }
case 1: WRK1 = R(IR&7); step++; break;
//2 { BasC = WRK1, ACC = BasC, step }
case 2: A = WRK1; step++; break;
//3 { BasC = WRK, BasA = Ri, RAM = BasC, step }
case 3: R(IR&7) = WRK; step++; break;
//4 { Acx = PC, BasB = Code, IR = BasB, PC++, step0 }
case 4: IR = Code[PC++]; step = 0; break;
}
break;
//setb bit
case copSetb_bit:
switch (step)
{
//0 { Acx = PC, BasB = Code, Wrk = BasB, incPC, step }
case 0: WRK = Code[PC++]; step++; break;
//1 { ifo = WRK[7], BasB = Wrk&F8, WRK1 = BasB, step }
case 1: if (WRK >> 7) WRK1 = WRK & 0xF8; step++; break;
//2 { ifo = ~WRK[7], BasB = Wrk20, WRK1 = BasB, step }
case 2: if (!(WRK >> 7)) WRK1 = 0x20 + (WRK >> 3); step++; break;
//3 { BasA = WRK1, BasB = RAM, WRK2 = BasB, step }
case 3: WRK2 = Ram[WRK1]; step++; break;
//4 { Bita = WRK2, Bita = WRK, SETB, BasA = WRK1, BasC = Bita, RAM = BasC, step }
case 4: Ram[WRK1] = WRK2 | (1 << (WRK & 7)); step++; break;
//5 { Acx = PC, BasB = Code, IR = BasB, PC++, step0 }
case 5: IR = Code[PC++]; step = 0; break;
}
break;
//setb C
case copSetb_C:
switch (step)
{
//0 { C, step }
case 0: PSW[7] = 1; step++; break;
//1 { Acx = PC, BasB = Code, IR = BasB, PC++, step0 }
case 1: IR = Code[PC++]; step = 0; break;
}
break;
//mov A, @Ri
case copMov_A_aR:
switch(step)
{
//0 { BasA = Rj, BasB = RAM, WRK = BasB, step }
case 0: WRK = R(IR&1); step++; break;
//1 { BasA = WRK, BasB = RAM, WRK1 = BasB, step }
case 1: WRK1 = Ram[WRK]; step++; break;
//2 { BasC = WRK1, A = BaseC, Acx = PC, BasB = Code, IR = BasB, PC++, step0 }
case 2: A = WRK1; IR = Code[PC++]; step = 0; break;
}
break;
}
}
Соседние файлы в папке MyProject3