CP/M RMAC ASSEM 1.1	#001	CHARACTER I/O HANDLER FOR PROF-80

                	title 'Character I/O handler for PROF-80'
                
                ; Character I/O for the Modular CP/M 3 BIOS
                ;
                ; letzte Aenderung am: 13.11.1984 (Joachim)
                
                
                
                	extrn	@cbnk
                
                	public	?cinit,?ci,?co,?cist,?cost
                	public	@ctbl
                	public	monon,monoff,intser
                
                	maclib	z80
                	maclib	cdef
                
                	maclib	syspage
                	maclib	modebaud
                	maclib	monvec
                
                
 0005 =         max$devices	equ	5	; anzahl der phys. treiber minus 1
                
                	cseg
                
                ?cinit:
 0000 41        	mov	b,c		; device nummer in b
 0001 69        	mov	l,c		; lade baudrate der device
 0002 2600      	mvi	h,0		; nach c
 0004 29        	dad	h		;
 0005 29        	dad	h		;
 0006 29        	dad	h		;
 0007 11E900    	lxi	d,@ctbl+7	;
 000A 19        	dad	d		;
 000B 7E        	mov	a,m		;
 000C 4F        	mov	c,a		;
 000D 114700    	lxi	d,cinit$list	; zeige auf liste
                	jr	verteiler	; verzweige auf entsprechende routine
 0010+1818      	DB	18H,VERTEILER-$-1
                
                ?ci:
 0012 115300261A	lxi	d,ci$list ! mvi h,1ah
                	jr	verteiler
 0017+1811      	DB	18H,VERTEILER-$-1
                
                ?co:
 0019 115F00    	lxi	d,co$list
                	jr	verteiler
 001C+180C      	DB	18H,VERTEILER-$-1
                
                ?cist:
 001E 116B002600	lxi	d,cist$list ! mvi h,0
                	jr	verteiler
 0023+1805      	DB	18H,VERTEILER-$-1
                
CP/M RMAC ASSEM 1.1	#002	CHARACTER I/O HANDLER FOR PROF-80

                ?cost:
 0025 1177002600	lxi	d,cost$list ! mvi h,0
                
                verteiler:
 002A 3E05      	mvi	a,max$devices	; unzulaessiger treiber?
 002C B8        	cmp	b		; dann return
 002D 7C        	mov	a,h		; in a steht returncode
 002E D8        	rc			;
                				; treiber vorhanden => weiter
 002F CD1301    	call	monon		; schalte EPROM ein ( die meisten Treiber
 0032 68        	mov	l,b		; befinden sich im EPROM)
 0033 2600      	mvi	h,0		;
 0035 29        	dad	h		;
 0036 19        	dad	d		; hl zeigt auf treiber adresse
 0037 114100    	lxi	d,callr+1	; trage adresse in call ein
 003A 7E12      	mov	a,m ! stax d	;
 003C 2313      	inx 	h ! inx d	;
 003E 7E12      	mov	a,m ! stax d	;
 0040 CD0000    callr	call	0		;
 0043 CD4501    	call	monoff		; EPROM wieder aus
 0046 C9        	ret			; alles ok return zum BDOS
                
                cinit$list:
 0047 8300      	dw	softinit
 0049 8300      	dw	softinit
 004B DC00      	dw	null$init
 004D DC00      	dw	null$init
 004F DC00      	dw	null$init
 0051 DC00      	dw	null$init
                
                ci$list:
 0053 9B00      	dw	duplxin
 0055 DF00      	dw	null$in
 0057 9E00      	dw	user1in
 0059 A100      	dw	user2in
 005B A400      	dw	grafin
 005D DF00      	dw	null$in
                
                co$list
 005F A700      	dw	duplxout
 0061 AA00      	dw	splxout
 0063 AD00      	dw	user1out
 0065 B000      	dw	user2out
 0067 B300      	dw	grafout
 0069 BA00      	dw	spoolerout
                
                cist$list:
 006B C100      	dw	duplxist
 006D DD00      	dw	null$status
 006F C400      	dw	user1ist
 0071 C700      	dw	user2ist
 0073 CA00      	dw	grafist
 0075 DD00      	dw	null$status
                
                cost$list:
 0077 CD00      	dw	duplxost
CP/M RMAC ASSEM 1.1	#003	CHARACTER I/O HANDLER FOR PROF-80

 0079 D000      	dw	splxost
 007B D300      	dw	user1ost
 007D D600      	dw	user2ost
 007F D900      	dw	grafost
 0081 D900      	dw	grafost
                
                softinit:
 0083 79        	mov	a,c	; wandle cpm 3 baudraten nummer
 0084 EEFF      	xri	0ffh	; in EPROM baudraten nummer
 0086 1F        	rar
 0087 E607      	ani	07h
 0089 57        	mov	d,a
 008A 79        	mov	a,c
 008B E601      	ani	1
 008D 171717    	ral ! ral ! ral
 0090 B2        	ora	d
 0091 57        	mov	d,a	; ok, in d steht EPROM bautraten nr.
 0092 78        	mov	a,b	; duplex oder simplex ?
 0093 B7        	ora	a
 0094 7A        	mov	a,d
 0095 CAA500    	jz	mduplxbaud
 0098 C3A800    	jmp	msplxbaud	
                
 009B C36C00    duplxin		jmp	mduplxin
 009E C37800    user1in		jmp	muser1in
 00A1 C38400    user2in		jmp	muser2in
 00A4 C35C00    grafin		jmp	mgrafin
                
 00A7 C36F00    duplxout	jmp	mduplxout
 00AA C39600    splxout		jmp	msplxout
 00AD C37B00    user1out	jmp	muser1out
 00B0 C37B00    user2out	jmp	muser1out
 00B3 79E67F4FC3grafout		mov	a,c ! ani 7fh ! mov c,a ! jmp mgrafout
 00BA 79F6804FC3spoolerout	mov	a,c ! ori 80h ! mov c,a ! jmp mgrafout
                
 00C1 C37200    duplxist	jmp	mduplxist
 00C4 C37E00    user1ist	jmp	muser1ist
 00C7 C38A00    user2ist	jmp	muser2ist
 00CA C36200    grafist		jmp	mgrafist
                
 00CD C37500    duplxost	jmp	mduplxost
 00D0 C39900    splxost		jmp	msplxost
 00D3 C38100    user1ost	jmp	muser1ost
 00D6 C38D00    user2ost	jmp	muser2ost
 00D9 C36900    grafost		jmp	mgrafost
                
 00DC C9        null$init	ret
 00DD AFC9      null$status	xra a ! ret
 00DF 3E1AC9    null$in		mvi a,1ah ! ret
                
                @ctbl:
 00E2 4455504C45	db 'DUPLEX'	; Duplex-Schnittstelle auf PROF
 00E8 0F        	db mb$in$out+mb$serial+mb$softbaud
 00E9 00        	db baud$none	; Baudrate haengt von J5 ab
                
 00EA 53494D504C	db 'SIMPLX'	; Simplex-Schnittstelle auf PROF
CP/M RMAC ASSEM 1.1	#004	CHARACTER I/O HANDLER FOR PROF-80

 00F0 06        	db mb$output+mb$softbaud
 00F1 08        	db baud$1200
                
 00F2 5553455231	db 'USER1 '	; user1 im EPROM
 00F8 03        	db mb$in$out
 00F9 00        	db baud$none
                
 00FA 5553455232	db 'USER2 '	; user2 im EPROM
 0100 03        	db mb$in$out
 0101 00        	db baud$none
                
 0102 4752495020	db 'GRIP  '	; Grafik-Karte
 0108 03        	db mb$in$out
 0109 00        	db baud$none
                
 010A 53504F4C45	db 'SPOLER'	; GRIP-Spooler
 0110 02        	db mb$output
 0111 00        	db baud$none
                
 0112 00        	db 0			; table terminator
                
                ;
                ; Hilfsroutinen, die im Common-Bereich liegen muessen
                ;
                
                monon:		; schalte Monitor-EPROM ein und Stack um
                
 0113 F5        	push	psw		; rette akku
 0114 3A76FF    	lda	epromz		; ist EPROM schon eingeschaltet?
 0117 B7        	ora	a		; wenn ja Sprung
                	jrnz	monon1		;
 0118+2025      	DB	20H,MONON1-$-1
 011A 3C        	inr	a		; 
 011B 3276FF    	sta	epromz		; neue EPROM-Einschalttiefe
 011E F1        	pop	psw		;
 011F 22C001    	shld	temp2		;
 0122 E1        	pop	h		;
                	sspd	userstack	; rette userstack
 0123+ED73      	DB	0EDH,73H
 0125+BE01      	DW	USERSTACK
 0127 310202    	lxi	sp,monstack	;
 012A E5        	push	h		;
 012B 2AC001    	lhld	temp2		;
                				;
 012E F5        	push	psw		; schalte jetzt EPROM ein
 012F C5        	push	b		;
 0130 0600      	mvi	b,0		;
 0132 0EDE      	mvi	c,p$ram$table	;
 0134 3E00      	mvi	a,0		;
                	outp	a		;
 0136+ED79      	DB	0EDH,A*8+41H
 0138 0610      	mvi	b,10h		;
                	outp	a		;
 013A+ED79      	DB	0EDH,A*8+41H
 013C C1        	pop	b		;
 013D F1        	pop	psw		;
CP/M RMAC ASSEM 1.1	#005	CHARACTER I/O HANDLER FOR PROF-80

 013E C9        	ret			;
                
 013F 3C        monon1	inr	a		;
 0140 3276FF    	sta	epromz		;
 0143 F1        	pop	psw		;
 0144 C9        	ret			;
                
                
                
                monoff:		; schalte Monitor-EPROM aus
                
 0145 F5        	push	psw		;
 0146 3A76FF    	lda	epromz		; 
 0149 3D        	dcr	a		;
 014A 3276FF    	sta	epromz		;
                	jrnz	monoff1		;
 014D+201F      	DB	20H,MONOFF1-$-1
                
 014F C5        	push	b		;
 0150 0600      	mvi	b,0		;
 0152 0EDE      	mvi	c,p$ram$table	;
 0154 3A0000    	lda	@cbnk		; setze selektiete
 0157 C602      	adi	2		; bank
                	outp	a		;
 0159+ED79      	DB	0EDH,A*8+41H
 015B 0610      	mvi	b,10h		;
                	outp	a		;
 015D+ED79      	DB	0EDH,A*8+41H
 015F C1        	pop	b		;
 0160 F1        	pop	psw		;
                
 0161 22C001    	shld	temp2		;
 0164 E1        	pop	h		;
                	lspd	userstack	;
 0165+ED7B      	DB	0EDH,07BH
 0167+BE01      	DW	USERSTACK
 0169 E5        	push	h		;
 016A 2AC001    	lhld	temp2		;
 016D C9        	ret			;
                
 016E F1        monoff1	pop	psw		;
 016F C9        	ret			;
                
                
                
                INTSER:
                	;NACH EINEM INTERRUPT UND WENN DIE SOFTSCHNITTSTELLE DIE KONSOLE
                	;BEDIENT, WIRD DIESE INTERRUPT-SERVIE-ROUTINE ANGESPROCHEN.
                	;SIE LIEST EIN ZEICHEN IN DIE SPEICHER ZELLE UNTER DIE IN$BUFF$ZEIG
                	;ZEIGT. IST DER BUFFER VOLL (11 BYTES), WIRD KEIN ZEICHEN
                	;MEHR EINGELESEN.
                	;
 0170 F5        	PUSH	PSW		;
 0171 C5        	PUSH	B		;
 0172 D5        	PUSH	D		;
 0173 E5        	PUSH	H		;
CP/M RMAC ASSEM 1.1	#006	CHARACTER I/O HANDLER FOR PROF-80

 0174 CD8C01    	CALL	SOFTIN2		;LESE ZEICHEN EIN
 0177 4F        	MOV	C,A		;RETTE ZEICHEN IN C
 0178 2A5EFF    	LHLD	IN$BUFF$ZEIG	;LADE BUFFER-ZEIGER
 017B 3E53      	MVI	A,IN$BUFF$END AND 0FFH
 017D BD        	CMP	L		;ZEIGER SCHON AM ENDE?
                	JRZ	INT$SERVICE1	;DANN GEHT ZEICHEN VERLOREN
 017E+2805      	DB	28H,INT$SERVICE1-$-1
 0180 2B        	DCX	H		;SONST LEGE ZEICHEN IN BUFFER
 0181 71        	MOV	M,C		;
 0182 225EFF    	SHLD	IN$BUFF$ZEIG	;UND SETZE ZEIGER NEU
                INT$SERVICE1:			;
 0185 E1        	POP	H		;
 0186 D1        	POP	D		;
 0187 C1        	POP	B		;
 0188 F1        	POP	PSW		;
 0189 FB        	EI			;GEBE INT. FREI
                	RETI			;
 018A+ED4D      	DB	0EDH,4DH
                ;
                ;
                ;
                SOFTIN2:			;
 018C 2A1EFF    	LHLD	SOFTVERZ	;LADE VERZOEGERUNG
                	SRLR	H		;TEILE DURCH ZWEI
 018F+CB3C      	DB	0CBH, 38H + H
                	RARR	L		;UM IN DER BIT MITTE ABZUTASTEN
 0191+CB1D      	DB	0CBH, 18H + L
 0193 2B        SOFTIN5	DCX	H		;VERZOEGERUNGSSCHLEIFE
 0194 7C        	MOV	A,H		;FUER EIN HALBES BIT
 0195 B5        	ORA	L		;
 0196 C29301    	JNZ	SOFTIN5		;
                				;
 0199 0608      	MVI	B,8		;LESE 8 BITS EIN
                SOFTIN3:
 019B 2A1EFF    	LHLD	SOFTVERZ	;ERST EIN BIT VERZOEGERN <16>
 019E 2B        SOFTIN4	DCX	H		;VERZOEGERUNGSSCHLEIFE
 019F 7C        	MOV	A,H		;
 01A0 B5        	ORA	L		;
 01A1 C29E01    	JNZ	SOFTIN4		;
                				;
 01A4 DBDA      	IN	P$IN$LS258$A	;LESE BIT EIN <11>
 01A6 E601      	ANI	MASK$RX		; <7>
 01A8 C6FF      	ADI	0FFH		;SETZE CARRY WENN EINS <7>
                	RARR	C		;UND LEGE IN CHARPUF. <8>
 01AA+CB19      	DB	0CBH, 18H + C
                	DJNZ	SOFTIN3		;LESE 8 BITS EIN <13>
 01AC+10ED      	DB	10H,SOFTIN3-$-1
                				;
 01AE 79        	MOV	A,C		;ERGEBNISS IN AKKU
 01AF 2F        	CMA			;NEGIERE, DA LS258 AUCH NEGIERT
 01B0 E67F      SOFTIN7	ANI	7FH		;STRIPP OF PARITY
                				;
 01B2 F5        	PUSH	PSW		;
 01B3 2A1EFF    	LHLD	SOFTVERZ	;WARTE STOP BIT AB
                SOFTIN10:
 01B6 2B        	DCX	H		;
CP/M RMAC ASSEM 1.1	#007	CHARACTER I/O HANDLER FOR PROF-80

 01B7 7C        	MOV	A,H		;
 01B8 B5        	ORA	L		;
 01B9 C2B601    	JNZ	SOFTIN10	;
 01BC F1        	POP	PSW		;
                				;
 01BD C9        	RET
                
                
 01BE           userstack	ds	2	;
 01C0           temp2		ds	2	;
 01C2           		ds	64	;
                monstack:
                
 0202           	end
