2013-10-28 19:13:01 +00:00
using System ;
2014-05-19 01:06:44 +00:00
using LuaInterface ;
2014-05-23 23:19:20 +00:00
using BizHawk.Emulation.Common ;
2014-05-19 01:06:44 +00:00
2013-11-01 14:51:51 +00:00
namespace BizHawk.Client.Common
2013-10-28 19:13:01 +00:00
{
2014-06-01 22:02:59 +00:00
public sealed class MemoryLuaLibrary : LuaMemoryBase
2013-10-28 19:13:01 +00:00
{
2014-05-23 23:19:20 +00:00
private int _currentMemoryDomain ; // Main memory by default probably (index 0 is currently always main memory but may never be)
2013-10-31 16:10:20 +00:00
2014-05-19 01:06:44 +00:00
public MemoryLuaLibrary ( Lua lua )
2014-05-21 00:17:35 +00:00
: base ( lua ) { }
public MemoryLuaLibrary ( Lua lua , Action < string > logOutputCallback )
: base ( lua , logOutputCallback ) { }
2014-05-19 01:06:44 +00:00
2014-02-03 20:48:01 +00:00
public override string Name { get { return "memory" ; } }
2014-05-23 23:19:20 +00:00
protected override MemoryDomain Domain
2013-10-28 19:13:01 +00:00
{
2014-05-23 23:19:20 +00:00
get { return Global . Emulator . MemoryDomains [ _currentMemoryDomain ] ; }
2013-10-28 19:13:01 +00:00
}
2014-05-23 23:19:20 +00:00
#region Unique Library Methods
2013-10-28 19:13:01 +00:00
2014-01-26 02:43:28 +00:00
[ LuaMethodAttributes (
"getmemorydomainlist" ,
2014-01-26 18:36:27 +00:00
"Returns a string of the memory domains for the loaded platform core. List will be a single string delimited by line feeds"
2014-01-26 02:43:28 +00:00
) ]
2014-05-19 01:06:44 +00:00
public LuaTable GetMemoryDomainList ( )
2013-10-28 19:13:01 +00:00
{
2014-05-20 20:34:51 +00:00
var table = Lua . NewTable ( ) ;
2014-05-19 01:06:44 +00:00
for ( int i = 0 ; i < Global . Emulator . MemoryDomains . Count ; i + + )
{
table [ i ] = Global . Emulator . MemoryDomains [ i ] . Name ;
}
return table ;
2013-10-28 19:13:01 +00:00
}
2014-01-26 02:43:28 +00:00
[ LuaMethodAttributes (
"getcurrentmemorydomain" ,
2014-01-26 18:36:27 +00:00
"Returns a string name of the current memory domain selected by Lua. The default is Main memory"
2014-01-26 02:43:28 +00:00
) ]
public string GetCurrentMemoryDomain ( )
2013-10-28 19:13:01 +00:00
{
2014-05-23 23:19:20 +00:00
return Domain . Name ;
2013-10-28 19:13:01 +00:00
}
2014-01-26 02:43:28 +00:00
[ LuaMethodAttributes (
"getcurrentmemorydomainsize" ,
2014-01-26 18:36:27 +00:00
"Returns the number of bytes of the current memory domain selected by Lua. The default is Main memory"
2014-01-26 02:43:28 +00:00
) ]
public int GetCurrentMemoryDomainSize ( )
2013-10-28 19:13:01 +00:00
{
2014-05-23 23:19:20 +00:00
return Domain . Size ;
2013-10-28 19:13:01 +00:00
}
2014-01-26 02:43:28 +00:00
[ LuaMethodAttributes (
2014-05-23 23:19:20 +00:00
"usememorydomain" ,
"Attempts to set the current memory domain to the given domain. If the name does not match a valid memory domain, the function returns false, else it returns true"
2014-01-26 02:43:28 +00:00
) ]
2014-05-23 23:19:20 +00:00
public bool UseMemoryDomain ( string domain )
2013-10-28 19:13:01 +00:00
{
2014-05-23 23:19:20 +00:00
for ( var i = 0 ; i < Global . Emulator . MemoryDomains . Count ; i + + )
{
if ( Global . Emulator . MemoryDomains [ i ] . Name = = domain )
{
_currentMemoryDomain = i ;
return true ;
}
}
return false ;
2013-10-28 19:13:01 +00:00
}
2014-05-23 23:19:20 +00:00
#endregion
#region Common Special and Legacy Methods
2014-01-26 02:43:28 +00:00
[ LuaMethodAttributes (
2014-05-23 23:19:20 +00:00
"readbyte" ,
"gets the value from the given address as an unsigned byte"
2014-01-26 02:43:28 +00:00
) ]
2014-05-23 23:19:20 +00:00
public uint ReadByte ( int addr )
2013-10-28 19:13:01 +00:00
{
2014-05-23 23:19:20 +00:00
return ReadUnsignedByte ( addr ) ;
2013-10-28 19:13:01 +00:00
}
2014-01-26 02:43:28 +00:00
[ LuaMethodAttributes (
"writebyte" ,
2014-01-26 18:36:27 +00:00
"Writes the given value to the given address as an unsigned byte"
2014-01-26 02:43:28 +00:00
) ]
2014-01-27 01:15:56 +00:00
public void WriteByte ( int addr , uint value )
2013-10-28 19:13:01 +00:00
{
2014-01-27 01:15:56 +00:00
WriteUnsignedByte ( addr , value ) ;
2013-10-28 19:13:01 +00:00
}
2014-01-26 02:43:28 +00:00
[ LuaMethodAttributes (
2014-05-23 23:19:20 +00:00
"readbyterange" ,
"Reads the address range that starts from address, and is length long. Returns the result into a table of key value pairs (where the address is the key)."
2014-01-26 02:43:28 +00:00
) ]
2014-05-23 23:19:20 +00:00
public new LuaTable ReadByteRange ( int addr , int length )
2013-10-28 19:13:01 +00:00
{
2014-05-23 23:19:20 +00:00
return base . ReadByteRange ( addr , length ) ;
2013-10-28 19:13:01 +00:00
}
2014-01-26 02:43:28 +00:00
[ LuaMethodAttributes (
2014-05-23 23:19:20 +00:00
"writebyterange" ,
"Writes the given values to the given addresses as unsigned bytes"
2014-01-26 02:43:28 +00:00
) ]
2014-05-23 23:19:20 +00:00
public new void WriteByteRange ( LuaTable memoryblock )
2013-10-28 19:13:01 +00:00
{
2014-05-23 23:19:20 +00:00
base . WriteByteRange ( memoryblock ) ;
2013-10-28 19:13:01 +00:00
}
2014-01-26 02:43:28 +00:00
[ LuaMethodAttributes (
2014-05-23 23:19:20 +00:00
"readfloat" ,
"Reads the given address as a 32-bit float value from the main memory domain with th e given endian"
2014-01-26 02:43:28 +00:00
) ]
2014-05-23 23:19:20 +00:00
public new float ReadFloat ( int addr , bool bigendian )
2013-10-28 19:13:01 +00:00
{
2014-05-23 23:19:20 +00:00
return base . ReadFloat ( addr , bigendian ) ;
2013-10-28 19:13:01 +00:00
}
2014-01-26 02:43:28 +00:00
[ LuaMethodAttributes (
2014-05-23 23:19:20 +00:00
"writefloat" ,
"Writes the given 32-bit float value to the given address and endian"
2014-01-26 02:43:28 +00:00
) ]
2014-05-23 23:19:20 +00:00
public new void WriteFloat ( int addr , double value , bool bigendian )
2013-10-28 19:13:01 +00:00
{
2014-05-23 23:19:20 +00:00
base . WriteFloat ( addr , value , bigendian ) ;
2013-10-28 19:13:01 +00:00
}
2014-05-23 23:19:20 +00:00
#endregion
#region 1 Byte
[LuaMethodAttributes("read_s8", "read signed byte")]
public int ReadS8 ( int addr )
2013-10-28 19:13:01 +00:00
{
2014-05-23 23:19:20 +00:00
return ( sbyte ) ReadUnsignedByte ( addr ) ;
2013-10-28 19:13:01 +00:00
}
2014-05-23 23:19:20 +00:00
[LuaMethodAttributes("write_s8", "write signed byte")]
public void WriteS8 ( int addr , uint value )
2013-10-28 19:13:01 +00:00
{
2014-05-23 23:19:20 +00:00
WriteUnsignedByte ( addr , value ) ;
2013-10-28 19:13:01 +00:00
}
2014-05-23 23:19:20 +00:00
[LuaMethodAttributes("read_u8", "read unsigned byte")]
public uint ReadU8 ( int addr )
2013-10-28 19:13:01 +00:00
{
2014-05-23 23:19:20 +00:00
return ReadUnsignedByte ( addr ) ;
2013-10-28 19:13:01 +00:00
}
2014-05-23 23:19:20 +00:00
[LuaMethodAttributes("write_u8", "write unsigned byte")]
public void WriteU8 ( int addr , uint value )
2013-10-28 19:13:01 +00:00
{
2014-05-23 23:19:20 +00:00
WriteUnsignedByte ( addr , value ) ;
2013-10-28 19:13:01 +00:00
}
2014-05-23 23:19:20 +00:00
#endregion
#region 2 Byte
[LuaMethodAttributes("read_s16_le", "read signed 2 byte value, little endian")]
public int ReadS16Little ( int addr )
2013-10-28 19:13:01 +00:00
{
2014-05-23 23:19:20 +00:00
return ReadSignedLittleCore ( addr , 2 ) ;
2013-10-28 19:13:01 +00:00
}
2014-05-23 23:19:20 +00:00
[LuaMethodAttributes("write_s16_le", "write signed 2 byte value, little endian")]
public void WriteS16Little ( int addr , int value )
2013-10-28 19:13:01 +00:00
{
2014-05-23 23:19:20 +00:00
WriteSignedLittle ( addr , value , 2 ) ;
2013-10-28 19:13:01 +00:00
}
2014-05-23 23:19:20 +00:00
[LuaMethodAttributes("read_s16_be", "read signed 2 byte value, big endian")]
2014-01-27 01:15:56 +00:00
public int ReadS16Big ( int addr )
2013-10-28 19:13:01 +00:00
{
2014-01-27 01:15:56 +00:00
return ReadSignedBig ( addr , 2 ) ;
2013-10-28 19:13:01 +00:00
}
2014-05-23 23:19:20 +00:00
[LuaMethodAttributes("write_s16_be", "write signed 2 byte value, big endian")]
public void WriteS16Big ( int addr , int value )
2013-10-28 19:13:01 +00:00
{
2014-05-23 23:19:20 +00:00
WriteSignedBig ( addr , value , 2 ) ;
2013-10-28 19:13:01 +00:00
}
2014-05-23 23:19:20 +00:00
[LuaMethodAttributes("read_u16_le", "read unsigned 2 byte value, little endian")]
public uint ReadU16Little ( int addr )
2013-10-28 19:13:01 +00:00
{
2014-05-23 23:19:20 +00:00
return ReadUnsignedLittle ( addr , 2 ) ;
2013-10-28 19:13:01 +00:00
}
2014-05-23 23:19:20 +00:00
[LuaMethodAttributes("write_u16_le", "write unsigned 2 byte value, little endian")]
public void WriteU16Little ( int addr , uint value )
{
WriteUnsignedLittle ( addr , value , 2 ) ;
}
[LuaMethodAttributes("read_u16_be", "read unsigned 2 byte value, big endian")]
2014-01-27 01:15:56 +00:00
public uint ReadU16Big ( int addr )
2013-10-28 19:13:01 +00:00
{
2014-01-27 01:15:56 +00:00
return ReadUnsignedBig ( addr , 2 ) ;
2013-10-28 19:13:01 +00:00
}
2014-05-23 23:19:20 +00:00
[LuaMethodAttributes("write_u16_be", "write unsigned 2 byte value, big endian")]
public void WriteU16Big ( int addr , uint value )
2013-10-28 19:13:01 +00:00
{
2014-05-23 23:19:20 +00:00
WriteUnsignedBig ( addr , value , 2 ) ;
2013-10-28 19:13:01 +00:00
}
2014-05-23 23:19:20 +00:00
#endregion
#region 3 Byte
[LuaMethodAttributes("read_s24_le", "read signed 24 bit value, little endian")]
public int ReadS24Little ( int addr )
2013-10-28 19:13:01 +00:00
{
2014-05-23 23:19:20 +00:00
return ReadSignedLittleCore ( addr , 3 ) ;
2013-10-28 19:13:01 +00:00
}
2014-05-23 23:19:20 +00:00
[LuaMethodAttributes("write_s24_le", "write signed 24 bit value, little endian")]
public void WriteS24Little ( int addr , int value )
2013-10-28 19:13:01 +00:00
{
2014-05-23 23:19:20 +00:00
WriteSignedLittle ( addr , value , 3 ) ;
2013-10-28 19:13:01 +00:00
}
2014-05-23 23:19:20 +00:00
[LuaMethodAttributes("read_s24_be", "read signed 24 bit value, big endian")]
public int ReadS24Big ( int addr )
2013-10-28 19:13:01 +00:00
{
2014-05-23 23:19:20 +00:00
return ReadSignedBig ( addr , 3 ) ;
2013-10-28 19:13:01 +00:00
}
2014-05-23 23:19:20 +00:00
[LuaMethodAttributes("write_s24_be", "write signed 24 bit value, big endian")]
public void WriteS24Big ( int addr , int value )
2013-10-28 19:13:01 +00:00
{
2014-05-23 23:19:20 +00:00
WriteSignedBig ( addr , value , 3 ) ;
2013-10-28 19:13:01 +00:00
}
2014-05-23 23:19:20 +00:00
[LuaMethodAttributes("read_u24_le", "read unsigned 24 bit value, little endian")]
public uint ReadU24Little ( int addr )
2013-10-28 19:13:01 +00:00
{
2014-05-23 23:19:20 +00:00
return ReadUnsignedLittle ( addr , 3 ) ;
2013-10-28 19:13:01 +00:00
}
2014-05-23 23:19:20 +00:00
[LuaMethodAttributes("write_u24_le", "write unsigned 24 bit value, little endian")]
public void WriteU24Little ( int addr , uint value )
2013-10-28 19:13:01 +00:00
{
2014-05-23 23:19:20 +00:00
WriteUnsignedLittle ( addr , value , 3 ) ;
2013-10-28 19:13:01 +00:00
}
2014-05-23 23:19:20 +00:00
[LuaMethodAttributes("read_u24_be", "read unsigned 24 bit value, big endian")]
public uint ReadU24Big ( int addr )
2013-10-28 19:13:01 +00:00
{
2014-05-23 23:19:20 +00:00
return ReadUnsignedBig ( addr , 3 ) ;
2013-10-28 19:13:01 +00:00
}
2014-05-23 23:19:20 +00:00
[LuaMethodAttributes("write_u24_be", "write unsigned 24 bit value, big endian")]
public void WriteU24Big ( int addr , uint value )
2013-10-28 19:13:01 +00:00
{
2014-05-23 23:19:20 +00:00
WriteUnsignedBig ( addr , value , 3 ) ;
2013-10-28 19:13:01 +00:00
}
2014-05-23 23:19:20 +00:00
#endregion
#region 4 Byte
[LuaMethodAttributes("read_s32_le", "read signed 4 byte value, little endian")]
public int ReadS32Little ( int addr )
2013-10-28 19:13:01 +00:00
{
2014-05-23 23:19:20 +00:00
return ReadSignedLittleCore ( addr , 4 ) ;
2013-10-28 19:13:01 +00:00
}
2014-05-23 23:19:20 +00:00
[LuaMethodAttributes("write_s32_le", "write signed 4 byte value, little endian")]
public void WriteS32Little ( int addr , int value )
2014-01-26 02:43:28 +00:00
{
2014-05-23 23:19:20 +00:00
WriteSignedLittle ( addr , value , 4 ) ;
2014-01-26 02:43:28 +00:00
}
2013-10-28 19:13:01 +00:00
2014-05-23 23:19:20 +00:00
[LuaMethodAttributes("read_s32_be", "read signed 4 byte value, big endian")]
public int ReadS32Big ( int addr )
2014-01-26 02:43:28 +00:00
{
2014-05-23 23:19:20 +00:00
return ReadSignedBig ( addr , 4 ) ;
2014-01-26 02:43:28 +00:00
}
2013-10-28 19:13:01 +00:00
2014-05-23 23:19:20 +00:00
[LuaMethodAttributes("write_s32_be", "write signed 4 byte value, big endian")]
2014-01-27 01:15:56 +00:00
public void WriteS32Big ( int addr , int value )
2014-01-26 02:43:28 +00:00
{
2014-01-27 01:15:56 +00:00
WriteSignedBig ( addr , value , 4 ) ;
2014-01-26 02:43:28 +00:00
}
2013-10-28 19:13:01 +00:00
2014-05-23 23:19:20 +00:00
[LuaMethodAttributes("read_u32_le", "read unsigned 4 byte value, little endian")]
public uint ReadU32Little ( int addr )
2014-01-26 02:43:28 +00:00
{
2014-05-23 23:19:20 +00:00
return ReadUnsignedLittle ( addr , 4 ) ;
2014-01-26 02:43:28 +00:00
}
2013-10-28 19:13:01 +00:00
2014-05-23 23:19:20 +00:00
[LuaMethodAttributes("write_u32_le", "write unsigned 4 byte value, little endian")]
public void WriteU32Little ( int addr , uint value )
2014-01-26 02:43:28 +00:00
{
2014-05-23 23:19:20 +00:00
WriteUnsignedLittle ( addr , value , 4 ) ;
2014-01-26 02:43:28 +00:00
}
2013-10-28 19:13:01 +00:00
2014-05-23 23:19:20 +00:00
[LuaMethodAttributes("read_u32_be", "read unsigned 4 byte value, big endian")]
public uint ReadU32Big ( int addr )
{
return ReadUnsignedBig ( addr , 4 ) ;
}
[LuaMethodAttributes("write_u32_be", "write unsigned 4 byte value, big endian")]
2014-01-27 01:15:56 +00:00
public void WriteU32Big ( int addr , uint value )
2014-01-26 02:43:28 +00:00
{
2014-01-27 01:15:56 +00:00
WriteUnsignedBig ( addr , value , 4 ) ;
2013-10-28 19:13:01 +00:00
}
2014-05-23 23:19:20 +00:00
#endregion
2013-10-28 19:13:01 +00:00
}
}