-
Notifications
You must be signed in to change notification settings - Fork 0
/
Program.cs
133 lines (121 loc) · 3.99 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
using System;
using Emulators;
namespace Emulator
{
class Program
{
static void PrintCPUState(ref CPU6502 cpu)
{
if (cpu is null) return;
Console.WriteLine();
Console.WriteLine("CPU STATUS");
Console.WriteLine("NV-BDIZC PC AR XR YR SP");
Console.Write(cpu.GetFlag(CPU6502.FLAGS65C02.N));
Console.Write(cpu.GetFlag(CPU6502.FLAGS65C02.V));
Console.Write(cpu.GetFlag(CPU6502.FLAGS65C02.U));
Console.Write(cpu.GetFlag(CPU6502.FLAGS65C02.B));
Console.Write(cpu.GetFlag(CPU6502.FLAGS65C02.D));
Console.Write(cpu.GetFlag(CPU6502.FLAGS65C02.I));
Console.Write(cpu.GetFlag(CPU6502.FLAGS65C02.Z));
Console.Write(cpu.GetFlag(CPU6502.FLAGS65C02.C));
//Console.WriteLine(" PC AR XR YR SP");
Console.Write(string.Format(" {0:X4}", cpu.PC));
Console.Write(string.Format(" {0:X2}", cpu.A));
Console.Write(string.Format(" {0:X2}", cpu.X));
Console.Write(string.Format(" {0:X2}", cpu.Y));
Console.WriteLine(string.Format(" {0:X2}", cpu.SP));
}
static void Main(string[] args)
{
Console.WriteLine("Emulator 65C02");
IBus bus = new Bus(64);//create bus with 64kb of RAM
ushort base_addr = 0x8000;
/*
*=$8000
LDX #10
STX $0000
LDX #3
STX $0001
LDY $0000
LDA #0
CLC
loop
ADC $0001
DEY
BNE loop
STA $0002
NOP
NOP
NOP
*/
//feed ram with program
byte[] prg;
//prg = new byte[]
// {
// 0xA2, 0x0A, 0x8E, 0x00, 0x00, 0xA2, 0x03, 0x8E,
// 0x01, 0x00, 0xAC, 0x00, 0x00, 0xA9, 0x00, 0x18,
// 0x6D, 0x01, 0x00, 0x88, 0xD0, 0xFA, 0x8D, 0x02,
// 0x00, 0xEA, 0xEA, 0xEA
// };
/*
*=$8000
LDA #80
STA $d402
LDA #00
STA $d403
NOP
BRK
*/
prg = new byte[]
{
0xA9, 0x00, 0x8D, 0x02, 0xD4, 0xA9,
0x80, 0x8D, 0x03, 0xD4, 0xEA, 0x00
};
for (int i = 0; i < prg.Length; i++)
{
bus.Write((ushort)(base_addr + i), prg[i]);
}
//set reset handler
bus.Write(0xFFFC, 0x00);
bus.Write(0xFFFD, 0x80);
ANTIC antic = new ANTIC();
antic.ConnectBus(ref bus);
CPU6502 cpu = new CPU6502();
cpu.ConnectBus(ref bus);
cpu.Reset();
Console.WriteLine("Press key [Space - step, R - Reset, I - Irq, N - NMI Irq]");
while (true)
{
ConsoleKey key = Console.ReadKey().Key;
if (key == ConsoleKey.Escape) break;
switch (key)
{
case ConsoleKey.R: cpu.Reset(); break;
case ConsoleKey.I: cpu.Irq(); break;
case ConsoleKey.N: cpu.Nmi(); break;
case ConsoleKey.Spacebar:
ExecuteStep(ref cpu);
PrintFullState(ref cpu);
break;
}
}
antic.Tick();
}
static void ExecuteStep(ref CPU6502 cpu)
{
do
{
cpu.Clock();
}
while (!cpu.Complete());
}
static void PrintFullState(ref CPU6502 cpu)
{
PrintCPUState(ref cpu);
foreach (string str in cpu.Disassemble(cpu.PC, cpu.PC).Values)
{
Console.WriteLine(str);
}
}
}
}