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

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

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

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