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

📄 mode716.asm

📁 十七种模拟器源代码 非常有用的作课程设计不可缺少的
💻 ASM
📖 第 1 页 / 共 2 页
字号:
    call Gendcolortable
.nodcchange
    CheckTransparency 01h,drawmode7win16btd
    Mode7NonMainSub Mode7Direct
drawmode7win16btd
    test byte[scadtng+ebx],1h
    jz near drawmode7win16bntd
    test byte[BGMS1+ebx*2+1],1h
    jnz near drawmode716bmstd
    Mode7NonMainSub Mode7Directt
drawmode716bmstd:
    mov edi,[CMainWinScr]
    cmp byte[edi+ebx],0
    jne near drawmode7w16bmtd
    mov edi,[CSubWinScr]
    cmp byte[edi+ebx],0
    jne near drawmode7w16bstd
drawmode7w16bmstd
    Mode7NonMainSub Mode7Directmst
drawmode7w16bmtd
    mov edi,[CSubWinScr]
    cmp byte[edi+ebx],0
    jne near drawmode7w16bmstd
    Mode7MainSub Mode7Directmst,Mode7Directst
drawmode7w16bstd
    Mode7MainSub Mode7Directmst,Mode7Directt
drawmode7win16bntd:
    test byte[BGMS1+ebx*2+1],1h
    jnz near drawsprngm716bmsntd
    Mode7NonMainSub Mode7Directnt
drawsprngm716bmsntd:
    cmp dword[ngwinen],0
    je drawmode7w16bmsntd
    mov edi,[CMainWinScr]
    cmp byte[edi+ebx],0
    jne near drawmode7w16bmntd
    mov edi,[CSubWinScr]
    cmp byte[edi+ebx],0
    jne near drawmode7w16bsntd
drawmode7w16bmsntd
    Mode7NonMainSub Mode7Directmsnt
drawmode7w16bmntd
    mov edi,[CSubWinScr]
    cmp byte[edi+ebx],0
    jne near drawmode7w16bmsntd
    Mode7MainSub Mode7Directmsnt,Mode7Directsnt
drawmode7w16bsntd
    Mode7MainSub Mode7Directmsnt,Mode7Directnt


NEWSYM drawmode7ngextbg16b
    test byte[scrndis],1
    jz .notdisabled
    ret
.notdisabled
    mov byte[curmosaicsz],1
    push ecx
    mov esi,[curvidoffset]       ; esi = [vidbuffer] + curypos * 288 + 16
    mov ecx,256
.loop
    mov byte[esi+75036*8],0
    add esi,2
    loop .loop
    pop ecx

    cmp byte[mode7hr+ebx],1
;    je near drawmode7winextbghr16e
    CheckTransparency 02h,drawmode7win16bte
    mov esi,[cwinptr]
    mov [winptrref],esi
    mov esi,[curvidoffset]
    Mode7NonMainSube Mode7ExtBG
drawmode7win16bte
    test byte[scadtng+ebx],1h
    jz near drawmode7win16bnte
    test byte[BGMS1+ebx*2+1],1h
    jnz near drawmode716bmste
    Mode7NonMainSube Mode7ExtBGt
drawmode716bmste:
    mov edi,[CMainWinScr]
    cmp byte[edi+ebx],0
    jne near drawmode7w16bmte
    mov edi,[CSubWinScr]
    cmp byte[edi+ebx],0
    jne near drawmode7w16bste
drawmode7w16bmste
    Mode7NonMainSube Mode7ExtBGmst
drawmode7w16bmte
    mov edi,[CSubWinScr]
    cmp byte[edi+ebx],0
    jne near drawmode7w16bmste
    Mode7MainSube Mode7ExtBGmst,Mode7ExtBGst
drawmode7w16bste
    Mode7MainSube Mode7ExtBGmst,Mode7ExtBGt
drawmode7win16bnte:
    test byte[BGMS1+ebx*2+1],1h
    jnz near drawsprngm716bmsnte
    Mode7NonMainSube Mode7ExtBGnt
drawsprngm716bmsnte:
    cmp dword[ngwinen],0
    je drawmode7w16bmsnte
    mov edi,[CMainWinScr]
    cmp byte[edi+ebx],0
    jne near drawmode7w16bmnte
    mov edi,[CSubWinScr]
    cmp byte[edi+ebx],0
    jne near drawmode7w16bsnte
drawmode7w16bmsnte
    Mode7NonMainSube Mode7ExtBGmsnt
drawmode7w16bmnte
    mov edi,[CSubWinScr]
    cmp byte[edi+ebx],0
    jne near drawmode7w16bmsnte
    Mode7MainSube Mode7ExtBGmsnt,Mode7ExtBGsnt
drawmode7w16bsnte
    Mode7MainSube Mode7ExtBGmsnt,Mode7ExtBGnt

%macro ExtBG2 1
    mov esi,[curvidoffset]       ; esi = [vidbuffer] + curypos * 288 + 16
    mov ecx,256
    xor eax,eax
.loop
    mov al,[esi+75036*8]
    test al,80h
    jz .nopr2
    and al,7Fh
    %1
.nopr2
    add esi,2
    loop .loop
    xor eax,eax
    ret
%endmacro

%macro ExtBGNormal 0
    mov dx,[ebp+eax*2]
    mov [esi],dx
%endmacro
%macro ExtBGNormalt 0
    mov dx,[ebp+eax*2+512]
    mov [esi],dx
%endmacro
%macro ExtBGNormalnt 0
    mov dx,[ebp+eax*2]
    mov [esi],dx
%endmacro
%macro ExtBGNormalst 0
    mov dx,[ebp+eax*2]
    mov [esi+75036*2],dx
%endmacro
%macro ExtBGNormalsnt 0
    mov dx,[ebp+eax*2]
    mov [esi+75036*2],dx
%endmacro
%macro ExtBGNormalmst 0
    mov dx,[ebp+eax*2+512]
    mov [esi],dx
    and dx,[UnusedBitXor]
    mov [esi+75036*2],dx
%endmacro
%macro ExtBGNormalmsnt 0
    mov dx,[ebp+eax*2]
    mov [esi],dx
    mov [esi+75036*2],dx
%endmacro

NEWSYM drawmode7ngextbg216b
    test byte[scrndis],1
    jz .notdisabled
    ret
.notdisabled
    cmp byte[mode7hr+ebx],1
;    je near drawmode7winextbg2hr16b
    ; esi = pointer to video buffer
    CheckTransparency 01h,drawmode7ngextbg216bt
    test byte[FillSubScr+ebx],1
    jz .main
    test byte[BGMS1+ebx*2],01h
    jnz .main
    add esi,75036*2
.main
    ExtBG2 ExtBGNormal
drawmode7ngextbg216bt:
    test byte[scadtng+ebx],1h
    jz near drawmode7ngextbg216bnt
    test byte[BGMS1+ebx*2+1],1h
    jnz near drawmode7ngextbg216bmst
    ExtBG2 ExtBGNormalt
drawmode7ngextbg216bmst
    test byte[BGMS1+ebx*2],1h
    jz near drawmode7ngextbg216bst
    ExtBG2 ExtBGNormalmst
drawmode7ngextbg216bst:
    ExtBG2 ExtBGNormalst
drawmode7ngextbg216bnt:
    test byte[BGMS1+ebx*2+1],1h
    jnz near drawmode7ngextbg216bmsnt
    ExtBG2 ExtBGNormalnt
drawmode7ngextbg216bmsnt
    test byte[BGMS1+ebx*2],1h
    jz near drawmode7ngextbg216bsnt
    ExtBG2 ExtBGNormalmsnt
drawmode7ngextbg216bsnt:
    ExtBG2 ExtBGNormalsnt

ALIGN32
mtemp        dd 0       ; for byte move left
mmode7xpos   dd 0       ; x position
mtempa2      dd 0       ; keep this blank!
mmode7xrpos  dd 0       ; x position
mtempa       dd 0       ; keep this blank!
mmode7ypos   dd 0       ; y position
mtempb2      dd 0       ; keep this blank!
mmode7yrpos  dd 0       ; y position
mtempb       dd 0       ; keep this blank!
mmode7xadder dd 0       ; number to add for x
mtempc2      dd 0       ; keep this blank!
mmode7xadd2  dd 0       ; number to add for x
mtempc       dd 0       ; keep this blank!
mmode7yadder dd 0       ; number to add for y
mtempd2      dd 0       ; keep this blank!
mmode7yadd2  dd 0       ; number to add for y
mtempd       dd 0       ; keep this blank!
mmode7ptr    dd 0       ; pointer value
mmode7xinc   dd 0       ; number to add for x
mmode7xincc  dd 0       ; range check for x
mmode7yinc   dd 0       ; number to add for y
mmode7xsloc  dd 0       ; which screen x
mmode7ysloc  dd 0       ; which screen y
mmode7xsrl   dd 0       ; which relative screen x
mmode7ysrl   dd 0       ; which relative screen y
mcxloc       dw 0       ; cx location
mcyloc       dw 0       ; cy location
M7HROn       dd 0       ; High Resolution On
switchtorep3 dd 0

m7xaddof dd 0
m7xaddof2 dd 0
m7yaddof dd 0
m7yaddof2 dd 0
pixelsleft dd 0
mm7xaddof dd 0
mm7xaddof2 dd 0
mm7yaddof dd 0
mm7yaddof2 dd 0

%macro newvaluepred 2
    mov dx,word[%1+ebx*4+8]
    cmp dx,word[%1+ebx*4]
    je %%nodivide
    cmp byte[BGMA+ebx+2],7
    je %%mode7scaleb
%%nodivide
    movsx edx,word[%1+ebx*4+4]
    movsx ecx,word[%1+ebx*4]
    add ecx,edx
    sar ecx,1
    mov [%2],cx
    jmp %%mode7scalend
%%mode7scaleb
    mov esi,ebx
    movsx ebx,word[%1+esi*4+8]
    movsx edx,word[%1+esi*4]
    sub ebx,edx
    movsx ecx,word[%1+esi*4+4]
    sub ecx,edx
    mov eax,ecx
    imul ecx
    idiv ebx
    add ax,word[%1+esi*4]
    mov ebx,esi
    mov [%2],ax
%%mode7scalend
%endmacro

CalculateNewValues:
    ; predict new values
    push eax
    push edx
    push ebx
    push esi
    newvaluepred mode7ab,mode7A
    newvaluepred mode7ab+2,mode7B
    newvaluepred mode7cd,mode7C
    newvaluepred mode7cd+2,mode7D
    pop esi
    pop ebx
    pop edx
    pop eax

    mov ecx,edx
    xor edx,edx
    mov dx,[BG1SXl+ebx*2+2]
    add edx,ecx
    shr edx,1

    mov ecx,eax
    mov eax,ebx
    inc eax
    test byte[mode7set],02h
    jz .noflip
    mov eax,261
    sub eax,ebx
.noflip
    add ax,[BG1SYl+ebx*2+2]
    add eax,ecx
    sub ax,[ScrDispl]
    sub ax,[ScrDispl]
    ret


NEWSYM processmode7hires16b
    cmp byte[BGMA+ebx+1],7
    jne near .nogo
    push esi
    push ebx
    call CalculateNewValues
    add esi,75036*4
    mov [curvidoffset],esi
    mov dword[M7HROn],1
    call drawmode7win16b
    mov dword[M7HROn],0
    pop ebx
    pop esi
.nogo
    ret

NEWSYM processmode7hires16bd
    cmp byte[BGMA+ebx+1],7
    jne near .nogo
    push esi
    push ebx
    call CalculateNewValues
    add esi,75036*4
    mov [curvidoffset],esi
    mov dword[M7HROn],1
    call drawmode7win16bd
    mov dword[M7HROn],0
    pop ebx
    pop esi
.nogo
    ret

NEWSYM Mode716AsmEnd

⌨️ 快捷键说明

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