DataMuseum.dk

Presents historical artifacts from the history of:

Christian Rovsing CR7, CR8 & CR16 CP/M

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Christian Rovsing CR7, CR8 & CR16 CP/M

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦fc8f83989⟧ TextFile

    Length: 11008 (0x2b00)
    Types: TextFile
    Names: »SYSGENH.ASM«

Derivation

└─⟦1f6b46325⟧ Bits:30004393 CP/M-80 rel. 1 Utilities source disk
    └─ ⟦this⟧ »SYSGENH.ASM« 

TextFile


	TITLE 'CRAS HARD DISK SYSTEM GENERATION UTILITY'
	PAGE 43

;******************************************************************************
;	CHRISTIAN ROVSING A/S HARD DISK SYSTEM GENERATION PROGRAM 
;******************************************************************************
;
;	THIS SYSGEN PROGRAM IS UTILIZED TO PLACE THE CP/M 2.2
;	OPERATING SYSTEM ONTO THE SYSTEM TRACKS OF A HARD DISK
;	OR TO READ THE OPERATING SYSTEM FROM THE SYSTEM TRACKS
;	OF A HARD DISK. 
;
;	FORMAT FOR THE SYSGENH COMMAND CAN TAKE ONE OF TWO FORMS:
;
;		1) A>SYSGENH<CR>
;
;			THIS FORMAT ASSUMES THAT THE SOURCE OF
;			THE SYSTEM IMAGE WILL BE THE SYSTEM TRACKS
;			OF A HARD DISK.  THE OPERATOR IS ASKED TO
;			SELECT THE SOURCE DISK. IF THE OPERATOR
;			ENTERS A CARRIAGE RETURN IN RESPONSE TO
;			THE SOURCE DISK QUESTION, THEN THE SYSTEM
;			IMAGE IS ASSUMED TO BE ALREADY IN MEMORY
;			AT THE "SYSGENH" POSITION (3480H).
;
;		2) A>SYSGENH ÆD:ÅFILENAME.TYP<CR>
;
;			THIS FORMAT ASSUMES THAT THE SOURCE OF THE
;			SYSTEM IMAGE WILL BE IN THE FILE DESIGNATED
;			IN THE COMMAND. THE DRIVE DESIGNATOR IS
;			OPTIONAL. THE FILE READ FROM THE DISK IS
;			LOADED INTO THE GETPUT POSITION OF MEMORY.
;			THE FIRST 3380H BYTES OF THE FILE ARE IGNORED
;			DUE TO THEIR CONTAINING GARBAGE. THEY GET THERE
;			BECAUSE THE SAVE COMMAND, THAT IS USED TO GENERATE
;			SYSTEM IMAGE FILES, SAVES ALL OF MEMORY FROM
;			THE BASE OF THE TPA RIGHT UP THROUGH THE END
;			OF CP/M.
;
	PAGE
;
;	ONCE THE SYSTEM IMAGE IS LOADED INTO MEMORY IT CAN BE LOADED
;	ONTO THE SYSTEM TRACKS OF A DESTINATION DISK OR LEFT IN MEMORY
;	FOR A SUBSEQUENT SAVE COMMAND.
;
;
;	THE CRAS FORMAT OF CP/M HANDLING UTILITIES PUTS THE SYSGEN VERSION
;	OF THE SYSTEM IMAGE INTO MEMORY STARTING AT ADDRESS 03480H SO THAT 
;	THERE IS STILL ROOM TO EXECUTE DDT BELOW THE SYSTEM IMAGE. 
;
;******************************************************************************
;
;
TRUE	EQU	0FFH		;SET TRUE AND FALSE VALUES
FALSE	EQU	000H
;
;
;SET HARD DISK CONTROLLER FIRMWARE FORMAT SELECTION
;
EMUL206	EQU	FALSE		;FIRMWARE FOR HARD DISK EMULATES 206 CONTROLLER
DIR506	EQU	TRUE		;FIRMWARE MAPS DIRECT TO ST506 DRIVE
;
;
VERS	EQU	22		;CP/M VERSION 2.2
;
NDISKS	EQU	16		;NUMBER OF DISK DRIVES SUPPORTED
NSSEC	EQU	75		;NUMBER OF SYSTEM 128 BYTE SECTORS
;
	IF	EMUL206
NSPT	EQU	48		;EMULATED 206 LOGICAL SECTORS PER TRACK
	ENDIF
;
	IF	DIR506
NSPT	EQU	68		;DIRECT MAPPING LOGICAL SECTORS PER TRACK
	ENDIF

;
	PAGE
;
FCB	EQU	005CH		;DEFAULT FCB LOCATION
FCBEXT	EQU	FCB+12		;DEFAULT EXTENT LOCATION
FCBCR	EQU	FCB+32		;CURRENT RECORD LOCATION
TPA	EQU	0100H		;TRANSIENT PROGRAM AREA
LOADP	EQU	03480H		;LOAD POINT FOR SYSTEM DURING LOAD/STORE
BDOS	EQU	5H		;DOS ENTRY POINT
BOOT	EQU	0		;JMP TO 'BOOT' TO REBOOT SYSTEM
RDCON	EQU	1		;READ CONSOLE INPUT FUNCTION
WRCBUF	EQU	9		;WRITE CONSOLE BUFFER OUTPUT FUNCTION
SELF	EQU	14		;SELECT DISK
OPENF	EQU	15		;DISK OPEN FUNCTION
DREADF	EQU	20		;DISK READ FUNCTION
DEFBUF	EQU	080H		;DEFAULT DISK BUFFER ADDRESS
UNALLOC	EQU	02H		;BIOS WRITE UNALLOCATED CODE
DIR	EQU	01H		;BIOS PREREAD/POST DISK WRITE (DIRECTORY)
;
MAXTRY	EQU	10		;MAXIMUM NUMBER OF RETRIES ON EACH READ/WRITE
;
STKSIZE	EQU	60		;SIZE OF LOCAL STACK
;
WBOOT	EQU	1		;ADDRESS OF WARM BOOT (OTHER PATCH ENTRY
				;POINTS ARE COMPUTED RELATIVE TO WBOOT)
SELDSK	EQU	24		;WBOOT+24 FOR DISK SELECT
SETTRK	EQU	27		;WBOOT+27 FOR SET TRACK FUNCTION
SETSEC	EQU	30		;WBOOT+30 FOR SET SECTOR FUNCTION
SETDMA	EQU	33		;WBOOT+33 FOR SET DMA ADDRESS
READF	EQU	36		;WBOOT+36 FOR READ FUNCTION
WRITF	EQU	39		;WBOOT+39 FOR WRITE FUNCTION
;
CR	EQU	0DH		;ASCII CARRIAGE RETURN
LF	EQU	0AH		;ASCII LINE FEED
ESC	EQU	1BH		;ASCII ESCAPE
;
	PAGE
;
	ORG	TPA		;TRANSIENT PROGRAM AREA

	JMP	START
;
;UTILITY SUBROUTINES
;
GETCHAR:			;READ CONSOLE CHARACTER TO REGISTER A
	MVI	C,RDCON
	CALL	BDOS
;
;
;CONVERT TO UPPER CASE BEFORE RETURN
;
	CPI	'A' OR 20H 
	RC			;RETURN IF BELOW LOWER CASE A
	CPI	('Z' OR 20H) + 1
	RNC			;RETURN IF ABOVE LOWER CASE Z
	ANI	5FH
	RET
;
OUTMSG:				;WRITE CONSOLE BUFFER OUTPUT FUNCTION
	MVI	C,WRCBUF
	CALL	BDOS
	RET
;
SEL:				;SELECT DISK GIVEN BY REGISTER A
	MOV	C,A
	LHLD	WBOOT
	LXI	D,SELDSK
	DAD	D
	PCHL
;
TRK:				;SET UP TRACK
	LHLD	WBOOT		;ADDRESS OF BOOT ENTRY
	LXI	D,SETTRK	;OFFSET FOR SETTRK ENTRY
	DAD	D
	PCHL			;GONE TO SETTRK
;
	PAGE
;
SEC:				;SET UP SECTOR NUMBER
	LHLD	WBOOT
	LXI	D,SETSEC
	DAD	D
	PCHL
;
DMA:				;SET DMA ADDRESS TO VALUE OF B,C
	LHLD	WBOOT
	LXI	D,SETDMA
	DAD	D
	PCHL
;
READ:				;PERFORM READ OPERATION
	LHLD	WBOOT
	LXI	D,READF
	DAD	D
	PCHL
;
WRITE:				;PERFORM WRITE OPERATON
	LHLD	WBOOT
	LXI	D,WRITF
	DAD	D
	PCHL
;
DREAD:				;DISK READ FUNCTION
	MVI	C,DREADF
	JMP	BDOS
;
OPEN:				;FILE OPEN FUNCTION
	MVI	C,OPENF 
	JMP	BDOS
;
	PAGE
;
FILEDMA:			;SET FILE DMA ADDRESS FUNCTION
	PUSH	B
	PUSH	D
	MOV	D,B
	MOV	E,C
	MVI	C,26		;BDOS SET DMA ADDR FUNCTION
	CALL	BDOS
	POP	D
	POP	B
	RET
;
;
;
;ROUTINE TO READ OR WRITE THE SYSTEM TRACKS ON THE CP/M SYSTEM
;DISKETTE. THE READ/WRITE FUNCTION IS DETERMINED BY THE SETTING
;OF THE "RW" FLAG AS FOLLOWS:
;		00H=READ
;		01H=WRITE
;
GETPUT:
	LXI	H,LOADP		;SET THE START ADDRESS FOR MEMORY
	SHLD	DMADDR
	MVI	A,00H		;SETUP START NUMBER OF SECTORS TO READ/WRITE
	STA	TOTSEC
;
	MVI	C,0		;SET TRACK ZERO TO START
	CALL	TRK
;
	PAGE
;
;SECTOR READING/WRITING LOOP
;
SECLOOP:
	LDA	TOTSEC		;GET CURRENT SECTOR NUMBER
	CPI	NSSEC		;CHECK IF WE ARE DONE YET
	RZ			;BALE OUT OF HERE IF ALL IN/OUT
;
	INR	A		;INCREMENT LOGICAL SECTOR NUMBER FOR NEXT 
	STA	TOTSEC
	DCR	A		;ADJUST BACK FOR CURRENT LOG SECTOR
	CPI	NSPT		;CHECK IF WE SHOULD SEEK TO TRACK 1
	JNZ	NOSEEK
	PUSH	PSW
	MVI	C,01H		;SET TO TRACK 1 ON SECTOR COUNT OVERFLOW
	CALL	TRK
	POP	PSW
;
NOSEEK:
	JC	STRK0		;SEE IF WE ARE STILL ON TRACK 0..
	SUI	NSPT		;IF NOT ADJUST SECTOR COUNT FOR TRACK 1
;
STRK0:
	MOV	C,A		;GET THE SECTOR NUMBER
	CALL	SEC		;TELL DRIVE WHICH ONE WE WANT
;
	LHLD	DMADDR		;GET CURRENT LOAD/UNLOAD ADDRESS
	PUSH	H
	LXI	D,128		;INCREASE LOAD/UNLOAD ADDRESS FOR
				;NEXT PASS
	DAD	D
	SHLD	DMADDR
	POP	B		;NOTE: POP INTO DIFFERENT REGISTER
	CALL	DMA		;SET DMA ADDRESS FOR DISK ROUTINES
;
	PAGE
;
;READY AT THIS POINT TO TRY READING OR WRITING A SECTOR WITH RETRIES.
;
	XRA	A		;ZERO INITIAL RETRY COUNT
	STA	RETRY
GPSEC:
	LDA	RW		;CHECK FUNCTION FLAG
	ORA	A		;IF ZERO THEN READ
	JZ	TRYREAD
;
	LDA	TOTSEC		;GET CURRENT SECTOR NUMBER
	CPI	NSSEC		;CHECK IF WE ARE ON LAST SECTOR
	MVI	C,UNALLOC	;TELL BIOS THIS IS WRITE UNALLOCATED
	JNZ	NOTLAST		;USE FAST UNALLOCTED FLAG IF NOT LAST
;
	MVI	C,DIR		;USE DIR WRITE TO FLUSH BIOS BUFFERS
NOTLAST:
	CALL	WRITE		;ITS PUT/WRITE SO LETS DO IT
	JMP	CHKER		;GO TO DO COMMON ERROR CHECK
TRYREAD:
	CALL	READ		;READ THE BOOT SECTOR
CHKER:
	ORA	A		;CHECK READ/WRITE OPERATION STATUS
	JZ	GPOK		;READ/WRITE OK, EXIT LOOP
;
	LDA	RETRY		;CHECK CURRENT RETRY COUNT
	INR	A		;INCREMENT ON ERROR
	STA	RETRY
	CPI	MAXTRY
	JNC	GPSEC		;TRY READ AGAIN IF NOT AT MAX RETRY
;
	LXI	D,ERRMSG	;PRINT AN ERROR MESSAGE
	CALL	OUTMSG		;..IF WE EXCEEDED MAX RETRIES
	CALL	GETCHAR		;SEE IF TO IGNORE
	CPI	CR		;SKIP?
	JNZ	REBOOT		;EXIT IF FATAL IN OPERATORS OPNION
GPOK:
	JMP	SECLOOP		;GO ON TO TRY NEXT SECTOR OF GET/PUT
;
	PAGE
;
;START OF EXECUTABLE PORTION OF THE SYSGEN PROGRAM.
;
START:
	LXI	SP,STACK
	LXI	D,SIGNON
	CALL	OUTMSG
	LDA	FCB+1
	CPI	' '
	JZ	GETSYS		;SKIP TO GET SYSTEM IF MESSAGE BLANK
;
;
;HERE IF WE HAVE TO GET THE SYSTEM FROM THE OPERATOR
;SPECIFIED DISK FILE.
;
	LXI	D,FCB		;OPEN FILE
	CALL	OPEN
	INR	A
	JNZ	RDOK
;
;
;FILE NOT PRESENT, ERROR AND REBOOT
;
	LXI	D,NOFILE
	CALL	OUTMSG
	JMP	REBOOT
;
;
;FILE PRESENT, READ TO LOAD POINT
;FILE HAS 3380H BYTES OF GARBAGE AT ITS FRONT
;THAT WE HAVE TO SKIP
;
RDOK:
	XRA	A
	STA	FCBEXT
	STA	FCBCR
	LXI	B,DEFBUF		;SET DEFAULT BUFFER
	CALL	FILEDMA
	MVI	C,(LOADP-TPA)/128	;NUMBER OF SECTORS TO SKIP
;
	PAGE
;
;PRE-READ FILE
;
PRERD:
	PUSH	B
	LXI	D,FCB
	CALL	DREAD
	POP	B
	ORA	A
	JNZ	BADRD
	DCR	C
	JNZ	PRERD
;
;
;SECTORS SKIPPED AT BEGINNING OF FILE
;
	LXI	H,LOADP		;SET LOAD ADDRESS AT 03480H
RDINP:
	PUSH	H
	MOV	B,H
	MOV	C,L
	CALL	FILEDMA		;SET DMA ADDRESS
	LXI	D,FCB
	CALL	DREAD		;READ FILE SECTOR INTO MEMORY
	POP	H
	ORA	A
	JNZ	PUTSYS		;GOT FILE EOF. GO TO PUT AT DESTINATION
;
;
;MORE TO READ, CONTINUE
;
	LXI	D,128
	DAD	D
	JMP	RDINP
;
;
BADRD:				;EOF ENCOUNTERED IN INPUT FILE
	LXI	D,BADFILE
	CALL	OUTMSG
	JMP	REBOOT
;
	PAGE
;
;HERE IF WE GET SYSTEM OFF OF THE SYSTEM TRACKS OF A DISKETE
;
GETSYS:
	LXI	D,ASKGET
	CALL	OUTMSG
	CALL	GETCHAR
	CPI	CR
	JZ	PUTSYS
	SUI	'A'
	CPI	NDISKS
	JC	GETC
	CALL	BADDISK
	JMP	GETSYS
;
GETC:				;SELECT DISK GIVEN BY REGISTER A
	ADI	'A'
	STA	GDISK		;TO SET MESSAGE
	SUI	'A'
	CALL	SEL		;TO SELECT THE DRIVE
;
	PAGE
;
;GETSYS, SET RW TO READ AND GET THE SYSTEM
;
	LXI	D,GETMSG
	CALL	OUTMSG
	CALL	GETCHAR
	CPI	CR
	JNZ	REBOOT
	XRA	A
	STA	RW
	CALL	GETPUT
	LXI	D,DONE
	CALL	OUTMSG
;
;
PUTSYS:				;PUT SYSTEM
	LXI	D,ASKPUT
	CALL	OUTMSG
	CALL	GETCHAR
	CPI	CR
	JZ	REBOOT
	SUI	'A'
	CPI	NDISKS
	JC	PUTC
;
	PAGE
;
;INVALID DRIVE NAME
;
	CALL	BADDISK
	JMP	PUTSYS
PUTC:
	ADI	'A'
	STA	PDISK
	SUI	'A'
	CALL	SEL
	LXI	D,PUTMSG
	CALL	OUTMSG
	CALL	GETCHAR
	CPI	CR
	JNZ	REBOOT
	LXI	H,RW
	MVI	M,1		;SET WRITE FLAG
	CALL	GETPUT		;GO WRITE THE FILE
	LXI	D,DONE
	CALL	OUTMSG
	JMP	PUTSYS
;
;
REBOOT:
	MVI	A,0		;SET LOGDISK TO A: FOR REBOOT
	CALL	SEL
	JMP	BOOT
;
BADDISK:
	LXI	D,QDISK
	CALL	OUTMSG
	RET
;
	PAGE
;
;VARIOUS MESSAGES FOR THE SYSGEN PROGRAM
;
SIGNON:
	DB	ESC,'Æ7;2m',CR,LF
	DB	'CHRISTIAN ROVSING A/S WINCHESTER SYSGEN VERSION '
	DB	VERS/10+'0','.',VERS MOD 10+'0'
;
	IF	EMUL206
	DB	CR,LF,'FOR MSC 9205 CONTROLLER WITH 206 EMULATION FIRMWARE.'
	ENDIF
;
	IF	DIR506
	DB	CR,LF,'FOR MSC 9205 CONTROLLER WITH ST-506 DRIVE    820707'
	ENDIF
;
	DB	CR,LF,ESC,'Æm','$'
;
ASKGET:
	DB	CR,LF,'SOURCE DRIVE NAME (OR RETURN TO SKIP) ','$'
;
GETMSG:
	DB	CR,LF,'SOURCE ON '
;
GDISK:	DS	1		;FILLED IN AT GET FUNCTION
;
	DB	', THEN TYPE RETURN','$'
;
ASKPUT:
	DB	CR,LF,'DESTINATION DRIVE NAME (OR RETURN TO REBOOT) ','$'
;
PUTMSG:
	DB	CR,LF,'DESTINATION ON '
;
PDISK:
	DS	1		;FILLED IN AT PUT FUNCTION
;
	DB	', THEN TYPE RETURN','$'
;
ERRMSG:
	DB	CR,LF,'PERMANENT ERROR, TYPE RETURN TO IGNORE','$'
;
DONE:
	DB	CR,LF,'FUNCTION COMPLETE','$'
;
QDISK:
	DB	CR,LF,'INVALID DRIVE NAME (USE A, B, C, OR D)','$'
;
NOFILE:
	DB	CR,LF,'NO SOURCE FILE ON DISK','$'
;
BADFILE:
	DB	CR,LF,'SOURCE FILE INCOMPLETE','$'
;
CRLFMSG:
	DB	CR,LF,'$'
;
TOTSEC:
	DS	1
;
RW:
	DS	1
;
DMADDR:
	DS	2
;
RETRY:
	DS	1
	DS	STKSIZE*2
;
STACK	EQU	$
;
;
	END
;
;
+++...
«eof»