; Copyright (c) 1997-2005 Andrzej Okrutny, http://www.ceti.pl/~anok/ ; All rights reserved. ; ; ; THIS SOFTWARE IS FREE FOR NON-COMMERCIAL USE. ; ; ; Redistribution and use in source and binary forms, with or without ; modification, are permitted provided that the following conditions are met: ; ; * Redistributions of source code must retain the above copyright ; notice, this list of conditions and the following disclaimer. ; * Redistributions in binary form must reproduce the above copyright ; notice, this list of conditions and the following disclaimer in ; the documentation and/or other materials provided with the ; distribution. ; ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ; ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE ; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS ; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN ; CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ; POSSIBILITY OF SUCH DAMAGE. ; ; ;***************************************************************************** ; ; SVGA - High Color, Linear Frame Buffer ; 16 bits per pixel ; ;***************************************************************************** ; ; CopyVirtual2VideoHC_ ; ; ; CopyAreaBuf2ScrHC ; CopyAreaScr2BufHC ; ; CopyBuf2ScrHC ; CopyScr2BufHC ; ; CopyBuf2ScrCLP_HC ; ; CopyBuf2ScrBankHC ; IDEAL INCLUDE 'graph.inc' DATASEG EXTRN _SetBankPTR: DWORD EXTRN SVGABank : BYTE ;; EXTRN CLPArea : ITClipArea ;; EXTRN _ITOverlap : PROC ;; ------ variable for DEBUGING ---------- PUBLIC _GLB_DEBUG_CopyVirtual2Video _GLB_DEBUG_CopyVirtual2Video DD 0 ;;---------------------------------------- CODESEG IF 1 ;; wersja do testow z filtrem CYJAN ;----------------------------------------------------------------------------; ; SVGA - HC Copy Area VirtualScreen to VideoScreen ; ;----------------------------------------------------------------------------; ; parm: ; eax - X ; ecx - Y ; ebx - WIDTH ; edx - HEIGHT ; esi - virtual scrPtr ; edi - video scrParam ; ; modify: eax, ebx, ecx, edx, esi, edi, [ ebp - save on stack ] ; ; return: NONE ; PUBLIC CopyVirtual2VideoHCTest_ PROC CopyVirtual2VideoHCTest_ push ebp push eax mov eax, [ (ITScreenParam edi).width ] imul ecx, eax shl ecx, 1 add esi, ecx mov edi, [ (ITScreenParam edi).ptr ] add edi, ecx mov ecx, eax ; zapamietanie w ecx szerokosci ekranu pop eax shl eax, 1 add esi, eax add edi, eax ;;; mov eax, ecx ;;; sub eax, ebx ;;; shl eax, 1 ; * 2 bo 2 bajty na pixel mov ebp, ecx sub ebp, ebx add ebp, ebp ; * 2 bo 2 bajty na pixel @@L00: mov ecx, ebx test edi, 3 ; czy podzielne przez 4 jz @@Lok ;;; movsw ; wyrownanie z lewej do 4 mov ax, [ esi ] and ax, 003ffh mov [ edi ], ax add esi, 2 add edi, 2 dec ecx @@Lok: push ecx shr ecx, 1 ;;; rep movsd jz @@LnoAction @@Lloop: mov eax, [ esi ] and eax, 003ff03ffh mov [ edi ], eax add esi, 4 add edi, 4 dec ecx jnz @@Lloop ;;; jnc @@Lsk @@LnoAction: pop ecx test cl, 1 jz @@Lsk ;;; movsw mov ax, [ esi ] and ax, 003ffh mov [ edi ], ax add esi, 2 add edi, 2 @@Lsk: ;; add esi, eax ;; add edi, eax add esi, ebp add edi, ebp dec edx jnz @@L00 pop ebp ret ENDP CopyVirtual2VideoHCTest_ ENDIF ;----------------------------------------------------------------------------; ; SVGA - HC Copy Area VirtualScreen to VideoScreen ; ;----------------------------------------------------------------------------; ; parm: ; eax - X ; ecx - Y ; ebx - WIDTH ; edx - HEIGHT ; esi - virtual scrPtr ; edi - video scrParam ; ; modify: eax, ebx, ecx, edx, esi, edi, [ ebp - save on stack ] ; ; return: NONE ; PUBLIC CopyVirtual2VideoHC_ PROC CopyVirtual2VideoHC_ push ebp push eax mov eax, [ (ITScreenParam edi).width ] imul ecx, eax shl ecx, 1 add esi, ecx mov edi, [ (ITScreenParam edi).ptr ] add edi, ecx mov ecx, eax ; zapamietanie w ecx szerokosci ekranu pop eax add eax, eax ; * 2 add esi, eax add edi, eax ;;; mov eax, ecx ;;; sub eax, ebx ;;; shl eax, 1 ; * 2 bo 2 bajty na pixel mov ebp, ecx sub ebp, ebx add ebp, ebp ; * 2 bo 2 bajty na pixel @@L00: mov ecx, ebx test edi, 3 ; czy podzielne przez 4 jz @@Lok movsw ; wyrownanie z lewej do 4 dec ecx @@Lok: shr ecx, 1 rep movsd jnc @@Lsk movsw @@Lsk: add esi, ebp add edi, ebp dec edx jnz @@L00 pop ebp ret ENDP CopyVirtual2VideoHC_ ;----------------------------------------------------------------------------; ; SVGA - HC Copy Screen Area to Buffer for 640 x 480 mode ; ;----------------------------------------------------------------------------; ; parm: ; eax - X ; ecx - Y ; ebx - WIDTH ; edx - HEIGHT ; esi - video ptr ( addr ) ; edi - buffer ptr ; ; modify: eax, ebx, ecx, edx, esi, edi, [ ebp - save on stack ] ; ; return: NONE ; PUBLIC CopyAreaScr2BufHC_ PROC CopyAreaScr2BufHC_ ; adr = (y*640 +x) * 2 = y*256 +y*1024 +x*2 push ebp shl ecx, 8 add esi, ecx add edi, ecx shl ecx, 2 add esi, ecx add edi, ecx shl eax, 1 ; x = x* 2 add esi, eax ; add X - coord to source add edi, eax ; add X - coord to dest mov ebp, 640 sub ebp, ebx shl ebp, 1 ; ebp = ebp * 2 @@L00: mov ecx, ebx test esi, 3 ; czy podzielne przez 4 jz @@Lok movsw ; wyrownanie z lewej do 4 dec ecx @@Lok: shr ecx, 1 rep movsd jnc @@Lsk movsw @@Lsk: add esi, ebp add edi, ebp dec edx jnz @@L00 pop ebp ret ENDP CopyAreaScr2BufHC_ ;----------------------------------------------------------------------------; ; SVGA - HC Copy Buffer Area to Screen ; ;----------------------------------------------------------------------------; ; parm: ; eax - X ; ecx - Y ; ebx - WIDTH ; edx - HEIGHT ; esi - source ptr ; edi - * ITScreenParam ; ; modify: eax, ebx, ecx, edx, esi, edi, [ ebp - save on stack ] ; ; return: NONE ; PUBLIC _CopyBuf2ScrHC PROC _CopyBuf2ScrHC push ebp mov ebp, [ ( ITScreenParam edi ).width ] imul ecx, ebp add ecx, eax ; add x coord shl ecx, 1 ; * 2 bo 2 bajty na pixel mov edi, [ ( ITScreenParam edi ).ptr ] add edi, ecx sub ebp, ebx shl ebp, 1 @@L00: mov ecx, ebx test edi, 3 ; czy podzielne przez 4 jz @@Lok movsw ; wyrownanie z lewej do 4 dec ecx @@Lok: shr ecx, 1 rep movsd jnc @@Lsk movsw @@Lsk: add edi, ebp dec edx jnz @@L00 pop ebp ret ENDP _CopyBuf2ScrHC ;----------------------------------------------------------------------------; ; SVGA - HC Copy Screen Area to Buffer ; ;----------------------------------------------------------------------------; ; parm: ; eax - X ; ecx - Y ; ebx - WIDTH ; edx - HEIGHT ; edi - buf ptr ; esi - * ITScreenParam ; ; modify: eax, ebx, ecx, edx, esi, edi, [ ebp - save on stack ] ; ; return: NONE ; PUBLIC _CopyScr2BufHC PROC _CopyScr2BufHC push ebp mov ebp, [ ( ITScreenParam esi ).width ] imul ecx, ebp add ecx, eax ; add x coord shl ecx, 1 ; * 2 bo 2 bajty na pixel mov esi, [ ( ITScreenParam esi ).ptr ] add esi, ecx sub ebp, ebx shl ebp, 1 @@L00: mov ecx, ebx test esi, 3 ; czy podzielne przez 4 jz @@Lok movsw ; wyrownanie z lewej do 4 dec ecx @@Lok: shr ecx, 1 rep movsd jnc @@Lsk movsw @@Lsk: add esi, ebp dec edx jnz @@L00 pop ebp ret ENDP _CopyScr2BufHC IF 0 ;----------------------------------------------------------------------------; ; SVGA - HC Copy Buffer to Screen with cliping ; ;----------------------------------------------------------------------------; ; parm: ; X - stack ; Y - stack ; W - stack ; H - stack ; imgPtr - stack ; videoPtr - stack ; ; modify: eax, ebx, ecx, edx, esi, edi ; ; return: NONE ; PUBLIC CopyBuf2ScrCLP_HC ALIGN 4 PROC C CopyBuf2ScrCLP_HC, xCoord:DWORD, yCoord:DWORD, \ lWidth:DWORD, lHeight:DWORD, \ imgPtr: PTR, scrParam: PTR USES ebx, esi, edi LOCAL lXskip:DWORD, lYskip:DWORD LOCAL lXrightSkip:DWORD, lYdownSkip:DWORD LOCAL scrWidth: DWORD mov eax, scrParam mov ecx, [ (ITScreenParam eax).width ] mov scrWidth, ecx mov edi, [ (ITScreenParam eax).ptr ] mov esi, imgPtr call _ITOverlap C, CLPArea.x, CLPArea.y, CLPArea.w, CLPArea.h, \ xCoord, yCoord, lWidth, lHeight test eax, eax jnz @@L1 ret @@L1: mov eax, CLPArea.x sub eax, xCoord jns @@Lsk1 xor eax, eax @@Lsk1: mov lXskip, eax mov eax, CLPArea.y sub eax, yCoord jns @@Lsk2 xor eax, eax @@Lsk2: mov lYskip, eax mov eax, xCoord add eax, lWidth dec eax sub eax, CLPArea.x sub eax, CLPArea.w inc eax jns @@Lsk3 xor eax, eax @@Lsk3: mov lXrightSkip, eax mov eax, yCoord add eax, lHeight dec eax sub eax, CLPArea.y sub eax, CLPArea.h inc eax jns @@Lsk4 xor eax, eax @@Lsk4: mov lYdownSkip, eax mov eax, lXskip add xCoord, eax mov eax, lYskip add yCoord, eax mov eax, yCoord imul eax, scrWidth add eax, xCoord add eax, eax ; * 2 bo 2 bajty na pixel add edi, eax mov ebx, lWidth ; width mov edx, lHeight ; height sub ebx, lXskip ; odjecie od szerokosci Xskip sub edx, lYskip ; odjecie od wysokosci Yskip sub ebx, lXrightSkip ; odjecie od szerokosci XrightSkip sub edx, lYdownSkip ; odjecie od wysokosci YdownSkip mov ecx, lYskip xor eax, eax imul ecx, lWidth add ecx, ecx ; * 2 bo 2 bajty na pixel add esi, ecx ; dodanie Yskip do source mov eax, edi @@L00: mov edi, eax mov ecx, lXskip add ecx, ecx ; * 2 bo 2 bajty na pixel add esi, ecx ; dodanie Xskip do source mov ecx, ebx test edi, 3 ; czy addr podzielny przez 4 jz @@Lok ; jesli tak to skok movsw ; jesli nie to wyrownanie z lewej dec ecx @@Lok: shr ecx, 1 rep movsd jnc @@L01 movsw @@L01: mov ecx, scrWidth add ecx, ecx add eax, ecx ;;; bylo 640 * 2 mov ecx, lXrightSkip add ecx, ecx ; * 2 bo 2 bajty na pixel add esi, ecx ; dodanie Xskip do source dec edx jnz @@L00 ret ENDP CopyBuf2ScrCLP_HC ENDIF ;----------------------------------------------------------------------------; ; SVGA - HC CopyBuf2ScrBank for 640 x 480 16 bit mode ; ;----------------------------------------------------------------------------; ; parm: ; eax - X ; ecx - Y ; ebx - width ; edx - height ; esi - source ptr ; ; modify: eax, ebx, ecx, edx, esi, edi, [ ebp - save on stack] ; ; return: NONE ; PUBLIC CopyBuf2ScrBankHC_ PROC CopyBuf2ScrBankHC_ ;// adr = y*640 +x = y*128 +y*512 +x push ebp xor edi, edi shl ecx, 7 add edi, ecx shl ecx, 2 add edi, ecx add edi, eax ; add X - coord add edi, edi ; x 2 bo 2 bajty na pixel mov eax, edi movzx edi, di ; zamiast " and edi, 00ffffh " add edi, 0A0000h shr eax, 16 ; w AL nr banku ;------ setbank ------------ mov SVGABank, al call _SetBankPTR mov ebp, edi @@L00: mov edi, ebp mov eax, ebx ; pobranie WIDTH'a add eax, eax ; x 2 bo 2 bajty na pixel add eax, edi mov ecx, eax movzx ecx, cx ; zamiast "and ecx, 00ffffh" cmp eax, 0AFFFFh ; czy wskaznik wyjdzie poza bank VIDEO ja @@L04 ; jesli > ( wyzszy ) to skok ;-------------- WYSWIETLANIE LINI WEWNATRZ JEDNEGO BANKU -----------------; @@L01: mov ecx, ebx shr ecx, 1 rep movsd jnc @@L03 movsw @@L03: add bp, 640*2 jnc @@L05 inc SVGABank mov al, SVGABank call _SetBankPTR @@L05: dec edx ; dec HEIGHT jnz @@L00 jmp @@L02 ;----------------- WYSWIETLANIE LINI NA GRANICY BANKOW ---------------------; ;----- WYSWIETLANIE I FRAGMENTU LINII ---------------; @@L04: shr ecx, 1 push ecx mov eax, ebx sub eax, ecx mov ecx, eax shr ecx, 1 rep movsd jnc @@Lsk movsw @@Lsk: ;-------- ZMIANA BANKU -------------------------------; inc SVGABank mov al, SVGABank call _SetBankPTR ; SET BANK sub edi, 010000h ;----- WYSWIETLANIE II FRAGMENTU LINII ---------------; ; pop ecx ;// czesc lini w nastepnym banku ;// przekazana jako "push ecx" shr ecx, 1 rep movsd jnc @@Lsk2 movsw @@Lsk2: add bp, 640*2 dec edx ; dec HEIGHT jnz @@L00 @@L02: pop ebp ;;;;;;; !!! FOR TEST ONLY !!! ;;; mov al, 0 mov SVGABank, al call _SetBankPTR ; SET BANK ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ret ENDP CopyBuf2ScrBankHC_ END