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 + -
显示快捷键?