mirror of
https://github.com/irmen/prog8.git
synced 2024-09-10 09:54:32 +00:00
implemented missing swap() operations
This commit is contained in:
parent
4dee8b6048
commit
702cf304d0
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -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)
|
||||||
|
@ -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()
|
||||||
|
Loading…
Reference in New Issue
Block a user