// ---------------------------------------------------------------------------- // 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 }
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; }