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:
parent
abc209df99
commit
87cafb607f
28
src/bus.c
28
src/bus.c
@ -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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user