home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / dskbuf / prlmove.aqm / PRLMOVE.ASM
Assembly Source File  |  1985-02-09  |  4KB  |  143 lines

  1. ;****************************************************************
  2. ;    PRL FILE FORMAT RELOCATER FOR BIT MAPPED FILES
  3. ;****************************************************************
  4. ;
  5. ;
  6. ;    This small program block moves a bit map relocatable
  7. ;    file from address 0200h above this module up to a spot
  8. ;    below the CCP and then jumps to the base of the moved
  9. ;    code. The DIGITAL RESEARCH RELOCATING ASSEMBLER and the
  10. ;    companion LINKER permit the generation of the PRL file
  11. ;    format. LINK will put the code size word in to address
  12. ;    101 and 102. The code spot is intended to be 0200h with
  13. ;    the bit map immediately above the code. A one in the bit
  14. ;    map indicates the location of a moved byte that requires 
  15. ;    a relocation address offset.
  16. ;
  17. ;***************************************************************
  18. ;
  19. ;
  20. ;start point for the beginning of the mover module
  21. ;
  22.     ORG    0100H
  23. ;
  24. ;
  25. ;GENERAL CP/M BDOS INTERFACE EQUATES.
  26. ;
  27. BDOS    EQU    0005H        ;FILE MANAGER ENTRANCE LOCATION
  28. CODE$START EQU    0200H        ;LINK 80 CODE START POINT FOR ORG 0 FILE
  29. ;
  30. ;
  31. ;START POINT OF MOVER CODE
  32. ;
  33.     DB    01H        ;INSERT HEX FILE CODE FOR LXI B,XXXX
  34.     DS    2        ;INSERT CODE SIZE FROM LINK .PRL FILE
  35.                 ;WITH DDT HERE
  36.     LXI    H,0        ;GET CCP STACK FOR LATER PASSING
  37.     DAD    SP        ;TO RELOCATED PROGRAM
  38.     LXI    SP,CODE$START    ;LET STACK WORK DOWN FROM 0200H
  39.     PUSH    H        ;SAVE CCP POINTER ON OUR STACK
  40. ;
  41.     PUSH    B        ;SAVE A COPY OF CODE SIZE ON STACK
  42. ;
  43. ;
  44. ;GET BDOS PAGE ADDRESS BOUNDARY
  45. ;
  46.     LXI    H,BDOS+2    ;PAGE ADDRESS OF BDOS BASE
  47.     MOV    A,M        ;INTO (A)
  48.     SUI    8        ;DECREASE SIZE FOR CCP SIZE
  49.                 ;OF EIGHT PAGES
  50.     DCR    A        ;ONE MORE TIME TO ACCOUNT FOR
  51.                 ;..PARTIAL PAGE CODE SIZE
  52.     SUB    B        ;SUBTRACT CODE SIZE IN TRUNC INTETGER SIZE
  53. ;
  54.     MOV    D,A        ;(DE) = DESTINATION ADDRESS BASE
  55.     MVI    E,0
  56.     PUSH    D        ;SAVE LOAD ADDRESS FOR LATER JUMP TO CODE
  57. ;
  58.     LXI    H,CODE$START    ;START MOVE POINTER TO (HL)
  59. ;
  60. ;
  61. ;LOOP TO MOVE CODE UP IN RAM UNDER CCP
  62. ;
  63. MOVLOOP:
  64.     MOV    A,B        ;CHECK BYTE COUNT TO SEE IF ALL MOVED YET
  65.     ORA    C
  66.     JZ    MOVDONE        ;EXIT LOOP IF DONE
  67. ;
  68.     DCX    B        ;DECREMENT BYTES TO MOVE COUNT
  69.     MOV    A,M        ;GET A BYTE TO MOVE
  70.     STAX    D        ;SAVE AT DESTINATION ADDRESS
  71.     INX    D        ;BUMP SOURCE DESTINATION POINTERS
  72.     INX    H
  73.     JMP    MOVLOOP        ;GO MOVE MORE BYTES
  74. ;
  75. ;
  76. ;CODE MOVED SO SET UP TO SCAN BIT MAP
  77. ;
  78. MOVDONE:
  79.     POP    D        ;GET BACK A COPY OF THE DESTINATION ADDR
  80.     POP    B        ;RESET (BC) TO BYTE COUNT FOR BIT MAP SCAN
  81.     PUSH    H        ;SAVE ADDRESS OF BIT MAP ON TOP OF STACK
  82. ;
  83.     MOV    H,D        ;SET (H) TO RELOCATE PAGE OFFSET
  84.     DCR    H
  85. ;
  86. ;
  87. ;LOOP TO SCAN CODE BLOCK JUST MOVED AND TO ADD IN OFFSET OF EXECUTION
  88. ;PAGE ADDRESS ON ALL BYTES NEEDING RELOCATION.
  89. ;
  90. RELOCLOOP:
  91.     MOV    A,B        ;CHECK BIT MAP COUNTER TO SEE IF RELOC DONE
  92.     ORA    C
  93.     JZ    RELOCDONE    ;EXIT IF ALL BYTES CHECKED
  94.     DCX    B        ;DECREASE BYTE COUNT
  95.     MOV    A,E        ;IS (DE) ADDRESS MOD EIGHT BYTES?
  96.     ANI    7        ;IF SO WE NEED NEXT BIT MAP BYTE
  97.     JNZ    SAMEBYTE    ;STILL ON SAME BIT MAP BYTE
  98. ;
  99. ;
  100. ;GET NEXT BIT MAP BYTE VIA POINTER ON TOP OF STACK
  101. ;
  102.     XTHL            ;SAVE (HL) AND GET CURRENT MAP POINTER
  103.     MOV    A,M        ;GET MAP BYTE TO (A)
  104.     INX    H        ;INCREASE POINTER FOR NEXT TIME
  105.     XTHL            ;PUT POINTER BACK ONTO STACK
  106.     MOV    L,A        ;MAP BYTE TO HOLDING RESISTER
  107. ;
  108. SAMEBYTE:
  109.     MOV    A,L        ;FETCH OUR CURRENT BIT MAP BYTE
  110.     RAL            ;SHIFT BIT MAP BYTE FOR NEXT BIT
  111.     MOV    L,A        ;SAVE SHIFTED ONE FOR NEXT PASS
  112.     JNC    NOOFFSET    ;SKIP OFFSET ADD IF BIT WAS NOT ONE
  113. ;
  114. ;
  115. ;GET CODE BYTE AND ADD IN OFFSET IF MAP BIT WAS 1
  116. ;
  117.     LDAX    D        ;FETCH THE DESTINATION BYTE
  118.     ADD    H        ;ADD IN OFFSET
  119.     STAX    D        ;STORE BACK AWAY
  120. ;
  121. NOOFFSET:
  122.     INX    D        ;INCREASE THE MOVED CODE BYTE POINTER
  123.     JMP    RELOCLOOP    ;GO TO PROCESS MORE BYTES
  124. ;
  125. ;
  126. ;HERE WHEN THE RELOCATION IS DONE READY TO JUMP TO THE MOVED CODE
  127. ;REMEMBER THAT (H) HAS PAGE ADDRESS OF MOVED CODE.
  128. ;
  129. RELOCDONE:
  130.     POP    D        ;GET BIT MAP POINTER OFF STACK
  131.     MOV    D,H
  132.     INR    D        ;SET UP EXECUTION ADDRESS
  133.     MVI    E,0        ;MAKE (DE) AND EVEN PAGE BOUNDARY ADDRESS
  134.     POP    H        ;GET THE SAVED CCP STACK POINTER
  135.     SPHL            ;RESET FOR FOING TO MOVED PROGRAM
  136.     XCHG            ;GET TRANSFER ADDRESS FROM (DE)
  137.     PCHL            ;OFF TO THE MOVED CODE AREA
  138. ;
  139.     END
  140. ;
  141. ;
  142. ;+++...END OF FILE
  143.