diff -r -u -N lcdproc-0.4-pre9.orig/Makefile lcdproc-0.4-pre9/Makefile
--- lcdproc-0.4-pre9.orig/Makefile	Fri Oct 22 01:40:15 1999
+++ lcdproc-0.4-pre9/Makefile	Thu Dec 19 10:48:59 2002
@@ -29,7 +29,8 @@
 	server/drivers/text.c server/drivers/text.h \
 	server/drivers/debug.c server/drivers/debug.h \
 	server/drivers/curses_drv.c server/drivers/curses_drv.h \
-	server/drivers/hd44780.c server/drivers/hd44780.h server/drivers/port.h
+	server/drivers/hd44780.c server/drivers/hd44780.h server/drivers/port.h \
+	server/drivers/hg12605.c server/drivers/hg12605.h
 EXTRAS = WHATSNEW INSTALL README COPYING TODO README.IRman \
 	 docs/menustuff.txt docs/netstuff.txt docs/README.dg \
 	docs/README.dg2 docs/hd44780_howto.txt
diff -r -u -N lcdproc-0.4-pre9.orig/Makefile.config lcdproc-0.4-pre9/Makefile.config
--- lcdproc-0.4-pre9.orig/Makefile.config	Sat Nov 13 20:49:54 1999
+++ lcdproc-0.4-pre9/Makefile.config	Thu Dec 19 21:25:47 2002
@@ -81,6 +81,10 @@
 #LPTPORT = 0x278
 #LPTPORT = 0x3bc
 
+# HG12605 connected to parallel port
+DRIVERS += -DHG12605_DRV
+DOBJ += hg12605.o
+
 # Joystick input...  handy!
 DRIVERS += -DJOY_DRV
 DOBJ += joy.o
diff -r -u -N lcdproc-0.4-pre9.orig/server/drivers/Makefile lcdproc-0.4-pre9/server/drivers/Makefile
--- lcdproc-0.4-pre9.orig/server/drivers/Makefile	Fri Oct 22 01:28:41 1999
+++ lcdproc-0.4-pre9/server/drivers/Makefile	Thu Dec 19 13:38:56 2002
@@ -9,8 +9,9 @@
 	MtxOrb.c MtxOrb.h wirz-sli.c wirz-sli.h text.c text.h \
 	curses_drv.c curses_drv.h drv_base.c drv_base.h \
 	hd44780.c hd44780.h port.h joy.c joy.h irman.c irman.h \
+	hg12605.c hg12605.h \
 	CFontz.c CFontz.h
-INCLUDE = -I../../shared
+INCLUDE = -I../../shared -I/usr/src/linux/include
 
 
 ###################################################################
diff -r -u -N lcdproc-0.4-pre9.orig/server/drivers/hg12605.c lcdproc-0.4-pre9/server/drivers/hg12605.c
--- lcdproc-0.4-pre9.orig/server/drivers/hg12605.c	Thu Jan  1 03:00:00 1970
+++ lcdproc-0.4-pre9/server/drivers/hg12605.c	Thu Dec 19 22:05:21 2002
@@ -0,0 +1,429 @@
+/*
+ * LCDproc driver module for Hyundai Electronics HG12605 LCD display
+ * connected to LPT port.
+ *
+ *
+ * Copyright (C) 2002 Cougar <cougar@random.ee>
+ *                                http://www.version6.net/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ *
+ * Here you can find display specifications and other useful information:
+ *   http://dallext.hansung.ac.kr/mpe/datasheet/hg12605-1.pdf
+ *   http://dallext.hansung.ac.kr/mpe/datasheet/hg12605-2.pdf
+ *   http://www.adx.co.nz/techinfo/micros/grascree/128x64%20LCD%20display%20going.htm
+ *
+ *
+ * Connecting with PC
+ *
+ * You need DB25 male connector, 10 kohm variable resistor (for LCD contrast
+ * tuning), a piece of ribbon cale and one male 3.5" or 5.25" disk drive
+ * power connector to power up your LCD.
+ *
+ * Now solder all parts together using following schema
+ *
+ *  HG12605		LPT			Comments
+ *   1	Vss		18	GROUND		connect to -5V, first pin of resistor
+ *   2	Vdd		 -			connect to +5V
+ *   3	Vo		 -			connect to middle pin of resistor
+ *   4	D/I		14	/AUTOFD
+ *   5	R/W		18	GROUND
+ *   6	E		 1	/STROBE
+ *   7	DB0		 2	D0
+ *   8	DB1		 3	D1
+ *   9	DB2		 4	D2
+ *  10	DB3		 5	D3
+ *  11	DB4		 6	D4
+ *  12	DB5		 7	D5
+ *  13	DB6		 8	D6
+ *  14	DB7		 9	D7
+ *  15	CS1		16	INIT
+ *  16	CS2		17	/SLCTIN
+ *  17	/RES		 -			connect to +5V
+ *  18	Vout		 -			connect to third pin of resistor
+ *  19	A		 -			not used
+ *  20	K		 -			not used
+ *  
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <termios.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/errno.h>
+#include <sys/ioctl.h>
+#include <linux/ppdev.h>
+#include <linux/parport.h>
+#include "/usr/src/linux/drivers/video/font_6x11.c"
+
+#include "lcd.h"
+#include "hg12605.h"
+
+#include "../../shared/str.h"
+
+lcd_logical_driver *HG12605;
+static _HG12605 *HG = NULL;
+
+int HG12605_init(struct lcd_logical_driver *driver, char *args) 
+{
+	char *argv[64];
+	int argc;
+	char device[256] = "/dev/parport0";
+	int i;
+
+	argc = get_args(argv, args, 64);
+	for (i = 0; i < argc; i++) {
+		if ((strcmp(argv[i], "-d") == 0) ||
+		    (strcmp(argv[i], "--device") == 0)) {
+			if ((i + 1) > argc) {
+				fprintf(stderr, "HG12605_init: %s requires an argument\n", argv[i]);
+				return -1;
+			}
+			strncpy(device, argv[i + 1], 255);
+		} else if ((strcmp(argv[i], "-h") == 0) ||
+		           (strcmp(argv[i], "--help") == 0)) {
+			printf("LCDproc HG12605 driver\n"
+			       "\t-d\t--device\tSelect the output device to use [/dev/parport0]\n"
+			       "\t-h\t--help\t\tShow this help information\n");
+			return -1;
+		}
+	}
+
+	HG12605 = driver;
+
+	driver->wid = 21;
+	driver->hgt = 8;
+	driver->cellwid = 6;
+	driver->cellhgt = 8;
+
+	// TODO: fix this crap
+	lcd.wid = 21;
+	lcd.hgt = 8;
+	lcd.cellwid = 6;
+	lcd.cellhgt = 8;
+
+	// Recreate framebuf because it was statically created for 20x4 LCDs
+	if (driver->framebuf)
+		free (driver->framebuf);
+
+	driver->framebuf = malloc(driver->wid * driver->hgt);
+
+	if (!driver->framebuf) {
+		HG12605_close();
+		return -1;
+	}
+
+	memset(driver->framebuf, ' ', driver->wid * driver->hgt);
+
+	driver->clear = HG12605_clear;
+	driver->string = HG12605_string;
+	driver->chr = HG12605_chr;
+	driver->vbar = HG12605_vbar;
+	driver->init_vbar = HG12605_nop;
+	driver->hbar = HG12605_hbar;
+	driver->init_hbar = HG12605_nop;
+	driver->init = HG12605_init;
+	driver->close = HG12605_close;
+	driver->flush = HG12605_flush;
+	driver->flush_box = HG12605_flush_box;
+	driver->backlight = HG12605_backlight;
+	driver->draw_frame = HG12605_draw_frame;
+
+	HG = hg12605_open_parport(device);
+
+	return 200;
+}
+
+void HG12605_nop()
+{
+	return;
+}
+
+void HG12605_close() 
+{
+	if (lcd.framebuf)
+		free(lcd.framebuf);
+	lcd.framebuf = NULL;
+}
+
+void HG12605_clear() 
+{
+	memset(lcd.framebuf, ' ', lcd.wid * lcd.hgt);
+}
+
+void HG12605_flush()
+{
+	lcd.draw_frame(lcd.framebuf);
+}
+
+void HG12605_string(int x, int y, char string[]) 
+{
+	int i;
+
+	for(i = 0; string[i]; i++)
+		HG12605_chr(x + i, y, string[i]);
+}
+
+void HG12605_chr(int x, int y, char c) 
+{
+	if ((((y - 1) * lcd.wid) + (x - 1)) >  (lcd.wid * lcd.hgt))
+		return;
+	lcd.framebuf[((y - 1)* lcd.wid) + (x - 1)] = c;
+}
+
+void HG12605_backlight(int on)
+{
+	if (HG->inverse != on)
+		return;
+	HG->inverse = ~on;
+	HG12605_flush();
+}
+
+void HG12605_vbar(int x, int len) 
+{
+	int y;
+	for(y = lcd.hgt; (y > 0) && (len > 0); y--) {
+		HG12605_chr(x, y, '|');
+		len -= lcd.cellhgt;
+	}
+}
+
+void HG12605_hbar(int x, int y, int len) 
+{
+	for(; x <= (lcd.wid) && (len > 0); x++) {
+		HG12605_chr(x, y, '-');
+		len -= lcd.cellwid;
+	}
+}
+
+void HG12605_flush_box(int lft, int top, int rgt, int bot)
+{
+	HG12605_flush();
+}
+
+void HG12605_draw_frame(char *dat)
+{
+	int x, y;
+
+	if (!dat)
+		return;
+
+	for(y = 0; y < lcd.hgt; y++) {
+		for(x = 0; x < lcd.wid; x++) {
+			hg12605_set_xy(HG, x, y);
+			hg12605_write_char(HG, dat[(y * lcd.wid) + x]);
+		}
+	}
+}
+
+
+/*
+ *
+ * Hardware driver funcions
+ *
+ */
+
+static _HG12605 *hg12605_open_parport(char *dev)
+{
+	static _HG12605 _hg12605 = {0, };
+	int mode;
+	int i, j, b;
+
+	if ((_hg12605.fd = open(dev, O_RDWR)) == -1) {
+		perror("open(parport)");
+		exit(1);
+	}
+
+	mode = PARPORT_MODE_PCSPP;
+	if (ioctl(_hg12605.fd, PPSETMODE, &mode) == -1) {
+		perror("ioctl(PPSETMODE)");
+		exit(1);
+	}
+
+	if (ioctl(_hg12605.fd, PPEXCL, NULL) == -1) {
+		perror("ioctl(PPEXCL)");
+		exit(1);
+	}
+	if (ioctl(_hg12605.fd, PPCLAIM, NULL) == -1) {
+		perror("ioctl(PPCLAIM)");
+		exit(1);
+	}
+
+	hg12605_write_byte(&_hg12605, 3, HG12605_CMD_DISPLAY_OFF, 1);
+	hg12605_write_byte(&_hg12605, 3, HG12605_CMD_START_LINE | 0, 1);
+	hg12605_write_byte(&_hg12605, 3, HG12605_CMD_SET_ADDR | 0, 1);
+	b = (_hg12605.inverse) ? 0xff : 0x00;
+	for (i = 0; i < 8; i++) {
+		hg12605_write_byte(&_hg12605, 3, HG12605_CMD_SET_PAGE | i, 1);
+		for (j = 0; j < 64; j++)
+			hg12605_write_byte(&_hg12605, 3, b, 0);
+	}
+	hg12605_write_byte(&_hg12605, 3, HG12605_CMD_SET_PAGE | 0, 1);
+	hg12605_write_byte(&_hg12605, 3, HG12605_CMD_SET_ADDR | 0, 1);
+	hg12605_write_byte(&_hg12605, 3, HG12605_CMD_DISPLAY_ON, 1);
+
+	_hg12605.last_chip = 0;
+
+	return &_hg12605;
+}
+
+static void hg12605_parport_write_data(_HG12605 *hg, unsigned char data)
+{
+	if (ioctl(hg->fd, PPWDATA, &data) == -1) {
+		perror("ioctl(PPWDATA)");
+		exit(1);
+	}
+}
+
+static void hg12605_parport_write_control(_HG12605 *hg, unsigned char controlbits, int values)
+{
+	struct ppdev_frob_struct frob;
+	frob.mask = controlbits;
+	frob.val = values;
+
+	if (ioctl(hg->fd, PPFCONTROL, &frob) == -1) {
+		perror("ioctl(PPFCONTROL)");
+		exit(1);
+	}
+}
+
+static void hg12605_write_byte(_HG12605 *hg, unsigned char chip, unsigned char data, unsigned char di)
+{
+	int i;
+
+	hg12605_parport_write_control(hg, PARPORT_CONTROL_INIT
+	                              | PARPORT_CONTROL_SELECT
+	                              | PARPORT_CONTROL_AUTOFD,
+	                              ((chip & 0x01) ? PARPORT_CONTROL_INIT : 0)
+	                              | ((chip & 0x02) ? 0 : PARPORT_CONTROL_SELECT)
+	                              | (di ? PARPORT_CONTROL_AUTOFD : 0));
+	hg12605_parport_write_data(hg, data);
+	hg12605_parport_write_control(hg, PARPORT_CONTROL_STROBE, 0);
+	for (i = 0; i < 1000; i++);
+	hg12605_parport_write_control(hg, PARPORT_CONTROL_STROBE, PARPORT_CONTROL_STROBE);
+	hg12605_parport_write_control(hg, PARPORT_CONTROL_INIT | PARPORT_CONTROL_SELECT, PARPORT_CONTROL_INIT);
+}
+
+static void hg12605_write_cmd(_HG12605 *hg, unsigned char chip, unsigned char cmd)
+{
+	chip &= 1;
+	hg12605_write_byte(hg, chip + 1, cmd, 1);
+	hg->last_chip = chip;
+}
+
+static void hg12605_write_data(_HG12605 *hg, unsigned char chip, unsigned char data)
+{
+	chip &= 1;
+	hg12605_write_byte(hg, chip + 1, data, 0);
+	hg->addr[chip] ++;
+	hg->addr[chip] &= 63;
+	hg->last_chip = chip;
+}
+
+static void hg12605_start_line(_HG12605 *hg, unsigned char chip, unsigned char start_line)
+{
+	chip &= 1;
+	if ((hg->start_line[chip] == start_line) && (hg->last_chip == chip))
+		return;
+	hg12605_write_cmd(hg, chip, HG12605_CMD_START_LINE | (start_line & 63));
+	hg->start_line[chip] = start_line;
+}
+
+static void hg12605_set_pageaddr(_HG12605 *hg, unsigned char chip, unsigned char page, unsigned char addr)
+{
+	chip &= 1;
+	if ((hg->page[chip] == page) && (hg->addr[chip] == addr) && (hg->last_chip == chip))
+		return;
+	hg12605_write_cmd(hg, chip, HG12605_CMD_SET_PAGE | (page & 7));
+	hg12605_write_cmd(hg, chip, HG12605_CMD_SET_ADDR | (addr & 63));
+	hg->page[chip] = page;
+	hg->addr[chip] = addr;
+}
+
+static void hg12605_scroll(_HG12605 *hg)
+{
+	int i, b;
+
+	hg12605_set_pageaddr(hg, 0, (hg->start_line[0] >> 3), 0);
+	hg12605_set_pageaddr(hg, 1, (hg->start_line[1] >> 3), 0);
+	b = (hg->inverse) ? 0xff : 0x00;
+	for (i = 0; i < 64; i++)
+		hg12605_write_byte(hg, 3, b, 0);
+	if (hg->softscroll) {
+		for (i = 0; i < 8; i++) {
+			hg->start_line[0]++;
+			hg->start_line[1]++;
+			hg->start_line[0] &= 63;
+			hg->start_line[1] &= 63;
+			hg12605_write_cmd(hg, 0, HG12605_CMD_START_LINE | hg->start_line[0]);
+			hg12605_write_cmd(hg, 1, HG12605_CMD_START_LINE | hg->start_line[1]);
+			usleep(50000);
+		}
+	} else {
+		hg->start_line[0] += 8;
+		hg->start_line[1] += 8;
+		hg->start_line[0] &= 63;
+		hg->start_line[1] &= 63;
+		hg12605_write_cmd(hg, 0, HG12605_CMD_START_LINE | hg->start_line[0]);
+		hg12605_write_cmd(hg, 1, HG12605_CMD_START_LINE | hg->start_line[1]);
+	}
+}	
+
+static void hg12605_write_char(_HG12605 *hg, unsigned char chr)
+{
+	int i, j;
+	unsigned char yrow;
+	unsigned char chip;
+	
+	if (chr == '\r') {
+		hg->termx = 0;
+		return;
+	}
+	if ((chr == '\n') || (hg->termx > 20)) {
+		hg->termx = 0;
+		hg->termy++;
+		if (hg->termy == 8) {
+			hg12605_scroll(hg);
+			hg->termy = 7;
+		}
+		if (chr == '\n')
+			return;
+	}
+	if (chr == '\t')
+		chr = ' ';
+
+	for (i = 1; i < 8; i++) {
+		yrow = 0;
+		for (j = 0; j < 8; j++)
+			if ((fontdata_6x11[(chr << 3) + (chr << 1) + chr + j + 1]) & (0x80 >> i))
+				yrow |= (0x01 << j);
+		if (hg->inverse)
+			yrow ^= 0xff;
+		chip = (((hg->termx * 6) + (i - 1) + 1) < 64) ? 0 : 1;
+		hg12605_set_pageaddr(hg, chip, hg->termy + (hg->start_line[chip] >> 3), (hg->termx * 6) + i - 1 + 1);
+		hg12605_write_data(hg, chip, yrow);
+	}
+	hg->termx++;
+}
+
+static void hg12605_write_str(_HG12605 *hg, unsigned char *str)
+{
+	char *p = str;
+
+	while (*p) {
+		hg12605_write_char(hg, *p);
+		p++;
+	}
+}
+
+static void hg12605_set_xy(_HG12605 *hg, unsigned char x, unsigned char y)
+{
+	hg->termx = x;
+	hg->termy = y;
+}
diff -r -u -N lcdproc-0.4-pre9.orig/server/drivers/hg12605.h lcdproc-0.4-pre9/server/drivers/hg12605.h
--- lcdproc-0.4-pre9.orig/server/drivers/hg12605.h	Thu Jan  1 03:00:00 1970
+++ lcdproc-0.4-pre9/server/drivers/hg12605.h	Thu Dec 19 22:13:41 2002
@@ -0,0 +1,50 @@
+#ifndef HG12605_H
+#define	HG12605_H
+
+extern lcd_logical_driver *HG12605;
+
+int HG12605_init(struct lcd_logical_driver *driver, char *args);
+void HG12605_nop();
+void HG12605_close();
+void HG12605_clear();
+void HG12605_flush();
+void HG12605_string(int x, int y, char string[]);
+void HG12605_chr(int x, int y, char c);
+void HG12605_backlight(int on);
+void HG12605_output(int on);
+void HG12605_vbar(int x, int len);
+void HG12605_hbar(int x, int y, int len);
+void HG12605_flush_box(int lft, int top, int rgt, int bot);
+void HG12605_draw_frame(char *dat);
+
+#define	HG12605_CMD_DISPLAY_ON	0x3F
+#define	HG12605_CMD_DISPLAY_OFF	0x3E
+#define	HG12605_CMD_START_LINE	0xC0
+#define	HG12605_CMD_SET_PAGE	0xB8
+#define	HG12605_CMD_SET_ADDR	0x40
+
+typedef struct {
+	int fd;
+	unsigned char start_line[2];
+	unsigned char page[2];
+	unsigned char addr[2];
+	unsigned char last_chip;
+	unsigned char termx, termy;
+	unsigned char softscroll;
+	unsigned char inverse;
+} _HG12605;
+
+static _HG12605 *hg12605_open_parport(char *dev);
+static void hg12605_parport_write_data(_HG12605 *hg, unsigned char data);
+static void hg12605_parport_write_control(_HG12605 *hg, unsigned char controlbits, int values);
+static void hg12605_write_byte(_HG12605 *hg, unsigned char chip, unsigned char data, unsigned char di);
+static void hg12605_write_cmd(_HG12605 *hg, unsigned char chip, unsigned char cmd);
+static void hg12605_write_data(_HG12605 *hg, unsigned char chip, unsigned char data);
+static void hg12605_start_line(_HG12605 *hg, unsigned char chip, unsigned char start_line);
+static void hg12605_set_pageaddr(_HG12605 *hg, unsigned char chip, unsigned char page, unsigned char addr);
+static void hg12605_scroll(_HG12605 *hg);
+static void hg12605_write_char(_HG12605 *hg, unsigned char chr);
+static void hg12605_write_str(_HG12605 *hg, unsigned char *str);
+static void hg12605_set_xy(_HG12605 *hg, unsigned char x, unsigned char y);
+
+#endif
diff -r -u -N lcdproc-0.4-pre9.orig/server/drivers/lcd.c lcdproc-0.4-pre9/server/drivers/lcd.c
--- lcdproc-0.4-pre9.orig/server/drivers/lcd.c	Fri Oct 22 02:44:50 1999
+++ lcdproc-0.4-pre9/server/drivers/lcd.c	Thu Dec 19 21:01:23 2002
@@ -36,6 +36,10 @@
 #include "hd44780.h"
 #endif
 
+#ifdef HG12605_DRV
+#include "hg12605.h"
+#endif
+
 #ifdef SLI_DRV
 #include "wirz-sli.h"
 #endif
@@ -64,6 +68,9 @@
 #endif
 #ifdef HD44780_DRV
   { "HD44780",  HD44780_init, },
+#endif
+#ifdef HG12605_DRV
+  { "HG12605",  HG12605_init, },
 #endif
 #ifdef SLI_DRV
   { "sli",      sli_init, },
diff -r -u -N lcdproc-0.4-pre9.orig/server/main.c lcdproc-0.4-pre9/server/main.c
--- lcdproc-0.4-pre9.orig/server/main.c	Fri Oct 22 02:42:32 1999
+++ lcdproc-0.4-pre9/server/main.c	Thu Dec 19 12:12:20 2002
@@ -353,7 +353,7 @@
   printf("\t-h\t--help\n\t\t\tDisplay this help screen\n");
   printf("\t-t\t--type <size>\n\t\t\tSelect an LCD size (20x4, 16x2, etc...)\n");
   printf("\t-d\t--driver <driver> [args]\n\t\t\tAdd a driver to use:\n");
-  printf("\t\t\tCFontz, curses, HD44780, irmanin, joy,\n\t\t\tMtxOrb, text\n");
+  printf("\t\t\tCFontz, curses, HD44780, HG12605, irmanin, joy,\n\t\t\tMtxOrb, text\n");
   printf("\t\t\t(args will be passed to the driver for init)\n");
   printf("\t-f\t--foreground\n\t\t\tRun in the foreground (no daemon)\n");
   printf("\t-b\t--backlight <mode>\n\t\t\tSet backlight mode (on, off, open)\n");
