makev16t.asm
来自「十七种模拟器源代码 非常有用的作课程设计不可缺少的」· 汇编 代码 · 共 3,137 行 · 第 1/5 页
ASM
3,137 行
ret
NEWSYM 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
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]
mov esi,[esi+2]
cmp ch,12*16
jae near .transparentobj
drawsprgrpfwin drawspr16tawinon
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
mov ebp,ebx
add edi,ebx
xor edx,edx
add ebp,transpbuf+32
drawsprgrpwin drawspr16tcwinon
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
mov ebp,ebx
add edi,ebx
xor edx,edx
add ebp,transpbuf+32
drawsprgrpwin drawspr16tdwinon
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
mov ebp,ebx
add edi,ebx
xor edx,edx
add ebp,transpbuf+32
drawsprgrpfwin drawspr16tcwinon
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
mov ebp,ebx
add edi,ebx
xor edx,edx
add ebp,transpbuf+32
drawsprgrpfwin drawspr16tdwinon
pop esi
mov edi,[curvidoffset]
xor edx,edx
xor ebx,ebx
add esi,8
dec cl
jnz near .loopobj
mov [currentobjptr],esi
ret
NEWSYM drawsprites16tprio
test byte[scaddtype],40h
jz near drawspritesfulladdprio
cmp byte[scrnon+1],0
je near drawspritesfulladdprio
test byte[scaddtype],80h
jnz near drawspritesfulladdprio
; half add
sprpriorityinit drawsprites16tpriow
sprprioritydrawt16b sprdrawpra16bha, sprdrawprb16bha, sprdrawpra16b, sprdrawprb16b
NEWSYM drawsprites16tpriow
sprprioritydrawt16b sprdrawpraw16bha, sprdrawprbw16bha, sprdrawpraw16b, sprdrawprbw16b
NEWSYM drawspritesfulladdprio
test byte[scaddtype],80h
jnz near drawspritesfullsubprio
; full add
sprpriorityinit drawspritesfulladdpriow
sprprioritydrawt16b sprdrawpra16bfa, sprdrawprb16bfa, sprdrawpra16b, sprdrawprb16b
NEWSYM drawspritesfulladdpriow
sprprioritydrawt16b sprdrawpraw16bfa, sprdrawprbw16bfa, sprdrawpraw16b, sprdrawprbw16b
NEWSYM drawspritesfullsubprio
; full sub
sprpriorityinit drawspritesfullsubpriow
sprprioritydrawt16b sprdrawpra16bfs, sprdrawprb16bfs, sprdrawpra16b, sprdrawprb16b
NEWSYM drawspritesfullsubpriow
sprprioritydrawt16b sprdrawpraw16bfs, sprdrawprbw16bfs, sprdrawpraw16b, sprdrawprbw16b
NEWSYM draw8x816bt
cmp byte[bgmode],2
je near draw8x816boffset
cmp byte[bgmode],5
je near draw16x816t
mov [temp],al
mov [bshifter],ah
mov eax,esi
mov [yadder],ecx
mov [tempcach],ebx
mov ebx,56
sub ebx,ecx
mov [yrevadder],ebx
; esi = pointer to video buffer
mov esi,[cwinptr]
sub esi,eax
mov [winptrref],esi
mov esi,[curvidoffset]
sub esi,eax ; esi = [vidbuffer] + curypos * 288 + 16 - HOfs
sub esi,eax
cmp byte[curmosaicsz],1
je .nomosaic
mov esi,xtravbuf+32
mov ecx,128
.clearnext
mov dword[esi],0
add esi,4
dec ecx
jnz .clearnext
mov esi,xtravbuf+32
sub esi,eax
sub esi,eax
.nomosaic
mov [temptile],edx
mov dword[bgofwptr],vcache2ba+262144
mov dword[bgsubby],262144
cmp dword[tempcach],vcache2ba+262144
jb .nobit
mov dword[bgofwptr],vcache4ba+131072
mov dword[bgsubby],131072
cmp dword[tempcach],vcache4ba+131072
jb .nobit
mov dword[bgofwptr],vcache8ba+65536
mov dword[bgsubby],65536
.nobit
; tile value : bit 15 = flipy, bit 14 = flipx, bit 13 = priority value
; bit 10-12 = palette, 0-9=tile#
cmp byte[curmosaicsz],1
jne .domosaic
cmp byte[winon],0
jne near draw8x816btwinon
.domosaic
mov ebp,transpbuf+32
sub ebp,eax
sub ebp,eax
mov byte[tileleft16b],33
mov byte[drawn],0
mov dl,[temp]
.loopa
mov ax,[edi]
mov dh,ah
add edi,2
xor dh,[curbgpr]
test dh,20h
jnz near .hprior
inc byte[drawn]
and eax,03FFh ; filter out tile #
mov ebx,[tempcach]
shl eax,6
add ebx,eax
cmp ebx,[bgofwptr]
jb .noclip
sub ebx,[bgsubby]
.noclip
test dh,80h
jz .normadd
add ebx,[yrevadder]
jmp .skipadd
.normadd
add ebx,[yadder]
.skipadd
test dh,40h
jnz near .rloop
; Begin Normal Loop
mov cl,[bshifter]
and dh,1Ch
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
xor eax,eax
; Start loop
drawtilegrp draw8x816bta
.hprior
add esi,16
add ebp,16
inc dl
cmp dl,20h
jne .loopc2
mov edi,[temptile]
.loopc2
dec byte[tileleft16b]
jnz near .loopa
cmp byte[drawn],0
je .nodraw
mov dh,byte[curmosaicsz]
cmp dh,1
jne near domosaic16b
.nodraw
ret
; reversed loop
.rloop
mov cl,[bshifter]
and dh,1Ch
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
xor eax,eax
drawtilegrpf draw8x816bta
add esi,16
add ebp,16
inc dl
cmp dl,20h
jne .loopc
mov edi,[temptile]
.loopc
dec byte[tileleft16b]
jnz near .loopa
cmp byte[drawn],0
je .nodraw2
mov dh,byte[curmosaicsz]
cmp dh,1
jne near domosaic16b
.nodraw2
ret
NEWSYM draw8x816btwinon
mov ebp,transpbuf+32
sub ebp,eax
sub ebp,eax
mov byte[tileleft16b],33
mov ecx,[winptrref]
mov byte[drawn],0
mov dl,[temp]
.loopa
mov ax,[edi]
mov dh,ah
add edi,2
xor dh,[curbgpr]
test dh,20h
jnz near .hprior
inc byte[drawn]
and eax,03FFh ; filter out tile #
mov ebx,[tempcach]
shl eax,6
add ebx,eax
cmp ebx,[bgofwptr]
jb .noclip
sub ebx,[bgsubby]
.noclip
test dh,80h
jz .normadd
add ebx,[yrevadder]
jmp .skipadd
.normadd
add ebx,[yadder]
.skipadd
test dh,40h
jnz near .rloop
; Begin Normal Loop
mov eax,ecx
mov cl,[bshifter]
and dh,1Ch
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
mov ecx,eax
xor eax,eax
; Start loop
drawtilegrp draw8x816btawinon
.hprior
add esi,16
add ecx,8
add ebp,16
inc dl
cmp dl,20h
jne .loopc2
mov edi,[temptile]
.loopc2
dec byte[tileleft16b]
jnz near .loopa
ret
; reversed loop
.rloop
mov eax,ecx
mov cl,[bshifter]
and dh,1Ch
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
mov ecx,eax
xor eax,eax
drawtilegrpf draw8x816btawinonb
add esi,16
add ecx,8
add ebp,16
inc dl
cmp dl,20h
jne .loopc
mov edi,[temptile]
.loopc
dec byte[tileleft16b]
jnz near .loopa
ret
NEWSYM draw8x816t
cmp byte[osm2dis],1
je .osm2dis
cmp byte[bgmode],2
je near draw8x816toffset
.osm2dis
cmp byte[bgmode],5
je near draw16x816t
mov [temp],al
mov [bshifter],ah
mov eax,esi
mov [yadder],ecx
mov [tempcach],ebx
mov ebx,56
sub ebx,ecx
mov [yrevadder],ebx
; esi = pointer to video buffer
mov esi,[cwinptr]
sub esi,eax
mov [winptrref],esi
mov esi,[curvidoffset]
sub esi,eax ; esi = [vidbuffer] + curypos * 288 + 16 - HOfs
sub esi,eax
cmp byte[curmosaicsz],1
je .nomosaic
mov esi,xtravbuf+32
mov ecx,128
.clearnext
mov dword[esi],0
add esi,4
dec ecx
jnz .clearnext
mov esi,xtravbuf+32
sub esi,eax
sub esi,eax
.nomosaic
mov [temptile],edx
mov dword[bgofwptr],vcache2ba+262144
mov dword[bgsubby],262144
cmp dword[tempcach],vcache2ba+262144
jb .nobit
mov dword[bgofwptr],vcache4ba+131072
mov dword[bgsubby],131072
cmp dword[tempcach],vcache4ba+131072
jb .nobit
mov dword[bgofwptr],vcache8ba+65536
mov dword[bgsubby],65536
.nobit
; tile value : bit 15 = flipy, bit 14 = flipx, bit 13 = priority value
; bit 10-12 = palette, 0-9=tile#
cmp byte[curmosaicsz],1
jne .domosaic
cmp byte[winon],0
jne near draw8x816twinon
.domosaic
mov ebp,transpbuf+32
sub ebp,eax
sub ebp,eax
test byte[scaddtype],80h
jnz near draw8x816ts
test byte[scaddtype],40h
jz near draw8x8fulladd
cmp byte[scrnon+1],0
jz near draw8x8fulladd
mov byte[tileleft16b],33
mov byte[drawn],0
mov dl,[temp]
.loopa
mov ax,[edi]
mov dh,ah
add edi,2
xor dh,[curbgpr]
test dh,20h
jnz near .hprior
inc byte[drawn]
and eax,03FFh ; filter out tile #
mov ebx,[tempcach]
shl eax,6
add ebx,eax
cmp ebx,[bgofwptr]
jb .noclip
sub ebx,[bgsubby]
.noclip
test dh,80h
jz .normadd
add ebx,[yrevadder]
jmp .skipadd
.normadd
add ebx,[yadder]
.skipadd
test dh,40h
jnz near .rloop
; Begin Normal Loop
mov cl,[bshifter]
and dh,1Ch
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
xor eax,eax
xor ecx,ecx
; Start loop
drawtilegrp draw8x816ta
.hprior
add esi,16
add ebp,16
inc dl
cmp dl,20h
jne .loopc2
mov edi,[temptile]
.loopc2
dec byte[tileleft16b]
jnz near .loopa
cmp byte[drawn],0
je .nodraw
mov dh,byte[curmosaicsz]
cmp dh,1
jne near domosaic16b
.nodraw
ret
; reversed loop
.rloop
mov cl,[bshifter]
and dh,1Ch
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
xor eax,eax
xor ecx,ecx
drawtilegrpf draw8x816ta
add esi,16
add ebp,16
inc dl
cmp dl,20h
jne .loopc
mov edi,[temptile]
.loopc
dec byte[tileleft16b]
jnz near .loopa
cmp byte[drawn],0
je .nodraw2
mov dh,byte[curmosaicsz]
cmp dh,1
jne near domosaic16b
.nodraw2
ret
NEWSYM draw8x8fulladd
mov byte[tileleft16b],33
mov byte[drawn],0
mov dl,[temp]
.loopa
mov ax,[edi]
mov dh,ah
add edi,2
push edi
xor dh,[curbgpr]
test dh,20h
jnz near .hprior
inc byte[drawn]
and eax,03FFh ; filter out tile #
mov edi,[tempcach]
shl eax,6
add edi,eax
cmp edi,[bgofwptr]
jb .noclip
sub edi,[bgsubby]
.noclip
test dh,80h
jz .normadd
add edi,[yrevadder]
jmp .skipadd
.normadd
add edi,[yadder]
.skipadd
test dh,40h
jnz near .rloop
; Begin Normal Loop
mov cl,[bshifter]
and dh,1Ch
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
xor eax,eax
xor ecx,ecx
; Start loop
drawtilegrpfull draw8x816tb
.hprior
pop edi
add esi,16
add ebp,16
inc dl
cmp dl,20h
jne .loopc2
mov edi,[temptile]
.loopc2
dec byte[tileleft16b]
jnz near .loopa
cmp byte[drawn],0
je .nodraw
mov dh,byte[curmosaicsz]
cmp dh,1
jne near domosaic16b
.nodraw
ret
; reversed loop
.rloop
mov cl,[bshifter]
and dh,1Ch
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
xor eax,eax
xor ecx,ecx
drawtilegrpfullf draw8x816tb
pop edi
add esi,16
add ebp,16
inc dl
cmp dl,20h
jne .loopc
mov edi,[temptile]
.loopc
dec byte[tileleft16b]
jnz near .loopa
cmp byte[drawn],0
je .nodraw2
mov dh,byte[curmosaicsz]
cmp dh,1
jne near domosaic16b
.nodraw2
ret
NEWSYM draw8x816ts
mov byte[tileleft16b],33
mov byte[drawn],0
mov dl,[temp]
.loopa
mov ax,[edi]
mov dh,ah
add edi,2
push edi
xor dh,[curbgpr]
test dh,20h
jnz near .hprior
inc byte[drawn]
and eax,03FFh ; filter out tile #
mov edi,[tempcach]
shl eax,6
add edi,eax
cmp edi,[bgofwptr]
jb .noclip
sub edi,[bgsubby]
.noclip
test dh,80h
jz .normadd
add edi,[yrevadder]
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?