File 2DROTATE.ZIP from The Programmer’s Corner in
Category Assembly Language
2-D rotate routines – ASM.
File Name File Size Zip Size Zip Type
BWPRINT.ASM 2156 519 deflated
BWPRINT.OBJ 479 372 deflated
INFO.VLA 848 442 deflated
MAKE.BAT 474 241 deflated
ROTATE.ASM 10787 3502 deflated
ROTATE.EXE 1892 972 deflated
ROTATE.MAP 232 134 deflated
ROTATE.OBJ 1571 1126 deflated
ROTATE.TXT 4360 1753 deflated
SINCOS.DW 1974 523 deflated

## Contents of the ROTATE.TXT file

;
; TITLE: 2d rotate text file
;WRITTEN BY: DRAEDEN
; DATE: 02/13/93
;
; NOTES: None.
;
;ASSOCIATED FILES:
;
; BWPRINT.ASM => Displays signed and unsigned bytes, words, or
; > double words
;
; SINCOS.DW => Contains data for the sine and cosine operations
;
; ROTATE.ASM => The asm file.
;
; MAKE.BAT => The file that'll put it all together into an .EXE
;

Rotating a point around (0,0):

Rotating an object is really easier than it sounds. There is just a
simple formula for it, which is:

Xt = X*COS() - Y*SIN()
Yt = X*SIN() + Y*COS()

If you don't think this works, try a few values. For at instance = 0,

Xt = X*1 - Y*0 = X
Yt = X*0 + Y*1 = Y

And at = 90,

Xt = X*0 - Y*1 = -Y
Yt = X*1 + Y*0 = X

Both of which work. Also note that the rotation is counter-clockwise.
If you wanted it to rotate clockwise in stead, the formula would be:

Xt = X*COS() + Y*SIN()
Yt =-X*SIN() + Y*COS()

Or you could just negate the angle.

Now, if you wanted to rotate in 3 demensions (I hope this is obvious),
you would need 3 angles which I call Xan, Yan, and Zan. The formula would
be the same as above, but done 3 times.

1st, rotate on the X axis

Y = Y*COS(Xan) - Z*SIN(Xan)
Z = Y*SIN(Xan) + Z*COS(Xan)

Next, rotate on the Y axis

X = X*COS(Yan) - Z*SIN(Yan)
Z = X*SIN(Yan) + Z*COS(Yan)

And finally, the Z axis

Xt = X*COS(Zan) - Y*SIN(Zan)
Yt = X*SIN(Zan) + Y*COS(Zan)

You should notice that the order in which you rotate the object DOES
matter. To see the how, grab a disk and rotate it 90 along the X axis,
90 along the Y axis, and then 90 on the Z axis. Now try the rotations in
a different order. Different results, eh?

And now an explaination of SINCOS.DW

SinCos.dw is a file which contians the sine of the 'angles' 0-255. I
used 256 angles because it is very convienent, and there just happens to
be a data structure that has a range of 0-255. It's called a BYTE, denoted
by 'DB'.
The bit of code (in BASIC) that would generate this sort of chart is:

FOR i = 0 TO 255
an = i*2*pi/256
BYTE = INT( SIN( an )*256 +.5)
>> Store BYTE in a file <<
NEXT i

Modifying the basic rotation formula for our data file would yield:

Xt = (X*COS() - Y*SIN()) /256
Yt = (X*SIN() + Y*COS()) /256

If you know your hexadecimal, you'd realise that dividing by 256 is
simply a "SAR XXX,8", where XXX is what you're dividing by 256.

I expanded this into assembler, that not only works, but is very fast.
To see it, examine the RotateXY procedure.

BWPRINT.ASM

This file is just a little utility I put together many many years ago.
Ok, maybe not years, but It seems that long. I wrote it when I first got a
386. No more CAVEMAN computer! Oh well. The basic functions are:

PrintByte, PrintWord, and PrintBig.

They do this:

PrintByte: decodes a byte (in AL) and displays it as 3 digits plus a
an optional sign. If the carry is clear, it prints it as an
unsigned integer. If the carry is set, it prints it signed.

EXAMPLE:
mov al,-50
stc
call PrintByte

PrintWord: decodes and prints a WORD (in AX) in 5 digits.

EXAMPLE:
mov ax,50000
clc
call PrintWord

PrintBig: decodes and prints a DOUBLEWORD (in EAX) in 10 digits.
NOTE: PrintBig requires a 386 to use.

EXAMPLE:
mov eax,-1234567890
stc
call PrintBig

Well, that's it for now. See INFO.VLA for information on contacting us.

December 6, 2017