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 >
Wrap
C/C++ Source or Header
|
1990-04-07
|
3KB
|
182 lines
#include <stdio.h>
#include "bg.h"
#asm
.offset 8
name ds.l 1
ds.w 1
mode ds.w 1
uspbuf ds.l 1
sspbuf ds.l 1
exec ds.l 1
combuf ds.l 1
sleep ds.l 1
.offset 8
ds.w 1
id ds.w 1
buffer ds.l 1
.offset 8
time ds.l 1
.offset 8
ds.w 1
cont ds.w 1
ds.w 1
proid ds.w 1
ds.w 1
senddata ds.w 1
sendbuf ds.l 1
bufsize ds.l 1
#endasm
/* バックグラウンドプロセスをスレッドに登録する。 */
int bg_set( name, mode, uspbuf, sspbuf, exec, combuf, sleep )
char *name ;
int mode ;
char *uspbuf, *sspbuf, *exec ;
struct COMBUF *combuf ;
int sleep ;
{
#asm
move.l sleep(a6),-(sp)
move.l combuf(a6),-(sp)
move.l exec(a6),-(sp)
move sr,-(sp)
move.l sspbuf(a6),-(sp)
move.l uspbuf(a6),-(sp)
move.w mode(a6),-(sp)
move.l name(a6),-(sp)
dc.w $FFF8
lea 28(sp),sp
#endasm
}
/* バックグラウンドプロセスを終了する。 */
void bg_kill()
{
#asm
dc.w $FFF9
move.l #$10000,d0
loop1:
move.l d0,d1
bra loop1
#endasm
}
/* バックグラウンドプロセスの情報を得る */
int bg_get( id, buffer )
int id ;
struct PROCESS *buffer ;
{
#asm
move.l buffer(a6),-(sp)
move.w id(a6),-(sp)
dc.w $FFFA
addq.l #6,sp
#endasm
}
/*
常駐終了する。
flag 0 : スタック、ヒープ領域を残さない。
1 : スタック、ヒープ領域を残す。
*/
void keepexit( flag, code )
int flag ;
int code ;
{
extern int _PSP, _HEND, _SSTA ;
if ( flag )
KEEPPR( _HEND - _PSP + 0x10, code );
else
KEEPPR( _SSTA - _PSP + 0x10, code );
}
/* バックグラウンドプロセスをスリープさせる。 */
int bg_sleep( id )
int id ;
{
#asm
move.w id(a6),-(sp)
dc.w $FFFB
addq.l #2,sp
#endasm
}
/* スリープタイムを指定してスリープモードに入る。 */
int bg_sleeptime( time )
int time ;
{
#asm
move.l time(a6),-(sp)
dc.w $FFFC
addq.l #4,sp
#endasm
}
/* データを送信する。 */
int bg_send( cont, proid, senddata, sendbuf, bufsize )
int cont, proid, senddata ;
char *sendbuf ;
int bufsize ;
{
#asm
move.l bufsize(a6),-(sp)
move.l sendbuf(a6),-(sp)
move.w senddata(a6),-(sp)
move.w proid(a6),-(sp)
move.w cont(a6),-(sp)
dc.w $FFFD
lea 14(sp),sp
#endasm
}
/* カウンターの値を返す。 */
int bg_counter()
{
#asm
dc.w $FFFE
#endasm
}
/* 通信を受けてバックグラウンドプロセスを終了する。 */
void bg_check_kill( combuf, msg )
struct COMBUF *combuf ;
char *msg ;
{
if ( combuf->flag != 0xFFFF )
{
/* 受信 */
if ( combuf->data == 0xFFF9 || combuf->data == 0xFFFF )
{
/* KILL */
if ( msg != NULL )
{
cputs( msg );
cputs( "\xa\xd" );
}
bg_kill();
}
combuf->flag = 0xFFFF ;
}
}