in patcher/patcher.js [661:753]
function readWriteConfig(buf, patch) {
let patchPtr = null
let origData = []
let cfgLen = 0
let isUF2 = false
if (read32(buf, 0) == UF2_MAGIC_START0) {
isUF2 = true
log("detected UF2 file")
} else {
let stackBase = read32(buf, 0)
if ((stackBase & 0xff000003) == 0x20000000 &&
(read32(buf, 4) & 1) == 1) {
log("detected BIN file")
} else {
let str = bufToString(buf)
if (str.indexOf("/* CF2 START") >= 0) {
log("detected CF2 header file")
let rr = patchHFile(str, patch)
console.log(rr.data)
return patch ? stringToBuf(rr.patched) : rr.data
} else {
err("unknown file format")
}
}
}
if (patch)
patch.push(0, 0)
for (let off = 0; off < buf.length; off += 512) {
let start = 0
let payloadLen = 512
let addr = off
if (isUF2) {
start = 32
if (read32(buf, off) != UF2_MAGIC_START0 ||
read32(buf, off + 4) != UF2_MAGIC_START1) {
err("invalid data at " + off)
}
payloadLen = read32(buf, off + 16)
addr = read32(buf, off + 12) - 32
}
for (let i = start; i < start + payloadLen; i += 4) {
if (read32(buf, off + i) == CFG_MAGIC0 &&
read32(buf, off + i + 4) == CFG_MAGIC1) {
let addrS = "0x" + (addr + i).toString(16)
if (patchPtr === null) {
log(`Found CFG DATA at ${addrS}`)
patchPtr = -4
} else {
log(`Skipping second CFG DATA at ${addrS}`)
}
}
if (patchPtr !== null) {
if (patchPtr == -2) {
cfgLen = read32(buf, off + i)
if (patch)
write32(buf, off + i, (patch.length >> 1) - 1)
}
if (patchPtr >= 0) {
if (origData.length < cfgLen * 2 + 40)
origData.push(read32(buf, off + i))
if (patch) {
if (patchPtr < patch.length) {
write32(buf, off + i, patch[patchPtr])
}
}
}
patchPtr++
}
}
}
let len0 = cfgLen * 2
origData.push(0, 0)
while (origData[len0])
len0 += 2
origData = origData.slice(0, len0 + 2)
if (len0 != cfgLen * 2)
log("size information incorrect; continuing anyway")
if (origData.length == 0)
err("config data not found")
if (patch && patchPtr < patch.length)
err("no space for config data")
let tail = origData.slice(origData.length - 2)
if (tail.some(x => x != 0))
err("config data not zero terminated: " + tail.join(","))
origData = origData.slice(0, origData.length - 2)
return patch ? buf : origData
}