diff options
-rw-r--r-- | makefile | 6 | ||||
-rw-r--r-- | scripts/build/complay.py | 71 | ||||
-rw-r--r-- | scripts/genie.lua | 2 | ||||
-rw-r--r-- | src/emu/gamedrv.h | 29 | ||||
-rw-r--r-- | src/emu/mconfig.h | 13 | ||||
-rw-r--r-- | src/emu/render.cpp | 68 | ||||
-rw-r--r-- | src/emu/render.h | 7 | ||||
-rw-r--r-- | src/emu/rendlay.h | 20 | ||||
-rw-r--r-- | src/emu/video.cpp | 2 | ||||
-rw-r--r-- | src/mame/drivers/hp48.cpp | 16 | ||||
-rw-r--r-- | src/mame/drivers/ninjaw.cpp | 2 | ||||
-rw-r--r-- | src/mame/drivers/thayers.cpp | 2 | ||||
-rw-r--r-- | src/mame/drivers/thomson.cpp | 4 | ||||
-rw-r--r-- | src/mame/includes/mw8080bw.h | 2 |
14 files changed, 185 insertions, 59 deletions
@@ -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 -----------*/ |