4 * (C) Copyright 1989-1995
12 * - outsym: show s_id as string rather than array [NCPS]
13 * - Added outr11 to support 8051's 11 bit destination address
25 * The module asout.c contains all the functions used to
26 * generate the .REL assembler output file.
29 * The assemblers' output object file is an ascii file containing
30 * the information needed by the linker to bind multiple object
31 * modules into a complete loadable memory image.
33 * The object module contains the following designators:
40 * H Most significant byte first
41 * L Least significant byte first
48 * R Relocation information
49 * P Paging information
54 * The first line of an object module contains the [XDQ][HL]
55 * format specifier (i.e. XH indicates a hexadecimal file with
56 * most significant byte first) for the following designators.
61 * H aa areas gg global symbols
63 * The header line specifies the number of areas(aa) and the
64 * number of global symbols(gg) defined or referenced in this ob-
65 * ject module segment.
72 * The module line specifies the module name from which this
73 * header segment was assembled. The module line will not appear
74 * if the .module directive was not used in the source program.
85 * The symbol line defines (Def) or references (Ref) the symbol
86 * 'string' with the value nnnn. The defined value is relative to
87 * the current area base address. References to constants and ex-
88 * ternal global symbols will always appear before the first area
89 * definition. References to external symbols will have a value of
95 * A label size ss flags ff
97 * The area line defines the area label, the size (ss) of the
98 * area in bytes, and the area flags (ff). The area flags specify
99 * the ABS, REL, CON, OVR, and PAG parameters:
101 * OVR/CON (0x04/0x00 i.e. bit position 2)
103 * ABS/REL (0x08/0x00 i.e. bit position 3)
105 * PAG (0x10 i.e. bit position 4)
110 * T xx xx nn nn nn nn nn ...
112 * The T line contains the assembled code output by the assem-
113 * bler with xx xx being the offset address from the current area
114 * base address and nn being the assembled instructions and data in
120 * R 0 0 nn nn n1 n2 xx xx ...
122 * The R line provides the relocation information to the linker.
123 * The nn nn value is the current area index, i.e. which area the
124 * current values were assembled. Relocation information is en-
125 * coded in groups of 4 bytes:
127 * 1. n1 is the relocation mode and object format
128 * 1. bit 0 word(0x00)/byte(0x01)
129 * 2. bit 1 relocatable area(0x00)/symbol(0x02)
130 * 3. bit 2 normal(0x00)/PC relative(0x04) relocation
131 * 4. bit 3 1-byte(0x00)/2-byte(0x08) object format for
133 * 5. bit 4 signed(0x00)/unsigned(0x10) byte data
134 * 6. bit 5 normal(0x00)/page '0'(0x20) reference
135 * 7. bit 6 normal(0x00)/page 'nnn'(0x40) reference
136 * 8. bit 7 normal(0x00)/MSB of value
138 * 2. n2 is a byte index into the corresponding (i.e. pre-
139 * ceeding) T line data (i.e. a pointer to the data to be
140 * updated by the relocation). The T line data may be
141 * 1-byte or 2-byte byte data format or 2-byte word
144 * 3. xx xx is the area/symbol index for the area/symbol be-
145 * ing referenced. the corresponding area/symbol is found
146 * in the header area/symbol lists.
149 * The groups of 4 bytes are repeated for each item requiring relo-
150 * cation in the preceeding T line.
155 * P 0 0 nn nn n1 n2 xx xx
157 * The P line provides the paging information to the linker as
158 * specified by a .setdp directive. The format of the relocation
159 * information is identical to that of the R line. The correspond-
160 * ing T line has the following information:
161 * T xx xx aa aa bb bb
163 * Where aa aa is the area reference number which specifies the
164 * selected page area and bb bb is the base address of the page.
165 * bb bb will require relocation processing if the 'n1 n2 xx xx' is
166 * specified in the P line. The linker will verify that the base
167 * address is on a 256 byte boundary and that the page length of an
168 * area defined with the PAG type is not larger than 256 bytes.
170 * The linker defaults any direct page references to the first
171 * area defined in the input REL file. All ASxxxx assemblers will
172 * specify the _CODE area first, making this the default page area.
175 * asout.c contains the following functions:
196 * The module asout.c contains the following local variables:
197 * int rel[] relocation data for code/data array
198 * int * relp pointer to rel array
199 * int txt[] assembled code/data array
200 * int * txtp pointer to txt array
209 char *txtp = { &txt[0] };
210 char *relp = { &rel[0] };
212 /*)Function VOID outab(b)
214 * int b assembler data word
216 * The function outab() processes a single word of
217 * assembled data in absolute format.
220 * int * txtp pointer to data word
223 * int oflag -o, generate relocatable output flag
224 * int pass assembler pass number
227 * VOID outchk() asout.c
228 * VOID out_lb() asout.c
231 * The current assembly address is incremented by 1.
247 /*)Function VOID outaw(w)
249 * int w assembler data word
251 * The function outaw() processes a single word of
252 * assembled data in absolute format.
255 * int * txtp pointer to data word
258 * int oflag -o, generate relocatable output flag
259 * int pass assembler pass number
262 * VOID outchk() asout.c
263 * VOID out_lw() asout.c
266 * The current assembly address is incremented by 2.
282 /*)Function VOID write_rmode(r)
284 * int r relocation mode
286 * write_rmode puts the passed relocation mode into the
287 * output relp buffer, escaping it if necessary.
290 * int * relp pointer to rel array
293 * VOID rerr() assubr.c
296 * relp is incremented appropriately.
301 /* We need to escape the relocation mode if it is greater
302 * than a byte, or if it happens to look like an escape.
303 * (I don't think that the latter case is legal, but
304 * better safe than sorry).
306 if ((r > 0xff) || ((r & R_ESCAPE_MASK) == R_ESCAPE_MASK))
308 /* Hack in up to an extra 4 bits of flags with escape. */
311 /* uh-oh.. we have more than 4 extra bits. */
313 "Internal error: relocation mode 0x%X too big.\n",
317 /* printf("escaping relocation mode\n"); */
318 *relp++ = R_ESCAPE_MASK | (r >> 8);
327 /*)Function VOID outrb(esp, r)
329 * expr * esp pointer to expr structure
330 * int r relocation mode
332 * The function outrb() processes a byte of generated code
333 * in either absolute or relocatable format dependent upon
334 * the data contained in the expr structure esp. If the
335 * .REL output is enabled then the appropriate information
336 * is loaded into the txt and rel buffers.
339 * int n symbol/area reference number
340 * int * relp pointer to rel array
341 * int * txtp pointer to txt array
344 * sym dot defined as sym[0]
345 * int oflag -o, generate relocatable output flag
346 * int pass assembler pass number
349 * VOID aerr() assubr.c
350 * VOID outchk() asout.c
351 * VOID out_lb() asout.c
352 * VOID out_rb() asout.c
353 * VOID out_tb() asout.c
356 * The current assembly address is incremented by 1.
360 outrb(struct expr *esp, int r)
365 if (esp->e_flag==0 && esp->e_base.e_ap==NULL) {
366 /* This is a constant; simply write the
367 * const byte to the T line and don't
368 * generate any relocation info.
370 out_lb(lobyte(esp->e_addr),0);
373 *txtp++ = lobyte(esp->e_addr);
376 /* We are generating a single byte of relocatable
379 * In 8051 mode, we generate a 16 bit address. The
380 * linker will later select a single byte based on
381 * whether R_MSB is set.
383 * In flat24 mode, we generate a 24 bit address. The
384 * linker will select a single byte based on
385 * whether R_MSB or R_HIB is set.
389 r |= R_BYTE | R_BYT2 | esp->e_rlcf;
391 out_lb(hibyte(esp->e_addr),r|R_RELOC|R_HIGH);
393 out_lb(lobyte(esp->e_addr),r|R_RELOC);
399 n = esp->e_base.e_sp->s_ref;
402 n = esp->e_base.e_ap->a_ref;
405 *relp++ = txtp - txt - 2;
412 r |= R_BYTE | R_BYT3 | esp->e_rlcf;
415 /* Probably should mark this differently in the
418 out_lb(byte3(esp->e_addr),r|R_RELOC|R_HIGH);
420 else if (r & R_MSB) {
421 out_lb(hibyte(esp->e_addr),r|R_RELOC|R_HIGH);
423 out_lb(lobyte(esp->e_addr),r|R_RELOC);
427 out_t24(esp->e_addr);
429 n = esp->e_base.e_sp->s_ref;
432 n = esp->e_base.e_ap->a_ref;
435 *relp++ = txtp - txt - 3;
444 /*)Function VOID outrw(esp, r)
446 * expr * esp pointer to expr structure
447 * int r relocation mode
449 * The function outrw() processes a word of generated code
450 * in either absolute or relocatable format dependent upon
451 * the data contained in the expr structure esp. If the
452 * .REL output is enabled then the appropriate information
453 * is loaded into the txt and rel buffers.
456 * int n symbol/area reference number
457 * int * relp pointer to rel array
458 * int * txtp pointer to txt array
461 * sym dot defined as sym[0]
462 * int oflag -o, generate relocatable output flag
463 * int pass assembler pass number
466 * VOID aerr() assubr.c
467 * VOID outchk() asout.c
468 * VOID out_lw() asout.c
469 * VOID out_rw() asout.c
470 * VOID out_tw() asout.c
473 * The current assembly address is incremented by 2.
477 outrw(struct expr *esp, int r)
483 if (esp->e_addr > 0xffff)
487 "large constant 0x%x truncated to 16 bits\n",
490 if (esp->e_flag==0 && esp->e_base.e_ap==NULL) {
491 out_lw(esp->e_addr,0);
497 r |= R_WORD | esp->e_rlcf;
501 out_lw(hibyte(esp->e_addr),r|R_RELOC);
503 out_lw(lobyte(esp->e_addr),r|R_RELOC);
506 out_lw(esp->e_addr,r|R_RELOC);
512 n = esp->e_base.e_sp->s_ref;
515 n = esp->e_base.e_ap->a_ref;
520 /* If this happens, the linker will
521 * attempt to process this 16 bit field
522 * as 24 bits. That would be bad.
525 "***Internal error: C24 out in "
530 *relp++ = txtp - txt - 2;
538 /*)Function VOID outr24(esp, r)
540 * expr * esp pointer to expr structure
541 * int r relocation mode
543 * The function outr24() processes 24 bits of generated code
544 * in either absolute or relocatable format dependent upon
545 * the data contained in the expr structure esp. If the
546 * .REL output is enabled then the appropriate information
547 * is loaded into the txt and rel buffers.
550 * int n symbol/area reference number
551 * int * relp pointer to rel array
552 * int * txtp pointer to txt array
555 * sym dot defined as sym[0]
556 * int oflag -o, generate relocatable output flag
557 * int pass assembler pass number
560 * VOID aerr() assubr.c
561 * VOID outchk() asout.c
562 * VOID out_l24() asout.c
563 * VOID out_rw() asout.c
564 * VOID out_t24() asout.c
567 * The current assembly address is incremented by 3.
571 outr24(struct expr *esp, int r)
576 if (esp->e_flag==0 && esp->e_base.e_ap==NULL) {
577 /* This is a constant expression. */
578 out_l24(esp->e_addr,0);
581 out_t24(esp->e_addr);
584 /* This is a symbol. */
585 r |= R_WORD | esp->e_rlcf;
587 /* I have no idea what this case is. */
590 out_lw(hibyte(esp->e_addr),r|R_RELOC);
592 out_lw(lobyte(esp->e_addr),r|R_RELOC);
595 out_l24(esp->e_addr,r|R_RELOC);
599 out_t24(esp->e_addr);
601 n = esp->e_base.e_sp->s_ref;
604 n = esp->e_base.e_ap->a_ref;
609 /* If this occurs, we cannot properly
610 * code the relocation data with the
611 * R_C24 flag. This means the linker
612 * will fail to do the 24 bit relocation.
616 "***Internal error: BYTE out in 24 "
617 "bit flat mode unexpected.\n");
621 write_rmode(r | R_C24);
622 *relp++ = txtp - txt - 3;
630 /*)Function VOID outdp(carea, esp)
632 * area * carea pointer to current area strcuture
633 * expr * esp pointer to expr structure
635 * The function outdp() flushes the output buffer and
636 * outputs paging information to the .REL file.
639 * int n symbol/area reference number
640 * int r relocation mode
641 * int * relp pointer to rel array
642 * int * txtp pointer to txt array
645 * int oflag -o, generate relocatable output flag
646 * int pass assembler pass number
649 * VOID outbuf() asout.c
650 * VOID outchk() asout.c
651 * VOID out_rw() asout.c
652 * VOID out_tw() asout.c
655 * Output buffer flushed to .REL fiel.
656 * Paging information dumped to .REL file.
661 register struct area *carea;
662 register struct expr *esp;
666 if (oflag && pass==2) {
668 out_tw(carea->a_ref);
670 if (esp->e_flag || esp->e_base.e_ap!=NULL) {
673 n = esp->e_base.e_sp->s_ref;
676 n = esp->e_base.e_ap->a_ref;
679 *relp++ = txtp - txt - 2;
686 /*)Function VOID outall()
688 * The function outall() will output any bufferred assembled
689 * data and relocation information (during pass 2 if the .REL
690 * output has been enabled).
696 * int oflag -o, generate relocatable output flag
697 * int pass assembler pass number
700 * VOID outbuf() asout.c
703 * assembled data and relocation buffers will be cleared.
709 if (oflag && pass==2)
713 /*)Function VOID outdot()
715 * The function outdot() outputs information about the
716 * current program counter value (during pass 2 if the .REL
717 * output has been enabled).
723 * int oflag -o, generate relocatable output flag
724 * int pass assembler pass number
727 * int fprintf() c_library
731 * assembled data and relocation buffers will be cleared.
737 if (oflag && pass==2) {
739 out(txt,(int) (txtp-txt));
742 out(rel,(int) (relp-rel));
749 /*)Function outchk(nt, nr)
751 * int nr number of additional relocation words
752 * int nt number of additional data words
754 * The function outchk() checks the data and relocation buffers
755 * for space to insert the nt data words and nr relocation words.
756 * If space is not available then output the current data and
757 * initialize the data buffers to receive the new data.
760 * area * ap pointer to an area structure
761 * int * relp pointer to rel array
762 * int * txtp pointer to txt array
765 * sym dot defined as sym[0]
768 * VOID outbuf() asout.c
771 * Data and relocation buffers may be emptied and initialized.
777 register struct area *ap;
779 if (txtp+nt > &txt[NTXT] || relp+nr > &rel[NREL]) {
784 if ((ap = dot.s_area) != NULL) {
785 write_rmode(R_WORD|R_AREA);
792 /*)Function VOID outbuf()
794 * The function outbuf() will output any bufferred data
795 * and relocation information to the .REL file. The output
796 * buffer pointers and counters are initialized.
799 * int rel[] relocation data for code/data array
800 * int * relp pointer to rel array
801 * int txt[] assembled code/data array
802 * int * txtp pointer to txt array
805 * FILE * ofp relocation output file handle
811 * All bufferred data written to .REL file and
812 * buffer pointers and counters initialized.
819 if (txtp > &txt[2]) {
821 out(txt,(int) (txtp-txt));
823 fprintf(ofp, "%s", s);
824 out(rel,(int) (relp-rel));
831 /*)Function VOID outgsd()
833 * The function outgsd() performs the following:
834 * (1) outputs the .REL file radix
835 * (2) outputs the header specifying the number
836 * of areas and global symbols
837 * (3) outputs the module name
838 * (4) set the reference number and output a symbol line
839 * for all external global variables and absolutes
840 * (5) output an area name, set reference number and output
841 * a symbol line for all global relocatables in the area.
842 * Repeat this proceedure for all areas.
845 * area * ap pointer to an area structure
846 * sym * sp pointer to a sym structure
849 * int c string character value
850 * int narea number of code areas
851 * char * ptr string pointer
852 * int nglob number of global symbols
853 * int rn symbol reference number
856 * area * areap pointer to an area structure
857 * char module[] module name string
858 * sym * symhash[] array of pointers to NHASH
859 * linked symbol lists
860 * int xflag -x, listing radix flag
863 * int fprintf() c_library
864 * VOID outarea() asout.c
865 * VOID outsym() asout.c
866 * int putc() c_library
869 * All symbols are given reference numbers, all symbol
870 * and area information is output to the .REL file.
876 register struct area *ap;
877 register struct sym *sp;
880 int c, narea, nglob, rn;
885 narea = areap->a_ref + 1;
888 * Number of global references/absolutes
891 for (i = 0; i < NHASH; ++i) {
894 if (sp->s_flag&S_GBL)
901 * Output Radix and number of areas and symbols
904 fprintf(ofp, "X%c\n", hilo ? 'H' : 'L');
905 fprintf(ofp, "H %X areas %X global symbols\n", narea, nglob);
908 fprintf(ofp, "Q%c\n", hilo ? 'H' : 'L');
909 fprintf(ofp, "H %o areas %o global symbols\n", narea, nglob);
912 fprintf(ofp, "D%c\n", hilo ? 'H' : 'L');
913 fprintf(ofp, "H %u areas %u global symbols\n", narea, nglob);
922 while (ptr < &module[NCPS]) {
923 if ((c = *ptr++) != 0)
930 * Global references and absolutes.
933 for (i=0; i<NHASH; ++i) {
936 if (sp->s_area==NULL && sp->s_flag&S_GBL) {
945 * Global relocatables.
947 for (i=0; i<narea; ++i) {
949 while (ap->a_ref != i)
952 for (j=0; j<NHASH; ++j) {
955 if (sp->s_area==ap && sp->s_flag&S_GBL) {
965 /*)Function VOID outarea(ap)
967 * area * ap pointer to an area structure
969 * The function outarea() outputs the A line to the .REL
970 * file. The A line contains the area's name, size, and
974 * char * ptr pointer to area id string
975 * int c character value
978 * FILE * ofp relocation output file handle
979 * int xflag -x, listing radix flag
982 * int fprintf() c_library
983 * int putc() c_library
986 * The A line is sent to the .REL file.
991 register struct area *ap;
998 while (ptr < &ap->a_id[NCPS]) {
999 if ((c = *ptr++) != 0)
1003 fprintf(ofp, " size %X flags %X\n", ap->a_size, ap->a_flag);
1006 fprintf(ofp, " size %o flags %o\n", ap->a_size, ap->a_flag);
1009 fprintf(ofp, " size %u flags %u\n", ap->a_size, ap->a_flag);
1013 /*)Function VOID outsym(sp)
1015 * sym * sp pointer to a sym structure
1017 * The function outsym() outputs the S line to the .REL
1018 * file. The S line contains the symbols name and whether the
1019 * the symbol is defined or referenced.
1022 * char * ptr pointer to symbol id string
1023 * int c character value
1026 * FILE * ofp relocation output file handle
1027 * int xflag -x, listing radix flag
1030 * int fprintf() c_library
1031 * int putc() c_library
1034 * The S line is sent to the .REL file.
1039 register struct sym *sp;
1045 fprintf(ofp, "%s", ptr );
1046 fprintf(ofp, " %s", sp->s_type==S_NEW ? "Ref" : "Def");
1048 fprintf(ofp, "%04X\n", sp->s_addr);
1051 fprintf(ofp, "%06o\n", sp->s_addr);
1054 fprintf(ofp, "%05u\n", sp->s_addr);
1058 /*)Function VOID out(p, n)
1060 * int n number of words to output
1061 * int * p pointer to data words
1063 * The function out() outputs the data words to the .REL file
1064 * int the specified radix.
1070 * FILE * ofp relocation output file handle
1071 * int xflag -x, listing radix flag
1074 * int fprintf() c_library
1077 * Data is sent to the .REL file.
1085 fprintf(ofp, " %02X", (*p++)&0xff);
1088 fprintf(ofp, " %03o", (*p++)&0xff);
1091 fprintf(ofp, " %03u", (*p++)&0xff);
1096 /*)Function VOID out_lb(b, t)
1098 * int b assembled data
1099 * int t relocation type
1101 * The function out_lb() copies the assembled data and
1102 * its relocation type to the list data buffers.
1108 * int * cp pointer to assembler output array cb[]
1109 * int * cpt pointer to assembler relocation type
1110 * output array cbt[]
1116 * Pointers to data and relocation buffers incremented by 1.
1123 if (cp < &cb[NCODE]) {
1129 /*)Function VOID out_lw(n, t)
1131 * int n assembled data
1132 * int t relocation type
1134 * The function out_lw() copies the assembled data and
1135 * its relocation type to the list data buffers.
1141 * int * cp pointer to assembler output array cb[]
1142 * int * cpt pointer to assembler relocation type
1143 * output array cbt[]
1149 * Pointers to data and relocation buffers incremented by 2.
1157 out_lb(hibyte(n),t ? t|R_HIGH : 0);
1158 out_lb(lobyte(n),t);
1160 out_lb(lobyte(n),t);
1161 out_lb(hibyte(n),t ? t|R_HIGH : 0);
1165 /*)Function VOID out_l24(n, t)
1167 * int n assembled data
1168 * int t relocation type
1170 * The function out_l24() copies the assembled data and
1171 * its relocation type to the list data buffers.
1177 * int * cp pointer to assembler output array cb[]
1178 * int * cpt pointer to assembler relocation type
1179 * output array cbt[]
1185 * Pointers to data and relocation buffers incremented by 3.
1189 out_l24(int n, int t)
1192 out_lb(byte3(n),t ? t|R_HIGH : 0);
1193 out_lb(hibyte(n),t);
1194 out_lb(lobyte(n),t);
1196 out_lb(lobyte(n),t);
1197 out_lb(hibyte(n),t);
1198 out_lb(byte3(n),t ? t|R_HIGH : 0);
1202 /*)Function VOID out_rw(n)
1206 * The function out_rw() outputs the relocation (R)
1207 * data word as two bytes ordered according to hilo.
1210 * int * relp pointer to rel array
1216 * int lobyte() asout.c
1217 * int hibyte() asout.c
1220 * Pointer to relocation buffer incremented by 2.
1228 *relp++ = hibyte(n);
1229 *relp++ = lobyte(n);
1231 *relp++ = lobyte(n);
1232 *relp++ = hibyte(n);
1236 /*)Function VOID out_tw(n)
1240 * The function out_tw() outputs the text (T)
1241 * data word as two bytes ordered according to hilo.
1244 * int * txtp pointer to txt array
1250 * int lobyte() asout.c
1251 * int hibyte() asout.c
1254 * Pointer to relocation buffer incremented by 2.
1262 *txtp++ = hibyte(n);
1263 *txtp++ = lobyte(n);
1265 *txtp++ = lobyte(n);
1266 *txtp++ = hibyte(n);
1270 /*)Function VOID out_t24(n)
1274 * The function out_t24() outputs the text (T)
1275 * data word as three bytes ordered according to hilo.
1278 * int * txtp pointer to txt array
1284 * int lobyte() asout.c
1285 * int hibyte() asout.c
1288 * Pointer to relocation buffer incremented by 3.
1296 *txtp++ = hibyte(n);
1297 *txtp++ = lobyte(n);
1299 *txtp++ = lobyte(n);
1300 *txtp++ = hibyte(n);
1305 /*)Function int lobyte(n)
1309 * The function lobyte() returns the lower byte of
1331 /*)Function int hibyte(n)
1335 * The function hibyte() returns the higher byte of
1354 return ((n>>8)&0377);
1357 /*)Function int byte3(n)
1361 * The function byte3() returns the MSB of the
1379 return ((n >> 16) & 0xff);
1383 * JLH: Output relocatable 11 bit jump/call
1385 * This function is derived from outrw(), adding the parameter for the
1386 * 11 bit address. This form of address is used only on the 8051 and 8048.
1390 register struct expr *esp;
1397 if (esp->e_flag==0 && esp->e_base.e_ap==NULL) {
1398 /* equated absolute destination. Assume value
1399 * relative to current area */
1400 esp->e_base.e_ap = dot.s_area;
1403 /* Relocatable destination. Build THREE
1404 * byte output: relocatable word, followed
1405 * by op-code. Linker will combine them.
1406 * Listing shows only the address.
1408 r |= R_WORD | esp->e_rlcf;
1409 out_lw(esp->e_addr,r|R_RELOC);
1412 out_tw(esp->e_addr);
1416 n = esp->e_base.e_sp->s_ref;
1419 n = esp->e_base.e_ap->a_ref;
1422 *relp++ = txtp - txt - 3;
1430 * Output relocatable 19 bit jump/call
1432 * This function is derived from outrw(), adding the parameter for the
1433 * 19 bit address. This form of address is used only in the DS80C390
1437 outr19(struct expr * esp, int op, int r)
1442 if (esp->e_flag==0 && esp->e_base.e_ap==NULL) {
1443 /* equated absolute destination. Assume value
1444 * relative to current area */
1445 esp->e_base.e_ap = dot.s_area;
1448 /* Relocatable destination. Build FOUR
1449 * byte output: relocatable 24-bit entity, followed
1450 * by op-code. Linker will combine them.
1451 * Listing shows only the address.
1453 r |= R_WORD | esp->e_rlcf;
1454 out_l24(esp->e_addr,r|R_RELOC);
1457 out_t24(esp->e_addr);
1461 n = esp->e_base.e_sp->s_ref;
1464 n = esp->e_base.e_ap->a_ref;
1467 *relp++ = txtp - txt - 4;