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

Кафедра Вычислительной Техники СПбГУ ИТМО

0101 PSW

0110 Data[BusA]

0111 SP

1000 B

1001 Psw RLC (Psw that mus be after RLC operation) 1010 Psw RRC

1011 AccRLC

1100 AccRRC

1101 AccRR

1110 AccRL

1111 Acc

14Записать значение регистрWrk1 из выбранного источника.

15^ --- Wrk2

16Выбор источника для Wrk1 (0 - BusB, 1 - BusC)

17^ --- Wrk2

18-21

Выбор источника для шины BusC

 

0000

Null

 

0001

Wrk2

 

0010

Wrk1

 

....

Reserved/Null

 

1100

AccSwap

 

1101

Acc

 

1110

CRPsw

 

1111

CR (decimal addiction value (00/06/60/66h))

22-24

Выбор источника для BusA

 

000

Зарезервировано

 

001

Адрес байта содержащего бит (для битовых операций)

 

010

Psw Bank# + IR[2..0] (для регистров R0-R7)

 

011

Psw Bank# + IR[0] (для регистров R0-R1)

 

100

Acc

 

101

Wrk2

 

110

Wrk1

 

111

SP

Управление блоком умножения и деления

25BusB = (Acc*B & 0xff); BusC = (Acc*B) >> 8;

26BusB = Acc/B; BusC = Acc%B;

27BusB = MulPsw(Acc, B);

28BusB = DivPsw(Acc, B);

29Читать порт (для чтения портов ввода-вывода командой mov)

30-31 Зарезервировано

4) Блок Alu (арифметико-логическое устройство)

Бит Действие

0Записать значение шины BusB в регистр RA

1Записать значение шины BusC в регистр RB

2Добавлять флаг переноса к операциям сложения/вычитания

3Выставить результат операции на шину BusB

Раевский Сергей Сергеевич, группа 2103

12

Кафедра Вычислительной Техники СПбГУ ИТМО

4

Выставить флаги операции на шину BusB

5-7

 

Операция

 

000

0000

 

001

suba (B - A (- C))

 

010

subb (A - B (- C))

 

011

add (A + B (+ C))

 

100

xor (A xor B)

 

101

or (A or B)

 

110

and (A and B)

 

111

1111

5) Bit (блок обработки битовых данных)

Бит Действие

0Записать значение шины BusB в регистр AdBit

1Записать значение шины BusB в регистр BitBuf

2Использовать отрицание для операнда

3Выставить результат операции на шину BusB

4-6

 

Операции

 

000

Null(0)

 

001

Equal

 

010

Not

 

011

Bit And C

 

100

Bit Or C

 

101

Bit Xor C

 

110

Reserved/Set

 

111

Set

7

Зарезервирован

6) CodeXData (блок памяти Code и XData)

Бит

Действие

0-2

Зарезервированы

3Записать в память XData значение с шины BusB по адресу ACX

4Записать значение шины BusB в регистр PCL

5Записать значение шины BusC в регистр PCH

6Инкрементировать PC

7..9

Выбор источника для шины BusB:

 

000

Null

 

001

Code

 

010

XData

 

011

PCH

 

100

PCL

 

101

DPH

 

110

DPL

 

111

Null/Reserved

10..12 Выбор источника для шины BusC:

 

000

Null (use it if you don't want to select anything)

Раевский Сергей Сергеевич, группа 2103

13

Кафедра Вычислительной Техники СПбГУ ИТМО

001

Code

010

XData

011

PCH

100

PCL

101

DPH

110

DPL

111

APCH (Старшие биты IR (команды acall/ajmp))

13..14 Выбор значения дла шины ACX (внутренняя шина)

00

PC

01

DPTR

10

Wrk2.Wrk1

11

Null/Reserved

15..16 Зарезервированы

Раевский Сергей Сергеевич, группа 2103

14

Кафедра Вычислительной Техники СПбГУ ИТМО

Приложение №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;

 

 

Раевский Сергей Сергеевич, группа 2103

15

Кафедра Вычислительной Техники СПбГУ ИТМО

@$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:

Раевский Сергей Сергеевич, группа 2103

16

Кафедра Вычислительной Техники СПбГУ ИТМО

@$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;

Раевский Сергей Сергеевич, группа 2103

17

Кафедра Вычислительной Техники СПбГУ ИТМО

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=Bu

sB;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;

Раевский Сергей Сергеевич, группа 2103

18

Кафедра Вычислительной Техники СПбГУ ИТМО

@$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:

Раевский Сергей Сергеевич, группа 2103

19

Кафедра Вычислительной Техники СПбГУ ИТМО

@$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;

Раевский Сергей Сергеевич, группа 2103

20

Кафедра Вычислительной Техники СПбГУ ИТМО

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

Раевский Сергей Сергеевич, группа 2103

21

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