#################################
# Clean No-Intro ROMs
# Author: SigKill
# Website: http://sigkillit.com
# Last Updated: 05/02/2025
################################# IMPORTANT: Make sure no Antivirus or Backups are scanning the source or destination folders for maximum performance!
#################################
#################################



CHANGE LOG
#################################

## [v6.1] - 05/02/2025
-Updated filters to remove additional non-games and duplicates based on scraping tests

## [v6.0] - 06/07/2023
-Rewrote all code to add features, updates, general code improvements, and optimizations for All Scripts which in some cases such as 3_CheckXML.ps1 are 10x faster!
-Added readme.txt and moved the change logs to there instead of the individual scripts.
-Updated Write-Out to v1.5 to allow support for multiple log files.
-Added ability to have Custom ROMs in Addition to No-Intro ROMs and Renamed functions to generalize the names.
-Added ability to detect Multicart ROMs for gaming systems that used multiple disks for a single game. I would consider this an experimental feature at the moment and will probably be improved in a future release.  So far in my testing, I'm getting the same results as v5.5 so it looks to be working fine but helps cleanup the filters needed.
-Replaced split() with -split to determine Primary ROM name. Split() is char array and -split is string array which allows using regex for advanced matching.
-Fixed issue with unzipping ROMs by Adding -LiteralPath
-On Filters, Renamed $romSplitchar with $romSplitstr to reflect switching to -split
-On Filters, Added $romSortAscending to allow sorting ROMS Ascending or Descending to determine Primary ROM name
-On Filters, added $romsMultiCart to detect Multicart Games
-Repaced Sort-Object with Natural Sort when determining primary ROM for ascending/descending order.
-Added variables to optionally skip sections of the script for faster results or test runs
-Added additional time tracking to results

## [v6.0b] - 06/07/2023
-Different code in '1_Clean-NoIntroRoms.ps1' Clean-Roms() Function on "STEP 3/7): Remove Exceptions" versus the code in the v6.0 release that I might want to later implement. This code seems to run faster on larger data sets or when it matches a large number of files to remove as exceptions. However, it seems to suffer when doing exact ROM matches, which is why I opted to pull it.

## [v5.6] - 11/5/2022
-Added 4_UpdateVersion.ps1 Script to programatically update version #'s on scripts and filters
-Added "Description" to Filters to help identify the ROM set they're intended to be used on. 
-Updated Clean-NoInroRoms Default Filters to Include a Description.

## [v5.5] - 10/3/2022
-Added $romSplitchar variable to Filters to customize how unique ROM names are determined
-Everything to the left of $romSplitchar is determined to be the unique ROM name.  
-If $romSplitchar is left blank, all ROMs will be skipped. Recommended to keep default '(' for No-Intro ROMs
-Fixed logs in 1_Clean-NoIntroRoms_Exceptions.log so they stay in order

## [v5.4] - 10/3/2022
-Fixed bug in Get-NoIntroRomsExceptions When ROM Name Does Not Contain '('
-Fixed bug setting non-duplicate primary ROM due to name missing $romSplitchar resulting in 0 matches
-Updated Filters by adding ROM extensions as last resort when matching, otherwise primary ROM is never set
-Added $global:scriptVersion to Set Filter Version in Get-NoIntroDefaultFilters Function

## [v5.3] - 12/11/2020
-Re-Added Function Get-NoIntroDefaultFilters which was accidently removed from version 5.2
-Renamed "config" to "filter" where filters are stored
-Added Changelog in Comments

## [v5.2] - 10/8/2020
-Added variables for Write-Out Colors and Updated to Write-Out v1.3
-Updated Filters
-On CheckXML.ps1, Missing attributes set to $true were not being detected, only worked if they had a blank value

## [v5.1] - 9/28/2020
-Fixed minor bugs and updated filters

## [v5.0] - 9/10/2020
-Rewrote the code to be modular by importing filters for each game system instead of using separate scripts
-Added variables to define where to store game system filters and logs
-Replaced $MyInvocation.MyCommand.Name with $PSCommandPath which requires Powershell 3 or greater
-Replaced Log-Write with Write-Out function which requires Powershell 4 or greater
-Added Atari Jaguar because it can run on PI4 with proper customization
-Fixed bug with romsDoNotDelete
-Fixed bug where exceptions were not removed from uniqueRom causing it to still evaluate them for duplicates



SCRIPT USAGE
#################################

1_Clean-NoIntroRoms.ps1
*********************************
Description: 
	I did not want my RetroPie to be cluttered with unnecessary ROMs. I only wanted the original games, I did not want duplicates, revisions, and I preferred games in English. For example, the NES has about 716 officially licensed games and the No-Intro 2018 ROM set has about 2,748 games in it. I wanted to reduce that number closer to the officially licensed games count to save space and reduce the amount of ROMs I would have to scroll through each time. I decided to create several powershell scripts based on the No-Intro 2018 ROM set to accomplish my goal, which is explained in further detail below.

[ROM Sets Directories and Processing]
$global:romNoIntroDirectory: 
	Source No-Intro 2018 Game System ROM Directory. Each game system should have a folder in here that matches in $global:romNoIntroHashTable. 
	Default is "C:\Games\No-Intro 2018\".

$global:romCustomDirectory: 
	Source Custom Game System ROM Directory. Each game system should have a folder in here that matches in $global:romCustomHashTable. 
	Default is "C:\Games\No-Intro 2018\".

$global:romCleanDirectory: 
	Destination Directory to Copy Cleaned Source ROMs. Each game system will have a directory in here that matches the one on retropie as  defined in $global:romNoIntroHashTable and $global:romCustomHashTable. 
	Default is "C:\Games\RetroPie\roms\".

$global:romCleanDirectoryPurge: 
	Purge the $global:romCleanDirectory Directory Before Copying ROMs. It is recommended to enable this to ensure you ONLY have the cleaned ROMs in your destination directory. When running the script multiple times while changing filters, your cleaned ROM results will differ. For example: On your initial run you end up with 100 cleaned ROMs, then you modify a filter for a second run that has 95 cleaned ROMs, you would still have at least 100 ROMs in the Destination Cleaned ROM directory even if you enabled	$global:romOverwrite. 
	Default is $true.

$global:romOverwrite: 
	Overwrite existing ROMs in each game system directory in $global:romCleanDirectory if the game system directory exists. When $false, it will not copy any ROMs into the game system directory if it exists. When $true, it will copy and overwrite ROMs into the game system directory if it exists, but will not remove any additional ROMs or files that exist. The intent is to replace a ROMs you find issues with when testing without having to clear the entire directory such as replacing a corrupt ROM with a known good ROM of the same name.  It is recommended to use $global:romCleanDirectoryPurge instead. 
	Default is $false.

$global:romFilterDirectory: 
	Directory that stores the "filters" for each game system. The filters are .ps1 files named using the RetroPie directory name defined in $global:romNoIntroHashTable and $global:romCustomHashTable. I have customized the filters for each system and included them by default. You can modify them to your liking or if they do not exist, the script will generate a generic filter for each system. 
	Default is a "filters" folder in the same directory as the script.
	
$global:romNoIntroHashTable: 
	HashTable containing No-Intro ROM directory names on the retropie and your source directory. You can comment out any game system in the hashtable if you do not want to run the script for that game system. For example, if you only want to clean ROMS for Nintendo NES, you can comment out the other systems by adding a # at the begginning of that line ex: # "nes" = "Nintendo - Nintendo Entertainment System [headered]". 
	Default is all enabled.
	
$global:romCustomHashTable: 
	HashTable containing Custom ROM directory names on the retropie and your source directory. You can comment out any game system in the hashtable if you do not want to run the script for that game system. For example, if you only want to clean ROMS for NeoGeo, you can comment out the other systems by adding a # at the begginning of that line ex: # "neogeo" = "neo-geo-mvs-romset". 
	Default is all enabled.

[Enable/Disable Parts of the Script to Run]
$global:runNoIntroRomsExceptions: 
	Enable/Disable running the Get-RomsExceptions Function used to build a list of potential exceptions to create filters used to remove unwanted ROMs for each system defined in the $global:romNoIntroHashTable. 
	Default is $true.
	
$global:runNoIntroRoms: 
	Enable/Disable running the Clean-Roms Function used to clean No-Intro ROMs defined in the $global:romNoIntroHashTable. 
	Default is $true.
	
$global:runCustomRomsExceptions: 
	Enable/Disable running the Get-RomsExceptions Function used to build a list of potential exceptions to create filters used to remove unwanted ROMs for each system defined in the $global:romCustomHashTable. 
	Default is $false.

$global:runCustomRoms: 
	Enable/Disable running the Clean-Roms Function used to clean Custom ROMs defined in the $global:romCustomHashTable. 
	Default is $false.

[Retropie Upload ROM Variables]
$global:romRetropieUpload: 
	Enable/Disable uploading cleaned ROMs to Retropie. 
	Default is $true.
	
$global:romRetropieDirectory: 
	UNC SMB path for your retropie roms directory. You shouldn't have to change this variable unless your comptuter is unable to resolve the retropie name on your network in which case you can replace it with the ip ex: "\\192.168.5.25\roms\". 
	Default is "\\retropie\roms\"
							  
$global:romRetropieDirectoryPurge: 
	Purge the destion ROM directory for each game system prior to copying the cleaned Rom Source to your retropie. It is recommended to enable this to ensure you ONLY have the cleaned ROMs. 
	Default is $true.

$global:romRetropieOverwrite: 
	Overwrite existing ROMs in each game system directory in $global:romRetropieDirectory if the game system directory exists. When $false, it will not copy any ROMs into the game system directory if it exists. When $true, it will copy and overwrite ROMs into the game system directory if it exists, but will not remove any additional ROMs or files that exist. It is recommended to use $global:romRetropieDirectoryPurge instead. 
	Default is $false.

[System Variables - Do Not Change These]
$global:scriptName: Defaults to name of the .ps1 script. Do not change this.
$global:scriptVersion: Script version.  Do not change this.
$global:logFile: Main log file where all output is stored. Do not change this.
$global:logOverwrite: Overwrite Log Files each time the script runs. Do not change this.
$global:logVerbose: Log detailed info for determining primary ROM for debugging. Do Not change this.
$global:logRemoveExceptions: Log removal of ROM Exceptions. Default is true, and setting to false is for advanced use only to speed up results on large ROM sets. Do not change this.
$global:colorMain: Text color output to screen. Do not change this.
$global:colorSub1: Text color output to screen. Do not change this.
$global:colorSub2: Text color output to screen. Do not change this.
$global:colorSub3: Text color output to screen. Do not change this.
$global:colorOk: Text color output to screen. Do not change this.
$global:colorWarn: Text color output to screen. Do not change this.
$global:colorError: Text color output to screen. Do not change this.


2_CompareFolderResults
*********************************
Description: 
	This is intended to be used as the supplemental script (2_CompareFolderResults.ps1) to be used in conjunction with the 1_Clean-NoIntroRoms.ps1 and 3_CheckXML.ps1 scripts. This script allows you to compare the files/roms in 2 directories to show the differences in files of each folder by using the compare-object cmdlet. It is intended to compare the different results in 1_Clean-NoIntroRoms.ps1 when you change the filters for a system.

[ROM Sets Directories and Processing]
$global:romCleanDirectory1: 
	Directory with Cleaned ROMs. Each game system will have a directory in here that matches the one on retropie as defined in $global:romNoIntroHashTable and $global:romCustomHashTable. 
	Default is "C:\Games\RetroPie\roms\".

$global:romCleanDirectory2: 
	Alternate Directory with Cleaned ROMs, which you want to compare to $global:romCleanDirectory. If you want to test modifying filters on 1_Clean-NoIntroRoms.ps1, you can use this directory to compare your results. 
	Default is "C:\Games\RetroPie\roms2\".
	
$global:romNoIntroHashTable: 
	HashTable containing No-Intro ROM directory names on the retropie and your source directory. You can comment out any game system in the hashtable if you do not want to run the script for that game system. For example, if you only want to clean ROMS for Nintendo NES, you can comment out the other systems by adding a # at the begginning of that line ex: # "nes" = "Nintendo - Nintendo Entertainment System [headered]". 
	Default is all enabled.
	
$global:romCustomHashTable: 
	HashTable containing Custom ROM directory names on the retropie and your source directory. You can comment out any game system in the hashtable if you do not want to run the script for that game system. For example, if you only want to clean ROMS for NeoGeo, you can comment out the other systems by adding a # at the begginning of that line ex: # "neogeo" = "neo-geo-mvs-romset". 
	Default is all enabled.

[Enable/Disable Parts of the Script to Run]
$global:runNoIntroRoms: 
	Enable/Disable comparing folders for No-Intro ROMs defined in $global:romNoIntroHashTable. 
	Default is $true.

$global:runCustomRoms: 
	Enable/Disable comparing folders for Cusom ROMs defined in $global:romNoIntroHashTable. 
	Default is $false.

[System Variables - Do Not Change These]
$global:scriptName: Defaults to name of the .ps1 script. Do not change this.
$global:scriptVersion: Script version.  Do not change this.
$global:logFile: Main log file where all output is stored. Do not change this.
$global:logOverwrite: Overwrite Log Files each time the script runs. Do not change this.
$global:colorMain: Text color output to screen. Do not change this.
$global:colorSub1: Text color output to screen. Do not change this.
$global:colorSub2: Text color output to screen. Do not change this.
$global:colorSub: Text color output to screen. Do not change this.
$global:colorOk: Text color output to screen. Do not change this.
$global:colorWarn: Text color output to screen. Do not change this.
$global:colorError: Text color output to screen. Do not change this.


3_CheckXML.ps1
*********************************
Description: 
	This is intended to be used as the supplemental script (3_CheckXML.ps1) to be used in conjunction with the 1_Clean-NoIntroRoms.ps1 and 2_CompareFolderResults.ps1 scripts. This script allows you check missing scraped data in RetroPie by examining the gamelist.xml file for each game system on you RetroPie. This can save you HOURS of time manually checking for missing ROM scraped data. In addition, it helps identify potential duplicate ROMs based on the scraped Name.  NOTE: Duplicate detection was re-written in 6.0, so it is about 10x faster! You can Check No-Intro in about 1min vs. 10min on older versions of the script.

[ROM Sets Directories and Processing]
$global:GameListRoot: 
	Directory on retropie containing the gamelist.xml files for each game system. You shouldn't have to change this variable unless your comptuter is unable to resolve the retropie name on your network in which case you can replace it with the ip ex: "\\192.168.5.25\roms\". 
	Default is "\\retropie\configs\all\emulationstation\gamelists\".

$global:romSplitstr: 
	Manually set $romSplitst, otherwise it will import it from the games filter file. This is used to determine the ROM's unique name. 
	Default is "" so it will import from the games Filter.

$global:romFilterDirectory: 
	Directory that stores the "filters" for each game system. The filters are .ps1 files named using the RetroPie directory name defined in $global:romNoIntroHashTable and $global:romCustomHashTable. I have customized the filters for each system and included them by default. You can modify them to your liking or if they do not exist, the script will generate a generic filter for each system. 
	Default is a "filters" folder in the same directory as the script.				  

$global:FindDuplicates: 
	Optionally skip duplicate detection and only do $global:ValidateData checks. Duplicate detection was greately improved in version 6.0 to be about 10x faster, so it's not really necessary to disable this. 
	Default setting is $true. 

$global:IgnoreMulticartDuplicates: 
	If enabled, any potential duplicate ROM that matches the regex in $MultiCartExceptions would be excluded as a duplicate. 
	Default is $true.

$global:MultiCartExceptions: 
	Manually set $MultiCartExceptions, otherwise it will import from the games filter file if left blank.  This is used to determine Multirom games.
	Default is @().

$global:ValidateVerbose: 
	Override all settings in ValidateChild and Validate all properties in it. Please note, many game systems do not use all of the properties, so this will add a lot more results and increase the time to run the script.
	Default is $false.

$global:ValidateData: 
	Allows you to individually set the properties to check if the data has been scraped. Please note, many game systems do not use all of the properties, or you may have chosen to not scrape certain data such as videos to save disk space. I have only enabled the most common properties by default. If $global:ValidateVerbose is enabled, all properties set here will be ignored and it will check all properties. 
	Default is "name, image, desc" set to $true and the rest set to $false.

$global:romNoIntroHashTable: 
	HashTable containing No-Intro ROM directory names on the retropie and your source directory. You can comment out any game system in the hashtable if you do not want to run the script for that game system. For example, if you only want to clean ROMS for Nintendo NES, you can comment out the other systems by adding a # at the begginning of that line ex: # "nes" = "Nintendo - Nintendo Entertainment System [headered]". 
	Default is all enabled.
	
$global:romCustomHashTable: 
	HashTable containing Custom ROM directory names on the retropie and your source directory. You can comment out any game system in the hashtable if you do not want to run the script for that game system. For example, if you only want to clean ROMS for NeoGeo, you can comment out the other systems by adding a # at the begginning of that line ex: # "neogeo" = "neo-geo-mvs-romset". 
	Default is all enabled.

[Enable/Disable Parts of the Script to Run]
$global:runNoIntroRoms: 
	Enable/Disable checking XML for No-Intro ROMs defined in $global:romNoIntroHashTable. 
	Default is $true.
	
$global:runCustomRoms: 
	Enable/Disable checking XML for Custom ROMs defined in $global:romCustomHashTable. 
	Default is $false.

[System Variables - Do Not Change These]
$global:scriptName: Defaults to name of the .ps1 script. Do not change this.
$global:scriptVersion: Script version.  Do not change this.
$global:logFile: Main log file where all output is stored. Do not change this.
$global:logOverwrite: Overwrite Log Files each time the script runs. Do not change this.
$global:colorMain: Text color output to screen. Do not change this.
$global:colorSub1: Text color output to screen. Do not change this.
$global:colorSub2: Text color output to screen. Do not change this.
$global:colorSub: Text color output to screen. Do not change this.
$global:colorOk: Text color output to screen. Do not change this.
$global:colorWarn: Text color output to screen. Do not change this.
$global:colorError: Text color output to screen. Do not change this.


4_UpdateVersion.ps1
*********************************
Description: 
	This is intended to be used as the supplemental script (4_UpdateVersion.ps1) to be used in conjunction with the scripts 1_Clean-NoIntroRoms.ps1, 2_CompareFolderResults.ps1 scripts, 3_CheckXML.ps1, and game system filters. Whenever an update is made to any scripts or filters that requires a version update, this script will update the version number in each file. In addition, it will append the version to the 'CHANGE LOG' section in readme.txt, which you can add the changes made.

[ROM Filters Directories and Processing]	
$global:romFilterDirectory: 
	Directory that stores the "filters" for each game system. The filters are .ps1 files named using the RetroPie directory name defined in $global:romNoIntroHashTable. I have customized the filters for each system and included them by default. You can modify them to your liking or if they do not exist, the script will generate a generic filter for each system. 
	Default is a "filters" folder in the same directory as the script.

$FileVersion: 
	Manually Set Script Version here or Read it From First Script File.
	Default is "", which means it will read the value from the first Script File.

[System Variables - Do Not Change These]
$global:scriptName: Defaults to name of the .ps1 script. Do not change this.
$global:scriptVersion: Script version.  Do not change this.
$global:logFile: Main log file where all output is stored. Do not change this.
$global:logOverwrite: Overwrite Log Files each time the script runs. Do not change this.
$global:colorMain: Text color output to screen. Do not change this.
$global:colorSub1: Text color output to screen. Do not change this.
$global:colorSub2: Text color output to screen. Do not change this.
$global:colorSub: Text color output to screen. Do not change this.
$global:colorOk: Text color output to screen. Do not change this.
$global:colorWarn: Text color output to screen. Do not change this.
$global:colorError: Text color output to screen. Do not change this.



FILTERS USAGE
#################################

Description: 
	I have customized and included these since v5.0 and they are located in ".\filters\<gamesystem>.ps1". If you want customize which ROMs are cleaned or kept for each system, this is what you want to change.

$romSplitstr: 
	Customize the string used to split a ROM name to determine the unique ROM names by using everything to the left of this string. This string is a regex to allow advanced matching, but you need to escape special characters using a backslash '\' or using [regex]::escape(), which will automatically escape any special characters. 
	Default for the No-Intro ROMs this is a left parenthesis set as "\(" or [regex]::escape("("), and varies for the Custom ROMs. For example, when comparing "Darkwing Duck (USA).zip" and  "Darkwing Duck (Europe).zip" for NES, the unique ROM name would be "Darkwing Duck ". The script would then use $romSortOrder to determine which of the two files to keep, which would be the USA version if you use my default filters.

$romSortAscending: 
	Determines if the ROMs are sorted in ascending/descending alphabetical order. The sort order determines the order the ROMs are matched in $romsSortOder and if there are no matches the first file is chosen as primary. 
	Default is $true which sorts ROMs ascending.

$romUnzip: 
	Unzip ROMs for emulators that don’t support .zip files. Setting this to $true will unzip the files and $false will NOT unzip them after cleaning then in Script 1.

$romsDoNotDelete: 
	Any exact ROM name (including extension) in this list will NOT be deleted. ROMs listed here will not be deleted even in they match a value in $romsExceptions or they are NOT the Primary ROM via $romSortOrder. Ex: "Castlevania (USA) (Rev A).zip" would always keep this specific ROM.
	Default is @().

$romsExceptions: 
	Any ROMs containing these strings or exact ROM name will be removed unless the exact ROM name is in $romsDoNotDelete.
	Default is @().

$romsSortOrder: 
	Preferred sorting order to pick 1 Primary ROM to keep when evaluating duplicates. Uses regular expressions to define the preferred sorting order based on language, and if there are no matches it will determine the primary ROM by either ascending/descending alphabetical order defined in $romSortAscending. ROMs in $romsExceptions will not be deleted even if it is not determined to be the Primary ROM.
	Default is @().

$romsMultiCart
	I would consider this an experimental feature as of v6.0 and will probably be improved in a future release. Some gaming systems used multiple disks for a single game, and this allows you to keep these multicarts as an exception. Once the primary ROM is determined for a game, it will check if it has a multicart exception by checking if the primary ROM name matches a regex in $romsMultiCart. If a match is found, it considers a multicart the exact name of the ROM and replaces the matching text with the regex $romsMultiCart. For example, in the $romsMultiCart hash table, if you had the value "\(Disk\s?[1-4].*\)" and your primary ROM was "Dungeon Master (Disk 1).zip", it would consider any ROM matching the name "Dungeon Master (Disk #).zip" a Multicart exception to keep where # is 1 to 4.
	Default is @().
	


EXPECTED RESULTS & TROUBLESHOOTING
#################################

1_Clean-NoIntroRoms.ps1 should take about 17 minutes to complete All No-Intro ROMs and 49 minutes for All Custom ROMs, which is skewed by ZXSpectrum that takes about 36 minutes.  If the script seems to be running slow, ake sure you don't have any Antivirus or Backup software running on the source, destination, or script directories.
Here are my No-Intro 2018 & Custom Results for comparison:

No-Intro 2018 ROMs
*********************************
ATARI2600
================================================================
ROMs TOTAL              : 582
ROMs UNIQUE             : 566
ROMs Multicart Games    : 0
ROMs Multicarts Kept    : 0
ROMs Exceptions Deleted : 88
ROMs Dups Deleted       : 15
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 103
ROMs Total Cleaned      : 479
ROMs Total Cleaned Size : 1.98MB
Elapsed Time            : 23.29 seconds

ATARI5200
================================================================
ROMs TOTAL              : 107
ROMs UNIQUE             : 104
ROMs Multicart Games    : 0
ROMs Multicarts Kept    : 0
ROMs Exceptions Deleted : 34
ROMs Dups Deleted       : 0
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 34
ROMs Total Cleaned      : 73
ROMs Total Cleaned Size : 0.72MB
Elapsed Time            : 5.1 seconds

ATARI7800
================================================================
ROMs TOTAL              : 116
ROMs UNIQUE             : 67
ROMs Multicart Games    : 0
ROMs Multicarts Kept    : 0
ROMs Exceptions Deleted : 10
ROMs Dups Deleted       : 47
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 57
ROMs Total Cleaned      : 59
ROMs Total Cleaned Size : 1.81MB
Elapsed Time            : 5.08 seconds

ATARIJAGUAR
================================================================
ROMs TOTAL              : 64
ROMs UNIQUE             : 61
ROMs Multicart Games    : 0
ROMs Multicarts Kept    : 0
ROMs Exceptions Deleted : 6
ROMs Dups Deleted       : 2
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 8
ROMs Total Cleaned      : 56
ROMs Total Cleaned Size : 105.35MB
Elapsed Time            : 5.8 seconds

ATARILYNX
================================================================
ROMs TOTAL              : 87
ROMs UNIQUE             : 85
ROMs Multicart Games    : 0
ROMs Multicarts Kept    : 0
ROMs Exceptions Deleted : 10
ROMs Dups Deleted       : 1
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 11
ROMs Total Cleaned      : 76
ROMs Total Cleaned Size : 10.09MB
Elapsed Time            : 5.41 seconds

ATARIST
================================================================
ROMs TOTAL              : 306
ROMs UNIQUE             : 302
ROMs Multicart Games    : 0
ROMs Multicarts Kept    : 0
ROMs Exceptions Deleted : 6
ROMs Dups Deleted       : 4
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 10
ROMs Total Cleaned      : 296
ROMs Total Cleaned Size : 99.67MB
Elapsed Time            : 40.6 seconds

COLECO
================================================================
ROMs TOTAL              : 174
ROMs UNIQUE             : 160
ROMs Multicart Games    : 0
ROMs Multicarts Kept    : 0
ROMs Exceptions Deleted : 22
ROMs Dups Deleted       : 10
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 32
ROMs Total Cleaned      : 142
ROMs Total Cleaned Size : 1.56MB
Elapsed Time            : 7.65 seconds

FDS
================================================================
ROMs TOTAL              : 319
ROMs UNIQUE             : 273
ROMs Multicart Games    : 3
ROMs Multicarts Kept    : 3
ROMs Exceptions Deleted : 70
ROMs Dups Deleted       : 21
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 91
ROMs Total Cleaned      : 228
ROMs Total Cleaned Size : 9.99MB
Elapsed Time            : 12.25 seconds

GAMEGEAR
================================================================
ROMs TOTAL              : 501
ROMs UNIQUE             : 415
ROMs Multicart Games    : 0
ROMs Multicarts Kept    : 0
ROMs Exceptions Deleted : 205
ROMs Dups Deleted       : 26
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 231
ROMs Total Cleaned      : 270
ROMs Total Cleaned Size : 45.45MB
Elapsed Time            : 15.53 seconds

GB
================================================================
ROMs TOTAL              : 1616
ROMs UNIQUE             : 1320
ROMs Multicart Games    : 1
ROMs Multicarts Kept    : 7
ROMs Exceptions Deleted : 891
ROMs Dups Deleted       : 112
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 1003
ROMs Total Cleaned      : 613
ROMs Total Cleaned Size : 63.14MB
Elapsed Time            : 36.54 seconds

GBA
================================================================
ROMs TOTAL              : 3095
ROMs UNIQUE             : 2142
ROMs Multicart Games    : 0
ROMs Multicarts Kept    : 0
ROMs Exceptions Deleted : 1335
ROMs Dups Deleted       : 602
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 1937
ROMs Total Cleaned      : 1158
ROMs Total Cleaned Size : 4473.51MB
Elapsed Time            : 192.76 seconds

GBC
================================================================
ROMs TOTAL              : 1430
ROMs UNIQUE             : 1144
ROMs Multicart Games    : 1
ROMs Multicarts Kept    : 3
ROMs Exceptions Deleted : 656
ROMs Dups Deleted       : 194
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 850
ROMs Total Cleaned      : 580
ROMs Total Cleaned Size : 240.75MB
Elapsed Time            : 40.16 seconds

MASTERSYSTEM
================================================================
ROMs TOTAL              : 573
ROMs UNIQUE             : 446
ROMs Multicart Games    : 0
ROMs Multicarts Kept    : 0
ROMs Exceptions Deleted : 267
ROMs Dups Deleted       : 24
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 291
ROMs Total Cleaned      : 282
ROMs Total Cleaned Size : 35.84MB
Elapsed Time            : 15.96 seconds

MEGADRIVE
================================================================
ROMs TOTAL              : 1813
ROMs UNIQUE             : 1307
ROMs Multicart Games    : 0
ROMs Multicarts Kept    : 0
ROMs Exceptions Deleted : 749
ROMs Dups Deleted       : 224
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 973
ROMs Total Cleaned      : 840
ROMs Total Cleaned Size : 569.35MB
Elapsed Time            : 60.69 seconds

MSX
================================================================
ROMs TOTAL              : 937
ROMs UNIQUE             : 612
ROMs Multicart Games    : 0
ROMs Multicarts Kept    : 0
ROMs Exceptions Deleted : 42
ROMs Dups Deleted       : 315
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 357
ROMs Total Cleaned      : 580
ROMs Total Cleaned Size : 12.57MB
Elapsed Time            : 31.54 seconds

N64
================================================================
ROMs TOTAL              : 950
ROMs UNIQUE             : 498
ROMs Multicart Games    : 0
ROMs Multicarts Kept    : 0
ROMs Exceptions Deleted : 352
ROMs Dups Deleted       : 277
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 629
ROMs Total Cleaned      : 321
ROMs Total Cleaned Size : 3737.25MB
Elapsed Time            : 348.64 seconds

NES
================================================================
ROMs TOTAL              : 2748
ROMs UNIQUE             : 2001
ROMs Multicart Games    : 0
ROMs Multicarts Kept    : 0
ROMs Exceptions Deleted : 1591
ROMs Dups Deleted       : 342
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 1933
ROMs Total Cleaned      : 815
ROMs Total Cleaned Size : 80.28MB
Elapsed Time            : 55.65 seconds

NGP
================================================================
ROMs TOTAL              : 11
ROMs UNIQUE             : 11
ROMs Multicart Games    : 0
ROMs Multicarts Kept    : 0
ROMs Exceptions Deleted : 5
ROMs Dups Deleted       : 0
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 5
ROMs Total Cleaned      : 6
ROMs Total Cleaned Size : 2.61MB
Elapsed Time            : 2.54 seconds

NGPC
================================================================
ROMs TOTAL              : 120
ROMs UNIQUE             : 88
ROMs Multicart Games    : 0
ROMs Multicarts Kept    : 0
ROMs Exceptions Deleted : 70
ROMs Dups Deleted       : 9
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 79
ROMs Total Cleaned      : 41
ROMs Total Cleaned Size : 22.27MB
Elapsed Time            : 4.2 seconds

PCENGINE
================================================================
ROMs TOTAL              : 420
ROMs UNIQUE             : 354
ROMs Multicart Games    : 0
ROMs Multicarts Kept    : 0
ROMs Exceptions Deleted : 20
ROMs Dups Deleted       : 61
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 81
ROMs Total Cleaned      : 339
ROMs Total Cleaned Size : 73.75MB
Elapsed Time            : 16.68 seconds

SEGA32X
================================================================
ROMs TOTAL              : 63
ROMs UNIQUE             : 51
ROMs Multicart Games    : 0
ROMs Multicarts Kept    : 0
ROMs Exceptions Deleted : 19
ROMs Dups Deleted       : 9
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 28
ROMs Total Cleaned      : 35
ROMs Total Cleaned Size : 60.67MB
Elapsed Time            : 4.54 seconds

SG-1000
================================================================
ROMs TOTAL              : 208
ROMs UNIQUE             : 101
ROMs Multicart Games    : 0
ROMs Multicarts Kept    : 0
ROMs Exceptions Deleted : 84
ROMs Dups Deleted       : 41
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 125
ROMs Total Cleaned      : 83
ROMs Total Cleaned Size : 1.13MB
Elapsed Time            : 6.52 seconds

SNES
================================================================
ROMs TOTAL              : 3486
ROMs UNIQUE             : 2267
ROMs Multicart Games    : 0
ROMs Multicarts Kept    : 0
ROMs Exceptions Deleted : 2184
ROMs Dups Deleted       : 474
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 2658
ROMs Total Cleaned      : 828
ROMs Total Cleaned Size : 672.92MB
Elapsed Time            : 80.37 seconds


VECTREX
================================================================
ROMs TOTAL              : 45
ROMs UNIQUE             : 41
ROMs Multicart Games    : 0
ROMs Multicarts Kept    : 0
ROMs Exceptions Deleted : 13
ROMs Dups Deleted       : 2
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 15
ROMs Total Cleaned      : 30
ROMs Total Cleaned Size : 0.13MB
Elapsed Time            : 4.08 seconds

VIRTUALBOY
================================================================
ROMs TOTAL              : 31
ROMs UNIQUE             : 29
ROMs Multicart Games    : 0
ROMs Multicarts Kept    : 0
ROMs Exceptions Deleted : 6
ROMs Dups Deleted       : 2
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 8
ROMs Total Cleaned      : 23
ROMs Total Cleaned Size : 8.04MB
Elapsed Time            : 2.89 seconds

WONDERSWAN
================================================================
ROMs TOTAL              : 116
ROMs UNIQUE             : 111
ROMs Multicart Games    : 0
ROMs Multicarts Kept    : 0
ROMs Exceptions Deleted : 1
ROMs Dups Deleted       : 5
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 6
ROMs Total Cleaned      : 110
ROMs Total Cleaned Size : 92.61MB
Elapsed Time            : 7.63 seconds

WONDERSWANCOLOR
================================================================
ROMs TOTAL              : 95
ROMs UNIQUE             : 92
ROMs Multicart Games    : 0
ROMs Multicarts Kept    : 0
ROMs Exceptions Deleted : 2
ROMs Dups Deleted       : 3
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 5
ROMs Total Cleaned      : 90
ROMs Total Cleaned Size : 143.92MB
Elapsed Time            : 7.47 seconds

Custom ROMs
*********************************
AMSTRADCPC
================================================================
ROMs TOTAL              : 2416
ROMs UNIQUE             : 2140
ROMs Multicart Games    : 171
ROMs Multicarts Kept    : 194
ROMs Exceptions Deleted : 60
ROMs Dups Deleted       : 53
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 113
ROMs Total Cleaned      : 2303
ROMs Total Cleaned Size : 81.66MB
Elapsed Time            : 83.28 seconds

APPLE2
================================================================
ROMs TOTAL              : 1006
ROMs UNIQUE             : 458
ROMs Multicart Games    : 141
ROMs Multicarts Kept    : 219
ROMs Exceptions Deleted : 220
ROMs Dups Deleted       : 122
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 342
ROMs Total Cleaned      : 664
ROMs Total Cleaned Size : 37.88MB
Elapsed Time            : 63.28 seconds

ATARI800
================================================================
ROMs TOTAL              : 8333
ROMs UNIQUE             : 3105
ROMs Multicart Games    : 220
ROMs Multicarts Kept    : 269
ROMs Exceptions Deleted : 3879
ROMs Dups Deleted       : 1250
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 5129
ROMs Total Cleaned      : 3204
ROMs Total Cleaned Size : 67.79MB
Elapsed Time            : 204.09 seconds

C64
================================================================
ROMs TOTAL              : 6333
ROMs UNIQUE             : 4700
ROMs Multicart Games    : 0
ROMs Multicarts Kept    : 0
ROMs Exceptions Deleted : 186
ROMs Dups Deleted       : 1568
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 1754
ROMs Total Cleaned      : 4579
ROMs Total Cleaned Size : 2220.69MB
Elapsed Time            : 290.2 seconds

COCO
================================================================
ROMs TOTAL              : 109
ROMs UNIQUE             : 97
ROMs Multicart Games    : 0
ROMs Multicarts Kept    : 0
ROMs Exceptions Deleted : 25
ROMs Dups Deleted       : 0
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 25
ROMs Total Cleaned      : 84
ROMs Total Cleaned Size : 0.95MB
Elapsed Time            : 5.77 seconds

DRAGON32
================================================================
ROMs TOTAL              : 538
ROMs UNIQUE             : 460
ROMs Multicart Games    : 2
ROMs Multicarts Kept    : 2
ROMs Exceptions Deleted : 65
ROMs Dups Deleted       : 19
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 84
ROMs Total Cleaned      : 454
ROMs Total Cleaned Size : 4.18MB
Elapsed Time            : 47.09 seconds

INTELLIVISION
================================================================
ROMs TOTAL              : 189
ROMs UNIQUE             : 161
ROMs Multicart Games    : 0
ROMs Multicarts Kept    : 0
ROMs Exceptions Deleted : 38
ROMs Dups Deleted       : 16
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 54
ROMs Total Cleaned      : 135
ROMs Total Cleaned Size : 1.1MB
Elapsed Time            : 8.83 seconds

NEOGEO
================================================================
ROMs TOTAL              : 149
ROMs UNIQUE             : 149
ROMs Multicart Games    : 0
ROMs Multicarts Kept    : 0
ROMs Exceptions Deleted : 2
ROMs Dups Deleted       : 0
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 2
ROMs Total Cleaned      : 147
ROMs Total Cleaned Size : 2631.84MB
Elapsed Time            : 74.57 seconds


TRS-80
================================================================
ROMs TOTAL              : 153
ROMs UNIQUE             : 124
ROMs Multicart Games    : 5
ROMs Multicarts Kept    : 5
ROMs Exceptions Deleted : 10
ROMs Dups Deleted       : 14
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 24
ROMs Total Cleaned      : 129
ROMs Total Cleaned Size : 2.44MB
Elapsed Time            : 13.84 seconds

ZMACHINE
================================================================
ROMs TOTAL              : 151
ROMs UNIQUE             : 46
ROMs Multicart Games    : 0
ROMs Multicarts Kept    : 0
ROMs Exceptions Deleted : 58
ROMs Dups Deleted       : 48
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 106
ROMs Total Cleaned      : 45
ROMs Total Cleaned Size : 7.27MB
Elapsed Time            : 9.67 seconds

ZXSPECTRUM
================================================================
ROMs TOTAL              : 61615
ROMs UNIQUE             : 13760
ROMs Multicart Games    : 547
ROMs Multicarts Kept    : 585
ROMs Exceptions Deleted : 39668
ROMs Dups Deleted       : 13245
ROMs Non-Dup Deleted    : 0
ROMs Total Deleted      : 52913
ROMs Total Cleaned      : 8702
ROMs Total Cleaned Size : 301.78MB
Elapsed Time            : 2171.23 seconds