📄 mode7ext.asm
字号:
mov ebp,[cwinptr] mov edi,[vram] cmp dword[.mode7xadder],7F0h jg near .nextval3w cmp dword[.mode7xadder],-7F0h jl near .nextval3w cmp dword[.mode7yadder],7F0h jg near .nextval3w cmp dword[.mode7yadder],-7F0h jl near .nextval3w test byte[mode7set],80h jnz near .norep2w mov eax,[.mode7xpos] and eax,7FFh mov [.mode7xrpos],eax mov eax,[.mode7ypos] and eax,7FFh mov [.mode7yrpos],eax ; get tile data offset into edi mov ebx,[.mode7ypos+1] mov eax,[.mode7xpos+1] shl ebx,5 shr eax,3 and ebx,07FF8h shl al,1 mov bl,al mov edi,[vram] xor ch,ch mov [.mode7ptr],ebx mov cl,[edi+ebx] shl ecx,7 add edi,ecx jmp .nextvalw ALIGN16.nextvalw test byte[.mode7xrpos+1],08h jnz .rposoffxw.nextposxw test byte[.mode7yrpos+1],08h jnz near .rposoffyw.nextposyw mov cl,[.mode7yrpos+1] mov eax,[.mode7xadder] mov ch,[.mode7xrpos+1] add [.mode7xrpos],eax mov dl,[mode7tab+ecx] mov eax,[.mode7yadder] mov cl,[edi+edx] sub [.mode7yrpos],eax mov [esi+288],cl test cl,80h jnz .nodrawbw or cl,cl jz .nodrawbw test byte[ebp],0FFh jnz .nodrawbw mov [esi],cl.nodrawbw inc esi inc ebp dec byte[.temp] jnz .nextvalw jmp .finishmode7w.rposoffxw mov al,[.mode7xinc] mov edi,[vram] add [.mode7ptr],al mov ebx,[.mode7ptr] xor ecx,ecx mov cl,[edi+ebx] mov eax,[.mode7xadd2] shl ecx,7 sub [.mode7xrpos],eax add edi,ecx jmp .nextposxw.rposoffyw mov al,[.mode7yinc] mov edi,[vram] sub [.mode7ptr+1],al and byte[.mode7ptr+1],7Fh mov ebx,[.mode7ptr] xor ecx,ecx mov cl,[edi+ebx] mov eax,[.mode7yadd2] shl ecx,7 add [.mode7yrpos],eax add edi,ecx jmp .nextposyw.finishmode7w xor eax,eax ret;**********************************************************; Mode 7, no repetition mode;**********************************************************.norep2w test byte[mode7set],40h jnz .tilerep2w.nextvalb2w cmp byte[.mode7ypos+2],3 ja .offscr2w cmp byte[.mode7xpos+2],3 jbe near .offscr3w.offscr2w mov eax,[.mode7xadder] mov ebx,[.mode7yadder] add [.mode7xpos],eax sub [.mode7ypos],ebx inc esi inc ebp dec byte[.temp] jnz near .nextvalb2w jmp .finishmode7w.tilerep2w.nextvalb3w cmp byte[.mode7ypos+2],3 ja .offscr2bw cmp byte[.mode7xpos+2],3 jbe .offscr3w.offscr2bw mov ch,[.mode7xpos+1] mov eax,[.mode7xadder] mov cl,[.mode7ypos+1] mov ebx,[.mode7yadder] mov dl,[mode7tab+ecx] add [.mode7xpos],eax mov cl,[vrama+edx] sub [.mode7ypos],ebx mov [esi+288],cl test cl,80h jnz .nodraw2trb2w or cl,cl jz .nodraw2trb2w test byte[ebp],0FFh jnz .nodraw2trb2w mov [esi],cl.nodraw2trb2w inc esi inc ebp dec byte[.temp] jnz .nextvalb3w jmp .finishmode7w.offscr3w mov eax,[.mode7xpos] and eax,7FFh mov [.mode7xrpos],eax mov eax,[.mode7ypos] and eax,7FFh mov [.mode7yrpos],eax ; get tile data offset into edi mov ebx,[.mode7ypos+1] mov eax,[.mode7xpos+1] shl ebx,5 shr eax,3 and ebx,07FF8h shl al,1 mov bl,al mov edi,[vram] xor ch,ch mov [.mode7ptr],ebx mov cl,[edi+ebx] shl ecx,7 add edi,ecx.nextvalrw test byte[.mode7xrpos+1],08h jnz .rposoffxrw.nextposxrw test byte[.mode7yrpos+1],08h jnz near .rposoffyrw.nextposyrw mov cl,[.mode7yrpos+1] mov eax,[.mode7xadder] mov ch,[.mode7xrpos+1] add [.mode7xrpos],eax mov dl,[mode7tab+ecx] mov eax,[.mode7yadder] mov cl,[edi+edx] sub [.mode7yrpos],eax mov [esi+288],cl test cl,80h jnz .nodrawbrw or cl,cl jz .nodrawbrw test byte[ebp],0FFh jnz .nodrawbrw mov [esi],cl.nodrawbrw inc esi inc ebp dec byte[.temp] jnz .nextvalrw jmp .finishmode7w.rposoffxrw mov al,[.mode7xinc] mov edi,[vram] add [.mode7ptr],al mov cl,[.mode7xincc] cmp byte[.mode7ptr],cl je .roffw.roffxretbw mov ebx,[.mode7ptr] xor ecx,ecx mov cl,[edi+ebx] mov eax,[.mode7xadd2] shl ecx,7 sub [.mode7xrpos],eax add edi,ecx jmp .nextposxrw.rposoffyrw mov al,[.mode7yinc] mov edi,[vram] sub [.mode7ptr+1],al js .roffw.roffyretbw mov ebx,[.mode7ptr] xor ecx,ecx mov cl,[edi+ebx] mov eax,[.mode7yadd2] shl ecx,7 add [.mode7yrpos],eax add edi,ecx jmp .nextposyrw.roffw test byte[mode7set],40h jnz .tilerep3w jmp .finishmode7w.tilerep3w and byte[.mode7yrpos+1],07h and byte[.mode7xrpos+1],07h mov cl,[.mode7yrpos+1] mov eax,[.mode7xadder] mov ch,[.mode7xrpos+1] add [.mode7xrpos],eax mov dl,[mode7tab+ecx] mov eax,[.mode7yadder] mov cl,[vrama+edx] sub [.mode7yrpos],eax mov [esi+288],cl test cl,80h jnz .nodrawbr2w or cl,cl jz .nodrawbr2w test byte[ebp],0FFh jnz .nodrawbr2w mov [esi],cl.nodrawbr2w inc esi inc ebp dec byte[.temp] jnz .tilerep3w jmp .finishmode7w;**********************************************************; Mode 7, old routines;**********************************************************.nextval3w test byte[mode7set],80h jnz near .norepw.nextval2w ; get tile # @ ([.mode7xpos],[.mode7ypos]) ; get tile location in vram (tileloc=x*2+y*256) mov ebx,[.mode7ypos+1] mov eax,[.mode7xpos+1] mov cl,bl mov ch,al shl ebx,5 shr eax,3 mov dl,[mode7tab+ecx] and ebx,07FF8h shl al,1 mov bl,al xor ch,ch mov cl,[edi+ebx] mov eax,[.mode7xadder] shl ecx,7 add [.mode7xpos],eax add ecx,edx mov eax,[.mode7yadder] mov cl,[edi+ecx] sub [.mode7ypos],eax mov [esi+288],cl test cl,80h jnz .nodraww or cl,cl jz .nodraww test byte[ebp],0FFh jnz .nodraww mov [esi],cl.nodraww inc esi inc ebp dec byte[.temp] jnz .nextval2w xor eax,eax ret ; Color repetition.norepw test byte[mode7set],40h jnz near .tilerepw.nextvalbw ; get tile # @ ([.mode7xpos],[.mode7ypos]) ; get tile location in vram (tileloc=x*2+y*256) cmp byte[.mode7ypos+2],3 ja near .offscrw cmp byte[.mode7xpos+2],3 ja near .offscrw.offscrwb mov ebx,[.mode7ypos+1] mov eax,[.mode7xpos+1] mov cl,bl mov ch,al shl ebx,5 shr eax,3 mov dl,[mode7tab+ecx] and ebx,07FF8h shl al,1 mov bl,al xor ch,ch mov cl,[edi+ebx] mov eax,[.mode7xadder] shl ecx,7 add [.mode7xpos],eax add ecx,edx mov eax,[.mode7yadder] mov cl,[edi+ecx] sub [.mode7ypos],eax mov [esi+288],cl test cl,80h jnz .nodraw2w or cl,cl jz .nodraw2w test byte[ebp],0FFh jnz .nodraw2w mov [esi],cl.nodraw2w inc esi inc ebp dec byte[.temp] jnz near .nextvalbw jmp .goonw.offscrwc cmp byte[.mode7ypos+2],3 ja .offscrw cmp byte[.mode7xpos+2],3 jbe near .offscrwb.offscrw mov eax,[.mode7xadder] mov ebx,[.mode7yadder] add [.mode7xpos],eax sub [.mode7ypos],ebx inc esi inc ebp dec byte[.temp] jnz .offscrwc.goonw xor eax,eax ret.tilerepw.nextvalbtrw ; get tile # @ ([.mode7xpos],[.mode7ypos]) ; get tile location in vram (tileloc=x*2+y*256) cmp byte[.mode7ypos+2],3 ja near .offscrtrw cmp byte[.mode7xpos+2],3 ja near .offscrtrw.notoffscrtrw mov ebx,[.mode7ypos+1] mov eax,[.mode7xpos+1] mov cl,bl mov ch,al shl ebx,5 shr eax,3 mov dl,[mode7tab+ecx] and ebx,07FF8h shl al,1 mov bl,al xor ch,ch mov cl,[edi+ebx] mov eax,[.mode7xadder] shl ecx,7 add [.mode7xpos],eax add ecx,edx mov eax,[.mode7yadder] mov cl,[edi+ecx] sub [.mode7ypos],eax mov [esi+288],cl test cl,80h jnz .nodraw2trw or cl,cl jz .nodraw2trw test byte[ebp],0FFh jnz .nodraw2trw mov [esi],cl.nodraw2trw inc esi inc ebp dec byte[.temp] jnz near .nextvalbtrw jmp .goonw.offscrtrwb cmp byte[.mode7ypos+2],3 ja .offscrtrw cmp byte[.mode7xpos+2],3 jbe near .notoffscrtrw.offscrtrw mov ch,[.mode7xpos+1] mov eax,[.mode7xadder] mov cl,[.mode7ypos+1] mov ebx,[.mode7yadder] mov dl,[mode7tab+ecx] add [.mode7xpos],eax mov cl,[vrama+edx] sub [.mode7ypos],ebx mov [esi+288],cl test cl,80h jnz .nodraw2trbw or cl,cl jz .nodraw2trbw test byte[ebp],0FFh jnz .nodraw2trbw mov [esi],cl.nodraw2trbw inc esi inc ebp dec byte[.temp] jnz near .offscrtrwb jmp .goonwNEWSYM drawmode7extbg2 mov esi,[cwinptr] mov [winptrref],esi ; esi = pointer to video buffer mov esi,[curvidoffset] ; esi = [vidbuffer] + curypos * 288 + 16 cmp byte[curmosaicsz],1 je .nomosaic mov esi,xtravbuf+16 mov ecx,64.clearnext mov dword[esi],0 add esi,4 dec ecx jnz .clearnext mov esi,xtravbuf+16.nomosaic cmp byte[curmosaicsz],1 jne .domosaic cmp byte[winon],0 jne near .drawwin.domosaic mov ecx,256.loop mov al,[esi+288] test al,80h jz .nopr2 and al,7Fh mov [esi],al.nopr2 inc esi dec ecx jnz .loop xor eax,eax mov dh,[curmosaicsz] cmp dh,1 jne near domosaic ret.drawwin mov ebp,[cwinptr] mov [esi],cl.nodrawbw mov ecx,256.loop2 mov al,[esi+288] test byte[ebp],0FFh jnz .nopr2b test al,80h jz .nopr2b and al,7Fh mov [esi],al.nopr2b inc esi inc ebp dec ecx jnz .loop2 xor eax,eax mov dh,[curmosaicsz] cmp dh,1 jne near domosaic ret%macro Mode7Normalng 0 mov [esi+75036],dl test dl,80h jnz %%nodrawb or dl,dl jz %%nodrawb mov [esi],dl%%nodrawb inc esi%endmacroNEWSYM drawmode7ngextbg ProcessBuildWindow 0 mov esi,[cwinptr] mov [winptrref],esi Mode7Calculate ; esi = pointer to video buffer mov esi,[curvidoffset] ; esi = [vidbuffer] + curypos * 288 + 16 cmp byte[curmosaicsz],1 je .nomosaic mov esi,xtravbuf+16 mov ecx,64.clearnext mov dword[esi],0 add esi,4 dec ecx jnz .clearnext mov esi,xtravbuf+16.nomosaic ; esi = pointer to video buffer ; edi = pointer to vram ; [.mode7xadder] = dword value to add to x value (decimal between 7 & 8bit) ; [.mode7yadder] = dword value to add to y value (decimal between 7 & 8bit) ; [.mode7xpos] = dword value of x position, decimal between 7 & 8bit ; [.mode7xpos+1] = word value of x position ; [.mode7ypos] = dword value of y position, decimal between 7 & 8bit ; [.mode7ypos+1] = word value of y position xor ebx,ebx xor edx,edx xor ecx,ecx mov dword[.mode7xadd2],800h mov byte[.mode7xinc],2 mov byte[.mode7xincc],0 test dword[.mode7xadder],80000000h jz .noneg mov dword[.mode7xadd2],-800h mov byte[.mode7xinc],-2 mov byte[.mode7xincc],0FEh.noneg mov dword[.mode7yadd2],800h mov byte[.mode7yinc],1 test dword[.mode7yadder],80000000h jz .noneg2 mov dword[.mode7yadd2],-800h mov byte[.mode7yinc],-1.noneg2 cmp byte[ngwinen],1 je near .drawmode7win mov edi,[vram] cmp dword[.mode7xadder],7F0h jg near .nextval3 cmp dword[.mode7xadder],-7F0h jl near .nextval3 cmp dword[.mode7yadder],7F0h jg near .nextval3 cmp dword[.mode7yadder],-7F0h jl near .nextval3 Mode7Process Mode7Normalng, domosaic, 1.nextval3 Mode7ProcessB Mode7Normalng, domosaic, 1 retALIGN32SECTION .bss.temp resd 1 ; for byte move left.mode7xpos resd 1 ; x position.tempa2 resd 1 ; keep this blank!.mode7xrpos resd 1 ; x position.tempa resd 1 ; keep this blank!.mode7ypos resd 1 ; y position.tempb2 resd 1 ; keep this blank!.mode7yrpos resd 1 ; y position.tempb resd 1 ; keep this blank!.mode7xadder resd 1 ; number to add for x.tempc2 resd 1 ; keep this blank!.mode7xadd2 resd 1 ; number to add for x.tempc resd 1 ; keep this blank!.mode7yadder resd 1 ; number to add for y.tempd2 resd 1 ; keep this blank!.mode7yadd2 resd 1 ; number to add for y.tempd resd 1 ; keep this blank!.mode7ptr resd 1 ; pointer value.mode7xinc resd 1 ; number to add for x.mode7xincc resd 1 ; range check for x.mode7yinc resd 1 ; number to add for y.mode7xsloc resd 1 ; which screen x.mode7ysloc resd 1 ; which screen y.mode7xsrl resd 1 ; which relative screen x.mode7ysrl resd 1 ; which relative screen y.cxloc resw 1 ; cx location.cyloc resw 1 ; cy location.m7xaddofa resd 1.m7xaddof2a resd 1.m7yaddofa resd 1.m7yaddof2a resd 1SECTION .text.drawmode7win.domosaicw mov ebx,[.mode7xrpos] mov [mode7xrpos],ebx mov ebx,[.mode7yrpos] mov [mode7yrpos],ebx mov ebx,[.mode7xadder] mov [mode7xadder],ebx mov ebx,[.mode7yadder] mov [mode7yadder],ebx mov edi,[vram] Mode7Processngw Mode7Normalng, domosaic, 1NEWSYM drawmode7ngextbg2 ; esi = pointer to video buffer mov esi,[curvidoffset] ; esi = [vidbuffer] + curypos * 288 + 16 cmp byte[curmosaicsz],1 je .nomosaic mov esi,xtravbuf+16 mov ecx,64.clearnext mov dword[esi],0 add esi,4 dec ecx jnz .clearnext mov esi,xtravbuf+16.nomosaic mov ecx,256.loop mov al,[esi+75036] test al,80h jz .nopr2 and al,7Fh mov [esi],al.nopr2 inc esi dec ecx jnz .loop xor eax,eax mov dh,[curmosaicsz] cmp dh,1 jne near domosaic ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -