home *** CD-ROM | disk | FTP | other *** search
/ Commodore Disk User Volume 4 #2 / Commodore_Disk_User_Vol.4_2_1990_-.d64 / relocv1.1.asm < prev    next >
Assembly Source File  |  2022-10-26  |  5KB  |  224 lines

  1. E
  2. _*********************************************************
  3. _*                                                       *
  4. _*       MODULE NAME : reloc.asm                         *
  5. _*                                                       *
  6. _*                mAINTENANCE LOG                        *
  7. _*                ---------------                        *
  8. _*                                                       *
  9. _*   DATE      TIME                     ACTION           *
  10. _*   ----      ----                     ------           *
  11. _* 24/02/89    01:00                 INITIAL CODING      *
  12. _* 28/03/89    22:45      FIX BUGS, UPDATE LOGIC, TIDY   *
  13. _* 03/04/89    23:50      ADDED OLDEND, FIXED ASS BUGS   *
  14. _* 06/04/8923:20  MOVED ZERO PAGE DEFINITIONS    *
  15. _* 03/05/89    17:40        FIX dey BUG                  *
  16. _* 31/09/89    16:00      FIX GETLEN BUG & END CHECK BUG *
  17. _*********************************************************
  18.  
  19.  
  20.  
  21. _*********************************************************
  22. _*                                                       *
  23. _*       ROUTINE : reloc                                 *
  24. _*                                                       *
  25. _*   ENTRY                                               *
  26. _*   -----                                               *
  27. _*   oldadd   - oLD START ADDRESS OF PROGRAM             *  
  28. _*   oldend   - OLD END ADDRESS OF PROGRAM               *
  29. _*   newstart - NEW START ADDRESS OF PROGRAM             *  
  30. _*   newend   - NEW END ADDRESS OF PROGRAM               *
  31. _*   newram   - CONFIGURATION OF NEW PROGRAM TO RELOCATE *
  32. _*   execadd  - OLD EXECUTE ADDRESS                      *
  33. _*.......................................................*
  34. _*   USED                                                *
  35. _*   ----                                                *
  36. _*   a,y                                                 *
  37. _*.......................................................*
  38. _*   EXIT                                                *
  39. _*   ----                                                *
  40. _*   newexec  - NEW EXECUTE ADDRESS                      *
  41. _*   newend   - NEW END ADDRESS OF THE PROGRAM           *
  42. _*              NEVER UPDATED AND USED OUTSIDE           *
  43. _*********************************************************
  44.  
  45.  
  46. _ START OF THE CODE
  47. _ CALCULATE THE ACTUAL PROGRAM START ADDRESS AND SETS THE 
  48. _ RELOCATE POINTER TO START FROM THAT POINT.
  49.  
  50. RELOCEQU *
  51.  EXECADD
  52. {CBM-D}
  53. {CBM-Q} OLDADD
  54. {CBM-P} NEWEXEC
  55.  EXECADD+1
  56. {CBM-Q} OLDADD+1
  57. {CBM-P} NEWEXEC+1
  58.  NEWEXEC
  59.  
  60.  NEWSTART
  61. {CBM-P} NEWEXEC
  62. {CBM-P} PROGPTR
  63.  NEWEXEC+1
  64.  NEWSTART+1
  65. {CBM-P} NEWEXEC+1
  66. {CBM-P} PROGPTR+1
  67.  
  68. _ SETUP ldafar AND stafar WITH PROGPTR AS ZERO PAGE ADDRESS
  69.        
  70.  #PROGPTR
  71. {CBM-P} LDASET
  72. {CBM-P} STASET
  73.  
  74. RELLOOP1EQU *
  75.  #0
  76.  NEWRAM_ GET RAM BLOCK OF PROGRAM
  77.  LDAFAR_ GET MACHINE CODE COMMAND
  78.  GETLEN_ GET LENGTH OF COMMAND
  79.  #3_ IF 3 THEN COMMAND HAS AN ADDRESS
  80.  ADDRCMD
  81.  MOVEON
  82.  
  83.  
  84. _ 3 BYTE COMMAND SO GET THE ADDRESS FOLLOWING
  85.  
  86. ADDRCMDEQU *
  87.  
  88.  LDAFAR
  89. {CBM-P} CURRADD
  90.  
  91.  LDAFAR
  92. {CBM-P} CURRADD+1
  93.  
  94. _ ADDRESS GOT, SO SEE IF IT IS IN RANGE OF THE START AND END ADDRESSES
  95.  
  96.  CHECKLIM   _ DOESN'T AFFECT y REGISTER
  97.  MOVEON3
  98.  
  99. _ CALCULATE NEWADD = CURRADD - OLDADD + NEWSTART
  100.  
  101.  CURRADD 
  102. {CBM-D}
  103. {CBM-Q} OLDADD
  104. {CBM-P} CURRADD
  105.  CURRADD+1
  106. {CBM-Q} OLDADD+1
  107. {CBM-P} CURRADD+1
  108.  CURRADD
  109.  
  110.  NEWSTART
  111. {CBM-P} CURRADD
  112.  CURRADD+1
  113.  NEWSTART+1
  114.  STAFAR_ SAVE CURRADD+1 IN THE PROGRAM BEING REL'ED
  115.  
  116.  CURRADD
  117.  STAFAR
  118. MOVEON3EQU *
  119.  #3
  120.  MOVEON
  121.  
  122.  
  123. _ MOVE ONTO NEXT COMMAND a = LENGTH OF LAST COMMAND ALREADY
  124.  
  125. MOVEON    EQU *
  126.  INCPT
  127.  RELLOOP1
  128.  
  129. RELENDEQU *
  130. {CBM-N}
  131.  
  132. _ mOVE THE PROGRAM POINTER ON A DISTANCE BASED ON a.
  133. _ THIS ROUTINE ALSO CHECKS FOR END OF PROGRAM AREA.
  134.  
  135. INCPTEQU * 
  136.  
  137.  PROGPTR
  138. {CBM-P} PROGPTR
  139.  PROGPTR+1
  140.  #0
  141. {CBM-P} PROGPTR+1
  142.  
  143. _ NOW CHECK FOR END OF PROGRAM AREA
  144.  
  145.  NEWEND+1
  146.  EXITINC1_ NOT IN TOP RANGE YET, RETURN C CLEAR
  147.  CHECKRST_ SAME TOP ADDRESS SO CHECK BOTTOM
  148.  EXITINC1_ WE ARE WELL PAST IT, SO CARRY SET
  149. CHECKRSTEQU *
  150.  PROGPTR
  151.  NEWEND
  152.  
  153. _ IF PROGPTR >= EDADD THEN C=1 SO WE RETURN C=1 TO INDICATE OVERFLOW
  154.  
  155. EXITINC1EQU *
  156. {CBM-N}
  157.  
  158. _ FIND THE LENGTH OF THE COMMAND
  159.  
  160. GETLENEQU *
  161. {CBM-P} NEUMONIC
  162.  #15_ GET BOTTOM 4 BITS
  163.  #$0C
  164.  BYTE3
  165.  #$0D
  166.  BYTE3
  167.  #$0E
  168.  BYTE3
  169.  #$0A
  170.  BYTE1
  171.  #8
  172.  BYTE1
  173.  #9
  174.  BYTE2
  175.  NEUMONIC
  176.  #%00010000
  177.  BYTE3_ TOP NIBBLE IS ODD IF VALUE FROM AND RETURNED
  178.  
  179. _ FALLS THROUGH TO BE 2 BYTES
  180.  
  181. BYTE2EQU *
  182.  #2
  183. DB  $2C
  184. BYTE1 #1
  185. DB  $2C
  186. BYTE3  #3
  187. {CBM-N}
  188.  
  189. NEUMONIC  DB  0
  190.  
  191. _ CHECK CURRADD TO SEE IF IT IS >=STADD AND <=EDADD
  192. _ C=0 MEANS NOT IN RANGE
  193.  
  194. CHECKLIMEQU *
  195.  CURRADD+1
  196.  OLDADD+1
  197.  NOTIN
  198.  POSSIBLY
  199.  ABOVE
  200. POSSIBLYEQU *
  201.  CURRADD
  202.  OLDADD
  203.  NOTIN
  204.  
  205. _ DEFINITELY ABOVE THE LOWER LIMIT
  206.  
  207. ABOVEEQU *
  208.  OLDEND+1
  209.  CURRADD+1
  210.  NOTIN
  211.  MAYBE
  212.  YESIN
  213. MAYBEEQU *
  214.  OLDEND
  215.  CURRADD_ IF C=0 HERE, NOT IN RANGE
  216.  
  217. YESINEQU *
  218. NOTINEQU *
  219. {CBM-N}
  220.  
  221. iend
  222.  
  223.  
  224.