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