📄 copyvid.inc
字号:
.startcopy ; video memory selector push es mov ax,[selcA000] mov es,ax mov esi,[vidbuffer] ; center on output screen mov edi,256 cmp word[resolutn],224 jne .res239 mov edi,8*256+256.res239 ; address of first source line to copy add esi,(16+256+16)+16 mov bl,[resolutn] sub bl,2 jmp copymodeqloop;********************************************************; CopyModeQ 256 Copies buffer into chained 256x256;********************************************************NEWSYM copymodeq256 cmp byte[curblank],40h jne .startcopy ret.startcopy ; video memory selector push es mov ax,[selcA000] mov es,ax mov esi,[vidbuffer] ; center on output screen mov edi,8*256+256 cmp word[resolutn],224 jne .res239 mov edi,16*256+256.res239 ; address of first source line to copy add esi,(16+256+16)+16 mov bl,[resolutn] sub bl,2;edi = offset in output of first line;esi = address of first line to be copied;bl = number of lines to copy*dlcopymodeqloop: cmp byte[MMXSupport],1 je near .loopb.loopa mov ecx,256/4 rep movsd add esi,16+16 dec bl jnz .loopa jmp .done.loopb mov ecx,256/16 MMXStuff add esi,16+16 dec bl jnz .loopb emms.done pop es ret;*******************************************************; Copy VESA2 320x240x8b Copies buffer to 320x240x8bVBE2;*******************************************************; Input: AX = 4F07h VBE Set/Get Display Start Control; BH = 00h Reserved and must be 00h; BL = 00h Set Display Start; = 01h Get Display Start; = 80h Set Display Start during Vertical; Retrace; CX = First Displayed Pixel In Scan Line; (Set Display Start only); DX = First Displayed Scan Line (Set Display Start; only)NEWSYM copyvesa2320x240x8b cmp byte[curblank],40h jne .startcopy ret.startcopy push es mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] mov edi,320+32 cmp word[resolutn],224 jne .res239 add edi,8*320.res239 add edi,[VidStartDraw] add esi,16+256+16+16 xor eax,eax mov dl,[resolutn] dec dl dec dl cmp byte[ScreenScale],1 je .fullscreen cmp byte[MMXSupport],1 je near .loopb.loopa mov ecx,256/4 rep movsd add esi,16+16 add edi,32+32 dec dl jnz .loopa jmp .done.loopb mov ecx,256/16 MMXStuff add esi,16+16 add edi,32+32 dec dl jnz .loopb emms jmp .done.fullscreen sub edi,32.fsloopa mov ecx,256/4 jmp .fsloopb.fsloopb mov eax,[esi] mov [es:edi],al mov [es:edi+1],eax add esi,byte 4 add edi,byte 5 dec ecx jnz .fsloopb add esi,16+16 dec dl jnz .fsloopa.done pop es ret;*******************************************************; Copy VESA2 320x480x8b Copies buffer to 320x480x8bVBE2;*******************************************************;NEWSYM copyvesa2320x480x8bgui; jmp copyvesa2320x480x8b; mov byte[CurrentGUIOn],1; jmp copyvesa2320x480x8b.noguiNEWSYM copyvesa2320x480x8b; mov byte[CurrentGUIOn],0; .nogui cmp byte[curblank],40h jne .startcopy ret.startcopy push es mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] mov edi,320*2+32 cmp word[resolutn],224 jne .res239 add edi,8*320.res239 add edi,[VidStartDraw] add esi,16+256+16+16 xor eax,eax mov dl,[resolutn] dec dl dec dl cmp byte[ScreenScale],1 je near .fullscreen cmp byte[scanlines],1 je near .scanlines; cmp byte[GUIOn],1; je .loopa; cmp byte[f3menuen],1; je .loopa; cmp byte[ForceNewGfxOff],1; je .loopa; cmp byte[newengen],1; je near copyvesa2320x480x8ng cmp byte[MMXSupport],1 je .loopb.loopa mov ecx,256/4 rep movsd sub esi,256 add edi,32+32 mov ecx,256/4 rep movsd add esi,16+16 add edi,32+32 dec dl jnz .loopa jmp .done.loopb mov ecx,256/16 MMXStuff sub esi,256 add edi,32+32 mov ecx,256/16 MMXStuff add esi,16+16 add edi,32+32 dec dl jnz .loopb emms jmp .done.scanlines cmp byte[MMXSupport],1 je .sloopb.sloopa mov ecx,256/4 rep movsd add esi,16+16 add edi,32+320+32 dec dl jnz .sloopa jmp .done.sloopb mov ecx,256/16 MMXStuff add esi,16+16 add edi,32+320+32 dec dl jnz .sloopb emms jmp .done.fullscreen sub edi,32 cmp byte[scanlines],1 je .fsloopb.fsloopa mov ecx,256/4 call .fsloopc sub esi,256 mov ecx,256/4 call .fsloopc add esi,16+16 dec dl jnz .fsloopa jmp .done.fsloopb mov ecx,256/4 call .fsloopc add esi,16+16 add edi,320 dec dl jnz .fsloopb jmp .done.fsloopc mov eax,[esi] mov [es:edi],al mov [es:edi+1],eax add esi,byte 4 add edi,byte 5 dec ecx jnz .fsloopc ret.done pop es ret;copyvesa2320x480x8ng:; jmp .mode7hires; mov ebx,1;.loopa; cmp dword[ignor512],0; je .ignore; test byte[intrlng+ebx],01h; jnz near .interlaced;.ignore; cmp byte[Mode7HiRes],0; je .nomode7hires; test byte[mosenng+ebx],1; jz .yesmode7hires; cmp byte[mosszng+ebx],0; jne .nomode7hires;.yesmode7hires; test byte[intrlng+ebx],40h; jnz .nomode7hires; cmp byte[BGMA+ebx],7; jne .nomode7hires; cmp byte[BGMA+ebx+1],7; je near .mode7hires;.nomode7hires; mov ecx,64;.a; mov eax,[esi]; mov [es:edi],eax; add esi,4; add edi,4; dec ecx; jnz .a; mov ecx,64; add edi,64; sub esi,256;.a2r; mov eax,[esi]; mov [es:edi],eax; add esi,4; add edi,4; dec ecx; jnz .a2r;.returnloop; add esi,32; add edi,64; inc ebx; dec dl; jnz near .loopa; pop es; ret;;.mode7hires; mov ecx,64;.a7; mov eax,[esi]; mov [es:edi],eax; add esi,4; add edi,4; dec ecx; jnz .a7; mov ecx,64; add edi,64; add esi,75036-256;.a2r7; mov eax,[esi]; mov [es:edi],eax; add esi,4; add edi,4; dec ecx; jnz .a2r7; sub esi,75036; jmp .returnloop;;.interlaced; test byte[cfield],1; jz .b; add edi,320;.b; mov ecx,64;.ai; mov eax,[esi]; mov [es:edi],eax; add esi,4; add edi,4; dec ecx; jnz .ai; test byte[cfield],1; jnz .bi; add edi,320;.bi; jmp .returnloop;*******************************************************; Copy VESA2 800x600x8b Copies buffer to 800x600x8bVBE2;*******************************************************NEWSYM copyvesa2800x600x8b cmp byte[curblank],40h jne .startcopy ret.startcopy push es mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] mov edi,60*800+144 cmp word[resolutn],224 jne .res239 add edi,8*800.res239 add edi,[VidStartDraw] add esi,16+256+16+16 xor eax,eax mov dl,[resolutn] dec dl dec dl cmp byte[smallscreenon],1 je near .smallscreen cmp byte[scanlines],1 je .loopa2.loopa mov ecx,256/2 call .loopa3 sub esi,256 add edi,144+144 mov ecx,256/2 call .loopa3 add esi,16+16 add edi,144+144 dec dl jnz .loopa jmp .done.loopa2 mov ecx,256/2 call .loopa3 add esi,16+16 add edi,144+800+144 dec dl jnz .loopa2 jmp .done.loopa3 mov al,[esi] mov bl,[esi+1] mov ah,al mov bh,bl mov [es:edi],ax mov [es:edi+2],bx add esi,byte 2 add edi,byte 4 dec ecx jnz .loopa3 ret.smallscreen add edi,120*800+128 cmp byte[MMXSupport],1 je .ssloopb.ssloopa mov ecx,256/4 rep movsd add esi,16+16 add edi,272+272 dec dl jnz .ssloopa jmp .done.ssloopb mov ecx,256/16 MMXStuff add esi,16+16 add edi,272+272 dec dl jnz .ssloopb jmp .done.done pop es ret;*********************************************************; Copy VESA2 800x600x16b Copies buffer to 800x600x16bVBE2;*********************************************************NEWSYM copyvesa2800x600x16b cmp byte[curblank],40h jne .startcopy ret.startcopy push es mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] mov edi,60*800*2+144*2 cmp word[resolutn],224 jne .res239 add edi,8*800*2.res239 add edi,[VidStartDraw] add esi,16*2+256*2+16*2+16*2 xor eax,eax mov dl,[resolutn] dec dl dec dl cmp byte[smallscreenon],1 je near .smallscreen FilterTest .interpolate cmp byte[scanlines],1 je .loopa2.loopa mov ecx,256/2 call .loopa3 sub esi,256*2 add edi,144*2+144*2 mov ecx,256/2 call .loopa3 add esi,16*2+16*2 add edi,144*2+144*2 dec dl jnz .loopa jmp .done.loopa2 mov ecx,256/2 call .loopa3 add esi,16*2+16*2 add edi,144*2+800*2+144*2 dec dl jnz .loopa2 jmp .done.loopa3 mov ax,[esi] mov bx,[esi+2] mov [es:edi],ax mov [es:edi+2],ax mov [es:edi+4],bx mov [es:edi+6],bx add esi,byte 4 add edi,byte 8 dec ecx jnz .loopa3 ret.smallscreen add edi,120*800*2+128*2 cmp byte[MMXSupport],1 je .ssloopb.ssloopa mov ecx,256/4*2 rep movsd add esi,16*2+16*2 add edi,272*2+272*2 dec dl jnz .ssloopa jmp .done.ssloopb mov ecx,256/16*2 MMXStuff add esi,16*2+16*2 add edi,272*2+272*2 dec dl jnz .ssloopb jmp .done.interpolate mov ecx,256 SSInterpFull 800 add esi,16*2+16*2 add edi,144*2+800*2+144*2 dec dl jnz near .interpolate.done pop es ret;*******************************************************; Copy VESA2 640x400x8b Copies buffer to 640x400x8bVBE2;*******************************************************NEWSYM copyvesa2640x400x8b cmp byte[curblank],40h jne .startcopy ret.startcopy push es mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] mov edi,640+20*640+64 cmp word[resolutn],224 jne .res239 add edi,12*640.res239 add edi,[VidStartDraw] add esi,16+256+16+16 xor eax,eax mov dl,[resolutn] dec dl dec dl cmp byte[ScreenScale],1 je near .fullscreen cmp byte[smallscreenon],1 je near .smallscreen.loopa mov ecx,256 call .loopa2 sub esi,256 add edi,64+64 mov ecx,256 call .loopa2 add esi,16+16 add edi,64+64 dec dl jz near .done mov ecx,256 call .loopa2 add esi,16+16 add edi,64+64 dec dl jnz .loopa jmp .done.loopa2 mov al,[esi+1] xor ebx,ebx mov ah,al mov bl,[esi] shl eax,16 mov bh,bl add esi,byte 2 add eax,ebx mov [es:edi],eax sub ecx,byte 2 lea edi,[edi+4] jnz .loopa2 ret.smallscreen add edi,60*640+128 cmp byte[MMXSupport],1 je .ssloopb.ssloopa mov ecx,256/4 rep movsd add esi,16+16 add edi,192+192 dec dl jnz .ssloopa jmp .done.ssloopb mov ecx,256/16 MMXStuff add esi,16+16 add edi,192+192 dec dl jnz .ssloopb emms jmp .done.fullscreen sub edi,64.fsloopa mov ecx,256/4 call .fsloopb add esi,16+16 mov ecx,256/4 call .fsloopb sub esi,256 mov ecx,256/4 dec dl jz near .done call .fsloopb add esi,16+16 dec dl jnz .fsloopa jmp .done.fsloopb mov ebx,1 call .fsloopc sub esi,byte 1 mov ebx,4 call .fsloopc dec ecx jnz .fsloopb ret.fsloopc mov al,[esi] mov [es:edi],al inc esi mov [es:edi+1],al add edi,byte 2 dec ebx jnz .fsloopc ret.done pop es retNEWSYM copyvesa2640x400x16b cmp byte[curblank],40h jne .startcopy ret.startcopy push es mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] mov edi,640*2+20*640*2+64*2 cmp word[resolutn],224 jne .res239 add edi,12*640*2.res239 add edi,[VidStartDraw] add esi,16*2+256*2+16*2+16*2 xor eax,eax mov dl,[resolutn] dec dl dec dl cmp byte[ScreenScale],1 je near .fullscreen cmp byte[smallscreenon],1 je near .smallscreen.loopa mov ecx,256 call .loopa2 add esi,16*2+16*2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -