+;-----------------------------------------------------------\r
+;\r
+; MXRP.ASM - Rotate palette function\r
+; Copyright (c) 1994 by Alessandro Scotti\r
+;\r
+;-----------------------------------------------------------\r
+WARN PRO\r
+INCLUDE MODEX.DEF\r
+\r
+PUBLIC mxRotatePalette\r
+\r
+MX_TEXT SEGMENT USE16 PARA PUBLIC 'CODE'\r
+ ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING\r
+\r
+;-----------------------------------------------------------\r
+;\r
+; Rotates the palette of the specified number of colors.\r
+;\r
+; Input:\r
+; Palette = pointer to palette\r
+; Count = number of colors to rotate\r
+; Step = step size\r
+; Output:\r
+; none\r
+;\r
+; Note: if Step is positive palette is rotated left to right, otherwise\r
+; right to left.\r
+;\r
+mxRotatePalette PROC FAR\r
+ ARG Step:WORD, \\r
+ Count:WORD, \\r
+ Palette:DWORD = ARG_SIZE\r
+ LOCAL Holder:BYTE:768 = AUTO_SIZE\r
+ ASSUME ds:NOTHING\r
+ .enter AUTO_SIZE\r
+ .push ds, si, es, di\r
+\r
+ mov bx, [Count]\r
+ add bx, bx\r
+ add bx, [Count] ; BX = Count*3\r
+\r
+ lds si, [Palette] ; DS:SI -> palette\r
+ push ss\r
+ pop es\r
+ lea di, Holder ; ES:DI -> local space\r
+ cld\r
+\r
+ mov ax, [Step]\r
+ mov dx, ax\r
+ test ax, ax\r
+ jz @@Exit ; Nothing to do, exit\r
+ jl @@RightToLeft\r
+\r
+@@LeftToRight:\r
+ add ax, ax\r
+ add dx, ax ; DX = Step*3\r
+ sub bx, dx ; BX = (Count-Step)*3\r
+ add si, bx\r
+ push si\r
+ mov cx, dx\r
+ rep movsb\r
+ mov es, WORD PTR Palette[2]\r
+ mov di, si\r
+ dec di ; ES:DI -> last byte of palette\r
+ pop si\r
+ dec si\r
+ mov cx, bx\r
+ std\r
+ rep movsb\r
+ push ss\r
+ pop ds\r
+ lea si, Holder\r
+ les di, [Palette]\r
+ mov cx, dx\r
+ cld\r
+ rep movsb\r
+ jmp @@Exit\r
+\r
+@@RightToLeft:\r
+ add ax, ax\r
+ add dx, ax\r
+ neg dx ; DX = Step*3\r
+ sub bx, dx ; BX = (Count-Step)*3\r
+ mov cx, dx\r
+ rep movsb\r
+ les di, [Palette]\r
+ mov cx, bx\r
+ rep movsb\r
+ push ss\r
+ pop ds\r
+ lea si, Holder\r
+ mov cx, dx\r
+ rep movsb\r
+\r
+@@Exit:\r
+ .pop ds, si, es, di\r
+ .leave ARG_SIZE\r
+mxRotatePalette ENDP\r
+\r
+MX_TEXT ENDS\r
+END\r