1 // license:BSD-3-Clause 2 // copyright-holders:Alex Pasadyn,Zsolt Vasvari 3 /*************************************************************************** 4 5 TMS34010: Portable Texas Instruments TMS34010 emulator 6 7 Copyright Alex Pasadyn/Zsolt Vasvari 8 Parts based on code by Aaron Giles 9 10 ***************************************************************************/ 11 12 #ifndef MAME_CPU_TMS34010_34010OPS_H 13 #define MAME_CPU_TMS34010_34010OPS_H 14 15 #pragma once 16 17 18 19 20 /*************************************************************************** 21 MEMORY I/O MACROS 22 ***************************************************************************/ 23 24 /* IO registers accessor */ 25 #define IOREG(reg) (m_IOregs[reg]) 26 #define SMART_IOREG(reg) (m_IOregs[m_is_34020 ? (int)REG020_##reg : (int)REG_##reg]) 27 #define PBH() (IOREG(REG_CONTROL) & 0x0100) 28 #define PBV() (IOREG(REG_CONTROL) & 0x0200) 29 30 31 32 /*************************************************************************** 33 FIELD WRITE MACROS 34 ***************************************************************************/ 35 36 #define WFIELDMAC(MASK,MAX) \ 37 uint32_t shift = offset & 0x0f; \ 38 uint32_t masked_data = data & (MASK); \ 39 uint32_t old; \ 40 \ 41 offset = offset & 0xfffffff0; \ 42 \ 43 if (shift >= MAX) \ 44 { \ 45 old = (uint32_t)TMS34010_RDMEM_DWORD(offset) & ~((MASK) << shift); \ 46 TMS34010_WRMEM_DWORD(offset, (masked_data << shift) | old); \ 47 } \ 48 else \ 49 { \ 50 old = (uint32_t)TMS34010_RDMEM_WORD(offset) & ~((MASK) << shift); \ 51 TMS34010_WRMEM_WORD(offset, ((masked_data & (MASK)) << shift) | old); \ 52 } 53 54 #define WFIELDMAC_BIG(MASK,MAX) \ 55 uint32_t shift = offset & 0x0f; \ 56 uint32_t masked_data = data & (MASK); \ 57 uint32_t old; \ 58 \ 59 offset = offset & 0xfffffff0; \ 60 \ 61 old = (uint32_t)TMS34010_RDMEM_DWORD(offset) & ~(uint32_t)((MASK) << shift); \ 62 TMS34010_WRMEM_DWORD(offset, (uint32_t)(masked_data << shift) | old); \ 63 if (shift >= MAX) \ 64 { \ 65 shift = 32 - shift; \ 66 old = (uint32_t)TMS34010_RDMEM_WORD(offset + 0x20) & ~((MASK) >> shift); \ 67 TMS34010_WRMEM_WORD(offset, (masked_data >> shift) | old); \ 68 } 69 70 #define WFIELDMAC_8() \ 71 if (true) \ 72 { \ 73 WFIELDMAC(0xff,9); \ 74 } 75 76 #define RFIELDMAC_8() \ 77 if (true) \ 78 { \ 79 RFIELDMAC(0xff,9); \ 80 } 81 82 #define WFIELDMAC_32() \ 83 if (offset & 0x0f) \ 84 { \ 85 uint32_t shift = offset&0x0f; \ 86 uint32_t old; \ 87 uint32_t hiword; \ 88 offset &= 0xfffffff0; \ 89 old = ((uint32_t) TMS34010_RDMEM_DWORD (offset )&(0xffffffff>>(0x20-shift))); \ 90 hiword = ((uint32_t) TMS34010_RDMEM_DWORD (offset+0x20)&(0xffffffff<<shift)); \ 91 TMS34010_WRMEM_DWORD(offset ,(data<< shift) |old); \ 92 TMS34010_WRMEM_DWORD(offset+0x20,(data>>(0x20-shift))|hiword); \ 93 } \ 94 else \ 95 TMS34010_WRMEM_DWORD(offset,data); 96 97 98 /*************************************************************************** 99 FIELD READ MACROS 100 ***************************************************************************/ 101 102 #define RFIELDMAC(MASK,MAX) \ 103 uint32_t shift = offset & 0x0f; \ 104 offset = offset & 0xfffffff0; \ 105 \ 106 if (shift >= MAX) \ 107 ret = (TMS34010_RDMEM_DWORD(offset) >> shift) & (MASK); \ 108 else \ 109 ret = (TMS34010_RDMEM_WORD(offset) >> shift) & (MASK); 110 111 #define RFIELDMAC_BIG(MASK,MAX) \ 112 uint32_t shift = offset & 0x0f; \ 113 offset = offset & 0xfffffff0; \ 114 \ 115 ret = (uint32_t)TMS34010_RDMEM_DWORD(offset) >> shift; \ 116 if (shift >= MAX) \ 117 ret |= (TMS34010_RDMEM_WORD(offset + 0x20) << (32 - shift)); \ 118 ret &= MASK; 119 120 #define RFIELDMAC_32() \ 121 if (offset&0x0f) \ 122 { \ 123 uint32_t shift = offset&0x0f; \ 124 offset &= 0xfffffff0; \ 125 return (((uint32_t)TMS34010_RDMEM_DWORD (offset )>> shift) | \ 126 (TMS34010_RDMEM_DWORD (offset+0x20)<<(0x20-shift))); \ 127 } \ 128 else \ 129 return TMS34010_RDMEM_DWORD(offset); 130 131 132 #endif // MAME_CPU_TMS34010_34010OPS_H 133