mato8/c8asm-to-octo.sed
Juhani Krekelä a78e8e9204 Convert to Octo
2026-08-15 16:56:39 +03:00

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