implemented cc for integer sin and cos variants

This commit is contained in:
Irmen de Jong 2020-11-03 22:42:59 +01:00
parent 526e4b8bdc
commit 288d4f08b3
3 changed files with 127 additions and 90 deletions

View File

@ -747,147 +747,142 @@ func_sqrt16 .proc
func_sin8_into_A .proc func_sin8_into_A .proc
inx tay
ldy P8ESTACK_LO,x lda _sinecos8,y
lda func_sin8._sinecos8,y
rts rts
_sinecos8 .char trunc(127.0 * sin(range(256+64) * rad(360.0/256.0)))
.pend .pend
func_sin8u_into_A .proc func_sin8u_into_A .proc
inx tay
ldy P8ESTACK_LO,x lda _sinecos8u,y
lda func_sin8u._sinecos8u,y
rts rts
_sinecos8u .byte trunc(128.0 + 127.5 * sin(range(256+64) * rad(360.0/256.0)))
.pend .pend
func_sin16_into_AY .proc func_sin16_into_AY .proc
inx tay
ldy P8ESTACK_LO,x lda _sinecos8lo,y
lda func_sin16._sinecos8lo,y
pha pha
lda func_sin16._sinecos8hi,y lda _sinecos8hi,y
tay tay
pla pla
rts rts
_ := trunc(32767.0 * sin(range(256+64) * rad(360.0/256.0)))
_sinecos8lo .byte <_
_sinecos8hi .byte >_
.pend .pend
func_sin16u_into_AY .proc func_sin16u_into_AY .proc
inx tay
ldy P8ESTACK_LO,x lda _sinecos8ulo,y
lda func_sin16u._sinecos8ulo,y
pha pha
lda func_sin16u._sinecos8uhi,y lda _sinecos8uhi,y
tay tay
pla pla
rts rts
_ := trunc(32768.0 + 32767.5 * sin(range(256+64) * rad(360.0/256.0)))
_sinecos8ulo .byte <_
_sinecos8uhi .byte >_
.pend .pend
func_cos8_into_A .proc func_cos8_into_A .proc
inx tay
ldy P8ESTACK_LO,x lda func_sin8_into_A._sinecos8+64,y
lda func_sin8._sinecos8+64,y
rts rts
.pend .pend
func_cos8u_into_A .proc func_cos8u_into_A .proc
inx tay
ldy P8ESTACK_LO,x lda func_sin8u_into_A._sinecos8u+64,y
lda func_sin8u._sinecos8u+64,y
rts rts
.pend .pend
func_cos16_into_AY .proc func_cos16_into_AY .proc
inx tay
ldy P8ESTACK_LO,x lda func_sin16_into_AY._sinecos8lo+64,y
lda func_sin16._sinecos8lo+64,y
pha pha
lda func_sin16._sinecos8hi+64,y lda func_sin16_into_AY._sinecos8hi+64,y
tay tay
pla pla
rts rts
.pend .pend
func_cos16u_into_AY .proc func_cos16u_into_AY .proc
inx tay
ldy P8ESTACK_LO,x lda func_sin16u_into_AY._sinecos8ulo+64,y
lda func_sin16u._sinecos8ulo+64,y
pha pha
lda func_sin16u._sinecos8uhi+64,y lda func_sin16u_into_AY._sinecos8uhi+64,y
tay tay
pla pla
rts rts
.pend .pend
func_sin8 .proc func_sin8_cc .proc
ldy P8ESTACK_LO+1,x tay
lda _sinecos8,y lda func_sin8_into_A._sinecos8,y
sta P8ESTACK_LO+1,x sta P8ESTACK_LO,x
dex
rts rts
_sinecos8 .char trunc(127.0 * sin(range(256+64) * rad(360.0/256.0)))
.pend .pend
func_sin8u .proc func_sin8u_cc .proc
ldy P8ESTACK_LO+1,x tay
lda _sinecos8u,y lda _sinecos8u,y
sta P8ESTACK_LO+1,x sta P8ESTACK_LO,x
dex
rts rts
_sinecos8u .byte trunc(128.0 + 127.5 * sin(range(256+64) * rad(360.0/256.0)))
.pend .pend
func_sin16 .proc func_sin16_cc .proc
ldy P8ESTACK_LO+1,x tay
lda _sinecos8lo,y lda func_sin16_into_AY._sinecos8lo,y
sta P8ESTACK_LO+1,x sta P8ESTACK_LO+1,x
lda _sinecos8hi,y lda func_sin16_into_AY._sinecos8hi,y
sta P8ESTACK_HI+1,x sta P8ESTACK_HI+1,x
rts rts
_ := trunc(32767.0 * sin(range(256+64) * rad(360.0/256.0)))
_sinecos8lo .byte <_
_sinecos8hi .byte >_
.pend .pend
func_sin16u .proc func_sin16u_cc .proc
ldy P8ESTACK_LO+1,x tay
lda _sinecos8ulo,y lda func_sin16u_into_AY._sinecos8ulo,y
sta P8ESTACK_LO+1,x sta P8ESTACK_LO+1,x
lda _sinecos8uhi,y lda func_sin16u_into_AY._sinecos8uhi,y
sta P8ESTACK_HI+1,x
rts
_ := trunc(32768.0 + 32767.5 * sin(range(256+64) * rad(360.0/256.0)))
_sinecos8ulo .byte <_
_sinecos8uhi .byte >_
.pend
func_cos8 .proc
ldy P8ESTACK_LO+1,x
lda func_sin8._sinecos8+64,y
sta P8ESTACK_LO+1,x
rts
.pend
func_cos8u .proc
ldy P8ESTACK_LO+1,x
lda func_sin8u._sinecos8u+64,y
sta P8ESTACK_LO+1,x
rts
.pend
func_cos16 .proc
ldy P8ESTACK_LO+1,x
lda func_sin16._sinecos8lo+64,y
sta P8ESTACK_LO+1,x
lda func_sin16._sinecos8hi+64,y
sta P8ESTACK_HI+1,x sta P8ESTACK_HI+1,x
rts rts
.pend .pend
func_cos16u .proc func_cos8_cc .proc
ldy P8ESTACK_LO+1,x tay
lda func_sin16u._sinecos8ulo+64,y lda func_sin8_into_A._sinecos8+64,y
sta P8ESTACK_LO,x
dex
rts
.pend
func_cos8u_cc .proc
tay
lda func_sin8u_into_A._sinecos8u+64,y
sta P8ESTACK_LO,x
dex
rts
.pend
func_cos16_cc .proc
tay
lda func_sin16_into_AY._sinecos8lo+64,y
sta P8ESTACK_LO+1,x sta P8ESTACK_LO+1,x
lda func_sin16u._sinecos8uhi+64,y lda func_sin16_into_AY._sinecos8hi+64,y
sta P8ESTACK_HI+1,x
rts
.pend
func_cos16u_cc .proc
tay
lda func_sin16u_into_AY._sinecos8ulo+64,y
sta P8ESTACK_LO+1,x
lda func_sin16u_into_AY._sinecos8uhi+64,y
sta P8ESTACK_HI+1,x sta P8ESTACK_HI+1,x
rts rts
.pend .pend

View File

@ -82,7 +82,7 @@ internal class BuiltinFunctionsAsmGen(private val program: Program, private val
"memcopy", "memset", "memsetw" -> funcMemSetCopy(fcall, func) "memcopy", "memset", "memsetw" -> funcMemSetCopy(fcall, func)
"substr", "leftstr", "rightstr" -> { "substr", "leftstr", "rightstr" -> {
translateArguments(fcall.args, func) translateArguments(fcall.args, func)
asmgen.out(" jsr prog8_lib.func_${func.name}") asmgen.out(" jsr prog8_lib.func_${func.name}_cc") // TODO
} }
"exit" -> asmgen.out(" jmp prog8_lib.func_exit") "exit" -> asmgen.out(" jmp prog8_lib.func_exit")
else -> TODO("missing asmgen for builtin func ${func.name}") else -> TODO("missing asmgen for builtin func ${func.name}")
@ -162,9 +162,9 @@ internal class BuiltinFunctionsAsmGen(private val program: Program, private val
private fun funcStrcmp(fcall: IFunctionCall, func: FSignature, resultToStack: Boolean) { private fun funcStrcmp(fcall: IFunctionCall, func: FSignature, resultToStack: Boolean) {
translateArguments(fcall.args, func) translateArguments(fcall.args, func)
if(resultToStack) if(resultToStack)
asmgen.out(" jsr prog8_lib.func_strcmp") asmgen.out(" jsr prog8_lib.func_strcmp_cc") // TODO
else else
asmgen.out(" jsr prog8_lib.func_strcmp | inx") // result is also in register A asmgen.out(" jsr prog8_lib.func_strcmp_into_A") // TODO
} }
private fun funcSqrt16(fcall: IFunctionCall, func: FSignature, resultToStack: Boolean) { private fun funcSqrt16(fcall: IFunctionCall, func: FSignature, resultToStack: Boolean) {
@ -178,7 +178,7 @@ internal class BuiltinFunctionsAsmGen(private val program: Program, private val
private fun funcSinCosInt(fcall: IFunctionCall, func: FSignature, resultToStack: Boolean) { private fun funcSinCosInt(fcall: IFunctionCall, func: FSignature, resultToStack: Boolean) {
translateArguments(fcall.args, func) translateArguments(fcall.args, func)
if(resultToStack) if(resultToStack)
asmgen.out(" jsr prog8_lib.func_${func.name}") asmgen.out(" jsr prog8_lib.func_${func.name}_cc") // TODO
else else
when(func.name) { when(func.name) {
"sin8", "sin8u", "cos8", "cos8u" -> asmgen.out(" jsr prog8_lib.func_${func.name}_into_A") "sin8", "sin8u", "cos8", "cos8u" -> asmgen.out(" jsr prog8_lib.func_${func.name}_into_A")
@ -194,33 +194,36 @@ internal class BuiltinFunctionsAsmGen(private val program: Program, private val
val numElements = decl.arraysize!!.constIndex() val numElements = decl.arraysize!!.constIndex()
when (decl.datatype) { when (decl.datatype) {
DataType.ARRAY_UB, DataType.ARRAY_B -> { DataType.ARRAY_UB, DataType.ARRAY_B -> {
// TODO cc
asmgen.out(""" asmgen.out("""
lda #<$varName lda #<$varName
ldy #>$varName ldy #>$varName
sta P8ZP_SCRATCH_W1 sta P8ZP_SCRATCH_W1
sty P8ZP_SCRATCH_W1+1 sty P8ZP_SCRATCH_W1+1
lda #$numElements lda #$numElements
jsr prog8_lib.reverse_b jsr prog8_lib.reverse_b_cc
""") """)
} }
DataType.ARRAY_UW, DataType.ARRAY_W -> { DataType.ARRAY_UW, DataType.ARRAY_W -> {
// TODO cc
asmgen.out(""" asmgen.out("""
lda #<$varName lda #<$varName
ldy #>$varName ldy #>$varName
sta P8ZP_SCRATCH_W1 sta P8ZP_SCRATCH_W1
sty P8ZP_SCRATCH_W1+1 sty P8ZP_SCRATCH_W1+1
lda #$numElements lda #$numElements
jsr prog8_lib.reverse_w jsr prog8_lib.reverse_w_cc
""") """)
} }
DataType.ARRAY_F -> { DataType.ARRAY_F -> {
// TODO cc
asmgen.out(""" asmgen.out("""
lda #<$varName lda #<$varName
ldy #>$varName ldy #>$varName
sta P8ZP_SCRATCH_W1 sta P8ZP_SCRATCH_W1
sty P8ZP_SCRATCH_W1+1 sty P8ZP_SCRATCH_W1+1
lda #$numElements lda #$numElements
jsr prog8_lib.reverse_f jsr prog8_lib.reverse_f_cc
""") """)
} }
else -> throw AssemblyError("weird type") else -> throw AssemblyError("weird type")
@ -236,6 +239,7 @@ internal class BuiltinFunctionsAsmGen(private val program: Program, private val
val numElements = decl.arraysize!!.constIndex() val numElements = decl.arraysize!!.constIndex()
when (decl.datatype) { when (decl.datatype) {
DataType.ARRAY_UB, DataType.ARRAY_B -> { DataType.ARRAY_UB, DataType.ARRAY_B -> {
// TODO cc
asmgen.out(""" asmgen.out("""
lda #<$varName lda #<$varName
ldy #>$varName ldy #>$varName
@ -244,9 +248,10 @@ internal class BuiltinFunctionsAsmGen(private val program: Program, private val
lda #$numElements lda #$numElements
sta P8ZP_SCRATCH_B1 sta P8ZP_SCRATCH_B1
""") """)
asmgen.out(if (decl.datatype == DataType.ARRAY_UB) " jsr prog8_lib.sort_ub" else " jsr prog8_lib.sort_b") asmgen.out(if (decl.datatype == DataType.ARRAY_UB) " jsr prog8_lib.sort_ub_cc" else " jsr prog8_lib.sort_b_cc")
} }
DataType.ARRAY_UW, DataType.ARRAY_W -> { DataType.ARRAY_UW, DataType.ARRAY_W -> {
// TODO cc
asmgen.out(""" asmgen.out("""
lda #<$varName lda #<$varName
ldy #>$varName ldy #>$varName
@ -255,7 +260,7 @@ internal class BuiltinFunctionsAsmGen(private val program: Program, private val
lda #$numElements lda #$numElements
sta P8ZP_SCRATCH_B1 sta P8ZP_SCRATCH_B1
""") """)
asmgen.out(if (decl.datatype == DataType.ARRAY_UW) " jsr prog8_lib.sort_uw" else " jsr prog8_lib.sort_w") asmgen.out(if (decl.datatype == DataType.ARRAY_UW) " jsr prog8_lib.sort_uw_cc" else " jsr prog8_lib.sort_w_cc")
} }
DataType.ARRAY_F -> throw AssemblyError("sorting of floating point array is not supported") DataType.ARRAY_F -> throw AssemblyError("sorting of floating point array is not supported")
else -> throw AssemblyError("weird type") else -> throw AssemblyError("weird type")
@ -273,7 +278,7 @@ internal class BuiltinFunctionsAsmGen(private val program: Program, private val
is ArrayIndexedExpression -> { is ArrayIndexedExpression -> {
asmgen.translateExpression(what.arrayvar) asmgen.translateExpression(what.arrayvar)
asmgen.translateExpression(what.indexer) asmgen.translateExpression(what.indexer)
asmgen.out(" jsr prog8_lib.ror2_array_ub") asmgen.out(" jsr prog8_lib.ror2_array_ub_cc") // TODO cc
} }
is DirectMemoryRead -> { is DirectMemoryRead -> {
if (what.addressExpression is NumericLiteralValue) { if (what.addressExpression is NumericLiteralValue) {
@ -281,7 +286,7 @@ internal class BuiltinFunctionsAsmGen(private val program: Program, private val
asmgen.out(" lda ${number.toHex()} | lsr a | bcc + | ora #\$80 |+ | sta ${number.toHex()}") asmgen.out(" lda ${number.toHex()} | lsr a | bcc + | ora #\$80 |+ | sta ${number.toHex()}")
} else { } else {
asmgen.translateExpression(what.addressExpression) asmgen.translateExpression(what.addressExpression)
asmgen.out(" jsr prog8_lib.ror2_mem_ub") asmgen.out(" jsr prog8_lib.ror2_mem_ub_cc") // TODO cc
} }
} }
is IdentifierReference -> { is IdentifierReference -> {
@ -971,6 +976,7 @@ internal class BuiltinFunctionsAsmGen(private val program: Program, private val
} }
private fun funcMkword(fcall: IFunctionCall, resultToStack: Boolean) { private fun funcMkword(fcall: IFunctionCall, resultToStack: Boolean) {
// TODO cc
if(resultToStack) { if(resultToStack) {
// trick: push the args in reverse order (lsb first, msb second) this saves some instructions // trick: push the args in reverse order (lsb first, msb second) this saves some instructions
asmgen.translateExpression(fcall.args[1]) asmgen.translateExpression(fcall.args[1])
@ -986,6 +992,7 @@ internal class BuiltinFunctionsAsmGen(private val program: Program, private val
} }
private fun funcMsb(fcall: IFunctionCall, resultToStack: Boolean) { private fun funcMsb(fcall: IFunctionCall, resultToStack: Boolean) {
// TODO cc
val arg = fcall.args.single() val arg = fcall.args.single()
if (arg.inferType(program).typeOrElse(DataType.STRUCT) !in WordDatatypes) if (arg.inferType(program).typeOrElse(DataType.STRUCT) !in WordDatatypes)
throw AssemblyError("msb required word argument") throw AssemblyError("msb required word argument")
@ -1006,6 +1013,7 @@ internal class BuiltinFunctionsAsmGen(private val program: Program, private val
} }
private fun funcLsb(fcall: IFunctionCall, resultToStack: Boolean) { private fun funcLsb(fcall: IFunctionCall, resultToStack: Boolean) {
// TODO cc
val arg = fcall.args.single() val arg = fcall.args.single()
if (arg.inferType(program).typeOrElse(DataType.STRUCT) !in WordDatatypes) if (arg.inferType(program).typeOrElse(DataType.STRUCT) !in WordDatatypes)
throw AssemblyError("lsb required word argument") throw AssemblyError("lsb required word argument")

View File

@ -11,6 +11,40 @@ main {
sub start() { sub start() {
const uword ADDR = $0400 const uword ADDR = $0400
ubyte ubb
ubyte zerobb
uword zeroww
for ubb in 0 to 255 {
txt.print_uw(sin16u(ubb)+zerobb)
txt.chrout(' ')
}
txt.chrout('\n')
txt.chrout('\n')
for ubb in 0 to 255 {
txt.print_uw(cos16u(ubb)+zerobb)
txt.chrout(' ')
}
txt.chrout('\n')
txt.chrout('\n')
for ubb in 0 to 255 {
txt.print_w(sin16(ubb)+zerobb)
txt.chrout(' ')
}
txt.chrout('\n')
txt.chrout('\n')
for ubb in 0 to 255 {
txt.print_w(cos16(ubb)+zerobb)
txt.chrout(' ')
}
txt.chrout('\n')
txt.chrout('\n')
testX()
return
byte zerob=0 byte zerob=0
; word zerow=0 ; word zerow=0
; float zerof=0 ; float zerof=0