Exemplo n.º 1
0
/* -------------------------------------------------------------------- */
void doccr(void)
{ 
    unsigned char row, col;


    if (!console) return;
    if (!anyEcho) return;

    readpos( &row, &col);

    if (row == (scrollpos + 1) )
    {
        position(0,0);     /* clear screen if we hit our window */
    }

    if (row >= scrollpos)
    {
        scroll( scrollpos, 1, cfg.attr);
        position( scrollpos, 0);
    }
    else 
    {
        putch('\n');
        putch('\r');
    }
}
Exemplo n.º 2
0
void Encoder::reset(void)
{
  int i;
  for(i=0;i<NFilter;i++){
    readpos();
  }
  zeropos = rawpos;
}
Exemplo n.º 3
0
void Encoder::set(int pos)
{
  long zp;
  readpos();
  zp = (long)rawpos - pos;
  if(zp<0)zp+=(MAX_ENC_VAL+1)<<OBITS;
  zeropos = zp;
}
Exemplo n.º 4
0
int main(int argc, char *argv[])
{
  unsigned char i;
  if(argc<2)
    exit(0);
  i=(unsigned char)atoi(argv[1]);

  readpos(i);
  return;
}
Exemplo n.º 5
0
/* -------------------------------------------------------------------- */
void ctrl_c(void)
{
    uchar row, col;

    signal(SIGINT, ctrl_c);
    readpos(&row, &col);
    position(row - 1, 19);
    ungetch('\r');
    getkey = TRUE;
}
Exemplo n.º 6
0
/* -------------------------------------------------------------------- */
void outCon(char c)
{
    unsigned char row, col;
    static   char escape = FALSE;

    if (!console) return;

    if (c == 7   /* BELL */  && cfg.noBells)  return;
    if (c == 27 || escape) /* ESC || ANSI sequence */
    {
        escape = ansi(c);
        return;
    }
    if (c == 26) /* CT-Z */                   return;

    if (!anyEcho)  return;

    /* if we dont have carrier then count what goes to console */
    if (!gotCarrier()) transmitted++;

    if (c == '\n')
        doccr();
    else
    if (c == '\r')
    {
        putch(c);
    } else {
        readpos(&row, &col);
        if (c == '\b' || c == 7)
        {
          if (c == '\b' && col == 0 && prevChar != 10)
              position(row-1,80);  
          putch(c);
        } else {
            (*charattr)(c, ansiattr);
            if (col == 79)
            {
                position(row,col);
                doccr();
            }
        }
    }
}
Exemplo n.º 7
0
checkup()
{
	register int k, n, explode, sink;

	readpos();
	for (n=0; n < scene[game].vessels; n++){
		explode = scene[game].ship[n].file -> explode;
		sink = scene[game].ship[n].file -> sink;
		if (die() >= 5 && (explode == 1 || sink == 1)){
			explode = 2;
			if (sink != 1)
				Write(FILES + n, 0, 232, explode);
			else
				Write(FILES + n, 0, 234, explode);
			pos[n].dir = 0;	/* hopefully enough to kill ship */
			Write(n, 0, 10, 0);
			if (fouled(n) || grappled(n)){
				for (k=0; k < 10; k++){
					if (scene[game].ship[n].file -> fouls[k].turnfoul)
						cleanfoul(n,scene[game].ship[n].file -> fouls[k].toship,k);
				}
				for (k=0; k < 10; k++){
					if (scene[game].ship[n].file -> grapples[k].turnfoul)
						cleangrapple(n,scene[game].ship[n].file -> grapples[k].toship,k);
				}
			}
			if (sink != 1){
				makesignal("exploding!", 0, n);
				for (k=0; k < scene[game].vessels; k++)
					if (k != n && pos[k].dir && range(n,k) < 4)
						table(RIGGING, EXPLODE, specs[scene[game].ship[n].shipnum].guns/13, k, n, 6);
			}
			else {
				makesignal("sinking!", 0, n);
			}
		}
	}
}
Exemplo n.º 8
0
/*-------------------------------------------------------------------*/
int main (int argc, char *argv[])
{
char           *pgmname;                /* prog name in host format  */
char           *pgm;                    /* less any extension (.ext) */
char            msgbuf[512];            /* message build work area   */
int             cckd_diag_rc = 0;       /* Program return code       */
char           *fn;                     /* File name                 */

CKDDASD_DEVHDR  devhdr;                 /* [C]CKD device hdr         */
CCKDDASD_DEVHDR cdevhdr;                /* Compressed CKD device hdr */
CKDDEV         *ckd=0;                  /* CKD DASD table entry      */
FBADEV         *fba=0;                  /* FBA DASD table entry      */

int             cmd_devhdr = 0;         /* display DEVHDR            */
int             cmd_cdevhdr = 0;        /* display CDEVHDR           */
int             cmd_l1tab = 0;          /* display L1TAB             */
int             cmd_l2tab = 0;          /* display L2TAB             */
int             cmd_trkdata = 0;        /* display track data        */
int             cmd_hexdump = 0;        /* display track data (hex)  */

int             cmd_offset = 0;         /* 1 = display data at       */
int             op_offset = 0;          /* op_offset of length       */
int             op_length = 0;          /* op_length                 */

int             cmd_cchh = 0;           /* 1 = display CCHH data     */
int             op_cc = 0;              /* CC = cylinder             */
int             op_hh = 0;              /* HH = head                 */

int             cmd_tt = 0;             /* 1 = display TT data       */
int             op_tt = 0;              /* relative track #          */

int             swapend;                /* 1 = New endianess doesn't
                                             match machine endianess */
int             n, trk=0, l1ndx=0, l2ndx=0;
off_t           l2taboff=0;             /* offset to assoc. L2 table */
int             ckddasd;                /* 1=CKD dasd  0=FBA dasd    */
int             heads=0;                /* Heads per cylinder        */
off_t           trkhdroff=0;            /* offset to assoc. trk hdr  */
int             imglen=0;               /* track length              */
char            pathname[MAX_PATH];     /* file path in host format  */
char           *strtok_str = NULL;

    /* Set program name */
    if ( argc > 0 )
    {
        if ( strlen(argv[0]) == 0 )
        {
            pgmname = strdup( UTILITY_NAME );
        }
        else
        {
            char path[MAX_PATH];
#if defined( _MSVC_ )
            GetModuleFileName( NULL, path, MAX_PATH );
#else
            strncpy( path, argv[0], sizeof( path ) );
#endif
            pgmname = strdup(basename(path));
#if !defined( _MSVC_ )
            strncpy( path, argv[0], sizeof(path) );
#endif
        }
    }
    else
    {
        pgmname = strdup( UTILITY_NAME );
    }

    pgm = strtok_r( strdup(pgmname), ".", &strtok_str);
    INITIALIZE_UTILITY( pgmname );

    /* Display the program identification message */
    MSGBUF( msgbuf, MSG_C( HHC02499, "I", pgm, "CCKD diagnostic program" ) );
    display_version (stderr, msgbuf+10, FALSE);

    /* parse the arguments */
    argc--;
    argv++ ;
    while (argc > 0) {
        if(**argv != '-') break;

        switch(argv[0][1]) {
            case 'v':  if (argv[0][2] != '\0') return syntax (pgm);
                       return 0;
            case 'd':  if (argv[0][2] != '\0') return syntax (pgm);
                       cmd_devhdr = 1;
                       break;
            case 'c':  if (argv[0][2] != '\0') return syntax (pgm);
                       cmd_cdevhdr = 1;
                       break;
            case '1':  if (argv[0][2] != '\0') return syntax (pgm);
                       cmd_l1tab = 1;
                       break;
            case '2':  if (argv[0][2] != '\0') return syntax (pgm);
                       cmd_l2tab = 1;
                       break;
            case 'a':  if (argv[0][2] != '\0') return syntax (pgm);
                       cmd_cchh = 1;
                       argc--; argv++;
                       op_cc = offtify(*argv);
                       argc--; argv++;
                       op_hh = offtify(*argv);
                       break;
            case 'r':  if (argv[0][2] != '\0') return syntax (pgm);
                       cmd_tt = 1;
                       argc--; argv++;
                       op_tt = offtify(*argv);
                       break;
            case 'o':  if (argv[0][2] != '\0') return syntax (pgm);
                       cmd_offset = 1;
                       argc--;
                       argv++;
                       op_offset = offtify(*argv);
                       argc--;
                       argv++;
                       op_length = offtify(*argv);
                       break;
            case 't':  if (argv[0][2] != '\0') return syntax (pgm);
                       cmd_trkdata = 1;
                       break;
            case 'x':  if (argv[0][2] != '\0') return syntax (pgm);
                       cmd_hexdump = 1;
                       cmd_trkdata = 1;
                       break;
            case 'g':  if (argv[0][2] != '\0') return syntax (pgm);
                       debug = 1;
                       break;
            default:   return syntax (pgm);
        }
        argc--;
        argv++;
    }
    if (argc != 1) return syntax (pgm);
    fn = argv[0];

    /* open the file */
    hostpath(pathname, fn, sizeof(pathname));
    fd = HOPEN(pathname, O_RDONLY | O_BINARY);
    if (fd < 0) {
        fprintf(stderr,
                _("cckddiag: error opening file %s: %s\n"),
                fn, strerror(errno));
        return -1;
    }

    /*---------------------------------------------------------------*/
    /* display DEVHDR - first 512 bytes of dasd image                */
    /*---------------------------------------------------------------*/
    readpos(fd, &devhdr, 0, sizeof(devhdr));
    if (cmd_devhdr) {
        fprintf(stderr, "\nDEVHDR - %d (decimal) bytes:\n",
                (int)sizeof(devhdr));
        data_dump(&devhdr, sizeof(devhdr));
    }

    /*---------------------------------------------------------------*/
    /* Determine CKD or FBA device type                              */
    /*---------------------------------------------------------------*/
    if (memcmp(devhdr.devid, "CKD_C370", 8) == 0
       || memcmp(devhdr.devid, "CKD_S370", 8) == 0) {
        ckddasd = 1;
        ckd = dasd_lookup(DASD_CKDDEV, NULL, devhdr.devtype, 0);
        if (ckd == NULL) {
            fprintf(stderr,
                    "DASD table entry not found for devtype 0x%2.2X\n",
                    devhdr.devtype);
            clean();
            exit(5);
        }
    }
    else
        if (memcmp(devhdr.devid, "FBA_C370", 8) == 0
           || memcmp(devhdr.devid, "FBA_S370", 8) == 0) {
        ckddasd = 0;
        fba = dasd_lookup(DASD_FBADEV, NULL, devhdr.devtype, 0);
        if (fba == NULL) {
            fprintf(stderr,
                    "DASD table entry not found for "
                    "devtype 0x%2.2X\n",
                    DEFAULT_FBA_TYPE);
            clean();
            exit(6);
        }
    }
    else {
        fprintf(stderr, "incorrect header id\n");
        clean();
        return -1;
    }

    /*---------------------------------------------------------------*/
    /* Set up device characteristics                                 */
    /*---------------------------------------------------------------*/
    if (ckddasd) {
        heads = ((U32)(devhdr.heads[3]) << 24)
              | ((U32)(devhdr.heads[2]) << 16)
              | ((U32)(devhdr.heads[1]) << 8)
              | (U32)(devhdr.heads[0]);
        if (debug)
            fprintf(stderr,
                "\nHHC90000D DBG: %s device has %d heads/cylinder\n",
                ckd->name, heads);
    } 


    /*---------------------------------------------------------------*/
    /* display CDEVHDR - follows DEVHDR                              */
    /*---------------------------------------------------------------*/
    readpos(fd, &cdevhdr, CKDDASD_DEVHDR_SIZE, sizeof(cdevhdr));
    if (cmd_cdevhdr) {
        fprintf(stderr, "\nCDEVHDR - %d (decimal) bytes:\n",
                (int)sizeof(cdevhdr));
        data_dump(&cdevhdr, sizeof(cdevhdr));
    }

    /*---------------------------------------------------------------*/
    /* Find machine endian-ness                                      */
    /*---------------------------------------------------------------*/
    /* cckd_endian() returns 1 for big-endian machines               */
    swapend = (cckd_endian() !=
               ((cdevhdr.options & CCKD_BIGENDIAN) != 0));

    /*---------------------------------------------------------------*/
    /* display L1TAB - follows CDEVHDR                               */
    /*---------------------------------------------------------------*/
    /* swap numl1tab if needed */
    n = cdevhdr.numl1tab;
    if (swapend) cckd_swapend4((char *)&n);

    l1 = makbuf(n * CCKD_L1ENT_SIZE, "L1TAB");
    readpos(fd, l1, CCKD_L1TAB_POS, n * CCKD_L1ENT_SIZE);
    /* L1TAB itself is not adjusted for endian-ness                  */
    if (cmd_l1tab) {
        fprintf(stderr, "\nL1TAB - %d (0x%X) bytes:\n",
                (int)(n * CCKD_L1ENT_SIZE), (unsigned int)(n * CCKD_L1ENT_SIZE));
        data_dump(l1, n * CCKD_L1ENT_SIZE);
    }

    /*---------------------------------------------------------------*/
    /* display OFFSET, LENGTH data                                   */
    /*---------------------------------------------------------------*/
    if (cmd_offset) {
        bulk = makbuf(op_length, "BULK");
        readpos(fd, bulk, op_offset, op_length);
        fprintf(stderr,
            "\nIMAGE OFFSET %d (0x%8.8X) "
            "of length %d (0x%8.8X) bytes:\n",
            op_offset, op_offset, op_length, op_length);
        data_dump(bulk, op_length);
        free(bulk);
        bulk = NULL;
    }

    /*---------------------------------------------------------------*/
    /* FBA isn't supported here because I don't know much about FBA  */
    /*---------------------------------------------------------------*/
    if ( (!ckddasd) && ((cmd_cchh) || (cmd_tt)) ) {
        fprintf(stderr, "CCHH/reltrk not supported for FBA\n");
        clean();
        exit(3);
    }

    /*---------------------------------------------------------------*/
    /* Setup CCHH or relative track request                          */
    /*---------------------------------------------------------------*/
    if (ckddasd) {
        if (cmd_tt) {
            trk = op_tt;
            op_cc = trk / heads;
            op_hh = trk % heads;
        } else {
            trk = (op_cc * heads) + op_hh;
        }
        l1ndx = trk / cdevhdr.numl2tab;
        l2ndx = trk % cdevhdr.numl2tab;
        l2taboff = l1[l1ndx];
        if (swapend) cckd_swapend4((char *)&l2taboff);
    }

    /*---------------------------------------------------------------*/
    /* display CKD CCHH or relative track data                       */
    /*---------------------------------------------------------------*/
    if ((cmd_cchh) || (cmd_tt)) {
        fprintf(stderr,
                "CC %d HH %d = reltrk %d; "
                "L1 index = %d, L2 index = %d\n"
                "L1 index %d = L2TAB offset %d (0x%8.8X)\n",
                op_cc, op_hh, trk,
                l1ndx, l2ndx,
                l1ndx, (int)l2taboff, (int)l2taboff);
        l2 = makbuf(cdevhdr.numl2tab * sizeof(CCKD_L2ENT), "L2TAB");
        readpos(fd, l2, l2taboff,
                cdevhdr.numl2tab * sizeof(CCKD_L2ENT));
        if (cmd_l2tab) {
            fprintf(stderr,
                   "\nL2TAB - %d (decimal) bytes\n",
                   (int)(cdevhdr.numl2tab * sizeof(CCKD_L2ENT)));
            data_dump(l2, (cdevhdr.numl2tab * sizeof(CCKD_L2ENT)) );
        }
        fprintf(stderr, "\nL2 index %d = L2TAB entry %d bytes\n",
               l2ndx, (int)sizeof(CCKD_L2ENT) );
        data_dump(&l2[l2ndx], sizeof(CCKD_L2ENT) );
        trkhdroff = l2[l2ndx].pos;
        imglen = l2[l2ndx].len;
        if (swapend) {
            cckd_swapend4((char *)&trkhdroff);
            cckd_swapend4((char *)&imglen);
        }
        fprintf(stderr, "\nTRKHDR offset %d (0x%8.8X); "
                "length %d (0x%4.4X)\n",
                (int)trkhdroff, (int)trkhdroff, imglen, imglen);
        tbuf = makbuf(imglen, "TRKHDR+DATA");
        readpos(fd, tbuf, trkhdroff, imglen);
        fprintf(stderr, "\nTRKHDR track %d\n", trk);
        data_dump(tbuf, sizeof(CKDDASD_TRKHDR) );
        if (cmd_trkdata) showtrk(tbuf, imglen, trk, cmd_hexdump);
        free(l2); free(tbuf);
        l2 = NULL; tbuf = NULL;
    }

    /* Close file, exit */
    fprintf(stderr, "\n");
    clean();
    return cckd_diag_rc;
}
Exemplo n.º 9
0
int main() {
    fin = fopen(_P ".in", "r"); assert(fin);
    fout = fopen(_P ".out", "w"); assert(fout);
    
    // read input
    ret = fscanf(fin, "%d %d", &rmax, &cmax);
    assert(ret == 2);
    
    readpos(fin, &king);

    nknight = 0;
    while (readpos(fin, &knights[nknight])) {
        nknight++;
    }

    /*
    printpos(&king);
    for (int i = 0; i < nknight; i++) {
        printpos(&knights[i]);
    }
    */
    fclose(fin);

    // compute the min map
    computeAll();
    
    int mintotal = -1;
    int rking = king.r;
    int cking = king.c;

    for (int rgath = 0; rgath < rmax; rgath++) {
        for (int cgath = 0; cgath < cmax; cgath++) {
            int minkdelta = imax(iabs(rking - rgath), 
                    iabs(cking - cgath));
            int indgath = indexof(rgath, cgath);
            int total = 0;
            bool unreachable = false;
            
            for (int k = 0; k < nknight; k++) {
                int indknight = indexof(&knights[k]);
                int ms = minsteps(indgath, indknight);
                if (ms < 0) {
                    unreachable = true;
                    break;
                }
                knights[k].d = minsteps(indgath, indknight);
                total += knights[k].d;
            }

            if (unreachable) continue; // knight unreachable
            
            memset(touched, 0, sizeof(bool) * MAXIND);
            int head = 0;
            int tail = 1;
            trace[0].r = rking; trace[0].c = cking;
            trace[0].d = 0;
            
            while (head < tail) {
                int dthis = trace[head].d;
                if (dthis >= minkdelta) break;
                int rthis = trace[head].r;
                int cthis = trace[head].c;
                
                int indpick = indexof(rthis, cthis);
                int deltabase = minsteps(indgath, indpick);
                if (deltabase >= 0) { // reachable
                    int mindel = 1000;
                    for (int k = 0; k < nknight; k++) {
                        int indknight = indexof(&knights[k]);
                        int ms = minsteps(indpick, indknight);
                        if (ms < 0) continue;
                        int delta = deltabase + ms;
                        assert(delta >= knights[k].d);
                        delta -= knights[k].d;
                        if (delta < mindel) {
                            mindel = delta;
                        }
                        if (mindel == 0) break; // drive by already
                    }

                    if (nknight > 0) { // have knights
                        int dmin = dthis + mindel;
                        if (dmin < minkdelta) {
                            minkdelta = dmin;
                        }
                    }
                }

                for (int i = 0; i < 8; i++) {
                    int rthat = rthis + ksteps[i].r;
                    int cthat = cthis + ksteps[i].c;
                    if (rthat < 0 || rthat >= rmax) continue;
                    if (cthat < 0 || cthat >= cmax) continue;

                    int ind = indexof(rthat, cthat);
                    if (touched[ind]) continue;
                    int dthat = dthis + 1;
                    touched[ind] = true;
                    trace[tail].r = rthat;
                    trace[tail].c = cthat;
                    trace[tail].d = dthat;
                    tail++;
                }
                head++;
            }

            total += minkdelta;

            if (mintotal < 0 || total < mintotal) {
                mintotal = total;
            }
        }
    }

    assert(mintotal >= 0);
    fprintf(fout, "%d\n", mintotal);

    return 0;
}
Exemplo n.º 10
0
/* Initialize the gamestate by reading the level data, in MS dat-file
 * format, from the state's setup.
 */
static int expandmsdatlevel(gamestate *state)
{

	gamesetup		       *setup;
	unsigned char const	       *data;
	unsigned char const	       *dataend;
	int				size, pos, id;
	int				i, n;

	memset(state->map, 0, sizeof state->map);
	state->trapcount = 0;
	state->clonercount = 0;
	state->crlistcount = 0;
	state->hinttext[0] = '\0';

	setup = state->game;
	if (setup->levelsize < 10)
		goto badlevel;
	data = setup->leveldata;
	dataend = data + setup->levelsize;

	if (readword(data) == 0)
		goto badlevel;
	state->chipsneeded = readword(data + 4);

	if (readword(data + 6) > 1)
		goto badlevel;
	size = readword(data + 8);
	data += 10;
	if (data + size + 2 > dataend)
		goto badlevel;
	for (n = pos = 0 ; n < size && pos < CXGRID * CYGRID ; ++n) {
		if (data[n] == 0xFF) {
			i = data[++n];
			id = data[++n];
		} else {
			i = 1;
			id = data[n];
		}
		if (id >= (int)(sizeof fileids / sizeof *fileids)) {
			id = Wall;
			state->statusflags |= SF_BADTILES;
		} else {
			id = fileids[id];
		}
		while (i-- && pos < CXGRID * CYGRID)
			state->map[pos++].top.id = id;
	}
	if (n < size)
		warn("level %d: %d extra bytes in upper map layer",
				setup->number, size - n);
	else if (pos < CXGRID * CYGRID)
		warn("level %d: %d missing bytes in upper map layer",
				setup->number, CXGRID * CYGRID - pos);
	data += size + 2;
	size = readword(data - 2);
	if (data + size > dataend)
		goto badlevel;
	for (n = pos = 0 ; n < size && pos < CXGRID * CYGRID ; ++n) {
		if (data[n] == 0xFF) {
			i = data[++n];
			id = data[++n];
		} else {
			i = 1;
			id = data[n];
		}
		if (id >= (int)(sizeof fileids / sizeof *fileids)) {
			id = Wall;
			state->statusflags |= SF_BADTILES;
		} else {
			id = fileids[id];
		}
		while (i-- && pos < CXGRID * CYGRID)
			state->map[pos++].bot.id = id;
	}
	if (n < size)
		warn("level %d: %d extra bytes in lower map layer",
				setup->number, size - n);
	else if (pos < CXGRID * CYGRID)
		warn("level %d: %d missing bytes in lower map layer",
				setup->number, CXGRID * CYGRID - pos);
	data += size;

	size = readword(data);
	data += 2;
	if (data + size != dataend)
		warn("level %d: inconsistent metadata", setup->number);
	while (data + 2 < dataend) {
		size = data[1];
		data += 2;
		if (data + size > dataend)
			size = dataend - data;
		switch (data[-2]) {
			case 1:
				/* time */
				break;
			case 2:
				if (size < 2)
					warn("level %d: ignoring field 2 data of size %d",
							setup->number, size);
				else
					state->chipsneeded = readword(data);
				break;
			case 3:
				/* level name */
				break;
			case 4:
				if (size % 10)
					warn("level %d: ignoring %d extra bytes at end of field 4",
							setup->number, size % 10);
				state->trapcount = size / 10;
				for (i = 0 ; i < state->trapcount ; ++i) {
					state->traps[i].from = readpos(data + i * 10,
							data + i * 10 + 2);
					state->traps[i].to = readpos(data + i * 10 + 4,
							data + i * 10 + 6);
				}
				break;
			case 5:
				if (size % 8)
					warn("level %d: ignoring %d extra bytes at end of field 5",
							setup->number, size % 8);
				state->clonercount = size / 8;
				for (i = 0 ; i < state->clonercount ; ++i) {
					state->cloners[i].from = readpos(data + i * 8,
							data + i * 8 + 2);
					state->cloners[i].to = readpos(data + i * 8 + 4,
							data + i * 8 + 6);
				}
				break;
			case 6:
				/* passwd */
				break;
			case 7:
				memcpy(state->hinttext, data, size);
				state->hinttext[size] = '\0';
				break;
			case 8:
				/* field 8 passwd */
				break;
			case 10:
				if (size % 2)
					warn("level %d: ignoring extra byte at end of field 10",
							setup->number);
				state->crlistcount = size / 2;
				for (i = 0 ; i < state->crlistcount ; ++i)
					state->crlist[i] = readpos(data + i * 2, data + i * 2 + 1);
				break;
			default:
				warn("level %d: ignoring unrecognized field %d (%d bytes)",
						setup->number, data[-2], size);
				break;
		}
		data += size;
	}

	return TRUE;

badlevel:
	errmsg(NULL, "level %d: invalid data", setup->number);
	return FALSE;
}