📄 makevid.asm
字号:
mov edi,[curvidoffset]
mov edx,esi
xor ebx,ebx
.loopobj
test byte[esi+7],20h
jnz near .drawspriteflipx
mov bx,[esi]
mov ch,[esi+6]
mov esi,[esi+2]
mov eax,[esi]
test al,0Fh
jz .skipa
add al,ch
mov [edi+ebx-8],al
.skipa
test ah,0Fh
jz .skipb
add ah,ch
mov [edi+ebx-7],ah
.skipb
shr eax,16
test al,0Fh
jz .skipc
add al,ch
mov [edi+ebx-6],al
.skipc
test ah,0Fh
jz .skipd
add ah,ch
mov [edi+ebx-5],ah
.skipd
mov eax,[esi+4]
test al,0Fh
jz .skipe
add al,ch
mov [edi+ebx-4],al
.skipe
test ah,0Fh
jz .skipf
add ah,ch
mov [edi+ebx-3],ah
.skipf
shr eax,16
test al,0Fh
jz .skipg
add al,ch
mov [edi+ebx-2],al
.skipg
test ah,0Fh
jz .skiph
add ah,ch
mov [edi+ebx-1],ah
.skiph
add edx,8
mov esi,edx
dec cl
jnz .loopobj
mov [currentobjptr],esi
ret
.drawspriteflipx
mov bx,[esi]
mov ch,[esi+6]
mov esi,[esi+2]
mov eax,[esi]
test al,0Fh
jz .skipa2
add al,ch
mov [edi+ebx-1],al
.skipa2
test ah,0Fh
jz .skipb2
add ah,ch
mov [edi+ebx-2],ah
.skipb2
shr eax,16
test al,0Fh
jz .skipc2
add al,ch
mov [edi+ebx-3],al
.skipc2
test ah,0Fh
jz .skipd2
add ah,ch
mov [edi+ebx-4],ah
.skipd2
mov eax,[esi+4]
test al,0Fh
jz .skipe2
add al,ch
mov [edi+ebx-5],al
.skipe2
test ah,0Fh
jz .skipf2
add ah,ch
mov [edi+ebx-6],ah
.skipf2
shr eax,16
test al,0Fh
jz .skipg2
add al,ch
mov [edi+ebx-7],al
.skipg2
test ah,0Fh
jz .skiph2
add ah,ch
mov [edi+ebx-8],ah
.skiph2
add edx,8
mov esi,edx
dec cl
jnz near .loopobj
mov [currentobjptr],esi
ret
NEWSYM drawspriteswinon
mov esi,[currentobjptr]
mov edi,[curvidoffset]
mov edx,esi
xor ebx,ebx
.loopobj
test byte[esi+7],20h
jnz near .drawspriteflipx
mov bx,[esi]
mov ch,[esi+6]
mov esi,[esi+2]
mov eax,[esi]
test al,0Fh
jz .skipa
cmp byte[winspdata+ebx-8+16],0
jne .skipa
add al,ch
mov [edi+ebx-8],al
.skipa
test ah,0Fh
jz .skipb
cmp byte[winspdata+ebx-7+16],0
jne .skipb
add ah,ch
mov [edi+ebx-7],ah
.skipb
shr eax,16
test al,0Fh
jz .skipc
cmp byte[winspdata+ebx-6+16],0
jne .skipc
add al,ch
mov [edi+ebx-6],al
.skipc
test ah,0Fh
jz .skipd
cmp byte[winspdata+ebx-5+16],0
jne .skipd
add ah,ch
mov [edi+ebx-5],ah
.skipd
mov eax,[esi+4]
test al,0Fh
jz .skipe
cmp byte[winspdata+ebx-4+16],0
jne .skipe
add al,ch
mov [edi+ebx-4],al
.skipe
test ah,0Fh
jz .skipf
cmp byte[winspdata+ebx-3+16],0
jne .skipf
add ah,ch
mov [edi+ebx-3],ah
.skipf
shr eax,16
test al,0Fh
jz .skipg
cmp byte[winspdata+ebx-2+16],0
jne .skipg
add al,ch
mov [edi+ebx-2],al
.skipg
test ah,0Fh
jz .skiph
cmp byte[winspdata+ebx-1+16],0
jne .skiph
add ah,ch
mov [edi+ebx-1],ah
.skiph
add edx,8
mov esi,edx
dec cl
jnz near .loopobj
mov [currentobjptr],esi
ret
.drawspriteflipx
mov bx,[esi]
mov ch,[esi+6]
mov esi,[esi+2]
mov eax,[esi]
test al,0Fh
jz .skipa2
cmp byte[winspdata+ebx-1+16],0
jne .skipa2
add al,ch
mov [edi+ebx-1],al
.skipa2
test ah,0Fh
jz .skipb2
cmp byte[winspdata+ebx-2+16],0
jne .skipb2
add ah,ch
mov [edi+ebx-2],ah
.skipb2
shr eax,16
test al,0Fh
jz .skipc2
cmp byte[winspdata+ebx-3+16],0
jne .skipc2
add al,ch
mov [edi+ebx-3],al
.skipc2
test ah,0Fh
jz .skipd2
cmp byte[winspdata+ebx-4+16],0
jne .skipd2
add ah,ch
mov [edi+ebx-4],ah
.skipd2
mov eax,[esi+4]
test al,0Fh
jz .skipe2
cmp byte[winspdata+ebx-5+16],0
jne .skipe2
add al,ch
mov [edi+ebx-5],al
.skipe2
test ah,0Fh
jz .skipf2
cmp byte[winspdata+ebx-6+16],0
jne .skipf2
add ah,ch
mov [edi+ebx-6],ah
.skipf2
shr eax,16
test al,0Fh
jz .skipg2
cmp byte[winspdata+ebx-7+16],0
jne .skipg2
add al,ch
mov [edi+ebx-7],al
.skipg2
test ah,0Fh
jz .skiph2
cmp byte[winspdata+ebx-8+16],0
jne .skiph2
add ah,ch
mov [edi+ebx-8],ah
.skiph2
add edx,8
mov esi,edx
dec cl
jnz near .loopobj
mov [currentobjptr],esi
ret
NEWSYM drawspritesprio
cmp byte[sprclprio+ebp],0
je near .endobj
test byte[cwinenabm],10h
jz .drawnowin
cmp byte[winonsp],0
jne near drawspritespriowinon
.drawnowin
cmp dword[sprsingle],1
je near .drawsingle
mov esi,[currentobjptr]
mov edi,[curvidoffset]
mov edx,esi
xor ebx,ebx
.loopobj
test byte[esi+7],20h
jnz near .drawspriteflipx
mov bx,[esi]
push edx
mov ch,[esi+6]
mov dl,[esi+7]
and edx,03h
cmp edx,ebp
jne near .notprio
mov esi,[esi+2]
mov dl,[csprbit]
sprdrawa sprdrawpra
pop edx
.nodrawspr
add edx,8
mov esi,edx
dec cl
jnz near .loopobj
rol byte[csprbit],1
cmp byte[csprbit],1
je near .clearcsprmem
ret
.notprio
mov esi,[esi+2]
mov dl,[csprbit]
sprdrawa sprdrawpra2
pop edx
add edx,8
mov esi,edx
dec cl
jnz near .loopobj
rol byte[csprbit],1
cmp byte[csprbit],1
je near .clearcsprmem
ret
.drawspriteflipx
mov bx,[esi]
push edx
mov ch,[esi+6]
mov dl,[esi+7]
and edx,03h
cmp edx,ebp
jne near .notpriof
mov esi,[esi+2]
mov dl,[csprbit]
sprdrawaf sprdrawpra
pop edx
add edx,8
mov esi,edx
dec cl
jnz near .loopobj
rol byte[csprbit],1
cmp byte[csprbit],1
je near .clearcsprmem
.endobj
ret
.notpriof
mov esi,[esi+2]
mov dl,[csprbit]
sprdrawaf sprdrawpra2
pop edx
add edx,8
mov esi,edx
dec cl
jnz near .loopobj
rol byte[csprbit],1
cmp byte[csprbit],1
je near .clearcsprmem
ret
.clearcsprmem
xor eax,eax
mov ecx,64
mov edi,sprpriodata+16
rep stosd
ret
.drawsingle
mov esi,[currentobjptr]
mov edi,[curvidoffset]
mov edx,ecx
and edx,0FFh
shl edx,3
sub edx,8
add edx,esi
mov esi,edx
xor ebx,ebx
.loopobj2
test byte[esi+7],20h
jnz near .drawspriteflipx2
mov bx,[esi]
mov ch,[esi+6]
mov esi,[esi+2]
sprdrawa sprdrawprb
sub edx,8
mov esi,edx
dec cl
jnz near .loopobj2
ret
.drawspriteflipx2
mov bx,[esi]
mov ch,[esi+6]
mov esi,[esi+2]
sprdrawaf sprdrawprb
sub edx,8
mov esi,edx
dec cl
jnz near .loopobj2
ret
NEWSYM drawspritespriowinon
cmp dword[sprsingle],1
je near .drawsingle
mov esi,[currentobjptr]
mov edi,[curvidoffset]
mov edx,esi
xor ebx,ebx
.loopobj
test byte[esi+7],20h
jnz near .drawspriteflipx
mov bx,[esi]
push edx
mov ch,[esi+6]
mov dl,[esi+7]
and edx,03h
cmp edx,ebp
jne near .notprio
mov esi,[esi+2]
mov dl,[csprbit]
sprdrawa sprdrawpraw
pop edx
.nodrawspr
add edx,8
mov esi,edx
dec cl
jnz near .loopobj
rol byte[csprbit],1
cmp byte[csprbit],1
je near .clearcsprmem
ret
.notprio
mov esi,[esi+2]
mov dl,[csprbit]
sprdrawa sprdrawpra2
pop edx
add edx,8
mov esi,edx
dec cl
jnz near .loopobj
rol byte[csprbit],1
cmp byte[csprbit],1
je near .clearcsprmem
ret
.drawspriteflipx
mov bx,[esi]
push edx
mov ch,[esi+6]
mov dl,[esi+7]
and edx,03h
cmp edx,ebp
jne near .notpriof
mov esi,[esi+2]
mov dl,[csprbit]
sprdrawaf sprdrawpraw
pop edx
add edx,8
mov esi,edx
dec cl
jnz near .loopobj
rol byte[csprbit],1
cmp byte[csprbit],1
je near .clearcsprmem
.endobj
ret
.notpriof
mov esi,[esi+2]
mov dl,[csprbit]
sprdrawaf sprdrawpra2
pop edx
add edx,8
mov esi,edx
dec cl
jnz near .loopobj
rol byte[csprbit],1
cmp byte[csprbit],1
je near .clearcsprmem
ret
.clearcsprmem
xor eax,eax
mov ecx,64
mov edi,sprpriodata+16
rep stosd
ret
.drawsingle
mov esi,[currentobjptr]
mov edi,[curvidoffset]
mov edx,ecx
and edx,0FFh
shl edx,3
sub edx,8
add edx,esi
mov esi,edx
xor ebx,ebx
.loopobj2
test byte[esi+7],20h
jnz near .drawspriteflipx2
mov bx,[esi]
mov ch,[esi+6]
mov esi,[esi+2]
sprdrawa sprdrawprbw
sub edx,8
mov esi,edx
dec cl
jnz near .loopobj2
ret
.drawspriteflipx2
mov bx,[esi]
mov ch,[esi+6]
mov esi,[esi+2]
sprdrawaf sprdrawprbw
sub edx,8
mov esi,edx
dec cl
jnz near .loopobj2
ret
NEWSYM prfixobjl, db 0
NEWSYM csprbit, db 1
NEWSYM csprprlft, db 0
;*******************************************************
; Processes & Draws 8x8 tiles in 2, 4, & 8 bit mode
;*******************************************************
NEWSYM proc8x8
cmp byte[bgmode],5
je near proc16x8
; ax = # of rows down
mov ebx,eax
shr eax,3
and eax,63
and ebx,07h
cmp byte[CacheCheckSkip],1
je .docache
cmp byte[edi+eax],0
jne .nocachereq
.docache
; cmp byte[ccud],0
; jne .nocachereq
mov byte[edi+eax],1
cmp byte[curcolor],2
jne .no4b
; cache 4-bit
call cachetile4b
jmp .nocachereq
.no4b
cmp byte[curcolor],1
je .2b
; cache 8-bit
call cachetile8b
jmp .nocachereq
.2b
; cache 2-bit
call cachetile2b
.nocachereq
test edx,0100h
jz .tilexa
test al,20h
jz .tileya
; bgptrd/bgptrc
mov ecx,[bgptrd]
mov [bgptrx1],ecx
mov ecx,[bgptrc]
mov [bgptrx2],ecx
jmp .skiptile
.tileya
; bgptrb/bgptra
mov ecx,[bgptrb]
mov [bgptrx1],ecx
mov ecx,[bgptr]
mov [bgptrx2],ecx
jmp .skiptile
.tilexa
test al,20h
jz .tileya2
; bgptrc/bgptrd
mov ecx,[bgptrc]
mov [bgptrx1],ecx
mov ecx,[bgptrd]
mov [bgptrx2],ecx
jmp .skiptile
.tileya2
; bgptra/bgptrb
mov ecx,[bgptr]
mov [bgptrx1],ecx
mov ecx,[bgptrb]
mov [bgptrx2],ecx
.skiptile
; set up edi & yadder to point to tile data
shl ebx,3
mov [yadder],ebx
and al,1Fh
mov edi,[vram]
mov ebx,eax
shl ebx,6
mov eax,[bgptrx1]
add edi,ebx
mov [temptile],edi
add edi,eax
; dx = # of columns right
; cx = bgxlim
mov eax,edx
shr edx,3
mov bl,[curypos]
and edx,1Fh
mov [temp],dl
and eax,07h
add dl,dl
add edi,edx
mov esi,eax
mov ebx,[tempcach]
mov edx,[temptile]
mov eax,[bgptrx2]
and eax,0FFFFh
add edx,eax
mov al,[temp]
mov ecx,[yadder]
mov ah,[bshifter]
; fill up tempbuffer with pointer #s that point to cached video mem
; to calculate pointer, get first byte
; esi = pointer to video buffer
; edi = pointer to tile data
; ebx = cached memory
; ecx = y adder
; edx = secondary tile pointer
; al = current x position
ret
NEWSYM proc16x8
; ax = # of rows down
mov ebx,eax
shr eax,3
and ebx,07h
and eax,63
cmp byte[edi+eax],0
jne .nocachereq
; cmp byte[ccud],0
; jne .nocachereq
mov byte[edi+eax],1
cmp byte[curcolor],2
jne .no4b
; cache 4-bit
call cachetile4b16x16
jmp .nocachereq
.no4b
cmp byte[curcolor],1
je .2b
; cache 8-bit
call cachetile8b16x16
jmp .nocachereq
.2b
; cache 2-bit
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -