home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / utils / asmutl / relocate.tut < prev    next >
Text File  |  1994-07-13  |  3KB  |  56 lines

  1.  
  2. TUTORIAL NOTES ON RELOCATABLE CODE
  3.  
  4.      To relocate any code, one identifies the source (where the code is
  5. coming from), the destination (where it's going), and the size (how much
  6. code to move).    The common program sequence is:
  7.     LD    HL,SOURCE
  8.     LD    DE,DEST
  9.     LD    BC,SIZE
  10.     LDIR
  11. The difficulty arises in that the program in low memory being moved to
  12. high memory will have all its addresses defined by its low memory location.
  13. Programmers have used several successful techniques to compensate for this.
  14. The technique I've gotten accustomed to is the use of offsets.    An offset
  15. is provided for every address that is referenced ABSOLUTE but is not
  16. provided for any address referenced RELATIVE.  All  JP    and  CALL  commands
  17. require an absolute address.  All  JR  and  DJNZ  commands require a relative
  18. address.  A specific address may occasionally require both.  Consider as
  19. an example the code below:
  20.  
  21. OU    EQU    DEST-SOURCE    ; offset
  22. CONIN    EQU    $+OU        ; conin - relocated address  (absolute)
  23. CONINL:             ; conin - local address      (relative)
  24.     CALL    CONST        ; call console status check
  25.     JR    Z,CONINL    ; loop until status says we're ready
  26.     CALL    0F600H        ; get the byte using upper bios
  27.     CP    9BH        ; see if it's CMND-F1
  28.     JR    NZ,CN9C     ;    (continuous pop-up clk display)
  29.     LD    A,(CLKFLG)    ; prepare to toggle the pop-up flag
  30.     CPL            ; complement the accumulator
  31.     LD    (CLKFLG),A    ; store the toggled flag
  32.     JR    CONINL        ; go back for next input
  33. CN9C:    CP    7FH        ; see if it's a "delete"
  34.     RET    NZ        ; if not, return with it the input byte
  35.     LD    A,08h        ; if yes, transform it into ^H
  36.     RET            ; done with CONIN
  37. CLKFLG    EQU    $+OU
  38.     DB    0        ; flag to see if clock display requested
  39.  
  40. In this example, CONIN is the absolute address and CONINL is the same
  41. location but in relative terms.  The relative address is needed to
  42. support the  JR Z,CONINL  command.  The absolute address is needed to
  43. support the  JP CONIN  in the bios jump table.     Similarly,  CLKFLG
  44. is an absolute address because it's the object of a  LD  A,(CLKFLG)
  45. instruction, while CN9C is a relative address because it's the object
  46. of a  JR NZ,CN9C  instruction.
  47.  
  48.    The offset is always the difference between the final location
  49. (destination) and the local location (source).    Since the  $  operand
  50. is by definition the local location,  $+OU  expands to:
  51. $+OU   =   ($) + (OU)
  52.        =   (LOCAL_LOC) + (FINAL_LOC - LOCAL_LOC)
  53.        =   FINAL_LOC
  54.  
  55.    Hope this helps.    R.Gaspari.
  56.