курсовые работы / курсовая работа по организации эвм (mcs 51, скорубский) / Отчет / Курсовая
.pdfКафедра Вычислительной Техники СПбГУ ИТМО
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 |