Patcher

Patch a position

The most important patcher command is the “patch” command, with this you overwrite (never insert) bytes

patch <position> 0x<value>

# Patch position 12 (0x0C) with the four bytes 0x0025015E - changes the ROM version number to r37.350
CapCLI> patch 0x0C 0x0025015E

Create/set alias

Within Cap you can create variables (for some reason, I started using the word alias, now its stuck), but it’s just a variable, you can directly assign values to aliases, grab a chunk of the ROM and put it into an alias (to patch somewhere else or change), if the alias looks like it could be a number, you can add to or subtract from it, and you can treat it like a string and chop it up using the mid function.

I’ll probably add some extra functions here, like conversion between hex, int and strings, as it’s a little limited at the mo.

alias <aliasname> <value>

CapCLI> alias FRED 0x01020304
CapCLI> echo $FRED
0x01020304

alias <aliasname> romdata <start> <size>

CapCLI> loadrom "ROMs/TOSEC.Firmware/Kickstart v2.05 r37.350 (1992-04)(Commodore)(A600HD)[!].rom"
CapCLI> alias FRED romdata 0x0C 0x04
CapCLI> echo $FRED
0x0025015E

alias <aliasname> add <value>

CapCLI> echo $FRED
0x0025015e
CapCLI> alias FRED add 1
CapCLI> echo $FRED
0x0025015f

Note, add and subtract only work properly on hex values, i.e. they must begin 0x (I might change this later)

alias <aliasname> subtract <value>

CapCLI> echo $FRED
0x0025015f
CapCLI> alias FRED subtract 51
CapCLI> echo $FRED
0x0025012c


alias <aliasname> mid <start> <size>

CapCLI> echo $FRED
0x0025012c
CapCLI> alias FRED mid 3 2
CapCLI> echo $FRED
02

Note, the alias has 0x at the start of it, this is included in the length, so position 0 is "0", position 1 is "x" etc.

Inbuilt aliases

For your delectation, I have created some inbuilt aliases that help you access/modify ROM and library information, you (almost) only ever change data with the patch command.

ROM things

The ROMBASE calculated from the ROM
$ROMBASE

CapCLI> echo $ROMBASE
0x00f80000

The Commodore checksum (not CRC32)
$CALCCHECKSUM

CapCLI> echo $CALCCHECKSUM
0xba5d5fa4

The location within the ROM of the kickstart version (usually 12, 0x0C)
$(KICKSTARTVERSION)

CapCLI> echo $(KICKSTARTVERSION)
0x0000000c

Note the use of brackets, to say "location of" rather than the actual kickstart version.

# read the kickstart version into the KSV alias
CapCLI> alias KSV romdata $(KICKSTARTVERSION) 4
CapCLI> echo $KSV
0x0025015E

Locations of library things

These will give you the location of things that relate to specific libraries, so you can read or manipulate them - remember, the brackets mean "give me the location" not the value stored at that location

$libraryname.(START)
$libraryname.(END)
$libraryname.(ROMTAG)
$libraryname.(ROMTAG.MATCHTAG)
$libraryname.(ROMTAG.ENDSKIP)
$libraryname.(ROMTAG.FLAGS)
$libraryname.(ROMTAG.VERSION)
$libraryname.(ROMTAG.TYPE)
$libraryname.(ROMTAG.PRI)
$libraryname.(ROMTAG.NAME)
$libraryname.(ROMTAG.IDSTRING)
$libraryname.(ROMTAG.INIT)

If you want the start and end location of a library, then you can simply use the name;

$libraryname

CapCLI> echo $cia.resource
274624 275640

Hash aliases

You can find and refer to files by their hash value, but only if you have previously done an “auditfiles” command, the auditfiles command hashes every file under the named directory and creates an alias for every file based upon it’s hash value – as you can guess, scanning an entire directory tree is very CPU and disk intensive, so don’t do this on gigs or data, it’s only really worthwhile on ROMs or Components.
This is used extensively in the “Recipes and Tests” to load a specific ROM or component (without having to know the exact name).

Scan all files under a directory and evaluate the hash value
auditfiles <dirname>

CapCLI> auditfiles ROMs
CapCLI> echo "$0x43b0df7b"
ROMs/TOSEC.Firmware/Kickstart v2.05 r37.350 (1992-04)(Commodore)(A600HD)[!].rom

Patching the checksum

If you have altered the ROM, you will need to update the C= checksum, there’s a hard way and an easy way, but the hard way isn’t that hard.

Using the location of the start of the checksum, patch it with a newly calculated value
patch $Checksum.(START) $CALCCHECKSUM

The "checksum" command does this for you
checksum 

Finding data

If you want to scan the ROM (or just a library) for the location of things, I have a command for that… the unusually named find command, if the find is successful then the alias $FIND is set to the position that it found it, if it’s not found then $FIND is not updated and you just get “Not found” (I might change this to reset $FIND).

You can search for binary text using hex representation (so searching for strings is a bit laborious) or you can search for 68000 opcodes

find <from> <to> <what>

CapCLI> find 0 262143 0x6C696272617279
CapCLI> echo $FIND
0x00000038

CapCLI> find 0 262143 0x112233445566778899aa
Not found
CapCLI> echo $FIND
0x00000038

findopcode <from> <to> <what>

CapCLI> findopcode $0x75094a7b.scsidisk_40.12_(21.12.93) "JSR FCD6(A6)"
CapCLI> echo $FIND
0x00000090
Scroll to Top