ACTION! Relocator#
RELGEN.ACT#
MODULE ;RELGEN.ACT
;COPYRIGHT 1984, QMI, JS DeMar
;REV. 1.1, March 20, 1984
;OBJECT CODE RELOCATION GENERATOR for
;ACTION! compiled binary-load files.
;WARNING!!! This program requires
;four OPEN files simultaneously.
;Be sure that DOS is configured for
;this. With DOS 2.0, set $709 equal
;to at least 4, rewrite DOS and
;reboot.
;Requires the second file compiled
;at any even page increment higher
;than the first file, for example:
;$3000 and $3100.
;Generates a table of the locations
;that require relocating and saves
;it in a ".GEN" file in ACTION!.
; The ".REL" file is the original
;object code with an origin of "0".
;The actual relocator is compiled
;from the generic relocator source
;called "RELOC.ACT" merged with the
;".GEN" file generated here. Append
;".REL" file to that code and it
;will load and relocate to MEMLO.
DEFINE in1="1",
in2="2",
out1="3",
out2="4"
BYTE abrt
;---------------------------------
PROC MyError(BYTE a,x,y)
IF y=170 THEN
PrintE("ERROR File not found!")
ELSE
Print("ERROR! ")
PrintBE(y)
FI
abrt=1
RETURN
;---------------------------------
PROC Ferror()
BYTE t,clock=$14
PrintE("ERROR in Output filespec!")
t=clock-$80
DO
UNTIL t=clock
OD
RETURN
;---------------------------------
PROC EndIt()
Close(in1)
Close(in2)
Close(out1)
Close(out2)
RETURN
;---------------------------------
PROC Main()
CARD start1,start2,end1,end2
CARD offsets,offsete,i,count,hits
CARD test1,test2,old1,old2,old3,old0
BYTE x,z,j,wnum,d1,d2,
sthigh
BYTE ARRAY fname1(18),fname2(18),
fnameout1(18),fnameout2(18)
DO
PrintE("Relocation code Generator II ")
PrintE("JS DeMar, 8/84")
PutE()
PrintE("Requires two code files compiled")
PrintE("with an offset of $0100.")
PutE()
Print("Filespec for code A >")
InputMD(device,fname1,18)
PutE()
Print("Filespec for code B >")
InputMD(device,fname2,18)
PutE()
Scopy(fnameout1,fname1)
SCopy(fnameout2,fnameout1)
j=1
IF fnameout1(1)#'D
OR fnameout1(0)<4 THEN
Ferror()
ELSEIF fnameout1(2)=': THEN
z=0
ELSEIF fnameout1(3)=': THEN
z=1
FI
DO
x=fnameout1(j)
j==+1
IF x=$20 THEN
EXIT
ELSEIF x='. THEN
EXIT
ELSEIF j>fnameout1(0) THEN
j==+1
EXIT
ELSEIF j>11+z THEN
Ferror()
FI
OD
fnameout1(j-1)='.
fnameout1(j)='G
fnameout1(j+1)='E
fnameout1(j+2)='N
fnameout1(0)=j+2
j=1
IF fnameout2(1)#'D
OR fnameout2(0)<4 THEN
Ferror()
ELSEIF fnameout2(2)=': THEN
z=0
EXIT
ELSEIF fnameout2(3)=': THEN
z=1
EXIT
FI
OD
DO
x=fnameout2(j)
j==+1
IF x=$20 THEN
EXIT
ELSEIF x='. THEN
EXIT
ELSEIF j>fnameout2(0) THEN
j==+1
EXIT
ELSEIF j>11+z THEN
Ferror()
EXIT
FI
OD
fnameout2(j-1)='.
fnameout2(j)='R
fnameout2(j+1)='E
fnameout2(j+2)='L
fnameout2(0)=j+2
Print("Generation file = ")
PrintE(fnameout1)
Print("Relocation file = ")
PrintE(fnameout2)
Error=MyError
abrt=0
Close(in1)
Close(in2)
Close(out1)
Close(out2)
Open(in1,fname1,4)
Open(in2,fname2,4)
IF abrt=1 THEN
Close(1)
Close(2)
RETURN
FI
Open(out1,fnameout1,8)
Open(out2,fnameout2,8)
x=GetD(in1) ;throw away two $FF's.
x=GetD(in1)
PutD(out2,$FF)
PutD(out2,$FF)
x=GetD(in1)
PutD(out2,x)
start1=x ;start addr of file1.
x=GetD(in1)
PutD(out2,x)
start1==+(x*256)
x=GetD(in1)
PutD(out2,x)
end1=x
x=GetD(in1)
PutD(out2,x)
end1==+(x*256) ;end addr of file1.
x=GetD(in2) ;throw away two $FF's.
x=GetD(in2)
x=GetD(in2)
start2=x ;start addr of file2.
x=GetD(in2)
start2==+(x*256)
x=GetD(in2)
end2=x
x=GetD(in2)
end2==+(x*256) ;end addr of file2.
offsets=start2-start1
sthigh=start1/256
offsete=end2-end1
PrintDE(out1,"MODULE")
PrintD(out1,";For file ")
PrintDE(out1,fnameout2)
PrintDE(out1,"")
Print("Code starts at ")
PrintD(out1,"CARD start=[")
PrintCE(start1)
PrintCD(out1,start1)
PrintDE(out1,"]")
Print(" and ends at ")
PrintD(out1,"CARD finish=[")
PrintCE(end1)
PrintCD(out1,end1)
PrintDE(out1,"]")
Print("Compile offset was ")
PrintCE(offsets)
IF offsete#offsets THEN
PrintE("Diferrent size files!")
PrintE("ABORTED!")
EndIt()
RETURN
FI
PrintDE(out1,"")
PrintD(out1,"CARD ARRAY otable=[")
wnum=0
hits=0
count=0
FOR i=start1 TO end1
DO
d1=GetD(in1)
d2=GetD(in2)
IF d1#d2 THEN
hits==+1
IF wnum=0 THEN
PrintD(out1," ")
Print(" ")
ElSE
PrintD(out1," ")
Print(" ")
FI
PrintCD(out1,count)
Print(" ")
PrintC(count)
wnum==+1
IF wnum>4 THEN
PrintDE(out1,"")
PrintE("")
wnum=0
FI
d1==-sthigh
FI
PutD(out2,d1)
count==+1
OD
FOR i=0 TO 2
DO
d1=GetD(in1)
d2=GetD(in1)
OD
test1=d1
test1==+(d2*256)
IF test1>=start1 AND test1<=end1 THEN
PrintDE(out1,"]")
PrintE("]")
PrintD(out1,"CARD hits=[")
PrintCD(out1,hits)
PrintDE(out1,"]")
PrintDE(out1,"")
Print("CARD hits=[")
PrintC(hits)
PrintE("]")
PrintE("")
PrintD(out1,"CARD runaddr=[")
Print("CARD runaddr=[")
test1==-start1
PrintCD(out1,test1)
PrintC(test1)
PrintDE(out1,"]")
PrintE("]")
ELSE
PrintE("No Run Address! - ABORTED!")
FI
PrintE("")
PrintDE(out1,"")
EndIt()
PrintE("Finished!"")
RETURN
RELOC.ACT#
MODULE ;RELOCATE.ACT
;Run-time Relocator Code.
;For use with RELGEN.ACT
;COPYRIGHT 1984, JS DeMar
;Rev. 2.0, August 17,1984
;---------------------------------
SET 14=$6000
SET $0491=$6000
;---------------------------------
;The beginning of the relocator
;table and code should be higher
;than the end of the original
;compiled program. But, there must
;be enough space left for the table
;and the relocator code itself!
;---------------------------------
;---------------------------------
;Read the ".GEN" file above here.
;---------------------------------
;Compile this after reading in the
;".GEN" file above. Then append this
;code to the ".REL" file using the
;DOS C (COPY) command with /A after
;the filenames:
; PROGRAM.OBJ,PROGRAM.REL/A
;Then rename the ".REL" file to
;AUTORUN.SYS to run at boot-time.
;---------------------------------
PROC Relocate()
BYTE offset,memlohi=$02E8,x,y
CARD memlo=$02E7,i,j,top,entry
CARD POINTER p
BYTE ARRAY newplace
[$8E y $4E y $4E y $4E y $4E y]
newplace=memlo
newplace==&$FF00
offset=memlohi
i=memlo&$00FF
IF i#0 THEN
newplace==+$0100
offset==+1
FI
j=0
FOR i=start TO finish
DO
p=i
x=p^
newplace(j)=x
j==+1
OD
FOR i=0 TO hits-1
DO
entry=otable(i)
newplace(entry)==+offset
OD
runaddr==+newplace
[$6C runaddr]