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 >
Wrap
Assembly Source File
|
2022-10-26
|
5KB
|
224 lines
E
_*********************************************************
_* *
_* MODULE NAME : reloc.asm *
_* *
_* mAINTENANCE LOG *
_* --------------- *
_* *
_* DATE TIME ACTION *
_* ---- ---- ------ *
_* 24/02/89 01:00 INITIAL CODING *
_* 28/03/89 22:45 FIX BUGS, UPDATE LOGIC, TIDY *
_* 03/04/89 23:50 ADDED OLDEND, FIXED ASS BUGS *
_* 06/04/8923:20 MOVED ZERO PAGE DEFINITIONS *
_* 03/05/89 17:40 FIX dey BUG *
_* 31/09/89 16:00 FIX GETLEN BUG & END CHECK BUG *
_*********************************************************
_*********************************************************
_* *
_* ROUTINE : reloc *
_* *
_* ENTRY *
_* ----- *
_* oldadd - oLD START ADDRESS OF PROGRAM *
_* oldend - OLD END ADDRESS OF PROGRAM *
_* newstart - NEW START ADDRESS OF PROGRAM *
_* newend - NEW END ADDRESS OF PROGRAM *
_* newram - CONFIGURATION OF NEW PROGRAM TO RELOCATE *
_* execadd - OLD EXECUTE ADDRESS *
_*.......................................................*
_* USED *
_* ---- *
_* a,y *
_*.......................................................*
_* EXIT *
_* ---- *
_* newexec - NEW EXECUTE ADDRESS *
_* newend - NEW END ADDRESS OF THE PROGRAM *
_* NEVER UPDATED AND USED OUTSIDE *
_*********************************************************
_ START OF THE CODE
_ CALCULATE THE ACTUAL PROGRAM START ADDRESS AND SETS THE
_ RELOCATE POINTER TO START FROM THAT POINT.
RELOCEQU *
EXECADD
{CBM-D}
{CBM-Q} OLDADD
{CBM-P} NEWEXEC
EXECADD+1
{CBM-Q} OLDADD+1
{CBM-P} NEWEXEC+1
NEWEXEC
NEWSTART
{CBM-P} NEWEXEC
{CBM-P} PROGPTR
NEWEXEC+1
NEWSTART+1
{CBM-P} NEWEXEC+1
{CBM-P} PROGPTR+1
_ SETUP ldafar AND stafar WITH PROGPTR AS ZERO PAGE ADDRESS
#PROGPTR
{CBM-P} LDASET
{CBM-P} STASET
RELLOOP1EQU *
#0
NEWRAM_ GET RAM BLOCK OF PROGRAM
LDAFAR_ GET MACHINE CODE COMMAND
GETLEN_ GET LENGTH OF COMMAND
#3_ IF 3 THEN COMMAND HAS AN ADDRESS
ADDRCMD
MOVEON
_ 3 BYTE COMMAND SO GET THE ADDRESS FOLLOWING
ADDRCMDEQU *
LDAFAR
{CBM-P} CURRADD
LDAFAR
{CBM-P} CURRADD+1
_ ADDRESS GOT, SO SEE IF IT IS IN RANGE OF THE START AND END ADDRESSES
CHECKLIM _ DOESN'T AFFECT y REGISTER
MOVEON3
_ CALCULATE NEWADD = CURRADD - OLDADD + NEWSTART
CURRADD
{CBM-D}
{CBM-Q} OLDADD
{CBM-P} CURRADD
CURRADD+1
{CBM-Q} OLDADD+1
{CBM-P} CURRADD+1
CURRADD
NEWSTART
{CBM-P} CURRADD
CURRADD+1
NEWSTART+1
STAFAR_ SAVE CURRADD+1 IN THE PROGRAM BEING REL'ED
CURRADD
STAFAR
MOVEON3EQU *
#3
MOVEON
_ MOVE ONTO NEXT COMMAND a = LENGTH OF LAST COMMAND ALREADY
MOVEON EQU *
INCPT
RELLOOP1
RELENDEQU *
{CBM-N}
_ mOVE THE PROGRAM POINTER ON A DISTANCE BASED ON a.
_ THIS ROUTINE ALSO CHECKS FOR END OF PROGRAM AREA.
INCPTEQU *
PROGPTR
{CBM-P} PROGPTR
PROGPTR+1
#0
{CBM-P} PROGPTR+1
_ NOW CHECK FOR END OF PROGRAM AREA
NEWEND+1
EXITINC1_ NOT IN TOP RANGE YET, RETURN C CLEAR
CHECKRST_ SAME TOP ADDRESS SO CHECK BOTTOM
EXITINC1_ WE ARE WELL PAST IT, SO CARRY SET
CHECKRSTEQU *
PROGPTR
NEWEND
_ IF PROGPTR >= EDADD THEN C=1 SO WE RETURN C=1 TO INDICATE OVERFLOW
EXITINC1EQU *
{CBM-N}
_ FIND THE LENGTH OF THE COMMAND
GETLENEQU *
{CBM-P} NEUMONIC
#15_ GET BOTTOM 4 BITS
#$0C
BYTE3
#$0D
BYTE3
#$0E
BYTE3
#$0A
BYTE1
#8
BYTE1
#9
BYTE2
NEUMONIC
#%00010000
BYTE3_ TOP NIBBLE IS ODD IF VALUE FROM AND RETURNED
_ FALLS THROUGH TO BE 2 BYTES
BYTE2EQU *
#2
DB $2C
BYTE1 #1
DB $2C
BYTE3 #3
{CBM-N}
NEUMONIC DB 0
_ CHECK CURRADD TO SEE IF IT IS >=STADD AND <=EDADD
_ C=0 MEANS NOT IN RANGE
CHECKLIMEQU *
CURRADD+1
OLDADD+1
NOTIN
POSSIBLY
ABOVE
POSSIBLYEQU *
CURRADD
OLDADD
NOTIN
_ DEFINITELY ABOVE THE LOWER LIMIT
ABOVEEQU *
OLDEND+1
CURRADD+1
NOTIN
MAYBE
YESIN
MAYBEEQU *
OLDEND
CURRADD_ IF C=0 HERE, NOT IN RANGE
YESINEQU *
NOTINEQU *
{CBM-N}
iend