home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / mmm_pkg.zip / mmm_dos.cpp < prev    next >
C/C++ Source or Header  |  1996-12-05  |  10KB  |  417 lines

  1. /***************************************************
  2. *   DOS CPP file for MMMX Editor                   *
  3. *   Contains MS-DOS/PHARLAP specific functions     *
  4. ****************************************************/
  5.  
  6. #include "mmm_dos.h"
  7.  
  8. extern unsigned _stklen=8192;
  9. int MonoAttrs[NAttr]={7,0x70,1,0x70,0x17,0x6f,0x11,0x70};
  10.  
  11.  
  12. //&<<&mmm_Screen::mmm_Screen();
  13. #ifdef __386__
  14. //&<<&Watcom+Pharlap version
  15. #include"d:/pharlap/include/pharlap.h"
  16.  
  17. mmm_Screen::mmm_Screen(){
  18.   unsigned char X[64];
  19.   unsigned char far *D=X;
  20.   need=1;
  21.   char res;
  22.   struct fp{
  23.     int off;
  24.     short seg;
  25.   }kkk;
  26.   kkk.off=0xb8000;
  27.   kkk.seg=SS_DOSMEM;
  28.   OldCurs=0;
  29.  
  30.   union REGS __r;
  31.   struct SREGS __s;
  32.   __r.h.ah=0xF;
  33.   int386(0x10,&__r,&__r);
  34.   OldScr=__r.h.al;
  35.  
  36.   __r.h.ah=3;
  37.   __r.h.bh=0;
  38.   int386(0x10,&__r,&__r);
  39.   OldCl=__r.w.cx;
  40.   __r.h.ah=1;
  41.   __r.w.cx=0x2020;
  42.   int386(0x10,&__r,&__r);
  43.  
  44.   __r.x.edi=(int)X;
  45.   __s.es=((fp*)&D)->seg;
  46.   __r.h.ah=0x1b;
  47.   __r.w.bx=0;
  48.   int386x(0x10,&__r,&__r,&__s);
  49.   res=__r.h.al;
  50.  
  51.   if(res!=27 || OldScr==7){
  52.     WIDTH=80; HEIGHT=25;
  53.     switch(OldScr){
  54.     case 2:
  55.     case 3:
  56.       break;
  57.     case 7:
  58.       kkk.off=0xb0000;
  59.       Editor.attrs=MonoAttrs;
  60.       break;
  61.     default:
  62.       __r.w.ax=0x3;
  63.       int386(0x10,&__r,&__r);
  64.     }
  65.   }else{
  66.     WIDTH=*(short*)(X+5);
  67.     HEIGHT=X[0x22];
  68.   }
  69.   VMem=*(unsigned short far **)&kkk;
  70. }
  71. //&>>&2 0 0 16
  72. #else
  73. //&<<&Borland+DOS version
  74. mmm_Screen::mmm_Screen(){
  75.   unsigned char X[64];
  76.   unsigned char far *D=X;
  77.   need=1;
  78.   char res;
  79.   struct fp{
  80.     int off;
  81.     short seg;
  82.   }kkk;
  83.   kkk.off=0; kkk.seg=0xb800;
  84.   OldCurs=0;
  85.  
  86.   union REGS __r;
  87.   __r.h.ah=0xF;
  88.   int86(0x10,&__r,&__r);
  89.   OldScr=__r.h.al;
  90.  
  91.   __r.h.ah=3;
  92.   __r.h.bh=0;
  93.   int86(0x10,&__r,&__r);
  94.   OldCl=__r.x.cx;
  95.   __r.h.ah=1;
  96.   __r.x.cx=0x2020;
  97.   int86(0x10,&__r,&__r);
  98.  
  99.   struct SREGS __s;
  100.   __r.x.di=(int)X;
  101.   __s.es=((fp*)&D)->seg;
  102.   __r.h.ah=0x1b;
  103.   __r.x.bx=0;
  104.   int86x(0x10,&__r,&__r,&__s);
  105.   res=__r.h.al;
  106.  
  107.   if(res!=27 || OldScr==7){
  108.     WIDTH=80; HEIGHT=25;
  109.     switch(OldScr){
  110.     case 2:
  111.     case 3:
  112.       break;
  113.     case 7:
  114.       kkk.seg=0xb000;
  115.       Editor.attrs=MonoAttrs;
  116.       break;
  117.     default:
  118.       __r.x.ax=0x3;
  119.       int86(0x10,&__r,&__r);
  120.     }
  121.   }else{
  122.     WIDTH=*(short*)(X+5);
  123.     HEIGHT=X[0x22];
  124.   }
  125.   VMem=*(unsigned short far **)&kkk;
  126. }
  127. //&>>&0 0 0 16
  128. #endif
  129. //&>>&3 0 3 0
  130. //&<<&mmm_Screen::~mmm_Screen();
  131. #ifdef __386__
  132. //&<<&Watcom+Pharlap version
  133. mmm_Screen::~mmm_Screen(){
  134.   union REGS __r;
  135.   __r.h.al=OldScr;
  136.   __r.h.ah=0;
  137.   int386(0x10,&__r,&__r);
  138.   __r.w.cx=OldCl;
  139.   __r.h.ah=1;
  140.   int386(0x10,&__r,&__r);
  141. }
  142. //&>>&0 0 0 17
  143. #else
  144. //&<<&Borland+DOS version
  145. mmm_Screen::~mmm_Screen(){
  146.   union REGS __r;
  147.   __r.h.al=OldScr;
  148.   __r.h.ah=0;
  149.   int86(0x10,&__r,&__r);
  150.   __r.x.cx=OldCl;
  151.   __r.h.ah=1;
  152.   int86(0x10,&__r,&__r);
  153. }
  154. //&>>&0 0 0 17
  155. #endif
  156. //&>>&3 0 3 0
  157. //&<<&void mmm_Screen::ClrCursor();
  158. void mmm_Screen::ClrCursor(){
  159.    if(OldCurs) *OldCurs=OldAttr;
  160.    OldCurs=0;
  161. }
  162. //&>>&0 0 0 F
  163. //&<<&void mmm_Screen::SetCursor(int x,int y,int attr);
  164. void mmm_Screen::SetCursor(int x,int y,int attr){
  165.    if(OldCurs) ClrCursor();
  166.    OldCurs=(char far *)(VMem+WIDTH*y+x)+1;
  167.    OldAttr=*OldCurs;
  168.    *OldCurs=attr;
  169. }
  170. //&>>&0 0 0 F
  171.  
  172. //&<<&void DrawLine(char *Str, int PosY, char Attr,int slen);
  173. void DrawLine(char *Str, int PosY, char Attr,int slen){
  174.    unsigned short far *vmem=mmm_screen.Vmem()+PosY*mmm_screen.GetW();
  175.    for(int i=0 ; i<mmm_screen.GetW(); i++) {
  176.       vmem[i]=(((int)Attr)<<8)+(unsigned int)(unsigned char)*Str;
  177.       if(*Str) ++Str;
  178.    }
  179. }
  180. //&>>&2 0 2 17
  181. void SetTitle(char *,char *){}
  182.  
  183. //&<<&mmm_KeyBoard::mmm_KeyBoard();
  184. mmm_KeyBoard::mmm_KeyBoard(){
  185.   code=0x666;
  186.   OldInt9=_dos_getvect(9);
  187.   _dos_setvect(9,NewInt9);
  188.   InitKeyboardLayout();
  189.   AltCase=InitDefaultAltCase();
  190. }
  191. //&>>&4 0 4 6
  192. //&<<&mmm_KeyBoard::~mmm_KeyBoard();
  193. mmm_KeyBoard::~mmm_KeyBoard(){
  194.   _dos_setvect(9,OldInt9);
  195. }
  196.  
  197. //&>>&0 0 0 1B
  198. //&<<&void mmm_KeyBoard::InitKeyboardLayout();
  199. void mmm_KeyBoard::InitKeyboardLayout(){
  200.     int i,j;
  201.     for(i=0;i<4;i++) for(j=0;j<108;j++) keys[i][j]='.';
  202.     }
  203. //&>>&0 0 0 17
  204. //&<<&char *mmm_KeyBoard::InitDefaultAltCase(){
  205. char *mmm_KeyBoard::InitDefaultAltCase(){
  206.   char *AltCase=new char[256];
  207.   for(int i=0;i<256;i++){
  208.     AltCase[i]=
  209.       i>='A' && i<='Z' ? i+('a'-'A') :
  210.       i>='a' && i<='z' ? i-('a'-'A') :
  211. //      i>='Ç' && i<='Å' ? i+('á'-'Ç') :
  212. //      i>='É' && i<='ƒ' ? i+('α'-'É') :
  213. //      i>='á' && i<='»' ? i-('á'-'Ç') :
  214. //      i>='α' && i<='∩' ? i-('α'-'É') :
  215.       i;
  216.   }
  217.   return AltCase;
  218. }
  219. //&>>&0 0 0 12
  220. //&<<&void mmm_KeyBoard::SetACode(int n){ 
  221. void mmm_KeyBoard::SetACode(int n){
  222.     acode=mmm_KBD.keys[n];
  223.     }
  224. //&>>&1 0 1 11
  225. //&<<&static void interrupt mmm_KeyBoard::NewInt9(...);
  226. void interrupt mmm_KeyBoard::NewInt9(IntArg){
  227.   unsigned char k=inp(0x60);
  228.   int l=inp(0x61); outp(0x61,l|0x80); outp(0x61,l); outp(0x20,0x20);
  229.   mmm_KBD.AddScan(k);
  230. }
  231. //&>>&3 0 3 9
  232. //&<<&int mmm_KeyBoard::GetScan();
  233. int mmm_KeyBoard::GetScan(){
  234.   if(bbuf==ebuf) View();
  235.   while(bbuf==ebuf) ;
  236.   return keybuf[bbuf++];
  237. }
  238. //&>>&0 0 0 10
  239. //&<<&void MkScan(int scancode);             
  240.  
  241. int cvE0(int sc){
  242.   switch(sc){
  243.     case 0x1C: return 0x61;     // R-[Enter]
  244.     case 0x1D: return 0x62;     // R-CTRL
  245.     case 0x35: return 0x63;     // [/]
  246.     case 0x37: return 0x64;     // CTRL-PrintScreen
  247.     case 0x38: return 0x65;     // R-ALT
  248.     case 0x46: return 0x66;     // PAUSE
  249.     case 0x47: return 0x67;     // [HOME]
  250.     case 0x48: return 0x68;     // [Up]
  251.     case 0x49: return 0x69;     // [PgUp]
  252.     case 0x4B: return 0x6A;     // [Left]
  253.     case 0x4D: return 0x6B;     // [Right]
  254.     case 0x4F: return 0x6C;     // [End]
  255.     case 0x50: return 0x6D;     // [Down]
  256.     case 0x51: return 0x6E;     // [PgDn]
  257.     case 0x52: return 0x6F;     // [Ins]
  258.     case 0x53: return 0x70;     // [Del]
  259.   }
  260.   return 0;
  261. }
  262.  
  263. void setfix(){
  264.   mmm_f_FixShift^=mmm_f_Shift;
  265.   mmm_f_FixAlt^=mmm_f_Alt;
  266. }
  267.  
  268. void MkScan(int code){
  269.   assert(cur!=0);
  270.   if(code==0xE0){ mmm_f_E0=1; return; }
  271.   if(mmm_f_E0){
  272.     mmm_f_E0=0;
  273.     code=cvE0(code&0x7f)|(code&0x80);
  274.   }
  275.  
  276.   switch(code){
  277.   case 0x2A: mmm_f_LeftShift=mmm_f_Shift=1; return;
  278.   case 0x1D: mmm_f_LeftCtrl=mmm_f_Ctrl=1; return;
  279.   case 0x38: mmm_f_LeftAlt=mmm_f_Alt=1; return;
  280.   case 0x36: mmm_f_RightShift=mmm_f_Shift=1; return;
  281.   case 0x62: mmm_f_RightCtrl=mmm_f_Ctrl=1; return;
  282.   case 0x65: mmm_f_RightAlt=mmm_f_Alt=1; return;
  283.   case 0x3A: if(mmm_f_Caps==0) setfix(); mmm_f_Caps=1; return;
  284.  
  285.   case 0xAA: mmm_f_LeftShift=0; mmm_f_Shift=mmm_f_RightShift; return;
  286.   case 0x9D: mmm_f_LeftCtrl=0; mmm_f_Ctrl=mmm_f_RightCtrl; return;
  287.   case 0xB8: mmm_f_LeftAlt=0; mmm_f_Alt=mmm_f_RightAlt; return;
  288.   case 0xB6: mmm_f_RightShift=0; mmm_f_Shift=mmm_f_LeftShift; return;
  289.   case 0xE2: mmm_f_RightCtrl=0; mmm_f_Ctrl=mmm_f_LeftCtrl; return;
  290.   case 0xE5: mmm_f_RightAlt=0; mmm_f_Alt=mmm_f_LeftAlt; return;
  291.   case 0xBA: mmm_f_Caps=0; return;
  292.   }
  293.  
  294.   Command(code + (mmm_f_Shift<<8) +(mmm_f_Alt<<9)+(mmm_f_Ctrl<<10)+(mmm_f_Caps<<11) );
  295.  
  296. }
  297. //&>>&20 0 8 8
  298.  
  299. //&<<&KeyBoard Layouts 
  300.  
  301. char *mcode=mmm_KBD.keys[0],*acode=mmm_KBD.keys[2];
  302.  
  303. volatile int   mmm_f_E0=0;
  304. volatile int   mmm_f_LeftShift=0,mmm_f_RightShift=0;
  305. volatile int   mmm_f_LeftCtrl=0,mmm_f_RightCtrl=0;
  306. volatile int   mmm_f_LeftAlt=0,mmm_f_RightAlt=0;
  307. volatile int   mmm_f_Caps=0;
  308. volatile int   mmm_f_FixShift=0,mmm_f_FixAlt=0;
  309. volatile int   mmm_f_Shift=0,mmm_f_Alt=0,mmm_f_Ctrl=0;
  310. //&>>&A 0 A 0
  311.  
  312. void Beep(){ sound(1760); delay(32); nosound(); delay(2); }
  313.  
  314. //&<<&void __EXIT();
  315. /*
  316.    EXECUTER_FILENAME=
  317.  
  318.    e:
  319.    cd \amstex
  320.    commands
  321.    %comspec
  322.    c:
  323.    cd \
  324.    i:\astr\mmm.bat -1 e:\mmm.dir -2 e:\amstex\astex.tex
  325. */
  326.  
  327. //&<<&void PutCurDir(FILE *f){   // prints current drive & directory into FILE *f
  328. void PutCurDir(FILE *f){
  329.   char *cd=getcurdir();                        // current disk
  330.   int lcd=strlen(cd);
  331.   if(lcd>3 && cd[lcd-1]=='\\') cd[--lcd]=0;
  332.   unsigned int drv=SaveGetDrive(); // 1='A'
  333.   fprintf(f,"%c:\ncd %s\n",drv+'a'-1,cd);
  334.   delete cd;
  335. }
  336. //&>>&6 0 6 11
  337.  
  338. void __EXIT(){
  339. //&<<&    #ifdef _ENABLE_LOGGING_
  340.   #ifdef _ENABLE_LOGGING_
  341.       DoLog("void __EXIT(){ \n");
  342.   #endif
  343. //&>>&2 0 2 7
  344.     char *s;
  345.     FILE *fRunScript,*filelist;
  346.  
  347.     s=MFileName(EXECUTER_FILENAME);
  348.     fRunScript=fopen(s,"w"); MemTest(fRunScript!=0);
  349.     delete s;
  350.  
  351.     fputs("@echo off\n",fRunScript);
  352.     PutCurDir(fRunScript);
  353.     while(mmm_LineClipboard && mmm_LineClipboard->prev)
  354.         mmm_LineClipboard=mmm_LineClipboard->prev;
  355.     while(mmm_LineClipboard && mmm_LineClipboard->next){
  356.         mmm_LineClipboard->Write(fRunScript,FILE_ASCII);
  357.         mmm_LineClipboard=mmm_LineClipboard->next;
  358.         }
  359.     PutCurDir(fRunScript);
  360.     fputs("%COMSPEC%\n",fRunScript);
  361.     fputs(MFileName("mmm.bat @"),fRunScript);
  362.     fclose(fRunScript);
  363.  
  364.     s=MFileName("__mmm__.mmm");
  365.     filelist=fopen(s,"w"); MemTest(filelist!=0);
  366.     delete s;
  367.     PerformExitingFromFiles(filelist);
  368.     fclose(filelist);
  369.  
  370. //&<<&    #ifdef _ENABLE_LOGGING_
  371.   #ifdef _ENABLE_LOGGING_
  372.       DoLog("    } exit(-1)...\n");
  373.   #endif
  374. //&>>&0 0 0 0
  375.     exit(-1);
  376. }
  377. //&>>&1D 0 8 17
  378. void MMMlib_Console    (int ccode){};
  379.  
  380. //&<<&void File::MkWild();
  381. void File::MkWild(){
  382.   find_t ff;
  383.   char str[80];
  384.   flg=FILE_LIST;
  385.  
  386.             /* Search for all directories */
  387.   int c=_dos_findfirst("*.*", 0x1f , &ff);
  388.   while(c==0){
  389.     ff.name[12]=0;
  390.     if((ff.attrib & _A_SUBDIR ) && strcmp(ff.name,".")){
  391.       sprintf(str,"%s\\%s",ff.name,buf);
  392.       NewLine(str)->LinkBefore(pos);
  393.     }
  394.     c=_dos_findnext(&ff);
  395.   }
  396.  
  397.   c=_dos_findfirst(buf, 0x0f , &ff);
  398.   while(c==0){
  399.     ff.name[12]=0;
  400.     sprintf(str,"%-15s%10ld  %02d-%02d-%04d  %02d:%02d:%02d  %c%c%c%c",
  401.       ff.name, ff.size,
  402.       ff.wr_date&31, (ff.wr_date>>5)&15, ((ff.wr_date>>9)&127)+1980,
  403.       (ff.wr_time>>11)&15, (ff.wr_time>>5)&63,  (ff.wr_time&31)*2,
  404.       ff.attrib&1 ? 'r' : '.',
  405.       ff.attrib&2 ? 'h' : '.',
  406.       ff.attrib&4 ? 's' : '.',
  407.       ff.attrib&32 ? 'a' : '.');
  408.       NewLine(str)->LinkBefore(pos);
  409.     c=_dos_findnext(&ff);
  410.   }
  411.  
  412.   while(pos->prev) pos=pos->prev;
  413. }
  414. //&>>&0 0 0 1
  415. ///// mmm_dos.err mmm_dos.err mmm_dos.err mmm_dos.err mmm_dos.err
  416. //&>>&1C 0 1A B
  417.