]> 4ch.mooo.com Git - 16.git/blobdiff - 16/x_/mxrp.asm
refresh wwww
[16.git] / 16 / x_ / mxrp.asm
diff --git a/16/x_/mxrp.asm b/16/x_/mxrp.asm
new file mode 100755 (executable)
index 0000000..de820c1
--- /dev/null
@@ -0,0 +1,101 @@
+;-----------------------------------------------------------\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