Don't have an account? Register now to chat, post, use our tools, and much more.
Latest Headlines
Online Users
There are 81 users online: 2 members, 55 guests and 24 bots. Members: Ashbad. Bots: VoilaBot (1), Spinn3r (2), VoilaBot (7), Googlebot (14).
RSS & Social Media
SAX
You must log in to view the SAX chat widget
|
| Author |
Message |
|
Xeda112358
Power User

Joined: 09 Nov 2010 Posts: 345
|
Posted: 03 Jul 2012 11:10:04 am Post subject: |
|
|
Here is another routine that I made yesterday for a pseudo-random number generator:
Code:
PseudoRandWord:
;Outputs:
; BC was the previous pseudorandom number
; HL is the pseudorandom number
;f(n+1)=(241f(n)+257) mod 65536 ;65536
;181 cycles, add 17 if called
ld hl,(randSeed)
ld c,l
ld b,h
add hl,hl
add hl,bc
add hl,hl
add hl,bc
add hl,hl
add hl,bc
add hl,hl
add hl,hl
add hl,hl
add hl,hl
add hl,bc
inc h
inc hl
ld (randSeed),hl
ret
There are a few other nice features, too. For example, every 16-bit value is hit if you run this 65536 times. Or, if you only read 1 byte (for example, H from the output), it will hit every 8-bit number once if you run this 256 times. Plus, it can be seeded  |
|
| Back to top |
|
|
Xeda112358
Power User

Joined: 09 Nov 2010 Posts: 345
|
Posted: 07 Mar 2013 05:28:50 pm Post subject: |
|
|
I was optimising some algorithms and code in Grammer and I came across a pretty big speed optimisation for computing 16-bit GCD:
Code:
GCDDE_HL:
;Inputs:
; HL,DE are the two values
;Outputs:
; B is 0
; DE is 0
; HL is the GCD
; C is not changed
; A is not changed
ld b,1
or a
CheckMax: ;
sbc hl,de ;ED52 15n
jr z,AdjustGCD ;28** 12n-5
jr nc,ParityCheck ;30** 12n-5
add hl,de
or a
ex de,hl
ParityCheck: ;
bit 0,e ;CB** 8a
jr nz,DE_Odd ;20** 12a-5b
bit 0,l ;CB** 8b
jr z,BothEven ;28** 12b-5c
rr d ;CB** 8(n-a-b-c)
rr e ;CB** 8(n-a-b-c)
jp CheckMax ;C3**** 10(n-a-b-c)
BothEven: ;
inc b ;04 4c
rr d \ rr e ; 16c
HL_Even:
rr h \ rr l ; 16c
jp CheckMax ; 10c
DE_Odd: ;
bit 0,l ; 8b
jr z,HL_Even ; 12b-5d
sbc hl,de ; 15d
rr h \ rr l ; 16d
jp nz,CheckMax ; 10d
AdjustGCD: ;
ex de,hl ; 4
dec b ; 4
ret z ; 11+4(k>0)
add hl,hl ; 11k
djnz $-1 ; 13k-5
ret ; --
I was using a slightly more naive approach before, computing the mod of two 16-bit values over and over (the Euclidean Algorithm). This code is pretty hefty, though, at 61 bytes. You can save three bytes by turning the JP instructions into JR, but there will be a tiny speed loss of a few cycles  |
|
| Back to top |
|
|
|
Register to Join the Conversation
Have your own thoughts to add to this or any other topic? Want to ask a question, offer a suggestion, share your own programs and projects, upload a file to the file archives, get help with calculator and computer programming, or simply chat with like-minded coders and tech and calculator enthusiasts via the site-wide AJAX SAX widget? Registration for a free Cemetech account only takes a minute.
» Go to Registration page
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
© Copyright 2000-2013 Cemetech & Kerm Martian :: Page Execution Time: 0.028270 seconds.
|