Скачиваний:
21
Добавлен:
09.05.2014
Размер:
176.36 Кб
Скачать

Приложение №3. Полный код микропрограммы.

#

# 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 -----

Соседние файлы в папке Отчет