trunk/src/mess/machine/odyssey2.c
| r19917 | r19918 | |
| 16 | 16 | static void odyssey2_switch_banks(running_machine &machine) |
| 17 | 17 | { |
| 18 | 18 | odyssey2_state *state = machine.driver_data<odyssey2_state>(); |
| 19 | | switch ( state->m_cart_size ) { |
| 20 | | case 12288: |
| 21 | | /* 12KB cart support (for instance, KTAA as released) */ |
| 22 | | state->membank( "bank1" )->set_base( machine.root_device().memregion("user1")->base() + (state->m_p1 & 0x03) * 0xC00 ); |
| 23 | | state->membank( "bank2" )->set_base( machine.root_device().memregion("user1")->base() + (state->m_p1 & 0x03) * 0xC00 + 0x800 ); |
| 24 | | break; |
| 25 | | case 16384: |
| 26 | | /* 16KB cart support (for instance, full sized version KTAA) */ |
| 27 | | state->membank( "bank1" )->set_base( machine.root_device().memregion("user1")->base() + (state->m_p1 & 0x03) * 0x1000 + 0x400 ); |
| 28 | | state->membank( "bank2" )->set_base( machine.root_device().memregion("user1")->base() + (state->m_p1 & 0x03) * 0x1000 + 0xC00 ); |
| 29 | | break; |
| 30 | | default: |
| 31 | | state->membank("bank1")->set_base(machine.root_device().memregion("user1")->base() + (state->m_p1 & 0x03) * 0x800); |
| 32 | | state->membank("bank2")->set_base(state->memregion("user1")->base() + (state->m_p1 & 0x03) * 0x800 ); |
| 33 | | break; |
| 19 | switch ( state->m_cart_size ) |
| 20 | { |
| 21 | case 12288: |
| 22 | /* 12KB cart support (for instance, KTAA as released) */ |
| 23 | state->membank( "bank1" )->set_base( machine.root_device().memregion("user1")->base() + (state->m_p1 & 0x03) * 0xC00 ); |
| 24 | state->membank( "bank2" )->set_base( machine.root_device().memregion("user1")->base() + (state->m_p1 & 0x03) * 0xC00 + 0x800 ); |
| 25 | break; |
| 26 | |
| 27 | case 16384: |
| 28 | /* 16KB cart support (for instance, full sized version KTAA) */ |
| 29 | state->membank( "bank1" )->set_base( machine.root_device().memregion("user1")->base() + (state->m_p1 & 0x03) * 0x1000 + 0x400 ); |
| 30 | state->membank( "bank2" )->set_base( machine.root_device().memregion("user1")->base() + (state->m_p1 & 0x03) * 0x1000 + 0xC00 ); |
| 31 | break; |
| 32 | |
| 33 | default: |
| 34 | state->membank("bank1")->set_base(machine.root_device().memregion("user1")->base() + (state->m_p1 & 0x03) * 0x800); |
| 35 | state->membank("bank2")->set_base(state->memregion("user1")->base() + (state->m_p1 & 0x03) * 0x800 ); |
| 36 | break; |
| 34 | 37 | } |
| 35 | 38 | } |
| 36 | 39 | |
| 37 | | void odyssey2_the_voice_lrq_callback(device_t *device, int state) { |
| 40 | void odyssey2_the_voice_lrq_callback(device_t *device, int state) |
| 41 | { |
| 38 | 42 | odyssey2_state *drvstate = device->machine().driver_data<odyssey2_state>(); |
| 39 | 43 | drvstate->m_the_voice_lrq_state = state; |
| 40 | 44 | } |
| 41 | 45 | |
| 42 | | READ8_MEMBER(odyssey2_state::odyssey2_t0_r){ |
| 46 | READ8_MEMBER(odyssey2_state::odyssey2_t0_r) |
| 47 | { |
| 43 | 48 | return ( m_the_voice_lrq_state == ASSERT_LINE ) ? 0 : 1; |
| 44 | 49 | } |
| 45 | 50 | |
| r19917 | r19918 | |
| 84 | 89 | |
| 85 | 90 | READ8_MEMBER(odyssey2_state::odyssey2_bus_r) |
| 86 | 91 | { |
| 87 | | if ((m_p1 & (P1_VDC_COPY_MODE_ENABLE | P1_VDC_ENABLE)) == 0) |
| 92 | if ((m_p1 & (P1_VDC_COPY_MODE_ENABLE | P1_VDC_ENABLE)) == 0) |
| 93 | { |
| 88 | 94 | return odyssey2_video_r(space, offset); /* seems to have higher priority than ram??? */ |
| 89 | | |
| 90 | | else if (!(m_p1 & P1_EXT_RAM_ENABLE)) |
| 95 | } |
| 96 | if (!(m_p1 & P1_EXT_RAM_ENABLE)) |
| 97 | { |
| 91 | 98 | return m_ram[offset]; |
| 99 | } |
| 92 | 100 | |
| 93 | | return 0; |
| 101 | return 0; |
| 94 | 102 | } |
| 95 | 103 | |
| 96 | 104 | WRITE8_MEMBER(odyssey2_state::odyssey2_bus_w) |
| 97 | 105 | { |
| 98 | | if ((m_p1 & (P1_EXT_RAM_ENABLE | P1_VDC_COPY_MODE_ENABLE)) == 0x00) { |
| 106 | if ((m_p1 & (P1_EXT_RAM_ENABLE | P1_VDC_COPY_MODE_ENABLE)) == 0x00) |
| 107 | { |
| 99 | 108 | m_ram[offset] = data; |
| 100 | | if ( offset & 0x80 ) { |
| 101 | | if ( data & 0x20 ) { |
| 109 | if ( offset & 0x80 ) |
| 110 | { |
| 111 | if ( data & 0x20 ) |
| 112 | { |
| 102 | 113 | logerror("voice write %02X, data = %02X (p1 = %02X)\n", offset, data, m_p1 ); |
| 103 | 114 | sp0256_ALD_w( machine().device("sp0256_speech"), space, 0, offset & 0x7F ); |
| 104 | | } else { |
| 115 | } |
| 116 | else |
| 117 | { |
| 105 | 118 | /* TODO: Reset sp0256 in this case */ |
| 106 | 119 | } |
| 107 | 120 | } |
| 108 | 121 | } |
| 109 | | |
| 110 | | else if (!(m_p1 & P1_VDC_ENABLE)) |
| 122 | else if (!(m_p1 & P1_VDC_ENABLE)) |
| 123 | { |
| 111 | 124 | odyssey2_video_w(space, offset, data); |
| 125 | } |
| 112 | 126 | } |
| 113 | 127 | |
| 114 | 128 | READ8_MEMBER(odyssey2_state::g7400_bus_r) |
| 115 | 129 | { |
| 116 | | if ((m_p1 & (P1_VDC_COPY_MODE_ENABLE | P1_VDC_ENABLE)) == 0) { |
| 130 | if ((m_p1 & (P1_VDC_COPY_MODE_ENABLE | P1_VDC_ENABLE)) == 0) |
| 131 | { |
| 117 | 132 | return odyssey2_video_r(space, offset); /* seems to have higher priority than ram??? */ |
| 118 | 133 | } |
| 119 | | else if (!(m_p1 & P1_EXT_RAM_ENABLE)) { |
| 134 | else if (!(m_p1 & P1_EXT_RAM_ENABLE)) |
| 135 | { |
| 120 | 136 | return m_ram[offset]; |
| 121 | | } else { |
| 122 | | // return ef9341_r( offset & 0x02, offset & 0x01 ); |
| 123 | 137 | } |
| 138 | else |
| 139 | { |
| 140 | //return ef9341_r( offset & 0x02, offset & 0x01 ); |
| 141 | } |
| 124 | 142 | |
| 125 | 143 | return 0; |
| 126 | 144 | } |
| 127 | 145 | |
| 128 | 146 | WRITE8_MEMBER(odyssey2_state::g7400_bus_w) |
| 129 | 147 | { |
| 130 | | if ((m_p1 & (P1_EXT_RAM_ENABLE | P1_VDC_COPY_MODE_ENABLE)) == 0x00) { |
| 148 | if ((m_p1 & (P1_EXT_RAM_ENABLE | P1_VDC_COPY_MODE_ENABLE)) == 0x00) |
| 149 | { |
| 131 | 150 | m_ram[offset] = data; |
| 132 | 151 | } |
| 133 | | else if (!(m_p1 & P1_VDC_ENABLE)) { |
| 152 | else if (!(m_p1 & P1_VDC_ENABLE)) |
| 153 | { |
| 134 | 154 | odyssey2_video_w(space, offset, data); |
| 135 | | } else { |
| 136 | | // ef9341_w( offset & 0x02, offset & 0x01, data ); |
| 137 | 155 | } |
| 156 | else |
| 157 | { |
| 158 | //ef9341_w( offset & 0x02, offset & 0x01, data ); |
| 159 | } |
| 138 | 160 | } |
| 139 | 161 | |
| 140 | 162 | /***** 8048 Ports ************************/ |
| r19917 | r19918 | |
| 160 | 182 | |
| 161 | 183 | READ8_MEMBER(odyssey2_state::odyssey2_getp2) |
| 162 | 184 | { |
| 163 | | UINT8 h = 0xFF; |
| 164 | | int i, j; |
| 185 | UINT8 h = 0xFF; |
| 186 | int i, j; |
| 165 | 187 | static const char *const keynames[] = { "KEY0", "KEY1", "KEY2", "KEY3", "KEY4", "KEY5" }; |
| 166 | 188 | |
| 167 | | if (!(m_p1 & P1_KEYBOARD_SCAN_ENABLE)) |
| 189 | if (!(m_p1 & P1_KEYBOARD_SCAN_ENABLE)) |
| 168 | 190 | { |
| 169 | 191 | if ((m_p2 & P2_KEYBOARD_SELECT_MASK) <= 5) /* read keyboard */ |
| 170 | 192 | { |
| r19917 | r19918 | |
| 182 | 204 | } |
| 183 | 205 | } |
| 184 | 206 | |
| 185 | | if (h == 0xFF) /* active low inputs, so no keypresses */ |
| 186 | | m_p2 = m_p2 | 0xF0; |
| 207 | if (h == 0xFF) /* active low inputs, so no keypresses */ |
| 208 | { |
| 209 | m_p2 = m_p2 | 0xF0; |
| 210 | } |
| 187 | 211 | } |
| 188 | | |
| 189 | 212 | else |
| 190 | | m_p2 = m_p2 | 0xF0; |
| 213 | { |
| 214 | m_p2 = m_p2 | 0xF0; |
| 215 | } |
| 191 | 216 | |
| 192 | | logerror("%.6f p2 read %.2x\n", machine().time().as_double(), m_p2); |
| 193 | | return m_p2; |
| 217 | logerror("%.6f p2 read %.2x\n", machine().time().as_double(), m_p2); |
| 218 | return m_p2; |
| 194 | 219 | } |
| 195 | 220 | |
| 196 | 221 | WRITE8_MEMBER(odyssey2_state::odyssey2_putp2) |
| 197 | 222 | { |
| 198 | | m_p2 = data; |
| 223 | m_p2 = data; |
| 199 | 224 | |
| 200 | | logerror("%.6f p2 written %.2x\n", machine().time().as_double(), data); |
| 225 | logerror("%.6f p2 written %.2x\n", machine().time().as_double(), data); |
| 201 | 226 | } |
| 202 | 227 | |
| 203 | 228 | READ8_MEMBER(odyssey2_state::odyssey2_getbus) |
| 204 | 229 | { |
| 205 | | UINT8 data = 0xff; |
| 230 | UINT8 data = 0xff; |
| 206 | 231 | |
| 207 | | if ((m_p2 & P2_KEYBOARD_SELECT_MASK) == 1) |
| 232 | if ((m_p2 & P2_KEYBOARD_SELECT_MASK) == 1) |
| 233 | { |
| 208 | 234 | data &= ioport("JOY0")->read(); /* read joystick 1 */ |
| 235 | } |
| 209 | 236 | |
| 210 | | if ((m_p2 & P2_KEYBOARD_SELECT_MASK) == 0) |
| 237 | if ((m_p2 & P2_KEYBOARD_SELECT_MASK) == 0) |
| 238 | { |
| 211 | 239 | data &= ioport("JOY1")->read(); /* read joystick 2 */ |
| 240 | } |
| 212 | 241 | |
| 213 | | logerror("%.6f bus read %.2x\n", machine().time().as_double(), data); |
| 214 | | return data; |
| 242 | logerror("%.6f bus read %.2x\n", machine().time().as_double(), data); |
| 243 | return data; |
| 215 | 244 | } |
| 216 | 245 | |
| 217 | 246 | WRITE8_MEMBER(odyssey2_state::odyssey2_putbus) |
| 218 | 247 | { |
| 219 | | logerror("%.6f bus written %.2x\n", machine().time().as_double(), data); |
| 248 | logerror("%.6f bus written %.2x\n", machine().time().as_double(), data); |
| 220 | 249 | } |
| 221 | 250 | |
| 222 | 251 | /////////////////////////////////// |
| r19917 | r19918 | |
| 226 | 255 | { |
| 227 | 256 | odyssey2_state *state = machine.driver_data<odyssey2_state>(); |
| 228 | 257 | state->m_cart_size = size; |
| 229 | | if ( (size == 2048) |
| 230 | | || (size == 4096) |
| 231 | | || (size == 8192) |
| 258 | if ( (size == 2048) |
| 259 | || (size == 4096) |
| 260 | || (size == 8192) |
| 232 | 261 | || (size == 12288) |
| 233 | 262 | || (size == 16384)) |
| 234 | | { |
| 263 | { |
| 235 | 264 | return IMAGE_VERIFY_PASS; |
| 236 | | } |
| 265 | } |
| 237 | 266 | |
| 238 | | return IMAGE_VERIFY_FAIL; |
| 267 | return IMAGE_VERIFY_FAIL; |
| 239 | 268 | } |
| 240 | 269 | #endif |