Applerm-II/ftest.c
Takashi Toyoshima d0ad06c86a Use 6502_65C02_functional_tests, and two bug fixes
- transfer operations should update n and z flags
 - TSX should transfer SP, not SR
2014-12-08 00:21:49 +09:00

59 lines
1.5 KiB
C

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
static uint8_t mem[0x10000];
extern uint32_t cpu6502_pc;
void prn(int c) {
uint8_t fp;
__asm__("movs %0, r12": "=r"(fp));
fprintf(stderr, "### $%02x ###\n", c);
fflush(stderr);
__asm__("movs r12, %0":: "r"(fp));
}
void cpu6502_dump(
uint16_t pc, uint8_t a, uint8_t x, uint8_t y, uint8_t sp, uint8_t sr) {
uint8_t fp;
__asm__("movs %0, r12": "=r"(fp));
fprintf(stderr, "*** dump *** PC=$%04x A=$%02x X=$%02x Y=$%02x SP=$%02x "
"NV-B_DIZC=%d%d-%d_%d%d%d%d\n",
pc, a, x, y, sp, (sr >> 7) & 1, (sr >> 6) & 1, (sr >> 4) & 1,
(sr >> 3) & 1, (sr >> 2) & 1, (sr >> 1) & 1, sr & 1);
fflush(stderr);
__asm__("movs r12, %0":: "r"(fp));
}
uint8_t cpu6502_load(uint16_t addr) {
uint8_t fp;
uint8_t result = 0;
__asm__("movs %0, r12": "=r"(fp));
result = mem[addr];
fprintf(stderr, "load $%04x => $%02x\n", addr, result);
fflush(stderr);
__asm__("movs r12, %0":: "r"(fp));
return result;
}
void cpu6502_store(uint16_t addr, uint8_t data) {
uint8_t fp;
__asm__("movs %0, r12": "=r"(fp));
mem[addr] = data;
fprintf(stderr, "store $%04x <= $%02x\n", addr, data);
fflush(stderr);
__asm__("movs r12, %0":: "r"(fp));
}
int main(int argc, char** argv) {
FILE* fp = fopen("6502_functional_test.bin", "rb");
fread(mem, 1, 0x10000, fp);
fclose(fp);
cpu6502_reset();
cpu6502_pc = 0x400;
fprintf(stderr, "quit: $%04x\n", cpu6502_run());
return 0;
}