1File: PASS1A.C Page 1 1 /* 2 Copyright 1981 3 Alcyon Corporation 4 8716 Production Ave. 5 San Diego, Ca. 92121 6 */ 7 8 /* reduce long relative branches to short if possible*/ 9 10 #include "as68.h" 11 int nitleft; 12 char tfilname[]; 13 int p2gi(); 14 long lseek(); 15 pass1a() 16 { 17 register long reduced; 18 register int i, wsize; 19 register long oldpos,newpos; /* Old and new file seek pointers */ 20 register j; /* temp */ 21 22 pitix = itbuf; 23 nitleft = 0; 24 reduced = 0; itoffset = 0; stbuf[0].itrl = 0; 25 wsize = 3*sizeof stbuf[0]; /* [vlh] don't calculate many times */ 26 close(itfn); 27 LASTCHTFN = itfnc; 28 itfn = openfi(tfilname,2,1); /*open it for update*/ 29 while(ristb()) { 30 opcpt = stbuf[2].itop.ptrw2; /*ptr to opcode entry in main tab*/ 31 if(!(opcpt->flags&OPDR)) { /*not a directive*/ 32 format = (opcpt->flags)&OPFF; 33 p1inlen = stbuf[1].itrl; /*pass 1 instr length guess*/ 34 if(((format==6 && p1inlen==4) || opcpt==jsrptr) && 35 (rlflg=stbuf[3].itrl)==TEXT) { 36 nite = stbuf[0].itrl & 0377;/* # of it entries */ 37 pnite = &stbuf[nite].itty; /*ptr to end of stmt*/ 38 modelen = stbuf[2].itrl; /*instr mode length*/ 39 opdix = ITOP1; /*first operand*/ 40 pitw = &stbuf[ITOP1].itty; /*ptr to first operand*/ 41 loctr = stbuf[3].itop - reduced; 42 expr(&p2gi); 43 ival =- loctr+2L; 44 if(itype==ITCN && !extflg && reloc!=ABS) { 45 if(format==9) { /*jsr*/ 46 i = (ival>= -128 && ival<=127) ? p1inlen-2 : 47 (ival>= -32768 && ival<=32767) ? p1inlen-4 : 0; 48 if (!i) 49 continue; 50 stbuf[2].itop.ptrw2 = bsrptr; /*chng to bsr*/ 51 } 52 else if(ival>= -128 && ival<=127) { 53 i = 2; /*[vlh]was 4 for ival=2*/ 54 if (!ival) stbuf[2].itop.ptrw2 = nopptr; 55 } 56 else 57 continue; 58 fixsyadr(i); 59 reduced =+ i; 1File: PASS1A.C Page 2 60 stbuf[1].itrl =- i; /*reduced somewhat*/ 61 if(!stbuf[1].itrl) 62 stbuf[1].itrl = -1; /*ignore flag*/ 63 oldpos=lseek(itfn,0L,1); /* Remember current position */ 64 newpos= itoffset - 65 (stbuf[0].itrl*sizeof stbuf[0]); 66 if(lseek(itfn,newpos,0) < 0) { 67 rpterr("seek error on it file\n"); 68 abort(); 69 } 70 if(write(itfn,&stbuf[0],wsize) != wsize) { 71 rpterr("write error on it file\n"); 72 abort(); 73 } 74 lseek(itfn,oldpos,0); 75 } 76 } 77 } 78 else if(opcpt == endptr) { 79 savelc[TEXT] =- reduced; 80 return; 81 } 82 } 83 } 84 85 /* fix all symbol addresses that are text based and greater than loctr*/ 86 /* fix means subtract 2 from them*/ 87 fixsyadr(al) 88 { 89 register char **sx1, **sx2; 90 register l; 91 92 l = al; 93 /* loop thru symbol initial reference table*/ 94 for(sx1= sirt; sx1<&sirt[SZIRT-1]; sx1 =+ 2) { 95 if(*(sx2 = sx1+1)==0) /* this chain is empty*/ 96 continue; 97 98 /* symbols on one chain*/ 99 sx2 = *sx2; /*first entry on this chain*/ 100 while(1) { 101 if((sx2->flags&SYDF || sx2->flags&SYPC) && sx2->flags&SYRO && 102 sx2->vl1 > loctr) /* [vlh] */ 103 sx2->vl1 =- l; 104 if(sx2 == *sx1) /*end of chain*/ 105 break; 106 sx2 = sx2->tlnk; /*next entry in chain*/ 107 } 108 } 109 }