home *** CD-ROM | disk | FTP | other *** search
- ; 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¼ <hedr>¼ 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¼ <hedr>.CO0¼ i≤ createΣ witΦ
- ;ááááL80'≤ /P:░ option« Thσ seconΣ file¼ <hedr>.CO1¼ i≤ createΣ
- ;áááánormally¼ o≥ witΦ /P:100« Iµ botΦ oµ thesσ arσ found¼
- ;ááááMAKSR╠ create≤ <hedr>.CO═ whicΦ contain≤ thσ codσ froφ
- ;áááá<hedr>.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