1
0
mirror of https://github.com/rkujawa/rk65c02.git synced 2025-04-20 23:38:10 +00:00

Support loading ROMs from files, adjust nop test case.

This commit is contained in:
Radosław Kujawa 2017-01-19 00:57:09 +01:00
parent abc209df99
commit 87cafb607f
4 changed files with 54 additions and 17 deletions

@ -1,8 +1,13 @@
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>
#include <assert.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#define RK65C02_BUS_SIZE 64*1024
@ -38,6 +43,27 @@ bus_init()
return t;
}
bool
bus_load_file(bus_t *t, uint16_t addr, const char *filename)
{
int fd;
uint8_t data;
fd = open(filename, O_RDONLY);
if (fd == -1) {
perror("Problem while trying to open file");
return false;
}
while ((read(fd, &data, 1)) > 0) {
t->space[addr++] = data; // XXX: overflow addr
}
close(fd);
return true;
}
void
bus_finish(bus_t *t)
{

@ -2,6 +2,7 @@
#define _BUS_H_
#include <stdint.h>
#include <stdbool.h>
#define RK65C02_BUS_SIZE 64*1024
@ -15,6 +16,7 @@ uint8_t bus_read_1(bus_t *, uint16_t);
void bus_write_1(bus_t *, uint16_t, uint8_t);
bus_t bus_init();
void bus_finish(bus_t *);
bool bus_load_file(bus_t *, uint16_t, const char *);
#endif /* _BUS_H_ */

@ -5,8 +5,8 @@
#include "bus.h"
ATF_TC_WITHOUT_HEAD(bus__init);
ATF_TC_BODY(bus__init, tc)
ATF_TC_WITHOUT_HEAD(bus_init);
ATF_TC_BODY(bus_init, tc)
{
bus_t b;
@ -17,16 +17,24 @@ ATF_TC_BODY(bus__init, tc)
bus_finish(&b);
}
ATF_TC_WITHOUT_HEAD(bus__foo);
ATF_TC_BODY(bus__foo, tc)
ATF_TC_WITHOUT_HEAD(bus_load_file);
ATF_TC_BODY(bus_load_file, tc)
{
// bus_t b;
bus_t b;
b = bus_init();
ATF_REQUIRE(bus_load_file(&b, 0xC000, "test_emulation_nop.rom"));
ATF_CHECK(b.space[0xC000] == 0xEA);
bus_finish(&b);
}
ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, bus__init);
ATF_TP_ADD_TC(tp, bus__foo);
ATF_TP_ADD_TC(tp, bus_init);
ATF_TP_ADD_TC(tp, bus_load_file);
return (atf_no_error());
}

@ -6,6 +6,8 @@
#include "bus.h"
#include "rk65c02.h"
#define ROM_LOAD_ADDR 0xC000
ATF_TC_WITHOUT_HEAD(emul_lda);
ATF_TC_BODY(emul_lda, tc)
{
@ -15,15 +17,15 @@ ATF_TC_BODY(emul_lda, tc)
b = bus_init();
e = rk65c02_init(&b);
e.regs.PC = 0;
e.regs.PC = ROM_LOAD_ADDR;
bus_write_1(&b, 0, 0xA9);
bus_write_1(&b, 1, 0xAF);
bus_write_1(&b, 2, 0xDB);
bus_write_1(&b, ROM_LOAD_ADDR, 0xA9);
bus_write_1(&b, ROM_LOAD_ADDR+1, 0xAF);
bus_write_1(&b, ROM_LOAD_ADDR+2, 0xDB);
rk65c02_start(&e);
ATF_CHECK(e.regs.PC == 3);
ATF_CHECK(e.regs.PC == ROM_LOAD_ADDR+3);
ATF_CHECK(e.regs.A == 0xAF);
bus_finish(&b);
@ -38,14 +40,13 @@ ATF_TC_BODY(emul_nop, tc)
b = bus_init();
e = rk65c02_init(&b);
e.regs.PC = 0xC000;
e.regs.PC = ROM_LOAD_ADDR;
bus_write_1(&b, 0xC000, 0xEA);
bus_write_1(&b, 0xC001, 0xDB);
bus_load_file(&b, 0xC000, "test_emulation_nop.rom");
rk65c02_start(&e);
ATF_CHECK(e.regs.PC == 0xC002);
ATF_CHECK(e.regs.PC == ROM_LOAD_ADDR+2);
bus_finish(&b);
}