src/emu/cpu/arm7/arm7core.c
| r8634 | r8635 | |
| 135 | 135 | } |
| 136 | 136 | |
| 137 | 137 | addr &= ~3; |
| 138 | | memory_write_dword_32le(cpustate->program, addr, data); |
| 138 | if ( cpustate->endian == ENDIANNESS_BIG ) |
| 139 | memory_write_dword_32be(cpustate->program, addr, data); |
| 140 | else |
| 141 | memory_write_dword_32le(cpustate->program, addr, data); |
| 139 | 142 | } |
| 140 | 143 | |
| 141 | 144 | |
| r8634 | r8635 | |
| 147 | 150 | } |
| 148 | 151 | |
| 149 | 152 | addr &= ~1; |
| 150 | | memory_write_word_32le(cpustate->program, addr, data); |
| 153 | if ( cpustate->endian == ENDIANNESS_BIG ) |
| 154 | memory_write_word_32be(cpustate->program, addr, data); |
| 155 | else |
| 156 | memory_write_word_32le(cpustate->program, addr, data); |
| 151 | 157 | } |
| 152 | 158 | |
| 153 | 159 | INLINE void arm7_cpu_write8(arm_state *cpustate, UINT32 addr, UINT8 data) |
| r8634 | r8635 | |
| 157 | 163 | addr = arm7_tlb_translate( cpustate, addr ); |
| 158 | 164 | } |
| 159 | 165 | |
| 160 | | memory_write_byte_32le(cpustate->program, addr, data); |
| 166 | if ( cpustate->endian == ENDIANNESS_BIG ) |
| 167 | memory_write_byte_32be(cpustate->program, addr, data); |
| 168 | else |
| 169 | memory_write_byte_32le(cpustate->program, addr, data); |
| 161 | 170 | } |
| 162 | 171 | |
| 163 | 172 | INLINE UINT32 arm7_cpu_read32(arm_state *cpustate, offs_t addr) |
| r8634 | r8635 | |
| 171 | 180 | |
| 172 | 181 | if (addr & 3) |
| 173 | 182 | { |
| 174 | | result = memory_read_dword_32le(cpustate->program, addr & ~3); |
| 183 | if ( cpustate->endian == ENDIANNESS_BIG ) |
| 184 | result = memory_read_dword_32be(cpustate->program, addr & ~3); |
| 185 | else |
| 186 | result = memory_read_dword_32le(cpustate->program, addr & ~3); |
| 175 | 187 | result = (result >> (8 * (addr & 3))) | (result << (32 - (8 * (addr & 3)))); |
| 176 | 188 | } |
| 177 | 189 | else |
| 178 | 190 | { |
| 179 | | result = memory_read_dword_32le(cpustate->program, addr); |
| 191 | if ( cpustate->endian == ENDIANNESS_BIG ) |
| 192 | result = memory_read_dword_32be(cpustate->program, addr); |
| 193 | else |
| 194 | result = memory_read_dword_32le(cpustate->program, addr); |
| 180 | 195 | } |
| 181 | 196 | |
| 182 | 197 | return result; |
| r8634 | r8635 | |
| 191 | 206 | addr = arm7_tlb_translate( cpustate, addr ); |
| 192 | 207 | } |
| 193 | 208 | |
| 194 | | result = memory_read_word_32le(cpustate->program, addr & ~1); |
| 209 | if ( cpustate->endian == ENDIANNESS_BIG ) |
| 210 | result = memory_read_word_32be(cpustate->program, addr & ~1); |
| 211 | else |
| 212 | result = memory_read_word_32le(cpustate->program, addr & ~1); |
| 195 | 213 | |
| 196 | 214 | if (addr & 1) |
| 197 | 215 | { |
| r8634 | r8635 | |
| 209 | 227 | } |
| 210 | 228 | |
| 211 | 229 | // Handle through normal 8 bit handler (for 32 bit cpu) |
| 212 | | return memory_read_byte_32le(cpustate->program, addr); |
| 230 | if ( cpustate->endian == ENDIANNESS_BIG ) |
| 231 | return memory_read_byte_32be(cpustate->program, addr); |
| 232 | else |
| 233 | return memory_read_byte_32le(cpustate->program, addr); |
| 213 | 234 | } |
| 214 | 235 | |
| 215 | 236 | /*************** |
| r8634 | r8635 | |
| 553 | 574 | cpustate->irq_callback = save_irqcallback; |
| 554 | 575 | cpustate->device = device; |
| 555 | 576 | cpustate->program = device->space(AS_PROGRAM); |
| 577 | cpustate->endian = ENDIANNESS_LITTLE; |
| 556 | 578 | |
| 557 | 579 | /* start up in SVC mode with interrupts disabled. */ |
| 558 | 580 | SwitchMode(cpustate, eARM7_MODE_SVC); |
src/emu/cpu/arm7/arm7.c
| r8634 | r8635 | |
| 71 | 71 | INLINE arm_state *get_safe_token(running_device *device) |
| 72 | 72 | { |
| 73 | 73 | assert(device != NULL); |
| 74 | | assert(device->type() == ARM7 || device->type() == ARM9 || device->type() == PXA255); |
| 74 | assert(device->type() == ARM7 || device->type() == ARM7_BE || device->type() == ARM9 || device->type() == PXA255); |
| 75 | 75 | return (arm_state *)downcast<legacy_cpu_device *>(device)->token(); |
| 76 | 76 | } |
| 77 | 77 | |
| r8634 | r8635 | |
| 236 | 236 | cpustate->archFlags = eARM_ARCHFLAGS_T; // has Thumb |
| 237 | 237 | } |
| 238 | 238 | |
| 239 | static CPU_RESET( arm7_be ) |
| 240 | { |
| 241 | arm_state *cpustate = get_safe_token(device); |
| 242 | |
| 243 | CPU_RESET_CALL( arm7 ); |
| 244 | cpustate->endian = ENDIANNESS_BIG; |
| 245 | } |
| 246 | |
| 239 | 247 | static CPU_RESET( arm9 ) |
| 240 | 248 | { |
| 241 | 249 | arm_state *cpustate = get_safe_token(device); |
| r8634 | r8635 | |
| 300 | 308 | return CPU_DISASSEMBLE_CALL(arm7arm); |
| 301 | 309 | } |
| 302 | 310 | |
| 311 | static CPU_DISASSEMBLE( arm7_be ) |
| 312 | { |
| 313 | CPU_DISASSEMBLE( arm7arm_be ); |
| 314 | CPU_DISASSEMBLE( arm7thumb_be ); |
| 303 | 315 | |
| 316 | arm_state *cpustate = get_safe_token(device); |
| 317 | |
| 318 | if (T_IS_SET(GET_CPSR)) |
| 319 | return CPU_DISASSEMBLE_CALL(arm7thumb_be); |
| 320 | else |
| 321 | return CPU_DISASSEMBLE_CALL(arm7arm_be); |
| 322 | } |
| 323 | |
| 324 | |
| 304 | 325 | /************************************************************************** |
| 305 | 326 | * Generic set_info |
| 306 | 327 | **************************************************************************/ |
| r8634 | r8635 | |
| 553 | 574 | } |
| 554 | 575 | } |
| 555 | 576 | |
| 577 | |
| 578 | CPU_GET_INFO( arm7_be ) |
| 579 | { |
| 580 | switch (state) |
| 581 | { |
| 582 | case DEVINFO_INT_ENDIANNESS: info->i = ENDIANNESS_BIG; break; |
| 583 | case CPUINFO_FCT_RESET: info->reset = CPU_RESET_NAME(arm7_be); break; |
| 584 | case CPUINFO_FCT_DISASSEMBLE: info->disassemble = CPU_DISASSEMBLE_NAME(arm7_be); break; |
| 585 | case DEVINFO_STR_NAME: strcpy(info->s, "ARM7 (big endian)"); break; |
| 586 | default: CPU_GET_INFO_CALL(arm7); |
| 587 | } |
| 588 | } |
| 589 | |
| 556 | 590 | CPU_GET_INFO( arm9 ) |
| 557 | 591 | { |
| 558 | 592 | switch (state) |
| r8634 | r8635 | |
| 837 | 871 | } |
| 838 | 872 | |
| 839 | 873 | DEFINE_LEGACY_CPU_DEVICE(ARM7, arm7); |
| 874 | DEFINE_LEGACY_CPU_DEVICE(ARM7_BE, arm7_be); |
| 840 | 875 | DEFINE_LEGACY_CPU_DEVICE(ARM9, arm9); |
| 841 | 876 | DEFINE_LEGACY_CPU_DEVICE(PXA255, pxa255); |
| 842 | 877 | DEFINE_LEGACY_CPU_DEVICE(SA1110, sa1110); |
src/mess/machine/3do.c
| r8634 | r8635 | |
| 24 | 24 | - do remaining diagnostics |
| 25 | 25 | - set up vdl for 3do logo screen (at 003b0000) |
| 26 | 26 | - set up frame buffer 3do logo screen (at 003c000, 0000166c) |
| 27 | | 16bc (done) |
| 27 | 00000064 (done) |
| 28 | 28 | - transfer sherry from rom to 10000 |
| 29 | 29 | - transfer operator from rom to 20000 |
| 30 | 30 | - transfer dipir from rom to 200 |
| r8634 | r8635 | |
| 38 | 38 | - init registers for entry to sherry |
| 39 | 39 | - jump to sherry (00010000) |
| 40 | 40 | |
| 41 | 00010000 |
| 42 | 0001cbbc - ldr offset issue |
| 43 | 0001cbcc |
| 44 | |
| 45 | at address 00013914 is value 000031ED which gets read as 0031ED00. This breaks the executing code. |
| 46 | this data comes from 00010100 stored by the loop at 1cba4 (read from 00010100, store to 00013917) |
| 47 | this data comes from 0300d4f8 stored to 00010100 (done by loop at 000000a8) |
| 48 | |
| 41 | 49 | */ |
| 42 | 50 | |
| 43 | 51 | #include "emu.h" |
| r8634 | r8635 | |
| 157 | 165 | /* DMA */ |
| 158 | 166 | UINT32 dmareqdis; /* 03400308 */ |
| 159 | 167 | /* Expansion bus */ |
| 160 | | UINT32 type0_4; /* 03400400 */ |
| 168 | UINT32 setexpctl; /* 03400400 */ |
| 169 | UINT32 clrexpctl; /* 03400404 */ |
| 170 | UINT32 type0_4; /* 03400408 */ |
| 161 | 171 | UINT32 dipir1; /* 03400410 */ |
| 162 | 172 | UINT32 dipir2; /* 03400414 */ |
| 173 | /* Bus signals */ |
| 174 | UINT32 sel[16]; /* 03400500 - 0340053f */ |
| 175 | UINT32 poll[16]; /* 03400540 - 0340057f */ |
| 176 | UINT32 cmdstat[16]; /* 03400580 - 034005bf */ |
| 177 | UINT32 data[16]; /* 034005c0 - 034005ff */ |
| 163 | 178 | /* DSPP */ |
| 164 | 179 | UINT32 semaphore; /* 034017d0 */ |
| 165 | 180 | UINT32 semaack; /* 034017d4 */ |
| r8634 | r8635 | |
| 279 | 294 | { |
| 280 | 295 | _3do_state *state = (_3do_state *)space->machine->driver_data; |
| 281 | 296 | UINT32 addr = ( offset & ( 0x07fc / 4 ) ) << 9; |
| 282 | | UINT32 *p = state->vram + ( addr & 0x1fffff ); |
| 297 | UINT32 *p = state->vram + addr; |
| 283 | 298 | |
| 284 | 299 | logerror( "%08X: SVF read offset = %08X\n", cpu_get_pc(space->machine->device("maincpu")), offset*4 ); |
| 285 | 300 | |
| r8634 | r8635 | |
| 305 | 320 | { |
| 306 | 321 | _3do_state *state = (_3do_state *)space->machine->driver_data; |
| 307 | 322 | UINT32 addr = ( offset & ( 0x07fc / 4 ) ) << 9; |
| 308 | | UINT32 *p = state->vram + ( addr & 0x1fffff ); |
| 323 | UINT32 *p = state->vram + addr; |
| 309 | 324 | |
| 310 | 325 | logerror( "%08X: SVF write offset = %08X, data = %08X, mask = %08X\n", cpu_get_pc(space->machine->device("maincpu")), offset*4, data, mem_mask ); |
| 311 | 326 | |
| r8634 | r8635 | |
| 343 | 358 | |
| 344 | 359 | |
| 345 | 360 | READ32_HANDLER( _3do_madam_r ) { |
| 346 | | //logerror( "%08X: MADAM read offset = %08X\n", cpu_get_pc(space->machine->device("maincpu")), offset*4 ); |
| 361 | logerror( "%08X: MADAM read offset = %08X\n", cpu_get_pc(space->machine->device("maincpu")), offset*4 ); |
| 347 | 362 | |
| 348 | 363 | switch( offset ) { |
| 349 | 364 | case 0x0000/4: /* 03300000 - Revision */ |
| r8634 | r8635 | |
| 502 | 517 | |
| 503 | 518 | |
| 504 | 519 | WRITE32_HANDLER( _3do_madam_w ) { |
| 505 | | //logerror( "%08X: MADAM write offset = %08X, data = %08X, mask = %08X\n", cpu_get_pc(space->machine->device("maincpu")), offset*4, data, mem_mask ); |
| 520 | logerror( "%08X: MADAM write offset = %08X, data = %08X, mask = %08X\n", cpu_get_pc(space->machine->device("maincpu")), offset*4, data, mem_mask ); |
| 506 | 521 | |
| 507 | 522 | switch( offset ) { |
| 508 | 523 | case 0x0000/4: |
| r8634 | r8635 | |
| 689 | 704 | |
| 690 | 705 | READ32_HANDLER( _3do_clio_r ) |
| 691 | 706 | { |
| 692 | | //logerror( "%08X: CLIO read offset = %08X\n", cpu_get_pc(space->machine->device("maincpu")), offset * 4 ); |
| 707 | logerror( "%08X: CLIO read offset = %08X\n", cpu_get_pc(space->machine->device("maincpu")), offset * 4 ); |
| 693 | 708 | |
| 694 | 709 | switch( offset ) |
| 695 | 710 | { |
| r8634 | r8635 | |
| 733 | 748 | case 0x0220/4: |
| 734 | 749 | return clio.slack; |
| 735 | 750 | |
| 751 | case 0x0400/4: |
| 752 | return clio.setexpctl | 0x80; /* bit 7 - ARM has bus control */ |
| 736 | 753 | case 0x0410/4: |
| 737 | 754 | return clio.dipir1; |
| 738 | 755 | case 0x0414/4: |
| 739 | 756 | return clio.dipir2; |
| 740 | 757 | |
| 758 | case 0x0500/4: case 0x0504/4: case 0x0508/4: case 0x050c/4: |
| 759 | case 0x0510/4: case 0x0514/4: case 0x0518/4: case 0x051c/4: |
| 760 | case 0x0520/4: case 0x0524/4: case 0x0528/4: case 0x052c/4: |
| 761 | case 0x0530/4: case 0x0534/4: case 0x0538/4: case 0x053c/4: |
| 762 | return clio.sel[offset & 0x1f]; |
| 763 | |
| 764 | case 0x0540/4: case 0x0544/4: case 0x0548/4: case 0x054c/4: |
| 765 | case 0x0550/4: case 0x0554/4: case 0x0558/4: case 0x055c/4: |
| 766 | case 0x0560/4: case 0x0564/4: case 0x0568/4: case 0x056c/4: |
| 767 | case 0x0570/4: case 0x0574/4: case 0x0578/4: case 0x057c/4: |
| 768 | return clio.poll[offset & 0x1f]; |
| 769 | |
| 741 | 770 | case 0xc000/4: |
| 742 | 771 | return clio.unclerev; |
| 743 | 772 | case 0xc004/4: |
| r8634 | r8635 | |
| 756 | 785 | |
| 757 | 786 | WRITE32_HANDLER( _3do_clio_w ) |
| 758 | 787 | { |
| 759 | | //logerror( "%08X: CLIO write offset = %08X, data = %08X, mask = %08X\n", cpu_get_pc(space->machine->device("maincpu")), offset*4, data, mem_mask ); |
| 788 | logerror( "%08X: CLIO write offset = %08X, data = %08X, mask = %08X\n", cpu_get_pc(space->machine->device("maincpu")), offset*4, data, mem_mask ); |
| 760 | 789 | |
| 761 | 790 | switch( offset ) |
| 762 | 791 | { |
| r8634 | r8635 | |
| 959 | 988 | clio.type0_4 = data; |
| 960 | 989 | break; |
| 961 | 990 | |
| 991 | case 0x0500/4: case 0x0504/4: case 0x0508/4: case 0x050c/4: |
| 992 | case 0x0510/4: case 0x0514/4: case 0x0518/4: case 0x051c/4: |
| 993 | case 0x0520/4: case 0x0524/4: case 0x0528/4: case 0x052c/4: |
| 994 | case 0x0530/4: case 0x0534/4: case 0x0538/4: case 0x053c/4: |
| 995 | clio.sel[offset & 0x1f] = data; |
| 996 | /* Start WRSEL cycle */ |
| 997 | clio.poll[offset & 0x1f] = 0x10; |
| 998 | break; |
| 999 | |
| 962 | 1000 | case 0xc000/4: |
| 963 | 1001 | case 0xc004/4: |
| 964 | 1002 | case 0xc00c/4: |
src/mess/drivers/3do.c
| r8634 | r8635 | |
| 95 | 95 | #include "includes/3do.h" |
| 96 | 96 | #include "devices/chd_cd.h" |
| 97 | 97 | #include "cpu/arm/arm.h" |
| 98 | #include "cpu/arm7/arm7.h" |
| 98 | 99 | |
| 99 | 100 | |
| 100 | 101 | #define X2_CLOCK_PAL 59000000 |
| r8634 | r8635 | |
| 154 | 155 | MDRV_DRIVER_DATA( _3do_state ) |
| 155 | 156 | |
| 156 | 157 | /* Basic machine hardware */ |
| 157 | | MDRV_CPU_ADD( "maincpu", ARM_BE, XTAL_50MHz/4 ) |
| 158 | MDRV_CPU_ADD( "maincpu", ARM7_BE, XTAL_50MHz/4 ) |
| 158 | 159 | MDRV_CPU_PROGRAM_MAP( 3do_mem) |
| 159 | 160 | |
| 160 | 161 | MDRV_MACHINE_RESET( 3do ) |
| r8634 | r8635 | |
| 177 | 178 | MDRV_DRIVER_DATA( _3do_state ) |
| 178 | 179 | |
| 179 | 180 | /* Basic machine hardware */ |
| 180 | | MDRV_CPU_ADD("maincpu", ARM_BE, XTAL_50MHz/4 ) |
| 181 | MDRV_CPU_ADD("maincpu", ARM7_BE, XTAL_50MHz/4 ) |
| 181 | 182 | MDRV_CPU_PROGRAM_MAP( 3do_mem) |
| 182 | 183 | |
| 183 | 184 | MDRV_MACHINE_RESET( 3do ) |