trunk/src/emu/machine/idectrl.c
| r23652 | r23653 | |
| 178 | 178 | return slot[_drive]->dev()->get_features(); |
| 179 | 179 | } |
| 180 | 180 | |
| 181 | | void ide_controller_device::ide_set_gnet_readlock(const UINT8 onoff) |
| 181 | void ide_controller_device::ide_set_gnet_readlock(int _drive, const UINT8 onoff) |
| 182 | 182 | { |
| 183 | | gnetreadlock = onoff; |
| 183 | slot[_drive]->dev()->gnetreadlock = onoff; |
| 184 | 184 | } |
| 185 | 185 | |
| 186 | | void ide_controller_device::ide_set_master_password(const UINT8 *password) |
| 186 | void ide_controller_device::ide_set_master_password(int _drive, const UINT8 *password) |
| 187 | 187 | { |
| 188 | | master_password = password; |
| 189 | | master_password_enable = (master_password != NULL); |
| 188 | slot[_drive]->dev()->master_password = password; |
| 189 | slot[_drive]->dev()->master_password_enable = (password != NULL); |
| 190 | 190 | } |
| 191 | 191 | |
| 192 | 192 | |
| 193 | | void ide_controller_device::ide_set_user_password(const UINT8 *password) |
| 193 | void ide_controller_device::ide_set_user_password(int _drive, const UINT8 *password) |
| 194 | 194 | { |
| 195 | | user_password = password; |
| 196 | | user_password_enable = (user_password != NULL); |
| 195 | slot[_drive]->dev()->user_password = password; |
| 196 | slot[_drive]->dev()->user_password_enable = (password != NULL); |
| 197 | 197 | } |
| 198 | 198 | |
| 199 | 199 | |
| r23652 | r23653 | |
| 279 | 279 | error = IDE_ERROR_DEFAULT; |
| 280 | 280 | set_dmarq(0); |
| 281 | 281 | |
| 282 | | if (master_password_enable || user_password_enable) |
| 282 | if (dev->master_password_enable || dev->user_password_enable) |
| 283 | 283 | { |
| 284 | 284 | security_error(); |
| 285 | 285 | |
| r23652 | r23653 | |
| 302 | 302 | int lba = dev->lba_address(), count = 0; |
| 303 | 303 | |
| 304 | 304 | /* GNET readlock check */ |
| 305 | | if (gnetreadlock) { |
| 305 | if (dev->gnetreadlock) { |
| 306 | 306 | status &= ~IDE_STATUS_ERROR; |
| 307 | 307 | status &= ~IDE_STATUS_BUSY; |
| 308 | 308 | return; |
| r23652 | r23653 | |
| 453 | 453 | set_dmarq(0); |
| 454 | 454 | if (command == IDE_COMMAND_SECURITY_UNLOCK) |
| 455 | 455 | { |
| 456 | | if (user_password_enable && memcmp(dev->buffer, user_password, 2 + 32) == 0) |
| 456 | if (dev->user_password_enable && memcmp(dev->buffer, dev->user_password, 2 + 32) == 0) |
| 457 | 457 | { |
| 458 | 458 | LOGPRINT(("IDE Unlocked user password\n")); |
| 459 | | user_password_enable = 0; |
| 459 | dev->user_password_enable = 0; |
| 460 | 460 | } |
| 461 | | if (master_password_enable && memcmp(dev->buffer, master_password, 2 + 32) == 0) |
| 461 | if (dev->master_password_enable && memcmp(dev->buffer, dev->master_password, 2 + 32) == 0) |
| 462 | 462 | { |
| 463 | 463 | LOGPRINT(("IDE Unlocked master password\n")); |
| 464 | | master_password_enable = 0; |
| 464 | dev->master_password_enable = 0; |
| 465 | 465 | } |
| 466 | 466 | if (PRINTF_IDE_PASSWORD) |
| 467 | 467 | { |
| r23652 | r23653 | |
| 483 | 483 | status &= ~IDE_STATUS_BUSY; |
| 484 | 484 | status &= ~IDE_STATUS_BUFFER_READY; |
| 485 | 485 | |
| 486 | | if (master_password_enable || user_password_enable) |
| 486 | if (dev->master_password_enable || dev->user_password_enable) |
| 487 | 487 | security_error(); |
| 488 | 488 | else |
| 489 | 489 | status |= IDE_STATUS_DRIVE_READY; |
| r23652 | r23653 | |
| 503 | 503 | status |= IDE_STATUS_ERROR; |
| 504 | 504 | else { |
| 505 | 505 | status &= ~IDE_STATUS_ERROR; |
| 506 | | gnetreadlock= 0; |
| 506 | dev->gnetreadlock= 0; |
| 507 | 507 | } |
| 508 | 508 | } |
| 509 | 509 | else |
| r23652 | r23653 | |
| 817 | 817 | dev->read_key(key); |
| 818 | 818 | if ((dev->precomp_offset == key[0]) && (dev->sector_count == key[1]) && (dev->cur_sector == key[2]) && (dev->cur_cylinder == (((UINT16)key[4]<<8)|key[3]))) |
| 819 | 819 | { |
| 820 | | gnetreadlock= 0; |
| 820 | dev->gnetreadlock= 0; |
| 821 | 821 | } |
| 822 | 822 | |
| 823 | 823 | /* update flags */ |
| r23652 | r23653 | |
| 1279 | 1279 | verify_only(0), |
| 1280 | 1280 | config_unknown(0), |
| 1281 | 1281 | config_register_num(0), |
| 1282 | | master_password_enable(0), |
| 1283 | | user_password_enable(0), |
| 1284 | | master_password(NULL), |
| 1285 | | user_password(NULL), |
| 1286 | | gnetreadlock(0), |
| 1287 | 1282 | cur_drive(0), |
| 1288 | 1283 | m_irq_handler(*this) |
| 1289 | 1284 | { |
| r23652 | r23653 | |
| 1302 | 1297 | verify_only(0), |
| 1303 | 1298 | config_unknown(0), |
| 1304 | 1299 | config_register_num(0), |
| 1305 | | master_password_enable(0), |
| 1306 | | user_password_enable(0), |
| 1307 | | master_password(NULL), |
| 1308 | | user_password(NULL), |
| 1309 | | gnetreadlock(0), |
| 1310 | 1300 | cur_drive(0), |
| 1311 | 1301 | m_irq_handler(*this) |
| 1312 | 1302 | { |
| r23652 | r23653 | |
| 1342 | 1332 | save_item(NAME(config_unknown)); |
| 1343 | 1333 | save_item(NAME(config_register)); |
| 1344 | 1334 | save_item(NAME(config_register_num)); |
| 1345 | | |
| 1346 | | save_item(NAME(master_password_enable)); |
| 1347 | | save_item(NAME(user_password_enable)); |
| 1348 | | |
| 1349 | | save_item(NAME(gnetreadlock)); |
| 1350 | 1335 | } |
| 1351 | 1336 | |
| 1352 | 1337 | //------------------------------------------------- |
| r23652 | r23653 | |
| 1363 | 1348 | status = IDE_STATUS_DRIVE_READY | IDE_STATUS_SEEK_COMPLETE; |
| 1364 | 1349 | error = IDE_ERROR_DEFAULT; |
| 1365 | 1350 | dev->buffer_offset = 0; |
| 1366 | | gnetreadlock = 0; |
| 1367 | | master_password_enable = (master_password != NULL); |
| 1368 | | user_password_enable = (user_password != NULL); |
| 1351 | dev->gnetreadlock = 0; |
| 1352 | dev->master_password_enable = (dev->master_password != NULL); |
| 1353 | dev->user_password_enable = (dev->user_password != NULL); |
| 1369 | 1354 | set_irq(CLEAR_LINE); |
| 1370 | 1355 | set_dmarq(0); |
| 1371 | 1356 | } |
trunk/src/emu/machine/idectrl.h
| r23652 | r23653 | |
| 83 | 83 | template<class _Object> static devcb2_base &set_irq_handler(device_t &device, _Object object) { return downcast<ide_controller_device &>(device).m_irq_handler.set_callback(object); } |
| 84 | 84 | |
| 85 | 85 | UINT8 *ide_get_features(int drive); |
| 86 | | void ide_set_gnet_readlock(const UINT8 onoff); |
| 87 | | void ide_set_master_password(const UINT8 *password); |
| 88 | | void ide_set_user_password(const UINT8 *password); |
| 86 | void ide_set_gnet_readlock(int drive, const UINT8 onoff); |
| 87 | void ide_set_master_password(int drive, const UINT8 *password); |
| 88 | void ide_set_user_password(int drive, const UINT8 *password); |
| 89 | 89 | |
| 90 | 90 | DECLARE_READ8_MEMBER(read_via_config); |
| 91 | 91 | DECLARE_WRITE8_MEMBER(write_via_config); |
| r23652 | r23653 | |
| 143 | 143 | emu_timer * last_status_timer; |
| 144 | 144 | emu_timer * reset_timer; |
| 145 | 145 | |
| 146 | | UINT8 master_password_enable; |
| 147 | | UINT8 user_password_enable; |
| 148 | | const UINT8 * master_password; |
| 149 | | const UINT8 * user_password; |
| 150 | | |
| 151 | | UINT8 gnetreadlock; |
| 152 | | |
| 153 | 146 | UINT8 cur_drive; |
| 154 | 147 | ide_slot_device *slot[2]; |
| 155 | 148 | |