comparison musashi/m68kcpu.c @ 1508:2e57910fd641 mame_interp

More efficient memory access when using MAME interpreters
author Michael Pavone <pavone@retrodev.com>
date Sun, 31 Dec 2017 10:03:25 -0800
parents 2455662378ed
children a81db00e171a
comparison
equal deleted inserted replaced
1507:2455662378ed 1508:2e57910fd641
771 * 8-bit data memory interface 771 * 8-bit data memory interface
772 ****************************************************************************/ 772 ****************************************************************************/
773 773
774 uint8_t m68ki_read_8(m68000_base_device *m68k, uint32_t address) 774 uint8_t m68ki_read_8(m68000_base_device *m68k, uint32_t address)
775 { 775 {
776 address &= 0xFFFFFF;
777 uint32_t base = address >> 16;
778 if (m68k->read_pointers[base]) {
779 uint8_t *chunk = m68k->read_pointers[base];
780 return chunk[(address ^ 1) & 0xFFFF];
781 }
776 return read_byte(address, (void **)m68k->c.mem_pointers, &m68k->c.options->gen, &m68k->c); 782 return read_byte(address, (void **)m68k->c.mem_pointers, &m68k->c.options->gen, &m68k->c);
777 } 783 }
778 784
779 void m68ki_write_8(m68000_base_device *m68k, uint32_t address, uint8_t value) 785 void m68ki_write_8(m68000_base_device *m68k, uint32_t address, uint8_t value)
780 { 786 {
787 address &= 0xFFFFFF;
788 uint32_t base = address >> 16;
789 if (m68k->read_pointers[base]) {
790 uint8_t *chunk = m68k->read_pointers[base];
791 chunk[(address ^ 1) & 0xFFFF] = value;
792 return;
793 }
781 write_byte(address, value, (void **)m68k->c.mem_pointers, &m68k->c.options->gen, &m68k->c); 794 write_byte(address, value, (void **)m68k->c.mem_pointers, &m68k->c.options->gen, &m68k->c);
782 } 795 }
783 796
784 /**************************************************************************** 797 /****************************************************************************
785 * 16-bit data memory interface 798 * 16-bit data memory interface
786 ****************************************************************************/ 799 ****************************************************************************/
787 800
788 uint16_t m68ki_read_16(m68000_base_device *m68k, uint32_t address) 801 uint16_t m68ki_read_16(m68000_base_device *m68k, uint32_t address)
789 { 802 {
803 address &= 0xFFFFFF;
804 uint32_t base = address >> 16;
805 if (m68k->read_pointers[base]) {
806 uint16_t *chunk = m68k->read_pointers[base];
807 return chunk[address >> 1 & 0x7FFF];
808 }
790 return read_word(address, (void **)m68k->c.mem_pointers, &m68k->c.options->gen, &m68k->c); 809 return read_word(address, (void **)m68k->c.mem_pointers, &m68k->c.options->gen, &m68k->c);
791 } 810 }
792 811
793 void m68ki_write_16(m68000_base_device *m68k, uint32_t address, uint16_t value) 812 void m68ki_write_16(m68000_base_device *m68k, uint32_t address, uint16_t value)
794 { 813 {
814 address &= 0xFFFFFF;
815 uint32_t base = address >> 16;
816 if (m68k->write_pointers[base]) {
817 uint16_t *chunk = m68k->read_pointers[base];
818 chunk[address >> 1 & 0x7FFF] = value;
819 return;
820 }
795 write_word(address, value, (void **)m68k->c.mem_pointers, &m68k->c.options->gen, &m68k->c); 821 write_word(address, value, (void **)m68k->c.mem_pointers, &m68k->c.options->gen, &m68k->c);
796 } 822 }
797 823
798 824
799 /**************** 825 /****************
831 this->cyc_movem_l = 3;// * this->c.options->gen.clock_divider; 857 this->cyc_movem_l = 3;// * this->c.options->gen.clock_divider;
832 this->cyc_shift = 1;// * this->c.options->gen.clock_divider; 858 this->cyc_shift = 1;// * this->c.options->gen.clock_divider;
833 this->cyc_reset = 132 * this->c.options->gen.clock_divider; 859 this->cyc_reset = 132 * this->c.options->gen.clock_divider;
834 this->int_mask = 7 << 8; 860 this->int_mask = 7 << 8;
835 this->c.status = m68ki_get_sr(this) >> 8; 861 this->c.status = m68ki_get_sr(this) >> 8;
862 for (uint32_t address = 0; address < (24*1024*1024); address += 64*1024)
863 {
864 this->read_pointers[address >> 16] = NULL;
865 this->write_pointers[address >> 16] = NULL;
866 memmap_chunk const *chunk = find_map_chunk(address, &this->c.options->gen, 0, NULL);
867 if (!chunk || chunk->end < (address + 64*1024) || (chunk->flags & (MMAP_ONLY_ODD | MMAP_ONLY_EVEN | MMAP_PTR_IDX)) || !chunk->buffer) {
868 continue;
869 }
870 void *ptr = get_native_pointer(address, (void **)this->c.mem_pointers, &this->c.options->gen);
871 if (!ptr) {
872 continue;
873 }
874 if (chunk->flags & MMAP_READ) {
875 this->read_pointers[address >> 16] = ptr;
876 }
877 if (chunk->flags & MMAP_WRITE) {
878 this->write_pointers[address >> 16] = ptr;
879 }
880 }
836 } 881 }
837 882
838 /* Service an interrupt request and start exception processing */ 883 /* Service an interrupt request and start exception processing */
839 void m68ki_exception_interrupt(m68000_base_device *this, uint32_t int_level) 884 void m68ki_exception_interrupt(m68000_base_device *this, uint32_t int_level)
840 { 885 {