DSP LLE: MAJOR LLE revamp. Interpreter/JIT infrastructure done. Still left to mix and match the correct functions to the correct instruction hexcodes. More changes:

-Tagged unimplemented instructions and FIXME instructions in the DSP interpreter header
-Expanded the DSP instruction union to be viewable as helpful instruction structures

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@2817 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
XTra.KrazzY 2009-04-01 20:22:43 +00:00
parent f34155ca98
commit e099934a85
16 changed files with 1962 additions and 2701 deletions

View File

@ -588,18 +588,34 @@
RelativePath=".\Src\disassemble.h"
>
</File>
<File
RelativePath=".\Src\opcodes.cpp"
>
</File>
<File
RelativePath=".\Src\opcodes.h"
>
</File>
</Filter>
<Filter
Name="DSP"
>
<File
RelativePath=".\Src\DSPInterpreter.cpp"
>
</File>
<File
RelativePath=".\Src\DSPInterpreter.h"
>
</File>
<File
RelativePath=".\Src\DSPJit.cpp"
>
</File>
<File
RelativePath=".\Src\DSPJit.h"
>
</File>
<File
RelativePath=".\Src\DSPTables.cpp"
>
</File>
<File
RelativePath=".\Src\DSPTables.h"
>
</File>
<File
RelativePath=".\Src\gdsp_aram.cpp"
>
@ -644,14 +660,6 @@
RelativePath=".\Src\gdsp_memory.h"
>
</File>
<File
RelativePath=".\Src\gdsp_opcodes.cpp"
>
</File>
<File
RelativePath=".\Src\gdsp_opcodes.h"
>
</File>
<File
RelativePath=".\Src\gdsp_opcodes_helper.h"
>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,133 @@
// Copyright (C) 2003-2009 Dolphin Project.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 2.0.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
#ifndef _DSPINTERPRETER_H
#define _DSPINTERPRETER_H
#include "DSPTables.h"
#define SR_CMP_MASK 0x3f
#define DSP_REG_MASK 0x1f
#define R_SR 0x13
#define FLAG_ENABLE_INTERUPT 11
namespace DSPInterpreter {
// GLOBAL HELPER FUNCTIONS
void Update_SR_Register(s64 _Value);
s8 GetMultiplyModifier();
// END OF HELPER FUNCTIONS
void unknown(UDSPInstruction& opc);
void call(UDSPInstruction& opc);
void ifcc(UDSPInstruction& opc);
void jcc(UDSPInstruction& opc);
void ret(UDSPInstruction& opc);
void halt(UDSPInstruction& opc);
void loop(UDSPInstruction& opc);
void loopi(UDSPInstruction& opc);
void bloop(UDSPInstruction& opc);
void bloopi(UDSPInstruction& opc);
void mrr(UDSPInstruction& opc);
void lrr(UDSPInstruction& opc);
void srr(UDSPInstruction& opc);
void lri(UDSPInstruction& opc);
void lris(UDSPInstruction& opc);
void lr(UDSPInstruction& opc);
void sr(UDSPInstruction& opc);
void si(UDSPInstruction& opc);
void tstaxh(UDSPInstruction& opc);
void clr(UDSPInstruction& opc);
void clrp(UDSPInstruction& opc);
void mulc(UDSPInstruction& opc);
void cmpar(UDSPInstruction& opc);
void cmp(UDSPInstruction& opc);
void tsta(UDSPInstruction& opc);
void addaxl(UDSPInstruction& opc);
void addarn(UDSPInstruction& opc);
void mulcac(UDSPInstruction& opc);
void movr(UDSPInstruction& opc);
void movax(UDSPInstruction& opc);
void xorr(UDSPInstruction& opc);
void andr(UDSPInstruction& opc);
void orr(UDSPInstruction& opc);
void andc(UDSPInstruction& opc);
void add(UDSPInstruction& opc);
void addp(UDSPInstruction& opc);
void cmpis(UDSPInstruction& opc);
void addpaxz(UDSPInstruction& opc);
void movpz(UDSPInstruction& opc);
void decm(UDSPInstruction& opc);
void dec(UDSPInstruction& opc);
void inc(UDSPInstruction& opc);
void incm(UDSPInstruction& opc);
void neg(UDSPInstruction& opc);
void addax(UDSPInstruction& opc);
void addr(UDSPInstruction& opc);
void subr(UDSPInstruction& opc);
void subax(UDSPInstruction& opc);
void addis(UDSPInstruction& opc);
void addi(UDSPInstruction& opc);
void lsl16(UDSPInstruction& opc);
void madd(UDSPInstruction& opc);
void lsr16(UDSPInstruction& opc);
void asr16(UDSPInstruction& opc);
void shifti(UDSPInstruction& opc);
void dar(UDSPInstruction& opc);
void iar(UDSPInstruction& opc);
void sbclr(UDSPInstruction& opc);
void sbset(UDSPInstruction& opc);
void movp(UDSPInstruction& opc);
void mul(UDSPInstruction& opc);
void mulac(UDSPInstruction& opc);
void mulmv(UDSPInstruction& opc);
void mulmvz(UDSPInstruction& opc);
void mulx(UDSPInstruction& opc);
void mulxac(UDSPInstruction& opc);
void mulxmv(UDSPInstruction& opc);
void mulxmvz(UDSPInstruction& opc);
void sub(UDSPInstruction& opc);
void maddx(UDSPInstruction& opc);
void msubx(UDSPInstruction& opc);
void maddc(UDSPInstruction& opc);
void msubc(UDSPInstruction& opc);
// FIXME inside
void jmpa(UDSPInstruction& opc);
void rti(UDSPInstruction& opc);
void ilrr(UDSPInstruction& opc);
void srbith(UDSPInstruction& opc);
void andfc(UDSPInstruction& opc);
void andf(UDSPInstruction& opc);
void subf(UDSPInstruction& opc);
void xori(UDSPInstruction& opc);
void andi(UDSPInstruction& opc);
void ori(UDSPInstruction& opc);
// END OF FIXMEs
// TODO: PENDING IMPLEMENTATION / UNIMPLEMENTED
void mulcmvz(UDSPInstruction& opc);
void mulcmv(UDSPInstruction& opc);
void nx(UDSPInstruction& opc);
void movnp(UDSPInstruction& opc);
// END OF UNIMPLEMENTED
};
#endif // _DSPINTERPRETER_H

View File

@ -0,0 +1,22 @@
// Copyright (C) 2003-2009 Dolphin Project.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 2.0.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
#include "DSPJit.h"
namespace DSPJit {
};

View File

@ -0,0 +1,27 @@
// Copyright (C) 2003-2009 Dolphin Project.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 2.0.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
#ifndef _DSPJIT_H
#define _DSPJIT_H
namespace DSPJit {
// TODO(XK): Fill
};
#endif // _DSPJIT_H

View File

@ -1,46 +1,44 @@
/*====================================================================
// Copyright (C) 2003-2009 Dolphin Project.
filename: opcodes.cpp
project: GameCube DSP Tool (gcdsp)
created: 2005.03.04
mail: duddie@walla.com
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 2.0.
Copyright (c) 2005 Duddie
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License 2.0 for more details.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
====================================================================*/
// Additional copyrights go to Duddie (c) 2005 (duddie@walla.com)
#include "Globals.h"
#include "opcodes.h"
#include "DSPTables.h"
#include "DSPInterpreter.h"
#include "DSPJit.h"
void unimplementedInst(UDSPInstruction& inst) {
PanicAlert("Unimplemented instruction %d", inst.hex);
PanicAlert("Unimplemented instruction %d", inst.hex);
}
void nop(UDSPInstruction&) {}
// TODO(XK): Fill up the tables with the corresponding instructions
DSPOPCTemplate opcodes[] =
{
{"NOP", 0x0000, 0xffff, nop, nop, 1, 0, {},},
{"HALT", 0x0021, 0xffff, nop, nop, 1, 0, {},},
{"RET", 0x02df, 0xffff, nop, nop, 1, 0, {},},
{"NOP", 0x0000, 0xffff, nop, nop, 1, 0, {},},
{"HALT", 0x0021, 0xffff, DSPInterpreter::halt, nop, 1, 0, {},},
{"RET", 0x02df, 0xffff, DSPInterpreter::ret, nop, 1, 0, {},},
{"RETEQ", 0x02d5, 0xffff, nop, nop, 1, 0, {},},
{"RETNZ", 0x02dd, 0xffff, nop, nop, 1, 0, {},},
{"RTI", 0x02ff, 0xffff, nop, nop, 1, 0, {},},
{"CALL", 0x02bf, 0xffff, nop, nop, 2, 1, {{P_VAL, 2, 1, 0, 0xffff}},},
{"RTI", 0x02ff, 0xffff, DSPInterpreter::rti, nop, 1, 0, {},},
{"CALL", 0x02bf, 0xffff, DSPInterpreter::call, nop, 2, 1, {{P_VAL, 2, 1, 0, 0xffff}},},
{"CALLNE", 0x02b4, 0xffff, nop, nop, 2, 1, {{P_VAL, 2, 1, 0, 0xffff}},},
@ -241,3 +239,15 @@ DSPOPCTemplate opcodes_ext[] =
const u32 opcodes_size = sizeof(opcodes) / sizeof(opc_t);
const u32 opcodes_ext_size = sizeof(opcodes_ext) / sizeof(opc_t);
void InitInstructionTable() {
// TODO(XK): Fill
}
void DestroyInstructionTable() {
// TODO(XK): Fill
}
void ComputeInstruction(UDSPInstruction& inst) {
// TODO(XK): Fill
DSPInterpreter::unknown(inst);
}

View File

@ -0,0 +1,108 @@
// Copyright (C) 2003-2009 Dolphin Project.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 2.0.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
// Additional copyrights go to Duddie (c) 2005 (duddie@walla.com)
#ifndef _DSPTABLES_H
#define _DSPTABLES_H
enum parameterType
{
P_NONE = 0x0000,
P_VAL = 0x0001,
P_IMM = 0x0002,
P_MEM = 0x0003,
P_STR = 0x0004,
P_REG = 0x8000,
P_REG08 = P_REG | 0x0800,
P_REG10 = P_REG | 0x1000,
P_REG18 = P_REG | 0x1800,
P_REG19 = P_REG | 0x1900,
P_REG1A = P_REG | 0x1a00,
P_REG1C = P_REG | 0x1c00,
P_ACCM = P_REG | 0x1e00,
P_ACCM_D = P_REG | 0x1e80,
P_ACC = P_REG | 0x2000,
P_ACC_D = P_REG | 0x2080,
P_AX = P_REG | 0x2200,
P_AX_D = P_REG | 0x2280,
P_REGS_MASK = 0x03f80,
P_REF = P_REG | 0x4000,
P_PRG = P_REF | P_REG,
};
#define P_EXT 0x80
union UDSPInstruction
{
u16 hex;
UDSPInstruction(u16 _hex) { hex = _hex; }
UDSPInstruction() { hex = 0; }
struct
{
signed shift : 6;
unsigned negating : 1;
unsigned arithmetic : 1;
unsigned areg : 1;
unsigned op : 7;
};
struct
{
unsigned ushift : 6;
};
// TODO(XK): Figure out more instruction structures (add structs here)
};
typedef void (*dspInstFunc)(UDSPInstruction&);
typedef struct DSPOParams
{
parameterType type;
u8 size;
u8 loc;
s8 lshift;
u16 mask;
} opcpar_t;
typedef struct DSPOPCTemplate
{
const char *name;
u16 opcode;
u16 opcode_mask;
dspInstFunc interpFunc;
dspInstFunc jitFunc;
u8 size;
u8 param_count;
DSPOParams params[8];
} opc_t;
extern DSPOPCTemplate opcodes[];
extern const u32 opcodes_size;
extern opc_t opcodes_ext[];
extern const u32 opcodes_ext_size;
void InitInstructionTable();
void DestroyInstructionTable();
void ComputeInstruction(UDSPInstruction& inst);
#endif // _DSPTABLES_H

View File

@ -20,6 +20,10 @@
#endif
#include "Globals.h"
#include "HLE_Helper.h"
#include "DSPInterpreter.h"
// Avoid adding "DSPInterpreter::" to every instruction
using namespace DSPInterpreter;
u16& R00 = g_dsp.r[0x00];

View File

@ -22,8 +22,6 @@
bool WriteDMEM(u16 addr, u16 val);
u16 ReadDMEM(u16 addr);
void Update_SR_Register(s64 _Value);
s8 GetMultiplyModifier();
template<unsigned N>
class TAccumulator

View File

@ -30,7 +30,7 @@
#include "Globals.h"
#include "disassemble.h"
#include "opcodes.h"
#include "DSPTables.h"
// #include "gdsp_tool.h"
#ifdef _MSC_VER
@ -39,8 +39,6 @@
u32 unk_opcodes[0x10000];
u16 swap16(u16 x);
// predefined labels
typedef struct pdlabel_t
@ -289,7 +287,7 @@ u16 gd_dis_get_opcode_size(gd_globals_t* gdg)
return(1);
}
u32 op1 = swap16(gdg->binbuf[gdg->pc & 0x0fff]);
u32 op1 = Common::swap16(gdg->binbuf[gdg->pc & 0x0fff]);
for (u32 j = 0; j < opcodes_size; j++)
{
@ -371,7 +369,7 @@ char* gd_dis_opcode(gd_globals_t* gdg)
}
pc &= 0x0fff;
op1 = swap16(gdg->binbuf[pc]);
op1 = Common::swap16(gdg->binbuf[pc]);
// find opcode
for (j = 0; j < opcodes_size; j++)
@ -425,7 +423,7 @@ char* gd_dis_opcode(gd_globals_t* gdg)
if ((opc->size & ~P_EXT) == 2)
{
op2 = swap16(gdg->binbuf[pc + 1]);
op2 = Common::swap16(gdg->binbuf[pc + 1]);
if (gdg->show_hex){sprintf(buf, "%04x %04x ", op1, op2);}
}

View File

@ -1,4 +1,3 @@
// April Fools!
/*====================================================================
filename: gdsp_interpreter.cpp
@ -27,6 +26,8 @@
#include <stdio.h>
#include <stdlib.h>
#include "DSPTables.h"
#include "gdsp_interface.h"
#include "gdsp_opcodes_helper.h"
#include "Tools.h"
@ -67,23 +68,13 @@ void UpdateCachedCR()
CR_EXTERNAL_INT = (g_dsp.cr & 0x02) != 0;
}
//-------------------------------------------------------------------------------
void (*dsp_op[])(u16 opc) =
{
dsp_op0, dsp_op1, dsp_op2, dsp_op3,
dsp_op4, dsp_op5, dsp_op6, dsp_op7,
dsp_op8, dsp_op9, dsp_opab, dsp_opab,
dsp_opcd, dsp_opcd, dsp_ope, dsp_opf,
};
void dbg_error(char* err_msg)
{
return;
}
void gdsp_init()
{
g_dsp.irom = (u16*)malloc(DSP_IROM_SIZE * sizeof(u16));
@ -218,7 +209,7 @@ void gdsp_loop_step()
{
g_dsp.err_pc = g_dsp.pc;
u16 opc = dsp_fetch_code();
dsp_op[opc >> 12](opc);
ComputeInstruction(UDSPInstruction(opc));
}
u16 HLE_ROM_80E7_81F8();
@ -249,7 +240,7 @@ void gdsp_step()
#endif
u16 opc = dsp_fetch_code();
dsp_op[opc >> 12](opc);
ComputeInstruction(UDSPInstruction(opc));
u16& rLoopCounter = g_dsp.r[DSP_REG_ST0 + 3];

File diff suppressed because it is too large Load Diff

View File

@ -1,67 +0,0 @@
// Copyright (C) 2003-2009 Dolphin Project.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, version 2.0.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official SVN repository and contact information can be found at
// http://code.google.com/p/dolphin-emu/
/*====================================================================
filename: gdsp_opcodes.h
project: GCemu
created: 2004-6-18
mail: duddie@walla.com
Copyright (c) 2005 Duddie & Tratax
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
====================================================================*/
#ifndef _GDSP_OPCODES_H
#define _GDSP_OPCODES_H
#include "Globals.h"
void dsp_op0(u16 opc);
void dsp_op1(u16 opc);
void dsp_op2(u16 opc);
void dsp_op3(u16 opc);
void dsp_op4(u16 opc);
void dsp_op5(u16 opc);
void dsp_op6(u16 opc);
void dsp_op7(u16 opc);
void dsp_op8(u16 opc);
void dsp_op9(u16 opc);
void dsp_opab(u16 opc);
void dsp_opcd(u16 opc);
void dsp_ope(u16 opc);
void dsp_opf(u16 opc);
#define R_SR 0x13
#define FLAG_ENABLE_INTERUPT 11
#endif

View File

@ -28,7 +28,8 @@
#include "Globals.h"
#include "gdsp_opcodes.h"
#include "DSPInterpreter.h"
#include "gdsp_memory.h"
#include "gdsp_interpreter.h"
#include "gdsp_registers.h"

View File

@ -32,6 +32,8 @@
#include "Thread.h"
#include "ChunkFile.h"
#include "DSPTables.h"
#if defined(HAVE_WX) && HAVE_WX
#include "DSPConfigDlgLLE.h"
#include "Debugger/Debugger.h" // For the CDebugger class
@ -243,6 +245,8 @@ void Initialize(void *init)
g_hDSPThread = new Common::Thread(dsp_thread, NULL);
soundStream = AudioCommon::InitSoundStream();
InitInstructionTable();
}
void DSP_StopSoundStream()
@ -255,6 +259,7 @@ void Shutdown(void)
{
bIsRunning = false;
gdsp_stop();
DestroyInstructionTable();
AudioCommon::ShutdownSoundStream();
}

View File

@ -1,102 +0,0 @@
/*====================================================================
filename: opcodes.h
project: GameCube DSP Tool (gcdsp)
created: 2005.03.04
mail: duddie@walla.com
Copyright (c) 2005 Duddie
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
====================================================================*/
#ifndef _OPCODES_H
#define _OPCODES_H
enum parameterType
{
P_NONE = 0x0000,
P_VAL = 0x0001,
P_IMM = 0x0002,
P_MEM = 0x0003,
P_STR = 0x0004,
P_REG = 0x8000,
P_REG08 = P_REG | 0x0800,
P_REG10 = P_REG | 0x1000,
P_REG18 = P_REG | 0x1800,
P_REG19 = P_REG | 0x1900,
P_REG1A = P_REG | 0x1a00,
P_REG1C = P_REG | 0x1c00,
P_ACCM = P_REG | 0x1e00,
P_ACCM_D = P_REG | 0x1e80,
P_ACC = P_REG | 0x2000,
P_ACC_D = P_REG | 0x2080,
P_AX = P_REG | 0x2200,
P_AX_D = P_REG | 0x2280,
P_REGS_MASK = 0x03f80,
P_REF = P_REG | 0x4000,
P_PRG = P_REF | P_REG,
};
#define P_EXT 0x80
union UDSPInstruction
{
u16 hex;
UDSPInstruction(u16 _hex) { hex = _hex; }
UDSPInstruction() { hex = 0; }
// TODO(XK): Figure out the instruction structure better (add structs here)
};
typedef void (*dspInstFunc)(UDSPInstruction&);
typedef struct DSPOParams
{
parameterType type;
u8 size;
u8 loc;
s8 lshift;
u16 mask;
} opcpar_t;
typedef struct DSPOPCTemplate
{
const char *name;
u16 opcode;
u16 opcode_mask;
dspInstFunc interpFunc;
dspInstFunc jitFunc;
u8 size;
u8 param_count;
DSPOParams params[8];
} opc_t;
extern DSPOPCTemplate opcodes[];
extern const u32 opcodes_size;
extern opc_t opcodes_ext[];
extern const u32 opcodes_ext_size;
inline u16 swap16(u16 x)
{
return((x >> 8) | (x << 8));
}
#endif