static void continue_read(struct ide_state *ide) { /* reset the totals */ ide->buffer_offset = 0; /* clear the buffer ready flag */ ide->status &= ~IDE_STATUS_BUFFER_READY; if (ide->master_password_enable || ide->user_password_enable) { security_error(ide); ide->sector_count = 0; ide->bus_master_status &= ~IDE_BUSMASTER_STATUS_ACTIVE; ide->dma_active = 0; return; } /* if there is more data to read, keep going */ if (ide->sector_count > 0) ide->sector_count--; if (ide->sector_count > 0) read_next_sector(ide); else { ide->bus_master_status &= ~IDE_BUSMASTER_STATUS_ACTIVE; ide->dma_active = 0; } }
void ide_controller_device::read_buffer_empty() { /* reset the totals */ buffer_offset = 0; /* clear the buffer ready and busy flag */ status &= ~IDE_STATUS_BUFFER_READY; status &= ~IDE_STATUS_BUSY; error = IDE_ERROR_DEFAULT; set_dmarq(0); if (master_password_enable || user_password_enable) { security_error(); sector_count = 0; return; } /* if there is more data to read, keep going */ if (sector_count > 0) sector_count--; if (sector_count > 0) read_next_sector(); }
static void ide_controller_write(struct ide_state *ide, offs_t offset, int size, UINT32 data) { /* logit */ if (offset != IDE_ADDR_DATA) LOG(("%08X:IDE write to %03X = %08X, size=%d\n", activecpu_get_previouspc(), offset, data, size)); switch (offset) { /* unknown config register */ case IDE_ADDR_CONFIG_UNK: ide->config_unknown = data; break; /* active config register */ case IDE_ADDR_CONFIG_REGISTER: ide->config_register_num = data; break; /* data from active config register */ case IDE_ADDR_CONFIG_DATA: if (ide->config_register_num < IDE_CONFIG_REGISTERS) ide->config_register[ide->config_register_num] = data; break; /* write data */ case IDE_ADDR_DATA: if (ide->status & IDE_STATUS_BUFFER_READY) { /* store the correct amount of data */ ide->buffer[ide->buffer_offset++] = data; if (size > 1) ide->buffer[ide->buffer_offset++] = data >> 8; if (size > 2) { ide->buffer[ide->buffer_offset++] = data >> 16; ide->buffer[ide->buffer_offset++] = data >> 24; } /* if we're at the end of the buffer, handle it */ if (ide->buffer_offset >= IDE_DISK_SECTOR_SIZE) { if (ide->command != IDE_COMMAND_SECURITY_UNLOCK) continue_write(ide); else { if (ide->user_password_enable && memcmp(ide->buffer, ide->user_password, 2 + 32) == 0) { LOGPRINT(("IDE Unlocked user password\n")); ide->user_password_enable = 0; } if (ide->master_password_enable && memcmp(ide->buffer, ide->master_password, 2 + 32) == 0) { LOGPRINT(("IDE Unlocked master password\n")); ide->master_password_enable = 0; } #if PRINTF_IDE_PASSWORD { int i; for (i = 0; i < 34; i += 2) { if (i % 8 == 2) printf("\n"); printf("0x%02x, 0x%02x, ", ide->buffer[i], ide->buffer[i + 1]); //printf("0x%02x%02x, ", ide->buffer[i], ide->buffer[i + 1]); } printf("\n"); } #endif /* clear the busy adn error flags */ ide->status &= ~IDE_STATUS_ERROR; ide->status &= ~IDE_STATUS_BUSY; ide->status &= ~IDE_STATUS_BUFFER_READY; if (ide->master_password_enable || ide->user_password_enable) security_error(ide); else ide->status |= IDE_STATUS_DRIVE_READY; } } }
void ide_controller_device::write_buffer_full() { ide_device_interface *dev = slot[cur_drive]->dev(); set_dmarq(0); if (command == IDE_COMMAND_SECURITY_UNLOCK) { if (user_password_enable && memcmp(buffer, user_password, 2 + 32) == 0) { LOGPRINT(("IDE Unlocked user password\n")); user_password_enable = 0; } if (master_password_enable && memcmp(buffer, master_password, 2 + 32) == 0) { LOGPRINT(("IDE Unlocked master password\n")); master_password_enable = 0; } if (PRINTF_IDE_PASSWORD) { int i; for (i = 0; i < 34; i += 2) { if (i % 8 == 2) mame_printf_debug("\n"); mame_printf_debug("0x%02x, 0x%02x, ", buffer[i], buffer[i + 1]); //mame_printf_debug("0x%02x%02x, ", buffer[i], buffer[i + 1]); } mame_printf_debug("\n"); } /* clear the busy and error flags */ status &= ~IDE_STATUS_ERROR; status &= ~IDE_STATUS_BUSY; status &= ~IDE_STATUS_BUFFER_READY; if (master_password_enable || user_password_enable) security_error(); else status |= IDE_STATUS_DRIVE_READY; } else if (command == IDE_COMMAND_TAITO_GNET_UNLOCK_2) { UINT8 key[5] = { 0 }; int i, bad = 0; dev->read_key(key); for (i=0; !bad && i<512; i++) bad = ((i < 2 || i >= 7) && buffer[i]) || ((i >= 2 && i < 7) && buffer[i] != key[i-2]); status &= ~IDE_STATUS_BUSY; status &= ~IDE_STATUS_BUFFER_READY; if (bad) status |= IDE_STATUS_ERROR; else { status &= ~IDE_STATUS_ERROR; gnetreadlock= 0; } } else { continue_write(); } }