trunk/src/mess/machine/bebox.c
r18264 | r18265 | |
194 | 194 | } |
195 | 195 | |
196 | 196 | |
197 | | READ64_HANDLER( bebox_cpu0_imask_r ) |
| 197 | READ64_MEMBER(bebox_state::bebox_cpu0_imask_r ) |
198 | 198 | { |
199 | | bebox_state *state = space.machine().driver_data<bebox_state>(); |
200 | | return ((UINT64) state->m_cpu_imask[0]) << 32; |
| 199 | return ((UINT64) m_cpu_imask[0]) << 32; |
201 | 200 | } |
202 | 201 | |
203 | | READ64_HANDLER( bebox_cpu1_imask_r ) |
| 202 | READ64_MEMBER(bebox_state::bebox_cpu1_imask_r ) |
204 | 203 | { |
205 | | bebox_state *state = space.machine().driver_data<bebox_state>(); |
206 | | return ((UINT64) state->m_cpu_imask[1]) << 32; |
| 204 | return ((UINT64) m_cpu_imask[1]) << 32; |
207 | 205 | } |
208 | 206 | |
209 | | READ64_HANDLER( bebox_interrupt_sources_r ) |
| 207 | READ64_MEMBER(bebox_state::bebox_interrupt_sources_r ) |
210 | 208 | { |
211 | | bebox_state *state = space.machine().driver_data<bebox_state>(); |
212 | | return ((UINT64) state->m_interrupts) << 32; |
| 209 | return ((UINT64) m_interrupts) << 32; |
213 | 210 | } |
214 | 211 | |
215 | | WRITE64_HANDLER( bebox_cpu0_imask_w ) |
| 212 | WRITE64_MEMBER(bebox_state::bebox_cpu0_imask_w ) |
216 | 213 | { |
217 | | bebox_state *state = space.machine().driver_data<bebox_state>(); |
218 | | UINT32 old_imask = state->m_cpu_imask[0]; |
| 214 | UINT32 old_imask = m_cpu_imask[0]; |
219 | 215 | |
220 | | bebox_mbreg32_w(&state->m_cpu_imask[0], data, mem_mask); |
| 216 | bebox_mbreg32_w(&m_cpu_imask[0], data, mem_mask); |
221 | 217 | |
222 | | if (old_imask != state->m_cpu_imask[0]) |
| 218 | if (old_imask != m_cpu_imask[0]) |
223 | 219 | { |
224 | 220 | if (LOG_CPUIMASK) |
225 | 221 | { |
226 | 222 | logerror("BeBox CPU #0 pc=0x%08X imask=0x%08x\n", |
227 | | (unsigned) space.device().safe_pc( ), state->m_cpu_imask[0]); |
| 223 | (unsigned) space.device().safe_pc( ), m_cpu_imask[0]); |
228 | 224 | } |
229 | 225 | bebox_update_interrupts(space.machine()); |
230 | 226 | } |
231 | 227 | } |
232 | 228 | |
233 | | WRITE64_HANDLER( bebox_cpu1_imask_w ) |
234 | | { |
235 | | bebox_state *state = space.machine().driver_data<bebox_state>(); |
236 | | UINT32 old_imask = state->m_cpu_imask[1]; |
| 229 | WRITE64_MEMBER(bebox_state::bebox_cpu1_imask_w ) |
| 230 | { |
| 231 | UINT32 old_imask = m_cpu_imask[1]; |
237 | 232 | |
238 | | bebox_mbreg32_w(&state->m_cpu_imask[1], data, mem_mask); |
| 233 | bebox_mbreg32_w(&m_cpu_imask[1], data, mem_mask); |
239 | 234 | |
240 | | if (old_imask != state->m_cpu_imask[1]) |
| 235 | if (old_imask != m_cpu_imask[1]) |
241 | 236 | { |
242 | 237 | if (LOG_CPUIMASK) |
243 | 238 | { |
244 | 239 | logerror("BeBox CPU #1 pc=0x%08X imask=0x%08x\n", |
245 | | (unsigned) space.device() .safe_pc( ), state->m_cpu_imask[1]); |
| 240 | (unsigned) space.device() .safe_pc( ), m_cpu_imask[1]); |
246 | 241 | } |
247 | 242 | bebox_update_interrupts(space.machine()); |
248 | 243 | } |
249 | 244 | } |
250 | 245 | |
251 | | READ64_HANDLER( bebox_crossproc_interrupts_r ) |
| 246 | READ64_MEMBER(bebox_state::bebox_crossproc_interrupts_r ) |
252 | 247 | { |
253 | | bebox_state *state = space.machine().driver_data<bebox_state>(); |
254 | 248 | UINT32 result; |
255 | | result = state->m_crossproc_interrupts; |
| 249 | result = m_crossproc_interrupts; |
256 | 250 | |
257 | 251 | /* return a different result depending on which CPU is accessing this handler */ |
258 | 252 | if (&space != &space.machine().device("ppc1")->memory().space(AS_PROGRAM)) |
r18264 | r18265 | |
263 | 257 | return ((UINT64) result) << 32; |
264 | 258 | } |
265 | 259 | |
266 | | WRITE64_HANDLER( bebox_crossproc_interrupts_w ) |
| 260 | WRITE64_MEMBER(bebox_state::bebox_crossproc_interrupts_w ) |
267 | 261 | { |
268 | | bebox_state *state = space.machine().driver_data<bebox_state>(); |
269 | 262 | static const struct |
270 | 263 | { |
271 | 264 | UINT32 mask; |
r18264 | r18265 | |
280 | 273 | { 0x04000000, 1, 0, 0/*PPC_INPUT_LINE_TLBISYNC*/ } |
281 | 274 | }; |
282 | 275 | int i, line; |
283 | | UINT32 old_crossproc_interrupts = state->m_crossproc_interrupts; |
| 276 | UINT32 old_crossproc_interrupts = m_crossproc_interrupts; |
284 | 277 | static const char *const cputags[] = { "ppc1", "ppc2" }; |
285 | 278 | |
286 | | bebox_mbreg32_w(&state->m_crossproc_interrupts, data, mem_mask); |
| 279 | bebox_mbreg32_w(&m_crossproc_interrupts, data, mem_mask); |
287 | 280 | |
288 | 281 | for (i = 0; i < ARRAY_LENGTH(crossproc_map); i++) |
289 | 282 | { |
290 | | if ((old_crossproc_interrupts ^ state->m_crossproc_interrupts) & crossproc_map[i].mask) |
| 283 | if ((old_crossproc_interrupts ^ m_crossproc_interrupts) & crossproc_map[i].mask) |
291 | 284 | { |
292 | | if (state->m_crossproc_interrupts & crossproc_map[i].mask) |
| 285 | if (m_crossproc_interrupts & crossproc_map[i].mask) |
293 | 286 | line = crossproc_map[i].active_high ? ASSERT_LINE : CLEAR_LINE; |
294 | 287 | else |
295 | 288 | line = crossproc_map[i].active_high ? CLEAR_LINE : ASSERT_LINE; |
r18264 | r18265 | |
308 | 301 | } |
309 | 302 | } |
310 | 303 | |
311 | | WRITE64_HANDLER( bebox_processor_resets_w ) |
| 304 | WRITE64_MEMBER(bebox_state::bebox_processor_resets_w ) |
312 | 305 | { |
313 | 306 | UINT8 b = (UINT8) (data >> 56); |
314 | 307 | |
r18264 | r18265 | |
505 | 498 | * |
506 | 499 | *************************************/ |
507 | 500 | |
508 | | READ64_HANDLER( bebox_interrupt_ack_r ) |
| 501 | READ64_MEMBER(bebox_state::bebox_interrupt_ack_r ) |
509 | 502 | { |
510 | | bebox_state *state = space.machine().driver_data<bebox_state>(); |
511 | 503 | int result; |
512 | | result = pic8259_acknowledge( state->m_devices.pic8259_master ); |
| 504 | result = pic8259_acknowledge( m_devices.pic8259_master ); |
513 | 505 | bebox_set_irq_bit(space.machine(), 5, 0); /* HACK */ |
514 | 506 | return ((UINT64) result) << 56; |
515 | 507 | } |
r18264 | r18265 | |
566 | 558 | return machine.device("ide"); |
567 | 559 | } |
568 | 560 | |
569 | | READ8_HANDLER( bebox_800001F0_r ) { return ide_controller_r(ide_device(space.machine()), offset + 0x1F0, 1); } |
570 | | WRITE8_HANDLER( bebox_800001F0_w ) { ide_controller_w(ide_device(space.machine()), offset + 0x1F0, 1, data); } |
| 561 | READ8_MEMBER(bebox_state::bebox_800001F0_r ) { return ide_controller_r(ide_device(space.machine()), offset + 0x1F0, 1); } |
| 562 | WRITE8_MEMBER(bebox_state::bebox_800001F0_w ) { ide_controller_w(ide_device(space.machine()), offset + 0x1F0, 1, data); } |
571 | 563 | |
572 | | READ64_HANDLER( bebox_800003F0_r ) |
| 564 | READ64_MEMBER(bebox_state::bebox_800003F0_r ) |
573 | 565 | { |
574 | 566 | UINT64 result = read64be_with_read8_handler(pc_fdc_r, space, offset, mem_mask | 0xFFFF); |
575 | 567 | |
r18264 | r18265 | |
588 | 580 | } |
589 | 581 | |
590 | 582 | |
591 | | WRITE64_HANDLER( bebox_800003F0_w ) |
| 583 | WRITE64_MEMBER(bebox_state::bebox_800003F0_w ) |
592 | 584 | { |
593 | 585 | write64be_with_write8_handler(pc_fdc_w, space, offset, data, mem_mask | 0xFFFF); |
594 | 586 | |
r18264 | r18265 | |
616 | 608 | * |
617 | 609 | *************************************/ |
618 | 610 | /* |
619 | | static READ64_HANDLER( bebox_video_r ) |
| 611 | static READ64_MEMBER(bebox_state::bebox_video_r ) |
620 | 612 | { |
621 | 613 | UINT64 result = 0; |
622 | 614 | mem_mask = FLIPENDIAN_INT64(mem_mask); |
r18264 | r18265 | |
640 | 632 | } |
641 | 633 | |
642 | 634 | |
643 | | static WRITE64_HANDLER( bebox_video_w ) |
| 635 | static WRITE64_MEMBER(bebox_state::bebox_video_w ) |
644 | 636 | { |
645 | 637 | data = FLIPENDIAN_INT64(data); |
646 | 638 | mem_mask = FLIPENDIAN_INT64(mem_mask); |
r18264 | r18265 | |
669 | 661 | *************************************/ |
670 | 662 | |
671 | 663 | |
672 | | READ8_HANDLER(bebox_page_r) |
673 | | { |
674 | | bebox_state *state = space.machine().driver_data<bebox_state>(); |
675 | | UINT8 data = state->m_at_pages[offset % 0x10]; |
| 664 | READ8_MEMBER(bebox_state::bebox_page_r) |
| 665 | { |
| 666 | UINT8 data = m_at_pages[offset % 0x10]; |
676 | 667 | |
677 | 668 | switch(offset % 8) |
678 | 669 | { |
679 | 670 | case 1: |
680 | | data = state->m_dma_offset[(offset / 8) & 1][2]; |
| 671 | data = m_dma_offset[(offset / 8) & 1][2]; |
681 | 672 | break; |
682 | 673 | case 2: |
683 | | data = state->m_dma_offset[(offset / 8) & 1][3]; |
| 674 | data = m_dma_offset[(offset / 8) & 1][3]; |
684 | 675 | break; |
685 | 676 | case 3: |
686 | | data = state->m_dma_offset[(offset / 8) & 1][1]; |
| 677 | data = m_dma_offset[(offset / 8) & 1][1]; |
687 | 678 | break; |
688 | 679 | case 7: |
689 | | data = state->m_dma_offset[(offset / 8) & 1][0]; |
| 680 | data = m_dma_offset[(offset / 8) & 1][0]; |
690 | 681 | break; |
691 | 682 | } |
692 | 683 | return data; |
693 | 684 | } |
694 | 685 | |
695 | 686 | |
696 | | WRITE8_HANDLER(bebox_page_w) |
697 | | { |
698 | | bebox_state *state = space.machine().driver_data<bebox_state>(); |
699 | | state->m_at_pages[offset % 0x10] = data; |
| 687 | WRITE8_MEMBER(bebox_state::bebox_page_w) |
| 688 | { |
| 689 | m_at_pages[offset % 0x10] = data; |
700 | 690 | |
701 | 691 | switch(offset % 8) |
702 | 692 | { |
703 | 693 | case 1: |
704 | | state->m_dma_offset[(offset / 8) & 1][2] &= 0xFF00; |
705 | | state->m_dma_offset[(offset / 8) & 1][2] |= ((UINT16 ) data) << 0; |
| 694 | m_dma_offset[(offset / 8) & 1][2] &= 0xFF00; |
| 695 | m_dma_offset[(offset / 8) & 1][2] |= ((UINT16 ) data) << 0; |
706 | 696 | break; |
707 | 697 | case 2: |
708 | | state->m_dma_offset[(offset / 8) & 1][3] &= 0xFF00; |
709 | | state->m_dma_offset[(offset / 8) & 1][3] |= ((UINT16 ) data) << 0; |
| 698 | m_dma_offset[(offset / 8) & 1][3] &= 0xFF00; |
| 699 | m_dma_offset[(offset / 8) & 1][3] |= ((UINT16 ) data) << 0; |
710 | 700 | break; |
711 | 701 | case 3: |
712 | | state->m_dma_offset[(offset / 8) & 1][1] &= 0xFF00; |
713 | | state->m_dma_offset[(offset / 8) & 1][1] |= ((UINT16 ) data) << 0; |
| 702 | m_dma_offset[(offset / 8) & 1][1] &= 0xFF00; |
| 703 | m_dma_offset[(offset / 8) & 1][1] |= ((UINT16 ) data) << 0; |
714 | 704 | break; |
715 | 705 | case 7: |
716 | | state->m_dma_offset[(offset / 8) & 1][0] &= 0xFF00; |
717 | | state->m_dma_offset[(offset / 8) & 1][0] |= ((UINT16 ) data) << 0; |
| 706 | m_dma_offset[(offset / 8) & 1][0] &= 0xFF00; |
| 707 | m_dma_offset[(offset / 8) & 1][0] |= ((UINT16 ) data) << 0; |
718 | 708 | break; |
719 | 709 | } |
720 | 710 | } |
721 | 711 | |
722 | 712 | |
723 | | WRITE8_HANDLER(bebox_80000480_w) |
724 | | { |
725 | | bebox_state *state = space.machine().driver_data<bebox_state>(); |
| 713 | WRITE8_MEMBER(bebox_state::bebox_80000480_w) |
| 714 | { |
726 | 715 | switch(offset % 8) |
727 | 716 | { |
728 | 717 | case 1: |
729 | | state->m_dma_offset[(offset / 8) & 1][2] &= 0x00FF; |
730 | | state->m_dma_offset[(offset / 8) & 1][2] |= ((UINT16 ) data) << 8; |
| 718 | m_dma_offset[(offset / 8) & 1][2] &= 0x00FF; |
| 719 | m_dma_offset[(offset / 8) & 1][2] |= ((UINT16 ) data) << 8; |
731 | 720 | break; |
732 | 721 | case 2: |
733 | | state->m_dma_offset[(offset / 8) & 1][3] &= 0x00FF; |
734 | | state->m_dma_offset[(offset / 8) & 1][3] |= ((UINT16 ) data) << 8; |
| 722 | m_dma_offset[(offset / 8) & 1][3] &= 0x00FF; |
| 723 | m_dma_offset[(offset / 8) & 1][3] |= ((UINT16 ) data) << 8; |
735 | 724 | break; |
736 | 725 | case 3: |
737 | | state->m_dma_offset[(offset / 8) & 1][1] &= 0x00FF; |
738 | | state->m_dma_offset[(offset / 8) & 1][1] |= ((UINT16 ) data) << 8; |
| 726 | m_dma_offset[(offset / 8) & 1][1] &= 0x00FF; |
| 727 | m_dma_offset[(offset / 8) & 1][1] |= ((UINT16 ) data) << 8; |
739 | 728 | break; |
740 | 729 | case 7: |
741 | | state->m_dma_offset[(offset / 8) & 1][0] &= 0x00FF; |
742 | | state->m_dma_offset[(offset / 8) & 1][0] |= ((UINT16 ) data) << 8; |
| 730 | m_dma_offset[(offset / 8) & 1][0] &= 0x00FF; |
| 731 | m_dma_offset[(offset / 8) & 1][0] |= ((UINT16 ) data) << 8; |
743 | 732 | break; |
744 | 733 | } |
745 | 734 | } |
746 | 735 | |
747 | 736 | |
748 | | READ8_HANDLER(bebox_80000480_r) |
| 737 | READ8_MEMBER(bebox_state::bebox_80000480_r) |
749 | 738 | { |
750 | 739 | fatalerror("NYI\n"); |
751 | 740 | } |
r18264 | r18265 | |
760 | 749 | } |
761 | 750 | |
762 | 751 | |
763 | | static READ8_HANDLER( bebox_dma_read_byte ) |
| 752 | READ8_MEMBER(bebox_state::bebox_dma_read_byte ) |
764 | 753 | { |
765 | | bebox_state *state = space.machine().driver_data<bebox_state>(); |
766 | | offs_t page_offset = (((offs_t) state->m_dma_offset[0][state->m_dma_channel]) << 16) |
| 754 | address_space& prog_space = machine().device<cpu_device>("ppc1")->space(AS_PROGRAM); // get the right address space |
| 755 | offs_t page_offset = (((offs_t) m_dma_offset[0][m_dma_channel]) << 16) |
767 | 756 | & 0x7FFF0000; |
768 | | return space.read_byte(page_offset + offset); |
| 757 | return prog_space.read_byte(page_offset + offset); |
769 | 758 | } |
770 | 759 | |
771 | 760 | |
772 | | static WRITE8_HANDLER( bebox_dma_write_byte ) |
| 761 | WRITE8_MEMBER(bebox_state::bebox_dma_write_byte ) |
773 | 762 | { |
774 | | bebox_state *state = space.machine().driver_data<bebox_state>(); |
775 | | offs_t page_offset = (((offs_t) state->m_dma_offset[0][state->m_dma_channel]) << 16) |
| 763 | address_space& prog_space = machine().device<cpu_device>("ppc1")->space(AS_PROGRAM); // get the right address space |
| 764 | offs_t page_offset = (((offs_t) m_dma_offset[0][m_dma_channel]) << 16) |
776 | 765 | & 0x7FFF0000; |
777 | | space.write_byte(page_offset + offset, data); |
| 766 | prog_space.write_byte(page_offset + offset, data); |
778 | 767 | } |
779 | 768 | |
780 | 769 | |
r18264 | r18265 | |
808 | 797 | { |
809 | 798 | DEVCB_DRIVER_LINE_MEMBER(bebox_state,bebox_dma_hrq_changed), |
810 | 799 | DEVCB_DRIVER_LINE_MEMBER(bebox_state,bebox_dma8237_out_eop), |
811 | | DEVCB_MEMORY_HANDLER("ppc1", PROGRAM, bebox_dma_read_byte), |
812 | | DEVCB_MEMORY_HANDLER("ppc1", PROGRAM, bebox_dma_write_byte), |
| 800 | DEVCB_DRIVER_MEMBER(bebox_state, bebox_dma_read_byte), |
| 801 | DEVCB_DRIVER_MEMBER(bebox_state, bebox_dma_write_byte), |
813 | 802 | { DEVCB_NULL, DEVCB_NULL, DEVCB_DRIVER_MEMBER(bebox_state,bebox_dma8237_fdc_dack_r), DEVCB_NULL }, |
814 | 803 | { DEVCB_NULL, DEVCB_NULL, DEVCB_DRIVER_MEMBER(bebox_state,bebox_dma8237_fdc_dack_w), DEVCB_NULL }, |
815 | 804 | { DEVCB_DRIVER_LINE_MEMBER(bebox_state,pc_dack0_w), DEVCB_DRIVER_LINE_MEMBER(bebox_state,pc_dack1_w), DEVCB_DRIVER_LINE_MEMBER(bebox_state,pc_dack2_w), DEVCB_DRIVER_LINE_MEMBER(bebox_state,pc_dack3_w) } |
r18264 | r18265 | |
869 | 858 | * |
870 | 859 | *************************************/ |
871 | 860 | |
872 | | READ8_HANDLER( bebox_flash_r ) |
| 861 | READ8_MEMBER(bebox_state::bebox_flash_r ) |
873 | 862 | { |
874 | 863 | fujitsu_29f016a_device *flash = space.machine().device<fujitsu_29f016a_device>("flash"); |
875 | 864 | offset = (offset & ~7) | (7 - (offset & 7)); |
r18264 | r18265 | |
877 | 866 | } |
878 | 867 | |
879 | 868 | |
880 | | WRITE8_HANDLER( bebox_flash_w ) |
| 869 | WRITE8_MEMBER(bebox_state::bebox_flash_w ) |
881 | 870 | { |
882 | 871 | fujitsu_29f016a_device *flash = space.machine().device<fujitsu_29f016a_device>("flash"); |
883 | 872 | offset = (offset & ~7) | (7 - (offset & 7)); |
r18264 | r18265 | |
920 | 909 | *************************************/ |
921 | 910 | |
922 | 911 | |
923 | | static READ64_HANDLER( scsi53c810_r ) |
924 | | { |
925 | | bebox_state *state = space.machine().driver_data<bebox_state>(); |
| 912 | READ64_MEMBER(bebox_state::scsi53c810_r ) |
| 913 | { |
926 | 914 | int reg = offset*8; |
927 | 915 | UINT64 r = 0; |
928 | 916 | if (!(mem_mask & U64(0xff00000000000000))) { |
929 | | r |= (UINT64)state->m_lsi53c810->lsi53c810_reg_r(reg+0) << 56; |
| 917 | r |= (UINT64)m_lsi53c810->lsi53c810_reg_r(reg+0) << 56; |
930 | 918 | } |
931 | 919 | if (!(mem_mask & U64(0x00ff000000000000))) { |
932 | | r |= (UINT64)state->m_lsi53c810->lsi53c810_reg_r(reg+1) << 48; |
| 920 | r |= (UINT64)m_lsi53c810->lsi53c810_reg_r(reg+1) << 48; |
933 | 921 | } |
934 | 922 | if (!(mem_mask & U64(0x0000ff0000000000))) { |
935 | | r |= (UINT64)state->m_lsi53c810->lsi53c810_reg_r(reg+2) << 40; |
| 923 | r |= (UINT64)m_lsi53c810->lsi53c810_reg_r(reg+2) << 40; |
936 | 924 | } |
937 | 925 | if (!(mem_mask & U64(0x000000ff00000000))) { |
938 | | r |= (UINT64)state->m_lsi53c810->lsi53c810_reg_r(reg+3) << 32; |
| 926 | r |= (UINT64)m_lsi53c810->lsi53c810_reg_r(reg+3) << 32; |
939 | 927 | } |
940 | 928 | if (!(mem_mask & U64(0x00000000ff000000))) { |
941 | | r |= (UINT64)state->m_lsi53c810->lsi53c810_reg_r(reg+4) << 24; |
| 929 | r |= (UINT64)m_lsi53c810->lsi53c810_reg_r(reg+4) << 24; |
942 | 930 | } |
943 | 931 | if (!(mem_mask & U64(0x0000000000ff0000))) { |
944 | | r |= (UINT64)state->m_lsi53c810->lsi53c810_reg_r(reg+5) << 16; |
| 932 | r |= (UINT64)m_lsi53c810->lsi53c810_reg_r(reg+5) << 16; |
945 | 933 | } |
946 | 934 | if (!(mem_mask & U64(0x000000000000ff00))) { |
947 | | r |= (UINT64)state->m_lsi53c810->lsi53c810_reg_r(reg+6) << 8; |
| 935 | r |= (UINT64)m_lsi53c810->lsi53c810_reg_r(reg+6) << 8; |
948 | 936 | } |
949 | 937 | if (!(mem_mask & U64(0x00000000000000ff))) { |
950 | | r |= (UINT64)state->m_lsi53c810->lsi53c810_reg_r(reg+7) << 0; |
| 938 | r |= (UINT64)m_lsi53c810->lsi53c810_reg_r(reg+7) << 0; |
951 | 939 | } |
952 | 940 | |
953 | 941 | return r; |
954 | 942 | } |
955 | 943 | |
956 | 944 | |
957 | | static WRITE64_HANDLER( scsi53c810_w ) |
958 | | { |
959 | | bebox_state *state = space.machine().driver_data<bebox_state>(); |
| 945 | WRITE64_MEMBER(bebox_state::scsi53c810_w ) |
| 946 | { |
960 | 947 | int reg = offset*8; |
961 | 948 | if (!(mem_mask & U64(0xff00000000000000))) { |
962 | | state->m_lsi53c810->lsi53c810_reg_w(reg+0, data >> 56); |
| 949 | m_lsi53c810->lsi53c810_reg_w(reg+0, data >> 56); |
963 | 950 | } |
964 | 951 | if (!(mem_mask & U64(0x00ff000000000000))) { |
965 | | state->m_lsi53c810->lsi53c810_reg_w(reg+1, data >> 48); |
| 952 | m_lsi53c810->lsi53c810_reg_w(reg+1, data >> 48); |
966 | 953 | } |
967 | 954 | if (!(mem_mask & U64(0x0000ff0000000000))) { |
968 | | state->m_lsi53c810->lsi53c810_reg_w(reg+2, data >> 40); |
| 955 | m_lsi53c810->lsi53c810_reg_w(reg+2, data >> 40); |
969 | 956 | } |
970 | 957 | if (!(mem_mask & U64(0x000000ff00000000))) { |
971 | | state->m_lsi53c810->lsi53c810_reg_w(reg+3, data >> 32); |
| 958 | m_lsi53c810->lsi53c810_reg_w(reg+3, data >> 32); |
972 | 959 | } |
973 | 960 | if (!(mem_mask & U64(0x00000000ff000000))) { |
974 | | state->m_lsi53c810->lsi53c810_reg_w(reg+4, data >> 24); |
| 961 | m_lsi53c810->lsi53c810_reg_w(reg+4, data >> 24); |
975 | 962 | } |
976 | 963 | if (!(mem_mask & U64(0x0000000000ff0000))) { |
977 | | state->m_lsi53c810->lsi53c810_reg_w(reg+5, data >> 16); |
| 964 | m_lsi53c810->lsi53c810_reg_w(reg+5, data >> 16); |
978 | 965 | } |
979 | 966 | if (!(mem_mask & U64(0x000000000000ff00))) { |
980 | | state->m_lsi53c810->lsi53c810_reg_w(reg+6, data >> 8); |
| 967 | m_lsi53c810->lsi53c810_reg_w(reg+6, data >> 8); |
981 | 968 | } |
982 | 969 | if (!(mem_mask & U64(0x00000000000000ff))) { |
983 | | state->m_lsi53c810->lsi53c810_reg_w(reg+7, data >> 0); |
| 970 | m_lsi53c810->lsi53c810_reg_w(reg+7, data >> 0); |
984 | 971 | } |
985 | 972 | } |
986 | 973 | |
r18264 | r18265 | |
1040 | 1027 | address_space &space = device->machine().device("ppc1")->memory().space(AS_PROGRAM); |
1041 | 1028 | |
1042 | 1029 | addr = (state->m_scsi53c810_data[5] | 0xC0000000) & ~0xFF; |
1043 | | space.install_legacy_read_handler(addr, addr + 0xFF, FUNC(scsi53c810_r)); |
1044 | | space.install_legacy_write_handler(addr, addr + 0xFF, FUNC(scsi53c810_w)); |
| 1030 | space.install_readwrite_handler(addr, addr + 0xFF, read64_delegate(FUNC(bebox_state::scsi53c810_r),state), write64_delegate(FUNC(bebox_state::scsi53c810_w),state)); |
1045 | 1031 | } |
1046 | 1032 | } |
1047 | 1033 | break; |
trunk/src/mess/drivers/bebox.c
r18264 | r18265 | |
37 | 37 | #include "formats/pc_dsk.h" |
38 | 38 | #include "machine/ram.h" |
39 | 39 | |
40 | | static READ8_HANDLER(at_dma8237_1_r) { return i8237_r(space.machine().device("dma8237_2"), space, offset / 2); } |
41 | | static WRITE8_HANDLER(at_dma8237_1_w) { i8237_w(space.machine().device("dma8237_2"), space, offset / 2, data); } |
| 40 | READ8_MEMBER(bebox_state::at_dma8237_1_r) { return i8237_r(machine().device("dma8237_2"), space, offset / 2); } |
| 41 | WRITE8_MEMBER(bebox_state::at_dma8237_1_w) { i8237_w(machine().device("dma8237_2"), space, offset / 2, data); } |
42 | 42 | |
43 | 43 | static ADDRESS_MAP_START( bebox_mem, AS_PROGRAM, 64, bebox_state ) |
44 | | AM_RANGE(0x7FFFF0F0, 0x7FFFF0F7) AM_READWRITE_LEGACY(bebox_cpu0_imask_r, bebox_cpu0_imask_w ) |
45 | | AM_RANGE(0x7FFFF1F0, 0x7FFFF1F7) AM_READWRITE_LEGACY(bebox_cpu1_imask_r, bebox_cpu1_imask_w ) |
46 | | AM_RANGE(0x7FFFF2F0, 0x7FFFF2F7) AM_READ_LEGACY(bebox_interrupt_sources_r ) |
47 | | AM_RANGE(0x7FFFF3F0, 0x7FFFF3F7) AM_READWRITE_LEGACY(bebox_crossproc_interrupts_r, bebox_crossproc_interrupts_w ) |
48 | | AM_RANGE(0x7FFFF4F0, 0x7FFFF4F7) AM_WRITE_LEGACY(bebox_processor_resets_w ) |
| 44 | AM_RANGE(0x7FFFF0F0, 0x7FFFF0F7) AM_READWRITE(bebox_cpu0_imask_r, bebox_cpu0_imask_w ) |
| 45 | AM_RANGE(0x7FFFF1F0, 0x7FFFF1F7) AM_READWRITE(bebox_cpu1_imask_r, bebox_cpu1_imask_w ) |
| 46 | AM_RANGE(0x7FFFF2F0, 0x7FFFF2F7) AM_READ(bebox_interrupt_sources_r ) |
| 47 | AM_RANGE(0x7FFFF3F0, 0x7FFFF3F7) AM_READWRITE(bebox_crossproc_interrupts_r, bebox_crossproc_interrupts_w ) |
| 48 | AM_RANGE(0x7FFFF4F0, 0x7FFFF4F7) AM_WRITE(bebox_processor_resets_w ) |
49 | 49 | |
50 | 50 | AM_RANGE(0x80000000, 0x8000001F) AM_DEVREADWRITE8_LEGACY("dma8237_1", i8237_r, i8237_w, U64(0xffffffffffffffff) ) |
51 | 51 | AM_RANGE(0x80000020, 0x8000003F) AM_DEVREADWRITE8_LEGACY("pic8259_master", pic8259_r, pic8259_w, U64(0xffffffffffffffff) ) |
52 | 52 | AM_RANGE(0x80000040, 0x8000005f) AM_DEVREADWRITE8_LEGACY("pit8254", pit8253_r, pit8253_w, U64(0xffffffffffffffff) ) |
53 | 53 | AM_RANGE(0x80000060, 0x8000006F) AM_READWRITE8_LEGACY(kbdc8042_8_r, kbdc8042_8_w, U64(0xffffffffffffffff) ) |
54 | 54 | AM_RANGE(0x80000070, 0x8000007F) AM_DEVREADWRITE8("rtc", mc146818_device, read, write , U64(0xffffffffffffffff) ) |
55 | | AM_RANGE(0x80000080, 0x8000009F) AM_READWRITE8_LEGACY(bebox_page_r, bebox_page_w, U64(0xffffffffffffffff) ) |
| 55 | AM_RANGE(0x80000080, 0x8000009F) AM_READWRITE8(bebox_page_r, bebox_page_w, U64(0xffffffffffffffff) ) |
56 | 56 | AM_RANGE(0x800000A0, 0x800000BF) AM_DEVREADWRITE8_LEGACY("pic8259_slave", pic8259_r, pic8259_w, U64(0xffffffffffffffff) ) |
57 | | AM_RANGE(0x800000C0, 0x800000DF) AM_READWRITE8_LEGACY(at_dma8237_1_r, at_dma8237_1_w, U64(0xffffffffffffffff)) |
58 | | AM_RANGE(0x800001F0, 0x800001F7) AM_READWRITE8_LEGACY(bebox_800001F0_r, bebox_800001F0_w, U64(0xffffffffffffffff) ) |
| 57 | AM_RANGE(0x800000C0, 0x800000DF) AM_READWRITE8(at_dma8237_1_r, at_dma8237_1_w, U64(0xffffffffffffffff)) |
| 58 | AM_RANGE(0x800001F0, 0x800001F7) AM_READWRITE8(bebox_800001F0_r, bebox_800001F0_w, U64(0xffffffffffffffff) ) |
59 | 59 | AM_RANGE(0x800002F8, 0x800002FF) AM_DEVREADWRITE8( "ns16550_1", ns16550_device, ins8250_r, ins8250_w, U64(0xffffffffffffffff) ) |
60 | 60 | AM_RANGE(0x80000380, 0x80000387) AM_DEVREADWRITE8( "ns16550_2", ns16550_device, ins8250_r, ins8250_w, U64(0xffffffffffffffff) ) |
61 | 61 | AM_RANGE(0x80000388, 0x8000038F) AM_DEVREADWRITE8( "ns16550_3", ns16550_device, ins8250_r, ins8250_w, U64(0xffffffffffffffff) ) |
62 | 62 | AM_RANGE(0x800003b0, 0x800003bf) AM_DEVREADWRITE8("vga", cirrus_vga_device, port_03b0_r, port_03b0_w, U64(0xffffffffffffffff)) |
63 | 63 | AM_RANGE(0x800003c0, 0x800003cf) AM_DEVREADWRITE8("vga", cirrus_vga_device, port_03c0_r, port_03c0_w, U64(0xffffffffffffffff)) |
64 | 64 | AM_RANGE(0x800003d0, 0x800003df) AM_DEVREADWRITE8("vga", cirrus_vga_device, port_03d0_r, port_03d0_w, U64(0xffffffffffffffff)) |
65 | | AM_RANGE(0x800003F0, 0x800003F7) AM_READWRITE_LEGACY(bebox_800003F0_r, bebox_800003F0_w ) |
| 65 | AM_RANGE(0x800003F0, 0x800003F7) AM_READWRITE(bebox_800003F0_r, bebox_800003F0_w ) |
66 | 66 | AM_RANGE(0x800003F8, 0x800003FF) AM_DEVREADWRITE8( "ns16550_0",ns16550_device, ins8250_r, ins8250_w, U64(0xffffffffffffffff) ) |
67 | | AM_RANGE(0x80000480, 0x8000048F) AM_READWRITE8_LEGACY(bebox_80000480_r, bebox_80000480_w, U64(0xffffffffffffffff) ) |
| 67 | AM_RANGE(0x80000480, 0x8000048F) AM_READWRITE8(bebox_80000480_r, bebox_80000480_w, U64(0xffffffffffffffff) ) |
68 | 68 | AM_RANGE(0x80000CF8, 0x80000CFF) AM_DEVREADWRITE("pcibus", pci_bus_device, read_64be, write_64be ) |
69 | 69 | //AM_RANGE(0x800042E8, 0x800042EF) AM_DEVWRITE8_LEGACY("cirrus", cirrus_42E8_w, U64(0xffffffffffffffff) ) |
70 | 70 | |
71 | | AM_RANGE(0xBFFFFFF0, 0xBFFFFFFF) AM_READ_LEGACY(bebox_interrupt_ack_r ) |
| 71 | AM_RANGE(0xBFFFFFF0, 0xBFFFFFFF) AM_READ(bebox_interrupt_ack_r ) |
72 | 72 | AM_RANGE(0xC00A0000, 0XC00BFFFF) AM_DEVREADWRITE8("vga", cirrus_vga_device, mem_r, mem_w, U64(0xffffffffffffffff) ) |
73 | 73 | AM_RANGE(0xC1000000, 0XC11FFFFF) AM_DEVREADWRITE8("vga", cirrus_vga_device, mem_linear_r, mem_linear_w, U64(0xffffffffffffffff) ) |
74 | 74 | AM_RANGE(0xFFF00000, 0xFFF03FFF) AM_ROMBANK("bank2") |
75 | | AM_RANGE(0xFFF04000, 0xFFFFFFFF) AM_READWRITE8_LEGACY(bebox_flash_r, bebox_flash_w, U64(0xffffffffffffffff) ) |
| 75 | AM_RANGE(0xFFF04000, 0xFFFFFFFF) AM_READWRITE8(bebox_flash_r, bebox_flash_w, U64(0xffffffffffffffff) ) |
76 | 76 | ADDRESS_MAP_END |
77 | 77 | |
78 | 78 | // The following is a gross hack to let the BeBox boot ROM identify the processors correctly. |
79 | 79 | // This needs to be done in a better way if someone comes up with one. |
80 | 80 | |
81 | | static READ64_HANDLER(bb_slave_64be_r) |
| 81 | READ64_MEMBER(bebox_state::bb_slave_64be_r) |
82 | 82 | { |
83 | | pci_bus_device *device = space.machine().device<pci_bus_device>("pcibus"); |
| 83 | pci_bus_device *device = machine().device<pci_bus_device>("pcibus"); |
84 | 84 | |
85 | 85 | // 2e94 is the real address, 2e84 is where the PC appears to be under full DRC |
86 | 86 | if ((space.device().safe_pc() == 0xfff02e94) || (space.device().safe_pc() == 0xfff02e84)) |
r18264 | r18265 | |
92 | 92 | } |
93 | 93 | |
94 | 94 | static ADDRESS_MAP_START( bebox_slave_mem, AS_PROGRAM, 64, bebox_state ) |
95 | | AM_RANGE(0x80000cf8, 0x80000cff) AM_READ_LEGACY(bb_slave_64be_r) |
| 95 | AM_RANGE(0x80000cf8, 0x80000cff) AM_READ(bb_slave_64be_r) |
96 | 96 | AM_RANGE(0x80000cf8, 0x80000cff) AM_DEVWRITE("pcibus", pci_bus_device, write_64be ) |
97 | 97 | AM_IMPORT_FROM(bebox_mem) |
98 | 98 | ADDRESS_MAP_END |