~ubuntu-branches/ubuntu/precise/mame/precise-proposed

« back to all changes in this revision

Viewing changes to src/emu/machine/z80dma.c

  • Committer: Package Import Robot
  • Author(s): Cesare Falco
  • Date: 2011-11-30 18:50:10 UTC
  • mfrom: (1.1.4)
  • Revision ID: package-import@ubuntu.com-20111130185010-02hcxybht1mn082w
Tags: 0.144-0ubuntu1
* New upstream release (LP: #913550)
* mame.install:
  - Added artwork/ images to be used with -effect switch
  - Be more selective with hash/ contents
* contrib/mame.ini: added /usr/share/games/mame/artwork/ to artpath

Show diffs side-by-side

added added

removed removed

Lines of Context:
67
67
//**************************************************************************
68
68
 
69
69
#define LOG 0
 
70
#define DMA_LOG 0
70
71
 
71
72
#define REGNUM(_m, _s)                  (((_m)<<3) + (_s))
72
73
#define GET_REGNUM(_r)                  (&(_r) - &(WR0))
397
398
                                else
398
399
                                        m_latch = m_in_iorq_func(m_addressA);
399
400
 
400
 
                                if (LOG) logerror("Z80DMA '%s' A src: %04x %s -> data: %02x\n", tag(), m_addressA, PORTA_MEMORY ? "mem" : "i/o", m_latch);
401
 
                                m_addressA += PORTA_FIXED ? 0 : PORTA_INC ? 1 : -1;
 
401
                                if (DMA_LOG) logerror("Z80DMA '%s' A src: %04x %s -> data: %02x\n", tag(), m_addressA, PORTA_MEMORY ? "mem" : "i/o", m_latch);
402
402
                        }
403
403
                        else
404
404
                        {
407
407
                                else
408
408
                                        m_latch = m_in_iorq_func(m_addressB);
409
409
 
410
 
                                if (LOG) logerror("Z80DMA '%s' B src: %04x %s -> data: %02x\n", tag(), m_addressB, PORTB_MEMORY ? "mem" : "i/o", m_latch);
411
 
                                m_addressB += PORTB_FIXED ? 0 : PORTB_INC ? 1 : -1;
 
410
                                if (DMA_LOG) logerror("Z80DMA '%s' B src: %04x %s -> data: %02x\n", tag(), m_addressB, PORTB_MEMORY ? "mem" : "i/o", m_latch);
412
411
                        }
413
412
                        break;
414
413
                case TM_SEARCH_TRANSFER:
444
443
                                else
445
444
                                        m_out_iorq_func(m_addressB, m_latch);
446
445
 
447
 
                                if (LOG) logerror("Z80DMA '%s' B dst: %04x %s\n", tag(), m_addressB, PORTB_MEMORY ? "mem" : "i/o");
448
 
                                m_addressB += PORTB_FIXED ? 0 : PORTB_INC ? 1 : -1;
 
446
                                if (DMA_LOG) logerror("Z80DMA '%s' B dst: %04x %s\n", tag(), m_addressB, PORTB_MEMORY ? "mem" : "i/o");
449
447
                        }
450
448
                        else
451
449
                        {
454
452
                                else
455
453
                                        m_out_iorq_func(m_addressA, m_latch);
456
454
 
457
 
                                if (LOG) logerror("Z80DMA '%s' A dst: %04x %s\n", tag(), m_addressA, PORTA_MEMORY ? "mem" : "i/o");
458
 
                                m_addressA += PORTA_FIXED ? 0 : PORTA_INC ? 1 : -1;
 
455
                                if (DMA_LOG) logerror("Z80DMA '%s' A dst: %04x %s\n", tag(), m_addressA, PORTA_MEMORY ? "mem" : "i/o");
459
456
                        }
460
 
                        m_count--;
461
 
                        done = (m_count == 0xFFFF);
 
457
 
462
458
                        break;
463
459
 
464
460
                case TM_SEARCH:
475
471
                                        }
476
472
                                }
477
473
 
478
 
                                m_count--;
479
 
                                done = (m_count == 0xFFFF); //correct?
480
474
                        }
481
475
                        break;
482
476
 
488
482
                        logerror("z80dma_do_operation: invalid mode %d!\n", mode);
489
483
                        break;
490
484
        }
 
485
 
 
486
        m_addressA += PORTA_FIXED ? 0 : PORTA_INC ? 1 : -1;
 
487
        m_addressB += PORTB_FIXED ? 0 : PORTB_INC ? 1 : -1;
 
488
 
 
489
        m_count--;
 
490
        done = (m_count == 0xFFFF); //correct?
 
491
 
491
492
        if (done)
492
493
        {
493
494
                //FIXME: interrupt ?
513
514
 
514
515
        if (m_is_read)
515
516
        {
 
517
                /* TODO: there's a nasty recursion bug with Alpha for Sharp X1 Turbo on the transfers with this function! */
516
518
                do_read();
517
519
                done = 0;
518
520
                m_is_read = false;
528
530
        if (done)
529
531
        {
530
532
                m_dma_enabled = 0; //FIXME: Correct?
531
 
        m_status = 0x19;
 
533
        m_status = 0x09;
532
534
 
533
535
                m_status |= !is_ready() << 1; // ready line status
534
536
 
595
597
{
596
598
        UINT8 res;
597
599
 
 
600
        if(m_read_num_follow == 0) /* TODO: should return the status, but let me know WHAT uses this first */
 
601
                fatalerror("Z80DMA '%s' Read without anything setted into stack", tag());
 
602
 
598
603
        res = m_read_regs_follow[m_read_cur_follow];
599
604
        m_read_cur_follow++;
600
605
 
678
683
                                        break;
679
684
                                case COMMAND_READ_STATUS_BYTE:
680
685
                                        if (LOG) logerror("Z80DMA '%s' CMD Read status Byte\n", tag());
681
 
                                READ_MASK = 0;
 
686
                                READ_MASK = 1;
 
687
                                m_read_regs_follow[m_read_num_follow++] = m_status;
682
688
                                break;
683
689
                                case COMMAND_RESET_AND_DISABLE_INTERRUPTS:
684
690
                                        WR3 &= ~0x20;
691
697
                                        if (LOG) logerror("Z80DMA '%s' Initiate Read Sequence\n", tag());
692
698
                                        m_read_cur_follow = m_read_num_follow = 0;
693
699
                                        if(READ_MASK & 0x01) { m_read_regs_follow[m_read_num_follow++] = m_status; }
694
 
                                        if(READ_MASK & 0x02) { m_read_regs_follow[m_read_num_follow++] = BLOCKLEN_L; } //byte counter (low)
695
 
                                        if(READ_MASK & 0x04) { m_read_regs_follow[m_read_num_follow++] = BLOCKLEN_H; } //byte counter (high)
696
 
                                        if(READ_MASK & 0x08) { m_read_regs_follow[m_read_num_follow++] = PORTA_ADDRESS_L; } //port A address (low)
697
 
                                        if(READ_MASK & 0x10) { m_read_regs_follow[m_read_num_follow++] = PORTA_ADDRESS_H; } //port A address (high)
698
 
                                        if(READ_MASK & 0x20) { m_read_regs_follow[m_read_num_follow++] = PORTB_ADDRESS_L; } //port B address (low)
699
 
                                        if(READ_MASK & 0x40) { m_read_regs_follow[m_read_num_follow++] = PORTB_ADDRESS_H; } //port B address (high)
 
700
                                        if(READ_MASK & 0x02) { m_read_regs_follow[m_read_num_follow++] = m_count & 0xff; } //byte counter (low)
 
701
                                        if(READ_MASK & 0x04) { m_read_regs_follow[m_read_num_follow++] = m_count >> 8; } //byte counter (high)
 
702
                                        if(READ_MASK & 0x08) { m_read_regs_follow[m_read_num_follow++] = m_addressA & 0xff; } //port A address (low)
 
703
                                        if(READ_MASK & 0x10) { m_read_regs_follow[m_read_num_follow++] = m_addressA >> 8; } //port A address (high)
 
704
                                        if(READ_MASK & 0x20) { m_read_regs_follow[m_read_num_follow++] = m_addressB & 0xff; } //port B address (low)
 
705
                                        if(READ_MASK & 0x40) { m_read_regs_follow[m_read_num_follow++] = m_addressB >> 8; } //port B address (high)
700
706
                                        break;
701
707
                                case COMMAND_RESET:
702
708
                                        if (LOG) logerror("Z80DMA '%s' Reset\n", tag());
723
729
                                        m_addressB = PORTB_ADDRESS;
724
730
                                        m_count = BLOCKLEN;
725
731
                                        m_status |= 0x30;
 
732
 
726
733
                                        if (LOG) logerror("Z80DMA '%s' Load A: %x B: %x N: %x\n", tag(), m_addressA, m_addressB, m_count);
727
734
                                        break;
728
735
                                case COMMAND_DISABLE_DMA:
800
807
                                m_regs_follow[m_num_follow++] = GET_REGNUM(INTERRUPT_VECTOR);
801
808
                        m_cur_follow = 0;
802
809
                }
 
810
                else if(m_regs_follow[m_num_follow] == GET_REGNUM(READ_MASK))
 
811
                {
 
812
                        m_read_cur_follow = m_read_num_follow = 0;
 
813
 
 
814
                        if(READ_MASK & 0x01) { m_read_regs_follow[m_read_num_follow++] = m_status; }
 
815
                        if(READ_MASK & 0x02) { m_read_regs_follow[m_read_num_follow++] = m_count & 0xff; } //byte counter (low)
 
816
                        if(READ_MASK & 0x04) { m_read_regs_follow[m_read_num_follow++] = m_count >> 8; } //byte counter (high)
 
817
                        if(READ_MASK & 0x08) { m_read_regs_follow[m_read_num_follow++] = m_addressA & 0xff; } //port A address (low)
 
818
                        if(READ_MASK & 0x10) { m_read_regs_follow[m_read_num_follow++] = m_addressA >> 8; } //port A address (high)
 
819
                        if(READ_MASK & 0x20) { m_read_regs_follow[m_read_num_follow++] = m_addressB & 0xff; } //port B address (low)
 
820
                        if(READ_MASK & 0x40) { m_read_regs_follow[m_read_num_follow++] = m_addressB >> 8; } //port B address (high)
 
821
                }
803
822
 
804
823
                m_reset_pointer++;
805
824
                if(m_reset_pointer >= 6) { m_reset_pointer = 0; }