/* $Id: dspsubrs.c,v 1.3 2001/12/26 22:17:02 sybalsky Exp $ (C) Copyright Venue, All Rights Reserved
 */
/*** ADOPTED NEW VERSION ***/

/************************************************************************/
/*									*/
/*	(C) Copyright 1989-2000 Venue. All Rights Reserved.		*/
/*	Manufactured in the United States of America.			*/
/*									*/
/************************************************************************/

#include "version.h"

#include <stdio.h>

#include "lispemul.h"
#include "lsptypes.h"
#include "lispmap.h"
#include "display.h"
#include "arith.h"

#include "dspsubrsdefs.h"
#include "commondefs.h"
#ifdef XWINDOW
#include "xcursordefs.h"
#include "xlspwindefs.h"
#endif

extern int DebugDSP;
extern int displaywidth, displayheight;

#ifdef XWINDOW
extern int Mouse_Included;
#endif /* XWINDOW */

/****************************************************
 *
 *	DSP_dspbout() entry of SUBRCALL 9 1
 *			called from (DSPBOUT X)
 *
 ****************************************************/

void DSP_dspbout(LispPTR *args) /* args[0] :	charcode	*/
{ putc((args[0] & 0xFFFF) & 0x7f, BCPLDISPLAY); }

/****************************************************
 *
 *	DSP_showdisplay() entry of SUBRCALL 19 2
 *			called from (SHOWDISPLAY BASE RASTERWIDTH)
 *
 ****************************************************/

extern int DisplayInitialized;

void DSP_showdisplay(LispPTR *args)
{ DisplayInitialized = 1; }

/****************************************************
 *
 *	DSP_VideoColor() entry of SUBRCALL 66 1
 *			called from (VIDEOCLOR BLACKFLG)
 *
 ****************************************************/

LispPTR DSP_VideoColor(LispPTR *args) /* args[0] :	black flag	*/
{
  int invert;
#if   defined(XWINDOW)
  invert = args[0] & 0xFFFF;
  lisp_Xvideocolor(invert);
  if (invert)
    return ATOM_T;
  else
    return NIL;
#else
  return NIL;
#endif
}

extern struct cursor CurrentCursor;
extern int LispWindowFd;

/****************************************************
 *
 *	DSP_Cursor() entry of SUBRCALL 64 2
 *			called from \HARDCURSORUP etc.
 *
 ****************************************************/
void DSP_Cursor(LispPTR *args, int argnum)
/* args[0] :	hot spot X
 * args[1] :	hot spot Y
 */
{
  extern int ScreenLocked;
  extern DLword *EmCursorX68K, *EmCursorY68K;
  extern int LastCursorX, LastCursorY;


#ifdef XWINDOW
  /* For X-Windows, set the cursor to the given location. */
  Set_XCursor((int)(args[0] & 0xFFFF), (int)(args[1] & 0xFFFF));
#endif /* XWINDOW */
}

/****************************************************
 *
 *	DSP_SetMousePos() entry of SUBRCALL 65 2
 *			called from macro \SETMOUSEXY etc.
 *
 ****************************************************/
 /* args[0] :	X pos
  * args[1] :	Y pos
  */
void DSP_SetMousePos(register LispPTR *args)
{

#ifdef XWINDOW
  if (Mouse_Included)
    set_Xmouseposition((int)(GetSmalldata(args[0])), (int)(GetSmalldata(args[1])));
#endif /* XWINDOW */
}

/****************************************************
 *
 *	DSP_ScreenWidth() entry of SUBRCALL 67 0
 *			called from  \Katana.DisplayWidth.
 *
 ****************************************************/
LispPTR DSP_ScreenWidth(LispPTR *args)
{ return (S_POSITIVE | (0xFFFF & displaywidth)); }

/****************************************************
 *
 *	DSP_ScreenHight() entry of SUBRCALL 68 0
 *			called from  \Katana.DisplayHeight.
 *
 ****************************************************/
LispPTR DSP_ScreenHight(LispPTR *args)
{ return (S_POSITIVE | (0xFFFF & displayheight)); }

/****************************************************
 *
 *	flip_cursor()
 *
 ****************************************************/

extern DLword *EmCursorBitMap68K;
extern int for_makeinit;

#ifdef XWINDOW
extern int Current_Hot_X, Current_Hot_Y;
#endif /* XWINDOW */

void flip_cursor() {
  register DLword *word;
  register int cnt;
  extern int ScreenLocked;
  extern DLword *EmCursorX68K, *EmCursorY68K;

  word = EmCursorBitMap68K;

#ifdef INIT

  /* since this is called frequently, and you don't want to have
     to build a different LDE to run the 2 parts of a Loadup, there is
     an ifdef AND a test.  This way we don't generate
     extra code for anybody else building an LDE
     except those who want to try building loadups.  */

  if (!for_makeinit) {
    for (cnt = CURSORHEIGHT; (cnt--);) { GETWORD(word++) ^= 0xFFFF; };
  };

#else

  for (cnt = CURSORHEIGHT; (cnt--);) { GETWORD(word++) ^= 0xFFFF; };

#endif


#ifdef XWINDOW
  /* JDS 011213: 15- cur y, as function does same! */
  Set_XCursor(Current_Hot_X, 15 - Current_Hot_Y);
#endif /* XWINDOW */
}
