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

📄 newgfx16.asm

📁 十七种模拟器源代码 非常有用的作课程设计不可缺少的
💻 ASM
📖 第 1 页 / 共 5 页
字号:
    pop ebx
    pop esi
    ret
.clearcsprmem
    xor eax,eax
    mov ecx,64
    mov edi,sprpriodata+16
    rep stosd
    pop ebx
    pop esi
    ret

.drawsingle
    push esi
    push ebx
    mov edi,esi
    mov esi,[sprtbng+ebx*4]
    mov edx,ecx
    and edx,0FFh
    shl edx,3
    sub edx,8
    add edx,esi
    mov esi,edx
    xor ebx,ebx
.loopobj2
    test byte[esi+7],20h
    jnz near .drawspriteflipx2
    mov bx,[esi]
    mov ch,[esi+6]
    mov esi,[esi+2]
    sprdrawa16b %2
    sub edx,8
    mov esi,edx
    dec cl
    jnz near .loopobj2
    pop ebx
    pop esi
    ret
.drawspriteflipx2
    mov bx,[esi]
    mov ch,[esi+6]
    mov esi,[esi+2]
    sprdrawaf16b %2
    sub edx,8
    mov esi,edx
    dec cl
    jnz near .loopobj2
    pop ebx
    pop esi
    ret
%endmacro


%macro normalwsprng16b 2
;    cmp byte[winbg1enval+eax+4*256],0
;    je near .skipobjw
;NEWSYM objclineptr, times 256 dd 0    ; l1,r1,l2,r2,en,log,ptr
    xor eax,eax
    mov [NGNumSpr],cl
    mov ecx,[objclineptr+ebx*4]
    add ecx,[ngwinptr]
    test dword[sprleftpr+ebx*4],80000000h
    jnz near .drawsingle
    push esi
    push ebx
    add edi,esi
    mov esi,[sprtbng+ebx*4]
    mov edx,esi
    xor ebx,ebx
.loopobj
    test byte[esi+7],20h
    jnz near .drawspriteflipx
    mov bx,[esi]
    push edx
    mov dl,[esi+7]
    and edx,03h
    cmp edx,[csprival]
    jne near .notprio
    mov dh,[esi+6]
    mov esi,[esi+2]
    mov dl,[csprbit]
    sprdrawa16b %1
    pop edx
.nodrawspr
    add edx,8
    mov esi,edx
    dec byte[NGNumSpr]
    jnz near .loopobj
    rol byte[csprbit],1
    cmp byte[csprbit],1
    je near .clearcsprmem
    pop ebx
    pop esi
    xor ecx,ecx
    ret
.notprio
    mov esi,[esi+2]
    mov dl,[csprbit]
    sprdrawa sprdrawpra2
    pop edx
    add edx,8
    mov esi,edx
    dec byte[NGNumSpr]
    jnz near .loopobj
    rol byte[csprbit],1
    cmp byte[csprbit],1
    je near .clearcsprmem
    pop ebx
    pop esi
    xor ecx,ecx
    ret
.drawspriteflipx
    mov bx,[esi]
    push edx
    mov dl,[esi+7]
    and edx,03h
    cmp edx,[csprival]
    jne near .notpriof
    mov dh,[esi+6]
    mov esi,[esi+2]
    mov dl,[csprbit]
    sprdrawaf16b %1
    pop edx
    add edx,8
    mov esi,edx
    dec byte[NGNumSpr]
    jnz near .loopobj
    rol byte[csprbit],1
    cmp byte[csprbit],1
    je near .clearcsprmem
.endobj
    pop ebx
    pop esi
    xor ecx,ecx
    ret
.notpriof
    mov esi,[esi+2]
    mov dl,[csprbit]
    sprdrawaf sprdrawpra2
    pop edx
    add edx,8
    mov esi,edx
    dec byte[NGNumSpr]
    jnz near .loopobj
    rol byte[csprbit],1
    cmp byte[csprbit],1
    je near .clearcsprmem
    pop ebx
    pop esi
    xor ecx,ecx
    xor ecx,ecx
    ret
.clearcsprmem
    xor eax,eax
    mov ecx,64
    mov edi,sprpriodata+16
    rep stosd
    pop ebx
    pop esi
    ret

.drawsingle
    push esi
    push ebx
    mov edi,esi
    mov esi,[sprtbng+ebx*4]
    xor edx,edx
    mov dl,[NGNumSpr]
    and edx,0FFh
    shl edx,3
    sub edx,8
    add edx,esi
    mov esi,edx
    xor ebx,ebx
.loopobj2
    test byte[esi+7],20h
    jnz near .drawspriteflipx2
    push edx
    mov bx,[esi]
    mov dh,[esi+6]
    mov esi,[esi+2]
    sprdrawa16b %2
    pop edx
    sub edx,8
    mov esi,edx
    dec byte[NGNumSpr]
    jnz near .loopobj2
    pop ebx
    pop esi
    xor ecx,ecx
    ret
.drawspriteflipx2
    push edx
    mov bx,[esi]
    mov dh,[esi+6]
    mov esi,[esi+2]
    sprdrawaf16b %2
    pop edx
    sub edx,8
    mov esi,edx
    dec byte[NGNumSpr]
    jnz near .loopobj2
    pop ebx
    pop esi
    xor ecx,ecx
    ret
%endmacro

; FillSubScr bit 0 sets to 1 if there is no subscreen present
; ms,wms,wm,ws
; FillSubScr scadtng
NEWSYM drawsprng16b
    test byte[BGMS1+ebx*2],10h
    jz .nosubmain
    test byte[FillSubScr+ebx],1
    jnz near drawsprng16bt
.nosubmain
    mov ebp,[cpalval+ebx*4]
    xor eax,eax
    mov edi,[CMainWinScr]
    test byte[FillSubScr+ebx],1
    jz .main2
    test byte[BGMS1+ebx*2],10h
    jnz .main2
    mov edi,[CSubWinScr]
.main2
    cmp byte[edi+ebx+4*256],0
    jne near drawsprngw16b
    test byte[FillSubScr+ebx],1
    jz .main
    test byte[BGMS1+ebx*2],10h
    jnz .main
    add esi,75036*2
.main
    xor edi,edi
    normalsprng16b sprdrawpra16bng,sprdrawprb16bng
NEWSYM drawsprngw16b
    xor edi,edi
    test byte[FillSubScr+ebx],1
    jz .main
    test byte[BGMS1+ebx*2],10h
    jnz .main
    add esi,75036*2
.main
    normalwsprng16b sprdrawprawb16bng,sprdrawprbwb16bng

drawsprng16bt:
    test byte[scadtng+ebx],10h
    jz near drawsprng16bnt
    mov ebp,[cpalval+ebx*4]
    xor eax,eax
    test byte[BGMS1+ebx*2+1],10h
    jnz near drawsprng16bmst
    mov edi,[CMainWinScr]
    cmp byte[edi+ebx+4*256],0
    jne near drawsprngw16bt
    xor edi,edi
    normalsprng16b sprdrawpra16bngt,sprdrawprb16bngt
NEWSYM drawsprngw16bt
    xor edi,edi
    normalwsprng16b sprdrawprawb16bngt,sprdrawprbwb16bngt
drawsprng16bmst:
    mov edi,[CMainWinScr]
    cmp byte[edi+ebx+4*256],0
    jne near drawsprngw16bmt
    mov edi,[CSubWinScr]
    cmp byte[edi+ebx+4*256],0
    jne near drawsprngw16bst
    xor edi,edi
    normalsprng16b sprdrawpra16bngmst,sprdrawprb16bngmst
drawsprngw16bst:
    xor edi,edi
    normalwsprng16b sprdrawprawb16bngst,sprdrawprbwb16bngst
drawsprngw16bmt:
    mov edi,[CSubWinScr]
    cmp byte[edi+ebx+4*256],0
    jne near drawsprngw16bmst
    xor edi,edi
    normalwsprng16b sprdrawprawb16bngmt,sprdrawprbwb16bngmt
drawsprngw16bmst:
    xor edi,edi
    normalwsprng16b sprdrawprawb16bngmst,sprdrawprbwb16bngmst

drawsprng16bnt:
    mov ebp,[cpalval+ebx*4]
    xor eax,eax
    test byte[BGMS1+ebx*2+1],10h
    jnz near drawsprng16bmsnt
    mov edi,[CMainWinScr]
    cmp byte[edi+ebx+4*256],0
    jne near drawsprngw16b
    xor edi,edi
    normalsprng16b sprdrawpra16bngnt,sprdrawprb16bngnt
drawsprngw16bnt
    xor edi,edi
    normalwsprng16b sprdrawprawb16bngnt,sprdrawprbwb16bngnt
drawsprng16bmsnt:
    mov edi,[CMainWinScr]
    cmp byte[edi+ebx+4*256],0
    jne near drawsprngw16bmnt
    mov edi,[CSubWinScr]
    cmp byte[edi+ebx+4*256],0
    jne near drawsprngw16bsnt
    xor edi,edi
    normalsprng16b sprdrawpra16bngmsnt,sprdrawprb16bngmsnt
drawsprngw16bsnt:
    xor edi,edi
    normalwsprng16b sprdrawprawb16bngsnt,sprdrawprbwb16bngsnt
drawsprngw16bmnt:
    mov edi,[CSubWinScr]
    cmp byte[edi+ebx+4*256],0
    jne near drawsprngw16bmsnt
    xor edi,edi
    normalwsprng16b sprdrawprawb16bngmnt,sprdrawprbwb16bngmnt
drawsprngw16bmsnt:
    xor edi,edi
    normalwsprng16b sprdrawprawb16bngmsnt,sprdrawprbwb16bngmsnt

NEWSYM drawsprng16bhr
    test byte[BGMS1+ebx*2],10h
    jz .nosubmain
    test byte[FillSubScr+ebx],1
    jnz near drawsprng16bthr
.nosubmain
    mov ebp,[cpalval+ebx*4]
    xor eax,eax
    mov edi,[CMainWinScr]
    test byte[FillSubScr+ebx],1
    jz .main2
    test byte[BGMS1+ebx*2],10h
    jnz .main2
    mov edi,[CSubWinScr]
.main2
    cmp byte[edi+ebx+4*256],0
    jne near drawsprngw16bhr
    test byte[FillSubScr+ebx],1
    jz .main
    test byte[BGMS1+ebx*2],10h
    jnz .main
    add esi,75036*2
.main
    xor edi,edi
    normalsprng16b sprdrawpra16bnghr,sprdrawprb16bnghr
NEWSYM drawsprngw16bhr
    xor edi,edi
    test byte[FillSubScr+ebx],1
    jz .main
    test byte[BGMS1+ebx*2],10h
    jnz .main
    add esi,75036*2
.main
    normalwsprng16b sprdrawprawb16bnghr,sprdrawprbwb16bnghr
drawsprng16bthr:
    test byte[scadtng+ebx],10h
    jz near drawsprng16bnthr
    mov ebp,[cpalval+ebx*4]
    xor eax,eax
    test byte[BGMS1+ebx*2+1],10h
    jnz near drawsprng16bmsthr
    mov edi,[CMainWinScr]
    cmp byte[edi+ebx+4*256],0
    jne near drawsprngw16bthr
    xor edi,edi
    normalsprng16b sprdrawpra16bngthr,sprdrawprb16bngthr
NEWSYM drawsprngw16bthr
    xor edi,edi
    normalwsprng16b sprdrawprawb16bngthr,sprdrawprbwb16bngthr
drawsprng16bmsthr:
    mov edi,[CMainWinScr]
    cmp byte[edi+ebx+4*256],0
    jne near drawsprngw16bmthr
    mov edi,[CSubWinScr]
    cmp byte[edi+ebx+4*256],0
    jne near drawsprngw16bsthr
    xor edi,edi
    normalsprng16b sprdrawpra16bngmsthr,sprdrawprb16bngmsthr
drawsprngw16bsthr:
    xor edi,edi
    normalwsprng16b sprdrawprawb16bngsthr,sprdrawprbwb16bngsthr
drawsprngw16bmthr:
    mov edi,[CSubWinScr]
    cmp byte[edi+ebx+4*256],0
    jne near drawsprngw16bmsthr
    xor edi,edi
    normalwsprng16b sprdrawprawb16bngmthr,sprdrawprbwb16bngmthr
drawsprngw16bmsthr:
    xor edi,edi
    normalwsprng16b sprdrawprawb16bngmsthr,sprdrawprbwb16bngmsthr
drawsprng16bnthr:
    mov ebp,[cpalval+ebx*4]
    xor eax,eax
    test byte[BGMS1+ebx*2+1],10h
    jnz near drawsprng16bmsnthr
    mov edi,[CMainWinScr]
    cmp byte[edi+ebx+4*256],0
    jne near drawsprngw16bhr
    xor edi,edi
    normalsprng16b sprdrawpra16bngnthr,sprdrawprb16bngnthr
drawsprngw16bnthr
    xor edi,edi
    normalwsprng16b sprdrawprawb16bngnthr,sprdrawprbwb16bngnthr
drawsprng16bmsnthr:
    mov edi,[CMainWinScr]
    cmp byte[edi+ebx+4*256],0
    jne near drawsprngw16bmnthr
    mov edi,[CSubWinScr]
    cmp byte[edi+ebx+4*256],0
    jne near drawsprngw16bsnthr
    xor edi,edi
    normalsprng16b sprdrawpra16bngmsnthr,sprdrawprb16bngmsnthr
drawsprngw16bsnthr:
    xor edi,edi
    normalwsprng16b sprdrawprawb16bngsnthr,sprdrawprbwb16bngsnthr
drawsprngw16bmnthr:
    mov edi,[CSubWinScr]
    cmp byte[edi+ebx+4*256],0
    jne near drawsprngw16bmsnthr
    xor edi,edi
    normalwsprng16b sprdrawprawb16bngmnthr,sprdrawprbwb16bngmnthr
drawsprngw16bmsnthr:
    xor edi,edi
    normalwsprng16b sprdrawprawb16bngmsnthr,sprdrawprbwb16bngmsnthr


ProcessTransparencies:
    cmp byte[NGNoTransp],0
    je .yestransp
    ret
.yestransp
    cmp byte[FPUCopy],2
    je near ProcessTransparenciesMMX
    mov esi,[vidbuffer]
    add esi,16*2+288*2
    mov ebx,1
.nextline
    test byte[FillSubScr+ebx],1
    jz near .notransp
    mov dword[HiResDone],0
.againtransp
    test byte[scadtng+ebx],40h
    jz near .fulltransp
    test byte[scadtng+ebx],80h
    jnz near .subtract

    ; Half Add
    push esi
    push ebx
    ; filter out all fixed color sub-screen
    test byte[FillSubScr+ebx],2
    jnz .halfaddcomb
    mov ecx,256
    mov ebx,[UnusedBit]
    mov edi,[HalfTrans]
    xor eax,eax
    jmp .next2
.notranspha
    add esi,2
    dec ecx
    jz .done
.next2
    mov ax,[esi]
    test ax,bx
    jz .notranspha
    mov dx,[esi+75036*2]
    test dx,bx
    jnz .notranspha
    and eax,edi
    and edx,edi
    add eax,edx
    shr eax,1
    mov [esi],ax
    add esi,2
    loop .next2
.done
    pop ebx
    pop esi
    jmp .donetransp
.halfaddcomb
    mov ecx,256
    mov ebx,[UnusedBit]
    mov edi,[HalfTrans]
    xor eax,eax
    xor edx,edx
    jmp .next2c
.notransphac
    add esi,2
    dec ecx
    jz .donec
.next2c
    mov ax,[esi]
    test ax,bx
    jz .notransphac
    mov dx,[esi+75036*2]
    test dx,bx
    jnz .fulladdtranspc
    and eax,edi
    and edx,edi
    add eax,edx
    shr eax,1
    mov [esi],ax
    add esi,2
    loop .next2c
.donec
    pop ebx
    pop esi
    jmp .donetransp
.fulladdtranspc
    and eax,edi
    and edx,edi
    add eax,edx
    shr eax,1
    mov ax,[fulladdtab+eax*2]
    mov [esi],ax
    add esi,2
    loop .next2c
    pop ebx
    pop esi
    jmp .donetransp

.subtract
    push ebx
    push esi
    ; half adder
    mov ecx,256
    mov ebp,[HalfTrans]
    xor edx,edx
    mov bx,[UnusedBit]
.nextfshs
    mov ax,[esi]
    test ax,bx
    je .notranspfshs
    mov dx,[esi+75036*2]
    xor ax,0FFFFh
    and edx,ebp
    and eax,ebp
    add edx,eax
    shr edx,1
    mov dx,[fulladdtab+edx*2]
    xor dx,0FFFFh
    test word[esi+75036*2],bx
    jnz .nothalfhs
    and edx,ebp
    shr edx,1
.nothalfhs
    mov [esi],dx
.notranspfshs
    add esi,2
    loop .nextfshs
    pop esi
    pop ebx
    jmp .donetransp
.fulltransp
    test byte[scadtng+ebx],80h
    jnz near .fullsubtract
    push ebx
    push esi
    mov ecx,256
    mov ebp,[HalfTrans]
    xor edx,edx
    xor eax,eax
    mov bx,[UnusedBit]
.nextfa
    mov ax,[esi]
    test ax,bx
    jz .notranspfa
    mov dx,[esi+75036*2]
    and eax,ebp
    and edx,ebp
    add edx,eax
    shr edx,1
    mov dx,[fulladdtab+edx*2]
    mov [esi],dx
.notranspfa
    add esi,2
    loop .nextfa
    pop esi
    pop ebx
    jmp .donetransp
.fullsubtract
    push ebx
    push

⌨️ 快捷键说明

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