#include "ownincs/IBMconsole.h"


/* allowed globals.. */
struct	ExecBase			*SysBase;
struct	DosLibrary		*DOSBase;
struct	GfxBase			*GfxBase;
struct	IntuitionBase	*IntuitionBase;


              /* Support Funktionen zu IBM Emulator.. */


VOID IBM_reset(struct IBMConsole *con)
{
	UWORD i;

	IBM_cancel(con);
	SetRast(con->rp, 0);

/* Console-Abmessungen resetten.. */
	con->lines	= con->io->xem_window->Height >> 3;
	con->columns= con->io->xem_window->Width >> 3;
	con->width	= con->io->xem_window->Width;

/* Cursor resetten.. */
	con->row		= 1;
	con->col		= 1;
	con->attr	= FS_NORMAL;
	con->apen	= con->foreground_pen;
	con->bpen	= BACKGROUND_PEN;

/* Text-Puffer Argumente resetten.. */
	con->ordcol = 1;
	con->ordc	= 0;
	con->shift	= 0;
	con->s_shift= 0;

	con->stat = con->r_stat;

/* Tabulatoren setzen.. */
	setmem(con->tabs, con->columns, 0);
	for(i=9; i<con->columns; i+=8)
		con->tabs[i] = 1;


	SetDrMd(con->rp, JAM2);
	SetFont(con->rp, con->font);
	SetAPen(con->rp, con->apen);
	SetBPen(con->rp, con->bpen);
	SetSoftStyle(con->rp, 0, FSF_UNDERLINED);

	IBM_savecursor(con, NULL, NUL);
}


VOID IBM_internalsettings(struct IBMConsole *con)
{
	/* some good(?) settings */

	con->r_stat &= ~NEWLINE;
	con->r_stat |= Y_SCROLLCURSOR;
	con->r_stat |= X_SCROLLCURSOR;
}


enum { ARG_HS=0,ARG_VS,ARG_NL,ARGS };

BOOL IBM_parseoptions(struct IBMConsole *con, STRPTR optionsBuffer)
{
	STATIC UBYTE *PreferencesTemplate = "HS=HSCROLL/K,VS=VSCROLL/K,NL=NEWLINE/K";
	UBYTE **ArgArray;
	UBYTE *ArgBuffer;
	BOOL success=FALSE;

	if(SysBase->LibNode.lib_Version < 37)	/* sorry, wrong number..<-:< */
		return(FALSE);

	if(ArgBuffer = (UBYTE *)AllocVec(1024, MEMF_ANY | MEMF_CLEAR))
	{
		strcpy(ArgBuffer, optionsBuffer);
		strcat(ArgBuffer, "\n");

		if(ArgArray = (UBYTE **)AllocVec(sizeof(UBYTE *) * ARGS, MEMF_ANY | MEMF_CLEAR))
		{
			struct RDArgs *ArgsPtr;

			if(ArgsPtr = (struct RDArgs *)AllocDosObject(DOS_RDARGS, TAG_DONE))
			{
				ArgsPtr->RDA_Source.CS_Buffer = ArgBuffer;
				ArgsPtr->RDA_Source.CS_Length = strlen(ArgBuffer);
				ArgsPtr->RDA_Source.CS_CurChr = 0;
				ArgsPtr->RDA_DAList	= NULL;
				ArgsPtr->RDA_Buffer	= NULL;
				ArgsPtr->RDA_BufSiz	= 0;
				ArgsPtr->RDA_ExtHelp	= NULL;
				ArgsPtr->RDA_Flags	= RDAF_NOPROMPT;

				if(ReadArgs(PreferencesTemplate, (LONG *)ArgArray, ArgsPtr))
				{
/*					VOID KPrintF(UBYTE *, ...); */
					success = TRUE;

					if(ArgArray[ARG_HS])
					{
						if(!strnicmp(ArgArray[ARG_HS], "NO", 2))
							con->r_stat &= ~X_SCROLLCURSOR;
						else
							con->r_stat |= X_SCROLLCURSOR;
					}

					if(ArgArray[ARG_VS])
					{
						if(!strnicmp(ArgArray[ARG_VS], "NO", 2))
							con->r_stat &= ~Y_SCROLLCURSOR;
						else
							con->r_stat |= Y_SCROLLCURSOR;
					}

					if(ArgArray[ARG_NL])
					{
						if(!strnicmp(ArgArray[ARG_NL], "NO", 2))
							con->r_stat &= ~NEWLINE;
						else
							con->r_stat |= NEWLINE;
					}

					FreeArgs(ArgsPtr);
				}
				FreeDosObject(DOS_RDARGS, ArgsPtr);
			}
			FreeVec(ArgArray);
		}
		FreeVec(ArgBuffer);
	}
	return(success);
}


/* cancels a ANSI sequence.. */
VOID IBM_cancel(struct IBMConsole *con)
{
	con->inESC = FALSE;
	con->inCSI = FALSE;

	con->argc		= 0;
	con->args[0]	= NUL;
	con->args[1]	= NUL;
	con->icnt		= 0;
	con->inter[0]	= NUL;
}


VOID IBM_cursorflip(struct IBMConsole *con)
{
	if(con->col > con->columns)
		con->col = con->columns;

	SetDrMd(con->rp, COMPLEMENT);
	RectFill(con->rp, (con->col - 1) << 3, (con->row - 1) << 3, (con->col << 3) - 1, (con->row << 3) - 1);
	SetDrMd(con->rp, JAM2);
}


VOID IBM_textout(struct IBMConsole *con)
{
	Move(con->rp, (con->ordcol - 1) << 3, ((con->row - 1) << 3) + BOTLINE);

	if(con->attr & M_INVERSID)
	{
		SetDrMd(con->rp, JAM2 | INVERSVID);
		Text(con->rp, con->ordtext, con->ordc);
		SetDrMd(con->rp, JAM2);
	}
	else
		Text(con->rp, con->ordtext, con->ordc);
	con->ordc = 0;
}


VOID IBM_erasechars(struct IBMConsole *con, UWORD i)
{
	UWORD col, y;

	col = con->col + i - 1;
	if(col > con->columns)
		col = con->columns;
	y = con->row << 3;
	IBM_cleararea(con->rp, (con->col - 1) << 3, (con->row - 1) << 3, col << 3, con->row << 3);
}


VOID IBM_eraselines(struct IBMConsole *con, UWORD i)
{
	UWORD row;

	row = con->row + i;
	if(row > con->lines)
		row = con->lines;

	IBM_cleararea(con->rp, 0, (con->row - 1) << 3, con->width, row << 3);
}


VOID IBM_eraselinebeg(struct IBMConsole *con)
{
	if(con->col > 1)
		IBM_cleararea(con->rp, 0, (con->row - 1) << 3, con->col << 3, con->row << 3);
}


VOID IBM_erasescrbeg(struct IBMConsole *con)
{
	UWORD cnt = con->row - 1;

	if(con->row > 1)
		IBM_cleararea(con->rp, 0, 0, con->width, cnt << 3);
	IBM_eraselinebeg(con);
}


VOID IBM_erasescreen(struct IBMConsole *con)
{
	SetRast(con->rp, 0);
	con->row = 1;
	con->col = 1;
}


VOID IBM_cleararea(struct RastPort *rp, UWORD x1, UWORD y1, UWORD x2, UWORD y2)
{
	ClipBlit(rp, x1, y1, rp, x1, y1, x2 - x1, y2 - y1, 0);
}


/*
#include <hardware/intbits.h>
VOID __saveds __asm CursorServer(register __a1 APTR data)
{
	struct IBMConsole *con = (struct IBMConsole *)data;
	ULONG col;


	if(con->blink_counter++ == 35)
	{
	/* make text invisible.. */

		col = *con->sv->colors[con->apen];
		SetRGB4(&(*con->sv->scr)->ViewPort, con->blink_color, (col>>8)&15, (col>>4)&15, col&15);
		return;
	}
	else
		if(con->blink_counter == 70)
		{
		/* make text visible.. */

			col = *con->sv->colors[con->apen];
			SetRGB4(&(*con->sv->scr)->ViewPort, con->blink_color, (col>>8)&15, (col>>4)&15, col&15);
			con->blink_counter = 0;
		}
}


BOOL IBM_StartCursorInterrupt(struct IBMConsole *con)
{
	if(!con->interrupt_started)
	{
		con->cursorhandler.is_Node.ln_Name = "";
		con->cursorhandler.is_Node.ln_Type = NT_INTERRUPT;
		con->cursorhandler.is_Code	= (VOID *)CursorServer;
		con->cursorhandler.is_Data	= (APTR)con;
		AddIntServer(INTB_VERTB, &con->cursorhandler);
		con->interrupt_started = TRUE;
		return(TRUE);
	}
	return(FALSE);
}


BOOL IBM_DeleteCursorInterrupt(struct IBMConsole *con)
{
	if(con->interrupt_started)
	{
		RemIntServer(INTB_VERTB, &con->cursorhandler);
		con->interrupt_started = FALSE;
		return(TRUE);
	}
	return(FALSE);
}


VOID IBM_getoldblinkcolor(struct IBMConsole *con, UWORD *col, UWORD *reg)
{
	*reg = con->blink_color;
	*col = *con->sv->colors[con->blink_color];
}
*/


/* end of source-code */
