It was thus said that the Great der Mouse once stated:
;assuming A[0] = MSW, and that each
"number"
;is 7 bytes long
...
movw #7,r3
clrw r6 ; clear carry over
.loop: clrw r4 ; clear tmp registers
clrw r5
movb (r0)[r3],r4 ; get unsigned byte into signed word
movb (r1)[r3],r5
mulw r4,r5 ; do signed multiplication
addw r6,r5 ; add in previous "carry over"
movb r5,(r2)[r3] ; save result
rotl -8,r5,r6 ; save "carry over"
bitcw #00FF,r6 ; make sure "carry over" is between 0 - 255
sobgeq r3,.loop ; loop
* The comment says 7 bytes long; the code actually does 8 (7..0)
You're right---I wanted 8 bytes, but wrote 7.
* Why not use movzbw instead of clrw-and-movb?
Because I didn't know about it. I never really *did* any VAX assembly
programming, but I do have a book on it, and I really like the instruction
set.
* It's canonically bicw, not bitcw.
Ah.
* You need bicw #ff00,r6, not #00ff.
Oh ... it *clears* bits in the destination that are set in the source.
* movzbw r6,r6 does what your bi[t]cw tries to, and is
shorter.
Ah.
* If you'd store the numbevrs little-endian, the
VAX way, instead of
big-endian, you could do it much more cheaply with emul - especially
if you do use a multiple of 4 bytes.
Well, I was trying to show how to do it if the MUL instruction was only
signed in nature and you wanted to do an unsigned multiply of multi-byte
values (remember, the target is a PDP-11).
Get's
around the fact that the MUL instruction is signed only, even
though the longer number is unsigned.
Provided you have integer overflow traps turned off, the difference
doesn't matter; the only difference between signed and unsigned
multiply is what constitutes arithmetic overflow.
Um ... no ... you're right. I think.
[ rest snipped ]
-spc (Is it obvious I never programmed assembly on a VAX? 8-/