Exemple #1
0
int pce_load_mem_ini (memory_t *mem, ini_sct_t *ini)
{
	int           r;
	const char    *fmt;
	const char    *fname;
	char          *path;
	unsigned long addr;
	ini_sct_t     *sct;

	r = 0;

	sct = NULL;
	while ((sct = ini_next_sct (ini, sct, "load")) != NULL) {
		ini_get_string (sct, "format", &fmt, "binary");
		ini_get_string (sct, "file", &fname, NULL);
		if (ini_get_uint32 (sct, "address", &addr, 0)) {
			ini_get_uint32 (sct, "base", &addr, 0);
		}

		if (fname != NULL) {
			path = pce_path_get (fname);

			if (pce_load_mem (mem, path, fmt, addr)) {
				r = 1;
				pce_log (MSG_ERR, "*** loading failed (%s)\n",
					path
				);
			}

			free (path);
		}
	}

	return (r);
}
Exemple #2
0
static
void mac_log_banner (void)
{
	pce_log (MSG_INF,
		"pce-macplus version " PCE_VERSION_STR "\n"
		"Copyright (C) 2007-2012 Hampa Hug <*****@*****.**>\n"
	);
}
Exemple #3
0
/*
 * pce_client_init - PCE client initialization
 */
int pce_client_init(struct pce_client_data *data)
{
	int err;
	struct addrinfo *addr;

	pce_log(LOG_DEBUG, "starting PCE client ...\n");

	/* try to connect to the PCE server address(es) */
	for (addr = data->addr; addr != NULL; addr = addr->ai_next) {
		/* create connecting socket */
		data->fd = socket(addr->ai_family, addr->ai_socktype,
			addr->ai_protocol);
		if (data->fd == -1)
			continue;

		/* try to connect */
		err = connect(data->fd, addr->ai_addr, addr->ai_addrlen);
		if (err)
			close(data->fd);
		else
			break;
	}

	/* check if any address succeded */
	if (!addr || err) {
		pce_log(LOG_ERR, "can't connect to PCE server\n");
		goto out1;
	}

	/* dummy session */
	err = pce_client_session(data);

out2:
	pce_log(LOG_DEBUG, "closing PCE client ...\n");
	close(data->fd);
out1:
	return err;
}
Exemple #4
0
static
int pce_load_config (ini_sct_t *ini, const char *fname)
{
	if (fname == NULL) {
		return (0);
	}

	pce_log_tag (MSG_INF, "CONFIG:", "file=\"%s\"\n", fname);

	if (ini_read (par_cfg, fname)) {
		pce_log (MSG_ERR, "*** loading config file failed\n");
		return (1);
	}

	return (0);
}
Exemple #5
0
static
int s6502_hook_undef (void *ext, unsigned char op)
{
	sim6502_t *sim;

	sim = (sim6502_t *) ext;

	pce_log (MSG_DEB,
		"%04X: undefined operation [%02X]\n",
		(unsigned) e6502_get_pc (sim->cpu), (unsigned) op
	);

	s6502_break (sim, PCE_BRK_STOP);

	return (0);
}
Exemple #6
0
void mac_log_deb (const char *msg, ...)
{
	va_list       va;
	unsigned long pc;

	if (par_sim != NULL) {
		pc = e68_get_last_pc (par_sim->cpu, 0);
	}
	else {
		pc = 0;
	}

	pce_log (MSG_DEB, "[%06lX] ", pc & 0xffffff);

	va_start (va, msg);
	pce_log_va (MSG_DEB, msg, va);
	va_end (va);
}
Exemple #7
0
static
void sarm_setup_console (simarm_t *sim, ini_sct_t *ini)
{
	unsigned  ser;
	ini_sct_t *sct;

	sct = ini_next_sct (ini, NULL, "console");

	if (sct == NULL) {
		ser = 0;
	}
	else {
		ini_get_uint16 (sct, "serial", &ser, 0);
	}

	pce_log_tag (MSG_INF, "CONSOLE:", "serport=%u\n", ser);

	if ((ser >= 2) || (sim->serport[ser] == NULL)) {
		pce_log (MSG_ERR, "*** no serial port (%u)\n", ser);
		return;
	}

	sim->sercons = ser;
}
Exemple #8
0
int ini_get_pci_ata (pci_ata_t *pciata, disks_t *dsks, ini_sct_t *ini)
{
	unsigned  idx;
	ini_sct_t *sct;
	ata_chn_t *chn;

	idx = 0;
	sct = NULL;

	while ((sct = ini_next_sct (ini, sct, "channel")) != NULL) {
		ini_get_uint16 (sct, "channel", &idx, idx);

		chn = pci_ata_get_chn (pciata, idx);

		if (chn == NULL) {
			pce_log (MSG_ERR, "*** no such channel (%u)\n", idx);
		}
		else {
			ini_get_ata_chn (chn, dsks, sct, idx);
		}
	}

	return (0);
}
Exemple #9
0
int pce_client_main(int argc, char *argv[])
{
	int err, opt;
	int debug = 0;
	char *port = PCE_SERVICE;
	char *addr = PCE_HOSTNAME;
	struct addrinfo hints;
	struct pce_client_data *data;

	/* parse PCE client command line options */
	while ((opt = getopt_long(argc, argv, "da:p:vh", pce_client_options,
				NULL)) != -1) {
		switch (opt) {
		case 'd':
			debug = 1;
			break;
		case 'a':
			addr = optarg;
			break;
		case 'p':
			port = optarg;
			break;
		case 'v':
			pce_client_version(stdout);
			exit(EXIT_SUCCESS);
		case 'h':
			pce_client_usage(stdout);
			exit(EXIT_SUCCESS);
		default:
			pce_client_usage(stderr);
			exit(EXIT_FAILURE);
		}
	}

	/* init PCE logger */
	pce_log_open(debug ? LOG_PERROR : LOG_PID);
	pce_log_level(debug ? LOG_DEBUG : LOG_ERR);

	/* allocate PCE client data */
	data = calloc(sizeof(*data), 1);
	if (!data) {
		err = ENOMEM;
		pce_log(LOG_ERR, "failed to get memory\n");
		goto out1;
	}
	data->debug = debug;

	/* obtain address(es) structure matching host/service */
	memset(&hints, 0, sizeof(hints));
	hints.ai_family = AF_UNSPEC;
	hints.ai_socktype = SOCK_STREAM;
	hints.ai_protocol = 0;
	hints.ai_flags = 0;
	err = getaddrinfo(addr, port, &hints, &data->addr);
	if (err) {
		pce_log(LOG_ERR, "failed getaddrinfo: %s\n", gai_strerror(err));
		goto out2;
	}

	/* init PCE client */
	err = pce_client_init(data);

	/* free PCE client resources */
	freeaddrinfo(data->addr);
out2:
	free(data);
out1:
	pce_log_close();
out:
	exit(err ? EXIT_FAILURE : EXIT_SUCCESS);
}
Exemple #10
0
int sarm_set_msg (simarm_t *sim, const char *msg, const char *val)
{
	/* a hack, for debugging only */
	if (sim == NULL) {
		sim = par_sim;
	}

	if (msg == NULL) {
		msg = "";
	}

	if (val == NULL) {
		val = "";
	}

	if (msg_is_prefix ("term", msg)) {
		return (1);
	}

	if (msg_is_message ("emu.stop", msg)) {
		sim->brk = PCE_BRK_STOP;
		return (0);
	}
	else if (strcmp (msg, "emu.exit") == 0) {
		sim->brk = PCE_BRK_ABORT;
		return (0);
	}

	pce_log (MSG_DEB, "msg (\"%s\", \"%s\")\n", msg, val);

	if (msg_is_message ("disk.commit", msg)) {
		if (strcmp (val, "") == 0) {
			if (dsks_commit (sim->dsks)) {
				pce_log (MSG_ERR, "commit failed for at least one disk\n");
				return (1);
			}
		}
		else {
			unsigned d;

			d = strtoul (val, NULL, 0);

			if (dsks_set_msg (sim->dsks, d, "commit", NULL)) {
				pce_log (MSG_ERR, "commit failed (%s)\n", val);
				return (1);
			}
		}

		return (0);
	}
	else if (msg_is_message ("emu.config.save", msg)) {
		if (ini_write (val, sim->cfg)) {
			return (1);
		}

		return (0);
	}

	pce_log (MSG_INF, "unhandled message (\"%s\", \"%s\")\n", msg, val);

	return (1);
}
Exemple #11
0
static
void sarm_setup_serport (simarm_t *sim, ini_sct_t *ini)
{
	unsigned      i;
	unsigned long addr;
	unsigned      irq;
	unsigned      multichar;
	const char    *driver;
	const char    *chip;
	ini_sct_t     *sct;
	serport_t     *ser;
	e8250_t       *uart;

	sim->serport[0] = NULL;
	sim->serport[1] = NULL;

	i = 0;
	sct = NULL;

	while ((i < 2) && (sct = ini_next_sct (ini, sct, "serial")) != NULL) {
		ini_get_uint32 (sct, "address", &addr, 0xc0030000);
		ini_get_uint16 (sct, "irq", &irq, 2);
		ini_get_uint16 (sct, "multichar", &multichar, 1);
		ini_get_string (sct, "uart", &chip, "8250");
		ini_get_string (sct, "driver", &driver, NULL);

		pce_log_tag (MSG_INF, "UART:",
			"n=%u addr=0x%08lx irq=%u uart=%s multi=%u driver=%s\n",
			i, addr, irq, chip, multichar,
			(driver == NULL) ? "<none>" : driver
		);

		ser = ser_new (addr, 2);

		if (ser == NULL) {
			pce_log (MSG_ERR,
				"*** serial port setup failed [%08lX/%u -> %s]\n",
				addr, irq, (driver == NULL) ? "<none>" : driver
			);
		}
		else {
			sim->serport[i] = ser;

			uart = ser_get_uart (ser);

			if (driver != NULL) {
				if (ser_set_driver (ser, driver)) {
					pce_log (MSG_ERR,
						"*** can't open driver (%s)\n",
						driver
					);
				}
			}

			e8250_set_buf_size (uart, 256, 256);
			e8250_set_multichar (uart, multichar, multichar);

			if (e8250_set_chip_str (uart, chip)) {
				pce_log (MSG_ERR,
					"*** unknown UART chip (%s)\n", chip
				);
			}

			e8250_set_irq_fct (uart,
				sim->intc, ict_get_irq_f (sim->intc, irq)
			);

			mem_add_blk (sim->mem, ser_get_reg (ser), 0);

			i += 1;
		}
	}
}
Exemple #12
0
int main (int argc, char *argv[])
{
	int       i;
	int       run;
	char      *cfg;
	ini_sct_t *sct;

	if (argc == 2) {
		if (str_isarg1 (argv[1], "--help")) {
			prt_help();
			return (0);
		}
		else if (str_isarg1 (argv[1], "--version")) {
			prt_version();
			return (0);
		}
	}

	cfg = NULL;
	run = 0;

	pce_log_init();
	pce_log_add_fp (stderr, 0, MSG_INF);

	par_cfg = ini_sct_new (NULL);

	if (par_cfg == NULL) {
		return (1);
	}

	i = 1;
	while (i < argc) {
		if (str_isarg2 (argv[i], "-v", "--verbose")) {
			pce_log_set_level (stderr, MSG_DEB);
		}
		else if (str_isarg2 (argv[i], "-q", "--quiet")) {
			pce_log_set_level (stderr, MSG_ERR);
		}
		else if (str_isarg2 (argv[i], "-c", "--config")) {
			i += 1;
			if (i >= argc) {
				return (1);
			}
			cfg = argv[i];
		}
		else if (str_isarg2 (argv[i], "-l", "--log")) {
			i += 1;
			if (i >= argc) {
				return (1);
			}
			pce_log_add_fname (argv[i], MSG_DEB);
		}
		else if (str_isarg2 (argv[i], "-r", "--run")) {
			run = 1;
		}
		else {
			printf ("%s: unknown option (%s)\n", argv[0], argv[i]);
			return (1);
		}

		i += 1;
	}

	pce_log (MSG_INF,
		"pce sim6502 version " PCE_VERSION_STR "\n"
		"Copyright (C) 1995-2012 Hampa Hug <*****@*****.**>\n"
	);

	if (pce_load_config (par_cfg, cfg)) {
		return (1);
	}

	sct = ini_next_sct (par_cfg, NULL, "sim6502");

	if (sct == NULL) {
		pce_log (MSG_ERR, "*** section 'sim6502' not found in config file\n");
		return (1);
	}

	par_sim = s6502_new (sct);

	e6502_set_hook_undef_fct (par_sim->cpu, par_sim, s6502_hook_undef);

	signal (SIGINT, &sig_int);
	signal (SIGSEGV, &sig_segv);

#ifdef SIGPIPE
	signal (SIGPIPE, SIG_IGN);
#endif

	pce_console_init (stdin, stdout);

	mon_init (&par_mon);
	mon_set_cmd_fct (&par_mon, s6502_do_cmd, par_sim);
	mon_set_msg_fct (&par_mon, NULL, par_sim);
	mon_set_get_mem_fct (&par_mon, par_sim->mem, mem_get_uint8);
	mon_set_set_mem_fct (&par_mon, par_sim->mem, mem_set_uint8);
	mon_set_memory_mode (&par_mon, 0);

	cmd_init (par_sim, cmd_get_sym, cmd_set_sym);

	mon_cmd_add (&par_mon, par_cmd, sizeof (par_cmd) / sizeof (par_cmd[0]));
	mon_cmd_add_bp (&par_mon);

	s6502_reset (par_sim);

	if (run) {
		s6502_run (par_sim);
		if (par_sim->brk != PCE_BRK_ABORT) {
			fputs ("\n", stdout);
		}
	}
	else {
		pce_log (MSG_INF, "type 'h' for help\n");
	}

	if (par_sim->brk != PCE_BRK_ABORT) {
		mon_run (&par_mon);
	}

	s6502_del (par_sim);

	mon_free (&par_mon);
	pce_console_done();
	pce_log_done();

	return (0);
}