; 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 ; ;***************************************************************************** ; ; PutImgHC_ ; GetImgHC_ ; ; PutRectHC_ ; ; PutSprHC_ ; ; PutImgVWHC_ - Variable Width ; GetImgVWHC_ - Variable Width ; PutSprVWHC_ - Variable Width ; ; PutImgCLP_HC_ - with cliping ; GetImgCLP_HC_ - with cliping ; PutSprCLP_HC_ - with cliping ; PutRectCLP_HC_ - with cliping ; ; SetCLPArea ; GetCLPArea ; ; ; CopyBuf2ScrCLP_HC ; CopyScr2BufCLP_HC ; IDEAL P386 MODEL FLAT LOCALS NOWARN BRK INCLUDE 'graph.inc' DATASEG ;; PUBLIC CLPArea CLPArea ITClipArea <> CODESEG ;----------------------------------------------------------------------------; ; SVGA - HC Put Image for 640 x 480 mode ; ;----------------------------------------------------------------------------; ; parm: ; eax - X ; edx - Y ; esi - source ptr ( img ) ; edi - * ITScreenParam ; ; modify: eax, ebx, ecx, edx, esi, edi ; ; return: NONE ; PUBLIC PutImgHC_ ALIGN 4 PROC PutImgHC_ push ebp mov ebp, [ (ITScreenParam edi ).width ] mov edi, [ (ITScreenParam edi ).ptr ] imul edx, ebp ; y * scrWidth add edx, eax ; add x coord add edx, edx ; * 2 bo 2 bajty na pixel add edi, edx xor ebx, ebx xor edx, edx mov bx, [ esi+0 ] ; width mov dx, [ esi+2 ] ; height add esi, 4 sub ebp, ebx add ebp, ebp @@L00: mov ecx, ebx test edi, 00000003 ; 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: add edi, ebp dec edx jnz @@L00 pop ebp ret ENDP PutImgHC_ ;----------------------------------------------------------------------------; ; SVGA - HC Get Image ; ;----------------------------------------------------------------------------; ; parm: ; eax - X ; ecx - Y ; ebx - WIDTH ; edx - HEIGHT ; edi - dest ptr ( img ) ; esi - video ptr ( addr ) ; ; modify: eax, ebx, ecx, edx, esi, edi ; ; return: NONE ; PUBLIC GetImgHC_ ALIGN 4 PROC GetImgHC_ push ebp mov ebp, [ (ITScreenParam esi ).width ] mov esi, [ (ITScreenParam esi ).ptr ] imul ecx, ebp ; y * scrWidth add ecx, eax ; add x coord add ecx, ecx ; * 2 bo 2 bajty na pixel add esi, ecx mov [ edi+0 ], bx ; width mov [ edi+2 ], dx ; height add edi, 4 sub ebp, ebx add ebp, ebp nop @@L00: mov ecx, ebx test edi, 00000003 ; 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: add esi, ebp dec edx jnz @@L00 pop ebp ret ENDP GetImgHC_ ;----------------------------------------------------------------------------; ; SVGA - HC Put Rectangle ; ;----------------------------------------------------------------------------; ; parm: ; eax - X ; ecx - Y ; ebx - WIDTH ; edx - HEIGHT ; esi - color ; edi - * ITScreenParam ; ; modify: eax, ebx, ecx, edx, esi, edi ; ; return: NONE ; PUBLIC PutRectHC_ ALIGN 4 PROC PutRectHC_ push ebp mov ebp, [ (ITScreenParam edi).width ] imul ecx, ebp add ecx, eax shl ecx, 1 mov edi, [ (ITScreenParam edi).ptr ] add edi, ecx mov eax, esi ; rozszerzenie koloru z 16 shl eax, 16 ; na 32 bity mov ax, si sub ebp, ebx ; po wykonaniu w ebp lineDelta shl ebp, 1 ; * 2 bo 2 bajty na pixel @@L00: mov ecx, ebx test edi, 00000003 ; czy addr podzielny przez 4 jz @@Lok ; jesli tak to skok stosw ; jesli nie to wyrownanie z lewej dec ecx @@Lok: shr ecx, 1 rep stosd jnc @@L01 stosw @@L01: add edi, ebp dec edx jnz @@L00 pop ebp ret ENDP PutRectHC_ ;----------------------------------------------------------------------------; ; SVGA - HC Put Sprite for 640 x 480 mode ; ;----------------------------------------------------------------------------; ; parm: ; eax - X ; ecx - Y ; esi - * imgPtr ; esi - * ITScreenParam ; ; modify: eax, ebx, ecx, edx, esi, edi ; ; return: NONE ; PUBLIC PutSprHC_ ALIGN 4 PROC PutSprHC_ push ebp mov ebp, [ (ITScreenParam edi ).width ] mov edi, [ (ITScreenParam edi ).ptr ] imul ecx, ebp ; y * scrWidth add ecx, eax ; add x coord shl ecx, 1 ; *2 bo 2 bajty na pixel add edi, ecx lodsw movzx ebx, ax ; width lodsw movzx edx, ax ; height sub ebp, ebx shl ebp, 1 @@L00: mov ecx, ebx @@L01: mov ax, [ esi ] or ax, ax jz @@Lsk mov [ edi ], ax @@Lsk: add esi, 2 add edi, 2 dec ecx jnz @@L01 add edi, ebp dec edx jnz @@L00 pop ebp ret ENDP PutSprHC_ ;----------------------------------------------------------------------------; ; SVGA - HC Put Image with Variable Width ; ;----------------------------------------------------------------------------; ; parm: ; eax - X ; edx - Y ; esi - source ptr ( img ) ; edi - video ptr ( addr ) ; ecx - ScrWidth ; ; modify: eax, ebx, ecx, edx, esi, edi ; ; return: NONE ; PUBLIC PutImgVWHC_ ALIGN 4 PROC PutImgVWHC_ ;// adr = (y*640 +x) * 2 = y*256 + y*1024 + x*2 ; shl edx, 8 ; add edi, edx ; shl edx, 2 ; add edi, edx ; shl eax, 1 ; x = x * 2 ; add edi, eax ; add X - coord ; push edx ; ScrWidth * Y ( edx ) push eax mov eax, ecx mul dx shl edx, 16 mov dx, ax shl edx, 1 ; bo 1 pixel to 2 bajty add edi, edx pop eax shl eax, 1 ; x = x * 2 add edi, eax ; add X - coord lodsw movzx ebx, ax ; width lodsw movzx edx, ax ; height mov eax, ecx sub eax, ebx shl eax, 1 ; x 2, bo 1 pixel to 2 bajty @@L00: mov ecx, ebx test edi, 00000003 ; 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: add edi, eax dec edx jnz @@L00 ret ENDP PutImgVWHC_ ;----------------------------------------------------------------------------; ; SVGA - HC Get Image with Variable Width ; ;----------------------------------------------------------------------------; ; parm: ; eax - X ; ecx - Y ; ebx - WIDTH ; edx - HEIGHT ; edi - dest ptr ( img ) ; esi - video ptr ( addr ) ; stack - screen width ; ; modify: eax, ebx, ecx, edx, esi, edi ; ; return: NONE ; PUBLIC GetImgVWHC_ ALIGN 4 PROC GetImgVWHC_, scrwidth: DWORD push ebp mov ebp, esp ;// adr = (y*640 +x) * 2 = y*256 + y*1024 + x*2 ; shl ecx, 8 ; add esi, ecx ; shl ecx, 2 ; add esi, ecx ; shl eax, 1 ; x = x * 2 ; add esi, eax ; add X - coord ; ScrWidth * Y ( ecx ) push edx push eax mov eax, scrwidth mov edx, ecx mul dx shl edx, 16 mov dx, ax shl edx, 1 ; bo 1 pixel to 2 bajty add esi, edx pop eax shl eax, 1 ; x = x * 2 add esi, eax ; add X - coord pop edx mov eax, ebx ; width stosw mov eax, edx ; height stosw mov eax, scrwidth sub eax, ebx shl eax, 1 ; x 2, bo 1 pixel to 2 bajty @@L00: mov ecx, ebx test esi, 00000003 ; 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: add esi, eax dec edx jnz @@L00 leave ret ENDP GetImgVWHC_ ;----------------------------------------------------------------------------; ; SVGA - HC Put Sprite for 640 x 480 mode ; ;----------------------------------------------------------------------------; ; parm: ; ecx - X ; eax - Y ; edi - dest ptr ( img ) ; esi - video ptr ( addr ) ; edx - ScrWidth ; ; modify: eax, ebx, ecx, edx, esi, edi [ ebp - save on stack ] ; ; return: NONE ; PUBLIC PutSprVWHC_ ALIGN 4 PROC PutSprVWHC_ ;;; adr = (y*ScrWidth +x) * 2 push ebp ; ScrWidth ( edx ) * Y ( eax ) mov ebp, edx mul edx add eax, ecx ; add X coord shl eax, 1 ; x 2 bo 1 pixel to 2 bajty add edi, eax ; lodsw movzx ebx, ax ; width lodsw movzx edx, ax ; height sub ebp, ebx shl ebp, 1 ; x2 bo 1 pixel to 2 bajty @@L00: mov ecx, ebx @@L01: lodsw or ax, ax jz @@Lsk mov [ edi ], ax @@Lsk: add edi, 2 loop @@L01 add edi, ebp dec edx jnz @@L00 pop ebp ret ENDP PutSprVWHC_ ;----------------------------------------------------------------------------; ; Overlap test ; ;----------------------------------------------------------------------------; ; parm: ; xA - stack ; yA - stack ; wA - stack ; hA - stack ; xB - stack ; yB - stack ; wB - stack ; hB - stack ; ; modify: eax, ebx, ecx, edx ; ; return: eax: TRUE- 1 or FALSE- 0 ; PUBLIC ITOverlap PROC C ITOverlap, xA:DWORD, yA:DWORD, wA:DWORD, hA:DWORD, \ xB:DWORD, yB:DWORD, wB:DWORD, hB:DWORD mov eax, xA mov ebx, yA mov ecx, xB mov edx, yB add eax, wA add ebx, hA add ecx, wB add edx, hB dec eax dec ebx dec ecx dec edx cmp eax, xB jl @@Lfalse cmp ecx, xA jl @@Lfalse cmp ebx, yB jl @@Lfalse cmp edx, yA jl @@Lfalse mov eax, 1 ret @@Lfalse: mov eax, 0 ret ENDP ITOverlap ;----------------------------------------------------------------------------; ; SVGA - HC Put Image with Clipping ; ;----------------------------------------------------------------------------; ; parm: ; X - stack ; Y - stack ; imgPtr - stack ; videoPtr - stack ; ; modify: eax, ebx, ecx, edx, esi, edi ; ; return: NONE ; PUBLIC PutImgCLP_HC ALIGN 4 PROC C PutImgCLP_HC, xCoord:DWORD, yCoord:DWORD, imgPtr: PTR, scrParam: PTR USES ebx, esi, edi LOCAL lXskip:DWORD, lYskip:DWORD LOCAL lXrightSkip:DWORD, lYdownSkip:DWORD LOCAL lWidth:DWORD, lHeight:DWORD LOCAL scrWidth: DWORD mov eax, scrParam mov ecx, [ (ITScreenParam eax).width ] mov scrWidth, ecx mov edi, [ (ITScreenParam eax).ptr ] mov esi, imgPtr xor eax, eax mov ax, [ esi ] add esi, 2 mov lWidth, eax xor eax, eax mov ax, [ esi ] add esi, 2 mov lHeight, eax 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 shl eax, 1 ; * 2 bo 2 bajty na pixel ;;; mov edi, videoPtr ;;; mov edi, [ (ITScreenParam scrParam).ptr ] 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 shl ecx, 1 ; * 2 bo 2 bajty na pixel add esi, ecx ; dodanie Yskip do source mov eax, edi @@L00: mov edi, eax mov ecx, lXskip shl ecx, 1 ; * 2 bo 2 bajty na pixel add esi, ecx ; dodanie Xskip do source mov ecx, ebx test edi, 00000003 ; 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 shl ecx, 1 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 PutImgCLP_HC ;----------------------------------------------------------------------------; ; SVGA - HC Put Image with Clipping - co druga linie na ekr i w img ; ;----------------------------------------------------------------------------; ; parm: ; X - stack ; Y - stack ; imgPtr - stack ; videoPtr - stack ; ; modify: eax, ebx, ecx, edx, esi, edi ; ; return: NONE ; PUBLIC PutImg22CLP_HC ALIGN 4 PROC C PutImg22CLP_HC, xCoord:DWORD, yCoord:DWORD, imgPtr: PTR, scrParam: PTR USES ebx, esi, edi LOCAL lXskip:DWORD, lYskip:DWORD LOCAL lXrightSkip:DWORD, lYdownSkip:DWORD LOCAL lWidth:DWORD, lHeight:DWORD LOCAL scrWidth: DWORD mov eax, scrParam mov ecx, [ (ITScreenParam eax).width ] mov scrWidth, ecx mov edi, [ (ITScreenParam eax).ptr ] mov esi, imgPtr xor eax, eax mov ax, [ esi ] add esi, 2 mov lWidth, eax xor eax, eax mov ax, [ esi ] add esi, 2 mov lHeight, eax 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 shl eax, 1 ; * 2 bo 2 bajty na pixel ;;; mov edi, videoPtr ;;; mov edi, [ (ITScreenParam scrParam).ptr ] 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 shl ecx, 1 ; * 2 bo 2 bajty na pixel add esi, ecx ; dodanie Yskip do source mov eax, edi @@L00: mov edi, eax mov ecx, lXskip shl ecx, 1 ; * 2 bo 2 bajty na pixel add esi, ecx ; dodanie Xskip do source mov ecx, ebx test edi, 00000003 ; 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 shl ecx, 1 add eax, ecx ;;; bylo 640 * 2 add eax, ecx mov ecx, lXrightSkip add ecx, ecx ; * 2 bo 2 bajty na pixel add esi, ecx ; dodanie Xskip do source push eax mov eax, lWidth add eax, eax add esi, eax pop eax dec edx dec edx jg @@L00 ret ENDP PutImg22CLP_HC ;----------------------------------------------------------------------------; ; SVGA - HC Put Image with Clipping - co druga linie na ekr ; ;----------------------------------------------------------------------------; ; parm: ; X - stack ; Y - stack ; imgPtr - stack ; videoPtr - stack ; ; modify: eax, ebx, ecx, edx, esi, edi ; ; return: NONE ; PUBLIC PutImg21CLP_HC ALIGN 4 PROC C PutImg21CLP_HC, xCoord:DWORD, yCoord:DWORD, imgPtr: PTR, scrParam: PTR USES ebx, esi, edi LOCAL lXskip:DWORD, lYskip:DWORD LOCAL lXrightSkip:DWORD, lYdownSkip:DWORD LOCAL lWidth:DWORD, lHeight:DWORD LOCAL scrWidth: DWORD mov eax, scrParam mov ecx, [ (ITScreenParam eax).width ] mov scrWidth, ecx mov edi, [ (ITScreenParam eax).ptr ] mov esi, imgPtr xor eax, eax mov ax, [ esi ] add esi, 2 mov lWidth, eax xor eax, eax mov ax, [ esi ] add esi, 2 add eax, eax ;; wysokosc * 2 zeby dobrze clipowal mov lHeight, eax 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 shl eax, 1 ; * 2 bo 2 bajty na pixel ;;; mov edi, videoPtr ;;; mov edi, [ (ITScreenParam scrParam).ptr ] 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 shr ecx, 1 ; dzielone / 2 bo dla clipingu xor eax, eax ; wyzej jest mnozone * 2 imul ecx, lWidth shl ecx, 1 ; * 2 bo 2 bajty na pixel add esi, ecx ; dodanie Yskip do source mov eax, edi @@L00: mov edi, eax mov ecx, lXskip shl ecx, 1 ; * 2 bo 2 bajty na pixel add esi, ecx ; dodanie Xskip do source mov ecx, ebx test edi, 00000003 ; 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 shl ecx, 1 add eax, ecx ;;; bylo 640 * 2 add eax, ecx mov ecx, lXrightSkip add ecx, ecx ; * 2 bo 2 bajty na pixel add esi, ecx ; dodanie Xskip do source ;;; push eax ;;; mov eax, lWidth ;;; add eax, eax ;;; add esi, eax ;;; pop eax dec edx dec edx jg @@L00 ret ENDP PutImg21CLP_HC ;----------------------------------------------------------------------------; ; SVGA - HC Get Image with Clipping ; ;----------------------------------------------------------------------------; ; parm: ; X - stack ; Y - stack ; Width - stack ; Height - stack ; imgPtr - stack ; videoPtr - stack ; ; modify: eax, ebx, ecx, edx, esi, edi ; ; return: NONE ; PUBLIC GetImgCLP_HC ALIGN 4 PROC C GetImgCLP_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 esi, [ (ITScreenParam eax).ptr ] call ITOverlap C, CLPArea.x, CLPArea.y, CLPArea.w, CLPArea.h, \ xCoord, yCoord, lWidth, lHeight test eax, eax jnz @@L1 ret @@L1: mov edi, imgPtr mov eax, lWidth mov [ edi+0 ], ax ; zapisanie width w naglowku imaga mov eax, lHeight mov [ edi+2 ], ax ; zapisanie height w naglowku imaga add edi, 4 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 shl eax, 1 ; * 2 bo 2 bajty na pixel add esi, eax ; esi - screen ptr 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 shl ecx, 1 ; * 2 bo 2 bajty na pixel add edi, ecx ; dodanie Yskip do image mov eax, esi @@L00: mov esi, eax mov ecx, lXskip shl ecx, 1 ; * 2 bo 2 bajty na pixel add edi, ecx ; dodanie Xskip do image mov ecx, ebx test esi, 00000003 ; 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 shl ecx, 1 add eax, ecx mov ecx, lXrightSkip shl ecx, 1 ; * 2 bo 2 bajty na pixel add edi, ecx ; dodanie Xskip do image dec edx jnz @@L00 ret ENDP GetImgCLP_HC ;----------------------------------------------------------------------------; ; SVGA - HC Put Sprite with Clipping ; ;----------------------------------------------------------------------------; ; parm: ; X - stack ; Y - stack ; imgPtr - stack ; scrParam - stack ; ; modify: eax, ebx, ecx, edx, esi, edi ; ; return: NONE ; PUBLIC PutSprCLP_HC ALIGN 4 PROC C PutSprCLP_HC, xCoord:DWORD, yCoord:DWORD, imgPtr: PTR, scrParam: PTR USES ebx, esi, edi LOCAL lXskip:DWORD, lYskip:DWORD LOCAL lXrightSkip:DWORD, lYdownSkip:DWORD LOCAL lWidth:DWORD, lHeight:DWORD LOCAL scrWidth: DWORD mov eax, scrParam mov ecx, [ (ITScreenParam eax).width ] mov scrWidth, ecx mov edi, [ (ITScreenParam eax).ptr ] mov esi, imgPtr xor eax, eax mov ax, [ esi ] add esi, 2 mov lWidth, eax xor eax, eax mov ax, [ esi ] add esi, 2 mov lHeight, eax 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 ecx, ecx ; czy szerokosc = 0 jz @@LnoAction push eax test edi, 00000003 ; czy addr podzielny przez 4 jz @@Lok ; jesli tak to skok mov ax, [ esi ] ; jesli nie to wyrownanie z lewej test ax, ax jz @@Lsk mov [ edi ], ax @@Lsk: add esi, 2 add edi, 2 dec ecx @@Lok: push ecx shr ecx, 1 jz @@LlastPixel @@Lloop: mov eax, [ esi ] test eax, 00000ffffh jz @@Lpixel2 test eax, 0ffff0000h jz @@Lpixel1 mov [ edi ], eax jmp @@Lcontinue @@Lpixel1: mov [ edi ], ax jmp @@Lcontinue @@Lpixel2: test eax, 0ffff0000h jz @@Lcontinue shr eax, 16 mov [ edi+2 ], ax jmp @@Lcontinue @@Lcontinue: add esi, 4 add edi, 4 dec ecx jnz @@Lloop @@LlastPixel: pop ecx test cl, 1 jz @@L01 mov ax, [ esi ] ; wyrownanie z prawej test ax, ax ; czy pixel transparentny jz @@LskR mov [ edi ], ax @@LskR: add esi, 2 add edi, 2 @@L01: pop eax @@LnoAction: mov ecx, scrWidth add ecx, ecx ; * 2 bo 2 bajty na pixel 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 PutSprCLP_HC ;----------------------------------------------------------------------------; ; SVGA - HC Put Rectangle with Clipping ; ;----------------------------------------------------------------------------; ; parm: ; X - stack ; Y - stack ; W - stack ; H - stack ; imgPtr - stack ; scrParam - stack ; ; modify: eax, ebx, ecx, edx, esi, edi ; ; return: NONE ; PUBLIC PutRectCLP_HC ALIGN 4 PROC C PutRectCLP_HC, xCoord:DWORD, yCoord:DWORD, \ aWidth:DWORD, aHeight:DWORD, \ color: DWORD, 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 ] call ITOverlap C, CLPArea.x, CLPArea.y, CLPArea.w, CLPArea.h, \ xCoord, yCoord, aWidth, aHeight 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, aWidth 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, aHeight 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, aWidth ; width mov edx, aHeight ; 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 eax, color shl eax, 16 or eax, color ; rozszerzenie koloru na dwie 16-ki mov esi, scrWidth ; obliczenie screen Delta sub esi, ebx add esi, esi ; * 2 bo 2 bajty na pixel ;--------------------------------------- ; w tym miejscu rejestry zawieraja ; parametry clipnietego rectangla: ; ; edi - screen addr ; ebx - width ; edx - height ; eax - color ; esi - screen delta ;--------------------------------------- @@L00: mov ecx, ebx test edi, 00000003 ; czy addr podzielny przez 4 jz @@Lok ; jesli tak to skok stosw ; jesli nie to wyrownanie z lewej dec ecx @@Lok: shr ecx, 1 rep stosd jnc @@L01 stosw @@L01: add edi, esi dec edx jnz @@L00 ret ENDP PutRectCLP_HC ;----------------------------------------------------------------------------; ; set clipping area ; ;----------------------------------------------------------------------------; PUBLIC SetCLPArea ALIGN 4 PROC C SetCLPArea, xCoord:DWORD, yCoord:DWORD, _width:DWORD, _height:DWORD mov eax, xCoord mov CLPArea.x, eax mov eax, yCoord mov CLPArea.y, eax mov eax, _width mov CLPArea.w, eax mov eax, _height mov CLPArea.h, eax ret ENDP SetCLPArea ;----------------------------------------------------------------------------; ; get clipping area ; ;----------------------------------------------------------------------------; ; parm: ; edi - * ITClipArea ; ; modify: eax ; ; return: NONE ; PUBLIC GetCLPArea_ ALIGN 4 PROC GetCLPArea_ mov eax, CLPArea.x mov [ ( ITClipArea edi ).x ], eax mov eax, CLPArea.y mov [ ( ITClipArea edi ).y ], eax mov eax, CLPArea.w mov [ ( ITClipArea edi ).w ], eax mov eax, CLPArea.h mov [ ( ITClipArea edi ).h ], eax ret ENDP GetCLPArea_ ;----------------------------------------------------------------------------; ; SVGA - HC Copy Buffer to Screen with cliping ; ;----------------------------------------------------------------------------; ; parm: ; X - stack ; Y - stack ; W - stack ; H - stack ; bufPtr - stack ; scrParam - 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 ;----------------------------------------------------------------------------; ; SVGA - HC Copy Screen to Buffer with cliping ; ;----------------------------------------------------------------------------; ; parm: ; X - stack ; Y - stack ; W - stack ; H - stack ; bufPtr - stack ; scrParam - stack ; ; modify: eax, ebx, ecx, edx, esi, edi ; ; return: NONE ; PUBLIC CopyScr2BufCLP_HC ALIGN 4 PROC C CopyScr2BufCLP_HC, xCoord:DWORD, yCoord:DWORD, \ lWidth:DWORD, lHeight:DWORD, \ bufPtr: 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 esi, [ (ITScreenParam eax).ptr ] mov edi, bufPtr 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 esi, 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 edi, ecx ; dodanie Yskip do buf mov eax, esi @@L00: mov esi, eax mov ecx, lXskip add ecx, ecx ; * 2 bo 2 bajty na pixel add edi, ecx ; dodanie Xskip do buff 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 edi, ecx ; dodanie Xskip do buff dec edx jnz @@L00 ret ENDP CopyScr2BufCLP_HC END