Example #1
0
// ----------------------------------------------------------------------------
// Decode the received command
// ----------------------------------------------------------------------------
void  MB8877::decode_command()
{
#ifdef FDC_DEBUG
  Serial.println("FDC Decoder");
#endif
  reg[STATUS] = FDC_ST_BUSY;      // We are BUSY

  if (reg[STATUS] & FDC_ST_NOTREADY)    // Try again to open the directory
  {
    scanSD();
    scanDirectory(fdc.disk);
    if (reg[STATUS] & FDC_ST_NOTREADY) return;  // Still no SD
  }
  
  fdc.cmdtype = 0;  // Reset current command
  
  switch(reg[CMD] & 0xf0) {     // Decode which command to execute
  // type I
    case 0x00: cmd_restore(FDC_CMD_RESTORE); break;
    case 0x10: cmd_seek(FDC_CMD_SEEK); break;
    case 0x20: cmd_step(0); break;
    case 0x30: cmd_step(1); break;
    case 0x40: cmd_step(FDC_CMD_STEP_IN, 0); break;
    case 0x50: cmd_step(FDC_CMD_STEP_IN, 1); break;
    case 0x60: cmd_step(FDC_CMD_STEP_OUT, 0); break;
    case 0x70: cmd_step(FDC_CMD_STEP_OUT, 1); break;
  // type II
    case 0x80: cmd_readdata(FDC_CMD_RD_SEC); break;
    case 0x90: cmd_readdata(FDC_CMD_RD_MSEC); break;
    case 0xa0: cmd_writedata(FDC_CMD_WR_SEC); break;
    case 0xb0: cmd_writedata(FDC_CMD_WR_MSEC); break;
  // type III
    case 0xc0: cmd_readaddr(FDC_CMD_RD_ADDR); break;
    case 0xe0: cmd_readtrack(FDC_CMD_RD_TRK); break;
    case 0xf0: cmd_writetrack(FDC_CMD_WR_TRK); break;
  // type IV
    case 0xd0: cmd_forceint(FDC_CMD_TYPE4); break;
    default: break;
  }
  digitalWrite(FDC_IRQ, LOW);   // Generate interrupt, command completed
}
Example #2
0
int main(int argc, UCHAR **argv)
{
	UCHAR *script0 = malloc(SIZ_SCRIPT);
//	fat_flags = malloc(65536);
	fat = malloc(65536 * 2);
	filebuf0 = malloc(SIZ_FILEBUF);
	imgbuf0 = malloc(SIZ_IMGBUF);
	UCHAR *p, *q, *r, *script1;
	int i;
	FILE *fp;
	if (imgbuf0 == NULL)
		errend(1); /* out of memory */

	/* スクリプト準備 */
	q = script0;
	while ((p = *++argv) != NULL) {
		if (*p != '@') {
			r = ++q;
			while ((*q++ = *p++) != '\0') {
				if (q - script0 >= SIZ_SCRIPT - 4)
					errend(2); /* script too long */
			}
			if (q - r > 255 + 1)
				errend(3); /* script too long */
			*(r - 1) = (q - r) - 1;
			continue;
		}
		p++;
		fp = fopen(p, "rb");
		if (fp == NULL)
			errend(4); /* script file open error */
		i = fread(filebuf0, 1, SIZ_FILEBUF, fp);
		if (i >= SIZ_FILEBUF)
			errend(5); /* script file open error */
		script1 = filebuf0 + i;
		p = filebuf0;
		for (;;) {
			while (p < script1 && *p <= ' ')
				p++;
			if (p >= script1)
				break;
			r = ++q;
			while (p < script1 && *p > ' ') {
				if (q - script0 >= SIZ_SCRIPT - 4)
					errend(6); /* script too long */
				*q++ = *p++;
			}
			if (q - r > 255)
				errend(7); /* script too long */
			*(r - 1) = q - r;
			*q++ = '\0';
		}
	}
	*q++ = '\0';
	script1 = q;

	/* スクリプト解釈 */
	p = script0;
	for (;;) {
		if (*p == '\0')
			break;
		if (cmdmatch(p, "copy")) {
			p = (UCHAR *) cmd_copy(p);
			continue;
		}
		if (cmdmatch(p, "ovrcopy")) {
			p = (UCHAR *) cmd_ovrcopy(p);
			continue;
		}
		if (cmdmatch(p, "create")) {
			p = (UCHAR *) cmd_create(p);
			continue;
		}
		if (cmdmatch(p, "ovrcreate")) {
			p = (UCHAR *) cmd_ovrcreate(p);
			continue;
		}
		if (cmdmatch(p, "delete")) {
			p = (UCHAR *) cmd_delete(p);
			continue;
		}
		if (cmdmatch(p, "setattr")) {
			p = (UCHAR *) cmd_setattr(p);
			continue;
		}
		if (cmdmatch(p, "wbinimg")) {
			p = (UCHAR *) cmd_wbinimg(p);
			continue;
		}
		if (cmdmatch(p, "release")) {
			p = (UCHAR *) cmd_release(p);
			continue;
		}
		if (cmdmatch(p, "writedata")) {
			p = (UCHAR *) cmd_writedata(p);
			continue;
		}
		if (cmdmatch(p, "list")) {
			p = (UCHAR *) cmd_list(p);
			continue;
		}
		if (cmdmatch(p, "copyall")) {
			p = (UCHAR *) cmd_copyall(p);
			continue;
		}
		if (cmdmatch(p, "exe2bin")) {
			p = (UCHAR *) cmd_exe2bin(p);
			continue;
		}
		if (cmdmatch(p, "opt")) {
			p += *p + 2;
			continue;
		}
		if (optmatch(p, "imgin")) {
			p = (UCHAR *) opt_imgin(p);
			continue;
		}
		if (optmatch(p, "vsiz")) {
			p = (UCHAR *) opt_vsiz(p);
			continue;
		}
		if (optmatch(p, "imgout")) {
			p = (UCHAR *) opt_imgout(p);
			continue;
		}
		if (optmatch(p, "binin")) {
			p = (UCHAR *) opt_binin(p);
			continue;
		}
		if (optmatch(p, "binout")) {
			p = (UCHAR *) opt_binout(p);
			continue;
		}
		if (optmatch(p, "_path")) {
			p = (UCHAR *) opt_bpath(p);
			continue;
		}
		if (optmatch(p, "bias")) {
			p = (UCHAR *) opt_bias(p);
			continue;
		}
		if (cmdmatch(p, "/*")) {
			i = 1;
			do {
				p += *p + 2;
				if (*p == '\0')
					errend(9); /* comment nesting error */
				if (cmdmatch(p, "/*"))
					i++;
				if (cmdmatch(p, "*/"))
					i--;
			} while (i > 0);
			p += *p + 2;
			continue;
		}
		fputs("script syntax error. : ", stderr);
		fputs(p + 1, stderr);
		errend(8); /* script syntax error */
	}
	return 0;
}