make assembler use \\ instead of / for newlines
This commit is contained in:
parent
eaae7bb2d2
commit
717a9d9b08
@ -219,6 +219,7 @@ end
|
|||||||
local function preprocessCode(code)
|
local function preprocessCode(code)
|
||||||
code = "\n"..code.."\n"
|
code = "\n"..code.."\n"
|
||||||
|
|
||||||
|
-- apply brace labels and scoped labels
|
||||||
local curscope = ""
|
local curscope = ""
|
||||||
local codet = {}
|
local codet = {}
|
||||||
local wordt = {}
|
local wordt = {}
|
||||||
@ -245,6 +246,7 @@ local function preprocessCode(code)
|
|||||||
|
|
||||||
code = "\n"..table.concat(codet).."\n"
|
code = "\n"..table.concat(codet).."\n"
|
||||||
|
|
||||||
|
-- apply function macros
|
||||||
local funcmacros = {}
|
local funcmacros = {}
|
||||||
code = code:gsub(".define ([%.a-zA-Z0-9_]+)%(([^%)]+)%) ([^\n]+)", function(name, args, repl)
|
code = code:gsub(".define ([%.a-zA-Z0-9_]+)%(([^%)]+)%) ([^\n]+)", function(name, args, repl)
|
||||||
local argt = separateCommas(args)
|
local argt = separateCommas(args)
|
||||||
@ -266,6 +268,7 @@ local function preprocessCode(code)
|
|||||||
end)
|
end)
|
||||||
for name, replf in pairs(funcmacros) do code = code:gsub("([^a-zA-Z0-9_])"..name.." *%(([^%)]+)%)", replf) end
|
for name, replf in pairs(funcmacros) do code = code:gsub("([^a-zA-Z0-9_])"..name.." *%(([^%)]+)%)", replf) end
|
||||||
|
|
||||||
|
-- apply simple macros
|
||||||
local simplemacros = {}
|
local simplemacros = {}
|
||||||
code = code:gsub("%.define +([%.a-zA-Z0-9_]+) +([^\n]+)", function(name, repl)
|
code = code:gsub("%.define +([%.a-zA-Z0-9_]+) +([^\n]+)", function(name, repl)
|
||||||
assert(not simplemacros[name], "Redefinition of macro "..name)
|
assert(not simplemacros[name], "Redefinition of macro "..name)
|
||||||
@ -279,9 +282,10 @@ local function preprocessCode(code)
|
|||||||
invoc = invoc+1
|
invoc = invoc+1
|
||||||
return b..(repl:gsub("(_BRACE_[0-9]+_)", "%1"..invoc.."_"))..a
|
return b..(repl:gsub("(_BRACE_[0-9]+_)", "%1"..invoc.."_"))..a
|
||||||
end)
|
end)
|
||||||
|
print(name, code)
|
||||||
end
|
end
|
||||||
|
|
||||||
code = code:gsub("\\", "\n")
|
code = code:gsub("\\\\", "\n")
|
||||||
|
|
||||||
local uexprs = {}
|
local uexprs = {}
|
||||||
|
|
||||||
@ -355,14 +359,15 @@ local function prefixCode(code, fn) -- fix strings, add line numbers
|
|||||||
end
|
end
|
||||||
|
|
||||||
out(".ln 1"); out("\n");
|
out(".ln 1"); out("\n");
|
||||||
for i = 1, #code do
|
local i = 1
|
||||||
|
while i <= #code do
|
||||||
local c = code:sub(i, i)
|
local c = code:sub(i, i)
|
||||||
local cn = code:sub(i+1, i+1)
|
local cn = code:sub(i+1, i+1)
|
||||||
local cp = code:sub(i-1, i-1)
|
local cp = code:sub(i-1, i-1)
|
||||||
|
|
||||||
if state=="code" then
|
if state=="code" then
|
||||||
if c=="\r" 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
|
linenum = linenum+1
|
||||||
if not skipnl then out("\n") out(".ln "..linenum); out("\n"); end
|
if not skipnl then out("\n") out(".ln "..linenum); out("\n"); end
|
||||||
newline()
|
newline()
|
||||||
@ -413,6 +418,8 @@ local function prefixCode(code, fn) -- fix strings, add line numbers
|
|||||||
state = "string"
|
state = "string"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
i = i+1
|
||||||
end
|
end
|
||||||
assert(#bracestack==0, "unclosed brace")
|
assert(#bracestack==0, "unclosed brace")
|
||||||
local code2 = table.concat(outt)
|
local code2 = table.concat(outt)
|
||||||
|
47
examples/_hwdefs.asm
Normal file
47
examples/_hwdefs.asm
Normal 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
288
examples/editor2.asm
Normal 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
|
Loading…
x
Reference in New Issue
Block a user