OpenVMS Source Code Demos

VT340_DEMO

//==============================================================================================================================
// title  : vt340_demo_101.c
// author : Neil Rieck  ( https://neilrieck.net/ )
// created: 2015-04-19
// purpose: to demo old "school i/o" to a vt-terminal
// to-do  : 1) write a routine to capture answer-back responses and palette queries (should be easy with sys$qio)
//          2) finish palette demos
//	    3) write a routine to cycle through xterm colors (would only work with emulators)
// ver who when   what
// --- --- ------ --------------------------------------------------------------------------------------------------------------
// 100 NSR 150419 original effort
//     NSR 150425 experiments with colored text
//     NSR 150426 testing with three emulators (Reflection for OpenVMS, Tera Term, PuTTY)
// 101 NSR 150427 added code to loop through colors using ANSI escapes
//     NSR 150502 added code to test advanced-video options
//		  finally got around to fixing a few bugs (this is still a work in progress)
//==============================================================================================================================
// Notes:
// 1. The "c" version of this software was only tested with terminal emulators, not real hardware
// 2. when testing with "Reflection For UNIX and OpenVMS" version 14.1
//	your TermType must be emulating VT102 or VT500-7
//		Setup-menu/Terminal-item/Terminal-Type-tab/Terminal-Type-radio-button
//	"Use ANSI Color" must be "ON"
//		Setup-menu/Terminal-item/Emulation-tab/Use-Ansi-Color-checkbox
//	you may need to lie about "Terminal ID" since older VMS + UNIX systems do not know about VT500
//		Setup-menu/Terminal-item/Emulation-tab/Terminal-ID-drop-down
// 3. when testing with "Tera Term" version 4.86
//	"Use ANSI Color" must be "ON"
//		Setup-menu/Additional-settings-item/Visual-tab/Enable-ANSI-Color-checkbox
//	"Terminal ID" is set in two places:
//		Setup-menu/Terminal-item/Terminal-ID-dropdown	(select whatever your OS understands; start with VT100)
//		Setup-menu/TCPIP-item/Term-Type-textbox		(enter xterm or ANSI)
// 4. TCP Stacks are supposed to fetch the terminal type from the client then set the terminal driver accordingly. Not all
//    VMS or OpenVMS stacks do this so make sure you execute "set term/inq" in your personal "login.com" script or in the
//    interactive section of the system-wide script "sys$manager:sylogin.com"
// 5. This demo includes experiments with colored text. This has nothing to do with ReGIS or Sixel Graphics
//	https://en.wikipedia.org/wiki/Sixel
//	https://en.wikipedia.org/wiki/ReGIS
//==============================================================================================================================
//
//	optional stuff for OpenVMS
//
#if defined(VMS)								// for VMS and OpenVMS only
#define __NEW_STARLET	1							// enable strict for OpenVMS Alpha 7.0 and later
#include <starlet.h>								// OpenVMS stuff
#include <lib$routines.h>							// defines functions like: lib$wait
#include <libwaitdef.h>								// defines constants like: lib$k_vax_f
#endif
//
//	includes for every implementation
//
#include <stdio.h>								//
#include "dec_device_controls.c"						// VT + LA device control codes
//
//	forward declarations
//
void nsr_delay(float);								//
void vt_positioning_tests();							//
void vt_adv_vid_tests();							//
void vt_color_tests();								//
//
//	macros (executable image will be slightly larger while faster)
//
#define	cursor_goto(y,x)			\
	printf("%s%d;%dH",CSI,y,x);
//
#define reset_video_w_eol			\
	printf("%s\n",VT$Normal);
//
#define reset_video				\
	printf(VT$Normal);
//
//==============================================================================
//
//	main()	"the big kahuna"
//
//==============================================================================
void main() {
	//
	vt_positioning_tests();
	nsr_delay(2.0);
	//
	vt_adv_vid_tests();
	nsr_delay(2.0);
	//
	vt_color_tests();
	nsr_delay(2.0);
	//
	printf("\n-i-exiting program\n");
}

//==============================================================================
//	vt_positioning_tests
//
// notes: if this test fails for any emulator connected to VMS/OpenVMS then
// make sure you have set your terminal type to VT something with either of
// these two DCL commands:
//	$set term/device=vt200
//	$set term/inq		(reads the emulator's "terminal id")
//==============================================================================
void vt_positioning_tests() {
	printf("\nVT Positioning Tests (Assuming you are a VT100 or higher)\n");
	printf("=========================================================\n");
	printf("with OpenVMS terminal driver set properly\n\n");
	nsr_delay(2.0);
	//
	printf("%s%s",VT$Clear,VT$Home);
	printf("just recleared the screen then homed the cursor\n");
	nsr_delay(1.0);
	//
	printf(VT$Clear);
	for (int y=1;y<20;y++) {
	    int x;
	    x = y * 2;
	    cursor_goto(y,x);
	    printf(VT$ClearLine);
	    printf("this is a test at line: %d %d",y,x);
	    nsr_delay(0.333);					// delay for 333 mS
	    //
	    //	Imagine a real-world service using sys$brkthru to place a message on this user's terminal.
	    //  He might be on an FMS form and we do not want to force him to use crtl-r to refresh his screen
	    //
	    if (x==10) {					// imagine this as real world alert
		printf(VT$SaveCursor);				// remember the current position
		printf(VT$Error);				// drop to line #24
		printf("fake alert to line #24");		//
		printf(VT$RestoreCursor);			// restore the cursor
		printf(" (line continues after fake alert)");	// this continues on line 10
	    }							//
	}							//
	printf("\n-i-exiting: vt_positioning_tests\n");
}
//==============================================================================
//	vt_adv_vid_tests
//==============================================================================
void vt_adv_vid_tests() {
	printf("\nVT Advanced Video Tests (Assuming you are a VT102 or higher)\n");
	printf("============================================================\n");
	printf("with OpenVMS terminal driver set properly\n\n");
	nsr_delay(2.0);
	//
	printf("%s%s%s\n",VT$Flash,"this should be flashing",VT$Normal);
	nsr_delay(1.0);
	//
	printf("%s%s%s\n",VT$Reverse,"this should be reverse video",VT$Normal);
	nsr_delay(1.0);
	//
	printf("%s%s%s\n",VT$Under,"this should be underlined",VT$Normal);
	nsr_delay(1.0);
	//
	printf("%s%s%s\n",VT$Bright,"this should be bright",VT$Normal);
	nsr_delay(1.0);
	//
	printf("\n-i-exiting: vt_adv_vid_tests\n");
}

//==============================================================================
//	vt_color_tests
//==============================================================================
void vt_color_tests() {
	//
	printf("\nVT Color Tests (Assuming you are a VT340 or higher)\n");
	printf("====================================================\n");
	printf("with ANSI-Colors enabled\n\n");
	nsr_delay(2.0);
	//
	printf("\nTest #1 (DEC escape codes)\n");			//
	reset_video;							//
	printf(VT$Red);							//
	printf("this is red text");					//
	reset_video_w_eol;						//
	nsr_delay(0.5);							//
	//
	printf(VT$RedOnBlue);						//
	printf("this is red on blue");					//
	reset_video_w_eol;						//
	nsr_delay(0.5);							//
	//
	//	cycle through 8 colors (or color palettes? more investigation required)
	//	using DEC escape codes
	//
	//			    +----- select foreground
	//			    |+---- color
	//	here we want:	CSI 31;46m
	//			       |+- color
	//			       +-- select background
	//
	printf("\nTest #2 (Cycle through DEC escape codes)\n");		//
	for (int i=0;i<=7;i++) {
	    printf("%s%s%d%s%d%s%d%s%d",
		CSI,	"3",			i,
			";4",			7-i,
			"m FG Color: ",		i,
			" on BG Color: ",	7-i);
	    reset_video_w_eol;
	}
	nsr_delay(0.5);							//
	//--------------------------------------------------------------
	//	playing with color palettes
	//--------------------------------------------------------------
#define set_palettes 0
#if set_palettes==1
	printf("hacking with palettes\n");
	printf(VT$SetPal7);						// just hacking
	printf(VT$SetPal8);						//
	printf(VT$SetPal9);						//
#endif
#define read_palettes 0							//
#if read_palettes==1							//
	printf("%s%s",CSI,"21;2;m");					// term will sent back colors (but I
#endif									// haven't yet written code to capture it)
	//--------------------------------------------------------------
	//	test #3		playing with DEC escapes
	//
	// note: all emulators tested appear to work with these escapes
	//--------------------------------------------------------------
	printf("\nTest #3 (DEC escape codes)\n");			//
	printf("%s%s",CSI,"41m");					//
	printf(" DEC :: this is ");					//
	printf("%s%s",CSI,"42m");					//
	printf(" a test ");						//
	reset_video_w_eol;						//
	nsr_delay(2.0);							//
	//--------------------------------------------------------------
	//	test #4		playing with ANSI escapes
	//
	// emulator	observations
	// ----------	---------------
	// reflection	all tests passed
	// Tera Term	no color displayed (was white text on black)
	// PuTTY	couldn't recover from color change (see the patch)
	//--------------------------------------------------------------
	printf("\nTest #4 (ANSI escape codes)\n");			//
	printf("%s%s",CSI,"=4F");					// red		foreground
	printf("%s%s",CSI,"=6G");					// green	background
	printf(" ANSI :: this is ");
	printf("%s%s",CSI,"=1F");					// blue		foreground
	printf("%s%s",CSI,"=5G");					// magenta	background
	printf(" a test ");						//
#define PUTTY 1
#if PUTTY==0
#then									// TeraTerm and Relection (not PuTTY)
	reset_video_w_eol;						//
#else									// TeraTerm, Relection and PuTTY
	printf(VT$Normal);						//
	printf("%s%s",CSI,"=7F");					// white	foreground
	printf("%s%s\n",CSI,"=0G");					// black	background
#endif
	nsr_delay(2.0);							//
	//--------------------------------------------------------------
	//	test #5		cycling trhough ANSI escapes
	//--------------------------------------------------------------
	printf("\nTest #5 (Cycle through ANSI escape codes)\n");	//
	//
	//
	//	cycle through 8 colors (color palettes? more investigation required)
	//	using ANSI escape codes
	//
	//			     +---- color
	//	here we want:	CSI =4F
	//			      +-- select foreground
	//
	for (int i=0;i<=7;i++) {
	    printf("%s%c%d%c",	CSI,	'=',	i,	'F');		// set foreground
	    printf("%s%c%d%c",	CSI,	'=',	7-i,	'G');		// set background
	    printf("%s%d%s%d",
		" FG Color: ",		i,
		" on BG Color: ",	7-i);
	    reset_video_w_eol;
	}
	//
	printf(VT$Normal);						//
	printf("-i-exiting: vt_color_tests\n");				//
}

//======================================================================
//	nsr_delay(float)
//======================================================================
//
#if defined(VMS)							// for VMS and OpenVMS only
//----------------------------------------------------------------------
//	this next bit of voodoo ensures we are using the correct float type on
//	various hardware platforms: VAX, Alpha, Itanium
//
#if __G_FLOAT != 0
#	define  FLOAT_TYPE  LIB$K_VAX_F
#elif __D_FLOAT != 0
#	define  FLOAT_TYPE  LIB$K_VAX_D
#elif __IEEE_FLOAT != 0
#	define  FLOAT_TYPE  LIB$K_IEEE_S
#else
#	error "Try specifying a floating point qualifier on the compile"
#endif
//
//	delay for the desired number of milliseconds
//
void nsr_delay(float fp_delay) {					//
    int rc;								//
    rc = lib$wait(&fp_delay,0,&FLOAT_TYPE);				//
}
#else									// for non-VMS systems
//
void nsr_delay(float fp_delay) {					//
    sleep(1);								//
}									//
#endif
//======================================================================