trunk/src/emu/machine/8237dma.c
| r17733 | r17734 | |
| 127 | 127 | void i8237_device::device_reset() |
| 128 | 128 | { |
| 129 | 129 | m_status = 0x0F; |
| 130 | | m_eop = 1; |
| 130 | m_eop = ASSERT_LINE; |
| 131 | 131 | m_state = DMA8237_SI; |
| 132 | 132 | m_last_service_channel = 3; |
| 133 | 133 | m_service_channel = 0; |
| r17733 | r17734 | |
| 269 | 269 | case DMA8237_SI: |
| 270 | 270 | { |
| 271 | 271 | /* Make sure EOP is high */ |
| 272 | | if ( !m_eop ) |
| 272 | if ( m_eop == CLEAR_LINE ) |
| 273 | 273 | { |
| 274 | | m_eop = 1; |
| 275 | | m_out_eop_func(m_eop ? ASSERT_LINE : CLEAR_LINE); |
| 274 | m_eop = ASSERT_LINE; |
| 275 | m_out_eop_func(m_eop); |
| 276 | 276 | } |
| 277 | 277 | |
| 278 | 278 | /* Check if a new DMA request has been received. */ |
| r17733 | r17734 | |
| 363 | 363 | /* Check if EOP output needs to be asserted */ |
| 364 | 364 | if ( m_status & ( 0x01 << m_service_channel ) ) |
| 365 | 365 | { |
| 366 | | m_eop = 0; |
| 367 | | m_out_eop_func(m_eop ? ASSERT_LINE : CLEAR_LINE); |
| 366 | m_eop = CLEAR_LINE; |
| 367 | m_out_eop_func(m_eop); |
| 368 | 368 | } |
| 369 | 369 | break; |
| 370 | 370 | |
| r17733 | r17734 | |
| 413 | 413 | { |
| 414 | 414 | case DMA8237_DEMAND_MODE: |
| 415 | 415 | /* Check for terminal count or EOP signal or DREQ begin de-asserted */ |
| 416 | | if ( ( m_status & ( 0x01 << channel ) ) || !m_eop || !( m_drq & ( 0x01 << channel ) ) ) |
| 416 | if ( ( m_status & ( 0x01 << channel ) ) || m_eop == CLEAR_LINE || !( m_drq & ( 0x01 << channel ) ) ) |
| 417 | 417 | { |
| 418 | 418 | m_hrq = 0; |
| 419 | 419 | m_hlda = 0; |
| r17733 | r17734 | |
| 435 | 435 | |
| 436 | 436 | case DMA8237_BLOCK_MODE: |
| 437 | 437 | /* Check for terminal count or EOP signal */ |
| 438 | | if ( ( m_status & ( 0x01 << channel ) ) || !m_eop ) |
| 438 | if ( ( m_status & ( 0x01 << channel ) ) || m_eop == CLEAR_LINE ) |
| 439 | 439 | { |
| 440 | 440 | m_hrq = 0; |
| 441 | 441 | m_hlda = 0; |
| r17733 | r17734 | |
| 452 | 452 | /* Check if EOP output needs to be asserted */ |
| 453 | 453 | if ( m_status & ( 0x01 << channel ) ) |
| 454 | 454 | { |
| 455 | | m_eop = 0; |
| 456 | | m_out_eop_func(m_eop ? ASSERT_LINE : CLEAR_LINE); |
| 455 | m_eop = CLEAR_LINE; |
| 456 | m_out_eop_func(m_eop); |
| 457 | 457 | } |
| 458 | 458 | } |
| 459 | 459 | |
trunk/src/mess/machine/at.c
| r17733 | r17734 | |
| 163 | 163 | |
| 164 | 164 | READ8_MEMBER(at_state::pc_dma_read_byte) |
| 165 | 165 | { |
| 166 | if(m_dma_channel == -1) |
| 167 | return 0xff; |
| 166 | 168 | UINT8 result; |
| 167 | 169 | offs_t page_offset = (((offs_t) m_dma_offset[0][m_dma_channel]) << 16) & 0xFF0000; |
| 168 | 170 | |
| r17733 | r17734 | |
| 173 | 175 | |
| 174 | 176 | WRITE8_MEMBER(at_state::pc_dma_write_byte) |
| 175 | 177 | { |
| 178 | if(m_dma_channel == -1) |
| 179 | return; |
| 176 | 180 | offs_t page_offset = (((offs_t) m_dma_offset[0][m_dma_channel]) << 16) & 0xFF0000; |
| 177 | 181 | |
| 178 | 182 | space.write_byte(page_offset + offset, data); |
| r17733 | r17734 | |
| 181 | 185 | |
| 182 | 186 | READ8_MEMBER(at_state::pc_dma_read_word) |
| 183 | 187 | { |
| 188 | if(m_dma_channel == -1) |
| 189 | return 0xff; |
| 184 | 190 | UINT16 result; |
| 185 | 191 | offs_t page_offset = (((offs_t) m_dma_offset[1][m_dma_channel & 3]) << 16) & 0xFE0000; |
| 186 | 192 | |
| r17733 | r17734 | |
| 193 | 199 | |
| 194 | 200 | WRITE8_MEMBER(at_state::pc_dma_write_word) |
| 195 | 201 | { |
| 202 | if(m_dma_channel == -1) |
| 203 | return; |
| 196 | 204 | offs_t page_offset = (((offs_t) m_dma_offset[1][m_dma_channel & 3]) << 16) & 0xFE0000; |
| 197 | 205 | |
| 198 | 206 | space.write_word(page_offset + ( offset << 1 ), m_dma_high_byte | data); |
| r17733 | r17734 | |
| 215 | 223 | WRITE8_MEMBER( at_state::pc_dma8237_6_dack_w ){ m_isabus->dack16_w(6, m_dma_high_byte | data); } |
| 216 | 224 | WRITE8_MEMBER( at_state::pc_dma8237_7_dack_w ){ m_isabus->dack16_w(7, m_dma_high_byte | data); } |
| 217 | 225 | |
| 218 | | WRITE_LINE_MEMBER( at_state::at_dma8237_out_eop ) { m_isabus->eop_w(state == ASSERT_LINE ? 0 : 1 ); } |
| 226 | WRITE_LINE_MEMBER( at_state::at_dma8237_out_eop ) |
| 227 | { |
| 228 | m_cur_eop = state == ASSERT_LINE; |
| 229 | if(m_dma_channel != -1) |
| 230 | m_isabus->eop_w(m_dma_channel, ASSERT_LINE ); |
| 231 | } |
| 219 | 232 | |
| 220 | | static void set_dma_channel(device_t *device, int channel, int state) |
| 233 | void at_state::pc_set_dma_channel(int channel, int state) |
| 221 | 234 | { |
| 222 | | at_state *st = device->machine().driver_data<at_state>(); |
| 223 | | if (!state) |
| 224 | | st->m_dma_channel = channel; |
| 235 | if(!state) { |
| 236 | m_dma_channel = channel; |
| 237 | if(m_cur_eop) |
| 238 | m_isabus->eop_w(channel, ASSERT_LINE ); |
| 239 | |
| 240 | } else if(m_dma_channel == channel) { |
| 241 | m_dma_channel = -1; |
| 242 | if(m_cur_eop) |
| 243 | m_isabus->eop_w(channel, CLEAR_LINE ); |
| 244 | } |
| 225 | 245 | } |
| 226 | 246 | |
| 227 | | WRITE_LINE_MEMBER( at_state::pc_dack0_w ) { set_dma_channel(m_dma8237_1, 0, state); } |
| 228 | | WRITE_LINE_MEMBER( at_state::pc_dack1_w ) { set_dma_channel(m_dma8237_1, 1, state); } |
| 229 | | WRITE_LINE_MEMBER( at_state::pc_dack2_w ) { set_dma_channel(m_dma8237_1, 2, state); } |
| 230 | | WRITE_LINE_MEMBER( at_state::pc_dack3_w ) { set_dma_channel(m_dma8237_1, 3, state); } |
| 247 | WRITE_LINE_MEMBER( at_state::pc_dack0_w ) { pc_set_dma_channel(0, state); } |
| 248 | WRITE_LINE_MEMBER( at_state::pc_dack1_w ) { pc_set_dma_channel(1, state); } |
| 249 | WRITE_LINE_MEMBER( at_state::pc_dack2_w ) { pc_set_dma_channel(2, state); } |
| 250 | WRITE_LINE_MEMBER( at_state::pc_dack3_w ) { pc_set_dma_channel(3, state); } |
| 231 | 251 | WRITE_LINE_MEMBER( at_state::pc_dack4_w ) { m_dma8237_1->hack_w(state ? 0 : 1); } // it's inverted |
| 232 | | WRITE_LINE_MEMBER( at_state::pc_dack5_w ) { set_dma_channel(m_dma8237_2, 5, state); } |
| 233 | | WRITE_LINE_MEMBER( at_state::pc_dack6_w ) { set_dma_channel(m_dma8237_2, 6, state); } |
| 234 | | WRITE_LINE_MEMBER( at_state::pc_dack7_w ) { set_dma_channel(m_dma8237_2, 7, state); } |
| 252 | WRITE_LINE_MEMBER( at_state::pc_dack5_w ) { pc_set_dma_channel(5, state); } |
| 253 | WRITE_LINE_MEMBER( at_state::pc_dack6_w ) { pc_set_dma_channel(6, state); } |
| 254 | WRITE_LINE_MEMBER( at_state::pc_dack7_w ) { pc_set_dma_channel(7, state); } |
| 235 | 255 | |
| 236 | 256 | I8237_INTERFACE( at_dma8237_1_config ) |
| 237 | 257 | { |
| r17733 | r17734 | |
| 343 | 363 | st->m_poll_delay = 4; |
| 344 | 364 | st->m_at_spkrdata = 0; |
| 345 | 365 | st->m_at_speaker_input = 0; |
| 366 | st->m_dma_channel = -1; |
| 367 | st->m_cur_eop = false; |
| 346 | 368 | } |
trunk/src/mess/machine/genpc.c
| r17733 | r17734 | |
| 69 | 69 | |
| 70 | 70 | READ8_MEMBER( ibm5160_mb_device::pc_dma_read_byte ) |
| 71 | 71 | { |
| 72 | if(m_dma_channel == -1) |
| 73 | return 0xff; |
| 72 | 74 | address_space *spaceio = m_maincpu->space(AS_PROGRAM); |
| 73 | 75 | offs_t page_offset = (((offs_t) m_dma_offset[m_dma_channel]) << 16) & 0x0F0000; |
| 74 | 76 | return spaceio->read_byte( page_offset + offset); |
| r17733 | r17734 | |
| 77 | 79 | |
| 78 | 80 | WRITE8_MEMBER( ibm5160_mb_device::pc_dma_write_byte ) |
| 79 | 81 | { |
| 82 | if(m_dma_channel == -1) |
| 83 | return; |
| 80 | 84 | address_space *spaceio = m_maincpu->space(AS_PROGRAM); |
| 81 | 85 | offs_t page_offset = (((offs_t) m_dma_offset[m_dma_channel]) << 16) & 0x0F0000; |
| 82 | 86 | |
| r17733 | r17734 | |
| 127 | 131 | |
| 128 | 132 | WRITE_LINE_MEMBER( ibm5160_mb_device::pc_dma8237_out_eop ) |
| 129 | 133 | { |
| 130 | | return m_isabus->eop_w(state == ASSERT_LINE ? 0 : 1 ); |
| 134 | m_cur_eop = state == ASSERT_LINE; |
| 135 | if(m_dma_channel != -1 && m_cur_eop) |
| 136 | m_isabus->eop_w(m_dma_channel, m_cur_eop ? ASSERT_LINE : CLEAR_LINE ); |
| 131 | 137 | } |
| 132 | 138 | |
| 133 | | WRITE_LINE_MEMBER( ibm5160_mb_device::pc_dack0_w ) { if (!state) m_dma_channel = 0; } |
| 134 | | WRITE_LINE_MEMBER( ibm5160_mb_device::pc_dack1_w ) { if (!state) m_dma_channel = 1; } |
| 135 | | WRITE_LINE_MEMBER( ibm5160_mb_device::pc_dack2_w ) { if (!state) m_dma_channel = 2; } |
| 136 | | WRITE_LINE_MEMBER( ibm5160_mb_device::pc_dack3_w ) { if (!state) m_dma_channel = 3; } |
| 139 | void ibm5160_mb_device::pc_select_dma_channel(int channel, bool state) |
| 140 | { |
| 141 | if(!state) { |
| 142 | m_dma_channel = channel; |
| 143 | if(m_cur_eop) |
| 144 | m_isabus->eop_w(channel, ASSERT_LINE ); |
| 137 | 145 | |
| 146 | } else if(m_dma_channel == channel) { |
| 147 | m_dma_channel = -1; |
| 148 | if(m_cur_eop) |
| 149 | m_isabus->eop_w(channel, CLEAR_LINE ); |
| 150 | } |
| 151 | } |
| 152 | |
| 153 | WRITE_LINE_MEMBER( ibm5160_mb_device::pc_dack0_w ) { pc_select_dma_channel(0, state); } |
| 154 | WRITE_LINE_MEMBER( ibm5160_mb_device::pc_dack1_w ) { pc_select_dma_channel(1, state); } |
| 155 | WRITE_LINE_MEMBER( ibm5160_mb_device::pc_dack2_w ) { pc_select_dma_channel(2, state); } |
| 156 | WRITE_LINE_MEMBER( ibm5160_mb_device::pc_dack3_w ) { pc_select_dma_channel(3, state); } |
| 157 | |
| 138 | 158 | I8237_INTERFACE( pc_dma8237_config ) |
| 139 | 159 | { |
| 140 | 160 | DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, ibm5160_mb_device, pc_dma_hrq_changed), |
| r17733 | r17734 | |
| 651 | 671 | m_out1 = 2; // initial state of pit output is undefined |
| 652 | 672 | m_pc_spkrdata = 0; |
| 653 | 673 | m_pc_input = 0; |
| 654 | | m_dma_channel = 0; |
| 674 | m_dma_channel = -1; |
| 675 | m_cur_eop = false; |
| 655 | 676 | memset(m_dma_offset,0,sizeof(m_dma_offset)); |
| 656 | 677 | m_ppi_portc_switch_high = 0; |
| 657 | 678 | m_ppi_speaker = 0; |
trunk/src/mess/machine/southbridge.c
| r17733 | r17734 | |
| 221 | 221 | m_poll_delay = 4; |
| 222 | 222 | m_at_spkrdata = 0; |
| 223 | 223 | m_at_speaker_input = 0; |
| 224 | m_dma_channel = -1; |
| 225 | m_cur_eop = false; |
| 224 | 226 | } |
| 225 | 227 | |
| 226 | 228 | |
| r17733 | r17734 | |
| 336 | 338 | |
| 337 | 339 | READ8_MEMBER(southbridge_device::pc_dma_read_byte) |
| 338 | 340 | { |
| 341 | if(m_dma_channel == -1) |
| 342 | return 0xff; |
| 339 | 343 | UINT8 result; |
| 340 | 344 | offs_t page_offset = (((offs_t) m_dma_offset[0][m_dma_channel]) << 16) & 0xFF0000; |
| 341 | 345 | |
| r17733 | r17734 | |
| 346 | 350 | |
| 347 | 351 | WRITE8_MEMBER(southbridge_device::pc_dma_write_byte) |
| 348 | 352 | { |
| 353 | if(m_dma_channel == -1) |
| 354 | return; |
| 349 | 355 | offs_t page_offset = (((offs_t) m_dma_offset[0][m_dma_channel]) << 16) & 0xFF0000; |
| 350 | 356 | |
| 351 | 357 | space.write_byte(page_offset + offset, data); |
| r17733 | r17734 | |
| 354 | 360 | |
| 355 | 361 | READ8_MEMBER(southbridge_device::pc_dma_read_word) |
| 356 | 362 | { |
| 363 | if(m_dma_channel == -1) |
| 364 | return 0xff; |
| 357 | 365 | UINT16 result; |
| 358 | 366 | offs_t page_offset = (((offs_t) m_dma_offset[1][m_dma_channel & 3]) << 16) & 0xFF0000; |
| 359 | 367 | |
| r17733 | r17734 | |
| 366 | 374 | |
| 367 | 375 | WRITE8_MEMBER(southbridge_device::pc_dma_write_word) |
| 368 | 376 | { |
| 377 | if(m_dma_channel == -1) |
| 378 | return; |
| 369 | 379 | offs_t page_offset = (((offs_t) m_dma_offset[1][m_dma_channel & 3]) << 16) & 0xFF0000; |
| 370 | 380 | |
| 371 | 381 | space.write_word(page_offset + ( offset << 1 ), m_dma_high_byte | data); |
| r17733 | r17734 | |
| 389 | 399 | WRITE8_MEMBER( southbridge_device::pc_dma8237_6_dack_w ){ m_isabus->dack_w(6, data); } |
| 390 | 400 | WRITE8_MEMBER( southbridge_device::pc_dma8237_7_dack_w ){ m_isabus->dack_w(7, data); } |
| 391 | 401 | |
| 392 | | WRITE_LINE_MEMBER( southbridge_device::at_dma8237_out_eop ) { m_isabus->eop_w(state == ASSERT_LINE ? 0 : 1 ); } |
| 402 | WRITE_LINE_MEMBER( southbridge_device::at_dma8237_out_eop ) |
| 403 | { |
| 404 | m_cur_eop = state == ASSERT_LINE; |
| 405 | if(m_dma_channel != -1) |
| 406 | m_isabus->eop_w(m_dma_channel, ASSERT_LINE ); |
| 407 | } |
| 393 | 408 | |
| 394 | | WRITE_LINE_MEMBER( southbridge_device::pc_dack0_w ) { if (!state) m_dma_channel = 0; } |
| 395 | | WRITE_LINE_MEMBER( southbridge_device::pc_dack1_w ) { if (!state) m_dma_channel = 1; } |
| 396 | | WRITE_LINE_MEMBER( southbridge_device::pc_dack2_w ) { if (!state) m_dma_channel = 2; } |
| 397 | | WRITE_LINE_MEMBER( southbridge_device::pc_dack3_w ) { if (!state) m_dma_channel = 3; } |
| 409 | void southbridge_device::pc_select_dma_channel(int channel, bool state) |
| 410 | { |
| 411 | if(!state) { |
| 412 | m_dma_channel = channel; |
| 413 | if(m_cur_eop) |
| 414 | m_isabus->eop_w(channel, ASSERT_LINE ); |
| 415 | |
| 416 | } else if(m_dma_channel == channel) { |
| 417 | m_dma_channel = -1; |
| 418 | if(m_cur_eop) |
| 419 | m_isabus->eop_w(channel, CLEAR_LINE ); |
| 420 | } |
| 421 | } |
| 422 | |
| 423 | |
| 424 | WRITE_LINE_MEMBER( southbridge_device::pc_dack0_w ) { pc_select_dma_channel(0, state); } |
| 425 | WRITE_LINE_MEMBER( southbridge_device::pc_dack1_w ) { pc_select_dma_channel(1, state); } |
| 426 | WRITE_LINE_MEMBER( southbridge_device::pc_dack2_w ) { pc_select_dma_channel(2, state); } |
| 427 | WRITE_LINE_MEMBER( southbridge_device::pc_dack3_w ) { pc_select_dma_channel(3, state); } |
| 398 | 428 | WRITE_LINE_MEMBER( southbridge_device::pc_dack4_w ) { i8237_hlda_w( m_dma8237_1, state ? 0 : 1); } // it's inverted |
| 399 | | WRITE_LINE_MEMBER( southbridge_device::pc_dack5_w ) { if (!state) m_dma_channel = 5; } |
| 400 | | WRITE_LINE_MEMBER( southbridge_device::pc_dack6_w ) { if (!state) m_dma_channel = 6; } |
| 401 | | WRITE_LINE_MEMBER( southbridge_device::pc_dack7_w ) { if (!state) m_dma_channel = 7; } |
| 429 | WRITE_LINE_MEMBER( southbridge_device::pc_dack5_w ) { pc_select_dma_channel(5, state); } |
| 430 | WRITE_LINE_MEMBER( southbridge_device::pc_dack6_w ) { pc_select_dma_channel(6, state); } |
| 431 | WRITE_LINE_MEMBER( southbridge_device::pc_dack7_w ) { pc_select_dma_channel(7, state); } |
| 402 | 432 | |
| 403 | 433 | READ8_MEMBER( southbridge_device::at_portb_r ) |
| 404 | 434 | { |