; MAKSRL - PROGRAM TO MAKE SELF-RELOCATING PROGRAM ; DASM'D AND MOD'D FROM MAKELUX 03/29/85 BY RDL ; ; LAST CHANGED 04/01/85 RDL ; NAME ('MAKSRL') ; ; Thió prograí wilì creatå á self-relocatinç program¬ thaô is¬ á ;    prograí whicè automaticallù relocateó itselæ tï higè memorù ;    upoî beginninç execution® MAKSRÌ ió invokeä witè á file- ;    namå headeò whicè identifieó thå twï sourcå fileó describeä ;    below¬ anä thå destinatioî file® Thå header¬ ¬ maù ;    contaiî á drivå designation® MAKSRÌ requireó twï sourcå ;    files¬ botè oæ whicè musô bå createä bù L8° froí thå SAMÅ ;    .REÌ file® Thå firsô file¬ .CO0¬ ió createä witè ;    L80'ó /P:° option® Thå seconä file¬ .CO1¬ ió createä ;    normally¬ oò witè /P:100® Iæ botè oæ theså arå found¬ ;    MAKSRÌ createó .COÍ whicè containó thå codå froí ;    .REÌ anä á loadeò whicè relocateó thå codå tï higè ;    memory® Aó aî example¬ thå commanä MAKSRÌ LUØ wilì creatå ;    LUX.COÍ froí LUX.CO° anä LUX.CO1. ; ; ; SET THE FOLLOWING PARAMATER BEFORE ASSEMBLY COMBEG EQU 100H ;BEGINNING ADDRESS OF FINISHED .COM FILE ; ; .Z80 ASEG ORG 100H ; BDOS EQU 0005H EXIT EQU 0000H ; CR EQU 0DH LF EQU 0AH ; OPEN EQU 15 ;OPEN FILE FUNCTION CLOSE EQU 16 ;CLOSE FILE FUNCTION DELETE EQU 19 ;DELETE FILE FUNCTION RDSEQ EQU 20 ;READ SEQUENTIAL FUNCTION WRTSEQ EQU 21 ;WRITE SEQUENTIAL FUNCTION MAKEF EQU 22 ;MAKE FILE FUNCTION SETDMA EQU 26 ;SET DMA FUNCTION ; $EJECT ; ; ; START OF EXECUTABLE CODE ; MAKSRL: LD SP,(BDOS+1) ;SET STACK POINTER ; LD A,(05DH) ;CHECK IF FILE NAME ENTERED CP ' ' JR NZ,MKL000 CALL ILPRNT ' No file name specified', CR, LF, 0 JP EXIT ; MKL000: LD HL,5CH ;COPY FILE NAME HEDR TO CO0FCB LD DE,CO0FCB LD BC,9 LDIR ; LD HL,5CH ;COPY FILE NAME HEDR TO CO1FCB LD DE,CO1FCB LD BC,9 LDIR ; LD HL,5CH ;COPY FILE NAME HEDR TO COMFCB LD DE,COMFCB LD BC,9 LDIR ; ; ; OPEN THE ORG 0 IMAGE FILE ; LD DE,CO0FCB LD C,OPEN CALL BDOS INC A JR NZ,MKL002 CALL ILPRNT DB ' .CO0 open error', CR, LF, 0 JP EXIT ; $EJECT ; ; ; READ THE ORG 0 IMAGE INTO PLACE ; MKL002: LD HL,RELCOD-80H ; MKL003: LD DE,80H ADD HL,DE PUSH HL EX DE,HL LD C,SETDMA CALL BDOS LD DE,CO0FCB LD C,RDSEQ CALL BDOS POP HL OR A JR Z,MKL003 ; LD (ENDPTR),HL LD DE,RELCOD XOR A SBC HL,DE LD (LENGTH+OFFSET),HL ; $EJECT ; ; ; SET UP TO READ CO1 ; LD DE,CO1FCB LD C,OPEN CALL BDOS INC A JR NZ,MKL004 CALL ILPRNT DB ' .CO1 open error', CR, LF, 0 JP EXIT ; ; ; CREATE REL BIT MAP ; MKL004: LD HL,RELCOD LD IX,(ENDPTR) MKL005: LD (IX+0),0 LD B,8 MKL006: CALL NX1BYT JR C,MKL008 CP (HL) JR Z,MKL007 SCF MKL007: RL (IX+0) INC HL DJNZ MKL006 INC IX JR MKL005 ; $EJECT ; ; ; SETUP TO WRITE THE .COM FILE ; MKL008: INC IX LD (ENDPTR),IX ; LD HL,(ENDPTR) ;CALCULATE LENGTH OF .COM FILE LD DE,SRLRLC+OFFSET XOR A SBC HL,DE ; LD DE,7FH ;ROUND UP TO FULL SECTOR ADD HL,DE ; SLA L ;DERIVE SECTOR COUNT RL H LD A,H LD (RECCNT),A ; LD DE,COMFCB ;DELETE ANY EXISTING .COM FILE LD C,DELETE CALL BDOS ; LD DE,COMFCB ;CREATE THE NEW FILE LD C,MAKEF CALL BDOS INC A JR NZ,MKL00C CALL ILPRNT DB ' Cannot create .COM file', CR, LF, 0 JP EXIT ; $EJECT ; ; ; WRITE THE .COM FILE ; MKL00C: LD HL,SRLRLC+OFFSET LD A,(RECCNT) LD B,A ; MKL00D: PUSH HL PUSH BC EX DE,HL LD C,SETDMA CALL BDOS LD DE,COMFCB LD C,WRTSEQ CALL BDOS ; POP BC POP HL LD DE,80H ADD HL,DE OR A JR NZ,MKL00E DJNZ MKL00D ; LD DE,COMFCB LD C,CLOSE CALL BDOS INC A JP NZ,EXIT ; MKL00E: CALL ILPRNT DB ' .COM file write error', CR, LF, 0 LD DE,COMFCB LD C,CLOSE CALL BDOS LD DE,COMFCB LD C,DELETE CALL BDOS JP EXIT ; $EJECT ; ; ; RETURN THE NEXT BYTE FROM THE CO1 FILE ; SET CARRY ON EOF ; NX1BYT: PUSH BC PUSH DE PUSH HL MKL012: LD A,(BYTCTR) INC A LD (BYTCTR),A CP 81H JR NC,MKL013 LD HL,(BYTPTR) LD A,(HL) INC HL LD (BYTPTR),HL POP HL POP DE POP BC OR A RET ; MKL013: XOR A LD (BYTCTR),A LD DE,0080H LD (BYTPTR),DE LD C,SETDMA CALL BDOS LD DE,CO1FCB LD C,RDSEQ CALL BDOS OR A JR Z,MKL012 POP HL POP DE POP BC SCF RET ; $EJECT ; ; ; IN-LINE STRING PRINT ; ILPRNT: EX (SP),HL MKL015: LD A,(HL) OR A JR Z,MKL016 CALL MKL017 INC HL JR MKL015 ; MKL016: EX (SP),HL RET ; MKL017: PUSH AF PUSH BC PUSH DE PUSH HL AND 7FH LD E,A LD C,2 CALL BDOS POP HL POP DE POP BC POP AF RET ; $EJECT ; ; ; STORAGE ; BYTPTR: DW 0 ;BYTE POINTER FOR CO1 READ BYTCTR: DB 80H ;BYTE COUNTER FOR CO1 READ RECCNT: DB 0 ;CNT OF RECS TO SAVE IN .COM ENDPTR: DW 0 ;POINTER TO END OF CODE IMAGE ; CO0FCB: DB 0, ' CO0', 0, 0, 0, 0 DS 16 DB 0, 0, 0, 0 ; CO1FCB: DB 0, ' CO1', 0, 0, 0, 0 DS 16 DB 0, 0, 0, 0 ; COMFCB: DB 0, ' COM', 0, 0, 0, 0 DS 16 DB 0, 0, 0, 0 ; $EJECT ; ; ; THE SRLRLC CODE STARTS THE FINISHED .COM FILE ; ; SRLRLC - RELOCATING LOADER FOR SRL PGM ; ; THIS CODE IS THE FIRST TO EXECUTE WHEN THE FINISHED ; PROGRAM IS EXECUTED. ; ; OFFSET EQU $-COMBEG .PHASE COMBEG ; ; ; DO THE ADDRESS MODS FOR THE CODE ; SRLRLC: LD HL,(BDOS+1) ;CALC STARTING ADDR FOR RELOC LD DE,(LENGTH) ;DE = PGM LENGTH XOR A SBC HL,DE LD L,0 LD (DEST),HL LD C,H ; C = MSB OF RELOCATED PGM LD HL,RELCOD-OFFSET ADD HL,DE PUSH HL POP IX ;IX = REL MAP PTR LD HL,RELCOD-OFFSET;HL = PGM IMAGE PTR ; LRL005: LD B,8 ; B = BIT CTR LRL006: RL (IX+0) JR NC,LRL007 LD A,(HL) ;RELOCATE A BYTE ADD A,C LD (HL),A LRL007: INC HL DEC DE LD A,E OR D JR Z,MOVE DJNZ LRL006 INC IX JR LRL005 ; $EJECT ; ; ; MOVE THE CODE INTO PLACE ; MOVE: LD HL,RELCOD-OFFSET LD DE,(DEST) LD BC,(LENGTH) LDIR LD HL,(DEST) ;GO EXECUTE THE CODE JP (HL) ; ; ; STORAGE FOR LOADER ; LENGTH: DW 0 DEST: DW 0 ; .DEPHASE ; RELCOD EQU $ ;REL CODE IMAGE (ORG 0) GOES HERE ;THE BIT MAP FOLLOWS THE REL CODE ; ; ; THAT'S ALL, FOLKS! ; END MAKSRL