/* Copyright (C) 1992, 1993 Peter Edward Cann, all rights reserved. */ #include #include #include #include #include #include #include #include"port.h" #include"comscrpt.h" #include #include #define MAXNSCANS 32 struct { unsigned char index; unsigned char *str; unsigned char hitlabel; } scans[MAXNSCANS]; int nscans; #define MAXKEYS 64 struct { unsigned char key; unsigned char label; } keys[MAXKEYS]; short int labels[256]; /* Not a #define cause we use unsigned char all over */ unsigned short int rregs[256]; /* Same deal */ short int jregs[256]; /* ditto */ unsigned long tick; void (interrupt far *oldtick)(); void interrupt far tickhndl() { tick++; } quit() { cleanup(0); _dos_setvect(0x1c, oldtick); exit(99); } char demonflag, flowctlflag; sendchar(c) unsigned char c; { char kc; if(flowctlflag) /* A small ugly speed hack; don't want in loop */ while(!((inp(basereg+STATREG)&TXMTMASK)&&(inp(basereg+MSTATREG)&CTSMASK))) { if(_bios_keybrd(_KEYBRD_READY)) if((kc=_bios_keybrd(_KEYBRD_READ)&0xff)==24) demonflag=1; else if(kc==0x03) quit(); } else while(!(inp(basereg+STATREG)&TXMTMASK)) { if(_bios_keybrd(_KEYBRD_READY)) if((kc=_bios_keybrd(_KEYBRD_READ)&0xff)==24) demonflag=1; else if(kc==0x03) quit(); } outp(basereg, c); return(0); } int follow; sleep() { long tod, tod1; tick=0L; while(1) { if(tick>8) break; } } unsigned ss_vidstore[24][80], cpos, cspec; union REGS ss_r, ss_rr; void blankvid() { int row, column, ar, ac; ss_r.x.ax=0x0300; ss_r.x.bx=0x0000; int86(0x10, &ss_r, &ss_rr); cpos=ss_rr.x.dx; cspec=ss_rr.x.cx; for(ar=0,row=1;row<=24;ar++,row++) for(ac=0,column=1;column<=80;ac++,column++) { _settextposition(row, column); ss_r.x.ax=0x0800; ss_r.x.bx=0x0000; int86(0x10, &ss_r, &ss_rr); ss_vidstore[ar][ac]=ss_rr.x.ax; _outtext(" "); } _settextcursor(0x2000); /* No cursor, per MS QC doc */ } void restorevid() { int row, column, ar, ac; for(ar=0,row=1;row<=24;ar++,row++) for(ac=0,column=1;column<=80;ac++,column++) { _settextposition(row, column); ss_r.x.ax=0x0900|(ss_vidstore[ar][ac]&0xff); ss_r.x.bx=(ss_vidstore[ar][ac]>>8)&0xff; ss_r.x.cx=0x0001; int86(0x10, &ss_r, &ss_rr); } ss_r.x.ax=0x0200; ss_r.x.bx=0x0000; ss_r.x.dx=cpos; int86(0x10, &ss_r, &ss_rr); ss_r.x.ax=0x0100; ss_r.x.cx=cspec; int86(0x10, &ss_r, &ss_rr); } FILE *scriptfd; int mainargc, proglen; char **mainargv; struct line far *program; main(argc, argv) int argc; char **argv; { FILE *outfile, *infile; char c, kc, fpname[256], str[81], *sptr, spawnpath[81], line[256]; char comstr[16], speedstr[16], bitsstr[16], *spawnargv[41]; int i, j, k, argn, mkeyp, lni, lnl, ssstate; int value[8], flag, progcnt, demon, curkey, spawnargc; unsigned execretn; long timestamp, tstamp, tstamp1; program=(struct line *)malloc(PROGSIZ*sizeof(struct line)); if(!program) { printf("Unable to allocate program buffer (compiled for %d statements).\n", PROGSIZ); exit(123); } mainargc=argc; mainargv=argv; index=follow=0; printf("Copyright (C) 1992, 1993 Peter Edward Cann, all rights reserved.\n"); if(!strcmp(getenv("REMOTE"), "YES")) { printf("You appear to be logged in remotely, judging by the environment\n"); printf("variable REMOTE, so it strikes me as somewhat peculiar that you\n"); printf("want to run COMSCRPT. Are you sure you want to do it? (y or n) --> "); if(getchar()!='y') /* Note getchar() and not getch()! */ { printf("I didn't think so!\n"); exit(98); } else printf("OK, you're the boss!"); } if(argc<2) { printf("USAGE: comscrpt