mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-24 00:44:23 +00:00
99 lines
2.4 KiB
NASM
99 lines
2.4 KiB
NASM
VERSION EQU 30
|
||
; SID RELOCATOR PROGRAM, INCLUDED WITH THE MODULE TO PERFORM
|
||
; THE MOVE FROM 200H TO THE DESTINATION ADDRESS
|
||
ORG 100H
|
||
STACK EQU 200H
|
||
BDOS EQU 0005H
|
||
PRNT EQU 9 ;BDOS PRINT FUNCTION
|
||
MODULE EQU 200H ;MODULE ADDRESS
|
||
LXIM equ 01h
|
||
;
|
||
db LXIM
|
||
ds 2
|
||
; lxi b,00 ;set at merge
|
||
;
|
||
JMP START
|
||
|
||
; PATCH AREA, DATE, VERSION & SERIAL NOS.
|
||
|
||
dw 0,0,0,0,0,0,0,0
|
||
dw 0,0,0,0,0,0,0,0
|
||
dw 0,0,0,0,0,0,0,0
|
||
dw 0,0,0,0,0
|
||
|
||
db 'CP/M Version 3.0'
|
||
maclib makedate
|
||
@LCOPY ;[JCE] Copyright & build date moved to their own
|
||
@BDATE ; files.
|
||
db 0,0,0,0 ; patch bit map
|
||
db '654321' ; Serial no.
|
||
|
||
SIGNON: DB 'CP/M 3 SID - Version '
|
||
DB VERSION/10+'0','.'
|
||
DB VERSION MOD 10 + '0','$'
|
||
START: LXI SP,STACK
|
||
PUSH B
|
||
PUSH B
|
||
LXI D,SIGNON
|
||
MVI C,PRNT
|
||
CALL BDOS
|
||
POP B ;RECOVER LENGTH OF MOVE
|
||
LXI H,BDOS+2;ADDRESS FIELD OF JUMP TO BDOS (TOP MEMORY)
|
||
MOV A,M ;A HAS HIGH ORDER ADDRESS OF MEMORY TOP
|
||
DCR A ;PAGE DIRECTLY BELOW BDOS
|
||
SUB B ;A HAS HIGH ORDER ADDRESS OF RELOC AREA
|
||
MOV D,A
|
||
MVI E,0 ;D,E ADDRESSES BASE OF RELOC AREA
|
||
PUSH D ;SAVE FOR RELOCATION BELOW
|
||
;
|
||
LXI H,MODULE;READY FOR THE MOVE
|
||
MOVE: MOV A,B ;BC=0?
|
||
ORA C
|
||
JZ RELOC
|
||
DCX B ;COUNT MODULE SIZE DOWN TO ZERO
|
||
MOV A,M ;GET NEXT ABSOLUTE LOCATION
|
||
STAX D ;PLACE IT INTO THE RELOC AREA
|
||
INX D
|
||
INX H
|
||
JMP MOVE
|
||
;
|
||
RELOC: ;STORAGE MOVED, READY FOR RELOCATION
|
||
; HL ADDRESSES BEGINNING OF THE BIT MAP FOR RELOCATION
|
||
POP D ;RECALL BASE OF RELOCATION AREA
|
||
POP B ;RECALL MODULE LENGTH
|
||
PUSH H ;SAVE BIT MAP BASE IN STACK
|
||
MOV H,D ;RELOCATION BIAS IS IN D
|
||
;
|
||
REL0: MOV A,B ;BC=0?
|
||
ORA C
|
||
JZ ENDREL
|
||
;
|
||
; NOT END OF THE RELOCATION, MAY BE INTO NEXT BYTE OF BIT MAP
|
||
DCX B ;COUNT LENGTH DOWN
|
||
MOV A,E
|
||
ANI 111B ;0 CAUSES FETCH OF NEXT BYTE
|
||
JNZ REL1
|
||
; FETCH BIT MAP FROM STACKED ADDRESS
|
||
XTHL
|
||
MOV A,M ;NEXT 8 BITS OF MAP
|
||
INX H
|
||
XTHL ;BASE ADDRESS GOES BACK TO STACK
|
||
MOV L,A ;L HOLDS THE MAP AS WE PROCESS 8 LOCATIONS
|
||
REL1: MOV A,L
|
||
RAL ;CY SET TO 1 IF RELOCATION NECESSARY
|
||
MOV L,A ;BACK TO L FOR NEXT TIME AROUND
|
||
JNC REL2 ;SKIP RELOCATION IF CY=0
|
||
;
|
||
; CURRENT ADDRESS REQUIRES RELOCATION
|
||
LDAX D
|
||
ADD H ;APPLY BIAS IN H
|
||
STAX D
|
||
REL2: INX D ;TO NEXT ADDRESS
|
||
JMP REL0 ;FOR ANOTHER BYTE TO RELOCATE
|
||
;
|
||
ENDREL: ;END OF RELOCATION
|
||
POP D ;CLEAR STACKED ADDRESS
|
||
MVI L,0
|
||
PCHL ;GO TO RELOCATED PROGRAM
|
||
END
|
||
|