2
0

next-cube.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985
  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. #include "qemu/osdep.h"
  12. #include "cpu.h"
  13. #include "exec/hwaddr.h"
  14. #include "exec/address-spaces.h"
  15. #include "sysemu/sysemu.h"
  16. #include "sysemu/qtest.h"
  17. #include "hw/irq.h"
  18. #include "hw/m68k/next-cube.h"
  19. #include "hw/boards.h"
  20. #include "hw/loader.h"
  21. #include "hw/scsi/esp.h"
  22. #include "hw/sysbus.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. /* #define DEBUG_NEXT */
  30. #ifdef DEBUG_NEXT
  31. #define DPRINTF(fmt, ...) \
  32. do { printf("NeXT: " fmt , ## __VA_ARGS__); } while (0)
  33. #else
  34. #define DPRINTF(fmt, ...) do { } while (0)
  35. #endif
  36. #define TYPE_NEXT_MACHINE MACHINE_TYPE_NAME("next-cube")
  37. #define NEXT_MACHINE(obj) OBJECT_CHECK(NeXTState, (obj), TYPE_NEXT_MACHINE)
  38. #define ENTRY 0x0100001e
  39. #define RAM_SIZE 0x4000000
  40. #define ROM_FILE "Rev_2.5_v66.bin"
  41. typedef struct next_dma {
  42. uint32_t csr;
  43. uint32_t saved_next;
  44. uint32_t saved_limit;
  45. uint32_t saved_start;
  46. uint32_t saved_stop;
  47. uint32_t next;
  48. uint32_t limit;
  49. uint32_t start;
  50. uint32_t stop;
  51. uint32_t next_initbuf;
  52. uint32_t size;
  53. } next_dma;
  54. typedef struct NextRtc {
  55. uint8_t ram[32];
  56. uint8_t command;
  57. uint8_t value;
  58. uint8_t status;
  59. uint8_t control;
  60. uint8_t retval;
  61. } NextRtc;
  62. typedef struct {
  63. MachineState parent;
  64. uint32_t int_mask;
  65. uint32_t int_status;
  66. uint8_t scsi_csr_1;
  67. uint8_t scsi_csr_2;
  68. next_dma dma[10];
  69. qemu_irq *scsi_irq;
  70. qemu_irq scsi_dma;
  71. qemu_irq scsi_reset;
  72. qemu_irq *fd_irq;
  73. uint32_t scr1;
  74. uint32_t scr2;
  75. NextRtc rtc;
  76. } NeXTState;
  77. /* Thanks to NeXT forums for this */
  78. /*
  79. static const uint8_t rtc_ram3[32] = {
  80. 0x94, 0x0f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
  81. 0x00, 0x00, 0xfb, 0x6d, 0x00, 0x00, 0x7B, 0x00,
  82. 0x00, 0x00, 0x65, 0x6e, 0x00, 0x00, 0x00, 0x00,
  83. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x13
  84. };
  85. */
  86. static const uint8_t rtc_ram2[32] = {
  87. 0x94, 0x0f, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00,
  88. 0x00, 0x00, 0xfb, 0x6d, 0x00, 0x00, 0x4b, 0x00,
  89. 0x41, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
  90. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x7e,
  91. };
  92. #define SCR2_RTCLK 0x2
  93. #define SCR2_RTDATA 0x4
  94. #define SCR2_TOBCD(x) (((x / 10) << 4) + (x % 10))
  95. static void nextscr2_write(NeXTState *s, uint32_t val, int size)
  96. {
  97. static int led;
  98. static int phase;
  99. static uint8_t old_scr2;
  100. uint8_t scr2_2;
  101. NextRtc *rtc = &s->rtc;
  102. if (size == 4) {
  103. scr2_2 = (val >> 8) & 0xFF;
  104. } else {
  105. scr2_2 = val & 0xFF;
  106. }
  107. if (val & 0x1) {
  108. DPRINTF("fault!\n");
  109. led++;
  110. if (led == 10) {
  111. DPRINTF("LED flashing, possible fault!\n");
  112. led = 0;
  113. }
  114. }
  115. if (scr2_2 & 0x1) {
  116. /* DPRINTF("RTC %x phase %i\n", scr2_2, phase); */
  117. if (phase == -1) {
  118. phase = 0;
  119. }
  120. /* If we are in going down clock... do something */
  121. if (((old_scr2 & SCR2_RTCLK) != (scr2_2 & SCR2_RTCLK)) &&
  122. ((scr2_2 & SCR2_RTCLK) == 0)) {
  123. if (phase < 8) {
  124. rtc->command = (rtc->command << 1) |
  125. ((scr2_2 & SCR2_RTDATA) ? 1 : 0);
  126. }
  127. if (phase >= 8 && phase < 16) {
  128. rtc->value = (rtc->value << 1) |
  129. ((scr2_2 & SCR2_RTDATA) ? 1 : 0);
  130. /* if we read RAM register, output RT_DATA bit */
  131. if (rtc->command <= 0x1F) {
  132. scr2_2 = scr2_2 & (~SCR2_RTDATA);
  133. if (rtc->ram[rtc->command] & (0x80 >> (phase - 8))) {
  134. scr2_2 |= SCR2_RTDATA;
  135. }
  136. rtc->retval = (rtc->retval << 1) |
  137. ((scr2_2 & SCR2_RTDATA) ? 1 : 0);
  138. }
  139. /* read the status 0x30 */
  140. if (rtc->command == 0x30) {
  141. scr2_2 = scr2_2 & (~SCR2_RTDATA);
  142. /* for now status = 0x98 (new rtc + FTU) */
  143. if (rtc->status & (0x80 >> (phase - 8))) {
  144. scr2_2 |= SCR2_RTDATA;
  145. }
  146. rtc->retval = (rtc->retval << 1) |
  147. ((scr2_2 & SCR2_RTDATA) ? 1 : 0);
  148. }
  149. /* read the status 0x31 */
  150. if (rtc->command == 0x31) {
  151. scr2_2 = scr2_2 & (~SCR2_RTDATA);
  152. if (rtc->control & (0x80 >> (phase - 8))) {
  153. scr2_2 |= SCR2_RTDATA;
  154. }
  155. rtc->retval = (rtc->retval << 1) |
  156. ((scr2_2 & SCR2_RTDATA) ? 1 : 0);
  157. }
  158. if ((rtc->command >= 0x20) && (rtc->command <= 0x2F)) {
  159. scr2_2 = scr2_2 & (~SCR2_RTDATA);
  160. /* for now 0x00 */
  161. time_t time_h = time(NULL);
  162. struct tm *info = localtime(&time_h);
  163. int ret = 0;
  164. switch (rtc->command) {
  165. case 0x20:
  166. ret = SCR2_TOBCD(info->tm_sec);
  167. break;
  168. case 0x21:
  169. ret = SCR2_TOBCD(info->tm_min);
  170. break;
  171. case 0x22:
  172. ret = SCR2_TOBCD(info->tm_hour);
  173. break;
  174. case 0x24:
  175. ret = SCR2_TOBCD(info->tm_mday);
  176. break;
  177. case 0x25:
  178. ret = SCR2_TOBCD((info->tm_mon + 1));
  179. break;
  180. case 0x26:
  181. ret = SCR2_TOBCD((info->tm_year - 100));
  182. break;
  183. }
  184. if (ret & (0x80 >> (phase - 8))) {
  185. scr2_2 |= SCR2_RTDATA;
  186. }
  187. rtc->retval = (rtc->retval << 1) |
  188. ((scr2_2 & SCR2_RTDATA) ? 1 : 0);
  189. }
  190. }
  191. phase++;
  192. if (phase == 16) {
  193. if (rtc->command >= 0x80 && rtc->command <= 0x9F) {
  194. rtc->ram[rtc->command - 0x80] = rtc->value;
  195. }
  196. /* write to x30 register */
  197. if (rtc->command == 0xB1) {
  198. /* clear FTU */
  199. if (rtc->value & 0x04) {
  200. rtc->status = rtc->status & (~0x18);
  201. s->int_status = s->int_status & (~0x04);
  202. }
  203. }
  204. }
  205. }
  206. } else {
  207. /* else end or abort */
  208. phase = -1;
  209. rtc->command = 0;
  210. rtc->value = 0;
  211. }
  212. s->scr2 = val & 0xFFFF00FF;
  213. s->scr2 |= scr2_2 << 8;
  214. old_scr2 = scr2_2;
  215. }
  216. static uint32_t mmio_readb(NeXTState *s, hwaddr addr)
  217. {
  218. switch (addr) {
  219. case 0xc000:
  220. return (s->scr1 >> 24) & 0xFF;
  221. case 0xc001:
  222. return (s->scr1 >> 16) & 0xFF;
  223. case 0xc002:
  224. return (s->scr1 >> 8) & 0xFF;
  225. case 0xc003:
  226. return (s->scr1 >> 0) & 0xFF;
  227. case 0xd000:
  228. return (s->scr2 >> 24) & 0xFF;
  229. case 0xd001:
  230. return (s->scr2 >> 16) & 0xFF;
  231. case 0xd002:
  232. return (s->scr2 >> 8) & 0xFF;
  233. case 0xd003:
  234. return (s->scr2 >> 0) & 0xFF;
  235. case 0x14020:
  236. DPRINTF("MMIO Read 0x4020\n");
  237. return 0x7f;
  238. default:
  239. DPRINTF("MMIO Read B @ %"HWADDR_PRIx"\n", addr);
  240. return 0x0;
  241. }
  242. }
  243. static uint32_t mmio_readw(NeXTState *s, hwaddr addr)
  244. {
  245. switch (addr) {
  246. default:
  247. DPRINTF("MMIO Read W @ %"HWADDR_PRIx"\n", addr);
  248. return 0x0;
  249. }
  250. }
  251. static uint32_t mmio_readl(NeXTState *s, hwaddr addr)
  252. {
  253. switch (addr) {
  254. case 0x7000:
  255. /* DPRINTF("Read INT status: %x\n", s->int_status); */
  256. return s->int_status;
  257. case 0x7800:
  258. DPRINTF("MMIO Read INT mask: %x\n", s->int_mask);
  259. return s->int_mask;
  260. case 0xc000:
  261. return s->scr1;
  262. case 0xd000:
  263. return s->scr2;
  264. default:
  265. DPRINTF("MMIO Read L @ %"HWADDR_PRIx"\n", addr);
  266. return 0x0;
  267. }
  268. }
  269. static void mmio_writeb(NeXTState *s, hwaddr addr, uint32_t val)
  270. {
  271. switch (addr) {
  272. case 0xd003:
  273. nextscr2_write(s, val, 1);
  274. break;
  275. default:
  276. DPRINTF("MMIO Write B @ %x with %x\n", (unsigned int)addr, val);
  277. }
  278. }
  279. static void mmio_writew(NeXTState *s, hwaddr addr, uint32_t val)
  280. {
  281. DPRINTF("MMIO Write W\n");
  282. }
  283. static void mmio_writel(NeXTState *s, hwaddr addr, uint32_t val)
  284. {
  285. switch (addr) {
  286. case 0x7000:
  287. DPRINTF("INT Status old: %x new: %x\n", s->int_status, val);
  288. s->int_status = val;
  289. break;
  290. case 0x7800:
  291. DPRINTF("INT Mask old: %x new: %x\n", s->int_mask, val);
  292. s->int_mask = val;
  293. break;
  294. case 0xc000:
  295. DPRINTF("SCR1 Write: %x\n", val);
  296. break;
  297. case 0xd000:
  298. nextscr2_write(s, val, 4);
  299. break;
  300. default:
  301. DPRINTF("MMIO Write l @ %x with %x\n", (unsigned int)addr, val);
  302. }
  303. }
  304. static uint64_t mmio_readfn(void *opaque, hwaddr addr, unsigned size)
  305. {
  306. NeXTState *ns = NEXT_MACHINE(opaque);
  307. switch (size) {
  308. case 1:
  309. return mmio_readb(ns, addr);
  310. case 2:
  311. return mmio_readw(ns, addr);
  312. case 4:
  313. return mmio_readl(ns, addr);
  314. default:
  315. g_assert_not_reached();
  316. }
  317. }
  318. static void mmio_writefn(void *opaque, hwaddr addr, uint64_t value,
  319. unsigned size)
  320. {
  321. NeXTState *ns = NEXT_MACHINE(opaque);
  322. switch (size) {
  323. case 1:
  324. mmio_writeb(ns, addr, value);
  325. break;
  326. case 2:
  327. mmio_writew(ns, addr, value);
  328. break;
  329. case 4:
  330. mmio_writel(ns, addr, value);
  331. break;
  332. default:
  333. g_assert_not_reached();
  334. }
  335. }
  336. static const MemoryRegionOps mmio_ops = {
  337. .read = mmio_readfn,
  338. .write = mmio_writefn,
  339. .valid.min_access_size = 1,
  340. .valid.max_access_size = 4,
  341. .endianness = DEVICE_NATIVE_ENDIAN,
  342. };
  343. static uint32_t scr_readb(NeXTState *s, hwaddr addr)
  344. {
  345. switch (addr) {
  346. case 0x14108:
  347. DPRINTF("FD read @ %x\n", (unsigned int)addr);
  348. return 0x40 | 0x04 | 0x2 | 0x1;
  349. case 0x14020:
  350. DPRINTF("SCSI 4020 STATUS READ %X\n", s->scsi_csr_1);
  351. return s->scsi_csr_1;
  352. case 0x14021:
  353. DPRINTF("SCSI 4021 STATUS READ %X\n", s->scsi_csr_2);
  354. return 0x40;
  355. /*
  356. * These 4 registers are the hardware timer, not sure which register
  357. * is the latch instead of data, but no problems so far
  358. */
  359. case 0x1a000:
  360. return 0xff & (clock() >> 24);
  361. case 0x1a001:
  362. return 0xff & (clock() >> 16);
  363. case 0x1a002:
  364. return 0xff & (clock() >> 8);
  365. case 0x1a003:
  366. /* Hack: We need to have this change consistently to make it work */
  367. return 0xFF & clock();
  368. default:
  369. DPRINTF("BMAP Read B @ %x\n", (unsigned int)addr);
  370. return 0;
  371. }
  372. }
  373. static uint32_t scr_readw(NeXTState *s, hwaddr addr)
  374. {
  375. DPRINTF("BMAP Read W @ %x\n", (unsigned int)addr);
  376. return 0;
  377. }
  378. static uint32_t scr_readl(NeXTState *s, hwaddr addr)
  379. {
  380. DPRINTF("BMAP Read L @ %x\n", (unsigned int)addr);
  381. return 0;
  382. }
  383. #define SCSICSR_ENABLE 0x01
  384. #define SCSICSR_RESET 0x02 /* reset scsi dma */
  385. #define SCSICSR_FIFOFL 0x04
  386. #define SCSICSR_DMADIR 0x08 /* if set, scsi to mem */
  387. #define SCSICSR_CPUDMA 0x10 /* if set, dma enabled */
  388. #define SCSICSR_INTMASK 0x20 /* if set, interrupt enabled */
  389. static void scr_writeb(NeXTState *s, hwaddr addr, uint32_t value)
  390. {
  391. switch (addr) {
  392. case 0x14108:
  393. DPRINTF("FDCSR Write: %x\n", value);
  394. if (value == 0x0) {
  395. /* qemu_irq_raise(s->fd_irq[0]); */
  396. }
  397. break;
  398. case 0x14020: /* SCSI Control Register */
  399. if (value & SCSICSR_FIFOFL) {
  400. DPRINTF("SCSICSR FIFO Flush\n");
  401. /* will have to add another irq to the esp if this is needed */
  402. /* esp_puflush_fifo(esp_g); */
  403. /* qemu_irq_pulse(s->scsi_dma); */
  404. }
  405. if (value & SCSICSR_ENABLE) {
  406. DPRINTF("SCSICSR Enable\n");
  407. /*
  408. * qemu_irq_raise(s->scsi_dma);
  409. * s->scsi_csr_1 = 0xc0;
  410. * s->scsi_csr_1 |= 0x1;
  411. * qemu_irq_pulse(s->scsi_dma);
  412. */
  413. }
  414. /*
  415. * else
  416. * s->scsi_csr_1 &= ~SCSICSR_ENABLE;
  417. */
  418. if (value & SCSICSR_RESET) {
  419. DPRINTF("SCSICSR Reset\n");
  420. /* I think this should set DMADIR. CPUDMA and INTMASK to 0 */
  421. /* qemu_irq_raise(s->scsi_reset); */
  422. /* s->scsi_csr_1 &= ~(SCSICSR_INTMASK |0x80|0x1); */
  423. }
  424. if (value & SCSICSR_DMADIR) {
  425. DPRINTF("SCSICSR DMAdir\n");
  426. }
  427. if (value & SCSICSR_CPUDMA) {
  428. DPRINTF("SCSICSR CPUDMA\n");
  429. /* qemu_irq_raise(s->scsi_dma); */
  430. s->int_status |= 0x4000000;
  431. } else {
  432. s->int_status &= ~(0x4000000);
  433. }
  434. if (value & SCSICSR_INTMASK) {
  435. DPRINTF("SCSICSR INTMASK\n");
  436. /*
  437. * int_mask &= ~0x1000;
  438. * s->scsi_csr_1 |= value;
  439. * s->scsi_csr_1 &= ~SCSICSR_INTMASK;
  440. * if (s->scsi_queued) {
  441. * s->scsi_queued = 0;
  442. * next_irq(s, NEXT_SCSI_I, level);
  443. * }
  444. */
  445. } else {
  446. /* int_mask |= 0x1000; */
  447. }
  448. if (value & 0x80) {
  449. /* int_mask |= 0x1000; */
  450. /* s->scsi_csr_1 |= 0x80; */
  451. }
  452. DPRINTF("SCSICSR Write: %x\n", value);
  453. /* s->scsi_csr_1 = value; */
  454. return;
  455. /* Hardware timer latch - not implemented yet */
  456. case 0x1a000:
  457. default:
  458. DPRINTF("BMAP Write B @ %x with %x\n", (unsigned int)addr, value);
  459. }
  460. }
  461. static void scr_writew(NeXTState *s, hwaddr addr, uint32_t value)
  462. {
  463. DPRINTF("BMAP Write W @ %x with %x\n", (unsigned int)addr, value);
  464. }
  465. static void scr_writel(NeXTState *s, hwaddr addr, uint32_t value)
  466. {
  467. DPRINTF("BMAP Write L @ %x with %x\n", (unsigned int)addr, value);
  468. }
  469. static uint64_t scr_readfn(void *opaque, hwaddr addr, unsigned size)
  470. {
  471. NeXTState *ns = NEXT_MACHINE(opaque);
  472. switch (size) {
  473. case 1:
  474. return scr_readb(ns, addr);
  475. case 2:
  476. return scr_readw(ns, addr);
  477. case 4:
  478. return scr_readl(ns, addr);
  479. default:
  480. g_assert_not_reached();
  481. }
  482. }
  483. static void scr_writefn(void *opaque, hwaddr addr, uint64_t value,
  484. unsigned size)
  485. {
  486. NeXTState *ns = NEXT_MACHINE(opaque);
  487. switch (size) {
  488. case 1:
  489. scr_writeb(ns, addr, value);
  490. break;
  491. case 2:
  492. scr_writew(ns, addr, value);
  493. break;
  494. case 4:
  495. scr_writel(ns, addr, value);
  496. break;
  497. default:
  498. g_assert_not_reached();
  499. }
  500. }
  501. static const MemoryRegionOps scr_ops = {
  502. .read = scr_readfn,
  503. .write = scr_writefn,
  504. .valid.min_access_size = 1,
  505. .valid.max_access_size = 4,
  506. .endianness = DEVICE_NATIVE_ENDIAN,
  507. };
  508. #define NEXTDMA_SCSI(x) (0x10 + x)
  509. #define NEXTDMA_FD(x) (0x10 + x)
  510. #define NEXTDMA_ENTX(x) (0x110 + x)
  511. #define NEXTDMA_ENRX(x) (0x150 + x)
  512. #define NEXTDMA_CSR 0x0
  513. #define NEXTDMA_NEXT 0x4000
  514. #define NEXTDMA_LIMIT 0x4004
  515. #define NEXTDMA_START 0x4008
  516. #define NEXTDMA_STOP 0x400c
  517. #define NEXTDMA_NEXT_INIT 0x4200
  518. #define NEXTDMA_SIZE 0x4204
  519. static void dma_writel(void *opaque, hwaddr addr, uint64_t value,
  520. unsigned int size)
  521. {
  522. NeXTState *next_state = NEXT_MACHINE(opaque);
  523. switch (addr) {
  524. case NEXTDMA_ENRX(NEXTDMA_CSR):
  525. if (value & DMA_DEV2M) {
  526. next_state->dma[NEXTDMA_ENRX].csr |= DMA_DEV2M;
  527. }
  528. if (value & DMA_SETENABLE) {
  529. /* DPRINTF("SCSI DMA ENABLE\n"); */
  530. next_state->dma[NEXTDMA_ENRX].csr |= DMA_ENABLE;
  531. }
  532. if (value & DMA_SETSUPDATE) {
  533. next_state->dma[NEXTDMA_ENRX].csr |= DMA_SUPDATE;
  534. }
  535. if (value & DMA_CLRCOMPLETE) {
  536. next_state->dma[NEXTDMA_ENRX].csr &= ~DMA_COMPLETE;
  537. }
  538. if (value & DMA_RESET) {
  539. next_state->dma[NEXTDMA_ENRX].csr &= ~(DMA_COMPLETE | DMA_SUPDATE |
  540. DMA_ENABLE | DMA_DEV2M);
  541. }
  542. /* DPRINTF("RXCSR \tWrite: %x\n",value); */
  543. break;
  544. case NEXTDMA_ENRX(NEXTDMA_NEXT_INIT):
  545. next_state->dma[NEXTDMA_ENRX].next_initbuf = value;
  546. break;
  547. case NEXTDMA_ENRX(NEXTDMA_NEXT):
  548. next_state->dma[NEXTDMA_ENRX].next = value;
  549. break;
  550. case NEXTDMA_ENRX(NEXTDMA_LIMIT):
  551. next_state->dma[NEXTDMA_ENRX].limit = value;
  552. break;
  553. case NEXTDMA_SCSI(NEXTDMA_CSR):
  554. if (value & DMA_DEV2M) {
  555. next_state->dma[NEXTDMA_SCSI].csr |= DMA_DEV2M;
  556. }
  557. if (value & DMA_SETENABLE) {
  558. /* DPRINTF("SCSI DMA ENABLE\n"); */
  559. next_state->dma[NEXTDMA_SCSI].csr |= DMA_ENABLE;
  560. }
  561. if (value & DMA_SETSUPDATE) {
  562. next_state->dma[NEXTDMA_SCSI].csr |= DMA_SUPDATE;
  563. }
  564. if (value & DMA_CLRCOMPLETE) {
  565. next_state->dma[NEXTDMA_SCSI].csr &= ~DMA_COMPLETE;
  566. }
  567. if (value & DMA_RESET) {
  568. next_state->dma[NEXTDMA_SCSI].csr &= ~(DMA_COMPLETE | DMA_SUPDATE |
  569. DMA_ENABLE | DMA_DEV2M);
  570. /* DPRINTF("SCSI DMA RESET\n"); */
  571. }
  572. /* DPRINTF("RXCSR \tWrite: %x\n",value); */
  573. break;
  574. case NEXTDMA_SCSI(NEXTDMA_NEXT):
  575. next_state->dma[NEXTDMA_SCSI].next = value;
  576. break;
  577. case NEXTDMA_SCSI(NEXTDMA_LIMIT):
  578. next_state->dma[NEXTDMA_SCSI].limit = value;
  579. break;
  580. case NEXTDMA_SCSI(NEXTDMA_START):
  581. next_state->dma[NEXTDMA_SCSI].start = value;
  582. break;
  583. case NEXTDMA_SCSI(NEXTDMA_STOP):
  584. next_state->dma[NEXTDMA_SCSI].stop = value;
  585. break;
  586. case NEXTDMA_SCSI(NEXTDMA_NEXT_INIT):
  587. next_state->dma[NEXTDMA_SCSI].next_initbuf = value;
  588. break;
  589. default:
  590. DPRINTF("DMA write @ %x w/ %x\n", (unsigned)addr, (unsigned)value);
  591. }
  592. }
  593. static uint64_t dma_readl(void *opaque, hwaddr addr, unsigned int size)
  594. {
  595. NeXTState *next_state = NEXT_MACHINE(opaque);
  596. switch (addr) {
  597. case NEXTDMA_SCSI(NEXTDMA_CSR):
  598. DPRINTF("SCSI DMA CSR READ\n");
  599. return next_state->dma[NEXTDMA_SCSI].csr;
  600. case NEXTDMA_ENRX(NEXTDMA_CSR):
  601. return next_state->dma[NEXTDMA_ENRX].csr;
  602. case NEXTDMA_ENRX(NEXTDMA_NEXT_INIT):
  603. return next_state->dma[NEXTDMA_ENRX].next_initbuf;
  604. case NEXTDMA_ENRX(NEXTDMA_NEXT):
  605. return next_state->dma[NEXTDMA_ENRX].next;
  606. case NEXTDMA_ENRX(NEXTDMA_LIMIT):
  607. return next_state->dma[NEXTDMA_ENRX].limit;
  608. case NEXTDMA_SCSI(NEXTDMA_NEXT):
  609. return next_state->dma[NEXTDMA_SCSI].next;
  610. case NEXTDMA_SCSI(NEXTDMA_NEXT_INIT):
  611. return next_state->dma[NEXTDMA_SCSI].next_initbuf;
  612. case NEXTDMA_SCSI(NEXTDMA_LIMIT):
  613. return next_state->dma[NEXTDMA_SCSI].limit;
  614. case NEXTDMA_SCSI(NEXTDMA_START):
  615. return next_state->dma[NEXTDMA_SCSI].start;
  616. case NEXTDMA_SCSI(NEXTDMA_STOP):
  617. return next_state->dma[NEXTDMA_SCSI].stop;
  618. default:
  619. DPRINTF("DMA read @ %x\n", (unsigned int)addr);
  620. return 0;
  621. }
  622. /*
  623. * once the csr's are done, subtract 0x3FEC from the addr, and that will
  624. * normalize the upper registers
  625. */
  626. }
  627. static const MemoryRegionOps dma_ops = {
  628. .read = dma_readl,
  629. .write = dma_writel,
  630. .impl.min_access_size = 4,
  631. .valid.min_access_size = 4,
  632. .valid.max_access_size = 4,
  633. .endianness = DEVICE_NATIVE_ENDIAN,
  634. };
  635. /*
  636. * TODO: set the shift numbers as values in the enum, so the first switch
  637. * will not be needed
  638. */
  639. void next_irq(void *opaque, int number, int level)
  640. {
  641. M68kCPU *cpu = opaque;
  642. int shift = 0;
  643. NeXTState *ns = NEXT_MACHINE(qdev_get_machine());
  644. /* first switch sets interupt status */
  645. /* DPRINTF("IRQ %i\n",number); */
  646. switch (number) {
  647. /* level 3 - floppy, kbd/mouse, power, ether rx/tx, scsi, clock */
  648. case NEXT_FD_I:
  649. shift = 7;;
  650. break;
  651. case NEXT_KBD_I:
  652. shift = 3;
  653. break;
  654. case NEXT_PWR_I:
  655. shift = 2;
  656. break;
  657. case NEXT_ENRX_I:
  658. shift = 9;
  659. break;
  660. case NEXT_ENTX_I:
  661. shift = 10;
  662. break;
  663. case NEXT_SCSI_I:
  664. shift = 12;
  665. break;
  666. case NEXT_CLK_I:
  667. shift = 5;
  668. break;
  669. /* level 5 - scc (serial) */
  670. case NEXT_SCC_I:
  671. shift = 17;
  672. break;
  673. /* level 6 - audio etherrx/tx dma */
  674. case NEXT_ENTX_DMA_I:
  675. shift = 28;
  676. break;
  677. case NEXT_ENRX_DMA_I:
  678. shift = 27;
  679. break;
  680. case NEXT_SCSI_DMA_I:
  681. shift = 26;
  682. break;
  683. case NEXT_SND_I:
  684. shift = 23;
  685. break;
  686. case NEXT_SCC_DMA_I:
  687. shift = 21;
  688. break;
  689. }
  690. /*
  691. * this HAS to be wrong, the interrupt handlers in mach and together
  692. * int_status and int_mask and return if there is a hit
  693. */
  694. if (ns->int_mask & (1 << shift)) {
  695. DPRINTF("%x interrupt masked @ %x\n", 1 << shift, cpu->env.pc);
  696. /* return; */
  697. }
  698. /* second switch triggers the correct interrupt */
  699. if (level) {
  700. ns->int_status |= 1 << shift;
  701. switch (number) {
  702. /* level 3 - floppy, kbd/mouse, power, ether rx/tx, scsi, clock */
  703. case NEXT_FD_I:
  704. case NEXT_KBD_I:
  705. case NEXT_PWR_I:
  706. case NEXT_ENRX_I:
  707. case NEXT_ENTX_I:
  708. case NEXT_SCSI_I:
  709. case NEXT_CLK_I:
  710. m68k_set_irq_level(cpu, 3, 27);
  711. break;
  712. /* level 5 - scc (serial) */
  713. case NEXT_SCC_I:
  714. m68k_set_irq_level(cpu, 5, 29);
  715. break;
  716. /* level 6 - audio etherrx/tx dma */
  717. case NEXT_ENTX_DMA_I:
  718. case NEXT_ENRX_DMA_I:
  719. case NEXT_SCSI_DMA_I:
  720. case NEXT_SND_I:
  721. case NEXT_SCC_DMA_I:
  722. m68k_set_irq_level(cpu, 6, 30);
  723. break;
  724. }
  725. } else {
  726. ns->int_status &= ~(1 << shift);
  727. cpu_reset_interrupt(CPU(cpu), CPU_INTERRUPT_HARD);
  728. }
  729. }
  730. static void next_serial_irq(void *opaque, int n, int level)
  731. {
  732. /* DPRINTF("SCC IRQ NUM %i\n",n); */
  733. if (n) {
  734. next_irq(opaque, NEXT_SCC_DMA_I, level);
  735. } else {
  736. next_irq(opaque, NEXT_SCC_I, level);
  737. }
  738. }
  739. static void next_escc_init(M68kCPU *cpu)
  740. {
  741. qemu_irq *ser_irq = qemu_allocate_irqs(next_serial_irq, cpu, 2);
  742. DeviceState *dev;
  743. SysBusDevice *s;
  744. dev = qdev_create(NULL, TYPE_ESCC);
  745. qdev_prop_set_uint32(dev, "disabled", 0);
  746. qdev_prop_set_uint32(dev, "frequency", 9600 * 384);
  747. qdev_prop_set_uint32(dev, "it_shift", 0);
  748. qdev_prop_set_bit(dev, "bit_swap", true);
  749. qdev_prop_set_chr(dev, "chrB", serial_hd(1));
  750. qdev_prop_set_chr(dev, "chrA", serial_hd(0));
  751. qdev_prop_set_uint32(dev, "chnBtype", escc_serial);
  752. qdev_prop_set_uint32(dev, "chnAtype", escc_serial);
  753. qdev_init_nofail(dev);
  754. s = SYS_BUS_DEVICE(dev);
  755. sysbus_connect_irq(s, 0, ser_irq[0]);
  756. sysbus_connect_irq(s, 1, ser_irq[1]);
  757. sysbus_mmio_map(s, 0, 0x2118000);
  758. }
  759. static void next_cube_init(MachineState *machine)
  760. {
  761. M68kCPU *cpu;
  762. CPUM68KState *env;
  763. MemoryRegion *ram = g_new(MemoryRegion, 1);
  764. MemoryRegion *rom = g_new(MemoryRegion, 1);
  765. MemoryRegion *mmiomem = g_new(MemoryRegion, 1);
  766. MemoryRegion *scrmem = g_new(MemoryRegion, 1);
  767. MemoryRegion *dmamem = g_new(MemoryRegion, 1);
  768. MemoryRegion *bmapm1 = g_new(MemoryRegion, 1);
  769. MemoryRegion *bmapm2 = g_new(MemoryRegion, 1);
  770. MemoryRegion *sysmem = get_system_memory();
  771. NeXTState *ns = NEXT_MACHINE(machine);
  772. DeviceState *dev;
  773. /* Initialize the cpu core */
  774. cpu = M68K_CPU(cpu_create(machine->cpu_type));
  775. if (!cpu) {
  776. error_report("Unable to find m68k CPU definition");
  777. exit(1);
  778. }
  779. env = &cpu->env;
  780. /* Initialize CPU registers. */
  781. env->vbr = 0;
  782. env->sr = 0x2700;
  783. /* Set internal registers to initial values */
  784. /* 0x0000XX00 << vital bits */
  785. ns->scr1 = 0x00011102;
  786. ns->scr2 = 0x00ff0c80;
  787. ns->rtc.status = 0x90;
  788. /* Load RTC RAM - TODO: provide possibility to load contents from file */
  789. memcpy(ns->rtc.ram, rtc_ram2, 32);
  790. /* 64MB RAM starting at 0x04000000 */
  791. memory_region_allocate_system_memory(ram, NULL, "next.ram", ram_size);
  792. memory_region_add_subregion(sysmem, 0x04000000, ram);
  793. /* Framebuffer */
  794. dev = qdev_create(NULL, TYPE_NEXTFB);
  795. qdev_init_nofail(dev);
  796. sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0x0B000000);
  797. /* MMIO */
  798. memory_region_init_io(mmiomem, NULL, &mmio_ops, machine, "next.mmio",
  799. 0xD0000);
  800. memory_region_add_subregion(sysmem, 0x02000000, mmiomem);
  801. /* BMAP memory */
  802. memory_region_init_ram_shared_nomigrate(bmapm1, NULL, "next.bmapmem", 64,
  803. true, &error_fatal);
  804. memory_region_add_subregion(sysmem, 0x020c0000, bmapm1);
  805. /* The Rev_2.5_v66.bin firmware accesses it at 0x820c0020, too */
  806. memory_region_init_alias(bmapm2, NULL, "next.bmapmem2", bmapm1, 0x0, 64);
  807. memory_region_add_subregion(sysmem, 0x820c0000, bmapm2);
  808. /* BMAP IO - acts as a catch-all for now */
  809. memory_region_init_io(scrmem, NULL, &scr_ops, machine, "next.scr",
  810. 0x20000);
  811. memory_region_add_subregion(sysmem, 0x02100000, scrmem);
  812. /* KBD */
  813. dev = qdev_create(NULL, TYPE_NEXTKBD);
  814. qdev_init_nofail(dev);
  815. sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, 0x0200e000);
  816. /* Load ROM here */
  817. if (bios_name == NULL) {
  818. bios_name = ROM_FILE;
  819. }
  820. /* still not sure if the rom should also be mapped at 0x0*/
  821. memory_region_init_rom(rom, NULL, "next.rom", 0x20000, &error_fatal);
  822. memory_region_add_subregion(sysmem, 0x01000000, rom);
  823. if (load_image_targphys(bios_name, 0x01000000, 0x20000) < 8) {
  824. if (!qtest_enabled()) {
  825. error_report("Failed to load firmware '%s'.", bios_name);
  826. }
  827. } else {
  828. uint8_t *ptr;
  829. /* Initial PC is always at offset 4 in firmware binaries */
  830. ptr = rom_ptr(0x01000004, 4);
  831. g_assert(ptr != NULL);
  832. env->pc = ldl_p(ptr);
  833. if (env->pc >= 0x01020000) {
  834. error_report("'%s' does not seem to be a valid firmware image.",
  835. bios_name);
  836. exit(1);
  837. }
  838. }
  839. /* Serial */
  840. next_escc_init(cpu);
  841. /* TODO: */
  842. /* Network */
  843. /* SCSI */
  844. /* DMA */
  845. memory_region_init_io(dmamem, NULL, &dma_ops, machine, "next.dma", 0x5000);
  846. memory_region_add_subregion(sysmem, 0x02000000, dmamem);
  847. }
  848. static void next_machine_class_init(ObjectClass *oc, void *data)
  849. {
  850. MachineClass *mc = MACHINE_CLASS(oc);
  851. mc->desc = "NeXT Cube";
  852. mc->init = next_cube_init;
  853. mc->default_ram_size = RAM_SIZE;
  854. mc->default_cpu_type = M68K_CPU_TYPE_NAME("m68040");
  855. }
  856. static const TypeInfo next_typeinfo = {
  857. .name = TYPE_NEXT_MACHINE,
  858. .parent = TYPE_MACHINE,
  859. .class_init = next_machine_class_init,
  860. .instance_size = sizeof(NeXTState),
  861. };
  862. static void next_register_type(void)
  863. {
  864. type_register_static(&next_typeinfo);
  865. }
  866. type_init(next_register_type)