make assembler use \\ instead of / for newlines

This commit is contained in:
Redo 2024-03-01 20:58:07 -06:00
parent eaae7bb2d2
commit 717a9d9b08
3 changed files with 345 additions and 3 deletions

View File

@ -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)

47
examples/_hwdefs.asm Normal file
View File

@ -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

288
examples/editor2.asm Normal file
View File

@ -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