📄 makevid.asm
字号:
call cachetile2b16x16
.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 drawn, db 0
NEWSYM curbgpr, db 0 ; 00h = low priority, 20h = high priority
%macro drawpixel8b8x8 3
or %1,%1
jz %2
add %1,dh
mov [esi+%3],%1
%2
%endmacro
%macro drawpixel8b8x8win 3
or %1,%1
jz %2
test byte[ebp+%3],0FFh
jnz %2
add %1,dh
mov [esi+%3],%1
%2
%endmacro
NEWSYM winptrref, dd 0
NEWSYM draw8x8
cmp byte[osm2dis],1
je .osm2dis
cmp byte[bgmode],2
je near draw8x8offset
.osm2dis
cmp byte[bgmode],5
jae near draw16x8
mov [temp],al
mov [bshifter],ah
mov eax,esi
mov [yadder],ecx
mov [tempcach],ebx
mov ebx,56
sub ebx,ecx
mov [yrevadder],ebx
.retfromoffset
; 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
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
sub esi,eax
.nomosaic
mov [temptile],edx
mov dword[bgofwptr],vcache2ba+262144
mov dword[bgsubby],262144
cmp dword[tempcach],vcache2ba+262144
jb .nobit
mov dword[bgofwptr],vcache4ba+131072
mov dword[bgsubby],131072
cmp dword[tempcach],vcache4ba+131072
jb .nobit
mov dword[bgofwptr],vcache8ba+65536
mov dword[bgsubby],65536
.nobit
; 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 draw8x8winon
.domosaic
mov ch,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 #
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
mov eax,[ebx]
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
; Start fast loop
or eax,eax
je .skiploop1
drawpixel8b8x8 al, .loopd1, 0
drawpixel8b8x8 ah, .loopd2, 1
mov eax,[ebx+2]
drawpixel8b8x8 al, .loopd3, 2
drawpixel8b8x8 ah, .loopd4, 3
.skiploop1
mov eax,[ebx+4]
or eax,eax
je .skiploop2
drawpixel8b8x8 al, .loopd5, 4
drawpixel8b8x8 ah, .loopd6, 5
mov eax,[ebx+6]
drawpixel8b8x8 al, .loopd7, 6
drawpixel8b8x8 ah, .loopd8, 7
.skiploop2
.hprior
add esi,8
inc dl
cmp dl,20h
jne .loopc2
mov edi,[temptile]
.loopc2
dec ch
jnz near .loopa
cmp byte[drawn],0
je .nodraw
mov dh,byte[curmosaicsz]
cmp dh,1
jne near domosaic
.nodraw
ret
; reversed loop
.rloop
mov cl,[bshifter]
and dh,1Ch
mov eax,[ebx]
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
; Start fast loop
or eax,eax
je .skiploop1b
drawpixel8b8x8 al, .loopd1b, 7
drawpixel8b8x8 ah, .loopd2b, 6
mov eax,[ebx+2]
drawpixel8b8x8 al, .loopd3b, 5
drawpixel8b8x8 ah, .loopd4b, 4
.skiploop1b
mov eax,[ebx+4]
or eax,eax
je .skiploop2b
drawpixel8b8x8 al, .loopd5b, 3
drawpixel8b8x8 ah, .loopd6b, 2
mov eax,[ebx+6]
drawpixel8b8x8 al, .loopd7b, 1
drawpixel8b8x8 ah, .loopd8b, 0
.skiploop2b
add esi,8
inc dl
cmp dl,20h
jne .loopc
mov edi,[temptile]
.loopc
dec ch
jnz near .loopa
cmp byte[drawn],0
je .nodraw2
mov dh,byte[curmosaicsz]
cmp dh,1
jne near domosaic
.nodraw2
ret
NEWSYM draw8x8winon
mov ch,33
mov byte[drawn],0
mov ebp,[winptrref]
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 #
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
mov eax,[ebx]
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
; Start fast loop
or eax,eax
je .skiploop1
drawpixel8b8x8win al, .loopd1, 0
drawpixel8b8x8win ah, .loopd2, 1
mov eax,[ebx+2]
drawpixel8b8x8win al, .loopd3, 2
drawpixel8b8x8win ah, .loopd4, 3
.skiploop1
mov eax,[ebx+4]
or eax,eax
je .skiploop2
drawpixel8b8x8win al, .loopd5, 4
drawpixel8b8x8win ah, .loopd6, 5
mov eax,[ebx+6]
drawpixel8b8x8win al, .loopd7, 6
drawpixel8b8x8win ah, .loopd8, 7
.skiploop2
.hprior
add esi,8
add ebp,8
inc dl
cmp dl,20h
jne .loopc2
mov edi,[temptile]
.loopc2
dec ch
jnz near .loopa
ret
; reversed loop
.rloop
mov cl,[bshifter]
and dh,1Ch
mov eax,[ebx]
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
; Start fast loop
or eax,eax
je .skiploop1b
drawpixel8b8x8win al, .loopd1b, 7
drawpixel8b8x8win ah, .loopd2b, 6
mov eax,[ebx+2]
drawpixel8b8x8win al, .loopd3b, 5
drawpixel8b8x8win ah, .loopd4b, 4
.skiploop1b
mov eax,[ebx+4]
or eax,eax
je .skiploop2b
drawpixel8b8x8win al, .loopd5b, 3
drawpixel8b8x8win ah, .loopd6b, 2
mov eax,[ebx+6]
drawpixel8b8x8win al, .loopd7b, 1
drawpixel8b8x8win ah, .loopd8b, 0
.skiploop2b
add esi,8
add ebp,8
inc dl
cmp dl,20h
jne .loopc
mov edi,[temptile]
.loopc
dec ch
jnz near .loopa
ret
NEWSYM alttile, db 0
NEWSYM hirestiledat, times 256 db 0
NEWSYM draw16x8
push eax
xor eax,eax
mov al,[curypos]
mov byte[hirestiledat+eax],1
pop eax
mov [temp],al
mov [bshifter],ah
mov eax,esi
mov [yadder],ecx
mov [tempcach],ebx
mov ebx,56
sub ebx,ecx
mov [yrevadder],ebx
; 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
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
sub esi,eax
.nomosaic
mov [temptile],edx
mov dword[bgofwptr],vcache2ba+262144
mov dword[bgsubby],262144
cmp dword[tempcach],vcache2ba+262144
jb .nobit
mov dword[bgofwptr],vcache4ba+131072
mov dword[bgsubby],131072
cmp dword[tempcach],vcache4ba+131072
jb .nobit
mov dword[bgofwptr],vcache8ba+65536
mov dword[bgsubby],65536
.nobit
; 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 draw16x8winon
.domosaic
cmp byte[res512switch],0
jne near draw16x8b
mov ch,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 #
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]
; Start loop
mov eax,[ebx]
or eax,eax
je .skiploop1
drawpixel8b8x8 al, .loopd1, 0
mov eax,[ebx+2]
drawpixel8b8x8 al, .loopd3, 1
.skiploop1
mov eax,[ebx+4]
or eax,eax
je .skiploop2
drawpixel8b8x8 al, .loopd5, 2
mov eax,[ebx+6]
drawpixel8b8x8 al, .loopd7, 3
.skiploop2
add ebx,64
; Start loop
mov eax,[ebx]
or eax,eax
je .skiploop1c
drawpixel8b8x8 al, .loopd1c, 4
mov eax,[ebx+2]
drawpixel8b8x8 al, .loopd3c, 5
.skiploop1c
mov eax,[ebx+4]
or eax,eax
je .skiploop2c
drawpixel8b8x8 al, .loopd5c, 6
mov eax,[ebx+6]
drawpixel8b8x8 al, .loopd7c, 7
.skiploop2c
.hprior
add esi,8
inc dl
cmp dl,20h
jne .loopc2
mov edi,[temptile]
.loopc2
dec ch
jnz near .loopa
cmp byte[drawn],0
je .nodraw
mov dh,byte[curmosaicsz]
cmp dh,1
jne near domosaic
.nodraw
ret
; reversed loop
.rloop
mov cl,[bshifter]
and dh,1Ch
shl dh,cl ; process palette # (bits 10-12)
add dh,[bgcoloradder]
; Start fast loop
mov eax,[ebx]
or eax,eax
je .skiploop1b
drawpixel8b8x8 ah, .loopd1b, 7
mov eax,[ebx+2]
drawpixel8b8x8 ah, .loopd3b, 6
.skiploop1b
mov eax,[ebx+4]
or eax,eax
je .skiploop2b
drawpixel8b8x8 ah, .loopd5b, 5
mov eax,[ebx+6]
drawpixel8b8x8 ah, .loopd7b, 4
.skiploop2b
add ebx,64
mov eax,[ebx]
or eax,eax
je .skiploop1d
drawpixel8b8x8 ah, .loopd1d, 3
mov eax,[ebx+2]
drawpixel8b8x8 ah, .loopd3d, 2
.skiploop1d
mov eax,[ebx+4]
or eax,eax
je .skiploop2d
drawpixel8b8x8 ah, .loopd5d, 1
mov eax,[ebx+6]
drawpixel8b8x8 ah, .loopd7d, 0
.skiploop2d
add esi,8
inc dl
cmp dl,20h
jne .loopc
mov edi,[temptile]
.loopc
dec ch
jnz near .loopa
cmp byte[drawn],0
je .nodraw2
mov dh,byte[curmosaicsz]
cmp dh,1
jne near domosaic
cmp byte[winon],0
jne near dowindow
.nodraw2
ret
NEWSYM draw16x8b
mov ch,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 #
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]
; Start loop
mov eax,[ebx]
or eax,eax
je .skiploop1
drawpixel8b8x8 ah, .loopd1, 0
mov eax,[ebx+2]
drawpixel8b8x8 ah, .loopd3, 1
.skiploop1
mov eax,[ebx+4]
or eax,eax
je .skiploop2
drawpixel8b8x8 ah, .loopd5, 2
mov eax,[ebx+6]
drawpixel8b8x8 ah, .loopd7, 3
.skiploop2
add ebx,64
; Start loop
mov eax,[ebx]
or eax,eax
je .skiploop1c
drawpixel8b8x8 ah, .loopd1c, 4
mov eax,[ebx+2]
drawpixel8b8x8 ah, .loopd3c, 5
.skiploop1c
mov eax,[ebx+4]
or eax,eax
je .skiploop2c
drawpixel8b8x8 ah, .loopd5c, 6
mov eax,[ebx+6]
drawpixel8b8x8 ah, .loopd7c, 7
.skiploop2c
.hprior
add esi,8
inc dl
cmp dl,20h
jne .loopc2
mov edi,[temptile]
.loopc2
dec ch
jnz near .loopa
cmp byte[drawn],0
je .nodraw
mov dh,byte[curmosaicsz]
cmp dh,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -