1
0
mirror of https://github.com/KarolS/millfork.git synced 2026-04-20 18:16:35 +00:00

Preprocessor: add #use A=B and if(i,t,e)

This commit is contained in:
Karol Stasiak
2019-06-14 12:00:45 +02:00
parent 3852b2dbe9
commit 51a6ec9d73
4 changed files with 41 additions and 11 deletions
@@ -59,10 +59,14 @@ object Preprocessor {
keyword match {
case "use" => if (enabled) {
if (param == "") log.error("#use should have a parameter", pos)
featureConstants += param -> options.features.getOrElse(param, {
log.warn(s"Undefined parameter $param, assuming 0", pos)
0L
})
param.split("=", 2) match {
case Array(p) =>
featureConstants += param -> options.features.getOrElse(param, {
log.warn(s"Undefined parameter $param, assuming 0", pos)
0L
})
case Array(p0,p1) => featureConstants += p0.trim() -> evalParam(p1, pos)
}
}
case "fatal" => if (enabled) log.fatal(param, pos)
case "error" => if (enabled) log.error(param, pos)
@@ -167,7 +171,8 @@ class PreprocessorParser(options: CompilationOptions) {
case ("not", List(p)) => {m:M => Some(if (p(m).getOrElse(0L) == 0) 1 else 0)}
case ("lo", List(p)) => {m:M => Some(p(m).getOrElse(0L) & 0xff)}
case ("hi", List(p)) => {m:M => Some(p(m).getOrElse(0L).>>(8).&(0xff))}
case ("defined" | "lo" | "hi" | "not", ps) =>
case ("if", List(i, t, e)) => {m:M => if (i(m).getOrElse(0L) != 0) t(m) else e(m)}
case ("defined" | "lo" | "hi" | "not" | "if", ps) =>
log.error(s"Invalid number of parameters to $name: ${ps.length}")
alwaysNone
case _ =>
@@ -195,14 +195,17 @@ class BasicSymonTest extends FunSuite with Matchers {
| #use ARCH_6502
| #use ARCH_I80
|
| #use HORSE = ARCH_6502
| #use COW = ARCH_I80
|
| #if 1
| asm void main () {
| #if ARCH_6502
| lda #ARCH_6502
| lda #HORSE
| sta output
| rts
| #elseif ARCH_I80
| ld a,ARCH_I80
| ld a,COW
| ld (output),a
| ret
| #else