87 lines
2.7 KiB
Sed
Executable file
87 lines
2.7 KiB
Sed
Executable file
#!/usr/bin/env -S sed -Ef
|
|
# Octo expects the entry point to be labelled "main"
|
|
1{
|
|
: skip-header-comments
|
|
/^[[:blank:]]*[^;]/b skip-header-comments-end
|
|
# We do the replacement for comments here as well, since the
|
|
# bulk of # the code doesn't get run for the lines we skip over
|
|
# here with 'n'.
|
|
s/;/#/
|
|
n
|
|
b skip-header-comments
|
|
: skip-header-comments-end
|
|
i: main
|
|
}
|
|
|
|
# Labels "foo:" → ": foo"
|
|
s/(^[[:blank:]]*)([A-Za-z_][A-Za-z0-9_]*):/\1: \2/
|
|
|
|
# Numeric literals, "#ff" "%11100000" → "0xff" "0b11100000"
|
|
s/#([0-9A-Fa-f]+)/0x\1/g
|
|
s/%([01]+)/0b\1/g
|
|
|
|
# Comments ';' → '#'
|
|
# We do this after numeric literals, since '#' is used for hex in c8asm
|
|
s/;/#/
|
|
|
|
# Numeric constants, "#define foo 5" → ":const foo 5"
|
|
s/(^[[:blank:]]*)define ([A-Za-z_][A-Za-z0-9_]*) ([0-9]+)/\1:const \2 \3/
|
|
|
|
# Register aliases, "#define foo v2" → ":alias foo v2"
|
|
s/(^[[:blank:]]*)define ([A-Za-z_][A-Za-z0-9_]*) (v[0-9A-Fa-f]+)/\1:alias \2 \3/
|
|
|
|
# Subroutine call, "call X" → ":call X"
|
|
s/(^[[:blank:]]*)call /\1:call /
|
|
# Subroutine return, "ret" → "return"
|
|
s/(^[[:blank:]]*)ret\>/\1return/
|
|
|
|
# Computed jump, "jp v0, N" → "jump0 N"
|
|
s/(^[[:blank:]]*)jp v0, /\1jump0 /
|
|
# Absolute jump, "jp N" → "jump N"
|
|
s/(^[[:blank:]]*)jp /\1jump /
|
|
|
|
# Screen clear "cls" → "clear"
|
|
s/(^[[:blank:]]*)cls\>/\1clear/
|
|
# Draw sprite "drw X, Y, N" → "sprite X Y N"
|
|
s/(^[[:blank:]]*)drw ([^,]+), ([^,]+), /\1sprite \2 \3 /
|
|
|
|
# Loads "ld X, [i]" → "load X"
|
|
s/(^[[:blank:]]*)ld ([^,]+), \[i\]/\1load \2/
|
|
# Stores "ld [i], X" → "save X"
|
|
s/(^[[:blank:]]*)ld \[i\], /\1save /
|
|
|
|
# BCD conversion, "ld b, X" → "bcd X"
|
|
s/(^[[:blank:]]*)ld b, /\1bcd /
|
|
# Hex digit, "ld f, X" → "i := hex X"
|
|
s/(^[[:blank:]]*)ld f, /\1i := hex /
|
|
|
|
# Immediate loads / register transfers, "ld X, Y" → "X := Y"
|
|
s/(^[[:blank:]]*)ld ([^,]+), /\1\2 := /
|
|
# "st" "dt" → "buzzer" "delay"
|
|
s/\<st :=/buzzer :=/
|
|
s/\<dt :=/delay :=/
|
|
s/:= dt\>/:= delay/
|
|
|
|
# Random numbers, "rnd X, N" → "X := random N"
|
|
s/(^[[:blank:]]*)rnd ([^,]+), /\1\2 := random /
|
|
|
|
# Arithmetic, "(add|sub|or|and|xor|shl|shr) X, Y" → "X (+|-|[|]|&|[^]|<<|>>)= Y"
|
|
s/(^[[:blank:]]*)add ([^,]+), /\1\2 += /
|
|
s/(^[[:blank:]]*)sub ([^,]+), /\1\2 -= /
|
|
s/(^[[:blank:]]*)or ([^,]+), /\1\2 |= /
|
|
s/(^[[:blank:]]*)and ([^,]+), /\1\2 \&= /
|
|
s/(^[[:blank:]]*)xor ([^,]+), /\1\2 ^= /
|
|
s/(^[[:blank:]]*)shl ([^,]+), /\1\2 <<= /
|
|
s/(^[[:blank:]]*)shr ([^,]+), /\1\2 >>= /
|
|
|
|
# Key-skips → ifs, "sk(n|)p X" → "if (|-)key X then"
|
|
s/(^[[:blank:]]*)sknp ([^;]*)/\1if \2 key then/
|
|
s/(^[[:blank:]]*)skp ([^;]*)/\1if \2 -key then/
|
|
|
|
# Comparison-skips → ifs, "(sne|se) X, Y" → "if X (==|!=) Y then"
|
|
s/(^[[:blank:]]*)sne ([^,]+), ([^;]*)/\1if \2 == \3 then/
|
|
s/(^[[:blank:]]*)se ([^,]+), ([^;]*)/\1if \2 != \3 then/
|
|
|
|
# Data, "db X, Y, Z" → ":byte X, Y, Z"
|
|
s/(^: [^ ]+) db /\1 :byte /
|
|
/(^: [^ ]+) :byte /s/,//g
|