makev16t.asm

来自「十七种模拟器源代码 非常有用的作课程设计不可缺少的」· 汇编 代码 · 共 3,137 行 · 第 1/5 页

ASM
3,137
字号
    mov byte[curbgnum],02h
    mov ebp,01h
    call drawbackgrndmain16t
    mov ebp,2
    call procspritesmain16t
; do background 1
    mov byte[curbgnum],01h
    mov ebp,00h
    call drawbackgrndmain16t
    mov ebp,3
    call procspritesmain16t
    pop ebp
    pop edx
    pop ebx
    pop edi
    pop esi
    xor eax,eax
    xor ecx,ecx
    ret

NEWSYM processmode716t
    push esi
    push edi
    push ebx
    push edx
    push ebp
    ; current video offset
    mov dword[curvidoffset],transpbuf+32
    ; set palette
    call setpalette16b
    ; clear back area w/ back color
    procwindowback
    call clearback16bts
    ; do sprite windowing
    call makewindowsp
    ; clear registers
    xor eax,eax
    xor ecx,ecx
    ; get current sprite table
    xor ebx,ebx
    mov bl,[curypos]
    shl ebx,9
    add ebx,[spritetablea]
    mov [currentobjptr],ebx
    mov dword[cursprloc],sprleftpr
    ; setup priorities
    cmp byte[sprprifix],0
    je .nosprprio
    mov dword[cursprloc],sprlefttot
    call preparesprpr
.nosprprio
    mov byte[extbgdone],0
    test byte[scaddset],02h
    jz .nosubscr
    test byte[interlval],40h
    jz .noback0s
    call procmode716tsubextbg
.noback0s
    mov ebp,0
    call procspritessub16t
    test byte[interlval],40h
    jnz .noback1s
    call procmode716tsub
.noback1s
    mov ebp,1
    call procspritessub16t
    test byte[interlval],40h
    jz .noback2s
    call procmode716tsubextbgb
    call procmode716tsubextbg2
.noback2s
    mov ebp,2
    call procspritessub16t
    mov ebp,3
    call procspritessub16t
.nosubscr
    mov al,[winenabm]
    mov [cwinenabm],al
NEWSYM processmode716t2
    ; calculate current video offset
    xor ebx,ebx
    mov bx,[curypos]
    mov esi,ebx
    shl esi,9
    shl ebx,6
    add esi,ebx
    add esi,32
    add esi,[vidbuffer]
    mov [curvidoffset],esi
    ; get current sprite table
    xor ebx,ebx
    mov bl,[curypos]
    shl ebx,9
    add ebx,[spritetablea]
    mov [currentobjptr],ebx
    mov dword[cursprloc],sprleftpr
    ; setup priorities
    cmp byte[sprprifix],0
    je .nosprprio
    mov dword[cursprloc],sprlefttot
    call preparesprpr
.nosprprio
    ; clear back area w/ back color
    call clearback16t
    ; clear registers
    xor eax,eax
    xor ecx,ecx
    mov byte[extbgdone],0
    test byte[interlval],40h
    jz .noback0m
    call procmode716tmainextbg
.noback0m
    mov ebp,0
    call procspritesmain16t
    ; do background 1
    test byte[interlval],40h
    jnz .noback1m
    call procmode716tmain
.noback1m
    mov ebp,1
    call procspritesmain16t
    test byte[interlval],40h
    jz .noback2m
    call procmode716tmainextbgb
    call procmode716tmainextbg2
.noback2m
    mov ebp,2
    call procspritesmain16t
    mov ebp,3
    call procspritesmain16t
    pop ebp
    pop edx
    pop ebx
    pop edi
    pop esi
    xor eax,eax
    xor ecx,ecx
    ret

;*******************************************************
; Clear Backarea, with 0s
;*******************************************************

NEWSYM prevrgbcol, dd 0
NEWSYM prevrgbpal, dd 0

NEWSYM clearback16bts
    mov byte[DoTransp],0
    cmp dword[vesa2_rpos],0
    je near clearback16bts0.clear
    cmp byte[winon],0
    je near clearback16bts0b
    cmp byte[winon],2
    je near clearback16bts0
    cmp byte[winon],4
    je near clearback16bts0.clear
.noclear
    mov bl,[scaddset]
    and bl,30h
    cmp bl,20h
    jne .dontclear
    cmp byte[winon],5
    je near clearback16bts0.clear
.dontclear
    cmp byte[winon],5
    je near clearback16bts0b
    cmp byte[winon],3
    je near clearback16bts0b
    mov eax,[coladdr]
    shl eax,8
    mov bx,[prevrgbpal]
    mov al,[vidbright]
    cmp eax,[prevrgbcol]
    je .useprevpal
    mov [prevrgbcol],eax
    xor eax,eax
    mov al,[coladdr]
    mov cl,[vidbright]
    mul cl
    mov cl,15
    div cl
    xor ah,ah
    mov cl,[vesa2_rpos]
    shl ax,cl
    mov bx,ax
    xor eax,eax
    mov al,[coladdg]
    mov cl,[vidbright]
    mul cl
    mov cl,15
    div cl
    xor ah,ah
    mov cl,[vesa2_gpos]
    shl ax,cl
    add bx,ax
    xor eax,eax
    mov al,[coladdb]
    mov cl,[vidbright]
    mul cl
    mov cl,15
    div cl
    xor ah,ah
    mov cl,[vesa2_bpos]
    shl ax,cl
    add bx,ax
    mov [prevrgbpal],bx
.useprevpal
    mov ax,bx
    cmp eax,0
    je .nowin
    jmp dowindowback16b
.nowin
    mov edi,[curvidoffset]
    or eax,eax
    jz near clearback16bts0.clearing
    cmp byte[FPUCopy],2
    je .dommxclear
    mov ecx,128
    rep stosd
    xor eax,eax
    ret
.dommxclear
    mov [mmxtempdat],eax
    mov [mmxtempdat+4],eax
    mov ecx,32
    movq mm0,[mmxtempdat]
.mmxloop
    movq [edi],mm0
    movq [edi+8],mm0
    add edi,16
    dec ecx
    jnz .mmxloop
    emms
    xor eax,eax
    ret

mmxtempdat dd 0,0

NEWSYM clearback16bts0b
    mov eax,[coladdr]
    shl eax,8
    mov bx,[prevrgbpal]
    mov al,[vidbright]
    cmp eax,[prevrgbcol]
    je .useprevpal2
    mov [prevrgbcol],eax
    xor eax,eax
    mov al,[coladdr]
    mov cl,[vidbright]
    mul cl
    mov cl,15
    div cl
    xor ah,ah
    mov cl,[vesa2_rpos]
    shl ax,cl
    mov bx,ax
    xor eax,eax
    mov al,[coladdg]
    mov cl,[vidbright]
    mul cl
    mov cl,15
    div cl
    xor ah,ah
    mov cl,[vesa2_gpos]
    shl ax,cl
    add bx,ax
    xor eax,eax
    mov al,[coladdb]
    mov cl,[vidbright]
    mul cl
    mov cl,15
    div cl
    xor ah,ah
    mov cl,[vesa2_bpos]
    shl ax,cl
    add bx,ax
    mov [prevrgbpal],bx
.useprevpal2
    mov ax,bx
    shl eax,16
    mov ax,bx
    cmp byte[winon],3
    je near clearback16bdual
    mov edi,[curvidoffset]
    or eax,eax
    jz near clearback16bts0.clearing
    cmp byte[FPUCopy],2
    je .dommxclear
    mov ecx,128
    rep stosd
    xor eax,eax
    ret
.dommxclear
    mov [mmxtempdat],eax
    mov [mmxtempdat+4],eax
    mov ecx,32
    movq mm0,[mmxtempdat]
.mmxloop
    movq [edi],mm0
    movq [edi+8],mm0
    add edi,16
    dec ecx
    jnz .mmxloop
    emms
    xor eax,eax
    ret

NEWSYM clearback16bts0
    mov bl,[scaddset]
    and bl,30h
    cmp bl,20h
    je near clearback16bts0b
.clear
    mov edi,[curvidoffset]
    xor eax,eax
.clearing
    test byte[scrnon+1],10h
    jnz .notnotransp
    mov byte[DoTransp],1
.notnotransp
    cmp byte[FPUCopy],2
    je .dommxclear
    mov ecx,128
    rep stosd
    ret
.dommxclear
    mov [mmxtempdat],eax
    mov [mmxtempdat+4],eax
    mov ecx,32
    movq mm0,[mmxtempdat]
.mmxloop
    movq [edi],mm0
    movq [edi+8],mm0
    add edi,16
    dec ecx
    jnz .mmxloop
    emms
    ret

NEWSYM dowindowback16b
    test byte[scrnon+1],10h
    jnz .notnotransp
    mov byte[DoTransp],1
.notnotransp
    mov bl,[scaddset]
    and bl,30h
    cmp bl,20h
    je near dowindowback16brev
    mov ebx,windowdata
    mov edi,[curvidoffset]
    xor edx,edx
    xor ch,ch
.getnext
    mov cl,[ebx]
    cmp dl,cl
    je .procnext
.dorest
    sub cl,dl
    cmp ch,0
    ja .nodraw
    mov byte[DoTransp],0
.loopa
    mov word[edi+edx*2],ax
    inc dl
    dec cl
    jnz .loopa
.procnext
    add ch,[ebx+1]
    add ebx,2
    test byte[numwin],0FFh
    jz .finishwin
    dec byte[numwin]
    jnz .getnext
    xor cl,cl
    jmp .dorest
.nodraw
.loopb
    mov word[edi+edx*2],0
    inc dl
    dec cl
    jnz .loopb
    jmp .procnext
.finishwin
    xor eax,eax
    ret

NEWSYM dowindowback16brev
    mov ebx,windowdata
    mov edi,[curvidoffset]
    xor edx,edx
    xor ch,ch
.getnext
    mov cl,[ebx]
    cmp dl,cl
    je .procnext
.dorest
    sub cl,dl
    cmp ch,0
    ja .nodraw
.loopa
    mov word[edi+edx*2],0
    inc dl
    dec cl
    jnz .loopa
.procnext
    add ch,[ebx+1]
    add ebx,2
    test byte[numwin],0FFh
    jz .finishwin
    dec byte[numwin]
    jnz .getnext
    xor cl,cl
    jmp .dorest
.nodraw
    mov byte[DoTransp],0
.loopb
    mov word[edi+edx*2],ax
    inc dl
    dec cl
    jnz .loopb
    jmp .procnext
.finishwin
    xor eax,eax
    ret

NEWSYM clearback16bdual
    cmp byte[bgmode],7
    jne .notmode7
    test byte[scrnon+1],10h
    jnz .notmode7
    jmp clearback16bdualb2
.notmode7

    mov bl,[scaddset]
    and bl,30h
    cmp bl,10h
    je near clearback16bdualrev

    mov edi,[curvidoffset]
    mov esi,[cwinptr]
    mov ecx,64
    cmp dword[esi],01010101h
    je near .drawnone
.nextpart
    cmp dword[esi],0
    jne .drawpart
.drawall
    mov [edi],eax
    mov [edi+4],eax
    add edi,8
    add esi,4
    dec ecx
    jnz .nextpart
    jmp .findraw
.nextpartp
    cmp dword[esi],01010101h
    je near .drawnone
    cmp dword[esi],0h
    je .drawall
.drawpart
    xor ebx,ebx
    cmp byte[esi],1
    je .nodraw
    mov ebx,eax
.nodraw
    mov [edi],bx
    xor ebx,ebx
    cmp byte[esi+1],1
    je .nodraw1
    mov ebx,eax
.nodraw1
    mov [edi+2],bx
    xor ebx,ebx
    cmp byte[esi+2],1
    je .nodraw2
    mov ebx,eax
.nodraw2
    mov [edi+4],bx
    xor ebx,ebx
    cmp byte[esi+3],1
    je .nodraw3
    mov ebx,eax
.nodraw3
    mov [edi+6],bx
    add edi,8
    add esi,4
    dec ecx
    jnz near .nextpartp
    jmp .findraw
.nextpartn
    cmp dword[esi],01010101h
    jne .drawpart
.drawnone
    mov dword[edi],0
    mov dword[edi+4],0
    add edi,8
    add esi,4
    dec ecx
    jnz .nextpartn
.findraw
    ret

NEWSYM clearback16bdualrev

;    xor eax,eax                 ;aaaaaaaaaaa
;    ret

    mov edi,[curvidoffset]
    mov esi,[winptrref]
    mov esi,[cwinptr]
    mov ecx,64
    cmp dword[esi],0
    je near .drawnone
.nextpart
    cmp dword[esi],01010101h
    jne .drawpart
.drawall
    mov [edi],eax
    mov [edi+4],eax
    add edi,8
    add esi,4
    dec ecx
    jnz .nextpart
    jmp .findraw
.nextpartp
    cmp dword[esi],0
    je near .drawnone
    cmp dword[esi],01010101h
    je .drawall
.drawpart
    xor ebx,ebx
    cmp byte[esi],1
    jne .nodraw
    mov ebx,eax
.nodraw
    mov [edi],bx
    xor ebx,ebx
    cmp byte[esi+1],1
    jne .nodraw1
    mov ebx,eax
.nodraw1
    mov [edi+2],bx
    xor ebx,ebx
    cmp byte[esi+2],1
    jne .nodraw2
    mov ebx,eax
.nodraw2
    mov [edi+4],bx
    xor ebx,ebx
    cmp byte[esi+3],1
    jne .nodraw3
    mov ebx,eax
.nodraw3
    mov [edi+6],bx
    add edi,8
    add esi,4
    dec ecx
    jnz near .nextpartp
    jmp .findraw
.nextpartn
    cmp dword[esi],0
    jne .drawpart
.drawnone
    mov dword[edi],0
    mov dword[edi+4],0
    add edi,8
    add esi,4
    dec ecx
    jnz .nextpartn
.findraw
    ret

NEWSYM clearback16bdualb2
    mov byte[DoTransp],1
    mov bl,[scaddset]
    and bl,30h
    cmp bl,10h
    je near clearback16bdualrev2

    mov edi,[curvidoffset]
    mov esi,[cwinptr]
    mov ecx,64
    cmp dword[esi],01010101h
    je near .drawnone
    mov byte[DoTransp],0
.nextpart
    cmp dword[esi],0
    jne .drawpart
.drawall
    mov [edi],eax
    mov [edi+4],eax
    add edi,8
    add esi,4
    dec ecx
    jnz .nextpart
    jmp .findraw
.nextpartp
    cmp dword[esi],01010101h
    je near .drawnone
    cmp dword[esi],0h
    je .drawall
.drawpart
    mov byte[DoTransp],0
    xor ebx,ebx
    cmp byte[esi],1
    je .nodraw
    mov ebx,eax
.nodraw
    mov [edi],bx
    xor ebx,ebx
    cmp byte[esi+1],1
    je .nodraw1
    mov ebx,eax
.nodraw1
    mov [edi+2],bx
    xor ebx,ebx
    cmp byte[esi+2],1
    je .nodraw2
    mov ebx,eax
.nodraw2
    mov [edi+4],bx
    xor ebx,ebx
    cmp byte[esi+3],1
    je .nodraw3
    mov ebx,eax
.nodraw3
    mov [edi+6],bx
    add edi,8

⌨️ 快捷键说明

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