; ; Command & Conquer Red Alert(tm) ; Copyright 2025 Electronic Arts Inc. ; ; This program is free software: you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation, either version 3 of the License, or ; (at your option) any later version. ; ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License ; along with this program. If not, see <http://www.gnu.org/licenses/>. ; ; $Header: g:/library/wwlib32/file/rcs/pack2pln.asm 1.1 1994/04/22 18:07:46 scott_bowen Exp $ ;*************************************************************************** ;** C O N F I D E N T I A L --- W E S T W O O D A S S O C I A T E S ** ;*************************************************************************** ;* * ;* Project Name : Library * ;* * ;* File Name : PACK2PLN.ASM * ;* * ;* Programmer : Scott K. Bowen * ;* * ;* Start Date : November 20, 1991 * ;* * ;* Last Update : April 22, 1994 [SKB] * ;* * ;*-------------------------------------------------------------------------* ;* Functions: * ;* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * IDEAL P386 MODEL USE32 FLAT LOCALS ?? ;****************************************************************************** ; External declares so these functions can be called ; GLOBAL Pack_2_Plane:NEAR CODESEG ;*************************************************************************** ;* PACK_2_PLANE -- packed to planar scanline conversion * ;* * ;* INPUT: BYTE *buffer (far) -- pointer to planar output buffer * ;* BYTE *pageptr (far) -- pointer to current row in packed page * ;* WORD planebit -- current bit used in plane -- use only low byte * ;* * ;* OUTPUT: * ;* Return result in buffer. * ;* WARNINGS: * ;* * ;* HISTORY: * ;* 11/20/1991 SB : Created. * ;* 04/22/1994 SKB : Converted to 32 bit library. * ;*=========================================================================* ; * ; This is the original function that is converted to asm ; ;PRIVATE VOID Pack_2_Plane(UBYTE * buffer, BYTE * pageptr, BYTE planebit) ;{ ; WORD currbit=0x80; // current bit to be written to ; WORD pixel; // current pixel in row used as a counter; ; ; buffer--; // will be incremented at the start ; for (currbit = 0, pixel = 0; pixel < 320; pixel++) { ; if (!currbit) { ; currbit = 0x80; // reset bit 7 ; buffer++; // go to next byte in buffer ; *buffer = 0; // clear byte so we only need to set bits needed ; } ; if (planebit & *pageptr++) ; *buffer |= currbit; // set bit in destination if plane was set is source ; ; currbit >>= 1; // shift destination bit one right ; } ;} PROC Pack_2_Plane C NEAR USES ebx,ecx,esi,edi ARG buffer:DWORD ARG page:DWORD ARG planebit:WORD mov edi,[buffer] mov esi,[page] mov ax,[planebit] ; move bit set for current plane (planebit) to ax ; the low byte will only be used mov ecx,320d ; set counter to 320 columns (320x200 picture) mov ah,80h ; set bit 7 of current_bit dec edi ; this will get incremented at the start ??top_loop: ; while (columns left) cmp ah,80h ; if current_bit is bit 7 jnz short ??same_dest ; Then inc edi ; buffer++ increment pointer mov [BYTE PTR edi],0 ; *buffer = 0 ??same_dest: ; EndIf mov bl,al and bl,[esi] ; if (planebit & *pageptr) jz short ??no_set_bit or [BYTE PTR edi],ah ; Then *buffer |= current_bit ??no_set_bit: inc esi ; pageptr++ goto next in source byte ror ah,1 ; rotate current_bit right one dec ecx ; jnz ??top_loop ret ENDP Pack_2_Plane END