N CH03
;
; DIENST- UND HILFSPROGRAMME MCS 80
;
; SPEICHERUMLAGERUNG
ZZZ:	LD	HL,04000H	;ANFANGSADRESSE
	LD	C,IO.SPSCH	;PORT-ADRESSE
	LD	DE,00D8FH	;STEUERDATEN
ZZ1:	OUT	D	;ROM EIN - RAM AUS
	NOP		;WARTEN
	NOP		;
	LD	A,(HL)	;IN A ZWISCHENSPEICHERN
	OUT	E	;RAM EIN - ROM AUS
	LD	(HL),A	;IN RAM KOPIEREN
	INC	HL	;NAECHSTE ADRESSE
	BIT	7,H	;TEST: 8000H ?
	JRZ	ZZ1-#	;NEIN, ZYKLUS
	LD	A,E	;SPEICHERDEFINITION EINTRAGEN
	LD	(RM.SPDEF),A	;
	RET		;RUECKKEHR
;
; DIREKTSTART
EXEC:	LD	HL,TXT1	;TEXTAUSGABE
	CALL	MC.TXS	;
	CALL	MC.BKL	;ADRESSEINGABE ABFORDERN
	CALL	MC.HDA	;
	RC		;FEHLERRUECKKEHR
	JMP	(HL)	;PROGRAMM AUSFUEHREN
;
; SPEICHER PRUEFEN
PCS:	LD	A,MC.CLEAR	;BILDSCHIRM LOESCHEN
	CALL	MC.BSN	;
	LD	DE,100H	;ZEILE 1, SPALTE 0
	CALL	MC.BKS	;POSITION RETTEN
	LD	IX,RF.CSREF	;ADR. PRUEFSUMMENREFERENZEN
	LD	IY,RF.MMMAP	;BITMAP EPROM-BELEGUNG
	LD	A,(IY)	;WERT NACH A
	LD	BC,808H	;ZAEHLER BITMAP
	LD	HL,0FC00H	;MEM-ADRESSE
PCS0:	PUSH	BC	;ZAEHLER RETTEN
	LD	BC,400H	;LAENGE 1K
	ADD	HL,BC	;MEM-ADRESSE BERECHNEN
	RRA		;TEST:EPROM?
	PUSH	AF	;REGISTER RETTEN
	JRNC	PCS3-#	;WENN KEIN PROM
	PUSH	HL	;
	CALL	CCS	;PRUEFSUMME BERECHNEN
	LD	H,(IX+1)	;MIT REFERENZ VERGLEICHEN
	DEC	IX	;
	LD	L,(IX+1)	;
	DEC	IX	;
	AND	A	;
	SBC	HL,DE	;
	POP	HL	;ADRESSE ZURUECK
	JRZ	PCS3-#	;KEIN FEHLER
	CALL	MC.BKL	;KURSORPOSITION NACH DE
	CALL	MC.HDS	;ADRESSE AUSGEBEN
	DEC	E	;
	DEC	E	;
	DEC	E	;
	DEC	E	;
	INC	D	;POSITION NAECHSTER ZEILE
	BIT	4,D	;TEST: ZEILENUEBERLAUF?
	JRZ	PCS2-#	;NEIN
	LD	D,1	;NEUE POSITION
	LD	A,8	;
	ADD	E	;
	LD	E,A	;
PCS2:	CALL	MC.BKS	;POSITION RETTEN
PCS3:	POP	AF	;REGISTER RUECKSPEICHERN
	POP	BC	;
	DJNZ	PCS0-#	;ZYKLUS
	LD	B,8	;WERT NEU LADEN
	INC	IY	;NAECHSTES BYTE BITMAP
	LD	A,(IY)	;NACH A
	DEC	C	;ZAEHLER ERNIEDRIGEN, TEST: =0?
	JRNZ	PCS0-#	;NEIN, ZYKLUS
	CALL	MC.BKL	;KURSORPOSITION NACH DE
	LD	HL,100H	;TEST: ANFANGSPOSITION?
	AND	A	;
	SBC	HL,DE	;
	JRZ	PCS5-#	;JA, KEIN FEHLER
	LD	DE,0	;KURSOR ZUM ANFANG
	CALL	MC.BKS	;
	LD	HL,FTEXT	;NEIN, ADR. FEHLERTEXT
	CALL	MC.TXS	;TEXT SCHREIBEN
	CALL	MC.BKL	;KURSOR LOESCHEN
	LD	A,' '	;
	CALL	MC.BSS
PCS4:	CALL	MC.TST	;AUF BESTAETIGUNG WARTEN
	JRZ	PCS4-#	;
PCS5:	RET		;RUECKKEHR
;
; PRUEFSUMME BERECHNEN
; HL - ANFANGSADRESSE
; BC - DATENLAENGE
; DE - PRUEFSUMME
;
CCS:	LD	D,0FFH	;
	LD	E,D	;
MCA47:	LD	A,(HL)	;
	XOR	D	;
	LD	D,A	;
	RRCA		;
	RRCA		;
	RRCA		;
	RRCA		;
	AND	00FH	;
	XOR	D	;
	LD	D,A	;
	RRCA		;
	RRCA		;
	RRCA		;
	PUSH	AF	;
	AND	01FH	;
	XOR	E	;
	LD	E,A	;
	POP	AF	;
	PUSH	AF	;
	RRCA		;
	AND	0F0H	;
	XOR	E	;
	LD	E,A	;
	POP	AF	;
	AND	0E0H	;
	XOR	D	;
	LD	D,E	;
	LD	E,A	;
	INC	HL	;
	DEC	BC	;
	LD	A,B	;
	OR	C	;
	JRNZ	MCA47-#	;
	RET		;
;
; ZEICHENSATZ ANZEIGEN
CHARS:	LD	A,MC.CLEAR	;BILDSCHIRM LOESCHEN
	CALL	MC.BSN	;
	CALL	MC.BKL	;
	LD	A,' '	;
	CALL	MC.BSS	;
AZG:	LD	B,16	;ZAEHLER
	LD	A,0B0H	;'3' MIT KURSOR
	LD	DE,311H	;DISPLAYPOSITION
AZ1:	CALL	MC.BSS	;TABELLENKOPF SCHREIBEN
	INC	A	;NAECHSTES ZEICHEN
	CMP	0BAH	;TEST: = '9'+1 ?
	JRNZ	AZ2-#	;NEIN
	LD	A,0C1H	;'A' MIT KURSOR
AZ2:	INC	E	;NAECHSTE POSITION
	INC	E	;
	DJNZ	AZ1-#	;ZYKLUS
	LD	BC,010B0H	;ZAEHLER UND ZEICHENKODE
	LD	DE,50EH	;POSITION
	LD	L,0	;
AZ3:	LD	A,C	;ZEICHEN NACH A
	CALL	MC.BSS	;ZEILENWERT SCHREIBEN
	INC	E	;NAECHSTE POSITION
	INC	E	;
	INC	E	;
	LD	A,L	;ZEICHEN NACH A
AZ4:	CALL	MC.BSS	;ZEICHEN SCHREIBEN
	INC	E	;NAECHSTE POSITION
	INC	E	;
	INC	A	;NACHSTE KODIERUNG
	DJNZ	AZ4-#	;ZYKLUS FUER EINE ZEILE
	LD	L,A	;KODIERUNG IN L ZWISCHENSPEICHERN
	INC	D	;NAECHSTE ZEILE
	LD	E,00EH	;SPALTENANFANG
	LD	B,010H	;ZEICHENZAEHLER PRO ZEILE
	INC	C	;
	LD	A,0B8H	;TEST: ENDE?
	CMP	C	;
	JRNZ	AZ3-#	;NEIN, ZYKLUS
AZ5:	CALL	MC.TST	;WARTEN AUF TASTENBETAETIGUNG
	JRZ	AZ5-#	;
	RET		;
;
; SPEICHER INITIALISIEREN (LOESCHEN)
INIT:	DI		;INTERRUPT SPERREN
	LD	HL,0C00H	;
	LD	B,0FFH	;
INI1:	LD	(HL),B	;
	INC	HL	;
	LD	A,H	;
	OR	L	;
	JRNZ	INI1-#	;
	JMP	(HL)	;RESET
;
TXT1:	DB	0A0H	;TEXT 1
	DB	'Startadresse:'	;
FTEXT:	DB	0A0H	;FEHLERTEXT
	DB	'EPROM-Fehler'	;
	DB	080H	;
;
	END

