$include (..\lib\compStch.ext)

/*
 *============================================================================
 *  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
 *
 *  Permission to use for any purpose, modify, copy, and make enhancements
 *  and derivative works of the software is granted if attribution is given to
 *  R.M. Gillmore, dba the ACME Software Deli, as the author
 *
 *  While the ACME Software Deli does not work for money, there is nonetheless
 *  a significant amount of work involved.  The ACME Software Deli maintains the
 *  rights to all code written, though it may be used and distributed as long as
 *  the following conditions are maintained.
 *
 *  1.  The copyright statement at the top of each code block is maintained in
 *      your distribution.
 *  2.  You do not identify yourself as the ACME Software Deli
 *  3.  Any changes made to the software are sent to the ACME Software Deli
 *============================================================================
 */


vChgAttrAtModule:
do;

$if not noID
declare IDString	(*) byte data
	( '@(#)vChgAttr.p86  $Author: rmgillmore $ $Date:: 2025-05-04 19:35:39#$:', 0 );
$endif

$set( vChangeAttrImplementation )
$include (..\lib\videoIO.ext)
$include (..\lib\sysCalls.ext)

/*
 * -----------------------------------------------------------------------------
 *	the changeAttributeAt() function moves to the designated screen position
 *	( x, y ), then writes the new attribute as indicated
 * -----------------------------------------------------------------------------
 */

vChangeAttributeAt:
procedure ( newAttribute, xCoordinate, yCoordinate ) reentrant public;
	declare	newAttribute		byte,
			xCoordinate			byte,
			yCoordinate			byte;

	declare	currentLocation		word,
			( savedX,
				savedY	)		byte at ( @currentLocation ),
			currentCharacter	char,
			cpuRegisters;

	currentLocation = curpos;

	/*
	 *	change to the desired location before doing any work
	 */

	call gotoxy( xCoordinate, yCoordinate );

	/*
	 *	get the character and the attribute.  we will ignore the current
	 *	attribute, but will save the character for the write
	 */

	byteRegs.Ah = 8;
	byteRegs.Bh = 0;
	call int86( VIDEO_CALL, @byteRegs );

	/*
	 *	save the character for the next call
	 */

	currentCharacter = byteRegs.Al;

	/*
	 *	write the character, and desired attribute
	 */

	byteRegs.Al = currentCharacter;
	byteRegs.Ah = 9;
	byteRegs.Bh = 0;
	byteRegs.Bl = newAttribute;
	wordRegs.Cx = 1;
	call int86( VIDEO_CALL, @byteRegs );

	/*
	 *	return to the current location
	 */

	call gotoxy( savedX, savedY );
end vChangeAttributeAt;

end vChgAttrAtModule;