makev16t.asm
来自「十七种模拟器源代码 非常有用的作课程设计不可缺少的」· 汇编 代码 · 共 3,137 行 · 第 1/5 页
ASM
3,137 行
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 clearback16bdualrev2
mov edi,[curvidoffset]
mov esi,[winptrref]
mov esi,[cwinptr]
mov ecx,64
cmp dword[esi],0
je near .drawnone
mov byte[DoTransp],0
.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
mov byte[DoTransp],0
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 DoTransp, db 0
;*******************************************************
; Clear Backarea, 16-bit mode w/ transparency
;*******************************************************
NEWSYM clearback16t
test byte[scaddtype],20h
jz near .backcopy
test byte[scaddtype],80h
jnz near clearback16ts
mov eax,[pal16b]
mov esi,[curvidoffset]
mov ebp,transpbuf+32
mov dx,ax
and eax,[vesa2_clbit]
shr eax,1
test byte[scaddtype],40h
jz .fulladd
cmp byte[scrnon+1],0
je .fulladd
mov ecx,128
.loopa
mov ebx,[ebp]
or bx,bx
jz .noadd
and bx,[vesa2_clbit]
shr bx,1
add bx,ax
mov [esi],bx
jmp .skip
.noadd
mov [esi],dx
.skip
shr ebx,16
or bx,bx
je .noadd2
and bx,word[vesa2_clbit]
shr bx,1
add bx,ax
mov [esi+2],bx
jmp .skip2
.noadd2
mov [esi+2],dx
.skip2
add ebp,4
add esi,4
dec ecx
jnz .loopa
xor eax,eax
ret
.fulladd
cmp eax,0
je .subcopy
mov ecx,256
xor ebx,ebx
.loopc
mov ebx,[ebp]
and ebx,[vesa2_clbit]
shr ebx,1
add ebx,eax
add ebp,2
mov ebx,[fulladdtab+ebx*2]
mov [esi],bx
add esi,2
dec ecx
jnz .loopc
xor eax,eax
ret
.subcopy
cmp byte[FPUCopy],2
je .dommxcopy
mov ecx,128
xor ebx,ebx
mov edi,esi
mov esi,ebp
rep movsd
xor eax,eax
ret
.dommxcopy
mov ecx,32
xor ebx,ebx
mov edi,esi
mov esi,ebp
.mmxloop2
movq mm0,[esi]
movq mm1,[esi+8]
movq [edi],mm0
movq [edi+8],mm1
add esi,16
add edi,16
dec ecx
jnz .mmxloop2
emms
xor eax,eax
ret
.backcopy
mov edi,[curvidoffset]
mov ecx,128
mov ax,[pal16b]
shl eax,16
mov ax,[pal16b]
cmp byte[FPUCopy],2
je .dommxclear
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 clearback16ts
mov eax,[pal16b]
mov esi,[curvidoffset]
mov ebp,transpbuf+32
xor eax,0FFFFh
and eax,[vesa2_clbit]
shr eax,1
mov ecx,256
xor ebx,ebx
.loopc
mov ebx,[ebp]
and ebx,[vesa2_clbit]
shr ebx,1
add ebx,eax
add ebp,2
mov ebx,[fulladdtab+ebx*2]
xor ebx,0FFFFh
mov [esi],bx
add esi,2
dec ecx
jnz .loopc
xor eax,eax
ret
NEWSYM drawsprites16bt
cmp byte[sprprifix],1
je near drawsprites16btprio
test byte[cwinenabm],10h
jz .drawnowin
cmp byte[winonsp],0
jne near drawsprites16btwinon
.drawnowin
mov esi,[currentobjptr]
xor ebx,ebx
xor eax,eax
.loopobj
mov edi,[curvidoffset]
test byte[esi+7],20h
jnz near .drawspriteflipx
push esi
mov bx,[esi]
mov ch,[esi+6]
shl bx,1
mov esi,[esi+2]
mov ebp,ebx
add edi,ebx
add ebp,transpbuf+32
drawspr16bt 0, 16
drawspr16bt 1, 14
drawspr16bt 2, 12
drawspr16bt 3, 10
drawspr16bt 4, 8
drawspr16bt 5, 6
drawspr16bt 6, 4
drawspr16bt 7, 2
pop esi
add esi,8
dec cl
jnz near .loopobj
mov [currentobjptr],esi
ret
.drawspriteflipx
push esi
mov bx,[esi]
mov ch,[esi+6]
shl bx,1
mov esi,[esi+2]
mov ebp,ebx
add edi,ebx
add ebp,transpbuf+32
drawspr16bt 7, 16
drawspr16bt 6, 14
drawspr16bt 5, 12
drawspr16bt 4, 10
drawspr16bt 3, 8
drawspr16bt 2, 6
drawspr16bt 1, 4
drawspr16bt 0, 2
pop esi
add esi,8
dec cl
jnz near .loopobj
mov [currentobjptr],esi
ret
NEWSYM drawsprites16btwinon
mov esi,[currentobjptr]
xor ebx,ebx
xor eax,eax
.loopobj
mov edi,[curvidoffset]
test byte[esi+7],20h
jnz near .drawspriteflipx
push esi
mov bx,[esi]
mov ch,[esi+6]
shl bx,1
mov esi,[esi+2]
mov ebp,ebx
add edi,ebx
shr ebx,1
add ebp,transpbuf+32
drawspr16btwo 0, 16, 0
drawspr16btwo 1, 14, 1
drawspr16btwo 2, 12, 2
drawspr16btwo 3, 10, 3
drawspr16btwo 4, 8, 4
drawspr16btwo 5, 6, 5
drawspr16btwo 6, 4, 6
drawspr16btwo 7, 2, 7
pop esi
add esi,8
dec cl
jnz near .loopobj
mov [currentobjptr],esi
ret
.drawspriteflipx
push esi
mov bx,[esi]
mov ch,[esi+6]
shl bx,1
mov esi,[esi+2]
mov ebp,ebx
add edi,ebx
shr ebx,1
add ebp,transpbuf+32
drawspr16btwo 7, 16, 0
drawspr16btwo 6, 14, 1
drawspr16btwo 5, 12, 2
drawspr16btwo 4, 10, 3
drawspr16btwo 3, 8, 4
drawspr16btwo 2, 6, 5
drawspr16btwo 1, 4, 6
drawspr16btwo 0, 2, 7
pop esi
add esi,8
dec cl
jnz near .loopobj
mov [currentobjptr],esi
ret
NEWSYM drawsprites16btprio
sprpriorityinit drawsprites16btpriow
sprprioritydrawbt sprdrawpra16bt, sprdrawprb16bt
NEWSYM drawsprites16btpriow
sprprioritydrawbt sprdrawpra16bt, sprdrawprb16bt
NEWSYM drawsprites16t
cmp byte[sprprifix],1
je near drawsprites16tprio
test byte[cwinenabm],10h
jz .drawnowin
cmp byte[winonsp],0
jne near drawsprites16twinon
.drawnowin
test byte[scaddtype],40h
jz near drawspritesfulladd
cmp byte[scrnon+1],0
je near drawspritesfulladd
test byte[scaddtype],80h
jnz near drawspritesfulladd
mov esi,[currentobjptr]
mov edi,[curvidoffset]
xor ebx,ebx
xor eax,eax
.loopobj
test byte[esi+7],20h
jnz near .drawspriteflipx
push esi
mov bx,[esi]
mov ch,[esi+6]
shl bx,1
mov esi,[esi+2]
cmp ch,12*16
jae near .transparentobjnf
drawsprgrp drawspr16ta
pop esi
add esi,8
dec cl
jnz near .loopobj
mov [currentobjptr],esi
ret
.drawspriteflipx
push esi
mov bx,[esi]
mov ch,[esi+6]
shl bx,1
mov esi,[esi+2]
cmp ch,12*16
jae near .transparentobj
drawsprgrpf drawspr16ta
pop esi
add esi,8
dec cl
jnz near .loopobj
mov [currentobjptr],esi
ret
.transparentobjnf
mov ebp,ebx
add edi,ebx
xor edx,edx
add ebp,transpbuf+32
drawsprgrp drawspr16tb
pop esi
mov edi,[curvidoffset]
xor edx,edx
xor ebx,ebx
add esi,8
dec cl
jnz near .loopobj
mov [currentobjptr],esi
ret
.transparentobj
mov ebp,ebx
add edi,ebx
xor edx,edx
add ebp,transpbuf+32
drawsprgrpf drawspr16tb
pop esi
mov edi,[curvidoffset]
xor edx,edx
xor ebx,ebx
add esi,8
dec cl
jnz near .loopobj
mov [currentobjptr],esi
ret
drawspritesfulladd:
mov esi,[currentobjptr]
mov edi,[curvidoffset]
xor ebx,ebx
xor eax,eax
.loopobj
test byte[esi+7],20h
jnz near .drawspriteflipx
push esi
mov bx,[esi]
mov ch,[esi+6]
shl bx,1
mov esi,[esi+2]
cmp ch,12*16
jae near .transparentobjnf
drawsprgrp drawspr16ta
pop esi
xor edx,edx
xor ebx,ebx
add esi,8
dec cl
jnz near .loopobj
mov [currentobjptr],esi
ret
.drawspriteflipx
push esi
mov bx,[esi]
mov ch,[esi+6]
shl bx,1
mov esi,[esi+2]
cmp ch,12*16
jae near .transparentobj
drawsprgrpf drawspr16ta
pop esi
xor edx,edx
xor ebx,ebx
add esi,8
dec cl
jnz near .loopobj
mov [currentobjptr],esi
ret
.transparentobjnf
test byte[scaddtype],80h
jnz near .transparentobjnfs
mov ebp,ebx
add edi,ebx
xor edx,edx
add ebp,transpbuf+32
drawsprgrp drawspr16tc
pop esi
mov edi,[curvidoffset]
xor edx,edx
xor ebx,ebx
add esi,8
dec cl
jnz near .loopobj
mov [currentobjptr],esi
ret
.transparentobjnfs
mov ebp,ebx
add edi,ebx
xor edx,edx
add ebp,transpbuf+32
drawsprgrp drawspr16td
pop esi
mov edi,[curvidoffset]
xor edx,edx
xor ebx,ebx
add esi,8
dec cl
jnz near .loopobj
mov [currentobjptr],esi
ret
.transparentobj
test byte[scaddtype],80h
jnz near .transparentobjs
mov ebp,ebx
add edi,ebx
xor edx,edx
add ebp,transpbuf+32
drawsprgrpf drawspr16tc
pop esi
mov edi,[curvidoffset]
xor edx,edx
xor ebx,ebx
add esi,8
dec cl
jnz near .loopobj
mov [currentobjptr],esi
ret
.transparentobjs
mov ebp,ebx
add edi,ebx
xor edx,edx
add ebp,transpbuf+32
drawsprgrpf drawspr16td
pop esi
mov edi,[curvidoffset]
xor edx,edx
xor ebx,ebx
add esi,8
dec cl
jnz near .loopobj
mov [currentobjptr],esi
ret
NEWSYM drawsprites16twinon
test byte[scaddtype],40h
jz near drawspritesfulladdwinon
cmp byte[scrnon+1],0
je near drawspritesfulladdwinon
test byte[scaddtype],80h
jnz near drawspritesfulladdwinon
mov esi,[currentobjptr]
mov edi,[curvidoffset]
xor ebx,ebx
xor eax,eax
.loopobj
test byte[esi+7],20h
jnz near .drawspriteflipx
push esi
mov bx,[esi]
mov ch,[esi+6]
mov esi,[esi+2]
cmp ch,12*16
jae near .transparentobjnf
drawsprgrpwin drawspr16tawinon
pop esi
add esi,8
dec cl
jnz near .loopobj
mov [currentobjptr],esi
ret
.drawspriteflipx
push esi
mov bx,[esi]
mov ch,[esi+6]
mov esi,[esi+2]
cmp ch,12*16
jae near .transparentobj
drawsprgrpfwin drawspr16tawinon
pop esi
add esi,8
dec cl
jnz near .loopobj
mov [currentobjptr],esi
ret
.transparentobjnf
mov ebp,ebx
add edi,ebx
mov ebp,ebx
add edi,ebx
xor edx,edx
add ebp,transpbuf+32
drawsprgrpwin drawspr16tbwinon
pop esi
mov edi,[curvidoffset]
xor edx,edx
xor ebx,ebx
add esi,8
dec cl
jnz near .loopobj
mov [currentobjptr],esi
ret
.transparentobj
mov ebp,ebx
add edi,ebx
mov ebp,ebx
add edi,ebx
xor edx,edx
add ebp,transpbuf+32
drawsprgrpfwin drawspr16tbwinon
pop esi
mov edi,[curvidoffset]
xor edx,edx
xor ebx,ebx
add esi,8
dec cl
jnz near .loopobj
mov [currentobjptr],esi
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?