; INT1.ASM
; READ SWITCH CONNECTED TO INTERRUPT INPUT I1 WHILE IN A TIGHT DELAY LOOP
; DEMONSTRATES HOW INTERRUPT ROUTINE DOES NOT MISS SWITCH PRESSES

CTR1	EQU	34H		;COUNTER LOCATION

	ORG	8000H		;MUST ALWAYS BE ORG'ED AT 8000H FOR SBC-1
INTIN1:	CLR	C		;(C3 HEX) NEEDED ONLY IF USING AUTOBOOT

; METHOD REQUIRED BY SBC-1 TO REDIRECT INTERRUPT VECTOR TO THE INTERRUPT
; SERVICE ROUTINE IN THIS PROGRAM
	MOV	DPTR,#ISR1	;POINT TO INTERRUPT ROUTINE IN THIS PROGRAM
	PUSH	DPL		;SAVE LOW BYTE OF LOCATION
	PUSH	DPH		;SAVE HIGH BYTE OF LOCATION
	MOV	DPTR,#0DFD0H	;POINT TO INTERRUPT 0 REDIRECTION VECTOR
	MOV	A,#02H		;LONG JUMP INSTRUCTION
	MOVX	@DPTR,A		;MOVE JUMP INSTRUCTION TO VECTOR LOCATION
	INC	DPTR		;POINT TO HIGH BYTE OF LOCATION
	POP	ACC		;RESTORE HIGH BYTE OF LOCATION TO ACC
	MOVX	@DPTR,A		;MOVE HIGH BYTE OF LOCATION TO VECTOR
	INC	DPTR		;POINT TO LOW BYTE OF LOCATION
	POP	ACC		;RESTORE LOW BYTE OF LOCATION TO ACC
	MOVX	@DPTR,A		;MOVE LOW BYTE OF LOCATION TO VECTOR

				;REQUIRED ON ANY 8051 SYSTEM TO USE INT0 (EX0)
	SETB	EX0		;ENABLE EXTERNAL INTERRUPT 0
	SETB	IT0		;INTERRUPT 0 LOW GOING EDGE TRIGGERED
	SETB	EA		;ENABLE INTERRUPTS

	JMP	START

REPEAT:	MOV	CTR1,#0		;CLEAR THE COUNTER
	MOV	A,#5		;NUMBER OF SECONDS IN ACCUMULATOR
	CALL	48H		;DELAY IN SECONDS ROUTINE IN JUMP TABLE
START:	CALL	42H		;CR/LF ROUTINE IN JUMP TABLE
	MOV	A,CTR1		;GET COUNTER VALUE
	CALL	TXHEX		;SEND VALUE IN ACC AS 2 HEXADECIMAL DIGITS
	JMP	REPEAT		;CONTINUE


; SEND HEXADECIMAL VALUE IN ACC TO THE TERMINAL AS 2 ASCII DIGITS
TXHEX:	PUSH	ACC		;SAVE VALUE
	SWAP	A		;SWAP NIBBLES
	CALL	HTOA		;CONVERT LOWER NIBBLE TO A HEX CHARACTER
	CALL	3CH		;SERIAL CHARACTER OUT ROUTINE IN JUMP TABLE
	POP	ACC		;RESTORE VALUE
	PUSH	ACC		;SAVE IT AGAIN
	CALL	HTOA		;CONVERT LOWER NIBBLE TO A HEX CHARACTER
	CALL	3CH		;SERIAL CHARACTER OUT ROUTINE IN JUMP TABLE
	POP	ACC		;SO THIS ROUTINE PRESERVES IT
	RET

; CONVERT HEXIDECIMAL VALUE IN ACC TO ASCII CHARACTER IN ACC
HTOA:	ANL	A,#0FH
	MOV	DPTR,#HTOATBL
	MOVC	A,@A+DPTR
	RET

HTOATBL:		DB	'0123456789ABCDEF',0


ISR1:	INC	CTR1		;INTERRUPT SERVICE ROUTINE FOR INT0 (EX0)
	RETI			;RETURN FROM INTERRUPT INSTRUCTION

	END			;NEEDED BY MANY ASSEMBLER PROGRAMS
