; Original design by cout https://github.com/cout/baby_metroid/blob/main/src/freespace.asm ; and InsaneFirebat https://github.com/tewtal/sm_practice_hack/blob/master/src/freespace.asm macro DeclareFreeSpace(bank, begin, end) ; Using closed interval [begin, end] ; (half-open interval would require bank-cross maths) !START_FREESPACE_ = !END_FREESPACE_ = endmacro ; Declare free space { DeclareFreeSpace(80, $CD8E, $FFBF) DeclareFreeSpace(81, $EF1A, $FFFF) ; Not accounting for Genji DeclareFreeSpace(82, $F70F, $FFFF) DeclareFreeSpace(83, $AD66, $FFFF) DeclareFreeSpace(84, $EFD3, $FFFF) DeclareFreeSpace(85, $9643, $FFFF) DeclareFreeSpace(86, $F4A6, $FFFF) DeclareFreeSpace(87, $C964, $FFFF) DeclareFreeSpace(88_0, $A206, $A265) DeclareFreeSpace(88_1, $EE32, $FFFF) DeclareFreeSpace(89, $AEFD, $FFFF) DeclareFreeSpace(8A, $E980, $FFFF) DeclareFreeSpace(8B, $F760, $FFFF) DeclareFreeSpace(8C, $F3E9, $FFFF) DeclareFreeSpace(8D, $FFF1, $FFFF) DeclareFreeSpace(8E, $E600, $FFFF) DeclareFreeSpace(8F, $E99B, $FFFF) DeclareFreeSpace(90, $F63A, $FFFF) DeclareFreeSpace(91, $FFEE, $FFFF) DeclareFreeSpace(92, $EDF4, $FFFF) DeclareFreeSpace(93, $F61D, $FFFF) DeclareFreeSpace(94_0, $B19F, $C7FF) DeclareFreeSpace(94_1, $DC00, $DFFF) DeclareFreeSpace(99, $EE21, $FFFF) DeclareFreeSpace(9A, $FC20, $FFFF) DeclareFreeSpace(9B_0, $CBFB, $DFFF) DeclareFreeSpace(9B_1, $FDA0, $FFFF) DeclareFreeSpace(9C, $FA80, $FFFF) DeclareFreeSpace(9D, $F780, $FFFF) DeclareFreeSpace(9E, $F6C0, $FFFF) DeclareFreeSpace(9F, $F740, $FFFF) DeclareFreeSpace(A0, $F7D3, $FFFF) DeclareFreeSpace(A1, $EBD1, $FFFF) DeclareFreeSpace(A2, $F498, $FFFF) DeclareFreeSpace(A3, $F311, $FFFF) DeclareFreeSpace(A4, $F6C0, $FFFF) DeclareFreeSpace(A5, $F95A, $FFFF) DeclareFreeSpace(A6, $FEBC, $FFFF) DeclareFreeSpace(A7, $FF82, $FFFF) DeclareFreeSpace(A8, $F9BE, $FFFF) DeclareFreeSpace(A9, $FB70, $FFFF) DeclareFreeSpace(AA, $F7D3, $FFFF) DeclareFreeSpace(AB, $F800, $FFFF) DeclareFreeSpace(AC, $EE00, $FFFF) DeclareFreeSpace(AD, $F444, $FFFF) DeclareFreeSpace(AE, $FD20, $FFFF) DeclareFreeSpace(AF, $EC00, $FFFF) DeclareFreeSpace(B0, $EE00, $FFFF) ; $B1 has no free space DeclareFreeSpace(B2, $FEAA, $FFFF) DeclareFreeSpace(B3, $ED77, $FFFF) DeclareFreeSpace(B4, $F4B8, $FFFF) DeclareFreeSpace(B5, $F000, $FFFF) DeclareFreeSpace(B6, $F200, $FFFF) DeclareFreeSpace(B7, $FD00, $FFFF) DeclareFreeSpace(B8, $8000, $FFFF) ; Unused bank ; $B9..$CD have no free space (compressed data) DeclareFreeSpace(CE, $B22E, $FFFF) ; $CF..DD have no free space (music data) DeclareFreeSpace(DE, $D1C0, $FFFF) DeclareFreeSpace(DF, $8000, $FFFF) ; Unused bank } macro FreespaceStart(bank) { ; Allows us to assign freespace without gaps from different files assert defined("FREESPACE_BANK") == 0, "You forgot to close out bank !FREESPACE_BANK" assert defined("START_FREESPACE_"), "Bank $ has no free space" !FREESPACE_ ?= !START_FREESPACE_ org !FREESPACE_ !FREESPACE_BANK = $ } endmacro macro FreespaceFinish(bank) { ; Used to close out an org and track the next free byte assert defined("FREESPACE_BANK"), "No matching FreespaceStart()" assert $ == !FREESPACE_BANK, "You closed out the wrong bank. (Check bank !FREESPACE_BANK)" undef "FREESPACE_BANK" !FREESPACE_COUNTER_ ?= 0 !counter := !FREESPACE_COUNTER_ !FREESPACE_COUNTER_ #= !counter+1 warnpc !END_FREESPACE_ FreespaceLabel_!counter: !FREESPACE_ := FreespaceLabel_!counter } endmacro macro FreespacePrint(bank) { ; Print some numbers about our freespace usage !FREESPACE_ ?= !START_FREESPACE_ if defined("FREESPACE_COUNTER_") print "Bank $ ended at $", hex(!FREESPACE_), " with $", hex(!END_FREESPACE_-!FREESPACE_), " bytes remaining" endif } endmacro macro FreespacePrintAll() { %FreespacePrint(80) %FreespacePrint(81) %FreespacePrint(82) %FreespacePrint(83) %FreespacePrint(84) %FreespacePrint(85) %FreespacePrint(86) %FreespacePrint(87) %FreespacePrint(88_0) %FreespacePrint(88_1) %FreespacePrint(89) %FreespacePrint(8A) %FreespacePrint(8B) %FreespacePrint(8C) %FreespacePrint(8D) %FreespacePrint(8E) %FreespacePrint(8F) %FreespacePrint(90) %FreespacePrint(91) %FreespacePrint(92) %FreespacePrint(93) %FreespacePrint(94_0) %FreespacePrint(94_1) %FreespacePrint(99) %FreespacePrint(9A) %FreespacePrint(9B_0) %FreespacePrint(9B_1) %FreespacePrint(9C) %FreespacePrint(9D) %FreespacePrint(9E) %FreespacePrint(9F) %FreespacePrint(A0) %FreespacePrint(A1) %FreespacePrint(A2) %FreespacePrint(A3) %FreespacePrint(A4) %FreespacePrint(A5) %FreespacePrint(A6) %FreespacePrint(A7) %FreespacePrint(A8) %FreespacePrint(A9) %FreespacePrint(AA) %FreespacePrint(AB) %FreespacePrint(AC) %FreespacePrint(AD) %FreespacePrint(AE) %FreespacePrint(AF) %FreespacePrint(B0) %FreespacePrint(B2) %FreespacePrint(B3) %FreespacePrint(B4) %FreespacePrint(B5) %FreespacePrint(B6) %FreespacePrint(B7) %FreespacePrint(B8) %FreespacePrint(CE) %FreespacePrint(DE) %FreespacePrint(DF) } endmacro