You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
274 lines
6.3 KiB
274 lines
6.3 KiB
/* File: D:\WACKER\emu\vt52.c (Created: 28-Dec-1993)
|
|
*
|
|
* Copyright 1994, 1998 by Hilgraeve Inc. -- Monroe, MI
|
|
* All rights reserved
|
|
*
|
|
* $Revision: 3 $
|
|
* $Date: 5/09/01 4:47p $
|
|
*/
|
|
|
|
#include <windows.h>
|
|
#pragma hdrstop
|
|
|
|
#include <tdll\stdtyp.h>
|
|
#include <tdll\chars.h>
|
|
#include <tdll\print.h>
|
|
#include <tdll\mc.h>
|
|
#include <tdll\htchar.h>
|
|
#include <tdll\assert.h>
|
|
|
|
#include "emu.h"
|
|
#include "emu.hh"
|
|
#include "emuid.h"
|
|
#include "emudec.hh"
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
|
* vt52PrintCommands
|
|
*
|
|
* DESCRIPTION:
|
|
* Processes vt52 printing commands.
|
|
*
|
|
* ARGUMENTS:
|
|
* none
|
|
*
|
|
* RETURNS:
|
|
* nothing
|
|
*/
|
|
void vt52PrintCommands(const HHEMU hhEmu)
|
|
{
|
|
int line;
|
|
ECHAR code;
|
|
ECHAR aechBuf[10];
|
|
|
|
code = hhEmu->emu_code;
|
|
switch (code)
|
|
{
|
|
case ETEXT('^'): /* auto print on */
|
|
hhEmu->print_echo = TRUE;
|
|
break;
|
|
|
|
case ETEXT('_'): /* auto print off */
|
|
hhEmu->print_echo = FALSE;
|
|
break;
|
|
|
|
case ETEXT(']'): /* print screen */
|
|
for (line = 0; line < 24; ++line)
|
|
printEchoLine(hhEmu->hPrintHost,
|
|
hhEmu->emu_apText[row_index(hhEmu, line)],
|
|
emuRowLen(hhEmu, row_index(hhEmu, line)));
|
|
|
|
CnvrtMBCStoECHAR(aechBuf, sizeof(aechBuf), TEXT("0x0C"),
|
|
StrCharGetByteCount(TEXT("0x0C")));
|
|
printEchoLine(hhEmu->hPrintHost, aechBuf, sizeof(ECHAR));
|
|
break;
|
|
|
|
case ETEXT('V'): /* print cursor line */
|
|
printEchoLine(hhEmu->hPrintHost,
|
|
hhEmu->emu_apText[row_index(hhEmu, hhEmu->emu_currow)],
|
|
emuRowLen(hhEmu, row_index(hhEmu, hhEmu->emu_currow)));
|
|
break;
|
|
|
|
case ETEXT('W'): /* enter printer controller mode */
|
|
hhEmu->state = 4; /* start vt52_prnc() */
|
|
break;
|
|
|
|
case ETEXT('X'): /* exit printer controller mode */
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
|
* vt52Print
|
|
*
|
|
* DESCRIPTION:
|
|
* Stores character and prints saved string of characters when termination
|
|
* character is received.
|
|
*
|
|
* ARGUMENTS:
|
|
* none
|
|
*
|
|
* RETURNS:
|
|
* nothing
|
|
*/
|
|
void vt52Print(const HHEMU hhEmu)
|
|
{
|
|
const PSTDECPRIVATE pstPRI = (PSTDECPRIVATE)hhEmu->pvPrivate;
|
|
|
|
ECHAR ccode;
|
|
|
|
ccode = hhEmu->emu_code;
|
|
*pstPRI->pntr++ = ccode;
|
|
*pstPRI->pntr = 0;
|
|
++pstPRI->len_s;
|
|
|
|
if (pstPRI->len_s >= pstPRI->len_t &&
|
|
memcmp(pstPRI->terminate,
|
|
&pstPRI->storage[pstPRI->len_s - pstPRI->len_t],
|
|
sizeof(pstPRI->terminate)) == 0)
|
|
{
|
|
/* received termination string, wrap it up */
|
|
emuPrintChars(hhEmu, pstPRI->storage, pstPRI->len_s - pstPRI->len_t);
|
|
pstPRI->pntr = pstPRI->storage;
|
|
pstPRI->len_s = 0;
|
|
hhEmu->state = 0; /* drop out of this routine */
|
|
|
|
// Finish-up print job.
|
|
//
|
|
printEchoClose(hhEmu->hPrintHost);
|
|
return;
|
|
}
|
|
|
|
/* haven't received termination sequence yet, is storage filled? */
|
|
if ((unsigned)pstPRI->len_s >= (sizeof(pstPRI->storage) - 1))
|
|
{
|
|
/* copy most of string to print buffer */
|
|
emuPrintChars(hhEmu, pstPRI->storage, pstPRI->len_s - pstPRI->len_t);
|
|
|
|
/* move end of string to beginning of storage */
|
|
memmove(pstPRI->storage,
|
|
&pstPRI->storage[pstPRI->len_s - pstPRI->len_t],
|
|
(unsigned)pstPRI->len_t);
|
|
|
|
pstPRI->pntr = pstPRI->storage + pstPRI->len_t;
|
|
pstPRI->len_s = pstPRI->len_t;
|
|
}
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
|
* vt52_id
|
|
*
|
|
* DESCRIPTION:
|
|
* Transmits the VT52 id code--ESC/Z.
|
|
*
|
|
* ARGUMENTS:
|
|
* none
|
|
*
|
|
* RETURNS:
|
|
* nothing
|
|
*/
|
|
void vt52_id(const HHEMU hhEmu)
|
|
{
|
|
TCHAR *sp;
|
|
ECHAR ech[10];
|
|
|
|
sp = TEXT("\033/Z");
|
|
CnvrtMBCStoECHAR(ech, sizeof(ech), TEXT("\033/Z"),
|
|
StrCharGetByteCount(TEXT("\033/Z")));
|
|
emuSendString(hhEmu, ech, (int)StrCharGetStrLength(sp));
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
|
* vt52_CUP
|
|
*
|
|
* DESCRIPTION:
|
|
* Positions the cursor for the VT52 emulator.
|
|
*
|
|
* ARGUMENTS:
|
|
* none
|
|
*
|
|
* RETURNS:
|
|
* nothing
|
|
*/
|
|
void vt52_CUP(const HHEMU hhEmu)
|
|
{
|
|
char_pn(hhEmu);
|
|
(*hhEmu->emu_setcurpos)(hhEmu,
|
|
hhEmu->num_param[0] - 1,
|
|
hhEmu->num_param[1] - 1);
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
|
* vt52_kbdin
|
|
*
|
|
* DESCRIPTION:
|
|
* Processes local keyboard keys for the VT52 emulator.
|
|
*
|
|
* ARGUMENTS:
|
|
* key -- key to process
|
|
* fTest -- if TRUE, just checks if it is an emulator key.
|
|
*
|
|
* RETURNS:
|
|
* nothing
|
|
*/
|
|
int vt52_kbdin(const HHEMU hhEmu, int key, const int fTest)
|
|
{
|
|
int index;
|
|
/* -------------- Check Backspace & Delete keys ------------- */
|
|
|
|
if (hhEmu->stUserSettings.fReverseDelBk && ((key == VK_BACKSPACE) ||
|
|
(key == DELETE_KEY) || (key == DELETE_KEY_EXT)))
|
|
{
|
|
key = (key == VK_BACKSPACE) ? DELETE_KEY : VK_BACKSPACE;
|
|
}
|
|
|
|
/* -------------- Mapped PF1-PF4 keys ------------- */
|
|
|
|
if (hhEmu->stUserSettings.fMapPFkeys &&
|
|
(index = emuKbdKeyLookup(hhEmu, key, &hhEmu->stEmuKeyTbl3)) != -1)
|
|
{
|
|
if (!fTest)
|
|
emuSendKeyString(hhEmu, index, &hhEmu->stEmuKeyTbl3);
|
|
}
|
|
|
|
/* -------------- Keypad Application mode ------------- */
|
|
|
|
else if (hhEmu->mode_DECKPAM &&
|
|
(index = emuKbdKeyLookup(hhEmu, key, &hhEmu->stEmuKeyTbl2)) != -1)
|
|
{
|
|
if (!fTest)
|
|
emuSendKeyString(hhEmu, index, &hhEmu->stEmuKeyTbl2);
|
|
}
|
|
|
|
/* -------------- Normal mode keys ------------- */
|
|
|
|
else if ((index = emuKbdKeyLookup(hhEmu, key, &hhEmu->stEmuKeyTbl)) != -1)
|
|
{
|
|
if (!fTest)
|
|
emuSendKeyString(hhEmu, index, &hhEmu->stEmuKeyTbl);
|
|
}
|
|
|
|
else
|
|
{
|
|
index = std_kbdin(hhEmu, key, fTest);
|
|
}
|
|
|
|
return index;
|
|
}
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
|
* emuVT52Unload
|
|
*
|
|
* DESCRIPTION:
|
|
* Unloads current emulator by freeing used memory.
|
|
*
|
|
* ARGUMENTS:
|
|
* none
|
|
*
|
|
* RETURNS:
|
|
* nothing
|
|
*/
|
|
void emuVT52Unload(const HHEMU hhEmu)
|
|
{
|
|
assert(hhEmu);
|
|
|
|
if (hhEmu->pvPrivate)
|
|
{
|
|
free(hhEmu->pvPrivate);
|
|
hhEmu->pvPrivate = 0;
|
|
}
|
|
|
|
//
|
|
// Make sure to free the key tables that were created when the emulator
|
|
// was loaded, otherwise there is a memory leak. REV: 05/09/2001
|
|
//
|
|
emuKeyTableFree(&hhEmu->stEmuKeyTbl);
|
|
emuKeyTableFree(&hhEmu->stEmuKeyTbl2);
|
|
emuKeyTableFree(&hhEmu->stEmuKeyTbl3);
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
/* end of vt52.c */
|