mirror of
https://github.com/irmen/prog8.git
synced 2024-11-25 19:31:36 +00:00
api change: rename builtin func sqrt16 to sqrtw
This commit is contained in:
parent
24f37e2062
commit
76a203d4df
@ -85,7 +85,7 @@ val BuiltinFunctions: Map<String, FSignature> = mapOf(
|
|||||||
// normal functions follow:
|
// normal functions follow:
|
||||||
"sizeof" to FSignature(true, listOf(FParam("object", DataType.values())), DataType.UBYTE),
|
"sizeof" to FSignature(true, listOf(FParam("object", DataType.values())), DataType.UBYTE),
|
||||||
"sgn" to FSignature(true, listOf(FParam("value", NumericDatatypesNoBool)), DataType.BYTE),
|
"sgn" to FSignature(true, listOf(FParam("value", NumericDatatypesNoBool)), DataType.BYTE),
|
||||||
"sqrt16" to FSignature(true, listOf(FParam("value", arrayOf(DataType.UWORD))), DataType.UBYTE),
|
"sqrtw" to FSignature(true, listOf(FParam("value", arrayOf(DataType.UWORD))), DataType.UBYTE),
|
||||||
"divmod" to FSignature(false, listOf(FParam("number", arrayOf(DataType.UBYTE)), FParam("divident", arrayOf(DataType.UBYTE)), FParam("division", arrayOf(DataType.UBYTE)), FParam("remainder", arrayOf(DataType.UBYTE))), null),
|
"divmod" to FSignature(false, listOf(FParam("number", arrayOf(DataType.UBYTE)), FParam("divident", arrayOf(DataType.UBYTE)), FParam("division", arrayOf(DataType.UBYTE)), FParam("remainder", arrayOf(DataType.UBYTE))), null),
|
||||||
"divmodw" to FSignature(false, listOf(FParam("number", arrayOf(DataType.UWORD)), FParam("divident", arrayOf(DataType.UWORD)), FParam("division", arrayOf(DataType.UWORD)), FParam("remainder", arrayOf(DataType.UWORD))), null),
|
"divmodw" to FSignature(false, listOf(FParam("number", arrayOf(DataType.UWORD)), FParam("divident", arrayOf(DataType.UWORD)), FParam("division", arrayOf(DataType.UWORD)), FParam("remainder", arrayOf(DataType.UWORD))), null),
|
||||||
"any" to FSignature(true, listOf(FParam("values", ArrayDatatypes)), DataType.UBYTE),
|
"any" to FSignature(true, listOf(FParam("values", ArrayDatatypes)), DataType.UBYTE),
|
||||||
|
@ -34,7 +34,7 @@ internal class BuiltinFunctionsAsmGen(private val program: PtProgram,
|
|||||||
"abs" -> funcAbs(fcall, resultToStack, resultRegister, sscope)
|
"abs" -> funcAbs(fcall, resultToStack, resultRegister, sscope)
|
||||||
"any", "all" -> funcAnyAll(fcall, resultToStack, resultRegister, sscope)
|
"any", "all" -> funcAnyAll(fcall, resultToStack, resultRegister, sscope)
|
||||||
"sgn" -> funcSgn(fcall, resultToStack, resultRegister, sscope)
|
"sgn" -> funcSgn(fcall, resultToStack, resultRegister, sscope)
|
||||||
"sqrt16" -> funcSqrt16(fcall, resultToStack, resultRegister, sscope)
|
"sqrtw" -> funcSqrtw(fcall, resultToStack, resultRegister, sscope)
|
||||||
"divmod" -> funcDivmod(fcall)
|
"divmod" -> funcDivmod(fcall)
|
||||||
"divmodw" -> funcDivmodW(fcall)
|
"divmodw" -> funcDivmodW(fcall)
|
||||||
"rol" -> funcRol(fcall)
|
"rol" -> funcRol(fcall)
|
||||||
@ -298,13 +298,13 @@ internal class BuiltinFunctionsAsmGen(private val program: PtProgram,
|
|||||||
asmgen.translateNormalAssignment(assign, fcall.definingISub())
|
asmgen.translateNormalAssignment(assign, fcall.definingISub())
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun funcSqrt16(fcall: PtBuiltinFunctionCall, resultToStack: Boolean, resultRegister: RegisterOrPair?, scope: IPtSubroutine?) {
|
private fun funcSqrtw(fcall: PtBuiltinFunctionCall, resultToStack: Boolean, resultRegister: RegisterOrPair?, scope: IPtSubroutine?) {
|
||||||
translateArguments(fcall, scope)
|
translateArguments(fcall, scope)
|
||||||
if(resultToStack)
|
if(resultToStack)
|
||||||
asmgen.out(" jsr prog8_lib.func_sqrt16_stack")
|
asmgen.out(" jsr prog8_lib.func_sqrtw_stack")
|
||||||
else {
|
else {
|
||||||
asmgen.out(" jsr prog8_lib.func_sqrt16_into_A")
|
asmgen.out(" jsr prog8_lib.func_sqrtw_into_A")
|
||||||
assignAsmGen.assignRegisterByte(AsmAssignTarget.fromRegisters(resultRegister ?: RegisterOrPair.A, false, fcall.position, scope, asmgen), CpuRegister.A, false)
|
assignAsmGen.assignRegisterByte(AsmAssignTarget.fromRegisters(resultRegister ?: RegisterOrPair.A, false, fcall.position, scope, asmgen), CpuRegister.A)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ internal class BuiltinFuncGen(private val codeGen: IRCodeGen, private val exprGe
|
|||||||
"abs" -> funcAbs(call)
|
"abs" -> funcAbs(call)
|
||||||
"cmp" -> funcCmp(call)
|
"cmp" -> funcCmp(call)
|
||||||
"sgn" -> funcSgn(call)
|
"sgn" -> funcSgn(call)
|
||||||
"sqrt16" -> funcSqrt16(call)
|
"sqrtw" -> funcSqrtw(call)
|
||||||
"divmod" -> funcDivmod(call, IRDataType.BYTE)
|
"divmod" -> funcDivmod(call, IRDataType.BYTE)
|
||||||
"divmodw" -> funcDivmod(call, IRDataType.WORD)
|
"divmodw" -> funcDivmod(call, IRDataType.WORD)
|
||||||
"pop" -> funcPop(call)
|
"pop" -> funcPop(call)
|
||||||
@ -209,7 +209,7 @@ internal class BuiltinFuncGen(private val codeGen: IRCodeGen, private val exprGe
|
|||||||
return ExpressionCodeResult(result, vmDt, resultReg, -1)
|
return ExpressionCodeResult(result, vmDt, resultReg, -1)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun funcSqrt16(call: PtBuiltinFunctionCall): ExpressionCodeResult {
|
private fun funcSqrtw(call: PtBuiltinFunctionCall): ExpressionCodeResult {
|
||||||
val result = mutableListOf<IRCodeChunkBase>()
|
val result = mutableListOf<IRCodeChunkBase>()
|
||||||
val tr = exprGen.translateExpression(call.args.single())
|
val tr = exprGen.translateExpression(call.args.single())
|
||||||
addToResult(result, tr, tr.resultReg, -1)
|
addToResult(result, tr, tr.resultReg, -1)
|
||||||
|
@ -203,14 +203,14 @@ func_sign_w_stack .proc
|
|||||||
rts
|
rts
|
||||||
.pend
|
.pend
|
||||||
|
|
||||||
func_sqrt16_stack .proc
|
func_sqrtw_stack .proc
|
||||||
jsr func_sqrt16_into_A
|
jsr func_sqrtw_into_A
|
||||||
sta P8ESTACK_LO,x
|
sta P8ESTACK_LO,x
|
||||||
dex
|
dex
|
||||||
rts
|
rts
|
||||||
.pend
|
.pend
|
||||||
|
|
||||||
func_sqrt16_into_A .proc
|
func_sqrtw_into_A .proc
|
||||||
; integer square root from http://6502org.wikidot.com/software-math-sqrt
|
; integer square root from http://6502org.wikidot.com/software-math-sqrt
|
||||||
sta P8ZP_SCRATCH_W1
|
sta P8ZP_SCRATCH_W1
|
||||||
sty P8ZP_SCRATCH_W1+1
|
sty P8ZP_SCRATCH_W1+1
|
||||||
|
@ -19,7 +19,7 @@ internal val constEvaluatorsForBuiltinFuncs: Map<String, ConstExpressionCaller>
|
|||||||
"len" to ::builtinLen,
|
"len" to ::builtinLen,
|
||||||
"sizeof" to ::builtinSizeof,
|
"sizeof" to ::builtinSizeof,
|
||||||
"sgn" to ::builtinSgn,
|
"sgn" to ::builtinSgn,
|
||||||
"sqrt16" to { a, p, prg -> oneIntArgOutputInt(a, p, prg) { sqrt(it.toDouble()) } },
|
"sqrtw" to { a, p, prg -> oneIntArgOutputInt(a, p, prg) { sqrt(it.toDouble()) } },
|
||||||
"any" to { a, p, prg -> collectionArg(a, p, prg, ::builtinAny) },
|
"any" to { a, p, prg -> collectionArg(a, p, prg, ::builtinAny) },
|
||||||
"all" to { a, p, prg -> collectionArg(a, p, prg, ::builtinAll) },
|
"all" to { a, p, prg -> collectionArg(a, p, prg, ::builtinAll) },
|
||||||
"lsb" to { a, p, prg -> oneIntArgOutputInt(a, p, prg) { x: Int -> (x and 255).toDouble() } },
|
"lsb" to { a, p, prg -> oneIntArgOutputInt(a, p, prg) { x: Int -> (x and 255).toDouble() } },
|
||||||
|
@ -298,10 +298,10 @@ main {
|
|||||||
|
|
||||||
|
|
||||||
uw = 50000
|
uw = 50000
|
||||||
ub = sqrt16(uw)
|
ub = sqrtw(uw)
|
||||||
txt.print_ub(ub)
|
txt.print_ub(ub)
|
||||||
txt.nl()
|
txt.nl()
|
||||||
ub = zero+sqrt16(uw)*1+zero
|
ub = zero+sqrtw(uw)*1+zero
|
||||||
txt.print_ub(ub)
|
txt.print_ub(ub)
|
||||||
txt.nl()
|
txt.nl()
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ class TestIntermediateAst: FunSpec({
|
|||||||
ubyte cc
|
ubyte cc
|
||||||
ubyte[] array = [1,2,3]
|
ubyte[] array = [1,2,3]
|
||||||
cc = 11 in array
|
cc = 11 in array
|
||||||
cc = sqrt16(lsb(cc))
|
cc = sqrtw(lsb(cc))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
|
@ -768,9 +768,10 @@ abs (x)
|
|||||||
sgn (x)
|
sgn (x)
|
||||||
Get the sign of the value. Result is -1, 0 or 1 (negative, zero, positive).
|
Get the sign of the value. Result is -1, 0 or 1 (negative, zero, positive).
|
||||||
|
|
||||||
sqrt16 (w)
|
sqrtw (w)
|
||||||
16 bit unsigned integer Square root. Result is unsigned byte.
|
16 bit unsigned integer Square root. Result is unsigned byte.
|
||||||
To do the reverse, squaring an integer, just write ``x*x``.
|
To do the reverse, squaring an integer, just write ``x*x``.
|
||||||
|
Floating point square root has its own function `floats.sqrt()`
|
||||||
|
|
||||||
divmod (number, divident, division, remainder)
|
divmod (number, divident, division, remainder)
|
||||||
Performs division and remainder calculation in a single call. This is faster than using separate '/' and '%' calculations.
|
Performs division and remainder calculation in a single call. This is faster than using separate '/' and '%' calculations.
|
||||||
|
@ -1,6 +1,11 @@
|
|||||||
TODO
|
TODO
|
||||||
====
|
====
|
||||||
|
|
||||||
|
New major release 9.0
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
- renamed builtin function sqrt16 to sqrtw for consistency
|
||||||
|
|
||||||
|
|
||||||
For next minor release
|
For next minor release
|
||||||
^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^
|
||||||
- try to optimize newexpr a bit more
|
- try to optimize newexpr a bit more
|
||||||
@ -8,9 +13,35 @@ For next minor release
|
|||||||
...
|
...
|
||||||
|
|
||||||
|
|
||||||
For 9.0 major changes are being made in the "version_9" branch. Look there.
|
For 9.0 major changes
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
- copy (not move) the CBM kernal romsubs to a new 'cbm' block so programs on c128 and cx16 can also
|
||||||
|
simply refer to cbm.CHROUT rather than c64.CHROUT which looks a bit silly on the non-c64 cbm systems.
|
||||||
|
we keep the old definitions intact because of backwards compatibility reasons.
|
||||||
|
- try to reintroduce builtin functions max/maxw/min/minw that take 2 args and return the largest/smallest of them.
|
||||||
|
This is a major change because it will likely break existing code that is now using min and max as variable names.
|
||||||
|
Also add optimization that changes the word variant to byte variant if the operands are bytes.
|
||||||
|
- 6502 codegen: see if we can let for loops skip the loop if startvar>endvar, without adding a lot of code size/duplicating the loop condition.
|
||||||
|
It is documented behavior to now loop 'around' $00 but it's too easy to forget about!
|
||||||
|
Lot of work because of so many special cases in ForLoopsAsmgen.....
|
||||||
|
(vm codegen already behaves like this!)
|
||||||
|
- ?? get rid of the disknumber parameter everywhere in diskio, make it a configurable variable that defaults to 8.
|
||||||
|
the large majority of users will only deal with a single disk drive so why not make it easier for them.
|
||||||
|
But see complaint on github https://github.com/irmen/prog8/issues/106
|
||||||
|
- duplicate diskio for cx16 (get rid of cx16diskio, just copy diskio and tweak everything) + documentation
|
||||||
|
- get f_seek_w working like in the BASIC program - this needs the changes to diskio.f_open to use suffixes ,p,m
|
||||||
|
- add special (u)word array type (or modifier such as @fast? ) that puts the array into memory as 2 separate byte-arrays 1 for LSB 1 for MSB -> allows for word arrays of length 256 and faster indexing
|
||||||
|
this is an enormous amout of work, if this type is to be treated equally as existing (u)word , because all expression / lookup / assignment routines need to know about the distinction....
|
||||||
|
So maybe only allow the bare essentials? (store, get, bitwise operations?)
|
||||||
|
- Some more support for (64tass) SEGMENTS ?
|
||||||
|
- (What, how, isn't current BSS support enough?)
|
||||||
|
- Add a mechanism to allocate variables into golden ram (or segments really) (see GoldenRam class)
|
||||||
|
- maybe treat block "golden" in a special way: can only contain vars, every var will be allocated in the Golden ram area?
|
||||||
|
- maybe or may not needed: the variables can NOT have initialization values, they will all be set to zero on startup (simple memset)
|
||||||
|
just initialize them yourself in start() if you need a non-zero value .
|
||||||
|
- OR.... do all this automatically if 'golden' is enabled as a compiler option? So compiler allocates in ZP first, then Golden Ram, then regular ram
|
||||||
|
- OR.... make all this more generic and use some %segment option to create real segments for 64tass?
|
||||||
|
- (need separate step in codegen and IR to write the "golden" variables)
|
||||||
|
|
||||||
|
|
||||||
Need help with
|
Need help with
|
||||||
|
@ -66,7 +66,7 @@ main {
|
|||||||
word dy = y as word - circle_y[cix]
|
word dy = y as word - circle_y[cix]
|
||||||
uword sqx = dx*dx as uword
|
uword sqx = dx*dx as uword
|
||||||
uword sqy = dy*dy as uword
|
uword sqy = dy*dy as uword
|
||||||
return sqrt16(sqx + sqy)
|
return sqrtw(sqx + sqy)
|
||||||
}
|
}
|
||||||
|
|
||||||
; sub distance(ubyte cix) -> uword {
|
; sub distance(ubyte cix) -> uword {
|
||||||
|
@ -817,7 +817,7 @@ planet {
|
|||||||
else
|
else
|
||||||
ay=y-py
|
ay=y-py
|
||||||
ay /= 2
|
ay /= 2
|
||||||
ubyte d = sqrt16(ax*ax + ay*ay)
|
ubyte d = sqrtw(ax*ax + ay*ay)
|
||||||
if d>63
|
if d>63
|
||||||
return 255
|
return 255
|
||||||
return d*4
|
return d*4
|
||||||
|
@ -744,7 +744,7 @@ planet {
|
|||||||
else
|
else
|
||||||
ay=y-py
|
ay=y-py
|
||||||
ay /= 2
|
ay /= 2
|
||||||
ubyte d = sqrt16(ax*ax + ay*ay)
|
ubyte d = sqrtw(ax*ax + ay*ay)
|
||||||
if d>63
|
if d>63
|
||||||
return 255
|
return 255
|
||||||
return d*4
|
return d*4
|
||||||
|
@ -14,10 +14,10 @@
|
|||||||
<keywords keywords="&;->;@;\$;and;as;asmsub;break;clobbers;do;downto;else;false;for;goto;if;if_cc;if_cs;if_eq;if_mi;if_ne;if_neg;if_nz;if_pl;if_pos;if_vc;if_vs;if_z;in;inline;not;or;repeat;return;romsub;step;sub;to;true;unroll;until;when;while;xor;~" ignore_case="false" />
|
<keywords keywords="&;->;@;\$;and;as;asmsub;break;clobbers;do;downto;else;false;for;goto;if;if_cc;if_cs;if_eq;if_mi;if_ne;if_neg;if_nz;if_pl;if_pos;if_vc;if_vs;if_z;in;inline;not;or;repeat;return;romsub;step;sub;to;true;unroll;until;when;while;xor;~" ignore_case="false" />
|
||||||
<keywords2 keywords="%address;%asm;%asmbinary;%asminclude;%breakpoint;%import;%ir;%launcher;%option;%output;%zeropage;%zpreserved;iso:;petscii:;sc:" />
|
<keywords2 keywords="%address;%asm;%asmbinary;%asminclude;%breakpoint;%import;%ir;%launcher;%option;%output;%zeropage;%zpreserved;iso:;petscii:;sc:" />
|
||||||
<keywords3 keywords="@requirezp;@shared;@zp;bool;byte;const;float;str;ubyte;uword;void;word" />
|
<keywords3 keywords="@requirezp;@shared;@zp;bool;byte;const;float;str;ubyte;uword;void;word" />
|
||||||
<keywords4 keywords="abs;all;any;callfar;callram;callrom;cmp;len;lsb;memory;mkword;msb;peek;peekw;poke;pokew;pop;popw;push;pushw;reverse;rol;rol2;ror;ror2;rrestore;rrestorex;rsave;rsavex;sgn;sizeof;sort;sqrt16;swap;|>" />
|
<keywords4 keywords="abs;all;any;callfar;callram;callrom;cmp;len;lsb;memory;mkword;msb;peek;peekw;poke;pokew;pop;popw;push;pushw;reverse;rol;rol2;ror;ror2;rrestore;rrestorex;rsave;rsavex;sgn;sizeof;sort;sqrtw;swap;|>" />
|
||||||
</highlighting>
|
</highlighting>
|
||||||
<extensionMap>
|
<extensionMap>
|
||||||
<mapping ext="p8" />
|
<mapping ext="p8" />
|
||||||
<mapping ext="prog8" />
|
<mapping ext="prog8" />
|
||||||
</extensionMap>
|
</extensionMap>
|
||||||
</filetype>
|
</filetype>
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
<Keywords name="Keywords1">void const
str
byte ubyte bool
word uword
float
zp shared requirezp</Keywords>
|
<Keywords name="Keywords1">void const
str
byte ubyte bool
word uword
float
zp shared requirezp</Keywords>
|
||||||
<Keywords name="Keywords2">%address
%asm
%ir
%asmbinary
%asminclude
%breakpoint
%import
%launcher
%option
%output
%zeropage
%zpreserved</Keywords>
|
<Keywords name="Keywords2">%address
%asm
%ir
%asmbinary
%asminclude
%breakpoint
%import
%launcher
%option
%output
%zeropage
%zpreserved</Keywords>
|
||||||
<Keywords name="Keywords3">inline sub asmsub romsub
clobbers
asm
if
when else
if_cc if_cs if_eq if_mi if_neg if_nz if_pl if_pos if_vc if_vs if_z
for in step do while repeat unroll
break return goto</Keywords>
|
<Keywords name="Keywords3">inline sub asmsub romsub
clobbers
asm
if
when else
if_cc if_cs if_eq if_mi if_neg if_nz if_pl if_pos if_vc if_vs if_z
for in step do while repeat unroll
break return goto</Keywords>
|
||||||
<Keywords name="Keywords4">abs all any callfar cmp len lsb lsl lsr memory mkword msb peek peekw poke pokew push pushw pop popw rsave rsavex rrestore rrestorex reverse rnd rndw rol rol2 ror ror2 sgn sizeof sort sqrt16 swap</Keywords>
|
<Keywords name="Keywords4">abs all any callfar cmp len lsb lsl lsr memory mkword msb peek peekw poke pokew push pushw pop popw rsave rsavex rrestore rrestorex reverse rnd rndw rol rol2 ror ror2 sgn sizeof sort sqrtw swap</Keywords>
|
||||||
<Keywords name="Keywords5">true false
not and or xor
as to downto |></Keywords>
|
<Keywords name="Keywords5">true false
not and or xor
as to downto |></Keywords>
|
||||||
<Keywords name="Keywords6"></Keywords>
|
<Keywords name="Keywords6"></Keywords>
|
||||||
<Keywords name="Keywords7"></Keywords>
|
<Keywords name="Keywords7"></Keywords>
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
" Built-in functions
|
" Built-in functions
|
||||||
|
|
||||||
" Math functions
|
" Math functions
|
||||||
syn keyword prog8BuiltInFunc sgn sqrt16
|
syn keyword prog8BuiltInFunc sgn sqrtw
|
||||||
|
|
||||||
" Array functions
|
" Array functions
|
||||||
syn keyword prog8BuiltInFunc any all len reverse sort
|
syn keyword prog8BuiltInFunc any all len reverse sort
|
||||||
|
Loading…
Reference in New Issue
Block a user