;; MAP in own segment allows map of tiles to be up to 65536 tiles in area ;; which translates to about 16.8 million pixels of virtual screen. This ;; can be represented in almost any rectangle -- just set MAP_WIDTH. ;; Sorry this code isn't commented -- I was working on it right up until ;; the point that I released this. You have any questions? Ask away ;; (my internet address is in the DOC file). MAPHEADER STRUCT, NONUNIQUE MapName BYTE "" Wid WORD 2 Ht WORD 3 Extent WORD 4 OffX1 WORD 5 OffY1 WORD 6 OffX2 WORD 7 OffY2 WORD 8 WrapX WORD 9 WrapY WORD 10 Magic WORD 11 MAPHEADER ENDS MapInfo MAPHEADER <> ; In: DS:DX = offset of filename LoadMapFile PROC near mov ax,segMap cmp ax,-1 je map_not_loaded sub ax,(SIZEOF MAPHEADER) / 16 mov es,ax mov ah,49h int 21h mov nError,ERR_MEM jc lm_err mov segMap,-1 map_not_loaded: call LoadFile jc lm_err mov ds,dx mov si,0 mov ax,cs mov es,ax lea di,MapInfo mov cx,(SIZEOF MAPHEADER) / 4 rep movsd add dx,(SIZEOF MAPHEADER) / 16 mov cs:segMap,dx mov BlankPage.Valid,0 mov ShowPage.Valid,0 mov DrawPage.Valid,0 mov upper_left,0 mov ScrollPosX,0 mov ScrollPosY,0 mov ScrollDX,0 mov ScrollDY,0 lm_err: ret LoadMapFile ENDP LoadTilesFile PROC near mov ax,segTiles cmp ax,-1 je tiles_not_loaded mov es,ax mov ah,49h int 21h mov nError,ERR_MEM jc lt_err mov segMap,-1 tiles_not_loaded: call LoadFile jc lm_err mov segTiles,dx mov BlankPage.Valid,0 mov ShowPage.Valid,0 mov DrawPage.Valid,0 lt_err: ret LoadTilesFile ENDP EVEN LoadData PROC near ; Load squares from data file mov bx,nMap shl bx,1 mov dx,fntblTiles[bx] mov ds,segCode call LoadTilesFile ; returns Carry if error jc load_error ; Load map from data file mov ds,segCode mov bx,nMap shl bx,1 mov dx,fntblMap[bx] call LoadMapFile ; returns Carry if error load_error: ret LoadData ENDP EVEN update_full PROC mov ds,segTiles mov es,segVideo mov fs,segMap mov dx,SC_INDEX mov al,MAP_MASK out dx,al mov di,DrawPage.Address add di,upper_left mov bp,MapInfo.OffX1 add bp,MapInfo.OffY1 mov dx,MapInfo.WrapX mov ch,(VIRTUAL_WIDTH/SQUARE_WIDTH) draw_full_loop: push cx push si push dx mov al,11h mov si,0 update_f_loop: mov dx,SC_INDEX + 1 out dx,al push bp call draw_col pop bp sub di,(VIRTUAL_WIDTH * VIRTUAL_HEIGHT) / 4 add si,(SQUARE_WIDTH * SQUARE_HEIGHT) / 4 shl al,1 jnc update_f_loop pop dx dec dx jnz update_f_go_on mov dx,MapInfo.Wid sub bp,dx update_f_go_on: inc bp pop si add di,(SQUARE_WIDTH/ 4) pop cx dec ch jnz draw_full_loop mov dx,GC_INDEX mov ax,ALL_COPY_BITS out dx,ax mov dx,SC_INDEX mov ax,0F02h out dx,ax mov ds,segVideo mov si,DrawPage.Address add si,upper_left mov es,segVideo mov di,BlankPage.Address add di,upper_left mov cx,(VIRTUAL_WIDTH * VIRTUAL_HEIGHT) / 4 rep movsb mov si,DrawPage.Address add si,upper_left mov di,ShowPage.Address add di,upper_left mov cx,(VIRTUAL_WIDTH * VIRTUAL_HEIGHT) / 4 rep movsb mov dx,GC_INDEX mov ax,ALL_DRAW_BITS out dx,ax ret update_full ENDP EVEN update_left PROC mov ds,cs:segTiles mov es,cs:segVideo mov fs,cs:segMap mov dx,SC_INDEX mov al,MAP_MASK out dx,al mov al,011h mov si,0 mov di,cs:DrawPage.Address add di,cs:upper_left ; becomes DI later mov bp,MapInfo.OffX1 add bp,MapInfo.OffY1 update_l_loop: mov dx,SC_INDEX + 1 out dx,al push bp call draw_col pop bp sub di,(VIRTUAL_WIDTH * VIRTUAL_HEIGHT) / 4 add si,(SQUARE_WIDTH * SQUARE_HEIGHT) / 4 shl al,1 jnc update_l_loop ret update_left ENDP EVEN update_right PROC near mov ds,cs:segTiles mov es,cs:segVideo mov fs,cs:segMap mov dx,SC_INDEX mov al,MAP_MASK out dx,al mov bp,MapInfo.OffX2 add bp,MapInfo.OffY1 mov al,011h mov si,0 mov di,cs:DrawPage.Address ; becomes DI add di,cs:upper_left add di,(VIRTUAL_WIDTH - SQUARE_WIDTH) / 4 update_r_loop: mov dx,SC_INDEX + 1 out dx,al push bp call draw_col pop bp sub di,(VIRTUAL_WIDTH * VIRTUAL_HEIGHT) / 4 add si,(SQUARE_WIDTH * SQUARE_HEIGHT) / 4 shl al,1 jnc update_r_loop ret update_right ENDP EVEN update_top PROC mov ds,cs:segTiles mov es,cs:segVideo mov fs,cs:segMap mov dx,SC_INDEX mov al,MAP_MASK out dx,al mov di,cs:DrawPage.Address add di,cs:upper_left mov bp,MapInfo.OffX1 add bp,MapInfo.OffY1 mov al,011h mov si,0 update_top_loop: mov dx,SC_INDEX + 1 out dx,al push bp call draw_row pop bp sub di,VIRTUAL_WIDTH / 4 add si,(SQUARE_WIDTH * SQUARE_HEIGHT) / 4 shl al,1 jnc update_top_loop ret update_top ENDP EVEN update_bottom PROC mov ds,cs:segTiles mov es,cs:segVideo mov fs,cs:segMap mov dx,SC_INDEX mov al,MAP_MASK out dx,al mov di,cs:DrawPage.Address add di,cs:upper_left add di,(VIRTUAL_WIDTH * (VIRTUAL_HEIGHT - SQUARE_HEIGHT)) / 4 mov bp,MapInfo.OffX1 add bp,MapInfo.OffY2 mov al,011h mov si,0 update_bottom_loop: mov dx,SC_INDEX + 1 out dx,al push bp call draw_row pop bp sub di,VIRTUAL_WIDTH / 4 add si,(SQUARE_WIDTH * SQUARE_HEIGHT) / 4 shl al,1 jnc update_bottom_loop ret update_bottom ENDP ; Draws ONE plane of a single col EVEN draw_col PROC near ; DI->upper left corner of col to draw ; BP->col of map to draw ; SI used to point at tiles ; AX,CX used ; BX used to push SI ; DX unused shl eax,16 ; save it mov ax,MapInfo.WrapY mov cl,(VIRTUAL_HEIGHT / SQUARE_HEIGHT) do_col_loop: mov bx,si mov bh,byte ptr fs:[bp] ; change tile # mov ch,SQUARE_HEIGHT do_col_sq_loop: mov dl,byte ptr ds:[bx+2] mov dh,byte ptr ds:[bx+3] shl edx,16 mov dl,byte ptr ds:[bx+0] mov dh,byte ptr ds:[bx+1] mov es:[di],edx ; 32-bit write add di,VIRTUAL_WIDTH / 4 add bx,4 dec ch jnz do_col_sq_loop add bp,MapInfo.Wid dec ax jnz yayaya mov ax,MapInfo.Ht sub bp,MapInfo.Extent yayaya: dec cl jnz do_col_loop shr eax,16 ; restore it ret draw_col ENDP ; Draws ONE plane of a single row EVEN draw_row PROC near push ax ; shl eax,16 ; save ax mov ax,MapInfo.WrapX ; DI->upper left corner of row to draw ; BP->row of map to draw ; SI used to point at tiles ; AX,CX used ; BX used to push SI ; DX unused mov cl,(VIRTUAL_WIDTH / SQUARE_WIDTH) do_row_loop: mov bx,si mov bh,byte ptr fs:[bp] ; change tile # mov ch,SQUARE_HEIGHT do_row_sq_loop: mov dl,byte ptr ds:[bx+2] mov dh,byte ptr ds:[bx+3] shl edx,16 mov dl,byte ptr ds:[bx+0] mov dh,byte ptr ds:[bx+1] mov es:[di],edx add di,(VIRTUAL_WIDTH / 4) add bx,4 dec ch jnz do_row_sq_loop add di,(-VIRTUAL_WIDTH*SQUARE_HEIGHT + SQUARE_WIDTH) / 4 inc bp dec ax jnz yayaya2 mov ax,MapInfo.Wid sub bp,ax yayaya2: dec cl jnz do_row_loop ; shr eax,16 ; restore it pop ax ret draw_row ENDP