src/mess/machine/amigacrt.c
| r3603 | r3604 | |
| 87 | 87 | cpu_set_input_line(machine->cpu[0], 7, PULSE_LINE); |
| 88 | 88 | } |
| 89 | 89 | |
| 90 | | static void amiga_ar1_nmi( void ) |
| 90 | static void amiga_ar1_nmi( running_machine *machine ) |
| 91 | 91 | { |
| 92 | 92 | /* get the cart's built-in ram */ |
| 93 | | UINT16 *ar_ram = (UINT16 *)memory_get_write_ptr(0, ADDRESS_SPACE_PROGRAM, 0x9fc000); |
| 93 | UINT16 *ar_ram = (UINT16 *)memory_get_write_ptr(cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM), 0x9fc000); |
| 94 | 94 | |
| 95 | 95 | if ( ar_ram != NULL ) |
| 96 | 96 | { |
| r3603 | r3604 | |
| 108 | 108 | |
| 109 | 109 | static WRITE16_HANDLER( amiga_ar1_chipmem_w ) |
| 110 | 110 | { |
| 111 | | int pc = safe_activecpu_get_pc(); |
| 111 | int pc = cpu_get_pc(space->cpu); |
| 112 | 112 | |
| 113 | 113 | /* see if we're inside the AR1 rom */ |
| 114 | 114 | if ( ((pc >> 16) & 0xff ) != 0xf0 ) |
| r3603 | r3604 | |
| 128 | 128 | |
| 129 | 129 | static void amiga_ar1_check_overlay( running_machine *machine ) |
| 130 | 130 | { |
| 131 | | memory_install_write16_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x000000, 0x00007f, 0, 0, amiga_ar1_chipmem_w); |
| 131 | memory_install_write16_handler(cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM), 0x000000, 0x00007f, 0, 0, amiga_ar1_chipmem_w); |
| 132 | 132 | } |
| 133 | 133 | |
| 134 | 134 | static void amiga_ar1_init( running_machine *machine ) |
| r3603 | r3604 | |
| 147 | 147 | memset(ar_ram, 0, 0x4000); |
| 148 | 148 | |
| 149 | 149 | /* Install ROM */ |
| 150 | | memory_install_read16_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0xf00000, 0xf7ffff, 0, 0, SMH_BANK2); |
| 151 | | memory_install_write16_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0xf00000, 0xf7ffff, 0, 0, SMH_ROM); |
| 150 | memory_install_read16_handler(cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM), 0xf00000, 0xf7ffff, 0, 0, SMH_BANK2); |
| 151 | memory_install_write16_handler(cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM), 0xf00000, 0xf7ffff, 0, 0, SMH_ROM); |
| 152 | 152 | |
| 153 | 153 | /* Install RAM */ |
| 154 | | memory_install_read16_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x9fc000, 0x9fffff, 0, 0, SMH_BANK3); |
| 155 | | memory_install_write16_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x9fc000, 0x9fffff, 0, 0, SMH_BANK3); |
| 154 | memory_install_read16_handler(cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM), 0x9fc000, 0x9fffff, 0, 0, SMH_BANK3); |
| 155 | memory_install_write16_handler(cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM), 0x9fc000, 0x9fffff, 0, 0, SMH_BANK3); |
| 156 | 156 | |
| 157 | 157 | /* Configure Banks */ |
| 158 | | memory_set_bankptr(2, memory_region(machine, "user2")); |
| 159 | | memory_set_bankptr(3, ar_ram); |
| 158 | memory_set_bankptr(machine, 2, memory_region(machine, "user2")); |
| 159 | memory_set_bankptr(machine, 3, ar_ram); |
| 160 | 160 | |
| 161 | 161 | amiga_ar1_spurious = 0; |
| 162 | 162 | |
| 163 | 163 | /* Install IRQ ACK callback */ |
| 164 | | cpunum_set_irq_callback(0,amiga_ar1_irqack); |
| 164 | cpu_set_irq_callback(machine->cpu[0],amiga_ar1_irqack); |
| 165 | 165 | } |
| 166 | 166 | |
| 167 | 167 | /*************************************************************************** |
| r3603 | r3604 | |
| 189 | 189 | |
| 190 | 190 | static READ16_HANDLER( amiga_ar23_cia_r ) |
| 191 | 191 | { |
| 192 | | int pc = safe_activecpu_get_pc(); |
| 192 | int pc = cpu_get_pc(space->cpu); |
| 193 | 193 | |
| 194 | 194 | if ( ACCESSING_BITS_0_7 && offset == 2048 && pc >= 0x40 && pc < 0x120 ) |
| 195 | 195 | { |
| 196 | | amiga_ar23_freeze(machine); |
| 196 | amiga_ar23_freeze(space->machine); |
| 197 | 197 | } |
| 198 | 198 | |
| 199 | | return amiga_cia_r( machine, offset, mem_mask ); |
| 199 | return amiga_cia_r( space, offset, mem_mask ); |
| 200 | 200 | } |
| 201 | 201 | |
| 202 | 202 | static WRITE16_HANDLER( amiga_ar23_mode_w ) |
| 203 | 203 | { |
| 204 | 204 | if ( data & 2 ) |
| 205 | 205 | { |
| 206 | | memory_install_read16_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0xbfd000, 0xbfefff, 0, 0, amiga_ar23_cia_r); |
| 206 | memory_install_read16_handler(space, 0xbfd000, 0xbfefff, 0, 0, amiga_ar23_cia_r); |
| 207 | 207 | } |
| 208 | 208 | else |
| 209 | 209 | { |
| 210 | | memory_install_read16_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0xbfd000, 0xbfefff, 0, 0, amiga_cia_r); |
| 210 | memory_install_read16_handler(space, 0xbfd000, 0xbfefff, 0, 0, amiga_cia_r); |
| 211 | 211 | } |
| 212 | 212 | |
| 213 | 213 | amiga_ar23_mode = (data&0x3); |
| r3603 | r3604 | |
| 218 | 218 | |
| 219 | 219 | static READ16_HANDLER( amiga_ar23_mode_r ) |
| 220 | 220 | { |
| 221 | | UINT16 *mem = (UINT16 *)memory_region( machine, "user2" ); |
| 221 | UINT16 *mem = (UINT16 *)memory_region( space->machine, "user2" ); |
| 222 | 222 | |
| 223 | 223 | if ( ACCESSING_BITS_0_7 ) |
| 224 | 224 | { |
| r3603 | r3604 | |
| 229 | 229 | { |
| 230 | 230 | UINT32 mirror_mask = amiga_chip_ram_size; |
| 231 | 231 | |
| 232 | | memory_set_bank(machine, 1, 0); |
| 232 | memory_set_bank(space->machine, 1, 0); |
| 233 | 233 | |
| 234 | 234 | while( (mirror_mask<<1) < 0x100000 ) |
| 235 | 235 | { |
| r3603 | r3604 | |
| 237 | 237 | } |
| 238 | 238 | |
| 239 | 239 | /* overlay disabled, map RAM on 0x000000 */ |
| 240 | | memory_install_write16_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x000000, amiga_chip_ram_size - 1, 0, mirror_mask, SMH_BANK1); |
| 240 | memory_install_write16_handler(space, 0x000000, amiga_chip_ram_size - 1, 0, mirror_mask, SMH_BANK1); |
| 241 | 241 | } |
| 242 | 242 | } |
| 243 | 243 | |
| r3603 | r3604 | |
| 249 | 249 | if ( offset == (0x08/2) ) |
| 250 | 250 | { |
| 251 | 251 | if ( amiga_ar23_mode & 1 ) |
| 252 | | amiga_ar23_freeze(machine); |
| 252 | amiga_ar23_freeze(space->machine); |
| 253 | 253 | } |
| 254 | 254 | |
| 255 | 255 | amiga_chip_ram_w( offset * 2, data ); |
| r3603 | r3604 | |
| 257 | 257 | |
| 258 | 258 | static void amiga_ar23_freeze( running_machine *machine ) |
| 259 | 259 | { |
| 260 | | int pc = safe_activecpu_get_pc(); |
| 260 | int pc = cpu_get_pc(machine->cpu[0]); |
| 261 | 261 | |
| 262 | 262 | /* only freeze if we're not inside the cart's ROM */ |
| 263 | 263 | if ( ((pc >> 16) & 0xfe ) != 0x40 ) |
| 264 | 264 | { |
| 265 | 265 | /* get the cart's built-in ram */ |
| 266 | | UINT16 *ar_ram = (UINT16 *)memory_get_write_ptr(0, ADDRESS_SPACE_PROGRAM, 0x440000); |
| 266 | UINT16 *ar_ram = (UINT16 *)memory_get_write_ptr(cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM), 0x440000); |
| 267 | 267 | |
| 268 | 268 | if ( ar_ram != NULL ) |
| 269 | 269 | { |
| r3603 | r3604 | |
| 277 | 277 | memory_set_bank(machine, 1, 2); |
| 278 | 278 | |
| 279 | 279 | /* writes go to chipram */ |
| 280 | | memory_install_write16_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x000000, amiga_chip_ram_size - 1, 0, 0, amiga_ar23_chipmem_w); |
| 280 | memory_install_write16_handler(cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM), 0x000000, amiga_chip_ram_size - 1, 0, 0, amiga_ar23_chipmem_w); |
| 281 | 281 | |
| 282 | 282 | /* trigger NMI irq */ |
| 283 | 283 | cpu_set_input_line(machine->cpu[0], 7, PULSE_LINE); |
| r3603 | r3604 | |
| 293 | 293 | #if 0 |
| 294 | 294 | static WRITE16_HANDLER( amiga_ar23_custom_w ) |
| 295 | 295 | { |
| 296 | | int pc = safe_activecpu_get_pc(); |
| 296 | int pc = cpu_get_pc(space->cpu); |
| 297 | 297 | |
| 298 | 298 | /* see if we're inside the AR2 rom */ |
| 299 | 299 | if ( ((pc >> 16) & 0xfe ) != 0x40 ) |
| r3603 | r3604 | |
| 314 | 314 | { |
| 315 | 315 | UINT16 data = amiga_custom_r( offset, mem_mask ); |
| 316 | 316 | |
| 317 | | int pc = safe_activecpu_get_pc(); |
| 317 | int pc = cpu_get_pc(space->cpu); |
| 318 | 318 | |
| 319 | 319 | /* see if we're inside the AR2 rom */ |
| 320 | 320 | if ( ((pc >> 16) & 0xfe ) != 0x40 ) |
| r3603 | r3604 | |
| 335 | 335 | static void amiga_ar23_check_overlay( running_machine *machine ) |
| 336 | 336 | { |
| 337 | 337 | amiga_ar23_mode = 3; |
| 338 | | memory_install_write16_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x000000, 0x00000f, 0, 0, amiga_ar23_chipmem_w); |
| 338 | memory_install_write16_handler(cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM), 0x000000, 0x00000f, 0, 0, amiga_ar23_chipmem_w); |
| 339 | 339 | } |
| 340 | 340 | |
| 341 | 341 | static void amiga_ar23_init( running_machine *machine, int ar3 ) |
| r3603 | r3604 | |
| 362 | 362 | } |
| 363 | 363 | |
| 364 | 364 | /* Install ROM */ |
| 365 | | memory_install_read16_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400000, 0x400000+size, 0, mirror, SMH_BANK2); |
| 366 | | memory_install_write16_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400000, 0x400000+size, 0, mirror, SMH_ROM); |
| 365 | memory_install_read16_handler(cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM), 0x400000, 0x400000+size, 0, mirror, SMH_BANK2); |
| 366 | memory_install_write16_handler(cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM), 0x400000, 0x400000+size, 0, mirror, SMH_ROM); |
| 367 | 367 | |
| 368 | 368 | /* Install RAM */ |
| 369 | | memory_install_read16_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x440000, 0x44ffff, 0, 0, SMH_BANK3); |
| 370 | | memory_install_write16_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x440000, 0x44ffff, 0, 0, SMH_BANK3); |
| 369 | memory_install_read16_handler(cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM), 0x440000, 0x44ffff, 0, 0, SMH_BANK3); |
| 370 | memory_install_write16_handler(cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM), 0x440000, 0x44ffff, 0, 0, SMH_BANK3); |
| 371 | 371 | |
| 372 | 372 | /* Install Custom chip monitor */ |
| 373 | | // memory_install_read16_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0xdff000, 0xdff1ff, 0, 0, amiga_ar23_custom_r); |
| 374 | | // memory_install_write16_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0xdff000, 0xdff1ff, 0, 0, amiga_ar23_custom_w); |
| 373 | // memory_install_read16_handler(cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM), 0xdff000, 0xdff1ff, 0, 0, amiga_ar23_custom_r); |
| 374 | // memory_install_write16_handler(cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM), 0xdff000, 0xdff1ff, 0, 0, amiga_ar23_custom_w); |
| 375 | 375 | |
| 376 | 376 | /* Install status/mode handlers */ |
| 377 | | memory_install_read16_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400000, 0x400007, 0, mirror, amiga_ar23_mode_r); |
| 378 | | memory_install_write16_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x400000, 0x400003, 0, mirror, amiga_ar23_mode_w); |
| 377 | memory_install_read16_handler(cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM), 0x400000, 0x400007, 0, mirror, amiga_ar23_mode_r); |
| 378 | memory_install_write16_handler(cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM), 0x400000, 0x400003, 0, mirror, amiga_ar23_mode_w); |
| 379 | 379 | |
| 380 | 380 | /* Configure Banks */ |
| 381 | | memory_set_bankptr(2, memory_region(machine, "user2")); |
| 382 | | memory_set_bankptr(3, ar_ram); |
| 381 | memory_set_bankptr(machine, 2, memory_region(machine, "user2")); |
| 382 | memory_set_bankptr(machine, 3, ar_ram); |
| 383 | 383 | |
| 384 | 384 | memory_configure_bank(machine, 1, 0, 2, amiga_chip_ram, 0); |
| 385 | 385 | memory_configure_bank(machine, 1, 1, 2, memory_region(machine, "user1"), 0); |
| r3603 | r3604 | |
| 447 | 447 | switch( amiga_cart_type ) |
| 448 | 448 | { |
| 449 | 449 | case ACTION_REPLAY: |
| 450 | | amiga_ar1_nmi(); |
| 450 | amiga_ar1_nmi(Machine); |
| 451 | 451 | break; |
| 452 | 452 | |
| 453 | 453 | case ACTION_REPLAY_MKII: |
src/mess/machine/amigacd.c
| r3603 | r3604 | |
| 83 | 83 | return; |
| 84 | 84 | |
| 85 | 85 | /* otherwise, generate the IRQ */ |
| 86 | | amiga_custom_w(machine, REG_INTREQ, 0x8000 | INTENA_PORTS, 0xffff); |
| 86 | amiga_custom_w(cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM), REG_INTREQ, 0x8000 | INTENA_PORTS, 0xffff); |
| 87 | 87 | } |
| 88 | 88 | |
| 89 | 89 | static TIMER_CALLBACK(dmac_dma_proc) |
| r3603 | r3604 | |
| 131 | 131 | case 0x20: |
| 132 | 132 | { |
| 133 | 133 | UINT8 v = dmac_data.istr; |
| 134 | | LOG(( "DMAC: PC=%08x - ISTR Read(%04x)\n", activecpu_get_pc(), dmac_data.istr )); |
| 134 | LOG(( "DMAC: PC=%08x - ISTR Read(%04x)\n", cpu_get_pc(space->cpu), dmac_data.istr )); |
| 135 | 135 | |
| 136 | 136 | dmac_data.istr &= ~0x0f; |
| 137 | 137 | return v; |
| r3603 | r3604 | |
| 140 | 140 | |
| 141 | 141 | case 0x21: |
| 142 | 142 | { |
| 143 | | LOG(( "DMAC: PC=%08x - CNTR Read(%04x)\n", activecpu_get_pc(), dmac_data.cntr )); |
| 143 | LOG(( "DMAC: PC=%08x - CNTR Read(%04x)\n", cpu_get_pc(space->cpu), dmac_data.cntr )); |
| 144 | 144 | return dmac_data.cntr; |
| 145 | 145 | } |
| 146 | 146 | break; |
| 147 | 147 | |
| 148 | 148 | case 0x40: /* wtc hi */ |
| 149 | 149 | { |
| 150 | | LOG(( "DMAC: PC=%08x - WTC HI Read\n", activecpu_get_pc() )); |
| 150 | LOG(( "DMAC: PC=%08x - WTC HI Read\n", cpu_get_pc(space->cpu) )); |
| 151 | 151 | return (dmac_data.wtc >> 16); |
| 152 | 152 | } |
| 153 | 153 | break; |
| 154 | 154 | |
| 155 | 155 | case 0x41: /* wtc lo */ |
| 156 | 156 | { |
| 157 | | LOG(( "DMAC: PC=%08x - WTC LO Read\n", activecpu_get_pc() )); |
| 157 | LOG(( "DMAC: PC=%08x - WTC LO Read\n", cpu_get_pc(space->cpu) )); |
| 158 | 158 | return dmac_data.wtc; |
| 159 | 159 | } |
| 160 | 160 | break; |
| 161 | 161 | |
| 162 | 162 | case 0x42: /* acr hi */ |
| 163 | 163 | { |
| 164 | | LOG(( "DMAC: PC=%08x - ACR HI Read\n", activecpu_get_pc() )); |
| 164 | LOG(( "DMAC: PC=%08x - ACR HI Read\n", cpu_get_pc(space->cpu) )); |
| 165 | 165 | return (dmac_data.acr >> 16); |
| 166 | 166 | } |
| 167 | 167 | break; |
| 168 | 168 | |
| 169 | 169 | case 0x43: /* acr lo */ |
| 170 | 170 | { |
| 171 | | LOG(( "DMAC: PC=%08x - ACR LO Read\n", activecpu_get_pc() )); |
| 171 | LOG(( "DMAC: PC=%08x - ACR LO Read\n", cpu_get_pc(space->cpu) )); |
| 172 | 172 | return dmac_data.acr; |
| 173 | 173 | } |
| 174 | 174 | break; |
| r3603 | r3604 | |
| 176 | 176 | case 0x48: /* wd33c93 SCSI expansion */ |
| 177 | 177 | case 0x49: |
| 178 | 178 | { |
| 179 | | LOG(( "DMAC: PC=%08x - WD33C93 Read(%d)\n", activecpu_get_pc(), offset & 1 )); |
| 179 | LOG(( "DMAC: PC=%08x - WD33C93 Read(%d)\n", cpu_get_pc(space->cpu), offset & 1 )); |
| 180 | 180 | return 0x00; /* Not available without SCSI expansion */ |
| 181 | 181 | } |
| 182 | 182 | break; |
| 183 | 183 | |
| 184 | 184 | case 0x50: |
| 185 | 185 | { |
| 186 | | LOG(( "DMAC: PC=%08x - CDROM RESP Read\n", activecpu_get_pc() )); |
| 186 | LOG(( "DMAC: PC=%08x - CDROM RESP Read\n", cpu_get_pc(space->cpu) )); |
| 187 | 187 | return matsucd_response_r(); |
| 188 | 188 | } |
| 189 | 189 | break; |
| r3603 | r3604 | |
| 192 | 192 | case 0x52: |
| 193 | 193 | case 0x53: |
| 194 | 194 | { |
| 195 | | LOG(( "DMAC: PC=%08x - XT IO Read(%d)\n", activecpu_get_pc(), (offset & 3)-1 )); |
| 195 | LOG(( "DMAC: PC=%08x - XT IO Read(%d)\n", cpu_get_pc(space->cpu), (offset & 3)-1 )); |
| 196 | 196 | return 0xff; |
| 197 | 197 | } |
| 198 | 198 | break; |
| r3603 | r3604 | |
| 214 | 214 | case 0x66: |
| 215 | 215 | case 0x67: |
| 216 | 216 | { |
| 217 | | LOG(( "DMAC: PC=%08x - TPI6525 Read(%d)\n", activecpu_get_pc(), (offset - 0x58) )); |
| 218 | | return tpi6525_0_port_r(machine, offset - 0x58); |
| 217 | LOG(( "DMAC: PC=%08x - TPI6525 Read(%d)\n", cpu_get_pc(space->cpu), (offset - 0x58) )); |
| 218 | return tpi6525_0_port_r(space, offset - 0x58); |
| 219 | 219 | } |
| 220 | 220 | break; |
| 221 | 221 | |
| 222 | 222 | case 0x70: /* DMA start strobe */ |
| 223 | 223 | { |
| 224 | | LOG(( "DMAC: PC=%08x - DMA Start Strobe\n", activecpu_get_pc() )); |
| 224 | LOG(( "DMAC: PC=%08x - DMA Start Strobe\n", cpu_get_pc(space->cpu) )); |
| 225 | 225 | timer_adjust_oneshot(dmac_data.dma_timer, ATTOTIME_IN_MSEC( CD_SECTOR_TIME ), 0); |
| 226 | 226 | } |
| 227 | 227 | break; |
| 228 | 228 | |
| 229 | 229 | case 0x71: /* DMA stop strobe */ |
| 230 | 230 | { |
| 231 | | LOG(( "DMAC: PC=%08x - DMA Stop Strobe\n", activecpu_get_pc() )); |
| 231 | LOG(( "DMAC: PC=%08x - DMA Stop Strobe\n", cpu_get_pc(space->cpu) )); |
| 232 | 232 | timer_reset( dmac_data.dma_timer, attotime_never ); |
| 233 | 233 | } |
| 234 | 234 | break; |
| 235 | 235 | |
| 236 | 236 | case 0x72: /* Clear IRQ strobe */ |
| 237 | 237 | { |
| 238 | | LOG(( "DMAC: PC=%08x - IRQ Clear Strobe\n", activecpu_get_pc() )); |
| 238 | LOG(( "DMAC: PC=%08x - IRQ Clear Strobe\n", cpu_get_pc(space->cpu) )); |
| 239 | 239 | dmac_data.istr &= ~ISTR_INT_P; |
| 240 | 240 | } |
| 241 | 241 | break; |
| 242 | 242 | |
| 243 | 243 | case 0x74: /* Flush strobe */ |
| 244 | 244 | { |
| 245 | | LOG(( "DMAC: PC=%08x - Flush Strobe\n", activecpu_get_pc() )); |
| 245 | LOG(( "DMAC: PC=%08x - Flush Strobe\n", cpu_get_pc(space->cpu) )); |
| 246 | 246 | dmac_data.istr |= ISTR_FE_FLG; |
| 247 | 247 | } |
| 248 | 248 | break; |
| 249 | 249 | |
| 250 | 250 | default: |
| 251 | | logerror( "DMAC-READ: PC=%08x, offset = %02x\n", activecpu_get_pc(), offset ); |
| 251 | logerror( "DMAC-READ: PC=%08x, offset = %02x\n", cpu_get_pc(space->cpu), offset ); |
| 252 | 252 | break; |
| 253 | 253 | } |
| 254 | 254 | |
| r3603 | r3604 | |
| 263 | 263 | { |
| 264 | 264 | case 0x21: /* control write */ |
| 265 | 265 | { |
| 266 | | LOG(( "DMAC: PC=%08x - CNTR Write(%04x)\n", activecpu_get_pc(), data )); |
| 266 | LOG(( "DMAC: PC=%08x - CNTR Write(%04x)\n", cpu_get_pc(space->cpu), data )); |
| 267 | 267 | dmac_data.cntr = data; |
| 268 | | check_interrupts( machine ); |
| 268 | check_interrupts( space->machine ); |
| 269 | 269 | } |
| 270 | 270 | break; |
| 271 | 271 | |
| 272 | 272 | case 0x40: /* wtc hi */ |
| 273 | 273 | { |
| 274 | | LOG(( "DMAC: PC=%08x - WTC HI Write - data = %04x\n", activecpu_get_pc(), data )); |
| 274 | LOG(( "DMAC: PC=%08x - WTC HI Write - data = %04x\n", cpu_get_pc(space->cpu), data )); |
| 275 | 275 | dmac_data.wtc &= 0x0000ffff; |
| 276 | 276 | dmac_data.wtc |= ((UINT32)data) << 16; |
| 277 | 277 | } |
| r3603 | r3604 | |
| 279 | 279 | |
| 280 | 280 | case 0x41: /* wtc lo */ |
| 281 | 281 | { |
| 282 | | LOG(( "DMAC: PC=%08x - WTC LO Write - data = %04x\n", activecpu_get_pc(), data )); |
| 282 | LOG(( "DMAC: PC=%08x - WTC LO Write - data = %04x\n", cpu_get_pc(space->cpu), data )); |
| 283 | 283 | dmac_data.wtc &= 0xffff0000; |
| 284 | 284 | dmac_data.wtc |= data; |
| 285 | 285 | } |
| r3603 | r3604 | |
| 287 | 287 | |
| 288 | 288 | case 0x42: /* acr hi */ |
| 289 | 289 | { |
| 290 | | LOG(( "DMAC: PC=%08x - ACR HI Write - data = %04x\n", activecpu_get_pc(), data )); |
| 290 | LOG(( "DMAC: PC=%08x - ACR HI Write - data = %04x\n", cpu_get_pc(space->cpu), data )); |
| 291 | 291 | dmac_data.acr &= 0x0000ffff; |
| 292 | 292 | dmac_data.acr |= ((UINT32)data) << 16; |
| 293 | 293 | } |
| r3603 | r3604 | |
| 295 | 295 | |
| 296 | 296 | case 0x43: /* acr lo */ |
| 297 | 297 | { |
| 298 | | LOG(( "DMAC: PC=%08x - ACR LO Write - data = %04x\n", activecpu_get_pc(), data )); |
| 298 | LOG(( "DMAC: PC=%08x - ACR LO Write - data = %04x\n", cpu_get_pc(space->cpu), data )); |
| 299 | 299 | dmac_data.acr &= 0xffff0000; |
| 300 | 300 | dmac_data.acr |= data; |
| 301 | 301 | } |
| r3603 | r3604 | |
| 303 | 303 | |
| 304 | 304 | case 0x47: /* dawr */ |
| 305 | 305 | { |
| 306 | | LOG(( "DMAC: PC=%08x - DAWR Write - data = %04x\n", activecpu_get_pc(), data )); |
| 306 | LOG(( "DMAC: PC=%08x - DAWR Write - data = %04x\n", cpu_get_pc(space->cpu), data )); |
| 307 | 307 | dmac_data.dawr = data; |
| 308 | 308 | } |
| 309 | 309 | break; |
| r3603 | r3604 | |
| 311 | 311 | case 0x48: /* wd33c93 SCSI expansion */ |
| 312 | 312 | case 0x49: |
| 313 | 313 | { |
| 314 | | LOG(( "DMAC: PC=%08x - WD33C93 Write(%d) - data = %04x\n", activecpu_get_pc(), offset & 1, data )); |
| 314 | LOG(( "DMAC: PC=%08x - WD33C93 Write(%d) - data = %04x\n", cpu_get_pc(space->cpu), offset & 1, data )); |
| 315 | 315 | /* Not available without SCSI expansion */ |
| 316 | 316 | } |
| 317 | 317 | break; |
| 318 | 318 | |
| 319 | 319 | case 0x50: |
| 320 | 320 | { |
| 321 | | LOG(( "DMAC: PC=%08x - CDROM CMD Write - data = %04x\n", activecpu_get_pc(), data )); |
| 321 | LOG(( "DMAC: PC=%08x - CDROM CMD Write - data = %04x\n", cpu_get_pc(space->cpu), data )); |
| 322 | 322 | matsucd_command_w( data ); |
| 323 | 323 | } |
| 324 | 324 | break; |
| r3603 | r3604 | |
| 340 | 340 | case 0x66: |
| 341 | 341 | case 0x67: |
| 342 | 342 | { |
| 343 | | LOG(( "DMAC: PC=%08x - TPI6525 Write(%d) - data = %04x\n", activecpu_get_pc(), (offset - 0x58), data )); |
| 344 | | tpi6525_0_port_w(machine, offset - 0x58, data); |
| 343 | LOG(( "DMAC: PC=%08x - TPI6525 Write(%d) - data = %04x\n", cpu_get_pc(space->cpu), (offset - 0x58), data )); |
| 344 | tpi6525_0_port_w(space, offset - 0x58, data); |
| 345 | 345 | } |
| 346 | 346 | break; |
| 347 | 347 | |
| 348 | 348 | case 0x70: /* DMA start strobe */ |
| 349 | 349 | { |
| 350 | | LOG(( "DMAC: PC=%08x - DMA Start Strobe\n", activecpu_get_pc() )); |
| 350 | LOG(( "DMAC: PC=%08x - DMA Start Strobe\n", cpu_get_pc(space->cpu) )); |
| 351 | 351 | timer_adjust_oneshot(dmac_data.dma_timer, ATTOTIME_IN_MSEC( CD_SECTOR_TIME ), 0); |
| 352 | 352 | } |
| 353 | 353 | break; |
| 354 | 354 | |
| 355 | 355 | case 0x71: /* DMA stop strobe */ |
| 356 | 356 | { |
| 357 | | LOG(( "DMAC: PC=%08x - DMA Stop Strobe\n", activecpu_get_pc() )); |
| 357 | LOG(( "DMAC: PC=%08x - DMA Stop Strobe\n", cpu_get_pc(space->cpu) )); |
| 358 | 358 | timer_reset( dmac_data.dma_timer, attotime_never ); |
| 359 | 359 | } |
| 360 | 360 | break; |
| 361 | 361 | |
| 362 | 362 | case 0x72: /* Clear IRQ strobe */ |
| 363 | 363 | { |
| 364 | | LOG(( "DMAC: PC=%08x - IRQ Clear Strobe\n", activecpu_get_pc() )); |
| 364 | LOG(( "DMAC: PC=%08x - IRQ Clear Strobe\n", cpu_get_pc(space->cpu) )); |
| 365 | 365 | dmac_data.istr &= ~ISTR_INT_P; |
| 366 | 366 | } |
| 367 | 367 | break; |
| 368 | 368 | |
| 369 | 369 | case 0x74: /* Flush Strobe */ |
| 370 | 370 | { |
| 371 | | LOG(( "DMAC: PC=%08x - Flush Strobe\n", activecpu_get_pc() )); |
| 371 | LOG(( "DMAC: PC=%08x - Flush Strobe\n", cpu_get_pc(space->cpu) )); |
| 372 | 372 | dmac_data.istr |= ISTR_FE_FLG; |
| 373 | 373 | } |
| 374 | 374 | break; |
| 375 | 375 | |
| 376 | 376 | default: |
| 377 | | logerror( "DMAC-WRITE: PC=%08x, offset = %02x, data = %04x\n", activecpu_get_pc(), offset, data ); |
| 377 | logerror( "DMAC-WRITE: PC=%08x, offset = %02x, data = %04x\n", cpu_get_pc(space->cpu), offset, data ); |
| 378 | 378 | break; |
| 379 | 379 | } |
| 380 | 380 | } |
| r3603 | r3604 | |
| 387 | 387 | |
| 388 | 388 | static void dmac_install(offs_t base) |
| 389 | 389 | { |
| 390 | | memory_install_read16_handler(Machine, 0, ADDRESS_SPACE_PROGRAM, base, base + 0xFFFF, 0, 0, amiga_dmac_r); |
| 391 | | memory_install_write16_handler(Machine, 0, ADDRESS_SPACE_PROGRAM, base, base + 0xFFFF, 0, 0, amiga_dmac_w); |
| 390 | memory_install_read16_handler(cpu_get_address_space(Machine->cpu[0], ADDRESS_SPACE_PROGRAM), base, base + 0xFFFF, 0, 0, amiga_dmac_r); |
| 391 | memory_install_write16_handler(cpu_get_address_space(Machine->cpu[0], ADDRESS_SPACE_PROGRAM), base, base + 0xFFFF, 0, 0, amiga_dmac_w); |
| 392 | 392 | } |
| 393 | 393 | |
| 394 | 394 | static void dmac_uninstall(offs_t base) |
| 395 | 395 | { |
| 396 | | memory_install_read16_handler(Machine, 0, ADDRESS_SPACE_PROGRAM, base, base + 0xFFFF, 0, 0, SMH_UNMAP); |
| 397 | | memory_install_write16_handler(Machine, 0, ADDRESS_SPACE_PROGRAM, base, base + 0xFFFF, 0, 0, SMH_UNMAP); |
| 396 | memory_install_read16_handler(cpu_get_address_space(Machine->cpu[0], ADDRESS_SPACE_PROGRAM), base, base + 0xFFFF, 0, 0, SMH_UNMAP); |
| 397 | memory_install_write16_handler(cpu_get_address_space(Machine->cpu[0], ADDRESS_SPACE_PROGRAM), base, base + 0xFFFF, 0, 0, SMH_UNMAP); |
| 398 | 398 | } |
| 399 | 399 | |
| 400 | 400 | static const amiga_autoconfig_device dmac_device = |
| r3603 | r3604 | |
| 453 | 453 | |
| 454 | 454 | if ( (CUSTOM_REG(REG_INTREQ) & INTENA_PORTS) == 0 ) |
| 455 | 455 | { |
| 456 | | amiga_custom_w(machine, REG_INTREQ, 0x8000 | INTENA_PORTS, 0xffff); |
| 456 | amiga_custom_w(cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM), REG_INTREQ, 0x8000 | INTENA_PORTS, 0xffff); |
| 457 | 457 | } |
| 458 | 458 | else |
| 459 | 459 | { |
| r3603 | r3604 | |
| 469 | 469 | { |
| 470 | 470 | if ( (CUSTOM_REG(REG_INTREQ) & INTENA_PORTS) == 0 ) |
| 471 | 471 | { |
| 472 | | amiga_custom_w(machine, REG_INTREQ, 0x8000 | INTENA_PORTS, 0xffff); |
| 472 | amiga_custom_w(cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM), REG_INTREQ, 0x8000 | INTENA_PORTS, 0xffff); |
| 473 | 473 | } |
| 474 | 474 | else |
| 475 | 475 | { |
src/mess/drivers/amiga.c
| r3603 | r3604 | |
| 40 | 40 | |
| 41 | 41 | static READ16_HANDLER( amiga_clock_r ) |
| 42 | 42 | { |
| 43 | | const device_config *rtc = device_list_find_by_tag(machine->config->devicelist, MSM6242, "rtc"); |
| 43 | const device_config *rtc = device_list_find_by_tag(space->machine->config->devicelist, MSM6242, "rtc"); |
| 44 | 44 | return msm6242_r(rtc, offset / 2); |
| 45 | 45 | } |
| 46 | 46 | |
| 47 | 47 | |
| 48 | 48 | static WRITE16_HANDLER( amiga_clock_w ) |
| 49 | 49 | { |
| 50 | | const device_config *rtc = device_list_find_by_tag(machine->config->devicelist, MSM6242, "rtc"); |
| 50 | const device_config *rtc = device_list_find_by_tag(space->machine->config->devicelist, MSM6242, "rtc"); |
| 51 | 51 | msm6242_w(rtc, offset / 2, data); |
| 52 | 52 | } |
| 53 | 53 | |
| r3603 | r3604 | |
| 310 | 310 | static void amiga_cia_0_portA_w( UINT8 data ) |
| 311 | 311 | { |
| 312 | 312 | /* switch banks as appropriate */ |
| 313 | | memory_set_bank(1, data & 1); |
| 313 | memory_set_bank(Machine, 1, data & 1); |
| 314 | 314 | |
| 315 | 315 | /* swap the write handlers between ROM and bank 1 based on the bit */ |
| 316 | 316 | if ((data & 1) == 0) { |
| r3603 | r3604 | |
| 321 | 321 | } |
| 322 | 322 | |
| 323 | 323 | /* overlay disabled, map RAM on 0x000000 */ |
| 324 | | memory_install_write16_handler(Machine, 0, ADDRESS_SPACE_PROGRAM, 0x000000, amiga_chip_ram_size - 1, 0, mirror_mask, SMH_BANK1); |
| 324 | memory_install_write16_handler(cpu_get_address_space(Machine->cpu[0], ADDRESS_SPACE_PROGRAM), 0x000000, amiga_chip_ram_size - 1, 0, mirror_mask, SMH_BANK1); |
| 325 | 325 | |
| 326 | 326 | amiga_cart_check_overlay(Machine); |
| 327 | 327 | } |
| 328 | 328 | else |
| 329 | 329 | /* overlay enabled, map Amiga system ROM on 0x000000 */ |
| 330 | | memory_install_write16_handler(Machine, 0, ADDRESS_SPACE_PROGRAM, 0x000000, amiga_chip_ram_size - 1, 0, 0, SMH_UNMAP); |
| 330 | memory_install_write16_handler(cpu_get_address_space(Machine->cpu[0], ADDRESS_SPACE_PROGRAM), 0x000000, amiga_chip_ram_size - 1, 0, 0, SMH_UNMAP); |
| 331 | 331 | |
| 332 | 332 | set_led_status( 0, ( data & 2 ) ? 0 : 1 ); /* bit 2 = Power Led on Amiga */ |
| 333 | 333 | output_set_value("power_led", ( data & 2 ) ? 0 : 1); |
| r3603 | r3604 | |
| 380 | 380 | if (input_port_read(Machine, "hardware") & 0x08) |
| 381 | 381 | { |
| 382 | 382 | /* Install RTC */ |
| 383 | | memory_install_readwrite16_handler(Machine, 0, ADDRESS_SPACE_PROGRAM, 0xdc0000, 0xdc003f, 0, 0, amiga_clock_r, amiga_clock_w); |
| 383 | memory_install_readwrite16_handler(cpu_get_address_space(Machine->cpu[0], ADDRESS_SPACE_PROGRAM), 0xdc0000, 0xdc003f, 0, 0, amiga_clock_r, amiga_clock_w); |
| 384 | 384 | } |
| 385 | 385 | else |
| 386 | 386 | { |
| 387 | 387 | /* No RTC support */ |
| 388 | | memory_install_readwrite16_handler(Machine, 0, ADDRESS_SPACE_PROGRAM, 0xdc0000, 0xdc003f, 0, 0, SMH_UNMAP, SMH_UNMAP); |
| 388 | memory_install_readwrite16_handler(cpu_get_address_space(Machine->cpu[0], ADDRESS_SPACE_PROGRAM), 0xdc0000, 0xdc003f, 0, 0, SMH_UNMAP, SMH_UNMAP); |
| 389 | 389 | } |
| 390 | 390 | } |
| 391 | 391 | |
| r3603 | r3604 | |
| 411 | 411 | amiga_machine_config(machine, &amiga_intf); |
| 412 | 412 | |
| 413 | 413 | /* set up memory */ |
| 414 | | memory_configure_bank(1, 0, 1, amiga_chip_ram, 0); |
| 415 | | memory_configure_bank(1, 1, 1, memory_region(machine, "user1"), 0); |
| 414 | memory_configure_bank(machine, 1, 0, 1, amiga_chip_ram, 0); |
| 415 | memory_configure_bank(machine, 1, 1, 1, memory_region(machine, "user1"), 0); |
| 416 | 416 | |
| 417 | 417 | /* initialize cartridge (if present) */ |
| 418 | 418 | amiga_cart_init(machine); |
| r3603 | r3604 | |
| 477 | 477 | amiga_machine_config(machine, &amiga_intf); |
| 478 | 478 | |
| 479 | 479 | /* set up memory */ |
| 480 | | memory_configure_bank(1, 0, 1, amiga_chip_ram, 0); |
| 481 | | memory_configure_bank(1, 1, 1, memory_region(machine, "user1"), 0); |
| 480 | memory_configure_bank(machine, 1, 0, 1, amiga_chip_ram, 0); |
| 481 | memory_configure_bank(machine, 1, 1, 1, memory_region(machine, "user1"), 0); |
| 482 | 482 | |
| 483 | 483 | /* initialize keyboard - in cdtv we can use a standard Amiga keyboard*/ |
| 484 | 484 | amigakbd_init(); |