From 9cdfc191b60cb8881552d01f84e21bdcbb48758d Mon Sep 17 00:00:00 2001 From: notaz Date: Sat, 5 Apr 2014 22:08:06 +0300 Subject: [PATCH 1/4] add a pitch variable 32x is still broken --- platform/common/emu.c | 16 ++++++++------ platform/common/emu.h | 1 + platform/common/menu_pico.c | 43 ++++++++++++++++++++----------------- platform/common/plat_sdl.c | 14 ++++++------ platform/gp2x/plat.c | 1 + platform/libpicofe | 2 +- platform/linux/emu.c | 16 +++++++------- platform/linux/io.c | 6 ++++-- platform/pandora/menu.c | 2 +- platform/pandora/plat.c | 2 +- platform/win32/plat.c | 2 +- 11 files changed, 59 insertions(+), 46 deletions(-) diff --git a/platform/common/emu.c b/platform/common/emu.c index b4db4c67..0a9f0890 100644 --- a/platform/common/emu.c +++ b/platform/common/emu.c @@ -42,6 +42,7 @@ void *g_screen_ptr; int g_screen_width = 320; int g_screen_height = 240; +int g_screen_ppitch = 320; // pitch in pixels const char *PicoConfigFile = "config2.cfg"; currentConfig_t currentConfig, defaultConfig; @@ -730,12 +731,12 @@ void name(int x, int y, const char *text) \ } \ } -mk_text_out(emu_text_out8, unsigned char, 0xf0, g_screen_ptr, 1, g_screen_width) -mk_text_out(emu_text_out16, unsigned short, 0xffff, g_screen_ptr, 1, g_screen_width) +mk_text_out(emu_text_out8, unsigned char, 0xf0, g_screen_ptr, 1, g_screen_ppitch) +mk_text_out(emu_text_out16, unsigned short, 0xffff, g_screen_ptr, 1, g_screen_ppitch) mk_text_out(emu_text_out8_rot, unsigned char, 0xf0, - (char *)g_screen_ptr + (g_screen_width - 1) * g_screen_height, -g_screen_height, 1) + (char *)g_screen_ptr + (g_screen_ppitch - 1) * g_screen_height, -g_screen_height, 1) mk_text_out(emu_text_out16_rot, unsigned short, 0xffff, - (short *)g_screen_ptr + (g_screen_width - 1) * g_screen_height, -g_screen_height, 1) + (short *)g_screen_ptr + (g_screen_ppitch - 1) * g_screen_height, -g_screen_height, 1) #undef mk_text_out @@ -751,7 +752,7 @@ void emu_osd_text16(int x, int y, const char *text) for (h = 0; h < 8; h++) { unsigned short *p; p = (unsigned short *)g_screen_ptr - + x + g_screen_width * (y + h); + + x + g_screen_ppitch * (y + h); for (i = len; i > 0; i--, p++) *p = (*p >> 2) & 0x39e7; } @@ -1204,8 +1205,11 @@ static void mkdir_path(char *path_with_reserve, int pos, const char *name) void emu_cmn_forced_frame(int no_scale, int do_emu) { int po_old = PicoIn.opt; + int y; - memset32(g_screen_ptr, 0, g_screen_width * g_screen_height * 2 / 4); + for (y = 0; y < g_screen_height; y++) + memset32((short *)g_screen_ptr + g_screen_ppitch * y, 0, + g_screen_width * 2 / 4); PicoIn.opt &= ~POPT_ALT_RENDERER; PicoIn.opt |= POPT_ACC_SPRITES; diff --git a/platform/common/emu.h b/platform/common/emu.h index 9a5ae660..1e751f89 100644 --- a/platform/common/emu.h +++ b/platform/common/emu.h @@ -16,6 +16,7 @@ extern void *g_screen_ptr; extern int g_screen_width; extern int g_screen_height; +extern int g_screen_ppitch; // pitch in pixels #define EOPT_EN_SRAM (1<<0) #define EOPT_SHOW_FPS (1<<1) diff --git a/platform/common/menu_pico.c b/platform/common/menu_pico.c index 969fc8e2..ab91e1c2 100644 --- a/platform/common/menu_pico.c +++ b/platform/common/menu_pico.c @@ -107,7 +107,7 @@ static void make_bg(int no_scale) (g_menuscreen_w / 2 - w / 2); // darken the active framebuffer - for (; h > 0; dst += g_menuscreen_w, src += g_screen_width, h--) + for (; h > 0; dst += g_menuscreen_w, src += g_screen_ppitch, h--) menu_darken_bg(dst, src, w, 1); } @@ -167,8 +167,8 @@ static void load_progress_cb(int percent) len = g_menuscreen_w; menu_draw_begin(0, 1); - dst = (unsigned short *)g_menuscreen_ptr + g_menuscreen_w * me_sfont_h * 2; - for (ln = me_sfont_h - 2; ln > 0; ln--, dst += g_menuscreen_w) + dst = (unsigned short *)g_menuscreen_ptr + g_menuscreen_pp * me_sfont_h * 2; + for (ln = me_sfont_h - 2; ln > 0; ln--, dst += g_menuscreen_pp) memset(dst, 0xff, len * 2); menu_draw_end(); } @@ -179,17 +179,18 @@ static void cdload_progress_cb(const char *fname, int percent) unsigned short *dst; menu_draw_begin(0, 1); - dst = (unsigned short *)g_menuscreen_ptr + g_menuscreen_w * me_sfont_h * 2; - memset(dst, 0xff, g_menuscreen_w * (me_sfont_h - 2) * 2); + dst = (unsigned short *)g_menuscreen_ptr + g_menuscreen_pp * me_sfont_h * 2; + + menuscreen_memset_lines(dst, 0xff, me_sfont_h - 2); smalltext_out16(1, 3 * me_sfont_h, "Processing CD image / MP3s", 0xffff); smalltext_out16(1, 4 * me_sfont_h, fname, 0xffff); - dst += g_menuscreen_w * me_sfont_h * 3; + dst += g_menuscreen_pp * me_sfont_h * 3; if (len > g_menuscreen_w) len = g_menuscreen_w; - for (ln = (me_sfont_h - 2); ln > 0; ln--, dst += g_menuscreen_w) + for (ln = (me_sfont_h - 2); ln > 0; ln--, dst += g_menuscreen_pp) memset(dst, 0xff, len * 2); menu_draw_end(); @@ -848,13 +849,15 @@ static void debug_menu_loop(void) break; case 2: pemu_forced_frame(1, 0); make_bg(1); - PDebugShowSpriteStats((unsigned short *)g_menuscreen_ptr + (g_menuscreen_h/2 - 240/2)*g_menuscreen_w + - g_menuscreen_w/2 - 320/2, g_menuscreen_w); + PDebugShowSpriteStats((unsigned short *)g_menuscreen_ptr + + (g_menuscreen_h/2 - 240/2) * g_menuscreen_pp + + g_menuscreen_w/2 - 320/2, g_menuscreen_pp); break; - case 3: memset(g_menuscreen_ptr, 0, g_menuscreen_w * g_menuscreen_h * 2); - PDebugShowPalette(g_menuscreen_ptr, g_menuscreen_w); - PDebugShowSprite((unsigned short *)g_menuscreen_ptr + g_menuscreen_w*120 + g_menuscreen_w/2 + 16, - g_menuscreen_w, spr_offs); + case 3: menuscreen_memset_lines(g_menuscreen_ptr, 0, g_menuscreen_h); + PDebugShowPalette(g_menuscreen_ptr, g_menuscreen_pp); + PDebugShowSprite((unsigned short *)g_menuscreen_ptr + + g_menuscreen_pp * 120 + g_menuscreen_w / 2 + 16, + g_menuscreen_pp, spr_offs); draw_text_debug(PDebugSpriteList(), spr_offs, 6); break; case 4: tmp = PDebug32x(); @@ -974,23 +977,23 @@ static void menu_main_draw_status(void) return; /* battery info */ - bp += (me_mfont_h * 2 + 2) * g_screen_width + g_screen_width - me_mfont_w * 3 - 3; + bp += (me_mfont_h * 2 + 2) * g_screen_ppitch + g_screen_width - me_mfont_w * 3 - 3; for (i = 0; i < me_mfont_w * 2; i++) bp[i] = menu_text_color; for (i = 0; i < me_mfont_w * 2; i++) - bp[i + g_screen_width * bat_h] = menu_text_color; + bp[i + g_screen_ppitch * bat_h] = menu_text_color; for (i = 0; i <= bat_h; i++) - bp[i * g_screen_width] = - bp[i * g_screen_width + me_mfont_w * 2] = menu_text_color; + bp[i * g_screen_ppitch] = + bp[i * g_screen_ppitch + me_mfont_w * 2] = menu_text_color; for (i = 2; i < bat_h - 1; i++) - bp[i * g_screen_width - 1] = - bp[i * g_screen_width - 2] = menu_text_color; + bp[i * g_screen_ppitch - 1] = + bp[i * g_screen_ppitch - 2] = menu_text_color; w = me_mfont_w * 2 - 1; wfill = batt_val * w / 100; for (u = 1; u < bat_h; u++) for (i = 0; i < wfill; i++) - bp[(w - i) + g_screen_width * u] = menu_text_color; + bp[(w - i) + g_screen_ppitch * u] = menu_text_color; } static int main_menu_handler(int id, int keys) diff --git a/platform/common/plat_sdl.c b/platform/common/plat_sdl.c index 1b617d5a..3948cc41 100644 --- a/platform/common/plat_sdl.c +++ b/platform/common/plat_sdl.c @@ -158,19 +158,19 @@ void plat_video_flip(void) SDL_LockYUVOverlay(plat_sdl_overlay); rgb565_to_uyvy(plat_sdl_overlay->pixels[0], shadow_fb, - g_screen_width * g_screen_height); + g_screen_ppitch * g_screen_height); SDL_UnlockYUVOverlay(plat_sdl_overlay); SDL_DisplayYUVOverlay(plat_sdl_overlay, &dstrect); } else if (plat_sdl_gl_active) { - gl_flip(shadow_fb, g_screen_width, g_screen_height); + gl_flip(shadow_fb, g_screen_ppitch, g_screen_height); } else { if (SDL_MUSTLOCK(plat_sdl_screen)) SDL_UnlockSurface(plat_sdl_screen); SDL_Flip(plat_sdl_screen); g_screen_ptr = plat_sdl_screen->pixels; - PicoDrawSetOutBuf(g_screen_ptr, g_screen_width * 2); + PicoDrawSetOutBuf(g_screen_ptr, g_screen_ppitch * 2); } } @@ -204,13 +204,13 @@ void plat_video_menu_end(void) SDL_LockYUVOverlay(plat_sdl_overlay); rgb565_to_uyvy(plat_sdl_overlay->pixels[0], shadow_fb, - g_menuscreen_w * g_menuscreen_h); + g_menuscreen_pp * g_menuscreen_h); SDL_UnlockYUVOverlay(plat_sdl_overlay); SDL_DisplayYUVOverlay(plat_sdl_overlay, &dstrect); } else if (plat_sdl_gl_active) { - gl_flip(g_menuscreen_ptr, g_menuscreen_w, g_menuscreen_h); + gl_flip(g_menuscreen_ptr, g_menuscreen_pp, g_menuscreen_h); } else { if (SDL_MUSTLOCK(plat_sdl_screen)) @@ -237,7 +237,7 @@ void plat_video_loop_prepare(void) SDL_LockSurface(plat_sdl_screen); g_screen_ptr = plat_sdl_screen->pixels; } - PicoDrawSetOutBuf(g_screen_ptr, g_screen_width * 2); + PicoDrawSetOutBuf(g_screen_ptr, g_screen_ppitch * 2); } void plat_early_init(void) @@ -265,6 +265,7 @@ void plat_init(void) g_menuscreen_w = plat_sdl_screen->w; g_menuscreen_h = plat_sdl_screen->h; + g_menuscreen_pp = g_menuscreen_w; g_menuscreen_ptr = NULL; shadow_size = g_menuscreen_w * g_menuscreen_h * 2; @@ -280,6 +281,7 @@ void plat_init(void) g_screen_width = 320; g_screen_height = 240; + g_screen_ppitch = 320; g_screen_ptr = shadow_fb; in_sdl_init(&in_sdl_platform_data, plat_sdl_event_handler); diff --git a/platform/gp2x/plat.c b/platform/gp2x/plat.c index 614ab7f0..4fcf76f4 100644 --- a/platform/gp2x/plat.c +++ b/platform/gp2x/plat.c @@ -208,6 +208,7 @@ void plat_init(void) g_menuscreen_w = 320; g_menuscreen_h = 240; + g_menuscreen_pp = g_menuscreen_w; gp2x_memset_all_buffers(0, 0, 320*240*2); gp2x_make_fb_bufferable(1); diff --git a/platform/libpicofe b/platform/libpicofe index 21082d0b..2b27288e 160000 --- a/platform/libpicofe +++ b/platform/libpicofe @@ -1 +1 @@ -Subproject commit 21082d0b2b9910727770674cef9b68b9e97a3155 +Subproject commit 2b27288eb44ef9247d2a948a207d3ac9b835421a diff --git a/platform/linux/emu.c b/platform/linux/emu.c index c470a771..5d4432fa 100644 --- a/platform/linux/emu.c +++ b/platform/linux/emu.c @@ -67,7 +67,7 @@ static void draw_cd_leds(void) void pemu_finalize_frame(const char *fps, const char *notice) { if (currentConfig.renderer != RT_16BIT && !(PicoIn.AHW & PAHW_32X)) { - unsigned short *pd = (unsigned short *)g_screen_ptr + 8 * g_screen_width; + unsigned short *pd = (unsigned short *)g_screen_ptr + 8 * g_screen_ppitch; unsigned char *ps = Pico.est.Draw2FB + 328*8 + 8; unsigned short *pal = Pico.est.HighPal; int i, x; @@ -94,7 +94,7 @@ static void apply_renderer(void) case RT_16BIT: PicoIn.opt &= ~POPT_ALT_RENDERER; PicoDrawSetOutFormat(PDF_RGB555, 0); - PicoDrawSetOutBuf(g_screen_ptr, g_screen_width * 2); + PicoDrawSetOutBuf(g_screen_ptr, g_screen_ppitch * 2); break; case RT_8BIT_ACC: PicoIn.opt &= ~POPT_ALT_RENDERER; @@ -108,7 +108,7 @@ static void apply_renderer(void) } if (PicoIn.AHW & PAHW_32X) - PicoDrawSetOutBuf(g_screen_ptr, g_screen_width * 2); + PicoDrawSetOutBuf(g_screen_ptr, g_screen_ppitch * 2); } void plat_video_toggle_renderer(int change, int is_menu) @@ -127,8 +127,8 @@ void plat_video_toggle_renderer(int change, int is_menu) void plat_status_msg_clear(void) { - unsigned short *d = (unsigned short *)g_screen_ptr + g_screen_width * g_screen_height; - int l = g_screen_width * 8; + unsigned short *d = (unsigned short *)g_screen_ptr + g_screen_ppitch * g_screen_height; + int l = g_screen_ppitch * 8; memset32((int *)(d - l), 0, l * 2 / 4); } @@ -143,7 +143,7 @@ void plat_status_msg_busy_next(const char *msg) void plat_status_msg_busy_first(const char *msg) { -// memset32(g_screen_ptr, 0, g_screen_width * g_screen_height * 2 / 4); +// memset32(g_screen_ptr, 0, g_screen_ppitch * g_screen_height * 2 / 4); plat_status_msg_busy_next(msg); } @@ -153,7 +153,7 @@ void plat_update_volume(int has_changed, int is_up) void pemu_forced_frame(int no_scale, int do_emu) { - PicoDrawSetOutBuf(g_screen_ptr, g_screen_width * 2); + PicoDrawSetOutBuf(g_screen_ptr, g_screen_ppitch * 2); PicoDrawSetCallbacks(NULL, NULL); Pico.m.dirtyPal = 1; @@ -174,7 +174,7 @@ void plat_debug_cat(char *str) void emu_video_mode_change(int start_line, int line_count, int is_32cols) { // clear whole screen in all buffers - memset32(g_screen_ptr, 0, g_screen_width * g_screen_height * 2 / 4); + memset32(g_screen_ptr, 0, g_screen_ppitch * g_screen_height * 2 / 4); } void pemu_loop_prep(void) diff --git a/platform/linux/io.c b/platform/linux/io.c index edc5f6eb..57601ccc 100644 --- a/platform/linux/io.c +++ b/platform/linux/io.c @@ -134,7 +134,7 @@ static void xlib_update(void) XLockDisplay(xlib_display); xstatus = XPutImage(xlib_display, xlib_window, DefaultGC(xlib_display, 0), ximage, - 0, 0, 0, 0, g_screen_width, g_screen_height); + 0, 0, 0, 0, g_screen_ppitch, g_screen_height); if (xstatus != 0) fprintf(stderr, "XPutImage %d\n", xstatus); @@ -260,6 +260,7 @@ static void realloc_screen(void) int size = scr_w * scr_h * 2; g_screen_width = g_menuscreen_w = scr_w; g_screen_height = g_menuscreen_h = scr_h; + g_screen_ppitch = g_menuscreen_pp = scr_w; g_screen_ptr = realloc(g_screen_ptr, size); g_menubg_ptr = realloc(g_menubg_ptr, size); memset(g_screen_ptr, 0, size); @@ -275,7 +276,7 @@ void plat_video_flip(void) if (ximage == NULL) return; - pixel_count = g_screen_width * g_screen_height; + pixel_count = g_screen_ppitch * g_screen_height; image = (void *)ximage->data; if (current_bpp == 8) @@ -332,6 +333,7 @@ void plat_init(void) exit(1); g_screen_width = g_menuscreen_w = w; g_screen_height = g_menuscreen_h = h; + g_screen_ppitch = g_menuscreen_pp = w; g_menubg_ptr = realloc(g_menubg_ptr, w * g_screen_height * 2); #else realloc_screen(); diff --git a/platform/pandora/menu.c b/platform/pandora/menu.c index 9f451feb..867b5c0d 100644 --- a/platform/pandora/menu.c +++ b/platform/pandora/menu.c @@ -18,7 +18,7 @@ static int menu_loop_cscaler(int id, int keys) for (;;) { menu_draw_begin(0, 1); - memset(g_menuscreen_ptr, 0, g_menuscreen_w * g_menuscreen_h * 2); + menuscreen_memset_lines(g_menuscreen_ptr, 0, g_menuscreen_h); text_out16(2, 480 - 18, "%dx%d | d-pad to resize, R+d-pad to move", g_layer_cw, g_layer_ch); menu_draw_end(); diff --git a/platform/pandora/plat.c b/platform/pandora/plat.c index a2e70eb8..5f10b17b 100644 --- a/platform/pandora/plat.c +++ b/platform/pandora/plat.c @@ -488,7 +488,7 @@ void plat_init(void) exit(1); } - g_menuscreen_w = w; + g_menuscreen_w = g_menuscreen_pp = w; g_menuscreen_h = h; g_menuscreen_ptr = vout_fbdev_flip(main_fb); diff --git a/platform/win32/plat.c b/platform/win32/plat.c index 8abb0626..54af8292 100644 --- a/platform/win32/plat.c +++ b/platform/win32/plat.c @@ -75,7 +75,7 @@ void pemu_validate_config(void) void pemu_loop_prep(void) { PicoDrawSetOutFormat(PDF_RGB555, 1); - PicoDrawSetOutBuf(g_screen_ptr, g_screen_width * 2); + PicoDrawSetOutBuf(g_screen_ptr, g_screen_ppitch * 2); pemu_sound_start(); } From a0b95da11240b4e936e4bab64a002db394130bb0 Mon Sep 17 00:00:00 2001 From: notaz Date: Wed, 3 Jan 2018 03:00:32 +0200 Subject: [PATCH 2/4] libretro: pass required arg to VirtualProtect --- platform/libretro/libretro.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/libretro/libretro.c b/platform/libretro/libretro.c index 2bdd07d2..42d30c2d 100644 --- a/platform/libretro/libretro.c +++ b/platform/libretro/libretro.c @@ -451,7 +451,8 @@ int plat_mem_set_exec(void *ptr, size_t size) { int ret = -1; #ifdef _WIN32 - ret = VirtualProtect(ptr, size, PAGE_EXECUTE_READWRITE, 0); + DWORD oldProtect = 0; + ret = VirtualProtect(ptr, size, PAGE_EXECUTE_READWRITE, &oldProtect); if (ret == 0 && log_cb) log_cb(RETRO_LOG_ERROR, "VirtualProtect(%p, %d) failed: %d\n", ptr, (int)size, GetLastError()); From 48c9e01be8ad93a7902e22f9ad07aba4527e6572 Mon Sep 17 00:00:00 2001 From: notaz Date: Sat, 6 Jan 2018 21:29:59 +0200 Subject: [PATCH 3/4] improve 64bit portability for win64 mostly --- cpu/cz80/cz80.h | 8 +++++++- cpu/cz80/cz80macro.h | 2 +- cpu/fame/fame.h | 10 ++++++++-- cpu/fame/famec.c | 2 +- cpu/musashi/m68kcpu.h | 1 + pico/32x/draw.c | 2 +- pico/32x/memory.c | 4 ++-- pico/cd/memory.c | 12 ++++++------ pico/memory.c | 4 ++-- pico/memory.h | 4 +++- pico/pico_int.h | 1 - pico/pico_port.h | 6 ++++++ pico/sound/sound.c | 2 +- platform/libretro/libretro.c | 10 +++------- 14 files changed, 42 insertions(+), 26 deletions(-) diff --git a/cpu/cz80/cz80.h b/cpu/cz80/cz80.h index 9b97d3b4..f3f79b39 100644 --- a/cpu/cz80/cz80.h +++ b/cpu/cz80/cz80.h @@ -11,6 +11,12 @@ #ifndef CZ80_H #define CZ80_H +// uintptr_t +#include +#ifndef _MSC_VER +#include +#endif + #ifdef __cplusplus extern "C" { #endif @@ -44,7 +50,7 @@ extern "C" { #endif #ifndef FPTR -#define FPTR unsigned long +#define FPTR uintptr_t #endif /*************************************/ diff --git a/cpu/cz80/cz80macro.h b/cpu/cz80/cz80macro.h index 5adca13a..2e21d409 100644 --- a/cpu/cz80/cz80macro.h +++ b/cpu/cz80/cz80macro.h @@ -73,7 +73,7 @@ #define WRITE_MEM8(A, D) { \ unsigned short a = A; \ unsigned char d = D; \ - unsigned long v = z80_write_map[a >> Z80_MEM_SHIFT]; \ + uptr v = z80_write_map[a >> Z80_MEM_SHIFT]; \ if (map_flag_set(v)) \ ((z80_write_f *)(v << 1))(a, d); \ else \ diff --git a/cpu/fame/fame.h b/cpu/fame/fame.h index 0baabf26..aba9316e 100644 --- a/cpu/fame/fame.h +++ b/cpu/fame/fame.h @@ -9,6 +9,12 @@ #ifndef __FAME_H__ #define __FAME_H__ +// uintptr_t +#include +#ifndef _MSC_VER +#include +#endif + #ifdef __cplusplus extern "C" { #endif @@ -127,7 +133,7 @@ typedef struct signed int cycles_needed; unsigned short *PC; - unsigned long BasePC; + uintptr_t BasePC; unsigned int flag_C; unsigned int flag_V; unsigned int flag_NotZ; @@ -140,7 +146,7 @@ typedef struct unsigned char not_polling; unsigned char pad[3]; - unsigned long Fetch[M68K_FETCHBANK1]; + uintptr_t Fetch[M68K_FETCHBANK1]; } M68K_CONTEXT; typedef enum diff --git a/cpu/fame/famec.c b/cpu/fame/famec.c index 41620944..60a9e550 100644 --- a/cpu/fame/famec.c +++ b/cpu/fame/famec.c @@ -94,7 +94,7 @@ #define s16 signed short #define u32 unsigned int #define s32 signed int -#define uptr unsigned long +#define uptr uintptr_t /* typedef unsigned char u8; diff --git a/cpu/musashi/m68kcpu.h b/cpu/musashi/m68kcpu.h index 63055cbe..a1dff7de 100644 --- a/cpu/musashi/m68kcpu.h +++ b/cpu/musashi/m68kcpu.h @@ -142,6 +142,7 @@ /* Exception Vectors handled by emulation */ #define EXCEPTION_BUS_ERROR 2 /* This one is not emulated! */ #define EXCEPTION_ADDRESS_ERROR 3 /* This one is partially emulated (doesn't stack a proper frame yet) */ +#undef EXCEPTION_ILLEGAL_INSTRUCTION #define EXCEPTION_ILLEGAL_INSTRUCTION 4 #define EXCEPTION_ZERO_DIVIDE 5 #define EXCEPTION_CHK 6 diff --git a/pico/32x/draw.c b/pico/32x/draw.c index ee541bd9..2287e246 100644 --- a/pico/32x/draw.c +++ b/pico/32x/draw.c @@ -58,7 +58,7 @@ static void convert_pal555(int invert_prio) unsigned short t; \ int i; \ for (i = 320; i > 0; i--, pd++, p32x++, pmd++) { \ - t = pal[*(unsigned char *)((long)p32x ^ 1)]; \ + t = pal[*(unsigned char *)((uintptr_t)p32x ^ 1)]; \ if ((t & 0x20) || (*pmd & 0x3f) == mdbg) \ *pd = t; \ else \ diff --git a/pico/32x/memory.c b/pico/32x/memory.c index 706d820e..d9f18db5 100644 --- a/pico/32x/memory.c +++ b/pico/32x/memory.c @@ -1786,9 +1786,9 @@ void PicoMemSetup32x(void) cpu68k_map_set(m68k_write16_map, 0x880000, 0x880000 + rs - 1, PicoWrite16_cart, 1); #ifdef EMU_F68K // setup FAME fetchmap - PicoCpuFM68k.Fetch[0] = (unsigned long)Pico32xMem->m68k_rom; + PicoCpuFM68k.Fetch[0] = (uptr)Pico32xMem->m68k_rom; for (rs = 0x88; rs < 0x90; rs++) - PicoCpuFM68k.Fetch[rs] = (unsigned long)Pico.rom - 0x880000; + PicoCpuFM68k.Fetch[rs] = (uptr)Pico.rom - 0x880000; #endif // 32X ROM (banked) diff --git a/pico/cd/memory.c b/pico/cd/memory.c index 22694389..1c5dcf94 100644 --- a/pico/cd/memory.c +++ b/pico/cd/memory.c @@ -1168,29 +1168,29 @@ PICO_INTERNAL void PicoMemSetupCD(void) #ifdef __clang__ volatile // prevent strange relocs from clang #endif - unsigned long ptr_ram = (unsigned long)PicoMem.ram; + unsigned long ptr_ram = (uptr)PicoMem.ram; int i; // M68k // by default, point everything to fitst 64k of ROM (BIOS) for (i = 0; i < M68K_FETCHBANK1; i++) - PicoCpuFM68k.Fetch[i] = (unsigned long)Pico.rom - (i<<(24-FAMEC_FETCHBITS)); + PicoCpuFM68k.Fetch[i] = (uptr)Pico.rom - (i<<(24-FAMEC_FETCHBITS)); // now real ROM (BIOS) for (i = 0; i < M68K_FETCHBANK1 && (i<<(24-FAMEC_FETCHBITS)) < Pico.romsize; i++) - PicoCpuFM68k.Fetch[i] = (unsigned long)Pico.rom; + PicoCpuFM68k.Fetch[i] = (uptr)Pico.rom; // .. and RAM for (i = M68K_FETCHBANK1*14/16; i < M68K_FETCHBANK1; i++) PicoCpuFM68k.Fetch[i] = ptr_ram - (i<<(24-FAMEC_FETCHBITS)); // S68k // PRG RAM is default for (i = 0; i < M68K_FETCHBANK1; i++) - PicoCpuFS68k.Fetch[i] = (unsigned long)Pico_mcd->prg_ram - (i<<(24-FAMEC_FETCHBITS)); + PicoCpuFS68k.Fetch[i] = (uptr)Pico_mcd->prg_ram - (i<<(24-FAMEC_FETCHBITS)); // real PRG RAM for (i = 0; i < M68K_FETCHBANK1 && (i<<(24-FAMEC_FETCHBITS)) < 0x80000; i++) - PicoCpuFS68k.Fetch[i] = (unsigned long)Pico_mcd->prg_ram; + PicoCpuFS68k.Fetch[i] = (uptr)Pico_mcd->prg_ram; // WORD RAM 2M area for (i = M68K_FETCHBANK1*0x08/0x100; i < M68K_FETCHBANK1 && (i<<(24-FAMEC_FETCHBITS)) < 0xc0000; i++) - PicoCpuFS68k.Fetch[i] = (unsigned long)Pico_mcd->word_ram2M - 0x80000; + PicoCpuFS68k.Fetch[i] = (uptr)Pico_mcd->word_ram2M - 0x80000; // remap_word_ram() will setup word ram for both } #endif diff --git a/pico/memory.c b/pico/memory.c index c633c89b..a31a08e9 100644 --- a/pico/memory.c +++ b/pico/memory.c @@ -832,10 +832,10 @@ PICO_INTERNAL void PicoMemSetup(void) int i; // by default, point everything to first 64k of ROM for (i = 0; i < M68K_FETCHBANK1 * 0xe0 / 0x100; i++) - PicoCpuFM68k.Fetch[i] = (unsigned long)Pico.rom - (i<<(24-FAMEC_FETCHBITS)); + PicoCpuFM68k.Fetch[i] = (uptr)Pico.rom - (i<<(24-FAMEC_FETCHBITS)); // now real ROM for (i = 0; i < M68K_FETCHBANK1 && (i<<(24-FAMEC_FETCHBITS)) < Pico.romsize; i++) - PicoCpuFM68k.Fetch[i] = (unsigned long)Pico.rom; + PicoCpuFM68k.Fetch[i] = (uptr)Pico.rom; // RAM already set } #endif diff --git a/pico/memory.h b/pico/memory.h index ae7ae50d..eb440dd4 100644 --- a/pico/memory.h +++ b/pico/memory.h @@ -1,9 +1,11 @@ // memory map related stuff +#include "pico_port.h" + typedef unsigned char u8; typedef unsigned short u16; typedef unsigned int u32; -typedef unsigned long uptr; // unsigned pointer-sized int +typedef uintptr_t uptr; // unsigned pointer-sized int #define M68K_MEM_SHIFT 16 // minimum size we can map diff --git a/pico/pico_int.h b/pico/pico_int.h index 0b50e4b9..da0fbb90 100644 --- a/pico/pico_int.h +++ b/pico/pico_int.h @@ -11,7 +11,6 @@ #define PICO_INTERNAL_INCLUDED #include -#include #include #include "pico_port.h" #include "pico.h" diff --git a/pico/pico_port.h b/pico/pico_port.h index 70802202..e26e6ca2 100644 --- a/pico/pico_port.h +++ b/pico/pico_port.h @@ -1,6 +1,12 @@ #ifndef PICO_PORT_INCLUDED #define PICO_PORT_INCLUDED +// provide size_t, uintptr_t +#include +#if !(defined(_MSC_VER) && _MSC_VER < 1800) +#include +#endif + #if defined(__GNUC__) && defined(__i386__) #define REGPARM(x) __attribute__((regparm(x))) #else diff --git a/pico/sound/sound.c b/pico/sound/sound.c index fc71b741..95aac128 100644 --- a/pico/sound/sound.c +++ b/pico/sound/sound.c @@ -265,7 +265,7 @@ PICO_INTERNAL void PsndClear(void) memset32((int *) PicoIn.sndOut, 0, len); // assume PicoIn.sndOut to be aligned else { short *out = PicoIn.sndOut; - if ((long)out & 2) { *out++ = 0; len--; } + if ((uintptr_t)out & 2) { *out++ = 0; len--; } memset32((int *) out, 0, len/2); if (len & 1) out[len-1] = 0; } diff --git a/platform/libretro/libretro.c b/platform/libretro/libretro.c index 42d30c2d..9111048f 100644 --- a/platform/libretro/libretro.c +++ b/platform/libretro/libretro.c @@ -79,11 +79,7 @@ static void *vout_buf; static int vout_width, vout_height, vout_offset; static float user_vout_width = 0.0; -#ifdef _MSC_VER -static short sndBuffer[2*44100/50]; -#else -static short __attribute__((aligned(4))) sndBuffer[2*44100/50]; -#endif +static short ALIGNED(4) sndBuffer[2*44100/50]; static void snd_write(int len); @@ -375,7 +371,7 @@ void *plat_mmap(unsigned long addr, size_t size, int need_exec, int is_fixed) int flags = MAP_PRIVATE | MAP_ANONYMOUS; void *req, *ret; - req = (void *)addr; + req = (void *)(uintptr_t)addr; ret = mmap(req, size, PROT_READ | PROT_WRITE, flags, -1, 0); if (ret == MAP_FAILED) { if (log_cb) @@ -383,7 +379,7 @@ void *plat_mmap(unsigned long addr, size_t size, int need_exec, int is_fixed) return NULL; } - if (addr != 0 && ret != (void *)addr) { + if (addr != 0 && ret != (void *)(uintptr_t)addr) { if (log_cb) log_cb(RETRO_LOG_WARN, "warning: wanted to map @%08lx, got %p\n", addr, ret); From fda2f31020bf0d6cf7b5dd70ec01cf390b7e1483 Mon Sep 17 00:00:00 2001 From: notaz Date: Sun, 7 Jan 2018 01:20:00 +0200 Subject: [PATCH 4/4] drc: support ms ABI --- cpu/drc/emit_arm.c | 3 ++ cpu/drc/emit_x86.c | 103 +++++++++++++++++++++++++++++++++++---------- cpu/sh2/compiler.c | 21 ++++++--- 3 files changed, 99 insertions(+), 28 deletions(-) diff --git a/cpu/drc/emit_arm.c b/cpu/drc/emit_arm.c index 7b5566dd..91b47402 100644 --- a/cpu/drc/emit_arm.c +++ b/cpu/drc/emit_arm.c @@ -436,6 +436,9 @@ static int emith_xbranch(int cond, void *target, int is_call) #define emith_tst_r_r(d, s) \ EOP_TST_REG(A_COND_AL,d,s,A_AM1_LSL,0) +#define emith_tst_r_r_ptr(d, s) \ + emith_tst_r_r(d, s) + #define emith_teq_r_r(d, s) \ EOP_TEQ_REG(A_COND_AL,d,s,A_AM1_LSL,0) diff --git a/cpu/drc/emit_x86.c b/cpu/drc/emit_x86.c index 5362d9bd..865aab4b 100644 --- a/cpu/drc/emit_x86.c +++ b/cpu/drc/emit_x86.c @@ -64,20 +64,35 @@ enum { xAX = 0, xCX, xDX, xBX, xSP, xBP, xSI, xDI }; EMIT(op, u8); \ } while (0) -#define EMIT_MODRM(mod,r,rm) \ - EMIT(((mod)<<6) | ((r)<<3) | (rm), u8) +#define EMIT_MODRM(mod, r, rm) do { \ + assert((mod) < 4u); \ + assert((r) < 8u); \ + assert((rm) < 8u); \ + EMIT(((mod)<<6) | ((r)<<3) | (rm), u8); \ +} while (0) -#define EMIT_SIB(scale,index,base) \ - EMIT(((scale)<<6) | ((index)<<3) | (base), u8) +#define EMIT_SIB(scale, index, base) do { \ + assert((scale) < 4u); \ + assert((index) < 8u); \ + assert((base) < 8u); \ + EMIT(((scale)<<6) | ((index)<<3) | (base), u8); \ +} while (0) + +#define EMIT_SIB64(scale, index, base) \ + EMIT_SIB(scale, (index) & ~8u, (base) & ~8u) #define EMIT_REX(w,r,x,b) \ EMIT(0x40 | ((w)<<3) | ((r)<<2) | ((x)<<1) | (b), u8) #define EMIT_OP_MODRM(op,mod,r,rm) do { \ EMIT_OP(op); \ - EMIT_MODRM(mod, r, rm); \ + EMIT_MODRM(mod, (r), rm); \ } while (0) +// 64bit friendly, rm when everything is converted +#define EMIT_OP_MODRM64(op, mod, r, rm) \ + EMIT_OP_MODRM(op, mod, (r) & ~8u, (rm) & ~8u) + #define JMP8_POS(ptr) \ ptr = tcache_ptr; \ tcache_ptr += 2 @@ -95,8 +110,8 @@ enum { xAX = 0, xCX, xDX, xBX, xSP, xBP, xSI, xDI }; EMIT_OP_MODRM(0x8b, 3, dst, src) #define emith_move_r_r_ptr(dst, src) do { \ - EMIT_REX_FOR_PTR(); \ - EMIT_OP_MODRM(0x8b, 3, dst, src); \ + EMIT_REX_IF(1, dst, src); \ + EMIT_OP_MODRM64(0x8b, 3, dst, src); \ } while (0) #define emith_add_r_r(d, s) \ @@ -123,6 +138,11 @@ enum { xAX = 0, xCX, xDX, xBX, xSP, xBP, xSI, xDI }; #define emith_tst_r_r(d, s) \ EMIT_OP_MODRM(0x85, 3, s, d) /* TEST */ +#define emith_tst_r_r_ptr(d, s) do { \ + EMIT_REX_IF(1, s, d); \ + EMIT_OP_MODRM64(0x85, 3, s, d); /* TEST */ \ +} while (0) + #define emith_cmp_r_r(d, s) \ EMIT_OP_MODRM(0x39, 3, s, d) @@ -298,15 +318,15 @@ enum { xAX = 0, xCX, xDX, xBX, xSP, xBP, xSI, xDI }; } while (0) #define emith_add_r_r_ptr_imm(d, s, imm) do { \ - if (s != xSP) { \ - EMIT_REX_FOR_PTR(); \ - EMIT_OP_MODRM(0x8d, 2, d, s); /* lea */ \ + if ((s) != xSP) { \ + EMIT_REX_IF(1, d, s); \ + EMIT_OP_MODRM64(0x8d, 2, d, s); /* lea */ \ } \ else { \ if (d != s) \ emith_move_r_r_ptr(d, s); \ - EMIT_REX_FOR_PTR(); \ - EMIT_OP_MODRM(0x81, 3, 0, d); /* add */ \ + EMIT_REX_IF(1, 0, d); \ + EMIT_OP_MODRM64(0x81, 3, 0, d); /* add */ \ } \ EMIT(imm, s32); \ } while (0) @@ -455,10 +475,10 @@ enum { xAX = 0, xCX, xDX, xBX, xSP, xBP, xSI, xDI }; #define emith_deref_op(op, r, rs, offs) do { \ /* mov r <-> [ebp+#offs] */ \ if ((offs) >= 0x80) { \ - EMIT_OP_MODRM(op, 2, r, rs); \ + EMIT_OP_MODRM64(op, 2, r, rs); \ EMIT(offs, u32); \ } else { \ - EMIT_OP_MODRM(op, 1, r, rs); \ + EMIT_OP_MODRM64(op, 1, r, rs); \ EMIT(offs, u8); \ } \ } while (0) @@ -508,7 +528,7 @@ enum { xAX = 0, xCX, xDX, xBX, xSP, xBP, xSI, xDI }; emith_read_r_r_offs(r, CONTEXT_REG, offs) #define emith_ctx_read_ptr(r, offs) do { \ - EMIT_REX_FOR_PTR(); \ + EMIT_REX_IF(1, r, CONTEXT_REG); \ emith_deref_op(0x8b, r, CONTEXT_REG, offs); \ } while (0) @@ -652,10 +672,16 @@ enum { xAX = 0, xCX, xDX, xBX, xSP, xBP, xSI, xDI }; #ifdef __x86_64__ #define PTR_SCALE 3 -#define NA_TMP_REG xCX // non-arg tmp from reg_temp[] +#define NA_TMP_REG xAX // non-arg tmp from reg_temp[] -#define EMIT_REX_FOR_PTR() \ - EMIT_REX(1,0,0,0) +#define EMIT_REX_IF(w, r, rm) do { \ + int r_ = (r) > 7 ? 1 : 0; \ + int rm_ = (rm) > 7 ? 1 : 0; \ + if ((w) | r_ | rm_) \ + EMIT_REX(1, r_, 0, rm_); \ +} while (0) + +#ifndef _WIN32 #define host_arg2reg(rd, arg) \ switch (arg) { \ @@ -677,12 +703,43 @@ enum { xAX = 0, xCX, xDX, xBX, xSP, xBP, xSI, xDI }; emith_ret(); \ } -#else +#else // _WIN32 + +#define host_arg2reg(rd, arg) \ + switch (arg) { \ + case 0: rd = xCX; break; \ + case 1: rd = xDX; break; \ + case 2: rd = 8; break; \ + } + +#define emith_sh2_drc_entry() { \ + emith_push(xBX); \ + emith_push(xBP); \ + emith_push(xSI); \ + emith_push(xDI); \ + emith_add_r_r_ptr_imm(xSP, xSP, -8*5); \ +} + +#define emith_sh2_drc_exit() { \ + emith_add_r_r_ptr_imm(xSP, xSP, 8*5); \ + emith_pop(xDI); \ + emith_pop(xSI); \ + emith_pop(xBP); \ + emith_pop(xBX); \ + emith_ret(); \ +} + +#endif // _WIN32 + +#else // !__x86_64__ #define PTR_SCALE 2 #define NA_TMP_REG xBX // non-arg tmp from reg_temp[] -#define EMIT_REX_FOR_PTR() +#define EMIT_REX_IF(w, r, rm) do { \ + assert((u32)(r) < 8u); \ + assert((u32)(rm) < 8u); \ +} while (0) #define host_arg2reg(rd, arg) \ switch (arg) { \ @@ -728,9 +785,9 @@ enum { xAX = 0, xCX, xDX, xBX, xSP, xBP, xSI, xDI }; int arg2_; \ host_arg2reg(arg2_, 2); \ emith_lsr(NA_TMP_REG, a, SH2_WRITE_SHIFT); \ - EMIT_REX_FOR_PTR(); \ - EMIT_OP_MODRM(0x8b, 0, NA_TMP_REG, 4); \ - EMIT_SIB(PTR_SCALE, NA_TMP_REG, tab); /* mov tmp, [tab + tmp * {4,8}] */ \ + EMIT_REX_IF(1, NA_TMP_REG, tab); \ + EMIT_OP_MODRM64(0x8b, 0, NA_TMP_REG, 4); \ + EMIT_SIB64(PTR_SCALE, NA_TMP_REG, tab); /* mov tmp, [tab + tmp * {4,8}] */ \ emith_move_r_r_ptr(arg2_, CONTEXT_REG); \ emith_jump_reg(NA_TMP_REG); \ } diff --git a/cpu/sh2/compiler.c b/cpu/sh2/compiler.c index 3b6b45af..089f3ef1 100644 --- a/cpu/sh2/compiler.c +++ b/cpu/sh2/compiler.c @@ -313,9 +313,9 @@ static const int reg_map_g2h[] = { xSI,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, - -1, -1, -1, xDI, - -1, -1, -1, -1, + -1, -1, -1, -1, // r12 .. sp + -1, -1, -1, xDI, // SHR_PC, SHR_PPC, SHR_PR, SHR_SR, + -1, -1, -1, -1, // SHR_GBR, SHR_VBR, SHR_MACH, SHR_MACL, }; // ax, cx, dx are usually temporaries by convention @@ -330,12 +330,21 @@ static temp_reg_t reg_temp[] = { #include "../drc/emit_x86.c" static const int reg_map_g2h[] = { +#ifndef _WIN32 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, // r12 .. sp + -1, -1, -1, xBX, // SHR_PC, SHR_PPC, SHR_PR, SHR_SR, + -1, -1, -1, -1, // SHR_GBR, SHR_VBR, SHR_MACH, SHR_MACL, +#else + xDI,-1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, xBX, -1, -1, -1, -1, + -1, -1, -1, -1, // r12 .. sp + -1, -1, -1, xBX, // SHR_PC, SHR_PPC, SHR_PR, SHR_SR, + -1, -1, -1, -1, // SHR_GBR, SHR_VBR, SHR_MACH, SHR_MACL, +#endif }; // ax, cx, dx are usually temporaries by convention @@ -344,7 +353,9 @@ static temp_reg_t reg_temp[] = { { xCX, }, { xDX, }, { xSI, }, +#ifndef _WIN32 { xDI, }, +#endif }; #else @@ -1400,7 +1411,7 @@ static void emit_block_entry(void) emith_call(sh2_drc_log_entry); rcache_invalidate(); #endif - emith_tst_r_r(RET_REG, RET_REG); + emith_tst_r_r_ptr(RET_REG, RET_REG); EMITH_SJMP_START(DCOND_EQ); emith_jump_reg_c(DCOND_NE, RET_REG); EMITH_SJMP_END(DCOND_EQ);