src/mess/machine/pc_hdc.c
| r6771 | r6772 | |
| 36 | 36 | #include "memconv.h" |
| 37 | 37 | |
| 38 | 38 | |
| 39 | | #define LOG_HDC_STATUS 0 |
| 40 | | #define LOG_HDC_CALL 0 |
| 41 | | #define LOG_HDC_DATA 0 |
| 39 | #define LOG_HDC_STATUS 1 |
| 40 | #define LOG_HDC_CALL 1 |
| 41 | #define LOG_HDC_DATA 1 |
| 42 | 42 | |
| 43 | 43 | |
| 44 | 44 | #define MAX_HARD 2 |
| r6771 | r6772 | |
| 330 | 330 | /* the following crap is an abomination; it is a relic of the old crappy DMA |
| 331 | 331 | * implementation that threw the idea of "emulating the hardware" to the wind |
| 332 | 332 | */ |
| 333 | | static UINT8 *hdcdma_data; |
| 333 | static UINT8 hdcdma_data[512]; |
| 334 | 334 | static UINT8 *hdcdma_src; |
| 335 | 335 | static UINT8 *hdcdma_dst; |
| 336 | 336 | static int hdcdma_read; |
| r6771 | r6772 | |
| 373 | 373 | } |
| 374 | 374 | } |
| 375 | 375 | |
| 376 | if ( ! no_dma() ) |
| 377 | { |
| 378 | assert( pc_hdc_dma8237 != NULL ); |
| 379 | i8237_dreq3_w( pc_hdc_dma8237, ( hdcdma_read || hdcdma_size ) ? 1 : 0 ); |
| 380 | } |
| 381 | |
| 376 | 382 | return result; |
| 377 | 383 | } |
| 378 | 384 | |
| r6771 | r6772 | |
| 408 | 414 | } |
| 409 | 415 | hdcdma_dst = hdcdma_data; |
| 410 | 416 | } |
| 417 | |
| 418 | if ( ! no_dma() ) |
| 419 | { |
| 420 | assert( pc_hdc_dma8237 != NULL ); |
| 421 | i8237_dreq3_w( pc_hdc_dma8237, ( hdcdma_write || hdcdma_size ) ? 1 : 0 ); |
| 422 | } |
| 411 | 423 | } |
| 412 | 424 | |
| 413 | 425 | |
| r6771 | r6772 | |
| 415 | 427 | static void execute_read(running_machine *machine) |
| 416 | 428 | { |
| 417 | 429 | hard_disk_file *disk = pc_hdc_file(machine, idx); |
| 418 | | UINT8 data[512], *src = data; |
| 419 | 430 | int size = sector_cnt[idx] * 512; |
| 420 | 431 | int read_ = 0; |
| 421 | 432 | |
| r6771 | r6772 | |
| 423 | 434 | if (!disk) |
| 424 | 435 | return; |
| 425 | 436 | |
| 426 | | hdcdma_data = data; |
| 427 | | hdcdma_src = src; |
| 437 | hdcdma_src = hdcdma_data; |
| 428 | 438 | hdcdma_read = read_; |
| 429 | 439 | hdcdma_size = size; |
| 430 | 440 | |
| r6771 | r6772 | |
| 437 | 447 | } |
| 438 | 448 | else |
| 439 | 449 | { |
| 440 | | i8237_run_transfer(pc_hdc_dma8237, HDC_DMA); |
| 450 | assert( pc_hdc_dma8237 != NULL ); |
| 451 | i8237_dreq3_w( pc_hdc_dma8237, 1 ); |
| 441 | 452 | } |
| 442 | 453 | } |
| 443 | 454 | |
| r6771 | r6772 | |
| 446 | 457 | static void execute_write(running_machine *machine) |
| 447 | 458 | { |
| 448 | 459 | hard_disk_file *disk = pc_hdc_file(machine, idx); |
| 449 | | UINT8 data[512], *dst = data; |
| 450 | 460 | int size = sector_cnt[idx] * 512; |
| 451 | 461 | int write_ = 512; |
| 452 | 462 | |
| r6771 | r6772 | |
| 454 | 464 | if (!disk) |
| 455 | 465 | return; |
| 456 | 466 | |
| 457 | | hdcdma_data = data; |
| 458 | | hdcdma_dst = dst; |
| 467 | hdcdma_dst = hdcdma_data; |
| 459 | 468 | hdcdma_write = write_; |
| 460 | 469 | hdcdma_size = size; |
| 461 | 470 | |
| r6771 | r6772 | |
| 469 | 478 | } |
| 470 | 479 | else |
| 471 | 480 | { |
| 472 | | i8237_run_transfer(pc_hdc_dma8237, HDC_DMA); |
| 481 | assert( pc_hdc_dma8237 != NULL ); |
| 482 | i8237_dreq3_w( pc_hdc_dma8237, 1 ); |
| 473 | 483 | } |
| 474 | 484 | } |
| 475 | 485 | |