static int compsub(int ch) { register int seof, c; int gsubf; gsubf = 0; xflag = 0; switch (ch) { case 's': ignore(skipwh()); seof = ex_getchar(); if (endcmd(seof)) error("Substitute needs re|Missing regular expression for substitute"); seof = compile(seof, 1); savere(subre); comprhs(seof); break; case '&': if (subre.Expbuf[0] == 0) error("No previous substitute re|No previous substitute to repeat"); resre(subre); break; case '~': if (re.Expbuf[0] == 0) error("No previous re|No previous regular expression"); savere(subre); break; } for (;;) { c = ex_getchar(); switch (c) { case 'g': gsubf++; continue; case 'c': xflag++; continue; default: ungetchar(c); setcount(); ex_newline(); return (gsubf); } } }
int main(int argc, char **argv) { static char errbuf[256]; int i; setvbuf(stderr, errbuf, _IOLBF, sizeof errbuf); progname = basename(argv[0]); setlocale(LC_CTYPE, ""); mb_cur_max = MB_CUR_MAX; i = flags(argc, argv); argc -= i, argv += i; if (argc > 0) for (i = 0; i < argc; i++) addcmd(argv[i]); else addcmd("echo"); endcmd(); process(); return errcnt; }
setend() { return (iswhite(peekchar()) || endcmd(peekchar())); }
BYTE acsi_cmd(BYTE ReadNotWrite, BYTE *cmd, BYTE cmdLength, BYTE *buffer, WORD sectorCount) { DWORD status; WORD i, wr1, wr2; //--------------------- for(i=0; i<4*12; i++) { // copy cmd1 to cmd0, cmd2 to cmd1, and so on cmdLog[i] = cmdLog[i + 12]; } for(i=0; i<cmdLength; i++) { // copy the new command to the end of cmdLog cmdLog[48 + i] = cmd[i]; } //--------------------- *FLOCK = -1; /* disable FDC operations */ setdma((DWORD) buffer); /* setup DMA transfer address */ /*********************************/ /* transfer 0th cmd byte */ *dmaAddrMode = NO_DMA | HDC; /* write 1st byte (0) with A1 low */ *dmaAddrData = cmd[0]; *dmaAddrMode = NO_DMA | HDC | A0; /* A1 high again */ if (qdone() != OK) { /* wait for ack */ hdone(); /* restore DMA device to normal */ cmdLog[59] = ACSIERROR; return ACSIERROR; } /*********************************/ /* transfer middle cmd bytes */ for(i=1; i<(cmdLength-1); i++) { *dmaAddrData = cmd[i]; *dmaAddrMode = NO_DMA | HDC | A0; if (qdone() != OK) { /* wait for ack */ hdone(); /* restore DMA device to normal */ cmdLog[59] = ACSIERROR; return ACSIERROR; } } /* wr1 and wr2 are defined so we could toggle R/W bit and then setup Read / Write operation */ if(ReadNotWrite==1) { wr1 = DMA_WR; wr2 = 0; } else { wr1 = 0; wr2 = DMA_WR; } if(acsiBufferClear) { *dmaAddrMode = wr1 | NO_DMA | SC_REG; /* clear FIFO = toggle R/W bit */ } *dmaAddrMode = wr2 | NO_DMA | SC_REG; /* and select sector count reg */ *dmaAddrSectCnt = sectorCount; /* write sector cnt to DMA device */ *dmaAddrMode = wr2 | NO_DMA | HDC | A0; /* select DMA data register again */ *dmaAddrData = cmd[cmdLength - 1]; /* transfer the last command byte */ *dmaAddrMode = wr2; /* start DMA transfer */ status = endcmd(wr2 | NO_DMA | HDC | A0); /* wait for DMA completion */ hdone(); /* restore DMA device to normal */ cmdLog[59] = status; return status; }
/* * Parse file name for command encoded by comm. * If comm is E then command is doomed and we are * parsing just so user won't have to retype the name. */ void filename(int comm) { register int c = comm, d; register int i; d = ex_getchar(); if (endcmd(d)) { if (savedfile[0] == 0 && comm != 'f') error("No file|No current filename"); CP(file, savedfile); wasalt = (isalt > 0) ? isalt-1 : 0; isalt = 0; oldadot = altdot; if (c == 'e' || c == 'E') altdot = lineDOT(); if (d == EOF) ungetchar(d); } else { ungetchar(d); getone(); eol(); if (savedfile[0] == 0 && c != 'E' && c != 'e') { c = 'e'; edited = 0; } wasalt = strcmp(file, altfile) == 0; oldadot = altdot; switch (c) { case 'f': edited = 0; /* fall into ... */ case 'e': if (savedfile[0]) { altdot = lineDOT(); CP(altfile, savedfile); } CP(savedfile, file); break; default: if (file[0]) { if (c != 'E') altdot = lineDOT(); CP(altfile, file); } break; } } if ((hush && comm != 'f') || comm == 'E') return; if (file[0] != 0) { lprintf("\"%s\"", file); if (comm == 'f') { if (value(READONLY)) ex_printf(" [Read only]"); if (!edited) ex_printf(" [Not edited]"); if (tchng) ex_printf(" [Modified]"); } flush(); } else ex_printf("No file "); if (comm == 'f') { if (!(i = lineDOL())) i++; ex_printf(" line %d of %d --%ld%%--", lineDOT(), lineDOL(), (long) 100 * lineDOT() / i); } }
/* * Get the argument words for a command into genbuf * expanding # and %. */ int getargs(void) { register int c; register char *cp, *fp; static char fpatbuf[32]; /* hence limit on :next +/pat */ pastwh(); if (peekchar() == '+') { for (cp = fpatbuf;;) { c = *cp++ = ex_getchar(); if (cp >= &fpatbuf[sizeof(fpatbuf)]) error("Pattern too long"); if (c == '\\' && isspace(peekchar())) c = ex_getchar(); if (c == EOF || isspace(c)) { ungetchar(c); *--cp = 0; firstpat = &fpatbuf[1]; break; } } } if (skipend()) return (0); CP(genbuf, "echo "); cp = &genbuf[5]; for (;;) { c = ex_getchar(); if (endcmd(c)) { ungetchar(c); break; } switch (c) { case '\\': if (any(peekchar(), "#%|")) c = ex_getchar(); /* fall into... */ default: if (cp > &genbuf[LBSIZE - 2]) flong: error("Argument buffer overflow"); *cp++ = c; break; case '#': fp = altfile; if (*fp == 0) error("No alternate filename@to substitute for #"); goto filexp; case '%': fp = savedfile; if (*fp == 0) error("No current filename@to substitute for %%"); filexp: while (*fp) { if (cp > &genbuf[LBSIZE - 2]) goto flong; *cp++ = *fp++; } break; } } *cp = 0; return (1); }
/* * Main loop for command mode command decoding. * A few commands are executed here, but main function * is to strip command addresses, do a little address oriented * processing and call command routines to do the real work. */ void commands(bool noprompt, bool exitoneof) { register line *addr; register int c; register int lchng; int given; int seensemi; int cnt; bool hadpr; resetflav(); nochng(); for (;;) { /* * If dot at last command * ended up at zero, advance to one if there is a such. */ if (dot <= zero) { dot = zero; if (dol > zero) dot = one; } shudclob = 0; /* * If autoprint or trailing print flags, * print the line at the specified offset * before the next command. */ if (pflag || (lchng != chng && value(AUTOPRINT) && !inglobal && !inopen && endline)) { pflag = 0; nochng(); if (dol != zero) { addr1 = addr2 = dot + poffset; if (addr1 < one || addr1 > dol) error("Offset out-of-bounds|Offset after command too large"); setdot1(); goto print; } } nochng(); /* * Print prompt if appropriate. * If not in global flush output first to prevent * going into pfast mode unreasonably. */ if (inglobal == 0) { flush(); if (!hush && value(PROMPT) && !globp && !noprompt && endline) { ex_putchar(':'); hadpr = 1; } TSYNC(); } /* * Gobble up the address. * Degenerate addresses yield ".". */ addr2 = 0; given = seensemi = 0; do { addr1 = addr2; addr = address(0); c = getcd(); if (addr == 0) { if (c == ',') addr = dot; else if (addr1 != 0) { addr2 = dot; break; } else break; } addr2 = addr; given++; if (c == ';') { c = ','; dot = addr; seensemi = 1; } } while (c == ','); if (c == '%') { /* %: same as 1,$ */ addr1 = one; addr2 = dol; given = 2; c = ex_getchar(); } if (addr1 == 0) addr1 = addr2; if (c == ':') c = ex_getchar(); /* * Set command name for special character commands. */ tailspec(c); /* * If called via : escape from open or visual, limit * the set of available commands here to save work below. */ if (inopen) { if (c=='\n' || c=='\r' || c==CTRL('d') || c==EOF) { if (addr2) dot = addr2; if (c == EOF) return; continue; } if (any(c, "o")) notinvis: tailprim(Command, 1, 1); } switch (c) { case 'a': switch(peekchar()) { case 'b': /* abbreviate */ tail("abbreviate"); setnoaddr(); mapcmd(0, 1); anyabbrs = 1; continue; case 'r': /* args */ tail("args"); setnoaddr(); eol(); pargs(); continue; } /* append */ if (inopen) goto notinvis; tail("append"); setdot(); aiflag = exclam(); ex_newline(); vmacchng(0); deletenone(); setin(addr2); inappend = 1; ignore(append(gettty, addr2)); inappend = 0; nochng(); continue; case 'c': switch (peekchar()) { /* copy */ case 'o': tail("copy"); vmacchng(0); move(); continue; #ifdef CHDIR /* cd */ case 'd': tail("cd"); goto changdir; /* chdir */ case 'h': ignchar(); if (peekchar() == 'd') { register char *p; tail2of("chdir"); changdir: if (savedfile[0] == '/' || !value(WARN)) ignore(exclam()); else ignore(quickly()); if (skipend()) { p = getenv("HOME"); if (p == NULL) error("Home directory unknown"); } else getone(), p = file; eol(); if (chdir(p) < 0) filioerr(p); if (savedfile[0] != '/') edited = 0; continue; } if (inopen) tailprim("change", 2, 1); tail2of("change"); break; #endif default: if (inopen) goto notinvis; tail("change"); break; } /* change */ aiflag = exclam(); setCNL(); vmacchng(0); setin(addr1); delete(0); inappend = 1; ignore(append(gettty, addr1 - 1)); inappend = 0; nochng(); continue; /* delete */ case 'd': /* * Caution: dp and dl have special meaning already. */ tail("delete"); c = cmdreg(); setCNL(); vmacchng(0); if (c) YANKreg(c); delete(0); appendnone(); continue; /* edit */ /* ex */ case 'e': tail(peekchar() == 'x' ? "ex" : "edit"); editcmd: if (!exclam() && chng) c = 'E'; filename(c); if (c == 'E') { ungetchar(lastchar()); ignore(quickly()); } setnoaddr(); doecmd: init(); addr2 = zero; laste++; ex_sync(); rop(c); nochng(); continue; /* file */ case 'f': tail("file"); setnoaddr(); filename(c); noonl(); /* synctmp(); */ continue; /* global */ case 'g': tail("global"); global(!exclam()); nochng(); continue; /* insert */ case 'i': if (inopen) goto notinvis; tail("insert"); setdot(); nonzero(); aiflag = exclam(); ex_newline(); vmacchng(0); deletenone(); setin(addr2); inappend = 1; ignore(append(gettty, addr2 - 1)); inappend = 0; if (dot == zero && dol > zero) dot = one; nochng(); continue; /* join */ case 'j': tail("join"); c = exclam(); setcount(); nonzero(); ex_newline(); vmacchng(0); if (given < 2 && addr2 != dol) addr2++; join(c); continue; /* k */ case 'k': casek: pastwh(); c = ex_getchar(); if (endcmd(c)) serror("Mark what?|%s requires following letter", Command); ex_newline(); if (!islower(c)) error("Bad mark|Mark must specify a letter"); setdot(); nonzero(); names[c - 'a'] = *addr2 &~ 01; anymarks = 1; continue; /* list */ case 'l': tail("list"); setCNL(); ignorf(setlist(1)); pflag = 0; goto print; case 'm': if (peekchar() == 'a') { ignchar(); if (peekchar() == 'p') { /* map */ tail2of("map"); setnoaddr(); mapcmd(0, 0); continue; } /* mark */ tail2of("mark"); goto casek; } /* move */ tail("move"); vmacchng(0); move(); continue; case 'n': if (peekchar() == 'u') { tail("number"); goto numberit; } /* next */ tail("next"); setnoaddr(); ckaw(); ignore(quickly()); if (getargs()) makargs(); next(); c = 'e'; filename(c); goto doecmd; /* open */ case 'o': tail("open"); oop(); pflag = 0; nochng(); continue; case 'p': case 'P': switch (peekchar()) { /* put */ case 'u': tail("put"); setdot(); c = cmdreg(); eol(); vmacchng(0); if (c) putreg(c); else put(); continue; case 'r': ignchar(); if (peekchar() == 'e') { /* preserve */ tail2of("preserve"); eol(); if (preserve() == 0) error("Preserve failed!"); else error("File preserved."); } tail2of("print"); break; default: tail("print"); break; } /* print */ setCNL(); pflag = 0; print: nonzero(); if (CL && span() > EX_LINES) { flush1(); vclear(); } plines(addr1, addr2, 1); continue; /* quit */ case 'q': tail("quit"); setnoaddr(); c = quickly(); eol(); if (!c) quit: nomore(); if (inopen) { vgoto(WECHO, 0); if (!ateopr()) vnfl(); else { tostop(); } flush(); setty(normf); } cleanup(1); ex_exit(0); case 'r': if (peekchar() == 'e') { ignchar(); switch (peekchar()) { /* rewind */ case 'w': tail2of("rewind"); setnoaddr(); if (!exclam()) { ckaw(); if (chng && dol > zero) error("No write@since last chage (:rewind! overrides)"); } eol(); erewind(); next(); c = 'e'; ungetchar(lastchar()); filename(c); goto doecmd; /* recover */ case 'c': tail2of("recover"); setnoaddr(); c = 'e'; if (!exclam() && chng) c = 'E'; filename(c); if (c == 'E') { ungetchar(lastchar()); ignore(quickly()); } init(); addr2 = zero; laste++; ex_sync(); recover(); rop2(); revocer(); if (status == 0) rop3(c); if (dol != zero) change(); nochng(); continue; } tail2of("read"); } else tail("read"); /* read */ if (savedfile[0] == 0 && dol == zero) c = 'e'; pastwh(); vmacchng(0); if (peekchar() == '!') { setdot(); ignchar(); unix0(0); filter(0); continue; } filename(c); rop(c); nochng(); if (inopen && endline && addr1 > zero && addr1 < dol) dot = addr1 + 1; continue; case 's': switch (peekchar()) { /* * Caution: 2nd char cannot be c, g, or r * because these have meaning to substitute. */ /* set */ case 'e': tail("set"); setnoaddr(); set(); continue; /* shell */ case 'h': tail("shell"); setNAEOL(); vnfl(); putpad(TE); flush(); unixwt(1, unixex("-i", (char *) 0, 0, 0)); vcontin(0); continue; /* source */ case 'o': #ifdef notdef if (inopen) goto notinvis; #endif tail("source"); setnoaddr(); getone(); eol(); source(file, 0); continue; #ifdef SIGTSTP /* stop, suspend */ case 't': tail("stop"); goto suspend; case 'u': tail("suspend"); suspend: if (!dosusp) error("Old tty driver|Not using new tty driver/shell"); c = exclam(); eol(); if (!c) ckaw(); onsusp(0); continue; #endif } /* fall into ... */ /* & */ /* ~ */ /* substitute */ case '&': case '~': Command = "substitute"; if (c == 's') tail(Command); vmacchng(0); if (!substitute(c)) pflag = 0; continue; /* t */ case 't': if (peekchar() == 'a') { tail("tag"); tagfind(exclam()); if (!inopen) lchng = chng - 1; else nochng(); continue; } tail("t"); vmacchng(0); move(); continue; case 'u': if (peekchar() == 'n') { ignchar(); switch(peekchar()) { /* unmap */ case 'm': tail2of("unmap"); setnoaddr(); mapcmd(1, 0); continue; /* unabbreviate */ case 'a': tail2of("unabbreviate"); setnoaddr(); mapcmd(1, 1); anyabbrs = 1; continue; } /* undo */ tail2of("undo"); } else tail("undo"); setnoaddr(); markDOT(); c = exclam(); ex_newline(); undo(c); continue; case 'v': switch (peekchar()) { case 'e': /* version */ tail("version"); setNAEOL(); ex_printf("@(#) Version 3.6, 11/3/80" " (4.0BSD). git " "160803 14:24" +5); noonl(); continue; /* visual */ case 'i': tail("visual"); if (inopen) { c = 'e'; goto editcmd; } vop(); pflag = 0; nochng(); continue; } /* v */ tail("v"); global(0); nochng(); continue; /* write */ case 'w': c = peekchar(); tail(c == 'q' ? "wq" : "write"); wq: if (skipwh() && peekchar() == '!') { pofix(); ignchar(); setall(); unix0(0); filter(1); } else { setall(); wop(1); nochng(); } if (c == 'q') goto quit; continue; /* xit */ case 'x': tail("xit"); if (!chng) goto quit; c = 'q'; goto wq; /* yank */ case 'y': tail("yank"); c = cmdreg(); setcount(); eol(); vmacchng(0); if (c) YANKreg(c); else yank(); continue; /* z */ case 'z': zop(0); pflag = 0; continue; /* * */ /* @ */ case '*': case '@': c = ex_getchar(); if (c=='\n' || c=='\r') ungetchar(c); if (any(c, "@*\n\r")) c = lastmac; if (isupper(c)) c = tolower(c); if (!islower(c)) error("Bad register"); ex_newline(); setdot(); cmdmac(c); continue; /* | */ case '|': endline = 0; goto caseline; /* \n */ case '\n': endline = 1; caseline: notempty(); if (addr2 == 0) { if (UP != NOSTR && c == '\n' && !inglobal) c = CTRL('k'); if (inglobal) addr1 = addr2 = dot; else { if (dot == dol) error("At EOF|At end-of-file"); addr1 = addr2 = dot + 1; } } setdot(); nonzero(); if (seensemi) addr1 = addr2; ex_getline(*addr1); if (c == CTRL('k')) { flush1(); destline--; if (hadpr) shudclob = 1; } plines(addr1, addr2, 1); continue; /* " */ case '"': comment(); continue; /* # */ case '#': numberit: setCNL(); ignorf(setnumb(1)); pflag = 0; goto print; /* = */ case '=': ex_newline(); setall(); if (inglobal == 2) pofix(); ex_printf("%d", lineno(addr2)); noonl(); continue; /* ! */ case '!': if (addr2 != 0) { vmacchng(0); unix0(0); setdot(); filter(2); } else { unix0(1); pofix(); putpad(TE); flush(); unixwt(1, unixex("-c", uxb, 0, 0)); vclrech(1); /* vcontin(0); */ nochng(); } continue; /* < */ /* > */ case '<': case '>': for (cnt = 1; peekchar() == c; cnt++) ignchar(); setCNL(); vmacchng(0); shift(c, cnt); continue; /* ^D */ /* EOF */ case CTRL('d'): case EOF: if (exitoneof) { if (addr2 != 0) dot = addr2; return; } if (!isatty(0)) { if (intty) /* * Chtty sys call at UCB may cause a * input which was a tty to suddenly be * turned into /dev/null. */ onhup(0); return; } if (addr2 != 0) { setlastchar('\n'); putnl(); } if (dol == zero) { if (addr2 == 0) putnl(); notempty(); } ungetchar(EOF); zop(hadpr); continue; default: if (!isalpha(c)) break; ungetchar(c); tailprim("", 0, 0); } ierror("What?|Unknown command character '%c'", c); } }
/* * Parse file name for command encoded by comm. * If comm is E then command is doomed and we are * parsing just so user won't have to retype the name. */ void filename(int comm) { int c = comm, d; int i; d = getchar(); if (endcmd(d)) { if (savedfile[0] == 0 && comm != 'f') error(value(vi_TERSE) ? gettext("No file") : gettext("No current filename")); CP(file, savedfile); wasalt = (isalt > 0) ? isalt-1 : 0; isalt = 0; oldadot = altdot; if (c == 'e' || c == 'E') altdot = lineDOT(); if (d == EOF) ungetchar(d); } else { ungetchar(d); getone(); eol(); if (savedfile[0] == 0 && c != 'E' && c != 'e') { c = 'e'; edited = 0; } wasalt = strcmp(file, altfile) == 0; oldadot = altdot; switch (c) { case 'f': edited = 0; /* FALLTHROUGH */ case 'e': if (savedfile[0]) { altdot = lineDOT(); CP(altfile, savedfile); } CP(savedfile, file); break; default: if (file[0]) { if (c != 'E') altdot = lineDOT(); CP(altfile, file); } break; } } if (hush && comm != 'f' || comm == 'E') return; if (file[0] != 0) { lprintf("\"%s\"", file); if (comm == 'f') { if (value(vi_READONLY)) viprintf(gettext(" [Read only]")); if (!edited) viprintf(gettext(" [Not edited]")); if (tchng) viprintf(gettext(" [Modified]")); } flush(); } else viprintf(gettext("No file ")); if (comm == 'f') { if (!(i = lineDOL())) i++; /* * TRANSLATION_NOTE * Reference order of arguments must not * be changed using '%digit$', since vi's * viprintf() does not support it. */ viprintf(gettext(" line %d of %d --%ld%%--"), lineDOT(), lineDOL(), (long)(100 * lineDOT() / i)); } }
/* * Get the argument words for a command into genbuf * expanding # and %. */ int getargs(void) { int c; unsigned char *cp, *fp; static unsigned char fpatbuf[32]; /* hence limit on :next +/pat */ char multic[MB_LEN_MAX + 1]; int len; wchar_t wc; pastwh(); if (peekchar() == '+') { for (cp = fpatbuf;;) { if (!isascii(c = peekchar()) && (c != EOF)) { if ((len = _mbftowc(multic, &wc, getchar, &peekc)) > 0) { if ((cp + len) >= &fpatbuf[sizeof(fpatbuf)]) error(gettext("Pattern too long")); strncpy(cp, multic, len); cp += len; continue; } } c = getchar(); *cp++ = c; if (cp >= &fpatbuf[sizeof(fpatbuf)]) error(gettext("Pattern too long")); if (c == '\\' && isspace(peekchar())) c = getchar(); if (c == EOF || isspace(c)) { ungetchar(c); *--cp = 0; firstpat = &fpatbuf[1]; break; } } } if (skipend()) return (0); CP(genbuf, "echo "); cp = &genbuf[5]; for (;;) { if (!isascii(c = peekchar())) { if (endcmd(c) && c != '"') break; if ((len = _mbftowc(multic, &wc, getchar, &peekc)) > 0) { if ((cp + len) > &genbuf[LBSIZE - 2]) error(gettext("Argument buffer overflow")); strncpy(cp, multic, len); cp += len; continue; } } if (endcmd(c) && c != '"') break; c = getchar(); switch (c) { case '\\': if (any(peekchar(), "#%|")) c = getchar(); /* FALLTHROUGH */ default: if (cp > &genbuf[LBSIZE - 2]) flong: error(gettext("Argument buffer overflow")); *cp++ = c; break; case '#': fp = (unsigned char *)altfile; if (*fp == 0) error(value(vi_TERSE) ? gettext("No alternate filename") : gettext("No alternate filename to substitute for #")); goto filexp; case '%': fp = savedfile; if (*fp == 0) error(value(vi_TERSE) ? gettext("No current filename") : gettext("No current filename to substitute for %%")); filexp: while (*fp) { if (cp > &genbuf[LBSIZE - 2]) goto flong; *cp++ = *fp++; } break; } } *cp = 0; return (1); }
/* * Parse file name for command encoded by comm. * If comm is E then command is doomed and we are * parsing just so user won't have to retype the name. */ void filename(int comm) { register int c = comm, d; register int i; #ifdef FLOCKFILE int lock ; lock = 0 ; #endif d = ex_getchar(); if (endcmd(d)) { if (savedfile[0] == 0 && comm != 'f') error("No file|No current filename"); CP(file, savedfile); #ifdef FLOCKFILE if (io_curr && io_curr != io_savedfile) close(io_curr) ; lock = lock_curr = lock_savedfile ; io_curr = io_savedfile ; #endif wasalt = (isalt > 0) ? isalt-1 : 0; isalt = 0; oldadot = altdot; if (c == 'e' || c == 'E') altdot = lineDOT(); if (d == EOF) ungetchar(d); } else { ungetchar(d); getone(); eol(); if (savedfile[0] == 0 && c != 'E' && c != 'e') { c = 'e'; edited = 0; } wasalt = strcmp(file, altfile) == 0; oldadot = altdot; switch (c) { case 'f': edited = 0; /* fall into ... */ case 'e': if (savedfile[0]) { #ifdef FLOCKFILE if (strcmp(file,savedfile) == 0) break ; #endif altdot = lineDOT(); CP(altfile, savedfile); #ifdef FLOCKFILE if (io_altfile) close (io_altfile) ; io_altfile = io_savedfile ; lock_altfile = lock_savedfile ; io_savedfile = 0 ; #endif } CP(savedfile, file); #ifdef FLOCKFILE io_savedfile = io_curr ; lock_savedfile = lock_curr ; io_curr = 0 ; lock = lock_curr = 0 ; #endif break; default: if (file[0]) { #ifdef FLOCKFILE if (wasalt) break ; #endif if (c != 'E') altdot = lineDOT(); CP(altfile, file); #ifdef FLOCKFILE if (io_altfile && io_altfile != io_curr) close (io_altfile) ; io_altfile = io_curr ; lock_altfile = lock_curr ; io_curr = 0 ; lock = lock_curr = 0 ; #endif } break; } } if ((hush && comm != 'f') || comm == 'E') return; if (file[0] != 0) { lprintf("\"%s\"", file); if (comm == 'f') { if (value(READONLY)) ex_printf(" [Read only]"); if (!edited) ex_printf(" [Not edited]"); if (tchng) ex_printf(" [Modified]"); #ifdef FLOCKFILE if (lock == LOCK_SH) ex_printf(" [Shared lock]") ; else if (lock == LOCK_EX) ex_printf(" [Exclusive lock]") ; #endif } flush(); } else ex_printf("No file "); if (comm == 'f') { if (!(i = lineDOL())) i++; ex_printf(" line %d of %d --%ld%%--", lineDOT(), lineDOL(), (long) 100 * lineDOT() / i); } }
// -------------------------------------- void acsi_cmd(BYTE ReadNotWrite, BYTE *cmd, BYTE cmdLength, BYTE *buffer, WORD sectorCount) { WORD i, wr1, wr2; //-------- // init result to fail codes hdIf.success = FALSE; hdIf.statusByte = ACSIERROR; hdIf.phaseChanged = FALSE; //------------------ if(hdIf.forceFlock) { // should force FLOCK? just set it *FLOCK = -1; // disable FDC operations } else { // should wait before acquiring FLOCK? wait... // try to acquire FLOCK if possible DWORD end = getTicks() + 200; // calculate the terminating tick count, where we should stop looking for unlocked FLOCK WORD locked; while(1) { // while not time out, try again locked = *FLOCK; // read current lock value if(!locked) { // if not locked, lock and continue *FLOCK = -1; // disable FDC operations break; } if(getTicks() >= end) { // on time out - fail, return ACSIERROR hdIf.success = FALSE; return; } } } //------------------ // FLOCK acquired, continue with rest setdma((DWORD) buffer); // setup DMA transfer address //******************************* // transfer 0th cmd byte *dmaAddrMode = NO_DMA | HDC; // write 1st byte (0) with A1 low *dmaAddrData = cmd[0]; *dmaAddrMode = NO_DMA | HDC | A0; // A1 high again if (qdone() != OK) { // wait for ack hdone(); // restore DMA device to normal hdIf.success = FALSE; return; } //******************************* // transfer middle cmd bytes for(i=1; i<(cmdLength-1); i++) { *dmaAddrData = cmd[i]; *dmaAddrMode = NO_DMA | HDC | A0; if (qdone() != OK) { // wait for ack hdone(); // restore DMA device to normal hdIf.success = FALSE; return; } } // wr1 and wr2 are defined so we could toggle R/W bit and then setup Read / Write operation if(ReadNotWrite==1) { wr1 = DMA_WR; wr2 = HDC | A0; } else { wr1 = 0; wr2 = DMA_WR | HDC | A0; } *dmaAddrMode = wr1 | NO_DMA | SC_REG; // clear FIFO = toggle R/W bit *dmaAddrMode = wr2 | NO_DMA | SC_REG; // and select sector count reg *dmaAddrSectCnt = sectorCount; // write sector cnt to DMA device *dmaAddrMode = wr2 | NO_DMA | HDC | A0; // select DMA data register again *dmaAddrData = cmd[cmdLength - 1]; // transfer the last command byte *dmaAddrMode = wr2; // start DMA transfer endcmd(wr2 | NO_DMA | HDC | A0); // wait for DMA completion hdone(); // restore DMA device to normal }