$DEBUG NOSYMBOLS NOPAGING XREF ; THIS ROUTINE IS THE SPECIAL ; COSTING FOR THE GTE RETROFIT PAYPHONE ; CALIFORNIA STYLE. ; VERSION 1.0 JULY 25,1986 ; BY BILL HEIDEMAN NAME CA004 EXTRN CODE(LDCST,COSTBL,CALLTB) EXTRN CODE(LD8CST,TIMTBL,ARCCST) EXTRN CODE(SPCLTM,GENTBL,GENDIP) EXTRN CODE(SMART_BASE) EXTRN BIT(DIGUP,LDFLG,COSTST,FRSTMN) EXTRN BIT(UPCHK,INHFLG,COLINH,DLTSAV) EXTRN DATA(DIGCNT,TABSEL,DIPSWT,KEYBUF,AMOUNT) EXTRN DATA(BUFPTR,COST1,COSTN,MIN0,MIN1) EXTRN DATA(MINTMR,SPLCNT,INHPL,MIKEOT,CNCTR) EXTRN DATA(DISCNT,TIMBUF,TABSIZ,DIPSET) PUBLIC KYMN,CLKMN,TIMAC,TIMRD,TIMWR,SUMCK PUBLIC WRADJ,RDADJ COST_CODE SEGMENT CODE RSEG COST_CODE ;THIS ROUTINE READS THE SPECIAL COST TABLE ;AND SETS THE BITS IN TABSEL. IT IS CALLED ;FROM KYMN (MAIN). NUMD: MOV R0,#KEYBUF MOV DPTR,#GENTBL MOV TABSEL,#0 MOV TABSEL+1,#0 MOV SPLCNT,#0 CLR UPCHK MOV R3,#0 MOV R7,#0 MOV R2,#1 ;SET BIT MASK NUMD1: CLR A MOVC A,@A+DPTR ;READ TABLE JB ACC.4,NUMD7 ;END OF TABLE JB ACC.5,NUMD6 ;END OF FILE JB ACC.6,NUMD5 ;END OF NUMBER JB ACC.7,NUMD4 ;DON'T CARE MOV R5,A ;SAVE TABLE MOV A,@R0 INC A JZ NUMD8 ;END OF BUFFER DEC A XRL A,R5 JZ NUMD4 ;TABLE=DIGIT NUMD2: CLR A MOVC A,@A+DPTR ;READ TABLE JB ACC.6,NUMD3 ;END OF NUM INC DPTR JMP NUMD2 NUMD3: INC DPTR MOV R0,#KEYBUF JNB UPCHK,NUMD1 ;IF NOT UPPER MOV A,R2 JNB ACC.2,NUMD1 ;IF NOT AREA CODES INC R3 ;INCR CNTR JMP NUMD1 NUMD4: INC DPTR INC R0 JMP NUMD1 NUMD5: MOV A,R7 ORL A,R2 ;SET BIT MOV R7,A JNB ACC.2,NUMD3 ;NO AREA CODES MOV SPLCNT,R3 ;UPDATE WHICH ONE JMP NUMD3 NUMD6: MOV A,R2 RL A ;ADJUST MASK MOV R2,A JNB ACC.0,NUMD3 ;NO OVER MOV TABSEL,R7 MOV R7,#0 SETB UPCHK ;SET UPPER ON JMP NUMD3 NUMD7: MOV A,TABSEL+1 ORL A,R7 ;UPDATE NEXT MOV TABSEL+1,A RET NUMD8: MOV A,TABSEL+1 ORL A,#80H MOV TABSEL+1,A ;SET PARTIAL JMP NUMD2 ;THIS ROUTINE READS TABSEL AND DECODES THE ;SPECIAL COSTS. IT IS CALLED FROM KYMN (MAIN). CSSP: MOV A,TABSEL+1 JB ACC.1,CSSP3 ;IF RESTRICT JNB ACC.7,CSSP6 ;NO PARTIALS CSSPD: MOV A,TABSEL JNZ CSSP0 ;IF SPECIALS MOV A,TABSEL+1 JB ACC.3,CSSPC ;IF RATES TABLE 0 JB ACC.4,CSSP8 ;IF RATES TABLE 1 CSSPE: MOV A,TABSEL+1 JB ACC.2,CSSP7 ;IF AREA CODES CSSP0: MOV A,TABSEL JZ CSSPC ;JUMP IF NO SPECIALS MOV R3,#0 CSSP1: RRC A JC CSSP2 XCH A,R3 ADD A,#TABSIZ XCH A,R3 JMP CSSP1 ;FIND BIT CSSP2: MOV A,R3 ;GET OFFSET MOV DPTR,#GENDIP MOVC A,@A+DPTR ;READ TABLE JZ CSSP4 ;JUMP IF FREE INC A JZ CSSP3 ;JUMP IF RESTRICT DEC A MOV COST1,A ;UPDAE COST MOV COSTN,#0 ;RESET NEXT CSSPC: RET CSSP3: SETB INHFLG MOV INHPL,#0FFH ;SET INH PULSE MOV COST1,#5 ;SET DUMMY RET CSSP4: MOV A,R3 DEC A JZ CSSPA ;JUMP IF 0 FIELD MOV COST1,#0 ;SET FREE MOV COSTN,#0 SETB COLINH CSSPA: MOV MIKEOT,#0 ;TURN MIKE ON RET CSSP6: MOV A,TABSEL JNB ACC.2,CSSPD ;NO 0+ MOV A,#TABSIZ ADD A,#TABSIZ ;A HAS TABSIZ*2 MOV R3,A JMP CSSP2 CSSP7: MOV A,SPLCNT DEC A RL A MOV R2,A ;SAVE COUNT 2 MOV DPTR,#ARCCST MOVC A,@A+DPTR ;READ TABLE MOV COST1,A MOV A,R2 INC DPTR MOVC A,@A+DPTR MOV COSTN,A MOV MIN0,#1 ;SET MINUTES MOV MIN1,#1 CALL RATCK ;DO DISCOUNT CALL CSADJ ;ADJUST COST RET CSSP8: MOV A,DIPSWT ANL A,#1FH CLR C SUBB A,#DIPSET JNC CSSPC ;IF T1 IN EFFECT JMP CSSPE ;THIS ROUTINE READS THE ENTERED KEY AND ;FIGURES OUT WHAT TO DO WITH IT. IT IS CALLED ;FROM MAIN. KYMN: JNB DIGUP,KYMN4 ;NO KEY ENTERED CLR DIGUP ;CLEAR DIGIT IN MOV A,DIGCNT CLR C SUBB A,#10 JNC KYMN4 ;IF >9 DIGS IN CALL NUMD ;DO SPECIAL COST CALL CSSP MOV A,TABSEL+1 JB ACC.7,KYMN7 ;IF PARTIAL MOV A,TABSEL JNZ KYMN7 ;JUMP IF OTHER SPECIAL MOV A,TABSEL+1 JB ACC.3,KYMNA ;IF RATES TABLE 0 JNB ACC.4,KYMN3 ;IF NOT RATES TABLE 1 JMP KYMNF KYMN3: MOV A,TABSEL+1 JB ACC.2,KYMNZ ;IF AREA CODES JB LDFLG,KYMN8 ;JUMP IF LD MOV A,DIGCNT ADD A,#0FCH JC KYMN5 ;JUMP IF COUNT>3 KYMN4: RET KYMN5: MOV R0,#KEYBUF JMP KYMNB ;DO RATES KYMN7: SETB COSTST ;SET COST SET MOV AMOUNT,CNCTR ;RESTORE STAT CLR FRSTMN MOV BUFPTR,#0 RET KYMN8: MOV A,DIGCNT ;LONG DISTANCE CLR C SUBB A,#8 JC KYMN9 ;<8 DIGITS JNZ KYMN9 ;>8 DIGITS MOV DPTR,#LD8CST CLR A MOVC A,@A+DPTR ;READ COST MOV COST1,A INC DPTR CLR A MOVC A,@A+DPTR MOV COSTN,A INC DPTR CLR A MOVC A,@A+DPTR MOV MIN0,A ;READ MINUTES INC DPTR CLR A MOVC A,@A+DPTR MOV MIN1,A CALL RATCK ;CHECK DISCOUNT CALL CSADJ ;ADJUST COST JMP KYMN7 KYMN9: MOV MIN0,#1 ;LONG DIST COSTING MOV MIN1,#1 ;SET MINUTES CLR A MOV DPTR,#LDCST MOVC A,@A+DPTR ;READ TABLE MOV COST1,A MOV A,#1 MOVC A,@A+DPTR MOV COSTN,A MOV MINTMR,#0 JMP KYMN7 KYMNZ: MOV A,DIGCNT XRL A,#8 JZ KYMN8 ;IF 8 DIG LD JMP KYMN7 KYMNA: MOV A,DIGCNT CLR C SUBB A,#7 JC KYMN4 ;NOT 7 DIGITS IN MOV R0,#KEYBUF+4 KYMNB: CALL TBPT MOV R2,A ;SAVE POINTER CALL DIPS ;DO DIPSWITCH OFFSET MOV B,#200 ;MULTIPLY BY TABL MUL AB MOV DPTR,#CALLTB ADD A,DPL ;ADD OFFSET MOV DPL,A JNC KYMNC ;NO NOT OVER FLOW INC B KYMNC: MOV A,DPH ADD A,B ;ADD UPPER MOV DPH,A MOV A,R2 ;GET POINTER MOVC A,@A+DPTR ;READ TABLE KYMND: RR A RR A DJNZ R4,KYMND ;FIND BITS ANL A,#3 RL A MOV R3,A ;SAVE BIN MOV DPTR,#COSTBL MOVC A,@A+DPTR ;READ 1 MIN MOV COST1,A MOV A,R3 INC DPTR MOVC A,@A+DPTR ;READ NEXT MOV COSTN,A MOV A,R3 MOV DPTR,#TIMTBL MOVC A,@A+DPTR ;READ TIME MOV MIN0,A MOV A,R3 INC DPTR MOVC A,@A+DPTR MOV MIN1,A MOV A,R3 JNZ KYMNE ;IF NOT BIN 0 CALL RATCK ;CHECK DISCOUNT CALL CSADJ ;ADJUST COST KYMNE: JMP KYMN7 KYMNF: MOV A,DIPSWT ANL A,#1FH CLR C SUBB A,#DIPSET JNC KYMNA ;IF IN USE JMP KYMN3 ;THIS ROUTINE FORMS THE TABLE POINTER FOR ;THE COST TABLES. IT IS CALLED FROM KYMN ;(MAIN). TBPT: CLR A MOV R3,A MOV R2,A MOV A,@R0 DEC A DEC A MOV R4,A JZ TBPTA ;JUMP IF NO 100'S TBPT1: MOV A,R2 ADD A,#100 MOV R2,A JNC TBPT2 ;NO OVERFLOW INC R3 TBPT2: DJNZ R4,TBPT1 TBPTA: INC R0 MOV A,@R0 MOV R4,A JZ TBPTB ;JUMP IF NO 10'S TBPT3: MOV A,R2 ADD A,#10 MOV R2,A JNC TBPT4 ;NO OVERFLOW INC R3 TBPT4: DJNZ R4,TBPT3 TBPTB: INC R0 MOV A,@R0 ADD A,R2 ;ADD 1'S MOV R2,A JNC TBPT5 INC R3 TBPT5: MOV A,R2 ORL A,#4 ANL A,#7 MOV R4,A ;SAVE LOWER PNTR MOV R5,#2 TBPT6: MOV A,R3 RRC A ;DIVIDE BY 4 MOV R3,A MOV A,R2 RRC A MOV R2,A DJNZ R5,TBPT6 RET ;R2 HAS BYTE PNTR ;THIS ROUTINE READS THE DIPSWITCHES AND ;FORMS A TABLE SELECTOR THAT COMPENSATES ;FOR THE SECOND COSTING TABLES. DIPS: MOV A,DIPSWT ANL A,#1FH MOV R3,A ;SAVE DIP SELECT MOV A,TABSEL+1 JB ACC.4,DIPS2 ;IF TABLE 1 MOV A,R3 CLR C SUBB A,#DIPSET JNC DIPS1 ;IF OVER LIMIT MOV A,R3 RET DIPS1: RL A ;MULT OVER BY 2 ADD A,#DIPSET RET DIPS2: MOV A,R3 CLR C SUBB A,#DIPSET RL A ;MULT OVER BY 2 INC A ADD A,#DIPSET RET ;THIS IS THE TABLE FOR FIXED HOLIDAYS HOLTBL: DB 1,1 ;NEW YEARS DB 2,17H ;WASHINGTONS BIRTH DB 7,4 ;4TH OF JULY DB 12H,25H ;CHRISTMAS ;THIS ROUTINE CHECKS IF HOLIDAYS OR TIME ;OF DAY AND SETS THE SPECIAL DISCOUNT. IT ;IS CALLED FROM KYMN (MAIN). RATCK: MOV A,TIMBUF+4 ANL A,#30H XRL A,#10H JNZ RATCK7 ;IF NO CALENDER MOV DPTR,#HOLTBL MOV R2,#4 ;SET UP TBL READ RATCK1: CLR A MOVC A,@A+DPTR XRL A,TIMBUF+6 ;COMP MONTH JNZ RATCK2 INC DPTR CLR A MOVC A,@A+DPTR XRL A,TIMBUF+5 ;COMP DATE JZ RATCK5 ;IF SET HOLIDAY MOV A,DPL CLR C SUBB A,#1 MOV DPL,A ;DECR DPTR JNC RATCK2 DEC DPH RATCK2: INC DPTR INC DPTR DJNZ R2,RATCK1 ;CONTINUE MOV A,TIMBUF+6 CJNE A,#9,RATCK3 ;NOT SEPT MOV A,TIMBUF+4 ANL A,#0FH CJNE A,#2,RATCK3 ;NOT MONDAY MOV A,TIMBUF+5 CLR C SUBB A,#8 JC RATCK5 ;IF DATE<8 RATCK3: MOV A,TIMBUF+6 CJNE A,#11H,RATCK4 ;NOT NOV MOV A,TIMBUF+4 ANL A,#0FH CJNE A,#5,RATCK4 ;NOT THURS MOV A,TIMBUF+5 CLR C SUBB A,#25H JNC RATCK5 ;IF DATE>24 RATCK4: MOV A,TIMBUF+4 ANL A,#0FH ;MASK CONTROLS CJNE A,#7,RATCK6 ;NOT SAT RATCK5: MOV DISCNT,#4 ;SET .60 DISC RET RATCK6: XRL A,#1 JZ RATCK5 ;IF SUNDAY MOV A,TIMBUF+3 CLR C SUBB A,#17H JNC RATCK8 ;IF >17:00 MOV A,TIMBUF+3 CLR C SUBB A,#8 JC RATCK5 ;IF <8:00 RATCK7: MOV DISCNT,#0 ;SET NO DISC RET RATCK8: MOV A,TIMBUF+3 CLR C SUBB A,#23H JNC RATCK5 ;IF>23:00 MOV DISCNT,#7 ;SET .30 DISC RET ;THIS ROUTINE ADJUSTS THE CALL PRICE ;ACCORDING TO THE DISCOUNT AND THE SUR- ;CHARGE. IT IS CALLED FROM KYMN (MAIN). CSADJ: MOV R2,COST1 ;SAVE PRESENT CST MOV A,DISCNT JZ CSADJ5 ;IF NO DISCOUNT MOV A,R2 CLR C SUBB A,#30 JC CSADJ1 ;IF CST<1.50 MOV R4,#20 ;SUR= 1.00 JMP CSADJ3 CSADJ1: MOV A,R2 CLR C SUBB A,#15 JC CSADJ2 ;IF CST<.75 MOV R4,#10 ;SUR= .50 JMP CSADJ3 CSADJ2: MOV R4,#5 ;SUR=.25 CSADJ3: MOV A,R2 ;GET COST CLR C SUBB A,R4 ;SUBT SURCH MOV R5,A ;SAVE TCOST MOV B,#10 DIV AB MOV R3,B ;SAVE REMAINDER MOV B,DISCNT MUL AB MOV R5,A ;SAVE PRELIM MOV A,R3 JZ CSADJ4 ;IF NO REMAIN MOV B,DISCNT MUL AB ;PROCESS REMAIN MOV B,#10 DIV AB ADD A,R5 ;UPDATE COST MOV R5,A MOV A,B JZ CSADJ4 ;IF NO REMAIN INC R5 CSADJ4: MOV A,R5 ADD A,R4 ;ADD SURCH MOV COST1,A ;UPDATE COST1 MOV A,COSTN MOV B,#10 DIV AB MOV R3,B ;SAVE REMAINDER MOV B,DISCNT MUL AB MOV COSTN,A ;SAVE PRELIM MOV A,R3 JZ CSADJ5 ;IF NO REMAIN MOV B,DISCNT MUL AB ;PROCESS REMAIN MOV B,#10 DIV AB ADD A,COSTN ;UPDATE COST MOV COSTN,A MOV A,B JZ CSADJ5 ;IF NO REMAIN INC COSTN CSADJ5: RET ;THIS IS THE ACCESS TABLE CODES. KEYCOD: DB 5CH,0A3H,3AH,0C5H DB 5CH,0A3H,3AH,0C5H ;THIS IS THE READ SETUP ROUTINE TIMAC: MOV R3,#8 ;BYTE PNTR MOV DPTR,#SMART_BASE MOVX A,@DPTR ;INIT ACCESS TIMAC1: MOV DPTR,#KEYCOD MOV R2,#8 ;SET BIT COUNT MOV A,R3 DEC A MOVC A,@A+DPTR ;READ TABLE MOV DPTR,#SMART_BASE TIMAC2: MOVX @DPTR,A ;WRITE BIT RR A DJNZ R2,TIMAC2 DJNZ R3,TIMAC1 ;GET NEXT BYTE RET ;THIS ROUTINE IS THE ACTUAL READ OF THE ;SMART WATCH. TIMRD: MOV R0,#TIMBUF ;RB2 MOV DPTR,#SMART_BASE MOV R2,#0 MOV R3,#1 TIMRD1: MOV A,R3 MOV R4,A MOVX A,@DPTR ;READ WATCH ANL A,#1 RR A TIMRD2: RL A DJNZ R4,TIMRD2 ;FORMAT ORL A,R2 MOV R2,A ;UPDATE INC R3 MOV A,R3 XRL A,#9 JZ TIMRD3 ;IF BYTE DONE JMP TIMRD1 TIMRD3: MOV A,R2 MOV @R0,A ;UPDATE STORE MOV R2,#0 MOV R3,#1 INC R0 MOV A,R0 XRL A,#TIMBUF+8 JNZ TIMRD1 ;IF NOT DONE RET ;THIS ROUTINE WRITES THE DATA TO THE CLOCK ;CHIP TIMWR: MOV DPTR,#SMART_BASE MOV R0,#TIMBUF TIMWR1: MOV R2,#8 MOV A,@R0 TIMWR2: MOVX @DPTR,A ;WRITE BIT RR A DJNZ R2,TIMWR2 INC R0 MOV A,R0 CJNE A,#TIMBUF+8,TIMWR1 RET ;THIS ROUTINE UPDATES THE TIME BUFFER FROM ;THE KEY INPUT BUFFER. BUFUP: MOV R3,#6 MOV R0,#KEYBUF BUFUP1: MOV A,@R0 ;READ KEY SWAP A INC R0 ORL A,@R0 MOV @R1,A ;WRITE TO TIMBUF DEC R1 INC R0 DJNZ R3,BUFUP1 MOV TIMBUF,#0 ;CLEAR SECONDS MOV TIMBUF+1,#0 MOV R0,#TIMBUF+4 MOV A,@R0 ANL A,#0FH ORL A,#10H ;IGNORE RESET MOV @R0,A RET ;THIS IS THE MAIN CLOCK MONITOR WHICH UPDATES ;THE CLOCK BUFFER AND HANDLES THE KEY ;SEQUENCING. CLKMN: JB DIGUP,CLKMN2 MOV P1,#0 ;DISABLE LINE CLKMN1: RET CLKMN2: CLR DIGUP MOV A,DIGCNT ;FORM KEY PNTR DEC A ADD A,#KEYBUF MOV R0,A MOV A,@R0 ;READ KEY BUFFER CJNE A,#0BH,CLKMN3 ;IF NOT * MOV DIGCNT,#0 RET CLKMN3: MOV A,DIGCNT XRL A,#12 JNZ CLKMN1 ;IF NOT DONE MOV DIGCNT,#0 MOV R1,#TIMBUF+7 CALL BUFUP ;UPDATE CLOCK BUFFER CALL SUMCK ;DO SUMMER CHECK CALL WRADJ ;ADJUST FOR SUMMER CALL TIMAC ;SET UP CLOCK CHIP CALL TIMWR ;WRITE OUT DATA RET ;THIS ROUTINE CHECKS TO SEE IF DAYLIGHT ;SAVINGS IS IN EFFECT. IT IS CALLED FROM ;CLKMN (MAIN). SUMCK: MOV A,TIMBUF+6 CJNE A,#4,SUMCK4 ;NOT APRIL MOV R3,#31H ;SET COMPARE SUMCK1: MOV A,TIMBUF+4 ANL A,#0FH MOV R2,A ;SAVE DAY MOV A,#8 CLR C SUBB A,R2 ;SUBB FROM 8 ADD A,TIMBUF+5 ;ADD DATE DA A CLR C SUBB A,R3 JC SUMCK6 ;IF OCT JMP SUMCK2 SUMCK6: MOV A,TIMBUF+6 CJNE A,#10H,SUMCK3 ;NOT OCT JMP SUMCK2 ;THIS IS THE DAY TOTALS FOR THE DAYLIGHT ;SAVINGS MONTHS. MONLEN: DB 30H ;APRIL DB 31H ;MAY DB 30H ;JUNE DB 31H ;JULY DB 31H ;AUGUST DB 30H ;SEPTEMBER DB 31H ;OCTOBER ;THIS ROUTINE ADJUSTS THE TIME BEFORE A ;WRITE OPERATION. WRADJ: JNB DLTSAV,WRADJ3 ;NOT SUMMER MOV A,TIMBUF+3 ADD A,#99H DA A MOV TIMBUF+3,A ;DECR HOUR CJNE A,#99H,WRADJ3 ;HOUR OK MOV TIMBUF+3,#23H DEC TIMBUF+4 MOV A,TIMBUF+4 CJNE A,#10H,WRADJ1 ;DAY OK MOV TIMBUF+4,#17H WRADJ1: MOV A,TIMBUF+5 ADD A,#99H DA A MOV TIMBUF+5,A JNZ WRADJ3 ;DATE NOT UNDER MOV A,TIMBUF+6 ADD A,#99H ;DECR MONTH DA A MOV TIMBUF+6,A JNB ACC.4,WRADJ2 ;IF NOT OCT MOV A,#10 WRADJ2: CLR C SUBB A,#4 MOV DPTR,#MONLEN MOVC A,@A+DPTR ;READ TABLE MOV TIMBUF+5,A ;SET MAX DATE WRADJ3: RET ;THIS ROUTINE ADJUSTS THE TIME BEFORE A ;READ OPERATION. RDADJ: JNB DLTSAV,RDADJ2 ;NOT SUMMER MOV A,TIMBUF+3 ADD A,#1 ;INCR HOUR DA A MOV TIMBUF+3,A CJNE A,#24H,RDADJ2 ;HOUR OK MOV TIMBUF+3,#0 MOV A,TIMBUF+5 ADD A,#1 ;INCR DATE DA A MOV TIMBUF+5,A MOV A,TIMBUF+6 JNB ACC.4,RDADJ0 ;NOT OCT MOV A,#10 RDADJ0: CLR C SUBB A,#4 MOV DPTR,#MONLEN MOVC A,@A+DPTR ;READ TABLE CLR C SUBB A,TIMBUF+5 JNC RDADJ1 ;DATE OK MOV TIMBUF+5,#1 MOV A,TIMBUF+6 ADD A,#1 ;INCR MONTH DA A MOV TIMBUF+6,A RDADJ1: INC TIMBUF+4 MOV A,TIMBUF+4 CJNE A,#18H,RDADJ2 ;IF DAY OK MOV TIMBUF+4,#11H RDADJ2: RET END