Mercurial > repos > blastem
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 { |