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