trunk/src/emu/machine/nscsi_bus.c
| r31036 | r31037 | |
| 178 | 178 | { |
| 179 | 179 | } |
| 180 | 180 | |
| 181 | |
| 182 | const char *const nscsi_full_device::command_names[256] = { |
| 183 | /* 00 */ "TEST_UNIT_READY", "REZERO", "?", "REQUEST_SENSE", "FORMAT_UNIT", "?", "?", "REASSIGN_BLOCKS", |
| 184 | /* 08 */ "READ_6/RECIEVE", "?", "WRITE_6/SEND", "SEEK", "?", "?", "?", "?", |
| 185 | /* 10 */ "?", "?", "INQUIRY", "?", "?", "MODE_SELECT_6", "RESERVE_6", "RELEASE_6", |
| 186 | /* 18 */ "?", "?", "MODE_SENSE_6", "START_STOP_UNIT", "RECIEVE_DIAG_RES", "SEND_DIAGNOSTICS", "PREVENT_ALLOW_MEDIUM_REMOVAL", "?", |
| 187 | /* 20 */ "?", "?", "?", "READ_FORMAT_CAPACITIES", "?", "READ_CAPACITY", "?", "?", |
| 188 | |
| 189 | /* 28 */ "READ_10", "READ_GENERATION", "WRITE_10", "SEEK_10", "ERASE_10", "READ_UPDATED_BLOCK_10", "WRITE_VERIFY", "VERIFY", |
| 190 | /* 30 */ "SEARCH_DATA_HIGH_10", "SEARCH_DATA_EQUAL_10", "SEARCH_DATA_LOW_10", "SET_LIMITS_10", "PREFETCH", "SYNC_CACHE", "LOCK_UNLOCK_CACHE", "READ_DEFECT_DATA", |
| 191 | /* 38 */ "MEDIUM_SCAN", "COMPARE", "COPY_AND_VERIFY", "WRITE_BUFFER", "READ_DATA_BUFFER", "UPDATE_BLOCK", "READ_LONG", "WRITE_LONG", |
| 192 | /* 40 */ "CHANGE_DEFINITION", "WRITE_SAME", "READ_SUB_CHANNEL", "READ_TOC_PMA_ATIP", "READ_HEADER", "PLAY_AUDIO_10", "GET_CONFIGURATION", "PLAY_AUDIO_MSF", |
| 193 | /* 48 */ "PLAY_AUDIO_TRACK_INDEX", "PLAY_RELATIVE_10", "GET_EVENT_STATUS_NOTIFICATION", "PAUSE_RESUME", "LOG_SELECT", "LOG_SENSE", "STOP_PLAY_SCAN", "?", |
| 194 | /* 50 */ "XDWRITE", "READ_DISC_INFORMATION/XPWRITE", "READ_TRACK_INFORMATION/XDREAD", "RESERVE_TRACK", "SEND_OPC_INFORMATION", "MODE_SELECT_10", "RESERVE_10", "RELEASE_10", |
| 195 | /* 58 */ "REPAIR_TRACK", "READ_MASTER_CUE", "MODE_SENSE_10", "CLOSE_TRACK_SESSION", "READ_BUFFER_CAPACITY", "SEND_CUE_SHEET", "PERSISTENT_RESERVE_IN", "PERSISTENT_RESERVE_OUT", |
| 196 | /* 80 */ "XDWRITE_EXTENDED", "REBUILD", "REGENERATE", "EXTENDED_COPY", "RECEIVE_COPY_RESULTS", "?", "?", "?", |
| 197 | /* 88 */ "?", "?", "?", "?", "?", "?", "?", "?", |
| 198 | /* 90 */ "?", "?", "?", "?", "?", "?", "?", "?", |
| 199 | /* 98 */ "?", "?", "?", "?", "?", "?", "?", "?", |
| 200 | /* a0 */ "REPORT_LUNS", "BLANK", "SEND_EVENT", "REPORT_DEVICE_IDENTIFIER/SEND_KEY", "SET_DEVICE_IDENTIFIER/REPORT_KEY", "PLAY_AUDIO_12", "LOAD_UNLOAD_MEDIUM", "MOVE_MEDIUM_ATTACHED/SET_READ_AHEAD", |
| 201 | /* a8 */ "READ_12", "PLAY_RELATIVE_12", "WRITE_12", "?", "ERASE_12/GET_PERFORMANCE", "READ_DVD_STRUCTURE", "WRITE_AND_VERIFY_12", "VERIFY_12", |
| 202 | /* b0 */ "SEARCH_DATA_HIGH_12", "SEARCH_DATA_EQUAL_12", "SEARCH_DATA_LOW_12", "SET_LIMITS_12", "READ_ELEMENT_STATUS_ATTACHED", "?", "SET_STREAMING", "READ_DEFECT_DATA_12", |
| 203 | /* b8 */ "?", "READ_CD_MSF", "SCAN_MMC", "SET_CD_SPEED", "PLAY_CD", "MECHANISM_STATUS", "READ_CD", "SEND_DVD_STRUCTURE", |
| 204 | /* c0 */ "?", "?", "?", "?", "?", "?", "?", "?", |
| 205 | /* c8 */ "?", "?", "?", "?", "?", "?", "?", "?", |
| 206 | /* d0 */ "?", "?", "?", "?", "?", "?", "?", "?", |
| 207 | /* d8 */ "?", "?", "?", "?", "?", "?", "?", "?", |
| 208 | /* e0 */ "?", "?", "?", "?", "?", "?", "?", "?", |
| 209 | /* e8 */ "?", "?", "?", "?", "?", "?", "?", "?", |
| 210 | /* f0 */ "?", "?", "?", "?", "?", "?", "?", "?", |
| 211 | /* f8 */ "?", "?", "?", "?", "?", "?", "?", "?", |
| 212 | }; |
| 213 | |
| 181 | 214 | void nscsi_full_device::device_start() |
| 182 | 215 | { |
| 183 | 216 | nscsi_device::device_start(); |
| r31036 | r31037 | |
| 537 | 570 | |
| 538 | 571 | void nscsi_full_device::scsi_unknown_command() |
| 539 | 572 | { |
| 540 | | logerror("%s: Unknown command", tag()); |
| 573 | logerror("%s: Unhandled command %s", tag(), command_names[scsi_cmdbuf[0]]); |
| 541 | 574 | for(int i=0; i != scsi_cmdsize; i++) |
| 542 | 575 | logerror(" %02x", scsi_cmdbuf[i]); |
| 543 | 576 | logerror("\n"); |
trunk/src/emu/machine/nscsi_bus.h
| r31036 | r31037 | |
| 107 | 107 | |
| 108 | 108 | // SCSI status returns |
| 109 | 109 | enum { |
| 110 | | SS_GOOD = 0x00, |
| 111 | | SS_CHECK_CONDITION = 0x02, |
| 112 | | SS_CONDITION_MET = 0x04, |
| 113 | | SS_BUSY = 0x08, |
| 114 | | SS_INT_GOOD = 0x10, |
| 115 | | SS_INT_CONDITION_MET = 0x14, |
| 116 | | SS_RESV_CONFLICT = 0x18, |
| 117 | | SS_TERMINATED = 0x22, |
| 118 | | SS_QUEUE_FULL = 0x28, |
| 110 | SS_GOOD = 0x00, |
| 111 | SS_CHECK_CONDITION = 0x02, |
| 112 | SS_CONDITION_MET = 0x04, |
| 113 | SS_BUSY = 0x08, |
| 114 | SS_INT_GOOD = 0x10, |
| 115 | SS_INT_CONDITION_MET = 0x14, |
| 116 | SS_RESV_CONFLICT = 0x18, |
| 117 | SS_TERMINATED = 0x22, |
| 118 | SS_QUEUE_FULL = 0x28, |
| 119 | 119 | }; |
| 120 | 120 | |
| 121 | 121 | // SCSI commands |
| 122 | static const char *const command_names[256]; |
| 122 | 123 | enum { |
| 123 | | SC_TEST_UNIT_READY = 0x00, |
| 124 | | SC_REZERO = 0x01, |
| 125 | | SC_REQUEST_SENSE = 0x03, |
| 126 | | SC_FORMAT_UNIT = 0x04, |
| 127 | | SC_REASSIGN_BLOCKS = 0x07, |
| 128 | | SC_READ = 0x08, |
| 129 | | SC_WRITE = 0x0a, |
| 130 | | SC_SEEK = 0x0b, |
| 131 | | SC_INQUIRY = 0x12, |
| 132 | | SC_MODE_SELECT_6 = 0x15, |
| 133 | | SC_RESERVE_6 = 0x16, |
| 134 | | SC_RELEASE_6 = 0x17, |
| 135 | | SC_MODE_SENSE_6 = 0x1a, |
| 136 | | SC_START_STOP_UNIT = 0x1b, |
| 137 | | SC_RECIEVE_DIAG_RES = 0x1c, |
| 138 | | SC_SEND_DIAGNOSTICS = 0x1d, |
| 139 | | SC_READ_CAPACITY = 0x25, |
| 140 | | SC_READ_EXTENDED = 0x28, |
| 141 | | SC_WRITE_EXTENDED = 0x2a, |
| 142 | | SC_SEEK_EXTENDED = 0x2b, |
| 143 | | SC_WRITE_VERIFY = 0x2e, |
| 144 | | SC_VERIFY = 0x2f, |
| 145 | | SC_SYNC_CACHE = 0x35, |
| 146 | | SC_READ_DEFECT_DATA = 0x37, |
| 147 | | SC_READ_DATA_BUFFER = 0x3c, |
| 148 | | SC_READ_LONG = 0x3e, |
| 149 | | SC_WRITE_LONG = 0x3f, |
| 150 | | SC_CHANGE_DEFINITION = 0x40, |
| 151 | | SC_LOG_SELECT = 0x4c, |
| 152 | | SC_LOG_SENSE = 0x4d, |
| 153 | | SC_MODE_SELECT_10 = 0x55, |
| 154 | | SC_RESERVE_10 = 0x56, |
| 155 | | SC_RELEASE_10 = 0x57, |
| 156 | | SC_MODE_SENSE_10 = 0x5a, |
| 124 | SC_TEST_UNIT_READY = 0x00, |
| 125 | SC_REZERO = 0x01, |
| 126 | SC_REQUEST_SENSE = 0x03, |
| 127 | SC_FORMAT_UNIT = 0x04, |
| 128 | SC_REASSIGN_BLOCKS = 0x07, |
| 129 | SC_READ_6 = 0x08, |
| 130 | SC_RECIEVE = 0x08, |
| 131 | SC_WRITE_6 = 0x0a, |
| 132 | SC_SEND = 0x0a, |
| 133 | SC_SEEK = 0x0b, |
| 134 | SC_INQUIRY = 0x12, |
| 135 | SC_MODE_SELECT_6 = 0x15, |
| 136 | SC_RESERVE_6 = 0x16, |
| 137 | SC_RELEASE_6 = 0x17, |
| 138 | SC_MODE_SENSE_6 = 0x1a, |
| 139 | SC_START_STOP_UNIT = 0x1b, |
| 140 | SC_RECIEVE_DIAG_RES = 0x1c, |
| 141 | SC_SEND_DIAGNOSTICS = 0x1d, |
| 142 | SC_PREVENT_ALLOW_MEDIUM_REMOVAL = 0x1e, |
| 143 | SC_READ_FORMAT_CAPACITIES = 0x23, |
| 144 | SC_READ_CAPACITY = 0x25, |
| 145 | SC_READ_10 = 0x28, |
| 146 | SC_READ_GENERATION = 0x29, |
| 147 | SC_WRITE_10 = 0x2a, |
| 148 | SC_SEEK_10 = 0x2b, |
| 149 | SC_ERASE_10 = 0x2c, |
| 150 | SC_READ_UPDATED_BLOCK_10 = 0x2d, |
| 151 | SC_WRITE_VERIFY = 0x2e, |
| 152 | SC_VERIFY = 0x2f, |
| 153 | SC_SEARCH_DATA_HIGH_10 = 0x30, |
| 154 | SC_SEARCH_DATA_EQUAL_10 = 0x31, |
| 155 | SC_SEARCH_DATA_LOW_10 = 0x32, |
| 156 | SC_SET_LIMITS_10 = 0x33, |
| 157 | SC_PREFETCH = 0x34, |
| 158 | SC_SYNC_CACHE = 0x35, |
| 159 | SC_LOCK_UNLOCK_CACHE = 0x36, |
| 160 | SC_READ_DEFECT_DATA = 0x37, |
| 161 | SC_MEDIUM_SCAN = 0x38, |
| 162 | SC_COMPARE = 0x39, |
| 163 | SC_COPY_AND_VERIFY = 0x3a, |
| 164 | SC_WRITE_BUFFER = 0x3b, |
| 165 | SC_READ_DATA_BUFFER = 0x3c, |
| 166 | SC_UPDATE_BLOCK = 0x3d, |
| 167 | SC_READ_LONG = 0x3e, |
| 168 | SC_WRITE_LONG = 0x3f, |
| 169 | SC_CHANGE_DEFINITION = 0x40, |
| 170 | SC_WRITE_SAME = 0x41, |
| 171 | SC_READ_SUB_CHANNEL = 0x42, |
| 172 | SC_READ_TOC_PMA_ATIP = 0x43, |
| 173 | SC_READ_HEADER = 0x44, |
| 174 | SC_PLAY_AUDIO_10 = 0x45, |
| 175 | SC_GET_CONFIGURATION = 0x46, |
| 176 | SC_PLAY_AUDIO_MSF = 0x47, |
| 177 | SC_PLAY_AUDIO_TRACK_INDEX = 0x48, |
| 178 | SC_PLAY_RELATIVE_10 = 0x49, |
| 179 | SC_GET_EVENT_STATUS_NOTIFICATION = 0x4a, |
| 180 | SC_PAUSE_RESUME = 0x4b, |
| 181 | SC_LOG_SELECT = 0x4c, |
| 182 | SC_LOG_SENSE = 0x4d, |
| 183 | SC_STOP_PLAY_SCAN = 0x4e, |
| 184 | SC_XDWRITE = 0x50, |
| 185 | SC_XPWRITE = 0x51, |
| 186 | SC_READ_DISC_INFORMATION = 0x51, |
| 187 | SC_READ_TRACK_INFORMATION = 0x52, |
| 188 | SC_XDREAD = 0x52, |
| 189 | SC_RESERVE_TRACK = 0x53, |
| 190 | SC_SEND_OPC_INFORMATION = 0x54, |
| 191 | SC_MODE_SELECT_10 = 0x55, |
| 192 | SC_RESERVE_10 = 0x56, |
| 193 | SC_RELEASE_10 = 0x57, |
| 194 | SC_REPAIR_TRACK = 0x58, |
| 195 | SC_READ_MASTER_CUE = 0x59, |
| 196 | SC_MODE_SENSE_10 = 0x5a, |
| 197 | SC_CLOSE_TRACK_SESSION = 0x5b, |
| 198 | SC_READ_BUFFER_CAPACITY = 0x5c, |
| 199 | SC_SEND_CUE_SHEET = 0x5d, |
| 200 | SC_PERSISTENT_RESERVE_IN = 0x5e, |
| 201 | SC_PERSISTENT_RESERVE_OUT = 0x5f, |
| 202 | SC_XDWRITE_EXTENDED = 0x80, |
| 203 | SC_REBUILD = 0x81, |
| 204 | SC_REGENERATE = 0x82, |
| 205 | SC_EXTENDED_COPY = 0x83, |
| 206 | SC_RECEIVE_COPY_RESULTS = 0x84, |
| 207 | SC_REPORT_LUNS = 0xa0, |
| 208 | SC_BLANK = 0xa1, |
| 209 | SC_SEND_EVENT = 0xa2, |
| 210 | SC_REPORT_DEVICE_IDENTIFIER = 0xa3, |
| 211 | SC_SEND_KEY = 0xa3, |
| 212 | SC_REPORT_KEY = 0xa4, |
| 213 | SC_SET_DEVICE_IDENTIFIER = 0xa4, |
| 214 | SC_PLAY_AUDIO_12 = 0xa5, |
| 215 | SC_LOAD_UNLOAD_MEDIUM = 0xa6, |
| 216 | SC_MOVE_MEDIUM_ATTACHED = 0xa7, |
| 217 | SC_SET_READ_AHEAD = 0xa7, |
| 218 | SC_READ_12 = 0xa8, |
| 219 | SC_PLAY_RELATIVE_12 = 0xa9, |
| 220 | SC_WRITE_12 = 0xaa, |
| 221 | SC_ERASE_12 = 0xac, |
| 222 | SC_GET_PERFORMANCE = 0xac, |
| 223 | SC_READ_DVD_STRUCTURE = 0xad, |
| 224 | SC_WRITE_AND_VERIFY_12 = 0xae, |
| 225 | SC_VERIFY_12 = 0xaf, |
| 226 | SC_SEARCH_DATA_HIGH_12 = 0xb0, |
| 227 | SC_SEARCH_DATA_EQUAL_12 = 0xb1, |
| 228 | SC_SEARCH_DATA_LOW_12 = 0xb2, |
| 229 | SC_SET_LIMITS_12 = 0xb3, |
| 230 | SC_READ_ELEMENT_STATUS_ATTACHED = 0xb4, |
| 231 | SC_SET_STREAMING = 0xb6, |
| 232 | SC_READ_DEFECT_DATA_12 = 0xb7, |
| 233 | SC_READ_CD_MSF = 0xb9, |
| 234 | SC_SCAN_MMC = 0xba, |
| 235 | SC_SET_CD_SPEED = 0xbb, |
| 236 | SC_PLAY_CD = 0xbc, |
| 237 | SC_MECHANISM_STATUS = 0xbd, |
| 238 | SC_READ_CD = 0xbe, |
| 239 | SC_SEND_DVD_STRUCTURE = 0xbf, |
| 157 | 240 | }; |
| 158 | 241 | |
| 159 | 242 | // SCSI Messages |
| 160 | 243 | enum { |
| 161 | | SM_COMMAND_COMPLETE = 0x00, |
| 162 | | SM_EXTENDED_MSG = 0x01, |
| 163 | | SM_SAVE_DATA_PTR = 0x02, |
| 164 | | SM_RESTORE_PTR = 0x03, |
| 165 | | SM_DISCONNECT = 0x04, |
| 166 | | SM_INITIATOR_ERROR = 0x05, |
| 167 | | SM_ABORT = 0x06, |
| 168 | | SM_MSG_REJECT = 0x07, |
| 169 | | SM_NOP = 0x08, |
| 170 | | SM_MSG_PARITY = 0x09, |
| 171 | | SM_LCMD_COMPLETE = 0x0a, |
| 172 | | SM_LCMD_COMPLETE_F = 0x0b, |
| 173 | | SM_BUS_DEVICE_RESET = 0x0c, |
| 174 | | SM_ABORT_TAG = 0x0d, |
| 175 | | SM_CLEAR_QUEUE = 0x0e, |
| 176 | | SM_INIT_RECOVERY = 0x0f, |
| 177 | | SM_RELEASE_RECOVERY = 0x10, |
| 178 | | SM_TERMINATE_IO = 0x11, |
| 179 | | SM_SIMPLE_QUEUE = 0x20, |
| 180 | | SM_HEAD_QUEUE = 0x21, |
| 181 | | SM_ORDERED_QUEUE = 0x22, |
| 182 | | SM_IGNORE_WIDE_RES = 0x23, |
| 244 | SM_COMMAND_COMPLETE = 0x00, |
| 245 | SM_EXTENDED_MSG = 0x01, |
| 246 | SM_SAVE_DATA_PTR = 0x02, |
| 247 | SM_RESTORE_PTR = 0x03, |
| 248 | SM_DISCONNECT = 0x04, |
| 249 | SM_INITIATOR_ERROR = 0x05, |
| 250 | SM_ABORT = 0x06, |
| 251 | SM_MSG_REJECT = 0x07, |
| 252 | SM_NOP = 0x08, |
| 253 | SM_MSG_PARITY = 0x09, |
| 254 | SM_LCMD_COMPLETE = 0x0a, |
| 255 | SM_LCMD_COMPLETE_F = 0x0b, |
| 256 | SM_BUS_DEVICE_RESET = 0x0c, |
| 257 | SM_ABORT_TAG = 0x0d, |
| 258 | SM_CLEAR_QUEUE = 0x0e, |
| 259 | SM_INIT_RECOVERY = 0x0f, |
| 260 | SM_RELEASE_RECOVERY = 0x10, |
| 261 | SM_TERMINATE_IO = 0x11, |
| 262 | SM_SIMPLE_QUEUE = 0x20, |
| 263 | SM_HEAD_QUEUE = 0x21, |
| 264 | SM_ORDERED_QUEUE = 0x22, |
| 265 | SM_IGNORE_WIDE_RES = 0x23, |
| 183 | 266 | }; |
| 184 | 267 | |
| 185 | 268 | enum { |
trunk/src/emu/machine/nscsi_cd.c
| r31036 | r31037 | |
| 53 | 53 | return block[pos & (bytes_per_sector - 1)]; |
| 54 | 54 | } |
| 55 | 55 | |
| 56 | void nscsi_cdrom_device::return_no_cd() |
| 57 | { |
| 58 | sense(false, 3); |
| 59 | scsi_status_complete(SS_CHECK_CONDITION); |
| 60 | } |
| 61 | |
| 56 | 62 | void nscsi_cdrom_device::scsi_command() |
| 57 | 63 | { |
| 58 | 64 | switch(scsi_cmdbuf[0]) { |
| 59 | 65 | case SC_TEST_UNIT_READY: |
| 60 | 66 | logerror("%s: command TEST UNIT READY\n", tag()); |
| 61 | | scsi_status_complete(SS_GOOD); |
| 67 | if(cdrom) |
| 68 | scsi_status_complete(SS_GOOD); |
| 69 | else |
| 70 | return_no_cd(); |
| 62 | 71 | break; |
| 63 | 72 | |
| 64 | | case SC_READ: |
| 73 | case SC_READ_6: |
| 74 | if(!cdrom) { |
| 75 | return_no_cd(); |
| 76 | break; |
| 77 | } |
| 78 | |
| 65 | 79 | lba = ((scsi_cmdbuf[1] & 0x1f)<<16) | (scsi_cmdbuf[2]<<8) | scsi_cmdbuf[3]; |
| 66 | 80 | blocks = scsi_cmdbuf[4]; |
| 67 | 81 | if(!blocks) |
| r31036 | r31037 | |
| 113 | 127 | break; |
| 114 | 128 | |
| 115 | 129 | case SC_READ_CAPACITY: { |
| 130 | if(!cdrom) { |
| 131 | return_no_cd(); |
| 132 | break; |
| 133 | } |
| 134 | |
| 116 | 135 | logerror("%s: command READ CAPACITY\n", tag()); |
| 117 | 136 | |
| 118 | 137 | UINT32 temp = cdrom_get_track_start(cdrom, 0xaa); |
| r31036 | r31037 | |
| 132 | 151 | break; |
| 133 | 152 | } |
| 134 | 153 | |
| 135 | | case SC_READ_EXTENDED: |
| 154 | case SC_READ_10: |
| 155 | if(!cdrom) { |
| 156 | return_no_cd(); |
| 157 | break; |
| 158 | } |
| 159 | |
| 136 | 160 | lba = (scsi_cmdbuf[2]<<24) | (scsi_cmdbuf[3]<<16) | (scsi_cmdbuf[4]<<8) | scsi_cmdbuf[5]; |
| 137 | 161 | blocks = (scsi_cmdbuf[7] << 8) | scsi_cmdbuf[8]; |
| 138 | 162 | |
| r31036 | r31037 | |
| 143 | 167 | scsi_status_complete(SS_GOOD); |
| 144 | 168 | break; |
| 145 | 169 | |
| 170 | case SC_MODE_SENSE_6: { |
| 171 | int lun = get_lun(scsi_cmdbuf[1] >> 5); |
| 172 | logerror("%s: command MODE SENSE 6 lun=%d page=%02x alloc=%02x link=%02x\n", |
| 173 | tag(), |
| 174 | lun, scsi_cmdbuf[2] & 0x3f, scsi_cmdbuf[4], scsi_cmdbuf[5]); |
| 175 | if(lun) { |
| 176 | bad_lun(); |
| 177 | return; |
| 178 | } |
| 179 | |
| 180 | int page = scsi_cmdbuf[2] & 0x3f; |
| 181 | int size = scsi_cmdbuf[4]; |
| 182 | int pos = 1; |
| 183 | scsi_cmdbuf[pos++] = 0x00; // medium type |
| 184 | scsi_cmdbuf[pos++] = 0x80; // WP, cache |
| 185 | |
| 186 | UINT32 temp = cdrom_get_track_start(cdrom, 0xaa); |
| 187 | temp--; // return the last used block on the disc |
| 188 | scsi_cmdbuf[pos++] = 0x08; // Block descriptor length |
| 189 | |
| 190 | scsi_cmdbuf[pos++] = (temp>>24) & 0xff; |
| 191 | scsi_cmdbuf[pos++] = (temp>>16) & 0xff; |
| 192 | scsi_cmdbuf[pos++] = (temp>>8) & 0xff; |
| 193 | scsi_cmdbuf[pos++] = (temp & 0xff); |
| 194 | scsi_cmdbuf[pos++] = 0; |
| 195 | scsi_cmdbuf[pos++] = 0; |
| 196 | scsi_cmdbuf[pos++] = (bytes_per_sector>>8)&0xff; |
| 197 | scsi_cmdbuf[pos++] = (bytes_per_sector & 0xff); |
| 198 | |
| 199 | int pmax = page == 0x3f ? 0x3e : page; |
| 200 | int pmin = page == 0x3f ? 0x00 : page; |
| 201 | for(int page=pmax; page >= pmin; page--) { |
| 202 | switch(page) { |
| 203 | case 0x00: // Unit attention parameters page (weird) |
| 204 | scsi_cmdbuf[pos++] = 0x80; // PS, page id |
| 205 | scsi_cmdbuf[pos++] = 0x02; // Page length |
| 206 | scsi_cmdbuf[pos++] = 0x00; // Meh |
| 207 | scsi_cmdbuf[pos++] = 0x00; // Double meh |
| 208 | break; |
| 209 | |
| 210 | case 0x02: // Disconnect/reconnect control parameters (guessed) |
| 211 | scsi_cmdbuf[pos++] = 0x82; // PS, page id |
| 212 | scsi_cmdbuf[pos++] = 0x0e; // Page length |
| 213 | scsi_cmdbuf[pos++] = 0xe6; // Buffer full ratio, 90% |
| 214 | scsi_cmdbuf[pos++] = 0x1a; // Buffer empty ratio, 10% |
| 215 | scsi_cmdbuf[pos++] = 0x00; // Bus inactivity limit, 0 |
| 216 | scsi_cmdbuf[pos++] = 0x00; |
| 217 | scsi_cmdbuf[pos++] = 0x00; // Disconnect time limit, 0 |
| 218 | scsi_cmdbuf[pos++] = 0x00; |
| 219 | scsi_cmdbuf[pos++] = 0x00; // Connect time limit, 0 |
| 220 | scsi_cmdbuf[pos++] = 0x00; |
| 221 | scsi_cmdbuf[pos++] = 0x00; // Maximum burst size, 0 |
| 222 | scsi_cmdbuf[pos++] = 0x00; |
| 223 | scsi_cmdbuf[pos++] = 0x00; // EMDP, Dimm, DTDC |
| 224 | scsi_cmdbuf[pos++] = 0x00; // Reserved |
| 225 | scsi_cmdbuf[pos++] = 0x00; // Reserved |
| 226 | scsi_cmdbuf[pos++] = 0x00; // Reserved |
| 227 | break; |
| 228 | |
| 229 | default: |
| 230 | logerror("%s: mode sense page %02x unhandled\n", tag(), page); |
| 231 | break; |
| 232 | } |
| 233 | } |
| 234 | scsi_cmdbuf[0] = pos; |
| 235 | if(pos > size) |
| 236 | pos = size; |
| 237 | |
| 238 | scsi_data_in(0, pos); |
| 239 | scsi_status_complete(SS_GOOD); |
| 240 | break; |
| 241 | } |
| 242 | |
| 146 | 243 | default: |
| 244 | fprintf(stderr, "scsi %02x\n", scsi_cmdbuf[0]); |
| 245 | |
| 147 | 246 | nscsi_full_device::scsi_command(); |
| 148 | 247 | break; |
| 149 | 248 | } |