home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
simtel
/
sigm
/
vols000
/
vol067
/
prlod.asm
< prev
next >
Wrap
Assembly Source File
|
1984-04-29
|
3KB
|
125 lines
; PRLOADER.ASM VERSION 1.0
; 11/3/80 BY RON FOWLER, WESTLAND, MICHIGAN
;
;
; THIS PROGRAM IS A LOADER DESIGNED TO BE
; ADDED TO A PROGRAM REQUIRING RELOCATION.
; THE PROGRAM MUST BE OF TYPE PRL, AND THIS
; CODE (IN HEX FORM) MUST BE ADDED TO IT
; VIA DDT OR SID. THE PROCEDURE IS:
;
; A>DDT <FILENAME>.PRL
; *IPRLOADER.HEX
; *R
; *^C
; A>SAVE XX <FILENAME>.COM
;
; THE FILE SIZE PARAMETER LOCATED IN THIS
; CODE AT LOCATION 101H IS FILLED IN BY
; GENMOD.COM IN THE PRL FILE. THE FILE
; RELOCATION ADDRESS AT 104H IS FILLED IN
; BY THE USER, AND IF LEFT 0, WILL CAUSE
; THE FILE TO LOAD UNDER THE CCP. IF SET
; TO 0001H, THE FILE WILL LOAD UNDER THE
; BDOS, OVERLAYING THE CCP.
;
BDOS EQU 5
BYE EQU 1 ;THIS SPECIALLY FOR BYE PGM
CPM2 EQU 1 ;THIS NEEDED ONLY FOR BYE
COMUSR EQU 15 ;THIS TOO...USED WITH RBBS
;
;
ORG 100H
;
DB 01H ;LXI B
DS 2 ;GENMOD FILLS IN PGM SIZE HERE
LXI H,0 ;PGM RUN ADRS, IF 0 OR 1 THEN IN TPA
LXI SP,200H ;MAKE SURE SPACE AVAILABLE WHEN MODIFYING THIS PGM
LXI D,200H ;ADRS OF PRL STUFF
MOV A,H ;IF H IS NZ, THEN WE HAVE..
ORA A ;..ADRS TO RELOCATE TO
JNZ MOVE
MOV A,L ;NO REL ADRS SUPPLIED, CHECK OPTIONS
LHLD 6 ;TOPMEM FOR LATER
ORA A ;IF ADRS WAS NOT ZERO..
MOV A,H
JNZ OVLCCP ;..THEN FORGET THE CCP
SUI 8 ;..ELSE SAVE SPACE FOR IT
OVLCCP: DCR A
SUB B ;SUBTRACT OUR PROGRAM SIZE
MOV H,A ;SAVE IN HL
;
; AT THIS POINT, ADD IN ANY NECESSARY
; CODE TO TEST L=6...THIS MAY BE NECESSARY
; TO DETERMINE IF THIS CODE IS ALREADY IN
; MEMORY
;
MVI L,0 ;RELOC ADRS MUST BE ON PAGE BOUNDARY
MOVE: XCHG ;SHIFT GEARS
PUSH B ;SAVE COUNT
PUSH D ;AND REL ADRS
MOVLOP: MOV A,B ;CHECK COUNT FOR ZERO
ORA C
JZ RELOC ;EXIT LOOP WHEN COUNT=0
DCX B ;COUNTDOWN
MOV A,M ;PICK UP
STAX D ;PUT DOWN
INX D ;BUMP POINTERS
INX H
JMP MOVLOP ;AND LOOP
;
; THE CODE HAS BEEN MOVED, NOW RELOCATE
; IT AT IT'S NEW LOCATION.
;
RELOC: POP D ;GET RELOC ADRS
POP B ;GET BACK COUNT
PUSH H ;SAVE BITMAP POINTER
MOV H,D ;BASE PAGE ADDRESS IN H
RLOOP: MOV A,B ;TEST COUNT FOR ZERO
ORA C
JZ FINISH ;EXIT LOOP WHEN COUNT=0
DCX B ;BUMPDOWN COUNT
MOV A,E ;CHECK BYTE BOUNDARY..
ANI 7 ;..OF BIT MAP
JNZ NOT8 ;SKIP IF NOT OUT OF BITS
XTHL ;ELSE GET BITMAP POINTER
MOV A,M ;GET NEXT BYTE FROM BITMAP
INX H ;POINT AHEAD
XTHL ;RESTORE THINGS
MOV L,A ;BITMAP BYTE GOES IN L
NOT8: MOV A,L ;TEST NEXT BIT
RAL
MOV L,A ;PUT SHIFTED BIT BACK FOR NXT TIME
JNC NOTREL ;BITS THAT ARE ZERO ARE NOT RELOC'ED
LDAX D ;ELSE GET NEXT BYTE INTO ACCUMULATOR
ADD H ;ADD BASE PAGE
STAX D ;STORE IT BACK RELOCATED
NOTREL: INX D ;BUMP PROGRAM POINTER
JMP RLOOP ;THEN LOOP
FINISH: POP D
MVI L,0
PUSH H ;SAVE ADRS TO JMP TO FOR LATER
;
; INSERT ANY CODE NEEDED BEFORE BRANCH
; TO PROGRAM AT THIS POINT.
;
IF BYE ;DO THIS STUFF FOR BYE PROGRAM
MVI A,0C3H ;CLEAR ANY TRAPS SO SYSOP..
STA 0 ;CAN USER "BYE /A"
XRA A ;NEXT WARMBOOT TO USR0/DRV A
STA 4
MVI C,14 ;MAKE DRIVE A DEFAULT
MOV E,A ;LOG-IN DRIVE CP/M FUNCTION
CALL BDOS
ENDIF ;OF (IF BYE)
;
IF CPM2 AND BYE ;SET USER 0
MVI C,32 ;GET/SET USR CP/M FUNCTION
MVI E,COMUSR
CALL BDOS
ENDIF ;OF (IF CPM2 AND BYE)
;
RET ;TO ADRS PUSH'ED ABOVE