trunk/src/mame/drivers/ghosteo.c
| r20533 | r20534 | |
| 49 | 49 | - Compiler : ADS, SDT |
| 50 | 50 | |
| 51 | 51 | |
| 52 | ToDo: hook up QS1000 |
| 53 | |
| 54 | |
| 52 | 55 | */ |
| 53 | 56 | |
| 54 | 57 | #include "emu.h" |
| r20533 | r20534 | |
| 80 | 83 | public: |
| 81 | 84 | ghosteo_state(const machine_config &mconfig, device_type type, const char *tag) |
| 82 | 85 | : driver_device(mconfig, type, tag) , |
| 83 | | m_system_memory(*this, "systememory"){ } |
| 86 | m_system_memory(*this, "systememory"), |
| 87 | m_i2cmem(*this, "i2cmem") |
| 88 | { } |
| 84 | 89 | |
| 85 | 90 | required_shared_ptr<UINT32> m_system_memory; |
| 91 | required_device<i2cmem_device> m_i2cmem; |
| 92 | |
| 86 | 93 | int m_security_count; |
| 87 | 94 | UINT32 m_bballoon_port[20]; |
| 88 | 95 | struct nand_t m_nand; |
| r20533 | r20534 | |
| 91 | 98 | DECLARE_READ32_MEMBER(touryuu_port_10000000_r); |
| 92 | 99 | |
| 93 | 100 | int m_rom_pagesize; |
| 101 | UINT8* m_flash; |
| 102 | device_t* m_s3c2410; |
| 94 | 103 | DECLARE_DRIVER_INIT(touryuu); |
| 95 | 104 | DECLARE_DRIVER_INIT(bballoon); |
| 105 | virtual void machine_start(); |
| 96 | 106 | virtual void machine_reset(); |
| 97 | 107 | }; |
| 98 | 108 | |
| 109 | |
| 99 | 110 | |
| 100 | 111 | |
| 101 | 112 | /* |
| r20533 | r20534 | |
| 282 | 293 | break; |
| 283 | 294 | case NAND_M_READ : |
| 284 | 295 | { |
| 285 | | UINT8 *flash = (UINT8 *)space.machine().root_device().memregion( "user1")->base(); |
| 286 | 296 | if (nand.byte_addr < state->m_rom_pagesize) |
| 287 | 297 | { |
| 288 | | data = *(flash + nand.page_addr * state->m_rom_pagesize + nand.byte_addr); |
| 298 | data = *(state->m_flash + nand.page_addr * state->m_rom_pagesize + nand.byte_addr); |
| 289 | 299 | } |
| 290 | 300 | else |
| 291 | 301 | { |
| 292 | 302 | if ((nand.byte_addr >= 0x200) && (nand.byte_addr < 0x204)) |
| 293 | 303 | { |
| 294 | 304 | UINT8 mecc[4]; |
| 295 | | s3c2410_nand_calculate_mecc( flash + nand.page_addr * 0x200, 0x200, mecc); |
| 305 | s3c2410_nand_calculate_mecc( state->m_flash + nand.page_addr * 0x200, 0x200, mecc); |
| 296 | 306 | data = mecc[nand.byte_addr-0x200]; |
| 297 | 307 | } |
| 298 | 308 | else |
| r20533 | r20534 | |
| 328 | 338 | |
| 329 | 339 | static WRITE_LINE_DEVICE_HANDLER( s3c2410_i2c_scl_w ) |
| 330 | 340 | { |
| 331 | | device_t *i2cmem = device->machine().device( "i2cmem"); |
| 341 | ghosteo_state *sta = device->machine().driver_data<ghosteo_state>(); |
| 332 | 342 | // logerror( "s3c2410_i2c_scl_w %d\n", state ? 1 : 0); |
| 333 | | i2cmem_scl_write( i2cmem, state); |
| 343 | i2cmem_scl_write( sta->m_i2cmem, state); |
| 334 | 344 | } |
| 335 | 345 | |
| 336 | 346 | static READ_LINE_DEVICE_HANDLER( s3c2410_i2c_sda_r ) |
| 337 | 347 | { |
| 338 | | device_t *i2cmem = device->machine().device( "i2cmem"); |
| 348 | ghosteo_state *sta = device->machine().driver_data<ghosteo_state>(); |
| 339 | 349 | int state; |
| 340 | | state = i2cmem_sda_read( i2cmem); |
| 350 | state = i2cmem_sda_read( sta->m_i2cmem ); |
| 341 | 351 | // logerror( "s3c2410_i2c_sda_r %d\n", state ? 1 : 0); |
| 342 | 352 | return state; |
| 343 | 353 | } |
| 344 | 354 | |
| 345 | 355 | static WRITE_LINE_DEVICE_HANDLER( s3c2410_i2c_sda_w ) |
| 346 | 356 | { |
| 347 | | device_t *i2cmem = device->machine().device( "i2cmem"); |
| 357 | ghosteo_state *sta = device->machine().driver_data<ghosteo_state>(); |
| 348 | 358 | // logerror( "s3c2410_i2c_sda_w %d\n", state ? 1 : 0); |
| 349 | | i2cmem_sda_write( i2cmem, state); |
| 359 | i2cmem_sda_write( sta->m_i2cmem, state); |
| 350 | 360 | } |
| 351 | 361 | |
| 352 | 362 | WRITE32_MEMBER(ghosteo_state::sound_w) |
| r20533 | r20534 | |
| 553 | 563 | I2CMEM_SLAVE_ADDRESS, 0, 1024 |
| 554 | 564 | }; |
| 555 | 565 | |
| 556 | | device_t* s3c2410; |
| 557 | 566 | |
| 567 | |
| 558 | 568 | READ32_MEMBER(ghosteo_state::bballoon_speedup_r) |
| 559 | 569 | { |
| 560 | | UINT32 ret = s3c2410_lcd_r(s3c2410, space, offset+0x10/4, mem_mask); |
| 570 | UINT32 ret = s3c2410_lcd_r(m_s3c2410, space, offset+0x10/4, mem_mask); |
| 561 | 571 | |
| 562 | 572 | |
| 563 | 573 | int pc = space.device().safe_pc(); |
| r20533 | r20534 | |
| 579 | 589 | return ret; |
| 580 | 590 | } |
| 581 | 591 | |
| 592 | void ghosteo_state::machine_start() |
| 593 | { |
| 594 | m_flash = (UINT8 *)machine().root_device().memregion( "user1")->base(); |
| 595 | } |
| 596 | |
| 582 | 597 | void ghosteo_state::machine_reset() |
| 583 | 598 | { |
| 584 | 599 | machine().device("maincpu")->memory().space(AS_PROGRAM).install_read_handler(0x4d000010, 0x4d000013,read32_delegate(FUNC(ghosteo_state::bballoon_speedup_r), this)); |
| 585 | | s3c2410 = machine().device("s3c2410"); |
| 600 | m_s3c2410 = machine().device("s3c2410"); |
| 586 | 601 | } |
| 587 | 602 | |
| 588 | 603 | static MACHINE_CONFIG_START( ghosteo, ghosteo_state ) |
trunk/src/emu/machine/s3c24xx.c
| r20533 | r20534 | |
| 127 | 127 | |
| 128 | 128 | static void s3c24xx_reset( device_t *device) |
| 129 | 129 | { |
| 130 | | device_t *cpu = device->machine().device("maincpu"); |
| 130 | s3c24xx_t *s3c24xx = get_token( device ); |
| 131 | 131 | verboselog( device->machine(), 1, "reset\n"); |
| 132 | | cpu->reset(); |
| 132 | s3c24xx->m_cpu->reset(); |
| 133 | 133 | device->reset(); |
| 134 | 134 | } |
| 135 | 135 | |
| r20533 | r20534 | |
| 301 | 301 | static UINT32 s3c24xx_lcd_dma_read( device_t *device) |
| 302 | 302 | { |
| 303 | 303 | s3c24xx_t *s3c24xx = get_token( device); |
| 304 | | address_space& space = device->machine().device( "maincpu")->memory().space( AS_PROGRAM); |
| 304 | address_space& space = m_cpu->memory().space( AS_PROGRAM); |
| 305 | 305 | UINT8 *vram, data[4]; |
| 306 | 306 | vram = (UINT8 *)space.get_read_ptr( s3c24xx->lcd.vramaddr_cur); |
| 307 | 307 | for (int i = 0; i < 2; i++) |
| r20533 | r20534 | |
| 345 | 345 | static UINT32 s3c24xx_lcd_dma_read( device_t *device) |
| 346 | 346 | { |
| 347 | 347 | s3c24xx_t *s3c24xx = get_token( device); |
| 348 | | address_space& space = device->machine().device( "maincpu")->memory().space( AS_PROGRAM); |
| 348 | address_space& space = s3c24xx->m_cpu->memory().space( AS_PROGRAM); |
| 349 | 349 | UINT8 *vram, data[4]; |
| 350 | 350 | vram = (UINT8 *)space.get_read_ptr( s3c24xx->lcd.vramaddr_cur); |
| 351 | 351 | for (int i = 0; i < 2; i++) |
| r20533 | r20534 | |
| 1138 | 1138 | case S3C24XX_MPLLCON : |
| 1139 | 1139 | { |
| 1140 | 1140 | verboselog( device->machine(), 5, "CLKPOW - fclk %d hclk %d pclk %d\n", s3c24xx_get_fclk( device), s3c24xx_get_hclk( device), s3c24xx_get_pclk( device)); |
| 1141 | | device->machine().device( "maincpu")->set_unscaled_clock(s3c24xx_get_fclk( device) * CLOCK_MULTIPLIER); |
| 1141 | s3c24xx->m_cpu->set_unscaled_clock(s3c24xx_get_fclk( device) * CLOCK_MULTIPLIER); |
| 1142 | 1142 | } |
| 1143 | 1143 | break; |
| 1144 | 1144 | case S3C24XX_CLKSLOW : |
| 1145 | 1145 | { |
| 1146 | 1146 | verboselog( device->machine(), 5, "CLKPOW - fclk %d hclk %d pclk %d\n", s3c24xx_get_fclk( device), s3c24xx_get_hclk( device), s3c24xx_get_pclk( device)); |
| 1147 | | device->machine().device( "maincpu")->set_unscaled_clock(s3c24xx_get_fclk( device) * CLOCK_MULTIPLIER); |
| 1147 | s3c24xx->m_cpu->set_unscaled_clock(s3c24xx_get_fclk( device) * CLOCK_MULTIPLIER); |
| 1148 | 1148 | } |
| 1149 | 1149 | break; |
| 1150 | 1150 | } |
| r20533 | r20534 | |
| 1191 | 1191 | if (s3c24xx->irq.line_irq != ASSERT_LINE) |
| 1192 | 1192 | { |
| 1193 | 1193 | verboselog( device->machine(), 5, "ARM7_IRQ_LINE -> ASSERT_LINE\n"); |
| 1194 | | device->machine().device("maincpu")->execute().set_input_line(ARM7_IRQ_LINE, ASSERT_LINE); |
| 1194 | s3c24xx->m_cpu->execute().set_input_line(ARM7_IRQ_LINE, ASSERT_LINE); |
| 1195 | 1195 | s3c24xx->irq.line_irq = ASSERT_LINE; |
| 1196 | 1196 | } |
| 1197 | 1197 | } |
| r20533 | r20534 | |
| 1201 | 1201 | { |
| 1202 | 1202 | verboselog( device->machine(), 5, "srcpnd %08X intmsk %08X intmod %08X\n", s3c24xx->irq.regs.srcpnd, s3c24xx->irq.regs.intmsk, s3c24xx->irq.regs.intmod); |
| 1203 | 1203 | verboselog( device->machine(), 5, "ARM7_IRQ_LINE -> CLEAR_LINE\n"); |
| 1204 | | device->machine().device("maincpu")->execute().set_input_line(ARM7_IRQ_LINE, CLEAR_LINE); |
| 1204 | s3c24xx->m_cpu->execute().set_input_line(ARM7_IRQ_LINE, CLEAR_LINE); |
| 1205 | 1205 | s3c24xx->irq.line_irq = CLEAR_LINE; |
| 1206 | 1206 | } |
| 1207 | 1207 | } |
| r20533 | r20534 | |
| 1220 | 1220 | if (s3c24xx->irq.line_fiq != ASSERT_LINE) |
| 1221 | 1221 | { |
| 1222 | 1222 | verboselog( device->machine(), 5, "ARM7_FIRQ_LINE -> ASSERT_LINE\n"); |
| 1223 | | device->machine().device("maincpu")->execute().set_input_line(ARM7_FIRQ_LINE, ASSERT_LINE); |
| 1223 | s3c24xx->m_cpu->execute().set_input_line(ARM7_FIRQ_LINE, ASSERT_LINE); |
| 1224 | 1224 | s3c24xx->irq.line_fiq = ASSERT_LINE; |
| 1225 | 1225 | } |
| 1226 | 1226 | } |
| r20533 | r20534 | |
| 1229 | 1229 | if (s3c24xx->irq.line_fiq != CLEAR_LINE) |
| 1230 | 1230 | { |
| 1231 | 1231 | verboselog( device->machine(), 5, "ARM7_FIRQ_LINE -> CLEAR_LINE\n"); |
| 1232 | | device->machine().device("maincpu")->execute().set_input_line(ARM7_FIRQ_LINE, CLEAR_LINE); |
| 1232 | s3c24xx->m_cpu->execute().set_input_line(ARM7_FIRQ_LINE, CLEAR_LINE); |
| 1233 | 1233 | s3c24xx->irq.line_fiq = CLEAR_LINE; |
| 1234 | 1234 | } |
| 1235 | 1235 | } |
| r20533 | r20534 | |
| 1611 | 1611 | s3c24xx_t *s3c24xx = get_token( device); |
| 1612 | 1612 | s3c24xx_dma_regs_t *regs = &s3c24xx->dma[ch].regs; |
| 1613 | 1613 | UINT32 curr_tc, curr_src, curr_dst; |
| 1614 | | address_space &space = device->machine().device( "maincpu")->memory().space( AS_PROGRAM); |
| 1614 | address_space &space = s3c24xx->m_cpu->memory().space( AS_PROGRAM); |
| 1615 | 1615 | int dsz, inc_src, inc_dst, servmode, tsz; |
| 1616 | 1616 | const UINT32 ch_int[] = { S3C24XX_INT_DMA0, S3C24XX_INT_DMA1, S3C24XX_INT_DMA2, S3C24XX_INT_DMA3}; |
| 1617 | 1617 | verboselog( device->machine(), 5, "DMA %d trigger\n", ch); |
| r20533 | r20534 | |
| 3679 | 3679 | static DEVICE_START( s3c24xx ) |
| 3680 | 3680 | { |
| 3681 | 3681 | s3c24xx_t *s3c24xx = get_token( device); |
| 3682 | |
| 3683 | s3c24xx->m_cpu = device->machine().device( "maincpu"); |
| 3684 | |
| 3682 | 3685 | verboselog( device->machine(), 1, "s3c24xx device start\n"); |
| 3683 | 3686 | s3c24xx->iface = (const s3c24xx_interface *)device->static_config(); |
| 3684 | 3687 | for (int i = 0; i < 5; i++) |
| r20533 | r20534 | |
| 3700 | 3703 | int om1 = iface_core_pin_r( device, S3C24XX_CORE_PIN_OM1); |
| 3701 | 3704 | if ((om0 == 0) && (om1 == 0)) |
| 3702 | 3705 | { |
| 3703 | | address_space &space = device->machine().device( "maincpu")->memory().space( AS_PROGRAM); |
| 3706 | address_space &space = s3c24xx->m_cpu->memory().space( AS_PROGRAM); |
| 3704 | 3707 | space.install_ram( 0x00000000, 0x00000fff, s3c24xx->steppingstone); |
| 3705 | 3708 | space.install_ram( 0x40000000, 0x40000fff, s3c24xx->steppingstone); |
| 3706 | 3709 | } |