From 800cf7cad0a1ba7b1a66fbcc2061baf2949fdccf Mon Sep 17 00:00:00 2001 From: ash Date: Thu, 23 Apr 2026 15:41:27 +0100 Subject: [PATCH] added megadrive --- .bashrc | 2 + scripts/megadrive.sh | 162 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 164 insertions(+) create mode 100755 scripts/megadrive.sh diff --git a/.bashrc b/.bashrc index 617397f..3d03bb1 100644 --- a/.bashrc +++ b/.bashrc @@ -62,6 +62,7 @@ function helpme() { echo -e "rip : Rip a music CD" echo -e "wii : Convert Wii games" echo -e "nds-patcher : Patches NDS ROMs" + echo -e "megadrive : Flashes Megadrive Carts" echo -e "" echo -e "\e[32m--------- System Stats ----------\e[0m" echo -e "kill [tab] : Show processes to Kill" @@ -96,6 +97,7 @@ alias phoneapps="~/.bash/scripts/phone-apps.sh" alias compress="~/.bash/scripts/compress.sh" alias wii="~/.bash/scripts/wii.sh" alias nds-patcher="~/.bash/scripts/nds.sh" +alias megadrive="~/.bash/scripts/megadrive.sh" export GSK_RENDERER=cairo eval "$(starship init bash)" diff --git a/scripts/megadrive.sh b/scripts/megadrive.sh new file mode 100755 index 0000000..751f6f3 --- /dev/null +++ b/scripts/megadrive.sh @@ -0,0 +1,162 @@ +#!/usr/bin/env bash + +clear + +# Gum theme +export GUM_THEME="\ + [\"ui\"] = { background = \"#000000\", foreground = \"#FFA500\" }\ + [\"ui.focused\"] = { background = \"#FFA500\", foreground = \"#000000\" }\ + [\"ui.text\"] = { foreground = \"#FFA500\" }\ + [\"box\"] = { background = \"#000000\", foreground = \"#FFA500\", border = \"#FFA500\" }\ + [\"box.border\"] = { foreground = \"#FFA500\" }\ +" + +# FZF colors (orange highlight) +export FZF_DEFAULT_OPTS="--color=fg:#FFA500,bg:#000000,hl:#FFA500,fg+:#000000,bg+:#FFA500,hl+:#000000,info:#FFA500,prompt:#FFA500,pointer:#FFA500,marker:#FFA500,spinner:#FFA500" + +title() { + gum style \ + --foreground="#FFA500" \ + --background="#000000" \ + --border-foreground="#FFA500" \ + --border="double" \ + --align="center" \ + --width="50" \ + --margin="1" \ + --padding="2 4" \ + "MEGADRIVE CART FLASH" +} + +# ------------------------- +# Dependencies +# ------------------------- +check_dependencies() { + for cmd in flashkit fzf md5sum; do + if ! command -v $cmd &> /dev/null; then + gum confirm "$cmd is not installed. Install it now?" && { + gum spin --spinner="line" --title="Installing $cmd..." -- sudo apt-get install -y $cmd + } + fi + done + + if ! python3 -c "import serial" &> /dev/null; then + gum confirm "pyserial is not installed. Install it now?" && { + gum spin --spinner="line" --title="Installing pyserial..." -- python3 -m pip install pyserial + } + fi +} + +# ------------------------- +# Detect FTDI port +# ------------------------- +detect_port() { + gum style --foreground="#FFA500" "Detecting flash cartridge..." + + if [ -d /dev/serial/by-id ]; then + matches=($(ls /dev/serial/by-id/*FTDI* 2>/dev/null)) + fi + + if [ ${#matches[@]} -eq 0 ]; then + for dev in /dev/ttyUSB*; do + [ -e "$dev" ] || continue + if udevadm info --query=property --name="$dev" | grep -q "ID_VENDOR_ID=0403"; then + matches+=("$dev") + fi + done + fi + + if [ ${#matches[@]} -eq 0 ]; then + gum style --foreground="#FFA500" "No FTDI flash device detected." + exit 1 + fi + + selected_port=$(readlink -f "${matches[0]}") + gum style --foreground="#FFA500" "Using port: $selected_port" +} + +# ------------------------- +# Read cart +# ------------------------- +read_cart() { + clear + title + + gum style --foreground="#FFA500" "Checking current cartridge content..." + check_output=$(flashkit --port "$selected_port" check 2>&1) + + gum style \ + --foreground="#FFA500" \ + --border="rounded" \ + --border-foreground="#FFA500" \ + --padding="1 2" \ + "$check_output" +} + +# ------------------------- +# FZF file browser +# ------------------------- +browse_files() { + find . -type f -name "*.md" 2>/dev/null | fzf --height=40% --reverse --border --prompt="Select ROM > " +} + +# ------------------------- +# Write ROM +# ------------------------- +write_rom() { + clear + title + + rom_file=$(browse_files) + + [ -z "$rom_file" ] && { + gum style --foreground="#FFA500" "No file selected." + return + } + + # File info + rom_size=$(du -h "$rom_file" | cut -f1) + rom_md5=$(md5sum "$rom_file" | cut -d ' ' -f1) + + gum style \ + --foreground="#FFA500" \ + --border="rounded" \ + --border-foreground="#FFA500" \ + --padding="1 2" \ + "File: $(basename "$rom_file") +Size: $rom_size +MD5: $rom_md5" + + gum confirm "Write this ROM to $selected_port?" && { + gum spin --spinner="line" --title="Writing ROM..." -- flashkit --port "$selected_port" write-rom -i "$rom_file" + gum style --foreground="#FFA500" "Done! ROM written successfully." + + # Auto refresh + read_cart + } || { + gum style --foreground="#FFA500" "Cancelled." + } +} + +# ------------------------- +# Main +# ------------------------- +check_dependencies +detect_port +read_cart + +while true; do + choice=$(gum choose \ + --header="Select an option:" \ + "Read Cart" \ + "Write ROM" \ + "Exit") + + case "$choice" in + "Read Cart") read_cart ;; + "Write ROM") write_rom ;; + "Exit") + gum style --foreground="#FFA500" "Goodbye." + exit 0 + ;; + esac +done