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

⟦4dbd98c39⟧ TextFile

    Length: 7552 (0x1d80)
    Types: TextFile
    Names: »BOOT.ASM«

Derivation

└─⟦b445f10af⟧ Bits:30004389 CP/M Plus Source files
    └─ ⟦this⟧ »BOOT.ASM« 

TextFile


	TITLE 'BOOT MODULE FOR CP/M 3.0 BIOS - DATE 831208'
	PAGE 43

;************************************************************************
;*	THE BOOT MODULE PERFORMS SYSTEM INITIALIZATION OTHER THAN	*
;*	CHARACTER AND DISK I/O .BOOT LOADS THE CCP FOR COLD START	*
;*	AND RELOADS IT FOR WARM STARTS					*
;************************************************************************

	PUBLIC	?INIT		;
	PUBLIC	?LDCCP		;
	PUBLIC	?RLCCP		;
	PUBLIC	?TIME		;

	PUBLIC	DMYINT,TIMER
	PUBLIC	DSKTMR,MONCNT	;

	EXTRN	MA3MIR		;(MOVE)

	EXTRN	DISK$MSG,SIGNON$MSG,BIOS$MSG	;(DRVTBL)

	EXTRN	VECTOR

	EXTRN	?CONIN,@CBNK
	EXTRN	?PDERR,?PDEC,?PMSG
	EXTRN	?MOVE,?XMOVE,?BNKSL

	EXTRN	@CIVEC,@COVEC,@AIVEC,@AOVEC,@LOVEC
	EXTRN	@DATE,@HOUR,@MIN,@SEC

	MACLIB	PORTS

	MACLIB	Z80

BDOS	EQU	0005H		;

	PAGE
	DSEG		;BANKED MEMORY	

;************************************************************************
;*	SYSTEM INITIALIZATION						*
;*									*
;*			INPUT :	NONE					*
;*									*
;*			OUTPUT:	NONE					*
;*									*
;************************************************************************

?INIT:	LXI	H,8000H			;ASSIGN CONSOLE TO CRT
	SHLD	@CIVEC			;
	SHLD	@COVEC			;
	LXI	H,4000H			;ASSIGN PRINTER TO LPT
	SHLD	@LOVEC			;
	LXI	H,2000H			;ASSIGN	AUX TO MODEM
	SHLD	@AIVEC			;
	SHLD	@AOVEC			;
	LXI	H,INIT$TABLE		;SET UP MISC. HARDWARE
	CALL	OUT$BLOCKS		;
	CALL	HW$INIT			;
	if banked
	MVI	C,TPABANK		;SOURCE BANK
	MVI	B,SYSBANK		;DESTINATION BANK
	CALL	?XMOVE			;
	LXI	B,0C000H		;BYTE COUNT
	LXI	D,00H			;SOURCE ADDR
	LXI	H,00H			;DESTINATION ADDR
	CALL	?MOVE			;COPY TPABANK INTO SYSBANK
	endif
	LXI	H,SIGNON$MSG		;PRINT SIGNON MESSAGE
	CALL	?PMSG			;
	LXI	H,DISK$MSG		;PRINT DISK TYPE MESSAGE
	CALL	?PMSG			;
	LXI	H,BIOS$MSG		;
	CALL	?PMSG			;
	JMP	SHIFT$BANK

OUT$BLOCKS:
	MOV	A,M			;GET COUNT VALUE
	ORA	A			;
	RZ				;
	MOV	B,A			;GET COUNT VALUE INTO <B>
	INX	H			;
	MOV	C,M			;GET PORT ADDRESS INTO <C>
	INX	H			;<HL> POINTER TO  OUTPUT VALUE 
	OUTIR				;
	JMP	OUT$BLOCKS		;

INIT$TABLE:
	DB	1,P$DMA$CLEAR,0			;CLEAR DMA
	DB	1,P$DMA$STAT,C$DMA$BYTE		;SET HARDWARE ATTRIBUTES
	DB	4,P$DMA$MODE,88H,85H,82H,83H	;SET CH.0-3 MODE REG.
	DB	00H				;TABLE TERMINATOR

;*************************************************************************
;	I/O AND HARDWARE INITIALIZATION ROUTINE
;*************************************************************************

HW$INIT:
	MVI	A,0FFH			;DELAY 1/4 SECOND FOR ANY
					;UART CHAR IN PROGRESS
SDLY:
	MVI	L,070H
	DCR	L
	JNZ	$-1
	DCR	A
	JNZ	SDLY
	DI
;--------------------------INIT TIMER------------------------------------
	MVI	A,03H			;INIT ALSO SOFTWARE TIMER
	OUT	P$DMA$INT		;CH0 RESET
	OUT	P$MFD$INT		;CH1 RESET
	OUT	P$SCI$INT		;CH3 RESET
	LXI	H,VECTOR		;
	MOV	A,L			;
	OUT	P$CTC			;
	MVI	A,0A5H			;
	OUT	P$TIM$INT		;CH2 USED AS SOFTWARE TIMER
	MVI	A,195			;...AND BUS TIMER
	OUT	P$TIM$INT		;INTERRUPT EVERY 12.5 MILLISECONDS
;--------------------------INIT CPU---------------------------------------
	MOV	A,H			;CTC INTERRUPT VECTOR TABLE ADDRESS
	STAI				;MOV I,A	INITIALIZE CPU PART OF
	IM2				;IM 2		INTERRUPT LOGIC
	EI				;
	RET				;FINALLY DONE WITH ALL THAT

	PAGE
	CSEG		;REST IS IN COMMON MEMORY

;************************************************************************
;*	THE BOOT LOADER LOADS THE CCP FROM A FILE CALLED CCP.SYS	*
;*	ON THE SYSTEM DRIVE 						*
;*									*
;*			INPUT :	NONE					*
;*									*
;*			OUTPUT:	NONE					*
;*									*
;************************************************************************

?LDCCP:
	XRA	A			;
	STA	CCP$FCB+15		;ZERO EXTENT
	LXI	H,00H			;START AT BEGINNING OF FILE
	SHLD	FCB$NR			;
	LXI	D,CCP$FCB		;
	CALL	OPEN			;OPEN FILE CONTAINING CCP
	INR	A			;
	JZ	NO$CCP			;ERROR IF NO FILE
	LXI	D,100H			;START OF TPA
	CALL	SETDMA			;
	LXI	D,128			;ALLOW UP TO 16K BYTES
	CALL	SETMULTI		;
	LXI	D,CCP$FCB		;
	CALL	READ			;LOAD CCP
	if banked
	MVI	C,TPABANK		;SOURCE BANK
	MVI	B,SYSBANK		;DESTINATION BANK
	CALL	?XMOVE
	LXI	B,0C80H			;BYTE COUNT
	LXI	D,0100H			;SOURCE ADDR
	LXI	H,0100H			;DESTINATION ADDR
	CALL	?MOVE			;COPY CCP FROM TPABANK TO SYSBANK
	endif
	RET

NO$CCP:
	LXI	H,CCP$MSG		;
	CALL	?PMSG			;
RESP:	CALL	?CONIN			;GET A RESPONSE
	JMP	?LDCCP			;AND TRY AGAIN

	PAGE
;************************************************************************
;*									*
;************************************************************************

?RLCCP:
	if	banked

	MVI	C,SYSBANK		;SOURCE BANK
	MVI	B,TPABANK		;DESTINATION BANK
	CALL	?XMOVE
	LXI	B,0C80H			;BYTE COUNT
	LXI	H,100H			;DESTINATION ADDR
	LXI	D,100H			;SOURCE ADDR
	CALL	?MOVE			;COPY CCP FROM SYSBANK TO TPABANK
	RET
	else
	JMP	?LDCCP
	endif

;-----------------------------------------------------------------------
SHIFT$BANK:
	MVI	A,SYSBANK
	CALL	?BNKSL
	RET

;************************************************************************
;*									*
;************************************************************************

?TIME:
	MOV	A,C			;GET FLAG FROM <C>
	CPI	0FFH			;CHECK FOR SET FLAG
	JNZ	TIME$EXIT		;
	MVI	A,0			;IF BDOS HAS UPDATED SCB
	STA	COUNT			; THEN RESET COUNT
TIME$EXIT:
	RET				;

;========================================================================

;	CP/M BDOS FUNCTION INTERFACES

OPEN:	MVI	C,15			;
	JMP	BDOS			;

SETDMA:	MVI	C,26			;
	JMP	BDOS			;

SETMULTI:
	MVI	C,44			;
	JMP	BDOS			;

READ:	MVI	C,20			;
	JMP	BDOS			;

CCP$MSG:
	DB	CR,LF,'BIOS Error: No CCP.SYS',0

CCP$FCB:
	DB	CCP$DRIVE		;DRIVE
	DB	'CCP     '		;NAME
	DB	'SYS'			;TYPE
	DB	0,0,0,0			;
	DS	16			;
FCB$NR:	DB	0,0,0			;


;***********************************************************************
;	12.5 MSEC. TIMER INTERRUPT SERVICE ROUTINE
;***********************************************************************

MONCNT:	DB	0
DSKTMR:	DB	0
COUNT:	DB	0

TIMER:
	PUSH	PSW		;SAVE ALL REGISTERS
	PUSH	B
	PUSH	D
	PUSH	H
	LDA	COUNT		;	
	ADI	1		;
	CPI	80		;12.5 mSEC * 80 = 1 SEC
	JC	MOTCHK		;
NEWSEC:
	LDA	@SEC		;
	ADI	1		;
	DAA			;
	CPI	60H		;
	JZ	NEWMIN		;

PUTSEC:
	STA	@SEC		;STORE NEW SECONDS
	SUB	A		;
	JMP	MOTCHK		;
NEWMIN:
	LDA	@MIN		;
	ADI	1		;
	DAA			;
	CPI	60H		;
	JZ	NEWHOUR		;
PUTMIN:
	STA	@MIN		;STORE NEW MINUTES
	SUB	A		;CLEAR SECONDS
	JMP	PUTSEC		;
NEWHOUR:
	LDA	@HOUR		;
	ADI	1		;
	DAA			;
	CPI	24H		;CHECK FOR DAY CROSSING
	JZ	NEWDAY		;
PUTHOUR:
	STA	@HOUR		;STORE NEW HOUR
	SUB	A		;CLEAR MINUTES
	JMP	PUTMIN		;
NEWDAY:
	LHLD	@DATE		;
	INX	H		;
	SHLD	@DATE		;STORE NEW DATE
	SUB	A		;CLEAR HOURS
	JMP	PUTHOUR		;

MOTCHK:
	STA	COUNT		;STORE TIMER COUNT
	LDA	MA3MIR		;CHECK IF MOTORS IS OFF
	ANI	080H		;MOTENB
	JZ	TIMER1		;
	LDA	DSKTMR		;TEST IF 2 SEC HAS ELAPSED
	ANA	A		;	WITHOUT DISK ACCESS
	JNZ	TIMER1		;
	LDA	MONCNT		;
	INR	A		;
	STA	MONCNT		;
	CPI	03H		;HAVE WE BEEN AT THIS FOR SIX SEC YET
	JNZ	NEXT2		;
	LDA	MA3MIR		;IF SIX SEC HAS ELAPSED
	ANI	0FH		;
	STA	MA3MIR		;
	OUT	P$MAP3		;SHUT OFF MINI MOTOR
	JMP	TIMER1		;
NEXT2:
	MVI	A,160		;160*12.5 mSEC = 2 SEC
	STA	DSKTMR		;SET ANOTHER 2 SEC DELAY

TIMER1:
	LDA	DSKTMR		;GET MINI FLOPPY MOTOR ON COUNTER
	ANA	A
	JZ	TEXIT		;IF NOT TIMED OUT
	DCR	A		;COUNT DOWN
	STA	DSKTMR		;OPDATE MEMORY IMAGE
TEXIT:
	POP	H		;RESTORE ALL REGISTERS
	POP	D		;
	POP	B		;
	POP	PSW		;
DMYINT:				;DUMMY INTERRUPTS CAN ENTER HERE
	EI
	RETI

	END
«eof»