+++ /dev/null
-;-----------------------------------------------------------\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