mirror of
https://github.com/irmen/prog8.git
synced 2024-09-08 10:55:08 +00:00
fixed handling of main module when importing another. fixed diskdir closedown.
This commit is contained in:
parent
5099525e24
commit
0e3c92626e
@ -263,7 +263,10 @@ class Module(override val name: String,
|
|||||||
val importedBy = mutableListOf<Module>()
|
val importedBy = mutableListOf<Module>()
|
||||||
val imports = mutableSetOf<Module>()
|
val imports = mutableSetOf<Module>()
|
||||||
|
|
||||||
var loadAddress: Int = 0 // can be set with the %address directive
|
val loadAddress: Int by lazy {
|
||||||
|
val address = (statements.singleOrNull { it is Directive && it.directive == "%address" } as? Directive)?.args?.single()?.int ?: 0
|
||||||
|
address
|
||||||
|
}
|
||||||
|
|
||||||
override fun linkParents(parent: Node) {
|
override fun linkParents(parent: Node) {
|
||||||
this.parent = parent
|
this.parent = parent
|
||||||
|
@ -3,6 +3,7 @@ package prog8.ast.base
|
|||||||
import prog8.ast.Module
|
import prog8.ast.Module
|
||||||
import prog8.ast.Program
|
import prog8.ast.Program
|
||||||
import prog8.ast.processing.*
|
import prog8.ast.processing.*
|
||||||
|
import prog8.ast.statements.Directive
|
||||||
import prog8.compiler.CompilationOptions
|
import prog8.compiler.CompilationOptions
|
||||||
import prog8.compiler.BeforeAsmGenerationAstChanger
|
import prog8.compiler.BeforeAsmGenerationAstChanger
|
||||||
|
|
||||||
@ -68,3 +69,37 @@ internal fun Program.variousCleanups() {
|
|||||||
process.visit(this)
|
process.visit(this)
|
||||||
process.applyModifications()
|
process.applyModifications()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal fun Program.moveMainAndStartToFirst() {
|
||||||
|
// the module containing the program entrypoint is moved to the first in the sequence.
|
||||||
|
// the "main" block containing the entrypoint is moved to the top in there,
|
||||||
|
// and finally the entrypoint subroutine "start" itself is moved to the top in that block.
|
||||||
|
|
||||||
|
val directives = modules[0].statements.filterIsInstance<Directive>()
|
||||||
|
val start = this.entrypoint()
|
||||||
|
if(start!=null) {
|
||||||
|
val mod = start.definingModule()
|
||||||
|
val block = start.definingBlock()
|
||||||
|
if(!modules.remove(mod))
|
||||||
|
throw FatalAstException("module wrong")
|
||||||
|
modules.add(0, mod)
|
||||||
|
mod.remove(block)
|
||||||
|
var afterDirective = mod.statements.indexOfFirst { it !is Directive }
|
||||||
|
if(afterDirective<0)
|
||||||
|
mod.statements.add(block)
|
||||||
|
else
|
||||||
|
mod.statements.add(afterDirective, block)
|
||||||
|
block.remove(start)
|
||||||
|
afterDirective = block.statements.indexOfFirst { it !is Directive }
|
||||||
|
if(afterDirective<0)
|
||||||
|
block.statements.add(start)
|
||||||
|
else
|
||||||
|
block.statements.add(afterDirective, start)
|
||||||
|
|
||||||
|
// overwrite the directives in the module containing the entrypoint
|
||||||
|
for(directive in directives) {
|
||||||
|
modules[0].statements.removeAll { it is Directive && it.directive == directive.directive }
|
||||||
|
modules[0].statements.add(0, directive)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -120,8 +120,6 @@ private fun determineCompilationOptions(program: Program): CompilationOptions {
|
|||||||
as? Directive)?.args?.single()?.name?.toUpperCase()
|
as? Directive)?.args?.single()?.name?.toUpperCase()
|
||||||
val launcherType = (mainModule.statements.singleOrNull { it is Directive && it.directive == "%launcher" }
|
val launcherType = (mainModule.statements.singleOrNull { it is Directive && it.directive == "%launcher" }
|
||||||
as? Directive)?.args?.single()?.name?.toUpperCase()
|
as? Directive)?.args?.single()?.name?.toUpperCase()
|
||||||
mainModule.loadAddress = (mainModule.statements.singleOrNull { it is Directive && it.directive == "%address" }
|
|
||||||
as? Directive)?.args?.single()?.int ?: 0
|
|
||||||
val zpoption: String? = (mainModule.statements.singleOrNull { it is Directive && it.directive == "%zeropage" }
|
val zpoption: String? = (mainModule.statements.singleOrNull { it is Directive && it.directive == "%zeropage" }
|
||||||
as? Directive)?.args?.single()?.name?.toUpperCase()
|
as? Directive)?.args?.single()?.name?.toUpperCase()
|
||||||
val allOptions = program.modules.flatMap { it.statements }.filter { it is Directive && it.directive == "%option" }.flatMap { (it as Directive).args }.toSet()
|
val allOptions = program.modules.flatMap { it.statements }.filter { it is Directive && it.directive == "%option" }.flatMap { (it as Directive).args }.toSet()
|
||||||
@ -211,6 +209,7 @@ private fun postprocessAst(programAst: Program, errors: ErrorReporter, compilerO
|
|||||||
programAst.checkRecursion(errors) // check if there are recursive subroutine calls
|
programAst.checkRecursion(errors) // check if there are recursive subroutine calls
|
||||||
errors.handle()
|
errors.handle()
|
||||||
programAst.verifyFunctionArgTypes()
|
programAst.verifyFunctionArgTypes()
|
||||||
|
programAst.moveMainAndStartToFirst()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun writeAssembly(programAst: Program, errors: ErrorReporter, outputDir: Path,
|
private fun writeAssembly(programAst: Program, errors: ErrorReporter, outputDir: Path,
|
||||||
|
@ -12,56 +12,4 @@
|
|||||||
|
|
||||||
; The only difference with diskdir.p8 is the directives that make this load at 50000.
|
; The only difference with diskdir.p8 is the directives that make this load at 50000.
|
||||||
|
|
||||||
main {
|
%import diskdir
|
||||||
sub start() {
|
|
||||||
txt.print("directory of disk drive #8:\n\n")
|
|
||||||
diskdir(8)
|
|
||||||
}
|
|
||||||
|
|
||||||
sub diskdir(ubyte drivenumber) {
|
|
||||||
c64.SETNAM(1, "$")
|
|
||||||
c64.SETLFS(1, drivenumber, 0)
|
|
||||||
void c64.OPEN() ; open 1,8,0,"$"
|
|
||||||
if_cs
|
|
||||||
goto io_error
|
|
||||||
void c64.CHKIN(1) ; use #1 as input channel
|
|
||||||
if_cs
|
|
||||||
goto io_error
|
|
||||||
|
|
||||||
repeat 4 {
|
|
||||||
void c64.CHRIN() ; skip the 4 prologue bytes
|
|
||||||
}
|
|
||||||
|
|
||||||
; while not key pressed / EOF encountered, read data.
|
|
||||||
ubyte status = c64.READST()
|
|
||||||
while not status {
|
|
||||||
txt.print_uw(mkword(c64.CHRIN(), c64.CHRIN()))
|
|
||||||
txt.chrout(' ')
|
|
||||||
ubyte @zp char
|
|
||||||
do {
|
|
||||||
char = c64.CHRIN()
|
|
||||||
txt.chrout(char)
|
|
||||||
} until char==0
|
|
||||||
txt.chrout('\n')
|
|
||||||
repeat 2 {
|
|
||||||
void c64.CHRIN() ; skip 2 bytes
|
|
||||||
}
|
|
||||||
status = c64.READST()
|
|
||||||
|
|
||||||
c64.STOP()
|
|
||||||
if_nz
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
io_error:
|
|
||||||
status = c64.READST()
|
|
||||||
c64.CLOSE(1)
|
|
||||||
c64.CLRCHN() ; restore default i/o devices
|
|
||||||
|
|
||||||
if status and status != 64 { ; 64=end of file
|
|
||||||
txt.print("\ni/o error, status: ")
|
|
||||||
txt.print_ub(status)
|
|
||||||
txt.chrout('\n')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -40,15 +40,15 @@ main {
|
|||||||
void c64.CHRIN() ; skip 2 bytes
|
void c64.CHRIN() ; skip 2 bytes
|
||||||
void c64.CHRIN()
|
void c64.CHRIN()
|
||||||
status = c64.READST()
|
status = c64.READST()
|
||||||
c64.STOP()
|
void c64.STOP()
|
||||||
if_nz
|
if_nz
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
io_error:
|
io_error:
|
||||||
status = c64.READST()
|
status = c64.READST()
|
||||||
c64.CLOSE(1)
|
|
||||||
c64.CLRCHN() ; restore default i/o devices
|
c64.CLRCHN() ; restore default i/o devices
|
||||||
|
c64.CLOSE(1)
|
||||||
|
|
||||||
if status and status != 64 { ; 64=end of file
|
if status and status != 64 { ; 64=end of file
|
||||||
txt.print("\ni/o error, status: ")
|
txt.print("\ni/o error, status: ")
|
||||||
|
@ -8,6 +8,18 @@ main {
|
|||||||
str planet_name = "12345678"
|
str planet_name = "12345678"
|
||||||
sub start() {
|
sub start() {
|
||||||
|
|
||||||
|
uword[] warray = [1,2,3,4,5]
|
||||||
|
|
||||||
|
uword sums
|
||||||
|
ubyte ii
|
||||||
|
uword ww
|
||||||
|
uword wptr = &warray
|
||||||
|
&uword wmap = $c000
|
||||||
|
|
||||||
|
wmap += ii
|
||||||
|
wmap <<= ii
|
||||||
|
wmap >>= ii
|
||||||
|
|
||||||
txt.print(planet_name)
|
txt.print(planet_name)
|
||||||
txt.chrout('\n')
|
txt.chrout('\n')
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user