;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!; ; 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 ;