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
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
9 MAPHEADER STRUCT, NONUNIQUE
\r
10 MapName BYTE "
\ 1\ 1\ 1\ 1\ 1\ 1\ 1\ 1\ 1\ 1\ 1\ 1"
\r
22 MapInfo MAPHEADER <>
\r
25 ; In: DS:DX = offset of filename
\r
26 LoadMapFile PROC near
\r
30 sub ax,(SIZEOF MAPHEADER) / 16
\r
38 map_not_loaded: call LoadFile
\r
46 mov cx,(SIZEOF MAPHEADER) / 4
\r
49 add dx,(SIZEOF MAPHEADER) / 16
\r
52 mov BlankPage.Valid,0
\r
53 mov ShowPage.Valid,0
\r
54 mov DrawPage.Valid,0
\r
65 LoadTilesFile PROC near
\r
76 tiles_not_loaded: call LoadFile
\r
80 mov BlankPage.Valid,0
\r
81 mov ShowPage.Valid,0
\r
82 mov DrawPage.Valid,0
\r
89 ; Load squares from data file
\r
92 mov dx,fntblTiles[bx]
\r
95 ; returns Carry if error
\r
98 ; Load map from data file
\r
102 mov dx,fntblMap[bx]
\r
104 ; returns Carry if error
\r
119 mov di,DrawPage.Address
\r
121 mov bp,MapInfo.OffX1
\r
122 add bp,MapInfo.OffY1
\r
124 mov dx,MapInfo.WrapX
\r
126 mov ch,(VIRTUAL_WIDTH/SQUARE_WIDTH)
\r
127 draw_full_loop: push cx
\r
134 update_f_loop: mov dx,SC_INDEX + 1
\r
139 sub di,(VIRTUAL_WIDTH * VIRTUAL_HEIGHT) / 4
\r
140 add si,(SQUARE_WIDTH * SQUARE_HEIGHT) / 4
\r
149 update_f_go_on: inc bp
\r
151 add di,(SQUARE_WIDTH/ 4)
\r
167 mov ax,ALL_COPY_BITS
\r
175 mov si,DrawPage.Address
\r
178 mov di,BlankPage.Address
\r
180 mov cx,(VIRTUAL_WIDTH * VIRTUAL_HEIGHT) / 4
\r
182 mov si,DrawPage.Address
\r
184 mov di,ShowPage.Address
\r
186 mov cx,(VIRTUAL_WIDTH * VIRTUAL_HEIGHT) / 4
\r
190 mov ax,ALL_DRAW_BITS
\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
213 update_l_loop: mov dx,SC_INDEX + 1
\r
218 sub di,(VIRTUAL_WIDTH * VIRTUAL_HEIGHT) / 4
\r
219 add si,(SQUARE_WIDTH * SQUARE_HEIGHT) / 4
\r
227 update_right PROC near
\r
236 mov bp,MapInfo.OffX2
\r
237 add bp,MapInfo.OffY1
\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
246 update_r_loop: mov dx,SC_INDEX + 1
\r
252 sub di,(VIRTUAL_WIDTH * VIRTUAL_HEIGHT) / 4
\r
253 add si,(SQUARE_WIDTH * SQUARE_HEIGHT) / 4
\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
279 mov dx,SC_INDEX + 1
\r
284 sub di,VIRTUAL_WIDTH / 4
\r
285 add si,(SQUARE_WIDTH * SQUARE_HEIGHT) / 4
\r
287 jnc update_top_loop
\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
311 update_bottom_loop:
\r
312 mov dx,SC_INDEX + 1
\r
317 sub di,VIRTUAL_WIDTH / 4
\r
318 add si,(SQUARE_WIDTH * SQUARE_HEIGHT) / 4
\r
320 jnc update_bottom_loop
\r
325 ; Draws ONE plane of a single col
\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
332 ; BX used to push SI
\r
334 shl eax,16 ; save it
\r
335 mov ax,MapInfo.WrapY
\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
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
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
357 sub bp,MapInfo.Extent
\r
363 shr eax,16 ; restore it
\r
368 ; Draws ONE plane of a single row
\r
372 ; shl eax,16 ; save ax
\r
374 mov ax,MapInfo.WrapX
\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
380 ; BX used to push SI
\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
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
391 mov dl,byte ptr ds:[bx+0]
\r
392 mov dh,byte ptr ds:[bx+1]
\r
394 add di,(VIRTUAL_WIDTH / 4)
\r
399 add di,(-VIRTUAL_WIDTH*SQUARE_HEIGHT + SQUARE_WIDTH) / 4
\r
409 ; shr eax,16 ; restore it
\r