;******************************************************************************
;*              F.Wohlrabe 17.01.98 Ver. 1                                    *
;*              Taktfrequenz 10MHz = 1,0 Tc                                   *
;******************************************************************************
;Programm fr ein Lauflicht mit 5x7 Anzeigeelementen
;Tastaturbefehle werden durch einen Infrarotempf„nger zugefhrt

.incld cop880.inc
.sect main,rom,abs=0

ASICHER = 00H
BSICHER = 01H
XSICHER = 02H
ZEITZAEHLER	= 03
STATUS		= 04	;0 = Sekunde
			;1 = 100ms
			;2 = Rotstop
			;3 = Bufshift
			;4 = Shifttaste
			;5 = Ramausgabe
			;6 = Abholen
			;7 = ROM_Ende
ZEICHENZAEHLER	= 05
ROTZAEHLER	= 06
ZEICHENADRESSE	= 07
NULLZAEHLER	= 08
TASTSTATUS	= 09	;0 = Senden
			;1 = 
			;2 = L”schen
			;3 = 
			;4 = Parity
			;5 = Toggle
			;6 = Timeout
			;7 = Info


BUFFERANFANG	= 10		;Hier wird der Wert aus der Tabelle eingeschrieben
BUF1		= 11		;			#
BUF2		= 12		;			#
BUF3		= 13		;			#
BUF4		= 14		;			#
BUF5		= 15		;			#
BUFFERSTART	= 16		;Ab hier beginnt der Anzeigebereich des Displays
BUF7		= 17		;       Modul 8
BUF8		= 18		;         #
BUF9		= 19		;         #
BUF10		= 20		;         #
BUF11		= 21		;       Modul 7
BUF12		= 22		;         #
BUF13		= 23		;         #
BUF14		= 24		;         #
BUF15		= 25		;         #
BUF16		= 26		;       Modul 6
BUF17		= 27		;         #
BUF18		= 28		;         #
BUF19		= 29		;         #
BUF20		= 30		;         #
BUF21		= 31		;       Modul 5
BUF22		= 32		;         #
BUF23		= 33		;         #
BUF24		= 34		;         #
BUF25		= 35		;         #
BUF26		= 36		;       Modul 4
BUF27		= 37		;         #
BUF28		= 38		;         #
BUF29		= 39		;         #
BUF30		= 40		;         #
BUF31		= 41		;       Modul 3
BUF32		= 42		;         #
BUF33		= 43		;         #
BUF34		= 44		;         #
BUF35		= 45		;         #
BUF36		= 46		;       Modul 2
BUF37		= 47		;         #
BUF38		= 48		;         #
BUF39		= 49		;         #
BUF40		= 50		;         #
BUF41		= 51		;       Modul 1
BUF42		= 52		;         #
BUF43		= 53		;         #
BUF44		= 54		;         #
BUFFER_HI	= 55		;         #
BUFFER_END	= 56		;Dummy
CODE		= 57
BACKUP		= 58
PSWSICHER	= 59
POSZEIGER	= 60
RAMZEIGER	= 61
TASTE		= 62
SNDBUF = 63         ;CONTAINES THE COMMAND BYTE TO BE WRITTEN TO NMC9306
DATABYTE  = 64         ;LOWER BYTE OF THE NMC9306 REGISTER DATA READ
MAXADRLOW = 65
ADRESSELOW = 66
ADRESSEHIGH = 67
         ;UPPER BYTE OF //   //     //       //  //
         ;LOWER BYTE OF THE DATA TO BE WRITTEN TO NMC9306 REG.
         ;UPPER BYTE OF  //  //  //  //  //    //  //    //
ADRESS  = 68        ;THE LOWER 4-BITS OF THE LOCATION CONTAIN THE ADRESS
	            ;OF THE COP 494 REGISTERS TO BE READ/WRITTEN
FLAGS   = 69        ;USED FOR SETTING UP FLAGS

SECONDS_LO	= 70
SECONDS_HI	= 71
MINUTES_LO	= 72
MINUTES_HI	= 73
HOURS_LO	= 74
HOURS_HI	= 75
UHRSTATUS	= 76	;0 = Uhrzeit darstellen
			;1 = Uhrzeit stellen
			;2 = Nur Uhrzeit
			;3 = Nur Laufschrift
UHRZAEHLER	= 77
ZEITPOINTER	= 78
RECEIVEMODE	= 79
TIMERDATA	= 80
REGISTER	= 81
DATACODE	= 82
MAXADRHIGH	= 83
MILLISEC1	= 0F0H
MILLISEC2	= 0F1H
ZAEHLER		= 0F2H
ZAEHLER_INT	= 0F3H
BUFFERZEIGER	= 0F4H
BITZAEHLER	= 0F5H
PARYZAEHLER	= 0F6H
BITCOUNT	= 0F7H
BUFFZEIGER	= 0F8H
OUTZAEHLER	= 0F9H
EEZAEHLER	= 0FAH
XZAEHLER	= 0FBH

;Pinbelegung:	G0		Infrarotempf„nger
;		G1		Laufschrift Clock
;		G2		Laufschrift Data
;		G3		Laufschrift Clear
;		G4		Eeprom output (DO)
;		G5		Eeprom Microwire clock
;		G6		Eeprom input (DI)

;		L0	
;		L1	
;		L2	
;		L3	
;		L4	
;		L5	
;		L6	
;		L7		Eeprom Microwire Chip select

;************************************************
;*              Initialisierung                 *
;************************************************

LAUFLICHT:
	LD      B,#0FDH         ;Clear Ram
RAM:    LD      [B],#0          ;
	DRSZ    B               ;
	JP      RAM             ;
	LD      0,#0            ;
	LD      PORTLC,#0FFH    ;Alle L-Pins als Ausgang Low
	LD      PORTLD,#07FH    ;
	LD      PORTCC,#0FFH    ;Alle C-Pins als Ausgang Low
	LD      PORTCD,#0       ;
	LD      PORTDD,#0       ;Alle D-Pins als Ausgang Low
	LD      PORTGC,#B'00101110;G4 Eingang mit Pull-up, G0 als Input, G5 Ausgang
	LD	PORTGD,#B'01010001;Data, Clock, Clear auf Low
	LD      SP,#06FH        ;Stackpointer auf oberste Ramadresse
	LD      B,#TMRLO        ;
	LD      [B+],#08FH      ;0.4ms Interrupt
	LD      [B+],#01H       ;
	LD      [B+],#08FH      ;
	LD      [B],#01H        ;
	LD	MILLISEC1,#255	;
	LD	MILLISEC2,#5	;
	LD	POSZEIGER,#55	;
	LD	BUFFERZEIGER,#55;
	LD	BUFFZEIGER,#55	;
	LD	RAMZEIGER,#70	;
	SBIT	3,PORTGD	;Clearsignal aufheben
	SBIT	2,PORTGD	;Datasignal auf High
	SBIT    7,CNTRL         ;Timer Mode
	LD      PSW,#011H       ;Enable Timer-Interrupt
				;Enable General-Interrupt
	SBIT	GIE,PSW		;Alle Interrupts wieder zulassen
	SBIT    4,CNTRL         ;Timer anschalten
	SBIT	3,UHRSTATUS	;SBIT 'Nur Laufschrift'(3),Uhrstatus
	JSR	EEREAD		;Adresse 0 und 1 im Eeprom auslesen
	LD	A,DATABYTE	;
	X	A,MAXADRLOW	;
	LD	ADRESSELOW,#1	;
	JSR	EEREAD		;
	LD	A,DATABYTE	;
	X	A,MAXADRHIGH	;
	LD	A,MAXADRLOW	;
	IFEQ	A,#0		;
	JP	XA1		;
	IFEQ	A,#0FFH		;
	JP	XA2		;
	JP	XAA
XA1:	LD	A,MAXADRHIGH	;
	IFEQ	A,#0		;
	JP	LOOP		;
XAA:	SBIT	5,STATUS	;     SBIT Ramausgabe(5),Status  
	JP	LOOP		;
XA2:	LD	A,MAXADRHIGH	;
	IFEQ	A,#0FFH		;
	JP	LOOP		;
	SBIT	5,STATUS	;     SBIT Ramausgabe(5),Status  

;************************************************
;*		Hauptprogramm			*
;************************************************

				;DO FOREVER
LOOP:	LD      A,RECEIVEMODE   ;       IF Receivemode = 20
	IFEQ    A,#020H         ;
	JP      LOOP2           ;
	JP      LOOP3           ;
LOOP2:  JSR     AUSWERTUNG      ;       THEN CALL 'Auswertung'
LOOP6:	LD      RECEIVEMODE,#0  ;            Receivemode = 0
	LD      OUTZAEHLER,#8   ;            Outzaehler = 8      
	LD      TIMERDATA,#0    ;            Timerdata = 0
	JP      LOOP4           ;
LOOP3:  IFEQ    A,#0FFH         ;       ELSE IF ERROR
	JP      LOOP6           ;            THEN Alle Register l”schen
				;            ENDIF
				;       ENDIF
LOOP4:	IFBIT	1,STATUS	;	IF Bit 100ms(1),Status
	JP	LOOP5		;
	JP	LOOP		;
LOOP5:	RBIT	1,STATUS	;	THEN RBIT 100ms(1),Status
	JSR	ROTATEBUFFER	;            CALL 'Rotatebuffer'
	JSR	UHRZEIT		;
	LD	A,ZEITZAEHLER	;            Zeitzaehler = Zeitzaehler + 1
	ADD	A,#1		;
	X	A,ZEITZAEHLER	;
	IFEQ	A,#9		;            IF Zeitzaehler = 10
	JP	LOOP1		;
	JP	LOOP		;
LOOP1:	LD	ZEITZAEHLER,#0	;            THEN Zeitzaehler = 0
	JSR	ZEIT		;                 CALL 'Zeit'
				;            ENDIF
	JP	LOOP		;	ENDIF
				;END DO FOREVER

;************************************************
;*	Rotieren des Buffers um eine Stelle	*
;************************************************

ROTATEBUFFER:
	IFBIT	2,STATUS	;IF NOT Bit Rotstop(2),Status
	JP	RO2		;
	IFBIT	0,UHRSTATUS	;AND NOT Bit 'Uhrzeit darstellen'(0),Uhrstatus
	JP	RO2		;
	LD	ZAEHLER,#46	;
	LD	X,#BUFFER_HI	;
	LD	B,#BUFFER_END	;
RO1:	LD	A,[X-]		;
	X	A,[B-]		;
	DRSZ	ZAEHLER		;
	JP	RO1		;
	LD	BUFFERANFANG,#0	;
	LD	A,ROTZAEHLER	;Rotzaehler = Rotzaehler + 1
	ADD	A,#1		;
	X	A,ROTZAEHLER	;
	IFEQ	A,#5		;IF Rotzaehler = 6
	JP	RO3		;
	JP	RO2		;
RO3:	LD	ROTZAEHLER,#0	;THEN Rotzaehler = 0
	IFBIT	7,STATUS	;     IF Bit ROM_Ende(7),Status
	JP	FUELL_NULL	;     THEN CALL 'Fuell_Null'
	JSR	LADE_ZEICHEN	;     ELSE CALL 'Lade_Zeichen'
				;     ENDIF
RO2:	RET			;ENDIF

.=0FFH

;************************************************
;*              Interrupt                       *
;************************************************

	X       A,ASICHER       ;
	LD      A,B             ;
	X       A,BSICHER       ;
	LD	A,PSW		;
	X	A,PSWSICHER	;
TIMEINT:RBIT    TPND,PSW        ;Pending Flag l”schen
	LD      A,RECEIVEMODE   ;IF Receivemode = 0
	IFEQ    A,#0            ;
	JP      P10             ;THEN GOTO 'P10'
	IFEQ    A,#1            ;ELSE IF Receivemode = 1
	JP      P20             ;     THEN GOTO 'P20'
	IFEQ    A,#2            ;     ELSE IF Receivemode = 2
	JP      P30             ;          THEN GOTO 'P30'
	IFEQ    A,#010H         ;               ELSE IF Receivemode = 10
	JP      P50             ;                    THEN GOTO 'P50'
	IFEQ    A,#011H         ;                    ELSE IF Receivemode = 11
	JP      P60             ;                         THEN GOTO 'P60'
				;                         ENDIF
				;                    ENDIF
				;               ENDIF
				;          ENDIF
				;     ENDIF
				;ENDIF
P80:    LD      A,RECEIVEMODE   ;IF Receivemode = 20
	IFEQ    A,#020H         ;
	JP      P81             ;THEN GOTO 'P81'
	IFEQ    A,#0FFH         ;     ELSE IF Receivemode = FF
	JP      P81             ;          THEN GOTO 'P81'
	LD      A,TIMERDATA     ;          ELSE Timerdata = Timerdata + 1
	RC                      ;
	ADC     A,#1            ;
	X       A,TIMERDATA     ;
	IFC                     ;               IF šberlauf
	LD      RECEIVEMODE,#0FFH;              THEN Receivemode = FF
				;               ENDIF
				;          ENDIF        
				;     ENDIF
				;ENDIF
P81:	JP	SPALTENSHIFT	;CALL 'Spaltenshift'
INT2:	DRSZ	MILLISEC1	;Millisec = Millisec - 1
	JP	INT1		;IF šberlauf
	LD	MILLISEC1,#250	;THEN Millisec = 250
	SBIT	1,STATUS	;     SBIT 100ms(1),Status
				;ENDIF
INT1:	LD	A,PSWSICHER	;
	AND	A,#B'11000000	;
	RBIT	7,PSW		;
	RBIT	6,PSW		;
	XOR	A,PSW		;
	X	A,PSW		;
	LD      A,BSICHER       ;
	X       A,B             ;
	LD      A,ASICHER       ;
	RETI

;************************************************
;*	Ein Zeichen aus dem ROM holen		*
;************************************************

LADE_ZEICHEN:
	LD	A,ZEICHENZAEHLER;Zeichen entsprechend dem Zeichenzaehler aus ROM
	JSR	HOLE_ADRESSE	;holen
	IFBIT	5,STATUS	;IF NOT Bit Ramausgabe(5),Status
	JP	LA2		;
	IFEQ	A,#07EH		;THEN IF ROM-Wert = 07EH (~)
	JP	LA1		;
	JP	LA2		;
LA1:	SBIT	7,STATUS	;     THEN SBIT ROM_Ende(7),Status
	LD	ZEICHENZAEHLER,#0;         Zeichenzaehler = 0
	RET			;
LA2:	LD	B,#BUF5		;
XLA2:	IFGT	A,#073H		;
	JP	T3NEU		;
	IFGT	A,#049H		;
	JP	T3		;ELSE IF Adresse > 49H
	JP	T2		;
T3:	JSR	TABELLE1	;     THEN Zeichenadresse holen
	X	A,ZEICHENADRESSE;          Zeichenadresse sichern
	LD	XZAEHLER,#6	;          6 Werte aus Tabelle 3 auslesen
;	LD	B,#BUF5
LA3:	LD	A,ZEICHENADRESSE;
	JSR	TABELLE3	;
	X	A,[B-]		;
	LD	A,ZEICHENADRESSE;
	ADD	A,#1		;
	X	A,ZEICHENADRESSE;
	DRSZ	XZAEHLER		;
	JP	LA3		;
	LD	A,ZEICHENZAEHLER;          Zeichenzaehler = Zeichenzaehler + 1
	ADD	A,#1		;
	X	A,ZEICHENZAEHLER;
	RET			;
T2:	JSR	TABELLE1	;     ELSE Zeichenadresse holen
	X	A,ZEICHENADRESSE;          Zeichenadresse sichern
	LD	XZAEHLER,#6	;          6 Werte aus Tabelle 2 auslesen
;	LD	B,#BUF5		;
LA4:	LD	A,ZEICHENADRESSE;
	JSR	TABELLE2	;
	X	A,[B-]		;
	LD	A,ZEICHENADRESSE;
	ADD	A,#1		;
	X	A,ZEICHENADRESSE;
	DRSZ	XZAEHLER		;
	JP	LA4		;
	LD	A,ZEICHENZAEHLER;          Zeichenzaehler = Zeichenzaehler + 1
	ADD	A,#1		;
	X	A,ZEICHENZAEHLER;
	RET			;     ENDIF
				;ENDIF

T3NEU:	JSR	TABELLE1	;     THEN Zeichenadresse holen
	X	A,ZEICHENADRESSE;          Zeichenadresse sichern
	LD	XZAEHLER,#6	;          6 Werte aus Tabelle 3 auslesen
;	LD	B,#BUF5		;
LA3NEU:	LD	A,ZEICHENADRESSE;
	JSR	TABELLE4	;
	X	A,[B-]		;
	LD	A,ZEICHENADRESSE;
	ADD	A,#1		;
	X	A,ZEICHENADRESSE;
	DRSZ	XZAEHLER		;
	JP	LA3NEU		;
	LD	A,ZEICHENZAEHLER;          Zeichenzaehler = Zeichenzaehler + 1
	ADD	A,#1		;
	X	A,ZEICHENZAEHLER;
	RET			;


;************************************************
;*	N„chste Spalte ansteuern		*
;************************************************

SPALTENSHIFT:
	LD	A,BUFFZEIGER	;
	IFEQ	A,#15		;IF Bufferzeiger = 15
	JP	SPA1		;
	JP	SPA2		;
SPA1:	LD	BUFFZEIGER,#55;THEN Bufferzeiger = 55
	RBIT	3,PORTGD	;     Clearsignal ausgeben
	NOP			;
	SBIT	3,PORTGD	;
	SBIT	2,PORTGD	;     Datasignal auf High
				;ENDIF
SPA2:	LD	A,BUFFZEIGER	;
	X	A,B		;
	LD	A,PORTLD
	OR	A,#B'01111111
	X	A,PORTLD
	LD	A,[B]		;Gebe Inhalt von Bufferzeiger an Port L aus
	XOR	A,#07FH		;
;	AND	A,#B'01111111	;Bit 7 maskieren, da als CS vom Eeprom benutzt

	SBIT	1,PORTGD	;Ein Clocksignal ausgeben
	X	A,PORTLD	;
	DRSZ	BUFFZEIGER	;Bufferzeiger = Bufferzeiger - 1
	NOP			;
	RBIT	1,PORTGD	;
	RBIT	2,PORTGD	;Datasignal auf Null
	JP	INT2		;
.=0320
;************************************************
;*		Tabelle 1			*
;************************************************
;Hier sind die Einsprungadressen fr die Tabellen 2-4
.BYTE	000H,006H,00CH,012H,018H,01EH,024H,02AH
.BYTE	030H,036H,03CH,042H,048H,04EH,054H,05AH
.BYTE	060H,066H,06CH,072H,078H,07EH,084H,08AH
.BYTE	090H,096H,09CH,0A2H,0A8H,0AEH,0B4H,0BAH
.BYTE	0C0H,0C6H,0CCH,0D2H,0D8H,0DEH,0E4H,0EAH
.BYTE	0F0H,0F6H

.BYTE	000H,006H,00CH,012H,018H,01EH,024H,02AH
.BYTE	030H,036H,03CH,042H,048H,04EH,054H,05AH
.BYTE	060H,066H,06CH,072H,078H,07EH,084H,08AH
.BYTE	090H,096H,09CH,0A2H,0A8H,0AEH,0B4H,0BAH
.BYTE	0C0H,0C6H,0CCH,0D2H,0D8H,0DEH,0E4H,0EAH
.BYTE	0F0H,0F6H

.BYTE	000H,006H,00CH,012H,018H,01EH,024H,02AH
.BYTE	030H,036H,03CH,042H,048H,04EH,054H,05AH
.BYTE	060H,066H

TABELLE1:
	LAID
	RET

.=0400
;************************************************
;*		Tabelle 2			*
;************************************************

.BYTE	0,0,0,0,0,0			;space
.BYTE	0,0,0,07DH,0,0			;!
.BYTE	0,0,070H,0,070H,0		;"
.BYTE	0,014H,07FH,014H,07FH,014H	;#
.BYTE	0,012H,02AH,07FH,02AH,024H	;$
.BYTE	0,062H,064H,08H,013H,023H	;%
.BYTE	0,036H,049H,035H,02H,05H	;&
.BYTE	0,0,0,070H,0,0			;'
.BYTE	0,01CH,022H,041H,0,0		;(
.BYTE	0,0,0,041H,022H,01CH		;)
.BYTE	0,022H,014H,07FH,014H,022H	;*
.BYTE	0,08H,08H,03EH,08H,08H		;+
.BYTE	0,0,1,6,0,0			;,
.BYTE	0,8,8,8,8,8			;-
.BYTE	0,0,0,1,0,0			;.
.BYTE	0,2,4,8,010H,020H		;/
.BYTE	0,03EH,045H,049H,0051H,03EH	;0
.BYTE	0,0,021H,07FH,1,0		;1
.BYTE	0,023H,045H,049H,049H,031H	;2
.BYTE	0,042H,041H,049H,059H,066H	;3
.BYTE	0,0CH,014H,024H,07FH,04H	;4
.BYTE	0,072H,051H,051H,051H,04EH	;5
.BYTE	0,01EH,029H,049H,049h,046H	;6
.BYTE	0,040H,047H,048H,050H,060H	;7
.BYTE	0,036H,049H,049H,049H,036H	;8
.BYTE	0,031H,049H,049H,04AH,03CH	;9
.BYTE	0,0,0,014H,0,0			;:
.BYTE	0,0,1,016H,0,0			;;
.BYTE	0,8,014H,022H,041H,0		;<
.BYTE	0,014H,014H,014H,014H,014H	;=
.BYTE	0,0,041H,022H,014H,08H		;>
.BYTE	0,020H,040H,04DH,050H,020H	;?
.BYTE	0,03EH,041H,05DH,04DH,039H	;@
.BYTE	0,01FH,024H,044H,024H,01FH	;A
.BYTE	0,07FH,049H,049H,049H,036H	;B
.BYTE	0,03EH,041H,041H,041H,022H	;C
.BYTE	0,07FH,041H,041H,041H,03EH	;D
.BYTE	0,07FH,049H,049H,049H,041H	;E
.BYTE	0,07FH,048H,048H,048H,040H	;F
.BYTE	0,03EH,041H,041H,045H,027H	;G
.BYTE	0,07FH,08H,08H,08H,07FH		;H
.BYTE	0,0,041H,07FH,041H,0		;I

TABELLE2:
	LAID
	RET

;************************************************
;*		Tabelle 3			*
;************************************************
.=0500

.BYTE	0,2,1,1,1,07EH			;J
.BYTE	0,07FH,8,014H,022H,041H		;K
.BYTE	0,07FH,1,1,1,1			;L
.BYTE	0,07FH,020H,018H,020H,07FH	;M
.BYTE	0,07FH,010H,8,4,07FH		;N
.BYTE	0,03EH,041H,041H,041H,03EH	;O
.BYTE	0,07FH,048H,048H,048H,030H	;P
.BYTE	0,03EH,041H,045H,042H,03DH	;Q
.BYTE	0,07FH,048H,04CH,04AH,031H	;R
.BYTE	0,032H,049H,049H,049H,026H	;S
.BYTE	0,040H,040H,07FH,040H,040H	;T
.BYTE	0,07EH,1,1,1,07EH		;U
.BYTE	0,07CH,2,1,2,07CH		;V
.BYTE	0,07FH,2,0CH,2,07FH		;W
.BYTE	0,063H,014H,8,014H,063H		;X
.BYTE	0,060H,010H,0FH,010H,060H	;Y
.BYTE	0,043H,045H,049H,051H,061H	;Z
.BYTE	0,07FH,07FH,041H,041H,041H	;[
.BYTE	0,020H,010H,8,4,2		;\
.BYTE	0,041H,041H,041H,07FH,07FH	;]
.BYTE	0,4,8,010H,8,4			;^
.BYTE	0,1,1,1,1,1			;-
.BYTE	0,000H,040H,020H,010H,000H	;`
.BYTE	0,02H,015H,015H,015H,00FH	;a
.BYTE	0,07FH,009H,011H,011H,00EH	;b
.BYTE	0,00EH,011H,011H,011H,002H	;c
.BYTE	0,00EH,011H,011H,009H,07FH	;d
.BYTE	0,00EH,015H,015H,015H,00CH	;e
.BYTE	0,008H,03FH,048H,040H,020H	;f
.BYTE	0,018H,025H,025H,025H,03EH	;g
.BYTE	0,07FH,008H,010H,010H,00FH	;h
.BYTE	0,000H,011H,05FH,001H,000H	;i
.BYTE	0,002H,001H,011H,05EH,000H	;j
.BYTE	0,07FH,004H,00AH,011H,000H	;k
.BYTE	0,000H,041H,07FH,001H,000H	;l
.BYTE	0,01FH,010H,00CH,010H,00FH	;m
.BYTE	0,01FH,008H,010H,010H,00FH	;n
.BYTE	0,00EH,011H,011H,011H,00EH	;o
.BYTE	0,01FH,014H,014H,014H,008H	;p
.BYTE	0,008H,014H,014H,00CH,01FH	;q
.BYTE	0,01FH,008H,010H,010H,008H	;r
.BYTE	0,009H,015H,015H,015H,002H	;s

TABELLE3:
	LAID
	RET

;************************************************
;*		Tabelle 4			*
;************************************************
.=0600

.BYTE	0,010H,07EH,011H,001H,002H	;t
.BYTE	0,01EH,001H,001H,002H,01FH	;u
.BYTE	0,01CH,002H,001H,002H,01CH	;v
.BYTE	0,01EH,001H,006H,001H,01EH	;w
.BYTE	0,011H,00AH,004H,00AH,011H	;x
.BYTE	0,018H,005H,005H,005H,01EH	;y
.BYTE	0,011H,013H,015H,019H,011H	;z
.BYTE	0,000H,008H,036H,041H,000H	;{
.BYTE	0,000H,000H,07FH,000H,000H	;|
.BYTE	0,000H,041H,036H,008H,000H	;}

.BYTE	0,02H,055H,015H,055H,00FH	;„
.BYTE	0,01EH,041H,001H,042H,01FH	;
.BYTE	0,00EH,051H,011H,051H,00EH	;”
.BYTE	0,0FFH,0FFH,0FFH,0FFH,0FFH	;2.Cursor
.BYTE	0,0,08H,070H,0,0		;'
.BYTE	0,03FH,052H,052H,052H,02CH	;á
.BYTE	0,01EH,041H,001H,041H,01EH	;š
.BYTE	0,0FH,054H,024H,054H,0FH	;Ž

TABELLE4:
	LAID
	RET

.=0700
;************************************************
;*		Laufschrift			*
;************************************************
;Ende mit ~ markieren!

.BYTE '*** --> Dies ist ein Beispiel fuer Ihren Werbetext. <---  Wie man sieht, ziehen Laufschriften Blicke auf sich! ........Entwickelt von WOHLRABE Lichtsysteme........ *** ~'

HOLE_ADRESSE:
	IFBIT	5,STATUS	;IF Bit Ramausgabe(5),Status
	JP	HO1		;
	JP	HO2		;
HO1:	JSR	EEPROMLESEN	;THEN CALL 'Eepromlesen'
	RET			;
HO2:	LAID			;ELSE Rom auslesen
	RET			;ENDIF


;************************************************
;*	Z„hlen der Zeiten			*
;************************************************

ZEIT:	IFBIT	1,UHRSTATUS	;IF NOT Bit Uhrzeit stellen(1),Uhrstatus
	JP	EXITE		;	
	LD      A,SECONDS_LO    ;THEN Uhrzeit = Uhrzeit + 1
	ADD     A,#1            ;
	X       A,SECONDS_LO    ;
	IFEQ    A,#9            ;
	JP      TI2             ;
	JP      EXIT            ;
TI2:    LD      SECONDS_LO,#0   ;
	LD      A,SECONDS_HI    ;
	ADD     A,#1            ;
	X       A,SECONDS_HI    ;
	IFEQ    A,#5            ;
	JP      TI3             ;
	JP      EXIT            ;
TI3:    LD      SECONDS_HI,#0   ;
	LD      A,MINUTES_LO    ;
	ADD     A,#1            ;
	X       A,MINUTES_LO    ;
	IFEQ    A,#9            ;
	JP      TI4             ;
	JP      EXIT            ;
TI4:    LD      MINUTES_LO,#0   ;
	LD      A,MINUTES_HI    ;
	ADD     A,#1            ;
	X       A,MINUTES_HI    ;
	IFEQ    A,#5            ;
	JP      TI5             ;
	JP      EXIT            ;
TI5:    LD      MINUTES_HI,#0   ;
	LD      A,HOURS_LO      ;
	ADD     A,#1            ;
	X       A,HOURS_LO      ;
	IFEQ    A,#9            ;
	JP      TI6             ;
	IFEQ    A,#3            ;
	JP      TI7             ;
	JP      EXIT            ;
TI7:    LD      A,HOURS_HI      ;
	IFEQ    A,#2            ;
	JP      TI8             ;
	JP      EXIT            ;
TI8:    LD      HOURS_LO,#0     ;
	LD      HOURS_HI,#0     ;
	JP      EXIT            ;
TI6:    LD      HOURS_LO,#0     ;
	LD      A,HOURS_HI      ;
	ADD     A,#1            ;
	X       A,HOURS_HI      ;
EXIT:	IFBIT	2,UHRSTATUS	;IF NOT Bit 'Nur Uhrzeit'(2),Uhrstatus
	JP	EXITE		;
	IFBIT	0,UHRSTATUS	;THEN IF Bit 'Uhrzeit darstellen'(0),Uhrstatus
	JP	EXE1		;
	JP	EXITE		;
EXE1:	IFBIT	1,UHRSTATUS	;     THEN IF NOT BIT Uhrzeitstellen(1),Uhrstatus
	JP	EXITE		;
 	LD	A,UHRZAEHLER	;          THEN Uhrzaehler = Uhrzaehler + 1
	ADD	A,#1		;
	X	A,UHRZAEHLER	;
	IFEQ	A,#15		;               IF Uhrzaehler = 15
	JP	EXE2		;
	JP	EXITE		;
EXE2:	RBIT	0,UHRSTATUS	;               THEN RBIT 'Uhrzeit darstellen'(0),Uhrstatus
				;               ENDIF
				;          ENDIF
				;     ENDIF
EXITE:	RET                     ;ENDIF

;************************************************
;*		ASCII-Zeichentabelle		*
;************************************************

.=0900
ASCIITAB:
	LAID
	RET
.=0902
.BYTE	'-',0,0,0,0,0,0,0,0,0,0,0,0,0
.BYTE	0,0,0,'<',0,'q','1',0,0,0,'y','s','a','w','2',0
.BYTE	0,'c','x','d','e','4','3',0,0,' ','v','f','t','r','5',0
.BYTE	0,'n','b','h','g','z','6',0,0,0,'m','j','u','7','8',0
.BYTE	0,',','k','i','o','0','9',0,0,'.','-','l',080H,'p',083H,0
.BYTE	0,0,07EH,'#',07FH,0,0,0,0,0,0,'+',0,0,0,0
.BYTE	0,0,0,0,0,0,0,0,0,'1',0,'4','7',0,0,0
.BYTE	'0',0,'2','5','6','8','/',0,0,0,'3',0,'+','9','*',0
.BYTE	'-',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.BYTE	0,0,0,'>',0,'Q','!',0,0,0,'Y','S','A','W','"',0
.BYTE	0,'C','X','D','E','$',0,0,0,' ','V','F','T','R','%',0
.BYTE	0,'N','B','H','G','Z','&',0,0,0,'M','J','U','/','(',0
.BYTE	0,';','K','I','O','=',')',0,0,':','_','L',0,'P','?',0
.BYTE	0,0,085H,082H,084H,'`',0,0,0,0,0,'*',0,0,0,0
.BYTE	0,0,0,0,0,0,0,0,0,'1',0,'4','7',0,0,0
.BYTE	'0',0,'2','5','6','8',0,0,0,0,'3',0,'+','9','*',0

;************************************************
;*		Tastaturwert darstellen		*
;************************************************

DISPZEICHEN:
	IFBIT	1,UHRSTATUS	;IF BIT Uhrzeitstellen(1),Uhrstatus	
	JP	DISP9		;
	JP	DISP10		;
DISP9:	LD	A,TASTE		;THEN Maskiere Higher Nibble(wegen ASCI-Code der Zahlen)
	AND	A,#0FH		;
	IFGT	A,#9		;
	JP	DIEE		;
	X	A,TASTE		;
	LD	A,ZEITPOINTER	;     IF Zeitpointer = 0
	IFEQ	A,#0		;
	JP	DISP1A		;
	JP	DISP11		;
DISP1A:	LD	A,TASTE		;     THEN Hours_Hi = Tastenwert
	X	A,HOURS_HI	;
	LD	POSZEIGER,#47	;          Poszeiger = 47
	JP	DISPPE		;
DISP11:	IFEQ	A,#1		;     ELSE IF Zeitpointer = 1
	JP	DISP12		;
	JP	DISP13		;
DISP12:	LD	A,TASTE		;          THEN Hours_Lo = Tastenwert
	X	A,HOURS_LO	;
	LD	POSZEIGER,#35	;               Poszeiger = 35
	JP	DISPPE		;
DISP13:	IFEQ	A,#2		;          ELSE IF Zeitpointer = 2
	JP	DISP14		;
	JP	DISP15		;
DISP14:	LD	A,TASTE		;               THEN Minutes_Hi = Tastenwert
	X	A,MINUTES_HI	;
	LD	POSZEIGER,#29	;                    Poszeiger = 29
	LD	SECONDS_LO,#0	;                    Sekunden = 0
	LD	SECONDS_HI,#0	;
	JP	DISPPE		;
DISP15:	LD	A,TASTE		;               ELSE Minutes_Lo = Tastenwert
	X	A,MINUTES_LO	;
	LD	POSZEIGER,#53	;                    Poszeiger = 53
	LD	ZEITPOINTER,#0	;                    Zeitpointer = 0
	LD	SECONDS_LO,#0	;                    Sekunden = 0
	LD	SECONDS_HI,#0	;
DISPPE:	LD	A,ZEITPOINTER	;
	ADD	A,#1		;
	IFEQ	A,#4		;
	LD	A,#0		;
	X	A,ZEITPOINTER	;
	JP	DIEE
DISP10:	IFBIT	2,TASTSTATUS	;ELSE IF Bit L”schen(2),Taststatus
	JP	DISP7		;
	JP	DISP8		;
DISP7:	RBIT	2,TASTSTATUS	;     THEN RBIT L”schen(2),Taststatus
	LD	A,POSZEIGER	;     
	IFEQ	A,#55		;          IF Poszeiger # 55
	JP	DIEE		;
	LD	TASTE,#0	;          THEN 'Taste' = 0 fr Blankdarstellung
	X	A,B		;
	LD	A,TASTE		;
	JSR	XLA2		;               CALL 'Xla2'
	X	A,B		;
	ADD	A,#12		;               Poszeiger = Poszeiger + 12 (Zeichen + Cursor l”schen)
	X	A,POSZEIGER	;
	JSR	ADRESSEMINUS	;               CALL 'Adresseminus'
	JSR	EEWRITE		;               CALL 'Eewrite'
	JSR	LESE6ZEICHEN	;               CALL 'Lese6zeichen'
	JP	DISPE		;          ENDIF
DISP8:	LD	A,POSZEIGER	;     ELSE Poszeiger zeigt auf Position der Stelle, wo
				;          das Zeichen dargestellt werden soll
	X	A,B		;
	LD	A,TASTE		;
	JSR	XLA2		;
	X	A,B		;
	IFEQ	A,#013H		;          IF Anzeigeende erreicht
	JP	DISP2		;
	JP	DISP3		;
DISP2:	LD	A,ADRESSELOW	;         THEN IF Adresse # 512
	IFEQ	A,#0FFH		;
	JP	DP1		;
	JSR	SCHIEBELINKS	;              THEN CALL 'Schiebelinks'
	JP	DSP		;
DP1:	LD	A,ADRESSEHIGH	;
	IFEQ	A,#1		;
	JP	DSP		;
	JSR	SCHIEBELINKS	;              ENDIF
DSP:				;              Zeichen immer an letzter Stelle darstellen
	LD	A,#BUF15	;         ENDIF
				;
DISP3:	X	A,POSZEIGER	;
	JSR	EEWRITE		;         CALL 'Eewrite'
	JSR	ADRESSEPLUS	;         CALL 'Adresseplus'
				;     ENDIF
DISPE:	JSR	CURSOR		;CALL 'Cursor'
DIEE:	RET

;************************************************
;*	Schiebe alle Zeichen eins nach links	*
;************************************************

SCHIEBELINKS:
	LD	BITZAEHLER,#6	;
SCHI2:	LD	ZAEHLER,#46	;
	LD	X,#BUFFER_HI	;
	LD	B,#BUFFER_END	;
SCHI1:	LD	A,[X-]		;
	X	A,[B-]		;
	DRSZ	ZAEHLER		;
	JP	SCHI1		;
	DRSZ	BITZAEHLER	;
	JP	SCHI2		;
	RET

;************************************************
;*		Infrarotsignal auswerten	*
;************************************************

AUSWERTUNG:
	LD      PARYZAEHLER,#0  ;Parityberprfung:
	LD      OUTZAEHLER,#8   ;
	LD      B,#BACKUP       ;
	LD      A,DATACODE      ;
	X       A,[B]           ;
PA2:    DRSZ    OUTZAEHLER      ;
	JP      PA3             ;
	JP      PA4             ;
PA3:    LD      A,BACKUP        ;
	RC                      ;
	RRC     A               ;
	X       A,BACKUP        ;
	IFNC                    ;
	JP      PA2             ;       
	LD      A,PARYZAEHLER   ;
	ADD     A,#1            ;
	LD      B,#PARYZAEHLER  ;
	X       A,[B]           ;
	JP      PA2             ;
PA4:    IFBIT   0,PARYZAEHLER   ;IF Paryzaehler = ungerade
	JP      PA5             ;
	JP      PA6             ;
PA5:    IFBIT   7,DATACODE      ;THEN IF NOT Bit 7,Datacode (Paritybit!)
	JP      OK              ;     THEN RET
	RET                     ;     ENDIF
PA6:    IFBIT   7,DATACODE      ;ELSE IF Bit 7,Datacode (Paritybit!)
	RET                     ;     THEN RET
				;     ENDIF
				;ENDIF
OK:	LD	A,DATACODE	;'Taste' = 'Datacode'
	AND	A,#B'01111111	;
	X	A,TASTE		;
	LD	A,TASTE		;
	IFGT	A,#1		;IF Taste > 1
	JP	TAS2		;
	JP	TASE		;
TAS2:	IFEQ	A,#08H		;THEN IF Taste 'ESC'
	JP	ESC		;
	JP	NOESC		;
ESC:	LD	ADRESSELOW,#2	;     THEN Adresse = 2
	LD	ADRESSEHIGH,#0	;
	JSR	LOESCH_BUF	;          CALL 'Loesch_Buf'
	RBIT	1,UHRSTATUS	;          RBIT Uhrzeitstellen(1),Uhrstatus
	RBIT	2,STATUS	;          RBIT Rotstop(2),Status
	JP	TASE		;     
NOESC:	IFEQ	A,#07H		;     ELSE IF Taste 'F1'
	JP	F10		;
	JP	TS2		;
F10:	SBIT	1,UHRSTATUS	;     THEN SBIT Uhrzeitstellen(1),Uhrstatus
	SBIT	0,UHRSTATUS	;          SBIT 'Uhrzeit darstellen'(0),Uhrstatus
	RBIT	3,UHRSTATUS	;          RBIT 'Nur Laufschrift'(3),Uhrstatus
	LD	ZEITPOINTER,#0	;          Zeitpointer = 0
	SBIT	2,STATUS	;          SBIT Rotstop(2),Status
	JSR	LOESCH_BUF	;          CALL 'Loesch_Buf'
	LD	POSZEIGER,#53	;          Poszeiger = 53
	JP	TASE		;
TS2:	IFEQ	A,#017H		;     ELSE IF Taste 'F3'
	JP	F4		;
	JP	NOF4		;
F4:	IFBIT	2,STATUS	;          THEN IF NOT Bit Rotstop(2),Status
	JP	TASE		;
	LD	ADRESSELOW,#2	;	   THEN Adresse = 2
	LD	ADRESSEHIGH,#0	;
	JSR	LOESCH_BUF	;               CALL 'Loesch_Buf'
	IFBIT	3,UHRSTATUS	;               IF Bit 'Nur Laufschrift'(3),Uhrstatus
	JP	UHREIN		;
	JP	UHRAUS		;
UHREIN:	RBIT	3,UHRSTATUS	;               THEN RBIT 'Nur Laufschrift'(3),Uhrstatus
	JP	TASE		;
UHRAUS:	SBIT	3,UHRSTATUS	;               ELSE SBIT 'Nur Laufschrift'(3),Uhrstatus
	RBIT	0,UHRSTATUS	;                    RBIT 'Uhrzeit darstellen'(0),Uhrstatus
	RBIT	1,UHRSTATUS	;                    RBIT Uhrzeitstellen(1),Uhrstatus
	RBIT	2,UHRSTATUS	;                    RBIT 'Nur Uhrzeit'(2),Uhrstatus	
	JP	TASE		;               ENDIF
NOF4:	IFEQ	A,#01FH		;          ELSE IF Taste 'F4'
	JP	F5		;
	JP	NOF5		;
F5:	IFBIT	2,STATUS	;          THEN IF NOT Bit Rotstop(2),Status
	JP	LAUFAUS		;
	IFBIT	2,UHRSTATUS	;               THEN IF NOT Bit 'Nur Uhrzeit'(2),Uhrstatus
	JP	LAUFAUS		;
	SBIT	2,UHRSTATUS	;                    THEN SBIT 'Nur Uhrzeit'(2),Uhrstatus
	SBIT	0,UHRSTATUS	;                         SBIT 'Uhrzeit darstellen'(0),Uhrstatus
	RBIT	3,UHRSTATUS	;                         RBIT 'Nur Laufschrift'(3),Uhrstatus
	LD	ZEITPOINTER,#0	;                         Zeitpointer = 0
	SBIT	2,STATUS	;                         SBIT Rotstop(2),Status
	JSR	LOESCH_BUF	;                         CALL 'Loesch_Buf'
	LD	POSZEIGER,#53	;                         Poszeiger = 53
	JP	TASE		;
LAUFAUS:RBIT	2,UHRSTATUS	;                    ELSE RBIT 'Nur Uhrzeit'(2),Uhrstatus
	RBIT	0,UHRSTATUS	;                         RBIT 'Uhrzeit darstellen'(0),Uhrstatus
	RBIT	2,STATUS	;                         RBIT Rotstop(2),Status
	LD	ADRESSELOW,#2	;		          Adresse = 2
	LD	ADRESSEHIGH,#0	;
	JP	TASE		;                    ENDIF
				;               ENDIF
NOF5:	IFBIT	2,STATUS	;          ELSE IF NOT Bit Rotstop(2),Status
	JP	TAS11		;
	IFEQ	A,#0FH		;               THEN IF Taste 'F2'
	JP	TAS12		;
	JP	TASE		;
TAS12:	SBIT	2,STATUS	;                    THEN SBIT Rotstop(2),Status
	RBIT	0,UHRSTATUS	;                         RBIT 'Uhrzeit darstellen'(0),Uhrstatus
	RBIT	1,UHRSTATUS	;                         RBIT Uhrzeitstellen(1),Uhrstatus
	LD	RAMZEIGER,#70	;                         Ramzeiger = 70
	LD	ADRESSELOW,#2	;                         Eepromadresse = 2
	LD	ADRESSEHIGH,#0	;
	LD	ZEICHENZAEHLER,#0;                        Zeichenzaehler = 0
	LD	BUFFERZEIGER,#55;                         Bufferzeiger = 55
	LD	POSZEIGER,#55	;                         Poszeiger = 55
	JSR	LOESCH_BUF	;                         CALL 'Loesch_Buf'
	JSR	CURSOR		;                         CALL 'Cursor'
	JP	TASE		;                    ENDIF
TAS11:	IFEQ	A,#066H		;               ELSE IF Taste 'Backspace'
	JP	TAS15		;
	JP	TAS16		;
TAS15:	SBIT	2,TASTSTATUS	;                    THEN SBIT L”schen(2),Taststatus
				;                    ENDIF
TAS16:	IFEQ	A,#05AH		;                    IF Taste 'Return'
	JP	TAS9		;
	JP	TAS10		;
TAS9:	RBIT	2,STATUS	;                    THEN RBIT Rotstop(2),Status
	LD	UHRZAEHLER,#0	;                         Uhrzaehler = 0
	IFBIT	1,UHRSTATUS	;                         IF BIT Uhrzeitstellen(1),Uhrstatus
	JP	TAS9A		;
	JP	TAS9B		;
TAS9A:	RBIT	1,UHRSTATUS	;                         THEN RBIT Uhrzeitstellen(1),Uhrstatus
	JP	TASE		;
TAS9B:	LD	A,ADRESSELOW	;                         ELSE IF Adresse > 1 (Es wurde schon ein Buchstabe eingegeben)
	IFGT	A,#1		;
	JP	RAMOUT		;
	LD	A,ADRESSEHIGH	;
	IFGT	A,#0		;
	JP	RAMOUT		;
	JP	ROMOUT		;
RAMOUT:	SBIT	5,STATUS	;                              THEN SBIT Ramausgabe(5),Status
	JP	OU		;                              
ROMOUT:	RBIT	5,STATUS	;                              ELSE RBIT Ramausgabe(5),Status
				;                              ENDIF
OU:	LD	A,ADRESSELOW	;                              Maxadresse = Adresse
	X	A,MAXADRLOW	;
	LD	A,ADRESSEHIGH	;
	X	A,MAXADRHIGH	;
	LD	A,ADRESSELOW	;                              Maxadresse abspeichern
	X	A,TASTE		;
	RBIT	3,STATUS	;                              RBIT Bufshift(3),Status
	RBIT	4,STATUS	;                              RBIT Shifttaste(4),Status
	LD	ZEICHENZAEHLER,#0;                             Zeichenzaehler = 0
	LD	ADRESSELOW,#0	;                              
	LD	ADRESSEHIGH,#0	;
	JSR	EEWRITE		;                              Maxadresse im Eeprom auf
				;                              Adresse 0 und 1 abspeichern
	LD	A,ADRESSEHIGH	;
	X	A,TASTE		;
	LD	ADRESSELOW,#1	;
	JSR	EEWRITE		;
	LD	ADRESSELOW,#2	;		               Adresse = 2
	JP	TASE		;                         ENDIF
TAS10:	IFGT	A,#07FH		;                    ELSE IF Tastencode < 080H
	JP	TASE		;
	IFEQ	A,#059H		;                         THEN IF Shifttasten gedrckt
	JP	TAS3		;
	IFEQ	A,#012H		;
	JP	TAS3		;
	JP	TAS4		;
TAS3:	IFBIT	0,UHRSTATUS	;                              THEN IF NOT Bit 'Uhrzeit darstellen'(0),Uhrstatus
	JP	TASE		;
	IFBIT	4,STATUS	;
	JP	TAS5		;
	JP	TAS6		;
TAS5:	RBIT	4,STATUS	;                                   THEN Toggle Bit Shifttaste(4),Status
	JSR	CURSOR		;                                        CALL 'Cursor'
	JP	TASE		;                                        RET
TAS6:	SBIT	4,STATUS	;
	JSR	CURSOR		;          
	JP	TASE		;                                   ENDIF
				;                              ENDIF
TAS4:	IFBIT	2,TASTSTATUS	;                              IF Bit L”schen(2),Taststatus
	JP	TAS7		;
	JP	TAS8		;
TAS7:	JSR	DISPZEICHEN	;                              THEN CALL 'Dispzeichen'
	JP	TASE		;
TAS8:	IFBIT	4,STATUS	;                              ELSE IF Bit Shifttaste(4),Status
	JP	T1A		;
	JP	T2A		;
T1A:	IFEQ	A,#04CH		;                                   THEN IF Tastencode # 04CH
	JP	T2A		;      
	ADD	A,#080H		;                                        THEN Addiere Tabellenoffset fr Groábuchstaben
				;                                        ENDIF
T2A:	JSR	ASCIITAB	;                                        CALL 'Asciitab'
	IFEQ	A,#0		;                                        IF Tabellenwert # 0
	JP	TASE		;
	X	A,TASTE		;
	JSR	DISPZEICHEN	;                                        THEN CALL 'Dispzeichen'
				;                                        ENDIF
				;                                   ENDIF
				;                              ENDIF
				;                         ENDIF
				;                    ENDIF
				;               ENDIF
				;          ENDIF
				;     ENDIF
				;ENDIF
TASE:	RBIT	7,TASTSTATUS	;RBIT Info(7),Taststatus
	RBIT	6,STATUS	;RBIT Abholen(6),Status
TASO:	RET

;************************************************
;*	Tastenwert aus dem EEPROM auslesen	*
;************************************************

EEPROMLESEN:
	JSR	EEREAD		;CALL 'Eeread'
	LD	A,MAXADRHIGH	;
	IFEQ	A,#0
	JP	P1
	JP	P2
P1:	LD	A,MAXADRLOW
	IFEQ	A,#2
	JP	PROM1
P2:	JSR	ADRESSEPLUS	;
	LD	A,ADRESSELOW
	IFEQ	A,MAXADRLOW
	JP	PRO1
	JP	PROM2
PRO1:	LD	A,ADRESSEHIGH
	IFEQ	A,MAXADRHIGH
	JP	PROM1
	JP	PROM2
PROM1:	LD	ADRESSELOW,#2
	LD	ADRESSEHIGH,#0
	SBIT	7,STATUS	;THEN SBIT ROM_Ende(7),Status
	LD	ZEICHENZAEHLER,#0;    Zeichenzaehler = 0
PROM2:	LD	A,DATABYTE
	RET

;************************************************
;*		Darstellung des Cursors		*
;************************************************

CURSOR:	LD	A,POSZEIGER	;
	X	A,B		;
	IFBIT	4,STATUS	;IF Bit Shifttaste(4),Status
	JP	CR1		;
	JP	CR2		;
CR1:	LD	A,#081H		;THEN Stelle 2.Cursor dar
	JP	CR3		;
CR2:	LD	A,#'_'		;ELSE Stelle 1.Cursor dar
				;ENDIF
CR3:	JSR	XLA2		;
	X	A,B		;
	ADD	A,#6		;
	X	A,POSZEIGER	;
	RET			;        

;************************************************
;*	Adresse um eins hochzaehlen		*
;************************************************

ADRESSEPLUS:
	RC
	LD	A,ADRESSELOW	;Adresse = Adresse + 1
	ADC	A,#1		;
	X	A,ADRESSELOW	;
	LD	A,ADRESSEHIGH	;
	ADC	A,#0		;
	X	A,ADRESSEHIGH	;
	LD	A,ADRESSEHIGH	;
	IFEQ	A,#2		;
	JP	PLU1		;
	JP	PLU2		;
PLU1:	LD	ADRESSEHIGH,#1	;IF Adresse > Maxadresse
	LD	ADRESSELOW,#0FFH;THEN Adresse = Maxadresse
				;ENDIF
PLU2:	RET			;

;************************************************
;*	Adresse um eins herunterzaehlen		*
;************************************************

ADRESSEMINUS:
	LD	A,ADRESSELOW	;Adresse = Adresse - 1
	ADD	A,#0FFH		;
	IFEQ	A,#0FFH		;
	JP	MINU1		;
	JP	MINU2		;
MINU1:	LD	ADRESSELOW,#0FFH;
	LD	A,ADRESSEHIGH	;
	ADD	A,#0FFH		;
	X	A,ADRESSEHIGH	;
	RET
MINU2:	IFEQ	A,#1		;
	JP	MINU5		;
	X	A,ADRESSELOW	;
	RET			;
MINU5:	X	A,ADRESSELOW	;
	LD	A,ADRESSEHIGH	;
	IFEQ	A,#0		;
	LD	ADRESSELOW,#2	;
	RET			;

;********************************************************
;                                                       *
;               EEPROM - ROUTINEN                       *
;                                                       *
;********************************************************

;  SNDBUF = 0         ;CONTAINES THE COMMAND BYTE TO BE WRITTEN TO NMC9306
;  RDATL  = 1         ;LOWER BYTE OF THE NMC9306 REGISTER DATA READ
;  RDATH  = 2         ;UPPER BYTE OF //   //     //       //  //
;  WDATL  = 3         ;LOWER BYTE OF THE DATA TO BE WRITTEN TO NMC9306 REG.
; WDATH  = 4         ;UPPER BYTE OF  //  //  //  //  //    //  //    //
; ADRESS  = 5         ;THE LOWER 4-BITS OF THE LOCATION CONTAIN THE ADRESS
		     ;OF THE COP 494 REGISTERS TO BE READ/WRITTEN
; FLAGS   = 6         ;USED FOR SETTING UP FLAGS
		     ;
		     ;FLAG VALUE          ACTION
		     ; 00                 ERASE,ENABLE,DISABLE,ERASE ALL
		     ; 01                 READ CONTENTS OF NMC9306 REGISTER
		     ; 03                 WRITE TO NMC9306 REGISTER
		     ; OTHERS             ILLEGAL COMBINATION
; DLYH    =  0F0
; DLYL    =  0F1
;
;THE INTERFACE BETWEEN THE COP820C/840C AND THE COP 494 (256-BIT EEPROM)
;CONSISTS OF FOUR LINES.THE G2(CHIP SELECT LINE),G4(SERIAL OUT SO),
;G5(SERIAL CLOCK SK )AND G6 (SERIAL IN SI ).
;############################################################################
;
;INITIALIZATION
;
INITEEPROM:
	LD      B,#PSW
	LD      X,#SIOR
	RET

;THIS RUOTINE READS THE CONTENTS OF THE NMC9306 REGISTER.THE NMC9306
;ADDRESS IS SPECIFID IN THE LOWER NIBBLE OF LOCATION "ADDRESS".THE UPPER
;NIBBBLE SHOULD BE SET TO ZERO.THE 16-BIT CONTENTS OF NMC9306 REGISTER ARE
;STORED IN RDATL AND RDATH.
;
READ:   LD      A,ADRESSELOW
	X       A,SNDBUF
	LD      FLAGS,#01
	JSR     INIT
	RET
;
;THIS ROTINE SENDS OUT THE START BIT AND COMMAND BYTE.IT ALSO
;DECIPHERS THE CONTENTS OF THE ;FLAG LOCATION AND TAKES A DECISION
;REGARDING WRITE,READ OR RETURN TO THE CALLING RUOTINE.
;
INITWRITE:
	SBIT	4,PORTGC	;G4 als Ausgang Low
	RBIT	4,PORTGD	;
	SBIT    7,PORTLD        ;SET CHIP SELECT HIGH
	SBIT	4,PORTGD	;Startbit
	SBIT	5,PORTGD	;1x Clock
	RBIT	5,PORTGD	;
	RBIT	4,PORTGD	;
	SBIT	5,PORTGD	;1.Bit des Write-Befehls = 0
	RBIT	5,PORTGD	;1x Clock
	SBIT	4,PORTGD	;2.Bit des Write-Befehls = 1
	SBIT	5,PORTGD	;1x Clock
	RBIT	5,PORTGD	;
	IFBIT	0,ADRESSEHIGH	;IF Bit 0,Adresshigh
	JP	IT1		;THEN Eins ausgeben
	RBIT	4,PORTGD	;ELSE Null ausgeben
				;ENDIF
IT1:	SBIT	5,PORTGD	;1x Clock
	RBIT	5,PORTGD	;
	RBIT	4,PORTGD	;
	LD	A,ADRESSELOW	;
	X       A,SIOR		;
	RBIT	BUSY,PSW	;
	SBIT	MSEL,CNTRL	;Enable Microwire
	SBIT	BUSY,PSW	;
PUN1:	IFBIT	BUSY,PSW
	JP	PUN1
	LD	A,DATABYTE
	X	A,SIOR
	SBIT	BUSY,PSW
PUN2:	IFBIT	BUSY,PSW
	JP	PUN2
	RBIT	7,PORTLD
	RBIT	MSEL,CNTRL
	SBIT	7,PORTLD
	JSR	TOUT
	RBIT	7,PORTLD
	RET



	RBIT    7,PORTLD
	NOP
	SBIT	7,PORTLD
	NOP
;	SBIT	5,PORTGD
	NOP
WARTENH:IFBIT	6,PORTGP
	JP	WARTENL
	JP	WARTENH
WARTENL:RBIT	7,PORTLD
	RBIT	MSEL,CNTRL
	RET



INIT:	SBIT	4,PORTGC	;G4 als Ausgang Low
	RBIT	4,PORTGD	;
	SBIT    7,PORTLD        ;SET CHIP SELECT HIGH
	RBIT	BUSY,[B]
	SBIT	MSEL,CNTRL
	LD	A,ADRESSEHIGH
	OR	A,#B'00001100
	X       A,SIOR       ;LOAD SIOR WHITH START BIT
	SBIT    BUSY,[B]        ;SEND OUT THE START BIT
PUNT1: IFBIT    BUSY,[B]
	JP      PUNT1
	LD      A,SNDBUF
	X       A,[X]         ; LOAD SIOR WITH COMMAND BYTE
	SBIT    BUSY,[B]      ; SEND OUT COMMAND BYTE
PUNT2:  IFBIT   BUSY,[B]
	JP      PUNT2
	IFBIT   0,FLAGS         ;ANY FURTHER PROCESSING ?
	JP      NOTDON          ;YES
	RBIT    7,PORTLD        ;NO, RESET CS AND RETURN
	RBIT	MSEL,CNTRL
	RET
;
;               DO EXTRA PROCESSING HERE:
;
NOTDON: IFBIT   1,FLAGS         ;READ OR WRITE ?
	JP      WR494           ;JMP TO WRITE ROUTINE
	IFBIT   2,FLAGS         ;
	JMP     TMOUT
	RBIT	MSEL,CNTRL
;	SBIT	5,PORTGD	;Dummybit nicht auswerten
;	RBIT	5,PORTGD	;
	CLR	A
	LD	EEZAEHLER,#8
ROTATE:	SBIT	5,PORTGD
	NOP
	RBIT	5,PORTGD
	IFBIT	6,PORTGP
	JP	EINS
	JP	NULL
EINS:	SC
	JP	WEITER
NULL:	RC
WEITER:	RRC	A
	DRSZ	EEZAEHLER
	JP	ROTATE
	RBIT    7,PORTLD
HAL0:	LD	DATABYTE,#0
	RRC	A
	IFC
	SBIT	7,DATABYTE
	RRC	A
	IFC
	SBIT	6,DATABYTE
	RRC	A
	IFC
	SBIT	5,DATABYTE
	RRC	A
	IFC
	SBIT	4,DATABYTE
	RRC	A
	IFC
	SBIT	3,DATABYTE
	RRC	A
	IFC
	SBIT	2,DATABYTE
	RRC	A
	IFC
	SBIT	1,DATABYTE
	RRC	A
	IFC
	SBIT	0,DATABYTE
	RET
;
WR494:
	LD      A,DATABYTE
	X       A,[X]
	SBIT    BUSY,[B]
PUNT5:  IFBIT   BUSY,[B]
	JP      PUNT5
	

;************************************************
;*              Verz”gerungsroutine             *
;************************************************

TMOUT:  RBIT    7,PORTLD
TOUT:   LD      BITCOUNT,#012H
WAIT:   LD      EEZAEHLER,#0FFH
WAIT1:  DRSZ    EEZAEHLER
	JP      WAIT1
	DRSZ    BITCOUNT
	JP      WAIT
	RET

;************************************************
;*      EEPROM-Register auslesen                *
;************************************************
;'Adress' zeigt auf das auszulesende Register!

EEREAD:	JSR     INITEEPROM	;
	RBIT	GIE,PSW
	JSR     READ		;
	LD	A,DATABYTE
JOOP:
	SBIT	4,PORTGD	;G4 als Eingang mit Pull up
	RBIT	4,PORTGC	;
	RBIT	MSEL,CNTRL	;
	SBIT	GIE,PSW
	RET

;************************************************
;*      EEPROM-Register beschreiben             *
;************************************************
;'Adress' zeigt auf das zu schreibende Register!

EEWRITE:LD	A,TASTE
	X	A,DATABYTE
	RBIT	GIE,PSW
	JSR	INITEEPROM
	JSR	EWEN
	JSR	INITWRITE
	JSR     EWDS
	SBIT	4,PORTGD	;G4 als Eingang mit Pull up
	RBIT	4,PORTGC	;
	RBIT	MSEL,CNTRL	;
	SBIT	GIE,PSW
	RET

EWDS:	SBIT	4,PORTGC	;G4 als Ausgang Low
	RBIT	4,PORTGD	;
	SBIT    7,PORTLD        ;SET CHIP SELECT HIGH
	RBIT	BUSY,[B]
	LD      SIOR,#8       ;LOAD SIOR WHITH START BIT
	SBIT	MSEL,CNTRL
	SBIT    BUSY,[B]        ;SEND OUT THE START BIT
PT1: IFBIT    BUSY,[B]
	JP      PT1
	LD      SIOR,#B'00000000
	SBIT    BUSY,[B]      ; SEND OUT COMMAND BYTE
PT2:  IFBIT   BUSY,[B]
	JP      PT2
	RBIT    7,PORTLD        ;NO, RESET CS AND RETURN
	RBIT	MSEL,CNTRL
	RET


EWEN:	SBIT	4,PORTGC	;G4 als Ausgang Low
	RBIT	4,PORTGD	;
	SBIT    7,PORTLD        ;SET CHIP SELECT HIGH
	RBIT	BUSY,[B]
	LD      SIOR,#9       ;LOAD SIOR WHITH START BIT
	SBIT	MSEL,CNTRL
	SBIT    BUSY,[B]        ;SEND OUT THE START BIT
PNT1: IFBIT    BUSY,[B]
	JP      PNT1
	LD      SIOR,#B'10000000
	SBIT    BUSY,[B]      ; SEND OUT COMMAND BYTE
PNT2:  IFBIT   BUSY,[B]
	JP      PNT2
	RBIT    7,PORTLD        ;NO, RESET CS AND RETURN
	RBIT	MSEL,CNTRL
	RET


;******************************************************************************
;*      Hier wird der Beginn einer Datenbertragung detektiert
;******************************************************************************
P10:    IFBIT   0,PORTGP        ;IF Pin G0 = 0
	JP      P80             ;
	LD      RECEIVEMODE,#1  ;THEN Receivemode = 1
	LD      TIMERDATA,#0    ;     Timerdata = 0
	JP      P80             ;ENDIF
;******************************************************************************
;Prfen der 6ms Lowphase im Startbit
;******************************************************************************
P20:    IFBIT   0,PORTGP        ;IF Pin G0 = 1
	JP      P201            ;
	JP      P80             ;
P201:	IFBIT	6,REGISTER	;THEN IF NOT Bit Filterbit(6),Register
	JP	P2A		;
	SBIT	6,REGISTER	;     THEN SBIT Filterbit(6),Register
	JP	P80		;
P2A:	RBIT	6,REGISTER	;     ELSE RBIT Filterbit(6),Register
	LD      A,TIMERDATA     ;          IF Timerdata < 4ms
	SC                      ;
	SUBC    A,#10           ;
	IFNC                    ;     
	JP      P70             ;
	SUBC    A,#10           ;          OR Timerdata > 8ms
	IFC                     ;
	JP      P70             ;          THEN ERROR
	LD      RECEIVEMODE,#2  ;          ELSE Receivemode = 2
	LD      TIMERDATA,#1    ;               Timerdata = 1 (wegen Filterbit)
	JP      P80             ;          ENDIF
				;     ENDIF
				;ENDIF
;******************************************************************************
;Prfen der 6ms Highphase im Startbit
;******************************************************************************
P30:    IFBIT   0,PORTGP        ;IF Pin G0 = 0
	JP      P80             ;
	LD      A,TIMERDATA     ;THEN 
	SC                      ;
	SUBC    A,#12           ;
	IFNC                    ;     
	JP      P70             ;     Timerdata < 4,4ms --> ERROR
	SUBC    A,#7            ;vorher 5!!!!
	IFNC                    ;
	JP      P33             ;     Timerdata < 7.6ms --> Prfen 1.Bit
	JP      P70             ;
P33:    LD      RECEIVEMODE,#010H;
P34:    LD      TIMERDATA,#0    ;
	JP      P80             ;

;******************************************************************************
;*      Receive-Mode = 10     Prfen der 1.Lowphase des Codes
;******************************************************************************
P50:    IFBIT   0,PORTGP        ;IF Pin G0 = 1
	JP      P51             ;
	JP      P80             ;
P51:    LD      A,TIMERDATA     ;THEN IF Puls > 0.4ms
	SC                      ;
	SUBC    A,#1            ;
	IFNC                    ;
	JP      P70             ;
	SUBC    A,#6            ;     AND Puls < 2.4ms
	IFC                     ;
	JP      P70             ;
	LD      RECEIVEMODE,#011H;    THEN Receivemode = 011H
	LD      TIMERDATA,#0    ;          Timerdata = 0
	JP      P80             ;     ENDIF
				;ENDIF

;******************************************************************************
;*      Receive-Mode = 11       Prfen der 1.Highphase des Codes
;******************************************************************************
P60:    IFBIT   0,PORTGP        ;IF Pin G0 = 0
	JP      P80             ;
	LD      A,TIMERDATA     ;THEN IF Puls > 0.4ms
	SC                      ;
	SUBC    A,#1            ;
	IFNC                    ;
	JP      P70             ;
	SUBC    A,#4            ;     THEN IF Puls < 1.6ms  vorher 3!!!!!!
	IFNC                    ;
	JP      P61             ;          THEN Carry = 0
	SUBC    A,#2            ;          ELSE IF Puls > 2.8ms
	IFNC                    ;
	JP      P70             ;
	JP      P62             ;               THEN Carry = 1
				;               ENDIF
				;          ENDIF
				;     ENDIF
				;ENDIF
P61:    RC                      ;
	JP      P63             ;
P62:    SC                      ;

;******************************************************************************
;*      Einschreiben der Datenbits
;******************************************************************************
P63:    LD      A,DATACODE      ;Rotate Datacode right through Carry
	RRCA                    ;
	X       A,DATACODE      ;
	LD      TIMERDATA,#0    ;Timerdata = 0
	DRSZ    OUTZAEHLER      ;IF Outzaehler = 0
	JP      P64             ;
	LD      RECEIVEMODE,#020H;THEN Receivemode = 020H
	JP      P80             ;
P64:    LD      RECEIVEMODE,#010H;ELSE Receivemode = 010H
	JP      P80             ;ENDIF

;******************************************************************************
;*      Fehler ist aufgetreten
;******************************************************************************
P70:    LD      RECEIVEMODE,#0FFH;Receivemode = 0FFH
	JP      P80             ;

.=0F00

.BYTE	0EH		;0
.BYTE	014H		;1
.BYTE	01AH		;2
.BYTE	020H		;3
.BYTE	026H		;4
.BYTE	02CH		;5
.BYTE	032H		;6
.BYTE	038H		;7
.BYTE	03EH		;8
.BYTE	044H		;9
.BYTE	04AH		;:
.BYTE	050H		;Blank

ZAHLENTAB:
	LAID
	RET

;************************************************
;*	Tabelle fr 5x7 Matrix (Uhrzeit)	*
;************************************************

.BYTE	0,03EH,045H,049H,0051H,03EH	;0
.BYTE	0,0,021H,07FH,1,0		;1
.BYTE	0,023H,045H,049H,049H,031H	;2
.BYTE	0,042H,041H,049H,059H,066H	;3
.BYTE	0,0CH,014H,024H,07FH,04H	;4
.BYTE	0,072H,051H,051H,051H,04EH	;5
.BYTE	0,01EH,029H,049H,049h,046H	;6
.BYTE	0,040H,047H,048H,050H,060H	;7
.BYTE	0,036H,049H,049H,049H,036H	;8
.BYTE	0,031H,049H,049H,04AH,03CH	;9
.BYTE	0,0,0,014H,0,0			;:
.BYTE	0,0,0,0,0,0			;Blank

MATRIXTAB:
	LAID
	RET

;************************************************
;*	Uhrzeit auf dem Display darstellen	*
;************************************************

UHRZEIT:IFBIT	0,UHRSTATUS	;IF Bit 'Uhrzeit darstellen'(0),Uhrstatus
	JP	UH1		;
	JP	UHE		;
UH1:	LD	A,HOURS_HI	;THEN Stunden darstellen
	LD	B,#BUF43	;
	JSR	ZEITSCHREIBEN	;
	LD	A,HOURS_LO	;
	JSR	ZEITSCHREIBEN	;
	LD	A,ZEITZAEHLER	;    IF Zeitzaehler > 5
	IFGT	A,#5		;
	JP	UH2		;
	JP	UH3		;
UH2:	LD	A,#0BH		;    THEN Blank darstellen
	JP	UH4		;	
UH3:	LD	A,#0AH		;    ELSE Doppelpunkt darstellen
UH4:	JSR	ZEITSCHREIBEN	;
				;    ENDIF
	LD	A,MINUTES_HI	;    Minuten darstellen
	JSR	ZEITSCHREIBEN	;
	LD	A,MINUTES_LO	;
	JSR	ZEITSCHREIBEN	;
	JSR	BLINKI		;    CALL 'Blinki'
UHE:	RET			;ENDIF
	
ZEITSCHREIBEN:
	JSR	ZAHLENTAB	;
	X	A,ZEICHENADRESSE;          Zeichenadresse sichern
	LD	XZAEHLER,#6	;          6 Werte aus Tabelle 3 auslesen
ZLA3:	LD	A,ZEICHENADRESSE;
	JSR	MATRIXTAB	;
	X	A,[B-]		;
	LD	A,ZEICHENADRESSE;
	ADD	A,#1		;
	X	A,ZEICHENADRESSE;
	DRSZ	XZAEHLER	;
	JP	ZLA3		;
	RET			;


;************************************************
;*	Einschreibebuffer mit Null fllen	*
;************************************************

FUELL_NULL:
	LD	B,#BUFFERANFANG	;Buffer mit 0 fllen
	LD	ZAEHLER,#6	;
FUE1:	LD	[B+],#0		;
	DRSZ	ZAEHLER		;
	JP	FUE1		;
	LD	A,NULLZAEHLER	;Nullzaehler = Nullzaehler + 1
	ADD	A,#1		;
	X	A,NULLZAEHLER	;
	IFEQ	A,#7		;IF Nullzaehler = 7
	JP	FUE2		;
	JP	FUE3		;
FUE2:	LD	NULLZAEHLER,#0	;THEN Nullzaehler = 0
	RBIT	7,STATUS	;     RBIT Rom_Ende(7),STATUS
	IFBIT	3,UHRSTATUS	;     IF NOT Bit 'Nur Laufschrift'(3),Uhrstatus
	JP	FUE3		;
	SBIT	0,UHRSTATUS	;     THEN SBIT 'Uhrzeit darstellen'(0),Uhrstatus
	LD	UHRZAEHLER,#0	;          Uhrzaehler = 0
				;     ENDIF
FUE3:	RET			;ENDIF

;************************************************
;*		Zeichen blinken lassen		*
;************************************************

BLINKI:	IFBIT	1,UHRSTATUS	;IF BIT Uhrzeitstellen(1),Uhrstatus
	JP	BLINKI3		;
	JP	BLINKE		;
BLINKI3:LD	A,ZEITZAEHLER	;THEN IF Zeitzaehler > 5
	IFGT	A,#5		;
	JP	BLINKI1		;
	JP	BLINKI2		;
BLINKI1:JSR	CURSOR		;     THEN CALL 'Cursor'
				;     ENDIF
BLINKI2:			;ENDIF
BLINKE:	RET			;

;************************************************
;*	Anzeigebereich loeschen			*
;************************************************

LOESCH_BUF:
	LD	BITZAEHLER,#47	;
	LD	B,#BUFFER_END	;L”sche Anzeigebuffer
TAS13:	LD	[B-],#0		;
	DRSZ	BITZAEHLER	;
	JP	TAS13		;
	RET			;


;************************************************
;*	6 Zeichen aus dem Eeprom auslesen	*
;************************************************

LESE6ZEICHEN:
	LD	A,ADRESSEHIGH	;
	IFEQ	A,#1		;
	JP	LESE1		;
	LD	A,ADRESSELOW	;IF Adresse > 6
	IFGT	A,#6		;
	JP	LESE1		;
	RET			;
LESE1:	LD	A,ADRESSELOW	;
	SC			;THEN Adresse = Adresse - 5
	SUBC	A,#5		;
	X	A,ADRESSELOW	;
	LD	A,ADRESSEHIGH	;
	SUBC	A,#0		;
	LD	ZAEHLER,#5	;     Zaehler = 5
	LD	POSZEIGER,#55	;     Poszeiger = 55
				;     DO LOOP
LESE2:	JSR	EEREAD		;        CALL 'Eeread'
	X	A,TASTE		;        Taste = Ausgelesener Wert 
	JSR	ADRESSEPLUS	;        CALL 'Adresseplus'
	LD	A,POSZEIGER	;        Poszeiger zeigt auf Position der Stelle, wo
				;        das Zeichen dargestellt werden soll
	X	A,B		;
	LD	A,TASTE		;
	JSR	XLA2		;        CALL 'XLa2'
	X	A,B		;
	X	A,POSZEIGER
	DRSZ	ZAEHLER		;        Zaehler = Zaehler - 1
	JP	LESE2		;     UNTIL Zaehler = 0
	RET			;ENDIF

.end LAUFLICHT


