; zasm ; ; Reads input from specified blkdev ID, assemble the binary in two passes and ; spit the result in another specified blkdev ID. ; ; We don't buffer the whole source in memory, so we need our input blkdev to ; support Seek so we can read the file a second time. So, for input, we need ; GetB and Seek. ; ; For output, we only need PutB. Output doesn't start until the second pass. ; ; The goal of the second pass is to assign values to all symbols so that we ; can have forward references (instructions referencing a label that happens ; later). ; ; Labels and constants are both treated the same way, that is, they can be ; forward-referenced in instructions. ".equ" directives, however, are evaluated ; during the first pass so forward references are not allowed. ; ; *** Requirements *** ; strncmp ; upcase ; findchar ; blkSel ; blkSet ; fsFindFN ; fsOpen ; fsGetB ; _blkGetB ; _blkPutB ; _blkSeek ; _blkTell ; printstr ; printcrlf .inc "user.h" .org 0x85e0 .equ USER_RAMSTART USER_CODE ; *** Overridable consts *** ; NOTE: These limits below are designed to be *just* enough for zasm to assemble ; itself. Considering that this app is Collapse OS' biggest app, it's safe to ; assume that it will be enough for many many use cases. If you need to compile ; apps with lots of big symbols, you'll need to adjust these. ; With these default settings, zasm runs with less than 0x1800 bytes of RAM! ; Maximum number of symbols we can have in the global and consts registry .equ ZASM_REG_MAXCNT 0xff ; Maximum number of symbols we can have in the local registry .equ ZASM_LREG_MAXCNT 0x20 ; Size of the symbol name buffer size. This is a pool. There is no maximum name ; length for a single symbol, just a maximum size for the whole pool. ; Global labels and consts have the same buf size .equ ZASM_REG_BUFSZ 0x700 ; Size of the names buffer for the local context registry .equ ZASM_LREG_BUFSZ 0x100 ; ****** .inc "err.h" .inc "ascii.h" .inc "blkdev.h" .inc "fs.h" jp zasmMain .inc "core.asm" .inc "zasm/const.asm" .inc "lib/util.asm" .inc "lib/ari.asm" .inc "lib/parse.asm" .inc "zasm/util.asm" .equ IO_RAMSTART USER_RAMSTART .inc "zasm/io.asm" .equ TOK_RAMSTART IO_RAMEND .inc "zasm/tok.asm" .equ INS_RAMSTART TOK_RAMEND .inc "zasm/instr.asm" .equ DIREC_RAMSTART INS_RAMEND .inc "zasm/directive.asm" .inc "zasm/parse.asm" .equ EXPR_PARSE parseNumberOrSymbol .inc "lib/expr.asm" .equ SYM_RAMSTART DIREC_RAMEND .inc "zasm/symbol.asm" .equ ZASM_RAMSTART SYM_RAMEND .inc "zasm/main.asm" USER_RAMSTART: