Initial revision
authorceriel <none@none>
Thu, 15 Sep 1988 09:49:22 +0000 (09:49 +0000)
committerceriel <none@none>
Thu, 15 Sep 1988 09:49:22 +0000 (09:49 +0000)
14 files changed:
mach/vax4/ce/.distr [new file with mode: 0644]
mach/vax4/ce/EM_table [new file with mode: 0644]
mach/vax4/ce/Make.back [new file with mode: 0644]
mach/vax4/ce/Makefile [new file with mode: 0644]
mach/vax4/ce/as.c [new file with mode: 0644]
mach/vax4/ce/as.h [new file with mode: 0644]
mach/vax4/ce/as_table [new file with mode: 0644]
mach/vax4/ce/do_close.c [new file with mode: 0644]
mach/vax4/ce/do_open.c [new file with mode: 0644]
mach/vax4/ce/end_back.c [new file with mode: 0644]
mach/vax4/ce/mach.c [new file with mode: 0644]
mach/vax4/ce/mach.h [new file with mode: 0644]
mach/vax4/ce/output.c [new file with mode: 0644]
mach/vax4/ce/relocation.c [new file with mode: 0644]

diff --git a/mach/vax4/ce/.distr b/mach/vax4/ce/.distr
new file mode 100644 (file)
index 0000000..98cb628
--- /dev/null
@@ -0,0 +1,13 @@
+EM_table
+Make.back
+Makefile
+as.c
+as.h
+as_table
+do_close.c
+do_open.c
+end_back.c
+mach.c
+mach.h
+output.c
+relocation.c
diff --git a/mach/vax4/ce/EM_table b/mach/vax4/ce/EM_table
new file mode 100644 (file)
index 0000000..fce731c
--- /dev/null
@@ -0,0 +1,729 @@
+/******************************************************************************/
+/*                                                                            */
+/*                     Group 1 : Load instructions                           */
+/*                                                                           */
+/******************************************************************************/
+
+
+C_loc          ==>     "pushl ~$1".
+
+C_ldc          ==>     "movq ~$1, -(sp)".
+
+C_lol          
+       $1 < 0  ==>     "pushl $1(fp)".
+       default         ==>     "pushl $1+4(ap)".
+
+C_loe..                ==>     "pushl $1 + $2". 
+
+C_lil          
+       $1 < 0  ==>     "movl $1(fp), r0";
+                               "pushl (r0)".
+       default         ==>     "movl $1+4(ap), r0";
+                               "pushl (r0)".
+
+C_lof          ==>     "movl (sp)+, r0";
+                       "pushl $1(r0)".
+
+C_lal  
+       $1 < 0  ==>     "pushal $1(fp)".
+       default         ==>     "pushal $1+4(ap)".
+       
+C_lae..                ==>     "pushal $1 + $2".
+
+C_lxl          
+       $1 == 0 ==>     "pushl fp".
+       $1 == 1 ==>     "pushl 4(ap)".
+       default         ==>     "movl ~$1, r0";
+                               "jsb .lxl";
+                               "pushl r0".
+
+C_lxa
+       $1 == 0         ==>     "addl3 ~4, ap, -(sp)".
+       $1 == 1         ==>     "movl 4(ap), r0";
+                               "jsb .lpb";
+                               "pushl r0".
+       default         ==>     "movl ~$1, r0";
+                               "jsb .lxa";
+                               "pushl r0".
+
+C_loi          
+       $1 == 1 ==>     "movl (sp)+, r0";
+                               "clrl -(sp)";
+                               "movb (r0), (sp)".
+       $1 == 2 ==>     "movl (sp)+, r0";
+                               "clrl -(sp)";
+                               "movw (r0), (sp)".
+       $1 == 4 ==>     "movl (sp)+, r0";
+                               "pushl (r0)".
+       $1 == 8 ==>     "movl (sp)+, r0";
+                               "movq (r0), -(sp)".
+       $1 % 4 == 0     ==>     "movl (sp)+, r0";
+                               "movl ~$1/4, r1";
+                               "addl2 ~$1, r0";        
+                               "2:";
+                               "movl -(r0), -(sp)";
+                               "sobgtr r1, 2b".
+       default         ==>     arg_error( "loi", $1).
+
+
+C_los          ==>     "movl ~$1, r0";
+                       "jsb .los".
+
+
+C_los_narg     ==>     "movl (sp)+, r0";
+                       "jsb .los".
+
+C_ldl          
+       $1 < 0  ==>     "movq $1(fp), -(sp)".
+       default         ==>     "movq $1+4(ap), -(sp)".
+
+C_lde..                ==>     "movq $1 + $2, -(sp)".
+               
+C_ldf          ==>     "movl (sp)+, r0";
+                       "movq $1(r0), -(sp)".
+
+C_lpi          ==>     "pushal $1".
+
+
+/******************************************************************************/
+/*                                                                            */
+/*                     Group 2 : Store instructions                          */
+/*                                                                           */
+/******************************************************************************/
+
+C_stl          
+       $1 < 0  ==>     "movl (sp)+, $1(fp)".
+       default         ==>     "movl (sp)+, $1+4(ap)".
+
+C_ste..                ==>     "movl (sp)+, $1 + $2".
+
+C_sil          
+       $1 < 0  ==>     "movl $1(fp) , r0";
+                               "movl (sp)+, (r0)".
+       default         ==>     "movl $1+4(ap), r0";
+                               "movl (sp)+, (r0)".
+
+C_stf          ==>     "movl (sp)+, r0";
+                       "movl (sp)+, $1(r0)".
+
+C_sti          
+                       
+       $1 == 1 ==>     "movl (sp)+, r0";       
+                               "movl (sp)+, r1";
+                               "movb r1, (r0)".
+       $1 == 2 ==>     "movl (sp)+, r0";
+                               "movl (sp)+, r1";
+                               "movw r1, (r0)".
+       $1 == 4 ==>     "movl (sp)+, r0";
+                               "movl (sp)+, (r0)".
+       $1 == 8 ==>     "movl (sp)+, r0";
+                               "movq (sp)+, (r0)".
+       $1 % 4 == 0  ==>        "movl (sp)+, r0";
+                               "movl ~$1/4, r1";
+                               "2:";
+                               "movl (sp)+, (r0)+";
+                               "sobgtr r1, 2b".
+       default         ==>     arg_error( "sti", (arith) $1).
+
+
+C_sts          ==>     "movl ~$1, r0";
+                       "jsb .sts".
+
+C_sts_narg     ==>     "movl (sp)+, r0";
+                       "jsb .sts".
+
+C_sdl          
+       $1 < 0          ==>     "movq (sp)+, $1(fp)".
+       default         ==>     "movq (sp)+, $1+4(ap)".
+
+C_sde..                ==>     "movq (sp)+, $1 + $2".
+
+C_sdf          ==>     "movl (sp)+, r0";
+                       "movq (sp)+, $1(r0)".
+
+/******************************************************************************/
+/*                                                                           */
+/*             Group 3 : Integer arithmetic                                  */
+/*                                                                           */
+/******************************************************************************/
+
+C_adi          
+       $1 == 4 ==>     "addl2 (sp)+, (sp)".
+       default         ==>     arg_error( "adi", $1).
+
+C_sbi
+       $1 == 4 ==>     "subl2 (sp)+, (sp)".
+       default         ==>     arg_error( "sbi", $1).
+
+C_mli
+       $1 == 4 ==>     "mull2 (sp)+, (sp)".
+       default         ==>     arg_error( "mli", $1).
+
+C_dvi          
+       $1 == 4 ==>     "divl2 (sp)+, (sp)".
+       default         ==>     arg_error( "dvi", $1).
+
+C_rmi  
+       $1 == 4 ==>     "divl3 (sp), 4(sp), r0";
+                               "mull2 (sp)+, r0";
+                               "subl2 r0, (sp)".
+       default         ==>     arg_error( "rmi", $1).
+
+C_ngi          
+       $1 == 4 ==>     "mnegl (sp), (sp)".
+       default         ==>     arg_error( "ngi", $1).
+
+
+C_sli          
+       $1 == 4 ==>     "clrl r0";
+                               "cvtlb (sp)+, r0";
+                               "ashl r0, (sp), (sp)".
+       default         ==>     arg_error( "sli", $1).
+
+C_sri          
+       $1 == 4 ==>     "mnegl (sp)+, r0";
+                               "clrl r1";
+                               "cvtlb r0, r1";
+                               "ashl r1, (sp), (sp)".
+       default         ==>     arg_error( "sri", $1).
+
+
+/******************************************************************************/
+/*                                                                           */
+/*             Group 4 : Unsigned arithmetic                                 */
+/*                                                                           */
+/******************************************************************************/
+
+
+C_adu          ==>     C_adi( w).
+
+C_sbu          ==>     C_sbi( w).
+
+C_mlu          ==>     C_mli( w).
+
+C_dvu          
+       $1 == 4 ==>     "jsb .dvu4";
+                               "pushl r0".
+       default         ==>     arg_error( "dvu", $1).
+
+C_rmu          
+       $1 == 4 ==>     "jsb .rmu4";
+                               "pushl r0".
+       default         ==>     arg_error( "rmu", $1).
+
+C_slu          ==>     C_sli( w).
+
+C_sru          ==>     "movl ~$1, r0";
+                       "jsb .sru".
+
+/******************************************************************************/
+/*                                                                           */
+/*             Group 5 : Floating point arithmetic                           */
+/*                                                                           */
+/******************************************************************************/
+
+/******************************************************************************/
+/*                                                                           */
+/*             Group 6 : Pointer arithmetic                                  */
+/*                                                                           */
+/******************************************************************************/
+
+C_adp          ==>     "addl2 ~$1, (sp)".
+
+C_ads
+       $1 == 4 ==>     "addl2 (sp)+, (sp)".
+       default ==>     arg_error( "ads", $1).
+
+C_sbs          
+       $1 == 4 ==>     "subl2 (sp)+, (sp)".
+       default         ==>     arg_error( "sbs", $1).
+
+/******************************************************************************/
+/*                                                                           */
+/*             Group 7 : Increment/decrement/zero                            */
+/*                                                                           */
+/******************************************************************************/
+
+C_inc          ==>     "incl (sp)".
+
+C_inl          
+       $1 < 0  ==>     "incl $1(fp)".
+       default         ==>     "incl $1+4(ap)".
+
+C_ine..                ==>     "incl $1 + $2".
+
+C_dec          ==>     "decl (sp)".
+
+C_del          
+       $1 < 0  ==>     "decl $1(fp)".
+       default         ==>     "decl $1+4(ap)".
+
+C_dee..                ==>     "decl $1 + $2".
+
+C_zrl          
+       $1 < 0  ==>     "clrl $1(fp)".
+       default         ==>     "clrl $1+4(ap)".
+
+C_zre..                ==>     "clrl $1 + $2".
+
+C_zrf
+       $1 == 4 ==>     "clrl -(sp)".
+       $1 == 8 ==>     "clrq -(sp)".
+       default         ==>     arg_error( "zrf", $1).
+
+C_zer
+       $1 == 4 ==>     "clrl -(sp)".
+       $1 == 8 ==>     "clrq -(sp)".
+       default         ==>     "movl ~$1/4, r0";
+                               "1:";
+                               "clrl -(sp)";
+                               "sobgtr r0, 1b".
+
+/******************************************************************************/
+/*                                                                           */
+/*             Group 8 : Convert                                             */
+/*                                                                           */
+/******************************************************************************/
+
+C_cii          ==>     "jsb .cii".
+
+C_cui          ==>     "jsb .cui".
+
+C_cfi          ==>     "jsb .cfi".
+
+C_cif          ==>     "jsb cif".
+
+C_cuf          ==>     "jsb .cuf".
+
+C_cff          ==>     "jsb .cff".
+
+C_ciu          ==>     "jsb .cuu".
+
+C_cuu          ==>     "jsb .cuu ".
+
+C_cfu          ==>     "jsb .cfu".
+
+/******************************************************************************/
+/*                                                                           */
+/*             Group 9 : Logical                                             */
+/*                                                                           */
+/******************************************************************************/
+
+C_and          
+       $1 == 4 ==>     "mcoml (sp), (sp)";
+                               "bicl2 (sp)+, (sp)".
+       default         ==>     "movl ~$1/4, r0";
+                               "addl3 ~$1, sp, r1";
+                               "1:";
+                               "mcoml (sp), (sp)";
+                               "bicl2 (sp)+, (r1)+";
+                               "sobgtr r0, 1b".
+
+C_ior          
+       $1 == 4 ==>     "bisl2 (sp)+, (sp)".
+       default         ==>     "movl ~$1/4, r0";
+                               "addl3 ~$1, sp, r1";
+                               "1:";
+                               "bisl2 (sp)+, (r1)+";
+                               "sobgtr r0, 1b".
+
+C_xor          
+       $1 == 4 ==>     "xorl2 (sp)+, (sp)".
+       default         ==>     "movl ~$1/4, r0";
+                               "addl3 ~$1, sp, r1";
+                               "1:";
+                               "xorl2 (sp)+, (r1)+";
+                               "sobgtr r0, 1b".
+
+C_com  
+       $1 == 4 ==>     "mcoml (sp), (sp)".
+       default         ==>     "movl ~$1, r0";
+                               "jsb .com".
+
+C_rol  
+       $1 == 4 ==>     "clrl r0";
+                               "cvtlb (sp)+, r0";
+                               "rotl r0, (sp), (sp)".
+       default         ==>     arg_error( "rol", $1).
+
+C_ror  
+       $1 == 4 ==>     "mnegl (sp)+, r0";
+                               "clrl r1";
+                               "cvtlb r0, r1";
+                               "rotl r1, (sp), (sp)".
+       default         ==>     arg_error( "rol", $1).
+
+/******************************************************************************/
+/*                                                                           */
+/*             Group 10 : Sets                                               */
+/*                                                                           */
+/******************************************************************************/
+
+C_inn
+       $1 == 4 ==>     "mnegl (sp)+, r0";
+                               "clrl r1";
+                               "cvtlb r0, r1";
+                               "ashl r1, (sp), (sp)";
+                               "bicl2 ~~1, (sp)".
+       default         ==>     "movl ~$1, r0";
+                               "jsb .inn";
+                               "pushl r1".
+
+C_inn_narg     ==>     "movl (sp)+, r0";
+                       "jsb .inn";
+                       "pushl r1".
+  
+C_set
+       $1 == 4 ==>     "clrl r0";
+                               "cvtlb (sp)+, r0";
+                               "ashl r0, ~1, -(sp)".
+       default         ==>     "movl ~$1, r0";
+                               "jsb .setx".
+
+C_set_narg     ==>     "movl (sp)+, r0";
+                       "jsb .setx".
+
+/******************************************************************************/
+/*                                                                           */
+/*             Group 11 : Array                                              */
+/*                                                                           */
+/******************************************************************************/
+
+C_lar          
+       $1 == 4 ==>     "jsb .lar4".
+       default         ==>     "movl ~$1, r0";
+                               "jsb .lar".
+
+C_lar_narg             ==>     "movl (sp)+, r0";
+                               "jsb .lar".
+
+C_sar          
+       $1 == 4 ==>     "jsb .sar4".
+       default         ==>     "movl ~$1, r0";
+                               "jsb .sar".
+
+C_sar_narg     ==>     "movl (sp)+, r0";
+                       "jsb .sar".
+
+C_aar          
+       $1 == 4 ==>     "jsb .aar4";
+                               "pushl r0".
+       default         ==>     "movl ~$1, r0";
+                               "jsb .aar";
+                               "pushl r0".
+
+C_aar_narg     ==>     "movl (sp)+, r0";
+                       "jsb .aar";
+                       "pushl r0".
+
+/******************************************************************************/
+/*                                                                           */
+/*             Group 12 : Compare                                            */
+/*                                                                           */
+/******************************************************************************/
+
+C_cmi          
+       $1 == 4 ==>     /* bug : "subl2 (sp)+, (sp)". */
+                       "clrl r0";
+                       "cmpl (sp)+, (sp)+";
+                       "beql 2f";
+                       "bgtr 1f";
+                       "incl r0";
+                       "br 2f";
+                       "1 : decl r0";
+                       "2 : pushl r0".
+       default         ==>     arg_error( "cmi", $1).
+
+
+C_cmu          
+       $1 == 4 ==>     /* bug : "subl2 (sp)+, (sp)". */
+                       "clrl r0";
+                       "cmpl (sp)+, (sp)+";
+                       "beql 2f";
+                       "bgtru 1f";
+                       "incl r0";
+                       "br 2f";
+                       "1 : decl r0";
+                       "2 : pushl r0".
+       default         ==>     "movl ~$1, r0";
+                               "jsb .cmu";
+                               "pushl r0".
+
+C_cmu_narg     ==>     "movl (sp)+, r0";
+                       "jsb .cmu";
+                       "pushl r0".
+
+C_cms          ==>     "movl ~$1, r0";
+                       "jsb .cms";
+                       "pushl r0".
+
+C_cms_narg     ==>     "movl (sp)+, r0";
+                       "jsb .cms";
+                       "pushl r0".
+
+C_cmp          ==>     /* bug : "subl2 (sp)+, (sp)". */
+                       "clrl r0";
+                       "cmpl (sp)+, (sp)+";
+                       "beql 2f";
+                       "bgtru 1f";
+                       "incl r0";
+                       "br 2f";
+                       "1 : decl r0";
+                       "2 : pushl r0".
+
+C_tlt          ==>     "movl (sp)+, r0";
+                       "movl ~1, -(sp)";
+                       "tstl r0";
+                       "blss 1f";
+                       "clrl (sp)";
+                       "1:".
+
+C_tle          ==>     "movl (sp)+, r0";
+                       "movl ~1, -(sp)";
+                       "tstl r0";
+                       "bleq 1f";
+                       "clrl (sp)";
+                       "1:".
+
+C_teq          ==>     "movl (sp)+, r0";
+                       "movl ~1, -(sp)";
+                       "tstl r0";
+                       "beql 1f";
+                       "clrl (sp)";
+                       "1:".
+
+C_tne          ==>     "movl (sp)+, r0";
+                       "movl ~1, -(sp)";
+                       "tstl r0";
+                       "bneq 1f";
+                       "clrl (sp)";
+                       "1:".
+
+C_tge          ==>     "movl (sp)+, r0";
+                       "movl ~1, -(sp)";
+                       "tstl r0";
+                       "bgeq 1f";
+                       "clrl (sp)";
+                       "1:".
+
+C_tgt          ==>     "movl (sp)+, r0";
+                       "movl ~1, -(sp)";
+                       "tstl r0";
+                       "bgtr 1f";
+                       "clrl (sp)";
+                       "1:".
+
+/******************************************************************************/
+/*                                                                           */
+/*             Group 13 : Branch                                             */
+/*                                                                           */
+/******************************************************************************/
+
+C_bra          ==>     "jmp $1".
+
+C_blt          ==>     "movl (sp)+, r0";
+                       "cmpl (sp)+, r0";
+                       "jlss $1".
+
+C_ble          ==>     "movl (sp)+, r0";
+                       "cmpl (sp)+, r0";
+                       "jleq $1".
+
+C_beq          ==>     "movl (sp)+, r0";
+                       "cmpl (sp)+, r0";
+                       "jeql $1".      
+
+C_bne          ==>     "movl (sp)+, r0";
+                       "cmpl (sp)+, r0";
+                       "jneq $1".
+
+C_bge          ==>     "movl (sp)+, r0";
+                       "cmpl (sp)+, r0";
+                       "jgeq $1".
+
+C_bgt          ==>     "movl (sp)+, r0";
+                       "cmpl (sp)+, r0";
+                       "jgtr $1".
+
+C_zlt          ==>     "tstl (sp)+";
+                       "jlss $1".
+
+C_zle          ==>     "tstl (sp)+";
+                       "jleq $1".
+
+C_zeq          ==>     "tstl (sp)+";
+                       "jeql $1".
+
+C_zne          ==>     "tstl (sp)+";
+                       "jneq $1".
+
+C_zge          ==>     "tstl (sp)+";
+                       "jgeq $1".
+
+C_zgt          ==>     "tstl (sp)+";
+                       "jgtr $1".
+
+
+/******************************************************************************/
+/*                                                                            */
+/*                     Group 14 : Procedure call instructions                */
+/*                                                                           */
+/******************************************************************************/
+
+C_cai          ==>     "movl (sp)+, r0";
+                       "calls ~0, (r0)".
+
+C_cal          ==>     "calls ~0, $1".
+
+C_lfr          
+       $1 == 4 ==>     "pushl r0".
+       $1 == 8 ==>     "movq r0, -(sp)".
+       default         ==>     arg_error( "lfr", $1).
+
+C_ret          
+       $1 == 0 ==>     "ret".
+       $1 == 4 ==>     "movl (sp)+, r0";
+                               "ret".
+       $1 == 8 ==>     "movq (sp)+, r0";
+                               "ret".
+       default         ==>     arg_error( "ret", $1).
+
+/******************************************************************************/
+/*                                                                            */
+/*                     Group 15 : Miscellaneous instructions                 */
+/*                                                                           */
+/******************************************************************************/
+
+C_asp          ==>     "addl2 ~$1, sp".
+
+C_ass          
+       $1 == 4 ==>     "addl2 (sp)+, sp".
+       default         ==>     "movl ~$1, r2";
+                               "jsb .ass".
+
+C_ass_narg     ==>     "movl (sp)+, r2";
+                       "jsb .ass".
+
+C_blm          
+       $1 == 4 ==>     "movl (sp)+, r0";
+                               "movl (sp)+, r1";
+                               "movl (r1), (r0)".
+       $1 == 8 ==>     "movl (sp)+, r0";
+                               "movl (sp)+, r1";
+                               "movq (r1), (r0)".
+       default         ==>     "movl (sp)+, r0";
+                               "movl (sp)+, r1";
+                               "movl ~$1/4, r2";
+                               "1:";
+                               "movl (r1)+, (r0)+";
+                               "sobgtr r2, 1b".
+
+C_bls          
+       $1 == 4 ==>     "movl ~4, r0";
+                               "jsb .bls".
+       default         ==>     arg_error( "bls", $1).
+
+
+C_csa          
+       $1 == 4 ==>     "jmp .csa4".
+       default         ==>     "movl ~$1, r0";
+                               "jmp .csa".
+
+C_csb          
+       $1 == 4 ==>     "jmp .csb4".
+       default         ==>     "movl ~$1, r0";
+                               "jmp .csb".
+
+C_dch          ==>     "movl (sp)+, r0";
+                       "pushl (r0)".
+
+C_dup          
+       $1 == 4 ==>     "pushl (sp)".
+       $1 == 8 ==>     "movq (sp), -(sp)".
+       default         ==>     "movl ~$1/4, r0";
+                               "addl3 ~$1, sp, r1";
+                               "1:";
+                               "movl -(r1), -(sp)";
+                               "sobgtr r0, 1b".
+
+C_dus          
+       $1 == 4 ==>     "movl (sp)+, r0";
+                               "addl3 r0, sp, r1";
+                               "ashl ~-2, r0, r0";
+                               "1:";
+                               "movl -(r1), -(sp)";
+                               "sobgtr r0, 1b".
+       default         ==>     arg_error( "dus", $1).
+
+C_exg          ==>     "movl ~$1, r0";
+                       "jsb .exg".
+
+C_fil..                ==>     "moval $1 + $2, hol0 + 4".
+
+C_gto..                ==>     "pushal $1+$2";
+                       "jmp .gto".
+
+C_lim          ==>     "movl .trpim, -(sp)".
+
+C_lin          ==>     "movl ~$1, hol0".
+
+C_lni          ==>     "incl hol0".
+
+C_lor
+       $1 == 0 ==>     "pushl fp".
+       $1 == 1 ==>     "pushl sp".
+       $1 == 2 ==>     "pushl .reghp".
+       default         ==>     arg_error( "lor", $1).
+
+C_lpb          ==>     "movl (sp)+, r0";
+                       "jsb .lpb";
+                       "pushl r0".
+
+C_mon          ==>     "jsb .mon".
+
+C_nop          ==>     .
+
+C_rck          
+       $1 == 4 ==>     "jsb .rck4".
+       default         ==>     "movl ~$1, r0";
+                               "jsb .rck".
+
+C_rck_narg     ==>     "movl (sp)+, r0";
+                       "jsb .rck".
+
+C_rtt          ==>     "ret".
+
+C_sig          ==>     "jsb .sig".
+
+C_sim          ==>     "jsb .sim".
+
+C_str
+       $1 == 0 ==>     "movl (sp)+, fp".
+       $1 == 1 ==>     "movl (sp)+, sp".
+       $1 == 2 ==>     "jsb .strhp".
+       default         ==>     arg_error( "str", $1).
+
+C_trp          ==>     "jsb .trp".
+
+/*****************************************************************************/
+
+..icon $2 == 1  ==>    gen1( (char) atoi( $1)).
+       $2 == 2  ==> gen2( (short) atoi( $1)).
+       $2 == 4  ==> gen4( (long) atol( $1)).
+       default     ==> arg_error( "icon", $2).
+..ucon $2 == 1  ==>    gen1( (char) atoi( $1)).
+       $2 == 2  ==> gen2( (short) atoi( $1)).
+       $2 == 4  ==> gen4( (long) atol( $1)).
+       default     ==> arg_error( "icon", $2).
+
+/*****************************************************************************/
+
+prolog         ==>             text2( 0x0).
+
+jump           ==>             "jmp $1".
+
+locals         
+  $1 == 0      ==>             .
+  $1 == 4       ==>             "clrq -(sp)".
+  $1 == 8       ==>             "clrq -(sp)".
+  default      ==>             "subl2 ~$1, sp".
diff --git a/mach/vax4/ce/Make.back b/mach/vax4/ce/Make.back
new file mode 100644 (file)
index 0000000..8ec23d6
--- /dev/null
@@ -0,0 +1,103 @@
+EMHOME=../../../..
+CEG=$(EMHOME)/lib/ceg
+SOURCE=$(CEG)/ce_back/obj_back
+CFLAGS=-O
+CC=cc
+
+IDIRS=-I.\
+      -I..\
+      -I$(EMHOME)/h\
+      -I$(EMHOME)/modules/h
+
+all : data.o con2.o con4.o relocation.o end_back.o gen1.o gen2.o\
+      gen4.o init_back.o mysprint.o output.o reloc1.o reloc2.o reloc4.o\
+      rom2.o rom4.o set_global.o set_local.o switchseg.o symboldef.o text2.o\
+      text4.o do_open.o do_close.o memory.o label.o misc.o extnd.o symtable.o
+
+data.o : data.h back.h header.h $(SOURCE)/data.c
+       $(CC) $(CFLAGS) -c $(IDIRS) $(SOURCE)/data.c
+
+memory.o :data.h  back.h header.h $(SOURCE)/memory.c
+       $(CC) $(CFLAGS) -c $(IDIRS) $(SOURCE)/memory.c
+
+con2.o : data.h back.h header.h $(SOURCE)/con2.c
+       $(CC) $(CFLAGS) -c $(IDIRS) $(SOURCE)/con2.c
+
+con4.o : data.h back.h header.h $(SOURCE)/con4.c
+       $(CC) $(CFLAGS) -c $(IDIRS) $(SOURCE)/con4.c
+
+relocation.o : data.h back.h ../mach.h ../relocation.c
+       $(CC) $(CFLAGS) -c $(IDIRS) -I.. ../relocation.c
+
+do_open.o : data.h back.h ../mach.h ../do_open.c
+       $(CC) $(CFLAGS) -c $(IDIRS) -I.. ../do_open.c
+
+do_close.o : data.h back.h ../mach.h ../do_close.c
+       $(CC) $(CFLAGS) -c $(IDIRS) -I.. ../do_close.c
+
+gen1.o : data.h back.h header.h $(SOURCE)/gen1.c
+       $(CC) $(CFLAGS) -c $(IDIRS) $(SOURCE)/gen1.c
+
+gen2.o : data.h back.h header.h $(SOURCE)/gen2.c
+       $(CC) $(CFLAGS) -c $(IDIRS) $(SOURCE)/gen2.c
+
+gen4.o : data.h back.h header.h $(SOURCE)/gen4.c
+       $(CC) $(CFLAGS) -c $(IDIRS) $(SOURCE)/gen4.c
+
+init_back.o : data.h back.h ../mach.h $(SOURCE)/init_back.c
+       $(CC) $(CFLAGS) -c $(IDIRS) -I.. $(SOURCE)/init_back.c
+
+end_back.o : data.h back.h ../mach.h ../end_back.c
+       $(CC) $(CFLAGS) -c $(IDIRS) -I.. ../end_back.c
+
+mysprint.o : data.h back.h data.h $(SOURCE)/mysprint.c
+       $(CC) $(CFLAGS) -c $(IDIRS) $(SOURCE)/mysprint.c
+
+output.o : data.h back.h ../mach.h ../output.c
+       $(CC) $(CFLAGS) -c $(IDIRS) -I.. ../output.c
+
+reloc1.o : data.h back.h header.h $(SOURCE)/reloc1.c
+       $(CC) $(CFLAGS) -c $(IDIRS) $(SOURCE)/reloc1.c
+
+reloc2.o : data.h back.h header.h $(SOURCE)/reloc2.c
+       $(CC) $(CFLAGS) -c $(IDIRS) $(SOURCE)/reloc2.c
+
+reloc4.o : data.h back.h header.h $(SOURCE)/reloc4.c
+       $(CC) $(CFLAGS) -c $(IDIRS) $(SOURCE)/reloc4.c
+
+rom2.o : data.h back.h header.h $(SOURCE)/rom2.c
+       $(CC) $(CFLAGS) -c $(IDIRS) $(SOURCE)/rom2.c
+
+rom4.o : data.h back.h header.h $(SOURCE)/rom4.c
+       $(CC) $(CFLAGS) -c $(IDIRS) $(SOURCE)/rom4.c
+
+set_global.o : data.h back.h ../mach.h $(SOURCE)/set_global.c
+       $(CC) $(CFLAGS) -c $(IDIRS) -I.. $(SOURCE)/set_global.c
+
+set_local.o : data.h back.h ../mach.h $(SOURCE)/set_local.c
+       $(CC) $(CFLAGS) -c $(IDIRS) -I.. $(SOURCE)/set_local.c
+
+switchseg.o : data.h back.h ../mach.h $(SOURCE)/switchseg.c
+       $(CC) $(CFLAGS) -c $(IDIRS) -I.. $(SOURCE)/switchseg.c
+
+symboldef.o : data.h back.h ../mach.h $(SOURCE)/symboldef.c
+       $(CC) $(CFLAGS) -c $(IDIRS) -I.. $(SOURCE)/symboldef.c
+
+text2.o : data.h back.h ../mach.h $(SOURCE)/text2.c
+       $(CC) $(CFLAGS) -c $(IDIRS) -I.. $(SOURCE)/text2.c
+
+text4.o : data.h back.h ../mach.h $(SOURCE)/text4.c
+       $(CC) $(CFLAGS) -c $(IDIRS) -I.. $(SOURCE)/text4.c
+
+symtable.o : data.h back.h ../mach.h $(SOURCE)/symtable.c
+       $(CC) $(CFLAGS) -c $(IDIRS) -I.. $(SOURCE)/symtable.c
+
+extnd.o : data.h back.h ../mach.h $(SOURCE)/extnd.c
+       $(CC) $(CFLAGS) -c $(IDIRS) -I.. $(SOURCE)/extnd.c
+
+misc.o : data.h back.h ../mach.h $(SOURCE)/misc.c
+       $(CC) $(CFLAGS) -c $(IDIRS) -I.. $(SOURCE)/misc.c
+
+label.o : data.h back.h ../mach.h $(SOURCE)/label.c
+       $(CC) $(CFLAGS) -c $(IDIRS) -I.. $(SOURCE)/label.c
+
diff --git a/mach/vax4/ce/Makefile b/mach/vax4/ce/Makefile
new file mode 100644 (file)
index 0000000..7e63275
--- /dev/null
@@ -0,0 +1,16 @@
+EMHOME=../../..
+BACK=$(EMHOME)/lib/ceg/ce_back
+
+install : back.a
+       install_ceg
+
+clean:
+       rm -rf back.a back
+
+back.a :
+       -mkdir back
+       cp $(BACK)/obj_back/*h back
+       cp Make.back back/Makefile
+       ( cd back; make)
+       ar r back.a back/*o;
+       -ranlib back.a
diff --git a/mach/vax4/ce/as.c b/mach/vax4/ce/as.c
new file mode 100644 (file)
index 0000000..89a3a93
--- /dev/null
@@ -0,0 +1,245 @@
+#include <ctype.h>
+#include "as.h"
+
+#define DOLLAR  '$'
+#define        LEFT    '('      
+#define RIGHT   ')'
+
+
+/*****************************************************************************/
+
+/* Een constraint-function */
+
+const( arg)
+struct t_operand *arg;
+{
+       return( arg->type == CONST);
+}
+
+
+/*****************************************************************************/
+
+
+/*    decode_operand() recognizes the follwing assembly-argumnets:
+       $const                  : CONST
+       register                : REGISTER
+       -(register)             : AUTO_DEC
+       (register)+             : AUTO_INC
+        (register)             : REG_DEF
+       index(register)         : IND_REG
+       label+offset            : LABEL
+       label[b|f]              : L_ILB
+ */
+
+
+/* An assembly instruction has at most 5 arguments.
+ * This is for the time being.
+ */
+
+char lab_buf[4][256],
+     ind_buf[4][256],
+     *match(), *lab(), *ind(), *end_arg();
+
+static int n_index = -1;
+
+
+process_label( l)
+char *l;
+{
+}
+
+
+process_mnemonic( m)
+char *m;
+{
+}
+
+
+process_operand( arg, op)
+char *arg;
+struct t_operand *op;
+{
+       char *einde;
+
+       if ( n_index == 3) 
+               n_index = 0;
+       else
+               n_index++;
+
+       if  ( arg[0] == '~' ) {
+               op->type = CONST;
+               op->const = arg+1;
+       }
+       else if ( is_reg( arg, &(op->num)) ) {
+               op->type = REGISTER;
+       }
+       else if ((arg[0]=='-') && (arg[1] == LEFT) && 
+                               is_reg( arg+2,&(op->num))) {
+               op->type = AUTO_DEC;
+       }
+       else if( ( arg[0] == LEFT) && is_reg( arg+1, &(op->num))) {
+               arg = match( arg, RIGHT);
+               if ( *(arg+1) == '+') 
+                       op->type = AUTO_INC;
+               else
+                       op->type = REG_DEF;
+       }
+       else  { 
+               einde = end_arg( arg);
+               if ( (*einde == 'b' || *einde == 'f') && isdigit( *(einde-1))) {
+                       *einde = '\0';
+                       op->type = L_ILB;
+                       op->offset = "0";
+                       op->lab = arg;
+               }
+               else if ( *einde == RIGHT) {
+                       op->type = IND_REG;
+                       arg = ind( ind_buf[ n_index], arg);
+                       if ( is_reg( arg+1, &(op->num)))
+                               op->index = ind_buf[ n_index];
+                       else
+                               fprint( STDERR, "unknown argtype %s\n", arg);
+               }
+               else {
+                       op->type = LABEL;
+                       arg = lab( lab_buf[ n_index], arg);
+                       op->lab = lab_buf[ n_index];
+                       if ( *arg == '\0') 
+                               op->offset = "0";
+                       else 
+                               op->offset = arg+1; 
+               }
+
+       }       
+}
+
+
+char *ind( buf, str)
+char *buf, *str;
+
+/* Reads the index in front of '(register)'.
+ */
+{
+       while ( *str != LEFT) 
+               *buf++ = *str++;
+       *buf = '\0';
+       return( str);
+}
+
+
+char *lab( buf, str)
+char *buf, *str;
+
+/* Reads 'label' in front of '+offset'.
+ */
+{
+       while ( ( *str != '+') && ( *str != '\0'))
+               *buf++ = *str++;
+       *buf = '\0';
+       while ( isspace( *(buf-1)) ) {
+               *(buf-1) = '\0';
+               buf--;
+       }
+       return( str);
+}
+       
+
+int is_reg( str, num)
+char *str;
+int *num; 
+
+/* Is "str" a 'registers' ?
+ */
+{
+       if ( ( *str == 'a') && ( *(str+1) == 'p')) {
+               *num = 12;
+               return( TRUE);
+       }
+       else if ( ( *str == 'f') && ( *(str+1) == 'p')) {
+               *num = 13;
+               return( TRUE);
+       }
+       else if ( ( *str == 's') && ( *(str+1) == 'p')) {
+               *num = 14;
+               return( TRUE);
+       }
+       if ( *str == 'r') {
+               if ( isdigit( *(str+1)) &&  isdigit( *(str+2))) {
+                       *num = ( *(str+1) - '0') * 10 + *(str+2) - '0';
+                       return( TRUE);
+               }
+               else if ( isdigit( *(str+1))) {
+                       *num = *(str+1) - '0';
+                       return( TRUE);
+               }
+               else 
+                    return( FALSE);
+       }       
+       return( FALSE);
+}
+
+
+char *end_arg( str)
+char *str;
+
+/* Shift to the last character of "str".
+ */
+{
+       while ( *str != '\0')
+               str++;
+       return( str-1);
+}
+
+
+char *match( str, sym)
+char *str, sym;
+{
+       while ( *str != sym)
+               str++;
+       return( str);
+}
+
+
+/******************************************************************************/
+
+char my_buf[256];
+
+gen_operand( op)
+struct t_operand *op;
+
+/* Generate object-code for a argument.
+ */
+{
+       switch( op->type) {
+               case CONST :    @text1( 0x8f);
+                               @text4( %$(op->const));
+                               break;
+               case REGISTER:  @text1( %d(0x50 | op->num));
+                               break;
+               case REG_DEF :  @text1( %d(0x60 | op->num));
+                               break;
+               case AUTO_DEC : @text1( %d(0x70 | op->num));
+                               break;
+               case AUTO_INC : @text1( %d(0x80 | op->num));
+                               break;
+               case IND_REG :  @text1( %d(0xe0 | op->num));
+                               @text4( %$(op->index));
+                               break;
+               case LABEL :    @text1( 0xef);
+                               if ( strindex( op->lab, DOLLAR)) {
+                       @reloc4( %$(op->lab), %$(op->offset), PC_REL);
+                               }
+                               else if ( strindex( op->lab, LEFT)) {
+                       @reloc4( %$(op->lab), %$(op->offset), PC_REL);
+                               }
+                               else {
+                                       sprint( my_buf, "\"%s\"", op->lab);
+                               @reloc4( %$(my_buf), %$(op->offset) , PC_REL);
+                               }
+                               break;
+               case L_ILB :    @text1( %dist( op->lab));
+                               break;
+               default : fprint( STDERR, "error");
+       }
+}
diff --git a/mach/vax4/ce/as.h b/mach/vax4/ce/as.h
new file mode 100644 (file)
index 0000000..b50763e
--- /dev/null
@@ -0,0 +1,25 @@
+/* When generating assembly : */
+
+#define        ARITH_FMT       "%ld"
+#define        INT_FMT         "%d"
+
+/* When generating object code : */
+
+#define                CONST           0
+#define                REGISTER        1
+#define                AUTO_DEC        2
+#define                AUTO_INC        3
+#define                REG_DEF         4
+#define                IND_REG         5
+#define                LABEL           6
+#define                L_ILB           7
+
+#define                TRUE            1
+#define                FALSE           0
+
+#define                PC_REL          1
+
+struct t_operand {
+               int type, num;
+               char *lab, *index, *const, *offset;
+       };
diff --git a/mach/vax4/ce/as_table b/mach/vax4/ce/as_table
new file mode 100644 (file)
index 0000000..6602679
--- /dev/null
@@ -0,0 +1,232 @@
+addl2  src, dst        ==>
+                       @text1( 0xc0);
+                       gen_operand( src);
+                       gen_operand( dst).
+
+addl3  src1, src2, dst ==>
+                       @text1( 0xc1);
+                       gen_operand( src1);
+                       gen_operand( src2);
+                       gen_operand( dst).
+
+ashl   src1, src2, dst ==>
+                       @text1( 0x78);
+                       gen_operand( src1);
+                       gen_operand( src2);
+                       gen_operand( dst).
+
+beql   l_ilb           ==>
+                       @text1( 0x13);
+                       gen_operand( l_ilb).
+
+jeql   ilb             ==>
+                       @text1( 0x12);
+                       @text1( 0x06);
+                       @text1( 0x17);
+                       gen_operand( ilb).
+
+bgeq   l_ilb           ==>
+                       @text1( 0x18);
+                       gen_operand( l_ilb).
+
+jgeq   ilb             ==>
+                       @text1( 0x19);
+                       @text1( 0x06);
+                       @text1( 0x17);
+                       gen_operand( ilb).
+
+bgtr   l_ilb           ==>
+                       @text1( 0x14);
+                       gen_operand( l_ilb).
+
+bgtru  l_ilb           ==>
+                       @text1( 0x1a);
+                       gen_operand( l_ilb).
+
+jgtr   ilb             ==>
+                       @text1( 0x15);
+                       @text1( 0x06);
+                       @text1( 0x17);
+                       gen_operand( ilb).
+
+bicl2  src, dst        ==>
+                       @text1( 0xca);
+                       gen_operand( src);
+                       gen_operand( dst).
+
+bisl2  src, dst        ==>
+                       @text1( 0xc8);
+                       gen_operand( src);
+                       gen_operand( dst).
+
+bleq   l_ilb           ==>
+                       @text1( 0x15);
+                       gen_operand( l_ilb).
+
+jleq   ilb             ==>
+                       @text1( 0x14);
+                       @text1( 0x06);
+                       @text1( 0x17);
+                       gen_operand( ilb).
+
+blss   l_ilb           ==>
+                       @text1( 0x19);
+                       gen_operand( l_ilb).
+
+blssu  l_ilb           ==>
+                       @text1( 0x1f);
+                       gen_operand( l_ilb).
+
+jlss   ilb             ==>
+                       @text1( 0x18);
+                       @text1( 0x06);
+                       @text1( 0x17);
+                       gen_operand( ilb).
+
+bneq   l_ilb           ==>
+                       @text1( 0x12);
+                       gen_operand( l_ilb).
+
+jneq   ilb             ==>
+                       @text1( 0x13);
+                       @text1( 0x06);
+                       @text1( 0x17);
+                       gen_operand( ilb).
+
+br     l_ilb           ==>
+                       @text1( 0x11);
+                       gen_operand( l_ilb).
+
+calls  n : const , pro ==>
+                       @text1( 0xfb);
+                       @text1( %$(n->const));
+                       gen_operand( pro).
+
+clrl   src             ==>
+                       @text1( 0xd4);
+                       gen_operand( src).
+
+clrq   src             ==>
+                       @text1( 0x7c);
+                       gen_operand( src).
+
+cmpl   src, dest       ==>
+                       @text1( 0xd1);
+                       gen_operand( src);
+                       gen_operand( dest).
+
+cvtlb  src, dst        ==>
+                       @text1( 0xf6);
+                       gen_operand( src);
+                       gen_operand( dst).
+
+decl   src             ==>
+                       @text1( 0xd7);
+                       gen_operand( src).
+
+divl2  src, dst        ==>
+                       @text1( 0xc6);
+                       gen_operand( src);
+                       gen_operand( dst).
+
+divl3  src1, src2, dst ==>
+                       @text1( 0xc7);
+                       gen_operand( src1);
+                       gen_operand( src2);
+                       gen_operand( dst).
+
+incl   src             ==>
+                       @text1( 0xd6);
+                       gen_operand( src).
+
+jmp    ilb4            ==>
+                       @text1( 0x17);
+                       gen_operand( ilb4).
+
+jsb    lab             ==>
+                       @text1( 0x16);
+                       gen_operand( lab).
+
+mcoml  src, dst        ==>
+                       @text1( 0xd2);
+                       gen_operand( src);
+                       gen_operand( dst).
+
+mnegl  src, dst        ==>
+                       @text1( 0xce);
+                       gen_operand( src);
+                       gen_operand( dst).
+
+moval  src, dst        ==>
+                       @text1( 0xde);
+                       gen_operand( src);
+                       gen_operand( dst).
+
+movb   src, dst        ==>
+                       @text1( 0x90);
+                       gen_operand( src);
+                       gen_operand( dst).
+
+movw   src, dst        ==>
+                       @text1( 0xb0);
+                       gen_operand( src);
+                       gen_operand( dst).
+
+movl   src, dst        ==>
+                       @text1( 0xd0);
+                       gen_operand( src);
+                       gen_operand( dst).
+
+movq   src : const, dst        ==>
+                       @text1( 0x7d);
+                       gen_operand( src);
+                       @text4( 0);
+                       gen_operand( dst).
+
+...    src , dst       ==>
+                       @text1( 0x7d);
+                       gen_operand( src);
+                       gen_operand( dst).
+
+
+mull2  src, dst        ==>
+                       @text1( 0xc4);
+                       gen_operand( src);
+                       gen_operand( dst).
+
+pushl  src     ==>     
+                       @text1( 0xdd);
+                       gen_operand( src).
+
+pushal src     ==>     
+                       @text1( 0xdf);
+                       gen_operand( src).
+
+ret    ==>
+                       @text1( 0x04).
+
+rotl   src1, src2, dst ==>
+                       @text1( 0x9c);
+                       gen_operand( src1);
+                       gen_operand( src2);
+                       gen_operand( dst).
+
+sobgtr  tel, ilb       ==>
+                       @text1( 0xf5);
+                       gen_operand( tel);
+                       gen_operand( ilb).
+
+subl2  src, dst        ==>
+                       @text1( 0xc2);
+                       gen_operand( src);
+                       gen_operand( dst).
+
+tstl   src             ==>
+                       @text1( 0xd5);
+                       gen_operand( src).
+
+xorl2  src, dst        ==>
+                       @text1( 0xcc);
+                       gen_operand( src);
+                       gen_operand( dst).
+
diff --git a/mach/vax4/ce/do_close.c b/mach/vax4/ce/do_close.c
new file mode 100644 (file)
index 0000000..5bb0fbd
--- /dev/null
@@ -0,0 +1,8 @@
+#include <system.h>
+
+extern File *out_file;
+
+do_close()
+{
+       sys_close( out_file);
+}
diff --git a/mach/vax4/ce/do_open.c b/mach/vax4/ce/do_open.c
new file mode 100644 (file)
index 0000000..83f529a
--- /dev/null
@@ -0,0 +1,13 @@
+#include <system.h>
+
+File *out_file;
+
+do_open( filename)
+char *filename;
+{
+       if ( filename == (char *) '\0')
+               return( 0);
+       else
+               return( sys_open( filename, OP_WRITE, &out_file));
+}
+
diff --git a/mach/vax4/ce/end_back.c b/mach/vax4/ce/end_back.c
new file mode 100644 (file)
index 0000000..60d42a1
--- /dev/null
@@ -0,0 +1,22 @@
+#include <out.h>
+#include "mach.h"
+#include "data.h"
+#include "back.h"
+#include "header.h"
+
+
+end_back()
+{
+       sync();                 
+       do_local_relocation();
+       output();
+}
+
+
+sync()
+{
+       while ( ( text - text_area) % EM_WSIZE != 0 ) 
+               text1( '\0');
+       while ( ( data - data_area) % EM_WSIZE != 0 )
+               con1( '\0');
+}
diff --git a/mach/vax4/ce/mach.c b/mach/vax4/ce/mach.c
new file mode 100644 (file)
index 0000000..5598352
--- /dev/null
@@ -0,0 +1,12 @@
+#include <system.h>
+#include <em.h>
+#include <out.h>
+#include "mach.h"
+#include "back.h"
+
+arg_error( s, arg)
+char *s;
+int arg;
+{
+       fprint( STDERR, "arg_error %s %d\n", s, arg);
+}
diff --git a/mach/vax4/ce/mach.h b/mach/vax4/ce/mach.h
new file mode 100644 (file)
index 0000000..f19995e
--- /dev/null
@@ -0,0 +1,36 @@
+#define        ONE_BYTE        char
+#define TWO_BYTES      short
+#define FOUR_BYTES     long
+
+#define EM_WSIZE       4
+#define EM_PSIZE       4
+#define EM_BSIZE       0
+
+#define        BSS_INIT        0
+
+#define NAME_FMT       "_%s"
+#define DNAM_FMT       "_%s"
+#define DLB_FMT                "_%ld"
+#define        ILB_FMT         "I%03d%ld"
+#define HOL_FMT                "hol%d"
+
+
+#define ALIGN_FMT       ""
+
+#define        BYTE_FMT                ".byte %ld\n"
+#define        WORD_FMT                ".word %ld\n"
+#define        LONG_FMT                ".long %ld\n"
+#define        BSS_FMT                 ".space %ld\n"
+
+#define        SEGTXT_FMT              ".text\n"
+#define        SEGDAT_FMT              ".data\n"
+#define        SEGBSS_FMT              ".data\n"
+
+#define        SYMBOL_DEF_FMT          "%s :"
+#define        GLOBAL_FMT              ".globl %s\n"
+#define        LOCAL_FMT               ""
+
+#define        RELOC1_FMT              ".byte %s + %ld\n"
+#define        RELOC2_FMT              ".word %s + %ld\n"
+#define        RELOC4_FMT              ".long %s + %ld\n"
diff --git a/mach/vax4/ce/output.c b/mach/vax4/ce/output.c
new file mode 100644 (file)
index 0000000..34f98ee
--- /dev/null
@@ -0,0 +1,207 @@
+#include <system.h>
+#include <em.h>
+#include <out.h>
+#include "mach.h"
+#include "back.h"
+#include "data.h"
+
+extern File *out_file;
+
+/* This program converts an ACK a.out format to A BSD4.1 a.out.
+ * It is written for the a.out's generated by a code expander. So be
+ * carefull it is not very powerfull.
+ */
+
+
+#include <a.out.h>
+
+struct exec u_header;
+struct relocation_info u_reloc;
+struct nlist u_name;
+
+long ntext, ndata, nrelo, nchar, base_address();
+int trsize=0, drsize=0;
+
+output()
+{
+       register int i;
+
+       init_unixheader();
+
+       putbuf( (char *) &u_header, 32);
+       putbuf( (char *) text_area,  ntext);
+       putbuf( (char *) data_area, ndata);
+       
+       for (i = 0; i < nrelo; i++) {
+               if (  ( reloc_info[i].or_sect-S_MIN) == SEGTXT) {
+                       convert_reloc( &reloc_info[i], &u_reloc);
+                       putbuf((char *) &u_reloc, 8);
+               }
+       }
+       for (i = 0; i < nrelo; i++) {
+               if  (( reloc_info[i].or_sect-S_MIN) != SEGTXT) {
+                       convert_reloc( &reloc_info[i], &u_reloc);
+                       putbuf((char *) &u_reloc, 8);
+               }
+       }
+
+       for (i = 0; i < nname ; i++) { /* The segment names can be omitted */
+               convert_name( &symbol_table[i], &u_name);
+               putbuf((char *) &u_name, 12);
+       }
+
+       /* print( "size string_area %d\n", nchar); */
+
+       put_stringtablesize( nchar + 4);
+       putbuf((char *) string_area, nchar);
+}
+
+
+init_unixheader()
+{
+       register int i;
+
+       for ( i = 0; i < (relo - reloc_info); i++) 
+               if ( ( reloc_info[ i].or_sect - S_MIN) == SEGTXT)
+                       trsize++;
+               else
+                       drsize++;
+
+       ntext = text - text_area;
+       ndata = data - data_area;
+       nchar = string - string_area;
+       nrelo = relo - reloc_info;
+
+       u_header.a_magic = OMAGIC;
+       u_header.a_text = ntext;
+       u_header.a_data = ndata;
+       u_header.a_bss = nbss;
+       u_header.a_syms = nname * 12;
+       u_header.a_entry = 0;
+       u_header.a_trsize = trsize * 8;
+       u_header.a_drsize = drsize * 8;
+       /* print( "header %o %d %d %d %d %d %d %d\n",
+               u_header.a_magic, u_header.a_text, u_header.a_data,
+               u_header.a_bss, u_header.a_syms, u_header.a_entry,
+               u_header.a_trsize, u_header.a_drsize);
+        */
+}
+
+convert_reloc( a_relo, u_relo)
+struct outrelo *a_relo;
+struct relocation_info *u_relo;
+{
+       u_relo->r_address = a_relo->or_addr;
+       u_relo->r_symbolnum = a_relo->or_nami;
+       u_relo->r_pcrel = (a_relo->or_type & RELPC) >> 3;
+       u_relo->r_length = convert_length( (a_relo->or_type) & RELSZ);
+       if ( symbol_table[ a_relo->or_nami].on_valu == -1) 
+               u_relo->r_extern = 1;
+       else  
+               u_relo->r_extern = 0;
+       if ( symbol_table[ a_relo->or_nami].on_valu != -1) {
+               switch ( (symbol_table[ a_relo->or_nami].on_type & S_TYP) - S_MIN) {
+                       case SEGTXT : u_relo->r_symbolnum = N_TEXT;
+                                     break;
+                       case SEGCON : u_relo->r_symbolnum = N_DATA;
+                                     break;
+                       case SEGBSS : u_relo->r_symbolnum = N_BSS;
+                                     break;
+                       default : fprint( STDERR, 
+                                          "convert_relo(): bad segment %d\n",
+                           (symbol_table[ a_relo->or_nami].on_type & S_TYP) - S_MIN);
+               }
+       }
+}
+
+
+int convert_length( length)
+int length;
+{
+       if ( length & RELO1)
+               return( 0);
+       else if ( length & RELO2)
+               return( 1);
+       else if ( length & RELO4)
+               return( 2);
+       else
+               fprint( STDERR, "convert_length(): size is impossible %d\n",
+                       length);
+}
+
+#define        n_mptr          n_un.n_name
+#define        n_str           n_un.n_strx
+
+
+convert_name( a_name, u_name)
+struct outname *a_name;
+struct nlist *u_name;
+{
+       /* print( "naam is %s\n", a_name->on_foff + string_area);   */
+
+       u_name->n_str = a_name->on_foff + 4;
+       fill_type( &(u_name->n_type), &(a_name->on_type), a_name->on_valu);
+       u_name->n_other = '\0';
+       u_name->n_desc = 0;
+       if ( a_name->on_valu != -1) 
+               u_name->n_value = a_name->on_valu + 
+                       base_address( ( a_name->on_type & S_TYP) - S_MIN);
+       else 
+                u_name->n_value = 0;
+}
+
+
+fill_type( u_type, a_type, valu)
+unsigned char *u_type;
+ushort *a_type;
+long valu; 
+{
+       int sect;
+
+       *u_type = '\0';
+       *u_type |= ( *a_type & S_EXT) ? N_EXT : N_UNDF;
+
+       if ( valu != -1) {
+               sect = ( *a_type & S_TYP ) - S_MIN;
+               switch ( sect) {
+                       case SEGTXT: *u_type |= N_TEXT;
+                                    break;
+                       case SEGCON : *u_type |= N_DATA;
+                                     break;
+                       case SEGBSS : *u_type |= N_BSS;
+                                     break;
+                       default: fprint(STDERR, 
+                                       "fill_type() : bad section %d\n", sect);
+               }
+       }
+}
+
+
+long base_address( seg)
+int seg;
+{
+       switch ( seg) {
+               case SEGTXT : return( 0);
+                             break;
+               case SEGCON : return( text - text_area);
+                             break;
+               case SEGBSS : return( text - text_area + data - data_area);
+                             break;
+               default : fprint( STDERR,
+                       "base_adres() : bad section %d\n", seg);
+       }
+}
+
+put_stringtablesize( n)
+int n;
+{
+       putbuf( (char *)&n, 4);
+}
+
+
+putbuf(buf,n)
+char *buf;
+long n;
+{
+       sys_write( out_file, buf, n);
+}
diff --git a/mach/vax4/ce/relocation.c b/mach/vax4/ce/relocation.c
new file mode 100644 (file)
index 0000000..ab4b44f
--- /dev/null
@@ -0,0 +1,76 @@
+#include <system.h>
+#include <out.h>
+#include "data.h"
+#include "back.h"
+
+#define seg_index( s)  ( nname - SEGBSS - 1 + s)
+
+long           get4(); 
+long           base_adres();
+extern short    get2();
+extern char    get1();
+
+
+do_local_relocation()
+{
+       register struct outrelo *ptr;
+       register int s;
+       
+       /* print( "n relocation records %d\n", relo - reloc_info);  */
+
+       for ( ptr = reloc_info; ptr < relo; ptr++) {
+               s = ptr->or_nami;
+               if ( symbol_table[ s].on_valu  != -1) 
+                       do_relo(&symbol_table[ s], ptr);
+       }
+}
+
+
+do_relo(np,rp)
+struct outname *np;
+struct outrelo *rp;
+{
+       long oldval,newval;
+       char *sect;
+
+       switch( rp->or_sect - S_MIN) {
+               case SEGTXT:
+                       sect = text_area;
+                       break;
+               case SEGCON:
+                       sect = data_area;
+                       break;
+               default:
+                       fprint( STDERR, 
+                               "do_local_relo(): bad section %d\n",
+                                rp->or_sect - S_MIN);
+                       break;
+       }
+       oldval = get4( sect, rp->or_addr);
+       newval = oldval + np->on_valu + 
+                       base_address( (np->on_type & S_TYP) -S_MIN);     
+       if  ( rp->or_type & RELO4) 
+               put4( sect, rp->or_addr, newval);
+       else if  ( rp->or_type & RELO2) 
+               put2( sect, rp->or_addr, (int) newval);
+       else if  ( rp->or_type & RELO1) 
+               put1( sect, rp->or_addr, (char) newval);
+       else
+               print( STDERR, "do_relo() : bad relocation size\n");
+       /* print( "reloc %s adrr=%ld sect=%ld oldval=%ld newval=%ld def = %ld\n",
+np->on_foff + string_area, rp->or_addr, rp->or_sect-S_MIN, oldval, newval, 
+np->on_valu);
+        */
+}
+
+
+long base_adres( seg)
+int seg;
+{
+       switch ( seg) {
+               case SEGTXT : return( 0);
+               case SEGCON  : return( text-text_area);
+               case SEGBSS  : return( text-text_area + data-data_area);
+               default : fprint( STDERR, "base_adres() wrong seg %d\n", seg);
+       }
+}