home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 March / VPR9703A.ISO / VPR_DATA / DOGA / SOURCES / REND.LZH / REND / BG.C < prev    next >
C/C++ Source or Header  |  1990-04-07  |  3KB  |  182 lines

  1. #include <stdio.h>
  2. #include "bg.h"
  3.  
  4. #asm
  5.  
  6.     .offset 8
  7. name    ds.l    1
  8.         ds.w    1
  9. mode    ds.w    1
  10. uspbuf    ds.l    1
  11. sspbuf    ds.l    1
  12. exec    ds.l    1
  13. combuf    ds.l    1
  14. sleep    ds.l    1
  15.  
  16.     .offset 8
  17.         ds.w    1
  18. id        ds.w    1
  19. buffer    ds.l    1
  20.  
  21.     .offset 8
  22. time    ds.l    1
  23.  
  24.     .offset 8
  25.         ds.w    1
  26. cont    ds.w    1
  27.         ds.w    1
  28. proid    ds.w    1
  29.         ds.w    1
  30. senddata ds.w    1
  31. sendbuf ds.l    1
  32. bufsize ds.l    1
  33.  
  34. #endasm
  35.  
  36. /*    バックグラウンドプロセスをスレッドに登録する。      */
  37. int        bg_set( name, mode, uspbuf, sspbuf, exec, combuf, sleep )
  38. char    *name ;
  39. int        mode ;
  40. char    *uspbuf, *sspbuf, *exec ;
  41. struct    COMBUF    *combuf ;
  42. int        sleep ;
  43. {
  44. #asm
  45.  
  46.     move.l    sleep(a6),-(sp)
  47.     move.l    combuf(a6),-(sp)
  48.     move.l    exec(a6),-(sp)
  49.     move    sr,-(sp)
  50.     move.l    sspbuf(a6),-(sp)
  51.     move.l    uspbuf(a6),-(sp)
  52.     move.w    mode(a6),-(sp)
  53.     move.l    name(a6),-(sp)
  54.     dc.w    $FFF8
  55.     lea        28(sp),sp
  56.  
  57. #endasm
  58. }
  59.  
  60. /*    バックグラウンドプロセスを終了する。    */
  61. void    bg_kill()
  62. {
  63. #asm
  64.  
  65.     dc.w    $FFF9
  66.     move.l    #$10000,d0
  67. loop1:
  68.     move.l    d0,d1
  69.     bra        loop1
  70.  
  71. #endasm
  72. }
  73.  
  74. /*    バックグラウンドプロセスの情報を得る    */
  75. int        bg_get( id, buffer )
  76. int        id ;
  77. struct    PROCESS *buffer ;
  78. {
  79. #asm
  80.  
  81.     move.l    buffer(a6),-(sp)
  82.     move.w    id(a6),-(sp)
  83.     dc.w    $FFFA
  84.     addq.l    #6,sp
  85.  
  86. #endasm
  87. }
  88.  
  89. /*
  90.     常駐終了する。
  91.         flag    0 : スタック、ヒープ領域を残さない。
  92.                 1 : スタック、ヒープ領域を残す。
  93. */
  94. void    keepexit( flag, code )
  95. int        flag ;
  96. int        code ;
  97. {
  98.     extern    int        _PSP, _HEND, _SSTA ;
  99.  
  100.     if ( flag )
  101.         KEEPPR( _HEND - _PSP + 0x10, code );
  102.     else
  103.         KEEPPR( _SSTA - _PSP + 0x10, code );
  104. }
  105.  
  106. /*    バックグラウンドプロセスをスリープさせる。    */
  107. int        bg_sleep( id )
  108. int        id ;
  109. {
  110. #asm
  111.  
  112.     move.w    id(a6),-(sp)
  113.     dc.w    $FFFB
  114.     addq.l    #2,sp
  115.  
  116. #endasm
  117. }
  118.  
  119. /*    スリープタイムを指定してスリープモードに入る。      */
  120. int        bg_sleeptime( time )
  121. int        time ;
  122. {
  123. #asm
  124.  
  125.     move.l    time(a6),-(sp)
  126.     dc.w    $FFFC
  127.     addq.l    #4,sp
  128.  
  129. #endasm
  130. }
  131.  
  132. /*    データを送信する。    */
  133. int        bg_send( cont, proid, senddata, sendbuf, bufsize )
  134. int        cont, proid, senddata ;
  135. char    *sendbuf ;
  136. int        bufsize ;
  137. {
  138. #asm
  139.  
  140.     move.l    bufsize(a6),-(sp)
  141.     move.l    sendbuf(a6),-(sp)
  142.     move.w    senddata(a6),-(sp)
  143.     move.w    proid(a6),-(sp)
  144.     move.w    cont(a6),-(sp)
  145.     dc.w    $FFFD
  146.     lea        14(sp),sp
  147.  
  148. #endasm
  149. }
  150.  
  151. /*    カウンターの値を返す。    */
  152. int        bg_counter()
  153. {
  154. #asm
  155.  
  156.     dc.w    $FFFE
  157.  
  158. #endasm
  159. }
  160.  
  161. /*    通信を受けてバックグラウンドプロセスを終了する。  */
  162. void    bg_check_kill( combuf, msg )
  163. struct    COMBUF    *combuf ;
  164. char    *msg ;
  165. {
  166.     if ( combuf->flag != 0xFFFF )
  167.     {
  168.         /*    受信    */
  169.         if ( combuf->data == 0xFFF9 || combuf->data == 0xFFFF )
  170.         {
  171.             /*    KILL    */
  172.             if ( msg != NULL )
  173.             {
  174.                 cputs( msg );
  175.                 cputs( "\xa\xd" );
  176.             }
  177.             bg_kill();
  178.         }
  179.         combuf->flag = 0xFFFF ;
  180.     }
  181. }
  182.