├── README.md ├── images ├── danhans_response.pdf ├── danhans_sorry.pdf ├── litemenu_gamelist.jpg ├── litemenu_logo.png ├── litemenu_logoscreen.png ├── litemenu_sysinfo.jpg ├── shadow_message1.PNG ├── shadow_message2.PNG └── shadow_message3.png └── lite_tool └── litetool.py /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

4 | 5 | # Alternative Menu Software for PSIO and Compatibles 6 | 7 | Replacement menu software for PSIO devices. Open source, uses no libraries and can be built easily using modern tools, on modern operating systems. 8 | 9 | YouTuber I am not, but see here for some videos of it in action.. 10 | 11 | * [ [Cold boot - menu]](https://youtu.be/DdBWPib5Gmg) 12 | * [ [Demonstration of GameID Support]](https://youtube.com/shorts/OfLvMkrLHMU) 13 | * [ [Early video of progress]](https://youtu.be/D4ScWW8lv1w) 14 | 15 | ## Introduction 16 | 17 | Litemenu is a lightweight replacement for the standard menu software shipped with these devices. Latest update has been teased for years now, with the devices creator making promise after promise with nothing delivered. This took a turn for the worst recently, with the creator deleting the forums and restricting access to the official discord server. Feels like someone wants to rewrite history lol. Absolute shame for the customers of PSIO and totally unfair. 18 | 19 | Anyway yeah - original software is slow to boot, has no development features at all, doesnt broadcast gameid and did I already say its slow? 20 | 21 | No idea on the actual size of the official software - its a highly polished affair with music, graphics and some 3D spinning models. Unfortunately it has been reported to be using Sony code (PsyQ libraries etc). 22 | Litemenu on the otherhand uses no official Sony libs, hell it barely uses a development kit. It can be built easily using modern tools. 23 | 24 | ## Installing 25 | 26 | Delete the existing MENU.SYS file from your SDcard, grab the latest release and copy MENU.SYS to the root of your SD card. 27 | Instructions for building from source will be added shortly. 28 | 29 | ## Litetool 30 | 31 | Litetool is the client for the serial server in litemenu. It lets you upload BIN/EXE files to your PSX as well as dumping memory. Like hitserial but a lot faster with a few more features. It runs at 1036800bps so its pretty nippy. See lite_tool folder for the client. 32 | 33 | ## Warning 34 | 35 | * DO NOT ATTEMPT TO MOUNT/USE THE ORIGINAL MENU.SYS USING LITEMENU - IT WILL NOT WORK AND IT WILL MAKE THE CART UPDATE ITSELF FROM SPI FLASH 36 | * DO NOT ATTEMPT TO MOUNT/USE THE ORIGINAL MENU.SYS USING LITEMENU - IT WILL NOT WORK AND IT WILL MAKE THE CART UPDATE ITSELF FROM SPI FLASH 37 | * DO NOT ATTEMPT TO MOUNT/USE THE ORIGINAL MENU.SYS USING LITEMENU - IT WILL NOT WORK AND IT WILL MAKE THE CART UPDATE ITSELF FROM SPI FLASH 38 | 39 | ## Screenshots 40 |

41 | 42 | 43 | 44 | 45 |

46 | 47 | ## Feature Comparison 48 | 49 | Feature|Standard Menu | Lite Menu | 50 | ------------|-----|----| 51 | noca$h unlock (boot CD-R)| nope | yup 52 | psx-exe/bin upload&download| nope | yup 53 | gameid broadcast|nope|yup 54 | alpha sort on gamelist |yup|nope 55 | game artwork | yup| nope 56 | open source |nope|yup 57 | time to boot | fuckin ages mate | 2-3 seconds 58 | fw version | any | works on anything 2018+ 59 | 60 | ## Features yet to be added/explored 61 | * Fast menu skipping/browsing 62 | * Alphabetical sort 63 | * Hide files in SDcard root 64 | * EXE loading from SDcard 65 | * MCPro/SD2PSX Channel Switching in Menu 66 | 67 | ## Release Schedule 68 | 69 | I recieved a (now deleted) comment on one of my videos from Matt (aka Shadow/Matt/Haunted etc) the proprietor of Cybdim. 70 | 71 | 72 |
73 | 74 | 75 | Kinda funny, I mean Matthew has done more than enough to absolutely rinse the reputation of both himself and his product but chooses to lash out like a petulant child. 76 | 77 | Anyway, the above was followed up quickly by an email (to my private email address) with the title "Cybdyn Systems - New Menu Cease and Desist". 78 | 79 |
80 | 81 | I replied to the above, probably completely unprofessionally, and then recieved another response. 82 | 83 | Basically I told Matt that if he releases the promised update by August 13th (2023), I will not release my software and will send him the source. Otherwise on 13th Litemenu will be released, along with source (here). Anyways, I hate drama - not sure on what direction to take. 84 | 85 | Please check back on August 13th for more information/update. 86 | 87 | ## UPDATE AUGUST 13TH 88 | 89 | Apologies - I messed up, my memory isnt what it used to be. 90 | 91 | [Cringe Video ](https://youtu.be/WuivS3zvkfs) 92 | 93 | I actually gave Matt until 14th August, not 13th - apologies. I am true to my word so update will be tomorrow. 94 | As a booby prize - please see below for my pissy response to Matts email, and his subsequent response. 95 | 96 | My response :- 97 | 98 | [danhans42 response](images/danhans_response.pdf) 99 | 100 | Matts Response :
101 | 102 | ## UPDATE AUGUST 14TH 103 | 104 | [danhans42 response](images/danhans_sorry.pdf) 105 | 106 | todaloo 107 | 108 | ## Shouts n Greets 109 | 110 | * Bigup to the all the lovely peeps over on psx.dev discord. (http://www.psx.dev/) 111 | * Noca$h/Grumpycoder for the docs (the MD version is really nice) (https://psx-spx.consoledev.net/) 112 | * Hitmen for releasing the source for hitserial all those years ago - http://hitmen.c02.at/ 113 | * 8bitmods for MemcardPRO - Great device! https://8bitmods.com/accessories/memcard-pro/ 114 | * xyz for SD2PSX - open source memory card solution - https://sd2psx.net/ 115 | * last and no means least - ps-iowned! https://github.com/ps-iowned/ps-iowned 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | -------------------------------------------------------------------------------- /images/danhans_response.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danhans42/lite_menu/0c640fc06272f7a203bb369c61e554a60103b206/images/danhans_response.pdf -------------------------------------------------------------------------------- /images/danhans_sorry.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danhans42/lite_menu/0c640fc06272f7a203bb369c61e554a60103b206/images/danhans_sorry.pdf -------------------------------------------------------------------------------- /images/litemenu_gamelist.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danhans42/lite_menu/0c640fc06272f7a203bb369c61e554a60103b206/images/litemenu_gamelist.jpg -------------------------------------------------------------------------------- /images/litemenu_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danhans42/lite_menu/0c640fc06272f7a203bb369c61e554a60103b206/images/litemenu_logo.png -------------------------------------------------------------------------------- /images/litemenu_logoscreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danhans42/lite_menu/0c640fc06272f7a203bb369c61e554a60103b206/images/litemenu_logoscreen.png -------------------------------------------------------------------------------- /images/litemenu_sysinfo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danhans42/lite_menu/0c640fc06272f7a203bb369c61e554a60103b206/images/litemenu_sysinfo.jpg -------------------------------------------------------------------------------- /images/shadow_message1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danhans42/lite_menu/0c640fc06272f7a203bb369c61e554a60103b206/images/shadow_message1.PNG -------------------------------------------------------------------------------- /images/shadow_message2.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danhans42/lite_menu/0c640fc06272f7a203bb369c61e554a60103b206/images/shadow_message2.PNG -------------------------------------------------------------------------------- /images/shadow_message3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/danhans42/lite_menu/0c640fc06272f7a203bb369c61e554a60103b206/images/shadow_message3.png -------------------------------------------------------------------------------- /lite_tool/litetool.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # litetool.py - simple upload tool for litemenu 3 | # Runs on Python 3.7 - requires the pyserial libaries to be installed 4 | 5 | 6 | import sys 7 | import serial 8 | import os 9 | import time 10 | from time import sleep 11 | 12 | args = int(len(sys.argv)) 13 | 14 | def usage(): 15 | sys.stdout.write("-h help (this screen)\n") 16 | sys.stdout.write("-exe upload & execute PSX-EXE\n") 17 | sys.stdout.write("-bin upload file to address\n") 18 | sys.stdout.write("-goto goto to \n") 19 | sys.stdout.write("-dump download data from PSX\n") 20 | sys.stdout.write("-reboot reboot attached PSX\n\n") 21 | sys.exit() 22 | 23 | def resetpsx(): 24 | serialport = sys.argv[2] 25 | sys.stdout.write("Port : ") 26 | sys.stdout.write(serialport) 27 | sys.stdout.write("\n") 28 | ser = serial.Serial(serialport,115200,writeTimeout = 1) 29 | ser.write(b'\x72') 30 | sys.stdout.write("Command : Reset PSX\n\n") 31 | sys.stdout.write("Operation Complete\n\n") 32 | 33 | def download(): 34 | serialport = sys.argv[2] 35 | file = sys.argv[3] 36 | addr = (int(sys.argv[4],16)).to_bytes(4, byteorder='little',signed=False) 37 | len = (int(sys.argv[5],16)).to_bytes(4, byteorder='little',signed=False) 38 | sys.stdout.write("Port : ") 39 | sys.stdout.write(serialport) 40 | sys.stdout.write("\nFilename : {}\n".format(file)) 41 | sys.stdout.write("Address : ") 42 | sys.stdout.write(hex(int(sys.argv[4],16))) 43 | sys.stdout.write("\n") 44 | sys.stdout.write("Length : ") 45 | sys.stdout.write(str(int(sys.argv[5],16))) 46 | sys.stdout.write(" bytes\n") 47 | sys.stdout.write("Command : Download data\n") 48 | ser = serial.Serial(serialport,1036800,writeTimeout = 1) 49 | dump = open(file,'wb') 50 | buffer = bytearray() 51 | ser.write(b'\x64') 52 | ser.write(addr) 53 | ser.write(len) 54 | sys.stdout.write("Reading Data...") 55 | sys.stdout.flush() 56 | buffer=ser.read(int(sys.argv[5],16)) 57 | sys.stdout.write(" Done!\n") 58 | sys.stdout.write("Operation Complete\n\n") 59 | dump.write(buffer) 60 | dump.close() 61 | 62 | def gotoaddr(): 63 | serialport = sys.argv[2] 64 | addr = (int(sys.argv[3],16)).to_bytes(4, byteorder='little',signed=False) 65 | sys.stdout.write("Port : ") 66 | sys.stdout.write(serialport) 67 | sys.stdout.write("\n") 68 | ser = serial.Serial(serialport,1036800,writeTimeout = 1) 69 | ser.write(b'\x65') 70 | sys.stdout.write("Command : Goto address ") 71 | sys.stdout.write(hex(int(sys.argv[3],16))) 72 | ser.write(addr) 73 | sys.stdout.write("\n\nOperation Complete\n\n") 74 | 75 | def uploadexe(): 76 | serialport = sys.argv[2] 77 | filename = sys.argv[3] 78 | filesize = os.path.getsize(filename) 79 | inputfile = open(filename, 'rb') 80 | inputfile.seek(0, 0) 81 | header = inputfile.read(2048) 82 | inputfile.seek(16,0) 83 | pc = inputfile.read(4) 84 | inputfile.seek(24,0) 85 | addr= inputfile.read(4) 86 | inputfile.seek(28,0) 87 | fsz = inputfile.read(4) 88 | sys.stdout.write("Port : ") 89 | sys.stdout.write(serialport) 90 | sys.stdout.write("\nEXE Name : {}\n".format(filename)) 91 | sys.stdout.write("File Size : {} bytes\n".format(filesize)) 92 | ser = serial.Serial(serialport,1036800,writeTimeout = 100) 93 | ser.write(b'\x63') 94 | sys.stdout.write("Command : Upload & execute PS-X EXE\n\n") 95 | ser.write(pc) 96 | sys.stdout.write("Sending Exec Address\n") 97 | ser.write(addr) 98 | sys.stdout.write("Sending Load Address\n") 99 | ser.write(fsz) 100 | sys.stdout.write("Sending Filesize\n") 101 | inputfile.seek(2048,0) 102 | bin = inputfile.read(filesize-2048) 103 | sys.stdout.write("Sending Data...") 104 | sys.stdout.flush() 105 | ser.write(bin) 106 | sys.stdout.write(" Done!\n") 107 | sys.stdout.write("Executing\n") 108 | sys.stdout.write("Operation Complete\n\n") 109 | sleep(0.1) 110 | 111 | 112 | def upload(): 113 | serialport = sys.argv[2] 114 | filename = sys.argv[3] 115 | addr = (int(sys.argv[4],16)).to_bytes(4, byteorder='little',signed=False) 116 | filesize = (os.path.getsize(filename)).to_bytes(4, byteorder='little',signed=False) 117 | inputfile = open(filename, 'rb') 118 | inputfile.seek(0, 0) 119 | sys.stdout.write("Port : ") 120 | sys.stdout.write(serialport) 121 | sys.stdout.write("\nFilename : {}\n".format(filename)) 122 | sys.stdout.write("File Size : {} bytes\n".format(os.path.getsize(filename))) 123 | sys.stdout.write("Address : ") 124 | sys.stdout.write(hex(int(sys.argv[4],16))) 125 | sys.stdout.write("\n") 126 | bin = inputfile.read(os.path.getsize(filename)) 127 | ser = serial.Serial(serialport,1036800,writeTimeout = 100) 128 | ser.write(b'\x62') 129 | sys.stdout.write("Command : Upload data\n\n") 130 | ser.write(addr) 131 | sys.stdout.write("Sending Load Address\n") 132 | ser.write(filesize) 133 | sys.stdout.write("Sending Filesize\n") 134 | sys.stdout.write("Sending Data...") 135 | sys.stdout.flush() 136 | ser.write(bin) 137 | sys.stdout.write(" Done!\n") 138 | sys.stdout.write("Operation Complete\n\n") 139 | sleep(0.1) 140 | 141 | #main 142 | 143 | sys.stdout.write("litetool.py - by @danhans42\n\n") 144 | 145 | if args < 2: 146 | sys.stdout.write("insufficient parameters - try litetool.py -h\n\n") 147 | sys.exit() 148 | 149 | command = sys.argv[1] 150 | 151 | if command == "-h": 152 | usage() 153 | 154 | elif command == "-exe": 155 | if args < 4: 156 | sys.stdout.write("insufficient parameters - try litetool.py -h\n\n") 157 | sys.exit() 158 | serialport = sys.argv[2] 159 | file = sys.argv[3] 160 | stat = "Uploading" 161 | uploadexe() 162 | 163 | elif command == "-bin": 164 | if args < 5: 165 | sys.stdout.write("insufficient parameters - try litetool.py -h\n\n") 166 | sys.exit() 167 | serialport = sys.argv[2] 168 | file = sys.argv[3] 169 | stat = "Uploading" 170 | upload() 171 | 172 | elif command == "-reboot": 173 | if args < 3: 174 | sys.stdout.write("insufficient parameters - try litetool.py -h\n\n") 175 | sys.exit() 176 | serialport = sys.argv[2] 177 | resetpsx() 178 | 179 | elif command == "-goto": 180 | if args < 3: 181 | sys.stdout.write("insufficient parameters - try litetool.py -h\n\n") 182 | sys.exit() 183 | serialport = sys.argv[2] 184 | gotoaddr() 185 | 186 | elif command == "-dump": 187 | if args < 6: 188 | sys.stdout.write("insufficient parameters - try litetool.py -h\n\n") 189 | sys.exit() 190 | stat = "Downloading" 191 | download() 192 | 193 | else: 194 | sys.stdout.write("error: invalid command\n\n") 195 | usage() 196 | 197 | 198 | 199 | --------------------------------------------------------------------------------