⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 newgfx16.asm

📁 十七种模拟器源代码 非常有用的作课程设计不可缺少的
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;Copyright (C) 1997-2001 ZSNES Team ( zsknight@zsnes.com / _demo_@zsnes.com )
;
;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.

%include "macros.mac"

EXTSYM BG116x16t,BG1SXl,BG1SYl,BG216x16t,BG2SXl,BG2SYl,BG316x16t,BG3PRI
EXTSYM BG3SXl,BG3SYl,BG416x16t,BG4SXl,BG4SYl,BGFB,BGMA,BGMS1,BGOPT1
EXTSYM BGOPT2,BGOPT3,BGOPT4,BGPT1,BGPT1X,BGPT1Y,BGPT2,BGPT2X,BGPT2Y,BGPT3
EXTSYM BGPT3X,BGPT3Y,BGPT4,BGPT4X,BGPT4Y,bg1drwng,bg1objptr,bg1ptr,bg1ptrx
EXTSYM bg1ptry,bg1scrolx,bg1scroly,bg1totng,bg2drwng,bg2objptr,bg2ptr
EXTSYM bg2ptrx,bg2ptry,bg2scrolx,bg2scroly,bg2totng,bg3drwng,bg3highst
EXTSYM bg3objptr,bg3ptr,bg3ptrx,bg3ptry,bg3scrolx,bg3scroly,bg3totng
EXTSYM bg4drwng,bg4objptr,bg4ptr,bg4ptrx,bg4ptry,bg4scrolx,bg4scroly
EXTSYM bg4totng,bgcmsung,bgmode,bgtxad,bgtxadd,cachesingle2bng
EXTSYM cachesingle8bng,cfieldad,cgfxmod,cgmod,cgram,coladdb
EXTSYM coladdg,coladdr,colleft16b,colormodedef,cpalval,csprbit,csprival
EXTSYM curmosaicsz,curvidoffset,curypos,firstdrawn
EXTSYM flipyposng,forceblnk,interlval,intrlng,maxbr,mode0add,mode0ads,mode7A
EXTSYM mode7C,mode7X0,mode7ab,mode7cd,mode7set,mode7st,mode7xy,modeused
EXTSYM mosaicon,mosaicsz,mosenng,mosszng,ngceax,ngcedi,ngpalcon2b,ngpalcon4b
EXTSYM ngpalcon8b,ngptrdat,pesimpng,prdata,prdatb,prdatc,prevbright
;EXTSYM ngpalcon8b,pesimpng,prdata,prdatb,prdatc,prevbright
EXTSYM prevpal,reslbyl,resolutn,scaddset,scaddtype,scadsng,scadtng,scbcong
EXTSYM scfbl,scrndis,scrnon,spritetablea,sprleftpr,sprlefttot,sprprdrn
EXTSYM sprpriodata,sprtbng,sprtlng,switch16x16,t16x161,t16x162,t16x163
EXTSYM t16x164,taddfy16x16,taddnfy16x16,tleftn,tleftnb,tltype2b,tltype4b
EXTSYM tltype8b,vcache2b,vcache4b,vcache8b,vesa2_bposng,vesa2_clbitng,vesa2_gposng
EXTSYM vesa2_rposng,vidbright,vidbuffer,vidmemch2,vidmemch4,drawsprng
EXTSYM vidmemch8,vrama,winon,xtravbuf,yposng,vbufdptr,preparesprpr
EXTSYM drawtileng2b16b,drawtileng4b16b,drawtileng8b16b
EXTSYM drawtileng16x162b16b,drawtileng16x164b16b,drawtileng16x168b16b
EXTSYM drawlineng2b16b,drawlineng4b16b,drawlineng8b16b,BuildWindow
EXTSYM drawlineng16x162b16b,drawlineng16x164b16b,drawlineng16x168b16b
EXTSYM ngextbg,bgwinchange,disableeffects,winbg1en,winenabs,winenabm
EXTSYM winl1,winbg1enval,winbg1envalm
EXTSYM winlogica,winlogicaval,winboundary,winobjen,winlogicb,nglogicval
EXTSYM ngwintable,winbg2enval,winbg3enval,winbg4enval,winbgobjenval
EXTSYM Mode7HiRes16b,res640,hiresstuff,Mode7BackA,Mode7BackC,Mode7BackX0
EXTSYM Mode7BackSet,drawmode7win16b,processmode7hires,ngwinen
EXTSYM drawlineng16x84b16b,drawlineng16x82b16b,ofsmcyps,vram,ofsmcptr
EXTSYM ofsmady,ofsmadx,ofsmtptr,yposngom,flipyposngom,ofsmmptr
EXTSYM ofsmval,ofsmvalh,hdmaearlstart,ofsmvalh,cbgval,drawlinengom4b16b
EXTSYM drawsprngw,ignor512,winbg1envals,FillSubScr,scanlines
EXTSYM drawmode7win16bd,SpecialLine,vidmemch2s
EXTSYM smallscreenon,ScreenScale,SA1Enable,drawlinengom16x164b16b
EXTSYM doveg,V8Mode,dovegrest
EXTSYM bgallchange,bg1change,bg2change,bg3change,bg4change
EXTSYM ngwinptr,objwlrpos,objwen,objclineptr,CSprWinPtr
EXTSYM BuildWindow2    
EXTSYM NGNumSpr
EXTSYM fulladdtab
EXTSYM FPUCopy,bgtxadd2

NEWSYM NewGfx16AsmStart

%include "video/vidmacro.mac"
%include "video/newgfx16.mac"
%include "video/newg162.mac"





; mov ebp,[cpalval+ebx*4]
; 75036*2
; Different routines for:
;   Normal (just one screen)
;   Transparency
;   No Transparency

; Sub+Main:
; Different Window Modes for each:
;   SubWin+MainWin
;   Sub+MainWin
;   SubWin+Main




; cgfxmod :
;   0 = No addition whatsoever
;   1 = Addition in the back area only
;   2 = All of subscreen added to all of mainscreen
;   3 = All of subscreen added to specific mainscreens
;   4 = Add+Sub enabled

NEWSYM setpalallng

    mov dword[palchanged],1
    mov byte[cgmod],0
    push esi
    push eax
    push edx
    push ebp
    mov esi,[cpalptrng]
    mov byte[colleft16b],0
    add esi,1024
    xor ebp,ebp
    and esi,255*1024
    mov dword[cpalptrng],esi

    add esi,[vbufdptr]

.loopa
    mov dx,[cgram+ebp]
    mov [prevpal2+ebp],dx
    mov ax,dx
    and al,01Fh
    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 ax,dx
    shr ax,5
    and al,01Fh
    mov cl,[vidbright]
    mul cl
    mov cl,15
    div cl
    xor ah,ah
    mov cl,[nggposng]
    shl ax,cl
    add bx,ax
    mov ax,dx
    shr ax,10
    and al,01Fh
    mov cl,[vidbright]
    mul cl
    mov cl,15
    div cl
    xor ah,ah
    mov cl,[ngbposng]
    shl ax,cl
    add bx,ax
    mov ax,bx
    mov [esi],bx     ; standard
    or bx,[UnusedBit]
    mov [esi+512],bx     ; standard
    add esi,2
    add ebp,2
    inc byte[colleft16b]
    jnz near .loopa
    mov al,[vidbright]
    mov [prevbright],al
    pop ebp
    pop edx
    pop eax
    pop esi
    xor ecx,ecx
    cmp byte[V8Mode],1
    jne .noveg2
    call dovegrest
.noveg2
    ret

NEWSYM setpalette16bng
    cmp byte[V8Mode],1
    jne .noveg
    call doveg
.noveg
    mov bl,[vidbright]
    cmp bl,[prevbright]
    jne near setpalallng
    cmp byte[cgmod],0
    je near .skipall
    push esi
    push edi
    push eax
    push edx
    push ebp
    mov byte[cgmod],0
    xor ebp,ebp
    mov esi,[cpalptrng]
    mov edi,esi
    add esi,1024
    and esi,255*1024
    mov dword[cpalptrng],esi

    add esi,[vbufdptr]
    add edi,[vbufdptr]

    mov byte[colleft16b],0
    jmp .loopa
.skipa
    mov bx,[edi]
    mov [esi],bx
    mov bx,[edi+512]
    mov [esi+512],bx
    add edi,2
    add esi,2
    add ebp,2
    inc byte[colleft16b]
    jz near .endpal
.loopa
    mov dx,[cgram+ebp]
    cmp [prevpal2+ebp],dx
    je .skipa
    mov [prevpal2+ebp],dx
    cmp byte[colleft16b],0
    je .notchanged
    mov dword[palchanged],1
.notchanged
    mov ax,dx
    and al,01Fh
    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 ax,dx
    shr ax,5
    and al,01Fh
    mov cl,[vidbright]
    mul cl
    mov cl,15
    div cl
    xor ah,ah
    mov cl,[nggposng]
    shl ax,cl
    add bx,ax
    mov ax,dx
    shr ax,10
    and al,01Fh
    mov cl,[vidbright]
    mul cl
    mov cl,15
    div cl
    xor ah,ah
    mov cl,[ngbposng]
    shl ax,cl
    add bx,ax
    mov [esi],bx     ; standard
    or bx,[UnusedBit]
    mov [esi+512],bx     ; standard
    add edi,2
    add esi,2
    add ebp,2
    inc byte[colleft16b]
    jnz near .loopa
.endpal
    pop ebp
    pop edx
    pop eax
    pop edi
    pop esi
    xor ecx,ecx
.skipall
    cmp byte[V8Mode],1
    jne .noveg2
    call dovegrest
.noveg2
    ret

prevpal2 times 256 dw 0F00Fh

%macro WinBGCheck 1
    mov bl,[winbg1en+%1]
    mov bh,bl
    test bl,0Ah
    jz %%disable

    test byte[scrnon],1 << %1
    jz %%nomainbg
    test byte[scrnon+1],1 << %1
    jnz %%bg
    xor bh,bh
    jmp %%bg
%%nomainbg
    xor bl,bl
    test byte[scrnon+1],1 << %1
    jnz %%bg
    xor bh,bh
    jmp %%skip
%%disable
    xor bl,bl
    xor bh,bh
    jmp %%skip
%%bg
    test byte[winenabs],1 << %1
    jnz %%nbgs
    xor bh,bh
%%nbgs
    test byte[winenabm],1 << %1
    jnz %%nbgm
    xor bl,bl
%%nbgm
    jmp %%skip
    mov cl,bl
    or cl,bh
    and cl,0Ah
    cmp cl,0Ah
    je %%skip
    mov ch,bl
    or ch,bh
    mov edx,[winl1]
    cmp cl,02h
    je %%bg1
    shr ch,2
    shr edx,16
%%bg1
    test ch,01h
    jnz %%outside
    cmp dl,dh
    jbe %%skip
    xor bl,bl
    xor bh,bh
    jmp %%skip
%%outside
    cmp dl,0
    ja %%skip
    cmp dh,255
    jb %%skip
    xor bl,bl
    xor bh,bh
%%skip
    mov [winbg1envalm+eax+%1*256],bl
    mov [winbg1envals+eax+%1*256],bh
    or bl,bh
    mov [winbg1enval+eax+%1*256],bl
%endmacro

%macro WinBGCheckb 1
    mov bl,[winbg1en+%1]
    test bl,0Ah
    jz %%disable
    test byte[scrnon],1 << %1
    jnz %%nbgen
    test byte[winenabs],1 << %1
    jnz %%bg
    jmp %%disable
%%nbgen
    test byte[winenabm],1 << %1
    jnz %%bg
%%disable
    xor bl,bl
    jmp %%skip
%%bg
    mov cl,bl
    and cl,0Ah
    cmp cl,0Ah
    je %%skip
;    jne %%notskip
;    and bl,03h
;    and cl,03h
;%%notskip
    mov ch,bl
    mov edx,[winl1]
    cmp cl,02h
    je %%bg1
    shr ch,2
    shr edx,16
%%bg1
    test ch,01h
    jnz %%outside
    cmp dl,dh
    jbe %%skip
    xor bl,bl
    jmp %%skip
%%outside
    cmp dl,0
    ja %%skip
    cmp dh,255
    jb %%skip
    xor bl,bl
%%skip
    mov [winbg1enval+eax+%1*256],bl
    mov [winbg1envalm+eax+%1*256],bl
    mov [winbg1envals+eax+%1*256],bl
%endmacro

%macro WinBGCheck2 1
    mov bl,[winbg1en+%1]
    test bl,0Ah
    jnz %%nodisable
    xor bl,bl
    jmp %%skip
%%nodisable
    mov cl,bl
    or cl,bh
    and cl,0Ah
    cmp cl,0Ah
    je %%skip
    mov ch,bl
    or ch,bh
    mov edx,[winl1]
    cmp cl,02h
    je %%bg1
    shr ch,2
    shr edx,16
%%bg1
    test ch,01h
    jnz %%outside
    cmp dl,dh
    jbe %%skip
    xor bl,bl
    jmp %%skip
%%outside
    cmp dl,0
    ja %%skip
    cmp dh,255
    jb %%skip
    xor bl,bl
%%skip
    mov [winbg1enval+eax+%1*256],bl
%endmacro

BackAreaAdd dd 0
BackAreaUnFillCol dd 0
BackAreaFillCol dd 0
clinemainsub    dd 0

BackAreaFill:
    cmp byte[winbg1enval+eax+5*256],0
    je near .nowindowb
    mov ebx,[BackAreaFillCol]
    cmp ebx,[BackAreaUnFillCol]
    je near .nowindowb
    push ecx
    push edx
    push eax
    push edi

    mov ebx,eax
    mov ecx,[vidbuffer]
    add ecx,16*2
    shl eax,9
    add ecx,eax
    mov eax,ebx
    shl eax,6
    add ecx,eax
    add ecx,[BackAreaAdd]

    ; Construct Window in ecx
    mov edi,ngwintable
    sub ecx,2
    mov eax,256
.procnotemptyb
    mov edx,[edi]
    add edi,4
    or edx,edx
    jz .procemptyb
    dec edx
    mov ebx,[BackAreaUnFillCol]
.swloopb
    mov dword[ecx],ebx
    mov dword[ecx+4],ebx
    add ecx,8
    sub eax,4
    jc .doneb
    sub edx,4
    jnc .swloopb
    sub eax,edx
    add ecx,edx
    add ecx,edx
    dec eax
    add ecx,2
.procemptyb
    mov edx,[edi]
    dec edx
    add edi,4
    mov ebx,[BackAreaFillCol]
.swloop2b
    mov dword[ecx],ebx
    mov dword[ecx+4],ebx
    add ecx,8
    sub eax,4
    jc .doneb
    sub edx,4
    jnc .swloop2b
    sub eax,edx
    add ecx,edx
    add ecx,edx
    dec eax
    add ecx,2
    jmp .procnotemptyb
.doneb
    pop edi
    pop eax
    pop edx
    pop ecx
    jmp .yeswindowb
.nowindowb
    push eax
    push ecx
    mov ebx,eax
    mov ecx,[vidbuffer]
    mov eax,ebx
    add ecx,16*2
    shl eax,9
    add ecx,eax
    mov eax,ebx
    shl eax,6
    add ecx,eax
    add ecx,[BackAreaAdd]
    mov ebx,[BackAreaUnFillCol]
    mov eax,128
.nowinloop
    mov [ecx],ebx
    add ecx,4
    dec eax
    jnz .nowinloop
    pop ecx
    pop eax
.yeswindowb
    ret

NEWSYM newengine16b
    ; store line by line data
    ; BGMode, BGxScrollX, BGxScrollY, both BGPtrs
    mov eax,[curypos]
    and eax,0FFh

    cmp eax,1
    jne .noclearcache
    push eax
    push ecx
    mov ebx,vidmemch2s
    mov ecx,1024+512+256
    mov eax,0FFFFFFFFh
.loopcc
    mov dword[ebx],eax
    add ebx,4
    loop .loopcc
    pop ecx
    pop eax
    mov dword[startlinet],0
    mov dword[endlinet],255
    xor ebx,ebx
.noclearcache

    mov byte[bgallchange+eax],0
    mov byte[bgallchange+eax+1],0FFh
    mov byte[bg1change+eax],0
    mov byte[bg2change+eax],0
    mov byte[bg3change+eax],0
    mov byte[bg4change+eax],0
    mov dword[palchanged],0

    ; BG3 Priority
    mov bl,[bg3highst]
    mov [BG3PRI+eax],bl
    cmp [BG3PRI+eax-1],bl
    je .nosbg3pr
    mov byte[bgallchange+eax],1
.nosbg3pr

    ; Main/Sub Screen
    cmp byte[SA1Enable],0
    je .noscrnona
    cmp word[scrnon],1317h
    jne .noscrnona
    cmp byte[scaddtype],0
    jne .noscrnona
    mov word[scrnon],1317h
    mov byte[scaddtype],44h
    mov byte[scaddset],02h
.noscrnona
    mov ebx,[scrnon]
    ; clear
    push ecx
    mov cl,[scrnon]
    and cl,1Fh

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -