📄 makevid.asm
字号:
jnz .16x16
call proc8x8
mov [bg1vbufloc+ebp*4],esi
mov [bg1tdatloc+ebp*4],edi
mov [bg1tdabloc+ebp*4],edx
mov [bg1cachloc+ebp*4],ebx
mov [bg1yaddval+ebp*4],ecx
mov [bg1xposloc+ebp*4],eax
ret
.16x16
call proc16x16
mov [bg1vbufloc+ebp*4],esi
mov [bg1tdatloc+ebp*4],edi
mov [bg1tdabloc+ebp*4],edx
mov [bg1cachloc+ebp*4],ebx
mov [bg1yaddval+ebp*4],ecx
mov [bg1xposloc+ebp*4],eax
.noback
ret
NEWSYM nextprimode, db 0
NEWSYM cursprloc, dd 0
NEWSYM curcolor, db 0
NEWSYM curtileptr, dw 0
; esi = pointer to video buffer
; edi = pointer to tile data
; ebx = cached memory
; al = current x position
NEWSYM bg1vbufloc, dd 0
NEWSYM bg2vbufloc, dd 0
NEWSYM bg3vbufloc, dd 0
NEWSYM bg4vbufloc, dd 0
NEWSYM bg1tdatloc, dd 0
NEWSYM bg2tdatloc, dd 0
NEWSYM bg3tdatloc, dd 0
NEWSYM bg4tdatloc, dd 0
NEWSYM bg1tdabloc, dd 0
NEWSYM bg2tdabloc, dd 0
NEWSYM bg3tdabloc, dd 0
NEWSYM bg4tdabloc, dd 0
NEWSYM bg1cachloc, dd 0
NEWSYM bg2cachloc, dd 0
NEWSYM bg3cachloc, dd 0
NEWSYM bg4cachloc, dd 0
NEWSYM bg1yaddval, dd 0
NEWSYM bg2yaddval, dd 0
NEWSYM bg3yaddval, dd 0
NEWSYM bg4yaddval, dd 0
NEWSYM bg1xposloc, dd 0
NEWSYM bg2xposloc, dd 0
NEWSYM bg3xposloc, dd 0
NEWSYM bg4xposloc, dd 0
NEWSYM alreadydrawn, db 0
NEWSYM fillwithnothing
push edi
xor eax,eax
mov ecx,16
.loop
mov [edi],eax
add edi,4
dec ecx
jnz .loop
pop edi
ret
NEWSYM bg3draw, db 0
NEWSYM maxbr, db 0
NEWSYM blanker
; calculate current video offset
push ebx
push esi
xor ebx,ebx
mov bx,[curypos]
mov esi,ebx
shl esi,8
shl ebx,5
add esi,ebx
add esi,16
add esi,[vidbuffer]
mov bl,64
.next
mov dword[esi],0
add esi,4
dec bl
jnz .next
pop esi
pop ebx
ret
ALIGN32
NEWSYM bg3high2, dd 0
NEWSYM newengen, dd 0
NEWSYM cwinenabm, dd 0
NEWSYM drawline
mov al,[winenabs]
mov [cwinenabm],al
mov byte[bg3high2],0
cmp byte[bgmode],1
jne .nohigh
mov al,[bg3highst]
mov [bg3high2],al
.nohigh
cmp byte[cbitmode],1
je near drawline16b
mov al,[vidbright]
cmp al,[maxbr]
jbe .nochange
mov [maxbr],al
.nochange
cmp byte[ForceNewGfxOff],0
jne .nonewgfx
cmp byte[newengen],1
je near newengine8b
.nonewgfx
cmp byte[forceblnk],0
jne near blanker
mov byte[alreadydrawn],0
; cmp byte[curypos],70
; jne .no
; push ebx
; mov bl,[winlogica]
; mov [bg1sx],bl
; pop ebx
;.no
push ebx
xor ebx,ebx
mov bl,[bgmode]
shl bl,2
add ebx,colormodedef
mov [colormodeofs],ebx
pop ebx
cmp byte[bgmode],7
je near processmode7
mov al,[scrnon]
test [scrnon+1],al
jz .nomainsub
test byte[scrnon],10h
jnz .nomainsub
test byte[scrnon+1],10h
jz .nomainsub
mov al,[scrnon+1]
xor al,0FFh
and [scrnon],al
.nomainsub
push esi
push edi
push ebx
push edx
push ebp
; calculate current video offset
xor ebx,ebx
mov bx,[curypos]
mov esi,ebx
shl esi,8
shl ebx,5
add esi,ebx
add esi,16
add esi,[vidbuffer]
mov [curvidoffset],esi
; clear video buffer
mov edi,esi
mov ecx,64
xor eax,eax
rep stosd
; do sprite windowing
call makewindowsp
; get current sprite table
xor ebx,ebx
mov bl,[curypos]
shl ebx,9
add ebx,[spritetablea]
mov [currentobjptr],ebx
mov dword[cursprloc],sprleftpr
; setup priorities
cmp byte[sprprifix],0
je .nosprprio
mov dword[cursprloc],sprlefttot
call preparesprpr
.nosprprio
; clear registers
xor eax,eax
xor ecx,ecx
; process backgrounds
; do background 2
mov byte[curbgnum],02h
mov ebp,01h
call procbackgrnd
; do background 1
mov byte[curbgnum],01h
mov ebp,00h
call procbackgrnd
; do background 4
mov byte[curbgnum],08h
mov ebp,03h
call procbackgrnd
; do background 3
mov byte[curbgnum],04h
mov ebp,02h
call procbackgrnd
cmp byte[bgmode],1
ja near priority2
test byte[scaddset],02h
jz near .nosubsc
; draw backgrounds
mov byte[curbgpr],0h
; do background 4
mov byte[curbgnum],08h
mov ebp,03h
call drawbackgrndsub
; do background 3
mov byte[curbgnum],04h
mov ebp,02h
call drawbackgrndsub
mov ebp,0
call procspritessub
mov byte[curbgpr],20h
; do background 4
mov byte[curbgnum],08h
mov ebp,03h
call drawbackgrndsub
; do background 3
cmp byte[bg3high2],1
je .bg3nothigh
mov byte[curbgnum],04h
mov ebp,02h
call drawbackgrndsub
.bg3nothigh
mov ebp,1
call procspritessub
; do background 2
mov byte[curbgpr],0h
mov byte[curbgnum],02h
mov ebp,01h
call drawbackgrndsub
; do background 1
mov byte[curbgnum],01h
mov ebp,00h
call drawbackgrndsub
mov ebp,2
call procspritessub
; do background 2
mov byte[curbgpr],20h
mov byte[curbgnum],02h
mov ebp,01h
call drawbackgrndsub
; do background 1
mov byte[curbgnum],01h
mov ebp,00h
call drawbackgrndsub
mov ebp,3
call procspritessub
cmp byte[bg3high2],1
jne .bg3high
; do background 3
mov byte[curbgpr],20h
mov byte[curbgnum],04h
mov ebp,02h
call drawbackgrndsub
.bg3high
.nosubsc
mov al,[winenabm]
mov [cwinenabm],al
mov byte[curbgpr],0h
; do background 4
mov byte[curbgnum],08h
mov ebp,03h
call drawbackgrndmain
; do background 3
mov byte[curbgnum],04h
mov ebp,02h
call drawbackgrndmain
mov ebp,0
call procspritesmain
mov byte[curbgpr],20h
; do background 4
mov byte[curbgnum],08h
mov ebp,03h
call drawbackgrndmain
; do background 3
cmp byte[bg3high2],1
je .bg3nothighb
mov byte[curbgnum],04h
mov ebp,02h
call drawbackgrndmain
.bg3nothighb
mov ebp,1
call procspritesmain
; do background 2
mov byte[curbgpr],0h
mov byte[curbgnum],02h
mov ebp,01h
call drawbackgrndmain
; do background 1
mov byte[curbgnum],01h
mov ebp,00h
call drawbackgrndmain
mov ebp,2
call procspritesmain
; do background 2
mov byte[curbgpr],20h
mov byte[curbgnum],02h
mov ebp,01h
call drawbackgrndmain
; do background 1
mov byte[curbgnum],01h
mov ebp,00h
call drawbackgrndmain
mov ebp,3
call procspritesmain
cmp byte[bg3high2],1
jne .bg3highb
; do background 3
mov byte[curbgpr],20h
mov byte[curbgnum],04h
mov ebp,02h
call drawbackgrndmain
.bg3highb
pop ebp
pop edx
pop ebx
pop edi
pop esi
xor eax,eax
xor ecx,ecx
NEWSYM nodrawline
ret
NEWSYM priority2
test byte[scaddset],02h
jz near .nosubsc
; do background 2
mov byte[curbgpr],0h
mov byte[curbgnum],02h
mov ebp,01h
call drawbackgrndsub
mov ebp,0
call procspritessub
; do background 1
mov byte[curbgnum],01h
mov ebp,00h
call drawbackgrndsub
mov ebp,1
call procspritessub
; do background 2
mov byte[curbgpr],20h
mov byte[curbgnum],02h
mov ebp,01h
call drawbackgrndsub
mov ebp,2
call procspritessub
; do background 1
mov byte[curbgnum],01h
mov ebp,00h
call drawbackgrndsub
mov ebp,3
call procspritessub
.nosubsc
mov al,[winenabm]
mov [cwinenabm],al
; do background 2
mov byte[curbgpr],0h
mov byte[curbgnum],02h
mov ebp,01h
call drawbackgrndmain
mov ebp,0
call procspritesmain
; do background 1
mov byte[curbgnum],01h
mov ebp,00h
call drawbackgrndmain
mov ebp,1
call procspritesmain
; do background 2
mov byte[curbgpr],20h
mov byte[curbgnum],02h
mov ebp,01h
call drawbackgrndmain
mov ebp,2
call procspritesmain
; do background 1
mov byte[curbgnum],01h
mov ebp,00h
call drawbackgrndmain
mov ebp,3
call procspritesmain
pop ebp
pop edx
pop ebx
pop edi
pop esi
xor eax,eax
xor ecx,ecx
ret
ALIGN32
NEWSYM tempbuffer, times 33 dd 0
NEWSYM currentobjptr, dd 0
NEWSYM curmosaicsz, dd 0
NEWSYM extbgdone, db 0
NEWSYM processmode7
mov al,[winenabm]
mov [cwinenabm],al
push esi
push edi
push ebx
push edx
push ebp
; get current sprite table
xor ebx,ebx
mov bl,[curypos]
shl ebx,9
add ebx,[spritetablea]
mov [currentobjptr],ebx
; setup priorities
cmp byte[sprprifix],0
je .nosprprio
mov dword[cursprloc],sprlefttot
call preparesprpr
.nosprprio
; calculate current video offset
xor ebx,ebx
mov bx,[curypos]
mov esi,ebx
shl esi,8
shl ebx,5
add esi,ebx
add esi,16
add esi,[vidbuffer]
mov [curvidoffset],esi
; clear video buffer
mov edi,esi
mov ecx,64
xor eax,eax
rep stosd
; do sprite windowing
call makewindowsp
; clear registers
xor eax,eax
xor ecx,ecx
mov byte[extbgdone],0
test byte[interlval],40h
jz near .noback0
test byte[scrndis],02h
jnz near .noback0
; do background 1, extbg pr 0
test word[scrnon],0202h
jz near .noback0
mov byte[winon],0
test word[winenabm],0001h
jz near .nobackwin0
test word[winenabm],0100h
jnz near .nobackwin0
mov ebp,0
mov al,[winbg1en]
call makewindow
cmp byte[winon],0FFh
je near .noback0
.nobackwin0
mov byte[extbgdone],1
procmode7extbg [bg1scroly],[bg1scrolx],1
.noback0
; do objects
test byte[scrndis],10h
jnz near .nosprites1
test word[scrnon],1010h
jz near .nosprites1
cmp byte[winonsp],0FFh
je .nosprites1
xor ebx,ebx
mov bl,[curypos]
mov cl,[sprleftpr+ebx]
cmp byte[sprprifix],0
je .nosprprio2
mov cl,[sprlefttot+ebx]
.nosprprio2
cmp cl,0
je .nosprites1
mov ebp,0
call drawsprites
.nosprites1
; display mode7
test byte[interlval],40h
jnz near .noback1
test byte[scrndis],01h
jnz near .noback1
; do background 1
test word[scrnon],0101h
jz near .noback1
mov byte[winon],0
test word[winenabm],0001h
jz near .nobackwin1
test word[winenabm],0100h
jnz near .nobackwin1
mov ebp,0
mov al,[winbg1en]
call makewindow
cmp byte[winon],0FFh
je near .noback1
.nobackwin1
procmode7 [bg1scroly],[bg1scrolx],1
.noback1
; do objects
test byte[scrndis],10h
jnz near .nosprites2
test word[scrnon],1010h
jz near .nosprites2
cmp byte[winonsp],0FFh
je .nosprites2
xor ebx,ebx
mov bl,[curypos]
mov cl,[sprleftpr1+ebx]
cmp byte[sprprifix],0
je .nosprprio3
mov cl,[sprlefttot+ebx]
.nosprprio3
cmp cl,0
je .nosprites2
mov ebp,1
call drawsprites
.nosprites2
test byte[interlval],40h
jz near .noback0b
cmp byte[extbgdone],0
jne near .noback0b
test byte[scrndis],02h
jnz near .noback0b
; do background 1, extbg pr 0
test word[scrnon],0101h
jz near .noback0b
mov byte[winon],0
test word[winenabm],0001h
jz near .nobackwin0b
test word[winenabm],0100h
jnz near .nobackwin0b
mov ebp,0
mov al,[winbg1en]
call makewindow
cmp byte[winon],0FFh
je near .noback0b
.nobackwin0b
mov byte[extbgdone],1
procmode7extbg [bg1scroly],[bg1scrolx],1
.noback0b
test byte[interlval],40h
jz near .noback2
cmp byte[extbgdone],1
jne near .noback2
mov byte[winon],0
test word[winenabm],0001h
jz near .nobackwin2
test word[winenabm],0100h
jnz near .nobackwin2
mov ebp,0
mov al,[winbg1en]
call makewindow
cmp byte[winon],0FFh
je near .noback2
.nobackwin2
procmode7extbg2 [bg1scroly],[bg1scrolx],1
.noback2
; do objects
test byte[scrndis],10h
jnz near .nosprites3
test word[scrnon],1010h
jz near .nosprites3
cmp byte[winonsp],0FFh
je .nosprites3
xor ebx,ebx
mov bl,[curypos]
mov cl,[sprleftpr2+ebx]
cmp byte[sprprifix],0
je .nosprprio4
mov cl,[sprlefttot+ebx]
.nosprprio4
cmp cl,0
je .nosprites3
mov ebp,2
call drawsprites
.nosprites3
; do objects
test byte[scrndis],10h
jnz near .nosprites4
test word[scrnon],1010h
jz near .nosprites4
cmp byte[winonsp],0FFh
je .nosprites4
xor ebx,ebx
mov bl,[curypos]
mov cl,[sprleftpr3+ebx]
cmp byte[sprprifix],0
je .nosprprio5
mov cl,[sprlefttot+ebx]
.nosprprio5
cmp cl,0
je .nosprites4
mov ebp,3
call drawsprites
.nosprites4
pop ebp
pop edx
pop ebx
pop edi
pop esi
ret
;*******************************************************
; Processes & Draws 4-bit sprites
;*******************************************************
NEWSYM drawsprites
cmp byte[sprprifix],1
je near drawspritesprio
.returnfrompr
test byte[cwinenabm],10h
jz .drawnowin
cmp byte[winonsp],0
jne near drawspriteswinon
.drawnowin
mov esi,[currentobjptr]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -