1
2
3
4
5
6
7
8
9
10
11
12#include "qemu/osdep.h"
13#include "exec/hwaddr.h"
14#include "sysemu/sysemu.h"
15#include "sysemu/qtest.h"
16#include "hw/irq.h"
17#include "hw/m68k/next-cube.h"
18#include "hw/boards.h"
19#include "hw/loader.h"
20#include "hw/scsi/esp.h"
21#include "hw/sysbus.h"
22#include "qom/object.h"
23#include "hw/char/escc.h"
24#include "hw/block/fdc.h"
25#include "hw/qdev-properties.h"
26#include "qapi/error.h"
27#include "ui/console.h"
28#include "target/m68k/cpu.h"
29#include "migration/vmstate.h"
30
31
32#ifdef DEBUG_NEXT
33#define DPRINTF(fmt, ...) \
34 do { printf("NeXT: " fmt , ## __VA_ARGS__); } while (0)
35#else
36#define DPRINTF(fmt, ...) do { } while (0)
37#endif
38
39#define TYPE_NEXT_MACHINE MACHINE_TYPE_NAME("next-cube")
40OBJECT_DECLARE_SIMPLE_TYPE(NeXTState, NEXT_MACHINE)
41
42#define ENTRY 0x0100001e
43#define RAM_SIZE 0x4000000
44#define ROM_FILE "Rev_2.5_v66.bin"
45
46typedef struct next_dma {
47 uint32_t csr;
48
49 uint32_t saved_next;
50 uint32_t saved_limit;
51 uint32_t saved_start;
52 uint32_t saved_stop;
53
54 uint32_t next;
55 uint32_t limit;
56 uint32_t start;
57 uint32_t stop;
58
59 uint32_t next_initbuf;
60 uint32_t size;
61} next_dma;
62
63typedef struct NextRtc {
64 uint8_t ram[32];
65 uint8_t command;
66 uint8_t value;
67 uint8_t status;
68 uint8_t control;
69 uint8_t retval;
70} NextRtc;
71
72struct NeXTState {
73 MachineState parent;
74
75 next_dma dma[10];
76};
77
78#define TYPE_NEXT_PC "next-pc"
79OBJECT_DECLARE_SIMPLE_TYPE(NeXTPC, NEXT_PC)
80
81
82struct NeXTPC {
83 SysBusDevice parent_obj;
84
85 M68kCPU *cpu;
86
87 MemoryRegion mmiomem;
88 MemoryRegion scrmem;
89
90 uint32_t scr1;
91 uint32_t scr2;
92 uint8_t scsi_csr_1;
93 uint8_t scsi_csr_2;
94 uint32_t int_mask;
95 uint32_t int_status;
96
97 NextRtc rtc;
98};
99
100
101
102
103
104
105
106
107
108
109static const uint8_t rtc_ram2[32] = {
110 0x94, 0x0f, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00,
111 0x00, 0x00, 0xfb, 0x6d, 0x00, 0x00, 0x4b, 0x00,
112 0x41, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
113 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x7e,
114};
115
116#define SCR2_RTCLK 0x2
117#define SCR2_RTDATA 0x4
118#define SCR2_TOBCD(x) (((x / 10) << 4) + (x % 10))
119
120static void nextscr2_write(NeXTPC *s, uint32_t val, int size)
121{
122 static int led;
123 static int phase;
124 static uint8_t old_scr2;
125 uint8_t scr2_2;
126 NextRtc *rtc = &s->rtc;
127
128 if (size == 4) {
129 scr2_2 = (val >> 8) & 0xFF;
130 } else {
131 scr2_2 = val & 0xFF;
132 }
133
134 if (val & 0x1) {
135 DPRINTF("fault!\n");
136 led++;
137 if (led == 10) {
138 DPRINTF("LED flashing, possible fault!\n");
139 led = 0;
140 }
141 }
142
143 if (scr2_2 & 0x1) {
144
145 if (phase == -1) {
146 phase = 0;
147 }
148
149 if (((old_scr2 & SCR2_RTCLK) != (scr2_2 & SCR2_RTCLK)) &&
150 ((scr2_2 & SCR2_RTCLK) == 0)) {
151 if (phase < 8) {
152 rtc->command = (rtc->command << 1) |
153 ((scr2_2 & SCR2_RTDATA) ? 1 : 0);
154 }
155 if (phase >= 8 && phase < 16) {
156 rtc->value = (rtc->value << 1) |
157 ((scr2_2 & SCR2_RTDATA) ? 1 : 0);
158
159
160 if (rtc->command <= 0x1F) {
161 scr2_2 = scr2_2 & (~SCR2_RTDATA);
162 if (rtc->ram[rtc->command] & (0x80 >> (phase - 8))) {
163 scr2_2 |= SCR2_RTDATA;
164 }
165
166 rtc->retval = (rtc->retval << 1) |
167 ((scr2_2 & SCR2_RTDATA) ? 1 : 0);
168 }
169
170 if (rtc->command == 0x30) {
171 scr2_2 = scr2_2 & (~SCR2_RTDATA);
172
173 if (rtc->status & (0x80 >> (phase - 8))) {
174 scr2_2 |= SCR2_RTDATA;
175 }
176
177 rtc->retval = (rtc->retval << 1) |
178 ((scr2_2 & SCR2_RTDATA) ? 1 : 0);
179 }
180
181 if (rtc->command == 0x31) {
182 scr2_2 = scr2_2 & (~SCR2_RTDATA);
183 if (rtc->control & (0x80 >> (phase - 8))) {
184 scr2_2 |= SCR2_RTDATA;
185 }
186 rtc->retval = (rtc->retval << 1) |
187 ((scr2_2 & SCR2_RTDATA) ? 1 : 0);
188 }
189
190 if ((rtc->command >= 0x20) && (rtc->command <= 0x2F)) {
191 scr2_2 = scr2_2 & (~SCR2_RTDATA);
192
193 time_t time_h = time(NULL);
194 struct tm *info = localtime(&time_h);
195 int ret = 0;
196
197 switch (rtc->command) {
198 case 0x20:
199 ret = SCR2_TOBCD(info->tm_sec);
200 break;
201 case 0x21:
202 ret = SCR2_TOBCD(info->tm_min);
203 break;
204 case 0x22:
205 ret = SCR2_TOBCD(info->tm_hour);
206 break;
207 case 0x24:
208 ret = SCR2_TOBCD(info->tm_mday);
209 break;
210 case 0x25:
211 ret = SCR2_TOBCD((info->tm_mon + 1));
212 break;
213 case 0x26:
214 ret = SCR2_TOBCD((info->tm_year - 100));
215 break;
216
217 }
218
219 if (ret & (0x80 >> (phase - 8))) {
220 scr2_2 |= SCR2_RTDATA;
221 }
222 rtc->retval = (rtc->retval << 1) |
223 ((scr2_2 & SCR2_RTDATA) ? 1 : 0);
224 }
225
226 }
227
228 phase++;
229 if (phase == 16) {
230 if (rtc->command >= 0x80 && rtc->command <= 0x9F) {
231 rtc->ram[rtc->command - 0x80] = rtc->value;
232 }
233
234 if (rtc->command == 0xB1) {
235
236 if (rtc->value & 0x04) {
237 rtc->status = rtc->status & (~0x18);
238 s->int_status = s->int_status & (~0x04);
239 }
240 }
241 }
242 }
243 } else {
244
245 phase = -1;
246 rtc->command = 0;
247 rtc->value = 0;
248 }
249 s->scr2 = val & 0xFFFF00FF;
250 s->scr2 |= scr2_2 << 8;
251 old_scr2 = scr2_2;
252}
253
254static uint32_t mmio_readb(NeXTPC *s, hwaddr addr)
255{
256 switch (addr) {
257 case 0xc000:
258 return (s->scr1 >> 24) & 0xFF;
259 case 0xc001:
260 return (s->scr1 >> 16) & 0xFF;
261 case 0xc002:
262 return (s->scr1 >> 8) & 0xFF;
263 case 0xc003:
264 return (s->scr1 >> 0) & 0xFF;
265
266 case 0xd000:
267 return (s->scr2 >> 24) & 0xFF;
268 case 0xd001:
269 return (s->scr2 >> 16) & 0xFF;
270 case 0xd002:
271 return (s->scr2 >> 8) & 0xFF;
272 case 0xd003:
273 return (s->scr2 >> 0) & 0xFF;
274 case 0x14020:
275 DPRINTF("MMIO Read 0x4020\n");
276 return 0x7f;
277
278 default:
279 DPRINTF("MMIO Read B @ %"HWADDR_PRIx"\n", addr);
280 return 0x0;
281 }
282}
283
284static uint32_t mmio_readw(NeXTPC *s, hwaddr addr)
285{
286 switch (addr) {
287 default:
288 DPRINTF("MMIO Read W @ %"HWADDR_PRIx"\n", addr);
289 return 0x0;
290 }
291}
292
293static uint32_t mmio_readl(NeXTPC *s, hwaddr addr)
294{
295 switch (addr) {
296 case 0x7000:
297
298 return s->int_status;
299
300 case 0x7800:
301 DPRINTF("MMIO Read INT mask: %x\n", s->int_mask);
302 return s->int_mask;
303
304 case 0xc000:
305 return s->scr1;
306
307 case 0xd000:
308 return s->scr2;
309
310 default:
311 DPRINTF("MMIO Read L @ %"HWADDR_PRIx"\n", addr);
312 return 0x0;
313 }
314}
315
316static void mmio_writeb(NeXTPC *s, hwaddr addr, uint32_t val)
317{
318 switch (addr) {
319 case 0xd003:
320 nextscr2_write(s, val, 1);
321 break;
322 default:
323 DPRINTF("MMIO Write B @ %x with %x\n", (unsigned int)addr, val);
324 }
325
326}
327
328static void mmio_writew(NeXTPC *s, hwaddr addr, uint32_t val)
329{
330 DPRINTF("MMIO Write W\n");
331}
332
333static void mmio_writel(NeXTPC *s, hwaddr addr, uint32_t val)
334{
335 switch (addr) {
336 case 0x7000:
337 DPRINTF("INT Status old: %x new: %x\n", s->int_status, val);
338 s->int_status = val;
339 break;
340 case 0x7800:
341 DPRINTF("INT Mask old: %x new: %x\n", s->int_mask, val);
342 s->int_mask = val;
343 break;
344 case 0xc000:
345 DPRINTF("SCR1 Write: %x\n", val);
346 break;
347 case 0xd000:
348 nextscr2_write(s, val, 4);
349 break;
350
351 default:
352 DPRINTF("MMIO Write l @ %x with %x\n", (unsigned int)addr, val);
353 }
354}
355
356static uint64_t mmio_readfn(void *opaque, hwaddr addr, unsigned size)
357{
358 NeXTPC *s = NEXT_PC(opaque);
359
360 switch (size) {
361 case 1:
362 return mmio_readb(s, addr);
363 case 2:
364 return mmio_readw(s, addr);
365 case 4:
366 return mmio_readl(s, addr);
367 default:
368 g_assert_not_reached();
369 }
370}
371
372static void mmio_writefn(void *opaque, hwaddr addr, uint64_t value,
373 unsigned size)
374{
375 NeXTPC *s = NEXT_PC(opaque);
376
377 switch (size) {
378 case 1:
379 mmio_writeb(s, addr, value);
380 break;
381 case 2:
382 mmio_writew(s, addr, value);
383 break;
384 case 4:
385 mmio_writel(s, addr, value);
386 break;
387 default:
388 g_assert_not_reached();
389 }
390}
391
392static const MemoryRegionOps mmio_ops = {
393 .read = mmio_readfn,
394 .write = mmio_writefn,
395 .valid.min_access_size = 1,
396 .valid.max_access_size = 4,
397 .endianness = DEVICE_NATIVE_ENDIAN,
398};
399
400static uint32_t scr_readb(NeXTPC *s, hwaddr addr)
401{
402 switch (addr) {
403 case 0x14108:
404 DPRINTF("FD read @ %x\n", (unsigned int)addr);
405 return 0x40 | 0x04 | 0x2 | 0x1;
406 case 0x14020:
407 DPRINTF("SCSI 4020 STATUS READ %X\n", s->scsi_csr_1);
408 return s->scsi_csr_1;
409
410 case 0x14021:
411 DPRINTF("SCSI 4021 STATUS READ %X\n", s->scsi_csr_2);
412 return 0x40;
413
414
415
416
417
418 case 0x1a000:
419 return 0xff & (clock() >> 24);
420 case 0x1a001:
421 return 0xff & (clock() >> 16);
422 case 0x1a002:
423 return 0xff & (clock() >> 8);
424 case 0x1a003:
425
426 return 0xFF & clock();
427
428 default:
429 DPRINTF("BMAP Read B @ %x\n", (unsigned int)addr);
430 return 0;
431 }
432}
433
434static uint32_t scr_readw(NeXTPC *s, hwaddr addr)
435{
436 DPRINTF("BMAP Read W @ %x\n", (unsigned int)addr);
437 return 0;
438}
439
440static uint32_t scr_readl(NeXTPC *s, hwaddr addr)
441{
442 DPRINTF("BMAP Read L @ %x\n", (unsigned int)addr);
443 return 0;
444}
445
446#define SCSICSR_ENABLE 0x01
447#define SCSICSR_RESET 0x02
448#define SCSICSR_FIFOFL 0x04
449#define SCSICSR_DMADIR 0x08
450#define SCSICSR_CPUDMA 0x10
451#define SCSICSR_INTMASK 0x20
452
453static void scr_writeb(NeXTPC *s, hwaddr addr, uint32_t value)
454{
455 switch (addr) {
456 case 0x14108:
457 DPRINTF("FDCSR Write: %x\n", value);
458
459 if (value == 0x0) {
460
461 }
462 break;
463 case 0x14020:
464 if (value & SCSICSR_FIFOFL) {
465 DPRINTF("SCSICSR FIFO Flush\n");
466
467
468
469 }
470
471 if (value & SCSICSR_ENABLE) {
472 DPRINTF("SCSICSR Enable\n");
473
474
475
476
477
478
479 }
480
481
482
483
484
485 if (value & SCSICSR_RESET) {
486 DPRINTF("SCSICSR Reset\n");
487
488
489
490
491 }
492 if (value & SCSICSR_DMADIR) {
493 DPRINTF("SCSICSR DMAdir\n");
494 }
495 if (value & SCSICSR_CPUDMA) {
496 DPRINTF("SCSICSR CPUDMA\n");
497
498
499 s->int_status |= 0x4000000;
500 } else {
501 s->int_status &= ~(0x4000000);
502 }
503 if (value & SCSICSR_INTMASK) {
504 DPRINTF("SCSICSR INTMASK\n");
505
506
507
508
509
510
511
512
513
514 } else {
515
516 }
517 if (value & 0x80) {
518
519
520 }
521 DPRINTF("SCSICSR Write: %x\n", value);
522
523 return;
524
525 case 0x1a000:
526 default:
527 DPRINTF("BMAP Write B @ %x with %x\n", (unsigned int)addr, value);
528 }
529}
530
531static void scr_writew(NeXTPC *s, hwaddr addr, uint32_t value)
532{
533 DPRINTF("BMAP Write W @ %x with %x\n", (unsigned int)addr, value);
534}
535
536static void scr_writel(NeXTPC *s, hwaddr addr, uint32_t value)
537{
538 DPRINTF("BMAP Write L @ %x with %x\n", (unsigned int)addr, value);
539}
540
541static uint64_t scr_readfn(void *opaque, hwaddr addr, unsigned size)
542{
543 NeXTPC *s = NEXT_PC(opaque);
544
545 switch (size) {
546 case 1:
547 return scr_readb(s, addr);
548 case 2:
549 return scr_readw(s, addr);
550 case 4:
551 return scr_readl(s, addr);
552 default:
553 g_assert_not_reached();
554 }
555}
556
557static void scr_writefn(void *opaque, hwaddr addr, uint64_t value,
558 unsigned size)
559{
560 NeXTPC *s = NEXT_PC(opaque);
561
562 switch (size) {
563 case 1:
564 scr_writeb(s, addr, value);
565 break;
566 case 2:
567 scr_writew(s, addr, value);
568 break;
569 case 4:
570 scr_writel(s, addr, value);
571 break;
572 default:
573 g_assert_not_reached();
574 }
575}
576
577static const MemoryRegionOps scr_ops = {
578 .read = scr_readfn,
579 .write = scr_writefn,
580 .valid.min_access_size = 1,
581 .valid.max_access_size = 4,
582 .endianness = DEVICE_NATIVE_ENDIAN,
583};
584
585#define NEXTDMA_SCSI(x) (0x10 + x)
586#define NEXTDMA_FD(x) (0x10 + x)
587#define NEXTDMA_ENTX(x) (0x110 + x)
588#define NEXTDMA_ENRX(x) (0x150 + x)
589#define NEXTDMA_CSR 0x0
590#define NEXTDMA_NEXT 0x4000
591#define NEXTDMA_LIMIT 0x4004
592#define NEXTDMA_START 0x4008
593#define NEXTDMA_STOP 0x400c
594#define NEXTDMA_NEXT_INIT 0x4200
595#define NEXTDMA_SIZE 0x4204
596
597static void dma_writel(void *opaque, hwaddr addr, uint64_t value,
598 unsigned int size)
599{
600 NeXTState *next_state = NEXT_MACHINE(opaque);
601
602 switch (addr) {
603 case NEXTDMA_ENRX(NEXTDMA_CSR):
604 if (value & DMA_DEV2M) {
605 next_state->dma[NEXTDMA_ENRX].csr |= DMA_DEV2M;
606 }
607
608 if (value & DMA_SETENABLE) {
609
610 next_state->dma[NEXTDMA_ENRX].csr |= DMA_ENABLE;
611 }
612 if (value & DMA_SETSUPDATE) {
613 next_state->dma[NEXTDMA_ENRX].csr |= DMA_SUPDATE;
614 }
615 if (value & DMA_CLRCOMPLETE) {
616 next_state->dma[NEXTDMA_ENRX].csr &= ~DMA_COMPLETE;
617 }
618
619 if (value & DMA_RESET) {
620 next_state->dma[NEXTDMA_ENRX].csr &= ~(DMA_COMPLETE | DMA_SUPDATE |
621 DMA_ENABLE | DMA_DEV2M);
622 }
623
624 break;
625 case NEXTDMA_ENRX(NEXTDMA_NEXT_INIT):
626 next_state->dma[NEXTDMA_ENRX].next_initbuf = value;
627 break;
628 case NEXTDMA_ENRX(NEXTDMA_NEXT):
629 next_state->dma[NEXTDMA_ENRX].next = value;
630 break;
631 case NEXTDMA_ENRX(NEXTDMA_LIMIT):
632 next_state->dma[NEXTDMA_ENRX].limit = value;
633 break;
634 case NEXTDMA_SCSI(NEXTDMA_CSR):
635 if (value & DMA_DEV2M) {
636 next_state->dma[NEXTDMA_SCSI].csr |= DMA_DEV2M;
637 }
638 if (value & DMA_SETENABLE) {
639
640 next_state->dma[NEXTDMA_SCSI].csr |= DMA_ENABLE;
641 }
642 if (value & DMA_SETSUPDATE) {
643 next_state->dma[NEXTDMA_SCSI].csr |= DMA_SUPDATE;
644 }
645 if (value & DMA_CLRCOMPLETE) {
646 next_state->dma[NEXTDMA_SCSI].csr &= ~DMA_COMPLETE;
647 }
648
649 if (value & DMA_RESET) {
650 next_state->dma[NEXTDMA_SCSI].csr &= ~(DMA_COMPLETE | DMA_SUPDATE |
651 DMA_ENABLE | DMA_DEV2M);
652
653 }
654
655 break;
656
657 case NEXTDMA_SCSI(NEXTDMA_NEXT):
658 next_state->dma[NEXTDMA_SCSI].next = value;
659 break;
660
661 case NEXTDMA_SCSI(NEXTDMA_LIMIT):
662 next_state->dma[NEXTDMA_SCSI].limit = value;
663 break;
664
665 case NEXTDMA_SCSI(NEXTDMA_START):
666 next_state->dma[NEXTDMA_SCSI].start = value;
667 break;
668
669 case NEXTDMA_SCSI(NEXTDMA_STOP):
670 next_state->dma[NEXTDMA_SCSI].stop = value;
671 break;
672
673 case NEXTDMA_SCSI(NEXTDMA_NEXT_INIT):
674 next_state->dma[NEXTDMA_SCSI].next_initbuf = value;
675 break;
676
677 default:
678 DPRINTF("DMA write @ %x w/ %x\n", (unsigned)addr, (unsigned)value);
679 }
680}
681
682static uint64_t dma_readl(void *opaque, hwaddr addr, unsigned int size)
683{
684 NeXTState *next_state = NEXT_MACHINE(opaque);
685
686 switch (addr) {
687 case NEXTDMA_SCSI(NEXTDMA_CSR):
688 DPRINTF("SCSI DMA CSR READ\n");
689 return next_state->dma[NEXTDMA_SCSI].csr;
690 case NEXTDMA_ENRX(NEXTDMA_CSR):
691 return next_state->dma[NEXTDMA_ENRX].csr;
692 case NEXTDMA_ENRX(NEXTDMA_NEXT_INIT):
693 return next_state->dma[NEXTDMA_ENRX].next_initbuf;
694 case NEXTDMA_ENRX(NEXTDMA_NEXT):
695 return next_state->dma[NEXTDMA_ENRX].next;
696 case NEXTDMA_ENRX(NEXTDMA_LIMIT):
697 return next_state->dma[NEXTDMA_ENRX].limit;
698
699 case NEXTDMA_SCSI(NEXTDMA_NEXT):
700 return next_state->dma[NEXTDMA_SCSI].next;
701 case NEXTDMA_SCSI(NEXTDMA_NEXT_INIT):
702 return next_state->dma[NEXTDMA_SCSI].next_initbuf;
703 case NEXTDMA_SCSI(NEXTDMA_LIMIT):
704 return next_state->dma[NEXTDMA_SCSI].limit;
705 case NEXTDMA_SCSI(NEXTDMA_START):
706 return next_state->dma[NEXTDMA_SCSI].start;
707 case NEXTDMA_SCSI(NEXTDMA_STOP):
708 return next_state->dma[NEXTDMA_SCSI].stop;
709
710 default:
711 DPRINTF("DMA read @ %x\n", (unsigned int)addr);
712 return 0;
713 }
714
715
716
717
718
719}
720
721static const MemoryRegionOps dma_ops = {
722 .read = dma_readl,
723 .write = dma_writel,
724 .impl.min_access_size = 4,
725 .valid.min_access_size = 4,
726 .valid.max_access_size = 4,
727 .endianness = DEVICE_NATIVE_ENDIAN,
728};
729
730static void next_irq(void *opaque, int number, int level)
731{
732 NeXTPC *s = NEXT_PC(opaque);
733 M68kCPU *cpu = s->cpu;
734 int shift = 0;
735
736
737
738 switch (number) {
739
740 case NEXT_FD_I:
741 shift = 7;
742 break;
743 case NEXT_KBD_I:
744 shift = 3;
745 break;
746 case NEXT_PWR_I:
747 shift = 2;
748 break;
749 case NEXT_ENRX_I:
750 shift = 9;
751 break;
752 case NEXT_ENTX_I:
753 shift = 10;
754 break;
755 case NEXT_SCSI_I:
756 shift = 12;
757 break;
758 case NEXT_CLK_I:
759 shift = 5;
760 break;
761
762
763 case NEXT_SCC_I:
764 shift = 17;
765 break;
766
767
768 case NEXT_ENTX_DMA_I:
769 shift = 28;
770 break;
771 case NEXT_ENRX_DMA_I:
772 shift = 27;
773 break;
774 case NEXT_SCSI_DMA_I:
775 shift = 26;
776 break;
777 case NEXT_SND_I:
778 shift = 23;
779 break;
780 case NEXT_SCC_DMA_I:
781 shift = 21;
782 break;
783
784 }
785
786
787
788
789 if (s->int_mask & (1 << shift)) {
790 DPRINTF("%x interrupt masked @ %x\n", 1 << shift, cpu->env.pc);
791
792 }
793
794
795 if (level) {
796 s->int_status |= 1 << shift;
797
798 switch (number) {
799
800 case NEXT_FD_I:
801 case NEXT_KBD_I:
802 case NEXT_PWR_I:
803 case NEXT_ENRX_I:
804 case NEXT_ENTX_I:
805 case NEXT_SCSI_I:
806 case NEXT_CLK_I:
807 m68k_set_irq_level(cpu, 3, 27);
808 break;
809
810
811 case NEXT_SCC_I:
812 m68k_set_irq_level(cpu, 5, 29);
813 break;
814
815
816 case NEXT_ENTX_DMA_I:
817 case NEXT_ENRX_DMA_I:
818 case NEXT_SCSI_DMA_I:
819 case NEXT_SND_I:
820 case NEXT_SCC_DMA_I:
821 m68k_set_irq_level(cpu, 6, 30);
822 break;
823 }
824 } else {
825 s->int_status &= ~(1 << shift);
826 cpu_reset_interrupt(CPU(cpu), CPU_INTERRUPT_HARD);
827 }
828}
829
830static void next_escc_init(DeviceState *pcdev)
831{
832 DeviceState *dev;
833 SysBusDevice *s;
834
835 dev = qdev_new(TYPE_ESCC);
836 qdev_prop_set_uint32(dev, "disabled", 0);
837 qdev_prop_set_uint32(dev, "frequency", 9600 * 384);
838 qdev_prop_set_uint32(dev, "it_shift", 0);
839 qdev_prop_set_bit(dev, "bit_swap", true);
840 qdev_prop_set_chr(dev, "chrB", serial_hd(1));
841 qdev_prop_set_chr(dev, "chrA", serial_hd(0));
842 qdev_prop_set_uint32(dev, "chnBtype", escc_serial);
843 qdev_prop_set_uint32(dev, "chnAtype", escc_serial);
844
845 s = SYS_BUS_DEVICE(dev);
846 sysbus_realize_and_unref(s, &error_fatal);
847 sysbus_connect_irq(s, 0, qdev_get_gpio_in(pcdev, NEXT_SCC_I));
848 sysbus_connect_irq(s, 1, qdev_get_gpio_in(pcdev, NEXT_SCC_DMA_I));
849 sysbus_mmio_map(s, 0, 0x2118000);
850}
851
852static void next_pc_reset(DeviceState *dev)
853{
854 NeXTPC *s = NEXT_PC(dev);
855
856
857
858 s->scr1 = 0x00011102;
859 s->scr2 = 0x00ff0c80;
860
861 s->rtc.status = 0x90;
862
863
864 memcpy(s->rtc.ram, rtc_ram2, 32);
865}
866
867static void next_pc_realize(DeviceState *dev, Error **errp)
868{
869 NeXTPC *s = NEXT_PC(dev);
870 SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
871
872 qdev_init_gpio_in(dev, next_irq, NEXT_NUM_IRQS);
873
874 memory_region_init_io(&s->mmiomem, OBJECT(s), &mmio_ops, s,
875 "next.mmio", 0xD0000);
876 memory_region_init_io(&s->scrmem, OBJECT(s), &scr_ops, s,
877 "next.scr", 0x20000);
878 sysbus_init_mmio(sbd, &s->mmiomem);
879 sysbus_init_mmio(sbd, &s->scrmem);
880}
881
882
883
884
885
886
887
888static Property next_pc_properties[] = {
889 DEFINE_PROP_LINK("cpu", NeXTPC, cpu, TYPE_M68K_CPU, M68kCPU *),
890 DEFINE_PROP_END_OF_LIST(),
891};
892
893static const VMStateDescription next_rtc_vmstate = {
894 .name = "next-rtc",
895 .version_id = 1,
896 .minimum_version_id = 1,
897 .fields = (VMStateField[]) {
898 VMSTATE_UINT8_ARRAY(ram, NextRtc, 32),
899 VMSTATE_UINT8(command, NextRtc),
900 VMSTATE_UINT8(value, NextRtc),
901 VMSTATE_UINT8(status, NextRtc),
902 VMSTATE_UINT8(control, NextRtc),
903 VMSTATE_UINT8(retval, NextRtc),
904 VMSTATE_END_OF_LIST()
905 },
906};
907
908static const VMStateDescription next_pc_vmstate = {
909 .name = "next-pc",
910 .version_id = 1,
911 .minimum_version_id = 1,
912 .fields = (VMStateField[]) {
913 VMSTATE_UINT32(scr1, NeXTPC),
914 VMSTATE_UINT32(scr2, NeXTPC),
915 VMSTATE_UINT32(int_mask, NeXTPC),
916 VMSTATE_UINT32(int_status, NeXTPC),
917 VMSTATE_UINT8(scsi_csr_1, NeXTPC),
918 VMSTATE_UINT8(scsi_csr_2, NeXTPC),
919 VMSTATE_STRUCT(rtc, NeXTPC, 0, next_rtc_vmstate, NextRtc),
920 VMSTATE_END_OF_LIST()
921 },
922};
923
924static void next_pc_class_init(ObjectClass *klass, void *data)
925{
926 DeviceClass *dc = DEVICE_CLASS(klass);
927
928 dc->desc = "NeXT Peripheral Controller";
929 dc->realize = next_pc_realize;
930 dc->reset = next_pc_reset;
931 device_class_set_props(dc, next_pc_properties);
932 dc->vmsd = &next_pc_vmstate;
933}
934
935static const TypeInfo next_pc_info = {
936 .name = TYPE_NEXT_PC,
937 .parent = TYPE_SYS_BUS_DEVICE,
938 .instance_size = sizeof(NeXTPC),
939 .class_init = next_pc_class_init,
940};
941
942static void next_cube_init(MachineState *machine)
943{
944 M68kCPU *cpu;
945 CPUM68KState *env;
946 MemoryRegion *rom = g_new(MemoryRegion, 1);
947 MemoryRegion *dmamem = g_new(MemoryRegion, 1);
948 MemoryRegion *bmapm1 = g_new(MemoryRegion, 1);
949 MemoryRegion *bmapm2 = g_new(MemoryRegion, 1);
950 MemoryRegion *sysmem = get_system_memory();
951 const char *bios_name = machine->firmware ?: ROM_FILE;
952 DeviceState *dev;
953 DeviceState *pcdev;
954
955
956 cpu = M68K_CPU(cpu_create(machine->cpu_type));
957 if (!cpu) {
958 error_report("Unable to find m68k CPU definition");
959 exit(1);
960 }
961 env = &cpu->env;
962
963
964 env->vbr = 0;
965 env->sr = 0x2700;
966
967
968 pcdev = qdev_new(TYPE_NEXT_PC);
969 object_property_set_link(OBJECT(pcdev), "cpu", OBJECT(cpu), &error_abort);
970 sysbus_realize_and_unref(SYS_BUS_DEVICE(pcdev), &error_fatal);
971
972
973 memory_region_add_subregion(sysmem, 0x04000000, machine->ram);
974
975
976 dev = qdev_new(TYPE_NEXTFB);
977 sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
978 sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0x0B000000);
979
980
981 sysbus_mmio_map(SYS_BUS_DEVICE(pcdev), 0, 0x02000000);
982
983
984 sysbus_mmio_map(SYS_BUS_DEVICE(pcdev), 1, 0x02100000);
985
986
987 memory_region_init_ram_flags_nomigrate(bmapm1, NULL, "next.bmapmem", 64,
988 RAM_SHARED, &error_fatal);
989 memory_region_add_subregion(sysmem, 0x020c0000, bmapm1);
990
991 memory_region_init_alias(bmapm2, NULL, "next.bmapmem2", bmapm1, 0x0, 64);
992 memory_region_add_subregion(sysmem, 0x820c0000, bmapm2);
993
994
995 dev = qdev_new(TYPE_NEXTKBD);
996 sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
997 sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0x0200e000);
998
999
1000
1001 memory_region_init_rom(rom, NULL, "next.rom", 0x20000, &error_fatal);
1002 memory_region_add_subregion(sysmem, 0x01000000, rom);
1003 if (load_image_targphys(bios_name, 0x01000000, 0x20000) < 8) {
1004 if (!qtest_enabled()) {
1005 error_report("Failed to load firmware '%s'.", bios_name);
1006 }
1007 } else {
1008 uint8_t *ptr;
1009
1010 ptr = rom_ptr(0x01000004, 4);
1011 g_assert(ptr != NULL);
1012 env->pc = ldl_p(ptr);
1013 if (env->pc >= 0x01020000) {
1014 error_report("'%s' does not seem to be a valid firmware image.",
1015 bios_name);
1016 exit(1);
1017 }
1018 }
1019
1020
1021 next_escc_init(pcdev);
1022
1023
1024
1025
1026
1027
1028 memory_region_init_io(dmamem, NULL, &dma_ops, machine, "next.dma", 0x5000);
1029 memory_region_add_subregion(sysmem, 0x02000000, dmamem);
1030}
1031
1032static void next_machine_class_init(ObjectClass *oc, void *data)
1033{
1034 MachineClass *mc = MACHINE_CLASS(oc);
1035
1036 mc->desc = "NeXT Cube";
1037 mc->init = next_cube_init;
1038 mc->default_ram_size = RAM_SIZE;
1039 mc->default_ram_id = "next.ram";
1040 mc->default_cpu_type = M68K_CPU_TYPE_NAME("m68040");
1041}
1042
1043static const TypeInfo next_typeinfo = {
1044 .name = TYPE_NEXT_MACHINE,
1045 .parent = TYPE_MACHINE,
1046 .class_init = next_machine_class_init,
1047 .instance_size = sizeof(NeXTState),
1048};
1049
1050static void next_register_type(void)
1051{
1052 type_register_static(&next_typeinfo);
1053 type_register_static(&next_pc_info);
1054}
1055
1056type_init(next_register_type)
1057