📄 makev16b.asm
字号:
jne .nozero
mov [edi],ax
.nozero
add esi,2
add edi,2
inc ebp
dec cl
jz .doneloop
dec dl
jnz .loopm
mov ax,[esi]
mov dl,dh
test ax,0FFFFh
jnz .loopm
.zeroloop
add esi,2
add edi,2
inc ebp
dec cl
jz .doneloop
dec dl
jnz .zeroloop
mov ax,[esi]
mov dl,dh
test ax,0FFFFh
jnz .loopm
jmp .zeroloop
.doneloop
ret
NEWSYM dowindow16b
mov ebx,windowdata
mov esi,xtravbuf+32
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 ax,[esi+edx*2]
test ax,0FFFFh
jz .nocopy
mov [edi+edx*2],ax
.nocopy
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
add dl,cl
jmp .procnext
.finishwin
xor eax,eax
ret
;*******************************************************
; Processes & Draws 8x8 tiles, offset mode
;*******************************************************
NEWSYM draw8x816boffset
mov [temp],al
mov [bshifter],ah
mov eax,esi
mov [yadder],ecx
mov [tempcach],ebx
mov ebx,56
sub ebx,ecx
mov [yrevadder],ebx
initoffsetmode
; 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 draw8x816bwinonoffset
.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 #
offsetmcachechk
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
procoffsetmode
add esi,16
dec byte[tileleft16b]
jnz near .loopa
xor eax,eax
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
procoffsetmode
add esi,16
dec byte[tileleft16b]
jnz near .loopa
xor eax,eax
cmp byte[drawn],0
je .nodraw2
mov dh,byte[curmosaicsz]
cmp dh,1
jne near domosaic16b
.nodraw2
ret
NEWSYM draw8x816bwinonoffset
mov byte[tileleft16b],33
mov byte[drawn],0
mov dl,[temp]
mov ebp,[winptrref]
.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 #
offsetmcachechk
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
Draw8x816bwinmacro 0
Draw8x816bwinmacro 1
Draw8x816bwinmacro 2
Draw8x816bwinmacro 3
.loopd4
cmp dword[ebx+4],0
je .loopd8
Draw8x816bwinmacro 4
Draw8x816bwinmacro 5
Draw8x816bwinmacro 6
Draw8x816bwinmacro 7
.loopd8
.hprior
procoffsetmode
add esi,16
add ebp,8
dec byte[tileleft16b]
jnz near .loopa
xor eax,eax
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
Draw8x816bwinflipmacro 0
Draw8x816bwinflipmacro 1
Draw8x816bwinflipmacro 2
Draw8x816bwinflipmacro 3
.loopd4b
cmp dword[ebx],0
je .loopd8b
Draw8x816bwinflipmacro 4
Draw8x816bwinflipmacro 5
Draw8x816bwinflipmacro 6
Draw8x816bwinflipmacro 7
.loopd8b
procoffsetmode
add esi,16
add ebp,8
dec byte[tileleft16b]
jnz near .loopa
xor eax,eax
ret
NEWSYM draw16x1616b
mov byte[drawn],0
mov [temp],eax
mov eax,esi
mov [yadder],ecx
mov [tempcach],ebx
mov ebx,56
sub ebx,ecx
mov [yrevadder],ebx
xor ebx,ebx
mov bl,[curypos]
mov [temptile],edx
; set up y adders
test byte[a16x16yinc],01h
jz .noincrc
mov word[.yadd],16
mov word[.yflipadd],0
jmp .yesincrc
.noincrc
mov word[.yadd],0
mov word[.yflipadd],16
.yesincrc
; 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 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
cmp byte[curmosaicsz],1
jne .domosaic
cmp byte[winon],0
jne near draw16x1616bwinon
.domosaic
mov byte[tileleft16b],33
mov dl,[temp]
.loopa
mov ax,[edi]
mov dh,ah
xor byte[a16x16xinc],1
test dh,40h
jnz .noxflip
test byte[a16x16xinc],01h
jnz .noincr2
inc ax
add edi,2
.noincr2
jmp .yesxflip
.noxflip
test byte[a16x16xinc],01h
jnz .noincr
add edi,2
jmp .yesincr
.noincr
inc ax
.yesincr
.yesxflip
xor dh,[curbgpr]
test dh,20h
jnz near .hprior
inc byte[drawn]
test dh,80h
jnz .noyflip
add ax,word[.yadd]
jmp .yesyflip
.noyflip
add ax,word[.yflipadd]
.yesyflip
and ax,03FFh ; filter out tile #
mov ebx,[tempcach]
shl ax,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
mov cl,[bshifter]
and dh,1Ch
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
xor eax,eax
; Start loop
Draw16x1616b 0, 0
Draw16x1616b 1, 2
Draw16x1616b 2, 4
Draw16x1616b 3, 6
Draw16x1616b 4, 8
Draw16x1616b 5, 10
Draw16x1616b 6, 12
Draw16x1616b 7, 14
.hprior
add esi,16
test byte[a16x16xinc],01h
jnz .noincrb2
inc dl
.noincrb2
cmp dl,20h
jne .loopc2
xor dl,dl
mov edi,[temptile]
.loopc2
dec byte[tileleft16b]
jnz near .loopa
mov dh,byte[curmosaicsz]
cmp dh,1
jne near domosaic16b
ret
; reversed loop
.rloop
mov cl,[bshifter]
and dh,1Ch
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
xor eax,eax
Draw16x1616b 7, 0
Draw16x1616b 6, 2
Draw16x1616b 5, 4
Draw16x1616b 4, 6
Draw16x1616b 3, 8
Draw16x1616b 2, 10
Draw16x1616b 1, 12
Draw16x1616b 0, 14
.skiploop2b
add esi,16
test byte[a16x16xinc],01h
jnz .noincrb
inc dl
.noincrb
cmp dl,20h
jne .loopc
xor dl,dl
mov edi,[temptile]
.loopc
dec byte[tileleft16b]
jnz near .loopa
mov dh,byte[curmosaicsz]
cmp dh,1
jne near domosaic16b
ret
.yadd dw 0
.yflipadd dw 0
draw16x1616bwinon:
mov byte[tileleft16b],33
mov dl,[temp]
mov ebp,[winptrref]
.loopa
mov ax,[edi]
mov dh,ah
xor byte[a16x16xinc],1
test dh,40h
jnz .noxflip
test byte[a16x16xinc],01h
jnz .noincr2
inc ax
add edi,2
.noincr2
jmp .yesxflip
.noxflip
test byte[a16x16xinc],01h
jnz .noincr
add edi,2
jmp .yesincr
.noincr
inc ax
.yesincr
.yesxflip
xor dh,[curbgpr]
test dh,20h
jnz near .hprior
inc byte[drawn]
test dh,80h
jnz .noyflip
add ax,word[draw16x1616b.yadd]
jmp .yesyflip
.noyflip
add ax,word[draw16x1616b.yflipadd]
.yesyflip
and ax,03FFh ; filter out tile #
mov ebx,[tempcach]
shl ax,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
mov cl,[bshifter]
and dh,1Ch
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
xor eax,eax
; Start loop
Draw16x1616bwin 0, 0, 0
Draw16x1616bwin 1, 2, 1
Draw16x1616bwin 2, 4, 2
Draw16x1616bwin 3, 6, 3
Draw16x1616bwin 4, 8, 4
Draw16x1616bwin 5, 10, 5
Draw16x1616bwin 6, 12, 6
Draw16x1616bwin 7, 14, 7
.hprior
add esi,16
add ebp,8
test byte[a16x16xinc],01h
jnz .noincrb2
inc dl
.noincrb2
cmp dl,20h
jne .loopc2
xor dl,dl
mov edi,[temptile]
.loopc2
dec byte[tileleft16b]
jnz near .loopa
mov dh,byte[curmosaicsz]
cmp dh,1
jne near domosaic16b
ret
; reversed loop
.rloop
mov cl,[bshifter]
and dh,1Ch
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
xor eax,eax
Draw16x1616bwin 7, 0, 0
Draw16x1616bwin 6, 2, 1
Draw16x1616bwin 5, 4, 2
Draw16x1616bwin 4, 6, 3
Draw16x1616bwin 3, 8, 4
Draw16x1616bwin 2, 10, 5
Draw16x1616bwin 1, 12, 6
Draw16x1616bwin 0, 14, 7
.skiploop2b
add esi,16
add ebp,8
test byte[a16x16xinc],01h
jnz .noincrb
inc dl
.noincrb
cmp dl,20h
jne .loopc
xor dl,dl
mov edi,[temptile]
.loopc
dec byte[tileleft16b]
jnz near .loopa
mov dh,byte[curmosaicsz]
cmp dh,1
jne near domosaic16b
ret
NEWSYM MakeV16BAsmEnd
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -