mirror of
https://github.com/Pecusx/libretro-atari800.git
synced 2026-05-20 22:33:22 +02:00
20d59afb3f
* Fix first run crashing on Xbox One. * Added savestate support. * Rewind works. Fixes issue #83 and possibly #49. * Added Disc Control menu. Supports Disks, Tapes and M3U files (issue #66). * Added in support for 5200 Super Carts. * Better support for 5200 controller. * Added Paddle support. * Converted Core Options menu to v2. * Moved some core options into submenus. * Added controller mappings for Ports 2-4. * Added options for Dual Stick and Swap Ports. Fixes issue #76. * Joystick/Console now controlled more easily with device type Atari Keyboard. * Added 4 Hi-Res Artifacting modes. Restart does something now. * When core option changed only reboot if necessary. Removed several hardcoded controller binds. Fixed issue #29. Joypad input ignored when virtual keyboard active. * SIO Acceleration now defaults to enabled. Fix for Bounty Bob (5200 & lift fix A800). * Added Atari 800 carts to autodetect DB. * Added more Carts to DB. * Fixed Drive Index not being reset on 'restart'. * Changed Atari Joystick default mappings to something more reasonable.
186 lines
5.6 KiB
C
186 lines
5.6 KiB
C
/****************************************************************************
|
|
* Caprice32 libretro port
|
|
*
|
|
* Copyright not6 - r-type (2015-2018)
|
|
* Copyright David Colmenero - D_Skywalk (2019-2021)
|
|
* Copyright Daniel De Matteis (2012-2021)
|
|
*
|
|
* Redistribution and use of this code or any derivative works are permitted
|
|
* provided that the following conditions are met:
|
|
*
|
|
* - Redistributions may not be sold, nor may they be used in a commercial
|
|
* product or activity.
|
|
*
|
|
* - Redistributions that are modified from the original source must include the
|
|
* complete source code, including the source code for all components used by a
|
|
* binary built from the modified sources. However, as a special exception, the
|
|
* source code distributed need not include anything that is normally distributed
|
|
* (in either source or binary form) with the major components (compiler, kernel,
|
|
* and so on) of the operating system on which the executable runs, unless that
|
|
* component itself accompanies the executable.
|
|
*
|
|
* - Redistributions must reproduce the above copyright notice, this list of
|
|
* conditions and the following disclaimer in the documentation and/or other
|
|
* materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*
|
|
****************************************************************************************/
|
|
|
|
|
|
#include <sys/stat.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
|
|
#include "retro_utils.h"
|
|
#ifdef VITA
|
|
#include "file/file_path.h"
|
|
#endif
|
|
|
|
extern uint8_t* pbGPBuffer;
|
|
|
|
// Verify file extension
|
|
bool file_check_extension(const char *filename, const size_t filename_size, const char *ext, const size_t ext_size)
|
|
{
|
|
#ifndef __PS3__
|
|
size_t file_len = strnlen(filename, filename_size);
|
|
size_t ext_len = strnlen(ext, ext_size);
|
|
#else
|
|
size_t file_len = strlen(filename) > filename_size ? filename_size : strlen(filename);
|
|
size_t ext_len = strlen(ext) > ext_size ? ext_size : strlen(ext);
|
|
#endif
|
|
|
|
if( ext_len > file_len || file_len >= filename_size - 1)
|
|
return false;
|
|
|
|
const char * file_ext = &filename[file_len - ext_len];
|
|
|
|
return (strncasecmp(file_ext, ext, filename_size) == 0);
|
|
}
|
|
|
|
bool file_check_flag(const char *filename, const size_t filename_size, const char *flag, const size_t flag_size)
|
|
{
|
|
#ifndef __PS3__
|
|
size_t file_len = strnlen(filename, filename_size);
|
|
size_t flag_len = strnlen(flag, flag_size);
|
|
#else
|
|
size_t file_len = strlen(filename) > filename_size ? filename_size : strlen(filename);
|
|
size_t flag_len = strlen(flag) > flag_size ? flag_size : strlen(flag);
|
|
#endif
|
|
|
|
for (int i = 0; i < file_len; i++) {
|
|
if (i + flag_len > file_len)
|
|
return false;
|
|
|
|
if (strncasecmp(&filename[i], flag, flag_len) == 0)
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// Verify if file exists
|
|
bool file_exists(const char *filename)
|
|
{
|
|
#ifdef VITA
|
|
if (path_is_valid(filename) && !path_is_directory(filename))
|
|
#else
|
|
struct stat buf;
|
|
if (stat(filename, &buf) == 0 &&
|
|
(buf.st_mode & (S_IRUSR|S_IWUSR)) && !(buf.st_mode & S_IFDIR))
|
|
#endif
|
|
{
|
|
/* file points to user readable regular file */
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
int file_size (int file_num)
|
|
{
|
|
struct stat s;
|
|
|
|
if (!fstat(file_num, &s)) {
|
|
return s.st_size;
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
void path_join(char* out, const char* basedir, const char* filename)
|
|
{
|
|
snprintf(out, RETRO_PATH_MAX, "%s%s%s", basedir, RETRO_PATH_SEPARATOR, filename);
|
|
}
|
|
|
|
char* path_join_dup(const char* basedir, const char* filename)
|
|
{
|
|
size_t dirlen = strlen(basedir);
|
|
size_t seplen = strlen(RETRO_PATH_SEPARATOR);
|
|
size_t filelen = strlen(filename);
|
|
char* result = (char*)malloc(dirlen + seplen + filelen + 1);
|
|
strcpy(result, basedir);
|
|
strcpy(result + dirlen, RETRO_PATH_SEPARATOR);
|
|
strcpy(result + dirlen + seplen, filename);
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* D_Skywalk: Imported from my 3DS pituka implementation
|
|
* http://david.dantoine.org/proyecto/26/
|
|
*/
|
|
|
|
#ifdef _3DS
|
|
void* linearMemAlign(size_t size, size_t alignment);
|
|
void linearFree(void* mem);
|
|
#endif
|
|
|
|
void *retro_malloc(size_t size) {
|
|
#ifdef _3DS
|
|
return linearMemAlign(size, 0x80);
|
|
#else
|
|
return malloc(size);
|
|
#endif
|
|
}
|
|
|
|
void retro_free(void * mem) {
|
|
#ifdef _3DS
|
|
linearFree(mem);
|
|
#else
|
|
free(mem);
|
|
#endif
|
|
}
|
|
|
|
// ----------------------------- crc32b --------------------------------
|
|
|
|
/* This is the basic CRC-32 calculation with some optimization but no
|
|
table lookup. The the byte reversal is avoided by shifting the crc reg
|
|
right instead of left and by using a reversed 32-bit word to represent
|
|
the polynomial. */
|
|
|
|
uint32_t crc32_calculate(uint8_t * data, uint32_t size) {
|
|
uint32_t byte, crc, mask;
|
|
|
|
crc = 0xFFFFFFFF;
|
|
|
|
for (int i = 0; i < size; i++) {
|
|
byte = data[i];
|
|
crc = crc ^ byte;
|
|
for (int j = 7; j >= 0; j--) {
|
|
mask = -(crc & 1);
|
|
crc = (crc >> 1) ^ (0xedb88320 & mask);
|
|
}
|
|
}
|
|
return ~crc;
|
|
}
|
|
|