trunk/src/emu/machine/scsibus.c
r17664 | r17665 | |
321 | 321 | dataout_timer->adjust(attotime::from_seconds(FORMAT_UNIT_TIMEOUT)); |
322 | 322 | break; |
323 | 323 | |
324 | | // Check track format Xebec |
325 | | case SCSI_CMD_CHECK_TRACK_FORMAT: |
326 | | LOG(1,"SCSIBUS: check track format\n"); |
327 | | command_local=1; |
328 | | xfer_count=0; |
329 | | data_last=xfer_count; |
330 | | bytes_left=0; |
331 | | devices[last_id]->SetPhase(SCSI_PHASE_STATUS); |
332 | | break; |
333 | | |
334 | | // Setup drive parameters Xebec |
335 | | case SCSI_CMD_INIT_DRIVE_PARAMS: |
336 | | LOG(1,"SCSIBUS: init_drive_params: Xebec S1410\n"); |
337 | | command_local=1; |
338 | | xfer_count=XEBEC_PARAMS_SIZE; |
339 | | data_last=xfer_count; |
340 | | bytes_left=0; |
341 | | devices[last_id]->SetPhase(SCSI_PHASE_DATAOUT); |
342 | | break; |
343 | | |
344 | | // Format bad track Xebec |
345 | | case SCSI_CMD_FORMAT_ALT_TRACK: |
346 | | LOG(1,"SCSIBUS: format_alt_track: Xebec S1410\n"); |
347 | | command_local=1; |
348 | | xfer_count=XEBEC_ALT_TRACK_SIZE; |
349 | | data_last=xfer_count; |
350 | | bytes_left=0; |
351 | | devices[last_id]->SetPhase(SCSI_PHASE_DATAOUT); |
352 | | break; |
353 | | |
354 | | // Write buffer Xebec S1410 specific |
355 | | case SCSI_CMD_WRITE_SEC_BUFFER: |
356 | | LOG(1,"SCSIBUS: write_sector_buffer: Xebec S1410\n"); |
357 | | command_local=1; |
358 | | xfer_count=XEBEC_SECTOR_BUFFER_SIZE; |
359 | | data_last=xfer_count; |
360 | | bytes_left=0; |
361 | | devices[last_id]->SetPhase(SCSI_PHASE_DATAOUT); |
362 | | break; |
363 | | |
364 | | // Read buffer Xebec S1410 specific |
365 | | case SCSI_CMD_READ_SEC_BUFFER: |
366 | | LOG(1,"SCSIBUS: read_sector_buffer: Xebec S1410\n"); |
367 | | command_local=1; |
368 | | xfer_count=XEBEC_SECTOR_BUFFER_SIZE; |
369 | | data_last=xfer_count; |
370 | | bytes_left=0; |
371 | | devices[last_id]->SetPhase(SCSI_PHASE_DATAIN); |
372 | | break; |
373 | | |
374 | | // Write buffer, Adaptec ACB40x0 specific |
375 | | case SCSI_CMD_WRITE_DATA_BUFFER: |
376 | | LOG(1,"SCSIBUS: write_buffer: Adaptec ACB40x0\n"); |
377 | | command_local=1; |
378 | | xfer_count=ADAPTEC_DATA_BUFFER_SIZE; |
379 | | data_last=xfer_count; |
380 | | bytes_left=0; |
381 | | devices[last_id]->SetPhase(SCSI_PHASE_DATAOUT); |
382 | | break; |
383 | | |
384 | | // Read buffer, Adaptec ACB40x0 specific |
385 | | case SCSI_CMD_READ_DATA_BUFFER: |
386 | | LOG(1,"SCSIBUS: read_data_buffer: Adaptec ACB40x0\n"); |
387 | | command_local=1; |
388 | | xfer_count=ADAPTEC_DATA_BUFFER_SIZE; |
389 | | data_last=xfer_count; |
390 | | bytes_left=0; |
391 | | devices[last_id]->SetPhase(SCSI_PHASE_DATAIN); |
392 | | break; |
393 | | |
394 | 324 | // Send diagnostic info |
395 | 325 | case SCSI_CMD_SEND_DIAGNOSTIC: |
396 | 326 | LOG(1,"SCSIBUS: send_diagnostic\n"); |
r17664 | r17665 | |
402 | 332 | break; |
403 | 333 | |
404 | 334 | case SCSI_CMD_SEARCH_DATA_EQUAL: |
405 | | LOG(1,"SCSIBUS: Search_data_equal ACB40x0\n"); |
| 335 | LOG(1,"SCSIBUS: Search_data_equaln"); |
406 | 336 | command_local=1; |
407 | 337 | xfer_count=0; |
408 | 338 | data_last=xfer_count; |
r17664 | r17665 | |
444 | 374 | bytes_left=0; |
445 | 375 | devices[last_id]->SetPhase(SCSI_PHASE_DATAIN); |
446 | 376 | break; |
447 | | |
448 | | // Xebec S1410 |
449 | | case SCSI_CMD_RAM_DIAGS: |
450 | | case SCSI_CMD_DRIVE_DIAGS: |
451 | | case SCSI_CMD_CONTROLER_DIAGS: |
452 | | LOG(1,"SCSIBUS: Xebec RAM, disk or Controler diags [%02X]\n",command[0]); |
453 | | command_local=1; |
454 | | xfer_count=0; |
455 | | data_last=xfer_count; |
456 | | bytes_left=0; |
457 | | devices[last_id]->SetPhase(SCSI_PHASE_STATUS); |
458 | | break; |
459 | | |
460 | | // Commodore D9060/9090 |
461 | | case SCSI_CMD_PHYSICAL_DEVICE_ID: |
462 | | LOG(1,"SCSIBUS: physical device ID\n"); |
463 | | command_local=1; |
464 | | xfer_count=0; |
465 | | data_last=xfer_count; |
466 | | bytes_left=0; |
467 | | devices[last_id]->SetPhase(SCSI_PHASE_STATUS); |
468 | | break; |
469 | 377 | } |
470 | 378 | |
471 | 379 | |
r17664 | r17665 | |
527 | 435 | |
528 | 436 | switch (command[0]) |
529 | 437 | { |
530 | | case SCSI_CMD_INIT_DRIVE_PARAMS: |
531 | | tracks=((buffer[0]<<8)+buffer[1]); |
532 | | capacity=(tracks * buffer[2]) * 17; |
533 | | LOG(1,"Tracks=%d, Heads=%d\n",tracks,buffer[2]); |
534 | | LOG(1,"Setting disk capacity to %d blocks\n",capacity); |
535 | | //debugger_break(device->machine()); |
536 | | break; |
537 | | |
538 | 438 | case SCSI_CMD_MODE_SELECT: |
539 | 439 | sense=(adaptec_sense_t *)buffer; |
540 | 440 | tracks=(sense->cylinder_count[0]<<8)+sense->cylinder_count[1]; |
r17664 | r17665 | |
757 | 657 | scsi_out_line_change(SCSI_LINE_REQ,1); |
758 | 658 | scsi_out_line_change(SCSI_LINE_BSY,1); |
759 | 659 | LOG(1,"SCSIBUS: done\n\n"); |
760 | | //if (IS_COMMAND(SCSI_CMD_READ_CAPACITY)) |
761 | | // debugger_break(device->machine()); |
762 | 660 | break; |
763 | 661 | |
764 | 662 | case SCSI_PHASE_COMMAND: |
trunk/src/emu/machine/scsibus.h
r17664 | r17665 | |
64 | 64 | #define CMD_BUF_SIZE 32 |
65 | 65 | #define ADAPTEC_BUF_SIZE 1024 |
66 | 66 | |
| 67 | // scsidev |
67 | 68 | #define SCSI_CMD_TEST_READY 0x00 |
68 | 69 | #define SCSI_CMD_RECALIBRATE 0x01 |
69 | 70 | #define SCSI_CMD_REQUEST_SENSE 0x03 |
70 | | #define SCSI_CMD_FORMAT_UNIT 0x04 |
71 | | #define SCSI_CMD_CHECK_TRACK_FORMAT 0x05 |
72 | | #define SCSI_CMD_INIT_DRIVE_PARAMS 0x0C |
73 | | #define SCSI_CMD_FORMAT_ALT_TRACK 0x0E |
74 | | #define SCSI_CMD_WRITE_SEC_BUFFER 0x0F |
75 | | #define SCSI_CMD_READ_SEC_BUFFER 0x10 |
76 | | #define SCSI_COMMAND_INQUIRY 0x12 |
77 | | #define SCSI_CMD_WRITE_DATA_BUFFER 0x13 |
78 | | #define SCSI_CMD_READ_DATA_BUFFER 0x14 |
79 | 71 | #define SCSI_CMD_MODE_SELECT 0x15 |
80 | 72 | #define SCSI_CMD_SEND_DIAGNOSTIC 0x1D |
81 | | #define SCSI_CMD_READ_CAPACITY 0x25 |
82 | | #define SCSI_CMD_SEARCH_DATA_EQUAL 0x31 |
83 | | #define SCSI_CMD_READ_DEFECT 0x37 |
84 | 73 | #define SCSI_CMD_BUFFER_WRITE 0x3B |
85 | 74 | #define SCSI_CMD_BUFFER_READ 0x3C |
86 | 75 | |
87 | | // Xebec SASI |
88 | | #define SCSI_CMD_RAM_DIAGS 0xE0 |
89 | | #define SCSI_CMD_DRIVE_DIAGS 0xE3 |
90 | | #define SCSI_CMD_CONTROLER_DIAGS 0xE4 |
| 76 | // scsihd |
| 77 | #define SCSI_CMD_FORMAT_UNIT 0x04 |
| 78 | #define SCSI_CMD_SEARCH_DATA_EQUAL 0x31 |
| 79 | #define SCSI_CMD_READ_DEFECT 0x37 |
91 | 80 | |
92 | | // Commodore D9060/9090 SASI |
93 | | #define SCSI_CMD_PHYSICAL_DEVICE_ID 0xc0 |
94 | 81 | |
95 | | #define RW_BUFFER_HEAD_BYTES 0x04 |
96 | | |
97 | | #define ADAPTEC_DATA_BUFFER_SIZE 0x0400 |
98 | | #define XEBEC_SECTOR_BUFFER_SIZE 0x0200 |
99 | | |
100 | | #define XEBEC_PARAMS_SIZE 0x08 |
101 | | #define XEBEC_ALT_TRACK_SIZE 0x03 |
102 | | |
103 | 82 | #define IS_COMMAND(cmd) (command[0]==cmd) |
104 | 83 | #define IS_READ_COMMAND() ((command[0]==0x08) || (command[0]==0x28) || (command[0]==0xa8)) |
105 | 84 | #define IS_WRITE_COMMAND() ((command[0]==0x0a) || (command[0]==0x2a)) |
trunk/src/mess/machine/s1410.c
r17664 | r17665 | |
193 | 193 | return MACHINE_CONFIG_NAME( s1410 ); |
194 | 194 | } |
195 | 195 | |
196 | | |
197 | | |
198 | 196 | //************************************************************************** |
199 | 197 | // LIVE DEVICE |
200 | 198 | //************************************************************************** |
r17664 | r17665 | |
204 | 202 | //------------------------------------------------- |
205 | 203 | |
206 | 204 | s1410_device::s1410_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
207 | | : device_t(mconfig, S1410, "Xebec S1410", tag, owner, clock) |
| 205 | : scsihd_device(mconfig, S1410, "Xebec S1410", tag, owner, clock) |
208 | 206 | { |
209 | 207 | } |
210 | 208 | |
| 209 | #define S1410_CMD_CHECK_TRACK_FORMAT ( 0x05 ) |
| 210 | #define S1410_CMD_INIT_DRIVE_PARAMS ( 0x0c ) |
| 211 | #define S1410_CMD_FORMAT_ALT_TRACK ( 0x0E ) |
| 212 | #define S1410_CMD_WRITE_SEC_BUFFER ( 0x0F ) |
| 213 | #define S1410_CMD_READ_SEC_BUFFER ( 0x10 ) |
| 214 | #define S1410_CMD_RAM_DIAGS ( 0xe0 ) |
| 215 | #define S1410_CMD_DRIVE_DIAGS ( 0xe3 ) |
| 216 | #define S1410_CMD_CONTROLER_DIAGS ( 0xe4 ) |
211 | 217 | |
212 | | //------------------------------------------------- |
213 | | // device_start - device-specific startup |
214 | | //------------------------------------------------- |
| 218 | #define TRANSFERLENGTH_INIT_DRIVE_PARAMS ( 0x08 ) |
| 219 | #define TRANSFERLENGTH_FORMAT_ALT_TRACK ( 0x03 ) |
| 220 | #define TRANSFERLENGTH_SECTOR_BUFFER ( 0x0200 ) |
215 | 221 | |
216 | | void s1410_device::device_start() |
| 222 | void s1410_device::ExecCommand( int *transferLength ) |
217 | 223 | { |
| 224 | UINT8 *command; |
| 225 | int commandLength; |
| 226 | GetCommand( &command, &commandLength ); |
| 227 | |
| 228 | switch( command[ 0 ] ) |
| 229 | { |
| 230 | case S1410_CMD_INIT_DRIVE_PARAMS: |
| 231 | SetPhase(SCSI_PHASE_DATAOUT); |
| 232 | *transferLength = TRANSFERLENGTH_INIT_DRIVE_PARAMS; |
| 233 | break; |
| 234 | |
| 235 | case S1410_CMD_FORMAT_ALT_TRACK: |
| 236 | SetPhase(SCSI_PHASE_DATAOUT); |
| 237 | *transferLength = TRANSFERLENGTH_FORMAT_ALT_TRACK; |
| 238 | break; |
| 239 | |
| 240 | case S1410_CMD_WRITE_SEC_BUFFER: |
| 241 | SetPhase(SCSI_PHASE_DATAOUT); |
| 242 | *transferLength = TRANSFERLENGTH_SECTOR_BUFFER; |
| 243 | break; |
| 244 | |
| 245 | case S1410_CMD_READ_SEC_BUFFER: |
| 246 | SetPhase(SCSI_PHASE_DATAIN); |
| 247 | *transferLength = TRANSFERLENGTH_SECTOR_BUFFER; |
| 248 | break; |
| 249 | |
| 250 | case S1410_CMD_CHECK_TRACK_FORMAT: |
| 251 | case S1410_CMD_RAM_DIAGS: |
| 252 | case S1410_CMD_DRIVE_DIAGS: |
| 253 | case S1410_CMD_CONTROLER_DIAGS: |
| 254 | SetPhase(SCSI_PHASE_STATUS); |
| 255 | *transferLength = 0; |
| 256 | break; |
| 257 | |
| 258 | default: |
| 259 | scsihd_device::ExecCommand( transferLength ); |
| 260 | break; |
| 261 | } |
218 | 262 | } |
219 | 263 | |
| 264 | void s1410_device::WriteData( UINT8 *data, int dataLength ) |
| 265 | { |
| 266 | UINT8 *command; |
| 267 | int commandLength; |
| 268 | GetCommand( &command, &commandLength ); |
220 | 269 | |
221 | | //------------------------------------------------- |
222 | | // device_reset - device-specific reset |
223 | | //------------------------------------------------- |
| 270 | switch( command[ 0 ] ) |
| 271 | { |
| 272 | case S1410_CMD_INIT_DRIVE_PARAMS: |
| 273 | { |
| 274 | UINT16 tracks=((data[0]<<8)+data[1]); |
| 275 | UINT8 heads = data[2]; |
| 276 | UINT32 capacity=(tracks * heads) * 17; |
| 277 | logerror("S1410_CMD_INIT_DRIVE_PARAMS Tracks=%d, Heads=%d, Capacity=%d\n",tracks,heads,capacity); |
| 278 | } |
| 279 | break; |
224 | 280 | |
225 | | void s1410_device::device_reset() |
226 | | { |
| 281 | default: |
| 282 | scsihd_device::WriteData( data, dataLength ); |
| 283 | break; |
| 284 | } |
227 | 285 | } |
trunk/src/mess/machine/s1410.h
r17664 | r17665 | |
13 | 13 | #define __S1410__ |
14 | 14 | |
15 | 15 | #include "emu.h" |
| 16 | #include "machine/scsihd.h" |
16 | 17 | |
17 | | |
18 | | |
19 | | //************************************************************************** |
20 | | // INTERFACE CONFIGURATION MACROS |
21 | | //************************************************************************** |
22 | | |
23 | | #define MCFG_S1410_ADD( _tag) \ |
24 | | MCFG_DEVICE_ADD(_tag, S1410, 0) |
25 | | |
26 | | |
27 | | |
28 | | //************************************************************************** |
29 | | // TYPE DEFINITIONS |
30 | | //************************************************************************** |
31 | | |
32 | | // ======================> s1410_interface |
33 | | |
34 | | struct s1410_interface |
| 18 | class s1410_device : public scsihd_device |
35 | 19 | { |
36 | | }; |
37 | | |
38 | | // ======================> s1410_device |
39 | | |
40 | | class s1410_device : public device_t, |
41 | | public s1410_interface |
42 | | { |
43 | 20 | public: |
44 | | // construction/destruction |
45 | | s1410_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 21 | // construction/destruction |
| 22 | s1410_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 23 | |
46 | 24 | // optional information overrides |
47 | 25 | virtual const rom_entry *device_rom_region() const; |
48 | 26 | virtual machine_config_constructor device_mconfig_additions() const; |
49 | 27 | |
50 | | protected: |
51 | | // device-level overrides |
52 | | virtual void device_start(); |
53 | | virtual void device_reset(); |
54 | | virtual void device_config_complete(); |
| 28 | virtual void ExecCommand( int *transferLength ); |
| 29 | virtual void WriteData( UINT8 *data, int dataLength ); |
55 | 30 | |
56 | | private: |
| 31 | protected: |
| 32 | // device-level overrides |
| 33 | virtual void device_config_complete(); |
57 | 34 | }; |
58 | 35 | |
59 | 36 | |
60 | 37 | // device type definition |
61 | 38 | extern const device_type S1410; |
62 | 39 | |
63 | | |
64 | | |
65 | 40 | #endif |
trunk/src/mess/machine/acb4070.c
r0 | r17665 | |
| 1 | /* |
| 2 | * ACB4070 + RLL drive |
| 3 | * |
| 4 | */ |
| 5 | |
| 6 | #include "emu.h" |
| 7 | #include "machine/acb4070.h" |
| 8 | |
| 9 | // device type definition |
| 10 | const device_type ACB4070 = &device_creator<acb4070_device>; |
| 11 | |
| 12 | acb4070_device::acb4070_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 13 | : scsihd_device(mconfig, ACB4070, "ACB4070", tag, owner, clock) |
| 14 | { |
| 15 | } |
| 16 | |
| 17 | #define ACB4070_CMD_WRITE_DATA_BUFFER ( 0x13 ) |
| 18 | #define ACB4070_CMD_READ_DATA_BUFFER ( 0x14 ) |
| 19 | |
| 20 | #define TRANSFERLENGTH_DATA_BUFFER 0x0400 |
| 21 | |
| 22 | void acb4070_device::ExecCommand( int *transferLength ) |
| 23 | { |
| 24 | UINT8 *command; |
| 25 | int commandLength; |
| 26 | GetCommand( &command, &commandLength ); |
| 27 | |
| 28 | switch( command[ 0 ] ) |
| 29 | { |
| 30 | case ACB4070_CMD_WRITE_DATA_BUFFER: |
| 31 | SetPhase( SCSI_PHASE_DATAOUT ); |
| 32 | *transferLength = TRANSFERLENGTH_DATA_BUFFER; |
| 33 | break; |
| 34 | |
| 35 | case ACB4070_CMD_READ_DATA_BUFFER: |
| 36 | SetPhase( SCSI_PHASE_DATAIN ); |
| 37 | *transferLength = TRANSFERLENGTH_DATA_BUFFER; |
| 38 | break; |
| 39 | |
| 40 | default: |
| 41 | scsihd_device::ExecCommand( transferLength ); |
| 42 | break; |
| 43 | } |
| 44 | } |
trunk/src/mess/machine/d9060hd.c
r0 | r17665 | |
| 1 | /* |
| 2 | * D9060 - SASI + TANDON TM602S |
| 3 | * |
| 4 | */ |
| 5 | |
| 6 | #include "emu.h" |
| 7 | #include "machine/d9060hd.h" |
| 8 | |
| 9 | // device type definition |
| 10 | const device_type D9060HD = &device_creator<d9060hd_device>; |
| 11 | |
| 12 | d9060hd_device::d9060hd_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 13 | : scsihd_device(mconfig, D9060HD, "D9060HD", tag, owner, clock) |
| 14 | { |
| 15 | } |
| 16 | |
| 17 | #define D9060HD_CMD_PHYSICAL_DEVICE_ID ( 0xc0 ) |
| 18 | #define D9060HD_CMD_DRIVE_DIAGS ( 0xe3 ) |
| 19 | |
| 20 | void d9060hd_device::ExecCommand( int *transferLength ) |
| 21 | { |
| 22 | UINT8 *command; |
| 23 | int commandLength; |
| 24 | GetCommand( &command, &commandLength ); |
| 25 | |
| 26 | switch( command[ 0 ] ) |
| 27 | { |
| 28 | case D9060HD_CMD_PHYSICAL_DEVICE_ID: |
| 29 | case D9060HD_CMD_DRIVE_DIAGS: |
| 30 | SetPhase(SCSI_PHASE_STATUS); |
| 31 | *transferLength = 0; |
| 32 | break; |
| 33 | |
| 34 | default: |
| 35 | scsihd_device::ExecCommand( transferLength ); |
| 36 | break; |
| 37 | } |
| 38 | } |
trunk/src/mess/drivers/rmnimbus.c
r17664 | r17665 | |
16 | 16 | #include "includes/rmnimbus.h" |
17 | 17 | #include "machine/er59256.h" |
18 | 18 | #include "machine/scsihd.h" |
| 19 | #include "machine/s1410.h" |
| 20 | #include "machine/acb4070.h" |
19 | 21 | #include "machine/6522via.h" |
20 | 22 | #include "machine/ctronics.h" |
21 | 23 | #include "sound/ay8910.h" |
r17664 | r17665 | |
320 | 322 | MCFG_LEGACY_FLOPPY_4_DRIVES_ADD(nimbus_floppy_interface) |
321 | 323 | |
322 | 324 | MCFG_SCSIBUS_ADD(SCSIBUS_TAG, scsibus_config) |
323 | | MCFG_SCSIDEV_ADD(SCSIBUS_TAG ":harddisk0", SCSIHD, SCSI_ID_0) |
324 | | MCFG_SCSIDEV_ADD(SCSIBUS_TAG ":harddisk1", SCSIHD, SCSI_ID_1) |
| 325 | MCFG_SCSIDEV_ADD(SCSIBUS_TAG ":harddisk0", ACB4070, SCSI_ID_0) |
| 326 | MCFG_SCSIDEV_ADD(SCSIBUS_TAG ":harddisk1", S1410, SCSI_ID_1) |
325 | 327 | MCFG_SCSIDEV_ADD(SCSIBUS_TAG ":harddisk2", SCSIHD, SCSI_ID_2) |
326 | 328 | MCFG_SCSIDEV_ADD(SCSIBUS_TAG ":harddisk3", SCSIHD, SCSI_ID_3) |
327 | 329 | |