From ea95e02f460ec22560c8b404c5b6412c0cdc1384 Mon Sep 17 00:00:00 2001 From: Janne Hellsten Date: Sat, 30 Jan 2021 01:08:09 +0200 Subject: [PATCH] Add segmented assembly support Allow outputting code to user defined "segments". This allows for easier memory layout organization as code organization (e.g., function or data blocks) is not so tightly coupled with source code organization. This commit is snapshotting work -- it still needs a bit of polish especially w.r.t error checking. --- src/asm.ts | 193 +- src/ast.ts | 32 + src/parser.pegjs | 7 + src/segment.ts | 105 + test/cases/lo_hi1.expected.asm | 2607 ---------------------- test/cases/segment1.expected.asm | 23 + test/cases/segment1.input.asm | 17 + test/errors/segment1.errors.txt | 1 + test/errors/segment1.input.asm | 5 + test/errors/segment2.errors.txt | 1 + test/errors/segment2.input.asm | 8 + test/errors/segment3_overflow.errors.txt | 1 + test/errors/segment3_overflow.input.asm | 6 + test/test.ts | 2 +- test/warnings/implicit_pc.input.asm | 3 - test/warnings/implicit_pc.warnings.txt | 1 - 16 files changed, 321 insertions(+), 2691 deletions(-) create mode 100644 src/segment.ts create mode 100644 test/cases/segment1.expected.asm create mode 100644 test/cases/segment1.input.asm create mode 100644 test/errors/segment1.errors.txt create mode 100644 test/errors/segment1.input.asm create mode 100644 test/errors/segment2.errors.txt create mode 100644 test/errors/segment2.input.asm create mode 100644 test/errors/segment3_overflow.errors.txt create mode 100644 test/errors/segment3_overflow.input.asm delete mode 100644 test/warnings/implicit_pc.input.asm delete mode 100644 test/warnings/implicit_pc.warnings.txt diff --git a/src/asm.ts b/src/asm.ts index 4c836bd..dab6445 100644 --- a/src/asm.ts +++ b/src/asm.ts @@ -7,6 +7,7 @@ import * as fs from 'fs' import { toHex16 } from './util' import * as ast from './ast' import { SourceLoc } from './ast' +import { Segment, mergeSegments } from './segment'; import ParseCache from './parseCache' import { DebugInfoTracker } from './debugInfo'; @@ -129,10 +130,9 @@ class NamedScope { } } } - } -type SymEntry = SymLabel | SymVar | SymMacro; +type SymEntry = SymLabel | SymVar | SymMacro | SymSegment; interface SymLabel { type: 'label'; @@ -144,6 +144,11 @@ interface SymVar { data: EvalValue; } +interface SymSegment { + type: 'segment'; + data: Segment; +} + interface SymMacro { type: 'macro'; macro: ast.StmtMacro; @@ -249,6 +254,13 @@ class Scopes { this.curSymtab.updateSymbol(symbolName, newVar, this.passCount); } + declareSegment(name: string, seg: Segment): void { + this.curSymtab.addSymbol(name, { + type: 'segment', + data: seg + }, this.passCount) + } + findMacro(path: string[], absolute: boolean): SymMacro & { seen: number } | undefined { const sym = this.findPath(path, absolute); if (sym !== undefined && sym.type == 'macro') { @@ -376,20 +388,17 @@ function browserRequire(code: Buffer) { } class Assembler { - // TODO this should be a resizable array instead - private binary: number[] = []; - private parseCache = new ParseCache(); private pluginCache = new Map(); private includeStack: string[] = []; - private initialPC = 0; - private codePC = 0; - private codePCSet = false; + private lineLoc: SourceLoc; + private curSegment: Segment = new Segment(0, 0); // invalid, setup at start of pass private pass = 0; needPass = false; private scopes = new Scopes(); + private segments: [string, Segment][] = []; private errorList: Error[] = []; private warningList: Error[] = []; outOfRangeBranches: BranchOffset[] = []; @@ -412,9 +421,10 @@ class Assembler { } prg (): Buffer { - const startLo = this.initialPC & 255; - const startHi = (this.initialPC >> 8) & 255; - return Buffer.from([startLo, startHi].concat(this.binary)) + const { startPC, binary } = mergeSegments(this.segments); + const startLo = startPC & 255; + const startHi = (startPC >> 8) & 255; + return Buffer.concat([Buffer.from([startLo, startHi]), binary]); } parse (filename: string, loc: SourceLoc | undefined) { @@ -506,33 +516,44 @@ class Assembler { } startPass (pass: number): void { - this.codePC = this.platform.defaultStartPC; - this.codePCSet = false; - this.pass = pass; - this.needPass = false; - this.binary = []; - this.errorList = []; - this.scopes.startPass(pass); - this.outOfRangeBranches = []; - this.debugInfo = new DebugInfoTracker(); + this.pass = pass; + this.needPass = false; + this.errorList = []; + this.scopes.startPass(pass); + this.outOfRangeBranches = []; + this.debugInfo = new DebugInfoTracker(); + + // Empty segments list and append default + this.segments = []; + this.curSegment = this.newSegment('default', this.platform.defaultStartPC); + } + + newSegment(name: string, startAddr: number, endAddr?: number): Segment { + const segment = new Segment(startAddr, endAddr); + this.segments.push([name, segment]); + return segment; + } + + getPC(): number { + return this.curSegment.currentPC(); } emitBasicHeader () { - this.emit(0x0c); - this.emit(0x08); - this.emit(0x00); - this.emit(0x00); - this.emit(0x9e); - const addr = 0x80d - const dividers = [10000, 1000, 100, 10, 1] - dividers.forEach(div => { - if (addr >= div) { - this.emit(0x30 + (addr / div) % 10) - } - }); - this.emit(0); - this.emit(0); - this.emit(0); + this.emit(0x0c); + this.emit(0x08); + this.emit(0x00); + this.emit(0x00); + this.emit(0x9e); + const addr = 0x80d; + const dividers = [10000, 1000, 100, 10, 1]; + dividers.forEach((div) => { + if (addr >= div) { + this.emit(0x30 + ((addr / div) % 10)); + } + }); + this.emit(0); + this.emit(0); + this.emit(0); } emitBinary (ast: ast.StmtBinary): void { @@ -814,7 +835,7 @@ class Assembler { } } case 'getcurpc': { - return mkEvalValue(this.codePC); + return mkEvalValue(this.getPC()); } default: break; @@ -823,27 +844,16 @@ class Assembler { return mkErrorValue(0); // TODO is this even reachable? } - setInitialPC (initPC: number) { - if (this.codePCSet) { - throw new Error('PC already set -- shouldn\'t happen'); - } - this.codePC = initPC; - this.codePCSet = true; - this.initialPC = initPC; - } - topLevelSourceLoc (): SourceLoc { const topFilename = this.includeStack[0]; return makeCompileLoc(topFilename); } emit (byte: number): void { - if (!this.codePCSet) { - this.setInitialPC(this.platform.defaultStartPC); - this.addWarning(`Starting program counter not set with '* = addr'. Defaulting to platform default $${toHex16(this.codePC)}`, this.topLevelSourceLoc()); + const err = this.curSegment.emit(byte); + if (err !== undefined) { + this.addError(err, this.lineLoc); // Use closest line error loc for the error } - this.binary.push(byte); - this.codePC += 1 } emit16 (word: number): void { @@ -907,7 +917,7 @@ class Assembler { return true; } const { value: addr } = ev; - const addrDelta = addr - this.codePC - 2; + const addrDelta = addr - this.getPC() - 2; this.emit(opcode); if (addrDelta > 0x7f || addrDelta < -128) { // Defer reporting out of 8-bit range branch targets to the end of the @@ -916,31 +926,16 @@ class Assembler { } this.emit(addrDelta & 0xff); return true; - } + } - setPC (valueExpr: ast.Expr): void { + handleSetPC (valueExpr: ast.Expr): void { const ev = this.evalExprToInt(valueExpr, 'pc'); if (!anyErrors(ev)) { const { value: v } = ev; - - // If codePC has been set in this pass: emit zeros - // to close the gap between the current PC and the desired - // new PC. - // - // If it's not been set yet in this pass, set it to the - // desired value directly. This is the case when the source - // file starts with something like "* = $801" - if (this.codePCSet) { - if (this.codePC > v) { - // TODO this is not great. Actually need to track which ranges of memory have something in them. - this.addError(`Cannot set program counter to a smaller value than current (current: $${toHex16(this.codePC)}, trying to set $${toHex16(v)})`, valueExpr.loc) - } - while (this.codePC < v) { - this.emit(0); - } - } else { - this.setInitialPC(v); + if (!this.curSegment.empty() && this.curSegment.currentPC() > v) { + this.addError(`Cannot set program counter to a smaller value than current (current: $${toHex16(this.curSegment.currentPC())}, trying to set $${toHex16(v)})`, valueExpr.loc); } + this.curSegment.setCurrentPC(v); } } @@ -1001,7 +996,7 @@ class Assembler { this.addError(`Alignment must be a power of two, ${nb} given`, n.loc); return; } - while ((this.codePC & (nb-1)) != 0) { + while ((this.getPC() & (nb-1)) != 0) { this.emit(0); } } @@ -1103,7 +1098,7 @@ class Assembler { break; } case 'setpc': { - this.setPC(node.pc); + this.handleSetPC(node.pc); break; } case 'binary': { @@ -1251,6 +1246,45 @@ class Assembler { this.addError(`The !filescope directive is only allowed as the first directive in a source file`, node.loc); return; } + case 'declare-segment': { + const { name, startAddr, endAddr, loc } = node + + const sym = this.scopes.findQualifiedSym([name.name], false); + // TODO most likely these need some type of extra eval flag + // that restricts that these values can only be evaluated from + // constant inputs, not based on labels. I don't know for sure + // but quite likely setting segment start/end from labels + // will cause multi-pass compilation to not reach fixpoint. + const start = this.evalExpr(startAddr); + const end = this.evalExpr(endAddr); + + if (sym !== undefined && this.scopes.symbolSeen(name.name)) { + this.addError(`Segment '${name.name}' already defined`, node.loc); + return; + } + if (anyErrors(start) || anyErrors(end)) { + return; + } + // TODO assert expression types are numbers for both start/end + const segment = this.newSegment(name.name, start.value, end.value); + this.scopes.declareSegment(name.name, segment); + return; + } + case 'use-segment': { + const { name, loc } = node + const sym = this.scopes.findQualifiedSym(name.path, name.absolute); + if (sym === undefined) { + this.addError(`Use of undeclared segment '${formatSymbolPath(name)}'`, loc); + return; + } + if (sym.type !== 'segment') { + this.addError(`Use of segment '${formatSymbolPath(name)}' that is not a declared segment. Its type is '${sym.type}'`, loc); + return; + } + // TODO should record segment source location and name for later error reporting + this.curSegment = sym.data; + break; + } default: this.addError(`unknown directive ${node.type}`, node.loc); return; @@ -1267,9 +1301,9 @@ class Assembler { const assemble = (lines: ast.AsmLine[]) => { for (let i = 0; i < lines.length; i++) { - this.debugInfo.startLine(lines[i].loc, this.codePC); + this.debugInfo.startLine(lines[i].loc, this.getPC()); this.assembleLine(lines[i]); - this.debugInfo.endLine(this.codePC); + this.debugInfo.endLine(this.getPC()); } } @@ -1306,7 +1340,7 @@ class Assembler { if (this.scopes.symbolSeen(label.name)) { this.addError(`Symbol '${label.name}' already defined`, label.loc); } else { - const labelChanged = this.scopes.declareLabelSymbol(label, this.codePC); + const labelChanged = this.scopes.declareLabelSymbol(label, this.getPC()); if (labelChanged) { this.needPass = true; } @@ -1314,6 +1348,7 @@ class Assembler { } assembleLine (line: ast.AsmLine): void { + this.lineLoc = line.loc; // Empty lines are no-ops if (line.label == null && line.stmt == null && line.scopedStmts == null) { return; @@ -1351,9 +1386,9 @@ class Assembler { // containing machine code instructions. This // is used for smarter disassembly. const withMarkAsInsn = (f: () => void) => { - const startPC = this.codePC; + const startPC = this.getPC(); f(); - const endPC = this.codePC; + const endPC = this.getPC(); this.debugInfo.markAsInstruction(startPC, endPC); } @@ -1494,7 +1529,7 @@ class Assembler { } dumpLabels () { - return this.scopes.dumpLabels(this.codePC); + return this.scopes.dumpLabels(this.getPC()); } } diff --git a/src/ast.ts b/src/ast.ts index 0a78d19..d53b6d9 100644 --- a/src/ast.ts +++ b/src/ast.ts @@ -155,6 +155,8 @@ export type Stmt = | StmtExpr | StmtLoadPlugin | StmtFilescope + | StmtDeclareSegment + | StmtUseSegment export type Insn = any @@ -261,6 +263,18 @@ export interface StmtFilescope extends Node { name: Ident; } +export interface StmtDeclareSegment extends Node { + type: 'declare-segment', + name: Ident; + startAddr: Expr; + endAddr: Expr; +} + +export interface StmtUseSegment extends Node { + type: 'use-segment', + name: ScopeQualifiedIdent; +} + export interface AsmLine extends Node { label: Label | null; stmt: Stmt | null; @@ -415,6 +429,24 @@ export function mkFilescope(name: Ident, loc: SourceLoc): StmtFilescope { } } +export function mkDeclareSegment(name: Ident, startAddr: Expr, endAddr: Expr, loc: SourceLoc): StmtDeclareSegment { + return { + type: 'declare-segment', + name, + startAddr, + endAddr, + loc + } +} + +export function mkUseSegment(name: ScopeQualifiedIdent, loc: SourceLoc): StmtUseSegment { + return { + type: 'use-segment', + name, + loc + } +} + export function mkAsmLine( label: Label | null , stmt: Stmt | null, diff --git a/src/parser.pegjs b/src/parser.pegjs index a10967b..5775a35 100644 --- a/src/parser.pegjs +++ b/src/parser.pegjs @@ -168,6 +168,12 @@ directive = / PSEUDO_FILESCOPE name:identifier { return ast.mkFilescope(name, loc()); } + / PSEUDO_SEGMENT name:identifier LPAR "start" __ EQU s:expr COMMA "end" __ EQU e:expr RPAR { + return ast.mkDeclareSegment(name, s, e, loc()); + } + / PSEUDO_SEGMENT name:scopeQualifiedIdentifier { + return ast.mkUseSegment(name, loc()); + } / PSEUDO_STATEMENT s:execStatement { return s; } @@ -490,6 +496,7 @@ PSEUDO_INCLUDE = "!include" ws PSEUDO_FILL = "!fill" ws PSEUDO_USE = "!use" ws PSEUDO_FILESCOPE = "!filescope" ws +PSEUDO_SEGMENT = "!segment" ws PSEUDO_STATEMENT = "!!" ws LBRK = s:'[' ws { return s; } diff --git a/src/segment.ts b/src/segment.ts new file mode 100644 index 0000000..cd1737e --- /dev/null +++ b/src/segment.ts @@ -0,0 +1,105 @@ + +import { toHex16 } from './util' + +type Block = { start: number, binary: number[] }; + +// { start: number, end: number, cur: number}; +class Segment { + start: number; + end?: number; + curBlock: Block; + blocks: Block[]; + + constructor(start: number, end?: number) { + this.start = start; + this.end = end; + this.blocks = [{ + start: start, + binary: [] + }]; + this.curBlock = this.blocks[0]; + } + + // Setting the current PC will start a new "memory block". A segment + // consists of multiple memory blocks. + setCurrentPC(pc: number) { + const newBlock = { + start: pc, + binary: [] + }; + const idx = this.blocks.push(newBlock); + this.curBlock = this.blocks[idx-1]; + } + + empty(): boolean { + return this.blocks.every(b => b.binary.length === 0); + } + + currentPC(): number { + return this.curBlock.start + this.curBlock.binary.length; + } + + emit(byte: number): string|undefined { + if (this.end !== undefined && this.currentPC() > this.end) { + return `Segment overflow at $${toHex16(this.currentPC())}. Segment address range: $${toHex16(this.start)}-$${toHex16(this.end)}`; + } + this.curBlock.binary.push(byte); + return undefined; + } +} + +// Remove empty segments +function compact(segments: [string, Segment][]): [string, Segment][] { + const out: [string, Segment][] = []; + for (const [name,seg] of segments) { + const compactBlocks = seg.blocks.filter(b => b.binary.length !== 0); + if (compactBlocks.length !== 0) { + const newSeg = new Segment(seg.start, seg.end); + newSeg.blocks = compactBlocks; + newSeg.curBlock = compactBlocks[compactBlocks.length-1]; + out.push([name, newSeg]); + } + } + return out; +} + +function mergeSegments(segments_: [string, Segment][]): { + startPC: number, + binary: Buffer +} { + const segments = compact(segments_); + if (segments.length === 0) { + return { + startPC: 0, + binary: Buffer.from([]) + } + } + + const [_, s0] = segments[0]; + const block0 = s0.blocks[0]; + const blockN = s0.blocks[s0.blocks.length-1]; + let minAddr = block0.start; + let maxAddr = blockN.start + blockN.binary.length; + + for (let i = 1; i < segments.length; i++) { + const s = segments[i][1]; + const firstPC = s.blocks[0].start; + const lastPC = s.curBlock.start + s.curBlock.binary.length; + minAddr = Math.min(firstPC, minAddr); + maxAddr = Math.max(lastPC, maxAddr); + } + + const buf = Buffer.alloc(maxAddr, 0); + for (const [_, seg] of segments) { + for (const b of seg.blocks) { + Buffer.from(b.binary).copy(buf, b.start); + } + } + + return { + startPC: minAddr, + binary: buf.slice(minAddr) + } +} + +export { Segment, mergeSegments }; diff --git a/test/cases/lo_hi1.expected.asm b/test/cases/lo_hi1.expected.asm index b19735d..bcf36bb 100644 --- a/test/cases/lo_hi1.expected.asm +++ b/test/cases/lo_hi1.expected.asm @@ -1,2609 +1,2 @@ 0801: A9 34 LDA #$34 0803: A9 12 LDA #$12 -0805: 00 BRK -0806: 00 BRK -0807: 00 BRK -0808: 00 BRK -0809: 00 BRK -080A: 00 BRK -080B: 00 BRK -080C: 00 BRK -080D: 00 BRK -080E: 00 BRK -080F: 00 BRK -0810: 00 BRK -0811: 00 BRK -0812: 00 BRK -0813: 00 BRK -0814: 00 BRK -0815: 00 BRK -0816: 00 BRK -0817: 00 BRK -0818: 00 BRK -0819: 00 BRK -081A: 00 BRK -081B: 00 BRK -081C: 00 BRK -081D: 00 BRK -081E: 00 BRK -081F: 00 BRK -0820: 00 BRK -0821: 00 BRK -0822: 00 BRK -0823: 00 BRK -0824: 00 BRK -0825: 00 BRK -0826: 00 BRK -0827: 00 BRK -0828: 00 BRK -0829: 00 BRK -082A: 00 BRK -082B: 00 BRK -082C: 00 BRK -082D: 00 BRK -082E: 00 BRK -082F: 00 BRK -0830: 00 BRK -0831: 00 BRK -0832: 00 BRK -0833: 00 BRK -0834: 00 BRK -0835: 00 BRK -0836: 00 BRK -0837: 00 BRK -0838: 00 BRK -0839: 00 BRK -083A: 00 BRK -083B: 00 BRK -083C: 00 BRK -083D: 00 BRK -083E: 00 BRK -083F: 00 BRK -0840: 00 BRK -0841: 00 BRK -0842: 00 BRK -0843: 00 BRK -0844: 00 BRK -0845: 00 BRK -0846: 00 BRK -0847: 00 BRK -0848: 00 BRK -0849: 00 BRK -084A: 00 BRK -084B: 00 BRK -084C: 00 BRK -084D: 00 BRK -084E: 00 BRK -084F: 00 BRK -0850: 00 BRK -0851: 00 BRK -0852: 00 BRK -0853: 00 BRK -0854: 00 BRK -0855: 00 BRK -0856: 00 BRK -0857: 00 BRK -0858: 00 BRK -0859: 00 BRK -085A: 00 BRK -085B: 00 BRK -085C: 00 BRK -085D: 00 BRK -085E: 00 BRK -085F: 00 BRK -0860: 00 BRK -0861: 00 BRK -0862: 00 BRK -0863: 00 BRK -0864: 00 BRK -0865: 00 BRK -0866: 00 BRK -0867: 00 BRK -0868: 00 BRK -0869: 00 BRK -086A: 00 BRK -086B: 00 BRK -086C: 00 BRK -086D: 00 BRK -086E: 00 BRK -086F: 00 BRK -0870: 00 BRK -0871: 00 BRK -0872: 00 BRK -0873: 00 BRK -0874: 00 BRK -0875: 00 BRK -0876: 00 BRK -0877: 00 BRK -0878: 00 BRK -0879: 00 BRK -087A: 00 BRK -087B: 00 BRK -087C: 00 BRK -087D: 00 BRK -087E: 00 BRK -087F: 00 BRK -0880: 00 BRK -0881: 00 BRK -0882: 00 BRK -0883: 00 BRK -0884: 00 BRK -0885: 00 BRK -0886: 00 BRK -0887: 00 BRK -0888: 00 BRK -0889: 00 BRK -088A: 00 BRK -088B: 00 BRK -088C: 00 BRK -088D: 00 BRK -088E: 00 BRK -088F: 00 BRK -0890: 00 BRK -0891: 00 BRK -0892: 00 BRK -0893: 00 BRK -0894: 00 BRK -0895: 00 BRK -0896: 00 BRK -0897: 00 BRK -0898: 00 BRK -0899: 00 BRK -089A: 00 BRK -089B: 00 BRK -089C: 00 BRK -089D: 00 BRK -089E: 00 BRK -089F: 00 BRK -08A0: 00 BRK -08A1: 00 BRK -08A2: 00 BRK -08A3: 00 BRK -08A4: 00 BRK -08A5: 00 BRK -08A6: 00 BRK -08A7: 00 BRK -08A8: 00 BRK -08A9: 00 BRK -08AA: 00 BRK -08AB: 00 BRK -08AC: 00 BRK -08AD: 00 BRK -08AE: 00 BRK -08AF: 00 BRK -08B0: 00 BRK -08B1: 00 BRK -08B2: 00 BRK -08B3: 00 BRK -08B4: 00 BRK -08B5: 00 BRK -08B6: 00 BRK -08B7: 00 BRK -08B8: 00 BRK -08B9: 00 BRK -08BA: 00 BRK -08BB: 00 BRK -08BC: 00 BRK -08BD: 00 BRK -08BE: 00 BRK -08BF: 00 BRK -08C0: 00 BRK -08C1: 00 BRK -08C2: 00 BRK -08C3: 00 BRK -08C4: 00 BRK -08C5: 00 BRK -08C6: 00 BRK -08C7: 00 BRK -08C8: 00 BRK -08C9: 00 BRK -08CA: 00 BRK -08CB: 00 BRK -08CC: 00 BRK -08CD: 00 BRK -08CE: 00 BRK -08CF: 00 BRK -08D0: 00 BRK -08D1: 00 BRK -08D2: 00 BRK -08D3: 00 BRK -08D4: 00 BRK -08D5: 00 BRK -08D6: 00 BRK -08D7: 00 BRK -08D8: 00 BRK -08D9: 00 BRK -08DA: 00 BRK -08DB: 00 BRK -08DC: 00 BRK -08DD: 00 BRK -08DE: 00 BRK -08DF: 00 BRK -08E0: 00 BRK -08E1: 00 BRK -08E2: 00 BRK -08E3: 00 BRK -08E4: 00 BRK -08E5: 00 BRK -08E6: 00 BRK -08E7: 00 BRK -08E8: 00 BRK -08E9: 00 BRK -08EA: 00 BRK -08EB: 00 BRK -08EC: 00 BRK -08ED: 00 BRK -08EE: 00 BRK -08EF: 00 BRK -08F0: 00 BRK -08F1: 00 BRK -08F2: 00 BRK -08F3: 00 BRK -08F4: 00 BRK -08F5: 00 BRK -08F6: 00 BRK -08F7: 00 BRK -08F8: 00 BRK -08F9: 00 BRK -08FA: 00 BRK -08FB: 00 BRK -08FC: 00 BRK -08FD: 00 BRK -08FE: 00 BRK -08FF: 00 BRK -0900: 00 BRK -0901: 00 BRK -0902: 00 BRK -0903: 00 BRK -0904: 00 BRK -0905: 00 BRK -0906: 00 BRK -0907: 00 BRK -0908: 00 BRK -0909: 00 BRK -090A: 00 BRK -090B: 00 BRK -090C: 00 BRK -090D: 00 BRK -090E: 00 BRK -090F: 00 BRK -0910: 00 BRK -0911: 00 BRK -0912: 00 BRK -0913: 00 BRK -0914: 00 BRK -0915: 00 BRK -0916: 00 BRK -0917: 00 BRK -0918: 00 BRK -0919: 00 BRK -091A: 00 BRK -091B: 00 BRK -091C: 00 BRK -091D: 00 BRK -091E: 00 BRK -091F: 00 BRK -0920: 00 BRK -0921: 00 BRK -0922: 00 BRK -0923: 00 BRK -0924: 00 BRK -0925: 00 BRK -0926: 00 BRK -0927: 00 BRK -0928: 00 BRK -0929: 00 BRK -092A: 00 BRK -092B: 00 BRK -092C: 00 BRK -092D: 00 BRK -092E: 00 BRK -092F: 00 BRK -0930: 00 BRK -0931: 00 BRK -0932: 00 BRK -0933: 00 BRK -0934: 00 BRK -0935: 00 BRK -0936: 00 BRK -0937: 00 BRK -0938: 00 BRK -0939: 00 BRK -093A: 00 BRK -093B: 00 BRK -093C: 00 BRK -093D: 00 BRK -093E: 00 BRK -093F: 00 BRK -0940: 00 BRK -0941: 00 BRK -0942: 00 BRK -0943: 00 BRK -0944: 00 BRK -0945: 00 BRK -0946: 00 BRK -0947: 00 BRK -0948: 00 BRK -0949: 00 BRK -094A: 00 BRK -094B: 00 BRK -094C: 00 BRK -094D: 00 BRK -094E: 00 BRK -094F: 00 BRK -0950: 00 BRK -0951: 00 BRK -0952: 00 BRK -0953: 00 BRK -0954: 00 BRK -0955: 00 BRK -0956: 00 BRK -0957: 00 BRK -0958: 00 BRK -0959: 00 BRK -095A: 00 BRK -095B: 00 BRK -095C: 00 BRK -095D: 00 BRK -095E: 00 BRK -095F: 00 BRK -0960: 00 BRK -0961: 00 BRK -0962: 00 BRK -0963: 00 BRK -0964: 00 BRK -0965: 00 BRK -0966: 00 BRK -0967: 00 BRK -0968: 00 BRK -0969: 00 BRK -096A: 00 BRK -096B: 00 BRK -096C: 00 BRK -096D: 00 BRK -096E: 00 BRK -096F: 00 BRK -0970: 00 BRK -0971: 00 BRK -0972: 00 BRK -0973: 00 BRK -0974: 00 BRK -0975: 00 BRK -0976: 00 BRK -0977: 00 BRK -0978: 00 BRK -0979: 00 BRK -097A: 00 BRK -097B: 00 BRK -097C: 00 BRK -097D: 00 BRK -097E: 00 BRK -097F: 00 BRK -0980: 00 BRK -0981: 00 BRK -0982: 00 BRK -0983: 00 BRK -0984: 00 BRK -0985: 00 BRK -0986: 00 BRK -0987: 00 BRK -0988: 00 BRK -0989: 00 BRK -098A: 00 BRK -098B: 00 BRK -098C: 00 BRK -098D: 00 BRK -098E: 00 BRK -098F: 00 BRK -0990: 00 BRK -0991: 00 BRK -0992: 00 BRK -0993: 00 BRK -0994: 00 BRK -0995: 00 BRK -0996: 00 BRK -0997: 00 BRK -0998: 00 BRK -0999: 00 BRK -099A: 00 BRK -099B: 00 BRK -099C: 00 BRK -099D: 00 BRK -099E: 00 BRK -099F: 00 BRK -09A0: 00 BRK -09A1: 00 BRK -09A2: 00 BRK -09A3: 00 BRK -09A4: 00 BRK -09A5: 00 BRK -09A6: 00 BRK -09A7: 00 BRK -09A8: 00 BRK -09A9: 00 BRK -09AA: 00 BRK -09AB: 00 BRK -09AC: 00 BRK -09AD: 00 BRK -09AE: 00 BRK -09AF: 00 BRK -09B0: 00 BRK -09B1: 00 BRK -09B2: 00 BRK -09B3: 00 BRK -09B4: 00 BRK -09B5: 00 BRK -09B6: 00 BRK -09B7: 00 BRK -09B8: 00 BRK -09B9: 00 BRK -09BA: 00 BRK -09BB: 00 BRK -09BC: 00 BRK -09BD: 00 BRK -09BE: 00 BRK -09BF: 00 BRK -09C0: 00 BRK -09C1: 00 BRK -09C2: 00 BRK -09C3: 00 BRK -09C4: 00 BRK -09C5: 00 BRK -09C6: 00 BRK -09C7: 00 BRK -09C8: 00 BRK -09C9: 00 BRK -09CA: 00 BRK -09CB: 00 BRK -09CC: 00 BRK -09CD: 00 BRK -09CE: 00 BRK -09CF: 00 BRK -09D0: 00 BRK -09D1: 00 BRK -09D2: 00 BRK -09D3: 00 BRK -09D4: 00 BRK -09D5: 00 BRK -09D6: 00 BRK -09D7: 00 BRK -09D8: 00 BRK -09D9: 00 BRK -09DA: 00 BRK -09DB: 00 BRK -09DC: 00 BRK -09DD: 00 BRK -09DE: 00 BRK -09DF: 00 BRK -09E0: 00 BRK -09E1: 00 BRK -09E2: 00 BRK -09E3: 00 BRK -09E4: 00 BRK -09E5: 00 BRK -09E6: 00 BRK -09E7: 00 BRK -09E8: 00 BRK -09E9: 00 BRK -09EA: 00 BRK -09EB: 00 BRK -09EC: 00 BRK -09ED: 00 BRK -09EE: 00 BRK -09EF: 00 BRK -09F0: 00 BRK -09F1: 00 BRK -09F2: 00 BRK -09F3: 00 BRK -09F4: 00 BRK -09F5: 00 BRK -09F6: 00 BRK -09F7: 00 BRK -09F8: 00 BRK -09F9: 00 BRK -09FA: 00 BRK -09FB: 00 BRK -09FC: 00 BRK -09FD: 00 BRK -09FE: 00 BRK -09FF: 00 BRK -0A00: 00 BRK -0A01: 00 BRK -0A02: 00 BRK -0A03: 00 BRK -0A04: 00 BRK -0A05: 00 BRK -0A06: 00 BRK -0A07: 00 BRK -0A08: 00 BRK -0A09: 00 BRK -0A0A: 00 BRK -0A0B: 00 BRK -0A0C: 00 BRK -0A0D: 00 BRK -0A0E: 00 BRK -0A0F: 00 BRK -0A10: 00 BRK -0A11: 00 BRK -0A12: 00 BRK -0A13: 00 BRK -0A14: 00 BRK -0A15: 00 BRK -0A16: 00 BRK -0A17: 00 BRK -0A18: 00 BRK -0A19: 00 BRK -0A1A: 00 BRK -0A1B: 00 BRK -0A1C: 00 BRK -0A1D: 00 BRK -0A1E: 00 BRK -0A1F: 00 BRK -0A20: 00 BRK -0A21: 00 BRK -0A22: 00 BRK -0A23: 00 BRK -0A24: 00 BRK -0A25: 00 BRK -0A26: 00 BRK -0A27: 00 BRK -0A28: 00 BRK -0A29: 00 BRK -0A2A: 00 BRK -0A2B: 00 BRK -0A2C: 00 BRK -0A2D: 00 BRK -0A2E: 00 BRK -0A2F: 00 BRK -0A30: 00 BRK -0A31: 00 BRK -0A32: 00 BRK -0A33: 00 BRK -0A34: 00 BRK -0A35: 00 BRK -0A36: 00 BRK -0A37: 00 BRK -0A38: 00 BRK -0A39: 00 BRK -0A3A: 00 BRK -0A3B: 00 BRK -0A3C: 00 BRK -0A3D: 00 BRK -0A3E: 00 BRK -0A3F: 00 BRK -0A40: 00 BRK -0A41: 00 BRK -0A42: 00 BRK -0A43: 00 BRK -0A44: 00 BRK -0A45: 00 BRK -0A46: 00 BRK -0A47: 00 BRK -0A48: 00 BRK -0A49: 00 BRK -0A4A: 00 BRK -0A4B: 00 BRK -0A4C: 00 BRK -0A4D: 00 BRK -0A4E: 00 BRK -0A4F: 00 BRK -0A50: 00 BRK -0A51: 00 BRK -0A52: 00 BRK -0A53: 00 BRK -0A54: 00 BRK -0A55: 00 BRK -0A56: 00 BRK -0A57: 00 BRK -0A58: 00 BRK -0A59: 00 BRK -0A5A: 00 BRK -0A5B: 00 BRK -0A5C: 00 BRK -0A5D: 00 BRK -0A5E: 00 BRK -0A5F: 00 BRK -0A60: 00 BRK -0A61: 00 BRK -0A62: 00 BRK -0A63: 00 BRK -0A64: 00 BRK -0A65: 00 BRK -0A66: 00 BRK -0A67: 00 BRK -0A68: 00 BRK -0A69: 00 BRK -0A6A: 00 BRK -0A6B: 00 BRK -0A6C: 00 BRK -0A6D: 00 BRK -0A6E: 00 BRK -0A6F: 00 BRK -0A70: 00 BRK -0A71: 00 BRK -0A72: 00 BRK -0A73: 00 BRK -0A74: 00 BRK -0A75: 00 BRK -0A76: 00 BRK -0A77: 00 BRK -0A78: 00 BRK -0A79: 00 BRK -0A7A: 00 BRK -0A7B: 00 BRK -0A7C: 00 BRK -0A7D: 00 BRK -0A7E: 00 BRK -0A7F: 00 BRK -0A80: 00 BRK -0A81: 00 BRK -0A82: 00 BRK -0A83: 00 BRK -0A84: 00 BRK -0A85: 00 BRK -0A86: 00 BRK -0A87: 00 BRK -0A88: 00 BRK -0A89: 00 BRK -0A8A: 00 BRK -0A8B: 00 BRK -0A8C: 00 BRK -0A8D: 00 BRK -0A8E: 00 BRK -0A8F: 00 BRK -0A90: 00 BRK -0A91: 00 BRK -0A92: 00 BRK -0A93: 00 BRK -0A94: 00 BRK -0A95: 00 BRK -0A96: 00 BRK -0A97: 00 BRK -0A98: 00 BRK -0A99: 00 BRK -0A9A: 00 BRK -0A9B: 00 BRK -0A9C: 00 BRK -0A9D: 00 BRK -0A9E: 00 BRK -0A9F: 00 BRK -0AA0: 00 BRK -0AA1: 00 BRK -0AA2: 00 BRK -0AA3: 00 BRK -0AA4: 00 BRK -0AA5: 00 BRK -0AA6: 00 BRK -0AA7: 00 BRK -0AA8: 00 BRK -0AA9: 00 BRK -0AAA: 00 BRK -0AAB: 00 BRK -0AAC: 00 BRK -0AAD: 00 BRK -0AAE: 00 BRK -0AAF: 00 BRK -0AB0: 00 BRK -0AB1: 00 BRK -0AB2: 00 BRK -0AB3: 00 BRK -0AB4: 00 BRK -0AB5: 00 BRK -0AB6: 00 BRK -0AB7: 00 BRK -0AB8: 00 BRK -0AB9: 00 BRK -0ABA: 00 BRK -0ABB: 00 BRK -0ABC: 00 BRK -0ABD: 00 BRK -0ABE: 00 BRK -0ABF: 00 BRK -0AC0: 00 BRK -0AC1: 00 BRK -0AC2: 00 BRK -0AC3: 00 BRK -0AC4: 00 BRK -0AC5: 00 BRK -0AC6: 00 BRK -0AC7: 00 BRK -0AC8: 00 BRK -0AC9: 00 BRK -0ACA: 00 BRK -0ACB: 00 BRK -0ACC: 00 BRK -0ACD: 00 BRK -0ACE: 00 BRK -0ACF: 00 BRK -0AD0: 00 BRK -0AD1: 00 BRK -0AD2: 00 BRK -0AD3: 00 BRK -0AD4: 00 BRK -0AD5: 00 BRK -0AD6: 00 BRK -0AD7: 00 BRK -0AD8: 00 BRK -0AD9: 00 BRK -0ADA: 00 BRK -0ADB: 00 BRK -0ADC: 00 BRK -0ADD: 00 BRK -0ADE: 00 BRK -0ADF: 00 BRK -0AE0: 00 BRK -0AE1: 00 BRK -0AE2: 00 BRK -0AE3: 00 BRK -0AE4: 00 BRK -0AE5: 00 BRK -0AE6: 00 BRK -0AE7: 00 BRK -0AE8: 00 BRK -0AE9: 00 BRK -0AEA: 00 BRK -0AEB: 00 BRK -0AEC: 00 BRK -0AED: 00 BRK -0AEE: 00 BRK -0AEF: 00 BRK -0AF0: 00 BRK -0AF1: 00 BRK -0AF2: 00 BRK -0AF3: 00 BRK -0AF4: 00 BRK -0AF5: 00 BRK -0AF6: 00 BRK -0AF7: 00 BRK -0AF8: 00 BRK -0AF9: 00 BRK -0AFA: 00 BRK -0AFB: 00 BRK -0AFC: 00 BRK -0AFD: 00 BRK -0AFE: 00 BRK -0AFF: 00 BRK -0B00: 00 BRK -0B01: 00 BRK -0B02: 00 BRK -0B03: 00 BRK -0B04: 00 BRK -0B05: 00 BRK -0B06: 00 BRK -0B07: 00 BRK -0B08: 00 BRK -0B09: 00 BRK -0B0A: 00 BRK -0B0B: 00 BRK -0B0C: 00 BRK -0B0D: 00 BRK -0B0E: 00 BRK -0B0F: 00 BRK -0B10: 00 BRK -0B11: 00 BRK -0B12: 00 BRK -0B13: 00 BRK -0B14: 00 BRK -0B15: 00 BRK -0B16: 00 BRK -0B17: 00 BRK -0B18: 00 BRK -0B19: 00 BRK -0B1A: 00 BRK -0B1B: 00 BRK -0B1C: 00 BRK -0B1D: 00 BRK -0B1E: 00 BRK -0B1F: 00 BRK -0B20: 00 BRK -0B21: 00 BRK -0B22: 00 BRK -0B23: 00 BRK -0B24: 00 BRK -0B25: 00 BRK -0B26: 00 BRK -0B27: 00 BRK -0B28: 00 BRK -0B29: 00 BRK -0B2A: 00 BRK -0B2B: 00 BRK -0B2C: 00 BRK -0B2D: 00 BRK -0B2E: 00 BRK -0B2F: 00 BRK -0B30: 00 BRK -0B31: 00 BRK -0B32: 00 BRK -0B33: 00 BRK -0B34: 00 BRK -0B35: 00 BRK -0B36: 00 BRK -0B37: 00 BRK -0B38: 00 BRK -0B39: 00 BRK -0B3A: 00 BRK -0B3B: 00 BRK -0B3C: 00 BRK -0B3D: 00 BRK -0B3E: 00 BRK -0B3F: 00 BRK -0B40: 00 BRK -0B41: 00 BRK -0B42: 00 BRK -0B43: 00 BRK -0B44: 00 BRK -0B45: 00 BRK -0B46: 00 BRK -0B47: 00 BRK -0B48: 00 BRK -0B49: 00 BRK -0B4A: 00 BRK -0B4B: 00 BRK -0B4C: 00 BRK -0B4D: 00 BRK -0B4E: 00 BRK -0B4F: 00 BRK -0B50: 00 BRK -0B51: 00 BRK -0B52: 00 BRK -0B53: 00 BRK -0B54: 00 BRK -0B55: 00 BRK -0B56: 00 BRK -0B57: 00 BRK -0B58: 00 BRK -0B59: 00 BRK -0B5A: 00 BRK -0B5B: 00 BRK -0B5C: 00 BRK -0B5D: 00 BRK -0B5E: 00 BRK -0B5F: 00 BRK -0B60: 00 BRK -0B61: 00 BRK -0B62: 00 BRK -0B63: 00 BRK -0B64: 00 BRK -0B65: 00 BRK -0B66: 00 BRK -0B67: 00 BRK -0B68: 00 BRK -0B69: 00 BRK -0B6A: 00 BRK -0B6B: 00 BRK -0B6C: 00 BRK -0B6D: 00 BRK -0B6E: 00 BRK -0B6F: 00 BRK -0B70: 00 BRK -0B71: 00 BRK -0B72: 00 BRK -0B73: 00 BRK -0B74: 00 BRK -0B75: 00 BRK -0B76: 00 BRK -0B77: 00 BRK -0B78: 00 BRK -0B79: 00 BRK -0B7A: 00 BRK -0B7B: 00 BRK -0B7C: 00 BRK -0B7D: 00 BRK -0B7E: 00 BRK -0B7F: 00 BRK -0B80: 00 BRK -0B81: 00 BRK -0B82: 00 BRK -0B83: 00 BRK -0B84: 00 BRK -0B85: 00 BRK -0B86: 00 BRK -0B87: 00 BRK -0B88: 00 BRK -0B89: 00 BRK -0B8A: 00 BRK -0B8B: 00 BRK -0B8C: 00 BRK -0B8D: 00 BRK -0B8E: 00 BRK -0B8F: 00 BRK -0B90: 00 BRK -0B91: 00 BRK -0B92: 00 BRK -0B93: 00 BRK -0B94: 00 BRK -0B95: 00 BRK -0B96: 00 BRK -0B97: 00 BRK -0B98: 00 BRK -0B99: 00 BRK -0B9A: 00 BRK -0B9B: 00 BRK -0B9C: 00 BRK -0B9D: 00 BRK -0B9E: 00 BRK -0B9F: 00 BRK -0BA0: 00 BRK -0BA1: 00 BRK -0BA2: 00 BRK -0BA3: 00 BRK -0BA4: 00 BRK -0BA5: 00 BRK -0BA6: 00 BRK -0BA7: 00 BRK -0BA8: 00 BRK -0BA9: 00 BRK -0BAA: 00 BRK -0BAB: 00 BRK -0BAC: 00 BRK -0BAD: 00 BRK -0BAE: 00 BRK -0BAF: 00 BRK -0BB0: 00 BRK -0BB1: 00 BRK -0BB2: 00 BRK -0BB3: 00 BRK -0BB4: 00 BRK -0BB5: 00 BRK -0BB6: 00 BRK -0BB7: 00 BRK -0BB8: 00 BRK -0BB9: 00 BRK -0BBA: 00 BRK -0BBB: 00 BRK -0BBC: 00 BRK -0BBD: 00 BRK -0BBE: 00 BRK -0BBF: 00 BRK -0BC0: 00 BRK -0BC1: 00 BRK -0BC2: 00 BRK -0BC3: 00 BRK -0BC4: 00 BRK -0BC5: 00 BRK -0BC6: 00 BRK -0BC7: 00 BRK -0BC8: 00 BRK -0BC9: 00 BRK -0BCA: 00 BRK -0BCB: 00 BRK -0BCC: 00 BRK -0BCD: 00 BRK -0BCE: 00 BRK -0BCF: 00 BRK -0BD0: 00 BRK -0BD1: 00 BRK -0BD2: 00 BRK -0BD3: 00 BRK -0BD4: 00 BRK -0BD5: 00 BRK -0BD6: 00 BRK -0BD7: 00 BRK -0BD8: 00 BRK -0BD9: 00 BRK -0BDA: 00 BRK -0BDB: 00 BRK -0BDC: 00 BRK -0BDD: 00 BRK -0BDE: 00 BRK -0BDF: 00 BRK -0BE0: 00 BRK -0BE1: 00 BRK -0BE2: 00 BRK -0BE3: 00 BRK -0BE4: 00 BRK -0BE5: 00 BRK -0BE6: 00 BRK -0BE7: 00 BRK -0BE8: 00 BRK -0BE9: 00 BRK -0BEA: 00 BRK -0BEB: 00 BRK -0BEC: 00 BRK -0BED: 00 BRK -0BEE: 00 BRK -0BEF: 00 BRK -0BF0: 00 BRK -0BF1: 00 BRK -0BF2: 00 BRK -0BF3: 00 BRK -0BF4: 00 BRK -0BF5: 00 BRK -0BF6: 00 BRK -0BF7: 00 BRK -0BF8: 00 BRK -0BF9: 00 BRK -0BFA: 00 BRK -0BFB: 00 BRK -0BFC: 00 BRK -0BFD: 00 BRK -0BFE: 00 BRK -0BFF: 00 BRK -0C00: 00 BRK -0C01: 00 BRK -0C02: 00 BRK -0C03: 00 BRK -0C04: 00 BRK -0C05: 00 BRK -0C06: 00 BRK -0C07: 00 BRK -0C08: 00 BRK -0C09: 00 BRK -0C0A: 00 BRK -0C0B: 00 BRK -0C0C: 00 BRK -0C0D: 00 BRK -0C0E: 00 BRK -0C0F: 00 BRK -0C10: 00 BRK -0C11: 00 BRK -0C12: 00 BRK -0C13: 00 BRK -0C14: 00 BRK -0C15: 00 BRK -0C16: 00 BRK -0C17: 00 BRK -0C18: 00 BRK -0C19: 00 BRK -0C1A: 00 BRK -0C1B: 00 BRK -0C1C: 00 BRK -0C1D: 00 BRK -0C1E: 00 BRK -0C1F: 00 BRK -0C20: 00 BRK -0C21: 00 BRK -0C22: 00 BRK -0C23: 00 BRK -0C24: 00 BRK -0C25: 00 BRK -0C26: 00 BRK -0C27: 00 BRK -0C28: 00 BRK -0C29: 00 BRK -0C2A: 00 BRK -0C2B: 00 BRK -0C2C: 00 BRK -0C2D: 00 BRK -0C2E: 00 BRK -0C2F: 00 BRK -0C30: 00 BRK -0C31: 00 BRK -0C32: 00 BRK -0C33: 00 BRK -0C34: 00 BRK -0C35: 00 BRK -0C36: 00 BRK -0C37: 00 BRK -0C38: 00 BRK -0C39: 00 BRK -0C3A: 00 BRK -0C3B: 00 BRK -0C3C: 00 BRK -0C3D: 00 BRK -0C3E: 00 BRK -0C3F: 00 BRK -0C40: 00 BRK -0C41: 00 BRK -0C42: 00 BRK -0C43: 00 BRK -0C44: 00 BRK -0C45: 00 BRK -0C46: 00 BRK -0C47: 00 BRK -0C48: 00 BRK -0C49: 00 BRK -0C4A: 00 BRK -0C4B: 00 BRK -0C4C: 00 BRK -0C4D: 00 BRK -0C4E: 00 BRK -0C4F: 00 BRK -0C50: 00 BRK -0C51: 00 BRK -0C52: 00 BRK -0C53: 00 BRK -0C54: 00 BRK -0C55: 00 BRK -0C56: 00 BRK -0C57: 00 BRK -0C58: 00 BRK -0C59: 00 BRK -0C5A: 00 BRK -0C5B: 00 BRK -0C5C: 00 BRK -0C5D: 00 BRK -0C5E: 00 BRK -0C5F: 00 BRK -0C60: 00 BRK -0C61: 00 BRK -0C62: 00 BRK -0C63: 00 BRK -0C64: 00 BRK -0C65: 00 BRK -0C66: 00 BRK -0C67: 00 BRK -0C68: 00 BRK -0C69: 00 BRK -0C6A: 00 BRK -0C6B: 00 BRK -0C6C: 00 BRK -0C6D: 00 BRK -0C6E: 00 BRK -0C6F: 00 BRK -0C70: 00 BRK -0C71: 00 BRK -0C72: 00 BRK -0C73: 00 BRK -0C74: 00 BRK -0C75: 00 BRK -0C76: 00 BRK -0C77: 00 BRK -0C78: 00 BRK -0C79: 00 BRK -0C7A: 00 BRK -0C7B: 00 BRK -0C7C: 00 BRK -0C7D: 00 BRK -0C7E: 00 BRK -0C7F: 00 BRK -0C80: 00 BRK -0C81: 00 BRK -0C82: 00 BRK -0C83: 00 BRK -0C84: 00 BRK -0C85: 00 BRK -0C86: 00 BRK -0C87: 00 BRK -0C88: 00 BRK -0C89: 00 BRK -0C8A: 00 BRK -0C8B: 00 BRK -0C8C: 00 BRK -0C8D: 00 BRK -0C8E: 00 BRK -0C8F: 00 BRK -0C90: 00 BRK -0C91: 00 BRK -0C92: 00 BRK -0C93: 00 BRK -0C94: 00 BRK -0C95: 00 BRK -0C96: 00 BRK -0C97: 00 BRK -0C98: 00 BRK -0C99: 00 BRK -0C9A: 00 BRK -0C9B: 00 BRK -0C9C: 00 BRK -0C9D: 00 BRK -0C9E: 00 BRK -0C9F: 00 BRK -0CA0: 00 BRK -0CA1: 00 BRK -0CA2: 00 BRK -0CA3: 00 BRK -0CA4: 00 BRK -0CA5: 00 BRK -0CA6: 00 BRK -0CA7: 00 BRK -0CA8: 00 BRK -0CA9: 00 BRK -0CAA: 00 BRK -0CAB: 00 BRK -0CAC: 00 BRK -0CAD: 00 BRK -0CAE: 00 BRK -0CAF: 00 BRK -0CB0: 00 BRK -0CB1: 00 BRK -0CB2: 00 BRK -0CB3: 00 BRK -0CB4: 00 BRK -0CB5: 00 BRK -0CB6: 00 BRK -0CB7: 00 BRK -0CB8: 00 BRK -0CB9: 00 BRK -0CBA: 00 BRK -0CBB: 00 BRK -0CBC: 00 BRK -0CBD: 00 BRK -0CBE: 00 BRK -0CBF: 00 BRK -0CC0: 00 BRK -0CC1: 00 BRK -0CC2: 00 BRK -0CC3: 00 BRK -0CC4: 00 BRK -0CC5: 00 BRK -0CC6: 00 BRK -0CC7: 00 BRK -0CC8: 00 BRK -0CC9: 00 BRK -0CCA: 00 BRK -0CCB: 00 BRK -0CCC: 00 BRK -0CCD: 00 BRK -0CCE: 00 BRK -0CCF: 00 BRK -0CD0: 00 BRK -0CD1: 00 BRK -0CD2: 00 BRK -0CD3: 00 BRK -0CD4: 00 BRK -0CD5: 00 BRK -0CD6: 00 BRK -0CD7: 00 BRK -0CD8: 00 BRK -0CD9: 00 BRK -0CDA: 00 BRK -0CDB: 00 BRK -0CDC: 00 BRK -0CDD: 00 BRK -0CDE: 00 BRK -0CDF: 00 BRK -0CE0: 00 BRK -0CE1: 00 BRK -0CE2: 00 BRK -0CE3: 00 BRK -0CE4: 00 BRK -0CE5: 00 BRK -0CE6: 00 BRK -0CE7: 00 BRK -0CE8: 00 BRK -0CE9: 00 BRK -0CEA: 00 BRK -0CEB: 00 BRK -0CEC: 00 BRK -0CED: 00 BRK -0CEE: 00 BRK -0CEF: 00 BRK -0CF0: 00 BRK -0CF1: 00 BRK -0CF2: 00 BRK -0CF3: 00 BRK -0CF4: 00 BRK -0CF5: 00 BRK -0CF6: 00 BRK -0CF7: 00 BRK -0CF8: 00 BRK -0CF9: 00 BRK -0CFA: 00 BRK -0CFB: 00 BRK -0CFC: 00 BRK -0CFD: 00 BRK -0CFE: 00 BRK -0CFF: 00 BRK -0D00: 00 BRK -0D01: 00 BRK -0D02: 00 BRK -0D03: 00 BRK -0D04: 00 BRK -0D05: 00 BRK -0D06: 00 BRK -0D07: 00 BRK -0D08: 00 BRK -0D09: 00 BRK -0D0A: 00 BRK -0D0B: 00 BRK -0D0C: 00 BRK -0D0D: 00 BRK -0D0E: 00 BRK -0D0F: 00 BRK -0D10: 00 BRK -0D11: 00 BRK -0D12: 00 BRK -0D13: 00 BRK -0D14: 00 BRK -0D15: 00 BRK -0D16: 00 BRK -0D17: 00 BRK -0D18: 00 BRK -0D19: 00 BRK -0D1A: 00 BRK -0D1B: 00 BRK -0D1C: 00 BRK -0D1D: 00 BRK -0D1E: 00 BRK -0D1F: 00 BRK -0D20: 00 BRK -0D21: 00 BRK -0D22: 00 BRK -0D23: 00 BRK -0D24: 00 BRK -0D25: 00 BRK -0D26: 00 BRK -0D27: 00 BRK -0D28: 00 BRK -0D29: 00 BRK -0D2A: 00 BRK -0D2B: 00 BRK -0D2C: 00 BRK -0D2D: 00 BRK -0D2E: 00 BRK -0D2F: 00 BRK -0D30: 00 BRK -0D31: 00 BRK -0D32: 00 BRK -0D33: 00 BRK -0D34: 00 BRK -0D35: 00 BRK -0D36: 00 BRK -0D37: 00 BRK -0D38: 00 BRK -0D39: 00 BRK -0D3A: 00 BRK -0D3B: 00 BRK -0D3C: 00 BRK -0D3D: 00 BRK -0D3E: 00 BRK -0D3F: 00 BRK -0D40: 00 BRK -0D41: 00 BRK -0D42: 00 BRK -0D43: 00 BRK -0D44: 00 BRK -0D45: 00 BRK -0D46: 00 BRK -0D47: 00 BRK -0D48: 00 BRK -0D49: 00 BRK -0D4A: 00 BRK -0D4B: 00 BRK -0D4C: 00 BRK -0D4D: 00 BRK -0D4E: 00 BRK -0D4F: 00 BRK -0D50: 00 BRK -0D51: 00 BRK -0D52: 00 BRK -0D53: 00 BRK -0D54: 00 BRK -0D55: 00 BRK -0D56: 00 BRK -0D57: 00 BRK -0D58: 00 BRK -0D59: 00 BRK -0D5A: 00 BRK -0D5B: 00 BRK -0D5C: 00 BRK -0D5D: 00 BRK -0D5E: 00 BRK -0D5F: 00 BRK -0D60: 00 BRK -0D61: 00 BRK -0D62: 00 BRK -0D63: 00 BRK -0D64: 00 BRK -0D65: 00 BRK -0D66: 00 BRK -0D67: 00 BRK -0D68: 00 BRK -0D69: 00 BRK -0D6A: 00 BRK -0D6B: 00 BRK -0D6C: 00 BRK -0D6D: 00 BRK -0D6E: 00 BRK -0D6F: 00 BRK -0D70: 00 BRK -0D71: 00 BRK -0D72: 00 BRK -0D73: 00 BRK -0D74: 00 BRK -0D75: 00 BRK -0D76: 00 BRK -0D77: 00 BRK -0D78: 00 BRK -0D79: 00 BRK -0D7A: 00 BRK -0D7B: 00 BRK -0D7C: 00 BRK -0D7D: 00 BRK -0D7E: 00 BRK -0D7F: 00 BRK -0D80: 00 BRK -0D81: 00 BRK -0D82: 00 BRK -0D83: 00 BRK -0D84: 00 BRK -0D85: 00 BRK -0D86: 00 BRK -0D87: 00 BRK -0D88: 00 BRK -0D89: 00 BRK -0D8A: 00 BRK -0D8B: 00 BRK -0D8C: 00 BRK -0D8D: 00 BRK -0D8E: 00 BRK -0D8F: 00 BRK -0D90: 00 BRK -0D91: 00 BRK -0D92: 00 BRK -0D93: 00 BRK -0D94: 00 BRK -0D95: 00 BRK -0D96: 00 BRK -0D97: 00 BRK -0D98: 00 BRK -0D99: 00 BRK -0D9A: 00 BRK -0D9B: 00 BRK -0D9C: 00 BRK -0D9D: 00 BRK -0D9E: 00 BRK -0D9F: 00 BRK -0DA0: 00 BRK -0DA1: 00 BRK -0DA2: 00 BRK -0DA3: 00 BRK -0DA4: 00 BRK -0DA5: 00 BRK -0DA6: 00 BRK -0DA7: 00 BRK -0DA8: 00 BRK -0DA9: 00 BRK -0DAA: 00 BRK -0DAB: 00 BRK -0DAC: 00 BRK -0DAD: 00 BRK -0DAE: 00 BRK -0DAF: 00 BRK -0DB0: 00 BRK -0DB1: 00 BRK -0DB2: 00 BRK -0DB3: 00 BRK -0DB4: 00 BRK -0DB5: 00 BRK -0DB6: 00 BRK -0DB7: 00 BRK -0DB8: 00 BRK -0DB9: 00 BRK -0DBA: 00 BRK -0DBB: 00 BRK -0DBC: 00 BRK -0DBD: 00 BRK -0DBE: 00 BRK -0DBF: 00 BRK -0DC0: 00 BRK -0DC1: 00 BRK -0DC2: 00 BRK -0DC3: 00 BRK -0DC4: 00 BRK -0DC5: 00 BRK -0DC6: 00 BRK -0DC7: 00 BRK -0DC8: 00 BRK -0DC9: 00 BRK -0DCA: 00 BRK -0DCB: 00 BRK -0DCC: 00 BRK -0DCD: 00 BRK -0DCE: 00 BRK -0DCF: 00 BRK -0DD0: 00 BRK -0DD1: 00 BRK -0DD2: 00 BRK -0DD3: 00 BRK -0DD4: 00 BRK -0DD5: 00 BRK -0DD6: 00 BRK -0DD7: 00 BRK -0DD8: 00 BRK -0DD9: 00 BRK -0DDA: 00 BRK -0DDB: 00 BRK -0DDC: 00 BRK -0DDD: 00 BRK -0DDE: 00 BRK -0DDF: 00 BRK -0DE0: 00 BRK -0DE1: 00 BRK -0DE2: 00 BRK -0DE3: 00 BRK -0DE4: 00 BRK -0DE5: 00 BRK -0DE6: 00 BRK -0DE7: 00 BRK -0DE8: 00 BRK -0DE9: 00 BRK -0DEA: 00 BRK -0DEB: 00 BRK -0DEC: 00 BRK -0DED: 00 BRK -0DEE: 00 BRK -0DEF: 00 BRK -0DF0: 00 BRK -0DF1: 00 BRK -0DF2: 00 BRK -0DF3: 00 BRK -0DF4: 00 BRK -0DF5: 00 BRK -0DF6: 00 BRK -0DF7: 00 BRK -0DF8: 00 BRK -0DF9: 00 BRK -0DFA: 00 BRK -0DFB: 00 BRK -0DFC: 00 BRK -0DFD: 00 BRK -0DFE: 00 BRK -0DFF: 00 BRK -0E00: 00 BRK -0E01: 00 BRK -0E02: 00 BRK -0E03: 00 BRK -0E04: 00 BRK -0E05: 00 BRK -0E06: 00 BRK -0E07: 00 BRK -0E08: 00 BRK -0E09: 00 BRK -0E0A: 00 BRK -0E0B: 00 BRK -0E0C: 00 BRK -0E0D: 00 BRK -0E0E: 00 BRK -0E0F: 00 BRK -0E10: 00 BRK -0E11: 00 BRK -0E12: 00 BRK -0E13: 00 BRK -0E14: 00 BRK -0E15: 00 BRK -0E16: 00 BRK -0E17: 00 BRK -0E18: 00 BRK -0E19: 00 BRK -0E1A: 00 BRK -0E1B: 00 BRK -0E1C: 00 BRK -0E1D: 00 BRK -0E1E: 00 BRK -0E1F: 00 BRK -0E20: 00 BRK -0E21: 00 BRK -0E22: 00 BRK -0E23: 00 BRK -0E24: 00 BRK -0E25: 00 BRK -0E26: 00 BRK -0E27: 00 BRK -0E28: 00 BRK -0E29: 00 BRK -0E2A: 00 BRK -0E2B: 00 BRK -0E2C: 00 BRK -0E2D: 00 BRK -0E2E: 00 BRK -0E2F: 00 BRK -0E30: 00 BRK -0E31: 00 BRK -0E32: 00 BRK -0E33: 00 BRK -0E34: 00 BRK -0E35: 00 BRK -0E36: 00 BRK -0E37: 00 BRK -0E38: 00 BRK -0E39: 00 BRK -0E3A: 00 BRK -0E3B: 00 BRK -0E3C: 00 BRK -0E3D: 00 BRK -0E3E: 00 BRK -0E3F: 00 BRK -0E40: 00 BRK -0E41: 00 BRK -0E42: 00 BRK -0E43: 00 BRK -0E44: 00 BRK -0E45: 00 BRK -0E46: 00 BRK -0E47: 00 BRK -0E48: 00 BRK -0E49: 00 BRK -0E4A: 00 BRK -0E4B: 00 BRK -0E4C: 00 BRK -0E4D: 00 BRK -0E4E: 00 BRK -0E4F: 00 BRK -0E50: 00 BRK -0E51: 00 BRK -0E52: 00 BRK -0E53: 00 BRK -0E54: 00 BRK -0E55: 00 BRK -0E56: 00 BRK -0E57: 00 BRK -0E58: 00 BRK -0E59: 00 BRK -0E5A: 00 BRK -0E5B: 00 BRK -0E5C: 00 BRK -0E5D: 00 BRK -0E5E: 00 BRK -0E5F: 00 BRK -0E60: 00 BRK -0E61: 00 BRK -0E62: 00 BRK -0E63: 00 BRK -0E64: 00 BRK -0E65: 00 BRK -0E66: 00 BRK -0E67: 00 BRK -0E68: 00 BRK -0E69: 00 BRK -0E6A: 00 BRK -0E6B: 00 BRK -0E6C: 00 BRK -0E6D: 00 BRK -0E6E: 00 BRK -0E6F: 00 BRK -0E70: 00 BRK -0E71: 00 BRK -0E72: 00 BRK -0E73: 00 BRK -0E74: 00 BRK -0E75: 00 BRK -0E76: 00 BRK -0E77: 00 BRK -0E78: 00 BRK -0E79: 00 BRK -0E7A: 00 BRK -0E7B: 00 BRK -0E7C: 00 BRK -0E7D: 00 BRK -0E7E: 00 BRK -0E7F: 00 BRK -0E80: 00 BRK -0E81: 00 BRK -0E82: 00 BRK -0E83: 00 BRK -0E84: 00 BRK -0E85: 00 BRK -0E86: 00 BRK -0E87: 00 BRK -0E88: 00 BRK -0E89: 00 BRK -0E8A: 00 BRK -0E8B: 00 BRK -0E8C: 00 BRK -0E8D: 00 BRK -0E8E: 00 BRK -0E8F: 00 BRK -0E90: 00 BRK -0E91: 00 BRK -0E92: 00 BRK -0E93: 00 BRK -0E94: 00 BRK -0E95: 00 BRK -0E96: 00 BRK -0E97: 00 BRK -0E98: 00 BRK -0E99: 00 BRK -0E9A: 00 BRK -0E9B: 00 BRK -0E9C: 00 BRK -0E9D: 00 BRK -0E9E: 00 BRK -0E9F: 00 BRK -0EA0: 00 BRK -0EA1: 00 BRK -0EA2: 00 BRK -0EA3: 00 BRK -0EA4: 00 BRK -0EA5: 00 BRK -0EA6: 00 BRK -0EA7: 00 BRK -0EA8: 00 BRK -0EA9: 00 BRK -0EAA: 00 BRK -0EAB: 00 BRK -0EAC: 00 BRK -0EAD: 00 BRK -0EAE: 00 BRK -0EAF: 00 BRK -0EB0: 00 BRK -0EB1: 00 BRK -0EB2: 00 BRK -0EB3: 00 BRK -0EB4: 00 BRK -0EB5: 00 BRK -0EB6: 00 BRK -0EB7: 00 BRK -0EB8: 00 BRK -0EB9: 00 BRK -0EBA: 00 BRK -0EBB: 00 BRK -0EBC: 00 BRK -0EBD: 00 BRK -0EBE: 00 BRK -0EBF: 00 BRK -0EC0: 00 BRK -0EC1: 00 BRK -0EC2: 00 BRK -0EC3: 00 BRK -0EC4: 00 BRK -0EC5: 00 BRK -0EC6: 00 BRK -0EC7: 00 BRK -0EC8: 00 BRK -0EC9: 00 BRK -0ECA: 00 BRK -0ECB: 00 BRK -0ECC: 00 BRK -0ECD: 00 BRK -0ECE: 00 BRK -0ECF: 00 BRK -0ED0: 00 BRK -0ED1: 00 BRK -0ED2: 00 BRK -0ED3: 00 BRK -0ED4: 00 BRK -0ED5: 00 BRK -0ED6: 00 BRK -0ED7: 00 BRK -0ED8: 00 BRK -0ED9: 00 BRK -0EDA: 00 BRK -0EDB: 00 BRK -0EDC: 00 BRK -0EDD: 00 BRK -0EDE: 00 BRK -0EDF: 00 BRK -0EE0: 00 BRK -0EE1: 00 BRK -0EE2: 00 BRK -0EE3: 00 BRK -0EE4: 00 BRK -0EE5: 00 BRK -0EE6: 00 BRK -0EE7: 00 BRK -0EE8: 00 BRK -0EE9: 00 BRK -0EEA: 00 BRK -0EEB: 00 BRK -0EEC: 00 BRK -0EED: 00 BRK -0EEE: 00 BRK -0EEF: 00 BRK -0EF0: 00 BRK -0EF1: 00 BRK -0EF2: 00 BRK -0EF3: 00 BRK -0EF4: 00 BRK -0EF5: 00 BRK -0EF6: 00 BRK -0EF7: 00 BRK -0EF8: 00 BRK -0EF9: 00 BRK -0EFA: 00 BRK -0EFB: 00 BRK -0EFC: 00 BRK -0EFD: 00 BRK -0EFE: 00 BRK -0EFF: 00 BRK -0F00: 00 BRK -0F01: 00 BRK -0F02: 00 BRK -0F03: 00 BRK -0F04: 00 BRK -0F05: 00 BRK -0F06: 00 BRK -0F07: 00 BRK -0F08: 00 BRK -0F09: 00 BRK -0F0A: 00 BRK -0F0B: 00 BRK -0F0C: 00 BRK -0F0D: 00 BRK -0F0E: 00 BRK -0F0F: 00 BRK -0F10: 00 BRK -0F11: 00 BRK -0F12: 00 BRK -0F13: 00 BRK -0F14: 00 BRK -0F15: 00 BRK -0F16: 00 BRK -0F17: 00 BRK -0F18: 00 BRK -0F19: 00 BRK -0F1A: 00 BRK -0F1B: 00 BRK -0F1C: 00 BRK -0F1D: 00 BRK -0F1E: 00 BRK -0F1F: 00 BRK -0F20: 00 BRK -0F21: 00 BRK -0F22: 00 BRK -0F23: 00 BRK -0F24: 00 BRK -0F25: 00 BRK -0F26: 00 BRK -0F27: 00 BRK -0F28: 00 BRK -0F29: 00 BRK -0F2A: 00 BRK -0F2B: 00 BRK -0F2C: 00 BRK -0F2D: 00 BRK -0F2E: 00 BRK -0F2F: 00 BRK -0F30: 00 BRK -0F31: 00 BRK -0F32: 00 BRK -0F33: 00 BRK -0F34: 00 BRK -0F35: 00 BRK -0F36: 00 BRK -0F37: 00 BRK -0F38: 00 BRK -0F39: 00 BRK -0F3A: 00 BRK -0F3B: 00 BRK -0F3C: 00 BRK -0F3D: 00 BRK -0F3E: 00 BRK -0F3F: 00 BRK -0F40: 00 BRK -0F41: 00 BRK -0F42: 00 BRK -0F43: 00 BRK -0F44: 00 BRK -0F45: 00 BRK -0F46: 00 BRK -0F47: 00 BRK -0F48: 00 BRK -0F49: 00 BRK -0F4A: 00 BRK -0F4B: 00 BRK -0F4C: 00 BRK -0F4D: 00 BRK -0F4E: 00 BRK -0F4F: 00 BRK -0F50: 00 BRK -0F51: 00 BRK -0F52: 00 BRK -0F53: 00 BRK -0F54: 00 BRK -0F55: 00 BRK -0F56: 00 BRK -0F57: 00 BRK -0F58: 00 BRK -0F59: 00 BRK -0F5A: 00 BRK -0F5B: 00 BRK -0F5C: 00 BRK -0F5D: 00 BRK -0F5E: 00 BRK -0F5F: 00 BRK -0F60: 00 BRK -0F61: 00 BRK -0F62: 00 BRK -0F63: 00 BRK -0F64: 00 BRK -0F65: 00 BRK -0F66: 00 BRK -0F67: 00 BRK -0F68: 00 BRK -0F69: 00 BRK -0F6A: 00 BRK -0F6B: 00 BRK -0F6C: 00 BRK -0F6D: 00 BRK -0F6E: 00 BRK -0F6F: 00 BRK -0F70: 00 BRK -0F71: 00 BRK -0F72: 00 BRK -0F73: 00 BRK -0F74: 00 BRK -0F75: 00 BRK -0F76: 00 BRK -0F77: 00 BRK -0F78: 00 BRK -0F79: 00 BRK -0F7A: 00 BRK -0F7B: 00 BRK -0F7C: 00 BRK -0F7D: 00 BRK -0F7E: 00 BRK -0F7F: 00 BRK -0F80: 00 BRK -0F81: 00 BRK -0F82: 00 BRK -0F83: 00 BRK -0F84: 00 BRK -0F85: 00 BRK -0F86: 00 BRK -0F87: 00 BRK -0F88: 00 BRK -0F89: 00 BRK -0F8A: 00 BRK -0F8B: 00 BRK -0F8C: 00 BRK -0F8D: 00 BRK -0F8E: 00 BRK -0F8F: 00 BRK -0F90: 00 BRK -0F91: 00 BRK -0F92: 00 BRK -0F93: 00 BRK -0F94: 00 BRK -0F95: 00 BRK -0F96: 00 BRK -0F97: 00 BRK -0F98: 00 BRK -0F99: 00 BRK -0F9A: 00 BRK -0F9B: 00 BRK -0F9C: 00 BRK -0F9D: 00 BRK -0F9E: 00 BRK -0F9F: 00 BRK -0FA0: 00 BRK -0FA1: 00 BRK -0FA2: 00 BRK -0FA3: 00 BRK -0FA4: 00 BRK -0FA5: 00 BRK -0FA6: 00 BRK -0FA7: 00 BRK -0FA8: 00 BRK -0FA9: 00 BRK -0FAA: 00 BRK -0FAB: 00 BRK -0FAC: 00 BRK -0FAD: 00 BRK -0FAE: 00 BRK -0FAF: 00 BRK -0FB0: 00 BRK -0FB1: 00 BRK -0FB2: 00 BRK -0FB3: 00 BRK -0FB4: 00 BRK -0FB5: 00 BRK -0FB6: 00 BRK -0FB7: 00 BRK -0FB8: 00 BRK -0FB9: 00 BRK -0FBA: 00 BRK -0FBB: 00 BRK -0FBC: 00 BRK -0FBD: 00 BRK -0FBE: 00 BRK -0FBF: 00 BRK -0FC0: 00 BRK -0FC1: 00 BRK -0FC2: 00 BRK -0FC3: 00 BRK -0FC4: 00 BRK -0FC5: 00 BRK -0FC6: 00 BRK -0FC7: 00 BRK -0FC8: 00 BRK -0FC9: 00 BRK -0FCA: 00 BRK -0FCB: 00 BRK -0FCC: 00 BRK -0FCD: 00 BRK -0FCE: 00 BRK -0FCF: 00 BRK -0FD0: 00 BRK -0FD1: 00 BRK -0FD2: 00 BRK -0FD3: 00 BRK -0FD4: 00 BRK -0FD5: 00 BRK -0FD6: 00 BRK -0FD7: 00 BRK -0FD8: 00 BRK -0FD9: 00 BRK -0FDA: 00 BRK -0FDB: 00 BRK -0FDC: 00 BRK -0FDD: 00 BRK -0FDE: 00 BRK -0FDF: 00 BRK -0FE0: 00 BRK -0FE1: 00 BRK -0FE2: 00 BRK -0FE3: 00 BRK -0FE4: 00 BRK -0FE5: 00 BRK -0FE6: 00 BRK -0FE7: 00 BRK -0FE8: 00 BRK -0FE9: 00 BRK -0FEA: 00 BRK -0FEB: 00 BRK -0FEC: 00 BRK -0FED: 00 BRK -0FEE: 00 BRK -0FEF: 00 BRK -0FF0: 00 BRK -0FF1: 00 BRK -0FF2: 00 BRK -0FF3: 00 BRK -0FF4: 00 BRK -0FF5: 00 BRK -0FF6: 00 BRK -0FF7: 00 BRK -0FF8: 00 BRK -0FF9: 00 BRK -0FFA: 00 BRK -0FFB: 00 BRK -0FFC: 00 BRK -0FFD: 00 BRK -0FFE: 00 BRK -0FFF: 00 BRK -1000: 00 BRK -1001: 00 BRK -1002: 00 BRK -1003: 00 BRK -1004: 00 BRK -1005: 00 BRK -1006: 00 BRK -1007: 00 BRK -1008: 00 BRK -1009: 00 BRK -100A: 00 BRK -100B: 00 BRK -100C: 00 BRK -100D: 00 BRK -100E: 00 BRK -100F: 00 BRK -1010: 00 BRK -1011: 00 BRK -1012: 00 BRK -1013: 00 BRK -1014: 00 BRK -1015: 00 BRK -1016: 00 BRK -1017: 00 BRK -1018: 00 BRK -1019: 00 BRK -101A: 00 BRK -101B: 00 BRK -101C: 00 BRK -101D: 00 BRK -101E: 00 BRK -101F: 00 BRK -1020: 00 BRK -1021: 00 BRK -1022: 00 BRK -1023: 00 BRK -1024: 00 BRK -1025: 00 BRK -1026: 00 BRK -1027: 00 BRK -1028: 00 BRK -1029: 00 BRK -102A: 00 BRK -102B: 00 BRK -102C: 00 BRK -102D: 00 BRK -102E: 00 BRK -102F: 00 BRK -1030: 00 BRK -1031: 00 BRK -1032: 00 BRK -1033: 00 BRK -1034: 00 BRK -1035: 00 BRK -1036: 00 BRK -1037: 00 BRK -1038: 00 BRK -1039: 00 BRK -103A: 00 BRK -103B: 00 BRK -103C: 00 BRK -103D: 00 BRK -103E: 00 BRK -103F: 00 BRK -1040: 00 BRK -1041: 00 BRK -1042: 00 BRK -1043: 00 BRK -1044: 00 BRK -1045: 00 BRK -1046: 00 BRK -1047: 00 BRK -1048: 00 BRK -1049: 00 BRK -104A: 00 BRK -104B: 00 BRK -104C: 00 BRK -104D: 00 BRK -104E: 00 BRK -104F: 00 BRK -1050: 00 BRK -1051: 00 BRK -1052: 00 BRK -1053: 00 BRK -1054: 00 BRK -1055: 00 BRK -1056: 00 BRK -1057: 00 BRK -1058: 00 BRK -1059: 00 BRK -105A: 00 BRK -105B: 00 BRK -105C: 00 BRK -105D: 00 BRK -105E: 00 BRK -105F: 00 BRK -1060: 00 BRK -1061: 00 BRK -1062: 00 BRK -1063: 00 BRK -1064: 00 BRK -1065: 00 BRK -1066: 00 BRK -1067: 00 BRK -1068: 00 BRK -1069: 00 BRK -106A: 00 BRK -106B: 00 BRK -106C: 00 BRK -106D: 00 BRK -106E: 00 BRK -106F: 00 BRK -1070: 00 BRK -1071: 00 BRK -1072: 00 BRK -1073: 00 BRK -1074: 00 BRK -1075: 00 BRK -1076: 00 BRK -1077: 00 BRK -1078: 00 BRK -1079: 00 BRK -107A: 00 BRK -107B: 00 BRK -107C: 00 BRK -107D: 00 BRK -107E: 00 BRK -107F: 00 BRK -1080: 00 BRK -1081: 00 BRK -1082: 00 BRK -1083: 00 BRK -1084: 00 BRK -1085: 00 BRK -1086: 00 BRK -1087: 00 BRK -1088: 00 BRK -1089: 00 BRK -108A: 00 BRK -108B: 00 BRK -108C: 00 BRK -108D: 00 BRK -108E: 00 BRK -108F: 00 BRK -1090: 00 BRK -1091: 00 BRK -1092: 00 BRK -1093: 00 BRK -1094: 00 BRK -1095: 00 BRK -1096: 00 BRK -1097: 00 BRK -1098: 00 BRK -1099: 00 BRK -109A: 00 BRK -109B: 00 BRK -109C: 00 BRK -109D: 00 BRK -109E: 00 BRK -109F: 00 BRK -10A0: 00 BRK -10A1: 00 BRK -10A2: 00 BRK -10A3: 00 BRK -10A4: 00 BRK -10A5: 00 BRK -10A6: 00 BRK -10A7: 00 BRK -10A8: 00 BRK -10A9: 00 BRK -10AA: 00 BRK -10AB: 00 BRK -10AC: 00 BRK -10AD: 00 BRK -10AE: 00 BRK -10AF: 00 BRK -10B0: 00 BRK -10B1: 00 BRK -10B2: 00 BRK -10B3: 00 BRK -10B4: 00 BRK -10B5: 00 BRK -10B6: 00 BRK -10B7: 00 BRK -10B8: 00 BRK -10B9: 00 BRK -10BA: 00 BRK -10BB: 00 BRK -10BC: 00 BRK -10BD: 00 BRK -10BE: 00 BRK -10BF: 00 BRK -10C0: 00 BRK -10C1: 00 BRK -10C2: 00 BRK -10C3: 00 BRK -10C4: 00 BRK -10C5: 00 BRK -10C6: 00 BRK -10C7: 00 BRK -10C8: 00 BRK -10C9: 00 BRK -10CA: 00 BRK -10CB: 00 BRK -10CC: 00 BRK -10CD: 00 BRK -10CE: 00 BRK -10CF: 00 BRK -10D0: 00 BRK -10D1: 00 BRK -10D2: 00 BRK -10D3: 00 BRK -10D4: 00 BRK -10D5: 00 BRK -10D6: 00 BRK -10D7: 00 BRK -10D8: 00 BRK -10D9: 00 BRK -10DA: 00 BRK -10DB: 00 BRK -10DC: 00 BRK -10DD: 00 BRK -10DE: 00 BRK -10DF: 00 BRK -10E0: 00 BRK -10E1: 00 BRK -10E2: 00 BRK -10E3: 00 BRK -10E4: 00 BRK -10E5: 00 BRK -10E6: 00 BRK -10E7: 00 BRK -10E8: 00 BRK -10E9: 00 BRK -10EA: 00 BRK -10EB: 00 BRK -10EC: 00 BRK -10ED: 00 BRK -10EE: 00 BRK -10EF: 00 BRK -10F0: 00 BRK -10F1: 00 BRK -10F2: 00 BRK -10F3: 00 BRK -10F4: 00 BRK -10F5: 00 BRK -10F6: 00 BRK -10F7: 00 BRK -10F8: 00 BRK -10F9: 00 BRK -10FA: 00 BRK -10FB: 00 BRK -10FC: 00 BRK -10FD: 00 BRK -10FE: 00 BRK -10FF: 00 BRK -1100: 00 BRK -1101: 00 BRK -1102: 00 BRK -1103: 00 BRK -1104: 00 BRK -1105: 00 BRK -1106: 00 BRK -1107: 00 BRK -1108: 00 BRK -1109: 00 BRK -110A: 00 BRK -110B: 00 BRK -110C: 00 BRK -110D: 00 BRK -110E: 00 BRK -110F: 00 BRK -1110: 00 BRK -1111: 00 BRK -1112: 00 BRK -1113: 00 BRK -1114: 00 BRK -1115: 00 BRK -1116: 00 BRK -1117: 00 BRK -1118: 00 BRK -1119: 00 BRK -111A: 00 BRK -111B: 00 BRK -111C: 00 BRK -111D: 00 BRK -111E: 00 BRK -111F: 00 BRK -1120: 00 BRK -1121: 00 BRK -1122: 00 BRK -1123: 00 BRK -1124: 00 BRK -1125: 00 BRK -1126: 00 BRK -1127: 00 BRK -1128: 00 BRK -1129: 00 BRK -112A: 00 BRK -112B: 00 BRK -112C: 00 BRK -112D: 00 BRK -112E: 00 BRK -112F: 00 BRK -1130: 00 BRK -1131: 00 BRK -1132: 00 BRK -1133: 00 BRK -1134: 00 BRK -1135: 00 BRK -1136: 00 BRK -1137: 00 BRK -1138: 00 BRK -1139: 00 BRK -113A: 00 BRK -113B: 00 BRK -113C: 00 BRK -113D: 00 BRK -113E: 00 BRK -113F: 00 BRK -1140: 00 BRK -1141: 00 BRK -1142: 00 BRK -1143: 00 BRK -1144: 00 BRK -1145: 00 BRK -1146: 00 BRK -1147: 00 BRK -1148: 00 BRK -1149: 00 BRK -114A: 00 BRK -114B: 00 BRK -114C: 00 BRK -114D: 00 BRK -114E: 00 BRK -114F: 00 BRK -1150: 00 BRK -1151: 00 BRK -1152: 00 BRK -1153: 00 BRK -1154: 00 BRK -1155: 00 BRK -1156: 00 BRK -1157: 00 BRK -1158: 00 BRK -1159: 00 BRK -115A: 00 BRK -115B: 00 BRK -115C: 00 BRK -115D: 00 BRK -115E: 00 BRK -115F: 00 BRK -1160: 00 BRK -1161: 00 BRK -1162: 00 BRK -1163: 00 BRK -1164: 00 BRK -1165: 00 BRK -1166: 00 BRK -1167: 00 BRK -1168: 00 BRK -1169: 00 BRK -116A: 00 BRK -116B: 00 BRK -116C: 00 BRK -116D: 00 BRK -116E: 00 BRK -116F: 00 BRK -1170: 00 BRK -1171: 00 BRK -1172: 00 BRK -1173: 00 BRK -1174: 00 BRK -1175: 00 BRK -1176: 00 BRK -1177: 00 BRK -1178: 00 BRK -1179: 00 BRK -117A: 00 BRK -117B: 00 BRK -117C: 00 BRK -117D: 00 BRK -117E: 00 BRK -117F: 00 BRK -1180: 00 BRK -1181: 00 BRK -1182: 00 BRK -1183: 00 BRK -1184: 00 BRK -1185: 00 BRK -1186: 00 BRK -1187: 00 BRK -1188: 00 BRK -1189: 00 BRK -118A: 00 BRK -118B: 00 BRK -118C: 00 BRK -118D: 00 BRK -118E: 00 BRK -118F: 00 BRK -1190: 00 BRK -1191: 00 BRK -1192: 00 BRK -1193: 00 BRK -1194: 00 BRK -1195: 00 BRK -1196: 00 BRK -1197: 00 BRK -1198: 00 BRK -1199: 00 BRK -119A: 00 BRK -119B: 00 BRK -119C: 00 BRK -119D: 00 BRK -119E: 00 BRK -119F: 00 BRK -11A0: 00 BRK -11A1: 00 BRK -11A2: 00 BRK -11A3: 00 BRK -11A4: 00 BRK -11A5: 00 BRK -11A6: 00 BRK -11A7: 00 BRK -11A8: 00 BRK -11A9: 00 BRK -11AA: 00 BRK -11AB: 00 BRK -11AC: 00 BRK -11AD: 00 BRK -11AE: 00 BRK -11AF: 00 BRK -11B0: 00 BRK -11B1: 00 BRK -11B2: 00 BRK -11B3: 00 BRK -11B4: 00 BRK -11B5: 00 BRK -11B6: 00 BRK -11B7: 00 BRK -11B8: 00 BRK -11B9: 00 BRK -11BA: 00 BRK -11BB: 00 BRK -11BC: 00 BRK -11BD: 00 BRK -11BE: 00 BRK -11BF: 00 BRK -11C0: 00 BRK -11C1: 00 BRK -11C2: 00 BRK -11C3: 00 BRK -11C4: 00 BRK -11C5: 00 BRK -11C6: 00 BRK -11C7: 00 BRK -11C8: 00 BRK -11C9: 00 BRK -11CA: 00 BRK -11CB: 00 BRK -11CC: 00 BRK -11CD: 00 BRK -11CE: 00 BRK -11CF: 00 BRK -11D0: 00 BRK -11D1: 00 BRK -11D2: 00 BRK -11D3: 00 BRK -11D4: 00 BRK -11D5: 00 BRK -11D6: 00 BRK -11D7: 00 BRK -11D8: 00 BRK -11D9: 00 BRK -11DA: 00 BRK -11DB: 00 BRK -11DC: 00 BRK -11DD: 00 BRK -11DE: 00 BRK -11DF: 00 BRK -11E0: 00 BRK -11E1: 00 BRK -11E2: 00 BRK -11E3: 00 BRK -11E4: 00 BRK -11E5: 00 BRK -11E6: 00 BRK -11E7: 00 BRK -11E8: 00 BRK -11E9: 00 BRK -11EA: 00 BRK -11EB: 00 BRK -11EC: 00 BRK -11ED: 00 BRK -11EE: 00 BRK -11EF: 00 BRK -11F0: 00 BRK -11F1: 00 BRK -11F2: 00 BRK -11F3: 00 BRK -11F4: 00 BRK -11F5: 00 BRK -11F6: 00 BRK -11F7: 00 BRK -11F8: 00 BRK -11F9: 00 BRK -11FA: 00 BRK -11FB: 00 BRK -11FC: 00 BRK -11FD: 00 BRK -11FE: 00 BRK -11FF: 00 BRK -1200: 00 BRK -1201: 00 BRK -1202: 00 BRK -1203: 00 BRK -1204: 00 BRK -1205: 00 BRK -1206: 00 BRK -1207: 00 BRK -1208: 00 BRK -1209: 00 BRK -120A: 00 BRK -120B: 00 BRK -120C: 00 BRK -120D: 00 BRK -120E: 00 BRK -120F: 00 BRK -1210: 00 BRK -1211: 00 BRK -1212: 00 BRK -1213: 00 BRK -1214: 00 BRK -1215: 00 BRK -1216: 00 BRK -1217: 00 BRK -1218: 00 BRK -1219: 00 BRK -121A: 00 BRK -121B: 00 BRK -121C: 00 BRK -121D: 00 BRK -121E: 00 BRK -121F: 00 BRK -1220: 00 BRK -1221: 00 BRK -1222: 00 BRK -1223: 00 BRK -1224: 00 BRK -1225: 00 BRK -1226: 00 BRK -1227: 00 BRK -1228: 00 BRK -1229: 00 BRK -122A: 00 BRK -122B: 00 BRK -122C: 00 BRK -122D: 00 BRK -122E: 00 BRK -122F: 00 BRK -1230: 00 BRK -1231: 00 BRK -1232: 00 BRK -1233: 00 BRK diff --git a/test/cases/segment1.expected.asm b/test/cases/segment1.expected.asm new file mode 100644 index 0000000..84b1353 --- /dev/null +++ b/test/cases/segment1.expected.asm @@ -0,0 +1,23 @@ +0801: A9 00 LDA #$00 +0803: 00 BRK +0804: 00 BRK +0805: 00 BRK +0806: 00 BRK +0807: 00 BRK +0808: 00 BRK +0809: 00 BRK +080A: A9 01 LDA #$01 +080C: A9 02 LDA #$02 +080E: A9 03 LDA #$03 +0810: A9 04 LDA #$04 +0812: 00 BRK +0813: 00 BRK +0814: 00 BRK +0815: 00 BRK +0816: 00 BRK +0817: 00 BRK +0818: 00 BRK +0819: 00 BRK +081A: 00 BRK +081B: 01 02 ORA ($02,X) +081D: 03 diff --git a/test/cases/segment1.input.asm b/test/cases/segment1.input.asm new file mode 100644 index 0000000..5974078 --- /dev/null +++ b/test/cases/segment1.input.asm @@ -0,0 +1,17 @@ + +!segment code(start=$80a, end=$81a) +!segment data(start=$81a, end=$830) + +* = $801 + lda #0 ; default segment + +!segment code ; use code segment + lda #1 ; should be at address $1000 + lda #2 + +!segment data +!byte 0,1,2,3 + +!segment code ; emit to code segment + lda #3 + lda #4 diff --git a/test/errors/segment1.errors.txt b/test/errors/segment1.errors.txt new file mode 100644 index 0000000..853c2c6 --- /dev/null +++ b/test/errors/segment1.errors.txt @@ -0,0 +1 @@ +test/errors/segment1.input.asm:5:1: error: Use of undeclared segment 'undefed_segname' \ No newline at end of file diff --git a/test/errors/segment1.input.asm b/test/errors/segment1.input.asm new file mode 100644 index 0000000..e834eff --- /dev/null +++ b/test/errors/segment1.input.asm @@ -0,0 +1,5 @@ + +* = $801 +!segment code(start=256, end=1024) + +!segment undefed_segname ; unknown segment diff --git a/test/errors/segment2.errors.txt b/test/errors/segment2.errors.txt new file mode 100644 index 0000000..71e2c77 --- /dev/null +++ b/test/errors/segment2.errors.txt @@ -0,0 +1 @@ +test/errors/segment2.input.asm:7:1: error: Use of segment 'fake' that is not a declared segment. Its type is 'var' \ No newline at end of file diff --git a/test/errors/segment2.input.asm b/test/errors/segment2.input.asm new file mode 100644 index 0000000..f8cdd91 --- /dev/null +++ b/test/errors/segment2.input.asm @@ -0,0 +1,8 @@ + +* = $801 +!let fake = 0 + +!segment code(start=256, end=1024) + +!segment fake ; can't use a variable, it's not a segment + diff --git a/test/errors/segment3_overflow.errors.txt b/test/errors/segment3_overflow.errors.txt new file mode 100644 index 0000000..3abf983 --- /dev/null +++ b/test/errors/segment3_overflow.errors.txt @@ -0,0 +1 @@ +test/errors/segment3_overflow.input.asm:6:5: error: Segment overflow at $0104. Segment address range: $0100-$0103 \ No newline at end of file diff --git a/test/errors/segment3_overflow.input.asm b/test/errors/segment3_overflow.input.asm new file mode 100644 index 0000000..907ce29 --- /dev/null +++ b/test/errors/segment3_overflow.input.asm @@ -0,0 +1,6 @@ + +!segment code(start=$100, end=$103) +!segment code + lda #0 ; $100, $101 + lda #1 ; $102, $103 + lda #2 ; $104 is already out of bounds, error on this line diff --git a/test/test.ts b/test/test.ts index 23aaff0..be014d0 100644 --- a/test/test.ts +++ b/test/test.ts @@ -24,7 +24,7 @@ class TestReporter { constructor (tests: Test[], description: string) { this.tests = tests; - stdout.write(`Running ${description} tests\n`); + stdout.write(`Running ${description} tests (# of tests: ${tests.length})\n`); } runTests(run: (t: Test) => 'pass' | 'fail') { diff --git a/test/warnings/implicit_pc.input.asm b/test/warnings/implicit_pc.input.asm deleted file mode 100644 index d83327a..0000000 --- a/test/warnings/implicit_pc.input.asm +++ /dev/null @@ -1,3 +0,0 @@ -; missing '* = $801', should warn about implicit start -; address - lda #0 diff --git a/test/warnings/implicit_pc.warnings.txt b/test/warnings/implicit_pc.warnings.txt deleted file mode 100644 index bf36d01..0000000 --- a/test/warnings/implicit_pc.warnings.txt +++ /dev/null @@ -1 +0,0 @@ -test/warnings/implicit_pc.input.asm:0:0: warning: Starting program counter not set with '* = addr'. Defaulting to platform default $0801 \ No newline at end of file