summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--makefile6
-rw-r--r--scripts/build/complay.py71
-rw-r--r--scripts/genie.lua2
-rw-r--r--src/emu/gamedrv.h29
-rw-r--r--src/emu/mconfig.h13
-rw-r--r--src/emu/render.cpp68
-rw-r--r--src/emu/render.h7
-rw-r--r--src/emu/rendlay.h20
-rw-r--r--src/emu/video.cpp2
-rw-r--r--src/mame/drivers/hp48.cpp16
-rw-r--r--src/mame/drivers/ninjaw.cpp2
-rw-r--r--src/mame/drivers/thayers.cpp2
-rw-r--r--src/mame/drivers/thomson.cpp4
-rw-r--r--src/mame/includes/mw8080bw.h2
14 files changed, 185 insertions, 59 deletions
diff --git a/makefile b/makefile
index f9f6c2f4032..c8673db1e24 100644
--- a/makefile
+++ b/makefile
@@ -1436,9 +1436,9 @@ $(GENDIR)/includes/SDL2:
-$(call MKDIR,$@)
-$(call COPY,3rdparty/SDL2/include/,$(GENDIR)/includes/SDL2)
-$(GENDIR)/%.lh: $(SRC)/%.lay scripts/build/file2str.py | $(GEN_FOLDERS)
- @echo Converting $<...
- $(SILENT)$(PYTHON) scripts/build/file2str.py $< $@ layout_$(basename $(notdir $<))
+$(GENDIR)/%.lh: $(SRC)/%.lay scripts/build/complay.py | $(GEN_FOLDERS)
+ @echo Compressing $<...
+ $(SILENT)$(PYTHON) scripts/build/complay.py $< $@ layout_$(basename $(notdir $<))
$(SRC)/devices/cpu/m68000/m68kops.cpp: $(SRC)/devices/cpu/m68000/m68k_in.cpp $(SRC)/devices/cpu/m68000/m68kmake.cpp
ifeq ($(TARGETOS),asmjs)
diff --git a/scripts/build/complay.py b/scripts/build/complay.py
new file mode 100644
index 00000000000..68681c72fbf
--- /dev/null
+++ b/scripts/build/complay.py
@@ -0,0 +1,71 @@
+#!/usr/bin/python
+##
+## license:BSD-3-Clause
+## copyright-holders:Aaron Giles, Andrew Gardner
+
+from __future__ import with_statement
+
+import sys
+import os
+import zlib
+
+if len(sys.argv) < 4:
+ print('Usage:')
+ print(' complay <source.lay> <output.h> <varname>')
+ print('')
+ sys.exit(0)
+
+srcfile = sys.argv[1]
+dstfile = sys.argv[2]
+varname = sys.argv[3]
+type = 'UINT8'
+
+try:
+ myfile = open(srcfile, 'rb')
+except IOError:
+ sys.stderr.write("Unable to open source file '%s'\n" % srcfile)
+ sys.exit(-1)
+
+byteCount = os.path.getsize(srcfile)
+compsize = 0
+compressiontype = 1
+
+try:
+ dst = open(dstfile,'w')
+ dst.write('const %s %s_data[] =\n{\n\t' % ( type, varname))
+ offs = 0
+ with open(srcfile, "rb") as src:
+ while True:
+ chunk = src.read(byteCount)
+ if chunk:
+ compchunk = zlib.compress(chunk, 9)
+ compsize = len(compchunk)
+ for b in compchunk:
+ # For Python 2.x compatibility.
+ b = ord(b)
+ dst.write('%d' % b)
+ offs += 1
+ if offs != compsize:
+ dst.write(',')
+ else:
+ break
+ dst.write('\n\t')
+
+ dst.write('\n};\n')
+
+except IOError:
+ sys.stderr.write("Unable to open output file '%s'\n" % dstfile)
+ sys.exit(-1)
+
+try:
+ dst.write('extern const internal_layout %s;\n' % ( varname ))
+ dst.write('const internal_layout %s = { \n\t' % ( varname ))
+ dst.write('%d,%d,%d,%s_data\n' % ( byteCount, compsize, compressiontype, varname ))
+ dst.write('\n};\n')
+
+
+ dst.close()
+except IOError:
+ sys.stderr.write("Unable to open output file '%s'\n" % dstfile)
+ sys.exit(-1)
+
diff --git a/scripts/genie.lua b/scripts/genie.lua
index 9b2e86151ce..2277bbcd62a 100644
--- a/scripts/genie.lua
+++ b/scripts/genie.lua
@@ -53,7 +53,7 @@ end
function layoutbuildtask(_folder, _name)
return { MAME_DIR .. "src/".._folder.."/".. _name ..".lay" , GEN_DIR .. _folder .. "/".._name..".lh",
- { MAME_DIR .. "scripts/build/file2str.py" }, {"@echo Converting src/".._folder.."/".._name..".lay...", PYTHON .. " $(1) $(<) $(@) layout_".._name }};
+ { MAME_DIR .. "scripts/build/complay.py" }, {"@echo Compressing src/".._folder.."/".._name..".lay...", PYTHON .. " $(1) $(<) $(@) layout_".._name }};
end
function precompiledheaders()
diff --git a/src/emu/gamedrv.h b/src/emu/gamedrv.h
index 7fdcaf9e1c4..070c69f6a85 100644
--- a/src/emu/gamedrv.h
+++ b/src/emu/gamedrv.h
@@ -74,7 +74,7 @@ struct game_driver
const rom_entry * rom; // pointer to list of ROMs for the game
const char * compatible_with;
UINT32 flags; // orientation and other flags; see defines below
- const char * default_layout; // default internally defined layout
+ const internal_layout * default_layout; // default internally defined layout
};
@@ -95,7 +95,22 @@ struct game_driver
// standard GAME() macro
#define GAME(YEAR,NAME,PARENT,MACHINE,INPUT,CLASS,INIT,MONITOR,COMPANY,FULLNAME,FLAGS) \
- GAMEL(YEAR,NAME,PARENT,MACHINE,INPUT,CLASS,INIT,MONITOR,COMPANY,FULLNAME,FLAGS,((const char *)0))
+extern const game_driver GAME_NAME(NAME) = \
+{ \
+ __FILE__, \
+ #PARENT, \
+ #NAME, \
+ FULLNAME, \
+ #YEAR, \
+ COMPANY, \
+ MACHINE_CONFIG_NAME(MACHINE), \
+ INPUT_PORTS_NAME(INPUT), \
+ &driver_device::driver_init_wrapper<CLASS, &CLASS::init_##INIT>, \
+ ROM_NAME(NAME), \
+ nullptr, \
+ (MONITOR)|(FLAGS)|MACHINE_TYPE_ARCADE, \
+ nullptr \
+};
// standard macro with additional layout
#define GAMEL(YEAR,NAME,PARENT,MACHINE,INPUT,CLASS,INIT,MONITOR,COMPANY,FULLNAME,FLAGS,LAYOUT) \
@@ -111,9 +126,9 @@ extern const game_driver GAME_NAME(NAME) = \
INPUT_PORTS_NAME(INPUT), \
&driver_device::driver_init_wrapper<CLASS, &CLASS::init_##INIT>, \
ROM_NAME(NAME), \
- NULL, \
+ nullptr, \
(MONITOR)|(FLAGS)|MACHINE_TYPE_ARCADE, \
- &LAYOUT[0] \
+ &LAYOUT \
};
// standard console definition macro
@@ -132,7 +147,7 @@ extern const game_driver GAME_NAME(NAME) = \
ROM_NAME(NAME), \
#COMPAT, \
ROT0|(FLAGS)|MACHINE_TYPE_CONSOLE, \
- NULL \
+ nullptr \
};
// standard computer definition macro
@@ -151,7 +166,7 @@ extern const game_driver GAME_NAME(NAME) = \
ROM_NAME(NAME), \
#COMPAT, \
ROT0|(FLAGS)|MACHINE_TYPE_COMPUTER, \
- NULL \
+ nullptr \
};
// standard system definition macro
@@ -170,7 +185,7 @@ extern const game_driver GAME_NAME(NAME) = \
ROM_NAME(NAME), \
#COMPAT, \
ROT0|(FLAGS)|MACHINE_TYPE_OTHER, \
- NULL \
+ nullptr \
};
diff --git a/src/emu/mconfig.h b/src/emu/mconfig.h
index dccc77110e8..c552812348c 100644
--- a/src/emu/mconfig.h
+++ b/src/emu/mconfig.h
@@ -36,6 +36,15 @@ struct gfx_decode_entry;
class driver_device;
class screen_device;
+struct internal_layout
+{
+ size_t decompressed_size;
+ size_t compressed_size;
+ UINT8 compression_type;
+ const UINT8* data;
+};
+
+
// ======================> machine_config
// machine configuration definition
@@ -66,7 +75,7 @@ public:
bool m_force_no_drc; // whether or not to force DRC off
// other parameters
- const char * m_default_layout; // default layout for this machine
+ const internal_layout * m_default_layout; // default layout for this machine
// helpers during configuration; not for general use
device_t *device_add(device_t *owner, const char *tag, device_type type, UINT32 clock);
@@ -201,7 +210,7 @@ References an external machine config.
// core video parameters
#define MCFG_DEFAULT_LAYOUT(_layout) \
- config.m_default_layout = &(_layout)[0];
+ config.m_default_layout = &(_layout);
// add/remove devices
#define MCFG_DEVICE_ADD(_tag, _type, _clock) \
diff --git a/src/emu/render.cpp b/src/emu/render.cpp
index 89fadf5e319..aafd0007e4e 100644
--- a/src/emu/render.cpp
+++ b/src/emu/render.cpp
@@ -46,6 +46,7 @@
#include "drivenum.h"
#include "xmlfile.h"
#include "ui/ui.h"
+#include <zlib.h>
@@ -906,7 +907,7 @@ render_container::user_settings::user_settings()
// render_target - constructor
//-------------------------------------------------
-render_target::render_target(render_manager &manager, const char *layoutfile, UINT32 flags)
+render_target::render_target(render_manager &manager, const internal_layout *layoutfile, UINT32 flags)
: m_next(nullptr),
m_manager(manager),
m_curview(nullptr),
@@ -1548,7 +1549,7 @@ void render_target::update_layer_config()
// given render target
//-------------------------------------------------
-void render_target::load_layout_files(const char *layoutfile, bool singlefile)
+void render_target::load_layout_files(const internal_layout *layoutfile, bool singlefile)
{
bool have_default = false;
// if there's an explicit file, load that first
@@ -1587,34 +1588,34 @@ void render_target::load_layout_files(const char *layoutfile, bool singlefile)
if (screens == 1)
{
if (system.flags & ORIENTATION_SWAP_XY)
- load_layout_file(nullptr, layout_vertical);
+ load_layout_file(nullptr, &layout_vertical);
else
- load_layout_file(nullptr, layout_horizont);
+ load_layout_file(nullptr, &layout_horizont);
assert_always(m_filelist.count() > 0, "Couldn't parse default layout??");
}
if (!have_default)
{
if (screens == 0)
{
- load_layout_file(nullptr, layout_noscreens);
+ load_layout_file(nullptr, &layout_noscreens);
assert_always(m_filelist.count() > 0, "Couldn't parse default layout??");
}
else
if (screens == 2)
{
- load_layout_file(nullptr, layout_dualhsxs);
+ load_layout_file(nullptr, &layout_dualhsxs);
assert_always(m_filelist.count() > 0, "Couldn't parse default layout??");
}
else
if (screens == 3)
{
- load_layout_file(nullptr, layout_triphsxs);
+ load_layout_file(nullptr, &layout_triphsxs);
assert_always(m_filelist.count() > 0, "Couldn't parse default layout??");
}
else
if (screens == 4)
{
- load_layout_file(nullptr, layout_quadhsxs);
+ load_layout_file(nullptr, &layout_quadhsxs);
assert_always(m_filelist.count() > 0, "Couldn't parse default layout??");
}
}
@@ -1626,6 +1627,55 @@ void render_target::load_layout_files(const char *layoutfile, bool singlefile)
// and append it to our list
//-------------------------------------------------
+
+bool render_target::load_layout_file(const char *dirname, const internal_layout *layout_data)
+{
+ // +1 to ensure data is terminated for XML parser
+ auto tempout = make_unique_clear<UINT8[]>(layout_data->decompressed_size+1);
+
+ z_stream stream;
+ int zerr;
+
+ /* initialize the stream */
+ memset(&stream, 0, sizeof(stream));
+ stream.next_out = tempout.get();
+ stream.avail_out = layout_data->decompressed_size;
+
+
+ zerr = inflateInit(&stream);
+ if (zerr != Z_OK)
+ {
+ fatalerror("could not inflateInit");
+ return false;
+ }
+
+ /* decompress this chunk */
+ stream.next_in = (unsigned char*)layout_data->data;
+ stream.avail_in = layout_data->compressed_size;
+ zerr = inflate(&stream, Z_NO_FLUSH);
+
+ /* stop at the end of the stream */
+ if (zerr == Z_STREAM_END)
+ {
+ // OK
+ }
+ else if (zerr != Z_OK)
+ {
+ fatalerror("decompression error\n");
+ return false;
+ }
+
+ /* clean up */
+ zerr = inflateEnd(&stream);
+ if (zerr != Z_OK)
+ {
+ fatalerror("inflateEnd error\n");
+ return false;
+ }
+
+ return load_layout_file(dirname, (const char*)tempout.get());
+}
+
bool render_target::load_layout_file(const char *dirname, const char *filename)
{
// if the first character of the "file" is an open brace, assume it is an XML string
@@ -2529,7 +2579,7 @@ float render_manager::max_update_rate() const
// target_alloc - allocate a new target
//-------------------------------------------------
-render_target *render_manager::target_alloc(const char *layoutfile, UINT32 flags)
+render_target *render_manager::target_alloc(const internal_layout *layoutfile, UINT32 flags)
{
return &m_targetlist.append(*global_alloc(render_target(*this, layoutfile, flags)));
}
diff --git a/src/emu/render.h b/src/emu/render.h
index 92761b45305..1267d402b1f 100644
--- a/src/emu/render.h
+++ b/src/emu/render.h
@@ -888,7 +888,7 @@ class render_target
friend class render_manager;
// construction/destruction
- render_target(render_manager &manager, const char *layoutfile = nullptr, UINT32 flags = 0);
+ render_target(render_manager &manager, const internal_layout *layoutfile = nullptr, UINT32 flags = 0);
~render_target();
public:
@@ -966,8 +966,9 @@ public:
private:
// internal helpers
void update_layer_config();
- void load_layout_files(const char *layoutfile, bool singlefile);
+ void load_layout_files(const internal_layout *layoutfile, bool singlefile);
bool load_layout_file(const char *dirname, const char *filename);
+ bool load_layout_file(const char *dirname, const internal_layout *layout_data);
void add_container_primitives(render_primitive_list &list, const object_transform &xform, render_container &container, int blendmode);
void add_element_primitives(render_primitive_list &list, const object_transform &xform, layout_element &element, int state, int blendmode);
bool map_point_internal(INT32 target_x, INT32 target_y, render_container *container, float &mapped_x, float &mapped_y, ioport_port *&mapped_input_port, ioport_value &mapped_input_mask);
@@ -1044,7 +1045,7 @@ public:
float max_update_rate() const;
// targets
- render_target *target_alloc(const char *layoutfile = nullptr, UINT32 flags = 0);
+ render_target *target_alloc(const internal_layout *layoutfile = nullptr, UINT32 flags = 0);
void target_free(render_target *target);
render_target *first_target() const { return m_targetlist.first(); }
render_target *target_by_index(int index) const;
diff --git a/src/emu/rendlay.h b/src/emu/rendlay.h
index 77b8a4845ec..ab9390de564 100644
--- a/src/emu/rendlay.h
+++ b/src/emu/rendlay.h
@@ -16,26 +16,26 @@
//**************************************************************************
// no screens layouts
-extern const char layout_noscreens[]; // for screenless systems
+extern const internal_layout layout_noscreens; // for screenless systems
// single screen layouts
-extern const char layout_horizont[]; // horizontal 4:3 screens
-extern const char layout_vertical[]; // vertical 4:3 screens
+extern const internal_layout layout_horizont; // horizontal 4:3 screens
+extern const internal_layout layout_vertical; // vertical 4:3 screens
// dual screen layouts
-extern const char layout_dualhsxs[]; // dual 4:3 screens side-by-side
-extern const char layout_dualhovu[]; // dual 4:3 screens above and below
-extern const char layout_dualhuov[]; // dual 4:3 screens below and above
+extern const internal_layout layout_dualhsxs; // dual 4:3 screens side-by-side
+extern const internal_layout layout_dualhovu; // dual 4:3 screens above and below
+extern const internal_layout layout_dualhuov; // dual 4:3 screens below and above
// triple screen layouts
-extern const char layout_triphsxs[]; // triple 4:3 screens side-by-side
+extern const internal_layout layout_triphsxs; // triple 4:3 screens side-by-side
// quad screen layouts
-extern const char layout_quadhsxs[]; // quad 4:3 screens side-by-side
+extern const internal_layout layout_quadhsxs; // quad 4:3 screens side-by-side
// LCD screen layouts
-extern const char layout_lcd[]; // generic 1:1 lcd screen layout
-extern const char layout_lcd_rot[]; // same, for use with ROT90 or ROT270
+extern const internal_layout layout_lcd; // generic 1:1 lcd screen layout
+extern const internal_layout layout_lcd_rot; // same, for use with ROT90 or ROT270
#endif // __RENDLAY_H__
diff --git a/src/emu/video.cpp b/src/emu/video.cpp
index c3090bc6096..7c49a992006 100644
--- a/src/emu/video.cpp
+++ b/src/emu/video.cpp
@@ -130,7 +130,7 @@ video_manager::video_manager(running_machine &machine)
// the native target is hard-coded to our internal layout and has all options disabled
if (m_snap_native)
{
- m_snap_target = machine.render().target_alloc(layout_snap, RENDER_CREATE_SINGLE_FILE | RENDER_CREATE_HIDDEN);
+ m_snap_target = machine.render().target_alloc(&layout_snap, RENDER_CREATE_SINGLE_FILE | RENDER_CREATE_HIDDEN);
m_snap_target->set_backdrops_enabled(false);
m_snap_target->set_overlays_enabled(false);
m_snap_target->set_bezels_enabled(false);
diff --git a/src/mame/drivers/hp48.cpp b/src/mame/drivers/hp48.cpp
index 2b9e31dfcdc..317389522fc 100644
--- a/src/mame/drivers/hp48.cpp
+++ b/src/mame/drivers/hp48.cpp
@@ -1251,16 +1251,6 @@ ADDRESS_MAP_END
-/*************************** layout ********************************/
-
-static const char layout_hp48gx[] = "hp48gx";
-static const char layout_hp48g [] = "hp48g";
-static const char layout_hp48gp[] = "hp48gp";
-static const char layout_hp48sx[] = "hp48sx";
-static const char layout_hp48s [] = "hp48s";
-static const char layout_hp49g [] = "hp49g";
-
-
/*************************** driver ********************************/
@@ -1297,7 +1287,6 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( hp48gx, hp48_common )
MCFG_MACHINE_START_OVERRIDE (hp48_state, hp48gx )
- MCFG_DEFAULT_LAYOUT ( layout_hp48gx )
/* expansion ports */
MCFG_HP48_PORT_ADD ( "port1", 0, HP48_CE2, 128*1024 )
@@ -1310,7 +1299,6 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( hp48g, hp48_common )
MCFG_MACHINE_START_OVERRIDE (hp48_state, hp48g )
- MCFG_DEFAULT_LAYOUT ( layout_hp48g )
/* serial I/O */
//MCFG_XMODEM_ADD( "rs232_x", hp48_xmodem_rs232_conf )
@@ -1320,7 +1308,6 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( hp48gp, hp48_common )
MCFG_MACHINE_START_OVERRIDE (hp48_state, hp48gp )
- MCFG_DEFAULT_LAYOUT ( layout_hp48gp )
/* serial I/O */
//MCFG_XMODEM_ADD( "rs232_x", hp48_xmodem_rs232_conf )
@@ -1332,7 +1319,6 @@ static MACHINE_CONFIG_DERIVED( hp48sx, hp48_common )
MCFG_CPU_MODIFY ( "maincpu" )
MCFG_CPU_CLOCK ( 2000000 )
MCFG_MACHINE_START_OVERRIDE (hp48_state, hp48sx )
- MCFG_DEFAULT_LAYOUT ( layout_hp48sx )
/* expansion ports */
MCFG_HP48_PORT_ADD ( "port1", 0, HP48_CE1, 128*1024)
@@ -1346,7 +1332,6 @@ static MACHINE_CONFIG_DERIVED( hp48s, hp48_common )
MCFG_CPU_MODIFY ( "maincpu" )
MCFG_CPU_CLOCK ( 2000000 )
MCFG_MACHINE_START_OVERRIDE (hp48_state, hp48s )
- MCFG_DEFAULT_LAYOUT ( layout_hp48s )
/* serial I/O */
//MCFG_KERMIT_ADD( "rs232_k", hp48_kermit_rs232_conf )
@@ -1355,7 +1340,6 @@ MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( hp49g, hp48_common )
MCFG_CPU_MODIFY ( "maincpu" )
MCFG_MACHINE_START_OVERRIDE (hp48_state, hp49g )
- MCFG_DEFAULT_LAYOUT ( layout_hp49g )
/* serial I/O */
//MCFG_XMODEM_ADD( "rs232_x", hp48_xmodem_rs232_conf )
diff --git a/src/mame/drivers/ninjaw.cpp b/src/mame/drivers/ninjaw.cpp
index d513604fa96..098e920dfcc 100644
--- a/src/mame/drivers/ninjaw.cpp
+++ b/src/mame/drivers/ninjaw.cpp
@@ -322,7 +322,7 @@ rumbling on a subwoofer in the cabinet.)
#include "includes/taitoipt.h"
#include "includes/ninjaw.h"
-extern const char layout_darius[];
+extern const internal_layout layout_darius;
void ninjaw_state::parse_control( ) /* assumes Z80 sandwiched between 68Ks */
{
diff --git a/src/mame/drivers/thayers.cpp b/src/mame/drivers/thayers.cpp
index eb0bee157e7..d344a4ea2c8 100644
--- a/src/mame/drivers/thayers.cpp
+++ b/src/mame/drivers/thayers.cpp
@@ -100,7 +100,7 @@ protected:
};
-extern const char layout_dlair[];
+extern const internal_layout layout_dlair;
diff --git a/src/mame/drivers/thomson.cpp b/src/mame/drivers/thomson.cpp
index dc906e196ce..24938323908 100644
--- a/src/mame/drivers/thomson.cpp
+++ b/src/mame/drivers/thomson.cpp
@@ -85,9 +85,6 @@
/**************************** common *******************************/
-/* layout */
-static const char layout_thomson[] = "thomson";
-
#define KEY(pos,name,key) \
PORT_BIT ( 1<<(pos), IP_ACTIVE_LOW, IPT_KEYBOARD ) \
PORT_NAME ( name ) \
@@ -630,7 +627,6 @@ static MACHINE_CONFIG_START( to7, thomson_state )
MCFG_PALETTE_ADD ( "palette", 4097 ) /* 12-bit color + transparency */
MCFG_PALETTE_INIT_OWNER(thomson_state, thom)
MCFG_VIDEO_START_OVERRIDE( thomson_state, thom )
- MCFG_DEFAULT_LAYOUT( layout_thomson )
/* sound */
MCFG_SPEAKER_STANDARD_MONO("mono")
diff --git a/src/mame/includes/mw8080bw.h b/src/mame/includes/mw8080bw.h
index 1641d3a1086..993f1bbe666 100644
--- a/src/mame/includes/mw8080bw.h
+++ b/src/mame/includes/mw8080bw.h
@@ -242,7 +242,7 @@ public:
MACHINE_CONFIG_EXTERN( mw8080bw_root );
MACHINE_CONFIG_EXTERN( invaders );
-extern const char layout_invaders[];
+extern const internal_layout layout_invaders;
/*----------- defined in audio/mw8080bw.c -----------*/