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

⟦aa3ebe476⟧ TextFile

    Length: 6912 (0x1b00)
    Types: TextFile
    Names: »CHARIO.ASM«

Derivation

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

TextFile



	TITLE 'CHARACTER I/O HANDLER FOR CP/M 3.0 BIOS - DATE:831207'
	PAGE 43

;************************************************************************
;*	THIS CHARIO MODULE HANDLES ALL CHARACTER DEVICE INTERFACING	*
;*	AND IT CONTAINS THE @CTBL.					*
;*	THE @CTBL IS A TABLE DESCRIBING THE PHYSICAL I/O DEVICES BY	*
;*	THEIR NAME AND THEIR CHARACTERISTICS.				*
;************************************************************************

	PUBLIC	?CINIT			;CHAR DEV INIT
	PUBLIC	?CIST			;CHAR INPUT DEV STATUS
	PUBLIC	?COST			;CHAR OUTPUT DEV STATUS
	PUBLIC	?CI			;CHAR DEV INPUT
	PUBLIC	?CO			;CHAR DEV OUTPUT

	PUBLIC	@CTBL			;CHAR DEV TABLE

	EXTRN	?PMSG			;

	MACLIB	PORTS			;PORT AND MASK EQUATES

	MACLIB	Z80			;DEFINE Z80 OP CODES

MAX$DEVICE$NO	EQU	3		;DEVICE 0-2

	PAGE

;************************************************************************
;*	CHARACTER DEVICE INITIALIZATION					*
;*									*
;*		INPUT :	<C> = PHYSICAL DEVICE NUMBER			*
;*			      DEVICE PARAMETERS IN @CTBL		*
;*									*
;*		OUTPUT: NONE						*
;*									*
;************************************************************************

	CSEG			;COMMON MEMORY

?CINIT:
	MOV	A,C		;GET DEVICE NUMBER
	CPI	MAX$DEVICE$NO	;
	RNC			;RETURN IF ILLEGAL NUMBER
	MOV	L,C		;MAKE DEVICE NUMBER 16 BITS
	MVI	H,0		;
	PUSH	H		;SAVE DEVICE NUMBER
	DAD	H		;
	DAD	H		; *8
	DAD	H		;
	LXI	D,@CTBL+7	;GET BAUD RATE
	DAD	D		;
	MOV	L,M		;
	MVI	H,0		;
	LXI	D,SPEED$TABLE	;
	DAD	D		;
	MOV	A,M		;GET BAUD RATE CODE
	ORA	A		;TEST IF VALID BAUD
	POP	H
	JZ	NOTVALID	;
	PUSH	H
	STA	SPEED		;SAVE IN INIT TABLE
	POP	H		;
	PUSH	H		;
	LXI	D,BAUD$PORTS	;
	DAD	D		;
	MOV	A,M		;GET GET PORT
	STA	PIT$CH		;SAVE IN INIT TABLE
	POP	H		;
	LXI	D,MODE$WORDS	;
	DAD	D		;
	MOV	A,M		;GET TIMER MODE WORD
	STA	PIT$MODE	;SAVE IN INIT TABLE
	LXI	H,INIT$TABLE	;
SET$BAUD:
	MOV	A,M		;
	ORA	A		;
	RZ			;
	MOV	B,A		;
	INX	H		;
	MOV	C,M		;
	INX	H		;
	OUTIR			;
	JMP	SET$BAUD	;

NOTVALID:
	LXI	H,NVBAUD
	CALL	?PMSG
	RET

NVBAUD:	DB	CR,LF,'	',ESC,'Æ7m','ERROR : Only available baudrates are'
	DB	' 600,1200,2400,4800,9600 and 19.2k',CR,LF,ESC,'Æm',0

;************************************************************************
;*	CHARACTER INPUT DEVICE STATUS					*
;*									*
;*		INPUT :	<B> = PHYSICAL DEVICE NUMBER			*
;*									*
;*		OUTPUT:	<A> = 00H IF NO INPUT CHAR IS AVAILABLE		*
;*			<A> = 0FFH IF INPUT CHAR IS AVAILABLE		*
;*									*
;************************************************************************

?CIST:
	MOV	A,B		;GET DEVICE NUMBER
	CPI	MAX$DEVICE$NO	;
	JNC	NULL$STATUS	;
	MOV	L,B		;MAKE DEVICE NUMBER 16 BITS
	MVI	H,0		;
	PUSH	H		;SAVE DEVICE NUMBER
	LXI	D,STAT$PORTS	;
	DAD	D		;MAKE POINTER TO PORT ADDRESS
	MOV	C,M		;
	INP	A		;READ FROM SIO STATUS PORT
	POP	H		;GET DEVICE NUMBER
	PUSH	H		;
	LXI	D,IN$STAT$MASK	;
	DAD	D		;MAKE POINTER TO MASK 
	MOV	C,M		;
	ANA	C		;MASK INPUT FROM STATUS PORT
	POP	H		;
	LXI	D,IN$STAT$VALUE	;
	DAD	D		;MAKE POINTER TO VALUE
	MOV	C,M		;
	CMP	C		;COMPARE INPUT WITH VALUE
	JNZ	NULL$STATUS	;
	ORI	0FFH		;
	RET			;

NULL$STATUS:
	XRA	A		;NO INPUT CHARACTER READY
	RET			;

;************************************************************************
;*	CHARACTER DEVICE INPUT						*
;*									*
;*		INPUT : <B> = PHYSICAL DEVICE NUMBER			*
;*									*
;*		OUTPUT:	<A> = NEXT AVAILABLE CHARACTER			*
;*									*
;************************************************************************

?CI:
	MOV	A,B		;GET DEVICE NUMBER
	CPI	MAX$DEVICE$NO	;
	JNC	NULL$INPUT	;
CIL:	CALL	?CIST		;CHECK INPUT STATUS
	JZ	CIL		;
	MOV	L,B		;MAKE DEVICE NUMBER 16 BITS
	MVI	H,0		;
	LXI	D,DATA$PORTS	;
	DAD	D		;MAKE POINTER TO PORT ADDRESS
	MOV	C,M		;
	INP	A		;GET DATA
	ANI	7FH		;MASK PARITY
	RET			;

NULL$INPUT:
	MVI	A,1AH		;RETURN A CTL-Z FOR NO DEVICE
	RET			;

;************************************************************************
;*	CHARACTER OUTPUT DEVICE STATUS					*
;*									*
;*		INPUT :	<B> = PHYSICAL DEVICE NUMBER			*
;*									*
;*		OUTPUT:	<A> = 00H IF OUTPUT BUSY			*
;*			<A> = 0FFH IF OUTPUT READY			*
;*									*
;************************************************************************

?COST:
	MOV	A,B		;GET DEVICE NUMBER
	CPI	MAX$DEVICE$NO	;
	JNC	NULL$STATUS	;
	MOV	L,B		;MAKE DEVICE NUMBER 16 BITS
	MVI	H,0		;
	PUSH	H		;
	LXI	D,STAT$PORTS	;
	DAD	D		;MAKE POINTER TO PORT ADDRESS
	MOV	C,M		;

	if	(crtype eq CR7)
	CPI	1		;IF DEVICE = LINE PRINTER THEN
	JZ	COST1		;DO NOT RESET EXTERNAL STATUS
	endif

	MVI	A,10H		;RESET EXTERNAL STATUS
	OUTP	A		;
COST1:
	INP	A		;GET STATUS
	POP	H		;GET DEVICE NUMBER
	PUSH	H		;
	LXI	D,OUT$STAT$MASK	;
	DAD	D		;MAKE POINTER TO MASK
	MOV	C,M		;
	ANA	C		;
	POP	H		;
	LXI	D,OUT$STAT$VALUE;
	DAD	D		;MAKE POINTER TO VALUE
	MOV	C,M		;
	CMP	C		;
	JNZ	NULL$STATUS	;
	ORI	0FFH		;
	RET			;

;************************************************************************
;*	CHARACTER DEVICE OUTPUT						*
;*									*
;*		INPUT :	<B> = PHYSICAL DEVICE NUMBER			*
;*			<C> = OUTPUT CHARACTER				*
;*									*
;*		OUTPUT:	NONE						*
;*									*
;************************************************************************

?CO:
	MOV	A,B		;GET DEVICE NUMBER
	CPI	MAX$DEVICE$NO	;
	JNC	NULL$OUTPUT	;
	MOV	A,C		;GET OUTPUT CHARACTER
	PUSH	PSW		;SAVE CHARACTER
	PUSH	B		;
COL:	CALL	?COST		;
	JZ	COL		;
	POP	B		;
	MOV	L,B		;
	MVI	H,0		;MAKE DEVICE NUMBER 16 BITS
	LXI	D,DATA$PORTS	;
	DAD	D		;MAKE POINTER TO PORT ADDRESS
	MOV	C,M		;
	POP	PSW		;GET CHARACTER
	OUTP	A		;
NULL$OUTPUT:
	RET

	PAGE
;***************************************************************************
INIT$TABLE:
	DB	1H		;COUNT
	DB	P$PIT$CMD	;PORT
PIT$MODE:
	DS	1		;VALUE
	DB	2H		;COUNT
PIT$CH:	DS	1		;PORT
SPEED:	DS	1		;(LSB) VALUE
	DB	0H		;(MSB) VALUE
	DB	0		;TABLE TERMINATOR

SPEED$TABLE:			;BAUD RATES
	DB	0,0,0,0		;NONE,50,75,110
	DB	0,0,0,82H	;134.5,150,300,600
	DB	41H,0,20H,0	;1200,1800,2400,3600
	DB	10H,0,08H,04H	;4800,7200,9600,19.2K

MODE$WORDS:
	DB	C$CRT$MODE,C$LPT$MODE,C$MODEM$MODE	;
BAUD$PORTS:
	DB	P$CRT$BAUD,P$LPT$BAUD,P$MODEM$BAUD	;

DATA$PORTS:
	DB	P$CRT$DATA,P$LPT$DATA,P$MODEM$DATA	;
STAT$PORTS:
	DB	P$CRT$STAT,P$LPT$STAT,P$MODEM$STAT	;
OUT$STAT$MASK:
	DB	M$CRT$OUT,M$LPT$OUT,M$MODEM$OUT	;
IN$STAT$MASK:
	DB	M$CRT$IN,M$LPT$IN,M$MODEM$IN	;
OUT$STAT$VALUE:
	DB	V$CRT$OUT,V$LPT$OUT,V$MODEM$OUT	;
IN$STAT$VALUE:
	DB	V$CRT$IN,V$LPT$IN,V$MODEM$IN	;

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

@CTBL:	DB	'CRT   '	;DEVICE 0
	DB	MB$IN$OUT+MB$SERIAL+MB$SOFT$BAUD
	DB	BAUD$9600	;
				;
	DB	'LPT   '	;DEVICE 1
	DB	MB$OUTPUT+MB$SERIAL+MB$SOFT$BAUD+MB$XONXOFF
	DB	BAUD$9600	;

	DB	'MODEM '	;DEVICE 2
	DB	MB$IN$OUT+MB$SERIAL+MB$SOFT$BAUD
	DB	BAUD$9600	;

	DB	0		;TABLE TERMINATOR

	END
«eof»