static int userport_digimax_read_snapshot_module(snapshot_t *s) { BYTE major_version, minor_version; snapshot_module_t *m; /* enable device */ set_digimax_enabled(1, NULL); m = snapshot_module_open(s, snap_module_name, &major_version, &minor_version); if (m == NULL) { return -1; } /* Do not accept versions higher than current */ if (major_version > SNAP_MAJOR || minor_version > SNAP_MINOR) { snapshot_set_error(SNAPSHOT_MODULE_HIGHER_VERSION); goto fail; } if (0 || (SMR_B(m, &userport_digimax_address) < 0) || (SMR_BA(m, digimax_sound_data, 4) < 0) || (SMR_B(m, &snd.voice0) < 0) || (SMR_B(m, &snd.voice1) < 0) || (SMR_B(m, &snd.voice2) < 0) || (SMR_B(m, &snd.voice3) < 0)) { goto fail; } return snapshot_module_close(m); fail: snapshot_module_close(m); return -1; }
static int set_digimax_base(int val, void *param) { int addr = val; int old = digimax_sound_chip.chip_enabled; if (val == digimax_address) { return 0; } if (addr == 0xffff) { if (machine_class == VICE_MACHINE_VIC20) { addr = 0x9800; } else { addr = 0xde00; } } if (old) { set_digimax_enabled(0, NULL); } switch (addr) { case 0xdd00: /* special case, userport interface */ break; case 0xde00: case 0xde20: case 0xde40: case 0xde60: case 0xde80: case 0xdea0: case 0xdec0: case 0xdee0: if (machine_class != VICE_MACHINE_VIC20) { digimax_device.start_address = (WORD)addr; digimax_device.end_address = (WORD)(addr + 3); export_res.io1 = &digimax_device; export_res.io2 = NULL; } else { return -1; } break; case 0xdf00: case 0xdf20: case 0xdf40: case 0xdf60: case 0xdf80: case 0xdfa0: case 0xdfc0: case 0xdfe0: if (machine_class != VICE_MACHINE_VIC20) { digimax_device.start_address = (WORD)addr; digimax_device.end_address = (WORD)(addr + 3); export_res.io1 = NULL; export_res.io2 = &digimax_device; } else { return -1; } break; case 0x9800: case 0x9820: case 0x9840: case 0x9860: case 0x9880: case 0x98a0: case 0x98c0: case 0x98e0: case 0x9c00: case 0x9c20: case 0x9c40: case 0x9c60: case 0x9c80: case 0x9ca0: case 0x9cc0: case 0x9ce0: if (machine_class == VICE_MACHINE_VIC20) { digimax_device.start_address = (WORD)addr; digimax_device.end_address = (WORD)(addr + 3); } else { return -1; } break; default: return -1; } digimax_address = val; if (old) { set_digimax_enabled(1, NULL); } return 0; }