📄 makev16b.asm
字号:
test al,0Fh
jz .skipb2
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx-14],dx
.skipb2
mov al,[esi+5]
test al,0Fh
jz .skipc2
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx-12],dx
.skipc2
mov al,[esi+4]
test al,0Fh
jz .skipd2
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx-10],dx
.skipd2
mov al,[esi+3]
test al,0Fh
jz .skipe2
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx-8],dx
.skipe2
mov al,[esi+2]
test al,0Fh
jz .skipf2
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx-6],dx
.skipf2
mov al,[esi+1]
test al,0Fh
jz .skipg2
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx-4],dx
.skipg2
mov al,[esi]
test al,0Fh
jz .skiph2
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx-2],dx
.skiph2
pop esi
add esi,8
dec cl
jnz near .loopobj
mov [currentobjptr],esi
ret
NEWSYM drawsprites16bwinon
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]
mov al,[esi]
test al,0Fh
jz .skipa
cmp byte[winspdata+ebx-8+16],0
jne .skipa
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx*2-16],dx
.skipa
mov al,[esi+1]
test al,0Fh
jz .skipb
cmp byte[winspdata+ebx-7+16],0
jne .skipb
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx*2-14],dx
.skipb
mov al,[esi+2]
test al,0Fh
jz .skipc
cmp byte[winspdata+ebx-6+16],0
jne .skipc
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx*2-12],dx
.skipc
mov al,[esi+3]
test al,0Fh
jz .skipd
cmp byte[winspdata+ebx-5+16],0
jne .skipd
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx*2-10],dx
.skipd
mov al,[esi+4]
test al,0Fh
jz .skipe
cmp byte[winspdata+ebx-4+16],0
jne .skipe
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx*2-8],dx
.skipe
mov al,[esi+5]
test al,0Fh
jz .skipf
cmp byte[winspdata+ebx-3+16],0
jne .skipf
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx*2-6],dx
.skipf
mov al,[esi+6]
test al,0Fh
jz .skipg
cmp byte[winspdata+ebx-2+16],0
jne .skipg
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx*2-4],dx
.skipg
mov al,[esi+7]
test al,0Fh
jz .skiph
cmp byte[winspdata+ebx-1+16],0
jne .skiph
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx*2-2],dx
.skiph
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]
mov al,[esi+7]
test al,0Fh
jz .skipa2
cmp byte[winspdata+ebx-8+16],0
jne .skipa2
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx*2-16],dx
.skipa2
mov al,[esi+6]
test al,0Fh
jz .skipb2
cmp byte[winspdata+ebx-7+16],0
jne .skipb2
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx*2-14],dx
.skipb2
mov al,[esi+5]
test al,0Fh
jz .skipc2
cmp byte[winspdata+ebx-6+16],0
jne .skipc2
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx*2-12],dx
.skipc2
mov al,[esi+4]
test al,0Fh
jz .skipd2
cmp byte[winspdata+ebx-5+16],0
jne .skipd2
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx*2-10],dx
.skipd2
mov al,[esi+3]
test al,0Fh
jz .skipe2
cmp byte[winspdata+ebx-4+16],0
jne .skipe2
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx*2-8],dx
.skipe2
mov al,[esi+2]
test al,0Fh
jz .skipf2
cmp byte[winspdata+ebx-3+16],0
jne .skipf2
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx*2-6],dx
.skipf2
mov al,[esi+1]
test al,0Fh
jz .skipg2
cmp byte[winspdata+ebx-2+16],0
jne .skipg2
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx*2-4],dx
.skipg2
mov al,[esi]
test al,0Fh
jz .skiph2
cmp byte[winspdata+ebx-1+16],0
jne .skiph2
add al,ch
mov edx,[pal16b+eax*4]
mov [edi+ebx*2-2],dx
.skiph2
pop esi
add esi,8
dec cl
jnz near .loopobj
mov [currentobjptr],esi
ret
NEWSYM drawsprites16bprio
cmp byte[sprclprio+ebp],0
je near .endobj
test byte[cwinenabm],10h
jz .drawnowin
cmp byte[winonsp],0
jne near drawspritesprio16bwinon
.drawnowin
cmp dword[sprsingle],1
je near .drawsingle
mov [csprprlft],cl
mov esi,[currentobjptr]
mov edi,[curvidoffset]
mov edx,esi
xor ebx,ebx
.loopobj
test byte[esi+7],20h
jnz near .drawspriteflipx
mov bx,[esi]
push esi
mov ch,[esi+6]
mov dl,[esi+7]
xor eax,eax
and edx,03h
cmp edx,ebp
jne near .notprio
mov esi,[esi+2]
mov cl,[csprbit]
sprdrawa16b sprdrawpra16b
pop esi
add esi,8
dec byte[csprprlft]
jnz near .loopobj
rol byte[csprbit],1
cmp byte[csprbit],1
je near .clearcsprmem
ret
.notprio
mov esi,[esi+2]
mov dl,[csprbit]
sprdrawa sprdrawpra2
pop esi
add esi,8
dec byte[csprprlft]
jnz near .loopobj
rol byte[csprbit],1
cmp byte[csprbit],1
je near .clearcsprmem
ret
.drawspriteflipx
mov bx,[esi]
push esi
mov ch,[esi+6]
mov dl,[esi+7]
xor eax,eax
and edx,03h
cmp edx,ebp
jne near .notpriof
mov esi,[esi+2]
mov cl,[csprbit]
sprdrawaf16b sprdrawpra16b
pop esi
add esi,8
dec byte[csprprlft]
jnz near .loopobj
rol byte[csprbit],1
cmp byte[csprbit],1
je near .clearcsprmem
.endobj
ret
.notpriof
mov esi,[esi+2]
mov dl,[csprbit]
sprdrawaf sprdrawpra2
pop esi
add esi,8
dec byte[csprprlft]
jnz near .loopobj
rol byte[csprbit],1
cmp byte[csprbit],1
je near .clearcsprmem
ret
.clearcsprmem
xor eax,eax
mov ecx,64
mov edi,sprpriodata+16
rep stosd
ret
.drawsingle
mov esi,[currentobjptr]
mov edi,[curvidoffset]
mov edx,ecx
and edx,0FFh
xor eax,eax
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]
push esi
mov ch,[esi+6]
mov esi,[esi+2]
sprdrawa16b sprdrawprb16b
pop esi
sub esi,8
dec cl
jnz near .loopobj2
ret
.drawspriteflipx2
mov bx,[esi]
push esi
mov ch,[esi+6]
mov esi,[esi+2]
sprdrawaf16b sprdrawprb16b
pop esi
sub esi,8
dec cl
jnz near .loopobj2
ret
NEWSYM drawspritesprio16bwinon
cmp dword[sprsingle],1
je near .drawsingle
mov [csprprlft],cl
mov esi,[currentobjptr]
mov edi,[curvidoffset]
mov edx,esi
xor ebx,ebx
.loopobj
test byte[esi+7],20h
jnz near .drawspriteflipx
mov bx,[esi]
push esi
mov ch,[esi+6]
mov dl,[esi+7]
xor eax,eax
and edx,03h
cmp edx,ebp
jne near .notprio
mov esi,[esi+2]
mov cl,[csprbit]
sprdrawa16b sprdrawpraw16b
pop esi
add esi,8
dec byte[csprprlft]
jnz near .loopobj
rol byte[csprbit],1
cmp byte[csprbit],1
je near .clearcsprmem
ret
.notprio
mov esi,[esi+2]
mov dl,[csprbit]
sprdrawa sprdrawpra2
pop esi
add esi,8
dec byte[csprprlft]
jnz near .loopobj
rol byte[csprbit],1
cmp byte[csprbit],1
je near .clearcsprmem
ret
.drawspriteflipx
mov bx,[esi]
push esi
mov ch,[esi+6]
mov dl,[esi+7]
xor eax,eax
and edx,03h
cmp edx,ebp
jne near .notpriof
mov esi,[esi+2]
mov cl,[csprbit]
sprdrawaf16b sprdrawpraw16b
pop esi
add esi,8
dec byte[csprprlft]
jnz near .loopobj
rol byte[csprbit],1
cmp byte[csprbit],1
je near .clearcsprmem
.endobj
ret
.notpriof
mov esi,[esi+2]
mov dl,[csprbit]
sprdrawaf sprdrawpra2
pop esi
add esi,8
dec byte[csprprlft]
jnz near .loopobj
rol byte[csprbit],1
cmp byte[csprbit],1
je near .clearcsprmem
ret
.clearcsprmem
xor eax,eax
mov ecx,64
mov edi,sprpriodata+16
rep stosd
ret
.drawsingle
mov esi,[currentobjptr]
mov edi,[curvidoffset]
mov edx,ecx
and edx,0FFh
xor eax,eax
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]
push esi
mov ch,[esi+6]
mov esi,[esi+2]
sprdrawa16b sprdrawprbw16b
pop esi
sub esi,8
dec cl
jnz near .loopobj2
ret
.drawspriteflipx2
mov bx,[esi]
push esi
mov ch,[esi+6]
mov esi,[esi+2]
sprdrawaf16b sprdrawprbw16b
pop esi
sub esi,8
dec cl
jnz near .loopobj2
ret
NEWSYM draw8x816b
cmp byte[osm2dis],1
je .osm2dis
cmp byte[bgmode],2
je near draw8x816boffset
.osm2dis
cmp byte[bgmode],5
je near draw16x816
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 draw8x816bwinon
.domosaic
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
cmp dword[ebx],0
je .loopd4
Draw8x816bmacro 0
Draw8x816bmacro 1
Draw8x816bmacro 2
Draw8x816bmacro 3
.loopd4
cmp dword[ebx+4],0
je .loopd8
Draw8x816bmacro 4
Draw8x816bmacro 5
Draw8x816bmacro 6
Draw8x816bmacro 7
.loopd8
.hprior
add esi,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
cmp dword[ebx+4],0
je .loopd4b
Draw8x816bflipmacro 0
Draw8x816bflipmacro 1
Draw8x816bflipmacro 2
Draw8x816bflipmacro 3
.loopd4b
cmp dword[ebx],0
je .loopd8b
Draw8x816bflipmacro 4
Draw8x816bflipmacro 5
Draw8x816bflipmacro 6
Draw8x816bflipmacro 7
.loopd8b
add esi,16
inc dl
cmp dl,20h
jne .loopc
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -