asm fixes

This commit is contained in:
Irmen de Jong 2018-11-20 18:01:53 +01:00
parent c90230d33a
commit 034973a9e6
4 changed files with 29 additions and 22 deletions

View File

@ -9,8 +9,8 @@
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="lib" level="project" />
<orderEntry type="library" name="KotlinJavaRuntime" level="project" />
<orderEntry type="library" name="lib1" level="project" />
<orderEntry type="library" name="antlr-4.7.1" level="project" />
<orderEntry type="library" name="testlibs" level="project" />
</component>
</module>
</module>

View File

@ -1,4 +1,4 @@
%option enable_floats
%import mathlib
%import c64lib
%import c64utils
@ -18,28 +18,29 @@ sub start() {
;v1=foo()
address =c64.MEMBOT(1, 40000.w) ; ok!
address =c64.MEMBOT(1, address) ; ok!
address =c64.MEMBOT(1, memaddr) ; ok!i
;address =c64.MEMBOT(1, 40000.w) ; ok!
;address =c64.MEMBOT(1, address) ; ok!
;address =c64.MEMBOT(1, memaddr) ; ok!i
;address =c64.MEMBOT(1, wordarray[1]) ; @todo nice error about loading X register from stack
A, Y =c64.GETADR() ; ok!
Y, A =c64.GETADR() ; ok!
address = c64flt.GETADRAY() ; ok!
memaddr = c64flt.GETADRAY() ; ok!
wordarray[1] = c64flt.GETADRAY() ; ok!
v1, v2 =c64.GETADR() ; ok!
address =c64.IOBASE() ; ok!
A = c64.CHRIN() ; ok !
X = c64.CHRIN() ; ok !
v1 = c64.CHRIN() ; ok !
;A, Y =c64.GETADR() ; ok!
;Y, A =c64.GETADR() ; ok!
;address = c64flt.GETADRAY() ; ok!
;memaddr = c64flt.GETADRAY() ; ok!
;wordarray[1] = c64flt.GETADRAY() ; ok!
;v1, v2 =c64.GETADR() ; ok!
;address =c64.IOBASE() ; ok!
;A = c64.CHRIN() ; ok !
;X = c64.CHRIN() ; ok !
;Y = c64.CHRIN() ; ok!
;v1 = c64.CHRIN() ; ok !
return
}
sub foo() -> byte {
return 1 ; @todo fix error: '1' as byte literal (not ubyte)
sub foo() -> float {
return 1 ; @todo fix error: '1' as byte or float literal (not ubyte)
}

View File

@ -6,7 +6,7 @@ import prog8.functions.BuiltinFunctions
* Checks the validity of all identifiers (no conflicts)
* Also builds a list of all (scoped) symbol definitions
* Also makes sure that subroutine's parameters also become local variable decls in the subroutine's scope.
* Finally, it also makes sure the datatype of all Var decls is set correctly.
* Finally, it also makes sure the datatype of all Var decls and sub Return values is set correctly.
*/
fun Module.checkIdentifiers(): MutableMap<String, IStatement> {
@ -151,4 +151,12 @@ class AstIdentifiersChecker : IAstProcessor {
printWarning("writing to the X register is dangerous, because it's used as an internal pointer", assignTarget.position)
return super.process(assignTarget)
}
override fun process(returnStmt: Return): IStatement {
if(returnStmt.values.isNotEmpty()) {
println("CHECK $returnStmt") // TODO adjust return value literalvalue datatype to subroutine's definition
returnStmt.definingScope()
}
return super.process(returnStmt)
}
}

View File

@ -794,8 +794,6 @@ private class StatementTranslator(private val prog: IntermediateProgram,
private fun translateSubroutineCall(subroutine: Subroutine, arguments: List<IExpression>, callPosition: Position) {
// evaluate the arguments and assign them into the subroutine's argument variables.
prog.line(callPosition)
if(subroutine.asmParameterRegisters.isNotEmpty()) {
if(subroutine.parameters.size!=subroutine.asmParameterRegisters.size)
throw CompilerException("no support for mix of register and non-register subroutine arguments")