* as/link/lkar.h: sgetl and sputl are independent of endianness
[fw/sdcc] / as / mcs51 / asout.c
index c2ef5bfcca6ea21e32ed28bd106e4734d3ffaff7..3bb683001194542bda2011ce0ea2eb918f4e243b 100644 (file)
@@ -231,7 +231,7 @@ char    *relp = { &rel[0] };
  */
 
 VOID
-outab(b)
+outab(int b)
 {
         if (pass == 2) {
                 out_lb(b,0);
@@ -266,7 +266,7 @@ outab(b)
  */
 
 VOID
-outaw(w)
+outaw(int w)
 {
         if (pass == 2) {
                 out_lw(w,0);
@@ -629,9 +629,7 @@ outr24(struct expr *esp, int r)
  */
 
 VOID
-outdp(carea, esp)
-register struct area *carea;
-register struct expr *esp;
+outdp(register struct area *carea, register struct expr *esp)
 {
         register int n, r;
 
@@ -676,7 +674,7 @@ register struct expr *esp;
  */
 
 VOID
-outall()
+outall(void)
 {
         if (oflag && pass==2)
                 outbuf("R");
@@ -704,7 +702,7 @@ outall()
  */
 
 VOID
-outdot()
+outdot(void)
 {
         if (oflag && pass==2) {
                 fprintf(ofp, "T");
@@ -744,7 +742,7 @@ outdot()
  */
 
 VOID
-outchk(nt, nr)
+outchk(int nt, int nr)
 {
         register struct area *ap;
 
@@ -785,8 +783,7 @@ outchk(nt, nr)
  */
 
 VOID
-outbuf(s)
-char *s;
+outbuf(char *s)
 {
         if (txtp > &txt[2]) {
                 fprintf(ofp, "T");
@@ -843,7 +840,7 @@ char *s;
  */
 
 VOID
-outgsd()
+outgsd(void)
 {
         register struct area *ap;
         register struct sym  *sp;
@@ -964,8 +961,7 @@ outgsd()
  */
 
 VOID
-outarea(ap)
-register struct area *ap;
+outarea(register struct area *ap)
 {
         register char *ptr;
         register int c;
@@ -1012,8 +1008,7 @@ register struct area *ap;
  */
 
 VOID
-outsym(sp)
-register struct sym *sp;
+outsym(register struct sym *sp)
 {
         register char *ptr;
 
@@ -1094,8 +1089,7 @@ out(char *p, int n)
  */
 
 VOID
-out_lb(b,t)
-register int b,t;
+out_lb(register int b, register int t)
 {
         if (cp < &cb[NCODE]) {
                 *cp++ = b;
@@ -1127,8 +1121,7 @@ register int b,t;
  */
 
 VOID
-out_lw(n,t)
-register int n,t;
+out_lw(register int n, register int t)
 {
         if (hilo) {
                 out_lb(hibyte(n),t ? t|R_HIGH : 0);
@@ -1198,8 +1191,7 @@ out_l24(int n, int t)
  */
 
 VOID
-out_rw(n)
-register int n;
+out_rw(register int n)
 {
         if (hilo) {
                 *relp++ = hibyte(n);
@@ -1232,8 +1224,7 @@ register int n;
  */
 
 VOID
-out_tw(n)
-register int n;
+out_tw(register int n)
 {
         if (hilo) {
                 *txtp++ = hibyte(n);
@@ -1300,7 +1291,7 @@ out_t24(int n)
  */
 
 int
-lobyte(n)
+lobyte(int n)
 {
         return (n&0377);
 }
@@ -1326,7 +1317,7 @@ lobyte(n)
  */
 
 int
-hibyte(n)
+hibyte(int n)
 {
         return ((n>>8)&0377);
 }
@@ -1363,41 +1354,48 @@ byte3(int n)
  * 11 bit address.  This form of address is used only on the 8051 and 8048.
  */
 VOID
-outr11(esp, op, r)
-register struct expr *esp;
-int op;
-int r;
+outr11(register struct expr *esp, int op, int r)
 {
         register int n;
 
         if (pass == 2) {
                 if (esp->e_flag==0 && esp->e_base.e_ap==NULL) {
-                        /* equated absolute destination.  Assume value
-                         * relative to current area */
-                        esp->e_base.e_ap = dot.s_area;
-                }
+                        /* Absolute destination.
+                         * Listing shows only the address.
+                         */
+                        out_lw(esp->e_addr,0);
+                        if (oflag) {
+                                outchk(3, 0);
+                                out_tw(esp->e_addr);
+                                *txtp++ = op;
 
-                /* Relocatable destination.  Build THREE
-                 * byte output: relocatable word, followed
-                 * by op-code.  Linker will combine them.
-                 * Listing shows only the address.
-                 */
-                r |= R_WORD | esp->e_rlcf;
-                out_lw(esp->e_addr,r|R_RELOC);
-                if (oflag) {
-                        outchk(3, 5);
-                        out_tw(esp->e_addr);
-                        *txtp++ = op;
+                                write_rmode(r);
+                                *relp++ = txtp - txt - 3;
+                                out_rw(0xFFFF);
+                        }
+                } else {
+                        /* Relocatable destination.  Build THREE
+                         * byte output: relocatable word, followed
+                         * by op-code.  Linker will combine them.
+                         * Listing shows only the address.
+                         */
+                        r |= R_WORD | esp->e_rlcf;
+                        out_lw(esp->e_addr,r|R_RELOC);
+                        if (oflag) {
+                                outchk(3, 5);
+                                out_tw(esp->e_addr);
+                                *txtp++ = op;
 
-                        if (esp->e_flag) {
-                                n = esp->e_base.e_sp->s_ref;
-                                r |= R_SYM;
-                        } else {
-                                n = esp->e_base.e_ap->a_ref;
+                                if (esp->e_flag) {
+                                        n = esp->e_base.e_sp->s_ref;
+                                        r |= R_SYM;
+                                } else {
+                                        n = esp->e_base.e_ap->a_ref;
+                                }
+                                write_rmode(r);
+                                *relp++ = txtp - txt - 3;
+                                out_rw(n);
                         }
-                        write_rmode(r);
-                        *relp++ = txtp - txt - 3;
-                        out_rw(n);
                 }
         }
         dot.s_addr += 2;
@@ -1417,32 +1415,42 @@ outr19(struct expr * esp, int op, int r)
 
         if (pass == 2) {
                 if (esp->e_flag==0 && esp->e_base.e_ap==NULL) {
-                        /* equated absolute destination.  Assume value
-                         * relative to current area */
-                        esp->e_base.e_ap = dot.s_area;
-                }
+                        /* Absolute destination.
+                         * Listing shows only the address.
+                         */
+                        out_lw(esp->e_addr,0);
+                        if (oflag) {
+                                outchk(4, 0);
+                                out_t24(esp->e_addr);
+                                *txtp++ = op;
 
-                /* Relocatable destination.  Build FOUR
-                 * byte output: relocatable 24-bit entity, followed
-                 * by op-code.  Linker will combine them.
-                 * Listing shows only the address.
-                 */
-                r |= R_WORD | esp->e_rlcf;
-                out_l24(esp->e_addr,r|R_RELOC);
-                if (oflag) {
-                        outchk(4, 5);
-                        out_t24(esp->e_addr);
-                        *txtp++ = op;
+                                write_rmode(r);
+                                *relp++ = txtp - txt - 4;
+                                out_rw(0xFFFF);
+                        }
+                } else {
+                        /* Relocatable destination.  Build FOUR
+                         * byte output: relocatable 24-bit entity, followed
+                         * by op-code.  Linker will combine them.
+                         * Listing shows only the address.
+                         */
+                        r |= R_WORD | esp->e_rlcf;
+                        out_l24(esp->e_addr,r|R_RELOC);
+                        if (oflag) {
+                                outchk(4, 5);
+                                out_t24(esp->e_addr);
+                                *txtp++ = op;
 
-                        if (esp->e_flag) {
-                                n = esp->e_base.e_sp->s_ref;
-                                r |= R_SYM;
-                        } else {
-                                n = esp->e_base.e_ap->a_ref;
+                                if (esp->e_flag) {
+                                        n = esp->e_base.e_sp->s_ref;
+                                        r |= R_SYM;
+                                } else {
+                                        n = esp->e_base.e_ap->a_ref;
+                                }
+                                write_rmode(r);
+                                *relp++ = txtp - txt - 4;
+                                out_rw(n);
                         }
-                        write_rmode(r);
-                        *relp++ = txtp - txt - 4;
-                        out_rw(n);
                 }
         }
         dot.s_addr += 3;