Commit Graph

162 Commits

Author SHA1 Message Date
smf-
cc9b510f9c Slot options can now be configured inline without creating an array. Legacy support for old configuration uses MCFG_FRAGMENT_ADD, which required changing so the current device could be updated by the fragment. [smf] 2013-12-16 19:31:52 +00:00
Aaron Giles
5d0ce54f9e Bulk convert files that already had standard BSD license in my name
to new license tagged form.
2013-10-16 08:14:49 +00:00
Miodrag Milanovic
8eb3f42f0a added missing short names to legacy devices and added validation that short name is always mandatory (nw) 2013-08-23 12:10:50 +00:00
Oliver Stöneberg
0f813d48f3 core validation message were never shown (nw) 2013-07-04 13:21:24 +00:00
Miodrag Milanovic
37e0307c5b made required/optional device finder part of validation (nw) 2013-04-10 07:04:29 +00:00
smf-
1940866c70 output of new srcclean changes that are relatively small [smf] 2013-01-11 19:43:14 +00:00
Miodrag Milanovic
0e19f641d3 Cleanups and version bump 2013-01-11 07:32:46 +00:00
Oliver Stöneberg
97dbb9484f removed unnecessary strlen() usage (no whatsnew) 2012-07-27 15:37:39 +00:00
Aaron Giles
2a88e54278 ioport.c C++ conversion. Mostly internal changes, with no
intended differences from previous behavior. For drivers,
the main change is that input_port_read() no longer exists.
Instead, the port must be fetched from the appropriate device,
and then read() is called.

For member functions, this is actually simpler/cleaner:

  value = ioport("tag")->read()

For legacy functions which have a driver_data state, it goes:

  value = state->ioport("tag")->read()

For other legacy functions, they need to fetch the root device:

  value = machine.root_device().ioport("tag")->read()

The other big change for drivers is that IPT_VBLANK is gone.
Instead, it has been replaced by a device line callback on the
screen device. There's a new macro PORT_VBLANK("tag") which
automatically points things to the right spot.

Here's a set of imperfect search & replace strings to convert
the input_port_read calls and fix up IPT_VBLANK:

input_port_read( *\( *)(machine\(\)) *, *([^)]+ *\))
ioport\1\3->read\(\)

input_port_read( *\( *)(.*machine[()]*) *, *([^)]+ *\))
\2\.root_device\(\)\.ioport\1\3->read\(\)

(state = .*driver_data[^}]+)space->machine\(\)\.root_device\(\)\.
\1state->

(state = .*driver_data[^}]+)device->machine\(\)\.root_device\(\)\.
\1state->

input_port_read_safe( *\( *)(machine\(\)) *, *([^,]+), *([^)]+\))
ioport\1\3->read_safe\(\4\)

IPT_VBLANK( *\))
IPT_CUSTOM\1 PORT_VBLANK("screen")
2012-05-03 09:00:08 +00:00
Aaron Giles
3c0e321123 Remove AM_BASE in favor of AM_SHARED + required_shared_ptr.
This update passes validity checks but will certainly have
a number of drivers failing at startup because all pointers
are defaulted to required by the automated scripts used. 
Will fix problems once we get a regression run to find out 
which drivers need attention.
2012-04-15 05:44:22 +00:00
Angelo Salese
04145d0b62 Clean-ups and version bump 2012-02-26 14:31:24 +00:00
Miodrag Milanovic
97c3d0cb39 - removed need for *_dev.lst files [Miodrag Milanovic]
- enforced short names for slot card devices
- updated validation, romverify and listxml output accordingly
- slotoptions now also contain shortnames so it's possible to link
  slot option and device
2012-02-23 14:19:37 +00:00
Aaron Giles
1db879e232 Removed rom_source abstraction, which was just mapping to devices
anyways. Updated everyone involved to just iterate over devices
directly.
2012-02-20 06:06:58 +00:00
Miodrag Milanovic
5596c512fc Sync core fixes from MESS done by OG (nw) 2012-02-11 16:15:39 +00:00
Scott Stone
a4098e8a3a Some cleanup of some observed #include redundancy from source files which use emu.h (nw) 2012-02-06 01:30:22 +00:00
Miodrag Milanovic
02fab75990 Proper fix for issues with slots, removed old fix too (no whatsnew) 2012-02-05 07:00:09 +00:00
Angelo Salese
505442d0a0 Clean-ups and version bump 2012-01-29 16:34:26 +00:00
Miodrag Milanovic
c3aa030ebf Fix for slot validation, all device related options are removed when doing validation, otherwise wrong data could be used (no whatsnew) 2012-01-26 12:41:49 +00:00
Aaron Giles
ed0207f126 Move devices into a proper hierarchy and handle naming
and paths consistently for devices, I/O ports, memory
regions, memory banks, and memory shares. [Aaron Giles]

NOTE: there are likely regressions lurking here, mostly
due to devices not being properly found. I have temporarily
added more logging to -verbose to help understand what's
going on. Please let me know ASAP if anything that is being
actively worked on got broken.

As before, the driver device is the root device and all 
other devices are owned by it. Previously all devices
were kept in a single master list, and the hierarchy was
purely logical. With this change, each device owns its
own list of subdevices, and the hierarchy is explicitly
manifest. This means when a device is removed, all of its
subdevices are automatically removed as well.

A side effect of this is that walking the device list is
no longer simple. To address this, a new set of iterator
classes is provided, which walks the device tree in a depth
first manner. There is a general device_iterator class for
walking all devices, plus templates for a device_type_iterator
and a device_interface_iterator which are used to build
iterators for identifying only devices of a given type or
with a given interface. Typedefs for commonly-used cases
(e.g., screen_device_iterator, memory_interface_iterator)
are provided. Iterators can also provide counts, and can
perform indexed lookups.

All device name lookups are now done relative to another 
device. The maching_config and running_machine classes now
have a root_device() method to get the root of the hierarchy. 
The  existing machine->device("name") is now equivalent to
machine->root_device().subdevice("name").

A proper and normalized device path structure is now
supported. Device names that start with a colon are
treated as absolute paths from the root device. Device
names can also use a caret (^) to refer to the owning
device. Querying the device's tag() returns the device's
full path from the root. A new method basetag() returns
just the final tag.

The new pathing system is built on top of the 
device_t::subtag() method, so anyone using that will 
automatically support the new pathing rules. Each device
has its own internal map to cache successful lookups so
that subsequent lookups should be very fast.

Updated every place I could find that referenced devices,
memory regions, I/O ports, memory banks and memory shares
to leverage subtag/subdevice (or siblingtag/siblingdevice
which are built on top).

Removed the device_list class, as it doesn't apply any
more. Moved some of its methods into running_machine
instead.

Simplified the device callback system since the new 
pathing can describe all of the special-case devices that
were previously handled manually.

Changed the core output function callbacks to be delegates.

Completely rewrote the validity checking mechanism. The
validity checker is now a proper C++ class, and temporarily
takes over the error and warning outputs. All errors and 
warnings are collected during a session, and then output in
a consistent manner, with an explicit driver and source file
listed for each one, as well as additional device and/or
I/O port contexts where appropriate. Validity checkers 
should no longer explicitly output this information, just
the error, assuming that the context is provided.

Rewrote the software_list_device as a modern device, getting
rid of the software_list_config abstraction and simplifying
things.

Changed the way FLAC compiles so that it works like other
external libraries, and also compiles successfully for MSVC
builds.
2012-01-24 20:18:55 +00:00
Aaron Giles
e4238fb654 Major bitmap-related changes throughout the system. There are
almost certainly some regressions lurking. Let me know if
something seems busted.

Bitmaps are now strongly typed based on format. bitmap_t still
exists as an abstract base class, but it is almost never used.
Instead, format-specific bitmap classes are provided:

   bitmap_ind8 == 8bpp indexed
   bitmap_ind16 == 16bpp indexed
   bitmap_ind32 == 32bpp indexed
   bitmap_ind64 == 64bpp indexed
   bitmap_rgb32 == 32bpp RGB
   bitmap_argb32 == 32bpp ARGB
   bitmap_yuy16 == 16bpp YUY

For each format, a generic pix() method is provided which
references pixels of the correct type. The old pix8/pix16/pix32/
pix64 methods still exist in the short term, but the only one
available is the one that matches the bitmap's pixel size. Note
also that the old RGB15 format bitmaps are no longer supported
at all.

Converted model1, megadriv, and stv drivers away from the RGB15
format bitmaps.

New auto_bitmap_<type>_alloc() macros are provided for allocating
the appropriate type of bitmap.

Screen update functions now must specify the correct bitmap type
as their input parameters. For static update functions the
SCREEN_UPDATE macro is now replaced with SCREEN_UPDATE_RGB32 and
SCREEN_UPDATE_IND16 macros. All existing drivers have been 
updated to use the correct macros. 

Screen update functions are now required for all screens; there
is no longer any default behavior of copying a "default" bitmap
to the screen (in fact the default bitmap has been deprecated).
Use one of the following to specify your screen_update callback:

   MCFG_SCREEN_UPDATE_STATIC(name) - static functions
   MCFG_SCREEN_UPDATE_DRIVER(class, func) - driver members
   MCFG_SCREEN_UPDATE_DEVICE(tag, class, func) - device members

Because the target bitmap format can now be deduced from the
screen update function itself, the MCFG_SCREEN_FORMAT macro is
no longer necessary, and has been removed. If you specify a
screen update callback that takes a bitmap_ind16, then the screen
will be configured to use a 16bpp indexed bitmap, and if you
specify a callback that takes a bitmap_rgb32, then a 32bpp RGB
bitmap will be provided.

Extended the bitmap classes to support wrapping a subregion of
another bitmap, and cleaner allocation/resetting. The preferred
use of bitmaps now is to define them directly in drivers/devices
and use allocate() or wrap() to set them up, rather than 
allocating them via auto_bitmap_*_alloc().

Several common devices needed overhauls or changes as a result
of the above changes:

 * Reorganized the laserdisc base driver and all the laserdisc 
    drivers as modern C++ devices, cleaning the code up 
    considerably. Merged ldsound device into the laserdsc
    device since modern devices are flexible enough to handle
    it.

 * Reorganized the v9938 device as a modern C++ device. Removed
    v9938mod.c in favor of template functions in v9938.c directly.

 * Added independent ind16 and rgb32 callbacks for TMS340x0 devices.

 * All video devices are now hard-coded to either ind16 or rgb32
    bitmaps. The most notable is the mc6845 which is rgb32, and
    required changes to a number of consumers.

 * Added screen_update methods to most video devices so they can be
    directly called via MCFG_SCREEN_UPDATE_DEVICE instead of creating
    tons of stub functions.
2012-01-12 21:19:49 +00:00
Angelo Salese
9f8125a24e Clean-ups and version bump 2011-11-27 14:06:49 +00:00
Miodrag Milanovic
f7844d604b Proper validation fix (no whatsnew) 2011-11-16 10:23:58 +00:00
Miodrag Milanovic
8e1dbbb003 Validation of drivers require absence of slot and image options (no whatsnew) 2011-11-16 09:40:33 +00:00
Angelo Salese
43a482c6eb Made some fixes/additions to the input system [kanikani]
* Added the possibility to press contradictory direction digital
joystick input at the same time (i.e. up-down, left-right);
* Added the possibility to set an arbitrary value for coin impulses;
* fixed a bug with loop lever routine
* fixed a bug with analog joystick routine


Various fixes in tnzs.c driver [kanikani]
* Plump Pop
  - update DIPSW item (collision between each players' child)
  - added DIPLOCATION
* Extermination
* Arkanoid Revenge of DOH
* Dr.Toppel
* Kageki
* Chuka Taisen
* The Newzealand Story
  - added DIPLOCATION
* Kabuki Z
  - fixed difficulty DIPSW (EASY and MEDIUM is reversed)
  - added DIPLOCATION
* Insector X
  - fixed difficulty DIPSW (based on manual)
  - added DIPLOCATION
  

Various fixes in tmnt.c driver [kanikani]
* T.M.N.T.
  - fixed visible area (garbage on each side is correct (verified on PCB))
  - fixed DIPSW
  - added DIPLOCATION
* Golfing Greats
  - fixed inputs
  - fixed DIPSW
  - added DIPLOCATION
* Trigon
* Cuebrick
* M.I.A.
* Punk Shot
  - fixed DIPSW
  - added DIPLOCATION
* Premiere Soccer
  - added DIPLOCATION


Various fixes in ninjaw.c driver [kanikani]
* Ninja Warriors
  - added DIPSW notes
* Darius II
  - fixed DIPSW
  - fixed game description


Various fixes in twin16.c driver [kanikani]
* Majuu no Oukoku
  - fixed inputs
  - fixed DIPSW
  - added DIPLOCATION
* Gradius II
* Hard Puncher
* M.I.A.
* Cuebrick
  - fixed DIPSW
  - added DIPLOCATION


Fixed DIPSW in Darius II [kanikani]

Fixed DIPSW in Ninja Ryuukenden / Ninja Gaiden [kanikani]

Fixed inputs and DIPSW in toaplan1.c, toaplan2.c, twincobr.c, wardner.c drivers [kanikani]


Various fixes in galaga.c driver [kanikani]
* Bosconian
  - fixed DIPSW
  - fixed DIPLOCATION
* Galaga
* Xevious
* DigDug
  - fixed DIPLOCATION


Fixed DIPSW and DIPLOCATION in segas24.c driver [kanikani]


Fixed DIPSW and DIPLOCATION in segas18.c driver [kanikani]


Fixed DIPSW in segag80r.c driver [kanikani]


Fixed DIPSW in segag80v.c driver [kanikani]


Fixed DIPSW in segald.c driver [kanikani]


Fixed DIPSW in Ninjakun and Penguin-Kun Wars [kanikani]


Various fixes in dec0.c driver [kanikani]
* Heavy Barrel
  - fixed DIPSW
  - fixed DIPLOCATION
* Birdie Try
* Dragon Ninja
* Fighting Fantasy
* Midnight Resistance
  - fixed DIPSW
* Robocop
  - fixed DIPLOCATION


Fixed coinage DIPSW using Sega common setting in segaybd.c,
segaorun.c, segaxbd.c, segahang.c, segae.c, segac2.c, segas16a.c
and segas16b.c drivers [kanikani]


Fixed coinage DIPSW using Konami common setting in chqflag.c, pooyan.c
and rockrage.c drivers [kanikani]

Various fixes in sega16b.c driver [kanikani]
* Ace Attacker
  - added I/O board read routine
* Dunk Shot
  - fixed DIPLOCATION
* Sukeban Janshi Ryuko
  - added DIPSW
* Time Scanner
  - fixed DIPSW

Various fixes in sega16a.c driver [kanikani]
* Ace Attacker
  - changed to use analog device
* Sukeban Janshi Ryuko
  - added DIPSW
* Time Scanner
  - fixed DIPSW


Fixed / added comments in ninjakd2.c driver [kanikani]


Made some video optimizations in toypop.c driver [kanikani]


Fixed inputs and DIPSW in djmain.c driver [kanikani]


Fixed DIPLOCATION in Pop'n Stage [kanikani]
2011-10-23 13:29:16 +00:00
Angelo Salese
0b5d8e2e9b validity.c better explaination 2011-09-12 21:39:26 +00:00
Angelo Salese
fd97e3da4c Clean-ups and version bump 2011-08-14 23:01:08 +00:00
Miodrag Milanovic
3e9ddb6717 Added validation to check if required devices with roms are listed in lst file (no whatsnew) 2011-08-03 13:30:16 +00:00
Miodrag Milanovic
3bdfb55b35 - Updated romload so devices are loaded from separate files [Miodrag Milanovic]
- Removed LOADBYNAME, since it is deprecated by using per device rom load_software_part_region

- Created makedev tool to generate array of devices, and created lst file according to current devices usage.

- Changed listxml command to output device roms too
2011-08-02 15:09:21 +00:00
Angelo Salese
a23c194ed5 Port from MESS, nw 2011-06-28 14:23:18 +00:00
Miodrag Milanovic
2e199e3e83 Fixed PORT_CONDITION to look relative to device (no whatsnew) 2011-06-22 12:54:34 +00:00
R. Belmont
1a23f8659b More GCC 4.6 fixes (no whatsnew) 2011-05-30 02:19:30 +00:00
Aaron Giles
d5af6b6a9b Switch input ports to use function-based constructors instead of tokens.
Remove the old tokenizing helpers. Add basic classes for ports, fields,
settings, and dip locations as a first step. These will be fully cleaned
up later. Added machine() method to field to hide all the necessary
indirection. Changed custom/changed handlers into generic read/write
handlers, and added wrappers to convert them to device read/write
lines. [Aaron Giles]
2011-05-10 22:20:27 +00:00
Aaron Giles
ff1db593b7 Attach gamedrv's input ports to the driver_device, so that there's
no longer anything special about how they are processed. Removed
logic that handled the game inputs as a special case.
2011-05-05 07:02:28 +00:00
Aaron Giles
919913f118 Collapsed device_config and device_t into one class. Updated all
existing modern devices and the legacy wrappers to work in this
environment. This in general greatly simplifies writing a modern
device. [Aaron Giles]

General notes:
 * some more cleanup probably needs to happen behind this change,
   but I needed to get it in before the next device modernization 
   or import from MESS  :)

 * new template function device_creator which automatically defines
   the static function that creates the device; use this instead of
   creating a static_alloc_device_config function

 * added device_stop() method which is called at around the time
   the previous device_t's destructor was called; if you auto_free
   anything, do it here because the machine is gone when the 
   destructor is called

 * changed the static_set_* calls to pass a device_t & instead of
   a device_config *

 * for many devices, the static config structure member names over-
   lapped the device's names for devcb_* functions; in these cases
   the members in the interface were renamed to have a _cb suffix

 * changed the driver_enumerator to only cache 100 machine_configs
   because caching them all took a ton of memory; fortunately this
   implementation detail is completely hidden behind the 
   driver_enumerator interface

 * got rid of the macros for creating derived classes; doing it
   manually is now clean enough that it isn't worth hiding the
   details in a macro
2011-04-27 05:11:18 +00:00
Aaron Giles
00d745ca77 (Big tangle of changes that all happened as I was looking into the ROM
loader rewrite, which is still in progress....)

Replaced mamedriv.c with a new driver list mechanism that is generated
by the build tools. The emulator core now expects the presence of a
file called src/$(TARGET)/$(SUBTARGET).lst which is just a raw list of
driver names, one per line. C and C++ comments are still permitted.
This file is parsed by a new build tool makelist which extracts the
driver names, sorts them, and generates a file called drivlist.c, which
is consumed by the core. [Aaron Giles]

Added new osdcore function osd_malloc_array() which is identical to
osd_malloc() but obviously hints that the underlying allocation is for
an array. Updated all callers to use the appropriate form. Modified the
Windows allocator to only use guard pages for array-style allocations,
allowing us to enable them once again in debug builds. [Aaron Giles]

Created new static class driver_list to wrap accesses to the list of
available drivers. Improved speed of driver lookups by relying on the
presorting done by makelist. [Aaron Giles]

Created helper class driver_enumerator as a helper for iterating through 
the list of drivers. This class supports basic filtering and iteration,
and also serves as a temporary cache of machine_configs. [Aaron Giles]

Created cli_frontend object to wrap all the CLI handling code in
clifront.c. Updated/simplified all the code to take advantage of the
driver_enumerator. [Aaron Giles]

Created media_auditor object to wrap all the auditing functions in
audit.c. Updated all users to the new interface. Note that the new
auditing mechanism is slightly out of sync with the romload code in
terms of finding ROMs owned by devices, so it may mis-report some
issues until the new ROM loading code is in. [Aaron Giles]

Added concept of a per-device searchpath. For most devices, their 
searchpath is just the short name of the device. For driver_devices, the
searchpath is driver[;parent[;bios]]. This searchpath will eventually be
used by the rom loader to find ROMs. For now it is used by the media
auditor only. [Aaron Giles]

Created info_xml_creator object to wrap all the info generation functions
in info.c. Converted the file to C++ and cleaned up the input processing
code. [Aaron Giles]

(not for whatsnew ... Known issues: auditing of CHDs appears busted, and 
debug builds report unfreed memory if you use the built-in game picker)
2011-04-13 20:31:00 +00:00
Aaron Giles
28fdb61512 Move overridable device->rom_region(), device->machine_config_additions(), and
device->input_ports() to protected methods. Added non-virtual wrappers around
them.
2011-03-30 06:27:49 +00:00
Aaron Giles
fe71058aa2 Don't pass both a machine_config and an emu_options, since the options
are now available via the config.
2011-03-11 06:01:58 +00:00
Aaron Giles
04c9a546b5 Attached emu_options to the machine_config, and the running_machine
inherits it now.
2011-03-10 10:17:30 +00:00
Aaron Giles
06ee6804dd Converted core_options to a class. Removed a bunch of marginal
functionality in favor of alternate mechanisms. Errors are
now reported via an astring rather than via callbacks. Every
option must now specify a type (command, integer, float, string,
boolean, etc). Command behavior has changed so that only one
command is permitted. [Aaron Giles]

Changed fileio system to accept just a raw searchpath instead of
an options/option name combination. [Aaron Giles]

Created emu_options class dervied from core_options which wraps
core emulator options. Added mechanisms to cleanly change the
system name and add/remove system-specific options, versus the
old way using callbacks. Also added read accessors for all the
options, to ensure consistency in how parameters are handled.
Changed most core systems to access emu_options instead of
core_options. Also changed machine->options() to return emu_options.
[Aaron Giles]
 
Created cli_options class derived from emu_options which adds the
command-line specific options. Updated clifront code to leverage
the new class and the new core behaviors. cli_execute() now accepts
a cli_options object when called. [Aaron Giles]

Updated both SDL and Windows to have their own options classes,
derived from cli_options, which add the OSD-specific options on
top of everything else. Added accessors for all the options so
that queries are strongly typed and simplified. [Aaron Giles]

Out of whatsnew: I've surely screwed up some stuff, though I have
smoke tested a bunch of things. Let me know if you hit anything odd.
Also I know this change will impact the WINUI stuff, please let me 
know if there are issues. All the functionality necessary should 
still be present. If it's not obvious, please talk to me before 
adding stuff to the core_options class.
2011-03-03 17:05:24 +00:00
Aaron Giles
5e4df8c772 Hash generation and general cleanup. New class hash_collection holds
and manages a collection of hashes, and can be built from an internal
format string which is stored with each ROM. All core instances are
cleaned up to use the new interfaces, but it's likely that hashfile
code in MESS will need an update.

Also compacted the form of the hash strings used for ROMs, and fixed
verification/hashing of non-ZIPped files.
2011-02-14 08:41:08 +00:00
Miodrag Milanovic
569f818281 Input ports can now be added to device, names are formed as sub tags from parent device tag. [Miodrag Milanovic] 2011-02-13 17:45:31 +00:00
Aaron Giles
1b54456be5 mame_file is now emu_file and is a class. It is required
to pass a core_options object to the constructor, along with
a search path. This required pushing either a running_machine
or a core_options through some code that wasn't previously
ready to handle it. emu_files can be reused over multiple 
open/close sessions, and a lot of core code cleaned up
nicely as things were converted to them.

Also created a file_enumerator class for iterating over files
in a searchpath. This replaces the old mame_openpath functions.

Changed machine->options() to return a reference.

Removed public nvram_open() and fixed jchan/kaneko16 to
stop directly saving NVRAM.

Removed most of the mame_options() calls; this will soon go 
away entirely, so don't add any more.

Added core_options to device_validity_check() so they can be
used to validate things.
2011-02-12 03:47:37 +00:00
Miodrag Milanovic
a9dc2227c9 Display all warnings during validate of devices shortname (no whatsnew) 2011-02-10 20:25:27 +00:00
Miodrag Milanovic
601056b130 - Added shortname to devices in order to make ROM loading per device possible. [Miodrag Milanovic]
- Updated all devices containing ROM regions to have short names and all modern devices too
- Created new validation to check existence of short name if device contain ROM region defined
2011-02-10 19:08:37 +00:00
Aaron Giles
57ef3a5ed6 Split the screen device into a separate module.
Converted global video routines into a video_manager.
Moved video manager initialization earlier in startup.
2010-12-02 17:26:38 +00:00
Aaron Giles
e4d8baf401 Changed driver_device to expose the game_driver's ROMs through the
device interface. This means all ROMs are now exposed via devices,
and thus the process of enumerating ROMs gets simpler.

Changed all instances of temporarily allocating machine_config objects 
to just put them on the stack for simplicity, letting the destructor 
handle the cleanup work automatically.

Changed machine_config constructor to take a game_driver, from which
the machine_config constructor is obtained. This also means the
resulting machine_config holds a reference to the game_driver.

Changed running_machine constructor to no longer take a game_driver,
since the game_driver is now obtainable via the machine_config.
2010-09-03 05:21:46 +00:00
Aaron Giles
0e672ba6eb Cleanups and version bump. 2010-08-30 15:20:58 +00:00
Aaron Giles
d5d2cd0bb9 Haha, recent change to astrings also revealed that validity checks
were busted for ROM_FILL/ROM_COPY (we didn't detect regions populated
this way were non-empty).
2010-08-21 19:37:32 +00:00
Aaron Giles
4d1fc8fafa Swap: (astring.len() != 0) -> astring
Swap: (astring.len() == 0) -> !astring
2010-08-21 19:27:14 +00:00
Aaron Giles
f5a217442a Fix crasher caused by new astring operators (original code
was buggy, but didn't crash before).
2010-08-19 19:59:16 +00:00