N CD12
;
; TESTSYSTEM MCS80-ODT
;
ODT:	LD	(RM.IYSAV),IY	;ADR MARKENTABELLE RETTEN
	LD	(IY-06H),003H	;REGISTER PROTOKOLL AB ZEILE 3
	LD	A,MC.CLEAR	;BILDSCHIRM LOESCHEN
	CALL	MC.BSN	;
MMM:	LD	HL,TX1	;KOPF AUSGEBEN
	CALL	MC.TXS	;
	LD	DE,0000DH	;POSITION GLOBALMARKE
	CALL	MC.BKS	;
	LD	H,(IY-01H)	;AKTUELLE ADREESE NACH HL
	LD	L,(IY-02H)	;
	PUSH	HL	;RETTEN
	CALL	CE.M3B28	;ADRESSE GLOBALMARKE NACH BC
	CALL	CE.M3777	;MARKE AUSSCHREIBEN
	LD	H,B	;
	LD	L,C	;
	CALL	MC.BKL	;
	CALL	MC.HDS	;ADRESSE GLOBALMARKE SCHREIBEN
	POP	HL	;AKTUELLE ADRESSE
	PUSH	HL	;
	POP	IX	;NACH IX
	PUSH	HL	;
	CALL	CE.M379D	;BERECHNEN BYTE/BEFEHL
	LD	A,C	;
	AND	003H	;
	INC	A	;KORREKTUR
	LD	B,A	;BYTEANZAHL IN B
	POP	IX	;
	LD	E,02BH	;POSITION AKTUELLER MC
	CALL	MC.HDS	;AKTUELLE ADRESSE AUSGEBEN
	LD	A,':'	;TRENNZEICHEN
	CALL	MC.BSS	;
	INC	E	;
O01:	INC	E	;
	LD	A,(HL)	;MC ALS HEX-BYTE AUSGEBEN
	CALL	MC.HBS	;
	INC	HL	;
	DJNZ	O01-#	;ZYKLUS FUER ALLE BYTE/BEFEHL
	LD	D,(IY-06H)	;AKTUELLE PROTOKOLLZEILE NACH D
	LD	E,02CH	;POSITON MNEMONIK
	CALL	MC.BKS	;
	CALL	CE.M381D	;ZEILE REASSEMBLIEREN
	CALL	RWR	;REGISTER PROTOKOLLIEREN
	LD	(RM.IYSAV),SP	;STACKPOINTER PROTOKOLLIEREN
	LD	HL,(RM.IYSAV)	;
	LD	(RM.IYSAV),IY	;
	LD	E,020H	;
	CALL	MC.HDS	;
	INC	E	;
	LD	H,(IY-01H)	;AKTUELLE ADRESSE NACH HL
	LD	L,(IY-02H)	;
	LD	(IY-0AH),L	;PARAMETER FUER L-KOMMANDO
	LD	(IY-09H),H	;(ANZEIGE AB LETZTEN TESTSCHRITT)
	CALL	MC.HDS	;PC PROTOKOLLIEREN
O03:	LD	D,(IY-6)	;AKTUELLE PROTOKOLLZEILE NACH D
	LD	E,0	;SPALTE 0
	CALL	MC.BKS	;
O04:	CALL	MC.TST	;KOMMANDOEINGABE
	JRZ	O04-#	;
	CALL	MC.BSS	;KOMMANDOKENNZEICHEN AUSGEBEN
	CMP	MC.OFF	;TEST: OFF ?
	JPZ	OFF	;JA
	LD	DE,5	;POSITION KOMMANDOTEXT
	CALL	MC.BKS	;
	LD	HL,TX5	;LAUF
	CMP	'L'	;TEST: LAUF ?
	JRZ	O05-#	;JA
	LD	HL,TX3	;SCHRITT
	CMP	'T'	;TEST: SCHRITT ?
	JRZ	O05-#	;JA
	LD	HL,TX4	;SCHLEIFE
	CMP	'N'	;TEST: SCHLEIFE ?
	JRZ	O05-#	;JA
	CMP	'X'	;TEST: REGISTERTAUSCH ?
	JRZ	OD4-#	;JA
	CMP	'R'	;TEST: REGISTERMODIFIKATION ?
	CAZ	RMO	;JA
	JR	O03-#	;ZYKLUS, WENN NICHT GEFUNDEN
OD4:	LD	D,(IY-06H)	;AKTUELLE PROTOKOLLZEILE NACH D
	LD	E,2	;POSITION AF-REGISTER
	CALL	RRD	;REGISTER LESEN
	POP	IY	;REGISTER BEREITSTELLEN
	POP	IX	;
	POP	HL	;
	POP	DE	;
	POP	BC	;
	POP	AF	;
	EXAF		;AF <-> AF'
	EXX		;BC, DE U. HL <-> BC', DE' U. HL'
	PUSH	AF	;REGISTER RETTEN
	PUSH	BC	;
	PUSH	DE	;
	PUSH	HL	;
	PUSH	IX	;
	PUSH	IY	;
	CALL	DLE	;
	CALL	RWR	;REGISTER PROTOKOLLIEREN
	JR	O03-#	;KOMMANDOEINGABE
O05:	CALL	MC.TXS	;KOMMANDOTEXT AUSGEBEN
	LD	DE,0002BH	;PC LESEN
	LD	A,084H	;
	CALL	MC.ZLE	;
	PUSH	HL	;UND RETTEN
	LD	D,(IY-6)	;AKTUELLE PROTOKOLLZEILE NACH D
	LD	E,2	;POSITION AF
	CALL	RRD	;REGISTER LESEN
	LD	E,0	;POSITION KOMMANDOARGUMENT
	CALL	MC.BSL	;KOMMANDO LESEN
	CMP	'N'	;TEST: SCHLEIFE ?
	JRNZ	O06-#	;
	CALL	CE.M3AD9	;JA, ADRESSE DES NAECHSTEN BEFEHLS
	LD	(IY-08H),L	;ALS HALTEPUNKT EINTRAGEN
	LD	(IY-07H),H	;
O06:	POP	IY	;REGISTER BEREITSTELLEN
	POP	IX	;
	POP	HL	;
	POP	DE	;
	POP	BC	;
	POP	AF	;
	JR	ANW-#	;
; INTERRUPTSERVICEROUTINE TESTSYSTEM-CTC
ISR:	EI		;INTERRUPT FREIGEBEN
	EX	(SP),HL	;HL GEGEN AKTUELLE ADRESSE TAUSCHEN
	PUSH	AF	;REGISTER RETTEN
	LD	A,003H	;CTC RUECKSETZEN
	OUT	IO.CDCTC	;
	PUSH	DE	;WEITERE REGISTER RETTEN
	PUSH	HL	;
	PUSH	IY	;
	LD	IY,(RM.IYSAV)	;ADR MARKENTABELLE NACH IY
	LD	(IY-02H),L	;AKTUELLE ADRESSE EINTRAGEN
	LD	(IY-01H),H	;
	LD	E,(IY-08H)	;HALTEPUNKTADRESSE NACH DE
	LD	D,(IY-07H)	;
	LD	A,D	;TEST: HALTEPUNKT RUECKGESETZT ?
	OR	E	;
	JRZ	IS1-#	;JA
	SBC	HL,DE	;NEIN, TEST: HALTEPUNKT ERREICHT ?
	JRZ	IS1-#	;JA
	CALL	MC.TST	;NEIN, TEST: TASTE OFF ?
	CMP	MC.OFF	;
IS1:	POP	IY	;REGISTER RUECKSPEICHERN
	POP	HL	;
	POP	DE	;
	JRZ	HAN-#	;ZUR PROTOKOLLIERUNG
	POP	AF	;REGISTER RUECKSPEICHERN
	EX	(SP),HL	;AKTUELLE ADRESSE <-> ALTES HL
ANW:	PUSH	AF	;REGISTER RETTEN
	PUSH	HL	;
	PUSH	DE	;
	LD	HL,ISR	;INTERRUPTVERBINDUNGSADRESSE
	LD	(IV.CDCTC),HL	;EINTRAGEN
	LD	HL,005C7H	;INITIALISIERUNGSDATEN CTC
	PUSH	IY	;REGISTER RETTEN
	CALL	DLE	;
	POP	IY	;
	LD	E,0	;POSITION KOMMANDOARGUMENT
	CALL	MC.BSL	;KOMMANDO LESEN
	CMP	'L'	;TEST: LAUF ?
	JRNZ	IS2-#	;NEIN
	LD	A,0C3H	;JA, RST 7 BELEGEN
	LD	(00038H),A	;MIT SPRUNG INS TESTSYSTEM
	LD	HL,ODL	;
	LD	(00039H),HL	;
	LD	HL,00303H	;CTC DATEN (NICHT INITIALISIEREN)
IS2:	LD	A,L	;CTC STEUERWORT
	OUT	IO.CDCTC	;
	LD	A,H	;CTC ZEITKONSTANTE
	OUT	IO.CDCTC	;
	POP	DE	;REGISTER RUECKSPEICHERN
	POP	HL	;
	POP	AF	;
	RETI		;TESTLAUF
; HALTEPUNKANZEIGE VORBEREITEN
HAN:	POP	AF	;REGISTER RUECKSPEICHERN
	POP	HL	;
	PUSH	AF	;REGISTER RETTEN (REIHENFOLGE)
	PUSH	BC	;
	PUSH	DE	;
	PUSH	HL	;
	PUSH	IX	;
	PUSH	IY	;
	CALL	DLE	;
	INC	D	;NAECHSTE PROTOKOLLZEILE
	LD	A,D	;TEST: BILDSCHIRMENDE ERREICHT ?
	CMP	010H	;
	JRC	HA3-#	;NEIN
	CALL	MC.BRO	;JA, BILDSCHIRM ROLLEN
	LD	D,00FH	;AKTUELLE PROTOKOLLZEILE
HA3:	CALL	MC.BKS	;
	LD	A,MC.HOME	;ZEILE LOESCHEN
	CALL	MC.BSN	;
	LD	(IY-06H),D	;ZEILENNUMMER RETTEN
	LD	(IY-08H),0	;HALTEPUNKT RUECKSETZEN
	LD	(IY-07H),0	;
	CALL	MC.BKS	;
	JMP	MMM	;SPRUNG ZUR ANZEIGE
OFF:	LD	D,(IY-06H)	;TESTSYSTEM VERLASSEN
	LD	E,2	;POSITION AF-REGISTER
	CALL	RRD	;REGISTER LESEN
	LD	HL,CE.M3023	;RUECKKEHRADRESSE VON OCE
	PUSH	HL	;AUF STACK
	RETI		;RUECKKEHR
; SOFTWAREHALTEPUNKT BEARBEITEN (REAKTION AUF RST 7)
ODL:	DI		;INTERRUPT SPERREN
	PUSH	AF	;REGISTER RETTEN
	PUSH	HL	;
	PUSH	IY	;
	LD	IY,(RM.IYSAV)	;ADRESSE MARKENTABELLE NACH IY
	LD	(IY-08H),000H	;HALTEPUNKT RUECKSETZEN
	LD	(IY-07H),000H	;
	LD	HL,ISR	;ADRESSE INTERRUPTSERVICEROUTINE
	LD	(IV.CDCTC),HL	;DES TESTSYSTEMS EINTRAGEN
	LD	A,087H	;CTC INITIALISIEREN
	OUT	IO.CDCTC	;
	LD	A,001H	;
	OUT	IO.CDCTC	;
	POP	IY	;REGISTER RUECKSPEICHERN
	POP	HL	;
	POP	AF	;
	EI		;
	RET		;
; REGISTER LESEN
RRD:	LD	B,6	;ANZAHL
RD1:	LD	A,084H	;4 STELLIGE HEX-ZAHL LESEN
	CALL	MC.ZLE	;
	EX	(SP),HL	;HEXAZAHL <-> RUECKKEHRADRESSE
	PUSH	HL	;RUECKKEHRADRESSE RETTEN
	INC	E	;POSITION NAECHSTES REGISTER
	DJNZ	RD1-#	;ZYKLUS
	RET		;
; REGISTER SCHREIBEN
RWR:	LD	B,6	;ZAEHLER
	LD	E,01BH	;POSITION SP-REGISTER
WR1:	POP	HL	;RUECKKEHRADRESSE NACH HL
	EX	(SP),HL	;REGISTERWERT <-> RUECKKEHRADRESSE
	CALL	MC.HDS	;REGISTER PROTOKOLLIEREN
	LD	A,' '	;TRENNZEICHEN
	CALL	MC.BSS	;
	LD	A,0F7H	;POSITION DES NAECHSTEN REGISTERS
	ADD	E	;BERECHNEN
	LD	E,A	;
	DJNZ	WR1-#	;ZYKLUS
	RET		;
; REGISTERMODIFIKATION
RMO:	LD	HL,TX6	;KOMMADOTEXT
	CALL	MC.TXS	;
	LD	D,(IY-06H)	;AKTUELLE PROTOKOLLZEILE NACH D
	LD	E,2	;POSITION AF-REGISTER
	CALL	MC.BKS	;
	CALL	RRD	;SICHERHEITSKOPIE AUF STACK
	LD	C,01DH	;SCHREIBBEREICH EINGRENZEN
	CALL	MC.BKL	;
	CALL	MC.BBZ	;NEUE WERTE EINTRAGEN
	JRC	RR3-#	;BEI ABSCHLUSS MIT OFF
	LD	B,00CH	;ZAEHLER, BEI ABSCHLUSS MIT
RR2:	INC	SP	;ENTER STACKKORREKTUR
	DJNZ	RR2-#	;
	CALL	RRD	;REGISTER LESEN
	CALL	RWR	;UND FORMATIERT SCHREIBEN
	JR	RR4-#	;
RR3:	CALL	RWR	;ALTE WERTE SCHREIBEN
RR4:	LD	E,0	;KOMMANDO KENNZEICHEN LOESCHEN
	LD	A,' '	;
	CALL	MC.BSS	;
	LD	DE,5	;POSITION KOMMANDOTEXT
	CALL	MC.BKS	;
	LD	HL,TX7	;
	CALL	MC.TXS	;
	RET		;
; NUMMER DER AKTUELLEN PROTOKOLLZEILE NACH D
DLE:	LD	IY,(RM.IYSAV)	;! IY WIRD ZERSTOERT
	LD	D,(IY-06H)	;
	RET		;
; PROGRAMMTEXTE
TX1:	DB	MC.BBEG+080H	;
	DB	MC.HOME	;
	DB	'ODT'	;
	DB	MC.DOWN	;
	DB	MC.HOME	;
	DB	MC.DOWN	;
	DB	MC.HOME	;
	DB	'   AF   BC   DE   HL   IX   IY   SP   PC'
	DB	'        Mnemonik'	;
TX3:	DB	0D3H	;S
	DB	'CHRI'	;
TX4:	DB	0D3H	;S
	DB	'CHLE'	;
TX5:	DB	0CCH	;L
	DB	'AUF '	;
TX6:	DB	0D2H	;R
	DB	'EG.K'	;
TX7:	DB	0A0H	;
	DB	'    '	;
	DB	080H	;TEXTENDE
;
	END

