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); }
static void mac_log_banner (void) { pce_log (MSG_INF, "pce-macplus version " PCE_VERSION_STR "\n" "Copyright (C) 2007-2012 Hampa Hug <*****@*****.**>\n" ); }
/* * 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; }
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); }
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); }
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); }
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; }
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); }
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); }
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); }
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; } } }
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); }