mirror of
https://github.com/libretro/Genesis-Plus-GX.git
synced 2024-11-23 08:19:39 +00:00
Track Widescreen
This commit is contained in:
parent
5355eae2e1
commit
4da94dfe70
2
.github/workflows/crowdin_prep.yml
vendored
2
.github/workflows/crowdin_prep.yml
vendored
@ -33,4 +33,4 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
CROWDIN_API_KEY: ${{ secrets.CROWDIN_API_KEY }}
|
CROWDIN_API_KEY: ${{ secrets.CROWDIN_API_KEY }}
|
||||||
run: |
|
run: |
|
||||||
python3 intl/upload_workflow.py $CROWDIN_API_KEY "Genesis-Plus-GX" "libretro/libretro_core_options_intl.h"
|
python3 intl/upload_workflow.py $CROWDIN_API_KEY "Genesis-Plus-GX-Wide" "libretro/libretro_core_options_intl.h"
|
||||||
|
2
.github/workflows/crowdin_translate.yml
vendored
2
.github/workflows/crowdin_translate.yml
vendored
@ -32,7 +32,7 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
CROWDIN_API_KEY: ${{ secrets.CROWDIN_API_KEY }}
|
CROWDIN_API_KEY: ${{ secrets.CROWDIN_API_KEY }}
|
||||||
run: |
|
run: |
|
||||||
python3 intl/download_workflow.py $CROWDIN_API_KEY "Genesis-Plus-GX" "libretro/libretro_core_options_intl.h"
|
python3 intl/download_workflow.py $CROWDIN_API_KEY "Genesis-Plus-GX-Wide" "libretro/libretro_core_options_intl.h"
|
||||||
|
|
||||||
- name: Commit files
|
- name: Commit files
|
||||||
run: |
|
run: |
|
||||||
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -14,6 +14,7 @@ sdl/build_sdl2
|
|||||||
|
|
||||||
/libretro/msvc/msvc-2017/msvc-2017.vcxproj.user
|
/libretro/msvc/msvc-2017/msvc-2017.vcxproj.user
|
||||||
genesis_plus_gx_libretro.*
|
genesis_plus_gx_libretro.*
|
||||||
|
genesis_plus_gx_wide_libretro.*
|
||||||
|
|
||||||
*.o
|
*.o
|
||||||
*.a
|
*.a
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
.core-defs:
|
.core-defs:
|
||||||
variables:
|
variables:
|
||||||
JNI_PATH: libretro
|
JNI_PATH: libretro
|
||||||
CORENAME: genesis_plus_gx
|
CORENAME: genesis_plus_gx_wide
|
||||||
MAKEFILE: Makefile.libretro
|
MAKEFILE: Makefile.libretro
|
||||||
|
|
||||||
# Inclusion templates, required for the build to work
|
# Inclusion templates, required for the build to work
|
||||||
|
@ -67,7 +67,7 @@ else ifneq ($(findstring MINGW,$(shell uname -a)),)
|
|||||||
system_platform = win
|
system_platform = win
|
||||||
endif
|
endif
|
||||||
|
|
||||||
TARGET_NAME := genesis_plus_gx
|
TARGET_NAME := genesis_plus_gx_wide
|
||||||
|
|
||||||
LIBS := -lm
|
LIBS := -lm
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@ image: Visual Studio 2017
|
|||||||
environment:
|
environment:
|
||||||
makefile_location: "."
|
makefile_location: "."
|
||||||
makefile_name: makefile.libretro
|
makefile_name: makefile.libretro
|
||||||
target_name: genesis_plus_gx
|
target_name: genesis_plus_gx_wide
|
||||||
|
|
||||||
configuration:
|
configuration:
|
||||||
- release
|
- release
|
||||||
|
@ -422,6 +422,7 @@ void system_frame_gen(int do_skip)
|
|||||||
|
|
||||||
/* active screen width */
|
/* active screen width */
|
||||||
bitmap.viewport.w = 256 + ((reg[12] & 0x01) << 6);
|
bitmap.viewport.w = 256 + ((reg[12] & 0x01) << 6);
|
||||||
|
bitmap.viewport.w += config.h40_extra_columns * 8;
|
||||||
|
|
||||||
/* check viewport changes */
|
/* check viewport changes */
|
||||||
if (bitmap.viewport.h != bitmap.viewport.oh)
|
if (bitmap.viewport.h != bitmap.viewport.oh)
|
||||||
@ -765,6 +766,7 @@ void system_frame_scd(int do_skip)
|
|||||||
|
|
||||||
/* active screen width */
|
/* active screen width */
|
||||||
bitmap.viewport.w = 256 + ((reg[12] & 0x01) << 6);
|
bitmap.viewport.w = 256 + ((reg[12] & 0x01) << 6);
|
||||||
|
bitmap.viewport.w += config.h40_extra_columns * 8;
|
||||||
|
|
||||||
/* check viewport changes */
|
/* check viewport changes */
|
||||||
if (bitmap.viewport.h != bitmap.viewport.oh)
|
if (bitmap.viewport.h != bitmap.viewport.oh)
|
||||||
|
@ -741,9 +741,29 @@ void vdp_dma_update(unsigned int cycles)
|
|||||||
if (!dma_length)
|
if (!dma_length)
|
||||||
{
|
{
|
||||||
/* DMA source address registers are incremented during DMA (even DMA Fill) */
|
/* DMA source address registers are incremented during DMA (even DMA Fill) */
|
||||||
uint16 end = reg[21] + (reg[22] << 8) + reg[19] + (reg[20] << 8);
|
if (config.vdp_fix_dma_boundary_bug) {
|
||||||
reg[21] = end & 0xff;
|
/*
|
||||||
reg[22] = end >> 8;
|
* NOTICE: VDP has a hardware bug where DMA transfer source address is not incremented properly,
|
||||||
|
* causing the transfer to wrap around 128kb memory boundaries.
|
||||||
|
*
|
||||||
|
* Only the lower 2 bytes of source address are incremented (which are stored in VDP registers
|
||||||
|
* #21 and #22 respectively), while the higher bits are never changed (VDP register #23).
|
||||||
|
* This way, when the lower 2 bytes overflow upon increment, the transfer will wrap to the
|
||||||
|
* beginning of memory area represented by the higher bits.
|
||||||
|
*
|
||||||
|
* This fix updates Register #23 properly, so next target address is calculated correctly.
|
||||||
|
*/
|
||||||
|
const uint32 length = reg[19] + (reg[20] << 8);
|
||||||
|
const uint32 start = reg[21] + (reg[22] << 8) + ((uint32)(reg[23] & 0x3F) << 16);
|
||||||
|
const uint32 end = start + length;
|
||||||
|
reg[21] = end & 0xff;
|
||||||
|
reg[22] = (end >> 8) & 0xff;
|
||||||
|
reg[23] = (reg[23] & 0xC0) | ((end >> 16) & 0x3F);
|
||||||
|
} else {
|
||||||
|
uint16 end = reg[21] + (reg[22] << 8) + reg[19] + (reg[20] << 8);
|
||||||
|
reg[21] = end & 0xff;
|
||||||
|
reg[22] = end >> 8;
|
||||||
|
}
|
||||||
|
|
||||||
/* DMA length registers are decremented during DMA */
|
/* DMA length registers are decremented during DMA */
|
||||||
reg[19] = reg[20] = 0;
|
reg[19] = reg[20] = 0;
|
||||||
@ -2048,7 +2068,7 @@ static void vdp_reg_w(unsigned int r, unsigned int d, unsigned int cycles)
|
|||||||
window_clip(reg[17], 1);
|
window_clip(reg[17], 1);
|
||||||
|
|
||||||
/* Update max sprite pixels per line*/
|
/* Update max sprite pixels per line*/
|
||||||
max_sprite_pixels = 320;
|
max_sprite_pixels = 1024; // For widescreen, just set it to the max plane width
|
||||||
|
|
||||||
/* FIFO access slots timings */
|
/* FIFO access slots timings */
|
||||||
fifo_timing = (int *)fifo_timing_h40;
|
fifo_timing = (int *)fifo_timing_h40;
|
||||||
@ -3029,8 +3049,10 @@ static void vdp_dma_68k_ext(unsigned int length)
|
|||||||
/* Increment source address */
|
/* Increment source address */
|
||||||
source += 2;
|
source += 2;
|
||||||
|
|
||||||
/* 128k DMA window */
|
if (!config.vdp_fix_dma_boundary_bug) {
|
||||||
source = (reg[23] << 17) | (source & 0x1FFFF);
|
/* 128k DMA window */
|
||||||
|
source = (reg[23] << 17) | (source & 0x1FFFF);
|
||||||
|
}
|
||||||
|
|
||||||
/* Write data word to VRAM, CRAM or VSRAM */
|
/* Write data word to VRAM, CRAM or VSRAM */
|
||||||
vdp_bus_w(data);
|
vdp_bus_w(data);
|
||||||
|
@ -58,6 +58,10 @@ extern int8 reset_do_not_clear_buffers;
|
|||||||
extern md_ntsc_t *md_ntsc;
|
extern md_ntsc_t *md_ntsc;
|
||||||
extern sms_ntsc_t *sms_ntsc;
|
extern sms_ntsc_t *sms_ntsc;
|
||||||
|
|
||||||
|
#undef MAX
|
||||||
|
#undef MIN
|
||||||
|
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
|
||||||
|
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
|
||||||
|
|
||||||
/* Output pixels type*/
|
/* Output pixels type*/
|
||||||
#if defined(USE_8BPP_RENDERING)
|
#if defined(USE_8BPP_RENDERING)
|
||||||
@ -1512,37 +1516,52 @@ void render_bg_m4(int line)
|
|||||||
#ifndef ALT_RENDERER
|
#ifndef ALT_RENDERER
|
||||||
void render_bg_m5(int line)
|
void render_bg_m5(int line)
|
||||||
{
|
{
|
||||||
|
int start_real, end_real;
|
||||||
int column;
|
int column;
|
||||||
|
uint32 *nt;
|
||||||
|
uint32 yscroll, pf_col_mask, pf_row_mask, pf_shift;
|
||||||
uint32 atex, atbuf, *src, *dst;
|
uint32 atex, atbuf, *src, *dst;
|
||||||
|
int a, w, start, end;
|
||||||
/* Common data */
|
/* Common data */
|
||||||
|
uint32 shift, index, v_line;
|
||||||
uint32 xscroll = *(uint32 *)&vram[hscb + ((line & hscroll_mask) << 2)];
|
uint32 xscroll = *(uint32 *)&vram[hscb + ((line & hscroll_mask) << 2)];
|
||||||
uint32 yscroll = *(uint32 *)&vsram[0];
|
if (
|
||||||
uint32 pf_col_mask = playfield_col_mask;
|
(render_obj == render_obj_m5) ||
|
||||||
uint32 pf_row_mask = playfield_row_mask;
|
(render_obj == render_obj_m5_im2) ||
|
||||||
uint32 pf_shift = playfield_shift;
|
(render_obj == render_obj_m5_im2_ste) ||
|
||||||
|
(render_obj == render_obj_m5_ste)
|
||||||
|
) {
|
||||||
|
xscroll = (
|
||||||
|
((xscroll + config.h40_extra_columns * 4) & 0xFFFF) +
|
||||||
|
((xscroll + ((config.h40_extra_columns * 4) << 16)) & 0xFFFF0000)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
yscroll = *(uint32 *)&vsram[0];
|
||||||
|
pf_col_mask = playfield_col_mask;
|
||||||
|
pf_row_mask = playfield_row_mask;
|
||||||
|
pf_shift = playfield_shift;
|
||||||
|
|
||||||
/* Window & Plane A */
|
/* Window & Plane A */
|
||||||
int a = (reg[18] & 0x1F) << 3;
|
a = (reg[18] & 0x1F) << 3;
|
||||||
int w = (reg[18] >> 7) & 1;
|
w = (reg[18] >> 7) & 1;
|
||||||
|
|
||||||
/* Plane B width */
|
/* Plane B width */
|
||||||
int start = 0;
|
start = 0;
|
||||||
int end = bitmap.viewport.w >> 4;
|
end = bitmap.viewport.w >> 4;
|
||||||
|
|
||||||
/* Plane B scroll */
|
/* Plane B scroll */
|
||||||
#ifdef LSB_FIRST
|
#ifdef LSB_FIRST
|
||||||
uint32 shift = (xscroll >> 16) & 0x0F;
|
shift = (xscroll >> 16) & 0x0F;
|
||||||
uint32 index = pf_col_mask + 1 - ((xscroll >> 20) & pf_col_mask);
|
index = pf_col_mask + 1 - ((xscroll >> 20) & pf_col_mask);
|
||||||
uint32 v_line = (line + (yscroll >> 16)) & pf_row_mask;
|
v_line = (line + (yscroll >> 16)) & pf_row_mask;
|
||||||
#else
|
#else
|
||||||
uint32 shift = (xscroll & 0x0F);
|
shift = (xscroll & 0x0F);
|
||||||
uint32 index = pf_col_mask + 1 - ((xscroll >> 4) & pf_col_mask);
|
index = pf_col_mask + 1 - ((xscroll >> 4) & pf_col_mask);
|
||||||
uint32 v_line = (line + yscroll) & pf_row_mask;
|
v_line = (line + yscroll) & pf_row_mask;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Plane B name table */
|
/* Plane B name table */
|
||||||
uint32 *nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)];
|
nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)];
|
||||||
|
|
||||||
/* Pattern row index */
|
/* Pattern row index */
|
||||||
v_line = (v_line & 7) << 3;
|
v_line = (v_line & 7) << 3;
|
||||||
@ -1650,10 +1669,17 @@ void render_bg_m5(int line)
|
|||||||
/* Plane A line buffer */
|
/* Plane A line buffer */
|
||||||
dst = (uint32 *)&linebuf[1][0x20 + (start << 4)];
|
dst = (uint32 *)&linebuf[1][0x20 + (start << 4)];
|
||||||
|
|
||||||
|
start_real = start + (config.h40_extra_columns / 4);
|
||||||
|
end_real = end - (config.h40_extra_columns / 4);
|
||||||
|
|
||||||
for(column = start; column < end; column++)
|
for(column = start; column < end; column++)
|
||||||
{
|
{
|
||||||
atbuf = nt[column];
|
atbuf = nt[column - (config.h40_extra_columns / 4)];
|
||||||
DRAW_COLUMN(atbuf, v_line)
|
if ((column >= start_real) && (column < end_real)) {
|
||||||
|
DRAW_COLUMN(atbuf, v_line)
|
||||||
|
} else {
|
||||||
|
*dst++ = 0; *dst++ = 0; *dst++ = 0; *dst++ = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1664,32 +1690,47 @@ void render_bg_m5(int line)
|
|||||||
void render_bg_m5_vs(int line)
|
void render_bg_m5_vs(int line)
|
||||||
{
|
{
|
||||||
int column;
|
int column;
|
||||||
|
int start_real, end_real;
|
||||||
uint32 atex, atbuf, *src, *dst;
|
uint32 atex, atbuf, *src, *dst;
|
||||||
uint32 v_line, *nt;
|
uint32 v_line, *nt;
|
||||||
|
uint32 yscroll = 0, pf_col_mask, pf_row_mask, pf_shift;
|
||||||
|
uint32 *vs;
|
||||||
|
int a, w, start = 0, end;
|
||||||
|
uint32 shift, index;
|
||||||
/* Common data */
|
/* Common data */
|
||||||
uint32 xscroll = *(uint32 *)&vram[hscb + ((line & hscroll_mask) << 2)];
|
uint32 xscroll = *(uint32 *)&vram[hscb + ((line & hscroll_mask) << 2)];
|
||||||
uint32 yscroll = 0;
|
if (
|
||||||
uint32 pf_col_mask = playfield_col_mask;
|
(render_obj == render_obj_m5) ||
|
||||||
uint32 pf_row_mask = playfield_row_mask;
|
(render_obj == render_obj_m5_im2) ||
|
||||||
uint32 pf_shift = playfield_shift;
|
(render_obj == render_obj_m5_im2_ste) ||
|
||||||
uint32 *vs = (uint32 *)&vsram[0];
|
(render_obj == render_obj_m5_ste)
|
||||||
|
) {
|
||||||
|
xscroll = (
|
||||||
|
((xscroll + config.h40_extra_columns * 4) & 0xFFFF) +
|
||||||
|
((xscroll + ((config.h40_extra_columns * 4) << 16)) & 0xFFFF0000)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
pf_col_mask = playfield_col_mask;
|
||||||
|
pf_row_mask = playfield_row_mask;
|
||||||
|
pf_shift = playfield_shift;
|
||||||
|
vs = (uint32 *)&vsram[0];
|
||||||
|
|
||||||
/* Window & Plane A */
|
/* Window & Plane A */
|
||||||
int a = (reg[18] & 0x1F) << 3;
|
a = (reg[18] & 0x1F) << 3;
|
||||||
int w = (reg[18] >> 7) & 1;
|
w = (reg[18] >> 7) & 1;
|
||||||
|
|
||||||
/* Plane B width */
|
/* Plane B width */
|
||||||
int start = 0;
|
|
||||||
int end = bitmap.viewport.w >> 4;
|
end = bitmap.viewport.w >> 4;
|
||||||
|
|
||||||
/* Plane B horizontal scroll */
|
/* Plane B horizontal scroll */
|
||||||
#ifdef LSB_FIRST
|
#ifdef LSB_FIRST
|
||||||
uint32 shift = (xscroll >> 16) & 0x0F;
|
shift = (xscroll >> 16) & 0x0F;
|
||||||
uint32 index = pf_col_mask + 1 - ((xscroll >> 20) & pf_col_mask);
|
index = pf_col_mask + 1 - ((xscroll >> 20) & pf_col_mask);
|
||||||
#else
|
#else
|
||||||
uint32 shift = (xscroll & 0x0F);
|
shift = (xscroll & 0x0F);
|
||||||
uint32 index = pf_col_mask + 1 - ((xscroll >> 4) & pf_col_mask);
|
index = pf_col_mask + 1 - ((xscroll >> 4) & pf_col_mask);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Left-most column vertical scrolling when partially shown horizontally (verified on PAL MD2) */
|
/* Left-most column vertical scrolling when partially shown horizontally (verified on PAL MD2) */
|
||||||
@ -1726,11 +1767,13 @@ void render_bg_m5_vs(int line)
|
|||||||
|
|
||||||
for(column = 0; column < end; column++, index++)
|
for(column = 0; column < end; column++, index++)
|
||||||
{
|
{
|
||||||
|
int column_capped = column - (config.h40_extra_columns / 4);
|
||||||
|
column_capped = MAX(0, MIN(column_capped, 19));
|
||||||
/* Plane B vertical scroll */
|
/* Plane B vertical scroll */
|
||||||
#ifdef LSB_FIRST
|
#ifdef LSB_FIRST
|
||||||
v_line = (line + (vs[column] >> 16)) & pf_row_mask;
|
v_line = (line + (vs[column_capped] >> 16)) & pf_row_mask;
|
||||||
#else
|
#else
|
||||||
v_line = (line + vs[column]) & pf_row_mask;
|
v_line = (line + vs[column_capped]) & pf_row_mask;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Plane B name table */
|
/* Plane B name table */
|
||||||
@ -1806,11 +1849,14 @@ void render_bg_m5_vs(int line)
|
|||||||
|
|
||||||
for(column = start; column < end; column++, index++)
|
for(column = start; column < end; column++, index++)
|
||||||
{
|
{
|
||||||
|
int column_capped = column - (config.h40_extra_columns / 4);
|
||||||
|
column_capped = MAX(0, MIN(column_capped, 19));
|
||||||
|
|
||||||
/* Plane A vertical scroll */
|
/* Plane A vertical scroll */
|
||||||
#ifdef LSB_FIRST
|
#ifdef LSB_FIRST
|
||||||
v_line = (line + vs[column]) & pf_row_mask;
|
v_line = (line + vs[column_capped]) & pf_row_mask & pf_row_mask;
|
||||||
#else
|
#else
|
||||||
v_line = (line + (vs[column] >> 16)) & pf_row_mask;
|
v_line = (line + (vs[column_capped] >> 16)) & pf_row_mask & pf_row_mask;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Plane A name table */
|
/* Plane A name table */
|
||||||
@ -1840,10 +1886,17 @@ void render_bg_m5_vs(int line)
|
|||||||
/* Plane A line buffer */
|
/* Plane A line buffer */
|
||||||
dst = (uint32 *)&linebuf[1][0x20 + (start << 4)];
|
dst = (uint32 *)&linebuf[1][0x20 + (start << 4)];
|
||||||
|
|
||||||
|
start_real = start + (config.h40_extra_columns / 4);
|
||||||
|
end_real = end - (config.h40_extra_columns / 4);
|
||||||
|
|
||||||
for(column = start; column < end; column++)
|
for(column = start; column < end; column++)
|
||||||
{
|
{
|
||||||
atbuf = nt[column];
|
atbuf = nt[column - (config.h40_extra_columns / 4)];
|
||||||
DRAW_COLUMN(atbuf, v_line)
|
if ((column >= start_real) && (column < end_real)) {
|
||||||
|
DRAW_COLUMN(atbuf, v_line)
|
||||||
|
} else {
|
||||||
|
*dst++ = 0; *dst++ = 0; *dst++ = 0; *dst++ = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1854,36 +1907,48 @@ void render_bg_m5_vs(int line)
|
|||||||
/* Enhanced function that allows each cell to be vscrolled individually, instead of being limited to 2-cell */
|
/* Enhanced function that allows each cell to be vscrolled individually, instead of being limited to 2-cell */
|
||||||
void render_bg_m5_vs_enhanced(int line)
|
void render_bg_m5_vs_enhanced(int line)
|
||||||
{
|
{
|
||||||
int column;
|
int column, v_offset;
|
||||||
|
int start_real, end_real;
|
||||||
uint32 atex, atbuf, *src, *dst;
|
uint32 atex, atbuf, *src, *dst;
|
||||||
uint32 v_line, next_v_line, *nt;
|
uint32 v_line, next_v_line, *nt;
|
||||||
|
uint32 yscroll = 0, pf_col_mask, pf_row_mask, pf_shift;
|
||||||
/* Vertical scroll offset */
|
uint32 *vs;
|
||||||
int v_offset = 0;
|
int a, w, start = 0, end;
|
||||||
|
uint32 shift, index;
|
||||||
/* Common data */
|
/* Common data */
|
||||||
uint32 xscroll = *(uint32 *)&vram[hscb + ((line & hscroll_mask) << 2)];
|
uint32 xscroll = *(uint32 *)&vram[hscb + ((line & hscroll_mask) << 2)];
|
||||||
uint32 yscroll = 0;
|
if (
|
||||||
uint32 pf_col_mask = playfield_col_mask;
|
(render_obj == render_obj_m5) ||
|
||||||
uint32 pf_row_mask = playfield_row_mask;
|
(render_obj == render_obj_m5_im2) ||
|
||||||
uint32 pf_shift = playfield_shift;
|
(render_obj == render_obj_m5_im2_ste) ||
|
||||||
uint32 *vs = (uint32 *)&vsram[0];
|
(render_obj == render_obj_m5_ste)
|
||||||
|
) {
|
||||||
|
xscroll = (
|
||||||
|
((xscroll + config.h40_extra_columns * 4) & 0xFFFF) +
|
||||||
|
((xscroll + ((config.h40_extra_columns * 4) << 16)) & 0xFFFF0000)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
pf_col_mask = playfield_col_mask;
|
||||||
|
pf_row_mask = playfield_row_mask;
|
||||||
|
pf_shift = playfield_shift;
|
||||||
|
vs = (uint32 *)&vsram[0];
|
||||||
|
|
||||||
/* Window & Plane A */
|
/* Window & Plane A */
|
||||||
int a = (reg[18] & 0x1F) << 3;
|
a = (reg[18] & 0x1F) << 3;
|
||||||
int w = (reg[18] >> 7) & 1;
|
w = (reg[18] >> 7) & 1;
|
||||||
|
|
||||||
/* Plane B width */
|
/* Plane B width */
|
||||||
int start = 0;
|
|
||||||
int end = bitmap.viewport.w >> 4;
|
end = bitmap.viewport.w >> 4;
|
||||||
|
|
||||||
/* Plane B horizontal scroll */
|
/* Plane B horizontal scroll */
|
||||||
#ifdef LSB_FIRST
|
#ifdef LSB_FIRST
|
||||||
uint32 shift = (xscroll >> 16) & 0x0F;
|
shift = (xscroll >> 16) & 0x0F;
|
||||||
uint32 index = pf_col_mask + 1 - ((xscroll >> 20) & pf_col_mask);
|
index = pf_col_mask + 1 - ((xscroll >> 20) & pf_col_mask);
|
||||||
#else
|
#else
|
||||||
uint32 shift = (xscroll & 0x0F);
|
shift = (xscroll & 0x0F);
|
||||||
uint32 index = pf_col_mask + 1 - ((xscroll >> 4) & pf_col_mask);
|
index = pf_col_mask + 1 - ((xscroll >> 4) & pf_col_mask);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Left-most column vertical scrolling when partially shown horizontally (verified on PAL MD2) */
|
/* Left-most column vertical scrolling when partially shown horizontally (verified on PAL MD2) */
|
||||||
@ -1920,22 +1985,27 @@ void render_bg_m5_vs_enhanced(int line)
|
|||||||
|
|
||||||
for(column = 0; column < end; column++, index++)
|
for(column = 0; column < end; column++, index++)
|
||||||
{
|
{
|
||||||
|
int column_capped = column - (config.h40_extra_columns / 4);
|
||||||
|
column_capped = MAX(0, MIN(column_capped, 19));
|
||||||
/* Plane B vertical scroll */
|
/* Plane B vertical scroll */
|
||||||
#ifdef LSB_FIRST
|
#ifdef LSB_FIRST
|
||||||
v_line = (line + (vs[column] >> 16)) & pf_row_mask;
|
v_line = (line + (vs[column_capped] >> 16)) & pf_row_mask;
|
||||||
next_v_line = (line + (vs[column + 1] >> 16)) & pf_row_mask;
|
next_v_line = (line + (vs[column_capped + 1] >> 16)) & pf_row_mask;
|
||||||
#else
|
#else
|
||||||
v_line = (line + vs[column]) & pf_row_mask;
|
v_line = (line + vs[column_capped]) & pf_row_mask;
|
||||||
next_v_line = (line + vs[column + 1]) & pf_row_mask;
|
next_v_line = (line + vs[column_capped + 1]) & pf_row_mask;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (column != end - 1)
|
if (column >= (config.h40_extra_columns / 4) && column < (config.h40_extra_columns / 4) + 19)
|
||||||
{
|
{
|
||||||
/* The offset of the intermediary cell is an average of the offsets of the current 2-cell and the next 2-cell. */
|
/* The offset of the intermediary cell is an average of the offsets of the current 2-cell and the next 2-cell. */
|
||||||
/* For the last column, the previously calculated offset is used */
|
|
||||||
v_offset = ((int)next_v_line - (int)v_line) / 2;
|
v_offset = ((int)next_v_line - (int)v_line) / 2;
|
||||||
v_offset = (abs(v_offset) >= config.enhanced_vscroll_limit) ? 0 : v_offset;
|
v_offset = (abs(v_offset) >= config.enhanced_vscroll_limit) ? 0 : v_offset;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
v_offset = 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Plane B name table */
|
/* Plane B name table */
|
||||||
nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)];
|
nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)];
|
||||||
@ -1961,9 +2031,9 @@ void render_bg_m5_vs_enhanced(int line)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef LSB_FIRST
|
#ifdef LSB_FIRST
|
||||||
v_line = (line + v_offset + (vs[column] >> 16)) & pf_row_mask;
|
v_line = (line + v_offset + (vs[column_capped] >> 16)) & pf_row_mask;
|
||||||
#else
|
#else
|
||||||
v_line = (line + v_offset + vs[column]) & pf_row_mask;
|
v_line = (line + v_offset + vs[column_capped]) & pf_row_mask;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)];
|
nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)];
|
||||||
@ -2049,20 +2119,26 @@ void render_bg_m5_vs_enhanced(int line)
|
|||||||
|
|
||||||
for(column = start; column < end; column++, index++)
|
for(column = start; column < end; column++, index++)
|
||||||
{
|
{
|
||||||
|
int column_capped = column - (config.h40_extra_columns / 4);
|
||||||
|
column_capped = MAX(0, MIN(column_capped, 19));
|
||||||
|
|
||||||
/* Plane A vertical scroll */
|
/* Plane A vertical scroll */
|
||||||
#ifdef LSB_FIRST
|
#ifdef LSB_FIRST
|
||||||
v_line = (line + vs[column]) & pf_row_mask;
|
v_line = (line + vs[column_capped]) & pf_row_mask & pf_row_mask;
|
||||||
next_v_line = (line + vs[column + 1]) & pf_row_mask;
|
next_v_line = (line + vs[column_capped + 1]) & pf_row_mask;
|
||||||
#else
|
#else
|
||||||
v_line = (line + (vs[column] >> 16)) & pf_row_mask;
|
v_line = (line + (vs[column_capped] >> 16)) & pf_row_mask & pf_row_mask;
|
||||||
next_v_line = (line + (vs[column + 1] >> 16)) & pf_row_mask;
|
next_v_line = (line + (vs[column_capped + 1] >> 16)) & pf_row_mask;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (column != end - 1)
|
if (column >= (config.h40_extra_columns / 4) && column < (config.h40_extra_columns / 4) + 19)
|
||||||
{
|
{
|
||||||
v_offset = ((int)next_v_line - (int)v_line) / 2;
|
v_offset = ((int)next_v_line - (int)v_line) / 2;
|
||||||
v_offset = (abs(v_offset) >= config.enhanced_vscroll_limit) ? 0 : v_offset;
|
v_offset = (abs(v_offset) >= config.enhanced_vscroll_limit) ? 0 : v_offset;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
v_offset = 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Plane A name table */
|
/* Plane A name table */
|
||||||
nt = (uint32 *)&vram[ntab + (((v_line >> 3) << pf_shift) & 0x1FC0)];
|
nt = (uint32 *)&vram[ntab + (((v_line >> 3) << pf_shift) & 0x1FC0)];
|
||||||
@ -2129,10 +2205,17 @@ void render_bg_m5_vs_enhanced(int line)
|
|||||||
/* Plane A line buffer */
|
/* Plane A line buffer */
|
||||||
dst = (uint32 *)&linebuf[1][0x20 + (start << 4)];
|
dst = (uint32 *)&linebuf[1][0x20 + (start << 4)];
|
||||||
|
|
||||||
|
start_real = start + (config.h40_extra_columns / 4);
|
||||||
|
end_real = end - (config.h40_extra_columns / 4);
|
||||||
|
|
||||||
for(column = start; column < end; column++)
|
for(column = start; column < end; column++)
|
||||||
{
|
{
|
||||||
atbuf = nt[column];
|
atbuf = nt[column - (config.h40_extra_columns / 4)];
|
||||||
DRAW_COLUMN(atbuf, v_line)
|
if ((column >= start_real) && (column < end_real)) {
|
||||||
|
DRAW_COLUMN(atbuf, v_line)
|
||||||
|
} else {
|
||||||
|
*dst++ = 0; *dst++ = 0; *dst++ = 0; *dst++ = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2142,38 +2225,54 @@ void render_bg_m5_vs_enhanced(int line)
|
|||||||
|
|
||||||
void render_bg_m5_im2(int line)
|
void render_bg_m5_im2(int line)
|
||||||
{
|
{
|
||||||
|
int start_real, end_real;
|
||||||
int column;
|
int column;
|
||||||
|
uint32 *nt;
|
||||||
uint32 atex, atbuf, *src, *dst;
|
uint32 atex, atbuf, *src, *dst;
|
||||||
|
uint32 yscroll, pf_col_mask, pf_row_mask;
|
||||||
|
uint32 pf_shift;
|
||||||
|
int a, w, start = 0, end;
|
||||||
/* Common data */
|
/* Common data */
|
||||||
int odd = odd_frame;
|
int odd = odd_frame;
|
||||||
|
uint32 shift, index, v_line;
|
||||||
uint32 xscroll = *(uint32 *)&vram[hscb + ((line & hscroll_mask) << 2)];
|
uint32 xscroll = *(uint32 *)&vram[hscb + ((line & hscroll_mask) << 2)];
|
||||||
uint32 yscroll = *(uint32 *)&vsram[0];
|
if (
|
||||||
uint32 pf_col_mask = playfield_col_mask;
|
(render_obj == render_obj_m5) ||
|
||||||
uint32 pf_row_mask = playfield_row_mask;
|
(render_obj == render_obj_m5_im2) ||
|
||||||
uint32 pf_shift = playfield_shift;
|
(render_obj == render_obj_m5_im2_ste) ||
|
||||||
|
(render_obj == render_obj_m5_ste)
|
||||||
|
) {
|
||||||
|
xscroll = (
|
||||||
|
((xscroll + config.h40_extra_columns * 4) & 0xFFFF) +
|
||||||
|
((xscroll + ((config.h40_extra_columns * 4) << 16)) & 0xFFFF0000)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
yscroll = *(uint32 *)&vsram[0];
|
||||||
|
pf_col_mask = playfield_col_mask;
|
||||||
|
pf_row_mask = playfield_row_mask;
|
||||||
|
pf_shift = playfield_shift;
|
||||||
|
|
||||||
/* Window & Plane A */
|
/* Window & Plane A */
|
||||||
int a = (reg[18] & 0x1F) << 3;
|
a = (reg[18] & 0x1F) << 3;
|
||||||
int w = (reg[18] >> 7) & 1;
|
w = (reg[18] >> 7) & 1;
|
||||||
|
|
||||||
/* Plane B width */
|
/* Plane B width */
|
||||||
int start = 0;
|
|
||||||
int end = bitmap.viewport.w >> 4;
|
end = bitmap.viewport.w >> 4;
|
||||||
|
|
||||||
/* Plane B scroll */
|
/* Plane B scroll */
|
||||||
#ifdef LSB_FIRST
|
#ifdef LSB_FIRST
|
||||||
uint32 shift = (xscroll >> 16) & 0x0F;
|
shift = (xscroll >> 16) & 0x0F;
|
||||||
uint32 index = pf_col_mask + 1 - ((xscroll >> 20) & pf_col_mask);
|
index = pf_col_mask + 1 - ((xscroll >> 20) & pf_col_mask);
|
||||||
uint32 v_line = (line + (yscroll >> 17)) & pf_row_mask;
|
v_line = (line + (yscroll >> 17)) & pf_row_mask;
|
||||||
#else
|
#else
|
||||||
uint32 shift = (xscroll & 0x0F);
|
shift = (xscroll & 0x0F);
|
||||||
uint32 index = pf_col_mask + 1 - ((xscroll >> 4) & pf_col_mask);
|
index = pf_col_mask + 1 - ((xscroll >> 4) & pf_col_mask);
|
||||||
uint32 v_line = (line + (yscroll >> 1)) & pf_row_mask;
|
v_line = (line + (yscroll >> 1)) & pf_row_mask;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Plane B name table */
|
/* Plane B name table */
|
||||||
uint32 *nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)];
|
nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)];
|
||||||
|
|
||||||
/* Pattern row index */
|
/* Pattern row index */
|
||||||
v_line = (((v_line & 7) << 1) | odd) << 3;
|
v_line = (((v_line & 7) << 1) | odd) << 3;
|
||||||
@ -2281,10 +2380,17 @@ void render_bg_m5_im2(int line)
|
|||||||
/* Plane A line buffer */
|
/* Plane A line buffer */
|
||||||
dst = (uint32 *)&linebuf[1][0x20 + (start << 4)];
|
dst = (uint32 *)&linebuf[1][0x20 + (start << 4)];
|
||||||
|
|
||||||
|
start_real = start + (config.h40_extra_columns / 4);
|
||||||
|
end_real = end - (config.h40_extra_columns / 4);
|
||||||
|
|
||||||
for(column = start; column < end; column++)
|
for(column = start; column < end; column++)
|
||||||
{
|
{
|
||||||
atbuf = nt[column];
|
atbuf = nt[column - (config.h40_extra_columns / 4)];
|
||||||
DRAW_COLUMN_IM2(atbuf, v_line)
|
if ((column >= start_real) && (column < end_real)) {
|
||||||
|
DRAW_COLUMN_IM2(atbuf, v_line)
|
||||||
|
} else {
|
||||||
|
*dst++ = 0; *dst++ = 0; *dst++ = 0; *dst++ = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2294,34 +2400,48 @@ void render_bg_m5_im2(int line)
|
|||||||
|
|
||||||
void render_bg_m5_im2_vs(int line)
|
void render_bg_m5_im2_vs(int line)
|
||||||
{
|
{
|
||||||
|
int start_real, end_real;
|
||||||
|
uint32 shift, index;
|
||||||
|
int a, w, start = 0, end;
|
||||||
int column;
|
int column;
|
||||||
uint32 atex, atbuf, *src, *dst;
|
uint32 atex, atbuf, *src, *dst;
|
||||||
uint32 v_line, *nt;
|
uint32 v_line, *nt;
|
||||||
|
uint32 yscroll = 0, pf_col_mask, pf_row_mask;
|
||||||
|
uint32 pf_shift, *vs;
|
||||||
/* Common data */
|
/* Common data */
|
||||||
int odd = odd_frame;
|
int odd = odd_frame;
|
||||||
uint32 xscroll = *(uint32 *)&vram[hscb + ((line & hscroll_mask) << 2)];
|
uint32 xscroll = *(uint32 *)&vram[hscb + ((line & hscroll_mask) << 2)];
|
||||||
uint32 yscroll = 0;
|
if (
|
||||||
uint32 pf_col_mask = playfield_col_mask;
|
(render_obj == render_obj_m5) ||
|
||||||
uint32 pf_row_mask = playfield_row_mask;
|
(render_obj == render_obj_m5_im2) ||
|
||||||
uint32 pf_shift = playfield_shift;
|
(render_obj == render_obj_m5_im2_ste) ||
|
||||||
uint32 *vs = (uint32 *)&vsram[0];
|
(render_obj == render_obj_m5_ste)
|
||||||
|
) {
|
||||||
|
xscroll = (
|
||||||
|
((xscroll + config.h40_extra_columns * 4) & 0xFFFF) +
|
||||||
|
((xscroll + ((config.h40_extra_columns * 4) << 16)) & 0xFFFF0000)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
pf_col_mask = playfield_col_mask;
|
||||||
|
pf_row_mask = playfield_row_mask;
|
||||||
|
pf_shift = playfield_shift;
|
||||||
|
vs = (uint32 *)&vsram[0];
|
||||||
|
|
||||||
/* Window & Plane A */
|
/* Window & Plane A */
|
||||||
int a = (reg[18] & 0x1F) << 3;
|
a = (reg[18] & 0x1F) << 3;
|
||||||
int w = (reg[18] >> 7) & 1;
|
w = (reg[18] >> 7) & 1;
|
||||||
|
|
||||||
/* Plane B width */
|
/* Plane B width */
|
||||||
int start = 0;
|
|
||||||
int end = bitmap.viewport.w >> 4;
|
end = bitmap.viewport.w >> 4;
|
||||||
|
|
||||||
/* Plane B horizontal scroll */
|
/* Plane B horizontal scroll */
|
||||||
#ifdef LSB_FIRST
|
#ifdef LSB_FIRST
|
||||||
uint32 shift = (xscroll >> 16) & 0x0F;
|
shift = (xscroll >> 16) & 0x0F;
|
||||||
uint32 index = pf_col_mask + 1 - ((xscroll >> 20) & pf_col_mask);
|
index = pf_col_mask + 1 - ((xscroll >> 20) & pf_col_mask);
|
||||||
#else
|
#else
|
||||||
uint32 shift = (xscroll & 0x0F);
|
shift = (xscroll & 0x0F);
|
||||||
uint32 index = pf_col_mask + 1 - ((xscroll >> 4) & pf_col_mask);
|
index = pf_col_mask + 1 - ((xscroll >> 4) & pf_col_mask);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Left-most column vertical scrolling when partially shown horizontally (verified on PAL MD2) */
|
/* Left-most column vertical scrolling when partially shown horizontally (verified on PAL MD2) */
|
||||||
@ -2358,11 +2478,13 @@ void render_bg_m5_im2_vs(int line)
|
|||||||
|
|
||||||
for(column = 0; column < end; column++, index++)
|
for(column = 0; column < end; column++, index++)
|
||||||
{
|
{
|
||||||
|
int column_capped = column - (config.h40_extra_columns / 4);
|
||||||
|
column_capped = MAX(0, MIN(column_capped, 19));
|
||||||
/* Plane B vertical scroll */
|
/* Plane B vertical scroll */
|
||||||
#ifdef LSB_FIRST
|
#ifdef LSB_FIRST
|
||||||
v_line = (line + (vs[column] >> 17)) & pf_row_mask;
|
v_line = (line + (vs[column_capped] >> 17)) & pf_row_mask;
|
||||||
#else
|
#else
|
||||||
v_line = (line + (vs[column] >> 1)) & pf_row_mask;
|
v_line = (line + (vs[column_capped] >> 1)) & pf_row_mask;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Plane B name table */
|
/* Plane B name table */
|
||||||
@ -2438,11 +2560,13 @@ void render_bg_m5_im2_vs(int line)
|
|||||||
|
|
||||||
for(column = start; column < end; column++, index++)
|
for(column = start; column < end; column++, index++)
|
||||||
{
|
{
|
||||||
|
int column_capped = column - (config.h40_extra_columns / 4);
|
||||||
|
column_capped = MAX(0, MIN(column_capped, 19));
|
||||||
/* Plane A vertical scroll */
|
/* Plane A vertical scroll */
|
||||||
#ifdef LSB_FIRST
|
#ifdef LSB_FIRST
|
||||||
v_line = (line + (vs[column] >> 1)) & pf_row_mask;
|
v_line = (line + (vs[column_capped] >> 1)) & pf_row_mask;
|
||||||
#else
|
#else
|
||||||
v_line = (line + (vs[column] >> 17)) & pf_row_mask;
|
v_line = (line + (vs[column_capped] >> 17)) & pf_row_mask;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Plane A name table */
|
/* Plane A name table */
|
||||||
@ -2472,10 +2596,17 @@ void render_bg_m5_im2_vs(int line)
|
|||||||
/* Plane A line buffer */
|
/* Plane A line buffer */
|
||||||
dst = (uint32 *)&linebuf[1][0x20 + (start << 4)];
|
dst = (uint32 *)&linebuf[1][0x20 + (start << 4)];
|
||||||
|
|
||||||
|
start_real = start + (config.h40_extra_columns / 4);
|
||||||
|
end_real = end - (config.h40_extra_columns / 4);
|
||||||
|
|
||||||
for(column = start; column < end; column++)
|
for(column = start; column < end; column++)
|
||||||
{
|
{
|
||||||
atbuf = nt[column];
|
atbuf = nt[column - (config.h40_extra_columns / 4)];
|
||||||
DRAW_COLUMN_IM2(atbuf, v_line)
|
if ((column >= start_real) && (column < end_real)) {
|
||||||
|
DRAW_COLUMN_IM2(atbuf, v_line)
|
||||||
|
} else {
|
||||||
|
*dst++ = 0; *dst++ = 0; *dst++ = 0; *dst++ = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2494,6 +2625,17 @@ void render_bg_m5(int line)
|
|||||||
|
|
||||||
/* Scroll Planes common data */
|
/* Scroll Planes common data */
|
||||||
uint32 xscroll = *(uint32 *)&vram[hscb + ((line & hscroll_mask) << 2)];
|
uint32 xscroll = *(uint32 *)&vram[hscb + ((line & hscroll_mask) << 2)];
|
||||||
|
if (
|
||||||
|
(render_obj == render_obj_m5) ||
|
||||||
|
(render_obj == render_obj_m5_im2) ||
|
||||||
|
(render_obj == render_obj_m5_im2_ste) ||
|
||||||
|
(render_obj == render_obj_m5_ste)
|
||||||
|
) {
|
||||||
|
xscroll = (
|
||||||
|
((xscroll + config.h40_extra_columns * 4) & 0xFFFF) +
|
||||||
|
((xscroll + ((config.h40_extra_columns * 4) << 16)) & 0xFFFF0000)
|
||||||
|
);
|
||||||
|
}
|
||||||
uint32 yscroll = *(uint32 *)&vsram[0];
|
uint32 yscroll = *(uint32 *)&vsram[0];
|
||||||
uint32 pf_col_mask = playfield_col_mask;
|
uint32 pf_col_mask = playfield_col_mask;
|
||||||
uint32 pf_row_mask = playfield_row_mask;
|
uint32 pf_row_mask = playfield_row_mask;
|
||||||
@ -2599,10 +2741,17 @@ void render_bg_m5(int line)
|
|||||||
/* Pattern row index */
|
/* Pattern row index */
|
||||||
v_line = (line & 7) << 3;
|
v_line = (line & 7) << 3;
|
||||||
|
|
||||||
|
int start_real = start + (config.h40_extra_columns / 4);
|
||||||
|
int end_real = end - (config.h40_extra_columns / 4);
|
||||||
|
|
||||||
for(column = start; column < end; column++)
|
for(column = start; column < end; column++)
|
||||||
{
|
{
|
||||||
atbuf = nt[column];
|
atbuf = nt[column - (config.h40_extra_columns / 4)];
|
||||||
DRAW_COLUMN(atbuf, v_line)
|
if ((column >= start_real) && (column < end_real)) {
|
||||||
|
DRAW_COLUMN(atbuf, v_line)
|
||||||
|
} else {
|
||||||
|
*dst++ = 0; *dst++ = 0; *dst++ = 0; *dst++ = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2651,6 +2800,17 @@ void render_bg_m5_vs(int line)
|
|||||||
|
|
||||||
/* Scroll Planes common data */
|
/* Scroll Planes common data */
|
||||||
uint32 xscroll = *(uint32 *)&vram[hscb + ((line & hscroll_mask) << 2)];
|
uint32 xscroll = *(uint32 *)&vram[hscb + ((line & hscroll_mask) << 2)];
|
||||||
|
if (
|
||||||
|
(render_obj == render_obj_m5) ||
|
||||||
|
(render_obj == render_obj_m5_im2) ||
|
||||||
|
(render_obj == render_obj_m5_im2_ste) ||
|
||||||
|
(render_obj == render_obj_m5_ste)
|
||||||
|
) {
|
||||||
|
xscroll = (
|
||||||
|
((xscroll + config.h40_extra_columns * 4) & 0xFFFF) +
|
||||||
|
((xscroll + ((config.h40_extra_columns * 4) << 16)) & 0xFFFF0000)
|
||||||
|
);
|
||||||
|
}
|
||||||
uint32 yscroll = 0;
|
uint32 yscroll = 0;
|
||||||
uint32 pf_col_mask = playfield_col_mask;
|
uint32 pf_col_mask = playfield_col_mask;
|
||||||
uint32 pf_row_mask = playfield_row_mask;
|
uint32 pf_row_mask = playfield_row_mask;
|
||||||
@ -2739,11 +2899,13 @@ void render_bg_m5_vs(int line)
|
|||||||
|
|
||||||
for(column = start; column < end; column++, index++)
|
for(column = start; column < end; column++, index++)
|
||||||
{
|
{
|
||||||
|
int column_capped = column - (config.h40_extra_columns / 4);
|
||||||
|
column_capped = MAX(0, MIN(column_capped, 19));
|
||||||
/* Plane A vertical scroll */
|
/* Plane A vertical scroll */
|
||||||
#ifdef LSB_FIRST
|
#ifdef LSB_FIRST
|
||||||
v_line = (line + vs[column]) & pf_row_mask;
|
v_line = (line + vs[column_capped]) & pf_row_mask;
|
||||||
#else
|
#else
|
||||||
v_line = (line + (vs[column] >> 16)) & pf_row_mask;
|
v_line = (line + (vs[column_capped] >> 16)) & pf_row_mask;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Plane A name table */
|
/* Plane A name table */
|
||||||
@ -2779,10 +2941,17 @@ void render_bg_m5_vs(int line)
|
|||||||
/* Pattern row index */
|
/* Pattern row index */
|
||||||
v_line = (line & 7) << 3;
|
v_line = (line & 7) << 3;
|
||||||
|
|
||||||
|
int start_real = start + (config.h40_extra_columns / 4);
|
||||||
|
int end_real = end - (config.h40_extra_columns / 4);
|
||||||
|
|
||||||
for(column = start; column < end; column++)
|
for(column = start; column < end; column++)
|
||||||
{
|
{
|
||||||
atbuf = nt[column];
|
atbuf = nt[column - (config.h40_extra_columns / 4)];
|
||||||
DRAW_COLUMN(atbuf, v_line)
|
if ((column >= start_real) && (column < end_real)) {
|
||||||
|
DRAW_COLUMN(atbuf, v_line)
|
||||||
|
} else {
|
||||||
|
*dst++ = 0; *dst++ = 0; *dst++ = 0; *dst++ = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2818,11 +2987,13 @@ void render_bg_m5_vs(int line)
|
|||||||
|
|
||||||
for(column = 0; column < width; column++, index++)
|
for(column = 0; column < width; column++, index++)
|
||||||
{
|
{
|
||||||
|
int column_capped = column - (config.h40_extra_columns / 4);
|
||||||
|
column_capped = MAX(0, MIN(column_capped, 19));
|
||||||
/* Plane B vertical scroll */
|
/* Plane B vertical scroll */
|
||||||
#ifdef LSB_FIRST
|
#ifdef LSB_FIRST
|
||||||
v_line = (line + (vs[column] >> 16)) & pf_row_mask;
|
v_line = (line + (vs[column_capped] >> 16)) & pf_row_mask;
|
||||||
#else
|
#else
|
||||||
v_line = (line + vs[column]) & pf_row_mask;
|
v_line = (line + vs[column_capped]) & pf_row_mask;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Plane B name table */
|
/* Plane B name table */
|
||||||
@ -2848,6 +3019,17 @@ void render_bg_m5_vs_enhanced(int line)
|
|||||||
|
|
||||||
/* Scroll Planes common data */
|
/* Scroll Planes common data */
|
||||||
uint32 xscroll = *(uint32 *)&vram[hscb + ((line & hscroll_mask) << 2)];
|
uint32 xscroll = *(uint32 *)&vram[hscb + ((line & hscroll_mask) << 2)];
|
||||||
|
if (
|
||||||
|
(render_obj == render_obj_m5) ||
|
||||||
|
(render_obj == render_obj_m5_im2) ||
|
||||||
|
(render_obj == render_obj_m5_im2_ste) ||
|
||||||
|
(render_obj == render_obj_m5_ste)
|
||||||
|
) {
|
||||||
|
xscroll = (
|
||||||
|
((xscroll + config.h40_extra_columns * 4) & 0xFFFF) +
|
||||||
|
((xscroll + ((config.h40_extra_columns * 4) << 16)) & 0xFFFF0000)
|
||||||
|
);
|
||||||
|
}
|
||||||
uint32 yscroll = 0;
|
uint32 yscroll = 0;
|
||||||
uint32 pf_col_mask = playfield_col_mask;
|
uint32 pf_col_mask = playfield_col_mask;
|
||||||
uint32 pf_row_mask = playfield_row_mask;
|
uint32 pf_row_mask = playfield_row_mask;
|
||||||
@ -2936,20 +3118,25 @@ void render_bg_m5_vs_enhanced(int line)
|
|||||||
|
|
||||||
for(column = start; column < end; column++, index++)
|
for(column = start; column < end; column++, index++)
|
||||||
{
|
{
|
||||||
|
int column_capped = column - (config.h40_extra_columns / 4);
|
||||||
|
column_capped = MAX(0, MIN(column_capped, 19));
|
||||||
/* Plane A vertical scroll */
|
/* Plane A vertical scroll */
|
||||||
#ifdef LSB_FIRST
|
#ifdef LSB_FIRST
|
||||||
v_line = (line + vs[column]) & pf_row_mask;
|
v_line = (line + vs[column_capped]) & pf_row_mask;
|
||||||
next_v_line = (line + vs[column + 1]) & pf_row_mask;
|
next_v_line = (line + vs[column_capped + 1]) & pf_row_mask;
|
||||||
#else
|
#else
|
||||||
v_line = (line + (vs[column] >> 16)) & pf_row_mask;
|
v_line = (line + (vs[column_capped] >> 16)) & pf_row_mask;
|
||||||
next_v_line = (line + (vs[column + 1] >> 16)) & pf_row_mask;
|
next_v_line = (line + (vs[column_capped + 1] >> 16)) & pf_row_mask;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (column != end - 1)
|
if (column >= (config.h40_extra_columns / 4) && column < (config.h40_extra_columns / 4) + 19)
|
||||||
{
|
{
|
||||||
v_offset = ((int)next_v_line - (int)v_line) / 2;
|
v_offset = ((int)next_v_line - (int)v_line) / 2;
|
||||||
v_offset = (abs(v_offset) >= config.enhanced_vscroll_limit) ? 0 : v_offset;
|
v_offset = (abs(v_offset) >= config.enhanced_vscroll_limit) ? 0 : v_offset;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
v_offset = 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Plane A name table */
|
/* Plane A name table */
|
||||||
nt = (uint32 *)&vram[ntab + (((v_line >> 3) << pf_shift) & 0x1FC0)];
|
nt = (uint32 *)&vram[ntab + (((v_line >> 3) << pf_shift) & 0x1FC0)];
|
||||||
@ -2974,9 +3161,9 @@ void render_bg_m5_vs_enhanced(int line)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef LSB_FIRST
|
#ifdef LSB_FIRST
|
||||||
v_line = (line + v_offset + vs[column]) & pf_row_mask;
|
v_line = (line + v_offset + vs[column_capped]) & pf_row_mask;
|
||||||
#else
|
#else
|
||||||
v_line = (line + v_offset + (vs[column] >> 16)) & pf_row_mask;
|
v_line = (line + v_offset + (vs[column_capped] >> 16)) & pf_row_mask;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
nt = (uint32 *)&vram[ntab + (((v_line >> 3) << pf_shift) & 0x1FC0)];
|
nt = (uint32 *)&vram[ntab + (((v_line >> 3) << pf_shift) & 0x1FC0)];
|
||||||
@ -3022,10 +3209,17 @@ void render_bg_m5_vs_enhanced(int line)
|
|||||||
/* Pattern row index */
|
/* Pattern row index */
|
||||||
v_line = (line & 7) << 3;
|
v_line = (line & 7) << 3;
|
||||||
|
|
||||||
|
int start_real = start + (config.h40_extra_columns / 4);
|
||||||
|
int end_real = end - (config.h40_extra_columns / 4);
|
||||||
|
|
||||||
for(column = start; column < end; column++)
|
for(column = start; column < end; column++)
|
||||||
{
|
{
|
||||||
atbuf = nt[column];
|
atbuf = nt[column - (config.h40_extra_columns / 4)];
|
||||||
DRAW_COLUMN(atbuf, v_line)
|
if ((column >= start_real) && (column < end_real)) {
|
||||||
|
DRAW_COLUMN(atbuf, v_line)
|
||||||
|
} else {
|
||||||
|
*dst++ = 0; *dst++ = 0; *dst++ = 0; *dst++ = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3061,21 +3255,25 @@ void render_bg_m5_vs_enhanced(int line)
|
|||||||
|
|
||||||
for(column = 0; column < width; column++, index++)
|
for(column = 0; column < width; column++, index++)
|
||||||
{
|
{
|
||||||
|
int column_capped = column - (config.h40_extra_columns / 4);
|
||||||
|
column_capped = MAX(0, MIN(column_capped, 19));
|
||||||
/* Plane B vertical scroll */
|
/* Plane B vertical scroll */
|
||||||
#ifdef LSB_FIRST
|
#ifdef LSB_FIRST
|
||||||
v_line = (line + (vs[column] >> 16)) & pf_row_mask;
|
v_line = (line + (vs[column_capped] >> 16)) & pf_row_mask;
|
||||||
next_v_line = (line + (vs[column + 1] >> 16)) & pf_row_mask;
|
next_v_line = (line + (vs[column_capped + 1] >> 16)) & pf_row_mask;
|
||||||
#else
|
#else
|
||||||
v_line = (line + vs[column]) & pf_row_mask;
|
v_line = (line + vs[column_capped]) & pf_row_mask;
|
||||||
next_v_line = (line + vs[column + 1]) & pf_row_mask;
|
next_v_line = (line + vs[column_capped + 1]) & pf_row_mask;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (column != width - 1)
|
if (column >= (config.h40_extra_columns / 4) && column < (config.h40_extra_columns / 4) + 19)
|
||||||
{
|
{
|
||||||
v_offset = ((int)next_v_line - (int)v_line) / 2;
|
v_offset = ((int)next_v_line - (int)v_line) / 2;
|
||||||
v_offset = (abs(v_offset) >= config.enhanced_vscroll_limit) ? 0 : v_offset;
|
v_offset = (abs(v_offset) >= config.enhanced_vscroll_limit) ? 0 : v_offset;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
v_offset = 0;
|
||||||
|
}
|
||||||
/* Plane B name table */
|
/* Plane B name table */
|
||||||
nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)];
|
nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)];
|
||||||
|
|
||||||
@ -3093,7 +3291,7 @@ void render_bg_m5_vs_enhanced(int line)
|
|||||||
yscroll = (src[1] | atex);
|
yscroll = (src[1] | atex);
|
||||||
DRAW_BG_TILE(xscroll, yscroll)
|
DRAW_BG_TILE(xscroll, yscroll)
|
||||||
|
|
||||||
v_line = (line + v_offset + (vs[column] >> 16)) & pf_row_mask;
|
v_line = (line + v_offset + (vs[column_capped] >> 16)) & pf_row_mask;
|
||||||
nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)];
|
nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)];
|
||||||
v_line = (v_line & 7) << 3;
|
v_line = (v_line & 7) << 3;
|
||||||
atbuf = nt[index & pf_col_mask];
|
atbuf = nt[index & pf_col_mask];
|
||||||
@ -3114,7 +3312,7 @@ void render_bg_m5_vs_enhanced(int line)
|
|||||||
yscroll = (src[1] | atex);
|
yscroll = (src[1] | atex);
|
||||||
DRAW_BG_TILE(xscroll, yscroll)
|
DRAW_BG_TILE(xscroll, yscroll)
|
||||||
|
|
||||||
v_line = (line + vs[column]) & pf_row_mask;
|
v_line = (line + vs[column_capped]) & pf_row_mask;
|
||||||
nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)];
|
nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)];
|
||||||
v_line = (v_line & 7) << 3;
|
v_line = (v_line & 7) << 3;
|
||||||
atbuf = nt[index & pf_col_mask];
|
atbuf = nt[index & pf_col_mask];
|
||||||
@ -3137,7 +3335,7 @@ void render_bg_m5_vs_enhanced(int line)
|
|||||||
yscroll = (src[1] | atex);
|
yscroll = (src[1] | atex);
|
||||||
DRAW_BG_TILE(xscroll, yscroll)
|
DRAW_BG_TILE(xscroll, yscroll)
|
||||||
|
|
||||||
v_line = (line + v_offset + (vs[column] >> 16)) & pf_row_mask;
|
v_line = (line + v_offset + (vs[column_capped] >> 16)) & pf_row_mask;
|
||||||
nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)];
|
nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)];
|
||||||
v_line = (v_line & 7) << 3;
|
v_line = (v_line & 7) << 3;
|
||||||
atbuf = nt[index & pf_col_mask];
|
atbuf = nt[index & pf_col_mask];
|
||||||
@ -3158,7 +3356,7 @@ void render_bg_m5_vs_enhanced(int line)
|
|||||||
yscroll = (src[1] | atex);
|
yscroll = (src[1] | atex);
|
||||||
DRAW_BG_TILE(xscroll, yscroll)
|
DRAW_BG_TILE(xscroll, yscroll)
|
||||||
|
|
||||||
v_line = (line + vs[column]) & pf_row_mask;
|
v_line = (line + vs[column_capped]) & pf_row_mask;
|
||||||
nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)];
|
nt = (uint32 *)&vram[ntbb + (((v_line >> 3) << pf_shift) & 0x1FC0)];
|
||||||
v_line = (v_line & 7) << 3;
|
v_line = (v_line & 7) << 3;
|
||||||
atbuf = nt[index & pf_col_mask];
|
atbuf = nt[index & pf_col_mask];
|
||||||
@ -3185,6 +3383,17 @@ void render_bg_m5_im2(int line)
|
|||||||
/* Scroll Planes common data */
|
/* Scroll Planes common data */
|
||||||
int odd = odd_frame;
|
int odd = odd_frame;
|
||||||
uint32 xscroll = *(uint32 *)&vram[hscb + ((line & hscroll_mask) << 2)];
|
uint32 xscroll = *(uint32 *)&vram[hscb + ((line & hscroll_mask) << 2)];
|
||||||
|
if (
|
||||||
|
(render_obj == render_obj_m5) ||
|
||||||
|
(render_obj == render_obj_m5_im2) ||
|
||||||
|
(render_obj == render_obj_m5_im2_ste) ||
|
||||||
|
(render_obj == render_obj_m5_ste)
|
||||||
|
) {
|
||||||
|
xscroll = (
|
||||||
|
((xscroll + config.h40_extra_columns * 4) & 0xFFFF) +
|
||||||
|
((xscroll + ((config.h40_extra_columns * 4) << 16)) & 0xFFFF0000)
|
||||||
|
);
|
||||||
|
}
|
||||||
uint32 yscroll = *(uint32 *)&vsram[0];
|
uint32 yscroll = *(uint32 *)&vsram[0];
|
||||||
uint32 pf_col_mask = playfield_col_mask;
|
uint32 pf_col_mask = playfield_col_mask;
|
||||||
uint32 pf_row_mask = playfield_row_mask;
|
uint32 pf_row_mask = playfield_row_mask;
|
||||||
@ -3290,10 +3499,17 @@ void render_bg_m5_im2(int line)
|
|||||||
/* Pattern row index */
|
/* Pattern row index */
|
||||||
v_line = ((line & 7) << 1 | odd) << 3;
|
v_line = ((line & 7) << 1 | odd) << 3;
|
||||||
|
|
||||||
|
int start_real = start + (config.h40_extra_columns / 4);
|
||||||
|
int end_real = end - (config.h40_extra_columns / 4);
|
||||||
|
|
||||||
for(column = start; column < end; column++)
|
for(column = start; column < end; column++)
|
||||||
{
|
{
|
||||||
atbuf = nt[column];
|
atbuf = nt[column - (config.h40_extra_columns / 4)];
|
||||||
DRAW_COLUMN_IM2(atbuf, v_line)
|
if ((column >= start_real) && (column < end_real)) {
|
||||||
|
DRAW_COLUMN(atbuf, v_line)
|
||||||
|
} else {
|
||||||
|
*dst++ = 0; *dst++ = 0; *dst++ = 0; *dst++ = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3343,6 +3559,17 @@ void render_bg_m5_im2_vs(int line)
|
|||||||
/* common data */
|
/* common data */
|
||||||
int odd = odd_frame;
|
int odd = odd_frame;
|
||||||
uint32 xscroll = *(uint32 *)&vram[hscb + ((line & hscroll_mask) << 2)];
|
uint32 xscroll = *(uint32 *)&vram[hscb + ((line & hscroll_mask) << 2)];
|
||||||
|
if (
|
||||||
|
(render_obj == render_obj_m5) ||
|
||||||
|
(render_obj == render_obj_m5_im2) ||
|
||||||
|
(render_obj == render_obj_m5_im2_ste) ||
|
||||||
|
(render_obj == render_obj_m5_ste)
|
||||||
|
) {
|
||||||
|
xscroll = (
|
||||||
|
((xscroll + config.h40_extra_columns * 4) & 0xFFFF) +
|
||||||
|
((xscroll + ((config.h40_extra_columns * 4) << 16)) & 0xFFFF0000)
|
||||||
|
);
|
||||||
|
}
|
||||||
uint32 yscroll = 0;
|
uint32 yscroll = 0;
|
||||||
uint32 pf_col_mask = playfield_col_mask;
|
uint32 pf_col_mask = playfield_col_mask;
|
||||||
uint32 pf_row_mask = playfield_row_mask;
|
uint32 pf_row_mask = playfield_row_mask;
|
||||||
@ -3432,11 +3659,13 @@ void render_bg_m5_im2_vs(int line)
|
|||||||
|
|
||||||
for(column = start; column < end; column++, index++)
|
for(column = start; column < end; column++, index++)
|
||||||
{
|
{
|
||||||
|
int column_capped = column - (config.h40_extra_columns / 4);
|
||||||
|
column_capped = MAX(0, MIN(column_capped, 19));
|
||||||
/* Plane A vertical scroll */
|
/* Plane A vertical scroll */
|
||||||
#ifdef LSB_FIRST
|
#ifdef LSB_FIRST
|
||||||
v_line = (line + (vs[column] >> 1)) & pf_row_mask;
|
v_line = (line + (vs[column_capped] >> 1)) & pf_row_mask;
|
||||||
#else
|
#else
|
||||||
v_line = (line + (vs[column] >> 17)) & pf_row_mask;
|
v_line = (line + (vs[column_capped] >> 17)) & pf_row_mask;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Plane A name table */
|
/* Plane A name table */
|
||||||
@ -3472,10 +3701,17 @@ void render_bg_m5_im2_vs(int line)
|
|||||||
/* Pattern row index */
|
/* Pattern row index */
|
||||||
v_line = ((line & 7) << 1 | odd) << 3;
|
v_line = ((line & 7) << 1 | odd) << 3;
|
||||||
|
|
||||||
|
int start_real = start + (config.h40_extra_columns / 4);
|
||||||
|
int end_real = end - (config.h40_extra_columns / 4);
|
||||||
|
|
||||||
for(column = start; column < end; column++)
|
for(column = start; column < end; column++)
|
||||||
{
|
{
|
||||||
atbuf = nt[column];
|
atbuf = nt[column - (config.h40_extra_columns / 4)];
|
||||||
DRAW_COLUMN_IM2(atbuf, v_line)
|
if ((column >= start_real) && (column < end_real)) {
|
||||||
|
DRAW_COLUMN_IM2(atbuf, v_line)
|
||||||
|
} else {
|
||||||
|
*dst++ = 0; *dst++ = 0; *dst++ = 0; *dst++ = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3511,11 +3747,13 @@ void render_bg_m5_im2_vs(int line)
|
|||||||
|
|
||||||
for(column = 0; column < width; column++, index++)
|
for(column = 0; column < width; column++, index++)
|
||||||
{
|
{
|
||||||
|
int column_capped = column - (config.h40_extra_columns / 4);
|
||||||
|
column_capped = MAX(0, MIN(column_capped, 19));
|
||||||
/* Plane B vertical scroll */
|
/* Plane B vertical scroll */
|
||||||
#ifdef LSB_FIRST
|
#ifdef LSB_FIRST
|
||||||
v_line = (line + (vs[column] >> 17)) & pf_row_mask;
|
v_line = (line + (vs[column_capped] >> 17)) & pf_row_mask;
|
||||||
#else
|
#else
|
||||||
v_line = (line + (vs[column] >> 1)) & pf_row_mask;
|
v_line = (line + (vs[column_capped] >> 1)) & pf_row_mask;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Plane B name table */
|
/* Plane B name table */
|
||||||
@ -3819,6 +4057,7 @@ void render_obj_m5(int line)
|
|||||||
|
|
||||||
/* Display area offset */
|
/* Display area offset */
|
||||||
xpos = xpos - 0x80;
|
xpos = xpos - 0x80;
|
||||||
|
xpos += config.h40_extra_columns * 4;
|
||||||
|
|
||||||
/* Sprite size */
|
/* Sprite size */
|
||||||
temp = object_info->size;
|
temp = object_info->size;
|
||||||
@ -3932,6 +4171,7 @@ void render_obj_m5_ste(int line)
|
|||||||
|
|
||||||
/* Display area offset */
|
/* Display area offset */
|
||||||
xpos = xpos - 0x80;
|
xpos = xpos - 0x80;
|
||||||
|
xpos += config.h40_extra_columns * 4;
|
||||||
|
|
||||||
/* Sprite size */
|
/* Sprite size */
|
||||||
temp = object_info->size;
|
temp = object_info->size;
|
||||||
@ -4048,6 +4288,7 @@ void render_obj_m5_im2(int line)
|
|||||||
|
|
||||||
/* Display area offset */
|
/* Display area offset */
|
||||||
xpos = xpos - 0x80;
|
xpos = xpos - 0x80;
|
||||||
|
xpos += config.h40_extra_columns * 4;
|
||||||
|
|
||||||
/* Sprite size */
|
/* Sprite size */
|
||||||
temp = object_info->size;
|
temp = object_info->size;
|
||||||
@ -4161,6 +4402,7 @@ void render_obj_m5_im2_ste(int line)
|
|||||||
|
|
||||||
/* Display area offset */
|
/* Display area offset */
|
||||||
xpos = xpos - 0x80;
|
xpos = xpos - 0x80;
|
||||||
|
xpos += config.h40_extra_columns * 4;
|
||||||
|
|
||||||
/* Sprite size */
|
/* Sprite size */
|
||||||
temp = object_info->size;
|
temp = object_info->size;
|
||||||
@ -4486,7 +4728,11 @@ void parse_satb_m5(int line)
|
|||||||
|
|
||||||
/* Update sprite list (only name, attribute & xpos are parsed from VRAM) */
|
/* Update sprite list (only name, attribute & xpos are parsed from VRAM) */
|
||||||
object_info->attr = p[link + 2];
|
object_info->attr = p[link + 2];
|
||||||
object_info->xpos = p[link + 3] & 0x1ff;
|
|
||||||
|
if (config.h40_extra_columns > 0)
|
||||||
|
object_info->xpos = p[link + 3];
|
||||||
|
else
|
||||||
|
object_info->xpos = p[link + 3] & 0x1ff;
|
||||||
object_info->ypos = ypos;
|
object_info->ypos = ypos;
|
||||||
object_info->size = size & 0x0f;
|
object_info->size = size & 0x0f;
|
||||||
|
|
||||||
@ -4669,9 +4915,18 @@ void window_clip(unsigned int data, unsigned int sw)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// Problem: window_clip is called as a function from the vdp so we can't
|
||||||
|
// really just re-call it if the number of columns gets changed
|
||||||
|
//
|
||||||
|
// Partial solution: If the number of user-selected columns is greater
|
||||||
|
// than 18 the added window clipping columns gets bumped up to 24.
|
||||||
|
// That way non-android users still get to play around with crazy wide
|
||||||
|
// resolutions but android users dont get screwed
|
||||||
|
int added_columns = config.h40_extra_columns > 18 ? 24 : 18;
|
||||||
|
|
||||||
/* Plane A takes up entire line */
|
/* Plane A takes up entire line */
|
||||||
clip[a].left = 0;
|
clip[a].left = 0;
|
||||||
clip[a].right = sw;
|
clip[a].right = sw + (added_columns / 2);
|
||||||
clip[a].enable = 1;
|
clip[a].enable = 1;
|
||||||
clip[w].enable = 0;
|
clip[w].enable = 0;
|
||||||
}
|
}
|
||||||
|
@ -54,6 +54,8 @@
|
|||||||
#include <xtl.h>
|
#include <xtl.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define CORE_NAME "genesis_plus_gx_wide"
|
||||||
|
|
||||||
#define RETRO_DEVICE_MDPAD_3B RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_JOYPAD, 0)
|
#define RETRO_DEVICE_MDPAD_3B RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_JOYPAD, 0)
|
||||||
#define RETRO_DEVICE_MDPAD_6B RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_JOYPAD, 1)
|
#define RETRO_DEVICE_MDPAD_6B RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_JOYPAD, 1)
|
||||||
#define RETRO_DEVICE_MSPAD_2B RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_JOYPAD, 2)
|
#define RETRO_DEVICE_MSPAD_2B RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_JOYPAD, 2)
|
||||||
@ -1037,6 +1039,8 @@ static void config_default(void)
|
|||||||
{
|
{
|
||||||
config.input[i].padtype = DEVICE_PAD2B | DEVICE_PAD3B | DEVICE_PAD6B;
|
config.input[i].padtype = DEVICE_PAD2B | DEVICE_PAD3B | DEVICE_PAD6B;
|
||||||
}
|
}
|
||||||
|
config.h40_extra_columns = 10;
|
||||||
|
config.vdp_fix_dma_boundary_bug = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void bram_load(void)
|
static void bram_load(void)
|
||||||
@ -1242,6 +1246,7 @@ static void extract_directory(char *buf, const char *path, size_t size)
|
|||||||
|
|
||||||
static double calculate_display_aspect_ratio(void)
|
static double calculate_display_aspect_ratio(void)
|
||||||
{
|
{
|
||||||
|
int h40_width;
|
||||||
double videosamplerate, dotrate;
|
double videosamplerate, dotrate;
|
||||||
bool is_h40 = false;
|
bool is_h40 = false;
|
||||||
|
|
||||||
@ -1251,7 +1256,13 @@ static double calculate_display_aspect_ratio(void)
|
|||||||
return (6.0 / 5.0) * ((double)vwidth / (double)vheight);
|
return (6.0 / 5.0) * ((double)vwidth / (double)vheight);
|
||||||
}
|
}
|
||||||
|
|
||||||
is_h40 = bitmap.viewport.w == 320; /* Could be read directly from the register as well. */
|
/* Could be read directly from the register as well. */
|
||||||
|
h40_width = 320 + (config.h40_extra_columns * 8);
|
||||||
|
is_h40 = bitmap.viewport.w == h40_width;
|
||||||
|
|
||||||
|
if (is_h40 && (config.h40_extra_columns > 0))
|
||||||
|
return bitmap.viewport.w/(double)bitmap.viewport.h;
|
||||||
|
|
||||||
dotrate = system_clock / (is_h40 ? 8.0 : 10.0);
|
dotrate = system_clock / (is_h40 ? 8.0 : 10.0);
|
||||||
|
|
||||||
if (config.aspect_ratio == 1) /* Force NTSC PAR */
|
if (config.aspect_ratio == 1) /* Force NTSC PAR */
|
||||||
@ -1371,9 +1382,9 @@ static void check_variables(bool first_run)
|
|||||||
struct retro_system_av_info info;
|
struct retro_system_av_info info;
|
||||||
#ifdef USE_PER_SOUND_CHANNELS_CONFIG
|
#ifdef USE_PER_SOUND_CHANNELS_CONFIG
|
||||||
unsigned c;
|
unsigned c;
|
||||||
char md_fm_channel_volume_base_str[] = "genesis_plus_gx_md_channel_0_volume";
|
char md_fm_channel_volume_base_str[] = CORE_NAME "_md_channel_0_volume";
|
||||||
char sms_fm_channel_volume_base_str[] = "genesis_plus_gx_sms_fm_channel_0_volume";
|
char sms_fm_channel_volume_base_str[] = CORE_NAME "_sms_fm_channel_0_volume";
|
||||||
char psg_channel_volume_base_str[] = "genesis_plus_gx_psg_channel_0_volume";
|
char psg_channel_volume_base_str[] = CORE_NAME "_psg_channel_0_volume";
|
||||||
#endif
|
#endif
|
||||||
bool update_viewports = false;
|
bool update_viewports = false;
|
||||||
bool reinit = false;
|
bool reinit = false;
|
||||||
@ -1382,7 +1393,7 @@ static void check_variables(bool first_run)
|
|||||||
|
|
||||||
if (first_run)
|
if (first_run)
|
||||||
{
|
{
|
||||||
var.key = "genesis_plus_gx_system_bram";
|
var.key = CORE_NAME "_system_bram";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
if (!var.value || !strcmp(var.value, "per bios"))
|
if (!var.value || !strcmp(var.value, "per bios"))
|
||||||
@ -1405,7 +1416,7 @@ static void check_variables(bool first_run)
|
|||||||
|
|
||||||
if (first_run)
|
if (first_run)
|
||||||
{
|
{
|
||||||
var.key = "genesis_plus_gx_cart_size";
|
var.key = CORE_NAME "_cart_size";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
if (var.value && !strcmp(var.value, "disabled"))
|
if (var.value && !strcmp(var.value, "disabled"))
|
||||||
@ -1427,7 +1438,7 @@ static void check_variables(bool first_run)
|
|||||||
|
|
||||||
if (first_run)
|
if (first_run)
|
||||||
{
|
{
|
||||||
var.key = "genesis_plus_gx_cart_bram";
|
var.key = CORE_NAME "_cart_bram";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
if ((!var.value || !strcmp(var.value, "per cart")) && cart_size == 1)
|
if ((!var.value || !strcmp(var.value, "per cart")) && cart_size == 1)
|
||||||
@ -1502,7 +1513,7 @@ static void check_variables(bool first_run)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_system_hw";
|
var.key = CORE_NAME "_system_hw";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
orig_value = config.system;
|
orig_value = config.system;
|
||||||
@ -1553,7 +1564,7 @@ static void check_variables(bool first_run)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_bios";
|
var.key = CORE_NAME "_bios";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
orig_value = config.bios;
|
orig_value = config.bios;
|
||||||
@ -1571,7 +1582,7 @@ static void check_variables(bool first_run)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_region_detect";
|
var.key = CORE_NAME "_region_detect";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
orig_value = config.region_detect;
|
orig_value = config.region_detect;
|
||||||
@ -1654,7 +1665,7 @@ static void check_variables(bool first_run)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_vdp_mode";
|
var.key = CORE_NAME "_vdp_mode";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
orig_value = config.vdp_mode;
|
orig_value = config.vdp_mode;
|
||||||
@ -1735,7 +1746,7 @@ static void check_variables(bool first_run)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_force_dtack";
|
var.key = CORE_NAME "_force_dtack";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
if (!var.value || !strcmp(var.value, "enabled"))
|
if (!var.value || !strcmp(var.value, "enabled"))
|
||||||
@ -1744,7 +1755,7 @@ static void check_variables(bool first_run)
|
|||||||
config.force_dtack = 0;
|
config.force_dtack = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_addr_error";
|
var.key = CORE_NAME "_addr_error";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
if (!var.value || !strcmp(var.value, "enabled"))
|
if (!var.value || !strcmp(var.value, "enabled"))
|
||||||
@ -1753,7 +1764,7 @@ static void check_variables(bool first_run)
|
|||||||
m68k.aerr_enabled = config.addr_error = 0;
|
m68k.aerr_enabled = config.addr_error = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_cd_latency";
|
var.key = CORE_NAME "_cd_latency";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
if (!var.value || !strcmp(var.value, "enabled"))
|
if (!var.value || !strcmp(var.value, "enabled"))
|
||||||
@ -1762,7 +1773,7 @@ static void check_variables(bool first_run)
|
|||||||
config.cd_latency = 0;
|
config.cd_latency = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_cd_precache";
|
var.key = CORE_NAME "_cd_precache";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
if (!var.value || !strcmp(var.value, "disabled"))
|
if (!var.value || !strcmp(var.value, "disabled"))
|
||||||
@ -1771,7 +1782,7 @@ static void check_variables(bool first_run)
|
|||||||
config.cd_precache = 1;
|
config.cd_precache = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_add_on";
|
var.key = CORE_NAME "_add_on";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
orig_value = config.add_on;
|
orig_value = config.add_on;
|
||||||
@ -1786,7 +1797,7 @@ static void check_variables(bool first_run)
|
|||||||
/* note: game needs to be reloaded for change to take effect */
|
/* note: game needs to be reloaded for change to take effect */
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_lock_on";
|
var.key = CORE_NAME "_lock_on";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
orig_value = config.lock_on;
|
orig_value = config.lock_on;
|
||||||
@ -1806,7 +1817,7 @@ static void check_variables(bool first_run)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_ym2413";
|
var.key = CORE_NAME "_ym2413";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
orig_value = config.ym2413;
|
orig_value = config.ym2413;
|
||||||
@ -1829,7 +1840,7 @@ static void check_variables(bool first_run)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_OPLL_CORE
|
#ifdef HAVE_OPLL_CORE
|
||||||
var.key = "genesis_plus_gx_ym2413_core";
|
var.key = CORE_NAME "_ym2413_core";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
orig_value = config.opll;
|
orig_value = config.opll;
|
||||||
@ -1850,7 +1861,7 @@ static void check_variables(bool first_run)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_sound_output";
|
var.key = CORE_NAME "_sound_output";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
if (var.value && !strcmp(var.value, "mono"))
|
if (var.value && !strcmp(var.value, "mono"))
|
||||||
@ -1860,7 +1871,7 @@ static void check_variables(bool first_run)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_psg_preamp";
|
var.key = CORE_NAME "_psg_preamp";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
config.psg_preamp = (!var.value) ? 150: atoi(var.value);
|
config.psg_preamp = (!var.value) ? 150: atoi(var.value);
|
||||||
@ -1874,25 +1885,25 @@ static void check_variables(bool first_run)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_fm_preamp";
|
var.key = CORE_NAME "_fm_preamp";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
config.fm_preamp = (!var.value) ? 100: atoi(var.value);
|
config.fm_preamp = (!var.value) ? 100: atoi(var.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_cdda_volume";
|
var.key = CORE_NAME "_cdda_volume";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
config.cdda_volume = (!var.value) ? 100: atoi(var.value);
|
config.cdda_volume = (!var.value) ? 100: atoi(var.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_pcm_volume";
|
var.key = CORE_NAME "_pcm_volume";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
config.pcm_volume = (!var.value) ? 100: atoi(var.value);
|
config.pcm_volume = (!var.value) ? 100: atoi(var.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_audio_filter";
|
var.key = CORE_NAME "_audio_filter";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
if (var.value && !strcmp(var.value, "low-pass"))
|
if (var.value && !strcmp(var.value, "low-pass"))
|
||||||
@ -1907,14 +1918,14 @@ static void check_variables(bool first_run)
|
|||||||
config.filter = 0;
|
config.filter = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_lowpass_range";
|
var.key = CORE_NAME "_lowpass_range";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
config.lp_range = (!var.value) ? 0x9999 : ((atoi(var.value) * 65536) / 100);
|
config.lp_range = (!var.value) ? 0x9999 : ((atoi(var.value) * 65536) / 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_EQ
|
#ifdef HAVE_EQ
|
||||||
var.key = "genesis_plus_gx_audio_eq_low";
|
var.key = CORE_NAME "_audio_eq_low";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
uint8_t new_lg = (!var.value) ? 100 : atoi(var.value);
|
uint8_t new_lg = (!var.value) ? 100 : atoi(var.value);
|
||||||
@ -1922,7 +1933,7 @@ static void check_variables(bool first_run)
|
|||||||
config.lg = new_lg;
|
config.lg = new_lg;
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_audio_eq_mid";
|
var.key = CORE_NAME "_audio_eq_mid";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
uint8_t new_mg = (!var.value) ? 100 : atoi(var.value);
|
uint8_t new_mg = (!var.value) ? 100 : atoi(var.value);
|
||||||
@ -1930,7 +1941,7 @@ static void check_variables(bool first_run)
|
|||||||
config.mg = new_mg;
|
config.mg = new_mg;
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_audio_eq_high";
|
var.key = CORE_NAME "_audio_eq_high";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
uint8_t new_hg = (!var.value) ? 100 : atoi(var.value);
|
uint8_t new_hg = (!var.value) ? 100 : atoi(var.value);
|
||||||
@ -1940,7 +1951,7 @@ static void check_variables(bool first_run)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_ym2612";
|
var.key = CORE_NAME "_ym2612";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
#ifdef HAVE_YM3438_CORE
|
#ifdef HAVE_YM3438_CORE
|
||||||
@ -1984,7 +1995,7 @@ static void check_variables(bool first_run)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_frameskip";
|
var.key = CORE_NAME "_frameskip";
|
||||||
var.value = NULL;
|
var.value = NULL;
|
||||||
orig_value = frameskip_type;
|
orig_value = frameskip_type;
|
||||||
frameskip_type = 0;
|
frameskip_type = 0;
|
||||||
@ -1999,14 +2010,14 @@ static void check_variables(bool first_run)
|
|||||||
|
|
||||||
update_frameskip = update_frameskip || (frameskip_type != orig_value);
|
update_frameskip = update_frameskip || (frameskip_type != orig_value);
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_frameskip_threshold";
|
var.key = CORE_NAME "_frameskip_threshold";
|
||||||
var.value = NULL;
|
var.value = NULL;
|
||||||
frameskip_threshold = 33;
|
frameskip_threshold = 33;
|
||||||
|
|
||||||
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
|
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
|
||||||
frameskip_threshold = strtol(var.value, NULL, 10);
|
frameskip_threshold = strtol(var.value, NULL, 10);
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_blargg_ntsc_filter";
|
var.key = CORE_NAME "_blargg_ntsc_filter";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
orig_value = config.ntsc;
|
orig_value = config.ntsc;
|
||||||
@ -2042,7 +2053,7 @@ static void check_variables(bool first_run)
|
|||||||
update_viewports = true;
|
update_viewports = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_lcd_filter";
|
var.key = CORE_NAME "_lcd_filter";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
if (!var.value || !strcmp(var.value, "disabled"))
|
if (!var.value || !strcmp(var.value, "disabled"))
|
||||||
@ -2051,7 +2062,7 @@ static void check_variables(bool first_run)
|
|||||||
config.lcd = (uint8)(0.80 * 256);
|
config.lcd = (uint8)(0.80 * 256);
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_overscan";
|
var.key = CORE_NAME "_overscan";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
orig_value = config.overscan;
|
orig_value = config.overscan;
|
||||||
@ -2067,7 +2078,7 @@ static void check_variables(bool first_run)
|
|||||||
update_viewports = true;
|
update_viewports = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_gg_extra";
|
var.key = CORE_NAME "_gg_extra";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
orig_value = config.gg_extra;
|
orig_value = config.gg_extra;
|
||||||
@ -2079,7 +2090,7 @@ static void check_variables(bool first_run)
|
|||||||
update_viewports = true;
|
update_viewports = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_aspect_ratio";
|
var.key = CORE_NAME "_aspect_ratio";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
orig_value = config.aspect_ratio;
|
orig_value = config.aspect_ratio;
|
||||||
@ -2097,7 +2108,7 @@ static void check_variables(bool first_run)
|
|||||||
update_viewports = true;
|
update_viewports = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_render";
|
var.key = CORE_NAME "_render";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
orig_value = config.render;
|
orig_value = config.render;
|
||||||
@ -2109,7 +2120,7 @@ static void check_variables(bool first_run)
|
|||||||
update_viewports = true;
|
update_viewports = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_gun_cursor";
|
var.key = CORE_NAME "_gun_cursor";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
if (!var.value || !strcmp(var.value, "disabled"))
|
if (!var.value || !strcmp(var.value, "disabled"))
|
||||||
@ -2118,7 +2129,7 @@ static void check_variables(bool first_run)
|
|||||||
config.gun_cursor = 1;
|
config.gun_cursor = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_gun_input";
|
var.key = CORE_NAME "_gun_input";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
if (!var.value || !strcmp(var.value, "touchscreen"))
|
if (!var.value || !strcmp(var.value, "touchscreen"))
|
||||||
@ -2127,7 +2138,7 @@ static void check_variables(bool first_run)
|
|||||||
retro_gun_mode = RetroLightgun;
|
retro_gun_mode = RetroLightgun;
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_invert_mouse";
|
var.key = CORE_NAME "_invert_mouse";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
if (!var.value || !strcmp(var.value, "disabled"))
|
if (!var.value || !strcmp(var.value, "disabled"))
|
||||||
@ -2136,7 +2147,7 @@ static void check_variables(bool first_run)
|
|||||||
config.invert_mouse = 1;
|
config.invert_mouse = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_left_border";
|
var.key = CORE_NAME "_left_border";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
orig_value = config.left_border;
|
orig_value = config.left_border;
|
||||||
@ -2151,7 +2162,7 @@ static void check_variables(bool first_run)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_OVERCLOCK
|
#ifdef HAVE_OVERCLOCK
|
||||||
var.key = "genesis_plus_gx_overclock";
|
var.key = CORE_NAME "_overclock";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
config.overclock = (!var.value) ? 100 : atoi(var.value);
|
config.overclock = (!var.value) ? 100 : atoi(var.value);
|
||||||
@ -2161,7 +2172,7 @@ static void check_variables(bool first_run)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_no_sprite_limit";
|
var.key = CORE_NAME "_no_sprite_limit";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
if (!var.value || !strcmp(var.value, "disabled"))
|
if (!var.value || !strcmp(var.value, "disabled"))
|
||||||
@ -2170,7 +2181,7 @@ static void check_variables(bool first_run)
|
|||||||
config.no_sprite_limit = 1;
|
config.no_sprite_limit = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_enhanced_vscroll";
|
var.key = CORE_NAME "_enhanced_vscroll";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
if (!var.value || !strcmp(var.value, "disabled"))
|
if (!var.value || !strcmp(var.value, "disabled"))
|
||||||
@ -2179,15 +2190,36 @@ static void check_variables(bool first_run)
|
|||||||
config.enhanced_vscroll = 1;
|
config.enhanced_vscroll = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_enhanced_vscroll_limit";
|
var.key = CORE_NAME "_enhanced_vscroll_limit";
|
||||||
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
|
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
|
||||||
config.enhanced_vscroll_limit = strtol(var.value, NULL, 10);
|
config.enhanced_vscroll_limit = strtol(var.value, NULL, 10);
|
||||||
|
|
||||||
|
var.key = CORE_NAME "_h40_extra_columns";
|
||||||
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
|
{
|
||||||
|
orig_value = config.h40_extra_columns;
|
||||||
|
|
||||||
|
if (!var.value) config.h40_extra_columns = 10;
|
||||||
|
else config.h40_extra_columns = atoi(var.value);
|
||||||
|
|
||||||
|
if (orig_value != config.h40_extra_columns)
|
||||||
|
update_viewports = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
var.key = CORE_NAME "_vdp_fix_dma_boundary_bug";
|
||||||
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
|
{
|
||||||
|
if (!var.value || !strcmp(var.value, "disabled"))
|
||||||
|
config.vdp_fix_dma_boundary_bug = 0;
|
||||||
|
else if (var.value && !strcmp(var.value, "enabled"))
|
||||||
|
config.vdp_fix_dma_boundary_bug = 1;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef USE_PER_SOUND_CHANNELS_CONFIG
|
#ifdef USE_PER_SOUND_CHANNELS_CONFIG
|
||||||
var.key = psg_channel_volume_base_str;
|
var.key = psg_channel_volume_base_str;
|
||||||
for (c = 0; c < 4; c++)
|
for (c = 0; c < 4; c++)
|
||||||
{
|
{
|
||||||
psg_channel_volume_base_str[28] = c+'0';
|
psg_channel_volume_base_str[33] = c+'0';
|
||||||
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var))
|
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var))
|
||||||
{
|
{
|
||||||
config.psg_ch_volumes[c] = atoi(var.value);
|
config.psg_ch_volumes[c] = atoi(var.value);
|
||||||
@ -2202,7 +2234,7 @@ static void check_variables(bool first_run)
|
|||||||
var.key = md_fm_channel_volume_base_str;
|
var.key = md_fm_channel_volume_base_str;
|
||||||
for (c = 0; c < 6; c++)
|
for (c = 0; c < 6; c++)
|
||||||
{
|
{
|
||||||
md_fm_channel_volume_base_str[27] = c+'0';
|
md_fm_channel_volume_base_str[32] = c+'0';
|
||||||
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var))
|
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var))
|
||||||
config.md_ch_volumes[c] = atoi(var.value);
|
config.md_ch_volumes[c] = atoi(var.value);
|
||||||
}
|
}
|
||||||
@ -2210,12 +2242,12 @@ static void check_variables(bool first_run)
|
|||||||
var.key = sms_fm_channel_volume_base_str;
|
var.key = sms_fm_channel_volume_base_str;
|
||||||
for (c = 0; c < 9; c++)
|
for (c = 0; c < 9; c++)
|
||||||
{
|
{
|
||||||
sms_fm_channel_volume_base_str[31] = c+'0';
|
sms_fm_channel_volume_base_str[36] = c+'0';
|
||||||
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var))
|
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var))
|
||||||
config.sms_fm_ch_volumes[c] = atoi(var.value);
|
config.sms_fm_ch_volumes[c] = atoi(var.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_show_advanced_audio_settings";
|
var.key = CORE_NAME "_show_advanced_audio_settings";
|
||||||
var.value = NULL;
|
var.value = NULL;
|
||||||
|
|
||||||
/* If frontend supports core option categories,
|
/* If frontend supports core option categories,
|
||||||
@ -2235,26 +2267,26 @@ static void check_variables(bool first_run)
|
|||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
struct retro_core_option_display option_display;
|
struct retro_core_option_display option_display;
|
||||||
char av_keys[19][40] = {
|
char av_keys[19][45] = {
|
||||||
"genesis_plus_gx_psg_channel_0_volume",
|
CORE_NAME "_psg_channel_0_volume",
|
||||||
"genesis_plus_gx_psg_channel_1_volume",
|
CORE_NAME "_psg_channel_1_volume",
|
||||||
"genesis_plus_gx_psg_channel_2_volume",
|
CORE_NAME "_psg_channel_2_volume",
|
||||||
"genesis_plus_gx_psg_channel_3_volume",
|
CORE_NAME "_psg_channel_3_volume",
|
||||||
"genesis_plus_gx_md_channel_0_volume",
|
CORE_NAME "_md_channel_0_volume",
|
||||||
"genesis_plus_gx_md_channel_1_volume",
|
CORE_NAME "_md_channel_1_volume",
|
||||||
"genesis_plus_gx_md_channel_2_volume",
|
CORE_NAME "_md_channel_2_volume",
|
||||||
"genesis_plus_gx_md_channel_3_volume",
|
CORE_NAME "_md_channel_3_volume",
|
||||||
"genesis_plus_gx_md_channel_4_volume",
|
CORE_NAME "_md_channel_4_volume",
|
||||||
"genesis_plus_gx_md_channel_5_volume",
|
CORE_NAME "_md_channel_5_volume",
|
||||||
"genesis_plus_gx_sms_fm_channel_0_volume",
|
CORE_NAME "_sms_fm_channel_0_volume",
|
||||||
"genesis_plus_gx_sms_fm_channel_1_volume",
|
CORE_NAME "_sms_fm_channel_1_volume",
|
||||||
"genesis_plus_gx_sms_fm_channel_2_volume",
|
CORE_NAME "_sms_fm_channel_2_volume",
|
||||||
"genesis_plus_gx_sms_fm_channel_3_volume",
|
CORE_NAME "_sms_fm_channel_3_volume",
|
||||||
"genesis_plus_gx_sms_fm_channel_4_volume",
|
CORE_NAME "_sms_fm_channel_4_volume",
|
||||||
"genesis_plus_gx_sms_fm_channel_5_volume",
|
CORE_NAME "_sms_fm_channel_5_volume",
|
||||||
"genesis_plus_gx_sms_fm_channel_6_volume",
|
CORE_NAME "_sms_fm_channel_6_volume",
|
||||||
"genesis_plus_gx_sms_fm_channel_7_volume",
|
CORE_NAME "_sms_fm_channel_7_volume",
|
||||||
"genesis_plus_gx_sms_fm_channel_8_volume"
|
CORE_NAME "_sms_fm_channel_8_volume"
|
||||||
};
|
};
|
||||||
|
|
||||||
option_display.visible = show_advanced_av_settings;
|
option_display.visible = show_advanced_av_settings;
|
||||||
@ -3090,7 +3122,7 @@ void retro_set_environment(retro_environment_t cb)
|
|||||||
struct retro_core_option_display option_display;
|
struct retro_core_option_display option_display;
|
||||||
|
|
||||||
option_display.visible = false;
|
option_display.visible = false;
|
||||||
option_display.key = "genesis_plus_gx_show_advanced_audio_settings";
|
option_display.key = CORE_NAME "_show_advanced_audio_settings";
|
||||||
|
|
||||||
environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_DISPLAY,
|
environ_cb(RETRO_ENVIRONMENT_SET_CORE_OPTIONS_DISPLAY,
|
||||||
&option_display);
|
&option_display);
|
||||||
@ -3120,7 +3152,7 @@ void retro_set_input_state(retro_input_state_t cb) { input_state_cb = cb; }
|
|||||||
|
|
||||||
void retro_get_system_info(struct retro_system_info *info)
|
void retro_get_system_info(struct retro_system_info *info)
|
||||||
{
|
{
|
||||||
info->library_name = "Genesis Plus GX";
|
info->library_name = "Genesis Plus GX Wide";
|
||||||
#ifndef GIT_VERSION
|
#ifndef GIT_VERSION
|
||||||
#define GIT_VERSION ""
|
#define GIT_VERSION ""
|
||||||
#endif
|
#endif
|
||||||
@ -3141,9 +3173,9 @@ void retro_get_system_av_info(struct retro_system_av_info *info)
|
|||||||
{
|
{
|
||||||
/* 16 bit system */
|
/* 16 bit system */
|
||||||
if (config.ntsc) {
|
if (config.ntsc) {
|
||||||
info->geometry.max_width = MD_NTSC_OUT_WIDTH(320 + max_border_width);
|
info->geometry.max_width = MD_NTSC_OUT_WIDTH(320 + (bitmap.viewport.x * 2) + (config.h40_extra_columns * 8));
|
||||||
} else {
|
} else {
|
||||||
info->geometry.max_width = 320 + max_border_width;
|
info->geometry.max_width = 320 + (bitmap.viewport.x * 2) + (config.h40_extra_columns * 8);
|
||||||
}
|
}
|
||||||
if (config.render) {
|
if (config.render) {
|
||||||
info->geometry.max_height = 480 + (vdp_pal * 96);
|
info->geometry.max_height = 480 + (vdp_pal * 96);
|
||||||
|
@ -96,7 +96,7 @@ struct retro_core_option_v2_category option_cats_us[] = {
|
|||||||
|
|
||||||
struct retro_core_option_v2_definition option_defs_us[] = {
|
struct retro_core_option_v2_definition option_defs_us[] = {
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_system_hw",
|
CORE_NAME "_system_hw",
|
||||||
"System Hardware",
|
"System Hardware",
|
||||||
NULL,
|
NULL,
|
||||||
"Runs loaded content with a specific emulated console. 'Auto' will select the most appropriate system for the current game.",
|
"Runs loaded content with a specific emulated console. 'Auto' will select the most appropriate system for the current game.",
|
||||||
@ -117,7 +117,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"auto"
|
"auto"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_region_detect",
|
CORE_NAME "_region_detect",
|
||||||
"System Region",
|
"System Region",
|
||||||
NULL,
|
NULL,
|
||||||
"Specify which region the system is from. For consoles other than the Game Gear, 'PAL' is 50 Hz, while 'NTSC' is 60 Hz. Games may run faster or slower than normal if the incorrect region is selected.",
|
"Specify which region the system is from. For consoles other than the Game Gear, 'PAL' is 50 Hz, while 'NTSC' is 60 Hz. Games may run faster or slower than normal if the incorrect region is selected.",
|
||||||
@ -133,7 +133,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"auto"
|
"auto"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_vdp_mode",
|
CORE_NAME "_vdp_mode",
|
||||||
"Force VDP Mode",
|
"Force VDP Mode",
|
||||||
NULL,
|
NULL,
|
||||||
"Overrides the VDP mode to force it to run at either 60Hz (NTSC) or 50Hz (PAL), regardless of system region.",
|
"Overrides the VDP mode to force it to run at either 60Hz (NTSC) or 50Hz (PAL), regardless of system region.",
|
||||||
@ -148,7 +148,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"auto"
|
"auto"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_bios",
|
CORE_NAME "_bios",
|
||||||
"System Boot ROM",
|
"System Boot ROM",
|
||||||
NULL,
|
NULL,
|
||||||
"Use official BIOS/bootloader for emulated hardware, if present in RetroArch's system directory. Displays console-specific start-up sequence/animation, then runs loaded content.",
|
"Use official BIOS/bootloader for emulated hardware, if present in RetroArch's system directory. Displays console-specific start-up sequence/animation, then runs loaded content.",
|
||||||
@ -162,7 +162,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"disabled"
|
"disabled"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_system_bram",
|
CORE_NAME "_system_bram",
|
||||||
"CD System BRAM (Requires Restart)",
|
"CD System BRAM (Requires Restart)",
|
||||||
NULL,
|
NULL,
|
||||||
"When running Sega CD/Mega-CD content, specifies whether to share a single save file between all games from a specific region (Per-BIOS) or to create a separate save file for each game (Per-Game). Note that the Sega CD/Mega-CD has limited internal storage, sufficient only for a handful of titles. To avoid running out of space, the 'Per-Game' setting is recommended.",
|
"When running Sega CD/Mega-CD content, specifies whether to share a single save file between all games from a specific region (Per-BIOS) or to create a separate save file for each game (Per-Game). Note that the Sega CD/Mega-CD has limited internal storage, sufficient only for a handful of titles. To avoid running out of space, the 'Per-Game' setting is recommended.",
|
||||||
@ -176,7 +176,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"per bios"
|
"per bios"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_cart_bram",
|
CORE_NAME "_cart_bram",
|
||||||
"CD Backup Cart BRAM (Requires Restart)",
|
"CD Backup Cart BRAM (Requires Restart)",
|
||||||
NULL,
|
NULL,
|
||||||
"When running Sega CD/Mega-CD content, specifies whether to share a single backup ram cart for all games (Per-Cart) or to create a separate backup ram cart for each game (Per-Game).",
|
"When running Sega CD/Mega-CD content, specifies whether to share a single backup ram cart for all games (Per-Cart) or to create a separate backup ram cart for each game (Per-Game).",
|
||||||
@ -190,7 +190,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"per cart"
|
"per cart"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_cart_size",
|
CORE_NAME "_cart_size",
|
||||||
"CD Backup Cart BRAM Size (Requires Restart)",
|
"CD Backup Cart BRAM Size (Requires Restart)",
|
||||||
NULL,
|
NULL,
|
||||||
"Sets the backup ram cart size when running Sega CD/Mega-CD content. Useful when setting the backup ram cart to Per-Game to avoid multiple larger cart sizes.",
|
"Sets the backup ram cart size when running Sega CD/Mega-CD content. Useful when setting the backup ram cart to Per-Game to avoid multiple larger cart sizes.",
|
||||||
@ -209,7 +209,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"4meg"
|
"4meg"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_add_on",
|
CORE_NAME "_add_on",
|
||||||
"CD add-on (MD mode) (Requires Restart)",
|
"CD add-on (MD mode) (Requires Restart)",
|
||||||
NULL,
|
NULL,
|
||||||
"Specify which add-on to use for CD audio playback with supported Mega Drive/Genesis games.",
|
"Specify which add-on to use for CD audio playback with supported Mega Drive/Genesis games.",
|
||||||
@ -225,7 +225,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"auto"
|
"auto"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_lock_on",
|
CORE_NAME "_lock_on",
|
||||||
"Cartridge Lock-On",
|
"Cartridge Lock-On",
|
||||||
NULL,
|
NULL,
|
||||||
"Lock-On Technology is a Mega Drive/Genesis feature that allowed an older game to connect to the pass-through port of a special cartridge for extended or altered gameplay. This option specifies which type of special 'lock-on' cartridge to emulate. A corresponding bios file must be present in RetroArch's system directory.",
|
"Lock-On Technology is a Mega Drive/Genesis feature that allowed an older game to connect to the pass-through port of a special cartridge for extended or altered gameplay. This option specifies which type of special 'lock-on' cartridge to emulate. A corresponding bios file must be present in RetroArch's system directory.",
|
||||||
@ -241,7 +241,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"disabled"
|
"disabled"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_aspect_ratio",
|
CORE_NAME "_aspect_ratio",
|
||||||
"Core-Provided Aspect Ratio",
|
"Core-Provided Aspect Ratio",
|
||||||
NULL,
|
NULL,
|
||||||
"Choose the preferred content aspect ratio. This will only apply when RetroArch's aspect ratio is set to 'Core provided' in the Video settings.",
|
"Choose the preferred content aspect ratio. This will only apply when RetroArch's aspect ratio is set to 'Core provided' in the Video settings.",
|
||||||
@ -257,7 +257,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"auto"
|
"auto"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_overscan",
|
CORE_NAME "_overscan",
|
||||||
"Borders",
|
"Borders",
|
||||||
NULL,
|
NULL,
|
||||||
"Enable this to display the overscan regions at the top/bottom and/or left/right of the screen. These would normally be hidden by the bezel around the edge of a standard-definition television.",
|
"Enable this to display the overscan regions at the top/bottom and/or left/right of the screen. These would normally be hidden by the bezel around the edge of a standard-definition television.",
|
||||||
@ -273,7 +273,46 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"disabled"
|
"disabled"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_left_border",
|
CORE_NAME "_h40_extra_columns",
|
||||||
|
"Extra columns to draw in H40 for widescreen",
|
||||||
|
NULL,
|
||||||
|
"Set the amount of extra colums to draw for widescreen",
|
||||||
|
NULL,
|
||||||
|
"video",
|
||||||
|
{
|
||||||
|
{ "10", NULL },
|
||||||
|
{ "0", NULL },
|
||||||
|
{ "2", NULL },
|
||||||
|
{ "4", NULL },
|
||||||
|
{ "6", NULL },
|
||||||
|
{ "8", NULL },
|
||||||
|
{ "12", NULL },
|
||||||
|
{ "14", NULL },
|
||||||
|
{ "16", NULL },
|
||||||
|
{ "18", NULL },
|
||||||
|
{ "20", NULL },
|
||||||
|
{ "22", NULL },
|
||||||
|
{ "24", NULL },
|
||||||
|
{ NULL, NULL },
|
||||||
|
},
|
||||||
|
"10"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
CORE_NAME "_vdp_fix_dma_boundary_bug",
|
||||||
|
"Fix VDP DMA boundary bug",
|
||||||
|
NULL,
|
||||||
|
"Enable this to fix the VDP DMA boundary bug",
|
||||||
|
NULL,
|
||||||
|
"video",
|
||||||
|
{
|
||||||
|
{ "disabled", NULL },
|
||||||
|
{ "enabled", NULL },
|
||||||
|
{ NULL, NULL },
|
||||||
|
},
|
||||||
|
"disabled"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
CORE_NAME "_left_border",
|
||||||
"Hide Master System Side Borders",
|
"Hide Master System Side Borders",
|
||||||
NULL,
|
NULL,
|
||||||
"Cuts off 8 pixels from either the left side of the screen, or both left and right sides when running Master System games.",
|
"Cuts off 8 pixels from either the left side of the screen, or both left and right sides when running Master System games.",
|
||||||
@ -288,7 +327,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"disabled"
|
"disabled"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_gg_extra",
|
CORE_NAME "_gg_extra",
|
||||||
"Game Gear Extended Screen",
|
"Game Gear Extended Screen",
|
||||||
NULL,
|
NULL,
|
||||||
"Forces Game Gear titles to run in SMS mode, with an increased resolution of 256x192. May show additional content, but typically displays a border of corrupt/unwanted image data.",
|
"Forces Game Gear titles to run in SMS mode, with an increased resolution of 256x192. May show additional content, but typically displays a border of corrupt/unwanted image data.",
|
||||||
@ -302,7 +341,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"disabled"
|
"disabled"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_blargg_ntsc_filter",
|
CORE_NAME "_blargg_ntsc_filter",
|
||||||
"Blargg NTSC Filter",
|
"Blargg NTSC Filter",
|
||||||
NULL,
|
NULL,
|
||||||
"Apply a video filter to mimic various NTSC TV signals.",
|
"Apply a video filter to mimic various NTSC TV signals.",
|
||||||
@ -319,7 +358,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"disabled"
|
"disabled"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_lcd_filter",
|
CORE_NAME "_lcd_filter",
|
||||||
"LCD Ghosting Filter",
|
"LCD Ghosting Filter",
|
||||||
NULL,
|
NULL,
|
||||||
"Apply an image 'ghosting' filter to mimic the display characteristics of the Game Gear and Genesis Nomad LCD panels.",
|
"Apply an image 'ghosting' filter to mimic the display characteristics of the Game Gear and Genesis Nomad LCD panels.",
|
||||||
@ -333,7 +372,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"disabled"
|
"disabled"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_render",
|
CORE_NAME "_render",
|
||||||
"Interlaced Mode 2 Output",
|
"Interlaced Mode 2 Output",
|
||||||
NULL,
|
NULL,
|
||||||
"Interlaced Mode 2 allows the Mega Drive/Genesis to output a double height (high resolution) 320x448 image by drawing alternate scan lines each frame (this is used by Sonic the Hedgehog 2 and Combat Cars multiplayer modes). 'Double Field' mimics original hardware, producing a sharp image with flickering/interlacing artifacts. 'Single Field' applies a deinterlacing filter, which stabilizes the image but causes mild blurring.",
|
"Interlaced Mode 2 allows the Mega Drive/Genesis to output a double height (high resolution) 320x448 image by drawing alternate scan lines each frame (this is used by Sonic the Hedgehog 2 and Combat Cars multiplayer modes). 'Double Field' mimics original hardware, producing a sharp image with flickering/interlacing artifacts. 'Single Field' applies a deinterlacing filter, which stabilizes the image but causes mild blurring.",
|
||||||
@ -347,7 +386,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"single field"
|
"single field"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_frameskip",
|
CORE_NAME "_frameskip",
|
||||||
"Frameskip",
|
"Frameskip",
|
||||||
NULL,
|
NULL,
|
||||||
"Skip frames to avoid audio buffer under-run (crackling). Improves performance at the expense of visual smoothness. 'Auto' skips frames when advised by the frontend. 'Manual' utilizes the 'Frameskip Threshold (%)' setting.",
|
"Skip frames to avoid audio buffer under-run (crackling). Improves performance at the expense of visual smoothness. 'Auto' skips frames when advised by the frontend. 'Manual' utilizes the 'Frameskip Threshold (%)' setting.",
|
||||||
@ -362,7 +401,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"disabled"
|
"disabled"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_frameskip_threshold",
|
CORE_NAME "_frameskip_threshold",
|
||||||
"Frameskip Threshold (%)",
|
"Frameskip Threshold (%)",
|
||||||
NULL,
|
NULL,
|
||||||
"When 'Frameskip' is set to 'Manual', specifies the audio buffer occupancy threshold (percentage) below which frames will be skipped. Higher values reduce the risk of crackling by causing frames to be dropped more frequently.",
|
"When 'Frameskip' is set to 'Manual', specifies the audio buffer occupancy threshold (percentage) below which frames will be skipped. Higher values reduce the risk of crackling by causing frames to be dropped more frequently.",
|
||||||
@ -390,7 +429,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"33"
|
"33"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_ym2413",
|
CORE_NAME "_ym2413",
|
||||||
"Master System FM (YM2413)",
|
"Master System FM (YM2413)",
|
||||||
NULL,
|
NULL,
|
||||||
"Enable emulation of the FM Sound Unit used by certain Sega Mark III/Master System games for enhanced audio output.",
|
"Enable emulation of the FM Sound Unit used by certain Sega Mark III/Master System games for enhanced audio output.",
|
||||||
@ -406,7 +445,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
},
|
},
|
||||||
#ifdef HAVE_OPLL_CORE
|
#ifdef HAVE_OPLL_CORE
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_ym2413_core",
|
CORE_NAME "_ym2413_core",
|
||||||
"Master System FM (YM2413) Core",
|
"Master System FM (YM2413) Core",
|
||||||
NULL,
|
NULL,
|
||||||
"Select method used to emulate the FM Sound Unit of the Sega Mark III/Master System. 'MAME' option is fast, and runs full speed on most systems. 'Nuked' option is cycle accurate, very high quality, and has substantial CPU requirements.",
|
"Select method used to emulate the FM Sound Unit of the Sega Mark III/Master System. 'MAME' option is fast, and runs full speed on most systems. 'Nuked' option is cycle accurate, very high quality, and has substantial CPU requirements.",
|
||||||
@ -421,7 +460,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_ym2612",
|
CORE_NAME "_ym2612",
|
||||||
"Mega Drive/Genesis FM",
|
"Mega Drive/Genesis FM",
|
||||||
NULL,
|
NULL,
|
||||||
#ifdef HAVE_YM3438_CORE
|
#ifdef HAVE_YM3438_CORE
|
||||||
@ -444,7 +483,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"mame (ym2612)"
|
"mame (ym2612)"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_sound_output",
|
CORE_NAME "_sound_output",
|
||||||
"Sound Output",
|
"Sound Output",
|
||||||
NULL,
|
NULL,
|
||||||
"Select stereo or mono sound playback.",
|
"Select stereo or mono sound playback.",
|
||||||
@ -458,7 +497,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"stereo"
|
"stereo"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_audio_filter",
|
CORE_NAME "_audio_filter",
|
||||||
"Audio Filter",
|
"Audio Filter",
|
||||||
NULL,
|
NULL,
|
||||||
"Enable a low pass audio filter to better simulate the characteristic sound of a Model 1 Mega Drive/Genesis.",
|
"Enable a low pass audio filter to better simulate the characteristic sound of a Model 1 Mega Drive/Genesis.",
|
||||||
@ -475,7 +514,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"disabled"
|
"disabled"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_lowpass_range",
|
CORE_NAME "_lowpass_range",
|
||||||
"Low-Pass Filter %",
|
"Low-Pass Filter %",
|
||||||
NULL,
|
NULL,
|
||||||
"Specify the cut-off frequency of the audio low pass filter. A higher value increases the perceived 'strength' of the filter, since a wider range of the high frequency spectrum is attenuated.",
|
"Specify the cut-off frequency of the audio low pass filter. A higher value increases the perceived 'strength' of the filter, since a wider range of the high frequency spectrum is attenuated.",
|
||||||
@ -506,7 +545,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"60"
|
"60"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_psg_preamp",
|
CORE_NAME "_psg_preamp",
|
||||||
"PSG Preamp Level",
|
"PSG Preamp Level",
|
||||||
NULL,
|
NULL,
|
||||||
"Set the audio preamplifier level of the emulated SN76496 4-channel Programmable Sound Generator found in the SG-1000, Sega Mark III, Master System, Game Gear and Mega Drive/Genesis.",
|
"Set the audio preamplifier level of the emulated SN76496 4-channel Programmable Sound Generator found in the SG-1000, Sega Mark III, Master System, Game Gear and Mega Drive/Genesis.",
|
||||||
@ -559,7 +598,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"150"
|
"150"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_fm_preamp",
|
CORE_NAME "_fm_preamp",
|
||||||
"FM Preamp Level",
|
"FM Preamp Level",
|
||||||
NULL,
|
NULL,
|
||||||
"Set the audio preamplifier level of the emulated Mega Drive/Genesis FM sound synthesizer or Sega Mark III/Master System FM Sound Unit.",
|
"Set the audio preamplifier level of the emulated Mega Drive/Genesis FM sound synthesizer or Sega Mark III/Master System FM Sound Unit.",
|
||||||
@ -612,7 +651,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"100"
|
"100"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_cdda_volume",
|
CORE_NAME "_cdda_volume",
|
||||||
"CD-DA Volume",
|
"CD-DA Volume",
|
||||||
NULL,
|
NULL,
|
||||||
"Adjust the mixing volume of the emulated CD audio playback output.",
|
"Adjust the mixing volume of the emulated CD audio playback output.",
|
||||||
@ -645,7 +684,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"100"
|
"100"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_pcm_volume",
|
CORE_NAME "_pcm_volume",
|
||||||
"PCM Volume",
|
"PCM Volume",
|
||||||
NULL,
|
NULL,
|
||||||
"Adjust the mixing volume of the emulated Sega CD/Mega-CD RF5C164 PCM sound generator output.",
|
"Adjust the mixing volume of the emulated Sega CD/Mega-CD RF5C164 PCM sound generator output.",
|
||||||
@ -679,7 +718,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
},
|
},
|
||||||
#ifdef HAVE_EQ
|
#ifdef HAVE_EQ
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_audio_eq_low",
|
CORE_NAME "_audio_eq_low",
|
||||||
"EQ Low",
|
"EQ Low",
|
||||||
NULL,
|
NULL,
|
||||||
"Adjust the low range band of the internal audio equalizer.",
|
"Adjust the low range band of the internal audio equalizer.",
|
||||||
@ -712,7 +751,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"100"
|
"100"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_audio_eq_mid",
|
CORE_NAME "_audio_eq_mid",
|
||||||
"EQ Mid",
|
"EQ Mid",
|
||||||
NULL,
|
NULL,
|
||||||
"Adjust the middle range band of the internal audio equalizer.",
|
"Adjust the middle range band of the internal audio equalizer.",
|
||||||
@ -745,7 +784,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"100"
|
"100"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_audio_eq_high",
|
CORE_NAME "_audio_eq_high",
|
||||||
"EQ High",
|
"EQ High",
|
||||||
NULL,
|
NULL,
|
||||||
"Adjust the high range band of the internal audio equalizer.",
|
"Adjust the high range band of the internal audio equalizer.",
|
||||||
@ -779,7 +818,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_gun_input",
|
CORE_NAME "_gun_input",
|
||||||
"Light Gun Input",
|
"Light Gun Input",
|
||||||
NULL,
|
NULL,
|
||||||
"Use a mouse-controlled 'Light Gun' or 'Touchscreen' input.",
|
"Use a mouse-controlled 'Light Gun' or 'Touchscreen' input.",
|
||||||
@ -793,7 +832,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"lightgun"
|
"lightgun"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_gun_cursor",
|
CORE_NAME "_gun_cursor",
|
||||||
"Show Light Gun Crosshair",
|
"Show Light Gun Crosshair",
|
||||||
NULL,
|
NULL,
|
||||||
"Display light gun crosshairs when using the MD Menacer, MD Justifiers and MS Light Phaser input device types.",
|
"Display light gun crosshairs when using the MD Menacer, MD Justifiers and MS Light Phaser input device types.",
|
||||||
@ -807,7 +846,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"disabled"
|
"disabled"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_invert_mouse",
|
CORE_NAME "_invert_mouse",
|
||||||
"Invert Mouse Y-Axis",
|
"Invert Mouse Y-Axis",
|
||||||
NULL,
|
NULL,
|
||||||
"Inverts the Y-axis of the MD Mouse input device type.",
|
"Inverts the Y-axis of the MD Mouse input device type.",
|
||||||
@ -821,7 +860,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"disabled"
|
"disabled"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_no_sprite_limit",
|
CORE_NAME "_no_sprite_limit",
|
||||||
"Remove Per-Line Sprite Limit",
|
"Remove Per-Line Sprite Limit",
|
||||||
NULL,
|
NULL,
|
||||||
"Removes the original sprite-per-scanline hardware limit. This reduces flickering but can cause visual glitches, as some games exploit the hardware limit to generate special effects.",
|
"Removes the original sprite-per-scanline hardware limit. This reduces flickering but can cause visual glitches, as some games exploit the hardware limit to generate special effects.",
|
||||||
@ -835,7 +874,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"disabled"
|
"disabled"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_enhanced_vscroll",
|
CORE_NAME "_enhanced_vscroll",
|
||||||
"Enhanced per-tile vertical scroll",
|
"Enhanced per-tile vertical scroll",
|
||||||
NULL,
|
NULL,
|
||||||
"Allows each individual cell to be scrolled vertically, instead of 16px 2-cell, by averaging out with the vscroll value of the neighbouring cell. This hack only applies to few games that use 2-cell vertical scroll mode.",
|
"Allows each individual cell to be scrolled vertically, instead of 16px 2-cell, by averaging out with the vscroll value of the neighbouring cell. This hack only applies to few games that use 2-cell vertical scroll mode.",
|
||||||
@ -849,7 +888,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"disabled"
|
"disabled"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_enhanced_vscroll_limit",
|
CORE_NAME "_enhanced_vscroll_limit",
|
||||||
"Enhanced per-tile vertical scroll limit",
|
"Enhanced per-tile vertical scroll limit",
|
||||||
NULL,
|
NULL,
|
||||||
"Only when Enhanced per-tile vertical scroll is enabled. Adjusts the limit of the vertical scroll enhancement. When the vscroll difference between neighbouring tiles is bigger than this limit, the enhancement is disabled.",
|
"Only when Enhanced per-tile vertical scroll is enabled. Adjusts the limit of the vertical scroll enhancement. When the vscroll difference between neighbouring tiles is bigger than this limit, the enhancement is disabled.",
|
||||||
@ -877,7 +916,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
},
|
},
|
||||||
#ifdef HAVE_OVERCLOCK
|
#ifdef HAVE_OVERCLOCK
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_overclock",
|
CORE_NAME "_overclock",
|
||||||
"CPU Speed",
|
"CPU Speed",
|
||||||
NULL,
|
NULL,
|
||||||
"Overclock the emulated CPU. Can reduce slowdown, but may cause glitches.",
|
"Overclock the emulated CPU. Can reduce slowdown, but may cause glitches.",
|
||||||
@ -907,7 +946,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_force_dtack",
|
CORE_NAME "_force_dtack",
|
||||||
"System Lock-Ups",
|
"System Lock-Ups",
|
||||||
NULL,
|
NULL,
|
||||||
"Emulate system lock-ups that occur on real hardware when performing illegal address access. This should only be disabled when playing certain demos and homebrew that rely on illegal behavior for correct operation.",
|
"Emulate system lock-ups that occur on real hardware when performing illegal address access. This should only be disabled when playing certain demos and homebrew that rely on illegal behavior for correct operation.",
|
||||||
@ -921,7 +960,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"enabled"
|
"enabled"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_addr_error",
|
CORE_NAME "_addr_error",
|
||||||
"68K Address Error",
|
"68K Address Error",
|
||||||
NULL,
|
NULL,
|
||||||
"The Mega Drive/Genesis main CPU (Motorola 68000) generates an Address Error exception (crash) when attempting to perform unaligned memory access. Enabling this will simulate this behavior. It should only be disabled when playing ROM hacks, since these are typically developed using less accurate emulators and may rely on invalid RAM access for correct operation.",
|
"The Mega Drive/Genesis main CPU (Motorola 68000) generates an Address Error exception (crash) when attempting to perform unaligned memory access. Enabling this will simulate this behavior. It should only be disabled when playing ROM hacks, since these are typically developed using less accurate emulators and may rely on invalid RAM access for correct operation.",
|
||||||
@ -935,7 +974,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"enabled"
|
"enabled"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_cd_latency",
|
CORE_NAME "_cd_latency",
|
||||||
"CD Access Time",
|
"CD Access Time",
|
||||||
NULL,
|
NULL,
|
||||||
"Simulate original CD hardware latency when initiating a read or seeking to a specific location on loaded disc. This is required by a few CD games that crash if CD data is available too soon and also fixes CD audio desync issues in some games. Disabling this can be useful with MSU-MD games as it makes CD audio tracks loops more seamless.",
|
"Simulate original CD hardware latency when initiating a read or seeking to a specific location on loaded disc. This is required by a few CD games that crash if CD data is available too soon and also fixes CD audio desync issues in some games. Disabling this can be useful with MSU-MD games as it makes CD audio tracks loops more seamless.",
|
||||||
@ -949,7 +988,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"enabled"
|
"enabled"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_cd_precache",
|
CORE_NAME "_cd_precache",
|
||||||
"CD Image Cache",
|
"CD Image Cache",
|
||||||
NULL,
|
NULL,
|
||||||
"Load CD image to memory on startup. CHD supported only. Restart Required.",
|
"Load CD image to memory on startup. CHD supported only. Restart Required.",
|
||||||
@ -964,7 +1003,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
},
|
},
|
||||||
#ifdef USE_PER_SOUND_CHANNELS_CONFIG
|
#ifdef USE_PER_SOUND_CHANNELS_CONFIG
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_show_advanced_audio_settings",
|
CORE_NAME "_show_advanced_audio_settings",
|
||||||
"Show Advanced Audio Volume Settings (Reopen menu)",
|
"Show Advanced Audio Volume Settings (Reopen menu)",
|
||||||
NULL,
|
NULL,
|
||||||
"Enable configuration of low-level audio channel parameters. NOTE: Quick Menu must be toggled for this setting to take effect.",
|
"Enable configuration of low-level audio channel parameters. NOTE: Quick Menu must be toggled for this setting to take effect.",
|
||||||
@ -978,7 +1017,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"disabled"
|
"disabled"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_psg_channel_0_volume",
|
CORE_NAME "_psg_channel_0_volume",
|
||||||
"PSG Tone Channel 0 Volume %",
|
"PSG Tone Channel 0 Volume %",
|
||||||
NULL,
|
NULL,
|
||||||
"Reduce the volume of the PSG Tone Channel 0.",
|
"Reduce the volume of the PSG Tone Channel 0.",
|
||||||
@ -1001,7 +1040,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"100"
|
"100"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_psg_channel_1_volume",
|
CORE_NAME "_psg_channel_1_volume",
|
||||||
"PSG Tone Channel 1 Volume %",
|
"PSG Tone Channel 1 Volume %",
|
||||||
NULL,
|
NULL,
|
||||||
"Reduce the volume of the PSG Tone Channel 1.",
|
"Reduce the volume of the PSG Tone Channel 1.",
|
||||||
@ -1024,7 +1063,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"100"
|
"100"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_psg_channel_2_volume",
|
CORE_NAME "_psg_channel_2_volume",
|
||||||
"PSG Tone Channel 2 Volume %",
|
"PSG Tone Channel 2 Volume %",
|
||||||
NULL,
|
NULL,
|
||||||
"Reduce the volume of the PSG Tone Channel 2.",
|
"Reduce the volume of the PSG Tone Channel 2.",
|
||||||
@ -1047,7 +1086,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"100"
|
"100"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_psg_channel_3_volume",
|
CORE_NAME "_psg_channel_3_volume",
|
||||||
"PSG Noise Channel 3 Volume %",
|
"PSG Noise Channel 3 Volume %",
|
||||||
NULL,
|
NULL,
|
||||||
"Reduce the volume of the PSG Noise Channel 3.",
|
"Reduce the volume of the PSG Noise Channel 3.",
|
||||||
@ -1070,7 +1109,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"100"
|
"100"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_md_channel_0_volume",
|
CORE_NAME "_md_channel_0_volume",
|
||||||
"Mega Drive/Genesis FM Channel 0 Volume %",
|
"Mega Drive/Genesis FM Channel 0 Volume %",
|
||||||
NULL,
|
NULL,
|
||||||
"Reduce the volume of the Mega Drive/Genesis FM Channel 0. Only works with MAME FM emulators.",
|
"Reduce the volume of the Mega Drive/Genesis FM Channel 0. Only works with MAME FM emulators.",
|
||||||
@ -1093,7 +1132,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"100"
|
"100"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_md_channel_1_volume",
|
CORE_NAME "_md_channel_1_volume",
|
||||||
"Mega Drive/Genesis FM Channel 1 Volume %",
|
"Mega Drive/Genesis FM Channel 1 Volume %",
|
||||||
NULL,
|
NULL,
|
||||||
"Reduce the volume of the Mega Drive/Genesis FM Channel 1. Only works with MAME FM emulators.",
|
"Reduce the volume of the Mega Drive/Genesis FM Channel 1. Only works with MAME FM emulators.",
|
||||||
@ -1116,7 +1155,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"100"
|
"100"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_md_channel_2_volume",
|
CORE_NAME "_md_channel_2_volume",
|
||||||
"Mega Drive/Genesis FM Channel 2 Volume %",
|
"Mega Drive/Genesis FM Channel 2 Volume %",
|
||||||
NULL,
|
NULL,
|
||||||
"Reduce the volume of the Mega Drive/Genesis FM Channel 2. Only works with MAME FM emulators.",
|
"Reduce the volume of the Mega Drive/Genesis FM Channel 2. Only works with MAME FM emulators.",
|
||||||
@ -1139,7 +1178,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"100"
|
"100"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_md_channel_3_volume",
|
CORE_NAME "_md_channel_3_volume",
|
||||||
"Mega Drive/Genesis FM Channel 3 Volume %",
|
"Mega Drive/Genesis FM Channel 3 Volume %",
|
||||||
NULL,
|
NULL,
|
||||||
"Reduce the volume of the Mega Drive/Genesis FM Channel 3. Only works with MAME FM emulators.",
|
"Reduce the volume of the Mega Drive/Genesis FM Channel 3. Only works with MAME FM emulators.",
|
||||||
@ -1162,7 +1201,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"100"
|
"100"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_md_channel_4_volume",
|
CORE_NAME "_md_channel_4_volume",
|
||||||
"Mega Drive/Genesis FM Channel 4 Volume %",
|
"Mega Drive/Genesis FM Channel 4 Volume %",
|
||||||
NULL,
|
NULL,
|
||||||
"Reduce the volume of the Mega Drive/Genesis FM Channel 4. Only works with MAME FM emulators.",
|
"Reduce the volume of the Mega Drive/Genesis FM Channel 4. Only works with MAME FM emulators.",
|
||||||
@ -1185,7 +1224,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"100"
|
"100"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_md_channel_5_volume",
|
CORE_NAME "_md_channel_5_volume",
|
||||||
"Mega Drive/Genesis FM Channel 5 Volume %",
|
"Mega Drive/Genesis FM Channel 5 Volume %",
|
||||||
NULL,
|
NULL,
|
||||||
"Reduce the volume of the Mega Drive/Genesis FM Channel 5. Only works with MAME FM emulators.",
|
"Reduce the volume of the Mega Drive/Genesis FM Channel 5. Only works with MAME FM emulators.",
|
||||||
@ -1208,7 +1247,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"100"
|
"100"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_sms_fm_channel_0_volume",
|
CORE_NAME "_sms_fm_channel_0_volume",
|
||||||
"Master System FM (YM2413) Channel 0 Volume %",
|
"Master System FM (YM2413) Channel 0 Volume %",
|
||||||
NULL,
|
NULL,
|
||||||
"Reduce the volume of the Master System FM Channel 0.",
|
"Reduce the volume of the Master System FM Channel 0.",
|
||||||
@ -1231,7 +1270,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"100"
|
"100"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_sms_fm_channel_1_volume",
|
CORE_NAME "_sms_fm_channel_1_volume",
|
||||||
"Master System FM (YM2413) Channel 1 Volume %",
|
"Master System FM (YM2413) Channel 1 Volume %",
|
||||||
NULL,
|
NULL,
|
||||||
"Reduce the volume of the Master System FM Channel 1.",
|
"Reduce the volume of the Master System FM Channel 1.",
|
||||||
@ -1254,7 +1293,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"100"
|
"100"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_sms_fm_channel_2_volume",
|
CORE_NAME "_sms_fm_channel_2_volume",
|
||||||
"Master System FM (YM2413) Channel 2 Volume %",
|
"Master System FM (YM2413) Channel 2 Volume %",
|
||||||
NULL,
|
NULL,
|
||||||
"Reduce the volume of the Master System FM Channel 2.",
|
"Reduce the volume of the Master System FM Channel 2.",
|
||||||
@ -1277,7 +1316,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"100"
|
"100"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_sms_fm_channel_3_volume",
|
CORE_NAME "_sms_fm_channel_3_volume",
|
||||||
"Master System FM (YM2413) Channel 3 Volume %",
|
"Master System FM (YM2413) Channel 3 Volume %",
|
||||||
NULL,
|
NULL,
|
||||||
"Reduce the volume of the Master System FM Channel 3.",
|
"Reduce the volume of the Master System FM Channel 3.",
|
||||||
@ -1300,7 +1339,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"100"
|
"100"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_sms_fm_channel_4_volume",
|
CORE_NAME "_sms_fm_channel_4_volume",
|
||||||
"Master System FM (YM2413) Channel 4 Volume %",
|
"Master System FM (YM2413) Channel 4 Volume %",
|
||||||
NULL,
|
NULL,
|
||||||
"Reduce the volume of the Master System FM Channel 4.",
|
"Reduce the volume of the Master System FM Channel 4.",
|
||||||
@ -1323,7 +1362,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"100"
|
"100"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_sms_fm_channel_5_volume",
|
CORE_NAME "_sms_fm_channel_5_volume",
|
||||||
"Master System FM (YM2413) Channel 5 Volume %",
|
"Master System FM (YM2413) Channel 5 Volume %",
|
||||||
NULL,
|
NULL,
|
||||||
"Reduce the volume of the Master System FM Channel 5.",
|
"Reduce the volume of the Master System FM Channel 5.",
|
||||||
@ -1346,7 +1385,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"100"
|
"100"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_sms_fm_channel_6_volume",
|
CORE_NAME "_sms_fm_channel_6_volume",
|
||||||
"Master System FM (YM2413) Channel 6 Volume %",
|
"Master System FM (YM2413) Channel 6 Volume %",
|
||||||
NULL,
|
NULL,
|
||||||
"Reduce the volume of the Master System FM Channel 6.",
|
"Reduce the volume of the Master System FM Channel 6.",
|
||||||
@ -1369,7 +1408,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"100"
|
"100"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_sms_fm_channel_7_volume",
|
CORE_NAME "_sms_fm_channel_7_volume",
|
||||||
"Master System FM (YM2413) Channel 7 Volume %",
|
"Master System FM (YM2413) Channel 7 Volume %",
|
||||||
NULL,
|
NULL,
|
||||||
"Reduce the volume of the Master System FM Channel 7.",
|
"Reduce the volume of the Master System FM Channel 7.",
|
||||||
@ -1392,7 +1431,7 @@ struct retro_core_option_v2_definition option_defs_us[] = {
|
|||||||
"100"
|
"100"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"genesis_plus_gx_sms_fm_channel_8_volume",
|
CORE_NAME "_sms_fm_channel_8_volume",
|
||||||
"Master System FM (YM2413) Channel 8 Volume %",
|
"Master System FM (YM2413) Channel 8 Volume %",
|
||||||
NULL,
|
NULL,
|
||||||
"Reduce the volume of the Master System FM Channel 8.",
|
"Reduce the volume of the Master System FM Channel 8.",
|
||||||
@ -1651,7 +1690,7 @@ INLINE void libretro_set_core_options(retro_environment_t environ_cb,
|
|||||||
|
|
||||||
/* Skip options that are irrelevant when using the
|
/* Skip options that are irrelevant when using the
|
||||||
* old style core options interface */
|
* old style core options interface */
|
||||||
if (strcmp(key, "genesis_plus_gx_show_advanced_audio_settings") == 0)
|
if (strcmp(key, CORE_NAME "_show_advanced_audio_settings") == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (desc)
|
if (desc)
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -127,6 +127,8 @@ typedef struct
|
|||||||
uint8 lcd;
|
uint8 lcd;
|
||||||
uint8 gg_extra;
|
uint8 gg_extra;
|
||||||
uint8 left_border;
|
uint8 left_border;
|
||||||
|
uint8 h40_extra_columns;
|
||||||
|
uint8 vdp_fix_dma_boundary_bug;
|
||||||
uint8 render;
|
uint8 render;
|
||||||
t_input_config input[MAX_INPUTS];
|
t_input_config input[MAX_INPUTS];
|
||||||
uint8 invert_mouse;
|
uint8 invert_mouse;
|
||||||
|
Loading…
Reference in New Issue
Block a user