From 18db46f61f8412fb7b3786cf6dde2e4b88a9843c Mon Sep 17 00:00:00 2001 From: Romain Dolbeau Date: Sun, 28 Sep 2025 14:03:05 +0200 Subject: [PATCH] Patch to Rev R Sun-2 boot rom to speed up booting in simulation --- RomPatcher/Sun2_FastBoot/Makefile | 41 ++++++++++++++++++ RomPatcher/Sun2_FastBoot/README.MD | 2 + RomPatcher/Sun2_FastBoot/input.txt | 3 ++ RomPatcher/Sun2_FastBoot/rompatch.s | 11 +++++ RomPatcher/Sun2_FastBoot/sun2-multi-rev-R.bin | Bin 0 -> 32768 bytes 5 files changed, 57 insertions(+) create mode 100644 RomPatcher/Sun2_FastBoot/Makefile create mode 100644 RomPatcher/Sun2_FastBoot/README.MD create mode 100644 RomPatcher/Sun2_FastBoot/input.txt create mode 100644 RomPatcher/Sun2_FastBoot/rompatch.s create mode 100644 RomPatcher/Sun2_FastBoot/sun2-multi-rev-R.bin diff --git a/RomPatcher/Sun2_FastBoot/Makefile b/RomPatcher/Sun2_FastBoot/Makefile new file mode 100644 index 0000000..4fc61fa --- /dev/null +++ b/RomPatcher/Sun2_FastBoot/Makefile @@ -0,0 +1,41 @@ +RETRO68=/home/dolbeau/Retro68/build/toolchain +AS=${RETRO68}/bin/m68k-apple-macos-as +CC=${RETRO68}/bin/m68k-apple-macos-gcc +LD=${RETRO68}/bin/m68k-apple-macos-ld +STRIP=${RETRO68}/bin/m68k-apple-macos-strip +OBJCOPY=${RETRO68}/bin/m68k-apple-macos-objcopy +NM=${RETRO68}/bin/m68k-apple-macos-nm + +HOSTCC=gcc +HOSTCFLAGS=-O2 + +ARCHFLAGS=-march=68010 -mcpu=68010 +CFLAGS=-O2 -mpcrel + +GENLINK=../patcher/genlink +PATCHER=../patcher/patcher + +all: sun2-multi-rev-R.bin + +show: rompatch.elf + $(NM) $< | sort + +sun2-multi-rev-R.bin: ../ rompatch.raw input.txt + /bin/cp ../sun2-multi-rev-R.bin sun2-multi-rev-R.bin + ${PATCHER} -i rompatch.raw -p sun2-multi-rev-R.bin -d input.txt + +linker.ld: input.txt rompatch.s + ${GENLINK} -d $< >| $@ + echo $(shell for X in `grep .section rompatch.s | awk '{ print $$2 }' `; do grep -q $$X linker.ld || echo " $$X has no entry in linker.ld" && /bin/false; done) + +rompatch.o: rompatch.s + ${AS} ${ARCHFLAGS} $< -o $@ -a > rompatch.l + +rompatch.elf: linker.ld rompatch.o ${CSRC:.c=.o} # linker script must be first + ${LD} -o $@ -T $^ + +rompatch.raw: rompatch.elf + ${OBJCOPY} $^ $@ --input-target=elf32-m68k --output-target=binary + +clean: + rm -f res.inc ${CSRC_ASM} *.o rompatch.srec rompatch.raw rompatch.dir rompatch.l linker.ld rompatch.elf diff --git a/RomPatcher/Sun2_FastBoot/README.MD b/RomPatcher/Sun2_FastBoot/README.MD new file mode 100644 index 0000000..3921431 --- /dev/null +++ b/RomPatcher/Sun2_FastBoot/README.MD @@ -0,0 +1,2 @@ +loweritercount: reduce the count of iteration in the wite loop between LED value. +Mconstop: skip memory testing diff --git a/RomPatcher/Sun2_FastBoot/input.txt b/RomPatcher/Sun2_FastBoot/input.txt new file mode 100644 index 0000000..f9513f8 --- /dev/null +++ b/RomPatcher/Sun2_FastBoot/input.txt @@ -0,0 +1,3 @@ +0x0001b6, 0, diagret +0x000b80, 2, loweritercount +0x000e80, 4, Mconstop diff --git a/RomPatcher/Sun2_FastBoot/rompatch.s b/RomPatcher/Sun2_FastBoot/rompatch.s new file mode 100644 index 0000000..95c3107 --- /dev/null +++ b/RomPatcher/Sun2_FastBoot/rompatch.s @@ -0,0 +1,11 @@ + .section .text.diagret +diagret: + + .section .text.loweritercount +loweritercount: + .short 2 + + .section .text.Mconstop +Mconstop: + jmp (%pc,diagret) + diff --git a/RomPatcher/Sun2_FastBoot/sun2-multi-rev-R.bin b/RomPatcher/Sun2_FastBoot/sun2-multi-rev-R.bin new file mode 100644 index 0000000000000000000000000000000000000000..6fa1476f3a4e1fc626f1e8d6ad95a80674a4e334 GIT binary patch literal 32768 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