📄 makevid.asm
字号:
cmp dh,254
jae near .clipped
.nooutclip
mov edi,[dwinptrproc]
xor eax,eax
; start drawing 1's from 0 to left
.nextdoti
xor byte[edi+eax],1
inc al
cmp al,dl
jb .nextdoti
mov al,dh
cmp al,255
je .nextdot4i
inc al
; start drawing 1's from right to 255
.nextdot3i
xor byte[edi+eax],1
inc al
jnz .nextdot3i
.nextdot4i
.donextwin
ret
NEWSYM dualwinxnor
mov dl,[winl2]
mov dh,[winr2]
test al,04h
jnz near .outside
cmp dl,254
je .clipped
cmp dl,dh
jb .clip
.clipped
jmp .donextwin
.clip
mov edi,[dwinptrproc]
xor eax,eax
; start drawing 1's from 0 to left
cmp dl,0
je .nextdot2
mov al,dl
inc al
.nextdot2
xor byte[edi+eax],1
inc al
cmp al,dh
jb .nextdot2
xor byte[edi+eax],1
jmp .donextwin
.outside
cmp dl,dh
jb .clip2
mov edi,[dwinptrproc]
mov ecx,64
.loopxor
xor dword[edi],01010101h
add edi,4
dec ecx
jnz .loopxor
jmp .donextwin
.clip2
cmp dl,1
ja .nooutclip
cmp dh,254
jae near .clipped
.nooutclip
mov edi,[dwinptrproc]
xor eax,eax
; start drawing 1's from 0 to left
.nextdoti
xor byte[edi+eax],1
inc al
cmp al,dl
jb .nextdoti
mov al,dh
cmp al,255
je .nextdot4i
inc al
; start drawing 1's from right to 255
.nextdot3i
xor byte[edi+eax],1
inc al
jnz .nextdot3i
.nextdot4i
.donextwin
mov edi,[dwinptrproc]
mov ecx,64
.loopxor2
xor dword[edi],01010101h
add edi,4
dec ecx
jnz .loopxor2
ret
;pwinspenab db 0
;pwinsptype dd 0
;winonstype db 0
;dualwinsp db 0
NEWSYM winonsp, db 0
NEWSYM makewindowsp
mov al,[winobjen]
mov byte[winonsp],0
test dword[winenabm],1010h
jz near .finishwin
; upon entry, al = win enable bits
cmp byte[disableeffects],1
je near .finishwin
mov bl,al
and bl,00001010b
cmp bl,00001010b
je near makedualwinsp
cmp bl,0
je near .finishwin
mov byte[winonsp],1
; check if data matches previous data
cmp al,[pwinspenab]
jne .skipenab
mov ebx,[winl1]
cmp ebx,[pwinsptype]
jne .skipenab2
mov dword[cwinptr],winspdata+16
mov al,[winonstype]
mov [winonsp],al
ret
.skipenab
mov [pwinspenab],al
mov ebx,[winl1]
.skipenab2
mov [pwinsptype],ebx
mov dl,[winl1]
mov dh,[winr1]
test al,00000010b
jnz .win1
mov dl,[winl2]
mov dh,[winr2]
shr al,2
.win1
test al,01h
jnz near .outside
cmp dl,254
je .clipped
cmp dl,dh
jb .clip
.clipped
mov byte[winonsp],0
mov byte[winonstype],0
ret
.clip
mov edi,winspdata+16
xor eax,eax
; start drawing 1's from 0 to left
cmp dl,0
je .nextdot2
.nextdot
mov byte[edi+eax],0
inc al
cmp al,dl
jbe .nextdot
.nextdot2
mov byte[edi+eax],1
inc al
cmp al,dh
jb .nextdot2
mov byte[edi+eax],1
cmp dh,255
je .nextdot4
; start drawing 1's from right to 255
.nextdot3
mov byte[edi+eax],0
inc al
jnz .nextdot3
.nextdot4
mov byte[winonsp],1
mov byte[winonstype],1
mov dword[cwinptr],winspdata+16
ret
.outside
cmp dl,dh
jb .clip2
mov byte[winonsp],0FFh
mov byte[winonstype],0FFh
mov dword[cwinptr],winspdata+16
ret
.clip2
cmp dl,1
ja .nooutclip
cmp dh,254
jae near .clipped
.nooutclip
mov edi,winspdata+16
xor eax,eax
; start drawing 1's from 0 to left
.nextdoti
mov byte[edi+eax],1
inc al
cmp al,dl
jb .nextdoti
.nextdot2i
mov byte[edi+eax],0
inc al
cmp al,dh
jb .nextdot2i
mov byte[edi+eax],0
cmp al,255
je .nextdot4i
inc al
; start drawing 1's from right to 255
.nextdot3i
mov byte[edi+eax],1
inc al
jnz .nextdot3i
.nextdot4i
mov byte[winonsp],1
mov byte[winonstype],1
mov dword[cwinptr],winspdata+16
ret
.finishwin
ret
NEWSYM makedualwinsp
mov ecx,ebp
shl cl,1
mov dl,[winlogicb]
and dl,03h
mov cl,dl
mov byte[winonsp],1
; check if data matches previous data
cmp cl,[dualwinsp]
jne .skipenab3
cmp al,[pwinspenab]
jne .skipenab
mov ebx,[winl1]
cmp ebx,[pwinsptype]
jne .skipenab2
mov dword[cwinptr],winspdata+16
mov al,[winonstype]
mov [winonsp],al
ret
.skipenab3
mov [dualwinsp],cl
.skipenab
mov [pwinspenab],al
mov ebx,[winl1]
.skipenab2
mov [pwinsptype],ebx
mov dword[dwinptrproc],winspdata+16
mov dword[cwinptr],winspdata+16
mov byte[winonsp],1
mov byte[winonstype],1
jmp dualstartprocess
; window logic data
NEWSYM windowdata, times 16 db 0
NEWSYM numwin, db 0
NEWSYM multiwin, db 0
NEWSYM multiclip, db 0
NEWSYM multitype, db 0
; jmp .finishwin
%macro procwindow 1
cmp byte[disableeffects],1
je near .finishwin
mov al,%1
test al,00001010b
jz near .finishwin
mov esi,windowdata
mov bl,al
mov byte[winon],1
and bl,00001010b
and al,00000101b
mov byte[numwin],0
cmp bl,00001010b
je near .multiwin
mov byte[multiwin],0
test bl,00000010b
jnz .win1
mov cl,[winl2]
mov ch,[winr2]
shr al,2
jmp .okaywin
.win1
mov cl,[winl1]
mov ch,[winr1]
and al,01h
.okaywin
cmp ch,255
je .noinc
inc ch
.noinc
test al,01h
jnz .wininside
cmp cl,ch
jae .noinsidemask
mov [esi],cl
mov byte[esi+1],01h
mov [esi+2],ch
mov byte[esi+3],0FFh
mov byte[numwin],2
jmp .finishwin
.noinsidemask
mov byte[winon],0
jmp .finishwin
.wininside
cmp cl,ch
ja .nooutsidemask
.nonotoutside
cmp ch,254
jb .skipnodraw
cmp cl,1
jbe .noinsidemask
.skipnodraw
mov byte[esi],0
mov byte[esi+1],01h
mov byte[esi+2],cl
mov byte[esi+3],0FFh
mov byte[esi+4],ch
mov byte[esi+5],01h
mov byte[numwin],3
jmp .finishwin
.nooutsidemask
mov byte[esi],0
mov byte[esi+1],01h
mov byte[numwin],1
jmp .finishwin
; **************
; *Multiwindows*
; **************
.multiwin
mov byte[winon],0
mov byte[multiwin],0
mov byte[multiclip],al
mov al,[winlogica]
mov ecx,ebp
shl ecx,1
shr al,cl
and al,3h
mov byte[multitype],al
mov cl,[winl1]
mov ch,[winr1]
mov esi,windowdata
cmp ch,255
je .noinc2
inc ch
.noinc2
test byte[multiclip],01h
jnz .wininside2
cmp cl,ch
jae .nowina
mov [esi],cl
mov byte[esi+1],01h
mov [esi+2],ch
mov byte[esi+3],0FFh
add esi,4
mov byte[numwin],2
jmp .secondwin
.nowina
mov cl,[winl2]
mov ch,[winr2]
mov al,[multiclip]
shr al,2
jmp .okaywin
.wininside2
cmp cl,ch
ja .nooutsidemask2
cmp ch,254
jb .skipnodraw2
cmp cl,1
jbe .nooutsidemask2
.skipnodraw2
mov byte[esi],0
mov byte[esi+1],01h
mov byte[esi+2],cl
mov byte[esi+3],0FFh
mov byte[esi+4],ch
mov byte[esi+5],01h
mov byte[numwin],3
jmp .secondwin
.nooutsidemask2
mov byte[esi],0
mov byte[esi+1],01h
mov byte[numwin],1
.secondwin
mov byte[multiwin],1
mov byte[winon],1
.finishwin
%endmacro
NEWSYM procspritessub
test byte[scrndis],10h
jnz .nosprites
test byte[scrnon+1],10h
jz .nosprites
test byte[scrnon],10h
jnz .nosprites
cmp byte[winonsp],0FFh
je .nosprites
xor ebx,ebx
mov bl,[curypos]
add ebx,[cursprloc]
mov cl,[ebx]
cmp byte[sprprifix],0
jne .sprprio
add dword[cursprloc],256
.sprprio
or cl,cl
jz .nosprites
call drawsprites
.nosprites
ret
NEWSYM procspritesmain
test byte[scrndis],10h
jnz .nosprites
test byte[scrnon],10h
jz .nosprites
cmp byte[winonsp],0FFh
je .nosprites
xor ebx,ebx
mov bl,[curypos]
add ebx,[cursprloc]
mov cl,[ebx]
cmp byte[sprprifix],0
jne .sprprio
add dword[cursprloc],256
.sprprio
or cl,cl
jz .nosprites
call drawsprites
.nosprites
ret
NEWSYM curbgnum, db 0
NEWSYM drawbackgrndsub
mov esi,[colormodeofs]
mov bl,[esi+ebp]
cmp bl,0
je near .noback
mov al,[curbgnum]
test byte[scrnon+1],al
jz near .noback
test byte[scrnon],al
jnz near .noback
test byte[alreadydrawn],al
jnz near .noback
test byte[scrndis],al
jnz near .noback
mov byte[winon],0
test byte[winenabs],al
jz near .nobackwin
; procwindow [winbg1en+ebp]
mov al,[winbg1en+ebp]
call makewindow
cmp byte[winon],0FFh
je near .noback
.nobackwin
mov bl,[curbgnum]
mov byte[curmosaicsz],1
test byte[mosaicon],bl
jz .nomos
mov bl,[mosaicsz]
cmp bl,0
je .nomos
inc bl
mov [curmosaicsz],bl
.nomos
mov byte[bgcoloradder],0
cmp byte[bgmode],0
jne .nomode0
mov eax,ebp
shl eax,5
mov byte[bgcoloradder],al
.nomode0
mov esi,[bg1vbufloc+ebp*4]
mov edi,[bg1tdatloc+ebp*4]
mov edx,[bg1tdabloc+ebp*4]
mov ebx,[bg1cachloc+ebp*4]
mov eax,[bg1xposloc+ebp*4]
mov cl,[curbgnum]
test byte[bgtilesz],cl
jnz .16x16
mov ecx,[bg1yaddval+ebp*4]
call draw8x8
cmp byte[drawn],33
jne .notalldrawn
mov al,[curbgnum]
or [alreadydrawn],al
.notalldrawn
jmp .noback
.16x16
mov ecx,[bg1yaddval+ebp*4]
call draw16x16
cmp byte[drawn],33
jne .notalldrawnb
mov al,[curbgnum]
or [alreadydrawn],al
.notalldrawnb
.noback
ret
NEWSYM drawbackgrndmain
mov esi,[colormodeofs]
mov bl,[esi+ebp]
cmp bl,0
je near .noback
mov al,[curbgnum]
test byte[scrnon],al
jz near .noback
test byte[alreadydrawn],al
jnz near .noback
test byte[scrndis],al
jnz near .noback
mov byte[winon],0
test byte[winenabm],al
jz near .nobackwin
; procwindow [winbg1en+ebp]
mov al,[winbg1en+ebp]
call makewindow
cmp byte[winon],0FFh
je near .noback
.nobackwin
mov bl,[curbgnum]
mov byte[curmosaicsz],1
test byte[mosaicon],bl
jz .nomos
mov bl,[mosaicsz]
cmp bl,0
je .nomos
inc bl
mov [curmosaicsz],bl
.nomos
mov byte[bgcoloradder],0
cmp byte[bgmode],0
jne .nomode0
mov eax,ebp
shl eax,5
mov byte[bgcoloradder],al
.nomode0
mov esi,[bg1vbufloc+ebp*4]
mov edi,[bg1tdatloc+ebp*4]
mov edx,[bg1tdabloc+ebp*4]
mov ebx,[bg1cachloc+ebp*4]
mov eax,[bg1xposloc+ebp*4]
mov cl,[curbgnum]
test byte[bgtilesz],cl
jnz .16x16
mov ecx,[bg1yaddval+ebp*4]
call draw8x8
cmp byte[drawn],33
jne .notalldrawn
mov al,[curbgnum]
or [alreadydrawn],al
.notalldrawn
jmp .noback
.16x16
mov ecx,[bg1yaddval+ebp*4]
call draw16x16
cmp byte[drawn],33
jne .notalldrawnb
mov al,[curbgnum]
or [alreadydrawn],al
.notalldrawnb
.noback
ret
NEWSYM procbackgrnd
mov esi,[colormodeofs]
mov bl,[esi+ebp]
cmp bl,0
je near .noback
mov al,[curbgnum]
mov ah,al
test byte[scrndis],al
jnz near .noback
test [scrnon],ax
jz near .noback
push ebp
shl ebp,6
mov edi,cachebg1
add edi,ebp
pop ebp
cmp bl,[curcolbg1+ebp]
je .skipclearcache
mov [curcolbg1+ebp],bl
mov ax,[bg1ptr+ebp*2]
mov [curbgofs1+ebp*2],ax
call fillwithnothing
.skipclearcache
xor eax,eax
mov [curcolor],bl
mov ax,[bg1objptr+ebp*2]
decideonmode
add edx,eax
xor eax,eax
mov [tempcach],edx
xor edx,edx
mov ax,[bg1objptr+ebp*2]
mov [curtileptr],ax
mov ax,[bg1ptr+ebp*2]
mov [bgptr],ax
cmp ax,[curbgofs1+ebp*2]
je .skipclearcacheb
mov [curbgofs1+ebp*2],ax
call fillwithnothing
.skipclearcacheb
mov ax,[bg1ptrb+ebp*2]
mov [bgptrb],ax
mov ax,[bg1ptrc+ebp*2]
mov [bgptrc],ax
mov ax,[bg1ptrd+ebp*2]
mov [bgptrd],ax
mov bl,[curbgnum]
mov ax,[curypos]
mov byte[curmosaicsz],1
test byte[mosaicon],bl
jz .nomos
mov bl,[mosaicsz]
cmp bl,0
je .nomos
inc bl
mov [curmosaicsz],bl
xor edx,edx
xor bh,bh
div bx
xor edx,edx
mul bx
xor edx,edx
mov dl,[mosaicsz]
add ax,[MosaicYAdder+edx*2]
.nomos
add ax,[bg1scroly+ebp*2]
mov dx,[bg1scrolx+ebp*2]
mov cl,[curbgnum]
test byte[bgtilesz],cl
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -