﻿ Bit Math
23 May, 2013, 02:34:12
 OmnomIRC You must Register, be logged in and have at least 40 posts to use this shout-box! If it still doesn't show up afterward, it might be that OmnomIRC is disabled for your group or under maintenance.Note: You can also use an IRC client like mIRC, X-Chat or Mibbit to connect to an EFnet server and #omnimaga.

 Pages: [1]   Go Down
 Author Topic: Bit Math -  (Read 392 times) 0 Members and 1 Guest are viewing this topic.
ACagliano

Offline

Last Login: 14 May, 2013, 13:02:38
Date Registered: 03 July, 2009, 01:06:06
Posts: 764

Topic starter
Total Post Ratings: +29

 « on: 29 April, 2012, 18:19:12 » 0

Just wondering.... Is this the correct way to Multiply numbers, using bit shifting. Modify as needed. And how would you do division?

 12345678910111213 ld c,a\$: rl a rr b jr c, +\$ jz nz, -\$\$: or c push af ld a,b or b ret z pop af jr -2\$;Your next command, upon returning, should be pop af.
 Logged

-ACagliano
TI-Basic software developer

My Website

Current Projects
----------------------------
1. Legend of Zelda "Revenge of Ganon"
-maps: 100%
-graphics engine: 20% (sprites)
-AI engine: 0%
-event scripts: 60% (text left)
-walking engine: 100%
-miscellaneous: 40%
-total progress:  54%

Xeda112358
Xombie. I am it.
Coder Of Tomorrow
LV12 Extreme Poster (Next: 5000)

Online

Date Registered: 31 October, 2010, 08:46:36
Location: Land of Little Cubes and Tea, NY
Posts: 3759

Total Post Ratings: +609

 « Reply #1 on: 29 April, 2012, 18:35:12 » 0

Hmm, it doesn't look quite right if you are trying to multiply registers. I don't know if this will help you?
 1234567891011121314151617181920 D_Times_E:;Inputs:;     D and E are factors;Outputs:;     A is the product (lower 8 bits);     B is 0;     C,DE, HL are not changed;Size:  12 bytes;Speed: 304+b cycles where b is the number of set bits in E     xor a         ;This is an optimised way to set A to zero. 4 cycles, 1 byte.     ld b,8        ;Number of bits in E, so number of times we will cycle throughLoop:     add a,a       ;We double A, so we shift it left.     rlc e         ;We want the next bit in E, so it is shifted into the c flag     jr nc,\$+3     ;If it is 0, we don't need to add anything to A       add a,d     ;Since it was 1, we do A+1*D     djnz Loop     ;Decrements B, if it isn't zero yet, jump back to Loop:     ret
Basically, this works like regular multiplication that you would do by hand. Since the above code is using 8-bit registers, there are 8 digits per number. Since bits are only 1 or 0, we only have to multiply by one or zero. Then we just add the result to the accumulator. When we get ready to add the next multiplication, we need to shift the accumulator left. In Decimal, we do this by multiplying by ten (tacking on a zero at the end). In binary, we multiply by 2. I hope this helps?

As for division, the algorithm is actually very similar and uses long division like you learned in grade school, except with binary. Say you have 37/5. In binary, you are doing:

00100101/101.

so you shift the 00100101 and move the overflow into another register. Pretend I have done this 5 times already:
0000010010100000
Now you see, the overflow is not greater than 5, so shift once more:
0000100101000000
Now it is, so we get tricky. First, subtract five from the overflow and increment the other number by 1:
0000010001000001
Now shift again:
0000100010000010
Now it is greater than 5 again, so:
0000001110000011
Shift again:
00000011100000110
00000001000000111

Now look at that o_O You have the remainder as 2 and the division is 7. Note that in all, there were 8 shifts. I hope this helps! If you want a division code, feel free to ask
 « Last Edit: 29 April, 2012, 18:39:48 by Xeda112358 » Logged

Latest update (possibly incomplete)
My pastebin
Spoiler for FileSyst:
FileSyst is an application that provides a folder and filesystem for the TI-83+/84+ calculators. It is designed to be easy to access and use in BASIC, and it can be used to access game files and save data, or to create a command prompt, among other things:

Spoiler for Graphiti:
This is a graph explorer for graph theory. It will require lots of work to finish. Currently you can:
Add edges (direction not shown, but they are directed)
Arrange vertices in a circle (in the future, you will be able to define levels of rings and the number of nodes in each)
Create complete graphs quickly

Plans:
Deleting edges
Multiple graphs support
Arrows for directed graphs
Planarity testing
Matrix operations
Weighted edges
Chromatic polynomials
Chromatic numbers

Spoiler for Stats:

Samocal             [o---------]
Virtual Processor   [o---------]
EnG                 [oo--------]
Grammer             [ooo-------]
AsmComp             [ooo-------]
Partex              [oooo------]
BatLib              [oooooooo--]
Grammer82           [----------]
Grammer68000        [----------]

Pseudonyms:  Zeda, Xeda, Thunderbolt
Languages:   English, français
Programming: z80 Assmebly
Grammer
TI-BASIC (83/84/+/SE, 89/89t/92)
Known For:   -Creator of the Grammer programming language
(Winning program of zContest2011)
-BatLib- One of the most feature packed libraries for BASIC programmers available
with over 100 functions and a simple programming language
-Learning to program z80 in hexadecimal before using an assembler (no computer was
available!)
╔═╦╗░╠═╬╣▒║ ║║▓╚═╩╝█

ACagliano

Offline

Last Login: 14 May, 2013, 13:02:38
Date Registered: 03 July, 2009, 01:06:06
Posts: 764

Topic starter
Total Post Ratings: +29

 « Reply #2 on: 29 April, 2012, 18:56:14 » 0

Oh, and so to do 2-byte multiplication, you can simply change the counter to 16, and then the input registers to 16-bit ones?

and yeah, the division routine would be great.
 Logged

-ACagliano
TI-Basic software developer

My Website

Current Projects
----------------------------
1. Legend of Zelda "Revenge of Ganon"
-maps: 100%
-graphics engine: 20% (sprites)
-AI engine: 0%
-event scripts: 60% (text left)
-walking engine: 100%
-miscellaneous: 40%
-total progress:  54%

Runer112
LV10 31337 u53r (Next: 2000)

Offline

Gender:
Date Registered: 02 July, 2009, 06:38:05
Posts: 1680

Total Post Ratings: +493

 « Reply #3 on: 29 April, 2012, 18:59:17 » 0

For most of your z80 math routine needs, Z80 Bits is an excellent resource. It has a variety of multiplication, division, square root, and other z80 routines.
 « Last Edit: 29 April, 2012, 18:59:56 by Runer112 » Logged
calc84maniac
Epic z80 roflpwner
Coder Of Tomorrow
LV11 Super Veteran (Next: 3000)

Offline

Gender:
Last Login: 20 May, 2013, 21:27:24
Date Registered: 28 August, 2008, 05:09:05
Location: Right behind you.
Posts: 2735

Total Post Ratings: +373

 « Reply #4 on: 29 April, 2012, 19:08:46 » 0

Also, for future reference, it's a very bad idea to return after pushing something to the stack, since the processor will use the pushed value as the return address. So pushing af, returning, and popping af won't act like you think it will.
 Logged

"Most people ask, 'What does a thing do?' Hackers ask, 'What can I make it do?'" - Pablos Holman
Xeda112358
Xombie. I am it.
Coder Of Tomorrow
LV12 Extreme Poster (Next: 5000)

Online

Date Registered: 31 October, 2010, 08:46:36
Location: Land of Little Cubes and Tea, NY
Posts: 3759

Total Post Ratings: +609

 « Reply #5 on: 29 April, 2012, 19:36:44 » 0

Yes, Z80 Bits does indeed have some useful routines in there to look at

Oh, and so to do 2-byte multiplication, you can simply change the counter to 16, and then the input registers to 16-bit ones?

and yeah, the division routine would be great.
Yep Just remember, though, that 16-bit arithmetic sometimes takes a bit more work. For example, shifting HL left is as simple as add hl,hl, but shifting DE left, there is no add de,de instruction. So you have to do something like sla e \ rl d which is 3 bytes larger.

As for division, here is a routine:
 1234567891011121314151617181920212223 HL_Div_C:;Inputs:;     HL is the numerator;     C is the denominator;Outputs:;     A is the remainder;     B is 0;     C is not changed;     DE is not changed;     HL is the quotient;       ld b,16       xor aLoop:         add hl,hl         rla         cp c         jr c,\$+4           inc l           sub c         djnz Loop       ret
Luckily, division is pretty simple compared to multiplication. DEHL/C is much easier than DEHL*C.
 « Last Edit: 29 April, 2012, 19:37:50 by Xeda112358 » Logged

Latest update (possibly incomplete)
My pastebin
Spoiler for FileSyst:
FileSyst is an application that provides a folder and filesystem for the TI-83+/84+ calculators. It is designed to be easy to access and use in BASIC, and it can be used to access game files and save data, or to create a command prompt, among other things:

Spoiler for Graphiti:
This is a graph explorer for graph theory. It will require lots of work to finish. Currently you can:
Add edges (direction not shown, but they are directed)
Arrange vertices in a circle (in the future, you will be able to define levels of rings and the number of nodes in each)
Create complete graphs quickly

Plans:
Deleting edges
Multiple graphs support
Arrows for directed graphs
Planarity testing
Matrix operations
Weighted edges
Chromatic polynomials
Chromatic numbers

Spoiler for Stats:

Samocal             [o---------]
Virtual Processor   [o---------]
EnG                 [oo--------]
Grammer             [ooo-------]
AsmComp             [ooo-------]
Partex              [oooo------]
BatLib              [oooooooo--]
Grammer82           [----------]
Grammer68000        [----------]

Pseudonyms:  Zeda, Xeda, Thunderbolt
Languages:   English, français
Programming: z80 Assmebly
Grammer
TI-BASIC (83/84/+/SE, 89/89t/92)
Known For:   -Creator of the Grammer programming language
(Winning program of zContest2011)
-BatLib- One of the most feature packed libraries for BASIC programmers available
with over 100 functions and a simple programming language
-Learning to program z80 in hexadecimal before using an assembler (no computer was
available!)
╔═╦╗░╠═╬╣▒║ ║║▓╚═╩╝█

 Pages: [1]   Go Up