Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1011 lines
29 KiB

  1. /* asmpars.c -- microsoft 80x86 assembler
  2. **
  3. ** microsoft (r) macro assembler
  4. ** copyright (c) microsoft corp 1986. all rights reserved
  5. **
  6. ** randy nevin
  7. **
  8. ** 10/90 - Quick conversion to 32 bit by Jeff Spencer
  9. */
  10. #include <stdio.h>
  11. #include <string.h>
  12. #include "asm86.h"
  13. #include "asmfcn.h"
  14. #include "asmctype.h"
  15. extern void closefile(void);
  16. static char parsedflag;
  17. char fNeedList;
  18. static char iod[] = "instruction, directive, or label";
  19. char cputext[22] = "@Cpu=";
  20. char tempText[32];
  21. USHORT coprocproc;
  22. /* an array of pointers to the function parsers */
  23. VOID (PASCAL CODESIZE * rgpHandler[])(void) = {
  24. parse,
  25. macrobuild,
  26. irpxbuild,
  27. commentbuild,
  28. strucbuild
  29. };
  30. /*** dopass - initialize and execute pass
  31. *
  32. * dopass ();
  33. *
  34. * Entry
  35. * Exit
  36. * Returns
  37. * Calls
  38. */
  39. VOID PASCAL
  40. dopass ()
  41. {
  42. /* Common pass initialize */
  43. cputype = DEF_CPU;
  44. X87type = DEF_X87;
  45. radix = 10;
  46. #ifdef XENIX287
  47. definesym("@Cpu=0507h");
  48. #else
  49. definesym("@Cpu=0101h");
  50. #endif
  51. definesym("@Version=510");
  52. pagewidth = DEF_LISTWIDTH;
  53. condflag = origcond;
  54. crefinc = 0;
  55. fSkipList = 0;
  56. errorlineno = 1;
  57. fCrefline = 1;
  58. fCheckRes = (pass2 && warnlevel >= 1);
  59. fNeedList = listconsole || (lsting && (pass2 | debug));
  60. subttlbuf[0] = NULL;
  61. modulename = NULL;
  62. pcsegment = NULL;
  63. pcproc = NULL;
  64. startaddr = NULL;
  65. localbase = 0;
  66. macrolevel = 0;
  67. linessrc = 0;
  68. linestot = 0;
  69. condlevel = 0;
  70. lastcondon = 0;
  71. pcoffset = 0;
  72. pageminor = 0;
  73. errorcode = 0;
  74. fPass1Err = 0;
  75. iProc = 0;
  76. iProcCur = 0;
  77. radixescape = FALSE;
  78. titleflag = FALSE;
  79. elseflag = FALSE;
  80. initflag = FALSE;
  81. strucflag = FALSE;
  82. fPutFirstOp = FALSE;
  83. fArth32 = FALSE;
  84. listflag = TRUE;
  85. generate = TRUE;
  86. xcreflag = TRUE;
  87. pagemajor = 1;
  88. crefcount = 1;
  89. expandflag = LISTGEN;
  90. pagelength = NUMLIN;
  91. pageline = NUMLIN - 1;
  92. memset(listbuffer, ' ', LISTMAX);
  93. memset(regsegment, 0, sizeof(regsegment));/* No segments assumed*/
  94. strcpy(tempText, "@F=@0");
  95. if (tempLabel){
  96. definesym(tempText);
  97. tempText[1] = 'B';
  98. tempText[4] = '@';
  99. definesym(tempText);
  100. tempText[4] = '0';
  101. }
  102. tempLabel = 0;
  103. /* Dispatch to do pass */
  104. handler = HPARSE;
  105. if (! setjmp(forceContext))
  106. lineprocess (RREADSOURCE, NULL);
  107. while (pFCBCur->pFCBParent)
  108. closefile ();
  109. }
  110. /*** lineprocess - processs next line
  111. *
  112. * lineprocess (tread);
  113. *
  114. * Entry tread = reader routine
  115. * Exit
  116. * Returns
  117. * Calls
  118. * Note Uses handler to decide which parsing routine to use
  119. */
  120. #if !defined XENIX286 && !defined FLATMODEL
  121. # pragma check_stack+
  122. #endif
  123. VOID CODESIZE
  124. lineprocess (
  125. char tread,
  126. MC *pMC
  127. ){
  128. VOID (PASCAL CODESIZE * pHandler)(void);
  129. lastreader = tread;
  130. pHandler = rgpHandler[handler];
  131. do {
  132. /* dispatch to reader to put line into lbuf */
  133. /* Clear opcode area if listing */
  134. if (crefinc) {
  135. crefcount += crefinc - 1;
  136. crefline ();
  137. crefcount++;
  138. crefinc = 0;
  139. }
  140. if (tread == RREADSOURCE)
  141. readfile ();
  142. else
  143. macroexpand (pMC);
  144. if (popcontext)
  145. break;
  146. linestot++;
  147. (*pHandler)();
  148. if (swaphandler) {
  149. swaphandler = FALSE;
  150. pHandler = rgpHandler[handler];
  151. }
  152. } while (1);
  153. popcontext = FALSE;
  154. if (macrolevel == 0)
  155. fPutFirstOp = FALSE;
  156. }
  157. #if !defined XENIX286 && !defined FLATMODEL
  158. # pragma check_stack-
  159. #endif
  160. /*** parse - parse line and dispatch
  161. *
  162. * parse ();
  163. *
  164. * Entry
  165. * Exit
  166. * Returns
  167. * Calls
  168. */
  169. VOID PASCAL CODESIZE
  170. parse ()
  171. {
  172. static SHORT ret, i;
  173. static char *nextAtom;
  174. startscan:
  175. opcref = REF_OTHER << 4 | REF_OTHER;
  176. listindex = 1;
  177. optyp = -1; /* Haven't looked up first token */
  178. /* Scan 1st atom on line and check delimiter */
  179. if (!getatom () && ISTERM(PEEKC())) { /* quick out for comment line */
  180. listline ();
  181. return;
  182. }
  183. if (naim.pszName[0] == '%' && naim.pszName[1] == 0) { /* expand all text macros */
  184. *begatom = ' ';
  185. substituteTMs();
  186. getatom();
  187. }
  188. parsedflag = labelflag = FALSE; /* Have not recognized line yet */
  189. if (generate)
  190. switch (PEEKC ()) {
  191. case ':':
  192. /* Form: <name>: xxxxx */
  193. /* name */
  194. nextAtom = lbufp;
  195. if (*naim.pszName == 0)
  196. errorcSYN ();
  197. else {
  198. /* create a temporary label of the form @@: */
  199. if (fProcArgs > 0) {/* build stack frame for procs */
  200. buildFrame();
  201. return;
  202. }
  203. if (naim.ucCount == 2 && *(SHORT *)naim.pszName == ('@'<<8 | '@')) {
  204. tempText[1] = 'B';
  205. definesym(tempText);
  206. symptr->attr |= M_NOCREF;
  207. lbufp = &tempText[3];
  208. getatom();
  209. labelcreate (CSNEAR, CLABEL);
  210. symptr->symu.clabel.iProc = iProcCur;
  211. pTextEnd = (char *)-1;
  212. *xxradixconvert((long)++tempLabel, &tempText[4]) = NULL;
  213. tempText[1] = 'F';
  214. definesym(tempText);
  215. symptr->attr |= M_NOCREF;
  216. }
  217. else {
  218. /* define NEAR label */
  219. labelcreate (CSNEAR, CLABEL);
  220. if (lbufp[1] == ':')
  221. nextAtom++;
  222. else if (!errorcode) { /* don't add if redef */
  223. symptr->symu.clabel.iProc = iProcCur;
  224. symptr->alpha = NULL;
  225. /* addLocal needs takes a null-terminated list */
  226. addLocal(symptr);
  227. }
  228. }
  229. }
  230. /* get next token on line after label */
  231. lbufp = nextAtom+1;
  232. if (!getatom ())
  233. goto Done;
  234. break;
  235. case '=':
  236. SKIPC ();
  237. assignvalue ();
  238. goto Done;
  239. default:
  240. /* Form: <name> xxxxx
  241. * Could have <name> <DIR2 directive> so
  242. * check 2nd atom */
  243. secondDirect ();
  244. break;
  245. }
  246. /* If PARSEDflag is off, then statement has not been recognized so
  247. see if atom is a macro name, directive or opcode */
  248. if (!parsedflag){
  249. /* look up Macros & struc only when in true part of condition */
  250. if (generate) {
  251. xcreflag--;
  252. ret = symsrch();
  253. xcreflag++;
  254. if (ret)
  255. switch (symptr->symkind) {
  256. case EQU:
  257. if (symptr->symu.equ.equtyp == TEXTMACRO) {
  258. #ifdef BCBOPT
  259. goodlbufp = FALSE;
  260. #endif
  261. /* cref reference to text macro symbol now */
  262. /* as it will be overwritten by expandTM */
  263. crefnew (REF);
  264. crefout ();
  265. /* replaces text macro with text */
  266. expandTM (symptr->symu.equ.equrec.txtmacro.equtext);
  267. goto startscan;
  268. }
  269. break;
  270. case MACRO:
  271. macrocall ();
  272. return;
  273. case STRUC:
  274. strucinit ();
  275. goto Done;
  276. case REC:
  277. recordinit ();
  278. goto Done;
  279. }
  280. }
  281. if (! firstDirect() && generate) {
  282. if (fProcArgs > 0){ /* build stack frame for procs */
  283. buildFrame();
  284. return;
  285. }
  286. emitline();
  287. if (opcodesearch ())
  288. if (opctype < OPCODPARSERS)
  289. opcode ();
  290. else if (X87type & cpu) {
  291. fltopcode ();
  292. }
  293. else
  294. error(E_EXP,iod);
  295. else if (*naim.pszName != '\0')
  296. error (E_EXP,iod);
  297. }
  298. }
  299. /* When we get here, the statement has been parsed and all that is
  300. * left to do is make sure that the line ends with ; or <cr>. If
  301. * we are currently under a FALSE conditional, don't bother to check
  302. * for proper line end since won't have scanned it. */
  303. Done:
  304. if (generate) {
  305. if (!ISTERM (skipblanks()))
  306. errorc (E_ECL); /* Questionable syntax(bad line end)*/
  307. #ifdef BCBOPT
  308. } else {
  309. goodlbufp = FALSE;
  310. #endif
  311. }
  312. listline ();
  313. }
  314. /*** secondDirect - parse those instructions which require a label
  315. *
  316. * secondDirect
  317. *
  318. * Entry
  319. * Exit
  320. * Returns
  321. * Calls
  322. */
  323. VOID PASCAL CODESIZE
  324. secondDirect ()
  325. {
  326. static char *oldlbufp;
  327. static char *saveBegatom;
  328. static char *saveEndatom;
  329. optyp = 0;
  330. fndir (); /* sets to non zero if found */
  331. if (generate && optyp == (char)0) {
  332. saveBegatom = begatom;
  333. saveEndatom = endatom;
  334. oldlbufp = lbufp;
  335. switchname ();
  336. getatom ();
  337. if (fndir2 ()) {
  338. /* Have recognized */
  339. parsedflag = TRUE;
  340. /* Switch back to 1st atom and dispatch */
  341. switchname ();
  342. labelflag = TRUE;
  343. switch (optyp) {
  344. case TCATSTR:
  345. catstring ();
  346. break;
  347. case TENDP:
  348. procend ();
  349. break;
  350. case TENDS:
  351. /* End segment */
  352. ptends ();
  353. break;
  354. case TEQU:
  355. equdefine ();
  356. break;
  357. case TGROUP:
  358. groupdefine ();
  359. break;
  360. case TINSTR:
  361. instring ();
  362. break;
  363. case TLABEL:
  364. /* <name> LABEL <type> Type is one of
  365. NEAR, FAR | BYTE, WORD, DWORD, QWORD, TBYTE Also can be
  366. record or structure name in which
  367. case set type = length */
  368. switchname ();
  369. getatom ();
  370. if (fnsize ())
  371. if (varsize) {
  372. switchname ();
  373. /* Label in name */
  374. labelcreate (varsize, CLABEL);
  375. symptr->symu.clabel.type = typeFet(varsize);
  376. }
  377. else
  378. errorc (E_TIL);
  379. else if (!symFet () ||
  380. !(symptr->symkind == STRUC ||
  381. symptr->symkind == REC))
  382. errorc (E_UST);
  383. else {
  384. switchname ();
  385. labelcreate (symptr->symtype, CLABEL);
  386. symptr->symu.clabel.type = typeFet(varsize);
  387. }
  388. break;
  389. case TMACRO:
  390. macrodefine ();
  391. break;
  392. case TPROC:
  393. procdefine ();
  394. break;
  395. case TRECORD:
  396. recorddefine ();
  397. break;
  398. case TSEGMENT:
  399. segdefine ();
  400. break;
  401. case TSIZESTR:
  402. sizestring ();
  403. break;
  404. case TSTRUC:
  405. strucdefine ();
  406. break;
  407. case TSUBSTR:
  408. substring ();
  409. break;
  410. case TDB:
  411. case TDD:
  412. case TDQ:
  413. case TDT:
  414. case TDW:
  415. case TDF:
  416. datadefine ();
  417. break;
  418. }
  419. labelflag = FALSE;
  420. }
  421. else {
  422. /* Is not a legal 2nd atom directive, but could be
  423. <strucname> or <recordname> */
  424. if (symFetNoXref () &&
  425. (symptr->symkind == STRUC ||
  426. symptr->symkind == REC)) {
  427. switchname (); /* Get 1st token back */
  428. parsedflag = TRUE;
  429. labelflag = TRUE;
  430. /* Atom is a skeleton name for
  431. * RECORD or STRUC so have form:
  432. * <name> <skel> */
  433. if (symptr->symkind == STRUC)
  434. strucinit ();
  435. else
  436. recordinit ();
  437. }
  438. else {
  439. begatom = saveBegatom;
  440. endatom = saveEndatom;
  441. lbufp = oldlbufp;
  442. switchname ();
  443. /* must be directive or opcode in 1st atom, so get
  444. back to that state be rescanning */
  445. }
  446. }
  447. }
  448. }
  449. /*** firstDirect - parse a first token directive
  450. *
  451. *
  452. * Entry optyp maybe set, via pars2
  453. * 0 - not a token
  454. * -1 - haven't looked up token yet
  455. * other - valid token # of dir
  456. *
  457. * Returns TRUE if it processed a directive
  458. */
  459. SHORT PASCAL CODESIZE
  460. firstDirect ()
  461. {
  462. if (optyp == (char)0 || (optyp == ((char)-1) && !fndir ()))
  463. return(FALSE);
  464. if (generate ||
  465. (opkind & CONDBEG) ||
  466. optyp == TCOMMENT ||
  467. optyp == TFPO) {
  468. switch (optyp) {
  469. case TASSUME:
  470. BACKC ();
  471. do {
  472. SKIPC ();
  473. assumeitem ();
  474. } while (PEEKC () == ',');
  475. break;
  476. case TCOMMENT:
  477. comdir ();
  478. break;
  479. case TOUT:
  480. outdir ();
  481. break;
  482. case TELSE:
  483. elsedir ();
  484. break;
  485. case TEND:
  486. enddir ();
  487. break;
  488. case TENDIF:
  489. endifdir ();
  490. break;
  491. case TENDM:
  492. /* Block nesting */
  493. errorc (E_BNE);
  494. break;
  495. case TERR:
  496. case TERR1:
  497. case TERR2:
  498. case TERRDIF:
  499. case TERRIDN:
  500. case TERRB:
  501. case TERRDEF:
  502. case TERRE:
  503. case TERRNZ:
  504. case TERRNB:
  505. case TERRNDEF:
  506. errdir ();
  507. break;
  508. case TEVEN:
  509. evendir (2);
  510. break;
  511. case TALIGN:
  512. evendir (0);
  513. break;
  514. case TEXITM:
  515. exitmdir ();
  516. break;
  517. case TEXTRN:
  518. BACKC ();
  519. do {
  520. SKIPC ();
  521. externitem ();
  522. } while (PEEKC() == ',');
  523. break;
  524. case TIF:
  525. case TIF1:
  526. case TIF2:
  527. case TIFDIF:
  528. case TIFIDN:
  529. case TIFB:
  530. case TIFDEF:
  531. case TIFE:
  532. case TIFNB:
  533. case TIFNDEF:
  534. conddir ();
  535. break;
  536. case TINCLUDE:
  537. includedir ();
  538. break;
  539. case TIRP:
  540. case TIRPC:
  541. irpxdir ();
  542. break;
  543. case TLOCAL:
  544. if (langType)
  545. defineLocals();
  546. break;
  547. case TNAME:
  548. namedir ();
  549. break;
  550. case TORG:
  551. orgdir ();
  552. break;
  553. case TPAGE:
  554. setpage ();
  555. break;
  556. case TPUBLIC:
  557. BACKC ();
  558. do {
  559. SKIPC ();
  560. publicitem ();
  561. } while (PEEKC () == ',');
  562. break;
  563. case TPURGE:
  564. BACKC ();
  565. do {
  566. SKIPC ();
  567. purgemacro ();
  568. } while (PEEKC () == ',');
  569. break;
  570. case TREPT:
  571. reptdir ();
  572. break;
  573. case TCREF:
  574. xcreflag = TRUE;
  575. break;
  576. case TLALL:
  577. expandflag = LIST;
  578. break;
  579. case TLFCOND:
  580. condflag = TRUE;
  581. break;
  582. case TLIST:
  583. listflag = TRUE;
  584. break;
  585. case TRADIX:
  586. radixdir ();
  587. break;
  588. case TSALL:
  589. expandflag = SUPPRESS;
  590. break;
  591. case TSFCOND:
  592. condflag = FALSE;
  593. break;
  594. case TSUBTTL:
  595. storetitle (subttlbuf);
  596. break;
  597. case TTFCOND:
  598. if (pass2) {
  599. condflag = (origcond? FALSE: TRUE);
  600. origcond = condflag;
  601. }
  602. break;
  603. case TTITLE:
  604. if (titleflag)
  605. errorc (E_RSY);
  606. else
  607. storetitle (titlebuf);
  608. titleflag = TRUE;
  609. break;
  610. case TXALL:
  611. expandflag = LISTGEN;
  612. break;
  613. case TXCREF:
  614. if (ISTERM (PEEKC ()))
  615. xcreflag = loption;
  616. else {
  617. BACKC ();
  618. do {
  619. SKIPC ();
  620. xcrefitem ();
  621. } while (PEEKC () == ',');
  622. }
  623. break;
  624. case TXLIST:
  625. listflag = FALSE;
  626. break;
  627. case TDB:
  628. case TDD:
  629. case TDQ:
  630. case TDT:
  631. case TDW:
  632. case TDF:
  633. datadefine ();
  634. break;
  635. case T8087:
  636. X87type = PX87;
  637. goto setatcpu;
  638. case T287:
  639. X87type = PX87|PX287;
  640. goto setX;
  641. case T387:
  642. X87type = PX87|PX287|PX387;
  643. setX:
  644. if (X87type > cputype)
  645. errorc(E_TIL);
  646. goto setatcpu;
  647. case T8086:
  648. cputype = P86;
  649. X87type = PX87;
  650. goto setcpudef;
  651. case T186:
  652. cputype = P186;
  653. X87type = PX87;
  654. goto setcpudef;
  655. case T286C:
  656. cputype = P186|P286;
  657. X87type = PX87|PX287;
  658. goto setcpudef;
  659. case T286P:
  660. cputype = P186|P286|PROT;
  661. X87type = PX87|PX287;
  662. goto setcpudef;
  663. #ifdef V386
  664. case T386C:
  665. init386(0);
  666. cputype = P186|P286|P386;
  667. goto set386;
  668. case T386P:
  669. init386(1);
  670. cputype = P186|P286|P386|PROT;
  671. set386:
  672. X87type = PX87|PX287|PX387;
  673. fltemulate = FALSE;
  674. fArth32 |= TRUE;
  675. #endif
  676. setcpudef:
  677. #ifdef V386
  678. wordszdefault = (char)wordsize = (cputype&P386)? 4: 2;
  679. defwordsize();
  680. if (pcsegment)
  681. if (pcsegment->symu.segmnt.use32 > wordsize)
  682. errorc(E_CPU);
  683. else
  684. wordsize = pcsegment->symu.segmnt.use32;
  685. #endif
  686. setatcpu:
  687. coprocproc = (X87type << 8) + (cputype | 1);
  688. pTextEnd = (UCHAR *) -1;
  689. *xxradixconvert((OFFSET)coprocproc, cputext + 5) = 0;
  690. definesym(cputext);
  691. break;
  692. case TSEQ:
  693. segalpha = FALSE;
  694. break;
  695. case TALPHA:
  696. segalpha = TRUE;
  697. break;
  698. case TDOSSEG:
  699. fDosSeg++;
  700. break;
  701. case TMODEL:
  702. model();
  703. break;
  704. case TMSEG:
  705. openSeg();
  706. break;
  707. case TMSTACK:
  708. createStack();
  709. break;
  710. case TINCLIB:
  711. includeLib();
  712. break;
  713. case TFPO:
  714. fpoRecord();
  715. break;
  716. case TCOMM:
  717. BACKC ();
  718. do {
  719. SKIPC ();
  720. commDefine ();
  721. } while (PEEKC() == ',');
  722. break;
  723. }
  724. }
  725. return(TRUE);
  726. }
  727. /*** setpage - set page length and width
  728. *
  729. * setpage ();
  730. *
  731. * Entry
  732. * Exit
  733. * Returns
  734. * Calls
  735. */
  736. VOID PASCAL CODESIZE
  737. setpage ()
  738. {
  739. register char cc;
  740. SHORT i;
  741. if (ISTERM (cc = PEEKC ())) {
  742. /* position to bottom of page if no operands */
  743. if (listflag)
  744. pageline = pagelength - 1;
  745. }
  746. else if (cc == '+') {
  747. if (ISBLANK (NEXTC ()))
  748. skipblanks ();
  749. if (listflag)
  750. newpage ();
  751. }
  752. else {
  753. if (cc != ',') {
  754. /* set page length */
  755. if ((i = (SHORT)exprconst ()) > 9 && i < 256)
  756. pagelength = i;
  757. else
  758. errorc (E_VOR);
  759. if (pageminor + pagemajor == 1)
  760. /* Adjust so page length right */
  761. pageline = (pagelength - NUMLIN) + pageline;
  762. }
  763. if (PEEKC () == ',') {
  764. SKIPC ();
  765. /* set page width */
  766. if ((i = (SHORT)exprconst ()) > LINEMAX || i < 60)
  767. errorc (E_VOR);
  768. else
  769. pagewidth = i;
  770. }
  771. }
  772. }
  773. /*** ptends - process ends statement
  774. *
  775. * ptends ();
  776. *
  777. * Entry
  778. * Exit
  779. * Returns
  780. * Calls
  781. */
  782. VOID PASCAL CODESIZE
  783. ptends ()
  784. {
  785. if (!symFet() || !pcsegment)
  786. errorc (E_BNE);
  787. /* Make sure segname is correct */
  788. else if (pcsegment != symptr)
  789. errorc (E_BNE);
  790. else {
  791. if (symptr->symkind != SEGMENT)
  792. errorc (E_BNE);
  793. else {
  794. if (pcmax <= pcoffset)
  795. symptr->symu.segmnt.seglen = pcoffset;
  796. else
  797. symptr->symu.segmnt.seglen = pcmax;
  798. /* S a v e s e g me n t P C */
  799. symptr->offset = pcoffset;
  800. if (pcsegment->symu.segmnt.use32 == 2) {
  801. if (pcoffset > 0x10000)
  802. errorc(E_286 & ~E_WARN1);
  803. if (pcsegment->symu.segmnt.hascode &&
  804. pcsegment->symu.segmnt.seglen > 0xFFDC)
  805. errorc( E_286 );
  806. }
  807. pcdisplay (); /* must do before lose pcsegment */
  808. pcsegment = symptr->symu.segmnt.lastseg;
  809. #ifdef V386
  810. if (pcsegment)
  811. wordsize = pcsegment->symu.segmnt.use32;
  812. else
  813. wordsize = wordszdefault;
  814. #endif
  815. symptr->symu.segmnt.lastseg = NULL;
  816. /* Replace later pcsegment <> NULL block with following
  817. block. pcmax must be reset on leaving seg. */
  818. if (pcsegment) {
  819. /* Restore PC and max offset so far in
  820. segment */
  821. pcoffset = (*pcsegment).offset;
  822. pcmax = pcsegment->symu.segmnt.seglen;
  823. strnfcpy(&segName[8], pcsegment->nampnt->id);
  824. }
  825. else {
  826. /* If no seg, PC and max are 0 */
  827. pcoffset = 0;
  828. pcmax = 0;
  829. segName[8] = NULL;
  830. }
  831. }
  832. definesym(segName);
  833. }
  834. defwordsize();
  835. }