home *** CD-ROM | disk | FTP | other *** search
- TITLE "RELOC - RELOCATE PRL OR SPR IMAGE"
- ;**********************************************************
- ; RELOC
- ;
- ; THIS MODULE DEALS WITH .SPR AND .PRL FILES AND THEIR
- ; BITMAPS. RELOC PATCHES THE IMAGE IN PLACE, THEN RETURNS
- ; TO THE CALLER WITH REGISTERS SET FOR LDIR. NO RESTRICTIONS
- ; ARE PLACED ON THE LOAD OR IMAGE ADDRESSES. WORD RATHER
- ; THAT THE TRADITIONAL BYTE RELOCATION IS PERFORMED.
- ;
- ; CALLING PARAMETERS: HL=POINTER TO HEADER
- ; DE=RELOCATE TARGET ADDRESS
- ; A = TYPE (0=.SPR, 1=.PRL)
- ;
- ; RETURNS WITH: HL=POINT TO CODE START
- ; BC=CODE SIZE IN BYTES
- ; DE,IX,IY,AF' RESTORED
- ; ALTERNATE BC,DE,HL LOST
- ; 2/18/88 C.W. COTRILL
- ; (c) 1988 Cameron W. Cotrill
- ;**********************************************************
- ;
- PUBLIC RELOC
- ;
- RELOC: PUSH DE ; Save target address
- LD B,A ; Save type flag
- LD A,D ; Get msb of target
- SUB B ; Calculate relocation constant
- LD D,A ; Save it in d
- INC HL ; Point to bitmap offset
- LD C,(HL)
- INC HL
- LD B,(HL) ; Get offset in bc
- DEC HL
- DEC HL ; Restore pointer
- INC H ; Add header offset
- PUSH HL ; Save pointer to code start for exit
- PUSH BC ; Save offset for alt register
- PUSH HL ; Save pointer to code start
- ADD HL,BC ; Add bitmap offset
- EX (SP),HL ; Code start in hl, bitmap on tos
- ; Reloc base in de
- DEC HL ; Skew code pointer so bitmap points to lsb
- EXX
- POP HL ; Bitmap in hl'
- LD DE,0 ; Set bytecount to 0
- POP BC ; Target count in bc'
- ;
- ; NOW THAT ADDRESSES HAVE BEEN CALCULATED, THE RELOCATION CONSTANT
- ; MUST BE ADDED TO ALL ADDRESSES IN THE IMAGE FLAGGED BY A 1 BIT
- ; IN THE BITMAP. EACH BITMAP BYTE CONTAINS RELOCATION INFORMATION
- ; FOR 8 BYTES OF CODE. BIT 7 CORROSPONDS TO THE LOWEST BYTE OF
- ; THE 8 BYTE BLOCK, WHILE BIT 0 CORROSPONDS TO THE HIGHEST BYTE
- ; IN THE BLOCK.
- ;
- RELOC1: LD A,7 ; Alternate set active here
- AND E ; Test if time for new bitmap byte
- JR NZ,RELOC2 ; If not
- LD A,(HL) ; Get the byte
- INC HL ; Bump the bitmap pointer (hl')
- EXX ; Swap to main set
- LD C,A ; Store in c
- EXX ; Swap back to alternate set
- RELOC2: EXX ; Swap to main set
- RL C ; Roll bitmap into carry
- JR NC,RELOC3 ; If no relocation here
- LD A,E
- ADD A,(HL)
- LD (HL),A ; Add offset to lsb
- INC HL
- LD A,D
- ADC A,(HL)
- LD (HL),A ; And to msb
- DEC HL
- RELOC3: INC HL ; Bump pointer
- EXX ; Swap to alternate set
- INC DE ; Bump bytecount
- LD A,C
- SUB E ; Compare to lsb of target
- JR NZ,RELOC1 ; If no match
- LD A,B
- SBC A,D ; And msb
- JR NZ,RELOC1 ; Loop if not done
- POP HL ; Restore code start pointer
- POP DE ; And reloc target
- RET ; And exit
- END