home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / PROGRAMS / LIST / EP-ECHED.ARK / ECHED.C < prev    next >
Text File  |  1988-05-21  |  29KB  |  1,537 lines

  1. /*
  2.     Character editor for Epson graphic fonts
  3.             Greg Lee, Nov '83.
  4. */
  5.  
  6. #include <bdscio.h>
  7. #include <hardware.h>
  8.  
  9. #define WYSE    0
  10.  
  11. #define FF 0x0c        /* formfeed character, or zero if not supported */
  12. #define    FTSIZE     9984    /* was 7936 = 62 recs * 128 */
  13. #define MAXLINE 137
  14. #define PICA 24
  15.  
  16.  
  17. /* masks for mode bits */
  18. #define ELITE     0x01
  19. #define PRPTNL     0x02
  20. #define CMPRSSD  0x04
  21. #define EMPHSZD  0x08
  22. #define DBLSTRK  0x10
  23. #define EXPNDD     0x20
  24. #define UNDRLN     0x40
  25. #define ITALIC     0x80
  26. /*    So that's b0-b7; b8,b9,b10 are used for the
  27.     current graphics font, which is 'fo'-1.        */
  28. #define SUPSCRPT 0x0800
  29. #define SUBSCRPT 0x1000
  30. #define BENT     0x2000
  31. #define TALL     0x4000
  32. #define IGNORE     0x8000
  33. /*    All bits are committed                */
  34.  
  35.  
  36. #define TOPROW  0
  37. #define    BOTROW  23
  38. #define    LEFTCOL  0
  39. #define    RIGHTCOL  79
  40.  
  41. #if WYSE
  42. #define BLACK    '1'
  43. #define BLUE    '2'
  44. #define GREEN    '3'
  45. #define CYAN    '4'
  46. #define RED    '5'
  47. #define MAGENTA '6'
  48. #define YELLOW    '7'
  49. #define WHITE    '8'
  50.  
  51. #define UPPRDOT    ','
  52. #define LOWRDOT    '-'
  53. #define BOTHDOT '7'
  54. #define NODOT    ' '
  55. #endif
  56.  
  57. struct _ini
  58. {    char fill1[72];    /* 200-247H    */
  59.     char hite, wid;
  60.     char clead1[9], clead2[5], ctrail[5];
  61.     char cb4lfg, linoff, coloff, ascur;    /* 25DH-260H    */
  62.     char fill2[12];    /* 261H-26CH    */
  63.     char erascr[7];    /* 26DH-273H    */
  64.     char fill3[12]; /* 274H-27FH    */
  65. };
  66. struct _ini ei;
  67.  
  68. char    cmd, currch, edfnum, cch, cbyte, cbyteo, screen, mxflag;
  69. int    col, row, currlen, currfont;
  70.  
  71. char    ckeep[6][80], gxoff, gyoff, ib;
  72.  
  73. int gcnt, glen;    char gbuf[2000];
  74. int colno;    char sbuf[MAXLINE];
  75.  
  76. int i, fd;
  77. char ftname[30], ftname2[30], *fname;
  78. char *gets(), *strcat();
  79.  
  80.  
  81. char  duplflag, ovlflag, ftlen[128];
  82. int fix[128];
  83. char  ft[FTSIZE];
  84.  
  85. char  ftlen2[128];
  86. int fix2[128];
  87. char ft2[FTSIZE];
  88.  
  89.  
  90. main(argc,argv)
  91. char **argv;
  92. {
  93.     setup();
  94.  
  95.     if (argc-1)
  96.      {
  97.         fname = *++argv;
  98.         argc--;
  99.         strcpy(ftname, fname);
  100.         strcat(ftname,".FN2");
  101.      }
  102.     if (argc-1)
  103.      {
  104.         fname = *++argv;
  105.         argc--;
  106.         strcpy(ftname2, fname);
  107.         strcat(ftname2,".FN2");
  108.      }
  109.  
  110.     clrscrn();
  111.     openwork();
  112.     tokeep();
  113.     scinit();
  114.     cmd = '\\';
  115.   While (cmd != 'x')
  116.      { 
  117.     switch (cmd) {
  118.     case 'e': tokeep();
  119.           edscr();
  120.           fromkeep();
  121.           clrscrn();
  122.           scinit();
  123.           break;
  124.     case 's': savefnt(); break;
  125.     case 'g': message("Get character: ");
  126.           currch = conin();
  127. #if WYSE
  128.           chkdupl();
  129. #endif
  130.           if (currch > ' ') conout(currch);
  131.           edfnum = currch;
  132.           tokeep();
  133.           scinit();
  134.           break;
  135.     case 't': gstr();
  136.           break;
  137.     case 'T': mxflag = TRUE;
  138.           gstr();
  139.           mxflag = FALSE;
  140.           break;
  141.     case 'z': setmem(ckeep, 6*80, 0);
  142.           /* currlen = 0; */
  143.           fromkeep();
  144.           break;
  145.  
  146.     case 'c': message("Copy to character: ");
  147.           cch = currch;
  148.           currch = conin();    conout(currch);
  149.           fromkeep();
  150.           currch = cch;
  151.           scinit();
  152.           break;
  153.     case 'w': message("New Width:  ");
  154.           scanf("%d", &currlen);
  155.           if (currlen < 0) currlen = 0;
  156.           fromkeep();
  157.           scinit();
  158.           break;
  159.     case 'p': message("Test phrase: ");
  160. #if WYSE
  161.           color(GREEN,WHITE); gets(sbuf); color(BLACK,WHITE);
  162. #else
  163.           gets(sbuf);
  164. #endif
  165.           scinit();
  166.           break;
  167.     case 'n': if (currfont)
  168.           {    message("New font 2 name: ");
  169.               gets(ftname2); /* to upper */
  170.               strcat(ftname2,".fn2");
  171.           }
  172.           else
  173.           {    message("New font 1 name: ");
  174.               gets(ftname); /* to upper */
  175.               strcat(ftname,".fn2");
  176.           }
  177.           scinit();
  178.           break;
  179.     case 'o': loadft();
  180.           tokeep();
  181.           scinit();
  182.           break;
  183.     case 'q': screen = !screen;
  184.           break;
  185.     case '1': currfont = FALSE;
  186.           chkdupl();
  187.           prompt();
  188.           break;
  189.     case '2': if (!ovlflag)
  190.           {    currfont = TRUE;
  191.             prompt();
  192.           }
  193.           chkdupl();
  194.           break;
  195.     case 'r': rdedf();
  196.           break;
  197.     case 'd': wtedf(TRUE);
  198.           break;
  199.     case 'D': wtedf(FALSE);
  200.           break;
  201.     case 'm': modeset();
  202.           clrscrn();
  203.           scinit();
  204.           break;
  205.  
  206.     default:  break;
  207.     } /* End Switch */
  208.  
  209.    gxy(0, 11);
  210.    cmd = key();
  211.    } /* End while */
  212.  
  213.  
  214.     gxy(0,19);
  215.  
  216. }  /* End main */
  217.  
  218.  
  219. message(say)
  220. char *say;
  221. {
  222.     if (!screen) return;
  223.     gxy(2,20);
  224. #if WYSE
  225.     color(CYAN,WHITE); puts(say); color(BLACK,WHITE);
  226. #else
  227.     puts(say);
  228. #endif
  229. }
  230.  
  231. dstrans(upper)
  232. char upper;
  233. {    char c;
  234.     int i;
  235.  
  236.     for (i = 0; c = sbuf[i]; i++) sbuf[i] = dtrans(c,upper);
  237. }
  238.  
  239. gstr()
  240. {    int i;
  241.  
  242.     if (!*sbuf) return;
  243.  
  244.     chkdupl();
  245.  
  246.     if (duplflag) dstrans(TRUE);
  247.  
  248.     eschr('@');
  249.     eschr('U'); echr('1');
  250. /*    eschr('s'); echr('1');    */
  251. /*    eschr('3'); echr(1);    */
  252.  
  253.     gpass(0); gpass(1); gpass(2);
  254.  
  255.     if (duplflag)
  256.     {    dstrans(FALSE);
  257.         ecrl216(24-3);
  258.         gpass(0); gpass(1); gpass(2);
  259.         dstrans(TRUE);
  260.     }
  261.  
  262.     ecrl216( 3*(7+2) );
  263.     colno = 0;
  264.     glen = 0;
  265. }
  266.  
  267.  
  268.  
  269. gpass(pass)
  270. int pass;
  271. {    int i;
  272.  
  273.     gcnt = 0;
  274.     setmem(gbuf, 2000, 0);
  275.  
  276.     for (i = 0; sbuf[i]; i++) gchr(i, pass);
  277.     gcnt += 7;    /* kern for italic in last col */
  278.  
  279.     if (mxflag)
  280.     {
  281.         eschr('L'); echr((gcnt/2) % 256); echr((gcnt/2)/256);
  282.         for (i = 0; i < gcnt; i++)
  283.          if (!(i % 2)) echr(gbuf[i] | gbuf[i+1]);
  284.         ecrl216(1);
  285.         return;
  286.     }
  287.  
  288.     eschr('Z'); echr(gcnt % 256); echr(gcnt/256);
  289.     for (i = 0; i < gcnt; i++)
  290.      if (i % 2) echr ('\0');    else echr(gbuf[i]);
  291.     ecrl216(0);
  292.  
  293.     eschr('Z'); echr(gcnt % 256); echr(gcnt/256);
  294.     for (i = 0; i < gcnt; i++)
  295.      if (i % 2) echr(gbuf[i]);    else echr('\0');
  296.     ecrl216(1);
  297. }
  298.  
  299.  
  300.  
  301.  
  302. gchr(ix,pass)
  303. int ix, pass;
  304. {    int len, i, cbase;
  305.     char c;
  306.  
  307.     if (gcnt > 1920) return;
  308.  
  309.     c = sbuf[ix];
  310.  
  311.     if (currfont)
  312.     {
  313.         len = ftlen2[c];
  314.         cbase = fix2[c] + pass*len;
  315.     }
  316.     else
  317.     {
  318.         len = ftlen[c];
  319.         cbase = fix[c] + pass*len;
  320.     }
  321.  
  322.     for (i = cbase; i < cbase + len; i++)
  323.         if (currfont)
  324.             gbuf[gcnt++] = ft2[i];
  325.         else    gbuf[gcnt++] =  ft[i];
  326.     gcnt += 3; /* CS */
  327. }
  328.  
  329.  
  330.  
  331. ecrl216(n)
  332. int n;
  333. {    echr('\r');
  334.     if (!n) return;
  335.  
  336.     eschr('J'); echr(n);
  337.  
  338.     /* while(n--) echr(10);*/
  339. }
  340.  
  341.  
  342. eschr(c)
  343. char c;
  344. {    echr(ESC);    echr(c);
  345. }
  346.  
  347.  
  348. echr(c)
  349. char c;
  350. {
  351.     bios(5,c);
  352. }
  353.  
  354.  
  355. loadft()
  356. {    int fdft, i, ftrecs;
  357.  
  358.   if (currfont)
  359.   {
  360.     if ((fdft = open(ftname2,0)) == ERROR)
  361.         {message("no font"); return;}
  362.     if (read(fdft, fix2, 2) != 2)
  363.         {message("bad font"); return;}
  364.  
  365.     /* only read enough of the font to get info for char's
  366.         up to ascii nul (which is not used)        */
  367.     ftrecs = (fix2[127]+127)/128;
  368.  
  369.     if (read(fdft, ft2, ftrecs) != ftrecs)
  370.         {message("bad font"); return;}
  371.     fabort(fdft);
  372.     for (i = 1; i < 127; i++)
  373.         ftlen2[i] = (fix2[i+1] - fix2[i])/3;
  374.   }
  375.   else
  376.   {
  377.     if ((fdft = open(ftname,0)) == ERROR)
  378.         {message("no font"); return;}
  379.     if (read(fdft, fix, 2) != 2)
  380.         {message("bad font"); return;}
  381.  
  382.     /* only read enough of the font to get info for char's
  383.         up to ascii nul (which is not used)        */
  384.     ftrecs = (fix[127]+127)/128;
  385.  
  386.     if (read(fdft, ft, ftrecs) != ftrecs)
  387.         {message("bad font"); return;}
  388.     fabort(fdft);
  389.         if (ftrecs > FTSIZE/128) ovlflag = TRUE;
  390.     for (i = 1; i < 127; i++)
  391.         ftlen[i] = (fix[i+1] - fix[i])/3;
  392.   }
  393.     chkdupl();
  394.  
  395. }
  396.  
  397.  
  398.  
  399. openwork()
  400. {    int fdft, i, ftrecs;
  401.  
  402.     setmem(ft, FTSIZE, 0);
  403.     setmem(fix, 128, 0);
  404.     setmem(ft2, FTSIZE, 0);
  405.     setmem(fix2, 128, 0);
  406.  
  407.     if ((fdft = open(ftname,0)) != ERROR)
  408.     {
  409.         if (read(fdft, fix, 2) != 2)
  410.         {puts("bad font"); exit(ERROR);}
  411.  
  412.     /* only read enough of the font to get info for char's
  413.         up to ascii nul (which is not used)        */
  414.     ftrecs = (fix[127]+127)/128;
  415.  
  416.         if (read(fdft, ft, ftrecs) != ftrecs)
  417.         {puts("bad font"); exit(ERROR);}
  418.         fabort(fdft);
  419.         if (ftrecs > FTSIZE/128) ovlflag = TRUE;
  420.     }
  421.     for (i = 1; i < 127; i++)
  422.         ftlen[i] = (fix[i+1] - fix[i])/3;
  423.     if (ovlflag) return;
  424.  
  425.     if ((fdft = open(ftname2,0)) != ERROR)
  426.     {
  427.         if (read(fdft, fix2, 2) != 2)
  428.         {puts("bad font"); exit(ERROR);}
  429.  
  430.     /* only read enough of the font to get info for char's
  431.         up to ascii nul (which is not used)        */
  432.     ftrecs = (fix2[127]+127)/128;
  433.  
  434.         if (read(fdft, ft2, ftrecs) != ftrecs)
  435.         {puts("bad font"); exit(ERROR);}
  436.         fabort(fdft);
  437.     }
  438.     for (i = 1; i < 127; i++)
  439.         ftlen2[i] = (fix2[i+1] - fix2[i])/3;
  440.     chkdupl();
  441. }
  442.  
  443. savefnt()
  444. {    int fdft, i, ftrecs;
  445.  
  446.   if (currfont)
  447.   {
  448.     if ((fdft = creat(ftname2)) == ERROR)
  449.         {message("can't save"); return;}
  450.     if (write(fdft, fix2, 2) != 2)
  451.         {message("save error"); return;}
  452.  
  453.     /* only write enough of the font to get info for char's
  454.         up to ascii nul (which is not used)        */
  455.     ftrecs = (fix2[127]+127)/128;
  456.  
  457.     if (write(fdft, ft2, ftrecs) != ftrecs)
  458.         {message("save error"); return;}
  459.     if (close(fdft) == ERROR)
  460.         message("can't close");
  461.   }
  462.   else
  463.   {
  464.     if ((fdft = creat(ftname)) == ERROR)
  465.         {message("can't save"); return;}
  466.     if (write(fdft, fix, 2) != 2)
  467.         {message("save error"); return;}
  468.  
  469.     /* only write enough of the font to get info for char's
  470.         up to ascii nul (which is not used)        */
  471.     ftrecs = (fix[127]+127)/128;
  472.  
  473.     if (write(fdft, ft, ftrecs) != ftrecs)
  474.         {message("save error"); return;}
  475.     if (close(fdft) == ERROR)
  476.         message("can't close");
  477.   }
  478.  
  479.  
  480. }
  481.  
  482.  
  483. setup()
  484. {
  485.     ei.hite = 24;
  486.     ei.wid  = 80;
  487.     ei.clead1[0] = 2;
  488.     ei.clead1[1] = ESC;
  489.     ei.clead1[2] = '=';
  490.     ei.clead2[0] = 0;
  491.     ei.ctrail[0] = 0;
  492.     ei.cb4lfg = 0;
  493.     ei.linoff = ei.coloff = ' ';
  494.     ei.ascur = 0;
  495.     ei.erascr[0] = 1;
  496.     ei.erascr[1] = 'Z' & 31;
  497.  
  498.     loadi();
  499.  
  500.     strcpy(ftname, "work.fn2");
  501.     strcpy(ftname2,"work2.fn2");
  502.     screen = TRUE;
  503.     mxflag = FALSE;
  504.     ovlflag = FALSE;
  505.     currch = 'A';
  506.     edfnum = currch;
  507.     currlen = 0;
  508.     currfont = FALSE;
  509.  
  510.     ib = 0;
  511. #if WYSE
  512.     gxoff = 4;
  513.     gyoff = 6;
  514. #endif
  515.  
  516.     strcpy(sbuf,
  517.     "abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ");
  518. }
  519.  
  520. char conin()
  521. {    return (bios(3));
  522. }
  523.  
  524. conout(c)
  525. char c;
  526. {    if (screen) bios(4, c);
  527. }
  528.  
  529. #if WYSE
  530. tokeep()
  531. {
  532.     tokepp(0, currch);
  533.     if (duplflag) tokepp(3, dtrans(currch, FALSE));
  534. }
  535.  
  536. tokepp(ib, currch)
  537. char ib, currch;
  538. #else
  539. tokeep()
  540. #endif
  541. {    int i, j, cbase;
  542.  
  543.     if (currfont)
  544.     {
  545.         cbase = fix2[currch];
  546.         currlen = (fix2[currch+1] - cbase) / 3;
  547.     }
  548.     else
  549.     {
  550.         cbase = fix[currch];
  551.         currlen = (fix[currch+1] - cbase) / 3;
  552.     }
  553.  
  554.     if (currlen > 80) currlen = 80;
  555.     for (i = 0; i < 3; i++)
  556.      for (j = 0; j < 80; j++)
  557.       if (j >= currlen) ckeep[ib+i][j] = 0;
  558.        else if (currfont) ckeep[ib+i][j] = ft2[cbase + j + i*currlen];
  559.                else  ckeep[ib+i][j] =  ft[cbase + j + i*currlen];
  560. }
  561.  
  562.  
  563. #if WYSE
  564. fromkeep()
  565. {
  566.     frommkeep(0,currch);
  567.     if (duplflag) frommkeep(3, dtrans(currch, FALSE));
  568. }
  569.  
  570. frommkeep(ib, currch)
  571. char ib, currch;
  572. #else
  573. fromkeep()
  574. #endif
  575. {    int i, j, cend, cbase, cnext, mlen;
  576.  
  577.     if (currfont)
  578.     {
  579.         cbase = fix2[currch];
  580.         cnext = fix2[currch+1];
  581.     }
  582.     else
  583.     {
  584.         cbase = fix[currch];
  585.         cnext = fix[currch+1];
  586.     }
  587.  
  588.     cend = cbase + currlen * 3;
  589.     mlen = (cend-cnext) ? (ovlflag?
  590.                  (2*FTSIZE):FTSIZE)
  591.                 - 1 - max(cnext,cend)
  592.                   : 0;
  593.  
  594.     if (mlen)
  595.     if (currfont)
  596.     {    movmem(ft2+cnext, ft2+cend, mlen); 
  597.          for (i = currch+1; i < 128; i++)
  598.             fix2[i] = fix2[i] + cend - cnext;
  599.         for (i = 0; i < 127; i++)
  600.             ftlen2[i] = (fix2[i+1] - fix2[i])/3;
  601.     }
  602.     else
  603.     {    movmem(ft+cnext, ft+cend, mlen); 
  604.          for (i = currch+1; i < 128; i++)
  605.             fix[i] = fix[i] + cend - cnext;
  606.         for (i = 0; i < 127; i++)
  607.             ftlen[i] = (fix[i+1] - fix[i])/3;
  608.         if (fix[127] >= FTSIZE) ovlflag = TRUE;
  609.     }
  610.  
  611.     if (currlen)
  612.     for (i = 0; i < 3; i++)
  613.      for (j = 0; j < currlen; j++)
  614.         if (currfont)
  615.             ft2[cbase + j + i*currlen] = ckeep[ib+i][j];
  616.         else     ft[cbase + j + i*currlen] = ckeep[ib+i][j];
  617. }
  618.  
  619. constring(spt)
  620. char *spt;
  621. {    char len;
  622.     len = *spt++;
  623.     while (len--) conout(*spt++);
  624. }
  625.  
  626. connum(n)
  627. char n;
  628. {    char dstr[4];
  629.  
  630.     if (!ei.ascur) { conout(n); return; }
  631.     sprintf(dstr, "%3d", n);
  632.     if (ei.ascur == 3 && *dstr != ' ') conout(*dstr);
  633.     if (dstr[1] != ' ') conout(dstr[1]);
  634.     conout(dstr[2]);
  635. }
  636.  
  637.  
  638. gxy(x, y)
  639. char x, y;
  640. {
  641.     constring(ei.clead1);
  642.     if (ei.cb4lfg) connum(x + ei.coloff);
  643.         else connum(y + ei.linoff);
  644.     constring(ei.clead2);
  645.     if (ei.cb4lfg) connum(y + ei.linoff);
  646.         else connum(x + ei.coloff);
  647.     constring(ei.ctrail);
  648. }
  649.  
  650. clrscrn()
  651. {
  652. #if WYSE
  653.     color(BLACK,WHITE);
  654. #endif
  655.     constring(ei.erascr);
  656.     if (screen) sleep(1);
  657. }
  658.  
  659. char key()
  660. {    char c;
  661.  
  662.     c = conin();
  663.     if (c < ' ') c += '@';
  664.         else if (c >='A' && c <= 'Z')
  665.         c += ' ';
  666.     return(c);
  667. }
  668.  
  669. info(ic)
  670. int ic;
  671. {
  672.     if (!screen) return;
  673.  
  674.     if (ic < 15)
  675.     {
  676. #if WYSE
  677.         color(BLUE,WHITE);
  678. #endif
  679.         gxy(1,5); puts("E");
  680.         gxy(1,6); puts("D");
  681.         gxy(1,7); puts("I");
  682.         gxy(1,8); puts("T");
  683. #if WYSE
  684.         color(BLACK,WHITE);
  685. #endif
  686.     }
  687.  
  688.     gxy(ic+5, 4); puts("^E cursor up     ^R up 8");
  689.     gxy(ic+5, 5); puts("^S cursor left   ^A left 8");
  690.     gxy(ic+5, 6); puts("^D cursor right  ^F right 8");
  691.     gxy(ic+5, 7); puts("^X cursor down   ^C down 8");
  692.     gxy(ic+5, 8); puts(",  dot on        SP dot off");
  693.  
  694.     if (ic > 15)
  695.     {
  696.     gxy(ic+5, 9); puts("w  widen         n  narrow");
  697.     gxy(ic+5,10); puts("+  add column    -  delete column");
  698.     gxy(ic+5,11); puts("0  add blank column");
  699.     gxy(ic+5,12); puts("u  up scroll     d  down scroll");
  700.     gxy(ic+5,13); puts("p  plus row      m  minus row");
  701.     gxy(ic+5,14); puts("r  right row     l  left row");
  702.     gxy(ic+5,15); puts("q  quit edit");
  703.         return;
  704.     }
  705.  
  706.     gxy(ic+5, 9); puts("?  for info on: w n u d p m 0 r l x");
  707.  
  708.     gxy(ic,11); puts("Width change             Edit");
  709.     gxy(ic,12); puts("Zero character           Xit to CPM");
  710.     gxy(ic,13); puts("Get character");
  711.     gxy(ic,14); puts("Copy to character        Name font");
  712.     gxy(ic,15); puts("Phrase for test print    Open font");
  713.     gxy(ic,16); puts("Test print               Save font");
  714.     gxy(ic,17); puts("Quiet console tog        Read EDF");
  715.     gxy(ic,18); puts("1st font                 Disk write EDF");
  716.     gxy(ic,19); puts("2nd font                 Mode change");
  717. }
  718.  
  719. prompt()
  720. {    int i;
  721.  
  722.     if (!screen) return;
  723.  
  724.     gxy(0,0);
  725.     puts("ECHED ");
  726.  
  727.     if (currfont) puts("(F1="); else puts("F1=");
  728.     puts(ftname);
  729.     if (currfont) puts(") F2="); else puts(" (F2=");
  730.     if (ovlflag) puts("..none.."); else puts(ftname2);
  731.     if (!currfont) puts(")");
  732.  
  733.     puts(" Character=");
  734.     if (currch < ' ')
  735.     {    conout('^');
  736.         conout(currch + 64);
  737.     }
  738.     else
  739.     {
  740.         conout(currch);
  741.     }
  742.  
  743.     printf(" W=%2d ", currlen);
  744.  
  745.     if (currfont)
  746.     printf("Room=%xH  ", FTSIZE-fix2[127]);
  747.     else
  748.     printf("Room=%xH  ", (ovlflag? (2*FTSIZE) : FTSIZE) - fix[127]);
  749.  
  750.     gxy(3,1);
  751. #if WYSE
  752.     printf("Test phrase is ");
  753.     color(GREEN,WHITE);
  754.     printf("%-65s", sbuf);
  755.     color(BLACK,WHITE);
  756. #else
  757.     printf("Test phrase is %-77s", sbuf);
  758. #endif
  759. }
  760.  
  761. dtrans(c, upper)
  762. char c, upper;
  763. {    if (c == 0x20 || c == 0x5F) return(c);
  764.  
  765.     if (c >= 0x60) c -= 0x20;
  766.     else if (c < 0x20) c += 0x20;
  767.  
  768.     if (upper) return(c);
  769.  
  770.     if (c < 0x40) c -= 0x20;
  771.     else c += 0x20;
  772.  
  773.     return(c);
  774. }
  775.  
  776. chkdupl()
  777. {
  778.     duplflag = (currfont ? fix2[0] : fix[0]) & PRPTNL;
  779. #if WYSE
  780.     if (duplflag) currch = dtrans(currch, TRUE);
  781. #endif
  782. }
  783.  
  784. rdedf()
  785. {    char edname[11], edbuf[BUFSIZ], eds[80];
  786.     char c;
  787.     int lbear, ytop, rbear;
  788.     int i, dcurrlen;
  789.  
  790.     duplflag = (currfont ? fix2[0] : fix[0]) & PRPTNL;
  791.  
  792.     if  (duplflag)    edfnum = dtrans(edfnum, TRUE);
  793.  
  794.     currch = edfnum;
  795.  
  796.     sprintf(edname, "A%d.EDF", edfnum);
  797.  
  798.     if (fopen(edname, edbuf) == ERROR)
  799.     {    message("no edf file");    return;    }
  800.  
  801.     fscanf(edbuf, "%d %d %d", &lbear, &rbear, &ytop);
  802.  
  803.     if (lbear) lbear--; if (rbear) rbear--;
  804.  
  805.     setmem(ckeep, 3*80, 0);
  806.     currlen = 0; dcurrlen = 10000;
  807.  
  808.  
  809.     row = (duplflag ? 47 : 23) - ytop;
  810.  
  811.     if (row < 0)
  812.     {    message("YTOP of ");
  813.         printf("%d is too large", ytop);
  814.     }
  815.  
  816.     for ( ; fgets(eds, edbuf); row++)
  817.     {
  818.         if (row > 23)
  819.         {    row = 0;
  820.             fromkeep();
  821.             setmem(ckeep, 3*80, 0);
  822.             dcurrlen = currlen;
  823.             currch = dtrans(currch, FALSE);
  824.         }
  825.         else if (row < 0) continue;
  826.  
  827.         for (i = 0, col = lbear; c = eds[i++]; col++)
  828.          if (c == '*') chngbit(TRUE);
  829.  
  830.         if (currlen < col + rbear)
  831.             currlen = col + rbear;
  832.     }
  833.  
  834.  
  835.     fclose(edbuf);
  836.  
  837.     fromkeep();
  838.  
  839.     if (duplflag)
  840.     {    if (dcurrlen == 10000)
  841.         {    setmem(ckeep, 3*80, 0);
  842.             currch = dtrans(currch, FALSE);
  843.             fromkeep();
  844.         }
  845.  
  846.         currch = edfnum;
  847.  
  848.         if (currlen > dcurrlen)
  849.         {    dcurrlen = currlen;
  850.             tokeep();
  851.             currlen = dcurrlen;
  852.             fromkeep();
  853.         }
  854.     }
  855.  
  856.     edfnum++;
  857.     prompt();
  858. }
  859.  
  860.  
  861. wtedf(cndns)
  862. char cndns;
  863. {    char edname[11], edbuf[BUFSIZ], eds[80];
  864.     char c, lbear, ytop, rbear;
  865.     char i, j, bit, mask;
  866.  
  867.     duplflag = (currfont ? fix2[0] : fix[0]) & PRPTNL;
  868.  
  869.     if (duplflag) edfnum = dtrans(edfnum, TRUE);
  870.  
  871.     currch = edfnum;
  872.  
  873.     tokeep();
  874.  
  875. if (currlen)
  876. {
  877.     sprintf(edname, "A%d.EDF", edfnum);
  878.  
  879.     if (fcreat(edname, edbuf) == ERROR)
  880.     {    gxy(2, 20);
  881.         puts("can't open edf file");
  882.         return;
  883.     }
  884.  
  885.     for (i = ytop = 0, lbear = rbear = currlen; i < 3; i++)
  886.      for (j = 0; j < currlen; j++)
  887.       {    cbyte = ckeep[i][j];
  888.         mask = 128;
  889.         for (bit = 0; bit < 8; bit++, mask >>= 1)
  890.          if (mask & cbyte)
  891.         {      /* j is col; i + bit*3 is row */
  892.             if (lbear > j) lbear = j;
  893.             if (rbear >= currlen - j)
  894.                 rbear = currlen - j - 1;
  895.             if (ytop < 23 - (i + bit*3))
  896.                 ytop = 23 - (i + bit*3);
  897.         }
  898.       }
  899.     if (lbear == currlen) lbear = rbear = currlen / (cndns? 2:1);
  900.     if (duplflag) lbear = rbear = 0;
  901.  
  902.     fprintf(edbuf, "%d %d %d\n", lbear/(cndns? 2:1) + 1,
  903.                  rbear/(cndns? 2:1) + 1,
  904.              ytop + (duplflag? 24:0) );
  905.  
  906.  
  907.     for (row = 23 - ytop; row < 24; row++)
  908.     {    for (i = 0; i < currlen; i++) eds[i] = ' ';
  909.  
  910.         for (i = 0, col = lbear; col < currlen - rbear; col++,i++)
  911.             if (testbit())    eds[i/(cndns? 2:1)] = '*';
  912.  
  913.         i = currlen;
  914.         while (i && eds[i-1] == ' ') i--;
  915.  
  916.         eds[i] = '\0';
  917.         fprintf(edbuf, "%s\n", eds);
  918.         if (duplflag && row == 23 && currch == edfnum)
  919.         {    currch = dtrans(currch, FALSE);
  920.             if (currch != edfnum)
  921.             { row = 0;    tokeep(); }
  922.         }
  923.     }
  924.  
  925.     currch = edfnum;
  926.  
  927.     fprintf(edbuf, "%c", CPMEOF);
  928.     fclose(edbuf);
  929. }
  930.     edfnum++;
  931.     prompt();
  932. }
  933.  
  934. #if WYSE
  935. testbit()
  936. {    if (duplflag && row > 23) ttestbit(3, row-24);
  937.     else ttestbit(0, row);
  938. }
  939. ttestbit(ib, row)
  940. char ib; int row;
  941. #else
  942. testbit()
  943. #endif
  944. {    char bit, mask;
  945.     
  946.     bit = row / 3;
  947.     mask = 128 >> bit; 
  948.     cbyte = ckeep[ib+(row % 3)][col];
  949.  
  950.     if (cbyte & mask) return(TRUE);
  951.  
  952.     return(FALSE);
  953. }
  954.  
  955. #if WYSE
  956. showbits()
  957. {    if (duplflag) gyoff = 0; else gyoff = 6;
  958.     sshowbits(0);
  959.     if (duplflag)
  960.     {    gyoff = 12;
  961.         sshowbits(3);
  962.         gyoff = 0;
  963.     }
  964.     ongcurs();
  965. }
  966.  
  967. sshowbits(ib)
  968. char ib;
  969. #else
  970. showbits()
  971. #endif
  972. {    char i, j, bit, mask, r;
  973.  
  974.     if (!screen) return;
  975.  
  976. #if WYSE
  977.     if (gyoff <= 6)
  978. #endif
  979.     clrscrn();
  980.  
  981.     If (currlen > 0)
  982. #if WYSE
  983.      {
  984.     color(RED,WHITE);
  985.     if (gyoff == 6)
  986.     {    gxy(gxoff-1,gyoff-1);
  987.         conout('2');
  988.         for (i = 0; i < currlen; i++)
  989.             conout(':');
  990.         conout('3');
  991.     }
  992.     for (i = gyoff; i < (gyoff+12); i++)
  993.       {
  994.         gxy(gxoff-1,i); conout('6');
  995.         gxy(currlen+gxoff,i); conout('6');
  996.       }
  997.     if (gyoff == 6)
  998.     {    gxy(gxoff-1,gyoff+12);
  999.         conout('1');
  1000.         for (i = 0; i < currlen; i++)
  1001.             conout(':');
  1002.         conout('5');
  1003.     }
  1004.     color(BLACK,WHITE);
  1005.      }
  1006.  
  1007.     for (i = 0; i < 3; i++)
  1008.      for (j = 0; j < currlen; j++)
  1009.       {    cbyte = ckeep[ib+i][j];
  1010.         cbyteo = ckeep[ib + ((i+1) % 3)][j];
  1011.         mask = 128;
  1012.         for (bit = 0; bit < 8; bit++, mask >>= 1)
  1013.          if (
  1014.              /* if row is even */
  1015.             !((r = i + bit*3) & 1)
  1016.              /* and there is a dot in this row or the next */
  1017.              && ((mask & cbyte) | ((i==2 ? mask>>1: mask) & cbyteo))
  1018.             )
  1019.          {    gxy(j+gxoff, r/2+gyoff);
  1020.              /* both dots? */
  1021.             if ((mask & cbyte)&& ((i==2 ? mask>>1: mask) & cbyteo))
  1022.                 conout(BOTHDOT);
  1023.             /* dot in this row only? */
  1024.             else if (mask & cbyte)
  1025.                 conout(UPPRDOT);
  1026.             else conout(LOWRDOT);    /* must be dot in next row */
  1027.          }
  1028.       }
  1029. #else
  1030.      for (i = 0; i < 24; i++)
  1031.       { gxy(currlen,i); conout('|'); }
  1032.  
  1033.     for (i = 0; i < 3; i++)
  1034.      for (j = 0; j < 80; j++)
  1035.       {    cbyte = ckeep[i][j];
  1036.         mask = 128;
  1037.         for (bit = 0; bit < 8; bit++, mask >>= 1)
  1038.          if (mask & cbyte)
  1039.           { gxy(j, i + bit*3); conout('*'); }
  1040.       }
  1041. #endif
  1042. }
  1043.  
  1044. scinit()
  1045. {
  1046.     col = LEFTCOL; row = TOPROW;
  1047.  
  1048.     if (!screen) return;
  1049.  
  1050.     prompt();
  1051.     gxy(2,20);
  1052.     printf("%-78s"," ");
  1053.     info(10);
  1054.     gxy(col,row);
  1055. }
  1056.  
  1057. nextcol()
  1058. {    if (col < RIGHTCOL) col++;
  1059.     else    {    col = LEFTCOL;
  1060. #if WYSE
  1061.             if (duplflag && row < 47)
  1062.               { row++; return;}
  1063. #endif
  1064.             if (row < BOTROW) row++;
  1065.         }
  1066. }
  1067.  
  1068. #if WYSE
  1069. chngbit(biton)
  1070. char biton;
  1071. {    if (duplflag && row > 23) cchngbit(3, row - 24, biton);
  1072.     else cchngbit(0, row, biton);
  1073. }
  1074.  
  1075. cchngbit(ib, row, biton)
  1076. char ib, row;
  1077. #else
  1078. chngbit(biton)
  1079. #endif
  1080. char biton;
  1081. {    char bit, mask;
  1082.     
  1083.     bit = row / 3;
  1084.     mask = 128 >> bit; 
  1085.     cbyte = ckeep[ib + (row % 3)][col];
  1086.     if (biton) cbyte |= mask;
  1087.         else cbyte &= ~mask;
  1088.     ckeep[ib + (row % 3)][col] = cbyte;
  1089. }
  1090.  
  1091. dirow(del)
  1092. char del;
  1093. {    char i, j, ps, psnx, bit, mask, masknx, cnext;
  1094.  
  1095.     for (j = 0; j < currlen; j++)
  1096.     if (del)
  1097. #if WYSE
  1098.     for (i = row; i < (duplflag? 47 : 23); i++)
  1099. #else
  1100.     for (i = row; i < 23; i++)
  1101. #endif
  1102.     {
  1103.         bit = (i / 3) % 8;
  1104.         mask = 128 >> bit;
  1105.         ps = i % 3;
  1106.         masknx = (ps == 2)? mask >> 1: mask;
  1107.         psnx = (ps == 2)? 0: ps + 1;
  1108. #if WYSE
  1109.         if (duplflag)
  1110.          if (i == 23) { psnx += 3; masknx = 128; }
  1111.          else if (i > 23) { ps += 3; psnx += 3; }
  1112. #endif
  1113.         cbyte = ckeep[ps][j];
  1114.         cnext = ckeep[psnx][j];
  1115.         if (cnext & masknx) cbyte |= mask;
  1116.             else cbyte &= ~mask;
  1117.         ckeep[ps][j] = cbyte;
  1118.     }
  1119.     else
  1120. #if WYSE
  1121.     for (i = (duplflag? 47 : 23); i > row; i--)
  1122. #else
  1123.     for (i = 23; i > row; i--)
  1124. #endif
  1125.     {
  1126.         bit = (i / 3) % 8;
  1127.         mask = 128 >> bit;
  1128.         ps = i % 3;
  1129.         masknx = (ps)? mask: mask << 1;
  1130.         psnx = (ps)? ps - 1: 2;
  1131. #if WYSE
  1132.         if (duplflag)
  1133.          if (i == 24) { ps += 3; masknx = 1; }
  1134.          else if (i > 24) { ps += 3; psnx += 3; }
  1135. #endif
  1136.  
  1137.         cbyte = ckeep[ps][j];
  1138.         cnext = ckeep[psnx][j];
  1139.         if (cnext & masknx) cbyte |= mask;
  1140.             else cbyte &= ~mask;
  1141.         ckeep[ps][j] = cbyte;
  1142.     }
  1143.  
  1144.     showbits();
  1145. }
  1146.  
  1147. #if WYSE
  1148. rotate(left)
  1149. char left;
  1150. {    if (duplflag && row > 23) rrotate(3, row - 24, left);
  1151.     else rrotate(0, row, left);
  1152. }
  1153.  
  1154. rrotate(ib, row, left)
  1155. char ib, row;
  1156. #else
  1157. rotate(left)
  1158. #endif
  1159. char left;
  1160. {    char j, cl, bit, mask, cnext;
  1161.     
  1162.     for (j = 0; j < 80; j++)
  1163.     {
  1164.         cl = left ? j : 79 - j;
  1165.         bit = row / 3;
  1166.         mask = 128 >> bit; 
  1167.         cbyte = ckeep[ib + (row % 3)][cl];
  1168.         cnext = (j==79)? 0 : ckeep[ib+(row % 3)][left? cl+1:cl-1];
  1169.         if (cnext & mask) cbyte |= mask;
  1170.             else cbyte &= ~mask;
  1171.         ckeep[ib + (row % 3)][cl] = cbyte;
  1172.     }
  1173.     showbits();
  1174. }
  1175.  
  1176. #if WYSE
  1177. dicol(opt)
  1178. char opt;
  1179. {    if (duplflag) ddicol(3, row - 24, opt);
  1180.     ddicol(0, row, opt);
  1181.     showbits();
  1182. }
  1183.  
  1184. ddicol(ib, row, opt)
  1185. char ib, row;
  1186. #else
  1187. dicol(opt)
  1188. #endif
  1189. char opt;
  1190. {    char i, j;
  1191.  
  1192.     for (i = 0; i < 3; i++)
  1193.     {    if (!opt)    /* delete a column */
  1194.             for (j = col; j < 79; j++)
  1195.                   ckeep[ib+i][j] = ckeep[ib+i][j+1];
  1196.         else        /* insert a column */
  1197.         {
  1198.              for (j = 79; j > col; j--)
  1199.                    ckeep[ib+i][j] = ckeep[ib+i][j-1];
  1200.             if (opt == 1) ckeep[ib+i][col] = 0;
  1201.         }
  1202.     }
  1203. #if !WYSE
  1204.     showbits();
  1205. #endif
  1206. }
  1207.  
  1208. #if WYSE
  1209. scroll(up)
  1210. char up;
  1211. {    sscroll(0, up);
  1212.     if (duplflag) sscroll(3, up);
  1213.     showbits();
  1214. }
  1215.  
  1216. sscroll(ib, up)
  1217. char ib;
  1218. #else
  1219. scroll(up)
  1220. #endif
  1221. char up;
  1222. {    char i, j, temp;
  1223.  
  1224.     if (up)
  1225.      for (j = 0; j < currlen; j++)
  1226.      {    temp = ckeep[ib+0][j];
  1227.         ckeep[ib+0][j] = ckeep[ib+1][j];
  1228.         ckeep[ib+1][j] = ckeep[ib+2][j];
  1229.         ckeep[ib+2][j] = temp << 1;
  1230. #if WYSE
  1231.         if (duplflag && !ib)
  1232.         ckeep[2][j] |= ckeep[3][j] >> 7;
  1233. #endif
  1234.      }
  1235.     else
  1236.      for (j = 0; j < currlen; j++)
  1237.      {
  1238.         temp = ckeep[ib+2][j];
  1239.         ckeep[ib+2][j] = ckeep[ib+1][j];
  1240.         ckeep[ib+1][j] = ckeep[ib+0][j];
  1241.         ckeep[ib+0][j] = temp >> 1;
  1242. #if WYSE
  1243. /* when ib = 0, save b0 -- when i = 3 put this for b7 */
  1244.         if (ib) ckeep[ib][j] |= ckeep[2][j] << 7;
  1245. #endif
  1246.      }
  1247. #if !WYSE
  1248.     showbits();
  1249. #endif
  1250. }
  1251.  
  1252. #if WYSE
  1253.  
  1254. #define BLACK    '1'
  1255. #define BLUE    '2'
  1256. #define CYAN    '4'
  1257. #define WHITE    '8'
  1258.  
  1259. graph(yes)
  1260. char yes;
  1261. {    conout(ESC);    conout('H');
  1262.     if (yes) conout(2); else conout(3);
  1263.     conout(ESC);    conout('`');    /* cursor off/on    */
  1264.     if (yes) conout('0'); else conout('1');
  1265.     if (!yes) color(BLACK, WHITE);
  1266. }
  1267.  
  1268. color(fc, bc)
  1269. char fc, bc;
  1270. {    conout(ESC);    conout('g');
  1271.     conout(fc);    conout(bc);
  1272. }
  1273.  
  1274.  
  1275. char oldgc, newgc, ogcol, ogrow;
  1276.  
  1277. offgcurs()
  1278. {    gxy(ogcol+gxoff, ogrow/2+gyoff);
  1279.     color(BLACK, WHITE);
  1280.     conout(oldgc);
  1281. }
  1282.  
  1283. ongcurs()
  1284. {    char fc, bc;
  1285.  
  1286.     gxy(col+gxoff, row/2+gyoff);
  1287.     conout(ESC);    conout('M'); /* get char at cursor */
  1288.     oldgc = conin();
  1289.     newgc = oldgc;
  1290.     switch(oldgc + ((row & 1)? 2 : 0))
  1291.     {    case 0:
  1292.         case NODOT: fc = CYAN; bc = WHITE; newgc = UPPRDOT;
  1293.             break;
  1294.         case 2:
  1295.         case NODOT+2: fc = CYAN; bc = WHITE; newgc = LOWRDOT;
  1296.             break;
  1297.         case BOTHDOT:   fc = BLUE; bc = BLACK; newgc = UPPRDOT;
  1298.             break;
  1299.         case BOTHDOT+2: fc = BLUE; bc = BLACK; newgc = LOWRDOT;
  1300.             break;
  1301.         case UPPRDOT:   fc = BLUE; bc = WHITE;
  1302.             break;
  1303.         case UPPRDOT+2: fc = BLACK; bc = CYAN;
  1304.             break;
  1305.         case LOWRDOT:   fc = BLACK; bc = CYAN;
  1306.             break;
  1307.         case LOWRDOT+2: fc = BLUE; bc = WHITE;
  1308.             break;
  1309.         default:    return;    break;
  1310.     }
  1311.     color(fc, bc);
  1312.     conout(newgc);
  1313. }
  1314.  
  1315. pixel(on)
  1316. char on;
  1317. {
  1318.     switch(oldgc + ((row & 1)? 2 : 0))
  1319.     {    case 0:
  1320.         case NODOT: if (on) oldgc = UPPRDOT;
  1321.             break;
  1322.         case 2:
  1323.         case NODOT+2: if (on) oldgc = LOWRDOT;
  1324.             break;
  1325.         case BOTHDOT:   if (!on) oldgc = LOWRDOT;
  1326.             break;
  1327.         case BOTHDOT+2: if (!on) oldgc = UPPRDOT;
  1328.             break;
  1329.         case UPPRDOT:
  1330.         case LOWRDOT+2: if (!on) oldgc = NODOT;
  1331.             break;
  1332.         case UPPRDOT+2:
  1333.         case LOWRDOT:   if (on) oldgc = BOTHDOT;
  1334.             break;
  1335.         default:    return;    break;
  1336.     }
  1337.  
  1338. }
  1339.  
  1340. #endif
  1341.  
  1342.  
  1343.  
  1344. edscr()
  1345. {
  1346. #if WYSE
  1347.     graph(TRUE);
  1348. #endif
  1349.     col = 0; row = 23 - 5;
  1350.     showbits();
  1351.     cmd = 'E';
  1352.     while (cmd != 'q')
  1353.     {
  1354. #if WYSE
  1355.         ogcol = col;    ogrow = row;
  1356. #endif
  1357.         switch (cmd) {
  1358.           case 'S': if (col>0) col = (col + 79) % 80; break;
  1359.         case 'D': if (col<79)col = (col + 81) % 80; break;
  1360. #if WYSE
  1361.         case 'E': row = duplflag? (row+47)%48 :(row+23)%24;
  1362.              break;
  1363.         case 'X': row = duplflag? (row+49)%48 :(row+25)%24;
  1364.              break;
  1365.         case 'R': row = duplflag? (row+40)%48 :(row+16)%24;
  1366.              break;
  1367.         case 'C': row = duplflag? (row+56)%48 :(row+32)%24;
  1368.              break;
  1369. #else
  1370.         case 'E': row = (row + 23) % 24; break;
  1371.         case 'X': row = (row + 25) % 24; break;
  1372.         case 'R': row = (row + 16) % 24; break;
  1373.         case 'C': row = (row + 32) % 24; break;
  1374. #endif
  1375.  
  1376.           case 'A': if (col>7) col = (col + 72) % 80; break;
  1377.         case 'F': if (col<67)col = (col + 88) % 80; break;
  1378.         case ',':
  1379. #if WYSE
  1380.               pixel(TRUE);
  1381. #else
  1382.               conout('*');
  1383. #endif
  1384.               chngbit(TRUE);
  1385.               nextcol();
  1386.               break;
  1387.         case '.':
  1388.         case ' ':
  1389. #if WYSE
  1390.               pixel(FALSE);
  1391. #else
  1392.               conout(' ');
  1393. #endif
  1394.               chngbit(FALSE);
  1395.               nextcol();
  1396.               break;
  1397.         case '-': dicol(FALSE);     break;
  1398.         case '0': dicol(TRUE);      break;
  1399.         case '+': dicol(TRUE+1);      break;
  1400.         case 'p': dirow(FALSE);        break;
  1401.         case 'm': dirow(TRUE);        break;
  1402.         case 'r': rotate(FALSE);    break;
  1403.         case 'l': rotate(TRUE);        break;
  1404.         case 'Z':
  1405.         case 'd': scroll(FALSE);     break;
  1406.         case 'W':
  1407.         case 'u': scroll(TRUE);      break;
  1408.         case 'w': currlen++;
  1409.                 showbits();
  1410.                 break;
  1411.         case 'n': currlen--;
  1412.                 showbits();
  1413.                 break;
  1414.         case '?':
  1415. #if WYSE
  1416.               graph(FALSE);
  1417. #endif
  1418.               info(40);
  1419. #if WYSE
  1420.               graph(TRUE);
  1421. #endif
  1422.               break;
  1423.         case '\n':break;
  1424.         default:  showbits();
  1425.         }
  1426. #if WYSE
  1427.         offgcurs();    ;ongcurs();
  1428. #else
  1429.         gxy(col, row);
  1430. #endif
  1431.         cmd = key();
  1432.     }
  1433. #if WYSE
  1434.     graph(FALSE);
  1435. #endif
  1436. }
  1437.  
  1438.  
  1439. /* masks for mode bits */
  1440. /* ELITE 0x01, PRPTNL     0x02, CMPRSSD  0x04, EMPHSZD  0x08
  1441. DBLSTRK  0x10, EXPNDD     0x20, UNDRLN     0x40, ITALIC     0x80
  1442. */
  1443.  
  1444. mvalue(choice, toggle)
  1445. char choice, toggle;
  1446. {    int cmode, bit, kernval;
  1447.  
  1448.     if (choice < 10 || choice > 18) return;
  1449.  
  1450.     if (choice == 18) bit = 0;
  1451.     else bit = 0x80 >> (17 - choice);
  1452.  
  1453.     cmode = currfont ? fix2[0] : fix[0];
  1454.     kernval = cmode >> 8;
  1455.     if (cmode < 0) kernval |= 0xFF00;
  1456.     if (toggle)
  1457.     {    if (choice == 18)
  1458.         {    puts(">");
  1459.             scanf("%d", &kernval);
  1460.             gxy(0,18);
  1461.             puts("     ");
  1462.             cmode |= kernval << 8;
  1463.         }
  1464.         else
  1465.         {    if (cmode & bit) cmode &= ~bit;
  1466.             else cmode |= bit;
  1467.         }
  1468.     }
  1469.  
  1470.     gxy(20, choice);
  1471.     if (choice == 18) printf("%4d", kernval);
  1472.     else if (cmode & bit)
  1473.           puts(" ON");
  1474.          else puts("OFF");
  1475.  
  1476.     if (currfont) fix2[0] = cmode; else fix[0] = cmode;
  1477.     chkdupl();
  1478. }
  1479.  
  1480. modeset()
  1481. {    int i;
  1482.  
  1483.     clrscrn();
  1484.     gxy(10,3); puts("Font Mode");
  1485.  
  1486.     gxy(5,10); puts("Elite");
  1487.     gxy(5,11); puts("Duplex");
  1488.     gxy(5,12); puts("Compressed");
  1489.     gxy(5,13); puts("Emphasized");
  1490.     gxy(5,14); puts("Double Strike");
  1491.     gxy(5,15); puts("Expanded");
  1492.     gxy(5,16); puts("Underlined");
  1493.     gxy(5,17); puts("Italic");
  1494.     gxy(5,18); puts("Kerning");
  1495.  
  1496.     for (i = 10; i < 19; i++) mvalue(i, FALSE);
  1497.  
  1498.     col = 0; row = 10;
  1499.     gxy(col, row);
  1500.     cmd = key();
  1501.  
  1502.     while (cmd != 'x' && cmd != 'q')
  1503.     {    switch (cmd)
  1504.         {
  1505.         case 'E': row = (row + 23) % 24; break;
  1506.         case 'X': row = (row + 25) % 24; break;
  1507.         case 'R': row = (row + 16) % 24; break;
  1508.         case 'C': row = (row + 32) % 24; break;
  1509.  
  1510.         default:  break;
  1511.         }
  1512.  
  1513.         if (!isupper(cmd)) mvalue(row, TRUE);
  1514.  
  1515.         gxy(col, row);
  1516.         cmd = key();
  1517.     }
  1518. }
  1519.     
  1520.  
  1521. /************************************************/
  1522. /* Load initialization data            */
  1523. /************************************************/
  1524. loadi()
  1525. {    int fd;
  1526.     char *iname;
  1527.  
  1528.     iname = "eched.ini";
  1529.  
  1530.     if ((fd = open(iname,0)) != ERROR)
  1531.       if ((seek(fd, 2, 0) == ERROR) || (read(fd, ei, 1) != 1))
  1532.       {    printf("\n%s", "Bad file ECHED.INI"); return(ERROR); }
  1533.     fabort(fd);
  1534.  
  1535. }
  1536.  
  1537.