]> 4ch.mooo.com Git - 16.git/blob - 16/scrasm/PALETTE.INC
16_ca needs huge amounts of work and I should remember what needs to be done soon...
[16.git] / 16 / scrasm / PALETTE.INC
1 ;; Palette operations\r
2 ;; Note that where needed in the macros, a "palette" refers to\r
3 ;; the segment handle to a 768-byte piece of memory.  So palettes\r
4 ;; can be loaded and freed, they're not permanent, but if you want\r
5 ;; to use a fixed (not allocated) palette you'd better make sure\r
6 ;; it's segment aligned or else you can't use these macros.  If it\r
7 ;; is, you can just supply "seg myPalette" as the 'palette' argument\r
8 ;; to any of these macros.\r
9 \r
10 ;; Fade from a palette to black\r
11 FADE_OFF        MACRO   fade,palette\r
12                 mov     si,0\r
13                 mov     ds,palette\r
14                 mov     bh,fade         ; positive -> Gets dimmer...\r
15                 mov     bl,0            ; Starts exact\r
16                 mov     cx,64/fade+1    ; Total number of loops required\r
17                 call    FadePalette\r
18                 ENDM\r
19 \r
20 ;; Fade from black to a palette\r
21 FADE_ON         MACRO   fade,palette\r
22                 mov     si,0\r
23                 mov     ds,palette\r
24                 mov     bh,-fade        ; negative -> Gets brighter...\r
25                 mov     bl,64           ; Starts totally dimmed\r
26                 mov     cx,64/fade+1    ; Total number of loops required\r
27                 call    FadePalette\r
28                 ENDM\r
29 \r
30 ;; Flash from a palette to white\r
31 FLASH_OFF       MACRO   fade,palette\r
32                 mov     si,0\r
33                 mov     ds,palette\r
34                 mov     bh,-fade        ; negative -> gets brighter\r
35                 mov     bl,0            ; Starts exact\r
36                 mov     cx,64/fade+1    ; Total number of loops required\r
37                 call    FadePalette\r
38                 ENDM\r
39 \r
40 ;; Flash from white to a palette\r
41 FLASH_ON        MACRO   fade,palette\r
42                 mov     si,0\r
43                 mov     ds,palette\r
44                 mov     bh,fade         ; positive -> Gets dimmer...\r
45                 mov     bl,-64          ; Starts totally bright\r
46                 mov     cx,64/fade+1    ; Total number of loops required\r
47                 call    FadePalette\r
48                 ENDM\r
49 \r
50 ;; Save a palette into a palette-sized piece of memory\r
51 PAL_SAVE        MACRO   palette\r
52                 mov     es,palette\r
53                 mov     di,0\r
54                 call    SavePalette\r
55                 ENDM\r
56 \r
57 ; Returns AX = a new segment for a palette\r
58 NEW_PAL         MACRO   palette\r
59                 mov     bx,(256 * 3) / 16\r
60                 mov     ah,48h\r
61                 int     21h\r
62                 mov     palette,ax\r
63                 ENDM\r
64 \r
65 ;; Black the entire palette temporarily.  Used to blank the screen while\r
66 ;; drawing a frame before fading in.\r
67 PAL_BLACK       MACRO\r
68                 mov     ax,seg tmppal\r
69                 mov     ds,ax\r
70                 mov     si,OFFSET tmppal\r
71                 mov     bh,-1           ; Doesn't really matter...\r
72                 mov     bl,64           ; Starts totally dimmed\r
73                 mov     cx,1            ; Just one time -- to leave it black\r
74                 call    FadePalette\r
75                 ENDM\r
76 \r
77 ;; drawing a frame before fading in.\r
78 PAL_WHITE       MACRO\r
79                 mov     ax,seg tmppal\r
80                 mov     ds,ax\r
81                 mov     si,OFFSET tmppal\r
82                 mov     bh,-1           ; Doesn't really matter...\r
83                 mov     bl,-64          ; Starts totally dimmed\r
84                 mov     cx,1            ; Just one time -- to leave it black\r
85                 call    FadePalette\r
86                 ENDM\r
87 \r
88 ;; Black the entire palette temporarily.  Used to blank the screen while\r
89 ;; drawing a frame before fading in.\r
90 PAL_UPDATE      MACRO\r
91                 mov     cx,0            ; 0 times = update\r
92                 call    FadePalette\r
93                 ENDM\r
94 \r
95 WAITBORDER      MACRO\r
96                 LOCAL   wbr1,wbr2\r
97                 mov     dx,INPUT_STATUS_1\r
98 wbr1:           in      al,dx\r
99                 test    al,8\r
100                 jnz     wbr1\r
101 wbr2:           in      al,dx\r
102                 test    al,8\r
103                 jz      wbr2\r
104                 ENDM\r
105 \r
106 ;; Fade Palette:\r
107 ;; The following code is modified greatly from the Future Crew's palette\r
108 ;; fading code.  Works on blocks of 256 colors only, so far, but I might\r
109 ;; change it later.  Also, it theoretically could "anti-fade" -- fade to\r
110 ;; white -- which I call flashing, so I added that ability, which was\r
111 ;; missing from FC's code.\r
112 EVEN\r
113 tmppal          DB      768 dup (?)      ; Stores old palette\r
114 FadePalette     PROC NEAR\r
115                 mov     ax,seg tmppal\r
116                 mov     es,ax\r
117 \r
118 FadeLoop:       push    cx\r
119                 push    si\r
120 \r
121                 cmp     cx,0\r
122                 je      JustUpdate\r
123 \r
124         ; Load in the colors in the palette\r
125                 mov     di,OFFSET tmppal ; ES:DI -> temp palette\r
126                 mov     cx,768          ; Reads 256*3 bytes at a time.\r
127 loadpal_loop:   mov     al,ds:[si]      ; Load one color byte\r
128                 inc     si\r
129                 sub     al,bl           ; Subtract the fade amount\r
130                 jge     pal_more        ; Limit the range by clipping\r
131                 xor     al,al           ;  to between 0 and 63\r
132                 jmp     pal_ok          ; (there's probably a faster\r
133 pal_more:       cmp     al,63           ; way to do it than this,\r
134                 jle     pal_ok          ; but I don't know it)\r
135                 mov     al,63\r
136 pal_ok:         mov     es:[di],al      ; Store that byte in the new\r
137                 inc     di\r
138                 dec     cx              ;  temp palette and loop.\r
139                 jnz     loadpal_loop\r
140 \r
141         ; Get ready to move this block of palette values\r
142 JustUpdate:     sti                     ; Let interrupts happen now,\r
143                 WAITBORDER              ;  while waiting for a retrace,\r
144                 cli                     ;  instead of more critical times\r
145 \r
146                 mov     dx,PEL_WRITE_REG; Set up to write to color register,\r
147                 xor     al,al           ; starting at palette entry 0.\r
148                 out     dx,al\r
149                 mov     dx,PEL_DATA_REG ; Point at color port\r
150 \r
151         ; Quickly put out the first half of the color palette\r
152                 mov     di,OFFSET tmppal\r
153                 mov     cl,(768/6)/2    ; Does 2 loops of 128 colors each.\r
154                 cli                     ;  Waits a retrace inbetween...\r
155 FirstHalfLoop:  REPEAT 6                ; Steps of 6 -- reduces the\r
156                 mov     al,es:[di]      ; number of LOOP instructions\r
157                 inc     di\r
158                 out     dx,al\r
159                 ENDM\r
160                 dec     cl\r
161                 jnz     FirstHalfLoop\r
162                 sti\r
163 \r
164                 WAITBORDER              ; Waits one retrace -- less flicker\r
165                 mov     dx,PEL_DATA_REG ; Reset DX\r
166 \r
167         ; Now, quickly put out the other half of the colors.\r
168                 mov     cl,(768/6)/2\r
169                 cli\r
170 SecondHalfLoop: REPEAT 6                ; Steps of 6 -- reduces the\r
171                 mov     al,es:[di]      ; number of LOOP instructions\r
172                 inc     di\r
173                 out     dx,al\r
174                 ENDM\r
175                 dec     cl\r
176                 jnz     SecondHalfLoop\r
177 \r
178         ; For the next iteration, restore everything and loop\r
179                 pop     si\r
180                 pop     cx\r
181 \r
182                 cmp     cx,0\r
183                 je      JustUpdated\r
184 \r
185                 add     bl,bh           ; Change brightness by BH\r
186 \r
187                 dec     cx\r
188                 jnz     FadeLoop\r
189 \r
190         ; All done, re-enable interrupts and return\r
191 JustUpdated:    sti\r
192                 ret\r
193 FadePalette     ENDP\r
194 \r
195 ;; Saves the palette into the memory pointed at by DS:SI.  That memory\r
196 ;; must be at least 768 bytes long...\r
197 SavePalette     PROC NEAR\r
198                 mov     dx,PEL_READ_REG ; Set up to read from color register,\r
199                 xor     al,al           ; starting at palette entry 0.\r
200                 out     dx,al\r
201                 mov     dx,PEL_DATA_REG\r
202 \r
203         ; Quickly read in the first half of the color palette\r
204                 mov     cl,(768/6)\r
205                 cli\r
206 ReadPalLoop:    REPEAT 6                ; Steps of 6 -- reduces the\r
207                 in      al,dx           ; number of LOOP instructions\r
208                 mov     es:[di],al\r
209                 inc     di\r
210                 ENDM\r
211                 dec     cl\r
212                 jnz     ReadPalLoop\r
213         ; All done, re-enable interrupts and return\r
214                 sti\r
215                 ret\r
216 SavePalette     ENDP\r
217 \r
218 ;; Load a palette from a file.  Opens the file and reads it into\r
219 ;; memory (standard LoadFile) and then points the palette at that\r
220 ;; newly allocated memory.  Also, frees old memory before it does\r
221 ;; any loading ...\r
222 LoadPaletteFile PROC    near\r
223                 mov     ax,segPalette\r
224                 cmp     ax,-1\r
225                 je      pal_not_loaded\r
226                 mov     es,ax\r
227                 mov     ah,49h\r
228                 int     21h\r
229                 mov     nError,ERR_MEM\r
230                 jc      lp_err\r
231                 mov     segPalette,-1\r
232 \r
233 pal_not_loaded: call    LoadFile\r
234                 jc      lp_err\r
235 \r
236                 mov     segPalette,dx\r
237 lp_err:         ret\r
238 LoadPaletteFile ENDP\r
239 \1a