Скачиваний:
3
Добавлен:
09.05.2014
Размер:
15.34 Кб
Скачать
#
# 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
  • #
    09.05.20141.08 Кб3Const.mif
  • #
    09.05.20141.15 Кб3Control.mif
  • #
    09.05.20141.59 Кб3DataSfr.mif
  • #
    09.05.20141.07 Кб3If.mif
  • #
    09.05.2014985 б3ir2romm.mif
  • #
    09.05.201415.34 Кб3mc - копия (2).txt
  • #
    09.05.201415.34 Кб3mc.txt
  • #
    09.05.20141.64 Кб3mc.txt.labelmap
  • #
    09.05.20145.96 Кб3mc.txt.mcd
  • #
    09.05.20143 б3_cmd.bat