From 717a9d9b084c364ee4f56cbe09b4ad9c5d750d91 Mon Sep 17 00:00:00 2001 From: Redo Date: Fri, 1 Mar 2024 20:58:07 -0600 Subject: [PATCH] make assembler use \\ instead of / for newlines --- assembler-8608.lua | 13 +- examples/_hwdefs.asm | 47 +++++++ examples/editor2.asm | 288 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 345 insertions(+), 3 deletions(-) create mode 100644 examples/_hwdefs.asm create mode 100644 examples/editor2.asm diff --git a/assembler-8608.lua b/assembler-8608.lua index 5824191..cdea5e0 100644 --- a/assembler-8608.lua +++ b/assembler-8608.lua @@ -219,6 +219,7 @@ end local function preprocessCode(code) code = "\n"..code.."\n" + -- apply brace labels and scoped labels local curscope = "" local codet = {} local wordt = {} @@ -245,6 +246,7 @@ local function preprocessCode(code) code = "\n"..table.concat(codet).."\n" + -- apply function macros local funcmacros = {} code = code:gsub(".define ([%.a-zA-Z0-9_]+)%(([^%)]+)%) ([^\n]+)", function(name, args, repl) local argt = separateCommas(args) @@ -266,6 +268,7 @@ local function preprocessCode(code) end) for name, replf in pairs(funcmacros) do code = code:gsub("([^a-zA-Z0-9_])"..name.." *%(([^%)]+)%)", replf) end + -- apply simple macros local simplemacros = {} code = code:gsub("%.define +([%.a-zA-Z0-9_]+) +([^\n]+)", function(name, repl) assert(not simplemacros[name], "Redefinition of macro "..name) @@ -279,9 +282,10 @@ local function preprocessCode(code) invoc = invoc+1 return b..(repl:gsub("(_BRACE_[0-9]+_)", "%1"..invoc.."_"))..a end) + print(name, code) end - code = code:gsub("\\", "\n") + code = code:gsub("\\\\", "\n") local uexprs = {} @@ -355,14 +359,15 @@ local function prefixCode(code, fn) -- fix strings, add line numbers end out(".ln 1"); out("\n"); - for i = 1, #code do + local i = 1 + while i <= #code do local c = code:sub(i, i) local cn = code:sub(i+1, i+1) local cp = code:sub(i-1, i-1) if state=="code" then if c=="\r" then - elseif c=="\n" or (c=="/" and cn~="/" and cn~="*") then + elseif c=="\n" then -- (c=="/" and cn~="/" and cn~="*") linenum = linenum+1 if not skipnl then out("\n") out(".ln "..linenum); out("\n"); end newline() @@ -413,6 +418,8 @@ local function prefixCode(code, fn) -- fix strings, add line numbers state = "string" end end + + i = i+1 end assert(#bracestack==0, "unclosed brace") local code2 = table.concat(outt) diff --git a/examples/_hwdefs.asm b/examples/_hwdefs.asm new file mode 100644 index 0000000..2e6c1c7 --- /dev/null +++ b/examples/_hwdefs.asm @@ -0,0 +1,47 @@ + +.define SYSROM $0000 +.define GPIO $0400 +.define KEYBOARD $0500 +.define PERIPH $0600 +.define ROBOT $0700 +.define SCREEN $0800 +.define SCRCLR $0C00 +.define SYSRAM $1000 +.define USERROM $2000 +.define USERRAM $3000 + +;.define FUNC .space 1 \ .align $10 \ +.define FUNC .space 1 \ + +; I/O devices + +.org GPIO + io: + .mulLeft: .mulHigh: .mulResultHigh: byte + .mulRight: .mulLow: .mulResultLow: .mulResult: byte + .dividend: .quotient: byte + .divisor: .remainder: byte + .popcount: byte + .timer: byte + byte[(256-6)] + +.org KEYBOARD + keyboard: + .queue: .int: byte + byte[(256-1)] + +.org PERIPH + byte[256] + +.org ROBOT + robot: + .color: byte + .control: byte + byte[(256-2)] + +.org SCREEN + screen: + .char: byte[1024] + .color: byte[1024] + +.org $0000 diff --git a/examples/editor2.asm b/examples/editor2.asm new file mode 100644 index 0000000..9c8aa1c --- /dev/null +++ b/examples/editor2.asm @@ -0,0 +1,288 @@ + +.include hwdefs.asm + +.define CursorBlinkTicks 20 + +.org SYSROM + lds stack + ldv interrupt + ldp screen.char + + jss clearscreen + + lda 0 + sta *cursorTimer + + { + lda 1 + sta *io.timer + hlt + jss handleKeys + jss blinkCursorTick + jpr } + + ;----------- + + FUNC / { / irt + interrupt: + ;stp *inttempp + ;ldp s / stp *inttemps + ;lds intstack + ;psh f / psh a / psh b / psh c / psh q + + run + + ;pop q / pop c / pop b / pop a / pop f + ;ldp *inttemps / lds p + ;ldp *inttempp + jpr } + + FUNC handleKeys: + lda *keyboard.queue + jpz { + jss keypressed + jpr handleKeys + } + rts + + FUNC blinkCursorTick: + lda *cursorTimer + jnz { + ldp *screenPos + ldc ph / ldb pl / adc $04 / ldp cb ; get color addr from screen pos + ;lda *p / xor $80 / sta *p ; toggle highlight bit + lda *p / xor $03 / sta *p ; toggle black/white + + lda CursorBlinkTicks + } + dec a + sta *cursorTimer + rts + + FUNC numshifts: ")!@#$%^&*(" + FUNC keys_2430: ";=,.-/`" + FUNC keys_2430_shift: ":+<>_?~" + FUNC keys_6063: "[\\]'" + FUNC keys_6063_shift: "{|}\"" + FUNC keys_numpad: "0123456789*+\n-./" + FUNC keys_numpad_shift: "0123456789*+\n_.?" + + FUNC keypressed: ; key in a + ldb a + + ; check for shift + and $7F + cmp $10 / jpz keyShift / cmp $14 / jnz keyNoShift + keyShift: + lda b / and $80 / shr 7 / sta *shiftDown + rts + keyNoShift: + + lda b + and $80 + jnz { / rts / } + + lda b + and $7F + ; ldp *screenPos / sta *p++ / stp *screenPos + ; jss printhex / lda b + cmp "A" / jlt { / cmp "Z" / jgt { ; letter + ldb *shiftDown / jnz { + add $20 + } + jss printchar + rts + } / } + cmp "0" / jlt { / cmp "9" / jgt { ; number + ldb *shiftDown / jpz { + sub "0" / ldb a / ldp numshifts / adp b + lda *p + } + jss printchar + rts + } / } + ldp keys_2430 / ldq keys_2430_shift / ldb 24 / ldc 30 / jss printcharblock ; symbols + ldp keys_6063 / ldq keys_6063_shift / ldb 60 / ldc 63 / jss printcharblock + ldp keys_numpad / ldq keys_numpad_shift / ldb 96 / ldc 111 / jss printcharblock + cmp 13 / jnz { ; newline + jss clearCursor + ldp *screenPos + ldb pl / ldc ph + lda b / and $C0 / ldb a + ldp cb + adp $40 + stp *screenPos + jss updateMoveScreen + rts + } + cmp 9 / jnz { ; tab + + rts + } + cmp 32 / jnz { / lda 32 / jsr printchar / rts / } ; space + cmp 8 / jnz { ; backspace + ldc 1 / jss moveback + rts + } + cmp 37 / jnz { ; left + ldc 0 / jss moveback + rts + } + cmp 39 / jnz { ; right + jss clearCursor + ldp *screenPos + lda ph / cmp $0B / jnz { + lda pl / cmp $FF / jnz { + rts + } + } + adp 1 + stp *screenPos + rts + } + jss printhex + rts + + FUNC moveforward: + + rts + + FUNC moveback: ; c = delete char (bool) + jss clearCursor + ldp *screenPos + lda ph / cmp $08 / jnz { + lda pl / tst a / jnz { + rts + } + } + adp -1 + lda *p / jpz { ; one character + tst c / jpz { + lda 0 / sta *p + } + stp *screenPos + jpr | ; blank line + { + lda pl / and $3F ; stop at beginning of line + adp -1 + jpz | + lda *p + jpz } + adp 1 + stp *screenPos + } + rts + + FUNC printcharblock: + cmp b / jlt { / cmp c / jgt { + ldc *shiftDown / jpz { + ldp q + } + sub b / ldb a / adp b + lda *p / jss printchar + pop q / rts + } / } + rts + + FUNC clearCursor: + psh a / psh b / psh c + ldp *screenPos + ldc ph / ldb pl / adc $04 / ldp cb ; get highlight addr from screen pos + ;lda *p / and $7F / sta *p ; clear highlight bit + lda $3E / sta *p ; set to black + lda 0 / sta *cursorTimer + pop c / pop b / pop a + rts + + FUNC updateMoveScreen: + ldp *screenPos + lda ph + cmp $0C + jnz { + jss moveScreenUp + } + rts + + FUNC printchar: + jss clearCursor + ldp *screenPos / sta *p++ / stp *screenPos + jss updateMoveScreen + rts + + FUNC moveScreenUp: + ldp (SCREEN+$40) + ldq (SCREEN) + ldb $0F / { + ldc $40 / { + lda *p++ / sta *q++ + dec c + jnz } + dec b + jnz } + stq *screenPos + ldb $00 + ldc $20 + ldp (SCRCLR+$40*$0F) + lda $40 / { + stb *q++ + stc *p++ + dec a + jnz } + rts + + FUNC printhex: + ldp *screenPos + ldb a + and $F0 + shr 4 + add "0" + cmp "9" / jle { / add 7 / } + jss printchar + lda b + and $0F + add "0" + cmp "9" / jle { / add 7 / } + jss printchar + lda 0 + jss printchar + stp *screenPos + rts + + FUNC clearscreen: + ldp screen.char / stp *screenPos + ldq screen.color + lda $00 ; blank + ;ldb $20 ; white color, no highlight + ldb $3E ; black color, no highlight + ldc 128 ; 128*8 = 4k of each p and q + { + sta *p++ + stb *q++ + sta *p++ + stb *q++ + sta *p++ + stb *q++ + sta *p++ + stb *q++ + sta *p++ + stb *q++ + sta *p++ + stb *q++ + sta *p++ + stb *q++ + sta *p++ + stb *q++ + dec c + jnz } + rts + +.org SYSRAM + inttempp: word + inttemps: word + intstack: byte[(128-4)] + stack: byte[128] + +.org USERRAM + screenPos: word + shiftDown: byte + cursorTimer: byte