; READSW8.ASM
; READ SWITCHES AT DIGITAL INPUTS 1-8 AND DISPLAY STATUS MESSAGES

OLDIO	EQU	34H		;UNUSED BYTE IN INTERNAL RAM

	ORG	8000H		;MUST ALWAYS BE ORG'ED AT 8000H FOR SBC-1

READSW8:CLR	C		;(C3 HEX) NEEDED ONLY IF USING AUTOBOOT
	MOV	DPTR,#PWRMSG	;POINT TO MESSAGE
	CALL	3FH		;SERIAL STRING OUT ROUTINE IN JUMP TABLE
	CALL	66H		;READ REAL TIME CLOCK ROUTINE IN JUMP TABLE
	MOV	DPTR,#0DFE2H	;POINT TO MONTH IN RAM
	MOVX	A,@DPTR		;GET THE VALUE FROM THE CLOCK
	CALL	TXCLKVAL	;SEND A RTC VALUE TO SERIAL PORT
	MOV	A,#'/'		;SEPARATOR
	CALL	3CH		;SERIAL CHARACTER OUT ROUTINE IN JUMP TABLE
	MOV	DPTR,#0DFE3H	;POINT TO DAY IN RAM
	MOVX	A,@DPTR		;GET THE VALUE FROM THE CLOCK
	CALL	TXCLKVAL	;SEND A RTC VALUE TO SERIAL PORT
	MOV	A,#'/'		;SEPARATOR
	CALL	3CH		;SERIAL CHARACTER OUT ROUTINE IN JUMP TABLE
	MOV	DPTR,#0DFE0H	;POINT TO CENTURY IN RAM
	MOVX	A,@DPTR		;GET THE VALUE FROM THE CLOCK
	CALL	TXCLKVAL	;SEND A RTC VALUE TO SERIAL PORT
	MOV	DPTR,#0DFE1H	;POINT TO YEAR IN RAM
	MOVX	A,@DPTR		;GET THE VALUE FROM THE CLOCK
	CALL	TXCLKVAL	;SEND A RTC VALUE TO SERIAL PORT
	MOV	A,#' '		;SEPARATOR
	CALL	3CH		;SERIAL CHARACTER OUT ROUTINE IN JUMP TABLE
	MOV	DPTR,#0DFE5H	;POINT TO HOUR IN RAM
	MOVX	A,@DPTR		;GET THE VALUE FROM THE CLOCK
	CALL	TXCLKVAL	;SEND A RTC VALUE TO SERIAL PORT
	MOV	A,#':'		;SEPARATOR
	CALL	3CH		;SERIAL CHARACTER OUT ROUTINE IN JUMP TABLE
	MOV	DPTR,#0DFE6H	;POINT TO MINUTE IN RAM
	MOVX	A,@DPTR		;GET THE VALUE FROM THE CLOCK
	CALL	TXCLKVAL	;SEND A RTC VALUE TO SERIAL PORT
	MOV	A,#':'		;SEPARATOR
	CALL	3CH		;SERIAL CHARACTER OUT ROUTINE IN JUMP TABLE
	MOV	DPTR,#0DFE7H	;POINT TO SECOND IN RAM
	MOVX	A,@DPTR		;GET THE VALUE FROM THE CLOCK
	CALL	TXCLKVAL	;SEND A RTC VALUE TO SERIAL PORT
	CALL	42H		;CR/LF OUT ROUTINE IN JUMP TABLE

	MOV	OLDIO,#0	;SET OLD STATUS TO SOMETHING KNOWN

REPEAT:	CALL	4BH		;IOSCAN ROUTINE IN JUMP TABLE
	MOV	A,21H		;21H IS IO1-8
	PUSH	ACC		;SAVE CURRENT
	XRL	A,OLDIO		;EXCLUSIVE OR THE NEW AND OLD TO FIND CHANGES
	MOV	B,A		;USE B SO WE CAN USE ACC FOR OTHER THINGS

IN0:	JNB	B.0,IN1		;SKIP IF THIS BIT HAS NOT CHANGED
	MOV	C,21H.0		;GET STATUS OF INPUT
	MOV	A,#'1'		;DISPLAY ASCII
	CALL	TXMSG		;DISPLAY MESSAGE

IN1:	JNB	B.1,IN2		;SKIP IF THIS BIT HAS NOT CHANGED
	MOV	C,21H.1		;GET STATUS OF INPUT
	MOV	A,#'2'		;DISPLAY ASCII
	CALL	TXMSG		;DISPLAY MESSAGE

IN2:	JNB	B.2,IN3		;SKIP IF THIS BIT HAS NOT CHANGED
	MOV	C,21H.2		;GET STATUS OF INPUT
	MOV	A,#'3'		;DISPLAY ASCII
	CALL	TXMSG		;DISPLAY MESSAGE

IN3:	JNB	B.3,IN4		;SKIP IF THIS BIT HAS NOT CHANGED
	MOV	C,21H.3		;GET STATUS OF INPUT
	MOV	A,#'4'		;DISPLAY ASCII
	CALL	TXMSG		;DISPLAY MESSAGE

IN4:	JNB	B.4,IN5		;SKIP IF THIS BIT HAS NOT CHANGED
	MOV	C,21H.4		;GET STATUS OF INPUT
	MOV	A,#'5'		;DISPLAY ASCII
	CALL	TXMSG		;DISPLAY MESSAGE

IN5:	JNB	B.5,IN6		;SKIP IF THIS BIT HAS NOT CHANGED
	MOV	C,21H.5		;GET STATUS OF INPUT
	MOV	A,#'6'		;DISPLAY ASCII
	CALL	TXMSG		;DISPLAY MESSAGE

IN6:	JNB	B.6,IN7		;SKIP IF THIS BIT HAS NOT CHANGED
	MOV	C,21H.6		;GET STATUS OF INPUT
	MOV	A,#'7'		;DISPLAY ASCII
	CALL	TXMSG		;DISPLAY MESSAGE

IN7:	JNB	B.7,IN8		;SKIP IF THIS BIT HAS NOT CHANGED
	MOV	C,21H.7		;GET STATUS OF INPUT
	MOV	A,#'8'		;DISPLAY ASCII
	CALL	TXMSG		;DISPLAY MESSAGE

IN8:	POP	ACC		;RESTORE CURRENT VALUE
	MOV	OLDIO,A		;NEW VALUE IS NOW OLD VALUE
	JMP	REPEAT		;KEEP READING AND DISPLAYING


; ENTER WITH ASCII INPUT NUMBER IN ACC, SWITCH STATUS IN BIT CALLED STAT
TXMSG:	PUSH	PSW		;SAVE CARRY IN PROGRAM STATUS WORD
	MOV	DPTR,#SWMSG	;POINT TO SWITCH MESSAGE
	CALL	3FH		;SERIAL STRING OUT ROUTINE IN JUMP TABLE
	CALL	3CH		;SERIAL CHARACTER OUT ROUTINE IN JUMP TABLE
	POP	PSW		;RESTORE CARRY
	JNC	TXMSGC		;JUMP TO "ON" MESSAGE IF NO CARRY
	MOV	DPTR,#OFFMSG	;POINT TO "OFF" MESSAGE
	JMP	TXMSGD
TXMSGC:	MOV	DPTR,#ONMSG	;POINT TO "ON" MESSAGE
TXMSGD:	CALL	3FH		;SERIAL STRING OUT ROUTINE IN JUMP TABLE
	RET


PWRMSG:	DB	'Power on ',0
SWMSG:	DB	'Switch ',0
ONMSG:	DB	' on',0DH,0AH,0
OFFMSG:	DB	' off',0DH,0AH,0

TXCLKVAL:			;SEND A REAL TIME CLOCK VALUE TO SERIAL PORT
	PUSH	ACC		;SAVE THE LOW NIBBLE IN ACC
	SWAP	A		;SWAP THE HIGH NIBBLE INTO THE LOW NIBBLE
	ANL	A,#0FH		;LOOK ONLY AT LOWER NIBBLE
	ADD	A,#30H		;ADD AN OFFSET TO MAKE IT AN ASCII CHARACTER
	CALL	3CH		;SERIAL CHARACTER OUT ROUTINE IN JUMP TABLE
	POP	ACC		;RESTORE LOW NIBBLE OF CLOCK INTO THE ACC
	ANL	A,#0FH		;LOOK ONLY AT LOWER NIBBLE
	ADD	A,#30H		;ADD AN OFFSET TO MAKE IT AN ASCII CHARACTER
	CALL	3CH		;SERIAL CHARACTER OUT ROUTINE IN JUMP TABLE
	RET

	END			;NEEDED BY MANY ASSEMBLER PROGRAMS
