diff options
author | 2020-05-25 16:42:42 +0200 | |
---|---|---|
committer | 2020-05-25 16:42:57 +0200 | |
commit | 22513fb6fe281f5ccb75aaddb6417a12a66c313d (patch) | |
tree | 3cf84032cc6482d685a8dbb57e015bd17c7f7fdc /src/mame/drivers/mindset.cpp | |
parent | e42c2d2874cf9c1092c01ab5ce9ef997d465ce25 (diff) |
emumem: A little more speedup. cache and specific change syntax, and are not pointers anymore [O. Galibert]
The last(?) two changes are:
- Add a template parameter to everything (theoretically the address
space width, in practice a level derived from it to keep as much
compatibility between widths as possible) so that the shift size
becomes a constant.
- Change the syntax of declaring and initializing the caches and
specifics so that they're embedded in the owner device. Solves
lifetime issues and also removes one indirection (looking up the base
dispatch pointer through the cache/specific pointer).
Diffstat (limited to 'src/mame/drivers/mindset.cpp')
-rw-r--r-- | src/mame/drivers/mindset.cpp | 54 |
1 files changed, 27 insertions, 27 deletions
diff --git a/src/mame/drivers/mindset.cpp b/src/mame/drivers/mindset.cpp index cffba194b09..279ad92bbf8 100644 --- a/src/mame/drivers/mindset.cpp +++ b/src/mame/drivers/mindset.cpp @@ -330,7 +330,7 @@ protected: required_device<dac_byte_interface> m_dac; required_device_array<mindset_module, 6> m_modules; - memory_access_cache<1, 0, ENDIANNESS_LITTLE> *m_gcps; + memory_access<20, 1, 0, ENDIANNESS_LITTLE>::cache m_gcps; floppy_image_device *m_floppy[2]; u32 m_palette[16]; @@ -450,7 +450,7 @@ void mindset_state::machine_start() m_yellow_led.resolve(); m_green_led.resolve(); - m_gcps = m_maincpu->space(AS_PROGRAM).cache<1, 0, ENDIANNESS_LITTLE>(); + m_maincpu->space(AS_PROGRAM).cache(m_gcps); for(int i=0; i<2; i++) m_floppy[i] = m_fdco[i]->get_device(); @@ -1000,20 +1000,20 @@ u16 (*const mindset_state::gcp_blend[8])(u16, u16) = { void mindset_state::blit(u16 packet_seg, u16 packet_adr) { - u16 mode = sw(m_gcps->read_word((packet_seg << 4) + ((packet_adr + 0) & 0xffff))); - u16 src_adr = sw(m_gcps->read_word((packet_seg << 4) + ((packet_adr + 2) & 0xffff))); - u16 src_sft = sw(m_gcps->read_word((packet_seg << 4) + ((packet_adr + 4) & 0xffff))); - u16 dst_adr = sw(m_gcps->read_word((packet_seg << 4) + ((packet_adr + 6) & 0xffff))); - u16 dst_sft = sw(m_gcps->read_word((packet_seg << 4) + ((packet_adr + 8) & 0xffff))); - u16 width = sw(m_gcps->read_word((packet_seg << 4) + ((packet_adr + 10) & 0xffff))); - u16 height = sw(m_gcps->read_word((packet_seg << 4) + ((packet_adr + 12) & 0xffff))); - u16 sy = sw(m_gcps->read_word((packet_seg << 4) + ((packet_adr + 14) & 0xffff))); - u16 dy = sw(m_gcps->read_word((packet_seg << 4) + ((packet_adr + 16) & 0xffff))); - u16 rmask = sw(m_gcps->read_word((packet_seg << 4) + ((packet_adr + 18) & 0xffff))); - u16 src_seg = sw(m_gcps->read_word((packet_seg << 4) + ((packet_adr + 20) & 0xffff))); - u16 dst_seg = sw(m_gcps->read_word((packet_seg << 4) + ((packet_adr + 22) & 0xffff))); - u16 wmask = sw(m_gcps->read_word((packet_seg << 4) + ((packet_adr + 24) & 0xffff))); - u16 kmask = sw(m_gcps->read_word((packet_seg << 4) + ((packet_adr + 26) & 0xffff))); + u16 mode = sw(m_gcps.read_word((packet_seg << 4) + ((packet_adr + 0) & 0xffff))); + u16 src_adr = sw(m_gcps.read_word((packet_seg << 4) + ((packet_adr + 2) & 0xffff))); + u16 src_sft = sw(m_gcps.read_word((packet_seg << 4) + ((packet_adr + 4) & 0xffff))); + u16 dst_adr = sw(m_gcps.read_word((packet_seg << 4) + ((packet_adr + 6) & 0xffff))); + u16 dst_sft = sw(m_gcps.read_word((packet_seg << 4) + ((packet_adr + 8) & 0xffff))); + u16 width = sw(m_gcps.read_word((packet_seg << 4) + ((packet_adr + 10) & 0xffff))); + u16 height = sw(m_gcps.read_word((packet_seg << 4) + ((packet_adr + 12) & 0xffff))); + u16 sy = sw(m_gcps.read_word((packet_seg << 4) + ((packet_adr + 14) & 0xffff))); + u16 dy = sw(m_gcps.read_word((packet_seg << 4) + ((packet_adr + 16) & 0xffff))); + u16 rmask = sw(m_gcps.read_word((packet_seg << 4) + ((packet_adr + 18) & 0xffff))); + u16 src_seg = sw(m_gcps.read_word((packet_seg << 4) + ((packet_adr + 20) & 0xffff))); + u16 dst_seg = sw(m_gcps.read_word((packet_seg << 4) + ((packet_adr + 22) & 0xffff))); + u16 wmask = sw(m_gcps.read_word((packet_seg << 4) + ((packet_adr + 24) & 0xffff))); + u16 kmask = sw(m_gcps.read_word((packet_seg << 4) + ((packet_adr + 26) & 0xffff))); // -f-w wnpi ktxm mm-- // f = fast (pure word copy) @@ -1040,9 +1040,9 @@ void mindset_state::blit(u16 packet_seg, u16 packet_adr) if(mode & 0x200) { // pattern fill - u16 src = m_gcps->read_word((src_seg << 4) + src_adr); + u16 src = m_gcps.read_word((src_seg << 4) + src_adr); for(u16 w=0; w != width/2; w++) { - m_gcps->write_word((dst_seg << 4) + dst_adr, src); + m_gcps.write_word((dst_seg << 4) + dst_adr, src); dst_adr += 2; } @@ -1053,7 +1053,7 @@ void mindset_state::blit(u16 packet_seg, u16 packet_adr) u16 src_cadr = src_adr; u16 dst_cadr = dst_adr; for(u32 w=0; w!=nw; w++) { - m_gcps->write_word((dst_seg << 4) + dst_cadr, m_gcps->read_word((src_seg << 4) + src_cadr)); + m_gcps.write_word((dst_seg << 4) + dst_cadr, m_gcps.read_word((src_seg << 4) + src_cadr)); src_cadr += 2; dst_cadr += 2; } @@ -1095,14 +1095,14 @@ void mindset_state::blit(u16 packet_seg, u16 packet_adr) u16 nw1 = nw; u32 srcs = 0; if(preload) { - srcs = sw(m_gcps->read_word((src_seg << 4) + src_cadr)) << src_do_sft; + srcs = sw(m_gcps.read_word((src_seg << 4) + src_cadr)) << src_do_sft; if(mode & 0x100) src_cadr += 2; } do { - srcs = (srcs << 16) | (sw(m_gcps->read_word((src_seg << 4) + src_cadr)) << src_do_sft); + srcs = (srcs << 16) | (sw(m_gcps.read_word((src_seg << 4) + src_cadr)) << src_do_sft); u16 src = (srcs >> dst_do_sft) & rmask; - u16 dst = sw(m_gcps->read_word((dst_seg << 4) + dst_cadr)); + u16 dst = sw(m_gcps.read_word((dst_seg << 4) + dst_cadr)); u16 res = blend(src, dst); if(mode & 0x40) { u16 tmask; @@ -1132,7 +1132,7 @@ void mindset_state::blit(u16 packet_seg, u16 packet_adr) res = (dst & ~cmask) | (res & cmask); - m_gcps->write_word((dst_seg << 4) + dst_cadr, sw(res)); + m_gcps.write_word((dst_seg << 4) + dst_cadr, sw(res)); if(mode & 0x100) src_cadr += 2; dst_cadr += 2; @@ -1151,9 +1151,9 @@ void mindset_state::blit(u16 packet_seg, u16 packet_adr) void mindset_state::gcp_w(u16) { - u16 packet_seg = sw(m_gcps->read_word(0xbfd7a)); - u16 packet_adr = sw(m_gcps->read_word(0xbfd78)); - u16 global_mode = sw(m_gcps->read_word(0xbfd76)); + u16 packet_seg = sw(m_gcps.read_word(0xbfd7a)); + u16 packet_adr = sw(m_gcps.read_word(0xbfd78)); + u16 global_mode = sw(m_gcps.read_word(0xbfd76)); if(0) logerror("GCP: start %04x:%04x mode %04x (%05x)\n", packet_seg, packet_adr, global_mode, m_maincpu->pc()); @@ -1166,7 +1166,7 @@ void mindset_state::gcp_w(u16) } // 100 = done, 200 = done too???, 400 = collision? - m_gcps->write_word(0xbfd74, m_gcps->read_word(0xbfd74) | 0x0700); + m_gcps.write_word(0xbfd74, m_gcps.read_word(0xbfd74) | 0x0700); // Can trigger an irq, on mode & 2 (or is it 200?) (0x40 on 8282, ack on 0x41, which means the system 8042...) } |