3303 lines
64 KiB
Plaintext
3303 lines
64 KiB
Plaintext
;Copyright (C) 1997-2006 ZSNES Team ( zsKnight, _Demo_, pagefault, Nach )
|
|
;
|
|
;http://www.zsnes.com
|
|
;http://sourceforge.net/projects/zsnes
|
|
;
|
|
;This program is free software; you can redistribute it and/or
|
|
;modify it under the terms of the GNU General Public License
|
|
;as published by the Free Software Foundation; either
|
|
;version 2 of the License, or (at your option) any later
|
|
;version.
|
|
;
|
|
;This program is distributed in the hope that it will be useful,
|
|
;but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
;GNU General Public License for more details.
|
|
;
|
|
;You should have received a copy of the GNU General Public License
|
|
;along with this program; if not, write to the Free Software
|
|
;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
%macro Procbgpr0 5
|
|
; Draw BG 2
|
|
; Start line by line drawing/check
|
|
mov esi,[vidbuffer]
|
|
add esi,16
|
|
; add esi,16+288
|
|
xor ebx,ebx
|
|
%%nextline
|
|
cmp byte[BGFB+ebx],0
|
|
jne %%nogo
|
|
test dword[BGMS1+ebx*2],%4
|
|
jz %%nogo
|
|
test dword[BGMS1+ebx*2],%5
|
|
jnz %%nogo
|
|
; Check if at a tile alignment
|
|
mov ecx,[BG1SYl+ebx*2+%1*512]
|
|
and ecx,0FFFFh
|
|
add ecx,ebx
|
|
test ecx,07h
|
|
jz %%tilecheck
|
|
%%proclinebyline
|
|
; process line by line
|
|
call %2
|
|
%%nogo
|
|
inc ebx
|
|
add esi,288
|
|
cmp [resolutn],bx
|
|
jne %%nextline
|
|
jmp %%donextbg
|
|
%%tilecheck
|
|
mov eax,[BG1SXl+ebx*2+%1*512]
|
|
cmp ax,[BG1SXl+ebx*2+2+%1*512]
|
|
jne %%proclinebyline
|
|
cmp eax,[BG1SXl+ebx*2+4+%1*512]
|
|
jne %%proclinebyline
|
|
cmp eax,[BG1SXl+ebx*2+8+%1*512]
|
|
jne %%proclinebyline
|
|
cmp eax,[BG1SXl+ebx*2+12+%1*512]
|
|
jne %%proclinebyline
|
|
mov eax,[BG1SYl+ebx*2+%1*512]
|
|
cmp ax,[BG1SYl+ebx*2+2+%1*512]
|
|
jne %%proclinebyline
|
|
cmp eax,[BG1SYl+ebx*2+4+%1*512]
|
|
jne %%proclinebyline
|
|
cmp eax,[BG1SYl+ebx*2+8+%1*512]
|
|
jne %%proclinebyline
|
|
cmp eax,[BG1SYl+ebx*2+12+%1*512]
|
|
jne %%proclinebyline
|
|
test dword[BGMS1+ebx*2+14],%4
|
|
jz near %%proclinebyline
|
|
test dword[BGMS1+ebx*2+14],%5
|
|
jnz near %%proclinebyline
|
|
cmp ebx,[reslbyl]
|
|
jae near %%proclinebyline
|
|
mov eax,[BGMA+ebx]
|
|
cmp eax,[BGMA+ebx+4]
|
|
jne near %%proclinebyline
|
|
mov eax,[BGOPT1+ebx*2+%1*512]
|
|
cmp ax,[BGOPT1+ebx*2+2+%1*512]
|
|
jne near %%proclinebyline
|
|
cmp eax,[BGOPT1+ebx*2+4+%1*512]
|
|
jne near %%proclinebyline
|
|
cmp eax,[BGOPT1+ebx*2+8+%1*512]
|
|
jne near %%proclinebyline
|
|
cmp eax,[BGOPT1+ebx*2+12+%1*512]
|
|
jne near %%proclinebyline
|
|
mov eax,[BGPT1+ebx*2+%1*512]
|
|
cmp ax,[BGPT1+ebx*2+2+%1*512]
|
|
jne near %%proclinebyline
|
|
cmp eax,[BGPT1+ebx*2+4+%1*512]
|
|
jne near %%proclinebyline
|
|
cmp eax,[BGPT1+ebx*2+8+%1*512]
|
|
jne near %%proclinebyline
|
|
cmp eax,[BGPT1+ebx*2+12+%1*512]
|
|
jne near %%proclinebyline
|
|
mov eax,[BGPT1X+ebx*2+%1*512]
|
|
cmp ax,[BGPT1X+ebx*2+2+%1*512]
|
|
jne near %%proclinebyline
|
|
cmp eax,[BGPT1X+ebx*2+4+%1*512]
|
|
jne near %%proclinebyline
|
|
cmp eax,[BGPT1X+ebx*2+8+%1*512]
|
|
jne near %%proclinebyline
|
|
cmp eax,[BGPT1X+ebx*2+12+%1*512]
|
|
jne near %%proclinebyline
|
|
mov eax,[BGPT1Y+ebx*2+%1*512]
|
|
cmp ax,[BGPT1Y+ebx*2+2+%1*512]
|
|
jne near %%proclinebyline
|
|
cmp eax,[BGPT1Y+ebx*2+4+%1*512]
|
|
jne near %%proclinebyline
|
|
cmp eax,[BGPT1Y+ebx*2+8+%1*512]
|
|
jne near %%proclinebyline
|
|
cmp eax,[BGPT1Y+ebx*2+12+%1*512]
|
|
jne near %%proclinebyline
|
|
mov eax,[BGMS1+ebx]
|
|
cmp eax,[BGMS1+ebx+4]
|
|
jne near %%proclinebyline
|
|
cmp eax,[BGMS1+ebx+8]
|
|
jne near %%proclinebyline
|
|
cmp eax,[BGMS1+ebx+12]
|
|
jne near %%proclinebyline
|
|
mov eax,[BGFB+ebx]
|
|
cmp eax,[BGFB+ebx+4]
|
|
jne near %%proclinebyline
|
|
mov eax,[t16x161+ebx+%1*256]
|
|
cmp eax,[t16x161+ebx+4+%1*256]
|
|
jne near %%proclinebyline
|
|
cmp byte[BGMA+ebx],5
|
|
jae near %%proclinebyline
|
|
cmp byte[BGMA+ebx],2
|
|
je near %%proclinebyline
|
|
test dword[intrlng+ebx],01010101h
|
|
jnz near %%proclinebyline
|
|
test dword[intrlng+ebx+4],01010101h
|
|
jnz near %%proclinebyline
|
|
test byte[mosenng+ebx],1 << %1
|
|
jnz %%mosaic
|
|
%%nomosaic
|
|
call %3
|
|
add ebx,8
|
|
add esi,288*8
|
|
cmp [resolutn],bx
|
|
ja near %%nextline
|
|
jmp %%donextbg
|
|
%%mosaic
|
|
cmp byte[mosszng+ebx],0
|
|
je %%nomosaic
|
|
jmp %%proclinebyline
|
|
%%donextbg
|
|
%endmacro
|
|
|
|
%macro Procbg3pr0 5
|
|
; Draw BG 2
|
|
; Start line by line drawing/check
|
|
mov esi,[vidbuffer]
|
|
add esi,16
|
|
; add esi,16+288
|
|
xor ebx,ebx
|
|
%%nextline
|
|
cmp byte[BGFB+ebx],0
|
|
jne %%nogo
|
|
test dword[BGMS1+ebx*2],%4
|
|
jz %%nogo
|
|
test dword[BGMS1+ebx*2],%5
|
|
jnz %%nogo
|
|
; Check if at a tile alignment
|
|
mov ecx,[BG1SYl+ebx*2+%1*512]
|
|
and ecx,0FFFFh
|
|
add ecx,ebx
|
|
test ecx,07h
|
|
jz %%tilecheck
|
|
%%proclinebyline
|
|
; process line by line
|
|
call %2
|
|
%%nogo
|
|
inc ebx
|
|
add esi,288
|
|
cmp [resolutn],bx
|
|
jne %%nextline
|
|
jmp %%donextbg
|
|
%%tilecheck
|
|
mov eax,[BG1SXl+ebx*2+%1*512]
|
|
cmp ax,[BG1SXl+ebx*2+2+%1*512]
|
|
jne %%proclinebyline
|
|
cmp eax,[BG1SXl+ebx*2+4+%1*512]
|
|
jne %%proclinebyline
|
|
cmp eax,[BG1SXl+ebx*2+8+%1*512]
|
|
jne %%proclinebyline
|
|
cmp eax,[BG1SXl+ebx*2+12+%1*512]
|
|
jne %%proclinebyline
|
|
mov eax,[BG1SYl+ebx*2+%1*512]
|
|
cmp ax,[BG1SYl+ebx*2+2+%1*512]
|
|
jne %%proclinebyline
|
|
cmp eax,[BG1SYl+ebx*2+4+%1*512]
|
|
jne %%proclinebyline
|
|
cmp eax,[BG1SYl+ebx*2+8+%1*512]
|
|
jne %%proclinebyline
|
|
cmp eax,[BG1SYl+ebx*2+12+%1*512]
|
|
jne %%proclinebyline
|
|
test dword[BGMS1+ebx*2+14],%4
|
|
jz near %%proclinebyline
|
|
test dword[BGMS1+ebx*2+14],%5
|
|
jnz near %%proclinebyline
|
|
cmp ebx,[reslbyl]
|
|
jae near %%proclinebyline
|
|
mov eax,[BGMA+ebx]
|
|
cmp eax,[BGMA+ebx+4]
|
|
jne near %%proclinebyline
|
|
mov eax,[BGOPT1+ebx*2+%1*512]
|
|
cmp ax,[BGOPT1+ebx*2+2+%1*512]
|
|
jne near %%proclinebyline
|
|
cmp eax,[BGOPT1+ebx*2+4+%1*512]
|
|
jne near %%proclinebyline
|
|
cmp eax,[BGOPT1+ebx*2+8+%1*512]
|
|
jne near %%proclinebyline
|
|
cmp eax,[BGOPT1+ebx*2+12+%1*512]
|
|
jne near %%proclinebyline
|
|
mov eax,[BGPT1+ebx*2+%1*512]
|
|
cmp ax,[BGPT1+ebx*2+2+%1*512]
|
|
jne near %%proclinebyline
|
|
cmp eax,[BGPT1+ebx*2+4+%1*512]
|
|
jne near %%proclinebyline
|
|
cmp eax,[BGPT1+ebx*2+8+%1*512]
|
|
jne near %%proclinebyline
|
|
cmp eax,[BGPT1+ebx*2+12+%1*512]
|
|
jne near %%proclinebyline
|
|
mov eax,[BGPT1X+ebx*2+%1*512]
|
|
cmp ax,[BGPT1X+ebx*2+2+%1*512]
|
|
jne near %%proclinebyline
|
|
cmp eax,[BGPT1X+ebx*2+4+%1*512]
|
|
jne near %%proclinebyline
|
|
cmp eax,[BGPT1X+ebx*2+8+%1*512]
|
|
jne near %%proclinebyline
|
|
cmp eax,[BGPT1X+ebx*2+12+%1*512]
|
|
jne near %%proclinebyline
|
|
mov eax,[BGPT1Y+ebx*2+%1*512]
|
|
cmp ax,[BGPT1Y+ebx*2+2+%1*512]
|
|
jne near %%proclinebyline
|
|
cmp eax,[BGPT1Y+ebx*2+4+%1*512]
|
|
jne near %%proclinebyline
|
|
cmp eax,[BGPT1Y+ebx*2+8+%1*512]
|
|
jne near %%proclinebyline
|
|
cmp eax,[BGPT1Y+ebx*2+12+%1*512]
|
|
jne near %%proclinebyline
|
|
mov eax,[BGMS1+ebx]
|
|
cmp eax,[BGMS1+ebx+4]
|
|
jne near %%proclinebyline
|
|
cmp eax,[BGMS1+ebx+8]
|
|
jne near %%proclinebyline
|
|
cmp eax,[BGMS1+ebx+12]
|
|
jne near %%proclinebyline
|
|
mov eax,[BG3PRI+ebx]
|
|
cmp eax,[BG3PRI+ebx+4]
|
|
jne near %%proclinebyline
|
|
mov eax,[BGFB+ebx]
|
|
cmp eax,[BGFB+ebx+4]
|
|
jne near %%proclinebyline
|
|
mov eax,[t16x161+ebx+%1*256]
|
|
cmp eax,[t16x161+ebx+4+%1*256]
|
|
jne near %%proclinebyline
|
|
test dword[intrlng+ebx],01010101h
|
|
jnz near %%proclinebyline
|
|
test dword[intrlng+ebx+4],01010101h
|
|
jnz near %%proclinebyline
|
|
test byte[mosenng+ebx],1 << %1
|
|
jnz %%mosaic
|
|
%%nomosaic
|
|
call %3
|
|
add ebx,8
|
|
add esi,288*8
|
|
cmp [resolutn],bx
|
|
ja near %%nextline
|
|
%%mosaic
|
|
cmp byte[mosszng+ebx],0
|
|
je %%nomosaic
|
|
jmp %%proclinebyline
|
|
%%donextbg
|
|
%endmacro
|
|
|
|
%macro Procbgpr1 6
|
|
; Draw BG
|
|
; Start line by line drawing/check
|
|
mov esi,[vidbuffer]
|
|
add esi,16
|
|
; add esi,16+288
|
|
xor ebx,ebx
|
|
%%nextline
|
|
cmp byte[BGFB+ebx],0
|
|
jne %%nogo
|
|
test dword[BGMS1+ebx*2],%5
|
|
jz %%nogo
|
|
test dword[BGMS1+ebx*2],%6
|
|
jnz %%nogo
|
|
; Check if at a tile alignment
|
|
cmp byte[%4+ebx],1
|
|
je %%tile
|
|
%%proclinebyline
|
|
; process line by line
|
|
call %2
|
|
%%nogo
|
|
inc ebx
|
|
add esi,288
|
|
cmp [resolutn],bx
|
|
jne %%nextline
|
|
jmp %%donextbg
|
|
%%tile
|
|
call %3
|
|
add ebx,8
|
|
add esi,288*8
|
|
cmp [resolutn],bx
|
|
ja %%nextline
|
|
%%donextbg
|
|
%endmacro
|
|
|
|
%macro Procbg3pr1 6
|
|
; Draw BG 2
|
|
; Start line by line drawing/check
|
|
mov esi,[vidbuffer]
|
|
add esi,16
|
|
xor ebx,ebx
|
|
%%nextline
|
|
cmp byte[BGFB+ebx],0
|
|
jne %%nogo
|
|
test dword[BGMS1+ebx*2],%5
|
|
jz %%nogo
|
|
test dword[BGMS1+ebx*2],%6
|
|
jnz %%nogo
|
|
cmp byte[BGMA+ebx],1
|
|
jne %%nomode1
|
|
cmp byte[BG3PRI+ebx],0
|
|
jne %%nogo
|
|
%%nomode1
|
|
; Check if at a tile alignment
|
|
cmp byte[%4+ebx],1
|
|
je %%tile
|
|
%%proclinebyline
|
|
; process line by line
|
|
call %2
|
|
%%nogo
|
|
inc ebx
|
|
add esi,288
|
|
cmp [resolutn],bx
|
|
jne %%nextline
|
|
jmp %%donextbg
|
|
%%tile
|
|
call %3
|
|
add ebx,8
|
|
add esi,288*8
|
|
cmp [resolutn],bx
|
|
ja %%nextline
|
|
%%donextbg
|
|
%endmacro
|
|
|
|
%macro Procbg3pr1b 6
|
|
; Draw BG 2
|
|
; Start line by line drawing/check
|
|
mov esi,[vidbuffer]
|
|
add esi,16
|
|
xor ebx,ebx
|
|
%%nextline
|
|
cmp byte[BGFB+ebx],0
|
|
jne %%nogo
|
|
test dword[BGMS1+ebx*2],%5
|
|
jz %%nogo
|
|
test dword[BGMS1+ebx*2],%6
|
|
jnz %%nogo
|
|
cmp byte[BGMA+ebx],1
|
|
jne %%nogo
|
|
cmp byte[BG3PRI+ebx],0
|
|
je %%nogo
|
|
; Check if at a tile alignment
|
|
cmp byte[%4+ebx],1
|
|
je %%tile
|
|
%%proclinebyline
|
|
; process line by line
|
|
call %2
|
|
%%nogo
|
|
inc ebx
|
|
add esi,288
|
|
cmp [resolutn],bx
|
|
jne %%nextline
|
|
jmp %%donextbg
|
|
%%tile
|
|
call %3
|
|
add ebx,8
|
|
add esi,288*8
|
|
cmp [resolutn],bx
|
|
ja %%nextline
|
|
%%donextbg
|
|
%endmacro
|
|
|
|
%macro Procsprng 2
|
|
; Draw BG 2
|
|
; Start line by line drawing/check
|
|
mov esi,[vidbuffer]
|
|
add esi,16+288
|
|
mov ebx,1
|
|
%%nextline
|
|
cmp byte[BGFB+ebx],0
|
|
jne %%nogo
|
|
test dword[BGMS1+ebx*2],%1
|
|
jz %%nogo
|
|
test dword[BGMS1+ebx*2],%2
|
|
jnz %%nogo
|
|
xor eax,eax
|
|
mov al,[sprtlng+ebx]
|
|
mov cl,[sprlefttot+ebx]
|
|
mov [csprival],eax
|
|
inc byte[sprtlng+ebx]
|
|
test byte[sprleftpr+ebx*4+eax],1
|
|
jz %%nogo
|
|
or cl,cl
|
|
jz %%nogo
|
|
call drawsprng
|
|
cmp byte[BGMA+ebx],5
|
|
jb %%nogo
|
|
cmp byte[res640],0
|
|
je %%nogo
|
|
add esi,75036
|
|
mov cl,[sprlefttot+ebx]
|
|
call drawsprng
|
|
sub esi,75036
|
|
%%nogo
|
|
inc ebx
|
|
add esi,288
|
|
cmp [resolutn],bx
|
|
jne near %%nextline
|
|
%endmacro
|
|
|
|
%macro Procsprng01 2
|
|
; Draw BG 2
|
|
; Start line by line drawing/check
|
|
mov esi,[vidbuffer]
|
|
add esi,16+288
|
|
mov ebx,1
|
|
%%nextline
|
|
cmp byte[BGFB+ebx],0
|
|
jne %%nogo
|
|
test dword[BGMS1+ebx*2],%1
|
|
jz %%nogo
|
|
test dword[BGMS1+ebx*2],%2
|
|
jnz %%nogo
|
|
cmp byte[BGMA+ebx],1
|
|
ja %%nogo
|
|
xor eax,eax
|
|
mov al,[sprtlng+ebx]
|
|
mov cl,[sprlefttot+ebx]
|
|
mov [csprival],eax
|
|
inc byte[sprtlng+ebx]
|
|
test byte[sprleftpr+ebx*4+eax],1
|
|
jz %%nogo
|
|
or cl,cl
|
|
jz %%nogo
|
|
call drawsprng
|
|
cmp byte[BGMA+ebx],5
|
|
jb %%nogo
|
|
cmp byte[res640],0
|
|
je %%nogo
|
|
add esi,75036
|
|
mov cl,[sprlefttot+ebx]
|
|
call drawsprng
|
|
sub esi,75036
|
|
%%nogo
|
|
inc ebx
|
|
add esi,288
|
|
cmp [resolutn],bx
|
|
jne near %%nextline
|
|
%endmacro
|
|
|
|
%macro Procsprng234567 2
|
|
; Draw BG 2
|
|
; Start line by line drawing/check
|
|
mov esi,[vidbuffer]
|
|
add esi,16+288
|
|
mov ebx,1
|
|
%%nextline
|
|
cmp byte[BGFB+ebx],0
|
|
jne %%nogo
|
|
test dword[BGMS1+ebx*2],%1
|
|
jz %%nogo
|
|
test dword[BGMS1+ebx*2],%2
|
|
jnz %%nogo
|
|
cmp byte[BGMA+ebx],1
|
|
jbe %%nogo
|
|
xor eax,eax
|
|
mov al,[sprtlng+ebx]
|
|
mov cl,[sprlefttot+ebx]
|
|
mov [csprival],eax
|
|
inc byte[sprtlng+ebx]
|
|
test byte[sprleftpr+ebx*4+eax],1
|
|
jz %%nogo
|
|
or cl,cl
|
|
jz %%nogo
|
|
call drawsprng
|
|
cmp byte[BGMA+ebx],5
|
|
jb %%nogo
|
|
cmp byte[res640],0
|
|
je %%nogo
|
|
add esi,75036
|
|
mov cl,[sprlefttot+ebx]
|
|
call drawsprng
|
|
sub esi,75036
|
|
%%nogo
|
|
inc ebx
|
|
add esi,288
|
|
cmp [resolutn],bx
|
|
jne near %%nextline
|
|
%endmacro
|
|
|
|
%macro ProcMode7ng 2
|
|
mov byte[winon],0
|
|
; Draw BG
|
|
; Start line by line drawing/check
|
|
mov esi,[vidbuffer]
|
|
add esi,16+288
|
|
mov ebx,1
|
|
%%nextline
|
|
cmp byte[BGFB+ebx],0
|
|
jne near %%nogo
|
|
cmp byte[BGMA+ebx],7
|
|
jne near %%nogo
|
|
test dword[BGMS1+ebx*2],%1
|
|
jz near %%nogo
|
|
test dword[BGMS1+ebx*2],%2
|
|
jnz near %%nogo
|
|
push ebx
|
|
; Process mosaic
|
|
mov byte[curmosaicsz],1
|
|
xor ecx,ecx
|
|
test byte[mosenng+ebx],1
|
|
jz %%nomosaic
|
|
mov cl,[mosszng+ebx]
|
|
or cl,cl
|
|
jz %%nomosaic
|
|
inc cl
|
|
mov [curmosaicsz],cl
|
|
xor edx,edx
|
|
mov eax,ebx
|
|
div cl
|
|
xor edx,edx
|
|
mul cl
|
|
mov ebx,eax
|
|
%%nomosaic
|
|
; process line by line
|
|
mov edx,[mode7ab+ebx*4]
|
|
mov [mode7A],edx
|
|
mov edx,[mode7cd+ebx*4]
|
|
mov [mode7C],edx
|
|
mov edx,[mode7xy+ebx*4]
|
|
mov [mode7X0],edx
|
|
mov edx,[mode7st+ebx]
|
|
mov [mode7set],dl
|
|
xor edx,edx
|
|
mov eax,ebx
|
|
test byte[mode7set],02h
|
|
jz %%noflip
|
|
mov eax,261
|
|
sub eax,ebx
|
|
%%noflip
|
|
mov dx,[BG1SXl+ebx*2]
|
|
add ax,[BG1SYl+ebx*2]
|
|
mov [curvidoffset],esi
|
|
push esi
|
|
call drawmode7
|
|
pop esi
|
|
pop ebx
|
|
%%nogo
|
|
inc ebx
|
|
add esi,288
|
|
cmp [resolutn],bx
|
|
jne near %%nextline
|
|
%endmacro
|
|
|
|
|
|
%macro preparet4ba 0
|
|
shl cx,5
|
|
add ecx,ecx
|
|
add ecx,[vcache4b]
|
|
%endmacro
|
|
|
|
%macro preparet2ba 0
|
|
shl cx,4
|
|
shl ecx,2
|
|
add ecx,[vcache2b]
|
|
%endmacro
|
|
|
|
%macro preparet8ba 0
|
|
shl cx,6
|
|
add ecx,[vcache8b]
|
|
%endmacro
|
|
|
|
%macro test4ba 0
|
|
and ecx,2047
|
|
test dword[vidmemch4+ecx*2],0FFFFh
|
|
%endmacro
|
|
|
|
%macro test2ba 0
|
|
and ecx,4095
|
|
add edx,dword[mode0add]
|
|
test dword[vidmemch2+ecx],0FFh
|
|
%endmacro
|
|
|
|
%macro test8ba 0
|
|
and ecx,1023
|
|
test dword[vidmemch8+ecx*4],0FFFFFFFFh
|
|
%endmacro
|
|
|
|
%macro drawtileng 8
|
|
; tile value : bit 15 = flipy, bit 14 = flipx, bit 13 = priority value
|
|
; bit 10-12 = palette, 0-9=tile#
|
|
mov ebx,[ng16bbgval]
|
|
mov dl,ch
|
|
inc dword[bg1drwng+ebx*4]
|
|
and ecx,3FFh
|
|
and edx,1Fh
|
|
add ecx,[ngptrdat2]
|
|
mov edx,[%6+edx*4]
|
|
%7
|
|
jnz near %%docache
|
|
%%returnfromcache
|
|
cmp byte[%1+ecx],2
|
|
je near %5
|
|
cmp byte[%1+ecx],0
|
|
je near %%parttile
|
|
%2
|
|
; start drawing from ecx
|
|
test dword[vrama+eax],8000h
|
|
jnz near %%flipyfull
|
|
test dword[vrama+eax],4000h
|
|
jnz near %%flipxfull
|
|
mov ebx,[ecx]
|
|
add ebx,edx
|
|
mov [edi],ebx
|
|
mov ebx,[ecx+4]
|
|
add ebx,edx
|
|
mov [edi+4],ebx
|
|
mov ebx,[ecx+8]
|
|
add ebx,edx
|
|
mov [edi+288],ebx
|
|
mov ebx,[ecx+12]
|
|
add ebx,edx
|
|
mov [edi+288+4],ebx
|
|
mov ebx,[ecx+16]
|
|
add ebx,edx
|
|
mov [edi+288*2],ebx
|
|
mov ebx,[ecx+20]
|
|
add ebx,edx
|
|
mov [edi+288*2+4],ebx
|
|
mov ebx,[ecx+24]
|
|
add ebx,edx
|
|
mov [edi+288*3],ebx
|
|
mov ebx,[ecx+28]
|
|
add ebx,edx
|
|
mov [edi+288*3+4],ebx
|
|
mov ebx,[ecx+32]
|
|
add ebx,edx
|
|
mov [edi+288*4],ebx
|
|
mov ebx,[ecx+36]
|
|
add ebx,edx
|
|
mov [edi+288*4+4],ebx
|
|
mov ebx,[ecx+40]
|
|
add ebx,edx
|
|
mov [edi+288*5],ebx
|
|
mov ebx,[ecx+44]
|
|
add ebx,edx
|
|
mov [edi+288*5+4],ebx
|
|
mov ebx,[ecx+48]
|
|
add ebx,edx
|
|
mov [edi+288*6],ebx
|
|
mov ebx,[ecx+52]
|
|
add ebx,edx
|
|
mov [edi+288*6+4],ebx
|
|
mov ebx,[ecx+56]
|
|
add ebx,edx
|
|
mov [edi+288*7],ebx
|
|
mov ebx,[ecx+60]
|
|
add ebx,edx
|
|
mov [edi+288*7+4],ebx
|
|
jmp %5
|
|
%%flipxfull
|
|
mov ebx,[ecx+4]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi],ebx
|
|
mov ebx,[ecx]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+4],ebx
|
|
mov ebx,[ecx+12]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+288],ebx
|
|
mov ebx,[ecx+8]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+288+4],ebx
|
|
mov ebx,[ecx+20]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+288*2],ebx
|
|
mov ebx,[ecx+16]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+288*2+4],ebx
|
|
mov ebx,[ecx+28]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+288*3],ebx
|
|
mov ebx,[ecx+24]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+288*3+4],ebx
|
|
mov ebx,[ecx+36]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+288*4],ebx
|
|
mov ebx,[ecx+32]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+288*4+4],ebx
|
|
mov ebx,[ecx+44]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+288*5],ebx
|
|
mov ebx,[ecx+40]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+288*5+4],ebx
|
|
mov ebx,[ecx+52]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+288*6],ebx
|
|
mov ebx,[ecx+48]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+288*6+4],ebx
|
|
mov ebx,[ecx+60]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+288*7],ebx
|
|
mov ebx,[ecx+56]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+288*7+4],ebx
|
|
jmp %5
|
|
%%flipyfull
|
|
test word[vrama+eax],4000h
|
|
jnz near %%flipxyfull
|
|
mov ebx,[ecx]
|
|
add ebx,edx
|
|
mov [edi+288*7],ebx
|
|
mov ebx,[ecx+4]
|
|
add ebx,edx
|
|
mov [edi+288*7+4],ebx
|
|
mov ebx,[ecx+8]
|
|
add ebx,edx
|
|
mov [edi+288*6],ebx
|
|
mov ebx,[ecx+12]
|
|
add ebx,edx
|
|
mov [edi+288*6+4],ebx
|
|
mov ebx,[ecx+16]
|
|
add ebx,edx
|
|
mov [edi+288*5],ebx
|
|
mov ebx,[ecx+20]
|
|
add ebx,edx
|
|
mov [edi+288*5+4],ebx
|
|
mov ebx,[ecx+24]
|
|
add ebx,edx
|
|
mov [edi+288*4],ebx
|
|
mov ebx,[ecx+28]
|
|
add ebx,edx
|
|
mov [edi+288*4+4],ebx
|
|
mov ebx,[ecx+32]
|
|
add ebx,edx
|
|
mov [edi+288*3],ebx
|
|
mov ebx,[ecx+36]
|
|
add ebx,edx
|
|
mov [edi+288*3+4],ebx
|
|
mov ebx,[ecx+40]
|
|
add ebx,edx
|
|
mov [edi+288*2],ebx
|
|
mov ebx,[ecx+44]
|
|
add ebx,edx
|
|
mov [edi+288*2+4],ebx
|
|
mov ebx,[ecx+48]
|
|
add ebx,edx
|
|
mov [edi+288],ebx
|
|
mov ebx,[ecx+52]
|
|
add ebx,edx
|
|
mov [edi+288+4],ebx
|
|
mov ebx,[ecx+56]
|
|
add ebx,edx
|
|
mov [edi],ebx
|
|
mov ebx,[ecx+60]
|
|
add ebx,edx
|
|
mov [edi+4],ebx
|
|
jmp %5
|
|
%%flipxyfull
|
|
mov ebx,[ecx+4]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+288*7],ebx
|
|
mov ebx,[ecx]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+288*7+4],ebx
|
|
mov ebx,[ecx+12]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+288*6],ebx
|
|
mov ebx,[ecx+8]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+288*6+4],ebx
|
|
mov ebx,[ecx+20]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+288*5],ebx
|
|
mov ebx,[ecx+16]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+288*5+4],ebx
|
|
mov ebx,[ecx+28]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+288*4],ebx
|
|
mov ebx,[ecx+24]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+288*4+4],ebx
|
|
mov ebx,[ecx+36]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+288*3],ebx
|
|
mov ebx,[ecx+32]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+288*3+4],ebx
|
|
mov ebx,[ecx+44]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+288*2],ebx
|
|
mov ebx,[ecx+40]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+288*2+4],ebx
|
|
mov ebx,[ecx+52]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+288],ebx
|
|
mov ebx,[ecx+48]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+288+4],ebx
|
|
mov ebx,[ecx+60]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi],ebx
|
|
mov ebx,[ecx+56]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+4],ebx
|
|
jmp %5
|
|
%%parttile
|
|
%2
|
|
; start drawing from ecx to edi
|
|
test word[vrama+eax],8000h
|
|
jnz near %%flipypart
|
|
test word[vrama+eax],4000h
|
|
jnz near %%flipxpart
|
|
mov dword[tleftnb],8
|
|
%%nextb
|
|
mov ebx,[ecx]
|
|
or ebx,ebx
|
|
jz %%drawd
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawa
|
|
mov [edi],bl
|
|
%%drawa
|
|
test bh,%8
|
|
jz %%drawb
|
|
mov [edi+1],bh
|
|
%%drawb
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawc
|
|
mov [edi+2],bl
|
|
%%drawc
|
|
test bh,%8
|
|
jz %%drawd
|
|
mov [edi+3],bh
|
|
%%drawd
|
|
mov ebx,[ecx+4]
|
|
or ebx,ebx
|
|
jz %%drawd2
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawa2
|
|
mov [edi+4],bl
|
|
%%drawa2
|
|
test bh,%8
|
|
jz %%drawb2
|
|
mov [edi+5],bh
|
|
%%drawb2
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawc2
|
|
mov [edi+6],bl
|
|
%%drawc2
|
|
test bh,%8
|
|
jz %%drawd2
|
|
mov [edi+7],bh
|
|
%%drawd2
|
|
add ecx,8
|
|
add edi,288
|
|
dec dword[tleftnb]
|
|
jnz %%nextb
|
|
sub edi,288*8
|
|
jmp %5
|
|
%%flipxpart
|
|
mov dword[tleftnb],8
|
|
%%nextbf
|
|
mov ebx,[ecx]
|
|
or ebx,ebx
|
|
jz %%drawdf
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawaf
|
|
mov [edi+7],bl
|
|
%%drawaf
|
|
test bh,%8
|
|
jz %%drawbf
|
|
mov [edi+6],bh
|
|
%%drawbf
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawcf
|
|
mov [edi+5],bl
|
|
%%drawcf
|
|
test bh,%8
|
|
jz %%drawdf
|
|
mov [edi+4],bh
|
|
%%drawdf
|
|
mov ebx,[ecx+4]
|
|
or ebx,ebx
|
|
jz %%drawd2f
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawa2f
|
|
mov [edi+3],bl
|
|
%%drawa2f
|
|
test bh,%8
|
|
jz %%drawb2f
|
|
mov [edi+2],bh
|
|
%%drawb2f
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawc2f
|
|
mov [edi+1],bl
|
|
%%drawc2f
|
|
test bh,%8
|
|
jz %%drawd2f
|
|
mov [edi],bh
|
|
%%drawd2f
|
|
add ecx,8
|
|
add edi,288
|
|
dec dword[tleftnb]
|
|
jnz %%nextbf
|
|
sub edi,288*8
|
|
jmp %5
|
|
%%flipypart
|
|
add edi,288*7
|
|
test word[vrama+eax],4000h
|
|
jnz near %%flipxypart
|
|
mov dword[tleftnb],8
|
|
%%nextbm
|
|
mov ebx,[ecx]
|
|
or ebx,ebx
|
|
jz %%drawdm
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawam
|
|
mov [edi],bl
|
|
%%drawam
|
|
test bh,%8
|
|
jz %%drawbm
|
|
mov [edi+1],bh
|
|
%%drawbm
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawcm
|
|
mov [edi+2],bl
|
|
%%drawcm
|
|
test bh,%8
|
|
jz %%drawdm
|
|
mov [edi+3],bh
|
|
%%drawdm
|
|
mov ebx,[ecx+4]
|
|
or ebx,ebx
|
|
jz %%drawd2m
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawa2m
|
|
mov [edi+4],bl
|
|
%%drawa2m
|
|
test bh,%8
|
|
jz %%drawb2m
|
|
mov [edi+5],bh
|
|
%%drawb2m
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawc2m
|
|
mov [edi+6],bl
|
|
%%drawc2m
|
|
test bh,%8
|
|
jz %%drawd2m
|
|
mov [edi+7],bh
|
|
%%drawd2m
|
|
add ecx,8
|
|
sub edi,288
|
|
dec dword[tleftnb]
|
|
jnz %%nextbm
|
|
add edi,288
|
|
jmp %5
|
|
%%flipxypart
|
|
mov dword[tleftnb],8
|
|
%%nextbfm
|
|
mov ebx,[ecx]
|
|
or ebx,ebx
|
|
jz %%drawdfm
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawafm
|
|
mov [edi+7],bl
|
|
%%drawafm
|
|
test bh,%8
|
|
jz %%drawbfm
|
|
mov [edi+6],bh
|
|
%%drawbfm
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawcfm
|
|
mov [edi+5],bl
|
|
%%drawcfm
|
|
test bh,%8
|
|
jz %%drawdfm
|
|
mov [edi+4],bh
|
|
%%drawdfm
|
|
mov ebx,[ecx+4]
|
|
or ebx,ebx
|
|
jz %%drawd2fm
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawa2fm
|
|
mov [edi+3],bl
|
|
%%drawa2fm
|
|
test bh,%8
|
|
jz %%drawb2fm
|
|
mov [edi+2],bh
|
|
%%drawb2fm
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawc2fm
|
|
mov [edi+1],bl
|
|
%%drawc2fm
|
|
test bh,%8
|
|
jz %%drawd2fm
|
|
mov [edi],bh
|
|
%%drawd2fm
|
|
add ecx,8
|
|
sub edi,288
|
|
dec dword[tleftnb]
|
|
jnz %%nextbfm
|
|
add edi,288
|
|
%5
|
|
mov ebx,[ng16bbgval]
|
|
add ax,2
|
|
inc dword[bg1totng+ebx*4]
|
|
add edi,8
|
|
test eax,03Fh
|
|
jz %%tileadd
|
|
%%next
|
|
dec byte[tleftn]
|
|
jnz near %4
|
|
pop ebx
|
|
ret
|
|
%%docache
|
|
call %3
|
|
jmp %%returnfromcache
|
|
%%tileadd
|
|
add ax,[bgtxadd]
|
|
jmp %%next
|
|
%endmacro
|
|
|
|
%macro drawtileng16x16 8
|
|
; tile value : bit 15 = flipy, bit 14 = flipx, bit 13 = priority value
|
|
; bit 10-12 = palette, 0-9=tile#
|
|
mov ebx,[ng16bbgval]
|
|
mov dl,ch
|
|
inc dword[bg1drwng+ebx*4]
|
|
and ecx,3FFh
|
|
and edx,1Fh
|
|
add ecx,[ngptrdat2]
|
|
add cx,[taddnfy16x16]
|
|
test dword[vrama+eax],8000h
|
|
jz %%noflipy
|
|
add cx,[taddfy16x16]
|
|
%%noflipy
|
|
test dword[vrama+eax],4000h
|
|
jz %%noflipx
|
|
inc cx
|
|
%%noflipx
|
|
%%nexttile
|
|
push ecx
|
|
push edx
|
|
mov edx,[%6+edx*4]
|
|
%7
|
|
jnz near %%docache
|
|
%%returnfromcache
|
|
cmp byte[%1+ecx],2
|
|
je near %%done
|
|
cmp byte[%1+ecx],0
|
|
je near %%parttile
|
|
%2
|
|
; start drawing from ecx
|
|
test dword[vrama+eax],8000h
|
|
jnz near %%flipyfull
|
|
test dword[vrama+eax],4000h
|
|
jnz near %%flipxfull
|
|
push eax
|
|
mov ebx,[ecx]
|
|
mov eax,[ecx+4]
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi],ebx
|
|
mov [edi+4],eax
|
|
mov ebx,[ecx+8]
|
|
mov eax,[ecx+12]
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi+288],ebx
|
|
mov [edi+288+4],eax
|
|
mov ebx,[ecx+16]
|
|
mov eax,[ecx+20]
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi+288*2],ebx
|
|
mov [edi+288*2+4],eax
|
|
mov ebx,[ecx+24]
|
|
mov eax,[ecx+28]
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi+288*3],ebx
|
|
mov [edi+288*3+4],eax
|
|
mov ebx,[ecx+32]
|
|
mov eax,[ecx+36]
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi+288*4],ebx
|
|
mov [edi+288*4+4],eax
|
|
mov ebx,[ecx+40]
|
|
mov eax,[ecx+44]
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi+288*5],ebx
|
|
mov [edi+288*5+4],eax
|
|
mov ebx,[ecx+48]
|
|
mov eax,[ecx+52]
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi+288*6],ebx
|
|
mov [edi+288*6+4],eax
|
|
mov ebx,[ecx+56]
|
|
mov eax,[ecx+60]
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi+288*7],ebx
|
|
mov [edi+288*7+4],eax
|
|
pop eax
|
|
jmp %%done
|
|
%%flipxfull
|
|
push eax
|
|
mov ebx,[ecx+4]
|
|
mov eax,[ecx]
|
|
bswap ebx
|
|
bswap eax
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi],ebx
|
|
mov [edi+4],eax
|
|
mov ebx,[ecx+12]
|
|
mov eax,[ecx+8]
|
|
bswap ebx
|
|
bswap eax
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi+288],ebx
|
|
mov [edi+288+4],eax
|
|
mov ebx,[ecx+20]
|
|
mov eax,[ecx+16]
|
|
bswap ebx
|
|
bswap eax
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi+288*2],ebx
|
|
mov [edi+288*2+4],eax
|
|
mov ebx,[ecx+28]
|
|
mov eax,[ecx+24]
|
|
bswap ebx
|
|
bswap eax
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi+288*3],ebx
|
|
mov [edi+288*3+4],eax
|
|
mov ebx,[ecx+36]
|
|
mov eax,[ecx+32]
|
|
bswap ebx
|
|
bswap eax
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi+288*4],ebx
|
|
mov [edi+288*4+4],eax
|
|
mov ebx,[ecx+44]
|
|
mov eax,[ecx+40]
|
|
bswap ebx
|
|
bswap eax
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi+288*5],ebx
|
|
mov [edi+288*5+4],eax
|
|
mov ebx,[ecx+52]
|
|
mov eax,[ecx+48]
|
|
bswap ebx
|
|
bswap eax
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi+288*6],ebx
|
|
mov [edi+288*6+4],eax
|
|
mov ebx,[ecx+60]
|
|
mov eax,[ecx+56]
|
|
bswap ebx
|
|
bswap eax
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi+288*7],ebx
|
|
mov [edi+288*7+4],eax
|
|
pop eax
|
|
jmp %%done
|
|
%%flipyfull
|
|
test word[vrama+eax],4000h
|
|
jnz near %%flipxyfull
|
|
push eax
|
|
mov ebx,[ecx]
|
|
mov eax,[ecx+4]
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi+288*7],ebx
|
|
mov [edi+288*7+4],eax
|
|
mov ebx,[ecx+8]
|
|
mov eax,[ecx+12]
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi+288*6],ebx
|
|
mov [edi+288*6+4],eax
|
|
mov ebx,[ecx+16]
|
|
mov eax,[ecx+20]
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi+288*5],ebx
|
|
mov [edi+288*5+4],eax
|
|
mov ebx,[ecx+24]
|
|
mov eax,[ecx+28]
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi+288*4],ebx
|
|
mov [edi+288*4+4],eax
|
|
mov ebx,[ecx+32]
|
|
mov eax,[ecx+36]
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi+288*3],ebx
|
|
mov [edi+288*3+4],eax
|
|
mov ebx,[ecx+40]
|
|
mov eax,[ecx+44]
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi+288*2],ebx
|
|
mov [edi+288*2+4],eax
|
|
mov ebx,[ecx+48]
|
|
mov eax,[ecx+52]
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi+288],ebx
|
|
mov [edi+288+4],eax
|
|
mov ebx,[ecx+56]
|
|
mov eax,[ecx+60]
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi],ebx
|
|
mov [edi+4],eax
|
|
pop eax
|
|
jmp %%done
|
|
%%flipxyfull
|
|
push eax
|
|
mov ebx,[ecx+4]
|
|
mov eax,[ecx]
|
|
bswap ebx
|
|
bswap eax
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi+288*7],ebx
|
|
mov [edi+288*7+4],eax
|
|
mov ebx,[ecx+12]
|
|
mov eax,[ecx+8]
|
|
bswap ebx
|
|
bswap eax
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi+288*6],ebx
|
|
mov [edi+288*6+4],eax
|
|
mov ebx,[ecx+20]
|
|
mov eax,[ecx+16]
|
|
bswap ebx
|
|
bswap eax
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi+288*5],ebx
|
|
mov [edi+288*5+4],eax
|
|
mov ebx,[ecx+28]
|
|
mov eax,[ecx+24]
|
|
bswap ebx
|
|
bswap eax
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi+288*4],ebx
|
|
mov [edi+288*4+4],eax
|
|
mov ebx,[ecx+36]
|
|
mov eax,[ecx+32]
|
|
bswap ebx
|
|
bswap eax
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi+288*3],ebx
|
|
mov [edi+288*3+4],eax
|
|
mov ebx,[ecx+44]
|
|
mov eax,[ecx+40]
|
|
bswap ebx
|
|
bswap eax
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi+288*2],ebx
|
|
mov [edi+288*2+4],eax
|
|
mov ebx,[ecx+52]
|
|
mov eax,[ecx+48]
|
|
bswap ebx
|
|
bswap eax
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi+288],ebx
|
|
mov [edi+288+4],eax
|
|
mov ebx,[ecx+60]
|
|
mov eax,[ecx+56]
|
|
bswap ebx
|
|
bswap eax
|
|
add ebx,edx
|
|
add eax,edx
|
|
mov [edi],ebx
|
|
mov [edi+4],eax
|
|
pop eax
|
|
jmp %%done
|
|
%%parttile
|
|
%2
|
|
; start drawing from ecx to edi
|
|
test word[vrama+eax],8000h
|
|
jnz near %%flipypart
|
|
test word[vrama+eax],4000h
|
|
jnz near %%flipxpart
|
|
mov dword[tleftnb],8
|
|
%%nextb
|
|
mov ebx,[ecx]
|
|
or ebx,ebx
|
|
jz %%drawd
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawa
|
|
mov [edi],bl
|
|
%%drawa
|
|
test bh,%8
|
|
jz %%drawb
|
|
mov [edi+1],bh
|
|
%%drawb
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawc
|
|
mov [edi+2],bl
|
|
%%drawc
|
|
test bh,%8
|
|
jz %%drawd
|
|
mov [edi+3],bh
|
|
%%drawd
|
|
mov ebx,[ecx+4]
|
|
or ebx,ebx
|
|
jz %%drawd2
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawa2
|
|
mov [edi+4],bl
|
|
%%drawa2
|
|
test bh,%8
|
|
jz %%drawb2
|
|
mov [edi+5],bh
|
|
%%drawb2
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawc2
|
|
mov [edi+6],bl
|
|
%%drawc2
|
|
test bh,%8
|
|
jz %%drawd2
|
|
mov [edi+7],bh
|
|
%%drawd2
|
|
add ecx,8
|
|
add edi,288
|
|
dec dword[tleftnb]
|
|
jnz %%nextb
|
|
sub edi,288*8
|
|
jmp %%done
|
|
%%flipxpart
|
|
mov dword[tleftnb],8
|
|
%%nextbf
|
|
mov ebx,[ecx]
|
|
or ebx,ebx
|
|
jz %%drawdf
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawaf
|
|
mov [edi+7],bl
|
|
%%drawaf
|
|
test bh,%8
|
|
jz %%drawbf
|
|
mov [edi+6],bh
|
|
%%drawbf
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawcf
|
|
mov [edi+5],bl
|
|
%%drawcf
|
|
test bh,%8
|
|
jz %%drawdf
|
|
mov [edi+4],bh
|
|
%%drawdf
|
|
mov ebx,[ecx+4]
|
|
or ebx,ebx
|
|
jz %%drawd2f
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawa2f
|
|
mov [edi+3],bl
|
|
%%drawa2f
|
|
test bh,%8
|
|
jz %%drawb2f
|
|
mov [edi+2],bh
|
|
%%drawb2f
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawc2f
|
|
mov [edi+1],bl
|
|
%%drawc2f
|
|
test bh,%8
|
|
jz %%drawd2f
|
|
mov [edi],bh
|
|
%%drawd2f
|
|
add ecx,8
|
|
add edi,288
|
|
dec dword[tleftnb]
|
|
jnz %%nextbf
|
|
sub edi,288*8
|
|
jmp %%done
|
|
%%flipypart
|
|
add edi,288*7
|
|
test word[vrama+eax],4000h
|
|
jnz near %%flipxypart
|
|
mov dword[tleftnb],8
|
|
%%nextbm
|
|
mov ebx,[ecx]
|
|
or ebx,ebx
|
|
jz %%drawdm
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawam
|
|
mov [edi],bl
|
|
%%drawam
|
|
test bh,%8
|
|
jz %%drawbm
|
|
mov [edi+1],bh
|
|
%%drawbm
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawcm
|
|
mov [edi+2],bl
|
|
%%drawcm
|
|
test bh,%8
|
|
jz %%drawdm
|
|
mov [edi+3],bh
|
|
%%drawdm
|
|
mov ebx,[ecx+4]
|
|
or ebx,ebx
|
|
jz %%drawd2m
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawa2m
|
|
mov [edi+4],bl
|
|
%%drawa2m
|
|
test bh,%8
|
|
jz %%drawb2m
|
|
mov [edi+5],bh
|
|
%%drawb2m
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawc2m
|
|
mov [edi+6],bl
|
|
%%drawc2m
|
|
test bh,%8
|
|
jz %%drawd2m
|
|
mov [edi+7],bh
|
|
%%drawd2m
|
|
add ecx,8
|
|
sub edi,288
|
|
dec dword[tleftnb]
|
|
jnz %%nextbm
|
|
add edi,288
|
|
jmp %%done
|
|
%%flipxypart
|
|
mov dword[tleftnb],8
|
|
%%nextbfm
|
|
mov ebx,[ecx]
|
|
or ebx,ebx
|
|
jz %%drawdfm
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawafm
|
|
mov [edi+7],bl
|
|
%%drawafm
|
|
test bh,%8
|
|
jz %%drawbfm
|
|
mov [edi+6],bh
|
|
%%drawbfm
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawcfm
|
|
mov [edi+5],bl
|
|
%%drawcfm
|
|
test bh,%8
|
|
jz %%drawdfm
|
|
mov [edi+4],bh
|
|
%%drawdfm
|
|
mov ebx,[ecx+4]
|
|
or ebx,ebx
|
|
jz %%drawd2fm
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawa2fm
|
|
mov [edi+3],bl
|
|
%%drawa2fm
|
|
test bh,%8
|
|
jz %%drawb2fm
|
|
mov [edi+2],bh
|
|
%%drawb2fm
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawc2fm
|
|
mov [edi+1],bl
|
|
%%drawc2fm
|
|
test bh,%8
|
|
jz %%drawd2fm
|
|
mov [edi],bh
|
|
%%drawd2fm
|
|
add ecx,8
|
|
sub edi,288
|
|
dec dword[tleftnb]
|
|
jnz %%nextbfm
|
|
add edi,288
|
|
%%done
|
|
pop edx
|
|
pop ecx
|
|
inc cx
|
|
test dword[vrama+eax],4000h
|
|
jz %%noflipxb
|
|
sub cx,2
|
|
%%noflipxb
|
|
add edi,8
|
|
xor dword[switch16x16],1
|
|
jnz near %%nexttile
|
|
%%ntile
|
|
mov ebx,[ng16bbgval]
|
|
add ax,2
|
|
inc dword[bg1totng+ebx*4]
|
|
test eax,03Fh
|
|
jz %%tileadd
|
|
%%next
|
|
dec byte[tleftn]
|
|
jnz near %4
|
|
pop ebx
|
|
ret
|
|
%5
|
|
add edi,16
|
|
jmp %%ntile
|
|
%%docache
|
|
call %3
|
|
jmp %%returnfromcache
|
|
%%tileadd
|
|
add ax,[bgtxadd]
|
|
jmp %%next
|
|
%endmacro
|
|
|
|
%macro drawbgtileng 2
|
|
mov dword[ng16bprval],0
|
|
mov dword[ng16bbgval],%1
|
|
cmp byte[t16x161+ebx+%1*256],1
|
|
je near .tiles16x16
|
|
push ebx
|
|
mov eax,[BGPT1+ebx*2+%1*512]
|
|
test ecx,100h
|
|
jz .noyinc
|
|
add eax,[BGPT1Y+ebx*2+%1*512]
|
|
.noyinc
|
|
lea ecx,[ecx*8]
|
|
and ecx,07C0h ; 1Fh*40h
|
|
add eax,ecx
|
|
mov ecx,[BG1SXl+ebx*2+%1*512]
|
|
mov edx,[BGPT1X+ebx*2+%1*512]
|
|
test ecx,100h
|
|
jz .noxinc
|
|
add eax,edx
|
|
neg dx
|
|
.noxinc
|
|
mov edi,ecx
|
|
sub dx,64
|
|
and ecx,0F8h
|
|
and eax,0FFFFh
|
|
shr ecx,2
|
|
mov [bgtxadd],edx
|
|
mov [bgtxad+ebx*2+%2*512],dx
|
|
add eax,ecx
|
|
mov ecx,[BGOPT1+ebx*2+%1*512]
|
|
mov edx,[BGMA+ebx]
|
|
and edi,07h
|
|
and edx,07h
|
|
and ecx,0FFFFh
|
|
mov edx,[colormodedef+edx*4+%1]
|
|
neg edi
|
|
cmp dl,2
|
|
jne near .no4bit
|
|
shr ecx,5
|
|
add edi,esi
|
|
mov [ngptrdat+%2*1024+ebx*4],ecx
|
|
mov [ngptrdat2],ecx
|
|
mov [ngceax+%2*1024+ebx*4],eax
|
|
mov [ngcedi+%2*1024+ebx*4],edi
|
|
; eax = pointer to beginning of tile area
|
|
jmp drawtileng4b
|
|
.no4bit
|
|
cmp dl,1
|
|
jne near .no2bit
|
|
shr ecx,4
|
|
add edi,esi
|
|
mov [ngptrdat+%2*1024+ebx*4],ecx
|
|
mov [ngptrdat2],ecx
|
|
mov [ngceax+%2*1024+ebx*4],eax
|
|
mov [ngcedi+%2*1024+ebx*4],edi
|
|
; eax = pointer to beginning of tile area
|
|
mov dword[mode0add],0
|
|
cmp byte[BGMA+ebx],0
|
|
jne .nomode0
|
|
mov ebx,[mode0ads]
|
|
mov [mode0add],ebx
|
|
.nomode0
|
|
jmp drawtileng2b
|
|
.no2bit
|
|
cmp dl,3
|
|
jne near .no8bit
|
|
shr ecx,6
|
|
add edi,esi
|
|
mov [ngptrdat+%2*1024+ebx*4],ecx
|
|
mov [ngptrdat2],ecx
|
|
mov [ngceax+%2*1024+ebx*4],eax
|
|
mov [ngcedi+%2*1024+ebx*4],edi
|
|
; eax = pointer to beginning of tile area
|
|
jmp drawtileng8b
|
|
.no8bit
|
|
pop ebx
|
|
ret
|
|
|
|
.tiles16x16
|
|
mov dword[taddnfy16x16],0
|
|
mov dword[taddfy16x16],16
|
|
test ecx,08h
|
|
jz .nobottomy
|
|
mov dword[taddnfy16x16],16
|
|
mov dword[taddfy16x16],-16
|
|
.nobottomy
|
|
push ebx
|
|
mov eax,[BGPT1+ebx*2+%1*512]
|
|
test ecx,200h
|
|
jz .noyinc2
|
|
add eax,[BGPT1Y+ebx*2+%1*512]
|
|
.noyinc2
|
|
lea ecx,[ecx*4]
|
|
and ecx,07C0h ; 1Fh*40h
|
|
add eax,ecx
|
|
mov ecx,[BG1SXl+ebx*2+%1*512]
|
|
mov edx,[BGPT1X+ebx*2+%1*512]
|
|
test ecx,200h
|
|
jz .noxinc2
|
|
add eax,edx
|
|
neg dx
|
|
.noxinc2
|
|
mov edi,ecx
|
|
sub dx,64
|
|
and ecx,1F0h
|
|
and eax,0FFFFh
|
|
shr ecx,3
|
|
mov [bgtxadd],edx
|
|
mov [bgtxad+ebx*2+%2*512],dx
|
|
add eax,ecx
|
|
mov ecx,[BGOPT1+ebx*2+%1*512]
|
|
mov edx,[BGMA+ebx]
|
|
and edi,0Fh
|
|
and edx,07h
|
|
and ecx,0FFFFh
|
|
mov edx,[colormodedef+edx*4+%1]
|
|
neg edi
|
|
cmp dl,2
|
|
jne near .no4bit2
|
|
shr ecx,5
|
|
add edi,esi
|
|
mov [ngptrdat+%2*1024+ebx*4],ecx
|
|
mov [ngptrdat2],ecx
|
|
mov [ngceax+%2*1024+ebx*4],eax
|
|
mov [ngcedi+%2*1024+ebx*4],edi
|
|
; eax = pointer to beginning of tile area
|
|
jmp drawtileng16x164b
|
|
.no4bit2
|
|
cmp dl,1
|
|
jne near .no2bit2
|
|
shr ecx,4
|
|
add edi,esi
|
|
mov [ngptrdat+%2*1024+ebx*4],ecx
|
|
mov [ngptrdat2],ecx
|
|
mov [ngceax+%2*1024+ebx*4],eax
|
|
mov [ngcedi+%2*1024+ebx*4],edi
|
|
; eax = pointer to beginning of tile area
|
|
mov dword[mode0add],0
|
|
cmp byte[BGMA+ebx],0
|
|
jne .nomode02
|
|
mov ebx,[mode0ads]
|
|
mov [mode0add],ebx
|
|
.nomode02
|
|
jmp drawtileng16x162b
|
|
.no2bit2
|
|
cmp dl,3
|
|
jne near .no8bit
|
|
shr ecx,6
|
|
add edi,esi
|
|
mov [ngptrdat+%2*1024+ebx*4],ecx
|
|
mov [ngptrdat2],ecx
|
|
mov [ngceax+%2*1024+ebx*4],eax
|
|
mov [ngcedi+%2*1024+ebx*4],edi
|
|
; eax = pointer to beginning of tile area
|
|
jmp drawtileng16x168b
|
|
.no8bit2
|
|
pop ebx
|
|
ret
|
|
%endmacro
|
|
|
|
%macro drawbgtilengpr1 2
|
|
mov dword[ng16bprval],2000h
|
|
mov dword[ng16bbgval],%1
|
|
cmp byte[t16x161+ebx+%1*256],1
|
|
je near .tiles16x16
|
|
push ebx
|
|
mov edx,[BGMA+ebx]
|
|
mov ecx,[bgtxad+ebx*2+%2*512]
|
|
and edx,07h
|
|
mov [bgtxadd],cx
|
|
mov ecx,[ngptrdat+%2*1024+ebx*4]
|
|
mov edx,[colormodedef+edx*4+%1]
|
|
mov [ngptrdat2],ecx
|
|
mov eax,[ngceax+%2*1024+ebx*4]
|
|
mov edi,[ngcedi+%2*1024+ebx*4]
|
|
cmp dl,2
|
|
jne near .no4bit
|
|
; eax = pointer to beginning of tile area
|
|
jmp drawtileng4b
|
|
.no4bit
|
|
cmp dl,1
|
|
jne near .no2bit
|
|
; eax = pointer to beginning of tile area
|
|
mov dword[mode0add],0
|
|
cmp byte[BGMA+ebx],0
|
|
jne .nomode0
|
|
mov ebx,[mode0ads]
|
|
mov [mode0add],ebx
|
|
.nomode0
|
|
jmp drawtileng2b
|
|
.no2bit
|
|
cmp dl,3
|
|
jne near .no8bit
|
|
; eax = pointer to beginning of tile area
|
|
jmp drawtileng8b
|
|
.no8bit
|
|
pop ebx
|
|
ret
|
|
.tiles16x16
|
|
mov ecx,[BG1SYl+ebx*2+%1*512]
|
|
and ecx,0FFFFh
|
|
mov dword[taddnfy16x16],0
|
|
add ecx,ebx
|
|
mov dword[taddfy16x16],16
|
|
test ecx,08h
|
|
jz .nobottomy
|
|
mov dword[taddnfy16x16],16
|
|
mov dword[taddfy16x16],-16
|
|
.nobottomy
|
|
push ebx
|
|
mov edx,[BGMA+ebx]
|
|
mov ecx,[bgtxad+ebx*2+%2*512]
|
|
and edx,07h
|
|
mov [bgtxadd],cx
|
|
mov ecx,[ngptrdat+%2*1024+ebx*4]
|
|
mov edx,[colormodedef+edx*4+%1]
|
|
mov [ngptrdat2],ecx
|
|
mov eax,[ngceax+%2*1024+ebx*4]
|
|
mov edi,[ngcedi+%2*1024+ebx*4]
|
|
cmp dl,2
|
|
jne near .no4bit2
|
|
; eax = pointer to beginning of tile area
|
|
jmp drawtileng16x164b
|
|
.no4bit2
|
|
cmp dl,1
|
|
jne near .no2bit2
|
|
; eax = pointer to beginning of tile area
|
|
mov dword[mode0add],0
|
|
cmp byte[BGMA+ebx],0
|
|
jne .nomode02
|
|
mov ebx,[mode0ads]
|
|
mov [mode0add],ebx
|
|
.nomode02
|
|
jmp drawtileng16x162b
|
|
.no2bit2
|
|
cmp dl,3
|
|
jne near .no8bit2
|
|
; eax = pointer to beginning of tile area
|
|
jmp drawtileng16x168b
|
|
.no8bit2
|
|
pop ebx
|
|
ret
|
|
%endmacro
|
|
|
|
%macro drawlineng 8
|
|
; tile value : bit 15 = flipy, bit 14 = flipx, bit 13 = priority value
|
|
; bit 10-12 = palette, 0-9=tile#
|
|
mov ebx,[ng16bbgval]
|
|
mov dl,ch
|
|
inc dword[bg1drwng+ebx*4]
|
|
and ecx,3FFh
|
|
and edx,1Fh
|
|
add ecx,[ngptrdat2]
|
|
mov edx,[%6+edx*4]
|
|
%7
|
|
jnz near %%docache
|
|
%%returnfromcache
|
|
cmp byte[%1+ecx],2
|
|
je near %5
|
|
cmp byte[%1+ecx],0
|
|
je near %%parttile
|
|
%2
|
|
; start drawing from ecx
|
|
test dword[vrama+eax],8000h
|
|
jnz near %%flipyfull
|
|
add ecx,[yposng]
|
|
test dword[vrama+eax],4000h
|
|
jnz near %%flipxfull
|
|
mov ebx,[ecx]
|
|
add ebx,edx
|
|
mov [edi],ebx
|
|
mov ebx,[ecx+4]
|
|
add ebx,edx
|
|
mov [edi+4],ebx
|
|
jmp %5
|
|
%%flipxfull
|
|
mov ebx,[ecx+4]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi],ebx
|
|
mov ebx,[ecx]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+4],ebx
|
|
jmp %5
|
|
%%flipyfull
|
|
add ecx,[flipyposng]
|
|
test word[vrama+eax],4000h
|
|
jnz near %%flipxyfull
|
|
mov ebx,[ecx]
|
|
add ebx,edx
|
|
mov [edi],ebx
|
|
mov ebx,[ecx+4]
|
|
add ebx,edx
|
|
mov [edi+4],ebx
|
|
jmp %5
|
|
%%flipxyfull
|
|
mov ebx,[ecx+4]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi],ebx
|
|
mov ebx,[ecx]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+4],ebx
|
|
jmp %5
|
|
%%parttile
|
|
%2
|
|
; start drawing from ecx to edi
|
|
test word[vrama+eax],8000h
|
|
jnz near %%flipypart
|
|
add ecx,[yposng]
|
|
test word[vrama+eax],4000h
|
|
jnz near %%flipxpart
|
|
mov ebx,[ecx]
|
|
or ebx,ebx
|
|
jz %%drawd
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawa
|
|
mov [edi],bl
|
|
%%drawa
|
|
test bh,%8
|
|
jz %%drawb
|
|
mov [edi+1],bh
|
|
%%drawb
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawc
|
|
mov [edi+2],bl
|
|
%%drawc
|
|
test bh,%8
|
|
jz %%drawd
|
|
mov [edi+3],bh
|
|
%%drawd
|
|
mov ebx,[ecx+4]
|
|
or ebx,ebx
|
|
jz %%drawd2
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawa2
|
|
mov [edi+4],bl
|
|
%%drawa2
|
|
test bh,%8
|
|
jz %%drawb2
|
|
mov [edi+5],bh
|
|
%%drawb2
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawc2
|
|
mov [edi+6],bl
|
|
%%drawc2
|
|
test bh,%8
|
|
jz %%drawd2
|
|
mov [edi+7],bh
|
|
%%drawd2
|
|
jmp %5
|
|
|
|
%%flipxpart
|
|
mov ebx,[ecx]
|
|
or ebx,ebx
|
|
jz %%drawdf
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawaf
|
|
mov [edi+7],bl
|
|
%%drawaf
|
|
test bh,%8
|
|
jz %%drawbf
|
|
mov [edi+6],bh
|
|
%%drawbf
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawcf
|
|
mov [edi+5],bl
|
|
%%drawcf
|
|
test bh,%8
|
|
jz %%drawdf
|
|
mov [edi+4],bh
|
|
%%drawdf
|
|
mov ebx,[ecx+4]
|
|
or ebx,ebx
|
|
jz %%drawd2f
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawa2f
|
|
mov [edi+3],bl
|
|
%%drawa2f
|
|
test bh,%8
|
|
jz %%drawb2f
|
|
mov [edi+2],bh
|
|
%%drawb2f
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawc2f
|
|
mov [edi+1],bl
|
|
%%drawc2f
|
|
test bh,%8
|
|
jz %%drawd2f
|
|
mov [edi],bh
|
|
%%drawd2f
|
|
jmp %5
|
|
|
|
%%flipypart
|
|
add ecx,[flipyposng]
|
|
test word[vrama+eax],4000h
|
|
jnz near %%flipxypart
|
|
mov ebx,[ecx]
|
|
or ebx,ebx
|
|
jz %%drawdm
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawam
|
|
mov [edi],bl
|
|
%%drawam
|
|
test bh,%8
|
|
jz %%drawbm
|
|
mov [edi+1],bh
|
|
%%drawbm
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawcm
|
|
mov [edi+2],bl
|
|
%%drawcm
|
|
test bh,%8
|
|
jz %%drawdm
|
|
mov [edi+3],bh
|
|
%%drawdm
|
|
mov ebx,[ecx+4]
|
|
or ebx,ebx
|
|
jz %%drawd2m
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawa2m
|
|
mov [edi+4],bl
|
|
%%drawa2m
|
|
test bh,%8
|
|
jz %%drawb2m
|
|
mov [edi+5],bh
|
|
%%drawb2m
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawc2m
|
|
mov [edi+6],bl
|
|
%%drawc2m
|
|
test bh,%8
|
|
jz %%drawd2m
|
|
mov [edi+7],bh
|
|
%%drawd2m
|
|
jmp %5
|
|
|
|
%%flipxypart
|
|
mov ebx,[ecx]
|
|
or ebx,ebx
|
|
jz %%drawdfm
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawafm
|
|
mov [edi+7],bl
|
|
%%drawafm
|
|
test bh,%8
|
|
jz %%drawbfm
|
|
mov [edi+6],bh
|
|
%%drawbfm
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawcfm
|
|
mov [edi+5],bl
|
|
%%drawcfm
|
|
test bh,%8
|
|
jz %%drawdfm
|
|
mov [edi+4],bh
|
|
%%drawdfm
|
|
mov ebx,[ecx+4]
|
|
or ebx,ebx
|
|
jz %%drawd2fm
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawa2fm
|
|
mov [edi+3],bl
|
|
%%drawa2fm
|
|
test bh,%8
|
|
jz %%drawb2fm
|
|
mov [edi+2],bh
|
|
%%drawb2fm
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawc2fm
|
|
mov [edi+1],bl
|
|
%%drawc2fm
|
|
test bh,%8
|
|
jz %%drawd2fm
|
|
mov [edi],bh
|
|
%%drawd2fm
|
|
%5
|
|
mov ebx,[ng16bbgval]
|
|
add ax,2
|
|
inc dword[bg1totng+ebx*4]
|
|
add edi,8
|
|
test eax,03Fh
|
|
jz %%tileadd
|
|
%%next
|
|
dec byte[tleftn]
|
|
jnz near %4
|
|
pop ebx
|
|
cmp byte[curmosaicsz],1
|
|
jne near domosaicng
|
|
ret
|
|
%%docache
|
|
call %3
|
|
jmp %%returnfromcache
|
|
%%tileadd
|
|
add ax,[bgtxadd]
|
|
jmp %%next
|
|
%endmacro
|
|
|
|
%macro drawlineng16x16 8
|
|
; tile value : bit 15 = flipy, bit 14 = flipx, bit 13 = priority value
|
|
; bit 10-12 = palette, 0-9=tile#
|
|
mov ebx,[ng16bbgval]
|
|
mov dl,ch
|
|
inc dword[bg1drwng+ebx*4]
|
|
and ecx,3FFh
|
|
and edx,1Fh
|
|
add ecx,[ngptrdat2]
|
|
add cx,[taddnfy16x16]
|
|
test dword[vrama+eax],8000h
|
|
jz %%noflipy
|
|
add cx,[taddfy16x16]
|
|
%%noflipy
|
|
test dword[vrama+eax],4000h
|
|
jz %%noflipx
|
|
inc cx
|
|
%%noflipx
|
|
%%nexttile
|
|
push ecx
|
|
push edx
|
|
mov edx,[%6+edx*4]
|
|
%7
|
|
jnz near %%docache
|
|
%%returnfromcache
|
|
cmp byte[%1+ecx],2
|
|
je near %%done
|
|
cmp byte[%1+ecx],0
|
|
je near %%parttile
|
|
%2
|
|
; start drawing from ecx
|
|
test dword[vrama+eax],8000h
|
|
jnz near %%flipyfull
|
|
add ecx,[yposng]
|
|
test dword[vrama+eax],4000h
|
|
jnz near %%flipxfull
|
|
mov ebx,[ecx]
|
|
add ebx,edx
|
|
mov [edi],ebx
|
|
mov ebx,[ecx+4]
|
|
add ebx,edx
|
|
mov [edi+4],ebx
|
|
jmp %%done
|
|
%%flipxfull
|
|
mov ebx,[ecx+4]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi],ebx
|
|
mov ebx,[ecx]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+4],ebx
|
|
jmp %%done
|
|
%%flipyfull
|
|
add ecx,[flipyposng]
|
|
test word[vrama+eax],4000h
|
|
jnz near %%flipxyfull
|
|
mov ebx,[ecx]
|
|
add ebx,edx
|
|
mov [edi],ebx
|
|
mov ebx,[ecx+4]
|
|
add ebx,edx
|
|
mov [edi+4],ebx
|
|
jmp %%done
|
|
%%flipxyfull
|
|
mov ebx,[ecx+4]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi],ebx
|
|
mov ebx,[ecx]
|
|
bswap ebx
|
|
add ebx,edx
|
|
mov [edi+4],ebx
|
|
jmp %%done
|
|
%%parttile
|
|
%2
|
|
; start drawing from ecx to edi
|
|
test word[vrama+eax],8000h
|
|
jnz near %%flipypart
|
|
add ecx,[yposng]
|
|
test word[vrama+eax],4000h
|
|
jnz near %%flipxpart
|
|
mov ebx,[ecx]
|
|
or ebx,ebx
|
|
jz %%drawd
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawa
|
|
mov [edi],bl
|
|
%%drawa
|
|
test bh,%8
|
|
jz %%drawb
|
|
mov [edi+1],bh
|
|
%%drawb
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawc
|
|
mov [edi+2],bl
|
|
%%drawc
|
|
test bh,%8
|
|
jz %%drawd
|
|
mov [edi+3],bh
|
|
%%drawd
|
|
mov ebx,[ecx+4]
|
|
or ebx,ebx
|
|
jz %%drawd2
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawa2
|
|
mov [edi+4],bl
|
|
%%drawa2
|
|
test bh,%8
|
|
jz %%drawb2
|
|
mov [edi+5],bh
|
|
%%drawb2
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawc2
|
|
mov [edi+6],bl
|
|
%%drawc2
|
|
test bh,%8
|
|
jz %%drawd2
|
|
mov [edi+7],bh
|
|
%%drawd2
|
|
jmp %%done
|
|
|
|
%%flipxpart
|
|
mov ebx,[ecx]
|
|
or ebx,ebx
|
|
jz %%drawdf
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawaf
|
|
mov [edi+7],bl
|
|
%%drawaf
|
|
test bh,%8
|
|
jz %%drawbf
|
|
mov [edi+6],bh
|
|
%%drawbf
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawcf
|
|
mov [edi+5],bl
|
|
%%drawcf
|
|
test bh,%8
|
|
jz %%drawdf
|
|
mov [edi+4],bh
|
|
%%drawdf
|
|
mov ebx,[ecx+4]
|
|
or ebx,ebx
|
|
jz %%drawd2f
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawa2f
|
|
mov [edi+3],bl
|
|
%%drawa2f
|
|
test bh,%8
|
|
jz %%drawb2f
|
|
mov [edi+2],bh
|
|
%%drawb2f
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawc2f
|
|
mov [edi+1],bl
|
|
%%drawc2f
|
|
test bh,%8
|
|
jz %%drawd2f
|
|
mov [edi],bh
|
|
%%drawd2f
|
|
jmp %%done
|
|
|
|
%%flipypart
|
|
add ecx,[flipyposng]
|
|
test word[vrama+eax],4000h
|
|
jnz near %%flipxypart
|
|
mov ebx,[ecx]
|
|
or ebx,ebx
|
|
jz %%drawdm
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawam
|
|
mov [edi],bl
|
|
%%drawam
|
|
test bh,%8
|
|
jz %%drawbm
|
|
mov [edi+1],bh
|
|
%%drawbm
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawcm
|
|
mov [edi+2],bl
|
|
%%drawcm
|
|
test bh,%8
|
|
jz %%drawdm
|
|
mov [edi+3],bh
|
|
%%drawdm
|
|
mov ebx,[ecx+4]
|
|
or ebx,ebx
|
|
jz %%drawd2m
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawa2m
|
|
mov [edi+4],bl
|
|
%%drawa2m
|
|
test bh,%8
|
|
jz %%drawb2m
|
|
mov [edi+5],bh
|
|
%%drawb2m
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawc2m
|
|
mov [edi+6],bl
|
|
%%drawc2m
|
|
test bh,%8
|
|
jz %%drawd2m
|
|
mov [edi+7],bh
|
|
%%drawd2m
|
|
jmp %%done
|
|
|
|
%%flipxypart
|
|
mov ebx,[ecx]
|
|
or ebx,ebx
|
|
jz %%drawdfm
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawafm
|
|
mov [edi+7],bl
|
|
%%drawafm
|
|
test bh,%8
|
|
jz %%drawbfm
|
|
mov [edi+6],bh
|
|
%%drawbfm
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawcfm
|
|
mov [edi+5],bl
|
|
%%drawcfm
|
|
test bh,%8
|
|
jz %%drawdfm
|
|
mov [edi+4],bh
|
|
%%drawdfm
|
|
mov ebx,[ecx+4]
|
|
or ebx,ebx
|
|
jz %%drawd2fm
|
|
add ebx,edx
|
|
test bl,%8
|
|
jz %%drawa2fm
|
|
mov [edi+3],bl
|
|
%%drawa2fm
|
|
test bh,%8
|
|
jz %%drawb2fm
|
|
mov [edi+2],bh
|
|
%%drawb2fm
|
|
shr ebx,16
|
|
test bl,%8
|
|
jz %%drawc2fm
|
|
mov [edi+1],bl
|
|
%%drawc2fm
|
|
test bh,%8
|
|
jz %%drawd2fm
|
|
mov [edi],bh
|
|
%%drawd2fm
|
|
%%done
|
|
pop edx
|
|
pop ecx
|
|
inc cx
|
|
test dword[vrama+eax],4000h
|
|
jz %%noflipxb
|
|
sub cx,2
|
|
%%noflipxb
|
|
add edi,8
|
|
xor dword[switch16x16],1
|
|
jnz near %%nexttile
|
|
%%ntile
|
|
mov ebx,[ng16bbgval]
|
|
add ax,2
|
|
inc dword[bg1totng+ebx*4]
|
|
test eax,03Fh
|
|
jz %%tileadd
|
|
%%next
|
|
dec byte[tleftn]
|
|
jnz near %4
|
|
pop ebx
|
|
cmp byte[curmosaicsz],1
|
|
jne near domosaicng
|
|
ret
|
|
%5
|
|
add edi,16
|
|
jmp %%ntile
|
|
%%docache
|
|
call %3
|
|
jmp %%returnfromcache
|
|
%%tileadd
|
|
add ax,[bgtxadd]
|
|
jmp %%next
|
|
%endmacro
|
|
|
|
%macro drawbglineng 2
|
|
mov dword[ng16bprval],0
|
|
mov dword[ng16bbgval],%1
|
|
cmp byte[bgmode],5
|
|
jb %%nointerl
|
|
test byte[intrlng+ebx],01h
|
|
jz %%nointerl
|
|
add ecx,ebx
|
|
add ecx,[cfieldad]
|
|
%%nointerl
|
|
push ebx
|
|
mov byte[curmosaicsz],1
|
|
xor eax,eax
|
|
test byte[mosenng+ebx],1 << %1
|
|
jz %%nomosaic
|
|
mov al,[mosszng+ebx]
|
|
or al,al
|
|
jz %%nomosaic
|
|
inc al
|
|
mov [curmosaicsz],al
|
|
mov cl,al
|
|
mov al,bl
|
|
div cl
|
|
mul cl
|
|
mov ebx,eax
|
|
mov [pesimpng],esi
|
|
mov edi,xtravbuf+16
|
|
mov ecx,64
|
|
xor eax,eax
|
|
mov esi,xtravbuf+16
|
|
rep stosd
|
|
or ebx,ebx
|
|
jnz %%nozeroline
|
|
inc ebx
|
|
%%nozeroline
|
|
mov ecx,[BG1SYl+ebx*2+%1*512]
|
|
and ecx,0FFFFh
|
|
add ecx,ebx
|
|
jmp %%yesmosaic
|
|
%%nomosaic
|
|
cmp byte[BGMA+ebx],5
|
|
jae near .tiles16x8
|
|
%%yesmosaic
|
|
cmp byte[t16x161+ebx+%1*256],1
|
|
je near .tiles16x16
|
|
cmp byte[BGMA+ebx],2
|
|
je near .offsetm
|
|
; cmp byte[BGMA+ebx],4
|
|
; je near .offsetm2
|
|
mov eax,[BGPT1+ebx*2+%1*512]
|
|
test ecx,100h
|
|
jz .noyinc
|
|
add eax,[BGPT1Y+ebx*2+%1*512]
|
|
.noyinc
|
|
lea ecx,[ecx*8]
|
|
mov edx,ecx
|
|
and ecx,07C0h ; 1Fh*40h
|
|
and edx,38h
|
|
add eax,ecx
|
|
mov [yposng],edx
|
|
xor edx,38h
|
|
mov ecx,[BG1SXl+ebx*2+%1*512]
|
|
mov [flipyposng],edx
|
|
mov edx,[BGPT1X+ebx*2+%1*512]
|
|
test ecx,100h
|
|
jz .noxinc
|
|
add eax,edx
|
|
neg dx
|
|
.noxinc
|
|
mov edi,ecx
|
|
sub dx,64
|
|
and ecx,0F8h
|
|
and eax,0FFFFh
|
|
shr ecx,2
|
|
mov [bgtxadd],edx
|
|
mov [bgtxad+ebx*2+%2*512],dx
|
|
add eax,ecx
|
|
mov ecx,[BGOPT1+ebx*2+%1*512]
|
|
mov edx,[BGMA+ebx]
|
|
and edi,07h
|
|
and edx,07h
|
|
and ecx,0FFFFh
|
|
mov edx,[colormodedef+edx*4+%1]
|
|
neg edi
|
|
cmp dl,2
|
|
jne near .no4bit
|
|
shr ecx,5
|
|
add edi,esi
|
|
mov [ngptrdat+%2*1024+ebx*4],ecx
|
|
mov [ngptrdat2],ecx
|
|
mov [ngceax+%2*1024+ebx*4],eax
|
|
mov [ngcedi+%2*1024+ebx*4],edi
|
|
; eax = pointer to beginning of tile area
|
|
jmp drawlineng4b
|
|
.no4bit
|
|
cmp dl,1
|
|
jne near .no2bit
|
|
shr ecx,4
|
|
add edi,esi
|
|
mov [ngptrdat+%2*1024+ebx*4],ecx
|
|
mov [ngptrdat2],ecx
|
|
mov [ngceax+%2*1024+ebx*4],eax
|
|
mov [ngcedi+%2*1024+ebx*4],edi
|
|
; eax = pointer to beginning of tile area
|
|
mov dword[mode0add],0
|
|
cmp byte[BGMA+ebx],0
|
|
jne .nomode0
|
|
mov ebx,[mode0ads]
|
|
mov [mode0add],ebx
|
|
.nomode0
|
|
jmp drawlineng2b
|
|
.no2bit
|
|
cmp dl,3
|
|
jne near .no8bit
|
|
shr ecx,6
|
|
add edi,esi
|
|
mov [ngptrdat+%2*1024+ebx*4],ecx
|
|
mov [ngptrdat2],ecx
|
|
mov [ngceax+%2*1024+ebx*4],eax
|
|
mov [ngcedi+%2*1024+ebx*4],edi
|
|
; eax = pointer to beginning of tile area
|
|
jmp drawlineng8b
|
|
.no8bit
|
|
pop ebx
|
|
ret
|
|
|
|
.tiles16x16
|
|
mov dword[taddnfy16x16],0
|
|
mov dword[taddfy16x16],16
|
|
test ecx,08h
|
|
jz .nobottomy
|
|
mov dword[taddnfy16x16],16
|
|
mov dword[taddfy16x16],-16
|
|
.nobottomy
|
|
mov eax,[BGPT1+ebx*2+%1*512]
|
|
test ecx,200h
|
|
jz .noyinc2
|
|
add eax,[BGPT1Y+ebx*2+%1*512]
|
|
.noyinc2
|
|
lea edx,[ecx*8]
|
|
lea ecx,[ecx*4]
|
|
and edx,38h
|
|
and ecx,07C0h ; 1Fh*40h
|
|
mov [yposng],edx
|
|
xor edx,38h
|
|
add eax,ecx
|
|
mov [flipyposng],edx
|
|
mov ecx,[BG1SXl+ebx*2+%1*512]
|
|
mov edx,[BGPT1X+ebx*2+%1*512]
|
|
test ecx,200h
|
|
jz .noxinc2
|
|
add eax,edx
|
|
neg dx
|
|
.noxinc2
|
|
mov edi,ecx
|
|
sub dx,64
|
|
and ecx,1F0h
|
|
and eax,0FFFFh
|
|
shr ecx,3
|
|
mov [bgtxadd],edx
|
|
mov [bgtxad+ebx*2+%2*512],dx
|
|
add eax,ecx
|
|
mov ecx,[BGOPT1+ebx*2+%1*512]
|
|
mov edx,[BGMA+ebx]
|
|
and edi,0Fh
|
|
and edx,07h
|
|
and ecx,0FFFFh
|
|
mov edx,[colormodedef+edx*4+%1]
|
|
neg edi
|
|
cmp dl,2
|
|
jne near .no4bit2
|
|
shr ecx,5
|
|
add edi,esi
|
|
mov [ngptrdat+%2*1024+ebx*4],ecx
|
|
mov [ngptrdat2],ecx
|
|
mov [ngceax+%2*1024+ebx*4],eax
|
|
mov [ngcedi+%2*1024+ebx*4],edi
|
|
; eax = pointer to beginning of tile area
|
|
jmp drawlineng16x164b
|
|
.no4bit2
|
|
cmp dl,1
|
|
jne near .no2bit2
|
|
shr ecx,4
|
|
add edi,esi
|
|
mov [ngptrdat+%2*1024+ebx*4],ecx
|
|
mov [ngptrdat2],ecx
|
|
mov [ngceax+%2*1024+ebx*4],eax
|
|
mov [ngcedi+%2*1024+ebx*4],edi
|
|
; eax = pointer to beginning of tile area
|
|
mov dword[mode0add],0
|
|
cmp byte[BGMA+ebx],0
|
|
jne .nomode02
|
|
mov ebx,[mode0ads]
|
|
mov [mode0add],ebx
|
|
.nomode02
|
|
jmp drawlineng16x162b
|
|
.no2bit2
|
|
cmp dl,3
|
|
jne near .no8bit
|
|
shr ecx,6
|
|
add edi,esi
|
|
mov [ngptrdat+%2*1024+ebx*4],ecx
|
|
mov [ngptrdat2],ecx
|
|
mov [ngceax+%2*1024+ebx*4],eax
|
|
mov [ngcedi+%2*1024+ebx*4],edi
|
|
; eax = pointer to beginning of tile area
|
|
jmp drawlineng16x168b
|
|
.no8bit2
|
|
pop ebx
|
|
ret
|
|
|
|
.tiles16x8
|
|
cmp byte[t16x161+ebx+%1*256],1
|
|
je .tiles16x16hr
|
|
mov dword[taddnfy16x16],0
|
|
mov dword[taddfy16x16],0
|
|
mov eax,[BGPT1+ebx*2+%1*512]
|
|
test ecx,100h
|
|
jz .noyinc2c
|
|
add eax,[BGPT1Y+ebx*2+%1*512]
|
|
.noyinc2c
|
|
lea ecx,[ecx*8]
|
|
mov edx,ecx
|
|
and ecx,07C0h ; 1Fh*40h
|
|
and edx,38h
|
|
jmp .tiles16x8hr
|
|
.tiles16x16hr
|
|
mov dword[taddnfy16x16],0
|
|
mov dword[taddfy16x16],16
|
|
test ecx,08h
|
|
jz .nobottomy2
|
|
mov dword[taddnfy16x16],16
|
|
mov dword[taddfy16x16],-16
|
|
.nobottomy2
|
|
mov eax,[BGPT1+ebx*2+%1*512]
|
|
test ecx,200h
|
|
jz .noyinc2b
|
|
add eax,[BGPT1Y+ebx*2+%1*512]
|
|
.noyinc2b
|
|
lea edx,[ecx*8]
|
|
lea ecx,[ecx*4]
|
|
and edx,38h
|
|
and ecx,07C0h ; 1Fh*40h
|
|
.tiles16x8hr
|
|
mov [yposng],edx
|
|
xor edx,38h
|
|
add eax,ecx
|
|
mov [flipyposng],edx
|
|
mov ecx,[BG1SXl+ebx*2+%1*512]
|
|
add ecx,ecx
|
|
mov edx,[BGPT1X+ebx*2+%1*512]
|
|
test ecx,200h
|
|
jz .noxinc2b
|
|
add eax,edx
|
|
neg dx
|
|
.noxinc2b
|
|
mov edi,ecx
|
|
sub dx,64
|
|
and ecx,01F0h
|
|
and eax,0FFFFh
|
|
shr ecx,3
|
|
mov [bgtxadd],edx
|
|
mov [bgtxad+ebx*2+%2*512],dx
|
|
add eax,ecx
|
|
mov ecx,[BGOPT1+ebx*2+%1*512]
|
|
mov edx,[BGMA+ebx]
|
|
and edi,0Fh
|
|
and edx,07h
|
|
and ecx,0FFFFh
|
|
shr edi,1
|
|
mov edx,[colormodedef+edx*4+%1]
|
|
neg edi
|
|
cmp dl,2
|
|
jne near .no4bit2b
|
|
shr ecx,5
|
|
add edi,esi
|
|
mov [ngptrdat+%2*1024+ebx*4],ecx
|
|
mov [ngptrdat2],ecx
|
|
mov [ngceax+%2*1024+ebx*4],eax
|
|
mov [ngcedi+%2*1024+ebx*4],edi
|
|
; eax = pointer to beginning of tile area
|
|
mov byte[tleftn],33
|
|
.loop2b
|
|
mov cx,[vrama+eax]
|
|
test ecx,2000h
|
|
jnz near .fintile2b
|
|
drawlineng16x8 tltype4b, preparet4ba, cachesingle4bng,.loop2b,.fintile2b,ngpalcon4b,test4ba,0Fh,%1
|
|
.no4bit2b
|
|
cmp dl,1
|
|
jne near .no2bit2b
|
|
shr ecx,4
|
|
add edi,esi
|
|
mov [ngptrdat+%2*1024+ebx*4],ecx
|
|
mov [ngptrdat2],ecx
|
|
mov [ngceax+%2*1024+ebx*4],eax
|
|
mov [ngcedi+%2*1024+ebx*4],edi
|
|
; eax = pointer to beginning of tile area
|
|
mov dword[mode0add],0
|
|
mov byte[tleftn],33
|
|
.loopb2b
|
|
mov cx,[vrama+eax]
|
|
test ecx,2000h
|
|
jnz near .fintileb2b
|
|
drawlineng16x8 tltype2b, preparet2ba, cachesingle2bng,.loopb2b,.fintileb2b,ngpalcon2b,test2ba,03h,%1
|
|
.no2bit2b
|
|
pop ebx
|
|
ret
|
|
|
|
; Offsetmode calculation : <b2-7,2109>*1024+<b3-7,2112>*32+<b3-7,2111>
|
|
.offsetm
|
|
xor edx,edx
|
|
mov dx,[BG3SYl+ebx*2]
|
|
and dx,0F8h
|
|
shr edx,3
|
|
shl edx,6
|
|
xor eax,eax
|
|
mov ax,[BGPT3+ebx*2]
|
|
add ax,dx
|
|
xor edx,edx
|
|
mov dx,[BG3SXl+ebx*2]
|
|
and dx,0F8h
|
|
mov [ofsmcyps],ebx
|
|
shr edx,3
|
|
shl edx,1
|
|
add ax,dx
|
|
add eax,40h
|
|
mov edx,eax
|
|
and edx,0FFFFFFC0h
|
|
add edx,[vram]
|
|
mov [ofsmcptr],edx
|
|
and eax,3Fh
|
|
mov [ofsmcptr2],eax
|
|
mov eax,[BGPT1Y+ebx*2+%1*512]
|
|
mov [ofsmady],eax
|
|
mov eax,[BGPT1X+ebx*2+%1*512]
|
|
mov [ofsmadx],eax
|
|
mov eax,[BGPT1+ebx*2+%1*512]
|
|
mov [ofsmtptr],eax
|
|
mov [ofsmtptrs],eax
|
|
test ecx,100h
|
|
jz .noyincd
|
|
add eax,[BGPT1Y+ebx*2+%1*512]
|
|
.noyincd
|
|
lea ecx,[ecx*8]
|
|
mov edx,ecx
|
|
and ecx,07C0h ; 1Fh*40h
|
|
and edx,38h
|
|
add eax,ecx
|
|
mov [yposng],edx
|
|
mov [yposngom],edx
|
|
xor edx,38h
|
|
mov ecx,[BG1SXl+ebx*2+%1*512]
|
|
mov [flipyposng],edx
|
|
mov [flipyposngom],edx
|
|
mov edx,[BGPT1X+ebx*2+%1*512]
|
|
test ecx,100h
|
|
jz .noxincd
|
|
add eax,edx
|
|
add [ofsmtptr],edx
|
|
neg dx
|
|
.noxincd
|
|
mov edi,ecx
|
|
sub dx,64
|
|
and ecx,0F8h
|
|
and eax,0FFFFh
|
|
shr ecx,2
|
|
mov [bgtxadd],edx
|
|
mov [bgtxad+ebx*2+%2*512],dx
|
|
add eax,ecx
|
|
add [ofsmtptr],ecx
|
|
mov [ofsmmptr],eax
|
|
mov dword[ofshvaladd],0
|
|
mov ecx,[BGOPT1+ebx*2+%1*512]
|
|
mov edx,[BGMA+ebx]
|
|
and edi,07h
|
|
and edx,07h
|
|
and ecx,0FFFFh
|
|
mov edx,[colormodedef+edx*4+%1]
|
|
neg edi
|
|
cmp dl,2
|
|
jne near .no4bitd
|
|
shr ecx,5
|
|
add edi,esi
|
|
mov [ngptrdat+%2*1024+ebx*4],ecx
|
|
mov [ngptrdat2],ecx
|
|
mov [ngceax+%2*1024+ebx*4],eax
|
|
mov [ngcedi+%2*1024+ebx*4],edi
|
|
; eax = pointer to beginning of tile area
|
|
mov byte[tleftn],33
|
|
.loopd
|
|
mov cx,[vrama+eax]
|
|
test ecx,2000h
|
|
jnz near .fintiled
|
|
drawlinengom tltype4b, preparet4ba, cachesingle4bng,.loopd,.fintiled,ngpalcon4b,test4ba,0Fh,%1
|
|
.no4bitd
|
|
pop ebx
|
|
ret
|
|
|
|
.offsetm2
|
|
xor edx,edx
|
|
mov dx,[BG3SYl+ebx*2]
|
|
and dx,0F8h
|
|
shr edx,3
|
|
shl edx,6
|
|
xor eax,eax
|
|
mov ax,[BGPT3+ebx*2]
|
|
add ax,dx
|
|
xor edx,edx
|
|
mov dx,[BG3SXl+ebx*2]
|
|
and dx,0F8h
|
|
mov [ofsmcyps],ebx
|
|
shr edx,3
|
|
shl edx,1
|
|
add ax,dx
|
|
add eax,40h
|
|
mov edx,eax
|
|
and edx,0FFFFFFC0h
|
|
add edx,[vram]
|
|
mov [ofsmcptr],edx
|
|
and eax,3Fh
|
|
mov [ofsmcptr2],eax
|
|
mov eax,[BGPT1Y+ebx*2+%1*512]
|
|
mov [ofsmady],eax
|
|
mov eax,[BGPT1X+ebx*2+%1*512]
|
|
mov [ofsmadx],eax
|
|
mov eax,[BGPT1+ebx*2+%1*512]
|
|
mov [ofsmtptr],eax
|
|
mov [ofsmtptrs],eax
|
|
test ecx,100h
|
|
jz .noyincdn
|
|
add eax,[BGPT1Y+ebx*2+%1*512]
|
|
.noyincdn
|
|
lea ecx,[ecx*8]
|
|
mov edx,ecx
|
|
and ecx,07C0h ; 1Fh*40h
|
|
and edx,38h
|
|
add eax,ecx
|
|
mov [yposng],edx
|
|
mov [yposngom],edx
|
|
xor edx,38h
|
|
mov ecx,[BG1SXl+ebx*2+%1*512]
|
|
mov [flipyposng],edx
|
|
mov [flipyposngom],edx
|
|
mov edx,[BGPT1X+ebx*2+%1*512]
|
|
test ecx,100h
|
|
jz .noxincdn
|
|
add eax,edx
|
|
add [ofsmtptr],edx
|
|
neg dx
|
|
.noxincdn
|
|
mov edi,ecx
|
|
sub dx,64
|
|
and ecx,0F8h
|
|
and eax,0FFFFh
|
|
shr ecx,2
|
|
mov [bgtxadd],edx
|
|
mov [bgtxad+ebx*2+%2*512],dx
|
|
add eax,ecx
|
|
add [ofsmtptr],ecx
|
|
mov [ofsmmptr],eax
|
|
mov dword[ofshvaladd],0
|
|
mov ecx,[BGOPT1+ebx*2+%1*512]
|
|
mov edx,[BGMA+ebx]
|
|
and edi,07h
|
|
and edx,07h
|
|
and ecx,0FFFFh
|
|
mov edx,[colormodedef+edx*4+%1]
|
|
neg edi
|
|
cmp dl,1
|
|
jne near .no2bitdn
|
|
; eax = pointer to beginning of tile area
|
|
shr ecx,4
|
|
add edi,esi
|
|
mov [ngptrdat+%2*1024+ebx*4],ecx
|
|
mov [ngptrdat2],ecx
|
|
mov [ngceax+%2*1024+ebx*4],eax
|
|
mov [ngcedi+%2*1024+ebx*4],edi
|
|
; eax = pointer to beginning of tile area
|
|
mov dword[mode0add],0
|
|
mov byte[tleftn],33
|
|
.loopdn
|
|
mov cx,[vrama+eax]
|
|
test cx,2000h
|
|
jnz near .fintiledn
|
|
drawlinengom2 tltype2b, preparet2ba, cachesingle2bng,.loopdn,.fintiledn,ngpalcon2b,test2ba,03h,%1
|
|
.no2bitdn
|
|
cmp dl,3
|
|
jne near .no8bitdn
|
|
; eax = pointer to beginning of tile area
|
|
shr ecx,6
|
|
add edi,esi
|
|
mov [ngptrdat+%2*1024+ebx*4],ecx
|
|
mov [ngptrdat2],ecx
|
|
mov [ngceax+%2*1024+ebx*4],eax
|
|
mov [ngcedi+%2*1024+ebx*4],edi
|
|
; eax = pointer to beginning of tile area
|
|
mov byte[tleftn],33
|
|
.loopdn2
|
|
mov cx,[vrama+eax]
|
|
test cx,2000h
|
|
jnz near .fintiledn2
|
|
drawlinengom2 tltype8b, preparet8ba, cachesingle8bng,.loopdn2,.fintiledn2,ngpalcon8b,test8ba,0FFh,%1
|
|
.no8bitdn
|
|
pop ebx
|
|
ret
|
|
%endmacro
|
|
|
|
%macro mosender 1
|
|
.nodraw
|
|
add edi,%1
|
|
add esi,%1
|
|
dec ecx
|
|
jnz .next
|
|
pop esi
|
|
mov dword[ignor512],0
|
|
ret
|
|
%endmacro
|
|
|
|
%macro drawbglinengpr1 2
|
|
mov dword[ng16bprval],2000h
|
|
mov dword[ng16bbgval],%1
|
|
push ebx
|
|
mov byte[curmosaicsz],1
|
|
xor eax,eax
|
|
test byte[mosenng+ebx],1 << %1
|
|
jz %%nomosaic
|
|
mov al,[mosszng+ebx]
|
|
or al,al
|
|
jz %%nomosaic
|
|
inc al
|
|
mov [curmosaicsz],al
|
|
mov cl,al
|
|
mov al,bl
|
|
div cl
|
|
mul cl
|
|
mov ebx,eax
|
|
mov [pesimpng],esi
|
|
mov edi,xtravbuf+16
|
|
mov ecx,64
|
|
xor eax,eax
|
|
mov esi,xtravbuf+16
|
|
rep stosd
|
|
or ebx,ebx
|
|
jnz %%nomosaic
|
|
inc ebx
|
|
jmp %%yesmosaic
|
|
%%nomosaic
|
|
cmp byte[BGMA+ebx],5
|
|
jae near .tiles16x8
|
|
%%yesmosaic
|
|
cmp byte[t16x161+ebx+%1*256],1
|
|
je near .tiles16x16
|
|
cmp byte[BGMA+ebx],2
|
|
je near .offsetm
|
|
; cmp byte[BGMA+ebx],4
|
|
; je near .offsetm2
|
|
mov eax,[BG1SYl+ebx*2+%1*512]
|
|
and eax,0FFFFh
|
|
add eax,ebx
|
|
lea eax,[eax*8]
|
|
and eax,38h
|
|
mov [yposng],eax
|
|
xor eax,38h
|
|
mov [flipyposng],eax
|
|
|
|
mov edx,[BGMA+ebx]
|
|
mov ecx,[bgtxad+ebx*2+%2*512]
|
|
and edx,07h
|
|
mov [bgtxadd],cx
|
|
mov ecx,[ngptrdat+%2*1024+ebx*4]
|
|
mov edx,[colormodedef+edx*4+%1]
|
|
mov [ngptrdat2],ecx
|
|
mov eax,[ngceax+%2*1024+ebx*4]
|
|
mov edi,[ngcedi+%2*1024+ebx*4]
|
|
cmp dl,2
|
|
jne near .no4bit
|
|
; eax = pointer to beginning of tile area
|
|
jmp drawlineng4b
|
|
.no4bit
|
|
cmp dl,1
|
|
jne near .no2bit
|
|
; eax = pointer to beginning of tile area
|
|
mov dword[mode0add],0
|
|
cmp byte[BGMA+ebx],0
|
|
jne .nomode0
|
|
mov ebx,[mode0ads]
|
|
mov [mode0add],ebx
|
|
.nomode0
|
|
jmp drawlineng2b
|
|
.no2bit
|
|
cmp dl,3
|
|
jne near .no8bit
|
|
; eax = pointer to beginning of tile area
|
|
jmp drawlineng8b
|
|
.no8bit
|
|
pop ebx
|
|
ret
|
|
|
|
.tiles16x16
|
|
mov ecx,[BG1SYl+ebx*2+%1*512]
|
|
and ecx,0FFFFh
|
|
mov dword[taddnfy16x16],0
|
|
add ecx,ebx
|
|
mov dword[taddfy16x16],16
|
|
test ecx,08h
|
|
jz .nobottomy
|
|
mov dword[taddnfy16x16],16
|
|
mov dword[taddfy16x16],-16
|
|
.nobottomy
|
|
|
|
lea eax,[ecx*8]
|
|
and eax,38h
|
|
mov [yposng],eax
|
|
xor eax,38h
|
|
mov [flipyposng],eax
|
|
|
|
mov edx,[BGMA+ebx]
|
|
mov ecx,[bgtxad+ebx*2+%2*512]
|
|
and edx,07h
|
|
mov [bgtxadd],cx
|
|
mov ecx,[ngptrdat+%2*1024+ebx*4]
|
|
mov edx,[colormodedef+edx*4+%1]
|
|
mov [ngptrdat2],ecx
|
|
mov eax,[ngceax+%2*1024+ebx*4]
|
|
mov edi,[ngcedi+%2*1024+ebx*4]
|
|
cmp dl,2
|
|
jne near .no4bit2
|
|
; eax = pointer to beginning of tile area
|
|
jmp drawlineng16x164b
|
|
.no4bit2
|
|
cmp dl,1
|
|
jne near .no2bit2
|
|
; eax = pointer to beginning of tile area
|
|
mov dword[mode0add],0
|
|
cmp byte[BGMA+ebx],0
|
|
jne .nomode02
|
|
mov ebx,[mode0ads]
|
|
mov [mode0add],ebx
|
|
.nomode02
|
|
jmp drawlineng16x162b
|
|
.no2bit2
|
|
cmp dl,3
|
|
jne near .no8bit2
|
|
; eax = pointer to beginning of tile area
|
|
jmp drawlineng16x168b
|
|
.no8bit2
|
|
pop ebx
|
|
ret
|
|
|
|
.tiles16x8
|
|
mov ecx,[BG1SYl+ebx*2+%1*512]
|
|
and ecx,0FFFFh
|
|
add ecx,ebx
|
|
mov dword[taddnfy16x16],0
|
|
mov dword[taddfy16x16],16
|
|
test ecx,08h
|
|
jz .nobottomyb
|
|
mov dword[taddnfy16x16],16
|
|
mov dword[taddfy16x16],-16
|
|
.nobottomyb
|
|
cmp byte[t16x161+ebx+%1*256],1
|
|
je near .tiles16x16hr
|
|
mov dword[taddnfy16x16],0
|
|
mov dword[taddfy16x16],0
|
|
.tiles16x16hr
|
|
|
|
lea eax,[ecx*8]
|
|
and eax,38h
|
|
mov [yposng],eax
|
|
xor eax,38h
|
|
mov [flipyposng],eax
|
|
|
|
mov edx,[BGMA+ebx]
|
|
mov ecx,[bgtxad+ebx*2+%2*512]
|
|
and edx,07h
|
|
mov [bgtxadd],cx
|
|
mov ecx,[ngptrdat+%2*1024+ebx*4]
|
|
mov edx,[colormodedef+edx*4+%1]
|
|
mov [ngptrdat2],ecx
|
|
mov eax,[ngceax+%2*1024+ebx*4]
|
|
mov edi,[ngcedi+%2*1024+ebx*4]
|
|
cmp dl,2
|
|
jne near .no4bit2b
|
|
; eax = pointer to beginning of tile area
|
|
mov byte[tleftn],33
|
|
.loop2b
|
|
mov cx,[vrama+eax]
|
|
test cx,2000h
|
|
jz near .fintile2b
|
|
drawlineng16x8 tltype4b, preparet4ba, cachesingle4bng,.loop2b,.fintile2b,ngpalcon4b,test4ba,0Fh,%1
|
|
pop ebx
|
|
ret
|
|
.no4bit2b
|
|
cmp dl,1
|
|
jne near .no2bit2b
|
|
; eax = pointer to beginning of tile area
|
|
mov dword[mode0add],0
|
|
mov byte[tleftn],33
|
|
.loopb2b
|
|
mov cx,[vrama+eax]
|
|
test ecx,2000h
|
|
jz near .fintileb2b
|
|
drawlineng16x8 tltype2b, preparet2ba, cachesingle2bng,.loopb2b,.fintileb2b,ngpalcon2b,test2ba,03h,%1
|
|
pop ebx
|
|
ret
|
|
.no2bit2b
|
|
pop ebx
|
|
ret
|
|
|
|
.offsetm
|
|
xor edx,edx
|
|
mov dx,[BG3SYl+ebx*2]
|
|
; and dx,0F8h
|
|
shr edx,3
|
|
shl edx,6
|
|
xor eax,eax
|
|
mov ax,[BGPT3+ebx*2]
|
|
add ax,dx
|
|
xor edx,edx
|
|
mov dx,[BG3SXl+ebx*2]
|
|
and dx,0F8h
|
|
mov [ofsmcyps],ebx
|
|
shr edx,3
|
|
shl edx,1
|
|
add ax,dx
|
|
mov edx,eax
|
|
add edx,40h
|
|
and edx,0FFC0h
|
|
add edx,[vram]
|
|
mov [ofsmcptr],edx
|
|
and eax,3Fh
|
|
mov [ofsmcptr2],eax
|
|
mov eax,[BGPT1Y+ebx*2+%1*512]
|
|
mov [ofsmady],eax
|
|
mov eax,[BGPT1X+ebx*2+%1*512]
|
|
mov [ofsmadx],eax
|
|
mov eax,[BGPT1+ebx*2+%1*512]
|
|
mov [ofsmtptr],eax
|
|
mov [ofsmtptrs],eax
|
|
mov ecx,[BG1SXl+ebx*2+%1*512]
|
|
mov edx,[BGPT1X+ebx*2+%1*512]
|
|
test ecx,100h
|
|
jz .noxincdd
|
|
add [ofsmtptr],edx
|
|
.noxincdd
|
|
and ecx,0F8h
|
|
shr ecx,2
|
|
add [ofsmtptr],ecx
|
|
mov eax,[BG1SYl+ebx*2+%1*512]
|
|
and eax,0FFFFh
|
|
add eax,ebx
|
|
lea eax,[eax*8]
|
|
and eax,38h
|
|
mov [yposng],eax
|
|
mov [yposngom],eax
|
|
xor eax,38h
|
|
mov [flipyposng],eax
|
|
mov [flipyposngom],eax
|
|
mov edx,[BGMA+ebx]
|
|
mov ecx,[bgtxad+ebx*2+%2*512]
|
|
and edx,07h
|
|
mov [bgtxadd],cx
|
|
mov ecx,[ngptrdat+%2*1024+ebx*4]
|
|
mov edx,[colormodedef+edx*4+%1]
|
|
mov [ngptrdat2],ecx
|
|
mov eax,[ngceax+%2*1024+ebx*4]
|
|
mov edi,[ngcedi+%2*1024+ebx*4]
|
|
mov [ofsmmptr],eax
|
|
mov dword[ofshvaladd],0
|
|
cmp dl,2
|
|
jne near .no4bitd
|
|
; eax = pointer to beginning of tile area
|
|
mov byte[tleftn],33
|
|
.loopd
|
|
mov cx,[vrama+eax]
|
|
test cx,2000h
|
|
jz near .fintiled
|
|
drawlinengom tltype4b, preparet4ba, cachesingle4bng,.loopd,.fintiled,ngpalcon4b,test4ba,0Fh,%1
|
|
.no4bitd
|
|
pop ebx
|
|
ret
|
|
|
|
.offsetm2
|
|
xor edx,edx
|
|
mov dx,[BG3SYl+ebx*2]
|
|
and dx,0F8h
|
|
shr edx,3
|
|
shl edx,6
|
|
xor eax,eax
|
|
mov ax,[BGPT3+ebx*2]
|
|
add ax,dx
|
|
xor edx,edx
|
|
mov dx,[BG3SXl+ebx*2]
|
|
and dx,0F8h
|
|
mov [ofsmcyps],ebx
|
|
shr edx,3
|
|
shl edx,1
|
|
add ax,dx
|
|
mov edx,eax
|
|
add edx,40h
|
|
and edx,0FFC0h
|
|
add edx,[vram]
|
|
mov [ofsmcptr],edx
|
|
and eax,3Fh
|
|
mov [ofsmcptr2],eax
|
|
mov eax,[BGPT1Y+ebx*2+%1*512]
|
|
mov [ofsmady],eax
|
|
mov eax,[BGPT1X+ebx*2+%1*512]
|
|
mov [ofsmadx],eax
|
|
mov eax,[BGPT1+ebx*2+%1*512]
|
|
mov [ofsmtptr],eax
|
|
mov [ofsmtptrs],eax
|
|
mov ecx,[BG1SXl+ebx*2+%1*512]
|
|
mov edx,[BGPT1X+ebx*2+%1*512]
|
|
test ecx,100h
|
|
jz .noxincddn
|
|
add [ofsmtptr],edx
|
|
.noxincddn
|
|
and ecx,0F8h
|
|
shr ecx,2
|
|
add [ofsmtptr],ecx
|
|
mov eax,[BG1SYl+ebx*2+%1*512]
|
|
and eax,0FFFFh
|
|
add eax,ebx
|
|
lea eax,[eax*8]
|
|
and eax,38h
|
|
mov [yposng],eax
|
|
mov [yposngom],eax
|
|
xor eax,38h
|
|
mov [flipyposng],eax
|
|
mov [flipyposngom],eax
|
|
mov edx,[BGMA+ebx]
|
|
mov ecx,[bgtxad+ebx*2+%2*512]
|
|
and edx,07h
|
|
mov [bgtxadd],cx
|
|
mov ecx,[ngptrdat+%2*1024+ebx*4]
|
|
mov edx,[colormodedef+edx*4+%1]
|
|
mov [ngptrdat2],ecx
|
|
mov eax,[ngceax+%2*1024+ebx*4]
|
|
mov edi,[ngcedi+%2*1024+ebx*4]
|
|
mov [ofsmmptr],eax
|
|
mov dword[ofshvaladd],0
|
|
cmp dl,1
|
|
jne near .no2bitdn
|
|
; eax = pointer to beginning of tile area
|
|
mov byte[tleftn],33
|
|
.loopdn
|
|
mov cx,[vrama+eax]
|
|
test cx,2000h
|
|
jz near .fintiledn
|
|
drawlinengom2 tltype2b, preparet2ba, cachesingle2bng,.loopdn,.fintiledn,ngpalcon2b,test2ba,03h,%1
|
|
.no2bitdn
|
|
cmp dl,3
|
|
jne near .no8bitdn
|
|
; eax = pointer to beginning of tile area
|
|
mov byte[tleftn],33
|
|
.loopdn2
|
|
mov cx,[vrama+eax]
|
|
test cx,2000h
|
|
jz near .fintiledn2
|
|
drawlinengom2 tltype8b, preparet8ba, cachesingle8bng,.loopdn2,.fintiledn2,ngpalcon8b,test8ba,0FFh,%1
|
|
.no8bitdn
|
|
pop ebx
|
|
ret
|
|
%endmacro
|
|
|
|
|