
  .   .   "OS/2 "                         1 3





      ⮩   ᢥ 2  ࠧ ⥬: ࠡ     אַ
  .    ।⢥  易  ᮡ,  
    饥,          ᮢ   ᮢ襭⢮
짮⥫᪮  䥩   ⥬        ᯮ짮
⥩ ᯫ.   ,  אַ        
ணࠬ묨  ।⢠,   室묨     ணࠬ.    
 ⥬   , ,  稭,  
   㤨,       ਪ      ணࠬ       㦤
।⢥   ࠭ .   ,  ᪮
 ⠭     ୮,    אַ 饭   
ᯫ    ⥩訩   ᯮᮡ  ࠧ    ணࠬ᪨
஡,  ⥬ 㦨 㦤  ࠬ ⮩ .


                            Ŀ
                                           
                            


           짮⥫           ଠ
⮯ ॥     㤮, 祬     ࠢ
஬     .  樠쭮    ணࠬ     ᯥ祭
  易     ६饭 㪠⥫   ࠭.
  ᯮ,  室 ᮮ ணࠬ    ⮬,
 㪠⥫   ᮢ⨫   । ᫮       
࠭. ਬ, ணࠬ     ࣠ ⠪,  ⨥
  ,    㪠⥫  室    ᫮ "Quit"("室"),
ਢ   襭.

     ⮩      ,   ᯮ짮 㭪樨   䥩
ਪ ணࠬ OS/2  (OS/2 API functions),  ⮡ 易   
㪠⥫  ⮯,   ।,            ࠭
室  㪠⥫,   㧭    ﭨ     ,     ⠪
ॠ 㣨   ࠢ .


                                       
                       ---------------------------------

    ⮡  짮    ,    ⥬   祭 
ᯥ樠  ࠩ  .       室 㪠  䠩
CONFIG.SYS.

      襬  ⥬  ᪥      ᪮쪮 ࠩ஢
.     ,    ⮣, 祭    設
  १  ᫥⥫   ,       ⮣,   ମ  
⮢.  襩  ⥬  뫠 ⠭ Microsoft Bus   Mouse,
ࠩ     뢠    MOUSEA04.SYS (-    ࠩ
।祭  inport-襩,  ,     室    
襩 ).

    ன  ࠩ  -    ࠩ  㪠⥫ ⮯ . 
襩  ⥬     뢠   POINTDD.SYS.   CONFIG.SYS  
ᮤঠ  ப,  :

                          device = c:\os2\mouse04.sys
                          device = c:\os2\poindd.sys

     㧪 ⥬  ᯫ   ᮮ饭  ⮬,
  ࠩ ᯥ譮 ⠭.


                                       
                          --NFIG.SYS   ᮤঠ  ப, -
 ᫥ :

                          device = c:\os2\mouse04.sys
                          device = c:\os2\poindd.sys

     㧪 ⥬  ᯫ   ᮮ饭  ⮬,
  ࠩ ᯥ譮 ⠫஢.


                                       
                          --------------------------

     㭪樨 ࠢ  祭  ⥬ MOU, 
 ⥪  ᪮  (, ᪨ 
DLL -  Dynalink Library),      ⥬ VIO.  筮 ⠪  , 
⥬  VIO,  ⥬  MOU      㣨 ஬
㭪権, ᫨  室.

     ।⠢    (Presentation Manager)  ࣠
 .  ⥪ -० 㤥  ন
㭪樨 ᯥ樠쭮 ணࠬ 䥩,   ਣ 㤥   㦥
 ࠡ   ᫮.

      ᯮ짮   ⥪⮢ ०,   
㪠⥫ ।    筮    ப   ⮫, ⠪    
᪮  ०,   㪠⥫  ।  筮
  ᥫ.     ⮩    㤥   ᬠਢ,     ᭮,
⥪⮢ ०.

     ᠭ   ணࠬ,   ன ਬ  ,  
      ᭮   .  -,      
⨢஢.   砥,   ࠩ      祭
handle.     ⮣   ᯮ   㭪  MouOpen().   -,
।,      㤥   ⢮   㪠⥫  ⮯,
室    ⮬,  ⮡ ᤥ   .   ⮩
楫 㦨  㭪 uDrawPtr().  祬,    ⥬  
   믮.

    ,  ଠ          祭   ਪ
ணࠬ. ᪮쪮 㭪権     ᤥ,   訬
ﬨ    MouReadEventQue().   㭪   ᮮ頥  
⮬,     室   ,         .   ਪ
ணࠬ  (  ⤥쭠     (thread)   ணࠬ  ⥬   
᪮쪨 ﬨ ) 筮  뢠 MouReadEventQue()  横᪨  
।ਭ ᮮ⢥騥 ⢨,   ᨬ   祭
१.    㭪   13-1       ।⠢     
-奬.


               Ŀ
                ⨢஢  
               
                         
            Ŀ
             ⢮ 㪠⥫ 
               MouDrawPtr() 
            
     Ĵ
          Ŀ
              ଠ             Ŀ
            ﭨ     _________ ,  
           ⮯ 㪠⥫,            (⭠) 
           MouReadEventQue()         
          
                        
              Ŀ
                ⬥祭      
     Ĵ                   
                   ᮡ⨥?      
              
                         
            Ŀ
             믮 室 
                   ⢨        
            
     


            13-1. -奬 ⢨  ணࠬ஢ .


    ᬮਬ        ணࠬ,        ன    ᯮ
襯᫥ 㭪樨.   ணࠬ  뢠   㪠⥫
 , ⠪,  짮⥫  ࠢ    㪠⥫,
 . ⢥  ᮡ⨥,  ஥  ॠ   ணࠬ,
 ⨥     2 -   ࠢ   媭筮   
( ९,   ᯮ    ⠪  ; ᫨   襬
ᯮ殮 媭 ,    2  室 -
।). ⨥  ਢ  襭 ணࠬ.


    /* event.c */
    /* । ⢨ , ६饭 㪠⥫ */
    #define INCL_SUB
    #include <os2.h>
    #define BUTTON2  0x10               /*  4 :  2  */

    char Blank[2] = { 0x20, 0x07 };     /* ஡, ଠ ਡ */
                                        /*  ⪨ ࠭ /*
    main()
    {
      unsigned short MouHandle;         /* handle  */
      struct  _MOUEVENTINFO Event;      /* ଠ  ᮡ⨨  */
      unsigned ReadType = 1;            /* 0 -  , 1 -  */
      unsigned rc;                      /*   */
                                        /*  ࠭ */
      VioScrollUp( 0, 0, -1, -1, -1, Blank, 0 );
                                        /*  handle  */
      if( rc=MouOpen( 0L, &MouHandle ) )
        { printf("MouOpen error=%u",rc); exit(1); }
                                        /* ᮢ ⠭ 㪠⥫ */
      if( rc=MouDrawPtr( MouHandle ) )
        { printf("MouDrawPtr error=%u",rc); exit(1); }

      while( TRUE )  {                  /*  ᮡ  */
        if( rc=MouReadEventQue( &Event, &ReadType, MouHandle ) )
          { printf("MouReadEventQue error=%u",rc); exit(1); }
                                        /* ᫨  ࠢ , 室 */
        if( Event.fs & BUTTON2 )
          break;
      }
      MouClose( MouHandle );
      exit(0);
    }


          믮   ணࠬ  頥   ࠭      ⥬
ᢥ稢   㪠⥫,   㬮砭  ।⠢ ᮡ
אַ㣮쭨   ᭮ ࠦ   祩 ⪨  ࠭
80x25.       㪠⥫   ६ ᮣᮢ. ணࠬ  
ॠ     ⨥          稢  ⨨
ࠢ.


                              㭪 MouOpen()
                              -----------------

      2   㬥.   㬥  -   ࠩ   㪠⥫
. ᫨ ᯮ ⠭ ࠩ,   筮   뢠,
  㬥  ࠢ  .  ன  㬥 -  頥 
ணࠬ  handle'  .   Handle    室  ࠬ஬ 
設⢠ 㣨 "設" 㭪権.

                MouOpen() - ⨢஢ ,  handle
                ----------------------------------------------
Ŀ
   MouOpen(DriverName, AMouHandle);                                 
   char far *DriverName;          /* ப ASCIIZ -  ࠩ */
   unsigned short far *AMouHandle;/*  handle' */              


                             㭪 MouDrawPtr()
                             --------------------

    ।⢥  ᫥  ⨢樨  㪠⥫  .   ࠭
    "⭮   ",   ன   室  
⮬   ﭨ.  ⮡  㢨  㪠⥫, 㦭 ᯮ짮
㭪樥 MouDrawPtr().

                    MouDrawPtr - ᤥ 㪠⥫ 
                    --------------------------------------
Ŀ
   MouDrawPtr(MouHandle);                                
   unsigned short MouHandle;           /* handle  */ 

    ⢥  㬥  㭪樨  -    handle . MouDrawPtr()
ᯮ  ⠪      ⠭      㪠⥫   
⭮  , ᮧ ࠭   㭪樨  MouRemovePtr(),
  ᬮਬ .


                          㭪 MouReadEventQue()
                          -------------------------

    ࠫ   ⮬      ணࠬ஢       
।  ⮯  ﭨ   . ⨬    
㭪  MouReadEventQue().

           MouReadEventQue -    । ᮡ⨩ 
           -------------------------------------------------------
Ŀ
   MouReadEventQue(ABuffer, AReadType, MouHandle);                  
   struct  _MOUEVENTINFO far *ABuffer; /*  ଠ樮     
                                                           */ 
   unsigned far *AReadType;            /*  ਧ */ 
   unsigned short MouHandle;           /* handle  */            

      3 㬥.   㬥 -    ,
뢠饩  ﭨ .    ଠ   頥   㭪樥
MouReadEventQue(),     ᠬ     ।       BSESUB.H
᫥騬 ࠧ :

    struct _MOUEVENTINFO  {
      unsigned fs;                      /* ᫮ ﭨ ᪨ ᮡ */
      unsigned long Time;               /* ६  ᥪ㭤 */
      unsigned row;                     /*   - ப */
      unsigned col;                     /*   - ⮫ */
    }

      fs   _MOUEVENTINFO 뢠 "᪮  ᮡ".
 祭 ⮢   fs  ਢ  . 13-2.


      Ŀ
       15 14 13 12 11 10 9  8  7  6  5  4  3  2  1  0 
      
       १ࢨ஢,  ﬨ                    
                                                              
     3                    
                                                               
     3 ,                  
                                                                
     2              
                                                                 
     2 ,             
                                                                  
     1        
                                                                   
     1 ,       
                                                                    
     ,    


                       . 13-2.  ᪨ ᮡ.


    ஢   祭   ᮮ⢥   ⮢   ᪨,     
।,   ,    .

       Time    ᮤন  ६   㯫 ᮡ 
ᥪ㭤.    row      col  ।     ⮯
  ⥬  न,     砫 ਭ  孨   㣮
࠭.

    ன  㬥   㭪樨  MouReadEventQue()  -  ਧ 
ReadType.    ⠭  ਪ  ணࠬ    ।,
᫥   㭪樨   㯫   ᮡ (६饭  ,
 ),       ࠢ  ணࠬ.
祭  㬥,  ࠢ 1,  ।뢠 MouReadEventQue()  
ᮡ,  祭  0  -  த  믮  ணࠬ.    襬
ਬ  ᯮ ਠ  ,  ᫨  -  
  த  ࠡ,       㯫   ᮡ,
᫥     ReadType  =   0.   ⨩   㬥 - handle  ,
祭  믮 MouOpen().

    ணࠬ  event.c ।⠢  ᮡ 横 ⨯ while,   ஬
뢠 㭪 MouReadEventQue().    㯫   ᮡ
MouReadEventQue()    믮  ணࠬ.    㯫
ᮡ     _MOUEVENTINFO. ணࠬ  
ᮤন ⮫쪮     - ⢥⮣   4 
fs .   ⠭   ,      2,
      .  ᫨     ⨬  ଠ  ⨨
ࠢ  ᨬ  ⮣,      ,  室
஢ ⠪  3.

    ᪮쪮   㣨   㭪権      믮      ⢨   ,
⢫塞  MouReadEventQue().  ਬ,  MouGetPtr()   
।  ⮯ 㪠⥫,   MouGetEventMask() - ﭨ
. ᯮ짮    㭪権     䥪⨢,
    த⢨.


                              㭪 MouClose()
                              ------------------


    ⮡   ࠡ      㤠   㪠⥫   ࠭,
 ᯮ짮 㭪樥  MouClose(),  뢠  ࠩ
ன⢠ ࠢ .

            MouClose -  ࠩ ன⢠ ࠢ 
            ------------------------------------------------------
Ŀ
   MouClose(MouHandle);                                   
   unsigned short MouHandle;           /* handle  */  

      ⮩   㭪樨  ⮫쪮     㬥   -  handle   .   
⢨⥫쭮    室  믮    㭪   
ணࠬ, ..  ⥬ ᠬ    ஥  ࠩ   ன⢠   
襭.   ,  ணࠬ  맢 MouClose()   
, ⮡ 㤠 㪠⥫.


                              "         "
                   ---------------------------------------

    Event.c -     ઠ ணࠬ,  饩   ࠡ 
. 騩 ਬ    ᪮쪮 ⠫.

    ࢮ.  ,  ୮,  ⨫,     믮  ணࠬ
event.c  (  ⠩   㪠⥫)   ⠥    
த  .    ਫ  ⥫쭮,  ⮬
  ,  㡨騩 .     ᠬ   
 ⠭      ணࠬ,  ⥬   ᤥ 
 .

    ஥.     ࠧ⨫      ࠭   ,      
אַ㣮쭨      ᭮    ࠦ.         ᢮
⠭⭮  㪠⥫         ᯮᮡ  ᢮
ਡ  ᨬ  䮭.   ⥬ 䮭  ,    ᢥ⫮
䮭 - ,   ⮬   ᥣ  ⥭ ( ⫨稥   堬).
⨢  ࠭   ᢥ祭 ,     த஢
 ᢮⢮   㪠⥫.   ⠪ 뢥   ࠭   ப  ⥪,
⮡  ,  㪠⥫   ᨬ.

    .  뢠    砫  㪠⥫.
  ண-  ࠬ   event.c     ।⠢   ⥬,  㪠⥫
     業  ࠭.      ਬ   ਬ 㭪
MouSetPtr(), ⮡ 㪠   砫 .


    /* event2.c */
    /* । ⢨ , ६饭 㪠⥫ */
    /* 㡨ࠥ  ⠭  */
    #define INCL_SUB
    #include <os2.h>
    #define BUTTON2  0x10              /*  4 :  2  */
    #define UPPER    0                 /*  ப 뤥  */
    #define LOWER   10                 /*   ப 뤥  */
    #define LEFT     0                 /*   ⮫ 뤥  */
    #define RIGHT   20                 /* ࠢ ⮫ 뤥  */

    char string[] = "Test Test Test";

    char Blank[2] = { 0x20, 0x07 };     /* ஡, ଠ ਡ */
                                        /*  ⪨ ࠭ /*
    char Fill[2]  = { 0x20, 0x70 };     /* ஡, ਡ ஢ */

    main()
    {
      unsigned short  MouHandle;        /* handle  */
      struct _PTRLOC MouPos;            /*   */
      struct _MOUEVENTINFO Event;       /* ଠ  ᮡ⨨  */
      struct _VIOCURSORINFO OldCur;     /*   */
      struct _VIOCURSORINFO Cursor;     /*    */
      unsigned ReadType = 1;            /* 0 -  , 1 -  */
      unsigned row;                     /*  ப  ᢥ祭
                                            */
      unsigned rc;                      /*   */
                                        /*  ࠭ */
      VioScrollUp( 0, 0, -1, -1, -1, Blank, 0 );

                                        /* ࠭   */
      VioGetCurType( &OldCur, 0 );
      Cursor.yStart =  0                /* ᤥ   */
      Cursor.cEnd   =  0                /* ⥪騩   */
      Cursor.cx     =  1                /*     */
      Cursor.attr   = -1                /*  */
      VioSetCurType( &Cursor, 0 );
                                        /*  handle  */
      if( rc=MouOpen( 0L, &MouHandle ) )
        { printf("MouOpen error=%u",rc); exit(1); }

      MouPos.col = 40;                  /* ⠭   */
      MouPos.row =  5;
      if( rc=MouSetPtrPos( &MouPos, MouHandle ) )
        { printf("MouSetPtrPos error=%u",rc); exit(1); }

                                        /* ᮢ ⠭ 㪠⥫ */
      if( rc=MouDrawPtr( MouHandle ) )
        { printf("MouDrawPtr error=%u",rc); exit(1); }

                                        /* ᢥ  */
      for( row= UPPER; row<=LOWER; row++ )
        VioWrtNCell( Fill, RIGHT-LEFT+1, row, LEFT, 0 );
                                        /* 뢥 ⥪ */
        VioWrtCharStr( string, sizeof(string), LOWER+1, LEFT, 0 );

      while( TRUE )  {                  /*  ᮡ  */
        if( rc=MouReadEventQue( &Event, &ReadType, MouHandle ) )
          { printf("MouReadEventQue error=%u",rc); exit(1); }
                                  /* ᫨  ࠢ , 室 */
        if( Event.fs & BUTTON2 )
          break;
      }
      MouClose( MouHandle );            /* ᢮ handle  */
      VioSetCurType( &OldCur, 0 );      /* ⠭   */
      exit(0);
    }


        ணࠬ,  㢨  אַ㣮쭨 
孥  㣫 ࠭.  ६ 㪠⥫     
㢨,     梥     .  ,  
ᮢ頥 㪠⥫,  ⮡ࠦ    ᭮  ०.  ⥫
⮬᪨   ࠨ ᢮    ਡ,  ⮡      
 䮭.   ࠭     ࠡ   ணࠬ    , 
㪠⥫ 室  ᢥ祭 ,   . 13-3.


Ŀ
                                                                   
                                                                   
                                                   
                                                   
                                                  
                                                   
                                                  
        Ĵ                                  
                                                  
                                                  
                                                                  
      Test Test Test                                              
                                                                  
                      ⥫  ᥣ                        
                        䮭                        
                                                                   



             . 13-3.  ࠭  ࠡ ணࠬ  event2.c


                            㭪 MouSetPtrPos()
                            ----------------------


      ᪥  ணࠬ   event2.c  㪠⥫     
孥 㣫 ࠭.  १ ⢨ 㭪樨 MouSetPtrPos().

              MouSetPtrPos - ⠭ ⮯ 㪠⥫
              --------------------------------------------------
Ŀ
  MouSetPtrPos(ABuffer, MouHandle);                                 
  struct  _PTRLOC far *ABuffer;   /*   ⮯ */ 
  unsigned short MouHandle;       /* handle  */                 

     㬥  ⮩ 㭪樨  - ,  ᮤঠ न
㪠⥫.   ।  BSESUB.H ᫥騬 ࠧ :

    struct _PTRLOC  {
      unsigned row;
      unsigned col;
    }

          砥   MouReadEventQue(),  ।,   
孨 㣮  न (0,0).

    ன 㬥 - hadle , 祭  MouOpen().

     ⮣, ⮡                  ࠭,   ணࠬ
event2.c  ᯮ짮   㭪  VioSetCurType(),       
_VIOCURSORINFO   attr  ⠭  -1. ।⥫쭮  ⥪饥
     ࠭  㭪樥  VioGetCurType().    
ࠡ    ணࠬ,  ᭮    ᯮ    㭪   VioSetCurType(),
⠭ .


                   "        "           
               ---------------------------------------------


        ࠭  ,  ன  㪠⥫ 
.  ਬ,  ணࠬ  ᢥ稢    ஬   
।।⥫ ᮮ饭,  뫮  ⥫쭮, ⮡ 㪠⥫
㤠 .

     ⮩ 楫    ᯮ짮 㭪樥  MouRemovePtr().  
᫥饬  ਬ  ணࠬ   ᢥ稢    ࠭  אַ㣮
   ६   ⭮  㪠⥫.


    /* remove.c */
    /* 㤠 㪠⥫     ࠭ */
    #define INCL_DOS
    #define INCL_SUB
    #include <os2.h>
    #define BUTTON2  0x10              /*  4 :  2  */
    #define UPPER    5                 /*  ப ⭮  */
    #define LEFT    20                 /*   ⮫ ⭮  */
    #define LOWER   15                 /*   ப ⭮  */
    #define RIGHT   60                 /* ࠢ ⮫ ⭮  */

    char Blank[2] = { 0x20, 0x07 };     /* ஡, ଠ ਡ */
                                        /*  ⪨ ࠭ /*
    char Fill[2]  = { 0x20, 0x70 };     /* ஡, ਡ ஢ */

    main()
    {
      unsigned short  MouHandle;        /* handle  */
      struct _PTRLOC MouPos;            /*   */
      struct _MOUEVENTINFO Event;       /* ଠ  ᮡ⨨  */
      struct _VIOCURSORINFO OldCur;     /*   */
      struct _VIOCURSORINFO Cursor;     /*    */
      struct _NOPTRRECT NoPtr;          /* ⭠   㪠⥫ */
      unsigned ReadType = 1;            /* 0 -  , 1 -  */
      unsigned row;                     /*  ப  ᢥ祭
                                            */
      unsigned rc;                      /*   */
                                        /*  ࠭ */
      VioScrollUp( 0, 0, -1, -1, -1, Blank, 0 );

      VioGetCurType( &OldCur, 0 );      /* ࠭   */
      Cursor.yStart =  0;               /* ᤥ   */
      Cursor.cEnd   =  0;               /* ⥪騩   */
      Cursor.cx     =  1;               /*     */
      Cursor.attr   = -1;               /*  */
      VioSetCurType( &Cursor, 0 );
                                        /*  handle  */
      if( rc=MouOpen( 0L, &MouHandle ) )
        { printf("MouOpen error=%u",rc); exit(1); }

      MouPos.col = 10;                  /* ⠭   */
      MouPos.row = 10;
      if( rc=MouSetPtrPos( &MouPos, MouHandle ) )
        { printf("MouSetPtrPos error=%u",rc); exit(1); }

                                        /* ᮢ ⠭ 㪠⥫ */
      if( rc=MouDrawPtr( MouHandle ) )
        { printf("MouDrawPtr error=%u",rc); exit(1); }

                                        /* 뤥   */
      for( row= UPPER; row<=LOWER; row++ )
        VioWrtNCell( Fill, RIGHT-LEFT+1, row, LEFT, 0 );
      NoPtr.row  = UPPER;               /* ࠭ ⭮  */
      NoPtr.col  = LEFT;
      NoPtr.cRow = LOWER;
      NoPtr.cCol = RIGHT;
      if( rc=MouRemovePtr( &NoPrt, MouHandle ) )
        { printf("MouRemovePtr error=%u",rc); exit(1); }

      while( TRUE )  {                  /*  ᮡ  */
        if( rc=MouReadEventQue( &Event, &ReadType, MouHandle ) )
          { printf("MouReadEventQue error=%u",rc); exit(1); }
                                        /* ᫨  ࠢ , 室 */
        if( Event.fs & BUTTON2 )
          break;
      }
      MouClose( MouHandle );            /* ᢮ handle  */
      VioSetCurType( &OldCur, 0 );      /* ⠭   */
      exit(0);
    }


     믮 ⮩ ணࠬ   業 ࠭   ᭮ ०
⮡ࠦ  让   אַ㣮쭨.  ⥫       室
   ࠭,     . 䥪  砥
⠪,   㪠⥫ 室  אַ㣮쭨,   뢠
  襣 .

    ணࠬ   remove.c   宦   । ணࠬ   event2.c.
ᢥ祭   אַ㣮쭨      㭪樥    VioWtrNCell(),  
⭠  ,    ன  "" 㪠⥫, ⠭
㭪樥 MouRemovePtr(). ⨬,     ᪮
裡    אַ㣮쭨    , ⮬ 㦭  
⥫    ⮬, ⮡  ࠭ ᮢ.


                            㭪 MouRemovePtr()
                            ----------------------

            MouRemovePtr - 㤠 㪠⥫    ࠭
            -----------------------------------------------------
Ŀ
   MouRemovePtr(ABuffer, MouHandle);                        
   struct  _NOPTRRECT far *ABuffer;    /*   */   
   unsigned short MouHandle;           /* handle  */    

     ⮩ 㭪樨 2 㬥.  㬥  ⮩ 㭪樨 -  
- ,  㤠    न   ⭮   . 
  ᠭ  BSESUB.H ᫥騬 ࠧ :

    struct _NOPTRRECT  {
      unsigned row;          /*  ப ⭮  */
      unsigned col;          /*   ⮫ ⭮  */
      unsigned cRow;         /*   ப ⭮  */
      unsigned cCol;         /* ࠢ ⮫ ⭮  */
    }


      ன    ।  孨  㣮
,  ⨩  ⢥ - ࠢ .

     뫮    ⢥      ᫥騥:
upper, left, bottom, right.

       ⬥⨫ ࠭,   ᯮ짮   㭪 MouDrawPtr()
 ⬥  ⭮   .      ६    
।  ⮫쪮  ⭠    - ,  뫠  
 ᫥  믮 㭪樨 MouRemovePtr().


                                        
           -------------------------------------------------------


       易⥫쭮 뢠     ⠭  㪠⥫.
樮- ஢   ⢨   -㣮,  ਬ, ⮣,
      -       㪠⥫  ᯥ  
஢   ࠢ  ,    ,   ॠ ⥬
ࠩ஬ 㪠⥫ .

     ⢥ 樨  ᬮਬ ணࠬ,   ன 㪠⥫
      ᪮    㪢   .      ⥩訩   ਠ
ᯮ짮  ⠭⭮ 㪠⥫,  ⠪   ॡ   ᮢ
⮫쪮    ᨬ. ⥫     ᫮   - 
ਢ   ⮫쪮      㢥祭      ࠧ஢      -  
ணࠬ஢.

    ணࠬ   ⠭    㪠⥫,  㦭   ०   ᥣ
    ⮬,  ⮡   ⥬   㪠⥫     
࠭.     ⨦    ⮣     ᯮ짮   㭪樥
MouRemovePtr(),             ࠭,  
  㠫஢ 㪠⥫   㭪樥 MouDrawPtr().    襬
ਬ  ਬ ன ᯮᮡ.

         ᠬ     ⢫  প   㪠⥫  :
᫥ ६饭  ,   ᮮ⢥⢨   ,  ⮡ࠦ
      ࠭.    ⠪    ࠭  ᫮塞
㪠⥫ ᨬ  ⥬  ⠭ .

     ,      ।  ਬ,    ணࠬ  横
뢠 MouReadEventQue().      ,    
⠭    0 ᪨  ᮡ,  ⠭  ࠭
࠭  ᨬ   ன 樨  㪠⥫,  ᨬ  
 樨   㪠⥫,   ⮬ ⮡ࠦ   ⮬    ᠬ
㪠⥫.


    /* pointer.c */
    /*  ⠭⭮ 㪠⥫ */
    #define INCL_DOS
    #define INCL_SUB
    #include <os2.h>
    #define BUTTON2  0x10              /*  4 :  2  */
    #define MOVED    1                 /*  0 :   */
    #define UPPER    0                 /*  ப  */
    #define LOWER   10                 /*   ப  */
    #define LEFT     0                 /*   ⮫  */
    #define RIGHT   20                 /* ࠢ ⮫  */

    char string[] = "Test Test Test";
    char Blank[2] = { 0x20, 0x07 };     /* ஡, ଠ ਡ */
                                        /*  ⪨ ࠭ /*
    char Fill[2]  = { 0x20, 0x70 };     /* ஡, ਡ ஢ */
    char NuPtr[2] = { 0xE9, 0x07 };     /* , ଠ ਡ */
    char OldChar[2];                    /*  ᨬ 䮭 */

    main()
    {
      unsigned short  MouHandle;        /* handle  */
      struct  _MOUEVENTINFO Event;      /* ଠ  ᮡ⨨  */
      unsigned ReadType = 1;            /* 0 -  , 1 -  */
      unsigned row;                     /*  ப  ᢥ祭
                                            */
      unsigned OldRow;                  /*   㪠⥫-ப  */
      unsigned OldCol;                  /*   㪠⥫-⮫ */
      unsigned len = 2;                 /*  ப  ⥭ */
                                        /*  ࠭ */
      VioScrollUp( 0, 0, -1, -1, -1, Blank, 0 );

      MouOpen( 0L,&MouHandle );         /*  handle  */
                               /* ᮢ אַ㣮쭨  ᭮ ० */
      for( row= UPPER; row<=LOWER; row++ )
        VioWrtNCell( Fill, RIGHT-LEFT+1, row, LEFT, 0 );
                                        /*  ⥪ */
      VioWrtCharStr( string, sizeof(string), LOWER+1, LEFT, 0 );

      OldCol = 40;                      /* 砫쭠   業 */
      OldRow = 12;

      while( TRUE )  {                  /*  ᮡ  */
        MouReadEventQue( &Event, &ReadType, MouHandle );
                                        /* ᫨   */
        if(Event.fs & MOVED )  {
                                        /* ⠭ ᨬ 䮭 */
          VioWrtCellStr( OldChar, 2, OldRow, OldCol, 0 );
          OldRow = Event.row;           /*    */
          OldCol = Event.col;
                                       /* ࠭ ᨬ   樨 */
          VioReadCellStr( OldChar, &len, Event.row, Event.col, 0 );
                                      /* ᮢ 㪠⥫   樨 */
          VioWrtCellStr( NuPtr, 2, Event.row, Event.col, 0 );
        }
                                        /* ᫨  ࠢ , 室 */
        if( Event.fs & BUTTON2 )
          break;
      }
      MouClose( MouHandle );            /* ᢮ handle  */
      exit(0);
    }


    ᫥ ᪠ ⮩ ணࠬ   㢨,    ⠭⭮
㪠⥫  ࠭ ६頥   ᪠ 㪢 .    
㪠⥫   ᢮ ਡ   ᨬ  梥 䮭,  
     ⠭⭮ ਠ,    ᥣ,  ⮬ 
।⠢騩     ᨬ     ᢥ⫮  䮭     ⥬
אַ㣮쭨窥.

      ⮫       ணࠬ஢  㪠⥫,   騥
, 祬   ᨬ.   ࠡ  㪠⥫  
ᬨ᪮  ࠡ,   祫᪮  䨣     饩   蠤.
⠭ 㪠⥫ ᥣ ।⠢  ᨬ.


                                       
                       -------------------------------


    ᬮਬ  ਬ,  ஬    ᯮ    ࠢ
.    १砩   ࠭    짮⥫᪮
䥩.  筮    孥   ப  ࠭  뢮   
ࠧ . ᫨    㪠⥫       -
ࠧ     ,      ࠭ ᫮     ࠢ
ᢥ   "ࠧ୥"  ᮮ⢥饥 . 筮  뢮
⥪ । ⢨, ஥    믮 (ਬ,  
 ࠭ 䠩),  ०,     (⮡ࠦ 
ଠ ASCII    筮 ଠ).  롮  ᭮ ᯮ
.

     ।⠢    ᮡ⢥ ⥬  , 
  ⪠  ࠡ  .  ⮬     ࠡ  
⥬     ।⠢ .

     ᫥饬 ਬ ᭮  ᮤন ⢥ ࠧ. 
뢠-    "MENU"    ᢥ稢    孥   ப. 쭠
ணࠬ     뢠     ࠧࠧ  ,     
樨 筮   .    㪠⥫  ᮢ頥   
࠭  ᫮,  騬 롮,   뤥 ஢
 襭  મ. ᫨      , 
"ࠧ୥"  -    ࠭    뢥 祭 ⥬, ⠢
.   ࠭    宦 㪠⥫ ᢥ稢.
 롮      筮       ⮣,
 㦭 ⥬ 뤥 મ.

     襬   ਬ    4  롮 "ண  ஢" :  "Print"
("")  -     ᫮     ।  ப  ࠭,    "Clear"
("⪠") -   ࠭ ⠭    ᫮, "Beep"   ("") -
   㪮  ᨣ   १      "Quit"  ("室")   -
襭  ணࠬ   (  ⨥   ࠢ     ணࠬ   
ॠ).


    /* menu.c */
    /*  ᯠ饣  */
    #define INCL_DOS
    #define INCL_SUB
    #include <os2.h>
    #define BUTTON1_MOVE  0x02         /*  1 :  1 ,
                                            */
    #define BUTTON1       0x04         /*  2 :  1  */
    char Blank[2] = { 0x20, 0x07 };     /* ஡, ଠ ਡ */
                                        /*  ⪨ ࠭ /*
    main()
    {
      unsigned short  MouHandle;        /* handle  */
      struct  _MOUEVENTINFO Event;      /* ଠ  ᮡ⨨  */
      unsigned ReadType = 1;            /* 0 -  , 1 -  */
      unsigned row;                     /*  ப */
      unsigned char norm = 0x07;        /* ଠ ਡ */
      unsigned char revr = 0x70;        /* ਡ ஢ */
                                        /*  ࠭ */
      VioScrollUp( 0, 0, -1, -1, -1, Blank, 0 );

      MouOpen( 0L,&MouHandle );        /*  handle  */
      MouDrawPtr( MouHandle );         /* ᮢ ⠭ 㪠⥫ */
                                       /*  "MENU", ଠ ਡ */
      VioWrtCharStrAtt ( "MENU", 4, 0, 0, &norm, 0 );

      while( TRUE )  {                  /*  ᮡ  */
        MouReadEventQue( &Event, &ReadType, MouHandle );
                                        /* ᫨ 㪠⥫  "MENU" */
        if(Event.col < 4 && Event.row==0 )  {
                                        /* 뤥 "MENU" */
          VioWrtCharStrAtt( "MENU", 4, 0, 0, &revr, 0 );
                                        /* ᫨    */
          if( Event.fs & BUTTON1 )  {
                                        /* 室  横  */
            do  {                       /* ᭮  ᮡ  */
              MouReadEventQue( &Event, &ReadType, MouHandle );
                                        /* 뤥 㪠 ⥬ */
              if( Event.row==1)
                VioWrtCharStrAtt( "Print", 5, 1, 0, &revr, 0 );
              else
                VioWrtCharStrAtt( "Print", 5, 1, 0, &norm, 0 );
              if( Event.row==2)
                VioWrtCharStrAtt( "Beep", 4, 2, 0, &revr, 0 );
              else
                VioWrtCharStrAtt( "Beep", 4, 2, 0, &norm, 0 );
              if( Event.row==3)
                VioWrtCharStrAtt( "Clear", 5, 3, 0, &revr, 0 );
              else
                VioWrtCharStrAtt( "Clear", 5, 3, 0, &norm, 0 );
              if( Event.row==4)
                VioWrtCharStrAtt( "Quit", 4, 4, 0, &revr, 0 );
              else
                VioWrtCharStrAtt( "Quit", 4, 4, 0, &norm, 0 );

                                        /*  横 ਮ᪠  */
            } while ( Event.fs & BUTTON1 || Event.fs & BUTTON1_MOVE );
                                        /*   */
            for( row=1; row<6; row++)
              VioWrtNCell( Blank, 5, row, 0, 0 );
                                        /* 믮 ࠭ ⢨ */
            switch( Event.row )  {
              case( 1 ):                /*   ப 12 */
                VioWrtCharStr( "MESSAGE", 7, 12, 0, 0 );
                break;
              case( 2 ):                /* ᨣ  */
                DosBeep( 100, 500 );
                break;
              case( 3 ):                /* ⪠ ப 12 */
                VioWrtNCell( Blank, 7, 12, 0, 0 );
                break;
              case( 4 ):                /* 室 */
                exit(0);
                break;
            }                           /*   switch */
          }  /*  2- if */
        }    /*  2- if */
        else
                                       /*  "MENU", ଠ ਡ */
        VioWrtCharStrAtt ( "MENU", 4, 0, 0, &norm, 0 );
      }  /*  while(1) */

      MouClose( MouHandle );            /* ᢮ handle  */
      exit(0);
    }


    ணࠬ  menu.c   ஥     筮   横,   ஬
뢠 MouReadEventQue().      뤥  襭
મ  ᮢ     㪠⥫. ᫨      
     ,  ணࠬ  㩤     ७ do-横,  
࠭  ⮡ࠧ   .          ⠪  뤥
襭  મ     ᮢ     㪠⥫.  ᪠
   ६ ਢ  믮 㪠    ⥬
⢨.  ணࠬ  ॠ ஬  switch.

     ਢ   ਬ,  ⢥,         業
ணࠬ,  ⥬  ,  ।⠢  ⮬,   
ᮧ ࠢ塞        짮⥫᪨  䥩.  
쥧  ணࠬ    ஥  ⥫쭮 ᫮, 
ॠ    ⢨  ⢥ ᮤঠ⥫쭥.    
뤥   ,  ᯮ    ⮣   ࠬ   梥, ⮡
ᤥ  ⨭    ࠭    ࠧ⥫쭮  ⭮  -
.

                           
                        -----------------------------

       menu.c   ᫥ 맮  㭪樨 MouReadEventQue()   ஢塞
믮  ᫮ :

    -  1 ,    ;
    -  1 ,    .

     ।,     ,    ⮫쪮    
᫮ 㤥 㤮⢮७. ᫨    ஢塞   믮 ⮫쪮
ࢮ   ᫮ (  2),   饩    ன
⥫쭮  ६,  ०  祬  ⨥     㤥  ᯮ
ணࠬ. ⥫쭮, ᫨  ⨬   ६ ॠ樨,
  ﭭ ᫥  ᫮.

                              "ப" ࠩ
                              -----------------

     襩  ᨨ OS/2   ࠩ  㪠⥫    ᠤ
訡,    ࠡ ணࠬ  menu.c.

    ।,    㪠⥫  ᮢ饭    ᨬ    ࠭, 
ப,  ᮤঠ    ᨬ,    ࠭   㤠.  ᫨    ⥯
६  㪠⥫,     ᨬ,     ० 樨   㪠⥫
 ; ୥  ,   ᫥   ॡ뢠 
.    襬   砥,  ᫥  ⮣,   롮   ந,
ப   祧   ᪫祭   ᨬ,    ⮣,
 ᮢ  㪠⥫   롮.

      ,       訡  㤥   ࠭   ᫥
  OS/2.    ᫨     ,     ਤ      -
⮯  㪠⥫,  ᫥  ᬥ饭 ।ਭ ⢨
 㤠 "襣" ᨬ.


                                         
                ---------------------------------------------


      뢠     뤥  ,  易    ,   
⤥  .        横  ᫥ ᮡ  ,
뢠  MouReadEventQue()  ,      ਬ.       ᠬ
६   㣨   ⢨      믮    ⢨,   ਬ,
⢫        ᪠    ᫥;   ਠ,
  롮  ⢨  ந  짮⥫    .   
ࠧ,  ᯥ  ஥  ॠ஢  ⢨  ,  
 ন 믮 㣨 ⥩   ணࠬ, ᫨ ⮫쪮   
         짮⥫.     ⠪   ᥣ  
࣠.


                            Ŀ
                                        
                            



    設⢮  ਪ ணࠬ   MS-DOS, ᮡ ࠡ  
䨪,      㭪ﬨ DOS   BIOS,    ⮣
         ᯫ.       㤮,  祬
ਬ ⥬ 㭪樨,   ⮬  ॥.   ⮨  ⨬
  OS/2 ?

     ६,   㦤 , 易   ஬,
,   OS/2 -     ᠬ    ࠧ  ⥬. ࢠ-
⥬ VIO,   OS/2,  ன  ﭭ ⠫ 
⮩  .   -   ।⠢    ( Presentation 
Manager).

       ।⠢     ᮧ  ᪨
䥩  짮⥫     ᯠ騬  ,  ,   
ப⪨  稬    ५ﬨ. ਪ   ணࠬ,   
।⠢塞묨  ।⢠,  ⮡ࠦ    ࠪ⨢
⢨     ।⠢  ,    ⥪, ⠪  
᪨ ࠧ.            ࠭   
     ࠡ   ணࠬ. ਬ     ।⢠  
।  "ࠢ騥 ᨭ" ᭮   ॠ樨, 
ᮧ ࠧ 짮⥫᪨  䥩,   祭 
㤮  ࠡ.  ⨬  稭 設⢮  ਫ    㯮஬
 䨪   "  ।⠢ ".

        ,     ।⠢  ।⠢
ப  祭      㭪権,     ᫮    ᢮,   
ணࠬ஢    ।  ॡ   "  室".
   ᫨誮   訥 ணࠬ   㦤   ⮫   
।⢠.       ,   ᯮ    ⠭   㭪樨
⥬  VIO (VIO-㭪樨).   ⮬ ,  ணࠬ    ।
MS-DOS  ஢  OS/2    VIO-㭪樨,     
।⠢  .   ⮬      ,      
।ᢥ   , ᯮ   OS/2 ?

    ⢥⮬       㤥  - .  ਪ ணࠬ 
אַ ᮢ     뢮 ࠦ   ࠭ 
 VIO-㭪権, 室   ⥬.

        ஢   㯠  : ணࠬ   
                  ,                   
.   । ᬮਬ  .


                                         
         -----------------------------------------------------------


    ।,      ६   믮  ਪ   ணࠬ,
뢮饩 ଠ    ࠭     ⥪⮢  ०,   짮⥫
१     ᥠᮢ   (Session  Manager)      ।⢥
४稫     ணࠬ     㣮  ᥠ  (session)  .   
ந   ࠧ   ࠭,   ᣥ஢   ࢮ ணࠬ?
  ,    ᮬ,  ⨫,  ᫥ ⭮ ४祭 ࠧ-
    ࠭  ⠭     ०   .  ⥬   ࠭
ᮤন ࠭   ⠪  뢠   ᪮     (,
  ᪮ LVB -  logical  video  buffer)   ⠭
    ⭮   ४祭.    ᥠ     ᢮   .
६      ࠭  ࠧ   ᪮쪨   ࠭,   
       ࠭ ⨢  ணࠬ,  室-
饩    ⨢  ᥠ  (foreground  session).    ४祭
ࠧ  ⥬   ⨯ணࠬ஢ ᬥ ࠭   ந室
ࠪ᪨ .

    ⢥, ,     ࠭祭:    ਬ ⮫쪮
 ࠡ ᯫ   ⥪⮢   ०. 祬?    ஡ -
.   ࠭ ࠧ   ࠭  ᪮  ०  ॡ
⥫쭮    .      CGA     ࠧ襭
ॡ 16K ,  EGA - 256K,    VGA   㣨     . ᫨
६  믮   ᪮쪮  ணࠬ,      ᢮
,  ᪮쪮    ॡ ⮫쪮   ,  
ࠪ᪨   ⠥    ᠬ  ணࠬ. ⮬ ᮧ⥫
OS/2  訫   ࠭  ࠧ      ⠬;  
⮫쪮     ॡ     ࠭ ࠧ ࠭   ⥪⮢
०.

    ணࠬ      ᮢ        ।⢥.   
   ࠧ  ⥫쭮    ࠭  ⠪ ᯮᮡ 
॥ (    ६        ᨬ     뢮
ப  ⥪  ᯮ짮 ⠭묨 VIO-㭪ﬨ).


                                          
        ---------------------------------------------------------------

    ⮡    , 室 믮 ᪮쪮 蠣.

    ࢮ. । ⮯    .   ⮩
楫 㦨 㭪 VioGetBuf().  頥 砫  .

    ஥.      ᯮ殮   㪠  , ணࠬ 
    .   ᠭ       ଠ       
⮡ࠦ,   -  (䨧᪨    ࠭)  
  -             .  ⮡  ᫠ ᮤন   
䨧᪨   ࠭, ᫥ ᯮ짮 㣮  API-㭪樥
- VioShowBuf(). ᫥   믮   ,  ०  室 
᪮   ,        ᯫ     
⮡ࠦ  ࠭.

       ࠧ        䥪⨢    ᮧ
ࠦ.   ணࠬ        ⥫쭮  ६   
ନ஢    ࠧ  ࠭.           㤥     
⥫,  ⮬   㭮 㤥   뢥  ࠭  
  VioShowBuf().

     ਢ   ணࠬ,  ᯮ ।⢥  
   ,     ⮡         뢥           ࠭    אַ㣮쭨,
 ஢묨 X-.


    /* logic.c */
    /*  ᯮ짮 ᪮  */
    #define INCL_DOS
    #define INCL_SUB
    #include <os2.h>
    #define HANDLE  0                 /* vio handle, ᥣ 0 */
    #define UPPER   5                 /*  ப 塞  */
    #define LOWER  15                 /*   ப 塞  */
    #define LEFT   20                 /*   ⮫ 塞  */
    #define RIGHT  60                 /* ࠢ ⮫ 塞  */
    #define COLS   80                 /* ᨬ  ப */
    main()
    {
      unsigned long ptr;               /* 㪠⥫ ᪮  */
      unsigned len;                    /*  ᪮  */
      unsigned offset;                 /* ᬥ饭  ᪮  */
      int row;                         /*  ப */
      int col;                         /*  ⮫ */
      unsigned rc;                     /*   */

                                  /*  㪠⥫ ᪮  */
      if( rc=VioGetBuf( &ptr, &len, HANDLE ) )
        { printf("VioGetBuf error=%u",rc); exit(1); }
                                  /*    ᪮  */
      for( row=UPPER; row<=LOWER; row++ )       /* ਡ ஢ */
        for( col=LEFT; col<=RIGHT; col++ )      /*  X */
          *( (unsigned far *)ptr + col + row*COLS ) = 0x7058;

      printf("  ᪨  襭.\n");
      printf(" 2 ᥪ, ⥬  䨧᪮ .\n");

      DosSleep( 2000L );

      offset = 0;                    /* ⮡ࠧ ᪨  */
      if( rc=VioShowBuf( offset, len, HANDLE ) )
        { printf("VioShowBuf error=%u",rc); exit(1); }

      printf(" \n");
      DosSleep( 2000L );
      exit(0);
    }


    砫  ணࠬ      "אַ㣮  "     
஢-    X-.  ⥬  뢮    ࠭ ᪮쪮 ப
⥪   筮 楤   printf(). ⮬    
2   ᥪ㭤   ,   ,          ᯫ,  ᯮ
VioShowBuf().  ,    ப   ⥪       ࠭
.  ந諮  ⮬,    printf() (    ⠭
VIO-㭪樨) ६      䨧᪨     ࠭
( ⨢ ணࠬ).

   ,    2   ᥪ㭤  ᫥     뤠   ⥪,    ࠭
  אַ㣮쭨,       ஢묨  X-,  
,    ᨬ ப   祣      १ᠫ.
 稫 ⮬,   ⥪   饭                
⮣,    "אַ㣮쭠 "   뫠  ନ஢   ணࠬ.
   㭪 13-4     ࠭   ᫥ ⮣,     뫨
뢥  ⥪  ᥪ     X-.


Ŀ
 [C:\OS2PROGS\CHAP13]                                               
 [C:\OS2PROGS\CHAP13]                                               
 [C:\OS2PROGS\CHAP13]                                               
 [C:\OS2PROGS\CHAP13]                                               
 [C:\OS2PROGS\CHAP13] XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
 [C:\OS2PROGS\CHAP13] XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
   ᪨  襭XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
  2 ᥪ, ⥬  䨧᪮ XXXXXXXXXXXXXXX 
         XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
                      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
 [C:\OS2PROGS\CHAP13] XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
                      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
                      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
                      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
                      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
                                                                    



             . 13-4.  ࠭  ࠡ ணࠬ  logic.c


                             㭪 VioGetBuf()
                             -------------------
     㭪   頥 㪠⥫  (⨯   far)   砫 , 
⠪  ᪮   (4000   ⥪⮢  ०
80x25).

            VioGetBuf -  㪠⥫ ᪮ 
            ------------------------------------------------------
Ŀ
   VioGetBuf(APointer, ALength, VioHandle);                         
   unsigned long far *APointer;        /*  㪠⥫  */ 
   unsigned far *ALength;              /*    */     
   unsigned short VioHandle;           /* VIO handle, ᥣ 0 */   

    ६   ࠬࠬ   㭪樨   :   ,      ஬
頥 㪠⥫;    , ᮤঠ騩     ,   
⠭   handle   䠩 VIO.   ⥫   直 䨪権
 ᯮ짮  祭 㯠  .

                             㭪 VioShowBuf()
                             --------------------

    ⮡ 㢨  ᮤন     ࠭, 㦭   ᯮ짮
㭪樥 VioShowBuf(),   뫠  室騥    
䨧᪨  ᯫ.

                VioShowBuf - ⮡ࠧ ᪨ 
                ---------------------------------------------
Ŀ
   VioShowBuf(Offset, Length, VioHandle);                   
   unsigned Offset;                    /* ᬥ饭   */ 
   unsigned Length;                    /*    */     
   unsigned short VioHandle;           /* VIO handle */     

     ⮩ 㭪樨 3 ࠬ.
      -  ᬥ饭   ⮡ࠦ        ⭮⥫쭮 
砫. ᫨ ⮡ࠦ  , ᬥ饭 ࠢ 0.
    ன -  ⮡ࠦ    ᪮ .  ᫨
⮡ࠦ  ,  ࠬ ࠢ  , 頥
VioGetBuf().
    ⨩ ࠬ - handle 䠩 VIO.
     襬 ਬ    १뢠 ࠭,  䥪⨢
뫮   ⮫쪮   ,  ௥ .

                  ⠫ 権  ᪨ ஬
                  -----------------------------------------

    אַ      ᯮ짮  䮭묨  (background)
ணࠬ. ᫨      ᮤন ࠭   ணࠬ
室    䮭   ᥠ,    ࠦ       
ᯫ ⮫쪮 ⮣,   㤥 ॢ  ⨢(foreground)
ᥠ.

      ணࠬ        ⢫ 
।⢥, ⠪     ᯮ짮  ⠭    VIO-㭪権.
訥    ࠧࠬ     ࠭  ।⥫쭥   ,
뢠 ଠ אַ  ,   뢮 ⥪   ਬ
VIO-㭪樨. ࠢ,    ⮬   㦭 ।ਭ    
।஦, ⮡   ࠭   뫮  ⠭ -  ⮣, 
VIO-㭪樨  ६    䨧᪨  ᯫ, 
 ६,   ।⢥   饭    ਢ  
 ⮫쪮 ᪮ .


                                          
        ---------------------------------------------------------------

    ⮡   ਪ    ணࠬ,   ᯮ騥   䨪,   
室  ⮫쪮  ।⢠,  ।⠢塞묨   ⥬ VIO, 
⠪     ⮣,  ⮡  -       OS/2 ணࠬ,
ᠭ    MS-DOS,  ࠧࠡ稪  OS/2 - ᬮ५ 
।⢥ 樨   䨧᪮   -  . 
⢥  㯪   짮⥫,  ᪮    ᢮ 
饭      ਢ,        㢨,   
⥬ ஡- .

    ᯮ,  ᪨    㯥 ⮫쪮   ࠡ
ᯫ  ⥪⮢ ०. ⥫쭮, ᫨  ⨬  ᯮ짮
ᯫ     ᪮     ०,             
।⠢ ,     אַ     䨧᪮
.


                    ⪨ 㯠  䨧᪮ 
                    ---------------------------------------

    ।⢥  饭   䨧᪮    ᢮
⪨.   -,   ⥬    ணࠬ,        
ଠ  , ⪮ ਢ易   ⨯     ०. 
ਬ,     CGA, ࠡ饬    ० 4     
EGA,  ࠡ饬    ०  16,  㦭  ࠧ ணࠬ. ,
ਪ  ணࠬ     ᮤঠ   ஥  楤,
㦨 ࠧ  ⨯ ᯫ,   ⪮  ࠨ 
ࠡ  ⮫쪮     ।    ஬.      ࠧ,
ਫ, ᯮ騥 אַ     䨧᪮    ,
  ⭮-ᨬ묨.

    -, ᫨      ᥠ   ᢮ ,    䨧᪨
   ⢥  .  ⮫쪮 ணࠬ
⠭  䮭,   ନ஢     ࠧ ࠭ ,  
⥬       ﭨ  ⠭  .     㢨  ,
ਪ ணࠬ  ᠬ  ࠭ ᮤন  ࠭,   
ॡ  ⥫    ணࠬ᪨    ᨫ      ⥫쭮
६, 稢    ࠭  ४祭  ࠧ-
.

    "᪠"   ணࠬ    믮   ।   
।⠢- ।⠢ .  ⮬, ,    ணࠬ
 室  ᢮  ᥠ,       믮   
 ।⠢ .


                      宦 䨧᪮ 
                      ----------------------------------

        䨧᪮            
API-㭪樨  VioGetPhysBuf().     㭪    頥   ᥫ,
⠭    砫       ᯫ,       ࠧ蠥
ਪ ணࠬ ᮢ  .


                               ࠭ ࠭
                               ----------------

        ⥬    ⮫쪮     䨧᪨ ,
, ⮡ 䮭  ணࠬ      , ᪮  
ਢ   ࠭ ଠ樨,  ணࠬ, 室    
⨢  ࠧ,  뢮    ࠭.    ।饭 
 ਪ  ணࠬ,०, 祬     䨧᪮
,     㡥     ⮬,      믮    
⨢ ᥠ.   ⮣ ᯮ  㭪 VioScrLock()  .  
  ணࠬ,  ᫨     室     䮭   ᥠ,   
ࠧ  ,   ॢ  ⨢ ᥠ.

    VioScrLock()  ⮫쪮   頥 ⥬  ਪ  ணࠬ,
  ,  頥  ਪ ணࠬ   ⥬.  ⨬,
     ணࠬ  ࢮ   ࠭ ந諮
  ४祭.     ४祭,   ᪮॥   ᥣ,   ਢ 
㭨⮦    ᮤন    ࠭,       ணࠬ   
ࢠ  ࠡ,  ⮡ࠦ     ⮫쪮    
㭪.  VioSCrLock()   ।祭   ⠪    ⮣,  ⮡   
 ⮣. ࠭ ࠥ 㭪樥 VioScrLock() ।  砫
  䨧᪮     ,       ⯨ࠥ    㭪樥
VioScrUnLock()  (   ࠭     砩)  ᫥   砭 ⮩
樨.   ࠭   ,       ४    䮭
०.


                䨧᪨ ஬  ⥪⮢ ०
              ---------------------------------------------------

        䨧᪨  ஬  筮  ࠡ   ᪮
०,    頥   ᯮ짮      ⥪⮢  ०.
ᬮਬ  ᭠砫      ,    - 襩
,    - ⮣,    ਥ ணࠬ஢    ⮬
砥    ,     ਬ﫨     ࠡ     .
ਢ    ணࠬ  뫠  "אַ㣮쭨", 
஢묨 X-  䨧᪨ .

      ணࠬ    ४    ᥠ  ᫥  ⮣,   
ࠦ       ࠭.   ᫥  ⭮    ४祭
ࠦ ⠭. ⥬  ࠭  ᮤন  䨧᪮
   ।  ४- 祭 (   ⮫쪮
 ⥪⮢ ० ࠡ ᯫ).

      ਬ   ।,     ᯮ    EGA   
⥪⮢ ० 80x25,    ᯫ  稭     B8000
   4000 .   ᫥    室   ࠬ 
饭     VioGetPhysBuf(),  ᫨    ࠡ⠥  㣨 ᫮
(ਬ,  ஬ ᯫ).


    /* physic.c */
    /*  ᨬ ।⢥  䨧᪨  ᯫ */
    #define INCL_DOS
    #define INCL_SUB
    #include <os2.h>
    #define HANDLE  0                 /* vio handle, ᥣ 0 */
    #define WAIT    1                 /* ,  ࠭ 㯥 */
    #define UPPER  10                 /*  ப 塞  */
    #define LOWER  15                 /*   ப 塞  */
    #define LEFT    0                 /*   ⮫ 塞  */
    #define RIGHT  60                 /* ࠢ ⮫ 塞  */
    #define COLS   80                 /* ᨬ  ப */
    main()
    {
      struct  _VIOPHYSBUF phys;        /*  䨧᪮  */
      unsigned far *ptr;               /* 㪠⥫ 䨧᪮  */
      int row;                         /*  ப */
      int col;                         /*  ⮫ */
      char status;                     /*  VioScrLock() */
      unsigned rc;                     /*   */

                                       /* 砫  EGA */
      phys.pBuf = (unsigned char far *) 0xB8000;
      phys.cb   = 4000;                /* 25x80x2 -   */
                                    /*  ᥫ 䨧᪮  */
      if( rc=VioGetPhysBuf( &phys, 0 ) )
        { printf("VioGetPhysBuf error=%u",rc); exit(1); }

                                  /* ᮧ 㪠⥫  䨧᪮  */
      ptr=(unsigned far *)( (unsigned long)phys.asel[0]<<16);
                                        /*  ࠭ */
      if( rc=VioScrLock( WAIT, &status, HANDLE ) )
        { printf("VioScrLock error=%u",rc); exit(1); }

                                  /*    䨧᪮  */
      for( row=UPPER; row<=LOWER; row++ )
        for( col=LEFT; col<=RIGHT; col++ )
          *( ptr+col+row*COLS ) = 0x7058;

                                        /* ⯥ ࠭ */
      if( rc=VioScrUnLock( HANDLE ) )
        { printf("VioUnScrLock error=%u",rc); exit(1); }
      exit(0);
    }


                            㭪 VioGetPhysBuf()
                            -----------------------

     㭪   宦 砫  䨧᪮ . 
  㬥.

          VioGetPhysBuf -  㪠⥫ ᪮ 
          ----------------------------------------------------------
    VioGetPhysBuf(AStructure, Reserved);
    struct  _VIOPHYSBUF far *AStructure; /*   */
    unsigned Reserved;                   /* १ࢨ, ᥣ 0 */

     ࠬ  -   ,   ᯮ,  
室, ⠪   室 㭪樨.    ।  BSESUB.H :

    struct _VIOPHYSBUF  {
      unsigned long pBuf;               /* 砫   */
      unsigned long cb;                 /*   */
      unsigned asel[1]f;                /* 頥 ᥫ */
      }

              -  砫       
䨧᪮    -     ਪ  ணࠬ.   
ଠ       ⨯        ०  ࠡ.
ਬ,   ஬ ᯫ 稭 c  B0000,  CGA
-  B8000,  EGA  -  A0000.      ⠢ 4000   
⥪⮢ ० 80x25,   ᪨ ०   ஢-
  16K  , 祬 256K. ᫨  ணࠬ  ,   ᯫ
⠭   ⥬,     맢 㭪樨   VioGetConfig()  
VioGetMode(),  ⮡  ।         ⨯      ०     ࠡ
ᮮ⢥⢥. ᫥   ⮣ 㦥   ࠢ쭮  㪠  砫
    .  뫮  ᪠ ,     
ࠬ    ணࠬ  physic.c   ,  ᫨   ࠡ⠥    ஬,
⫨  EGA,   㣮 ०.

       ⨩    -  ᨢ  ᥫ஢,   頥
VioGetPhysBuf().       ᥣ   㥬   ᯫ
' 64K ॡ   ᥫ.  ᥫ   
ᥣ. ᫨   䨧᪮     ॢ蠥 64K,  ⮫쪮 
  㦥. ᫨  ,    ன  ᥫ     ᫥騥
64K  ,    ..     (  ⫨稥     頥
VioGetBuf()  ࠡ c   㪠⥫) 室 ᤢ   
16 ࠧ冷, ⮡   ନ஢   "ࠢ"  㪠⥫ ⨯
far   祭 㯠  䨧᪮ .

   ன   㬥   㭪樨    VioGetPhysBuf()   १ࢨ஢,  
⠭ ࠢ 0.

                          㭪 VioScrLock()
                          --------------------

     㭪  ஢, 㯥  䨧᪨  ,  ᫨  ,
ࠥ , ⮡ ᪫   뢠 ࠡ ணࠬ
⥬ ᭥   䮭 ᥠ.

              VioScrLock() -  䨧᪨  ࠭
              -----------------------------------------------
Ŀ
  VioScrLock(WaitFlag, AStatus, VioHandle);                   
  unsigned WaitFlag;            /* 0 =  , 1 =  */ 
  unsigned char far *AStatus;   /* 0 = ᯥ譮 , 1 =    */ 
  unsigned short VioHandle;     /* VioHandle, ᥣ 0 */     

     ⮩   㭪樨    㬥.     㬥 -    䫠,
।騩, ᫥     ᢮ 䨧᪮  ,
᫨   (筮 -  ⮣,  ணࠬ 室   䮭
ᥠ). ⠭    䫠     ।뢠  㭪樨   .
   ࠭   ०. ᫨ 䫠 ࠢ 0,   㭪
  ᢮  ,   ணࠬ 믮 㣨
⢨,   .

    ன   㬥 -      . ᫨    
ࠧ襭,  祭    뢠    0,   ⨢ 砥
⠭  .   㬥 ᯮ,    ࠭
०  믮   㭪樨     .     ணࠬ  
 , ⮡  ।, ᫥       ࠭,
    믮   㣨   ⢨.  ᪮    襬   ਬ
VioScrLock() ᯮ  ०  ,    㦥.

    ⨩ 㬥 - VIO handle,  ᥣ ⠭  0.

      ஦   ࠡ  ⮩ 㭪樥.   ࠭
, ४祭 ᥠᮢ 饭. ணࠬ  䮭   ᥠᮢ
 믮,    짮⥫        㯠.  
⮬,  ⮡  ६,     祭  ண   ࠭  ,   뫮
.

     ᫥⢨  ᯮ짮 VioScrLock()   
⮫ ᪨,   ⥬ ।ᬮ७    ᠬ
  ⮬  砥,     ࠭      ⥫쭮  ६. ᫨  
⮬ ࠭ 짮⥫   [Ctrl][Esc], ⮡   ४
 㣮 ᥠ, OS/2   殢 ࢥ ⨢ ᥠ  믮
४祭 ᫥  ண    (⠭⭮ -  30   ᥪ㭤).
ন  ࠭  㤥 ﭮ,   ᫨ ணࠬ    
  ࠡ⠫.

                            㭪 VioScrUnLock()
                            ----------------------

     砭    䨧᪨  ࠭, ணࠬ   
  ᢮,     ࠧ   ४祭 ᥠᮢ.   
  㭪 VioScrUnLock().

             VioScrUnLock() - ᢮ 䨧᪨  ࠭
             ---------------------------------------------------
Ŀ
   VioScrUnLock(VioHandle);                                         
   unsigned short VioHandle;            /* VioHandle, ᥣ 0 */   

    ⢥ 㬥  ⮩ 㭪樨  - VIO  handle,  ᥣ
    ࠢ 0.

     ந,    ᫥ ᢮ ࠭   VioScrUnLock()
짮- ⥫  ४  㣮 ᥠ? ணࠬ, ࠡ饩  
⥪⮢  ०, ⠪,   physic.c   㤥   稭 
।, .. 䨧᪨   । ४祭  ᪮   .
᪮   ᪮ ०   ᯮ,     
 ணࠬ  ᫥ ४祭   㣮  ᥠ 室  ᮤন
䨧᪮  㤥 ﭮ,    ࠭    .
᪮  㢨,    ⮩ ஡.


          䨧᪨ ஬  ᪮ ०
        -----------------------------------------------------

     稫  뢮 ᨬ  䨧᪨  . ᬮਬ
⥯,     ⮨         䨪.       ணࠬ
訢  ࠭    梥,  ᫥ ᥪ㭤   
         :     ਧ⠫  ⨪,  
  -        .     ⨭ ⮡ࠦ  
祭     ᥪ㭤,    ணࠬ   稢. ᫥ 砭
ணࠬ ⥬ ⠭ ᫥    ࠭ CMD.EXE, 
ᮧ ࠦ ய.

     ਬ  ᯮ    CGA   ०  4 (梥⭠
    ࠧ襭  320    200  ᥫ).        梥
室  ⢥  2  ,      ᮤন  ᮮ⢥
ଠ      ᥫ.    ᯮ- 짮 CGA- 
᪮ ०  ப  ᯮ  ᫥⥫쭮
  B8000,     BA000.

       ணࠬ,          ।,   ᯮ     㭪
VioGetPhysBuf()    祭  ᥫ   ࠭,  VioScrLock() 
஢ન  ⮣,    ணࠬ  室    ⨢   ᥠ, 
VioUnScrLock(),  ⮡    ४祭  ᥠᮢ    ६
ᮧ ࠦ.

    砫 ࠡ ணࠬ   ⠭ 㦭 ०  ᯫ.
 - 楤 믮 㭪 VioSetMode(), ᠭ   3.


    /* graphic.c */
    /*   䨧᪨  ᯫ  ᪮ ० */
    #define INCL_DOS
    #define INCL_SUB
    #include <os2.h>
    #define HANDLE   0                /* vio handle, ᥣ 0 */
    #define WAIT     1                /* ,  ࠭ 㯥 */
    #define CYAN     0x01             /* 梥  */
    #define MAGENTA  0x02             /*   */
    #define BLACK    0x00             /*   CGA     */
    #define BUFSIZE  12               /* ࠧ   _VIOMODEINFO */
    #define BYTES    40               /*   ப/2 */

    unsigned char far *ptr0;          /* 㪠⥫ 䨧᪮  */

    main()
    {
      struct  _VIOPHYSBUF  phys;       /*  䨧᪮  */
      struct  _VIOMODEINFO moda;       /*  ० */
      unsigned far *ptr;               /* 㪠⥫ 䨧᪮  */
      char status;                     /*  VioScrLock() */
      int byte;                        /*    */
      int x;                           /* ਧ⠫쭠 न */
      unsigned rc;                     /*   */

                                       /* 砫  EGA */
      phys.pBuf = (unsigned char far *) 0xB8000;
      phys.cb   = 16384;               /* : 320  200, 4 梥 */

      moda.cb     = BUFSIZE;
      moda.fbType =       3;
      moda.color  =       2;
      moda.col    =      40;
      moda.row    =      25;
      moda.hres   =     320;
      moda.vres   =     200;
      if( rc=VioSetMode( &moda, HANDLE ) )
        { printf("VioSetMode error=%u",rc); exit(1); }

                                    /*  ᥫ 䨧᪮  */
      if( rc=VioGetPhysBuf( &phys, 0 ) )
        { printf("VioGetPhysBuf error=%u",rc); exit(1); }

                                  /* ᮧ 㪠⥫  䨧᪮  */
      ptr0 = (unsigned far *)( (unsigned long)phys.asel[0]<<16);
                                        /*  ࠭ */

      if( rc=VioScrLock( WAIT, &status, HANDLE ) )
        { printf("VioScrLock error=%u",rc); exit(1); }
                                        /* 訢 ࠭   梥 */
      for( byte=0; byte<8000; byte++) { /*    */
        *(ptr0+byte)      = 0xFF;       /*    */
        *(ptr0+byte+8192) = 0xFF;       /* ன   */
      }
      DosSleep( 2000L );                /* ᫠ 梥⮬ */

      for(x=0; x<200; x++)  {           /* 㥬   */
        putpt( x, x, CYAN );            /*  */
        putpt( x, 199-x, MAGENTA );     /*  */
        putpt( x, 100, BLACK );         /* ਧ⠫ */
        putpt( 100, x, BLACK );         /* ⨪ */
      }
      DosSleep( 3000L );                /* 楧॥ ⨭ */

                                        /* ⯥ ࠭ */
      if( rc=VioScrUnLock( HANDLE ) )
        { printf("VioUnScrLock error=%u",rc); exit(1); }
      exit(0);
    }

    /* putpt() */
    /* ⮡ࠦ ᥫ ( )  ࠭ */
    putpt(col, row, pixel)              /* न */
    int col, row;                       /*    梥   */
    unsigned char pixel;                /*  ᥫ   */
    {
       int addr;                        /*  ᬥ饭 */
       int j;                           /* 稪 ᤢ */
       int shift;                       /*   ᤢ ᥫ */
       int mask = 0xFF3F;               /* ᪠ 䮭 */
       unsigned char temp;              /*  ࠭ ଠ樨 */

       addr = row*BYTES + (col>>2);     /*   ᬥ饭 */
       if(row & 1)                      /* ᫨ ⭠ ப,   */
         addr += 8152;                  /*     */
       pixel<<= 6;                      /*    ᥫ */
       shift = col & 0x03;              /* 稭 ᤢ */

       for(j=0; j<shift; j++)  {        /* ᤢ   ᥫ */
         mask  >>= 2;                   /* ࠢ,  shift  ࠧ */
         pixel >>= 2;
       }                                 /*  ⥪饥 祭  */
       temp = *(ptr0+addr) & (char)mask; /* AND - ᭨  ᥫ */
       *(ptr0+addr) = temp | pixel;      /* OR  -     ᥫ */
    }


    㭪  putpt()   뢮 ᥫ   ࠭.    室 
न  ᥫ      梥.    (   ⢮ 2 )
।  ⠡ :


    筮 祭      ⭠筮 祭        
    ----------------------------------------------------------------
           00                         0x00                  
           01                         0x01                  㡮
           02                         0x02                  
           03                         0x03                  



     ணࠬ ﭭ  頥   putpt() ,   
   .

    ࠭  訢      梥   ﬨ   ᥫ
(..   梥 ᮮ⢥  筮 祭  11,    
  ᯫ    0xFF  ਢ   ४訢  ࠧ 
ᥫ).  ⮬  横 ६  ᮤন 
⥩  ,  㦠    ࠭  ᮮ⢥⢥    
 ப .


                                   
         ---------------------------------------------------

    ᫥  ࠧ஢  ࠭ 㭪樥   VioUnScrLock() ᪮
ࠦ- , ᮧ ணࠬ, ⠥  "ਪ᭮"
   - ﭮ.  㤥  ᯮ祭  ४祭  ࠭
    砥  뤠    -  ࠭  ᯫ뢠饣   ணࠬ 
䮭   ᥠ. ⥬  祣   ।ਭ   ࠭
ᮤন ࠭, ..  ॡ  ஬ 室 .

    ⮡   㡥   ⮩   쪮   ⨭,    ணࠬ
graphic.c .         ⥫ ,  ।뢠騩 
      । 室.     ணࠬ   
६    ࣠        (᫥      )
⨢    ᮢ,     [Ctrl][Esc].  ⥬   ᭮
४    graphic.c ,    㢨,   祭 ⨭
  室⢠  ०.

        ਪ  ணࠬ   ९⢮   㭨⮦
ᮧ  ࠭ ?   - ,    ᫥   ,
  ⪠ ४祭  ᥠᮢ,  ࠭   ᮤন
࠭  ७ .  㦭  ६ (筮,   ணࠬ
   ४砥     ⨢  ᥠ)  ࠦ     
⠭.

    㭪  VioSavReDrawWait()  ᯮ  ।  
६,  室 ࠭  ⠭ ࠭. 筮, 
⮩ 楫 ࣠ ⤥  . 㣨     ࠫ쭮
뢠 ࠬ  ࠦ   믮    ,
     ᮬ  䨧᪮   ࠭.  ⠪  室
ਬ  ᫥饩 祡 ணࠬ.

      ਬ    䠪  쬠  宦     graphic.c  .   ࠭
  筮  ⠪  .      ,  ᫥  맮 
ᮢ    ᫥饣       ணࠬ,  ﭨ   ࠭
⠭.

    ࠢ  ࠭   ⠭ ࠦ  뤥 
⤥  SaveReDraw().    稭   믮   㭪樨
VioSavReDrawWait(),       쭥   ࠡ  
  ⪨   ४祭  ᥠᮢ.      ந室
ࠧ஢  SaveReDraw(),     ᮤন   ࠭   ࠭  
ணࠬ    .          ᭮  ࠥ    㭪樥
VioSavReDrawWait().    ⥯   ᫥   ,   㦭
⠭  ࠦ.  ᫥  ⠭  ࠭   ࠢ
।    砫  .    -࠭--⠭
,    室.  室    ணࠬ   ந室 
⨨      .     㭪  13-5   ਢ  -奬
ணࠬ.


   Ŀ
   믮 VioGetPhysBuf()
        㪠⥫   
   
                
   Ŀ
        ࠭    
        VioScrLock()  
   
                
   Ŀ
          ࠭    
                      Ŀ
                                       Ŀ   
   Ŀ          VioSavReDrawWait()   
     ⮢    ----------   㪠     
              ࠭  ࠭    
                                          
   Ŀ                                
    ஢ ࠭ ਲ਼          Ŀ   
      VioUnScrLock()             ࠭  ࠭    
                
                                                             
   Ŀ          Ŀ   
     த 믮            VioSavReDrawWait()   
                㪠     
                                        ⠭ ࠭   
                                           
                                                              
                                        Ŀ   
                                        ⠭ ࠭   
                                           
                                                 


            13-5. -奬 ணࠬ  redraw.c


    /* redraw.c */
    /* ⮬᪮ ࠭ ࠧ ࠭ */
    #define INCL_DOS
    #define INCL_SUB
    #include <os2.h>
    #include <malloc.h>               /*  malloc() */
    #define HANDLE   0                /* vio handle, ᥣ 0 */
    #define WAIT     1                /* ,  ࠭ 㯥 */
    #define CYAN     0x01             /* 梥  */
    #define MAGENTA  0x02             /*   */
    #define BLACK    0x00             /*   CGA     */
    #define BUFSIZE  12               /* ࠧ   _VIOMODEINFO */
    #define BYTES    40               /*   ப/2 */
    #define STACK_SIZE 1024           /* ࠧ ⥪    */

    unsigned char store[1684]         /*   ࠭ ࠦ */
    unsigned char far *ptr0;          /* 㪠⥫ 䨧᪮  */

    main()
    {
      struct  _VIOPHYSBUF  phys;       /*  䨧᪮  */
      struct  _VIOMODEINFO moda;       /*  ० */
      char status;                     /*  VioScrLock() */
      int byte;                        /*    */
      int x;                           /* ਧ⠫쭠 न */
      char far *stkptr;                /* 㪠⥫ ⥪    */
      void far SaveReDraw();           /* ⨯   */
      unsigned treadID;                /* 䨪樮   */
      unsigned rc;                     /*   */

                                       /* 砫  EGA */
      phys.pBuf = (unsigned char far *) 0xB8000;
      phys.cb   = 16384;               /* : 320  200, 4 梥 */

      moda.cb     = BUFSIZE;
      moda.fbType =       3;
      moda.color  =       2;
      moda.col    =      40;
      moda.row    =      25;
      moda.hres   =     320;
      moda.vres   =     200;
      if( rc=VioSetMode( &moda, HANDLE ) )
        { printf("VioSetMode error=%u",rc); exit(1); }

                                  /*  ᥫ 䨧᪮  */
      if( rc=VioGetPhysBuf( &phys, 0 ) )
        { printf("VioGetPhysBuf error=%u",rc); exit(1); }

                                  /* ᮧ 㪠⥫  䨧᪮  */
      ptr0 = (unsigned far *)( (unsigned long)phys.asel[0]<<16);

                                        /*  ࠭ */
      if( rc=VioScrLock( WAIT, &status, HANDLE ) )
        { printf("VioScrLock error=%u",rc); exit(1); }
                                        /* 訢 ࠭   梥 */
      for( byte=0; byte<8000; byte++) { /*    */
        *(ptr0+byte)      = 0xFF;       /*    */
        *(ptr0+byte+8192) = 0xFF;       /* ன   */
      }

      for(x=0; x<200; x++)  {           /* 㥬   */
        putpt( x, x, CYAN );            /*  */
        putpt( x, 199-x, MAGENTA );     /*  */
        putpt( x, 100, BLACK );         /* ਧ⠫ */
        putpt( 100, x, BLACK );         /* ⨪ */
      }
                                  /* 砫 ⢨ ࠭-⠭ */
                                  /* 뤥   ⥪ */
      stkptr = (char far *)malloc(STACK_SIZE) + STACK_SIZE;
                                  /*    */
      if( rc=DosCreateTread( SaveReDraw, &threadID, stkptr) )
        { printf("DosCreateThread error=%d\n",rc); exit(1); }

                                        /* ⯥ ࠭ */
      if( rc=VioScrUnLock( HANDLE ) )
        { printf("VioUnScrLock error=%u",rc); exit(1); }

      while( !kbhit() );                /* 横    */
      getche();                         /*  ᨬ */
      exit(0);
    }

    /* putpt() */
    /* ⮡ࠦ ᥫ ( )  ࠭ */
    putpt(col, row, pixel)              /* न */
    int col, row;                       /*    梥   */
    unsigned char pixel;                /*  ᥫ   */
    {
       int addr;                        /*  ᬥ饭 */
       int j;                           /* 稪 ᤢ */
       int shift;                       /*   ᤢ ᥫ */
       int mask = 0xFF3F;               /* ᪠ 䮭 */
       unsigned char temp;              /*  ࠭ ଠ樨 */

       addr = row*BYTES + (col>>2);     /*   ᬥ饭 */
       if(row & 1)                      /* ᫨ ⭠ ப,   */
         addr += 8152;                  /*     */
       pixel<<= 6;                      /*    ᥫ */
       shift = col & 0x03;              /* 稭 ᤢ */

       for(j=0; j<shift; j++)  {        /* ᤢ   ᥫ */
         mask  >>= 2;                   /* ࠢ,  shift  ࠧ */
         pixel >>= 2;
       }                                 /*  ⥪饥 祭  */
       temp = *(ptr0+addr) & (char)mask; /* AND - ᭨  ᥫ */
       *(ptr0+addr) = temp | pixel;      /* OR  -     ᥫ */
    }
    /* SaveReDraw() */
    /* , ࠢ ࠭  ⠭ */
    void far SaveReDraw()
    {
      struct  _VIOMODEINFO moda;       /*  ० */
      unsigned Index = 0;              /* 0 = ࠭  ⠭ */
      unsigned Notify;                 /* 頥  ⢨ */
      unsigned byte;                   /*    */
      unsigned rc;                     /*   */

      while(TRUE)  {
        if( rc=VioSavReDrawWait( Index, &Notify, 0 ) )
          { printf("VioSavReDrawWait error=%u",rc); exit(1); }

        if(Notify==0 )  {               /* ᫨ "࠭" */
          for( byte=0; byte<8000; byte++)  {      /*    */
            store[byte] = *(ptr0+byte);           /*    */
            store[byte+8192] = *(ptr0+byte+8192); /* ன   */
          }                             /*   for */
        }                               /*   if  */
                                        /* ᫨ "࠭" */
        else if(Notify==1 )  {
          moda.cb     = BUFSIZE;        /*                        */
          moda.fbType =       3;        /* CGA, ᪨ ० */
          moda.color  =       2;
          moda.col    =      40;
          moda.row    =      25;
          moda.hres   =     320;
          moda.vres   =     200;
          if( rc=VioSetMode( &moda, HANDLE ) )
            { printf("VioSetMode error=%u",rc); exit(1); }

                                        /* ⠭ ࠦ */
          for( byte=0; byte<8000; byte++)  {      /*    */
            *(ptr0+byte) = store[byte];           /*    */
            *(ptr0+byte+8192) = store[byte+8192]; /* ன   */
          }                             /*   for */
        }                               /*   end-if  */
      }                                 /*   while(1) */
    }


                          㭪 VioSavReDrawWait()
                          --------------------------

        ⮩ 㭪樨  㬥.

       VioSavReDrawWait -  ࠭  ⠭ ࠭
       ---------------------------------------------------------------
Ŀ
   VioSavReDrawWait(Indicator, ANotify, Reserved);               
   unsigned Indicator;    /* 0=./., 1=⮫쪮 . */  
   unsigned far *ANotify;        /*   ⢨      */  
   unsigned Reserved;            /* १ࢨ, ᥣ 0  */  

       㬥  -     -  ⠭    ਪ
ணࠬ.       ।,       㯫       権
VioSavReDrawWait()     ନ஢.  祭    ,
ࠢ 0,  ।뢠  VioSavReDrawWait()  ᫥    ,
  㦭 ࠭  ⠭ ࠭,  祭, ࠢ 1 -
⮫쪮  ,   ॡ   ⠭ .   襩 ண-
ࠬ      ࠭塞     ⠭  ᮤন   䨧᪮
, ⮬ 뢠   0.

    ன  㬥   -       頥   㭪樥  ,
㪠뢠饣,     ⢨    室  ।ਭ  ணࠬ.
祭   notify  ᫥騥 :

      祭                                                ⢨
     -----------------------------------------------------------------
         0                 ࠭      ࠭, ॣ,  
	 ﭨ 1              ⠭  ࠭, ॣ,
	  ﭨ

     襬  ਬ   ࠭塞  ࠭,  ᫨  notify =  0, 
⠭ , ᫨  notify = 1.

      ४祭  ᥠᮢ  ⥬  ॢ ᯫ  ⥪⮢
०, ଠ  ० ०   . ⮬, ०,   祬
⠭  ࠦ,    ணࠬ     ⠭    
᪨ ० ࠡ CGA-,  ஬  뫮 ᮧ.

            뢠         ࠦ
     ॣ  ᪮   .      
᫥⢨      ⠭   ﭨ  ᯫ.  ,
  ॣ  EGA-     ⮫쪮  ,   ⮬
㪠 ⮤    ᥣ.

     襩 ணࠬ   ࠭﫨 ࠦ  ⤥쭮  , 
⥬ - ⠭       ⮬. 㣮  室,
     ।  ⥫⢠    뢠   ॥,
⮨  ⮬, ⮡ ᮧ ࠦ   .  ਬ,    襬
砥,    ࠭  ᫥饣  ⠭ 
 뫮    ࠭   梥  ᮢ  .
  ᯮᮡ     ⭮ 砥,    ᫮
ࠦ  ᮡ ணࠬ.


                               
                      -------------------

    ࢠ ⥬,  ᬮ७   ⮩ ,  ᠥ . 㭪
MouOpen() 뢠  ࠩ ன⢠   頥  handle. 㭪
MouClose() 뢠 ࠩ . 㭪 MouDrawPtr()  ⠭
      㪠⥫,  ⠪ 㦨   ⠭
"⠭"  㪠⥫.   ଠ     ﭨ     (
ﭨ  )        祭       㭪-   樨
MouReadEventQue().

     㪠⥫ ⠭  㭪樥 MouSetPtrPos(),   ᠬ
㪠⥫                 ࠭   㭪樥
MouRemovePtr(). ਢ ਬ ணࠬ, 騩 ࠡ  
, ࠢ塞 .

       ⥬ ᠥ   אַ 㯠     .  
ᥠ  ᢮ ᪨    (),  ஬  ࠭
ᮤন ࠭  ४祭  ᥠᮢ.  ᯮ ⮫쪮 
⥪⮢ ०,     ᯥ稢 㭪樥 VioGetBuf().
ন     ⮬᪨     뢮  ᯫ.   ⮣,
⮡   ᫠    䨧᪨      ᤥ ,  㦭
ᯮ짮 㭪樥 VioShowBuf().

    㭪   VioGetPhysBuf()   ᯥ稢        䨧᪮
, 易  ।⢥  ன ᯫ.  ।
⥬,              ,   㦭      ࠭,
ᯮ짮  㭪樥    VioScrLock().    ᫥  ⮣    
ணࠬ   䮭 ᥠ        䨧᪨ , 
饭  ४祭  ᥠᮢ. VioUnScrLock()  ࠧ  ࠭,
 ணࠬ  稢 ࠡ   .   䨧᪨   
 -   ᨬ, ⠪  ᪨ ࠦ.

    ᪮   ⥬    ࠭   ᪮   ࠦ 
४祭 ࠭, ணࠬ   易    ᠬ.   ⮣
᫥   ᯮ짮    㭪樥   VioSavReDrawWait(),    
᫥ ,   室 ࠭    ⠭
ᮤন 䨧᪮ .