From bc077d3ada3b76c7752eac49b787a2a9bd9d6225 Mon Sep 17 00:00:00 2001 From: Karol Stasiak Date: Sat, 10 Mar 2018 00:06:50 +0100 Subject: [PATCH] Inline assembly parsing improvements --- src/main/scala/millfork/output/Assembler.scala | 1 - src/main/scala/millfork/parser/MfParser.scala | 17 ++++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/main/scala/millfork/output/Assembler.scala b/src/main/scala/millfork/output/Assembler.scala index c8e90fab..42ab9fc3 100644 --- a/src/main/scala/millfork/output/Assembler.scala +++ b/src/main/scala/millfork/output/Assembler.scala @@ -294,7 +294,6 @@ class Assembler(private val program: Program, private val rootEnv: Environment) } env.getAllFixedAddressObjects.foreach { case (addr, size) => - println(addr) for(i <- 0 until size) bank0.occupied(addr + i) = true } val variableAllocator = platform.variableAllocator diff --git a/src/main/scala/millfork/parser/MfParser.scala b/src/main/scala/millfork/parser/MfParser.scala index c7d47ae7..9c3ebee2 100644 --- a/src/main/scala/millfork/parser/MfParser.scala +++ b/src/main/scala/millfork/parser/MfParser.scala @@ -330,7 +330,7 @@ case class MfParser(filename: String, input: String, currentDirectory: String, o // def zeropageAddrModeHint: P[Option[Boolean]] = Pass - def asmOpcode: P[Opcode.Value] = (position() ~ letter.rep(exactly = 3).!).map { case (p, o) => Opcode.lookup(o, Some(p)) } + def asmOpcode: P[Opcode.Value] = (position() ~ letter.rep(exactly = 3).! ~ ("_W" | "_w").?.!).map { case (p, suffix, o) => Opcode.lookup(o + suffix, Some(p)) } def asmExpression: P[Expression] = (position() ~ NoCut( ("<" ~/ HWS ~ mlExpression(mathLevel)).map(e => HalfWordExpression(e, hiByte = false)) | @@ -338,20 +338,26 @@ case class MfParser(filename: String, input: String, currentDirectory: String, o mlExpression(mathLevel) )).map { case (p, e) => e.pos(p) } - val commaX = HWS ~ "," ~ HWS ~ ("X" | "x") ~ HWS - val commaY = HWS ~ "," ~ HWS ~ ("Y" | "y") ~ HWS - val commaZ = HWS ~ "," ~ HWS ~ ("Z" | "z") ~ HWS - val commaS = HWS ~ "," ~ HWS ~ ("S" | "s") ~ HWS + private val commaX = HWS ~ "," ~ HWS ~ ("X" | "x") ~ HWS + private val commaY = HWS ~ "," ~ HWS ~ ("Y" | "y") ~ HWS + private val commaZ = HWS ~ "," ~ HWS ~ ("Z" | "z") ~ HWS + private val commaS = HWS ~ "," ~ HWS ~ ("S" | "s") ~ HWS + + val farKeyword: P[Unit] = P(("f" | "F") ~ ("a" | "A") ~ ("r" | "R")) def asmParameter: P[(AddrMode.Value, Expression)] = { (SWS ~ ( ("##" ~ asmExpression).map(AddrMode.WordImmediate -> _) | ("#" ~ asmExpression).map(AddrMode.Immediate -> _) | ("(" ~ HWS ~ asmExpression ~ HWS ~ ")" ~ commaY).map(AddrMode.IndexedY -> _) | + (farKeyword ~ HWS ~ "(" ~ HWS ~ asmExpression ~ HWS ~ ")" ~ commaY).map(AddrMode.LongIndexedY -> _) | ("(" ~ HWS ~ asmExpression ~ commaS ~ ")" ~ commaY).map(AddrMode.IndexedSY -> _) | ("(" ~ HWS ~ asmExpression ~ HWS ~ ")" ~ commaZ).map(AddrMode.IndexedZ -> _) | ("(" ~ HWS ~ asmExpression ~ commaX ~ ")").map(AddrMode.IndexedX -> _) | ("(" ~ HWS ~ asmExpression ~ HWS ~ ")").map(AddrMode.Indirect -> _) | + (farKeyword ~ HWS ~ "(" ~ HWS ~ asmExpression ~ HWS ~ ")").map(AddrMode.LongIndexedZ -> _) | + (farKeyword ~ HWS ~ asmExpression ~ commaX).map(AddrMode.LongAbsoluteX -> _) | + (farKeyword ~ HWS ~ asmExpression).map(AddrMode.LongAbsolute -> _) | (asmExpression ~ commaS).map(AddrMode.Stack -> _) | (asmExpression ~ commaX).map(AddrMode.AbsoluteX -> _) | (asmExpression ~ commaY).map(AddrMode.AbsoluteY -> _) | @@ -369,6 +375,7 @@ case class MfParser(filename: String, input: String, currentDirectory: String, o case (Opcode.SBX, AddrMode.Immediate) => AssemblyStatement(Opcode.SBX, param._1, param._2, elid) case (Opcode.SAY, AddrMode.AbsoluteX) => AssemblyStatement(Opcode.SHY, param._1, param._2, elid) case (Opcode.SBX, _) => AssemblyStatement(Opcode.SAX, param._1, param._2, elid) + case (_, AddrMode.Indirect) if op != Opcode.JMP && op != Opcode.JSR => AssemblyStatement(op, AddrMode.IndexedZ, param._2, elid) case _ => AssemblyStatement(op, param._1, param._2, elid) } }