From a5f48d649356938b77b397cc6f6997020c20311a Mon Sep 17 00:00:00 2001 From: ceriel Date: Thu, 15 Sep 1988 09:49:22 +0000 Subject: [PATCH] Initial revision --- mach/vax4/ce/.distr | 13 + mach/vax4/ce/EM_table | 729 ++++++++++++++++++++++++++++++++++++++ mach/vax4/ce/Make.back | 103 ++++++ mach/vax4/ce/Makefile | 16 + mach/vax4/ce/as.c | 245 +++++++++++++ mach/vax4/ce/as.h | 25 ++ mach/vax4/ce/as_table | 232 ++++++++++++ mach/vax4/ce/do_close.c | 8 + mach/vax4/ce/do_open.c | 13 + mach/vax4/ce/end_back.c | 22 ++ mach/vax4/ce/mach.c | 12 + mach/vax4/ce/mach.h | 36 ++ mach/vax4/ce/output.c | 207 +++++++++++ mach/vax4/ce/relocation.c | 76 ++++ 14 files changed, 1737 insertions(+) create mode 100644 mach/vax4/ce/.distr create mode 100644 mach/vax4/ce/EM_table create mode 100644 mach/vax4/ce/Make.back create mode 100644 mach/vax4/ce/Makefile create mode 100644 mach/vax4/ce/as.c create mode 100644 mach/vax4/ce/as.h create mode 100644 mach/vax4/ce/as_table create mode 100644 mach/vax4/ce/do_close.c create mode 100644 mach/vax4/ce/do_open.c create mode 100644 mach/vax4/ce/end_back.c create mode 100644 mach/vax4/ce/mach.c create mode 100644 mach/vax4/ce/mach.h create mode 100644 mach/vax4/ce/output.c create mode 100644 mach/vax4/ce/relocation.c diff --git a/mach/vax4/ce/.distr b/mach/vax4/ce/.distr new file mode 100644 index 000000000..98cb62882 --- /dev/null +++ b/mach/vax4/ce/.distr @@ -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 index 000000000..fce731ca7 --- /dev/null +++ b/mach/vax4/ce/EM_table @@ -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 index 000000000..8ec23d68a --- /dev/null +++ b/mach/vax4/ce/Make.back @@ -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 index 000000000..7e6327508 --- /dev/null +++ b/mach/vax4/ce/Makefile @@ -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 index 000000000..89a3a9324 --- /dev/null +++ b/mach/vax4/ce/as.c @@ -0,0 +1,245 @@ +#include +#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 index 000000000..b50763e60 --- /dev/null +++ b/mach/vax4/ce/as.h @@ -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 index 000000000..66026793a --- /dev/null +++ b/mach/vax4/ce/as_table @@ -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 index 000000000..5bb0fbd07 --- /dev/null +++ b/mach/vax4/ce/do_close.c @@ -0,0 +1,8 @@ +#include + +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 index 000000000..83f529ab7 --- /dev/null +++ b/mach/vax4/ce/do_open.c @@ -0,0 +1,13 @@ +#include + +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 index 000000000..60d42a11b --- /dev/null +++ b/mach/vax4/ce/end_back.c @@ -0,0 +1,22 @@ +#include +#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 index 000000000..5598352df --- /dev/null +++ b/mach/vax4/ce/mach.c @@ -0,0 +1,12 @@ +#include +#include +#include +#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 index 000000000..f19995e97 --- /dev/null +++ b/mach/vax4/ce/mach.h @@ -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 index 000000000..34f98eeec --- /dev/null +++ b/mach/vax4/ce/output.c @@ -0,0 +1,207 @@ +#include +#include +#include +#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 + +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 index 000000000..ab4b44f6d --- /dev/null +++ b/mach/vax4/ce/relocation.c @@ -0,0 +1,76 @@ +#include +#include +#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); + } +} -- 2.34.1