📄 makev16b.asm
字号:
dec cl jz .doneloop dec dl jnz .zeroloop mov ax,[esi] mov dl,dh test ax,0FFFFh jnz .loopm jmp .zeroloop.doneloop retNEWSYM 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 push ecx mov dword[bgsubby],262144 mov ecx,[vcache2b] add ecx,262144 mov [bgofwptr],ecx cmp dword[tempcach],ecx jb .nobit mov dword[bgsubby],131072 mov ecx,[vcache4b] add ecx,131072 mov [bgofwptr],ecx cmp dword[tempcach],ecx jb .nobit mov ecx,[vcache8b] add ecx,65536 mov [bgofwptr],ecx mov dword[bgsubby],65536.nobit pop ecx; 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,[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,[curmosaicsz] cmp dh,1 jne near domosaic16b.nodraw2 retNEWSYM 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 retNEWSYM 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 [temptile],edx push ecx mov dword[bgsubby],262144 mov ecx,[vcache2b] add ecx,262144 mov [bgofwptr],ecx cmp dword[tempcach],ecx jb .nobit mov dword[bgsubby],131072 mov ecx,[vcache4b] add ecx,131072 mov [bgofwptr],ecx cmp dword[tempcach],ecx jb .nobit mov ecx,[vcache8b] add ecx,65536 mov [bgofwptr],ecx mov dword[bgsubby],65536.nobit pop ecx 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,[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,[curmosaicsz] cmp dh,1 jne near domosaic16b retSECTION .bss.yadd resw 1.yflipadd resw 1SECTION .textdraw16x1616bwinon: 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,[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,[curmosaicsz] cmp dh,1 jne near domosaic16b ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -