Index: vlib/acctrl.s
===================================================================
--- vlib/acctrl.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/acctrl.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,127 @@
+* ------------------------------------------------------------------------------
+* acctrl.s -- VSDD access table control functions
+* Version 6 -- 1987-04-13 -- D.N. Lynx Crowe
+* (c) Copyright 1987 -- D.N. Lynx Crowe
+* ------------------------------------------------------------------------------
+*
+*	objclr(obj)
+*	unsigned int obj;
+*
+*		Clear bits in access table for object 'obj'.
+*		Disables object 'obj'.
+*
+*	objoff(obj, line, num)
+*	unsigned int obj, line, num;
+*
+*		Disable object obj at line thru line+num.
+*
+*	objon(obj, line, num)
+*	unsigned int obj, line, num;
+*
+*		Enable object obj at line thru line+num.
+*
+*
+*	Assumes VSDD is looking at bank 0.
+*	Assumes a screen height of 350 lines.
+*	No error checks are done, so beware.
+* ------------------------------------------------------------------------------
+		.text
+*
+		.xdef	_objclr,_objoff,_objon
+*
+		.xref	_v_actab
+*
+SCSIZE		.equ	350		* Screen height
+*
+OBJ		.equ	8		* Object number argument offset
+LINE		.equ	10		* Beginning line argument offset
+NUM		.equ	12		* Object height argument offset
+* ------------------------------------------------------------------------------
+		.page
+* ------------------------------------------------------------------------------
+*
+*	objclr(obj)
+*	unsigned int obj;
+*
+*		Disables object obj in access table by turning on
+*		its bit in all words of the access table.
+* ------------------------------------------------------------------------------
+_objclr:	link	a6,#0		* Link stack frames
+		move.w	OBJ(a6),d1	* Get object bit number in d1
+		lea	_v_actab,a0	* Get base of object table in a0
+		move.w	#SCSIZE-1,d2	* Put line count in d2
+*
+objclr1:	move.w	(a0),d0		* Get access table word
+		bset.l	d1,d0		* Set the bit
+		move.w	d0,(a0)+	* Update word in access table
+		dbf	d2,objclr1	* Loop until done
+*
+		unlk	a6		* Unlink stack frame
+		rts			* Return to caller
+*
+		.page
+* ------------------------------------------------------------------------------
+*	objoff(obj, line, num)
+*	unsigned int obj, line, num;
+*
+*		Turn on access table bits for object 'obj' at
+*		lines 'line' through 'line'+'num'.  Disables the object.
+*		Assumes object bits were set at those locations.
+* ------------------------------------------------------------------------------
+_objoff:	link	a6,#0		* Link stack frames
+		move.w	OBJ(a6),d1	* Get object bit number into d1
+		move.w	LINE(a6),d2	* Get top line number
+		add.w	d2,d2		* Convert to word offset
+		lea	_v_actab,a0	* Get base address of access table
+		move.w	0(a0,d2),d0	* Get top line access word
+		bset.l	d1,d0		* Set object bit
+		move.w	d0,0(a0,d2)	* Update word in access table
+		tst.w	NUM(a6)		* Number of lines = 0 ?
+		beq	objoff1		* Done if so
+*
+		move.w	NUM(a6),d2	* Get object depth
+		add.w	LINE(a6),d2	* Add to top line number
+		cmpi.w	#SCSIZE,d2	* Bottom line >= screen height ?
+		bge	objoff1		* Done if so
+*
+		add.w	d2,d2		* Convert to word offset
+		move.w	0(a0,d2),d0	* Get bottom line access word
+		bset.l	d1,d0		* Set object bit
+		move.w	d0,0(a0,d2)	* Update word in access table
+*
+objoff1:	unlk	a6		* Unlink stack frame
+		rts			* Return to caller
+*
+		.page
+* ------------------------------------------------------------------------------
+*	objon(obj, line, num)
+*	unsigned int obj, line, num;
+*
+*		Turn off access table bits for object 'obj'
+*		at 'line' thru 'line'+'num'.  Enables the object.
+* ------------------------------------------------------------------------------
+_objon:		link	a6,#0		* Link stack frames
+		move.w	OBJ(a6),d1	* Get object bit number into d1
+		move.w	LINE(a6),d2	* Get top line number
+		add.w	d2,d2		* Convert to word offset
+		lea	_v_actab,a0	* Get base address of access table
+		move.w	0(a0,d2),d0	* Get top line access word
+		bclr.l	d1,d0		* Clear object bit
+		move.w	d0,0(a0,d2)	* Update word in access table
+		tst.w	NUM(a6)		* Number of lines = 0 ?
+		beq	objon1		* Done if so
+*
+		move.w	NUM(a6),d2	* Get object depth
+		add.w	LINE(a6),d2	* Add top line number
+		cmpi.w	#SCSIZE,d2	* Bottom line >= screen height ?
+		bge	objon1		* Done if so
+*
+		add.w	d2,d2		* Convert to word offset
+		move.w	0(a0,d2),d0	* Get bottom line access word
+		bclr.l	d1,d0		* Clear object bit
+		move.w	d0,0(a0,d2)	* Update word in access table
+*
+objon1:		unlk	a6		* Unlink stack frame
+		rts			* Return to caller
+*
+		.end
Index: vlib/cg2.c
===================================================================
--- vlib/cg2.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/cg2.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,426 @@
+/* Character generator table -- 12V by 8H */
+
+int	cg_rows = 12;
+
+int	cgtable[12][256] = {
+
+	{	/* Scan line 0 */
+	 0x0000, 0x007E, 0x007E, 0x007E, 0x007E, 0x007E, 0x007E, 0x007E, 
+	 0x007E, 0x007E, 0x007E, 0x007E, 0x007E, 0x0088, 0x006E, 0x000E, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 
+	 0x0020, 0x0004, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0004, 0x0040, 0x0000, 0x0002, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0078, 0x0000, 0x001E, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x003C, 
+	 0x0000, 0x0000, 0x001C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0002, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0006, 0x0000, 0x0030, 0x0010, 0x000C, 0x0000, 0x0000, 
+	 0x0050, 0x003A, 0x00A9, 0x008B, 0x0000, 0x0000, 0x00E2, 0x00EE, 
+	 0x00DC, 0x005D, 0x0049, 0x0097, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x00EE, 0x00AE, 0x00EE, 0x0000, 0x0040, 0x00EA, 0x00EE, 
+	 0x0000, 0x00E2, 0x00AE, 0x00E4, 0x0000, 0x0094, 0x00E0, 0x004E, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0004, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0024, 0x0000, 0x0024, 0x0000, 0x0024, 0x0000, 0x0024, 0x0024, 
+	 0x0000, 0x0000, 0x0024, 0x0024, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+	},
+
+	{	/* Scan line 1 */
+	 0x0000, 0x0000, 0x007E, 0x007E, 0x007E, 0x007E, 0x007E, 0x007E, 
+	 0x007E, 0x007E, 0x007E, 0x007E, 0x007E, 0x0088, 0x00AA, 0x0002, 
+	 0x0018, 0x007E, 0x007E, 0x003C, 0x0060, 0x003C, 0x003C, 0x000C, 
+	 0x003C, 0x001C, 0x0000, 0x0000, 0x0073, 0x0066, 0x00FB, 0x0000, 
+	 0x0000, 0x0010, 0x0000, 0x0000, 0x007C, 0x0040, 0x00BC, 0x0000, 
+	 0x0010, 0x0008, 0x0010, 0x0000, 0x0008, 0x0000, 0x0018, 0x0000, 
+	 0x0018, 0x007C, 0x007E, 0x003C, 0x0020, 0x003C, 0x003C, 0x0004, 
+	 0x003C, 0x001C, 0x0000, 0x0008, 0x0020, 0x0000, 0x0004, 0x0008, 
+	 0x0078, 0x0042, 0x003E, 0x003C, 0x003E, 0x007E, 0x0004, 0x003C, 
+	 0x0042, 0x007C, 0x001C, 0x0082, 0x007E, 0x0082, 0x0042, 0x003C, 
+	 0x0002, 0x005C, 0x0042, 0x003C, 0x0038, 0x003C, 0x0010, 0x0044, 
+	 0x00C6, 0x0038, 0x007E, 0x0008, 0x0000, 0x0010, 0x0000, 0x00FE, 
+	 0x0000, 0x00BC, 0x001A, 0x0038, 0x0058, 0x0038, 0x0008, 0x0042, 
+	 0x0042, 0x0038, 0x0022, 0x0042, 0x0038, 0x0092, 0x0042, 0x0018, 
+	 0x0002, 0x0040, 0x0002, 0x0038, 0x0030, 0x0058, 0x0010, 0x006C, 
+	 0x0082, 0x0008, 0x007C, 0x0008, 0x0010, 0x0010, 0x0000, 0x003C, 
+	 0x0050, 0x0022, 0x00A9, 0x008A, 0x0000, 0x0000, 0x00A2, 0x0028, 
+	 0x0044, 0x0045, 0x0049, 0x0095, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x00A8, 0x00AA, 0x0022, 0x0000, 0x00A0, 0x002A, 0x002A, 
+	 0x0000, 0x00A2, 0x00A2, 0x0024, 0x0000, 0x0094, 0x00A2, 0x004A, 
+	 0x00E0, 0x00E0, 0x00C0, 0x00C0, 0x00DF, 0x0000, 0x00DF, 0x0000, 
+	 0x0024, 0x000C, 0x0010, 0x0010, 0x0022, 0x00EE, 0x00FA, 0x0000, 
+	 0x0024, 0x0000, 0x0024, 0x0000, 0x0024, 0x0000, 0x0024, 0x0024, 
+	 0x0000, 0x0000, 0x0024, 0x0024, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x000C, 0x000E, 0x001E, 0x000C, 0x0008, 0x000C, 0x000C, 0x0002, 
+	 0x000C, 0x000C, 0x0032, 0x0077, 0x00F7, 0x0000, 0x0000, 0x0000, 
+	 0x0030, 0x0070, 0x0078, 0x0030, 0x0076, 0x007B, 0x0033, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+	},
+
+	{	/* Scan line 2 */
+	 0x0000, 0x0000, 0x0000, 0x007E, 0x007E, 0x007E, 0x007E, 0x007E, 
+	 0x007E, 0x007E, 0x007E, 0x007E, 0x007E, 0x00A8, 0x00AA, 0x0006, 
+	 0x003C, 0x007E, 0x007E, 0x007E, 0x0060, 0x007E, 0x007E, 0x000C, 
+	 0x007E, 0x003C, 0x0000, 0x0000, 0x00FB, 0x0066, 0x00FB, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0028, 0x0092, 0x00A2, 0x0042, 0x0000, 
+	 0x0010, 0x0008, 0x0092, 0x0010, 0x0018, 0x0000, 0x0018, 0x0002, 
+	 0x0024, 0x0010, 0x0042, 0x0042, 0x0020, 0x0042, 0x0042, 0x0004, 
+	 0x0042, 0x0020, 0x0018, 0x0018, 0x0010, 0x0000, 0x0008, 0x0000, 
+	 0x0004, 0x0042, 0x0044, 0x0042, 0x0044, 0x0044, 0x0004, 0x0042, 
+	 0x0042, 0x0010, 0x0022, 0x0042, 0x0042, 0x0082, 0x0062, 0x0042, 
+	 0x0002, 0x0022, 0x0022, 0x0042, 0x0010, 0x0042, 0x0010, 0x00C6, 
+	 0x0044, 0x0010, 0x0042, 0x0008, 0x0080, 0x0010, 0x0000, 0x0000, 
+	 0x0000, 0x0042, 0x0026, 0x0044, 0x0064, 0x0044, 0x0008, 0x0058, 
+	 0x0042, 0x0010, 0x0022, 0x0022, 0x0010, 0x0092, 0x0042, 0x0024, 
+	 0x001A, 0x0058, 0x0002, 0x0044, 0x0048, 0x0064, 0x0028, 0x0092, 
+	 0x0044, 0x0010, 0x0004, 0x0008, 0x0010, 0x0010, 0x0000, 0x0042, 
+	 0x0050, 0x003B, 0x0099, 0x00AA, 0x0000, 0x0000, 0x00AE, 0x006E, 
+	 0x0044, 0x00C5, 0x0049, 0x00D5, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x00AE, 0x006A, 0x0062, 0x0000, 0x00A0, 0x002E, 0x006A, 
+	 0x0000, 0x00AE, 0x00E2, 0x0064, 0x0000, 0x00D4, 0x00A4, 0x004A, 
+	 0x0040, 0x0040, 0x00C0, 0x00C0, 0x00C4, 0x0000, 0x00DF, 0x0000, 
+	 0x0026, 0x0014, 0x0038, 0x0010, 0x0052, 0x0044, 0x000A, 0x0000, 
+	 0x0024, 0x0000, 0x0066, 0x0000, 0x0026, 0x0000, 0x0064, 0x0066, 
+	 0x0000, 0x0000, 0x0064, 0x0026, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0012, 0x0004, 0x0002, 0x0012, 0x0008, 0x0012, 0x0012, 0x0002, 
+	 0x0012, 0x0010, 0x004A, 0x0022, 0x0012, 0x0000, 0x0000, 0x0000, 
+	 0x0048, 0x0020, 0x0008, 0x0048, 0x0026, 0x000B, 0x004B, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+	},
+
+	{	/* Scan line 3 */
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x007E, 0x007E, 0x007E, 0x007E, 
+	 0x007E, 0x007E, 0x007E, 0x007E, 0x007E, 0x00D8, 0x00AA, 0x0002, 
+	 0x007E, 0x0018, 0x0066, 0x0066, 0x0060, 0x0066, 0x0066, 0x0018, 
+	 0x0066, 0x0070, 0x0000, 0x0018, 0x00DB, 0x0066, 0x001B, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0028, 0x0090, 0x0044, 0x00A2, 0x0000, 
+	 0x0008, 0x0010, 0x0054, 0x0010, 0x0018, 0x0000, 0x0000, 0x0004, 
+	 0x0042, 0x0010, 0x0002, 0x0040, 0x0020, 0x0040, 0x0042, 0x0008, 
+	 0x0042, 0x0040, 0x0018, 0x0018, 0x0008, 0x0000, 0x0010, 0x0008, 
+	 0x0032, 0x0042, 0x0044, 0x0002, 0x0044, 0x0004, 0x0004, 0x0042, 
+	 0x0042, 0x0010, 0x0022, 0x0022, 0x0002, 0x0082, 0x0062, 0x0042, 
+	 0x0002, 0x0052, 0x0012, 0x0040, 0x0010, 0x0042, 0x0028, 0x00AA, 
+	 0x0028, 0x0010, 0x0004, 0x0008, 0x0040, 0x0010, 0x0000, 0x0000, 
+	 0x0000, 0x0042, 0x0042, 0x0002, 0x0042, 0x0002, 0x0008, 0x0064, 
+	 0x0042, 0x0010, 0x0020, 0x0016, 0x0010, 0x0092, 0x0042, 0x0042, 
+	 0x0026, 0x0064, 0x0002, 0x0040, 0x0008, 0x0042, 0x0028, 0x0092, 
+	 0x0028, 0x0028, 0x0008, 0x0008, 0x0010, 0x0010, 0x0000, 0x0099, 
+	 0x00D0, 0x000A, 0x00A9, 0x00DA, 0x0000, 0x0000, 0x00AA, 0x0022, 
+	 0x0044, 0x0045, 0x0049, 0x00B5, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x00A2, 0x00AA, 0x0022, 0x0000, 0x00A0, 0x002A, 0x002A, 
+	 0x0000, 0x00AA, 0x00A2, 0x0024, 0x0000, 0x00B4, 0x00A8, 0x004A, 
+	 0x0044, 0x0040, 0x00CC, 0x00C0, 0x0004, 0x0000, 0x000C, 0x0000, 
+	 0x003C, 0x0024, 0x007C, 0x0010, 0x008A, 0x0044, 0x000A, 0x0000, 
+	 0x0024, 0x0000, 0x00C3, 0x0000, 0x0023, 0x0000, 0x00C4, 0x00C3, 
+	 0x0000, 0x0000, 0x00C4, 0x0023, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0012, 0x0004, 0x0002, 0x0010, 0x0008, 0x0010, 0x0012, 0x0004, 
+	 0x0012, 0x0010, 0x004A, 0x0022, 0x0022, 0x0000, 0x0000, 0x0000, 
+	 0x0048, 0x0020, 0x0008, 0x0040, 0x0020, 0x0008, 0x0040, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+	},
+
+	{	/* Scan line 4 */
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x007E, 0x007E, 0x007E, 
+	 0x007E, 0x007E, 0x007E, 0x007E, 0x007E, 0x0088, 0x006E, 0x000E, 
+	 0x0066, 0x0018, 0x0006, 0x0060, 0x00FE, 0x0060, 0x0066, 0x0018, 
+	 0x0066, 0x0060, 0x0000, 0x0018, 0x00DB, 0x0066, 0x0033, 0x0000, 
+	 0x0000, 0x0010, 0x0000, 0x00FE, 0x0090, 0x0008, 0x0014, 0x0000, 
+	 0x0008, 0x0010, 0x0038, 0x0010, 0x0000, 0x0000, 0x0000, 0x0008, 
+	 0x0042, 0x0010, 0x0004, 0x0040, 0x0020, 0x0040, 0x0042, 0x0008, 
+	 0x0042, 0x0040, 0x0000, 0x0000, 0x0004, 0x003C, 0x0020, 0x0008, 
+	 0x004A, 0x007E, 0x0044, 0x0002, 0x0044, 0x0004, 0x0004, 0x0042, 
+	 0x0042, 0x0010, 0x0020, 0x0012, 0x0002, 0x0092, 0x0052, 0x0042, 
+	 0x0002, 0x0042, 0x000A, 0x0040, 0x0010, 0x0042, 0x0028, 0x00AA, 
+	 0x0028, 0x0010, 0x0004, 0x0008, 0x0020, 0x0010, 0x0000, 0x0000, 
+	 0x0000, 0x004C, 0x0042, 0x0002, 0x0042, 0x003E, 0x0008, 0x0042, 
+	 0x0042, 0x0010, 0x0020, 0x000A, 0x0010, 0x0092, 0x0042, 0x0042, 
+	 0x0042, 0x0042, 0x0002, 0x0038, 0x0008, 0x0042, 0x0044, 0x0092, 
+	 0x0010, 0x0024, 0x0010, 0x0008, 0x0010, 0x0010, 0x0060, 0x00A5, 
+	 0x0050, 0x00BA, 0x00BB, 0x008A, 0x0000, 0x0000, 0x00EE, 0x00EE, 
+	 0x00C4, 0x009D, 0x005C, 0x0097, 0x0072, 0x0077, 0x0097, 0x0008, 
+	 0x0000, 0x00EE, 0x00EA, 0x00EE, 0x0000, 0x00A0, 0x0024, 0x00EA, 
+	 0x0000, 0x00EE, 0x0042, 0x00EE, 0x0000, 0x0094, 0x00E0, 0x00EA, 
+	 0x0044, 0x0040, 0x00DE, 0x00DF, 0x0004, 0x0000, 0x000C, 0x0000, 
+	 0x0064, 0x0044, 0x0092, 0x0010, 0x008A, 0x0044, 0x0012, 0x0000, 
+	 0x0024, 0x00FF, 0x0081, 0x0000, 0x0021, 0x00FF, 0x0084, 0x0081, 
+	 0x0007, 0x00E0, 0x008C, 0x0031, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0012, 0x0004, 0x0004, 0x0010, 0x001F, 0x0010, 0x0012, 0x0004, 
+	 0x0012, 0x001C, 0x004A, 0x0022, 0x0042, 0x0000, 0x0000, 0x0000, 
+	 0x0048, 0x0020, 0x0010, 0x0040, 0x0020, 0x0010, 0x0040, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+	},
+
+	{	/* Scan line 5 */
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x007E, 0x007E, 
+	 0x007E, 0x007E, 0x007E, 0x007E, 0x007E, 0x0000, 0x0000, 0x0000, 
+	 0x0066, 0x0018, 0x000C, 0x0038, 0x00FE, 0x007E, 0x007E, 0x0030, 
+	 0x003C, 0x007C, 0x007C, 0x007E, 0x00DB, 0x0066, 0x0063, 0x0000, 
+	 0x0000, 0x0010, 0x0000, 0x0028, 0x007C, 0x0010, 0x0008, 0x0000, 
+	 0x0008, 0x0010, 0x00FE, 0x00FE, 0x0000, 0x007C, 0x0000, 0x0010, 
+	 0x0042, 0x0010, 0x0008, 0x0040, 0x00FE, 0x0040, 0x0046, 0x0010, 
+	 0x0042, 0x007C, 0x0000, 0x0000, 0x0002, 0x0000, 0x0040, 0x0010, 
+	 0x009A, 0x0042, 0x0044, 0x0002, 0x0044, 0x0004, 0x0004, 0x0072, 
+	 0x0042, 0x0010, 0x0020, 0x000A, 0x0002, 0x0092, 0x0052, 0x0042, 
+	 0x003E, 0x0042, 0x003E, 0x0040, 0x0010, 0x0042, 0x0044, 0x0092, 
+	 0x0010, 0x0010, 0x0008, 0x0008, 0x0010, 0x0010, 0x0000, 0x0000, 
+	 0x0000, 0x0070, 0x0042, 0x0002, 0x0042, 0x0042, 0x003C, 0x0042, 
+	 0x0042, 0x0010, 0x0020, 0x0012, 0x0010, 0x0092, 0x0042, 0x0042, 
+	 0x0042, 0x0042, 0x0006, 0x0004, 0x0008, 0x0042, 0x0044, 0x0092, 
+	 0x0028, 0x0044, 0x0020, 0x0004, 0x0000, 0x0020, 0x0092, 0x0085, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0015, 0x0051, 0x0091, 0x0008, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x005F, 0x005F, 0x00DE, 0x00DF, 0x0004, 0x0000, 0x000C, 0x0000, 
+	 0x0024, 0x004C, 0x0010, 0x0010, 0x008A, 0x0044, 0x0022, 0x0000, 
+	 0x0024, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0004, 0x0000, 
+	 0x000C, 0x0030, 0x0018, 0x0018, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0012, 0x0004, 0x0008, 0x000C, 0x0009, 0x000E, 0x000E, 0x0008, 
+	 0x000C, 0x0012, 0x004A, 0x0022, 0x0082, 0x0000, 0x0000, 0x0000, 
+	 0x0048, 0x0020, 0x0020, 0x0030, 0x0020, 0x0020, 0x0038, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+	},
+
+	{	/* Scan line 6 */
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x007E, 
+	 0x007E, 0x007E, 0x007E, 0x007E, 0x007E, 0x00A8, 0x003B, 0x0000, 
+	 0x0066, 0x0018, 0x0018, 0x0038, 0x0066, 0x003E, 0x003E, 0x0030, 
+	 0x003C, 0x007E, 0x007C, 0x007E, 0x00DB, 0x0066, 0x00C3, 0x0000, 
+	 0x0000, 0x0010, 0x0000, 0x0028, 0x0012, 0x0020, 0x0014, 0x0000, 
+	 0x0008, 0x0010, 0x0038, 0x0010, 0x0000, 0x0000, 0x0000, 0x0020, 
+	 0x0042, 0x0010, 0x0010, 0x0038, 0x0022, 0x003E, 0x003A, 0x0010, 
+	 0x003C, 0x0042, 0x0018, 0x0018, 0x0004, 0x003C, 0x0020, 0x0020, 
+	 0x00AA, 0x0042, 0x003C, 0x0002, 0x0044, 0x001C, 0x001C, 0x0002, 
+	 0x007E, 0x0010, 0x0020, 0x0006, 0x0002, 0x00AA, 0x004A, 0x0042, 
+	 0x0042, 0x0042, 0x0042, 0x003C, 0x0010, 0x0042, 0x0044, 0x0092, 
+	 0x0010, 0x0028, 0x0010, 0x0008, 0x0008, 0x0010, 0x0082, 0x0000, 
+	 0x0000, 0x0042, 0x0026, 0x0044, 0x0064, 0x0044, 0x0008, 0x0024, 
+	 0x0026, 0x0010, 0x0020, 0x0022, 0x0010, 0x0092, 0x0026, 0x0024, 
+	 0x0026, 0x0064, 0x004A, 0x0044, 0x0008, 0x0042, 0x0082, 0x0082, 
+	 0x0044, 0x0042, 0x0040, 0x0008, 0x0010, 0x0010, 0x000C, 0x0085, 
+	 0x00AF, 0x00EE, 0x0002, 0x0000, 0x0052, 0x0095, 0x000E, 0x0000, 
+	 0x0023, 0x00A9, 0x00A2, 0x000E, 0x0035, 0x0051, 0x0091, 0x0014, 
+	 0x0095, 0x00EA, 0x00EE, 0x0001, 0x0075, 0x0077, 0x0027, 0x0009, 
+	 0x0025, 0x00B9, 0x0002, 0x0000, 0x0071, 0x00E9, 0x000A, 0x0000, 
+	 0x0044, 0x0040, 0x00CC, 0x00C0, 0x0004, 0x0000, 0x000C, 0x0000, 
+	 0x0026, 0x0034, 0x0010, 0x0010, 0x008A, 0x0044, 0x0042, 0x0000, 
+	 0x0024, 0x0000, 0x0000, 0x00FF, 0x0020, 0x0000, 0x0004, 0x0000, 
+	 0x0018, 0x0018, 0x0030, 0x000C, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0012, 0x0004, 0x0010, 0x0010, 0x000A, 0x0002, 0x0002, 0x0008, 
+	 0x0012, 0x0012, 0x004A, 0x0022, 0x0082, 0x0000, 0x0000, 0x0000, 
+	 0x0048, 0x0020, 0x0040, 0x0040, 0x0020, 0x0040, 0x0008, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+	},
+
+	{	/* Scan line 7 */
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x007E, 0x007E, 0x007E, 0x007E, 0x007E, 0x00A8, 0x0008, 0x0000, 
+	 0x0066, 0x001E, 0x0030, 0x0060, 0x006C, 0x0006, 0x0006, 0x0060, 
+	 0x0066, 0x0066, 0x0000, 0x0018, 0x00DB, 0x0066, 0x00C3, 0x0000, 
+	 0x0000, 0x0010, 0x0000, 0x00FE, 0x0012, 0x0044, 0x0022, 0x0000, 
+	 0x0008, 0x0010, 0x0054, 0x0010, 0x0000, 0x0000, 0x0000, 0x0040, 
+	 0x0042, 0x0010, 0x0020, 0x0040, 0x0024, 0x0002, 0x0002, 0x0020, 
+	 0x0042, 0x0042, 0x0018, 0x0018, 0x0008, 0x0000, 0x0010, 0x0040, 
+	 0x00AA, 0x0042, 0x0044, 0x0002, 0x0044, 0x0004, 0x0004, 0x0002, 
+	 0x0042, 0x0010, 0x0020, 0x000A, 0x0002, 0x00AA, 0x004A, 0x0042, 
+	 0x0042, 0x0042, 0x0042, 0x0002, 0x0010, 0x0042, 0x0044, 0x0082, 
+	 0x0028, 0x0044, 0x0020, 0x0008, 0x0004, 0x0010, 0x0044, 0x0000, 
+	 0x0000, 0x003C, 0x001A, 0x0038, 0x0058, 0x0038, 0x0008, 0x0018, 
+	 0x001A, 0x0018, 0x0030, 0x0042, 0x0010, 0x006E, 0x001A, 0x0018, 
+	 0x001A, 0x0058, 0x0032, 0x0038, 0x003E, 0x0042, 0x0082, 0x0082, 
+	 0x0082, 0x0042, 0x007C, 0x0008, 0x0010, 0x0010, 0x0000, 0x00A5, 
+	 0x00A9, 0x00AA, 0x0022, 0x0000, 0x0052, 0x0095, 0x0008, 0x0000, 
+	 0x0025, 0x00A9, 0x00A2, 0x0022, 0x0015, 0x0051, 0x0091, 0x0014, 
+	 0x0095, 0x002A, 0x002A, 0x0001, 0x0015, 0x0054, 0x0021, 0x0029, 
+	 0x0025, 0x0089, 0x0002, 0x0000, 0x0051, 0x0029, 0x000A, 0x0000, 
+	 0x0044, 0x0040, 0x00C0, 0x00C0, 0x0004, 0x0000, 0x000F, 0x0000, 
+	 0x003C, 0x0004, 0x0010, 0x0092, 0x008A, 0x0044, 0x0082, 0x0000, 
+	 0x0024, 0x00FF, 0x0081, 0x0000, 0x0021, 0x0081, 0x0084, 0x00FF, 
+	 0x0031, 0x008C, 0x00E0, 0x0007, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0012, 0x0006, 0x0012, 0x0012, 0x000C, 0x0002, 0x0002, 0x0010, 
+	 0x0012, 0x0012, 0x004B, 0x0033, 0x0093, 0x0000, 0x0000, 0x0000, 
+	 0x0048, 0x0030, 0x0048, 0x0048, 0x0030, 0x0048, 0x0008, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+	},
+
+	{	/* Scan line 8 */
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x007E, 0x007E, 0x007E, 0x007E, 0x0098, 0x0009, 0x0000, 
+	 0x007E, 0x001C, 0x0066, 0x0066, 0x0078, 0x0006, 0x000E, 0x0066, 
+	 0x0066, 0x0066, 0x0000, 0x0018, 0x00DB, 0x0077, 0x00DB, 0x0000, 
+	 0x0000, 0x0010, 0x0000, 0x0028, 0x0092, 0x008A, 0x0022, 0x0004, 
+	 0x0008, 0x0010, 0x0092, 0x0010, 0x0000, 0x0000, 0x0000, 0x0080, 
+	 0x0042, 0x0014, 0x0040, 0x0040, 0x0028, 0x0002, 0x0002, 0x0020, 
+	 0x0042, 0x0042, 0x0000, 0x0000, 0x0010, 0x0000, 0x0008, 0x0042, 
+	 0x0092, 0x0024, 0x0044, 0x0002, 0x0044, 0x0004, 0x0004, 0x0002, 
+	 0x0042, 0x0010, 0x0020, 0x0012, 0x0002, 0x00C6, 0x0046, 0x0042, 
+	 0x0042, 0x0042, 0x0042, 0x0002, 0x0010, 0x0042, 0x0082, 0x0082, 
+	 0x0028, 0x0044, 0x0020, 0x0008, 0x0002, 0x0010, 0x0028, 0x0000, 
+	 0x0020, 0x0000, 0x0002, 0x0000, 0x0040, 0x0000, 0x0048, 0x0000, 
+	 0x0002, 0x0000, 0x0000, 0x0002, 0x0010, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0008, 0x0010, 0x0010, 0x0000, 0x0099, 
+	 0x006D, 0x00AA, 0x004E, 0x0000, 0x0032, 0x00D7, 0x00EE, 0x0000, 
+	 0x0055, 0x00ED, 0x00AA, 0x0042, 0x0075, 0x0071, 0x00D7, 0x0015, 
+	 0x00D7, 0x002E, 0x00AA, 0x0001, 0x0033, 0x0057, 0x0021, 0x004D, 
+	 0x0035, 0x0099, 0x0039, 0x0000, 0x0057, 0x002D, 0x000E, 0x0000, 
+	 0x0040, 0x0040, 0x00E0, 0x00E0, 0x0005, 0x0000, 0x000E, 0x0000, 
+	 0x0064, 0x0004, 0x0010, 0x007C, 0x008A, 0x0044, 0x0082, 0x0000, 
+	 0x0024, 0x0000, 0x00C3, 0x0000, 0x0023, 0x00C3, 0x00C4, 0x0000, 
+	 0x0023, 0x00C4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x000C, 0x0004, 0x000C, 0x000C, 0x0008, 0x000E, 0x000C, 0x001F, 
+	 0x000C, 0x000C, 0x0032, 0x0022, 0x0062, 0x0000, 0x0000, 0x0000, 
+	 0x0030, 0x0020, 0x0030, 0x0030, 0x0020, 0x0030, 0x0038, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+	},
+
+	{	/* Scan line 9 */
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x007E, 0x007E, 0x007E, 0x00A8, 0x0008, 0x0000, 
+	 0x003C, 0x0018, 0x007E, 0x007E, 0x0070, 0x003E, 0x003C, 0x007E, 
+	 0x007E, 0x007E, 0x0000, 0x0000, 0x00FB, 0x0077, 0x00FB, 0x0000, 
+	 0x0000, 0x0010, 0x0028, 0x0028, 0x007C, 0x0004, 0x001C, 0x0008, 
+	 0x0010, 0x0008, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0024, 0x0018, 0x0042, 0x0042, 0x0030, 0x0002, 0x0004, 0x0042, 
+	 0x0042, 0x0042, 0x0000, 0x0000, 0x0020, 0x0000, 0x0004, 0x0042, 
+	 0x0044, 0x0024, 0x0044, 0x0042, 0x0044, 0x0044, 0x0044, 0x0042, 
+	 0x0042, 0x0010, 0x0020, 0x0022, 0x0002, 0x00C6, 0x0046, 0x0042, 
+	 0x0042, 0x0042, 0x0042, 0x0042, 0x0092, 0x0042, 0x0082, 0x0082, 
+	 0x0044, 0x0082, 0x0042, 0x0008, 0x0000, 0x0010, 0x0010, 0x0000, 
+	 0x0010, 0x0000, 0x0002, 0x0000, 0x0040, 0x0000, 0x0030, 0x0000, 
+	 0x0002, 0x0010, 0x0020, 0x0002, 0x0010, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0008, 0x0010, 0x0010, 0x0000, 0x0042, 
+	 0x00A1, 0x00AA, 0x008A, 0x0000, 0x0052, 0x00B5, 0x0002, 0x0000, 
+	 0x0055, 0x00AB, 0x00B6, 0x0082, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x00B5, 0x002A, 0x002A, 0x0000, 0x0015, 0x0051, 0x0021, 0x008B, 
+	 0x002D, 0x0089, 0x0002, 0x0000, 0x0055, 0x002B, 0x000A, 0x0000, 
+	 0x0060, 0x0060, 0x00E0, 0x00E0, 0x0006, 0x0000, 0x000C, 0x0000, 
+	 0x0024, 0x0004, 0x0010, 0x0038, 0x0053, 0x0066, 0x008B, 0x0000, 
+	 0x0024, 0x0000, 0x0066, 0x0000, 0x0026, 0x0066, 0x0064, 0x0000, 
+	 0x0026, 0x0064, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+	},
+
+	{	/* Scan line 10 */
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x007E, 0x007E, 0x00B8, 0x003B, 0x0000, 
+	 0x0018, 0x0010, 0x003C, 0x003C, 0x0060, 0x003E, 0x0038, 0x007E, 
+	 0x003C, 0x003C, 0x0000, 0x0000, 0x0073, 0x0066, 0x0073, 0x0000, 
+	 0x0000, 0x0010, 0x0028, 0x0000, 0x0010, 0x0000, 0x0000, 0x0018, 
+	 0x0010, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0018, 0x0010, 0x003C, 0x003C, 0x0020, 0x003E, 0x0038, 0x007E, 
+	 0x003C, 0x003C, 0x0000, 0x0000, 0x0040, 0x0000, 0x0002, 0x003C, 
+	 0x0038, 0x0018, 0x003E, 0x003C, 0x003E, 0x007E, 0x007E, 0x003C, 
+	 0x0042, 0x007C, 0x0070, 0x0042, 0x0002, 0x0082, 0x0042, 0x003C, 
+	 0x003E, 0x003C, 0x003E, 0x003C, 0x00FE, 0x0042, 0x0082, 0x0082, 
+	 0x00C6, 0x0082, 0x007E, 0x0008, 0x0000, 0x0010, 0x0000, 0x0000, 
+	 0x0018, 0x0000, 0x0002, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 
+	 0x0002, 0x0000, 0x0000, 0x0002, 0x0018, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0030, 0x0010, 0x000C, 0x0000, 0x003C, 
+	 0x00EF, 0x00AE, 0x000E, 0x0000, 0x0077, 0x0092, 0x000E, 0x0000, 
+	 0x0053, 0x0049, 0x00A2, 0x000E, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0092, 0x0024, 0x00EE, 0x0001, 0x0077, 0x0077, 0x0071, 0x0009, 
+	 0x00A5, 0x00BB, 0x0003, 0x0000, 0x0057, 0x00E9, 0x000A, 0x0000, 
+	 0x0040, 0x0040, 0x00C0, 0x00C0, 0x0004, 0x0000, 0x0008, 0x0000, 
+	 0x0020, 0x0004, 0x0010, 0x0010, 0x0022, 0x0044, 0x0072, 0x0000, 
+	 0x0024, 0x0000, 0x0024, 0x0000, 0x0024, 0x0024, 0x0024, 0x0000, 
+	 0x0024, 0x0024, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+	},
+
+	{	/* Scan line 11 */
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x007E, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0028, 0x0000, 0x0000, 0x0000, 0x0000, 0x0018, 
+	 0x0020, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0078, 0x0000, 0x001E, 0x0000, 0x0000, 
+	 0x0018, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0024, 0x0000, 0x0024, 0x0000, 0x0024, 0x0024, 0x0024, 0x0000, 
+	 0x0024, 0x0024, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+	}
+};
Index: vlib/cg3.c
===================================================================
--- vlib/cg3.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/cg3.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,498 @@
+/* VSDD character generator table cg3 */
+/* 14V by 8H */
+/* Generated:  1989-11-16  15:40:14 */
+
+/* int	cg_rows = 14; */
+
+int	cg3[14][256] = {
+
+	{	/* Scan line 0 */
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0024, 0x0000, 0x0024, 0x0000, 0x0024, 0x0000, 0x0024, 0x0024, 
+	 0x0000, 0x0000, 0x0024, 0x0024, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+	},
+
+	{	/* Scan line 1 */
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0024, 0x0000, 0x0024, 0x0000, 0x0024, 0x0000, 0x0024, 0x0024, 
+	 0x0000, 0x0000, 0x0024, 0x0024, 0x0040, 0x0000, 0x0000, 0x0008, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+	},
+
+	{	/* Scan line 2 */
+	 0x0000, 0x007E, 0x007E, 0x007E, 0x007E, 0x007E, 0x007E, 0x007E, 
+	 0x007E, 0x007E, 0x007E, 0x007E, 0x007E, 0x0088, 0x006E, 0x000E, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x0000, 
+	 0x0020, 0x0004, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0004, 0x0040, 0x0000, 0x0002, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0080, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0078, 0x0000, 0x001E, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x003C, 
+	 0x0000, 0x0000, 0x001C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0002, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0006, 0x0000, 0x0030, 0x0010, 0x000C, 0x0000, 0x0000, 
+	 0x0050, 0x003A, 0x00A9, 0x008B, 0x0000, 0x0000, 0x00E2, 0x00EE, 
+	 0x00DC, 0x005D, 0x0049, 0x0097, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x00EE, 0x00AE, 0x00EE, 0x0000, 0x0040, 0x00EA, 0x00EE, 
+	 0x0000, 0x00E2, 0x00AE, 0x00E4, 0x0000, 0x0094, 0x00E0, 0x004E, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0004, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0024, 0x0000, 0x0024, 0x0000, 0x0024, 0x0000, 0x0024, 0x0024, 
+	 0x0000, 0x0000, 0x0024, 0x0024, 0x0060, 0x0000, 0x0078, 0x001C, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+	},
+
+	{	/* Scan line 3 */
+	 0x0000, 0x0000, 0x007E, 0x007E, 0x007E, 0x007E, 0x007E, 0x007E, 
+	 0x007E, 0x007E, 0x007E, 0x007E, 0x007E, 0x0088, 0x00AA, 0x0002, 
+	 0x0018, 0x007E, 0x007E, 0x003C, 0x0060, 0x003C, 0x003C, 0x000C, 
+	 0x003C, 0x001C, 0x0000, 0x0000, 0x0073, 0x0066, 0x00FB, 0x0000, 
+	 0x0000, 0x0010, 0x0000, 0x0000, 0x007C, 0x0040, 0x00BC, 0x0000, 
+	 0x0010, 0x0008, 0x0010, 0x0000, 0x0008, 0x0000, 0x0018, 0x0000, 
+	 0x0018, 0x007C, 0x007E, 0x003C, 0x0020, 0x003C, 0x003C, 0x0004, 
+	 0x003C, 0x001C, 0x0000, 0x0008, 0x0020, 0x0000, 0x0004, 0x0008, 
+	 0x0078, 0x0042, 0x003E, 0x003C, 0x003E, 0x007E, 0x0004, 0x003C, 
+	 0x0042, 0x007C, 0x001C, 0x0082, 0x007E, 0x0082, 0x0042, 0x003C, 
+	 0x0002, 0x005C, 0x0042, 0x003C, 0x0038, 0x003C, 0x0010, 0x0044, 
+	 0x00C6, 0x0038, 0x007E, 0x0008, 0x0000, 0x0010, 0x0000, 0x00FE, 
+	 0x0000, 0x00BC, 0x001A, 0x0038, 0x0058, 0x0038, 0x0008, 0x0042, 
+	 0x0042, 0x0038, 0x0022, 0x0042, 0x0038, 0x0092, 0x0042, 0x0018, 
+	 0x0002, 0x0040, 0x0002, 0x0038, 0x0030, 0x0058, 0x0010, 0x006C, 
+	 0x0082, 0x0008, 0x007C, 0x0008, 0x0010, 0x0010, 0x0000, 0x003C, 
+	 0x0050, 0x0022, 0x00A9, 0x008A, 0x0000, 0x0000, 0x00A2, 0x0028, 
+	 0x0044, 0x0045, 0x0049, 0x0095, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x00A8, 0x00AA, 0x0022, 0x0000, 0x00A0, 0x002A, 0x002A, 
+	 0x0000, 0x00A2, 0x00A2, 0x0024, 0x0000, 0x0094, 0x00A2, 0x004A, 
+	 0x00E0, 0x00E0, 0x00C0, 0x00C0, 0x00DF, 0x0000, 0x00DF, 0x0000, 
+	 0x0024, 0x000C, 0x0010, 0x0010, 0x0022, 0x00EE, 0x00FA, 0x0000, 
+	 0x0024, 0x0000, 0x0024, 0x0000, 0x0024, 0x0000, 0x0024, 0x0024, 
+	 0x0000, 0x0000, 0x0024, 0x0024, 0x0070, 0x0040, 0x0084, 0x003E, 
+	 0x000C, 0x000E, 0x001E, 0x000C, 0x0008, 0x000C, 0x000C, 0x0002, 
+	 0x000C, 0x000C, 0x0032, 0x0077, 0x00F7, 0x0000, 0x0000, 0x0000, 
+	 0x0030, 0x0070, 0x0078, 0x0030, 0x0076, 0x007B, 0x0033, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+	},
+
+	{	/* Scan line 4 */
+	 0x0000, 0x0000, 0x0000, 0x007E, 0x007E, 0x007E, 0x007E, 0x007E, 
+	 0x007E, 0x007E, 0x007E, 0x007E, 0x007E, 0x00A8, 0x00AA, 0x0006, 
+	 0x003C, 0x007E, 0x007E, 0x007E, 0x0060, 0x007E, 0x007E, 0x000C, 
+	 0x007E, 0x003C, 0x0000, 0x0000, 0x00FB, 0x0066, 0x00FB, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0028, 0x0092, 0x00A2, 0x0042, 0x0000, 
+	 0x0010, 0x0008, 0x0092, 0x0010, 0x0018, 0x0000, 0x0018, 0x0002, 
+	 0x0024, 0x0010, 0x0042, 0x0042, 0x0020, 0x0042, 0x0042, 0x0004, 
+	 0x0042, 0x0020, 0x0018, 0x0018, 0x0010, 0x0000, 0x0008, 0x0000, 
+	 0x0004, 0x0042, 0x0044, 0x0042, 0x0044, 0x0044, 0x0004, 0x0042, 
+	 0x0042, 0x0010, 0x0022, 0x0042, 0x0042, 0x0082, 0x0062, 0x0042, 
+	 0x0002, 0x0022, 0x0022, 0x0042, 0x0010, 0x0042, 0x0010, 0x00C6, 
+	 0x0044, 0x0010, 0x0042, 0x0008, 0x0080, 0x0010, 0x0000, 0x0000, 
+	 0x0000, 0x0042, 0x0026, 0x0044, 0x0064, 0x0044, 0x0008, 0x0058, 
+	 0x0042, 0x0010, 0x0022, 0x0022, 0x0010, 0x0092, 0x0042, 0x0024, 
+	 0x001A, 0x0058, 0x0002, 0x0044, 0x0048, 0x0064, 0x0028, 0x0092, 
+	 0x0044, 0x0010, 0x0004, 0x0008, 0x0010, 0x0010, 0x0000, 0x0042, 
+	 0x0050, 0x003B, 0x0099, 0x00AA, 0x0000, 0x0000, 0x00AE, 0x006E, 
+	 0x0044, 0x00C5, 0x0049, 0x00D5, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x00AE, 0x006A, 0x0062, 0x0000, 0x00A0, 0x002E, 0x006A, 
+	 0x0000, 0x00AE, 0x00E2, 0x0064, 0x0000, 0x00D4, 0x00A4, 0x004A, 
+	 0x0040, 0x0040, 0x00C0, 0x00C0, 0x00C4, 0x0000, 0x00DF, 0x0000, 
+	 0x0026, 0x0014, 0x0038, 0x0010, 0x0052, 0x0044, 0x000A, 0x0000, 
+	 0x0024, 0x0000, 0x0066, 0x0000, 0x0026, 0x0000, 0x0064, 0x0066, 
+	 0x0000, 0x0000, 0x0064, 0x0026, 0x0078, 0x0048, 0x00B0, 0x007F, 
+	 0x0012, 0x0004, 0x0002, 0x0012, 0x0008, 0x0012, 0x0012, 0x0002, 
+	 0x0012, 0x0010, 0x004A, 0x0022, 0x0012, 0x0000, 0x0000, 0x0000, 
+	 0x0048, 0x0020, 0x0008, 0x0048, 0x0026, 0x000B, 0x004B, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+	},
+
+	{	/* Scan line 5 */
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x007E, 0x007E, 0x007E, 0x007E, 
+	 0x007E, 0x007E, 0x007E, 0x007E, 0x007E, 0x00D8, 0x00AA, 0x0002, 
+	 0x007E, 0x0018, 0x0066, 0x0066, 0x0060, 0x0066, 0x0066, 0x0018, 
+	 0x0066, 0x0070, 0x0000, 0x0018, 0x00DB, 0x0066, 0x001B, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0028, 0x0090, 0x0044, 0x00A2, 0x0000, 
+	 0x0008, 0x0010, 0x0054, 0x0010, 0x0018, 0x0000, 0x0000, 0x0004, 
+	 0x0042, 0x0010, 0x0002, 0x0040, 0x0020, 0x0040, 0x0042, 0x0008, 
+	 0x0042, 0x0040, 0x0018, 0x0018, 0x0008, 0x0000, 0x0010, 0x0008, 
+	 0x0032, 0x0042, 0x0044, 0x0002, 0x0044, 0x0004, 0x0004, 0x0042, 
+	 0x0042, 0x0010, 0x0022, 0x0022, 0x0002, 0x0082, 0x0062, 0x0042, 
+	 0x0002, 0x0052, 0x0012, 0x0040, 0x0010, 0x0042, 0x0028, 0x00AA, 
+	 0x0028, 0x0010, 0x0004, 0x0008, 0x0040, 0x0010, 0x0000, 0x0000, 
+	 0x0000, 0x0042, 0x0042, 0x0002, 0x0042, 0x0002, 0x0008, 0x0064, 
+	 0x0042, 0x0010, 0x0020, 0x0016, 0x0010, 0x0092, 0x0042, 0x0042, 
+	 0x0026, 0x0064, 0x0002, 0x0040, 0x0008, 0x0042, 0x0028, 0x0092, 
+	 0x0028, 0x0028, 0x0008, 0x0008, 0x0010, 0x0010, 0x0000, 0x0099, 
+	 0x00D0, 0x000A, 0x00A9, 0x00DA, 0x0000, 0x0000, 0x00AA, 0x0022, 
+	 0x0044, 0x0045, 0x0049, 0x00B5, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x00A2, 0x00AA, 0x0022, 0x0000, 0x00A0, 0x002A, 0x002A, 
+	 0x0000, 0x00AA, 0x00A2, 0x0024, 0x0000, 0x00B4, 0x00A8, 0x004A, 
+	 0x0044, 0x0040, 0x00CC, 0x00C0, 0x0004, 0x0000, 0x000C, 0x0000, 
+	 0x003C, 0x0024, 0x007C, 0x0010, 0x008A, 0x0044, 0x000A, 0x0000, 
+	 0x0024, 0x0000, 0x00C3, 0x0000, 0x0023, 0x0000, 0x00C4, 0x00C3, 
+	 0x0000, 0x0000, 0x00C4, 0x0023, 0x007C, 0x0094, 0x00C8, 0x0008, 
+	 0x0012, 0x0004, 0x0002, 0x0010, 0x0008, 0x0010, 0x0012, 0x0004, 
+	 0x0012, 0x0010, 0x004A, 0x0022, 0x0022, 0x0000, 0x0000, 0x0000, 
+	 0x0048, 0x0020, 0x0008, 0x0040, 0x0020, 0x0008, 0x0040, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+	},
+
+	{	/* Scan line 6 */
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x007E, 0x007E, 0x007E, 
+	 0x007E, 0x007E, 0x007E, 0x007E, 0x007E, 0x0088, 0x006E, 0x000E, 
+	 0x0066, 0x0018, 0x0006, 0x0060, 0x00FE, 0x0060, 0x0066, 0x0018, 
+	 0x0066, 0x0060, 0x0000, 0x0018, 0x00DB, 0x0066, 0x0033, 0x0000, 
+	 0x0000, 0x0010, 0x0000, 0x00FE, 0x0090, 0x0008, 0x0014, 0x0000, 
+	 0x0008, 0x0010, 0x0038, 0x0010, 0x0000, 0x0000, 0x0000, 0x0008, 
+	 0x0042, 0x0010, 0x0004, 0x0040, 0x0020, 0x0040, 0x0042, 0x0008, 
+	 0x0042, 0x0040, 0x0000, 0x0000, 0x0004, 0x003C, 0x0020, 0x0008, 
+	 0x004A, 0x007E, 0x0044, 0x0002, 0x0044, 0x0004, 0x0004, 0x0042, 
+	 0x0042, 0x0010, 0x0020, 0x0012, 0x0002, 0x0092, 0x0052, 0x0042, 
+	 0x0002, 0x0042, 0x000A, 0x0040, 0x0010, 0x0042, 0x0028, 0x00AA, 
+	 0x0028, 0x0010, 0x0004, 0x0008, 0x0020, 0x0010, 0x0000, 0x0000, 
+	 0x0000, 0x004C, 0x0042, 0x0002, 0x0042, 0x003E, 0x0008, 0x0042, 
+	 0x0042, 0x0010, 0x0020, 0x000A, 0x0010, 0x0092, 0x0042, 0x0042, 
+	 0x0042, 0x0042, 0x0002, 0x0038, 0x0008, 0x0042, 0x0044, 0x0092, 
+	 0x0010, 0x0024, 0x0010, 0x0008, 0x0010, 0x0010, 0x0060, 0x00A5, 
+	 0x0050, 0x00BA, 0x00BB, 0x008A, 0x0000, 0x0000, 0x00EE, 0x00EE, 
+	 0x00C4, 0x009D, 0x005C, 0x0097, 0x0072, 0x0077, 0x0097, 0x0008, 
+	 0x0000, 0x00EE, 0x00EA, 0x00EE, 0x0000, 0x00A0, 0x0024, 0x00EA, 
+	 0x0000, 0x00EE, 0x0042, 0x00EE, 0x0000, 0x0094, 0x00E0, 0x00EA, 
+	 0x0044, 0x0040, 0x00DE, 0x00DF, 0x0004, 0x0000, 0x000C, 0x0000, 
+	 0x0064, 0x0044, 0x0092, 0x0010, 0x008A, 0x0044, 0x0012, 0x0000, 
+	 0x0024, 0x00FF, 0x0081, 0x0000, 0x0021, 0x00FF, 0x0084, 0x0081, 
+	 0x0007, 0x00E0, 0x008C, 0x0031, 0x007E, 0x0094, 0x0084, 0x0008, 
+	 0x0012, 0x0004, 0x0004, 0x0010, 0x001F, 0x0010, 0x0012, 0x0004, 
+	 0x0012, 0x001C, 0x004A, 0x0022, 0x0042, 0x0000, 0x0000, 0x0000, 
+	 0x0048, 0x0020, 0x0010, 0x0040, 0x0020, 0x0010, 0x0040, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+	},
+
+	{	/* Scan line 7 */
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x007E, 0x007E, 
+	 0x007E, 0x007E, 0x007E, 0x007E, 0x007E, 0x0000, 0x0000, 0x0000, 
+	 0x0066, 0x0018, 0x000C, 0x0038, 0x00FE, 0x007E, 0x007E, 0x0030, 
+	 0x003C, 0x007C, 0x007C, 0x007E, 0x00DB, 0x0066, 0x0063, 0x0000, 
+	 0x0000, 0x0010, 0x0000, 0x0028, 0x007C, 0x0010, 0x0008, 0x0000, 
+	 0x0008, 0x0010, 0x00FE, 0x00FE, 0x0000, 0x007C, 0x0000, 0x0010, 
+	 0x0042, 0x0010, 0x0008, 0x0040, 0x00FE, 0x0040, 0x0046, 0x0010, 
+	 0x0042, 0x007C, 0x0000, 0x0000, 0x0002, 0x0000, 0x0040, 0x0010, 
+	 0x009A, 0x0042, 0x0044, 0x0002, 0x0044, 0x0004, 0x0004, 0x0072, 
+	 0x0042, 0x0010, 0x0020, 0x000A, 0x0002, 0x0092, 0x0052, 0x0042, 
+	 0x003E, 0x0042, 0x003E, 0x0040, 0x0010, 0x0042, 0x0044, 0x0092, 
+	 0x0010, 0x0010, 0x0008, 0x0008, 0x0010, 0x0010, 0x0000, 0x0000, 
+	 0x0000, 0x0070, 0x0042, 0x0002, 0x0042, 0x0042, 0x003C, 0x0042, 
+	 0x0042, 0x0010, 0x0020, 0x0012, 0x0010, 0x0092, 0x0042, 0x0042, 
+	 0x0042, 0x0042, 0x0006, 0x0004, 0x0008, 0x0042, 0x0044, 0x0092, 
+	 0x0028, 0x0044, 0x0020, 0x0004, 0x0000, 0x0020, 0x0092, 0x0085, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0015, 0x0051, 0x0091, 0x0008, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x005F, 0x005F, 0x00DE, 0x00DF, 0x0004, 0x0000, 0x000C, 0x0000, 
+	 0x0024, 0x004C, 0x0010, 0x0010, 0x008A, 0x0044, 0x0022, 0x0000, 
+	 0x0024, 0x0000, 0x0000, 0x0000, 0x0020, 0x0000, 0x0004, 0x0000, 
+	 0x000C, 0x0030, 0x0018, 0x0018, 0x007F, 0x0022, 0x0085, 0x0008, 
+	 0x0012, 0x0004, 0x0008, 0x000C, 0x0009, 0x000E, 0x000E, 0x0008, 
+	 0x000C, 0x0012, 0x004A, 0x0022, 0x0082, 0x0000, 0x0000, 0x0000, 
+	 0x0048, 0x0020, 0x0020, 0x0030, 0x0020, 0x0020, 0x0038, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+	},
+
+	{	/* Scan line 8 */
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x007E, 
+	 0x007E, 0x007E, 0x007E, 0x007E, 0x007E, 0x00A8, 0x003B, 0x0000, 
+	 0x0066, 0x0018, 0x0018, 0x0038, 0x0066, 0x003E, 0x003E, 0x0030, 
+	 0x003C, 0x007E, 0x007C, 0x007E, 0x00DB, 0x0066, 0x00C3, 0x0000, 
+	 0x0000, 0x0010, 0x0000, 0x0028, 0x0012, 0x0020, 0x0014, 0x0000, 
+	 0x0008, 0x0010, 0x0038, 0x0010, 0x0000, 0x0000, 0x0000, 0x0020, 
+	 0x0042, 0x0010, 0x0010, 0x0038, 0x0022, 0x003E, 0x003A, 0x0010, 
+	 0x003C, 0x0042, 0x0018, 0x0018, 0x0004, 0x003C, 0x0020, 0x0020, 
+	 0x00AA, 0x0042, 0x003C, 0x0002, 0x0044, 0x001C, 0x001C, 0x0002, 
+	 0x007E, 0x0010, 0x0020, 0x0006, 0x0002, 0x00AA, 0x004A, 0x0042, 
+	 0x0042, 0x0042, 0x0042, 0x003C, 0x0010, 0x0042, 0x0044, 0x0092, 
+	 0x0010, 0x0028, 0x0010, 0x0008, 0x0008, 0x0010, 0x0082, 0x0000, 
+	 0x0000, 0x0042, 0x0026, 0x0044, 0x0064, 0x0044, 0x0008, 0x0024, 
+	 0x0026, 0x0010, 0x0020, 0x0022, 0x0010, 0x0092, 0x0026, 0x0024, 
+	 0x0026, 0x0064, 0x004A, 0x0044, 0x0008, 0x0042, 0x0082, 0x0082, 
+	 0x0044, 0x0042, 0x0040, 0x0008, 0x0010, 0x0010, 0x000C, 0x0085, 
+	 0x00AF, 0x00EE, 0x0002, 0x0000, 0x0052, 0x0095, 0x000E, 0x0000, 
+	 0x0023, 0x00A9, 0x00A2, 0x000E, 0x0035, 0x0051, 0x0091, 0x0014, 
+	 0x0095, 0x00EA, 0x00EE, 0x0001, 0x0075, 0x0077, 0x0027, 0x0009, 
+	 0x0025, 0x00B9, 0x0002, 0x0000, 0x0071, 0x00E9, 0x000A, 0x0000, 
+	 0x0044, 0x0040, 0x00CC, 0x00C0, 0x0004, 0x0000, 0x000C, 0x0000, 
+	 0x0026, 0x0034, 0x0010, 0x0010, 0x008A, 0x0044, 0x0042, 0x0000, 
+	 0x0024, 0x0000, 0x0000, 0x00FF, 0x0020, 0x0000, 0x0004, 0x0000, 
+	 0x0018, 0x0018, 0x0030, 0x000C, 0x007E, 0x0022, 0x0049, 0x0008, 
+	 0x0012, 0x0004, 0x0010, 0x0010, 0x000A, 0x0002, 0x0002, 0x0008, 
+	 0x0012, 0x0012, 0x004A, 0x0022, 0x0082, 0x0000, 0x0000, 0x0000, 
+	 0x0048, 0x0020, 0x0040, 0x0040, 0x0020, 0x0040, 0x0008, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+	},
+
+	{	/* Scan line 9 */
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x007E, 0x007E, 0x007E, 0x007E, 0x007E, 0x00A8, 0x0008, 0x0000, 
+	 0x0066, 0x001E, 0x0030, 0x0060, 0x006C, 0x0006, 0x0006, 0x0060, 
+	 0x0066, 0x0066, 0x0000, 0x0018, 0x00DB, 0x0066, 0x00C3, 0x0000, 
+	 0x0000, 0x0010, 0x0000, 0x00FE, 0x0012, 0x0044, 0x0022, 0x0000, 
+	 0x0008, 0x0010, 0x0054, 0x0010, 0x0000, 0x0000, 0x0000, 0x0040, 
+	 0x0042, 0x0010, 0x0020, 0x0040, 0x0024, 0x0002, 0x0002, 0x0020, 
+	 0x0042, 0x0042, 0x0018, 0x0018, 0x0008, 0x0000, 0x0010, 0x0040, 
+	 0x00AA, 0x0042, 0x0044, 0x0002, 0x0044, 0x0004, 0x0004, 0x0002, 
+	 0x0042, 0x0010, 0x0020, 0x000A, 0x0002, 0x00AA, 0x004A, 0x0042, 
+	 0x0042, 0x0042, 0x0042, 0x0002, 0x0010, 0x0042, 0x0044, 0x0082, 
+	 0x0028, 0x0044, 0x0020, 0x0008, 0x0004, 0x0010, 0x0044, 0x0000, 
+	 0x0000, 0x003C, 0x001A, 0x0038, 0x0058, 0x0038, 0x0008, 0x0018, 
+	 0x001A, 0x0018, 0x0030, 0x0042, 0x0010, 0x006E, 0x001A, 0x0018, 
+	 0x001A, 0x0058, 0x0032, 0x0038, 0x003E, 0x0042, 0x0082, 0x0082, 
+	 0x0082, 0x0042, 0x007C, 0x0008, 0x0010, 0x0010, 0x0000, 0x00A5, 
+	 0x00A9, 0x00AA, 0x0022, 0x0000, 0x0052, 0x0095, 0x0008, 0x0000, 
+	 0x0025, 0x00A9, 0x00A2, 0x0022, 0x0015, 0x0051, 0x0091, 0x0014, 
+	 0x0095, 0x002A, 0x002A, 0x0001, 0x0015, 0x0054, 0x0021, 0x0029, 
+	 0x0025, 0x0089, 0x0002, 0x0000, 0x0051, 0x0029, 0x000A, 0x0000, 
+	 0x0044, 0x0040, 0x00C0, 0x00C0, 0x0004, 0x0000, 0x000F, 0x0000, 
+	 0x003C, 0x0004, 0x0010, 0x0092, 0x008A, 0x0044, 0x0082, 0x0000, 
+	 0x0024, 0x00FF, 0x0081, 0x0000, 0x0021, 0x0081, 0x0084, 0x00FF, 
+	 0x0031, 0x008C, 0x00E0, 0x0007, 0x007C, 0x0041, 0x0032, 0x0008, 
+	 0x0012, 0x0006, 0x0012, 0x0012, 0x000C, 0x0002, 0x0002, 0x0010, 
+	 0x0012, 0x0012, 0x004B, 0x0033, 0x0093, 0x0000, 0x0000, 0x0000, 
+	 0x0048, 0x0030, 0x0048, 0x0048, 0x0030, 0x0048, 0x0008, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+	},
+
+	{	/* Scan line 10 */
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x007E, 0x007E, 0x007E, 0x007E, 0x0098, 0x0009, 0x0000, 
+	 0x007E, 0x001C, 0x0066, 0x0066, 0x0078, 0x0006, 0x000E, 0x0066, 
+	 0x0066, 0x0066, 0x0000, 0x0018, 0x00DB, 0x0077, 0x00DB, 0x0000, 
+	 0x0000, 0x0010, 0x0000, 0x0028, 0x0092, 0x008A, 0x0022, 0x0004, 
+	 0x0008, 0x0010, 0x0092, 0x0010, 0x0000, 0x0000, 0x0000, 0x0080, 
+	 0x0042, 0x0014, 0x0040, 0x0040, 0x0028, 0x0002, 0x0002, 0x0020, 
+	 0x0042, 0x0042, 0x0000, 0x0000, 0x0010, 0x0000, 0x0008, 0x0042, 
+	 0x0092, 0x0024, 0x0044, 0x0002, 0x0044, 0x0004, 0x0004, 0x0002, 
+	 0x0042, 0x0010, 0x0020, 0x0012, 0x0002, 0x00C6, 0x0046, 0x0042, 
+	 0x0042, 0x0042, 0x0042, 0x0002, 0x0010, 0x0042, 0x0082, 0x0082, 
+	 0x0028, 0x0044, 0x0020, 0x0008, 0x0002, 0x0010, 0x0028, 0x0000, 
+	 0x0020, 0x0000, 0x0002, 0x0000, 0x0040, 0x0000, 0x0048, 0x0000, 
+	 0x0002, 0x0000, 0x0000, 0x0002, 0x0010, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0008, 0x0010, 0x0010, 0x0000, 0x0099, 
+	 0x006D, 0x00AA, 0x004E, 0x0000, 0x0032, 0x00D7, 0x00EE, 0x0000, 
+	 0x0055, 0x00ED, 0x00AA, 0x0042, 0x0075, 0x0071, 0x00D7, 0x0015, 
+	 0x00D7, 0x002E, 0x00AA, 0x0001, 0x0033, 0x0057, 0x0021, 0x004D, 
+	 0x0035, 0x0099, 0x0039, 0x0000, 0x0057, 0x002D, 0x000E, 0x0000, 
+	 0x0040, 0x0040, 0x00E0, 0x00E0, 0x0005, 0x0000, 0x000E, 0x0000, 
+	 0x0064, 0x0004, 0x0010, 0x007C, 0x008A, 0x0044, 0x0082, 0x0000, 
+	 0x0024, 0x0000, 0x00C3, 0x0000, 0x0023, 0x00C3, 0x00C4, 0x0000, 
+	 0x0023, 0x00C4, 0x0000, 0x0000, 0x0078, 0x0041, 0x0002, 0x007F, 
+	 0x000C, 0x0004, 0x000C, 0x000C, 0x0008, 0x000E, 0x000C, 0x001F, 
+	 0x000C, 0x000C, 0x0032, 0x0022, 0x0062, 0x0000, 0x0000, 0x0000, 
+	 0x0030, 0x0020, 0x0030, 0x0030, 0x0020, 0x0030, 0x0038, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+	},
+
+	{	/* Scan line 11 */
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x007E, 0x007E, 0x007E, 0x00A8, 0x0008, 0x0000, 
+	 0x003C, 0x0018, 0x007E, 0x007E, 0x0070, 0x003E, 0x003C, 0x007E, 
+	 0x007E, 0x007E, 0x0000, 0x0000, 0x00FB, 0x0077, 0x00FB, 0x0000, 
+	 0x0000, 0x0010, 0x0028, 0x0028, 0x007C, 0x0004, 0x001C, 0x0008, 
+	 0x0010, 0x0008, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0024, 0x0018, 0x0042, 0x0042, 0x0030, 0x0002, 0x0004, 0x0042, 
+	 0x0042, 0x0042, 0x0000, 0x0000, 0x0020, 0x0000, 0x0004, 0x0042, 
+	 0x0044, 0x0024, 0x0044, 0x0042, 0x0044, 0x0044, 0x0044, 0x0042, 
+	 0x0042, 0x0010, 0x0020, 0x0022, 0x0002, 0x00C6, 0x0046, 0x0042, 
+	 0x0042, 0x0042, 0x0042, 0x0042, 0x0092, 0x0042, 0x0082, 0x0082, 
+	 0x0044, 0x0082, 0x0042, 0x0008, 0x0000, 0x0010, 0x0010, 0x0000, 
+	 0x0010, 0x0000, 0x0002, 0x0000, 0x0040, 0x0000, 0x0030, 0x0000, 
+	 0x0002, 0x0010, 0x0020, 0x0002, 0x0010, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0008, 0x0010, 0x0010, 0x0000, 0x0042, 
+	 0x00A1, 0x00AA, 0x008A, 0x0000, 0x0052, 0x00B5, 0x0002, 0x0000, 
+	 0x0055, 0x00AB, 0x00B6, 0x0082, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x00B5, 0x002A, 0x002A, 0x0000, 0x0015, 0x0051, 0x0021, 0x008B, 
+	 0x002D, 0x0089, 0x0002, 0x0000, 0x0055, 0x002B, 0x000A, 0x0000, 
+	 0x0060, 0x0060, 0x00E0, 0x00E0, 0x0006, 0x0000, 0x000C, 0x0000, 
+	 0x0024, 0x0004, 0x0010, 0x0038, 0x0053, 0x0066, 0x008B, 0x0000, 
+	 0x0024, 0x0000, 0x0066, 0x0000, 0x0026, 0x0066, 0x0064, 0x0000, 
+	 0x0026, 0x0064, 0x0000, 0x0000, 0x0070, 0x0000, 0x0000, 0x003E, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+	},
+
+	{	/* Scan line 12 */
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x007E, 0x007E, 0x00B8, 0x003B, 0x0000, 
+	 0x0018, 0x0010, 0x003C, 0x003C, 0x0060, 0x003E, 0x0038, 0x007E, 
+	 0x003C, 0x003C, 0x0000, 0x0000, 0x0073, 0x0066, 0x0073, 0x0000, 
+	 0x0000, 0x0010, 0x0028, 0x0000, 0x0010, 0x0000, 0x0000, 0x0018, 
+	 0x0010, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0018, 0x0010, 0x003C, 0x003C, 0x0020, 0x003E, 0x0038, 0x007E, 
+	 0x003C, 0x003C, 0x0000, 0x0000, 0x0040, 0x0000, 0x0002, 0x003C, 
+	 0x0038, 0x0018, 0x003E, 0x003C, 0x003E, 0x007E, 0x007E, 0x003C, 
+	 0x0042, 0x007C, 0x0070, 0x0042, 0x0002, 0x0082, 0x0042, 0x003C, 
+	 0x003E, 0x003C, 0x003E, 0x003C, 0x00FE, 0x0042, 0x0082, 0x0082, 
+	 0x00C6, 0x0082, 0x007E, 0x0008, 0x0000, 0x0010, 0x0000, 0x0000, 
+	 0x0018, 0x0000, 0x0002, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 
+	 0x0002, 0x0000, 0x0000, 0x0002, 0x0018, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0030, 0x0010, 0x000C, 0x0000, 0x003C, 
+	 0x00EF, 0x00AE, 0x000E, 0x0000, 0x0077, 0x0092, 0x000E, 0x0000, 
+	 0x0053, 0x0049, 0x00A2, 0x000E, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0092, 0x0024, 0x00EE, 0x0001, 0x0077, 0x0077, 0x0071, 0x0009, 
+	 0x00A5, 0x00BB, 0x0003, 0x0000, 0x0057, 0x00E9, 0x000A, 0x0000, 
+	 0x0040, 0x0040, 0x00C0, 0x00C0, 0x0004, 0x0000, 0x0008, 0x0000, 
+	 0x0020, 0x0004, 0x0010, 0x0010, 0x0022, 0x0044, 0x0072, 0x0000, 
+	 0x0024, 0x0000, 0x0024, 0x0000, 0x0024, 0x0024, 0x0024, 0x0000, 
+	 0x0024, 0x0024, 0x0000, 0x0000, 0x0060, 0x0000, 0x0000, 0x001C, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+	},
+
+	{	/* Scan line 13 */
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x007E, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0028, 0x0000, 0x0000, 0x0000, 0x0000, 0x0018, 
+	 0x0020, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0078, 0x0000, 0x001E, 0x0000, 0x0000, 
+	 0x0018, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0024, 0x0000, 0x0024, 0x0000, 0x0024, 0x0024, 0x0024, 0x0000, 
+	 0x0024, 0x0024, 0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0008, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 
+	 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+	}
+};
Index: vlib/glcinit.c
===================================================================
--- vlib/glcinit.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/glcinit.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,338 @@
+/*
+   =============================================================================
+	glcinit.c -- LCD drivers for the Epson GLC controller chip
+	Version 5 -- 1988-08-03 -- D.N. Lynx Crowe
+	(c) Copyright 1987, 1988 -- D.N. Lynx Crowe
+
+	GLCinit()
+
+		Initializes the GLC.
+
+	unsigned
+	GLCcrc(row, col)
+	unsigned row, col;
+
+		Positions the GLC cursor at ('row', 'col') preparatory
+		to writing text.  Returns the calculated cursor address.
+
+	unsigned
+	GLCcxy(x, y)
+	unsigned x, y;
+
+		Positions the GLC cursor at ('x', 'y') preparatory to
+		writing graphics.  Returns a bit mask for the pixel.
+		Leaves the cursor address in lcdcurs.
+		Limits:  0 LE x LE 511,  0 LE y LE 63.
+
+	GLCwrts(s)
+	char *s;
+
+		Writes the character string pointed to by 's' at the
+		current cursor position on the LCD display.
+		Cursor must start and end on the same line.
+		No error checks are done.
+
+	GLCtext(row, col, s)
+	unsigned row, col;
+	char *s;
+
+		Sets the GLC cursor to ('row', 'col'), then writes the
+		character string pointed to by 's'.
+		Cursor must start and end on the same line.
+		No error checks are done.
+
+
+	GLCdisp(dsp, crs, blk1, blk2, blk3)
+	short dsp, crs, blk1, blk2, blk3;
+
+		Sets the overall display, cursor and block status values.
+
+	GLCcurs(crs)
+	short crs;
+
+		Turns the cursor on or off.
+   =============================================================================
+*/
+
+/* 
+
+*/
+
+#include "stddefs.h"
+#include "hwdefs.h"
+#include "glcdefs.h"
+
+unsigned	lcdbase;	/* LCD graphics base address */
+unsigned	lcdbit;		/* LCD graphics pixel bit mask */
+unsigned	lcdcol;		/* LCD text column */
+unsigned	lcdctl1;	/* LCD display control -- command */
+unsigned	lcdctl2;	/* LCD display control -- data */
+unsigned	lcdcurs;	/* LCD graphics pixel byte address */
+unsigned	lcdrow;		/* LCD text row */
+unsigned	lcdx;		/* LCD graphics x */
+unsigned	lcdy;		/* LCD graphics y */
+
+/* GLC initialization values */
+
+char glc_is1[] = { 0x12, 0x05, 0x07, 0x54, 0x58, 0x3F, 0x55, 0x00 };
+char glc_is2[] = { 0x00, 0x00, 0x3F, 0x00, 0x20, 0x3F, 0x00, 0x00 };
+
+/* 
+
+*/
+
+/*
+   =============================================================================
+	GLCdisp(dsp, crs, blk1, blk2, blk3) -- set GLC display status
+	Sets the overall display, cursor and block status values.
+   =============================================================================
+*/
+
+GLCdisp(dsp, crs, blk1, blk2, blk3)
+short dsp, crs, blk1, blk2, blk3;
+{
+	register short val;
+
+	val = ((blk3 & 3) << 6) | ((blk2 & 3) << 4) | ((blk1 & 3) << 2) |
+		(crs & 3);
+
+	lcdctl1 = G_DSPCTL | (dsp & 1);
+	lcdctl2 = val;
+
+	LCD_WC = lcdctl1;
+	LCD_WD = lcdctl2;
+
+}
+
+/*
+   =============================================================================
+	GLCcurs() -- turns the cursor on or off
+   =============================================================================
+*/
+
+GLCcurs(crs)
+short crs;
+{
+	lcdctl2 = (crs & 3) | (lcdctl2 & ~3);
+
+	LCD_WC = lcdctl1;
+	LCD_WD = lcdctl2;
+}
+
+/* 
+
+*/
+
+/*
+   =============================================================================
+	GLCinit() -- initialize GLC
+	Initializes the GLC.
+   =============================================================================
+*/
+
+GLCinit()
+{
+	register int	i;
+	register long ic;
+	register char *gp;
+
+	lcdbase = G_PLANE2;	/* set defaults for graphics variables */
+	lcdx = 0;
+	lcdy = 0;
+	lcdbit = 0x01;
+
+	lcdrow = 0;		/* set default for text variables */
+	lcdcol = 0;
+
+	lcdctl1 = G_DSPCTL;
+	lcdctl2 = 0;
+
+	LCD_WC = G_INIT;	/* initialize the GLC */
+	gp = &glc_is1[0];
+
+	for (i = 0; i < 8; i++)
+		LCD_WD= *gp++;
+
+	LCD_WC = G_SETSAD;	/* setup scroll registers */
+	gp = &glc_is2[0];
+
+	for (i = 0; i < 8; i++)
+		LCD_WD = *gp++;
+
+	LCD_WC = G_HSCRL;	/* clear the horizontal scroll counter */
+	LCD_WD = 0;
+
+	LCD_WC = G_OVRLAY;	/* setup the display mode */
+	LCD_WD = 0x08;
+
+	GLCdisp(G_OFF, G_B2, G_ON, G_ON, G_OFF);
+
+/* 
+
+*/
+	LCD_WC = G_CRSWR;	/* set cursor at (0,0) in G_PLANE1 */
+	LCD_WD = G_PLANE1 & 0xFF;
+	LCD_WD = (G_PLANE1 >> 8) & 0xFF;
+
+	LCD_WC = G_CRSMRT;	/* set cursor motion forward */
+
+	LCD_WC = G_MWRITE;	/* write zeros to GLC RAM */
+
+	for (ic = 0; ic < 65536L; ic++)
+		LCD_WD = 0;
+
+	LCD_WC = G_CRSWR;	/* set cursor to (0,0) in G_PLANE1 */
+	LCD_WD = G_PLANE1 & 0xFF;
+	LCD_WD = (G_PLANE1 >> 8) & 0xFF;
+
+	LCD_WC = G_CRSFRM;	/* setup a blinking underline cursor */
+	LCD_WD = 0x04;
+	LCD_WD = 0x06;
+
+	/* enable display */
+
+	GLCdisp(G_ON, G_B2, G_ON, G_ON, G_OFF);
+}
+
+/* 
+
+*/
+
+/*
+   =============================================================================
+	GLCcrc(row, col) -- position GLC text cursor
+	Positions the GLC cursor at ('row', 'col') preparatory
+	to writing text.  Returns calculated cursor address.
+   =============================================================================
+*/
+
+unsigned
+GLCcrc(row, col)
+unsigned row, col;
+{
+	unsigned curad;
+
+	curad = col + (row * 85);	/* calculate cursor location */
+
+	LCD_WC = G_CRSWR;		/* send cursor address to GLC */
+	LCD_WD = curad & 0xFF;
+	LCD_WD = (curad >> 8) & 0xFF;
+
+	lcdrow = row;			/* set text cursor variables */
+	lcdcol = col;
+
+	return(curad);			/* return calculated cursor address */
+}
+
+/* 
+
+*/
+
+/*
+   =============================================================================
+	GLCcxy(x, y) -- position GLC graphics cursor
+	Positions the GLC cursor at ('x', 'y') preparatory to
+	writing graphics.  Returns a bit mask for the pixel.
+	Leaves cursor address in lcdcurs.
+	Limits:  0 LE x LE 511,  0 LE y LE 63.
+   =============================================================================
+*/
+
+unsigned
+GLCcxy(x, y)
+register unsigned x, y;
+{
+	register unsigned curad, xby6;
+
+	/* calculate cursor address */
+
+	xby6 = x % 6;
+	curad = lcdbase + (85 * (63 - y)) + (x / 6) + (xby6 >> 3);
+	lcdcurs = curad;
+
+	/* send cursor address to GLC */
+
+	LCD_WC = G_CRSWR;
+	LCD_WD = curad & 0xFF;
+	LCD_WD = (curad >> 8) & 0xFF;
+
+	/* set graphics variables */
+
+	lcdx = x;
+	lcdy = y;
+
+	/* calculate bit mask */
+
+	lcdbit = 0x01 << (xby6 & 0x07);
+
+	return(lcdbit);
+}
+
+/* 
+
+*/
+
+/*
+   =============================================================================
+	GLCwrts(s) -- write text string to GLC
+	Writes the character string pointed to by 's' at the
+	current cursor position on the LCD display.
+	Cursor must start and end on the same line.
+	No error checks are done.
+   =============================================================================
+*/
+
+GLCwrts(s)
+register char *s;
+{
+	LCD_WC = G_CRSMRT;	/* set cursor motion =  right */
+
+	LCD_WC = G_MWRITE;	/* set to write data */
+
+	while (*s) {		/* write string to GLC */
+
+		LCD_WD = *s++;
+		lcdcol++;	/* keep column variable up to date */
+	}
+}
+
+/* 
+
+*/
+
+/*
+   =============================================================================
+	GLCtext(row, col, s) -- position GLC cursor and write text
+	Sets the GLC cursor to ('row', 'col'), then writes the
+	character string pointed to by 's'.
+	Cursor must start and end on the same line.
+	No error checks are done.
+   =============================================================================
+*/
+
+GLCtext(row, col, s)
+register unsigned row, col;
+register char *s;
+{
+	register unsigned curad;
+
+	curad = col + (row * 85);	/* calculate cursor address */
+
+	LCD_WC = G_CRSWR;		/* send cursor address to GLC */
+	LCD_WD = curad & 0xFF;
+	LCD_WD = (curad >> 8) & 0xFF;
+
+	lcdrow = row;			/* set GLC text cursor variables */
+	lcdcol = col;
+
+	LCD_WC = G_CRSMRT;		/* set cursor motion = right */
+
+	LCD_WC = G_MWRITE;		/* set to write data */
+
+	while (*s) {			/* write string to GLC */
+
+		LCD_WD = *s++;
+		lcdcol++;		/* keep cursor column up to date */
+	}
+}
+
Index: vlib/glcplot.s
===================================================================
--- vlib/glcplot.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/glcplot.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,68 @@
+* ------------------------------------------------------------------------------
+* glcplot.s -- plot a pixel on the LCD display
+* Version 2 -- 1987-04-23 -- D.N. Lynx Crowe
+* (c) Copyright 1987 -- D.N. Lynx Crowe
+*
+*	GLCplot(x, y, val)
+*	unsigned x, y, val);
+*
+*		Plot a pixel at ('x', 'y') using lcdbase as the plane address
+*		in GLC RAM.  If 'val' is zero, the pixel is cleared,
+*		otherwise the pixel is cleared.  No error checking is done.
+*		Limits:  0 LE x LE 511,  0 LE y LE 63.
+* ------------------------------------------------------------------------------
+		.text
+*
+		.xdef	_GLCplot
+		.xref	_lcd_a0,_lcd_a1,_lcdbase
+*
+XLOC		.equ	8			* 'x' parameter offset
+YLOC		.equ	10			* 'y' parameter offset
+VAL		.equ	12			* 'val' parameter offset
+*
+G_CRSWR		.equ	$46			* GLC set cursor command
+G_MWRITE	.equ	$42			* GLC write command
+G_MREAD		.equ	$43			* GLC read command
+*
+		.page
+*
+_GLCplot:	link	a6,#0			* Link stack frames
+		moveq	#63,d0			* d0 = (63-y) * 85
+		sub.w	YLOC(a6),d0		* ...
+		mulu	#85,d0			* ...
+		clr.l	d1			* d1 = x/6
+		move.w	XLOC(a6),d1		* ...
+		divu	#6,d1			* ...
+		add.w	d1,d0			* d0 = (63-y)*85 + (x/6)
+		swap	d1			* d2 = 7 - (x%6) % 8
+		moveq	#7,d2			* ...
+		sub.w	d1,d2			* ...
+		andi.w	#7,d2			* ...
+		lsr.w	#3,d1			* d1 = (x%6) / 8
+		add.w	d1,d0			* d0 = cursor address
+		add.w	_lcdbase,d0		* ...
+		move.w	d0,d1			* d1 = cursor address, too
+		move.b	#G_CRSWR,_lcd_a1	* Send cursor address to GLC
+		move.b	d0,_lcd_a0		* ...
+		lsr.w	#8,d0			* ...
+		move.b	d0,_lcd_a0		* ...
+		move.b	#G_MREAD,_lcd_a1	* Read old pixel byte
+		move.b	_lcd_a1,d0		* ... into d0
+		tst.w	VAL(a6)			* Check val for zero
+		beq	glcplt1			* Jump if val EQ 0
+*
+		bset	d2,d0			* Set the pixel to 1
+		bra	glcplt2			* Go write pixel to GLC
+*
+glcplt1:	bclr	d2,d0			* Clear the pixel to 0
+*
+glcplt2:	move.b	#G_CRSWR,_lcd_a1	* Send cursor address to GLC
+		move.b	d1,_lcd_a0		* ...
+		lsr.w	#8,d1			* ...
+		move.b	d1,_lcd_a0		* ...
+		move.b	#G_MWRITE,_lcd_a1	* Setup GLC to write pixel
+		move.b	d0,_lcd_a0		* Write pixel
+		unlk	a6			* Unlink stack frames
+		rts				* Return to caller
+*
+		.end
Index: vlib/lseg.c
===================================================================
--- vlib/lseg.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/lseg.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,93 @@
+/*
+   ===========================================================================
+	LSEG.C -- Generalized line drawing function  (Integer DDA algorithm)
+	Version 6 -- 1987-08-04 -- D.N. Lynx Crowe
+	Copyright 1985, 1986, 1987 -- D.N. Lynx Crowe
+   ===========================================================================
+*/
+
+short	(*point)();
+
+#define	ABS(x)	((x) < 0 ? (-(x)) : (x))
+#define	SIGN(x)	((x) < 0 ? (-1) : ((x) ? 1 : 0))
+
+#define	LE	<=
+
+/*
+   =============================================================================
+	lseg(x1, y1, x2, y2, t) -- draw a line from ('x1', 'y1') to ('x2', 'y2')
+	in drawing mode 't'.
+
+	All coordinates are short integers in whatever plotting units the
+	'point' function expects.  No clipping or scaling is done, as this is
+	the lowest level 'line' primitive in the drawing code, and coordinates
+	are expected to have already been checked and found to be on screen. 
+
+	The 'point' variable must be initialized to point at the
+	pixel plotting function before this function is called.  The pixel
+	plotting function is passed 3 arguments:  the x coordinate, the y
+	coordinate, and the plotting mode.  It is declared here as type 'short',
+	but any value it returns will be ignored.
+
+	The register variable assignments were chosen based on the Alcyon C
+	compiler for the Atari 1040ST and reflect the capabilities of that
+	compiler.  Other compilers may require different optimizations based
+	on their use of register variables.
+   =============================================================================
+*/
+
+/* 
+
+*/
+
+lseg(x1, y1, x2, y2, t)
+short x1, y1, x2, y2, t;
+{
+	register short dx, dy, ptx, pty, p;
+	short i, px, py;
+
+	p = x2 - (ptx = x1);
+	dx = SIGN(p);
+	py = ABS(p);
+
+	p = y2 - (pty = y1);
+	dy = SIGN(p);
+	px = ABS(p);
+
+	(*point)(ptx, pty, t);
+
+	if (py > px) {
+
+		p = py >> 1;
+
+		for (i = 1; i < py; i++) {
+
+			ptx += dx;
+
+			if ( (p -= px) < 0) {
+
+				pty += dy;
+				p += py;
+			}
+
+			(*point)(ptx, pty, t);
+		}
+
+	} else {
+
+		p = px >> 1;
+
+		for (i = 1; i LE px; i++) {
+
+			pty += dy;
+
+			if ( (p -= py) < 0) {
+
+				ptx += dx;
+				p += px;
+			}
+
+			(*point)(ptx, pty, t);
+		}
+	}
+}
Index: vlib/tsplot4.s
===================================================================
--- vlib/tsplot4.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/tsplot4.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,154 @@
+* ------------------------------------------------------------------------------
+* tsplot4.s -- output characters to a 4-bit / pixel graphics window
+*    with variable vertical pitch
+* Version 1 -- 1987-08-04 -- D.N. Lynx Crowe
+* (c) Copyright 1987 -- D.N. Lynx Crowe
+* ------------------------------------------------------------------------------
+*
+*	tsplot4(obase, nw, fg, row, col, str. pitch)
+*	int *obase, nw, fg, row, col, pitch;
+*	char *str;
+*
+*		Outputs characters from the string at 'str' to an 'nw'
+*		character wide 4-bit per pixel graphics window at 'obase'
+*		at ('row','col'), using 'fg' as the foreground color.
+*		Uses cgtable[][256] as the VSDD formatted character
+*		generator table.  Assumes 12 bit high characters in the
+*		cgtable.  Uses 'pitch' as the vertical spacing between
+*		character rows.  No error checks are done.
+*		The string must fit the output area (no overlaps, single line).
+*
+* ------------------------------------------------------------------------------
+		.text
+*
+		.xdef	_tsplot4
+*
+		.xref	_cgtable
+*
+* Argument offsets from a6:
+*
+OBASE		.equ	8		* LONG - Output area base address
+NW		.equ	12		* WORD - Character width of output area
+FG		.equ	14		* WORD - Foreground color
+ROW		.equ	16		* WORD - Row
+COL		.equ	18		* WORD - Column
+STR		.equ	20		* LONG - String base address
+PITCH		.equ	24		* WORD - Vertical spacing between rows
+*
+* Program constant definitions:
+*
+HPIX		.equ	8		* Character width in pixels
+VPIX		.equ	12		* Character height in pixels
+HCW		.equ	4		* Horizontal character width (bytes)
+PSHIFT		.equ	12		* Pixel shift into MS bits
+HSHIFT		.equ	4		* Pixel right shift
+*
+		.page
+*
+* Register usage:
+*
+*	d0	output word and scratch
+*	d1	CG word and scratch
+*	d2	pixel counter
+*
+*	d3	foreground color (in the 4 ms bits)
+*	d4	background color (in the 4 ms bits)
+*	d5	width of the area in bytes
+*	d6	scan line counter
+*
+*	a0	CG table pointer
+*	a1	output area scan line pointer
+*	a2	input string character pointer
+*
+*	a3	output area character base pointer
+*
+*	a6	frame pointer
+*	a7	stack pointer
+*
+		.page
+*
+_tsplot4:	link	a6,#0		* Link stack frames
+		movem.l	d3-d6/a3,-(a7)	* Save registers we use
+		move.w	#PSHIFT,d1	* Set shift constant
+		move.w	FG(a6),d3	* Setup foreground color
+		lsl.w	d1,d3		* ... in ms 4 bits of d3.W
+		move.w	NW(a6),d5	* Get line width in d5.W
+		lsl.w	#2,d5		* Multiply width by 4 for offset
+		move.w	ROW(a6),d0	* Calculate output address
+		move.w	PITCH(a6),d1	* ... PITCH
+		mulu	d1,d0		* ... * ROW
+		add.w	#VPIX-1,d0	* ... + VPIX-1
+		mulu	d5,d0		* ... * NW
+		clr.l	d1		* ...
+		move.w	COL(a6),d1	* ... + 
+		lsl.w	#2,d1		* ... COL * 4
+		add.l	d1,d0		* ...
+		add.l	OBASE(a6),d0	* ... + OBASE
+		movea.l	d0,a3		* Leave output address in a3
+		movea.l	STR(a6),a2	* Put string address in a2
+*
+cgl0:		clr.l	d0		* Clear out upper bits of d0
+		move.b	(a2)+,d0	* Get next character
+		beq	cgl5		* Done if character EQ 0
+*
+		movea.l	a3,a1		* Establish output pointer in a1
+		adda.l	#HCW,a3		* Update output pointer for next char.
+		lea	_cgtable,a0	* Establish CG pointer in a0
+		lsl.w	#1,d0		* ... 2 * character
+		adda.w	d0,a0		* ... + _cgtable address
+		move.w	#VPIX-1,d6	* Set scan line counter in d6
+*
+		.page
+cgl1:		move.w	(a0),d1		* Get character generator word in d1
+		move.w	#(HPIX/2)-1,d2	* Set pixel counter in d2
+		clr.l	d4		* Get old output word as background
+		move.w	(a1),d4		* ...
+		swap	d4		* ...
+*
+cgl2:		lsr.w	#HSHIFT,d0	* Shift output word right 1 pixel
+		lsr.l	#HSHIFT,d4	* Shift background word 1 pixel
+		andi.l	#$FFFFF000,d4	* Mask for upper 4 bits of d4.W
+		btst.l	#0,d1		* Check CG word ls bit
+		beq	cgl3		* Set background color if bit EQ 0
+*
+		or.w	d3,d0		* OR foreground color into output word
+		bra	cgl4		* Go update CG word
+*
+cgl3:		or.w	d4,d0		* OR background color into output word
+*
+cgl4:		lsr.w	#1,d1		* Shift CG word right 1 pixel
+		dbf	d2,cgl2		* Loop for first 4 pixels
+*
+		move.w	d0,(a1)+	* Store first output word in scan line
+		move.w	#(HPIX/2)-1,d2	* Set pixel counter in d2
+		clr.l	d4		* Get old output word as background
+		move.w	(a1),d4		* ...
+		swap	d4		* ...
+*
+cgl2a:		lsr.w	#HSHIFT,d0	* Shift output word right 1 pixel
+		lsr.l	#HSHIFT,d4	* Shift background word 1 pixel
+		andi.l	#$FFFFF000,d4	* Mask for upper bits of d4.W
+		btst.l	#0,d1		* Check CG word ls bit
+		beq	cgl3a		* Set background color if bit EQ 0
+*
+		or.w	d3,d0		* OR foreground color into output word
+		bra	cgl4a		* Go update CG word
+*
+cgl3a:		or.w	d4,d0		* OR background color into output word
+*
+cgl4a:		lsr.w	#1,d1		* Shift CG word right 1 pixel
+		dbf	d2,cgl2a	* Loop for last 4 pixels
+*
+		move.w	d0,(a1)		* Store second output word in scan line
+		suba.w	d5,a1		* Update output pointer
+		suba.w	#2,a1		* ...
+		adda.l	#512,a0		* Update CG pointer for next scan line
+		dbf	d6,cgl1		* Loop for all scan lines
+*
+		bra	cgl0		* Loop for next character
+*
+cgl5:		movem.l	(a7)+,d3-d6/a3	* Restore registers
+		unlk	a6		* Unlink stack frames
+		rts			* Return to caller
+*
+		.end
Index: vlib/vbank.s
===================================================================
--- vlib/vbank.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/vbank.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,112 @@
+* ------------------------------------------------------------------------------
+* vbank.s -- VSDD bank switching control functions
+* Version 3 -- 1989-12-19 -- D.N. Lynx Crowe
+*
+*	unsigned
+*	vbank(b)
+*	unsigned b;
+*
+*		Set VSDD Data Segment bank to b.
+*		Return old bank select value.
+*
+*
+*	vfwait()
+*
+*		Wait for a FRAMESTOP update to transpire.
+* ------------------------------------------------------------------------------
+		.xdef	_vbank
+		.xdef	_vfwait
+*
+		.xref	_v_regs
+*
+		.text
+*
+B		.equ	8
+*
+OLDB		.equ	d6
+NEWB		.equ	d7
+*
+VSDD_R5		.equ	10
+VSDD_R11	.equ	22
+*
+VT_BASE		.equ	128		* word offset of VSDD Access Table
+*
+VT_1		.equ	VT_BASE+300	* high time
+VT_2		.equ	VT_BASE+2	* low time
+*
+		.page
+* ------------------------------------------------------------------------------
+*	vbank(b) -- change VSDD Data Segment bank to b.  Return old bank.
+*	Assumes a 128K byte window, sets S15..S11 to zero.
+* ------------------------------------------------------------------------------
+*
+
+_vbank:		link	a6,#0			* link stack frames
+		movem.l	d5-d7,-(sp)		* preserve registers
+		move.w	_v_regs+VSDD_R5,OLDB	* get v_regs[5]
+		lsr.w	#6,OLDB			* extract BS bits
+		move.w	OLDB,d0			* ...
+		andi.w	#2,d0			* ...
+		move.w	OLDB,d1			* ...
+		lsr.w	#2,d1			* ...
+		andi.w	#1,d1			* ...
+		or.w	d1,d0			* ...
+		move.w	d0,OLDB			* ...
+		cmp.w	B(a6),OLDB		* see if they're what we want
+		bne	L2			* jump if not
+*
+		move.w	B(a6),d0		* setup to return b
+		bra	L1
+*
+L2:		move.w	B(a6),NEWB		* get bank bits from b
+		lsl.w	#6,NEWB			* shift bits from b into BS bits
+		move.w	NEWB,d0			* ...
+		andi.w	#128,d0			* ...
+		lsl.w	#2,NEWB			* ...
+		andi.w	#256,NEWB		* ...
+		or.w	NEWB,d0			* ...
+		move.w	d0,_v_regs+VSDD_R5	* set v_regs[5] with new BS bits
+*
+vw1b:		cmp.w	#VT_1,_v_regs+VSDD_R11	* wait for FRAMESTOP
+		bcc	vw1b			* ...
+*
+vw2b:		cmp.w	#VT_1,_v_regs+VSDD_R11	* ...
+		bcs	vw2b			* ...
+*
+vw3b:		cmp.w	#VT_1,_v_regs+VSDD_R11	* ...
+		bcc	vw3b			* ...
+*
+vw4b:		cmp.w	#VT_2,_v_regs+VSDD_R11	* ...
+		bcs	vw4b			* ...
+*
+		move.w	OLDB,d0			* setup to return OLDB
+*
+L1:		tst.l	(sp)+			* fixup stack
+		movem.l	(sp)+,OLDB-NEWB		* restore registers
+		unlk	a6			* unlink stack frames
+		rts				* return to caller
+*
+		.page
+*
+* ------------------------------------------------------------------------------
+*	vfwait() -- Wait for a FRAMESTOP update to transpire.
+* ------------------------------------------------------------------------------
+*
+_vfwait:	link	a6,#0			* link stack frames
+*
+vw1a:		cmp.w	#VT_1,_v_regs+VSDD_R11	* wait for FRAMESTOP
+		bcc	vw1a			* ...
+*
+vw2a:		cmp.w	#VT_1,_v_regs+VSDD_R11	* ...
+		bcs	vw2a			* ...
+*
+vw3a:		cmp.w	#VT_1,_v_regs+VSDD_R11	* ...
+		bcc	vw3a			* ...
+*
+vw4a:		cmp.w	#VT_2,_v_regs+VSDD_R11	* ...
+		bcs	vw4a			* ...
+*
+		unlk	a6			* unlink stack frames
+		rts				* return to caller
+*
+		.end
Index: vlib/vbfill4.c
===================================================================
--- vlib/vbfill4.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/vbfill4.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,266 @@
+/*
+   =============================================================================
+	vbfill4.c -- video block fill blitter for 4 bit per pixel objects
+	Version 3 -- 1987-08-04 -- D.N. Lynx Crowe
+
+	Fills an area with a color.  Coded for speed, not space.
+   =============================================================================
+*/
+
+static short	fm[] = {	/* fill masks */
+
+	0x000F,
+	0x00FF,
+	0x0FFF,
+	0xFFFF,
+
+	0x00F0,
+	0x0FF0,
+	0xFFF0,
+
+	0x0F00,
+	0xFF00,
+
+	0xF000
+};
+
+/* 
+
+*/
+
+vbfill4(obj, obwidth, xmin, ymin, xmax, ymax, color)
+unsigned *obj;
+short obwidth, xmin, ymin, xmax, ymax;
+register unsigned color;
+{
+	short mw, nl, width;
+
+	register unsigned *fwp, *wp;
+
+	register unsigned lmask, rmask;
+	register short i, j;
+
+	fwp = obj + (long)(xmin >> 2) + ((long)ymin * obwidth);
+	width = xmax - xmin + 1;
+	nl = ymax - ymin + 1;
+	lmask = rmask = 0;
+
+/* 
+
+*/
+	switch (xmin & 3) {
+
+	case 0:
+
+		if (width > 4) {
+
+			width -= 5;
+			lmask = fm[3];
+			mw = width >> 2;
+
+			if (mw) {
+
+				rmask = fm[width & 3];
+
+				for (i = 0; i < nl; i++) {
+
+					wp = fwp;
+					fwp += obwidth;
+					*wp++ = (*wp & ~lmask) | (color & lmask);
+
+					for (j = 0; j < mw; j++)
+						*wp++ = color;
+
+					*wp = (*wp & ~rmask) | (color & rmask);
+				}
+
+			} else {
+
+				rmask = fm[width & 3];
+
+				for (i = 0; i < nl; i++) {
+
+					wp = fwp;
+					fwp += obwidth;
+					*wp++ = (*wp & ~lmask) | (color & lmask);
+					*wp = (*wp & ~rmask) | (color & rmask);
+				}
+			}
+
+		} else {
+
+			lmask = fm[width - 1];
+
+			for (i = 0; i < nl; i++)  {
+
+				wp = fwp;
+				fwp += obwidth;
+				*wp = (*wp & ~lmask) | (color & lmask);
+			}
+		}
+
+		return;
+
+/* 
+
+*/
+	case 1:
+
+		if (width > 3) {
+
+			width -= 4;
+			lmask = fm[6];
+			mw = width >> 2;
+
+			if (mw) {
+
+				rmask = fm[width & 3];
+
+				for (i = 0; i < nl; i++) {
+
+					wp = fwp;
+					fwp += obwidth;
+					*wp++ = (*wp & ~lmask) | (color & lmask);
+
+					for (j = 0; j < mw; j++)
+						*wp++ = color;
+
+					*wp = (*wp & ~rmask) | (color & rmask);
+				}
+
+			} else {
+
+				rmask = fm[width & 3];
+
+				for (i = 0; i < nl; i++) {
+
+					wp = fwp;
+					fwp += obwidth;
+					*wp++ = (*wp & ~lmask) | (color & lmask);
+					*wp = (*wp & ~rmask) | (color & rmask);
+				}
+			}
+
+		} else {
+
+			lmask = fm[width + 3];
+
+			for (i = 0; i < nl; i++) {
+
+				wp = fwp;
+				fwp += obwidth;
+				*wp = (*wp & ~lmask) | (color & lmask);
+			}
+		}
+
+		return;
+
+/* 
+
+*/
+	case 2:
+
+		if (width > 2) {
+
+			width -= 3;
+			lmask = fm[8];
+			mw = width >> 2;
+
+			if (mw) {
+
+				rmask = fm[width & 3];
+
+				for (i = 0; i < nl; i++) {
+
+					wp = fwp;
+					fwp += obwidth;
+					*wp++ = (*wp & ~lmask) | (color & lmask);
+
+					for (j = 0; j < mw; j++)
+						*wp++ = color;
+
+					*wp = (*wp & ~rmask) | (color & rmask);
+				}
+
+			} else {
+
+				rmask = fm[width & 3];
+
+				for (i = 0; i < nl; i++) {
+
+					wp = fwp;
+					fwp += obwidth;
+					*wp++ = (*wp & ~lmask) | (color & lmask);
+					*wp = (*wp & ~rmask) | (color & rmask);
+				}
+			}
+
+		} else {
+
+			lmask = fm[width + 6];
+
+			for (i = 0; i < nl; i++) {
+
+				wp = fwp;
+				fwp += obwidth;
+				*wp = (*wp & ~lmask) | (color & lmask);
+			}
+		}
+
+		return;
+
+/* 
+
+*/
+	case 3:
+
+		if (width > 1) {
+
+			width -= 2;
+			lmask = fm[9];
+			mw = width >> 2;
+
+			if (mw) {
+
+				rmask = fm[width & 3];
+
+				for (i = 0; i < nl; i++) {
+
+					wp = fwp;
+					fwp += obwidth;
+					*wp++ = (*wp & ~lmask) | (color & lmask);
+
+					for (j = 0; j < mw; j++)
+						*wp++ = color;
+
+					*wp = (*wp &~rmask) | (color & rmask);
+				}
+
+			} else {
+
+				rmask = fm[width & 3];
+
+				for (i = 0; i < nl; i++) {
+
+					wp = fwp;
+					fwp += obwidth;
+					*wp++ = (*wp & ~lmask) | (color & lmask);
+					*wp = (*wp & ~rmask) | (color & rmask);
+				}
+			}
+
+		} else {
+
+			lmask = fm[9];
+
+			for (i = 0; i < nl; i++) {
+
+				wp = fwp;
+				fwp += obwidth;
+				*wp = (*wp & ~lmask) | (color & lmask);
+			}
+		}
+
+		return;
+	}
+}
Index: vlib/vclrav.s
===================================================================
--- vlib/vclrav.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/vclrav.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,51 @@
+* ------------------------------------------------------------------------------
+* vclrav.s -- clear a character's attributes in video RAM
+* Version 1 -- 1988-10-11 -- D.N. Lynx Crowe
+* (c) Copyright 1988 -- D.N. Lynx Crowe
+* ------------------------------------------------------------------------------
+*
+*	vclrav(adr, row, col, atr, len)
+*	unsigned int *adr, row, col, atr, len;
+*
+*		Clears attribute 'atr' at ('row', 'col') in the
+*		full attribute text object at 'adr'
+*		using a line length of 'len'.
+* ------------------------------------------------------------------------------
+		.text
+*
+		.xdef	_vclrav
+*
+P_ADR		.equ	8
+P_ROW		.equ	12
+P_COL		.equ	14
+P_ATR		.equ	16
+P_LEN		.equ	18
+*
+_vclrav:	link	a6,#0		* Link stack frame pointer
+		move.w	P_ROW(a6),d0	* Get row
+		mulu	P_LEN(a6),d0	* Multiply by len
+		clr.l	d1		* Clear out d1
+		move.w	P_COL(a6),d1	* Get col
+		add.l	d1,d0		* Add col into d0 to get char. #
+		move.l	d0,d1		* Develop cw = (cn/2)*6 in d1
+		andi.l	#$FFFFFFFE,d1	* ...
+		move.l	d1,d2		* ...
+		add.l	d1,d1		* ...
+		add.l	d2,d1		* ...
+		add.l	P_ADR(a6),d1	* Add sbase to cw
+		movea.l	d1,a0		* a0 points at the word with the char.
+		btst.l	#0,d0		* Odd char. location ?
+		bne	vclrav1		* Jump if so
+*
+		addq.l	#2,a0		* Point at the attribute word
+		bra	vclravx		* Go set attribute
+*
+vclrav1:	addq.l	#4,a0		* Point at the attribute word
+*
+vclravx:	move.w	P_ATR(a6),d0	* Get attribute mask
+		not.w	d0		* Complement the mask
+		and.w	d0,(a0)		* Clear attributes in video RAM
+		unlk	a6		* Unlink the stack frame
+		rts			* Return to caller
+*
+		.end
Index: vlib/vclrs.c
===================================================================
--- vlib/vclrs.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/vclrs.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,34 @@
+/*
+   =============================================================================
+	vclrs.c -- clear a VSDD text line to a specified value
+	Version 2 -- 1987-04-15 -- D.N. Lynx Crowe
+	(c) Copyright 1987 -- D.N. Lynx Crowe
+
+	vclrs(obase, row, col, nc, ch, atr)
+	unsigned int obase[];
+	int row, col, nc, ch, atr;
+
+		Clear 'nc' characters in the text object 'obase' to 'ch',
+		using atrributes 'atr', starting at ('row','col');
+
+		No error checking is done, so beware.
+   =============================================================================
+*/
+
+extern	int	vputc();
+
+/*
+   =============================================================================
+	vclrs(obase, row, col, nc, ch, atr) -- clear a line on the VSDD
+   =============================================================================
+*/
+
+vclrs(obase, row, col, nc, ch, atr)
+register unsigned int obase[];
+int row, col;
+register int nc;
+int ch, atr;
+{
+	while (nc--)
+		vputc(obase, row, col++, ch, atr);
+}
Index: vlib/vcputs.s
===================================================================
--- vlib/vcputs.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/vcputs.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,140 @@
+* ------------------------------------------------------------------------------
+* vcputs.s -- output a character string to a 4-bit per pixel graphics window
+* Version 3 -- 1987-07-31 -- D.N. Lynx Crowe
+* (c) Copyright 1987 -- D.N. Lynx Crowe
+* ------------------------------------------------------------------------------
+*
+*	vcputs(obase, nw, fg, bg, row, col, str)
+*	int *obase, nw, fg, bg, row, col;
+*	char *str;
+*
+*		Outputs characters from the string at 'str' to an 'nw'
+*		character wide 4-bit per pixel graphics window at 'obase'
+*		at ('row','col'), using 'fg' as the foreground color, and
+*		'bg' as the background color.  Uses cgtable[][256] as the
+*		VSDD formatted character generator table.
+*		No error checks are done.
+*
+* ------------------------------------------------------------------------------
+		.text
+*
+		.xdef	_vcputs
+*
+		.xref	_cgtable
+*
+* Argument offsets from a6:
+*
+OBASE		.equ	8		* Output area base address
+NW		.equ	12		* Character width of output area
+FG		.equ	14		* Foreground color
+BG		.equ	16		* Background color
+ROW		.equ	18		* Row
+COL		.equ	20		* Column
+STR		.equ	22		* String base address
+*
+* Program constant definitions:
+*
+HPIX		.equ	8		* Character width in pixels
+VPIX		.equ	12		* Character height in pixels
+HCW		.equ	4		* Horizontal character width (bytes)
+PSHIFT		.equ	12		* Pixel shift into MS bits
+HSHIFT		.equ	4		* Pixel right shift
+*
+		.page
+*
+* Register usage:
+*
+*	d0	output word and scratch
+*	d1	CG word and scratch
+*	d2	pixel counter
+*
+*	d3	foreground color (in the 4 ms bits)
+*	d4	background color (in the 4 ms bits)
+*	d5	width of the area in bytes
+*	d6	scan line counter
+*
+*	a0	CG table pointer
+*	a1	output area scan line pointer
+*	a2	input string character pointer
+*
+*	a3	output area character base pointer
+*
+		.page
+*
+_vcputs:	link	a6,#0		* Link stack frames
+		movem.l	d3-d6/a3,-(a7)	* Save registers we use
+		move.w	#PSHIFT,d1	* Set shift constant
+		move.w	FG(a6),d3	* Setup foreground color
+		lsl.w	d1,d3		* ... in ms 4 bits of d3.W
+		move.w	BG(a6),d4	* Setup background color
+		lsl.w	d1,d4		* ... in ms 4 bits of d4.W
+		move.w	NW(a6),d5	* Get line width in d5.W
+		lsl.w	#2,d5		* Multiply width by 4 for offset
+		move.w	ROW(a6),d0	* Calculate output address
+		move.w	#VPIX,d1	* ... VPIX
+		mulu	d1,d0		* ... * ROW
+		add.w	#VPIX-1,d0	* ... + VPIX-1
+		mulu	d5,d0		* ... * NW
+		clr.l	d1		* ...
+		move.w	COL(a6),d1	* ... + 
+		lsl.w	#2,d1		* ... COL * 4
+		add.l	d1,d0		* ...
+		add.l	OBASE(a6),d0	* ... + OBASE
+		movea.l	d0,a3		* Leave output address in a3
+		movea.l	STR(a6),a2	* Put string address in a2
+*
+cgl0:		clr.l	d0		* Clear out upper bits of d0
+		move.b	(a2)+,d0	* Get next character
+		beq	cgl5		* Done if character EQ 0
+*
+		movea.l	a3,a1		* Establish output pointer in a1
+		adda.l	#HCW,a3		* Update output pointer for next char.
+		lea	_cgtable,a0	* Establish CG pointer in a0
+		lsl.w	#1,d0		* ... 2 * character
+		adda.w	d0,a0		* ... + _cgtable address
+		move.w	#VPIX-1,d6	* Set scan line counter in d6
+*
+		.page
+cgl1:		move.w	(a0),d1		* Get character generator word in d1
+		move.w	#(HPIX/2)-1,d2	* Set pixel counter in d2
+*
+cgl2:		lsr.w	#HSHIFT,d0	* Shift output word right 1 pixel
+		btst.l	#0,d1		* Check CG word ls bit
+		beq	cgl3		* Set background color if bit EQ 0
+*
+		or.w	d3,d0		* OR foreground color into output word
+		bra	cgl4		* Go update CG word
+*
+cgl3:		or.w	d4,d0		* OR background color into output word
+*
+cgl4:		lsr.w	#1,d1		* Shift CG word right 1 pixel
+		dbf	d2,cgl2		* Loop for first 4 pixels
+*
+		move.w	d0,(a1)+	* Store first output word in scan line
+		move.w	#(HPIX/2)-1,d2	* Set pixel counter in d2
+*
+cgl2a:		lsr.w	#HSHIFT,d0	* Shift output word right 1 pixel
+		btst.l	#0,d1		* Check CG word ls bit
+		beq	cgl3a		* Set background color if bit EQ 0
+*
+		or.w	d3,d0		* OR foreground color into output word
+		bra	cgl4a		* Go update CG word
+*
+cgl3a:		or.w	d4,d0		* OR background color into output word
+*
+cgl4a:		lsr.w	#1,d1		* Shift CG word right 1 pixel
+		dbf	d2,cgl2a	* Loop for last 4 pixels
+*
+		move.w	d0,(a1)		* Store second output word in scan line
+		suba.w	d5,a1		* Update output pointer
+		suba.w	#2,a1		* ...
+		adda.l	#512,a0		* Update CG pointer for next scan line
+		dbf	d6,cgl1		* Loop for all scan lines
+*
+		bra	cgl0		* Loop for next character
+*
+cgl5:		movem.l	(a7)+,d3-d6/a3	* Restore registers
+		unlk	a6		* Unlink stack frames
+		rts			* Return to caller
+*
+		.end
Index: vlib/vcputsv.s
===================================================================
--- vlib/vcputsv.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/vcputsv.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,147 @@
+* ------------------------------------------------------------------------------
+* vcputsv.s -- output characters to a 4-bit / pixel graphics window
+* with variable vertical pitch
+* Version 2 -- 1987-08-03 -- D.N. Lynx Crowe
+* (c) Copyright 1987 -- D.N. Lynx Crowe
+* ------------------------------------------------------------------------------
+*
+*	vcputsv(obase, nw, fg, bg, row, col, str. pitch)
+*	int *obase, nw, fg, bg, row, col, pitch;
+*	char *str;
+*
+*		Outputs characters from the string at 'str' to an 'nw'
+*		character wide 4-bit per pixel graphics window at 'obase'
+*		at ('row','col'), using 'fg' as the foreground color, and
+*		'bg' as the background color.  Uses cgtable[][256] as the
+*		VSDD formatted character generator table.  Assumes 12 bit
+*		high characters in the cgtable.  Uses 'pitch' as the vertical
+*		spacing between character rows.  No error checks are done.
+*		The string must fit the output area (no overlaps, single line).
+*
+* ------------------------------------------------------------------------------
+		.text
+*
+		.xdef	_vcputsv
+*
+		.xref	_cgtable
+*
+* Argument offsets from a6:
+*
+OBASE		.equ	8		* LONG - Output area base address
+NW		.equ	12		* WORD - Character width of output area
+FG		.equ	14		* WORD - Foreground color
+BG		.equ	16		* WORD - Background color
+ROW		.equ	18		* WORD - Row
+COL		.equ	20		* WORD - Column
+STR		.equ	22		* LONG - String base address
+PITCH		.equ	26		* WORD - Vertical spacing between rows
+*
+* Program constant definitions:
+*
+HPIX		.equ	8		* Character width in pixels
+VPIX		.equ	12		* Character height in pixels
+HCW		.equ	4		* Horizontal character width (bytes)
+PSHIFT		.equ	12		* Pixel shift into MS bits
+HSHIFT		.equ	4		* Pixel right shift
+*
+		.page
+*
+* Register usage:
+*
+*	d0	output word and scratch
+*	d1	CG word and scratch
+*	d2	pixel counter
+*
+*	d3	foreground color (in the 4 ms bits)
+*	d4	background color (in the 4 ms bits)
+*	d5	width of the area in bytes
+*	d6	scan line counter
+*
+*	a0	CG table pointer
+*	a1	output area scan line pointer
+*	a2	input string character pointer
+*
+*	a3	output area character base pointer
+*
+*	a6	frame pointer
+*	a7	stack pointer
+*
+		.page
+*
+_vcputsv:	link	a6,#0		* Link stack frames
+		movem.l	d3-d6/a3,-(a7)	* Save registers we use
+		move.w	#PSHIFT,d1	* Set shift constant
+		move.w	FG(a6),d3	* Setup foreground color
+		lsl.w	d1,d3		* ... in ms 4 bits of d3.W
+		move.w	BG(a6),d4	* Setup background color
+		lsl.w	d1,d4		* ... in ms 4 bits of d4.W
+		move.w	NW(a6),d5	* Get line width in d5.W
+		lsl.w	#2,d5		* Multiply width by 4 for offset
+		move.w	ROW(a6),d0	* Calculate output address
+		move.w	PITCH(a6),d1	* ... PITCH
+		mulu	d1,d0		* ... * ROW
+		add.w	#VPIX-1,d0	* ... + VPIX-1
+		mulu	d5,d0		* ... * NW
+		clr.l	d1		* ...
+		move.w	COL(a6),d1	* ... + 
+		lsl.w	#2,d1		* ... COL * 4
+		add.l	d1,d0		* ...
+		add.l	OBASE(a6),d0	* ... + OBASE
+		movea.l	d0,a3		* Leave output address in a3
+		movea.l	STR(a6),a2	* Put string address in a2
+*
+cgl0:		clr.l	d0		* Clear out upper bits of d0
+		move.b	(a2)+,d0	* Get next character
+		beq	cgl5		* Done if character EQ 0
+*
+		movea.l	a3,a1		* Establish output pointer in a1
+		adda.l	#HCW,a3		* Update output pointer for next char.
+		lea	_cgtable,a0	* Establish CG pointer in a0
+		lsl.w	#1,d0		* ... 2 * character
+		adda.w	d0,a0		* ... + _cgtable address
+		move.w	#VPIX-1,d6	* Set scan line counter in d6
+*
+		.page
+cgl1:		move.w	(a0),d1		* Get character generator word in d1
+		move.w	#(HPIX/2)-1,d2	* Set pixel counter in d2
+*
+cgl2:		lsr.w	#HSHIFT,d0	* Shift output word right 1 pixel
+		btst.l	#0,d1		* Check CG word ls bit
+		beq	cgl3		* Set background color if bit EQ 0
+*
+		or.w	d3,d0		* OR foreground color into output word
+		bra	cgl4		* Go update CG word
+*
+cgl3:		or.w	d4,d0		* OR background color into output word
+*
+cgl4:		lsr.w	#1,d1		* Shift CG word right 1 pixel
+		dbf	d2,cgl2		* Loop for first 4 pixels
+*
+		move.w	d0,(a1)+	* Store first output word in scan line
+		move.w	#(HPIX/2)-1,d2	* Set pixel counter in d2
+*
+cgl2a:		lsr.w	#HSHIFT,d0	* Shift output word right 1 pixel
+		btst.l	#0,d1		* Check CG word ls bit
+		beq	cgl3a		* Set background color if bit EQ 0
+*
+		or.w	d3,d0		* OR foreground color into output word
+		bra	cgl4a		* Go update CG word
+*
+cgl3a:		or.w	d4,d0		* OR background color into output word
+*
+cgl4a:		lsr.w	#1,d1		* Shift CG word right 1 pixel
+		dbf	d2,cgl2a	* Loop for last 4 pixels
+*
+		move.w	d0,(a1)		* Store second output word in scan line
+		suba.w	d5,a1		* Update output pointer
+		suba.w	#2,a1		* ...
+		adda.l	#512,a0		* Update CG pointer for next scan line
+		dbf	d6,cgl1		* Loop for all scan lines
+*
+		bra	cgl0		* Loop for next character
+*
+cgl5:		movem.l	(a7)+,d3-d6/a3	* Restore registers
+		unlk	a6		* Unlink stack frames
+		rts			* Return to caller
+*
+		.end
Index: vlib/vhinit.c
===================================================================
--- vlib/vhinit.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/vhinit.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,99 @@
+/*
+   =============================================================================
+	vhinit.c -- initialize VSDD hardware
+	Version 17 -- 1988-03-20 -- D.N. Lynx Crowe
+	(c) Copyright 1987, 1988 -- D.N. Lynx Crowe
+
+	VHinit()
+
+		Setup VSDD registers, clear access table, clear object table,
+		load character generator, set color lookup table defaults.
+		Defines major video system variables, since the linker isn't
+		smart enough to let me put them in a separate file.
+   =============================================================================
+*/
+
+#define	FASTCHIP	1	/* non-zero if it's the fast VSDD chip */
+
+#include "hwdefs.h"
+#include "vsdd.h"
+#include "memory.h"
+
+#define	VREG(h,v)	((h<<10)|v)
+
+extern	int	cgtable[];
+extern	int	cg_rows;
+
+struct octent	v_obtab[16];	/* object control table */
+
+struct octent	*v_curob;	/* current v_obtab pointer */
+
+int	v_nobj;			/* current object number */
+int	v_obpri;		/* current object priority */
+
+/* 
+ */
+
+/* initialized variables */
+
+int	vr_data[] = {
+
+	0x825B,		/* R0  -- Mode word 0 */
+	0xC474,		/* R1  -- Mode word 1 */
+	0x0006,		/* R2  -- Register window base, Control flags */
+	0x0100,		/* R3  -- Data window base, X limit	(0x200000) */
+	0x0000,		/* R4  -- Data length mask		(128K) */
+	0x0000,		/* R5  -- Data segment base		(0x000000) */
+	0x0001,		/* R6  -- Priority access count		(1) */
+	0x0040,		/* R7  -- Object Descriptor Table base	(0x200080) */
+	0x0080,		/* R8  -- Access Table base		(0x200100) */
+	0x0010,		/* R9  -- Color Lookup Table base	(0x200020) */
+	0x00FF,		/* R10 -- Character Generator bases	(0x21E000) */
+	0x0000,		/* R11 -- Access Table address counter */
+
+#if	FASTCHIP
+	VREG( 3,   8),	/* R12 -- HC0 (HSYNC width)	VC0 (VSYNC width) */
+	VREG( 5,  10),	/* R13 -- HC1 (AHZ start)	VC1 (AVZ start) */
+	VREG(37, 360),	/* R14 -- HC2 (AHZ stop)	VC2 (AVZ stop) */
+	VREG(40, 362)	/* R15 -- HC3 (HOR sweep)	VC3 (VRT sweep) */
+#else
+	VREG( 3,   8),	/* R12 -- HC0 (HSYNC width)	VC0 (VSYNC width) */
+	VREG( 6,  10),	/* R13 -- HC1 (AHZ start)	VC1 (AVZ start) */
+	VREG(38, 360),	/* R14 -- HC2 (AHZ stop)	VC2 (AVZ stop) */
+	VREG(43, 361)	/* R15 -- HC3 (HOR sweep)	VC3 (VRT sweep) */
+#endif
+};
+
+/* 
+ */
+
+/*
+   =============================================================================
+	VHinit() -- initialize the VSDD
+   =============================================================================
+*/
+
+VHinit()
+{
+
+	/* select VSDD RAM bank 0 so we can access the control tables */
+
+	vbank(0);
+
+	/* set the video register values */
+
+	memcpyw(v_regs, vr_data, 16);
+
+	/* clear the access table to turn off all objects */
+
+	memsetw(v_actab, 0xFFFF, 350);
+
+	/* clear the object table */
+
+	memsetw(v_odtab, 0, 64);
+
+	/* move the character generator table to VSDD RAM */
+
+	memsetw(v_cgtab, 0, 4096);
+	memcpyw(v_cgtab, cgtable, 256 * cg_rows);
+}
Index: vlib/viint.s
===================================================================
--- vlib/viint.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/viint.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,232 @@
+* ------------------------------------------------------------------------------
+* viint.s -- VSDD Vertical Interval interrupt handler for the Buchla 700
+* Version 17 -- 1989-12-19 -- D.N. Lynx Crowe
+*
+*	VIint
+*
+*		VSDD Vertical Interval interrupt handler.  Enables display of
+*		any object whose bit is set in vi_ctl.  Bit 0 = object 0, etc.
+*
+*		SetPri() uses BIOS(B_SETV, 25, VIint) to set the interrupt
+*		vector and lets VIint() enable the object.  If vi_dis
+*		is set, SetPri() won't enable the interrupt or set the vector
+*		so that several objects can be started up at once.
+*
+*		This routine also sets the base address and scroll offset
+*		for the score display object if vi_sadr is non-zero,
+*		after a delay for VSDD FRAMESTOP synchronization.
+* ------------------------------------------------------------------------------
+		.text
+*
+		.xdef	_VIint			* Vertical Interval int. handler
+*
+		.xdef	_vi_sadr		* score object base address
+		.xdef	_vi_scrl		* score object scroll offset
+		.xdef	lclsadr			* local scroll address
+		.xdef	lclscrl			* local scroll offset
+		.xdef	vdelay			* VSDD scroll delay
+*
+		.xdef	VIct1			* VSDD interrupt R11 
+		.xdef	VIct2			* VSDD interrupt R11 
+		.xdef	VIct3			* VSDD interrupt R11 
+		.xdef	VIct4			* VSDD interrupt R11 
+*
+		.xref	_v_regs			* VSDD registers
+		.xref	_v_odtab		* VSDD object descriptor table
+*
+		.xref	_vi_clk			* scroll delay timer
+		.xref	_vi_ctl			* unblank control word
+		.xref	_vi_tag			* VSDD 'needs service' tag
+*
+		.page
+*
+* Miscellaneous equates:
+* ----------------------
+*
+DELAY		.equ	17			* FRAMESTOP sync delay in Ms
+STACKSR		.equ	32			* offset to sr on stack
+V_BLA		.equ	4			* V_BLA (blank) bit number
+VSDD_R5		.equ	10			* VSDD R5 byte offset in _v_regs
+VSDD_R11	.equ	22			* VSDD R11 byte offset in _v_regs
+*
+VT_BASE		.equ	128			* word offset of VSDD Access Table
+*
+VT_1		.equ	VT_BASE+300		* high time
+VT_2		.equ	VT_BASE+2		* low time
+* ------------------------------------------------------------------------------
+*
+* Stack picture after movem.l at entry:
+* -------------------------------------
+*
+*	LONG	PC	+34
+*	WORD	SR	+32	STACKSR
+*	LONG	A6	+28
+*	LONG	A2	+24
+*	LONG	A1	+20
+*	LONG	A0	+16
+*	LONG	D3	+12
+*	LONG	D2	+8
+*	LONG	D1	+4
+*	LONG	D0	+0
+*
+* ------------------------------------------------------------------------------
+*
+		.page
+*
+* _VIint -- Vertical interval interrupt handler
+* ------    -----------------------------------
+_VIint:		movem.l	d0-d3/a0-a2/a6,-(a7)	* save registers
+		addi.w	#$0100,STACKSR(a7)	* raise IPL in sr on the stack
+*
+		move.w	_v_regs+VSDD_R11,VIct1	* save the VSDD R11 value
+*
+		tst.w	_vi_sadr		* see if we should scroll
+		beq	viunbl			* jump if not
+*
+* ------------------------------------------------------------------------------
+* setup delayed scroll parameters
+* ------------------------------------------------------------------------------
+		move.w	_v_regs+VSDD_R5,d0	* get VSDD R5
+		move.w	d0,d1			* save it for later
+		andi.w	#$0180,d0		* see if we're already in bank 0
+		beq	dlyscrl			* jump if so
+*
+		clr.w	_v_regs+VSDD_R5		* set bank 0
+*
+		move.w	_v_regs+VSDD_R11,VIct2	* save the VSDD R11 value
+*
+vw1a:		cmp.w	#VT_1,_v_regs+VSDD_R11	* wait for FRAMESTOP
+		bcc	vw1a			* ...
+*
+vw2a:		cmp.w	#VT_1,_v_regs+VSDD_R11	* ...
+		bcs	vw2a			* ...
+*
+vw3a:		cmp.w	#VT_1,_v_regs+VSDD_R11	* ...
+		bcc	vw3a			* ...
+*
+vw4a:		cmp.w	#VT_2,_v_regs+VSDD_R11	* ...
+		bcs	vw4a			* ...
+*
+dlyscrl:	tst.w	_vi_tag			* wait for previous scroll
+		bne	dlyscrl			* ...
+*
+		move.w	_vi_sadr,lclsadr	* save address for timeint
+		move.w	_vi_scrl,lclscrl	* save offset for timeint
+		clr.w	_vi_sadr		* reset for next time
+		clr.w	_vi_scrl		* ...
+		move.w	vdelay,_vi_clk		* set the scroll delay timer
+		st	_vi_tag			* set the 'need service' tag
+* ------------------------------------------------------------------------------
+* check for unblank requests
+* ------------------------------------------------------------------------------
+		move.w	_vi_ctl,d2		* get the unblank control word
+		beq	viexit			* exit if nothing to unblank
+*
+		bra	unblnk			* go unblank some objects
+*
+viunbl:		move.w	_vi_ctl,d2		* get the unblank control word
+		beq	vidone			* exit if nothing to unblank
+*
+		move.w	_v_regs+VSDD_R5,d0	* get VSDD R5
+		move.w	d0,d1			* save it for later
+		andi.w	#$0180,d0		* see if we're already in bank 0
+		beq	unblnk			* jump if so
+*
+		clr.w	_v_regs+VSDD_R5		* set bank 0
+*
+		move.w	_v_regs+VSDD_R11,VIct3	* save the VSDD R11 value
+*
+vw1b:		cmp.w	#VT_1,_v_regs+VSDD_R11	* wait for FRAMESTOP
+		bcc	vw1b			* ...
+*
+vw2b:		cmp.w	#VT_1,_v_regs+VSDD_R11	* ...
+		bcs	vw2b			* ...
+*
+vw3b:		cmp.w	#VT_1,_v_regs+VSDD_R11	* ...
+		bcc	vw3b			* ...
+*
+vw4b:		cmp.w	#VT_2,_v_regs+VSDD_R11	* ...
+		bcs	vw4b			* ...
+*
+		.page
+*
+* ------------------------------------------------------------------------------
+* unblank objects indicated by contents of d2  (loaded earlier from _vi_ctl)
+* ------------------------------------------------------------------------------
+*
+unblnk:		clr.w	d3			* clear the counter
+		clr.w	_vi_ctl			* clear the unblank control word
+		lea	_v_odtab,a1		* point at first object
+*
+vicheck:	btst	d3,d2			* check the object bit
+		beq	vinext			* go check next one if not set
+*
+		move.w	(a1),d0			* get v_odtab[obj][0]
+		bclr	#V_BLA,d0		* clear the blanking bit
+		move.w	d0,(a1)			* set v_odtab[obj][0]
+*
+vinext:		cmpi.w	#15,d3			* see if we're done
+		beq	viexit			* jump if so
+*
+		addq.l	#8,a1			* point at next object
+		addq.w	#1,d3			* increment object counter
+		bra	vicheck			* go check next object
+*
+* ------------------------------------------------------------------------------
+* switch back to the bank the interrupted code was using if we changed it
+* ------------------------------------------------------------------------------
+*
+viexit:		move.w	d1,d0			* see if we were in bank 0
+		andi.w	#$0180,d0		* ...
+		beq	vidone			* jump if so
+*
+viwait:		tst.w	_vi_tag			* wait for timer to run out
+		bne	viwait			* ... so timeint sees bank 0
+*
+		move.w	d1,_v_regs+VSDD_R5	* restore v_regs[5] to old bank
+*
+		move.w	_v_regs+VSDD_R11,VIct4	* save the VSDD R11 value
+*
+vw1c:		cmp.w	#VT_1,_v_regs+VSDD_R11	* wait for FRAMESTOP
+		bcc	vw1c			* ...
+*
+vw2c:		cmp.w	#VT_1,_v_regs+VSDD_R11	* ...
+		bcs	vw2c			* ...
+*
+vw3c:		cmp.w	#VT_1,_v_regs+VSDD_R11	* ...
+		bcc	vw3c			* ...
+*
+vw4c:		cmp.w	#VT_2,_v_regs+VSDD_R11	* ...
+		bcs	vw4c			* ...
+*
+* ------------------------------------------------------------------------------
+* restore registers and return to interrupted code
+* ------------------------------------------------------------------------------
+*
+vidone:		movem.l	(a7)+,d0-d3/a0-a2/a6	* restore registers
+		rte				* return from interrupt
+*
+		.page
+*
+* ------------------------------------------------------------------------------
+		.data
+* ------------------------------------------------------------------------------
+*
+vdelay:		.dc.w	DELAY			* VSDD scroll delay
+*
+* ------------------------------------------------------------------------------
+		.bss
+* ------------------------------------------------------------------------------
+*
+_vi_sadr:	.ds.w	1			* score object base address
+_vi_scrl:	.ds.w	1			* score object scroll offset
+*
+lclsadr:	.ds.w	1			* local copy of vi_sadr
+lclscrl:	.ds.w	1			* local copy of vi_scrl
+*
+VIct1:		.ds.w	1			* VSDD R11 value at interrupt
+VIct2:		.ds.w	1			* VSDD R11 value at interrupt
+VIct3:		.ds.w	1			* VSDD R11 value at interrupt
+VIct4:		.ds.w	1			* VSDD R11 value at interrupt
+*
+		.end
Index: vlib/vmput.c
===================================================================
--- vlib/vmput.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/vmput.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,82 @@
+/*
+   =============================================================================
+	vmput.c -- video menu put functions
+	Version 3 -- 1987-03-30 -- D.N. Lynx Crowe
+	(c) Copyright 1987 -- D.N. Lynx Crowe
+
+	vmput(sbase, row, col, ms, ma)
+	uint *sbase, rwo, col, ma;
+	char *ms[];
+
+		Copies lines from ms, with attribute ma, to sbase at (row,col).
+
+	vmputa(sbase, row, col, ms, ma)
+	uint *sbase, row, col, *ma;
+	char *ms[];
+
+		Copies lines from ms, with attributes from ma, to sbase at (row,col).
+   =============================================================================
+*/
+
+typedef	unsigned int	uint;
+
+extern	int	vputc();
+
+/*
+   =============================================================================
+	vmput(sbase, row, col, ms, ma) -- put a menu item in a screen image.
+	Copies lines from ms, with attribute ma, to sbase at (row,col).
+   =============================================================================
+*/
+
+vmput(sbase, row, col, ms, ma)
+uint *sbase, row, col, ma;
+char *ms[];
+{
+	register uint c, tc, tr;
+	char *cp;
+
+	tr = row;
+
+	while (cp = *ms++) {
+
+		tc = col;
+
+		while (c = *cp++)
+			vputc(sbase, tr, tc++, c, ma);
+
+		tr++;
+	}
+}
+
+/* 
+ */
+
+/*
+   =============================================================================
+	vmputa(sbase, row, col, ms, ma) -- put a menu item in a screen image.
+	Copies lines from ms, with attributes from ma, to sbase at (row,col).
+   =============================================================================
+*/
+
+vmputa(sbase, row, col, ms, ma)
+uint *sbase, row, col, *ma[];
+char *ms[];
+{
+	register uint c, tc, tr;
+	uint *tm;
+	char *cp;
+
+	tr = row;
+
+	while (cp = *ms++) {
+
+		tc = col;
+		tm = *ma++;
+
+		while (c = *cp++)
+			vputc(sbase, tr, tc++, c, *tm++);
+
+		tr++;
+	}
+}
Index: vlib/vobjfns.c
===================================================================
--- vlib/vobjfns.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/vobjfns.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,273 @@
+/*
+   =============================================================================
+	vobjfns.c -- VSDD object functions
+	Version 23 -- 1988-01-29 -- D.N. Lynx Crowe
+	(c) Copyright 1987,1988 -- D.N. Lynx Crowe
+
+	SelObj(obj)
+	int obj;
+
+		Select 'obj' as the current working object.
+
+	SetPri(obj, pri)
+	int obj, pri;
+
+		Display object 'obj' with priority 'pri'.
+
+	SetObj(obj, type, bank, base, xpix, ypix, x0, y0, flags, pri)
+	int obj, type, bank, xpix, ypix, x0, y0, flags, pri;
+	unsigned int *base;
+
+		Setup object 'obj' of type 'type' at 'base' in bank 'bank'
+		with height 'ypix' and width 'xpix' at initial location
+		'x0','y0', with flags 'flags'.  Assumes HRS EQ 1.
+		If 'pri' >= 0, display the object at priority level 'pri'.
+		Define a bitmap object if 'type' EQ 0, or a character object
+		if 'type' NE 0.
+
+	CpyObj(from, to, w, h, sw)
+	unsigned int *from, *to;
+	int w, h, sw;
+
+		Copy a 'w'-word by 'h'-line object from 'from' to 'to' with
+		a destination width of 'sw' words.
+*/
+
+/* 
+
+*/
+
+/*
+	VIint() is located in viint.s but is mentioned here for completeness
+
+	VIint()
+
+		Vertical Interrupt handler.  Enables display of any object
+		whose bit is set in vi_ctl.  Bit 0 = object 0, etc.
+
+		SetPri() uses BIOS(B_SETV, 25, VIint) to set the interrupt
+		vector and lets VIint() enable the object.  If vi_dis
+		is set, SetPri() won't enable the interrupt or set the vector
+		so that several objects can be started up at once.
+   =============================================================================
+*/
+
+#include "biosdefs.h"
+#include "graphdef.h"
+#include "hwdefs.h"
+#include "stddefs.h"
+#include "vsdd.h"
+#include "vsddvars.h"
+
+extern	int	vbank(), objon(), VIint();
+
+short		wsize;		/* object width calculated by SetObj() */
+short		vi_dis;		/* disable use of VIint */
+
+unsigned	vi_ctl;		/* object unblank control bits */
+
+/* 
+
+*/
+
+/*
+   =============================================================================
+	SelObj(obj) -- Select 'obj' as the current working object.
+   =============================================================================
+*/
+
+SelObj(obj)
+int obj;
+{
+	register struct octent *op;
+	register unsigned newbank;
+
+	op = &v_obtab[obj];
+
+	newbank = ((op->obank & 0x0001) << 8) | ((op->obank & 0x0002) << 6);
+
+	v_nobj = obj;
+	v_curob = op;
+	v_obpri = op->opri;
+
+	if ((v_regs[5] & 0x0180) NE newbank)
+		vbank(op->obank & 3);
+}
+
+/* 
+
+*/
+
+/*
+   =============================================================================
+	SetPri(obj, pri) -- Display object 'obj' with priority 'pri'.
+	
+		Blanks the object first, then sets the access table
+		and unblanks the object via VIint().
+   =============================================================================
+*/
+
+SetPri(obj, pri)
+register int obj;
+register int pri;
+{
+	register struct octent *op;
+
+	if (v_regs[5] & 0x0180)		/* point at the control bank */
+		vbank(0);
+
+	op = &v_obtab[obj];		/* point at the object table */
+	op->opri = pri;			/* set the priority */
+
+	v_odtab[pri][0] = op->odtw0 | V_BLA;	/* start object as blanked */
+	v_odtab[pri][1] = op->odtw1;
+	v_odtab[pri][2] = ((char *)(op->obase) >> 1) & 0xFFFF;
+
+	objon(pri, op->objy, op->ysize);	/* enable access table bits */
+
+	if (vi_dis)				/* don't unblank if vi_dis set */
+		return;
+
+	setipl(7);				/* disable interrupts */
+
+	vi_ctl |= (1 << pri);			/* set unblank bit */
+
+	if (*((long *)0x000064) NE &VIint)	/* make sure VI vector is set */
+		BIOS(B_SETV, 25, VIint);
+
+	setipl(0);				/* enable VI interrupt */
+}
+
+/* 
+
+*/
+
+/*
+   =============================================================================
+	SetObj(obj, type, bank, base, xpix, ypix, x0, y0, flags, pri)
+	Setup an object, and optionally display it.  Assumes HRS EQ 1.
+   =============================================================================
+*/
+
+SetObj(obj, type, bank, base, xpix, ypix, x0, y0, flags, pri)
+int obj, type, bank, xpix, ypix, x0, y0, flags, pri;
+unsigned int *base;
+{
+	register struct octent *op;
+
+	if (v_regs[5] & 0x0180)		/* point at the control bank */
+		vbank(0);
+
+	op = &v_obtab[obj];
+
+	v_curob = op;
+	v_nobj = obj;
+	v_obpri = pri;
+
+	op->ysize = ypix;
+	op->xsize = xpix;
+	op->objx = x0;
+	op->objy = y0;
+	op->obase = base;
+	op->opri = pri;
+	op->obank = bank & 3;
+
+/* 
+
+*/
+	if (type) {	/* character objects */
+
+		op->odtw0 = (flags & 0xF9FF) | V_CTYPE;
+
+		switch (V_RES3 & op->odtw0) {
+
+		case V_RES0:
+
+			wsize = xpix / 128;
+			break;
+
+		case V_RES1:
+
+			wsize = xpix / 48;
+			break;
+
+		case V_RES2:
+
+			wsize = xpix / 64;
+			break;
+
+		case V_RES3:
+
+			wsize = xpix / 96;
+			break;
+		}
+
+		if (V_FAD & op->odtw0)
+			wsize = wsize + (wsize << 1);
+
+/* 
+
+*/
+	} else {	/* bitmap objects */
+
+		op->odtw0 = (flags & 0x0E37) | (V_BTYPE | ((bank & 3) << 6));
+
+		switch (V_RES3 & op->odtw0) {
+
+		case V_RES0:
+		case V_RES1:
+
+			wsize = 0;
+			break;
+
+		case V_RES2:
+
+			wsize = xpix / 32;
+			break;
+
+		case V_RES3:
+
+			wsize = xpix / 16;
+			break;
+		}
+	}
+
+	op->odtw1 = ((x0 >> 1) & 0x03FF) | (0xFC00 & (wsize << 10));
+
+	if (pri < 0)
+		return;
+
+	SetPri(obj, pri);
+}
+
+/* 
+
+*/
+
+/*
+   =============================================================================
+	CpyObj(from, to, w, h, sw)
+
+	Copy a 'w'-word by 'h'-line object from 'from' to 'to' with
+	a destination width of 'sw' words.  Assumes we're pointing at
+	the correct bank.
+   =============================================================================
+*/
+
+CpyObj(from, to, w, h, sw)
+register unsigned *from, *to;
+register unsigned w, h, sw;
+{
+	register unsigned *tp;
+	register unsigned i, j;
+
+	for (i = h; i--; ) {
+
+		tp = to;
+
+		for (j = w; j--; )
+			*tp++ = *from++;
+
+		to += sw;
+	}
+}
Index: vlib/vputa.s
===================================================================
--- vlib/vputa.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/vputa.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,48 @@
+* ------------------------------------------------------------------------------
+* vputa.s -- store character attributes in video RAM
+* Version 1 -- 1988-03-14 -- D.N. Lynx Crowe
+* (c) Copyright 1988 -- D.N. Lynx Crowe
+* ------------------------------------------------------------------------------
+*
+*	vputa(sbase, row, col, attrib)
+*	unsigned int *sbase, row, col, attrib;
+*
+*		Stores attribute value 'attrib' for the character
+*		located at ('row','col') in VSDD RAM starting at 'sbase'.
+*		Assumes a 64 character line and full character attributes.
+* ------------------------------------------------------------------------------
+		.text
+*
+		.xdef	_vputa
+*
+SBASE		.equ	8		* LONG - 'sbase'
+ROW		.equ	12		* WORD - 'row'
+COL		.equ	14		* WORD - 'col'
+ATTR		.equ	16		* WORD - 'attrib'
+*
+_vputa:		link	a6,#0		* Link stack frame pointer
+		clr.l	d0		* Clear out d0
+		move.w	ROW(a6),d0	* Get row
+		lsl.l	#6,d0		* Multiply by 64  (shift left 6)
+		move.w	COL(a6),d1	* Get col
+		andi.l	#$0000003F,d1	* Mask down to 6 bits
+		or.l	d1,d0		* OR into d0 to get char. #
+		move.w	d0,d1		* Develop cw = (cn/2)*6 in d1
+		andi.l	#$FFFFFFFE,d1	* ...
+		move.l	d1,d2		* ...
+		add.l	d1,d1		* ...
+		add.l	d2,d1		* ...
+		add.l	SBASE(a6),d1	* Add sbase to cw
+		movea.l	d1,a0		* a0 points at the word with the char.
+		btst.l	#0,d0		* Odd char. location ?
+		bne	vputa1		* Jump if so
+*
+		move.w	ATTR(a6),2(a0)	* Store new attribute word in video RAM
+*
+vputax:		unlk	a6		* Unlink the stack frame
+		rts			* Done -- return to caller
+*
+vputa1:		move.w	ATTR(a6),4(a0)	* Store new attribute word in video RAM
+		bra	vputax		* Done -- go return to caller
+*
+		.end
Index: vlib/vputc.s
===================================================================
--- vlib/vputc.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/vputc.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,56 @@
+* ------------------------------------------------------------------------------
+* vputc.s -- store a character and attributes in video RAM
+* Version 3 -- 1987-03-30 -- D.N. Lynx Crowe
+* (c) Copyright 1987 -- D.N. Lynx Crowe
+* ------------------------------------------------------------------------------
+*
+*	vputc(sbase, row, col, c, attrib)
+*	unsigned int *sbase, row, col, c, attrib;
+*
+*		Stores character c at (row,col) in sbase with
+*		attribute value attrib.
+* ------------------------------------------------------------------------------
+*
+		.text
+*
+		.xdef	_vputc
+*
+_vputc:		link	a6,#0		* Link stack frame pointer
+		clr.l	d0		* Clear out d0
+		move.w	12(a6),d0	* Get row
+		lsl.l	#6,d0		* Multiply by 64  (shift left 6)
+		move.w	14(a6),d1	* Get col
+		andi.l	#$0000003F,d1	* Mask down to 6 bits
+		or.l	d1,d0		* OR into d0 to get char. #
+		move.w	d0,d1		* Develop cw = (cn/2)*6 in d1
+		andi.l	#$FFFFFFFE,d1	* ...
+		move.l	d1,d2		* ...
+		lsl.l	#1,d1		* ...
+		add.l	d2,d1		* ...
+		add.l	8(a6),d1	* Add sbase to cw
+		movea.l	d1,a0		* a0 points at the word with the char.
+		btst.l	#0,d0		* Odd char. location ?
+		bne	vputc1		* Jump if so
+*
+		move.w	16(a6),d0	* Get ch
+		andi.w	#$00FF,d0	* Mask off garbage bits
+		move.w	(a0),d1		* Get word from video RAM
+		andi.w	#$FF00,d1	* Mask off old even character
+		or.w	d0,d1		* OR in the new character
+		move.w	d1,(a0)+	* Store the updated word in video RAM
+		move.w	18(a6),(a0)	* Store new attribute word in video RAM
+*
+vputcx:		unlk	a6		* Unlink the stack frame
+		rts			* Return to caller
+*
+vputc1:		move.w	16(a6),d0	* Get ch
+		lsl.w	#8,d0		* Shift to high (odd) byte
+		move.w	(a0),d1		* Get word from video RAM
+		andi.w	#$00FF,d1	* Mask off old odd character
+		or.w	d0,d1		* OR in the new character
+		move.w	d1,(a0)+	* Store the updated word in video RAM
+		addq.l	#2,a0		* Point at the attribute word
+		move.w	18(a6),(a0)	* Store new attributes in video RAM
+		bra	vputcx		* Done -- go return to caller
+*
+		.end
Index: vlib/vputcv.s
===================================================================
--- vlib/vputcv.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/vputcv.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,64 @@
+* ------------------------------------------------------------------------------
+* vputcv.s -- store a character and attributes in video RAM
+* Version 1 -- 1988-10-05 -- D.N. Lynx Crowe
+* (c) Copyright 1988 -- D.N. Lynx Crowe
+* ------------------------------------------------------------------------------
+*
+*	vputcv(adr, row, col, chr, atr, cols)
+*	unsigned int *adr, row, col, chr, atr, cols;
+*
+*		Stores character 'chr' at ('row', 'col') in the
+*		full attribute text object at 'adr' with
+*		attribute value 'atr' using a line length of 'len'.
+* ------------------------------------------------------------------------------
+*
+		.text
+*
+		.xdef	_vputcv
+*
+P_ADR		.equ	8
+P_ROW		.equ	12
+P_COL		.equ	14
+P_CHR		.equ	16
+P_ATR		.equ	18
+P_LEN		.equ	20
+*
+		.page
+*
+_vputcv:	link	a6,#0		* Link stack frame pointer
+		move.w	P_ROW(a6),d0	* Get row
+		mulu	P_LEN(a6),d0	* Multiply by len
+		clr.l	d1		* Clear out d1
+		move.w	P_COL(a6),d1	* Get col
+		add.l	d1,d0		* Add col into d0 to get char. #
+		move.l	d0,d1		* Develop cw = (cn/2)*6 in d1
+		andi.l	#$FFFFFFFE,d1	* ...
+		move.l	d1,d2		* ...
+		add.l	d1,d1		* ...
+		add.l	d2,d1		* ...
+		add.l	P_ADR(a6),d1	* Add sbase to cw
+		movea.l	d1,a0		* a0 points at the word with the char.
+		btst.l	#0,d0		* Odd char. location ?
+		bne	vputcv1		* Jump if so
+*
+		move.w	P_CHR(a6),d0	* Get chr
+		andi.w	#$00FF,d0	* Mask off garbage bits
+		move.w	(a0),d1		* Get word from video RAM
+		andi.w	#$FF00,d1	* Mask off old even character
+		or.w	d0,d1		* OR in the new character
+		move.w	d1,(a0)+	* Store the updated word in video RAM
+		bra	vputcvx		* Done -- go return to caller
+*
+vputcv1:	move.w	P_CHR(a6),d0	* Get chr
+		lsl.w	#8,d0		* Shift to high (odd) byte
+		move.w	(a0),d1		* Get word from video RAM
+		andi.w	#$00FF,d1	* Mask off old odd character
+		or.w	d0,d1		* OR in the new character
+		move.w	d1,(a0)+	* Store the updated word in video RAM
+		addq.l	#2,a0		* Point at the attribute word
+*
+vputcvx:	move.w	P_ATR(a6),(a0)	* Store new attributes in video RAM
+		unlk	a6		* Unlink the stack frame
+		rts			* Return to caller
+*
+		.end
Index: vlib/vputp.s
===================================================================
--- vlib/vputp.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/vputp.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,109 @@
+* ------------------------------------------------------------------------------
+* vputp.s -- put a pixel into a 4-bit per pixel bitmap object
+* Version 4 -- 1987-08-04 -- D.N. Lynx Crowe
+* (c) Copyright 1987 -- D.N. Lynx Crowe
+* ------------------------------------------------------------------------------
+*	int
+*	vputp(octad, xloc, yloc, val)
+*	struct octent *octad;
+*	int xloc, yloc;
+*
+*		Puts the pixel value 'val' at ('xloc','yloc') in the
+*		4-bit per pixel bitmap object described by 'octad'.
+*
+*	-----
+*	struct octent {
+*
+*		uint	ysize,
+*			xsize;
+*
+*		int	objx,
+*			objy;
+*
+*		uint	*obase;
+*
+*		char	opri,
+*			obank;
+*
+*		uint	odtw0,
+*			odtw1;
+*	};
+*
+		.text
+*
+		.xdef	_vputp
+*
+OCTAD		.equ	8
+XLOC		.equ	12
+YLOC		.equ	14
+VAL		.equ	16
+*
+YSIZE		.equ	0
+XSIZE		.equ	2
+OBJX		.equ	4
+OBJY		.equ	6
+OBASE		.equ	8
+OPRI		.equ	12
+OBANK		.equ	13
+ODTW0		.equ	14
+ODTW1		.equ	16
+*
+		.page
+*
+_vputp:		link	a6,#0			* Link stack frames
+		movea.l	OCTAD(a6),a1		* Get OCTAD base into a1
+		move.w	XLOC(a6),d0		* Get XLOC into d0
+		cmp.w	XSIZE(a1),d0		* Check XLOC range
+		bge	vputerr			* ERROR if too large
+*
+		tst.w	d0			* Check XLOC sign
+		bmi	vputerr			* ERROR if negative
+*
+		move.w	YLOC(a6),d1		* Get YLOC into d1 to test
+		cmp.w	YSIZE(a1),d1		* Check YLOC range
+		bge	vputerr			* ERROR if too large
+*
+		tst.w	d1			* Check YLOC sign
+		bmi	vputerr			* ERROR if negative
+*
+		lsr.w	#2,d0			* Divide XLOC by 4
+		move.w	XSIZE(a1),d1		* Get width into d1
+		lsr.w	#2,d1			* Divide width by 4
+		mulu	YLOC(a6),d1		* Multiply width/4 by YLOC
+		ext.l	d0			* Extend XLOC/4 to a long
+		add.l	d0,d1			* ... and add it to d1
+		lsl.l	#1,d1			* Make d1 a word offset
+		add.l	OBASE(a1),d1		* Add OBASE to d1
+		movea.l	d1,a0			* Make a0 point at bitmap data
+		move.w	XLOC(a6),d0		* Get XLOC
+		andi.l	#$03,d0			* Mask to low 2 bits
+		add.l	d0,d0			* Multiply by 2 for word index
+		move.l	d0,d1			* Save index in d1
+		add.l	#MTAB,d0		* Add mask table base
+		movea.l	d0,a2			* a2 points at mask
+		add.l	#STAB,d1		* Add shift table base to index
+		move.l	d1,a1			* a1 points at shift count
+		move.w	(a1),d0			* Get shift count in d0
+		move.w	VAL(a6),d1		* Get new pixel in d1
+		andi.w	#$0F,d1			* Mask down to 4 bits
+		lsl.w	d0,d1			* Shift into position for OR
+		move.w	(a0),d0			* Get old bitmap word in d0
+		and.w	(a2),d0			* Mask out old pixel
+		or.w	d1,d0			* OR in new pixel
+		move.w	d0,(a0)			* Store updated word in bitmap
+		clr.l	d0			* Set return value = 0 = OK
+*
+vputexit:	unlk	a6			* Unlink stack frame
+		rts				* Return to caller
+*
+vputerr:	moveq.l	#-1,d0			* Set return value = -1 = ERROR
+		bra	vputexit		* Go unlink stack and return
+*
+		.page
+*
+		.data
+*
+MTAB:		dc.w	$FFF0,$FF0F,$F0FF,$0FFF	* Mask table
+STAB:		dc.w	0,4,8,12		* Shift table
+*
+		.end
Index: vlib/vputs.c
===================================================================
--- vlib/vputs.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/vputs.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,79 @@
+/*
+   =============================================================================
+	vputs.c -- video display string put functions
+	Version 2 -- 1987-03-30 -- D.N. Lynx Crowe
+	(c) Copyright 1987 -- D.N. Lynx Crowe
+
+	These functions drive the video character write function vputc()
+	which puts characters into a 82716 video RAM character object.
+
+	Full attribute format is assumed.
+   =============================================================================
+*/
+
+#include <stddefs.h>
+
+typedef	unsigned int	uint;
+
+extern int	vputc();
+
+/*
+   =============================================================================
+	vputs(sbase, row, col, str, attrib)
+
+	Write string str to video RAM object pointed to by sbase
+	at (row,col) with attrib used for all characters.
+   =============================================================================
+*/
+
+vputs(sbase, row, col, str, attrib)
+uint *sbase, row, col, attrib;
+char *str;
+{
+	uint	c;
+
+	while (c = *str++) {
+
+		vputc(sbase, row, col, c, attrib);
+
+		if (++col GE 64) {
+
+			col = 0;
+
+			if (++row GE 25)
+				row = 0;
+		}
+	}
+}
+
+/* 
+ */
+
+/*
+   =============================================================================
+	vputsa(sbase, row, col, str, attrib)
+
+	Write string str in video RAM pointed to by sbase starting
+	at (row, col) using attributes from the words pointed to by attrib.
+   =============================================================================
+*/
+
+vputsa(sbase, row, col, str, attrib)
+uint *sbase, row, col, *attrib;
+char *str;
+{
+	uint	c;
+
+	while (c = *str++) {
+
+		vputc(sbase, row, col, c, *attrib++);
+
+		if (++col GE 64) {
+
+			col = 0;
+
+			if (++row GE 25)
+				row = 0;
+		}
+	}
+}
Index: vlib/vputsv.c
===================================================================
--- vlib/vputsv.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/vputsv.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,82 @@
+/*
+   =============================================================================
+	vputsv.c -- video display string put functions
+	Version 1 -- 1988-10-06 -- D.N. Lynx Crowe
+	(c) Copyright 1988 -- D.N. Lynx Crowe
+
+	These functions drive the video character write function vputc()
+	which puts characters into a 82716 video RAM character object.
+
+	Full attribute format is assumed.
+   =============================================================================
+*/
+
+#include "stddefs.h"
+
+typedef	unsigned int	uint;
+
+extern int	vputcv();
+
+/*
+   =============================================================================
+	vputsv(sbase, row, col, str, attrib, len)
+
+	Write string str to video RAM object pointed to by sbase
+	at (row,col) with attrib used for all characters. Line length is len.
+   =============================================================================
+*/
+
+vputsv(sbase, row, col, str, attrib, len)
+uint *sbase, row, col;
+char *str;
+uint attrib, len;
+{
+	uint	c;
+
+	while (c = *str++) {
+
+		vputcv(sbase, row, col, c, attrib, len);
+
+		if (++col GE 64) {
+
+			col = 0;
+
+			if (++row GE 25)
+				row = 0;
+		}
+	}
+}
+
+/* 
+ */
+
+/*
+   =============================================================================
+	vputsav(sbase, row, col, str, attrib, len)
+
+	Write string str in video RAM pointed to by sbase starting
+	at (row, col) using attributes from the words pointed to by attrib.
+	Line length is len.
+   =============================================================================
+*/
+
+vputsav(sbase, row, col, str, attrib, len)
+uint *sbase, row, col;
+char *str;
+uint *attrib, len;
+{
+	uint	c;
+
+	while (c = *str++) {
+
+		vputcv(sbase, row, col, c, *attrib++, len);
+
+		if (++col GE 64) {
+
+			col = 0;
+
+			if (++row GE 25)
+				row = 0;
+		}
+	}
+}
Index: vlib/vsetav.s
===================================================================
--- vlib/vsetav.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/vsetav.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,50 @@
+* ------------------------------------------------------------------------------
+* vsetav.s -- set a character's attributes in video RAM
+* Version 1 -- 1988-10-11 -- D.N. Lynx Crowe
+* (c) Copyright 1988 -- D.N. Lynx Crowe
+* ------------------------------------------------------------------------------
+*
+*	vsetav(adr, row, col, atr, len)
+*	unsigned int *adr, row, col, atr, len;
+*
+*		Sets attribute 'atr' at ('row', 'col') in the
+*		full attribute text object at 'adr'
+*		using a line length of 'len'.
+* ------------------------------------------------------------------------------
+		.text
+*
+		.xdef	_vsetav
+*
+P_ADR		.equ	8
+P_ROW		.equ	12
+P_COL		.equ	14
+P_ATR		.equ	16
+P_LEN		.equ	18
+*
+_vsetav:	link	a6,#0		* Link stack frame pointer
+		move.w	P_ROW(a6),d0	* Get row
+		mulu	P_LEN(a6),d0	* Multiply by len
+		clr.l	d1		* Clear out d1
+		move.w	P_COL(a6),d1	* Get col
+		add.l	d1,d0		* Add col into d0 to get char. #
+		move.l	d0,d1		* Develop cw = (cn/2)*6 in d1
+		andi.l	#$FFFFFFFE,d1	* ...
+		move.l	d1,d2		* ...
+		add.l	d1,d1		* ...
+		add.l	d2,d1		* ...
+		add.l	P_ADR(a6),d1	* Add sbase to cw
+		movea.l	d1,a0		* a0 points at the word with the char.
+		btst.l	#0,d0		* Odd char. location ?
+		bne	vsetav1		* Jump if so
+*
+		addq.l	#2,a0		* Point at the attribute word
+		bra	vsetavx		* Go set attribute
+*
+vsetav1:	addq.l	#4,a0		* Point at the attribute word
+*
+vsetavx:	move.w	P_ATR(a6),d0	* Get new attributes
+		or.w	d0,(a0)		* Set new attributes in video RAM
+		unlk	a6		* Unlink the stack frame
+		rts			* Return to caller
+*
+		.end
Index: vlib/vsetcv.s
===================================================================
--- vlib/vsetcv.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/vsetcv.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,52 @@
+* ------------------------------------------------------------------------------
+* vsetcv.s -- set a character's colors in video RAM
+* Version 1 -- 1988-10-11 -- D.N. Lynx Crowe
+* (c) Copyright 1988 -- D.N. Lynx Crowe
+* ------------------------------------------------------------------------------
+*
+*	vsetcv(adr, row, col, cfb, len)
+*	unsigned int *adr, row, col, cfb, len;
+*
+*		Sets colors 'cfb' at ('row', 'col') in the
+*		full attribute text object at 'adr'
+*		using a line length of 'len'.
+* ------------------------------------------------------------------------------
+		.text
+*
+		.xdef	_vsetcv
+*
+P_ADR		.equ	8
+P_ROW		.equ	12
+P_COL		.equ	14
+P_CFB		.equ	16
+P_LEN		.equ	18
+*
+_vsetcv:	link	a6,#0		* Link stack frame pointer
+		move.w	P_ROW(a6),d0	* Get row
+		mulu	P_LEN(a6),d0	* Multiply by len
+		clr.l	d1		* Clear out d1
+		move.w	P_COL(a6),d1	* Get col
+		add.l	d1,d0		* Add col into d0 to get char. #
+		move.l	d0,d1		* Develop cw = (cn/2)*6 in d1
+		andi.l	#$FFFFFFFE,d1	* ...
+		move.l	d1,d2		* ...
+		add.l	d1,d1		* ...
+		add.l	d2,d1		* ...
+		add.l	P_ADR(a6),d1	* Add sbase to cw
+		movea.l	d1,a0		* a0 points at the word with the char.
+		btst.l	#0,d0		* Odd char. location ?
+		bne	vsetcv1		* Jump if so
+*
+		addq.l	#2,a0		* Point at the attribute word
+		bra	vsetcvx		* Go set attribute
+*
+vsetcv1:	addq.l	#4,a0		* Point at the attribute word
+*
+vsetcvx:	move.w	(a0),d0		* Get old attributes
+		andi.w	#$FF00,d0	* Remove old colors
+		or.w	P_CFB(a6),d0	* Get new colors
+		move.w	d0,(a0)		* Set new attributes in video RAM
+		unlk	a6		* Unlink the stack frame
+		rts			* Return to caller
+*
+		.end
Index: vlib/vsetpal.c
===================================================================
--- vlib/vsetpal.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/vsetpal.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,89 @@
+/*
+   =============================================================================
+	vsetpal.c -- Buchla 700 color palette setup
+	Version 2 -- 1987-11-20 -- D.N. Lynx Crowe
+   =============================================================================
+*/
+
+#define	PALETTE		((unsigned *)0x280000L)
+
+short	dfltpal[16][3] = {
+
+/*	 R  G  B	  color */
+
+	{0, 0, 0},	/*  0: Black */
+	{0, 1, 0},	/*  1: Dark Gray */
+	{0, 0, 2},	/*  2: Dark Blue */
+	{0, 0, 3},	/*  3: Light Blue */
+	{0, 2, 0},	/*  4: Dark Green */
+	{0, 3, 0},	/*  5: Light Green */
+	{0, 2, 2},	/*  6: Dark Cyan */
+	{0, 3, 3},	/*  7: Light Cyan */
+	{3, 0, 0},	/*  8: Red */
+	{3, 1, 0},	/*  9: Orange */
+	{3, 0, 3},	/* 10: Purple */
+	{3, 1, 2},	/* 11: Magenta */
+	{3, 2, 0},	/* 12: Brown */
+	{2, 3, 0},	/* 13: Yellow */
+	{2, 2, 2},	/* 14: Light Gray */
+	{3, 3, 3},	/* 15: White */
+};
+
+/* 
+
+*/
+
+/*
+   =============================================================================
+	vsetpal() -- set a palette RAM entry to a specific color
+
+	slot	0..15	color entry number
+	red	0..3	red value
+	grn	0..3	green value
+	blu	0..3	blue value
+   =============================================================================
+*/
+
+vsetpal(slot, red, grn, blu)
+register unsigned slot, red, grn, blu;
+{
+	register unsigned palval;
+	unsigned *pal;
+
+	pal = PALETTE;
+
+	palval = (slot << 6) |
+		 ((red & 1) << 5) | ((red & 2) << 1) |
+		 ((grn & 1) << 4) | (grn & 2) |
+		 ((blu & 1) << 3) | ((blu & 2) >> 1);
+
+	*pal = palval ^ 0x003F;
+}
+
+/* 
+
+*/
+
+/*
+   =============================================================================
+	vsndpal() -- send a palette table to the video palette RAM
+
+	pp	pointer to a short [16][3] array,
+
+		where:
+			pp[n][0]	= blue value
+			pp[n][1]	= green value
+			pp[n][2]	= red value
+
+				n	= slot number (0..15)
+   =============================================================================
+*/
+
+vsndpal(pp)
+short pp[16][3];
+{
+	register short i;
+
+	for (i = 0; i < 16; i++)
+		vsetpal(i, pp[i][0], pp[i][1], pp[i][2]);
+}
Index: vlib/vsinit.c
===================================================================
--- vlib/vsinit.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/vsinit.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,27 @@
+/*
+   =============================================================================
+	vsinit.c -- intialize VSDD software support variables
+	Version 5 -- 1988-08-15 -- D.N. Lynx Crowe
+	(c) Copyright 1987,1988 -- D.N. Lynx Crowe
+   =============================================================================
+*/
+
+#include "hwdefs.h"
+#include "graphdef.h"
+#include "vsdd.h"
+#include "vsddvars.h"
+#include "memory.h"
+
+/*
+   =============================================================================
+	VSinit() -- initialize VSDD software support variables
+   =============================================================================
+*/
+
+VSinit()
+{
+	v_nobj = 0;
+	v_obpri = 0;
+	memsetw(v_obtab, 0, (sizeof v_obtab)/2);
+	v_curob = &v_obtab[0];
+}
Index: vlib/vsplot4.s
===================================================================
--- vlib/vsplot4.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/vsplot4.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,157 @@
+* ------------------------------------------------------------------------------
+* vsplot4.s -- output characters to a 4-bit / pixel graphics window
+*    with variable vertical pitch, etc.
+* Version 1 -- 1988-10-07 -- D.N. Lynx Crowe
+* (c) Copyright 1988 -- D.N. Lynx Crowe
+* ------------------------------------------------------------------------------
+*
+*	vsplot4(obase, nw, fg, row, col, str, pitch, ht, cgtab)
+*	uint *obase, nw, fg, row, col, pitch, ht, cgtab[][256];
+*	char *str;
+*
+*		Outputs characters from the string at 'str' to an 'nw'
+*		character wide 4-bit per pixel graphics window at 'obase'
+*		at ('row','col'), using 'fg' as the foreground color.
+*		Uses cgtab[][256] as the VSDD formatted character
+*		generator table.  Assumes 'ht' bit high characters in the
+*		cgtable.  Uses 'pitch' as the vertical spacing between
+*		character rows.  No error checks are done.
+*		The string must fit the output area (no overlaps, single line).
+*		This function leaves the zero pixels alone and just sets the
+*		one pixels to the foreground color, allowing overlapping
+*		character cells.
+* ------------------------------------------------------------------------------
+		.text
+*
+		.xdef	_vsplot4
+*
+* Argument offsets from a6:
+*
+OBASE		.equ	8		* LONG - Output area base address
+NW		.equ	12		* WORD - Character width of output area
+FG		.equ	14		* WORD - Foreground color
+ROW		.equ	16		* WORD - Row
+COL		.equ	18		* WORD - Column
+STR		.equ	20		* LONG - String base address
+PITCH		.equ	24		* WORD - Vertical spacing between rows
+HT		.equ	26		* WORD - Character height
+CGTAB		.equ	28		* LONG - Character generator pionter
+*
+* Program constant definitions:
+*
+HPIX		.equ	8		* Character width in pixels
+HCW		.equ	4		* Horizontal character width (bytes)
+PSHIFT		.equ	12		* Pixel shift into MS bits
+HSHIFT		.equ	4		* Pixel right shift
+*
+		.page
+*
+* Register usage:
+*
+*	d0	output word and scratch
+*	d1	CG word and scratch
+*	d2	pixel counter
+*
+*	d3	foreground color (in the 4 ms bits)
+*	d4	background color (in the 4 ms bits)
+*	d5	width of the area in bytes
+*	d6	scan line counter
+*
+*	a0	CG table pointer
+*	a1	output area scan line pointer
+*	a2	input string character pointer
+*
+*	a3	output area character base pointer
+*
+*	a6	frame pointer
+*	a7	stack pointer
+*
+		.page
+*
+_vsplot4:	link	a6,#0		* Link stack frames
+		movem.l	d3-d6/a3,-(a7)	* Save registers we use
+		move.w	#PSHIFT,d1	* Set shift constant
+		move.w	FG(a6),d3	* Setup foreground color
+		lsl.w	d1,d3		* ... in ms 4 bits of d3.W
+		move.w	NW(a6),d5	* Get line width in d5.W
+		lsl.w	#2,d5		* Multiply width by 4 for offset
+		move.w	ROW(a6),d0	* Calculate output address
+		move.w	PITCH(a6),d1	* ... PITCH
+		mulu	d1,d0		* ... * ROW
+		add.w	HT(a6),d0	* ... + HT-1
+		subq.w	#1,d0		* ...
+		mulu	d5,d0		* ... * NW
+		clr.l	d1		* ...
+		move.w	COL(a6),d1	* ... + 
+		lsl.w	#2,d1		* ... COL * 4
+		add.l	d1,d0		* ...
+		add.l	OBASE(a6),d0	* ... + OBASE
+		movea.l	d0,a3		* Leave output address in a3
+		movea.l	STR(a6),a2	* Put string address in a2
+*
+cgl0:		clr.l	d0		* Clear out upper bits of d0
+		move.b	(a2)+,d0	* Get next character
+		beq	cgl5		* Done if character EQ 0
+*
+		movea.l	a3,a1		* Establish output pointer in a1
+		adda.l	#HCW,a3		* Update output pointer for next char.
+		movea.l	CGTAB(a6),a0	* Establish CG pointer in a0
+		lsl.w	#1,d0		* ... 2 * character
+		adda.w	d0,a0		* ... + cgtab address
+		move.w	HT(a6),d6	* Set scan line counter in d6
+		subq.w	#1,d6		* ...
+*
+		.page
+cgl1:		move.w	(a0),d1		* Get character generator word in d1
+		move.w	#(HPIX/2)-1,d2	* Set pixel counter in d2
+		clr.l	d4		* Get old output word as background
+		move.w	(a1),d4		* ...
+		swap	d4		* ...
+*
+cgl2:		lsr.w	#HSHIFT,d0	* Shift output word right 1 pixel
+		lsr.l	#HSHIFT,d4	* Shift background word 1 pixel
+		andi.l	#$FFFFF000,d4	* Mask for upper 4 bits of d4.W
+		btst.l	#0,d1		* Check CG word ls bit
+		beq	cgl3		* Set background color if bit EQ 0
+*
+		or.w	d3,d0		* OR foreground color into output word
+		bra	cgl4		* Go update CG word
+*
+cgl3:		or.w	d4,d0		* OR background color into output word
+*
+cgl4:		lsr.w	#1,d1		* Shift CG word right 1 pixel
+		dbf	d2,cgl2		* Loop for first 4 pixels
+*
+		move.w	d0,(a1)+	* Store first output word in scan line
+		move.w	#(HPIX/2)-1,d2	* Set pixel counter in d2
+		clr.l	d4		* Get old output word as background
+		move.w	(a1),d4		* ...
+		swap	d4		* ...
+*
+cgl2a:		lsr.w	#HSHIFT,d0	* Shift output word right 1 pixel
+		lsr.l	#HSHIFT,d4	* Shift background word 1 pixel
+		andi.l	#$FFFFF000,d4	* Mask for upper bits of d4.W
+		btst.l	#0,d1		* Check CG word ls bit
+		beq	cgl3a		* Set background color if bit EQ 0
+*
+		or.w	d3,d0		* OR foreground color into output word
+		bra	cgl4a		* Go update CG word
+*
+cgl3a:		or.w	d4,d0		* OR background color into output word
+*
+cgl4a:		lsr.w	#1,d1		* Shift CG word right 1 pixel
+		dbf	d2,cgl2a	* Loop for last 4 pixels
+*
+		move.w	d0,(a1)		* Store second output word in scan line
+		suba.w	d5,a1		* Update output pointer
+		suba.w	#2,a1		* ...
+		adda.l	#512,a0		* Update CG pointer for next scan line
+		dbf	d6,cgl1		* Loop for all scan lines
+*
+		bra	cgl0		* Loop for next character
+*
+cgl5:		movem.l	(a7)+,d3-d6/a3	* Restore registers
+		unlk	a6		* Unlink stack frames
+		rts			* Return to caller
+*
+		.end
Index: vlib/vspray4.c
===================================================================
--- vlib/vspray4.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/vspray4.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,66 @@
+/*
+   =============================================================================
+	vspray4.c -- spray a pattern onto a graphics screen using tsplot4()
+	Version 5 -- 1987-10-09 -- D.N. Lynx Crowe
+   =============================================================================
+*/
+
+#include "stddefs.h"
+#include "vsddsw.h"
+
+static 	char cl[81];
+
+/*
+   =============================================================================
+	vspray4(vobj, vwid, fg, ml, vb, pitch) -- spray a pattern on the screen
+
+	Uses 'vobj' of width 'vwid' as the screen, 'fg' as the color, 'vb' as
+	the bank, 'pitch' as the vertical pitch, and 'ml' as the pattern.
+
+	If 'vb' EQ -1,  the bank is not set.  The color in 'fg' will be taken
+	from the lower 4 bits.
+
+	The list 'ml' points at pairs of counts and characters.  The last count
+	is -1,  and the list terminates with a null pointer.
+   =============================================================================
+*/
+
+/* 
+
+*/
+
+vspray4(vobj, vwid, fg, ml, vb, pitch)
+unsigned *vobj;
+short vwid, fg, vb, pitch;
+char *ml[];
+{
+	register char *cp, *lp, c;
+	register short j, k, row;
+
+	row = 0;
+
+	fg &= 0x000F;
+	fg |= fg << 4;
+	fg |= fg << 8;
+
+	if (-1 NE vb)
+		vbank(vb);
+
+	while (NULL NE (cp = *ml++)) {
+
+		lp = cl;
+
+		while (-1 NE (j = *cp++)) {
+
+			j &= 0x00FF;
+			c = *cp++;
+
+			for (k = 0; k < j; k++)
+				*lp++ = c;
+		}
+
+		*lp = '\0';
+
+		tsplot4(vobj, vwid, fg, row++, 0, cl, pitch);
+	}
+}
Index: vlib/vtext.c
===================================================================
--- vlib/vtext.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/vtext.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,27 @@
+/*
+   =============================================================================
+	vtext.c -- output a text string to the VSDD in 1 byte / character mode
+	Version 3 -- 1987-06-02 -- D.N. Lynx Crowe
+
+	Assumes VSDD is pointing at bank 0.
+   =============================================================================
+*/
+
+static int	msk[] = { 0xFF00, 0x00FF };
+
+vtext(obj, nc, row, col, ip)
+register unsigned *obj, nc, row, col;
+register char *ip;
+{
+	register unsigned *op;
+
+	while (*ip) {
+
+		op = obj + ((nc >> 1) * row) + (col >> 1);
+
+		*op = (*op & (unsigned)msk[col & 1]) |
+		      ((*ip++ & 0x00FF) << ((col & 1) ? 8 : 0));
+
+		col++;
+	}
+}
Index: vlib/vvputsv.s
===================================================================
--- vlib/vvputsv.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/vvputsv.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,148 @@
+* ------------------------------------------------------------------------------
+* vvputsv.s -- output characters to a 4-bit / pixel graphics window
+* with variable vertical pitch
+* Version 1 -- 1988-10-07 -- D.N. Lynx Crowe
+* (c) Copyright 1988 -- D.N. Lynx Crowe
+* ------------------------------------------------------------------------------
+*
+*	vvputsv(obase, nw, fg, bg, row, col, str, pitch, ht, cgtab)
+*	uint *obase, nw, fg, bg, row, col, pitch, ht, cgtab[][256];
+*	char *str;
+*
+*		Outputs characters from the string at 'str' to an 'nw'
+*		character wide 4-bit per pixel graphics window at 'obase'
+*		at ('row','col'), using 'fg' as the foreground color, and
+*		'bg' as the background color.  Uses cgtab[][256] as the
+*		VSDD formatted character generator table.  Assumes 'ht' line
+*		high characters in the cg table.  Uses 'pitch' as the vertical
+*		spacing between character rows.  No error checks are done.
+*		The string must fit the output area (no overlaps, single line).
+*
+* ------------------------------------------------------------------------------
+		.text
+*
+		.xdef	_vvputsv
+*
+* Argument offsets from a6:
+*
+OBASE		.equ	8		* LONG - Output area base address
+NW		.equ	12		* WORD - Character width of output area
+FG		.equ	14		* WORD - Foreground color
+BG		.equ	16		* WORD - Background color
+ROW		.equ	18		* WORD - Row
+COL		.equ	20		* WORD - Column
+STR		.equ	22		* LONG - String base address
+PITCH		.equ	26		* WORD - Vertical spacing between rows
+HT		.equ	28		* WORD - Character height  (LE PITCH)
+CGTAB		.equ	30		* LONG - Character generator table
+*
+* Program constant definitions:
+*
+HPIX		.equ	8		* Character width in pixels
+HCW		.equ	4		* Horizontal character width (bytes)
+PSHIFT		.equ	12		* Pixel shift into MS bits
+HSHIFT		.equ	4		* Pixel right shift
+*
+		.page
+*
+* Register usage:
+*
+*	d0	output word and scratch
+*	d1	CG word and scratch
+*	d2	pixel counter
+*
+*	d3	foreground color (in the 4 ms bits)
+*	d4	background color (in the 4 ms bits)
+*	d5	width of the area in bytes
+*	d6	scan line counter
+*
+*	a0	CG table pointer
+*	a1	output area scan line pointer
+*	a2	input string character pointer
+*
+*	a3	output area character base pointer
+*
+*	a6	frame pointer
+*	a7	stack pointer
+*
+		.page
+*
+_vvputsv:	link	a6,#0		* Link stack frames
+		movem.l	d3-d6/a3,-(a7)	* Save registers we use
+		move.w	#PSHIFT,d1	* Set shift constant
+		move.w	FG(a6),d3	* Setup foreground color
+		lsl.w	d1,d3		* ... in ms 4 bits of d3.W
+		move.w	BG(a6),d4	* Setup background color
+		lsl.w	d1,d4		* ... in ms 4 bits of d4.W
+		move.w	NW(a6),d5	* Get line width in d5.W
+		lsl.w	#2,d5		* Multiply width by 4 for offset
+		move.w	ROW(a6),d0	* Calculate output address
+		move.w	PITCH(a6),d1	* ... PITCH
+		mulu	d1,d0		* ... * ROW
+		add.w	#HT(a6),d0	* ... + HT-1
+		subq.w	#1,d0		* ...
+		mulu	d5,d0		* ... * NW
+		clr.l	d1		* ...
+		move.w	COL(a6),d1	* ... + 
+		lsl.w	#2,d1		* ... COL * 4
+		add.l	d1,d0		* ...
+		add.l	OBASE(a6),d0	* ... + OBASE
+		movea.l	d0,a3		* Leave output address in a3
+		movea.l	STR(a6),a2	* Put string address in a2
+*
+cgl0:		clr.l	d0		* Clear out upper bits of d0
+		move.b	(a2)+,d0	* Get next character
+		beq	cgl5		* Done if character EQ 0
+*
+		movea.l	a3,a1		* Establish output pointer in a1
+		adda.l	#HCW,a3		* Update output pointer for next char.
+		movea.l	CGTAB(a6),a0	* Establish CG pointer in a0
+		lsl.w	#1,d0		* ... 2 * character
+		adda.w	d0,a0		* ... + cg table address
+		move.w	HT(a6),d6	* Set scan line counter in d6
+		subq.w	#1,d6		* ... to HT-1
+*
+		.page
+cgl1:		move.w	(a0),d1		* Get character generator word in d1
+		move.w	#(HPIX/2)-1,d2	* Set pixel counter in d2
+*
+cgl2:		lsr.w	#HSHIFT,d0	* Shift output word right 1 pixel
+		btst.l	#0,d1		* Check CG word ls bit
+		beq	cgl3		* Set background color if bit EQ 0
+*
+		or.w	d3,d0		* OR foreground color into output word
+		bra	cgl4		* Go update CG word
+*
+cgl3:		or.w	d4,d0		* OR background color into output word
+*
+cgl4:		lsr.w	#1,d1		* Shift CG word right 1 pixel
+		dbf	d2,cgl2		* Loop for first 4 pixels
+*
+		move.w	d0,(a1)+	* Store first output word in scan line
+		move.w	#(HPIX/2)-1,d2	* Set pixel counter in d2
+*
+cgl2a:		lsr.w	#HSHIFT,d0	* Shift output word right 1 pixel
+		btst.l	#0,d1		* Check CG word ls bit
+		beq	cgl3a		* Set background color if bit EQ 0
+*
+		or.w	d3,d0		* OR foreground color into output word
+		bra	cgl4a		* Go update CG word
+*
+cgl3a:		or.w	d4,d0		* OR background color into output word
+*
+cgl4a:		lsr.w	#1,d1		* Shift CG word right 1 pixel
+		dbf	d2,cgl2a	* Loop for last 4 pixels
+*
+		move.w	d0,(a1)		* Store second output word in scan line
+		suba.w	d5,a1		* Update output pointer
+		suba.w	#2,a1		* ...
+		adda.l	#512,a0		* Update CG pointer for next scan line
+		dbf	d6,cgl1		* Loop for all scan lines
+*
+		bra	cgl0		* Loop for next character
+*
+cgl5:		movem.l	(a7)+,d3-d6/a3	* Restore registers
+		unlk	a6		* Unlink stack frames
+		rts			* Return to caller
+*
+		.end
Index: vlib/vwputm.c
===================================================================
--- vlib/vwputm.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/vwputm.c	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,38 @@
+/*
+   =============================================================================
+	vwputm.c -- put a menu in a 2-bit per pixel graphics window
+	Version 1 -- 1987-04-13 -- D.N. Lynx Crowe
+
+	vwputm(obase, nw, fg, bg, row, col, ml)
+	unsigned int *obase;
+	int nw, fg, bg;
+	char *ml[];
+
+		Writes the menu described by the list 'ml' in the
+		'nw' character wide bitmap 'obase', using 'fg' for
+		the foreground color and 'bg' for the background.
+		The menu is at ('row','col') in the bitmap.
+   =============================================================================
+*/
+
+#include <vsdd.h>
+
+extern	int	vwputs();
+
+/*
+   =============================================================================
+	vwputm(obase, nw, fg, bg, row, col, ml) -- output a menu in a bitmap
+   =============================================================================
+*/
+
+vwputm(obase, nw, fg, bg, row, col, ml)
+unsigned int *obase;
+int nw, fg, bg, row, col;
+register char *ml[];
+{
+	while (*ml) {
+
+		vwputs(obase, nw, fg, bg, row++, col, *ml++);
+	}
+}
+	
Index: vlib/vwputp.s
===================================================================
--- vlib/vwputp.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/vwputp.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,108 @@
+* ------------------------------------------------------------------------------
+* vwputp.s -- put a pixel into a 2-bit per pixel bitmap object
+* Version 2 -- 1987-04-14 -- D.N. Lynx Crowe
+* (c) Copyright 1987 -- D.N. Lynx Crowe
+* ------------------------------------------------------------------------------
+*	int
+*	vwputp(octad, xloc, yloc, val)
+*	struct octent *octad;
+*	int xloc, yloc;
+*
+*		Writes the pixel value 'val' into the 2-bit per pixel
+*		bitmap object described by 'octad' at ('xloc','yloc').
+*
+*	-----
+*
+*	struct octent {
+*
+*		uint	ysize,
+*			xsize;
+*
+*		int	objx,
+*			objy;
+*
+*		uint	*obase;
+*
+*		char	opri,
+*			oflags;
+*
+*		uint	odtw0,
+*			odtw1;
+*	};
+*
+*	Upper left corner of screen is (0,0) origin.
+*
+		.text
+*
+		.xdef	_vputp
+*
+OCTAD		.equ	8
+XLOC		.equ	12
+YLOC		.equ	14
+VAL		.equ	16
+*
+YSIZE		.equ	0
+XSIZE		.equ	2
+OBJX		.equ	4
+OBJY		.equ	6
+OBASE		.equ	8
+OPRI		.equ	12
+OFLAGS		.equ	13
+ODTW0		.equ	14
+ODTW1		.equ	16
+*
+		.page
+*
+_vwputp:	link	a6,#0			* Link stack frames
+		movea.l	OCTAD(a6),a1		* Get OCTAD base into a1
+		move.w	XLOC(a6),d0		* Get XLOC into d0
+		cmp.w	XSIZE(a1),d0		* Check XLOC range
+		bge	vputerr			* ERROR if too large
+*
+		tst.w	d0			* Check XLOC sign
+		bmi	vputerr			* ERROR if negative
+*
+		move.w	YLOC(a6),d1		* Get YLOC into d1 to test
+		cmp.w	YSIZE(a1),d1		* Check YLOC range
+		bge	vputerr			* ERROR if too large
+*
+		tst.w	d1			* Check YLOC sign
+		bmi	vputerr			* ERROR if negative
+*
+		lsr.w	#3,d0			* Divide XLOC by 8
+		move.w	XSIZE(a1),d1		* Get width into d1
+		lsr.w	#3,d1			* Divide width by 8
+		mulu	YLOC(a6),d1		* Multiply width/8 by YLOC
+		ext.l	d0			* Extend XLOC/8 to a long
+		add.l	d0,d1			* ... and add it to d1
+		add.l	OBASE(a1),d1		* Add OBASE to d1
+		movea.l	d1,a0			* Make a0 point at bitmap data
+		move.w	XLOC(a6),d0		* Get XLOC
+		andi.l	#$07,d0			* Mask to low 3 bits
+		add.l	d0,d0			* Multiply by 2 for word index
+		move.l	d0,d1			* Save index in d1
+		add.l	#MTAB,d0		* Add mask table base
+		movea.l	d0,a2			* a2 points at mask
+		add.l	#STAB,d1		* Add shift table base to index
+		move.l	d1,a1			* a1 points at shift count
+		move.w	(a1),d0			* Get shift count in d0
+		move.w	VAL(a6),d1		* Get new pixel in d1
+		andi.w	#$03,d1			* Mask down to 2 bits
+		lsl.w	d0,d1			* Shift into position for OR
+		move.w	(a0),d0			* Get old bitmap word in d0
+		and.w	(a2),d0			* Mask out old pixel
+		or.w	d1,d0			* OR in new pixel
+		move.w	d0,(a0)			* Store updated word in bitmap
+		clr.l	d0			* Set return value = 0 = OK
+*
+vputexit:	unlk	a6			* Unlink stack frame
+		rts				* Return to caller
+*
+vputerr:	moveq.l	#-1,d0			* Set return value = -1 = ERROR
+		bra	vputexit		* Go unlink stack and return
+*
+MTAB:		dc.w	$FFFC,$FFF3,$FFCF,$FF3F	* Mask table
+		dc.w	$FCFF,$F3FF,$CFFF,$3FFF
+STAB:		dc.w	0,2,4,6,8,10,12,14	* Shift table
+*
+		.end
Index: vlib/vwputs.s
===================================================================
--- vlib/vwputs.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
+++ vlib/vwputs.s	(revision 109c83b4de0a1be1740921110e1aab18add40866)
@@ -0,0 +1,118 @@
+* ------------------------------------------------------------------------------
+* vwputs.s -- output a character string to a 2-bit per pixel graphics window
+* Version 9 -- 1987-07-28 -- D.N. Lynx Crowe
+* (c) Copyright 1987 -- D.N. Lynx Crowe
+* ------------------------------------------------------------------------------
+*
+*	vwputs(obase, nw, fg, bg, row, col, str)
+*	int *obase, nw, fg, bg, row, col;
+*	char *str;
+*
+*		Outputs characters from the string at 'str' to an 'nw'
+*		character wide 2-bit per pixel graphics window at 'obase'
+*		at ('row','col'), using 'fg' as the foreground color, and
+*		'bg' as the background color.  Uses cgtable[][256] as the
+*		VSDD formatted character generator table.
+*		No error checks are done.
+* ------------------------------------------------------------------------------
+*
+		.text
+		.xdef	_vwputs
+*
+		.xref	_cgtable
+*
+* Argument offsets from a6:
+*
+OBASE		.equ	8		* L:  Output area base address
+NW		.equ	12		* W:  Character width of output area
+FG		.equ	14		* W:  Foreground color
+BG		.equ	16		* W:  Background color
+ROW		.equ	18		* W:  Row
+COL		.equ	20		* W:  Column
+STR		.equ	22		* L:  String base address
+*
+* Miscellaneous constants:
+*
+HPIX		.equ	8		* Horizontal pixels in the character
+*
+NVPIX		.equ	12		* Vertical pixels in the character
+VPITCH		.equ	12		* Vertical pitch between characters
+*
+* Register usage:
+*
+*	d0	output word and scratch
+*	d1	CG word and scratch
+*	d2	pixel counter
+*	d3	foreground color (in the 2 ms bits)
+*	d4	background color (in the 2 ms bits)
+*	d5	width of the area in bytes
+*	d6	scan line counter
+*
+*	a0	CG table pointer
+*	a1	output area scan line pointer
+*	a2	input character pointer
+*	a3	output area character pointer
+*
+		.page
+*
+_vwputs:	link	a6,#0		* Link stack frames
+		movem.l	d3-d6/a3,-(a7)	* Save registers we use
+		move.w	#14,d1		* Set shift constant
+		move.w	FG(a6),d3	* Setup foreground color
+		lsl.w	d1,d3		* ... in ms 2 bits of d3
+		move.w	BG(a6),d4	* Setup background color
+		lsl.w	d1,d4		* ... in ms 2 bits of d4
+		move.w	NW(a6),d5	* Get width in characters in d5
+		lsl.w	#1,d5		* ... make it words
+		move.w	ROW(a6),d0	* Calculate output address
+		move.w	#VPITCH,d1	* ...
+		mulu	d1,d0		* ... ROW * VPITCH
+		add.w	#NVPIX-1,d0	* ... + NVPIX-1
+		mulu	d5,d0		* ... * NW
+		clr.l	d1		* ...
+		move.w	COL(a6),d1	* ... + (COL * 2)
+		lsl.l	#1,d1		* ...
+		add.l	d1,d0		* ...
+		add.l	OBASE(a6),d0	* ... + OBASE
+		movea.l	d0,a3		* Leave output address in a3
+		movea.l	STR(a6),a2	* Put string address in a2
+*
+		.page
+cgl0:		clr.l	d0		* Clear out upper bits of d0
+		move.b	(a2)+,d0	* Get next character
+		beq	cgl5		* Done if character EQ 0
+*
+		movea.l	a3,a1		* Establish output pointer in a1
+		adda.l	#2,a3		* Update output pointer for next char.
+		lea	_cgtable,a0	* Establish CG pointer in a0
+		lsl.w	#1,d0		* ... 2 * character
+		adda.w	d0,a0		* ... + _cgtable address
+		move.w	#NVPIX-1,d6	* Set scan line counter in d6
+*
+cgl1:		move.w	#HPIX-1,d2	* Set pixel counter in d2
+		move.w	(a0),d1		* Get character generator word in d1
+*
+cgl2:		lsr.w	#2,d0		* Shift output word right 1 pixel
+		btst.l	#0,d1		* Check CG word ls bit
+		beq	cgl3		* Set background color if bit EQ 0
+*
+		or.w	d3,d0		* OR foreground color into output word
+		bra	cgl4		* Go update CG word
+*
+cgl3:		or.w	d4,d0		* OR background color into  output word
+*
+cgl4:		lsr.w	#1,d1		* Shift CG word right 1 pixel
+		dbf	d2,cgl2		* Loop for all 8 pixels
+*
+		move.w	d0,(a1)		* Store output word in output bitmap
+		suba.w	d5,a1		* Update output pointer
+		adda.l	#512,a0		* Update CG pointer for next scan line
+		dbf	d6,cgl1		* Loop for all scan lines
+*
+		bra	cgl0		* Loop for next character
+*
+cgl5:		movem.l	(a7)+,d3-d6/a3	* Restore registers
+		unlk	a6		* Unlink stack frames
+		rts			* Return to caller
+*
+		.end
