1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2025-04-09 21:37:31 +00:00

Using reciprocal multiplication for divisions inside loop.

This commit is contained in:
jespergravgaard 2018-02-20 10:53:31 +01:00
parent d3070fec14
commit db603554ac
5 changed files with 4968 additions and 5336 deletions

View File

@ -2,17 +2,18 @@
// Uses a single division for converting the wavelength to a reciprocal.
// Generates sinus using the series sin(x) = x - x^/3! + x^-5! - x^7/7! ...
// Uses the approximation sin(x) = x - x^/6 + x^/128
// Uses reciprocal
// Optimization possibility: Generate sinus value over the interval 0-PI/2 and uses mirroring to get the remaining values
// Optimization possibility: Use symmetries when generating sinustables. wavelength%2==0 -> mirror symmetry over PI, wavelength%4==0 -> mirror symmetry over PI/2.
import "division.kc"
import "multiply.kc"
import "print.kc"
void main() {
asm { sei }
print_cls();
signed word[20] sintab;
sin16s_gen(sintab, 20);
asm { cli }
//for(byte i=0; i<20*2; i=i+2) {
// print_byte(i);
// print_str(" @");
@ -21,67 +22,56 @@ void main() {
//}
}
// PI*2 in u[4.12] format
const word PI2_u4f12 = $6488;
// PI in u[4.12] format
const word PI_u4f12 = $3244;
// PI/2 in u[4.12] format
const word PI_HALF_u4f12 = $1922;
// PI*2 in u[4.28] format
const dword PI2_u4f28 = $6487ed51;
// PI in u[4.28] format
const dword PI_u4f28 = $3243f6a9;
// PI/2 in u[4.28] format
const dword PI_HALF_u4f28 = $1921FB54;
// Generate signed word sinus table
// sintab - the table to generate into
// wavelength - the number of sinus points in a total sinus wavelength (the size of the table)
void sin16s_gen(signed word* sintab, word wavelength) {
// PI/4 in 0.16 in [0.16] format
//const word PI_QUARTER = $c910;
// 2*PI in [16.16] format
//const dword PI2 = $6487f;
// 2*PI in [4.12] format
const word PI2 = $6488;
// PI*2 in [4.28] format
const dword PI2_u4f28 = $6487ed51;
// PI in [4.28] format
const dword PI_u4f28 = $3243f6a9;
// PI/2 in [4.28] format
const dword PI_HALF_u4f28 = $1921FB54;
// PI*2 in [4.12] format
const word PI2_u4f12 = $6488;
// PI in [4.12] format
const word PI_u4f12 = $3244;
// PI/2 in [4.12] format
const word PI_HALF_u4f12 = $1922;
// Another possible approximation - PI = 355/113
//word pi2_i = divr16u(2*355, 113, 0);
//word pi2_f = divr16u(0, 113, rem16u);
//dword pi2 = { pi2_i, pi2_f };
// Calculate step in [4.24]
word stepi = divr16u(PI2, wavelength, 0);
// u[4.12] step = PI*2/wavelength
word stepi = divr16u(PI2_u4f12, wavelength, 0);
word stepf = divr16u(0, wavelength, rem16u);
dword step = { stepi, stepf };
print_str("2*pi @");
print_word(PI2);
print_ln();
print_str("step @");
print_dword(step);
print_ln();
dword step = { stepi, stepf }; // u[4.12]
// Iterate over the table
dword x = 0; // u[4.28]
// u[0.16] div6 = 1/6 ;
//divr16u(1, 6, 0);
//word div6 = divr16u(0, 6, rem16u);
// u[0.16] div6 = 1/6 ;
word div6 = $10000/6; //$2aab;
// u[0.16] div128 = 1/128 ;
word div128 = $10000/128; //$0200;
for( word i=0; i<wavelength; i++) {
word x1 = >x;
// Move x1 into the range 0-PI/2 using sinus mirror symmetries
word x1 = >x; // u[4.12]
byte isUpper = 0;
if(x1>= PI_u4f12 ) {
if(x1 >= PI_u4f12 ) {
x1 = x1-PI_u4f12;
isUpper = 1;
}
if(x1>= PI_HALF_u4f12 ) {
if(x1 >= PI_HALF_u4f12 ) {
x1 = PI_u4f12 - x1;
}
// sinx = x - x3/6 + x5/128;
// s[4.12] sinx = x - x^3/6 + x5/128;
word x2 = mul_u4f12(x1, x1); // u[4.12]
word x3 = mul_u4f12(x2, x1); // u[4.12]
word x4 = mul_u4f12(x3, x1); // u[4.12]
word x5 = mul_u4f12(x4, x1); // u[4.12]
word x3_6i = divr16u(x3, 6, 0); // u[4.12]
word x5_128i = divr16u(x5, 128, 0); // u[4.12]
word usinx = x1 - x3_6i + x5_128i; // u[4.12]
signed word sinx = (signed word)usinx;
word x3_6 = >mul16u(x3, div6);
word x5_128 = >mul16u(x5, div128); // u[4.12]
word usinx = x1 - x3_6 + x5_128; // u[4.12]
signed word sinx = (signed word)usinx; // s[4.12]
if(isUpper!=0) {
sinx = -sinx;
}
@ -94,9 +84,9 @@ void sin16s_gen(signed word* sintab, word wavelength) {
print_str(" @");
print_word(x1);
print_str(" @");
print_word(x3);
print_word(x3_6);
print_str(" @");
print_word(x5);
print_word(x5_128);
print_str(" @");
print_sword(sinx);
print_ln();

View File

@ -2,32 +2,38 @@
:BasicUpstart(main)
.pc = $80d "Program"
.label SCREEN = $400
.label rem16u = $12
.const PI2_u4f12 = $6488
.const PI_u4f12 = $3244
.const PI_HALF_u4f12 = $1922
.label rem16u = 8
.label char_cursor = $12
.label line_cursor = $e
jsr main
main: {
sei
jsr print_cls
jsr sin16s_gen
cli
rts
sintab: .fill $28, 0
}
sin16s_gen: {
.const wavelength = $14
.const PI2 = $6488
.const PI_u4f12 = $3244
.const PI_HALF_u4f12 = $1922
.label _21 = $26
.label stepi = 6
.const div6 = $10000/6
.const div128 = $10000/$80
.label _15 = $14
.label _17 = $14
.label _19 = $c
.label stepi = $e
.label stepf = $c
.label step = $20
.label step = $1c
.label x1 = $a
.label x2 = $16
.label x3 = $24
.label x4 = $16
.label x5 = $16
.label x3_6i = $26
.label x5_128i = $c
.label x2 = $10
.label x3 = $20
.label x4 = $10
.label x5 = $22
.label x3_6 = $20
.label x5_128 = $22
.label usinx = $c
.label sintab = 6
.label x = 2
@ -37,9 +43,9 @@ sin16s_gen: {
sta divr16u.divisor
lda #>wavelength
sta divr16u.divisor+1
lda #<PI2
lda #<PI2_u4f12
sta divr16u.dividend
lda #>PI2
lda #>PI2_u4f12
sta divr16u.dividend+1
lda #<0
sta divr16u.rem
@ -66,43 +72,13 @@ sin16s_gen: {
lda stepf+1
sta step+1
lda #<SCREEN
sta char_cursor
lda #>SCREEN
sta char_cursor+1
lda #<str
sta print_str.str
lda #>str
sta print_str.str+1
jsr print_str
lda #<PI2
sta print_word.w
lda #>PI2
sta print_word.w+1
jsr print_word
lda #<SCREEN
sta line_cursor
lda #>SCREEN
sta line_cursor+1
jsr print_ln
lda line_cursor
lda #<SCREEN
sta char_cursor
lda line_cursor+1
lda #>SCREEN
sta char_cursor+1
lda #<str1
sta print_str.str
lda #>str1
sta print_str.str+1
jsr print_str
lda step
sta print_dword.dw
lda step+1
sta print_dword.dw+1
lda step+2
sta print_dword.dw+2
lda step+3
sta print_dword.dw+3
jsr print_dword
jsr print_ln
lda #<0
sta i
sta i+1
@ -134,10 +110,10 @@ sin16s_gen: {
lda x1+1
sbc #>PI_u4f12
sta x1+1
ldy #1
ldx #1
jmp b2
b5:
ldy #0
ldx #0
b2:
lda x1+1
cmp #>PI_HALF_u4f12
@ -171,48 +147,51 @@ sin16s_gen: {
sta mul_u4f12.v1+1
jsr mul_u4f12
jsr mul_u4f12
lda mul_u4f12.return
sta x5
lda mul_u4f12.return+1
sta x5+1
lda x3
sta divr16u.dividend
sta mul16u.a
lda x3+1
sta divr16u.dividend+1
lda #<6
sta divr16u.divisor
lda #>6
sta divr16u.divisor+1
sta divr16u.rem
sta divr16u.rem+1
jsr divr16u
lda divr16u.return
sta x3_6i
lda divr16u.return+1
sta x3_6i+1
sta mul16u.a+1
lda #<div6
sta mul16u.b
lda #>div6
sta mul16u.b+1
jsr mul16u
lda _15+2
sta x3_6
lda _15+3
sta x3_6+1
lda x5
sta divr16u.dividend
sta mul16u.a
lda x5+1
sta divr16u.dividend+1
lda #<$80
sta divr16u.divisor
lda #>$80
sta divr16u.divisor+1
lda #<0
sta divr16u.rem
sta divr16u.rem+1
jsr divr16u
sta mul16u.a+1
lda #<div128
sta mul16u.b
lda #>div128
sta mul16u.b+1
jsr mul16u
lda _17+2
sta x5_128
lda _17+3
sta x5_128+1
lda x1
sec
sbc _21
sta _21
sbc x3_6
sta _19
lda x1+1
sbc _21+1
sta _21+1
sbc x3_6+1
sta _19+1
lda usinx
clc
adc _21
adc x5_128
sta usinx
lda usinx+1
adc _21+1
adc x5_128+1
sta usinx+1
cpy #0
cpx #0
beq b4
sec
lda sinx
@ -241,20 +220,16 @@ sin16s_gen: {
sta print_word.w
lda i+1
sta print_word.w+1
lda line_cursor
sta char_cursor
lda line_cursor+1
sta char_cursor+1
jsr print_word
lda #<str2
lda #<str
sta print_str.str
lda #>str2
lda #>str
sta print_str.str+1
jsr print_str
jsr print_dword
lda #<str3
lda #<str1
sta print_str.str
lda #>str3
lda #>str1
sta print_str.str+1
jsr print_str
lda x1
@ -262,31 +237,31 @@ sin16s_gen: {
lda x1+1
sta print_word.w+1
jsr print_word
lda #<str2
sta print_str.str
lda #>str2
sta print_str.str+1
jsr print_str
lda x3_6
sta print_word.w
lda x3_6+1
sta print_word.w+1
jsr print_word
lda #<str3
sta print_str.str
lda #>str3
sta print_str.str+1
jsr print_str
lda x5_128
sta print_word.w
lda x5_128+1
sta print_word.w+1
jsr print_word
lda #<str4
sta print_str.str
lda #>str4
sta print_str.str+1
jsr print_str
lda x3
sta print_word.w
lda x3+1
sta print_word.w+1
jsr print_word
lda #<str5
sta print_str.str
lda #>str5
sta print_str.str+1
jsr print_str
lda x5
sta print_word.w
lda x5+1
sta print_word.w+1
jsr print_word
lda #<str6
sta print_str.str
lda #>str6
sta print_str.str+1
jsr print_str
jsr print_sword
jsr print_ln
lda x
@ -308,24 +283,24 @@ sin16s_gen: {
!:
lda i+1
cmp #>wavelength
bcs !b1+
jmp b1
!b1:
bcc b29
bne !+
lda i
cmp #<wavelength
bcs !b1+
jmp b1
!b1:
bcc b29
!:
rts
str: .text "2*pi @"
str1: .text "step @"
b29:
lda line_cursor
sta char_cursor
lda line_cursor+1
sta char_cursor+1
jmp b1
str: .text " @"
str1: .text " @"
str2: .text " @"
str3: .text " @"
str4: .text " @"
str5: .text " @"
str6: .text " @"
}
print_ln: {
b1:
@ -441,91 +416,12 @@ print_dword: {
jsr print_word
rts
}
divr16u: {
.label rem = $12
.label dividend = $14
.label quotient = $c
.label return = $c
.label divisor = $10
ldx #0
txa
sta quotient
sta quotient+1
b1:
asl rem
rol rem+1
lda dividend+1
and #$80
cmp #0
beq b2
lda #1
ora rem
sta rem
b2:
asl dividend
rol dividend+1
asl quotient
rol quotient+1
lda rem+1
cmp divisor+1
bcc b3
bne !+
lda rem
cmp divisor
bcc b3
!:
inc quotient
bne !+
inc quotient+1
!:
lda rem
sec
sbc divisor
sta rem
lda rem+1
sbc divisor+1
sta rem+1
b3:
inx
cpx #$10
bne b1
rts
}
mul_u4f12: {
.label _0 = $18
.label _1 = $18
.label v1 = $16
.label v2 = $a
.label return = $16
jsr mul16u
asl _1
rol _1+1
rol _1+2
rol _1+3
asl _1
rol _1+1
rol _1+2
rol _1+3
asl _1
rol _1+1
rol _1+2
rol _1+3
asl _1
rol _1+1
rol _1+2
rol _1+3
lda _1+2
sta return
lda _1+3
sta return+1
rts
}
mul16u: {
.label mb = $1c
.label a = $16
.label res = $18
.label b = $a
.label return = $18
.label mb = $18
.label a = $10
.label res = $14
.label return = $14
.label b = $c
lda b
sta mb
lda b+1
@ -571,6 +467,89 @@ mul16u: {
rol mb+3
jmp b1
}
mul_u4f12: {
.label _0 = $14
.label _1 = $14
.label v1 = $10
.label v2 = $a
.label return = $10
lda v2
sta mul16u.b
lda v2+1
sta mul16u.b+1
jsr mul16u
asl _1
rol _1+1
rol _1+2
rol _1+3
asl _1
rol _1+1
rol _1+2
rol _1+3
asl _1
rol _1+1
rol _1+2
rol _1+3
asl _1
rol _1+1
rol _1+2
rol _1+3
lda _1+2
sta return
lda _1+3
sta return+1
rts
}
divr16u: {
.label rem = 8
.label dividend = $a
.label quotient = $c
.label return = $c
.label divisor = 6
ldx #0
txa
sta quotient
sta quotient+1
b1:
asl rem
rol rem+1
lda dividend+1
and #$80
cmp #0
beq b2
lda #1
ora rem
sta rem
b2:
asl dividend
rol dividend+1
asl quotient
rol quotient+1
lda rem+1
cmp divisor+1
bcc b3
bne !+
lda rem
cmp divisor
bcc b3
!:
inc quotient
bne !+
inc quotient+1
!:
lda rem
sec
sbc divisor
sta rem
lda rem+1
sbc divisor+1
sta rem+1
b3:
inx
cpx #$10
bne b1
rts
}
print_cls: {
.label sc = 6
lda #<SCREEN

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,22 +1,27 @@
(label) @23
(label) @begin
(label) @end
(word) PI2_u4f12
(const word) PI2_u4f12#0 PI2_u4f12 = (word/signed word/dword/signed dword) 25736
(word) PI_HALF_u4f12
(const word) PI_HALF_u4f12#0 PI_HALF_u4f12 = (word/signed word/dword/signed dword) 6434
(word) PI_u4f12
(const word) PI_u4f12#0 PI_u4f12 = (word/signed word/dword/signed dword) 12868
(byte*) SCREEN
(const byte*) SCREEN#0 SCREEN = ((byte*))(word/signed word/dword/signed dword) 1024
(byte*) char_cursor
(byte*) char_cursor#1 char_cursor zp ZP_WORD:18 101.0
(byte*~) char_cursor#122 char_cursor zp ZP_WORD:18 22.0
(byte*~) char_cursor#128 char_cursor zp ZP_WORD:18 4.0
(byte*) char_cursor#17 char_cursor zp ZP_WORD:18 4.2564102564102555
(byte*) char_cursor#2 char_cursor zp ZP_WORD:18 15.727272727272727
(byte*) char_cursor#60 char_cursor zp ZP_WORD:18 5.0
(byte*) char_cursor#88 char_cursor zp ZP_WORD:18 3.0
(byte*) char_cursor#90 char_cursor zp ZP_WORD:18 27.0
(byte*) char_cursor#92 char_cursor zp ZP_WORD:18 2.0
(byte*) char_cursor#97 char_cursor zp ZP_WORD:18 59.0
(byte*~) char_cursor#102 char_cursor zp ZP_WORD:18 22.0
(byte*) char_cursor#17 char_cursor zp ZP_WORD:18 3.1388888888888875
(byte*) char_cursor#2 char_cursor zp ZP_WORD:18 20.235294117647058
(byte*) char_cursor#54 char_cursor zp ZP_WORD:18 5.0
(byte*) char_cursor#76 char_cursor zp ZP_WORD:18 3.0
(byte*) char_cursor#78 char_cursor zp ZP_WORD:18 26.0
(byte*) char_cursor#80 char_cursor zp ZP_WORD:18 2.0
(byte*) char_cursor#82 char_cursor zp ZP_WORD:18 0.46808510638297873
(word()) divr16u((word) divr16u::dividend , (word) divr16u::divisor , (word) divr16u::rem)
(byte~) divr16u::$1 reg byte a 202.0
(byte~) divr16u::$2 reg byte a 202.0
(byte~) divr16u::$1 reg byte a 22.0
(byte~) divr16u::$2 reg byte a 22.0
(label) divr16u::@1
(label) divr16u::@2
(label) divr16u::@3
@ -25,41 +30,38 @@
(label) divr16u::@6
(label) divr16u::@return
(word) divr16u::dividend
(word) divr16u::dividend#0 dividend zp ZP_WORD:20 25.25
(word) divr16u::dividend#3 dividend zp ZP_WORD:20 22.0
(word) divr16u::dividend#4 dividend zp ZP_WORD:20 22.0
(word) divr16u::dividend#5 dividend zp ZP_WORD:20 43.57142857142858
(word) divr16u::dividend#7 dividend zp ZP_WORD:20 24.0
(word) divr16u::dividend#0 dividend zp ZP_WORD:10 2.75
(word) divr16u::dividend#3 dividend zp ZP_WORD:10 5.0
(word) divr16u::dividend#5 dividend zp ZP_WORD:10 2.0
(word) divr16u::divisor
(word) divr16u::divisor#8 divisor zp ZP_WORD:16 12.625
(word) divr16u::divisor#6 divisor zp ZP_WORD:6 1.375
(byte) divr16u::i
(byte) divr16u::i#1 reg byte x 151.5
(byte) divr16u::i#2 reg byte x 15.538461538461538
(byte) divr16u::i#1 reg byte x 16.5
(byte) divr16u::i#2 reg byte x 1.6923076923076923
(word) divr16u::quotient
(word) divr16u::quotient#1 quotient zp ZP_WORD:12 151.5
(word) divr16u::quotient#2 quotient zp ZP_WORD:12 101.0
(word) divr16u::quotient#3 quotient zp ZP_WORD:12 25.25
(word) divr16u::quotient#1 quotient zp ZP_WORD:12 16.5
(word) divr16u::quotient#2 quotient zp ZP_WORD:12 11.0
(word) divr16u::quotient#3 quotient zp ZP_WORD:12 2.75
(word) divr16u::rem
(word) divr16u::rem#0 rem zp ZP_WORD:18 75.75
(word) divr16u::rem#1 rem zp ZP_WORD:18 202.0
(word) divr16u::rem#10 rem zp ZP_WORD:18 101.0
(word) divr16u::rem#11 rem zp ZP_WORD:18 101.66666666666667
(word) divr16u::rem#12 rem zp ZP_WORD:18 4.0
(word) divr16u::rem#2 rem zp ZP_WORD:18 202.0
(word) divr16u::rem#4 rem zp ZP_WORD:18 4.0
(word) divr16u::rem#7 rem zp ZP_WORD:18 204.0
(word) divr16u::rem#0 rem zp ZP_WORD:8 8.25
(word) divr16u::rem#1 rem zp ZP_WORD:8 22.0
(word) divr16u::rem#10 rem zp ZP_WORD:8 4.0
(word) divr16u::rem#11 rem zp ZP_WORD:8 11.666666666666666
(word) divr16u::rem#2 rem zp ZP_WORD:8 22.0
(word) divr16u::rem#4 rem zp ZP_WORD:8 4.0
(word) divr16u::rem#5 rem zp ZP_WORD:8 24.0
(word) divr16u::rem#6 rem zp ZP_WORD:8 11.0
(word) divr16u::return
(word) divr16u::return#0 return zp ZP_WORD:12 36.55555555555556
(word) divr16u::return#10 return zp ZP_WORD:12 22.0
(word) divr16u::return#0 return zp ZP_WORD:12 5.285714285714286
(word) divr16u::return#2 return zp ZP_WORD:12 4.0
(word) divr16u::return#3 return zp ZP_WORD:12 4.0
(word) divr16u::return#4 return zp ZP_WORD:12 22.0
(byte*) line_cursor
(byte*) line_cursor#1 line_cursor zp ZP_WORD:14 4.012195121951219
(byte*) line_cursor#13 line_cursor zp ZP_WORD:14 204.0
(byte*) line_cursor#25 line_cursor zp ZP_WORD:14 15.0
(byte*) line_cursor#1 line_cursor zp ZP_WORD:14 40.625
(byte*) line_cursor#11 line_cursor zp ZP_WORD:14 204.0
(byte*) line_cursor#23 line_cursor zp ZP_WORD:14 0.18571428571428572
(void()) main()
(label) main::@1
(label) main::@2
(label) main::@return
(signed word[20]) main::sintab
(const signed word[20]) main::sintab#0 sintab = { fill( 20, 0) }
@ -71,38 +73,44 @@
(label) mul16u::@7
(label) mul16u::@return
(word) mul16u::a
(word) mul16u::a#0 a zp ZP_WORD:22 101.0
(word) mul16u::a#1 a zp ZP_WORD:22 1.3333333333333333
(word) mul16u::a#2 a zp ZP_WORD:22 67.66666666666666
(word) mul16u::a#0 a zp ZP_WORD:16 101.0
(word) mul16u::a#1 a zp ZP_WORD:16 22.0
(word) mul16u::a#2 a zp ZP_WORD:16 22.0
(word) mul16u::a#3 a zp ZP_WORD:16 2.0
(word) mul16u::a#4 a zp ZP_WORD:16 67.66666666666666
(word) mul16u::a#7 a zp ZP_WORD:16 13.0
(word) mul16u::b
(word) mul16u::b#0 b zp ZP_WORD:10 4.0
(word) mul16u::b#2 b zp ZP_WORD:12 4.0
(word) mul16u::b#3 b zp ZP_WORD:12 4.0
(dword) mul16u::mb
(dword) mul16u::mb#0 mb zp ZP_DWORD:28 4.0
(dword) mul16u::mb#1 mb zp ZP_DWORD:28 202.0
(dword) mul16u::mb#2 mb zp ZP_DWORD:28 43.57142857142858
(dword) mul16u::mb#0 mb zp ZP_DWORD:24 4.0
(dword) mul16u::mb#1 mb zp ZP_DWORD:24 202.0
(dword) mul16u::mb#2 mb zp ZP_DWORD:24 43.57142857142858
(dword) mul16u::res
(dword) mul16u::res#1 res zp ZP_DWORD:24 202.0
(dword) mul16u::res#2 res zp ZP_DWORD:24 50.83333333333333
(dword) mul16u::res#6 res zp ZP_DWORD:24 101.0
(dword) mul16u::res#1 res zp ZP_DWORD:20 202.0
(dword) mul16u::res#2 res zp ZP_DWORD:20 40.875
(dword) mul16u::res#6 res zp ZP_DWORD:20 101.0
(dword) mul16u::return
(dword) mul16u::return#2 return zp ZP_DWORD:24 4.0
(dword) mul16u::return#2 return zp ZP_DWORD:20 22.0
(dword) mul16u::return#3 return zp ZP_DWORD:20 22.0
(dword) mul16u::return#4 return zp ZP_DWORD:20 4.0
(word()) mul_u4f12((word) mul_u4f12::v1 , (word) mul_u4f12::v2)
(dword~) mul_u4f12::$0 $0 zp ZP_DWORD:24 4.0
(dword~) mul_u4f12::$1 $1 zp ZP_DWORD:24 4.0
(dword~) mul_u4f12::$0 $0 zp ZP_DWORD:20 4.0
(dword~) mul_u4f12::$1 $1 zp ZP_DWORD:20 4.0
(label) mul_u4f12::@2
(label) mul_u4f12::@return
(word) mul_u4f12::return
(word) mul_u4f12::return#0 return zp ZP_WORD:22 22.0
(word) mul_u4f12::return#1 return zp ZP_WORD:22 22.0
(word) mul_u4f12::return#10 return zp ZP_WORD:22 7.666666666666666
(word) mul_u4f12::return#2 return zp ZP_WORD:22 22.0
(word) mul_u4f12::return#3 return zp ZP_WORD:22 22.0
(word) mul_u4f12::return#0 return zp ZP_WORD:16 22.0
(word) mul_u4f12::return#1 return zp ZP_WORD:16 22.0
(word) mul_u4f12::return#10 return zp ZP_WORD:16 7.666666666666666
(word) mul_u4f12::return#2 return zp ZP_WORD:16 22.0
(word) mul_u4f12::return#3 return zp ZP_WORD:16 22.0
(word) mul_u4f12::v1
(word) mul_u4f12::v1#0 v1 zp ZP_WORD:22 11.0
(word) mul_u4f12::v1#1 v1 zp ZP_WORD:22 11.0
(word) mul_u4f12::v1#2 v1 zp ZP_WORD:22 11.0
(word) mul_u4f12::v1#3 v1 zp ZP_WORD:22 11.0
(word) mul_u4f12::v1#4 v1 zp ZP_WORD:22 46.0
(word) mul_u4f12::v1#0 v1 zp ZP_WORD:16 11.0
(word) mul_u4f12::v1#1 v1 zp ZP_WORD:16 11.0
(word) mul_u4f12::v1#2 v1 zp ZP_WORD:16 11.0
(word) mul_u4f12::v1#3 v1 zp ZP_WORD:16 11.0
(word) mul_u4f12::v1#4 v1 zp ZP_WORD:16 46.0
(word) mul_u4f12::v2
(word) mul_u4f12::v2#0 v2 zp ZP_WORD:10 22.0
(word) mul_u4f12::v2#1 v2 zp ZP_WORD:10 22.0
@ -136,9 +144,7 @@
(label) print_dword::@1
(label) print_dword::@return
(dword) print_dword::dw
(dword) print_dword::dw#0 dw zp ZP_DWORD:2 4.0
(dword) print_dword::dw#1 dw zp ZP_DWORD:2 22.0
(dword) print_dword::dw#2 dw zp ZP_DWORD:2 5.666666666666667
(dword) print_dword::dw#0 dw zp ZP_DWORD:2 5.0
(void()) print_ln()
(label) print_ln::@1
(label) print_ln::@return
@ -148,8 +154,8 @@
(label) print_str::@return
(byte*) print_str::str
(byte*) print_str::str#0 str zp ZP_WORD:16 202.0
(byte*) print_str::str#10 str zp ZP_WORD:16 2.0
(byte*) print_str::str#8 str zp ZP_WORD:16 101.5
(byte*) print_str::str#6 str zp ZP_WORD:16 101.5
(byte*) print_str::str#8 str zp ZP_WORD:16 2.0
(void()) print_sword((signed word) print_sword::w)
(label) print_sword::@1
(label) print_sword::@2
@ -164,17 +170,19 @@
(label) print_word::@return
(word) print_word::w
(word) print_word::w#1 w zp ZP_WORD:16 4.0
(word~) print_word::w#12 w zp ZP_WORD:16 4.0
(word~) print_word::w#11 w zp ZP_WORD:16 4.0
(word) print_word::w#2 w zp ZP_WORD:16 4.0
(word) print_word::w#4 w zp ZP_WORD:16 11.0
(word) print_word::w#3 w zp ZP_WORD:16 22.0
(word) print_word::w#4 w zp ZP_WORD:16 22.0
(word) print_word::w#5 w zp ZP_WORD:16 22.0
(word) print_word::w#6 w zp ZP_WORD:16 22.0
(word) print_word::w#7 w zp ZP_WORD:16 22.0
(word) print_word::w#8 w zp ZP_WORD:16 18.0
(word) print_word::w#7 w zp ZP_WORD:16 18.0
(word) rem16u
(word) rem16u#1 rem16u zp ZP_WORD:18 0.8
(word) rem16u#1 rem16u zp ZP_WORD:8 0.8
(void()) sin16s_gen((signed word*) sin16s_gen::sintab , (word) sin16s_gen::wavelength)
(word~) sin16s_gen::$21 $21 zp ZP_WORD:38 22.0
(dword~) sin16s_gen::$15 $15 zp ZP_DWORD:20 22.0
(dword~) sin16s_gen::$17 $17 zp ZP_DWORD:20 22.0
(word~) sin16s_gen::$19 $19 zp ZP_WORD:12 22.0
(label) sin16s_gen::@1
(label) sin16s_gen::@10
(label) sin16s_gen::@11
@ -182,6 +190,7 @@
(label) sin16s_gen::@13
(label) sin16s_gen::@14
(label) sin16s_gen::@15
(label) sin16s_gen::@16
(label) sin16s_gen::@17
(label) sin16s_gen::@18
(label) sin16s_gen::@19
@ -197,96 +206,85 @@
(label) sin16s_gen::@28
(label) sin16s_gen::@29
(label) sin16s_gen::@3
(label) sin16s_gen::@30
(label) sin16s_gen::@31
(label) sin16s_gen::@32
(label) sin16s_gen::@33
(label) sin16s_gen::@34
(label) sin16s_gen::@38
(label) sin16s_gen::@4
(label) sin16s_gen::@5
(label) sin16s_gen::@6
(label) sin16s_gen::@7
(label) sin16s_gen::@9
(label) sin16s_gen::@return
(word) sin16s_gen::PI2
(const word) sin16s_gen::PI2#0 PI2 = (word/signed word/dword/signed dword) 25736
(word) sin16s_gen::PI_HALF_u4f12
(const word) sin16s_gen::PI_HALF_u4f12#0 PI_HALF_u4f12 = (word/signed word/dword/signed dword) 6434
(word) sin16s_gen::PI_u4f12
(const word) sin16s_gen::PI_u4f12#0 PI_u4f12 = (word/signed word/dword/signed dword) 12868
(word) sin16s_gen::div128
(const word) sin16s_gen::div128#0 div128 = (dword/signed dword) 65536/(byte/word/signed word/dword/signed dword) 128
(word) sin16s_gen::div6
(const word) sin16s_gen::div6#0 div6 = (dword/signed dword) 65536/(byte/signed byte/word/signed word/dword/signed dword) 6
(word) sin16s_gen::i
(word) sin16s_gen::i#1 i zp ZP_WORD:8 16.5
(word) sin16s_gen::i#10 i zp ZP_WORD:8 0.4714285714285714
(word) sin16s_gen::i#1 i zp ZP_WORD:8 11.0
(word) sin16s_gen::i#10 i zp ZP_WORD:8 0.46478873239436613
(byte) sin16s_gen::isUpper
(byte) sin16s_gen::isUpper#10 reg byte y 0.3235294117647059
(byte) sin16s_gen::isUpper#10 reg byte x 0.3055555555555556
(signed word*) sin16s_gen::sintab
(signed word*) sin16s_gen::sintab#1 sintab zp ZP_WORD:6 0.7586206896551724
(signed word*) sin16s_gen::sintab#10 sintab zp ZP_WORD:6 0.7674418604651163
(signed word*) sin16s_gen::sintab#10 sintab zp ZP_WORD:6 0.7333333333333333
(signed word) sin16s_gen::sinx
(signed word) sin16s_gen::sinx#1 sinx zp ZP_WORD:12 22.0
(signed word) sin16s_gen::sinx#10 sinx zp ZP_WORD:12 1.8333333333333333
(signed word) sin16s_gen::sinx#10 sinx zp ZP_WORD:12 1.9130434782608696
(signed word~) sin16s_gen::sinx#14 sinx zp ZP_WORD:12 22.0
(dword) sin16s_gen::step
(dword) sin16s_gen::step#0 step zp ZP_DWORD:32 0.17857142857142858
(dword) sin16s_gen::step#0 step zp ZP_DWORD:28 0.17333333333333334
(word) sin16s_gen::stepf
(word) sin16s_gen::stepf#0 stepf zp ZP_WORD:12 4.0
(word) sin16s_gen::stepi
(word) sin16s_gen::stepi#0 stepi zp ZP_WORD:6 0.8
(const string) sin16s_gen::str str = (string) "2*pi @"
(const string) sin16s_gen::str1 str1 = (string) "step @"
(word) sin16s_gen::stepi#0 stepi zp ZP_WORD:14 0.8
(const string) sin16s_gen::str str = (string) " @"
(const string) sin16s_gen::str1 str1 = (string) " @"
(const string) sin16s_gen::str2 str2 = (string) " @"
(const string) sin16s_gen::str3 str3 = (string) " @"
(const string) sin16s_gen::str4 str4 = (string) " @"
(const string) sin16s_gen::str5 str5 = (string) " @"
(const string) sin16s_gen::str6 str6 = (string) " @"
(word) sin16s_gen::usinx
(word) sin16s_gen::usinx#0 usinx zp ZP_WORD:12 5.5
(word) sin16s_gen::wavelength
(const word) sin16s_gen::wavelength#0 wavelength = (byte/signed byte/word/signed word/dword/signed dword) 20
(dword) sin16s_gen::x
(dword) sin16s_gen::x#1 x zp ZP_DWORD:2 7.333333333333333
(dword) sin16s_gen::x#10 x zp ZP_DWORD:2 0.6376811594202898
(dword) sin16s_gen::x#1 x zp ZP_DWORD:2 5.5
(dword) sin16s_gen::x#10 x zp ZP_DWORD:2 0.6285714285714286
(word) sin16s_gen::x1
(word) sin16s_gen::x1#0 x1 zp ZP_WORD:10 22.0
(word) sin16s_gen::x1#1 x1 zp ZP_WORD:10 22.0
(word) sin16s_gen::x1#10 x1 zp ZP_WORD:10 27.5
(word) sin16s_gen::x1#11 x1 zp ZP_WORD:10 2.152173913043478
(word) sin16s_gen::x1#11 x1 zp ZP_WORD:10 2.1063829787234045
(word) sin16s_gen::x1#2 x1 zp ZP_WORD:10 22.0
(word) sin16s_gen::x2
(word) sin16s_gen::x2#0 x2 zp ZP_WORD:22 22.0
(word) sin16s_gen::x2#0 x2 zp ZP_WORD:16 22.0
(word) sin16s_gen::x3
(word) sin16s_gen::x3#0 x3 zp ZP_WORD:36 1.1
(word) sin16s_gen::x3_6i
(word) sin16s_gen::x3_6i#0 x3_6i zp ZP_WORD:38 4.4
(word) sin16s_gen::x3#0 x3 zp ZP_WORD:32 3.0
(word) sin16s_gen::x3_6
(word) sin16s_gen::x3_6#0 x3_6 zp ZP_WORD:32 1.2692307692307692
(word) sin16s_gen::x4
(word) sin16s_gen::x4#0 x4 zp ZP_WORD:22 22.0
(word) sin16s_gen::x4#0 x4 zp ZP_WORD:16 22.0
(word) sin16s_gen::x5
(word) sin16s_gen::x5#0 x5 zp ZP_WORD:22 0.9705882352941178
(word) sin16s_gen::x5_128i
(word) sin16s_gen::x5_128i#0 x5_128i zp ZP_WORD:12 11.0
(word) sin16s_gen::x5#0 x5 zp ZP_WORD:34 3.6666666666666665
(word) sin16s_gen::x5_128
(word) sin16s_gen::x5_128#0 x5_128 zp ZP_WORD:34 1.32
zp ZP_DWORD:2 [ sin16s_gen::x#10 sin16s_gen::x#1 print_dword::dw#2 print_dword::dw#0 print_dword::dw#1 ]
zp ZP_WORD:6 [ sin16s_gen::sintab#10 sin16s_gen::sintab#1 print_cls::sc#2 print_cls::sc#1 sin16s_gen::stepi#0 ]
zp ZP_WORD:8 [ sin16s_gen::i#10 sin16s_gen::i#1 ]
reg byte y [ sin16s_gen::isUpper#10 ]
zp ZP_WORD:10 [ sin16s_gen::x1#11 sin16s_gen::x1#10 sin16s_gen::x1#0 sin16s_gen::x1#1 sin16s_gen::x1#2 mul_u4f12::v2#4 mul_u4f12::v2#1 mul_u4f12::v2#2 mul_u4f12::v2#3 mul_u4f12::v2#0 mul16u::b#0 ]
zp ZP_WORD:12 [ sin16s_gen::sinx#10 sin16s_gen::sinx#14 sin16s_gen::sinx#1 sin16s_gen::usinx#0 print_sword::w#3 print_sword::w#1 print_sword::w#0 sin16s_gen::x5_128i#0 divr16u::return#10 divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 divr16u::return#2 divr16u::return#3 sin16s_gen::stepf#0 divr16u::return#4 ]
zp ZP_WORD:14 [ line_cursor#13 line_cursor#25 line_cursor#1 ]
zp ZP_WORD:16 [ print_word::w#8 print_word::w#1 print_word::w#2 print_word::w#12 print_word::w#5 print_word::w#6 print_word::w#7 print_word::w#4 print_str::str#8 print_str::str#10 print_str::str#0 divr16u::divisor#8 ]
zp ZP_DWORD:2 [ sin16s_gen::x#10 sin16s_gen::x#1 print_dword::dw#0 ]
zp ZP_WORD:6 [ sin16s_gen::sintab#10 sin16s_gen::sintab#1 divr16u::divisor#6 print_cls::sc#2 print_cls::sc#1 ]
zp ZP_WORD:8 [ sin16s_gen::i#10 sin16s_gen::i#1 divr16u::rem#5 divr16u::rem#10 divr16u::rem#4 divr16u::rem#11 divr16u::rem#6 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 rem16u#1 ]
reg byte x [ sin16s_gen::isUpper#10 ]
zp ZP_WORD:10 [ sin16s_gen::x1#11 sin16s_gen::x1#10 sin16s_gen::x1#0 sin16s_gen::x1#1 sin16s_gen::x1#2 mul_u4f12::v2#4 mul_u4f12::v2#1 mul_u4f12::v2#2 mul_u4f12::v2#3 mul_u4f12::v2#0 divr16u::dividend#3 divr16u::dividend#5 divr16u::dividend#0 ]
zp ZP_WORD:12 [ sin16s_gen::sinx#10 sin16s_gen::sinx#14 sin16s_gen::sinx#1 sin16s_gen::usinx#0 print_sword::w#3 print_sword::w#1 print_sword::w#0 sin16s_gen::$19 mul16u::b#3 mul16u::b#2 divr16u::quotient#3 divr16u::return#0 divr16u::quotient#1 divr16u::quotient#2 divr16u::return#2 divr16u::return#3 sin16s_gen::stepf#0 ]
zp ZP_WORD:14 [ line_cursor#11 line_cursor#23 line_cursor#1 sin16s_gen::stepi#0 ]
zp ZP_WORD:16 [ print_word::w#7 print_word::w#1 print_word::w#2 print_word::w#11 print_word::w#4 print_word::w#5 print_word::w#6 print_word::w#3 print_str::str#6 print_str::str#8 print_str::str#0 mul16u::a#4 mul16u::a#7 mul16u::a#3 mul16u::a#1 mul16u::a#2 mul16u::a#0 mul_u4f12::v1#4 mul_u4f12::v1#1 mul_u4f12::v1#2 mul_u4f12::v1#3 mul_u4f12::v1#0 sin16s_gen::x2#0 mul_u4f12::return#0 sin16s_gen::x4#0 mul_u4f12::return#2 mul_u4f12::return#10 mul_u4f12::return#1 mul_u4f12::return#3 ]
reg byte x [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ]
reg byte a [ print_char::ch#3 print_char::ch#1 print_char::ch#2 ]
zp ZP_WORD:18 [ char_cursor#97 char_cursor#128 char_cursor#60 char_cursor#92 char_cursor#90 char_cursor#88 char_cursor#2 char_cursor#17 char_cursor#122 char_cursor#1 divr16u::rem#7 divr16u::rem#12 divr16u::rem#4 divr16u::rem#11 divr16u::rem#10 divr16u::rem#0 divr16u::rem#1 divr16u::rem#2 rem16u#1 ]
zp ZP_WORD:20 [ divr16u::dividend#5 divr16u::dividend#7 divr16u::dividend#3 divr16u::dividend#4 divr16u::dividend#0 ]
zp ZP_WORD:18 [ char_cursor#54 char_cursor#80 char_cursor#78 char_cursor#76 char_cursor#2 char_cursor#17 char_cursor#82 char_cursor#102 char_cursor#1 ]
zp ZP_DWORD:20 [ mul16u::res#2 mul16u::res#6 mul16u::res#1 mul16u::return#2 sin16s_gen::$15 mul16u::return#3 sin16s_gen::$17 mul16u::return#4 mul_u4f12::$0 mul_u4f12::$1 ]
zp ZP_DWORD:24 [ mul16u::mb#2 mul16u::mb#0 mul16u::mb#1 ]
reg byte x [ divr16u::i#2 divr16u::i#1 ]
zp ZP_WORD:22 [ mul_u4f12::v1#4 mul_u4f12::v1#1 mul_u4f12::v1#2 mul_u4f12::v1#3 mul_u4f12::v1#0 mul16u::a#2 mul16u::a#1 mul16u::a#0 sin16s_gen::x2#0 mul_u4f12::return#0 sin16s_gen::x4#0 mul_u4f12::return#2 mul_u4f12::return#10 mul_u4f12::return#1 mul_u4f12::return#3 sin16s_gen::x5#0 ]
zp ZP_DWORD:24 [ mul16u::res#2 mul16u::res#6 mul16u::res#1 mul16u::return#2 mul_u4f12::$0 mul_u4f12::$1 ]
zp ZP_DWORD:28 [ mul16u::mb#2 mul16u::mb#0 mul16u::mb#1 ]
zp ZP_DWORD:32 [ sin16s_gen::step#0 ]
zp ZP_WORD:36 [ sin16s_gen::x3#0 ]
zp ZP_WORD:38 [ sin16s_gen::x3_6i#0 sin16s_gen::$21 ]
zp ZP_DWORD:28 [ sin16s_gen::step#0 ]
zp ZP_WORD:32 [ sin16s_gen::x3#0 sin16s_gen::x3_6#0 ]
zp ZP_WORD:34 [ sin16s_gen::x5#0 sin16s_gen::x5_128#0 ]
reg byte a [ print_byte::$0 ]
reg byte a [ print_byte::$2 ]
reg byte a [ mul16u::$1 ]
reg byte a [ divr16u::$1 ]
reg byte a [ divr16u::$2 ]
reg byte a [ mul16u::$1 ]