{ "chunk": "boot_titleBitmapA000_A000", "unit": "boot/titleBitmapA000", "unitLabels": { "boot/titleBitmapA000": { "A000": "titleBitmap", "AAEA": "titleBitmapAAEA", "BAA2": "titleBitmapBAA2", "BAA3": "titleBitmapBAA3", "BF40": "leftoverDataDiskCode", "BF5C": "leftoverTableBF5C", "BF5F": "leftoverDiskPrompt", "BF7C": "leftoverSwapDisks", "BF9C": "leftoverGrabSaveSlots", "BFB0": "mapRowAddrLoTable", "BFC5": "leftoverStampSerial", "BFD8": "mapRowAddrHiTable", "BFDA": "leftoverReadTrack18Sector", "BFED": "titleFileTailFiller" } }, "notes": { "A000": { "unit": "boot/titleBitmapA000", "block": [ "titleBitmap - the 8000-byte multicolour bitmap of the title picture, $A000-$BF3F. It is bytes", "$0800-$27FF of the 11264-byte directory file 'load' (tracks 19-21, not encrypted), which the", "stage-1 stub at $02B8 KERNAL-LOADs to $9800-$C3FF - into the RAM under the ROMs - so the picture", "arrives already at the address the VIC reads it from: no code ever copies it.", "Layout is the VIC's own: 25 character rows of 40 cells, 8 consecutive bytes per cell (one byte per", "pixel row of that cell), so cell (row,col) is at $A000 + 320*row + 8*col and every line below is one", "8x8 cell. Each byte holds four 2-bit pixels (leftmost in bits 7-6): %00 = background $D021 (black,", "set at $C14E), %01 = the high nibble of titleScreenRam[cell], %10 = its low nibble, %11 = the low", "nibble of titleColorRam[cell]. bootShowTitlePicture ($C23F) copies those two 1000-byte tables from", "$9800 -> COLOR_RAM and $9C00 -> $8C00, selects VIC bank 2 (CIA2_PRA = $05) and sets VIC_CTRL2 = $D8", "(multicolour), VIC_MEM_PTR = $38 (video matrix $8C00, bitmap $A000) and VIC_CTRL1 = $3B (bitmap on).", "The CPU still has BASIC ROM banked in over $A000-$BFFF at that moment - only the VIC, which always", "sees RAM, can read these bytes; the game switches to $01 = $35 later.", "The picture: Dan Bunten's name over the 'MODEM WARS' logo, a striding walker tank firing (a second", "walker behind it on the left, its shot crossing the logo), an explosion and smoke on the right, and", "the copyright line along the bottom. docs/titleScreen.png is these bytes decoded.", "No CPU code in the shipped game reads or writes the picture: it is shown while the disk loads and", "then thrown away. From $0800 on this is simply the game's own display bitmap - initBitmapScreen", "($2D41) clears $A000-$BF3F (and stops there, because $BFB0-$BFFF holds the map row tables).", "The three labels inside the picture (titleBitmapAAEA, titleBitmapBAA2, titleBitmapBAA3) are not", "data: they are the operands of dead or patched instructions in the boot loader - see each one.", "Row 0 (pixel rows 0-7): sky (light blue) across columns 0-31, the yellow caption \"DAN BUNTEN'S\"", "starting on pixel row 5 in columns 13-25, and the grey-black smoke column in columns 26-39." ] }, "A140": { "unit": "boot/titleBitmapA000", "block": [ "Row 1 (pixel rows 8-15): the caption ends on pixel row 11; pixel row 15 is the yellow top rim", "that runs the whole width of the 'MODEM WARS' logo. Smoke still fills columns 27-39." ] }, "A280": { "unit": "boot/titleBitmapA000", "block": [ "Row 2 (pixel rows 16-23): first body row of the logo - dark red block letters with a black", "outline, sky showing between them in columns 0-28, smoke in columns 30-39." ] }, "A3C0": { "unit": "boot/titleBitmapA000", "block": [ "Row 3 (pixel rows 24-31): logo body; the white muzzle flash of the background walker's gun", "reaches column 0 at the left." ] }, "A500": { "unit": "boot/titleBitmapA000", "block": [ "Row 4 (pixel rows 32-39): logo body with the white-and-orange muzzle flash over columns 0-5." ] }, "A640": { "unit": "boot/titleBitmapA000", "block": [ "Row 5 (pixel rows 40-47): logo body; the flash (columns 2-5) and the grey gun barrel that runs", "down and to the right from it, drawn straight over the letters." ] }, "A780": { "unit": "boot/titleBitmapA000", "block": [ "Row 6 (pixel rows 48-55): logo body; flash and barrel in columns 2-7." ] }, "A8C0": { "unit": "boot/titleBitmapA000", "block": [ "Row 7 (pixel rows 56-63): last body row of the logo - the letters end on pixel row 62 and pixel", "row 63 is their black shadow line; the barrel continues in columns 2-9." ] }, "AA00": { "unit": "boot/titleBitmapA000", "block": [ "Row 8 (pixel rows 64-71): sky, the top of the big walker's hull (greys, columns 7-28) with the", "white barrel highlight in columns 8-25, and smoke turning into the explosion in columns 29-39." ] }, "AAEA": { "unit": "boot/titleBitmapA000", "line": "row 8, column 29, pixel rows 2-7: dark grey smoke against the sky, ordinary picture bytes. The label exists only because the boot loader's STA $AAEA,Y at $C168 carries this address as its operand, and that instruction is patched to TXS (INC $C168 at $C242) before it is ever executed - nothing is ever stored here" }, "AB40": { "unit": "boot/titleBitmapA000", "block": [ "Row 9 (pixel rows 72-79): walker hull and turret; the first orange and yellow pixels of the", "explosion appear in columns 30-35." ] }, "AC80": { "unit": "boot/titleBitmapA000", "block": [ "Row 10 (pixel rows 80-87): hull and raised turret; the explosion (white, yellow, orange, red)", "now covers columns 30-39." ] }, "ADC0": { "unit": "boot/titleBitmapA000", "block": [ "Row 11 (pixel rows 88-95): hull; explosion in columns 30-39." ] }, "AF00": { "unit": "boot/titleBitmapA000", "block": [ "Row 12 (pixel rows 96-103): the underside of the hull; explosion in columns 31-39." ] }, "B040": { "unit": "boot/titleBitmapA000", "block": [ "Row 13 (pixel rows 104-111): sky in columns 0-6, the hull ending in columns 7-26, sky again in", "columns 27-31, explosion in columns 32-39." ] }, "B180": { "unit": "boot/titleBitmapA000", "block": [ "Row 14 (pixel rows 112-119): the hull's belly and the tops of the legs (columns 7-25); the", "background walker's gun appears at columns 5-6; explosion in columns 29-39." ] }, "B2C0": { "unit": "boot/titleBitmapA000", "block": [ "Row 15 (pixel rows 120-127): the background walker's barrel crosses columns 1-5, the big", "walker's legs fill columns 6-25, explosion in columns 30-39." ] }, "B400": { "unit": "boot/titleBitmapA000", "block": [ "Row 16 (pixel rows 128-135): the background walker (columns 4-16), sky between the big walker's", "legs (columns 17-25), explosion in columns 31-39." ] }, "B540": { "unit": "boot/titleBitmapA000", "block": [ "Row 17 (pixel rows 136-143): both walkers' legs over sky; explosion and its falling debris in", "columns 33-39." ] }, "B680": { "unit": "boot/titleBitmapA000", "block": [ "Row 18 (pixel rows 144-151): legs over sky; the brown ridge of the horizon comes in at columns", "33-39 on pixel row 149." ] }, "B7C0": { "unit": "boot/titleBitmapA000", "block": [ "Row 19 (pixel rows 152-159): the brown horizon ridge now crosses the whole row behind the legs." ] }, "B900": { "unit": "boot/titleBitmapA000", "block": [ "Row 20 (pixel rows 160-167): the ridge ends and the green ground starts on pixel row 164; the", "legs and feet of both walkers stand on it." ] }, "BA40": { "unit": "boot/titleBitmapA000", "block": [ "Row 21 (pixel rows 168-175): green ground with the white and grey legs and feet. The two labels", "in this row (titleBitmapBAA2/BAA3) belong to dead code - see them." ] }, "BAA2": { "unit": "boot/titleBitmapA000", "line": "row 21, column 12, pixel row 2 - four pixels of a grey leg standing on the green ground. In the build the boot loader was cut down from, $BA00 held a sector buffer and this was BAM offset $A2, the first character of the disk id; the truncated leftoverCheckDiskId still reads it at $C3EC, but that routine is unreachable, so this is picture data and nothing else" }, "BAA3": { "unit": "boot/titleBitmapA000", "line": "the same for BAM offset $A3, the second id character, read by the dead code at $C3E3; then four more pixel bytes to the end of column 12" }, "BB80": { "unit": "boot/titleBitmapA000", "block": [ "Row 22 (pixel rows 176-183): green ground, feet and their shadows." ] }, "BCC0": { "unit": "boot/titleBitmapA000", "block": [ "Row 23 (pixel rows 184-191): ground on pixel rows 184-186, then the yellow copyright line", "'COPYRIGHT(C) 1988-OZARK SOFTSCAPE' from pixel row 187, columns 5-36." ] }, "BE00": { "unit": "boot/titleBitmapA000", "block": [ "Row 24 (pixel rows 192-199): the copyright line finishes on pixel row 193, green ground below.", "This row is also where the older build whose remains start at $BF40 kept code ($BE93, $BEA7)", "and the ten-byte serial it copied from $BE30 - the picture overwrote all of it." ] }, "BF28": { "unit": "boot/titleBitmapA000", "line": "columns 37-39 of the last row: the small dark-grey monogram in the bottom right corner of the picture - it reads like a lower-case 'mk' with a flourish, probably the artist's initials. $BF3F is the last byte the VIC displays" }, "BF40": { "unit": "boot/titleBitmapA000", "block": [ "leftoverDataDiskCode ($BF40-$BFEC) - 173 bytes that are NOT part of the picture and are never", "executed by anything: the bitmap needs 8000 bytes and stops at $BF3F, so these are whatever", "happened to be sitting in the mastering machine's memory above it when the 'load' file was written.", "They are 6502 code, and they disassemble cleanly all the way from $BF40 to $BFEC. (At run time the", "half from $BFB0 on is overwritten by the map row address tables - see mapRowAddrLoTable; $BF40-$BFAF", "is never touched at all.)", "It is code from an earlier build of this game - almost certainly the same build whose remains also", "survive in the boot loader file at $C3BC-$C3FF:", " * it calls $C3C4, and the truncated original of that routine (leftoverCheckDiskId, 'read the BAM", " of track 18 to $BA00 and compare $BAA2/$BAA3 with OZ / EA') is itself still sitting unreachable", " in the boot loader file from $C3C4 to the end of the file at $C3FF;", " * both fragments call the same pair of loader entry points $CBED (set destination) and $CBF2 (read", " sectors), which in that build lived at $CBxx and in the shipped one live at $C034/$C004;", " * both use the same $BA00 sector buffer, and this fragment stamps ten bytes into $BAAB - BAM", " offset $AB, exactly the disk name/serial field the shipped checkDiskId reads at $02AB ($0FF3)", " and copies to ownPlayerName $FFDE-$FFE7;", " * its other call targets ($C1B3, $C1C6, $C1D8, $C453, $C7AB, $C860, $C933) and the strings it", " prints ($BB5C, $BB8C) match nothing in the shipped game at those addresses.", "What it does, as far as the surviving part shows: print a prompt, ask $C3C4 which disk is in the", "drive, keep asking until the right one is inserted, copy track 18 sectors $11 and $12 (the two save", "slots) through the $BA00 buffer, and write a ten-byte serial into a BAM image - i.e. the disk-swap /", "data-disk preparation that the shipped game does from $0FB1 and the film menus. The routines it", "calls below $BF40 ($BE30, $BE93, $BEA7, the strings at $BB5C and $BB8C) were all overwritten by the", "title picture, so only this tail survives.", "Rendered one instruction per line, with the decoded instruction in the comment; the file is pure", "data, so the bytes stay .byte." ], "line": "lda #$0B" }, "BF42": { "unit": "boot/titleBitmapA000", "line": "sta $5F - a flag or parameter of that build (in the shipped game $5F is joyFireUp)" }, "BF44": { "unit": "boot/titleBitmapA000", "line": "jsr $C1D8 - a routine of that build; the shipped boot loader has unrelated code there" }, "BF47": { "unit": "boot/titleBitmapA000", "line": "ldy $60" }, "BF49": { "unit": "boot/titleBitmapA000", "line": "ldx $21" }, "BF4B": { "unit": "boot/titleBitmapA000", "line": "lda leftoverTableBF5C,y - pick one of the three constants below" }, "BF4E": { "unit": "boot/titleBitmapA000", "line": "sta $BA02,x - into the sector buffer at $BA00, offset 2 + X" }, "BF51": { "unit": "boot/titleBitmapA000", "line": "lda #$04" }, "BF53": { "unit": "boot/titleBitmapA000", "line": "jsr $C453" }, "BF56": { "unit": "boot/titleBitmapA000", "line": "ldx #$07" }, "BF58": { "unit": "boot/titleBitmapA000", "line": "jmp $C1B3 - tail call, X = 7" }, "BF5B": { "unit": "boot/titleBitmapA000", "line": "rts - unreachable, left over from whatever preceded the jmp" }, "BF5C": { "unit": "boot/titleBitmapA000", "block": [ "Three constants, indexed by zero page $60 in the fragment above and stored into the $BA00 sector", "buffer at offset 2 + zp $21: $00, $08, $40." ] }, "BF5F": { "unit": "boot/titleBitmapA000", "block": [ "Prints one prompt: the string at $BB8C in that build's memory (now picture data). Called from", "$BFB0 below." ], "line": "lda #$0B" }, "BF61": { "unit": "boot/titleBitmapA000", "line": "jsr $C7AB" }, "BF64": { "unit": "boot/titleBitmapA000", "line": "lda #$8C" }, "BF66": { "unit": "boot/titleBitmapA000", "line": "ldy #$BB - A/Y = $BB8C, a string in that build" }, "BF68": { "unit": "boot/titleBitmapA000", "line": "jsr $C860 - print it" }, "BF6B": { "unit": "boot/titleBitmapA000", "line": "lda #$0A" }, "BF6D": { "unit": "boot/titleBitmapA000", "line": "jsr $C933" }, "BF70": { "unit": "boot/titleBitmapA000", "line": "lda #$0B" }, "BF72": { "unit": "boot/titleBitmapA000", "line": "jsr $C7AB" }, "BF75": { "unit": "boot/titleBitmapA000", "line": "lda #$00" }, "BF77": { "unit": "boot/titleBitmapA000", "line": "sta $2D" }, "BF79": { "unit": "boot/titleBitmapA000", "line": "jmp $C775 - tail call" }, "BF7C": { "unit": "boot/titleBitmapA000", "block": [ "The main surviving routine: print a message, then ask $C3C4 (that build's checkDiskId, whose", "truncated remains are at $C3C4 in the boot loader file) which disk is in the drive. A = 0 means the", "expected disk is there and it goes straight on to $BFB0; A = 2 means the other disk, in which case", "the two save-slot sectors are pulled off it first." ], "line": "jsr $BE93 - a routine of that build; the picture overwrote it (row 24 of the bitmap)" }, "BF7F": { "unit": "boot/titleBitmapA000", "line": "lda #$5C" }, "BF81": { "unit": "boot/titleBitmapA000", "line": "ldy #$BB - A/Y = $BB5C, another lost string" }, "BF83": { "unit": "boot/titleBitmapA000", "line": "jsr $C860 - print it" }, "BF86": { "unit": "boot/titleBitmapA000", "line": "jsr $C3C4 - checkDiskId: reads the BAM of track 18 to $BA00 and matches $BAA2/$BAA3" }, "BF89": { "unit": "boot/titleBitmapA000", "line": "cmp #$00 - 0 = the disk it wanted is in the drive" }, "BF8B": { "unit": "boot/titleBitmapA000", "line": "beq $BFB0" }, "BF8D": { "unit": "boot/titleBitmapA000", "line": "lda #$07" }, "BF8F": { "unit": "boot/titleBitmapA000", "line": "jsr $C1C6 - prompt / wait, code 7" }, "BF92": { "unit": "boot/titleBitmapA000", "line": "jsr $C3C4 - look again" }, "BF95": { "unit": "boot/titleBitmapA000", "line": "beq $BFB0" }, "BF97": { "unit": "boot/titleBitmapA000", "line": "cmp #$02 - 2 = the other disk of the pair" }, "BF99": { "unit": "boot/titleBitmapA000", "line": "beq $BF9C" }, "BF9B": { "unit": "boot/titleBitmapA000", "line": "rts - anything else: give up" }, "BF9C": { "unit": "boot/titleBitmapA000", "block": [ "Reads track 18 sectors $11 and $12 - the two save slots - into the $BA00 buffer and hands each to", "$C1B3 with X = 0 then X = 1." ], "line": "ldx #$11 - track 18 sector 17, the first save slot" }, "BF9E": { "unit": "boot/titleBitmapA000", "line": "jsr leftoverReadTrack18Sector" }, "BFA1": { "unit": "boot/titleBitmapA000", "line": "ldx #$00" }, "BFA3": { "unit": "boot/titleBitmapA000", "line": "jsr $C1B3 - pass the buffer on as 0" }, "BFA6": { "unit": "boot/titleBitmapA000", "line": "ldx #$12 - track 18 sector 18, the second save slot" }, "BFA8": { "unit": "boot/titleBitmapA000", "line": "jsr leftoverReadTrack18Sector" }, "BFAB": { "unit": "boot/titleBitmapA000", "line": "ldx #$01" }, "BFAD": { "unit": "boot/titleBitmapA000", "line": "jsr $C1B3 - and as 1" }, "BFB0": { "unit": "boot/titleBitmapA000", "block": [ "mapRowAddrLoTable - 40 bytes, $BFB0-$BFD7, one per battlefield row: the LOW byte of the address of", "map row 0-39, i.e. of $F000 + 40*row. The matching high bytes are the separate table", "mapRowAddrHiTable at $BFD8; this is a split lo/hi pointer pair, not a table of addresses, so the two", "halves are typed as bytes.", "Built at start-up by buildMapRowAddressTable ($0339, low byte stored at $034A, high byte at $0345)", "and read by readMapCell ($25FA - low at $25FC, high at $2603) and every other map accessor, so the", "80 bytes $BFB0-$BFFF are live for the whole game. They sit here because these are the last 80 bytes", "of VIC bank 2 above the bitmap (which ends at $BF3F), which is why initBitmapScreen ($2D41) clears", "only $A000-$BF3F.", "What the disk file holds at these addresses is the middle of the leftover routine below - the table", "is written over it before the first map cell is ever read. $BF40-$BFAF, the 112 bytes in front of", "the table, are the only bytes of this file that the game never reads or writes: no label in", "XREF.txt falls between $BF40 and $BFAF, and the bitmap clear stops at $BF3F. The only code that", "ever reaches them is the copy-protection memory wipe at $0A1E, which erases everything.", "The leftover instructions here: after the prompt, keep checking until the right disk is inserted,", "then stamp the serial in." ], "line": "jsr leftoverDiskPrompt - 'insert the other disk'" }, "BFB3": { "unit": "boot/titleBitmapA000", "line": "jsr $BEA7 - another routine of that build, now under the picture" }, "BFB6": { "unit": "boot/titleBitmapA000", "line": "jsr $C3C4 - checkDiskId" }, "BFB9": { "unit": "boot/titleBitmapA000", "line": "cmp #$00" }, "BFBB": { "unit": "boot/titleBitmapA000", "line": "beq $BFC5" }, "BFBD": { "unit": "boot/titleBitmapA000", "line": "lda #$07" }, "BFBF": { "unit": "boot/titleBitmapA000", "line": "jsr $C1C6 - prompt / wait, code 7" }, "BFC2": { "unit": "boot/titleBitmapA000", "line": "jmp $BFB6 - loop until the right disk is in the drive" }, "BFC5": { "unit": "boot/titleBitmapA000", "block": [ "Copies ten bytes from $BE30 (lost under the picture) into the sector buffer at $BAAB - BAM offset", "$AB, the ten-byte disk name/serial that the shipped game reads back at $02AB ($0FF3) and keeps in", "ownPlayerName ($FFDE-$FFE7) so both modem players can prove they run the same disk. Then it hands", "the buffer to $C1B3 and tail-calls $C1C6 with code 5." ], "line": "ldy #$09 - ten bytes, index 9 down to 0" }, "BFC7": { "unit": "boot/titleBitmapA000", "line": "lda $BE30,y - the serial in that build" }, "BFCA": { "unit": "boot/titleBitmapA000", "line": "sta $BAAB,y - into BAM offset $AB of the $BA00 buffer" }, "BFCD": { "unit": "boot/titleBitmapA000", "line": "dey" }, "BFCE": { "unit": "boot/titleBitmapA000", "line": "bpl $BFC7" }, "BFD0": { "unit": "boot/titleBitmapA000", "line": "ldx #$00" }, "BFD2": { "unit": "boot/titleBitmapA000", "line": "jsr $C1B3" }, "BFD5": { "unit": "boot/titleBitmapA000", "line": "lda #$05" }, "BFD7": { "unit": "boot/titleBitmapA000", "line": "jmp opcode ($4C); its operand is the first two bytes of the high-byte table below" }, "BFD8": { "unit": "boot/titleBitmapA000", "block": [ "mapRowAddrHiTable - 40 bytes, $BFD8-$BFFF: the HIGH byte of the address of map row 0-39 ($F000 +", "40*row, so $F0 for rows 0-5, $F1 for 6-12, and so on). Second half of the split pointer pair whose", "low bytes are mapRowAddrLoTable at $BFB0; written at $0345 by buildMapRowAddressTable and read at", "$2603 by readMapCell. On disk these bytes are still the leftover routine (and its trailing filler),", "starting in the middle of the jmp at $BFD7." ], "line": "operand $C1C6 of the jmp at $BFD7" }, "BFDA": { "unit": "boot/titleBitmapA000", "block": [ "Reads one sector of track 18 into the $BA00 buffer with that build's fast loader: X = sector number,", "patched into the LDX below. Called twice from $BF9C." ], "line": "stx $BFE7 - self-modifying: X = the sector number, patched into the ldx at $BFE6" }, "BFDD": { "unit": "boot/titleBitmapA000", "line": "ldx #$00" }, "BFDF": { "unit": "boot/titleBitmapA000", "line": "ldy #$BA - destination $BA00" }, "BFE1": { "unit": "boot/titleBitmapA000", "line": "jsr $CBED - that build's setLoadDest (shipped: $C034 / $085C)" }, "BFE4": { "unit": "boot/titleBitmapA000", "line": "ldy #$12 - track 18" }, "BFE6": { "unit": "boot/titleBitmapA000", "line": "ldx #$00 - sector, patched at $BFDA" }, "BFE8": { "unit": "boot/titleBitmapA000", "line": "lda #$01 - one sector" }, "BFEA": { "unit": "boot/titleBitmapA000", "line": "jmp $CBF2 - that build's sector read (shipped: $C004 / $0804)" }, "BFED": { "unit": "boot/titleBitmapA000", "block": [ "The last 19 bytes of the loaded file: filler, not code and not picture - alternating $00/$FF with a", "stray $0B, the same kind of junk the mastering system left in the unused sector tails elsewhere on", "the disk. At run time these are entries 21-39 of mapRowAddrHiTable." ] } }, "dataTypes": { "A000": [ "grid", 320, 8 ], "A140": [ "grid", 320, 8 ], "A280": [ "grid", 320, 8 ], "A3C0": [ "grid", 320, 8 ], "A500": [ "grid", 320, 8 ], "A640": [ "grid", 320, 8 ], "A780": [ "grid", 320, 8 ], "A8C0": [ "grid", 320, 8 ], "AA00": [ "grid", 234, 8 ], "AAEA": [ "grid", 6, 6 ], "AAF0": [ "grid", 80, 8 ], "AB40": [ "grid", 320, 8 ], "AC80": [ "grid", 320, 8 ], "ADC0": [ "grid", 320, 8 ], "AF00": [ "grid", 320, 8 ], "B040": [ "grid", 320, 8 ], "B180": [ "grid", 320, 8 ], "B2C0": [ "grid", 320, 8 ], "B400": [ "grid", 320, 8 ], "B540": [ "grid", 320, 8 ], "B680": [ "grid", 320, 8 ], "B7C0": [ "grid", 320, 8 ], "B900": [ "grid", 320, 8 ], "BA40": [ "grid", 98, 8 ], "BAA2": [ "grid", 1, 1 ], "BAA3": [ "grid", 5, 5 ], "BAA8": [ "grid", 216, 8 ], "BB80": [ "grid", 320, 8 ], "BCC0": [ "grid", 320, 8 ], "BE00": [ "grid", 296, 8 ], "BF28": [ "grid", 24, 8 ], "BF40": [ "grid", 2, 2 ], "BF42": [ "grid", 2, 2 ], "BF44": [ "grid", 3, 3 ], "BF47": [ "grid", 2, 2 ], "BF49": [ "grid", 2, 2 ], "BF4B": [ "grid", 3, 3 ], "BF4E": [ "grid", 3, 3 ], "BF51": [ "grid", 2, 2 ], "BF53": [ "grid", 3, 3 ], "BF56": [ "grid", 2, 2 ], "BF58": [ "grid", 3, 3 ], "BF5B": [ "grid", 1, 1 ], "BF5C": [ "grid", 3, 3 ], "BF5F": [ "grid", 2, 2 ], "BF61": [ "grid", 3, 3 ], "BF64": [ "grid", 2, 2 ], "BF66": [ "grid", 2, 2 ], "BF68": [ "grid", 3, 3 ], "BF6B": [ "grid", 2, 2 ], "BF6D": [ "grid", 3, 3 ], "BF70": [ "grid", 2, 2 ], "BF72": [ "grid", 3, 3 ], "BF75": [ "grid", 2, 2 ], "BF77": [ "grid", 2, 2 ], "BF79": [ "grid", 3, 3 ], "BF7C": [ "grid", 3, 3 ], "BF7F": [ "grid", 2, 2 ], "BF81": [ "grid", 2, 2 ], "BF83": [ "grid", 3, 3 ], "BF86": [ "grid", 3, 3 ], "BF89": [ "grid", 2, 2 ], "BF8B": [ "grid", 2, 2 ], "BF8D": [ "grid", 2, 2 ], "BF8F": [ "grid", 3, 3 ], "BF92": [ "grid", 3, 3 ], "BF95": [ "grid", 2, 2 ], "BF97": [ "grid", 2, 2 ], "BF99": [ "grid", 2, 2 ], "BF9B": [ "grid", 1, 1 ], "BF9C": [ "grid", 2, 2 ], "BF9E": [ "grid", 3, 3 ], "BFA1": [ "grid", 2, 2 ], "BFA3": [ "grid", 3, 3 ], "BFA6": [ "grid", 2, 2 ], "BFA8": [ "grid", 3, 3 ], "BFAB": [ "grid", 2, 2 ], "BFAD": [ "grid", 3, 3 ], "BFB0": [ "grid", 3, 3 ], "BFB3": [ "grid", 3, 3 ], "BFB6": [ "grid", 3, 3 ], "BFB9": [ "grid", 2, 2 ], "BFBB": [ "grid", 2, 2 ], "BFBD": [ "grid", 2, 2 ], "BFBF": [ "grid", 3, 3 ], "BFC2": [ "grid", 3, 3 ], "BFC5": [ "grid", 2, 2 ], "BFC7": [ "grid", 3, 3 ], "BFCA": [ "grid", 3, 3 ], "BFCD": [ "grid", 1, 1 ], "BFCE": [ "grid", 2, 2 ], "BFD0": [ "grid", 2, 2 ], "BFD2": [ "grid", 3, 3 ], "BFD5": [ "grid", 2, 2 ], "BFD7": [ "grid", 1, 1 ], "BFD8": [ "grid", 2, 2 ], "BFDA": [ "grid", 3, 3 ], "BFDD": [ "grid", 2, 2 ], "BFDF": [ "grid", 2, 2 ], "BFE1": [ "grid", 3, 3 ], "BFE4": [ "grid", 2, 2 ], "BFE6": [ "grid", 2, 2 ], "BFE8": [ "grid", 2, 2 ], "BFEA": [ "grid", 3, 3 ], "BFED": [ "grid", 19, 19 ] } }