курсовые работы / курсовая работа по организации эвм (mcs 51, скорубский) / Отчет / Курсовая
.pdfКафедра Вычислительной Техники СПбГУ ИТМО
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 ------
Раевский Сергей Сергеевич, группа 2103 |
22 |
Кафедра Вычислительной Техники СПбГУ ИТМО
@$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:
Раевский Сергей Сергеевич, группа 2103 |
23 |
Кафедра Вычислительной Техники СПбГУ ИТМО
@$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;
|
|
Раевский Сергей Сергеевич, группа 2103 |
24 |
Кафедра Вычислительной Техники СПбГУ ИТМО
# ----- 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;
Раевский Сергей Сергеевич, группа 2103 |
25 |
Кафедра Вычислительной Техники СПбГУ ИТМО
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 -----
Раевский Сергей Сергеевич, группа 2103 |
26 |
Кафедра Вычислительной Техники СПбГУ ИТМО
Приложение №4. Исходный код ассемблера микрокоманд и сопутствующих утилит.
Ассемблер микрокоманд
// BData.cs
using System;
using System.Collections.Generic; using System.Linq;
using System.Text;
namespace i8051
{
class Bit
{
byte fVal;
public Bit(byte b)
{
if (b > 1) throw new FormatException("Bit data format error!"); fVal = b;
}
public static implicit operator Bit(byte b)
{
return new Bit(b);
}
public static implicit operator Bit(int b)
{
return new Bit(Convert.ToByte(b));
}
public static implicit operator byte(Bit b)
{
return b.fVal;
}
public static implicit operator bool(Bit b)
{
return b.fVal > 0;
}
public static implicit operator Bit(bool b)
{
return new Bit(Convert.ToByte(b));
}
public override string ToString()
{
return fVal == 0 ? "0" : "1";
}
public void Set()
{
fVal = 1;
}
public void Clear()
{
Раевский Сергей Сергеевич, группа 2103 |
27 |
Кафедра Вычислительной Техники СПбГУ ИТМО
fVal = 0;
}
}
class BData
{
Bit[] Bits; int fCount;
int Length { get { return fCount; } }
public BData(int Count, Int64 Data)
{
fCount = Count;
Bits = new Bit[fCount];
for (int i = 0; i < fCount; i++)
{
Bits[i] = (byte)(Data % 2); Data /= 2;
}
}
long GetNum()
{
int Result = 0;
for (int i = fCount-1; i >= 0; i--)
{
Result *= 2; Result += Bits[i];
}
return Result;
}
#region ImplictByte
public static implicit operator BData(byte b)
{
return new BData(8, b);
}
public static implicit operator byte(BData b)
{
return (byte)b.GetNum();
}
#endregion
#region ImplictInt
public static implicit operator BData(int b)
{
return new BData(32, b);
}
public static implicit operator int(BData b)
{
return (int)b.GetNum();
}
#endregion
#region ImplictLong
public static implicit operator BData(long b)
Раевский Сергей Сергеевич, группа 2103 |
28 |
Кафедра Вычислительной Техники СПбГУ ИТМО
{
return new BData(64, b);
}
public static implicit operator long(BData b)
{
return b.GetNum();
}
#endregion
public Bit this[int x]
{
get
{
if (x >= fCount || x < 0) throw new TypeAccessException("Invalid bit!"); return new Bit(Bits[x]);
}
set
{
if (x >= fCount || x < 0) throw new TypeAccessException("Invalid bit!"); Bits[x] = (byte)value;
}
}
public BData this[int From, int To]
{
get
{
if (From > To) { int t = From; From = To; To = t; }
if ((From >= fCount || From < 0) || (To >= fCount || To < 0)) throw new TypeAccessException("Invalid bit!");
BData Result = new BData(To - From + 1, 0);
for (int i = 0; i <= To - From; i++)
{
Result[i] = this[i + From];
}
return Result;
}
set
{
if (From > To) { int t = From; From = To; To = t; }
if ((From >= fCount || From < 0) || (To >= fCount || To < 0)) throw new TypeAccessException("Invalid bit!");
for (int i = 0; i <= To - From; i++)
{
this[i + From] = value[i];
}
}
}
public /*override*/ string ToString()
{
string S = "";
for (int i = 0; i < Bits.Length; i++)
{
Раевский Сергей Сергеевич, группа 2103 |
29 |
Кафедра Вычислительной Техники СПбГУ ИТМО
S += Bits[i];
}
return S;
}
}
}
Раевский Сергей Сергеевич, группа 2103 |
30 |
Кафедра Вычислительной Техники СПбГУ ИТМО
//
//i8051 microcode assembler
//Part of sci-reserching project at "Organisation of ECM"
//(C) C.c 2010 via gnu gpl
//
using System;
using System.Collections.Generic; using System.Linq;
using System.Text; using System.IO; using i8051;
namespace i8051_mc_compiler
{
static class ArgConv
{
public static int Do(string a)
{
if (a.ToUpper().StartsWith("0X")) // hex
{
return int.Parse(a.Substring(2), System.Globalization.NumberStyles.HexNumber);
}
if (a.ToUpper().EndsWith("H")) // hex
{
return int.Parse(a.Substring(0, a.Length - 2), System.Globalization.NumberStyles.HexNumber);
}
if (a.ToUpper().EndsWith("B")) // bin
{
int res = 0;
for (int i = 0; i < a.Length - 1; i++)
{
res *= 2;
res += Convert.ToInt32(a[i] + "");
}
return res;
}
if (a.ToUpper().EndsWith("O")) // oct
{
int res = 0;
for (int i = 0; i < a.Length - 1; i++)
{
res *= 8;
res += Convert.ToInt32(a[i] + "");
}
return res;
}
return int.Parse(a);
}
}
class MCBlock
Раевский Сергей Сергеевич, группа 2103 |
31 |