Thanks for all the replies, I really had a mental block over this and no amount of reading the Wikipedia articles helped at all..
Just to mention a couple of things. I started on this a long time ago, which is why it isn't SIMH. I guess one day I will re-visit doing it in SIMH. Bob's point about "was it an exact algorithm" prompted me to read the Pegasus Maintenance Manuals, which are on Bitsavers here:- ftp://bitsavers.informatik.uni-stuttgart.de/pdf/ferranti/pegasus/Pegasus_Maint_Vol2_May56.pdf which I now find describes in great detail the repeated subtraction process in great detail. It is an exact algorithm and its very similar to the one below, so I think I am now good to go. (any one else reading this a "Staticisor" is basically a latch or register) If you want to see how I progress I will be recording progress on my "hackaday.io" projects page. https://hackaday.io/projects/hacker/99268 Dave G4GM > -----Original Message----- > From: Simh [mailto:simh-boun...@trailing-edge.com] On Behalf Of Bob Supnik > Sent: 11 June 2016 02:53 > To: simh@trailing-edge.com > Subject: Re: [Simh] Ferranti Pegasus Simulator > > There are any number of strange-length divide algorithms in SimH. Here is the > PDP-10 code for dividing a 70b unsigned integer by a 35b > (unsigned) integer. > > // dvd[0:1] = 70b dividend, high order first (35b in each word) // dvr = 35b > divisor // rs[0:1] = quotient remainder // all variables (except i) are > unsigned > 64b > > for (i = 0, rs[0] = 0; i < 35; i++) { /* 35 quotient > bits */ > dvd[0] = (dvd[0] << 1) | ((dvd[1] >> 34) & 1); > dvd[1] = (dvd[1] << 1) & MMASK; /* shift > dividend and mask */ > rs[0] = rs[0] << 1; /* shift > quotient */ > if (dvd[0] >= dvr) { /* subtract > work? */ > dvd[0] = dvd[0] - dvr; /* quo bit is 1 */ > rs[0] = rs[0] + 1; > } > } > rs[1] = dvd[0]; /* store > remainder */ > > It's easy enough to see how to expand this to a computer with 39b in each word > of dvd - just increase the loop count from 35 to 39, increase the shift count > in > the second line from 34 to 38, and define MMASK to be > 39 bits of 1s. > > In general, it's simplest to implement this sort of multi-precision divide > unsigned. Simply calculate the sign of the quotient and dividend before > starting > (quo sign = dividend sign XOR divisor sign; rem sign = dividend sign), then > take > the absolute value of dividend and divisor before running the bit-by-bit > loop; fix > up the signs of quotient and remainder when done. > > This assumes that the Ferranti did a precise divide. That's not necessarily > the > case. The IBM 7094 approximated double precision floating divide with a two > term Taylor-series expansion... > > I hope the available Pegasus documentation provides sufficient detail on how > divide was actually implemented. > > /Bob > > On 6/10/2016 8:15 PM, simh-requ...@trailing-edge.com wrote: > > ---------------------------------------------------------------------- > > > > Message: 1 > > Date: Sat, 11 Jun 2016 00:46:02 +0100 > > From: "Dave Wade"<dave.g4...@gmail.com> To:<simh@trailing- > edge.com> > > Subject: [Simh] Ferranti Pegasus Simulator > > Message-ID:<002401d1c372$3fc331e0$bf4995a0$@gmail.com> > > Content-Type: text/plain; charset="utf-8" > > > > Whilst its not a SIMH simulator, I hope you can help. I want to write > > an emulator for the Pegasus. The Ferranti Pegasus was (there are none > > operating at present) a strange beast with two 18-bit instructions per > > 39-bit > word. > > Generally, it does 39-bit twos complement arithmetic. The multiply > > results in a 77-bit result which I have no problems implementing. > > > > Where I am struggling is with the divide. I need to be able to divide > > a 77-bit number by a 39-bit number and get a 39 bit quotient and a 39 > > bit remainder. As the compiler I am using only does 64-bit numbers > > this is proving challenging. Any one got a good article on how to do this? > > > > Dave Wade > > G4UGM > > _______________________________________________ > Simh mailing list > Simh@trailing-edge.com > http://mailman.trailing-edge.com/mailman/listinfo/simh _______________________________________________ Simh mailing list Simh@trailing-edge.com http://mailman.trailing-edge.com/mailman/listinfo/simh