trunk/src/mess/machine/sns_sa1.c
| r23862 | r23863 | |
| 35 | 35 | #include "emu.h" |
| 36 | 36 | #include "machine/sns_sa1.h" |
| 37 | 37 | |
| 38 | #define SA1_IRQ_SCPU (0x80) |
| 39 | #define SA1_IRQ_TIMER (0x40) |
| 40 | #define SA1_IRQ_DMA (0x20) |
| 41 | #define SA1_NMI_SCPU (0x10) |
| 38 | 42 | |
| 43 | #define SCPU_IRQ_SA1 (0x80) |
| 44 | #define SCPU_IRQV_ALT (0x40) |
| 45 | #define SCPU_IRQ_CHARCONV (0x20) |
| 46 | #define SCPU_NMIV_ALT (0x10) |
| 47 | |
| 39 | 48 | //------------------------------------------------- |
| 40 | 49 | // constructor |
| 41 | 50 | //------------------------------------------------- |
| r23862 | r23863 | |
| 48 | 57 | device_sns_cart_interface( mconfig, *this ), |
| 49 | 58 | m_sa1(*this, "sa1cpu") |
| 50 | 59 | { |
| 60 | |
| 51 | 61 | } |
| 52 | 62 | |
| 53 | 63 | |
| r23862 | r23863 | |
| 96 | 106 | m_drm = 0; |
| 97 | 107 | m_hcr = 0; |
| 98 | 108 | m_vcr = 0; |
| 109 | m_scpu_sie = m_sa1_sie = 0; |
| 110 | m_scpu_flags = m_sa1_flags = 0; |
| 111 | |
| 112 | // sa-1 CPU starts out not running? |
| 113 | m_sa1->set_input_line(INPUT_LINE_HALT, ASSERT_LINE); |
| 99 | 114 | } |
| 100 | 115 | |
| 101 | 116 | |
| r23862 | r23863 | |
| 103 | 118 | mapper specific handlers |
| 104 | 119 | -------------------------------------------------*/ |
| 105 | 120 | |
| 121 | void sns_sa1_device::recalc_irqs() |
| 122 | { |
| 123 | #if 0 // how do we get the maincpu from here? |
| 124 | if (m_scpu_flags & m_scpu_sie & (SCPU_IRQ_SA1|SCPU_IRQ_CHARCONV)) |
| 125 | { |
| 126 | set_input_line(G65816_LINE_IRQ, ASSERT_LINE); |
| 127 | } |
| 128 | else |
| 129 | { |
| 130 | set_input_line(G65816_LINE_IRQ, CLEAR_LINE); |
| 131 | } |
| 132 | #endif |
| 133 | |
| 134 | if (m_sa1_flags & m_sa1_sie & (SA1_IRQ_SCPU|SA1_IRQ_TIMER|SA1_IRQ_DMA)) |
| 135 | { |
| 136 | m_sa1->set_input_line(G65816_LINE_IRQ, ASSERT_LINE); |
| 137 | } |
| 138 | else |
| 139 | { |
| 140 | m_sa1->set_input_line(G65816_LINE_IRQ, CLEAR_LINE); |
| 141 | } |
| 142 | |
| 143 | if (m_sa1_flags & m_sa1_sie & SA1_NMI_SCPU) |
| 144 | { |
| 145 | m_sa1->set_input_line(G65816_LINE_NMI, ASSERT_LINE); |
| 146 | } |
| 147 | else |
| 148 | { |
| 149 | m_sa1->set_input_line(G65816_LINE_NMI, CLEAR_LINE); |
| 150 | } |
| 151 | } |
| 152 | |
| 153 | |
| 106 | 154 | /*------------------------------------------------- |
| 107 | 155 | RAM / SRAM / Registers |
| 108 | 156 | -------------------------------------------------*/ |
| r23862 | r23863 | |
| 154 | 202 | { |
| 155 | 203 | case 0x100: |
| 156 | 204 | // S-CPU Flag Read |
| 157 | | value = (m_scpu_ctrl & ~0xa0); // | (IRQ Flags); |
| 205 | value = (m_scpu_ctrl & 0x0f) | m_scpu_flags; |
| 158 | 206 | break; |
| 159 | 207 | case 0x101: |
| 160 | 208 | // SA-1 Flag Read |
| 161 | | value = (m_sa1_ctrl & ~0x0f); // | (IRQ/NMI/Timer Flags); |
| 209 | value = (m_sa1_ctrl & 0x0f) | m_sa1_flags; |
| 162 | 210 | break; |
| 163 | 211 | case 0x102: |
| 164 | 212 | // H-Count Read Low |
| r23862 | r23863 | |
| 249 | 297 | { |
| 250 | 298 | case 0x000: |
| 251 | 299 | // SA-1 control flags |
| 252 | | if (BIT(m_sa1_ctrl, 5) && !BIT(data, 7)) |
| 300 | if ((BIT(data, 5)) && !(BIT(m_sa1_ctrl, 5))) |
| 253 | 301 | { |
| 254 | | // reset sa-1? |
| 302 | printf("Engaging SA-1 reset\n"); |
| 303 | m_sa1->set_input_line(INPUT_LINE_HALT, ASSERT_LINE); |
| 255 | 304 | } |
| 305 | else if (!(BIT(data, 5)) && (BIT(m_sa1_ctrl, 5))) |
| 306 | { |
| 307 | printf("Releasing SA-1 reset\n"); |
| 308 | m_sa1->set_input_line(INPUT_LINE_HALT, CLEAR_LINE); |
| 309 | m_sa1->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); |
| 310 | m_sa1->set_input_line(INPUT_LINE_RESET, CLEAR_LINE); |
| 311 | } |
| 312 | |
| 256 | 313 | m_sa1_ctrl = data; |
| 257 | 314 | |
| 315 | // message to S-CPU |
| 316 | m_scpu_ctrl &= 0xf0; |
| 317 | m_scpu_ctrl |= (data & 0x0f); |
| 318 | |
| 258 | 319 | if (BIT(m_sa1_ctrl, 7)) |
| 259 | 320 | { |
| 260 | | // IRQ |
| 321 | m_sa1_flags |= SA1_IRQ_SCPU; |
| 261 | 322 | } |
| 262 | 323 | if (BIT(m_sa1_ctrl, 4)) |
| 263 | 324 | { |
| 264 | | // NMI |
| 325 | m_sa1_flags |= SA1_NMI_SCPU; |
| 265 | 326 | } |
| 327 | recalc_irqs(); |
| 266 | 328 | break; |
| 267 | 329 | case 0x001: |
| 268 | 330 | // SNES SIE 00h SNES CPU Int Enable (W) |
| 331 | m_scpu_sie = data; |
| 332 | recalc_irqs(); |
| 269 | 333 | break; |
| 270 | 334 | case 0x002: |
| 271 | 335 | // SNES SIC 00h SNES CPU Int Clear (W) |
| 336 | if (BIT(data, 7)) // ack IRQ from SA-1 |
| 337 | { |
| 338 | m_scpu_flags &= ~SCPU_IRQ_SA1; |
| 339 | } |
| 340 | if (BIT(data, 5)) // ack character conversion IRQ |
| 341 | { |
| 342 | m_scpu_flags &= ~SCPU_IRQ_CHARCONV; |
| 343 | } |
| 344 | recalc_irqs(); |
| 272 | 345 | break; |
| 273 | 346 | case 0x003: |
| 274 | 347 | // SNES CRV - SA-1 CPU Reset Vector Lsb (W) |
| 348 | m_sa1_reset &= 0xff00; |
| 349 | m_sa1_reset |= data; |
| 275 | 350 | break; |
| 276 | 351 | case 0x004: |
| 277 | 352 | // SNES CRV - SA-1 CPU Reset Vector Msb (W) |
| 353 | m_sa1_reset &= 0x00ff; |
| 354 | m_sa1_reset |= (data<<8); |
| 278 | 355 | break; |
| 279 | 356 | case 0x005: |
| 280 | 357 | // SNES CNV - SA-1 CPU NMI Vector Lsb (W) |
| 358 | m_sa1_nmi &= 0xff00; |
| 359 | m_sa1_nmi |= data; |
| 281 | 360 | break; |
| 282 | 361 | case 0x006: |
| 283 | 362 | // SNES CNV - SA-1 CPU NMI Vector Msb (W) |
| 363 | m_sa1_nmi &= 0x00ff; |
| 364 | m_sa1_nmi |= (data<<8); |
| 284 | 365 | break; |
| 285 | 366 | case 0x007: |
| 286 | 367 | // SNES CIV - SA-1 CPU IRQ Vector Lsb (W) |
| 368 | m_sa1_irq &= 0xff00; |
| 369 | m_sa1_irq |= data; |
| 287 | 370 | break; |
| 288 | 371 | case 0x008: |
| 289 | 372 | // SNES CIV - SA-1 CPU IRQ Vector Msb (W) |
| 373 | m_sa1_irq &= 0x00ff; |
| 374 | m_sa1_irq |= (data<<8); |
| 290 | 375 | break; |
| 291 | 376 | case 0x009: |
| 292 | 377 | // S-CPU control flags |
| 293 | 378 | m_scpu_ctrl = data; |
| 294 | 379 | if (m_scpu_ctrl & 0x80) |
| 295 | 380 | { |
| 296 | | // IRQ |
| 381 | m_scpu_flags |= SCPU_IRQ_SA1; |
| 297 | 382 | } |
| 383 | |
| 384 | // message to SA-1 |
| 385 | m_sa1_ctrl &= 0xf0; |
| 386 | m_sa1_ctrl |= (data & 0x0f); |
| 387 | |
| 388 | // clear IRQ/NMI override flags in flags word |
| 389 | m_scpu_flags &= ~(SCPU_IRQV_ALT|SCPU_NMIV_ALT); |
| 390 | |
| 391 | // and set them |
| 392 | m_scpu_flags |= (data & (SCPU_IRQV_ALT|SCPU_NMIV_ALT)); |
| 393 | |
| 394 | recalc_irqs(); |
| 298 | 395 | break; |
| 299 | 396 | case 0x00a: |
| 300 | 397 | // SA-1 CIE 00h SA-1 CPU Int Enable (W) |
| 398 | m_sa1_sie = data; |
| 399 | recalc_irqs(); |
| 301 | 400 | break; |
| 302 | 401 | case 0x00b: |
| 303 | 402 | // SA-1 CIC 00h SA-1 CPU Int Clear (W) |
| 403 | if (BIT(data, 7)) |
| 404 | { |
| 405 | m_sa1_flags &= ~SA1_IRQ_SCPU; |
| 406 | } |
| 407 | if (BIT(data, 6)) |
| 408 | { |
| 409 | m_sa1_flags &= ~SA1_IRQ_TIMER; |
| 410 | } |
| 411 | if (BIT(data, 5)) |
| 412 | { |
| 413 | m_sa1_flags &= ~SA1_IRQ_DMA; |
| 414 | } |
| 415 | if (BIT(data, 4)) |
| 416 | { |
| 417 | m_sa1_flags &= ~SA1_NMI_SCPU; |
| 418 | } |
| 419 | recalc_irqs(); |
| 304 | 420 | break; |
| 305 | 421 | case 0x00c: |
| 306 | 422 | // NMI Vector Low |
| r23862 | r23863 | |
| 771 | 887 | } |
| 772 | 888 | else if (address < 0x8000) |
| 773 | 889 | return read_bwram((m_bwram_sa1 * 0x2000) + (offset & 0x1fff) + (m_bwram_sa1_source * 0x100000)); // SA-1 BWRAM |
| 890 | else if (address == 0xffee) |
| 891 | { |
| 892 | return m_sa1_irq & 0xff; |
| 893 | } |
| 894 | else if (address == 0xffef) |
| 895 | { |
| 896 | return m_sa1_irq>>8; |
| 897 | } |
| 898 | else if (address == 0xffea) |
| 899 | { |
| 900 | return m_sa1_nmi & 0xff; |
| 901 | } |
| 902 | else if (address == 0xffeb) |
| 903 | { |
| 904 | return m_sa1_nmi>>8; |
| 905 | } |
| 906 | else if (address == 0xfffc) |
| 907 | { |
| 908 | return m_sa1_reset & 0xff; |
| 909 | } |
| 910 | else if (address == 0xfffd) |
| 911 | { |
| 912 | return m_sa1_reset>>8; |
| 913 | } |
| 774 | 914 | else |
| 775 | 915 | return read_l(space, offset); // ROM |
| 776 | 916 | |
| r23862 | r23863 | |
| 821 | 961 | |
| 822 | 962 | |
| 823 | 963 | static MACHINE_CONFIG_FRAGMENT( snes_sa1 ) |
| 824 | | MCFG_CPU_ADD("sa1cpu", _5A22, 10000000) |
| 964 | MCFG_CPU_ADD("sa1cpu", G65816, 10000000) |
| 825 | 965 | MCFG_CPU_PROGRAM_MAP(sa1_map) |
| 826 | 966 | MACHINE_CONFIG_END |
| 827 | 967 | |