This commit is contained in:
Irmen de Jong 2020-10-14 23:43:38 +02:00
parent aba437e5a2
commit 8b6eb74c58
2 changed files with 61 additions and 50 deletions

View File

@ -162,54 +162,40 @@ internal class StatementReorderer(val program: Program, val errors: ErrorReporte
} }
private fun flattenArrayAssignmentFromArrayLiteral(assign: Assignment): List<Assignment> { private fun flattenArrayAssignmentFromArrayLiteral(assign: Assignment): List<Assignment> {
// TODO use a pointer loop instead of individual assignments
val identifier = assign.target.identifier!! val identifier = assign.target.identifier!!
val targetVar = identifier.targetVarDecl(program.namespace)!! val targetVar = identifier.targetVarDecl(program.namespace)!!
val alv = assign.value as? ArrayLiteralValue val alv = assign.value as? ArrayLiteralValue
if(targetVar.arraysize==null) { return flattenArrayAssign(targetVar, alv, identifier, assign.position)
errors.err("array has no defined size", identifier.position)
return emptyList()
}
if(alv==null || alv.value.size != targetVar.arraysize!!.constIndex()) {
errors.err("element count mismatch", assign.position)
return emptyList()
}
return alv.value.withIndex().map { (index, value)->
val idx = ArrayIndexedExpression(identifier, ArrayIndex(NumericLiteralValue(DataType.UBYTE, index, assign.position), assign.position), assign.position)
Assignment(AssignTarget(null, idx, null, assign.position), value, value.position)
}
} }
private fun flattenArrayAssignmentFromIdentifier(assign: Assignment): List<Assignment> { private fun flattenArrayAssignmentFromIdentifier(assign: Assignment): List<Assignment> {
// TODO use a pointer loop instead of individual assignments
val identifier = assign.target.identifier!! val identifier = assign.target.identifier!!
val targetVar = identifier.targetVarDecl(program.namespace)!! val targetVar = identifier.targetVarDecl(program.namespace)!!
val sourceIdent = assign.value as IdentifierReference val sourceIdent = assign.value as IdentifierReference
val sourceVar = sourceIdent.targetVarDecl(program.namespace)!! val sourceVar = sourceIdent.targetVarDecl(program.namespace)!!
if(!sourceVar.isArray) { if(!sourceVar.isArray) {
errors.err("value must be an array", sourceIdent.position) errors.err("value must be an array", sourceIdent.position)
return emptyList() return emptyList()
} }
val alv = sourceVar.value as? ArrayLiteralValue
return flattenArrayAssign(targetVar, alv, identifier, assign.position)
}
private fun flattenArrayAssign(targetVar: VarDecl, alv: ArrayLiteralValue?, identifier: IdentifierReference, position: Position): List<Assignment> {
if(targetVar.arraysize==null) { if(targetVar.arraysize==null) {
errors.err("array has no defined size", identifier.position) errors.err("array has no defined size", identifier.position)
return emptyList() return emptyList()
} }
val alv = sourceVar.value as? ArrayLiteralValue
if(alv==null || alv.value.size != targetVar.arraysize!!.constIndex()) { if(alv==null || alv.value.size != targetVar.arraysize!!.constIndex()) {
errors.err("element count mismatch", assign.position) errors.err("element count mismatch", position)
return emptyList() return emptyList()
} }
// TODO use a pointer loop instead of individual assignments
return alv.value.withIndex().map { (index, value)-> return alv.value.withIndex().map { (index, value)->
val idx = ArrayIndexedExpression(identifier, ArrayIndex(NumericLiteralValue(DataType.UBYTE, index, assign.position), assign.position), assign.position) val idx = ArrayIndexedExpression(identifier, ArrayIndex(NumericLiteralValue(DataType.UBYTE, index, position), position), position)
Assignment(AssignTarget(null, idx, null, assign.position), value, value.position) Assignment(AssignTarget(null, idx, null, position), value, value.position)
} }
} }

View File

@ -10,7 +10,7 @@
; Note: this program is compatible with C64 and CX16. ; Note: this program is compatible with C64 and CX16.
; TODO save/load game function ; TODO finalize and test save/load game function
main { main {
@ -23,8 +23,7 @@ main {
txt.lowercase() txt.lowercase()
txt.print("\u000c\n --- TextElite v1.1 ---\n") txt.print("\u000c\n --- TextElite v1.1 ---\n")
galaxy.init(1) galaxy.travel_to(1, numforLave)
galaxy.travel_to(numforLave)
market.init(0) ; Lave's market is seeded with 0 market.init(0) ; Lave's market is seeded with 0
ship.init() ship.init()
planet.display(false) planet.display(false)
@ -70,8 +69,28 @@ trader {
ubyte num_chars ubyte num_chars
struct SaveData { struct SaveData {
uword xx ubyte galaxy
ubyte yy ubyte planet
ubyte cargo0
ubyte cargo1
ubyte cargo2
ubyte cargo3
ubyte cargo4
ubyte cargo5
ubyte cargo6
ubyte cargo7
ubyte cargo8
ubyte cargo9
ubyte cargo10
ubyte cargo11
ubyte cargo12
ubyte cargo13
ubyte cargo14
ubyte cargo15
ubyte cargo16
uword cash
ubyte max_cargo
ubyte fuel
} }
SaveData savedata SaveData savedata
@ -85,14 +104,23 @@ trader {
txt.chrout('\n') txt.chrout('\n')
} }
; TODO ACTUALLY LOAD SOMETHING RELEVANT ship.cash = savedata.cash
ship.Max_cargo = savedata.max_cargo
ship.fuel = savedata.fuel
;memcopy(&savedata.cargo0, ship.cargohold, len(ship.cargohold)) ; TODO fix compiler error about pointer
galaxy.travel_to(savedata.galaxy, savedata.planet)
; TODO CHECK IF GALAXY AND MARKET ARE OKAY AFTER LOAD
planet.display(false) planet.display(false)
} }
sub do_save() { sub do_save() {
savedata.xx=1111 savedata.galaxy = galaxy.number
savedata.yy=123 savedata.planet = planet.number
savedata.cash = ship.cash
savedata.max_cargo = ship.Max_cargo
savedata.fuel = ship.fuel
;memcopy(ship.cargohold, &savedata.cargo0, len(ship.cargohold)) ; TODO fix compiler error about pointer
txt.print("\nSaving universe...") txt.print("\nSaving universe...")
diskio.delete(8, Savegame) diskio.delete(8, Savegame)
@ -103,8 +131,6 @@ trader {
diskio.status(8) diskio.status(8)
txt.chrout('\n') txt.chrout('\n')
} }
; TODO ACTUALLY SAVE SOMETHING RELEVANT
} }
sub do_jump() { sub do_jump() {
@ -138,7 +164,7 @@ trader {
} else { } else {
txt.print(" Not found!\n") txt.print(" Not found!\n")
} }
galaxy.travel_to(current_planet) galaxy.travel_to(galaxy.number, current_planet)
} }
sub do_buy() { sub do_buy() {
@ -222,8 +248,7 @@ trader {
} }
sub do_next_galaxy() { sub do_next_galaxy() {
galaxy.nextgalaxy() galaxy.travel_to(galaxy.number+1, planet.number)
galaxy.travel_to(planet.number)
planet.display(false) planet.display(false)
} }
@ -237,7 +262,7 @@ trader {
} else { } else {
txt.print(" Not found!") txt.print(" Not found!")
} }
galaxy.travel_to(current_planet) galaxy.travel_to(galaxy.number, current_planet)
} else { } else {
planet.display(false) planet.display(false)
} }
@ -380,8 +405,8 @@ galaxy {
number = 1 number = 1
} }
sub travel_to(ubyte system) { sub travel_to(ubyte galaxynum, ubyte system) {
init(number) init(galaxynum) ; TODO fix scoping error when using 'galaxy' as name
generate_next_planet() ; always at least planet 0 (separate to avoid repeat ubyte overflow) generate_next_planet() ; always at least planet 0 (separate to avoid repeat ubyte overflow)
repeat system { repeat system {
generate_next_planet() generate_next_planet()
@ -418,9 +443,9 @@ galaxy {
} }
if found if found
travel_to(current_closest_pi) travel_to(number, current_closest_pi)
else else
travel_to(current_planet_num) travel_to(number, current_planet_num)
return found return found
} }
@ -453,7 +478,7 @@ galaxy {
pn++ pn++
} until pn==0 } until pn==0
travel_to(current_planet) travel_to(number, current_planet)
} }
ubyte pn_pair1 ubyte pn_pair1
@ -923,13 +948,13 @@ util {
asmsub print_10s(uword value @AY) clobbers(A, X, Y) { asmsub print_10s(uword value @AY) clobbers(A, X, Y) {
%asm {{ %asm {{
jsr conv.uword2decimal jsr conv.uword2decimal
lda conv.uword2decimal.decTenThousands lda conv.uword2decimal.decTenThousands
ldy #0 ; have we started printing? ldy #0 ; have we started printing?
cmp #'0' cmp #'0'
beq + beq +
jsr c64.CHROUT jsr c64.CHROUT
iny iny
+ lda conv.uword2decimal.decThousands + lda conv.uword2decimal.decThousands
cmp #'0' cmp #'0'
bne + bne +