]> 4ch.mooo.com Git - 16.git/blob - 16/xw/mxrp.asm
16_ca needs huge amounts of work and I should remember what needs to be done soon...
[16.git] / 16 / xw / mxrp.asm
1 ;-----------------------------------------------------------\r
2 ;\r
3 ; MXRP.ASM - Rotate palette function\r
4 ; Copyright (c) 1994 by Alessandro Scotti\r
5 ;\r
6 ;-----------------------------------------------------------\r
7 WARN    PRO\r
8 INCLUDE MODEX.DEF\r
9 \r
10 PUBLIC  mxRotatePalette\r
11 \r
12 MX_TEXT         SEGMENT USE16 PARA PUBLIC 'CODE'\r
13                 ASSUME cs:MX_TEXT, ds:NOTHING, es:NOTHING\r
14 \r
15 ;-----------------------------------------------------------\r
16 ;\r
17 ; Rotates the palette of the specified number of colors.\r
18 ;\r
19 ; Input:\r
20 ;       Palette = pointer to palette\r
21 ;       Count   = number of colors to rotate\r
22 ;       Step    = step size\r
23 ; Output:\r
24 ;       none\r
25 ;\r
26 ; Note: if Step is positive palette is rotated left to right, otherwise\r
27 ;       right to left.\r
28 ;\r
29 mxRotatePalette PROC    FAR\r
30         ARG     Step:WORD,      \\r
31                 Count:WORD,     \\r
32                 Palette:DWORD   = ARG_SIZE\r
33         LOCAL   Holder:BYTE:768 = AUTO_SIZE\r
34         ASSUME  ds:NOTHING\r
35         .enter  AUTO_SIZE\r
36         .push   ds, si, es, di\r
37 \r
38         mov     bx, [Count]\r
39         add     bx, bx\r
40         add     bx, [Count]             ; BX = Count*3\r
41 \r
42         lds     si, [Palette]           ; DS:SI -> palette\r
43         push    ss\r
44         pop     es\r
45         lea     di, Holder              ; ES:DI -> local space\r
46         cld\r
47 \r
48         mov     ax, [Step]\r
49         mov     dx, ax\r
50         test    ax, ax\r
51         jz      @@Exit                  ; Nothing to do, exit\r
52         jl      @@RightToLeft\r
53 \r
54 @@LeftToRight:\r
55         add     ax, ax\r
56         add     dx, ax                  ; DX = Step*3\r
57         sub     bx, dx                  ; BX = (Count-Step)*3\r
58         add     si, bx\r
59         push    si\r
60         mov     cx, dx\r
61         rep     movsb\r
62         mov     es, WORD PTR Palette[2]\r
63         mov     di, si\r
64         dec     di                      ; ES:DI -> last byte of palette\r
65         pop     si\r
66         dec     si\r
67         mov     cx, bx\r
68         std\r
69         rep     movsb\r
70         push    ss\r
71         pop     ds\r
72         lea     si, Holder\r
73         les     di, [Palette]\r
74         mov     cx, dx\r
75         cld\r
76         rep     movsb\r
77         jmp     @@Exit\r
78 \r
79 @@RightToLeft:\r
80         add     ax, ax\r
81         add     dx, ax\r
82         neg     dx                      ; DX = Step*3\r
83         sub     bx, dx                  ; BX = (Count-Step)*3\r
84         mov     cx, dx\r
85         rep     movsb\r
86         les     di, [Palette]\r
87         mov     cx, bx\r
88         rep     movsb\r
89         push    ss\r
90         pop     ds\r
91         lea     si, Holder\r
92         mov     cx, dx\r
93         rep     movsb\r
94 \r
95 @@Exit:\r
96         .pop    ds, si, es, di\r
97         .leave  ARG_SIZE\r
98 mxRotatePalette ENDP\r
99 \r
100 MX_TEXT         ENDS\r
101 END\r