📄 newgfx16.asm
字号:
or cl,20h
and cl,[scaddtype]
and cl,3Fh
mov byte[FillSubScr+eax],1
or cl,cl
jnz .yessub
xor bh,bh
mov byte[FillSubScr+eax],0
.yessub
pop ecx
test byte[scaddset],2
jnz .subscrnon
xor bh,bh
.subscrnon
or [bgcmsung],ebx
mov [BGMS1+eax*2],ebx
cmp [BGMS1+eax*2-2],bx
je .nosbgms1
mov byte[bgallchange+eax],1
.nosbgms1
; if palette[0] = 0 and transparency is just add to back area,
; set ngmsdraw to 1
mov byte[clinemainsub],0
cmp word[cgram],0
jne .ngmsdraw0
mov bl,[scrnon]
and bl,1Fh
or bl,0E0h
and bl,[scaddtype]
cmp bl,20h
jne .ngmsdraw0
mov byte[ngmsdraw],1
mov byte[FillSubScr+eax],0
mov byte[clinemainsub],1
.ngmsdraw0
; Scroll Values
mov bx,[bg1scrolx]
mov [BG1SXl+eax*2],bx
cmp [BG1SXl+eax*2-2],bx
je .nosbgx1
mov byte[bg1change+eax],1
.nosbgx1
mov bx,[bg2scrolx]
mov [BG2SXl+eax*2],bx
cmp [BG2SXl+eax*2-2],bx
je .nosbgx2
mov byte[bg2change+eax],1
.nosbgx2
mov bx,[bg3scrolx]
mov [BG3SXl+eax*2],bx
cmp [BG3SXl+eax*2-2],bx
je .nosbgx3
mov byte[bg3change+eax],1
.nosbgx3
mov bx,[bg4scrolx]
mov [BG4SXl+eax*2],bx
cmp [BG4SXl+eax*2-2],bx
je .nosbgx4
mov byte[bg4change+eax],1
.nosbgx4
mov bx,[bg1scroly]
mov [BG1SYl+eax*2],bx
cmp [BG1SYl+eax*2-2],bx
je .nosbgy1
mov byte[bg1change+eax],1
.nosbgy1
mov bx,[bg2scroly]
mov [BG2SYl+eax*2],bx
cmp [BG2SYl+eax*2-2],bx
je .nosbgy2
mov byte[bg2change+eax],1
.nosbgy2
mov bx,[bg3scroly]
mov [BG3SYl+eax*2],bx
cmp [BG3SYl+eax*2-2],bx
je .nosbgy3
mov byte[bg3change+eax],1
.nosbgy3
mov bx,[bg4scroly]
mov [BG4SYl+eax*2],bx
cmp [BG4SYl+eax*2-2],bx
je .nosbgy4
mov byte[bg1change+eax],1
.nosbgy4
; Background Mode
mov bl,[bgmode]
and bl,07h
mov [BGMA+eax],bl
cmp bl,4
je .changedmode4
cmp [BGMA+eax-1],bl
je .nobgma
.changedmode4
mov byte[bgallchange+eax],1
.nobgma
; new graphics fix, thanks to TRAC
and ebx,07h
mov byte[modeused+ebx],1
; Pointer to OBJ tile data
mov ebx,[bg1objptr]
mov [BGOPT1+eax*2],ebx
cmp [BGOPT1+eax*2-2],bx
je .nosbgo1
mov byte[bg1change+eax],1
.nosbgo1
mov ebx,[bg2objptr]
mov [BGOPT2+eax*2],ebx
cmp [BGOPT2+eax*2-2],bx
je .nosbgo2
mov byte[bg2change+eax],1
.nosbgo2
mov ebx,[bg3objptr]
mov [BGOPT3+eax*2],ebx
cmp [BGOPT3+eax*2-2],bx
je .nosbgo3
mov byte[bg3change+eax],1
.nosbgo3
mov ebx,[bg4objptr]
mov [BGOPT4+eax*2],ebx
cmp [BGOPT4+eax*2-2],bx
je .nosbgo4
mov byte[bg4change+eax],1
.nosbgo4
; Pointer to tile status data
mov ebx,[bg1ptr]
mov [BGPT1+eax*2],ebx
cmp [BGPT1+eax*2-2],bx
je .nosbgp1
mov byte[bg1change+eax],1
.nosbgp1
mov ebx,[bg2ptr]
mov [BGPT2+eax*2],ebx
cmp [BGPT2+eax*2-2],bx
je .nosbgp2
mov byte[bg2change+eax],1
.nosbgp2
mov ebx,[bg3ptr]
mov [BGPT3+eax*2],ebx
cmp [BGPT3+eax*2-2],bx
je .nosbgp3
mov byte[bg3change+eax],1
.nosbgp3
mov ebx,[bg4ptr]
mov [BGPT4+eax*2],ebx
cmp [BGPT4+eax*2-2],bx
je .nosbgp4
mov byte[bg4change+eax],1
.nosbgp4
mov ebx,[bg1ptrx]
mov [BGPT1X+eax*2],ebx
cmp [BGPT1X+eax*2-2],bx
je .nosbgpx1
mov byte[bg1change+eax],1
.nosbgpx1
mov ebx,[bg2ptrx]
mov [BGPT2X+eax*2],ebx
cmp [BGPT2X+eax*2-2],bx
je .nosbgpx2
mov byte[bg2change+eax],1
.nosbgpx2
mov ebx,[bg3ptrx]
mov [BGPT3X+eax*2],ebx
cmp [BGPT3X+eax*2-2],bx
je .nosbgpx3
mov byte[bg3change+eax],1
.nosbgpx3
mov ebx,[bg4ptrx]
mov [BGPT4X+eax*2],ebx
cmp [BGPT4X+eax*2-2],bx
je .nosbgpx4
mov byte[bg4change+eax],1
.nosbgpx4
mov ebx,[bg1ptry]
mov [BGPT1Y+eax*2],ebx
cmp [BGPT1Y+eax*2-2],bx
je .nosbgpy1
mov byte[bg1change+eax],1
.nosbgpy1
mov ebx,[bg2ptry]
mov [BGPT2Y+eax*2],ebx
cmp [BGPT2Y+eax*2-2],bx
je .nosbgpy2
mov byte[bg2change+eax],1
.nosbgpy2
mov ebx,[bg3ptry]
mov [BGPT3Y+eax*2],ebx
cmp [BGPT3Y+eax*2-2],bx
je .nosbgpy3
mov byte[bg3change+eax],1
.nosbgpy3
mov ebx,[bg4ptry]
mov [BGPT4Y+eax*2],ebx
cmp [BGPT4Y+eax*2-2],bx
je .nosbgpy4
mov byte[bg4change+eax],1
.nosbgpy4
mov ebx,[forceblnk]
or bl,bl
jne .dontdraw
mov dword[scfbl],0
.dontdraw
; Variable size write error fix [TRAC]
mov [BGFB+eax],bl
cmp [BGFB+eax-1],bl
je .nosbgfb
mov byte[bgallchange+eax],1
.nosbgfb
test byte[interlval],40h
jz .nointrl
mov byte[bgallchange+eax],1
.nointrl
mov ebx,[mode7A]
mov [mode7ab+eax*4],ebx
mov ebx,[mode7C]
mov [mode7cd+eax*4],ebx
mov ebx,[mode7X0]
mov [mode7xy+eax*4],ebx
mov ebx,[mode7set]
mov [mode7st+eax],ebx
; 16x16 tiles
mov ebx,[BG116x16t]
mov [t16x161+eax],ebx
cmp [t16x161+eax-1],bl
je .not16x161
mov byte[bg1change+eax],1
.not16x161
mov ebx,[BG216x16t]
mov [t16x162+eax],ebx
cmp [t16x162+eax-1],bl
je .not16x162
mov byte[bg2change+eax],1
.not16x162
mov ebx,[BG316x16t]
mov [t16x163+eax],ebx
cmp [t16x163+eax-1],bl
je .not16x163
mov byte[bg3change+eax],1
.not16x163
mov ebx,[BG416x16t]
mov [t16x164+eax],ebx
cmp [t16x164+eax-1],bl
je .not16x164
mov byte[bg4change+eax],1
.not16x164
; mov byte[mode7hr+eax],0
cmp byte[bgmode],7
jne .noextbg
; cmp byte[res640],0
; je .nomode7512
; mov byte[mode7hr+eax],1
;.nomode7512
test byte[interlval],40h
jz .noextbg
mov byte[ngextbg],1
.noextbg
; mosaic
mov ebx,[mosaicon]
mov [mosenng+eax],ebx
mov ebx,[mosaicsz]
mov [mosszng+eax],ebx
; Interlaced
mov ebx,[interlval]
mov [intrlng+eax],ebx
; Set palette
call setpalette16bng
cmp dword[palchanged],1
jne .notpchanged
cmp eax,112
jae .endl
mov dword[startlinet],eax
jmp .notpchanged
.endl
cmp dword[endlinet],255
jb .notpchanged
mov dword[endlinet],eax
.notpchanged
mov ebx,[cpalptrng]
add ebx,[vbufdptr]
mov [cpalval+eax*4],ebx
; Set Transparency
mov bl,[scaddtype]
mov [scadtng+eax],bl
cmp [scadtng+eax-1],bl
je .noscadt
mov byte[bgallchange+eax],1
.noscadt
mov bl,[scaddset]
mov [scadsng+eax],bl
cmp [scadsng+eax-1],bl
je .noscads
mov byte[bgallchange+eax],1
.noscads
; Windowing Stuff
;NEWSYM winl1, db 0 ; window 1 left position
;NEWSYM winr1, db 0 ; window 1 right position
;NEWSYM winl2, db 0 ; window 2 left position
;NEWSYM winr2, db 0 ; window 2 right position
;NEWSYM winbg1en, db 0 ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on BG1
;NEWSYM winbg2en, db 0 ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on BG2
;NEWSYM winbg3en, db 0 ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on BG3
;NEWSYM winbg4en, db 0 ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on BG4
;NEWSYM winobjen, db 0 ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on sprites
;NEWSYM wincolen, db 0 ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on backarea
;NEWSYM winlogica, db 0 ; Window logic type for BG1 to 4
;NEWSYM winlogicb, db 0 ; Window logic type for Sprites and Backarea
;NEWSYM winenabm, db 0 ; Window logic enable for main screen
;NEWSYM winenabs, db 0 ; Window logic enable for sub screen
;NEWSYM winboundary, times 256 dd 0
;NEWSYM winbg1enval, times 256 db 0
;NEWSYM winbg2enval, times 256 db 0
;NEWSYM winbg3enval, times 256 db 0
;NEWSYM winbg4enval, times 256 db 0
;NEWSYM winbgobjenval, times 256 db 0
;NEWSYM winlogicaval, times 256 dw 0
mov byte[bgwinchange+eax],0
cmp byte[disableeffects],1
je near .finishwin
push ecx
push edx
WinBGCheck 0
WinBGCheck 1
WinBGCheck 2
WinBGCheck 3
WinBGCheck 4
WinBGCheck2 5
mov ebx,[winlogica]
mov [winlogicaval+eax*2],ebx
cmp [winlogicaval+eax*2-2],bx
je .winnchangedb
mov byte[bgwinchange+eax],1
.winnchangedb
mov ebx,[winl1]
mov [winboundary+eax*4],ebx
cmp [winboundary+eax*4-4],ebx
je .winnchanged
mov byte[bgwinchange+eax],1
.winnchanged
; generate sprite window
cmp byte[winbg1enval+eax+4*256],0
je near .skipobjw
mov ebx,[winl1]
mov dl,[winobjen]
mov dh,[winlogicb]
and dh,03h
; Same as previous line?
cmp dword[objwlrpos+eax*4-4],0FFFFFFFFh
je .changed
cmp [objwlrpos+eax*4-4],ebx
jne .changedb
cmp [objwen+eax*2-2],dx
je near .notchanged
.changedb
cmp [objwlrpos+eax*4],ebx
jne .changed
cmp [objwen+eax*2],dx
jne .changed
mov ecx,[CSprWinPtr]
cmp [objclineptr+eax*4],ecx
ja near .usecurrent
.changed
mov [objwlrpos+eax*4],ebx
mov [objwen+eax*2],dx
mov bl,[winlogicb]
and bl,03h
mov [nglogicval],bl
mov ebx,4*256
add ebx,eax
mov dword[ngwinen],0
call BuildWindow2
cmp dword[ngwinen],0
je near .disablesprwin
mov ecx,[CSprWinPtr]
add ecx,260
mov [CSprWinPtr],ecx
mov [objclineptr+eax*4],ecx
add ecx,[ngwinptr]
; Construct Window in ecx
push eax
mov ebx,ngwintable
dec ecx
mov eax,256
.procnotempty
mov edx,[ebx]
add ebx,4
or edx,edx
jz .procempty
dec edx
.swloop
mov dword[ecx],0
add ecx,4
sub eax,4
jc .done
sub edx,4
jnc .swloop
sub eax,edx
add ecx,edx
dec eax
inc ecx
.procempty
mov edx,[ebx]
dec edx
add ebx,4
.swloop2
mov dword[ecx],01010101h
add ecx,4
sub eax,4
jc .done
sub edx,4
jnc .swloop2
sub eax,edx
add ecx,edx
dec eax
inc ecx
jmp .procnotempty
.done
pop eax
;NEWSYM objwlrpos , times 256 dd 0
;NEWSYM objwen , times 256 dw 0 ; en,log
;NEWSYM objclineptr, times 256 dd 0 ; l1,r1,l2,r2,en,log,ptr
jmp .skipobjw
.usecurrent
mov ecx,[objclineptr+eax*4]
mov [CSprWinPtr],ecx
cmp ecx,0FFFFFFFFh
jnz .skipobjw
jmp .disablesprwin
; copy over if it's the same
.notchanged
mov [objwlrpos+eax*4],ebx
mov [objwen+eax*2],dx
mov ebx,[objclineptr+eax*4-4]
mov [objclineptr+eax*4],ebx
cmp ebx,0FFFFFFFFh
je .disablesprwin
.skipobjw
pop edx
pop ecx
jmp .okaywin
.disablesprwin
mov dword[objclineptr+eax*4],0FFFFFFFFh
mov byte[winbg1enval+eax+4*256],0
mov byte[winbg1envals+eax+4*256],0
mov byte[winbg1envalm+eax+4*256],0
pop edx
pop ecx
jmp .okaywin
.finishwin
mov byte[winbg1enval+eax],0
mov byte[winbg2enval+eax],0
mov byte[winbg3enval+eax],0
mov byte[winbg4enval+eax],0
mov byte[winbgobjenval+eax],0
.okaywin
xor ebx,ebx
mov ebx,[coladdr-1]
mov bl,[vidbright]
cmp [Prevcoladdr],ebx
je .samecolor
mov [Prevcoladdr],ebx
push ecx
push eax
mov al,[coladdr]
mov cl,[vidbright]
mul cl
mov cl,15
div cl
xor ah,ah
mov cl,[ngrposng]
xor ebx,ebx
shl ax,cl
add bx,ax
mov al,[coladdg]
mov cl,[vidbright]
mul cl
mov cl,15
div cl
xor ah,ah
mov cl,[nggposng]
shl ax,cl
add bx,ax
mov al,[coladdb]
mov cl,[vidbright]
mul cl
mov cl,15
div cl
xor ah,ah
mov cl,[ngbposng]
shl ax,cl
add bx,ax
mov [ColResult],bx
mov [ColResult+2],bx
pop eax
pop ecx
.samecolor
cmp word[ColResult],0
je .black
cmp byte[FillSubScr+eax],0
je .notblack
or byte[FillSubScr+eax],2
jmp .notblack
.black
cmp byte[scrnon+1],0
jne .notblack
; mov byte[clinemainsub],1
; mov byte[scadtng+eax],0
; mov byte[FillSubScr+eax],0
.notblack
; fill back area
; get back window settings
mov dword[ngwinen],0
push ecx
push edx
cmp byte[winbg1enval+eax+5*256],0
je .nowindowb
mov bl,[winlogicb]
shr bl,2
and bl,03h
mov [nglogicval],bl
mov ebx,5*256
add ebx,eax
call BuildWindow2
.nowindowb
mov dword[BackAreaAdd],0
cmp byte[clinemainsub],1
jne near .domainscreen
mov ebx,[ColResult]
or ebx,[UnusedBit]
mov edx,[UnusedBit]
mov cl,[scaddset]
.filledscreen
; get sub-screen colors
test cl,10h
jnz .inside
test cl,20h
jnz .outside
.insideb
mov dword[BackAreaUnFillCol],ebx
mov dword[BackAreaFillCol],ebx
jmp .donesubscreen
.inside
test cl,20h
jnz .filled
mov dword[BackAreaUnFillCol],edx
mov [BackAreaFillCol],ebx
jmp .donesubscreen
.outside
mov [BackAreaUnFillCol],ebx
mov dword[BackAreaFillCol],edx
jmp .donesubscreen
.filled
xor ebx,ebx
mov [BackAreaUnFillCol],edx
mov [BackAreaFillCol],edx
jmp .donesubscreen
.domainscreen
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -