├── .gitignore ├── LICENSE ├── List Builder ├── .vmc │ ├── 32.bin │ └── 8.bin ├── GUI.py ├── HDL-List-Builder-1.ps1 ├── HDL-List-Builder-2.py ├── list_builder.py └── vmc_groups.list ├── README.md ├── Sync-App-Source ├── Build-udpbd-server-MSYS2.sh ├── Build-udpbd-vexfat-MSYS2.sh ├── Clean-Build.ps1 ├── Debug-Build.ps1 ├── Needed-for-Release │ ├── ArtworkURL.cfg │ ├── BlankVMC32.bin │ ├── BlankVMC8.bin │ ├── CheatDevice_LICENSE.txt │ ├── LICENSE.txt │ ├── README.txt │ ├── bsd-udpbd.toml │ ├── neutrino_LICENSE.txt │ ├── udpbd-server.exe │ ├── udpbd-vexfat.exe │ └── vmc_groups.list ├── Publish-Release.ps1 ├── UDPBD-for-XEB+-CLI.sln ├── UDPBD-for-XEB+-CLI │ ├── CDBin.cs │ ├── FTP.cs │ ├── Program.cs │ └── UDPBD-for-XEB+-CLI.csproj ├── UDPBD-for-XEB+-GUI.sln └── UDPBD-for-XEB+-GUI │ ├── AboutWindow.xaml │ ├── AboutWindow.xaml.cs │ ├── App.xaml │ ├── App.xaml.cs │ ├── AssemblyInfo.cs │ ├── MainWindow.xaml │ ├── MainWindow.xaml.cs │ ├── UDPBD-for-XEB+-GUI.csproj │ ├── icon.ico │ └── icon.xcf ├── XCF ├── contolmap.xcf ├── contolmap_es.xcf ├── contolmap_pt.xcf └── ic_tool_neutrino_hdl.xcf ├── XEBPLUS ├── APPS │ └── neutrinoLauncher │ │ ├── CheatDevice │ │ └── CheatDevice-EXFAT.ELF │ │ ├── config │ │ ├── bsd-ata.toml │ │ ├── bsd-ilink.toml │ │ ├── bsd-mmce.toml │ │ ├── bsd-mx4sio.toml │ │ ├── bsd-udpbd-hdd.toml │ │ ├── bsd-udpbd.toml │ │ ├── bsd-usb-debug.toml │ │ ├── bsd-usb.toml │ │ ├── bsdfs-bd.toml │ │ ├── bsdfs-exfat.toml │ │ ├── bsdfs-hdl.toml │ │ ├── emu-ata-file.toml │ │ ├── emu-dvd-esr.toml │ │ ├── emu-dvd-file.toml │ │ ├── emu-mc-file.toml │ │ ├── i_bdm.toml │ │ ├── i_dev9_hidden.toml │ │ ├── i_dev9_ns.toml │ │ ├── rc-uya.toml │ │ └── system.toml │ │ ├── image │ │ ├── bgfallback.png │ │ ├── box.png │ │ ├── button.png │ │ ├── controlmap1.png │ │ ├── controlmap1_es.png │ │ ├── controlmap1_pt.png │ │ ├── controlmap2.png │ │ ├── controlmap2_es.png │ │ ├── controlmap2_pt.png │ │ ├── dropshadow.png │ │ ├── ic_set_neutrino_cfg.png │ │ ├── ic_tool_neutrino_hdl.png │ │ ├── ic_tool_neutrino_ilink.png │ │ ├── ic_tool_neutrino_mmce.png │ │ ├── ic_tool_neutrino_mx4.png │ │ ├── ic_tool_neutrino_udpbd.png │ │ ├── ic_tool_neutrino_usb.png │ │ ├── icon.sys │ │ └── select.png │ │ ├── loadHDD.lua │ │ ├── loadHDL.lua │ │ ├── loadILINK.lua │ │ ├── loadMMCE.lua │ │ ├── loadMX4.lua │ │ ├── loadUDPBD.lua │ │ ├── loadUSB.lua │ │ ├── modules │ │ ├── IEEE1394_bd_mini.irx │ │ ├── ata_bd.irx │ │ ├── atad_emu.irx │ │ ├── bdfs.irx │ │ ├── bdm.irx │ │ ├── bdmfs_fatfs.irx │ │ ├── cdvdfsv.irx │ │ ├── cdvdman_emu.irx │ │ ├── cdvdman_esr1.irx │ │ ├── cdvdman_esr2.irx │ │ ├── dev9_hidden.irx │ │ ├── dev9_ns.irx │ │ ├── ee_core.elf │ │ ├── eesync.irx │ │ ├── fakemod.irx │ │ ├── fhi_bd.irx │ │ ├── fhi_bd_defrag.irx │ │ ├── fileXio.irx │ │ ├── gapfill.irx │ │ ├── hdlfs.irx │ │ ├── iLinkman.irx │ │ ├── imgdrv.irx │ │ ├── iomanX.irx │ │ ├── mc_emu.irx │ │ ├── memcheck.irx │ │ ├── mmcefhi.irx │ │ ├── mmceman.irx │ │ ├── mx4sio_bd_mini.irx │ │ ├── netman.irx │ │ ├── patch_freemem.irx │ │ ├── patch_membo.irx │ │ ├── patch_rc_uya.irx │ │ ├── ps2dev9.irx │ │ ├── ps2hdd-bdm.irx │ │ ├── smap.irx │ │ ├── smap_udpbd.irx │ │ ├── smap_udptty.irx │ │ ├── udnl-t300.irx │ │ ├── udnl.irx │ │ ├── usbd_mini.irx │ │ ├── usbd_null.irx │ │ └── usbmass_bd_mini.irx │ │ ├── neutrino.elf │ │ ├── neutrinoLang.lua │ │ ├── neutrinoLauncher.lua │ │ ├── radshellmod.elf │ │ ├── settings.lua │ │ └── version.txt └── PLG │ ├── PLG_LaunchELF.lua │ ├── PLG_neutrinoHDD.lua │ ├── PLG_neutrinoHDL.lua │ ├── PLG_neutrinoILINK.lua │ ├── PLG_neutrinoMMCE.lua │ ├── PLG_neutrinoMX4.lua │ ├── PLG_neutrinoSettings.lua │ ├── PLG_neutrinoUDPBD.lua │ └── PLG_neutrinoUSB.lua ├── neutrino_LICENSE └── readme-images ├── gparted-exfat.jpg ├── launchelf-ftp-enabled.jpg ├── launchelf-ps2net.jpg ├── launchelf-xeb.jpg ├── pc-ip-settings.jpg ├── ps2-slim-connected-to-laptop.jpg ├── ps2-slim-connected-to-router-and-laptop.jpg ├── ubuntu-ip-settings.jpg ├── udpbd-vexfat-firewall.jpg ├── udpbd-xeb-sync-1.jpg ├── udpbd-xeb-sync-2.jpg └── xeb-game-list.jpg /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled Lua sources 2 | luac.out 3 | 4 | # luarocks build files 5 | *.src.rock 6 | *.zip 7 | *.tar.gz 8 | 9 | # Object files 10 | *.o 11 | *.os 12 | *.ko 13 | *.obj 14 | 15 | # Precompiled Headers 16 | *.gch 17 | *.pch 18 | 19 | # Libraries 20 | *.lib 21 | *.a 22 | *.la 23 | *.lo 24 | *.def 25 | *.exp 26 | 27 | # Shared objects (inc. Windows DLLs) 28 | *.dll 29 | *.so 30 | *.so.* 31 | *.dylib 32 | 33 | # Executables 34 | *.exe 35 | *.out 36 | *.app 37 | *.i*86 38 | *.x86_64 39 | *.hex 40 | 41 | __pycache__ 42 | .vscode 43 | XEBPLUS/boot.lua 44 | XEBPLUS/THM 45 | !udpbd-vexfat.exe 46 | !udpbd-server.exe 47 | 48 | .vs/ 49 | bin/ 50 | obj/ 51 | *.user 52 | -------------------------------------------------------------------------------- /List Builder/.vmc/32.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MegaBitmap/UDPBD-for-XEBP/89cfc7f611cea67eb66bb3ca5ec227369ce1f096/List Builder/.vmc/32.bin -------------------------------------------------------------------------------- /List Builder/.vmc/8.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MegaBitmap/UDPBD-for-XEBP/89cfc7f611cea67eb66bb3ca5ec227369ce1f096/List Builder/.vmc/8.bin -------------------------------------------------------------------------------- /List Builder/GUI.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import subprocess 4 | from tkinter import filedialog, ttk, Tk, StringVar, Entry, Text, Checkbutton, Button, LabelFrame, Frame, END 5 | 6 | # Define parent/root window 7 | root = Tk() 8 | root.title('XEB+ neutrino List Builder GUI') 9 | 10 | # Set window size 11 | window_width = 480 12 | window_height = 250 13 | screen_width = root.winfo_screenwidth() 14 | screen_height = root.winfo_screenheight() 15 | center_y = int(screen_width / 2 - window_width / 2) 16 | center_x = int(screen_height / 2 - window_height / 2) 17 | 18 | #root.geometry('%dx%d+%d+%d' % (window_width, window_height, center_x, center_y)) 19 | 20 | root.geometry(f'{window_width}x{window_height}+{center_x}+{center_y}') 21 | root.minsize(600, 400) 22 | root.maxsize(768, 800) 23 | 24 | # Set window columns and rows 25 | root.grid_columnconfigure(1, weight=1) 26 | root.grid_rowconfigure(1, weight=1) 27 | 28 | # Define global variables 29 | selected = StringVar() 30 | vmc = StringVar() 31 | folder_path_1 = "" 32 | folder_path_2 = "" 33 | 34 | def enable_build(): 35 | if selected.get() == '-u': 36 | directory_button2["state"] = "normal" 37 | ent2["state"] = "normal" 38 | ent2.delete(0, END) 39 | ent2.insert(END, ent1.get()) 40 | directory_button2["state"] = "disabled" 41 | ent2["state"] = "disabled" 42 | else: 43 | directory_button2["state"] = "normal" 44 | ent2["state"] = "normal" 45 | 46 | if selected.get() and ent1.get() and ent2.get(): 47 | build_button["state"] = "normal" 48 | 49 | # Functions for finding folders 50 | def current_folder_1(): 51 | global folder_path_1 52 | folder_path_1 = filedialog.askdirectory(title='Choose a Directory') 53 | ent1.delete(0, END) 54 | ent1.insert(END, folder_path_1) 55 | enable_build() 56 | 57 | def current_folder_2(): 58 | global folder_path_2 59 | folder_path_2 = filedialog.askdirectory(title='Choose a Directory') 60 | ent2.delete(0, END) 61 | ent2.insert(END, folder_path_2) 62 | enable_build() 63 | 64 | def build_list(): 65 | global text 66 | process = subprocess.Popen( 67 | f'"{sys.executable}" -u "{os.getcwd()}/list_builder.py" "{selected.get()}" "{ent1.get()}" "{ent2.get()}" {vmc.get()}', 68 | stdout=subprocess.PIPE, 69 | universal_newlines=True, 70 | shell=True 71 | ) 72 | lines = 0 73 | for stdout_line in iter(process.stdout.readline, ""): 74 | if lines > 2: 75 | text.insert(END, stdout_line) 76 | text.see("end") 77 | text.update_idletasks() 78 | root.update_idletasks() 79 | root.update() 80 | else: 81 | lines += 1 82 | process.stdout.close() 83 | 84 | # Define radio buttons 85 | radioFrame = LabelFrame(root, text=' Drive Type ') 86 | radioFrame.pack(fill='none', pady=10) 87 | 88 | r1 = ttk.Radiobutton(radioFrame, text='PS2 HDD', value='-h', variable=selected, command=enable_build) 89 | r2 = ttk.Radiobutton(radioFrame, text='MX4SIO', value='-m', variable=selected, command=enable_build) 90 | r3 = ttk.Radiobutton(radioFrame, text='MMCE', value='-c', variable=selected, command=enable_build) 91 | r4 = ttk.Radiobutton(radioFrame, text='USB Drive', value='-u', variable=selected, command=enable_build) 92 | r5 = ttk.Radiobutton(radioFrame, text='iLink', value='-i', variable=selected, command=enable_build) 93 | r1.grid(padx=5, pady=5, row=0, column=1) 94 | r2.grid(padx=5, pady=5, row=0, column=2) 95 | r3.grid(padx=5, pady=5, row=0, column=3) 96 | r4.grid(padx=5, pady=5, row=0, column=4) 97 | r5.grid(padx=5, pady=5, row=0, column=5) 98 | 99 | # Define directory and run buttons 100 | directoryFrame1 = LabelFrame(root, text=' Games Location ') 101 | directoryFrame1.pack(fill='none', pady=10) 102 | directoryFrame2 = LabelFrame(root, text=' XEBPLUS Location ') 103 | directoryFrame2.pack(fill='none', pady=10) 104 | 105 | directory_button1 = Button(directoryFrame1, text="Choose Directory", command=current_folder_1) 106 | directory_button1.grid(padx=5) 107 | ent1 = Entry(directoryFrame1, font=40, width=40) 108 | ent1.grid(row=0, column=2, padx=5) 109 | 110 | directory_button2 = Button(directoryFrame2, text="Choose Directory", command=current_folder_2) 111 | directory_button2.grid(padx=5) 112 | ent2 = Entry(directoryFrame2, font=40, width=40) 113 | ent2.grid(row=0, column=2, padx=5) 114 | 115 | # Define VMC checkbox and build button 116 | buttonFrame = Frame(root) 117 | buttonFrame.pack(fill='x') 118 | 119 | vmc_check = Checkbutton(buttonFrame, text='Create VMCs', variable=vmc, onvalue='-vmc', offvalue='') 120 | vmc_check.grid(padx=30, row=0, column=1) 121 | 122 | build_button = Button(buttonFrame, text="Build List", command=build_list) 123 | build_button.grid(padx=305, pady=5, row=0, column=2) 124 | build_button["state"] = "disabled" 125 | 126 | text = Text(root) 127 | text.pack() 128 | 129 | root.update_idletasks() 130 | root.mainloop() 131 | -------------------------------------------------------------------------------- /List Builder/HDL-List-Builder-1.ps1: -------------------------------------------------------------------------------- 1 | 2 | if (!([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { 3 | Start-Process powershell -ArgumentList "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs 4 | exit 5 | } 6 | if (!(Test-Path "$PSScriptRoot/hdl_dump.exe")) { 7 | Write-Host "The file $PSScriptRoot/hdl_dump.exe is missing." 8 | Read-Host "Press Enter to Exit" 9 | exit 10 | } 11 | $HDLQuery = & "$PSScriptRoot/hdl_dump.exe" "query" 12 | $HDLDriveCount = ($HDLQuery -join "" -split "Playstation 2 HDD").Count - 1 13 | 14 | if ($HDLDriveCount -eq 1) { 15 | foreach ($TempLine in $HDLQuery) { 16 | if ($TempLine -match "Playstation 2 HDD") { 17 | $HDLTargetDrive = ($TempLine -split ":")[0].Trim() + ":" 18 | $HDLTOC = & "$PSScriptRoot/hdl_dump.exe" "hdl_toc" $HDLTargetDrive 19 | Set-Content -Path "$PSScriptRoot/hdl_toc.txt" -Value $HDLTOC -Encoding UTF8 20 | Write-Host "The HDL table of contents has been saved to $PSScriptRoot/hdl_toc.txt" 21 | Read-Host "Press Enter to Exit" 22 | exit 23 | } 24 | } 25 | } 26 | elseif ($HDLDriveCount -le 0) { 27 | Write-Host "Failed to detect any disk drives formatted as an APA PlayStation 2 HDD." 28 | } 29 | else { 30 | Write-Host "$DriveCount HDDs were detected, this powershell script only supports 1." 31 | } 32 | Read-Host "Press Enter to Exit" 33 | -------------------------------------------------------------------------------- /List Builder/HDL-List-Builder-2.py: -------------------------------------------------------------------------------- 1 | import hashlib 2 | import os 3 | 4 | FinalList = '' 5 | GameCount = 0 6 | if not os.path.exists('hdl_toc.txt'): 7 | print('Missing hdl_toc.txt') 8 | print('Press Enter to Exit:') 9 | input() 10 | exit() 11 | with open('hdl_toc.txt', 'r', encoding="utf-8") as hdl_toc: 12 | AllLines = hdl_toc.readlines() 13 | 14 | for TempLine in AllLines: 15 | TempMedia = TempLine.split(' ')[0] 16 | if TempMedia.find("DVD") == -1 and TempMedia.find("CD") == -1: 17 | continue 18 | 19 | TempSplitLine = TempLine.split(' ') 20 | for TempSection in TempSplitLine: 21 | if '_' in TempSection and len(TempSection) == 11: 22 | TempGameID = TempSection 23 | break 24 | 25 | TempMask = TempLine.split(TempGameID)[0] 26 | TempGameName = TempLine.replace(TempMask, '').replace(TempGameID + ' ', '', 1).replace('\n', '').replace('\r', '') 27 | 28 | FinalList += TempGameID + ' /' + TempMedia + '/' + TempGameName + '.iso\n' 29 | GameCount += 1 30 | 31 | if GameCount < 1: 32 | print('0 HDL format games were found in hdl_toc.txt') 33 | print('Press Enter to Exit:') 34 | input() 35 | exit() 36 | ListHash = hashlib.md5(FinalList.encode("utf-8")).hexdigest() 37 | FinalList += ListHash 38 | with open('neutrinoHDL.list', 'w', encoding="utf-8") as HDLList: 39 | HDLList.write(FinalList) 40 | print('The list of all HDL format games has been saved to neutrinoHDL.list') 41 | print('Copy neutrinoHDL.list to the XEBPLUS USB drive in this location: XEBPLUS/CFG/neutrinoLauncher/neutrinoHDL.list') 42 | print('Press Enter to Exit:') 43 | input() 44 | -------------------------------------------------------------------------------- /List Builder/list_builder.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import math 3 | import os 4 | import hashlib 5 | import shutil 6 | 7 | done = "Error: No games found." 8 | total = 0 9 | count = 0 10 | pattern_1 = [b'\x01', b'\x0D'] 11 | pattern_2 = [b'\x3B', b'\x31'] 12 | 13 | def count_iso(folder, game_path): 14 | global total 15 | for image in os.listdir(game_path + folder): 16 | if image.endswith(".ISO") or image.endswith(".iso"): 17 | total += 1 18 | 19 | def process_iso(folder, game_path, xeb_path, game_list, create_vmc): 20 | global total, count, done 21 | 22 | for image in os.listdir(game_path + folder): 23 | if image.endswith(".ISO") or image.endswith(".iso"): 24 | print(f"{math.floor((count * 100) / total)}% complete") 25 | print(f"Processing {image}") 26 | index = 0 27 | string = "" 28 | with open(game_path + folder + "/" + image, "rb") as file: 29 | while (byte := file.read(1)): 30 | if len(string) < 4: 31 | if index == 2: 32 | string += byte.decode('utf-8', errors='ignore') 33 | elif byte == pattern_1[index]: 34 | index += 1 35 | else: 36 | string = "" 37 | index = 0 38 | elif len(string) == 4: 39 | index = 0 40 | if byte == b'\x5F': 41 | string += byte.decode('utf-8', errors='ignore') 42 | else: 43 | string = "" 44 | elif len(string) < 8: 45 | string += byte.decode('utf-8', errors='ignore') 46 | elif len(string) == 8: 47 | if byte == b'\x2E': 48 | string += byte.decode('utf-8', errors='ignore') 49 | else: 50 | string = "" 51 | elif len(string) < 11: 52 | string += byte.decode('utf-8', errors='ignore') 53 | elif len(string) == 11: 54 | if byte == pattern_2[index]: 55 | index += 1 56 | if index == 2: 57 | break 58 | else: 59 | string = "" 60 | index = 0 61 | 62 | count += 1 63 | 64 | if len(string) == 11: 65 | print(f"Found title ID {string}") 66 | 67 | vmc = f"/VMC/{string}_0.bin" 68 | with open("vmc_groups.list", "r") as f: 69 | lines = f.readlines() 70 | 71 | for line in lines: 72 | line = line.strip() 73 | if line[:4] == "XEBP": 74 | size = "8" 75 | group = line 76 | elif len(line) < 5: 77 | size = line[:2] 78 | elif line == string: 79 | vmc = f"/VMC/{group}_0.bin" 80 | break 81 | 82 | if create_vmc: 83 | if vmc != f"/VMC/{string}_0.bin" and not os.path.isfile(game_path + f"/VMC/{string}_0.bin"): 84 | print(f"Creating VMC /VMC/{string}_0.bin (8MB)") 85 | shutil.copyfile(".vmc/8.bin", game_path + f"/VMC/{string}_0.bin") 86 | if not os.path.isfile(game_path + vmc): 87 | print(f"Creating VMC {vmc} ({size}MB)") 88 | shutil.copyfile(f".vmc/{size}.bin", game_path + vmc) 89 | print(f"Assigned {string} to {vmc}") 90 | elif not os.path.isfile(game_path + vmc): 91 | vmc = "0000000000000000000000" 92 | 93 | with open(xeb_path + game_list, "a") as output: 94 | output.write(f"{string} {folder}/{image} {vmc}\n") 95 | 96 | done = "Done!" 97 | 98 | def error_message(): 99 | print('Error: Missing argument(s).') 100 | print('Usage: list_builder.py [-h -u -m -i] [-vmc]') 101 | print('') 102 | print('Examples:') 103 | print('list_builder.py -h E:\\PS2 D:\\') 104 | print('list_builder.py -u D:\\ D:\\ -vmc') 105 | print('list_builder.py -m \'/media/SD Card\' \'/media/USB Drive\'') 106 | print('') 107 | quit() 108 | 109 | def main(arg1, arg2, arg3, arg4): 110 | if arg1 and arg2 and arg3: 111 | drive = arg1 112 | game_path = arg2 113 | xeb_path = arg3 114 | create_vmc = arg4 == "-vmc" 115 | else: 116 | error_message() 117 | 118 | print('') 119 | print('This program will create the list of installed PS2 games that is required by the XEB+ neutrino loader plugin.') 120 | print('Additonal documentation can be found at https://github.com/sync-on-luma/xebplus-neutrino-loader-plugin') 121 | 122 | if drive.lower() == "-h": 123 | game_list = 'neutrinoHDD.list' 124 | elif drive.lower() == "-u": 125 | game_list = 'neutrinoUSB.list' 126 | elif drive.lower() == "-m": 127 | game_list = 'neutrinoMX4.list' 128 | elif drive.lower() == "-c": 129 | game_list = 'neutrinoMMCE.list' 130 | elif drive.lower() == "-i": 131 | game_list = 'neutrinoILINK.list' 132 | else: 133 | print('Error: Invalid drive type') 134 | quit() 135 | 136 | if not os.path.isdir(xeb_path + '/XEBPLUS'): 137 | print(f'\nError: Cannot find XEBPLUS folder at {xeb_path}') 138 | quit() 139 | if not os.path.isdir(xeb_path + '/XEBPLUS/CFG/neutrinoLauncher'): 140 | os.mkdir(xeb_path + '/XEBPLUS/CFG/neutrinoLauncher') 141 | xeb_path = xeb_path + '/XEBPLUS/CFG/neutrinoLauncher/' 142 | print('') 143 | 144 | if os.path.isfile(xeb_path + game_list): 145 | os.remove(xeb_path + game_list) 146 | 147 | if create_vmc and not os.path.isfile(".vmc/8.bin"): 148 | print("Warning: VMC.bin not found. VMCs will not be created.") 149 | create_vmc = False 150 | 151 | if os.path.isdir(game_path + '/CD'): 152 | count_iso('/CD', game_path) 153 | else: 154 | print(f'CD folder not found at {game_path}') 155 | if os.path.isdir(game_path + '/DVD'): 156 | count_iso('/DVD', game_path) 157 | else: 158 | print(f'DVD folder not found at {game_path}') 159 | 160 | if create_vmc and not os.path.isdir(game_path + '/VMC'): 161 | os.mkdir(game_path + '/VMC') 162 | 163 | if os.path.isdir(game_path + '/DVD'): 164 | process_iso('/DVD', game_path, xeb_path, game_list, create_vmc) 165 | if os.path.isdir(game_path + '/CD'): 166 | process_iso('/CD', game_path, xeb_path, game_list, create_vmc) 167 | 168 | if os.path.isfile(xeb_path + game_list): 169 | with open(xeb_path + game_list, "r") as output: 170 | hash = hashlib.md5(output.read().encode("utf-8")).hexdigest() 171 | with open(xeb_path + game_list, "a") as output: 172 | output.write(hash) 173 | 174 | print(done) 175 | print('') 176 | 177 | if __name__ == '__main__': 178 | if len(sys.argv) == 5: 179 | main(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4]) 180 | elif len(sys.argv) == 4: 181 | main(sys.argv[1], sys.argv[2], sys.argv[3], "") 182 | else: 183 | error_message() 184 | -------------------------------------------------------------------------------- /List Builder/vmc_groups.list: -------------------------------------------------------------------------------- 1 | XEBP_000.01 2 | SLES_820.36 3 | SLPS_253.38 4 | SCAJ_200.76 5 | SLUS_209.86 6 | SLKA_252.01 7 | SLPS_732.02 8 | SLPS_253.39 9 | SLES_820.37 10 | SLUS_210.79 11 | SLKA_252.02 12 | SCAJ_200.77 13 | SLPS_732.03 14 | XEBP_000.02 15 | SLPM_650.86 16 | SLPM_650.87 17 | XEBP_000.03 18 | SLPS_200.84 19 | SLPS_200.85 20 | XEBP_000.04 21 | SLPM_552.21 22 | SLPM_552.22 23 | XEBP_000.05 24 | SCPS_110.19 25 | SCPS_110.20 26 | XEBP_000.06 27 | SLES_820.21 28 | SLES_820.20 29 | SLUS_206.97 30 | SLUS_208.54 31 | SLES_820.21 32 | SLPM_655.06 33 | SLPM_655.07 34 | SLPM_657.42 35 | SLPM_657.43 36 | SLPM_655.04 37 | SLPM_655.05 38 | XEBP_000.07 39 | SLES_820.11 40 | SLPM_652.32 41 | SCCS_400.02 42 | SLUS_204.84 43 | SCCS_400.03 44 | SLUS_206.27 45 | SLES_820.12 46 | SLPM_652.33 47 | XEBP_000.08 48 | SLPS_201.40 49 | SLPS_201.41 50 | XEBP_000.09 51 | SLPM_650.40 52 | SLPM_650.41 53 | SLPM_650.42 54 | SLPM_650.43 55 | XEBP_000.10 56 | SCAJ_201.41 57 | SLPM_659.76 58 | SLPM_859.76 59 | SLUS_213.34 60 | SLUS_213.35 61 | XEBP_000.11 62 | SLPM_650.02 63 | SLPM_650.03 64 | XEBP_000.12 65 | SLPM_666.02 66 | SLKA_252.80 67 | SLKA_252.81 68 | SLPM_743.01 69 | XEBP_000.13 70 | SLES_820.38 71 | SLES_820.39 72 | SLUS_211.80 73 | SLUS_213.62 74 | SCKA_200.86 75 | SCKA_200.87 76 | SLPM_662.75 77 | SLPM_662.76 78 | SLPM_742.51 79 | SLPM_742.32 80 | XEBP_000.14 81 | SLAJ_251.04 82 | SLAJ_251.05 83 | SLPM_550.82 84 | SLPM_742.86 85 | XEBP_000.15 86 | SLUS_208.06 87 | SLUS_208.07 88 | XEBP_000.16 89 | SCPS_550.19 90 | SLES_820.28 91 | SLES_820.29 92 | SLUS_204.88 93 | SLUS_208.91 94 | SLPM_664.78 95 | SLPM_664.79 96 | SCAJ_200.70 97 | SLPM_654.38 98 | SLPM_654.39 99 | SLPM_652.09 100 | XEBP_000.17 101 | SLPS_200.18 102 | SLPS_200.19 103 | XEBP_100.01 104 | SCUS_974.29 105 | SCES_532.86 106 | SLES_532.86 107 | SCED_529.52 108 | SCES_524.60 109 | SCKA_200.40 110 | SCUS_973.30 111 | SLES_524.60 112 | SCUS_975.16 113 | SCPS_150.21 114 | SCPS_150.57 115 | SCES_516.08 116 | SLES_516.08 117 | SCKA_200.10 118 | SCUS_972.65 119 | PAPX_902.23 120 | SCES_503.61 121 | SCUS_971.24 122 | SCKA_200.60 123 | SCUS_974.65 124 | SCES_532.85 125 | SLES_532.85 126 | SCPS_151.00 127 | SCAJ_201.57 128 | SCPS_193.21 129 | SCPS_193.28 130 | XEBP_100.02 131 | SCES_524.56 132 | SCKA_200.37 133 | SCPS_150.84 134 | SLES_524.56 135 | SCAJ_201.09 136 | SCPS_193.09 137 | SCKA_200.11 138 | SCPS_150.56 139 | SCPS_193.17 140 | SCUS_972.68 141 | SCUS_975.13 142 | PBPX_955.16 143 | SCED_510.75 144 | SCES_509.16 145 | SCKA_201.20 146 | SCPS_150.37 147 | SCUS_971.99 148 | SLES_509.16 149 | XEBP_100.03 150 | SCES_554.96 151 | SCUS_976.23 152 | SCPS_151.20 153 | SCUS_976.15 154 | XEBP_100.04 155 | PBPX_956.01 156 | SCAJ_300.06 157 | SCAJ_300.07 158 | SCES_517.19 159 | SCKA_300.01 160 | SCPS_170.01 161 | SCUS_973.28 162 | SLES_517.19 163 | PBPX_955.23 164 | PBPX_955.24 165 | SCAJ_200.66 166 | SCES_524.38 167 | SCPS_150.55 168 | SLES_524.38 169 | SCPS_193.04 170 | PBPX_955.02 171 | SCPS_150.09 172 | SCPS_550.07 173 | SCUS_971.02 174 | SCUS_975.12 175 | SCPS_720.01 176 | PBPX_955.03 177 | XEBP_100.05 178 | SCES_503.82 179 | SLES_503.82 180 | SLPM_650.51 181 | SLUS_202.28 182 | SCES_511.56 183 | SLES_511.56 184 | SCES_514.34 185 | SLES_514.34 186 | SLPM_652.57 187 | SLUS_206.22 188 | SLPM_660.18 189 | SLPM_656.22 190 | XEBP_100.06 191 | SCES_504.90 192 | SCES_504.91 193 | SCES_504.92 194 | SCES_504.93 195 | SCES_504.94 196 | SLES_504.90 197 | SLES_504.91 198 | SLES_504.92 199 | SLES_504.93 200 | SLES_504.94 201 | SLPS_250.50 202 | SLUS_203.12 203 | SLKA_252.14 204 | SLPM_666.77 205 | SLPM_661.24 206 | SLPM_651.15 207 | SLPM_675.13 208 | SLPS_250.88 209 | SCAJ_250.12 210 | SCES_518.15 211 | SCES_518.16 212 | SCES_518.17 213 | SCES_518.18 214 | SCES_518.19 215 | SLAJ_250.12 216 | SLES_518.15 217 | SLES_518.16 218 | SLES_518.17 219 | SLES_518.18 220 | SLES_518.19 221 | SLKA_251.44 222 | SLPS_252.50 223 | SLUS_206.72 224 | SLPM_666.78 225 | SLPM_661.25 226 | SCAJ_200.68 227 | SLPM_654.78 228 | XEBP_100.07 229 | SCAJ_200.99 230 | SCCS_400.05 231 | SCED_508.44 232 | SCES_507.60 233 | SCPS_110.03 234 | SCPS_550.01 235 | SCPS_560.01 236 | SCUS_971.13 237 | SLES_507.60 238 | SCKA_200.28 239 | SCPS_191.03 240 | SCPS_191.51 241 | SCAJ_201.96 242 | SCAJ_201.46 243 | SCES_533.26 244 | SCUS_974.72 245 | SLES_533.26 246 | XEBP_100.08 247 | SLKA_250.80 248 | SCES_522.37 249 | SLES_522.37 250 | SLUS_202.67 251 | SCPS_550.29 252 | SLPS_251.21 253 | SLPS_732.30 254 | SLKA_251.38 255 | SCES_524.67 256 | SLES_524.67 257 | SLUS_205.62 258 | SLPS_732.31 259 | SCPS_550.42 260 | SLPS_251.43 261 | SLKA_251.45 262 | SCES_524.69 263 | SLES_524.69 264 | SLUS_205.63 265 | SCAJ_200.04 266 | SLPS_251.58 267 | SLPS_732.32 268 | SCES_524.68 269 | SLES_524.68 270 | SLUS_205.64 271 | SLKA_251.74 272 | SLPS_732.33 273 | SCAJ_200.24 274 | SLPS_252.02 275 | SLUS_212.58 276 | SLUS_291.99 277 | SLPS_256.51 278 | SLPS_257.56 279 | SLPS_732.59 280 | SLPS_257.55 281 | SLPS_256.55 282 | SLPS_732.66 283 | SLUS_214.88 284 | SLPS_256.56 285 | SLPS_732.67 286 | SLUS_214.89 287 | SLPS_255.27 288 | SLPM_685.21 289 | SLPS_256.52 290 | SLUS_214.80 291 | XEBP_100.09 292 | SLUS_211.68 293 | SCES_537.55 294 | SLES_537.55 295 | SLKA_253.28 296 | SCES_521.18 297 | SLES_521.18 298 | SLPM_654.44 299 | SLUS_207.33 300 | SLKA_250.82 301 | SLPM_663.25 302 | SLPM_654.06 303 | XEBP_100.10 304 | SCES_531.94 305 | SLES_531.94 306 | SLUS_210.83 307 | SLPS_204.23 308 | SCES_542.21 309 | SLES_542.21 310 | SLPM_665.72 311 | SLUS_214.09 312 | XEBP_100.11 313 | SCES_515.89 314 | SLES_515.89 315 | SLUS_207.65 316 | SCES_533.19 317 | SLES_533.19 318 | SLUS_209.84 319 | XEBP_100.12 320 | SLKA_252.65 321 | SLPM_658.80 322 | SLUS_209.64 323 | SCES_530.38 324 | SLES_530.38 325 | SCES_541.86 326 | SLES_541.86 327 | SLUS_213.61 328 | SLPM_742.68 329 | SLPM_661.60 330 | SLPM_742.42 331 | XEBP_100.13 332 | SCES_537.69 333 | SLES_537.69 334 | SLUS_212.45 335 | SCES_529.13 336 | SLES_529.13 337 | SLUS_209.79 338 | SLPM_742.13 339 | SLPM_656.00 340 | SLPM_655.99 341 | XEBP_100.14 342 | SCES_532.00 343 | SLES_532.00 344 | SLUS_212.27 345 | SLPS_255.60 346 | SLUS_214.41 347 | SCES_541.64 348 | SLES_541.64 349 | SLPS_256.90 350 | XEBP_100.15 351 | SCES_512.33 352 | SLES_512.33 353 | SLPS_251.74 354 | SLUS_205.91 355 | SCES_518.39 356 | SLES_518.39 357 | SLPS_253.30 358 | SLUS_207.79 359 | SLPM_685.13 360 | SCES_527.30 361 | SLES_527.30 362 | SLUS_209.98 363 | SCES_533.46 364 | SLES_533.46 365 | SLUS_211.23 366 | XEBP_100.16 367 | SLPM_622.06 368 | SLUS_207.58 369 | SLPS_201.06 370 | SLPS_201.05 371 | SLPM_622.07 372 | SLPM_622.08 373 | SLUS_207.59 374 | SLPM_624.40 375 | XEBP_100.17 376 | SLUS_204.69 377 | SLPS_290.02 378 | SLPS_739.01 379 | SLPS_290.01 380 | SLPS_290.05 381 | SCPS_559.01 382 | SCAJ_300.01 383 | SCAJ_200.86 384 | SLPS_253.68 385 | SCAJ_200.87 386 | SLPS_253.69 387 | SLPS_732.24 388 | SLPS_732.25 389 | SLPS_253.66 390 | SLPS_253.67 391 | SLES_820.34 392 | SLES_820.35 393 | SLUS_208.92 394 | SLUS_211.33 395 | SLUS_213.89 396 | SLUS_214.17 397 | SCAJ_201.79 398 | SLPS_256.40 399 | SCAJ_201.80 400 | SLPS_256.41 401 | XEBP_100.18 402 | SLES_550.18 403 | SLUS_215.69 404 | SCKA_200.99 405 | SLPM_664.45 406 | SLES_553.54 407 | SLUS_216.21 408 | SLPM_666.89 409 | SLPM_837.70 410 | XEBP_100.19 411 | SCES_543.08 412 | SLES_543.08 413 | SLPM_660.31 414 | SLUS_211.94 415 | SLPM_742.44 416 | SLES_548.92 417 | SLPM_666.63 418 | SLUS_216.31 419 | XEBP_100.20 420 | SCES_534.58 421 | SLES_534.58 422 | SLUS_209.74 423 | SCAJ_200.95 424 | SLPM_655.97 425 | SLPM_663.72 426 | SCES_545.55 427 | SLES_545.55 428 | SLUS_211.52 429 | SCAJ_201.20 430 | SLPM_657.95 431 | SLPM_663.73 432 | XEBP_100.21 433 | SLPM_621.54 434 | SLPM_652.77 435 | SLPM_653.58 436 | SLPM_624.27 437 | SLPM_657.75 438 | SLPM_662.42 439 | SLPM_666.09 440 | SLPM_669.30 441 | SLPM_550.90 442 | SLPM_663.13 443 | SLPM_663.14 444 | XEBP_100.22 445 | SCUS_971.04 446 | SCES_502.93 447 | SLES_502.93 448 | SCUS_972.11 449 | SLES_518.14 450 | SCUS_975.10 451 | SCUS_973.69 452 | SCUS_974.05 453 | SLES_537.54 454 | SCES_537.54 455 | SCUS_975.14 456 | SLUS_974.05 457 | XEBP_100.23 458 | SCES_529.42 459 | SLES_529.42 460 | SLUS_210.29 461 | SCES_537.17 462 | SLES_537.17 463 | SLUS_213.55 464 | XEBP_100.24 465 | 32 466 | SCES_517.97 467 | SLES_517.97 468 | SLUS_207.52 469 | SCES_525.81 470 | SLES_525.81 471 | SLUS_210.00 472 | SLUS_210.25 473 | SLUS_207.19 474 | SLUS_209.91 475 | SCES_518.87 476 | SLES_518.87 477 | SLUS_207.57 478 | SLUS_207.54 479 | SLUS_208.24 480 | SLUS_207.50 481 | SCES_519.53 482 | SCES_519.63 483 | SCES_519.64 484 | SLES_519.53 485 | SLES_519.63 486 | SLES_519.64 487 | SCES_523.74 488 | SLES_523.74 489 | SLPM_655.87 490 | SLUS_209.06 491 | SCES_517.98 492 | SLES_517.98 493 | SLUS_207.56 494 | SLES_520.22 495 | XEBP_100.25 496 | SCES_504.22 497 | SLES_504.22 498 | SLUS_202.63 499 | SLPS_250.79 500 | SLUS_202.41 501 | XEBP_100.26 502 | SCES_511.54 503 | SLES_511.54 504 | SLUS_205.29 505 | SLPS_251.57 506 | SLUS_205.30 507 | XEBP_100.27 508 | SLPM_662.04 509 | SLUS_212.13 510 | SLUS_212.14 511 | SCES_529.82 512 | SLES_529.82 513 | SLUS_211.18 514 | SCES_525.84 515 | SCES_525.85 516 | SLAJ_250.53 517 | SLES_525.84 518 | SLES_525.85 519 | SLPM_657.19 520 | SLUS_210.50 521 | SLPM_659.58 522 | SLPM_669.62 523 | SLKA_252.06 524 | SCES_535.06 525 | SCES_535.07 526 | SLES_535.06 527 | SLES_535.07 528 | SLPM_661.08 529 | SLUS_212.42 530 | SLKA_253.04 531 | SLAJ_250.66 532 | SLPM_666.52 533 | SLPM_550.04 534 | SCES_538.86 535 | SCES_540.30 536 | SLAJ_250.78 537 | SLES_540.30 538 | SLPM_663.54 539 | SLUS_213.76 540 | SLUS_291.80 541 | SLPM_667.31 542 | SLPM_669.61 543 | SLES_538.86 544 | XEBP_100.28 545 | SCES_542.48 546 | SLES_542.48 547 | SLPM_666.00 548 | SLUS_214.76 549 | SLUS_214.77 550 | SLUS_214.59 551 | SLUS_214.07 552 | XEBP_100.29 553 | SLPM_668.37 554 | SLUS_216.38 555 | XEBP_100.30 556 | SLUS_217.70 557 | SLUS_217.52 558 | XEBP_100.31 559 | SLUS_218.93 560 | SLUS_218.92 561 | XEBP_100.32 562 | SCES_513.40 563 | SLAJ_250.07 564 | SLES_513.40 565 | SLPM_652.69 566 | SLUS_204.76 567 | SLUS_205.38 568 | XEBP_100.33 569 | SCES_513.39 570 | SLES_513.39 571 | SLPM_652.24 572 | SLUS_204.57 573 | SLUS_204.53 574 | XEBP_100.34 575 | SCES_520.08 576 | SLES_520.08 577 | SLPS_252.97 578 | SLUS_207.55 579 | SLPM_656.66 580 | SLUS_207.71 581 | XEBP_100.35 582 | SCES_516.61 583 | SCES_516.62 584 | SCES_516.63 585 | SCES_516.64 586 | SCES_516.65 587 | SLES_516.61 588 | SLES_516.62 589 | SLES_516.63 590 | SLES_516.64 591 | SLES_516.65 592 | SLUS_206.53 593 | SLKA_253.39 594 | SCES_521.71 595 | SCES_521.72 596 | SCES_521.74 597 | SCES_521.75 598 | SLES_521.71 599 | SLES_521.72 600 | SLES_521.73 601 | SLES_521.74 602 | SLES_521.75 603 | SCES_525.91 604 | SCES_525.92 605 | SCES_525.93 606 | SLES_525.91 607 | SLES_525.92 608 | SLES_525.93 609 | SLUS_209.38 610 | SLKA_253.40 611 | SLKA_254.17 612 | XEBP_100.36 613 | SCES_533.39 614 | SLES_533.39 615 | SLUS_211.53 616 | SCES_538.60 617 | SCES_538.61 618 | SCES_538.62 619 | SLES_538.60 620 | SLES_538.61 621 | SLES_538.62 622 | SLUS_212.99 623 | SCES_540.95 624 | SCES_540.96 625 | SCES_540.97 626 | SLES_540.95 627 | SLES_540.96 628 | SLES_540.97 629 | SLUS_213.98 630 | SLUS_208.79 631 | SLPM_654.23 632 | SLPM_661.72 633 | SLKA_252.66 634 | SLPM_668.13 635 | SLPM_665.23 636 | SLPM_669.71 637 | SLUS_212.02 638 | SLPM_658.91 639 | SLPM_665.60 640 | SLUS_215.84 641 | SLPM_665.49 642 | SLPM_667.01 643 | XEBP_100.37 644 | SCES_525.51 645 | SCES_525.53 646 | SCES_525.55 647 | SLUS_208.78 648 | SLPM_625.35 649 | SLUS_210.80 650 | SLES_530.02 651 | SLES_530.03 652 | SLES_530.04 653 | SCES_531.19 654 | SCES_531.20 655 | SCES_531.21 656 | SLAJ_250.57 657 | SLES_531.19 658 | SLES_531.20 659 | SLES_531.21 660 | SLPM_657.81 661 | SLPM_742.23 662 | SLPM_625.73 663 | SLPM_742.31 664 | KOEI_000.21 665 | SLPM_657.80 666 | XEBP_100.38 667 | SCES_543.40 668 | SLES_543.40 669 | SLUS_214.62 670 | SLES_546.24 671 | SLES_551.08 672 | SLUS_217.26 673 | SLES_546.24 674 | SLUS_215.85 675 | XEBP_100.39 676 | SCES_548.45 677 | SLES_548.45 678 | SLUS_216.62 679 | SLUS_216.62 680 | SLUS_218.03 681 | XEBP_100.40 682 | 32 683 | SCES_504.12 684 | SCES_504.62 685 | SLES_504.12 686 | SLES_504.62 687 | SLES_511.14 688 | SCES_511.14 689 | SCES_519.12 690 | SCES_519.15 691 | SLES_519.12 692 | SLES_519.15 693 | SCES_527.60 694 | SCES_528.00 695 | SLES_527.60 696 | SLES_528.00 697 | SCES_534.44 698 | SCES_535.44 699 | SCES_535.45 700 | SLES_534.44 701 | SLES_535.44 702 | SLES_535.45 703 | SCES_542.03 704 | SCES_542.04 705 | SCES_543.60 706 | SCES_543.61 707 | SCES_543.62 708 | SLES_542.03 709 | SLES_542.04 710 | SLES_543.60 711 | SLES_543.61 712 | SLES_543.62 713 | SLES_549.13 714 | SLUS_216.85 715 | SLES_554.06 716 | SLUS_218.21 717 | SLES_555.87 718 | SLES_556.36 719 | SLES_556.56 720 | SLES_556.66 721 | SLES_556.73 722 | SCES_538.99 723 | SLES_538.99 724 | XEBP_100.41 725 | SCES_503.60 726 | SCUS_971.01 727 | SLES_503.60 728 | SCES_512.24 729 | SCUS_971.97 730 | SLES_512.24 731 | SLPM_654.12 732 | XEBP_100.42 733 | SCES_527.07 734 | SLES_527.07 735 | SLPM_654.95 736 | SLUS_208.96 737 | SLPM_742.48 738 | SLKA_252.19 739 | SLPM_658.69 740 | XEBP_100.43 741 | SCES_543.76 742 | SCKA_200.96 743 | SLES_543.76 744 | SLUS_212.77 745 | SCES_534.18 746 | SCES_536.95 747 | SLES_534.18 748 | SLES_536.95 749 | SLUS_212.18 750 | SCES_534.94 751 | SCES_534.96 752 | SLES_534.94 753 | SLES_534.96 754 | SLUS_212.52 755 | SLUS_212.84 756 | SLES_536.34 757 | XEBP_100.44 758 | SCES_541.63 759 | SLPS_252.93 760 | SLES_541.63 761 | SLUS_213.58 762 | SLPS_732.12 763 | SLPS_253.98 764 | SLPS_732.21 765 | SLES_548.78 766 | SLUS_215.75 767 | SLES_552.37 768 | SLUS_217.27 769 | SLPS_732.51 770 | SLPS_255.89 771 | SLPS_257.68 772 | SLUS_218.62 773 | SLES_556.05 774 | SLPS_258.37 775 | XEBP_100.45 776 | SCES_527.25 777 | SLES_527.25 778 | SLUS_210.65 779 | SLUS_291.18 780 | SLPM_669.60 781 | SLPM_657.66 782 | SLPM_660.51 783 | SCES_535.57 784 | SCES_535.58 785 | SCES_535.59 786 | SLES_535.57 787 | SLES_535.58 788 | SLES_535.59 789 | SLPM_662.32 790 | SLUS_212.67 791 | SLPM_665.62 792 | SCES_538.57 793 | SLAJ_250.75 794 | SLES_538.57 795 | SLUS_213.51 796 | SLPM_668.69 797 | SCES_543.21 798 | SCES_543.22 799 | SCES_543.23 800 | SCES_543.24 801 | SLAJ_250.91 802 | SLES_543.21 803 | SLES_543.22 804 | SLES_543.23 805 | SLES_543.24 806 | SLPM_666.17 807 | SLUS_214.93 808 | SCES_544.02 809 | SCES_544.92 810 | SCES_544.93 811 | SLES_544.02 812 | SLES_544.92 813 | SLES_544.93 814 | SLUS_214.94 815 | SLPM_669.32 816 | SLUS_216.58 817 | SLES_550.02 818 | SLPM_551.51 819 | XEBP_100.46 820 | SLUS_213.95 821 | SLES_541.88 822 | SLES_548.40 823 | SLUS_215.88 824 | XEBP_100.47 825 | PAPX_902.34 826 | SCAJ_200.79 827 | SCKA_200.25 828 | SLPS_253.60 829 | SLUS_210.08 830 | SLPS_732.10 831 | SLPS_732.40 832 | SLPS_254.67 833 | SCAJ_201.35 834 | SCKA_200.51 835 | SLPS_732.41 836 | SLUS_212.30 837 | XEBP_100.48 838 | SLES_526.74 839 | SCES_525.63 840 | SLES_525.63 841 | SLES_525.59 842 | SCES_525.59 843 | SLES_525.62 844 | SCES_525.62 845 | SLES_525.61 846 | SCES_525.61 847 | SLES_525.60 848 | SCES_525.60 849 | XEBP_100.49 850 | SLPM_654.13 851 | SCES_519.14 852 | SLES_519.14 853 | SLUS_206.94 854 | SCES_519.13 855 | SLES_519.13 856 | SLPM_654.11 857 | SLUS_207.10 858 | XEBP_100.50 859 | SLPM_669.65 860 | SLPM_669.64 861 | XEBP_100.51 862 | SLES_820.42 863 | SLES_820.44 864 | SLES_820.46 865 | SLES_820.48 866 | SLES_820.50 867 | SLES_820.52 868 | SLES_820.43 869 | SLES_820.45 870 | SLES_820.47 871 | SLES_820.49 872 | SLES_820.51 873 | SLES_820.53 874 | SLKA_253.53 875 | SLKA_253.54 876 | SLUS_212.43 877 | SLPM_662.23 878 | SLPM_662.24 879 | SLPM_662.20 880 | SLPM_662.21 881 | SLPM_662.22 882 | SLUS_213.59 883 | SLUS_213.60 884 | SLPM_661.17 885 | SLPM_661.18 886 | SLPM_661.19 887 | SLPM_552.37 888 | SLPM_667.95 889 | SLPM_667.99 890 | SLPM_742.58 891 | XEBP_100.52 892 | SLPM_658.70 893 | SLPM_662.58 894 | SLPM_658.71 895 | SLPM_660.62 896 | SLPM_660.63 897 | SLPM_663.29 898 | SLPM_665.92 899 | SLPM_665.93 900 | SLPM_667.04 901 | SLPM_667.05 902 | XEBP_100.53 903 | SLUS_213.48 904 | SLKA_253.42 905 | SLPM_661.68 906 | SLPM_742.53 907 | SLPM_742.34 908 | SLES_552.42 909 | SLPM_666.02 910 | SLKA_252.80 911 | SLKA_252.81 912 | SLPM_743.01 913 | XEBP_100.54 914 | SCAJ_250.45 915 | SLAJ_250.45 916 | SLPM_655.31 917 | SLKA_252.07 918 | SLPM_662.08 919 | SLAJ_250.34 920 | SLPM_655.15 921 | SLUS_219.27 922 | SLAJ_350.01 923 | SLKA_350.03 924 | SLPM_670.03 925 | SLAJ_350.03 926 | XEBP_100.55 927 | SLPS_734.18 928 | SCES_506.77 929 | SCES_508.22 930 | SLES_506.77 931 | SLES_508.22 932 | SLPS_250.41 933 | SLUS_203.47 934 | SLES_820.30 935 | SLES_820.31 936 | SLUS_210.41 937 | SLUS_210.44 938 | SLPS_253.17 939 | SLPS_732.14 940 | SLPM_602.14 941 | SLPM_602.26 942 | SLPM_732.14 943 | XEBP_100.56 944 | SCES_500.54 945 | SLES_500.54 946 | SCES_500.71 947 | SLES_500.71 948 | SLPS_200.68 949 | SLUS_200.63 950 | SLPM_621.89 951 | SCES_500.55 952 | SCES_500.61 953 | SLES_500.55 954 | SLES_500.61 955 | SLUS_200.65 956 | XEBP_100.57 957 | SLUS_210.39 958 | SLPM_664.98 959 | SCES_526.37 960 | SLES_526.37 961 | SCES_526.38 962 | SLES_526.38 963 | SCES_526.39 964 | SLES_526.39 965 | SCES_530.87 966 | SLES_530.87 967 | SLUS_211.82 968 | SLPM_668.81 969 | SLPM_550.46 970 | SLUS_291.78 971 | SCES_530.88 972 | SLES_530.88 973 | SCES_530.89 974 | SLES_530.89 975 | XEBP_100.58 976 | SCES_524.58 977 | SLES_524.58 978 | SCES_544.54 979 | SLES_544.54 980 | XEBP_100.59 981 | SLUS_206.66 982 | SLUS_213.97 983 | XEBP_100.60 984 | SLPS_202.51 985 | SLPS_202.50 986 | SCAJ_100.01 987 | SLPS_731.03 988 | SLPS_731.03 989 | SLPS_256.08 990 | SLPS_256.07 991 | SLPS_732.54 992 | XEBP_100.61 993 | SCES_500.79 994 | SLES_500.79 995 | SLPS_250.07 996 | SLUS_200.14 997 | SCCS_400.11 998 | SCES_509.05 999 | SCPS_550.24 1000 | SLES_509.05 1001 | SLPS_250.40 1002 | SLUS_202.49 1003 | SLPS_734.11 1004 | SCES_513.99 1005 | SCPS_550.14 1006 | SLES_513.99 1007 | SLPS_251.12 1008 | SLUS_204.35 1009 | SCAJ_200.11 1010 | SLPS_251.69 1011 | SLPS_734.20 1012 | SLPS_734.17 1013 | XEBP_100.62 1014 | SLUS_207.18 1015 | SLES_519.50 1016 | SLPM_654.31 1017 | SLKA_251.22 1018 | SLUS_209.17 1019 | SLES_529.98 1020 | SLPM_657.58 1021 | SLKA_252.33 1022 | SLES_533.50 1023 | SLPM_660.74 1024 | XEBP_100.63 1025 | SLUS_208.51 1026 | SLPS_254.18 1027 | SCKA_200.42 1028 | SLUS_213.46 1029 | SLPS_256.29 1030 | SCKA_200.70 1031 | XEBP_100.64 1032 | SCUS_971.40 1033 | SCUS_972.01 1034 | SCUS_974.16 1035 | XEBP_100.65 1036 | SLUS_204.59 1037 | SCES_514.28 1038 | SLPM_652.00 1039 | SLKA_250.21 1040 | SLUS_208.10 1041 | SLES_522.38 1042 | SLPM_654.47 1043 | SLKA_251.35 1044 | XEBP_100.66 1045 | SLUS_211.65 1046 | SCAJ_201.08 1047 | SCPS_150.58 1048 | SCUS_972.31 1049 | SCAJ_200.19 1050 | SCAJ_200.38 1051 | SCES_519.10 1052 | SLES_519.10 1053 | SCCS_400.07 1054 | PAPX_902.30 1055 | PCPX_963.30 1056 | XEBP_100.67 1057 | SCES_541.53 1058 | SLES_541.53 1059 | SLPM_664.42 1060 | SCES_541.51 1061 | SLES_541.51 1062 | XEBP_100.68 1063 | SLES_544.60 1064 | SLES_545.69 1065 | XEBP_100.69 1066 | SLPS_204.41 1067 | SLPS_204.66 1068 | XEBP_100.70 1069 | SCES_533.98 1070 | SLES_533.98 1071 | SCES_544.61 1072 | SLES_544.61 1073 | XEBP_100.71 1074 | SLPM_625.25 1075 | SLKA_150.45 1076 | SLPM_626.38 1077 | -------------------------------------------------------------------------------- /Sync-App-Source/Build-udpbd-server-MSYS2.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | # This script is intended to run with MSYS2 UCRT64 on windows 4 | pacman --noconfirm -Syuu 5 | pacman --noconfirm --needed -S git make mingw-w64-ucrt-x86_64-gcc 6 | 7 | git clone -b windows https://github.com/israpps/udpbd-server.git 8 | cd ./udpbd-server/ 9 | git reset --hard 7b20316d861d9187747715b89aed3ac811984809 10 | make 11 | 12 | 13 | -------------------------------------------------------------------------------- /Sync-App-Source/Build-udpbd-vexfat-MSYS2.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | # This script is intended to run with MSYS2 UCRT64 on windows 4 | pacman --noconfirm -Syuu 5 | pacman --noconfirm --needed -S git mingw-w64-ucrt-x86_64-gcc 6 | 7 | curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-host x86_64-pc-windows-gnu --no-modify-path 8 | export PATH="$USERPROFILE/.cargo/bin:$PATH" 9 | 10 | git clone --recurse-submodules https://github.com/awaken1ng/udpbd-vexfat.git 11 | cd ./udpbd-vexfat/ 12 | git reset --hard --recurse-submodules f20ec467e05328460d9493c0f252d87ca2a24407 13 | cd ./vexfatbd/ 14 | cargo update 15 | cd .. 16 | cargo update 17 | 18 | cargo build --release --target x86_64-pc-windows-gnu 19 | 20 | 21 | -------------------------------------------------------------------------------- /Sync-App-Source/Clean-Build.ps1: -------------------------------------------------------------------------------- 1 | 2 | Remove-Item -Path ".\UDPBD-for-XEB+-CLI\bin" -Recurse 3 | Remove-Item -Path ".\UDPBD-for-XEB+-CLI\obj" -Recurse 4 | Remove-Item -Path ".\UDPBD-for-XEB+-GUI\bin" -Recurse 5 | Remove-Item -Path ".\UDPBD-for-XEB+-GUI\obj" -Recurse 6 | Remove-Item -Path ".\udpbd-vexfat" -Recurse 7 | Remove-Item -Path ".\udpbd-server" -Recurse 8 | 9 | -------------------------------------------------------------------------------- /Sync-App-Source/Debug-Build.ps1: -------------------------------------------------------------------------------- 1 | 2 | dotnet build ".\UDPBD-for-XEB+-CLI.sln" 3 | dotnet build ".\UDPBD-for-XEB+-GUI.sln" 4 | 5 | if (Test-Path -Path "C:\msys64\usr\bin\bash.exe" -PathType Leaf) 6 | { 7 | # Preserve the current working directory 8 | $env:CHERE_INVOKING = "yes" 9 | # Start a 64 bit Mingw environment 10 | $env:MSYSTEM = "UCRT64" 11 | # Run for the first time 12 | & "C:\msys64\usr\bin\bash" "-lc" " " 13 | # Update MSYS2 Core (in case any core packages are outdated) 14 | & "C:\msys64\usr\bin\bash" "-lc" "pacman --noconfirm -Syuu" 15 | 16 | & "C:\msys64\usr\bin\bash.exe" "-lc" "bash ./Build-udpbd-vexfat-MSYS2.sh" 17 | & "C:\msys64\usr\bin\bash.exe" "-lc" "bash ./Build-udpbd-server-MSYS2.sh" 18 | } 19 | 20 | if (Test-Path -Path ".\udpbd-vexfat\target\x86_64-pc-windows-gnu\release\udpbd-vexfat.exe" -PathType Leaf) 21 | { 22 | Copy-Item -Path ".\udpbd-vexfat\target\x86_64-pc-windows-gnu\release\udpbd-vexfat.exe" -Destination ".\Needed-for-Release\udpbd-vexfat.exe" 23 | } 24 | if (Test-Path -Path ".\udpbd-server\udpbd-server.exe" -PathType Leaf) 25 | { 26 | Copy-Item -Path ".\udpbd-server\udpbd-server.exe" -Destination ".\Needed-for-Release\udpbd-server.exe" 27 | } 28 | 29 | Copy-Item -Path ".\Needed-for-Release\*" -Exclude *.txt -Destination ".\UDPBD-for-XEB+-CLI\bin\Debug\net8.0" 30 | Copy-Item -Path ".\UDPBD-for-XEB+-CLI\bin\Debug\net8.0\*" -Destination ".\UDPBD-for-XEB+-GUI\bin\Debug\net8.0-windows" 31 | Copy-Item -Path ".\UDPBD-for-XEB+-GUI\bin\Debug\net8.0-windows\*" -Destination ".\UDPBD-for-XEB+-CLI\bin\Debug\net8.0" 32 | 33 | 34 | -------------------------------------------------------------------------------- /Sync-App-Source/Needed-for-Release/ArtworkURL.cfg: -------------------------------------------------------------------------------- 1 | https://archive.org/download/OPLM_ART_2024_09/OPLM_ART_2024_09.zip/PS2/SERIALID/SERIALID 2 | -------------------------------------------------------------------------------- /Sync-App-Source/Needed-for-Release/BlankVMC32.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MegaBitmap/UDPBD-for-XEBP/89cfc7f611cea67eb66bb3ca5ec227369ce1f096/Sync-App-Source/Needed-for-Release/BlankVMC32.bin -------------------------------------------------------------------------------- /Sync-App-Source/Needed-for-Release/BlankVMC8.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MegaBitmap/UDPBD-for-XEBP/89cfc7f611cea67eb66bb3ca5ec227369ce1f096/Sync-App-Source/Needed-for-Release/BlankVMC8.bin -------------------------------------------------------------------------------- /Sync-App-Source/Needed-for-Release/bsd-udpbd.toml: -------------------------------------------------------------------------------- 1 | # Name of loaded config, to show to user 2 | name = "UDPBD BDM driver" 3 | 4 | # Drivers this driver depends on (config file must exist) 5 | depends = ["i_bdm", "i_dev9_hidden"] 6 | 7 | # Modules to load 8 | [[module]] 9 | file = "smap_udpbd.irx" 10 | args = ["ip=192.168.1.10"] 11 | env = ["LE", "EE"] 12 | 13 | # Faking strategy 14 | # --------------- 15 | # To prevent games from trying to use networing: 16 | # - we try to simulate that there is no dev9 hardware present: 17 | # - dev9 returns NO_RESIDENT_END, module is hidden 18 | # - all modules depending on dev9 fail to load becouse dev9 is not resident 19 | [[fake]] 20 | file = "ENT_SMAP.IRX" 21 | name = "ent_smap" 22 | version = 0x021f 23 | loadrv = -200 # KE_LINKERR becouse dev9 does not exist 24 | startrv = 1 # 0=RESIDENT_END, 1=NO_RESIDENT_END, 2=REMOVABLE_END 25 | [[fake]] 26 | file = "SMAP.IRX" 27 | name = "INET_SMAP_driver" 28 | version = 0x0219 29 | loadrv = -200 # KE_LINKERR becouse dev9 does not exist 30 | startrv = 1 # 0=RESIDENT_END, 1=NO_RESIDENT_END, 2=REMOVABLE_END 31 | -------------------------------------------------------------------------------- /Sync-App-Source/Needed-for-Release/neutrino_LICENSE.txt: -------------------------------------------------------------------------------- 1 | Academic Free License ("AFL") v. 3.0 2 | 3 | This Academic Free License (the "License") applies to any original work of 4 | authorship (the "Original Work") whose owner (the "Licensor") has placed the 5 | following licensing notice adjacent to the copyright notice for the Original 6 | Work: 7 | 8 | Licensed under the Academic Free License version 3.0 9 | 10 | 1) Grant of Copyright License. Licensor grants You a worldwide, royalty-free, 11 | non-exclusive, sublicensable license, for the duration of the copyright, to do 12 | the following: 13 | 14 | a) to reproduce the Original Work in copies, either alone or as part of a 15 | collective work; 16 | 17 | b) to translate, adapt, alter, transform, modify, or arrange the Original 18 | Work, thereby creating derivative works ("Derivative Works") based upon the 19 | Original Work; 20 | 21 | c) to distribute or communicate copies of the Original Work and Derivative 22 | Works to the public, under any license of your choice that does not 23 | contradict the terms and conditions, including Licensor's reserved rights 24 | and remedies, in this Academic Free License; 25 | 26 | d) to perform the Original Work publicly; and 27 | 28 | e) to display the Original Work publicly. 29 | 30 | 2) Grant of Patent License. Licensor grants You a worldwide, royalty-free, 31 | non-exclusive, sublicensable license, under patent claims owned or controlled 32 | by the Licensor that are embodied in the Original Work as furnished by the 33 | Licensor, for the duration of the patents, to make, use, sell, offer for sale, 34 | have made, and import the Original Work and Derivative Works. 35 | 36 | 3) Grant of Source Code License. The term "Source Code" means the preferred 37 | form of the Original Work for making modifications to it and all available 38 | documentation describing how to modify the Original Work. Licensor agrees to 39 | provide a machine-readable copy of the Source Code of the Original Work along 40 | with each copy of the Original Work that Licensor distributes. Licensor 41 | reserves the right to satisfy this obligation by placing a machine-readable 42 | copy of the Source Code in an information repository reasonably calculated to 43 | permit inexpensive and convenient access by You for as long as Licensor 44 | continues to distribute the Original Work. 45 | 46 | 4) Exclusions From License Grant. Neither the names of Licensor, nor the names 47 | of any contributors to the Original Work, nor any of their trademarks or 48 | service marks, may be used to endorse or promote products derived from this 49 | Original Work without express prior permission of the Licensor. Except as 50 | expressly stated herein, nothing in this License grants any license to 51 | Licensor's trademarks, copyrights, patents, trade secrets or any other 52 | intellectual property. No patent license is granted to make, use, sell, offer 53 | for sale, have made, or import embodiments of any patent claims other than the 54 | licensed claims defined in Section 2. No license is granted to the trademarks 55 | of Licensor even if such marks are included in the Original Work. Nothing in 56 | this License shall be interpreted to prohibit Licensor from licensing under 57 | terms different from this License any Original Work that Licensor otherwise 58 | would have a right to license. 59 | 60 | 5) External Deployment. The term "External Deployment" means the use, 61 | distribution, or communication of the Original Work or Derivative Works in any 62 | way such that the Original Work or Derivative Works may be used by anyone 63 | other than You, whether those works are distributed or communicated to those 64 | persons or made available as an application intended for use over a network. 65 | As an express condition for the grants of license hereunder, You must treat 66 | any External Deployment by You of the Original Work or a Derivative Work as a 67 | distribution under section 1(c). 68 | 69 | 6) Attribution Rights. You must retain, in the Source Code of any Derivative 70 | Works that You create, all copyright, patent, or trademark notices from the 71 | Source Code of the Original Work, as well as any notices of licensing and any 72 | descriptive text identified therein as an "Attribution Notice." You must cause 73 | the Source Code for any Derivative Works that You create to carry a prominent 74 | Attribution Notice reasonably calculated to inform recipients that You have 75 | modified the Original Work. 76 | 77 | 7) Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that 78 | the copyright in and to the Original Work and the patent rights granted herein 79 | by Licensor are owned by the Licensor or are sublicensed to You under the 80 | terms of this License with the permission of the contributor(s) of those 81 | copyrights and patent rights. Except as expressly stated in the immediately 82 | preceding sentence, the Original Work is provided under this License on an "AS 83 | IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without 84 | limitation, the warranties of non-infringement, merchantability or fitness for 85 | a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK 86 | IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this 87 | License. No license to the Original Work is granted by this License except 88 | under this disclaimer. 89 | 90 | 8) Limitation of Liability. Under no circumstances and under no legal theory, 91 | whether in tort (including negligence), contract, or otherwise, shall the 92 | Licensor be liable to anyone for any indirect, special, incidental, or 93 | consequential damages of any character arising as a result of this License or 94 | the use of the Original Work including, without limitation, damages for loss 95 | of goodwill, work stoppage, computer failure or malfunction, or any and all 96 | other commercial damages or losses. This limitation of liability shall not 97 | apply to the extent applicable law prohibits such limitation. 98 | 99 | 9) Acceptance and Termination. If, at any time, You expressly assented to this 100 | License, that assent indicates your clear and irrevocable acceptance of this 101 | License and all of its terms and conditions. If You distribute or communicate 102 | copies of the Original Work or a Derivative Work, You must make a reasonable 103 | effort under the circumstances to obtain the express assent of recipients to 104 | the terms of this License. This License conditions your rights to undertake 105 | the activities listed in Section 1, including your right to create Derivative 106 | Works based upon the Original Work, and doing so without honoring these terms 107 | and conditions is prohibited by copyright law and international treaty. 108 | Nothing in this License is intended to affect copyright exceptions and 109 | limitations (including "fair use" or "fair dealing"). This License shall 110 | terminate immediately and You may no longer exercise any of the rights granted 111 | to You by this License upon your failure to honor the conditions in Section 112 | 1(c). 113 | 114 | 10) Termination for Patent Action. This License shall terminate automatically 115 | and You may no longer exercise any of the rights granted to You by this 116 | License as of the date You commence an action, including a cross-claim or 117 | counterclaim, against Licensor or any licensee alleging that the Original Work 118 | infringes a patent. This termination provision shall not apply for an action 119 | alleging patent infringement by combinations of the Original Work with other 120 | software or hardware. 121 | 122 | 11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this 123 | License may be brought only in the courts of a jurisdiction wherein the 124 | Licensor resides or in which Licensor conducts its primary business, and under 125 | the laws of that jurisdiction excluding its conflict-of-law provisions. The 126 | application of the United Nations Convention on Contracts for the 127 | International Sale of Goods is expressly excluded. Any use of the Original 128 | Work outside the scope of this License or after its termination shall be 129 | subject to the requirements and penalties of copyright or patent law in the 130 | appropriate jurisdiction. This section shall survive the termination of this 131 | License. 132 | 133 | 12) Attorneys' Fees. In any action to enforce the terms of this License or 134 | seeking damages relating thereto, the prevailing party shall be entitled to 135 | recover its costs and expenses, including, without limitation, reasonable 136 | attorneys' fees and costs incurred in connection with such action, including 137 | any appeal of such action. This section shall survive the termination of this 138 | License. 139 | 140 | 13) Miscellaneous. If any provision of this License is held to be 141 | unenforceable, such provision shall be reformed only to the extent necessary 142 | to make it enforceable. 143 | 144 | 14) Definition of "You" in This License. "You" throughout this License, 145 | whether in upper or lower case, means an individual or a legal entity 146 | exercising rights under, and complying with all of the terms of, this License. 147 | For legal entities, "You" includes any entity that controls, is controlled by, 148 | or is under common control with you. For purposes of this definition, 149 | "control" means (i) the power, direct or indirect, to cause the direction or 150 | management of such entity, whether by contract or otherwise, or (ii) ownership 151 | of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial 152 | ownership of such entity. 153 | 154 | 15) Right to Use. You may use the Original Work in all ways not otherwise 155 | restricted or conditioned by this License or by law, and Licensor promises not 156 | to interfere with or be responsible for such uses by You. 157 | 158 | 16) Modification of This License. This License is Copyright © 2005 Lawrence 159 | Rosen. Permission is granted to copy, distribute, or communicate this License 160 | without modification. Nothing in this License permits You to modify this 161 | License as applied to the Original Work or to Derivative Works. However, You 162 | may modify the text of this License and copy, distribute or communicate your 163 | modified version (the "Modified License") and apply it to other original works 164 | of authorship subject to the following conditions: (i) You may not indicate in 165 | any way that your Modified License is the "Academic Free License" or "AFL" and 166 | you may not use those names in the name of your Modified License; (ii) You 167 | must replace the notice specified in the first paragraph above with the notice 168 | "Licensed under " or with a notice of your own 169 | that is not confusingly similar to the notice in this License; and (iii) You 170 | may not claim that your original works are open source software unless your 171 | Modified License has been approved by Open Source Initiative (OSI) and You 172 | comply with its license review and certification process. 173 | -------------------------------------------------------------------------------- /Sync-App-Source/Needed-for-Release/udpbd-server.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MegaBitmap/UDPBD-for-XEBP/89cfc7f611cea67eb66bb3ca5ec227369ce1f096/Sync-App-Source/Needed-for-Release/udpbd-server.exe -------------------------------------------------------------------------------- /Sync-App-Source/Needed-for-Release/udpbd-vexfat.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MegaBitmap/UDPBD-for-XEBP/89cfc7f611cea67eb66bb3ca5ec227369ce1f096/Sync-App-Source/Needed-for-Release/udpbd-vexfat.exe -------------------------------------------------------------------------------- /Sync-App-Source/Needed-for-Release/vmc_groups.list: -------------------------------------------------------------------------------- 1 | XEBP_000.01 2 | SLES_820.36 3 | SLPS_253.38 4 | SCAJ_200.76 5 | SLUS_209.86 6 | SLKA_252.01 7 | SLPS_732.02 8 | SLPS_253.39 9 | SLES_820.37 10 | SLUS_210.79 11 | SLKA_252.02 12 | SCAJ_200.77 13 | SLPS_732.03 14 | XEBP_000.02 15 | SLPM_650.86 16 | SLPM_650.87 17 | XEBP_000.03 18 | SLPS_200.84 19 | SLPS_200.85 20 | XEBP_000.04 21 | SLPM_552.21 22 | SLPM_552.22 23 | XEBP_000.05 24 | SCPS_110.19 25 | SCPS_110.20 26 | XEBP_000.06 27 | SLES_820.21 28 | SLES_820.20 29 | SLUS_206.97 30 | SLUS_208.54 31 | SLES_820.21 32 | SLPM_655.06 33 | SLPM_655.07 34 | SLPM_657.42 35 | SLPM_657.43 36 | SLPM_655.04 37 | SLPM_655.05 38 | XEBP_000.07 39 | SLES_820.11 40 | SLPM_652.32 41 | SCCS_400.02 42 | SLUS_204.84 43 | SCCS_400.03 44 | SLUS_206.27 45 | SLES_820.12 46 | SLPM_652.33 47 | XEBP_000.08 48 | SLPS_201.40 49 | SLPS_201.41 50 | XEBP_000.09 51 | SLPM_650.40 52 | SLPM_650.41 53 | SLPM_650.42 54 | SLPM_650.43 55 | XEBP_000.10 56 | SCAJ_201.41 57 | SLPM_659.76 58 | SLPM_859.76 59 | SLUS_213.34 60 | SLUS_213.35 61 | XEBP_000.11 62 | SLPM_650.02 63 | SLPM_650.03 64 | XEBP_000.12 65 | SLPM_666.02 66 | SLKA_252.80 67 | SLKA_252.81 68 | SLPM_743.01 69 | XEBP_000.13 70 | SLES_820.38 71 | SLES_820.39 72 | SLUS_211.80 73 | SLUS_213.62 74 | SCKA_200.86 75 | SCKA_200.87 76 | SLPM_662.75 77 | SLPM_662.76 78 | SLPM_742.51 79 | SLPM_742.32 80 | XEBP_000.14 81 | SLAJ_251.04 82 | SLAJ_251.05 83 | SLPM_550.82 84 | SLPM_742.86 85 | XEBP_000.15 86 | SLUS_208.06 87 | SLUS_208.07 88 | XEBP_000.16 89 | SCPS_550.19 90 | SLES_820.28 91 | SLES_820.29 92 | SLUS_204.88 93 | SLUS_208.91 94 | SLPM_664.78 95 | SLPM_664.79 96 | SCAJ_200.70 97 | SLPM_654.38 98 | SLPM_654.39 99 | SLPM_652.09 100 | XEBP_000.17 101 | SLPS_200.18 102 | SLPS_200.19 103 | XEBP_100.01 104 | SCUS_974.29 105 | SCES_532.86 106 | SLES_532.86 107 | SCED_529.52 108 | SCES_524.60 109 | SCKA_200.40 110 | SCUS_973.30 111 | SLES_524.60 112 | SCUS_975.16 113 | SCPS_150.21 114 | SCPS_150.57 115 | SCES_516.08 116 | SLES_516.08 117 | SCKA_200.10 118 | SCUS_972.65 119 | PAPX_902.23 120 | SCES_503.61 121 | SCUS_971.24 122 | SCKA_200.60 123 | SCUS_974.65 124 | SCES_532.85 125 | SLES_532.85 126 | SCPS_151.00 127 | SCAJ_201.57 128 | SCPS_193.21 129 | SCPS_193.28 130 | XEBP_100.02 131 | SCES_524.56 132 | SCKA_200.37 133 | SCPS_150.84 134 | SLES_524.56 135 | SCAJ_201.09 136 | SCPS_193.09 137 | SCKA_200.11 138 | SCPS_150.56 139 | SCPS_193.17 140 | SCUS_972.68 141 | SCUS_975.13 142 | PBPX_955.16 143 | SCED_510.75 144 | SCES_509.16 145 | SCKA_201.20 146 | SCPS_150.37 147 | SCUS_971.99 148 | SLES_509.16 149 | XEBP_100.03 150 | SCES_554.96 151 | SCUS_976.23 152 | SCPS_151.20 153 | SCUS_976.15 154 | XEBP_100.04 155 | PBPX_956.01 156 | SCAJ_300.06 157 | SCAJ_300.07 158 | SCES_517.19 159 | SCKA_300.01 160 | SCPS_170.01 161 | SCUS_973.28 162 | SLES_517.19 163 | PBPX_955.23 164 | PBPX_955.24 165 | SCAJ_200.66 166 | SCES_524.38 167 | SCPS_150.55 168 | SLES_524.38 169 | SCPS_193.04 170 | PBPX_955.02 171 | SCPS_150.09 172 | SCPS_550.07 173 | SCUS_971.02 174 | SCUS_975.12 175 | SCPS_720.01 176 | PBPX_955.03 177 | XEBP_100.05 178 | SCES_503.82 179 | SLES_503.82 180 | SLPM_650.51 181 | SLUS_202.28 182 | SCES_511.56 183 | SLES_511.56 184 | SCES_514.34 185 | SLES_514.34 186 | SLPM_652.57 187 | SLUS_206.22 188 | SLPM_660.18 189 | SLPM_656.22 190 | XEBP_100.06 191 | SCES_504.90 192 | SCES_504.91 193 | SCES_504.92 194 | SCES_504.93 195 | SCES_504.94 196 | SLES_504.90 197 | SLES_504.91 198 | SLES_504.92 199 | SLES_504.93 200 | SLES_504.94 201 | SLPS_250.50 202 | SLUS_203.12 203 | SLKA_252.14 204 | SLPM_666.77 205 | SLPM_661.24 206 | SLPM_651.15 207 | SLPM_675.13 208 | SLPS_250.88 209 | SCAJ_250.12 210 | SCES_518.15 211 | SCES_518.16 212 | SCES_518.17 213 | SCES_518.18 214 | SCES_518.19 215 | SLAJ_250.12 216 | SLES_518.15 217 | SLES_518.16 218 | SLES_518.17 219 | SLES_518.18 220 | SLES_518.19 221 | SLKA_251.44 222 | SLPS_252.50 223 | SLUS_206.72 224 | SLPM_666.78 225 | SLPM_661.25 226 | SCAJ_200.68 227 | SLPM_654.78 228 | XEBP_100.07 229 | SCAJ_200.99 230 | SCCS_400.05 231 | SCED_508.44 232 | SCES_507.60 233 | SCPS_110.03 234 | SCPS_550.01 235 | SCPS_560.01 236 | SCUS_971.13 237 | SLES_507.60 238 | SCKA_200.28 239 | SCPS_191.03 240 | SCPS_191.51 241 | SCAJ_201.96 242 | SCAJ_201.46 243 | SCES_533.26 244 | SCUS_974.72 245 | SLES_533.26 246 | XEBP_100.08 247 | SLKA_250.80 248 | SCES_522.37 249 | SLES_522.37 250 | SLUS_202.67 251 | SCPS_550.29 252 | SLPS_251.21 253 | SLPS_732.30 254 | SLKA_251.38 255 | SCES_524.67 256 | SLES_524.67 257 | SLUS_205.62 258 | SLPS_732.31 259 | SCPS_550.42 260 | SLPS_251.43 261 | SLKA_251.45 262 | SCES_524.69 263 | SLES_524.69 264 | SLUS_205.63 265 | SCAJ_200.04 266 | SLPS_251.58 267 | SLPS_732.32 268 | SCES_524.68 269 | SLES_524.68 270 | SLUS_205.64 271 | SLKA_251.74 272 | SLPS_732.33 273 | SCAJ_200.24 274 | SLPS_252.02 275 | SLUS_212.58 276 | SLUS_291.99 277 | SLPS_256.51 278 | SLPS_257.56 279 | SLPS_732.59 280 | SLPS_257.55 281 | SLPS_256.55 282 | SLPS_732.66 283 | SLUS_214.88 284 | SLPS_256.56 285 | SLPS_732.67 286 | SLUS_214.89 287 | SLPS_255.27 288 | SLPM_685.21 289 | SLPS_256.52 290 | SLUS_214.80 291 | XEBP_100.09 292 | SLUS_211.68 293 | SCES_537.55 294 | SLES_537.55 295 | SLKA_253.28 296 | SCES_521.18 297 | SLES_521.18 298 | SLPM_654.44 299 | SLUS_207.33 300 | SLKA_250.82 301 | SLPM_663.25 302 | SLPM_654.06 303 | XEBP_100.10 304 | SCES_531.94 305 | SLES_531.94 306 | SLUS_210.83 307 | SLPS_204.23 308 | SCES_542.21 309 | SLES_542.21 310 | SLPM_665.72 311 | SLUS_214.09 312 | XEBP_100.11 313 | SCES_515.89 314 | SLES_515.89 315 | SLUS_207.65 316 | SCES_533.19 317 | SLES_533.19 318 | SLUS_209.84 319 | XEBP_100.12 320 | SLKA_252.65 321 | SLPM_658.80 322 | SLUS_209.64 323 | SCES_530.38 324 | SLES_530.38 325 | SCES_541.86 326 | SLES_541.86 327 | SLUS_213.61 328 | SLPM_742.68 329 | SLPM_661.60 330 | SLPM_742.42 331 | XEBP_100.13 332 | SCES_537.69 333 | SLES_537.69 334 | SLUS_212.45 335 | SCES_529.13 336 | SLES_529.13 337 | SLUS_209.79 338 | SLPM_742.13 339 | SLPM_656.00 340 | SLPM_655.99 341 | XEBP_100.14 342 | SCES_532.00 343 | SLES_532.00 344 | SLUS_212.27 345 | SLPS_255.60 346 | SLUS_214.41 347 | SCES_541.64 348 | SLES_541.64 349 | SLPS_256.90 350 | XEBP_100.15 351 | SCES_512.33 352 | SLES_512.33 353 | SLPS_251.74 354 | SLUS_205.91 355 | SCES_518.39 356 | SLES_518.39 357 | SLPS_253.30 358 | SLUS_207.79 359 | SLPM_685.13 360 | SCES_527.30 361 | SLES_527.30 362 | SLUS_209.98 363 | SCES_533.46 364 | SLES_533.46 365 | SLUS_211.23 366 | XEBP_100.16 367 | SLPM_622.06 368 | SLUS_207.58 369 | SLPS_201.06 370 | SLPS_201.05 371 | SLPM_622.07 372 | SLPM_622.08 373 | SLUS_207.59 374 | SLPM_624.40 375 | XEBP_100.17 376 | SLUS_204.69 377 | SLPS_290.02 378 | SLPS_739.01 379 | SLPS_290.01 380 | SLPS_290.05 381 | SCPS_559.01 382 | SCAJ_300.01 383 | SCAJ_200.86 384 | SLPS_253.68 385 | SCAJ_200.87 386 | SLPS_253.69 387 | SLPS_732.24 388 | SLPS_732.25 389 | SLPS_253.66 390 | SLPS_253.67 391 | SLES_820.34 392 | SLES_820.35 393 | SLUS_208.92 394 | SLUS_211.33 395 | SLUS_213.89 396 | SLUS_214.17 397 | SCAJ_201.79 398 | SLPS_256.40 399 | SCAJ_201.80 400 | SLPS_256.41 401 | XEBP_100.18 402 | SLES_550.18 403 | SLUS_215.69 404 | SCKA_200.99 405 | SLPM_664.45 406 | SLES_553.54 407 | SLUS_216.21 408 | SLPM_666.89 409 | SLPM_837.70 410 | XEBP_100.19 411 | SCES_543.08 412 | SLES_543.08 413 | SLPM_660.31 414 | SLUS_211.94 415 | SLPM_742.44 416 | SLES_548.92 417 | SLPM_666.63 418 | SLUS_216.31 419 | XEBP_100.20 420 | SCES_534.58 421 | SLES_534.58 422 | SLUS_209.74 423 | SCAJ_200.95 424 | SLPM_655.97 425 | SLPM_663.72 426 | SCES_545.55 427 | SLES_545.55 428 | SLUS_211.52 429 | SCAJ_201.20 430 | SLPM_657.95 431 | SLPM_663.73 432 | XEBP_100.21 433 | SLPM_621.54 434 | SLPM_652.77 435 | SLPM_653.58 436 | SLPM_624.27 437 | SLPM_657.75 438 | SLPM_662.42 439 | SLPM_666.09 440 | SLPM_669.30 441 | SLPM_550.90 442 | SLPM_663.13 443 | SLPM_663.14 444 | XEBP_100.22 445 | SCUS_971.04 446 | SCES_502.93 447 | SLES_502.93 448 | SCUS_972.11 449 | SLES_518.14 450 | SCUS_975.10 451 | SCUS_973.69 452 | SCUS_974.05 453 | SLES_537.54 454 | SCES_537.54 455 | SCUS_975.14 456 | SLUS_974.05 457 | XEBP_100.23 458 | SCES_529.42 459 | SLES_529.42 460 | SLUS_210.29 461 | SCES_537.17 462 | SLES_537.17 463 | SLUS_213.55 464 | XEBP_100.24 465 | 32 466 | SCES_517.97 467 | SLES_517.97 468 | SLUS_207.52 469 | SCES_525.81 470 | SLES_525.81 471 | SLUS_210.00 472 | SLUS_210.25 473 | SLUS_207.19 474 | SLUS_209.91 475 | SCES_518.87 476 | SLES_518.87 477 | SLUS_207.57 478 | SLUS_207.54 479 | SLUS_208.24 480 | SLUS_207.50 481 | SCES_519.53 482 | SCES_519.63 483 | SCES_519.64 484 | SLES_519.53 485 | SLES_519.63 486 | SLES_519.64 487 | SCES_523.74 488 | SLES_523.74 489 | SLPM_655.87 490 | SLUS_209.06 491 | SCES_517.98 492 | SLES_517.98 493 | SLUS_207.56 494 | SLES_520.22 495 | XEBP_100.25 496 | SCES_504.22 497 | SLES_504.22 498 | SLUS_202.63 499 | SLPS_250.79 500 | SLUS_202.41 501 | XEBP_100.26 502 | SCES_511.54 503 | SLES_511.54 504 | SLUS_205.29 505 | SLPS_251.57 506 | SLUS_205.30 507 | XEBP_100.27 508 | SLPM_662.04 509 | SLUS_212.13 510 | SLUS_212.14 511 | SCES_529.82 512 | SLES_529.82 513 | SLUS_211.18 514 | SCES_525.84 515 | SCES_525.85 516 | SLAJ_250.53 517 | SLES_525.84 518 | SLES_525.85 519 | SLPM_657.19 520 | SLUS_210.50 521 | SLPM_659.58 522 | SLPM_669.62 523 | SLKA_252.06 524 | SCES_535.06 525 | SCES_535.07 526 | SLES_535.06 527 | SLES_535.07 528 | SLPM_661.08 529 | SLUS_212.42 530 | SLKA_253.04 531 | SLAJ_250.66 532 | SLPM_666.52 533 | SLPM_550.04 534 | SCES_538.86 535 | SCES_540.30 536 | SLAJ_250.78 537 | SLES_540.30 538 | SLPM_663.54 539 | SLUS_213.76 540 | SLUS_291.80 541 | SLPM_667.31 542 | SLPM_669.61 543 | SLES_538.86 544 | XEBP_100.28 545 | SCES_542.48 546 | SLES_542.48 547 | SLPM_666.00 548 | SLUS_214.76 549 | SLUS_214.77 550 | SLUS_214.59 551 | SLUS_214.07 552 | XEBP_100.29 553 | SLPM_668.37 554 | SLUS_216.38 555 | XEBP_100.30 556 | SLUS_217.70 557 | SLUS_217.52 558 | XEBP_100.31 559 | SLUS_218.93 560 | SLUS_218.92 561 | XEBP_100.32 562 | SCES_513.40 563 | SLAJ_250.07 564 | SLES_513.40 565 | SLPM_652.69 566 | SLUS_204.76 567 | SLUS_205.38 568 | XEBP_100.33 569 | SCES_513.39 570 | SLES_513.39 571 | SLPM_652.24 572 | SLUS_204.57 573 | SLUS_204.53 574 | XEBP_100.34 575 | SCES_520.08 576 | SLES_520.08 577 | SLPS_252.97 578 | SLUS_207.55 579 | SLPM_656.66 580 | SLUS_207.71 581 | XEBP_100.35 582 | SCES_516.61 583 | SCES_516.62 584 | SCES_516.63 585 | SCES_516.64 586 | SCES_516.65 587 | SLES_516.61 588 | SLES_516.62 589 | SLES_516.63 590 | SLES_516.64 591 | SLES_516.65 592 | SLUS_206.53 593 | SLKA_253.39 594 | SCES_521.71 595 | SCES_521.72 596 | SCES_521.74 597 | SCES_521.75 598 | SLES_521.71 599 | SLES_521.72 600 | SLES_521.73 601 | SLES_521.74 602 | SLES_521.75 603 | SCES_525.91 604 | SCES_525.92 605 | SCES_525.93 606 | SLES_525.91 607 | SLES_525.92 608 | SLES_525.93 609 | SLUS_209.38 610 | SLKA_253.40 611 | SLKA_254.17 612 | XEBP_100.36 613 | SCES_533.39 614 | SLES_533.39 615 | SLUS_211.53 616 | SCES_538.60 617 | SCES_538.61 618 | SCES_538.62 619 | SLES_538.60 620 | SLES_538.61 621 | SLES_538.62 622 | SLUS_212.99 623 | SCES_540.95 624 | SCES_540.96 625 | SCES_540.97 626 | SLES_540.95 627 | SLES_540.96 628 | SLES_540.97 629 | SLUS_213.98 630 | SLUS_208.79 631 | SLPM_654.23 632 | SLPM_661.72 633 | SLKA_252.66 634 | SLPM_668.13 635 | SLPM_665.23 636 | SLPM_669.71 637 | SLUS_212.02 638 | SLPM_658.91 639 | SLPM_665.60 640 | SLUS_215.84 641 | SLPM_665.49 642 | SLPM_667.01 643 | XEBP_100.37 644 | SCES_525.51 645 | SCES_525.53 646 | SCES_525.55 647 | SLUS_208.78 648 | SLPM_625.35 649 | SLUS_210.80 650 | SLES_530.02 651 | SLES_530.03 652 | SLES_530.04 653 | SCES_531.19 654 | SCES_531.20 655 | SCES_531.21 656 | SLAJ_250.57 657 | SLES_531.19 658 | SLES_531.20 659 | SLES_531.21 660 | SLPM_657.81 661 | SLPM_742.23 662 | SLPM_625.73 663 | SLPM_742.31 664 | KOEI_000.21 665 | SLPM_657.80 666 | XEBP_100.38 667 | SCES_543.40 668 | SLES_543.40 669 | SLUS_214.62 670 | SLES_546.24 671 | SLES_551.08 672 | SLUS_217.26 673 | SLES_546.24 674 | SLUS_215.85 675 | XEBP_100.39 676 | SCES_548.45 677 | SLES_548.45 678 | SLUS_216.62 679 | SLUS_216.62 680 | SLUS_218.03 681 | XEBP_100.40 682 | 32 683 | SCES_504.12 684 | SCES_504.62 685 | SLES_504.12 686 | SLES_504.62 687 | SLES_511.14 688 | SCES_511.14 689 | SCES_519.12 690 | SCES_519.15 691 | SLES_519.12 692 | SLES_519.15 693 | SCES_527.60 694 | SCES_528.00 695 | SLES_527.60 696 | SLES_528.00 697 | SCES_534.44 698 | SCES_535.44 699 | SCES_535.45 700 | SLES_534.44 701 | SLES_535.44 702 | SLES_535.45 703 | SCES_542.03 704 | SCES_542.04 705 | SCES_543.60 706 | SCES_543.61 707 | SCES_543.62 708 | SLES_542.03 709 | SLES_542.04 710 | SLES_543.60 711 | SLES_543.61 712 | SLES_543.62 713 | SLES_549.13 714 | SLUS_216.85 715 | SLES_554.06 716 | SLUS_218.21 717 | SLES_555.87 718 | SLES_556.36 719 | SLES_556.56 720 | SLES_556.66 721 | SLES_556.73 722 | SCES_538.99 723 | SLES_538.99 724 | XEBP_100.41 725 | SCES_503.60 726 | SCUS_971.01 727 | SLES_503.60 728 | SCES_512.24 729 | SCUS_971.97 730 | SLES_512.24 731 | SLPM_654.12 732 | XEBP_100.42 733 | SCES_527.07 734 | SLES_527.07 735 | SLPM_654.95 736 | SLUS_208.96 737 | SLPM_742.48 738 | SLKA_252.19 739 | SLPM_658.69 740 | XEBP_100.43 741 | SCES_543.76 742 | SCKA_200.96 743 | SLES_543.76 744 | SLUS_212.77 745 | SCES_534.18 746 | SCES_536.95 747 | SLES_534.18 748 | SLES_536.95 749 | SLUS_212.18 750 | SCES_534.94 751 | SCES_534.96 752 | SLES_534.94 753 | SLES_534.96 754 | SLUS_212.52 755 | SLUS_212.84 756 | SLES_536.34 757 | XEBP_100.44 758 | SCES_541.63 759 | SLPS_252.93 760 | SLES_541.63 761 | SLUS_213.58 762 | SLPS_732.12 763 | SLPS_253.98 764 | SLPS_732.21 765 | SLES_548.78 766 | SLUS_215.75 767 | SLES_552.37 768 | SLUS_217.27 769 | SLPS_732.51 770 | SLPS_255.89 771 | SLPS_257.68 772 | SLUS_218.62 773 | SLES_556.05 774 | SLPS_258.37 775 | XEBP_100.45 776 | SCES_527.25 777 | SLES_527.25 778 | SLUS_210.65 779 | SLUS_291.18 780 | SLPM_669.60 781 | SLPM_657.66 782 | SLPM_660.51 783 | SCES_535.57 784 | SCES_535.58 785 | SCES_535.59 786 | SLES_535.57 787 | SLES_535.58 788 | SLES_535.59 789 | SLPM_662.32 790 | SLUS_212.67 791 | SLPM_665.62 792 | SCES_538.57 793 | SLAJ_250.75 794 | SLES_538.57 795 | SLUS_213.51 796 | SLPM_668.69 797 | SCES_543.21 798 | SCES_543.22 799 | SCES_543.23 800 | SCES_543.24 801 | SLAJ_250.91 802 | SLES_543.21 803 | SLES_543.22 804 | SLES_543.23 805 | SLES_543.24 806 | SLPM_666.17 807 | SLUS_214.93 808 | SCES_544.02 809 | SCES_544.92 810 | SCES_544.93 811 | SLES_544.02 812 | SLES_544.92 813 | SLES_544.93 814 | SLUS_214.94 815 | SLPM_669.32 816 | SLUS_216.58 817 | SLES_550.02 818 | SLPM_551.51 819 | XEBP_100.46 820 | SLUS_213.95 821 | SLES_541.88 822 | SLES_548.40 823 | SLUS_215.88 824 | XEBP_100.47 825 | PAPX_902.34 826 | SCAJ_200.79 827 | SCKA_200.25 828 | SLPS_253.60 829 | SLUS_210.08 830 | SLPS_732.10 831 | SLPS_732.40 832 | SLPS_254.67 833 | SCAJ_201.35 834 | SCKA_200.51 835 | SLPS_732.41 836 | SLUS_212.30 837 | XEBP_100.48 838 | SLES_526.74 839 | SCES_525.63 840 | SLES_525.63 841 | SLES_525.59 842 | SCES_525.59 843 | SLES_525.62 844 | SCES_525.62 845 | SLES_525.61 846 | SCES_525.61 847 | SLES_525.60 848 | SCES_525.60 849 | XEBP_100.49 850 | SLPM_654.13 851 | SCES_519.14 852 | SLES_519.14 853 | SLUS_206.94 854 | SCES_519.13 855 | SLES_519.13 856 | SLPM_654.11 857 | SLUS_207.10 858 | XEBP_100.50 859 | SLPM_669.65 860 | SLPM_669.64 861 | XEBP_100.51 862 | SLES_820.42 863 | SLES_820.44 864 | SLES_820.46 865 | SLES_820.48 866 | SLES_820.50 867 | SLES_820.52 868 | SLES_820.43 869 | SLES_820.45 870 | SLES_820.47 871 | SLES_820.49 872 | SLES_820.51 873 | SLES_820.53 874 | SLKA_253.53 875 | SLKA_253.54 876 | SLUS_212.43 877 | SLPM_662.23 878 | SLPM_662.24 879 | SLPM_662.20 880 | SLPM_662.21 881 | SLPM_662.22 882 | SLUS_213.59 883 | SLUS_213.60 884 | SLPM_661.17 885 | SLPM_661.18 886 | SLPM_661.19 887 | SLPM_552.37 888 | SLPM_667.95 889 | SLPM_667.99 890 | SLPM_742.58 891 | XEBP_100.52 892 | SLPM_658.70 893 | SLPM_662.58 894 | SLPM_658.71 895 | SLPM_660.62 896 | SLPM_660.63 897 | SLPM_663.29 898 | SLPM_665.92 899 | SLPM_665.93 900 | SLPM_667.04 901 | SLPM_667.05 902 | XEBP_100.53 903 | SLUS_213.48 904 | SLKA_253.42 905 | SLPM_661.68 906 | SLPM_742.53 907 | SLPM_742.34 908 | SLES_552.42 909 | SLPM_666.02 910 | SLKA_252.80 911 | SLKA_252.81 912 | SLPM_743.01 913 | XEBP_100.54 914 | SCAJ_250.45 915 | SLAJ_250.45 916 | SLPM_655.31 917 | SLKA_252.07 918 | SLPM_662.08 919 | SLAJ_250.34 920 | SLPM_655.15 921 | SLUS_219.27 922 | SLAJ_350.01 923 | SLKA_350.03 924 | SLPM_670.03 925 | SLAJ_350.03 926 | XEBP_100.55 927 | SLPS_734.18 928 | SCES_506.77 929 | SCES_508.22 930 | SLES_506.77 931 | SLES_508.22 932 | SLPS_250.41 933 | SLUS_203.47 934 | SLES_820.30 935 | SLES_820.31 936 | SLUS_210.41 937 | SLUS_210.44 938 | SLPS_253.17 939 | SLPS_732.14 940 | SLPM_602.14 941 | SLPM_602.26 942 | SLPM_732.14 943 | XEBP_100.56 944 | SCES_500.54 945 | SLES_500.54 946 | SCES_500.71 947 | SLES_500.71 948 | SLPS_200.68 949 | SLUS_200.63 950 | SLPM_621.89 951 | SCES_500.55 952 | SCES_500.61 953 | SLES_500.55 954 | SLES_500.61 955 | SLUS_200.65 956 | XEBP_100.57 957 | SLUS_210.39 958 | SLPM_664.98 959 | SCES_526.37 960 | SLES_526.37 961 | SCES_526.38 962 | SLES_526.38 963 | SCES_526.39 964 | SLES_526.39 965 | SCES_530.87 966 | SLES_530.87 967 | SLUS_211.82 968 | SLPM_668.81 969 | SLPM_550.46 970 | SLUS_291.78 971 | SCES_530.88 972 | SLES_530.88 973 | SCES_530.89 974 | SLES_530.89 975 | XEBP_100.58 976 | SCES_524.58 977 | SLES_524.58 978 | SCES_544.54 979 | SLES_544.54 980 | XEBP_100.59 981 | SLUS_206.66 982 | SLUS_213.97 983 | XEBP_100.60 984 | SLPS_202.51 985 | SLPS_202.50 986 | SCAJ_100.01 987 | SLPS_731.03 988 | SLPS_731.03 989 | SLPS_256.08 990 | SLPS_256.07 991 | SLPS_732.54 992 | XEBP_100.61 993 | SCES_500.79 994 | SLES_500.79 995 | SLPS_250.07 996 | SLUS_200.14 997 | SCCS_400.11 998 | SCES_509.05 999 | SCPS_550.24 1000 | SLES_509.05 1001 | SLPS_250.40 1002 | SLUS_202.49 1003 | SLPS_734.11 1004 | SCES_513.99 1005 | SCPS_550.14 1006 | SLES_513.99 1007 | SLPS_251.12 1008 | SLUS_204.35 1009 | SCAJ_200.11 1010 | SLPS_251.69 1011 | SLPS_734.20 1012 | SLPS_734.17 1013 | XEBP_100.62 1014 | SLUS_207.18 1015 | SLES_519.50 1016 | SLPM_654.31 1017 | SLKA_251.22 1018 | SLUS_209.17 1019 | SLES_529.98 1020 | SLPM_657.58 1021 | SLKA_252.33 1022 | SLES_533.50 1023 | SLPM_660.74 1024 | XEBP_100.63 1025 | SLUS_208.51 1026 | SLPS_254.18 1027 | SCKA_200.42 1028 | SLUS_213.46 1029 | SLPS_256.29 1030 | SCKA_200.70 1031 | XEBP_100.64 1032 | SCUS_971.40 1033 | SCUS_972.01 1034 | SCUS_974.16 1035 | XEBP_100.65 1036 | SLUS_204.59 1037 | SCES_514.28 1038 | SLPM_652.00 1039 | SLKA_250.21 1040 | SLUS_208.10 1041 | SLES_522.38 1042 | SLPM_654.47 1043 | SLKA_251.35 1044 | XEBP_100.66 1045 | SLUS_211.65 1046 | SCAJ_201.08 1047 | SCPS_150.58 1048 | SCUS_972.31 1049 | SCAJ_200.19 1050 | SCAJ_200.38 1051 | SCES_519.10 1052 | SLES_519.10 1053 | SCCS_400.07 1054 | PAPX_902.30 1055 | PCPX_963.30 1056 | XEBP_100.67 1057 | SCES_541.53 1058 | SLES_541.53 1059 | SLPM_664.42 1060 | SCES_541.51 1061 | SLES_541.51 1062 | XEBP_100.68 1063 | SLES_544.60 1064 | SLES_545.69 1065 | XEBP_100.69 1066 | SLPS_204.41 1067 | SLPS_204.66 1068 | XEBP_100.70 1069 | SCES_533.98 1070 | SLES_533.98 1071 | SCES_544.61 1072 | SLES_544.61 1073 | XEBP_100.71 1074 | SLPM_625.25 1075 | SLKA_150.45 1076 | SLPM_626.38 1077 | -------------------------------------------------------------------------------- /Sync-App-Source/Publish-Release.ps1: -------------------------------------------------------------------------------- 1 | 2 | $ReleaseVersion = (Get-Content -Path ".\UDPBD-for-XEB+-GUI\UDPBD-for-XEB+-GUI.csproj" | Select-String -Pattern AssemblyVersion).ToString().Trim() -replace "<[^>]+>" 3 | $ReleaseFolder = ".\UDPBD-for-XEB+-GUI\bin\Release\net8.0-windows\publish\release-$ReleaseVersion" 4 | 5 | dotnet publish ".\UDPBD-for-XEB+-CLI.sln" 6 | dotnet publish ".\UDPBD-for-XEB+-GUI.sln" 7 | 8 | New-Item -ItemType Directory -Path "$ReleaseFolder\UDPBD-for-XEB+ Sync App" 9 | 10 | Get-ChildItem -File -Path ".\UDPBD-for-XEB+-CLI\bin\Release\net8.0\publish\*" | Move-Item -Destination "$ReleaseFolder\UDPBD-for-XEB+ Sync App" 11 | Get-ChildItem -File -Path ".\UDPBD-for-XEB+-GUI\bin\Release\net8.0-windows\publish\*" | Move-Item -Destination "$ReleaseFolder\UDPBD-for-XEB+ Sync App" 12 | 13 | if (Test-Path -Path "C:\msys64\usr\bin\bash.exe" -PathType Leaf) 14 | { 15 | # Preserve the current working directory 16 | $env:CHERE_INVOKING = "yes" 17 | # Start a 64 bit Mingw environment 18 | $env:MSYSTEM = "UCRT64" 19 | # Run for the first time 20 | & "C:\msys64\usr\bin\bash" "-lc" " " 21 | # Update MSYS2 Core (in case any core packages are outdated) 22 | & "C:\msys64\usr\bin\bash" "-lc" "pacman --noconfirm -Syuu" 23 | 24 | & "C:\msys64\usr\bin\bash.exe" "-lc" "bash ./Build-udpbd-vexfat-MSYS2.sh" 25 | # TODO FIX - Build From 2025-4-14 fails to work with VMCs, revert to build from 2023-3-8 26 | # Disable automatic build 27 | # & "C:\msys64\usr\bin\bash.exe" "-lc" "bash ./Build-udpbd-server-MSYS2.sh" 28 | } 29 | 30 | if (Test-Path -Path ".\udpbd-vexfat\target\x86_64-pc-windows-gnu\release\udpbd-vexfat.exe" -PathType Leaf) 31 | { 32 | Copy-Item -Path ".\udpbd-vexfat\target\x86_64-pc-windows-gnu\release\udpbd-vexfat.exe" -Destination ".\Needed-for-Release\udpbd-vexfat.exe" 33 | } 34 | if (Test-Path -Path ".\udpbd-server\udpbd-server.exe" -PathType Leaf) 35 | { 36 | Copy-Item -Path ".\udpbd-server\udpbd-server.exe" -Destination ".\Needed-for-Release\udpbd-server.exe" 37 | } 38 | 39 | Copy-Item -Path ".\Needed-for-Release\*" -Exclude *.txt -Destination "$ReleaseFolder\UDPBD-for-XEB+ Sync App" 40 | Copy-Item -Path ".\Needed-for-Release\*" -Include *.txt -Destination $ReleaseFolder 41 | Copy-Item -Path "..\List Builder" -Destination $ReleaseFolder -Recurse 42 | 43 | New-Item -ItemType Directory -Path "$ReleaseFolder\XEBPLUS" 44 | 45 | Copy-Item -Path "..\XEBPLUS\APPS" -Destination "$ReleaseFolder\XEBPLUS" -Recurse 46 | Copy-Item -Path "..\XEBPLUS\PLG" -Destination "$ReleaseFolder\XEBPLUS" -Recurse 47 | 48 | Compress-Archive -Path "$ReleaseFolder\*" -DestinationPath ".\UDPBD-for-XEBP-v$ReleaseVersion.zip" -Force 49 | 50 | Remove-Item -Path ".\UDPBD-for-XEB+-CLI\bin\Release" -Recurse 51 | Remove-Item -Path ".\UDPBD-for-XEB+-GUI\bin\Release" -Recurse 52 | 53 | 54 | -------------------------------------------------------------------------------- /Sync-App-Source/UDPBD-for-XEB+-CLI.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.11.35327.3 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UDPBD-for-XEB+-CLI", "UDPBD-for-XEB+-CLI\UDPBD-for-XEB+-CLI.csproj", "{DC3BC0A5-95B9-46A9-BF17-02C6B3CA85B6}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {DC3BC0A5-95B9-46A9-BF17-02C6B3CA85B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {DC3BC0A5-95B9-46A9-BF17-02C6B3CA85B6}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {DC3BC0A5-95B9-46A9-BF17-02C6B3CA85B6}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {DC3BC0A5-95B9-46A9-BF17-02C6B3CA85B6}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {92E1E18D-5890-47E1-9205-A242923B609A} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /Sync-App-Source/UDPBD-for-XEB+-CLI/CDBin.cs: -------------------------------------------------------------------------------- 1 | namespace UDPBD_for_XEB__CLI 2 | { 3 | internal class CDBin 4 | { 5 | public static string ScanBin(FileStream fileIn) 6 | { 7 | byte[] CDROMHeaderReference = [0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00]; 8 | int sector_raw_size = 2352; 9 | 10 | int numSectors = (int)(fileIn.Length / sector_raw_size); 11 | for (int sectorIndex = 0; sectorIndex < numSectors; sectorIndex++) 12 | { 13 | fileIn.Position = sectorIndex * sector_raw_size; 14 | byte[] header = new byte[16]; 15 | fileIn.Read(header, 0, header.Length); 16 | if (header[0..12].SequenceEqual(CDROMHeaderReference)) return "data"; 17 | } 18 | return ""; 19 | } 20 | 21 | public static void GenerateISO(FileStream fileIn, string outputISO) 22 | { 23 | byte[] CDROMHeaderReference = [0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00]; 24 | int sector_raw_size = 2352; 25 | int sector_target_size = 2048; 26 | 27 | using FileStream fileOutISO = new(outputISO, FileMode.Create, FileAccess.Write); 28 | 29 | int numSectors = (int)(fileIn.Length / sector_raw_size); 30 | int sector_offset = 0; 31 | for (int sectorIndex = 0; sectorIndex < numSectors; sectorIndex++) 32 | { 33 | fileIn.Position = sectorIndex * sector_raw_size; 34 | byte[] header = new byte[16]; 35 | fileIn.Read(header, 0, header.Length); 36 | if (header[0..12].SequenceEqual(CDROMHeaderReference)) 37 | { 38 | int mode = header[15]; 39 | if (mode == 1) sector_offset = 16; 40 | else if (mode == 2) sector_offset = 24; 41 | else Console.WriteLine($"Unable to decode the file header for {fileIn.Name}"); 42 | 43 | fileIn.Position = sectorIndex * sector_raw_size + sector_offset; 44 | byte[] dataOut = new byte[sector_target_size]; 45 | fileIn.Read(dataOut, 0, dataOut.Length); 46 | fileOutISO.Write(dataOut, 0, dataOut.Length); 47 | } 48 | } 49 | } 50 | 51 | public static void ConvertBin(string inputBin) 52 | { 53 | using FileStream fileIn = new(inputBin, FileMode.Open, FileAccess.Read); 54 | 55 | string outputFile = $"{Path.GetDirectoryName(fileIn.Name)}/{Path.GetFileNameWithoutExtension(fileIn.Name)}.iso"; 56 | 57 | if (ValidateBin(fileIn) != true || File.Exists(outputFile)) return; 58 | if (ScanBin(fileIn).Contains("data")) 59 | { 60 | GenerateISO(fileIn, outputFile); 61 | Console.WriteLine($"{Path.GetFileName(outputFile)} was created."); 62 | } 63 | return; 64 | } 65 | 66 | public static bool ValidateBin(FileStream fileIn) 67 | { 68 | if (fileIn.Length == 0 || fileIn.Length % 2352 != 0) 69 | { 70 | Console.WriteLine($"{Path.GetFileName(fileIn.Name)} is unreadable,\nthe length should be divisible by 2352 (0x930) bytes."); 71 | return false; 72 | } 73 | return true; 74 | } 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /Sync-App-Source/UDPBD-for-XEB+-CLI/FTP.cs: -------------------------------------------------------------------------------- 1 | using System.Net; 2 | using System.Net.NetworkInformation; 3 | using FluentFTP; 4 | 5 | namespace UDPBD_for_XEB__CLI 6 | { 7 | internal class FTP 8 | { 9 | public static bool TestConnection(FtpClient client, IPAddress ps2ip) 10 | { 11 | try 12 | { 13 | Ping pingSender = new(); 14 | PingReply reply = pingSender.Send(ps2ip, 6000); 15 | if (!(reply.Status == IPStatus.Success)) 16 | { 17 | Console.WriteLine($"\nCONNECTION FAILED\n\nFailed to receive a ping reply:\nPlease verify that your network settings are configured properly and all cables are connected.\nTry adjusting the IP address settings in launchELF.\n{reply.Status}"); 18 | return false; 19 | } 20 | } 21 | catch (PingException ex) 22 | { 23 | Console.WriteLine($"\nCONNECTION FAILED\n\nThe network location cannot be reached:\nPlease verify that your network settings are configured properly and all cables are connected.\nTry manually assigning an IPv4 address and subnet mask to this PC.\n{ex.Message}"); 24 | return false; 25 | } 26 | try 27 | { 28 | client.Connect(); 29 | Thread.Sleep(200); 30 | client.GetListing(); 31 | Thread.Sleep(200); 32 | Console.WriteLine("Connected to the PS2's FTP server Successfully!"); 33 | return true; 34 | } 35 | catch (Exception ex) 36 | { 37 | client.Disconnect(); 38 | Console.WriteLine($"\nCONNECTION FAILED\n\nFailed to connect to the PS2's FTP server.\n{ex.Message}"); 39 | return false; 40 | } 41 | } 42 | 43 | public static void CreateDirectory(FtpClient client, string directoryPath) 44 | { 45 | try 46 | { 47 | client.CreateDirectory(directoryPath); 48 | Thread.Sleep(200); 49 | if (!DirectoryExists(client, directoryPath)) 50 | { 51 | Console.WriteLine($"Failed to create the directory {directoryPath} on the PS2 via FTP.\nNo exceptions raised."); 52 | client.Disconnect(); 53 | Program.PauseExit(11); 54 | } 55 | } 56 | catch (Exception ex) 57 | { 58 | Console.WriteLine($"Failed to create the directory {directoryPath} on the PS2 via FTP.\n{ex.Message}"); 59 | client.Disconnect(); 60 | Program.PauseExit(12); 61 | } 62 | } 63 | 64 | public static bool DirectoryExists(FtpClient client, string directoryPath) 65 | { 66 | try 67 | { 68 | client.GetListing(directoryPath); 69 | Thread.Sleep(200); 70 | return true; 71 | } 72 | catch 73 | { 74 | return false; 75 | } 76 | } 77 | 78 | public static void UploadFile(FtpClient client, string filePath, string ftpPath, string targetFile) 79 | { 80 | try 81 | { 82 | client.UploadFile(filePath, ftpPath + targetFile); 83 | Thread.Sleep(200); 84 | if (!FileExists(client, ftpPath, targetFile)) 85 | { 86 | Console.WriteLine($"Failed to upload file {filePath} to the PS2 via FTP.\nNo exceptions raised."); 87 | client.Disconnect(); 88 | Program.PauseExit(13); 89 | } 90 | } 91 | catch (Exception ex) 92 | { 93 | Console.WriteLine($"Failed to upload file {filePath} to the PS2 via FTP.\n{ex.Message}\n{ex.InnerException}"); 94 | client.Disconnect(); 95 | Program.PauseExit(14); 96 | } 97 | } 98 | 99 | public static string GetDir(FtpClient client, string ftpPath) 100 | { 101 | try 102 | { 103 | string returnList = ""; 104 | var ftpList = client.GetListing(ftpPath); 105 | Thread.Sleep(200); 106 | foreach (var item in ftpList) 107 | { 108 | returnList += $" {item.Name} "; 109 | } 110 | return returnList; 111 | } 112 | catch 113 | { 114 | return ""; 115 | } 116 | } 117 | 118 | public static bool FileExists(FtpClient client, string ftpPath, string ftpFile) 119 | { 120 | try 121 | { 122 | var files = client.GetListing(ftpPath); 123 | Thread.Sleep(200); 124 | foreach (var file in files) 125 | { 126 | if (file.Name.Contains(ftpFile)) 127 | { 128 | return true; 129 | } 130 | } 131 | return false; 132 | } 133 | catch 134 | { 135 | return false; 136 | } 137 | } 138 | } 139 | } 140 | -------------------------------------------------------------------------------- /Sync-App-Source/UDPBD-for-XEB+-CLI/Program.cs: -------------------------------------------------------------------------------- 1 | using System.Diagnostics; 2 | using System.Net; 3 | using System.Reflection; 4 | using System.Security.Cryptography; 5 | using System.Text; 6 | using System.Text.RegularExpressions; 7 | using DiscUtils.Iso9660; 8 | using FluentFTP; 9 | 10 | namespace UDPBD_for_XEB__CLI 11 | { 12 | internal partial class Program 13 | { 14 | static async Task Main(string[] args) 15 | { 16 | Console.WriteLine($"UDPBD for XEB+ CLI Sync App {Assembly.GetExecutingAssembly().GetName().Version} by MegaBitmap"); 17 | 18 | string gamePath = ""; 19 | IPAddress ps2ip = IPAddress.Parse("192.168.0.10"); 20 | bool enableArt = false; 21 | bool enableBin2ISO = false; 22 | bool enableVMC = false; 23 | 24 | if (args.Length < 2 || !args.Contains("-path")) 25 | { 26 | PrintHelp(); 27 | PauseExit(0); 28 | } 29 | int argIndex = 0; 30 | foreach (var arg in args) 31 | { 32 | if (arg.Contains("-path")) 33 | { 34 | gamePath = args[argIndex + 1]; 35 | } 36 | else if (arg.Contains("-ps2ip")) 37 | { 38 | ps2ip = IPAddress.Parse(args[argIndex + 1]); 39 | } 40 | else if (arg.Contains("-downloadart")) 41 | { 42 | enableArt = true; 43 | } 44 | else if (arg.Contains("-bin2iso")) 45 | { 46 | enableBin2ISO = true; 47 | } 48 | else if (arg.Contains("-enablevmc")) 49 | { 50 | enableVMC = true; 51 | } 52 | argIndex++; 53 | } 54 | if (!File.Exists("bsd-udpbd.toml")) 55 | { 56 | Console.WriteLine("Missing file bsd-udpbd.toml"); 57 | PauseExit(1); 58 | } 59 | if (!KillServer()) 60 | { 61 | PauseExit(2); 62 | } 63 | if (!Path.Exists(gamePath)) 64 | { 65 | Console.WriteLine("The path does not exist."); 66 | PauseExit(3); 67 | } 68 | if (!Path.Exists($"{gamePath}/CD") && !Path.Exists($"{gamePath}/DVD")) 69 | { 70 | Console.WriteLine($"There must be a DVD or CD folder inside '{gamePath}'."); 71 | PauseExit(4); 72 | } 73 | if (enableBin2ISO) 74 | { 75 | BinConvertFolder(gamePath); 76 | } 77 | List gameList = ScanFolder(gamePath); 78 | if (gameList.Count < 1) 79 | { 80 | Console.WriteLine($"No games found in {gamePath}/CD or {gamePath}/DVD"); 81 | PauseExit(5); 82 | } 83 | Console.WriteLine($"{gameList.Count} games loaded"); 84 | CreateGameList(gamePath, gameList); 85 | 86 | FtpClient client = new(ps2ip.ToString()); 87 | 88 | if (!FTP.TestConnection(client, ps2ip)) 89 | { 90 | PauseExit(6); 91 | } 92 | if (!FTP.DirectoryExists(client, "/mass/0/XEBPLUS/CFG/")) 93 | { 94 | Console.WriteLine($"Unable to detect XtremeEliteBoot+ on the PS2's USB flash drive."); 95 | PauseExit(7); 96 | } 97 | if (!FTP.DirectoryExists(client, "/mass/0/XEBPLUS/APPS/neutrinoLauncher/config")) 98 | { 99 | Console.WriteLine($"Unable to detect the neutrino launcher plugin on the PS2's USB flash drive."); 100 | PauseExit(8); 101 | } 102 | if (!FTP.DirectoryExists(client, "/mass/0/XEBPLUS/CFG/neutrinoLauncher/")) 103 | { 104 | FTP.CreateDirectory(client, "/mass/0/XEBPLUS/CFG/neutrinoLauncher/"); 105 | Console.WriteLine("Created the folder mass:/XEBPLUS/CFG/neutrinoLauncher/"); 106 | } 107 | UpdateUDPConfig(client, ps2ip); 108 | if (enableArt) 109 | { 110 | if (File.Exists("ArtworkURL.cfg")) 111 | { 112 | string artUrl = File.ReadLines("ArtworkURL.cfg").First(); 113 | await DownloadArtList(gamePath, gameList, client, artUrl); 114 | } 115 | else Console.WriteLine("Missing the file ArtworkURL.cfg"); 116 | } 117 | if (enableVMC) 118 | { 119 | if (SyncVMC(gamePath, gameList)) 120 | { 121 | Console.WriteLine("Virtual Memory Cards are now enabled."); 122 | } 123 | else Console.WriteLine("Virtual Memory Cards are now disabled."); 124 | } 125 | else Console.WriteLine("Virtual Memory Cards are now disabled."); 126 | ValidateList(); 127 | FTP.UploadFile(client, "tempNeutrinoUDPBDList.txt", "/mass/0/XEBPLUS/CFG/neutrinoLauncher/", "neutrinoUDPBD.list"); 128 | Console.WriteLine("Updated game list at mass:/XEBPLUS/CFG/neutrinoLauncher/neutrinoUDPBD.list"); 129 | client.Disconnect(); 130 | Console.WriteLine(@" ________ ___ ___ ________ ________ _______ ________ 131 | |\ ____\ |\ \ / /|\ ___ \|\ ____\|\ ___ \ |\ ___ \ 132 | \ \ \___|_ \ \ \/ / | \ \\ \ \ \ \___|\ \ __/|\ \ \_|\ \ 133 | \ \_____ \ \ \ / / \ \ \\ \ \ \ \ \ \ \_|/_\ \ \ \\ \ 134 | \|____|\ \ \/ / / \ \ \\ \ \ \ \____\ \ \_|\ \ \ \_\\ \ 135 | ____\_\ \ __/ / / \ \__\\ \__\ \_______\ \_______\ \_______\ 136 | |\_________\\___/ / \|__| \|__|\|_______|\|_______|\|_______| 137 | \|_________\|___|/"); 138 | Console.WriteLine("Synchronization with the PS2 is now complete!"); 139 | Console.WriteLine("Please make sure to start the server before launching a game."); 140 | PauseExit(10); 141 | } 142 | 143 | static void PrintHelp() 144 | { 145 | Console.WriteLine("Usage Example:\n"); 146 | Console.WriteLine(@"dotnet UDPBD-for-XEB+-CLI.dll -path 'C:\PS2\' -ps2ip 192.168.0.10" + "\n"); 147 | Console.WriteLine("-path is the file path to the CD and DVD folder that contain game ISOs.\n"); 148 | Console.WriteLine("-ps2ip is the ip address for connecting to the PS2 with PS2Net.\n"); 149 | Console.WriteLine("-downloadart enables automatic game artwork downloading.\n"); 150 | Console.WriteLine("-bin2iso enables automatic CD-ROM Bin to ISO conversion.\n"); 151 | Console.WriteLine("-enablevmc will assign a virtual memory card for each game or group of games in 'vmc_groups.list'.\n"); 152 | } 153 | 154 | static void ValidateList() 155 | { 156 | string combinedList = File.ReadAllText("tempNeutrinoUDPBDList.txt"); 157 | if (combinedList.Length < 50) 158 | { 159 | Console.WriteLine("Failed to save game list to tempNeutrinoUDPBDList.txt"); 160 | Console.WriteLine("The sync was not able to be completed."); 161 | PauseExit(9); 162 | } 163 | } 164 | 165 | static List ScanFolder(string scanPath) 166 | { 167 | List tempList = []; 168 | string[] scanFolders = [$"{scanPath}/CD", $"{scanPath}/DVD"]; 169 | foreach (var folder in scanFolders) 170 | { 171 | if (Directory.Exists(folder)) 172 | { 173 | string[] ISOFiles = Directory.GetFiles(folder, "*.iso", SearchOption.TopDirectoryOnly); 174 | foreach (string file in ISOFiles) 175 | { 176 | tempList.Add(file.Replace(scanPath, "").Replace(@"\", "/")); 177 | } 178 | } 179 | } 180 | return tempList; 181 | } 182 | 183 | static void CreateGameList(string gamePath, List gameList) 184 | { 185 | List gameListWithID = []; 186 | foreach (var game in gameList) 187 | { 188 | string serialGameID = GetSerialID(gamePath + game); 189 | if (!string.IsNullOrEmpty(serialGameID)) 190 | { 191 | gameListWithID.Add($"{serialGameID} {game}"); 192 | Console.WriteLine($"Loaded {game}"); 193 | } 194 | else 195 | { 196 | Console.WriteLine($"Unable to find a serial Game ID for {game}"); 197 | } 198 | } 199 | string hash = ComputeMD5(string.Join("\n", gameListWithID)); 200 | gameListWithID.Add(hash); 201 | File.WriteAllLines("tempNeutrinoUDPBDList.txt", gameListWithID); 202 | Thread.Sleep(200); 203 | } 204 | 205 | static void BinConvertFolder(string scanPath) 206 | { 207 | string[] scanFolders = [$"{scanPath}/CD", $"{scanPath}/DVD"]; 208 | foreach (var folder in scanFolders) 209 | { 210 | if (Directory.Exists(folder)) 211 | { 212 | string[] binFiles = Directory.GetFiles(folder, "*.bin", SearchOption.TopDirectoryOnly); 213 | foreach (string binFile in binFiles) 214 | { 215 | if (CheckSpace(binFile, folder)) 216 | { 217 | CDBin.ConvertBin(binFile); 218 | } 219 | else 220 | { 221 | Console.WriteLine($"There is not enough space to convert {binFile} to ISO."); 222 | } 223 | } 224 | } 225 | } 226 | } 227 | 228 | static async Task DownloadArtList(string gamePath, List gameList, FtpClient client, string artUrl) 229 | { 230 | Console.WriteLine("Checking for Game Artwork . . ."); 231 | int failCount = 0; 232 | var artList = FTP.GetDir(client, "/mass/0/XEBPLUS/GME/ART/"); 233 | foreach (var game in gameList) 234 | { 235 | string serialID = GetSerialID(gamePath + game); 236 | if (string.IsNullOrEmpty(serialID)) continue; 237 | if (!artList.Contains($"{serialID}_BG.png")) 238 | { 239 | if (await GetArtBG(artUrl, serialID, game)) 240 | { 241 | FTP.UploadFile(client, "temp_BG.png", "/mass/0/XEBPLUS/GME/ART/", $"{serialID}_BG.png"); 242 | Console.WriteLine($"Downloaded Background Artwork for {game}"); 243 | failCount = 0; 244 | } 245 | else failCount++; 246 | } 247 | if (!artList.Contains($"{serialID}_ICO.png")) 248 | { 249 | if (await GetArtICO(artUrl, serialID, game)) 250 | { 251 | FTP.UploadFile(client, "temp_ICO.png", "/mass/0/XEBPLUS/GME/ART/", $"{serialID}_ICO.png"); 252 | Console.WriteLine($"Downloaded Disc Artwork for {game}"); 253 | failCount = 0; 254 | } 255 | else failCount++; 256 | } 257 | if (failCount > 4) 258 | { 259 | Console.WriteLine("Automatic Artwork Download has been skipped as it has failed 5 times."); 260 | return; 261 | } 262 | } 263 | } 264 | 265 | static async Task GetArtBG(string artUrl, string serialID, string gameName) 266 | { 267 | try 268 | { 269 | using HttpClient client = new(); 270 | byte[] fileDownload = await client.GetByteArrayAsync(new Uri(artUrl.Replace("SERIALID", serialID) + "_BG_00.png")); 271 | File.WriteAllBytes("temp_BG.png", fileDownload); 272 | Thread.Sleep(200); 273 | if (File.Exists("temp_BG.png")) return true; 274 | Console.WriteLine($"Failed to download artwork for {gameName} {serialID}.\nThe downloaded png image is missing."); 275 | return false; 276 | } 277 | catch (Exception ex) 278 | { 279 | Console.WriteLine($"Failed to download background artwork for {gameName} {serialID}.\n{artUrl.Replace("SERIALID", serialID)}_BG.png\n{ex.Message}"); 280 | return false; 281 | } 282 | } 283 | 284 | static async Task GetArtICO(string artUrl, string serialID, string gameName) 285 | { 286 | try 287 | { 288 | using HttpClient client = new(); 289 | byte[] fileDownload = await client.GetByteArrayAsync(new Uri(artUrl.Replace("SERIALID", serialID) + "_ICO.png")); 290 | File.WriteAllBytes("temp_ICO.png", fileDownload); 291 | Thread.Sleep(200); 292 | if (File.Exists("temp_ICO.png")) return true; 293 | Console.WriteLine($"Failed to download artwork for {gameName} {serialID}.\nThe downloaded png image is missing."); 294 | return false; 295 | } 296 | catch (Exception ex) 297 | { 298 | Console.WriteLine($"Failed to download disc artwork for {gameName} {serialID}.\n{artUrl.Replace("SERIALID", serialID)}_ICO.png\n{ex.Message}"); 299 | return false; 300 | } 301 | } 302 | 303 | static bool SyncVMC(string gamePath, List gameList) 304 | { 305 | List gameListVMC = []; 306 | if (!Path.Exists($"{gamePath}/VMC")) 307 | { 308 | Directory.CreateDirectory($"{gamePath}/VMC"); 309 | } 310 | string[] neededFiles = ["vmc_groups.list", "BlankVMC8.bin", "BlankVMC32.bin"]; 311 | foreach (string file in neededFiles) 312 | { 313 | if (!File.Exists(file)) 314 | { 315 | Console.WriteLine($"Missing file {file}"); 316 | return false; 317 | } 318 | } 319 | string[] groupsVMC = File.ReadAllLines("vmc_groups.list"); 320 | string crossSaveIDs = string.Join("", groupsVMC); 321 | foreach (var game in gameList) 322 | { 323 | string serialID = GetSerialID(gamePath + game); 324 | if (string.IsNullOrEmpty(serialID)) 325 | { 326 | Console.WriteLine($"Failed to get serial ID for {gamePath + game}"); 327 | continue; 328 | } 329 | string vmcRelativePath; 330 | string vmcFullPath; 331 | int currentVmcSize = 8; 332 | if (crossSaveIDs.Contains(serialID)) 333 | { 334 | string vmcFile = ""; 335 | bool checkSize = false; 336 | string currentGroup = ""; 337 | 338 | foreach (string line in groupsVMC) 339 | { 340 | if (checkSize) 341 | { 342 | checkSize = false; 343 | if (line == "32") currentVmcSize = 32; 344 | else currentVmcSize = 8; 345 | } 346 | if (line.Contains("XEBP")) 347 | { 348 | currentGroup = line; 349 | checkSize = true; 350 | } 351 | else if (line == serialID && !string.IsNullOrEmpty(currentGroup)) 352 | { 353 | vmcFile = $"{currentGroup}_0.bin"; 354 | break; 355 | } 356 | } 357 | if (string.IsNullOrEmpty(vmcFile)) 358 | { 359 | Console.Write($"Failed to find a group for {serialID}"); 360 | return false; 361 | } 362 | vmcRelativePath = $"/VMC/{vmcFile}"; 363 | vmcFullPath = $"{gamePath}{vmcRelativePath}"; 364 | } 365 | else 366 | { 367 | vmcRelativePath = $"/VMC/{serialID}_0.bin"; 368 | vmcFullPath = $"{gamePath}{vmcRelativePath}"; 369 | } 370 | gameListVMC.Add($"{serialID} {game} {vmcRelativePath}"); 371 | if (!File.Exists(vmcFullPath)) 372 | { 373 | if (CheckSpace($"BlankVMC{currentVmcSize}.bin", vmcFullPath)) 374 | { 375 | File.Copy($"BlankVMC{currentVmcSize}.bin", vmcFullPath); 376 | Thread.Sleep(200); 377 | Console.WriteLine($"Created {vmcRelativePath} for {game}"); 378 | } 379 | else 380 | { 381 | Console.WriteLine("Not enough space to create a new VMC file."); 382 | return false; 383 | } 384 | } 385 | } 386 | string hash = ComputeMD5(string.Join("\n", gameListVMC)); 387 | gameListVMC.Add(hash); 388 | File.WriteAllLines("tempNeutrinoUDPBDList.txt", gameListVMC); 389 | Thread.Sleep(200); 390 | return true; 391 | } 392 | 393 | static bool CheckSpace(string source, string destination) 394 | { 395 | FileInfo fileInfo = new(source); 396 | long fileSize = fileInfo.Length; 397 | string? dest = Path.GetPathRoot(destination); 398 | if (dest == null) return false; 399 | DriveInfo driveInfo = new(dest); 400 | long availableSpace = driveInfo.AvailableFreeSpace; 401 | if (availableSpace > fileSize) 402 | { 403 | return true; 404 | } 405 | else 406 | { 407 | return false; 408 | } 409 | } 410 | 411 | static void UpdateUDPConfig(FtpClient client, IPAddress ps2ip) 412 | { 413 | string udpConf = File.ReadAllText("bsd-udpbd.toml").Replace("192.168.1.10", $"{ps2ip}"); 414 | File.WriteAllText("tempbsd-udpbd.toml", udpConf); 415 | Thread.Sleep(200); 416 | FTP.UploadFile(client, "tempbsd-udpbd.toml", "/mass/0/XEBPLUS/APPS/neutrinoLauncher/config/", "bsd-udpbd.toml"); 417 | Console.WriteLine($"Updated bsd-udpbd.toml with the IP address {ps2ip}"); 418 | } 419 | 420 | static string GetSerialID(string fullGamePath) 421 | { 422 | try 423 | { 424 | string content; 425 | using (FileStream isoStream = File.Open(fullGamePath, FileMode.Open)) 426 | { 427 | CDReader cd = new(isoStream, true); 428 | if (!cd.FileExists(@"SYSTEM.CNF")) 429 | { 430 | Console.WriteLine($"{fullGamePath} Is not a valid PS2 game ISO. The SYSTEM.CNF file is missing."); 431 | return ""; 432 | } 433 | using Stream fileStream = cd.OpenFile(@"SYSTEM.CNF", FileMode.Open); 434 | using StreamReader reader = new(fileStream); 435 | content = reader.ReadToEnd(); 436 | } 437 | if (!content.Contains("BOOT2")) 438 | { 439 | Console.WriteLine($"{fullGamePath} Is not a valid PS2 game ISO.\nThe SYSTEM.CNF file does not contain BOOT2."); 440 | return ""; 441 | } 442 | string serialID = SerialMask().Replace(content.Split("\n")[0], ""); 443 | return serialID; 444 | } 445 | catch (Exception) 446 | { 447 | Console.WriteLine($"{fullGamePath} was unable to be read. The ISO file may be corrupt."); 448 | return ""; 449 | } 450 | } 451 | 452 | static string ComputeMD5(string input) 453 | { 454 | byte[] inputBytes = Encoding.UTF8.GetBytes(input); 455 | byte[] hashBytes = MD5.HashData(inputBytes); 456 | 457 | // Convert the byte array to a hexadecimal string 458 | StringBuilder sb = new(); 459 | for (int i = 0; i < hashBytes.Length; i++) 460 | { 461 | sb.Append(hashBytes[i].ToString("X2")); 462 | } 463 | return sb.ToString().ToLowerInvariant(); 464 | } 465 | 466 | static bool KillServer() 467 | { 468 | string[] serverNames = ["udpbd-server", "udpbd-vexfat"]; 469 | foreach (var server in serverNames) 470 | { 471 | Process[] processes = Process.GetProcessesByName(server); 472 | if (!(processes.Length == 0)) 473 | { 474 | Console.Write("The server is currently running, do you want to stop the server and sync? (y/n): "); 475 | char response = Console.ReadKey().KeyChar; 476 | Console.WriteLine(); 477 | if (response == 'y' || response == 'Y') 478 | { 479 | foreach (var item in processes) item.Kill(); 480 | return true; 481 | } 482 | else return false; 483 | } 484 | } 485 | return true; 486 | } 487 | 488 | public static void PauseExit(int number) 489 | { 490 | Console.Write("Press any key to continue . . . "); 491 | Console.ReadKey(); 492 | Console.WriteLine(); 493 | Environment.Exit(number); 494 | } 495 | 496 | [GeneratedRegex(@".*\\|;.*")] 497 | private static partial Regex SerialMask(); 498 | } 499 | } 500 | -------------------------------------------------------------------------------- /Sync-App-Source/UDPBD-for-XEB+-CLI/UDPBD-for-XEB+-CLI.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Exe 5 | net8.0 6 | UDPBD_for_XEB__CLI 7 | enable 8 | enable 9 | 2.8.4.2 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /Sync-App-Source/UDPBD-for-XEB+-GUI.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.11.35327.3 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UDPBD-for-XEB+-GUI", "UDPBD-for-XEB+-GUI\UDPBD-for-XEB+-GUI.csproj", "{E1A8C382-3582-4FF9-B3D1-E701DAF13278}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {E1A8C382-3582-4FF9-B3D1-E701DAF13278}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {E1A8C382-3582-4FF9-B3D1-E701DAF13278}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {E1A8C382-3582-4FF9-B3D1-E701DAF13278}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {E1A8C382-3582-4FF9-B3D1-E701DAF13278}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {1C9D8729-2C5C-4768-9636-844213C10C90} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /Sync-App-Source/UDPBD-for-XEB+-GUI/AboutWindow.xaml: -------------------------------------------------------------------------------- 1 |  9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Sync-App-Source/UDPBD-for-XEB+-GUI/AboutWindow.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Windows; 2 | 3 | namespace UDPBD_for_XEB__GUI 4 | { 5 | public partial class AboutWindow : Window 6 | { 7 | public AboutWindow(Window parentWindow) 8 | { 9 | Owner = parentWindow; 10 | InitializeComponent(); 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Sync-App-Source/UDPBD-for-XEB+-GUI/App.xaml: -------------------------------------------------------------------------------- 1 |  6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /Sync-App-Source/UDPBD-for-XEB+-GUI/App.xaml.cs: -------------------------------------------------------------------------------- 1 | using System.Windows; 2 | 3 | namespace UDPBD_for_XEB__GUI 4 | { 5 | /// 6 | /// Interaction logic for App.xaml 7 | /// 8 | public partial class App : Application 9 | { 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /Sync-App-Source/UDPBD-for-XEB+-GUI/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Windows; 2 | 3 | [assembly: ThemeInfo( 4 | ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located 5 | //(used if a resource is not found in the page, 6 | // or application resource dictionaries) 7 | ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located 8 | //(used if a resource is not found in the page, 9 | // app, or any theme specific resource dictionaries) 10 | )] 11 | -------------------------------------------------------------------------------- /Sync-App-Source/UDPBD-for-XEB+-GUI/MainWindow.xaml: -------------------------------------------------------------------------------- 1 |  9 | 10 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 |