NETBALL.C
上传用户:sunrenlu
上传日期:2022-06-13
资源大小:1419k
文件大小:4k
源码类别:

操作系统开发

开发平台:

DOS

  1. /*
  2.  * netball - balls bounce around - like ball.c but TELNET version
  3.  *
  4.  */
  5. #include <dos.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <rtos.h>
  9. #include <telnetd.h>
  10. #include <string.h>
  11. #define MAXBALLS 400
  12. #define SCALE 3
  13. #define RANDOMNESS 2
  14. #define MAXX ( 79 * SCALE )
  15. #define MAXY ( 24 * SCALE )
  16. typedef struct {
  17.     BYTE color;
  18.     WORD x, y;
  19.     WORD oldx, oldy;
  20.     WORD deltax, deltay;
  21.     thread_x *thread;
  22. } ball_str;
  23. ball_str balls[ MAXBALLS ];
  24. teld_str *tptr = NULL;
  25. void put_on_screen( int x, int y, WORD ch, WORD opt_attr )
  26. {
  27.     char buf[ 64 ];
  28.     static WORD far *screen = 0xb8000000;
  29.     WORD ofs;
  30.     ofs = (y/SCALE) * 80 + (x/SCALE);
  31.     screen[ ofs ] = (WORD)ch | ((WORD)opt_attr)<<8;
  32.     sprintf( buf, "%c[%u;%uH%c", 27,
  33.         (y/SCALE), (x/SCALE), ch );
  34.     teld_write( tptr, buf, strlen( buf ));
  35.     
  36. }
  37. void ball( DWORD num )
  38. {
  39.     ball_str *b;
  40.     int tempx, tempy;
  41.     b = &balls[ num ];
  42.     memset( b, 0, sizeof( ball_str ));
  43.     b->color = (num % 7) + 9;
  44.     b->oldx = b->x = MAXX / 2;
  45.     b->oldy = b->y = MAXY / 2;
  46.     b->deltax = SCALE/2 - (rand() / ( RAND_MAX/SCALE/RANDOMNESS));
  47.     b->deltay = SCALE/2 - (rand() / ( RAND_MAX/SCALE/RANDOMNESS));
  48.     /* for network version, so we can shutdown */
  49.     b->thread = kcurthread;
  50.     do {
  51.         /* get new locaton */
  52.         tempx = b->x + b->deltax;
  53.         if ( (tempx < SCALE) || ( tempx > MAXX )) {
  54.             tempx = b->x;
  55.             b->deltax = -b->deltax;
  56.         }
  57.         tempy = b->y + b->deltay;
  58.         if ( (tempy < SCALE) || ( tempy > MAXY )) {
  59.             tempy = b->y;
  60.             b->deltay = -b->deltay;
  61.         }
  62.         /* erase old and accept new */
  63.         if ( (b->oldy != b->y) || (b->oldx != b->x)) {
  64.             put_on_screen( b->oldx, b->oldy, ' ', 0 );
  65.             b->oldx = b->x;
  66.             b->oldy = b->y;
  67.         }
  68.         b->x = tempx;
  69.         b->y = tempy;
  70.         /* draw the ball */
  71.         put_on_screen( b->x, b->y, 'o', b->color );
  72.         rt_sleep( 10 );
  73.     } while ( 1 );
  74. }
  75. void telnetd_thread( DWORD max )
  76. {
  77.     teld_str *t;
  78.     int temp;
  79.     BYTE ch;
  80.     do {
  81.         t = teld_listen( 23  );
  82.         tptr = t;       /* set global variable */
  83. //        sock_mode( &t->teld_socket, TCP_MODE_NONAGLE );
  84.         /* create balls */
  85.         for ( temp = 0 ; temp < max; ++temp )
  86.             rt_newthread( &ball, temp, 1024, 0, "a ball");
  87.         do {
  88.             ch = teld_getc( t );
  89.             if ( ch == 255 ) break;
  90.             if ( ch != 0 ) putch( ch );
  91.                 teld_write( t, &ch, 1 );
  92.         } while ( 1 );
  93.         tptr = NULL;
  94.         /* destroy balls */
  95.         for ( temp = 0 ; temp < max; ++temp )
  96.             kdestroythread( balls[temp].thread );
  97.         teld_close( t );
  98.     } while ( 1 );
  99. }
  100. void help( void )
  101. {
  102.     cprintf("BALL num    where num is in the range 1 to %urn", MAXBALLS);
  103.     cputs("Actual limit is based on how much memory is availablern");
  104.     exit( 0 );
  105. }
  106. int main( int argc, char **argv )
  107. {
  108.     DWORD max;
  109.     kdebug = 1;
  110.     rt_init(100);
  111.     sock_init();            /* initialize network */
  112.     rt_timerfreq( 100 );
  113.     if ( argc < 2 ) help();
  114.     max = atoi( argv[1] );
  115.     if ( (max < 0) || (max >= MAXBALLS )) help();
  116.     cputs("starting...waiting for a TELNET connection to display ballsrn");
  117.     cputs("Press the space bar to exitrn");
  118.     rt_newthread( telnetd_thread, max, 4096, 0, "worker" );
  119.     do {
  120.         /* nothing */
  121.         rt_yield();
  122.     } while ( 1 );
  123. }