2018-08-07 02:14:36 +00:00
|
|
|
#include <stdint.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include "emulator.h"
|
|
|
|
|
2018-10-05 01:03:55 +00:00
|
|
|
/* Register I6 maintains common status */
|
2018-10-30 07:38:42 +00:00
|
|
|
#define _R0 0xb0
|
|
|
|
#define _R8 0xd0
|
|
|
|
#define _I0 0xd8
|
|
|
|
#define _I6 0xf0
|
2019-04-27 00:37:50 +00:00
|
|
|
#define _I7 0xf4
|
2018-10-30 07:38:42 +00:00
|
|
|
#define _I8 0xf8
|
2018-08-07 02:14:36 +00:00
|
|
|
|
|
|
|
/* (dd cc bb aa) aa: index for register stack RS / ccbb: program counter PC / dd: flags F UONPZLGE */
|
2018-10-05 01:03:55 +00:00
|
|
|
#define _RSI _I6 /* register stack index */
|
2018-08-07 02:14:36 +00:00
|
|
|
#define _PCL _RSI + 1 /* program counter low */
|
|
|
|
#define _PCH _PCL + 1 /* program counter high */
|
|
|
|
#define _F _PCH + 1 /* flags */
|
|
|
|
#define _PC _PCL /* program counter */
|
|
|
|
|
2019-04-27 00:37:50 +00:00
|
|
|
/* register I7 maintains locations of code and allocated memory */
|
|
|
|
#define _CRL _I7 /* code low and high bytes */
|
|
|
|
#define _CRH _CRL + 1
|
|
|
|
#define _ARL _CRH + 1 /* allocated low and high bytes */
|
|
|
|
#define _ARH _ARL + 1
|
|
|
|
#define _CR _CRL /* code memory address */
|
|
|
|
#define _AR _ARL /* allocated memory address */
|
|
|
|
|
|
|
|
#define CODE 0xaa /* to indicate CODE section */
|
|
|
|
#define DATA 0x55 /* to indicate DATA section */
|
|
|
|
|
2018-08-07 02:14:36 +00:00
|
|
|
uint8_t memory[65536];
|
|
|
|
|
|
|
|
uint8_t read6502(uint16_t address) {
|
|
|
|
return memory[address];
|
|
|
|
}
|
|
|
|
|
|
|
|
void write6502(uint16_t address, uint8_t value) {
|
|
|
|
memory[address] = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
void hook() {
|
|
|
|
int i, j;
|
|
|
|
|
|
|
|
printf("\n%04x %u %u\n", pc, instructions, clockticks6502);
|
2018-10-05 01:03:55 +00:00
|
|
|
for (i = _R0; i < _R8; i += 4) {
|
|
|
|
printf("R%d: ", (i - _R0) / 4);
|
2018-08-21 13:14:16 +00:00
|
|
|
for (j = 0; j < 4; ++j)
|
|
|
|
printf("%02x ", memory[i + j]);
|
2018-10-05 01:03:55 +00:00
|
|
|
if (((i - _R0) / 4) % 4 == 3)
|
2018-08-21 13:14:16 +00:00
|
|
|
printf("\n");
|
|
|
|
}
|
2018-10-05 01:03:55 +00:00
|
|
|
for (i = _I0; i < _I8; i += 4) {
|
|
|
|
printf("I%d: ", (i - _I0) / 4);
|
2018-08-21 13:14:16 +00:00
|
|
|
for (j = 0; j < 4; ++j)
|
|
|
|
printf("%02x ", memory[i + j]);
|
2018-10-05 01:03:55 +00:00
|
|
|
if (((i - _I0) / 4) % 4 == 3)
|
2018-08-21 13:14:16 +00:00
|
|
|
printf("\n");
|
2018-08-07 02:14:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int main() {
|
|
|
|
|
2019-04-27 00:37:50 +00:00
|
|
|
uint8_t header[5];
|
2018-08-07 02:14:36 +00:00
|
|
|
|
|
|
|
while (fread(header, sizeof(header), 1, stdin))
|
|
|
|
{
|
2019-04-27 00:37:50 +00:00
|
|
|
uint8_t type = header[0];
|
|
|
|
uint16_t index = header[1] + (header[2] << 8);
|
|
|
|
uint16_t length = header[3] + (header[4] << 8);
|
2018-08-07 02:14:36 +00:00
|
|
|
|
2019-04-27 00:37:50 +00:00
|
|
|
printf("\n%x %04x %u\n", type, index, length);
|
2018-08-07 02:14:36 +00:00
|
|
|
|
|
|
|
if (fread(memory + index, length, 1, stdin))
|
|
|
|
{
|
2019-04-27 00:37:50 +00:00
|
|
|
switch (type) {
|
|
|
|
case CODE:
|
|
|
|
memory[_CRL] = header[1];
|
|
|
|
memory[_CRH] = header[2];
|
|
|
|
break;
|
|
|
|
case DATA:
|
|
|
|
memory[_ARL] = header[1];
|
|
|
|
memory[_ARH] = header[2];
|
|
|
|
break;
|
|
|
|
}
|
2018-08-07 02:14:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-04-27 00:37:50 +00:00
|
|
|
memory[_PCL] = memory[_CRL];
|
|
|
|
memory[_PCH] = memory[_CRH];
|
|
|
|
|
2018-08-07 02:14:36 +00:00
|
|
|
hookexternal(hook);
|
|
|
|
|
|
|
|
reset6502();
|
|
|
|
|
|
|
|
do
|
|
|
|
step6502();
|
|
|
|
while (memory[pc]);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|