;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!;
;   COPYRIGHT (C) 1994 KEN STATON    ;
;         ALL RIGHTS RESERVED        ;
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!;

;
; SET INTERRUPT VECTOR TABLE
;

	.ORG 0000H
	LJMP INIT               ; RESET VECTOR


	.ORG 0003H
	LJMP EXT0               ; EXTERNAL INTERRUPT 0 ROUTINE


	.ORG 000BH 
	LJMP TIM0               ; TIMER 0 INTERRUPT


	.ORG 0013H
	LJMP EXT1               ; EXTERNAL INTERRUPT 1 ROUTINE

      
	.ORG 001BH
	LJMP TIM1               ; TIMER 1 INTERRUPT


	.ORG 0023H
	LJMP SER_INT            ; SERIAL INTERRUPT

;
; TIMER 0 ISR
;

TIM0    NOP
	RETI

;
; TIMER 1 ISR
;

TIM1    NOP
	RETI
;
; EXTERNAL 0 ISR
; Not re-entrant.
; Modifies R4 = MODE
; Modifies RL & RH = Random number seed
;

EXT0    
	CLR	IEC0		;DISABLE EXT0 INTS
	PUSH	PSW		;SAVE STATUS!
	PUSH	ACC		;SAVE ACC
	PUSH	R6		;SAVE R6

	MOV	RL,TL1		;Set new random seed based on T1
	MOV	RH,TH1

	MOV	R6,#DEBOUNCE	;Debounce switch delay
	DJNZ	R6,$

	LCALL	WAITSEC		; PUT DELAY BEFORE OPTION LIST...	

SEL0	MOV	A,#IDX_G	;5 char groups
	LCALL	DO_SAYIT
	LCALL	WAITSEC
	JNB	KEY,SEL1
	MOV	R4,#GRP
	LJMP	SEL_EXIT

SEL1	MOV	A,#IDX_R	;Random chars
	LCALL	DO_SAYIT
	LCALL	WAITSEC
	JNB	KEY,SEL2
	MOV	R4,#RAN
	LJMP	SEL_EXIT

SEL2	MOV	A,#IDX_S	;Sequence chars
	LCALL	DO_SAYIT
	LCALL	WAITSEC
	JNB	KEY,SEL3
	MOV	R4,#SEQ
	LJMP	SEL_EXIT

SEL3	MOV	A,#IDX_T	;Talk toggle
	LCALL	DO_SAYIT
	LCALL	WAITSEC
	JNB	KEY,SEL4
	CPL	SPEAK
	LJMP	SEL_EXIT

SEL4	MOV	A,#IDX_5	;Farnsworth 16@5wpm
	LCALL	DO_SAYIT
	LCALL	WAITSEC
	JNB	KEY,SEL5
	MOV	FSPD,#(WPM16/2)
	MOV	CSPD,#(WPM2/2)
	MOV	DLY_B4,#WPM5DB
	MOV	DLY_AR,#WPM5DA
	LJMP	SEL_EXIT

SEL5	MOV	A,#IDX_1	;Farnsworth 18@13wpm
	LCALL	DO_SAYIT
	LCALL	WAITSEC
	JNB	KEY,SEL6
	MOV	FSPD,#(WPM18/2)
	MOV	CSPD,#(WPM9/2)
	MOV	DLY_B4,#WPM13DB
	MOV	DLY_AR,#WPM13DA
	LJMP	SEL_EXIT

SEL6	MOV	A,#IDX_2	;Farnsworth 23@20wpm
	LCALL	DO_SAYIT
	LCALL	WAITSEC
	JNB	KEY,SEL7
	MOV	FSPD,#(WPM23/2)
	MOV	CSPD,#(WPM16/2)
	MOV	DLY_B4,#WPM20DB
	MOV	DLY_AR,#WPM20DA
	LJMP	SEL_EXIT


SEL7	MOV	A,#IDX_X	;Exit, no changes
	LCALL	DO_SAYIT
	LCALL	WAITSEC
	JB	KEY,SEL_EXIT
	LJMP	SEL0

SEL_EXIT
	POP	R6		;RESTORE R6
	POP	ACC		;RESTORE ACC
	POP	PSW		;RESTORE STATUS
	SETB	IEC0
	RETI

;	
; EXTERNAL 1 ISR
;

EXT1    NOP
	RETI

;
; SERIAL ISR
;

SER_INT
	RETI

;
; *************** END ISR's *****  END ISR's ******************
;

;
; WAITSEC actually waits 0.5 sec
; Modifies ACC and R6
;
WAITSEC
	MOV	A,#QSECDLY	; 0.25 Sec
QSEC0	MOV     R6,#ONE_MS
	DJNZ    R6,$
	DJNZ	ACC,QSEC0

	MOV	A,#QSECDLY	; 0.25 Sec
QSEC1	MOV     R6,#ONE_MS
	DJNZ    R6,$
	DJNZ	ACC,QSEC1
	
	RET

INIT    
;
; system status initialization
;

	SETB	SPEAK		; TALK ON
	SETB	CODE		; CODE ON
	MOV	R4,#RAN		; RANDOM CHAR MODE

#IFNDEF	F18			; use 5@16 as default, unless
				; assembled with '-dF18=1'
	MOV	FSPD,#(WPM16/2)	; 16 WPM element timing
#ELSE
	MOV	FSPD,#(WPM18/2)	; 18 WPM element timing
#ENDIF

	MOV	CSPD,#(WPM2/2)	; 5 WPM character rate

	MOV	DLY_B4,#WPM5DB	; Set delay before speaking
	MOV	DLY_AR,#WPM5DA	; Set delay after speaking


;
; INITIAL RANDOM SEED
;

	MOV	RL,#27		; RN = 2781
	MOV	RH,#81
	MOV	PL,RL
	MOV	PH,RH

;
; PORT PIN CONFIGURATION
;

	MOV P1,#0FFH            ; SET PORT 1 (1 out enables input)
	MOV P3,#0FFH            ; SET HIGH TO ALLOW ALTERNATE FUNCTIONS
 

	MOV SP,#SP_INIT         ; SET STACK POINTER 
;
; IP - INTERRUPT PRIORITY REGISTER
;
	MOV IPC,#00000000B               ; ALL LOW PRIORITY

	MOV     TMOD,#00010000B ; TIMER ONE 16 bit
	MOV     TCON,#01000000B ; TIMER ONE ON, TIMER ZERO OFF, LOW LEVEL INTERRUPTS
	MOV     TH1,#221        ;timer/cntr 1 H byte
	MOV     TL1,#0          ;timer/cntr 1 L byte
	MOV     PCON,#00000000B
	MOV     SCON,#50H       ;Single Proc; mode 1.


;
; INITIAL INTERRUPT SOURCES
; IE - INTERRUPT ENABLE REGISTER
;
	MOV IEC,#10000001B      ; Global enable         IE.7
				; Reserved		IE.6
				; Reserved		IE.5
				; disABLE SERIAL INTS   IE.4
				; disable TIMER1 INTS	IE.3
				; disable EXT1 INTS	IE.2
				; disable TIMER0	IE.1
				; ENABLE EXT0 INTS	IE.0

;	MOV	IEC,#00000000B

;
; END INITIALIZATION
;

