home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 13 / AACD13.ISO / AACD / Games / WHDLoad / Src / programs / Reloc.asm < prev    next >
Assembly Source File  |  1999-01-17  |  10KB  |  513 lines

  1. ;*---------------------------------------------------------------------------
  2. ;  :Program.    Reloc.asm
  3. ;  :Contents.    relocate exe to absolut address
  4. ;  :Author.    Bert Jahn
  5. ;  :EMail.    wepl@kagi.com
  6. ;  :Address.    Franz-Liszt-Straße 16, Rudolstadt, 07404, Germany
  7. ;  :Version.    $Id: Reloc.asm 0.6 1999/01/17 14:18:50 jah Exp jah $
  8. ;  :History.    11.06.96
  9. ;        20.06.96 minor
  10. ;        11.08.96 BUG register d2 not saved in _AdrHunk and _OffHunk
  11. ;             BUG MemoryFlags was not maked out from Hunk-ID's
  12. ;        25.08.96 argument ADR/K uses now _etoi (allows hexadecimal input)
  13. ;        17.01.99 recompile because error.i changed
  14. ;  :Requires.    OS V37+
  15. ;  :Copyright.    © 1996,1997,1998 Bert Jahn, All Rights Reserved
  16. ;  :Language.    68000 Assembler
  17. ;  :Translator.    Barfly V1.131
  18. ;---------------------------------------------------------------------------*
  19. ;##########################################################################
  20.  
  21.     INCDIR    Includes:
  22.     INCLUDE    lvo/exec.i
  23.     INCLUDE    exec/memory.i
  24.     INCLUDE    lvo/dos.i
  25.     INCLUDE    dos/dos.i
  26.     INCLUDE    dos/doshunks.i
  27.     
  28.     INCLUDE    macros/ntypes.i
  29.  
  30. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  31.  
  32. GL    EQUR    A4        ;a4 ptr to Globals
  33. LOC    EQUR    A5        ;a5 for local vars
  34.  
  35.     STRUCTURE    ArgArray,0
  36.         ULONG    aa_input
  37.         ULONG    aa_output
  38.         ULONG    aa_adr
  39.         ULONG    aa_quiet
  40.         LABEL    aa_SIZEOF
  41.  
  42.     NSTRUCTURE    Globals,0
  43.         NAPTR    gl_execbase
  44.         NAPTR    gl_dosbase
  45.         NAPTR    gl_rdargs
  46.         NSTRUCT    gl_rdarray,aa_SIZEOF
  47.         NLONG    gl_rc
  48.         NALIGNLONG
  49.         NLABEL    gl_SIZEOF
  50.  
  51. DEFAULT_ADR    = $400
  52.  
  53. ;##########################################################################
  54.  
  55. Version     = 0
  56. Revision = 6
  57.  
  58.     PURE
  59.     OUTPUT    C:Reloc
  60.  
  61.     IFND    .passchk
  62.     DOSCMD    "WDate >T:date"
  63. .passchk
  64.     ENDC
  65.  
  66. VER    MACRO
  67.         sprintx    "Reloc %ld.%ld ",Version,Revision
  68.     INCBIN    "T:date"
  69.     ENDM
  70.  
  71.         bra    .start
  72.         dc.b    0,"$VER: "
  73.         VER
  74.         dc.b    0
  75.     EVEN
  76. .start
  77.  
  78. ;##########################################################################
  79.  
  80.         link    GL,#gl_SIZEOF
  81.         move.l    (4).w,(gl_execbase,GL)
  82.         clr.l    (gl_rdarray+aa_output,GL)
  83.         clr.l    (gl_rdarray+aa_adr,GL)
  84.         move.l    #20,(gl_rc,GL)
  85.         clr.l    (gl_rdarray+aa_quiet,GL)
  86.  
  87.         move.l    #37,d0
  88.         lea    (_dosname),a1
  89.         move.l    (gl_execbase,GL),a6
  90.         jsr    _LVOOpenLibrary(a6)
  91.         move.l    d0,(gl_dosbase,GL)
  92.         beq    .nodoslib
  93.  
  94.         lea    (_template),a0
  95.         move.l    a0,d1
  96.         lea    (gl_rdarray,GL),a0
  97.         move.l    a0,d2
  98.         moveq    #0,d3
  99.         move.l    (gl_dosbase,GL),a6
  100.         jsr    (_LVOReadArgs,a6)
  101.         move.l    d0,(gl_rdargs,GL)
  102.         bne    .argsok
  103.         lea    (_readargs),a0
  104.         bsr    _PrintErrorDOS
  105.         bra    .noargs
  106. .argsok    
  107.         tst.l    (gl_rdarray+aa_output,GL)
  108.         bne    .1
  109.         move.l    (gl_rdarray+aa_input,GL),(gl_rdarray+aa_output,GL)
  110. .1
  111.         move.l    #DEFAULT_ADR,d0
  112.         move.l    (gl_rdarray+aa_adr,GL),d1
  113.         beq    .set_adr
  114.         move.l    d1,a0
  115.         bsr    _etoi
  116.         tst.b    (a0)            ;end of string reached ?
  117.         beq    .set_adr
  118.         moveq    #ERROR_BAD_NUMBER,d1    ;otherwise error
  119.         moveq    #0,d2
  120.         move.l    (gl_dosbase,GL),a6
  121.         jsr    (_LVOPrintFault,a6)
  122.         bra    .badargs
  123. .set_adr    move.l    d0,(gl_rdarray+aa_adr,GL)
  124.  
  125.         tst.l    (gl_rdarray+aa_quiet,GL)
  126.         bne    .quiet
  127.         lea    (_ver),a0
  128.         bsr    _Print
  129. .quiet
  130.  
  131.         bsr    _Main
  132.  
  133. .badargs
  134.         move.l    (gl_rdargs,GL),d1
  135.         move.l    (gl_dosbase,GL),a6
  136.         jsr    (_LVOFreeArgs,a6)
  137. .noargs
  138.         move.l    (gl_dosbase,GL),a1
  139.         move.l    (gl_execbase,GL),a6
  140.         jsr    (_LVOCloseLibrary,a6)
  141. .nodoslib
  142.         move.l    (gl_rc,GL),d0
  143.         unlk    GL
  144.         rts
  145.  
  146. ;##########################################################################
  147.  
  148.     NSTRUCTURE    local_main,0
  149.         NAPTR    lm_srcptr
  150.         NULONG    lm_srcsize
  151.         NULONG    lm_destsize
  152.         NULONG    lm_destptr
  153.         NLABEL    lm_SIZEOF
  154.  
  155. _Main        movem.l    d2/a2/a6,-(a7)
  156.         link    LOC,#lm_SIZEOF
  157.         clr.l    (lm_destptr,LOC)
  158.  
  159.         move.l    (gl_rdarray+aa_input,GL),a0
  160.         pea    .r1
  161.         tst.l    (gl_rdarray+aa_quiet,GL)
  162.         beq    _LoadFileMsg
  163.         bra    _LoadFile
  164. .r1        move.l    d1,(lm_srcsize,LOC)
  165.         move.l    d0,(lm_srcptr,LOC)
  166.         beq    .nosource
  167.  
  168. chka0    MACRO
  169.         cmp.l    a0,a1
  170.         bls    .corruptexe
  171.     ENDM
  172.  
  173.         move.l    (lm_srcptr,LOC),a0
  174.         move.l    a0,a1
  175.         add.l    (lm_srcsize,LOC),a1    ;A1 = end of buffer
  176.         chka0
  177.         cmp.l    #HUNK_HEADER,(a0)+
  178.         beq    .1
  179.         lea    (_badexe),a0
  180.         bsr    _Print
  181.         bra    .freesource
  182. .1
  183. .nextname    chka0
  184.         move.l    (a0)+,d0
  185.         beq    .noname
  186.         add.l    d0,d0
  187.         add.l    d0,d0
  188.         bmi    .corruptexe
  189.         add.l    d0,a0
  190.         bra    .nextname
  191. .noname        chka0
  192.         move.l    (a0)+,d7        ;d7 = Anzahl der Hunks
  193.         addq.l    #8,a0            ;lowhunk + highhunk
  194.         move.l    a0,a3            ;A3 = STRUCT hunksize's
  195.         move.l    d7,d0
  196.         moveq    #0,d1
  197. .a        chka0
  198.         move.l    (a0)+,d2
  199.         and.l    #$00ffffff,d2
  200.         lsl.l    #2,d2
  201.         add.l    d2,d1
  202.         subq.l    #1,d0
  203.         bne    .a
  204.         move.l    d1,(lm_destsize,LOC)
  205.         
  206.         move.l    d1,d0
  207.         move.l    #MEMF_CLEAR,d1
  208.         move.l    (gl_execbase,GL),a6
  209.         jsr    (_LVOAllocVec,a6)
  210.         move.l    d0,(lm_destptr,LOC)
  211.         bne    .g
  212.         lea    (_nomem),a0
  213.         bsr    _Print
  214.         bra    .freesource
  215. .g
  216.  
  217.         move.l    a3,a0
  218.         add.l    d7,a0
  219.         add.l    d7,a0
  220.         add.l    d7,a0
  221.         add.l    d7,a0            ;A0 = source
  222.         move.l    (lm_srcptr,LOC),a1
  223.         add.l    (lm_srcsize,LOC),a1    ;A1 = end of buffer
  224.         moveq    #0,d6            ;D6 = actual hunk
  225.         
  226. .nexthunk    chka0
  227.         move.l    (a0)+,d0
  228.         and.l    #$00ffffff,d0        ;mask MemoryFlags
  229.         cmp.l    #HUNK_NAME,d0        ;name
  230.         beq    .addlws
  231.         cmp.l    #HUNK_CODE,d0        ;code
  232.         beq    .code
  233.         cmp.l    #HUNK_DATA,d0        ;data
  234.         beq    .data
  235.         cmp.l    #HUNK_BSS,d0        ;bss
  236.         bne    .n1
  237.         addq.l    #4,a0
  238.         bra    .nexthunk
  239. .n1        cmp.l    #HUNK_RELOC32,d0    ;reloc32
  240.         beq    .relocs
  241.         cmp.l    #HUNK_RELOC16,d0    ;reloc16
  242.         beq    .relocs
  243.         cmp.l    #HUNK_RELOC8,d0        ;reloc8
  244.         beq    .relocs
  245.         cmp.l    #HUNK_EXT,d0        ;ext
  246.         beq    .symboldata
  247.         cmp.l    #HUNK_SYMBOL,d0        ;symbol
  248.         beq    .symboldata
  249.         cmp.l    #HUNK_DEBUG,d0        ;debug
  250.         beq    .addlws
  251.         cmp.l    #HUNK_END,d0        ;end
  252.         bne    .badhunk
  253.         
  254.         addq.l    #1,d6
  255.         cmp.l    d6,d7        ;last hunk ?
  256.         beq    .endfind
  257.         bra    .nexthunk
  258.  
  259. .code
  260. .data        chka0
  261.         move.l    d6,d0
  262.         bsr    _AdrHunk
  263.         move.l    a1,a2
  264.         move.l    d0,a1
  265.         move.l    (a0)+,d0
  266.         lsl.l    #2,d0
  267.         move.l    d0,d2
  268.         bsr    _Copy
  269.         beq    .corruptexe
  270.         move.l    a2,a1
  271.         add.l    d2,a0
  272.         bra    .nexthunk
  273.  
  274. .addlws        chka0
  275.         move.l    (a0)+,d0
  276.         add.l    d0,d0
  277.         add.l    d0,d0
  278.         bmi    .corruptexe
  279.         add.l    d0,a0
  280.         bra    .nexthunk
  281.  
  282. .relocs        chka0
  283.         move.l    (a0)+,d2    ;Anzahl der relocs
  284.         beq    .nexthunk
  285.         chka0
  286.         move.l    (a0)+,d0    ;hunk auf den sich relocs beziehen
  287.         bsr    _OffHunk
  288.         move.l    d0,d1        ;d1 = address
  289.         move.l    d6,d0
  290.         bsr    _AdrHunk
  291.         move.l    d0,a2
  292. .n        chka0
  293.         move.l    (a0)+,d0
  294.         add.l    d1,(a2,d0.l)
  295.         sub.l    #1,d2
  296.         bne    .n
  297.         bra    .relocs
  298.  
  299. .symboldata    chka0
  300.         move.l    (a0),d0
  301.         beq    .nexthunk
  302.         and.l    #$00ffffff,d0
  303.         add.l    d0,d0
  304.         add.l    d0,d0
  305.         bmi    .corruptexe
  306.         add.l    d0,a0
  307.         move.l    (a0)+,d0
  308.         rol.l    #8,d0
  309.         cmp.b    #1,d0
  310.         beq    .1lw
  311.         cmp.b    #2,d0
  312.         beq    .1lw
  313.         cmp.b    #3,d0
  314.         beq    .1lw
  315.         cmp.b    #129,d0
  316.         beq    .morelw
  317.         cmp.b    #130,d0
  318.         beq    .more1lw
  319.         cmp.b    #131,d0
  320.         beq    .morelw
  321.         cmp.b    #132,d0
  322.         beq    .morelw
  323.         bra    .badsym
  324.  
  325. .1lw        addq.l    #4,a0
  326.         bra    .symboldata
  327. .more1lw    addq.l    #4,a0
  328. .morelw        chka0
  329.         move.l    (a0)+,d0
  330.         add.l    d0,d0
  331.         add.l    d0,d0
  332.         bmi    .corruptexe
  333.         add.l    d0,a0
  334.         bra    .symboldata
  335.  
  336. .endfind
  337.         tst.l    (gl_rdarray+aa_quiet,GL)
  338.         bne    .quiet
  339.         lea    (_ok),a0
  340.         move.l    (gl_rdarray+aa_adr,GL),-(a7)
  341.         move.l    a7,a1
  342.         bsr    _PrintArgs
  343.         addq.l    #4,a7
  344. .quiet
  345.         move.l    (lm_destsize,LOC),d0
  346.         move.l    (lm_destptr,LOC),a0
  347.         move.l    (gl_rdarray+aa_output,GL),a1
  348.         pea    .r2
  349.         tst.l    (gl_rdarray+aa_quiet,GL)
  350.         beq    _SaveFileMsg
  351.         bra    _SaveFile
  352. .r2        tst.l    d0
  353.         beq    .freedest
  354.         clr.l    (gl_rc,GL)
  355.         bra    .freedest
  356.  
  357. .badsym        lea    (_badsym),a0
  358.         bsr    _Print
  359.         bra    .freedest
  360.  
  361. .badhunk    lea    (_badhunk),a0
  362.         bsr    _Print
  363.         bra    .freedest
  364.  
  365. .corruptexe    lea    (_corruptexe),a0
  366.         bsr    _Print
  367.  
  368. .freedest
  369.         move.l    (lm_destptr,LOC),d0
  370.         beq    .afterfreedest
  371.         move.l    d0,a1
  372.         move.l    (gl_execbase,GL),a6
  373.         jsr    (_LVOFreeVec,a6)
  374. .afterfreedest
  375. .freesource
  376.         move.l    (lm_srcptr,LOC),a1
  377.         move.l    (gl_execbase,GL),a6
  378.         jsr    (_LVOFreeVec,a6)
  379. .nosource
  380.         unlk    LOC
  381.         movem.l    (a7)+,d2/a2/a6
  382.         rts
  383.  
  384. ; IN:    d0=size a0=src a1=dest
  385. ; OUT:    d0=success
  386.  
  387. _Copy        movem.l    d1/a0-a2/a6,-(a7)
  388.  
  389.         move.l    (lm_srcptr,LOC),d1
  390.         cmp.l    d1,a0            ;check A0
  391.         blo    .shit
  392.         add.l    (lm_srcsize,LOC),d1
  393.         lea    (a0,d0.l),a2
  394.         cmp.l    d1,a2            ;check A0+D0
  395.         bhi    .shit
  396.  
  397.         move.l    (lm_destptr,LOC),d1
  398.         cmp.l    d1,a1            ;check A1
  399.         blo    .shit
  400.         add.l    (lm_destsize,LOC),d1
  401.         lea    (a1,d0.l),a2
  402.         cmp.l    d1,a2            ;check A1+D0
  403.         bhi    .shit
  404.  
  405.         move.l    (gl_execbase,GL),a6
  406.         jsr    (_LVOCopyMemQuick,a6)
  407.         moveq    #-1,d0
  408.         bra    .q
  409.  
  410. .shit        moveq    #0,d0
  411. .q        movem.l    (a7)+,d1/a0-a2/a6
  412.         tst.l    d0
  413.         rts
  414.  
  415. ; get start of hunk im mem
  416. ; IN:    d0=hunknumber
  417. ; OUT:    d0=address
  418.  
  419. _AdrHunk    movem.l    d1-d2/a0,-(a7)
  420.  
  421.         move.l    d0,d1
  422.         move.l    (lm_destptr,LOC),d0
  423.         move.l    a3,a0
  424.         bra    .i
  425.         
  426. .a        move.l    (a0)+,d2
  427.         lsl.l    #8,d2        ;remove memory flags
  428.         lsr.l    #6,d2        ;multiply by 4 (LongWords)
  429.         add.l    d2,d0        ;increase memory pointer
  430.         subq.l    #1,d1
  431. .i        tst.l    d1
  432.         bne    .a
  433.  
  434.         movem.l    (a7)+,d1-d2/a0
  435.         rts
  436.  
  437. ; get offset of hunk
  438. ; IN:    d0=hunknumber
  439. ; OUT:    d0=address
  440.  
  441. _OffHunk    movem.l    d1-d2/a0,-(a7)
  442.  
  443.         move.l    d0,d1
  444.         move.l    (gl_rdarray+aa_adr,GL),d0
  445.         move.l    a3,a0
  446.         bra    .i
  447.         
  448. .a        move.l    (a0)+,d2
  449.         lsl.l    #8,d2
  450.         lsr.l    #6,d2
  451.         add.l    d2,d0
  452.         subq.l    #1,d1
  453. .i        tst.l    d1
  454.         bne    .a
  455.  
  456.         movem.l    (a7)+,d1-d2/a0
  457.         rts
  458.  
  459. ;##########################################################################
  460.  
  461.     INCDIR    Sources:
  462.     INCLUDE    dosio.i
  463.         PrintLn
  464.         PrintArgs
  465.         Print
  466.     INCLUDE    error.i
  467.         PrintError
  468.         PrintErrorDOS
  469.     INCLUDE    files.i
  470.         GetFileName
  471.         LoadFile
  472.         LoadFileMsg
  473.         SaveFile
  474.         SaveFileMsg
  475.     INCLUDE    strings.i
  476.         etoi
  477.  
  478. ;##########################################################################
  479.  
  480. _ok        dc.b    "file has been relocated to address $%lx",10,0
  481.  
  482. _badexe        dc.b    "not executable",10,0
  483. _corruptexe    dc.b    "executable is corrupt",10,0
  484. _badhunk    dc.b    "unknown hunk",10,0
  485. _badsym        dc.b    "unknown symbol",10,0
  486. _nomem        dc.b    "not enough free store",0
  487.  
  488. ; Operationen
  489. _readargs    dc.b    "read arguments",0
  490. _getfilemem    dc.b    "alloc mem for file",0
  491. _allocdestmem    dc.b    "alloc temp dest mem",0
  492. _openfile    dc.b    "open file",0
  493. _getfilesize    dc.b    "get size of file",0
  494. _readfile    dc.b    "read file",0
  495. _writefile    dc.b    "write file",0
  496.  
  497. ;subsystems
  498. _dosname    dc.b    "dos.library",0
  499.  
  500. _template    dc.b    "INPUTFILE/A"        ;name eines zu ladenden Files
  501.         dc.b    ",OUTPUTFILE"        ;savefile name
  502.         dc.b    ",ADR/K"        ;to relocate
  503.         dc.b    ",QUIET/S"
  504.         dc.b    0
  505.  
  506. _ver        VER
  507.         dc.b    10,0
  508.  
  509. ;##########################################################################
  510.  
  511.     END
  512.  
  513.