diff --git a/src/devices/disk/zip.c b/src/devices/disk/zip.c index 1366083..0195135 100644 --- a/src/devices/disk/zip.c +++ b/src/devices/disk/zip.c @@ -9,7 +9,7 @@ * Implementation of the Iomega ZIP drive with SCSI(-like) * commands, for both ATAPI and SCSI usage. * - * Version: @(#)zip.c 1.0.24 2018/10/26 + * Version: @(#)zip.c 1.0.24 2018/10/27 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -469,10 +469,7 @@ static const mode_sense_pages_t mode_sense_pages_changeable250 = { } }; -static void command_complete(zip_t *dev); -static void zip_init(zip_t *dev); - -static void zip_callback(void *p); +static void do_callback(void *p); #ifdef _LOGGING @@ -492,109 +489,6 @@ zip_log(int level, const char *fmt, ...) #endif -int -find_zip_for_channel(uint8_t channel) -{ - uint8_t i = 0; - - for (i = 0; i < ZIP_NUM; i++) { - if ((zip_drives[i].bus_type == ZIP_BUS_ATAPI) && - (zip_drives[i].bus_id.ide_channel == channel)) - return i; - } - return 0xff; -} - - -int -zip_load(zip_t *dev, const wchar_t *fn) -{ - int read_only = dev->drv->ui_writeprot; - int size = 0; - - dev->drv->f = plat_fopen(fn, dev->drv->ui_writeprot ? L"rb" : L"rb+"); - if (!dev->drv->ui_writeprot && !dev->drv->f) { - dev->drv->f = plat_fopen(fn, L"rb"); - read_only = 1; - } - if (dev->drv->f) { - fseek(dev->drv->f, 0, SEEK_END); - size = ftell(dev->drv->f); - - if ((size == ((ZIP_SECTORS_250 << 9) + 0x1000)) || (size == ((ZIP_SECTORS << 9) + 0x1000))) { - /* This is a ZDI image. */ - size -= 0x1000; - dev->drv->base = 0x1000; - } else - dev->drv->base = 0; - - if (dev->drv->is_250) { - if ((size != (ZIP_SECTORS_250 << 9)) && (size != (ZIP_SECTORS << 9))) { - DEBUG("File is incorrect size for a ZIP image\nMust be exactly %i or %i bytes\n", - ZIP_SECTORS_250 << 9, ZIP_SECTORS << 9); - fclose(dev->drv->f); - dev->drv->f = NULL; - dev->drv->medium_size = 0; - ui_zip_eject(dev->id); /* Make sure the host OS knows we've rejected (and ejected) the image. */ - return 0; - } - } else { - if (size != (ZIP_SECTORS << 9)) { - DEBUG("File is incorrect size for a ZIP image\nMust be exactly %i bytes\n", - ZIP_SECTORS << 9); - fclose(dev->drv->f); - dev->drv->f = NULL; - dev->drv->medium_size = 0; - ui_zip_eject(dev->id); /* Make sure the host OS knows we've rejected (and ejected) the image. */ - return 0; - } - } - - dev->drv->medium_size = size >> 9; - - fseek(dev->drv->f, dev->drv->base, SEEK_SET); - - memcpy(dev->drv->image_path, fn, sizeof(dev->drv->image_path)); - - dev->drv->read_only = read_only; - - return 1; - } - - return 0; -} - - -void -zip_disk_reload(zip_t *dev) -{ - int ret = 0; - - if (wcslen(dev->drv->prev_image_path) == 0) - return; - else - ret = zip_load(dev, dev->drv->prev_image_path); - - if (ret) - dev->unit_attention = 1; -} - - -void -zip_disk_close(zip_t *dev) -{ - if (dev->drv->f) { - fclose(dev->drv->f); - dev->drv->f = NULL; - - memcpy(dev->drv->prev_image_path, dev->drv->image_path, sizeof(dev->drv->prev_image_path)); - memset(dev->drv->image_path, 0, sizeof(dev->drv->image_path)); - - dev->drv->medium_size = 0; - } -} - - static void set_callback(zip_t *dev) { @@ -636,14 +530,18 @@ current_mode(zip_t *dev) { if (!supports_pio(dev) && !supports_dma(dev)) return 0; + if (supports_pio(dev) && !supports_dma(dev)) { DEBUG("ZIP %i: Drive does not support DMA, setting to PIO\n", dev->id); return 1; } + if (!supports_pio(dev) && supports_dma(dev)) return 2; + if (supports_pio(dev) && supports_dma(dev)) { - DEBUG("ZIP %i: Drive supports both, setting to %s\n", dev->id, (dev->features & 1) ? "DMA" : "PIO"); + DEBUG("ZIP %i: Drive supports both, setting to %s\n", + dev->id, (dev->features & 1) ? "DMA" : "PIO"); return (dev->features & 1) ? 2 : 1; } @@ -655,7 +553,7 @@ current_mode(zip_t *dev) static int err_stat_to_scsi(void *p) { - zip_t *dev = (zip_t *) p; + zip_t *dev = (zip_t *)p; if (dev->status & ERR_STAT) return SCSI_STATUS_CHECK_CONDITION; @@ -665,8 +563,8 @@ err_stat_to_scsi(void *p) /* Translates ATAPI phase (DRQ, I/O, C/D) to SCSI phase (MSG, C/D, I/O). */ -int -zip_atapi_phase_to_scsi(zip_t *dev) +static int +atapi_phase_to_scsi(zip_t *dev) { if (dev->status & 8) { switch (dev->phase & 3) { @@ -694,38 +592,21 @@ static void mode_sense_load(zip_t *dev) { wchar_t temp[512]; + const mode_sense_pages_t *ptr; FILE *fp; - int i; - memset(&dev->ms_pages_saved, 0, sizeof(mode_sense_pages_t)); - - for (i = 0; i < 0x3f; i++) { - if (dev->drv->is_250) { - if (mode_sense_pages_default250.pages[i][1] != 0) { - if (zip_drives[dev->id].bus_type == ZIP_BUS_SCSI) { - memcpy(dev->ms_pages_saved.pages[i], - mode_sense_pages_default250_scsi.pages[i], - mode_sense_pages_default250_scsi.pages[i][1] + 2); - } else { - memcpy(dev->ms_pages_saved.pages[i], - mode_sense_pages_default250.pages[i], - mode_sense_pages_default250.pages[i][1] + 2); - } - } - } else { - if (mode_sense_pages_default.pages[i][1] != 0) { - if (dev->drv->bus_type == ZIP_BUS_SCSI) { - memcpy(dev->ms_pages_saved.pages[i], - mode_sense_pages_default_scsi.pages[i], - mode_sense_pages_default_scsi.pages[i][1] + 2); - } else { - memcpy(dev->ms_pages_saved.pages[i], - mode_sense_pages_default.pages[i], - mode_sense_pages_default.pages[i][1] + 2); - } - } - } + if (dev->drv->is_250) { + if (zip_drives[dev->id].bus_type == ZIP_BUS_SCSI) + ptr = &mode_sense_pages_default250_scsi; + else + ptr = &mode_sense_pages_default250; + } else { + if (zip_drives[dev->id].bus_type == ZIP_BUS_SCSI) + ptr = &mode_sense_pages_default_scsi; + else + ptr = &mode_sense_pages_default; } + memcpy(&dev->ms_pages_saved, ptr, sizeof(mode_sense_pages_t)); memset(temp, 0, sizeof(temp)); if (dev->drv->bus_type == ZIP_BUS_SCSI) @@ -782,6 +663,7 @@ read_capacity(void *p, uint8_t *cdb, uint8_t *buffer, uint32_t *len) buffer[2] = (size >> 8) & 0xff; buffer[3] = size & 0xff; buffer[6] = 2; /* 512 = 0x0200 */ + *len = 8; return 1; @@ -942,7 +824,7 @@ command_common(zip_t *dev) dev->phase = 1; dev->pos = 0; if (dev->packet_status == PHASE_COMPLETE) { - zip_callback((void *) dev); + do_callback((void *) dev); dev->callback = 0LL; } else { if (dev->drv->bus_type == ZIP_BUS_SCSI) { @@ -1246,13 +1128,6 @@ zip_blocks(zip_t *dev, int32_t *len, int first_batch, int out) } -void -zip_insert(zip_t *dev) -{ - dev->unit_attention = 1; -} - - static int pre_execution_check(zip_t *dev, uint8_t *cdb) { @@ -1333,7 +1208,7 @@ pre_execution_check(zip_t *dev, uint8_t *cdb) static void -zip_seek(zip_t *dev, uint32_t pos) +do_seek(zip_t *dev, uint32_t pos) { DBGLOG(1, "ZIP %i: Seek %08X\n", dev->id, pos); dev->sector_pos = pos; @@ -1341,19 +1216,19 @@ zip_seek(zip_t *dev, uint32_t pos) static void -zip_rezero(zip_t *dev) +do_rezero(zip_t *dev) { dev->sector_pos = dev->sector_len = 0; - zip_seek(dev, 0); + do_seek(dev, 0); } -void -zip_reset(void *p) +static void +do_reset(void *p) { zip_t *dev = (zip_t *)p; - zip_rezero(dev); + do_rezero(dev); dev->status = 0; dev->callback = 0LL; @@ -1462,7 +1337,7 @@ buf_free(zip_t *dev) static void -zip_command(void *p, uint8_t *cdb) +do_command(void *p, uint8_t *cdb) { zip_t *dev = (zip_t *)p; int pos = 0, block_desc = 0; @@ -1564,7 +1439,7 @@ zip_command(void *p, uint8_t *cdb) case GPCMD_REZERO_UNIT: dev->sector_pos = dev->sector_len = 0; - zip_seek(dev, 0); + do_seek(dev, 0); set_phase(dev, SCSI_PHASE_STATUS); break; @@ -2037,7 +1912,7 @@ atapi_out: pos = (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5]; break; } - zip_seek(dev, pos); + do_seek(dev, pos); command_complete(dev); break; @@ -2143,7 +2018,7 @@ atapi_out: DBGLOG(1, "ZIP %i: Phase: %02X, request length: %i\n", dev->id, dev->phase, dev->request_length); - if (zip_atapi_phase_to_scsi(dev) == SCSI_PHASE_STATUS) + if (atapi_phase_to_scsi(dev) == SCSI_PHASE_STATUS) buf_free(dev); } @@ -2319,7 +2194,7 @@ pio_request(zip_t *dev, uint8_t out) dev->status = BUSY_STAT; dev->phase = 1; - zip_callback(dev); + do_callback(dev); dev->callback = 0LL; set_callback(dev); @@ -2480,7 +2355,7 @@ write_to_dma(zip_t *dev) static void -zip_callback(void *p) +do_callback(void *p) { zip_t *dev = (zip_t *)p; int ret; @@ -2497,7 +2372,7 @@ zip_callback(void *p) DEBUG("ZIP %i: PHASE_COMMAND\n", dev->id); dev->status = BUSY_STAT | (dev->status & ERR_STAT); memcpy(dev->atapi_cdb, dev->buffer, 12); - zip_command(dev, dev->atapi_cdb); + do_command(dev, dev->atapi_cdb); return; case PHASE_COMPLETE: @@ -2678,22 +2553,13 @@ packet_write(void *p, uint32_t val, int length) dev->status = BUSY_STAT; dev->packet_status = PHASE_COMMAND; timer_process(); - zip_callback((void *) dev); + do_callback((void *) dev); timer_update_outstanding(); } } } -/* Peform a master init on the entire module. */ -void -zip_global_init(void) -{ - /* Clear the global data. */ - memset(zip_drives, 0x00, sizeof(zip_drives)); -} - - static void zip_100_identify(ide_t *ide) { @@ -2769,7 +2635,7 @@ get_timings(int ide_has_dma, int type) static void -zip_identify(void *p, int ide_has_dma) +do_identify(void *p, int ide_has_dma) { ide_t *ide = (ide_t *)p; zip_t *zip = (zip_t *)ide->p; @@ -2789,7 +2655,7 @@ zip_identify(void *p, int ide_has_dma) static void -zip_init(zip_t *dev) +do_init(zip_t *dev) { dev->requested_blocks = 1; dev->sense[0] = 0xf0; @@ -2800,13 +2666,15 @@ zip_init(zip_t *dev) dev->drv->bus_mode |= 2; if (dev->drv->bus_type < ZIP_BUS_SCSI) dev->drv->bus_mode |= 1; - DEBUG("ZIP %i: Bus type %i, bus mode %i\n", dev->id, dev->drv->bus_type, dev->drv->bus_mode); - if (dev->drv->bus_type < ZIP_BUS_SCSI) + DEBUG("ZIP %i: Bus type %i, bus mode %i\n", + dev->id, dev->drv->bus_type, dev->drv->bus_mode); + if (dev->drv->bus_type == ZIP_BUS_ATAPI) set_signature(dev); dev->status = READY_STAT | DSC_STAT; dev->pos = 0; dev->packet_status = 0xff; - dev->sense[2] = dev->sense[12] = dev->sense[13] = dev->unit_attention = 0; + dev->sense[2] = dev->sense[12] = dev->sense[13] = 0; + dev->unit_attention = 0; } @@ -2820,22 +2688,23 @@ drive_reset(int c) dev = (zip_t *)zip_drives[c].priv; if (dev == NULL) { dev = (zip_t *)mem_alloc(sizeof(zip_t)); - memset(dev, 0x00, sizeof(zip_t)); zip_drives[c].priv = dev; } + memset(dev, 0x00, sizeof(zip_t)); dev->id = c; dev->drv = &zip_drives[c]; switch (zip_drives[c].bus_type) { case ZIP_BUS_SCSI: - sd = &scsi_devices[zip_drives[c].bus_id.scsi.id][zip_drives[c].bus_id.scsi.lun]; +pclog(0,"ZIP: attaching to SCSI device %d:%d\n", dev->drv->bus_id.scsi.id, dev->drv->bus_id.scsi.lun); + sd = &scsi_devices[dev->drv->bus_id.scsi.id][dev->drv->bus_id.scsi.lun]; sd->p = dev; - sd->command = zip_command; - sd->callback = zip_callback; + sd->command = do_command; + sd->callback = do_callback; sd->err_stat_to_scsi = err_stat_to_scsi; sd->request_sense = request_sense_scsi; - sd->reset = zip_reset; + sd->reset = do_reset; sd->read_capacity = read_capacity; sd->type = SCSI_REMOVABLE_DISK; @@ -2844,7 +2713,8 @@ drive_reset(int c) break; case ZIP_BUS_ATAPI: - id = ide_drives[zip_drives[c].bus_id.ide_channel]; +pclog(0,"ZIP: attaching to IDE device %d\n", dev->drv->bus_id.ide_channel); + id = ide_drives[dev->drv->bus_id.ide_channel]; /* * If the IDE channel is initialized, we attach to it, @@ -2856,13 +2726,13 @@ drive_reset(int c) id->p = dev; id->get_max = get_max; id->get_timings = get_timings; - id->identify = zip_identify; + id->identify = do_identify; id->set_signature = set_signature; id->packet_write = packet_write; id->packet_read = packet_read; id->stop = NULL; - id->packet_callback = zip_callback; - id->device_reset = zip_reset; + id->packet_callback = do_callback; + id->device_reset = do_reset; id->interrupt_drq = 1; ide_atapi_attach(id); @@ -2874,6 +2744,15 @@ drive_reset(int c) } +/* Peform a master init on the entire module. */ +void +zip_global_init(void) +{ + /* Clear the global data. */ + memset(zip_drives, 0x00, sizeof(zip_drives)); +} + + void zip_hard_reset(void) { @@ -2882,13 +2761,13 @@ zip_hard_reset(void) for (c = 0; c < ZIP_NUM; c++) { if ((zip_drives[c].bus_type != ZIP_BUS_ATAPI) && - (zip_drives[c].bus_type == ZIP_BUS_SCSI)) continue; + (zip_drives[c].bus_type != ZIP_BUS_SCSI)) continue; DEBUG("ZIP hard_reset drive=%d\n", c); /* Ignore any SCSI ZIP drive that has an out of range ID. */ if ((zip_drives[c].bus_type == ZIP_BUS_SCSI) && - (zip_drives[c].bus_id.scsi.id > SCSI_ID_MAX)) continue; + (zip_drives[c].bus_id.scsi.id >= SCSI_ID_MAX)) continue; /* Ignore any ATAPI ZIP drive that has an out of range IDE channel. */ if ((zip_drives[c].bus_type == ZIP_BUS_ATAPI) && @@ -2898,7 +2777,7 @@ zip_hard_reset(void) dev = (zip_t *)zip_drives[c].priv; - zip_init(dev); + do_init(dev); if (wcslen(dev->drv->image_path)) zip_load(dev, dev->drv->image_path); @@ -2935,7 +2814,7 @@ zip_reset_bus(int bus) for (i = 0; i < ZIP_NUM; i++) { if ((zip_drives[i].bus_type == bus) && zip_drives[i].priv) - zip_reset(zip_drives[i].priv); + do_reset(zip_drives[i].priv); } } @@ -2980,3 +2859,96 @@ zip_bus_to_string(int bus) return(ret); } + + +void +zip_disk_close(zip_t *dev) +{ + if (dev->drv->f) { + fclose(dev->drv->f); + dev->drv->f = NULL; + + dev->drv->medium_size = 0; + } +} + + +int +zip_load(zip_t *dev, const wchar_t *fn) +{ + int read_only = dev->drv->ui_writeprot; + int size = 0; + + dev->drv->f = plat_fopen(fn, dev->drv->ui_writeprot ? L"rb" : L"rb+"); + if (!dev->drv->ui_writeprot && !dev->drv->f) { + dev->drv->f = plat_fopen(fn, L"rb"); + read_only = 1; + } + if (dev->drv->f) { + fseek(dev->drv->f, 0, SEEK_END); + size = ftell(dev->drv->f); + + if ((size == ((ZIP_SECTORS_250 << 9) + 0x1000)) || (size == ((ZIP_SECTORS << 9) + 0x1000))) { + /* This is a ZDI image. */ + size -= 0x1000; + dev->drv->base = 0x1000; + } else + dev->drv->base = 0; + + if (dev->drv->is_250) { + if ((size != (ZIP_SECTORS_250 << 9)) && (size != (ZIP_SECTORS << 9))) { + DEBUG("File is incorrect size for a ZIP image\nMust be exactly %i or %i bytes\n", + ZIP_SECTORS_250 << 9, ZIP_SECTORS << 9); + fclose(dev->drv->f); + dev->drv->f = NULL; + dev->drv->medium_size = 0; + ui_zip_eject(dev->id); /* Make sure the host OS knows we've rejected (and ejected) the image. */ + return 0; + } + } else { + if (size != (ZIP_SECTORS << 9)) { + DEBUG("File is incorrect size for a ZIP image\nMust be exactly %i bytes\n", + ZIP_SECTORS << 9); + fclose(dev->drv->f); + dev->drv->f = NULL; + dev->drv->medium_size = 0; + ui_zip_eject(dev->id); /* Make sure the host OS knows we've rejected (and ejected) the image. */ + return 0; + } + } + + dev->drv->medium_size = size >> 9; + + fseek(dev->drv->f, dev->drv->base, SEEK_SET); + + memcpy(dev->drv->image_path, fn, sizeof(dev->drv->image_path)); + + dev->drv->read_only = read_only; + + return 1; + } + + return 0; +} + + +void +zip_disk_reload(zip_t *dev) +{ + int ret = 0; + + if (wcslen(dev->drv->prev_image_path) == 0) + return; + else + ret = zip_load(dev, dev->drv->prev_image_path); + + if (ret) + dev->unit_attention = 1; +} + + +void +zip_insert(zip_t *dev) +{ + dev->unit_attention = 1; +} diff --git a/src/devices/disk/zip.h b/src/devices/disk/zip.h index ec7aef1..044b158 100644 --- a/src/devices/disk/zip.h +++ b/src/devices/disk/zip.h @@ -9,7 +9,7 @@ * Implementation of the Iomega ZIP drive with SCSI(-like) * commands, for both ATAPI and SCSI usage. * - * Version: @(#)zip.h 1.0.11 2018/10/26 + * Version: @(#)zip.h 1.0.12 2018/10/26 * * Author: Miran Grca, * @@ -134,7 +134,6 @@ extern void zip_reset_bus(int bus); extern int zip_string_to_bus(const char *str); extern const char *zip_bus_to_string(int bus); -extern void zip_reset(void *p); extern int zip_load(zip_t *dev, const wchar_t *fn); extern void zip_close(void); diff --git a/src/devices/scsi/scsi_cdrom.c b/src/devices/scsi/scsi_cdrom.c index 4259f20..1907125 100644 --- a/src/devices/scsi/scsi_cdrom.c +++ b/src/devices/scsi/scsi_cdrom.c @@ -8,7 +8,7 @@ * * Emulation of SCSI (and ATAPI) CD-ROM drives. * - * Version: @(#)scsi_cdrom.c 1.0.9 2018/10/25 + * Version: @(#)scsi_cdrom.c 1.0.10 2018/10/27 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -334,12 +334,8 @@ static const mode_sense_pages_t mode_sense_pages_changeable = { { GPMODE_CAPABILITIES_PAGE, 0x12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } } }; -uint8_t scsi_cdrom_read_capacity_cdb[12] = {0x25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - -static void command_complete(scsi_cdrom_t *dev); -static void mode_sense_load(scsi_cdrom_t *dev); -static void scsi_cdrom_callback(void *p); +static void do_callback(void *p); #ifdef _LOGGING @@ -464,33 +460,25 @@ static void mode_sense_load(scsi_cdrom_t *dev) { wchar_t temp[512]; + const mode_sense_pages_t *ptr; FILE *fp; - int i; - memset(&dev->ms_pages_saved, 0, sizeof(mode_sense_pages_t)); - for (i = 0; i < 0x3f; i++) { - if (mode_sense_pages_default.pages[i][1] != 0) { - if (dev->drv->bus_type == CDROM_BUS_SCSI) - memcpy(dev->ms_pages_saved.pages[i], - mode_sense_pages_default_scsi.pages[i], - mode_sense_pages_default_scsi.pages[i][1] + 2); - else - memcpy(dev->ms_pages_saved.pages[i], - mode_sense_pages_default.pages[i], - mode_sense_pages_default.pages[i][1] + 2); - } - } memset(temp, 0, sizeof(temp)); - if (dev->drv->bus_type == CDROM_BUS_SCSI) + if (dev->drv->bus_type == CDROM_BUS_SCSI) { swprintf(temp, sizeof_w(temp), L"scsi_cdrom_%02i_mode_sense_bin", dev->id); - else + ptr = &mode_sense_pages_default_scsi; + } else { swprintf(temp, sizeof_w(temp), L"cdrom_%02i_mode_sense_bin", dev->id); + ptr = &mode_sense_pages_default; + } + + memcpy(&dev->ms_pages_saved, ptr, sizeof(mode_sense_pages_t)); fp = plat_fopen(nvr_path(temp), L"rb"); if (fp != NULL) { - (void)fread(dev->ms_pages_saved.pages[GPMODE_CDROM_AUDIO_PAGE], + (void)fread(&dev->ms_pages_saved.pages[GPMODE_CDROM_AUDIO_PAGE], 1, 0x10, fp); (void)fclose(fp); } @@ -513,7 +501,7 @@ mode_sense_save(scsi_cdrom_t *dev) fp = plat_fopen(nvr_path(temp), L"wb"); if (fp != NULL) { - (void)fwrite(dev->ms_pages_saved.pages[GPMODE_CDROM_AUDIO_PAGE], + (void)fwrite(&dev->ms_pages_saved.pages[GPMODE_CDROM_AUDIO_PAGE], 1, 0x10, fp); (void)fclose(fp); } @@ -536,6 +524,7 @@ read_capacity(void *priv, uint8_t *cdb, uint8_t *buffer, uint32_t *len) buffer[2] = (size >> 8) & 0xff; buffer[3] = size & 0xff; buffer[6] = 8; /* 2048 = 0x0800 */ + *len = 8; return 1; @@ -716,7 +705,7 @@ command_common(scsi_cdrom_t *dev) dev->id, cdrom_speeds[dev->drv->cur_speed].speed); if (dev->packet_status == PHASE_COMPLETE) { - scsi_cdrom_callback(dev); + do_callback(dev); dev->callback = 0LL; } else { switch(dev->current_cdb[0]) { @@ -1331,7 +1320,7 @@ read_dvd_structure(scsi_cdrom_t *dev, int format, const uint8_t *packet, uint8_t static void -scsi_cdrom_insert(void *p) +do_insert(void *p) { scsi_cdrom_t *dev = (scsi_cdrom_t *)p; @@ -1440,7 +1429,7 @@ skip_ready_check: static void -scsi_cdrom_rezero(scsi_cdrom_t *dev) +do_rezero(scsi_cdrom_t *dev) { dev->sector_pos = dev->sector_len = 0; @@ -1449,14 +1438,14 @@ scsi_cdrom_rezero(scsi_cdrom_t *dev) static void -scsi_cdrom_reset(void *p) +do_reset(void *p) { scsi_cdrom_t *dev = (scsi_cdrom_t *) p; if (dev == NULL) return; - scsi_cdrom_rezero(dev); + do_rezero(dev); dev->status = 0; dev->callback = 0LL; @@ -1516,7 +1505,7 @@ request_sense(scsi_cdrom_t *dev, uint8_t *buffer, uint8_t alloc_length) static void -request_sense_for_scsi(void *p, uint8_t *buffer, uint8_t alloc_length) +request_sense_scsi(void *p, uint8_t *buffer, uint8_t alloc_length) { scsi_cdrom_t *dev = (scsi_cdrom_t *)p; int ready = 0; @@ -1571,8 +1560,8 @@ buf_free(scsi_cdrom_t *dev) } -void -scsi_cdrom_command(void *p, uint8_t *cdb) +static void +do_command(void *p, uint8_t *cdb) { scsi_cdrom_t *dev = (scsi_cdrom_t *) p; int len, max_len, used_len, alloc_length, msf; @@ -2571,7 +2560,8 @@ atapi_out: break; } - DBGLOG(1, "CD-ROM %i: Phase: %02X, request length: %i\n", dev->phase, dev->request_length); + DBGLOG(1, "CD-ROM %i: Phase: %02X, request length: %i\n", + dev->phase, dev->request_length); if (atapi_phase_to_scsi(dev) == SCSI_PHASE_STATUS) buf_free(dev); @@ -2702,7 +2692,7 @@ pio_request(scsi_cdrom_t *dev, uint8_t out) dev->status = BUSY_STAT; dev->phase = 1; - scsi_cdrom_callback(dev); + do_callback(dev); dev->callback = 0LL; set_callback(dev); @@ -2745,7 +2735,8 @@ read_from_scsi_dma(uint8_t scsi_id, uint8_t scsi_lun) if (dev == NULL) return 0; - DEBUG("Reading from SCSI DMA: SCSI ID %02X, init length %i\n", scsi_id, *BufLen); + DEBUG("Reading from SCSI DMA: SCSI ID %02X, init length %i\n", + scsi_id, *BufLen); memcpy(dev->buffer, scsi_devices[scsi_id][scsi_lun].cmd_buffer, *BufLen); return 1; @@ -2858,7 +2849,7 @@ write_to_dma(scsi_cdrom_t *dev) static void -scsi_cdrom_callback(void *priv) +do_callback(void *priv) { scsi_cdrom_t *dev = (scsi_cdrom_t *)priv; int ret; @@ -2875,7 +2866,7 @@ scsi_cdrom_callback(void *priv) DEBUG("CD-ROM %i: PHASE_COMMAND\n", dev->id); dev->status = BUSY_STAT | (dev->status & ERR_STAT); memcpy(dev->atapi_cdb, dev->buffer, 12); - scsi_cdrom_command(dev, dev->atapi_cdb); + do_command(dev, dev->atapi_cdb); return; case PHASE_COMPLETE: @@ -3059,7 +3050,7 @@ packet_write(void *priv, uint32_t val, int length) dev->status = BUSY_STAT; dev->packet_status = PHASE_COMMAND; timer_process(); - scsi_cdrom_callback(dev); + do_callback(dev); timer_update_outstanding(); } } @@ -3067,7 +3058,7 @@ packet_write(void *priv, uint32_t val, int length) static void -scsi_cdrom_close(void *priv) +do_close(void *priv) { scsi_cdrom_t *dev = (scsi_cdrom_t *)priv; @@ -3077,7 +3068,7 @@ scsi_cdrom_close(void *priv) static void -scsi_cdrom_stop(void *priv) +do_stop(void *priv) { scsi_cdrom_t *dev = (scsi_cdrom_t *)priv; @@ -3150,7 +3141,7 @@ get_timings(int ide_has_dma, int type) * maybe use a new function cdrom_set_ident() for that? --FvK */ static void -scsi_cdrom_identify(void *priv, int ide_has_dma) +do_identify(void *priv, int ide_has_dma) { ide_t *ide = (ide_t *)priv; #ifdef _LOGGING @@ -3184,10 +3175,10 @@ scsi_cdrom_identify(void *priv, int ide_has_dma) static void -scsi_cdrom_init(scsi_cdrom_t *dev) +do_init(scsi_cdrom_t *dev) { /* Do a reset (which will also rezero it). */ - scsi_cdrom_reset(dev); + do_reset(dev); /* Configure the drive. */ dev->requested_blocks = 1; @@ -3241,23 +3232,23 @@ scsi_cdrom_drive_reset(int c) dev->drv = drv; /* Link in our local methods. */ - drv->insert = scsi_cdrom_insert; + drv->insert = do_insert; drv->get_volume = get_volume; drv->get_channel = get_channel; - drv->close = scsi_cdrom_close; + drv->close = do_close; - scsi_cdrom_init(dev); + do_init(dev); if (drv->bus_type == CDROM_BUS_SCSI) { /* SCSI CD-ROM, attach to the SCSI bus. */ sd = &scsi_devices[drv->bus_id.scsi.id][drv->bus_id.scsi.lun]; sd->p = dev; - sd->command = scsi_cdrom_command; - sd->callback = scsi_cdrom_callback; + sd->command = do_command; + sd->callback = do_callback; sd->err_stat_to_scsi = err_stat_to_scsi; - sd->request_sense = request_sense_for_scsi; - sd->reset = scsi_cdrom_reset; + sd->request_sense = request_sense_scsi; + sd->reset = do_reset; sd->read_capacity = read_capacity; sd->type = SCSI_REMOVABLE_CDROM; @@ -3273,13 +3264,13 @@ scsi_cdrom_drive_reset(int c) id->p = dev; id->get_max = get_max; id->get_timings = get_timings; - id->identify = scsi_cdrom_identify; + id->identify = do_identify; id->set_signature = set_signature; id->packet_write = packet_write; id->packet_read = packet_read; - id->stop = scsi_cdrom_stop; - id->packet_callback = scsi_cdrom_callback; - id->device_reset = scsi_cdrom_reset; + id->stop = do_stop; + id->packet_callback = do_callback; + id->device_reset = do_reset; id->interrupt_drq = 0; ide_atapi_attach(id); diff --git a/src/devices/scsi/scsi_disk.c b/src/devices/scsi/scsi_disk.c index 9aaa9f6..9bada9c 100644 --- a/src/devices/scsi/scsi_disk.c +++ b/src/devices/scsi/scsi_disk.c @@ -8,7 +8,7 @@ * * Emulation of SCSI fixed disks. * - * Version: @(#)scsi_disk.c 1.0.19 2018/10/25 + * Version: @(#)scsi_disk.c 1.0.21 2018/10/27 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -70,14 +70,9 @@ #define MAX_BLOCKS_AT_ONCE 340 -#define scsi_disk_sense_error dev->sense[0] -#define scsi_disk_sense_key dev->sense[2] -#define scsi_disk_asc dev->sense[12] -#define scsi_disk_ascq dev->sense[13] - /* Table of all SCSI commands and their flags, needed for the new disc change / not ready handler. */ -const uint8_t scsi_disk_command_flags[0x100] = { +static const uint8_t command_flags[0x100] = { IMPLEMENTED | CHECK_READY | NONDATA, /* 0x00 */ IMPLEMENTED | ALLOW_UA | NONDATA | SCSI_ONLY, /* 0x01 */ 0, @@ -140,26 +135,26 @@ const uint8_t scsi_disk_command_flags[0x100] = { }; -uint64_t scsi_disk_mode_sense_page_flags = (GPMODEP_FORMAT_DEVICE_PAGE | - GPMODEP_RIGID_DISK_PAGE | - GPMODEP_UNK_VENDOR_PAGE | - GPMODEP_ALL_PAGES); +static uint64_t mode_sense_page_flags = (GPMODEP_FORMAT_DEVICE_PAGE | + GPMODEP_RIGID_DISK_PAGE | + GPMODEP_UNK_VENDOR_PAGE | + GPMODEP_ALL_PAGES); /* This should be done in a better way but for time being, it's been done this way so it's not as huge and more readable. */ -static const mode_sense_pages_t scsi_disk_mode_sense_pages_default = +static const mode_sense_pages_t mode_sense_pages_default = { { [GPMODE_FORMAT_DEVICE_PAGE] = { GPMODE_FORMAT_DEVICE_PAGE, 0x16, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, [GPMODE_RIGID_DISK_PAGE ] = { GPMODE_RIGID_DISK_PAGE, 0x16, 0, 0x10, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10, 0, 0, 0 }, [GPMODE_UNK_VENDOR_PAGE ] = { 0xB0, 0x16, '8', '6', 'B', 'o', 'x', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' } } }; -static const mode_sense_pages_t scsi_disk_mode_sense_pages_changeable = +static const mode_sense_pages_t mode_sense_pages_changeable = { { [GPMODE_FORMAT_DEVICE_PAGE] = { GPMODE_FORMAT_DEVICE_PAGE, 0x16, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0, 0 }, [GPMODE_RIGID_DISK_PAGE ] = { GPMODE_RIGID_DISK_PAGE, 0x16, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0, 0 }, [GPMODE_UNK_VENDOR_PAGE ] = { 0xB0, 0x16, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } } }; -static void scsi_disk_callback(void *p); +static void do_callback(void *p); #ifdef ENABLE_SCSI_DISK_LOG @@ -186,7 +181,7 @@ scsi_disk_log(int level, const char *fmt, ...) /* Translates ATAPI status (ERR_STAT flag) to SCSI status. */ static int -scsi_disk_err_stat_to_scsi(void *p) +err_stat_to_scsi(void *p) { scsi_disk_t *dev = (scsi_disk_t *)p; @@ -197,59 +192,61 @@ scsi_disk_err_stat_to_scsi(void *p) } -void -scsi_disk_mode_sense_load(scsi_disk_t *dev) +static void +mode_sense_load(scsi_disk_t *dev) { - wchar_t file_name[512]; - FILE *f; - int i; + wchar_t temp[512]; + const mode_sense_pages_t *ptr; + FILE *fp; - memset(&dev->ms_pages_saved, 0, sizeof(mode_sense_pages_t)); - for (i = 0; i < 0x3f; i++) { - if (scsi_disk_mode_sense_pages_default.pages[i][1] != 0) { - memcpy(dev->ms_pages_saved.pages[i], scsi_disk_mode_sense_pages_default.pages[i], - scsi_disk_mode_sense_pages_default.pages[i][1] + 2); - } - } - swprintf(file_name, 512, L"scsi_disk_%02i_mode_sense.bin", dev->id); - memset(file_name, 0, 512 * sizeof(wchar_t)); - f = plat_fopen(nvr_path(file_name), L"rb"); - if (f) { - fread(dev->ms_pages_saved.pages[0x30], 1, 0x18, f); - fclose(f); + ptr = &mode_sense_pages_default; + memcpy(&dev->ms_pages_saved, ptr, sizeof(mode_sense_pages_t)); + + memset(temp, 0, sizeof(temp)); + swprintf(temp, sizeof_w(temp), + L"scsi_disk_%02i_mode_sense.bin", dev->id); + + fp = plat_fopen(nvr_path(temp), L"rb"); + if (fp != NULL) { + (void)fread(&dev->ms_pages_saved.pages[0x30], 1, 0x18, fp); + (void)fclose(fp); } } -void -scsi_disk_mode_sense_save(scsi_disk_t *dev) +static void +mode_sense_save(scsi_disk_t *dev) { - wchar_t file_name[512]; - FILE *f; + wchar_t temp[512]; + FILE *fp; - memset(file_name, 0, 512 * sizeof(wchar_t)); - swprintf(file_name, 512, L"scsi_disk_%02i_mode_sense.bin", dev->id); - f = plat_fopen(nvr_path(file_name), L"wb"); - if (f) { - fwrite(dev->ms_pages_saved.pages[0x30], 1, 0x18, f); - fclose(f); + memset(temp, 0, sizeof(temp)); + swprintf(temp, sizeof_w(temp), + L"scsi_disk_%02i_mode_sense.bin", dev->id); + + fp = plat_fopen(nvr_path(temp), L"wb"); + if (fp != NULL) { + (void)fwrite(&dev->ms_pages_saved.pages[0x30], 1, 0x18, fp); + (void)fclose(fp); } } static int -scsi_disk_read_capacity(void *p, uint8_t *cdb, uint8_t *buffer, uint32_t *len) +read_capcity(void *p, uint8_t *cdb, uint8_t *buffer, uint32_t *len) { scsi_disk_t *dev = (scsi_disk_t *)p; - int size = 0; + int size; size = hdd_image_get_last_sector(dev->id); + memset(buffer, 0, 8); buffer[0] = (size >> 24) & 0xff; buffer[1] = (size >> 16) & 0xff; buffer[2] = (size >> 8) & 0xff; buffer[3] = size & 0xff; buffer[6] = 2; /* 512 = 0x0200 */ + *len = 8; return 1; @@ -257,19 +254,21 @@ scsi_disk_read_capacity(void *p, uint8_t *cdb, uint8_t *buffer, uint32_t *len) /*SCSI Mode Sense 6/10*/ -uint8_t -scsi_disk_mode_sense_read(scsi_disk_t *dev, uint8_t page_control, uint8_t page, uint8_t pos) +static uint8_t +mode_sense_read(scsi_disk_t *dev, uint8_t page_control, uint8_t page, uint8_t pos) { switch (page_control) { case 0: case 3: return dev->ms_pages_saved.pages[page][pos]; break; + case 1: - return scsi_disk_mode_sense_pages_changeable.pages[page][pos]; + return mode_sense_pages_changeable.pages[page][pos]; break; + case 2: - return scsi_disk_mode_sense_pages_default.pages[page][pos]; + return mode_sense_pages_default.pages[page][pos]; break; } @@ -277,13 +276,11 @@ scsi_disk_mode_sense_read(scsi_disk_t *dev, uint8_t page_control, uint8_t page, } -uint32_t -scsi_disk_mode_sense(scsi_disk_t *dev, uint8_t *buf, uint32_t pos, uint8_t page, uint8_t block_descriptor_len) +static uint32_t +mode_sense(scsi_disk_t *dev, uint8_t *buf, uint32_t pos, uint8_t page, uint8_t block_descriptor_len) { uint8_t msplen, page_control = (page >> 6) & 3; - - int i = 0, j = 0; - int size = 0; + int i, j, size; page &= 0x3f; @@ -302,13 +299,13 @@ scsi_disk_mode_sense(scsi_disk_t *dev, uint8_t *buf, uint32_t pos, uint8_t page, for (i = 0; i < 0x40; i++) { if ((page == GPMODE_ALL_PAGES) || (page == i)) { - if (scsi_disk_mode_sense_page_flags & (1LL << (uint64_t) page)) { - buf[pos++] = scsi_disk_mode_sense_read(dev, page_control, i, 0); - msplen = scsi_disk_mode_sense_read(dev, page_control, i, 1); + if (mode_sense_page_flags & (1LL << (uint64_t) page)) { + buf[pos++] = mode_sense_read(dev, page_control, i, 0); + msplen = mode_sense_read(dev, page_control, i, 1); buf[pos++] = msplen; DEBUG("SCSI HDD %i: MODE SENSE: Page [%02X] length %i\n", dev->id, i, msplen); for (j = 0; j < msplen; j++) - buf[pos++] = scsi_disk_mode_sense_read(dev, page_control, i, 2 + j); + buf[pos++] = mode_sense_read(dev, page_control, i, 2 + j); } } } @@ -318,12 +315,13 @@ scsi_disk_mode_sense(scsi_disk_t *dev, uint8_t *buf, uint32_t pos, uint8_t page, static void -scsi_disk_command_common(scsi_disk_t *dev) +command_common(scsi_disk_t *dev) { dev->status = BUSY_STAT; dev->phase = 1; + if (dev->packet_status == PHASE_COMPLETE) { - scsi_disk_callback((void *) dev); + do_callback(dev); dev->callback = 0LL; } else dev->callback = -1LL; /* Speed depends on SCSI controller */ @@ -331,61 +329,63 @@ scsi_disk_command_common(scsi_disk_t *dev) static void -scsi_disk_command_complete(scsi_disk_t *dev) +command_complete(scsi_disk_t *dev) { dev->packet_status = PHASE_COMPLETE; - scsi_disk_command_common(dev); + command_common(dev); } static void -scsi_disk_command_read_dma(scsi_disk_t *dev) +command_read_dma(scsi_disk_t *dev) { dev->packet_status = PHASE_DATA_IN_DMA; - scsi_disk_command_common(dev); + command_common(dev); } static void -scsi_disk_command_write_dma(scsi_disk_t *dev) +command_write_dma(scsi_disk_t *dev) { dev->packet_status = PHASE_DATA_OUT_DMA; - scsi_disk_command_common(dev); + command_common(dev); } static void -scsi_disk_data_command_finish(scsi_disk_t *dev, int len, int block_len, int alloc_len, int direction) +data_command_finish(scsi_disk_t *dev, int len, int block_len, int alloc_len, int direction) { DEBUG("SCSI HD %i: Finishing command (%02X): %i, %i, %i, %i, %i\n", dev->id, dev->current_cdb[0], len, block_len, alloc_len, direction, dev->request_length); + if (alloc_len >= 0) { if (alloc_len < len) len = alloc_len; } + if (len == 0) - scsi_disk_command_complete(dev); + command_complete(dev); else { if (direction == 0) - scsi_disk_command_read_dma(dev); + command_read_dma(dev); else - scsi_disk_command_write_dma(dev); + command_write_dma(dev); } } static void -scsi_disk_sense_clear(scsi_disk_t *dev, int command) +sense_clear(scsi_disk_t *dev, int command) { - scsi_disk_sense_key = scsi_disk_asc = scsi_disk_ascq = 0; + dev->sense[2] = dev->sense[12] = dev->sense[13] = 0; } static void -scsi_disk_set_phase(scsi_disk_t *dev, uint8_t phase) +set_phase(scsi_disk_t *dev, uint8_t phase) { if (dev->drv->bus != HDD_BUS_SCSI) return; @@ -395,110 +395,113 @@ scsi_disk_set_phase(scsi_disk_t *dev, uint8_t phase) static void -scsi_disk_cmd_error(scsi_disk_t *dev) +cmd_error(scsi_disk_t *dev) { - scsi_disk_set_phase(dev, SCSI_PHASE_STATUS); + set_phase(dev, SCSI_PHASE_STATUS); - dev->error = ((scsi_disk_sense_key & 0xf) << 4) | ABRT_ERR; + dev->error = ((dev->sense[2] & 0xf) << 4) | ABRT_ERR; dev->status = READY_STAT | ERR_STAT; dev->phase = 3; dev->packet_status = 0x80; dev->callback = 50 * SCSI_TIME; - DEBUG("SCSI HD %i: ERROR: %02X/%02X/%02X\n", dev->id, scsi_disk_sense_key, scsi_disk_asc, scsi_disk_ascq); + + DEBUG("SCSI HD %i: ERROR: %02X/%02X/%02X\n", + dev->id, dev->sense[2], dev->sense[12], dev->sense[13]); } static void -scsi_disk_invalid_lun(scsi_disk_t *dev) +invalid_lun(scsi_disk_t *dev) { - scsi_disk_sense_key = SENSE_ILLEGAL_REQUEST; - scsi_disk_asc = ASC_INV_LUN; - scsi_disk_ascq = 0; - scsi_disk_set_phase(dev, SCSI_PHASE_STATUS); + dev->sense[2] = SENSE_ILLEGAL_REQUEST; + dev->sense[12] = ASC_INV_LUN; + dev->sense[13] = 0; + set_phase(dev, SCSI_PHASE_STATUS); - scsi_disk_cmd_error(dev); + cmd_error(dev); } static void -scsi_disk_illegal_opcode(scsi_disk_t *dev) +illegal_opcode(scsi_disk_t *dev) { - scsi_disk_sense_key = SENSE_ILLEGAL_REQUEST; - scsi_disk_asc = ASC_ILLEGAL_OPCODE; - scsi_disk_ascq = 0; + dev->sense[2] = SENSE_ILLEGAL_REQUEST; + dev->sense[12] = ASC_ILLEGAL_OPCODE; + dev->sense[13] = 0; - scsi_disk_cmd_error(dev); + cmd_error(dev); } static void -scsi_disk_lba_out_of_range(scsi_disk_t *dev) +lba_out_of_range(scsi_disk_t *dev) { - scsi_disk_sense_key = SENSE_ILLEGAL_REQUEST; - scsi_disk_asc = ASC_LBA_OUT_OF_RANGE; - scsi_disk_ascq = 0; + dev->sense[2] = SENSE_ILLEGAL_REQUEST; + dev->sense[12] = ASC_LBA_OUT_OF_RANGE; + dev->sense[13] = 0; - scsi_disk_cmd_error(dev); + cmd_error(dev); } static void -scsi_disk_invalid_field(scsi_disk_t *dev) +invalid_field(scsi_disk_t *dev) { - scsi_disk_sense_key = SENSE_ILLEGAL_REQUEST; - scsi_disk_asc = ASC_INV_FIELD_IN_CMD_PACKET; - scsi_disk_ascq = 0; + dev->sense[2] = SENSE_ILLEGAL_REQUEST; + dev->sense[12] = ASC_INV_FIELD_IN_CMD_PACKET; + dev->sense[13] = 0; - scsi_disk_cmd_error(dev); + cmd_error(dev); dev->status = 0x53; } static void -scsi_disk_invalid_field_pl(scsi_disk_t *dev) +invalid_field_pl(scsi_disk_t *dev) { - scsi_disk_sense_key = SENSE_ILLEGAL_REQUEST; - scsi_disk_asc = ASC_INV_FIELD_IN_PARAMETER_LIST; - scsi_disk_ascq = 0; + dev->sense[2] = SENSE_ILLEGAL_REQUEST; + dev->sense[12] = ASC_INV_FIELD_IN_PARAMETER_LIST; + dev->sense[13] = 0; - scsi_disk_cmd_error(dev); + cmd_error(dev); dev->status = 0x53; } static void -scsi_disk_data_phase_error(scsi_disk_t *dev) +data_phase_error(scsi_disk_t *dev) { - scsi_disk_sense_key = SENSE_ILLEGAL_REQUEST; - scsi_disk_asc = ASC_DATA_PHASE_ERROR; - scsi_disk_ascq = 0; + dev->sense[2] = SENSE_ILLEGAL_REQUEST; + dev->sense[12] = ASC_DATA_PHASE_ERROR; + dev->sense[13] = 0; - scsi_disk_cmd_error(dev); + cmd_error(dev); } static int -scsi_disk_pre_execution_check(scsi_disk_t *dev, uint8_t *cdb) +pre_execution_check(scsi_disk_t *dev, uint8_t *cdb) { if ((cdb[0] != GPCMD_REQUEST_SENSE) && (cdb[1] & 0xe0)) { DEBUG("SCSI DISK %i: Attempting to execute a unknown command targeted at SCSI LUN %i\n", dev->id, ((dev->request_length >> 5) & 7)); - scsi_disk_invalid_lun(dev); + invalid_lun(dev); return 0; } - if (!(scsi_disk_command_flags[cdb[0]] & IMPLEMENTED)) { - DEBUG("SCSI DISK %i: Attempting to execute unknown command %02X\n", dev->id, cdb[0]); - scsi_disk_illegal_opcode(dev); + if (! (command_flags[cdb[0]] & IMPLEMENTED)) { + DEBUG("SCSI DISK %i: Attempting to execute unknown command %02X\n", + dev->id, cdb[0]); + illegal_opcode(dev); return 0; } /* Unless the command is REQUEST SENSE, clear the sense. This will *NOT* the UNIT ATTENTION condition if it's set. */ if (cdb[0] != GPCMD_REQUEST_SENSE) - scsi_disk_sense_clear(dev, cdb[0]); + sense_clear(dev, cdb[0]); DEBUG("SCSI DISK %i: Continuing with command\n", dev->id); @@ -507,7 +510,7 @@ scsi_disk_pre_execution_check(scsi_disk_t *dev, uint8_t *cdb) static void -scsi_disk_seek(scsi_disk_t *dev, uint32_t pos) +disk_seek(scsi_disk_t *dev, uint32_t pos) { DBGLOG(1, "SCSI DISK %i: Seek %08X\n", dev->id, pos); @@ -516,23 +519,23 @@ scsi_disk_seek(scsi_disk_t *dev, uint32_t pos) static void -scsi_disk_rezero(scsi_disk_t *dev) +disk_rezero(scsi_disk_t *dev) { if (dev->id == 0xff) return; dev->sector_pos = dev->sector_len = 0; - scsi_disk_seek(dev, 0); + disk_seek(dev, 0); } static void -scsi_disk_reset(void *p) +disk_reset(void *p) { scsi_disk_t *dev = (scsi_disk_t *)p; - scsi_disk_rezero(dev); + disk_rezero(dev); dev->status = 0; dev->callback = 0; @@ -541,41 +544,43 @@ scsi_disk_reset(void *p) void -scsi_disk_request_sense(scsi_disk_t *dev, uint8_t *buffer, uint8_t alloc_length, int desc) +request_sense(scsi_disk_t *dev, uint8_t *buffer, uint8_t alloc_length, int desc) { /*Will return 18 bytes of 0*/ if (alloc_length != 0) { memset(buffer, 0, alloc_length); - if (!desc) + + if (! desc) memcpy(buffer, dev->sense, alloc_length); else { - buffer[1] = scsi_disk_sense_key; - buffer[2] = scsi_disk_asc; - buffer[3] = scsi_disk_ascq; + buffer[1] = dev->sense[2]; + buffer[2] = dev->sense[12]; + buffer[3] = dev->sense[13]; } } else return; buffer[0] = 0x70; - DEBUG("SCSI DISK %i: Reporting sense: %02X %02X %02X\n", dev->id, buffer[2], buffer[12], buffer[13]); + DEBUG("SCSI DISK %i: Reporting sense: %02X %02X %02X\n", + dev->id, buffer[2], buffer[12], buffer[13]); /* Clear the sense stuff as per the spec. */ - scsi_disk_sense_clear(dev, GPCMD_REQUEST_SENSE); + sense_clear(dev, GPCMD_REQUEST_SENSE); } static void -scsi_disk_request_sense_for_scsi(void *p, uint8_t *buffer, uint8_t alloc_length) +request_sense_scsi(void *p, uint8_t *buffer, uint8_t alloc_length) { scsi_disk_t *dev = (scsi_disk_t *)p; - scsi_disk_request_sense(dev, buffer, alloc_length, 0); + request_sense(dev, buffer, alloc_length, 0); } static void -scsi_disk_set_buf_len(scsi_disk_t *dev, int32_t *BufLen, int32_t *src_len) +set_buf_len(scsi_disk_t *dev, int32_t *BufLen, int32_t *src_len) { if (*BufLen == -1) *BufLen = *src_len; @@ -583,12 +588,13 @@ scsi_disk_set_buf_len(scsi_disk_t *dev, int32_t *BufLen, int32_t *src_len) *BufLen = MIN(*src_len, *BufLen); *src_len = *BufLen; } + DEBUG("SCSI DISK %i: Actual transfer length: %i\n", dev->id, *BufLen); } static void -scsi_disk_command(void *p, uint8_t *cdb) +disk_command(void *p, uint8_t *cdb) { scsi_disk_t *dev = (scsi_disk_t *)p; #ifdef _LOGGING @@ -627,7 +633,7 @@ scsi_disk_command(void *p, uint8_t *cdb) if (cdb[0] != 0) { DEBUG("SCSI DISK %i: Command 0x%02X, Sense Key %02X, Asc %02X, Ascq %02X\n", - dev->id, cdb[0], scsi_disk_sense_key, scsi_disk_asc, scsi_disk_ascq); + dev->id, cdb[0], dev->sense[2], dev->sense[12], dev->sense[13]); DEBUG("SCSI DISK %i: Request length: %04X\n", dev->id, dev->request_length); DEBUG("SCSI DISK %i: CDB: %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", dev->id, @@ -637,30 +643,32 @@ scsi_disk_command(void *p, uint8_t *cdb) dev->sector_len = 0; - scsi_disk_set_phase(dev, SCSI_PHASE_STATUS); + set_phase(dev, SCSI_PHASE_STATUS); /* This handles the Not Ready/Unit Attention check if it has to be handled at this point. */ - if (scsi_disk_pre_execution_check(dev, cdb) == 0) + if (pre_execution_check(dev, cdb) == 0) return; switch (cdb[0]) { case GPCMD_SEND_DIAGNOSTIC: - if (!(cdb[1] & (1 << 2))) { - scsi_disk_invalid_field(dev); + if (! (cdb[1] & (1 << 2))) { + invalid_field(dev); return; } + /*FALLTHROUGH*/ + case GPCMD_SCSI_RESERVE: case GPCMD_SCSI_RELEASE: case GPCMD_TEST_UNIT_READY: case GPCMD_FORMAT_UNIT: - scsi_disk_set_phase(dev, SCSI_PHASE_STATUS); - scsi_disk_command_complete(dev); + set_phase(dev, SCSI_PHASE_STATUS); + command_complete(dev); break; case GPCMD_REZERO_UNIT: dev->sector_pos = dev->sector_len = 0; - scsi_disk_seek(dev, 0); - scsi_disk_set_phase(dev, SCSI_PHASE_STATUS); + disk_seek(dev, 0); + set_phase(dev, SCSI_PHASE_STATUS); break; case GPCMD_REQUEST_SENSE: @@ -668,29 +676,29 @@ scsi_disk_command(void *p, uint8_t *cdb) should forget about the not ready, and report unit attention straight away. */ len = cdb[4]; - if (!len) { - scsi_disk_set_phase(dev, SCSI_PHASE_STATUS); + if (! len) { + set_phase(dev, SCSI_PHASE_STATUS); dev->packet_status = PHASE_COMPLETE; dev->callback = 20 * SCSI_TIME; break; } - scsi_disk_set_buf_len(dev, BufLen, &len); + set_buf_len(dev, BufLen, &len); if (*BufLen < cdb[4]) cdb[4] = *BufLen; len = (cdb[1] & 1) ? 8 : 18; - scsi_disk_set_phase(dev, SCSI_PHASE_DATA_IN); - scsi_disk_data_command_finish(dev, len, len, cdb[4], 0); + set_phase(dev, SCSI_PHASE_DATA_IN); + data_command_finish(dev, len, len, cdb[4], 0); break; case GPCMD_MECHANISM_STATUS: len = (cdb[7] << 16) | (cdb[8] << 8) | cdb[9]; - scsi_disk_set_buf_len(dev, BufLen, &len); - scsi_disk_set_phase(dev, SCSI_PHASE_DATA_IN); - scsi_disk_data_command_finish(dev, 8, 8, len, 0); + set_buf_len(dev, BufLen, &len); + set_phase(dev, SCSI_PHASE_DATA_IN); + data_command_finish(dev, 8, 8, len, 0); break; case GPCMD_READ_6: @@ -701,10 +709,12 @@ scsi_disk_command(void *p, uint8_t *cdb) dev->sector_len = cdb[4]; dev->sector_pos = ((((uint32_t) cdb[1]) & 0x1f) << 16) | (((uint32_t) cdb[2]) << 8) | ((uint32_t) cdb[3]); break; + case GPCMD_READ_10: dev->sector_len = (cdb[7] << 8) | cdb[8]; dev->sector_pos = (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5]; break; + case GPCMD_READ_12: dev->sector_len = (((uint32_t) cdb[6]) << 24) | (((uint32_t) cdb[7]) << 16) | (((uint32_t) cdb[8]) << 8) | ((uint32_t) cdb[9]); dev->sector_pos = (((uint32_t) cdb[2]) << 24) | (((uint32_t) cdb[3]) << 16) | (((uint32_t) cdb[4]) << 8) | ((uint32_t) cdb[5]); @@ -712,12 +722,12 @@ scsi_disk_command(void *p, uint8_t *cdb) } if ((dev->sector_pos > last_sector) || ((dev->sector_pos + dev->sector_len - 1) > last_sector)) { - scsi_disk_lba_out_of_range(dev); + lba_out_of_range(dev); return; } if ((!dev->sector_len) || (*BufLen == 0)) { - scsi_disk_set_phase(dev, SCSI_PHASE_STATUS); + set_phase(dev, SCSI_PHASE_STATUS); DEBUG("SCSI DISK %i: All done - callback set\n", dev); dev->packet_status = PHASE_COMPLETE; dev->callback = 20 * SCSI_TIME; @@ -729,36 +739,38 @@ scsi_disk_command(void *p, uint8_t *cdb) alloc_length = dev->packet_len = max_len << 9; - scsi_disk_set_buf_len(dev, BufLen, &alloc_length); - scsi_disk_set_phase(dev, SCSI_PHASE_DATA_IN); + set_buf_len(dev, BufLen, &alloc_length); + set_phase(dev, SCSI_PHASE_DATA_IN); if (dev->requested_blocks > 1) - scsi_disk_data_command_finish(dev, alloc_length, alloc_length / dev->requested_blocks, alloc_length, 0); + data_command_finish(dev, alloc_length, alloc_length / dev->requested_blocks, alloc_length, 0); else - scsi_disk_data_command_finish(dev, alloc_length, alloc_length, alloc_length, 0); + data_command_finish(dev, alloc_length, alloc_length, alloc_length, 0); return; case GPCMD_VERIFY_6: case GPCMD_VERIFY_10: case GPCMD_VERIFY_12: if (!(cdb[1] & 2)) { - scsi_disk_set_phase(dev, SCSI_PHASE_STATUS); - scsi_disk_command_complete(dev); + set_phase(dev, SCSI_PHASE_STATUS); + command_complete(dev); break; } + /*FALLTHROUGH*/ + case GPCMD_WRITE_6: case GPCMD_WRITE_10: case GPCMD_WRITE_AND_VERIFY_10: case GPCMD_WRITE_12: case GPCMD_WRITE_AND_VERIFY_12: - switch(cdb[0]) - { + switch(cdb[0]) { case GPCMD_VERIFY_6: case GPCMD_WRITE_6: dev->sector_len = cdb[4]; dev->sector_pos = ((((uint32_t) cdb[1]) & 0x1f) << 16) | (((uint32_t) cdb[2]) << 8) | ((uint32_t) cdb[3]); DEBUG("SCSI DISK %i: Length: %i, LBA: %i\n", dev->id, dev->sector_len, dev->sector_pos); break; + case GPCMD_VERIFY_10: case GPCMD_WRITE_10: case GPCMD_WRITE_AND_VERIFY_10: @@ -766,6 +778,7 @@ scsi_disk_command(void *p, uint8_t *cdb) dev->sector_pos = (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5]; DEBUG("SCSI DISK %i: Length: %i, LBA: %i\n", dev->id, dev->sector_len, dev->sector_pos); break; + case GPCMD_VERIFY_12: case GPCMD_WRITE_12: case GPCMD_WRITE_AND_VERIFY_12: @@ -776,12 +789,12 @@ scsi_disk_command(void *p, uint8_t *cdb) if ((dev->sector_pos > last_sector) || ((dev->sector_pos + dev->sector_len - 1) > last_sector)) { - scsi_disk_lba_out_of_range(dev); + lba_out_of_range(dev); return; } if ((!dev->sector_len) || (*BufLen == 0)) { - scsi_disk_set_phase(dev, SCSI_PHASE_STATUS); + set_phase(dev, SCSI_PHASE_STATUS); DEBUG("SCSI DISK %i: All done - callback set\n", dev->id); dev->packet_status = PHASE_COMPLETE; dev->callback = 20 * SCSI_TIME; @@ -793,34 +806,36 @@ scsi_disk_command(void *p, uint8_t *cdb) alloc_length = dev->packet_len = max_len << 9; - scsi_disk_set_buf_len(dev, BufLen, &alloc_length); - scsi_disk_set_phase(dev, SCSI_PHASE_DATA_OUT); + set_buf_len(dev, BufLen, &alloc_length); + set_phase(dev, SCSI_PHASE_DATA_OUT); if (dev->requested_blocks > 1) - scsi_disk_data_command_finish(dev, alloc_length, alloc_length / dev->requested_blocks, alloc_length, 1); + data_command_finish(dev, alloc_length, alloc_length / dev->requested_blocks, alloc_length, 1); else - scsi_disk_data_command_finish(dev, alloc_length, alloc_length, alloc_length, 1); + data_command_finish(dev, alloc_length, alloc_length, alloc_length, 1); return; case GPCMD_WRITE_SAME_10: if ((cdb[1] & 6) == 6) { - scsi_disk_invalid_field(dev); + invalid_field(dev); return; } dev->sector_len = (cdb[7] << 8) | cdb[8]; dev->sector_pos = (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5]; - DEBUG("SCSI DISK %i: Length: %i, LBA: %i\n", dev->id, dev->sector_len, dev->sector_pos); + DEBUG("SCSI DISK %i: Length: %i, LBA: %i\n", + dev->id, dev->sector_len, dev->sector_pos); if ((dev->sector_pos > last_sector) || ((dev->sector_pos + dev->sector_len - 1) > last_sector)) { - scsi_disk_lba_out_of_range(dev); + lba_out_of_range(dev); return; } if ((!dev->sector_len) || (*BufLen == 0)) { - scsi_disk_set_phase(dev, SCSI_PHASE_STATUS); - DEBUG("SCSI DISK %i: All done - callback set\n", dev->id); + set_phase(dev, SCSI_PHASE_STATUS); + DEBUG("SCSI DISK %i: All done - callback set\n", + dev->id); dev->packet_status = PHASE_COMPLETE; dev->callback = 20 * SCSI_TIME; break; @@ -831,18 +846,18 @@ scsi_disk_command(void *p, uint8_t *cdb) alloc_length = dev->packet_len = max_len << 9; - scsi_disk_set_buf_len(dev, BufLen, &alloc_length); - scsi_disk_set_phase(dev, SCSI_PHASE_DATA_OUT); + set_buf_len(dev, BufLen, &alloc_length); + set_phase(dev, SCSI_PHASE_DATA_OUT); if (dev->requested_blocks > 1) - scsi_disk_data_command_finish(dev, alloc_length, alloc_length / dev->requested_blocks, alloc_length, 1); + data_command_finish(dev, alloc_length, alloc_length / dev->requested_blocks, alloc_length, 1); else - scsi_disk_data_command_finish(dev, alloc_length, alloc_length, alloc_length, 1); + data_command_finish(dev, alloc_length, alloc_length, alloc_length, 1); return; case GPCMD_MODE_SENSE_6: case GPCMD_MODE_SENSE_10: - scsi_disk_set_phase(dev, SCSI_PHASE_DATA_IN); + set_phase(dev, SCSI_PHASE_DATA_IN); block_desc = ((cdb[1] >> 3) & 1) ? 0 : 1; @@ -857,7 +872,7 @@ scsi_disk_command(void *p, uint8_t *cdb) memset(dev->temp_buffer, 0, 65536); if (cdb[0] == GPCMD_MODE_SENSE_6) { - len = scsi_disk_mode_sense(dev, dev->temp_buffer, 4, cdb[2], block_desc); + len = mode_sense(dev, dev->temp_buffer, 4, cdb[2], block_desc); if (len > alloc_length) len = alloc_length; dev->temp_buffer[0] = len - 1; @@ -865,7 +880,7 @@ scsi_disk_command(void *p, uint8_t *cdb) if (block_desc) dev->temp_buffer[3] = 8; } else { - len = scsi_disk_mode_sense(dev, dev->temp_buffer, 8, cdb[2], block_desc); + len = mode_sense(dev, dev->temp_buffer, 8, cdb[2], block_desc); if (len > alloc_length) len = alloc_length; dev->temp_buffer[0]=(len - 2) >> 8; @@ -882,25 +897,26 @@ scsi_disk_command(void *p, uint8_t *cdb) else if (len < alloc_length) alloc_length = len; - scsi_disk_set_buf_len(dev, BufLen, &alloc_length); - DEBUG("SCSI DISK %i: Reading mode page: %02X...\n", dev->id, cdb[2]); + set_buf_len(dev, BufLen, &alloc_length); + DEBUG("SCSI DISK %i: Reading mode page: %02X...\n", + dev->id, cdb[2]); - scsi_disk_data_command_finish(dev, len, len, alloc_length, 0); + data_command_finish(dev, len, len, alloc_length, 0); return; case GPCMD_MODE_SELECT_6: case GPCMD_MODE_SELECT_10: - scsi_disk_set_phase(dev, SCSI_PHASE_DATA_OUT); + set_phase(dev, SCSI_PHASE_DATA_OUT); if (cdb[0] == GPCMD_MODE_SELECT_6) len = cdb[4]; else len = (cdb[7] << 8) | cdb[8]; - scsi_disk_set_buf_len(dev, BufLen, &len); + set_buf_len(dev, BufLen, &len); dev->total_length = len; dev->do_page_save = cdb[1] & 1; - scsi_disk_data_command_finish(dev, len, len, len, 1); + data_command_finish(dev, len, len, len, 1); return; case GPCMD_INQUIRY: @@ -909,14 +925,14 @@ scsi_disk_command(void *p, uint8_t *cdb) max_len |= cdb[4]; if ((!max_len) || (*BufLen == 0)) { - scsi_disk_set_phase(dev, SCSI_PHASE_STATUS); + set_phase(dev, SCSI_PHASE_STATUS); DBGLOG(1, "SCSI DISK %i: All done - callback set\n", dev->id); dev->packet_status = PHASE_COMPLETE; dev->callback = 20 * SCSI_TIME; break; } - dev->temp_buffer = malloc(1024); + dev->temp_buffer = mem_alloc(1024); if (cdb[1] & 1) { preamble_len = 4; @@ -933,11 +949,12 @@ scsi_disk_command(void *p, uint8_t *cdb) dev->temp_buffer[idx++] = 0x00; dev->temp_buffer[idx++] = 0x83; break; + case 0x83: if (idx + 24 > max_len) { free(dev->temp_buffer); dev->temp_buffer = NULL; - scsi_disk_data_phase_error(dev); + data_phase_error(dev); return; } @@ -965,7 +982,7 @@ scsi_disk_command(void *p, uint8_t *cdb) DEBUG("INQUIRY: Invalid page: %02X\n", cdb[2]); free(dev->temp_buffer); dev->temp_buffer = NULL; - scsi_disk_invalid_field(dev); + invalid_field(dev); return; } } else { @@ -996,23 +1013,24 @@ atapi_out: dev->temp_buffer[size_idx] = idx - preamble_len; len=idx; - DEBUG("scsi_disk_command(): Inquiry (%08X, %08X)\n", hdbufferb, dev->temp_buffer); + DEBUG("scsi_disk_command(): Inquiry (%08X, %08X)\n", + hdbufferb, dev->temp_buffer); if (len > max_len) len = max_len; - scsi_disk_set_buf_len(dev, BufLen, &len); + set_buf_len(dev, BufLen, &len); if (len > *BufLen) len = *BufLen; - scsi_disk_set_phase(dev, SCSI_PHASE_DATA_IN); - scsi_disk_data_command_finish(dev, len, len, max_len, 0); + set_phase(dev, SCSI_PHASE_DATA_IN); + data_command_finish(dev, len, len, max_len, 0); break; case GPCMD_PREVENT_REMOVAL: - scsi_disk_set_phase(dev, SCSI_PHASE_STATUS); - scsi_disk_command_complete(dev); + set_phase(dev, SCSI_PHASE_STATUS); + command_complete(dev); break; case GPCMD_SEEK_6: @@ -1021,48 +1039,50 @@ atapi_out: case GPCMD_SEEK_6: pos = (cdb[2] << 8) | cdb[3]; break; + case GPCMD_SEEK_10: pos = (cdb[2] << 24) | (cdb[3]<<16) | (cdb[4]<<8) | cdb[5]; break; } - scsi_disk_seek(dev, pos); + disk_seek(dev, pos); - scsi_disk_set_phase(dev, SCSI_PHASE_STATUS); - scsi_disk_command_complete(dev); + set_phase(dev, SCSI_PHASE_STATUS); + command_complete(dev); break; case GPCMD_READ_CDROM_CAPACITY: dev->temp_buffer = (uint8_t *) malloc(8); - if (scsi_disk_read_capacity(dev, dev->current_cdb, dev->temp_buffer, (uint32_t *) &len) == 0) { - scsi_disk_set_phase(dev, SCSI_PHASE_STATUS); + if (read_capcity(dev, dev->current_cdb, dev->temp_buffer, (uint32_t *) &len) == 0) { + set_phase(dev, SCSI_PHASE_STATUS); return; } - scsi_disk_set_buf_len(dev, BufLen, &len); + set_buf_len(dev, BufLen, &len); - scsi_disk_set_phase(dev, SCSI_PHASE_DATA_IN); - scsi_disk_data_command_finish(dev, len, len, len, 0); + set_phase(dev, SCSI_PHASE_DATA_IN); + data_command_finish(dev, len, len, len, 0); break; default: - scsi_disk_illegal_opcode(dev); + illegal_opcode(dev); break; } - DBGLOG(1, "SCSI DISK %i: Phase: %02X, request length: %i\n", dev->id, dev->phase, dev->request_length); + DBGLOG(1, "SCSI DISK %i: Phase: %02X, request length: %i\n", + dev->id, dev->phase, dev->request_length); } static void -scsi_disk_phase_data_in(scsi_disk_t *dev) +phase_data_in(scsi_disk_t *dev) { uint8_t *hdbufferb = scsi_devices[dev->drv->bus_id.scsi.id][dev->drv->bus_id.scsi.lun].cmd_buffer; int32_t *BufLen = &scsi_devices[dev->drv->bus_id.scsi.id][dev->drv->bus_id.scsi.lun].buffer_length; if (!*BufLen) { DEBUG("scsi_disk_phase_data_in(): Buffer length is 0\n"); - scsi_disk_set_phase(dev, SCSI_PHASE_STATUS); + set_phase(dev, SCSI_PHASE_STATUS); return; } @@ -1070,12 +1090,14 @@ scsi_disk_phase_data_in(scsi_disk_t *dev) switch (dev->current_cdb[0]) { case GPCMD_REQUEST_SENSE: DEBUG("SCSI DISK %i: %08X, %08X\n", dev->id, hdbufferb, *BufLen); - scsi_disk_request_sense(dev, hdbufferb, *BufLen, dev->current_cdb[1] & 1); + request_sense(dev, hdbufferb, *BufLen, dev->current_cdb[1] & 1); break; + case GPCMD_MECHANISM_STATUS: memset(hdbufferb, 0, *BufLen); hdbufferb[5] = 1; break; + case GPCMD_READ_6: case GPCMD_READ_10: case GPCMD_READ_12: @@ -1086,6 +1108,7 @@ scsi_disk_phase_data_in(scsi_disk_t *dev) hdd_image_read(dev->id, dev->sector_pos, dev->requested_blocks, hdbufferb); } break; + case GPCMD_MODE_SENSE_6: case GPCMD_MODE_SENSE_10: case GPCMD_INQUIRY: @@ -1098,17 +1121,18 @@ scsi_disk_phase_data_in(scsi_disk_t *dev) hdbufferb[0], hdbufferb[1], hdbufferb[2], hdbufferb[3], hdbufferb[4], hdbufferb[5], hdbufferb[6], hdbufferb[7], hdbufferb[8], hdbufferb[9], hdbufferb[10], hdbufferb[11], hdbufferb[12], hdbufferb[13], hdbufferb[14], hdbufferb[15]); break; + default: fatal("SCSI HDD %i: Bad Command for phase 2 (%02X)\n", dev->id, dev->current_cdb[0]); break; } - scsi_disk_set_phase(dev, SCSI_PHASE_STATUS); + set_phase(dev, SCSI_PHASE_STATUS); } static void -scsi_disk_phase_data_out(scsi_disk_t *dev) +phase_data_out(scsi_disk_t *dev) { uint8_t *hdbufferb = scsi_devices[dev->drv->bus_id.scsi.id][dev->drv->bus_id.scsi.lun].cmd_buffer; int i; @@ -1120,7 +1144,7 @@ scsi_disk_phase_data_out(scsi_disk_t *dev) uint8_t page, page_len; if (!*BufLen) { - scsi_disk_set_phase(dev, SCSI_PHASE_STATUS); + set_phase(dev, SCSI_PHASE_STATUS); return; } @@ -1130,6 +1154,7 @@ scsi_disk_phase_data_out(scsi_disk_t *dev) case GPCMD_VERIFY_10: case GPCMD_VERIFY_12: break; + case GPCMD_WRITE_6: case GPCMD_WRITE_10: case GPCMD_WRITE_AND_VERIFY_10: @@ -1142,6 +1167,7 @@ scsi_disk_phase_data_out(scsi_disk_t *dev) hdd_image_write(dev->id, dev->sector_pos, dev->requested_blocks, hdbufferb); } break; + case GPCMD_WRITE_SAME_10: if (!dev->current_cdb[7] && !dev->current_cdb[8]) last_to_write = last_sector; @@ -1170,6 +1196,7 @@ scsi_disk_phase_data_out(scsi_disk_t *dev) hdd_image_write(dev->id, i, 1, hdbufferb); } break; + case GPCMD_MODE_SELECT_6: case GPCMD_MODE_SELECT_10: if (dev->current_cdb[0] == GPCMD_MODE_SELECT_10) @@ -1195,11 +1222,11 @@ scsi_disk_phase_data_out(scsi_disk_t *dev) pos += 2; - if (!(scsi_disk_mode_sense_page_flags & (1LL << ((uint64_t) page)))) + if (!(mode_sense_page_flags & (1LL << ((uint64_t) page)))) error |= 1; else { for (i = 0; i < page_len; i++) { - ch = scsi_disk_mode_sense_pages_changeable.pages[page][i + 2]; + ch = mode_sense_pages_changeable.pages[page][i + 2]; val = hdbufferb[pos + i]; old_val = dev->ms_pages_saved.pages[page][i + 2]; if (val != old_val) { @@ -1213,29 +1240,30 @@ scsi_disk_phase_data_out(scsi_disk_t *dev) pos += page_len; - val = scsi_disk_mode_sense_pages_default.pages[page][0] & 0x80; + val = mode_sense_pages_default.pages[page][0] & 0x80; if (dev->do_page_save && val) - scsi_disk_mode_sense_save(dev); + mode_sense_save(dev); if (pos >= dev->total_length) break; } if (error) - scsi_disk_invalid_field_pl(dev); + invalid_field_pl(dev); break; + default: fatal("SCSI DISK %i: Bad Command for phase 2 (%02X)\n", dev->id, dev->current_cdb[0]); break; } - scsi_disk_set_phase(dev, SCSI_PHASE_STATUS); + set_phase(dev, SCSI_PHASE_STATUS); } /* If the result is 1, issue an IRQ, otherwise not. */ static void -scsi_disk_callback(void *p) +do_callback(void *p) { scsi_disk_t *dev = (scsi_disk_t *)p; @@ -1245,26 +1273,30 @@ scsi_disk_callback(void *p) dev->phase = 1; dev->status = READY_STAT | DRQ_STAT | (dev->status & ERR_STAT); return; + case PHASE_COMPLETE: DEBUG("SCSI DISK %i: PHASE_COMPLETE\n", dev->id); dev->status = READY_STAT; dev->phase = 3; dev->packet_status = 0xFF; return; + case PHASE_DATA_OUT_DMA: DEBUG("SCSI DISK %i: PHASE_DATA_OUT_DMA\n", dev->id); - scsi_disk_phase_data_out(dev); + phase_data_out(dev); dev->packet_status = PHASE_COMPLETE; dev->status = READY_STAT; dev->phase = 3; return; + case PHASE_DATA_IN_DMA: DEBUG("SCSI DISK %i: PHASE_DATA_IN_DMA\n", dev->id); - scsi_disk_phase_data_in(dev); + phase_data_in(dev); dev->packet_status = PHASE_COMPLETE; dev->status = READY_STAT; dev->phase = 3; return; + case PHASE_ERROR: DEBUG("SCSI DISK %i: PHASE_ERROR\n", dev->id); dev->status = READY_STAT | ERR_STAT; @@ -1287,9 +1319,9 @@ scsi_disk_hard_reset(void) DEBUG("SCSI disk hard_reset drive=%d\n", c); /* Make sure to ignore any SCSI disk that has an out of range ID. */ - if (hdd[c].bus_id.scsi.id > SCSI_ID_MAX) + if (hdd[c].bus_id.scsi.id >= SCSI_ID_MAX) continue; - if (hdd[c].bus_id.scsi.lun > SCSI_LUN_MAX) + if (hdd[c].bus_id.scsi.lun >= SCSI_LUN_MAX) continue; /* Make sure to ignore any SCSI disk whose image file name is empty. */ @@ -1303,8 +1335,8 @@ scsi_disk_hard_reset(void) dev = (scsi_disk_t *)hdd[c].priv; if (dev == NULL) { dev = (scsi_disk_t *)mem_alloc(sizeof(scsi_disk_t)); - memset(dev, 0x00, sizeof(scsi_disk_t)); } + memset(dev, 0x00, sizeof(scsi_disk_t)); dev->id = c; dev->drv = &hdd[c]; @@ -1312,15 +1344,15 @@ scsi_disk_hard_reset(void) sd = &scsi_devices[hdd[c].bus_id.scsi.id][hdd[c].bus_id.scsi.lun]; sd->p = dev; - sd->command = scsi_disk_command; - sd->callback = scsi_disk_callback; - sd->err_stat_to_scsi = scsi_disk_err_stat_to_scsi; - sd->request_sense = scsi_disk_request_sense_for_scsi; - sd->reset = scsi_disk_reset; - sd->read_capacity = scsi_disk_read_capacity; + sd->command = disk_command; + sd->callback = do_callback; + sd->err_stat_to_scsi = err_stat_to_scsi; + sd->request_sense = request_sense_scsi; + sd->reset = disk_reset; + sd->read_capacity = read_capcity; sd->type = SCSI_FIXED_DISK; - scsi_disk_mode_sense_load(dev); + mode_sense_load(dev); DEBUG("SCSI disk %i attached to ID %i LUN %i\n", c, hdd[c].bus_id.scsi.id, hdd[c].bus_id.scsi.lun); diff --git a/src/ui/lang/Extra-PL.txt b/src/ui/lang/Extra-PL.txt new file mode 100644 index 0000000..bae4004 --- /dev/null +++ b/src/ui/lang/Extra-PL.txt @@ -0,0 +1,85 @@ +**** Additional strings for the Installer itself **** +**** (keep the > lines, add translation after : **** + + +> Wybierz język instalatora: +: + +> Pulpit (w sensie: "Ikony Pulpitu") +: + + +> Wykonuję operacje usuwania plików +: + +> Przygotowuję pliki do usunięcia +: + +> Odtwarzam usunięte pliki +: + +> Wypakowywanie plików z archiwum +: + +> Wykonuję usunięcie pliku +: + +> Przygotowywuję plik +: + +> Odtwarzam plik +: + +> Ten pakiet może być uruchomiony tylko z poziomu bootstrappera. +: + + +> Kilka narzędzi linii komend +: + +> Zestaw przykładowych konfiguracji na początek. +: + +> Zwyczajny klon Turbo-XT. +: + +> Oryginalny IBM-PC. +: + +> Nowy model IBM-PC +: + +> Fonty Segoe UI dla Windows XP +: + + +> Dodatkowe pliki tłumaczeń. +: + +> Twoje maszyny wirtualne. +: + +> Pliki runtime dla syntezatora MIDI FluidSynth +: + +> Różne pliki runtime wymagane przez aplikację. +: + +> Obrazy ROM BIOS-ów emulowanych maszyn i urządzeń. +: + +> Pliki runtime wymagane przez renderer SDL2. +: + +> Aplikacja VARCem we własnej osobie +: + +> Umowa Licencyjna +: + +> Instalator [ProductName]. +: + +> Zespół VARCem +: + diff --git a/src/ui/lang/VARCem-PL.str b/src/ui/lang/VARCem-PL.str new file mode 100644 index 0000000..e6c5a3c --- /dev/null +++ b/src/ui/lang/VARCem-PL.str @@ -0,0 +1,401 @@ +/* + * VARCem Virtual ARchaeological Computer EMulator. + * An emulator of (mostly) x86-based PC systems and devices, + * using the ISA,EISA,VLB,MCA and PCI system buses, roughly + * spanning the era between 1981 and 1995. + * + * This file is part of the VARCem Project. + * + * String definitions for "Polish (Poland)" language. + * + * Version: @(#)VARCem-PL.str 1.0.1 2018/10/27 + * + * Authors: Ola Hughson, + * Fred N. van Kempen, + * + * Copyright 2018, Ola Hughson. + * Copyright 2017,2018 Fred N. van Kempen. + * + * Redistribution and use in source and binary forms, with + * or without modification, are permitted provided that the + * following conditions are met: + * + * 1. Redistributions of source code must retain the entire + * above notice, this list of conditions and the following + * disclaimer. + * + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names + * of its contributors may be used to endorse or promote + * products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* Main application strings (2000) - DO NOT TRANSLATE! */ +#define STR_VERSION 1,0,1 +#define STR_AUTHOR "Ola Hughson" +#define STR_EMAIL "ohughson@varcem@gmail.com" +#define STR_NAME "VARCem" +#define STR_TITLE "Virtual ARchaeological Computer EMulator" + + +/* Messagebox classes (2100.) */ +#define STR_2100 "Błąd" +#define STR_2101 "Błąd krytyczny" +#define STR_2102 "Błąd konfiguracji" +#define STR_2103 "Ostrzeżenie" + + +/* System errors (2200.) */ +#define STR_2200 "Nie mogę wczytać Akceleratorów Klawiatury!" +#define STR_2201 "Nie mogę odczytać surowych danych wejścia!" +#define STR_2202 "PCap jest nieustawiony, gdyż nie można go zinicjalizować" +#define STR_2203 "Nie znaleziono urządzeń typu PCap" +#define STR_2204 "Invalid PCap device" +#define STR_2205 "Nie mogę zinicjalizować %s, sprawdź, czy posiadasz bibliotekę '%s' w systemie lub katalogu programu!" + + +/* Application error messages (2300.) */ +#define STR_2300 "Brak pamięci!" +#define STR_2301 "Nie znaleziono poprawnych obrazów pamięci ROM!" +#define STR_2302 "Nie znaleziono poprawnej konfiguracji.\n\nCzy chcesz otworzyć okno Ustawienia, aby ją utworzyć?" +#define STR_2303 "Ustawione %ls:\n\n %s\n\nnie jest dostępne.\n\nCzy chcesz otworzyć okno Ustawienia?" +#define STR_2304 "Wybrane urządzenie renderowania:\n\n %s\n\nnie jest dostępne. Użyć domyślnego?" +#define STR_2305 "Najpierw musisz zapisać ustawienia!" +#define STR_2306 "Nie mogę utworzyć pliku mapy bitowej: %ls" +#define STR_2307 "USB nie jest jeszcze wspierane" + + +/* Application messages (2400.) */ +#define STR_2400 "Czy na pewno chcesz zapisać te ustawienia?\n\n(Może nastąpić restart...)" +#define STR_2401 "Zapisano zmiany, proszę zrestartować emulator!" +#define STR_2402 "Żądane urządzenie:\n\n %s\n\njest obecnie w trakcie opracowywania i może spowodować problemy.\n\nCzy na pewno chcesz je uruchomić?" +#define STR_2403 "Kliknij aby przechwytywać mysz" +#define STR_2404 "Wciśnij F8+F12 aby uwolnić mysz" +#define STR_2405 "Wciśnij F8+F12 lub środkowy przycisk myszki aby ją uwolnić" +#define STR_2406 "Wciśnij CTRL+ALT+PAGE DOWN aby powrócić do trybu okna" + + +/* Misc application strings (2500.) */ +#define STR_2500 "Pliki konfiguracyjne\0*.varc\0Wszystkie pliki\0*.*\0" + + +/* UI: common elements (3000.) */ +#define STR_OK "OK" +#define STR_CANCEL "Poniechaj" +#define STR_YES "Tak" +#define STR_NO "Nie" +#define STR_CONFIGURE "Skonfiguruj" +#define STR_BROWSE "Przeglądaj" + + +/* UI: dialog shared strings (3100.) */ +#define STR_NONE "Żadne" +#define STR_INTERNAL "Wewnętrzny" +#define STR_DISABLED "Niesprawny" +#define STR_ENABLED "Sprawna" +#define STR_OFF "Wyłącz" +#define STR_ON "Włącz" +#define STR_UNLOCK "Unlock" +#define STR_LOCK "Zabezpiecz" +#define STR_TYPE "Typ" +#define STR_FILENAME "Nazwa pliku:" +#define STR_PROGRESS "Postęp:" +#define STR_BUS "Magistrala:" +#define STR_CHANNEL "Kanał:" +#define STR_ID "ID:" +#define STR_LUN "LUN:" +#define STR_INV_NAME "Proszę wpisać poprawną nazwę pliku" +#define STR_IMG_EXIST "Ten obraz istnieje i będzie nadpisany.\nCzy na pewno tego chcesz?" +#define STR_OPEN_READ "Nie mogę otworzyć pliku do odczytu" +#define STR_OPEN_WRITE "Nie mogę otworzyć pliku do zapisu" +#define STR_DEVCONF_1 "Konfiguracja" +#define STR_DEVCONF_2 "Urządzenie:" + + +/* UI dialog: About (3200.) */ +#define STR_ABOUT "O VARCem.." +#define STR_3201 "Autorzy:" +#define STR_3202 "Fred N. van Kempen, Miran Grca, Sarah Walker i inni.\nOparte na wcześniejszych pracacch, takich, jak 86Box, PCem, MAME, DOSbox i Qemu." +#define STR_3203 "Wypuszczono pod 3-klauzulową licencją BSD, oraz Ogólną Publiczną Licencją GNU (w wersji 2-giej lub wyższej) dla istniejącego, zaimportowanego kodu pochodzącego z innych projektów." +#define STR_3204 "Zobacz LICENSE.txt po więcej informacji." + +/* UI dialog: Localization (3210.) */ +#define STR_LOCALIZE "Tłumaczenie" +#define STR_3211 "Tłumaczenia z angielskiego do tych oto języków przekazane przez:" + +/* UI dialog: Status (3225.) */ +/* (Unused now) */ + +/* UI dialog: Sound Gain (3250.) */ +#define STR_SNDGAIN "Wzmocnienie dźwięku" +#define STR_3251 "Wzmocnienie" + +/* UI dialog: New Image (3275.) */ +#define STR_NEWIMG "Nowy obraz dyskietki" +#define STR_3276 "Rozmiar dysku:" +#define STR_3277 "Tryb RPM:" +#define STR_3278 "Perfekcyjne RPM" +#define STR_3279 "1% poniżej perfekcyjnego RPM" +#define STR_3280 "1.5% poniżej perfekcyjnego RPM" +#define STR_3281 "2% poniżej perfekcyjnego RPM" +#define STR_3282 "160 KB" +#define STR_3283 "180 KB" +#define STR_3284 "320 KB" +#define STR_3285 "360 KB" +#define STR_3286 "640 KB" +#define STR_3287 "720 KB" +#define STR_3288 "1.2 MB" +#define STR_3289 "1.25 MB" +#define STR_3290 "1.44 MB" +#define STR_3291 "DMF (klaster o rozmiarze 1024)" +#define STR_3292 "DMF (klaster o rozmiarze 2048)" +#define STR_3293 "2.88 MB" +#define STR_3294 "ZIP 100MB" +#define STR_3295 "ZIP 250MB" + +/* UI dialog: Settings (3300.) */ +#define STR_SETTINGS "Ustawienia" +#define STR_3310 "Typ komputera" +#define STR_3311 "Ekran" +#define STR_3312 "Urządzenia wejścia" +#define STR_3313 "Dźwięk" +#define STR_3314 "Sieć" +#define STR_3315 "Porty (COM & LPT)" +#define STR_3316 "Inne urządzenia peryferyjne" +#define STR_3317 "Dyski twarde" +#define STR_3318 "Dyski elastyczne" +#define STR_3319 "Inne urządzenia wymienne" + +/* UI dialog: Settings (Machine, 3325.) */ +#define STR_3325 "Typ komputera:" +#define STR_3326 "Rodzaj mikroprocesora:" +#define STR_3327 "Mikroprocesor:" +#define STR_3328 "Czasy oczekiwania:" +#define STR_3329 "Pamięć:" +#define STR_3330 "MB" +#define STR_3331 "Synchronizacja czasu:" +#define STR_3332 "Włącz jednostkę zmiennoprzecinkową" +#define STR_3333 "Dynamiczny rekompilator" +#define STR_3334 "KB" +#define STR_3335 "Domyślne" +#define STR_3336 "Wybrano (UTC)" + +/* UI dialog: Settings (Video, 3350.) */ +#define STR_3350 "Wideo:" +#define STR_3351 "Akcelerator serii Voodoo" + +/* UI dialog: Settings (Input, 3375.) */ +#define STR_3375 "Mysz:" +#define STR_3376 "Joystick:" +#define STR_3377 "1-wszy Joystick" +#define STR_3378 "2-gi Joystick" +#define STR_3379 "3-ci Joystick" +#define STR_3380 "4-ty Joystick" + +/* UI dialog: Settings (Sound, 3400.) */ +#define STR_3400 "Karta dźwiękowa:" +#define STR_3401 "Urządzenie wyjścia MIDI:" +#define STR_3402 "Samodzielne MPU-401" +#define STR_3403 "Użyj Nuked OPL" +#define STR_3404 "Użyj dźwięku FLOAT32" + +/* UI dialog: Settings (Network, 3425.) */ +#define STR_3425 "Typ sieci:" +#define STR_3426 "Urządzenie PCap:" +#define STR_3427 "Kontroler sieci:" + +/* UI dialog: Settings (Ports, 3450.) */ +#define STR_3450 "Game port" +#define STR_3451 "1-wszy port równoległy" +#define STR_3452 "2-gi port równoległy" +#define STR_3453 "3-ci port równoległy" +#define STR_3454 "1-wszy port szeregowy" +#define STR_3455 "2-gi port szeregowy" + +/* UI dialog: Settings (Other Devices, 3475.) */ +#define STR_3475 "Kontroler SCSI:" +#define STR_3476 "Kontroler dysku twardego:" +#define STR_3477 "Trzecie IDE" +#define STR_3478 "Czwarte IDE" +#define STR_3479 "karta ISABugger" +#define STR_3480 "Karta rozszerzenia pamięci na złącze ISA" +#define STR_3481 "Karta zegara czasu rzeczywistego na złącze ISA" + +/* UI dialog: Settings (Hard Disks, 3500.) */ +#define STR_3500 "Dyski twarde:" +#define STR_3501 "&Nowy.." +#define STR_3502 "&Istniejący.." +#define STR_3503 "&Usuń" +#define STR_3504 "Magistrala" +#define STR_3505 "Pliki" +#define STR_3506 "C" +#define STR_3507 "H" +#define STR_3508 "S" +#define STR_3509 "MB" +#define STR_3510 "MB (CHS: %u, %u, %u)" +#define STR_3511 "Własne..." +#define STR_3512 "Własne (duże)..." +#define STR_3515 "ST506" +#define STR_3516 "ESDI" +#define STR_3517 "IDE" +#define STR_3518 "SCSI" +#define STR_3519 "USB" + +/* UI dialog: Settings (Add Hard Disk, 3525.) */ +#define STR_3525 "Dodaj dysk twardy" +#define STR_3526 "Dodaj nowy dysk twardy" +#define STR_3527 "Dodaj istniejący dysk twardy" +#define STR_3528 "Cylindry:" +#define STR_3529 "Głowice:" +#define STR_3530 "Sektory:" +#define STR_3531 "Rozmiar (MB):" +#define STR_3532 "Typ:" +#define STR_3533 "Próbujesz stworzyć obraz dysku w formacie HDi większy, niż 4 GB" +#define STR_3534 "Próbuję stworzyć przeogromny obraz dysku twardego" +#define STR_3535 "Obrazy typów HDI lub HDX z rozmiarem sektora innym, niż 512 bajtów nie są wspierane" +#define STR_3536 "Obrazy dysków twardych\0*.hd?;*.im?;*.vhd\0Wszystkie pliki\0*.*\0" +#define STR_3537 "pamiętaj o sformatowaniu i spartycjonowaniu nowego dysku" + +/* UI dialog: Settings (Floppy Drives, 3550.) */ +#define STR_3550 "Napędy dysków elastycznych:" +#define STR_3551 "Typ:" +#define STR_3552 "Synchronizacja trybu Turbo" +#define STR_3553 "Sprawdź BPB" +#define STR_3554 "Turbo" +#define STR_3555 "Sprawdź BPB" + +/* UI dialog: Settings (Removable Devices, 3575.) */ +#define STR_3575 "Napędy CD-ROM:" +#define STR_3576 "Prędkość:" +#define STR_3577 "Napędy ZIP 150MB:" +#define STR_3578 "Napędy ZIP 250MB" +#define STR_3579 "Prędkość" +#define STR_3580 "ATAPI" +#define STR_3581 "SCSI" +#define STR_3582 "USB" + + +/* UI: Status Bar (3900.) */ +#define STR_3900 "(pusty)" +#define STR_3901 "(napęd hosta %c:)" +#define STR_3902 " [Zabezpieczony przed zapisem]" +#define STR_3903 " [Tylko do odczytu]" +#define STR_3904 "&Nowy obraz.." +#define STR_3905 "Wczytaj &obraz.." +#define STR_3906 "&Wczytaj &ponownie poprzedni obraz" +#define STR_3907 "&Wysuń" +#define STR_3908 "Powiadom o &zmianie dysku" + +#define STR_3910 "Dyskietka %i (%s): %ls" +#define STR_3911 "Wszystkie obrazy\0*.0??;*.1??;*.360;*.720;*.86f;*.bin;*.cq?;*.ddi;*.dsk;*.flp;*.hdm;*.im?;*.json;*.td0;*.*fd?;*.xdf\0Zaawansowane obrazy sektorów\0*.imd;*.json;*.td0\0Podstawowe obrazy sektorów\0*.0??;*.1??;*.360;*.720;*.bin;*.cq?;*.ddi;*.dsk;*.flp;*.hdm;*.im?;*.xdf;*.*fd?\0Flux images\0*.fdi\0Obrazy powierzchni\0*.86f\0Wszystkie pliki\0*.*\0" +#define STR_3912 "Wszystkie pliki\0*.86f;*.ddi;*.dsk;*.flp;*.im?;*.*fd?\0Podstawowe obrazy sektorów\0*.ddi;*.dsk;*.flp;*.im?;*.img;*.*fd?\0Obrazy powierzchni\0*.86f\0" +#define STR_3913 "Obrazy powierzchni\0*.86f\0" +#define STR_3914 "Wyeksportuj do &86F..." + +#define STR_3920 "CD-ROM %i (%ls): %ls" +#define STR_3921 "Napęd CD/DVD hosta (%c:)" +#define STR_3922 "Obrazy CD-ROM\0*.iso;*.cue\0Wszystkie pliki (*.*)\0*.*\0" +#define STR_3923 "Wy&cisz" + +#define STR_3930 "Dysk %i (%ls): %ls" + +#define STR_3950 "ZIP%03i %i (%ls): %ls" +#define STR_3951 "Obrazy dyskietek ZIP\0*.im?;*.zdi\0Wszystkie pliki\0*.*\0" +#define STR_3952 "Obrazy dyskietek ZIP\0*.im?;*.zdi\0" +#define STR_3960 "Sieć (%s)" +#define STR_3970 "Dźwięk (%s)" + + +/* UI menu: Action (4000.) */ +#define STR_ACTION "&Akcja" +#define STR_4001 "&Twardy reset" +#define STR_4002 "&Ctrl+Alt+Del" +#define STR_4003 "Wyślij Ctrl+Alt+&Esc" +#define STR_4004 "Wyślij Ctrl+Alt+&Break" +#define STR_4005 "&Pauza" +#define STR_4006 "&Wyjdź" + + +/* UI menu: View (4010.) */ +#define STR_VIEW "&Podejrzyj" +#define STR_4011 "&Skalowalne okno" +#define STR_4012 "P&amiętaj rozmiar i pozycję" +#define STR_4013 "&Pełny ekran\tCtrl+Alt+PageUP" +#define STR_4014 "P&rawy CTRL jest lewym ALT-em" + +/* UI menu: View > Renderer (4020.) */ +#define STR_4020 "Urzą&dzenie renderowania" + +/* UI menu: View > Window Scale Factor (4030.) */ +#define STR_4030 "&Poziom wyskalowania ekranu" +#define STR_4031 "&0.5x" +#define STR_4032 "&1x" +#define STR_4033 "1.&5x" +#define STR_4034 "&2x" + +/* UI menu: View > Fullscreen Stretch Mode (4040.) */ +#define STR_4040 "Tryb r&ozciągnięcia na pełnym ekranie" +#define STR_4041 "Rozci&ągnięcie na pełen ekran" +#define STR_4042 "&4:3" +#define STR_4043 "&Kwadratowe piksele" +#define STR_4044 "&Skala w liczbach całkowitych" +#define STR_4045 "&Utrzymuj rozmiar" + + +/* UI menu: Display (4050.) */ +#define STR_DISPLAY "&Ekran" +#define STR_4051 "&Obrócony ekran" +#define STR_4052 "Włącz &overscan" +#define STR_4053 "W&ymuś proporcje obrazu 4:3" +#define STR_4054 "Zmień &kontrast monitora monochromatycznego" + +/* UI menu: Display > Display Type (4060.) */ +#define STR_DISPTYPE "&Typ ekranu" +#define STR_4061 "Monitor &kolorowy RGB" +#define STR_4062 "Monitor w &odcieniach szarości" +#define STR_4063 "Monitor &bursztynowy" +#define STR_4064 "Monitor &zielony" +#define STR_4065 "Monitor &biały" + +/* UI menu: Display > Grayscale Conversion Type (4070.) */ +#define STR_GRAYSCALE "Typ konwersji w odcienie sz&arości" +#define STR_4071 "BT&601 (NTSC/PAL)" +#define STR_4072 "BT&709 (HDTV)" +#define STR_4073 "&Przeciętny" + + +/* UI menu: Tools (4080.) */ +#define STR_TOOLS "&Narzędzia" +#define STR_4081 "&Ustawienia" +#define STR_4082 "&Język" +#define STR_4083 "&Logowanie" +#define STR_4084 "Punkt przerwania logowania" +#define STR_4085 "Przełącz logowanie %s" +#define STR_4086 "Wczytaj &konfigurację" +#define STR_4087 "&Zapisz konfigurację" +#define STR_4088 "Zrzut &ekranu" + + +/* UI menu: Help (4090.) */ +#define STR_HELP "&Pomoc" +#define STR_4091 "&O VARCem" + + +/* End of file. */ diff --git a/src/ui/lang/VARCem.lang b/src/ui/lang/VARCem.lang index 0823284..dccc234 100644 --- a/src/ui/lang/VARCem.lang +++ b/src/ui/lang/VARCem.lang @@ -8,7 +8,7 @@ # # Supported Languages database. # -# Version: @(#)VARCem.lang 1.0.4 2018/09/26 +# Version: @(#)VARCem.lang 1.0.5 2018/10/27 # # Author: Fred N. van Kempen, # @@ -57,6 +57,7 @@ KR,0412,LANG_KOREAN,SUBLANG_KOREAN,Korean KZ,043f,LANG_KAZAK,SUBLANG_KAZAK_KAZAKHSTAN,Kazakh LT,0427,LANG_LITHUANIAN,SUBLANG_LITHUANIAN_LITHUANIA,Lithuanian NO,0414,LANG_NORWEGIAN,SUBLANG_NORWEGIAN_BOKMAL,Norwegian +PL,0415,LANG_POLISH,SUBLANG_POLISH_POLAND,Polish RU,0419,LANG_RUSSIAN,SUBLANG_RUSSIAN_RUSSIA,Russian SL,0424,LANG_SLOVENIAN,SUBLANG_SLOVENIAN_SLOVENIA,Slovenian UA,0422,LANG_UKRAINIAN,SUBLANG_UKRAINIAN_UKRAINE,Ukrainian