mirror of
https://github.com/irmen/prog8.git
synced 2024-11-02 22:04:40 +00:00
check for file with %asmbinary, %asminclude
This commit is contained in:
parent
a81b82495c
commit
0ee43294c4
@ -7,6 +7,7 @@ import prog8.compiler.target.c64.FLOAT_MAX_POSITIVE
|
|||||||
import prog8.functions.BuiltinFunctions
|
import prog8.functions.BuiltinFunctions
|
||||||
import prog8.optimizing.same
|
import prog8.optimizing.same
|
||||||
import prog8.parser.ParsingFailedError
|
import prog8.parser.ParsingFailedError
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* General checks on the Ast
|
* General checks on the Ast
|
||||||
@ -632,6 +633,7 @@ private class AstChecker(private val namespace: INameScope,
|
|||||||
if(directive.parent !is INameScope || directive.parent is Module) err("this directive may only occur in a block")
|
if(directive.parent !is INameScope || directive.parent is Module) err("this directive may only occur in a block")
|
||||||
if(directive.args.size!=2 || directive.args[0].str==null || directive.args[1].str==null)
|
if(directive.args.size!=2 || directive.args[0].str==null || directive.args[1].str==null)
|
||||||
err("invalid asminclude directive, expected arguments: \"filename\", \"scopelabel\"")
|
err("invalid asminclude directive, expected arguments: \"filename\", \"scopelabel\"")
|
||||||
|
checkFileExists(directive, directive.args[0].str!!)
|
||||||
}
|
}
|
||||||
"%asmbinary" -> {
|
"%asmbinary" -> {
|
||||||
if(directive.parent !is INameScope || directive.parent is Module) err("this directive may only occur in a block")
|
if(directive.parent !is INameScope || directive.parent is Module) err("this directive may only occur in a block")
|
||||||
@ -641,6 +643,7 @@ private class AstChecker(private val namespace: INameScope,
|
|||||||
if(directive.args.size>=2 && directive.args[1].int==null) err(errormsg)
|
if(directive.args.size>=2 && directive.args[1].int==null) err(errormsg)
|
||||||
if(directive.args.size==3 && directive.args[2].int==null) err(errormsg)
|
if(directive.args.size==3 && directive.args[2].int==null) err(errormsg)
|
||||||
if(directive.args.size>3) err(errormsg)
|
if(directive.args.size>3) err(errormsg)
|
||||||
|
checkFileExists(directive, directive.args[0].str!!)
|
||||||
}
|
}
|
||||||
"%option" -> {
|
"%option" -> {
|
||||||
if(directive.parent !is Block && directive.parent !is Module) err("this directive may only occur in a block or at module level")
|
if(directive.parent !is Block && directive.parent !is Module) err("this directive may only occur in a block or at module level")
|
||||||
@ -654,6 +657,14 @@ private class AstChecker(private val namespace: INameScope,
|
|||||||
return super.process(directive)
|
return super.process(directive)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun checkFileExists(directive: Directive, filename: String) {
|
||||||
|
var definingModule = directive.parent
|
||||||
|
while (definingModule !is Module)
|
||||||
|
definingModule = definingModule.parent
|
||||||
|
if (!(filename.startsWith("library:") || definingModule.importedFrom.resolveSibling(filename).toFile().isFile || File(filename).isFile))
|
||||||
|
checkResult.add(NameError("included file not found: $filename", directive.position))
|
||||||
|
}
|
||||||
|
|
||||||
override fun process(literalValue: LiteralValue): LiteralValue {
|
override fun process(literalValue: LiteralValue): LiteralValue {
|
||||||
if(!compilerOptions.floats && literalValue.type==DataType.FLOAT) {
|
if(!compilerOptions.floats && literalValue.type==DataType.FLOAT) {
|
||||||
checkResult.add(SyntaxError("floating point used, but that is not enabled via options", literalValue.position))
|
checkResult.add(SyntaxError("floating point used, but that is not enabled via options", literalValue.position))
|
||||||
|
@ -123,6 +123,8 @@ Directives
|
|||||||
This directive can only be used inside a block.
|
This directive can only be used inside a block.
|
||||||
The assembler will include the file as binary bytes at this point, prog8 will not process this at all.
|
The assembler will include the file as binary bytes at this point, prog8 will not process this at all.
|
||||||
The optional offset and length can be used to select a particular piece of the file.
|
The optional offset and length can be used to select a particular piece of the file.
|
||||||
|
The compiler first looks for the file relative to the same directory as the module containing this statement is in,
|
||||||
|
if the file can't be found there it is searched relative to the current directory.
|
||||||
|
|
||||||
.. data:: %asminclude "<filename>", "scopelabel"
|
.. data:: %asminclude "<filename>", "scopelabel"
|
||||||
|
|
||||||
@ -133,6 +135,8 @@ Directives
|
|||||||
The scopelabel argument will be used as a prefix to access the labels from the included source code,
|
The scopelabel argument will be used as a prefix to access the labels from the included source code,
|
||||||
otherwise you would risk symbol redefinitions or duplications.
|
otherwise you would risk symbol redefinitions or duplications.
|
||||||
If you know what you are doing you can leave it as an empty string to not have a scope prefix.
|
If you know what you are doing you can leave it as an empty string to not have a scope prefix.
|
||||||
|
The compiler first looks for the file relative to the same directory as the module containing this statement is in,
|
||||||
|
if the file can't be found there it is searched relative to the current directory.
|
||||||
|
|
||||||
.. data:: %breakpoint
|
.. data:: %breakpoint
|
||||||
|
|
||||||
|
@ -4,25 +4,7 @@
|
|||||||
|
|
||||||
sub start() {
|
sub start() {
|
||||||
|
|
||||||
ubyte[81] array2 = 20 to 100
|
%asminclude "primes.p8", "derp"
|
||||||
word[] array3 = 3000 to 3100
|
%asmbinary "primes.p8", 10, 20
|
||||||
|
|
||||||
c64scr.print_uw(len(array2))
|
|
||||||
c64.CHROUT('\n')
|
|
||||||
c64scr.print_uw(len(array3))
|
|
||||||
c64.CHROUT('\n')
|
|
||||||
c64.CHROUT('\n')
|
|
||||||
c64scr.print_ub(array2[0])
|
|
||||||
c64.CHROUT(',')
|
|
||||||
c64scr.print_ub(array2[1])
|
|
||||||
c64.CHROUT(',')
|
|
||||||
c64scr.print_ub(array2[2])
|
|
||||||
c64.CHROUT('\n')
|
|
||||||
c64scr.print_w(array3[0])
|
|
||||||
c64.CHROUT(',')
|
|
||||||
c64scr.print_w(array3[1])
|
|
||||||
c64.CHROUT(',')
|
|
||||||
c64scr.print_w(array3[2])
|
|
||||||
c64.CHROUT('\n')
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user