📄 newgfxb.mac
字号:
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -