;THIS PROGRAM CONTROLS THE SKINNY LINE ;TELEPHONE SYSTEM FOR 8 PHONE LINES AND ;15 PHONES. IT IS TARGETED FOR AN 8749 ;RUNNING AT 10.00 MHZ. ;SKINNY LINE TELEPHONE SKTX0.ASM ;MODULE 0 (MB0) ;VERSION 1.0 JANUARY 18,1986 ;BY BILL HEIDEMAN ; INTERNAL DATA TMCT0 EQU 32 ;1.6 MSEC TIMER CNTR DATCTR EQU 33 ;LINE READ CNTRS (15) DEBCTR EQU 48 ;DEBN LIM/DEBN CNTR (15) DEBVAL EQU 63 ;DEBN VAL/LAST READ (15) ;SPARE DISCNT EQU 79 ;DISPLAY OUTPUT CNTR DSPOT EQU 80 ;DISPLAY OUTPUT BUF (5) RNGPH EQU 85 ;RING CNTRS (7) P2OUT EQU 92 ;P2 PORT OUTPUT SAVE MATRIX EQU 93 ;NODE CONNECTIONS (15) HLDTRX EQU 108 ;HOLD CONNECTIONS INTREQ EQU 109 ;INTERRUPT REQUEST NUM MODE EQU 110 ;KEYED INTERRUPT NUM HSTLOW EQU 111 ;DIV H STACK LOW SSTLOW EQU 112 ;DIV S STACK LOW HSTHGH EQU 113 ;DIV H STACK HIGH SSTHGH EQU 114 ;DIV S STACK HIGH WASOFF EQU 115 ;STATION WAS OFF HK (2) INTCR EQU 117 ;INTERCOM REQ FLGS (2) ;SPARE 2 DSPCNT EQU 121 ;DISPLAY WRITTEN CNTR HNGUP EQU 122 ;HANG UP FLGS (2) HNGCNT EQU 124 ;HANG UP CNTERS (2) INTTMR EQU 126 ;INTERRUPT TIMER KEYPTR EQU 127 ;INCOMING KEY PNTR ; EXTERNAL DATA HLDTMR EQU 0 ;HOLD TMRS (7) LNSTUS EQU 7 ;LINE STAT FLGS (7) ; 1=RING BOTPTR EQU 14 ;FIFO BOT PNTR WRPTR EQU 15 ;FIFO NEXT PNTR STACK EQU 16 ;FIFO FOR LINES (16) MSGTMR EQU 32 ;MESSAGE TIMER KEYBUF EQU 33 ;INTRCOM KEY BUF (5) KEYIN EQU 38 ;KEY INPUT IN RNGCTR EQU 39 ;RING CNTRS (7) SERBUF EQU 46 ;SERIAL BUFFER LNPRT EQU 47 ;LINE PRIORITIES (7) ; 0=STANDARD LINE ; 1=NO LINE ; 2=PRIORITY TBLPTR EQU 54 ;PRINTER TBL PTR BYTCNT EQU 55 ;SERAIL BYTE COUNT BITPNTR EQU 56 ;SERIAL BIT COUNTR BINBUF EQU 57 ;BINARY BUFFER (2) ASCBUF EQU 59 ;ASCII BUFFER (16) BCDBUF EQU 75 ;BCD BUFFER (5) MIN60 EQU 80 ;60 MINUTE TIMER (2) RNGDLY EQU 96 ;RING DELAY (2) QUEDLY EQU 98 ;TIME IN QUE DELAY (2) INCOM EQU 100 ;INCMONIG CNTR (14) INCTMR EQU 114 ;INCOMING TMRS (28) OUTGO EQU 142 ;OUTGOING CNTRS (14) OUTTMR EQU 156 ;OUTGOING TMRS (28) OFFCLS EQU 184 ;OFFERED CALLS (2) EMPANS EQU 186 ;EMPLOYEE ANS (2) SYSANS EQU 188 ;SYSTEM ANS (2) QUEAVG EQU 190 ;AVERAGE TIME IN QUE (2) HLDAVG EQU 192 ;AVERAGE TIME ON HOLD (2) ABNCLS EQU 194 ;ABANDONED CALLS (2) BLKTM EQU 196 ;SYSTEM BLOCKED TIME (2) QUETTL EQU 198 ;TOTAL TIME IN QUE (2) ; R7' ACC SAVE ; R6' INTERRUPT FLAGS ; D0 INTR SEL ; D1 NIGHTX FLG ; D4 0 PULSE FLG ; D5 3 PULSE FLG ; D6 16 PULSE FLG ; D7 PULSE EDGE FLG ; R7 MAIN FLAGS ; D0 BUSY FLAG ; SYMBOL DECLARATIONS EXTERN MAIN2 PUBLIC P2OUT,MATRIX,HLDTRX PUBLIC INTREQ,MODE,DEBVAL,HNGUP,WASOFF PUBLIC INTTMR,INTCR,HNGCNT PUBLIC LNSTUS,BOTPTR,WRPTR,STACK PUBLIC KEYBUF,KEYIN,RNGDLY PUBLIC RNGCTR,MSGTMR,KEYPTR,LNPRT PUBLIC QUEDLY,BCDC,TBLRD,DIV PUBLIC TBLPTR,BCDBUF,ASCBUF PUBLIC BYTCNT,MIN60,BINBUF PUBLIC INCOM,INCTMR,OUTGO PUBLIC OUTTMR ORG 000H RESTRT: JMP MAIN ;MAIN RESET ORG 002H DB 10H ;IDENTIFICATION BYTE ORG 003H EXTI: SEL RB1 ;EXTERNAL INTERRUPT MOV R7,A JMP INSE ;DO INTERRUPT SELECT ;THIS IS THE REAL TIME CLOCK. ALL TIMER ;RELATED ROUTINES ARE CALLED FROM HERE. ORG 007H TINT: SEL RB1 MOV R7,A MOV A,#0DCH ;RESET TIMER TO 1.6 MSEC MOV T,A STRT T ORL P2,#80H ;DISABLE CHIP SELECTS ANL P2,#8FH CALL DSOT ;DO DISPLAY OUTPUT CALL DTDB ;DO DATA DEBN CALL DTSC ;DO DATA SCAN MOV R0,#TMCT0 INC @R0 ;INCR TIMER CNTR MOV A,@R0 ANL A,#3FH JNZ TINT1 ;JUMP IF NOT 102 MSEC CALL RGDT ;DO RING DETECTOR MOV R0,#TMCT0 MOV A,@R0 JNZ TINT1 ;JUMP IF NOT 410 MSEC CALL INTM ;DO INTERRUPT TIMER CALL HNGP ;DO HANG-UP MONITOR CALL MESTM ;DO MESSAGE TIMER CALL HLMN ;DO HOLD TIMERS TINT1: MOV R0,#DISCNT MOV A,@R0 ANL A,#0FCH ;0100 00XX XRL A,#40H JNZ TINT2 ;JUMP IF NOT TR 0'S MOV A,@R0 ANL A,#3 ;FORM PNTR ADD A,#JMPTAB JMPP @A ;DO JUMP JMPTAB: DB LNJMP DB CMJMP DB INJMP DB BSJMP LNJMP: CALL LNSL ;DO LINE STATUS LEDS JMP TINT2 CMJMP: CALL CMAD ;DO COMMON AUDIBLE JMP TINT2 INJMP: CALL INCL ;DO INTERCOM LEDS CALL PLCK ;DO PULSE CHECK JMP TINT2 BSJMP: CALL BSYL ;DO BUSY LAMPS CALL BSYP ;DO BUSY PULSE MOV R0,#DSPOT+2 MOV A,@R0 XRL A,#80H ;TOGGLE WARBLE MOV @R0,A TINT2: MOV R0,#P2OUT MOV A,@R0 MOVD P5,A ;RESTORE STATUS OUTL P2,A MOV A,R7 RETR ;THIS IS THE MAIN ROUTINE. IT INITIALIZES ;ALL PARAMATERS AND CALLS ALL BACK-GROUND ;ROUTINES. MAIN: MOV R0,#TMCT0 CLR A ;CLEAR ALL RAM MOV R2,#96 MAIN1: MOV @R0,A INC R0 DJNZ R2,MAIN1 MOV R0,#0 MAIN0: MOVX @R0,A ;CLEAR XDATA DJNZ R0,MAIN0 MOV A,#8FH MOV R0,#STACK MOV R2,#16 MAIN01: MOVX @R0,A ;SET UP STACK INC R0 DJNZ R2,MAIN01 MOV R0,#KEYBUF MOV R2,#5 MOV A,#0FFH MAIN02: MOVX @R0,A ;SET UP KEY BUFFER INC R0 DJNZ R2,MAIN02 MOV R0,#MODE MOV @R0,#0FFH ;RESET MODE MOV R0,#INTREQ MOV @R0,#0FFH ;RESET INT REQ MOV R0,#RNGDLY MOV A,#3 MOVX @R0,A ;PRESET RNG DLY MOV R7,#0 ;CLEAR MAIN FLGS MOV A,#4 MOVD P6,A ;TURN OFF BUSY MOV A,#8 MOVD P7,A ;TURN OFF PAGE SEL RB1 MOV R6,#0 ;CLEAR FLAGS SEL RB0 MOV A,#0F1H MOV T,A ;START TIMER STRT T EN TCNTI SEL MB1 ;SWITCH TO UPPER BANK JMP MAIN2 ;DO UPPER ;THIS ROUTINE OUTPUTS THE SERIAL BITS ;TO THE 5451 DISPLAY CHIP. IT IS CALLED ;EVERY 2.0 MSEC FROM THE REAL TIME ;CLOCK. DSOT: MOV R0,#DISCNT MOV A,@R0 INC @R0 ;INCR COUNTER MOV R5,A ;SAVE COUNTER JZ DSOT4 ;JUMP IF COUNT =0 XRL A,#72 JZ DSOT5 ;JUMP IF COUNT=72 MOV A,R5 ADD A,#0DCH JC DSOT2 ;JUMP IF COUNT>35 MOV A,R5 DEC A ;ADJUST FOR LEADING 0 RR A RR A RR A ANL A,#7 ;FORM BYTE COUNTER ADD A,#DSPOT MOV R0,A MOV A,R5 ANL A,#7 ;SET UP LOOP COUNTER MOV R2,A JNZ DSOT0 ;JUMP IF COUNT NOT 0 MOV R2,#8 ;SET LOOP FOR 8 DSOT0: MOV A,@R0 DSOT1: RRC A DJNZ R2,DSOT1 ;FIND BIT JC DSOT4 ;JUMP IF BIT=1 DSOT2: MOV A,#0FCH ANLD P6,A ;SET DATA=0 DSOT3: MOV A,#1 ORLD P6,A ;SET IDLE MOV A,#0FDH ANLD P6,A RET DSOT4: MOV A,#3 ORLD P6,A ;SET DATA=1 JMP DSOT3 DSOT5: MOV @R0,#0 ;RESET COUNTER MOV R0,#DSPCNT INC @R0 ;INCR DISPAY UPDATE JMP DSOT2 ;THIS ROUTINE SCANS THE KEY DATA ENCODERS ;AND DETECTS INCOMING PULSES. IT IS ;CALLED EVERY 2 MSEC FROM THE REAL TIME ;CLOCK. ORG 100H DTSC: MOV R2,#80H MOV R1,#DATCTR DTSC1: MOV A,R2 MOVD P5,A OUTL P2,A ;SET ENABLE IN A,P1 JB7 DTSC4 ;JUMP IF SMALL SYS DTSCY: JNT0 DTSC3 ;JUMP IF NO PULSE DTSCZ: MOV A,@R1 ANL A,#7FH XRL A,#0AH JZ DTSC3 ;JUMP IF DEBN CTR=10 INC @R1 ;INCR DEBN CTR DTSC2: INC R1 INC R2 MOV A,R2 XRL A,#8FH JNZ DTSC1 ;JUMP IF NOT DONE RET DTSC3: MOV A,@R1 ORL A,#80H ;SET UPDATE MOV @R1,A JMP DTSC2 DTSC4: MOV A,R2 XRL A,#88H ;JUMP IF NOT 9TH JNZ DTSCY JNT1 DTSC3 ;JUMP IF NO PULSE JMP DTSCZ ;THIS ROUTINE CONTROLS THE DEBOUNCE ;OF THE DETECTED DATA. THE ROUTINE USES ;A VARIABLE MULTIPLE READ CONCEPT. ;READ COUNT=12-VALUE. IT IS CALLED FROM ;THE REAL TIME CLOCK EVERY 2 MSEC. DTDB: MOV R1,#DATCTR MOV R4,#DEBCTR MOV R5,#DEBVAL DTDB1: MOV A,@R1 JB7 DTDB3 ;JUMP IF UPDATE SET DTDB2: INC R1 INC R5 INC R4 MOV A,R1 XRL A,#DATCTR+15 JNZ DTDB1 ;JUMP IF NOT DONE RET DTDB3: MOV A,@R1 ANL A,#7FH MOV R2,A ;SAVE NEW READ MOV A,R5 MOV R0,A MOV A,@R0 ANL A,#0FH ;GET OLD READ XRL A,R2 JNZ DTDB6 ;JUMP IF OLD<>NEW MOV A,R4 MOV R0,A MOV A,@R0 ANL A,#0FH MOV R3,A ;SAVE DEBN CNTR MOV A,@R0 SWAP A ANL A,#0FH ;GET LIMIT XRL A,R3 JZ DTDB4 ;JUMP IF CNTR=LIMIT INC @R0 JMP DTDB5 ;INCR CNTR DTDB4: MOV A,R5 MOV R0,A MOV A,@R0 SWAP A ;GET DEBN VALUE ANL A,#0F0H ORL A,R2 ;OR IN NEW SWAP A MOV @R0,A ;WRITE RESULT DTDB5: MOV @R1,#0 ;CLEAR DATA CNTR JMP DTDB2 DTDB6: MOV A,R5 MOV R0,A MOV A,@R0 ANL A,#0F0H ORL A,R2 ;UPDATE OLD READ MOV @R0,A MOV A,R4 MOV R0,A MOV A,R2 CPL A ;FORM NEW LIMIT ADD A,#13 ;SUB COUNT FROM 12 SWAP A MOV @R0,A ;AND CLEAR DEBN CNTR JMP DTDB5 ;THIS ROUTINE MANAGES THE MESSAGE TIMER. ;IT IS CALLED EVERY 512 MSEC FROM THE ;REAL TIME CLOCK. MESTM: MOV R0,#MSGTMR MOVX A,@R0 JZ MESTM1 ;JUMP IF TIMER=0 DEC A MOVX @R0,A ;UPDATE MESTM1: RET ;THIS ROTINE CONTROLS THE BUSY LAMPS. ;IT IS CALLED FROM THE REAL TIME CLOCK ;DURING THE TRAILING 0'S. BSYL: MOV R1,#DEBVAL MOV R0,#DSPOT MOV R4,#1 BSYL1: MOV A,@R1 ANL A,#0F0H JNZ BSYL5 ;JUMP IF STA ON MOV A,R4 CPL A ANL A,@R0 MOV @R0,A ;CLEAR DISPLAY BSYL2: INC R1 MOV A,R4 RL A MOV R4,A MOV A,R1 XRL A,#DEBVAL+15 JNZ BSYL3 ;JUMP IF NOT DONE RET BSYL3: MOV A,R1 XRL A,#DEBVAL+8 JNZ BSYL1 ;JUMP IF NOT NEXT DISPL INC R0 JMP BSYL1 BSYL5: MOV A,@R0 ORL A,R4 MOV @R0,A ;SET DISPLAY JMP BSYL2 ;THIS ROUTINE SERVICES THE INTERRUPT ;IT GETS THE INFORMATION FROM THE ENCODER ;AND SAVES IT IN MODE. INSE: MOV R1,#KEYPTR DIS I ORL P2,#80H ;DISABLE CHIP SELS MOV A,#1 ORLD P7,A ;SET 202P ENA MOVD A,P5 ;READ DATA MOVD A,P5 ANL A,#0FH MOV R2,A ;SAVE DATA MOV A,#0FEH ANLD P7,A ;DISABLE 202P MOV A,@R1 INC @R1 ;INCR KEY PNTR ADD A,#KEYBUF MOV R0,A ;SET UP PNTR MOV A,R2 MOVX @R0,A ;WRITE DATA MOV R0,#KEYIN MOV A,#0FFH MOVX @R0,A ;SET KEY IN INSE3: MOV R0,#P2OUT MOV A,@R0 MOVD P5,A OUTL P2,A ;RESTORE STATUS MOV A,R7 RETR ;THIS ROUTINE CONTROLS THE INTERCOM ;TIMER. IT IS CALLED EVERY 512 MSEC ;FROM THE REAL TIME CLOCK. INTM: MOV R0,#INTTMR MOV A,@R0 JNZ INTM1 ;JUP IF TIMER ON RET INTM1: MOV A,@R0 DEC A MOV @R0,A ;DECR TIMER JZ INTM2 ;JUMP IF TIMER UP RET INTM2: MOV R0,#MODE MOV A,@R0 XRL A,#0FFH JZ INTM3 ;JUMP IF NO MODE RET INTM3: MOV R0,#INTREQ MOV A,@R0 MOV @R0,#0FFH ;RESET INTERCOM REQ ADD A,#MATRIX MOV R0,A MOV A,@R0 ANL A,#0FEH ;DISCONNECT INTERCOM MOV @R0,A RET ;THIS ROUTINE HANDLES THE DISCONNECT OF ;OF A STATION. IT IS CALLED EVERY 512MSEC ;FROM THE REAL TIME CLOCK. ORG 200H HNGP: MOV R5,#0 MOV R0,#HNGUP MOV A,@R0 MOV R4,A MOV R0,#HNGCNT MOV A,@R0 MOV R3,A HNGP1: MOV A,R4 JB0 HNGP4 ;JUMP IF HANG-UP SET HNGP2: MOV A,R4 RR A MOV R4,A MOV A,R3 RR A MOV R3,A INC R5 MOV A,R5 XRL A,#15 JNZ HNGP3 ;JUMP IF NOT DONE MOV R0,#HNGUP+1 MOV A,R4 RR A MOV @R0,A ;UPDATE UPPER MOV R0,#HNGCNT+1 MOV A,R3 RR A MOV @R0,A RET HNGP3: MOV A,R5 ADD A,#0F8H JNC HNGP1 ;JUMP IF LOWER NOT DONE MOV A,R5 XRL A,#8 JNZ HNGP1 ;JUMP IF UPPER NOT DONE MOV R0,#HNGUP MOV A,R4 MOV @R0,A ;UPDATE LOWER INC R0 MOV A,@R0 MOV R4,A ;LOAD UPPER MOV R0,#HNGCNT MOV A,R3 MOV @R0,A ;UPDATE LOWER INC R0 MOV A,@R0 MOV R3,A ;LOAD LOWER JMP HNGP1 HNGP4: MOV A,R3 CPL A JB0 HNGP5 ;HANG-CNT NOT SET JMP HNGP7 HNGP5: MOV A,R4 ANL A,#0FEH MOV R4,A ;CLEAR HANG-UP MOV A,R5 ADD A,#MATRIX ;FORM PNTR MOV R0,A MOV A,@R0 ANL A,#1 ;DO DISCONNECT MOV @R0,A MOV A,R5 JZ HNGP6 ;JUMP IF STA 1 JMP HNGP2 HNGP6: MOV A,#0DH ANLD P7,A ;CLEAR DB5 JMP HNGP2 HNGP7: MOV A,R3 ANL A,#0FEH MOV R3,A ;CLEAR HANG CNT JMP HNGP2 ;THIS ROUTINE MONITORS THE HOLD TIMERS ;AND INCREMENTS THEM IF A LINE IS ON HOLD. ;IT IS CALLED EVERY 4 SECONDS FROM THE ;REAL TIME CLOCK. HLMN: MOV R5,#0 MOV R4,#4 MOV R1,#HLDTMR HLMN1: MOV A,R5 ADD A,#LNSTUS MOV R0,A ;SET UP PNMTR MOVX A,@R0 ;READ LINE STATUS XRL A,#3 JZ HLMN5 ;JUMP IF LINE ON HOLD CLR A MOVX @R1,A ;CLEAR HOLD TIMER HLMNA: INC R5 INC R1 MOV A,R5 XRL A,#7 JNZ HLMN1 ;JUMP IF NOT DONE RET HLMN5: MOVX A,@R1 ;READ HOLD TIMER INC A JZ HLMNA ;JUMP IF MAXED MOVX @R1,A ;UPDATE JMP HLMNA ;THIS ROUTINE CONTROLS THE BUSY SIGNAL ;OUTPUT IF THE INTERCOM IS BUSY. IT IS ;CONTROLLED FROM THE MAIN FLAGS (R7). ;IT IS CALLED FROM THE TIMER. BSYP: MOV R0,#MODE MOV A,@R0 ADD A,#0EEH JNC BSYP1 ;JUMP IF MODE<18 RET BSYP1: SEL RB0 MOV A,R7 SEL RB1 JB0 BSYP2 ;JUMP IF BUSY ON JMP BSYP4 BSYP2: MOV R0,#DSPCNT MOV A,@R0 JB1 BSYP3 ;JUMP IF D1=1 JMP BSYP4 BSYP3: MOV A,#0FBH ANLD P6,A ;TURN ON PULSE RET BSYP4: MOV A,#4 ORLD P6,A RET ;TURN OFF PULSE ;THIS ROUTINE WATCHES THE H LINES AND DETECTS ;RINGING. IT IS CALLED EVERY 128 MSEC FROM THE ;REAL TIME CLOCK. ORG 300H RGDT: MOV R5,#0 MOV R4,#1 MOV R1,#RNGPH RGDT1: IN A,P1 ANL A,R4 JZ RGDT5 ;JUMP IF H=0 MOV R0,#HLDTRX MOV A,@R0 RR A ;ADJUST FOR INTRCOM ANL A,R4 JNZ RGDT8 ;JUMP IF LINE ON HOLD MOV R3,#15 MOV R0,#MATRIX RGDTB: MOV A,R4 RL A ;FORM MASK ANL A,@R0 JNZ RGDT7 ;JUMP IF LINE ON INC R0 DJNZ R3,RGDTB ;LOOP MOV A,@R1 JB7 RGDT2 ;JUMP IF WAS 1 MOV @R1,#80H ;SET UP UPCNTR ADD A,#0E6H JC RGDT3 ;JUMP IF OVER 3.25 SEC RGDTA: INC R1 INC R5 MOV A,R4 CLR C RLC A MOV R4,A CPL A JB7 RGDT1 ;JUMP IF NOT DONE RET RGDT2: ADD A,#50H JC RGDT3 ;JUMP IF OVER 6SEC INC @R1 JMP RGDTA RGDT3: MOV R2,#0 ;SET IDLE CALL STUP ;DO STATUS UPDATE MOV A,R5 ADD A,#RNGCTR MOV R0,A CLR A MOVX @R0,A ;CLEAR RING CNTR JMP RGDTA RGDT5: MOV A,@R1 JB7 RGDT9 ;JUMP IF WAS 1 ADD A,#0E6H JC RGDTD ;JUMP IF OVER 3.25 SEC INC @R1 MOV A,@R1 XRL A,#2 JNZ RGDTA ;JUMP IF COUNT<>2 MOV A,R5 ADD A,#RNGCTR MOV R0,A ;SET UP PNTR MOVX A,@R0 ;READ RING CTR INC A MOVX @R0,A ;UPDATE CNTR DEC A JNZ RGDTA ;JUMP IF NOT 1 MOV R0,#INCOM MOVX A,@R0 ADD A,#1 ;INCR TIMER MOVX @R0,A JNC RGDT6 ;JUMP IF NO OVER INC R0 MOVX A,@R0 INC A MOVX @R0,A ;UPDATE UPPER RGDT6: MOV R2,#1 ;SET RING CALL STUP ;DO UPDATE JMP RGDTA RGDT7: MOV R2,#2 ;SET IN USE CALL STUP JMP RGDTC RGDT8: MOV R2,#3 ;SET HOLD CALL STUP RGDTC: MOV @R1,#0FEH ;SET MAX UP JMP RGDTA RGDT9: MOV @R1,#0 ;SET UP DOWN CNTR JMP RGDTA RGDTD: MOV R2,#2 ;SET IN USE CALL STUP JMP RGDTA ;THIS ROUTINE IS CALLED FROM RING DETECTOR ;(REAL TIME CLOCK) TO SET UP THE STATUS OF ;A LINE. STUP: MOV A,R5 ADD A,#LNSTUS MOV R0,A ;SET UP PNTR MOV A,R2 MOVX @R0,A ;UPDATE STATUS RET ;THIS ROUTINE CONTROLS THE SEQUENCE ;OF THE INTERCOM LED. IT IS CALLED ;FROM THE TRAILING 0'S FIELD OF THE ;DISPLAY (REAL TIME CLOCK). INCL: MOV R0,#INTREQ MOV A,@R0 XRL A,#0FFH JZ INCL2 ;JUMP IF REQ=NULL MOV R1,#MATRIX MOV R2,#0 INCL1: MOV A,@R1 ANL A,#1 ADD A,R2 MOV R2,A ;UPDATE TOTAL INC R1 MOV A,R1 XRL A,#MATRIX+15 JNZ INCL1 MOV R0,#MODE MOV A,@R0 XRL A,#21 JZ INCL5 ;JUMP IF MODE=21 MOV A,R2 ADD A,#0FEH JC INCL3 ;JUMP IF 2 ON INTERC XRL A,#0FEH JZ INCL4 ;JUMP IF NO LINES ON INCLA: MOV R0,#DSPCNT MOV A,@R0 JB2 INCL3 ;JUMP IF FLASH SET INCL2: MOV R0,#DSPOT+3 MOV A,@R0 ANL A,#7FH MOV @R0,A ;CLEAR LED RET INCL3: MOV R0,#DSPOT+3 MOV A,@R0 ORL A,#80H ;SET LED ON MOV @R0,A RET INCL4: MOV R0,#INTREQ MOV @R0,#0FFH ;RESET INT REQUEST JMP INCL2 INCL5: MOV A,R2 XRL A,#2 JZ INCL3 ;JUMP IF ONLY 2 ON JMP INCLA ;THIS ROUTINE CONTROLS THE LINE STATUS ;LEDS. IT IS CALLED FROM THE REAL TIME ;CLOACK DURING THE TRAILING 0 FIELD. ORG 400H LNSL: MOV R5,#0 ;CYCLE COUNT MOV R4,#1 ;BIT MASK MOV R3,#0 ;LAMP OUTPUT MOV R1,#LNSTUS LNSL0: MOV R0,#RNGDLY MOVX A,@R0 JZ LNSLA ;JUMP IF NO DELAY MOV R0,#BOTPTR MOVX A,@R0 ADD A,#STACK MOV R0,A ;SET UP STK PTR MOVX A,@R0 ANL A,#0FH XRL A,R5 JZ LNSL6 ;TOP PRIORITY LNSLA: MOVX A,@R1 JZ LNSL2 ;JUMP IF IDLE XRL A,#1 JZ LNSL6 ;JUMP IF RINGING MOVX A,@R1 XRL A,#2 JZ LNSL4 ;JUMP IF IN USE MOV A,R5 ADD A,#HLDTMR MOV R0,A MOVX A,@R0 XRL A,#15 JZ LNSL5 ;JUMP IF TIMER MAXED MOV R0,#DSPCNT MOV A,@R0 ANL A,#3 XRL A,#1 JNZ LNSL4 ;JUMP IF D0,D1=0 LNSL2: MOV A,R4 RL A MOV R4,A INC R5 INC R1 MOV A,R5 XRL A,#7 JNZ LNSL0 ;JUMP IF NOT DONE MOV R0,#DSPOT+3 MOV A,R3 MOV @R0,A ;UPDATE DISPLAY RET LNSL4: MOV A,R3 ORL A,R4 MOV R3,A ;SET LED ON JMP LNSL2 LNSL5: MOV R0,#DSPCNT MOV A,@R0 JB0 LNSL4 ;JUMP IF D0=1 JMP LNSL2 LNSL6: MOV R0,#DSPCNT MOV A,@R0 JB2 LNSL4 ;JUMP IF D2=1 JMP LNSL2 ;THIS ROUTINE CONTROLS THE COMMON ;AUDIBLE LINES. IT IS CALLED DURING THE ;TRAILING 0 FIELD (REAL TIME CLOCK). CMAD: MOV R1,#LNSTUS MOV R0,#DSPCNT MOV A,@R0 ANL A,#1CH JZ CMAD6 ;JUMP IF PULSE READY MOV A,@R0 ANL A,#1EH XRL A,#4 JZ CMAD6 ;2 XTRA PULSE MOV R0,#DSPOT+2 MOV A,@R0 ANL A,#83H MOV @R0,A ;CLEAR ALL CMA'S MOV A,R6 JB1 CMAD5 ;JUMP IF NIGHT S