!!!ACTION! Relocator {{{ nded to it. The program will load at the next possible page boundary (increment of 256) after MEMLO. Because RELGEN compares two versions of you object file, you may want to init all variables to zero to keep the relocation table at a minimum. Stray data in the uninitialized variables may be interpreted as machine code that needs relocating. 1) Compile (or Assemble) your code at a convenient area but not conflicting with DOS. In ACTION!, use the following commands to force the program's origin to a specified value ($3000 for example): SET 14=$3000 SET $491=$3000 2) Re-Compile your code at $100 higher than the first. For the above example, this would be at $3100. 3) From the ACTION! monitor, RUN the program RELGEN.ACT. It will prompt you for the filenames for the two object code files that you compiled above. Remember to give the Dn: prefix to the filenames. The program will compare the two object files and note their differences as offsets into the file. This information is saved in ACTION! form in a file with the original name and a ".GEN" extention. This will be used in the next step. Also, the program creates an object file image of the original but with an origin of zero. This is done to make the relocation process easier and this file, with a ".REL" extention will be used in step 5. Note: RELGEN.ACT requires four open DOS files simultaneously. By default, DOS usually has buffers for only 3. You must use the command: SET $709=4 in the ACTION! monitor and type D for DOS. Rewrite DOS to the disk and reboot. Now, DOS will allow the four files to be opened. 4) Now, Read the program RELOC.ACT into the ACTION! Editor. This is a "generic" run-time relocator. The file generated with the RELGEN.ACT program (with the ".GEN" extention) must be merged into this program with the editor Read function. Position the cursor where instructed and read in the file. Compile this code but be sure that it is SET to compile above the expected end of YOUR program's target location. Save this object code to disk and go to DOS. 5) Using the DOS Copy command, append the ".REL" file generated in RELGEN.ACT, to the merged relocator file saved in step 4. For example: C Copy from,to: TEST.REL,AUTORUN.SYS/A This assumes that you saved the file in Step 4 as AUTORUN.SYS. 6) Finally, the appended file can be loaded from DOS or named AUTORUN.SYS as above for permanent applications. If you have question, send E-Mail to: John DeMar 71066,337 on Compuserve or leave a message on the ACE-BASE BBS at (315)451-7747. Good Luck! }}} !!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] }}}