This commit is contained in:
Irmen de Jong 2020-08-24 00:26:26 +02:00
parent 6cd42ddafe
commit 2640015fb1
4 changed files with 60 additions and 45 deletions

View File

@ -15,6 +15,7 @@ import prog8.compiler.target.c64.C64MachineDefinition
import prog8.compiler.target.c64.C64MachineDefinition.ESTACK_HI_HEX
import prog8.compiler.target.c64.C64MachineDefinition.ESTACK_LO_HEX
import prog8.compiler.target.c64.Petscii
import prog8.compiler.target.c64.codegen.assignment.AsmAssignment
import prog8.compiler.target.c64.codegen.assignment.AssignmentAsmGen
import prog8.compiler.target.generatedLabelPrefix
import prog8.functions.BuiltinFunctions
@ -695,6 +696,9 @@ internal class AsmGen(private val program: Program,
internal fun translateFunctionCall(functionCall: FunctionCall) =
functioncallAsmGen.translateFunctionCall(functionCall)
internal fun translateNormalAssignment(assign: AsmAssignment) =
assignmentAsmGen.translateNormalAssignment(assign)
private fun translateSubroutine(sub: Subroutine) {
out("")
outputSourceLine(sub)

View File

@ -128,6 +128,18 @@ internal class AsmAssignSource(val kind: SourceStorageKind,
fun withAdjustedDt(newType: DataType) =
AsmAssignSource(kind, program, newType, variable, array, memory, register, number, expression)
fun adjustDataTypeToTarget(target: AsmAssignTarget): AsmAssignSource {
// allow some signed/unsigned relaxations
if(target.datatype!=datatype) {
if(target.datatype in ByteDatatypes && datatype in ByteDatatypes) {
return withAdjustedDt(target.datatype)
} else if(target.datatype in WordDatatypes && datatype in WordDatatypes) {
return withAdjustedDt(target.datatype)
}
}
return this
}
}

View File

@ -17,17 +17,8 @@ internal class AssignmentAsmGen(private val program: Program, private val asmgen
private val augmentableAsmGen = AugmentableAssignmentAsmGen(program, this, asmgen)
fun translate(assignment: Assignment) {
var source = AsmAssignSource.fromAstSource(assignment.value, program)
val target = AsmAssignTarget.fromAstAssignment(assignment, program, asmgen)
// allow some signed/unsigned relaxations
if(target.datatype!=source.datatype) {
if(target.datatype in ByteDatatypes && source.datatype in ByteDatatypes) {
source = source.withAdjustedDt(target.datatype)
} else if(target.datatype in WordDatatypes && source.datatype in WordDatatypes) {
source = source.withAdjustedDt(target.datatype)
}
}
val source = AsmAssignSource.fromAstSource(assignment.value, program).adjustDataTypeToTarget(target)
val assign = AsmAssignment(source, target, assignment.isAugmentable, assignment.position)
target.origAssign = assign
@ -127,6 +118,7 @@ internal class AssignmentAsmGen(private val program: Program, private val asmgen
if (value is AddressOf) {
assignAddressOf(assign.target, value.identifier)
}
// TODO more special cases to avoid stack eval?
else {
asmgen.translateExpression(value)
assignStackValue(assign.target)

View File

@ -1,46 +1,53 @@
%import c64lib
%import c64utils
%import c64flt
%zeropage basicsafe
main {
ubyte[256] sieve
ubyte candidate_prime = 2 ; is increased in the loop
sub start() {
ubyte x
for x in 0 to 255 {
sieve[x] = 0
}
; memset(sieve, 256, false) ; clear the sieve, to reset starting situation on subsequent runs
ubyte[] arr1=[11,22,33]
uword[] array=[1111 ,2222,3333]
float[] farr = [1.111, 2.222, 3.333]
ubyte ub
uword uw
float ff
ubyte i = 1
arr1[i] = ub
array[i] = uw
farr[2] = 3.15
farr[2] = ff
farr[i] = ff
c64flt.print_f(farr[1])
; calculate primes
c64scr.print("prime numbers up to 255:\n\n")
ubyte amount=0
repeat {
ubyte prime = find_next_prime()
if prime==0
break
c64scr.print_ub(prime)
c64scr.print(", ")
amount++
}
c64.CHROUT('\n')
c64scr.print("number of primes (expected 54): ")
c64scr.print_ub(amount)
c64.CHROUT('\n')
}
; c64scr.print_ub(arr1[1])
; c64.CHROUT('\n')
; arr1 [i] ++
; c64scr.print_ub(arr1[1])
; c64.CHROUT('\n')
;
; c64scr.print_uw(array[1])
; c64.CHROUT('\n')
; array[i] ++
; c64scr.print_uw(array[1])
; c64.CHROUT('\n')
;
; c64flt.print_f(farr[1])
; c64.CHROUT('\n')
; farr[i] ++
; c64flt.print_f(farr[1])
; c64.CHROUT('\n')
sub find_next_prime() -> ubyte {
while sieve[candidate_prime] {
candidate_prime++
if candidate_prime==0
return 0 ; we wrapped; no more primes available in the sieve
}
; found next one, mark the multiples and return it.
sieve[candidate_prime] = true
uword multiple = candidate_prime
while multiple < len(sieve) {
sieve[lsb(multiple)] = true
multiple += candidate_prime
}
return candidate_prime
}
}