src/mess/drivers/4004clk.c
| r5876 | r5877 | |
| 11 | 11 | #include "sound/dac.h" |
| 12 | 12 | #include "4004clk.lh" |
| 13 | 13 | |
| 14 | | static UINT16 nixie[6]; |
| 15 | | static UINT16 nixie_temp[16]; |
| 14 | typedef struct __4004clk_state _4004clk_state; |
| 15 | struct __4004clk_state |
| 16 | { |
| 17 | UINT16 nixie[16]; |
| 18 | UINT8 timer; |
| 19 | const device_config *dac; |
| 20 | }; |
| 16 | 21 | |
| 17 | 22 | static READ8_HANDLER(data_r) |
| 18 | 23 | { |
| r5876 | r5877 | |
| 44 | 49 | output_set_indexed_value("neon", index, value); |
| 45 | 50 | } |
| 46 | 51 | |
| 47 | | static void update_nixie(void) |
| 52 | static void update_nixie(running_machine *machine) |
| 48 | 53 | { |
| 49 | | nixie[0] = ((nixie_temp[2] & 3)<<8) | (nixie_temp[1] << 4) | nixie_temp[0]; |
| 50 | | nixie[1] = (nixie_temp[4] << 6) | (nixie_temp[3] << 2) | (nixie_temp[2] >>2); |
| 51 | | nixie[2] = ((nixie_temp[7] & 3)<<8) | (nixie_temp[6] << 4) | nixie_temp[5]; |
| 52 | | nixie[3] = (nixie_temp[9] << 6) | (nixie_temp[8] << 2) | (nixie_temp[7] >>2); |
| 53 | | nixie[4] = ((nixie_temp[12] & 3)<<8) | (nixie_temp[11] << 4) | nixie_temp[10]; |
| 54 | | nixie[5] = (nixie_temp[14] << 6) | (nixie_temp[13] << 2) | (nixie_temp[12] >>2); |
| 55 | | |
| 56 | | output_set_nixie_value(0,nixie_to_num(nixie[5])); |
| 57 | | output_set_nixie_value(1,nixie_to_num(nixie[4])); |
| 58 | | output_set_nixie_value(2,nixie_to_num(nixie[3])); |
| 59 | | output_set_nixie_value(3,nixie_to_num(nixie[2])); |
| 60 | | output_set_nixie_value(4,nixie_to_num(nixie[1])); |
| 61 | | output_set_nixie_value(5,nixie_to_num(nixie[0])); |
| 54 | _4004clk_state *state = machine->driver_data; |
| 55 | |
| 56 | output_set_nixie_value(5,nixie_to_num(((state->nixie[2] & 3)<<8) | (state->nixie[1] << 4) | state->nixie[0])); |
| 57 | output_set_nixie_value(4,nixie_to_num((state->nixie[4] << 6) | (state->nixie[3] << 2) | (state->nixie[2] >>2))); |
| 58 | output_set_nixie_value(3,nixie_to_num(((state->nixie[7] & 3)<<8) | (state->nixie[6] << 4) | state->nixie[5])); |
| 59 | output_set_nixie_value(2,nixie_to_num((state->nixie[9] << 6) | (state->nixie[8] << 2) | (state->nixie[7] >>2))); |
| 60 | output_set_nixie_value(1,nixie_to_num(((state->nixie[12] & 3)<<8) | (state->nixie[11] << 4) | state->nixie[10])); |
| 61 | output_set_nixie_value(0,nixie_to_num((state->nixie[14] << 6) | (state->nixie[13] << 2) | (state->nixie[12] >>2))); |
| 62 | 62 | } |
| 63 | 63 | |
| 64 | 64 | static WRITE8_HANDLER(nixie_w) |
| 65 | 65 | { |
| 66 | | nixie_temp[offset] = data; |
| 67 | | update_nixie(); |
| 66 | _4004clk_state *state = space->machine->driver_data; |
| 67 | state->nixie[offset] = data; |
| 68 | update_nixie(space->machine); |
| 68 | 69 | } |
| 69 | 70 | |
| 70 | 71 | static WRITE8_HANDLER(neon_w) |
| r5876 | r5877 | |
| 76 | 77 | } |
| 77 | 78 | |
| 78 | 79 | static WRITE8_HANDLER(relays_w) |
| 79 | | { |
| 80 | | const device_config *dac_device = devtag_get_device(space->machine, "dac"); |
| 81 | | dac_data_w(dac_device, (data & 1) ? 0x80 : 0x40); //tick - tock |
| 80 | { |
| 81 | _4004clk_state *state = space->machine->driver_data; |
| 82 | dac_data_w(state->dac, (data & 1) ? 0x80 : 0x40); //tick - tock |
| 82 | 83 | } |
| 83 | 84 | |
| 84 | 85 | static ADDRESS_MAP_START(4004clk_rom, ADDRESS_SPACE_PROGRAM, 8) |
| r5876 | r5877 | |
| 111 | 112 | PORT_CONFSETTING( 0x08, "60 Hz" ) |
| 112 | 113 | INPUT_PORTS_END |
| 113 | 114 | |
| 114 | | static UINT8 timer = 0; |
| 115 | | |
| 116 | 115 | /* |
| 117 | 116 | 16ms Int generator |
| 118 | 117 | __ __ |
| r5876 | r5877 | |
| 123 | 122 | |
| 124 | 123 | static TIMER_CALLBACK(timer_callback) |
| 125 | 124 | { |
| 126 | | i4004_set_test(cputag_get_cpu(machine, "maincpu"),timer); |
| 127 | | timer^=1; |
| 125 | _4004clk_state *state = machine->driver_data; |
| 126 | i4004_set_test(cputag_get_cpu(machine, "maincpu"),state->timer); |
| 127 | state->timer^=1; |
| 128 | 128 | } |
| 129 | 129 | |
| 130 | | static MACHINE_RESET(4004clk) |
| 130 | static MACHINE_START(4004clk) |
| 131 | 131 | { |
| 132 | | timer = 0; |
| 132 | _4004clk_state *state = machine->driver_data; |
| 133 | state->timer = 0; |
| 134 | state->dac = devtag_get_device(machine, "dac"); |
| 135 | |
| 133 | 136 | timer_pulse(machine, ATTOTIME_IN_HZ(120), NULL, 0, timer_callback); |
| 137 | |
| 138 | /* register for state saving */ |
| 139 | state_save_register_global(machine, state->timer); |
| 140 | state_save_register_global_pointer(machine, state->nixie, 6); |
| 134 | 141 | } |
| 135 | 142 | |
| 136 | 143 | static MACHINE_DRIVER_START( 4004clk ) |
| 144 | MDRV_DRIVER_DATA(_4004clk_state) |
| 137 | 145 | /* basic machine hardware */ |
| 138 | 146 | MDRV_CPU_ADD("maincpu",I4004, XTAL_5MHz / 8) |
| 139 | 147 | MDRV_CPU_PROGRAM_MAP(4004clk_rom) |
| 140 | 148 | MDRV_CPU_DATA_MAP(4004clk_mem) |
| 141 | 149 | MDRV_CPU_IO_MAP(4004clk_io) |
| 142 | 150 | |
| 143 | | MDRV_MACHINE_RESET(4004clk) |
| 151 | MDRV_MACHINE_START(4004clk) |
| 144 | 152 | |
| 145 | 153 | /* video hardware */ |
| 146 | 154 | MDRV_DEFAULT_LAYOUT(layout_4004clk) |
| r5876 | r5877 | |
| 175 | 183 | /* Driver */ |
| 176 | 184 | |
| 177 | 185 | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT CONFIG COMPANY FULLNAME FLAGS */ |
| 178 | | COMP( 2008, 4004clk, 0, 0, 4004clk, 4004clk, 0, 0, "John L. Weinrich", "4004 Nixie Clock", 0) |
| 186 | COMP( 2008, 4004clk, 0, 0, 4004clk, 4004clk, 0, 0, "John L. Weinrich", "4004 Nixie Clock", GAME_SUPPORTS_SAVE) |
| 179 | 187 | |