byte huge *getdump (long *size,void (* func)(double)) /*********** * Describe : принять дамп памяти прибора в память ЭВМ * Params : word *size - размер принятых данных (в байтах), меньше чем * : размер выделенной памяти, так как он выровнен * : на границу 1024 байта * : PFV func - функция для отображения считывания, ей * : передаем процент считанной информации * Return : byte huge* - указатель на буфер, куда записаны данные * Call : input,waitstart,setaddr,getKbyte,bioscom ***********/ { /* i-текущий адрес */ unsigned long volume,i_long; uint i=0,Imax=1024; /* Imax-макс. адрес */ byte empty,bufer[1024]; /* */ int err=0,rpt=0; /* */ byte huge *ppm=NULL,huge *cur=NULL; /* указатель на буфер */ // считываем базовый адрес порта base_addr = *((unsigned far *)((unsigned far *)0x00400000L+connect_port)); if (base_addr==0) // СОМ1 в 40:00 СОМ2 в 42:00 {printf("\nCOM-%d is absent!",connect_port); return 0; } // bioscom (0,SETTINGS,connect_port); /* инициализируем COM */ outportb (base_addr+3,0x83); // 8byt 1stop N outportb (base_addr,12); // скорость обмена 115200/12=9600 outportb (base_addr+1,0); outportb (base_addr+3,0x03); // конец установки скорости empty = inportb (base_addr+4); outportb (base_addr+4,0); // Запрет прерывания от порта for (i_long=0L;i_long<Imax;i_long+=512L,cur=(byte huge *)cur+1024,i=(uint)i_long) { if (func!=NULL) /* */ func ((double)((double)i_long/(double)Imax)); /* рисуем прогресс */ sleep (1); do /* */ { /* */ setaddr(i); /* посылаем адрес начала */ err=waitstart(); /* ждем строки "STRT" */ if (err==0) /* если не ошибка то */ err=input(&empty); /* принимаем пустой байт */ if (err==0) /* если не ошибка и если */ if (i==0) /* первый Кбайт то */ err=getKbyte(bufer); /* принимаем в буфер */ else /* иначе */ { err=getKbyte(cur); /* принимаем в назначение */ if (*bufer!=*ppm) { printf ("\n There is problem, count = %u",(uint)i); abort (); } } if (err != 0) /* если ошибка */ { /* */ rpt++; /* число повторов */ if (rpt>REPEATS) /* */ { /* */ if (ppm!=NULL) /* освобождаем память */ farfree ((byte far *)ppm); /* если выделена */ printf("\nCommunication ERROR %X",(unsigned)err); return (NULL); /* возвращаем ошибка */ } /* */ } /* */ } /* */ while (err!=0); /* */ /* */ if (i==0) /* если первый Кбайт */ { /* то */ Imax = (uint)bufer[8]+bufer[9]*256; /* вычисляем Imax */ *size = (long)Imax*2L; /* размер в байтах */ volume = (unsigned long)(*size)+1024; /* выделяем 128 Кбайт */ ppm=(byte huge*) farcalloc(volume,sizeof(byte));/* выделяем память */ cur = ppm; if (ppm==NULL) { printf ("\n Imax = %u, size = %ld",Imax,(*size)); printf ("\n No enough memory! Function GETDUMP. "); printf ("\n %ul bytes free. ",farcoreleft()); abort (); } reportmemory(getmaxx(),getmaxy()-textheight("X")-5); memcpy ((byte *)ppm,bufer,1024); /* копируем из буфера */ } /* */ } /* */ if (func!=NULL) /* */ func ((double)1.0); /* рисуем прогресс */ return ((byte huge*) ppm); /* */ } /* */
void Game:: login (char * nick, char * mode, int num) { setnick (nick); if ( strcmp (mode, "create") == 0) { create (); waitplayers (num); } else if ( strcmp (mode, "join") == 0) { joinroom (num); waitstart (); } else { printf ("Error in check mode. [ %s ].\n", mode ); exit (EXIT_FAILURE); } startinfo (); market (); }
/* * grind - memory-bound task * * Note that this won't work until you have a VM system. */ void grind(unsigned groupid, unsigned id) { unsigned *p; unsigned i, n, s; (void)groupid; waitstart(); /* each grind task uses 768K */ n = (768*1024) / sizeof(*p); p = malloc(n * sizeof(*p)); if (p == NULL) { if (errno == ENOSYS) { /* * If we don't have sbrk, just bail out with * "success" instead of failing the whole * workload. */ errx(0, "grind: sbrk/malloc not implemented"); } err(1, "malloc"); } /* First, get some random integers. */ warnx("grind %u: seeding", id); srandom(1753); for (i=0; i<n; i++) { p[i] = random(); } /* Now sort them. */ warnx("grind %u: sorting", id); qsort(p, n, sizeof(p[0]), uintcmp); /* Sort by a different comparison. */ warnx("grind %u: sorting alternately", id); qsort(p, n, sizeof(p[0]), altcmp); /* Take the sum. */ warnx("grind %u: summing", id); s = sum(p, n); warnx("grind %u: sum is %u (should be %u)", id, s, RIGHT); if (s != RIGHT) { errx(1, "grind %u FAILED", id); } /* Take first differences. */ warnx("grind %u: first differences", id); diffs(p, n); /* Sort. */ warnx("grind %u: sorting", id); qsort(p, n, sizeof(p[0]), uintcmp); warnx("grind %u: summing", id); s = sum(p, n); warnx("grind %u: sum is %u (should be 0)", id, s); if (s != 0) { errx(1, "grind %u FAILED", id); } }