home *** CD-ROM | disk | FTP | other *** search
- /* FMR.C: Fujitsu FMR series Driver
- * for MicroEMACS 3.10
- * (C)Copyright 1990 by Daniel M. Lawrence
- *
- * Note that this driver relies on GDS.SYS being loaded!
- */
-
- #define termdef 1 /* don't define term external */
-
- #include <stdio.h>
- #include "estruct.h"
- #include "eproto.h"
- #include "edef.h"
- #include "elang.h"
-
- #if FMR
-
- /* FMR special key definitions */
-
- typedef struct KEYDEF {
- unsigned int kf_JIScode; /* JIS code of key */
- int kf_len; /* length of key sequence */
- char *kf_def; /* keystroke sequence */
- } KEYDEF;
-
- KEYDEF functab[] = {
-
- /* F1 - F10 */
- 0x8001, 0, NULL,
- 0x8002, 0, NULL,
- 0x8003, 0, NULL,
- 0x8004, 0, NULL,
- 0x8005, 0, NULL,
- 0x8006, 0, NULL,
- 0x8007, 0, NULL,
- 0x8008, 0, NULL,
- 0x8009, 0, NULL,
- 0x800a, 0, NULL,
-
- /* S-F1 - S-F10 */
- 0x800b, 0, NULL,
- 0x801d, 0, NULL,
- 0x8021, 0, NULL,
- 0x8022, 0, NULL,
- 0x8023, 0, NULL,
- 0x8024, 0, NULL,
- 0x8025, 0, NULL,
- 0x8026, 0, NULL,
- 0x8027, 0, NULL,
- 0x8028, 0, NULL,
-
- /* other special keys */
-
- /* cursor arrows */
- 0x1e, 0, NULL,
- 0x1f, 0, NULL,
- 0x1d, 0, NULL,
- 0x1c, 0, NULL
-
- };
-
- #define NUMFKEYS sizeof(functab)/sizeof(KEYDEF)
-
- /* EMACS internal key sequences mapped from FMR keys */
-
- KEYDEF newtab[NUMFKEYS] = {
-
- /* F1 - F10 */
- 0x8001, 3, "\000\0101",
- 0x8002, 3, "\000\0102",
- 0x8003, 3, "\000\0103",
- 0x8004, 3, "\000\0104",
- 0x8005, 3, "\000\0105",
- 0x8006, 3, "\000\0106",
- 0x8007, 3, "\000\0107",
- 0x8008, 3, "\000\0108",
- 0x8009, 3, "\000\0109",
- 0x800a, 3, "\000\0100",
-
- /* S-F1 - S-F10 */
- 0x800b, 3, "\000\0501",
- 0x801d, 3, "\000\0502",
- 0x8021, 3, "\000\0503",
- 0x8022, 3, "\000\0504",
- 0x8023, 3, "\000\0505",
- 0x8024, 3, "\000\0506",
- 0x8025, 3, "\000\0507",
- 0x8026, 3, "\000\0508",
- 0x8027, 3, "\000\0509",
- 0x8028, 3, "\000\0500",
-
- /* other special keys */
-
- /* cursor arrows */
- 0x1e, 3, "\000\010P",
- 0x1f, 3, "\000\010N",
- 0x1d, 3, "\000\010B",
- 0x1c, 3, "\000\010F"
- };
-
- union REGS rg; /* cpu register for use of DOS calls */
- struct SREGS sg; /* cpu segment registers */
-
- #if PROTO
- int PASCAL NEAR fnclabel(int f, int n);
- int PASCAL NEAR readparam( int *v);
- void PASCAL NEAR dobbnmouse(void);
- void PASCAL NEAR docsi( int oh);
- void PASCAL NEAR ttputs(char *string);
- #else
- int PASCAL NEAR fnclabel();
- int PASCAL NEAR readparam();
- void PASCAL NEAR dobbnmouse();
- void PASCAL NEAR docsi();
- void PASCAL NEAR ttputs();
- #endif
-
- #define NROW 24 /* Screen size. */
- #define NCOL 80 /* Edit if you want to. */
- #define NPAUSE 100 /* # times thru update to pause */
- #define MARGIN 8 /* size of minimim margin and */
- #define SCRSIZ 64 /* scroll size for extended lines */
- #define BEL 0x07 /* BEL character. */
- #define ESC 0x1B /* ESC character. */
-
- /* Forward references. */
- extern int PASCAL NEAR fmrmove();
- extern int PASCAL NEAR fmreeol();
- extern int PASCAL NEAR fmreeop();
- extern int PASCAL NEAR fmrbeep();
- extern int PASCAL NEAR fmropen();
- extern int PASCAL NEAR fmrrev();
- extern int PASCAL NEAR fmrclose();
- extern int PASCAL NEAR fmrkopen();
- extern int PASCAL NEAR fmrkclose();
- extern int PASCAL NEAR fmrcres();
- extern int PASCAL NEAR fmrparm();
-
- unsigned int octype; /* original cursor type */
- unsigned int ocraster; /* original cursor raster line limits */
-
- #if COLOR
- extern int PASCAL NEAR fmrfcol();
- extern int PASCAL NEAR fmrbcol();
-
- static int cfcolor = -1; /* current forground color */
- static int cbcolor = -1; /* current background color */
-
- int bcmap[16] = /* background color map */
- {0, 4, 8, 12, 2, 6, 10, 14,
- 1, 5, 9, 13, 3, 7, 11, 15};
- #endif
-
- /*
- * Standard terminal interface dispatch table. Most of the fields point into
- * "termio" code.
- */
- NOSHARE TERM term = {
- NROW-1,
- NROW-1,
- NCOL,
- NCOL,
- 0, 0,
- MARGIN,
- SCRSIZ,
- NPAUSE,
- fmropen,
- fmrclose,
- fmrkopen,
- fmrkclose,
- ttgetc,
- ttputc,
- ttflush,
- fmrmove,
- fmreeol,
- fmreeop,
- fmreeop,
- fmrbeep,
- fmrrev,
- fmrcres
- #if COLOR
- , fmrfcol,
- fmrbcol
- #endif
- };
-
- #if COLOR
- PASCAL NEAR fmrfcol(color) /* set the current output color */
-
- int color; /* color to set */
-
- {
- if (color == cfcolor)
- return;
- ttputc(ESC);
- ttputc('[');
- fmrparm((color & 7)+30);
- ttputc('m');
- cfcolor = color;
- }
-
- PASCAL NEAR fmrbcol(color) /* set the current background color */
-
- int color; /* color to set */
-
- {
- if (color == cbcolor)
- return;
- #if 0
- ttputc(ESC);
- ttputc('[');
- fmrparm(color+40);
- ttputc('m');
- #endif
- cbcolor = color;
- }
- #endif
-
- PASCAL NEAR fmrmove(row, col)
- {
- ttputc(ESC);
- ttputc('[');
- fmrparm(row+1);
- ttputc(';');
- fmrparm(col+1);
- ttputc('H');
- }
-
- PASCAL NEAR fmreeol()
- {
- ttputc(ESC);
- ttputc('[');
- ttputc('K');
- }
-
- PASCAL NEAR fmreeop()
- {
- #if COLOR
- fmrfcol(gfcolor);
- fmrbcol(gbcolor);
- #endif
- ttputc(ESC);
- ttputc('[');
- ttputc('2');
- ttputc('J');
-
- gds_erase(); /* dump the background colors */
- }
-
- PASCAL NEAR fmrrev(state) /* change reverse video state */
-
- int state; /* TRUE = reverse, FALSE = normal */
-
- {
- ttputc(ESC);
- ttputc('[');
- ttputc(state ? '7': '0');
- ttputc('m');
- if (state)
- fmrfcol(7);
- }
-
- PASCAL NEAR fmrcres() /* change screen resolution */
-
- {
- return(TRUE);
- }
-
- PASCAL NEAR spal(char *dummy) /* change pallette settings */
-
- {
- /* none for now */
- }
-
- PASCAL NEAR fmrbeep()
- {
- ttputc(BEL);
- ttflush();
- }
-
- PASCAL NEAR fmrparm(n)
- register int n;
- {
- register int q,r;
-
- q = n/10;
- if (q != 0) {
- r = q/10;
- if (r != 0) {
- ttputc((r%10)+'0');
- }
- ttputc((q%10) + '0');
- }
- ttputc((n%10) + '0');
- }
-
- PASCAL NEAR fmropen()
-
- {
- strcpy(sres, "NORMAL");
- revexist = TRUE;
- ttopen();
-
- ttputc(ESC); /* no attributes set */
- ttputc('[');
- fmrparm(40);
- ttputc('m');
-
- gds_init(); /* initialize the GDS driver */
- }
-
- PASCAL NEAR fmrclose()
-
- {
- #if COLOR
- fmrfcol(7);
- fmrbcol(0);
- #endif
- gds_erase(); /* close the GDS driver, clear background */
- ttclose();
- }
-
- PASCAL NEAR fmrkopen() /* open the keyboard */
-
- {
- /* save the original function key definitions */
- savekeys(&functab);
- setkeys(&newtab);
-
- /* save the cursor type */
- rg.h.ah = 0x0a; /* read cursor form */
- int86(0x91, &rg, &rg);
- octype = rg.h.al; /* save old cursor type */
- ocraster = rg.x.dx; /* save old cursor rasters */
-
- /* and set it as a block */
- rg.h.ah = 0x09; /* set cursor form */
- rg.h.al = 0xd1; /* full-size, fast blink,
- high intensity, box */
- int86(0x91, &rg, &rg);
-
- /* make sure the windows are re-framed */
- upwind();
- }
-
- PASCAL NEAR fmrkclose() /* close the keyboard (a noop here) */
-
- {
- setkeys(&functab);
- gds_erase(); /* close the GDS driver, clear bhackground */
-
- /* retore the original cursor */
- rg.h.ah = 0x09; /* set cursor form */
- rg.h.al = octype; /* restore original cursor type */
- rg.x.dx = ocraster; /* and raster limits */
- int86(0x91, &rg, &rg);
- }
-
- savekeys(ftable) /* save function key definitions */
-
- KEYDEF *ftable; /* table to save definitions to */
-
- {
- char *sp; /* ptr to new keystroke definition */
- int index; /* index into table to save */
- int jindex; /* an index into the keystroke buffer */
- int len; /* length of the keystroke buffer */
- char *kptr; /* ptr into kbuf */
- char kbuf[16]; /* buffer to hold definition */
-
- /* set up the pointers to the temp keystroke buffer */
- kptr = kbuf;
- sg.ds = FP_SEG(kptr);
- rg.x.di = FP_OFF(kptr);
- kptr[0] = 15; /* set length of buffer */
-
- /* for each key to save */
- for (index = 0; index < NUMFKEYS; index++) {
-
- /* set parameters to reading key assignment call */
- rg.h.ah = 0x0f; /* subfunction code */
- rg.x.dx = ftable[index].kf_JIScode; /* set key */
-
- /* call the BIOS for the info */
- int86x(0x90, &rg, &rg, &sg);
-
- /* and record the length */
- len = rg.x.cx;
- ftable[index].kf_len = len;
-
- /* and the keystrokes */
- sp = malloc(len);
- if (sp == NULL)
- return;
- for (jindex = 0; jindex < len; jindex++)
- sp[jindex] = kptr[jindex + 1];
- ftable[index].kf_def = sp;
- }
- }
-
- setkeys(ftable) /* set the function key definitions */
-
- KEYDEF *ftable; /* table to set definitions from */
-
- {
- char *sp; /* ptr to new keystroke definition */
- int index; /* index into table to save */
- int jindex; /* an index into the keystroke buffer */
- int len; /* length of the keystroke buffer */
- char *kptr; /* ptr into kbuf */
- char kbuf[16]; /* buffer to hold definition */
-
- kptr = kbuf;
-
- /* for each key to set */
- for (index = 0; index < NUMFKEYS; index++) {
-
- /* set up the pointers to the temp keystroke buffer */
- sg.ds = FP_SEG(kptr);
- rg.x.di = FP_OFF(kptr);
-
- /* set parameters to reading key assignment call */
- rg.h.ah = 0x0e; /* subfunction code */
- rg.h.al = 1; /* add 0 to the key address */
- rg.x.dx = ftable[index].kf_JIScode; /* set key */
- rg.x.cx = len = ftable[index].kf_len;
-
- /* copy the keystrokes in */
- sp = ftable[index].kf_def;
- for (jindex = 0; jindex < len; jindex++) {
- kptr[jindex] = sp[jindex];
- }
-
- /* call the BIOS for the info */
- int86x(0x90, &rg, &rg, &sg);
- }
- }
-
- PASCAL NEAR scwrite(row, outstr, forg, bacg) /* write a line out*/
-
- int row; /* row of screen to place outstr on */
- char *outstr; /* string to write out (must be term.t_ncol long) */
- int forg; /* forground color of string to write */
- int bacg; /* background color */
-
- {
- /* move to the begining of the destination line */
- fmrmove(row, 0);
-
- /* set the proper forground color */
- fmrfcol(forg);
-
- /* write the text to the screen */
- rg.h.ah = 0x1e; /* Character string output */
- rg.x.cx = term.t_ncol; /* # of chars to display */
- sg.ds = FP_SEG(outstr); /* point to string to display */
- rg.x.di = FP_OFF(outstr);
- int86x(0x91, &rg, &rg, &sg); /* call bios to write */
-
- /* set the background color for this line */
- gds_bline(row, bacg);
-
- /* scwrite moves the cursor.... */
- ttrow++;
- ttcol = 0;
- }
-
- #if FLABEL
- int PASCAL NEAR fnclabel(f, n) /* label a function key */
-
- int f,n; /* default flag, numeric argument [unused] */
-
- {
- /* on machines with no function keys...don't bother */
- return(TRUE);
- }
- #endif
-
- /**** FMR GDS functions ****/
-
- /* Some globals */
-
- unsigned char param[32]; /* parameter block for GDS_outdata */
-
- /* draw operations code definitions */
-
- #define OP(class, elem, parlen) class * 0x1000 + elem * 0x20 + parlen
- #define setpar(n, val) param[n] = (val) & 255; param[n+1] = ((val) >> 8) & 255
-
- gds_init()
-
- {
- /* set input parameters */
- rg.h.ah = 0x80; /* Graphics initialization function code */
-
- /* call GDS */
- int86x(0x92, &rg, &rg, &sg);
-
- /* return success if AH == 0 */
- if (rg.h.ah != 0)
- return(FALSE);
-
- gds_paintmode(1);
- return(TRUE);
- }
-
- gds_erase()
-
- {
- /* set input parameters */
- rg.h.ah = 0x84; /* Graphics initialization function code */
-
- /* call GDS */
- int86x(0x92, &rg, &rg, &sg);
-
- /* return success if AH == 0 */
- return(rg.h.ah == 0);
- }
-
- gds_outdata(data) /* execute graphic data commands */
-
- unsigned char *data; /* graphic command buffer */
-
- {
- /* set input parameters */
- rg.h.ah = 0x8f; /* Output of graphic data function code */
-
- sg.ds = FP_SEG(data); /* set address of command buffer */
- rg.x.di = FP_OFF(data);
-
- /* call GDS */
- int86x(0x92, &rg, &rg, &sg);
-
- /* return success if AH == 0 */
- return(rg.h.ah == 0);
- }
-
- gds_paintmode(mode) /* set paint mode */
-
- int mode; /* forground mode for painting */
-
- {
- /* set command buffer length */
- setpar(0, 4);
-
- /* set the graphic function code */
- setpar(2, OP(5, 22, 2));
-
- /* set the mode */
- setpar(4, mode);
-
- /* send it out */
- return(gds_outdata(param));
- }
-
- gds_boxcolor(color) /* set box color */
-
- int color;
-
- {
- /* set command buffer length */
- setpar(0, 4);
-
- /* set the graphic function code */
- setpar(2, OP(5, 23, 2));
-
- /* set the colorion */
- setpar(4, color);
-
- /* send it out */
- gds_outdata(param);
-
- /* set command buffer length */
- setpar(0, 4);
-
- /* set the graphic function code */
- setpar(2, OP(5, 28, 2));
-
- /* set the colorion */
- setpar(4, color);
-
- /* send it out */
- return(gds_outdata(param));
- }
-
- /* draw a line's background color box */
-
- gds_bline(line, color)
-
- int line; /* screen line to reset color on */
- int color; /* color to draw background line in */
-
- {
- int typos; /* top (upper left) coord of rectangle */
-
- typos = line * 30;
-
- /* set the proper color for the line */
- gds_boxcolor(bcmap[color]);
-
- /* set command buffer length */
- setpar(0, 10);
-
- /* set the graphic function code */
- setpar(2, OP(4, 11, 8));
-
- /* set the upper left point */
- setpar(4, 0);
- setpar(6, typos);
-
- /* set the lower right point */
- setpar(8, 1120);
- setpar(10, typos + 30);
-
- /* send it out */
- return(gds_outdata(param));
- }
- #else
- fmrhello()
- {
- }
- #endif
-