3#include <gmock/gmock-nice-strict.h>
4#include <gmock/gmock.h>
5#include <gtest/gtest.h>
13using yaze::emu::AudioRam;
14using yaze::emu::Spc700;
26 void SetupMemory(uint16_t address,
const std::vector<uint8_t>& values) {
31 for (
const auto& each : values) {
40 ON_CALL(*
this,
read(_)).WillByDefault([
this](uint16_t address) {
44 .WillByDefault([
this](uint16_t address) -> uint8_t& {
47 ON_CALL(*
this,
write(_, _))
48 .WillByDefault([
this](uint16_t address, uint8_t value) {
51 ON_CALL(*
this,
reset()).WillByDefault([
this]() {
83 uint8_t opcode = 0xE8;
84 uint8_t immediate_value = 0x5A;
85 audioRAM.SetupMemory(0x0100, {opcode, immediate_value});
87 EXPECT_CALL(audioRAM, read(_)).WillOnce(Return(immediate_value));
89 spc700.ExecuteInstructions(opcode);
91 EXPECT_EQ(spc700.A, immediate_value);
92 EXPECT_EQ(spc700.PSW.Z, 0);
93 EXPECT_EQ(spc700.PSW.N, 0);
98 uint8_t opcode = 0x7D;
101 spc700.ExecuteInstructions(opcode);
103 EXPECT_EQ(spc700.A, spc700.X);
104 EXPECT_EQ(spc700.PSW.Z, 0);
105 EXPECT_EQ(spc700.PSW.N, 0);
110 uint8_t opcode = 0xDD;
113 spc700.ExecuteInstructions(opcode);
115 EXPECT_EQ(spc700.A, spc700.Y);
116 EXPECT_EQ(spc700.PSW.Z, 0);
117 EXPECT_EQ(spc700.PSW.N, 0);
122 uint8_t opcode = 0xE4;
123 uint8_t dp_value = 0x5A;
124 audioRAM.SetupMemory(0x005A, {0x42});
125 audioRAM.SetupMemory(0x0100, {opcode, dp_value});
127 EXPECT_CALL(audioRAM, read(_))
128 .WillOnce(Return(dp_value))
129 .WillOnce(Return(0x42));
131 spc700.ExecuteInstructions(opcode);
133 EXPECT_EQ(spc700.A, 0x42);
134 EXPECT_EQ(spc700.PSW.Z, 0);
135 EXPECT_EQ(spc700.PSW.N, 0);
140 uint8_t opcode = 0xF4;
141 uint8_t dp_value = 0x5A;
143 audioRAM.SetupMemory(0x005B, {0x42});
144 audioRAM.SetupMemory(0x0100, {opcode, dp_value});
146 EXPECT_CALL(audioRAM, read(_))
147 .WillOnce(Return(dp_value + spc700.X))
148 .WillOnce(Return(0x42));
150 spc700.ExecuteInstructions(opcode);
152 EXPECT_EQ(spc700.A, 0x42);
153 EXPECT_EQ(spc700.PSW.Z, 0);
154 EXPECT_EQ(spc700.PSW.N, 0);
159 uint8_t opcode = 0xF7;
160 uint8_t dp_value = 0x5A;
162 audioRAM.SetupMemory(0x005A, {0x00, 0x42});
163 audioRAM.SetupMemory(0x0100, {opcode, dp_value});
164 audioRAM.SetupMemory(0x4201, {0x69});
166 EXPECT_CALL(audioRAM, read(_))
167 .WillOnce(Return(dp_value))
168 .WillOnce(Return(0x4200))
169 .WillOnce(Return(0x69));
171 spc700.ExecuteInstructions(opcode);
173 EXPECT_EQ(spc700.A, 0x69);
174 EXPECT_EQ(spc700.PSW.Z, 0);
175 EXPECT_EQ(spc700.PSW.N, 0);
180 uint8_t opcode = 0xE7;
181 uint8_t dp_value = 0x5A;
183 audioRAM.SetupMemory(0x005B, {0x00, 0x42});
184 audioRAM.SetupMemory(0x0100, {opcode, dp_value});
185 audioRAM.SetupMemory(0x4200, {0x69});
187 EXPECT_CALL(audioRAM, read(_))
188 .WillOnce(Return(dp_value + 1))
189 .WillOnce(Return(0x4200))
190 .WillOnce(Return(0x69));
192 spc700.ExecuteInstructions(opcode);
194 EXPECT_EQ(spc700.A, 0x69);
195 EXPECT_EQ(spc700.PSW.Z, 0);
196 EXPECT_EQ(spc700.PSW.N, 0);
201 uint8_t opcode = 0xE5;
202 uint16_t abs_addr = 0x1234;
203 uint8_t abs_value = 0x5A;
205 EXPECT_CALL(audioRAM, read(_))
206 .WillOnce(Return(abs_addr & 0xFF))
207 .WillOnce(Return(abs_addr >> 8));
209 EXPECT_CALL(audioRAM, read(abs_addr)).WillOnce(Return(abs_value));
211 spc700.ExecuteInstructions(opcode);
213 EXPECT_EQ(spc700.A, abs_value);
214 EXPECT_EQ(spc700.PSW.Z, 0);
215 EXPECT_EQ(spc700.PSW.N, 0);
223 uint8_t opcode = 0xE8;
224 uint8_t immediate_value = 0x5A;
226 EXPECT_CALL(audioRAM, read(_)).WillOnce(Return(immediate_value));
228 spc700.ExecuteInstructions(opcode);
230 EXPECT_EQ(spc700.A, immediate_value);
231 EXPECT_EQ(spc700.PSW.Z, 0);
232 EXPECT_EQ(spc700.PSW.N, 0);
239 uint8_t opcode = 0x00;
241 uint16_t initialPC = spc700.PC;
242 spc700.ExecuteInstructions(opcode);
245 EXPECT_EQ(spc700.PC, initialPC + 1);
251 uint8_t opcode = 0x88;
252 uint8_t immediate_value = 0x10;
256 EXPECT_CALL(audioRAM, read(_)).WillOnce(Return(immediate_value));
258 spc700.ExecuteInstructions(opcode);
261 EXPECT_EQ(spc700.A, 0x12);
267 uint8_t opcode = 0xF0;
268 int8_t offset = 0x05;
271 EXPECT_CALL(audioRAM, read(_)).WillOnce(Return(offset));
273 uint16_t initialPC = spc700.PC + 1;
274 spc700.ExecuteInstructions(opcode);
276 EXPECT_EQ(spc700.PC, initialPC + offset);
281 uint8_t opcode = 0x85;
282 uint16_t abs_addr = 0x1234;
286 EXPECT_CALL(audioRAM, read(_))
287 .WillOnce(Return(abs_addr & 0xFF))
288 .WillOnce(Return(abs_addr >> 8));
290 spc700.ExecuteInstructions(opcode);
295 uint8_t opcode = 0x88;
296 uint8_t immediate_value = 0x10;
299 EXPECT_CALL(audioRAM, read(_)).WillOnce(Return(immediate_value));
301 spc700.ExecuteInstructions(opcode);
303 EXPECT_EQ(spc700.A, 0x25);
304 EXPECT_EQ(spc700.PSW.Z, 0);
305 EXPECT_EQ(spc700.PSW.N, 0);
306 EXPECT_EQ(spc700.PSW.C, 0);
311 uint8_t opcode = 0x2F;
312 int8_t offset = 0x05;
314 EXPECT_CALL(audioRAM, read(_)).WillOnce(Return(offset));
317 uint16_t initialPC = spc700.PC + 1;
318 spc700.ExecuteInstructions(opcode);
320 EXPECT_EQ(spc700.PC, initialPC + offset);
324 uint16_t address = 0x1234;
325 uint8_t expected_value = 0x5A;
327 EXPECT_CALL(audioRAM, read(address)).WillOnce(Return(expected_value));
329 uint8_t value = spc700.read(address);
330 EXPECT_EQ(value, expected_value);
334 uint16_t address = 0x1234;
335 uint8_t value = 0x5A;
337 EXPECT_CALL(audioRAM, write(address, value));
339 spc700.write(address, value);
344 uint8_t opcode = 0x28;
345 uint8_t immediate_value = 0x0F;
348 EXPECT_CALL(audioRAM, read(_)).WillOnce(Return(immediate_value));
350 spc700.ExecuteInstructions(opcode);
352 EXPECT_EQ(spc700.A, 0x0A);
353 EXPECT_EQ(spc700.PSW.Z, 0);
354 EXPECT_EQ(spc700.PSW.N, 0);
359 uint8_t opcode = 0x08;
360 uint8_t immediate_value = 0x0F;
363 EXPECT_CALL(audioRAM, read(_)).WillOnce(Return(immediate_value));
365 spc700.ExecuteInstructions(opcode);
367 EXPECT_EQ(spc700.A, 0xAF);
368 EXPECT_EQ(spc700.PSW.Z, 0);
374 uint8_t opcode = 0x48;
375 uint8_t immediate_value = 0x5A;
378 EXPECT_CALL(audioRAM, read(_)).WillOnce(Return(immediate_value));
380 spc700.ExecuteInstructions(opcode);
382 EXPECT_EQ(spc700.A, 0x00);
383 EXPECT_EQ(spc700.PSW.Z, 1);
384 EXPECT_EQ(spc700.PSW.N, 0);
389 uint8_t opcode = 0xBC;
392 spc700.ExecuteInstructions(opcode);
394 EXPECT_EQ(spc700.A, 0x00);
395 EXPECT_EQ(spc700.PSW.Z, 1);
396 EXPECT_EQ(spc700.PSW.N, 0);
401 uint8_t opcode = 0x9C;
404 spc700.ExecuteInstructions(opcode);
406 EXPECT_EQ(spc700.A, 0x00);
407 EXPECT_EQ(spc700.PSW.Z, 1);
408 EXPECT_EQ(spc700.PSW.N, 0);
413 uint8_t opcode = 0xD0;
414 int8_t offset = 0x05;
417 EXPECT_CALL(audioRAM, read(_)).WillOnce(Return(offset));
419 uint16_t initialPC = spc700.PC + 1;
420 spc700.ExecuteInstructions(opcode);
422 EXPECT_EQ(spc700.PC, initialPC + offset);
427 uint8_t opcode = 0xD0;
428 int8_t offset = 0x05;
431 EXPECT_CALL(audioRAM, read(_)).WillOnce(Return(offset));
433 uint16_t initialPC = spc700.PC;
434 spc700.ExecuteInstructions(opcode);
436 EXPECT_EQ(spc700.PC, initialPC + 1);
441 uint8_t opcode = 0xF0;
442 int8_t offset = 0x05;
445 EXPECT_CALL(audioRAM, read(_)).WillOnce(Return(offset));
447 uint16_t initialPC = spc700.PC + 1;
448 spc700.ExecuteInstructions(opcode);
450 EXPECT_EQ(spc700.PC, initialPC + offset);
455 uint8_t opcode = 0xF0;
456 int8_t offset = 0x05;
459 EXPECT_CALL(audioRAM, read(_)).WillOnce(Return(offset));
461 uint16_t initialPC = spc700.PC;
462 spc700.ExecuteInstructions(opcode);
464 EXPECT_EQ(spc700.PC, initialPC + 1);
AudioRam is an interface for the Audio RAM used by the SPC700.
virtual void write(uint16_t address, uint8_t value)=0
virtual uint8_t & mutable_read(uint16_t address)=0
virtual uint8_t read(uint16_t address) const =0
The Spc700 class represents the SPC700 processor.
MockAudioRam is a mock class for the AudioRam class.
MOCK_METHOD(uint8_t &, mutable_read,(uint16_t address),(override))
std::vector< uint8_t > internal_audio_ram_
MOCK_METHOD(uint8_t, read,(uint16_t address),(const, override))
MOCK_METHOD(void, reset,(),(override))
void SetupMemory(uint16_t address, const std::vector< uint8_t > &values)
MOCK_METHOD(void, write,(uint16_t address, uint8_t value),(override))
testing::StrictMock< MockAudioRam > audioRAM
struct yaze::emu::ApuCallbacks ApuCallbacks
TEST_F(CpuTest, AsmParserTokenizerOk)
Main namespace for the application.