implemented missing swap() operations

This commit is contained in:
Irmen de Jong 2020-10-19 21:26:11 +02:00
parent 4dee8b6048
commit 702cf304d0
2 changed files with 134 additions and 55 deletions

View File

@ -494,9 +494,11 @@ internal class BuiltinFunctionsAsmGen(private val program: Program, private val
swapArrayValues(elementDt, arrayVarName1, firstVar, arrayVarName2, secondVar) swapArrayValues(elementDt, arrayVarName1, firstVar, arrayVarName2, secondVar)
return return
} else if(firstNum!=null && secondVar!=null) { } else if(firstNum!=null && secondVar!=null) {
TODO("swap array num/var") // TODO ***************************** swapArrayValues(elementDt, arrayVarName1, firstNum, arrayVarName2, secondVar)
return
} else if(firstVar!=null && secondNum!=null) { } else if(firstVar!=null && secondNum!=null) {
TODO("swap array var/num") // TODO ***************************** swapArrayValues(elementDt, arrayVarName1, firstVar, arrayVarName2, secondNum)
return
} }
} }
@ -606,7 +608,7 @@ internal class BuiltinFunctionsAsmGen(private val program: Program, private val
lda $arrayVarName2+1,y lda $arrayVarName2+1,y
sta $arrayVarName1+1,x sta $arrayVarName1+1,x
pla pla
sta $arrayVarName2+1,y sta $arrayVarName2+1,y
ldx P8ZP_SCRATCH_REG ldx P8ZP_SCRATCH_REG
""") """)
} }
@ -641,6 +643,122 @@ internal class BuiltinFunctionsAsmGen(private val program: Program, private val
} }
} }
private fun swapArrayValues(elementDt: DataType, arrayVarName1: String, indexValue1: NumericLiteralValue, arrayVarName2: String, indexName2: IdentifierReference) {
val index1 = indexValue1.number.toInt() * elementDt.memorySize()
val idxAsmName2 = asmgen.asmVariableName(indexName2)
when(elementDt) {
DataType.UBYTE, DataType.BYTE -> {
asmgen.out("""
lda $arrayVarName1 + $index1
pha
ldy $idxAsmName2
lda $arrayVarName2,y
sta $arrayVarName1 + $index1
pla
sta $arrayVarName2,y
""")
}
DataType.UWORD, DataType.WORD -> {
asmgen.out("""
lda $arrayVarName1 + $index1
pha
lda $idxAsmName2
asl a
tay
lda $arrayVarName2,y
sta $arrayVarName1 + $index1
pla
sta $arrayVarName2,y
lda $arrayVarName1 + $index1+1
pha
lda $arrayVarName2+1,y
sta $arrayVarName1 + $index1+1
pla
sta $arrayVarName2+1,y
""")
}
DataType.FLOAT -> {
asmgen.out("""
lda #<(${arrayVarName1}+$index1)
sta P8ZP_SCRATCH_W1
lda #>(${arrayVarName1}+$index1)
sta P8ZP_SCRATCH_W1+1
lda #>$arrayVarName1
sta P8ZP_SCRATCH_W1+1
lda $idxAsmName2
asl a
asl a
clc
adc $idxAsmName2
adc #<$arrayVarName1
sta P8ZP_SCRATCH_W1
bcc +
inc P8ZP_SCRATCH_W1+1
+ jsr floats.swap_floats
""")
}
else -> throw AssemblyError("invalid aray elt type")
}
}
private fun swapArrayValues(elementDt: DataType, arrayVarName1: String, indexName1: IdentifierReference, arrayVarName2: String, indexValue2: NumericLiteralValue) {
val idxAsmName1 = asmgen.asmVariableName(indexName1)
val index2 = indexValue2.number.toInt() * elementDt.memorySize()
when(elementDt) {
DataType.UBYTE, DataType.BYTE -> {
asmgen.out("""
lda $arrayVarName2 + $index2
pha
ldy $idxAsmName1
lda $arrayVarName1,y
sta $arrayVarName2 + $index2
pla
sta $arrayVarName1,y
""")
}
DataType.UWORD, DataType.WORD -> {
asmgen.out("""
lda $arrayVarName2 + $index2
pha
lda $idxAsmName1
asl a
tay
lda $arrayVarName1,y
sta $arrayVarName2 + $index2
pla
sta $arrayVarName1,y
lda $arrayVarName2 + $index2+1
pha
lda $arrayVarName1+1,y
sta $arrayVarName2 + $index2+1
pla
sta $arrayVarName1+1,y
""")
}
DataType.FLOAT -> {
asmgen.out("""
lda #>$arrayVarName1
sta P8ZP_SCRATCH_W1+1
lda $idxAsmName1
asl a
asl a
clc
adc $idxAsmName1
adc #<$arrayVarName1
sta P8ZP_SCRATCH_W1
bcc +
inc P8ZP_SCRATCH_W1+1
+ lda #<(${arrayVarName2}+$index2)
sta P8ZP_SCRATCH_W2
lda #>(${arrayVarName2}+$index2)
sta P8ZP_SCRATCH_W2+1
jsr floats.swap_floats
""")
}
else -> throw AssemblyError("invalid aray elt type")
}
}
private fun funcAbs(fcall: IFunctionCall, func: FSignature) { private fun funcAbs(fcall: IFunctionCall, func: FSignature) {
translateFunctionArguments(fcall.args, func) translateFunctionArguments(fcall.args, func)
val dt = fcall.args.single().inferType(program) val dt = fcall.args.single().inferType(program)

View File

@ -7,59 +7,20 @@ main {
sub start() { sub start() {
word ww float[] array = [1111.1,2222.2,3333.3,4444.4,5555.5]
uword uw
ubyte ub
byte bb
ub = 5
uw = 21111 float fw
uw <<= ub+1 ubyte i1 = 1
txt.print_uwbin(uw as uword, true) ubyte i2 = 3
txt.chrout('\n') ubyte zero = 0
uw = 21111 ubyte four = 4
uw <<= ub+2 swap(array[i1], array[0])
txt.print_uwbin(uw as uword, true) swap(array[4], array[i2])
txt.chrout('\n')
uw = 21111 for i1 in 0 to len(array)-1 {
uw <<= ub+3 floats.print_f(array[i1])
txt.print_uwbin(uw as uword, true) txt.chrout(',')
txt.chrout('\n') }
uw = 21111
uw <<= ub+4
txt.print_uwbin(uw as uword, true)
txt.chrout('\n')
uw = 21111
uw <<= ub+5
txt.print_uwbin(uw as uword, true)
txt.chrout('\n')
uw = 21111
uw <<= ub+6
txt.print_uwbin(uw as uword, true)
txt.chrout('\n')
uw = 21111
uw <<= ub+7
txt.print_uwbin(uw as uword, true)
txt.chrout('\n')
uw = 21111
uw <<= ub+8
txt.print_uwbin(uw as uword, true)
txt.chrout('\n')
uw = 21111
uw <<= ub+9
txt.print_uwbin(uw as uword, true)
txt.chrout('\n')
uw = 21111
uw <<= ub+10
txt.print_uwbin(uw as uword, true)
txt.chrout('\n')
uw = 21111
uw <<= ub+11
txt.print_uwbin(uw as uword, true)
txt.chrout('\n')
uw = 21111
uw <<= ub+12
txt.print_uwbin(uw as uword, true)
txt.chrout('\n') txt.chrout('\n')
testX() testX()