private void loadMapNames() {
		mapNames = new String[256];
		int mapNameTableOffset = romEntry.getValue("MapNameTableOffset");
		int mapNameBank = bankOf(mapNameTableOffset);
		// external names
		List<Integer> usedExternal = new ArrayList<Integer>();
		for (int i = 0; i < 0x25; i++) {
			int externalOffset = calculateOffset(mapNameBank,
					readWord(mapNameTableOffset + 1));
			usedExternal.add(externalOffset);
			mapNames[i] = readVariableLengthString(externalOffset);
			mapNameTableOffset += 3;
		}

		// internal names
		int lastMaxMap = 0x25;
		Map<Integer, Integer> previousMapCounts = new HashMap<Integer, Integer>();
		while ((rom[mapNameTableOffset] & 0xFF) != 0xFF) {
			int maxMap = rom[mapNameTableOffset] & 0xFF;
			int nameOffset = calculateOffset(mapNameBank,
					readWord(mapNameTableOffset + 2));
			String actualName = readVariableLengthString(nameOffset).trim();
			if (usedExternal.contains(nameOffset)) {
				for (int i = lastMaxMap; i < maxMap; i++) {
					if (maps[i] != null) {
						mapNames[i] = actualName + " (Building)";
					}
				}
			} else {
				int mapCount = 0;
				if (previousMapCounts.containsKey(nameOffset)) {
					mapCount = previousMapCounts.get(nameOffset);
				}
				for (int i = lastMaxMap; i < maxMap; i++) {
					if (maps[i] != null) {
						mapCount++;
						mapNames[i] = actualName + " (" + mapCount + ")";
					}
				}
				previousMapCounts.put(nameOffset, mapCount);
			}
			lastMaxMap = maxMap;
			mapNameTableOffset += 4;
		}
	}