Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Not so much a bug, as slow!
#2
Okay. Fairly convinced there's a bug here.

zxb version 1.3.0-S928

Here's an expanded program in full - was looking at perhaps faster squaring?

Anyway, the retruned value is weird.

A statement of: print x;" ";fastSquares(ABS x);" = ";CAST(uLong, x)*x ;"[]"

Comes back lines like

-61 3721 = 3721 [] 0 []

There's no way it should print anything after it's confirmed the function does the same thing as the X*X calculation. No [] twice. (I put that on the end because it was adding a bunch of zeroes instead without it!)

Code:
FUNCTION t() as uLong
asm
    DI
    LD DE,(23674)
    LD D,0
    LD HL,(23672)
    EI
end asm
end function


FUNCTION FASTCALL fastSquares (number as Byte) as uInteger
ASM
; Calculates (number^2) - does this by the fastest (and most size expensive) method - lookup table.
                        ; This function arrives with "number" - a byte in register A
AND A                   ; Set flags based on A
BIT 7,a                 ; Check if this is a negative number
JR Z,fastSquaresStart ; No? We jump into main routine.
NEG                     ; Negate A to make it positive.

fastSquaresStart:    
ADD A,A                 ; Think of this as A=A+A - that is it doubles the value in A (Because each entry in our table is 2 bytes long)
LD C,A                  ; LET C=A
LD B,0                  ; LET B=0
LD HL,SquaresTable  ; LET HL=address Of Table of HalfSquares.
ADD HL,BC               ; ADD the value in BC to the value in HL - means that HL is the address of the answer result.
LD A,(HL)               ; LET A=PEEK (HL)
INC HL                  ; HL=HL+1
LD L,(HL)               ; LET L=PEEK (HL)
LD H,A                  ; LET H=A
RET                     ; Return - with the answere in HL (High byte in H, Low Byte in L)

;table of (a^2)

SquaresTable:
DEFB 0,0   ;0^2=0
DEFB 0,1   ;1^2=1
DEFB 0,4   ;2^2=4
DEFB 0,9   ;3^2=9
DEFB 0,16   ;4^2=16
DEFB 0,25   ;5^2=25
DEFB 0,36   ;6^2=36
DEFB 0,49   ;7^2=49
DEFB 0,64   ;8^2=64
DEFB 0,81   ;9^2=81
DEFB 0,100   ;10^2=100
DEFB 0,121   ;11^2=121
DEFB 0,144   ;12^2=144
DEFB 0,169   ;13^2=169
DEFB 0,196   ;14^2=196
DEFB 0,225   ;15^2=225
DEFB 1,0   ;16^2=256
DEFB 1,33   ;17^2=289
DEFB 1,68   ;18^2=324
DEFB 1,105   ;19^2=361
DEFB 1,144   ;20^2=400
DEFB 1,185   ;21^2=441
DEFB 1,228   ;22^2=484
DEFB 2,17   ;23^2=529
DEFB 2,64   ;24^2=576
DEFB 2,113   ;25^2=625
DEFB 2,164   ;26^2=676
DEFB 2,217   ;27^2=729
DEFB 3,16   ;28^2=784
DEFB 3,73   ;29^2=841
DEFB 3,132   ;30^2=900
DEFB 3,193   ;31^2=961
DEFB 4,0   ;32^2=1024
DEFB 4,65   ;33^2=1089
DEFB 4,132   ;34^2=1156
DEFB 4,201   ;35^2=1225
DEFB 5,16   ;36^2=1296
DEFB 5,89   ;37^2=1369
DEFB 5,164   ;38^2=1444
DEFB 5,241   ;39^2=1521
DEFB 6,64   ;40^2=1600
DEFB 6,145   ;41^2=1681
DEFB 6,228   ;42^2=1764
DEFB 7,57   ;43^2=1849
DEFB 7,144   ;44^2=1936
DEFB 7,233   ;45^2=2025
DEFB 8,68   ;46^2=2116
DEFB 8,161   ;47^2=2209
DEFB 9,0   ;48^2=2304
DEFB 9,97   ;49^2=2401
DEFB 9,196   ;50^2=2500
DEFB 10,41   ;51^2=2601
DEFB 10,144   ;52^2=2704
DEFB 10,249   ;53^2=2809
DEFB 11,100   ;54^2=2916
DEFB 11,209   ;55^2=3025
DEFB 12,64   ;56^2=3136
DEFB 12,177   ;57^2=3249
DEFB 13,36   ;58^2=3364
DEFB 13,153   ;59^2=3481
DEFB 14,16   ;60^2=3600
DEFB 14,137   ;61^2=3721
DEFB 15,4   ;62^2=3844
DEFB 15,129   ;63^2=3969
DEFB 16,0   ;64^2=4096
DEFB 16,129   ;65^2=4225
DEFB 17,4   ;66^2=4356
DEFB 17,137   ;67^2=4489
DEFB 18,16   ;68^2=4624
DEFB 18,153   ;69^2=4761
DEFB 19,36   ;70^2=4900
DEFB 19,177   ;71^2=5041
DEFB 20,64   ;72^2=5184
DEFB 20,209   ;73^2=5329
DEFB 21,100   ;74^2=5476
DEFB 21,249   ;75^2=5625
DEFB 22,144   ;76^2=5776
DEFB 23,41   ;77^2=5929
DEFB 23,196   ;78^2=6084
DEFB 24,97   ;79^2=6241
DEFB 25,0   ;80^2=6400
DEFB 25,161   ;81^2=6561
DEFB 26,68   ;82^2=6724
DEFB 26,233   ;83^2=6889
DEFB 27,144   ;84^2=7056
DEFB 28,57   ;85^2=7225
DEFB 28,228   ;86^2=7396
DEFB 29,145   ;87^2=7569
DEFB 30,64   ;88^2=7744
DEFB 30,241   ;89^2=7921
DEFB 31,164   ;90^2=8100
DEFB 32,89   ;91^2=8281
DEFB 33,16   ;92^2=8464
DEFB 33,201   ;93^2=8649
DEFB 34,132   ;94^2=8836
DEFB 35,65   ;95^2=9025
DEFB 36,0   ;96^2=9216
DEFB 36,193   ;97^2=9409
DEFB 37,132   ;98^2=9604
DEFB 38,73   ;99^2=9801
DEFB 39,16   ;100^2=10000
DEFB 39,217   ;101^2=10201
DEFB 40,164   ;102^2=10404
DEFB 41,113   ;103^2=10609
DEFB 42,64   ;104^2=10816
DEFB 43,17   ;105^2=11025
DEFB 43,228   ;106^2=11236
DEFB 44,185   ;107^2=11449
DEFB 45,144   ;108^2=11664
DEFB 46,105   ;109^2=11881
DEFB 47,68   ;110^2=12100
DEFB 48,33   ;111^2=12321
DEFB 49,0   ;112^2=12544
DEFB 49,225   ;113^2=12769
DEFB 50,196   ;114^2=12996
DEFB 51,169   ;115^2=13225
DEFB 52,144   ;116^2=13456
DEFB 53,121   ;117^2=13689
DEFB 54,100   ;118^2=13924
DEFB 55,81   ;119^2=14161
DEFB 56,64   ;120^2=14400
DEFB 57,49   ;121^2=14641
DEFB 58,36   ;122^2=14884
DEFB 59,25   ;123^2=15129
DEFB 60,16   ;124^2=15376
DEFB 61,9   ;125^2=15625
DEFB 62,4   ;126^2=15876
DEFB 63,1   ;127^2=16129
DEFB 64,0   ;128^2=16384
DEFB 65,1   ;129^2=16641
DEFB 66,4   ;130^2=16900
DEFB 67,9   ;131^2=17161
DEFB 68,16   ;132^2=17424
DEFB 69,25   ;133^2=17689
DEFB 70,36   ;134^2=17956
DEFB 71,49   ;135^2=18225
DEFB 72,64   ;136^2=18496
DEFB 73,81   ;137^2=18769
DEFB 74,100   ;138^2=19044
DEFB 75,121   ;139^2=19321
DEFB 76,144   ;140^2=19600
DEFB 77,169   ;141^2=19881
DEFB 78,196   ;142^2=20164
DEFB 79,225   ;143^2=20449
DEFB 81,0   ;144^2=20736
DEFB 82,33   ;145^2=21025
DEFB 83,68   ;146^2=21316
DEFB 84,105   ;147^2=21609
DEFB 85,144   ;148^2=21904
DEFB 86,185   ;149^2=22201
DEFB 87,228   ;150^2=22500
DEFB 89,17   ;151^2=22801
DEFB 90,64   ;152^2=23104
DEFB 91,113   ;153^2=23409
DEFB 92,164   ;154^2=23716
DEFB 93,217   ;155^2=24025
DEFB 95,16   ;156^2=24336
DEFB 96,73   ;157^2=24649
DEFB 97,132   ;158^2=24964
DEFB 98,193   ;159^2=25281
DEFB 100,0   ;160^2=25600
DEFB 101,65   ;161^2=25921
DEFB 102,132   ;162^2=26244
DEFB 103,201   ;163^2=26569
DEFB 105,16   ;164^2=26896
DEFB 106,89   ;165^2=27225
DEFB 107,164   ;166^2=27556
DEFB 108,241   ;167^2=27889
DEFB 110,64   ;168^2=28224
DEFB 111,145   ;169^2=28561
DEFB 112,228   ;170^2=28900
DEFB 114,57   ;171^2=29241
DEFB 115,144   ;172^2=29584
DEFB 116,233   ;173^2=29929
DEFB 118,68   ;174^2=30276
DEFB 119,161   ;175^2=30625
DEFB 121,0   ;176^2=30976
DEFB 122,97   ;177^2=31329
DEFB 123,196   ;178^2=31684
DEFB 125,41   ;179^2=32041
DEFB 126,144   ;180^2=32400
DEFB 127,249   ;181^2=32761
DEFB 129,100   ;182^2=33124
DEFB 130,209   ;183^2=33489
DEFB 132,64   ;184^2=33856
DEFB 133,177   ;185^2=34225
DEFB 135,36   ;186^2=34596
DEFB 136,153   ;187^2=34969
DEFB 138,16   ;188^2=35344
DEFB 139,137   ;189^2=35721
DEFB 141,4   ;190^2=36100
DEFB 142,129   ;191^2=36481
DEFB 144,0   ;192^2=36864
DEFB 145,129   ;193^2=37249
DEFB 147,4   ;194^2=37636
DEFB 148,137   ;195^2=38025
DEFB 150,16   ;196^2=38416
DEFB 151,153   ;197^2=38809
DEFB 153,36   ;198^2=39204
DEFB 154,177   ;199^2=39601
DEFB 156,64   ;200^2=40000
DEFB 157,209   ;201^2=40401
DEFB 159,100   ;202^2=40804
DEFB 160,249   ;203^2=41209
DEFB 162,144   ;204^2=41616
DEFB 164,41   ;205^2=42025
DEFB 165,196   ;206^2=42436
DEFB 167,97   ;207^2=42849
DEFB 169,0   ;208^2=43264
DEFB 170,161   ;209^2=43681
DEFB 172,68   ;210^2=44100
DEFB 173,233   ;211^2=44521
DEFB 175,144   ;212^2=44944
DEFB 177,57   ;213^2=45369
DEFB 178,228   ;214^2=45796
DEFB 180,145   ;215^2=46225
DEFB 182,64   ;216^2=46656
DEFB 183,241   ;217^2=47089
DEFB 185,164   ;218^2=47524
DEFB 187,89   ;219^2=47961
DEFB 189,16   ;220^2=48400
DEFB 190,201   ;221^2=48841
DEFB 192,132   ;222^2=49284
DEFB 194,65   ;223^2=49729
DEFB 196,0   ;224^2=50176
DEFB 197,193   ;225^2=50625
DEFB 199,132   ;226^2=51076
DEFB 201,73   ;227^2=51529
DEFB 203,16   ;228^2=51984
DEFB 204,217   ;229^2=52441
DEFB 206,164   ;230^2=52900
DEFB 208,113   ;231^2=53361
DEFB 210,64   ;232^2=53824
DEFB 212,17   ;233^2=54289
DEFB 213,228   ;234^2=54756
DEFB 215,185   ;235^2=55225
DEFB 217,144   ;236^2=55696
DEFB 219,105   ;237^2=56169
DEFB 221,68   ;238^2=56644
DEFB 223,33   ;239^2=57121
DEFB 225,0   ;240^2=57600
DEFB 226,225   ;241^2=58081
DEFB 228,196   ;242^2=58564
DEFB 230,169   ;243^2=59049
DEFB 232,144   ;244^2=59536
DEFB 234,121   ;245^2=60025
DEFB 236,100   ;246^2=60516
DEFB 238,81   ;247^2=61009
DEFB 240,64   ;248^2=61504
DEFB 242,49   ;249^2=62001
DEFB 244,36   ;250^2=62500
DEFB 246,25   ;251^2=63001
DEFB 248,16   ;252^2=63504
DEFB 250,9   ;253^2=64009
DEFB 252,4   ;254^2=64516
DEFB 254,1   ;255^2=65025
END ASM
END FUNCTION

DIM x,y as integer
DIM time as uLONG

'time=t()
'
For x=-100 To 100
For y=-100 To 100
'If ((x<<1)-25)*((x<<1)-25)+(y-50)*(y-50)<200 Or ((x<<1)+25)*((x<<1)+25)+(y-50)*(y-50)<200 then plot x+100,96-y
'END IF
print x;" ";fastSquares(ABS x);"  =  ";CAST(uLong, x)*x ;"[]"
Next y
Next x  

'time=t()-time
'print CAST(float,time)/50
Reply


Messages In This Thread

Forum Jump:


Users browsing this thread: 2 Guest(s)