qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

next-cube.c (29934B)


      1 /*
      2  * NeXT Cube System Driver
      3  *
      4  * Copyright (c) 2011 Bryce Lanham
      5  *
      6  * This code is free software; you can redistribute it and/or modify
      7  * it under the terms of the GNU General Public License as published
      8  * by the Free Software Foundation; either version 2 of the License,
      9  * or (at your option) any later version.
     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" /* ZILOG 8530 Serial Emulation */
     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 /* #define DEBUG_NEXT */
     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")
     40 OBJECT_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 
     46 typedef 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 
     63 typedef 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 
     72 struct NeXTState {
     73     MachineState parent;
     74 
     75     next_dma dma[10];
     76 };
     77 
     78 #define TYPE_NEXT_PC "next-pc"
     79 OBJECT_DECLARE_SIMPLE_TYPE(NeXTPC, NEXT_PC)
     80 
     81 /* NeXT Peripheral Controller */
     82 struct 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 /* Thanks to NeXT forums for this */
    101 /*
    102 static const uint8_t rtc_ram3[32] = {
    103     0x94, 0x0f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
    104     0x00, 0x00, 0xfb, 0x6d, 0x00, 0x00, 0x7B, 0x00,
    105     0x00, 0x00, 0x65, 0x6e, 0x00, 0x00, 0x00, 0x00,
    106     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x13
    107 };
    108 */
    109 static 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 
    120 static 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         /* DPRINTF("RTC %x phase %i\n", scr2_2, phase); */
    145         if (phase == -1) {
    146             phase = 0;
    147         }
    148         /* If we are in going down clock... do something */
    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                 /* if we read RAM register, output RT_DATA bit */
    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                 /* read the status 0x30 */
    170                 if (rtc->command == 0x30) {
    171                     scr2_2 = scr2_2 & (~SCR2_RTDATA);
    172                     /* for now status = 0x98 (new rtc + FTU) */
    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                 /* read the status 0x31 */
    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                     /* for now 0x00 */
    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                 /* write to x30 register */
    234                 if (rtc->command == 0xB1) {
    235                     /* clear FTU */
    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         /* else end or abort */
    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 
    254 static 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 
    284 static 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 
    293 static uint32_t mmio_readl(NeXTPC *s, hwaddr addr)
    294 {
    295     switch (addr) {
    296     case 0x7000:
    297         /* DPRINTF("Read INT status: %x\n", s->int_status); */
    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 
    316 static 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 
    328 static void mmio_writew(NeXTPC *s, hwaddr addr, uint32_t val)
    329 {
    330     DPRINTF("MMIO Write W\n");
    331 }
    332 
    333 static 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 
    356 static 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 
    372 static 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 
    392 static 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 
    400 static 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      * These 4 registers are the hardware timer, not sure which register
    416      * is the latch instead of data, but no problems so far
    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         /* Hack: We need to have this change consistently to make it work */
    426         return 0xFF & clock();
    427 
    428     default:
    429         DPRINTF("BMAP Read B @ %x\n", (unsigned int)addr);
    430         return 0;
    431     }
    432 }
    433 
    434 static uint32_t scr_readw(NeXTPC *s, hwaddr addr)
    435 {
    436     DPRINTF("BMAP Read W @ %x\n", (unsigned int)addr);
    437     return 0;
    438 }
    439 
    440 static 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  /* reset scsi dma */
    448 #define SCSICSR_FIFOFL  0x04
    449 #define SCSICSR_DMADIR  0x08  /* if set, scsi to mem */
    450 #define SCSICSR_CPUDMA  0x10  /* if set, dma enabled */
    451 #define SCSICSR_INTMASK 0x20  /* if set, interrupt enabled */
    452 
    453 static 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             /* qemu_irq_raise(s->fd_irq[0]); */
    461         }
    462         break;
    463     case 0x14020: /* SCSI Control Register */
    464         if (value & SCSICSR_FIFOFL) {
    465             DPRINTF("SCSICSR FIFO Flush\n");
    466             /* will have to add another irq to the esp if this is needed */
    467             /* esp_puflush_fifo(esp_g); */
    468             /* qemu_irq_pulse(s->scsi_dma); */
    469         }
    470 
    471         if (value & SCSICSR_ENABLE) {
    472             DPRINTF("SCSICSR Enable\n");
    473             /*
    474              * qemu_irq_raise(s->scsi_dma);
    475              * s->scsi_csr_1 = 0xc0;
    476              * s->scsi_csr_1 |= 0x1;
    477              * qemu_irq_pulse(s->scsi_dma);
    478              */
    479         }
    480         /*
    481          * else
    482          *     s->scsi_csr_1 &= ~SCSICSR_ENABLE;
    483          */
    484 
    485         if (value & SCSICSR_RESET) {
    486             DPRINTF("SCSICSR Reset\n");
    487             /* I think this should set DMADIR. CPUDMA and INTMASK to 0 */
    488             /* qemu_irq_raise(s->scsi_reset); */
    489             /* s->scsi_csr_1 &= ~(SCSICSR_INTMASK |0x80|0x1); */
    490 
    491         }
    492         if (value & SCSICSR_DMADIR) {
    493             DPRINTF("SCSICSR DMAdir\n");
    494         }
    495         if (value & SCSICSR_CPUDMA) {
    496             DPRINTF("SCSICSR CPUDMA\n");
    497             /* qemu_irq_raise(s->scsi_dma); */
    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              * int_mask &= ~0x1000;
    507              * s->scsi_csr_1 |= value;
    508              * s->scsi_csr_1 &= ~SCSICSR_INTMASK;
    509              * if (s->scsi_queued) {
    510              *     s->scsi_queued = 0;
    511              *     next_irq(s, NEXT_SCSI_I, level);
    512              * }
    513              */
    514         } else {
    515             /* int_mask |= 0x1000; */
    516         }
    517         if (value & 0x80) {
    518             /* int_mask |= 0x1000; */
    519             /* s->scsi_csr_1 |= 0x80; */
    520         }
    521         DPRINTF("SCSICSR Write: %x\n", value);
    522         /* s->scsi_csr_1 = value; */
    523         return;
    524     /* Hardware timer latch - not implemented yet */
    525     case 0x1a000:
    526     default:
    527         DPRINTF("BMAP Write B @ %x with %x\n", (unsigned int)addr, value);
    528     }
    529 }
    530 
    531 static 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 
    536 static 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 
    541 static 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 
    557 static 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 
    577 static 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 
    597 static 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             /* DPRINTF("SCSI DMA ENABLE\n"); */
    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         /* DPRINTF("RXCSR \tWrite: %x\n",value); */
    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             /* DPRINTF("SCSI DMA ENABLE\n"); */
    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             /* DPRINTF("SCSI DMA RESET\n"); */
    653         }
    654         /* DPRINTF("RXCSR \tWrite: %x\n",value); */
    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 
    682 static 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      * once the csr's are done, subtract 0x3FEC from the addr, and that will
    717      * normalize the upper registers
    718      */
    719 }
    720 
    721 static 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 
    730 static 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     /* first switch sets interupt status */
    737     /* DPRINTF("IRQ %i\n",number); */
    738     switch (number) {
    739     /* level 3 - floppy, kbd/mouse, power, ether rx/tx, scsi, clock */
    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     /* level 5 - scc (serial) */
    763     case NEXT_SCC_I:
    764         shift = 17;
    765         break;
    766 
    767     /* level 6 - audio etherrx/tx dma */
    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      * this HAS to be wrong, the interrupt handlers in mach and together
    787      * int_status and int_mask and return if there is a hit
    788      */
    789     if (s->int_mask & (1 << shift)) {
    790         DPRINTF("%x interrupt masked @ %x\n", 1 << shift, cpu->env.pc);
    791         /* return; */
    792     }
    793 
    794     /* second switch triggers the correct interrupt */
    795     if (level) {
    796         s->int_status |= 1 << shift;
    797 
    798         switch (number) {
    799         /* level 3 - floppy, kbd/mouse, power, ether rx/tx, scsi, clock */
    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         /* level 5 - scc (serial) */
    811         case NEXT_SCC_I:
    812             m68k_set_irq_level(cpu, 5, 29);
    813             break;
    814 
    815         /* level 6 - audio etherrx/tx dma */
    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 
    830 static 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 
    852 static void next_pc_reset(DeviceState *dev)
    853 {
    854     NeXTPC *s = NEXT_PC(dev);
    855 
    856     /* Set internal registers to initial values */
    857     /*     0x0000XX00 << vital bits */
    858     s->scr1 = 0x00011102;
    859     s->scr2 = 0x00ff0c80;
    860 
    861     s->rtc.status = 0x90;
    862 
    863     /* Load RTC RAM - TODO: provide possibility to load contents from file */
    864     memcpy(s->rtc.ram, rtc_ram2, 32);
    865 }
    866 
    867 static 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  * If the m68k CPU implemented its inbound irq lines as GPIO lines
    884  * rather than via the m68k_set_irq_level() function we would not need
    885  * this cpu link property and could instead provide outbound IRQ lines
    886  * that the board could wire up to the CPU.
    887  */
    888 static Property next_pc_properties[] = {
    889     DEFINE_PROP_LINK("cpu", NeXTPC, cpu, TYPE_M68K_CPU, M68kCPU *),
    890     DEFINE_PROP_END_OF_LIST(),
    891 };
    892 
    893 static 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 
    908 static 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 
    924 static 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 
    935 static 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 
    942 static 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     /* Initialize the cpu core */
    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     /* Initialize CPU registers.  */
    964     env->vbr = 0;
    965     env->sr  = 0x2700;
    966 
    967     /* Peripheral Controller */
    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     /* 64MB RAM starting at 0x04000000  */
    973     memory_region_add_subregion(sysmem, 0x04000000, machine->ram);
    974 
    975     /* Framebuffer */
    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     /* MMIO */
    981     sysbus_mmio_map(SYS_BUS_DEVICE(pcdev), 0, 0x02000000);
    982 
    983     /* BMAP IO - acts as a catch-all for now */
    984     sysbus_mmio_map(SYS_BUS_DEVICE(pcdev), 1, 0x02100000);
    985 
    986     /* BMAP memory */
    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     /* The Rev_2.5_v66.bin firmware accesses it at 0x820c0020, too */
    991     memory_region_init_alias(bmapm2, NULL, "next.bmapmem2", bmapm1, 0x0, 64);
    992     memory_region_add_subregion(sysmem, 0x820c0000, bmapm2);
    993 
    994     /* KBD */
    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     /* Load ROM here */
   1000     /* still not sure if the rom should also be mapped at 0x0*/
   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         /* Initial PC is always at offset 4 in firmware binaries */
   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     /* Serial */
   1021     next_escc_init(pcdev);
   1022 
   1023     /* TODO: */
   1024     /* Network */
   1025     /* SCSI */
   1026 
   1027     /* DMA */
   1028     memory_region_init_io(dmamem, NULL, &dma_ops, machine, "next.dma", 0x5000);
   1029     memory_region_add_subregion(sysmem, 0x02000000, dmamem);
   1030 }
   1031 
   1032 static 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 
   1043 static 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 
   1050 static void next_register_type(void)
   1051 {
   1052     type_register_static(&next_typeinfo);
   1053     type_register_static(&next_pc_info);
   1054 }
   1055 
   1056 type_init(next_register_type)