2016-08-14 22:07:17 -04:00
|
|
|
/* Copyright holders: Sarah Walker
|
|
|
|
|
see COPYING for more details
|
|
|
|
|
*/
|
2016-06-26 00:34:39 +02:00
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <stdio.h>
|
2017-05-05 01:49:42 +02:00
|
|
|
#include "config.h"
|
2016-06-26 00:34:39 +02:00
|
|
|
#include "ibm.h"
|
|
|
|
|
#include "mem.h"
|
|
|
|
|
#include "rom.h"
|
|
|
|
|
|
2017-05-05 01:49:42 +02:00
|
|
|
|
2017-05-06 04:02:03 +02:00
|
|
|
FILE *romfopen(wchar_t *fn, wchar_t *mode)
|
2016-06-26 00:34:39 +02:00
|
|
|
{
|
2017-05-06 04:02:03 +02:00
|
|
|
wchar_t s[512];
|
|
|
|
|
wcscpy(s, pcempath);
|
|
|
|
|
put_backslash_w(s);
|
|
|
|
|
wcscat(s, fn);
|
|
|
|
|
return _wfopen(s, mode);
|
2016-06-26 00:34:39 +02:00
|
|
|
}
|
|
|
|
|
|
2017-05-05 01:49:42 +02:00
|
|
|
|
2017-05-06 04:02:03 +02:00
|
|
|
FILE *nvrfopen(wchar_t *fn, wchar_t *mode)
|
|
|
|
|
{
|
|
|
|
|
return _wfopen(nvr_concat(fn), mode);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int rom_present(wchar_t *fn)
|
2016-06-26 00:34:39 +02:00
|
|
|
{
|
|
|
|
|
FILE *f;
|
2017-05-06 04:02:03 +02:00
|
|
|
wchar_t s[512];
|
2016-06-26 00:34:39 +02:00
|
|
|
|
2017-05-06 04:02:03 +02:00
|
|
|
wcscpy(s, pcempath);
|
|
|
|
|
put_backslash_w(s);
|
|
|
|
|
wcscat(s, fn);
|
|
|
|
|
f = _wfopen(s, L"rb");
|
2016-06-26 00:34:39 +02:00
|
|
|
if (f)
|
|
|
|
|
{
|
|
|
|
|
fclose(f);
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-05 01:49:42 +02:00
|
|
|
|
2016-06-26 00:34:39 +02:00
|
|
|
static uint8_t rom_read(uint32_t addr, void *p)
|
|
|
|
|
{
|
|
|
|
|
rom_t *rom = (rom_t *)p;
|
2017-05-05 01:49:42 +02:00
|
|
|
#ifdef ROM_TRACE
|
|
|
|
|
if (rom->mapping.base==ROM_TRACE)
|
|
|
|
|
pclog("ROM: read byte from BIOS at %06lX\n", addr);
|
|
|
|
|
#endif
|
2016-06-26 00:34:39 +02:00
|
|
|
return rom->rom[addr & rom->mask];
|
|
|
|
|
}
|
2017-05-05 01:49:42 +02:00
|
|
|
|
|
|
|
|
|
2016-06-26 00:34:39 +02:00
|
|
|
uint16_t rom_readw(uint32_t addr, void *p)
|
|
|
|
|
{
|
|
|
|
|
rom_t *rom = (rom_t *)p;
|
2017-05-05 01:49:42 +02:00
|
|
|
#ifdef ROM_TRACE
|
|
|
|
|
if (rom->mapping.base==ROM_TRACE)
|
|
|
|
|
pclog("ROM: read word from BIOS at %06lX\n", addr);
|
|
|
|
|
#endif
|
2016-06-26 00:34:39 +02:00
|
|
|
return *(uint16_t *)&rom->rom[addr & rom->mask];
|
|
|
|
|
}
|
2017-05-05 01:49:42 +02:00
|
|
|
|
|
|
|
|
|
2016-06-26 00:34:39 +02:00
|
|
|
uint32_t rom_readl(uint32_t addr, void *p)
|
|
|
|
|
{
|
|
|
|
|
rom_t *rom = (rom_t *)p;
|
2017-05-05 01:49:42 +02:00
|
|
|
#ifdef ROM_TRACE
|
|
|
|
|
if (rom->mapping.base==ROM_TRACE)
|
|
|
|
|
pclog("ROM: read long from BIOS at %06lX\n", addr);
|
|
|
|
|
#endif
|
2016-06-26 00:34:39 +02:00
|
|
|
return *(uint32_t *)&rom->rom[addr & rom->mask];
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-05 01:49:42 +02:00
|
|
|
|
2017-05-06 04:02:03 +02:00
|
|
|
int rom_init(rom_t *rom, wchar_t *fn, uint32_t address, int size, int mask, int file_offset, uint32_t flags)
|
2016-06-26 00:34:39 +02:00
|
|
|
{
|
2017-05-06 04:02:03 +02:00
|
|
|
FILE *f = romfopen(fn, L"rb");
|
2016-06-26 00:34:39 +02:00
|
|
|
|
|
|
|
|
if (!f)
|
|
|
|
|
{
|
2017-05-06 04:02:03 +02:00
|
|
|
pclog("ROM image not found : %ws\n", fn);
|
2016-06-26 00:34:39 +02:00
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
rom->rom = malloc(size);
|
|
|
|
|
fseek(f, file_offset, SEEK_SET);
|
|
|
|
|
fread(rom->rom, size, 1, f);
|
|
|
|
|
fclose(f);
|
|
|
|
|
|
|
|
|
|
rom->mask = mask;
|
|
|
|
|
|
|
|
|
|
mem_mapping_add(&rom->mapping, address, size, rom_read,
|
|
|
|
|
rom_readw,
|
|
|
|
|
rom_readl,
|
|
|
|
|
mem_write_null,
|
|
|
|
|
mem_write_nullw,
|
|
|
|
|
mem_write_nulll,
|
|
|
|
|
rom->rom,
|
|
|
|
|
flags,
|
|
|
|
|
rom);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2017-05-05 01:49:42 +02:00
|
|
|
|
2017-05-06 04:02:03 +02:00
|
|
|
int rom_init_interleaved(rom_t *rom, wchar_t *fn_low, wchar_t *fn_high, uint32_t address, int size, int mask, int file_offset, uint32_t flags)
|
2016-06-26 00:34:39 +02:00
|
|
|
{
|
2017-05-06 04:02:03 +02:00
|
|
|
FILE *f_low = romfopen(fn_low, L"rb");
|
|
|
|
|
FILE *f_high = romfopen(fn_high, L"rb");
|
2016-06-26 00:34:39 +02:00
|
|
|
int c;
|
|
|
|
|
|
|
|
|
|
if (!f_low || !f_high)
|
|
|
|
|
{
|
|
|
|
|
if (!f_low)
|
2017-05-06 04:02:03 +02:00
|
|
|
pclog("ROM image not found : %ws\n", fn_low);
|
2016-06-26 00:34:39 +02:00
|
|
|
else
|
|
|
|
|
fclose(f_low);
|
|
|
|
|
if (!f_high)
|
2017-05-06 04:02:03 +02:00
|
|
|
pclog("ROM image not found : %ws\n", fn_high);
|
2016-06-26 00:34:39 +02:00
|
|
|
else
|
|
|
|
|
fclose(f_high);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
rom->rom = malloc(size);
|
|
|
|
|
fseek(f_low, file_offset, SEEK_SET);
|
|
|
|
|
fseek(f_high, file_offset, SEEK_SET);
|
|
|
|
|
for (c = 0; c < size; c += 2)
|
|
|
|
|
{
|
|
|
|
|
rom->rom[c] = getc(f_low);
|
|
|
|
|
rom->rom[c + 1] = getc(f_high);
|
|
|
|
|
}
|
|
|
|
|
fclose(f_high);
|
|
|
|
|
fclose(f_low);
|
|
|
|
|
|
|
|
|
|
rom->mask = mask;
|
|
|
|
|
|
|
|
|
|
mem_mapping_add(&rom->mapping, address, size, rom_read,
|
|
|
|
|
rom_readw,
|
|
|
|
|
rom_readl,
|
|
|
|
|
mem_write_null,
|
|
|
|
|
mem_write_nullw,
|
|
|
|
|
mem_write_nulll,
|
|
|
|
|
rom->rom,
|
|
|
|
|
flags,
|
|
|
|
|
rom);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|