mirror of
https://github.com/irmen/prog8.git
synced 2025-02-16 22:30:46 +00:00
move
This commit is contained in:
parent
6cd42ddafe
commit
2640015fb1
@ -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)
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user