First version with support for multiple .obj files and linking global symbols -- preliminary, lightly tested

This commit is contained in:
AK6DN
2017-04-08 02:49:22 -07:00
parent 364bd9603e
commit c4f9db5d8f

View File

@@ -783,12 +783,12 @@ sub parse_rec ($$$) {
$psect{$nam}{NUMBER}, $nam, $start, $end, $length if $length && $DEBUG;
}
printf $LOG "\n";
printf $LOG "\n" if $DEBUG;
foreach my $nam (sort(keys(%gblsym))) {
if (exists $gblsym{$nam}{DEF}) {
my $address = $gblsym{$nam}{DEF}{VALUE} + $psect{$gblsym{$nam}{DEF}{PSECT}}{START};
$gblsym{$nam}{DEF}{ADDRESS} = $gblsym{$nam}{DEF}{VALUE} + $psect{$gblsym{$nam}{DEF}{PSECT}}{START};
printf $LOG "....GBLSYM(%s) PSECT='%s' VALUE=%06o : ADDRESS=%06o\n",
$nam, $gblsym{$nam}{DEF}{PSECT}, $gblsym{$nam}{DEF}{VALUE}, $address if $DEBUG;
$nam, $gblsym{$nam}{DEF}{PSECT}, $gblsym{$nam}{DEF}{VALUE}, $gblsym{$nam}{DEF}{ADDRESS} if $DEBUG;
}
}
@@ -836,8 +836,10 @@ sub parse_rec ($$$) {
# process
my $adr = $adrmsk & ($textaddr + $dis - 4);
my $val = $datmsk & ($psect{$psectname}{START} + $con);
# store
$mem[($adr+0)&$adrmsk] = $memmsk & ($val>>0);
$mem[($adr+1)&$adrmsk] = $memmsk & ($val>>8);
# print
printf $LOG "..RLD(IR): adr=%06o val=%06o ; dis=%06o con=%06o\n",
$adr, $val, $dis, $con if $DEBUG;
$i += 4;
@@ -848,8 +850,10 @@ sub parse_rec ($$$) {
# process
my $adr = $adrmsk & ($textaddr + $dis - 4);
my $val = $datmsk & ($con - ($adr+2));
# store
$mem[($adr+0)&$adrmsk] = $memmsk & ($val>>0);
$mem[($adr+1)&$adrmsk] = $memmsk & ($val>>8);
# print
printf $LOG "..RLD(IDR): adr=%06o val=%06o ; dis=%06o con=%06o\n",
$adr, $val, $dis, $con if $DEBUG;
$i += 4;
@@ -860,8 +864,10 @@ sub parse_rec ($$$) {
# process
my $adr = $adrmsk & ($textaddr + $dis - 4);
my $val = $datmsk & ($psect{$nam}{START});
# store
$mem[($adr+0)&$adrmsk] = $memmsk & ($val>>0);
$mem[($adr+1)&$adrmsk] = $memmsk & ($val>>8);
# print
printf $LOG "..RLD(PR): adr=%06o val=%06o ; dis=%06o nam='%s'\n",
$adr, $val, $dis, $nam if $DEBUG;
$i += 6;
@@ -872,8 +878,10 @@ sub parse_rec ($$$) {
# process
my $adr = $adrmsk & ($textaddr + $dis - 4);
my $val = $datmsk & ($psect{$nam}{START} - ($adr+2));
# store
$mem[($adr+0)&$adrmsk] = $memmsk & ($val>>0);
$mem[($adr+1)&$adrmsk] = $memmsk & ($val>>8);
# print
printf $LOG "..RLD(PDR): adr=%06o val=%06o ; dis=%06o nam='%s'\n",
$adr, $val, $dis, $nam if $DEBUG;
$i += 6;
@@ -885,8 +893,10 @@ sub parse_rec ($$$) {
# process
my $adr = $adrmsk & ($textaddr + $dis - 4);
my $val = $datmsk & ($psect{$nam}{START} + $con);
# store
$mem[($adr+0)&$adrmsk] = $memmsk & ($val>>0);
$mem[($adr+1)&$adrmsk] = $memmsk & ($val>>8);
# print
printf $LOG "..RLD(PAR): adr=%06o val=%06o ; dis=%06o con=%06o nam='%s'\n",
$adr, $val, $dis, $con, $nam if $DEBUG;
$i += 8;
@@ -898,44 +908,70 @@ sub parse_rec ($$$) {
# process
my $adr = $adrmsk & ($textaddr + $dis - 4);
my $val = $datmsk & ($psect{$nam}{START} + $con - ($adr+2));
# store
$mem[($adr+0)&$adrmsk] = $memmsk & ($val>>0);
$mem[($adr+1)&$adrmsk] = $memmsk & ($val>>8);
# print
printf $LOG "..RLD(PADR): adr=%06o val=%06o ; dis=%06o con=%06o nam='%s'\n",
$adr, $val, $dis, $con, $nam if $DEBUG;
$i += 8;
} elsif ($ent == 002) {
# global relocation ... TBD <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
# global relocation ... OK
my $dis = $rec->[$i+1];
my $sym = &rad2asc(($rec->[$i+3]<<8)|($rec->[$i+2]<<0),($rec->[$i+5]<<8)|($rec->[$i+4]<<0));
# process
printf $LOG "..RLD(GR): adr=?????? val=?????? ; dis=%06o sym='%s'\n",
$dis, $sym if $DEBUG;
my $adr = $adrmsk & ($textaddr + $dis - 4);
my $val = $datmsk & ($gblsym{$sym}{DEF}{ADDRESS});
# store
$mem[($adr+0)&$adrmsk] = $memmsk & ($val>>0);
$mem[($adr+1)&$adrmsk] = $memmsk & ($val>>8);
# print
printf $LOG "..RLD(GR): adr=%06o val=%06o ; dis=%06o sym='%s'\n",
$adr, $val, $dis, $sym if $DEBUG;
$i += 6;
} elsif ($ent == 004) {
# global displaced relocation ... TBD <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
# global displaced relocation ... OK
my $dis = $rec->[$i+1];
my $sym = &rad2asc(($rec->[$i+3]<<8)|($rec->[$i+2]<<0),($rec->[$i+5]<<8)|($rec->[$i+4]<<0));
# process
printf $LOG "..RLD(GDR): adr=?????? val=?????? ; dis=%06o sym='%s'\n",
$dis, $sym if $DEBUG;
my $adr = $adrmsk & ($textaddr + $dis - 4);
my $val = $datmsk & ($gblsym{$sym}{DEF}{ADDRESS} - ($adr+2));
# store
$mem[($adr+0)&$adrmsk] = $memmsk & ($val>>0);
$mem[($adr+1)&$adrmsk] = $memmsk & ($val>>8);
# print
printf $LOG "..RLD(GDR): adr=%06o val=%06o ; dis=%06o sym='%s'\n",
$adr, $val, $dis, $sym if $DEBUG;
$i += 6;
} elsif ($ent == 005) {
# global additive relocation ... TBD <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
# global additive relocation ... OK
my $dis = $rec->[$i+1];
my $sym = &rad2asc(($rec->[$i+3]<<8)|($rec->[$i+2]<<0),($rec->[$i+5]<<8)|($rec->[$i+4]<<0));
my $con = ($rec->[$i+7]<<8)|($rec->[$i+6]<<0);
# process
printf $LOG "..RLD(GAR): adr=?????? val=?????? ; dis=%06o con=%06o sym='%s'\n",
$dis, $con, $sym if $DEBUG;
my $adr = $adrmsk & ($textaddr + $dis - 4);
my $val = $datmsk & ($gblsym{$sym}{DEF}{ADDRESS} + $con);
# store
$mem[($adr+0)&$adrmsk] = $memmsk & ($val>>0);
$mem[($adr+1)&$adrmsk] = $memmsk & ($val>>8);
# print
printf $LOG "..RLD(GAR): adr=%06o val=%06o ; dis=%06o con=%06o sym='%s'\n",
$adr, $val, $dis, $con, $sym if $DEBUG;
$i += 8;
} elsif ($ent == 006) {
# global additive displaced relocation ... TBD <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
# global additive displaced relocation ... OK
my $dis = $rec->[$i+1];
my $sym = &rad2asc(($rec->[$i+3]<<8)|($rec->[$i+2]<<0),($rec->[$i+5]<<8)|($rec->[$i+4]<<0));
my $con = ($rec->[$i+7]<<8)|($rec->[$i+6]<<0);
# process
printf $LOG "..RLD(GADR): adr=?????? val=?????? ; dis=%06o con=%06o sym='%s'\n",
$dis, $con, $sym if $DEBUG;
my $adr = $adrmsk & ($textaddr + $dis - 4);
my $val = $datmsk & ($gblsym{$sym}{DEF}{ADDRESS} + $con - ($adr+2));
# store
$mem[($adr+0)&$adrmsk] = $memmsk & ($val>>0);
$mem[($adr+1)&$adrmsk] = $memmsk & ($val>>8);
# print
printf $LOG "..RLD(GADR): adr=%06o val=%06o ; dis=%06o con=%06o sym='%s'\n",
$adr, $val, $dis, $con, $sym if $DEBUG;
$i += 8;
} elsif ($ent == 007) {
# location counter definition ... OK
@@ -945,6 +981,7 @@ sub parse_rec ($$$) {
# process
$psectname = $nam;
$textaddr = $datmsk & ($con);
# print
printf $LOG "..RLD(LCD): adr=%06o ; dis=%06o con=%06o nam='%s'\n",
$textaddr, $dis, $con, $nam if $DEBUG;
$i += 8;
@@ -954,6 +991,7 @@ sub parse_rec ($$$) {
my $con = ($rec->[$i+3]<<8)|($rec->[$i+2]<<0);
# process
$textaddr = $datmsk & ($con);
# print
printf $LOG "..RLD(LCM): adr=%06o ; dis=%06o con=%06o\n",
$textaddr, $dis, $con if $DEBUG;
$i += 4;
@@ -963,15 +1001,20 @@ sub parse_rec ($$$) {
# process
my $adr = $adrmsk & ($textaddr + $dis - 4);
my $val = $datmsk & ( 01000 ); # make this up, no easy way to compute it
# store
$mem[($adr+0)&$adrmsk] = $memmsk & ($val>>0);
$mem[($adr+1)&$adrmsk] = $memmsk & ($val>>8);
# print
printf $LOG "..RLD(LIM1): adr=%06o val=%06o ; dis=%06o\n",
$adr, $val, $dis if $DEBUG;
# process
$dis += 2;
$adr += 2;
$val = $datmsk & ($program{END}{ADDRESS});
# store
$mem[($adr+0)&$adrmsk] = $memmsk & ($val>>0);
$mem[($adr+1)&$adrmsk] = $memmsk & ($val>>8);
# print
printf $LOG "..RLD(LIM2): adr=%06o val=%06o ; dis=%06o\n",
$adr, $val, $dis if $DEBUG;
$i += 2;
@@ -1032,13 +1075,13 @@ sub parse_rec ($$$) {
$opc = "STO";
$dun = 1;
} elsif ($rec->[$i] == 013) {
############## may need tweaking ################
############## may need tweaking ################ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
my @arg = splice(@stk,-1,1);
$val = $arg[0];
$opc = "STO+DIS";
$dun = 1;
} elsif ($rec->[$i] == 016) {
############## may need tweaking ################
############## may need tweaking ################ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$nam = &rad2asc(($rec->[$i+2]<<8)|($rec->[$i+1]<<0),
($rec->[$i+4]<<8)|($rec->[$i+3]<<0));
$con = $gblsym{$nam}{DEF}{VALUE};