]> 4ch.mooo.com Git - 16.git/blob - 16/scrasm/MAP.INC
i did a butt load of tweaking to the paltest code and i did verious fixes here and...
[16.git] / 16 / scrasm / MAP.INC
1 ;; MAP in own segment allows map of tiles to be up to 65536 tiles in area\r
2 ;; which translates to about 16.8 million pixels of virtual screen.  This\r
3 ;; can be represented in almost any rectangle -- just set MAP_WIDTH.\r
4 \r
5 ;; Sorry this code isn't commented -- I was working on it right up until\r
6 ;; the point that I released this.  You have any questions?  Ask away\r
7 ;; (my internet address is in the DOC file).\r
8 \r
9 MAPHEADER       STRUCT, NONUNIQUE\r
10                 MapName BYTE    "\ 1\ 1\ 1\ 1\ 1\ 1\ 1\ 1\ 1\ 1\ 1\ 1"\r
11                 Wid     WORD    2\r
12                 Ht      WORD    3\r
13                 Extent  WORD    4\r
14                 OffX1   WORD    5\r
15                 OffY1   WORD    6\r
16                 OffX2   WORD    7\r
17                 OffY2   WORD    8\r
18                 WrapX   WORD    9\r
19                 WrapY   WORD    10\r
20                 Magic   WORD    11\r
21 MAPHEADER       ENDS\r
22 MapInfo         MAPHEADER <>\r
23 \r
24 \r
25 ; In: DS:DX = offset of filename\r
26 LoadMapFile     PROC    near\r
27                 mov     ax,segMap\r
28                 cmp     ax,-1\r
29                 je      map_not_loaded\r
30                 sub     ax,(SIZEOF MAPHEADER) / 16\r
31                 mov     es,ax\r
32                 mov     ah,49h\r
33                 int     21h\r
34                 mov     nError,ERR_MEM\r
35                 jc      lm_err\r
36                 mov     segMap,-1\r
37 \r
38 map_not_loaded: call    LoadFile\r
39                 jc      lm_err\r
40 \r
41                 mov     ds,dx\r
42                 mov     si,0\r
43                 mov     ax,cs\r
44                 mov     es,ax\r
45                 lea     di,MapInfo\r
46                 mov     cx,(SIZEOF MAPHEADER) / 4\r
47             rep movsd\r
48 \r
49                 add     dx,(SIZEOF MAPHEADER) / 16\r
50                 mov     cs:segMap,dx\r
51 \r
52                 mov     BlankPage.Valid,0\r
53                 mov     ShowPage.Valid,0\r
54                 mov     DrawPage.Valid,0\r
55 \r
56                 mov     upper_left,0\r
57                 mov     ScrollPosX,0\r
58                 mov     ScrollPosY,0\r
59                 mov     ScrollDX,0\r
60                 mov     ScrollDY,0\r
61 \r
62 lm_err:         ret\r
63 LoadMapFile     ENDP\r
64 \r
65 LoadTilesFile   PROC    near\r
66                 mov     ax,segTiles\r
67                 cmp     ax,-1\r
68                 je      tiles_not_loaded\r
69                 mov     es,ax\r
70                 mov     ah,49h\r
71                 int     21h\r
72                 mov     nError,ERR_MEM\r
73                 jc      lt_err\r
74                 mov     segMap,-1\r
75 \r
76 tiles_not_loaded: call    LoadFile\r
77                 jc      lm_err\r
78                 mov     segTiles,dx\r
79 \r
80                 mov     BlankPage.Valid,0\r
81                 mov     ShowPage.Valid,0\r
82                 mov     DrawPage.Valid,0\r
83 \r
84 lt_err:         ret\r
85 LoadTilesFile   ENDP\r
86 \r
87 EVEN\r
88 LoadData        PROC    near\r
89         ; Load squares from data file\r
90                 mov     bx,nMap\r
91                 shl     bx,1\r
92                 mov     dx,fntblTiles[bx]\r
93                 mov     ds,segCode\r
94                 call    LoadTilesFile\r
95                 ; returns Carry if error\r
96                 jc      load_error\r
97 \r
98         ; Load map from data file\r
99                 mov     ds,segCode\r
100                 mov     bx,nMap\r
101                 shl     bx,1\r
102                 mov     dx,fntblMap[bx]\r
103                 call    LoadMapFile\r
104                 ; returns Carry if error\r
105 \r
106 load_error:     ret\r
107 LoadData        ENDP\r
108 \r
109 EVEN\r
110 update_full     PROC\r
111                 mov     ds,segTiles\r
112                 mov     es,segVideo\r
113                 mov     fs,segMap\r
114 \r
115                 mov     dx,SC_INDEX\r
116                 mov     al,MAP_MASK\r
117                 out     dx,al\r
118 \r
119                 mov     di,DrawPage.Address\r
120                 add     di,upper_left\r
121                 mov     bp,MapInfo.OffX1\r
122                 add     bp,MapInfo.OffY1\r
123 \r
124                 mov     dx,MapInfo.WrapX\r
125 \r
126                 mov     ch,(VIRTUAL_WIDTH/SQUARE_WIDTH)\r
127 draw_full_loop: push    cx\r
128                 push    si\r
129                 push    dx\r
130 \r
131                 mov     al,11h\r
132                 mov     si,0\r
133 \r
134 update_f_loop:  mov     dx,SC_INDEX + 1\r
135                 out     dx,al\r
136                 push    bp\r
137                 call    draw_col\r
138                 pop     bp\r
139                 sub     di,(VIRTUAL_WIDTH * VIRTUAL_HEIGHT) / 4\r
140                 add     si,(SQUARE_WIDTH * SQUARE_HEIGHT) / 4\r
141                 shl     al,1\r
142                 jnc     update_f_loop\r
143 \r
144                 pop     dx\r
145                 dec     dx\r
146                 jnz     update_f_go_on\r
147                 mov     dx,MapInfo.Wid\r
148                 sub     bp,dx\r
149 update_f_go_on: inc     bp\r
150                 pop     si\r
151                 add     di,(SQUARE_WIDTH/ 4)\r
152                 pop     cx\r
153                 dec     ch\r
154                 jnz     draw_full_loop\r
155 \r
156 \r
157 \r
158 \r
159 \r
160 \r
161 \r
162 \r
163 \r
164 \r
165 \r
166                 mov     dx,GC_INDEX\r
167                 mov     ax,ALL_COPY_BITS\r
168                 out     dx,ax\r
169 \r
170                 mov     dx,SC_INDEX\r
171                 mov     ax,0F02h\r
172                 out     dx,ax\r
173 \r
174                 mov     ds,segVideo\r
175                 mov     si,DrawPage.Address\r
176                 add     si,upper_left\r
177                 mov     es,segVideo\r
178                 mov     di,BlankPage.Address\r
179                 add     di,upper_left\r
180                 mov     cx,(VIRTUAL_WIDTH * VIRTUAL_HEIGHT) / 4\r
181             rep movsb\r
182                 mov     si,DrawPage.Address\r
183                 add     si,upper_left\r
184                 mov     di,ShowPage.Address\r
185                 add     di,upper_left\r
186                 mov     cx,(VIRTUAL_WIDTH * VIRTUAL_HEIGHT) / 4\r
187             rep movsb\r
188 \r
189                 mov     dx,GC_INDEX\r
190                 mov     ax,ALL_DRAW_BITS\r
191                 out     dx,ax\r
192 \r
193                 ret\r
194 update_full     ENDP\r
195 \r
196 EVEN\r
197 update_left     PROC\r
198                 mov     ds,cs:segTiles\r
199                 mov     es,cs:segVideo\r
200                 mov     fs,cs:segMap\r
201 \r
202                 mov     dx,SC_INDEX\r
203                 mov     al,MAP_MASK\r
204                 out     dx,al\r
205 \r
206                 mov     al,011h\r
207                 mov     si,0\r
208                 mov     di,cs:DrawPage.Address\r
209                 add     di,cs:upper_left        ; becomes DI later\r
210                 mov     bp,MapInfo.OffX1\r
211                 add     bp,MapInfo.OffY1\r
212 \r
213 update_l_loop:  mov     dx,SC_INDEX + 1\r
214                 out     dx,al\r
215                 push    bp\r
216                 call    draw_col\r
217                 pop     bp\r
218                 sub     di,(VIRTUAL_WIDTH * VIRTUAL_HEIGHT) / 4\r
219                 add     si,(SQUARE_WIDTH * SQUARE_HEIGHT) / 4\r
220                 shl     al,1\r
221                 jnc     update_l_loop\r
222 \r
223                 ret\r
224 update_left     ENDP\r
225 \r
226 EVEN\r
227 update_right    PROC    near\r
228                 mov     ds,cs:segTiles\r
229                 mov     es,cs:segVideo\r
230                 mov     fs,cs:segMap\r
231 \r
232                 mov     dx,SC_INDEX\r
233                 mov     al,MAP_MASK\r
234                 out     dx,al\r
235 \r
236                 mov     bp,MapInfo.OffX2\r
237                 add     bp,MapInfo.OffY1\r
238 \r
239                 mov     al,011h\r
240                 mov     si,0\r
241 \r
242                 mov     di,cs:DrawPage.Address  ; becomes DI\r
243                 add     di,cs:upper_left\r
244                 add     di,(VIRTUAL_WIDTH - SQUARE_WIDTH) / 4\r
245 \r
246 update_r_loop:  mov     dx,SC_INDEX + 1\r
247                 out     dx,al\r
248 \r
249                 push    bp\r
250                 call    draw_col\r
251                 pop     bp\r
252                 sub     di,(VIRTUAL_WIDTH * VIRTUAL_HEIGHT) / 4\r
253                 add     si,(SQUARE_WIDTH * SQUARE_HEIGHT) / 4\r
254                 shl     al,1\r
255                 jnc     update_r_loop\r
256 \r
257                 ret\r
258 update_right    ENDP\r
259 \r
260 EVEN\r
261 update_top      PROC\r
262                 mov     ds,cs:segTiles\r
263                 mov     es,cs:segVideo\r
264                 mov     fs,cs:segMap\r
265 \r
266                 mov     dx,SC_INDEX\r
267                 mov     al,MAP_MASK\r
268                 out     dx,al\r
269 \r
270                 mov     di,cs:DrawPage.Address\r
271                 add     di,cs:upper_left\r
272                 mov     bp,MapInfo.OffX1\r
273                 add     bp,MapInfo.OffY1\r
274 \r
275                 mov     al,011h\r
276                 mov     si,0\r
277 \r
278 update_top_loop:\r
279                 mov     dx,SC_INDEX + 1\r
280                 out     dx,al\r
281                 push    bp\r
282                 call    draw_row\r
283                 pop     bp\r
284                 sub     di,VIRTUAL_WIDTH / 4\r
285                 add     si,(SQUARE_WIDTH * SQUARE_HEIGHT) / 4\r
286                 shl     al,1\r
287                 jnc     update_top_loop\r
288 \r
289                 ret\r
290 update_top      ENDP\r
291 \r
292 EVEN\r
293 update_bottom   PROC\r
294                 mov     ds,cs:segTiles\r
295                 mov     es,cs:segVideo\r
296                 mov     fs,cs:segMap\r
297 \r
298                 mov     dx,SC_INDEX\r
299                 mov     al,MAP_MASK\r
300                 out     dx,al\r
301 \r
302                 mov     di,cs:DrawPage.Address\r
303                 add     di,cs:upper_left\r
304                 add     di,(VIRTUAL_WIDTH * (VIRTUAL_HEIGHT - SQUARE_HEIGHT)) / 4\r
305                 mov     bp,MapInfo.OffX1\r
306                 add     bp,MapInfo.OffY2\r
307 \r
308                 mov     al,011h\r
309                 mov     si,0\r
310 \r
311 update_bottom_loop:\r
312                 mov     dx,SC_INDEX + 1\r
313                 out     dx,al\r
314                 push    bp\r
315                 call    draw_row\r
316                 pop     bp\r
317                 sub     di,VIRTUAL_WIDTH / 4\r
318                 add     si,(SQUARE_WIDTH * SQUARE_HEIGHT) / 4\r
319                 shl     al,1\r
320                 jnc     update_bottom_loop\r
321 \r
322                 ret\r
323 update_bottom   ENDP\r
324 \r
325 ; Draws ONE plane of a single col\r
326 EVEN\r
327 draw_col        PROC    near\r
328         ; DI->upper left corner of col to draw\r
329         ; BP->col of map to draw\r
330         ; SI used to point at tiles\r
331         ; AX,CX used\r
332         ; BX used to push SI\r
333         ; DX unused\r
334                 shl     eax,16  ; save it\r
335                 mov     ax,MapInfo.WrapY\r
336 \r
337                 mov     cl,(VIRTUAL_HEIGHT / SQUARE_HEIGHT)\r
338 do_col_loop:    mov     bx,si\r
339                 mov     bh,byte ptr fs:[bp]     ; change tile #\r
340 \r
341                 mov     ch,SQUARE_HEIGHT\r
342 do_col_sq_loop: mov     dl,byte ptr ds:[bx+2]\r
343                 mov     dh,byte ptr ds:[bx+3]\r
344                 shl     edx,16\r
345                 mov     dl,byte ptr ds:[bx+0]\r
346                 mov     dh,byte ptr ds:[bx+1]\r
347                 mov     es:[di],edx     ; 32-bit write\r
348                 add     di,VIRTUAL_WIDTH / 4\r
349                 add     bx,4\r
350                 dec     ch\r
351                 jnz     do_col_sq_loop\r
352 \r
353                 add     bp,MapInfo.Wid\r
354                 dec     ax\r
355                 jnz     yayaya\r
356                 mov     ax,MapInfo.Ht\r
357                 sub     bp,MapInfo.Extent\r
358 yayaya:\r
359 \r
360                 dec     cl\r
361                 jnz     do_col_loop\r
362 \r
363                 shr     eax,16  ; restore it\r
364 \r
365                 ret\r
366 draw_col        ENDP\r
367 \r
368 ; Draws ONE plane of a single row\r
369 EVEN\r
370 draw_row        PROC    near\r
371                 push    ax\r
372 ;               shl     eax,16  ; save ax\r
373 \r
374                 mov     ax,MapInfo.WrapX\r
375 \r
376         ; DI->upper left corner of row to draw\r
377         ; BP->row of map to draw\r
378         ; SI used to point at tiles\r
379         ; AX,CX used\r
380         ; BX used to push SI\r
381         ; DX unused\r
382 \r
383                 mov     cl,(VIRTUAL_WIDTH / SQUARE_WIDTH)\r
384 do_row_loop:    mov     bx,si\r
385                 mov     bh,byte ptr fs:[bp]     ; change tile #\r
386 \r
387                 mov     ch,SQUARE_HEIGHT\r
388 do_row_sq_loop: mov     dl,byte ptr ds:[bx+2]\r
389                 mov     dh,byte ptr ds:[bx+3]\r
390                 shl     edx,16\r
391                 mov     dl,byte ptr ds:[bx+0]\r
392                 mov     dh,byte ptr ds:[bx+1]\r
393                 mov     es:[di],edx\r
394                 add     di,(VIRTUAL_WIDTH / 4)\r
395                 add     bx,4\r
396                 dec     ch\r
397                 jnz     do_row_sq_loop\r
398 \r
399                 add     di,(-VIRTUAL_WIDTH*SQUARE_HEIGHT + SQUARE_WIDTH) / 4\r
400                 inc     bp\r
401                 dec     ax\r
402                 jnz     yayaya2\r
403                 mov     ax,MapInfo.Wid\r
404                 sub     bp,ax\r
405 yayaya2:\r
406                 dec     cl\r
407                 jnz     do_row_loop\r
408 \r
409 ;               shr     eax,16  ; restore it\r
410                 pop     ax\r
411                 ret\r
412 draw_row        ENDP\r
413 \1a