Добавил:
Eatmore
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:курсовые работы / курсовая работа по организации эвм (mcs 51, скорубский) / BloodEye Mutilation / Core / Microcode / mc - копия (2)
.txt #
# mc.txt - microcode for i8051 project
# (C) C.c 2011
# spbsu ifmo, spb, russia
#
@Reset: # 0x000
Romm++ # Just inc the Romm - Romm=0 is sended to all blocks if command is skipped
BusB->Acc;BusB->B;BusB->SP;BusB->Psw;BusB->PCL;BusC->PCH;BusB->DPL;BusB->DPH;Romm++ # cleaning registers and PC
BusBC=0x07;BusB->SP;Romm++ # SP=0x07;
# initializaring interruptions subsystem
BusBC=0xA8;BusCC=0xB8;Wrk1Src=BusB;Wrk2Src=BusC;SetWrk1;SetWrk2;Romm++
BusA=Wrk1;BusBC=0x00;BusB->Data[BusA];Romm++ # IE=0x00
BusA=Wrk2;BusBC=0x00;BusB->Data[BusA];Romm++ # IP=0x00
EndInterrupt;Romm++
ClrIntFLag;Romm++ # Cleaning intr flags
@Next: # Next instruction
If=!IntrFlag;BusB16=Code;PC++;SetInstruction # if (!IntrFlag) { IR=Code[PC++]; Romm=IR2Romm[IR]; }
@Interrupt:
ClrIntFlag;SP++;BusCC=0x00;Wrk1Src=BusC;SetWrk1;IPCL->BusB;Wrk2Src=BusB;SetWrk2;Goto;Romm=@CALL_Wrk1Wrk2->PC # else { ClrFlag(); Wrk1=0x00; Wrk2=IPCL(); SP++; goto @CALL_Wrk1Wrk2->PC; }
# ----- NOP ------
@$00: # nop
Goto;Romm=@Next
# ----- JMP -----
@$02: # ljmp addr16
BusB16=Code;PC++;Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=Code[PC++];
BusB16=Code;PC++;Wrk2Src=BusB;SetWrk2;Goto;Romm=@JMP_Wrk1Wrk2->PC # Wrk2=Code[PC++]; goto @JMP_Wrk1Wrk2->PC;
@$01:
@$21:
@$41:
@$61:
@$81:
@$A1:
@$C1:
@$E1: # ajmp addr11
BusB16=Code;PC++;Wrk2Src=BusB;SetWrk2;BusC16=APCH;Wrk1Src=BusC;SetWrk1;Romm++ # Wrk2=Code[PC++]; Wrk1=PCH[7..3] + (IR[7..5] >> 5);
@JMP_Wrk1Wrk2->PC:
BusB8=Wrk2;BusC8=Wrk1;BusC->PCH;BusB->PCL;Goto;Romm=@Next # PCH=Wrk1; PCL=Wrk2; goto @Next;
@$80: # sjmp offset
BusC16=Code;PC++;Wrk1Src=BusC;SetWrk1;BusB8=Psw;Wrk2Src=BusB;SetWrk2;Romm++ # Wrk1=Code[PC++]; Wrk2=Psw;
BusC8=Wrk1;BusB16=PCL;BusB->RA;BusC->RB;Romm++ # RA=Wrk1; RB=PCL;
AluOp=Add;Alu->BusB;BusB->PCL;Romm++ # PCL=RA+RB;
AluOp=Add;AluPsw->BusB;BusB->PSW;Romm++ # Psw=AluPsw;
If=Wrk1.7;Goto;Romm=@SJMP_IO_Lower # if (Wrk1<0) goto @SJMP_IO_Lower;
BusC16=PCH;BusB->RA;BusC->RB;Romm++ # RA=0; RB=PCH;
AluOp=Add;+Psw.cf;Alu->BusB;Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=RA+RB+c;
BusC8=Wrk1;BusC->PCH;BusB8=Wrk2;BusB->PSW;Goto;Romm=@Next # PCH=Wrk1; goto @Next;
@SJMP_IO_Lower:
BusC16=PCH;BusBC=0xff;BusB->RA;BusC->RB;Romm++ # RA=0xff; RB=PCH;
AluOp=Add;+Psw.cf;Alu->BusB;Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=RA+RB+c;
BusC8=Wrk1;BusC->PCH;BusB8=Wrk2;BusB->PSW;Goto;Romm=@Next # PCH=Wrk1; PSW=Wrk2; goto @Next;
@$73: # jmp @a+DPTR
BusB8=Psw;Wrk2Src=BusB;SetWrk2;Romm++ # Wrk2=PSWl
BusB8=Acc;BusC16=DPL;BusB->RA;BusC->RB;Romm++ # RA=Acc; RB=DPL;
AluOp=Add;Alu->BusB;BusB->PCL;Romm++ # PCL=RA+RB;
AluOp=Add;AluPsw->BusB;BusB->PSW;Romm++ # Psw=AluPsw;
BusC16=DPH;BusB->RA;BusC->RB;Romm++ # RA=0; RB=DPH;
AluOp=Add;+Psw.cf;Alu->BusB;Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=RA+RB+c;
BusC8=Wrk1;BusC->PCH;BusB8=Wrk2;BusB->PSW;Goto;Romm=@Next # PCH=Wrk1; PSW=Wrk2; goto @Next;
# ----- CJNE -----
@$b6:
@$b7: # cjne @Ri, #immediate, offset
BusA=Bank+IR[2..0];BusB8=Data[BusA];Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=Ri;
BusA=Wrk1;BusB8=Data[Wrk1];BusC16=Code;PC++;BusB->RA;BusC->RB;Goto;Romm=@CJNE_Compare # RA=Data[Wrk1]; RB=Code[PC++];
@$B8:
@$B9:
@$Ba:
@$Bb:
@$Bc:
@$Bd:
@$Be:
@$Bf: # cjne Rn, #immediate, offset
BusC16=Code;PC++;BusA=Bank+IR[2..0];BusB8=Data[BusA];BusB->RA;BusC->RB;Romm++ # RA=Rn; RB=Code[PC++];
@CJNE_Compare:
AluOp=suba;Alu->BusB;Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=RA-RB;
If=Wrk1Z;Goto;Romm=@CJNE_IO_Equal # if (Wrk1==0) goto @CJNE_IO_Equal;
Goto;Romm=@$80 # goto SJMP
@CJNE_IO_Equal:
PC++;Goto;Romm=@Next # PC++; goto @Next;
# ----- CALL -----
@$12: # lcall addr16
BusC16=Code;PC++;Wrk1Src=BusC;SetWrk1;Romm++ # Wrk1=Code[PC++];
BusC16=Code;PC++;Wrk2Src=BusC;SetWrk2;SP++;Goto;Romm=@CALL_Wrk1Wrk2->PC # Wrk2=Code[PC++]; SP++; goto@CALL_Wrk1Wrk2->PC;
@$11:
@$31:
@$51:
@$71:
@$91:
@$B1:
@$D1:
@$F1: # acall addr11
BusB16=Code;PC++;Wrk2Src=BusB;SetWrk2;BusC16=APCH;Wrk1Src=BusC;SetWrk1;SP++;Romm++ # Wrk2=Code[PC++]; Wrk1=PCH[7..3] + (IR[7..5] >> 5); SP++
@CALL_Wrk1Wrk2->PC:
BusB16=PCL;BusA=SP;BusB->Data[BusA];SP++;Romm++ # Data[SP++]=PCL;
BusB16=PCH;BusA=SP;BusB->Data[BusA];Romm++ # Data[SP]=PCH;
BusC8=Wrk1;BusB8=Wrk2;BusB->PCL;BusC->PCH;Goto;Romm=@Next # PCL=Wrk2; PCH=Wrk1; goto @Next;
# ----- RETI -----
@$32: # reti
EndInterrupt;Romm++ # clears the interrupt flag
# ----- RET -----
@$22: # ret
BusA=SP;SP--;BusB8=Data[BusA];Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=Data[SP--];
BusA=SP;SP--;BusB8=Data[BusA];Wrk2Src=BusB;SetWrk2;Romm++ # Wrk2=Data[SP--];
BusC8=Wrk1;BusB8=Wrk2;BusB->PCL;BusC->PCH;Goto;Romm=@Next # PCL=Wrk2; PCH=Wrk1; goto @Next;
# ----- DA -----
@$D4: # da a
BusB8=Acc;BusC8=CR;BusB->RA;BusC->RB;Romm++ # RA=Acc; RB=CR();
AluOp=Add;Alu->BusB;BusB->Acc;Romm++ # Acc=RA+RB;
AluOp=Add;BusC8=CRPsw;Wrk1Src=BusC;SetWrk1;Romm++ # Wrk1=CRPsw;
BusB8=Wrk1;BusB->Psw;Goto;Romm=@Next # Psw=Wrk1; goto @Next;
# ----- MOV -----
@$74: # mov a, #immediate
BusB16=Code;PC++;BusB->Acc;Goto;Romm=@Next # Acc=Code[PC++]; goto @Next;
@$76:
@$77: # mov @Ri, #immediate
BusC16=Code;PC++;Wrk1Src=BusC;SetWrk1;BusA=Bank+IR[0];BusB8=Data[BusA];Wrk2Src=BusB;SetWrk2;Romm++ # Wrk1=Code[PC++]; Wrk2=Data[Ri];
BusA=Wrk2;BusB8=Wrk1;BusB->Data[BusA];Goto;Romm=@Next # Data[Wrk2]=Wrk1; goto @Next;
@$75: # mov direct, #immediate
BusC16=Code;PC++;Wrk1Src=BusC;SetWrk1;Romm++ # Wrk1=Code[PC++];
BusC16=Code;PC++;Wrk2Src=BusC;SetWrk2;Romm++ # Wrk2=Code[PC++];
BusA=Wrk1;BusB8=Wrk2;BusB->Data[BusA];Goto;Romm=@Next # Data[Wrk1]=Wrk2; goto @Next;
@$78:
@$79:
@$7a:
@$7b:
@$7c:
@$7d:
@$7e:
@$7f: # mov Rn, #immediate
BusB16=Code;PC++;BusA=Bank+IR[2..0];BusB->Data[BusA];Goto;Romm=@Next; # Rn=Code[PC++]; goto @Next;
@$85: # mov dest_direct, src_direct
BusC16=Code;PC++;Wrk1Src=BusC;SetWrk1;Romm++ # Wrk1=Code[PC++];
BusA=Wrk1;BusB8=Data[BusA];Wrk2Src=BusB;SetWrk2;Goto;Romm=@MOV_Wrk2Dest; # Wrk2=Data[Wrk1];
@$86:
@$87: # mov direct, @Ri
BusA=Bank+IR[0];BusB8=Data[BusA];Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=Ri
BusA=Wrk1;BusB8=Data[BusA];Wrk2Src=BusB;SetWrk2;Romm++ # Wrk2=Data[Wrk1];
@MOV_Wrk2Dest:
BusC16=Code;PC++;Wrk1Src=BusC;SetWrk1;Romm++ # Wrk1=Code[PC++];
BusA=Wrk1;BusB8=Wrk2;BusB->Data[BusA];Goto;Romm=@Next # Data[Wrk1]=Wrk2; goto @Next;
@$90: # mov DPTR, #immediate
BusB16=Code;PC++;BusB->DPH;Romm++ # DPH=Code[PC++];
BusB16=Code;PC++;BusB->DPL;Goto;Romm=@Next # DPL=Code[PC++];
@$A6:
@$A7: # mov @Ri, direct
BusC16=Code;PC++;Wrk1Src=BusC;SetWrk1;Romm++ # Wrk1=Code[PC++];
BusA=Wrk1;BusB8=Data[BusA];Wrk2Src=BusB;SetWrk2;Romm++ # Wrk2=Data[Wrk1];
BusA=Bank+IR[0];BusB8=Wrk2;BusB->Data[BusA];Goto;Romm=@Next # Ri=Wrk2; goto @Next;
@$A8:
@$A9:
@$Aa:
@$Ab:
@$Ac:
@$Ad:
@$Ae:
@$Af: # mov Rn, direct
BusB16=Code;PC++;Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=Code[PC++];
BusA=Wrk1;BusB8=Data[BusA];Wrk2Src=BusB;SetWrk2;Romm++ # Wrk2=Data[Wrk1];
BusB8=Wrk2;BusA=Bank+IR[2..0];BusB->Data[BusA];Goto;Romm=@Next # Rn=Wrk2; goto @Next;
@$F6:
@$F7: # mov @Ri, Acc
BusA=Bank+IR[0];BusB8=Data[BusA];Wrk2Src=BusB;SetWrk2;Romm++ # Wrk2=Data[Ri];
BusA=Wrk2;BusB8=Acc;BusB->Data[BusA];Goto;Romm=@Next # Data[Wrk2]=Acc; goto @Next;
@$F8:
@$F9:
@$Fa:
@$Fb:
@$Fc:
@$Fd:
@$Fe:
@$Ff: # mov Rn, Acc
BusB8=Acc;BusA=Bank+IR[2..0];BusB->Data[BusA];Goto;Romm=@Next; # Rn=Acc; goto @Next;
# ----- MOVC -----
@$93: # movc a, @a+DPTR
BusB8=Psw;BusB->Acc;Romm++ # Acc=PSW; // anyway, this instruction changes Acc
BusB8=Acc;BusC16=DPL;BusB->RA;BusC->RB;Romm++ # RA=Acc; RB=DPL;
AluOp=Add;Alu->BusB;Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=RA+RB;
AluOp=Add;AluPsw->BusB;BusB->PSW;Romm++ # Psw=AluPsw;
BusC16=DPH;BusB->RA;BusC->RB;Goto;Romm=@MOVC_End # RA=0; RB=DPH;
@$83: # movc a, @a+PC
BusB8=Psw;BusB->Acc;Romm++ # Acc=PSW;
BusB8=Acc;BusC16=PCL;BusB->RA;BusC->RB;Romm++ # RA=Acc; RB=PCL;
AluOp=Add;Alu->BusB;Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=RA+RB;
AluOp=Add;AluPsw->BusB;BusB->PSW;Romm++ # Psw=AluPsw;
BusC16=PCH;BusB->RA;BusC->RB;Romm++ # RA=0; RB=PCH;
@MOVC_End:
AluOp=Add;+Psw.cf;Alu->BusB;Wrk2Src=BusB;SetWrk2;Romm++ # Wrk2=RA+RB+c;
BusB8=Acc;BusB->PSW;Romm++ # Psw=Acc;
BusB16=Code;ACX=Wrk2.Wrk1;BusB->Acc;Goto;Romm=@Next # Acc=Code[Wrk2Wrk1]; goto @Next;
# ----- MOVX ------
@$E0: # movx a, @DPTR
BusB16=XData;ACX=DPTR;BusB->Acc;Goto;Romm=@MOVC_End # Acc=XData[DPTR]; goto @Next;
@$F0: # movx @DPTR, a
BusB8=Acc;ACX=DPTR;BusB->XData[ACX];Goto;Romm=@MOVC_End # XData[DPTR]=Acc; goto @Next;
# ----- ORL -----
@$44: # orl Acc, #immediate
BusB8=Acc;BusC16=Code;PC++;BusB->RA;BusC->RB;Romm++ # RA=Acc; RB=Code[PC++];
AluOp=OR;Alu->BusB;BusB->Acc;Goto;Romm=@Next # Acc = RA | RB; goto @Next;
@$46: # orl Acc, @Ri
BusA=Bank+IR[0];BusB8=Data[BusA];Wrk1Src=BusB;SetWrk1;Romm++; # Wrk1=Ri;
BusA=Wrk1;BusB8=Data[BusA];BusC8=Acc;BusB->RA;BusC->RB;Romm++ # RA=Data[Wrk1]; RB=Acc;
AluOp=OR;Alu->BusB;BusB->Acc;Goto;Romm=@Next # Acc = RA | RB; goto @Next;
@$48:
@$49:
@$4a:
@$4b:
@$4c:
@$4d:
@$4e:
@$4f: # orl Acc, Rn
BusA=Bank+IR[2..0];BusB8=Data[BusA];Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=Rn;
BusB8=Acc;BusC8=Wrk1;BusB->RA;BusC->RB;Romm++ # RA=Acc; RB=Wrk1;
AluOp=OR;Alu->BusB;BusB->Acc;Goto;Romm=@Next # Acc = RA | RB; goto @Next;
# ----- PUSH/POP -----
@$C0: # push direct
BusB16=Code;PC++;Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=Code[PC++];
BusA=Wrk1;BusB8=Data[BusA];Wrk2Src=BusB;SetWrk2;Romm++ # Wrk2=Data[Wrk1]; SP++;
SP++;Romm++ # nop; //Dirty hack due to error in schematics. May be caused because BusA switches too slow.
BusA=SP;BusB8=Wrk2;BusB->Data[BusA];Goto;Romm=@Next # Data[SP]=Wrk2; goto @Next;
@$D0: # pop direct
BusA=SP;BusB8=Data[BusA];Wrk2Src=BusB;SetWrk2;SP--;Romm++ # Wrk2=Data[SP--];
BusB16=Code;PC++;Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=Code[PC++];
BusA=Wrk1;BusB8=Wrk2;BusB->Data[BusA];Goto;Romm=@Next # Data[Wrk1]=Wrk2;
# ----- ADD ------
@$24: # add a, #immediate
BusC16=Code;PC++;BusB8=Acc;BusB->RA;BusC->RB;Romm++ # RA=Acc; RB=Code[PC++];
AluOp=add;Alu->BusB;BusB->Acc;Romm++ # Acc=RA+RB;
AluOp=add;AluPSw->BusB;BusB->Psw;Goto;Romm=@Next # Psw=AluPsw(RA+RB); goto @Next;
@$25: # add a, direct
BusC16=Code;PC++;Wrk1Src=BusC;SetWrk1;BusB8=Acc;Wrk2Src=BusB;SetWrk2;Romm++ # Wrk1=Code[PC++]; Wrk2=Acc;
BusA=Wrk1;BusB8=Data[BusA];BusB->RA;BusC8=Wrk2;BusC->RB;Romm++ # RA=Data[Wrk1]; RB=Wrk2;
AluOp=add;Alu->BusB;BusB->Acc;Romm++ # Acc=RA+RB;
AluOp=add;AluPSw->BusB;BusB->Psw;Goto;Romm=@Next # Psw=AluPsw(RA+RB); goto @Next;
@$28:
@$29:
@$2a:
@$2b:
@$2c:
@$2d:
@$2e:
@$2f: # add a, Rn
BusB8=Acc;Wrk2Src=BusB;SetWrk2;Romm++ # Wrk2=Acc;
BusA=Bank+IR[2..0];BusB8=Data[BusA];BusB->RA;BusC8=Wrk2;BusC->RB;Romm++ # RA=Rn; RB=Wrk2;
AluOp=add;Alu->BusB;BusB->Acc;Romm++ # Acc=RA+RB;
AluOp=add;AluPSw->BusB;BusB->Psw;Goto;Romm=@Next # Psw=AluPsw(RA+RB); goto @Next;
@$26:
@$27: # add a, @Ri
BusA=Bank+IR[0];BusB8=Data[BusA];Wrk1Src=BusB;SetWrk1;Romm++; # Wrk1=Ri;
BusA=Wrk1;BusB8=Data[BusA];BusC8=Acc;BusB->RA;BusC->RB;Romm++ # RA=Data[Wrk1]; RB=Acc;
AluOp=add;Alu->BusB;BusB->Acc;Romm++ # Acc=RA+RB;
AluOp=add;AluPSw->BusB;BusB->Psw;Goto;Romm=@Next # Psw=AluPsw(RA+RB); goto @Next;
# ----- SETB ------
@$D2: # setb bit
BusB16=Code;PC++;BusB->AdBit;Goto;Romm=@SETB_Set # AdBit=Code[PC++]; goto @SETB_Set;
@$D3: # setb c
BusBC=0xD7;BusB->AdBit;Romm++ # AdBit=0xD7; // PSW.7==0xD7
@SETB_Set:
BusA=AdBit;BusB8=Data[BusA];BusB->BitBuf;Romm++ # BitBuf=Data[BA(AdBit)];
BitOp=Set;BLU->BusB;BusA=AdBit;BusB->Data[BusA];Goto;Romm=@Next; # Data[BA(AdBit)]=BitBuf|2^(AdBit[2..0]); goto @Next;
# ----- CLR ------
@$E4: # clr a
BusBC=0x00;BusB->Acc;Goto;Romm=@Next; # Acc=0; goto @Next;
@$C2: # clr bit
BusB16=Code;PC++;BusB->AdBit;Goto;Romm=@CLR_BitClear # AdBit=Code[PC++]; goto @CLR_BitClear;
@$C3: # clr c
BusBC=0xD7;BusB->AdBit;Romm++ # AdBit=0xD7; // PSW.7==0xD7
@CLR_BitClear:
BusA=AdBit;BusB8=Data[BusA];BusB->BitBuf;Romm++ # BitBuf=Data[BA(AdBit)];
BitOp=Null;BLU->BusB;BusA=AdBit;BusB->Data[BusA];Goto;Romm=@Next; # Data[BA(AdBit)]=BitBuf & ~(2^(AdBit[2..0])); goto @Next;
# ----- SWAP ------
@$C4: # swap a
BusC8=AccSwap;Wrk1Src=BusC;SetWrk1;Romm++ # Wrk1=Swap(Acc);
BusB8=Wrk1;BusB->Acc;Goto;Romm=@Next; # Acc=Wrk1; goto @Next;
# ----- XCH ------
@$C5: # xch a, direct
BusB16=Code;PC++;Wrk1Src=BusB;SetWrk1;Goto;Romm=@XCH_SwapAcc[Wrk1] # Wrk1=Code[PC++];
@$C6:
@$C7: # xch a, @Ri
BusA=Bank+IR[0];BusB8=Data[BusA];Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=Ri;
@XCH_SwapAcc[Wrk1]:
BusA=Wrk1;BusB8=Data[BusA];Wrk2Src=BusB;SetWrk2;Romm++ # Wrk2=Data[Wrk1];
BusA=Wrk1;BusB8=Wrk1;BusB->Data[BusA];Romm++ # Data[Wrk1]=Acc;
BusB8=Wrk2;BusB->Acc;Goto;Romm=@Next # Acc=Wrk2; goto @Next;
@$C8:
@$C9:
@$Ca:
@$Cb:
@$Cc:
@$Cd:
@$Ce:
@$Cf: # xch a, Rn
BusA=Bank+IR[2..0];BusB8=Data[BusA];Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=Rn;
BusA=Bank+IR[2..0];BusB8=Acc;BusB->Data[BusA];Romm++ # Rn=Acc;
BusB8=Wrk1;BusB->Acc;Goto;Romm=@Next # Acc=Wrk1; goto @Next;
# ----- Shifts -----
@$23: # rl a
BusB8=AccRL;Wrk1Src=BusB;SetWrk1;Goto;Romm=@Rx_End # Wrk1 = (Acc << 1) + (Acc >> 7); goto @Rx_End;
@$03: # rr a
BusB8=AccRR;Wrk1Src=BusB;SetWrk1;Goto;Romm=@Rx_End # Wrk1 = (Acc >> 1) + (Acc << 7); goto @Rx_End;
@$33: # rlc a
BusB8=AccRLC;Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1 = (Acc << 1) + (Psw >> 7);
BusB8=PswRLC;Wrk2Src=BusB;SetWrk2;Goto;Romm=@RxC_End # Wrk2 = (Acc >> 7)+ (PSW & 0x7f); goto @RxC_End;
@$13: # rrc a
BusB8=AccRRC;Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1 = (Acc >> 1) + (Psw << 7);
BusB8=PswRRC;Wrk2Src=BusB;SetWrk2;Romm++ # Wrk2 = (Acc & 0x7f) + (PSW & 0x7f);
@RxC_End:
BusB8=Wrk2;BusB->Psw;Romm++ # Psw=Wrk2;
@Rx_End:
BusB8=Wrk1;BusB->Acc;Goto;Romm=@Next; # Acc=Wrk1; goto @Next;
# ----- INC ------
@$04: # inc a
BusB8=Acc;BusCC=0x01;BusB->RA;BusC->RB;Romm++ # RA=Acc; RB=1;
AluOp=Add;Alu->BusB;BusB->Acc;Romm++ # Acc=RA+RB;
AluOp=Add;AluPsw->BusB;BusB->Psw;Goto;Romm=@Next # Psw=AluPsw(RA+RB); goto @Next;
@$05: # inc direct
BusB16=Code;PC++;Wrk1Src=BusB;SetWrk1;Goto;Romm=@INC_DiRiEnd # Wrk1=Code[PC++]; goto @INC_DRiEnd;
@$06:
@$07: # inc @Ri
BusA=Bank+IR[0];BusB8=Data[BusA];Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=Ri;
@INC_DiRiEnd:
BusA=Wrk1;BusB8=Data[BusA];BusB->RA;BusCC=0x01;BusC->RB;Romm++ # RA=Data[Wrk1]; RB=1;
AluOp=Add;Alu->BusB;BusA=Wrk1;BusB->Data[BusA];Goto;Romm=@Next # Data[Wrk1]=RA+RB; goto @Next;
@$A3: # inc DPTR
DPTR++;Goto;Romm=@Next # DPTR++; goto @Next;
@$08:
@$09:
@$0a:
@$0b:
@$0c:
@$0d:
@$0e:
@$0f: # inc Rn
BusA=Bank+IR[2..0];BusB8=Data[BusA];BusCC=0x01;BusB->RA;BusC->RB;Romm++ # RA=Rn; RB=1;
AluOp=Add;Alu->BusB;BusA=Bank+IR[2..0];BusB->Data[BusA];Goto;Romm=@Next # Acc=RA+RB; goto @Next;
# ----- MUL/DIV -----
@$A4: # mul ab
MulPsw->BusB;Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=MulPsw(Acc, B);
BusB8=Wrk1;BusB->Psw;Romm++ # Psw=Wrk1;
MulAB;Wrk1Src=BusB;SetWrk1;Wrk2Src=BusC;SetWrk2;Goto;Romm=@MULDIV_End # Wrk1 = (Acc*B & 0xff); Wrk2 = (Acc*B) >> 8;
@$84: # div ab
MulPsw->BusB;Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=DivPsw(Acc, B);
BusB8=Wrk1;BusB->Psw;Romm++ # Psw=Wrk1;
DivAB;Wrk1Src=BusB;SetWrk1;Wrk2Src=BusC;SetWrk2;Romm++ # Wrk1 = Acc/B; Wrk2 = Acc%B;
@MULDIV_End:
BusB8=Wrk1;BusB->Acc;Romm++ # Acc=Wrk1;
BusB8=Wrk2;BusB->B;Goto;Romm=@Next # B=Wrk2; goto @Next;
# ----- END -----
# mc.txt - microcode for i8051 project
# (C) C.c 2011
# spbsu ifmo, spb, russia
#
@Reset: # 0x000
Romm++ # Just inc the Romm - Romm=0 is sended to all blocks if command is skipped
BusB->Acc;BusB->B;BusB->SP;BusB->Psw;BusB->PCL;BusC->PCH;BusB->DPL;BusB->DPH;Romm++ # cleaning registers and PC
BusBC=0x07;BusB->SP;Romm++ # SP=0x07;
# initializaring interruptions subsystem
BusBC=0xA8;BusCC=0xB8;Wrk1Src=BusB;Wrk2Src=BusC;SetWrk1;SetWrk2;Romm++
BusA=Wrk1;BusBC=0x00;BusB->Data[BusA];Romm++ # IE=0x00
BusA=Wrk2;BusBC=0x00;BusB->Data[BusA];Romm++ # IP=0x00
EndInterrupt;Romm++
ClrIntFLag;Romm++ # Cleaning intr flags
@Next: # Next instruction
If=!IntrFlag;BusB16=Code;PC++;SetInstruction # if (!IntrFlag) { IR=Code[PC++]; Romm=IR2Romm[IR]; }
@Interrupt:
ClrIntFlag;SP++;BusCC=0x00;Wrk1Src=BusC;SetWrk1;IPCL->BusB;Wrk2Src=BusB;SetWrk2;Goto;Romm=@CALL_Wrk1Wrk2->PC # else { ClrFlag(); Wrk1=0x00; Wrk2=IPCL(); SP++; goto @CALL_Wrk1Wrk2->PC; }
# ----- NOP ------
@$00: # nop
Goto;Romm=@Next
# ----- JMP -----
@$02: # ljmp addr16
BusB16=Code;PC++;Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=Code[PC++];
BusB16=Code;PC++;Wrk2Src=BusB;SetWrk2;Goto;Romm=@JMP_Wrk1Wrk2->PC # Wrk2=Code[PC++]; goto @JMP_Wrk1Wrk2->PC;
@$01:
@$21:
@$41:
@$61:
@$81:
@$A1:
@$C1:
@$E1: # ajmp addr11
BusB16=Code;PC++;Wrk2Src=BusB;SetWrk2;BusC16=APCH;Wrk1Src=BusC;SetWrk1;Romm++ # Wrk2=Code[PC++]; Wrk1=PCH[7..3] + (IR[7..5] >> 5);
@JMP_Wrk1Wrk2->PC:
BusB8=Wrk2;BusC8=Wrk1;BusC->PCH;BusB->PCL;Goto;Romm=@Next # PCH=Wrk1; PCL=Wrk2; goto @Next;
@$80: # sjmp offset
BusC16=Code;PC++;Wrk1Src=BusC;SetWrk1;BusB8=Psw;Wrk2Src=BusB;SetWrk2;Romm++ # Wrk1=Code[PC++]; Wrk2=Psw;
BusC8=Wrk1;BusB16=PCL;BusB->RA;BusC->RB;Romm++ # RA=Wrk1; RB=PCL;
AluOp=Add;Alu->BusB;BusB->PCL;Romm++ # PCL=RA+RB;
AluOp=Add;AluPsw->BusB;BusB->PSW;Romm++ # Psw=AluPsw;
If=Wrk1.7;Goto;Romm=@SJMP_IO_Lower # if (Wrk1<0) goto @SJMP_IO_Lower;
BusC16=PCH;BusB->RA;BusC->RB;Romm++ # RA=0; RB=PCH;
AluOp=Add;+Psw.cf;Alu->BusB;Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=RA+RB+c;
BusC8=Wrk1;BusC->PCH;BusB8=Wrk2;BusB->PSW;Goto;Romm=@Next # PCH=Wrk1; goto @Next;
@SJMP_IO_Lower:
BusC16=PCH;BusBC=0xff;BusB->RA;BusC->RB;Romm++ # RA=0xff; RB=PCH;
AluOp=Add;+Psw.cf;Alu->BusB;Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=RA+RB+c;
BusC8=Wrk1;BusC->PCH;BusB8=Wrk2;BusB->PSW;Goto;Romm=@Next # PCH=Wrk1; PSW=Wrk2; goto @Next;
@$73: # jmp @a+DPTR
BusB8=Psw;Wrk2Src=BusB;SetWrk2;Romm++ # Wrk2=PSWl
BusB8=Acc;BusC16=DPL;BusB->RA;BusC->RB;Romm++ # RA=Acc; RB=DPL;
AluOp=Add;Alu->BusB;BusB->PCL;Romm++ # PCL=RA+RB;
AluOp=Add;AluPsw->BusB;BusB->PSW;Romm++ # Psw=AluPsw;
BusC16=DPH;BusB->RA;BusC->RB;Romm++ # RA=0; RB=DPH;
AluOp=Add;+Psw.cf;Alu->BusB;Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=RA+RB+c;
BusC8=Wrk1;BusC->PCH;BusB8=Wrk2;BusB->PSW;Goto;Romm=@Next # PCH=Wrk1; PSW=Wrk2; goto @Next;
# ----- CJNE -----
@$b6:
@$b7: # cjne @Ri, #immediate, offset
BusA=Bank+IR[2..0];BusB8=Data[BusA];Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=Ri;
BusA=Wrk1;BusB8=Data[Wrk1];BusC16=Code;PC++;BusB->RA;BusC->RB;Goto;Romm=@CJNE_Compare # RA=Data[Wrk1]; RB=Code[PC++];
@$B8:
@$B9:
@$Ba:
@$Bb:
@$Bc:
@$Bd:
@$Be:
@$Bf: # cjne Rn, #immediate, offset
BusC16=Code;PC++;BusA=Bank+IR[2..0];BusB8=Data[BusA];BusB->RA;BusC->RB;Romm++ # RA=Rn; RB=Code[PC++];
@CJNE_Compare:
AluOp=suba;Alu->BusB;Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=RA-RB;
If=Wrk1Z;Goto;Romm=@CJNE_IO_Equal # if (Wrk1==0) goto @CJNE_IO_Equal;
Goto;Romm=@$80 # goto SJMP
@CJNE_IO_Equal:
PC++;Goto;Romm=@Next # PC++; goto @Next;
# ----- CALL -----
@$12: # lcall addr16
BusC16=Code;PC++;Wrk1Src=BusC;SetWrk1;Romm++ # Wrk1=Code[PC++];
BusC16=Code;PC++;Wrk2Src=BusC;SetWrk2;SP++;Goto;Romm=@CALL_Wrk1Wrk2->PC # Wrk2=Code[PC++]; SP++; goto@CALL_Wrk1Wrk2->PC;
@$11:
@$31:
@$51:
@$71:
@$91:
@$B1:
@$D1:
@$F1: # acall addr11
BusB16=Code;PC++;Wrk2Src=BusB;SetWrk2;BusC16=APCH;Wrk1Src=BusC;SetWrk1;SP++;Romm++ # Wrk2=Code[PC++]; Wrk1=PCH[7..3] + (IR[7..5] >> 5); SP++
@CALL_Wrk1Wrk2->PC:
BusB16=PCL;BusA=SP;BusB->Data[BusA];SP++;Romm++ # Data[SP++]=PCL;
BusB16=PCH;BusA=SP;BusB->Data[BusA];Romm++ # Data[SP]=PCH;
BusC8=Wrk1;BusB8=Wrk2;BusB->PCL;BusC->PCH;Goto;Romm=@Next # PCL=Wrk2; PCH=Wrk1; goto @Next;
# ----- RETI -----
@$32: # reti
EndInterrupt;Romm++ # clears the interrupt flag
# ----- RET -----
@$22: # ret
BusA=SP;SP--;BusB8=Data[BusA];Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=Data[SP--];
BusA=SP;SP--;BusB8=Data[BusA];Wrk2Src=BusB;SetWrk2;Romm++ # Wrk2=Data[SP--];
BusC8=Wrk1;BusB8=Wrk2;BusB->PCL;BusC->PCH;Goto;Romm=@Next # PCL=Wrk2; PCH=Wrk1; goto @Next;
# ----- DA -----
@$D4: # da a
BusB8=Acc;BusC8=CR;BusB->RA;BusC->RB;Romm++ # RA=Acc; RB=CR();
AluOp=Add;Alu->BusB;BusB->Acc;Romm++ # Acc=RA+RB;
AluOp=Add;BusC8=CRPsw;Wrk1Src=BusC;SetWrk1;Romm++ # Wrk1=CRPsw;
BusB8=Wrk1;BusB->Psw;Goto;Romm=@Next # Psw=Wrk1; goto @Next;
# ----- MOV -----
@$74: # mov a, #immediate
BusB16=Code;PC++;BusB->Acc;Goto;Romm=@Next # Acc=Code[PC++]; goto @Next;
@$76:
@$77: # mov @Ri, #immediate
BusC16=Code;PC++;Wrk1Src=BusC;SetWrk1;BusA=Bank+IR[0];BusB8=Data[BusA];Wrk2Src=BusB;SetWrk2;Romm++ # Wrk1=Code[PC++]; Wrk2=Data[Ri];
BusA=Wrk2;BusB8=Wrk1;BusB->Data[BusA];Goto;Romm=@Next # Data[Wrk2]=Wrk1; goto @Next;
@$75: # mov direct, #immediate
BusC16=Code;PC++;Wrk1Src=BusC;SetWrk1;Romm++ # Wrk1=Code[PC++];
BusC16=Code;PC++;Wrk2Src=BusC;SetWrk2;Romm++ # Wrk2=Code[PC++];
BusA=Wrk1;BusB8=Wrk2;BusB->Data[BusA];Goto;Romm=@Next # Data[Wrk1]=Wrk2; goto @Next;
@$78:
@$79:
@$7a:
@$7b:
@$7c:
@$7d:
@$7e:
@$7f: # mov Rn, #immediate
BusB16=Code;PC++;BusA=Bank+IR[2..0];BusB->Data[BusA];Goto;Romm=@Next; # Rn=Code[PC++]; goto @Next;
@$85: # mov dest_direct, src_direct
BusC16=Code;PC++;Wrk1Src=BusC;SetWrk1;Romm++ # Wrk1=Code[PC++];
BusA=Wrk1;BusB8=Data[BusA];Wrk2Src=BusB;SetWrk2;Goto;Romm=@MOV_Wrk2Dest; # Wrk2=Data[Wrk1];
@$86:
@$87: # mov direct, @Ri
BusA=Bank+IR[0];BusB8=Data[BusA];Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=Ri
BusA=Wrk1;BusB8=Data[BusA];Wrk2Src=BusB;SetWrk2;Romm++ # Wrk2=Data[Wrk1];
@MOV_Wrk2Dest:
BusC16=Code;PC++;Wrk1Src=BusC;SetWrk1;Romm++ # Wrk1=Code[PC++];
BusA=Wrk1;BusB8=Wrk2;BusB->Data[BusA];Goto;Romm=@Next # Data[Wrk1]=Wrk2; goto @Next;
@$90: # mov DPTR, #immediate
BusB16=Code;PC++;BusB->DPH;Romm++ # DPH=Code[PC++];
BusB16=Code;PC++;BusB->DPL;Goto;Romm=@Next # DPL=Code[PC++];
@$A6:
@$A7: # mov @Ri, direct
BusC16=Code;PC++;Wrk1Src=BusC;SetWrk1;Romm++ # Wrk1=Code[PC++];
BusA=Wrk1;BusB8=Data[BusA];Wrk2Src=BusB;SetWrk2;Romm++ # Wrk2=Data[Wrk1];
BusA=Bank+IR[0];BusB8=Wrk2;BusB->Data[BusA];Goto;Romm=@Next # Ri=Wrk2; goto @Next;
@$A8:
@$A9:
@$Aa:
@$Ab:
@$Ac:
@$Ad:
@$Ae:
@$Af: # mov Rn, direct
BusB16=Code;PC++;Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=Code[PC++];
BusA=Wrk1;BusB8=Data[BusA];Wrk2Src=BusB;SetWrk2;Romm++ # Wrk2=Data[Wrk1];
BusB8=Wrk2;BusA=Bank+IR[2..0];BusB->Data[BusA];Goto;Romm=@Next # Rn=Wrk2; goto @Next;
@$F6:
@$F7: # mov @Ri, Acc
BusA=Bank+IR[0];BusB8=Data[BusA];Wrk2Src=BusB;SetWrk2;Romm++ # Wrk2=Data[Ri];
BusA=Wrk2;BusB8=Acc;BusB->Data[BusA];Goto;Romm=@Next # Data[Wrk2]=Acc; goto @Next;
@$F8:
@$F9:
@$Fa:
@$Fb:
@$Fc:
@$Fd:
@$Fe:
@$Ff: # mov Rn, Acc
BusB8=Acc;BusA=Bank+IR[2..0];BusB->Data[BusA];Goto;Romm=@Next; # Rn=Acc; goto @Next;
# ----- MOVC -----
@$93: # movc a, @a+DPTR
BusB8=Psw;BusB->Acc;Romm++ # Acc=PSW; // anyway, this instruction changes Acc
BusB8=Acc;BusC16=DPL;BusB->RA;BusC->RB;Romm++ # RA=Acc; RB=DPL;
AluOp=Add;Alu->BusB;Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=RA+RB;
AluOp=Add;AluPsw->BusB;BusB->PSW;Romm++ # Psw=AluPsw;
BusC16=DPH;BusB->RA;BusC->RB;Goto;Romm=@MOVC_End # RA=0; RB=DPH;
@$83: # movc a, @a+PC
BusB8=Psw;BusB->Acc;Romm++ # Acc=PSW;
BusB8=Acc;BusC16=PCL;BusB->RA;BusC->RB;Romm++ # RA=Acc; RB=PCL;
AluOp=Add;Alu->BusB;Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=RA+RB;
AluOp=Add;AluPsw->BusB;BusB->PSW;Romm++ # Psw=AluPsw;
BusC16=PCH;BusB->RA;BusC->RB;Romm++ # RA=0; RB=PCH;
@MOVC_End:
AluOp=Add;+Psw.cf;Alu->BusB;Wrk2Src=BusB;SetWrk2;Romm++ # Wrk2=RA+RB+c;
BusB8=Acc;BusB->PSW;Romm++ # Psw=Acc;
BusB16=Code;ACX=Wrk2.Wrk1;BusB->Acc;Goto;Romm=@Next # Acc=Code[Wrk2Wrk1]; goto @Next;
# ----- MOVX ------
@$E0: # movx a, @DPTR
BusB16=XData;ACX=DPTR;BusB->Acc;Goto;Romm=@MOVC_End # Acc=XData[DPTR]; goto @Next;
@$F0: # movx @DPTR, a
BusB8=Acc;ACX=DPTR;BusB->XData[ACX];Goto;Romm=@MOVC_End # XData[DPTR]=Acc; goto @Next;
# ----- ORL -----
@$44: # orl Acc, #immediate
BusB8=Acc;BusC16=Code;PC++;BusB->RA;BusC->RB;Romm++ # RA=Acc; RB=Code[PC++];
AluOp=OR;Alu->BusB;BusB->Acc;Goto;Romm=@Next # Acc = RA | RB; goto @Next;
@$46: # orl Acc, @Ri
BusA=Bank+IR[0];BusB8=Data[BusA];Wrk1Src=BusB;SetWrk1;Romm++; # Wrk1=Ri;
BusA=Wrk1;BusB8=Data[BusA];BusC8=Acc;BusB->RA;BusC->RB;Romm++ # RA=Data[Wrk1]; RB=Acc;
AluOp=OR;Alu->BusB;BusB->Acc;Goto;Romm=@Next # Acc = RA | RB; goto @Next;
@$48:
@$49:
@$4a:
@$4b:
@$4c:
@$4d:
@$4e:
@$4f: # orl Acc, Rn
BusA=Bank+IR[2..0];BusB8=Data[BusA];Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=Rn;
BusB8=Acc;BusC8=Wrk1;BusB->RA;BusC->RB;Romm++ # RA=Acc; RB=Wrk1;
AluOp=OR;Alu->BusB;BusB->Acc;Goto;Romm=@Next # Acc = RA | RB; goto @Next;
# ----- PUSH/POP -----
@$C0: # push direct
BusB16=Code;PC++;Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=Code[PC++];
BusA=Wrk1;BusB8=Data[BusA];Wrk2Src=BusB;SetWrk2;Romm++ # Wrk2=Data[Wrk1]; SP++;
SP++;Romm++ # nop; //Dirty hack due to error in schematics. May be caused because BusA switches too slow.
BusA=SP;BusB8=Wrk2;BusB->Data[BusA];Goto;Romm=@Next # Data[SP]=Wrk2; goto @Next;
@$D0: # pop direct
BusA=SP;BusB8=Data[BusA];Wrk2Src=BusB;SetWrk2;SP--;Romm++ # Wrk2=Data[SP--];
BusB16=Code;PC++;Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=Code[PC++];
BusA=Wrk1;BusB8=Wrk2;BusB->Data[BusA];Goto;Romm=@Next # Data[Wrk1]=Wrk2;
# ----- ADD ------
@$24: # add a, #immediate
BusC16=Code;PC++;BusB8=Acc;BusB->RA;BusC->RB;Romm++ # RA=Acc; RB=Code[PC++];
AluOp=add;Alu->BusB;BusB->Acc;Romm++ # Acc=RA+RB;
AluOp=add;AluPSw->BusB;BusB->Psw;Goto;Romm=@Next # Psw=AluPsw(RA+RB); goto @Next;
@$25: # add a, direct
BusC16=Code;PC++;Wrk1Src=BusC;SetWrk1;BusB8=Acc;Wrk2Src=BusB;SetWrk2;Romm++ # Wrk1=Code[PC++]; Wrk2=Acc;
BusA=Wrk1;BusB8=Data[BusA];BusB->RA;BusC8=Wrk2;BusC->RB;Romm++ # RA=Data[Wrk1]; RB=Wrk2;
AluOp=add;Alu->BusB;BusB->Acc;Romm++ # Acc=RA+RB;
AluOp=add;AluPSw->BusB;BusB->Psw;Goto;Romm=@Next # Psw=AluPsw(RA+RB); goto @Next;
@$28:
@$29:
@$2a:
@$2b:
@$2c:
@$2d:
@$2e:
@$2f: # add a, Rn
BusB8=Acc;Wrk2Src=BusB;SetWrk2;Romm++ # Wrk2=Acc;
BusA=Bank+IR[2..0];BusB8=Data[BusA];BusB->RA;BusC8=Wrk2;BusC->RB;Romm++ # RA=Rn; RB=Wrk2;
AluOp=add;Alu->BusB;BusB->Acc;Romm++ # Acc=RA+RB;
AluOp=add;AluPSw->BusB;BusB->Psw;Goto;Romm=@Next # Psw=AluPsw(RA+RB); goto @Next;
@$26:
@$27: # add a, @Ri
BusA=Bank+IR[0];BusB8=Data[BusA];Wrk1Src=BusB;SetWrk1;Romm++; # Wrk1=Ri;
BusA=Wrk1;BusB8=Data[BusA];BusC8=Acc;BusB->RA;BusC->RB;Romm++ # RA=Data[Wrk1]; RB=Acc;
AluOp=add;Alu->BusB;BusB->Acc;Romm++ # Acc=RA+RB;
AluOp=add;AluPSw->BusB;BusB->Psw;Goto;Romm=@Next # Psw=AluPsw(RA+RB); goto @Next;
# ----- SETB ------
@$D2: # setb bit
BusB16=Code;PC++;BusB->AdBit;Goto;Romm=@SETB_Set # AdBit=Code[PC++]; goto @SETB_Set;
@$D3: # setb c
BusBC=0xD7;BusB->AdBit;Romm++ # AdBit=0xD7; // PSW.7==0xD7
@SETB_Set:
BusA=AdBit;BusB8=Data[BusA];BusB->BitBuf;Romm++ # BitBuf=Data[BA(AdBit)];
BitOp=Set;BLU->BusB;BusA=AdBit;BusB->Data[BusA];Goto;Romm=@Next; # Data[BA(AdBit)]=BitBuf|2^(AdBit[2..0]); goto @Next;
# ----- CLR ------
@$E4: # clr a
BusBC=0x00;BusB->Acc;Goto;Romm=@Next; # Acc=0; goto @Next;
@$C2: # clr bit
BusB16=Code;PC++;BusB->AdBit;Goto;Romm=@CLR_BitClear # AdBit=Code[PC++]; goto @CLR_BitClear;
@$C3: # clr c
BusBC=0xD7;BusB->AdBit;Romm++ # AdBit=0xD7; // PSW.7==0xD7
@CLR_BitClear:
BusA=AdBit;BusB8=Data[BusA];BusB->BitBuf;Romm++ # BitBuf=Data[BA(AdBit)];
BitOp=Null;BLU->BusB;BusA=AdBit;BusB->Data[BusA];Goto;Romm=@Next; # Data[BA(AdBit)]=BitBuf & ~(2^(AdBit[2..0])); goto @Next;
# ----- SWAP ------
@$C4: # swap a
BusC8=AccSwap;Wrk1Src=BusC;SetWrk1;Romm++ # Wrk1=Swap(Acc);
BusB8=Wrk1;BusB->Acc;Goto;Romm=@Next; # Acc=Wrk1; goto @Next;
# ----- XCH ------
@$C5: # xch a, direct
BusB16=Code;PC++;Wrk1Src=BusB;SetWrk1;Goto;Romm=@XCH_SwapAcc[Wrk1] # Wrk1=Code[PC++];
@$C6:
@$C7: # xch a, @Ri
BusA=Bank+IR[0];BusB8=Data[BusA];Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=Ri;
@XCH_SwapAcc[Wrk1]:
BusA=Wrk1;BusB8=Data[BusA];Wrk2Src=BusB;SetWrk2;Romm++ # Wrk2=Data[Wrk1];
BusA=Wrk1;BusB8=Wrk1;BusB->Data[BusA];Romm++ # Data[Wrk1]=Acc;
BusB8=Wrk2;BusB->Acc;Goto;Romm=@Next # Acc=Wrk2; goto @Next;
@$C8:
@$C9:
@$Ca:
@$Cb:
@$Cc:
@$Cd:
@$Ce:
@$Cf: # xch a, Rn
BusA=Bank+IR[2..0];BusB8=Data[BusA];Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=Rn;
BusA=Bank+IR[2..0];BusB8=Acc;BusB->Data[BusA];Romm++ # Rn=Acc;
BusB8=Wrk1;BusB->Acc;Goto;Romm=@Next # Acc=Wrk1; goto @Next;
# ----- Shifts -----
@$23: # rl a
BusB8=AccRL;Wrk1Src=BusB;SetWrk1;Goto;Romm=@Rx_End # Wrk1 = (Acc << 1) + (Acc >> 7); goto @Rx_End;
@$03: # rr a
BusB8=AccRR;Wrk1Src=BusB;SetWrk1;Goto;Romm=@Rx_End # Wrk1 = (Acc >> 1) + (Acc << 7); goto @Rx_End;
@$33: # rlc a
BusB8=AccRLC;Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1 = (Acc << 1) + (Psw >> 7);
BusB8=PswRLC;Wrk2Src=BusB;SetWrk2;Goto;Romm=@RxC_End # Wrk2 = (Acc >> 7)+ (PSW & 0x7f); goto @RxC_End;
@$13: # rrc a
BusB8=AccRRC;Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1 = (Acc >> 1) + (Psw << 7);
BusB8=PswRRC;Wrk2Src=BusB;SetWrk2;Romm++ # Wrk2 = (Acc & 0x7f) + (PSW & 0x7f);
@RxC_End:
BusB8=Wrk2;BusB->Psw;Romm++ # Psw=Wrk2;
@Rx_End:
BusB8=Wrk1;BusB->Acc;Goto;Romm=@Next; # Acc=Wrk1; goto @Next;
# ----- INC ------
@$04: # inc a
BusB8=Acc;BusCC=0x01;BusB->RA;BusC->RB;Romm++ # RA=Acc; RB=1;
AluOp=Add;Alu->BusB;BusB->Acc;Romm++ # Acc=RA+RB;
AluOp=Add;AluPsw->BusB;BusB->Psw;Goto;Romm=@Next # Psw=AluPsw(RA+RB); goto @Next;
@$05: # inc direct
BusB16=Code;PC++;Wrk1Src=BusB;SetWrk1;Goto;Romm=@INC_DiRiEnd # Wrk1=Code[PC++]; goto @INC_DRiEnd;
@$06:
@$07: # inc @Ri
BusA=Bank+IR[0];BusB8=Data[BusA];Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=Ri;
@INC_DiRiEnd:
BusA=Wrk1;BusB8=Data[BusA];BusB->RA;BusCC=0x01;BusC->RB;Romm++ # RA=Data[Wrk1]; RB=1;
AluOp=Add;Alu->BusB;BusA=Wrk1;BusB->Data[BusA];Goto;Romm=@Next # Data[Wrk1]=RA+RB; goto @Next;
@$A3: # inc DPTR
DPTR++;Goto;Romm=@Next # DPTR++; goto @Next;
@$08:
@$09:
@$0a:
@$0b:
@$0c:
@$0d:
@$0e:
@$0f: # inc Rn
BusA=Bank+IR[2..0];BusB8=Data[BusA];BusCC=0x01;BusB->RA;BusC->RB;Romm++ # RA=Rn; RB=1;
AluOp=Add;Alu->BusB;BusA=Bank+IR[2..0];BusB->Data[BusA];Goto;Romm=@Next # Acc=RA+RB; goto @Next;
# ----- MUL/DIV -----
@$A4: # mul ab
MulPsw->BusB;Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=MulPsw(Acc, B);
BusB8=Wrk1;BusB->Psw;Romm++ # Psw=Wrk1;
MulAB;Wrk1Src=BusB;SetWrk1;Wrk2Src=BusC;SetWrk2;Goto;Romm=@MULDIV_End # Wrk1 = (Acc*B & 0xff); Wrk2 = (Acc*B) >> 8;
@$84: # div ab
MulPsw->BusB;Wrk1Src=BusB;SetWrk1;Romm++ # Wrk1=DivPsw(Acc, B);
BusB8=Wrk1;BusB->Psw;Romm++ # Psw=Wrk1;
DivAB;Wrk1Src=BusB;SetWrk1;Wrk2Src=BusC;SetWrk2;Romm++ # Wrk1 = Acc/B; Wrk2 = Acc%B;
@MULDIV_End:
BusB8=Wrk1;BusB->Acc;Romm++ # Acc=Wrk1;
BusB8=Wrk2;BusB->B;Goto;Romm=@Next # B=Wrk2; goto @Next;
# ----- END -----
Соседние файлы в папке Microcode