home *** CD-ROM | disk | FTP | other *** search
- ;
- ; TITLE HEADER FOR REL.UTL MOVE UP AND RELOCATE
- ; FILENAME RELHDR.ASM
- ; AUTHOR Robert A. Van Valzah 7/23/78
- ; LAST REVISED R. A. V. 11/25/79
- ; REASON ADDED LENGTH BYTE
- ;
- ;
- BDOS EQU 5
- ;
- ;
- ORG 100H
- ENTRY:
- lhld len ;get length of code to relocate
- mov b,h ;copy length to reg bc
- mov c,l
- xra a ;set carry if len is not a 256
- sub l ;boundry
- LDA BDOS+2 ;GET CURRENT SID BASE PAGE
- SbB h ;CALCULATE BASE OF REL AS SID BASE -
- ;LENGTH OF REL
- MOV H,A ;DESTINATION ADDRESS -> HL
- MVI L,0
- PUSH H ;SAVE DEST FOR ENTRY WHEN RELOC IS DONE
- LXI D,CODE0 ;POINTER TO CODE ORGED FOR 0
- PUSH B ;SAVE LENGTH
- PUSH H ;SAVE DEST
- MOVE:
- LDAX D ;GET A BYTE FROM CODE 1 IMAGE
- MOV M,A ;MOVE TO DEST
- INX D ;BUMP CODE 1 POINTER
- INX H ;BUMP DEST POINTER
- DCX B ;MOVED WHOLE THING YET?
- MOV A,B
- ORA C
- JNZ MOVE
- POP H ;GET DEST BACK
- POP B ;GET LENGTH BACK
- push d ;push reloc table address to stack
- MOV D,H ;BIAS IN REG D
- NEWBYT:
- XTHL ;GET RELOC TBL ADR
- MOV E,M ;KEEP A REL BYTE IN REG E
- INX H ;BUMP RELOC TBL POINTER
- XTHL ;PUT TBL PTR BACK
- RELBYT:
- MOV A,E ;GET RELOC BYTE
- RLC ;MOVE A BIT INTO CARY
- MOV E,A ;SAVE THE REST OF THE RELOC BITS
- JNC NOREL ;BIT WAS 0, DON'T RELOCATE THIS BYTE
- MOV A,D ;GET BIAS TO ADD
- ADD M ;ADD TO BYTE FROM DEST
- MOV M,A
- NOREL:
- INX H ;BUMP DEST POINTER
- DCX B ;DONE WITH ALL BYTES?
- MOV A,B
- ORA C
- JZ MOVEDONE ;YUP - VECTOR TO REL BASE
- MOV A,L ;NOPE - TEST IF AT 8 BYTE BOUNDRY
- ANI 0000$0111B ;IF SO, TIME FOR A NEW BYTE FROM TABLE
- JNZ RELBYT ;NOT AT BOUNDRY
- JMP NEWBYT ;AT A BOUNDRY
- MOVEDONE:
- POP B ;REMOVE RELOC TBL ADR FROM STACK
- ret ;vector to base of now relocated code
- ;
- org (($-1) and 0fff8h) + 8
- ;
- code0: ;address where code orged for zero goes
- bias equ $ ;bias used to read code orged for zero
- ;
- org $+26h ;displacement to length word
- len ds 2
- ;
- END ENTRY
-