mirror of
https://github.com/86Box/86Box.git
synced 2026-02-26 14:03:16 -07:00
Merge branch 'master' of ssh://github.com/86Box/86Box into feature/mtrr
This commit is contained in:
4
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
4
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
contact_links:
|
||||
- name: Question
|
||||
url: https://discord.gg/QXK9XTv
|
||||
about: Please ask and answer questions here.
|
||||
@@ -709,9 +709,9 @@ load_network(void)
|
||||
if (p != NULL) {
|
||||
if ((network_dev_to_id(p) == -1) || (network_ndev == 1)) {
|
||||
if ((network_ndev == 1) && strcmp(network_host, "none")) {
|
||||
ui_msgbox(MBX_ERROR, (wchar_t *)IDS_2103);
|
||||
ui_msgbox(MBX_ERROR, (wchar_t *)IDS_2094);
|
||||
} else if (network_dev_to_id(p) == -1) {
|
||||
ui_msgbox(MBX_ERROR, (wchar_t *)IDS_2104);
|
||||
ui_msgbox(MBX_ERROR, (wchar_t *)IDS_2095);
|
||||
}
|
||||
|
||||
strcpy(network_host, "none");
|
||||
|
||||
@@ -1044,16 +1044,12 @@ enter_smm(int in_hlt)
|
||||
else if (is_p6) /* Intel P6 (Pentium Pro, Pentium II, Celeron) */
|
||||
smram_save_state_p6(saved_state, in_hlt);
|
||||
|
||||
for (n = 0; n < SMM_SAVE_STATE_MAP_SIZE; n++) {
|
||||
smram_state -= 4;
|
||||
mem_writel_phys(smram_state, saved_state[n]);
|
||||
}
|
||||
|
||||
cr0 &= ~0x8000000d;
|
||||
cpu_state.flags = 2;
|
||||
cpu_state.eflags = 0;
|
||||
|
||||
cr4 = 0;
|
||||
|
||||
dr[7] = 0x400;
|
||||
cpu_state.pc = 0x8000;
|
||||
|
||||
@@ -1089,6 +1085,11 @@ enter_smm(int in_hlt)
|
||||
|
||||
cpu_state.op32 = use32;
|
||||
|
||||
for (n = 0; n < SMM_SAVE_STATE_MAP_SIZE; n++) {
|
||||
smram_state -= 4;
|
||||
writememl(0, smram_state, saved_state[n]);
|
||||
}
|
||||
|
||||
nmi_mask = 0;
|
||||
|
||||
if (smi_latched) {
|
||||
@@ -1146,7 +1147,7 @@ leave_smm(void)
|
||||
|
||||
for (n = 0; n < SMM_SAVE_STATE_MAP_SIZE; n++) {
|
||||
smram_state -= 4;
|
||||
saved_state[n] = mem_readl_phys(smram_state);
|
||||
saved_state[n] = readmeml(0, smram_state);
|
||||
x386_common_log("Reading %08X from memory at %08X to array element %i\n", saved_state[n], smram_state, n);
|
||||
}
|
||||
|
||||
|
||||
@@ -1898,7 +1898,7 @@ execx86(int cycs)
|
||||
temp = !!(cpu_state.flags & A_FLAG);
|
||||
if ((cpu_state.flags & A_FLAG) || ((AL & 0xf) > 9)) {
|
||||
cpu_src = 6;
|
||||
cpu_data = cpu_dest + cpu_src;
|
||||
cpu_data = cpu_dest - cpu_src;
|
||||
set_of_sub(8);
|
||||
cpu_dest = cpu_data;
|
||||
set_af(1);
|
||||
|
||||
@@ -319,10 +319,9 @@ cpu_set(void)
|
||||
#else
|
||||
is_k5 = 0;
|
||||
#endif
|
||||
is_k6 = (cpu_s->cpu_type == CPU_K6);
|
||||
is_k6 = (cpu_s->cpu_type == CPU_K6) || (cpu_s->cpu_type == CPU_K6_2) ||
|
||||
(cpu_s->cpu_type == CPU_K6_2C) || (cpu_s->cpu_type == CPU_K6_3) ||
|
||||
(cpu_s->cpu_type == CPU_K6_2P) || (cpu_s->cpu_type == CPU_K6_3P);
|
||||
(cpu_s->cpu_type == CPU_K6_2C) || (cpu_s->cpu_type == CPU_K6_3) ||
|
||||
(cpu_s->cpu_type == CPU_K6_2P) || (cpu_s->cpu_type == CPU_K6_3P);
|
||||
is_p6 = (cpu_s->cpu_type == CPU_PENTIUMPRO) || (cpu_s->cpu_type == CPU_PENTIUM2) ||
|
||||
(cpu_s->cpu_type == CPU_PENTIUM2D);
|
||||
/* The Samuel 2 datasheet claims it's Celeron-compatible. */
|
||||
@@ -2861,7 +2860,7 @@ i686_invalid_rdmsr:
|
||||
|
||||
void cpu_WRMSR()
|
||||
{
|
||||
uint64_t temp, temp2;
|
||||
uint64_t temp;
|
||||
|
||||
cpu_log("WRMSR %08X %08X%08X\n", ECX, EDX, EAX);
|
||||
switch (machines[machine].cpu[cpu_manufacturer].cpus[cpu_effective].cpu_type)
|
||||
@@ -2930,23 +2929,10 @@ void cpu_WRMSR()
|
||||
break;
|
||||
case 0x200: case 0x201: case 0x202: case 0x203: case 0x204: case 0x205: case 0x206: case 0x207:
|
||||
case 0x208: case 0x209: case 0x20A: case 0x20B: case 0x20C: case 0x20D: case 0x20E: case 0x20F:
|
||||
temp = EAX | ((uint64_t)EDX << 32);
|
||||
temp2 = (ECX - 0x200) >> 1;
|
||||
if (ECX & 1) {
|
||||
cpu_log("MTRR physmask[%d] = %08llx\n", temp2, temp);
|
||||
|
||||
if ((mtrr_physmask_msr[temp2] >> 11) & 0x1)
|
||||
mem_del_mtrr(mtrr_physbase_msr[temp2] & ~(0xFFF), mtrr_physmask_msr[temp2] & ~(0xFFF));
|
||||
|
||||
if ((temp >> 11) & 0x1)
|
||||
mem_add_mtrr(mtrr_physbase_msr[temp2] & ~(0xFFF), temp & ~(0xFFF), mtrr_physbase_msr[temp2] & 0xFF);
|
||||
|
||||
mtrr_physmask_msr[temp2] = temp;
|
||||
} else {
|
||||
cpu_log("MTRR physbase[%d] = %08llx\n", temp2, temp);
|
||||
|
||||
mtrr_physbase_msr[temp2] = temp;
|
||||
}
|
||||
if (ECX & 1)
|
||||
mtrr_physmask_msr[(ECX - 0x200) >> 1] = EAX | ((uint64_t)EDX << 32);
|
||||
else
|
||||
mtrr_physbase_msr[(ECX - 0x200) >> 1] = EAX | ((uint64_t)EDX << 32);
|
||||
break;
|
||||
case 0x250:
|
||||
mtrr_fix64k_8000_msr = EAX | ((uint64_t)EDX << 32);
|
||||
@@ -3244,24 +3230,11 @@ void cpu_WRMSR()
|
||||
break;
|
||||
case 0x200: case 0x201: case 0x202: case 0x203: case 0x204: case 0x205: case 0x206: case 0x207:
|
||||
case 0x208: case 0x209: case 0x20A: case 0x20B: case 0x20C: case 0x20D: case 0x20E: case 0x20F:
|
||||
temp = EAX | ((uint64_t)EDX << 32);
|
||||
temp2 = (ECX - 0x200) >> 1;
|
||||
if (ECX & 1) {
|
||||
cpu_log("MTRR physmask[%d] = %08llx\n", temp2, temp);
|
||||
|
||||
if ((mtrr_physmask_msr[temp2] >> 11) & 0x1)
|
||||
mem_del_mtrr(mtrr_physbase_msr[temp2] & ~(0xFFF), mtrr_physmask_msr[temp2] & ~(0xFFF));
|
||||
|
||||
if ((temp >> 11) & 0x1)
|
||||
mem_add_mtrr(mtrr_physbase_msr[temp2] & ~(0xFFF), temp & ~(0xFFF), mtrr_physbase_msr[temp2] & 0xFF);
|
||||
|
||||
mtrr_physmask_msr[temp2] = temp;
|
||||
} else {
|
||||
cpu_log("MTRR physbase[%d] = %08llx\n", temp2, temp);
|
||||
|
||||
mtrr_physbase_msr[temp2] = temp;
|
||||
}
|
||||
break;
|
||||
if (ECX & 1)
|
||||
mtrr_physmask_msr[(ECX - 0x200) >> 1] = EAX | ((uint64_t)EDX << 32);
|
||||
else
|
||||
mtrr_physbase_msr[(ECX - 0x200) >> 1] = EAX | ((uint64_t)EDX << 32);
|
||||
break;
|
||||
case 0x250:
|
||||
mtrr_fix64k_8000_msr = EAX | ((uint64_t)EDX << 32);
|
||||
break;
|
||||
@@ -3293,11 +3266,6 @@ i686_invalid_wrmsr:
|
||||
}
|
||||
}
|
||||
|
||||
void cpu_INVD(uint8_t wb)
|
||||
{
|
||||
mem_invalidate_mtrr(wb);
|
||||
}
|
||||
|
||||
static int cyrix_addr;
|
||||
|
||||
static void cpu_write(uint16_t addr, uint8_t val, void *priv)
|
||||
|
||||
@@ -515,7 +515,6 @@ extern void cpu_set(void);
|
||||
extern void cpu_CPUID(void);
|
||||
extern void cpu_RDMSR(void);
|
||||
extern void cpu_WRMSR(void);
|
||||
extern void cpu_INVD(uint8_t wb);
|
||||
|
||||
extern int checkio(int port);
|
||||
extern void codegen_block_end(void);
|
||||
|
||||
@@ -743,14 +743,12 @@ static int opCLTS(uint32_t fetchdat)
|
||||
|
||||
static int opINVD(uint32_t fetchdat)
|
||||
{
|
||||
cpu_INVD(0);
|
||||
CLOCK_CYCLES(1000);
|
||||
CPU_BLOCK_END();
|
||||
return 0;
|
||||
}
|
||||
static int opWBINVD(uint32_t fetchdat)
|
||||
{
|
||||
cpu_INVD(1);
|
||||
CLOCK_CYCLES(10000);
|
||||
CPU_BLOCK_END();
|
||||
return 0;
|
||||
|
||||
@@ -120,9 +120,9 @@ static int opMOV_CRx_r_a16(uint32_t fetchdat)
|
||||
mmu_perm=4;
|
||||
if (hascache && !(cr0 & (1 << 30)))
|
||||
cpu_cache_int_enabled = 1;
|
||||
else
|
||||
cpu_cache_int_enabled = 0;
|
||||
if (hascache && ((cr0 ^ old_cr0) & (1 << 30)))
|
||||
else
|
||||
cpu_cache_int_enabled = 0;
|
||||
if (hascache && ((cr0 ^ old_cr0) & (1 << 30)))
|
||||
cpu_update_waitstates();
|
||||
if (cr0 & 1)
|
||||
cpu_cur_status |= CPU_STATUS_PMODE;
|
||||
@@ -139,8 +139,8 @@ static int opMOV_CRx_r_a16(uint32_t fetchdat)
|
||||
case 4:
|
||||
if (cpu_has_feature(CPU_FEATURE_CR4))
|
||||
{
|
||||
if (cpu_state.regs[cpu_rm].l & 0x00000020)
|
||||
fatal("PAE enable\n");
|
||||
if (((cpu_state.regs[cpu_rm].l ^ cr4) & cpu_CR4_mask) & CR4_PAE)
|
||||
flushmmucache();
|
||||
cr4 = cpu_state.regs[cpu_rm].l & cpu_CR4_mask;
|
||||
break;
|
||||
}
|
||||
@@ -195,6 +195,8 @@ static int opMOV_CRx_r_a32(uint32_t fetchdat)
|
||||
case 4:
|
||||
if (cpu_has_feature(CPU_FEATURE_CR4))
|
||||
{
|
||||
if (((cpu_state.regs[cpu_rm].l ^ cr4) & cpu_CR4_mask) & CR4_PAE)
|
||||
flushmmucache();
|
||||
cr4 = cpu_state.regs[cpu_rm].l & cpu_CR4_mask;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -98,8 +98,8 @@ sff_bus_master_handler(sff8038i_t *dev, int enabled, uint16_t base)
|
||||
static void
|
||||
sff_bus_master_next_addr(sff8038i_t *dev)
|
||||
{
|
||||
DMAPageRead(dev->ptr_cur, (uint8_t *)&(dev->addr), 4);
|
||||
DMAPageRead(dev->ptr_cur + 4, (uint8_t *)&(dev->count), 4);
|
||||
dma_bm_read(dev->ptr_cur, (uint8_t *)&(dev->addr), 4, 4);
|
||||
dma_bm_read(dev->ptr_cur + 4, (uint8_t *)&(dev->count), 4, 4);
|
||||
sff_log("SFF-8038i Bus master DWORDs: %08X %08X\n", dev->addr, dev->count);
|
||||
dev->eot = dev->count >> 31;
|
||||
dev->count &= 0xfffe;
|
||||
@@ -318,17 +318,17 @@ sff_bus_master_dma(int channel, uint8_t *data, int transfer_length, int out, voi
|
||||
if (dev->count <= transfer_length) {
|
||||
sff_log("%sing %i bytes to %08X\n", sop, dev->count, dev->addr);
|
||||
if (out)
|
||||
DMAPageRead(dev->addr, (uint8_t *)(data + buffer_pos), dev->count);
|
||||
dma_bm_read(dev->addr, (uint8_t *)(data + buffer_pos), dev->count, 4);
|
||||
else
|
||||
DMAPageWrite(dev->addr, (uint8_t *)(data + buffer_pos), dev->count);
|
||||
dma_bm_write(dev->addr, (uint8_t *)(data + buffer_pos), dev->count, 4);
|
||||
transfer_length -= dev->count;
|
||||
buffer_pos += dev->count;
|
||||
} else {
|
||||
sff_log("%sing %i bytes to %08X\n", sop, transfer_length, dev->addr);
|
||||
if (out)
|
||||
DMAPageRead(dev->addr, (uint8_t *)(data + buffer_pos), transfer_length);
|
||||
dma_bm_read(dev->addr, (uint8_t *)(data + buffer_pos), transfer_length, 4);
|
||||
else
|
||||
DMAPageWrite(dev->addr, (uint8_t *)(data + buffer_pos), transfer_length);
|
||||
dma_bm_write(dev->addr, (uint8_t *)(data + buffer_pos), transfer_length, 4);
|
||||
/* Increase addr and decrease count so that resumed transfers do not mess up. */
|
||||
dev->addr += transfer_length;
|
||||
dev->count -= transfer_length;
|
||||
|
||||
52
src/dma.c
52
src/dma.c
@@ -983,31 +983,47 @@ dma_mode(int channel)
|
||||
|
||||
/* DMA Bus Master Page Read/Write */
|
||||
void
|
||||
DMAPageRead(uint32_t PhysAddress, uint8_t *DataRead, uint32_t TotalSize)
|
||||
dma_bm_read(uint32_t PhysAddress, uint8_t *DataRead, uint32_t TotalSize, int TransferSize)
|
||||
{
|
||||
uint32_t i = 0;
|
||||
uint32_t i = 0, n, n2;
|
||||
uint8_t bytes[4] = { 0, 0, 0, 0 };
|
||||
|
||||
#if 0
|
||||
memcpy(DataRead, &ram[PhysAddress], TotalSize);
|
||||
#else
|
||||
for (i = 0; i < TotalSize; i++)
|
||||
DataRead[i] = mem_readb_phys(PhysAddress + i);
|
||||
#endif
|
||||
n = TotalSize & ~(TransferSize - 1);
|
||||
n2 = TotalSize - n;
|
||||
|
||||
/* Do the divisible block, if there is one. */
|
||||
if (n) {
|
||||
for (i = 0; i < n; i += TransferSize)
|
||||
mem_read_phys((void *) &(DataRead[i]), PhysAddress + i, TransferSize);
|
||||
}
|
||||
|
||||
/* Do the non-divisible block, if there is one. */
|
||||
if (n2) {
|
||||
mem_read_phys((void *) bytes, PhysAddress + n, TransferSize);
|
||||
memcpy((void *) &(DataRead[n]), bytes, n2);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
DMAPageWrite(uint32_t PhysAddress, const uint8_t *DataWrite, uint32_t TotalSize)
|
||||
dma_bm_write(uint32_t PhysAddress, const uint8_t *DataWrite, uint32_t TotalSize, int TransferSize)
|
||||
{
|
||||
uint32_t i = 0;
|
||||
uint32_t i = 0, n, n2;
|
||||
uint8_t bytes[4] = { 0, 0, 0, 0 };
|
||||
|
||||
#if 0
|
||||
mem_invalidate_range(PhysAddress, PhysAddress + TotalSize - 1);
|
||||
memcpy(&ram[PhysAddress], DataWrite, TotalSize);
|
||||
#else
|
||||
for (i = 0; i < TotalSize; i++)
|
||||
mem_writeb_phys(PhysAddress + i, DataWrite[i]);
|
||||
n = TotalSize & ~(TransferSize - 1);
|
||||
n2 = TotalSize - n;
|
||||
|
||||
mem_invalidate_range(PhysAddress, PhysAddress + TotalSize - 1);
|
||||
#endif
|
||||
/* Do the divisible block, if there is one. */
|
||||
if (n) {
|
||||
for (i = 0; i < n; i += TransferSize)
|
||||
mem_write_phys((void *) &(DataWrite[i]), PhysAddress + i, TransferSize);
|
||||
}
|
||||
|
||||
/* Do the non-divisible block, if there is one. */
|
||||
if (n2) {
|
||||
mem_read_phys((void *) bytes, PhysAddress + n, TransferSize);
|
||||
memcpy(bytes, (void *) &(DataWrite[n]), n2);
|
||||
mem_write_phys((void *) bytes, PhysAddress + n, TransferSize);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -407,13 +407,6 @@ fdd_is_dd(int drive)
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
fdd_is_hd(int drive)
|
||||
{
|
||||
return drive_types[fdd[drive].type].flags & FLAG_HOLE1;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
fdd_is_ed(int drive)
|
||||
{
|
||||
|
||||
@@ -90,10 +90,8 @@ extern void dma_alias_set_piix(void);
|
||||
extern void dma_alias_remove(void);
|
||||
extern void dma_alias_remove_piix(void);
|
||||
|
||||
extern void DMAPageRead(uint32_t PhysAddress, uint8_t *DataRead,
|
||||
uint32_t TotalSize);
|
||||
extern void DMAPageWrite(uint32_t PhysAddress, const uint8_t *DataWrite,
|
||||
uint32_t TotalSize);
|
||||
extern void dma_bm_read(uint32_t PhysAddress, uint8_t *DataRead, uint32_t TotalSize, int TransferSize);
|
||||
extern void dma_bm_write(uint32_t PhysAddress, const uint8_t *DataWrite, uint32_t TotalSize, int TransferSize);
|
||||
|
||||
|
||||
#endif /*EMU_DMA_H*/
|
||||
|
||||
@@ -43,7 +43,6 @@ extern int fdd_can_read_medium(int drive);
|
||||
extern int fdd_doublestep_40(int drive);
|
||||
extern int fdd_is_525(int drive);
|
||||
extern int fdd_is_dd(int drive);
|
||||
extern int fdd_is_hd(int drive);
|
||||
extern int fdd_is_ed(int drive);
|
||||
extern int fdd_is_double_sided(int drive);
|
||||
extern void fdd_set_head(int drive, int head);
|
||||
|
||||
@@ -53,53 +53,44 @@
|
||||
#define IDS_2077 2077 // "Click to capture mouse"
|
||||
#define IDS_2078 2078 // "Press F12-F8 to release mouse"
|
||||
#define IDS_2079 2079 // "Press F12-F8 or middle button.."
|
||||
#define IDS_2080 2080 // "E&xport to 86F..."
|
||||
#define IDS_2081 2081 // "Unable to initialize Flui.."
|
||||
#define IDS_2082 2082 // "Bus"
|
||||
#define IDS_2083 2083 // "File"
|
||||
#define IDS_2084 2084 // "C"
|
||||
#define IDS_2085 2085 // "H"
|
||||
#define IDS_2086 2086 // "S"
|
||||
#define IDS_2087 2087 // "MB"
|
||||
#define IDS_2088 2088 // "Check BPB"
|
||||
#define IDS_2089 2089 // "&Image..."
|
||||
#define IDS_2090 2090 // "&Reload previous image"
|
||||
#define IDS_2091 2091 // "E&mpty"
|
||||
#define IDS_2092 2092 // "&Mute"
|
||||
#define IDS_2093 2093 // "E&ject"
|
||||
#define IDS_2094 2094 // "KB"
|
||||
#define IDS_2095 2095 // "Neither DirectDraw nor Dire.."
|
||||
#define IDS_2096 2096 // "&New image..."
|
||||
#define IDS_2097 2097 // "&Existing image..."
|
||||
#define IDS_2098 2098 // "Existing image (&Write-pr..."
|
||||
#define IDS_2099 2099 // "Default"
|
||||
#define IDS_2100 2100 // "%i Wait state(s)"
|
||||
#define IDS_2101 2101 // "Type"
|
||||
#define IDS_2102 2102 // "PCap failed to set up.."
|
||||
#define IDS_2103 2103 // "No PCap devices found"
|
||||
#define IDS_2104 2104 // "Invalid PCap device"
|
||||
#define IDS_2105 2105 // "Standard 2-button joystick(s)"
|
||||
#define IDS_2106 2106 // "Standard 4-button joystick"
|
||||
#define IDS_2107 2107 // "Standard 6-button joystick"
|
||||
#define IDS_2108 2108 // "Standard 8-button joystick"
|
||||
#define IDS_2109 2109 // "CH Flightstick Pro"
|
||||
#define IDS_2110 2110 // "Microsoft SideWinder Pad"
|
||||
#define IDS_2111 2111 // "Thrustmaster Flight Cont.."
|
||||
#define IDS_2112 2112 // "None"
|
||||
#define IDS_2113 2113 // "Unable to load Accelerators"
|
||||
#define IDS_2114 2114 // "Unable to register Raw Input"
|
||||
#define IDS_2115 2115 // "%u"
|
||||
#define IDS_2116 2116 // "%u MB (CHS: %i, %i, %i)"
|
||||
#define IDS_2117 2117 // "Floppy %i (%s): %ls"
|
||||
#define IDS_2118 2118 // "All floppy images (*.0??;*.."
|
||||
#define IDS_2119 2119 // "Unable to initialize Free.."
|
||||
#define IDS_2120 2120 // "Unable to initialize SDL..."
|
||||
#define IDS_2121 2121 // "Are you sure you want to..."
|
||||
#define IDS_2122 2122 // "Are you sure you want to..."
|
||||
#define IDS_2123 2123 // "Unable to initialize Ghostscript..."
|
||||
#define IDS_2124 2124 // "MO %i (%03i): %ls"
|
||||
#define IDS_2125 2125 // "MO images (*.IM?)\0*.IM..."
|
||||
#define IDS_2126 2126 // "Welcome to 86Box!"
|
||||
#define IDS_2080 2080 // "Unable to initialize Flui.."
|
||||
#define IDS_2081 2081 // "Bus"
|
||||
#define IDS_2082 2082 // "File"
|
||||
#define IDS_2083 2083 // "C"
|
||||
#define IDS_2084 2084 // "H"
|
||||
#define IDS_2085 2085 // "S"
|
||||
#define IDS_2086 2086 // "MB"
|
||||
#define IDS_2087 2087 // "Check BPB"
|
||||
#define IDS_2088 2088 // "KB"
|
||||
#define IDS_2089 2089 // "Neither DirectDraw nor Dire.."
|
||||
#define IDS_2090 2090 // "Default"
|
||||
#define IDS_2091 2091 // "%i Wait state(s)"
|
||||
#define IDS_2092 2092 // "Type"
|
||||
#define IDS_2093 2093 // "PCap failed to set up.."
|
||||
#define IDS_2094 2094 // "No PCap devices found"
|
||||
#define IDS_2095 2095 // "Invalid PCap device"
|
||||
#define IDS_2096 2096 // "Standard 2-button joystick(s)"
|
||||
#define IDS_2097 2097 // "Standard 4-button joystick"
|
||||
#define IDS_2098 2098 // "Standard 6-button joystick"
|
||||
#define IDS_2099 2099 // "Standard 8-button joystick"
|
||||
#define IDS_2100 2100 // "CH Flightstick Pro"
|
||||
#define IDS_2101 2101 // "Microsoft SideWinder Pad"
|
||||
#define IDS_2102 2102 // "Thrustmaster Flight Cont.."
|
||||
#define IDS_2103 2103 // "None"
|
||||
#define IDS_2104 2104 // "Unable to load Accelerators"
|
||||
#define IDS_2105 2105 // "Unable to register Raw Input"
|
||||
#define IDS_2106 2106 // "%u"
|
||||
#define IDS_2107 2107 // "%u MB (CHS: %i, %i, %i)"
|
||||
#define IDS_2108 2108 // "Floppy %i (%s): %ls"
|
||||
#define IDS_2109 2109 // "All floppy images (*.0??;*.."
|
||||
#define IDS_2110 2110 // "Unable to initialize Free.."
|
||||
#define IDS_2111 2111 // "Unable to initialize SDL..."
|
||||
#define IDS_2112 2112 // "Are you sure you want to..."
|
||||
#define IDS_2113 2113 // "Are you sure you want to..."
|
||||
#define IDS_2114 2114 // "Unable to initialize Ghostscript..."
|
||||
#define IDS_2115 2115 // "MO %i (%03i): %ls"
|
||||
#define IDS_2116 2116 // "MO images (*.IM?)\0*.IM..."
|
||||
#define IDS_2117 2117 // "Welcome to 86Box!"
|
||||
|
||||
#define IDS_4096 4096 // "Hard disk (%s)"
|
||||
#define IDS_4097 4097 // "%01i:%01i"
|
||||
@@ -178,7 +169,7 @@
|
||||
|
||||
#define IDS_LANG_ENUS IDS_7168
|
||||
|
||||
#define STR_NUM_2048 79
|
||||
#define STR_NUM_2048 70
|
||||
#define STR_NUM_3072 11
|
||||
#define STR_NUM_4096 18
|
||||
#define STR_NUM_4352 7
|
||||
|
||||
@@ -39,7 +39,6 @@
|
||||
#define MACHINE_VIDEO_FIXED 0x004000 /* sys has ONLY int video */
|
||||
#define MACHINE_MOUSE 0x008000 /* sys has int mouse */
|
||||
#define MACHINE_NONMI 0x010000 /* sys does not have NMI's */
|
||||
#define MACHINE_COREBOOT 0x020000 /* sys has coreboot BIOS */
|
||||
#else
|
||||
#define MACHINE_PC 0x000000 /* PC architecture */
|
||||
#define MACHINE_AT 0x000001 /* PC/AT architecture */
|
||||
@@ -56,7 +55,6 @@
|
||||
#define MACHINE_VIDEO_FIXED 0x004000 /* sys has ONLY int video */
|
||||
#define MACHINE_MOUSE 0x008000 /* sys has int mouse */
|
||||
#define MACHINE_NONMI 0x010000 /* sys does not have NMI's */
|
||||
#define MACHINE_COREBOOT 0x020000 /* sys has coreboot BIOS */
|
||||
#endif
|
||||
|
||||
#define IS_ARCH(m, a) (machines[(m)].flags & (a)) ? 1 : 0;
|
||||
@@ -291,6 +289,7 @@ extern int machine_at_p55t2s_init(const machine_t *);
|
||||
extern int machine_at_m7shi_init(const machine_t *);
|
||||
extern int machine_at_tc430hx_init(const machine_t *);
|
||||
extern int machine_at_equium5200_init(const machine_t *);
|
||||
extern int machine_at_p65up5_cp55t2d_init(const machine_t *);
|
||||
|
||||
extern int machine_at_p55tvp4_init(const machine_t *);
|
||||
extern int machine_at_p55va_init(const machine_t *);
|
||||
@@ -321,8 +320,14 @@ extern int machine_at_686nx_init(const machine_t *);
|
||||
extern int machine_at_mb600n_init(const machine_t *);
|
||||
extern int machine_at_8500ttc_init(const machine_t *);
|
||||
extern int machine_at_m6mi_init(const machine_t *);
|
||||
extern int machine_at_vs440fx_init(const machine_t *);
|
||||
#ifdef EMU_DEVICE_H
|
||||
extern void machine_at_p65up5_common_init(const machine_t *, const device_t *northbridge);
|
||||
#endif
|
||||
extern int machine_at_p65up5_cp6nd_init(const machine_t *);
|
||||
|
||||
/* m_at_slot1.c */
|
||||
extern int machine_at_p65up5_cpknd_init(const machine_t *);
|
||||
extern int machine_at_p6kfx_init(const machine_t *);
|
||||
|
||||
extern int machine_at_6bxc_init(const machine_t *);
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
#define MEM_WRITE_EXTERNAL 0x02
|
||||
#define MEM_WRITE_DISABLED 0x03
|
||||
#define MEM_WRITE_NORMAL 0x04 /* SMM only - means use the non-SMM state */
|
||||
#define MEM_WRITE_EXTERNAL_EX 0x05
|
||||
#define MEM_WRITE_ROMCS 0x06 /* EXTERNAL type + ROMC flag */
|
||||
#define MEM_WRITE_EXTANY 0x07 /* Any EXTERNAL type */
|
||||
#define MEM_WRITE_MASK 0x0f
|
||||
@@ -201,7 +202,8 @@ extern int readlnum,
|
||||
|
||||
extern int memspeed[11];
|
||||
|
||||
extern int mmu_perm;
|
||||
extern int mmu_perm,
|
||||
use_phys_exec;
|
||||
|
||||
extern int mem_a20_state,
|
||||
mem_a20_alt,
|
||||
@@ -282,9 +284,11 @@ extern void mem_set_mem_state_smm(uint32_t base, uint32_t size, int state);
|
||||
extern uint8_t mem_readb_phys(uint32_t addr);
|
||||
extern uint16_t mem_readw_phys(uint32_t addr);
|
||||
extern uint32_t mem_readl_phys(uint32_t addr);
|
||||
extern void mem_read_phys(void *dest, uint32_t addr, int tranfer_size);
|
||||
extern void mem_writeb_phys(uint32_t addr, uint8_t val);
|
||||
extern void mem_writew_phys(uint32_t addr, uint16_t val);
|
||||
extern void mem_writel_phys(uint32_t addr, uint32_t val);
|
||||
extern void mem_write_phys(void *src, uint32_t addr, int tranfer_size);
|
||||
|
||||
extern uint8_t mem_read_ram(uint32_t addr, void *priv);
|
||||
extern uint16_t mem_read_ramw(uint32_t addr, void *priv);
|
||||
@@ -330,10 +334,6 @@ extern void mem_init(void);
|
||||
extern void mem_reset(void);
|
||||
extern void mem_remap_top(int kb);
|
||||
|
||||
extern void mem_add_mtrr(uint64_t base, uint64_t mask, uint8_t type);
|
||||
extern void mem_del_mtrr(uint64_t base, uint64_t mask);
|
||||
extern void mem_invalidate_mtrr(uint8_t wb);
|
||||
|
||||
|
||||
#ifdef EMU_CPU_H
|
||||
static __inline uint32_t get_phys(uint32_t addr)
|
||||
|
||||
@@ -69,6 +69,14 @@ typedef int (*NETWAITCB)(void *);
|
||||
typedef int (*NETSETLINKSTATE)(void *);
|
||||
|
||||
|
||||
typedef struct netpkt {
|
||||
void *priv;
|
||||
uint8_t *data;
|
||||
int len;
|
||||
|
||||
struct netpkt *prev, *next;
|
||||
} netpkt_t;
|
||||
|
||||
typedef struct {
|
||||
const char *name;
|
||||
const char *internal_name;
|
||||
@@ -108,6 +116,8 @@ extern void network_close(void);
|
||||
extern void network_reset(void);
|
||||
extern int network_available(void);
|
||||
extern void network_tx(uint8_t *, int);
|
||||
extern void network_do_tx(void);
|
||||
extern int network_tx_queue_check(void);
|
||||
|
||||
extern int net_pcap_prepare(netdev_t *);
|
||||
extern int net_pcap_init(void);
|
||||
@@ -131,6 +141,8 @@ extern const device_t *network_card_getdevice(int);
|
||||
extern void network_set_wait(int wait);
|
||||
extern int network_get_wait(void);
|
||||
|
||||
extern void network_queue_put(int tx, void *priv, uint8_t *data, int len);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -119,10 +119,15 @@ extern void do_stop(void);
|
||||
|
||||
|
||||
/* Platform-specific device support. */
|
||||
extern void floppy_mount(uint8_t id, wchar_t *fn, uint8_t wp);
|
||||
extern void floppy_eject(uint8_t id);
|
||||
extern void cdrom_mount(uint8_t id, wchar_t *fn);
|
||||
extern void plat_cdrom_ui_update(uint8_t id, uint8_t reload);
|
||||
extern void zip_eject(uint8_t id);
|
||||
extern void zip_mount(uint8_t id, wchar_t *fn, uint8_t wp);
|
||||
extern void zip_reload(uint8_t id);
|
||||
extern void mo_eject(uint8_t id);
|
||||
extern void mo_mount(uint8_t id, wchar_t *fn, uint8_t wp);
|
||||
extern void mo_reload(uint8_t id);
|
||||
extern int ioctl_open(uint8_t id, char d);
|
||||
extern void ioctl_reset(uint8_t id);
|
||||
@@ -143,7 +148,7 @@ extern void thread_reset_event(event_t *arg);
|
||||
extern int thread_wait_event(event_t *arg, int timeout);
|
||||
extern void thread_destroy_event(event_t *arg);
|
||||
|
||||
extern mutex_t *thread_create_mutex(wchar_t *name);
|
||||
extern mutex_t *thread_create_mutex(void);
|
||||
extern void thread_close_mutex(mutex_t *arg);
|
||||
extern int thread_wait_mutex(mutex_t *arg);
|
||||
extern int thread_release_mutex(mutex_t *mutex);
|
||||
|
||||
@@ -425,7 +425,7 @@ typedef struct {
|
||||
|
||||
uint32_t Base, rom_addr, /* address of BIOS ROM */
|
||||
CmdParamLeft, Outgoing,
|
||||
pad32;
|
||||
transfer_size;
|
||||
|
||||
volatile uint32_t
|
||||
MailboxInit, MailboxCount,
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* Emulation of SPD (Serial Presence Detect) devices.
|
||||
*
|
||||
* Version: @(#)spd.h 1.0.0 2020/03/24
|
||||
*
|
||||
*
|
||||
* Authors: RichardG, <richardg867@gmail.com>
|
||||
*
|
||||
@@ -19,15 +19,19 @@
|
||||
|
||||
|
||||
#define SPD_BASE_ADDR 0x50
|
||||
#define SPD_MAX_SLOTS 8
|
||||
#define SPD_DATA_SIZE 256
|
||||
|
||||
#define SPD_TYPE_FPM 0x01
|
||||
#define SPD_TYPE_EDO 0x02
|
||||
#define SPD_TYPE_SDRAM 0x04
|
||||
|
||||
#define SPD_MIN_SIZE_EDO 8
|
||||
#define SPD_MIN_SIZE_SDRAM 8
|
||||
|
||||
#define SPD_SDR_SIGNAL_LVTTL 0x01
|
||||
#define SPD_SIGNAL_LVTTL 0x01
|
||||
|
||||
#define SPD_SDR_REFRESH_NORMAL 0x00
|
||||
#define SPD_REFRESH_NORMAL 0x00
|
||||
#define SPD_SDR_REFRESH_SELF 0x80
|
||||
|
||||
#define SPD_SDR_BURST_PAGE 0x80
|
||||
@@ -43,6 +47,24 @@
|
||||
#define SPD_SDR_ATTR_VCC_HI_5 0x20
|
||||
|
||||
|
||||
typedef struct _spd_edo_ {
|
||||
uint8_t bytes_used, spd_size, mem_type,
|
||||
row_bits, col_bits, banks,
|
||||
data_width_lsb, data_width_msb,
|
||||
signal_level, trac, tcac,
|
||||
config, refresh_rate,
|
||||
dram_width, ecc_width,
|
||||
reserved[47],
|
||||
spd_rev, checksum,
|
||||
mfg_jedec[8], mfg_loc;
|
||||
char part_no[18];
|
||||
uint8_t rev_code[2],
|
||||
mfg_year, mfg_week, serial[4], mfg_specific[27],
|
||||
vendor_specific[2],
|
||||
other_data[127],
|
||||
checksum2;
|
||||
} spd_edo_t;
|
||||
|
||||
typedef struct _spd_sdram_ {
|
||||
uint8_t bytes_used, spd_size, mem_type,
|
||||
row_bits, col_bits, rows,
|
||||
@@ -63,7 +85,8 @@ typedef struct _spd_sdram_ {
|
||||
uint8_t rev_code[2],
|
||||
mfg_year, mfg_week, serial[4], mfg_specific[27],
|
||||
freq, features,
|
||||
other_data[128];
|
||||
other_data[127],
|
||||
checksum2;
|
||||
} spd_sdram_t;
|
||||
|
||||
|
||||
|
||||
@@ -58,16 +58,12 @@ extern int ui_sb_find_part(int tag);
|
||||
extern void ui_sb_set_ready(int ready);
|
||||
extern void ui_sb_update_panes(void);
|
||||
extern void ui_sb_update_tip(int meaning);
|
||||
extern void ui_sb_check_menu_item(int tag, int id, int chk);
|
||||
extern void ui_sb_enable_menu_item(int tag, int id, int val);
|
||||
extern void ui_sb_timer_callback(int pane);
|
||||
extern void ui_sb_update_icon(int tag, int val);
|
||||
extern void ui_sb_update_icon_state(int tag, int active);
|
||||
extern void ui_sb_set_text_w(wchar_t *wstr);
|
||||
extern void ui_sb_set_text(char *str);
|
||||
extern void ui_sb_bugui(char *str);
|
||||
extern void ui_sb_mount_floppy_img(uint8_t id, int part, uint8_t wp, wchar_t *file_name);
|
||||
extern void ui_sb_mount_zip_img(uint8_t id, int part, uint8_t wp, wchar_t *file_name);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -43,6 +43,11 @@
|
||||
#define SB_MENU_NAME L"StatusBarMenu"
|
||||
#define FS_CLASS_NAME L"86BoxFullScreen"
|
||||
|
||||
#define FLOPPY_SUBMENU_NAME L"FloppySubmenu"
|
||||
#define CDROM_SUBMENU_NAME L"CdromSubmenu"
|
||||
#define ZIP_SUBMENU_NAME L"ZIPSubmenu"
|
||||
#define MO_SUBMENU_NAME L"MOSubmenu"
|
||||
|
||||
/* Application-specific window messages.
|
||||
|
||||
A dialog sends 0x8895 with WPARAM = 1 followed by 0x8896 with WPARAM = 1 on open,
|
||||
@@ -181,6 +186,20 @@ extern int file_dlg_st(HWND hwnd, int i, char *fn, int save);
|
||||
extern wchar_t *BrowseFolder(wchar_t *saved_path, wchar_t *title);
|
||||
|
||||
|
||||
/* Functions in win_media_menu.c */
|
||||
extern void media_menu_init();
|
||||
extern void media_menu_reset();
|
||||
extern int media_menu_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
|
||||
extern HMENU media_menu_get_floppy(int id);
|
||||
extern HMENU media_menu_get_cdrom(int id);
|
||||
extern HMENU media_menu_get_zip(int id);
|
||||
extern HMENU media_menu_get_mo(int id);
|
||||
extern void media_menu_update_floppy(int id);
|
||||
extern void media_menu_update_cdrom(int id);
|
||||
extern void media_menu_update_zip(int id);
|
||||
extern void media_menu_update_mo(int id);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -426,9 +426,11 @@ machine_at_486sp3g_init(const machine_t *model)
|
||||
pci_init(PCI_CONFIG_TYPE_2 | PCI_NO_IRQ_STEERING);
|
||||
pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0);
|
||||
pci_register_slot(0x01, PCI_CARD_SPECIAL, 0, 0, 0, 0);
|
||||
pci_register_slot(0x06, PCI_CARD_NORMAL, 3, 2, 1, 4);
|
||||
pci_register_slot(0x0E, PCI_CARD_NORMAL, 2, 1, 3, 4);
|
||||
pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 3, 2, 4);
|
||||
pci_register_slot(0x03, PCI_CARD_NORMAL, 1, 2, 3, 4); /* 03 = Slot 1 */
|
||||
pci_register_slot(0x04, PCI_CARD_NORMAL, 2, 3, 4, 1); /* 04 = Slot 2 */
|
||||
pci_register_slot(0x05, PCI_CARD_NORMAL, 3, 4, 1, 2); /* 05 = Slot 3 */
|
||||
pci_register_slot(0x06, PCI_CARD_NORMAL, 4, 1, 2, 3); /* 06 = Slot 4 */
|
||||
pci_register_slot(0x07, PCI_CARD_SCSI, 1, 2, 3, 4); /* 07 = SCSI */
|
||||
pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0);
|
||||
device_add(&keyboard_ps2_pci_device);
|
||||
device_add(&sio_device); /* Site says it has a ZB, but the BIOS is designed for an IB. */
|
||||
|
||||
@@ -33,12 +33,30 @@
|
||||
#include <86box/intel_sio.h>
|
||||
#include <86box/piix.h>
|
||||
#include <86box/sio.h>
|
||||
#include <86box/intel_sio.h>
|
||||
#include <86box/sst_flash.h>
|
||||
#include <86box/hwm.h>
|
||||
#include <86box/spd.h>
|
||||
#include <86box/video.h>
|
||||
#include "cpu.h"
|
||||
#include <86box/machine.h>
|
||||
|
||||
int
|
||||
machine_at_p65up5_cpknd_init(const machine_t *model)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = bios_load_linear(L"roms/machines/p65up5/ndkn0218.awd",
|
||||
0x000e0000, 131072, 0);
|
||||
|
||||
if (bios_only || !ret)
|
||||
return ret;
|
||||
|
||||
machine_at_p65up5_common_init(model, &i440fx_device);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
machine_at_p6kfx_init(const machine_t *model)
|
||||
{
|
||||
@@ -69,6 +87,7 @@ machine_at_p6kfx_init(const machine_t *model)
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if defined(DEV_BRANCH) && defined(NO_SIO)
|
||||
int
|
||||
machine_at_6bxc_init(const machine_t *model)
|
||||
{
|
||||
@@ -93,24 +112,21 @@ machine_at_6bxc_init(const machine_t *model)
|
||||
device_add(&i440bx_device);
|
||||
device_add(&piix4e_device);
|
||||
device_add(&keyboard_ps2_pci_device);
|
||||
device_add(&um8669f_device); /*Placeholder for ITE 8671*/
|
||||
device_add(&um8669f_device); /*ITE 8671*/
|
||||
device_add(&sst_flash_39sf020_device);
|
||||
spd_register(SPD_TYPE_SDRAM, 0xF, 256);
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
int
|
||||
machine_at_p2bls_init(const machine_t *model)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (model->flags & MACHINE_COREBOOT)
|
||||
ret = bios_load_linear(L"roms/machines/p2bls/coreboot.rom",
|
||||
0x000c0000, 262144, 0);
|
||||
else
|
||||
ret = bios_load_linear(L"roms/machines/p2bls/1014ls.003",
|
||||
0x000c0000, 262144, 0);
|
||||
ret = bios_load_linear(L"roms/machines/p2bls/1014ls.003",
|
||||
0x000c0000, 262144, 0);
|
||||
|
||||
if (bios_only || !ret)
|
||||
return ret;
|
||||
@@ -169,12 +185,8 @@ machine_at_p3bf_init(const machine_t *model)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (model->flags & MACHINE_COREBOOT)
|
||||
ret = bios_load_linear(L"roms/machines/p3bf/coreboot.rom",
|
||||
0x000c0000, 262144, 0);
|
||||
else
|
||||
ret = bios_load_linear(L"roms/machines/p3bf/bx3f1006.awd",
|
||||
0x000c0000, 262144, 0);
|
||||
ret = bios_load_linear(L"roms/machines/p3bf/bx3f1006.awd",
|
||||
0x000c0000, 262144, 0);
|
||||
|
||||
if (bios_only || !ret)
|
||||
return ret;
|
||||
@@ -296,4 +308,4 @@ machine_at_borapro_init(const machine_t *model)
|
||||
spd_register(SPD_TYPE_SDRAM, 0x3, 256);
|
||||
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -400,6 +400,22 @@ machine_at_equium5200_init(const machine_t *model) // Information about that mac
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
machine_at_p65up5_cp55t2d_init(const machine_t *model)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = bios_load_linear(L"roms/machines/p65up5/td5i0201.awd",
|
||||
0x000e0000, 131072, 0);
|
||||
|
||||
if (bios_only || !ret)
|
||||
return ret;
|
||||
|
||||
machine_at_p65up5_common_init(model, &i430hx_device);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
machine_at_p55tvp4_init(const machine_t *model)
|
||||
{
|
||||
@@ -549,6 +565,7 @@ machine_at_pb680_init(const machine_t *model)
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if defined(DEV_BRANCH) && defined(NO_SIO)
|
||||
int
|
||||
machine_at_p55xb2_init(const machine_t *model)
|
||||
{
|
||||
@@ -577,7 +594,7 @@ machine_at_p55xb2_init(const machine_t *model)
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
int
|
||||
machine_at_tx97_init(const machine_t *model)
|
||||
@@ -702,7 +719,7 @@ machine_at_ym430tx_init(const machine_t *model)
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
#if defined(DEV_BRANCH) && defined(NO_SIO)
|
||||
int
|
||||
machine_at_586t2_init(const machine_t *model)
|
||||
{
|
||||
@@ -796,7 +813,7 @@ machine_at_807ds_init(const machine_t *model)
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
int
|
||||
machine_at_p5mms98_init(const machine_t *model)
|
||||
@@ -862,6 +879,7 @@ machine_at_p5mms98_init(const machine_t *model)
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if defined(DEV_BRANCH) && defined(NO_SIO)
|
||||
int
|
||||
machine_at_tx100_init(const machine_t *model)
|
||||
{
|
||||
@@ -919,4 +937,5 @@ machine_at_advanceii_init(const machine_t *model)
|
||||
spd_register(SPD_TYPE_SDRAM, 0xF, 64);
|
||||
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -156,4 +156,72 @@ machine_at_m6mi_init(const machine_t *model)
|
||||
device_add(&intel_flash_bxt_device);
|
||||
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(DEV_BRANCH) && defined(NO_SIO)
|
||||
int
|
||||
machine_at_vs440fx_init(const machine_t *model)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = bios_load_linear_combined2(L"roms/machines/vs440fx/1011CS1_.BIO",
|
||||
L"roms/machines/vs440fx/1011CS1_.BI1",
|
||||
L"roms/machines/vs440fx/1011CS1_.BI2",
|
||||
L"roms/machines/vs440fx/1011CS1_.BI3",
|
||||
L"roms/machines/vs440fx/1011CS1_.RCV",
|
||||
0x3a000, 128);
|
||||
|
||||
if (bios_only || !ret)
|
||||
return ret;
|
||||
|
||||
machine_at_common_init(model);
|
||||
|
||||
pci_init(PCI_CONFIG_TYPE_1);
|
||||
pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0);
|
||||
pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0);
|
||||
device_add(&i440fx_device);
|
||||
device_add(&piix3_device);
|
||||
device_add(&keyboard_ps2_ami_pci_device);
|
||||
//device_add(&pc87307_device);
|
||||
device_add(&pc87306_device);
|
||||
device_add(&intel_flash_bxt_ami_device);
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
machine_at_p65up5_common_init(const machine_t *model, const device_t *northbridge)
|
||||
{
|
||||
machine_at_common_init(model);
|
||||
|
||||
pci_init(PCI_CONFIG_TYPE_1);
|
||||
pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0);
|
||||
pci_register_slot(0x01, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0);
|
||||
pci_register_slot(0x09, PCI_CARD_NORMAL, 4, 1, 2, 3);
|
||||
pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2);
|
||||
pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1);
|
||||
pci_register_slot(0x0C, PCI_CARD_NORMAL, 1, 2, 3, 4);
|
||||
pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3);
|
||||
device_add(northbridge);
|
||||
device_add(&piix3_device);
|
||||
device_add(&keyboard_ps2_ami_pci_device);
|
||||
device_add(&w83877f_device);
|
||||
device_add(&intel_flash_bxt_device);
|
||||
}
|
||||
|
||||
int
|
||||
machine_at_p65up5_cp6nd_init(const machine_t *model)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = bios_load_linear(L"roms/machines/p65up5/nd6i0218.awd",
|
||||
0x000e0000, 131072, 0);
|
||||
|
||||
if (bios_only || !ret)
|
||||
return ret;
|
||||
|
||||
machine_at_p65up5_common_init(model, &i440fx_device);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -244,28 +244,35 @@ const machine_t machines[] = {
|
||||
{ "[Socket 7 HX] Micronics M7S-Hi", "m7shi", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 511, machine_at_m7shi_init, NULL },
|
||||
{ "[Socket 7 HX] Intel TC430HX", "tc430hx", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 255, machine_at_tc430hx_init, NULL },
|
||||
{ "[Socket 7 HX] Toshiba Equium 5200D", "equium5200", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 192, 8, 127, machine_at_equium5200_init, NULL },
|
||||
{ "[Socket 7 HX] ASUS P/I-P65UP5 (C-P55T2D)","p65up5_cp55t2d", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 127, machine_at_p65up5_cp55t2d_init, NULL },
|
||||
|
||||
/* 430VX */
|
||||
{ "[Socket 7 VX] ASUS P/I-P55TVP4", "p55tvp4", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_p55tvp4_init, NULL },
|
||||
{ "[Socket 7 VX] Shuttle HOT-557", "430vx", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_i430vx_init, NULL },
|
||||
{ "[Socket 7 VX] Epox P55-VA", "p55va", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_p55va_init, NULL },
|
||||
{ "[Socket 7 VX] HP Brio 80xx", "brio80xx", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_brio80xx_init, NULL },
|
||||
{ "[Socket 7 VX] Packard Bell PB680", "pb680", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_pb680_init, NULL },
|
||||
{ "[Socket 7 VX] HP Brio 80xx", "brio80xx", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_brio80xx_init, NULL },
|
||||
{ "[Socket 7 VX] Packard Bell PB680", "pb680", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_pb680_init, NULL },
|
||||
|
||||
/* 430TX */
|
||||
{ "[Socket 7 TX] ASUS TX97", "tx97", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_tx97_init, NULL },
|
||||
#if defined(DEV_BRANCH) && defined(NO_SIO)
|
||||
{ "[Socket 7 TX] Gigabyte GA-586T2", "586t2", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_586t2_init, NULL },
|
||||
#endif
|
||||
{ "[Socket 7 TX] Intel YM430TX", "ym430tx", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_ym430tx_init, NULL },
|
||||
#if defined(DEV_BRANCH) && defined(NO_SIO)
|
||||
{ "[Socket 7 TX] Iwill P55XB2", "p55xb2", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_p55xb2_init, NULL },
|
||||
{ "[Socket 7 TX] PC Partner TXA807DS", "807ds", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_807ds_init, NULL },
|
||||
#endif
|
||||
{ "[Socket 7 TX] SuperMicro P5MMS98", "p5mms98", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 255, machine_at_p5mms98_init, NULL },
|
||||
|
||||
#if defined(DEV_BRANCH) && defined(NO_SIO)
|
||||
/* Apollo VPX */
|
||||
{ "[Socket 7 VPX] Zida Tomato TX100", "tx100", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 127, machine_at_tx100_init, NULL },
|
||||
|
||||
/* Apollo VP3 */
|
||||
{ "[Socket 7 VP3] QDI Advance II", "advanceii", MACHINE_CPUS_PENTIUM_S7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 128, 8, 127, machine_at_advanceii_init, NULL },
|
||||
|
||||
#endif
|
||||
|
||||
/* Super Socket 7 machines */
|
||||
/* Apollo MVP3 */
|
||||
{ "[Super 7 MVP3] AOpen AX59 Pro", "ax59pro", MACHINE_CPUS_PENTIUM_SS7, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 1024, 8, 255, machine_at_ax59pro_init, NULL },
|
||||
@@ -277,19 +284,25 @@ const machine_t machines[] = {
|
||||
{ "[Socket 8 FX] PC Partner MB600N", "mb600n", {{"Intel", cpus_PentiumPro}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 127, machine_at_mb600n_init, NULL },
|
||||
{ "[Socket 8 FX] Biostar MB-8500ttc", "8500ttc", {{"Intel", cpus_PentiumPro}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 127, machine_at_8500ttc_init, NULL },
|
||||
{ "[Socket 8 FX] Micronics M6MI", "m6mi", {{"Intel", cpus_PentiumPro}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 384, 8, 127, machine_at_m6mi_init, NULL },
|
||||
#if defined(DEV_BRANCH) && defined(NO_SIO)
|
||||
{ "[Socket 8 FX] Intel VS440FX", "vs440fx", {{"Intel", cpus_PentiumPro}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 256, 8, 127, machine_at_vs440fx_init, NULL },
|
||||
#endif
|
||||
{ "[Socket 8 FX] ASUS P/I-P65UP5 (C-P6ND)", "p65up5_cp6nd", {{"Intel", cpus_PentiumPro}, {"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 127, machine_at_p65up5_cp6nd_init, NULL },
|
||||
|
||||
|
||||
/* Slot 1 machines */
|
||||
/* 440FX */
|
||||
{ "[Slot 1 FX] ASUS P/I-P65UP5 (C-PKND)", "p65up5_cpknd", {{"Intel", cpus_PentiumII_28v},{"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 512, 8, 127, machine_at_p65up5_cpknd_init, NULL },
|
||||
{ "[Slot 1 FX] ECS P6KFX-A", "p6kfx", {{"Intel", cpus_PentiumII_28v},{"", NULL}, {"", NULL}, {"", NULL}, {"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 384, 8, 127, machine_at_p6kfx_init, NULL },
|
||||
|
||||
/* 440LX */
|
||||
|
||||
/* 440BX */
|
||||
#if defined(DEV_BRANCH) && defined(NO_SIO)
|
||||
{ "[Slot 1 BX] Gigabyte GA-6BXC", "6bxc", {{"Intel", cpus_PentiumII}, {"Intel/PGA370", cpus_Celeron},{"VIA", cpus_Cyrix3},{"", NULL},{"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 768, 8, 255, machine_at_6bxc_init, NULL },
|
||||
#endif
|
||||
{ "[Slot 1 BX] ASUS P2B-LS", "p2bls", {{"Intel", cpus_PentiumII}, {"Intel/PGA370", cpus_Celeron},{"VIA", cpus_Cyrix3},{"", NULL},{"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 1024, 8, 255, machine_at_p2bls_init, NULL },
|
||||
{ "[Slot 1 BX] ASUS P2B-LS (coreboot BIOS)","p2bls_cb", {{"Intel", cpus_PentiumII}, {"Intel/PGA370", cpus_Celeron},{"", NULL}, {"", NULL},{"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC | MACHINE_COREBOOT, 8, 1024, 8, 255, machine_at_p2bls_init, NULL },
|
||||
{ "[Slot 1 BX] ASUS P3B-F", "p3bf", {{"Intel", cpus_PentiumII}, {"Intel/PGA370", cpus_Celeron},{"VIA", cpus_Cyrix3},{"", NULL},{"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 1024, 8, 255, machine_at_p3bf_init, NULL },
|
||||
{ "[Slot 1 BX] ASUS P3B-F (coreboot BIOS)", "p3bf_cb", {{"Intel", cpus_PentiumII}, {"Intel/PGA370", cpus_Celeron},{"", NULL}, {"", NULL},{"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC | MACHINE_COREBOOT, 8, 1024, 8, 255, machine_at_p3bf_init, NULL },
|
||||
{ "[Slot 1 BX] ABit BF6", "bf6", {{"Intel", cpus_PentiumII}, {"Intel/PGA370", cpus_Celeron},{"VIA", cpus_Cyrix3},{"", NULL},{"", NULL}}, MACHINE_PCI | MACHINE_ISA | MACHINE_AT | MACHINE_PS2 | MACHINE_HDC, 8, 768, 8, 255, machine_at_bf6_init, NULL },
|
||||
|
||||
/* 440ZX */
|
||||
|
||||
380
src/mem.c
380
src/mem.c
@@ -115,14 +115,14 @@ uint64_t *byte_code_present_mask;
|
||||
uint32_t purgable_page_list_head = 0;
|
||||
int purgeable_page_count = 0;
|
||||
|
||||
int use_phys_exec = 0;
|
||||
|
||||
|
||||
/* FIXME: re-do this with a 'mem_ops' struct. */
|
||||
static mem_mapping_t *read_mapping[MEM_MAPPINGS_NO];
|
||||
static mem_mapping_t *write_mapping[MEM_MAPPINGS_NO];
|
||||
static uint8_t *_mem_exec[MEM_MAPPINGS_NO];
|
||||
static int _mem_state[MEM_MAPPINGS_NO];
|
||||
static uint8_t *mtrr_areas[MEM_MAPPINGS_NO];
|
||||
static uint8_t mtrr_area_refcounts[MEM_MAPPINGS_NO];
|
||||
|
||||
#if FIXME
|
||||
#if (MEM_GRANULARITY_BITS >= 12)
|
||||
@@ -652,8 +652,6 @@ uint8_t
|
||||
readmembl(uint32_t addr)
|
||||
{
|
||||
uint64_t addr64 = (uint64_t) addr;
|
||||
uint32_t page;
|
||||
uint8_t *mtrr;
|
||||
mem_mapping_t *map;
|
||||
|
||||
mem_logical_addr = addr;
|
||||
@@ -667,12 +665,7 @@ readmembl(uint32_t addr)
|
||||
}
|
||||
addr = (uint32_t) (addr64 & rammask);
|
||||
|
||||
page = (addr >> MEM_GRANULARITY_BITS);
|
||||
mtrr = mtrr_areas[page];
|
||||
if (mtrr)
|
||||
return mtrr[addr & MEM_GRANULARITY_MASK];
|
||||
|
||||
map = read_mapping[page];
|
||||
map = read_mapping[addr >> MEM_GRANULARITY_BITS];
|
||||
if (map && map->read_b)
|
||||
return map->read_b(addr, map->p);
|
||||
|
||||
@@ -684,8 +677,6 @@ void
|
||||
writemembl(uint32_t addr, uint8_t val)
|
||||
{
|
||||
uint64_t addr64 = (uint64_t) addr;
|
||||
uint32_t page;
|
||||
uint8_t *mtrr;
|
||||
mem_mapping_t *map;
|
||||
mem_logical_addr = addr;
|
||||
|
||||
@@ -703,14 +694,7 @@ writemembl(uint32_t addr, uint8_t val)
|
||||
}
|
||||
addr = (uint32_t) (addr64 & rammask);
|
||||
|
||||
page = (addr >> MEM_GRANULARITY_BITS);
|
||||
mtrr = mtrr_areas[page];
|
||||
if (mtrr) {
|
||||
mtrr[addr & MEM_GRANULARITY_MASK] = val;
|
||||
return;
|
||||
}
|
||||
|
||||
map = write_mapping[page];
|
||||
map = write_mapping[addr >> MEM_GRANULARITY_BITS];
|
||||
if (map && map->write_b)
|
||||
map->write_b(addr, val, map->p);
|
||||
}
|
||||
@@ -721,8 +705,6 @@ uint16_t
|
||||
readmemwl(uint32_t addr)
|
||||
{
|
||||
uint64_t addr64 = (uint64_t) addr;
|
||||
uint32_t page;
|
||||
uint8_t *mtrr;
|
||||
mem_mapping_t *map;
|
||||
|
||||
mem_logical_addr = addr;
|
||||
@@ -751,12 +733,7 @@ readmemwl(uint32_t addr)
|
||||
|
||||
addr = (uint32_t) (addr64 & rammask);
|
||||
|
||||
page = (addr >> MEM_GRANULARITY_BITS);
|
||||
mtrr = mtrr_areas[page];
|
||||
if (mtrr)
|
||||
return mtrr[addr & MEM_GRANULARITY_MASK] | ((uint16_t) (mtrr[(addr + 1) & MEM_GRANULARITY_MASK]) << 8);
|
||||
|
||||
map = read_mapping[page];
|
||||
map = read_mapping[addr >> MEM_GRANULARITY_BITS];
|
||||
|
||||
if (map && map->read_w)
|
||||
return map->read_w(addr, map->p);
|
||||
@@ -772,8 +749,6 @@ void
|
||||
writememwl(uint32_t addr, uint16_t val)
|
||||
{
|
||||
uint64_t addr64 = (uint64_t) addr;
|
||||
uint32_t page;
|
||||
uint8_t *mtrr;
|
||||
mem_mapping_t *map;
|
||||
|
||||
mem_logical_addr = addr;
|
||||
@@ -811,15 +786,7 @@ writememwl(uint32_t addr, uint16_t val)
|
||||
|
||||
addr = (uint32_t) (addr64 & rammask);
|
||||
|
||||
page = (addr >> MEM_GRANULARITY_BITS);
|
||||
mtrr = mtrr_areas[page];
|
||||
if (mtrr) {
|
||||
mtrr[addr & MEM_GRANULARITY_MASK] = val;
|
||||
mtrr[(addr + 1) & MEM_GRANULARITY_MASK] = val >> 8;
|
||||
return;
|
||||
}
|
||||
|
||||
map = write_mapping[page];
|
||||
map = write_mapping[addr >> MEM_GRANULARITY_BITS];
|
||||
if (map) {
|
||||
if (map->write_w)
|
||||
map->write_w(addr, val, map->p);
|
||||
@@ -835,8 +802,6 @@ uint32_t
|
||||
readmemll(uint32_t addr)
|
||||
{
|
||||
uint64_t addr64 = (uint64_t) addr;
|
||||
uint32_t page;
|
||||
uint8_t *mtrr;
|
||||
mem_mapping_t *map;
|
||||
|
||||
mem_logical_addr = addr;
|
||||
@@ -866,12 +831,7 @@ readmemll(uint32_t addr)
|
||||
|
||||
addr = (uint32_t) (addr64 & rammask);
|
||||
|
||||
page = (addr >> MEM_GRANULARITY_BITS);
|
||||
mtrr = mtrr_areas[page];
|
||||
if (mtrr)
|
||||
return mtrr[addr & MEM_GRANULARITY_MASK] | ((uint32_t) (mtrr[(addr + 1) & MEM_GRANULARITY_MASK]) << 8) | ((uint32_t) (mtrr[(addr + 2) & MEM_GRANULARITY_MASK]) << 16) | ((uint32_t) (mtrr[(addr + 3) & MEM_GRANULARITY_MASK]) << 24);
|
||||
|
||||
map = read_mapping[page];
|
||||
map = read_mapping[addr >> MEM_GRANULARITY_BITS];
|
||||
if (map) {
|
||||
if (map->read_l)
|
||||
return map->read_l(addr, map->p);
|
||||
@@ -892,8 +852,6 @@ void
|
||||
writememll(uint32_t addr, uint32_t val)
|
||||
{
|
||||
uint64_t addr64 = (uint64_t) addr;
|
||||
uint32_t page;
|
||||
uint8_t *mtrr;
|
||||
mem_mapping_t *map;
|
||||
|
||||
mem_logical_addr = addr;
|
||||
@@ -930,17 +888,7 @@ writememll(uint32_t addr, uint32_t val)
|
||||
|
||||
addr = (uint32_t) (addr64 & rammask);
|
||||
|
||||
page = (addr >> MEM_GRANULARITY_BITS);
|
||||
mtrr = mtrr_areas[page];
|
||||
if (mtrr) {
|
||||
mtrr[addr & MEM_GRANULARITY_MASK] = val;
|
||||
mtrr[(addr + 1) & MEM_GRANULARITY_MASK] = val >> 8;
|
||||
mtrr[(addr + 2) & MEM_GRANULARITY_MASK] = val >> 16;
|
||||
mtrr[(addr + 3) & MEM_GRANULARITY_MASK] = val >> 24;
|
||||
return;
|
||||
}
|
||||
|
||||
map = write_mapping[page];
|
||||
map = write_mapping[addr >> MEM_GRANULARITY_BITS];
|
||||
if (map) {
|
||||
if (map->write_l)
|
||||
map->write_l(addr, val, map->p);
|
||||
@@ -961,8 +909,6 @@ uint64_t
|
||||
readmemql(uint32_t addr)
|
||||
{
|
||||
uint64_t addr64 = (uint64_t) addr;
|
||||
uint32_t page;
|
||||
uint8_t *mtrr;
|
||||
mem_mapping_t *map;
|
||||
|
||||
mem_logical_addr = addr;
|
||||
@@ -991,12 +937,7 @@ readmemql(uint32_t addr)
|
||||
|
||||
addr = (uint32_t) (addr64 & rammask);
|
||||
|
||||
page = (addr >> MEM_GRANULARITY_BITS);
|
||||
mtrr = mtrr_areas[page];
|
||||
if (mtrr)
|
||||
return readmemll(addr) | ((uint64_t)readmemll(addr+4)<<32);
|
||||
|
||||
map = read_mapping[page];
|
||||
map = read_mapping[addr >> MEM_GRANULARITY_BITS];
|
||||
if (map && map->read_l)
|
||||
return map->read_l(addr, map->p) | ((uint64_t)map->read_l(addr + 4, map->p) << 32);
|
||||
|
||||
@@ -1008,8 +949,6 @@ void
|
||||
writememql(uint32_t addr, uint64_t val)
|
||||
{
|
||||
uint64_t addr64 = (uint64_t) addr;
|
||||
uint32_t page;
|
||||
uint8_t *mtrr;
|
||||
mem_mapping_t *map;
|
||||
|
||||
mem_logical_addr = addr;
|
||||
@@ -1046,21 +985,7 @@ writememql(uint32_t addr, uint64_t val)
|
||||
|
||||
addr = (uint32_t) (addr64 & rammask);
|
||||
|
||||
page = (addr >> MEM_GRANULARITY_BITS);
|
||||
mtrr = mtrr_areas[page];
|
||||
if (mtrr) {
|
||||
mtrr[addr & MEM_GRANULARITY_MASK] = val;
|
||||
mtrr[(addr + 1) & MEM_GRANULARITY_MASK] = val >> 8;
|
||||
mtrr[(addr + 2) & MEM_GRANULARITY_MASK] = val >> 16;
|
||||
mtrr[(addr + 3) & MEM_GRANULARITY_MASK] = val >> 24;
|
||||
mtrr[(addr + 4) & MEM_GRANULARITY_MASK] = val >> 32;
|
||||
mtrr[(addr + 5) & MEM_GRANULARITY_MASK] = val >> 40;
|
||||
mtrr[(addr + 6) & MEM_GRANULARITY_MASK] = val >> 48;
|
||||
mtrr[(addr + 7) & MEM_GRANULARITY_MASK] = val >> 56;
|
||||
return;
|
||||
}
|
||||
|
||||
map = write_mapping[page];
|
||||
map = write_mapping[addr >> MEM_GRANULARITY_BITS];
|
||||
if (map) {
|
||||
if (map->write_l) {
|
||||
map->write_l(addr, val, map->p);
|
||||
@@ -1101,8 +1026,6 @@ uint16_t
|
||||
readmemwl(uint32_t seg, uint32_t addr)
|
||||
{
|
||||
uint64_t addr64 = (uint64_t) addr;
|
||||
uint32_t page;
|
||||
uint8_t *mtrr;
|
||||
mem_mapping_t *map;
|
||||
uint32_t addr2 = mem_logical_addr = seg + addr;
|
||||
|
||||
@@ -1134,12 +1057,7 @@ readmemwl(uint32_t seg, uint32_t addr)
|
||||
|
||||
addr2 = (uint32_t) (addr64 & rammask);
|
||||
|
||||
page = (addr2 >> MEM_GRANULARITY_BITS);
|
||||
mtrr = mtrr_areas[page];
|
||||
if (mtrr)
|
||||
return mtrr[addr2 & MEM_GRANULARITY_MASK] | ((uint16_t) (mtrr[(addr2 + 1) & MEM_GRANULARITY_MASK]) << 8);
|
||||
|
||||
map = read_mapping[page];
|
||||
map = read_mapping[addr2 >> MEM_GRANULARITY_BITS];
|
||||
|
||||
if (map && map->read_w)
|
||||
return map->read_w(addr2, map->p);
|
||||
@@ -1161,8 +1079,6 @@ void
|
||||
writememwl(uint32_t seg, uint32_t addr, uint16_t val)
|
||||
{
|
||||
uint64_t addr64 = (uint64_t) addr;
|
||||
uint32_t page;
|
||||
uint8_t *mtrr;
|
||||
mem_mapping_t *map;
|
||||
uint32_t addr2 = mem_logical_addr = seg + addr;
|
||||
|
||||
@@ -1204,15 +1120,7 @@ writememwl(uint32_t seg, uint32_t addr, uint16_t val)
|
||||
|
||||
addr2 = (uint32_t) (addr64 & rammask);
|
||||
|
||||
page = (addr2 >> MEM_GRANULARITY_BITS);
|
||||
mtrr = mtrr_areas[page];
|
||||
if (mtrr) {
|
||||
mtrr[addr2 & MEM_GRANULARITY_MASK] = val;
|
||||
mtrr[(addr2 + 1) & MEM_GRANULARITY_MASK] = val >> 8;
|
||||
return;
|
||||
}
|
||||
|
||||
map = write_mapping[page];
|
||||
map = write_mapping[addr2 >> MEM_GRANULARITY_BITS];
|
||||
|
||||
if (map && map->write_w) {
|
||||
map->write_w(addr2, val, map->p);
|
||||
@@ -1231,8 +1139,6 @@ uint32_t
|
||||
readmemll(uint32_t seg, uint32_t addr)
|
||||
{
|
||||
uint64_t addr64 = (uint64_t) addr;
|
||||
uint32_t page;
|
||||
uint8_t *mtrr;
|
||||
mem_mapping_t *map;
|
||||
uint32_t addr2 = mem_logical_addr = seg + addr;
|
||||
|
||||
@@ -1260,12 +1166,7 @@ readmemll(uint32_t seg, uint32_t addr)
|
||||
|
||||
addr2 = (uint32_t) (addr64 & rammask);
|
||||
|
||||
page = (addr2 >> MEM_GRANULARITY_BITS);
|
||||
mtrr = mtrr_areas[page];
|
||||
if (mtrr)
|
||||
return mtrr[addr2 & MEM_GRANULARITY_MASK] | ((uint32_t) (mtrr[(addr2 + 1) & MEM_GRANULARITY_MASK]) << 8) | ((uint32_t) (mtrr[(addr2 + 2) & MEM_GRANULARITY_MASK]) << 16) | ((uint32_t) (mtrr[(addr2 + 3) & MEM_GRANULARITY_MASK]) << 24);
|
||||
|
||||
map = read_mapping[page];
|
||||
map = read_mapping[addr2 >> MEM_GRANULARITY_BITS];
|
||||
|
||||
if (map && map->read_l)
|
||||
return map->read_l(addr2, map->p);
|
||||
@@ -1288,8 +1189,6 @@ void
|
||||
writememll(uint32_t seg, uint32_t addr, uint32_t val)
|
||||
{
|
||||
uint64_t addr64 = (uint64_t) addr;
|
||||
uint32_t page;
|
||||
uint8_t *mtrr;
|
||||
mem_mapping_t *map;
|
||||
uint32_t addr2 = mem_logical_addr = seg + addr;
|
||||
|
||||
@@ -1326,17 +1225,7 @@ writememll(uint32_t seg, uint32_t addr, uint32_t val)
|
||||
|
||||
addr2 = (uint32_t) (addr64 & rammask);
|
||||
|
||||
page = (addr2 >> MEM_GRANULARITY_BITS);
|
||||
mtrr = mtrr_areas[page];
|
||||
if (mtrr) {
|
||||
mtrr[addr2 & MEM_GRANULARITY_MASK] = val;
|
||||
mtrr[(addr2 + 1) & MEM_GRANULARITY_MASK] = val >> 8;
|
||||
mtrr[(addr2 + 2) & MEM_GRANULARITY_MASK] = val >> 16;
|
||||
mtrr[(addr2 + 3) & MEM_GRANULARITY_MASK] = val >> 24;
|
||||
return;
|
||||
}
|
||||
|
||||
map = write_mapping[page];
|
||||
map = write_mapping[addr2 >> MEM_GRANULARITY_BITS];
|
||||
|
||||
if (map && map->write_l) {
|
||||
map->write_l(addr2, val, map->p);
|
||||
@@ -1361,8 +1250,6 @@ uint64_t
|
||||
readmemql(uint32_t seg, uint32_t addr)
|
||||
{
|
||||
uint64_t addr64 = (uint64_t) addr;
|
||||
uint32_t page;
|
||||
uint8_t *mtrr;
|
||||
mem_mapping_t *map;
|
||||
uint32_t addr2 = mem_logical_addr = seg + addr;
|
||||
|
||||
@@ -1389,12 +1276,7 @@ readmemql(uint32_t seg, uint32_t addr)
|
||||
|
||||
addr2 = (uint32_t) (addr64 & rammask);
|
||||
|
||||
page = (addr2 >> MEM_GRANULARITY_BITS);
|
||||
mtrr = mtrr_areas[page];
|
||||
if (mtrr)
|
||||
return readmemll(seg,addr) | ((uint64_t)readmemll(seg,addr+4)<<32);
|
||||
|
||||
map = read_mapping[page];
|
||||
map = read_mapping[addr2 >> MEM_GRANULARITY_BITS];
|
||||
if (map && map->read_l)
|
||||
return map->read_l(addr2, map->p) | ((uint64_t)map->read_l(addr2 + 4, map->p) << 32);
|
||||
|
||||
@@ -1406,8 +1288,6 @@ void
|
||||
writememql(uint32_t seg, uint32_t addr, uint64_t val)
|
||||
{
|
||||
uint64_t addr64 = (uint64_t) addr;
|
||||
uint32_t page;
|
||||
uint8_t *mtrr;
|
||||
mem_mapping_t *map;
|
||||
uint32_t addr2 = mem_logical_addr = seg + addr;
|
||||
|
||||
@@ -1444,21 +1324,7 @@ writememql(uint32_t seg, uint32_t addr, uint64_t val)
|
||||
|
||||
addr2 = (uint32_t) (addr64 & rammask);
|
||||
|
||||
page = (addr2 >> MEM_GRANULARITY_BITS);
|
||||
mtrr = mtrr_areas[page];
|
||||
if (mtrr) {
|
||||
mtrr[addr2 & MEM_GRANULARITY_MASK] = val;
|
||||
mtrr[(addr2 + 1) & MEM_GRANULARITY_MASK] = val >> 8;
|
||||
mtrr[(addr2 + 2) & MEM_GRANULARITY_MASK] = val >> 16;
|
||||
mtrr[(addr2 + 3) & MEM_GRANULARITY_MASK] = val >> 24;
|
||||
mtrr[(addr2 + 4) & MEM_GRANULARITY_MASK] = val >> 32;
|
||||
mtrr[(addr2 + 5) & MEM_GRANULARITY_MASK] = val >> 40;
|
||||
mtrr[(addr2 + 6) & MEM_GRANULARITY_MASK] = val >> 48;
|
||||
mtrr[(addr2 + 7) & MEM_GRANULARITY_MASK] = val >> 56;
|
||||
return;
|
||||
}
|
||||
|
||||
map = write_mapping[page];
|
||||
map = write_mapping[addr2 >> MEM_GRANULARITY_BITS];
|
||||
|
||||
if (map && map->write_l) {
|
||||
map->write_l(addr2, val, map->p);
|
||||
@@ -1509,7 +1375,9 @@ mem_readb_phys(uint32_t addr)
|
||||
{
|
||||
mem_mapping_t *map = read_mapping[addr >> MEM_GRANULARITY_BITS];
|
||||
|
||||
if (_mem_exec[addr >> MEM_GRANULARITY_BITS])
|
||||
mem_logical_addr = 0xffffffff;
|
||||
|
||||
if (use_phys_exec && _mem_exec[addr >> MEM_GRANULARITY_BITS])
|
||||
return _mem_exec[addr >> MEM_GRANULARITY_BITS][addr & MEM_GRANULARITY_MASK];
|
||||
else if (map && map->read_b)
|
||||
return map->read_b(addr, map->p);
|
||||
@@ -1524,10 +1392,12 @@ mem_readw_phys(uint32_t addr)
|
||||
mem_mapping_t *map = read_mapping[addr >> MEM_GRANULARITY_BITS];
|
||||
uint16_t temp, *p;
|
||||
|
||||
if ((addr <= MEM_GRANULARITY_HBOUND) && (_mem_exec[addr >> MEM_GRANULARITY_BITS])) {
|
||||
mem_logical_addr = 0xffffffff;
|
||||
|
||||
if (use_phys_exec && ((addr & MEM_GRANULARITY_MASK) <= MEM_GRANULARITY_HBOUND) && (_mem_exec[addr >> MEM_GRANULARITY_BITS])) {
|
||||
p = (uint16_t *) &(_mem_exec[addr >> MEM_GRANULARITY_BITS][addr & MEM_GRANULARITY_MASK]);
|
||||
return *p;
|
||||
} else if ((addr <= MEM_GRANULARITY_HBOUND) && (map && map->read_w))
|
||||
} else if (((addr & MEM_GRANULARITY_MASK) <= MEM_GRANULARITY_HBOUND) && (map && map->read_w))
|
||||
return map->read_w(addr, map->p);
|
||||
else {
|
||||
temp = mem_readb_phys(addr + 1) << 8;
|
||||
@@ -1544,10 +1414,12 @@ mem_readl_phys(uint32_t addr)
|
||||
mem_mapping_t *map = read_mapping[addr >> MEM_GRANULARITY_BITS];
|
||||
uint32_t temp, *p;
|
||||
|
||||
if ((addr <= MEM_GRANULARITY_QBOUND) && (_mem_exec[addr >> MEM_GRANULARITY_BITS])) {
|
||||
mem_logical_addr = 0xffffffff;
|
||||
|
||||
if (use_phys_exec && ((addr & MEM_GRANULARITY_MASK) <= MEM_GRANULARITY_QBOUND) && (_mem_exec[addr >> MEM_GRANULARITY_BITS])) {
|
||||
p = (uint32_t *) &(_mem_exec[addr >> MEM_GRANULARITY_BITS][addr & MEM_GRANULARITY_MASK]);
|
||||
return *p;
|
||||
} else if ((addr <= MEM_GRANULARITY_QBOUND) && (map && map->read_l))
|
||||
} else if (((addr & MEM_GRANULARITY_MASK) <= MEM_GRANULARITY_QBOUND) && (map && map->read_l))
|
||||
return map->read_l(addr, map->p);
|
||||
else {
|
||||
temp = mem_readw_phys(addr + 2) << 16;
|
||||
@@ -1558,12 +1430,34 @@ mem_readl_phys(uint32_t addr)
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
mem_read_phys(void *dest, uint32_t addr, int transfer_size)
|
||||
{
|
||||
uint8_t *pb;
|
||||
uint16_t *pw;
|
||||
uint32_t *pl;
|
||||
|
||||
if (transfer_size == 4) {
|
||||
pl = (uint32_t *) dest;
|
||||
*pl = mem_readl_phys(addr);
|
||||
} else if (transfer_size == 2) {
|
||||
pw = (uint16_t *) dest;
|
||||
*pw = mem_readw_phys(addr);
|
||||
} else if (transfer_size == 1) {
|
||||
pb = (uint8_t *) dest;
|
||||
*pb = mem_readb_phys(addr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
mem_writeb_phys(uint32_t addr, uint8_t val)
|
||||
{
|
||||
mem_mapping_t *map = write_mapping[addr >> MEM_GRANULARITY_BITS];
|
||||
|
||||
if (_mem_exec[addr >> MEM_GRANULARITY_BITS])
|
||||
mem_logical_addr = 0xffffffff;
|
||||
|
||||
if (use_phys_exec && _mem_exec[addr >> MEM_GRANULARITY_BITS])
|
||||
_mem_exec[addr >> MEM_GRANULARITY_BITS][addr & MEM_GRANULARITY_MASK] = val;
|
||||
else if (map && map->write_b)
|
||||
map->write_b(addr, val, map->p);
|
||||
@@ -1576,10 +1470,12 @@ mem_writew_phys(uint32_t addr, uint16_t val)
|
||||
mem_mapping_t *map = write_mapping[addr >> MEM_GRANULARITY_BITS];
|
||||
uint16_t *p;
|
||||
|
||||
if ((addr <= MEM_GRANULARITY_HBOUND) && (_mem_exec[addr >> MEM_GRANULARITY_BITS])) {
|
||||
mem_logical_addr = 0xffffffff;
|
||||
|
||||
if (use_phys_exec && ((addr & MEM_GRANULARITY_MASK) <= MEM_GRANULARITY_HBOUND) && (_mem_exec[addr >> MEM_GRANULARITY_BITS])) {
|
||||
p = (uint16_t *) &(_mem_exec[addr >> MEM_GRANULARITY_BITS][addr & MEM_GRANULARITY_MASK]);
|
||||
*p = val;
|
||||
} else if ((addr <= MEM_GRANULARITY_HBOUND) && (map && map->write_w))
|
||||
} else if (((addr & MEM_GRANULARITY_MASK) <= MEM_GRANULARITY_HBOUND) && (map && map->write_w))
|
||||
map->write_w(addr, val, map->p);
|
||||
else {
|
||||
mem_writeb_phys(addr, val & 0xff);
|
||||
@@ -1594,10 +1490,12 @@ mem_writel_phys(uint32_t addr, uint32_t val)
|
||||
mem_mapping_t *map = write_mapping[addr >> MEM_GRANULARITY_BITS];
|
||||
uint32_t *p;
|
||||
|
||||
if ((addr <= MEM_GRANULARITY_QBOUND) && (_mem_exec[addr >> MEM_GRANULARITY_BITS])) {
|
||||
mem_logical_addr = 0xffffffff;
|
||||
|
||||
if (use_phys_exec && ((addr & MEM_GRANULARITY_MASK) <= MEM_GRANULARITY_QBOUND) && (_mem_exec[addr >> MEM_GRANULARITY_BITS])) {
|
||||
p = (uint32_t *) &(_mem_exec[addr >> MEM_GRANULARITY_BITS][addr & MEM_GRANULARITY_MASK]);
|
||||
*p = val;
|
||||
} else if ((addr <= MEM_GRANULARITY_QBOUND) && (map && map->write_l))
|
||||
} else if (((addr & MEM_GRANULARITY_MASK) <= MEM_GRANULARITY_QBOUND) && (map && map->write_l))
|
||||
map->write_l(addr, val, map->p);
|
||||
else {
|
||||
mem_writew_phys(addr, val & 0xffff);
|
||||
@@ -1606,6 +1504,26 @@ mem_writel_phys(uint32_t addr, uint32_t val)
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
mem_write_phys(void *src, uint32_t addr, int transfer_size)
|
||||
{
|
||||
uint8_t *pb;
|
||||
uint16_t *pw;
|
||||
uint32_t *pl;
|
||||
|
||||
if (transfer_size == 4) {
|
||||
pl = (uint32_t *) src;
|
||||
mem_writel_phys(addr, *pl);
|
||||
} else if (transfer_size == 2) {
|
||||
pw = (uint16_t *) src;
|
||||
mem_writew_phys(addr, *pw);
|
||||
} else if (transfer_size == 1) {
|
||||
pb = (uint8_t *) src;
|
||||
mem_writeb_phys(addr, *pb);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
uint8_t
|
||||
mem_read_ram(uint32_t addr, void *priv)
|
||||
{
|
||||
@@ -2463,37 +2381,20 @@ mem_log("MEM: reset: new pages=%08lx, pages_sz=%i\n", pages, pages_sz);
|
||||
|
||||
memset(pages, 0x00, pages_sz*sizeof(page_t));
|
||||
|
||||
for (c = 0; c < MEM_MAPPINGS_NO; c++) {
|
||||
if (mtrr_areas[c]) {
|
||||
free(mtrr_areas[c]);
|
||||
mtrr_areas[c] = 0;
|
||||
}
|
||||
mtrr_area_refcounts[c] = 0;
|
||||
}
|
||||
|
||||
#ifdef USE_NEW_DYNAREC
|
||||
if (machines[machine].flags & MACHINE_COREBOOT) {
|
||||
/* coreboot executes code from the BIOS area, thus
|
||||
requiring byte_*_mask for the entire address space,
|
||||
which significantly increases memory usage. */
|
||||
c = ((uint64_t) (pages_sz) * MEM_GRANULARITY_SIZE) / 8;
|
||||
} else {
|
||||
c = (mem_size * 1024) / 8;
|
||||
}
|
||||
|
||||
if (byte_dirty_mask) {
|
||||
free(byte_dirty_mask);
|
||||
byte_dirty_mask = NULL;
|
||||
}
|
||||
byte_dirty_mask = malloc(c);
|
||||
memset(byte_dirty_mask, 0, c);
|
||||
byte_dirty_mask = malloc((mem_size * 1024) / 8);
|
||||
memset(byte_dirty_mask, 0, (mem_size * 1024) / 8);
|
||||
|
||||
if (byte_code_present_mask) {
|
||||
free(byte_code_present_mask);
|
||||
byte_code_present_mask = NULL;
|
||||
}
|
||||
byte_code_present_mask = malloc(c);
|
||||
memset(byte_code_present_mask, 0, c);
|
||||
byte_code_present_mask = malloc((mem_size * 1024) / 8);
|
||||
memset(byte_code_present_mask, 0, (mem_size * 1024) / 8);
|
||||
#endif
|
||||
|
||||
for (c = 0; c < pages_sz; c++) {
|
||||
@@ -2596,8 +2497,6 @@ mem_init(void)
|
||||
writelookup2 = malloc((1<<20)*sizeof(uintptr_t));
|
||||
#endif
|
||||
|
||||
memset(mtrr_areas, 0x00, MEM_MAPPINGS_NO*sizeof(uint8_t *));
|
||||
|
||||
#if FIXME
|
||||
memset(ff_array, 0xff, sizeof(ff_array));
|
||||
#endif
|
||||
@@ -2695,118 +2594,3 @@ mem_a20_recalc(void)
|
||||
|
||||
mem_a20_state = state;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
mem_add_mtrr(uint64_t base, uint64_t mask, uint8_t type)
|
||||
{
|
||||
uint64_t size = ((~mask) & 0xffffffff) + 1;
|
||||
uint64_t page_base, page, addr;
|
||||
uint8_t *mtrr;
|
||||
|
||||
mem_log("Adding MTRR base=%08llx mask=%08llx size=%08llx type=%d\n", base, mask, size, type);
|
||||
|
||||
if (size > 0x8000) {
|
||||
mem_log("Ignoring MTRR, size too big\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (mem_addr_is_ram(base)) {
|
||||
mem_log("Ignoring MTRR, base is in RAM\n");
|
||||
return;
|
||||
}
|
||||
|
||||
for (page_base = base; page_base < base + size; page_base += MEM_GRANULARITY_SIZE) {
|
||||
page = (page_base >> MEM_GRANULARITY_BITS);
|
||||
if (mtrr_areas[page]) {
|
||||
/* area already allocated, increase refcount and don't allocate it again */
|
||||
mtrr_area_refcounts[page]++;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* allocate area */
|
||||
mtrr = malloc(MEM_GRANULARITY_SIZE);
|
||||
if (!mtrr)
|
||||
fatal("Failed to allocate page for MTRR page %08llx (errno=%d)\n", page_base, errno);
|
||||
|
||||
|
||||
/* populate area with data from RAM */
|
||||
for (addr = 0; addr < MEM_GRANULARITY_SIZE; addr++) {
|
||||
mtrr[addr] = readmembl(page_base | addr);
|
||||
}
|
||||
|
||||
/* enable area */
|
||||
mtrr_areas[page] = mtrr;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
mem_del_mtrr(uint64_t base, uint64_t mask)
|
||||
{
|
||||
uint64_t size = ((~mask) & 0xffffffff) + 1;
|
||||
uint64_t page_base, page;
|
||||
|
||||
mem_log("Deleting MTRR base=%08llx mask=%08llx size=%08llx\n", base, mask, size);
|
||||
|
||||
if (size > 0x8000) {
|
||||
mem_log("Ignoring MTRR, size too big\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (mem_addr_is_ram(base)) {
|
||||
mem_log("Ignoring MTRR, base is in RAM\n");
|
||||
return;
|
||||
}
|
||||
|
||||
for (page_base = base; page_base < base + size; page_base += MEM_GRANULARITY_SIZE) {
|
||||
page = (page_base >> MEM_GRANULARITY_BITS);
|
||||
if (mtrr_areas[page]) {
|
||||
/* decrease reference count */
|
||||
if (mtrr_area_refcounts[page] > 0)
|
||||
mtrr_area_refcounts[page]--;
|
||||
|
||||
/* if no references are left, de-allocate area */
|
||||
if (mtrr_area_refcounts[page] == 0) {
|
||||
free(mtrr_areas[page]);
|
||||
mtrr_areas[page] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
mem_invalidate_mtrr(uint8_t wb)
|
||||
{
|
||||
uint64_t page, page_base, addr;
|
||||
uint8_t *mtrr;
|
||||
|
||||
mem_log("Invalidating cache (writeback=%d)\n", wb);
|
||||
for (page = 0; page < MEM_MAPPINGS_NO; page++) {
|
||||
mtrr = mtrr_areas[page];
|
||||
if (mtrr) {
|
||||
page_base = (page << MEM_GRANULARITY_BITS);
|
||||
if (!mem_addr_is_ram(page_base))
|
||||
continue; /* don't invalidate pages not backed by RAM */
|
||||
|
||||
/* temporarily set area aside */
|
||||
mtrr_areas[page] = 0;
|
||||
|
||||
/* write data back to memory if requested */
|
||||
if (wb && write_mapping[page]) { /* don't write back to a page which can't be written to */
|
||||
for (addr = 0; addr < MEM_GRANULARITY_SIZE; addr++) {
|
||||
writemembl(page_base | addr, mtrr[addr]);
|
||||
}
|
||||
}
|
||||
|
||||
/* re-populate area with data from memory */
|
||||
for (addr = 0; addr < MEM_GRANULARITY_SIZE; addr++) {
|
||||
mtrr[addr] = readmembl(page_base | addr);
|
||||
}
|
||||
|
||||
/* re-enable area */
|
||||
mtrr_areas[page] = mtrr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1071,7 +1071,7 @@ nic_pci_write(int func, int addr, uint8_t val, void *priv)
|
||||
dev->pci_bar[1].addr_regs[addr & 3] = val;
|
||||
/* dev->pci_bar[1].addr_regs[1] &= dev->bios_mask; */
|
||||
dev->pci_bar[1].addr &= 0xffff8001;
|
||||
dev->bios_addr = dev->pci_bar[1].addr;
|
||||
dev->bios_addr = dev->pci_bar[1].addr & 0xffff8000;
|
||||
nic_update_bios(dev);
|
||||
return;
|
||||
|
||||
@@ -1265,13 +1265,6 @@ nic_init(const device_t *info)
|
||||
dev->dp8390->priv = dev;
|
||||
dev->dp8390->interrupt = nic_interrupt;
|
||||
|
||||
memcpy(dev->dp8390->physaddr, dev->maclocal, sizeof(dev->maclocal));
|
||||
|
||||
nelog(2, "%s: I/O=%04x, IRQ=%d, MAC=%02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
dev->name, dev->base_address, dev->base_irq,
|
||||
dev->dp8390->physaddr[0], dev->dp8390->physaddr[1], dev->dp8390->physaddr[2],
|
||||
dev->dp8390->physaddr[3], dev->dp8390->physaddr[4], dev->dp8390->physaddr[5]);
|
||||
|
||||
switch(dev->board) {
|
||||
case NE2K_NE1000:
|
||||
dev->maclocal[0] = 0x00; /* 00:00:D8 (Novell OID) */
|
||||
@@ -1321,6 +1314,13 @@ nic_init(const device_t *info)
|
||||
break;
|
||||
}
|
||||
|
||||
memcpy(dev->dp8390->physaddr, dev->maclocal, sizeof(dev->maclocal));
|
||||
|
||||
nelog(2, "%s: I/O=%04x, IRQ=%d, MAC=%02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
dev->name, dev->base_address, dev->base_irq,
|
||||
dev->dp8390->physaddr[0], dev->dp8390->physaddr[1], dev->dp8390->physaddr[2],
|
||||
dev->dp8390->physaddr[3], dev->dp8390->physaddr[4], dev->dp8390->physaddr[5]);
|
||||
|
||||
/*
|
||||
* Make this device known to the I/O system.
|
||||
* PnP and PCI devices start with address spaces inactive.
|
||||
|
||||
@@ -166,6 +166,7 @@ poll_thread(void *arg)
|
||||
uint32_t mac_cmp32[2];
|
||||
uint16_t mac_cmp16[2];
|
||||
event_t *evt;
|
||||
int tx;
|
||||
|
||||
pcap_log("PCAP: polling started.\n");
|
||||
thread_set_event(poll_state);
|
||||
@@ -181,16 +182,16 @@ poll_thread(void *arg)
|
||||
/* Wait for a poll request. */
|
||||
network_poll();
|
||||
|
||||
if (pcap == NULL) break;
|
||||
if (pcap == NULL)
|
||||
break;
|
||||
|
||||
/* Wait for the next packet to arrive. */
|
||||
tx = network_tx_queue_check();
|
||||
if (network_get_wait() || (poll_card->set_link_state && poll_card->set_link_state(poll_card->priv)) || (poll_card->wait && poll_card->wait(poll_card->priv)))
|
||||
data = NULL;
|
||||
else
|
||||
data = (uint8_t *)f_pcap_next((void *)pcap, &h);
|
||||
if (data != NULL) {
|
||||
// ui_sb_update_icon(SB_NETWORK, 1);
|
||||
|
||||
/* Received MAC. */
|
||||
mac_cmp32[0] = *(uint32_t *)(data+6);
|
||||
mac_cmp16[0] = *(uint16_t *)(data+10);
|
||||
@@ -201,18 +202,19 @@ poll_thread(void *arg)
|
||||
if ((mac_cmp32[0] != mac_cmp32[1]) ||
|
||||
(mac_cmp16[0] != mac_cmp16[1])) {
|
||||
|
||||
poll_card->rx(poll_card->priv, data, h.caplen);
|
||||
network_queue_put(0, poll_card->priv, data, h.caplen);
|
||||
} else {
|
||||
/* Mark as invalid packet. */
|
||||
data = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (tx)
|
||||
network_do_tx();
|
||||
|
||||
/* If we did not get anything, wait a while. */
|
||||
if (data == NULL) {
|
||||
// ui_sb_update_icon(SB_NETWORK, 0);
|
||||
if ((data == NULL) && !tx)
|
||||
thread_wait_event(evt, 10);
|
||||
}
|
||||
|
||||
/* Release ownership of the device. */
|
||||
network_wait(0);
|
||||
@@ -294,17 +296,8 @@ net_pcap_init(void)
|
||||
char *str;
|
||||
|
||||
/* Did we already load the library? */
|
||||
if (pcap_handle == NULL) return(-1);
|
||||
#if 0
|
||||
// no, we don't..
|
||||
/* Load the DLL if needed. We already know it exists. */
|
||||
#ifdef _WIN32
|
||||
pcap_handle = dynld_module("wpcap.dll", pcap_imports);
|
||||
#else
|
||||
pcap_handle = dynld_module("libpcap.so", pcap_imports);
|
||||
#endif
|
||||
if (pcap_handle == NULL) return(-1);
|
||||
#endif
|
||||
if (pcap_handle == NULL)
|
||||
return(-1);
|
||||
|
||||
/* Get the PCAP library name and version. */
|
||||
strcpy(errbuf, f_pcap_lib_version());
|
||||
@@ -332,8 +325,6 @@ net_pcap_close(void)
|
||||
{
|
||||
void *pc;
|
||||
|
||||
// ui_sb_update_icon(SB_NETWORK, 0);
|
||||
|
||||
if (pcap == NULL) return;
|
||||
|
||||
pcap_log("PCAP: closing.\n");
|
||||
@@ -359,15 +350,6 @@ net_pcap_close(void)
|
||||
/* OK, now shut down Pcap itself. */
|
||||
f_pcap_close(pc);
|
||||
pcap = NULL;
|
||||
|
||||
#if 0
|
||||
// no, we don't..
|
||||
/* Unload the DLL if possible. */
|
||||
if (pcap_handle != NULL) {
|
||||
dynld_close((void *)pcap_handle);
|
||||
pcap_handle = NULL;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -389,8 +371,6 @@ net_pcap_reset(const netcard_t *card, uint8_t *mac)
|
||||
char filter_exp[255];
|
||||
struct bpf_program fp;
|
||||
|
||||
// ui_sb_update_icon(SB_NETWORK, 0);
|
||||
|
||||
/* Open a PCAP live channel. */
|
||||
if ((pcap = f_pcap_open_live(network_host, /* interface name */
|
||||
1518, /* max packet size */
|
||||
@@ -437,15 +417,8 @@ net_pcap_reset(const netcard_t *card, uint8_t *mac)
|
||||
void
|
||||
net_pcap_in(uint8_t *bufp, int len)
|
||||
{
|
||||
if (pcap == NULL) return;
|
||||
|
||||
// ui_sb_update_icon(SB_NETWORK, 1);
|
||||
|
||||
network_busy(1);
|
||||
if (pcap == NULL)
|
||||
return;
|
||||
|
||||
f_pcap_sendpacket((void *)pcap, bufp, len);
|
||||
|
||||
network_busy(0);
|
||||
|
||||
// ui_sb_update_icon(SB_NETWORK, 0);
|
||||
}
|
||||
|
||||
@@ -240,6 +240,7 @@ typedef struct {
|
||||
uint32_t cLinkDownReported;
|
||||
/** MS to wait before we enable the link. */
|
||||
uint32_t cMsLinkUpDelay;
|
||||
int transfer_size;
|
||||
uint8_t maclocal[6]; /* configured MAC (local) address */
|
||||
pc_timer_t timer_soft_int, timer_restore;
|
||||
} nic_t;
|
||||
@@ -423,6 +424,7 @@ pcnetIsLinkUp(nic_t *dev)
|
||||
return !dev->fLinkTempDown && dev->fLinkUp;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Load transmit message descriptor
|
||||
* Make sure we read the own flag first.
|
||||
@@ -435,34 +437,44 @@ pcnetIsLinkUp(nic_t *dev)
|
||||
static __inline int
|
||||
pcnetTmdLoad(nic_t *dev, TMD *tmd, uint32_t addr, int fRetIfNotOwn)
|
||||
{
|
||||
uint8_t ownbyte;
|
||||
uint8_t ownbyte, bytes[4] = { 0, 0, 0, 0 };
|
||||
uint16_t xda[4];
|
||||
uint32_t xda32[4];
|
||||
|
||||
use_phys_exec = 1;
|
||||
|
||||
if (BCR_SWSTYLE(dev) == 0) {
|
||||
uint16_t xda[4];
|
||||
|
||||
DMAPageRead(addr+3, &ownbyte, 1);
|
||||
if (!(ownbyte & 0x80) && fRetIfNotOwn)
|
||||
dma_bm_read(addr, (uint8_t *) bytes, 4, dev->transfer_size);
|
||||
ownbyte = bytes[3];
|
||||
if (!(ownbyte & 0x80) && fRetIfNotOwn) {
|
||||
use_phys_exec = 0;
|
||||
return 0;
|
||||
DMAPageRead(addr, (uint8_t*)&xda[0], sizeof(xda));
|
||||
}
|
||||
dma_bm_read(addr, (uint8_t*)&xda[0], sizeof(xda), dev->transfer_size);
|
||||
((uint32_t *)tmd)[0] = (uint32_t)xda[0] | ((uint32_t)(xda[1] & 0x00ff) << 16);
|
||||
((uint32_t *)tmd)[1] = (uint32_t)xda[2] | ((uint32_t)(xda[1] & 0xff00) << 16);
|
||||
((uint32_t *)tmd)[2] = (uint32_t)xda[3] << 16;
|
||||
((uint32_t *)tmd)[3] = 0;
|
||||
} else if (BCR_SWSTYLE(dev) != 3) {
|
||||
DMAPageRead(addr+7, &ownbyte, 1);
|
||||
if (!(ownbyte & 0x80) && fRetIfNotOwn)
|
||||
dma_bm_read(addr + 4, (uint8_t *) bytes, 4, dev->transfer_size);
|
||||
ownbyte = bytes[3];
|
||||
if (!(ownbyte & 0x80) && fRetIfNotOwn) {
|
||||
use_phys_exec = 0;
|
||||
return 0;
|
||||
DMAPageRead(addr, (uint8_t*)tmd, 16);
|
||||
}
|
||||
dma_bm_read(addr, (uint8_t*)tmd, 16, dev->transfer_size);
|
||||
} else {
|
||||
uint32_t xda[4];
|
||||
DMAPageRead(addr+7, &ownbyte, 1);
|
||||
if (!(ownbyte & 0x80) && fRetIfNotOwn)
|
||||
dma_bm_read(addr + 4, (uint8_t *) bytes, 4, dev->transfer_size);
|
||||
ownbyte = bytes[3];
|
||||
if (!(ownbyte & 0x80) && fRetIfNotOwn) {
|
||||
use_phys_exec = 0;
|
||||
return 0;
|
||||
DMAPageRead(addr, (uint8_t*)&xda[0], sizeof(xda));
|
||||
((uint32_t *)tmd)[0] = xda[2];
|
||||
((uint32_t *)tmd)[1] = xda[1];
|
||||
((uint32_t *)tmd)[2] = xda[0];
|
||||
((uint32_t *)tmd)[3] = xda[3];
|
||||
}
|
||||
dma_bm_read(addr, (uint8_t*)&xda32[0], sizeof(xda32), dev->transfer_size);
|
||||
((uint32_t *)tmd)[0] = xda32[2];
|
||||
((uint32_t *)tmd)[1] = xda32[1];
|
||||
((uint32_t *)tmd)[2] = xda32[0];
|
||||
((uint32_t *)tmd)[3] = xda32[3];
|
||||
}
|
||||
/* Double check the own bit; guest drivers might be buggy and lock prefixes in the recompiler are ignored by other threads. */
|
||||
if (tmd->tmd1.own == 1 && !(ownbyte & 0x80))
|
||||
@@ -470,6 +482,8 @@ pcnetTmdLoad(nic_t *dev, TMD *tmd, uint32_t addr, int fRetIfNotOwn)
|
||||
if (!(ownbyte & 0x80))
|
||||
tmd->tmd1.own = 0;
|
||||
|
||||
use_phys_exec = 0;
|
||||
|
||||
return !!tmd->tmd1.own;
|
||||
}
|
||||
|
||||
@@ -481,31 +495,42 @@ pcnetTmdLoad(nic_t *dev, TMD *tmd, uint32_t addr, int fRetIfNotOwn)
|
||||
static __inline void
|
||||
pcnetTmdStorePassHost(nic_t *dev, TMD *tmd, uint32_t addr)
|
||||
{
|
||||
uint16_t xda[4];
|
||||
uint32_t xda32[3];
|
||||
|
||||
use_phys_exec = 1;
|
||||
|
||||
if (BCR_SWSTYLE(dev) == 0) {
|
||||
uint16_t xda[4];
|
||||
xda[0] = ((uint32_t *)tmd)[0] & 0xffff;
|
||||
xda[1] = ((((uint32_t *)tmd)[0] >> 16) & 0xff) | ((((uint32_t *)tmd)[1]>>16) & 0xff00);
|
||||
xda[2] = ((uint32_t *)tmd)[1] & 0xffff;
|
||||
xda[3] = ((uint32_t *)tmd)[2] >> 16;
|
||||
#if 0
|
||||
xda[1] |= 0x8000;
|
||||
DMAPageWrite(addr, (uint8_t*)&xda[0], sizeof(xda));
|
||||
dma_bm_write(addr, (uint8_t*)&xda[0], sizeof(xda), dev->transfer_size);
|
||||
#endif
|
||||
xda[1] &= ~0x8000;
|
||||
DMAPageWrite(addr+3, (uint8_t*)xda + 3, 1);
|
||||
dma_bm_write(addr, (uint8_t*)&xda[0], sizeof(xda), dev->transfer_size);
|
||||
} else if (BCR_SWSTYLE(dev) != 3) {
|
||||
#if 0
|
||||
((uint32_t*)tmd)[1] |= 0x80000000;
|
||||
DMAPageWrite(addr, (uint8_t*)tmd, 12);
|
||||
dma_bm_write(addr, (uint8_t*)tmd, 12, dev->transfer_size);
|
||||
#endif
|
||||
((uint32_t*)tmd)[1] &= ~0x80000000;
|
||||
DMAPageWrite(addr+7, (uint8_t*)tmd + 7, 1);
|
||||
dma_bm_write(addr, (uint8_t*)tmd, 12, dev->transfer_size);
|
||||
} else {
|
||||
uint32_t xda[3];
|
||||
xda[0] = ((uint32_t *)tmd)[2];
|
||||
xda[1] = ((uint32_t *)tmd)[1];
|
||||
xda[2] = ((uint32_t *)tmd)[0];
|
||||
xda[1] |= 0x80000000;
|
||||
DMAPageWrite(addr, (uint8_t*)&xda[0], sizeof(xda));
|
||||
xda[1] &= ~0x80000000;
|
||||
DMAPageWrite(addr+7, (uint8_t*)xda + 7, 1);
|
||||
xda32[0] = ((uint32_t *)tmd)[2];
|
||||
xda32[1] = ((uint32_t *)tmd)[1];
|
||||
xda32[2] = ((uint32_t *)tmd)[0];
|
||||
#if 0
|
||||
xda32[1] |= 0x80000000;
|
||||
dma_bm_write(addr, (uint8_t*)&xda32[0], sizeof(xda32), dev->transfer_size);
|
||||
#endif
|
||||
xda32[1] &= ~0x80000000;
|
||||
dma_bm_write(addr, (uint8_t*)&xda32[0], sizeof(xda32), dev->transfer_size);
|
||||
}
|
||||
|
||||
use_phys_exec = 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -521,33 +546,44 @@ pcnetTmdStorePassHost(nic_t *dev, TMD *tmd, uint32_t addr)
|
||||
static __inline int
|
||||
pcnetRmdLoad(nic_t *dev, RMD *rmd, uint32_t addr, int fRetIfNotOwn)
|
||||
{
|
||||
uint8_t ownbyte;
|
||||
uint8_t ownbyte, bytes[4] = { 0, 0, 0, 0 };
|
||||
uint16_t rda[4];
|
||||
uint32_t rda32[4];
|
||||
|
||||
use_phys_exec = 1;
|
||||
|
||||
if (BCR_SWSTYLE(dev) == 0) {
|
||||
uint16_t rda[4];
|
||||
DMAPageRead(addr+3, &ownbyte, 1);
|
||||
if (!(ownbyte & 0x80) && fRetIfNotOwn)
|
||||
dma_bm_read(addr, (uint8_t *) bytes, 4, dev->transfer_size);
|
||||
ownbyte = bytes[3];
|
||||
if (!(ownbyte & 0x80) && fRetIfNotOwn) {
|
||||
use_phys_exec = 0;
|
||||
return 0;
|
||||
DMAPageRead(addr, (uint8_t*)&rda[0], sizeof(rda));
|
||||
}
|
||||
dma_bm_read(addr, (uint8_t*)&rda[0], sizeof(rda), dev->transfer_size);
|
||||
((uint32_t *)rmd)[0] = (uint32_t)rda[0] | ((rda[1] & 0x00ff) << 16);
|
||||
((uint32_t *)rmd)[1] = (uint32_t)rda[2] | ((rda[1] & 0xff00) << 16);
|
||||
((uint32_t *)rmd)[2] = (uint32_t)rda[3];
|
||||
((uint32_t *)rmd)[3] = 0;
|
||||
} else if (BCR_SWSTYLE(dev) != 3) {
|
||||
DMAPageRead(addr+7, &ownbyte, 1);
|
||||
if (!(ownbyte & 0x80) && fRetIfNotOwn)
|
||||
dma_bm_read(addr + 4, (uint8_t *) bytes, 4, dev->transfer_size);
|
||||
ownbyte = bytes[3];
|
||||
if (!(ownbyte & 0x80) && fRetIfNotOwn) {
|
||||
use_phys_exec = 0;
|
||||
return 0;
|
||||
DMAPageRead(addr, (uint8_t*)rmd, 16);
|
||||
}
|
||||
dma_bm_read(addr, (uint8_t*)rmd, 16, dev->transfer_size);
|
||||
} else {
|
||||
uint32_t rda[4];
|
||||
DMAPageRead(addr+7, &ownbyte, 1);
|
||||
if (!(ownbyte & 0x80) && fRetIfNotOwn)
|
||||
dma_bm_read(addr + 4, (uint8_t *) bytes, 4, dev->transfer_size);
|
||||
ownbyte = bytes[3];
|
||||
if (!(ownbyte & 0x80) && fRetIfNotOwn) {
|
||||
use_phys_exec = 0;
|
||||
return 0;
|
||||
DMAPageRead(addr, (uint8_t*)&rda[0], sizeof(rda));
|
||||
((uint32_t *)rmd)[0] = rda[2];
|
||||
((uint32_t *)rmd)[1] = rda[1];
|
||||
((uint32_t *)rmd)[2] = rda[0];
|
||||
((uint32_t *)rmd)[3] = rda[3];
|
||||
}
|
||||
dma_bm_read(addr, (uint8_t*)&rda32[0], sizeof(rda32), dev->transfer_size);
|
||||
((uint32_t *)rmd)[0] = rda32[2];
|
||||
((uint32_t *)rmd)[1] = rda32[1];
|
||||
((uint32_t *)rmd)[2] = rda32[0];
|
||||
((uint32_t *)rmd)[3] = rda32[3];
|
||||
}
|
||||
/* Double check the own bit; guest drivers might be buggy and lock prefixes in the recompiler are ignored by other threads. */
|
||||
if (rmd->rmd1.own == 1 && !(ownbyte & 0x80))
|
||||
@@ -556,6 +592,8 @@ pcnetRmdLoad(nic_t *dev, RMD *rmd, uint32_t addr, int fRetIfNotOwn)
|
||||
if (!(ownbyte & 0x80))
|
||||
rmd->rmd1.own = 0;
|
||||
|
||||
use_phys_exec = 0;
|
||||
|
||||
return !!rmd->rmd1.own;
|
||||
}
|
||||
|
||||
@@ -567,49 +605,42 @@ pcnetRmdLoad(nic_t *dev, RMD *rmd, uint32_t addr, int fRetIfNotOwn)
|
||||
static __inline void
|
||||
pcnetRmdStorePassHost(nic_t *dev, RMD *rmd, uint32_t addr)
|
||||
{
|
||||
uint16_t rda[4];
|
||||
uint32_t rda32[3];
|
||||
|
||||
use_phys_exec = 1;
|
||||
|
||||
if (BCR_SWSTYLE(dev) == 0) {
|
||||
uint16_t rda[4];
|
||||
rda[0] = ((uint32_t *)rmd)[0] & 0xffff;
|
||||
rda[1] = ((((uint32_t *)rmd)[0]>>16) & 0xff) | ((((uint32_t *)rmd)[1]>>16) & 0xff00);
|
||||
rda[2] = ((uint32_t *)rmd)[1] & 0xffff;
|
||||
rda[3] = ((uint32_t *)rmd)[2] & 0xffff;
|
||||
#if 0
|
||||
rda[1] |= 0x8000;
|
||||
DMAPageWrite(addr, (uint8_t*)&rda[0], sizeof(rda));
|
||||
dma_bm_write(addr, (uint8_t*)&rda[0], sizeof(rda), dev->transfer_size);
|
||||
#endif
|
||||
rda[1] &= ~0x8000;
|
||||
DMAPageWrite(addr+3, (uint8_t*)rda + 3, 1);
|
||||
dma_bm_write(addr, (uint8_t*)&rda[0], sizeof(rda), dev->transfer_size);
|
||||
} else if (BCR_SWSTYLE(dev) != 3) {
|
||||
#if 0
|
||||
((uint32_t*)rmd)[1] |= 0x80000000;
|
||||
DMAPageWrite(addr, (uint8_t*)rmd, 12);
|
||||
dma_bm_write(addr, (uint8_t*)rmd, 12, dev->transfer_size);
|
||||
#endif
|
||||
((uint32_t*)rmd)[1] &= ~0x80000000;
|
||||
DMAPageWrite(addr+7, (uint8_t*)rmd + 7, 1);
|
||||
dma_bm_write(addr, (uint8_t*)rmd, 12, dev->transfer_size);
|
||||
} else {
|
||||
uint32_t rda[3];
|
||||
rda[0] = ((uint32_t *)rmd)[2];
|
||||
rda[1] = ((uint32_t *)rmd)[1];
|
||||
rda[2] = ((uint32_t *)rmd)[0];
|
||||
rda[1] |= 0x80000000;
|
||||
DMAPageWrite(addr, (uint8_t*)&rda[0], sizeof(rda));
|
||||
rda[1] &= ~0x80000000;
|
||||
DMAPageWrite(addr+7, (uint8_t*)rda + 7, 1);
|
||||
rda32[0] = ((uint32_t *)rmd)[2];
|
||||
rda32[1] = ((uint32_t *)rmd)[1];
|
||||
rda32[2] = ((uint32_t *)rmd)[0];
|
||||
#if 0
|
||||
rda32[1] |= 0x80000000;
|
||||
dma_bm_write(addr, (uint8_t*)&rda32[0], sizeof(rda32), dev->transfer_size);
|
||||
#endif
|
||||
rda32[1] &= ~0x80000000;
|
||||
dma_bm_write(addr, (uint8_t*)&rda32[0], sizeof(rda32), dev->transfer_size);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Read+Write a TX/RX descriptor to prevent DMAPageWrite() allocating
|
||||
* pages later when we shouldn't schedule to EMT. Temporarily hack.
|
||||
*/
|
||||
static void
|
||||
pcnetDescTouch(nic_t *dev, uint32_t addr)
|
||||
{
|
||||
uint8_t aBuf[16];
|
||||
int cbDesc;
|
||||
if (BCR_SWSTYLE(dev) == 0)
|
||||
cbDesc = 8;
|
||||
else
|
||||
cbDesc = 16;
|
||||
DMAPageRead(addr, aBuf, cbDesc);
|
||||
DMAPageWrite(addr, aBuf, cbDesc);
|
||||
use_phys_exec = 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -909,11 +940,8 @@ pcnetUpdateIrq(nic_t *dev)
|
||||
|
||||
pcnetlog(2, "%s: pcnetUpdateIrq: iISR=%d\n", dev->name, iISR);
|
||||
|
||||
/* normal path is to _not_ change the IRQ status */
|
||||
if (iISR != dev->iISR) {
|
||||
pcnet_do_irq(dev, iISR);
|
||||
dev->iISR = iISR;
|
||||
}
|
||||
pcnet_do_irq(dev, iISR);
|
||||
dev->iISR = iISR;
|
||||
}
|
||||
|
||||
|
||||
@@ -926,8 +954,10 @@ pcnetInit(nic_t *dev)
|
||||
/** @todo Documentation says that RCVRL and XMTRL are stored as two's complement!
|
||||
* Software is allowed to write these registers directly. */
|
||||
#define PCNET_INIT() do { \
|
||||
DMAPageRead(PHYSADDR(dev, CSR_IADR(dev)), \
|
||||
(uint8_t *)&initblk, sizeof(initblk)); \
|
||||
use_phys_exec = 1; \
|
||||
dma_bm_read(PHYSADDR(dev, CSR_IADR(dev)), \
|
||||
(uint8_t *)&initblk, sizeof(initblk), dev->transfer_size); \
|
||||
use_phys_exec = 0; \
|
||||
dev->aCSR[15] = le16_to_cpu(initblk.mode); \
|
||||
CSR_RCVRL(dev) = (initblk.rlen < 9) ? (1 << initblk.rlen) : 512; \
|
||||
CSR_XMTRL(dev) = (initblk.tlen < 9) ? (1 << initblk.tlen) : 512; \
|
||||
@@ -964,7 +994,6 @@ pcnetInit(nic_t *dev)
|
||||
RMD rmd;
|
||||
uint32_t rdaddr = PHYSADDR(dev, pcnetRdraAddr(dev, i));
|
||||
|
||||
pcnetDescTouch(dev, rdaddr);
|
||||
/* At this time it is not guaranteed that the buffers are already initialized. */
|
||||
if (pcnetRmdLoad(dev, &rmd, rdaddr, 0)) {
|
||||
uint32_t cbBuf = 4096U-rmd.rmd1.bcnt;
|
||||
@@ -972,12 +1001,6 @@ pcnetInit(nic_t *dev)
|
||||
}
|
||||
}
|
||||
|
||||
for (i = CSR_XMTRL(dev); i >= 1; i--) {
|
||||
uint32_t tdaddr = PHYSADDR(dev, pcnetTdraAddr(dev, i));
|
||||
|
||||
pcnetDescTouch(dev, tdaddr);
|
||||
}
|
||||
|
||||
/*
|
||||
* Heuristics: The Solaris pcn driver allocates too few RX buffers (128 buffers of a
|
||||
* size of 128 bytes are 16KB in summary) leading to frequent RX buffer overflows. In
|
||||
@@ -1339,8 +1362,10 @@ pcnetReceiveNoSync(void *priv, uint8_t *buf, int size)
|
||||
* forbidden as long as it is owned by the device
|
||||
* - we don't cache any register state beyond this point
|
||||
*/
|
||||
|
||||
DMAPageWrite(rbadr, src, cbBuf);
|
||||
|
||||
use_phys_exec = 1;
|
||||
dma_bm_write(rbadr, src, cbBuf, dev->transfer_size);
|
||||
use_phys_exec = 0;
|
||||
|
||||
/* RX disabled in the meantime? If so, abort RX. */
|
||||
if (CSR_DRX(dev) || CSR_STOP(dev) || CSR_SPND(dev)) {
|
||||
@@ -1383,7 +1408,9 @@ pcnetReceiveNoSync(void *priv, uint8_t *buf, int size)
|
||||
/* We have to leave the critical section here or we risk deadlocking
|
||||
* with EMT when the write is to an unallocated page or has an access
|
||||
* handler associated with it. See above for additional comments. */
|
||||
DMAPageWrite(rbadr2, src, cbBuf);
|
||||
use_phys_exec = 1;
|
||||
dma_bm_write(rbadr2, src, cbBuf, dev->transfer_size);
|
||||
use_phys_exec = 0;
|
||||
|
||||
/* RX disabled in the meantime? If so, abort RX. */
|
||||
if (CSR_DRX(dev) || CSR_STOP(dev) || CSR_SPND(dev)) {
|
||||
@@ -1508,7 +1535,9 @@ pcnetAsyncTransmit(nic_t *dev)
|
||||
* zero length if it is not the last one in the chain. */
|
||||
if (cb <= MAX_FRAME) {
|
||||
dev->xmit_pos = cb;
|
||||
DMAPageRead(PHYSADDR(dev, tmd.tmd0.tbadr), dev->abLoopBuf, cb);
|
||||
use_phys_exec = 1;
|
||||
dma_bm_read(PHYSADDR(dev, tmd.tmd0.tbadr), dev->abLoopBuf, cb, dev->transfer_size);
|
||||
use_phys_exec = 0;
|
||||
|
||||
if (fLoopback) {
|
||||
if (HOST_IS_OWNER(CSR_CRST(dev)))
|
||||
@@ -1574,7 +1603,9 @@ pcnetAsyncTransmit(nic_t *dev)
|
||||
*/
|
||||
unsigned cb = 4096 - tmd.tmd1.bcnt;
|
||||
dev->xmit_pos = pcnetCalcPacketLen(dev, cb);
|
||||
DMAPageRead(PHYSADDR(dev, tmd.tmd0.tbadr), dev->abLoopBuf, cb);
|
||||
use_phys_exec = 1;
|
||||
dma_bm_read(PHYSADDR(dev, tmd.tmd0.tbadr), dev->abLoopBuf, cb, dev->transfer_size);
|
||||
use_phys_exec = 0;
|
||||
|
||||
for (;;) {
|
||||
/*
|
||||
@@ -1613,7 +1644,9 @@ pcnetAsyncTransmit(nic_t *dev)
|
||||
if (dev->xmit_pos + cb <= MAX_FRAME) { /** @todo this used to be ... + cb < MAX_FRAME. */
|
||||
int off = dev->xmit_pos;
|
||||
dev->xmit_pos = cb + off;
|
||||
DMAPageRead(PHYSADDR(dev, tmd.tmd0.tbadr), dev->abLoopBuf + off, cb);
|
||||
use_phys_exec = 1;
|
||||
dma_bm_read(PHYSADDR(dev, tmd.tmd0.tbadr), dev->abLoopBuf + off, cb, dev->transfer_size);
|
||||
use_phys_exec = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2834,6 +2867,11 @@ pcnet_init(const device_t *info)
|
||||
dev->is_vlb = !!(info->flags & DEVICE_VLB);
|
||||
dev->is_isa = !!(info->flags & (DEVICE_ISA | DEVICE_AT));
|
||||
|
||||
if (dev->is_pci || dev->is_vlb)
|
||||
dev->transfer_size = 4;
|
||||
else
|
||||
dev->transfer_size = 2;
|
||||
|
||||
if (dev->is_pci) {
|
||||
pcnet_mem_init(dev, 0x0fffff00);
|
||||
pcnet_mem_disable(dev);
|
||||
|
||||
@@ -124,6 +124,7 @@ poll_thread(void *arg)
|
||||
uint16_t mac_cmp16[2];
|
||||
event_t *evt;
|
||||
int data_valid = 0;
|
||||
int tx;
|
||||
|
||||
slirp_log("SLiRP: polling started.\n");
|
||||
thread_set_event(poll_state);
|
||||
@@ -145,12 +146,11 @@ poll_thread(void *arg)
|
||||
if (slirpq == NULL) break;
|
||||
|
||||
/* Wait for the next packet to arrive. */
|
||||
tx = network_tx_queue_check();
|
||||
data_valid = 0;
|
||||
|
||||
if ((!network_get_wait() && !(poll_card->set_link_state && poll_card->set_link_state(poll_card->priv)) && !(poll_card->wait && poll_card->wait(poll_card->priv))) && (QueuePeek(slirpq) != 0)) {
|
||||
/* Grab a packet from the queue. */
|
||||
// ui_sb_update_icon(SB_NETWORK, 1);
|
||||
|
||||
qp = QueueDelete(slirpq);
|
||||
slirp_log("SLiRP: inQ:%d got a %dbyte packet @%08lx\n",
|
||||
QueuePeek(slirpq), qp->len, qp);
|
||||
@@ -165,7 +165,7 @@ poll_thread(void *arg)
|
||||
if ((mac_cmp32[0] != mac_cmp32[1]) ||
|
||||
(mac_cmp16[0] != mac_cmp16[1])) {
|
||||
|
||||
poll_card->rx(poll_card->priv, (uint8_t *)qp->data, qp->len);
|
||||
network_queue_put(0, poll_card->priv, (uint8_t *)qp->data, qp->len);
|
||||
data_valid = 1;
|
||||
}
|
||||
|
||||
@@ -173,11 +173,12 @@ poll_thread(void *arg)
|
||||
free(qp);
|
||||
}
|
||||
|
||||
if (tx)
|
||||
network_do_tx();
|
||||
|
||||
/* If we did not get anything, wait a while. */
|
||||
if (!data_valid) {
|
||||
// ui_sb_update_icon(SB_NETWORK, 0);
|
||||
if (!data_valid && !tx)
|
||||
thread_wait_event(evt, 10);
|
||||
}
|
||||
|
||||
/* Release ownership of the queue. */
|
||||
network_wait(0);
|
||||
@@ -217,8 +218,6 @@ net_slirp_init(void)
|
||||
int
|
||||
net_slirp_reset(const netcard_t *card, uint8_t *mac)
|
||||
{
|
||||
// ui_sb_update_icon(SB_NETWORK, 0);
|
||||
|
||||
/* Save the callback info. */
|
||||
poll_card = card;
|
||||
|
||||
@@ -236,9 +235,8 @@ net_slirp_close(void)
|
||||
{
|
||||
queueADT sl;
|
||||
|
||||
// ui_sb_update_icon(SB_NETWORK, 0);
|
||||
|
||||
if (slirpq == NULL) return;
|
||||
if (slirpq == NULL)
|
||||
return;
|
||||
|
||||
slirp_log("SLiRP: closing.\n");
|
||||
|
||||
@@ -270,17 +268,10 @@ net_slirp_close(void)
|
||||
void
|
||||
net_slirp_in(uint8_t *pkt, int pkt_len)
|
||||
{
|
||||
if (slirpq == NULL) return;
|
||||
|
||||
// ui_sb_update_icon(SB_NETWORK, 1);
|
||||
|
||||
network_busy(1);
|
||||
if (slirpq == NULL)
|
||||
return;
|
||||
|
||||
slirp_input((const uint8_t *)pkt, pkt_len);
|
||||
|
||||
network_busy(0);
|
||||
|
||||
// ui_sb_update_icon(SB_NETWORK, 0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -57,6 +57,7 @@
|
||||
#define HAVE_STDARG_H
|
||||
#include <86box/86box.h>
|
||||
#include <86box/device.h>
|
||||
#include <86box/timer.h>
|
||||
#include <86box/plat.h>
|
||||
#include <86box/ui.h>
|
||||
#include <86box/network.h>
|
||||
@@ -110,14 +111,20 @@ static netcard_t net_cards[] = {
|
||||
int network_type;
|
||||
int network_ndev;
|
||||
int network_card;
|
||||
static volatile int net_wait = 0;
|
||||
char network_host[522];
|
||||
netdev_t network_devs[32];
|
||||
#ifdef ENABLE_NIC_LOG
|
||||
int nic_do_log = ENABLE_NIC_LOG;
|
||||
#endif
|
||||
static mutex_t *network_mutex;
|
||||
static uint8_t *network_mac;
|
||||
|
||||
|
||||
/* Local variables. */
|
||||
static volatile int net_wait = 0;
|
||||
static mutex_t *network_mutex;
|
||||
static uint8_t *network_mac;
|
||||
static pc_timer_t network_rx_queue_timer;
|
||||
static netpkt_t *first_pkt[2] = { NULL, NULL },
|
||||
*last_pkt[2] = { NULL, NULL };
|
||||
|
||||
|
||||
static struct {
|
||||
@@ -215,6 +222,100 @@ network_init(void)
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
network_queue_put(int tx, void *priv, uint8_t *data, int len)
|
||||
{
|
||||
netpkt_t *temp;
|
||||
|
||||
temp = (netpkt_t *) malloc(sizeof(netpkt_t));
|
||||
memset(temp, 0, sizeof(netpkt_t));
|
||||
temp->priv = priv;
|
||||
temp->data = (uint8_t *) malloc(len);
|
||||
memcpy(temp->data, data, len);
|
||||
temp->len = len;
|
||||
temp->prev = last_pkt[tx];
|
||||
temp->next = NULL;
|
||||
|
||||
if (last_pkt[tx] != NULL)
|
||||
last_pkt[tx]->next = temp;
|
||||
last_pkt[tx] = temp;
|
||||
|
||||
if (first_pkt[tx] == NULL)
|
||||
first_pkt[tx] = temp;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
network_queue_get(int tx, netpkt_t **pkt)
|
||||
{
|
||||
if (first_pkt[tx] == NULL)
|
||||
*pkt = NULL;
|
||||
else
|
||||
*pkt = first_pkt[tx];
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
network_queue_advance(int tx)
|
||||
{
|
||||
netpkt_t *temp;
|
||||
|
||||
temp = first_pkt[tx];
|
||||
|
||||
if (temp == NULL)
|
||||
return;
|
||||
|
||||
first_pkt[tx] = temp->next;
|
||||
if (temp->data != NULL)
|
||||
free(temp->data);
|
||||
free(temp);
|
||||
|
||||
if (first_pkt[tx] == NULL)
|
||||
last_pkt[tx] = NULL;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
network_queue_clear(int tx)
|
||||
{
|
||||
netpkt_t *temp = first_pkt[tx];
|
||||
|
||||
if (temp == NULL)
|
||||
return;
|
||||
|
||||
do {
|
||||
if (temp->data != NULL)
|
||||
free(temp->data);
|
||||
free(temp);
|
||||
temp = temp->next;
|
||||
} while (temp != NULL);
|
||||
|
||||
first_pkt[tx] = last_pkt[tx] = NULL;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
network_rx_queue(void *priv)
|
||||
{
|
||||
netpkt_t *pkt = NULL;
|
||||
|
||||
network_busy(1);
|
||||
|
||||
network_queue_get(0, &pkt);
|
||||
if ((pkt != NULL) && (pkt->len > 0)) {
|
||||
net_cards[network_card].rx(pkt->priv, pkt->data, pkt->len);
|
||||
if (pkt->len >= 128)
|
||||
timer_on_auto(&network_rx_queue_timer, 0.762939453125 * 2.0 * ((double) pkt->len));
|
||||
else
|
||||
timer_on_auto(&network_rx_queue_timer, 0.762939453125 * 2.0 * 128.0);
|
||||
} else
|
||||
timer_on_auto(&network_rx_queue_timer, 0.762939453125 * 2.0 * 128.0);
|
||||
network_queue_advance(0);
|
||||
|
||||
network_busy(0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Attach a network card to the system.
|
||||
*
|
||||
@@ -250,6 +351,12 @@ network_attach(void *dev, uint8_t *mac, NETRXCB rx, NETWAITCB wait, NETSETLINKST
|
||||
(void)net_slirp_reset(&net_cards[network_card], network_mac);
|
||||
break;
|
||||
}
|
||||
|
||||
first_pkt[0] = first_pkt[1] = NULL;
|
||||
last_pkt[0] = last_pkt[1] = NULL;
|
||||
timer_add(&network_rx_queue_timer, network_rx_queue, NULL, 0);
|
||||
/* 10 mbps. */
|
||||
timer_on_auto(&network_rx_queue_timer, 0.762939453125 * 2.0);
|
||||
}
|
||||
|
||||
|
||||
@@ -257,6 +364,8 @@ network_attach(void *dev, uint8_t *mac, NETRXCB rx, NETWAITCB wait, NETSETLINKST
|
||||
void
|
||||
network_close(void)
|
||||
{
|
||||
timer_stop(&network_rx_queue_timer);
|
||||
|
||||
/* If already closed, do nothing. */
|
||||
if (network_mutex == NULL) return;
|
||||
|
||||
@@ -281,6 +390,10 @@ network_close(void)
|
||||
network_mutex = NULL;
|
||||
network_mac = NULL;
|
||||
|
||||
/* Here is where we clear the queues. */
|
||||
network_queue_clear(0);
|
||||
network_queue_clear(1);
|
||||
|
||||
network_log("NETWORK: closed.\n");
|
||||
}
|
||||
|
||||
@@ -313,7 +426,7 @@ network_reset(void)
|
||||
/* If no active card, we're done. */
|
||||
if ((network_type==NET_TYPE_NONE) || (network_card==0)) return;
|
||||
|
||||
network_mutex = thread_create_mutex(L"VARCem.NetMutex");
|
||||
network_mutex = thread_create_mutex();
|
||||
|
||||
/* Initialize the platform module. */
|
||||
switch(network_type) {
|
||||
@@ -328,7 +441,7 @@ network_reset(void)
|
||||
|
||||
if (i < 0) {
|
||||
/* Tell user we can't do this (at the moment.) */
|
||||
ui_msgbox(MBX_ERROR, (wchar_t *)IDS_2102);
|
||||
ui_msgbox(MBX_ERROR, (wchar_t *)IDS_2093);
|
||||
|
||||
// FIXME: we should ask in the dialog if they want to
|
||||
// reconfigure or quit, and throw them into the
|
||||
@@ -353,23 +466,51 @@ network_reset(void)
|
||||
}
|
||||
|
||||
|
||||
/* Transmit a packet to one of the network providers. */
|
||||
/* Queue a packet for transmission to one of the network providers. */
|
||||
void
|
||||
network_tx(uint8_t *bufp, int len)
|
||||
{
|
||||
network_busy(1);
|
||||
|
||||
ui_sb_update_icon(SB_NETWORK, 1);
|
||||
|
||||
switch(network_type) {
|
||||
case NET_TYPE_PCAP:
|
||||
net_pcap_in(bufp, len);
|
||||
break;
|
||||
|
||||
case NET_TYPE_SLIRP:
|
||||
net_slirp_in(bufp, len);
|
||||
break;
|
||||
}
|
||||
network_queue_put(1, NULL, bufp, len);
|
||||
|
||||
ui_sb_update_icon(SB_NETWORK, 0);
|
||||
|
||||
network_busy(0);
|
||||
}
|
||||
|
||||
|
||||
/* Actually transmit the packet. */
|
||||
void
|
||||
network_do_tx(void)
|
||||
{
|
||||
netpkt_t *pkt = NULL;
|
||||
|
||||
network_queue_get(1, &pkt);
|
||||
if ((pkt != NULL) && (pkt->len > 0)) {
|
||||
switch(network_type) {
|
||||
case NET_TYPE_PCAP:
|
||||
net_pcap_in(pkt->data, pkt->len);
|
||||
break;
|
||||
|
||||
case NET_TYPE_SLIRP:
|
||||
net_slirp_in(pkt->data, pkt->len);
|
||||
break;
|
||||
}
|
||||
}
|
||||
network_queue_advance(1);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
network_tx_queue_check(void)
|
||||
{
|
||||
if ((first_pkt[1] == NULL) && (last_pkt[1] == NULL))
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
49
src/nvr_at.c
49
src/nvr_at.c
@@ -237,7 +237,6 @@
|
||||
#include <86box/rom.h>
|
||||
#include <86box/device.h>
|
||||
#include <86box/nvr.h>
|
||||
#include <86box/fdd.h>
|
||||
|
||||
|
||||
/* RTC registers and bit definitions. */
|
||||
@@ -280,8 +279,6 @@
|
||||
# define REGC_UF 0x10
|
||||
#define RTC_REGD 13
|
||||
# define REGD_VRT 0x80
|
||||
#define RTC_FDD_TYPES 0x10
|
||||
#define RTC_INST_EQUIP 0x14
|
||||
#define RTC_CENTURY_AT 0x32 /* century register for AT etc */
|
||||
#define RTC_CENTURY_PS 0x37 /* century register for PS/1 PS/2 */
|
||||
#define RTC_ALDAY 0x7D /* VIA VT82C586B - alarm day */
|
||||
@@ -756,7 +753,7 @@ nvr_reset(nvr_t *nvr)
|
||||
static void
|
||||
nvr_start(nvr_t *nvr)
|
||||
{
|
||||
int i, fdd;
|
||||
int i;
|
||||
local_t *local = (local_t *) nvr->data;
|
||||
|
||||
struct tm tm;
|
||||
@@ -771,50 +768,6 @@ nvr_start(nvr_t *nvr)
|
||||
nvr->regs[0x0e] = 0xff; /* If load failed or it loaded an uninitialized NVR,
|
||||
mark everything as bad. */
|
||||
|
||||
if (machines[machine].flags & MACHINE_COREBOOT) {
|
||||
/* Sync floppy drive types on coreboot machines, as SeaBIOS lacks a setup
|
||||
utility and just leaves these untouched. */
|
||||
|
||||
nvr->regs[RTC_FDD_TYPES] = 0x00;
|
||||
nvr->regs[RTC_INST_EQUIP] |= 0xc0;
|
||||
|
||||
for (i = 0; i <= 1; i++) {
|
||||
fdd = fdd_get_type(i);
|
||||
if (fdd) {
|
||||
if (fdd_is_525(i)) {
|
||||
if (fdd_is_hd(i))
|
||||
fdd = 2;
|
||||
else if (fdd_doublestep_40(i))
|
||||
fdd = 3;
|
||||
else
|
||||
fdd = 1;
|
||||
} else {
|
||||
if (fdd_is_hd(i))
|
||||
fdd = 4;
|
||||
else if (fdd_is_double_sided(i))
|
||||
fdd = 3;
|
||||
else
|
||||
fdd = 1;
|
||||
}
|
||||
|
||||
nvr->regs[RTC_FDD_TYPES] |= (fdd << ((1 - i) * 4));
|
||||
nvr->regs[RTC_INST_EQUIP] &= 0x3f; /* At least one drive installed. */
|
||||
}
|
||||
}
|
||||
|
||||
if ((nvr->regs[RTC_FDD_TYPES] >> 4) && (nvr->regs[RTC_FDD_TYPES] & 0xf))
|
||||
nvr->regs[RTC_INST_EQUIP] |= 0x40; /* Two drives installed. */
|
||||
|
||||
/* Re-compute CMOS checksum. SeaBIOS also doesn't care about the checksum,
|
||||
but Windows does. */
|
||||
uint16_t checksum = 0;
|
||||
for (i = 0x10; i <= 0x2d; i++) {
|
||||
checksum += nvr->regs[i];
|
||||
}
|
||||
nvr->regs[0x2e] = checksum >> 8;
|
||||
nvr->regs[0x2f] = checksum;
|
||||
}
|
||||
|
||||
/* Initialize the internal and chip times. */
|
||||
if (time_sync & TIME_SYNC_ENABLED) {
|
||||
/* Use the internal clock's time. */
|
||||
|
||||
@@ -2036,7 +2036,7 @@ escp_init(void *lpt)
|
||||
if (ft_handle == NULL) {
|
||||
ft_handle = dynld_module(fn, ft_imports);
|
||||
if (ft_handle == NULL) {
|
||||
ui_msgbox(MBX_ERROR, (wchar_t *)IDS_2119);
|
||||
ui_msgbox(MBX_ERROR, (wchar_t *)IDS_2110);
|
||||
return(NULL);
|
||||
}
|
||||
}
|
||||
@@ -2044,7 +2044,7 @@ escp_init(void *lpt)
|
||||
/* Initialize FreeType. */
|
||||
if (ft_lib == NULL) {
|
||||
if (ft_Init_FreeType(&ft_lib)) {
|
||||
ui_msgbox(MBX_ERROR, (wchar_t *)IDS_2119);
|
||||
ui_msgbox(MBX_ERROR, (wchar_t *)IDS_2110);
|
||||
dynld_close(ft_lib);
|
||||
ft_lib = NULL;
|
||||
return(NULL);
|
||||
|
||||
@@ -352,7 +352,7 @@ ps_init(void *lpt)
|
||||
/* Try loading the DLL. */
|
||||
ghostscript_handle = dynld_module(PATH_GHOSTSCRIPT_DLL, ghostscript_imports);
|
||||
if (ghostscript_handle == NULL) {
|
||||
ui_msgbox(MBX_ERROR, (wchar_t *) IDS_2123);
|
||||
ui_msgbox(MBX_ERROR, (wchar_t *) IDS_2114);
|
||||
} else {
|
||||
if (gsapi_revision(&rev, sizeof(rev)) == 0) {
|
||||
pclog("Loaded %s, rev %ld (%ld)\n", rev.product, rev.revision, rev.revisiondate);
|
||||
|
||||
@@ -557,7 +557,7 @@ buslogic_param_len(void *p)
|
||||
|
||||
|
||||
static void
|
||||
BuslogicSCSIBIOSDMATransfer(ESCMD *ESCSICmd, uint8_t TargetID, int dir)
|
||||
BuslogicSCSIBIOSDMATransfer(ESCMD *ESCSICmd, uint8_t TargetID, int dir, int transfer_size)
|
||||
{
|
||||
uint32_t DataPointer = ESCSICmd->DataPointer;
|
||||
int DataLength = ESCSICmd->DataLength;
|
||||
@@ -581,10 +581,10 @@ BuslogicSCSIBIOSDMATransfer(ESCMD *ESCSICmd, uint8_t TargetID, int dir)
|
||||
|
||||
if (dir && ((ESCSICmd->DataDirection == CCB_DATA_XFER_OUT) || (ESCSICmd->DataDirection == 0x00))) {
|
||||
buslogic_log("BusLogic BIOS DMA: Reading %i bytes from %08X\n", TransferLength, Address);
|
||||
DMAPageRead(Address, (uint8_t *)dev->sc->temp_buffer, TransferLength);
|
||||
dma_bm_read(Address, (uint8_t *)dev->sc->temp_buffer, TransferLength, transfer_size);
|
||||
} else if (!dir && ((ESCSICmd->DataDirection == CCB_DATA_XFER_IN) || (ESCSICmd->DataDirection == 0x00))) {
|
||||
buslogic_log("BusLogic BIOS DMA: Writing %i bytes at %08X\n", TransferLength, Address);
|
||||
DMAPageWrite(Address, (uint8_t *)dev->sc->temp_buffer, TransferLength);
|
||||
dma_bm_write(Address, (uint8_t *)dev->sc->temp_buffer, TransferLength, transfer_size);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -651,7 +651,7 @@ BuslogicSCSIBIOSRequestSetup(x54x_t *dev, uint8_t *CmdBuf, uint8_t *DataInBuf, u
|
||||
|
||||
phase = sd->phase;
|
||||
if (phase != SCSI_PHASE_STATUS) {
|
||||
BuslogicSCSIBIOSDMATransfer(ESCSICmd, ESCSICmd->TargetId, (phase == SCSI_PHASE_DATA_OUT));
|
||||
BuslogicSCSIBIOSDMATransfer(ESCSICmd, ESCSICmd->TargetId, (phase == SCSI_PHASE_DATA_OUT), dev->transfer_size);
|
||||
scsi_device_command_phase1(sd);
|
||||
}
|
||||
|
||||
|
||||
@@ -467,7 +467,7 @@ ncr53c8xx_read(ncr53c8xx_t *dev, uint32_t addr, uint8_t *buf, uint32_t len)
|
||||
buf[i] = inb((uint16_t) (addr + i));
|
||||
} else {
|
||||
ncr53c8xx_log("NCR 810: Reading from memory address %08X\n", addr);
|
||||
DMAPageRead(addr, buf, len);
|
||||
dma_bm_read(addr, buf, len, 4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -485,7 +485,7 @@ ncr53c8xx_write(ncr53c8xx_t *dev, uint32_t addr, uint8_t *buf, uint32_t len)
|
||||
outb((uint16_t) (addr + i), buf[i]);
|
||||
} else {
|
||||
ncr53c8xx_log("NCR 810: Writing to memory address %08X\n", addr);
|
||||
DMAPageWrite(addr, buf, len);
|
||||
dma_bm_write(addr, buf, len, 4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -495,7 +495,7 @@ read_dword(ncr53c8xx_t *dev, uint32_t addr)
|
||||
{
|
||||
uint32_t buf;
|
||||
ncr53c8xx_log("Reading the next DWORD from memory (%08X)...\n", addr);
|
||||
DMAPageRead(addr, (uint8_t *)&buf, 4);
|
||||
dma_bm_read(addr, (uint8_t *)&buf, 4, 4);
|
||||
return buf;
|
||||
}
|
||||
|
||||
@@ -736,7 +736,7 @@ ncr53c8xx_do_command(ncr53c8xx_t *dev, uint8_t id)
|
||||
uint8_t buf[12];
|
||||
|
||||
memset(buf, 0, 12);
|
||||
DMAPageRead(dev->dnad, buf, MIN(12, dev->dbc));
|
||||
dma_bm_read(dev->dnad, buf, MIN(12, dev->dbc), 4);
|
||||
if (dev->dbc > 12) {
|
||||
ncr53c8xx_log("(ID=%02i LUN=%02i) SCSI Command 0x%02x: CDB length %i too big\n", id, dev->current_lun, buf[0], dev->dbc);
|
||||
dev->dbc = 12;
|
||||
@@ -871,7 +871,7 @@ static uint8_t
|
||||
ncr53c8xx_get_msgbyte(ncr53c8xx_t *dev)
|
||||
{
|
||||
uint8_t data;
|
||||
DMAPageRead(dev->dnad, &data, 1);
|
||||
dma_bm_read(dev->dnad, &data, 1, 4);
|
||||
dev->dnad++;
|
||||
dev->dbc--;
|
||||
return data;
|
||||
@@ -1082,7 +1082,7 @@ again:
|
||||
|
||||
/* 32-bit Table indirect */
|
||||
offset = sextract32(addr, 0, 24);
|
||||
DMAPageRead(dev->dsa + offset, (uint8_t *)buf, 8);
|
||||
dma_bm_read(dev->dsa + offset, (uint8_t *)buf, 8, 4);
|
||||
/* byte count is stored in bits 0:23 only */
|
||||
dev->dbc = buf[0] & 0xffffff;
|
||||
addr = buf[1];
|
||||
@@ -1370,14 +1370,14 @@ again:
|
||||
n = (insn & 7);
|
||||
reg = (insn >> 16) & 0xff;
|
||||
if (insn & (1 << 24)) {
|
||||
DMAPageRead(addr, data, n);
|
||||
dma_bm_read(addr, data, n, 4);
|
||||
for (i = 0; i < n; i++)
|
||||
ncr53c8xx_reg_writeb(dev, reg + i, data[i]);
|
||||
} else {
|
||||
ncr53c8xx_log("Store reg 0x%x size %d addr 0x%08x\n", reg, n, addr);
|
||||
for (i = 0; i < n; i++)
|
||||
data[i] = ncr53c8xx_reg_readb(dev, reg + i);
|
||||
DMAPageWrite(addr, data, n);
|
||||
dma_bm_write(addr, data, n, 4);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -403,7 +403,7 @@ spock_readw(uint16_t port, void *p)
|
||||
static void
|
||||
spock_rd_sge(spock_t *scsi, uint32_t Address, SGE *SG)
|
||||
{
|
||||
DMAPageRead(Address, (uint8_t *)SG, sizeof(SGE));
|
||||
dma_bm_read(Address, (uint8_t *)SG, sizeof(SGE), 2);
|
||||
spock_add_to_period(scsi, sizeof(SGE));
|
||||
}
|
||||
|
||||
@@ -553,20 +553,20 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb)
|
||||
spock_log("Start failed, SCB ID = %d\n", scsi->scb_id);
|
||||
spock_set_irq(scsi, scsi->scb_id, IRQ_TYPE_COMMAND_FAIL);
|
||||
scsi->scb_state = 0;
|
||||
DMAPageWrite(scb->term_status_block_addr + 0x7*2, (uint8_t *)&term_stat_block_addr7, 2);
|
||||
DMAPageWrite(scb->term_status_block_addr + 0x8*2, (uint8_t *)&term_stat_block_addr8, 2);
|
||||
dma_bm_write(scb->term_status_block_addr + 0x7*2, (uint8_t *)&term_stat_block_addr7, 2, 2);
|
||||
dma_bm_write(scb->term_status_block_addr + 0x8*2, (uint8_t *)&term_stat_block_addr8, 2, 2);
|
||||
break;
|
||||
}
|
||||
|
||||
DMAPageRead(scsi->scb_addr, (uint8_t *)&scb->command, 2);
|
||||
DMAPageRead(scsi->scb_addr + 2, (uint8_t *)&scb->enable, 2);
|
||||
DMAPageRead(scsi->scb_addr + 4, (uint8_t *)&scb->lba_addr, 4);
|
||||
DMAPageRead(scsi->scb_addr + 8, (uint8_t *)&scb->sge.sys_buf_addr, 4);
|
||||
DMAPageRead(scsi->scb_addr + 12, (uint8_t *)&scb->sge.sys_buf_byte_count, 4);
|
||||
DMAPageRead(scsi->scb_addr + 16, (uint8_t *)&scb->term_status_block_addr, 4);
|
||||
DMAPageRead(scsi->scb_addr + 20, (uint8_t *)&scb->scb_chain_addr, 4);
|
||||
DMAPageRead(scsi->scb_addr + 24, (uint8_t *)&scb->block_count, 2);
|
||||
DMAPageRead(scsi->scb_addr + 26, (uint8_t *)&scb->block_length, 2);
|
||||
dma_bm_read(scsi->scb_addr, (uint8_t *)&scb->command, 2, 2);
|
||||
dma_bm_read(scsi->scb_addr + 2, (uint8_t *)&scb->enable, 2, 2);
|
||||
dma_bm_read(scsi->scb_addr + 4, (uint8_t *)&scb->lba_addr, 4, 2);
|
||||
dma_bm_read(scsi->scb_addr + 8, (uint8_t *)&scb->sge.sys_buf_addr, 4, 2);
|
||||
dma_bm_read(scsi->scb_addr + 12, (uint8_t *)&scb->sge.sys_buf_byte_count, 4, 2);
|
||||
dma_bm_read(scsi->scb_addr + 16, (uint8_t *)&scb->term_status_block_addr, 4, 2);
|
||||
dma_bm_read(scsi->scb_addr + 20, (uint8_t *)&scb->scb_chain_addr, 4, 2);
|
||||
dma_bm_read(scsi->scb_addr + 24, (uint8_t *)&scb->block_count, 2, 2);
|
||||
dma_bm_read(scsi->scb_addr + 26, (uint8_t *)&scb->block_length, 2, 2);
|
||||
|
||||
spock_log("SCB : \n"
|
||||
" Command = %04x\n"
|
||||
@@ -605,29 +605,29 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb)
|
||||
get_complete_stat->cache_info_status = 0;
|
||||
get_complete_stat->scb_addr = scsi->scb_addr;
|
||||
|
||||
DMAPageWrite(scb->sge.sys_buf_addr, (uint8_t *)&get_complete_stat->scb_status, 2);
|
||||
DMAPageWrite(scb->sge.sys_buf_addr + 2, (uint8_t *)&get_complete_stat->retry_count, 2);
|
||||
DMAPageWrite(scb->sge.sys_buf_addr + 4, (uint8_t *)&get_complete_stat->residual_byte_count, 4);
|
||||
DMAPageWrite(scb->sge.sys_buf_addr + 8, (uint8_t *)&get_complete_stat->sg_list_element_addr, 4);
|
||||
DMAPageWrite(scb->sge.sys_buf_addr + 12, (uint8_t *)&get_complete_stat->device_dep_status_len, 2);
|
||||
DMAPageWrite(scb->sge.sys_buf_addr + 14, (uint8_t *)&get_complete_stat->cmd_status, 2);
|
||||
DMAPageWrite(scb->sge.sys_buf_addr + 16, (uint8_t *)&get_complete_stat->error, 2);
|
||||
DMAPageWrite(scb->sge.sys_buf_addr + 18, (uint8_t *)&get_complete_stat->reserved, 2);
|
||||
DMAPageWrite(scb->sge.sys_buf_addr + 20, (uint8_t *)&get_complete_stat->cache_info_status, 2);
|
||||
DMAPageWrite(scb->sge.sys_buf_addr + 22, (uint8_t *)&get_complete_stat->scb_addr, 4);
|
||||
dma_bm_write(scb->sge.sys_buf_addr, (uint8_t *)&get_complete_stat->scb_status, 2, 2);
|
||||
dma_bm_write(scb->sge.sys_buf_addr + 2, (uint8_t *)&get_complete_stat->retry_count, 2, 2);
|
||||
dma_bm_write(scb->sge.sys_buf_addr + 4, (uint8_t *)&get_complete_stat->residual_byte_count, 4, 2);
|
||||
dma_bm_write(scb->sge.sys_buf_addr + 8, (uint8_t *)&get_complete_stat->sg_list_element_addr, 4, 2);
|
||||
dma_bm_write(scb->sge.sys_buf_addr + 12, (uint8_t *)&get_complete_stat->device_dep_status_len, 2, 2);
|
||||
dma_bm_write(scb->sge.sys_buf_addr + 14, (uint8_t *)&get_complete_stat->cmd_status, 2, 2);
|
||||
dma_bm_write(scb->sge.sys_buf_addr + 16, (uint8_t *)&get_complete_stat->error, 2, 2);
|
||||
dma_bm_write(scb->sge.sys_buf_addr + 18, (uint8_t *)&get_complete_stat->reserved, 2, 2);
|
||||
dma_bm_write(scb->sge.sys_buf_addr + 20, (uint8_t *)&get_complete_stat->cache_info_status, 2, 2);
|
||||
dma_bm_write(scb->sge.sys_buf_addr + 22, (uint8_t *)&get_complete_stat->scb_addr, 4, 2);
|
||||
scsi->scb_state = 3;
|
||||
}
|
||||
break;
|
||||
|
||||
case CMD_UNKNOWN_1C10:
|
||||
spock_log("Unknown 1C10\n");
|
||||
DMAPageRead(scb->sge.sys_buf_addr, scsi->buf, scb->sge.sys_buf_byte_count);
|
||||
dma_bm_read(scb->sge.sys_buf_addr, scsi->buf, scb->sge.sys_buf_byte_count, 2);
|
||||
scsi->scb_state = 3;
|
||||
break;
|
||||
|
||||
case CMD_UNKNOWN_1C11:
|
||||
spock_log("Unknown 1C11\n");
|
||||
DMAPageWrite(scb->sge.sys_buf_addr, scsi->buf, scb->sge.sys_buf_byte_count);
|
||||
dma_bm_write(scb->sge.sys_buf_addr, scsi->buf, scb->sge.sys_buf_byte_count, 2);
|
||||
scsi->scb_state = 3;
|
||||
break;
|
||||
|
||||
@@ -646,15 +646,15 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb)
|
||||
get_pos_info->pos7 = 0;
|
||||
get_pos_info->pos8 = 0;
|
||||
|
||||
DMAPageWrite(scb->sge.sys_buf_addr, (uint8_t *)&get_pos_info->pos, 2);
|
||||
DMAPageWrite(scb->sge.sys_buf_addr + 2, (uint8_t *)&get_pos_info->pos1, 2);
|
||||
DMAPageWrite(scb->sge.sys_buf_addr + 4, (uint8_t *)&get_pos_info->pos2, 2);
|
||||
DMAPageWrite(scb->sge.sys_buf_addr + 6, (uint8_t *)&get_pos_info->pos3, 2);
|
||||
DMAPageWrite(scb->sge.sys_buf_addr + 8, (uint8_t *)&get_pos_info->pos4, 2);
|
||||
DMAPageWrite(scb->sge.sys_buf_addr + 10, (uint8_t *)&get_pos_info->pos5, 2);
|
||||
DMAPageWrite(scb->sge.sys_buf_addr + 12, (uint8_t *)&get_pos_info->pos6, 2);
|
||||
DMAPageWrite(scb->sge.sys_buf_addr + 14, (uint8_t *)&get_pos_info->pos7, 2);
|
||||
DMAPageWrite(scb->sge.sys_buf_addr + 16, (uint8_t *)&get_pos_info->pos8, 2);
|
||||
dma_bm_write(scb->sge.sys_buf_addr, (uint8_t *)&get_pos_info->pos, 2, 2);
|
||||
dma_bm_write(scb->sge.sys_buf_addr + 2, (uint8_t *)&get_pos_info->pos1, 2, 2);
|
||||
dma_bm_write(scb->sge.sys_buf_addr + 4, (uint8_t *)&get_pos_info->pos2, 2, 2);
|
||||
dma_bm_write(scb->sge.sys_buf_addr + 6, (uint8_t *)&get_pos_info->pos3, 2, 2);
|
||||
dma_bm_write(scb->sge.sys_buf_addr + 8, (uint8_t *)&get_pos_info->pos4, 2, 2);
|
||||
dma_bm_write(scb->sge.sys_buf_addr + 10, (uint8_t *)&get_pos_info->pos5, 2, 2);
|
||||
dma_bm_write(scb->sge.sys_buf_addr + 12, (uint8_t *)&get_pos_info->pos6, 2, 2);
|
||||
dma_bm_write(scb->sge.sys_buf_addr + 14, (uint8_t *)&get_pos_info->pos7, 2, 2);
|
||||
dma_bm_write(scb->sge.sys_buf_addr + 16, (uint8_t *)&get_pos_info->pos8, 2, 2);
|
||||
scsi->scb_state = 3;
|
||||
}
|
||||
break;
|
||||
@@ -677,7 +677,7 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb)
|
||||
|
||||
case CMD_SEND_OTHER_SCSI:
|
||||
spock_log("Send Other SCSI\n");
|
||||
DMAPageRead(scsi->scb_addr + 0x18, scsi->cdb, 12);
|
||||
dma_bm_read(scsi->scb_addr + 0x18, scsi->cdb, 12, 2);
|
||||
scsi->cdb[1] = (scsi->cdb[1] & 0x1f) | (scsi->dev_id[scsi->scb_id].lun_id << 5); /*Patch correct LUN into command*/
|
||||
scsi->cdb_len = (scb->lba_addr & 0xff) ? (scb->lba_addr & 0xff) : 6;
|
||||
scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id;
|
||||
@@ -788,18 +788,18 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb)
|
||||
spock_set_irq(scsi, scsi->scb_id, IRQ_TYPE_COMMAND_FAIL);
|
||||
scsi->scb_state = 0;
|
||||
spock_log("Status Check Condition on device ID %d\n", scsi->cdb_id);
|
||||
DMAPageWrite(scb->term_status_block_addr + 0x7*2, (uint8_t *)&term_stat_block_addr7, 2);
|
||||
DMAPageWrite(scb->term_status_block_addr + 0x8*2, (uint8_t *)&term_stat_block_addr8, 2);
|
||||
DMAPageWrite(scb->term_status_block_addr + 0xb*2, (uint8_t *)&term_stat_block_addrb, 2);
|
||||
DMAPageWrite(scb->term_status_block_addr + 0xc*2, (uint8_t *)&term_stat_block_addrc, 2);
|
||||
dma_bm_write(scb->term_status_block_addr + 0x7*2, (uint8_t *)&term_stat_block_addr7, 2, 2);
|
||||
dma_bm_write(scb->term_status_block_addr + 0x8*2, (uint8_t *)&term_stat_block_addr8, 2, 2);
|
||||
dma_bm_write(scb->term_status_block_addr + 0xb*2, (uint8_t *)&term_stat_block_addrb, 2, 2);
|
||||
dma_bm_write(scb->term_status_block_addr + 0xc*2, (uint8_t *)&term_stat_block_addrc, 2, 2);
|
||||
}
|
||||
} else if (scsi->scsi_state == SCSI_STATE_SELECT_FAILED) {
|
||||
uint16_t term_stat_block_addr7 = (0xc << 8) | 2;
|
||||
uint16_t term_stat_block_addr8 = 0x10;
|
||||
spock_set_irq(scsi, scsi->scb_id, IRQ_TYPE_COMMAND_FAIL);
|
||||
scsi->scb_state = 0;
|
||||
DMAPageWrite(scb->term_status_block_addr + 0x7*2, (uint8_t *)&term_stat_block_addr7, 2);
|
||||
DMAPageWrite(scb->term_status_block_addr + 0x8*2, (uint8_t *)&term_stat_block_addr8, 2);
|
||||
dma_bm_write(scb->term_status_block_addr + 0x7*2, (uint8_t *)&term_stat_block_addr7, 2, 2);
|
||||
dma_bm_write(scb->term_status_block_addr + 0x8*2, (uint8_t *)&term_stat_block_addr8, 2, 2);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -892,10 +892,10 @@ spock_process_scsi(spock_t *scsi, scb_t *scb)
|
||||
|
||||
if ((sd->phase == SCSI_PHASE_DATA_IN) && DataTx) {
|
||||
spock_log("Writing S/G segment %i: length %i, pointer %08X\n", c, DataTx, Address);
|
||||
DMAPageWrite(Address, &sd->sc->temp_buffer[sg_pos], DataTx);
|
||||
dma_bm_write(Address, &sd->sc->temp_buffer[sg_pos], DataTx, 2);
|
||||
} else if ((sd->phase == SCSI_PHASE_DATA_OUT) && DataTx) {
|
||||
spock_log("Reading S/G segment %i: length %i, pointer %08X\n", c, DataTx, Address);
|
||||
DMAPageRead(Address, &sd->sc->temp_buffer[sg_pos], DataTx);
|
||||
dma_bm_read(Address, &sd->sc->temp_buffer[sg_pos], DataTx, 2);
|
||||
}
|
||||
|
||||
sg_pos += scb->sge.sys_buf_byte_count;
|
||||
@@ -907,9 +907,9 @@ spock_process_scsi(spock_t *scsi, scb_t *scb)
|
||||
}
|
||||
} else {
|
||||
if (sd->phase == SCSI_PHASE_DATA_IN) {
|
||||
DMAPageWrite(scsi->data_ptr, sd->sc->temp_buffer, MIN(sd->buffer_length, (int)scsi->data_len));
|
||||
dma_bm_write(scsi->data_ptr, sd->sc->temp_buffer, MIN(sd->buffer_length, (int)scsi->data_len), 2);
|
||||
} else if (sd->phase == SCSI_PHASE_DATA_OUT)
|
||||
DMAPageRead(scsi->data_ptr, sd->sc->temp_buffer, MIN(sd->buffer_length, (int)scsi->data_len));
|
||||
dma_bm_read(scsi->data_ptr, sd->sc->temp_buffer, MIN(sd->buffer_length, (int)scsi->data_len), 2);
|
||||
}
|
||||
|
||||
scsi_device_command_phase1(sd);
|
||||
|
||||
@@ -250,7 +250,7 @@ completion_code(uint8_t *sense)
|
||||
|
||||
|
||||
static uint8_t
|
||||
x54x_bios_scsi_command(scsi_device_t *dev, uint8_t *cdb, uint8_t *buf, int len, uint32_t addr)
|
||||
x54x_bios_scsi_command(scsi_device_t *dev, uint8_t *cdb, uint8_t *buf, int len, uint32_t addr, int transfer_size)
|
||||
{
|
||||
dev->buffer_length = -1;
|
||||
|
||||
@@ -269,12 +269,12 @@ x54x_bios_scsi_command(scsi_device_t *dev, uint8_t *cdb, uint8_t *buf, int len,
|
||||
if (buf)
|
||||
memcpy(buf, dev->sc->temp_buffer, dev->buffer_length);
|
||||
else
|
||||
DMAPageWrite(addr, dev->sc->temp_buffer, dev->buffer_length);
|
||||
dma_bm_write(addr, dev->sc->temp_buffer, dev->buffer_length, transfer_size);
|
||||
} else if (dev->phase == SCSI_PHASE_DATA_OUT) {
|
||||
if (buf)
|
||||
memcpy(dev->sc->temp_buffer, buf, dev->buffer_length);
|
||||
else
|
||||
DMAPageRead(addr, dev->sc->temp_buffer, dev->buffer_length);
|
||||
dma_bm_read(addr, dev->sc->temp_buffer, dev->buffer_length, transfer_size);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -285,7 +285,7 @@ x54x_bios_scsi_command(scsi_device_t *dev, uint8_t *cdb, uint8_t *buf, int len,
|
||||
|
||||
|
||||
static uint8_t
|
||||
x54x_bios_read_capacity(scsi_device_t *sd, uint8_t *buf)
|
||||
x54x_bios_read_capacity(scsi_device_t *sd, uint8_t *buf, int transfer_size)
|
||||
{
|
||||
uint8_t *cdb;
|
||||
uint8_t ret;
|
||||
@@ -295,7 +295,7 @@ x54x_bios_read_capacity(scsi_device_t *sd, uint8_t *buf)
|
||||
cdb[0] = GPCMD_READ_CDROM_CAPACITY;
|
||||
|
||||
memset(buf, 0, 8);
|
||||
ret = x54x_bios_scsi_command(sd, cdb, buf, 8, 0);
|
||||
ret = x54x_bios_scsi_command(sd, cdb, buf, 8, 0, transfer_size);
|
||||
|
||||
free(cdb);
|
||||
|
||||
@@ -304,7 +304,7 @@ x54x_bios_read_capacity(scsi_device_t *sd, uint8_t *buf)
|
||||
|
||||
|
||||
static uint8_t
|
||||
x54x_bios_inquiry(scsi_device_t *sd, uint8_t *buf)
|
||||
x54x_bios_inquiry(scsi_device_t *sd, uint8_t *buf, int transfer_size)
|
||||
{
|
||||
uint8_t *cdb;
|
||||
uint8_t ret;
|
||||
@@ -315,7 +315,7 @@ x54x_bios_inquiry(scsi_device_t *sd, uint8_t *buf)
|
||||
cdb[4] = 36;
|
||||
|
||||
memset(buf, 0, 36);
|
||||
ret = x54x_bios_scsi_command(sd, cdb, buf, 36, 0);
|
||||
ret = x54x_bios_scsi_command(sd, cdb, buf, 36, 0, transfer_size);
|
||||
|
||||
free(cdb);
|
||||
|
||||
@@ -324,7 +324,7 @@ x54x_bios_inquiry(scsi_device_t *sd, uint8_t *buf)
|
||||
|
||||
|
||||
static uint8_t
|
||||
x54x_bios_command_08(scsi_device_t *sd, uint8_t *buffer)
|
||||
x54x_bios_command_08(scsi_device_t *sd, uint8_t *buffer, int transfer_size)
|
||||
{
|
||||
uint8_t *rcbuf;
|
||||
uint8_t ret;
|
||||
@@ -333,7 +333,7 @@ x54x_bios_command_08(scsi_device_t *sd, uint8_t *buffer)
|
||||
memset(buffer, 0x00, 6);
|
||||
|
||||
rcbuf = (uint8_t *) malloc(8);
|
||||
ret = x54x_bios_read_capacity(sd, rcbuf);
|
||||
ret = x54x_bios_read_capacity(sd, rcbuf, transfer_size);
|
||||
if (ret) {
|
||||
free(rcbuf);
|
||||
return(ret);
|
||||
@@ -354,7 +354,7 @@ x54x_bios_command_08(scsi_device_t *sd, uint8_t *buffer)
|
||||
|
||||
|
||||
static int
|
||||
x54x_bios_command_15(scsi_device_t *sd, uint8_t *buffer)
|
||||
x54x_bios_command_15(scsi_device_t *sd, uint8_t *buffer, int transfer_size)
|
||||
{
|
||||
uint8_t *inqbuf, *rcbuf;
|
||||
uint8_t ret;
|
||||
@@ -363,7 +363,7 @@ x54x_bios_command_15(scsi_device_t *sd, uint8_t *buffer)
|
||||
memset(buffer, 0x00, 6);
|
||||
|
||||
inqbuf = (uint8_t *) malloc(36);
|
||||
ret = x54x_bios_inquiry(sd, inqbuf);
|
||||
ret = x54x_bios_inquiry(sd, inqbuf, transfer_size);
|
||||
if (ret) {
|
||||
free(inqbuf);
|
||||
return(ret);
|
||||
@@ -373,7 +373,7 @@ x54x_bios_command_15(scsi_device_t *sd, uint8_t *buffer)
|
||||
buffer[5] = inqbuf[1];
|
||||
|
||||
rcbuf = (uint8_t *) malloc(8);
|
||||
ret = x54x_bios_read_capacity(sd, rcbuf);
|
||||
ret = x54x_bios_read_capacity(sd, rcbuf, transfer_size);
|
||||
if (ret) {
|
||||
free(rcbuf);
|
||||
free(inqbuf);
|
||||
@@ -463,8 +463,7 @@ x54x_bios_command(x54x_t *x54x, uint8_t max_id, BIOSCMD *cmd, int8_t islba)
|
||||
if (sector_len > 0) {
|
||||
x54x_log("BIOS DMA: Reading 14 bytes at %08X\n",
|
||||
dma_address);
|
||||
DMAPageWrite(dma_address,
|
||||
scsi_device_sense(dev), 14);
|
||||
dma_bm_write(dma_address, scsi_device_sense(dev), 14, x54x->transfer_size);
|
||||
}
|
||||
|
||||
return(0);
|
||||
@@ -485,7 +484,7 @@ x54x_bios_command(x54x_t *x54x, uint8_t max_id, BIOSCMD *cmd, int8_t islba)
|
||||
if (cmd->command != 0x0c)
|
||||
cdb[8] = sector_len;
|
||||
|
||||
ret = x54x_bios_scsi_command(dev, cdb, NULL, sector_len, dma_address);
|
||||
ret = x54x_bios_scsi_command(dev, cdb, NULL, sector_len, dma_address, x54x->transfer_size);
|
||||
if (cmd->command == 0x0c)
|
||||
ret = !!ret;
|
||||
break;
|
||||
@@ -519,7 +518,7 @@ x54x_bios_command(x54x_t *x54x, uint8_t max_id, BIOSCMD *cmd, int8_t islba)
|
||||
cdb[0] = bios_cmd_to_scsi[cmd->command];
|
||||
cdb[1] = (cmd->lun & 7) << 5;
|
||||
|
||||
ret = x54x_bios_scsi_command(dev, cdb, NULL, sector_len, dma_address);
|
||||
ret = x54x_bios_scsi_command(dev, cdb, NULL, sector_len, dma_address, x54x->transfer_size);
|
||||
break;
|
||||
|
||||
case 0x08: /* Read Drive Parameters */
|
||||
@@ -530,12 +529,12 @@ x54x_bios_command(x54x_t *x54x, uint8_t max_id, BIOSCMD *cmd, int8_t islba)
|
||||
|
||||
buf = (uint8_t *) malloc(6);
|
||||
if (cmd->command == 0x08)
|
||||
ret = x54x_bios_command_08(dev, buf);
|
||||
ret = x54x_bios_command_08(dev, buf, x54x->transfer_size);
|
||||
else
|
||||
ret = x54x_bios_command_15(dev, buf);
|
||||
ret = x54x_bios_command_15(dev, buf, x54x->transfer_size);
|
||||
|
||||
x54x_log("BIOS DMA: Reading 6 bytes at %08X\n", dma_address);
|
||||
DMAPageWrite(dma_address, buf, 4);
|
||||
dma_bm_write(dma_address, buf, 4, x54x->transfer_size);
|
||||
free(buf);
|
||||
|
||||
break;
|
||||
@@ -597,12 +596,15 @@ static void
|
||||
x54x_ccb(x54x_t *dev)
|
||||
{
|
||||
Req_t *req = &dev->Req;
|
||||
uint8_t bytes[4] = { 0, 0, 0, 0};
|
||||
|
||||
/* Rewrite the CCB up to the CDB. */
|
||||
x54x_log("CCB completion code and statuses rewritten (pointer %08X)\n", req->CCBPointer);
|
||||
DMAPageWrite(req->CCBPointer + 0x000D, &(req->MailboxCompletionCode), 1);
|
||||
DMAPageWrite(req->CCBPointer + 0x000E, &(req->HostStatus), 1);
|
||||
DMAPageWrite(req->CCBPointer + 0x000F, &(req->TargetStatus), 1);
|
||||
dma_bm_read(req->CCBPointer + 0x000C, (uint8_t *) bytes, 4, dev->transfer_size);
|
||||
bytes[1] = req->MailboxCompletionCode;
|
||||
bytes[2] = req->HostStatus;
|
||||
bytes[3] = req->TargetStatus;
|
||||
dma_bm_write(req->CCBPointer + 0x000C, (uint8_t *) bytes, 4, dev->transfer_size);
|
||||
x54x_add_to_period(dev, 3);
|
||||
|
||||
if (dev->MailboxOutInterrupts)
|
||||
@@ -623,6 +625,7 @@ x54x_mbi(x54x_t *dev)
|
||||
uint8_t TargetStatus = req->TargetStatus;
|
||||
uint32_t MailboxCompletionCode = req->MailboxCompletionCode;
|
||||
uint32_t Incoming;
|
||||
uint8_t bytes[4] = { 0, 0, 0, 0 };
|
||||
|
||||
Incoming = dev->MailboxInAddr + (dev->MailboxInPosCur * ((dev->flags & X54X_MBX_24BIT) ? sizeof(Mailbox_t) : sizeof(Mailbox32_t)));
|
||||
|
||||
@@ -632,8 +635,10 @@ x54x_mbi(x54x_t *dev)
|
||||
|
||||
/* Rewrite the CCB up to the CDB. */
|
||||
x54x_log("CCB statuses rewritten (pointer %08X)\n", req->CCBPointer);
|
||||
DMAPageWrite(req->CCBPointer + 0x000E, &(req->HostStatus), 1);
|
||||
DMAPageWrite(req->CCBPointer + 0x000F, &(req->TargetStatus), 1);
|
||||
dma_bm_read(req->CCBPointer + 0x000C, (uint8_t *) bytes, 4, dev->transfer_size);
|
||||
bytes[2] = req->HostStatus;
|
||||
bytes[3] = req->TargetStatus;
|
||||
dma_bm_write(req->CCBPointer + 0x000C, (uint8_t *) bytes, 4, dev->transfer_size);
|
||||
x54x_add_to_period(dev, 2);
|
||||
} else {
|
||||
x54x_log("Mailbox not found!\n");
|
||||
@@ -644,16 +649,19 @@ x54x_mbi(x54x_t *dev)
|
||||
if (dev->flags & X54X_MBX_24BIT) {
|
||||
U32_TO_ADDR(CCBPointer, req->CCBPointer);
|
||||
x54x_log("Mailbox 24-bit: Status=0x%02X, CCB at 0x%04X\n", req->MailboxCompletionCode, CCBPointer);
|
||||
DMAPageWrite(Incoming, &(req->MailboxCompletionCode), 1);
|
||||
DMAPageWrite(Incoming + 1, (uint8_t *)&CCBPointer, 3);
|
||||
bytes[0] = req->MailboxCompletionCode;
|
||||
memcpy(&(bytes[1]), (uint8_t *)&CCBPointer, 3);
|
||||
dma_bm_write(Incoming, (uint8_t *) bytes, 4, dev->transfer_size);
|
||||
x54x_add_to_period(dev, 4);
|
||||
x54x_log("%i bytes of 24-bit mailbox written to: %08X\n", sizeof(Mailbox_t), Incoming);
|
||||
} else {
|
||||
x54x_log("Mailbox 32-bit: Status=0x%02X, CCB at 0x%04X\n", req->MailboxCompletionCode, CCBPointer);
|
||||
DMAPageWrite(Incoming, (uint8_t *)&(req->CCBPointer), 4);
|
||||
DMAPageWrite(Incoming + 4, &(req->HostStatus), 1);
|
||||
DMAPageWrite(Incoming + 5, &(req->TargetStatus), 1);
|
||||
DMAPageWrite(Incoming + 7, &(req->MailboxCompletionCode), 1);
|
||||
dma_bm_write(Incoming, (uint8_t *)&(req->CCBPointer), 4, dev->transfer_size);
|
||||
dma_bm_read(Incoming + 4, (uint8_t *) bytes, 4, dev->transfer_size);
|
||||
bytes[0] = req->HostStatus;
|
||||
bytes[1] = req->TargetStatus;
|
||||
bytes[3] = req->MailboxCompletionCode;
|
||||
dma_bm_write(Incoming + 4, (uint8_t *) bytes, 4, dev->transfer_size);
|
||||
x54x_add_to_period(dev, 7);
|
||||
x54x_log("%i bytes of 32-bit mailbox written to: %08X\n", sizeof(Mailbox32_t), Incoming);
|
||||
}
|
||||
@@ -672,9 +680,17 @@ static void
|
||||
x54x_rd_sge(x54x_t *dev, int Is24bit, uint32_t Address, SGE32 *SG)
|
||||
{
|
||||
SGE SGE24;
|
||||
uint8_t bytes[8];
|
||||
|
||||
if (Is24bit) {
|
||||
DMAPageRead(Address, (uint8_t *)&SGE24, sizeof(SGE));
|
||||
if (dev->transfer_size == 4) {
|
||||
/* 32-bit device, do this to make the transfer divisible by 4 bytes. */
|
||||
dma_bm_read(Address, (uint8_t *) bytes, 8, dev->transfer_size);
|
||||
memcpy((uint8_t *)&SGE24, bytes, sizeof(SGE));
|
||||
} else {
|
||||
/* 16-bit device, special handling not needed. */
|
||||
dma_bm_read(Address, (uint8_t *)&SGE24, 8, dev->transfer_size);
|
||||
}
|
||||
x54x_add_to_period(dev, sizeof(SGE));
|
||||
|
||||
/* Convert the 24-bit entries into 32-bit entries. */
|
||||
@@ -682,7 +698,7 @@ x54x_rd_sge(x54x_t *dev, int Is24bit, uint32_t Address, SGE32 *SG)
|
||||
SG->Segment = ADDR_TO_U32(SGE24.Segment);
|
||||
SG->SegmentPointer = ADDR_TO_U32(SGE24.SegmentPointer);
|
||||
} else {
|
||||
DMAPageRead(Address, (uint8_t *)SG, sizeof(SGE32));
|
||||
dma_bm_read(Address, (uint8_t *)SG, sizeof(SGE32), dev->transfer_size);
|
||||
x54x_add_to_period(dev, sizeof(SGE32));
|
||||
}
|
||||
}
|
||||
@@ -737,6 +753,7 @@ x54x_set_residue(x54x_t *dev, Req_t *req, int32_t TransferLength)
|
||||
uint32_t Residue = 0;
|
||||
addr24 Residue24;
|
||||
int32_t BufLen = scsi_devices[req->TargetID].buffer_length;
|
||||
uint8_t bytes[4] = { 0, 0, 0, 0 };
|
||||
|
||||
if ((req->CmdBlock.common.Opcode == SCSI_INITIATOR_COMMAND_RES) ||
|
||||
(req->CmdBlock.common.Opcode == SCATTER_GATHER_COMMAND_RES)) {
|
||||
@@ -749,11 +766,13 @@ x54x_set_residue(x54x_t *dev, Req_t *req, int32_t TransferLength)
|
||||
|
||||
if (req->Is24bit) {
|
||||
U32_TO_ADDR(Residue24, Residue);
|
||||
DMAPageWrite(req->CCBPointer + 0x0004, (uint8_t *)&Residue24, 3);
|
||||
dma_bm_read(req->CCBPointer + 0x0004, (uint8_t *) bytes, 4, dev->transfer_size);
|
||||
memcpy((uint8_t *) bytes, (uint8_t *)&Residue24, 3);
|
||||
dma_bm_write(req->CCBPointer + 0x0004, (uint8_t *) bytes, 4, dev->transfer_size);
|
||||
x54x_add_to_period(dev, 3);
|
||||
x54x_log("24-bit Residual data length for reading: %d\n", Residue);
|
||||
} else {
|
||||
DMAPageWrite(req->CCBPointer + 0x0004, (uint8_t *)&Residue, 4);
|
||||
dma_bm_write(req->CCBPointer + 0x0004, (uint8_t *)&Residue, 4, dev->transfer_size);
|
||||
x54x_add_to_period(dev, 4);
|
||||
x54x_log("32-bit Residual data length for reading: %d\n", Residue);
|
||||
}
|
||||
@@ -799,11 +818,11 @@ x54x_buf_dma_transfer(x54x_t *dev, Req_t *req, int Is24bit, int TransferLength,
|
||||
|
||||
if (read_from_host && DataToTransfer) {
|
||||
x54x_log("Reading S/G segment %i: length %i, pointer %08X\n", i, DataToTransfer, Address);
|
||||
DMAPageRead(Address, &(scsi_devices[req->TargetID].sc->temp_buffer[sg_pos]), DataToTransfer);
|
||||
dma_bm_read(Address, &(scsi_devices[req->TargetID].sc->temp_buffer[sg_pos]), DataToTransfer, dev->transfer_size);
|
||||
}
|
||||
else if (write_to_host && DataToTransfer) {
|
||||
x54x_log("Writing S/G segment %i: length %i, pointer %08X\n", i, DataToTransfer, Address);
|
||||
DMAPageWrite(Address, &(scsi_devices[req->TargetID].sc->temp_buffer[sg_pos]), DataToTransfer);
|
||||
dma_bm_write(Address, &(scsi_devices[req->TargetID].sc->temp_buffer[sg_pos]), DataToTransfer, dev->transfer_size);
|
||||
}
|
||||
else
|
||||
x54x_log("No action on S/G segment %i: length %i, pointer %08X\n", i, DataToTransfer, Address);
|
||||
@@ -823,9 +842,9 @@ x54x_buf_dma_transfer(x54x_t *dev, Req_t *req, int Is24bit, int TransferLength,
|
||||
|
||||
if ((DataLength > 0) && (BufLen > 0) && (req->CmdBlock.common.ControlByte < 0x03)) {
|
||||
if (read_from_host)
|
||||
DMAPageRead(Address, scsi_devices[req->TargetID].sc->temp_buffer, MIN(BufLen, (int) DataLength));
|
||||
dma_bm_read(Address, scsi_devices[req->TargetID].sc->temp_buffer, MIN(BufLen, (int) DataLength), dev->transfer_size);
|
||||
else if (write_to_host)
|
||||
DMAPageWrite(Address, scsi_devices[req->TargetID].sc->temp_buffer, MIN(BufLen, (int) DataLength));
|
||||
dma_bm_write(Address, scsi_devices[req->TargetID].sc->temp_buffer, MIN(BufLen, (int) DataLength), dev->transfer_size);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -884,7 +903,7 @@ SenseBufferFree(x54x_t *dev, Req_t *req, int Copy)
|
||||
|
||||
x54x_log("SenseBufferFree(): Writing %i bytes at %08X\n",
|
||||
SenseLength, SenseBufferAddress);
|
||||
DMAPageWrite(SenseBufferAddress, temp_sense, SenseLength);
|
||||
dma_bm_write(SenseBufferAddress, temp_sense, SenseLength, dev->transfer_size);
|
||||
x54x_add_to_period(dev, SenseLength);
|
||||
x54x_log("Sense data written to buffer: %02X %02X %02X\n",
|
||||
temp_sense[2], temp_sense[12], temp_sense[13]);
|
||||
@@ -986,7 +1005,7 @@ x54x_request_sense(x54x_t *dev)
|
||||
sd->buffer_length = ConvertSenseLength(req->CmdBlock.common.RequestSenseLength);
|
||||
if ((sd->status != SCSI_STATUS_OK) && (sd->buffer_length > 0)) {
|
||||
SenseBufferAddress = SenseBufferPointer(req);
|
||||
DMAPageWrite(SenseBufferAddress, scsi_devices[req->TargetID].sc->temp_buffer, sd->buffer_length);
|
||||
dma_bm_write(SenseBufferAddress, scsi_devices[req->TargetID].sc->temp_buffer, sd->buffer_length, dev->transfer_size);
|
||||
x54x_add_to_period(dev, sd->buffer_length);
|
||||
}
|
||||
scsi_device_command_phase1(sd);
|
||||
@@ -1021,7 +1040,7 @@ x54x_mbo_free(x54x_t *dev)
|
||||
CodeOffset = (dev->flags & X54X_MBX_24BIT) ? 0 : 7;
|
||||
|
||||
x54x_log("x54x_mbo_free(): Writing %i bytes at %08X\n", sizeof(CmdStatus), dev->Outgoing + CodeOffset);
|
||||
DMAPageWrite(dev->Outgoing + CodeOffset, &CmdStatus, 1);
|
||||
dma_bm_write(dev->Outgoing + CodeOffset, &CmdStatus, 1, dev->transfer_size);
|
||||
}
|
||||
|
||||
|
||||
@@ -1045,7 +1064,7 @@ x54x_req_setup(x54x_t *dev, uint32_t CCBPointer, Mailbox32_t *Mailbox32)
|
||||
scsi_device_t *sd;
|
||||
|
||||
/* Fetch data from the Command Control Block. */
|
||||
DMAPageRead(CCBPointer, (uint8_t *)&req->CmdBlock, sizeof(CCB32));
|
||||
dma_bm_read(CCBPointer, (uint8_t *)&req->CmdBlock, sizeof(CCB32), dev->transfer_size);
|
||||
x54x_add_to_period(dev, sizeof(CCB32));
|
||||
|
||||
req->Is24bit = !!(dev->flags & X54X_MBX_24BIT);
|
||||
@@ -1107,7 +1126,7 @@ x54x_req_abort(x54x_t *dev, uint32_t CCBPointer)
|
||||
CCBU CmdBlock;
|
||||
|
||||
/* Fetch data from the Command Control Block. */
|
||||
DMAPageRead(CCBPointer, (uint8_t *)&CmdBlock, sizeof(CCB32));
|
||||
dma_bm_read(CCBPointer, (uint8_t *)&CmdBlock, sizeof(CCB32), dev->transfer_size);
|
||||
x54x_add_to_period(dev, sizeof(CCB32));
|
||||
|
||||
x54x_mbi_setup(dev, CCBPointer, &CmdBlock,
|
||||
@@ -1135,7 +1154,7 @@ x54x_mbo(x54x_t *dev, Mailbox32_t *Mailbox32)
|
||||
|
||||
if (dev->flags & X54X_MBX_24BIT) {
|
||||
Outgoing = Addr + (Cur * sizeof(Mailbox_t));
|
||||
DMAPageRead(Outgoing, (uint8_t *)&MailboxOut, sizeof(Mailbox_t));
|
||||
dma_bm_read(Outgoing, (uint8_t *)&MailboxOut, sizeof(Mailbox_t), dev->transfer_size);
|
||||
x54x_add_to_period(dev, sizeof(Mailbox_t));
|
||||
|
||||
ccbp = *(uint32_t *) &MailboxOut;
|
||||
@@ -1144,7 +1163,7 @@ x54x_mbo(x54x_t *dev, Mailbox32_t *Mailbox32)
|
||||
} else {
|
||||
Outgoing = Addr + (Cur * sizeof(Mailbox32_t));
|
||||
|
||||
DMAPageRead(Outgoing, (uint8_t *)Mailbox32, sizeof(Mailbox32_t));
|
||||
dma_bm_read(Outgoing, (uint8_t *)Mailbox32, sizeof(Mailbox32_t), dev->transfer_size);
|
||||
x54x_add_to_period(dev, sizeof(Mailbox32_t));
|
||||
}
|
||||
|
||||
@@ -1716,7 +1735,7 @@ x54x_out(uint16_t port, uint8_t val, void *priv)
|
||||
Address.lo = dev->CmdBuf[2];
|
||||
FIFOBuf = ADDR_TO_U32(Address);
|
||||
x54x_log("Adaptec LocalRAM: Reading 64 bytes at %08X\n", FIFOBuf);
|
||||
DMAPageRead(FIFOBuf, dev->dma_buffer, 64);
|
||||
dma_bm_read(FIFOBuf, dev->dma_buffer, 64, dev->transfer_size);
|
||||
break;
|
||||
|
||||
case CMD_READ_CH2: /* write channel 2 buffer */
|
||||
@@ -1726,7 +1745,7 @@ x54x_out(uint16_t port, uint8_t val, void *priv)
|
||||
Address.lo = dev->CmdBuf[2];
|
||||
FIFOBuf = ADDR_TO_U32(Address);
|
||||
x54x_log("Adaptec LocalRAM: Writing 64 bytes at %08X\n", FIFOBuf);
|
||||
DMAPageWrite(FIFOBuf, dev->dma_buffer, 64);
|
||||
dma_bm_write(FIFOBuf, dev->dma_buffer, 64, dev->transfer_size);
|
||||
break;
|
||||
|
||||
case CMD_OPTIONS: /* Set adapter options */
|
||||
@@ -1906,6 +1925,11 @@ x54x_init(const device_t *info)
|
||||
dev->timer.period = 10.0;
|
||||
timer_set_delay_u64(&dev->timer, (uint64_t) (dev->timer.period * ((double) TIMER_USEC)));
|
||||
|
||||
if (x54x_is_32bit(dev))
|
||||
dev->transfer_size = 4;
|
||||
else
|
||||
dev->transfer_size = 2;
|
||||
|
||||
return(dev);
|
||||
}
|
||||
|
||||
|
||||
@@ -230,7 +230,7 @@ void* fluidsynth_init(const device_t *info)
|
||||
#endif
|
||||
if (fluidsynth_handle == NULL)
|
||||
{
|
||||
ui_msgbox(MBX_ERROR, (wchar_t *)IDS_2081);
|
||||
ui_msgbox(MBX_ERROR, (wchar_t *)IDS_2080);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@ typedef struct {
|
||||
uint8_t uart_ctrl;
|
||||
uint8_t uart_status;
|
||||
|
||||
uint16_t codec_regs[64];
|
||||
uint16_t codec_regs[128];
|
||||
uint32_t codec_ctrl;
|
||||
|
||||
struct {
|
||||
@@ -357,7 +357,9 @@ static uint32_t es1371_inl(uint16_t port, void *p)
|
||||
|
||||
case 0x14:
|
||||
ret = es1371->codec_ctrl & 0x00ff0000;
|
||||
ret |= es1371->codec_regs[(es1371->codec_ctrl >> 16) & 0x3f];
|
||||
ret |= es1371->codec_regs[(es1371->codec_ctrl >> 16) & 0x7f];
|
||||
if (((es1371->codec_ctrl >> 16) & 0x7f) == 0x26)
|
||||
ret |= 0x0f;
|
||||
ret |= CODEC_READY;
|
||||
break;
|
||||
|
||||
@@ -589,9 +591,10 @@ static void es1371_outl(uint16_t port, uint32_t val, void *p)
|
||||
es1371->codec_ctrl = val;
|
||||
if (!(val & CODEC_READ))
|
||||
{
|
||||
// audiopci_log("Write codec %02x %04x\n", (val >> 16) & 0x3f, val & 0xffff);
|
||||
es1371->codec_regs[(val >> 16) & 0x3f] = val & 0xffff;
|
||||
switch ((val >> 16) & 0x3f)
|
||||
// audiopci_log("Write codec %02x %04x\n", (val >> 16) & 0x7f, val & 0xffff);
|
||||
if ((((val >> 16) & 0x7f) != 0x7c) || (((val >> 16) & 0x7f) != 0x7e))
|
||||
es1371->codec_regs[(val >> 16) & 0x7f] = val & 0xffff;
|
||||
switch ((val >> 16) & 0x7f)
|
||||
{
|
||||
case 0x02: /*Master volume*/
|
||||
if (val & 0x8000)
|
||||
@@ -1315,7 +1318,11 @@ static void *es1371_init(const device_t *info)
|
||||
timer_add(&es1371->dac[1].timer, es1371_poll, es1371, 1);
|
||||
|
||||
generate_es1371_filter();
|
||||
|
||||
|
||||
/* Return a CS4297A like VMWare does. */
|
||||
es1371->codec_regs[0x7c] = 0x4352;
|
||||
es1371->codec_regs[0x7e] = 0x5910;
|
||||
|
||||
return es1371;
|
||||
}
|
||||
|
||||
|
||||
62
src/spd.c
62
src/spd.c
@@ -8,7 +8,7 @@
|
||||
*
|
||||
* Emulation of SPD (Serial Presence Detect) devices.
|
||||
*
|
||||
* Version: @(#)spd.c 1.0.0 2020/03/24
|
||||
*
|
||||
*
|
||||
* Authors: RichardG, <richardg867@gmail.com>
|
||||
*
|
||||
@@ -27,9 +27,6 @@
|
||||
#include <86box/spd.h>
|
||||
|
||||
|
||||
#define SPD_MAX_SLOTS 8
|
||||
#define SPD_DATA_SIZE 256
|
||||
|
||||
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||
|
||||
|
||||
@@ -153,10 +150,16 @@ spd_register(uint8_t ram_type, uint8_t slot_mask, uint16_t max_module_size)
|
||||
{
|
||||
uint8_t slot, slot_count, vslot, next_empty_vslot, i, split;
|
||||
uint16_t min_module_size, total_size, vslots[SPD_MAX_SLOTS];
|
||||
spd_edo_t *edo_data;
|
||||
spd_sdram_t *sdram_data;
|
||||
|
||||
/* determine the minimum module size for this RAM type */
|
||||
switch (ram_type) {
|
||||
case SPD_TYPE_FPM:
|
||||
case SPD_TYPE_EDO:
|
||||
min_module_size = SPD_MIN_SIZE_EDO;
|
||||
break;
|
||||
|
||||
case SPD_TYPE_SDRAM:
|
||||
min_module_size = SPD_MIN_SIZE_SDRAM;
|
||||
break;
|
||||
@@ -192,8 +195,8 @@ spd_register(uint8_t ram_type, uint8_t slot_mask, uint16_t max_module_size)
|
||||
if (total_size > 0) /* did we populate everything? */
|
||||
spd_log("SPD: not enough RAM slots (%d) to cover memory (%d MB short)\n", slot_count, total_size);
|
||||
|
||||
/* populate empty vslots by splitting modules while possible */
|
||||
split = 1;
|
||||
/* populate empty vslots by splitting modules... */
|
||||
split = (total_size == 0); /* ...if possible */
|
||||
while (split) {
|
||||
/* look for a module to split */
|
||||
split = 0;
|
||||
@@ -229,7 +232,7 @@ spd_register(uint8_t ram_type, uint8_t slot_mask, uint16_t max_module_size)
|
||||
|
||||
spd_log("SPD: registering slot %d = vslot %d = %d MB\n", slot, vslot, vslots[vslot]);
|
||||
|
||||
spd_devices[slot] = (device_t *)malloc(sizeof(device_t));
|
||||
spd_devices[slot] = (device_t *) malloc(sizeof(device_t));
|
||||
memset(spd_devices[slot], 0, sizeof(device_t));
|
||||
spd_devices[slot]->name = "Serial Presence Detect ROM";
|
||||
spd_devices[slot]->local = slot;
|
||||
@@ -237,8 +240,41 @@ spd_register(uint8_t ram_type, uint8_t slot_mask, uint16_t max_module_size)
|
||||
spd_devices[slot]->close = spd_close;
|
||||
|
||||
switch (ram_type) {
|
||||
case SPD_TYPE_FPM:
|
||||
case SPD_TYPE_EDO:
|
||||
edo_data = (spd_edo_t *) &spd_data[slot];
|
||||
memset(edo_data, 0, sizeof(spd_edo_t));
|
||||
|
||||
/* FIXME: very little information about EDO SPD is available,
|
||||
let alone software to interpret it correctly. */
|
||||
edo_data->bytes_used = 0x80;
|
||||
edo_data->spd_size = 0x08;
|
||||
edo_data->mem_type = ram_type;
|
||||
edo_data->row_bits = 6 + log2_ui16(vslots[vslot]);
|
||||
edo_data->col_bits = 9;
|
||||
edo_data->banks = 2;
|
||||
edo_data->data_width_lsb = 64;
|
||||
edo_data->signal_level = SPD_SIGNAL_LVTTL;
|
||||
edo_data->trac = 50;
|
||||
edo_data->tcac = 13;
|
||||
edo_data->refresh_rate = SPD_REFRESH_NORMAL;
|
||||
edo_data->dram_width = 8;
|
||||
|
||||
edo_data->spd_rev = 0x12;
|
||||
sprintf(edo_data->part_no, "86Box-%s-%03dM", (ram_type == SPD_TYPE_FPM) ? "FPM" : "EDO", vslots[vslot]);
|
||||
for (i = strlen(edo_data->part_no); i < sizeof(edo_data->part_no); i++)
|
||||
edo_data->part_no[i] = ' ';
|
||||
edo_data->mfg_year = 20;
|
||||
edo_data->mfg_week = 17;
|
||||
|
||||
for (i = 0; i < 63; i++)
|
||||
edo_data->checksum += spd_data[slot][i];
|
||||
for (i = 0; i < 129; i++)
|
||||
edo_data->checksum2 += spd_data[slot][i];
|
||||
break;
|
||||
|
||||
case SPD_TYPE_SDRAM:
|
||||
sdram_data = (spd_sdram_t *)&spd_data[slot];
|
||||
sdram_data = (spd_sdram_t *) &spd_data[slot];
|
||||
memset(sdram_data, 0, sizeof(spd_sdram_t));
|
||||
|
||||
sdram_data->bytes_used = 0x80;
|
||||
@@ -248,12 +284,10 @@ spd_register(uint8_t ram_type, uint8_t slot_mask, uint16_t max_module_size)
|
||||
sdram_data->col_bits = 9;
|
||||
sdram_data->rows = 2;
|
||||
sdram_data->data_width_lsb = 64;
|
||||
sdram_data->data_width_msb = 0;
|
||||
sdram_data->signal_level = SPD_SDR_SIGNAL_LVTTL;
|
||||
sdram_data->signal_level = SPD_SIGNAL_LVTTL;
|
||||
sdram_data->tclk = 0x75; /* 7.5 ns = 133.3 MHz */
|
||||
sdram_data->tac = 0x10;
|
||||
sdram_data->config = 0;
|
||||
sdram_data->refresh_rate = SPD_SDR_REFRESH_SELF | SPD_SDR_REFRESH_NORMAL;
|
||||
sdram_data->refresh_rate = SPD_SDR_REFRESH_SELF | SPD_REFRESH_NORMAL;
|
||||
sdram_data->sdram_width = 8;
|
||||
sdram_data->tccd = 1;
|
||||
sdram_data->burst = SPD_SDR_BURST_PAGE | 1 | 2 | 4 | 8;
|
||||
@@ -267,17 +301,21 @@ spd_register(uint8_t ram_type, uint8_t slot_mask, uint16_t max_module_size)
|
||||
sdram_data->bank_density = 1 << (log2_ui16(vslots[vslot] >> 1) - 2);
|
||||
sdram_data->ca_setup = sdram_data->data_setup = 0x15;
|
||||
sdram_data->ca_hold = sdram_data->data_hold = 0x08;
|
||||
|
||||
sdram_data->spd_rev = 0x12;
|
||||
sprintf(sdram_data->part_no, "86Box-SDR-%03dM", vslots[vslot]);
|
||||
for (i = strlen(sdram_data->part_no); i < sizeof(sdram_data->part_no); i++)
|
||||
sdram_data->part_no[i] = ' ';
|
||||
sdram_data->mfg_year = 20;
|
||||
sdram_data->mfg_week = 13;
|
||||
|
||||
sdram_data->freq = 100;
|
||||
sdram_data->features = 0xFF;
|
||||
|
||||
for (i = 0; i < 63; i++)
|
||||
sdram_data->checksum += spd_data[slot][i];
|
||||
for (i = 0; i < 129; i++)
|
||||
sdram_data->checksum2 += spd_data[slot][i];
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -4997,7 +4997,7 @@ mystique_init(const device_t *info)
|
||||
mystique->wake_fifo_thread = thread_create_event();
|
||||
mystique->fifo_not_full_event = thread_create_event();
|
||||
mystique->fifo_thread = thread_create(fifo_thread, mystique);
|
||||
mystique->dma.lock = thread_create_mutex(L"86Box.MGAMutex");
|
||||
mystique->dma.lock = thread_create_mutex();
|
||||
|
||||
timer_add(&mystique->wake_timer, mystique_wake_timer, (void *)mystique, 0);
|
||||
timer_add(&mystique->softrap_pending_timer, mystique_softrap_pending_timer, (void *)mystique, 1);
|
||||
|
||||
141
src/win/86Box.rc
141
src/win/86Box.rc
@@ -172,6 +172,62 @@ BEGIN
|
||||
MENUITEM SEPARATOR
|
||||
END
|
||||
|
||||
FloppySubmenu MENU DISCARDABLE
|
||||
BEGIN
|
||||
POPUP ""
|
||||
BEGIN
|
||||
MENUITEM "&New image...", IDM_FLOPPY_IMAGE_NEW
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Existing image...", IDM_FLOPPY_IMAGE_EXISTING
|
||||
MENUITEM "Existing image (&Write-protected)...", IDM_FLOPPY_IMAGE_EXISTING_WP
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "E&xport to 86F...", IDM_FLOPPY_EXPORT_TO_86F
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "E&ject", IDM_FLOPPY_EJECT
|
||||
END
|
||||
END
|
||||
|
||||
CdromSubmenu MENU DISCARDABLE
|
||||
BEGIN
|
||||
POPUP ""
|
||||
BEGIN
|
||||
MENUITEM "&Mute", IDM_CDROM_MUTE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "E&mpty", IDM_CDROM_EMPTY
|
||||
MENUITEM "&Reload previous image", IDM_CDROM_RELOAD
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Image", IDM_CDROM_IMAGE
|
||||
END
|
||||
END
|
||||
|
||||
ZIPSubmenu MENU DISCARDABLE
|
||||
BEGIN
|
||||
POPUP ""
|
||||
BEGIN
|
||||
MENUITEM "&New image...", IDM_ZIP_IMAGE_NEW
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Existing image...", IDM_ZIP_IMAGE_EXISTING
|
||||
MENUITEM "Existing image (&Write-protected)...", IDM_ZIP_IMAGE_EXISTING_WP
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "E&ject", IDM_ZIP_EJECT
|
||||
MENUITEM "&Reload previous image", IDM_ZIP_RELOAD
|
||||
END
|
||||
END
|
||||
|
||||
MOSubmenu MENU DISCARDABLE
|
||||
BEGIN
|
||||
POPUP ""
|
||||
BEGIN
|
||||
MENUITEM "&New image...", IDM_MO_IMAGE_NEW
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "&Existing image...", IDM_MO_IMAGE_EXISTING
|
||||
MENUITEM "Existing image (&Write-protected)...", IDM_MO_IMAGE_EXISTING_WP
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "E&ject", IDM_MO_EJECT
|
||||
MENUITEM "&Reload previous image", IDM_MO_RELOAD
|
||||
END
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
@@ -870,53 +926,44 @@ END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_2080 "E&xport to 86F..."
|
||||
IDS_2081 "Unable to initialize FluidSynth, libfluidsynth.dll is required"
|
||||
IDS_2082 "Bus"
|
||||
IDS_2083 "File"
|
||||
IDS_2084 "C"
|
||||
IDS_2085 "H"
|
||||
IDS_2086 "S"
|
||||
IDS_2087 "MB"
|
||||
IDS_2088 "Check BPB"
|
||||
IDS_2089 "&Image..."
|
||||
IDS_2090 "&Reload previous image"
|
||||
IDS_2091 "E&mpty"
|
||||
IDS_2092 "&Mute"
|
||||
IDS_2093 "E&ject"
|
||||
IDS_2094 "KB"
|
||||
IDS_2095 "86Box could not initialize the video renderer."
|
||||
IDS_2096 "&New image..."
|
||||
IDS_2097 "&Existing image..."
|
||||
IDS_2098 "Existing image (&Write-protected)..."
|
||||
IDS_2099 "Default"
|
||||
IDS_2100 "%i Wait state(s)"
|
||||
IDS_2101 "Type"
|
||||
IDS_2102 "PCap failed to set up because it may not be initialized"
|
||||
IDS_2103 "No PCap devices found"
|
||||
IDS_2104 "Invalid PCap device"
|
||||
IDS_2105 "Standard 2-button joystick(s)"
|
||||
IDS_2106 "Standard 4-button joystick"
|
||||
IDS_2107 "Standard 6-button joystick"
|
||||
IDS_2108 "Standard 8-button joystick"
|
||||
IDS_2109 "CH Flightstick Pro"
|
||||
IDS_2110 "Microsoft SideWinder Pad"
|
||||
IDS_2111 "Thrustmaster Flight Control System"
|
||||
IDS_2112 "None"
|
||||
IDS_2113 "Unable to load Keyboard Accelerators!"
|
||||
IDS_2114 "Unable to register Raw Input!"
|
||||
IDS_2115 "%u"
|
||||
IDS_2116 "%u MB (CHS: %i, %i, %i)"
|
||||
IDS_2117 "Floppy %i (%s): %ls"
|
||||
IDS_2118 "All images (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Advanced sector images (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Basic sector images (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Flux images (*.FDI)\0*.FDI\0Surface images (*.86F;*.MFM)\0*.86F;*.MFM\0All files (*.*)\0*.*\0"
|
||||
IDS_2119 "Unable to initialize FreeType, freetype.dll is required"
|
||||
IDS_2120 "Unable to initialize SDL, SDL2.dll is required"
|
||||
IDS_2121 "Are you sure you want to hard reset the emulated machine?"
|
||||
IDS_2122 "Are you sure you want to quit 86Box?"
|
||||
IDS_2123 "Unable to initialize Ghostscript, gsdll32.dll is required for automatic convertion of PostScript files to PDF.\n\nAny documents sent to the generic PostScript printer will be saved as PostScript files (.ps)."
|
||||
IDS_2124 "MO %i (%03i): %ls"
|
||||
IDS_2125 "MO images (*.IM?)\0*.IM?\0All files (*.*)\0*.*\0"
|
||||
IDS_2126 "Welcome to 86Box!"
|
||||
IDS_2080 "Unable to initialize FluidSynth, libfluidsynth.dll is required"
|
||||
IDS_2081 "Bus"
|
||||
IDS_2082 "File"
|
||||
IDS_2083 "C"
|
||||
IDS_2084 "H"
|
||||
IDS_2085 "S"
|
||||
IDS_2086 "MB"
|
||||
IDS_2087 "Check BPB"
|
||||
IDS_2088 "KB"
|
||||
IDS_2089 "86Box could not initialize the video renderer."
|
||||
IDS_2090 "Default"
|
||||
IDS_2091 "%i Wait state(s)"
|
||||
IDS_2092 "Type"
|
||||
IDS_2093 "PCap failed to set up because it may not be initialized"
|
||||
IDS_2094 "No PCap devices found"
|
||||
IDS_2095 "Invalid PCap device"
|
||||
IDS_2096 "Standard 2-button joystick(s)"
|
||||
IDS_2097 "Standard 4-button joystick"
|
||||
IDS_2098 "Standard 6-button joystick"
|
||||
IDS_2099 "Standard 8-button joystick"
|
||||
IDS_2100 "CH Flightstick Pro"
|
||||
IDS_2101 "Microsoft SideWinder Pad"
|
||||
IDS_2102 "Thrustmaster Flight Control System"
|
||||
IDS_2103 "None"
|
||||
IDS_2104 "Unable to load Keyboard Accelerators!"
|
||||
IDS_2105 "Unable to register Raw Input!"
|
||||
IDS_2106 "%u"
|
||||
IDS_2107 "%u MB (CHS: %i, %i, %i)"
|
||||
IDS_2108 "Floppy %i (%s): %ls"
|
||||
IDS_2109 "All images (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Advanced sector images (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Basic sector images (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Flux images (*.FDI)\0*.FDI\0Surface images (*.86F;*.MFM)\0*.86F;*.MFM\0All files (*.*)\0*.*\0"
|
||||
IDS_2110 "Unable to initialize FreeType, freetype.dll is required"
|
||||
IDS_2111 "Unable to initialize SDL, SDL2.dll is required"
|
||||
IDS_2112 "Are you sure you want to hard reset the emulated machine?"
|
||||
IDS_2113 "Are you sure you want to quit 86Box?"
|
||||
IDS_2114 "Unable to initialize Ghostscript, gsdll32.dll is required for automatic convertion of PostScript files to PDF.\n\nAny documents sent to the generic PostScript printer will be saved as PostScript files (.ps)."
|
||||
IDS_2115 "MO %i (%03i): %ls"
|
||||
IDS_2116 "MO images (*.IM?)\0*.IM?\0All files (*.*)\0*.*\0"
|
||||
IDS_2117 "Welcome to 86Box!"
|
||||
END
|
||||
|
||||
STRINGTABLE DISCARDABLE
|
||||
|
||||
@@ -92,6 +92,9 @@ ifeq ($(DEV_BUILD), y)
|
||||
ifndef XL24
|
||||
XL24 := y
|
||||
endif
|
||||
ifndef NO_SIO
|
||||
NO_SIO := y
|
||||
endif
|
||||
else
|
||||
ifndef DEBUG
|
||||
DEBUG := n
|
||||
@@ -150,6 +153,9 @@ else
|
||||
ifndef XL24
|
||||
XL24 := n
|
||||
endif
|
||||
ifndef NO_SIO
|
||||
NO_SIO := n
|
||||
endif
|
||||
endif
|
||||
|
||||
# Defaults for several build options (possibly defined in a chained file.)
|
||||
@@ -370,7 +376,7 @@ else
|
||||
win_sdl.o \
|
||||
win_dialog.o win_about.o \
|
||||
win_settings.o win_devconf.o win_snd_gain.o \
|
||||
win_new_floppy.o win_jsconf.o
|
||||
win_new_floppy.o win_jsconf.o win_media_menu.o
|
||||
endif
|
||||
|
||||
ifeq ($(OPENAL), y)
|
||||
@@ -484,6 +490,10 @@ ifeq ($(XL24), y)
|
||||
OPTS += -DUSE_XL24
|
||||
endif
|
||||
|
||||
ifeq ($(NO_SIO), y)
|
||||
OPTS += -DNO_SIO
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
|
||||
|
||||
@@ -92,6 +92,9 @@ ifeq ($(DEV_BUILD), y)
|
||||
ifndef XL24
|
||||
XL24 := y
|
||||
endif
|
||||
ifndef NO_SIO
|
||||
NO_SIO := y
|
||||
endif
|
||||
else
|
||||
ifndef DEBUG
|
||||
DEBUG := n
|
||||
@@ -153,6 +156,9 @@ else
|
||||
ifndef XL24
|
||||
XL24 := n
|
||||
endif
|
||||
ifndef NO_SIO
|
||||
NO_SIO := n
|
||||
endif
|
||||
endif
|
||||
|
||||
# Defaults for several build options (possibly defined in a chained file.)
|
||||
@@ -379,7 +385,7 @@ else
|
||||
win_sdl.o \
|
||||
win_dialog.o win_about.o \
|
||||
win_settings.o win_devconf.o win_snd_gain.o \
|
||||
win_new_floppy.o win_jsconf.o
|
||||
win_new_floppy.o win_jsconf.o win_media_menu.o
|
||||
endif
|
||||
|
||||
ifeq ($(OPENAL), y)
|
||||
@@ -493,6 +499,10 @@ ifeq ($(XL24), y)
|
||||
OPTS += -DUSE_XL24
|
||||
endif
|
||||
|
||||
ifeq ($(NO_SIO), y)
|
||||
OPTS += -DNO_SIO
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
|
||||
|
||||
@@ -28,6 +28,8 @@
|
||||
#include <stdlib.h>
|
||||
#include <wchar.h>
|
||||
#include <86box/config.h>
|
||||
#include <86box/timer.h>
|
||||
#include <86box/fdd.h>
|
||||
#include <86box/hdd.h>
|
||||
#include <86box/scsi_device.h>
|
||||
#include <86box/cdrom.h>
|
||||
@@ -39,25 +41,68 @@
|
||||
#include <86box/win.h>
|
||||
|
||||
|
||||
void
|
||||
floppy_mount(uint8_t id, wchar_t *fn, uint8_t wp)
|
||||
{
|
||||
fdd_close(id);
|
||||
ui_writeprot[id] = wp;
|
||||
fdd_load(id, fn);
|
||||
ui_sb_update_icon_state(SB_FLOPPY | id, wcslen(floppyfns[id]) ? 0 : 1);
|
||||
media_menu_update_floppy(id);
|
||||
ui_sb_update_tip(SB_FLOPPY | id);
|
||||
config_save();
|
||||
}
|
||||
|
||||
void
|
||||
floppy_eject(uint8_t id)
|
||||
{
|
||||
fdd_close(id);
|
||||
ui_sb_update_icon_state(SB_FLOPPY | id, 1);
|
||||
media_menu_update_floppy(id);
|
||||
ui_sb_update_tip(SB_FLOPPY | id);
|
||||
config_save();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
plat_cdrom_ui_update(uint8_t id, uint8_t reload)
|
||||
{
|
||||
cdrom_t *drv = &cdrom[id];
|
||||
|
||||
if (drv->host_drive == 0) {
|
||||
ui_sb_check_menu_item(SB_CDROM|id, IDM_CDROM_EMPTY | id, MF_CHECKED);
|
||||
ui_sb_check_menu_item(SB_CDROM|id, IDM_CDROM_IMAGE | id, MF_UNCHECKED);
|
||||
ui_sb_update_icon_state(SB_CDROM|id, 1);
|
||||
} else {
|
||||
ui_sb_check_menu_item(SB_CDROM|id, IDM_CDROM_EMPTY | id, MF_UNCHECKED);
|
||||
ui_sb_check_menu_item(SB_CDROM|id, IDM_CDROM_IMAGE | id, MF_CHECKED);
|
||||
ui_sb_update_icon_state(SB_CDROM|id, 0);
|
||||
}
|
||||
|
||||
ui_sb_enable_menu_item(SB_CDROM|id, IDM_CDROM_RELOAD | id, MF_BYCOMMAND | (reload ? MF_GRAYED : MF_ENABLED));
|
||||
media_menu_update_cdrom(id);
|
||||
ui_sb_update_tip(SB_CDROM|id);
|
||||
}
|
||||
|
||||
void
|
||||
cdrom_mount(uint8_t id, wchar_t *fn)
|
||||
{
|
||||
cdrom[id].prev_host_drive = cdrom[id].host_drive;
|
||||
wcscpy(cdrom[id].prev_image_path, cdrom[id].image_path);
|
||||
if (cdrom[id].ops && cdrom[id].ops->exit)
|
||||
cdrom[id].ops->exit(&(cdrom[id]));
|
||||
cdrom[id].ops = NULL;
|
||||
memset(cdrom[id].image_path, 0, sizeof(cdrom[id].image_path));
|
||||
cdrom_image_open(&(cdrom[id]), fn);
|
||||
/* Signal media change to the emulated machine. */
|
||||
if (cdrom[id].insert)
|
||||
cdrom[id].insert(cdrom[id].priv);
|
||||
cdrom[id].host_drive = (wcslen(cdrom[id].image_path) == 0) ? 0 : 200;
|
||||
if (cdrom[id].host_drive == 200) {
|
||||
ui_sb_update_icon_state(SB_CDROM | id, 0);
|
||||
} else {
|
||||
ui_sb_update_icon_state(SB_CDROM | id, 1);
|
||||
}
|
||||
media_menu_update_cdrom(id);
|
||||
ui_sb_update_tip(SB_CDROM | id);
|
||||
config_save();
|
||||
}
|
||||
|
||||
void
|
||||
mo_eject(uint8_t id)
|
||||
{
|
||||
@@ -70,13 +115,30 @@ mo_eject(uint8_t id)
|
||||
}
|
||||
|
||||
ui_sb_update_icon_state(SB_MO | id, 1);
|
||||
ui_sb_enable_menu_item(SB_MO|id, IDM_MO_EJECT | id, MF_BYCOMMAND | MF_GRAYED);
|
||||
ui_sb_enable_menu_item(SB_MO|id, IDM_MO_RELOAD | id, MF_BYCOMMAND | MF_ENABLED);
|
||||
media_menu_update_mo(id);
|
||||
ui_sb_update_tip(SB_MO | id);
|
||||
config_save();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
mo_mount(uint8_t id, wchar_t *fn, uint8_t wp)
|
||||
{
|
||||
mo_t *dev = (mo_t *) mo_drives[id].priv;
|
||||
|
||||
mo_disk_close(dev);
|
||||
mo_drives[id].read_only = wp;
|
||||
mo_load(dev, fn);
|
||||
mo_insert(dev);
|
||||
|
||||
ui_sb_update_icon_state(SB_MO | id, wcslen(mo_drives[id].image_path) ? 0 : 1);
|
||||
media_menu_update_mo(id);
|
||||
ui_sb_update_tip(SB_MO | id);
|
||||
|
||||
config_save();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
mo_reload(uint8_t id)
|
||||
{
|
||||
@@ -84,14 +146,12 @@ mo_reload(uint8_t id)
|
||||
|
||||
mo_disk_reload(dev);
|
||||
if (wcslen(mo_drives[id].image_path) == 0) {
|
||||
ui_sb_enable_menu_item(SB_MO|id, IDM_MO_EJECT | id, MF_BYCOMMAND | MF_GRAYED);
|
||||
ui_sb_update_icon_state(SB_MO|id, 1);
|
||||
} else {
|
||||
ui_sb_enable_menu_item(SB_MO|id, IDM_MO_EJECT | id, MF_BYCOMMAND | MF_ENABLED);
|
||||
ui_sb_update_icon_state(SB_MO|id, 0);
|
||||
}
|
||||
|
||||
ui_sb_enable_menu_item(SB_MO|id, IDM_MO_RELOAD | id, MF_BYCOMMAND | MF_GRAYED);
|
||||
media_menu_update_mo(id);
|
||||
ui_sb_update_tip(SB_MO|id);
|
||||
|
||||
config_save();
|
||||
@@ -109,13 +169,30 @@ zip_eject(uint8_t id)
|
||||
}
|
||||
|
||||
ui_sb_update_icon_state(SB_ZIP | id, 1);
|
||||
ui_sb_enable_menu_item(SB_ZIP|id, IDM_ZIP_EJECT | id, MF_BYCOMMAND | MF_GRAYED);
|
||||
ui_sb_enable_menu_item(SB_ZIP|id, IDM_ZIP_RELOAD | id, MF_BYCOMMAND | MF_ENABLED);
|
||||
media_menu_update_zip(id);
|
||||
ui_sb_update_tip(SB_ZIP | id);
|
||||
config_save();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
zip_mount(uint8_t id, wchar_t *fn, uint8_t wp)
|
||||
{
|
||||
zip_t *dev = (zip_t *) zip_drives[id].priv;
|
||||
|
||||
zip_disk_close(dev);
|
||||
zip_drives[id].read_only = wp;
|
||||
zip_load(dev, fn);
|
||||
zip_insert(dev);
|
||||
|
||||
ui_sb_update_icon_state(SB_ZIP | id, wcslen(zip_drives[id].image_path) ? 0 : 1);
|
||||
media_menu_update_zip(id);
|
||||
ui_sb_update_tip(SB_ZIP | id);
|
||||
|
||||
config_save();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
zip_reload(uint8_t id)
|
||||
{
|
||||
@@ -123,14 +200,12 @@ zip_reload(uint8_t id)
|
||||
|
||||
zip_disk_reload(dev);
|
||||
if (wcslen(zip_drives[id].image_path) == 0) {
|
||||
ui_sb_enable_menu_item(SB_ZIP|id, IDM_ZIP_EJECT | id, MF_BYCOMMAND | MF_GRAYED);
|
||||
ui_sb_update_icon_state(SB_ZIP|id, 1);
|
||||
} else {
|
||||
ui_sb_enable_menu_item(SB_ZIP|id, IDM_ZIP_EJECT | id, MF_BYCOMMAND | MF_ENABLED);
|
||||
ui_sb_update_icon_state(SB_ZIP|id, 0);
|
||||
}
|
||||
|
||||
ui_sb_enable_menu_item(SB_ZIP|id, IDM_ZIP_RELOAD | id, MF_BYCOMMAND | MF_GRAYED);
|
||||
media_menu_update_zip(id);
|
||||
ui_sb_update_tip(SB_ZIP|id);
|
||||
|
||||
config_save();
|
||||
|
||||
529
src/win/win_media_menu.c
Normal file
529
src/win/win_media_menu.c
Normal file
@@ -0,0 +1,529 @@
|
||||
#define UNICODE
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <Windows.h>
|
||||
#include <86box/86box.h>
|
||||
#include <86box/cdrom.h>
|
||||
#include <86box/config.h>
|
||||
#include <86box/device.h>
|
||||
#include <86box/timer.h>
|
||||
#include <86box/fdd.h>
|
||||
#include <86box/fdd_86f.h>
|
||||
#include <86box/hdc.h>
|
||||
#include <86box/language.h>
|
||||
#include <86box/machine.h>
|
||||
#include <86box/scsi_device.h>
|
||||
#include <86box/mo.h>
|
||||
#include <86box/plat.h>
|
||||
#include <86box/scsi.h>
|
||||
#include <86box/sound.h>
|
||||
#include <86box/ui.h>
|
||||
#include <86box/zip.h>
|
||||
#include <86box/win.h>
|
||||
|
||||
#define MACHINE_HAS_IDE ((machines[machine].flags & MACHINE_HDC) || !memcmp(hdc_get_internal_name(hdc_current), "ide", 3))
|
||||
|
||||
#define FDD_FIRST 0
|
||||
#define CDROM_FIRST FDD_FIRST + FDD_NUM
|
||||
#define ZIP_FIRST CDROM_FIRST + CDROM_NUM
|
||||
#define MO_FIRST ZIP_FIRST + ZIP_NUM
|
||||
|
||||
static HMENU media_menu, stbar_menu;
|
||||
static HMENU menus[FDD_NUM + CDROM_NUM + ZIP_NUM + MO_NUM];
|
||||
static char index_map[255];
|
||||
|
||||
static void
|
||||
media_menu_set_ids(HMENU hMenu, int id)
|
||||
{
|
||||
int c = GetMenuItemCount(hMenu);
|
||||
|
||||
MENUITEMINFO mii = { 0 };
|
||||
mii.fMask = MIIM_ID;
|
||||
mii.cbSize = sizeof(mii);
|
||||
|
||||
for(int i = 0; i < c; i++)
|
||||
{
|
||||
GetMenuItemInfo(hMenu, i, TRUE, &mii);
|
||||
mii.wID |= id;
|
||||
SetMenuItemInfo(hMenu, i, TRUE, &mii);
|
||||
}
|
||||
}
|
||||
|
||||
/* Loads the submenu from resource by name */
|
||||
static HMENU
|
||||
media_menu_load_resource(wchar_t *lpName)
|
||||
{
|
||||
HMENU loaded = LoadMenu(NULL, lpName);
|
||||
|
||||
/* The actual submenu is in a dummy popup menu item */
|
||||
HMENU actual = GetSubMenu(loaded, 0);
|
||||
|
||||
/* Now that we have our submenu, we can destroy the parent menu */
|
||||
RemoveMenu(loaded, (UINT_PTR)actual, MF_BYCOMMAND);
|
||||
DestroyMenu(loaded);
|
||||
|
||||
return actual;
|
||||
}
|
||||
|
||||
static void
|
||||
media_menu_set_name_floppy(int drive)
|
||||
{
|
||||
wchar_t name[512], temp[512];
|
||||
MENUITEMINFO mii = { 0 };
|
||||
|
||||
mbstowcs(temp, fdd_getname(fdd_get_type(drive)),
|
||||
strlen(fdd_getname(fdd_get_type(drive))) + 1);
|
||||
if (wcslen(floppyfns[drive]) == 0) {
|
||||
_swprintf(name, plat_get_string(IDS_2108),
|
||||
drive + 1, temp, plat_get_string(IDS_2057));
|
||||
} else {
|
||||
_swprintf(name, plat_get_string(IDS_2108),
|
||||
drive + 1, temp, floppyfns[drive]);
|
||||
}
|
||||
|
||||
mii.cbSize = sizeof(mii);
|
||||
mii.fMask = MIIM_STRING;
|
||||
mii.dwTypeData = name;
|
||||
|
||||
SetMenuItemInfo(media_menu, (UINT_PTR)menus[FDD_FIRST + drive], FALSE, &mii);
|
||||
}
|
||||
|
||||
static void
|
||||
media_menu_set_name_cdrom(int drive)
|
||||
{
|
||||
wchar_t name[512], *temp;
|
||||
MENUITEMINFO mii = { 0 };
|
||||
|
||||
int bus = cdrom[drive].bus_type;
|
||||
int id = IDS_5377 + (bus - 1);
|
||||
|
||||
temp = plat_get_string(id);
|
||||
|
||||
if (cdrom[drive].host_drive == 200) {
|
||||
if (wcslen(cdrom[drive].image_path) == 0)
|
||||
_swprintf(name, plat_get_string(IDS_5120), drive+1, temp, plat_get_string(IDS_2057));
|
||||
else
|
||||
_swprintf(name, plat_get_string(IDS_5120), drive+1, temp, cdrom[drive].image_path);
|
||||
} else
|
||||
_swprintf(name, plat_get_string(IDS_5120), drive+1, temp, plat_get_string(IDS_2057));
|
||||
|
||||
mii.cbSize = sizeof(mii);
|
||||
mii.fMask = MIIM_STRING;
|
||||
mii.dwTypeData = name;
|
||||
|
||||
SetMenuItemInfo(media_menu, (UINT_PTR)menus[CDROM_FIRST + drive], FALSE, &mii);
|
||||
}
|
||||
|
||||
static void
|
||||
media_menu_set_name_zip(int drive)
|
||||
{
|
||||
wchar_t name[512], *temp;
|
||||
MENUITEMINFO mii = { 0 };
|
||||
|
||||
int bus = zip_drives[drive].bus_type;
|
||||
int id = IDS_5377 + (bus - 1);
|
||||
|
||||
temp = plat_get_string(id);
|
||||
|
||||
int type = zip_drives[drive].is_250 ? 250 : 100;
|
||||
|
||||
if (wcslen(zip_drives[drive].image_path) == 0) {
|
||||
_swprintf(name, plat_get_string(IDS_2054),
|
||||
type, drive+1, temp, plat_get_string(IDS_2057));
|
||||
} else {
|
||||
_swprintf(name, plat_get_string(IDS_2054),
|
||||
type, drive+1, temp, zip_drives[drive].image_path);
|
||||
}
|
||||
|
||||
mii.cbSize = sizeof(mii);
|
||||
mii.fMask = MIIM_STRING;
|
||||
mii.dwTypeData = name;
|
||||
|
||||
SetMenuItemInfo(media_menu, (UINT_PTR)menus[ZIP_FIRST + drive], FALSE, &mii);
|
||||
}
|
||||
|
||||
static void
|
||||
media_menu_set_name_mo(int drive)
|
||||
{
|
||||
wchar_t name[512], *temp;
|
||||
MENUITEMINFO mii = { 0 };
|
||||
|
||||
int bus = mo_drives[drive].bus_type;
|
||||
int id = IDS_5377 + (bus - 1);
|
||||
|
||||
temp = plat_get_string(id);
|
||||
|
||||
if (wcslen(mo_drives[drive].image_path) == 0) {
|
||||
_swprintf(name, plat_get_string(IDS_2115),
|
||||
drive+1, temp, plat_get_string(IDS_2057));
|
||||
} else {
|
||||
_swprintf(name, plat_get_string(IDS_2115),
|
||||
drive+1, temp, mo_drives[drive].image_path);
|
||||
}
|
||||
|
||||
mii.cbSize = sizeof(mii);
|
||||
mii.fMask = MIIM_STRING;
|
||||
mii.dwTypeData = name;
|
||||
|
||||
SetMenuItemInfo(media_menu, (UINT_PTR)menus[MO_FIRST + drive], FALSE, &mii);
|
||||
}
|
||||
|
||||
void
|
||||
media_menu_update_floppy(int id)
|
||||
{
|
||||
int i = FDD_FIRST + id;
|
||||
|
||||
if (floppyfns[id][0] == 0x0000) {
|
||||
EnableMenuItem(menus[i], IDM_FLOPPY_EJECT | id, MF_BYCOMMAND | MF_GRAYED);
|
||||
EnableMenuItem(menus[i], IDM_FLOPPY_EXPORT_TO_86F | id, MF_BYCOMMAND | MF_GRAYED);
|
||||
} else {
|
||||
EnableMenuItem(menus[i], IDM_FLOPPY_EJECT | id, MF_BYCOMMAND | MF_ENABLED);
|
||||
EnableMenuItem(menus[i], IDM_FLOPPY_EXPORT_TO_86F | id, MF_BYCOMMAND | MF_ENABLED);
|
||||
}
|
||||
|
||||
media_menu_set_name_floppy(id);
|
||||
}
|
||||
|
||||
void
|
||||
media_menu_update_cdrom(int id)
|
||||
{
|
||||
int i = CDROM_FIRST + id;
|
||||
|
||||
if (! cdrom[id].sound_on)
|
||||
CheckMenuItem(menus[i], IDM_CDROM_MUTE | id, MF_BYCOMMAND | MF_CHECKED);
|
||||
else
|
||||
CheckMenuItem(menus[i], IDM_CDROM_MUTE | id, MF_BYCOMMAND | MF_UNCHECKED);
|
||||
|
||||
if (cdrom[id].host_drive == 200) {
|
||||
CheckMenuItem(menus[i], IDM_CDROM_IMAGE | id, MF_BYCOMMAND | MF_CHECKED);
|
||||
CheckMenuItem(menus[i], IDM_CDROM_EMPTY | id, MF_BYCOMMAND | MF_UNCHECKED);
|
||||
} else {
|
||||
cdrom[id].host_drive = 0;
|
||||
CheckMenuItem(menus[i], IDM_CDROM_IMAGE | id, MF_BYCOMMAND | MF_UNCHECKED);
|
||||
CheckMenuItem(menus[i], IDM_CDROM_EMPTY | id, MF_BYCOMMAND | MF_CHECKED);
|
||||
}
|
||||
|
||||
if(cdrom[id].prev_host_drive == 0)
|
||||
EnableMenuItem(menus[i], IDM_CDROM_RELOAD | id, MF_BYCOMMAND | MF_GRAYED);
|
||||
else
|
||||
EnableMenuItem(menus[i], IDM_CDROM_RELOAD | id, MF_BYCOMMAND | MF_ENABLED);
|
||||
|
||||
media_menu_set_name_cdrom(id);
|
||||
}
|
||||
|
||||
void
|
||||
media_menu_update_zip(int id)
|
||||
{
|
||||
int i = ZIP_FIRST + id;
|
||||
|
||||
if (zip_drives[id].image_path[0] == 0x0000)
|
||||
EnableMenuItem(menus[i], IDM_ZIP_EJECT | id, MF_BYCOMMAND | MF_GRAYED);
|
||||
else
|
||||
EnableMenuItem(menus[i], IDM_ZIP_EJECT | id, MF_BYCOMMAND | MF_ENABLED);
|
||||
|
||||
if(zip_drives[id].prev_image_path[0] == 0x0000)
|
||||
EnableMenuItem(menus[i], IDM_ZIP_RELOAD | id, MF_BYCOMMAND | MF_GRAYED);
|
||||
else
|
||||
EnableMenuItem(menus[i], IDM_ZIP_RELOAD | id, MF_BYCOMMAND | MF_ENABLED);
|
||||
|
||||
media_menu_set_name_zip(id);
|
||||
}
|
||||
|
||||
void
|
||||
media_menu_update_mo(int id)
|
||||
{
|
||||
int i = MO_FIRST + id;
|
||||
|
||||
if (mo_drives[id].image_path[0] == 0x0000)
|
||||
EnableMenuItem(menus[i], IDM_MO_EJECT | id, MF_BYCOMMAND | MF_GRAYED);
|
||||
else
|
||||
EnableMenuItem(menus[i], IDM_MO_EJECT | id, MF_BYCOMMAND | MF_ENABLED);
|
||||
|
||||
if(mo_drives[id].prev_image_path[0] == 0x0000)
|
||||
EnableMenuItem(menus[i], IDM_MO_RELOAD | id, MF_BYCOMMAND | MF_GRAYED);
|
||||
else
|
||||
EnableMenuItem(menus[i], IDM_MO_RELOAD | id, MF_BYCOMMAND | MF_ENABLED);
|
||||
|
||||
media_menu_set_name_mo(id);
|
||||
}
|
||||
|
||||
static void
|
||||
media_menu_load_submenus()
|
||||
{
|
||||
memset(index_map, -1, sizeof(index_map));
|
||||
|
||||
int curr = 0;
|
||||
|
||||
for(int i = 0; i < FDD_NUM; i++) {
|
||||
menus[curr] = media_menu_load_resource(FLOPPY_SUBMENU_NAME);
|
||||
media_menu_set_ids(menus[curr++], i);
|
||||
}
|
||||
|
||||
for(int i = 0; i < CDROM_NUM; i++) {
|
||||
menus[curr] = media_menu_load_resource(CDROM_SUBMENU_NAME);
|
||||
media_menu_set_ids(menus[curr++], i);
|
||||
}
|
||||
|
||||
for(int i = 0; i < ZIP_NUM; i++) {
|
||||
menus[curr] = media_menu_load_resource(ZIP_SUBMENU_NAME);
|
||||
media_menu_set_ids(menus[curr++], i);
|
||||
}
|
||||
|
||||
for(int i = 0; i < MO_NUM; i++) {
|
||||
menus[curr] = media_menu_load_resource(MO_SUBMENU_NAME);
|
||||
media_menu_set_ids(menus[curr++], i);
|
||||
}
|
||||
}
|
||||
|
||||
static inline int
|
||||
is_valid_fdd(int i)
|
||||
{
|
||||
return fdd_get_type(i) != 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
is_valid_cdrom(int i)
|
||||
{
|
||||
if ((cdrom[i].bus_type == CDROM_BUS_ATAPI) && !MACHINE_HAS_IDE)
|
||||
return 0;
|
||||
if ((cdrom[i].bus_type == CDROM_BUS_SCSI) && (scsi_card_current == 0))
|
||||
return 0;
|
||||
return cdrom[i].bus_type != 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
is_valid_zip(int i)
|
||||
{
|
||||
if ((zip_drives[i].bus_type == ZIP_BUS_ATAPI) && !MACHINE_HAS_IDE)
|
||||
return 0;
|
||||
if ((zip_drives[i].bus_type == ZIP_BUS_SCSI) && (scsi_card_current == 0))
|
||||
return 0;
|
||||
return zip_drives[i].bus_type != 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
is_valid_mo(int i)
|
||||
{
|
||||
if ((mo_drives[i].bus_type == MO_BUS_ATAPI) && !MACHINE_HAS_IDE)
|
||||
return 0;
|
||||
if ((mo_drives[i].bus_type == MO_BUS_SCSI) && (scsi_card_current == 0))
|
||||
return 0;
|
||||
return mo_drives[i].bus_type != 0;
|
||||
}
|
||||
|
||||
void
|
||||
media_menu_reset()
|
||||
{
|
||||
/* Remove existing entries. */
|
||||
int c = GetMenuItemCount(media_menu);
|
||||
|
||||
for(int i = 0; i < c; i++)
|
||||
RemoveMenu(media_menu, 0, MF_BYPOSITION);
|
||||
|
||||
/* Add new ones. */
|
||||
int curr = 0;
|
||||
|
||||
for(int i = 0; i < FDD_NUM; i++) {
|
||||
if(is_valid_fdd(i)) {
|
||||
AppendMenu(media_menu, MF_POPUP | MF_STRING, (UINT_PTR)menus[curr], L"Test");
|
||||
media_menu_update_floppy(i);
|
||||
}
|
||||
curr++;
|
||||
}
|
||||
|
||||
for(int i = 0; i < CDROM_NUM; i++) {
|
||||
if(is_valid_cdrom(i)) {
|
||||
AppendMenu(media_menu, MF_POPUP | MF_STRING, (UINT_PTR)menus[curr], L"Test");
|
||||
media_menu_update_cdrom(i);
|
||||
}
|
||||
curr++;
|
||||
}
|
||||
|
||||
for(int i = 0; i < ZIP_NUM; i++) {
|
||||
if(is_valid_zip(i)) {
|
||||
AppendMenu(media_menu, MF_POPUP | MF_STRING, (UINT_PTR)menus[curr], L"Test");
|
||||
media_menu_update_zip(i);
|
||||
}
|
||||
curr++;
|
||||
}
|
||||
|
||||
for(int i = 0; i < MO_NUM; i++) {
|
||||
if(is_valid_mo(i)) {
|
||||
AppendMenu(media_menu, MF_POPUP | MF_STRING, (UINT_PTR)menus[curr], L"Test");
|
||||
media_menu_update_mo(i);
|
||||
}
|
||||
curr++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Initializes the Media menu in the main menu bar. */
|
||||
static void
|
||||
media_menu_main_init()
|
||||
{
|
||||
HMENU hMenu;
|
||||
LPWSTR lpMenuName;
|
||||
|
||||
hMenu = GetMenu(hwndMain);
|
||||
media_menu = CreatePopupMenu();
|
||||
|
||||
/* Get the menu name */
|
||||
int len = GetMenuString(hMenu, IDM_MEDIA, NULL, 0, MF_BYCOMMAND);
|
||||
lpMenuName = malloc((len + 1) * sizeof(WCHAR));
|
||||
GetMenuString(hMenu, IDM_MEDIA, lpMenuName, len + 1, MF_BYCOMMAND);
|
||||
|
||||
/* Replace the placeholder menu item */
|
||||
ModifyMenu(hMenu, IDM_MEDIA, MF_BYCOMMAND | MF_STRING | MF_POPUP, (UINT_PTR)media_menu, lpMenuName);
|
||||
|
||||
/* Clean up */
|
||||
DrawMenuBar(hwndMain);
|
||||
free(lpMenuName);
|
||||
}
|
||||
|
||||
void
|
||||
media_menu_init()
|
||||
{
|
||||
/* Initialize the main menu bar menu */
|
||||
media_menu_main_init();
|
||||
|
||||
/* Initialize the dummy status bar menu. */
|
||||
stbar_menu = CreateMenu();
|
||||
AppendMenu(stbar_menu, MF_POPUP, (UINT_PTR)media_menu, NULL);
|
||||
|
||||
/* Load the submenus for each drive type. */
|
||||
media_menu_load_submenus();
|
||||
|
||||
/* Populate the Media and status bar menus. */
|
||||
media_menu_reset();
|
||||
}
|
||||
|
||||
int
|
||||
media_menu_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
int id = 0, ret = 0, wp = 0;
|
||||
|
||||
id = LOWORD(wParam) & 0x00ff;
|
||||
|
||||
switch (LOWORD(wParam) & 0xff00) {
|
||||
case IDM_FLOPPY_IMAGE_NEW:
|
||||
NewFloppyDialogCreate(hwnd, id, 0);
|
||||
break;
|
||||
|
||||
case IDM_FLOPPY_IMAGE_EXISTING_WP:
|
||||
wp = 1;
|
||||
/* FALLTHROUGH */
|
||||
case IDM_FLOPPY_IMAGE_EXISTING:
|
||||
ret = file_dlg_w_st(hwnd, IDS_2109, floppyfns[id], 0);
|
||||
if (! ret) {
|
||||
floppy_mount(id, wopenfilestring, wp);
|
||||
}
|
||||
break;
|
||||
|
||||
case IDM_FLOPPY_EJECT:
|
||||
floppy_eject(id);
|
||||
break;
|
||||
|
||||
case IDM_FLOPPY_EXPORT_TO_86F:
|
||||
ret = file_dlg_w_st(hwnd, IDS_2076, floppyfns[id], 1);
|
||||
if (! ret) {
|
||||
plat_pause(1);
|
||||
ret = d86f_export(id, wopenfilestring);
|
||||
if (!ret)
|
||||
ui_msgbox(MBX_ERROR, (wchar_t *)IDS_4108);
|
||||
plat_pause(0);
|
||||
}
|
||||
break;
|
||||
|
||||
case IDM_CDROM_MUTE:
|
||||
cdrom[id].sound_on ^= 1;
|
||||
config_save();
|
||||
media_menu_update_cdrom(id);
|
||||
sound_cd_thread_reset();
|
||||
break;
|
||||
|
||||
case IDM_CDROM_EMPTY:
|
||||
cdrom_eject(id);
|
||||
break;
|
||||
|
||||
case IDM_CDROM_RELOAD:
|
||||
cdrom_reload(id);
|
||||
break;
|
||||
|
||||
case IDM_CDROM_IMAGE:
|
||||
if (!file_dlg_w_st(hwnd, IDS_2075, cdrom[id].image_path, 0)) {
|
||||
cdrom_mount(id, wopenfilestring);
|
||||
}
|
||||
break;
|
||||
|
||||
case IDM_ZIP_IMAGE_NEW:
|
||||
NewFloppyDialogCreate(hwnd, id | 0x80, 0); /* NewZIPDialogCreate */
|
||||
break;
|
||||
|
||||
case IDM_ZIP_IMAGE_EXISTING_WP:
|
||||
wp = 1;
|
||||
/* FALLTHROUGH */
|
||||
case IDM_ZIP_IMAGE_EXISTING:
|
||||
ret = file_dlg_w_st(hwnd, IDS_2058, zip_drives[id].image_path, 0);
|
||||
if (! ret)
|
||||
zip_mount(id, wopenfilestring, wp);
|
||||
break;
|
||||
|
||||
case IDM_ZIP_EJECT:
|
||||
zip_eject(id);
|
||||
break;
|
||||
|
||||
case IDM_ZIP_RELOAD:
|
||||
zip_reload(id);
|
||||
break;
|
||||
|
||||
case IDM_MO_IMAGE_NEW:
|
||||
NewFloppyDialogCreate(hwnd, id | 0x80, 0); /* NewZIPDialogCreate */
|
||||
break;
|
||||
|
||||
case IDM_MO_IMAGE_EXISTING_WP:
|
||||
wp = 1;
|
||||
/* FALLTHROUGH */
|
||||
case IDM_MO_IMAGE_EXISTING:
|
||||
ret = file_dlg_w_st(hwnd, IDS_2116, mo_drives[id].image_path, 0);
|
||||
if (! ret)
|
||||
mo_mount(id, wopenfilestring, wp);
|
||||
break;
|
||||
|
||||
case IDM_MO_EJECT:
|
||||
mo_eject(id);
|
||||
break;
|
||||
|
||||
case IDM_MO_RELOAD:
|
||||
mo_reload(id);
|
||||
break;
|
||||
|
||||
default:
|
||||
return(0);
|
||||
}
|
||||
|
||||
return(1);
|
||||
}
|
||||
|
||||
HMENU
|
||||
media_menu_get_floppy(int id)
|
||||
{
|
||||
return menus[FDD_FIRST + id];
|
||||
}
|
||||
|
||||
HMENU
|
||||
media_menu_get_cdrom(int id)
|
||||
{
|
||||
return menus[CDROM_FIRST + id];
|
||||
}
|
||||
|
||||
HMENU
|
||||
media_menu_get_zip(int id)
|
||||
{
|
||||
return menus[ZIP_FIRST + id];
|
||||
}
|
||||
|
||||
HMENU
|
||||
media_menu_get_mo(int id)
|
||||
{
|
||||
return menus[MO_FIRST + id];
|
||||
}
|
||||
@@ -601,9 +601,11 @@ NewFloppyDialogProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
}
|
||||
if (ret) {
|
||||
if (is_zip)
|
||||
ui_sb_mount_zip_img(fdd_id, sb_part, 0, fd_file_name);
|
||||
//ui_sb_mount_zip_img(fdd_id, sb_part, 0, fd_file_name);
|
||||
zip_mount(fdd_id, fd_file_name, 0);
|
||||
else
|
||||
ui_sb_mount_floppy_img(fdd_id, sb_part, 0, fd_file_name);
|
||||
//ui_sb_mount_floppy_img(fdd_id, sb_part, 0, fd_file_name);
|
||||
floppy_mount(fdd_id, fd_file_name, 0);
|
||||
} else {
|
||||
new_floppy_msgbox(hdlg, MBX_ERROR, (wchar_t *)IDS_4108);
|
||||
return TRUE;
|
||||
|
||||
@@ -625,11 +625,11 @@ win_settings_machine_recalc_machine(HWND hdlg)
|
||||
if (!(machines[temp_machine].flags & MACHINE_AT) || (machines[temp_machine].ram_granularity >= 128)) {
|
||||
SendMessage(h, UDM_SETPOS, 0, temp_mem_size);
|
||||
h = GetDlgItem(hdlg, IDC_TEXT_MB);
|
||||
SendMessage(h, WM_SETTEXT, 0, win_get_string(IDS_2094));
|
||||
SendMessage(h, WM_SETTEXT, 0, win_get_string(IDS_2088));
|
||||
} else {
|
||||
SendMessage(h, UDM_SETPOS, 0, temp_mem_size / 1024);
|
||||
h = GetDlgItem(hdlg, IDC_TEXT_MB);
|
||||
SendMessage(h, WM_SETTEXT, 0, win_get_string(IDS_2087));
|
||||
SendMessage(h, WM_SETTEXT, 0, win_get_string(IDS_2086));
|
||||
}
|
||||
|
||||
free(lptsTemp);
|
||||
@@ -668,10 +668,10 @@ win_settings_machine_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
SendMessage(h, CB_SETCURSEL, machinetolist[temp_machine], 0);
|
||||
|
||||
h = GetDlgItem(hdlg, IDC_COMBO_WS);
|
||||
SendMessage(h, CB_ADDSTRING, 0, win_get_string(IDS_2099));
|
||||
SendMessage(h, CB_ADDSTRING, 0, win_get_string(IDS_2090));
|
||||
|
||||
for (c = 0; c < 8; c++) {
|
||||
wsprintf(lptsTemp, plat_get_string(2100), c);
|
||||
wsprintf(lptsTemp, plat_get_string(IDS_2091), c);
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM) lptsTemp);
|
||||
}
|
||||
|
||||
@@ -1009,7 +1009,7 @@ win_settings_input_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
mbstowcs(str, joy_name, strlen(joy_name) + 1);
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM)str);
|
||||
|
||||
// SendMessage(h, CB_ADDSTRING, 0, win_get_string(2105 + c));
|
||||
// SendMessage(h, CB_ADDSTRING, 0, win_get_string(IDS_2096 + c));
|
||||
c++;
|
||||
joy_name = joystick_get_name(c);
|
||||
}
|
||||
@@ -1155,7 +1155,7 @@ win_settings_sound_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
|
||||
if (device_is_valid(sound_dev, machines[temp_machine].flags)) {
|
||||
if (c == 0)
|
||||
SendMessage(h, CB_ADDSTRING, 0, win_get_string(IDS_2112));
|
||||
SendMessage(h, CB_ADDSTRING, 0, win_get_string(IDS_2103));
|
||||
else {
|
||||
mbstowcs(lptsTemp, s, strlen(s) + 1);
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM) lptsTemp);
|
||||
@@ -1186,7 +1186,7 @@ win_settings_sound_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
|
||||
if (midi_device_available(c)) {
|
||||
if (c == 0)
|
||||
SendMessage(h, CB_ADDSTRING, 0, win_get_string(IDS_2112));
|
||||
SendMessage(h, CB_ADDSTRING, 0, win_get_string(IDS_2103));
|
||||
else {
|
||||
mbstowcs(lptsTemp, s, strlen(s) + 1);
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM) lptsTemp);
|
||||
@@ -1217,7 +1217,7 @@ win_settings_sound_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
|
||||
if (midi_in_device_available(c)) {
|
||||
if (c == 0)
|
||||
SendMessage(h, CB_ADDSTRING, 0, win_get_string(IDS_2112));
|
||||
SendMessage(h, CB_ADDSTRING, 0, win_get_string(IDS_2103));
|
||||
else {
|
||||
mbstowcs(lptsTemp, s, strlen(s) + 1);
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM) lptsTemp);
|
||||
@@ -1426,7 +1426,7 @@ win_settings_ports_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
break;
|
||||
|
||||
if (c == 0)
|
||||
SendMessage(h, CB_ADDSTRING, 0, win_get_string(IDS_2112));
|
||||
SendMessage(h, CB_ADDSTRING, 0, win_get_string(IDS_2103));
|
||||
else {
|
||||
mbstowcs(lptsTemp, s, strlen(s) + 1);
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM) lptsTemp);
|
||||
@@ -1582,7 +1582,7 @@ win_settings_peripherals_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lPa
|
||||
|
||||
if (device_is_valid(scsi_dev, machines[temp_machine].flags)) {
|
||||
if (c == 0)
|
||||
SendMessage(h, CB_ADDSTRING, 0, win_get_string(IDS_2112));
|
||||
SendMessage(h, CB_ADDSTRING, 0, win_get_string(IDS_2103));
|
||||
else {
|
||||
mbstowcs(lptsTemp, s, strlen(s) + 1);
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM) lptsTemp);
|
||||
@@ -1637,7 +1637,7 @@ win_settings_peripherals_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lPa
|
||||
|
||||
if (d == 0) {
|
||||
/* Translate "None". */
|
||||
SendMessage(h, CB_ADDSTRING, 0, win_get_string(IDS_2112));
|
||||
SendMessage(h, CB_ADDSTRING, 0, win_get_string(IDS_2103));
|
||||
} else {
|
||||
mbstowcs(lptsTemp, s, strlen(s) + 1);
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM) lptsTemp);
|
||||
@@ -1663,8 +1663,7 @@ win_settings_peripherals_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lPa
|
||||
|
||||
if (d == 0) {
|
||||
/* Translate "None". */
|
||||
SendMessage(h, CB_ADDSTRING, 0,
|
||||
(LPARAM)win_get_string(IDS_2112));
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM)win_get_string(IDS_2103));
|
||||
} else {
|
||||
s = (char *) isamem_get_name(d);
|
||||
mbstowcs(lptsTemp, s, strlen(s) + 1);
|
||||
@@ -1922,7 +1921,7 @@ win_settings_network_proc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
|
||||
if (network_card_available(c) && device_is_valid(network_card_getdevice(c), machines[temp_machine].flags)) {
|
||||
if (c == 0)
|
||||
SendMessage(h, CB_ADDSTRING, 0, win_get_string(2112));
|
||||
SendMessage(h, CB_ADDSTRING, 0, win_get_string(IDS_2103));
|
||||
else {
|
||||
mbstowcs(lptsTemp, s, strlen(s) + 1);
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM) lptsTemp);
|
||||
@@ -2491,7 +2490,7 @@ win_settings_hard_disks_init_columns(HWND hwndList)
|
||||
|
||||
for (iCol = 0; iCol < C_COLUMNS_HARD_DISKS; iCol++) {
|
||||
lvc.iSubItem = iCol;
|
||||
lvc.pszText = plat_get_string(IDS_2082 + iCol);
|
||||
lvc.pszText = plat_get_string(IDS_2081 + iCol);
|
||||
|
||||
switch(iCol) {
|
||||
case 0: /* Bus */
|
||||
@@ -2556,7 +2555,7 @@ set_edit_box_contents(HWND hdlg, int id, uint32_t val)
|
||||
WCHAR szText[256];
|
||||
|
||||
h = GetDlgItem(hdlg, id);
|
||||
wsprintf(szText, plat_get_string(IDS_2115), val);
|
||||
wsprintf(szText, plat_get_string(IDS_2106), val);
|
||||
SendMessage(h, WM_SETTEXT, (WPARAM) wcslen(szText), (LPARAM) szText);
|
||||
}
|
||||
|
||||
@@ -2575,7 +2574,7 @@ static int hdconf_initialize_hdt_combo(HWND hdlg)
|
||||
for (i = 0; i < 127; i++) {
|
||||
temp_size = ((uint64_t) hdd_table[i][0]) * hdd_table[i][1] * hdd_table[i][2];
|
||||
size_mb = (uint32_t) (temp_size >> 11LL);
|
||||
wsprintf(szText, plat_get_string(IDS_2116), size_mb, hdd_table[i][0], hdd_table[i][1], hdd_table[i][2]);
|
||||
wsprintf(szText, plat_get_string(IDS_2107), size_mb, hdd_table[i][0], hdd_table[i][1], hdd_table[i][2]);
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM) szText);
|
||||
if ((tracks == (int) hdd_table[i][0]) && (hpc == (int) hdd_table[i][1]) &&
|
||||
(spt == (int) hdd_table[i][2]))
|
||||
@@ -3593,7 +3592,7 @@ win_settings_cdrom_drives_recalc_list(HWND hwndList)
|
||||
|
||||
lvI.iSubItem = 1;
|
||||
if (temp_cdrom[i].bus_type == CDROM_BUS_DISABLED)
|
||||
lvI.pszText = plat_get_string(IDS_2112);
|
||||
lvI.pszText = plat_get_string(IDS_2103);
|
||||
else {
|
||||
wsprintf(szText, L"%ix", temp_cdrom[i].speed);
|
||||
lvI.pszText = szText;
|
||||
@@ -3667,7 +3666,7 @@ win_settings_floppy_drives_init_columns(HWND hwndList)
|
||||
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
|
||||
|
||||
lvc.iSubItem = 0;
|
||||
lvc.pszText = plat_get_string(IDS_2101);
|
||||
lvc.pszText = plat_get_string(IDS_2092);
|
||||
|
||||
lvc.cx = 292;
|
||||
lvc.fmt = LVCFMT_LEFT;
|
||||
@@ -3685,7 +3684,7 @@ win_settings_floppy_drives_init_columns(HWND hwndList)
|
||||
return FALSE;
|
||||
|
||||
lvc.iSubItem = 2;
|
||||
lvc.pszText = plat_get_string(IDS_2088);
|
||||
lvc.pszText = plat_get_string(IDS_2087);
|
||||
|
||||
lvc.cx = 75;
|
||||
lvc.fmt = LVCFMT_LEFT;
|
||||
@@ -3705,7 +3704,7 @@ win_settings_cdrom_drives_init_columns(HWND hwndList)
|
||||
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
|
||||
|
||||
lvc.iSubItem = 0;
|
||||
lvc.pszText = plat_get_string(IDS_2082);
|
||||
lvc.pszText = plat_get_string(IDS_2081);
|
||||
|
||||
lvc.cx = 342;
|
||||
lvc.fmt = LVCFMT_LEFT;
|
||||
@@ -3734,7 +3733,7 @@ win_settings_zip_drives_init_columns(HWND hwndList)
|
||||
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
|
||||
|
||||
lvc.iSubItem = 0;
|
||||
lvc.pszText = plat_get_string(IDS_2082);
|
||||
lvc.pszText = plat_get_string(IDS_2081);
|
||||
|
||||
lvc.cx = 342;
|
||||
lvc.fmt = LVCFMT_LEFT;
|
||||
@@ -3743,7 +3742,7 @@ win_settings_zip_drives_init_columns(HWND hwndList)
|
||||
return FALSE;
|
||||
|
||||
lvc.iSubItem = 1;
|
||||
lvc.pszText = plat_get_string(IDS_2101);
|
||||
lvc.pszText = plat_get_string(IDS_2092);
|
||||
|
||||
lvc.cx = 50;
|
||||
lvc.fmt = LVCFMT_LEFT;
|
||||
@@ -3857,7 +3856,7 @@ win_settings_cdrom_drives_update_item(HWND hwndList, int i)
|
||||
|
||||
lvI.iSubItem = 1;
|
||||
if (temp_cdrom[i].bus_type == CDROM_BUS_DISABLED)
|
||||
lvI.pszText = plat_get_string(IDS_2112);
|
||||
lvI.pszText = plat_get_string(IDS_2103);
|
||||
else {
|
||||
wsprintf(szText, L"%ix", temp_cdrom[i].speed);
|
||||
lvI.pszText = szText;
|
||||
|
||||
@@ -62,8 +62,6 @@ int update_icons = 1;
|
||||
|
||||
|
||||
static LONG_PTR OriginalProcedure;
|
||||
static HMENU *sb_menu_handles;
|
||||
static HMENU menuSBAR;
|
||||
static WCHAR **sbTips;
|
||||
static int *iStatusWidths;
|
||||
static int *sb_part_meanings;
|
||||
@@ -72,10 +70,6 @@ static int sb_parts = 0;
|
||||
static int sb_ready = 0;
|
||||
static uint8_t sb_map[256];
|
||||
|
||||
static HMENU hmenuMedia;
|
||||
static HMENU *media_menu_handles;
|
||||
|
||||
|
||||
/* Also used by win_settings.c */
|
||||
intptr_t
|
||||
fdd_type_to_icon(int type)
|
||||
@@ -120,107 +114,6 @@ hdd_count(int bus)
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
StatusBarCreateFloppySubmenu(HMENU m, int id)
|
||||
{
|
||||
AppendMenu(m, MF_STRING, IDM_FLOPPY_IMAGE_NEW | id,
|
||||
plat_get_string(IDS_2096));
|
||||
AppendMenu(m, MF_SEPARATOR, 0, 0);
|
||||
AppendMenu(m, MF_STRING, IDM_FLOPPY_IMAGE_EXISTING | id,
|
||||
plat_get_string(IDS_2097));
|
||||
AppendMenu(m, MF_STRING, IDM_FLOPPY_IMAGE_EXISTING_WP | id,
|
||||
plat_get_string(IDS_2098));
|
||||
AppendMenu(m, MF_SEPARATOR, 0, 0);
|
||||
AppendMenu(m, MF_STRING, IDM_FLOPPY_EXPORT_TO_86F | id,
|
||||
plat_get_string(IDS_2080));
|
||||
AppendMenu(m, MF_SEPARATOR, 0, 0);
|
||||
AppendMenu(m, MF_STRING, IDM_FLOPPY_EJECT | id,
|
||||
plat_get_string(IDS_2093));
|
||||
|
||||
if (floppyfns[id][0] == 0x0000) {
|
||||
EnableMenuItem(m, IDM_FLOPPY_EJECT | id, MF_BYCOMMAND | MF_GRAYED);
|
||||
EnableMenuItem(m, IDM_FLOPPY_EXPORT_TO_86F | id, MF_BYCOMMAND | MF_GRAYED);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
StatusBarCreateCdromSubmenu(HMENU m, int id)
|
||||
{
|
||||
AppendMenu(m, MF_STRING, IDM_CDROM_MUTE | id,
|
||||
plat_get_string(IDS_2092));
|
||||
AppendMenu(m, MF_SEPARATOR, 0, 0);
|
||||
AppendMenu(m, MF_STRING, IDM_CDROM_EMPTY | id,
|
||||
plat_get_string(IDS_2091));
|
||||
AppendMenu(m, MF_STRING, IDM_CDROM_RELOAD | id,
|
||||
plat_get_string(IDS_2090));
|
||||
AppendMenu(m, MF_SEPARATOR, 0, 0);
|
||||
AppendMenu(m, MF_STRING, IDM_CDROM_IMAGE | id,
|
||||
plat_get_string(IDS_2089));
|
||||
|
||||
if (! cdrom[id].sound_on)
|
||||
CheckMenuItem(m, IDM_CDROM_MUTE | id, MF_CHECKED);
|
||||
|
||||
if (cdrom[id].host_drive == 200)
|
||||
CheckMenuItem(m, IDM_CDROM_IMAGE | id, MF_CHECKED);
|
||||
else {
|
||||
cdrom[id].host_drive = 0;
|
||||
CheckMenuItem(m, IDM_CDROM_EMPTY | id, MF_CHECKED);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
StatusBarCreateZIPSubmenu(HMENU m, int id)
|
||||
{
|
||||
AppendMenu(m, MF_STRING, IDM_ZIP_IMAGE_NEW | id,
|
||||
plat_get_string(IDS_2096));
|
||||
AppendMenu(m, MF_SEPARATOR, 0, 0);
|
||||
AppendMenu(m, MF_STRING, IDM_ZIP_IMAGE_EXISTING | id,
|
||||
plat_get_string(IDS_2097));
|
||||
AppendMenu(m, MF_STRING, IDM_ZIP_IMAGE_EXISTING_WP | id,
|
||||
plat_get_string(IDS_2098));
|
||||
AppendMenu(m, MF_SEPARATOR, 0, 0);
|
||||
AppendMenu(m, MF_STRING, IDM_ZIP_EJECT | id,
|
||||
plat_get_string(IDS_2093));
|
||||
AppendMenu(m, MF_STRING, IDM_ZIP_RELOAD | id,
|
||||
plat_get_string(IDS_2090));
|
||||
|
||||
if (zip_drives[id].image_path[0] == 0x0000) {
|
||||
EnableMenuItem(m, IDM_ZIP_EJECT | id, MF_BYCOMMAND | MF_GRAYED);
|
||||
EnableMenuItem(m, IDM_ZIP_RELOAD | id, MF_BYCOMMAND | MF_ENABLED);
|
||||
} else {
|
||||
EnableMenuItem(m, IDM_ZIP_EJECT | id, MF_BYCOMMAND | MF_ENABLED);
|
||||
EnableMenuItem(m, IDM_ZIP_RELOAD | id, MF_BYCOMMAND | MF_GRAYED);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
StatusBarCreateMOSubmenu(HMENU m, int id)
|
||||
{
|
||||
AppendMenu(m, MF_STRING, IDM_MO_IMAGE_NEW | id,
|
||||
plat_get_string(IDS_2096));
|
||||
AppendMenu(m, MF_SEPARATOR, 0, 0);
|
||||
AppendMenu(m, MF_STRING, IDM_MO_IMAGE_EXISTING | id,
|
||||
plat_get_string(IDS_2097));
|
||||
AppendMenu(m, MF_STRING, IDM_MO_IMAGE_EXISTING_WP | id,
|
||||
plat_get_string(IDS_2098));
|
||||
AppendMenu(m, MF_SEPARATOR, 0, 0);
|
||||
AppendMenu(m, MF_STRING, IDM_MO_EJECT | id,
|
||||
plat_get_string(IDS_2093));
|
||||
AppendMenu(m, MF_STRING, IDM_MO_RELOAD | id,
|
||||
plat_get_string(IDS_2090));
|
||||
|
||||
if (mo_drives[id].image_path[0] == 0x0000) {
|
||||
EnableMenuItem(m, IDM_MO_EJECT | id, MF_BYCOMMAND | MF_GRAYED);
|
||||
EnableMenuItem(m, IDM_MO_RELOAD | id, MF_BYCOMMAND | MF_ENABLED);
|
||||
} else {
|
||||
EnableMenuItem(m, IDM_MO_EJECT | id, MF_BYCOMMAND | MF_ENABLED);
|
||||
EnableMenuItem(m, IDM_MO_RELOAD | id, MF_BYCOMMAND | MF_GRAYED);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ui_sb_timer_callback(int pane)
|
||||
{
|
||||
@@ -290,10 +183,10 @@ StatusBarCreateFloppyTip(int part)
|
||||
mbstowcs(wtext, fdd_getname(fdd_get_type(drive)),
|
||||
strlen(fdd_getname(fdd_get_type(drive))) + 1);
|
||||
if (wcslen(floppyfns[drive]) == 0) {
|
||||
_swprintf(tempTip, plat_get_string(IDS_2117),
|
||||
_swprintf(tempTip, plat_get_string(IDS_2108),
|
||||
drive+1, wtext, plat_get_string(IDS_2057));
|
||||
} else {
|
||||
_swprintf(tempTip, plat_get_string(IDS_2117),
|
||||
_swprintf(tempTip, plat_get_string(IDS_2108),
|
||||
drive+1, wtext, floppyfns[drive]);
|
||||
}
|
||||
|
||||
@@ -378,10 +271,10 @@ StatusBarCreateMOTip(int part)
|
||||
szText = plat_get_string(id);
|
||||
|
||||
if (wcslen(mo_drives[drive].image_path) == 0) {
|
||||
_swprintf(tempTip, plat_get_string(IDS_2124),
|
||||
_swprintf(tempTip, plat_get_string(IDS_2115),
|
||||
drive+1, szText, plat_get_string(IDS_2057));
|
||||
} else {
|
||||
_swprintf(tempTip, plat_get_string(IDS_2124),
|
||||
_swprintf(tempTip, plat_get_string(IDS_2115),
|
||||
drive+1, szText, mo_drives[drive].image_path);
|
||||
}
|
||||
|
||||
@@ -486,54 +379,10 @@ ui_sb_update_tip(int meaning)
|
||||
}
|
||||
|
||||
SendMessage(hwndSBAR, SB_SETTIPTEXT, part, (LPARAM)sbTips[part]);
|
||||
ModifyMenu(hmenuMedia, part, MF_BYPOSITION, (UINT_PTR)media_menu_handles[part], sbTips[part]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
MediaMenuDestroyMenus(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (sb_parts == 0) return;
|
||||
|
||||
if (! media_menu_handles) return;
|
||||
|
||||
for (i=0; i<sb_parts; i++) {
|
||||
if (media_menu_handles[i]) {
|
||||
RemoveMenu(hmenuMedia, (UINT_PTR)media_menu_handles[i], MF_BYCOMMAND);
|
||||
DestroyMenu(media_menu_handles[i]);
|
||||
media_menu_handles[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
free(media_menu_handles);
|
||||
media_menu_handles = NULL;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
StatusBarDestroyMenus(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (sb_parts == 0) return;
|
||||
|
||||
if (! sb_menu_handles) return;
|
||||
|
||||
for (i=0; i<sb_parts; i++) {
|
||||
if (sb_menu_handles[i]) {
|
||||
DestroyMenu(sb_menu_handles[i]);
|
||||
sb_menu_handles[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
free(sb_menu_handles);
|
||||
sb_menu_handles = NULL;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
StatusBarDestroyTips(void)
|
||||
{
|
||||
@@ -555,30 +404,6 @@ StatusBarDestroyTips(void)
|
||||
}
|
||||
|
||||
|
||||
static HMENU
|
||||
MediaMenuCreatePopupMenu(int part)
|
||||
{
|
||||
HMENU h;
|
||||
|
||||
h = CreatePopupMenu();
|
||||
AppendMenu(hmenuMedia, MF_POPUP | MF_STRING, (UINT_PTR)h, 0);
|
||||
|
||||
return(h);
|
||||
}
|
||||
|
||||
|
||||
static HMENU
|
||||
StatusBarCreatePopupMenu(int part)
|
||||
{
|
||||
HMENU h;
|
||||
|
||||
h = CreatePopupMenu();
|
||||
AppendMenu(menuSBAR, MF_POPUP, (UINT_PTR)h, 0);
|
||||
|
||||
return(h);
|
||||
}
|
||||
|
||||
|
||||
/* API: mark the status bar as not ready. */
|
||||
void
|
||||
ui_sb_set_ready(int ready)
|
||||
@@ -613,6 +438,8 @@ ui_sb_update_panes(void)
|
||||
c_scsi = hdd_count(HDD_BUS_SCSI);
|
||||
do_net = network_available();
|
||||
|
||||
media_menu_reset();
|
||||
|
||||
if (sb_parts > 0) {
|
||||
for (i = 0; i < sb_parts; i++)
|
||||
SendMessage(hwndSBAR, SB_SETICON, i, (LPARAM)NULL);
|
||||
@@ -630,9 +457,7 @@ ui_sb_update_panes(void)
|
||||
free(sb_part_icons);
|
||||
sb_part_icons = NULL;
|
||||
}
|
||||
StatusBarDestroyMenus();
|
||||
StatusBarDestroyTips();
|
||||
MediaMenuDestroyMenus();
|
||||
}
|
||||
|
||||
memset(sb_map, 0xff, sizeof(sb_map));
|
||||
@@ -691,12 +516,8 @@ ui_sb_update_panes(void)
|
||||
memset(sb_part_meanings, 0, sb_parts * sizeof(int));
|
||||
sb_part_icons = (uint8_t *)malloc(sb_parts * sizeof(uint8_t));
|
||||
memset(sb_part_icons, 0, sb_parts * sizeof(uint8_t));
|
||||
sb_menu_handles = (HMENU *)malloc(sb_parts * sizeof(HMENU));
|
||||
memset(sb_menu_handles, 0, sb_parts * sizeof(HMENU));
|
||||
sbTips = (WCHAR **)malloc(sb_parts * sizeof(WCHAR *));
|
||||
memset(sbTips, 0, sb_parts * sizeof(WCHAR *));
|
||||
media_menu_handles = (HMENU *)malloc(sb_parts * sizeof(HMENU));
|
||||
memset(media_menu_handles, 0, sb_parts * sizeof(HMENU));
|
||||
|
||||
sb_parts = 0;
|
||||
for (i=0; i<FDD_NUM; i++) {
|
||||
@@ -817,16 +638,7 @@ ui_sb_update_panes(void)
|
||||
case SB_FLOPPY: /* Floppy */
|
||||
sb_part_icons[i] = (wcslen(floppyfns[sb_part_meanings[i] & 0xf]) == 0) ? 128 : 0;
|
||||
sb_part_icons[i] |= fdd_type_to_icon(fdd_get_type(sb_part_meanings[i] & 0xf));
|
||||
sb_menu_handles[i] = StatusBarCreatePopupMenu(i);
|
||||
media_menu_handles[i] = MediaMenuCreatePopupMenu(i);
|
||||
|
||||
StatusBarCreateFloppySubmenu(sb_menu_handles[i], sb_part_meanings[i] & 0xf);
|
||||
StatusBarCreateFloppySubmenu(media_menu_handles[i], sb_part_meanings[i] & 0xf);
|
||||
|
||||
EnableMenuItem(sb_menu_handles[i], IDM_FLOPPY_EJECT | (sb_part_meanings[i] & 0xf), MF_BYCOMMAND | ((sb_part_icons[i] & 128) ? MF_GRAYED : MF_ENABLED));
|
||||
EnableMenuItem(media_menu_handles[i], IDM_FLOPPY_EJECT | (sb_part_meanings[i] & 0xf), MF_BYCOMMAND | ((sb_part_icons[i] & 128) ? MF_GRAYED : MF_ENABLED));
|
||||
StatusBarCreateFloppyTip(i);
|
||||
|
||||
break;
|
||||
|
||||
case SB_CDROM: /* CD-ROM */
|
||||
@@ -836,46 +648,19 @@ ui_sb_update_panes(void)
|
||||
else
|
||||
sb_part_icons[i] = 128;
|
||||
sb_part_icons[i] |= 32;
|
||||
sb_menu_handles[i] = StatusBarCreatePopupMenu(i);
|
||||
media_menu_handles[i] = MediaMenuCreatePopupMenu(i);
|
||||
|
||||
StatusBarCreateCdromSubmenu(sb_menu_handles[i], sb_part_meanings[i] & 0xf);
|
||||
StatusBarCreateCdromSubmenu(media_menu_handles[i], sb_part_meanings[i] & 0xf);
|
||||
|
||||
EnableMenuItem(sb_menu_handles[i], IDM_CDROM_RELOAD | (sb_part_meanings[i] & 0xf), MF_BYCOMMAND | MF_GRAYED);
|
||||
EnableMenuItem(media_menu_handles[i], IDM_CDROM_RELOAD | (sb_part_meanings[i] & 0xf), MF_BYCOMMAND | MF_GRAYED);
|
||||
StatusBarCreateCdromTip(i);
|
||||
|
||||
break;
|
||||
|
||||
case SB_ZIP: /* Iomega ZIP */
|
||||
sb_part_icons[i] = (wcslen(zip_drives[sb_part_meanings[i] & 0xf].image_path) == 0) ? 128 : 0;
|
||||
sb_part_icons[i] |= 48;
|
||||
sb_menu_handles[i] = StatusBarCreatePopupMenu(i);
|
||||
media_menu_handles[i] = MediaMenuCreatePopupMenu(i);
|
||||
|
||||
StatusBarCreateZIPSubmenu(sb_menu_handles[i], sb_part_meanings[i] & 0xf);
|
||||
StatusBarCreateZIPSubmenu(media_menu_handles[i], sb_part_meanings[i] & 0xf);
|
||||
|
||||
EnableMenuItem(sb_menu_handles[i], IDM_ZIP_EJECT | (sb_part_meanings[i] & 0xf), MF_BYCOMMAND | ((sb_part_icons[i] & 128) ? MF_GRAYED : MF_ENABLED));
|
||||
EnableMenuItem(media_menu_handles[i], IDM_ZIP_EJECT | (sb_part_meanings[i] & 0xf), MF_BYCOMMAND | ((sb_part_icons[i] & 128) ? MF_GRAYED : MF_ENABLED));
|
||||
StatusBarCreateZIPTip(i);
|
||||
|
||||
break;
|
||||
|
||||
case SB_MO: /* Magneto-Optical disk */
|
||||
sb_part_icons[i] = (wcslen(mo_drives[sb_part_meanings[i] & 0xf].image_path) == 0) ? 128 : 0;
|
||||
sb_part_icons[i] |= 56;
|
||||
sb_menu_handles[i] = StatusBarCreatePopupMenu(i);
|
||||
media_menu_handles[i] = MediaMenuCreatePopupMenu(i);
|
||||
|
||||
StatusBarCreateMOSubmenu(sb_menu_handles[i], sb_part_meanings[i] & 0xf);
|
||||
StatusBarCreateMOSubmenu(media_menu_handles[i], sb_part_meanings[i] & 0xf);
|
||||
|
||||
EnableMenuItem(sb_menu_handles[i], IDM_MO_EJECT | (sb_part_meanings[i] & 0xf), MF_BYCOMMAND | ((sb_part_icons[i] & 128) ? MF_GRAYED : MF_ENABLED));
|
||||
EnableMenuItem(media_menu_handles[i], IDM_MO_EJECT | (sb_part_meanings[i] & 0xf), MF_BYCOMMAND | ((sb_part_icons[i] & 128) ? MF_GRAYED : MF_ENABLED));
|
||||
StatusBarCreateMOTip(i);
|
||||
|
||||
break;
|
||||
|
||||
case SB_HDD: /* Hard disk */
|
||||
@@ -903,7 +688,6 @@ ui_sb_update_panes(void)
|
||||
SendMessage(hwndSBAR, SB_SETTEXT, i | SBT_NOBORDERS, (LPARAM)L"");
|
||||
SendMessage(hwndSBAR, SB_SETICON, i, (LPARAM)hIcon[sb_part_icons[i]]);
|
||||
SendMessage(hwndSBAR, SB_SETTIPTEXT, i, (LPARAM)sbTips[i]);
|
||||
ModifyMenu(hmenuMedia, i, MF_BYPOSITION, (UINT_PTR)media_menu_handles[i], sbTips[i]);
|
||||
} else
|
||||
SendMessage(hwndSBAR, SB_SETICON, i, (LPARAM)NULL);
|
||||
}
|
||||
@@ -915,260 +699,37 @@ ui_sb_update_panes(void)
|
||||
static VOID APIENTRY
|
||||
StatusBarPopupMenu(HWND hwnd, POINT pt, int id)
|
||||
{
|
||||
HMENU menu;
|
||||
|
||||
if (id >= (sb_parts - 1)) return;
|
||||
|
||||
pt.x = id * SB_ICON_WIDTH; /* Justify to the left. */
|
||||
pt.y = 0; /* Justify to the top. */
|
||||
ClientToScreen(hwnd, (LPPOINT) &pt);
|
||||
TrackPopupMenu(sb_menu_handles[id],
|
||||
|
||||
switch(sb_part_meanings[id] & 0xF0) {
|
||||
case SB_FLOPPY:
|
||||
menu = media_menu_get_floppy(sb_part_meanings[id] & 0x0F);
|
||||
break;
|
||||
case SB_CDROM:
|
||||
menu = media_menu_get_cdrom(sb_part_meanings[id] & 0x0F);
|
||||
break;
|
||||
case SB_ZIP:
|
||||
menu = media_menu_get_zip(sb_part_meanings[id] & 0x0F);
|
||||
break;
|
||||
case SB_MO:
|
||||
menu = media_menu_get_mo(sb_part_meanings[id] & 0x0F);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
TrackPopupMenu(menu,
|
||||
TPM_LEFTALIGN | TPM_BOTTOMALIGN | TPM_LEFTBUTTON,
|
||||
pt.x, pt.y, 0, hwndSBAR, NULL);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ui_sb_mount_floppy_img(uint8_t id, int part, uint8_t wp, wchar_t *file_name)
|
||||
{
|
||||
fdd_close(id);
|
||||
ui_writeprot[id] = wp;
|
||||
fdd_load(id, file_name);
|
||||
if (sb_ready) {
|
||||
ui_sb_update_icon_state(SB_FLOPPY | id, wcslen(floppyfns[id]) ? 0 : 1);
|
||||
ui_sb_enable_menu_item(SB_FLOPPY | id, IDM_FLOPPY_EJECT | id, MF_BYCOMMAND | (wcslen(floppyfns[id]) ? MF_ENABLED : MF_GRAYED));
|
||||
ui_sb_enable_menu_item(SB_FLOPPY | id, IDM_FLOPPY_EXPORT_TO_86F | id, MF_BYCOMMAND | (wcslen(floppyfns[id]) ? MF_ENABLED : MF_GRAYED));
|
||||
ui_sb_update_tip(SB_FLOPPY | id);
|
||||
}
|
||||
config_save();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ui_sb_mount_zip_img(uint8_t id, int part, uint8_t wp, wchar_t *file_name)
|
||||
{
|
||||
zip_t *dev = (zip_t *) zip_drives[id].priv;
|
||||
|
||||
zip_disk_close(dev);
|
||||
zip_drives[id].read_only = wp;
|
||||
zip_load(dev, file_name);
|
||||
zip_insert(dev);
|
||||
if (sb_ready) {
|
||||
ui_sb_update_icon_state(SB_ZIP | id, wcslen(zip_drives[id].image_path) ? 0 : 1);
|
||||
ui_sb_enable_menu_item(SB_ZIP | id, IDM_ZIP_EJECT | id, MF_BYCOMMAND | (wcslen(zip_drives[id].image_path) ? MF_ENABLED : MF_GRAYED));
|
||||
ui_sb_enable_menu_item(SB_ZIP | id, IDM_ZIP_RELOAD | id, MF_BYCOMMAND | (wcslen(zip_drives[id].image_path) ? MF_GRAYED : MF_ENABLED));
|
||||
ui_sb_update_tip(SB_ZIP | id);
|
||||
}
|
||||
config_save();
|
||||
}
|
||||
|
||||
void
|
||||
ui_sb_mount_mo_img(uint8_t id, int part, uint8_t wp, wchar_t *file_name)
|
||||
{
|
||||
mo_t *dev = (mo_t *) mo_drives[id].priv;
|
||||
|
||||
mo_disk_close(dev);
|
||||
mo_drives[id].read_only = wp;
|
||||
mo_load(dev, file_name);
|
||||
mo_insert(dev);
|
||||
if (sb_ready) {
|
||||
ui_sb_update_icon_state(SB_MO | id, wcslen(mo_drives[id].image_path) ? 0 : 1);
|
||||
ui_sb_enable_menu_item(SB_MO | id, IDM_MO_EJECT | id, MF_BYCOMMAND | (wcslen(zip_drives[id].image_path) ? MF_ENABLED : MF_GRAYED));
|
||||
ui_sb_enable_menu_item(SB_MO | id, IDM_MO_RELOAD | id, MF_BYCOMMAND | (wcslen(zip_drives[id].image_path) ? MF_GRAYED : MF_ENABLED));
|
||||
ui_sb_update_tip(SB_MO | id);
|
||||
}
|
||||
config_save();
|
||||
}
|
||||
|
||||
int
|
||||
MediaMenuHandler(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
int id = 0, ret = 0;
|
||||
uint8_t part = 0;
|
||||
WCHAR temp_path[1024];
|
||||
int item_id, item_params;
|
||||
|
||||
item_id = LOWORD(wParam) & 0xff00; /* low 8 bits */
|
||||
item_params = LOWORD(wParam) & 0x00ff; /* high 8 bits */
|
||||
|
||||
switch (item_id) {
|
||||
case IDM_FLOPPY_IMAGE_NEW:
|
||||
id = item_params & 0x0003;
|
||||
part = sb_map[SB_FLOPPY | id];
|
||||
if ((part == 0xff) || (sb_menu_handles == NULL))
|
||||
break;
|
||||
|
||||
NewFloppyDialogCreate(hwnd, id, part);
|
||||
break;
|
||||
|
||||
case IDM_FLOPPY_IMAGE_EXISTING:
|
||||
case IDM_FLOPPY_IMAGE_EXISTING_WP:
|
||||
id = item_params & 0x0003;
|
||||
part = sb_map[SB_FLOPPY | id];
|
||||
if ((part == 0xff) || (sb_menu_handles == NULL))
|
||||
break;
|
||||
|
||||
ret = file_dlg_w_st(hwnd, IDS_2118, floppyfns[id], 0);
|
||||
if (! ret)
|
||||
ui_sb_mount_floppy_img(id, part, (item_id == IDM_FLOPPY_IMAGE_EXISTING_WP) ? 1 : 0, wopenfilestring);
|
||||
break;
|
||||
|
||||
case IDM_FLOPPY_EJECT:
|
||||
id = item_params & 0x0003;
|
||||
part = sb_map[SB_FLOPPY | id];
|
||||
if ((part == 0xff) || (sb_menu_handles == NULL))
|
||||
break;
|
||||
|
||||
fdd_close(id);
|
||||
ui_sb_update_icon_state(SB_FLOPPY | id, 1);
|
||||
ui_sb_enable_menu_item(SB_FLOPPY | id, IDM_FLOPPY_EJECT | id, MF_BYCOMMAND | MF_GRAYED);
|
||||
ui_sb_enable_menu_item(SB_FLOPPY | id, IDM_FLOPPY_EJECT | id, MF_BYCOMMAND | MF_GRAYED);
|
||||
ui_sb_update_tip(SB_FLOPPY | id);
|
||||
config_save();
|
||||
break;
|
||||
|
||||
case IDM_FLOPPY_EXPORT_TO_86F:
|
||||
id = item_params & 0x0003;
|
||||
part = sb_map[SB_FLOPPY | id];
|
||||
if ((part == 0xff) || (sb_menu_handles == NULL))
|
||||
break;
|
||||
|
||||
ret = file_dlg_w_st(hwnd, IDS_2076, floppyfns[id], 1);
|
||||
if (! ret) {
|
||||
plat_pause(1);
|
||||
ret = d86f_export(id, wopenfilestring);
|
||||
if (!ret)
|
||||
ui_msgbox(MBX_ERROR, (wchar_t *)IDS_4108);
|
||||
plat_pause(0);
|
||||
}
|
||||
break;
|
||||
|
||||
case IDM_CDROM_MUTE:
|
||||
id = item_params & 0x0007;
|
||||
part = sb_map[SB_CDROM | id];
|
||||
if ((part == 0xff) || (sb_menu_handles == NULL))
|
||||
break;
|
||||
|
||||
cdrom[id].sound_on ^= 1;
|
||||
ui_sb_check_menu_item(SB_CDROM | id, IDM_CDROM_MUTE | id, cdrom[id].sound_on ? MF_UNCHECKED : MF_CHECKED);
|
||||
config_save();
|
||||
sound_cd_thread_reset();
|
||||
break;
|
||||
|
||||
case IDM_CDROM_EMPTY:
|
||||
id = item_params & 0x0007;
|
||||
part = sb_map[SB_CDROM | id];
|
||||
if ((part == 0xff) || (sb_menu_handles == NULL))
|
||||
break;
|
||||
|
||||
cdrom_eject(id);
|
||||
break;
|
||||
|
||||
case IDM_CDROM_RELOAD:
|
||||
id = item_params & 0x0007;
|
||||
part = sb_map[SB_CDROM | id];
|
||||
if ((part == 0xff) || (sb_menu_handles == NULL))
|
||||
break;
|
||||
|
||||
cdrom_reload(id);
|
||||
break;
|
||||
|
||||
case IDM_CDROM_IMAGE:
|
||||
id = item_params & 0x0007;
|
||||
part = sb_map[SB_CDROM | id];
|
||||
if ((part == 0xff) || (sb_menu_handles == NULL))
|
||||
break;
|
||||
|
||||
if (!file_dlg_w_st(hwnd, IDS_2075, cdrom[id].image_path, 0)) {
|
||||
cdrom[id].prev_host_drive = cdrom[id].host_drive;
|
||||
wcscpy(temp_path, wopenfilestring);
|
||||
wcscpy(cdrom[id].prev_image_path, cdrom[id].image_path);
|
||||
if (cdrom[id].ops && cdrom[id].ops->exit)
|
||||
cdrom[id].ops->exit(&(cdrom[id]));
|
||||
cdrom[id].ops = NULL;
|
||||
memset(cdrom[id].image_path, 0, sizeof(cdrom[id].image_path));
|
||||
cdrom_image_open(&(cdrom[id]), temp_path);
|
||||
/* Signal media change to the emulated machine. */
|
||||
if (cdrom[id].insert)
|
||||
cdrom[id].insert(cdrom[id].priv);
|
||||
cdrom[id].host_drive = (wcslen(cdrom[id].image_path) == 0) ? 0 : 200;
|
||||
if (cdrom[id].host_drive == 200) {
|
||||
ui_sb_check_menu_item(SB_CDROM | id, IDM_CDROM_EMPTY | id, MF_UNCHECKED);
|
||||
ui_sb_check_menu_item(SB_CDROM | id, IDM_CDROM_IMAGE | id, MF_CHECKED);
|
||||
ui_sb_update_icon_state(SB_CDROM | id, 0);
|
||||
} else {
|
||||
ui_sb_check_menu_item(SB_CDROM | id, IDM_CDROM_IMAGE | id, MF_UNCHECKED);
|
||||
ui_sb_check_menu_item(SB_CDROM | id, IDM_CDROM_EMPTY | id, MF_CHECKED);
|
||||
ui_sb_update_icon_state(SB_CDROM | id, 1);
|
||||
}
|
||||
ui_sb_enable_menu_item(SB_CDROM | id, IDM_CDROM_RELOAD | id, MF_BYCOMMAND | MF_GRAYED);
|
||||
ui_sb_update_tip(SB_CDROM | id);
|
||||
config_save();
|
||||
}
|
||||
break;
|
||||
|
||||
case IDM_ZIP_IMAGE_NEW:
|
||||
id = item_params & 0x0003;
|
||||
part = sb_map[SB_ZIP | id];
|
||||
NewFloppyDialogCreate(hwnd, id | 0x80, part); /* NewZIPDialogCreate */
|
||||
break;
|
||||
|
||||
case IDM_ZIP_IMAGE_EXISTING:
|
||||
case IDM_ZIP_IMAGE_EXISTING_WP:
|
||||
id = item_params & 0x0003;
|
||||
part = sb_map[SB_ZIP | id];
|
||||
if ((part == 0xff) || (sb_menu_handles == NULL))
|
||||
break;
|
||||
|
||||
ret = file_dlg_w_st(hwnd, IDS_2058, zip_drives[id].image_path, 0);
|
||||
if (! ret)
|
||||
ui_sb_mount_zip_img(id, part, (item_id == IDM_ZIP_IMAGE_EXISTING_WP) ? 1 : 0, wopenfilestring);
|
||||
break;
|
||||
|
||||
case IDM_ZIP_EJECT:
|
||||
id = item_params & 0x0003;
|
||||
zip_eject(id);
|
||||
break;
|
||||
|
||||
case IDM_ZIP_RELOAD:
|
||||
id = item_params & 0x0003;
|
||||
zip_reload(id);
|
||||
break;
|
||||
|
||||
case IDM_MO_IMAGE_NEW:
|
||||
id = item_params & 0x0003;
|
||||
part = sb_map[SB_MO | id];
|
||||
NewFloppyDialogCreate(hwnd, id | 0x80, part); /* NewZIPDialogCreate */
|
||||
break;
|
||||
|
||||
case IDM_MO_IMAGE_EXISTING:
|
||||
case IDM_MO_IMAGE_EXISTING_WP:
|
||||
id = item_params & 0x0003;
|
||||
part = sb_map[SB_MO | id];
|
||||
if ((part == 0xff) || (sb_menu_handles == NULL))
|
||||
break;
|
||||
|
||||
ret = file_dlg_w_st(hwnd, IDS_2125, mo_drives[id].image_path, 0);
|
||||
if (! ret)
|
||||
ui_sb_mount_mo_img(id, part, (item_id == IDM_MO_IMAGE_EXISTING_WP) ? 1 : 0, wopenfilestring);
|
||||
break;
|
||||
|
||||
case IDM_MO_EJECT:
|
||||
id = item_params & 0x0003;
|
||||
mo_eject(id);
|
||||
break;
|
||||
|
||||
case IDM_MO_RELOAD:
|
||||
id = item_params & 0x0003;
|
||||
mo_reload(id);
|
||||
break;
|
||||
|
||||
default:
|
||||
return(0);
|
||||
}
|
||||
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* Handle messages for the Status Bar window. */
|
||||
#if defined(__amd64__) || defined(__aarch64__)
|
||||
static LRESULT CALLBACK
|
||||
@@ -1183,7 +744,7 @@ StatusBarProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
|
||||
switch (message) {
|
||||
case WM_COMMAND:
|
||||
MediaMenuHandler(hwnd, message, wParam, lParam);
|
||||
media_menu_proc(hwnd, message, wParam, lParam);
|
||||
return(0);
|
||||
|
||||
case WM_LBUTTONDOWN:
|
||||
@@ -1215,27 +776,6 @@ StatusBarProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
MediaMenuCreate(HWND hwndParent, uintptr_t idStatus, HINSTANCE hInst)
|
||||
{
|
||||
HMENU hmenu;
|
||||
LPWSTR lpMenuName;
|
||||
|
||||
hmenu = GetMenu(hwndParent);
|
||||
hmenuMedia = CreatePopupMenu();
|
||||
|
||||
int len = GetMenuString(hmenu, IDM_MEDIA, NULL, 0, MF_BYCOMMAND);
|
||||
lpMenuName = malloc((len + 1) * sizeof(WCHAR));
|
||||
GetMenuString(hmenu, IDM_MEDIA, lpMenuName, len + 1, MF_BYCOMMAND);
|
||||
|
||||
InsertMenu(hmenu, IDM_MEDIA, MF_BYCOMMAND | MF_STRING | MF_POPUP, (UINT_PTR)hmenuMedia, lpMenuName);
|
||||
RemoveMenu(hmenu, IDM_MEDIA, MF_BYCOMMAND);
|
||||
DrawMenuBar(hwndParent);
|
||||
|
||||
free(lpMenuName);
|
||||
}
|
||||
|
||||
|
||||
/* API: Create and set up the Status Bar window. */
|
||||
void
|
||||
StatusBarCreate(HWND hwndParent, uintptr_t idStatus, HINSTANCE hInst)
|
||||
@@ -1299,9 +839,6 @@ StatusBarCreate(HWND hwndParent, uintptr_t idStatus, HINSTANCE hInst)
|
||||
rectDialog.bottom-rectDialog.top,
|
||||
SWP_SHOWWINDOW);
|
||||
|
||||
/* Load the dummu menu for this window. */
|
||||
menuSBAR = LoadMenu(hInst, SB_MENU_NAME);
|
||||
|
||||
/* Initialize the status bar. This is clumsy. */
|
||||
sb_parts = 1;
|
||||
iStatusWidths = (int *)malloc(sb_parts * sizeof(int));
|
||||
@@ -1310,12 +847,8 @@ StatusBarCreate(HWND hwndParent, uintptr_t idStatus, HINSTANCE hInst)
|
||||
memset(sb_part_meanings, 0, sb_parts * sizeof(int));
|
||||
sb_part_icons = (uint8_t *)malloc(sb_parts * sizeof(uint8_t));
|
||||
memset(sb_part_icons, 0, sb_parts * sizeof(uint8_t));
|
||||
sb_menu_handles = (HMENU *)malloc(sb_parts * sizeof(HMENU));
|
||||
memset(sb_menu_handles, 0, sb_parts * sizeof(HMENU));
|
||||
sbTips = (WCHAR **)malloc(sb_parts * sizeof(WCHAR *));
|
||||
memset(sbTips, 0, sb_parts * sizeof(WCHAR *));
|
||||
media_menu_handles = (HMENU *)malloc(sb_parts * sizeof(HMENU));
|
||||
memset(media_menu_handles, 0, sb_parts * sizeof(HMENU));
|
||||
sb_parts = 0;
|
||||
iStatusWidths[sb_parts] = -1;
|
||||
sb_part_meanings[sb_parts] = SB_TEXT;
|
||||
@@ -1323,50 +856,12 @@ StatusBarCreate(HWND hwndParent, uintptr_t idStatus, HINSTANCE hInst)
|
||||
sb_parts++;
|
||||
SendMessage(hwndSBAR, SB_SETPARTS, (WPARAM)sb_parts, (LPARAM)iStatusWidths);
|
||||
SendMessage(hwndSBAR, SB_SETTEXT, 0 | SBT_NOBORDERS,
|
||||
(LPARAM)plat_get_string(IDS_2126));
|
||||
|
||||
MediaMenuCreate(hwndParent, idStatus, hInst);
|
||||
(LPARAM)plat_get_string(IDS_2117));
|
||||
|
||||
sb_ready = 1;
|
||||
}
|
||||
|
||||
|
||||
/* API (Settings) */
|
||||
void
|
||||
ui_sb_check_menu_item(int tag, int id, int chk)
|
||||
{
|
||||
uint8_t part;
|
||||
|
||||
if (!sb_ready)
|
||||
return;
|
||||
|
||||
part = sb_map[tag];
|
||||
if ((part == 0xff) || (sb_menu_handles == NULL))
|
||||
return;
|
||||
|
||||
CheckMenuItem(sb_menu_handles[part], id, chk);
|
||||
CheckMenuItem(media_menu_handles[part], id, chk);
|
||||
}
|
||||
|
||||
|
||||
/* API (Settings) */
|
||||
void
|
||||
ui_sb_enable_menu_item(int tag, int id, int flg)
|
||||
{
|
||||
uint8_t part;
|
||||
|
||||
if (!sb_ready)
|
||||
return;
|
||||
|
||||
part = sb_map[tag];
|
||||
if ((part == 0xff) || (sb_menu_handles == NULL))
|
||||
return;
|
||||
|
||||
EnableMenuItem(sb_menu_handles[part], id, flg);
|
||||
EnableMenuItem(media_menu_handles[part], id, flg);
|
||||
}
|
||||
|
||||
|
||||
/* API */
|
||||
void
|
||||
ui_sb_set_text_w(wchar_t *wstr)
|
||||
|
||||
@@ -132,9 +132,9 @@ thread_destroy_event(event_t *arg)
|
||||
|
||||
|
||||
mutex_t *
|
||||
thread_create_mutex(wchar_t *name)
|
||||
thread_create_mutex(void)
|
||||
{
|
||||
return((mutex_t*)CreateMutex(NULL, FALSE, name));
|
||||
return((mutex_t*)CreateMutex(NULL, FALSE, NULL));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -312,7 +312,7 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
|
||||
case IDM_ACTION_HRESET:
|
||||
win_notify_dlg_open();
|
||||
i = ui_msgbox(MBX_QUESTION_YN, (wchar_t *)IDS_2121);
|
||||
i = ui_msgbox(MBX_QUESTION_YN, (wchar_t *)IDS_2112);
|
||||
if (i == 0)
|
||||
pc_reset(1);
|
||||
win_notify_dlg_closed();
|
||||
@@ -327,7 +327,7 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
if (no_quit_confirm)
|
||||
i = 0;
|
||||
else
|
||||
i = ui_msgbox(MBX_QUESTION_YN, (wchar_t *)IDS_2122);
|
||||
i = ui_msgbox(MBX_QUESTION_YN, (wchar_t *)IDS_2113);
|
||||
if (i == 0) {
|
||||
UnhookWindowsHookEx(hKeyboardHook);
|
||||
KillTimer(hwnd, TIMER_1SEC);
|
||||
@@ -595,7 +595,7 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
MediaMenuHandler(hwnd, message, wParam, lParam);
|
||||
media_menu_proc(hwnd, message, wParam, lParam);
|
||||
break;
|
||||
}
|
||||
return(0);
|
||||
@@ -695,7 +695,7 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
if (no_quit_confirm)
|
||||
i = 0;
|
||||
else
|
||||
i = ui_msgbox(MBX_QUESTION_YN, (wchar_t *)IDS_2122);
|
||||
i = ui_msgbox(MBX_QUESTION_YN, (wchar_t *)IDS_2113);
|
||||
if (i == 0) {
|
||||
UnhookWindowsHookEx(hKeyboardHook);
|
||||
KillTimer(hwnd, TIMER_1SEC);
|
||||
@@ -731,7 +731,7 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
if (manager_wm)
|
||||
break;
|
||||
win_notify_dlg_open();
|
||||
i = ui_msgbox(MBX_QUESTION_YN, (wchar_t *)IDS_2121);
|
||||
i = ui_msgbox(MBX_QUESTION_YN, (wchar_t *)IDS_2112);
|
||||
if (i == 0)
|
||||
pc_reset(1);
|
||||
win_notify_dlg_closed();
|
||||
@@ -744,7 +744,7 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
if (no_quit_confirm)
|
||||
i = 0;
|
||||
else
|
||||
i = ui_msgbox(MBX_QUESTION_YN, (wchar_t *)IDS_2122);
|
||||
i = ui_msgbox(MBX_QUESTION_YN, (wchar_t *)IDS_2113);
|
||||
if (i == 0) {
|
||||
UnhookWindowsHookEx(hKeyboardHook);
|
||||
KillTimer(hwnd, TIMER_1SEC);
|
||||
@@ -913,6 +913,7 @@ ui_init(int nCmdShow)
|
||||
|
||||
/* Reset all menus to their defaults. */
|
||||
ResetAllMenus();
|
||||
media_menu_init();
|
||||
|
||||
/* Make the window visible on the screen. */
|
||||
ShowWindow(hwnd, nCmdShow);
|
||||
@@ -925,7 +926,7 @@ ui_init(int nCmdShow)
|
||||
ridev.hwndTarget = NULL; /* current focus window */
|
||||
if (! RegisterRawInputDevices(&ridev, 1, sizeof(ridev))) {
|
||||
MessageBox(hwndMain,
|
||||
plat_get_string(IDS_2114),
|
||||
plat_get_string(IDS_2105),
|
||||
plat_get_string(IDS_2050),
|
||||
MB_OK | MB_ICONERROR);
|
||||
return(4);
|
||||
@@ -939,7 +940,7 @@ ui_init(int nCmdShow)
|
||||
haccel = LoadAccelerators(hinstance, ACCEL_NAME);
|
||||
if (haccel == NULL) {
|
||||
MessageBox(hwndMain,
|
||||
plat_get_string(IDS_2113),
|
||||
plat_get_string(IDS_2104),
|
||||
plat_get_string(IDS_2050),
|
||||
MB_OK | MB_ICONERROR);
|
||||
return(3);
|
||||
@@ -961,7 +962,7 @@ ui_init(int nCmdShow)
|
||||
* Before we can create the Render window, we first have
|
||||
* to prepare some other things that it depends on.
|
||||
*/
|
||||
ghMutex = CreateMutex(NULL, FALSE, L"86Box.BlitMutex");
|
||||
ghMutex = CreateMutex(NULL, FALSE, NULL);
|
||||
|
||||
/* Create the Machine Rendering window. */
|
||||
hwndRender = CreateWindow(L"STATIC", NULL, WS_CHILD|SS_BITMAP,
|
||||
@@ -981,7 +982,7 @@ ui_init(int nCmdShow)
|
||||
/* Initialize the configured Video API. */
|
||||
if (! plat_setvid(vid_api)) {
|
||||
MessageBox(hwnd,
|
||||
plat_get_string(IDS_2095),
|
||||
plat_get_string(IDS_2089),
|
||||
plat_get_string(IDS_2050),
|
||||
MB_OK | MB_ICONERROR);
|
||||
return(5);
|
||||
|
||||
Reference in New Issue
Block a user