Z80 divide by 2

Welcome, Guest. Please login or register. Did you miss your activation email? October 10, Challenge Trophies Won:. You can mul or div by powers of 2 using shifts. But if you want 'real' division then either: a don't do division.

Think of a different algorithm. Yeah that is one complicated display mode alright with the bitmap memory starting sequentially then going off down a different street. Im still trying to figure out how to store pixels to the bottom half of the screen with no success I can appreciate that things were very limited in those days but they could have hired a monkey to come up with a better solution.

Exactly why are there gaps in the display memory is just beyond me and I have been tippy-toe-ing around the issue hoping that things will eventually make sense.

Code: [Select]. The Spectrum manual suggests thinking about the address in base 8. See if that helps. Stonemonkey Pentium Posts: Karma: As for how to shift the pixels for drawing a bitmap sprite or something to the screen I can't think of anything yet. EDIT: still not sure if that's right. Any routine should execute at the same speed no matter where it's called from, what might make a difference is how the data the routine needs gets into the right place before the routine is called.

I don't know but I doubt there's any fixed point routines other than for dealing with integers and floating point calculations will probably be pretty slow compared to some well written fixed point routines. You're joking! The floating point number representation wasn't IEEE, they had some cheeky short cuts, but yup, it didn't help the speed Jim. SMF 2.Of course, good programmers know that shifting right and left will multiply or divide by a power of two.

Sometimes you can work it out for multiplication. For example, multiplying by 10 is common when dealing with conversion between binary and decimal. But division is a different problem. The other day a friend showed me a very convoluted snippet of code on Stack Overflow by user [realtime] that divides a number by 10 and wanted to know how it worked. If you are in assembly doing one shift at a time, you can often save a little time by combining the two shifts:.

But it does work. The secret to understanding this is to treat each shift as taking a fraction of the number. Look at the first working line:. Of course, this is the same as multiplying by 0.

Subscribe to RSS

So if our goal is to divide by 10 it may be easier to think of it as multiplying by 0. To fit well with powers of two, we really want to think about multiply the whole thing by 0. So adding one right shift to two right shifts gets us 0.

The next line adds a little bit more to our 0. How much more? That equates to 0. Getting closer to 0. Each term adds a little bit less and gets us a little bit closer. The book explains how to figure out the optimal shifts and adds and gives several other examples. There are also many other division tricks in that chapter.

If you like this sort of thing, have a look at the bit twiddling hacks page. If your division dreams tend to floating point, you might find this interesting. Also can be faster, too, depending on what you expect the range to be. Welcome once again to the poorly defined world of C arithmetic and why we should all give up on this stupid language.

You use the C shifting operators, so a C assumption seems reasonable as far as the arithmetic rules, or lack of them. Stupid language? So what is better in your mind then Python perhaps? Dare to guess what Python was written in? Yes, that method can work just fine for some cases. You can also just use a general purpose division subroutine. Clearly this post is about needing it to be fast. General purpose subroutines offer some trade between space and speed.

The routine here is a speed corner, the one I gave is a space corner.

z80 divide by 2

They both take 4 cycles. Not enough to make me want to use it.

Homebrew Z80 Computer (Part 4)

If you think 4 cycles is bad, try doing without them. So it did indeed help! However, since it is not exact, the remainder can be larger. If this happens, it means q was too small, so this is why it's adjusted by 1.Division in z80 assembly. Xeda Expert Posts: But guess what? They are usually a variation on long division that you learned in school, but modified for binary.

In my experience, math in binary is so much easier and faster than in base 10, so here is an example. It is, so you subtract to get It is, so you subtract to get 1. It is, so you subtract to get 0. It isn't, so you put a zero up top.

Z80 Programming Lesson 4: Stack, Strings,IFDEF ,IX IY, CPC Call

Since A was multiplied by 2, the last bit would be zero. KermMartian Site Admin Posts: This is a great explanation, Xeda; you get a serious gold star. I've been using Z80 Bits' routines for ages, which as you know use this method. Thanks for sharing this with us! There have been several people asking how the algorithm works, so I thought I might try to explain it In my spare time, I am developing a document that goes in depth on every aspect of z80 assembly coding that I can think about.

Only pieces of it will be released, I am sure, but division has yet to make it in there. I couldn't think of a clear way to explain it before, but I will probably use this. That is 11b, which is 3. That is the number that I was dividing by. First you use 1, the first digit, then 10, the first 2 digits, thenthe first 3 digits, then suddenly But where does the come from?

Because I subtract the 11 fromgiving me Rotate in the next bit, a 0, and you get The topic of fixed point division was brought up in SAX. In decimal, if we divide Basically: In a normal bit division algorithm, you will have "ld b,16" and loop the algorithm 16 times.

However, since you want extra precision after the decimal, in this case, 8 extra bitswe would just loop it 8 more times. Essentially, change "ld b,16" to "ld b,24". Normally, this will remove the top 8 bits of the integer part, so you will need to be careful of that. Please correct me if I am wrong as I've never actually implemented this myself I am worried about doing something like dividing by.The successor to the Great Z80 Computer project.

The new Z80 computer is much simplified in comparison to the original, but in many cases borrows ideas and circuits from it. When it is working I will be able to extend it as time permits. The display memory is a 32K static memory. At that time dynamic RAM offered a greater capacity and was faster, at least, for the memory available to me the poor hobbyist. Now very fast static RAM are available. In the text mode, the 64 columns by 32 rows use only 2K of the memory, so I divide the 32K up into 16 selectable screens.

Alternatively the CPU could use this memory for data storage if necessary. For even greater simplicity I should have restricted it to 32K. So like an idiot I got the K chips. Later I remembered that since the Z80 can only address 64K of memory directly, I would have to mess around with memory banking. Either that, or only use part of the memory capacity but that would be untolerably wasteful. I had previously used the same chip in my viscometer project. Unfortunately the only one I could get was in a tiny surface mount package.

To connect this chip, I cut a piece of plain no copper strips, I never use those 0. Using 0.

Binary Math Tricks: Shifting To Divide By Ten Ain’t Easy

I took a piece of household flex and extracted some of the fine copper strands. Some of them I threaded over the board, some under.

z80 divide by 2

Some I threaded through pieces of the insulation from the 0. This keeps them all apart so there are no short circuits. I glued the chip to the board using superglue. Then using my very best Surface Mount Technology Assembly robot ahem I painstakingly soldered the wires to the tiny pins on the chip. It took me about 4 hours to complete this assembly.

Pictured to the right is the final result, stuck in foil-covered polystyrene.Please enable JavaScript on your browser to best view this site. The next step is to implement a faster and more accurate clock signal. The most common way of generating a clock signal is by using a crystal oscillator.

Kernel video repair 20 3 crack

These contain a piezoelectric material that is tuned to resonate at a specific frequency, and are the main component in a quartz crystal oscillator XO circuit. It is possible to buy these as a complete circuit in a four-pin package.

Muddy msanii jina langu mp3

I decided to use a two-pin crystal oscillator, partly because four-pin oscillators of the required frequency are expensive, and partly to familiarise myself with oscillator circuits. These are exactly double the required frequency, so the plan will be to divide the frequency by 2 for the TMS video chip clock, and divide again for the Z80, giving me a respectable 5.

I ended up on this pageand decided to try to build a series resonant oscillator circuit. When I tested this on the scope, by measuring the signal on Pin 8 of the 74LS04, I felt quite chuffed; there was a waveform on the screen. I think it is an amplifier with feedback, and the logic gates are there to be the amplifier, and square the sine waves.

The third logic gate on the output is a buffer, to isolate to some extent the output from the amplifier. It was suggested on Twitter that the load capacitance value was probably too low, and that is was only working due to the parasitic capacitance of the breadboard.

The input is connected to the final output of the 74LS04, and provides two additional clock frequencies. The divided clock signal can be divided again by 2 by feeding it 2Q into the other half of the flip-flop. Before I connected the TMS, I needed to sort out the fast clock speed noted at the beginning of this article.

The fix proved to be fairly straightforward; increasing the value of the load capacitor to 22pF until it started resonating at the correct frequency. I think the designers expected a To drive these from this circuit, I need to connect a The TMS divides its input clock frequency down by 3 internally, and outputs a 3. I will probably use this clock signal to drive the Z80, with an option to boost up to 5.

Discord helper renderer cpu

However, the much faster clock rate proved too much for the STM32; it was unable to drive the data bus at that speed, so was outputting gibberish over the USB serial. I may still connect the serial comms via the STM32 as a interim step, as it is useful for power, and drives the built-in LCD display.

And it may come in handy for handling other peripherals such as keyboards. Clocks The most common way of generating a clock signal is by using a crystal oscillator. The frequencies I require are: However, on closer analysis, the frequency measured was too high, over By using our site, you acknowledge that you have read and understand our Cookie PolicyPrivacy Policyand our Terms of Service.

Retrocomputing Stack Exchange is a question and answer site for vintage-computer hobbyists interested in restoring, preserving, and using the classic computer and gaming systems of yesteryear.

It only takes a minute to sign up. I've recently been teaching my 11 year old binary multiplication, which is on the UK maths syllabus at secondary school. We have used long multiplication, eg shift and add.

Was it done by shifting the multiplicand by each bit of the multiplier and adding, or by repeated addition of the larger number? Was it optimised for efficiency or size? I ask about Z80 for simplicity, but if you know more about orI imagine there were similar strategies.

For Spectrum BASIC, the routine for Small Integers 16 bit can be seen on page of the Complete ZX Spectrum ROM Disassembly, where it loops over the sixteen bits of one operand, shifting them into the carry bit, adding successively doubling values to the result value each time the test passes, and testing for overflow if the result doesn't fit in a small integer. For larger floating point numbers which the result is promoted to if the multiplication result overflows a small integer, or if either operand is already floating pointthe full five byte floating point multiplication routine follows on page Multiplying and dividing by powers of 2 has always been trivial and fast even for 8-bit processors like Z80 orwith shifting instructions commonly arithmetic shift left aka ASL.

But those processors didn't have a MUL instruction so when it came to non-power of 2 multiplication, it always involved shifting, testing bit and adding shifted result if bit is set, exactly like we do manually in base 10, if I may say.

So in the ROM, when one piece of coded needed to multiply by 2 or 4 or whatever, it used explicit ASLROL or whatever shifting instruction available, even when a generic shift-and-add multiply routine was available. Sometimes when the number to multiply with was known, a special routine was used, like in the oric atmos ROM, when the ROM needed to multiply by 40 which is the number of bytes per row.

For other cases, it used the generic multiply routine. As you see, multiplying by a known number such as 40 is already a long, time consuming routine.

The generic integer routine takes even more cycles. Games didn't call ROM multiply directly but often defined their own when they needed it, with the same principle. L'Aigle d'Or has one for instance. When I converted the game to C, I "optimized" it by using multiplication. To be perfectly honest and transparent, I didn't find the generic integer multiply routine in the Oric ROM and I'm not going to find it since it probably only exists as floating point that one can be found.

The most common way to do a general multiplication is the "shift and add" method, where for each bit set in the multiplier you add the multiplicand to the high portion of the result and then shift the result right. Lance Leventhal's Assembly Language Subroutines includes, on pagea bit multiply routine that does this.

Probably the most important thing to understand while reading this is that on the the ROR rotate right instruction shifts the lowest-order bit into the carry flag, and the carry flag into the highest order bit. Thus, the BCC branch on carry clear instruction determines whether the multiplier bit currently being processed requires the multiplicand to be added to the result.Best Soccer Predictions Tips For 4th November 20. Best Soccer Predictions Tips For 3rd November 20. Best Soccer Predictions Tips For 2nd November 20.

Best Soccer Predictions Tips For 1st November 20. Theme images by Petrovich9. There have been ups and downs along the way but overall we tend to come out on top. Great customer service too, very helpful. Thank you in advance. Our predictions are calculated using stats and our unique algorithm. For every league we give percentage predictions for home wins, draws and visitors wins. Unlike other tips and prediction sites we also provide actual score predictions.

The information contained in cheza254. Premium Tips Top Leagues England Spain Germany Italy France Netherlands Portugal Turkey Russia Belgium Polen Czech Republic Scotland Romania Austria Hungary Ukraine Sweden Norway Greece All Leagues WORLD CUP 2018 Champions League EUROPA LEAGUE Albania 1 England 1 England 2 England 3 England 4 England 5 Argentina Argentina 2 Armenia Australia Belgium 1 Belgium 2 Belorussia Bosnia Bulgaria Brazil 1 Brazil 2 Montenegro Czech Republic 1 Czech Republic 2 China Denmark 1 Denmark 2 Egypt Ecuador Estonia Faroe Islands 1 Finland 1 Finland 2 France 1 France 2 France 3 Georgia Chile Croatia 1 Croatia 2 Iran 1 Rep.

Ireland 2 Iceland Italy 1 Italy 2 Israel Japan 1 Japan 2 South Africa Canada Kazakhstan Kenya Columbia Korea Cyprus Lithuania Latvia Hungary Macedonia Mexico Moldova Germany 1 Germany 2 Germany 3 Germany 4N Germany 4S Germany 4W Germany 4B Germany 4O Netherlands 1 Netherlands 2 Norway 1 Norway 2 Paraguay Peru Polen 1 Polen 2 Portugal 1 Portugal 2 Austria 1 Austria 2 Greece Greece 2 Romania Russia 1 Russia 2 Northern Ireland Singapore Scotland 1 Scotland 2 Scotland 3 Scotland 4 Slovakia 1 Slovenia 1 Spain 1 Spain 2 Serbia 1 Serbia 2 Sweden 1 Sweden 2 Switzerland 1 Switzerland 2 Turkey Turkey 2 Ukraine Ukraine 2 Uruguay United States Venezuela Wales Germany Bundesliga 09-12 Borussia M.

FC Union Berlin vs 1. Its based solely on mathematical algorithm.

z80 divide by 2

Sports can be unpredictable and there is no magical formula either. Click here to start. Professional sports betting predictions. ROMANIA: Viitorul Constanta-CFR Cluj, Bet: Viitorul Constanta -1 AH Odds: 1,67 draw Become a premium member today.

z80 divide by 2

SCOTLAND: Aberden-Celtic, Bet: 2 FT Odds: 1,78 Become a premium member today. EUROPE: Manchester United-Celta Vigo, Bet: 1 FT Odds: 1,55 Become a premium member today. Sports predictions for MLB, basketball, tennis and football Home Members Tips Premium Tips Buy premium E-sports Predictions Free Tip Forum Blog My Account Home Members TipsPremium Tips Buy premium E-sports Predictions Free Tip Forum Blog My Account Free daily sports prediction.

Online assessment test for jobs

Daily free football pick. Recent Posts Professional CS:GO e-sports betting tips Affiliate tips Free daily sports prediction. Recent CommentsJames mwangi on If you are new to sports bettingElitasaru on Free daily sports prediction. Tipster on Why you should buy sports betting predictions. If you are under 18 please leave the website.

thoughts on “Z80 divide by 2

Leave a Reply

Your email address will not be published. Required fields are marked *