2021-04-05 14:19:35 +01:00

223 lines
4.7 KiB
C

/*
* NewOswan
* tom.c:
* Based on the original Oswan-unix
* Copyright (c) 2014-2021 986-Studio. All rights reserved.
*
*/
//////////////////////////////////////////////////////////////////////////////
//
//
//
//
//
//
//////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include "log.h"
#include "rom.h"
////////////////////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////////////////////
//
//
//
//
//
//
//
////////////////////////////////////////////////////////////////////////////////
uint8_t *ws_rom_load(char *path, uint32_t *romSize)
{
int fd;
uint8_t *ret_ptr;
struct stat FileStat;
fd = open(path, O_RDWR);
fstat(fd, &FileStat);
*romSize = FileStat.st_size;
ret_ptr = (uint8_t *)mmap(NULL, FileStat.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
close(fd);
if (ret_ptr == MAP_FAILED)
{
ret_ptr = NULL;
*romSize = 0;
}
return ret_ptr;
}
////////////////////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////////////////////
//
//
//
//
//
//
//
////////////////////////////////////////////////////////////////////////////////
void ws_rom_dumpInfo(uint8_t *wsrom, uint32_t romSize)
{
ws_romHeaderStruct *romHeader = ws_rom_getHeader(wsrom, romSize);
fprintf(log_get(), "rom: developper Id 0x%.2x\n", romHeader->developperId);
fprintf(log_get(), "rom: cart Id 0x%.2x\n", romHeader->cartId);
fprintf(log_get(), "rom: minimum system %s\n",
(romHeader->minimumSupportSystem == 0) ? "Wonderswan mono" : "Wonderswan color");
fprintf(log_get(), "rom: size %i Mbits\n", (romSize >> 20) << 3);
fprintf(log_get(), "rom: eeprom ");
switch (romHeader->eepromSize & 0xf)
{
case WS_EEPROM_SIZE_NONE:
{
fprintf(log_get(), "none\n");
break;
}
case WS_EEPROM_SIZE_64k:
{
fprintf(log_get(), "64 kb\n");
break;
}
case WS_EEPROM_SIZE_256k:
{
fprintf(log_get(), "256 kb\n");
break;
}
}
fprintf(log_get(), "rom: sram ");
switch (romHeader->eepromSize & 0xf0)
{
case WS_SRAM_SIZE_NONE:
{
fprintf(log_get(), "none\n");
break;
}
case WS_SRAM_SIZE_1k:
{
fprintf(log_get(), "1 kb\n");
break;
}
case WS_SRAM_SIZE_16k:
{
fprintf(log_get(), "16 kb\n");
break;
}
case WS_SRAM_SIZE_8k:
{
fprintf(log_get(), "8 kn\n");
break;
}
}
fprintf(log_get(), "rom: rtc %s\n", (romHeader->realtimeClock) ? "Yes" : "None");
fprintf(log_get(), "checksum 0x%.4x\n", romHeader->checksum);
}
////////////////////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////////////////////
//
//
//
//
//
//
//
////////////////////////////////////////////////////////////////////////////////
ws_romHeaderStruct *ws_rom_getHeader(uint8_t *wsrom, uint32_t wsromSize)
{
ws_romHeaderStruct *wsromHeader = (ws_romHeaderStruct *)(wsrom + wsromSize - 10);
return (wsromHeader);
}
////////////////////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////////////////////
//
//
//
//
//
//
//
////////////////////////////////////////////////////////////////////////////////
uint32_t ws_rom_sramSize(uint8_t *wsrom, uint32_t wsromSize)
{
ws_romHeaderStruct *romHeader = ws_rom_getHeader(wsrom, wsromSize);
switch (romHeader->eepromSize & 0xf0)
{
case WS_SRAM_SIZE_NONE:
return (0);
case WS_SRAM_SIZE_1k:
return (0x400);
case WS_SRAM_SIZE_16k:
return (0x4000);
case WS_SRAM_SIZE_8k:
return (0x2000);
}
return (0);
}
////////////////////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////////////////////
//
//
//
//
//
//
//
////////////////////////////////////////////////////////////////////////////////
uint32_t ws_rom_eepromSize(uint8_t *wsrom, uint32_t wsromSize)
{
ws_romHeaderStruct *romHeader = ws_rom_getHeader(wsrom, wsromSize);
switch (romHeader->eepromSize & 0xf)
{
case WS_EEPROM_SIZE_NONE:
return (0);
case WS_EEPROM_SIZE_64k:
return (0x10000);
case WS_EEPROM_SIZE_256k:
return (0x40000);
}
return (0);
}