/*
 *  Copyright (C) 2010-2024 Fabio Cavallo (aka FHorse)
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

#ifndef MAPPERS_H_
#define MAPPERS_H_

#include "common.h"
#include "dipswitch.h"
#include "external_calls.h"
#include "nes.h"
#include "unif.h"

#include "mappers/mapper_000.h"
#include "mappers/mapper_001.h"
#include "mappers/mapper_002.h"
#include "mappers/mapper_003.h"
#include "mappers/mapper_004.h"
#include "mappers/mapper_005.h"
#include "mappers/mapper_006.h"
#include "mappers/mapper_007.h"
#include "mappers/mapper_009.h"
#include "mappers/mapper_010.h"
#include "mappers/mapper_011.h"
#include "mappers/mapper_012.h"
#include "mappers/mapper_013.h"
#include "mappers/mapper_014.h"
#include "mappers/mapper_015.h"
#include "mappers/mapper_016.h"
#include "mappers/mapper_018.h"
#include "mappers/mapper_019.h"
#include "mappers/mapper_021.h"
#include "mappers/mapper_022.h"
#include "mappers/mapper_023.h"
#include "mappers/mapper_024.h"
#include "mappers/mapper_025.h"
#include "mappers/mapper_026.h"
#include "mappers/mapper_027.h"
#include "mappers/mapper_028.h"
#include "mappers/mapper_029.h"
#include "mappers/mapper_030.h"
#include "mappers/mapper_031.h"
#include "mappers/mapper_032.h"
#include "mappers/mapper_033.h"
#include "mappers/mapper_034.h"
#include "mappers/mapper_036.h"
#include "mappers/mapper_037.h"
#include "mappers/mapper_038.h"
#include "mappers/mapper_040.h"
#include "mappers/mapper_041.h"
#include "mappers/mapper_042.h"
#include "mappers/mapper_043.h"
#include "mappers/mapper_044.h"
#include "mappers/mapper_045.h"
#include "mappers/mapper_046.h"
#include "mappers/mapper_047.h"
#include "mappers/mapper_048.h"
#include "mappers/mapper_049.h"
#include "mappers/mapper_050.h"
#include "mappers/mapper_051.h"
#include "mappers/mapper_052.h"
#include "mappers/mapper_053.h"
#include "mappers/mapper_055.h"
#include "mappers/mapper_056.h"
#include "mappers/mapper_057.h"
#include "mappers/mapper_058.h"
#include "mappers/mapper_059.h"
#include "mappers/mapper_060.h"
#include "mappers/mapper_061.h"
#include "mappers/mapper_062.h"
#include "mappers/mapper_063.h"
#include "mappers/mapper_064.h"
#include "mappers/mapper_065.h"
#include "mappers/mapper_066.h"
#include "mappers/mapper_067.h"
#include "mappers/mapper_068.h"
#include "mappers/mapper_069.h"
#include "mappers/mapper_070.h"
#include "mappers/mapper_071.h"
#include "mappers/mapper_072.h"
#include "mappers/mapper_073.h"
#include "mappers/mapper_074.h"
#include "mappers/mapper_075.h"
#include "mappers/mapper_076.h"
#include "mappers/mapper_077.h"
#include "mappers/mapper_078.h"
#include "mappers/mapper_079.h"
#include "mappers/mapper_080.h"
#include "mappers/mapper_081.h"
#include "mappers/mapper_082.h"
#include "mappers/mapper_083.h"
#include "mappers/mapper_085.h"
#include "mappers/mapper_086.h"
#include "mappers/mapper_087.h"
#include "mappers/mapper_088.h"
#include "mappers/mapper_089.h"
#include "mappers/mapper_091.h"
#include "mappers/mapper_093.h"
#include "mappers/mapper_094.h"
#include "mappers/mapper_095.h"
#include "mappers/mapper_096.h"
#include "mappers/mapper_097.h"
#include "mappers/mapper_099.h"
#include "mappers/mapper_100.h"
#include "mappers/mapper_101.h"
#include "mappers/mapper_103.h"
#include "mappers/mapper_104.h"
#include "mappers/mapper_105.h"
#include "mappers/mapper_106.h"
#include "mappers/mapper_107.h"
#include "mappers/mapper_108.h"
#include "mappers/mapper_111.h"
#include "mappers/mapper_112.h"
#include "mappers/mapper_113.h"
#include "mappers/mapper_114.h"
#include "mappers/mapper_115.h"
#include "mappers/mapper_116.h"
#include "mappers/mapper_117.h"
#include "mappers/mapper_118.h"
#include "mappers/mapper_119.h"
#include "mappers/mapper_120.h"
#include "mappers/mapper_121.h"
#include "mappers/mapper_123.h"
#include "mappers/mapper_125.h"
#include "mappers/mapper_126.h"
#include "mappers/mapper_132.h"
#include "mappers/mapper_133.h"
#include "mappers/mapper_134.h"
#include "mappers/mapper_136.h"
#include "mappers/mapper_137.h"
#include "mappers/mapper_138.h"
#include "mappers/mapper_139.h"
#include "mappers/mapper_140.h"
#include "mappers/mapper_141.h"
#include "mappers/mapper_142.h"
#include "mappers/mapper_143.h"
#include "mappers/mapper_144.h"
#include "mappers/mapper_145.h"
#include "mappers/mapper_147.h"
#include "mappers/mapper_148.h"
#include "mappers/mapper_149.h"
#include "mappers/mapper_150.h"
#include "mappers/mapper_152.h"
#include "mappers/mapper_153.h"
#include "mappers/mapper_154.h"
#include "mappers/mapper_156.h"
#include "mappers/mapper_157.h"
#include "mappers/mapper_159.h"
#include "mappers/mapper_162.h"
#include "mappers/mapper_163.h"
#include "mappers/mapper_164.h"
#include "mappers/mapper_165.h"
#include "mappers/mapper_166.h"
#include "mappers/mapper_167.h"
#include "mappers/mapper_168.h"
#include "mappers/mapper_170.h"
#include "mappers/mapper_171.h"
#include "mappers/mapper_172.h"
#include "mappers/mapper_173.h"
#include "mappers/mapper_175.h"
#include "mappers/mapper_176.h"
#include "mappers/mapper_177.h"
#include "mappers/mapper_178.h"
#include "mappers/mapper_180.h"
#include "mappers/mapper_182.h"
#include "mappers/mapper_183.h"
#include "mappers/mapper_184.h"
#include "mappers/mapper_185.h"
#include "mappers/mapper_186.h"
#include "mappers/mapper_187.h"
#include "mappers/mapper_188.h"
#include "mappers/mapper_189.h"
#include "mappers/mapper_190.h"
#include "mappers/mapper_191.h"
#include "mappers/mapper_192.h"
#include "mappers/mapper_193.h"
#include "mappers/mapper_194.h"
#include "mappers/mapper_195.h"
#include "mappers/mapper_196.h"
#include "mappers/mapper_197.h"
#include "mappers/mapper_198.h"
#include "mappers/mapper_199.h"
#include "mappers/mapper_200.h"
#include "mappers/mapper_201.h"
#include "mappers/mapper_202.h"
#include "mappers/mapper_203.h"
#include "mappers/mapper_204.h"
#include "mappers/mapper_205.h"
#include "mappers/mapper_206.h"
#include "mappers/mapper_208.h"
#include "mappers/mapper_209.h"
#include "mappers/mapper_210.h"
#include "mappers/mapper_212.h"
#include "mappers/mapper_214.h"
#include "mappers/mapper_215.h"
#include "mappers/mapper_216.h"
#include "mappers/mapper_217.h"
#include "mappers/mapper_218.h"
#include "mappers/mapper_219.h"
#include "mappers/mapper_221.h"
#include "mappers/mapper_222.h"
#include "mappers/mapper_225.h"
#include "mappers/mapper_226.h"
#include "mappers/mapper_227.h"
#include "mappers/mapper_228.h"
#include "mappers/mapper_229.h"
#include "mappers/mapper_230.h"
#include "mappers/mapper_231.h"
#include "mappers/mapper_232.h"
#include "mappers/mapper_233.h"
#include "mappers/mapper_234.h"
#include "mappers/mapper_235.h"
#include "mappers/mapper_237.h"
#include "mappers/mapper_236.h"
#include "mappers/mapper_238.h"
#include "mappers/mapper_240.h"
#include "mappers/mapper_241.h"
#include "mappers/mapper_242.h"
#include "mappers/mapper_244.h"
#include "mappers/mapper_245.h"
#include "mappers/mapper_246.h"
#include "mappers/mapper_249.h"
#include "mappers/mapper_250.h"
#include "mappers/mapper_252.h"
#include "mappers/mapper_254.h"
#include "mappers/mapper_256.h"
#include "mappers/mapper_259.h"
#include "mappers/mapper_260.h"
#include "mappers/mapper_261.h"
#include "mappers/mapper_262.h"
#include "mappers/mapper_263.h"
#include "mappers/mapper_265.h"
#include "mappers/mapper_266.h"
#include "mappers/mapper_267.h"
#include "mappers/mapper_268.h"
#include "mappers/mapper_269.h"
#include "mappers/mapper_271.h"
#include "mappers/mapper_272.h"
#include "mappers/mapper_274.h"
#include "mappers/mapper_281.h"
#include "mappers/mapper_282.h"
#include "mappers/mapper_283.h"
#include "mappers/mapper_284.h"
#include "mappers/mapper_285.h"
#include "mappers/mapper_286.h"
#include "mappers/mapper_287.h"
#include "mappers/mapper_288.h"
#include "mappers/mapper_289.h"
#include "mappers/mapper_290.h"
#include "mappers/mapper_291.h"
#include "mappers/mapper_292.h"
#include "mappers/mapper_295.h"
#include "mappers/mapper_297.h"
#include "mappers/mapper_298.h"
#include "mappers/mapper_299.h"
#include "mappers/mapper_300.h"
#include "mappers/mapper_302.h"
#include "mappers/mapper_301.h"
#include "mappers/mapper_303.h"
#include "mappers/mapper_304.h"
#include "mappers/mapper_305.h"
#include "mappers/mapper_306.h"
#include "mappers/mapper_307.h"
#include "mappers/mapper_308.h"
#include "mappers/mapper_309.h"
#include "mappers/mapper_311.h"
#include "mappers/mapper_312.h"
#include "mappers/mapper_314.h"
#include "mappers/mapper_313.h"
#include "mappers/mapper_315.h"
#include "mappers/mapper_319.h"
#include "mappers/mapper_320.h"
#include "mappers/mapper_322.h"
#include "mappers/mapper_323.h"
#include "mappers/mapper_324.h"
#include "mappers/mapper_325.h"
#include "mappers/mapper_327.h"
#include "mappers/mapper_328.h"
#include "mappers/mapper_329.h"
#include "mappers/mapper_331.h"
#include "mappers/mapper_332.h"
#include "mappers/mapper_333.h"
#include "mappers/mapper_334.h"
#include "mappers/mapper_335.h"
#include "mappers/mapper_336.h"
#include "mappers/mapper_337.h"
#include "mappers/mapper_338.h"
#include "mappers/mapper_339.h"
#include "mappers/mapper_340.h"
#include "mappers/mapper_341.h"
#include "mappers/mapper_342.h"
#include "mappers/mapper_343.h"
#include "mappers/mapper_344.h"
#include "mappers/mapper_345.h"
#include "mappers/mapper_346.h"
#include "mappers/mapper_347.h"
#include "mappers/mapper_348.h"
#include "mappers/mapper_349.h"
#include "mappers/mapper_350.h"
#include "mappers/mapper_351.h"
#include "mappers/mapper_352.h"
#include "mappers/mapper_353.h"
#include "mappers/mapper_354.h"
#include "mappers/mapper_355.h"
#include "mappers/mapper_356.h"
#include "mappers/mapper_357.h"
#include "mappers/mapper_358.h"
#include "mappers/mapper_359.h"
#include "mappers/mapper_360.h"
#include "mappers/mapper_361.h"
#include "mappers/mapper_362.h"
#include "mappers/mapper_366.h"
#include "mappers/mapper_368.h"
#include "mappers/mapper_369.h"
#include "mappers/mapper_370.h"
#include "mappers/mapper_372.h"
#include "mappers/mapper_374.h"
#include "mappers/mapper_375.h"
#include "mappers/mapper_377.h"
#include "mappers/mapper_380.h"
#include "mappers/mapper_381.h"
#include "mappers/mapper_382.h"
#include "mappers/mapper_384.h"
#include "mappers/mapper_386.h"
#include "mappers/mapper_387.h"
#include "mappers/mapper_388.h"
#include "mappers/mapper_389.h"
#include "mappers/mapper_390.h"
#include "mappers/mapper_393.h"
#include "mappers/mapper_394.h"
#include "mappers/mapper_395.h"
#include "mappers/mapper_396.h"
#include "mappers/mapper_397.h"
#include "mappers/mapper_398.h"
#include "mappers/mapper_399.h"
#include "mappers/mapper_400.h"
#include "mappers/mapper_401.h"
#include "mappers/mapper_403.h"
#include "mappers/mapper_404.h"
#include "mappers/mapper_406.h"
#include "mappers/mapper_409.h"
#include "mappers/mapper_410.h"
#include "mappers/mapper_411.h"
#include "mappers/mapper_412.h"
#include "mappers/mapper_413.h"
#include "mappers/mapper_414.h"
#include "mappers/mapper_415.h"
#include "mappers/mapper_416.h"
#include "mappers/mapper_417.h"
#include "mappers/mapper_420.h"
#include "mappers/mapper_421.h"
#include "mappers/mapper_428.h"
#include "mappers/mapper_429.h"
#include "mappers/mapper_431.h"
#include "mappers/mapper_432.h"
#include "mappers/mapper_433.h"
#include "mappers/mapper_434.h"
#include "mappers/mapper_436.h"
#include "mappers/mapper_437.h"
#include "mappers/mapper_438.h"
#include "mappers/mapper_442.h"
#include "mappers/mapper_446.h"
#include "mappers/mapper_447.h"
#include "mappers/mapper_451.h"
#include "mappers/mapper_452.h"
#include "mappers/mapper_455.h"
#include "mappers/mapper_456.h"
#include "mappers/mapper_457.h"
#include "mappers/mapper_471.h"
#include "mappers/mapper_512.h"
#include "mappers/mapper_513.h"
#include "mappers/mapper_516.h"
#include "mappers/mapper_517.h"
#include "mappers/mapper_518.h"
#include "mappers/mapper_519.h"
#include "mappers/mapper_521.h"
#include "mappers/mapper_522.h"
#include "mappers/mapper_524.h"
#include "mappers/mapper_525.h"
#include "mappers/mapper_526.h"
#include "mappers/mapper_527.h"
#include "mappers/mapper_528.h"
#include "mappers/mapper_529.h"
#include "mappers/mapper_530.h"
#include "mappers/mapper_532.h"
#include "mappers/mapper_538.h"
#include "mappers/mapper_539.h"
#include "mappers/mapper_541.h"
#include "mappers/mapper_543.h"
#include "mappers/mapper_547.h"
#include "mappers/mapper_550.h"
#include "mappers/mapper_554.h"
#include "mappers/mapper_555.h"
#include "mappers/mapper_556.h"
#include "mappers/mapper_557.h"
#include "mappers/mapper_558.h"
#include "mappers/mapper_559.h"
#include "mappers/mapper_560.h"
#include "mappers/mapper_561.h"
#include "mappers/mapper_FDS.h"
#include "mappers/mapper_GameGenie.h"
#include "mappers/mapper_NSF.h"

#include "mappers/FCG.h"
#include "mappers/FME7.h"
#include "mappers/JV001.h"
#include "mappers/JYASIC.h"
#include "mappers/KS202.h"
#include "mappers/LZ93D50.h"
#include "mappers/MMC1.h"
#include "mappers/MMC2.h"
#include "mappers/MMC3.h"
#include "mappers/MMC4.h"
#include "mappers/N118.h"
#include "mappers/OneBus.h"
#include "mappers/TXC.h"
#include "mappers/VRC2and4.h"
#include "mappers/VRC6.h"
#include "mappers/VRC7.h"

enum mappers_op_battery { RD_BAT, WR_BAT };
enum mappers_internal_struct { INT_STRUCT = 10 };

typedef struct _mapper_int_struct {
	BYTE *data;
	size_t size;
} _mapper_int_struct;
typedef struct _mapper_int_structs {
	unsigned int count;
	_mapper_int_struct s[INT_STRUCT];
} _mapper_int_structs;
typedef struct _mapper {
	BYTE mirroring;
	_mapper_int_structs structs;
} _mapper;

extern _mapper mapper;

BYTE map_init(void);
void map_quit(void);

void map_internal_struct_init(BYTE *strct, size_t size);
void map_internal_struct_quit(void);

#endif /* MAPPERS_H_ */
