.TITLE TIO FOR BILLER .IDENT /V1.0/ ; ; TERMINAL I/O ROUTINES FOR BILLING PROGRAM ; ;PROMPTS FOR SWITCH AND OPTION DISPLAY/CHANGES ; ; 9/8/78 DANIEL STEINBERG ; ; .MCALL PUSH,POP CR=15 LF=12 SPC=40 .PSECT TIODAT,RW,D,REL,CON ;THE FOLLOWING IS THE ENTIRE PRINTOUT STRING FOR THE OPTION LIST. ;SWITCH VALUES ARE MAINTAINED IN THIS STRING AS WELL AS IN THEIR ;APPROPRIATE LOCATIONS....EACH OPTION HAS ITS OWN STRING AND LENGTH ;FOR INDIVIDUAL OPTION PRINTOUT .NLIST BEX OPTLST: .ASCII /BILLING OPTIONS ARE:/ .ASCII /OPTION DESCRIPTION VALUE/ .ASCII OPBR: .ASCII /$##.## SET BILLING RATE TO ##.## $/ OPBRV: .ASCII /12.00/ OPBRL=.-OPBR OPD: .ASCII /D PROMPT FOR BILLING DATES / DATL: .ASCII *01/01/00 THRU * DATH: .ASCII *12/31/99* OPDL=.-OPD OPSL: .ASCII /[-]SL SPOOL LOG.SYS BEFORE BILLING / OPSLV: .ASCII / SL/ OPSLL=.-OPSL OPSB: .ASCII /[-]SB SPOOL BILL.LST AFTER BILLING / OPSBV: .ASCII / SB/ OPSBL=.-OPSB OPSR: .ASCII /[-]SR SPOOL LOG.SYS AFTER BILLING / OPSRV: .ASCII / SR/ OPSRL=.-OPSR OPM: .ASCII /[-]M MARK BILLED ENTRIES FOR DELETION / OPMV: .ASCII /-M/ OPML=.-OPM OPW: .ASCII /[-]W OVERWRITE LOG.SYS (-W = NEW VERSION) / OPWV: .ASCII / W/ OPWL=.-OPW .ASCII /G PERFORM BILLING OPERATION/ .ASCII /CTRL-Z EXIT BILLING PROGRAM/ .ASCII /? PRINT OPTION LIST/ .ASCII /[OP]? PRINT ONE OPTION VALUE/ OPTLEN=.-OPTLST .PSECT TIOINS,RO,I,REL,CON TPMT: .ASCIZ /OPTION: / SDAT: .ASCIZ /NEW STARTING DATE: / EDAT: .ASCIZ /NEW ENDING DATE: / SYN: .ASCIZ /?SYNTAX ERROR?/ .LIST BEX ; MAIN CODE FOR TERMINAL INTERACTION TIO:: CALL SETALL ;SET VALUES INTO ASCII STRING MOV #TPMT,R0 ;PRINT PROMPT CALL WRITE CALL READ10 ;READ 10 CHARS FROM TERMINAL MOVB (R0)+,R1 ;GET 1ST CHAR CMPB R1,#'G ; GO? BEQ 12$ CMPB R1,#IE.EOF ; QUIT? BEQ 10$ CMPB R1,#'? ; LIST OPTIONS? BEQ 20$ CMPB R1,#'D ; PROMPT FOR DATES? BEQ 30$ CMPB R1,#'$ ; SET BILLING RATE? BEQ 40$ CLR R5 ;SET NO '-' CMPB R1,#'- ; - FOR NO-OPTION? BNE 2$ DEC R5 ; YES--SET '-' FOUND MOVB (R0)+,R1 ; AND GET NEXT CHAR 2$: CMPB R1,#'M ; MARK BILLED ENTRIES? BEQ 50$ CMPB R1,#'W ; OVERWRITE? BEQ 80$ CMPB R1,#'S ; SPOOL A FILE? BNE SYNT ; NOPE---ERROR!! MOVB (R0)+,R1 ;YES...GET NEXT CHAR CMPB R1,#'L ; LOG.SYS? BEQ 60$ CMPB R1,#'B ; BILL.LST? BEQ 70$ CMPB R1,#'R ; LOG.SYS AFTER BILLING? BNE SYNT ;NO...ERROR MOV #OPSR-2,R2 ;YES...SET OPTION STRING ADDRESS MOV #OPSRL+2,R1 ;LENGTH OF STRING TO PRINT MOV #SWSR,R4 ;ADDRESS OF REAL VALUE BR SWVAL ; GO CHECK SYNTAX AND FINISH UP 10$: SEC ;SET CARRY TO INDICATE CONTROL-Z RETURN 12$: CALL TCHK ;PROPER TERMINATOR? BCS SYNT ; NO RETURN ; YES...DONE 20$: CALL TCHK ;SYNTAX OK? BCS SYNT MOV #OPTLST,R0 ;LIST ALL OPTIONS MOV #OPTLEN,R1 ; VALUES ARE ALL SET IN STRING CALL WRIT1 BR TIO ;GO PROMPT FOR MORE 30$: CALL QCHK ;QUESTION MARK? BCS SYNT ; SYNTAX ERROR BNE 33$ ; NO--PROMPT FOR DATES MOV #OPD-2,R0 ;YES..PRINT CURRENT DATE OPTION MOV #OPDL+2,R1 CALL WRIT1 BR TIO 33$: CALL GETDAT ;PROMPT FOR DATES BCS SYNT BR TIO 40$: CMPB (R0),#'? ;PRINT BILLING RATE? BNE 43$ ;NO---SET NEW ONE CALL QCHK BCS SYNT ;SYNTAX ERROR MOV #OPBR-2,R0 ;PRINT CURRENT RATE MOV #OPBRL+2,R1 CALL WRIT1 JMP TIO 43$: CALL TCHK BCC SYNT ;## MUST BE PRESENT CALL GETRAT ;GET THE BILLING RATE BCS SYNT JMP TIO 50$: MOV #OPM-2,R2 ; M FOR MARK MOV #OPML+2,R1 ;LENGTH OF STRING MOV #SWM,R4 ;ADDRESS OF VALUE BR SWVAL 60$: MOV #OPSL-2,R2 ; SL FOR SPOOL LOG.SYS MOV #OPSLL+2,R1 ;LENGTH MOV #SWSL,R4 ;ADDR OF VAL BR SWVAL 70$: MOV #OPSB-2,R2 ; SB FOR SPOOL BILL.LST MOV #OPSBL+2,R1 ;LENGTH MOV #SWSB,R4 ;VALUE BR SWVAL 80$: MOV #OPW-2,R2 ; W FOR OVERWRITE MOV #OPWL+2,R1 MOV #SWW,R4 BR SWVAL SYNT: CALL SYNTAX ;WRITE ERROR MSG JMP TIO SWVAL: CALL QCHK ;CHECK FOR CHANGE OR PRINT VALUE BCS SYNT BNE 100$ ; NO ? SO CHANGE VALUE MOV R2,R0 ;OP? SO PRINT VALUE CALL WRIT1 JMP TIO 100$: MOVB R5,(R4) ;SET SWITCH JMP TIO ; SUBROUTINES TO SUPPORT TIO ;TCHK CHECKS FOR CARRIAGE RETURN AT END OF INPUT STRING ; RETURNS CARRY SET IF NO TCHK: CMPB (R0),#CR BEQ 1$ SEC RETURN 1$: CLC RETURN ;QCHK CHECKS FOR ? AT END OF INPUT STRING ; RETURNS CARRY SET IF SYNTAX ERROR ; Z-SET IF ? (BEQ) ; Z-CLR IF (BNE) QCHK: CALL TCHK ;? BCC 3$ ;YES...CLEAR Z AND RETURN CMPB (R0)+,#'? ; '?' ? BNE 1$ ;NO...SET CARRY AND RETURN BR TCHK ;YES...CHECK FOR 1$: SEC RETURN 3$: CLZ RETURN ;READ10 INITIATES A 10 CHARACTER READ FORM THE TERMINAL ; RETURNS INPUT BUFFER ADDRESS IN R0 READ10: MOV #BUF,R0 MOV #10.,R1 JMP READ ;SYNTAX PRINTS THE SYNTAX ERROR MESSAGE SYNTAX: MOV #SYN,R0 ;SYNTAX ERROR! JMP WRITE ;GETDAT PROMPTS TI: FOR DATE INPUT AND SETS OPTION VALUES ;RETURNS CARRY SET IF SYNTAX ERROR GETDAT: MOV #SDAT,R0 ;PROMPT FOR STARTING DATE CALL WRITE CALL READ10 ;GET INPUT CALL TCHK ; LEAVES VALUE UNCHANGED BCC 38$ CALL DATCHK ;INPUT OK FOR DATE? BCS 42$ ; NO...ERROR MOV #DATLO,R1 ;VALUE FOR ACTUAL WORK CALL MOV8 38$: MOV #EDAT,R0 ;PROMPT FOR ENDING DATE CALL WRITE CALL READ10 CALL TCHK ; ? BCC 40$ ;YES...DONE CALL DATCHK ;SYNTAX OK? BCS 45$ ; NO MOV #DATHI,R1 CALL MOV8 ;AND TO ROOT AREA FOR BILLING 40$: RETURN 42$: CALL SYNTAX BR GETDAT 45$: CALL SYNTAX BR 38$ ;DATCHK CHECKS INPUT FOR DATE VALIDITY AND REFORMATS TO STANDARD ##/##/## ; INPUT--R0 SRC BUFFER STRING ; OUTPUT-R0 DATE BUFFER STRING ; CARRY SET IF ERROR ;USES R1-R5 DATCHK: PUSH R0 ;SAVE SRC ADDR CALL CDTB ;GET A NUMBER TST R1 BLE 10$ ;IS IT 1-12? CMP R1,#12. BGT 10$ CMPB R2,#'/ ;PROPER TERMINATOR? BNE 10$ MOV R1,R3 ;SAVE MONTH CALL CDTB ;GET NEXT ## TST R1 BLE 10$ ;IS IT 1-31? CMP R1,#31. BGT 10$ CMPB R2,#'/ BNE 10$ MOV R1,R4 ;SAVE DAY CALL CDTB ;GET YEAR CMP R1,#99. ;IS IT 0-99? BHI 10$ CMPB R2,#CR ;LINE TERMINATED? BNE 10$ MOV R1,R5 ;SAVE YEAR MOV (SP),R0 ;GET SRC STRING ADDR BACK MOV R3,R1 MOV #13012,R2 ;SET CONVERSION MASK CALL CBTA ;CONVERT MONTH TO TWO NUMBERS WITH SPACE FILL MOVB #'/,(R0)+ MOV R4,R1 MOV #13012,R2 ;CONVERT DAY TO 2 ##S CALL CBTA MOVB #'/,(R0)+ MOV R5,R1 MOV #11012,R2 ;CONVERT YEAR WHITH ZERO FILL CALL CBTA POP R0 ;SET SRC PTR CLC RETURN 10$: POP ;POP SRC PTR SEC ;SET ERROR RETURN ;GETRAT GETS THE BILLING RATE INPUT ;RETURNS C-SET IF ERROR GETRAT: CALL CDTB ;GET A NUMBER CMP R1,#99. ;0-99? BHI 10$ MOV R1,R5 ;R5<-DOLLARS CMPB R2,#'. ;##. ? BEQ 5$ ; YES CMPB R2,#CR BNE 10$ BR 7$ ;NO CENTS 5$: CALL TCHK BCC 7$ ;##. CALL CDTB ;GET NEXT NUMBER CMP R1,#99. BHI 10$ ;NOT 0-99 CMPB R2,#CR BNE 10$ BR 8$ 7$: CLR R1 ;NO CENTS 8$: MOV R1,CENTS ;SET CENTS MOV R5,DOLLS ;SET DOLLARS CLC RETURN 10$: SEC RETURN ;SETALL SETS THE OPTION VALUES INTO THE STRINGS SETALL: MOV #DATLO,R0 ;MOVE DATES MOV #DATL,R1 CALL MOV8 ;MOVE VALUE TO STRING AREA MOV #DATHI,R0 MOV #DATH,R1 CALL MOV8 ;MOVE VALUE TO STRING AREA CALL SETSL ;SWITCH OPTIONS CALL SETSB CALL SETSR CALL SETM CALL SETW MOV #OPBRV,R0 JMP MOVRAT ;PUT BILLING RATE IN PLACE,TOO ;SET SWITCH OPTIONS SETSL: MOV #OPSLV,R5 ;SET ADDRESS OF VALUE STRING TSTB SWSL BR SETSW SETSB: MOV #OPSBV,R5 TSTB SWSB BR SETSW SETSR: MOV #OPSRV,R5 TSTB SWSR BR SETSW SETM: MOV #OPMV,R5 TSTB SWM BR SETSW SETW: MOV #OPWV,R5 TSTB SWW SETSW: BMI 1$ MOVB #SPC,(R5) RETURN ;POS VALUE IS SWITCH ENABLED 1$: MOVB #'-,(R5) RETURN ;NEG VALUE IS SWITCH DISABLED .END