jsa@kolvi.UUCP (Jari Salminen) (03/21/87)
Here's diffs for MicroEMACS 3.8b to fix some bugs with IBM PC and
a new IBMPC driver which supports monochrome, CGA and EGA cards.
Spawn.c was changed to work correctly with Microsoft C.
Bind.c and main.c were changed to work with IBM 8-bit character set
(European users need them !).
Display.c and ibmpc.c were changed to support EGA in 43-line mode.
Now you can switch between 25- and 43-line modes with following macros:
;;;;;;;;;;;;;;;
; Macros for switching between 25 and 43 line mode with EGA
; 25-line mode
1 store-macro
set $sres CGA
delete-other-windows
clear-and-redraw
!endm
; 43-line mode
2 store-macro
set $sres EGA
delete-other-windows
clear-and-redraw
!endm
;;;;;;;;;;;;;;;
I call my version 3.8g and I hope you'll find these changes useful.
Enjoy !
Jari Salminen
UUCP: ..mcvax!kolvi!jsa
------ diff for bind.c follows ----------------------------
*** org/bind.c Sat Mar 21 00:33:43 1987
--- ./bind.c Sat Mar 21 00:21:47 1987
***************
*** 182
! register int c; /* command key to bind */
--- 182 -----
! register unsigned int c; /* command key to bind */
***************
*** 518,519
! register int c; /* character fetched */
! register char *tp; /* pointer into the token */
--- 518,519 -----
! register unsigned int c; /* character fetched */
! register unsigned char *tp; /* pointer into the token */
***************
*** 537
! if (*tp == 'F' && *(tp+1) == 'N') {
--- 537 -----
! else if (*tp == 'F' && *(tp+1) == 'N') {
***************
*** 543
! if (*tp == '^' && *(tp+1) == 'X') {
--- 543 -----
! else if (*tp == '^' && *(tp+1) == 'X') {
***************
*** 554,556
! /* make sure we are not lower case */
! if (c >= 'a' && c <= 'z')
! c -= 32;
--- 554,556 -----
! /* make sure we are not lower case (not with function keys) */
! if (*tp >= 'a' && *tp <= 'z' && !(c & SPEC))
! *tp -= 32;
***************
*** 558
! /* the final sequence... */
--- 558 -----
! /* get the character */
------ diff for display.c follows ----------------------------
*** org/display.c Sat Mar 21 00:34:54 1987
--- ./display.c Sat Mar 21 00:23:15 1987
***************
*** 55
! vscreen = (VIDEO **) malloc(term.t_nrow*sizeof(VIDEO *));
--- 55 -----
! vscreen = (VIDEO **) malloc(term.t_mrow*sizeof(VIDEO *));
***************
*** 61
! pscreen = (VIDEO **) malloc(term.t_nrow*sizeof(VIDEO *));
--- 61 -----
! pscreen = (VIDEO **) malloc(term.t_mrow*sizeof(VIDEO *));
***************
*** 67
! for (i = 0; i < term.t_nrow; ++i)
--- 67 -----
! for (i = 0; i < term.t_mrow; ++i)
------ diff for ibmpc.c follows ----------------------------
*** org/ibmpc.c Sat Mar 21 00:32:03 1987
--- ./ibmpc.c Sat Mar 21 00:23:41 1987
***************
*** 4
--- 5 -----
+ * Supports: IBM Monochrome, IBM CGA and IBM EGA display cards.
***************
*** 14
--- 16,21 -----
+ #if MSC
+ #include <memory.h>
+ #define peek(a,b,c,d) movedata(a,b,FP_SEG(c),FP_OFF(c),d)
+ #define poke(a,b,c,d) movedata(FP_SEG(c),FP_OFF(c),a,b,d)
+ #endif
+
***************
*** 15
--- 23 -----
+ #define NROW43 43 /* Screen size for EGA 43-line mode */
***************
*** 28
--- 37 -----
+ #define CDEGA 2 /* EGA graphics card */
***************
*** 30
--- 40,47 -----
+ #define SRES_MONO "MONO" /* $sres text for monochrome */
+ #define SRES_CGA "CGA" /* $sres text for CGA */
+ #define SRES_EGA "EGA" /* $sres text for EGA */
+
+ #define MONOCURSOR 0x0B0D /* monochrome cursor */
+ #define CGACURSOR 0x0607 /* CGA cursor */
+ #define EGACURSOR 0x0709 /* EGA cursor */
+
***************
*** 33
! int *scptr[NROW]; /* pointer to screen lines */
--- 50 -----
! int *scptr[NROW43]; /* pointer to screen lines */
***************
*** 34
--- 52,53 -----
+ int curmode; /* cursor mode */
+ int vidmode_changed = 0; /* has video mode been changed */
***************
*** 68
--- 88 -----
+ NROW43-1,
***************
*** 70
- NROW-1,
--- 89 -----
***************
*** 95,96
- extern union REGS rg;
-
--- 113 -----
***************
*** 142
! if (dtype == CDCGA)
--- 159 -----
! if ((dtype == CDCGA) || (dtype == CDEGA))
***************
*** 194
! rg.x.dx = 0x184f; /* lower right corner of scroll */
--- 211,212 -----
! rg.x.dx = (term.t_nrow << 8) | (term.t_ncol-1);
! /* lower right corner of scroll */
***************
*** 220
! if (strcmp(res, "CGA") == 0) {
--- 238,244 -----
! vidmode_changed = 0;
! if (strcmp(res, SRES_CGA) == 0 || strcmp(res, SRES_EGA) == 0) {
! if (strcmp(res, SRES_EGA) == 0 && dtype == CDEGA) {
! vidmode_changed = 1;
! scinit(CDEGA);
! return(TRUE);
! } else {
***************
*** 223
! } else if (strcmp(res, "MONO") == 0) {
--- 247,248 -----
! }
! } else if (strcmp(res, SRES_MONO) == 0) {
***************
*** 240
--- 266,271 -----
+ /* get current cursor mode */
+ rg.x.ax = 0x0300;
+ rg.h.bh = 0;
+ int86(0x10, &rg, &rg);
+ curmode = rg.x.cx;
+
***************
*** 252
--- 284,291 -----
+ if (vidmode_changed)
+ scinit(CDSENSE); /* initialize display */
+
+ /* restore cursor mode */
+ rg.x.ax = 0x0100;
+ rg.x.cx = curmode;
+ int86(0x10, &rg, &rg);
+
***************
*** 275
--- 315,319 -----
+ #if MSC
+ char far *buf;
+ #else
+ char *buf;
+ #endif
***************
*** 277
! /* if asked...find out what display is connected */
--- 321,322 -----
! /* if asked...find out what display is connected (CGA default) */
! if (type == CDSENSE) {
***************
*** 281
! strcpy(sres, "CGA");
--- 326 -----
! strcpy(sres, SRES_CGA);
***************
*** 283
! strcpy(sres, "MONO");
--- 328 -----
! strcpy(sres, SRES_MONO);
***************
*** 285
--- 331,337 -----
+ } else {
+ /* test if EGA present */
+ rg.x.ax = 0x1200;
+ rg.x.bx = 0xff10;
+ int86(0x10,&rg, &rg); /* If EGA, bh=0-1 and bl=0-3 */
+ if ( !(rg.x.bx & 0xfefc)) { /* Yes, it's EGA */
+ dtype = CDEGA;
***************
*** 286
--- 339,340 -----
+ }
+ }
***************
*** 287
--- 342,391 -----
+ /* If forced to EGA 43-line mode */
+ if (type == CDEGA) {
+ term.t_nrow = NROW43-1;
+
+ /* and put the beast into EGA 43 row mode */
+ rg.x.ax = 3;
+ int86(0x10, &rg, &rg);
+
+ rg.x.ax = 0x1112;
+ rg.h.bl = 0;
+ int86(0x10, &rg, &rg);
+
+ peek(0x40, 0x87, buf, 1);
+ *buf |= 1;
+ poke(0x40, 0x87, buf, 1);
+ *buf = 0xf8;
+ poke(0x40, 0x88, buf, 1);
+
+
+ /* set the cursor */
+ rg.x.ax = 0x0100;
+ rg.h.bh = 0;
+ rg.x.cx = EGACURSOR;
+ int86(0x10, &rg, &rg);
+
+ *buf = 0xf9;
+ poke(0x40, 0x88, buf, 1);
+
+ strcpy(sres, SRES_EGA);
+ } else {
+ if (type == CDMONO) strcpy(sres, SRES_MONO);
+ else if (type == CDCGA) strcpy(sres, SRES_CGA);
+
+ term.t_nrow = NROW-1;
+
+ /* and put the beast into 80 column mode */
+ rg.x.ax = (dtype == CDMONO) ? 0x0002 : 0x0003;
+ int86(0x10, &rg, &rg);
+
+ peek(0x40, 0x87, buf, 1);
+ *buf &= 0xFE;
+ poke(0x40, 0x87, buf, 1);
+
+ /* set the cursor */
+ rg.x.ax = 0x0100;
+ rg.h.bl = 0;
+ rg.x.cx = (dtype == CDMONO) ? MONOCURSOR : CGACURSOR;
+ int86(0x10, &rg, &rg);
+ }
+
***************
*** 289,290
! for (i = 0; i < NROW; i++) {
! addr.laddr = scadd + (long)(NCOL * i * 2);
--- 393,394 -----
! for (i = 0; i <= term.t_mrow; i++) {
! addr.laddr = scadd + (long)(term.t_mcol * i * 2);
------ diff for main.c follows ----------------------------
*** org/main.c Sat Mar 21 00:33:14 1987
--- ./main.c Sat Mar 21 00:21:05 1987
***************
*** 554
--- 555,560 -----
+ * 4-mar-87
+ * - updated patches by Walter Bright (3.8f)
+ * 20-mar-87 [3.8g by Jari Salminen]
+ * - fixed bugs with IBM PC 8-bit characters
+ * - EGA support added to IBMPC.C. Switching between 25 and 43 line mode
+ * possible.
***************
*** 940,941
! if ((c>=0x20 && c<=0x7E) /* Self inserting. */
! || (c>=0xA0 && c<=0xFE)) {
--- 946,951 -----
! if ((c>=0x20 && c<=0x7E) || /* Self inserting. */
! #if IBMPC
! (c>=0x80 && c<=0xFE)) { /* Allow 8-bit characters */
! #else
! (c>=0xA0 && c<=0xFE)) { /* Allow 8-bit characters */
! #endif
------ diff for spawn.c follows ----------------------------
*** org/spawn.c Sat Mar 21 00:34:11 1987
--- ./spawn.c Sat Mar 21 00:22:24 1987
***************
*** 43
- #define system(a) spawnlp(P_WAIT, a, NULL)
--- 42 -----
***************
*** 89
! #if MSDOS & AZTEC
--- 89 -----
! #if MSDOS & (AZTEC | MSC)
***************
*** 271
! return (TRUE);
--- 271 -----
! return(TRUE);
***************
*** 306
! static char filnam[] = "command";
--- 306 -----
! static char filnam[25] = "command";
***************
*** 321,323
! if ((tmp = getenv("TMP")) == NULL)
! strcpy(filnam, "command");
! else
--- 321 -----
! if ((tmp = getenv("TMP")) != NULL)
***************
*** 324
--- 323 -----
+ strcat(filnam, "command");
***************
*** 365
! strcat(line," >>");
--- 364 -----
! strcat(line," >");
***************
*** 559
! #if ~AZTEC & MSDOS
--- 558 -----
! #if (~MSC & ~AZTEC) & MSDOS
***************
*** 587,589
- #if MSC
- return(spawnlp(P_WAIT, cmd, tail, NULL));
- #endif
--- 585 -----
---- END OF DIFFS ------