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

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

}

catch (Exception e)

{

Console.WriteLine(e.Message);

}

}

}

}

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

42

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

Утилита labelmap2mif

using System;

using System.Collections.Generic; using System.Linq;

using System.Text; using System.IO;

namespace labelmap2mif

{

class Program

{

class MifFile

{

static string MifHead = "WIDTH={0};\nDEPTH={1};\nADDRESS_RADIX=HEX;\nDATA_RADIX=HEX;\nCONTENT BEGIN\n";

static string MifEnd = "END;";

static string MifEnt = "{0:X}:{1:X};\n";

string fName; int fDepth; int fWidth;

public MifFile(string FName, int Width, int Depth)

{

fName = FName;

fDepth = Depth;

fWidth = Width;

File.CreateText(fName).Close();

File.AppendAllText(fName, String.Format(MifHead, fWidth, fDepth),

Encoding.ASCII);

}

public void AddNum(int Addr, int Num)

{

File.AppendAllText(fName, String.Format(MifEnt, Addr, Num), Encoding.ASCII);

}

public void Done()

{

File.AppendAllText(fName, MifEnd, Encoding.ASCII);

}

}

static void Main(string[] args)

{

Console.WriteLine("lbm2mif utility by C.c (c) 2011"); Console.WriteLine("Processing file \"{0}\"...", args[0]);

MifFile Output = new MifFile("ir2romm.mif", 10, 256);

string[] Input = File.ReadAllLines(args[0]);

int Count = 0;

List<int> Unique = new List<int>();

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

43

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

foreach (string Line in Input)

{

Count++;

if (Line.StartsWith("@$"))

{

int OpCode = int.Parse(Line.Split(':')[0].Substring(2), System.Globalization.NumberStyles.HexNumber);

int Romm = int.Parse(Line.Split(':')[1], System.Globalization.NumberStyles.HexNumber);

Output.AddNum(OpCode, Romm);

if (!Unique.Contains(Romm)) Unique.Add(Romm);

}

}

Output.Done();

Console.WriteLine("Done: {0} instructions total, {1} unique entry points.\n", Count, Unique.Count);

}

}

}

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

44

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

Приложение №5. Исходный код симулятора

Прим.: исходный код BData.cs приведен в приложении №4

// i8051CPU.cs using System;

using System.Collections.Generic; using System.Linq;

using System.Text; using i8051;

namespace i8051_console

{

class i8051CPU

{

enum PSWBit : int { P = 0, UD, OV, RS0, RS1, FO, AC, C }; enum ALUOp : int { NOP = 0, AND, OR, ADD, ADDC, SUBB };

public BData Wrk1, Wrk2; public BData PC;

public int RA, RB; public BData IR;

public bool IntrFlag; public int IntrN;

public List<BData> Data, XData, Code;

#region

sfradresses

 

 

/* SFR

Registers

*/

 

private

static byte

PSWa = 0x50

+ 0x80;

private

static byte

ACCa = 0x60

+ 0x80;

private

static byte

Ba = 0x70 +

0x80;

private

static byte

SPa = 0x01 + 0x80;

private

static byte

DPLa = 0x02

+ 0x80;

private

static byte

DPHa = 0x03

+ 0x80;

#endregion

#region sfr

public BData Acc

{

get { return Data[ACCa]; } set { Data[ACCa] = value; }

}

public BData Psw

{

get { return Data[PSWa]; } set { Data[PSWa] = value; }

}

public BData B

{

get { return Data[Ba]; } set { Data[Ba] = value; }

}

public BData Sp

{

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

45

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

get { return Data[SPa]; } set { Data[SPa] = value; }

}

public BData DPTR

{

get { return Data[DPLa] + (Data[DPHa] << 8); }

set { Data[DPLa] = value & 0xff; Data[DPHa] = value >> 8; }

}

#endregion

delegate void MCOP();

Dictionary<int, List<MCOP>> Microcode = new Dictionary<int, List<MCOP>>(); public int Cycle = 0;

public i8051CPU()

{

// Memory

 

Data

= new

List<BData>();

for (int i

= 0; i < 256; i++) Data.Add(new BData(8, 0));

XData = new List<BData>();

for (int i

= 0; i < 256; i++) XData.Add((byte)0);

Code

= new

List<BData>();

for (int i

= 0; i < 256; i++) Code.Add((byte)0);

// 8bit regs

Wrk1

= new

BData(8, 0);

Wrk2

= new

BData(8, 0);

IR = 0;

 

// 16bit regs

PC

= new

BData(16, 0);

Sp = 0x07;

}

bool Parity(BData D)

{

bool R = false;

for (int i = 0; i < 8; i++) { R ^= (bool)D[i]; } return R;

}

string Psw2Str()

{

string Res = "["; // { P = 0, UD, OV, RS0, RS1, FO, AC, C };

Res += Psw[(int)PSWBit.P] ? "P" : "_";

Res += Psw[(int)PSWBit.UD] ? "U" : "_";

Res += Psw[(int)PSWBit.OV] ? "O" : "_";

Res += Psw[(int)PSWBit.FO] ? "F" : "_";

Res += Psw[(int)PSWBit.AC] ? "A" : "_";

Res += Psw[(int)PSWBit.C] ? "C" : "_";

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

46

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

Res += " Bank#" + (int)Psw[(int)PSWBit.RS0, (int)PSWBit.RS1];

Res += "]"; return Res;

}

public void PrintRegs()

{

Console.WriteLine("Acc = 0x{0:X2} B = 0x{1:X2} SP = 0x{5:X2} Psw = {2} PC = 0x{3:X4} DPTR = 0x{4:X4}", (int)Acc, (int)B, Psw2Str(), (int)PC, (int)DPTR, (int)Sp);

}

public void PrintInternalRegs()

{

Console.WriteLine("Internal: Wrk1 = 0x{0:X2} Wrk2 = 0x{1:X2} IR = 0x{2:X2} RA = 0x{3:X2} RB = 0x{4:X2} ", (int)Wrk1, (int)Wrk2, (int)IR, RA, RB);

}

public void PrintBank()

{

int Bank = Psw[(int)PSWBit.RS0, (int)PSWBit.RS1]; //Console.Write(":", Bank);

for (int i = 0; i < 8; i++)

{

Console.Write("R{0} = 0x{1:X2} ", i, (int)Data[Bank * 8 + i]);

}

Console.WriteLine();

}

public int IPCL()

{

return (IntrN << 3) + 3;

}

public string DAsm(int A)

{

int I = Code[A]; switch (I)

{

case 0x46: // orl a, ri

case 0x47: return String.Format("{0:X2}: orl a, @R{1}", I, I%2);

case 0x44: return String.Format("{0:X2}: orl a, #0x{1:X2}", I, (int)Code[A +

1]);

case 0xd4: return String.Format("{0:X2}: da a", I);

case 0x85: return String.Format("{0:X2}: mov 0x{1:X2}, 0x{2:X2}", I, (int)Code[A + 2], (int)Code[A + 1]);

case 0x86:

case 0x87: return String.Format("{0:X2}: mov 0x{1:X2}, @R{2}", I, (int)Code[A

+ 1], I % 2);

case 0x02: return String.Format("{0:X2}: ljmp 0x{1:X2}{2:X2}", I, (int)Code[A + 1], (int)Code[A + 2]);

case 0xb6:

case 0xb7: return String.Format("{0:X2}: cjne @R{1}, #0x{2:X2}, 0x{3:X4}", I, I % 2, (int)Code[A + 1], (int)Code[A + 2]+PC+2);

case 0x32: return String.Format("{0:X2}: reti", I);

default:

return "<unknown opcode>"; break;

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

47

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

}

}

bool IntrHdl = false;

public void ExecuteMCmd()

{

if (Cycle == 0)

{

if (!IntrFlag) { IR = Code[PC++]; Cycle++; } // Instruction fetch else { Cycle++; IntrHdl = true; }

}

else // Mcop execution

{

if (IntrHdl) // Interruption

{

switch (Cycle)

{

case 1:

// SP++;BusCC=0x00;Wrk1Src=BusC;SetWrk1;IPCL- >BusB;Wrk2Src=BusB;SetWrk2;Goto;Romm=@CALL_Wrk1Wrk2->PC

Sp++; Wrk1 = 0; Wrk2 = IPCL(); Cycle++; break;

case 2: //BusB16=PCL;BusA=SP;BusB->Data[BusA];SP++;Romm++ Data[Sp++]=PC & 0xff; Cycle++;

break;

case 3: //BusB16=PCH;BusA=SP;BusB->Data[BusA];Romm++ Data[Sp]=PC >> 8; Cycle++;

break;

case 4: //BusC8=Wrk1;BusB8=Wrk2;BusB->PCL;BusC-

>PCH;ClrIntFlag;Goto;Romm=@Next # PCL=Wrk2; PCH=Wrk1; goto @Next;

PC = (Wrk1 << 8) + Wrk2; Cycle = 0; IntrFlag = false; Cycle=0;

IntrHdl=false;

break;

}

}

else switch ((int)IR)

{

case 0x00: // nop Nop(); break;

case 0x46: case 0x47:

orlARi(); break;

case 0x44: orlImmediate(); break;

case 0xd4: daa(); break;

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

48

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

case 0x85: movdirdir(); break;

case 0x86:

case 0x87: movdRn(); break;

case 0x02: ljmp(); break;

case 0x32: reti(); break;

case 0xb6:

case 0xb7: cjneRiimrel(); break;

}

Psw[(int)PSWBit.P] = Parity(Acc);

}

}

int IR1bit() { return (Psw[3, 4] << 3) + IR[0]; }

void Nop()

{ Cycle = 0; }

#region DA_A

int CR() // Correction value for decimal addiction

{

int R = ((Acc & 0x0f) > 0x09 || Psw[6]) ? 0x06 : 0x00; R += ((Acc & 0xf0) > 0x90 || Psw[7]) ? 0x60 : 0x00;

return R;

}

int CRPsw() // Correction value for decimal addiction

{

return (Psw[0,6] + RA+RB>0xff ? 0x80 : 0);

}

void daa() // Decimal Addiction

{

switch (Cycle)

{

case 1: // BusB8=Acc;BusC8=CR;BusB->RA;BusC->RB;Romm++

{RA = Acc; RB = CR(); Cycle++; } break;

//AluOp=Add;Alu->BusB;BusB->Acc;Romm++ case 2:

{Acc = RA + RB; Cycle++; }

break;

// AluOp=Add;BusC8=CRPsw;Wrk1Src=BusC;SetWrk1;Romm++ case 3:

{ Wrk1 = CRPsw(); Cycle++; } break;

case 4:

{ Psw = Wrk1; Cycle = 0; }

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

49

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

break;

}

}

#endregion

#region ORL

void orlARi() // orl a, @Ri

{

switch (Cycle)

{

// BusA=Bank+IR[0];BusB8=Data[BusA];Wrk1Src=BusB;SetWrk1;Romm++; case 1:

{Wrk1=Data[IR1bit()]; Cycle++; } break;

//BusA=Wrk1;BusB8=Data[BusA];BusC8=Acc;BusB->RA;BusC->RB;Romm++ case 2:

{RA = Data[Wrk1]; RB = Acc; Cycle++; }

break;

// AluOp=OR;Alu->BusB;BusB->Acc;Goto;Romm=@Next case 3:

{ Acc = (RA + RB) & 0xff; Cycle = 0; } break;

}

}

void orlImmediate()

{

switch (Cycle)

{

// BusB8=Acc;BusC16=Code;PC++;BusB->RA;BusC->RB;Romm++ case 1:

{RA = Acc; RB = Code[PC++]; Cycle++; } break;

//AluOp=OR;Alu->BusB;BusB->Acc;Goto;Romm=@Next case 2:

{Acc = RA | RB; Cycle=0; }

break;

}

}

#endregion

#region MOV

void movdirdir() // mov dest_direct, src_direct

{

switch (Cycle)

{

// BusC16=Code;PC++;Wrk1Src=BusC;SetWrk1;Romm++ case 1:

{Wrk1 = Code[PC++]; Cycle++; } break;

//BusA=Wrk1;BusB8=Data[BusA];Wrk2Src=BusB;SetWrk2;Romm++ case 2:

{Wrk2 = Data[Wrk1]; Cycle++; }

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

50

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

break;

// BusC16=Code;PC++;Wrk1Src=BusC;SetWrk1;Romm++ case 3:

{Wrk1 = Code[PC++]; Cycle++; } break;

//BusA=Wrk1;BusB8=Wrk2;BusB->Data[BusA];Goto;Romm=@Next case 4:

{Data[Wrk1] = Wrk2; Cycle = 0; }

break;

}

}

void movdRn() // mov direct, @Ri

{

switch (Cycle)

{

//BusA=Bank+IR[0];BusB8=Data[BusA];Wrk1Src=BusB;SetWrk1;Romm++ case 1:

{Wrk1 = Data[IR1bit()]; Cycle++; } break;

//BusA=Wrk1;BusB8=Data[BusA];Wrk2Src=BusB;SetWrk2;Romm++ case 2:

{Wrk2=Data[Wrk1]; Cycle++; }

break;

// BusC16=Code;PC++;Wrk1Src=BusC;SetWrk1;Romm++ case 3:

{Wrk1 = Code[PC++]; Cycle++; } break;

//BusA=Wrk1;BusB8=Wrk2;BusB->Data[BusA];Goto;Romm=@Next case 4:

{Data[Wrk1] = Wrk2; Cycle = 0; }

break;

}

}

#endregion

void cjneRiimrel()

{

switch (Cycle)

{

case 1: //BusA=Bank+IR[2..0];BusB8=Data[BusA];Wrk1Src=BusB;SetWrk1;Romm++ Wrk1 = Data[IR1bit()]; Cycle++;

break;

case 2: // BusA=Wrk1;BusB8=Data[Wrk1];BusC16=Code;PC++;BusB->RA;BusC- >RB;Goto;Romm=@CJNE_Compare

RA = Data[Wrk1]; RB=Code[PC++]; Cycle++; break;

case 3: // AluOp=suba;Alu->BusB;Wrk1Src=BusB;SetWrk1;Romm++ Wrk1 = (uint)(RA - RB) & 0xff; Cycle++;

break;

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

51

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