mirror of
https://github.com/FunKey-Project/picodrive-irixxxx.git
synced 2026-09-16 20:32:09 +02:00
This commit is contained in:
@@ -11,6 +11,12 @@
|
||||
#ifndef CZ80_H
|
||||
#define CZ80_H
|
||||
|
||||
// uintptr_t
|
||||
#include <stdlib.h>
|
||||
#ifndef _MSC_VER
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
@@ -44,7 +50,7 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef FPTR
|
||||
#define FPTR unsigned long
|
||||
#define FPTR uintptr_t
|
||||
#endif
|
||||
|
||||
/*************************************/
|
||||
|
||||
@@ -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 \
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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); \
|
||||
}
|
||||
|
||||
@@ -9,6 +9,12 @@
|
||||
#ifndef __FAME_H__
|
||||
#define __FAME_H__
|
||||
|
||||
// uintptr_t
|
||||
#include <stdlib.h>
|
||||
#ifndef _MSC_VER
|
||||
#include <stdint.h>
|
||||
#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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 \
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
#define PICO_INTERNAL_INCLUDED
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "pico_port.h"
|
||||
#include "pico.h"
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
#ifndef PICO_PORT_INCLUDED
|
||||
#define PICO_PORT_INCLUDED
|
||||
|
||||
// provide size_t, uintptr_t
|
||||
#include <stdlib.h>
|
||||
#if !(defined(_MSC_VER) && _MSC_VER < 1800)
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
|
||||
#if defined(__GNUC__) && defined(__i386__)
|
||||
#define REGPARM(x) __attribute__((regparm(x)))
|
||||
#else
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user