/scsi.cpp

https://github.com/tonioni/WinUAE · C++ · 5735 lines · 4966 code · 661 blank · 108 comment · 1761 complexity · 926e04a3dba70969a5bd22aed068e453 MD5 · raw file

  1. /*
  2. * UAE - The Un*x Amiga Emulator
  3. *
  4. * SCSI and SASI emulation (not uaescsi.device)
  5. *
  6. * Copyright 2007-2015 Toni Wilen
  7. *
  8. */
  9. #include "sysconfig.h"
  10. #include "sysdeps.h"
  11. #include "options.h"
  12. #include "filesys.h"
  13. #include "blkdev.h"
  14. #include "zfile.h"
  15. #include "debug.h"
  16. #include "memory.h"
  17. #include "scsi.h"
  18. #include "autoconf.h"
  19. #include "rommgr.h"
  20. #include "newcpu.h"
  21. #include "custom.h"
  22. #include "gayle.h"
  23. #include "cia.h"
  24. #include "devices.h"
  25. #include "flashrom.h"
  26. #include "gui.h"
  27. #define SCSI_EMU_DEBUG 0
  28. #define RAW_SCSI_DEBUG 0
  29. #define NCR5380_DEBUG 0
  30. #define NCR5380_DEBUG_IRQ 0
  31. #define NCR53400_DEBUG 0
  32. #define NCR5380_SUPRA 1
  33. #define NONCR_GOLEM 2
  34. #define NCR5380_STARDRIVE 3
  35. #define NONCR_KOMMOS 4
  36. #define NONCR_VECTOR 5
  37. #define NONCR_APOLLO 6
  38. #define NCR5380_PROTAR 7
  39. #define NCR5380_ADD500 8
  40. #define NCR5380_KRONOS 9
  41. #define NCR5380_ADSCSI 10
  42. #define NCR5380_ROCHARD 11
  43. #define NCR5380_CLTD 12
  44. #define NCR5380_PTNEXUS 13
  45. #define NCR5380_DATAFLYER 14
  46. #define NONCR_TECMAR 15
  47. #define NCR5380_XEBEC 16
  48. #define NONCR_MICROFORGE 17
  49. #define NONCR_PARADOX 18
  50. #define OMTI_HDA506 19
  51. #define OMTI_ALF1 20
  52. #define OMTI_PROMIGOS 21
  53. #define OMTI_SYSTEM2000 22
  54. #define OMTI_ADAPTER 23
  55. #define NCR5380_X86_RT1000 24
  56. #define NCR5380_PHOENIXBOARD 25
  57. #define NCR5380_TRUMPCARDPRO 26
  58. #define NCR5380_IVSVECTOR 27 // nearly identical to trumpcard pro
  59. #define NCR5380_SCRAM 28
  60. #define NCR5380_OSSI 29
  61. #define NCR5380_DATAFLYERPLUS 30
  62. #define NONCR_HARDFRAME 31
  63. #define NCR5380_MALIBU 32
  64. #define NCR5380_ADDHARD 33
  65. #define NONCR_INMATE 34
  66. #define NCR5380_EMPLANT 35
  67. #define OMTI_HD3000 36
  68. #define OMTI_WEDGE 37
  69. #define NCR5380_EVESHAMREF 38
  70. #define OMTI_PROFEX 39
  71. #define NCR5380_FASTTRAK 40
  72. #define NCR5380_12GAUGE 41
  73. #define NCR5380_OVERDRIVE 42
  74. #define NCR5380_TRUMPCARD 43
  75. #define OMTI_ALF2 44
  76. #define NCR5380_SYNTHESIS 45 // clone of ICD AdSCSI
  77. #define NCR5380_FIREBALL 46
  78. #define OMTI_HD20 47
  79. #define NCR_LAST 48
  80. extern int log_scsiemu;
  81. static const uae_s16 outcmd[] = { 0x04, 0x0a, 0x0c, 0x11, 0x2a, 0xaa, 0x15, 0x55, 0x0f, -1 };
  82. static const uae_s16 incmd[] = { 0x01, 0x03, 0x08, 0x0e, 0x12, 0x1a, 0x5a, 0x25, 0x28, 0x34, 0x37, 0x42, 0x43, 0xa8, 0x51, 0x52, 0xb9, 0xbd, 0xd8, 0xd9, 0xbe, -1 };
  83. static const uae_s16 nonecmd[] = { 0x00, 0x05, 0x06, 0x07, 0x09, 0x0b, 0x10, 0x16, 0x17, 0x19, 0x1b, 0x1d, 0x1e, 0x2b, 0x35, 0x45, 0x47, 0x48, 0x49, 0x4b, 0x4e, 0xa5, 0xa9, 0xba, 0xbc, 0xe0, 0xe3, 0xe4, -1 };
  84. static const uae_s16 safescsi[] = { 0x00, 0x01, 0x03, 0x08, 0x0e, 0x0f, 0x12, 0x1a, 0x1b, 0x25, 0x28, 0x35, 0x5a, -1 };
  85. static const uae_s16 scsicmdsizes[] = { 6, 10, 10, 12, 16, 12, 10, 6 };
  86. static void scsi_illegal_command(struct scsi_data *sd)
  87. {
  88. uae_u8 *s = sd->sense;
  89. memset (s, 0, sizeof (sd->sense));
  90. sd->status = SCSI_STATUS_CHECK_CONDITION;
  91. s[0] = 0x70;
  92. s[2] = 5; /* ILLEGAL REQUEST */
  93. s[12] = 0x24; /* ILLEGAL FIELD IN CDB */
  94. sd->sense_len = 0x12;
  95. }
  96. static void scsi_grow_buffer(struct scsi_data *sd, int newsize)
  97. {
  98. if (sd->buffer_size >= newsize)
  99. return;
  100. uae_u8 *oldbuf = sd->buffer;
  101. int oldsize = sd->buffer_size;
  102. sd->buffer_size = newsize + SCSI_DEFAULT_DATA_BUFFER_SIZE;
  103. write_log(_T("SCSI buffer %d -> %d\n"), oldsize, sd->buffer_size);
  104. sd->buffer = xmalloc(uae_u8, sd->buffer_size);
  105. memcpy(sd->buffer, oldbuf, oldsize);
  106. xfree(oldbuf);
  107. }
  108. static int scsi_data_dir(struct scsi_data *sd)
  109. {
  110. int i;
  111. uae_u8 cmd;
  112. cmd = sd->cmd[0];
  113. for (i = 0; outcmd[i] >= 0; i++) {
  114. if (cmd == outcmd[i]) {
  115. return 1;
  116. }
  117. }
  118. for (i = 0; incmd[i] >= 0; i++) {
  119. if (cmd == incmd[i]) {
  120. return -1;
  121. }
  122. }
  123. for (i = 0; nonecmd[i] >= 0; i++) {
  124. if (cmd == nonecmd[i]) {
  125. return 0;
  126. }
  127. }
  128. write_log (_T("SCSI command %02X, no direction specified!\n"), sd->cmd[0]);
  129. return 0;
  130. }
  131. bool scsi_emulate_analyze (struct scsi_data *sd)
  132. {
  133. int cmd_len, data_len, data_len2, tmp_len;
  134. data_len = sd->data_len;
  135. data_len2 = 0;
  136. cmd_len = scsicmdsizes[sd->cmd[0] >> 5];
  137. if (sd->hdhfd && sd->hdhfd->ansi_version < 2 && cmd_len > 10)
  138. goto nocmd;
  139. sd->cmd_len = cmd_len;
  140. switch (sd->cmd[0])
  141. {
  142. case 0x04: // FORMAT UNIT
  143. if (sd->device_type == UAEDEV_CD)
  144. goto nocmd;
  145. // FmtData set?
  146. if (sd->cmd[1] & 0x10) {
  147. int cl = (sd->cmd[1] & 8) != 0;
  148. int dlf = sd->cmd[1] & 7;
  149. data_len2 = 4;
  150. } else {
  151. sd->direction = 0;
  152. sd->data_len = 0;
  153. return true;
  154. }
  155. break;
  156. case 0x06: // FORMAT TRACK
  157. case 0x07: // FORMAT BAD TRACK
  158. if (sd->device_type == UAEDEV_CD)
  159. goto nocmd;
  160. sd->direction = 0;
  161. sd->data_len = 0;
  162. return true;
  163. case 0x0c: // INITIALIZE DRIVE CHARACTERICS (SASI)
  164. if (sd->hfd && sd->hfd->ci.unit_feature_level < HD_LEVEL_SASI)
  165. goto nocmd;
  166. data_len = 8;
  167. break;
  168. case 0x08: // READ(6)
  169. data_len2 = (sd->cmd[4] == 0 ? 256 : sd->cmd[4]) * sd->blocksize;
  170. scsi_grow_buffer(sd, data_len2);
  171. break;
  172. case 0x11: // ASSIGN ALTERNATE TRACK (SASI)
  173. if (sd->hfd && sd->hfd->ci.unit_feature_level < HD_LEVEL_SASI)
  174. goto nocmd;
  175. data_len = 4;
  176. break;
  177. case 0x28: // READ(10)
  178. data_len2 = ((sd->cmd[7] << 8) | (sd->cmd[8] << 0)) * (uae_s64)sd->blocksize;
  179. scsi_grow_buffer(sd, data_len2);
  180. break;
  181. case 0xa8: // READ(12)
  182. data_len2 = ((sd->cmd[6] << 24) | (sd->cmd[7] << 16) | (sd->cmd[8] << 8) | (sd->cmd[9] << 0)) * (uae_s64)sd->blocksize;
  183. scsi_grow_buffer(sd, data_len2);
  184. break;
  185. case 0x0f: // WRITE SECTOR BUFFER
  186. data_len = sd->blocksize;
  187. scsi_grow_buffer(sd, data_len);
  188. break;
  189. case 0x0a: // WRITE(6)
  190. if (sd->device_type == UAEDEV_CD)
  191. goto nocmd;
  192. data_len = (sd->cmd[4] == 0 ? 256 : sd->cmd[4]) * sd->blocksize;
  193. scsi_grow_buffer(sd, data_len);
  194. break;
  195. case 0x2a: // WRITE(10)
  196. if (sd->device_type == UAEDEV_CD)
  197. goto nocmd;
  198. data_len = ((sd->cmd[7] << 8) | (sd->cmd[8] << 0)) * (uae_s64)sd->blocksize;
  199. scsi_grow_buffer(sd, data_len);
  200. break;
  201. case 0xaa: // WRITE(12)
  202. if (sd->device_type == UAEDEV_CD)
  203. goto nocmd;
  204. data_len = ((sd->cmd[6] << 24) | (sd->cmd[7] << 16) | (sd->cmd[8] << 8) | (sd->cmd[9] << 0)) * (uae_s64)sd->blocksize;
  205. scsi_grow_buffer(sd, data_len);
  206. break;
  207. case 0xbe: // READ CD
  208. case 0xb9: // READ CD MSF
  209. case 0xd8: // READ CD-DA
  210. case 0xd9: // READ CD-DA MSF
  211. if (sd->device_type != UAEDEV_CD)
  212. goto nocmd;
  213. tmp_len = (sd->cmd[6] << 16) | (sd->cmd[7] << 8) | sd->cmd[8];
  214. // max block transfer size, it is usually smaller.
  215. tmp_len *= 2352 + 96;
  216. scsi_grow_buffer(sd, tmp_len);
  217. break;
  218. case 0x2f: // VERIFY
  219. if (sd->cmd[1] & 2) {
  220. sd->data_len = ((sd->cmd[7] << 8) | (sd->cmd[8] << 0)) * (uae_s64)sd->blocksize;
  221. scsi_grow_buffer(sd, sd->data_len);
  222. sd->direction = 1;
  223. } else {
  224. sd->data_len = 0;
  225. sd->direction = 0;
  226. }
  227. return true;
  228. }
  229. if (data_len < 0) {
  230. if (cmd_len == 6) {
  231. sd->data_len = sd->cmd[4];
  232. } else {
  233. sd->data_len = (sd->cmd[7] << 8) | sd->cmd[8];
  234. }
  235. } else {
  236. sd->data_len = data_len;
  237. }
  238. sd->direction = scsi_data_dir(sd);
  239. if (sd->direction > 0 && sd->data_len == 0) {
  240. sd->direction = 0;
  241. }
  242. return true;
  243. nocmd:
  244. sd->status = SCSI_STATUS_CHECK_CONDITION;
  245. sd->direction = 0;
  246. scsi_illegal_command(sd);
  247. return false;
  248. }
  249. void scsi_illegal_lun(struct scsi_data *sd)
  250. {
  251. uae_u8 *s = sd->sense;
  252. memset (s, 0, sizeof (sd->sense));
  253. sd->status = SCSI_STATUS_CHECK_CONDITION;
  254. s[0] = 0x70;
  255. s[2] = SCSI_SK_ILLEGAL_REQ;
  256. s[12] = SCSI_INVALID_LUN;
  257. sd->sense_len = 0x12;
  258. }
  259. void scsi_clear_sense(struct scsi_data *sd)
  260. {
  261. memset (sd->sense, 0, sizeof (sd->sense));
  262. memset (sd->reply, 0, sizeof (sd->reply));
  263. sd->sense[0] = 0x70;
  264. }
  265. static void showsense(struct scsi_data *sd)
  266. {
  267. if (log_scsiemu) {
  268. for (int i = 0; i < sd->sense_len; i++) {
  269. if (i > 0)
  270. write_log (_T("."));
  271. write_log (_T("%02X"), sd->buffer[i]);
  272. }
  273. write_log (_T("\n"));
  274. }
  275. }
  276. static void copysense(struct scsi_data *sd)
  277. {
  278. bool sasi = sd->hfd && (sd->hfd->ci.unit_feature_level >= HD_LEVEL_SASI && sd->hfd->ci.unit_feature_level <= HD_LEVEL_SASI_ENHANCED);
  279. int len = sd->cmd[4];
  280. if (len == 0 || sasi)
  281. len = 4;
  282. memset(sd->buffer, 0, len);
  283. int tlen = sd->sense_len > len ? len : sd->sense_len;
  284. memcpy(sd->buffer, sd->sense, tlen);
  285. if (!sasi && sd->sense_len == 0) {
  286. // at least 0x12 bytes if SCSI and no sense
  287. tlen = len > 0x12 ? 0x12 : len;
  288. sd->buffer[0] = 0x70;
  289. sd->sense_len = tlen;
  290. }
  291. if (log_scsiemu)
  292. write_log(_T("REQUEST SENSE %d (%d -> %d)\n"), sd->cmd[4], sd->sense_len, tlen);
  293. showsense (sd);
  294. sd->data_len = tlen;
  295. scsi_clear_sense(sd);
  296. }
  297. static void copyreply(struct scsi_data *sd)
  298. {
  299. if (sd->status == 0 && sd->reply_len > 0) {
  300. memset(sd->buffer, 0, 256);
  301. memcpy(sd->buffer, sd->reply, sd->reply_len);
  302. sd->data_len = sd->reply_len;
  303. }
  304. }
  305. static void scsi_set_unit_attention(struct scsi_data *sd, uae_u8 v1, uae_u8 v2)
  306. {
  307. sd->unit_attention = (v1 << 8) | v2;
  308. }
  309. static void scsi_emulate_reset_device(struct scsi_data *sd)
  310. {
  311. if (!sd)
  312. return;
  313. if (sd->device_type == UAEDEV_HDF && sd->nativescsiunit < 0) {
  314. scsi_clear_sense(sd);
  315. // SCSI bus reset occurred
  316. scsi_set_unit_attention(sd, 0x29, 0x02);
  317. }
  318. }
  319. static bool handle_ca(struct scsi_data *sd)
  320. {
  321. bool cc = sd->sense_len > 2 && sd->sense[2] >= 2;
  322. bool ua = sd->unit_attention != 0;
  323. uae_u8 cmd = sd->cmd[0];
  324. // INQUIRY
  325. if (cmd == 0x12) {
  326. if (ua && cc && sd->sense[2] == 6) {
  327. // INQUIRY clears UA only if previous
  328. // command was aborted due to UA
  329. sd->unit_attention = 0;
  330. }
  331. memset(sd->reply, 0, sizeof(sd->reply));
  332. return true;
  333. }
  334. // REQUEST SENSE
  335. if (cmd == 0x03) {
  336. if (ua) {
  337. uae_u8 *s = sd->sense;
  338. scsi_clear_sense(sd);
  339. s[0] = 0x70;
  340. s[2] = 6; /* UNIT ATTENTION */
  341. s[12] = (sd->unit_attention >> 8) & 0xff;
  342. s[13] = (sd->unit_attention >> 0) & 0xff;
  343. sd->sense_len = 0x12;
  344. }
  345. sd->unit_attention = 0;
  346. return true;
  347. }
  348. scsi_clear_sense(sd);
  349. if (ua) {
  350. uae_u8 *s = sd->sense;
  351. s[0] = 0x70;
  352. s[2] = 6; /* UNIT ATTENTION */
  353. s[12] = (sd->unit_attention >> 8) & 0xff;
  354. s[13] = (sd->unit_attention >> 0) & 0xff;
  355. sd->sense_len = 0x12;
  356. sd->unit_attention = 0;
  357. sd->status = 2;
  358. return false;
  359. }
  360. return true;
  361. }
  362. bool scsi_cmd_is_safe(uae_u8 cmd)
  363. {
  364. for (int i = 0; safescsi[i] >= 0; i++) {
  365. if (safescsi[i] == cmd) {
  366. return true;
  367. }
  368. }
  369. return false;
  370. }
  371. void scsi_emulate_cmd(struct scsi_data *sd)
  372. {
  373. sd->status = 0;
  374. if ((sd->message[0] & 0xc0) == 0x80 && (sd->message[0] & 0x1f)) {
  375. uae_u8 lun = sd->message[0] & 0x1f;
  376. if (lun > 7)
  377. lun = 7;
  378. sd->cmd[1] &= ~(7 << 5);
  379. sd->cmd[1] |= lun << 5;
  380. }
  381. #if SCSI_EMU_DEBUG
  382. write_log (_T("CMD=%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x.%02x (%d,%d)\n"),
  383. sd->cmd[0], sd->cmd[1], sd->cmd[2], sd->cmd[3], sd->cmd[4], sd->cmd[5], sd->cmd[6], sd->cmd[7], sd->cmd[8], sd->cmd[9],
  384. sd->device_type, sd->nativescsiunit);
  385. #endif
  386. if (sd->device_type == UAEDEV_CD && sd->cd_emu_unit >= 0) {
  387. uae_u32 ua = 0;
  388. ua = scsi_cd_emulate(sd->cd_emu_unit, NULL, 0, 0, 0, 0, 0, 0, 0, sd->atapi);
  389. if (ua)
  390. sd->unit_attention = ua;
  391. if (handle_ca(sd)) {
  392. if (sd->cmd[0] == 0x03) { /* REQUEST SENSE */
  393. scsi_cd_emulate(sd->cd_emu_unit, sd->cmd, 0, 0, 0, 0, 0, 0, 0, sd->atapi); /* ack request sense */
  394. copysense(sd);
  395. } else {
  396. sd->status = scsi_cd_emulate(sd->cd_emu_unit, sd->cmd, sd->cmd_len, sd->buffer, &sd->data_len, sd->reply, &sd->reply_len, sd->sense, &sd->sense_len, sd->atapi);
  397. copyreply(sd);
  398. }
  399. }
  400. gui_flicker_led(LED_CD, sd->uae_unitnum, 1);
  401. } else if (sd->device_type == UAEDEV_HDF && sd->nativescsiunit < 0) {
  402. uae_u32 ua = 0;
  403. ua = scsi_hd_emulate(sd->hfd, sd->hdhfd, NULL, 0, 0, 0, 0, 0, 0, 0);
  404. if (ua)
  405. sd->unit_attention = ua;
  406. if (handle_ca(sd)) {
  407. if (sd->cmd[0] == 0x03) { /* REQUEST SENSE */
  408. scsi_hd_emulate(sd->hfd, sd->hdhfd, sd->cmd, 0, 0, 0, 0, 0, sd->sense, &sd->sense_len);
  409. copysense(sd);
  410. } else {
  411. sd->status = scsi_hd_emulate(sd->hfd, sd->hdhfd,
  412. sd->cmd, sd->cmd_len, sd->buffer, &sd->data_len, sd->reply, &sd->reply_len, sd->sense, &sd->sense_len);
  413. copyreply(sd);
  414. }
  415. }
  416. } else if (sd->device_type == UAEDEV_TAPE && sd->nativescsiunit < 0) {
  417. uae_u32 ua = 0;
  418. ua = scsi_tape_emulate(sd->tape, NULL, 0, 0, 0, 0, 0, 0, 0);
  419. if (ua)
  420. sd->unit_attention = ua;
  421. if (handle_ca(sd)) {
  422. if (sd->cmd[0] == 0x03) { /* REQUEST SENSE */
  423. scsi_tape_emulate(sd->tape, sd->cmd, 0, 0, 0, sd->reply, &sd->reply_len, sd->sense, &sd->sense_len); /* get request sense extra bits */
  424. copysense(sd);
  425. } else {
  426. sd->status = scsi_tape_emulate(sd->tape,
  427. sd->cmd, sd->cmd_len, sd->buffer, &sd->data_len, sd->reply, &sd->reply_len, sd->sense, &sd->sense_len);
  428. copyreply(sd);
  429. }
  430. }
  431. } else if (sd->device_type == UAEDEV_DIR) {
  432. uae_u32 ua = 0;
  433. ua = scsi_hd_emulate(sd->hfd, sd->hdhfd, NULL, 0, 0, 0, 0, 0, 0, 0);
  434. if (ua)
  435. sd->unit_attention = ua;
  436. if (handle_ca(sd)) {
  437. if (scsi_cmd_is_safe(sd->cmd[0])) {
  438. if (sd->cmd[0] == 0x03) { /* REQUEST SENSE */
  439. scsi_hd_emulate(sd->hfd, sd->hdhfd, sd->cmd, 0, 0, 0, 0, 0, sd->sense, &sd->sense_len);
  440. copysense(sd);
  441. } else {
  442. sd->status = scsi_hd_emulate(sd->hfd, sd->hdhfd,
  443. sd->cmd, sd->cmd_len, sd->buffer, &sd->data_len, sd->reply, &sd->reply_len, sd->sense, &sd->sense_len);
  444. copyreply(sd);
  445. }
  446. } else {
  447. sd->sense[0] = 0x70;
  448. sd->sense[2] = 5; /* Illegal Request */
  449. sd->sense[12] = 0x20; /* Invalid/unsupported command code */
  450. sd->sense_len = 18;
  451. sd->status = 2;
  452. copyreply(sd);
  453. }
  454. }
  455. } else if (sd->nativescsiunit >= 0) {
  456. struct amigascsi as;
  457. memset(sd->sense, 0, 256);
  458. memset(&as, 0, sizeof as);
  459. memcpy (&as.cmd, sd->cmd, sd->cmd_len);
  460. as.flags = 2 | 1;
  461. if (sd->direction > 0)
  462. as.flags &= ~1;
  463. as.sense_len = 32;
  464. as.cmd_len = sd->cmd_len;
  465. as.data = sd->buffer;
  466. as.len = sd->direction < 0 ? DEVICE_SCSI_BUFSIZE : sd->data_len;
  467. sys_command_scsi_direct_native(sd->nativescsiunit, -1, &as);
  468. sd->status = as.status;
  469. sd->data_len = as.len;
  470. if (sd->status) {
  471. sd->direction = 0;
  472. sd->data_len = 0;
  473. memcpy(sd->sense, as.sensedata, as.sense_len);
  474. }
  475. }
  476. sd->offset = 0;
  477. }
  478. static void allocscsibuf(struct scsi_data *sd)
  479. {
  480. sd->buffer_size = SCSI_DEFAULT_DATA_BUFFER_SIZE;
  481. sd->buffer = xcalloc(uae_u8, sd->buffer_size);
  482. }
  483. struct scsi_data *scsi_alloc_generic(struct hardfiledata *hfd, int type, int uae_unitnum)
  484. {
  485. struct scsi_data *sd = xcalloc(struct scsi_data, 1);
  486. sd->hfd = hfd;
  487. sd->id = -1;
  488. sd->nativescsiunit = -1;
  489. sd->cd_emu_unit = -1;
  490. sd->blocksize = hfd->ci.blocksize;
  491. sd->device_type = type;
  492. sd->uae_unitnum = uae_unitnum;
  493. allocscsibuf(sd);
  494. return sd;
  495. }
  496. struct scsi_data *scsi_alloc_hd(int id, struct hd_hardfiledata *hfd, int uae_unitnum)
  497. {
  498. struct scsi_data *sd = xcalloc (struct scsi_data, 1);
  499. sd->hdhfd = hfd;
  500. sd->hfd = &hfd->hfd;
  501. sd->id = id;
  502. sd->nativescsiunit = -1;
  503. sd->cd_emu_unit = -1;
  504. sd->blocksize = hfd->hfd.virtual_rdb ? 512 : hfd->hfd.ci.blocksize;
  505. sd->device_type = UAEDEV_HDF;
  506. sd->uae_unitnum = uae_unitnum;
  507. allocscsibuf(sd);
  508. return sd;
  509. }
  510. struct scsi_data *scsi_alloc_cd(int id, int unitnum, bool atapi, int uae_unitnum)
  511. {
  512. struct scsi_data *sd;
  513. if (!sys_command_open (unitnum)) {
  514. write_log (_T("SCSI: CD EMU scsi unit %d failed to open\n"), unitnum);
  515. return NULL;
  516. }
  517. sd = xcalloc (struct scsi_data, 1);
  518. sd->id = id;
  519. sd->cd_emu_unit = unitnum;
  520. sd->nativescsiunit = -1;
  521. sd->atapi = atapi;
  522. sd->blocksize = 2048;
  523. sd->device_type = UAEDEV_CD;
  524. sd->uae_unitnum = uae_unitnum;
  525. allocscsibuf(sd);
  526. return sd;
  527. }
  528. struct scsi_data *scsi_alloc_tape(int id, const TCHAR *tape_directory, bool readonly, int uae_unitnum)
  529. {
  530. struct scsi_data_tape *tape;
  531. tape = tape_alloc (id, tape_directory, readonly);
  532. if (!tape)
  533. return NULL;
  534. struct scsi_data *sd = xcalloc (struct scsi_data, 1);
  535. sd->id = id;
  536. sd->nativescsiunit = -1;
  537. sd->cd_emu_unit = -1;
  538. sd->blocksize = tape->blocksize;
  539. sd->tape = tape;
  540. sd->device_type = UAEDEV_TAPE;
  541. sd->uae_unitnum = uae_unitnum;
  542. allocscsibuf(sd);
  543. return sd;
  544. }
  545. struct scsi_data *scsi_alloc_native(int id, int nativeunit)
  546. {
  547. struct scsi_data *sd;
  548. if (!sys_command_open (nativeunit)) {
  549. write_log (_T("SCSI: native scsi unit %d failed to open\n"), nativeunit);
  550. return NULL;
  551. }
  552. sd = xcalloc (struct scsi_data, 1);
  553. sd->id = id;
  554. sd->nativescsiunit = nativeunit;
  555. sd->cd_emu_unit = -1;
  556. sd->blocksize = 2048;
  557. sd->device_type = 0;
  558. allocscsibuf(sd);
  559. return sd;
  560. }
  561. void scsi_reset(void)
  562. {
  563. //device_func_init (DEVICE_TYPE_SCSI);
  564. }
  565. void scsi_free(struct scsi_data *sd)
  566. {
  567. if (!sd)
  568. return;
  569. if (sd->nativescsiunit >= 0) {
  570. sys_command_close (sd->nativescsiunit);
  571. sd->nativescsiunit = -1;
  572. }
  573. if (sd->cd_emu_unit >= 0) {
  574. sys_command_close (sd->cd_emu_unit);
  575. sd->cd_emu_unit = -1;
  576. }
  577. tape_free (sd->tape);
  578. xfree(sd->buffer);
  579. xfree(sd);
  580. }
  581. void scsi_start_transfer(struct scsi_data *sd)
  582. {
  583. sd->offset = 0;
  584. }
  585. int scsi_send_data(struct scsi_data *sd, uae_u8 b)
  586. {
  587. if (sd->offset < 0) {
  588. write_log(_T("SCSI data offset is negative!\n"));
  589. return 0;
  590. }
  591. if (sd->direction == 1) {
  592. if (sd->offset >= sd->buffer_size) {
  593. write_log (_T("SCSI data buffer overflow!\n"));
  594. return 0;
  595. }
  596. sd->buffer[sd->offset++] = b;
  597. } else if (sd->direction == 2) {
  598. if (sd->offset >= 16) {
  599. write_log (_T("SCSI command buffer overflow!\n"));
  600. return 0;
  601. }
  602. sd->cmd[sd->offset++] = b;
  603. if (sd->offset == sd->cmd_len)
  604. return 1;
  605. } else {
  606. write_log (_T("scsi_send_data() without direction! (%02X)\n"), sd->cmd[0]);
  607. return 0;
  608. }
  609. if (sd->offset == sd->data_len)
  610. return 1;
  611. return 0;
  612. }
  613. int scsi_receive_data(struct scsi_data *sd, uae_u8 *b, bool next)
  614. {
  615. if (!sd->data_len)
  616. return -1;
  617. *b = sd->buffer[sd->offset];
  618. if (next) {
  619. sd->offset++;
  620. if (sd->offset == sd->data_len)
  621. return 1; // requested length got
  622. }
  623. return 0;
  624. }
  625. void free_scsi (struct scsi_data *sd)
  626. {
  627. if (!sd)
  628. return;
  629. hdf_hd_close(sd->hdhfd);
  630. scsi_free (sd);
  631. }
  632. int add_scsi_hd (struct scsi_data **sd, int ch, struct hd_hardfiledata *hfd, struct uaedev_config_info *ci)
  633. {
  634. free_scsi (*sd);
  635. *sd = NULL;
  636. if (!hfd) {
  637. hfd = xcalloc (struct hd_hardfiledata, 1);
  638. memcpy (&hfd->hfd.ci, ci, sizeof (struct uaedev_config_info));
  639. }
  640. if (!hdf_hd_open (hfd))
  641. return 0;
  642. hfd->ansi_version = ci->unit_feature_level + 1;
  643. *sd = scsi_alloc_hd (ch, hfd, ci->uae_unitnum);
  644. return *sd ? 1 : 0;
  645. }
  646. int add_scsi_cd (struct scsi_data **sd, int ch, int unitnum)
  647. {
  648. device_func_init (0);
  649. free_scsi (*sd);
  650. *sd = scsi_alloc_cd (ch, unitnum, false, unitnum);
  651. return *sd ? 1 : 0;
  652. }
  653. int add_scsi_tape (struct scsi_data **sd, int ch, const TCHAR *tape_directory, bool readonly)
  654. {
  655. free_scsi (*sd);
  656. *sd = scsi_alloc_tape (ch, tape_directory, readonly, ch);
  657. return *sd ? 1 : 0;
  658. }
  659. int add_scsi_device(struct scsi_data **sd, int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  660. {
  661. if (ci->type == UAEDEV_CD)
  662. return add_scsi_cd(sd, ch, ci->device_emu_unit);
  663. else if (ci->type == UAEDEV_TAPE)
  664. return add_scsi_tape(sd, ch, ci->rootdir, ci->readonly);
  665. else if (ci->type == UAEDEV_HDF)
  666. return add_scsi_hd(sd, ch, NULL, ci);
  667. return 0;
  668. }
  669. void scsi_freenative(struct scsi_data **sd, int max)
  670. {
  671. for (int i = 0; i < max; i++) {
  672. free_scsi (sd[i]);
  673. sd[i] = NULL;
  674. }
  675. }
  676. void scsi_addnative(struct scsi_data **sd)
  677. {
  678. int i, j;
  679. int devices[MAX_TOTAL_SCSI_DEVICES];
  680. int types[MAX_TOTAL_SCSI_DEVICES];
  681. struct device_info dis[MAX_TOTAL_SCSI_DEVICES];
  682. scsi_freenative (sd, MAX_TOTAL_SCSI_DEVICES);
  683. i = 0;
  684. while (i < MAX_TOTAL_SCSI_DEVICES) {
  685. types[i] = -1;
  686. devices[i] = -1;
  687. if (sys_command_open (i)) {
  688. if (sys_command_info (i, &dis[i], 0)) {
  689. devices[i] = i;
  690. types[i] = 100 - i;
  691. if (dis[i].type == INQ_ROMD)
  692. types[i] = 1000 - i;
  693. }
  694. sys_command_close (i);
  695. }
  696. i++;
  697. }
  698. i = 0;
  699. while (devices[i] >= 0) {
  700. j = i + 1;
  701. while (devices[j] >= 0) {
  702. if (types[i] > types[j]) {
  703. int tmp = types[i];
  704. types[i] = types[j];
  705. types[j] = tmp;
  706. }
  707. j++;
  708. }
  709. i++;
  710. }
  711. i = 0; j = 0;
  712. while (devices[i] >= 0 && j < 7) {
  713. if (sd[j] == NULL) {
  714. sd[j] = scsi_alloc_native(j, devices[i]);
  715. write_log (_T("SCSI: %d:'%s'\n"), j, dis[i].label);
  716. i++;
  717. }
  718. j++;
  719. }
  720. }
  721. // raw scsi
  722. #define SCSI_IO_BUSY 0x80
  723. #define SCSI_IO_ATN 0x40
  724. #define SCSI_IO_SEL 0x20
  725. #define SCSI_IO_REQ 0x10
  726. #define SCSI_IO_DIRECTION 0x01
  727. #define SCSI_IO_COMMAND 0x02
  728. #define SCSI_IO_MESSAGE 0x04
  729. #define SCSI_SIGNAL_PHASE_FREE -1
  730. #define SCSI_SIGNAL_PHASE_ARBIT -2
  731. #define SCSI_SIGNAL_PHASE_SELECT_1 -3
  732. #define SCSI_SIGNAL_PHASE_SELECT_2 -4
  733. #define SCSI_SIGNAL_PHASE_DATA_OUT 0
  734. #define SCSI_SIGNAL_PHASE_DATA_IN 1
  735. #define SCSI_SIGNAL_PHASE_COMMAND 2
  736. #define SCSI_SIGNAL_PHASE_STATUS 3
  737. #define SCSI_SIGNAL_PHASE_MESSAGE_OUT 6
  738. #define SCSI_SIGNAL_PHASE_MESSAGE_IN 7
  739. struct raw_scsi
  740. {
  741. int io;
  742. int bus_phase;
  743. bool atn;
  744. bool ack;
  745. bool wait_ack;
  746. uae_u8 data_write;
  747. uae_u8 status;
  748. bool databusoutput;
  749. int initiator_id, target_id;
  750. struct scsi_data *device[MAX_TOTAL_SCSI_DEVICES];
  751. struct scsi_data *target;
  752. int msglun;
  753. };
  754. struct soft_scsi
  755. {
  756. uae_u8 regs[32];
  757. uae_u16 regs_400[2];
  758. uae_u8 scratch_400[64];
  759. int c400_count;
  760. bool c400;
  761. bool dp8490v;
  762. uae_u8 aic_reg;
  763. struct raw_scsi rscsi;
  764. bool irq;
  765. bool intena;
  766. bool level6;
  767. bool enabled;
  768. bool delayed_irq;
  769. bool configured;
  770. uae_u8 acmemory[128];
  771. uaecptr baseaddress;
  772. uaecptr baseaddress2;
  773. uae_u8 *rom;
  774. int rom_size;
  775. int board_mask;
  776. int board_mask2;
  777. int board_size;
  778. addrbank *bank;
  779. int type;
  780. int subtype;
  781. int dma_direction;
  782. bool dma_active;
  783. bool dma_started;
  784. bool dma_controller;
  785. bool dma_drq;
  786. bool dma_autodack;
  787. uae_u32 dma_mask;
  788. struct romconfig *rc;
  789. struct soft_scsi **self_ptr;
  790. int dmac_direction;
  791. uaecptr dmac_address;
  792. int dmac_length;
  793. int dmac_active;
  794. int chip_state;
  795. // add500
  796. uae_u16 databuffer[2];
  797. bool databuffer_empty;
  798. // kronos/xebec
  799. uae_u8 *databufferptr;
  800. int databuffer_size;
  801. int db_read_index;
  802. int db_write_index;
  803. void *eeprom;
  804. // sasi
  805. bool active_select;
  806. bool wait_select;
  807. // 12 Gauge needs this (Driver has buggy BSY test)
  808. bool busy_delayed_hack;
  809. int busy_delayed_hack_cnt;
  810. };
  811. #define MAX_SOFT_SCSI_UNITS 10
  812. static struct soft_scsi *soft_scsi_devices[MAX_SOFT_SCSI_UNITS];
  813. static struct soft_scsi *soft_scsi_units[NCR_LAST * MAX_DUPLICATE_EXPANSION_BOARDS];
  814. bool parallel_port_scsi;
  815. static struct soft_scsi *parallel_port_scsi_data;
  816. static struct soft_scsi *x86_hd_data;
  817. static void soft_scsi_free_unit(struct soft_scsi *s)
  818. {
  819. if (!s)
  820. return;
  821. struct raw_scsi *rs = &s->rscsi;
  822. for (int j = 0; j < 8; j++) {
  823. free_scsi (rs->device[j]);
  824. rs->device[j] = NULL;
  825. }
  826. eeprom93xx_free(s->eeprom);
  827. xfree(s->databufferptr);
  828. xfree(s->rom);
  829. if (s->self_ptr)
  830. *s->self_ptr = NULL;
  831. xfree(s);
  832. }
  833. static void freescsi(struct soft_scsi **ncr)
  834. {
  835. if (!ncr)
  836. return;
  837. for (int i = 0; i < MAX_SOFT_SCSI_UNITS; i++) {
  838. if (soft_scsi_devices[i] == *ncr) {
  839. soft_scsi_devices[i] = NULL;
  840. }
  841. }
  842. if (*ncr) {
  843. soft_scsi_free_unit(*ncr);
  844. }
  845. *ncr = NULL;
  846. }
  847. static struct soft_scsi *allocscsi(struct soft_scsi **ncr, struct romconfig *rc, int ch)
  848. {
  849. struct soft_scsi *scsi;
  850. if (ch < 0) {
  851. freescsi(ncr);
  852. *ncr = NULL;
  853. }
  854. if ((*ncr) == NULL) {
  855. scsi = xcalloc(struct soft_scsi, 1);
  856. for (int i = 0; i < MAX_SOFT_SCSI_UNITS; i++) {
  857. if (soft_scsi_devices[i] == NULL) {
  858. soft_scsi_devices[i] = scsi;
  859. rc->unitdata = scsi;
  860. scsi->rc = rc;
  861. scsi->self_ptr = ncr;
  862. if (ncr)
  863. *ncr = scsi;
  864. return scsi;
  865. }
  866. }
  867. }
  868. return *ncr;
  869. }
  870. static struct soft_scsi *getscsiboard(uaecptr addr)
  871. {
  872. for (int i = 0; soft_scsi_devices[i]; i++) {
  873. struct soft_scsi *s = soft_scsi_devices[i];
  874. if (s->baseaddress2 && (addr & ~s->board_mask2) == s->baseaddress2)
  875. return s;
  876. if (!s->baseaddress && !s->configured)
  877. return s;
  878. if ((addr & ~s->board_mask) == s->baseaddress)
  879. return s;
  880. if (s->baseaddress == AUTOCONFIG_Z2 && addr < 65536)
  881. return s;
  882. }
  883. return NULL;
  884. }
  885. static void raw_scsi_reset(struct raw_scsi *rs)
  886. {
  887. rs->target = NULL;
  888. rs->io = 0;
  889. rs->bus_phase = SCSI_SIGNAL_PHASE_FREE;
  890. }
  891. extern addrbank soft_bank_generic;
  892. static void ew(struct soft_scsi *scsi, int addr, uae_u32 value)
  893. {
  894. addr &= 0xffff;
  895. if (addr == 00 || addr == 02 || addr == 0x40 || addr == 0x42) {
  896. scsi->acmemory[addr] = (value & 0xf0);
  897. scsi->acmemory[addr + 2] = (value & 0x0f) << 4;
  898. } else {
  899. scsi->acmemory[addr] = ~(value & 0xf0);
  900. scsi->acmemory[addr + 2] = ~((value & 0x0f) << 4);
  901. }
  902. }
  903. static struct soft_scsi *generic_soft_scsi_add(int ch, struct uaedev_config_info *ci, struct romconfig *rc, int type, int boardsize, int romsize, int romtype)
  904. {
  905. struct soft_scsi *ss = allocscsi(&soft_scsi_units[type * MAX_DUPLICATE_EXPANSION_BOARDS + ci->controller_type_unit], rc, ch);
  906. ss->type = type;
  907. ss->configured = 0;
  908. ss->bank = &soft_bank_generic;
  909. ss->subtype = rc->subtype;
  910. ss->intena = false;
  911. ss->dma_mask = 0xffffffff;
  912. if (boardsize > 0) {
  913. ss->board_size = boardsize;
  914. ss->board_mask = ss->board_size - 1;
  915. }
  916. if (!ss->board_mask && !ss->board_size) {
  917. ss->board_size = 0x10000;
  918. ss->board_mask = 0xffff;
  919. }
  920. ss->board_mask2 = ss->board_mask;
  921. if (romsize >= 0) {
  922. ss->rom_size = romsize;
  923. xfree(ss->rom);
  924. ss->rom = NULL;
  925. if (romsize > 0) {
  926. ss->rom = xcalloc(uae_u8, ss->rom_size);
  927. memset(ss->rom, 0xff, ss->rom_size);
  928. }
  929. }
  930. memset(ss->acmemory, 0xff, sizeof ss->acmemory);
  931. const struct expansionromtype *ert = get_device_expansion_rom(romtype);
  932. if (ert) {
  933. const uae_u8 *ac = NULL;
  934. if (ert->subtypes)
  935. ac = ert->subtypes[rc->subtype].autoconfig;
  936. else
  937. ac = ert->autoconfig;
  938. if (ac[0]) {
  939. for (int i = 0; i < 16; i++) {
  940. uae_u8 b = ac[i];
  941. ew(ss, i * 4, b);
  942. }
  943. }
  944. }
  945. raw_scsi_reset(&ss->rscsi);
  946. if (ch < 0)
  947. return ss;
  948. add_scsi_device(&ss->rscsi.device[ch], ch, ci, rc);
  949. return ss;
  950. }
  951. static void raw_scsi_busfree(struct raw_scsi *rs)
  952. {
  953. rs->target = NULL;
  954. rs->io = 0;
  955. rs->bus_phase = SCSI_SIGNAL_PHASE_FREE;
  956. }
  957. static void bus_free(struct raw_scsi *rs)
  958. {
  959. rs->bus_phase = SCSI_SIGNAL_PHASE_FREE;
  960. rs->io = 0;
  961. }
  962. static int getbit(uae_u8 v)
  963. {
  964. for (int i = 7; i >= 0; i--) {
  965. if ((1 << i) & v)
  966. return i;
  967. }
  968. return -1;
  969. }
  970. static int countbits(uae_u8 v)
  971. {
  972. int cnt = 0;
  973. for (int i = 7; i >= 0; i--) {
  974. if ((1 << i) & v)
  975. cnt++;
  976. }
  977. return cnt;
  978. }
  979. static void raw_scsi_reset_bus(struct soft_scsi *scsi)
  980. {
  981. struct raw_scsi *r = &scsi->rscsi;
  982. #if RAW_SCSI_DEBUG
  983. write_log(_T("SCSI BUS reset\n"));
  984. #endif
  985. raw_scsi_reset(r);
  986. for (int i = 0; i < 8; i++) {
  987. scsi_emulate_reset_device(r->device[i]);
  988. }
  989. }
  990. static void raw_scsi_set_databus(struct raw_scsi *rs, bool databusoutput)
  991. {
  992. rs->databusoutput = databusoutput;
  993. }
  994. static void raw_scsi_set_signal_phase(struct raw_scsi *rs, bool busy, bool select, bool atn)
  995. {
  996. switch (rs->bus_phase)
  997. {
  998. case SCSI_SIGNAL_PHASE_FREE:
  999. if (busy && !select && !rs->databusoutput) {
  1000. if (countbits(rs->data_write) != 1) {
  1001. #if RAW_SCSI_DEBUG
  1002. write_log(_T("raw_scsi: invalid arbitration scsi id mask! (%02x) %08x\n"), rs->data_write, M68K_GETPC);
  1003. #endif
  1004. return;
  1005. }
  1006. rs->bus_phase = SCSI_SIGNAL_PHASE_ARBIT;
  1007. rs->initiator_id = getbit(rs->data_write);
  1008. #if RAW_SCSI_DEBUG
  1009. write_log(_T("raw_scsi: arbitration initiator id %d (%02x) %08x\n"), rs->initiator_id, rs->data_write, M68K_GETPC);
  1010. #endif
  1011. } else if (!busy && select) {
  1012. if (countbits(rs->data_write) > 2 || rs->data_write == 0) {
  1013. #if RAW_SCSI_DEBUG
  1014. write_log(_T("raw_scsi: invalid scsi id selected mask (%02x) %08x\n"), rs->data_write, M68K_GETPC);
  1015. #endif
  1016. return;
  1017. }
  1018. rs->initiator_id = -1;
  1019. rs->bus_phase = SCSI_SIGNAL_PHASE_SELECT_1;
  1020. #if RAW_SCSI_DEBUG
  1021. write_log(_T("raw_scsi: selected scsi id mask (%02x) %08x\n"), rs->data_write, M68K_GETPC);
  1022. #endif
  1023. raw_scsi_set_signal_phase(rs, busy, select, atn);
  1024. }
  1025. break;
  1026. case SCSI_SIGNAL_PHASE_ARBIT:
  1027. rs->target_id = -1;
  1028. rs->target = NULL;
  1029. if (busy && select) {
  1030. rs->bus_phase = SCSI_SIGNAL_PHASE_SELECT_1;
  1031. }
  1032. break;
  1033. case SCSI_SIGNAL_PHASE_SELECT_1:
  1034. rs->atn = atn;
  1035. rs->msglun = -1;
  1036. rs->target_id = -1;
  1037. if (!busy) {
  1038. for (int i = 0; i < 8; i++) {
  1039. if (i == rs->initiator_id)
  1040. continue;
  1041. if ((rs->data_write & (1 << i)) && rs->device[i]) {
  1042. rs->target_id = i;
  1043. rs->target = rs->device[rs->target_id];
  1044. #if RAW_SCSI_DEBUG
  1045. write_log(_T("raw_scsi: selected id %d %08x\n"), rs->target_id, M68K_GETPC);
  1046. #endif
  1047. rs->io |= SCSI_IO_BUSY;
  1048. }
  1049. }
  1050. #if RAW_SCSI_DEBUG
  1051. if (rs->target_id < 0) {
  1052. for (int i = 0; i < 8; i++) {
  1053. if (i == rs->initiator_id)
  1054. continue;
  1055. if ((rs->data_write & (1 << i)) && !rs->device[i]) {
  1056. write_log(_T("raw_scsi: selected non-existing id %d %08x\n"), i, M68K_GETPC);
  1057. }
  1058. }
  1059. }
  1060. #endif
  1061. if (rs->target_id >= 0) {
  1062. rs->bus_phase = SCSI_SIGNAL_PHASE_SELECT_2;
  1063. } else {
  1064. if (!select) {
  1065. rs->bus_phase = SCSI_SIGNAL_PHASE_FREE;
  1066. }
  1067. }
  1068. }
  1069. break;
  1070. case SCSI_SIGNAL_PHASE_SELECT_2:
  1071. if (!select) {
  1072. scsi_start_transfer(rs->target);
  1073. rs->bus_phase = rs->atn ? SCSI_SIGNAL_PHASE_MESSAGE_OUT : SCSI_SIGNAL_PHASE_COMMAND;
  1074. rs->io = SCSI_IO_BUSY | SCSI_IO_REQ;
  1075. }
  1076. break;
  1077. }
  1078. }
  1079. static uae_u8 raw_scsi_get_signal_phase(struct raw_scsi *rs)
  1080. {
  1081. uae_u8 v = rs->io;
  1082. if (rs->bus_phase >= 0)
  1083. v |= rs->bus_phase;
  1084. if (rs->ack)
  1085. v &= ~SCSI_IO_REQ;
  1086. return v;
  1087. }
  1088. static uae_u8 raw_scsi_get_data_2(struct raw_scsi *rs, bool next, bool nodebug)
  1089. {
  1090. struct scsi_data *sd = rs->target;
  1091. uae_u8 v = 0;
  1092. switch (rs->bus_phase)
  1093. {
  1094. case SCSI_SIGNAL_PHASE_FREE:
  1095. v = 0;
  1096. break;
  1097. case SCSI_SIGNAL_PHASE_ARBIT:
  1098. #if RAW_SCSI_DEBUG
  1099. write_log(_T("raw_scsi: arbitration %08x\n"), M68K_GETPC);
  1100. #endif
  1101. v = rs->data_write;
  1102. break;
  1103. case SCSI_SIGNAL_PHASE_DATA_IN:
  1104. #if RAW_SCSI_DEBUG > 2
  1105. scsi_receive_data(sd, &v, false);
  1106. write_log(_T("raw_scsi: read data byte %02x (%d/%d) %08x\n"), v, sd->offset, sd->data_len, M68K_GETPC);
  1107. #endif
  1108. if (scsi_receive_data(sd, &v, next)) {
  1109. #if RAW_SCSI_DEBUG
  1110. write_log(_T("raw_scsi: data in finished, %d bytes: status phase\n"), sd->offset);
  1111. #endif
  1112. rs->bus_phase = SCSI_SIGNAL_PHASE_STATUS;
  1113. }
  1114. break;
  1115. case SCSI_SIGNAL_PHASE_STATUS:
  1116. #if RAW_SCSI_DEBUG
  1117. if (!nodebug || next)
  1118. write_log(_T("raw_scsi: status byte read %02x. Next=%d PC=%08x\n"), sd->status, next, M68K_GETPC);
  1119. #endif
  1120. v = sd->status;
  1121. if (next) {
  1122. sd->status = 0;
  1123. rs->bus_phase = SCSI_SIGNAL_PHASE_MESSAGE_IN;
  1124. }
  1125. break;
  1126. case SCSI_SIGNAL_PHASE_MESSAGE_IN:
  1127. #if RAW_SCSI_DEBUG
  1128. if (!nodebug || next)
  1129. write_log(_T("raw_scsi: message byte read %02x. Next=%d PC=%08x\n"), sd->status, next, M68K_GETPC);
  1130. #endif
  1131. v = sd->status;
  1132. rs->status = v;
  1133. if (next) {
  1134. bus_free(rs);
  1135. }
  1136. break;
  1137. default:
  1138. #if RAW_SCSI_DEBUG
  1139. write_log(_T("raw_scsi_get_data but bus phase is %d %08x!\n"), rs->bus_phase, M68K_GETPC);
  1140. #endif
  1141. break;
  1142. }
  1143. return v;
  1144. }
  1145. static uae_u8 raw_scsi_get_data(struct raw_scsi *rs, bool next)
  1146. {
  1147. return raw_scsi_get_data_2(rs, next, true);
  1148. }
  1149. static int getmsglen(uae_u8 *msgp, int len)
  1150. {
  1151. uae_u8 msg = msgp[0];
  1152. if (msg == 0 || (msg >= 0x02 && msg <= 0x1f) ||msg >= 0x80)
  1153. return 1;
  1154. if (msg >= 0x20 && msg <= 0x2f)
  1155. return 2;
  1156. // extended message, at least 3 bytes
  1157. if (len < 2)
  1158. return 3;
  1159. return msgp[1];
  1160. }
  1161. static void raw_scsi_write_data(struct raw_scsi *rs, uae_u8 data)
  1162. {
  1163. struct scsi_data *sd = rs->target;
  1164. int len;
  1165. switch (rs->bus_phase)
  1166. {
  1167. case SCSI_SIGNAL_PHASE_SELECT_1:
  1168. case SCSI_SIGNAL_PHASE_FREE:
  1169. break;
  1170. case SCSI_SIGNAL_PHASE_COMMAND:
  1171. sd->cmd[sd->offset++] = data;
  1172. len = scsicmdsizes[sd->cmd[0] >> 5];
  1173. #if RAW_SCSI_DEBUG > 1
  1174. write_log(_T("raw_scsi: got command byte %02x (%d/%d) %08x\n"), data, sd->offset, len, M68K_GETPC);
  1175. #endif
  1176. if (sd->offset >= len) {
  1177. if (rs->msglun >= 0) {
  1178. sd->cmd[1] &= ~(0x80 | 0x40 | 0x20);
  1179. sd->cmd[1] |= rs->msglun << 5;
  1180. }
  1181. scsi_emulate_analyze(rs->target);
  1182. if (sd->direction > 0) {
  1183. #if RAW_SCSI_DEBUG
  1184. write_log(_T("raw_scsi: data out %d bytes required\n"), sd->data_len);
  1185. #endif
  1186. scsi_start_transfer(sd);
  1187. rs->bus_phase = SCSI_SIGNAL_PHASE_DATA_OUT;
  1188. } else if (sd->direction <= 0) {
  1189. scsi_emulate_cmd(sd);
  1190. scsi_start_transfer(sd);
  1191. #if RAW_SCSI_DEBUG
  1192. if (sd->status) {
  1193. write_log(_T("raw_scsi: status = %d len = %d\n"), sd->status, sd->data_len);
  1194. }
  1195. #endif
  1196. if (!sd->status && sd->data_len > 0) {
  1197. #if RAW_SCSI_DEBUG
  1198. write_log(_T("raw_scsi: data in %d bytes waiting\n"), sd->data_len);
  1199. #endif
  1200. rs->bus_phase = SCSI_SIGNAL_PHASE_DATA_IN;
  1201. } else {
  1202. #if RAW_SCSI_DEBUG
  1203. write_log(_T("raw_scsi: no data, status = %d\n"), sd->status);
  1204. #endif
  1205. rs->bus_phase = SCSI_SIGNAL_PHASE_STATUS;
  1206. }
  1207. }
  1208. }
  1209. break;
  1210. case SCSI_SIGNAL_PHASE_DATA_OUT:
  1211. #if RAW_SCSI_DEBUG > 2
  1212. write_log(_T("raw_scsi: write data byte %02x (%d/%d) %08x\n"), data, sd->offset, sd->data_len, M68K_GETPC);
  1213. #endif
  1214. if (scsi_send_data(sd, data)) {
  1215. #if RAW_SCSI_DEBUG
  1216. write_log(_T("raw_scsi: data out finished, %d bytes\n"), sd->data_len);
  1217. #endif
  1218. scsi_emulate_cmd(sd);
  1219. rs->bus_phase = SCSI_SIGNAL_PHASE_STATUS;
  1220. }
  1221. break;
  1222. case SCSI_SIGNAL_PHASE_MESSAGE_OUT:
  1223. sd->msgout[sd->offset++] = data;
  1224. len = getmsglen(sd->msgout, sd->offset);
  1225. #if RAW_SCSI_DEBUG
  1226. write_log(_T("raw_scsi_put_data got message %02x (%d/%d) %08x\n"), data, sd->offset, len, M68K_GETPC);
  1227. #endif
  1228. if (sd->offset >= len) {
  1229. #if RAW_SCSI_DEBUG
  1230. write_log(_T("raw_scsi_put_data got message %02x (%d bytes)\n"), sd->msgout[0], len);
  1231. #endif
  1232. if ((sd->msgout[0] & (0x80 | 0x20)) == 0x80)
  1233. rs->msglun = sd->msgout[0] & 7;
  1234. scsi_start_transfer(sd);
  1235. rs->bus_phase = SCSI_SIGNAL_PHASE_COMMAND;
  1236. }
  1237. break;
  1238. default:
  1239. #if RAW_SCSI_DEBUG
  1240. write_log(_T("raw_scsi_put_data but bus phase is %d!\n"), rs->bus_phase);
  1241. #endif
  1242. break;
  1243. }
  1244. }
  1245. static void raw_scsi_put_data(struct raw_scsi *rs, uae_u8 data, bool databusoutput)
  1246. {
  1247. rs->data_write = data;
  1248. if (!databusoutput)
  1249. return;
  1250. raw_scsi_write_data(rs, data);
  1251. }
  1252. static void raw_scsi_set_ack(struct raw_scsi *rs, bool ack)
  1253. {
  1254. if (rs->ack != ack) {
  1255. rs->ack = ack;
  1256. if (!ack)
  1257. return;
  1258. if (rs->bus_phase < 0)
  1259. return;
  1260. if (!(rs->bus_phase & SCSI_IO_DIRECTION)) {
  1261. if (rs->databusoutput) {
  1262. raw_scsi_write_data(rs, rs->data_write);
  1263. }
  1264. } else {
  1265. raw_scsi_get_data_2(rs, true, false);
  1266. }
  1267. }
  1268. }
  1269. // APOLLO SOFTSCSI
  1270. void apollo_scsi_bput(uaecptr addr, uae_u8 v, uae_u32 config)
  1271. {
  1272. struct soft_scsi *as = getscsiboard(addr);
  1273. if (!as)
  1274. return;
  1275. int bank = addr & (0x800 | 0x400);
  1276. struct raw_scsi *rs = &as->rscsi;
  1277. addr &= 0x3fff;
  1278. if (bank == 0) {
  1279. raw_scsi_put_data(rs, v, true);
  1280. } else if (bank == 0xc00 && !(addr & 1)) {
  1281. as->irq = (v & 64) != 0;
  1282. raw_scsi_set_signal_phase(rs,
  1283. (v & 128) != 0,
  1284. (v & 32) != 0,
  1285. false);
  1286. } else if (bank == 0x400 && (addr & 1)) {
  1287. raw_scsi_put_data(rs, v, true);
  1288. raw_scsi_set_signal_phase(rs, true, false, false);
  1289. }
  1290. //write_log(_T("apollo scsi put %04x = %02x\n"), addr, v);
  1291. }
  1292. uae_u8 apollo_scsi_bget(uaecptr addr, uae_u32 config)
  1293. {
  1294. struct soft_scsi *as = getscsiboard(addr);
  1295. if (!as)
  1296. return 0;
  1297. int bank = addr & (0x800 | 0x400);
  1298. struct raw_scsi *rs = &as->rscsi;
  1299. uae_u8 v = 0xff;
  1300. addr &= 0x3fff;
  1301. if (bank == 0) {
  1302. v = raw_scsi_get_data(rs, true);
  1303. } else if (bank == 0x800 && (addr & 1)) {
  1304. uae_u8 t = raw_scsi_get_signal_phase(rs);
  1305. v = 0;
  1306. if (config & 1) // scsi module installed
  1307. v |= 1;
  1308. if (t & SCSI_IO_BUSY)
  1309. v |= 128;
  1310. if (t & SCSI_IO_SEL)
  1311. v |= 32;
  1312. if (t & SCSI_IO_REQ)
  1313. v |= 2;
  1314. if (t & SCSI_IO_DIRECTION)
  1315. v |= 8;
  1316. if (t & SCSI_IO_COMMAND)
  1317. v |= 16;
  1318. if (t & SCSI_IO_MESSAGE)
  1319. v |= 4;
  1320. v ^= (1 | 2 | 4 | 8 | 16 | 32 | 128);
  1321. //v |= apolloscsi.irq ? 64 : 0;
  1322. }
  1323. //write_log(_T("apollo scsi get %04x = %02x\n"), addr, v);
  1324. return v;
  1325. }
  1326. void apollo_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc);
  1327. void apollo_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  1328. {
  1329. if (ch < 0) {
  1330. generic_soft_scsi_add(-1, ci, rc, NONCR_APOLLO, -1, -1, ROMTYPE_APOLLO);
  1331. // make sure IDE side is also initialized
  1332. struct uaedev_config_info ci2 = { 0 };
  1333. apollo_add_ide_unit(-1, &ci2, rc);
  1334. } else {
  1335. if (ci->controller_type < HD_CONTROLLER_TYPE_SCSI_FIRST) {
  1336. apollo_add_ide_unit(ch, ci, rc);
  1337. } else {
  1338. generic_soft_scsi_add(ch, ci, rc, NONCR_APOLLO, -1, -1, ROMTYPE_APOLLO);
  1339. }
  1340. }
  1341. }
  1342. uae_u8 ncr5380_bget(struct soft_scsi *scsi, int reg);
  1343. void ncr5380_bput(struct soft_scsi *scsi, int reg, uae_u8 v);
  1344. static void supra_do_dma(struct soft_scsi *ncr)
  1345. {
  1346. int len = ncr->dmac_length;
  1347. for (int i = 0; i < len; i++) {
  1348. if (ncr->dmac_direction < 0) {
  1349. dma_put_byte(ncr->dmac_address & ncr->dma_mask, ncr5380_bget(ncr, 0));
  1350. } else if (ncr->dmac_direction > 0) {
  1351. ncr5380_bput(ncr, 0, dma_get_byte(ncr->dmac_address & ncr->dma_mask));
  1352. }
  1353. ncr->dmac_length--;
  1354. ncr->dmac_address++;
  1355. }
  1356. }
  1357. uae_u8 aic_bget_dma(struct soft_scsi *scsi, bool *phaseerr);
  1358. void aic_bput_dma(struct soft_scsi *scsi, uae_u8 v, bool *phaseerr);
  1359. static void hardframe_do_dma(struct soft_scsi *ncr)
  1360. {
  1361. int len = ncr->dmac_length;
  1362. for (int i = 0; i < len; i++) {
  1363. bool phaseerr;
  1364. if (ncr->dmac_direction < 0) {
  1365. uae_u8 v = aic_bget_dma(ncr, &phaseerr);
  1366. if (phaseerr)
  1367. break;
  1368. dma_put_byte(ncr->dmac_address & ncr->dma_mask, v);
  1369. } else if (ncr->dmac_direction > 0) {
  1370. uae_u8 v = dma_get_byte(ncr->dmac_address & ncr->dma_mask);
  1371. aic_bput_dma(ncr, v, &phaseerr);
  1372. if (phaseerr)
  1373. break;
  1374. }
  1375. ncr->dmac_length--;
  1376. ncr->dmac_address++;
  1377. }
  1378. }
  1379. static void xebec_do_dma(struct soft_scsi *ncr)
  1380. {
  1381. struct raw_scsi *rs = &ncr->rscsi;
  1382. while (rs->bus_phase == SCSI_SIGNAL_PHASE_DATA_OUT || rs->bus_phase == SCSI_SIGNAL_PHASE_DATA_IN) {
  1383. if (rs->bus_phase == SCSI_SIGNAL_PHASE_DATA_IN) {
  1384. dma_put_byte(ncr->dmac_address & ncr->dma_mask, ncr5380_bget(ncr, 8));
  1385. } else if (rs->bus_phase == SCSI_SIGNAL_PHASE_DATA_OUT) {
  1386. ncr5380_bput(ncr, 8, dma_get_byte(ncr->dmac_address & ncr->dma_mask));
  1387. }
  1388. }
  1389. }
  1390. static void overdrive_do_dma(struct soft_scsi *ncr)
  1391. {
  1392. struct raw_scsi *rs = &ncr->rscsi;
  1393. while ((rs->bus_phase == SCSI_SIGNAL_PHASE_DATA_OUT || rs->bus_phase == SCSI_SIGNAL_PHASE_DATA_IN) && ncr->dmac_length > 0) {
  1394. if (rs->bus_phase == SCSI_SIGNAL_PHASE_DATA_IN) {
  1395. dma_put_byte(ncr->dmac_address & ncr->dma_mask, ncr5380_bget(ncr, 8));
  1396. ncr->dmac_address++;
  1397. ncr->dmac_length--;
  1398. } else if (rs->bus_phase == SCSI_SIGNAL_PHASE_DATA_OUT) {
  1399. ncr5380_bput(ncr, 8, dma_get_byte(ncr->dmac_address & ncr->dma_mask));
  1400. ncr->dmac_address++;
  1401. ncr->dmac_length--;
  1402. }
  1403. }
  1404. }
  1405. static void fireball_do_dma(struct soft_scsi* ncr)
  1406. {
  1407. struct raw_scsi* rs = &ncr->rscsi;
  1408. while (rs->bus_phase == SCSI_SIGNAL_PHASE_DATA_OUT || rs->bus_phase == SCSI_SIGNAL_PHASE_DATA_IN) {
  1409. if (rs->bus_phase == SCSI_SIGNAL_PHASE_DATA_IN) {
  1410. dma_put_byte(ncr->dmac_address & ncr->dma_mask, ncr5380_bget(ncr, 8));
  1411. ncr->dmac_address++;
  1412. } else if (rs->bus_phase == SCSI_SIGNAL_PHASE_DATA_OUT) {
  1413. ncr5380_bput(ncr, 8, dma_get_byte(ncr->dmac_address & ncr->dma_mask));
  1414. ncr->dmac_address++;
  1415. }
  1416. }
  1417. }
  1418. static void dma_check(struct soft_scsi *ncr)
  1419. {
  1420. if (ncr->dmac_active && ncr->dma_direction) {
  1421. m68k_cancel_idle();
  1422. if (ncr->type == NCR5380_SUPRA && ncr->subtype == 4) {
  1423. if (ncr->dmac_direction != ncr->dma_direction) {
  1424. write_log(_T("SUPRADMA: mismatched direction\n"));
  1425. ncr->dmac_active = 0;
  1426. return;
  1427. }
  1428. supra_do_dma(ncr);
  1429. }
  1430. if (ncr->type == NCR5380_XEBEC) {
  1431. xebec_do_dma(ncr);
  1432. }
  1433. if (ncr->type == NONCR_HARDFRAME) {
  1434. hardframe_do_dma(ncr);
  1435. }
  1436. if (ncr->type == NCR5380_OVERDRIVE) {
  1437. overdrive_do_dma(ncr);
  1438. }
  1439. if (ncr->type == NCR5380_FIREBALL) {
  1440. fireball_do_dma(ncr);
  1441. }
  1442. ncr->dmac_active = 0;
  1443. }
  1444. }
  1445. void x86_doirq(uint8_t irqnum);
  1446. static void ncr80_rethink(void)
  1447. {
  1448. for (int i = 0; soft_scsi_devices[i]; i++) {
  1449. struct soft_scsi *s = soft_scsi_devices[i];
  1450. if (s->irq && s->intena && (
  1451. (s->c400 && (s->regs_400[0] & 0x10) && !s->c400_count) ||
  1452. (s->dp8490v && (s->regs[18] & 0x20)) ||
  1453. (!s->c400 && !s->dp8490v)))
  1454. {
  1455. if (soft_scsi_devices[i] == x86_hd_data) {
  1456. ;// x86_doirq(5);
  1457. } else {
  1458. safe_interrupt_set(IRQ_SOURCE_SCSI, i, soft_scsi_devices[i]->level6);
  1459. }
  1460. }
  1461. }
  1462. }
  1463. // AIC-6250
  1464. static void aic_int(struct soft_scsi *scsi, uae_u8 mask)
  1465. {
  1466. scsi->regs[16 + 8] |= mask;
  1467. if ((scsi->regs[16 + 8] & scsi->regs[3]) & 0x1f) {
  1468. scsi->irq = true;
  1469. devices_rethink_all(ncr80_rethink);
  1470. } else {
  1471. scsi->irq = false;
  1472. }
  1473. }
  1474. static bool aic_phase_match(struct soft_scsi *scsi)
  1475. {
  1476. struct raw_scsi *r = &scsi->rscsi;
  1477. uae_u8 phase = r->bus_phase;
  1478. bool cd = (phase & SCSI_IO_COMMAND) != 0;
  1479. bool io = (phase & SCSI_IO_DIRECTION) != 0;
  1480. bool msg = (phase & SCSI_IO_MESSAGE) != 0;
  1481. if (phase >= 0 &&
  1482. ((scsi->regs[9] >> 5) & 1) == msg &&
  1483. ((scsi->regs[9] >> 6) & 1) == io &&
  1484. ((scsi->regs[9] >> 7) & 1) == cd) {
  1485. return true;
  1486. }
  1487. return false;
  1488. }
  1489. static void aic_reg_inc(struct soft_scsi *scsi)
  1490. {
  1491. if (scsi->aic_reg >= 8)
  1492. return;
  1493. scsi->aic_reg++;
  1494. }
  1495. static uae_u8 aic_bget_reg(struct soft_scsi *scsi)
  1496. {
  1497. return scsi->aic_reg & 15;
  1498. }
  1499. static uae_u8 aic_bget_dma(struct soft_scsi *scsi, bool *phaseerr)
  1500. {
  1501. struct raw_scsi *r = &scsi->rscsi;
  1502. if (!scsi->dma_direction)
  1503. return 0;
  1504. if (!aic_phase_match(scsi)) {
  1505. if (phaseerr)
  1506. *phaseerr = true;
  1507. if (!scsi->dmac_active) {
  1508. aic_int(scsi, 0x08); // COMMAND DONE
  1509. }
  1510. scsi->dma_direction = 0;
  1511. return 0;
  1512. }
  1513. if (phaseerr)
  1514. *phaseerr = false;
  1515. return raw_scsi_get_data(r, true);
  1516. }
  1517. static uae_u8 aic_bget_data(struct soft_scsi *scsi)
  1518. {
  1519. struct raw_scsi *r = &scsi->rscsi;
  1520. int reg = scsi->aic_reg;
  1521. uae_u8 v = scsi->regs[reg];
  1522. aic_reg_inc(scsi);
  1523. switch (reg)
  1524. {
  1525. case 0:
  1526. v = (scsi->dmac_length >> 0) & 0xff;
  1527. break;
  1528. case 1:
  1529. v = (scsi->dmac_length >> 8) & 0xff;
  1530. break;
  1531. case 2:
  1532. v = (scsi->dmac_length >> 16) & 0xff;
  1533. break;
  1534. case 6: // REVISION CONTROL
  1535. v = 2;
  1536. break;
  1537. case 7: // STATUS 0
  1538. {
  1539. v = scsi->regs[reg + 16] & 2;
  1540. if (r->bus_phase == SCSI_SIGNAL_PHASE_FREE)
  1541. v |= 0x10; // BUS FREE
  1542. if (raw_scsi_get_signal_phase(r) & SCSI_IO_REQ)
  1543. v |= 0x04; // SCSI REQ ON
  1544. if (scsi->dmac_length == 0)
  1545. v |= 0x01; // DMA BYTE COUNT ZERO
  1546. if ((raw_scsi_get_signal_phase(r) & SCSI_IO_REQ) && !aic_phase_match(scsi))
  1547. v |= 0x20; // PHASE MISMATCH
  1548. }
  1549. break;
  1550. case 8: // STATUS 1
  1551. {
  1552. v = scsi->regs[reg + 16] | 0x40;
  1553. if (scsi->regs[8] & 2) { // SCSI RESET OUT
  1554. v |= 0x20; // SCSI RESET IN
  1555. } else {
  1556. v &= ~0x20;
  1557. }
  1558. scsi->regs[reg + 16] = v;
  1559. }
  1560. break;
  1561. case 9: // SCSI SIGNAL
  1562. {
  1563. uae_u8 t = raw_scsi_get_signal_phase(r);
  1564. v = 0;
  1565. if (t & SCSI_IO_BUSY)
  1566. v |= 0x04;
  1567. if (t & SCSI_IO_ATN)
  1568. v |= 0x10;
  1569. if (t & SCSI_IO_SEL)
  1570. v |= 0x08;
  1571. if (t & SCSI_IO_REQ)
  1572. v |= 0x02;
  1573. if (t & SCSI_IO_DIRECTION)
  1574. v |= 0x40;
  1575. if (t & SCSI_IO_COMMAND)
  1576. v |= 0x80;
  1577. if (t & SCSI_IO_MESSAGE)
  1578. v |= 0x20;
  1579. if (r->ack)
  1580. v |= 0x01;
  1581. }
  1582. break;
  1583. case 10: // SCSI ID DATA
  1584. v = scsi->regs[16 + 10];
  1585. break;
  1586. case 13:
  1587. {
  1588. // SCSI ID (4 to 7 only)
  1589. int vv = scsi->rc->device_id - 4;
  1590. if (vv < 0)
  1591. vv = 0;
  1592. vv ^= 3;
  1593. vv = (vv >> 1) | (vv << 1);
  1594. v = (vv & 3) << 5;
  1595. }
  1596. break;
  1597. }
  1598. return v;
  1599. }
  1600. static void aic_bput_reg(struct soft_scsi *scsi, uae_u8 v)
  1601. {
  1602. scsi->aic_reg = v & 15;
  1603. }
  1604. static void aic_bput_dma(struct soft_scsi *scsi, uae_u8 v, bool *phaseerr)
  1605. {
  1606. struct raw_scsi *r = &scsi->rscsi;
  1607. if (!scsi->dma_direction)
  1608. return;
  1609. if (!aic_phase_match(scsi)) {
  1610. if (phaseerr)
  1611. *phaseerr = true;
  1612. if (!scsi->dmac_active) {
  1613. aic_int(scsi, 0x08); // COMMAND DONE
  1614. }
  1615. scsi->dma_direction = 0;
  1616. return;
  1617. }
  1618. if (phaseerr)
  1619. *phaseerr = false;
  1620. raw_scsi_put_data(r, v, true);
  1621. }
  1622. static void aic_bput_data(struct soft_scsi *scsi, uae_u8 v)
  1623. {
  1624. struct raw_scsi *r = &scsi->rscsi;
  1625. int reg = scsi->aic_reg;
  1626. aic_reg_inc(scsi);
  1627. switch (reg)
  1628. {
  1629. case 0:
  1630. scsi->dmac_length &= 0xffff00;
  1631. scsi->dmac_length |= v << 0;
  1632. break;
  1633. case 1:
  1634. scsi->dmac_length &= 0xff00ff;
  1635. scsi->dmac_length |= v << 8;
  1636. break;
  1637. case 2:
  1638. scsi->dmac_length &= 0x00ffff;
  1639. scsi->dmac_length |= v << 16;
  1640. break;
  1641. case 3: // INT MSK
  1642. // cleared interrupt mask clears request
  1643. scsi->regs[16 + 8] &= v | ~0x1f;
  1644. if (v & 0x40) { // ARB/SEL START
  1645. raw_scsi_put_data(r, scsi->regs[10], false);
  1646. raw_scsi_set_signal_phase(r, false, true, (v & 0x20) != 0);
  1647. raw_scsi_set_signal_phase(r, true, false, false);
  1648. aic_int(scsi, 0x08); // COMMAND DONE
  1649. scsi->regs[11] = scsi->regs[10]; // SOURCE AND DESTINATION ID = DATA
  1650. v &= ~0x40;
  1651. }
  1652. aic_int(scsi, 0);
  1653. break;
  1654. case 5:
  1655. if (v & 1) { // DMA XFER EN
  1656. scsi->dma_direction = (v & 2) ? 1 : -1;
  1657. if (scsi->dmac_active) {
  1658. dma_check(scsi);
  1659. aic_int(scsi, 0x08); // COMMAND DONE
  1660. scsi->dma_direction = 0;
  1661. }
  1662. } else {
  1663. scsi->dma_direction = 0;
  1664. }
  1665. break;
  1666. case 8: // CONTROL
  1667. if (v & 2) { // SCSI RESET OUT
  1668. raw_scsi_reset(r);
  1669. }
  1670. if (v & 0x80) { // AUTO SCSI PIO REQ
  1671. if (aic_phase_match(scsi)) {
  1672. int phase = r->bus_phase;
  1673. bool io = (phase & SCSI_IO_DIRECTION) != 0;
  1674. scsi->regs[16 + 7] &= ~0x02;
  1675. if (!io) {
  1676. raw_scsi_put_data(r, scsi->regs[10], true);
  1677. } else {
  1678. scsi->regs[16 + 10] = raw_scsi_get_data(r, true);
  1679. }
  1680. aic_int(scsi, 0x08); // COMMAND DONE
  1681. if (phase != r->bus_phase)
  1682. scsi->regs[16 + 7] |= 0x02; // SCSI PHASE CHG/ATN
  1683. v &= ~0x80;
  1684. } else {
  1685. aic_int(scsi, 0x10); // ERROR
  1686. }
  1687. }
  1688. break;
  1689. case 9: // SCSI SIGNAL
  1690. break;
  1691. }
  1692. scsi->regs[reg] = v;
  1693. }
  1694. // NCR 53C80/MISC SCSI-LIKE
  1695. static void ncr5380_set_irq(struct soft_scsi *scsi)
  1696. {
  1697. if (scsi->irq)
  1698. return;
  1699. scsi->irq = true;
  1700. devices_rethink_all(ncr80_rethink);
  1701. if (scsi->delayed_irq)
  1702. x_do_cycles(2 * CYCLE_UNIT);
  1703. #if NCR5380_DEBUG_IRQ
  1704. write_log(_T("IRQ\n"));
  1705. #endif
  1706. }
  1707. static void ncr5380_databusoutput(struct soft_scsi *scsi)
  1708. {
  1709. bool databusoutput = (scsi->regs[1] & 1) != 0;
  1710. struct raw_scsi *r = &scsi->rscsi;
  1711. if (r->bus_phase >= 0 && (r->bus_phase & SCSI_IO_DIRECTION))
  1712. databusoutput = false;
  1713. raw_scsi_set_databus(r, databusoutput);
  1714. }
  1715. static void ncr5380_check(struct soft_scsi *scsi)
  1716. {
  1717. ncr5380_databusoutput(scsi);
  1718. }
  1719. static void ncr5380_check_phase(struct soft_scsi *scsi)
  1720. {
  1721. if (!(scsi->regs[2] & 2))
  1722. return;
  1723. if (scsi->regs[2] & 0x40)
  1724. return;
  1725. if (scsi->rscsi.bus_phase != (scsi->regs[3] & 7)) {
  1726. if (scsi->dma_controller) {
  1727. scsi->regs[5] |= 0x80; // end of dma
  1728. scsi->regs[3] |= 0x80; // last byte sent
  1729. }
  1730. ncr5380_set_irq(scsi);
  1731. }
  1732. }
  1733. static void ncr5380_reset(struct soft_scsi *scsi, bool busreset)
  1734. {
  1735. struct raw_scsi *r = &scsi->rscsi;
  1736. if (scsi->dp8490v) {
  1737. // DP8490V manual says all registers are reset but that can't work
  1738. // with Fireball driver. It assumes IMR is not reset.
  1739. memset(scsi->regs, 0, 16);
  1740. } else {
  1741. memset(scsi->regs, 0, sizeof scsi->regs);
  1742. }
  1743. if (busreset) {
  1744. raw_scsi_reset_bus(scsi);
  1745. scsi->regs[1] = 0x80;
  1746. ncr5380_set_irq(scsi);
  1747. }
  1748. }
  1749. uae_u8 ncr5380_bget(struct soft_scsi *scsi, int reg)
  1750. {
  1751. if (reg > 8)
  1752. return 0;
  1753. if (scsi->dp8490v) {
  1754. if ((scsi->regs[1] & 0x40) && reg == 7) {
  1755. reg = 17;
  1756. }
  1757. }
  1758. uae_u8 v = scsi->regs[reg];
  1759. struct raw_scsi *r = &scsi->rscsi;
  1760. switch(reg)
  1761. {
  1762. case 1:
  1763. break;
  1764. case 4:
  1765. {
  1766. uae_u8 oldv = v;
  1767. uae_u8 t = raw_scsi_get_signal_phase(r);
  1768. v = 0;
  1769. if (t & SCSI_IO_BUSY)
  1770. v |= 1 << 6;
  1771. if (t & SCSI_IO_REQ)
  1772. v |= 1 << 5;
  1773. if (t & SCSI_IO_SEL)
  1774. v |= 1 << 1;
  1775. if (r->bus_phase >= 0)
  1776. v |= r->bus_phase << 2;
  1777. if (scsi->regs[1] & 0x80)
  1778. v |= 0x80;
  1779. scsi->regs[reg] = v;
  1780. if (scsi->busy_delayed_hack && !(v & (1 << 6)) && (oldv & (1 << 6))) {
  1781. scsi->busy_delayed_hack_cnt = 2;
  1782. }
  1783. if (scsi->busy_delayed_hack_cnt > 0) {
  1784. scsi->busy_delayed_hack_cnt--;
  1785. v |= 1 << 6;
  1786. }
  1787. }
  1788. break;
  1789. case 5:
  1790. {
  1791. uae_u8 t = raw_scsi_get_signal_phase(r);
  1792. v &= (0x80 | 0x40 | 0x20 | 0x04);
  1793. if (t & SCSI_IO_ATN)
  1794. v |= 1 << 1;
  1795. if (r->bus_phase == (scsi->regs[3] & 7)) {
  1796. v |= 1 << 3;
  1797. }
  1798. if (scsi->irq) {
  1799. v |= 1 << 4;
  1800. }
  1801. if (scsi->dma_drq || (scsi->dma_active && !scsi->dma_controller && r->bus_phase == (scsi->regs[3] & 7))) {
  1802. scsi->dma_drq = true;
  1803. if (scsi->dma_autodack && r->bus_phase != (scsi->regs[3] & 7))
  1804. scsi->dma_drq = false;
  1805. if (scsi->dma_drq)
  1806. v |= 1 << 6;
  1807. }
  1808. if (scsi->regs[2] & 4) {
  1809. // monitor busy
  1810. if (r->bus_phase == SCSI_SIGNAL_PHASE_FREE) {
  1811. // any loss of busy = Busy error
  1812. // not just "unexpected" loss of busy
  1813. v |= 1 << 2;
  1814. scsi->dmac_active = false;
  1815. }
  1816. }
  1817. }
  1818. break;
  1819. case 0:
  1820. v = raw_scsi_get_data(r, false);
  1821. break;
  1822. case 6:
  1823. v = raw_scsi_get_data(r, scsi->dma_active);
  1824. ncr5380_check_phase(scsi);
  1825. break;
  1826. case 7:
  1827. scsi->irq = false;
  1828. break;
  1829. case 17: // DP8490V MODE_E
  1830. {
  1831. int efr = (scsi->regs[17] >> 1) & 3;
  1832. if (efr == 3) {
  1833. v = 0;
  1834. uae_u8 t = raw_scsi_get_signal_phase(r);
  1835. // End of DMA -> DMA Phase Mismatch
  1836. if (scsi->regs[5] & 0x80) {
  1837. v = 0x10;
  1838. }
  1839. // Any Phase Mismatch
  1840. if (r->bus_phase == (scsi->regs[3] & 7)) {
  1841. v |= 0x20;
  1842. }
  1843. scsi->regs[17] &= ~(3 << 1);
  1844. }
  1845. }
  1846. break;
  1847. case 8: // fake dma port
  1848. v = raw_scsi_get_data(r, true);
  1849. ncr5380_check_phase(scsi);
  1850. break;
  1851. }
  1852. ncr5380_check(scsi);
  1853. return v;
  1854. }
  1855. void ncr5380_bput(struct soft_scsi *scsi, int reg, uae_u8 v)
  1856. {
  1857. if (reg > 8)
  1858. return;
  1859. if (scsi->dp8490v) {
  1860. if ((scsi->regs[1] & 0x40) && reg == 7) {
  1861. reg = 17;
  1862. }
  1863. }
  1864. bool dataoutput = (scsi->regs[1] & 1) != 0;
  1865. struct raw_scsi *r = &scsi->rscsi;
  1866. uae_u8 old = scsi->regs[reg];
  1867. scsi->regs[reg] = v;
  1868. switch(reg)
  1869. {
  1870. case 0:
  1871. {
  1872. r->data_write = v;
  1873. // assert data bus can be only active if direction is out
  1874. // and bus phase matches
  1875. if (r->databusoutput) {
  1876. if (((scsi->regs[2] & 2) && scsi->dma_active) || r->bus_phase < 0) {
  1877. raw_scsi_write_data(r, v);
  1878. ncr5380_check_phase(scsi);
  1879. }
  1880. }
  1881. }
  1882. break;
  1883. case 1:
  1884. {
  1885. scsi->regs[reg] &= ~((1 << 5) | (1 << 6));
  1886. scsi->regs[reg] |= old & ((1 << 5) | (1 << 6)); // AIP, LA
  1887. if (!(v & 0x80)) {
  1888. bool init = r->bus_phase < 0;
  1889. ncr5380_databusoutput(scsi);
  1890. if (init && !dataoutput && (v & 1) && (scsi->regs[2] & 1)) {
  1891. r->bus_phase = SCSI_SIGNAL_PHASE_SELECT_1;
  1892. }
  1893. raw_scsi_set_signal_phase(r,
  1894. (v & (1 << 3)) != 0,
  1895. (v & (1 << 2)) != 0,
  1896. (v & (1 << 1)) != 0);
  1897. if (!(scsi->regs[2] & 2))
  1898. raw_scsi_set_ack(r, (v & (1 << 4)) != 0);
  1899. }
  1900. if (v & 0x80) { // RST
  1901. ncr5380_reset(scsi, true);
  1902. }
  1903. if (scsi->dp8490v) {
  1904. scsi->regs[reg] &= ~0x40;
  1905. scsi->regs[reg] |= v & 0x40;
  1906. }
  1907. }
  1908. break;
  1909. case 2:
  1910. if ((v & 1) && !(old & 1)) { // Arbitrate
  1911. r->databusoutput = false;
  1912. raw_scsi_set_signal_phase(r, true, false, false);
  1913. scsi->regs[1] |= 1 << 6; // AIP
  1914. scsi->regs[1] &= ~(1 << 5); // LA
  1915. } else if (!(v & 1) && (old & 1)) {
  1916. scsi->regs[1] &= ~(1 << 6);
  1917. }
  1918. if (!(v & 2)) {
  1919. // end of dma and dma request
  1920. scsi->regs[5] &= ~(0x80 | 0x40);
  1921. scsi->dma_direction = 0;
  1922. scsi->dma_active = false;
  1923. scsi->dma_drq = false;
  1924. }
  1925. break;
  1926. case 5:
  1927. scsi->regs[reg] = old;
  1928. if (scsi->regs[2] & 2) {
  1929. scsi->dma_direction = 1;
  1930. scsi->dma_active = true;
  1931. dma_check(scsi);
  1932. }
  1933. #if NCR5380_DEBUG
  1934. write_log(_T("DMA send PC=%08x\n"), M68K_GETPC);
  1935. #endif
  1936. break;
  1937. case 6:
  1938. if (scsi->regs[2] & 2) {
  1939. scsi->dma_direction = 1;
  1940. scsi->dma_active = true;
  1941. scsi->dma_started = true;
  1942. }
  1943. #if NCR5380_DEBUG
  1944. write_log(_T("DMA target recv PC=%08x\n"), M68K_GETPC);
  1945. #endif
  1946. break;
  1947. case 7:
  1948. if (scsi->regs[2] & 2) {
  1949. scsi->dma_direction = -1;
  1950. scsi->dma_active = true;
  1951. scsi->dma_started = true;
  1952. dma_check(scsi);
  1953. #if NCR5380_DEBUG
  1954. write_log(_T("DMA initiator recv PC=%08x\n"), M68K_GETPC);
  1955. #endif
  1956. }
  1957. break;
  1958. case 17: // DP8490V MODE_E
  1959. {
  1960. int efr = (old >> 1) & 3;
  1961. if (efr == 3) {
  1962. scsi->regs[18] = v;
  1963. scsi->regs[17] &= ~(3 << 1);
  1964. } else {
  1965. int efr = (v >> 1) & 3;
  1966. if (efr == 1) {
  1967. scsi->irq = false;
  1968. } else if (efr == 2) {
  1969. if (scsi->regs[2] & 2) {
  1970. // start DMA initiator receive
  1971. scsi->dma_direction = -1;
  1972. scsi->dma_active = true;
  1973. scsi->dma_started = true;
  1974. dma_check(scsi);
  1975. scsi->dmac_address = 0xffffffff;
  1976. #if NCR5380_DEBUG
  1977. write_log(_T("DMA8490 initiator recv PC=%08x\n"), M68K_GETPC);
  1978. #endif
  1979. }
  1980. }
  1981. }
  1982. }
  1983. break;
  1984. case 8: // fake dma port
  1985. if (r->bus_phase == (scsi->regs[3] & 7)) {
  1986. raw_scsi_put_data(r, v, true);
  1987. }
  1988. ncr5380_check_phase(scsi);
  1989. break;
  1990. }
  1991. ncr5380_check(scsi);
  1992. }
  1993. static bool ncr53400_5380(struct soft_scsi *scsi)
  1994. {
  1995. if (scsi->irq)
  1996. scsi->regs_400[1] = 0;
  1997. return !scsi->regs_400[1];
  1998. }
  1999. static void ncr53400_dmacount(struct soft_scsi *scsi)
  2000. {
  2001. scsi->c400_count++;
  2002. if (scsi->c400_count == 128) {
  2003. scsi->c400_count = 0;
  2004. scsi->regs_400[1]--;
  2005. scsi->regs_400[1] &= 0xff;
  2006. ncr5380_check_phase(scsi);
  2007. scsi->regs[5] |= 0x80; // end of dma
  2008. scsi->regs[3] |= 0x80; // last byte sent
  2009. ncr5380_set_irq(scsi);
  2010. }
  2011. }
  2012. static uae_u8 ncr53400_bget(struct soft_scsi *scsi, int reg)
  2013. {
  2014. struct raw_scsi *rs = &scsi->rscsi;
  2015. uae_u8 v = 0;
  2016. uae_u8 csr = (uae_u8)scsi->regs_400[0];
  2017. if (ncr53400_5380(scsi) && reg < 8) {
  2018. v = ncr5380_bget(scsi, reg);
  2019. #if NCR53400_DEBUG
  2020. static uae_u8 lastreg, lastval;
  2021. if (lastreg != reg || lastval != v) {
  2022. write_log(_T("53C80 REG GET %02x -> %02x\n"), reg, v);
  2023. lastreg = reg;
  2024. lastval = v;
  2025. }
  2026. #endif
  2027. return v;
  2028. }
  2029. if (reg & 0x80) {
  2030. v = raw_scsi_get_data(rs, true);
  2031. ncr53400_dmacount(scsi);
  2032. #if NCR53400_DEBUG
  2033. write_log(_T("53C400 DATA GET %02x %d\n"), v, scsi->c400_count);
  2034. #endif
  2035. } else if (reg & 0x100) {
  2036. switch (reg) {
  2037. case 0x100:
  2038. if (scsi->regs_400[1]) {
  2039. v |= 0x02;
  2040. } else {
  2041. v |= 0x04;
  2042. }
  2043. if (ncr53400_5380(scsi))
  2044. v |= 0x80;
  2045. if (scsi->irq)
  2046. v |= 0x01;
  2047. break;
  2048. case 0x101:
  2049. v = (uae_u8)scsi->regs_400[1];
  2050. break;
  2051. }
  2052. #if NCR53400_DEBUG
  2053. write_log(_T("53C400 REG GET %02x -> %02x\n"), reg, v);
  2054. #endif
  2055. } else if (reg & 0x200) {
  2056. v = scsi->scratch_400[reg & 0x3f];
  2057. }
  2058. ncr5380_check_phase(scsi);
  2059. return v;
  2060. }
  2061. static void ncr53400_bput(struct soft_scsi *scsi, int reg, uae_u8 v)
  2062. {
  2063. struct raw_scsi *rs = &scsi->rscsi;
  2064. uae_u8 csr = (uae_u8)scsi->regs_400[0];
  2065. if (ncr53400_5380(scsi) && reg < 8) {
  2066. ncr5380_bput(scsi, reg, v);
  2067. #if NCR53400_DEBUG
  2068. write_log(_T("53C80 REG PUT %02x -> %02x\n"), reg, v);
  2069. #endif
  2070. return;
  2071. }
  2072. if (reg & 0x80) {
  2073. raw_scsi_put_data(rs, v, true);
  2074. ncr53400_dmacount(scsi);
  2075. #if NCR53400_DEBUG
  2076. write_log(_T("53C400 DATA PUT %02x %d\n"), v, scsi->c400_count);
  2077. #endif
  2078. } else if (reg & 0x100) {
  2079. switch (reg) {
  2080. case 0x100:
  2081. scsi->regs_400[0] = v;
  2082. if (v & 0x80) {
  2083. // 53C400 reset does not reset 53C80
  2084. scsi->regs_400[0] = 0x80;
  2085. scsi->regs_400[1] = 0;
  2086. }
  2087. break;
  2088. case 0x101:
  2089. scsi->regs_400[1] = v;
  2090. if (v == 0)
  2091. scsi->regs_400[1] = 256;
  2092. scsi->c400_count = 0;
  2093. break;
  2094. }
  2095. #if NCR53400_DEBUG
  2096. write_log(_T("53C400 REG PUT %02x -> %02x\n"), reg, v);
  2097. #endif
  2098. } else if (reg & 0x200) {
  2099. scsi->scratch_400[reg & 0x3f] = v;
  2100. }
  2101. ncr5380_check_phase(scsi);
  2102. }
  2103. /* SASI */
  2104. static uae_u8 sasi_tecmar_bget(struct soft_scsi *scsi, int reg)
  2105. {
  2106. struct raw_scsi *rs = &scsi->rscsi;
  2107. uae_u8 v = 0;
  2108. if (reg == 1) {
  2109. uae_u8 t = raw_scsi_get_signal_phase(rs);
  2110. v = 0;
  2111. switch (rs->bus_phase)
  2112. {
  2113. case SCSI_SIGNAL_PHASE_DATA_OUT:
  2114. v = 0;
  2115. break;
  2116. case SCSI_SIGNAL_PHASE_DATA_IN:
  2117. v = 1 << 2;
  2118. break;
  2119. case SCSI_SIGNAL_PHASE_COMMAND:
  2120. v = 1 << 3;
  2121. break;
  2122. case SCSI_SIGNAL_PHASE_STATUS:
  2123. v = (1 << 2) | (1 << 3);
  2124. break;
  2125. case SCSI_SIGNAL_PHASE_MESSAGE_IN:
  2126. v = (1 << 2) | (1 << 3) | (1 << 4);
  2127. break;
  2128. }
  2129. if (t & SCSI_IO_BUSY)
  2130. v |= 1 << 1;
  2131. if (t & SCSI_IO_REQ)
  2132. v |= 1 << 0;
  2133. v = v ^ 0xff;
  2134. } else {
  2135. v = raw_scsi_get_data_2(rs, true, false);
  2136. }
  2137. //write_log(_T("SASI READ port %d: %02x\n"), reg, v);
  2138. return v;
  2139. }
  2140. static void sasi_tecmar_bput(struct soft_scsi *scsi, int reg, uae_u8 v)
  2141. {
  2142. struct raw_scsi *rs = &scsi->rscsi;
  2143. //write_log(_T("SASI WRITE port %d: %02x\n"), reg, v);
  2144. if (reg == 1) {
  2145. if ((v & 1)) {
  2146. raw_scsi_busfree(rs);
  2147. }
  2148. if ((v & 2) && !scsi->active_select) {
  2149. // select?
  2150. scsi->active_select = true;
  2151. if (!rs->data_write)
  2152. scsi->wait_select = true;
  2153. else
  2154. raw_scsi_set_signal_phase(rs, false, true, false);
  2155. } else if (!(v & 2) && scsi->active_select) {
  2156. scsi->active_select = false;
  2157. raw_scsi_set_signal_phase(rs, false, false, false);
  2158. }
  2159. } else {
  2160. raw_scsi_put_data(rs, v, true);
  2161. if (scsi->wait_select && scsi->active_select)
  2162. raw_scsi_set_signal_phase(rs, false, true, false);
  2163. scsi->wait_select = false;
  2164. }
  2165. }
  2166. static uae_u8 sasi_microforge_bget(struct soft_scsi *scsi, int reg)
  2167. {
  2168. struct raw_scsi *rs = &scsi->rscsi;
  2169. uae_u8 v = 0;
  2170. if (reg == 1) {
  2171. uae_u8 t = raw_scsi_get_signal_phase(rs);
  2172. v = 0;
  2173. if (rs->bus_phase >= 0) {
  2174. if (rs->bus_phase & SCSI_IO_MESSAGE)
  2175. v |= 1 << 1;
  2176. if (rs->bus_phase & SCSI_IO_COMMAND)
  2177. v |= 1 << 2;
  2178. if (rs->bus_phase & SCSI_IO_DIRECTION)
  2179. v |= 1 << 3;
  2180. }
  2181. if (t & SCSI_IO_BUSY)
  2182. v |= 1 << 0;
  2183. if (t & SCSI_IO_REQ)
  2184. v |= 1 << 4;
  2185. v = v ^ 0xff;
  2186. } else {
  2187. v = raw_scsi_get_data_2(rs, true, false);
  2188. }
  2189. //write_log(_T("SASI READ port %d: %02x\n"), reg, v);
  2190. return v;
  2191. }
  2192. static void sasi_microforge_bput(struct soft_scsi *scsi, int reg, uae_u8 v)
  2193. {
  2194. struct raw_scsi *rs = &scsi->rscsi;
  2195. //write_log(_T("SASI WRITE port %d: %02x\n"), reg, v);
  2196. if (reg == 1) {
  2197. if ((v & 4) && !scsi->active_select) {
  2198. // select?
  2199. scsi->active_select = true;
  2200. if (!rs->data_write)
  2201. scsi->wait_select = true;
  2202. else
  2203. raw_scsi_set_signal_phase(rs, false, true, false);
  2204. } else if (!(v & 4) && scsi->active_select) {
  2205. scsi->active_select = false;
  2206. raw_scsi_set_signal_phase(rs, false, false, false);
  2207. }
  2208. } else {
  2209. raw_scsi_put_data(rs, v, true);
  2210. if (scsi->wait_select && scsi->active_select)
  2211. raw_scsi_set_signal_phase(rs, false, true, false);
  2212. scsi->wait_select = false;
  2213. }
  2214. }
  2215. // OMTI 5510
  2216. static void omti_irq(struct soft_scsi *scsi)
  2217. {
  2218. if (scsi->chip_state & 2) {
  2219. scsi->chip_state |= 0x100;
  2220. if (scsi->intena)
  2221. ncr5380_set_irq(scsi);
  2222. }
  2223. }
  2224. static void omti_check_state(struct soft_scsi *scsi)
  2225. {
  2226. struct raw_scsi *rs = &scsi->rscsi;
  2227. if ((rs->bus_phase == SCSI_SIGNAL_PHASE_DATA_IN || rs->bus_phase == SCSI_SIGNAL_PHASE_DATA_OUT) && (scsi->chip_state & 1)) {
  2228. if (scsi->intena && (scsi->chip_state & 2)) {
  2229. ncr5380_set_irq(scsi);
  2230. }
  2231. }
  2232. }
  2233. static uae_u8 omti_bget(struct soft_scsi *scsi, int reg)
  2234. {
  2235. struct raw_scsi *rs = &scsi->rscsi;
  2236. uae_u8 t = raw_scsi_get_signal_phase(rs);
  2237. uae_u8 v = 0;
  2238. switch (reg)
  2239. {
  2240. case 0: // DATA IN
  2241. if (rs->bus_phase == SCSI_SIGNAL_PHASE_STATUS) {
  2242. v = raw_scsi_get_data_2(rs, true, false);
  2243. // get message (not used in OMTI protocol)
  2244. raw_scsi_get_data_2(rs, true, false);
  2245. } else {
  2246. v = raw_scsi_get_data_2(rs, true, false);
  2247. if (rs->bus_phase == SCSI_SIGNAL_PHASE_STATUS) {
  2248. omti_irq(scsi); // command complete interrupt
  2249. }
  2250. }
  2251. break;
  2252. case 1: // STATUS
  2253. if (rs->bus_phase >= 0)
  2254. v |= 8; // busy
  2255. if (v & 8) {
  2256. if (t & SCSI_IO_REQ)
  2257. v |= 1; // req
  2258. if (t & SCSI_IO_DIRECTION)
  2259. v |= 2;
  2260. if (t & SCSI_IO_COMMAND)
  2261. v |= 4;
  2262. }
  2263. v |= 0x80 | 0x40; // always one
  2264. if ((rs->bus_phase == SCSI_SIGNAL_PHASE_DATA_IN || rs->bus_phase == SCSI_SIGNAL_PHASE_DATA_OUT) && (scsi->chip_state & 1))
  2265. v |= 0x10; // DREQ
  2266. if (scsi->chip_state & 0x100)
  2267. v |= 0x20; // IREQ
  2268. if (rs->bus_phase != SCSI_SIGNAL_PHASE_STATUS) {
  2269. scsi->chip_state &= ~0x100;
  2270. scsi->irq = false;
  2271. }
  2272. break;
  2273. case 2: // CONFIGURATION
  2274. v = 0xff;
  2275. break;
  2276. case 3: // -
  2277. break;
  2278. }
  2279. omti_check_state(scsi);
  2280. return v;
  2281. }
  2282. static void omti_bput(struct soft_scsi *scsi, int reg, uae_u8 v)
  2283. {
  2284. struct raw_scsi *rs = &scsi->rscsi;
  2285. switch (reg)
  2286. {
  2287. case 0: // DATA OUT
  2288. raw_scsi_put_data(rs, v, true);
  2289. if (rs->bus_phase == SCSI_SIGNAL_PHASE_STATUS)
  2290. omti_irq(scsi); // command complete interrupt
  2291. break;
  2292. case 1: // RESET
  2293. raw_scsi_busfree(rs);
  2294. scsi->chip_state = 0;
  2295. break;
  2296. case 2: // SELECT
  2297. rs->data_write = 0x01;
  2298. raw_scsi_set_signal_phase(rs, false, true, false);
  2299. raw_scsi_set_signal_phase(rs, false, false, false);
  2300. break;
  2301. case 3: // MASK (bit 1 = interrupt enable, bit 0 = DMA enable)
  2302. scsi->chip_state &= ~0xff;
  2303. scsi->chip_state |= v;
  2304. break;
  2305. }
  2306. omti_check_state(scsi);
  2307. }
  2308. static int supra_reg(struct soft_scsi *ncr, uaecptr addr, bool write)
  2309. {
  2310. int reg = (addr & 0x0f) >> 1;
  2311. if ((addr & 0x20) && ncr->subtype == 0) {
  2312. // "dma" data in/out space
  2313. reg = 8;
  2314. if (!(ncr->regs[2] & 2))
  2315. cpu_halt(CPU_HALT_FAKE_DMA);
  2316. }
  2317. return reg;
  2318. }
  2319. static int stardrive_reg(struct soft_scsi *ncr, uaecptr addr)
  2320. {
  2321. if ((addr & 0x0191) == 0x191) {
  2322. // "dma" data in/out register
  2323. return 8;
  2324. }
  2325. if ((addr & 0x0181) != 0x181)
  2326. return -1;
  2327. int reg = (addr >> 1) & 7;
  2328. return reg;
  2329. }
  2330. static int cltd_reg(struct soft_scsi *ncr, uaecptr addr)
  2331. {
  2332. if (!(addr & 1)) {
  2333. return -1;
  2334. }
  2335. int reg = (addr >> 1) & 7;
  2336. return reg;
  2337. }
  2338. static int protar_reg(struct soft_scsi *ncr, uaecptr addr)
  2339. {
  2340. int reg = -1;
  2341. if ((addr & 0x24) == 0x20) {
  2342. // "fake dma" data port
  2343. reg = 8;
  2344. } else if ((addr & 0x20) == 0x00) {
  2345. reg = (addr >> 2) & 7;
  2346. }
  2347. return reg;
  2348. }
  2349. static int add500_reg(struct soft_scsi *ncr, uaecptr addr)
  2350. {
  2351. int reg = -1;
  2352. if ((addr & 0x8048) == 0x8000) {
  2353. reg = 8;
  2354. } else if ((addr & 0x8040) == 0x8040) {
  2355. reg = (addr >> 1) & 7;
  2356. }
  2357. return reg;
  2358. }
  2359. static int adscsi_reg(struct soft_scsi *ncr, uaecptr addr, bool write)
  2360. {
  2361. int reg = -1;
  2362. if ((addr == 0x38 || addr == 0x39) && !write) {
  2363. reg = 8;
  2364. } else if ((addr == 0x20 || addr == 0x21) && write) {
  2365. reg = 8;
  2366. } else if (addr < 0x20) {
  2367. reg = (addr >> 2) & 7;
  2368. }
  2369. return reg;
  2370. }
  2371. static int ptnexus_reg(struct soft_scsi *ncr, uaecptr addr)
  2372. {
  2373. int reg = -1;
  2374. if ((addr & 0x8ff0) == 0) {
  2375. reg = (addr >> 1) & 7;
  2376. }
  2377. return reg;
  2378. }
  2379. static int xebec_reg(struct soft_scsi *ncr, uaecptr addr)
  2380. {
  2381. if (addr < 0x10000) {
  2382. if (addr & 1)
  2383. return (addr & 0xff) >> 1;
  2384. return -1;
  2385. }
  2386. if ((addr & 0x180000) == 0x100000) {
  2387. ncr->dmac_active = 1;
  2388. } else if ((addr & 0x180000) == 0x180000) {
  2389. ncr->dmac_active = 0;
  2390. ncr->dmac_address = ncr->baseaddress | 0x80000;
  2391. } else if ((addr & 0x180000) == 0x080000) {
  2392. ncr->dmac_address = addr | ncr->baseaddress | 1;
  2393. ncr->dmac_address += 2;
  2394. if (addr & 1)
  2395. return 0x80000 + (addr & 32767);
  2396. return -1;
  2397. }
  2398. return -1;
  2399. }
  2400. static int hd3000_reg(struct soft_scsi *ncr, uaecptr addr, bool write)
  2401. {
  2402. if (!(addr & 1))
  2403. return -1;
  2404. if (!(addr & 0x4000))
  2405. return -1;
  2406. return (addr / 2) & 7;
  2407. }
  2408. static int profex_reg(struct soft_scsi *ncr, uaecptr addr, bool write)
  2409. {
  2410. if (addr & 1)
  2411. return -1;
  2412. if (!(addr & 0x8000))
  2413. return -1;
  2414. return (addr / 2) & 7;
  2415. }
  2416. static int hda506_reg(struct soft_scsi *ncr, uaecptr addr, bool write)
  2417. {
  2418. if ((addr & 0x7fe1) != 0x7fe0)
  2419. return -1;
  2420. addr &= 0x7;
  2421. addr >>= 1;
  2422. return addr;
  2423. }
  2424. static int alf1_reg(struct soft_scsi *ncr, uaecptr addr, bool write)
  2425. {
  2426. if ((addr & 0x7ff9) != 0x0641)
  2427. return -1;
  2428. addr >>= 1;
  2429. addr &= 3;
  2430. return addr;
  2431. }
  2432. static int alf2_reg(struct soft_scsi *ncr, uaecptr addr, bool write)
  2433. {
  2434. if (!(addr & 0x10000))
  2435. return -1;
  2436. addr &= 0xffff;
  2437. if ((addr & 0x7ff9) != 0x0641)
  2438. return -2;
  2439. addr >>= 1;
  2440. addr &= 3;
  2441. return addr;
  2442. }
  2443. static int wedge_reg(struct soft_scsi *ncr, uaecptr addr, int size, bool write)
  2444. {
  2445. if (size != 1)
  2446. return -1;
  2447. if ((addr & 0xFFF9) != 0x0641)
  2448. return -1;
  2449. addr >>= 1;
  2450. addr &= 3;
  2451. return addr;
  2452. }
  2453. static int system2000_reg(struct soft_scsi *ncr, uaecptr addr, int size, bool write)
  2454. {
  2455. if (size != 1)
  2456. return -1;
  2457. if ((addr & 0xc007) != 0x4000)
  2458. return -1;
  2459. addr >>= 3;
  2460. addr &= 3;
  2461. return addr;
  2462. }
  2463. static int promigos_reg(struct soft_scsi *ncr, uaecptr addr, int size, bool write)
  2464. {
  2465. if (size != 1)
  2466. return -1;
  2467. if ((addr & 0x1) != 1)
  2468. return -1;
  2469. addr &= 7;
  2470. if (addr == 1 && write)
  2471. return 3;
  2472. if (addr == 3 && write)
  2473. return 0;
  2474. if (addr == 5 && write)
  2475. return 1;
  2476. if (addr == 5 && !write)
  2477. return 0;
  2478. if (addr == 7 && write)
  2479. return 2;
  2480. if (addr == 7 && !write)
  2481. return 1;
  2482. return -1;
  2483. }
  2484. static int microforge_reg(struct soft_scsi *ncr, uaecptr addr, bool write)
  2485. {
  2486. int reg = -1;
  2487. if ((addr & 0x7000) != 0x7000)
  2488. return -1;
  2489. addr &= 0xfff;
  2490. if (addr == 38 && !write)
  2491. return 0;
  2492. if (addr == 40 && write)
  2493. return 0;
  2494. if (addr == 42 && !write)
  2495. return 1;
  2496. if (addr == 44 && write)
  2497. return 1;
  2498. return reg;
  2499. }
  2500. static int ossi_reg(struct soft_scsi *ncr, uaecptr addr)
  2501. {
  2502. int reg = -1;
  2503. if (!(addr & 1))
  2504. return -1;
  2505. if ((addr & 0x8020) == 0x8020)
  2506. return 8;
  2507. if ((addr & 0x8010) != 0x8010)
  2508. return -1;
  2509. reg = (addr >> 1) & 7;
  2510. return reg;
  2511. }
  2512. static int phoenixboard_reg(struct soft_scsi *ncr, uaecptr addr)
  2513. {
  2514. if (addr & 1)
  2515. return -1;
  2516. if (addr & 0xc000)
  2517. return -1;
  2518. addr >>= 1;
  2519. addr &= 7;
  2520. return addr;
  2521. }
  2522. static int trumpcardpro_reg(struct soft_scsi *ncr, uaecptr addr, bool vector)
  2523. {
  2524. if (addr & 1)
  2525. return -1;
  2526. if (((addr & 0x8000) && !vector) || (vector && addr >= 0x100))
  2527. return -1;
  2528. if ((addr & 0xe0) == 0x60)
  2529. return 8;
  2530. if ((addr & 0xe0) != 0x40)
  2531. return -1;
  2532. addr >>= 1;
  2533. addr &= 7;
  2534. return addr;
  2535. }
  2536. static int dataflyerplus_reg(uaecptr addr)
  2537. {
  2538. if (!(addr & 1))
  2539. return -1;
  2540. if (addr == 0x41)
  2541. return 8;
  2542. if (addr >= 0x10)
  2543. return -1;
  2544. return (addr >> 1) & 7;
  2545. }
  2546. // this is clone of trumpcardpro!
  2547. static int addhard_reg(uaecptr addr)
  2548. {
  2549. if (addr & 1)
  2550. return -1;
  2551. if (addr & 0x8000)
  2552. return -1;
  2553. if ((addr & 0xe0) == 0x60)
  2554. return 8;
  2555. if ((addr & 0xe0) != 0x40)
  2556. return -1;
  2557. addr >>= 1;
  2558. addr &= 7;
  2559. return addr;
  2560. }
  2561. static int emplant_reg(uaecptr addr)
  2562. {
  2563. if (addr & 1)
  2564. return -1;
  2565. if ((addr & 0xf000) == 0x6000)
  2566. return 8;
  2567. if ((addr & 0xf000) != 0x5000)
  2568. return -1;
  2569. addr >>= 4;
  2570. addr &= 7;
  2571. return addr;
  2572. }
  2573. static int malibu_reg(uaecptr addr)
  2574. {
  2575. if ((addr & 0xc000) == 0x8000)
  2576. return 8; // long read port
  2577. if ((addr & 0xc000) == 0xc000)
  2578. return 8; // long write port
  2579. if (!(addr & 1))
  2580. return -1;
  2581. if (addr & 0x4000)
  2582. return -1;
  2583. int reg = (addr & 0x0f) >> 1;
  2584. return reg;
  2585. }
  2586. static int eveshamref_reg(struct soft_scsi *ncr, uaecptr addr)
  2587. {
  2588. if (!ncr->configured)
  2589. return -1;
  2590. if (addr < 0x40)
  2591. return (addr >> 1) & 7;
  2592. if (addr == 0x41)
  2593. return 8;
  2594. return -1;
  2595. }
  2596. static int fasttrak_reg(struct soft_scsi *ncr, uaecptr addr)
  2597. {
  2598. if ((addr & 0xc010) == 0x4000)
  2599. return (addr >> 1) & 7;
  2600. if ((addr & 0xc010) == 0x4010)
  2601. return 8;
  2602. return -1;
  2603. }
  2604. static int kronos_reg(uaecptr addr)
  2605. {
  2606. if (addr >= 0x10)
  2607. return -1;
  2608. if (!(addr & 1))
  2609. return -1;
  2610. addr >>= 1;
  2611. return addr & 7;
  2612. }
  2613. static int twelvegauge_reg(struct soft_scsi *ncr, uaecptr addr)
  2614. {
  2615. if (addr & 0x8000)
  2616. return -1;
  2617. if (!(addr & 0x2000))
  2618. return -1;
  2619. if (addr & 0x100)
  2620. return 8;
  2621. return (addr >> 4) & 7;
  2622. }
  2623. static int overdrive_reg(struct soft_scsi *ncr, uaecptr addr)
  2624. {
  2625. if (addr & 0x8000)
  2626. return -1;
  2627. if ((addr & 0x7000) == 0x4000)
  2628. return 0x100 + (addr & 0x3f);
  2629. if (addr & 1)
  2630. return -1;
  2631. if ((addr & 0x7000) == 0x2000)
  2632. return (addr >> 1) & 7;
  2633. if ((addr & 0x7000) == 0x6000)
  2634. return 8;
  2635. return -1;
  2636. }
  2637. static int fireball_reg(struct soft_scsi* ncr, uaecptr addr)
  2638. {
  2639. if ((addr & 0xc000) != 0x4000)
  2640. return -1;
  2641. return (addr >> 1) & 7;
  2642. }
  2643. static uae_u8 read_684xx_dma(struct soft_scsi *ncr, uaecptr addr)
  2644. {
  2645. uae_u8 val = 0;
  2646. addr &= 0x3f;
  2647. switch (addr)
  2648. {
  2649. case 0:
  2650. val = ncr->dmac_active ? 0x00 : 0x80;
  2651. break;
  2652. case 4:
  2653. val = 0;
  2654. break;
  2655. }
  2656. #if NCR5380_DEBUG > 0
  2657. write_log(_T("684xx DMA GET %08x %02x %08x\n"), addr, val, M68K_GETPC);
  2658. #endif
  2659. return val;
  2660. }
  2661. static void write_684xx_dma(struct soft_scsi *ncr, uaecptr addr, uae_u8 val)
  2662. {
  2663. #if NCR5380_DEBUG > 0
  2664. write_log(_T("684xx DMA PUT %08x %02x %08x\n"), addr, val, M68K_GETPC);
  2665. #endif
  2666. addr &= 0x3f;
  2667. switch (addr)
  2668. {
  2669. case 5: // OCR
  2670. ncr->dmac_direction = (val & 0x80) ? -1 : 1;
  2671. break;
  2672. case 7:
  2673. ncr->dmac_active = (val & 0x80) != 0;
  2674. dma_check(ncr);
  2675. break;
  2676. case 10: // MTCR
  2677. ncr->dmac_length &= 0x000000ff;
  2678. ncr->dmac_length |= val << 8;
  2679. break;
  2680. case 11: // MTCR
  2681. ncr->dmac_length &= 0x0000ff00;
  2682. ncr->dmac_length |= val << 0;
  2683. break;
  2684. case 12: // MAR
  2685. break;
  2686. case 13: // MAR
  2687. ncr->dmac_address &= 0x0000ffff;
  2688. ncr->dmac_address |= val << 16;
  2689. break;
  2690. case 14: // MAR
  2691. ncr->dmac_address &= 0x00ff00ff;
  2692. ncr->dmac_address |= val << 8;
  2693. break;
  2694. case 15: // MAR
  2695. ncr->dmac_address &= 0x00ffff00;
  2696. ncr->dmac_address |= val << 0;
  2697. break;
  2698. }
  2699. }
  2700. static void vector_scsi_status(struct raw_scsi *rs)
  2701. {
  2702. // Vector Falcon 8000 FPGA seems to handle this internally
  2703. while (rs->bus_phase == SCSI_SIGNAL_PHASE_STATUS || rs->bus_phase == SCSI_SIGNAL_PHASE_MESSAGE_IN) {
  2704. raw_scsi_get_data(rs, true);
  2705. }
  2706. }
  2707. static int tecmar_clock_reg_select;
  2708. static uae_u8 tecmar_clock_regs[64];
  2709. static uae_u8 tecmar_clock_bcd(uae_u8 v)
  2710. {
  2711. uae_u8 out = v;
  2712. if (!(tecmar_clock_regs[11] & 4)) {
  2713. out = ((v / 10) << 4) + (v % 10);
  2714. }
  2715. return out;
  2716. }
  2717. static void tecmar_clock_bput(int addr, uae_u8 v)
  2718. {
  2719. if (addr == 0) {
  2720. tecmar_clock_reg_select = v & 63;
  2721. } else if (addr == 1) {
  2722. tecmar_clock_regs[tecmar_clock_reg_select] = v;
  2723. tecmar_clock_regs[12] = 0x00;
  2724. tecmar_clock_regs[13] = 0x80;
  2725. }
  2726. }
  2727. static uae_u8 tecmar_clock_bget(int addr)
  2728. {
  2729. uae_u8 v = 0;
  2730. if (addr == 0) {
  2731. v = tecmar_clock_reg_select;
  2732. } else if (addr == 1) {
  2733. time_t t = time(0);
  2734. t += currprefs.cs_rtc_adjust;
  2735. struct tm *ct = localtime(&t);
  2736. switch (tecmar_clock_reg_select)
  2737. {
  2738. case 0:
  2739. v = tecmar_clock_bcd(ct->tm_sec);
  2740. break;
  2741. case 2:
  2742. v = tecmar_clock_bcd(ct->tm_min);
  2743. break;
  2744. case 4:
  2745. v = tecmar_clock_bcd(ct->tm_hour);
  2746. if (!(tecmar_clock_regs[11] & 2)) {
  2747. if (v >= 12) {
  2748. v -= 12;
  2749. v |= 0x80;
  2750. }
  2751. v++;
  2752. }
  2753. break;
  2754. case 6:
  2755. v = tecmar_clock_bcd(ct->tm_wday + 1);
  2756. break;
  2757. case 7:
  2758. v = tecmar_clock_bcd(ct->tm_mday);
  2759. break;
  2760. case 8:
  2761. v = tecmar_clock_bcd(ct->tm_mon + 1);
  2762. break;
  2763. case 9:
  2764. v = tecmar_clock_bcd(ct->tm_year % 100);
  2765. break;
  2766. default:
  2767. v = tecmar_clock_regs[tecmar_clock_reg_select];
  2768. break;
  2769. }
  2770. }
  2771. return v;
  2772. }
  2773. static uae_u32 ncr80_bget2(struct soft_scsi *ncr, uaecptr addr, int size)
  2774. {
  2775. int reg = -1;
  2776. uae_u32 v = 0;
  2777. int addresstype = -1;
  2778. uaecptr origaddr = addr;
  2779. addr &= ncr->board_mask;
  2780. if (ncr->type == NCR5380_MALIBU) {
  2781. if ((addr & 0xc000) == 0x4000) {
  2782. v = ncr->rom[addr & 0x3fff];
  2783. } else {
  2784. reg = malibu_reg(addr);
  2785. if (reg >= 0) {
  2786. v = ncr5380_bget(ncr, reg);
  2787. }
  2788. }
  2789. } else if (ncr->type == NCR5380_ADDHARD) {
  2790. if (addr & 0x8000) {
  2791. v = ncr->rom[addr & 0x7fff];
  2792. } else {
  2793. reg = addhard_reg(addr);
  2794. if (reg >= 0) {
  2795. if (reg == 8 && !ncr->dma_active) {
  2796. v = 0;
  2797. } else {
  2798. v = ncr5380_bget(ncr, reg);
  2799. }
  2800. }
  2801. }
  2802. } else if (ncr->type == NCR5380_EMPLANT) {
  2803. if ((addr & 0xf000) >= 0xc000) {
  2804. v = ncr->rom[addr & 0x3fff];
  2805. } else {
  2806. reg = emplant_reg(addr);
  2807. if (reg == 8 && !ncr->dma_active)
  2808. reg = -1;
  2809. if (reg >= 0) {
  2810. v = ncr5380_bget(ncr, reg);
  2811. }
  2812. }
  2813. } else if (ncr->type == NONCR_HARDFRAME) {
  2814. if (addr == 0xc0) {
  2815. v = aic_bget_reg(ncr);
  2816. } else if (addr == 0xc2) {
  2817. v = aic_bget_data(ncr);
  2818. } else if (addr == 0x40) {
  2819. v = ncr->irq ? 0x80 : 0x00;
  2820. } else if (addr == 0x42) {
  2821. v = ncr->intena ? 0x10 : 0x00;
  2822. } else if (addr >= 0x80 && addr <= 0x9f) {
  2823. v = read_684xx_dma(ncr, addr & 31);
  2824. } else {
  2825. v = ncr->rom[addr];
  2826. }
  2827. } else if (ncr->type == NONCR_INMATE) {
  2828. if (!(addr & 0x8000)) {
  2829. if (addr == 0x80) {
  2830. v = aic_bget_reg(ncr);
  2831. } else if (addr == 0x82) {
  2832. v = aic_bget_data(ncr);
  2833. } else if (addr == 0x84) {
  2834. v = ncr->rc->device_settings & 0x7f;
  2835. if (!ncr->rc->autoboot_disabled)
  2836. v |= 1 << 4;
  2837. if (ncr->dma_direction)
  2838. v |= 1 << 7;
  2839. } else if (addr == 0x88 || addr == 0x89) {
  2840. v = aic_bget_dma(ncr, NULL);
  2841. }
  2842. } else {
  2843. v = ncr->rom[addr];
  2844. }
  2845. } else if (ncr->type == NCR5380_SUPRA) {
  2846. if (ncr->subtype == 4) {
  2847. if ((addr & 0xc000) == 0xc000) {
  2848. v = read_684xx_dma(ncr, addr);
  2849. } else if (addr & 0x8000) {
  2850. addresstype = (addr & 1) ? 0 : 1;
  2851. }
  2852. } else if (ncr->subtype == 3) {
  2853. if ((addr & 0x8000) && !(addr & 1))
  2854. addresstype = 0;
  2855. } else {
  2856. if (ncr->subtype != 1 && (addr & 1)) {
  2857. v = 0xff;
  2858. } else if (addr & 0x8000) {
  2859. addresstype = 1;
  2860. } else {
  2861. addresstype = 0;
  2862. }
  2863. }
  2864. if (addresstype == 1) {
  2865. v = ncr->rom[addr & 0x7fff];
  2866. } else if (addresstype == 0) {
  2867. reg = supra_reg(ncr, addr, false);
  2868. if (reg >= 0)
  2869. v = ncr5380_bget(ncr, reg);
  2870. }
  2871. } else if (ncr->type == NONCR_GOLEM) {
  2872. int bank = addr & 0x8f81;
  2873. struct raw_scsi *rs = &ncr->rscsi;
  2874. switch(bank)
  2875. {
  2876. case 0x8000:
  2877. case 0x8001:
  2878. case 0x8002:
  2879. case 0x8003:
  2880. v = raw_scsi_get_data(rs, true);
  2881. // message is not retrieved by driver, perhaps hardware does it?
  2882. if (rs->bus_phase == SCSI_SIGNAL_PHASE_MESSAGE_IN)
  2883. raw_scsi_get_data(rs, true);
  2884. break;
  2885. case 0x8200:
  2886. {
  2887. uae_u8 t = raw_scsi_get_signal_phase(rs);
  2888. v = 0;
  2889. if (!(t & SCSI_IO_BUSY))
  2890. v |= 1 << (8 - 8);
  2891. if (rs->bus_phase >= 0) {
  2892. if (!(rs->bus_phase & SCSI_IO_DIRECTION))
  2893. v |= 1 << (13 - 8);
  2894. if (!(rs->bus_phase & SCSI_IO_COMMAND))
  2895. v |= 1 << (10 - 8);
  2896. if (rs->bus_phase != SCSI_SIGNAL_PHASE_STATUS)
  2897. v |= 1 << (15 - 8);
  2898. }
  2899. }
  2900. break;
  2901. case 0x8201:
  2902. {
  2903. uae_u8 t = raw_scsi_get_signal_phase(rs);
  2904. v = 0;
  2905. if (t & SCSI_IO_REQ)
  2906. v |= 1 << 6;
  2907. }
  2908. break;
  2909. default:
  2910. if ((addr & 0xc000) == 0x0000)
  2911. v = ncr->rom[addr];
  2912. break;
  2913. }
  2914. } else if (ncr->type == NCR5380_STARDRIVE) {
  2915. struct raw_scsi *rs = &ncr->rscsi;
  2916. if (addr < sizeof ncr->acmemory) {
  2917. v = ncr->acmemory[addr];
  2918. } else {
  2919. reg = stardrive_reg(ncr, addr);
  2920. if (reg >= 0) {
  2921. v = ncr5380_bget(ncr, reg);
  2922. } else if (addr == 0x104) {
  2923. v = 0;
  2924. // bit 3: dreq
  2925. if (rs->bus_phase >= 0 && (rs->io & SCSI_IO_REQ) && (ncr->regs[2] & 2))
  2926. v |= 1 << 3;
  2927. }
  2928. }
  2929. } else if (ncr->type == NCR5380_CLTD) {
  2930. struct raw_scsi *rs = &ncr->rscsi;
  2931. if (!ncr->configured && addr < sizeof ncr->acmemory) {
  2932. v = ncr->acmemory[addr];
  2933. } else {
  2934. reg = cltd_reg(ncr, addr);
  2935. if (reg >= 0)
  2936. v = ncr5380_bget(ncr, reg);
  2937. }
  2938. } else if (ncr->type == NCR5380_PTNEXUS) {
  2939. struct raw_scsi *rs = &ncr->rscsi;
  2940. if (!ncr->configured && addr < sizeof ncr->acmemory) {
  2941. v = ncr->acmemory[addr];
  2942. } else if (addr & 0x8000) {
  2943. v = ncr->rom[addr & 16383];
  2944. } else {
  2945. reg = ptnexus_reg(ncr, addr);
  2946. if (reg >= 0) {
  2947. v = ncr5380_bget(ncr, reg);
  2948. } else if (addr == 0x11) {
  2949. // fake dma status
  2950. v = 0;
  2951. }
  2952. }
  2953. } else if (ncr->type == NONCR_KOMMOS) {
  2954. struct raw_scsi *rs = &ncr->rscsi;
  2955. if (addr & 0x8000) {
  2956. v = ncr->rom[addr & 0x7fff];
  2957. } else if ((origaddr & 0xf00000) != 0xf00000) {
  2958. if (!(addr & 8)) {
  2959. v = raw_scsi_get_data(rs, true);
  2960. } else {
  2961. uae_u8 t = raw_scsi_get_signal_phase(rs);
  2962. v = 0;
  2963. if (t & SCSI_IO_BUSY)
  2964. v |= 1 << 1;
  2965. if (t & SCSI_IO_REQ)
  2966. v |= 1 << 0;
  2967. if (t & SCSI_IO_DIRECTION)
  2968. v |= 1 << 4;
  2969. if (t & SCSI_IO_COMMAND)
  2970. v |= 1 << 3;
  2971. if (t & SCSI_IO_MESSAGE)
  2972. v |= 1 << 2;
  2973. }
  2974. }
  2975. } else if (ncr->type == NONCR_VECTOR) {
  2976. struct raw_scsi *rs = &ncr->rscsi;
  2977. if (addr < sizeof ncr->acmemory) {
  2978. v = ncr->acmemory[addr];
  2979. } else if (!(addr & 0x8000)) {
  2980. v = ncr->rom[addr];
  2981. } else {
  2982. if ((addr & 0x201) == 0x200) {
  2983. v = (1 << 0);
  2984. uae_u8 t = raw_scsi_get_signal_phase(rs);
  2985. if (t & SCSI_IO_BUSY)
  2986. v &= ~(1 << 0);
  2987. if (t & SCSI_IO_DIRECTION)
  2988. v |= (1 << 6);
  2989. if (t & SCSI_IO_COMMAND)
  2990. v |= (1 << 7);
  2991. } else if ((addr & 0x201) == 0x201) {
  2992. v = 0;
  2993. uae_u8 t = raw_scsi_get_signal_phase(rs);
  2994. if (t & SCSI_IO_REQ)
  2995. v |= 1 << 1;
  2996. } else if ((addr & 0x300) == 0x000) {
  2997. if (size > 1) {
  2998. v = raw_scsi_get_data(rs, true);
  2999. vector_scsi_status(rs);
  3000. } else {
  3001. v = rs->status >= 2 ? 2 : 0;
  3002. }
  3003. } else if ((addr & 0x300) == 0x300) {
  3004. raw_scsi_reset(rs);
  3005. }
  3006. }
  3007. } else if (ncr->type == NCR5380_PROTAR) {
  3008. struct raw_scsi *rs = &ncr->rscsi;
  3009. if (addr < sizeof ncr->acmemory) {
  3010. if (!ncr->configured) {
  3011. v = ncr->acmemory[addr];
  3012. } else {
  3013. reg = protar_reg(ncr, addr);
  3014. if (reg >= 0) {
  3015. v = ncr5380_bget(ncr, reg);
  3016. }
  3017. }
  3018. } else {
  3019. v = ncr->rom[addr & 65535];
  3020. }
  3021. } else if (ncr->type == NCR5380_ADD500) {
  3022. struct raw_scsi *rs = &ncr->rscsi;
  3023. if (addr & 0x8000) {
  3024. uae_u8 t = raw_scsi_get_signal_phase(rs);
  3025. if ((addr & 0x8048) == 0x8000) {
  3026. if (!(addr & 1)) {
  3027. if (t & SCSI_IO_REQ) {
  3028. ncr->databuffer[0] = ncr->databuffer[1];
  3029. ncr->databuffer[1] = raw_scsi_get_data(rs, true) << 8;
  3030. ncr->databuffer[1] |= raw_scsi_get_data(rs, true);
  3031. if (ncr->databuffer_empty) {
  3032. ncr->databuffer[0] = ncr->databuffer[1];
  3033. ncr->databuffer[1] = raw_scsi_get_data(rs, true) << 8;
  3034. ncr->databuffer[1] |= raw_scsi_get_data(rs, true);
  3035. }
  3036. ncr->databuffer_empty = false;
  3037. } else {
  3038. ncr->databuffer_empty = true;
  3039. }
  3040. }
  3041. v = ncr->databuffer[0] >> 8;
  3042. ncr->databuffer[0] <<= 8;
  3043. } else {
  3044. reg = add500_reg(ncr, addr);
  3045. if (reg >= 0) {
  3046. v = ncr5380_bget(ncr, reg);
  3047. } else if ((addr & 0x8049) == 0x8009) {
  3048. v = 0;
  3049. if (!(t & SCSI_IO_REQ) && ncr->databuffer_empty) {
  3050. v |= 1 << 0;
  3051. }
  3052. }
  3053. }
  3054. } else {
  3055. v = ncr->rom[addr];
  3056. }
  3057. } else if (ncr->type == NCR5380_ADSCSI || ncr->type == NCR5380_SYNTHESIS) {
  3058. struct raw_scsi *rs = &ncr->rscsi;
  3059. if (ncr->configured)
  3060. reg = adscsi_reg(ncr, addr, false);
  3061. if (reg >= 0) {
  3062. v = ncr5380_bget(ncr, reg);
  3063. } else {
  3064. v = ncr->rom[addr & 65535];
  3065. }
  3066. if (addr == 0x40) {
  3067. uae_u8 t = raw_scsi_get_signal_phase(rs);
  3068. v = 0;
  3069. // bits 0 to 2: ID (inverted)
  3070. v |= (ncr->rc->device_id ^ 7) & 7;
  3071. // shorter delay before drive detection (8s vs 18s)
  3072. v |= 1 << 5;
  3073. if (t & SCSI_IO_REQ) {
  3074. v |= 1 << 6;
  3075. v |= 1 << 7;
  3076. }
  3077. }
  3078. } else if (ncr->type == NCR5380_KRONOS) {
  3079. struct raw_scsi *rs = &ncr->rscsi;
  3080. if (addr < sizeof ncr->acmemory)
  3081. v = ncr->acmemory[addr];
  3082. if (ncr->configured) {
  3083. reg = kronos_reg(addr);
  3084. if (reg >= 0) {
  3085. v = ncr5380_bget(ncr, reg);
  3086. } else if (addr == 0x40) {
  3087. v = 0;
  3088. if (eeprom93xx_read(ncr->eeprom))
  3089. v |= 1 << 6;
  3090. }
  3091. }
  3092. if (addr & 0x8000) {
  3093. v = ncr->rom[addr & 8191];
  3094. }
  3095. } else if (ncr->type == NCR5380_ROCHARD) {
  3096. int reg = (addr & 15) / 2;
  3097. if ((addr & 0x300) == 0x300)
  3098. v = ncr53400_bget(ncr, reg | 0x100);
  3099. else if (addr & 0x200)
  3100. v = ncr53400_bget(ncr, reg | 0x80);
  3101. else
  3102. v = ncr53400_bget(ncr, reg);
  3103. } else if (ncr->type == NCR5380_DATAFLYER) {
  3104. reg = addr & 0xff;
  3105. v = ncr5380_bget(ncr, reg);
  3106. } else if (ncr->type == NCR5380_DATAFLYERPLUS) {
  3107. if (addr < 0x80 && ncr->configured) {
  3108. reg = dataflyerplus_reg(addr);
  3109. if (reg >= 0)
  3110. v = ncr5380_bget(ncr, reg);
  3111. }
  3112. } else if (ncr->type == NONCR_TECMAR) {
  3113. v = ncr->rom[addr];
  3114. if (addr >= 0x2000 && addr < 0x3000) {
  3115. if (addr == 0x2040)
  3116. v = tecmar_clock_bget(0);
  3117. else if (addr == 0x2042)
  3118. v = tecmar_clock_bget(1);
  3119. } else if (addr >= 0x4000 && addr < 0x5000) {
  3120. if (addr == 0x4040)
  3121. v = sasi_tecmar_bget(ncr, 1);
  3122. else if (addr == 0x4042)
  3123. v = sasi_tecmar_bget(ncr, 0);
  3124. }
  3125. } else if (ncr->type == NCR5380_XEBEC) {
  3126. reg = xebec_reg(ncr, addr);
  3127. if (reg >= 0 && reg < 8) {
  3128. v = ncr5380_bget(ncr, reg);
  3129. } else if (reg >= 0x80000) {
  3130. int offset = reg & (ncr->databuffer_size - 1);
  3131. v = ncr->databufferptr[offset];
  3132. }
  3133. } else if (ncr->type == NONCR_MICROFORGE) {
  3134. reg = microforge_reg(ncr, addr, false);
  3135. if (reg >= 0)
  3136. v = sasi_microforge_bget(ncr, reg);
  3137. } else if (ncr->type == OMTI_HD3000) {
  3138. if (addr < 0x4000) {
  3139. v = ncr->rom[addr];
  3140. } else {
  3141. reg = hd3000_reg(ncr, addr, false);
  3142. if (reg >= 0)
  3143. v = omti_bget(ncr, reg);
  3144. }
  3145. } else if (ncr->type == OMTI_PROFEX) {
  3146. if (addr < 0x4000) {
  3147. v = ncr->rom[addr];
  3148. } else {
  3149. reg = profex_reg(ncr, addr, false);
  3150. if (reg >= 0)
  3151. v = omti_bget(ncr, reg);
  3152. }
  3153. } else if (ncr->type == OMTI_HDA506) {
  3154. reg = hda506_reg(ncr, addr, false);
  3155. if (reg >= 0)
  3156. v = omti_bget(ncr, reg);
  3157. } else if (ncr->type == OMTI_ALF1 || ncr->type == OMTI_ADAPTER) {
  3158. reg = alf1_reg(ncr, addr, false);
  3159. if (reg >= 0)
  3160. v = omti_bget(ncr, reg);
  3161. } else if (ncr->type == OMTI_ALF2 || ncr->type == OMTI_HD20) {
  3162. reg = alf2_reg(ncr, origaddr, false);
  3163. if (reg >= 0) {
  3164. v = omti_bget(ncr, reg);
  3165. } else if (reg == -1) {
  3166. v = ncr->rom[addr & 32767];
  3167. }
  3168. } else if (ncr->type == OMTI_PROMIGOS) {
  3169. reg = promigos_reg(ncr, addr, size, false);
  3170. if (reg >= 0)
  3171. v = omti_bget(ncr, reg);
  3172. } else if (ncr->type == OMTI_WEDGE) {
  3173. reg = wedge_reg(ncr, addr, size, false);
  3174. if (reg >= 0) {
  3175. v = omti_bget(ncr, reg);
  3176. }
  3177. } else if (ncr->type == OMTI_SYSTEM2000) {
  3178. reg = system2000_reg(ncr, addr, size, false);
  3179. if (reg >= 0) {
  3180. v = omti_bget(ncr, reg);
  3181. } else if (addr < 0x4000) {
  3182. v = ncr->rom[addr];
  3183. } else if (ncr->rscsi.bus_phase >= 0) {
  3184. if ((addr & 0xc000) == 0x8000) {
  3185. v = ncr->databuffer[addr & 1];
  3186. ncr->databuffer[addr & 1] = omti_bget(ncr, 0);
  3187. } else if ((addr & 0xc000) == 0xc000) {
  3188. v = ncr->databuffer[addr & 1];
  3189. }
  3190. }
  3191. } else if (ncr->type == NCR5380_PHOENIXBOARD) {
  3192. reg = phoenixboard_reg(ncr, addr);
  3193. if (reg >= 0) {
  3194. v = ncr5380_bget(ncr, reg);
  3195. } else if (addr < 0x8000) {
  3196. v = ncr->rom[addr];
  3197. }
  3198. } else if (ncr->type == NCR5380_SCRAM) {
  3199. if (addr < 0x4000 || addr >= 0xc000) {
  3200. v = 0xff;
  3201. if (!(addr & 1))
  3202. v = ncr->rom[(addr >> 1) & 8191];
  3203. } else if (addr >= 0x8000 && addr < 0xa000) {
  3204. if (!(addr & 1))
  3205. v = ncr5380_bget(ncr, 8);
  3206. } else if (addr >= 0x6000 && addr < 0x8000) {
  3207. if (!(addr & 1)) {
  3208. reg = (addr >> 1) & 7;
  3209. v = ncr5380_bget(ncr, reg);
  3210. }
  3211. }
  3212. } else if (ncr->type == NCR5380_OSSI) {
  3213. if (!(addr & 0x8000)) {
  3214. v = ncr->rom[addr & 16383];
  3215. } else {
  3216. reg = ossi_reg(ncr, addr);
  3217. if (reg >= 0)
  3218. v = ncr5380_bget(ncr, reg);
  3219. }
  3220. } else if (ncr->type == NCR5380_TRUMPCARDPRO || ncr->type == NCR5380_IVSVECTOR || ncr->type == NCR5380_TRUMPCARD) {
  3221. reg = trumpcardpro_reg(ncr, addr, ncr->type == NCR5380_IVSVECTOR);
  3222. if (reg >= 0) {
  3223. if (reg == 8 && !ncr->dma_active) {
  3224. v = 0;
  3225. } else {
  3226. v = ncr5380_bget(ncr, reg);
  3227. }
  3228. } else if ((addr & 0x8000) && ncr->type != NCR5380_IVSVECTOR) {
  3229. if (!ncr->rc->autoboot_disabled)
  3230. v = ncr->rom[addr & 0x7fff];
  3231. } else if (addr == 0x100 && ncr->type == NCR5380_IVSVECTOR) {
  3232. // bits 0,1 = 0 = 32M
  3233. // bits 0,1 = 1 = 16M
  3234. // bits 0,1 = 2 = 8M
  3235. // bits 0,1 = 3 = 4M
  3236. // bit 3 = JP17 DisFastROM (1 = disabled, 0 = on)
  3237. // bit 5 = disable RAM in 68000 mode
  3238. // bit 4 = JP20 autoboot (1 = off, 0 = on)
  3239. // bit 6 = 68030 burst (1 = on, 0 = off)
  3240. v = currprefs.cpuboard_settings;
  3241. v |= 4;
  3242. v ^= 0xff & ~0x40;
  3243. } else if (addr > 0x100 && ncr->type == NCR5380_IVSVECTOR) {
  3244. v = ncr->rom[addr];
  3245. } else if ((addr & 0xe0) == 0xc0 && ncr->type != NCR5380_TRUMPCARD) {
  3246. struct raw_scsi *rs = &ncr->rscsi;
  3247. uae_u8 t = raw_scsi_get_signal_phase(rs);
  3248. v = ncr->irq && ncr->intena ? 4 : 0;
  3249. // actually this is buffer empty/full
  3250. v |= (t & SCSI_IO_DIRECTION) ? 2 : 0;
  3251. v |= ((ncr->rc->device_id ^ 7) & 7) << 3;
  3252. } else if ((addr & 0xe0) == 0xa0 && ncr->type != NCR5380_TRUMPCARD) {
  3253. // long data port
  3254. if (ncr->dma_active)
  3255. v = ncr5380_bget(ncr, 8);
  3256. }
  3257. } else if (ncr->type == NCR5380_EVESHAMREF) {
  3258. reg = eveshamref_reg(ncr, addr);
  3259. if (reg >= 0) {
  3260. v = ncr5380_bget(ncr, reg);
  3261. } else {
  3262. v = ncr->rom[addr & 0x7fff];
  3263. }
  3264. } else if (ncr->type == NCR5380_FASTTRAK) {
  3265. reg = fasttrak_reg(ncr, addr);
  3266. if (reg >= 0) {
  3267. v = ncr5380_bget(ncr, reg);
  3268. } else {
  3269. v = ncr->rom[addr & 0x7fff];
  3270. }
  3271. } else if (ncr->type == NCR5380_12GAUGE) {
  3272. reg = twelvegauge_reg(ncr, addr);
  3273. if (reg >= 0) {
  3274. v = ncr5380_bget(ncr, reg);
  3275. } else {
  3276. v = ncr->rom[addr & 0x7fff];
  3277. }
  3278. } else if (ncr->type == NCR5380_OVERDRIVE) {
  3279. reg = overdrive_reg(ncr, addr);
  3280. if (reg >= 0) {
  3281. if (reg >= 0x100)
  3282. v = read_684xx_dma(ncr, reg);
  3283. else
  3284. v = ncr5380_bget(ncr, reg);
  3285. } else {
  3286. v = ncr->rom[addr & 0x3fff];
  3287. }
  3288. } else if (ncr->type == NCR5380_FIREBALL) {
  3289. reg = fireball_reg(ncr, addr);
  3290. if (reg >= 0) {
  3291. v = ncr5380_bget(ncr, reg);
  3292. } else if ((addr & 0xc000) == 0xc000) {
  3293. v = ncr->rom[addr & 0x3fff];
  3294. } else if (addr < 128) {
  3295. v = ncr->acmemory[addr];
  3296. }
  3297. }
  3298. #if NCR5380_DEBUG > 1
  3299. if (0 || (origaddr & 0xffff) <= 0x8100)
  3300. write_log(_T("GET %08x %02x %d %08x %d\n"), origaddr, v, reg, M68K_GETPC, regs.intmask);
  3301. #endif
  3302. return v;
  3303. }
  3304. static void ncr80_bput2(struct soft_scsi *ncr, uaecptr addr, uae_u32 val, int size)
  3305. {
  3306. int reg = -1;
  3307. int addresstype = -1;
  3308. uaecptr origaddr = addr;
  3309. addr &= ncr->board_mask;
  3310. if (ncr->type == NCR5380_MALIBU) {
  3311. reg = malibu_reg(addr);
  3312. if (reg >= 0) {
  3313. ncr5380_bput(ncr, reg, val);
  3314. }
  3315. } else if (ncr->type == NCR5380_ADDHARD) {
  3316. reg = addhard_reg(addr);
  3317. if (reg >= 0) {
  3318. if (reg == 8 && !ncr->dma_active) {
  3319. ;
  3320. } else {
  3321. ncr5380_bput(ncr, reg, val);
  3322. }
  3323. }
  3324. } else if (ncr->type == NCR5380_EMPLANT) {
  3325. reg = emplant_reg(addr);
  3326. if (reg == 8 && !ncr->dma_active)
  3327. reg = -1;
  3328. if (reg >= 0) {
  3329. ncr5380_bput(ncr, reg, val);
  3330. } else if ((addr & 0xff00) == 0x3800) {
  3331. if ((val & 0x88) == 0x88) {
  3332. ncr->intena = true;
  3333. } else if ((val & 0x88) == 0x08) {
  3334. ncr->intena = false;
  3335. }
  3336. }
  3337. } else if (ncr->type == NONCR_HARDFRAME) {
  3338. if (addr == 0xc0) {
  3339. aic_bput_reg(ncr, val);
  3340. } else if (addr == 0xc2) {
  3341. aic_bput_data(ncr, val);
  3342. } else if (addr == 0x42) {
  3343. ncr->intena = (val & 0x10) != 0;
  3344. } else if (addr >= 0x80 && addr <= 0x9f) {
  3345. write_684xx_dma(ncr, addr & 31, val);
  3346. }
  3347. } else if (ncr->type == NONCR_INMATE) {
  3348. if (addr == 0x80) {
  3349. aic_bput_reg(ncr, val);
  3350. } else if (addr == 0x82) {
  3351. aic_bput_data(ncr, val);
  3352. } else if (addr == 0x88 || addr == 0x89) {
  3353. aic_bput_dma(ncr, val, NULL);
  3354. }
  3355. } else if (ncr->type == NCR5380_SUPRA) {
  3356. if (ncr->subtype == 4) {
  3357. if ((addr & 0xc000) == 0xc000) {
  3358. write_684xx_dma(ncr, addr, val);
  3359. } else if (addr & 0x8000) {
  3360. addresstype = (addr & 1) ? 0 : 1;
  3361. }
  3362. } else if (ncr->subtype == 3) {
  3363. if ((addr & 0x8000) && !(addr & 1))
  3364. addresstype = 0;
  3365. } else {
  3366. if (ncr->subtype != 1 && (addr & 1))
  3367. return;
  3368. if (!(addr & 0x8000))
  3369. addresstype = 0;
  3370. }
  3371. if (addresstype == 0) {
  3372. reg = supra_reg(ncr, addr, true);
  3373. if (reg >= 0)
  3374. ncr5380_bput(ncr, reg, val);
  3375. }
  3376. } else if (ncr->type == NONCR_GOLEM) {
  3377. int bank = addr & 0x8f81;
  3378. struct raw_scsi *rs = &ncr->rscsi;
  3379. switch(bank)
  3380. {
  3381. case 0x8080:
  3382. case 0x8081:
  3383. case 0x8082:
  3384. case 0x8083:
  3385. raw_scsi_put_data(rs, val, true);
  3386. break;
  3387. case 0x8380:
  3388. {
  3389. raw_scsi_put_data(rs, val, true);
  3390. raw_scsi_set_signal_phase(rs, false, true, false);
  3391. uae_u8 t = raw_scsi_get_signal_phase(rs);
  3392. if (t & SCSI_IO_BUSY)
  3393. raw_scsi_set_signal_phase(rs, true, false, false);
  3394. }
  3395. break;
  3396. }
  3397. } else if (ncr->type == NCR5380_STARDRIVE) {
  3398. reg = stardrive_reg(ncr, addr);
  3399. if (reg >= 0)
  3400. ncr5380_bput(ncr, reg, val);
  3401. } else if (ncr->type == NCR5380_CLTD) {
  3402. if (ncr->configured) {
  3403. reg = cltd_reg(ncr, addr);
  3404. if (reg >= 0)
  3405. ncr5380_bput(ncr, reg, val);
  3406. }
  3407. } else if (ncr->type == NCR5380_PTNEXUS) {
  3408. if (ncr->configured) {
  3409. reg = ptnexus_reg(ncr, addr);
  3410. if (reg >= 0) {
  3411. ncr5380_bput(ncr, reg, val);
  3412. } else if (addr == 0x11) {
  3413. ncr->chip_state = val;
  3414. }
  3415. }
  3416. } else if (ncr->type == NONCR_KOMMOS) {
  3417. struct raw_scsi *rs = &ncr->rscsi;
  3418. if (!(addr & 0x8000) && (origaddr & 0xf00000) != 0xf00000) {
  3419. if (!(addr & 8)) {
  3420. raw_scsi_put_data(rs, val, true);
  3421. } else {
  3422. // select?
  3423. if (val & 4) {
  3424. raw_scsi_set_signal_phase(rs, false, true, false);
  3425. uae_u8 t = raw_scsi_get_signal_phase(rs);
  3426. if (t & SCSI_IO_BUSY)
  3427. raw_scsi_set_signal_phase(rs, true, false, false);
  3428. }
  3429. }
  3430. }
  3431. } else if (ncr->type == NONCR_VECTOR) {
  3432. struct raw_scsi *rs = &ncr->rscsi;
  3433. if (addr & 0x8000) {
  3434. if ((addr & 0x300) == 0x300) {
  3435. raw_scsi_put_data(rs, val, false);
  3436. raw_scsi_set_signal_phase(rs, false, true, false);
  3437. uae_u8 t = raw_scsi_get_signal_phase(rs);
  3438. if (t & SCSI_IO_BUSY)
  3439. raw_scsi_set_signal_phase(rs, true, false, false);
  3440. } else if ((addr & 0x300) == 0x000) {
  3441. raw_scsi_put_data(rs, val, true);
  3442. vector_scsi_status(rs);
  3443. }
  3444. }
  3445. } else if (ncr->type == NCR5380_PROTAR) {
  3446. reg = protar_reg(ncr, addr);
  3447. if (reg >= 0)
  3448. ncr5380_bput(ncr, reg, val);
  3449. } else if (ncr->type == NCR5380_ADD500) {
  3450. if ((addr & 0x8048) == 0x8008) {
  3451. struct raw_scsi *rs = &ncr->rscsi;
  3452. ncr->databuffer_empty = true;
  3453. } else {
  3454. reg = add500_reg(ncr, addr);
  3455. if (reg >= 0) {
  3456. ncr5380_bput(ncr, reg, val);
  3457. }
  3458. }
  3459. } else if (ncr->type == NCR5380_ADSCSI || ncr->type == NCR5380_SYNTHESIS) {
  3460. if (ncr->configured)
  3461. reg = adscsi_reg(ncr, addr, true);
  3462. if (reg >= 0) {
  3463. ncr5380_bput(ncr, reg, val);
  3464. }
  3465. } else if (ncr->type == NCR5380_KRONOS) {
  3466. reg = kronos_reg(addr);
  3467. if (reg >= 0) {
  3468. ncr5380_bput(ncr, reg, val);
  3469. } else if (addr == 0x60) {
  3470. eeprom93xx_write(ncr->eeprom, (val & 0x40) != 0, (val & 0x10) != 0, (val & 0x20) != 0);
  3471. }
  3472. } else if (ncr->type == NCR5380_ROCHARD) {
  3473. int reg = (addr & 15) / 2;
  3474. if ((addr & 0x300) == 0x300)
  3475. ncr53400_bput(ncr, reg | 0x100, val);
  3476. else if (addr & 0x200)
  3477. ncr53400_bput(ncr, reg | 0x80, val);
  3478. else
  3479. ncr53400_bput(ncr, reg, val);
  3480. } else if (ncr->type == NCR5380_DATAFLYER) {
  3481. reg = addr & 0xff;
  3482. ncr5380_bput(ncr, reg, val);
  3483. } else if (ncr->type == NCR5380_DATAFLYERPLUS) {
  3484. if (ncr->configured && addr < 0x80) {
  3485. reg = dataflyerplus_reg(addr);
  3486. if (reg >= 0) {
  3487. ncr5380_bput(ncr, reg, val);
  3488. }
  3489. }
  3490. } else if (ncr->type == NONCR_TECMAR) {
  3491. if (addr == 0x22) {
  3492. // box
  3493. ncr->baseaddress = AUTOCONFIG_Z2 + ((val & 0x7f) * 4096);
  3494. map_banks_z2(ncr->bank, ncr->baseaddress >> 16, 1);
  3495. expamem_next(ncr->bank, NULL);
  3496. } else if (addr == 0x1020) {
  3497. // memory board control/status
  3498. ncr->rom[addr] = val & (0x80 | 0x40 | 0x02);
  3499. } else if (addr == 0x1024) {
  3500. // memory board memory address reg
  3501. write_log(_T("TECMAR RAM %08x-%08x\n"), val << 16, (val << 16) + currprefs.fastmem[0].size);
  3502. if (currprefs.fastmem[0].size)
  3503. map_banks_z2(&fastmem_bank[0], val, currprefs.fastmem[0].size >> 16);
  3504. }
  3505. else if (addr >= 0x2000 && addr < 0x3000) {
  3506. // clock
  3507. if (addr == 0x2040)
  3508. tecmar_clock_bput(0, val);
  3509. else if (addr == 0x2042)
  3510. tecmar_clock_bput(1, val);
  3511. } else if (addr >= 0x4000 && addr < 0x5000) {
  3512. // sasi
  3513. if (addr == 0x4040)
  3514. sasi_tecmar_bput(ncr, 1, val);
  3515. else if (addr == 0x4042)
  3516. sasi_tecmar_bput(ncr, 0, val);
  3517. }
  3518. } else if (ncr->type == NCR5380_XEBEC) {
  3519. reg = xebec_reg(ncr, addr);
  3520. if (reg >= 0 && reg < 8) {
  3521. ncr5380_bput(ncr, reg, val);
  3522. } else if (reg >= 0x80000) {
  3523. int offset = reg & (ncr->databuffer_size - 1);
  3524. ncr->databufferptr[offset] = val;
  3525. }
  3526. } else if (ncr->type == NONCR_MICROFORGE) {
  3527. reg = microforge_reg(ncr, addr, true);
  3528. if (reg >= 0)
  3529. sasi_microforge_bput(ncr, reg, val);
  3530. } else if (ncr->type == OMTI_HDA506) {
  3531. reg = hda506_reg(ncr, addr, true);
  3532. if (reg >= 0)
  3533. omti_bput(ncr, reg, val);
  3534. } else if (ncr->type == OMTI_HD3000) {
  3535. reg = hd3000_reg(ncr, addr, true);
  3536. if (reg >= 0)
  3537. omti_bput(ncr, reg, val);
  3538. } else if (ncr->type == OMTI_PROFEX) {
  3539. reg = profex_reg(ncr, addr, true);
  3540. if (reg >= 0)
  3541. omti_bput(ncr, reg, val);
  3542. } else if (ncr->type == OMTI_ALF1 || ncr->type == OMTI_ADAPTER) {
  3543. reg = alf1_reg(ncr, addr, true);
  3544. if (reg >= 0)
  3545. omti_bput(ncr, reg, val);
  3546. } else if (ncr->type == OMTI_ALF2 || ncr->type == OMTI_HD20) {
  3547. reg = alf2_reg(ncr, origaddr, true);
  3548. if (reg >= 0)
  3549. omti_bput(ncr, reg, val);
  3550. } else if (ncr->type == OMTI_PROMIGOS) {
  3551. reg = promigos_reg(ncr, addr, size, true);
  3552. if (reg >= 0)
  3553. omti_bput(ncr, reg, val);
  3554. } else if (ncr->type == OMTI_WEDGE) {
  3555. reg = wedge_reg(ncr, addr, size, true);
  3556. if (reg >= 0) {
  3557. omti_bput(ncr, reg, val);
  3558. }
  3559. } else if (ncr->type == OMTI_SYSTEM2000) {
  3560. reg = system2000_reg(ncr, addr, size, true);
  3561. if (reg >= 0) {
  3562. omti_bput(ncr, reg, val);
  3563. } else if (ncr->rscsi.bus_phase >= 0) {
  3564. if ((addr & 0x8000) == 0x8000) {
  3565. omti_bput(ncr, 0, val);
  3566. }
  3567. }
  3568. } else if (ncr->type == NCR5380_PHOENIXBOARD) {
  3569. reg = phoenixboard_reg(ncr, addr);
  3570. if (reg >= 0) {
  3571. ncr5380_bput(ncr, reg, val);
  3572. }
  3573. } else if (ncr->type == NCR5380_SCRAM) {
  3574. if (addr >= 0x6000 && addr < 0x8000) {
  3575. if (!(addr & 1)) {
  3576. reg = (addr >> 1) & 7;
  3577. ncr5380_bput(ncr, reg, val);
  3578. }
  3579. } else if (addr >= 0x8000 && addr < 0xc000) {
  3580. if (!(addr & 1))
  3581. ncr5380_bput(ncr, 8, val);
  3582. }
  3583. } else if (ncr->type == NCR5380_OSSI) {
  3584. reg = ossi_reg(ncr, addr);
  3585. if (reg >= 0)
  3586. ncr5380_bput(ncr, reg, val);
  3587. } else if (ncr->type == NCR5380_TRUMPCARDPRO || ncr->type == NCR5380_IVSVECTOR || ncr->type == NCR5380_TRUMPCARD) {
  3588. reg = trumpcardpro_reg(ncr, addr, ncr->type == NCR5380_IVSVECTOR);
  3589. if (reg >= 0) {
  3590. if (reg == 8 && !ncr->dma_active) {
  3591. ;
  3592. } else {
  3593. ncr5380_bput(ncr, reg, val);
  3594. }
  3595. } else if (addr >= 0x100 && ncr->type == NCR5380_IVSVECTOR) {
  3596. if (addr == 0x200 && !(val & 0x80)) {
  3597. if (currprefs.cpu_model >= 68020) {
  3598. write_log(_T("IVS Vector 68000 mode!\n"));
  3599. cpu_fallback(0);
  3600. }
  3601. }
  3602. if (addr == 0x200 && (val & 0x80)) {
  3603. if (currprefs.cpu_model < 68020) {
  3604. write_log(_T("IVS Vector 68030 mode!\n"));
  3605. cpu_fallback(1);
  3606. }
  3607. }
  3608. } else if ((addr & 0xe0) == 0xa0 && ncr->type != NCR5380_TRUMPCARD) {
  3609. // word data port
  3610. if (ncr->dma_active)
  3611. ncr5380_bput(ncr, 8, val);
  3612. }
  3613. } else if (ncr->type == NCR5380_EVESHAMREF) {
  3614. reg = eveshamref_reg(ncr, addr);
  3615. if (reg >= 0)
  3616. ncr5380_bput(ncr, reg, val);
  3617. } else if (ncr->type == NCR5380_FASTTRAK) {
  3618. reg = fasttrak_reg(ncr, addr);
  3619. if (reg >= 0)
  3620. ncr5380_bput(ncr, reg, val);
  3621. } else if (ncr->type == NCR5380_12GAUGE) {
  3622. reg = twelvegauge_reg(ncr, addr);
  3623. if (reg >= 0)
  3624. ncr5380_bput(ncr, reg, val);
  3625. } else if (ncr->type == NCR5380_OVERDRIVE) {
  3626. reg = overdrive_reg(ncr, addr);
  3627. if (reg >= 0) {
  3628. if (reg >= 0x100)
  3629. write_684xx_dma(ncr, reg, val);
  3630. else
  3631. ncr5380_bput(ncr, reg, val);
  3632. }
  3633. } else if (ncr->type == NCR5380_FIREBALL) {
  3634. if ((addr & 0xc000) == 0x8000) {
  3635. // this is strange way to set up DMA address..
  3636. if (val & 0x40) {
  3637. ncr->dmac_address = 0x00777777;
  3638. ncr->dmac_length = 1;
  3639. ncr->dmac_active = 1;
  3640. } else if (ncr->dmac_length == 1) {
  3641. ncr->dmac_length++;
  3642. return;
  3643. }
  3644. if (!(val & 0xc0) && ncr->dmac_length > 1 && ncr->dmac_length <= 9 && !(addr & 2)) {
  3645. // nybbles, value 0 to 6
  3646. for (int i = 0; i < 6; i++) {
  3647. int shift = i * 4;
  3648. int bm = 1 << i;
  3649. if (!(val & bm)) {
  3650. uae_u8 n = (ncr->dmac_length - 2) & 0x0f;
  3651. uae_u8 v = (ncr->dmac_address >> shift) & 0x0f;
  3652. if (v > n)
  3653. v = n;
  3654. ncr->dmac_address &= ~(0x0f << shift);
  3655. ncr->dmac_address |= (v & 0x0f) << shift;
  3656. }
  3657. }
  3658. ncr->dmac_length++;
  3659. }
  3660. if (ncr->dmac_length > 9 && !(val & 0xc0) && !(addr & 2)) {
  3661. // nybbles, value 8 to 15..
  3662. for (int i = 0; i < 6; i++) {
  3663. int bm = 1 << i;
  3664. if (val & bm) {
  3665. int shift = i * 4;
  3666. uae_u8 v = (ncr->dmac_address >> shift) & 0x0f;
  3667. v++;
  3668. ncr->dmac_address &= ~(0x0f << shift);
  3669. ncr->dmac_address |= (v & 0x0f) << shift;
  3670. }
  3671. }
  3672. }
  3673. ncr->dmac_direction = (val & 0x80) != 0;
  3674. } else {
  3675. reg = fireball_reg(ncr, addr);
  3676. if (reg >= 0) {
  3677. ncr5380_bput(ncr, reg, val);
  3678. }
  3679. }
  3680. }
  3681. #if NCR5380_DEBUG > 1
  3682. if ((origaddr & 0xffff) <= 0x8100)
  3683. write_log(_T("PUT %08x %02x %d %08x %d\n"), origaddr, val, reg, M68K_GETPC, regs.intmask);
  3684. #endif
  3685. }
  3686. // mainhattan paradox scsi
  3687. uae_u8 parallel_port_scsi_read(int reg, uae_u8 data, uae_u8 dir)
  3688. {
  3689. struct soft_scsi *scsi = parallel_port_scsi_data;
  3690. if (!scsi)
  3691. return data;
  3692. struct raw_scsi *rs = &scsi->rscsi;
  3693. uae_u8 t = raw_scsi_get_signal_phase(rs);
  3694. if (reg == 0) {
  3695. data = raw_scsi_get_data_2(rs, true, false);
  3696. data ^= 0xff;
  3697. } else if (reg == 1) {
  3698. data &= ~3;
  3699. if (rs->bus_phase >= 0 && !(rs->bus_phase & SCSI_IO_COMMAND))
  3700. data |= 2; // POUT
  3701. data |= 1;
  3702. if (rs->bus_phase == SCSI_SIGNAL_PHASE_SELECT_2 || rs->bus_phase >= 0)
  3703. data &= ~1; // BUSY
  3704. }
  3705. t = raw_scsi_get_signal_phase(rs);
  3706. if ((t & SCSI_IO_REQ) && (scsi->chip_state & 4))
  3707. cia_parallelack();
  3708. return data;
  3709. }
  3710. void parallel_port_scsi_write(int reg, uae_u8 v, uae_u8 dir)
  3711. {
  3712. struct soft_scsi *scsi = parallel_port_scsi_data;
  3713. if (!scsi)
  3714. return;
  3715. struct raw_scsi *rs = &scsi->rscsi;
  3716. if (reg == 0) {
  3717. v ^= 0xff;
  3718. raw_scsi_put_data(rs, v, true);
  3719. } else if (reg == 1) {
  3720. // SEL
  3721. if (!(v & 4) && (scsi->chip_state & 4)) {
  3722. raw_scsi_set_signal_phase(rs, false, true, false);
  3723. } else if ((v & 4) && !(scsi->chip_state & 4)) {
  3724. if (rs->bus_phase == SCSI_SIGNAL_PHASE_SELECT_2) {
  3725. raw_scsi_set_signal_phase(rs, false, false, false);
  3726. }
  3727. }
  3728. scsi->chip_state = v;
  3729. }
  3730. uae_u8 t = raw_scsi_get_signal_phase(rs);
  3731. if ((t & SCSI_IO_REQ) && (scsi->chip_state & 4))
  3732. cia_parallelack();
  3733. }
  3734. static bool isautoconfigaddr(uaecptr addr)
  3735. {
  3736. return addr < 65536 || (addr >= 0xe80000 && addr < 0xe90000) || (addr >= 0xff000000 && addr < 0xff0000200);
  3737. }
  3738. static uae_u32 REGPARAM2 ncr80_lget(struct soft_scsi *ncr, uaecptr addr)
  3739. {
  3740. uae_u32 v;
  3741. v = ncr80_bget2(ncr, addr + 0, 4) << 24;
  3742. v |= ncr80_bget2(ncr, addr + 1, 4) << 16;
  3743. v |= ncr80_bget2(ncr, addr + 2, 4) << 8;
  3744. v |= ncr80_bget2(ncr, addr + 3, 4) << 0;
  3745. return v;
  3746. }
  3747. static uae_u32 REGPARAM2 ncr80_wget(struct soft_scsi *ncr, uaecptr addr)
  3748. {
  3749. uae_u32 v;
  3750. v = ncr80_bget2(ncr, addr, 2) << 8;
  3751. v |= ncr80_bget2(ncr, addr + 1, 2);
  3752. return v;
  3753. }
  3754. static uae_u32 REGPARAM2 ncr80_bget(struct soft_scsi *ncr, uaecptr addr)
  3755. {
  3756. bool iaa = isautoconfigaddr(addr);
  3757. uae_u32 v;
  3758. if (!ncr->configured && iaa) {
  3759. addr &= 65535;
  3760. if (addr >= sizeof ncr->acmemory)
  3761. return 0;
  3762. return ncr->acmemory[addr];
  3763. }
  3764. v = ncr80_bget2(ncr, addr, 1);
  3765. return v;
  3766. }
  3767. static void REGPARAM2 ncr80_lput(struct soft_scsi *ncr, uaecptr addr, uae_u32 l)
  3768. {
  3769. ncr80_bput2(ncr, addr + 0, l >> 24, 4);
  3770. ncr80_bput2(ncr, addr + 1, l >> 16, 4);
  3771. ncr80_bput2(ncr, addr + 2, l >> 8, 4);
  3772. ncr80_bput2(ncr, addr + 3, l >> 0, 4);
  3773. }
  3774. static void REGPARAM2 ncr80_wput(struct soft_scsi *ncr, uaecptr addr, uae_u32 w)
  3775. {
  3776. bool iaa = isautoconfigaddr(addr);
  3777. w &= 0xffff;
  3778. if (!ncr->configured && iaa) {
  3779. return;
  3780. }
  3781. ncr80_bput2(ncr, addr, w >> 8, 2);
  3782. ncr80_bput2(ncr, addr + 1, w & 0xff, 2);
  3783. }
  3784. static void REGPARAM2 ncr80_bput(struct soft_scsi *ncr, uaecptr addr, uae_u32 b)
  3785. {
  3786. bool iaa = isautoconfigaddr(addr);
  3787. b &= 0xff;
  3788. if (!ncr->configured && iaa) {
  3789. addr &= 65535;
  3790. switch (addr)
  3791. {
  3792. case 0x48:
  3793. map_banks_z2(ncr->bank, expamem_board_pointer >> 16, ncr->board_size >> 16);
  3794. ncr->baseaddress = expamem_board_pointer;
  3795. ncr->configured = 1;
  3796. expamem_next (ncr->bank, NULL);
  3797. break;
  3798. case 0x4c:
  3799. ncr->configured = 1;
  3800. expamem_shutup(ncr->bank);
  3801. break;
  3802. }
  3803. return;
  3804. }
  3805. ncr80_bput2(ncr, addr, b, 1);
  3806. }
  3807. static void REGPARAM2 soft_generic_bput (uaecptr addr, uae_u32 b)
  3808. {
  3809. struct soft_scsi *ncr = getscsiboard(addr);
  3810. if (ncr)
  3811. ncr80_bput(ncr, addr, b);
  3812. }
  3813. static void REGPARAM2 soft_generic_wput (uaecptr addr, uae_u32 b)
  3814. {
  3815. struct soft_scsi *ncr = getscsiboard(addr);
  3816. if (ncr)
  3817. ncr80_wput(ncr, addr, b);
  3818. }
  3819. static void REGPARAM2 soft_generic_lput (uaecptr addr, uae_u32 b)
  3820. {
  3821. struct soft_scsi *ncr = getscsiboard(addr);
  3822. if (ncr)
  3823. ncr80_lput(ncr, addr, b);
  3824. }
  3825. static uae_u32 REGPARAM2 soft_generic_bget (uaecptr addr)
  3826. {
  3827. struct soft_scsi *ncr = getscsiboard(addr);
  3828. if (ncr)
  3829. return ncr80_bget(ncr, addr);
  3830. return 0;
  3831. }
  3832. static uae_u32 REGPARAM2 soft_generic_wget (uaecptr addr)
  3833. {
  3834. struct soft_scsi *ncr = getscsiboard(addr);
  3835. if (ncr)
  3836. return ncr80_wget(ncr, addr);
  3837. return 0;
  3838. }
  3839. static uae_u32 REGPARAM2 soft_generic_lget (uaecptr addr)
  3840. {
  3841. struct soft_scsi *ncr = getscsiboard(addr);
  3842. if (ncr)
  3843. return ncr80_lget(ncr, addr);
  3844. return 0;
  3845. }
  3846. static int REGPARAM2 soft_check(uaecptr addr, uae_u32 size)
  3847. {
  3848. struct soft_scsi *ncr = getscsiboard(addr);
  3849. if (!ncr)
  3850. return 0;
  3851. if (!ncr->rom)
  3852. return 0;
  3853. return 1;
  3854. }
  3855. static uae_u8 *REGPARAM2 soft_xlate(uaecptr addr)
  3856. {
  3857. struct soft_scsi *ncr = getscsiboard(addr);
  3858. if (!ncr)
  3859. return 0;
  3860. return ncr->rom + (addr & (ncr->rom_size - 1));
  3861. }
  3862. addrbank soft_bank_generic = {
  3863. soft_generic_lget, soft_generic_wget, soft_generic_bget,
  3864. soft_generic_lput, soft_generic_wput, soft_generic_bput,
  3865. soft_xlate, soft_check, NULL, NULL, _T("LOWLEVEL/5380 SCSI"),
  3866. soft_generic_lget, soft_generic_wget,
  3867. ABFLAG_IO | ABFLAG_SAFE, S_READ, S_WRITE
  3868. };
  3869. void soft_scsi_put(uaecptr addr, int size, uae_u32 v)
  3870. {
  3871. if (size == 4)
  3872. soft_generic_lput(addr, v);
  3873. else if (size == 2)
  3874. soft_generic_wput(addr, v);
  3875. else
  3876. soft_generic_bput(addr, v);
  3877. }
  3878. uae_u32 soft_scsi_get(uaecptr addr, int size)
  3879. {
  3880. uae_u32 v;
  3881. if (size == 4)
  3882. v = soft_generic_lget(addr);
  3883. else if (size == 2)
  3884. v = soft_generic_wget(addr);
  3885. else
  3886. v = soft_generic_bget(addr);
  3887. return v;
  3888. }
  3889. static void soft_scsi_free(void)
  3890. {
  3891. parallel_port_scsi = false;
  3892. parallel_port_scsi_data = NULL;
  3893. x86_hd_data = NULL;
  3894. for (int i = 0; soft_scsi_devices[i]; i++) {
  3895. soft_scsi_free_unit(soft_scsi_devices[i]);
  3896. soft_scsi_devices[i] = NULL;
  3897. }
  3898. }
  3899. static void soft_scsi_reset(int hardreset)
  3900. {
  3901. for (int i = 0; soft_scsi_devices[i]; i++) {
  3902. raw_scsi_reset(&soft_scsi_devices[i]->rscsi);
  3903. }
  3904. }
  3905. static struct soft_scsi *getscsi(struct romconfig *rc)
  3906. {
  3907. device_add_rethink(ncr80_rethink);
  3908. device_add_reset(soft_scsi_reset);
  3909. device_add_exit(soft_scsi_free);
  3910. if (rc->unitdata)
  3911. return (struct soft_scsi *)rc->unitdata;
  3912. return NULL;
  3913. }
  3914. static void scsi_add_reset(void)
  3915. {
  3916. device_add_reset(soft_scsi_reset);
  3917. }
  3918. /*
  3919. $8380 select unit (unit mask)
  3920. $8200
  3921. 6: REQ (1=active)
  3922. 8: BSY (0=active)
  3923. 10: C/D (1=data)
  3924. 13: I/O (1=to target)
  3925. 15: If not status?
  3926. $8080 write data
  3927. $8000 read data
  3928. */
  3929. bool supra_init(struct autoconfig_info *aci)
  3930. {
  3931. const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_SUPRA);
  3932. aci->autoconfigp = ert->subtypes[aci->rc->subtype].autoconfig;
  3933. scsi_add_reset();
  3934. if (!aci->doinit)
  3935. return true;
  3936. struct soft_scsi *scsi = getscsi(aci->rc);
  3937. if (!scsi)
  3938. return false;
  3939. scsi->intena = true;
  3940. struct zfile *z = NULL;
  3941. scsi->subtype = aci->rc->subtype;
  3942. if (!aci->rc->autoboot_disabled && scsi->subtype != 3) {
  3943. for (int i = 0; i < 16; i++) {
  3944. uae_u8 b = ert->subtypes[aci->rc->subtype].autoconfig[i];
  3945. ew(scsi, i * 4, b);
  3946. }
  3947. load_rom_rc(aci->rc, ROMTYPE_SUPRA, 16384, 0, scsi->rom, 32768, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
  3948. }
  3949. aci->addrbank = scsi->bank;
  3950. return true;
  3951. }
  3952. void supra_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  3953. {
  3954. generic_soft_scsi_add(ch, ci, rc, NCR5380_SUPRA, 65536, 2 * 16384, ROMTYPE_SUPRA);
  3955. }
  3956. bool golem_init(struct autoconfig_info *aci)
  3957. {
  3958. scsi_add_reset();
  3959. if (!aci->doinit) {
  3960. load_rom_rc(aci->rc, ROMTYPE_GOLEM, 8192, aci->rc->autoboot_disabled ? 8192 : 0, aci->autoconfig_raw, 128, 0);
  3961. return true;
  3962. }
  3963. struct soft_scsi *scsi = getscsi(aci->rc);
  3964. if (!scsi)
  3965. return false;
  3966. scsi->intena = true;
  3967. load_rom_rc(aci->rc, ROMTYPE_GOLEM, 8192, aci->rc->autoboot_disabled ? 8192 : 0, scsi->rom, 8192, 0);
  3968. memcpy(scsi->acmemory, scsi->rom, sizeof scsi->acmemory);
  3969. aci->addrbank = scsi->bank;
  3970. return true;
  3971. }
  3972. void golem_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  3973. {
  3974. generic_soft_scsi_add(ch, ci, rc, NONCR_GOLEM, 65536, 8192, ROMTYPE_GOLEM);
  3975. }
  3976. bool stardrive_init(struct autoconfig_info *aci)
  3977. {
  3978. const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_STARDRIVE);
  3979. aci->autoconfigp = ert->autoconfig;
  3980. scsi_add_reset();
  3981. if (!aci->doinit)
  3982. return true;
  3983. struct soft_scsi *scsi = getscsi(aci->rc);
  3984. if (!scsi)
  3985. return false;
  3986. for (int i = 0; i < 16; i++) {
  3987. uae_u8 b = ert->autoconfig[i];
  3988. ew(scsi, i * 4, b);
  3989. }
  3990. aci->addrbank = scsi->bank;
  3991. return true;
  3992. }
  3993. void stardrive_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  3994. {
  3995. generic_soft_scsi_add(ch, ci, rc, NCR5380_STARDRIVE, 65536, 0, ROMTYPE_STARDRIVE);
  3996. }
  3997. bool kommos_init(struct autoconfig_info *aci)
  3998. {
  3999. scsi_add_reset();
  4000. if (!aci->doinit)
  4001. return true;
  4002. struct soft_scsi *scsi = getscsi(aci->rc);
  4003. if (!scsi)
  4004. return false;
  4005. scsi->configured = 1;
  4006. load_rom_rc(aci->rc, ROMTYPE_KOMMOS, 32768, 0, scsi->rom, 32768, 0);
  4007. map_banks(scsi->bank, 0xf10000 >> 16, 1, 0);
  4008. map_banks(scsi->bank, 0xeb0000 >> 16, 1, 0);
  4009. scsi->baseaddress = 0xeb0000;
  4010. scsi->baseaddress2 = 0xf10000;
  4011. aci->addrbank = scsi->bank;
  4012. return true;
  4013. }
  4014. void kommos_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4015. {
  4016. generic_soft_scsi_add(ch, ci, rc, NONCR_KOMMOS, 65536, 32768, ROMTYPE_KOMMOS);
  4017. }
  4018. bool vector_init(struct autoconfig_info *aci)
  4019. {
  4020. scsi_add_reset();
  4021. if (!aci->doinit) {
  4022. load_rom_rc(aci->rc, ROMTYPE_VECTOR, 32768, 0, aci->autoconfig_raw, 128, 0);
  4023. return true;
  4024. }
  4025. struct soft_scsi *scsi = getscsi(aci->rc);
  4026. int roms[2];
  4027. if (!scsi)
  4028. return false;
  4029. roms[0] = 128;
  4030. roms[1] = -1;
  4031. scsi->intena = true;
  4032. if (!aci->rc->autoboot_disabled) {
  4033. load_rom_rc(aci->rc, ROMTYPE_VECTOR, 32768, 0, scsi->rom, 32768, 0);
  4034. memcpy(scsi->acmemory, scsi->rom, sizeof scsi->acmemory);
  4035. }
  4036. aci->addrbank = scsi->bank;
  4037. return true;
  4038. }
  4039. void vector_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4040. {
  4041. generic_soft_scsi_add(ch, ci, rc, NONCR_VECTOR, 65536, 32768, ROMTYPE_VECTOR);
  4042. }
  4043. bool protar_init(struct autoconfig_info *aci)
  4044. {
  4045. scsi_add_reset();
  4046. if (!aci->doinit) {
  4047. load_rom_rc(aci->rc, ROMTYPE_PROTAR, 32768, 0x200, aci->autoconfig_raw, 128, LOADROM_EVENONLY_ODDONE);
  4048. return true;
  4049. }
  4050. struct soft_scsi *scsi = getscsi(aci->rc);
  4051. if (!scsi)
  4052. return false;
  4053. load_rom_rc(aci->rc, ROMTYPE_PROTAR, 32768, 0, scsi->rom, 32768, LOADROM_EVENONLY_ODDONE);
  4054. memcpy(scsi->acmemory, scsi->rom + 0x200 * 2, sizeof scsi->acmemory);
  4055. aci->addrbank = scsi->bank;
  4056. return true;
  4057. }
  4058. void protar_add_ide_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4059. {
  4060. generic_soft_scsi_add(ch, ci, rc, NCR5380_PROTAR, 65536, 65536, ROMTYPE_PROTAR);
  4061. }
  4062. bool add500_init(struct autoconfig_info *aci)
  4063. {
  4064. scsi_add_reset();
  4065. if (!aci->doinit) {
  4066. load_rom_rc(aci->rc, ROMTYPE_ADD500, 16384, 0, aci->autoconfig_raw, 128, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
  4067. return true;
  4068. }
  4069. struct soft_scsi *scsi = getscsi(aci->rc);
  4070. if (!scsi)
  4071. return false;
  4072. load_rom_rc(aci->rc, ROMTYPE_ADD500, 16384, 0, scsi->rom, 32768, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
  4073. memcpy(scsi->acmemory, scsi->rom, sizeof scsi->acmemory);
  4074. aci->addrbank = scsi->bank;
  4075. return true;
  4076. }
  4077. void add500_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4078. {
  4079. generic_soft_scsi_add(ch, ci, rc, NCR5380_ADD500, 65536, 32768, ROMTYPE_ADD500);
  4080. }
  4081. static uae_u8 kronos_eeprom[32] =
  4082. {
  4083. 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 7 << 5, 0x00, 0x00, 0x00, 0x00, 0x00,
  4084. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  4085. };
  4086. bool kronos_init(struct autoconfig_info *aci)
  4087. {
  4088. const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_KRONOS);
  4089. scsi_add_reset();
  4090. aci->autoconfigp = ert->autoconfig;
  4091. if (!aci->doinit)
  4092. return true;
  4093. struct soft_scsi *scsi = getscsi(aci->rc);
  4094. if (!scsi)
  4095. return false;
  4096. scsi->databuffer_size = 1024;
  4097. scsi->databufferptr = xcalloc(uae_u8, scsi->databuffer_size);
  4098. uae_u16 sum = 0, xorv = 0;
  4099. for (int i = 0; i < 16 - 2; i++) {
  4100. uae_u16 v = (kronos_eeprom[i * 2 + 0] << 8) | (kronos_eeprom[i * 2 + 1]);
  4101. sum += v;
  4102. xorv ^= v;
  4103. }
  4104. sum = 0 - sum;
  4105. kronos_eeprom[14 * 2 + 0] = sum >> 8;
  4106. kronos_eeprom[14 * 2 + 1] = (uae_u8)sum;
  4107. xorv ^= sum;
  4108. kronos_eeprom[15 * 2 + 0] = xorv >> 8;
  4109. kronos_eeprom[15 * 2 + 1] = (uae_u8)xorv;
  4110. scsi->eeprom = eeprom93xx_new(kronos_eeprom, 16, NULL);
  4111. load_rom_rc(aci->rc, ROMTYPE_KRONOS, 4096, 0, scsi->rom, 32768, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
  4112. aci->addrbank = scsi->bank;
  4113. return true;
  4114. }
  4115. void kronos_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4116. {
  4117. generic_soft_scsi_add(ch, ci, rc, NCR5380_KRONOS, 65536, 32768, ROMTYPE_KRONOS);
  4118. }
  4119. bool adscsi_init(struct autoconfig_info *aci)
  4120. {
  4121. scsi_add_reset();
  4122. if (!aci->doinit) {
  4123. load_rom_rc(aci->rc, ROMTYPE_ADSCSI, 32768, 0, aci->autoconfig_raw, 128, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
  4124. return true;
  4125. }
  4126. struct soft_scsi *scsi = getscsi(aci->rc);
  4127. if (!scsi)
  4128. return false;
  4129. load_rom_rc(aci->rc, ROMTYPE_ADSCSI, 32768, 0, scsi->rom, 65536, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
  4130. memcpy(scsi->acmemory, scsi->rom, sizeof scsi->acmemory);
  4131. aci->addrbank = scsi->bank;
  4132. return true;
  4133. }
  4134. void adscsi_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4135. {
  4136. generic_soft_scsi_add(ch, ci, rc, NCR5380_ADSCSI, 65536, 65536, ROMTYPE_ADSCSI);
  4137. }
  4138. bool synthesis_init(struct autoconfig_info* aci)
  4139. {
  4140. scsi_add_reset();
  4141. if (!aci->doinit) {
  4142. load_rom_rc(aci->rc, ROMTYPE_SYNTHESIS, 32768, 0, aci->autoconfig_raw, 128, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
  4143. return true;
  4144. }
  4145. struct soft_scsi* scsi = getscsi(aci->rc);
  4146. if (!scsi)
  4147. return false;
  4148. load_rom_rc(aci->rc, ROMTYPE_SYNTHESIS, 32768, 0, scsi->rom, 65536, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
  4149. memcpy(scsi->acmemory, scsi->rom, sizeof scsi->acmemory);
  4150. aci->addrbank = scsi->bank;
  4151. return true;
  4152. }
  4153. void synthesis_add_scsi_unit(int ch, struct uaedev_config_info* ci, struct romconfig* rc)
  4154. {
  4155. generic_soft_scsi_add(ch, ci, rc, NCR5380_SYNTHESIS, 65536, 65536, ROMTYPE_SYNTHESIS);
  4156. }
  4157. bool fireball_init(struct autoconfig_info* aci)
  4158. {
  4159. const struct expansionromtype* ert = get_device_expansion_rom(ROMTYPE_MASTFB);
  4160. scsi_add_reset();
  4161. aci->autoconfigp = ert->autoconfig;
  4162. if (!aci->doinit)
  4163. return true;
  4164. struct soft_scsi* scsi = getscsi(aci->rc);
  4165. if (!scsi)
  4166. return false;
  4167. scsi->dp8490v = true;
  4168. scsi->intena = true;
  4169. scsi->dma_controller = true;
  4170. load_rom_rc(aci->rc, ROMTYPE_MASTFB, 8192, 0, scsi->rom, 16384, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
  4171. for (int i = 0; i < 16; i++) {
  4172. uae_u8 b = ert->autoconfig[i];
  4173. ew(scsi, i * 4, b);
  4174. }
  4175. aci->addrbank = scsi->bank;
  4176. return true;
  4177. }
  4178. void fireball_add_scsi_unit(int ch, struct uaedev_config_info* ci, struct romconfig* rc)
  4179. {
  4180. generic_soft_scsi_add(ch, ci, rc, NCR5380_FIREBALL, 65536, 32768, ROMTYPE_MASTFB);
  4181. }
  4182. bool trumpcardpro_init(struct autoconfig_info *aci)
  4183. {
  4184. const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_IVSTPRO);
  4185. scsi_add_reset();
  4186. aci->autoconfigp = ert->autoconfig;
  4187. if (!aci->doinit)
  4188. return true;
  4189. struct soft_scsi *scsi = getscsi(aci->rc);
  4190. if (!scsi)
  4191. return false;
  4192. scsi->intena = true;
  4193. load_rom_rc(aci->rc, ROMTYPE_IVSTPRO, 16384, 0, scsi->rom, 32768, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
  4194. for (int i = 0; i < 16; i++) {
  4195. uae_u8 b = ert->autoconfig[i];
  4196. ew(scsi, i * 4, b);
  4197. }
  4198. aci->addrbank = scsi->bank;
  4199. return true;
  4200. }
  4201. void trumpcardpro_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4202. {
  4203. generic_soft_scsi_add(ch, ci, rc, NCR5380_TRUMPCARDPRO, 65536, 32768, ROMTYPE_IVSTPRO);
  4204. }
  4205. bool trumpcard_init(struct autoconfig_info *aci)
  4206. {
  4207. const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_IVSTC);
  4208. scsi_add_reset();
  4209. aci->autoconfigp = ert->autoconfig;
  4210. if (!aci->doinit)
  4211. return true;
  4212. struct soft_scsi *scsi = getscsi(aci->rc);
  4213. if (!scsi)
  4214. return false;
  4215. load_rom_rc(aci->rc, ROMTYPE_IVSTC, 16384, 0, scsi->rom, 32768, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
  4216. if (aci->rc->device_settings & 1) {
  4217. scsi->intena = true;
  4218. scsi->dma_autodack = true;
  4219. } else {
  4220. scsi->intena = false;
  4221. scsi->dma_autodack = false;
  4222. }
  4223. for (int i = 0; i < 16; i++) {
  4224. uae_u8 b = ert->autoconfig[i];
  4225. ew(scsi, i * 4, b);
  4226. }
  4227. aci->addrbank = scsi->bank;
  4228. return true;
  4229. }
  4230. void trumpcard_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4231. {
  4232. generic_soft_scsi_add(ch, ci, rc, NCR5380_TRUMPCARD, 65536, 32768, ROMTYPE_IVSTC);
  4233. }
  4234. bool rochard_scsi_init(struct romconfig *rc, uaecptr baseaddress)
  4235. {
  4236. struct soft_scsi *scsi = getscsi(rc);
  4237. scsi->configured = true;
  4238. scsi->c400 = true;
  4239. scsi->dma_controller = true;
  4240. scsi->baseaddress = baseaddress;
  4241. return scsi != NULL;
  4242. }
  4243. void rochard_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4244. {
  4245. generic_soft_scsi_add(ch, ci, rc, NCR5380_ROCHARD, 65536, -1, ROMTYPE_ROCHARD);
  4246. }
  4247. uae_u8 idescsi_scsi_get(uaecptr addr)
  4248. {
  4249. return soft_generic_bget(addr);
  4250. }
  4251. void idescsi_scsi_put(uaecptr addr, uae_u8 v)
  4252. {
  4253. soft_generic_bput(addr, v);
  4254. }
  4255. bool cltda1000scsi_init(struct autoconfig_info *aci)
  4256. {
  4257. const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_CLTDSCSI);
  4258. scsi_add_reset();
  4259. aci->autoconfigp = ert->autoconfig;
  4260. if (!aci->doinit)
  4261. return true;
  4262. struct soft_scsi *scsi = getscsi(aci->rc);
  4263. if (!scsi)
  4264. return false;
  4265. scsi->intena = true;
  4266. scsi->delayed_irq = true;
  4267. for (int i = 0; i < 16; i++) {
  4268. uae_u8 b = ert->autoconfig[i];
  4269. ew(scsi, i * 4, b);
  4270. }
  4271. aci->addrbank = scsi->bank;
  4272. return true;
  4273. }
  4274. void cltda1000scsi_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4275. {
  4276. generic_soft_scsi_add(ch, ci, rc, NCR5380_CLTD, 65536, 0, ROMTYPE_CLTDSCSI);
  4277. }
  4278. bool ptnexus_init(struct autoconfig_info *aci)
  4279. {
  4280. const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_PTNEXUS);
  4281. scsi_add_reset();
  4282. if (!aci->doinit) {
  4283. aci->autoconfigp = ert->autoconfig;
  4284. return true;
  4285. }
  4286. struct soft_scsi *scsi = getscsi(aci->rc);
  4287. if (!scsi)
  4288. return false;
  4289. scsi->intena = true;
  4290. scsi->delayed_irq = true;
  4291. for (int i = 0; i < 16; i++) {
  4292. uae_u8 b = ert->autoconfig[i];
  4293. ew(scsi, i * 4, b);
  4294. }
  4295. load_rom_rc(aci->rc, ROMTYPE_PTNEXUS, 8192, 0, scsi->rom, 65536, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
  4296. aci->addrbank = scsi->bank;
  4297. return true;
  4298. }
  4299. void ptnexus_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4300. {
  4301. generic_soft_scsi_add(ch, ci, rc, NCR5380_PTNEXUS, 65536, 65536, ROMTYPE_PTNEXUS);
  4302. }
  4303. bool dataflyer_init(struct autoconfig_info *aci)
  4304. {
  4305. scsi_add_reset();
  4306. if (!aci->doinit)
  4307. return true;
  4308. struct soft_scsi *scsi = getscsi(aci->rc);
  4309. if (!scsi)
  4310. return false;
  4311. scsi->baseaddress = (currprefs.cs_ide == IDE_A4000) ? 0xdd2000 : 0xda0000;
  4312. scsi->configured = true;
  4313. gayle_dataflyer_enable(true);
  4314. return true;
  4315. }
  4316. void dataflyer_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4317. {
  4318. generic_soft_scsi_add(ch, ci, rc, NCR5380_DATAFLYER, 4096, 0, ROMTYPE_DATAFLYERP);
  4319. }
  4320. static void expansion_add_protoautoconfig_data(uae_u8 *p, uae_u16 manufacturer_id, uae_u8 product_id)
  4321. {
  4322. memset(p, 0, 4096);
  4323. p[0x02] = product_id;
  4324. p[0x08] = manufacturer_id >> 8;
  4325. p[0x0a] = (uae_u8)manufacturer_id;
  4326. }
  4327. static void expansion_add_protoautoconfig_box(uae_u8 *p, int box_size, uae_u16 manufacturer_id, uae_u8 product_id)
  4328. {
  4329. expansion_add_protoautoconfig_data(p, manufacturer_id, product_id);
  4330. // "box without init/diagnostics code"
  4331. p[0] = 0x40 | (box_size << 3);
  4332. }
  4333. static void expansion_add_protoautoconfig_board(uae_u8 *p, int board, uae_u16 manufacturer_id, uae_u8 product_id, int memorysize)
  4334. {
  4335. p += (board + 1) * 4096;
  4336. expansion_add_protoautoconfig_data(p, manufacturer_id, product_id);
  4337. // "board without init/diagnostic code"
  4338. p[0] = 0x08;
  4339. if (memorysize) {
  4340. int v = 0;
  4341. switch (memorysize)
  4342. {
  4343. case 64 * 1024:
  4344. v = 1;
  4345. break;
  4346. case 128 * 1024:
  4347. v = 2;
  4348. break;
  4349. case 256 * 1024:
  4350. v = 3;
  4351. break;
  4352. case 512 * 1024:
  4353. v = 4;
  4354. break;
  4355. case 1024 * 1024:
  4356. v = 5;
  4357. break;
  4358. case 2048 * 1024:
  4359. v = 6;
  4360. break;
  4361. case 4096 * 1024:
  4362. default:
  4363. v = 7;
  4364. break;
  4365. }
  4366. p[0] |= v;
  4367. }
  4368. }
  4369. bool tecmar_init(struct autoconfig_info *aci)
  4370. {
  4371. static const uae_u8 ac[16] = { 0x40, 0x00, 0, 0, 1001 >> 8, (uae_u8)1001 };
  4372. scsi_add_reset();
  4373. aci->hardwired = true;
  4374. if (!aci->doinit) {
  4375. aci->zorro = 1;
  4376. aci->autoconfigp = ac;
  4377. return true;
  4378. }
  4379. struct soft_scsi *scsi = getscsi(aci->rc);
  4380. int index = 0;
  4381. if (!scsi)
  4382. return false;
  4383. scsi->rom = xcalloc(uae_u8, 65536);
  4384. expansion_add_protoautoconfig_box(scsi->rom, 3, 1001, 0);
  4385. // memory
  4386. expansion_add_protoautoconfig_board(scsi->rom, index++, 1001, 1, currprefs.fastmem[0].size);
  4387. // clock
  4388. expansion_add_protoautoconfig_board(scsi->rom, index++, 1001, 2, 0);
  4389. // serial
  4390. expansion_add_protoautoconfig_board(scsi->rom, index++, 1001, 3, 0);
  4391. // parallel
  4392. expansion_add_protoautoconfig_board(scsi->rom, index++, 1001, 4, 0);
  4393. // sasi
  4394. expansion_add_protoautoconfig_board(scsi->rom, index++, 1001, 4, 0);
  4395. memset(tecmar_clock_regs, 0, sizeof tecmar_clock_regs);
  4396. tecmar_clock_regs[11] = 0x04 | 0x02 | 0x01;
  4397. scsi->configured = true;
  4398. scsi->baseaddress = AUTOCONFIG_Z2;
  4399. aci->addrbank = scsi->bank;
  4400. return true;
  4401. }
  4402. void tecmar_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4403. {
  4404. generic_soft_scsi_add(ch, ci, rc, NONCR_TECMAR, 65536, 65536, ROMTYPE_TECMAR);
  4405. }
  4406. bool microforge_init(struct autoconfig_info *aci)
  4407. {
  4408. aci->start = 0xef0000;
  4409. aci->size = 0x10000;
  4410. aci->zorro = 0;
  4411. scsi_add_reset();
  4412. if (!aci->doinit)
  4413. return true;
  4414. struct soft_scsi *scsi = getscsi(aci->rc);
  4415. if (!scsi)
  4416. return false;
  4417. scsi->configured = 1;
  4418. map_banks(scsi->bank, aci->start >> 16, aci->size >> 16, 0);
  4419. scsi->baseaddress = aci->start;
  4420. return true;
  4421. }
  4422. void microforge_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4423. {
  4424. generic_soft_scsi_add(ch, ci, rc, NONCR_MICROFORGE, 65536, 0, ROMTYPE_MICROFORGE);
  4425. }
  4426. bool xebec_init(struct autoconfig_info *aci)
  4427. {
  4428. aci->start = 0x600000;
  4429. aci->size = 0x800000 - aci->start;
  4430. scsi_add_reset();
  4431. if (!aci->doinit)
  4432. return true;
  4433. struct soft_scsi *scsi = getscsi(aci->rc);
  4434. if (!scsi)
  4435. return false;
  4436. scsi->configured = 1;
  4437. map_banks(scsi->bank, aci->start >> 16, aci->size >> 16, 0);
  4438. scsi->board_mask = 0x1fffff;
  4439. scsi->baseaddress = aci->start;
  4440. scsi->level6 = true;
  4441. scsi->intena = true;
  4442. scsi->dma_controller = true;
  4443. scsi->databuffer_size = 32768;
  4444. scsi->databufferptr = xcalloc(uae_u8, scsi->databuffer_size);
  4445. return true;
  4446. }
  4447. void xebec_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4448. {
  4449. generic_soft_scsi_add(ch, ci, rc, NCR5380_XEBEC, 65536, 0, ROMTYPE_XEBEC);
  4450. }
  4451. bool paradox_init(struct autoconfig_info *aci)
  4452. {
  4453. scsi_add_reset();
  4454. if (!aci->doinit)
  4455. return true;
  4456. struct soft_scsi *scsi = getscsi(aci->rc);
  4457. if (!scsi)
  4458. return false;
  4459. scsi->configured = 1;
  4460. parallel_port_scsi = true;
  4461. parallel_port_scsi_data = scsi;
  4462. return true;
  4463. }
  4464. void paradox_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4465. {
  4466. generic_soft_scsi_add(ch, ci, rc, NONCR_PARADOX, 0, 0, ROMTYPE_PARADOX);
  4467. }
  4468. bool hda506_init(struct autoconfig_info *aci)
  4469. {
  4470. const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_HDA506);
  4471. scsi_add_reset();
  4472. if (!aci->doinit) {
  4473. aci->autoconfigp = ert->autoconfig;
  4474. return true;
  4475. }
  4476. struct soft_scsi *scsi = getscsi(aci->rc);
  4477. if (!scsi)
  4478. return false;
  4479. for (int i = 0; i < 16; i++) {
  4480. uae_u8 b = ert->autoconfig[i];
  4481. ew(scsi, i * 4, b);
  4482. }
  4483. scsi->level6 = true;
  4484. scsi->intena = true;
  4485. aci->addrbank = scsi->bank;
  4486. return true;
  4487. }
  4488. void hda506_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4489. {
  4490. generic_soft_scsi_add(ch, ci, rc, OMTI_HDA506, 0, 0, ROMTYPE_HDA506);
  4491. }
  4492. bool alf1_init(struct autoconfig_info *aci)
  4493. {
  4494. aci->start = 0xef0000;
  4495. aci->size = 0x10000;
  4496. scsi_add_reset();
  4497. if (!aci->doinit)
  4498. return true;
  4499. struct soft_scsi *scsi = getscsi(aci->rc);
  4500. if (!scsi)
  4501. return false;
  4502. map_banks(scsi->bank, aci->start >> 16, aci->size >> 16, 0);
  4503. scsi->board_mask = aci->size - 1;
  4504. scsi->baseaddress = aci->start;
  4505. scsi->configured = 1;
  4506. aci->addrbank = scsi->bank;
  4507. return true;
  4508. }
  4509. void alf1_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4510. {
  4511. generic_soft_scsi_add(ch, ci, rc, OMTI_ALF1, 65536, 0, ROMTYPE_ALF1);
  4512. }
  4513. bool alf2_init(struct autoconfig_info *aci)
  4514. {
  4515. aci->start = 0xef0000;
  4516. aci->size = 0x20000;
  4517. scsi_add_reset();
  4518. if (!aci->doinit)
  4519. return true;
  4520. struct soft_scsi *scsi = getscsi(aci->rc);
  4521. if (!scsi)
  4522. return false;
  4523. load_rom_rc(aci->rc, ROMTYPE_ALF2, 32768, 32768, scsi->rom, 32768, 0);
  4524. scsi->baseaddress = 0xf00000;
  4525. scsi->baseaddress2 = 0xef0000;
  4526. scsi->board_mask = 65535;
  4527. map_banks(scsi->bank, scsi->baseaddress >> 16, 1, 0);
  4528. map_banks(scsi->bank, scsi->baseaddress2 >> 16, 1, 0);
  4529. scsi->configured = 1;
  4530. aci->addrbank = scsi->bank;
  4531. return true;
  4532. }
  4533. void alf2_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4534. {
  4535. generic_soft_scsi_add(ch, ci, rc, OMTI_ALF2, 65536, 32768, ROMTYPE_ALF2);
  4536. }
  4537. bool hd20_init(struct autoconfig_info *aci)
  4538. {
  4539. aci->start = 0xf00000;
  4540. aci->size = 0x10000;
  4541. scsi_add_reset();
  4542. if (!aci->doinit)
  4543. return true;
  4544. struct soft_scsi *scsi = getscsi(aci->rc);
  4545. if (!scsi)
  4546. return false;
  4547. load_rom_rc(aci->rc, ROMTYPE_HD20A, 32768, 0, scsi->rom, 32768, 0);
  4548. scsi->baseaddress = 0xf00000;
  4549. scsi->baseaddress2 = 0x810000;
  4550. scsi->board_mask = 65535;
  4551. map_banks(scsi->bank, scsi->baseaddress >> 16, 1, 0);
  4552. map_banks(scsi->bank, scsi->baseaddress2 >> 16, 1, 0);
  4553. scsi->configured = 1;
  4554. aci->addrbank = scsi->bank;
  4555. return true;
  4556. }
  4557. void hd20_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4558. {
  4559. generic_soft_scsi_add(ch, ci, rc, OMTI_HD20, 65536, 32768, ROMTYPE_HD20A);
  4560. }
  4561. bool promigos_init(struct autoconfig_info *aci)
  4562. {
  4563. aci->start = 0xf40000;
  4564. aci->size = 0x10000;
  4565. scsi_add_reset();
  4566. if (!aci->doinit)
  4567. return true;
  4568. struct soft_scsi *scsi = getscsi(aci->rc);
  4569. if (!scsi)
  4570. return false;
  4571. map_banks(scsi->bank, aci->start >> 16, aci->size >> 16, 0);
  4572. scsi->board_mask = aci->size - 1;
  4573. scsi->baseaddress = aci->start;
  4574. scsi->configured = 1;
  4575. scsi->intena = true;
  4576. aci->addrbank = scsi->bank;
  4577. return true;
  4578. }
  4579. void promigos_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4580. {
  4581. generic_soft_scsi_add(ch, ci, rc, OMTI_PROMIGOS, 65536, 0, ROMTYPE_PROMIGOS);
  4582. }
  4583. bool system2000_init(struct autoconfig_info *aci)
  4584. {
  4585. aci->start = 0xf00000;
  4586. aci->size = 0x10000;
  4587. scsi_add_reset();
  4588. if (!aci->doinit)
  4589. return true;
  4590. struct soft_scsi *scsi = getscsi(aci->rc);
  4591. if (!scsi)
  4592. return false;
  4593. return true;
  4594. }
  4595. bool system2000_preinit(struct autoconfig_info *aci)
  4596. {
  4597. struct soft_scsi *scsi = getscsi(aci->rc);
  4598. if (!scsi)
  4599. return false;
  4600. map_banks(scsi->bank, aci->start >> 16, aci->size >> 16, 0);
  4601. scsi->board_mask = aci->size - 1;
  4602. scsi->baseaddress = aci->start;
  4603. scsi->configured = 1;
  4604. if (!aci->rc->autoboot_disabled) {
  4605. load_rom_rc(aci->rc, ROMTYPE_SYSTEM2000, 16384, 0, scsi->rom, 16384, 0);
  4606. }
  4607. aci->addrbank = scsi->bank;
  4608. return true;
  4609. }
  4610. void system2000_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4611. {
  4612. generic_soft_scsi_add(ch, ci, rc, OMTI_SYSTEM2000, 65536, 16384, ROMTYPE_SYSTEM2000);
  4613. }
  4614. bool wedge_init(struct autoconfig_info *aci)
  4615. {
  4616. aci->start = 0xea0000;
  4617. aci->size = 0x10000;
  4618. scsi_add_reset();
  4619. if (!aci->doinit)
  4620. return true;
  4621. struct soft_scsi *scsi = getscsi(aci->rc);
  4622. if (!scsi)
  4623. return false;
  4624. return true;
  4625. }
  4626. bool wedge_preinit(struct autoconfig_info *aci)
  4627. {
  4628. struct soft_scsi *scsi = getscsi(aci->rc);
  4629. if (!scsi)
  4630. return false;
  4631. map_banks(scsi->bank, aci->start >> 16, aci->size >> 16, 0);
  4632. scsi->board_mask = aci->size - 1;
  4633. scsi->baseaddress = aci->start;
  4634. scsi->configured = 1;
  4635. aci->addrbank = scsi->bank;
  4636. return true;
  4637. }
  4638. void wedge_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4639. {
  4640. generic_soft_scsi_add(ch, ci, rc, OMTI_WEDGE, 65536, 0, ROMTYPE_WEDGE);
  4641. }
  4642. bool omtiadapter_init(struct autoconfig_info *aci)
  4643. {
  4644. aci->start = 0x8f0000;
  4645. aci->size = 0x10000;
  4646. scsi_add_reset();
  4647. if (!aci->doinit)
  4648. return true;
  4649. struct soft_scsi *scsi = getscsi(aci->rc);
  4650. if (!scsi)
  4651. return false;
  4652. map_banks(scsi->bank, aci->start >> 16, aci->size >> 16, 0);
  4653. scsi->board_mask = aci->size - 1;
  4654. scsi->baseaddress = aci->start;
  4655. scsi->configured = 1;
  4656. aci->addrbank = scsi->bank;
  4657. return true;
  4658. }
  4659. void omtiadapter_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4660. {
  4661. generic_soft_scsi_add(ch, ci, rc, OMTI_ADAPTER, 65536, 0, ROMTYPE_OMTIADAPTER);
  4662. }
  4663. bool phoenixboard_init(struct autoconfig_info *aci)
  4664. {
  4665. scsi_add_reset();
  4666. if (!aci->doinit) {
  4667. load_rom_rc(aci->rc, ROMTYPE_PHOENIXB, 8192, aci->rc->autoboot_disabled ? 0 : 8192, aci->autoconfig_raw, 128, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
  4668. return true;
  4669. }
  4670. struct soft_scsi *scsi = getscsi(aci->rc);
  4671. if (!scsi)
  4672. return false;
  4673. load_rom_rc(aci->rc, ROMTYPE_PHOENIXB, 8192, aci->rc->autoboot_disabled ? 0 : 8192, scsi->rom, 16384, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
  4674. load_rom_rc(aci->rc, ROMTYPE_PHOENIXB, 16384, 16384, scsi->rom + 16384, 16384, LOADROM_EVENONLY_ODDONE | LOADROM_FILL);
  4675. memcpy(scsi->acmemory, scsi->rom, sizeof scsi->acmemory);
  4676. aci->addrbank = scsi->bank;
  4677. return true;
  4678. }
  4679. void phoenixboard_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4680. {
  4681. generic_soft_scsi_add(ch, ci, rc, NCR5380_PHOENIXBOARD, 65536, 32768, ROMTYPE_PHOENIXB);
  4682. }
  4683. void twelvegauge_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4684. {
  4685. generic_soft_scsi_add(ch, ci, rc, NCR5380_12GAUGE, 65536, 65536, ROMTYPE_CB_12GAUGE);
  4686. }
  4687. bool twelvegauge_init(struct autoconfig_info *aci)
  4688. {
  4689. const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_CB_12GAUGE);
  4690. scsi_add_reset();
  4691. if (!aci->doinit) {
  4692. load_rom_rc(aci->rc, ROMTYPE_CB_12GAUGE, 32768, 0, aci->autoconfig_raw, 128, 0);
  4693. return true;
  4694. }
  4695. struct soft_scsi *scsi = getscsi(aci->rc);
  4696. if (!scsi)
  4697. return false;
  4698. scsi->intena = true;
  4699. scsi->busy_delayed_hack = true;
  4700. load_rom_rc(aci->rc, ROMTYPE_CB_12GAUGE, 32768, 0, scsi->rom, 32768, 0);
  4701. memcpy(scsi->acmemory, scsi->rom, sizeof scsi->acmemory);
  4702. aci->addrbank = scsi->bank;
  4703. return true;
  4704. }
  4705. void ivsvector_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4706. {
  4707. generic_soft_scsi_add(ch, ci, rc, NCR5380_IVSVECTOR, 65536, 65536, ROMTYPE_CB_VECTOR);
  4708. }
  4709. bool ivsvector_init(struct autoconfig_info *aci)
  4710. {
  4711. const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_CB_VECTOR);
  4712. scsi_add_reset();
  4713. if (!aci->doinit) {
  4714. load_rom_rc(aci->rc, ROMTYPE_CB_VECTOR, 65536, 0x300, aci->autoconfig_raw, 128, 0);
  4715. return true;
  4716. }
  4717. struct soft_scsi *scsi = getscsi(aci->rc);
  4718. if (!scsi)
  4719. return false;
  4720. scsi->intena = true;
  4721. load_rom_rc(aci->rc, ROMTYPE_CB_VECTOR, 65536, 0, scsi->rom, 65536, 0);
  4722. memcpy(scsi->acmemory, scsi->rom + 0x300, sizeof scsi->acmemory);
  4723. aci->addrbank = scsi->bank;
  4724. aci->hardwired = true;
  4725. if (!currprefs.address_space_24) {
  4726. map_banks(aci->addrbank, 0x01000000 >> 16, (65536 * 16) >> 16, 65536);
  4727. scsi->baseaddress2 = 0x01000000;
  4728. scsi->board_mask2 = (65536 * 16) - 1;
  4729. }
  4730. return true;
  4731. }
  4732. bool scram5380_init(struct autoconfig_info *aci)
  4733. {
  4734. const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_SCRAM5380);
  4735. scsi_add_reset();
  4736. if (!aci->doinit) {
  4737. aci->autoconfigp = ert->autoconfig;
  4738. return true;
  4739. }
  4740. struct soft_scsi *scsi = getscsi(aci->rc);
  4741. if (!scsi)
  4742. return false;
  4743. scsi->intena = true;
  4744. load_rom_rc(aci->rc, ROMTYPE_SCRAM5380, 8192, 0, scsi->rom, 8192, 0);
  4745. for (int i = 0; i < 16; i++) {
  4746. uae_u8 b = ert->autoconfig[i];
  4747. ew(scsi, i * 4, b);
  4748. }
  4749. aci->addrbank = scsi->bank;
  4750. return true;
  4751. }
  4752. void scram5380_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4753. {
  4754. generic_soft_scsi_add(ch, ci, rc, NCR5380_SCRAM, 65536, 8192, ROMTYPE_SCRAM5380);
  4755. }
  4756. bool ossi_init(struct autoconfig_info *aci)
  4757. {
  4758. const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_OSSI);
  4759. scsi_add_reset();
  4760. if (!aci->doinit) {
  4761. if (!load_rom_rc(aci->rc, ROMTYPE_OSSI, 32768, aci->rc->autoboot_disabled ? 16384 : 0, aci->autoconfig_raw, 128, 0))
  4762. aci->autoconfigp = ert->autoconfig;
  4763. return true;
  4764. }
  4765. struct soft_scsi *scsi = getscsi(aci->rc);
  4766. if (!scsi)
  4767. return false;
  4768. if (load_rom_rc(aci->rc, ROMTYPE_OSSI, 32768, aci->rc->autoboot_disabled ? 16384 : 0, scsi->rom, 16384, 0)) {
  4769. memcpy(scsi->acmemory, scsi->rom, sizeof scsi->acmemory);
  4770. } else {
  4771. for (int i = 0; i < 16; i++) {
  4772. uae_u8 b = ert->autoconfig[i];
  4773. ew(scsi, i * 4, b);
  4774. }
  4775. }
  4776. aci->addrbank = scsi->bank;
  4777. return true;
  4778. }
  4779. void ossi_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4780. {
  4781. generic_soft_scsi_add(ch, ci, rc, NCR5380_OSSI, 65536, 16384, ROMTYPE_OSSI);
  4782. }
  4783. bool dataflyerplus_scsi_init(struct romconfig *rc, uaecptr baseaddress)
  4784. {
  4785. struct soft_scsi *scsi = getscsi(rc);
  4786. scsi->configured = true;
  4787. scsi->baseaddress = baseaddress;
  4788. scsi->intena = true;
  4789. return scsi != NULL;
  4790. }
  4791. void dataflyerplus_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4792. {
  4793. generic_soft_scsi_add(ch, ci, rc, NCR5380_DATAFLYERPLUS, 65536, -1, ROMTYPE_DATAFLYER);
  4794. }
  4795. bool hardframe_init(struct autoconfig_info *aci)
  4796. {
  4797. scsi_add_reset();
  4798. if (!aci->doinit) {
  4799. load_rom_rc(aci->rc, ROMTYPE_HARDFRAME, 32768, aci->rc->autoboot_disabled ? 64 : 0, aci->autoconfig_raw, 128, LOADROM_EVENONLY_ODDONE);
  4800. return true;
  4801. }
  4802. struct soft_scsi *scsi = getscsi(aci->rc);
  4803. if (!scsi)
  4804. return false;
  4805. load_rom_rc(aci->rc, ROMTYPE_HARDFRAME, 32768, 0, scsi->rom, 65536, LOADROM_EVENONLY_ODDONE);
  4806. if (aci->rc->autoboot_disabled)
  4807. memcpy(scsi->rom, scsi->rom + 128, 128);
  4808. memcpy(scsi->acmemory, scsi->rom, sizeof scsi->acmemory);
  4809. aci->addrbank = scsi->bank;
  4810. return true;
  4811. }
  4812. void hardframe_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4813. {
  4814. generic_soft_scsi_add(ch, ci, rc, NONCR_HARDFRAME, 65536, 65536, ROMTYPE_HARDFRAME);
  4815. }
  4816. bool inmate_init(struct autoconfig_info *aci)
  4817. {
  4818. scsi_add_reset();
  4819. if (!aci->doinit) {
  4820. load_rom_rc(aci->rc, ROMTYPE_INMATE, 32768, 0, aci->autoconfig_raw, 128, LOADROM_EVENONLY_ODDONE);
  4821. return true;
  4822. }
  4823. struct soft_scsi *scsi = getscsi(aci->rc);
  4824. if (!scsi)
  4825. return false;
  4826. load_rom_rc(aci->rc, ROMTYPE_INMATE, 32768, 0, scsi->rom, 65536, LOADROM_EVENONLY_ODDONE);
  4827. memcpy(scsi->acmemory, scsi->rom, sizeof scsi->acmemory);
  4828. aci->addrbank = scsi->bank;
  4829. return true;
  4830. }
  4831. void inmate_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4832. {
  4833. generic_soft_scsi_add(ch, ci, rc, NONCR_INMATE, 65536, 65536, ROMTYPE_INMATE);
  4834. }
  4835. bool malibu_init(struct autoconfig_info *aci)
  4836. {
  4837. const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_MALIBU);
  4838. scsi_add_reset();
  4839. if (!aci->doinit) {
  4840. aci->autoconfigp = ert->autoconfig;
  4841. return true;
  4842. }
  4843. struct soft_scsi *scsi = getscsi(aci->rc);
  4844. if (!scsi)
  4845. return false;
  4846. load_rom_rc(aci->rc, ROMTYPE_MALIBU, 8192, 0, scsi->rom, 65536, LOADROM_EVENONLY_ODDONE);
  4847. for (int i = 0; i < 16; i++) {
  4848. uae_u8 b = ert->autoconfig[i];
  4849. if (aci->rc->autoboot_disabled && i == 0)
  4850. b = 0xc1;
  4851. ew(scsi, i * 4, b);
  4852. }
  4853. aci->addrbank = scsi->bank;
  4854. return true;
  4855. }
  4856. void malibu_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4857. {
  4858. generic_soft_scsi_add(ch, ci, rc, NCR5380_MALIBU, 65536, 16384, ROMTYPE_MALIBU);
  4859. }
  4860. bool addhard_init(struct autoconfig_info *aci)
  4861. {
  4862. const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_ADDHARD);
  4863. scsi_add_reset();
  4864. if (!aci->doinit) {
  4865. aci->autoconfigp = ert->autoconfig;
  4866. return true;
  4867. }
  4868. struct soft_scsi *scsi = getscsi(aci->rc);
  4869. if (!scsi)
  4870. return false;
  4871. load_rom_rc(aci->rc, ROMTYPE_ADDHARD, 16384, 0, scsi->rom, 65536, LOADROM_EVENONLY_ODDONE);
  4872. for (int i = 0; i < 16; i++) {
  4873. uae_u8 b = ert->autoconfig[i];
  4874. ew(scsi, i * 4, b);
  4875. }
  4876. aci->addrbank = scsi->bank;
  4877. scsi->intena = true;
  4878. return true;
  4879. }
  4880. void addhard_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4881. {
  4882. generic_soft_scsi_add(ch, ci, rc, NCR5380_ADDHARD, 65536, 32768, ROMTYPE_ADDHARD);
  4883. }
  4884. bool emplant_init(struct autoconfig_info *aci)
  4885. {
  4886. const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_EMPLANT);
  4887. scsi_add_reset();
  4888. if (!aci->doinit) {
  4889. aci->autoconfigp = ert->autoconfig;
  4890. return true;
  4891. }
  4892. struct soft_scsi *scsi = getscsi(aci->rc);
  4893. if (!scsi)
  4894. return false;
  4895. load_rom_rc(aci->rc, ROMTYPE_EMPLANT, 8192, 0, scsi->rom, 16384, LOADROM_EVENONLY_ODDONE);
  4896. for (int i = 0; i < 16; i++) {
  4897. uae_u8 b = ert->autoconfig[i];
  4898. ew(scsi, i * 4, b);
  4899. }
  4900. aci->addrbank = scsi->bank;
  4901. return true;
  4902. }
  4903. void emplant_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4904. {
  4905. generic_soft_scsi_add(ch, ci, rc, NCR5380_EMPLANT, 65536, 16384, ROMTYPE_EMPLANT);
  4906. }
  4907. bool hd3000_init(struct autoconfig_info *aci)
  4908. {
  4909. const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_GOLEMHD3000);
  4910. scsi_add_reset();
  4911. if (!aci->doinit) {
  4912. load_rom_rc(aci->rc, ROMTYPE_GOLEMHD3000, 8192, !aci->rc->autoboot_disabled ? 0 : 8192, aci->autoconfig_raw, 128, 0);
  4913. return true;
  4914. }
  4915. struct soft_scsi *scsi = getscsi(aci->rc);
  4916. if (!scsi)
  4917. return false;
  4918. load_rom_rc(aci->rc, ROMTYPE_GOLEMHD3000, 8192, !aci->rc->autoboot_disabled ? 0 : 8192, scsi->rom, 65536, 0);
  4919. memcpy(scsi->acmemory, scsi->rom, sizeof scsi->acmemory);
  4920. aci->addrbank = scsi->bank;
  4921. return true;
  4922. }
  4923. void hd3000_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4924. {
  4925. generic_soft_scsi_add(ch, ci, rc, OMTI_HD3000, 65536, 16384, ROMTYPE_GOLEMHD3000);
  4926. }
  4927. bool eveshamref_init(struct autoconfig_info *aci)
  4928. {
  4929. scsi_add_reset();
  4930. if (!aci->doinit) {
  4931. load_rom_rc(aci->rc, ROMTYPE_EVESHAMREF, 65536, aci->rc->autoboot_disabled ? 0x1000 : 0, aci->autoconfig_raw, 128, LOADROM_EVENONLY_ODDONE);
  4932. return true;
  4933. }
  4934. struct soft_scsi *scsi = getscsi(aci->rc);
  4935. if (!scsi)
  4936. return false;
  4937. load_rom_rc(aci->rc, ROMTYPE_EVESHAMREF, 65536, aci->rc->autoboot_disabled ? 0x1000 : 0, scsi->rom, 65536, LOADROM_EVENONLY_ODDONE);
  4938. memcpy(scsi->acmemory, scsi->rom, sizeof scsi->acmemory);
  4939. aci->addrbank = scsi->bank;
  4940. return true;
  4941. }
  4942. void eveshamref_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4943. {
  4944. generic_soft_scsi_add(ch, ci, rc, NCR5380_EVESHAMREF, 65536, 65536, ROMTYPE_EVESHAMREF);
  4945. }
  4946. bool profex_init(struct autoconfig_info *aci)
  4947. {
  4948. const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_PROFEX);
  4949. scsi_add_reset();
  4950. if (!aci->doinit) {
  4951. load_rom_rc(aci->rc, ROMTYPE_PROFEX, 8192, 0, aci->autoconfig_raw, 128, LOADROM_EVENONLY_ODDONE);
  4952. if (aci->rc->autoboot_disabled)
  4953. aci->autoconfig_raw[0] &= ~0x10;
  4954. return true;
  4955. }
  4956. struct soft_scsi *scsi = getscsi(aci->rc);
  4957. if (!scsi)
  4958. return false;
  4959. load_rom_rc(aci->rc, ROMTYPE_PROFEX, 8192, 0, scsi->rom, 65536, LOADROM_EVENONLY_ODDONE);
  4960. if (aci->rc->autoboot_disabled)
  4961. scsi->rom[0] &= ~0x10;
  4962. memcpy(scsi->acmemory, scsi->rom, sizeof scsi->acmemory);
  4963. aci->addrbank = scsi->bank;
  4964. return true;
  4965. }
  4966. void profex_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4967. {
  4968. struct soft_scsi *ss = generic_soft_scsi_add(ch, ci, rc, OMTI_PROFEX, 65536, 16384, ROMTYPE_PROFEX);
  4969. if (ss && ch >= 0) {
  4970. // Boot ROM requires OMTI-55 "55" identifier.
  4971. ss->rscsi.device[ch]->hfd->sector_buffer[0] = '5';
  4972. ss->rscsi.device[ch]->hfd->sector_buffer[1] = '5';
  4973. }
  4974. }
  4975. bool fasttrak_init(struct autoconfig_info *aci)
  4976. {
  4977. scsi_add_reset();
  4978. if (!aci->doinit) {
  4979. load_rom_rc(aci->rc, ROMTYPE_FASTTRAK, 65536, aci->rc->autoboot_disabled ? 0x4000 : 0x6000, aci->autoconfig_raw, 128, LOADROM_EVENONLY_ODDONE);
  4980. return true;
  4981. }
  4982. struct soft_scsi *scsi = getscsi(aci->rc);
  4983. if (!scsi)
  4984. return false;
  4985. load_rom_rc(aci->rc, ROMTYPE_FASTTRAK, 65536, aci->rc->autoboot_disabled ? 0x4000 : 0x6000, scsi->rom, 0x4000, LOADROM_EVENONLY_ODDONE);
  4986. memcpy(scsi->acmemory, scsi->rom, sizeof scsi->acmemory);
  4987. aci->addrbank = scsi->bank;
  4988. return true;
  4989. }
  4990. void fasttrak_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  4991. {
  4992. generic_soft_scsi_add(ch, ci, rc, NCR5380_FASTTRAK, 65536, 65536, ROMTYPE_FASTTRAK);
  4993. }
  4994. bool overdrive_init(struct autoconfig_info *aci)
  4995. {
  4996. const struct expansionromtype *ert = get_device_expansion_rom(ROMTYPE_OVERDRIVE);
  4997. scsi_add_reset();
  4998. if (!aci->doinit) {
  4999. aci->autoconfigp = ert->autoconfig;
  5000. return true;
  5001. }
  5002. struct soft_scsi *scsi = getscsi(aci->rc);
  5003. if (!scsi)
  5004. return false;
  5005. load_rom_rc(aci->rc, ROMTYPE_OVERDRIVE, 8192, 0, scsi->rom, 32768, LOADROM_EVENONLY_ODDONE);
  5006. for (int i = 0; i < 16; i++) {
  5007. uae_u8 b = ert->autoconfig[i];
  5008. if (aci->rc->autoboot_disabled) {
  5009. if (i == 0)
  5010. b = 0xc1;
  5011. if (i == 10)
  5012. b = 0;
  5013. }
  5014. ew(scsi, i * 4, b);
  5015. }
  5016. aci->addrbank = scsi->bank;
  5017. return true;
  5018. }
  5019. void overdrive_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  5020. {
  5021. generic_soft_scsi_add(ch, ci, rc, NCR5380_OVERDRIVE, 65536, 32768, ROMTYPE_OVERDRIVE);
  5022. }
  5023. // x86 bridge scsi rancho rt1000
  5024. void x86_rt1000_bput(int portnum, uae_u8 v)
  5025. {
  5026. struct soft_scsi *scsi = x86_hd_data;
  5027. if (!scsi)
  5028. return;
  5029. if (portnum < 0) {
  5030. struct raw_scsi *rs = &scsi->rscsi;
  5031. raw_scsi_busfree(rs);
  5032. scsi->chip_state = 0;
  5033. return;
  5034. }
  5035. ncr53400_bput(scsi, portnum, v);
  5036. }
  5037. uae_u8 x86_rt1000_bget(int portnum)
  5038. {
  5039. uae_u8 v = 0xff;
  5040. struct soft_scsi *scsi = x86_hd_data;
  5041. if (!scsi)
  5042. return v;
  5043. v = ncr53400_bget(scsi, portnum);
  5044. return v;
  5045. }
  5046. extern void x86_rt1000_bios(struct zfile*, struct romconfig *rc);
  5047. bool x86_rt1000_init(struct autoconfig_info *aci)
  5048. {
  5049. static const int parent[] = { ROMTYPE_A1060, ROMTYPE_A2088, ROMTYPE_A2088T, ROMTYPE_A2286, ROMTYPE_A2386, 0 };
  5050. aci->parent_romtype = parent;
  5051. scsi_add_reset();
  5052. if (!aci->doinit)
  5053. return true;
  5054. struct soft_scsi *scsi = getscsi(aci->rc);
  5055. if (!scsi)
  5056. return false;
  5057. struct zfile *f = read_device_from_romconfig(aci->rc, 0);
  5058. if (f) {
  5059. x86_rt1000_bios(f, aci->rc);
  5060. zfile_fclose(f);
  5061. }
  5062. scsi->configured = 1;
  5063. scsi->dma_controller = true;
  5064. scsi->c400 = true;
  5065. x86_hd_data = scsi;
  5066. return true;
  5067. }
  5068. void x86_rt1000_add_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
  5069. {
  5070. generic_soft_scsi_add(ch, ci, rc, NCR5380_X86_RT1000, 0, 0, ROMTYPE_X86_RT1000);
  5071. }