|
|
1.1 ! root 1: /* ! 2: * Initialize the assembler ! 3: */ ! 4: #include <asm.h> ! 5: ! 6: #ifdef COHERENT ! 7: #define SLASH '/' ! 8: #else ! 9: #define SLASH '\\' ! 10: #endif ! 11: ! 12: #if 0 ! 13: /* This is used only to get the Syntax error message into the docs. */ ! 14: ! 15: yyerror("Syntax error"); ! 16: /* The syntax of this statement makes no sense to the parser. ! 17: * This can be a variety of problems. */ ! 18: #endif ! 19: ! 20: static char swChars[] = "VwQXaxfpbgnlo:?E:D:"; /* list for getargs */ ! 21: static int savArgc; ! 22: static char **savArgv; ! 23: static char dodefsw; /* -D or -E used */ ! 24: ! 25: /* ! 26: * Do -E and -D definitions. ! 27: * -Dx=y is the same as x .define y ! 28: * -Ea=5 is the same as a .equ 5 ! 29: * This is called every pass. ! 30: */ ! 31: void ! 32: dodefs() ! 33: { ! 34: register char *p, c; ! 35: ! 36: if (!dodefsw) /* no -D or -E to process */ ! 37: return; ! 38: ! 39: optix = 1; /* reset getargs */ ! 40: while (EOF != (c = getargs(savArgc, savArgv, swChars))) { ! 41: switch(c) { ! 42: case 'D': ! 43: case 'E': ! 44: if (NULL == (p = strchr(optarg, '=')) || p == optarg) ! 45: fatal("Invalid option on -%c switch", c); ! 46: /* The syntax of -D and -E switches is ! 47: * -Dname=string ! 48: * -Ename=number */ ! 49: *p++ = '\0'; ! 50: if ('D' == c) { ! 51: defCt++; ! 52: defMac(gcpy(optarg, 0), ! 53: gcpy(p, offset(parm, str)), ! 54: MACSTR); ! 55: } ! 56: else ! 57: symLookUp(gcpy(optarg, 0), S_XSYM, atol(p), 0); ! 58: *--p = '='; ! 59: default: ! 60: continue; ! 61: } ! 62: } ! 63: } ! 64: ! 65: /* ! 66: * Invalid usage message. ! 67: */ ! 68: void ! 69: usage() ! 70: { ! 71: fprintf(stderr, "usage: as [-wXxfpbgnlQ] [-o output] filename\n"); ! 72: exit(1); ! 73: } ! 74: ! 75: /* ! 76: * process arguments and call yyparse. ! 77: */ ! 78: main(argc, argv) ! 79: char **argv; ! 80: { ! 81: register char *p, c; ! 82: char *fileName; ! 83: ! 84: errdev = stderr; /* errors normally go to stderr */ ! 85: ! 86: initStor(); /* init storage control */ ! 87: segInit(); /* init segment data */ ! 88: indPass(); /* init indefinite branch logic */ ! 89: newLevel(NORMAL); /* set base level for if else etc */ ! 90: ! 91: _addargs("AS", &argc, &argv); ! 92: savArgv = argv; ! 93: savArgc = argc; ! 94: ! 95: fileName = NULL; ! 96: while (EOF != (c = getargs(argc, argv, swChars))) { ! 97: switch(c) { ! 98: case 0: ! 99: if (NULL != fileName) /* one time only */ ! 100: fatal("more than one file to process"); ! 101: /* The assembler will only process one file ! 102: * at a time. */ ! 103: fileName = optarg; ! 104: break; ! 105: ! 106: case 'a': /* align data objects */ ! 107: alignon = alignonX ^= 1; ! 108: break; ! 109: ! 110: case 'n': /* No fixes for chip errata */ ! 111: nswitch = nswitchX ^= 1; ! 112: break; ! 113: ! 114: case 'w': /* No warning messages */ ! 115: wswitchX ^= 1; ! 116: break; ! 117: ! 118: case 'X': /* don't output .L local symbols */ ! 119: Xswitch ^= 1; ! 120: break; ! 121: ! 122: case 'x': /* no local symbols in object file */ ! 123: xswitch ^= 1; ! 124: break; ! 125: ! 126: case 'f': /* reverse order of operands */ ! 127: fswitch = fswitchX ^= 1; ! 128: break; ! 129: ! 130: case 'p': /* don't use % on register names */ ! 131: rswitch ^= 1; ! 132: break; ! 133: ! 134: case 'b': /* reverse bracket sense */ ! 135: bswitch = bswitchX ^= 1; ! 136: break; ! 137: ! 138: case 'Q': /* No messages at all */ ! 139: Qswitch ^= 1; ! 140: break; ! 141: ! 142: case 'g': /* treat unrefrenced symbols as globl */ ! 143: gswitch = 1; ! 144: break; ! 145: ! 146: case 'l': /* print a listing */ ! 147: errdev = (lswitchX ^= 1) ? stdout : stderr; ! 148: break; ! 149: ! 150: case 'o': ! 151: outName = optarg; ! 152: if ((NULL == (p = strrchr(outName, '.'))) || ! 153: strcmp(p, ".o")) ! 154: fatal("Unlikely output file '%s'", outName); ! 155: /* Output file-names should have \fB.o\fR suffixes. ! 156: * Because this is generally a typographical error, ! 157: * \fBas\fR aborts to ! 158: * avoid overwriting an important file. */ ! 159: break; ! 160: ! 161: case 'D': /* process in dodefs */ ! 162: case 'E': ! 163: dodefsw = 1; ! 164: case 'V': ! 165: fprintf(stderr, "Mark Williams 80386 assembler\n"); ! 166: break; ! 167: ! 168: case '?': ! 169: default: ! 170: usage(); ! 171: } ! 172: } ! 173: ! 174: if (fileName == NULL) ! 175: fatal("no work"); ! 176: /* There were no files listed on the command line. */ ! 177: ! 178: symInit(); /* init symbol table */ ! 179: ! 180: fileOpen(fileName); ! 181: title = scpy(fileName, 0); ! 182: ! 183: if(NULL == outName) { /* develop output filename */ ! 184: char *q; ! 185: int len; ! 186: ! 187: /* point p at input file name */ ! 188: if (NULL != (q = strrchr(p = fileName, SLASH))) ! 189: p = q + 1; ! 190: ! 191: outName = alloc((unsigned)(3 + (len = strlen(p)))); ! 192: strcpy(outName, p); ! 193: ! 194: p = outName + len - 2; /* right spot for . */ ! 195: if ('.' != *p) /* if no . append .o */ ! 196: p += 2; ! 197: ! 198: strcpy(p, ".o"); ! 199: } ! 200: ! 201: /* get ctime without \n */ ! 202: { ! 203: long t; ! 204: ! 205: time(&t); ! 206: c = strlen(dTime = ctime(&t)) - 1; ! 207: dTime[c] = '\0'; ! 208: } ! 209: ! 210: dodefs(); ! 211: yyparse(); ! 212: fatal("Unexpected return from parser"); /* TECH */ ! 213: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.