diff --git a/pureboot/README.md b/pureboot/README.md index cdf0b16..3b462b8 100644 --- a/pureboot/README.md +++ b/pureboot/README.md @@ -4,12 +4,17 @@ A serial bootloader on [libavr](https://git.blackmark.me/avr/libavr), pure by constraint: one C++ source, no inline assembly, no global register variables (attributes and compiler flags allowed), built for **every chip libavr targets — all 37 — in 512 bytes each**: 434 B on the tiny13s, 438–442 B on -the tiny25/45/85, 412–452 B across the megas and every configured variant of -them, and 506 B on the ATmega1284/1284P, whose far-flash machinery (ELPM -reads, RAMPZ page commands, word-addressed wire) is the heaviest. The 1284s -are the tight case: the loop-placement attributes on the byte streamers +the tiny25/45/85, 412–452 B across the megas, and 506 B on the +ATmega1284/1284P, whose far-flash machinery (ELPM reads, RAMPZ page commands, +word-addressed wire) is the heaviest. Those are the stock deployments; +choosing the software UART where the chip has a USART costs 8–46 B more (a +bit-bang against a peripheral), which every chip still absorbs inside its +slot — on the 1284s that means their 1 KiB boot sector, where the +software-serial image lands at 546 B. Bringing the 1284's default build +under 512 at all is what the loop-placement attributes on the byte streamers (`pureboot.cpp`) and the codegen flags on the loader TU (`CMakeLists.txt`) -are what carry that build under the line. Clock, baud, serial backend and +are for; measured against each chip's own budget the tightest is the +ATmega328P, 50 B spare. Clock, baud, serial backend and pins are per-build configuration (below); the size matrix in the test suite holds every combination inside its slot. The device speaks primitives; every composite — verify, erase, reset-vector surgery, updating the loader itself —