home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / jsage / znode3 / uploads / zremot03.lbr / RELOC.ZZ0 / RELOC.Z80
Encoding:
Text File  |  1993-06-07  |  2.6 KB  |  88 lines

  1.     TITLE    "RELOC - RELOCATE PRL OR SPR IMAGE"
  2. ;**********************************************************
  3. ; RELOC
  4. ;
  5. ; THIS MODULE DEALS WITH .SPR AND .PRL FILES AND THEIR
  6. ; BITMAPS.  RELOC PATCHES THE IMAGE IN PLACE, THEN RETURNS
  7. ; TO THE CALLER WITH REGISTERS SET FOR LDIR.  NO RESTRICTIONS
  8. ; ARE PLACED ON THE LOAD OR IMAGE ADDRESSES.  WORD RATHER
  9. ; THAT THE TRADITIONAL BYTE RELOCATION IS PERFORMED.
  10. ;
  11. ; CALLING PARAMETERS:    HL=POINTER TO HEADER
  12. ;            DE=RELOCATE TARGET ADDRESS
  13. ;            A = TYPE (0=.SPR, 1=.PRL)
  14. ;
  15. ; RETURNS WITH:     HL=POINT TO CODE START
  16. ;            BC=CODE SIZE IN BYTES
  17. ;            DE,IX,IY,AF' RESTORED
  18. ;            ALTERNATE BC,DE,HL LOST
  19. ; 2/18/88  C.W. COTRILL
  20. ; (c) 1988 Cameron W. Cotrill
  21. ;**********************************************************
  22. ;
  23.     PUBLIC    RELOC
  24. ;
  25. RELOC:    PUSH    DE        ; Save target address
  26.     LD    B,A        ; Save type flag
  27.     LD    A,D        ; Get msb of target
  28.     SUB    B        ; Calculate relocation constant
  29.     LD    D,A        ; Save it in d
  30.     INC    HL        ; Point to bitmap offset
  31.     LD    C,(HL)
  32.     INC    HL
  33.     LD    B,(HL)        ; Get offset in bc
  34.     DEC    HL
  35.     DEC    HL        ; Restore pointer
  36.     INC    H        ; Add header offset
  37.     PUSH    HL        ; Save pointer to code start for exit
  38.     PUSH    BC        ; Save offset for alt register
  39.     PUSH    HL        ; Save pointer to code start
  40.     ADD    HL,BC        ; Add bitmap offset
  41.     EX    (SP),HL        ; Code start in hl, bitmap on tos
  42.                 ; Reloc base in de
  43.     DEC    HL        ; Skew code pointer so bitmap points to lsb
  44.     EXX
  45.     POP    HL        ; Bitmap in hl'
  46.     LD    DE,0        ; Set bytecount to 0
  47.     POP    BC        ; Target count in bc'
  48. ;
  49. ; NOW THAT ADDRESSES HAVE BEEN CALCULATED, THE RELOCATION CONSTANT
  50. ;  MUST BE ADDED TO ALL ADDRESSES IN THE IMAGE FLAGGED BY A 1 BIT
  51. ;  IN THE BITMAP.  EACH BITMAP BYTE CONTAINS RELOCATION INFORMATION
  52. ;  FOR 8 BYTES OF CODE.  BIT 7 CORROSPONDS TO THE LOWEST BYTE OF
  53. ;  THE 8 BYTE BLOCK, WHILE BIT 0 CORROSPONDS TO THE HIGHEST BYTE
  54. ;  IN THE BLOCK.
  55. ;
  56. RELOC1:    LD    A,7        ; Alternate set active here
  57.     AND    E        ; Test if time for new bitmap byte
  58.     JR    NZ,RELOC2    ; If not
  59.     LD    A,(HL)        ; Get the byte
  60.     INC    HL        ; Bump the bitmap pointer (hl')
  61.     EXX            ; Swap to main set
  62.     LD    C,A        ; Store in c
  63.     EXX            ; Swap back to alternate set
  64. RELOC2:    EXX            ; Swap to main set
  65.     RL    C        ; Roll bitmap into carry
  66.     JR    NC,RELOC3    ; If no relocation here
  67.     LD    A,E
  68.     ADD    A,(HL)
  69.     LD    (HL),A        ; Add offset to lsb
  70.     INC    HL
  71.     LD    A,D
  72.     ADC    A,(HL)
  73.     LD    (HL),A        ; And to msb
  74.     DEC    HL
  75. RELOC3:    INC    HL        ; Bump pointer
  76.     EXX            ; Swap to alternate set
  77.     INC    DE        ; Bump bytecount
  78.     LD    A,C
  79.     SUB    E        ; Compare to lsb of target
  80.     JR    NZ,RELOC1    ; If no match
  81.     LD    A,B
  82.     SBC    A,D        ; And msb
  83.     JR    NZ,RELOC1    ; Loop if not done
  84.     POP    HL        ; Restore code start pointer
  85.     POP    DE        ; And reloc target
  86.     RET            ; And exit
  87.     END
  88.