trunk/src/emu/cpu/m37710/m37710.c
| r30578 | r30579 | |
| 990 | 990 | memset(m_m37710_regs, 0, sizeof(m_m37710_regs)); |
| 991 | 991 | |
| 992 | 992 | m_program = &space(AS_PROGRAM); |
| 993 | m_direct = &m_program->direct(); |
| 993 | 994 | m_io = &space(AS_IO); |
| 994 | 995 | |
| 995 | 996 | m_ICount = 0; |
| r30578 | r30579 | |
| 1192 | 1193 | /* ================================= MEMORY =============================== */ |
| 1193 | 1194 | /* ======================================================================== */ |
| 1194 | 1195 | |
| 1195 | | #define ADDRESS_37710(A) ((A)&0xffffff) |
| 1196 | | |
| 1197 | 1196 | UINT32 m37710_cpu_device::m37710i_read_8_normal(UINT32 address) |
| 1198 | 1197 | { |
| 1199 | | address = ADDRESS_37710(address); |
| 1200 | 1198 | return m37710_read_8(address); |
| 1201 | 1199 | } |
| 1202 | 1200 | |
| 1203 | 1201 | UINT32 m37710_cpu_device::m37710i_read_8_immediate(UINT32 address) |
| 1204 | 1202 | { |
| 1205 | | address = ADDRESS_37710(address); |
| 1206 | 1203 | return m37710_read_8_immediate(address); |
| 1207 | 1204 | } |
| 1208 | 1205 | |
| 1209 | 1206 | UINT32 m37710_cpu_device::m37710i_read_8_direct(UINT32 address) |
| 1210 | 1207 | { |
| 1211 | | address = ADDRESS_37710(address); |
| 1212 | 1208 | return m37710_read_8(address); |
| 1213 | 1209 | } |
| 1214 | 1210 | |
| 1215 | 1211 | void m37710_cpu_device::m37710i_write_8_normal(UINT32 address, UINT32 value) |
| 1216 | 1212 | { |
| 1217 | | address = ADDRESS_37710(address); |
| 1218 | | m37710_write_8(address, MAKE_UINT_8(value)); |
| 1213 | m37710_write_8(address, value); |
| 1219 | 1214 | } |
| 1220 | 1215 | |
| 1221 | 1216 | void m37710_cpu_device::m37710i_write_8_direct(UINT32 address, UINT32 value) |
| 1222 | 1217 | { |
| 1223 | | address = ADDRESS_37710(address); |
| 1224 | | m37710_write_8(address, MAKE_UINT_8(value)); |
| 1218 | m37710_write_8(address, value); |
| 1225 | 1219 | } |
| 1226 | 1220 | |
| 1227 | 1221 | UINT32 m37710_cpu_device::m37710i_read_16_normal(UINT32 address) |
| 1228 | 1222 | { |
| 1229 | | address = ADDRESS_37710(address); |
| 1230 | 1223 | if (address & 1) |
| 1231 | | return m37710i_read_8_normal(address) | m37710i_read_8_normal(address+1)<<8; |
| 1224 | return m37710_read_8(address) | m37710_read_8(address+1)<<8; |
| 1232 | 1225 | else |
| 1233 | 1226 | return m37710_read_16(address); |
| 1234 | 1227 | } |
| 1235 | 1228 | |
| 1236 | 1229 | UINT32 m37710_cpu_device::m37710i_read_16_immediate(UINT32 address) |
| 1237 | 1230 | { |
| 1238 | | address = ADDRESS_37710(address); |
| 1239 | 1231 | if (address & 1) |
| 1240 | 1232 | return m37710_read_8_immediate(address) | m37710_read_8_immediate(address+1)<<8; |
| 1241 | 1233 | else |
| 1242 | | return m37710_read_16(address); |
| 1234 | return m37710_read_16_immediate(address); |
| 1243 | 1235 | } |
| 1244 | 1236 | |
| 1245 | 1237 | UINT32 m37710_cpu_device::m37710i_read_16_direct(UINT32 address) |
| 1246 | 1238 | { |
| 1247 | | address = ADDRESS_37710(address); |
| 1248 | 1239 | if (address & 1) |
| 1249 | 1240 | return m37710_read_8(address) | m37710_read_8((address)+1)<<8; |
| 1250 | 1241 | else |
| r30578 | r30579 | |
| 1253 | 1244 | |
| 1254 | 1245 | void m37710_cpu_device::m37710i_write_16_normal(UINT32 address, UINT32 value) |
| 1255 | 1246 | { |
| 1256 | | address = ADDRESS_37710(address); |
| 1257 | 1247 | if (address & 1) |
| 1258 | 1248 | { |
| 1259 | 1249 | m37710_write_8(address, value); |
| r30578 | r30579 | |
| 1265 | 1255 | |
| 1266 | 1256 | void m37710_cpu_device::m37710i_write_16_direct(UINT32 address, UINT32 value) |
| 1267 | 1257 | { |
| 1268 | | address = ADDRESS_37710(address); |
| 1269 | 1258 | if (address & 1) |
| 1270 | 1259 | { |
| 1271 | 1260 | m37710_write_8(address, value); |
| r30578 | r30579 | |
| 1277 | 1266 | |
| 1278 | 1267 | UINT32 m37710_cpu_device::m37710i_read_24_normal(UINT32 address) |
| 1279 | 1268 | { |
| 1280 | | return m37710i_read_16_normal(address) | |
| 1281 | | (m37710i_read_8_normal(address+2)<<16); |
| 1269 | return m37710_read_16(address) | |
| 1270 | (m37710_read_8(address+2)<<16); |
| 1282 | 1271 | } |
| 1283 | 1272 | |
| 1284 | 1273 | UINT32 m37710_cpu_device::m37710i_read_24_immediate(UINT32 address) |
| 1285 | 1274 | { |
| 1286 | | return m37710i_read_16_immediate(address) | |
| 1287 | | (m37710i_read_8_immediate(address+2)<<16); |
| 1275 | return m37710_read_16_immediate(address) | |
| 1276 | (m37710_read_8_immediate(address+2)<<16); |
| 1288 | 1277 | } |
| 1289 | 1278 | |
| 1290 | 1279 | UINT32 m37710_cpu_device::m37710i_read_24_direct(UINT32 address) |
| 1291 | 1280 | { |
| 1292 | | return m37710i_read_16_direct(address) | |
| 1293 | | (m37710i_read_8_direct(address+2)<<16); |
| 1281 | return m37710_read_16(address) | |
| 1282 | (m37710_read_8(address+2)<<16); |
| 1294 | 1283 | } |
| 1295 | 1284 | |
| 1296 | 1285 | |
trunk/src/emu/cpu/m37710/m37710op.h
| r30578 | r30579 | |
| 767 | 767 | #define OP_LDM(MODE) \ |
| 768 | 768 | CLK(CLK_OP + CLK_R8 + CLK_##MODE); \ |
| 769 | 769 | REG_IM2 = EA_##MODE(); \ |
| 770 | | REG_IM = read_8_NORM(REG_PB|REG_PC); \ |
| 770 | REG_IM = read_8_IMM(REG_PB | REG_PC); \ |
| 771 | 771 | REG_PC++; \ |
| 772 | 772 | write_8_##MODE(REG_IM2, REG_IM) |
| 773 | 773 | #else |
| 774 | 774 | #define OP_LDM(MODE) \ |
| 775 | 775 | CLK(CLK_OP + CLK_R16 + CLK_##MODE); \ |
| 776 | 776 | REG_IM2 = EA_##MODE(); \ |
| 777 | | REG_IM = read_16_NORM(REG_PB|REG_PC); \ |
| 777 | REG_IM = read_16_IMM(REG_PB | REG_PC); \ |
| 778 | 778 | REG_PC+=2; \ |
| 779 | 779 | write_16_##MODE(REG_IM2, REG_IM) |
| 780 | 780 | #endif |
| r30578 | r30579 | |
| 785 | 785 | #define OP_BBS(MODE) \ |
| 786 | 786 | CLK(CLK_OP + CLK_R8 + CLK_##MODE); \ |
| 787 | 787 | REG_IM2 = read_8_NORM(EA_##MODE()); \ |
| 788 | | REG_IM = read_8_NORM(REG_PB | REG_PC); \ |
| 788 | REG_IM = read_8_IMM(REG_PB | REG_PC); \ |
| 789 | 789 | REG_PC++; \ |
| 790 | 790 | DST = OPER_8_IMM(); \ |
| 791 | 791 | if ((REG_IM2 & REG_IM) == REG_IM) \ |
| r30578 | r30579 | |
| 798 | 798 | #define OP_BBS(MODE) \ |
| 799 | 799 | CLK(CLK_OP + CLK_R16 + CLK_##MODE); \ |
| 800 | 800 | REG_IM2 = read_16_NORM(EA_##MODE()); \ |
| 801 | | REG_IM = read_16_NORM(REG_PB | REG_PC); \ |
| 801 | REG_IM = read_16_IMM(REG_PB | REG_PC); \ |
| 802 | 802 | REG_PC++; \ |
| 803 | 803 | REG_PC++; \ |
| 804 | 804 | DST = OPER_8_IMM(); \ |
| r30578 | r30579 | |
| 816 | 816 | #define OP_BBC(MODE) \ |
| 817 | 817 | CLK(CLK_OP + CLK_R8 + CLK_##MODE); \ |
| 818 | 818 | REG_IM2 = read_8_NORM(EA_##MODE()); \ |
| 819 | | REG_IM = read_8_NORM(REG_PB | REG_PC); \ |
| 819 | REG_IM = read_8_IMM(REG_PB | REG_PC); \ |
| 820 | 820 | REG_PC++; \ |
| 821 | 821 | DST = OPER_8_IMM(); \ |
| 822 | 822 | if ((REG_IM2 & REG_IM) == 0) \ |
| r30578 | r30579 | |
| 829 | 829 | #define OP_BBC(MODE) \ |
| 830 | 830 | CLK(CLK_OP + CLK_R16 + CLK_##MODE); \ |
| 831 | 831 | REG_IM2 = read_16_NORM(EA_##MODE()); \ |
| 832 | | REG_IM = read_16_NORM(REG_PB | REG_PC); \ |
| 832 | REG_IM = read_16_IMM(REG_PB | REG_PC); \ |
| 833 | 833 | REG_PC++; \ |
| 834 | 834 | REG_PC++; \ |
| 835 | 835 | DST = OPER_8_IMM(); \ |
| r30578 | r30579 | |
| 1820 | 1820 | CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \ |
| 1821 | 1821 | DST = EA_##MODE(); \ |
| 1822 | 1822 | REG_IM = read_8_##MODE(DST); \ |
| 1823 | | REG_IM2 = read_8_NORM(REG_PB | REG_PC); \ |
| 1823 | REG_IM2 = read_8_IMM(REG_PB | REG_PC); \ |
| 1824 | 1824 | REG_PC++; \ |
| 1825 | 1825 | write_8_##MODE(DST, REG_IM & ~REG_IM2); |
| 1826 | 1826 | #else |
| r30578 | r30579 | |
| 1828 | 1828 | CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \ |
| 1829 | 1829 | DST = EA_##MODE(); \ |
| 1830 | 1830 | REG_IM = read_16_##MODE(DST); \ |
| 1831 | | REG_IM2 = read_16_NORM(REG_PB | REG_PC); \ |
| 1831 | REG_IM2 = read_16_IMM(REG_PB | REG_PC); \ |
| 1832 | 1832 | REG_PC+=2; \ |
| 1833 | 1833 | write_16_##MODE(DST, REG_IM & ~REG_IM2); |
| 1834 | 1834 | #endif |
| r30578 | r30579 | |
| 1840 | 1840 | CLK(CLK_OP + CLK_RMW8 + CLK_W_##MODE); \ |
| 1841 | 1841 | DST = EA_##MODE(); \ |
| 1842 | 1842 | REG_IM = read_8_##MODE(DST); \ |
| 1843 | | REG_IM2 = read_8_NORM(REG_PB | REG_PC); \ |
| 1843 | REG_IM2 = read_8_IMM(REG_PB | REG_PC); \ |
| 1844 | 1844 | REG_PC++; \ |
| 1845 | 1845 | write_8_##MODE(DST, REG_IM | REG_IM2); |
| 1846 | 1846 | #else |
| r30578 | r30579 | |
| 1848 | 1848 | CLK(CLK_OP + CLK_RMW16 + CLK_W_##MODE); \ |
| 1849 | 1849 | DST = EA_##MODE(); \ |
| 1850 | 1850 | REG_IM = read_16_##MODE(DST); \ |
| 1851 | | REG_IM2 = read_16_NORM(REG_PB | REG_PC); \ |
| 1851 | REG_IM2 = read_16_IMM(REG_PB | REG_PC); \ |
| 1852 | 1852 | REG_PC+=2; \ |
| 1853 | 1853 | write_16_##MODE(DST, REG_IM | REG_IM2); |
| 1854 | 1854 | #endif |
trunk/src/emu/cpu/m37710/m37710cm.h
| r30578 | r30579 | |
| 24 | 24 | #define M37710_CALL_DEBUGGER(x) debugger_instruction_hook(this, x) |
| 25 | 25 | #define m37710_read_8(addr) m_program->read_byte(addr) |
| 26 | 26 | #define m37710_write_8(addr,data) m_program->write_byte(addr,data) |
| 27 | | #define m37710_read_8_immediate(A) m_program->read_byte(A) |
| 27 | #define m37710_read_8_immediate(A) m_direct->read_decrypted_byte(A, BYTE_XOR_LE(0)) |
| 28 | 28 | #define m37710_read_16(addr) m_program->read_word(addr) |
| 29 | 29 | #define m37710_write_16(addr,data) m_program->write_word(addr,data) |
| 30 | #define m37710_read_16_immediate(A) m_direct->read_decrypted_word(A) |
| 30 | 31 | #define m37710_jumping(A) |
| 31 | 32 | #define m37710_branching(A) |
| 32 | 33 | |
| r30578 | r30579 | |
| 64 | 65 | /* ================================== CPU ================================= */ |
| 65 | 66 | /* ======================================================================== */ |
| 66 | 67 | |
| 67 | | |
| 68 | | extern UINT32 m37710i_adc_tbl[]; |
| 69 | | extern UINT32 m37710i_sbc_tbl[]; |
| 70 | | |
| 71 | | |
| 72 | 68 | #define REG_A m_a /* Accumulator */ |
| 73 | 69 | #define REG_B m_b /* Accumulator hi byte */ |
| 74 | 70 | #define REG_BA m_ba /* Secondary Accumulator */ |