e _vߋt ***THIS VOLUME DOES NOT CONTAIN A HARDWARE BOOTABLE SYSTEM *** NNNNNt:#z xQz kzNNz*O:z INI -- INDEX FILE BIT MAP I/O ERROR INI -- INDEX FILE HEADER I/O ERROR INI -- STORAGE BIT .TITLE DTREP - DECTAPE REPORTS TASK .GLOBL DTREPH ;DTREP TASK HEADER .GLOBL SSTAB .GLOBL DATE .GLOBL MULT,MULTR,DIVIDE .GLOBL EXPAND,SCVRT,CM .GLOBL C.B2DA,FRSTMN,INCMON .GLOBL CVT2,CVT2S .GLOBL AA.LIM,DP.LIM,LB.LIM .GLOBL GDSIZ .GLOBL VDAT,VSHF,VTYP .GLOBL A$ID,A$SPAN,A$LOW,A$PWR .GLOBL V$MAX,V$MAXT,V$MIN,V$MINT,V$LTOT,V$HTOT,V$CNT .GLOBL R$MAX,R$MAXT,R$MIN,R$MINT,R$LTOT,R$HTOT .GLOBL R$MAXD,R$MIND,R$LCNT,R$HCNT .GLOBL L$GRP,L$DEC,L$GCOD,L$CNT,L$IDP,L$SHP,LBSIZ .GL .TITLE FLAGT - SET FLAG WORD 2 .ASECT .= 2 .WORD 60001 ;DIGITAL SIMULATOR & ^C ENABLE .END ;PARAMETER FILE FOR RSX11C KBFSZ= 20. TPSZ= 80. TK.NOU= 3. KBCS= 176500 KBVCT= 300 TT0CS= 176510 TT0VCT= 310 TT1CS= 176520 TT1VCT= 320 TT2CS= 177560 TT2VCT= 60 DT.DSC= 2 IO.XTH= 6 NO.FIL= 0 NO.STT= 0 NO.CSI= 0 NO.GET= 0 ;END OF PARAMETERS  .TITLE RSX11C .IDENT /V005A/ ; JULY 10,1972 ; ; COPYRIGHT 1970,1971 DIGITAL EQUIPMENT CORP. MAYNARD MASS. 01754 ; ; .GLOBL PS ;ADDRESS OF PROCESSOR STATUS REGISTER. PS= 177776 .GLOBL S.STAT ;PROCESSOR STATUS WORD. S.STAT= -2 ; ; REAL TIME HEADER SYMBOLIC DEFINITIONS ; .GLOBL CN ;RTH-CALL NUMBER. .GLOBL SN ;RTH-SYMBOLIC NAME(CHARS 1-3) .GLOBL SS ;RTH-SYMBOLIC NAME (CHARS 4-6) .GLOBL SA ;RTH-SUSPENDED STACK ADDRESS .GLOBL NP ;RTH-NUMBER PASSED IN CALL .GLOBL WL ;RTA-WAITING LIST OBL V$LVAL,R$LVAL .GLOBL A001,A026,A056,A057,A058,A059,A084 .GLOBL A106,A107,A108,A109,A110 .GLOBL A415,A421,A422,A423,A424,A425 .GLOBL A515,A521,A522,A523,A524,A525 .GLOBL AS00,AS02,AS03,AS04,AS05 .GLOBL AS2FLT,FLT2AS .GLOBL THREAD,$ADR,$DVR,$MLR .MCALL .PARAM,.EXIT .MCALL .INIT,.OPEN,.WRITE,.READ,.WAIT,.CLOSE,.RLSE .MCALL .XFR,.PUSH,.POP,CALL,RETURN .MCALL Q,LIN,LINE,GENMES,ENDMES .PARAM STKSIZ= ^D48 ;STACK SIZE IN WORDS SPACE= 40 ;SPACE CNTRLO= 'O-100 ;CONTROL-O ; EXECUTIVE TABLES AND DATA AREAS ; ; VERSION V005A ; 001 ; ; ; COPYRIGHT 1970,1971 DIGITAL EQUIPMENT CORP. MAYNARD MASS. 01754 .SBTTL GLOBAL DEFINITIONS .GLOBL BACKGD ;BACKGROUND ACTIVE FLAG .GLOBL CTICK ;TIME OUT AND CLOCK SCAN FLAGS .GLOBL COUNT ;TICKS COUNT .GLOBL CTOD ;SAME AS COUNT; CURRENT TICKS COUNT. .GLOBL ERMSGB ;ERROR MESSAGE TASK BUFFER .GLOBL ERMSGE ;END OF ERMSGB .GLOBL HASU ;HIGHEST ADDRESS SYSTEM USES .GLOBL HATU ;HIGHEST SLOT TIMER USE .GLOBL HOUR ;CURREN ;DEVICE DRIVER LIST ; VERSION V005A ; 001 ; ; COPYRIGHT 1970,1971 DIGITAL EQUIPMENT CORP. MAYNARD MASS. 01754 ; ; RESIDENT TABLE SHOWING AVAILABILITY OF ; DEVICE DRIVERS AND THEIR CURRENT ; LOCATION ;FORMAT:- ; 4 WORDS PER ENTRY (POSITION IMMATERIAL EXCEPT ; THAT THE DUMMY ENTRY MUST BE FIRST) ; GENERAL FORM: ; ; WORD 1: DEVICE NAME (PACKED RADIX 50) ; WORD 2: CORE LOAD ADDRESS OR 0 ; WORD 3: INTERRUPT VECTOR ADDRESS ; WORD 4: ADR OF DDB ; ; DUMMY ENTRY: ; WORDS 1 - 3: 0 HEAD(LOW BYTE)&TAIL(HIGH BYTE) .GLOBL SC ;RTH-START OF CODE(TRANSFER ADDRESS) .GLOBL IS ;RTH-INITIAL STACK SETTING. .GLOBL TR ;RTH-TRAP VECTOR SETTING. 0 IF NONE. .GLOBL MS ;RTH-MAXIMUM STACK ADDRESS (STACK LIMIT) .GLOBL IP ;RTH-INITIAL PRIORITY (LOW BYTE),#OF SHARED RESO .GLOBL SL ;MINUTES AT START(HI BYTE),SECONDS AT LAST UPDAT .GLOBL SM ;MAXIMUM LEVEL 1 RUN TIME(SECONDS) .GLOBL SR ;SECONDS SINCE BEGINNING OF THIS RUN. .GLOBL WTCH ;WATCH DOG TIMER(LOW BYTE) .GLOBL FLBF ;DISPLACEMENT (FORCES OUTPUT ON) CR= 15 ;CARRIAGE RETURN LF= 12 ;LINE FEED TAB= 11 ;HORIZONTAL TAB FORM= 14 ;FORM FEED PLINES= ^D60 ;NUMBER OF LINES/PAGE USED ON LC30 .PAGE .SBTTL GENERAL INITIALIZATION LOSTK: .WORD 0 ;STACK CHECK WORD .BLKW STKSIZ ;STACK SPACE BEG: START: MOV PRM,R4 ;GET PASSED PARAMETER BNE SAVP ;NON-ZERO: O.K. MOV OLDP,R4 ;RESTART: GET SAVED PARAMETER BEQ BADPAR ;NONE THERE ... ERROR SAVP: MOV R4,(PC)+ ;SAVE IN CASE OF RESTART OLDP: .WORD 0 CLR (PC)+ ;ASSUME NOT TIME (HOUR) .GLOBL ISAD ;BOTTOM WORD OF SYSTEM STACK .GLOBL LAPU ;LOWEST SLOT TASKS USE .GLOBL LEV ;HEAD OF THE LINK LISTS .GLOBL LTDT ;LAST TIME IN TIMER .GLOBL MIN ;CURRENT TIME (MINUTES) .GLOBL NEWSA ;NEW PROGRAM ACTIVE FLAG .GLOBL PAN$ ;PANIC DUMP ADDRESS. .GLOBL PRIOR ;PRIORITY CONVERSION TABLE .GLOBL PRWT ;COUNT OF TASKS WAITING FOR PROCESSOR .GLOBL PSTB ;PRIORITY STATUS .GLOBL PTBK ;BACKWARD POINTER LIST .GLOBL PTFW ;FORWARD POINTER LIST .GLOBL PWFLF ;POWER FAILURE FLAG( ; WORD 4: ADDRESS OF LOCATION AFTER TABLE END ; (USED FOR SEARCH CONTROL) ;GENERATED AT SYSTEM BUILD TIME ;USED BY:- ; 1) .INIT ROUTINE TO FIND THE DDB & DRIVER ADDRESS. ; 2) CSI TO GET SYSTEM DEVICE. ; 3) INITIALIZATION CODE TO FIND DRIVER INT VECTORS. ; .GLOBL DDL. ;DEVICE DRIVER LIST ; ;SYSTEM DUMMY: DDL.: .WORD 0 ;NAME - DUMMY' .WORD 0 ;CORE ADDRESS .WORD 0 ;I.V. ADDRESS .WORD DDL.ND ;END OF TABLE .IF NE,DC.DSC ;RC11? .GLOBL DDL.DC ;DDL-RC11 .GLOBL DC ;RC11 DRIVER .G TO BUFFER ADDRESS ;STORAGE IN TASK RTH .GLOBL FLTB ;DISPLACEMENT TO FILE ENTRY ADDRESS ;STORAGE IN TASK RTH .GLOBL OTSV ;POINTER TO $OTSV (FORTRAN OTS IMPURE AREA VECTO CN= 0 ;DISK CALL NUMBER REAL TIME LIBRARY SN= -2 ;SYMBOLIC NAME SS= -4 ;SECOND WORD OF 6 CHARACTER SYMBOLIC NAME SA= -6 ;SUSPENDED STACK ADDRESS NP= -8. ;NUMBER PASSED TO PROGRAM ACTIVATED WL= -10. ;LEFT BYTE LAST WAITING, RIGHT FIRST WAITING CALL SC= -12. ;INITIAL START OF CODE IS= -14. ;INITIAL STACK ADDRESS RMAL REPORT SPFLAG: .WORD 0 ;0=NORMAL, 1=SPECIAL MOVB (R4)+,R5 ;GET REPORT NUMBER BGT NORM1 ;NORMAL REPORT NEG R5 ;NEGATE IT BEQ BADPAR ;INVALID REPORT NUMBER INC SPFLAG ;SET SPECIAL REPORT FLAG NORM1: CMP R5,#^D6 ;VALID REPORT NUMBER? BLOS RNUMOK ;YES BADPAR: .EXIT ;INVALID REPNUM OR PARAMETER RNUMOK: MOV R5,(PC)+ ;SAVE REPORT CODE RCOD: .WORD 0 MOV #-1,(PC)+ ;SET DAILY/MONTHLY/OTHER FLAG MF: .WORD 0 CMPB R5,#4 ;DAILY REPORT ? BEQ 1$ ;YES: SET MF=0 : DAILY CMPB R5,#5  (COUNT OF FAILURES) .GLOBL QUTM ;QUANTUMS FOR LEVELS 1,2,3,4 .GLOBL SEC ;CURRENT TIME (SECONDS) .GLOBL SUTB ;SUSPEND STATUS .GLOBL SYAUA ;SYSTEM,USER ACTIVE FLAG .GLOBL TIC ;TIME IN COUNTER TO NEXT EVENT .GLOBL TSPW ;DELAYED CONSOLE WAIT FLAG .GLOBL UPSTK ;USER STACK AT ENTRY TO EXEC .GLOBL WDTB ;HEADER ADDRESS TABLE .GLOBL WTCHD ;WATCH DOG TIMER POINTER .GLOBL WTTS ;HEAD OF TIMER SLOT WAITING LIST (FREE SLOTS) .SBTTL GLOBAL REFERENCES .GLOBL CLOCK ;CLOCK SCAN ROUTINE .GLOBLLOBL DCDDB ;RC11 DDB DDL.DC: .RAD50 'DC' ;NAME .WORD DC ;CORE ADDRESS .WORD 210 ;I.V. ADDRESS .WORD DCDDB ;DDB ADDRESS .ENDC .IF NE,DF.DSC ;RF11? .GLOBL DDL.DF ;DDL-RF11 .GLOBL DF ;RF11 DRIVER .GLOBL DFDDB ;RF11 DDB DDL.DF: .RAD50 'DF' ;NAME .WORD DF ;CORE ADDRESS .WORD 204 ;I.V. ADDRESS .WORD DFDDB ;DDB ADDRESS .ENDC .IF NE,DK.DSC ;RK11? .GLOBL DDL.DK ;DDL-RK11 .GLOBL DK ;RK11 DRIVER .GLOBL DKDDB ;RK11 DDB DDL.DK: .RAD50 'DK' ;NAME .WORD DK ;CORE ADDRESS .WORD 220 ; TR= -16. ;LEFT BYTE EMT TRAP STARTS RIGHT TRAP STATUS MS= -18. ;MAXIMUM STACK ADDRESS IP= -20. ;LEFT SHARED DEVICE COUNTS, RIGHT INITAL PRIORITY SL= -22. ;HIGH BYTE MINUTES AT START, LOW BYTE SECONDS LAST UPDATE SM= -24. ;MAXIMUM SECONDS BEFORE ERROR REPORT SR= -26. ;SECOND SINCE BEGINING OF THIS RUN WTCH= -28. ;WATCH DOG TIMER LOW BYTE FLBF= -30. ;FILE BUFFER STORAGE FLTB= -32. ;FILE TABLE SLOT STORAGE OTSV= -34. ;POINTER TO OTS ; ; PRIORITY LEVEL DEFINITIONS FOR PS ; .GLOBL PL7  ;MONTHLY OPERATING REP. ? BNE 2$ ;NO: MF=-1 : SHIFT OR COST REP. ; SET MF=1 : MONTHLY OPERATING REPORT : INC MF 1$: INC MF 2$: DEC R5 ;FORM INDEX NUMBER... ASL R5 MOV R5,(PC)+ ;SAVE INDEX RNDEX: .WORD 0 MOVB (R4)+,UNIT ;STORE UNIT NUMBER MOV (R4)+,(PC)+ ;STORE PASSED DATE RDATE: .WORD 0 MOV HDGL(R5),R1 ;SET SOURCE FOR HEADING MOV #HDNGP,R2 ;SET DESTINATION POINTER CALL EXPAND ;MOVE IN HEADING 1$: MOVB #SPACE,(R2)+ ;'TAB' .... CMP R2,#HDNGP+^D60 BLO 1$ MOV RDATE,R0 ;GET DA ENDM ;END OF MONITOR .GLOBL ROBIN ;ROUND ROBIN SCHEDULER .GLOBL SPARTH ;SPARTA HEADER ;+ ; THIS FILE MUST BE ASSEMBLED FOLLOWING THE USER ; PARAMETER DEFINITIONS AND FOLLOWING THE EXECUTIVE ; DEFINITIONS. IT IS FURTHER ASSUMED THAT NO CODE ; OF ANY KIND IS GENERATED IN THE PREVIOUS FILES ; AND THAT RELOCATABLE 0 OF THIS MODULE WILL ; BE FORCED TO ABSOLUTE 0 WITH A "/B:0" LINKER ; SWITCH. ;- ; SET ORIGIN FOR BASE OF SYSTEM STACK AND FOR ; EXECUTIVE SCHEDULING TABLES. BASE0: I.V. ADDRESS .WORD DKDDB ;DDB ADDRESS .ENDC .IF NE,DT.DSC ;TC11 DECTAPE? .GLOBL DDL.DT ;DDL-DECTAPE .GLOBL DT ;DECTAPE DRIVER ADDRESS .GLOBL DTDDB ;DECTAPE DDB DDL.DT: .RAD50 'DT' ;DRIVER NAME .WORD DT ;DRIVER ADDRESS .WORD 214 ;INTERRUPT VECTOR ADDRESS .WORD DTDDB ;DECTAPE DDB ADDRESS .ENDC .IF NE,TPSZ+KBFSZ ;CONSOLE TELEPRINTER? .IF NDF,KBVCT KBVCT= 60 .ENDC .GLOBL DDL.KO ;DDL-KB OUTPUT SIDE .GLOBL KB ;KB DRIVER. .GLOBL TPDDB ;KB TELEPRINTER DDB. ;PRINTER: DDL.KO: .RA;PRIORITY LEVEL 7 .GLOBL PL6 ;PRIORITY LEVEL 6 .GLOBL PL5 ;PRIORITY LEVEL 5 .GLOBL PL4 ;PRIORITY LEVEL 4 .GLOBL PL3 ;PRIORITY LEVEL 3 .GLOBL SY.PLE ;PRIORITY LEVEL 4 .GLOBL SY.PLH ;PRIORITY LEVEL 7 PL7= 340 ;PRIORITY LEVELS PL6= 300 PL5= 240 PL4= 200 PL3= 140 SY.PLE= 200 SY.PLH= 340 ; LINE FREQUENCY (50./60.CYCLE) .GLOBL CYCSEC ;LINE FREQUENCY IN TICKS PER SECOND. .GLOBL MCYC ;MINUS LINE FREQUENCY .IF NDF,CYCSEC CYCSEC= 60. .ENDC MCYC= -CYCSEC ; TIME-OUTS FOR LEVELS 3,2,1 (TE MOV R2,R1 ;SAVE PTR IN CASE MONTHLY CALL C.B2DA ;PUT DATE IN HEADING CMP RCOD,#5 ;MONTHLY? BLO 2$ ;NO MOVB #SPACE,(R1)+ ;CHANGE DAY OF MOVB #SPACE,(R1)+ ; MONTH TO MOVB #SPACE,(R1)+ ; SPACES 2$: MOV #PGS,R1 ;PUT 'PAGE 0' CALL EXPAND ; IN HEADING MOV R2,PNU ;SAVE POINTER TO DEC PNU ; PAGE NUMBER MOVB #CR,(R2)+ MOVB #LF,(R2)+ MOVB #LF,(R2)+ SUB #HDNGB,R2 ;COMPUTE BYTE COUNT MOV R2,HDNGC ;STORE IT IN HEADER CLRB HFF ;NULL FOR 1ST TIME .PAGE .SBTTL INITIAL.WORD 100 ;EXECUTES AN ILLEGAL INSTRUCTION ;ON JUMPS TO 0 .= BASE0+776 ISAD: .WORD 0 ;SYSTEM STACK TAB0: .IF NDF,NO.TIM .BYTE -N+2,-N+2 ;POINTERS FORWARD AND BACKWARD .BYTE -N,-N .BYTE 0,-N ;ONLY POINTER BACK .BYTE 0,-N+2 .ENDC .= TAB0+N TAB1: PTFW: .BYTE 0 ;ZERO LOCATION IN FORWARD POINTER TABLE PTBK: .BYTE 0 ;ZERO LOCATION IN BACK POINTER BYTE TABLE .= TAB1+N ;START OF TIMER SLOT SUTB AND PSTB TABLES TAB2: .IF NDF,NO.TIM .BYTE 0,-N+4 ;POINTER TO "CLOCK" EXTENSION .BYTE 0,-N+D50 'KB' ;NAME - PACKED 'KB' .WORD KB+16 ;CORE ADDRESS .WORD KBVCT+4 ;CONSOLE I.V. ADDRESS .WORD TPDDB .GLOBL DDL.KB ;DDL-KB INPUT SIDE .GLOBL KB ;KB DRIVER. .GLOBL KBDDB ;KB KEYBOARD DDB. ;KEYBOARD DDL.KB: 0 ;ILLEGAL NAME .WORD KB ;CORE ADDRESS .WORD KBVCT ;CONSOLE I.V. ADDRESS .WORD KBDDB .ENDC .IF NE,TK.NOU ;GOT TT UNITS? .IF NDF,TT0VCT TT0VCT= 300 .ENDC .GLOBL DDL.TO ;DDL-TT OUTPUT SIDE .GLOBL DDL.TT ;DDL-TT INPUT SIDE .GLOBL TODDB ;TT TELEPRINTER DDB. .GLOBL TTTICKS) ; .GLOBL TIMLV1 ;TIME-OUT FOR LEVEL1(TICKS). .GLOBL TIMLV2 ;TIME-OUT FOR LEVEL 2(TICKS). .GLOBL TIMLV3 ;TIME-OUT FOR LEVEL 3(TICKS). .IF NDF,TIMLV3 TIMLV3= CYCSEC/10. .ENDC .IF NDF,TIMLV2 TIMLV2= CYCSEC/2 .ENDC .IF NDF,TIMLV1 TIMLV1= CYCSEC .ENDC ; ; SIZE OF SHEDULING TABLE ; .GLOBL N ;SCHEDULING TABLE SIZE .GLOBL MN ;-N .IF NDF,N N= 128. .ENDC MN= -N ;SET TO -N. ; ; EAE PARAMETERS ; .GLOBL EAEAC ;EAE AC REGISTER. .GLOBL EAEMQ ;EAE MQ REGISTER. .GLOBL EAESC ;EAEIZE DATA AREA CLEAR: CLR LOSCAN ;INITIALIZE SCAN TOTAL ... CLR HISCAN ; INITIALIZE ANALOG DATA: CLR R5 ;INIT. POINT INDEX BR 2$ 1$: CLR R$LTOT(R5) ;CLEAR TOTAL ... CLR R$HTOT(R5) CLR R$MAX(R5) ;INITIALIZE MAXIMUM MOV #10000,R$MIN(R5) ; AND MINIMUM TST (R5)+ ;ADVANCE INDEX 2$: CMP R5,#AA.LIM ;FINISHED? BLO 1$ ;NO ; INITIALIZE PULSE COUNT DATA: CLR R5 ;INIT. INDEX BR 4$ 3$: CLR R$LCNT(R5) ;CLEAR TOTAL CLR R$HCNT(R5) ; PULSE COUNT TST (R5)+ ;ADVANCE INDEX 4$: CMP 6 ;POINTER TO "ROBIN" EXTENSION .WORD CLOCK ;CLOCK ACTIVATES TASKS ON TIME .WORD ROBIN ;L1 TIME SLICE ROUND ROBIN FOR BACKGROUND .ENDC .= TAB2+N TAB3: SUTB: .BYTE 0 PSTB: .BYTE 0 ;PROGRAM STATUS TABLE ZERO WORD .= TAB3+N ;START OF TIMER SLOT WDTB TABLE TAB4: CYCSEC ;CURRENT DELAY FOR CLOCK TASK TIMLV1 ;CURRENT DELAY FOR ROUND ROBIN CYCSEC ;REPEAT DELAY FOR CLOCK TASK TIMLV1 ;REPEAT DELAY FOR ROUND ROBIN .= TAB4+N ;SUSPEND STATUS 0=WAITING FOR COMPUTER WDTB: .WORD SPARTH ;NULL TA ;TT DRIVER. .GLOBL TTDDB ;TT KEYBOARD DDB. ;NON-CONSOLE PRINTER DDL.TO: .RAD50 'TT' ;NAME .WORD TT+16 ;CORE ADDRESS .WORD TT0VCT+4 ;TT: I.V. ADDRESS .WORD TODDB ;NON-CONSOLE KEYBOARD DDL.TT: .WORD 0 ;NO NAME .WORD TT ;CORE ADDRESS .WORD TT0VCT ;TT: I.V. ADDRESS .WORD TTDDB .ENDC .IF NE,PRSZ ;PAPER TAPE READER? .GLOBL DDL.PR ;DDL-PR .GLOBL PR ;PR DRIVER. .GLOBL PRDDB ;ADDRESS OF PR DDB. DDL.PR: .RAD50 'PR' ;NAME PACKED 'PR' .WORD PR ;CORE ADDRESS .WORD 70 ;I.V. ADDRESS SC&SR. EAEAC= 177302 ;AC EAEMQ= 177304 ;MQ EAESC= 177310 ;SC&SR ; ; THE FOLLOWING DEFINE THE SLOTS RESERVED FOR SYSTEM ; TASKS. THESE TASKS MUST BE LOADED INTO THE SLOTS ; INDICATED. THE SLOTS ARE DEFINED RELATIVE TO ; THE HIGHEST SLOT (N). ; .GLOBL POWFT ;POWER FAIL TASK SLOT. .GLOBL UDCT ;UDC TASK SLOT. .GLOBL TTOPT ;TT OPERATOR TASK SLOT NUMBER. .GLOBL ERMST ;ERROR MESSAGE TASK SLOT. .GLOBL OPERT ;OPERR TASK AND SLOT NUMBER. .GLOBL UTILT ;UTILITY TASK SLOT. .GLOBL GETT ;ON !R5,#DP.LIM ;FINISHED? BLO 3$ ;NO ; INITIALIZE LAB DATA: CLR R5 ;INIT. INDEX BR 6$ 5$: MOV #100000,R$LVAL(R5) ;SET LAB DATA TO CLR R$LVAL+2(R5) ; 'EMPTY' STATE CLR L$CNT(R5) ;SET COUNT TO ZERO ADD #4,R5 ;ADVANCE INDEX 6$: CMP R5,#LB.LIM ;FINISHED? BLO 5$ ;NO .PAGE .SBTTL SETUP FOR DATA READ SETUP: .INIT #DTLNK ;INIT TAPE DATASET MOV #VDAT,MEMAD ;SET MEMORY ADDRESS MOV #GDSIZ,WC ;SET WORD COUNT MOV RDATE,R0 ;GET REPORT DATE MOV R0,PDATE ;SET PRESENT DATE CALL FRST"SK HEADER .BLKB N LEV: ;LEVEL LIST START TABLE .IF DF,NO.TIM .BYTE 0 ;START OF TIMER LIST .IFF .BYTE -N ;START OF TIMER LIST .ENDC .BYTE 0 ;START OF LEVEL 1 LIST .BYTE 0 ;START OF LEVEL 2 LIST .BYTE 0 ;START OF LEVEL 3 LIST .BYTE 0 ;START OF LEVEL 4 LIST .BYTE 0 ;START OF TIME OF DAY LIST HASU: .WORD ENDM ;HIGHEST ADDRESS SYSTEM USES UPSTK: .WORD 0 ;USER STACK SETTING FOR USER PROGRAM RUNNING SYAUA: .WORD 0 ;HIGH BYTE-=SYSTEM ACTIVE, LOW BYTE=USER ACTIVE NEWSA: .WORD 0 ;NEW PROGR# .WORD PRDDB .ENDC .IF NE,PPSZ ;PAPER TAPE PUNCH? .GLOBL DDL.PP ;DDL-PP .GLOBL PP ;PP DRIVER. .GLOBL PPDDB ;ADDRESS OF PP DDB. DDL.PP: .RAD50 'PP' ;NAME - PACKED 'PP ' .WORD PP ;CORE ADDRESS .WORD 74 ;I.V. ADDRESS .WORD PPDDB .ENDC .IF NE,LPSZ ;LINE PRINTER? .GLOBL DDL.LP ;DDL- LP .GLOBL LP ;LP DRIVER. .GLOBL LPDDB ;ADDRESS OF LP DDB. DDL.LP: .RAD50 'LP' ;NAME - PACKED 'LP ' .WORD LP ;CORE ADDRESS .WORD 200 ;I.V. ADDRESS .WORD LPDDB .ENDC .IF NE,AF.CHN ;AFC11? .G$LINE LOADER TASK SLOT # .GLOBL KBOPT ;KB OPERATOR TASK SLOT # .GLOBL DTREPT ;DECTAPE REPORT TASK SLOT # .GLOBL SYSRT ;SYSTEM REPORT TASK CALL NUMBER POWFT= N-2 ;POWER FAIL TASK SLOT #. UDCT= N-4 ;UDC TASK SLOT # TTOPT= N-6 ;TT OPERATOR TASK SLOT #. ERMST= N-8. ;ERROR MESSAGE TASK OPERT= N-10. ;OPERATORS CONSOLE TASK UTILT= N-12. ;UTILITY TASK GETT= N-14. ;ON LINE LOADER TASK SLOT #. KBOPT= N-16. ;KB OPERATOR TASK SLOT NUMBER DTREPT= N-18. ;DECTAPE REPORT TASK SLOT NUMBER SYSRT= -1%MN ;R0=1ST OF MONTH MOV R0,MDATE ;SAVE FOR LATER MOV RCOD,PSHF ;ASSUME SHIFT REPORT MOV #1,R5 ;ASSUME 1 SHIFT CMPB RCOD,#4 ;WHICH TYPE REPORT? BLO 4$ ;SHIFT: GO TO IT BHI 1$ ;MONTHLY REPORT ;DAILY REPORT: MOV #3,R5 ;SET NUM. OF SHIFTS = 3 BR 3$ 1$: ;R0 = 1ST OF MONTH HERE CALL INCMON ;GET 1ST OF NEXT MONTH SUB RDATE,R0 ;NUM. OF DAYS... CMP R0,#^D31 BLOS 2$ MOV #^D31,R0 2$: MOV R0,R5 ;MULTIPLY ASL R5 ; BY ADD R0,R5 ; THREE 3$: MOV #1,PSHF ;SET FIRST SHIFT &AM ACTIVE FLAG .IF DF,NO.TIM HATU: .WORD -N .IFF HATU: .WORD -N+6 ;HIGHEST TIMER SLOT USED .ENDC LAPU: .WORD 0 ;LOWEST TASK SLOT -SET BY INITIALIZATION LTDT: .WORD 1 ;LAST TIME IN TIMER TIC: .WORD 1 ;TIME IN COUNTER PRWT: .WORD 0,0 ;ERROR MESSAGE TASK ERROR BUFFER ERMSGB: .BLKB 6*ERRBSZ ERMSGE: WTCHD: .WORD QUTM ;WATCH DOG TIMER POINTER QUTM: .BYTE 0 ;TIME QUANTUM LEVEL 1 .BYTE TIMLV2 ;TIME QUANTUM LEVEL 2 .BYTE TIMLV3 ;TIME QUANTUM LEVEL 3 .BYTE 0 ;TIME QUANTUM LEVEL 4 SEC: .BYTE 0'LOBL DDL.AF ;DDL-AFC .GLOBL AF ;AFC DRIVER .GLOBL AFDDB ;AFC DDB DDL.AF: .RAD50 'AF' ;NAME .WORD AF ;CORE ADDRESS. .WORD 134 ;I.V. ADDRESS. .WORD AFDDB ;DDB ADDRESS. .ENDC .IF NE,AD.CHN ;AD01? .GLOBL DDL.AD ;DDL-ADC .GLOBL AD ;AD01 DRIVER .GLOBL ADDDB ;ADC DDB DDL.AD: .RAD50 'AD' ;NAME .WORD AD ;CORE ADDRESS. .WORD 130 ;I.V. ADDRESS. .WORD ADDDB ;DDB ADDRESS. .ENDC .IF NE,UD.CHN ;UDC11? .GLOBL DDL.UD ;DDL-UDC .GLOBL UD ;UDC DRIVER .GLOBL UDDDB ;UDC DDB DDL.UD: .RAD50( ;REPORT TASK CALL NUMBER ; ; NUMBER OF ITEMS FOR ERROR MESSAGE BUFFER ; .GLOBL ERRBSZ ;ERROR MESSAGE BUFFER SIZE (# OF ITEMS) .IF NDF,ERRBSZ ERRBSZ= 10. .ENDC ; ; SYMBOLIC ERROR MESSAGE NUMBERS AND CLASSES. ; .GLOBL SHORT ;SHORT CALL SEQUENCE ERROR. .GLOBL ABSENT ;TASK CALLED BY NUMBER NOT PRESENT. .GLOBL UNITS ;ILLEGAL TIME UNITS. .GLOBL SIZE ;ILLEGAL TIME VALUE .GLOBL SLOT ;NO SLOT AVAILABLE. .GLOBL TIMER ;MAX RUN TIME EXCEEDED. .GLOBL COMMAN ;ILLEGAL OR UNRECOGNIZED COMMAND. )= 1 4$: MOV R5,(PC)+ ;STORE NUM. OF SHIFTS NSHF: .WORD 0 MOV R5,SCNT ;ALSO SET SHIFT COUNTER .PAGE .SBTTL DATA READ FOR ONE SHIFT RLOOP: ; COMPUTE TAPE ADDRESS FOR THIS SHIFT: CALL SETSB ;SET START BLOCK FOR DAY MOV (PC)+,R2 ;GET PRESENT SHIFT CODE PSHF: .WORD 0 DEC R2 ;R2 NOW = 0, 1, OR 2 MOV R2,R4 ;MULT. BY 5 ... ASL R4 ASL R4 ADD R2,R4 ;R4= 5 * R2 ADD R4,XFRBLK ;ADD SHIFT OFFSET CALL XFER ;READ TAPE DATA MOV #VDAT,R0 ;PNTR TO BUFFER AREA CMP (R0)+,PDATE ;CORRECT* ;PRESENT TIME OF DAY SECONDS MIN: .BYTE 0 ;MINUTES HOUR: .BYTE 0 ;HOURS WTTS: .BYTE 0 ;WAITING LIST OF TIMER SLOTS CTOD: COUNT: .WORD 0,0 ;INCREMENTED 60/SECOND FOR TICKS TRAP TSPW: .BYTE 0 ;FLAG SET TO BACKGROUND TASK # ; ON A CONSOLE WAIT. BACKGD: .BYTE 0 ;NUMBER OF BACKGROUND TASK 0=NONE PWFLF: .BYTE 0 ;POWER FAIL MESSAGE REQUEST FLAG .BYTE 0 ;ZERO PRIORITY PRIOR: .BYTE 40 ;PRIORITY .BYTE 100 ; CONVERSION .BYTE 140 ; TABLE .BYTE 200 CTICK: .WORD 0 ;TIME OUT,CLOCK FLAGS ; SY 'UD' ;NAME .WORD UD ;CORE ADDRESS. .WORD 234 ;I.V. ADDRESS. .WORD UDDDB ;DDB ADDRESS. .ENDC DDL.ND: , .GLOBL REPORT ;ILLEGAL SYSTEM REPORT NUMBER. .GLOBL BUSY ;BACKGROUND BUSY. .GLOBL SYMBLE ;SYMBOLIC TASK NAME NOT FOUND. .GLOBL SYNTAX ;COMMAND SYNTAX ERROR. .GLOBL TURN.O ;ILLEGAL TURNON TIME. SHORT= 1500 ;SHORT CALL SEQUENCE ABSENT= 1101 ;TASK CALLED NOT PRESENT UNITS= 1102 ;ILLEGAL TIME UNITS SIZE= 1103 ;ILLEGAL TIME VALUE SLOT= 1104 ;NO SLOTS AVAILABLE TIMER= 1105 ;EXCEEDED MAXIMUM RUN TIME COMMAN= 1106 ;ILLEGAL OPERATOR COMMAND REPORT= 1107 ;ILLEGAL REPORT NUMBER BUSY= 1110 - DATE? BNE DUN1 ;NO...NO DATA FOR THIS SHIFT CMPB (R0)+,PSHF ;CORRECT SHIFT? BNE DUN1 ;NO...NO DATA FOR THIS SHIFT CMPB (R0)+,#1 ;TYPE CODE O.K.? BNE DUN1 ;NO...NO DATA FOR THIS SHIFT TST @R0 ;TEST NUMBER OF SCANS BEQ DUN1 ;NO DATA FOR THIS SHIFT ADD @R0,(PC)+ ;ACCUMALATE NO. OF SCANS LOSCAN: .WORD 0 ADC (PC)+ ; (DOUBLE PRECISION) HISCAN: .WORD 0 .PAGE .SBTTL ANALOG DATA PROCESSING DOANA: CLR R5 ;INIT. POINT INDEX BR 4$ 1$: CMP V$MAX(R5),R$MAX(R5) ;NEW MAXIMUM? BLO.STEM VECTOR TABLE (SVT) ; THIS TABLE CONTAINS SYSTEM CONSTANTS ; AND POINTERS TO VARIOUS MAJOR SYSTEM AREAS, ; ALL NAMES OF SVT ELEMENTS WILL BE ; EXTERNALLY DEFINED. ; GLOBAL DEFINITIONS: .GLOBL SVT. ;SYSTEM VECTOR TABLE .GLOBL CSA ;TOP OF CORE .GLOBL BAT ;POINTER TO ASSIGNMENT TABLE .GLOBL DCO ;HEAD OF DDB CHAIN .GLOBL RSA ;BACKGROUND TASK RESTART ADDRESS. .GLOBL DATE ;JULIAN DATE WORD SVT.: CSA: .WORD 77470 ; LAST ADDRESS IN AVAILABLE CORE BAT: .WORD LAT ; POINTS TO DYNAMIC ASS/; ; ALTERNATE DEVICE TABLES FOR INIT ; ; VERSION V004A ; 001 ; ; COPYRIGHT 1970,1971 DIGITAL EQUIPMENT CORP. MAYNARD,MASS.01754 ; ; THESE THREE TABLES ARE ACCESSES BY A COMMON INDEX ; ; GLOBAL DEFINITIONS ; .GLOBL ALTD ;ALTERNATE DEVICE LIST .GLOBL ALTA ;ALTERNATE NAME DEVICES .GLOBL ALTU ;ALTERNATE DEVICE UNITS ; ; TABLE "ALTD" HOLDS A LIST OF DEVICES IN RAD50 FORM. ; THE TABLE IS TERMINATED BY A ZERO ENTRY. ; ALTD: 0 ;TABLE TERMINATOR ; ; TABLE "ALTA" HOLDS A LIST OF ALTE0 ;BACKGROUND ALREADY BUSY SYMBLE= 1111 ;SYMBOLIC TASK NAME NOT FOUND SYNTAX= 1113 ;SYNTAX ERROR TURN.O= 1114 ;ILLEGAL TUNRON TIME ;DISTANCE FROM USERS PC, ON HIS STACK, TO THE ; TOP OF HIS STACK .GLOBL SY.DTS ;DISTANCE FROM USER PC TO STACK TOP. SY.DTS= -16 ;SIZE OF DDB (IN BYTES) .GLOBL SY.DDS ;SIZE OF DDB (BYTES). SY.DDS= 56. ;28 WORDS ;OFFSETS FROM BASE OF DDB TO PARTICULAR ELEMENT ; .GLOBL SY.DVL ;DDB-SUSPEND LEVEL COUNTS. .GLOBL SY.SPN ;DDB-SUSPEND NUMBER (BYTE) .GLOBL1 2$ ;NO MOV V$MAX(R5),R$MAX(R5) ;STORE NEW MAX MOV V$MAXT(R5),R$MAXT(R5) ;STORE MAX TIME MOV PDATE,R$MAXD(R5) ; AND DATE 2$: CMP V$MIN(R5),R$MIN(R5) ;NEW MINIMUM? BHI 3$ ;NO MOV V$MIN(R5),R$MIN(R5) ;STORE NEW MIN MOV V$MINT(R5),R$MINT(R5) ;STORE MIN TIME MOV PDATE,R$MIND(R5) ; AND DATE 3$: ADD V$LTOT(R5),R$LTOT(R5) ;ACCUMALATE ADC R$HTOT(R5) ; TOTAL ... ADD V$HTOT(R5),R$HTOT(R5) TST (R5)+ ;ADVANCE INDEX 4$: CMP R5,#AA.LIM ;FINISHED? BLO 1$ ;NO .PAGE .SBTTL DIGITAL2IGNMENT TABLE DCO: .WORD 0 ; CHAIN OF INITED DDBS RSA: .WORD 0 ; RESTART ADDRESS DATE: .WORD 0 ; DATE IN JULIAN - 70,000 .IF NDF,NO.TIM .GLOBL SCALE ;SCALE MULTIPLIER TABLE DEFINITION ; SCALE MULTIPLIER TABLE FOR 50/60 CYCLE POWER. ; CONVERTS TIME VALUE TO TICKS IN "CONV" ROUTINE SCALE: .WORD 1 ;TICKS .WORD CYCSEC/10.*5243.+4./8. ;MILLISECONDS .WORD CYCSEC ;SECONDS .WORD 60.*CYCSEC ;MINUTES .ENDC ; LOGICAL ASSIGNMENT TABLE ; ; THIS TABLE IS POINTED TO BY BAT IN THE SVT. ; ITS SRNATES FOR THE ; NAMES IN TABLE "ALTD". THESE ENTRIES POINT TO THE ; PROPER DDL ENTRY. ; ALTA: ; ; ; TABLE "ALTU" HOLDS A LIST OF UNIT NUMBERS FOR TABLES ; "ALTD" AND "ALTA". LOW BYTE = UNIT NUMBER FOR ALTD, ; HIGH BYTE = UNIT NUMBER FOR ALTA. ; ALTU: ; .EVEN ; .END 4 SY.BFS ;DDB-BUFFER SIZE .GLOBL SY.PTB ;DDB-POINTER TO TOP OF BUFFER. .GLOBL SY.PTI ;DDB-BUFFER INPUT POINTER. .GLOBL SY.PTO ;DDB-BUFFER OUTPUT POINTER. .GLOBL SY.PIC ;DDB-CURRENT INPUT CHANGE BLOCK POINTER. .GLOBL SY.RTN ;DDB-TASK DDB RESERVED FOR (BYTE) .GLOBL SY.DFL ;DDB-FLAG BYTE. .GLOBL SY.SCB ;DDB-STORE FOR CURRENT CHANGE BLOCK. .GLOBL SY.TO ;DDB-TIME OUT COUNT (0=NOT ACTIVE) .GLOBL SY.INH ;DDB-TIME OUT MESSAGE INHIBIT COUNT .GLOBL SY.QLK ;Q LINK TO ACTIVE DDB'S ; SY.DVL= -6 ;5 PULSE COUNT ACCUMULATION DOPC: CLR R5 ;INIT. INDEX BR 2$ 1$: ADD V$CNT(R5),R$LCNT(R5) ;ACCUMULATE ADC R$HCNT(R5) ; PULSE COUNTS TST (R5)+ ;ADVANCE INDEX 2$: CMP R5,#DP.LIM ;FINISHED? BLO 1$ ;NO DUN1: CMP PSHF,#3 ;WAS THIS LAST SHIFT THIS DAY? BNE 4$ ;NO TST MF ;DAILY OR MONTHLY OPER. REP.? BMI 4$ ;NO ; IT'S EITHER DAILY OR MONTHLY SUMMARY: GET LAB DATA: MOV #LBSIZ,WC ;SET WORD COUNT CALL SETSB ;SET START BLOCK FOR DAY ADD #^D15,XFRBLK ;BLOCK NO. OF LAB DATA CALL X6IZE (IN WORDS) IS DEFINED BY LATSZ. .IF NDF,LATSZ LATSZ= 12. ;DEFAULT SIZE = 4 SLOTS .ENDC LAT: .WORD LATEN ;PTR TO END OF TABLE .WORD 0 ;FIRST ENTRY IS 0 (END OF LIST) .BLKW LATSZ-1 ;AREA FOR TABLE LATEN: .WORD 0 ;END OF TABLE ; ADDRESSES OF CLOCK AND KEYBOARD STATUS REGISTERS ; ; THIS TABLE IS USED BY THE CONSOLE AND NON-CONSOLE DRIVERS TO ; ACCESS THE DEVICE REGISTERS AND IS REFERENCED BY LABEL TKI.CS. ; ; POWER FAIL AND SYSTEM INITIALIZE USE IT TO ENABLE INTERRUPTS ON ; THE CLOC7 .TITLE KB ; ; VERSION V004A ; 001 ; ; KEYBOARD AND TELEPRINTER DRIVER - PART 1 ; ; THE KB DRIVER IS IN THREE PARTS TO FACILITATE ; PAPER TAPE HANDLING. ; ; COPYRIGHT 1970,1971 DIGITAL EQUIPMENT CORP. MAYNARD MASS. 01754 ; ; ; GLOBAL DEFINITIONS ; .GLOBL CMDST ;KB KEYBOARD TYPE-AHEAD BUFFER. .GLOBL KB ;KB DRIVER. .GLOBL KBDDB ;KB KEYBOARD DDB. .GLOBL K.ENFL ;KEYBOARD END-OF-FILE FLAG(BYTE). .GLOBL TPDDB ;KB TELEPRINTER DDB. ; ; GLOBAL REFERENCES ; .GLOBL DV.A2 ;CREATE A002 FSUSPEND LEVEL CTRS. SY.SPN= 31 ;SUSPEND # (BYTE) SY.BFS= 32 ;BUFFER SIZE (WORD) SY.PTB= 34 ;POINTER TO TOP OF BUFFER (WORD) SY.PTI= 36 ;INPUT PTR TO BUFFER (WORD) SY.PTO= 40 ;OUTPUT PTR FROM BUFFER (WORD) SY.PIC= 42 ;PTR TO CURRENT INPUT CHANGE BLOCK (WORD SY.RTN= 44 ;RESERVED TASK # (BYTE) SY.DFL= 45 ;DDB FLAGS (BYTE) SY.SCB= 46 ;STORAGE FOR CURRENT OUTPUT CHANGE BLOCK SY.TO= 52 ;TIME OUT COUNT (0=NOT ACTIVE) SY.INH= 53 ;TIME OUT MESSAGE INHIBIT COUNT SY.QLK= -12 ;Q LINK TO ACTIVEEFER ;READ LAB DATA MOV #GDSIZ,WC ;RESET WC TO ORIG. VALUE CMP VDAT,PDATE ;CORRECT DATE ? BNE 4$ ;NO: NO LAB DATA CLR R5 ;INIT. INDEX 1$: CMP V$LVAL(R5),#100000 ;'EMPTY' ? BNE 2$ ;NO TST V$LVAL+2(R5) ;'EMPTY' ? BEQ 3$ ;YES: IGNORE IT 2$: INC L$CNT(R5) ;COUNT DATA ITEM TSTB L$DEC(R5) ;'TIME' VALUE ? BMI 3$ ;YES: IGNORE IT .PUSH V$LVAL+2(R5) ;PUSH VALUE ... .PUSH V$LVAL(R5) ; ... FOR TODAY .PUSH R$LVAL+2(R5) ;PUSH TOTAL ... .PUSH R$LVAL(R5) ; ... SO FAR JSR R4,THREAD GK AND KEYBOARDS .IF NDF,TK.NOU TK.NOU= 0 ;DEFAULT # OF TT UNITS = 0 .IFF .IF NDF,TT0CS TT0CS= 176500 .ENDC .ENDC .MACRO GENSPC D0,D1 .IF NB,D1 .TMP= D1 .IFF .TMP= 0 .ENDC .IF DF,TT'D0'CS .WORD TT'D0'CS+.TMP ;TT'D0 STATUS REGISTER .IFF .TMP= 10*.SEQ+.TMP .WORD TT0CS+.TMP ;TT'D0 STATUS REGISTER .ENDC .ENDM GENSPC .GLOBL TKI.CS ;ADDRESS OF LIST OF KB&TT INPUT STATUS REGISTERS .GLOBL TKO.CS ;ADDRESS OF LIST OF KB&TT OUTPUT STATUS REGISTER .WORD 177546 ;CLOCK STATUS REGIHMESSAGE SUBROUTINE. .GLOBL HSASI ;HIGH SPEED ACTIVATE SUBROUTINE. .GLOBL KBBUF ;ADDRESS OF KB KEYBOARD EXEC BUFFER. .GLOBL OPERT ;OPERR TASK AND SLOT NUMBER. .GLOBL PAN$ ;PANIC DUMP ADDRESS. .GLOBL SRTI ;COMMON SYSTEM EXIT. .GLOBL STRG ;COMMON SYSTEM ENTRY SUBROUTINE. .GLOBL SY.DFL ;DDB-FLAG BYTE. .GLOBL SY.DPR ;DDB-PERMANENT DDB BIT. .GLOBL SY.DWN ;DDB-DEVICE IS DOWN FLAG (NOT READY). .GLOBL SY.MUD ;DRIVER MULTI-ACCESS BIT. .GLOBL SY.RES ;DDB-RESERVED FLAG. .GLOBL SY.RTN ;DDB-TA""""""" """""""""""""""""""""""""""""@DDDD@DDDDDDDDDDDDDD@DDD@DDDDDDDDDDDDDDDD """""""""""""""""""""""""""@DDD@@DDDD@DDDDDDDDD@""3333ADDB C2!kQ_J1a'.kQ_f:dHkQ_skQ_5f# kQ_ kQ_r '4kQ_!+/EkQ_:3@< kQ_jiKkQ_*kQ_ AyskQ_z}vkQ_UJk~kQ_2:d\kQ_|?}kQ9wPZkQ_ R,"kQ_R57 SkQ_@ dgkQ_V^O !kQ_br zkQ_h-a'.kQ_Vvv:dkQ_zz'@~kQ_~ :!kQ_,9wWkQ_qkQ_<$Dwwwwwwwwwwwwwwwwwwwwwwwwwwwwww333333333s4a ͋,L wB8 ` 5 5 6   w w * w6  DUUEU T & fNUNU ?#<f& * 1U U@DEU!>Uf& *  U UCB E e v *I;ENTER THREADED MODE $ADR ;ADD .WORD .+2 ;THREADED EXIT .POP R$LVAL(R5) ;STORE NEW ... .POP R$LVAL+2(R5) ; ... TOTAL 3$: ADD #4,R5 ;ADVANCE INDEX CMP R5,#LB.LIM ;FINISHED ? BLO 1$ ;NO: LOOP 4$: DEC SCNT ;ANY MORE? BEQ DUNALL ;NO CMP PSHF,#3 ;NEW DAY? BLO 5$ ;NO: JUST BUMP SHIFT CLR PSHF ;ZERO SHIFT NO. INC PDATE ;BUMP DATE 5$: INC PSHF ;BUMP SHIFT NO. JMP RLOOP ;GO DO NEXT SHIFT .PAGE .SBTTL POST-READ PROCESSING DUNALL: CMPB RCOD,#6 ;COST REPORT ? BNE 1$J DDB'S ;FLAGS IN DDB POSITION SY.DFL .GLOBL SY.LOC ;DDB-LOCKED FLAG. .GLOBL SY.RES ;DDB-RESERVED FLAG. .GLOBL SY.WDC ;DDB-WAITING FOR DEVICE COMPLETION FLAG .GLOBL SY.DPR ;DDB-PERMANENT DDB BIT. .GLOBL SY.TWR ;DDB-THE OWNER IS WAITING. .GLOBL SY.WIW ;DDB-.WRITE OR .READ IS WAITING FOR ROOM OR DATA .GLOBL SY.DWN ;DDB-DEVICE IS DOWN FLAG (NOT READY). ; SY.LOC= 200 ;LOCKED SY.RES= 100 ;RESERVED SY.WDC= 40 ;WAITING FOR DEVICE COMPLETION SY.DPR= 20 ;THIS IS A PERMANENT DDB SY.TWR= 10KSTER .IF DF,KBCS .WORD KBCS ;NON-STANDARD CONSOLE .IFF .WORD 177560 ;STANDARD CONSOLE .ENDC TKI.CS: ;NON CONSOLE UNITS 0-N GO HERE .IF NE,TK.NOU .SEQ= 0 .REPT TK.NOU GENSPC \.SEQ .SEQ= .SEQ+1 .ENDM .ENDC .WORD 0 ;END OF TABLE. ; ADDRESSES OF TELEPRINTER STATUS REGISTERS .IF DF,KBCS .WORD KBCS+4 ;NON-STANDARD CONSOLE .IFF .WORD 177564 ;CONSOLE .ENDC TKO.CS: ;NON-CONSOLE UNITS 0-N GO HERE. .IF NE,TK.NOU .SEQ= 0 .REPT TK.NOU GENSPC \.SEQ,4 .SEQ= .SEQ+1 .ENDLSK DDB RESERVED FOR (BYTE) .GLOBL SY.TO ;DDB-TIME OUT COUNT (0=NOT ACTIVE) .GLOBL SY.INH ;DDB-TIME OUT MESSAGE INHIBIT COUNT .GLOBL TKI.CS ;ADDRESS OF LIST OF KB&TT INPUT STATUS REGISTERS .GLOBL TKO.CS ;ADDRESS OF LIST OF KB&TT OUTPUT STATUS REGISTER .GLOBL TPBUF ;ADDRESS OF KB OUTPUT EXEC BUFFER. .GLOBL KBOPT ;KB OPERATOR TASK SLOT NUMBER .GLOBL UTILT ;UTILITY TASK SLOT. .MCALL CALL,CALL5,RETURN,.PUSH,.POP .MCALL .PARAM .PARAM ; .MACRO GENM ;NO MOV #^D271,XFRBLK ;SET BLOCK NO. MOV #CDBF,MEMAD ;SET MEMORY ADDRESS MOV #^D9,WC ;SET WORD COUNT CALL XFER ;READ UNIT COST FROM TAPE 1$: .RLSE #DTLNK ;RELEASE TAPE DATASET .INIT #OLNK ;.INIT OUTPUT DATASET .OPEN #OLNK,#OFNBLK ; AND OPEN MOV #NULINE,VL2 ;ASSUME ALL DATA PRESENT MOV HISCAN,R1 ;GET HI SCAN TOTAL MOV LOSCAN,R0 ; AND LO SCAN TOTAL BNE 4$ ;HAVE DATA TST R1 ;HI=0 TOO? BNE 4$ ;NO: HAVE DATA MOV #NDLIN,VL2 ;SET FOR 'NO DATA' MESSAGE CALL PAGE ;WRITE HEAN ;AN OWNER IS WAITING SY.WIW= 4 ;.WRITE IS WAITING FOR ROOM. SY.DWN= 2 ;DEVICE IS DOWN ; ;SUSPEND REASONS ; ;THESE ARE PUT ON THE TOP OF THE USER STACK AND ;INDICATE WHY THE TASK IS SUSPENDED. ; .GLOBL SY.WL ;SUSPEND-WAIT, LOCKED .GLOBL SY.OR ;SUSPEND-OPEN, RESERVED .GLOBL SY.OL ;SUSPEND-OPEN, LOCKED FOR ANOTHER TASK .GLOBL SY.OF ;SUSPEND-OPEN, BUFFER FULL. .GLOBL SY.OLT ;SUSPEND-OPEN,LOCKED FOR THIS TASK .GLOBL SY.CR ;SUSPEND-CLOSE, RESERVED. .GLOBL SY.CL ;SUSPEND-CLOSE, LOCKEDOM .ENDC ;DOES NOT REQUIRE A 0 TABLE TERMINATOR ; STORAGE AREA FOR POWER DOWN SEQUENCE. .GLOBL PF.S ;POWERFAIL SAVE AREA. .GLOBL PF.SA ;POWERFAIL SAVE AREA. .WORD 0 ;EXTRA WORD FOR REG RESTORE CALL. PF.SA: .BLKW 6 ;STORE FOR R0-R5 PF.S: .BLKW 1 ;STORE FOR R6 ; DATA AREAS FOR UDC DRIVER. .GLOBL UD.CHN ;UDC-NUMBER OF CHANNELS .IF NDF,UD.CHN UD.CHN= 0 .ENDC .IF NE,UD.CHN .GLOBL UD.NIM ;UDC-NUMBER OF INTERRUPTING MODULES. .IF NDF,UD.NIM UD.NIM= 0 .ENDC .GLOBL UDNIM2 ;UDC-UPWRD D0,D1 .WORD D0 ;TT'D1 .ENDM GENWRD .MACRO GENTAB D0,D1 .SEQ= 0 .TMP= D0 .REPT TK.NOU .IIF NB,D1, .TMP= .TMP+D1 GENWRD .TMP,\.SEQ .SEQ= .SEQ+1 .ENDM .ENDM GENTAB .IF NDF,TK.NOU TK.NOU=0 .ENDC .IF NE,TK.NOU .IF NDF,KBVCT KBVCT= 60 .ENDC .IF NDF,TT0VCT TT0VCT= 300 ;DEFAULT .ENDC .IF GT,TK.NOU-1 .MACRO GVCT D0 .IF NDF,TT'D0'VCT TT'D0'VCT= .SEQ*10+TT0VCT .ENDC .ENDM GVCT .SEQ= 1 .REPT TK.NOU-1 GVCT \.SEQ .SEQ= .SEQ+1 .ENDM .ENDC .ENDC QDING & MESSAGE TST MF ;WHAT TYPE REPORT ? BEQ 2$ ;DAILY REPORT BGT 3$ ;MONTHLY OPERATING REPORT JMP EXIT ;OTHER: THAT'S ALL 2$: JMP DAYFIN ;DO LAB & COMMENTS 3$: JMP MONFIN ;DO MONTHLY LAB 4$: MOV NSHF,R2 ;GET NUMBER OF SHIFTS ASR R2 ;TAKE HALF AND ADD R2,R0 ; CAUSE ROUNDING ADC R1 MOV NSHF,R2 ;GET NUMBER OF SHIFTS CALL DIVIDE ;COMPUTE AVERAGE NUMBER ; OF SCANS / SHIFT MOV #^D5760,R2 ;NORMAL SCANS / SHIFT MOV R2,R0 ;CAUSE ASR R0 ; ROUNDING CALL DIVIDE ;R FOR ANOTHER TASK. .GLOBL SY.CF ;SUSPEND-CLOSE, BUFFER FULL .GLOBL SY.CLT ;SUSPEND-CLOSE, LOCKED FOR THIS TASK .GLOBL SY.WRR ;SUSPEND-WRITE, LOCKED FOR ANOTHER TASK .GLOBL SY.WRL ;SUSPEND-WRITE, LOCKED FOR ANOTHER TASK .GLOBL SY.WLT ;SUSPEND-WRITE, LOCKED FOR THIS TASK .GLOBL SY.RLT ;SUSPEND-RELEASE, LOCKED FOR THIS TASK .GLOBL SY.SPL ;SUSPEND-SPECIAL FCN, LOCKED FOR ANOTHER TASK .GLOBL SY.SPR ;SUSPEND-SPECIAL FCN, RESERVED .GLOBL SY.SPT ;SUSPEND-SPECIAL FCN, LOCKED FOR THIS TASK .GLOBSD.NIM*2 UDNIM2= UD.NIM+UD.NIM .GLOBL UD.GEN ;UDC-GENERIC CODES TABLE .GLOBL UD.PRV ;UDC-PREVIOUS STATUS TABLE UD.PRV: .BLKW UD.CHN UD.GEN: .BLKB UD.CHN .EVEN .GLOBL UD.COS ;UDC-CHANGE OF STATE TABLE .GLOBL UD.IMD ;UDC-INT MODULE DATA UD.COS: .BLKW UD.NIM UD.IMD: .BLKB UD.NIM .EVEN .ENDC ; SET DUMMIES FOR AD, AF .GLOBL AD.CHN ;NUMBER OF AD01 CHANNELS .IF NDF,AD.CHN AD.CHN= 0 .ENDC .GLOBL AD.PRI ;ALTERNATE PRIORITY FOR AD01 .IF NDF,AD.PRI AD.PRI= 240 .ENDC .GLOBL AF.CHN ;NT NFILL= ^D4 ;NUMBER OF FILL CHARACTERS FOR VT05 PPSIZE= ^D66 ;ACTUAL NUMBER OF LINES/PAGE PGSIZE= ^D62 ;NUMBER OF LINES/PAGE USED ; KEYBOARD PREAMBLE ; KB: .WORD 0 ;DDB PTR .BYTE KB.BP ;FACILITIES .BYTE 1 ;TERMINAL DEVICE .BYTE 4 ;BUFF SIZE/16 .BYTE KB.INT-KB ;INTERRUPT ENTRY .BYTE 200 ;PRIORITY=4 .BYTE KB.OP-KB ;OPEN .BYTE KB.TF-KB ;TRANSFER .BYTE KB.CL-KB ;CLOSE .BYTE 0 ;SPECIAL FCN .BYTE KB.TB-KB ;MISCELLANEOUS ENTRY KB.NM: .RAUCOMPUTE 16-BIT FRACTION BVS CAV ;DATA IS FOR COMPLETE TIME MOV #^D10000,R2 ;CONVERT TO HUNDREDTHS CALL MULTR ; OF PER CENT MOV #-2,R0 ;SET DECIMAL INDICATOR MOV #PART,R2 ;SET DEST. PNTR MOV #^D6,R3 ;SET FIELD WIDTH CALL SCVRT ;CONVERT TO ASCII MOV #PMES,VL2 ;CAUSE SPECIAL HEADING LINE .PAGE CAV: ; COMPUTE ALL AVERAGES IN INTERNAL FORMAT : CLR SCNT ;INIT SHIFTER COUNT MOV LOSCAN,R0 ;GET LO-ORDER SCANS MOV HISCAN,R1 ; AND HI-ORDER SCANS 1$: TST R1 ;HI = 0 ? BEQ 2$ ;YES:VL SY.TRL ;SUSPEND-XFR FCN, LOCKED FOR ANOTHER TASK .GLOBL SY.TRR ;SUSPEND-XFR FCN, RESERVED .GLOBL SY.TRT ;SUSPEND-XFR FCN, LOCKED FOR THIS TASK SY.WL= 1 ;WAIT, LOCKED SY.OR= 2 ;OPEN, RESERVED SY.OL= 3 ;OPEN, LOCKED FOR ANOTHER TASK SY.OF= 4 ;OPEN, FULL SY.OLT= 5 ;OPEN, LOCKED FOR THIS TASK. SY.CR= 6 ;CLOSE, RESERVED SY.CL= 7 ;CLOSE, LOCKED FOR ANOTHER TASK SY.CF= 10 ;CLOSE, FULL SY.CLT= 11 ;CLOSE, LOCKED FOR THIS TASK. SY.WRR= 12 ;WRITE, RESERVED SY.WRL= 13 ;WRITE, LOCKED FOWUMBER OF AFC CHANNELS .IF NDF,AF.CHN AF.CHN= 0 .ENDC .IF NDF,DC.DSC DC.DSC= 0 .ENDC .IF NDF,DF.DSC DF.DSC= 0 .ENDC .IF NDF,DK.DSC DK.DSC= 0 .ENDC .IF NDF,DT.DSC DT.DSC= 0 ;NUMBER OF DECTAPE UNITS .ENDC ; ; DEFAULT LINE PRINTER WIDTH .GLOBL PRSIZE ;COLUMN WIDTH OF LINE PRINTER. .IF NDF,PRSIZE PRSIZE= 80. .ENDC ; ; DEVICE BUFFERS ; .GLOBL KBBUF ;ADDRESS OF KB KEYBOARD EXEC BUFFER. .GLOBL LPBUF ;ADDRESS OF LP BUFFER. .GLOBL PPBUF ;ADDRESS OF PP BUFFER. .GLOBL PRBUF ;ADDRESS XD50 /KB/ ;NAME ; ; TELEPRINTER PREAMBLE ; KBO: .WORD 0 ;DDB PTR .BYTE KBO.BP+SY.MUD ;FACILITIES .BYTE 1 ;TERMINAL DEVICE .BYTE 4 ;BUFF SIZE/16 .BYTE KBO.IN-KBO ;INTERRUPT ENTRY .BYTE 200 ;PRIORITY=4 .BYTE KBO.OP-KBO ;OPEN .BYTE KBO.TF-KBO ;TRANSFER .BYTE KBO.CL-KBO ;CLOSE .BYTE 0 ;SPECIAL FCN .BYTE KBO.TB-KBO ;MISCELLANEOUS ENTRY KBO.NM: .RAD50 /KB/ ;MISCELLANEOUS ENTRY DISPATCH TABLE FOR KEYBOARD KB.TB: 0 0 0 KB.S ;CANCEL ;MISCELLANEOUS ENTRY DISPATCH TABLE FOR PRIY NO MORE SHIFTS NEEDED ; C CONDITION CODE CLEAR HERE ! ROR R1 ;DIVIDE BY ROR R0 ; 2 INC SCNT ;COUNT SHIFT BR 1$ ;TEST AGAIN 2$: MOV R0,CAVD ;SET DIVISOR MOV R0,CAVR ;SET 1/2 DIVISOR ... CCC ; TO USE FOR ROR CAVR ; ROUNDING CLR R5 ;INIT. INDEX CAV1: MOV R$LTOT(R5),R0 ;GET LOW SUM ... MOV R$HTOT(R5),R1 ;... AND HIGH SUM MOV (PC)+,R3 ;GET SHIFT COUNT SCNT: .WORD 0 BEQ 4$ ;NO SHIFTS NEEDED 3$: CLC ;DIVIDE ROR R1 ; BY ROR R0 ; TWO DEC R3 ;ENOUGH? BGT 3$ ZR ANOTHER TASK SY.WLT= 14 ;WRITE, LOCKED FOR THIS TASK SY.RLT= 15 ;RELEASE, LOCKED FOR THIS TASK. SY.SPR= 16 ;SPECIAL FCN-RESERVED SY.SPL= 17 ;SPECIAL FCN-LOCKED FOR ANOTHER TASK SY.SPT= 20 ;SPECIAL FCN-LOCKED FOR THIS TASK SY.TRR= 21 ;XFR FCN, RESERVED SY.TRL= 22 ;XFR FCN, LOCKED FOR ANOTHER TASK SY.TRT= 23 ;XFR FCN, LOCKED FOR THIS TASK ; ; ERROR CLASSES *(2^8) ; .GLOBL S.EINF ;INFORMATIONAL CLASS MESSAGE .GLOBL S.EACT ;ACTION CLASS MESSAGE .GLOBL S.EWAR ;WARNING CLASS MESSAGE [OF PR BUFFER. .GLOBL TPBUF ;ADDRESS OF KB OUTPUT EXEC BUFFER. ; ; SET DUMMY BUFF SIZES FOR KB,PR,PP,LP ; .GLOBL KBFSZ ;KB&TT KEYBOARD EXEC BUFFER SIZE. .IF NDF,KBFSZ KBFSZ= 0 .ENDC .GLOBL TPSZ ;SIZE (BYTES) OF KB&TT OUTPUT EXEC BUFFER. .IF NDF,TPSZ TPSZ= 0 .ENDC .GLOBL PRSZ ;SIZE(BYTES) OF PR EXEC. BUFFER. .IF NDF,PRSZ PRSZ= 0 .ENDC .GLOBL PPSZ ;SIZE (BYTES) OF PP EXEC BUFFER. .IF NDF,PPSZ PPSZ= 0 .ENDC .GLOBL LPSZ ;SIZE (BYTES) OF LP EXEC BUFFER. .IF NDF,LPSZ LPSZ= 0 .ENDC \NTER KBO.TB: 0 KBO.TO ;TIME OUT 0 0 .IF NE,TK.NOU ; MULTI-KEYBOARD/TELEPRINTER DRIVER ; ; GLOBAL DEFINITIONS ; .GLOBL TODDB ;TT TELEPRINTER DDB. .GLOBL TT ;TT DRIVER. .GLOBL TTDDB ;TT KEYBOARD DDB. ; ; GLOBAL REFERENCES ; .GLOBL TKBUF ;ADDRESS OF TT KEYBOARD EXEC BUFFER. .GLOBL TOBUF ;ADDRESS OF TT OUTPUT EXEC BUFFER. ; ;PARAMETER TK.NOU DEFINES THE NUMBER OF UNITS ; ; ; KEYBOARD PREAMBLE TT:TK: .WORD 0 ;DDB POINTER ON ENTRY .BYTE TK.BP ;FACILITIES .BYTE 1 ;TERMIN];NO: SHIFT AGAIN 4$: MOV (PC)+,R2 ;GET DIVISOR CAVD: .WORD 0 ADD (PC)+,R0 ;CAUSE ROUNDING ... CAVR: .WORD 0 ADC R1 ; ... CALL DIVIDE ;COMPUTE AVERAGE MOV R1,R$LTOT(R5) ;STORE AVERAGE TST (R5)+ ;ADVANCE INDEX CMP R5,#AA.LIM ;FINISHED? BLO CAV1 ;NOT YET .PAGE MOV RNDEX,R5 ;GET REPORT INDEX TST SPFLAG ;NORMAL REPORT? BEQ NORM2 ;YES MOV SPREP(R5),R0 ;GOT SPECIAL REPORT? BEQ NORM2 ;NO: USE NORMAL JMP @R0 ;YES: GO TO IT NORM2: MOV REPP(R5),R5 ;GET PNTR TO REPORT SPECS NX^ .GLOBL S.EFAT ;FATAL CLASS MESSAGE .GLOBL S.ESYS ;SYSTEM PROGRAM CLASS MESSAGE .GLOBL S.EREL ;REAL TIME ERROR(ILLEGAL ACTION) ; S.EINF= 0 ;INFORMATIONAL S.EACT= 400 ;ACTION S.EWAR= 1000 ;WARNING S.EFAT= 1400 ;FATAL S.ESYS= 2000 ;SYSTEM PROGRAM S.EREL= 2400 ;REAL-TIME ONLY (ACTION FATAL) ; ;COMMANDS FOR OUTPUT CIRCULAR BUFFER ; .GLOBL SY.OPN ;CMD-OPEN .GLOBL SY.CLS ;CMD-CLOSE .GLOBL SY.TRA ;CMD-TRANS .GLOBL SY.WR ;CMD-WRITE .GLOBL SY.CLI ;CMD-INPUT CLOSE .GLOBL SY.WAP ;CM_ .PAGE KBBUF: .BLKB KBFSZ ;CONSOLE TPBUF: .BLKB TPSZ ;TELEPRINTER PRBUF: .BLKB PRSZ ;PAPER READER PPBUF: .BLKB PPSZ ;PAPER PUNCH LPBUF: .BLKB LPSZ ;LINE PRINTER .IF NE,TK.NOU .GLOBL TKBUF ;ADDRESS OF TT KEYBOARD EXEC BUFFER. TKBUF: .BLKB TK.NOU*KBFSZ .GLOBL TOBUF ;ADDRESS OF TT OUTPUT EXEC BUFFER. TOBUF: .BLKB TK.NOU*TPSZ .ENDC .IF DF,IO.XTH ;MUST BE DEFINED .IF LE,IO.XTH-3 ;IF NO CHARACTER I/O NO.FIL= 0 ;SUPPRESS FILE ROUTINES .IF EQ,IO.XTH ;IF NO I/O NO.DTO= 0 ;SUPPRESS `AL DEVICE .BYTE 4 ;STD BUFF SIZE .BYTE TK.INT-TK ;INTERRUPT ENTRY .BYTE 200+TK.NOU-1 ;PRIORITY 4 PLUS MAX UNIT NUMBER. .BYTE TK.OP-TK ;OPEN .BYTE TK.TF-TK ;TRANSFER .BYTE TK.CL-TK ;CLOSE .BYTE 0 ;SPECIAL FCN .BYTE TK.TB-TK ;MISCELLANEOUS ENTRY TK.NM: .RAD50 /TT/ ;NAME ; TELEPRINTER PREAMBLE TKO.TF=TT.TF ;TRANSFER TKO.INT=TT.INT ;INTERRUPT TKO: .WORD 0 ;DDB PTR .BYTE TKO.BP+SY.MUD ;FACILITIES .BYTE 1 ;TERMINAL DEVICE .BYTE 4 ;STD BUFF SIZE .BYTE TKO.INT-TKO ;INTERRUaT: MOV (R5)+,R1 ;MESSAGE NEXT? BNE 1$ ;YES CALL @(R5)+ ;EXECUTE ROUTINE BR NXT ;LOOP 1$: CALL SETP ;SETUP FOR CREATING LINE .PUSH ;PUSH ZERO AS INDICATOR 2$: MOVB (R1)+,R0 ;GET NEXT CHARACTER BEQ 4$ ;END OF SUBSTRING BMI 3$ ;START OF NEW SUBSTRING CMPB R0,#'^ ;SPECIAL "ARG." CHARACTER? BEQ 5$ ;YES MOVB R0,(R2)+ ;MOVE CHAR. TO LINE BUFFER BR 2$ ;GO GET NEXT CHAR. 3$: .PUSH R1 ;SAVE SRC PNTR ASL R0 ;GET NEW SUBSTRING ADDRESS MOV SSTAB+400(R0),R1 BR 2$ ;CONTINUE ON bD-WRAP AROUND SY.OPN= 2 ;OPEN SY.CLS= 4 ;CLOSE SY.TRA= 6 ;TRANS SY.WR= 10 ;WRITE SY.CLI= 12 ;SPECIAL INPUT CLOSE. SY.WAP= 14 ;WRAP AROUND ; ;FLAG IN USER LINE BUFFER TO CONTROL ATTACH/DETACH ;STAY ATTACHED UNLESS=1 ; .GLOBL SY.DET ;FREE BIT SY.DET= 40 ;BIT 5 OF MODE BYTE ; .GLOBL SY.MUD ;DRIVER MULTI-ACCESS BIT. SY.MUD= 1 ; INDEXES INTO DDB USED BY AD/AF/UDC DRIVERS ; AND SUBROUTINES. ; .GLOBL PI.FCN ;DDB-SPECIAL FCN CODE STORE .GLOBL PI.ADR ;DDB-ADDRESS OF MUX ARRAYcDEVICE TIME-OUT ROUTINES NO.STT= 0 ;SUPPRESS STATUS REQUEST ROUTINES .ENDC .ENDC .ENDC ; THE FOLLOWING GENERATES DUMMY ROUTINES ; AND OR 0 GLOBAL VALUES TO CONTROL ; LINKING OF NON-DESIRED ROUTINES. ; ; DUMMY ROUTINES FOLLOW ; .IF DF,NO.DTO ;IF NO DEVICE TIME-OUT .GLOBL TIMOUT ;DEVICE TIMOUT CODE TIMOUT: ;FALL INTO RTS PC .ENDC .GLOBL TDS ;TIME DEPENDENT SCHEDULER .IF DF,NO.TIM ;IF NO TIME DEPENDENT SCHEDULING TDS: ;FALL INTO RTS PC .ENDC .GLOBL PAND ;PANIC DUMP SWITCH-DEdPT ENTRY .BYTE 200+TK.NOU-1 ;PRIORITY 4 PLUS MAX UNIT # .BYTE TKO.OP-TKO ;OPEN .BYTE TKO.TF-TKO ;TRANSFER .BYTE TKO.CL-TKO ;CLOSE .BYTE 0 ;SPECIAL FCN .BYTE TKOTB-TKO ;MISCELLANEOUS ENTRY TKO.NM: .RAD50 /TT/ ;NAME ;MISCELLANEOUS ENTRY DISPATCH TABLE FOR TT KEYBOARD TK.TB: 0 0 0 TT.S ;CANCEL ;MISCELLANEOUS ENTRY DISPATCH TABLE FOR TT PRINTER TKOTB: 0 TKO.TO ;TIME OUT 0 0 .ENDC ; TRANSFERS TO KB KB.INT: JMP KB.INA ;INTERRUPT KB.OP: JMP KB.OPA ;OPEN KB.CL=KB.OP ;CLOSEeNEW SUBSTRING 4$: .POP R1 ;GET PREVIOUSLY SAVED PNTR BNE 2$ ;CONTINUE PREVIOUS SUBSTRING CALL ENDMES ;TERMINATE & WRITE LINE BR NXT ;LOOP 5$: .PUSH R1 ;SAVE R1 CALL @(R5)+ ;CALL SPECIAL ROUTINE .POP R1 ;RESTORE R1 BR 2$ ;GO GET NEXT CHARACTER EXIT: .CLOSE #OLNK ;CLOSE OUTPUT DATASET .RLSE #OLNK ;RELEASE IT .EXIT .PAGE .SBTTL GENERAL ROUTINES PAGE: MOV (PC)+,R1 ;PNTR. TO UNITS PAGE NO. DIGIT PNU: .WORD 0 CMPB @R1,#'9 ;CARRY YET? BLO 1$ ;NO MOVB #'0,@R1 ;STOREf .GLOBL PI.NUM ;DDB-NUMBER OF POINTS .GLOBL PI.DAT ;DDB-ADDRESS OF DATA ARRAY .GLOBL PI.ERR ;DDB-ADDRESS OF FINAL STATUS .GLOBL PI.FST ;DDB-FIRST CHANNEL NUMBER FOR SEQUENTIAL OPS. .GLOBL PI.FAD ;DDB-ADDRESS OF # OF POINTS PI.FCN= 20 ;STORAGE FOR FUNCTION CODE. PI.ADR= 4 ;STORE FOR ADDRESS OF CONNECTION DATA ARRAY PI.NUM= 6 ;STORE FOR NUMBER OF POINTS. PI.DAT= 10 ;STORE FOR ADDRESS OF DATA ARRAY PI.ERR= 24 ;STORE FOR ADDRESS OF TRANSFER STATUS. PI.FST= 22 ;STORE FOR FIRST CHANNEL NUMgFINE=DEVICE CSR FOR DUMP .IF NDF,PAND ;IF NO PANIC DUMP PAND= 0 .ENDC .IF EQ,PAND ;IF NO PANIC DUMP PDMP$: ;FALL INTO RTS PC .ENDC ; DUMMY RTS PC RTS %7 ;ALWAYS GENERATED. .GLOBL PAN$ ;PANIC DUMP ADDRESS. .IF EQ,PAND ;IF NO PANIC DUMP PAN$: HALT ;SYSTEM HALT .ENDC ; CREATE REQUIRED GLOBALS = 0 ; .IF DF,NO.FIL ;IF NO FILE MANAGEMENT .GLOBL ALO ;ALLOCATE HANDLER .GLOBL APP ;APPEND HANDLER .GLOBL DEL ;DELETE HANDLER .GLOBL DIR ;DIRECT HANDLER .GLOBL PRO ;PROTECT HANDLER .Gh KB.TF: JMP KB.TFA ;TRANSFER .IFNZ TK.NOU ; TRANSFERS TO TT KEYBOARD TK.INT: JMP TK.INA ;INTERRUPT TK.OP: JMP TK.OPA ;OPEN TK.CL: JMP TK.CLA ;CLOSE TK.TF: JMP TK.TFA ;TRANSFER .ENDC ; ; PARAMETERS ; .IFNDF KBSZ KBSZ=80. ;KEYBOARD TYPE AHEAD BUFFER SIZE .ENDC .IFNDF EBSZ EBSZ=10. ;ECHO BUFFER SIZE .ENDC S.STAT=-2 ;ADDRESS OF STATUS REGISTER KBO.BP=322 ;FACILITIES=OUTPUT, ASCII, OPEN, CLOSE TKO.BP=322 KB.BP=324 ;FACILITIES=INPUT, ASCII, OPEN, CLOSE TK.BP=324 ; ; i '0' CMPB -(R1),#SPACE ;1ST TIME? BNE 1$ ;NO MOVB #'0,@R1 ;STORE '0' 1$: INCB @R1 ;BUMP DIGIT .WRITE #OLNK,#HDNG ;WRITE HEADING .WRITE #OLNK,VL2 ;WRITE VARIABLE 2ND LINE .WAIT #OLNK ;WAIT FOR COMPLETION MOVB #FORM,HFF ;PUT FF IN HEADING FOR ALL BUT 1ST RETURN VL2: .WORD NULINE ;PNTR TO 2ND LINEBUFFER FOR HEADING .PAGE .SBTTL TABLES & LISTS HDGL: .WORD R1H .WORD R2H .WORD R3H .WORD R4H .WORD R5H .WORD R6H SPREP: .WORD R123S .WORD R123S .WORD R123S .WORD R1BER. PI.FAD= 34 ;STORE FOR ADDR OF # OF POINTS. kLOBL REN ;RENAME HANDLER ALO= 0 APP= 0 DEL= 0 DIR= 0 PRO= 0 REN= 0 .ENDC .IF DF,NO.STT ;IF NO STATUS EMT .GLOBL STT ;STATUS HANDLER STT= 0 .ENDC .IF DF,NO.CSI ;IF NO CSI .GLOBL CSM ;SI-SEMANTI .GLOBL CSX ;CSI-SYNTAX CHECKER CSM= 0 CSX= 0 .ENDC .IF DF,NO.GUT ;IF NO GENERAL UTILITIES .GLOBL GUT ;GENERAL UTILITIES HANDLER GUT= 0 .ENDC .IF NDF,RSX11B ;IF NOT RSX-11B .GLOBL FPMT FPMT= 0 ;FILE PROCESSOR EMT'S .ENDC .IF DF,NO.TIM ;IF NO TIME DEPENDENT SCHEDULING .GLOBLlCONSOLE OUTPUT OPEN ENTRY ; KBO.OP: MOV #-1,R4 ;SET BYTE COUNT BR KBO.OC ; ; CONSOLE OUTPUT CLOSE ENTRY KBO.CL: MOV #-3,R4 ;SET BYTE COUNT KBO.OC: MOV #-2,R5 ;UNIT # .IFNZ TK.NOU BR TKO.CA ; ; NON-CONSOLE OUTPUT OPEN ENTRY TKO.OP: MOV #-1,R4 ;SET BYTE COUNT BR TKO.OC ; ; NON-CONSOLE OUTPUT CLOSE ENTRY TKO.CL: MOV #-3,R4 ;SET BYTE COUNT TKO.OC: CLR TKO ;NOT BUSY JSR PC,TT.GU ;GET UNIT # .ENDC TKO.CA: MOV #S.OPCL,TKO.BF(R5) ;SET DATA POINTER CLR COF(R5) ;CLEAR ^O AND X-OFFm23S .WORD R123S .WORD 0 REPP: .WORD R123T .WORD R123T .WORD R123T .WORD R4T .WORD R5T .WORD R6T .PAGE .SBTTL "SPECIAL" SHIFT REPORT .MCALL .BIN2D R123S: CALL PAGE .WRITE #OLNK,#SPHEAD CLR R3 1$: CALL SETP MOV A$ID(R3),R1 CALL EXPAND 2$: CMP R2,#LBUF+^D39 BHIS 3$ MOVB #SPACE,(R2)+ BR 2$ 3$: MOV #LBUF+^D39,R2 CALL AVERS MOV R$MIN(R3),R1 CALL SPCM MOV R$MINT(R3),R1 CALL SPCT MOV R$MAX(R3),R1 CALL SPCM MOV R$MAXT(R3),R1 CALL SPCT MOVB #SPACE,(R2n .TITLE DT ; ; VERSION V001A ; 001 ; ; COPYRIGHT 1971,DIGITAL EQUIPMENT CORP. ; MAYNARD,MASS.01754 ;++ ; EDITS: ; ; 20-JUN-74 JER USE .REPT TO GENERATE DDB'S ; ; 24-JUN-74 JER CHANGE HANDLER ACTION FOR SELECT ERROR ; OR ILLEGAL OPERATION: ; INSTEAD OF A002 MESSAGE, GIVE OPERATION ; COMPLETE AND NEW ERROR STATUS BIT ; IN DDB XFER FNCTN / STATUS WORD: ; BIT13: OPERATOR RECOVERABLE ERROR ; ; 17-JUL-74 JER IMPLEMENT CONDITIONAL WHICH, IF ; DEFINED, WILL PRODUCEo CLOCK ;CLOCK SCAN ROUTINE .GLOBL ETRNON ;TURNON HANDLER .GLOBL EWAIT ;WAIT HANDLER(RSX WAIT) .GLOBL ROBIN ;ROUND ROBIN SCHEDULER .GLOBL TOD ;TIME OF DAY HANDLER .GLOBL UNCLOC ;UNCLOCK HANDLER CLOCK= 0 ETRNON= 0 EWAIT= 0 ROBIN= 0 TOD= 0 UNCLOC= 0 .ENDC .IF DF,NO.OPR ;IF NO OPERATOR TASK OPHED= 0 .ENDC .IF DF,NO.GET ;IF NO ON-LINE LOADER LODHED= 0 .ENDC ; I/O CONTROL REFERENCES. ; ; THE FOLLOWING SELECTS A SET OF GLOBALS DEPENDENT ON ; THE VALUE OF THE SWITCH IO.XTH Ap FLAGS BR TKO.A ;CONTINUE AS NORMAL TRANSFER. ; ; CONSOLE OUTPUT TRANSFER ENTRY ; KBO.TF: MOV #-2,R5 ;UNIT # .IFNZ TK.NOU BR TT.TFA ;JOIN NON-CONSOLE ENTRY. ; NON-CONSOLE OUTPUT TRANSFER ENTRY ; TT.TF: CLR TKO ;NOT BUSY JSR PC,TT.GU ;GET UNIT # .ENDC TT.TFA: MOV 6(R0),TKO.BF(R5) ;SET INTERNAL DATA POINTER. MOV 10(R0),R4 ;GET WORD COUNT. ASL R4 ;CHANGE TO BYTE COUNT TKO.A: MOV R4,TKO.CT(R5) ;SET INTERNAL COUNT. MOV R0,TKO.TS(R5) ;SAVE THE DDB POINTER. PRSTRT: MOV #3*400+376,Sq)+ CALL TOTS ;CONVERT TOTAL CALL ENDMES TST (R3)+ CMP R3,#AA.LIM BLO 1$ JMP EXIT SPCM: MOVB #SPACE,(R2)+ JMP CM SPCT: MOVB #SPACE,(R2)+ MOVB R1,R0 CALL CVT2 SWAB R1 MOVB R1,R0 JMP CVT2S .PAGE .SBTTL ASCII CONVERSION ROUTINES AVER: MOV (R5)+,R3 ;GET POINT INDEX AVERS: MOV R$LTOT(R3),R1 ;GET AVERAGE BR JCM ;CONVERT & RETURN MINST: MOV (R5)+,R3 ;GET POINT INDEX MOV R$MINT(R3),TTIME ;GET MIN TIME MOV R$MIND(R3),TDATE ; AND MIN DATE (FOR MONTHLY ONLY) MOV R$Mr ORIGINAL DEC ; VERSION OF HANDLER (A002 MESSAGE) ; ;-- ; ; DECTAPE DRIVER ; ; GLOBL DEFINITIONS ; .GLOBL DT .GLOBL DTDDB ;DDL ENTRY ; .IFNDF DT.DSC DT.DSC=2 .ENDC ; ; ; ; GLOBL REFERENCES ; .GLOBL DV.A2 ;ROUTINE TO GENERATE A002 MESSAGE .GLOBL SY.QLK ;QUEUE LINK TO ACTIVE DDB'S .GLOBL SRTI ;COMMON EXIT TO SCHEDULER .GLOBL STRG ;COMMON REGISTER STORE ROUTINE .GLOBL SY.DFL ;DDB FLAG BYTE .GLOBL SY.DWN ;DEVICE DOWN BIT .GLOBL SY.DPR ;PERMANENT DDB BIT .GLOBsS ; FOLLOWS (SET BY THE USER). ; ; IO.XTH =0 NO I/O. ; =1 PROCESS I/O ONLY. ; =2 XFR I/O ONLY. ; =3 PROCESS AND XFR I/O. ; =4 CHARACTER I/O ONLY. ; =5 PROCESS AND CHARACTER I/O. ; =6 XFR AND CHARACTER I/O. ; =7 ALL TYPES OF I/O. ; ; IF THE USER DOES NOT DEFINE IO.XTH, THE ASSUMED ; VALUE IS 7. ; .IF NDF,IO.XTH IO.XTH= 7 ;DEFAULT VALUE .ENDC ; GLOBALS OF INTEREST .GLOBL CLS ;CLOSE HANDLER .GLOBL CL.E ;CLOSE-ACTIVATE AFTER BUFFER FULL .GLOBL CL.F ;CLOSE-ACTIVATE AFTtY.TO(R0) ;ENABLE TIME OUT BIS #100,@TKO.CS(R5) ;ENABLE INTERRUPT RTS PC ; ;CONSOLE OUTPUT TIME OUT KBO.TO: MOV #-2,R5 ;SET CONSOLE UNIT # .IF NE,TK.NOU BR TO.COM ;NON CONSOLE TIME OUT TKO.TO: JSR PC,TT.GU ;GET UNIT # TO.COM: .ENDC TSTB SY.INH(R0) ;HAVE SEVERAL TIMEOUTS OCCURRED? BNE TT.NUL ;NO-TRY AGAIN JMP SWAPA ;SWITCH TO ALTERNATE DEVICE IF POSSIBLE TT.NUL: MOVB #-2,SY.TO(R0) ;ENABLE TIMEOUT MOV TKO.CS(R5),R5 ;GET CSR ADDRESS MOV #100,(R5)+ ;MAKE SURE INTERRUPT ENABLED CLRuIN(R3),R1 ;GET MINIMUM BR JCM ;CONVERT & RETURN MAXST: MOV (R5)+,R3 ;GET POINT INDEX MOV R$MAXT(R3),TTIME ;GET MAX TIME MOV R$MAXD(R3),TDATE ; AND MAX DATE (FOR MONTHLY ONLY) MOV R$MAX(R3),R1 ;GET MAXIMUM BR JCM ;CONVERT & RETURN MMTIMD: CALL MMTIM ;MOVE TIME INTO LINE MOVB #SPACE,(R2)+ ;SPACE MOVB #SPACE,(R2)+ MOV (PC)+,R0 ;GET PREVIOUSLY SET DATE TDATE: .WORD 0 JMP C.B2DA ;CONVERT IT & RETURN MMTIM: MOVB (PC)+,R0 ;GET HOURS TTIME: THR: .BYTE 0 ;TEMP. STORAGE TMN: .BYvL SY.LOC ;LOCK BIT IN DDB FLAG .GLOBL SY.RTN ;TASK # DDB RESERVED FOR .GLOBL SY.SCB ;TASK # DDB RESERVED FOR .GLOBL SY.TO ;DDB TIMEOUT COUNT .GLOBL S.CDB ;ENTRY ADDRESS TO DDB QUEUER .GLOBL S.CDQ ;ENTRY ADDRESS TO DDB DEQUEUER ; ; STANDARD DRIVER TABLE: ; DT: .WORD 0 ;BUSY FLAG (DDB ADDR WHEN BUSY) .BYTE 37,300 ;FACILITY INDICATOR .BYTE 16. ;STD BUFF SIZE/16. .BYTE DT.INT-DT ;POINTER TO INT SVCE .BYTE 340+DT.DSC-1 ;INT SVCE PRIORITY AND MAX UNITS .BYTE 0 ;DESPATCH TABLE .wER DDB LOCKED .GLOBL CL.G ;CLOSE-ACTIVATE AFTER DDB RESERVED .GLOBL CL.M ;CLOSE-ACTIVATE AFTER DDB LOCKED(THIS TASK) .GLOBL INR ;INIT HANDLER .GLOBL OPN ;OPEN HANDLER .GLOBL OP.H ;OPEN-ACTIVATE AFTER DDB RESERVED .GLOBL OP.J ;OPEN-ACTIVATE AFTER BUFFER FULL .GLOBL OP.K ;OPEN-ACTIVATE AFTER DDB LOCKED .GLOBL OP.M ;OPEN-ACTIVATE AFTER DDB LOCKED(THIS TASK) .GLOBL RLS ;RELEASE HANDLER .GLOBL RWN ;READ-WRITE HANDLER .GLOBL RW.K ;RWN-ACTIVATE AFTER DDB LOCKED(THIS TASK) .GLOBL RW.M ;RWNxB @R5 ;OUTPUT A NULL RETURN ;EXIT TO SEE IF TIME-OUT RE-OCCURRS ; ; CONSOLE OUTPUT INTERRUPT ENTRY ; KBO.IN: JSR R5,STRG ;SAVE REGISTERS SUB PC,R5 ;SET CONSOLE UNIT NUMBER .IFNZ TK.NOU BR TT.INB ;JOIN NON-CONSOLE ENTRY ; ; NON-CONSOLE OUTPUT INTERRUPT ENTRY ; TT.INT: MOV S.STAT,TT.TMP ;SAVE CURRENT STATUS TO GET UNIT #. JSR R5,STRG ;SAVE REGISTERS. MOV (PC)+,R5 ;GET UNIT # TT.TMP: 0 JSR PC,TT.GUA ;GO SAVE UNIT # .ENDC TT.INB: MOV yTE 0 ; FOR MAX/MIN TIMES CALL CVT2 ;CONVERT IT MOVB TMN,R0 ;GET MINUTES JMP CVT2S ;CONVERT & RETURN AMM: CALL AVER ;CONVERT AVERAGE MOV R$MIN(R3),R1 ;GET MINIMUM CALL C3 ;CONVERT IT MOV R$MAX(R3),R1 ;GET MAXIMUM C3: CALL S3 ;3 SPACES JCM: JMP CM ;CONVERT & RETURN MM: MOV (R5)+,R3 ;GET POINT INDEX MOV R$MIN(R3),R1 ;GET MINIMUM CALL CM ;CONVERT IT MOV R$MAX(R3),R1 ;GET MAXIMUM MOV #^D10,R0 ;SET COUNTER CALL SV ;10 SPACES BR JCM ;CONVERT & RETURN AMMT: CALL AMM z... .BYTE DT.TFR-DT ;...FOR TRANSFER ONLY! .BYTE 0 .BYTE 0 .BYTE DT.TB-DT ;MISCELLANEOUS TABLE ENTRY DT.NAM: .RAD50 'DT' .WORD DT.DIR ;FIXED MFD BLOCK ; ; MISCELLANEOUS ENTRY TABLE ; DT.TB: 0 ;POWER FAIL DT.TO ;TIMEOUT ENTRY DT.CO ;CONTINUE ENTRY DT.CA ; CANCEL ENTRY ; ; REGISTER ASSIGNMENTS: ; R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ; ; SYMBOL DEFINITIONS ; DTUFD=102 ;STARTING UFD BLOCK DT.DIR=100 ;STARTING MFD BLOCK DT.TST=177340 ;DECTAPE UP{-ACTIVATE AFTER DDB LOCKED .GLOBL RW.N ;RWN-ACTIVATE AFTER DDB RESERVED .GLOBL SPC ;SPECIAL FCN HANDLER .GLOBL SP.G ;SPC-ACTIVATE AFTER DDB LOCKED .GLOBL SP.H ;SPC-ACTIVATE AFTER DDB RESERVED .GLOBL SP.I ;SPC-ACTIVATE AFTER DDB LOCKED(THIS TASK) .GLOBL STT ;STATUS HANDLER .GLOBL TR.G ;XFR-ACTIVATE AFTER DDB LOCKED .GLOBL TR.H ;XFR-ACTIVATE AFTER DDB RESERVED .GLOBL TR.I ;XFR-ACTIVATE AFTER DDB LOCKED(THIS TASK) .GLOBL XFR ;XFR FUNCTION HANDLER .GLOBL WAI ;WAIT HANDLER .GLOBL WAR ;W|#SRTI,-(SP) ;DRIVER EXIT ADDRESS MOV TKO.TS(R5),R0 ;DDB ADDRESS CLR SY.TO(R0) ;NO TIME OUT TT.INC: MOVB #200,S.STAT ;DROP PRIORITY CLR @TKO.CS(R5) ;DISABLE INTS. MOV TKO.TS(R5),R0 ;GET PROPER DDB POINTER. TSTB TKO.FF(R5) ;FF OUTPUT OR FILLS IN PROGRESS? BEQ 3$ ;NO TST R5 ;VT05? BLT 1$ ;YES JMP TKO.K ;NO...FORM FEED 1$: DECB TKO.LC(R5) ;DEC COUNTER BGT 2$ ;NOT LAST CLR TKO.LC(R5) ;CLEAR FLAG & COUNTER 2$: CLR R2 ;R2=NULL BR TKO.F ;GO OUTPUT NULL 3$: TSTB TKO.TP(R5) ;TAB O} ;CONVERT AV,MIN,&MAX CALL S3 ;3 SPACES BR TOTS ;GO DO TOTAL LPGAS: MOV #A001,R3 ;SET POINT INDEX MOV #^D7200,TD ;SET DIVISOR MOVB A$PWR(R3),R1 ;GET POWER OF TEN SUB #-1,R1 ;CORRECT IT MOVB R1,TP ;SET POWER OF TEN BR TOTC TOT: MOV (R5)+,R3 ;GET POINT INDEX TOTS: MOV #^D17280,TD ;SET DIVISOR MOVB A$PWR(R3),TP ;SET POWER OF TEN INDICATOR TOTC: .PUSH R3 ;SAVE POINT INDEX .PUSH R2 ;SAVE DEST. PNTR. MOV R$LTOT(R3),R1 ;GET AVERAGE MOV A$SPAN(R3),R2 ;GET POINT SPAN CALL MU~PER PAGE REGISTERS DT.CCM=177342 DT.CBA=177346 DT.CDT=177350 .PAGE ; ; CONTINUE ENTRY ; DT.CO: MOVB SY.QLK-1(R0),R1 ;SET ENTRY TO PROLOGUE TABLE JMP S.CDB ;GO QUEUE THE REQUEST ; ; SET UP INITIAL TRANSFER ; DT.TFR: MOV @PC,DT.RTC ;SET RETRY COUNT DT.PR1: MOVB #-2,SY.TO(R0) ;ENABLE TIMEOUT MOV #DT.CBA,R1 ;... & OF HWR BLOCK CLR @R1 CMP (R0)+,(R0)+ ;SKIP USER LINE IN DDB MOV (R0)+,DT.BRQ ;SAVE BLOCK NO FOR LATER MOV (R0)+,@R1 ;SET READY MEMORY ADDR ... MOV (R0)+,-(R1) ;... &AITR HANDLER ; DEFINE, AS 0, THOSE ROUTINES NOT NEEDED. .IF EQ,IO.XTH&1 ;IF NO PROCESS I/O ; SUPPRESS PROCESS I/O ROUTINES: SPC= 0 SP.G= 0 SP.H= 0 SP.I= 0 .ENDC .IF EQ,IO.XTH&2 ;IF NO DISK (OR DECTAPE) I/O ; SUPPRESS DISK (OR DECTAPE) I/O ROUTINES: TR.G= 0 TR.H= 0 TR.I= 0 XFR= 0 .ENDC .IF EQ,IO.XTH&4 ;IF NO CHARACTER I/O ; SUPPRESS CHARACTER I/O ROUTINES: CLS= 0 CL.E= 0 CL.F= 0 CL.G= 0 CL.M= 0 MS.HED= 0 LODHED= 0 OPHED= 0 OPN= 0 OP.H= 0 OP.J= 0 OP.K= 0 OP.M= 0 RWN= 0UTPUT IN PROGRESS? BEQ 4$ JMP TKO.T ;YES- 4$: MOVB @K.MPTR(R5),R2 ;SOMETHING IN SPECIAL OUTPUT STRING? BEQ 5$ ;NO JMP TKO.JI ;YES- 5$: MOVB CCTMP(R5),R2 ;CONTROL CHARACTER TO OUTPUT? BEQ TKO.JA ;NO JMP TKO.JJ ;YES- TKO.JA: TSTB EF(R5) ;ECHO IN PROGRESS? BPL TKO.JC ;NO JMP TKO.JB ;YES TKO.JC: TST TKO.CT(R5) ;HAS COMPLETION ALREADY OCCURRED? BLE TKO.JH ;NO RETURN ;YES...EXIT TKO.JH: BITB #SY.DWN,SY.DFL(R0) ;DEVICE DOWN? BNE TKO.JN ;YES TSTB XOF(R5) ;X-OFF FLAG SET? LTR ;MULTIPLY ADD A$LOW(R3),R1 ;ADD LOW VALUE MOV R1,R2 ;CONVERTED AVERAGE TO R2 MOV HISCAN,R1 ;HI-ORDER SCANS MOV LOSCAN,R0 ;LO-ORDER SCANS CALL MUL2 ;DOUBLE MULTIPLY MOV (PC)+,R2 ;GET DIVISOR TD: .WORD 0 CALL DIV2R ;DOUBLE DIVIDE .POP R2 ;GET DEST. PNTR. MOVB (PC)+,R0 ;SET POWER OF TEN INDICATOR TP: .WORD 0 MOV #^D8,R3 ;SET FIELD WIDTH CALL SCVRT ;PERFORM CONVERSION .POP R3 ;RESTORE POINT INDEX RETURN PCRS: .PUSH R2 ;SAVE DEST. PNTR MOV #AS02,R3 ;GET POINT INDEX WORD COUNT DT.PR2: CLRB DT.INT ;SET INT'RUPT SW. TO SRCH MOV DT.BRQ,DT.BCK ;SET BLK CTRL FOR SRCH MOV #100,R3 ;USED IN NEXT SEQUENCE MOV R3,DT.TAC ;SET TURN AROUND COUNT MOV @R0,-(SP) ;GET UNIT, DIRECTION & FUNC BIC #170341,@SP ;CLEAR POSS. GARBAGE BIS R3,@SP ;ADD IN INT ENB BIT BITB @SP,@PC ;WRITE REQD? BEQ .+6 ;(READ O.K. ALRDY)***** ADD #12,@SP ;IF SO GET DECTAPE EQUIV. MOVB @SP,DT.FRQ ;SAVE FUNC FOR LATER MOVB @PC,@SP ;RESET FUNC TO SRCH (INT ENB) ASL R3 ;(NOW CONTAIN RW.K= 0 RW.M= 0 RW.N= 0 .ENDC .IF EQ,IO.XTH ;IF NO I/O OF ANY KIND ; SUPPRESS GENERAL I/O ROUTINES: INR= 0 RLS= 0 WAI= 0 WAR= 0 .ENDC .IF EQ,TK.NOU ;IF NO TT ; CREATE DUMMY GLOBAL VALUES TO KEEP ; READ/WRITE AND OPEN HAPPY: .GLOBL DDL.TO ;DDL-TT OUTPUT SIDE .GLOBL DDL.TT ;DDL-TT INPUT SIDE .GLOBL TT ;TT DRIVER. DDL.TO= 0 DDL.TT= 0 TT= 0 .ENDC .IF EQ,TPSZ+KBFSZ ;IF NO KB ; CREATE DUMMY GLOBAL VALUES TO KEEP ; READ/WRITE AND OPEN HAPPY: .GLOBL DDL.KB ;DDL-KB INPUT SIDE BEQ TKO.JL ;NO MOVB #1,XOF(R5) ;INDICATE X-OFF HAS BEEN ACTED UPON CLR @TKO.CS(R5) ;DISABLE PRINTER INTERRUPTS CLR SY.TO(R0) ;DISABLE TIME-OUT RTS PC ;EXIT TKO.JL: TSTB COF(R5) ;^O FLAG SET? BEQ TKO.JP ;NO MOV TKO.CT(R5),R4 ;GET BYTE COUNT MOV TKO.BF(R5),R3 ;GET DATA POINTER TKO.JM: INC R4 ;COUNT CHARACTER BLE TKO.JO ;NOT DONE YET TKO.JN: MOV #1,TKO.CT(R5) ;SET BYTE COUNT AS IF XFER DONE ; OPERATION DONE: TKO.B: CLR @TKO.CS(R5) ;DISABLE INTERRUPTS JMP @14(R0) ;COMPLETION EX MOV R$LTOT(R3),R1 ;GET RETURN SLUDGE MOV #^D400,R2 ;MULT. BY (1000./2.5) ... CALL MULT MOV #A026,R3 ;GET POINT INDEX MOV R$LTOT(R3),R2 ;GET RAW SEWAGE .PUSH R2 ;CAUSE CCC ; ROUNDING ... ROR @SP ADD (SP)+,R0 ADC R1 CALL DIVIDE ;COMPUTE PERCENT .POP R2 ;RESTORE DEST. PNTR MOV #-^D1,R0 ;SET POWER OF TEN MOV #^D6,R3 ;SET FIELD WIDTH JMP SCVRT ;CONVERT & RETURN SRT: .PUSH R5 ;SAVE R5 MOV R2,(PC)+ ;SAVE DEST. PNTR. CVP: .WORD 0 JSR R4,THREAD ;ENTER THREADED MODE S 200)***** BIT @SP,#4000 ;TRAVEL FORWARD? BNE .+4 INC R3 ;IF SO R3 NOW 201 & SO ... MOVB R3,DT.SSW ;MAKING BPL OR BMI AS REQD MOV (SP)+,-(R1) ;SET DECTAPE CONTROL DT.RTS: RTS PC ;RETURN TO CALLER FOR NOW ;***** CARE USED AS LITERAL BY PREVIOUS INSTRUCTION!!! ; ; TIMEOUT ENTRY ; DT.TO: CLR SY.TO(R0) ;DISABLE TIMEOUT COUNT BICB #40,177776 ;DROP PRIORITY LEVEL MOV #DT.CCM,R1 ;ADDRESS OF WORD COUNT REGISTER BR DT.STE ;GO TO COMMON EXIT ; ; INTERRUPT SERVICE (A) - SEARCH IN PROGRE .GLOBL DDL.KO ;DDL-KB OUTPUT SIDE .GLOBL KB ;KB DRIVER. DDL.KB= 0 DDL.KO= 0 KB= 0 .ENDC .IF NE,IO.XTH ;IF ANY I/O OF ANY KIND ; CAUSE DDL INITIALIZATION CODE TO LOAD .GLOBL BEGDDL ;DDL INITIALIZATION CODE .ENDC ; FORCE DISK DUMP/RESTORE ROUTINE TO LINK: .GLOBL D.READ ;DISK DUMP/RESTORE ROUTINE ; FORCE EMT HANDLER AND MRT TABLE TO LINK: .GLOBL EMT. ;EMT HANDLER .GLOBL MRT. ;MONITOR RESIDENCE TABLE ; FORCE SYSTEM TASKS TO LINK(UNLESS ALREADY SUPPRESSED): .GLOBL LODHED ;ON-LIT ; TKO.JO: CMPB (R3)+,#'O-100 ;IS CHARACTER ^O? BNE TKO.JM ;NO...CHECK NEXT CLRB COF(R5) ;CLEAR ^O FLAG MOV R3,TKO.BF(R5) ;RESTORE DATA POINTER MOV R4,TKO.CT(R5) ; AND BYTE COUNT TKO.JP: INC TKO.CT(R5) ;COUNT THIS CHARACTER BGT TKO.B ;DONE- MOVB @TKO.BF(R5),R2 ;GET CHARACTER FOR OUTPUT. INC TKO.BF(R5) ;ADVANCE DATA POINTER. TKO.JG: CMPB R2,#40 ;CONTROL GROUP? BLO TKO.SP ;YES CMPB R2,#177 ;PRINTING CHARACTER? BHIS TKO.JA ;NO...IGNOR CVFLT,A056 ;PUSH BASIN 1 SUS. SOLIDS CVFLT,A057 ;PUSH BASIN 2 SUS. SOLIDS $ADR ;ADD LBV ;PUSH CONVERSION FACTOR $MLR ;MULTIPLY CVFLT,AS05 ;PUSH WASTE SOLIDS TO THICKENERS $DVR ;DIVIDE .WORD .+2 ;THREADED EXIT .POP R4 ;GET HI-RESULT .POP R5 ;GET LO-RESULT MOV CVP,R2 ;RESTORE DEST. PNTR .PUSH #8. ;SET NO. CHAR. .PUSH #0 ;SET DP POSITION CALL FLT2AS ;CONVERT TO ASCII .POP R5 ;RESTORE R5 RETURN CVFLT: MOV CVP,R2 ;SET DEST. PNTR MOV (R4)+,R3 ;GET POINT INSS ; DT.SIP: MOV R0,-(SP) ;STORE R0 MOV DT,R0 ;GET CURRENT DDB MOVB #-2,SY.TO(R0) ;ENABLE TIMEOUT DURING SEARCH MOV (SP)+,R0 ;RESTORE R0 TST @#DT.CCM ;CHECK STATUS BMI DT.SER ;IF ERROR GO INVESTIGATE CMP @#DT.CDT,DT.BRQ ;CHECK BLOCK FOUND BEQ DT.BFD ;IF ONE REQD, GO ACTION BMI DT.SXT ;GET TO BLOCK THIS WAY? DT.SSW=.-1 ;(BPL IF TRAVEL BACKWARD) DT.TA1: BICB #40,@#177776 ;DROP PRIORITY ASRB #0 ;HOW MANY TURNS? DT.TAC=.-2 BCS DT.BER ;IF 6 CAN'T FIND BLOCK MOV #4000,-(SP) INE LOADER HEADER .GLOBL MS.HED ;ERROR MESSAGE TASK HEADER .GLOBL OPHED ;OPERATOR TASK HEADER .GLOBL UTILHD ;UTILITY TASK HEADER ; FORCE BEGIN CODE TO LINK: .GLOBL ENTERL ;INITIALIZATION LIST OF TASKS TO ENTER .GLOBL BEGB1 ;INITIALIZATION CODE-PART 1 E IT TKO.C: DECB TKO.TB(R5) ;REDUCE TAB COUNT. TKO.F: MOV TKO.CS(R5),R1 ;GET ADR OF TELEPRINTER STATUS REGISTER MOV #3*400+376,SY.TO(R0) ;ENABLE TIME OUT BIS #100,(R1)+ ;ENABLE INTERRUPT MOVB R2,(R1) ;OUTPUT CHARACTER. TKO.EX: RTS PC TKO.SP: MOV R2,R3 ;MUST PRESERVE CHAR. IN R2 BIC #^C37,R3 ;ENSURE IT'S IN RANGE ASL R3 ;DOUBLE IT TST R5 ;TEST IF KB: JMP @TAB.SP(R3) ;DISPATCH ; CONTROL CHARACTER FOUND-PRINT ^ CHAR. ; PUT ASSOCIATED CHARACTER INTO CCTMP FOR OUTPUT NEXT. ; TKO.CC:DEX CALL AVERS ;CONVERT TO ASCII CLRB @R2 ;TERMINATE STRING MOV R4,R0 ;SAVE R4 MOV CVP,R1 ;SET SOURCE PNTR. CALL AS2FLT ;CONVERT TO FLOATING POINT .PUSH R5 ;PUT RESULT ... .PUSH R4 ; ... ON STACK MOV R0,R4 ;RESTORE R4 JMP @(R4)+ ;THREADED RETURN LBV: .PUSH BV+2 ;PUSH CONVERSION ... .PUSH BV ; ... FACTOR JMP @(R4)+ ;THREADED RETURN ; CONVERSION FACTOR = ; (24. HR/DAY)*(8.33 LB/GAL)*(BASIN VOL.)/(2000. LB/TON) ; CONVERSION FACTOR = (BASIN VOL.)/(10.) ; BASIN VOL. =;OTHERWISE MUST TURN AROUND MOV #2,-(SP) ;ASSUME TRAVEL NOW FWD RORB DT.SSW ;CHECK DIRECTION BCS DT.TA2 ;IF FWD OMIT NEXT NEG 2(SP) ;IF BWD, REVERSE EVERYTHING NEG @SP DT.TA2: SUB (SP)+,DT.BRQ ;ALLOW 2 BLKS FOR 2ND TURN ADD (SP)+,@#DT.CCM ;SWITCH STATUS ROLB DT.SSW ;RESET DIR SW (C BIT REVERSES) DT.SXT: INCB @#DT.CCM ;CONTINUE SEARCH RTI ;WAIT NEXT BLOCK .PAGE ;BLOCK FOUND - CHECK TRAVEL CORRECT: DT.BFD: CMP #0,#0 ;TRAVEL AS ORIGINALLY STORED? DT.BRQ=.-4 DT.BCK=.-2 BNE DT. .TITLE UTIL .IDENT /JIM001/ ; TAULCO VERSION WITH ADDITIONAL FUNCTION(S). ; .SBTTL GLOBAL DEFINITIONS .GLOBL UTILHD ;UTILITY TASK HEADER .SBTTL GLOBAL REFERENCES .GLOBL PSW ;ADDRESS OF PROCESSOR STATUS REGISTER .GLOBL UTILT ;UTILITY TASK SLOT .GLOBL WDTB ;HEADER ADDRESS TABLE ;+ ; UTILITY TASK ; ; THE VALUE OF THE LOW BYTE OF THE PASSED PARAMETER ; SELECTS A FUNCTION AS FOLLOWS: ; ; 0: CALL ODT ; 1: TURN OFF TASK INDICATED IN HIGH BYTE ; 2: FAKE A POWER FAIL ; 3: DEL ADD #100,R2 ;CONVERT CONTROL CHARACTER TO REAL CHARACTER MOVB R2,CCTMP(R5) ;AND SET IT FOR OUTPUT NEXT. MOVB #'^,R2 ;GET AN UP ARROW BR TKO.C ;GO PRINT. ; CONVERT TAB TO MOD -8 SPACES. ; TKO.T: INCB TKO.TP(R5) ;SET TAB IN PROGRESS FLAG MOVB #40,R2 ;GET A SPACE. DECB TKO.TB(R5) ;REDUCE MOD -8 COUNT. BIT #7,TKO.TB(R5) ;AT A STOP? BNE TKO.F ;NO- ; CARRIAGE RETURN: TKO.D: CLR TKO.TB(R5) ;RESET COUNT AND FLAG. BR TKO.F ;GO PRINT. ; FORM FEED: IGNORE IF VT05 ; TKO.KB: BLT TKO. 2.561750502 MG BV: .FLT2 0.2561750502 NATGAS: MOV R$LCNT+4,R0 ;GET LO NATURAL GAS MOV R$HCNT+4,R1 ;GET HI NATURAL GAS .PUSH #NGEND ;PUSH RETURN ADDRESS .PUSH R5 ;SAVE R5 .PUSH R2 ;SAVE DEST. POINTER BR CVS ;GO CONVERT TO INTEGER NGEND: MOV R2,R0 ;COPY DEST. POINTER MOV R2,R1 ;COPY IT AGAIN SUB #^D7,R0 ;POINT TO 2ND CHARACTER OF FIELD DEC R1 ;POINT TO LAST CHARACTER 1$: MOVB (R0),-1(R0) ;MOVE ONE CHARACTER INC R0 ;BUMP TO NEXT CHARACTER CMP R0,R1 ;AT LAST CHARACTER PTA1 ;IF NOT MUST TURN AGAIN INCB DT.INT ;RESET INT'RUPT SW FOR TFR MOVB #0,@#DT.CCM ;MOVE IN CORRECT FUNC DT.FRQ=.-4 BR DT.SXT ;... & GO SET UNDERWAY ;INTERRUPT SERVICE (B) - TRANSFER COMPLETE (?): DT.INT: BR .+2 ;INTERRUPT SWITCH .... BR DT.SIP ;FOR SRCH COMES HERE! JSR R5,STRG ;SAVE REGISTERS MOV #SRTI,-(SP) ;SET RETURN ADDRESS MOV DT,R0 ;GET DDB ADDR BEQ DT.RTS ;IGNORE UNSOLICITED INTERRUPT BICB #40,177776 ;DROP PRIORITY LEVEL CLR SY.TO(R0) ;DISABLE TIMEOUT COUNT MOV #DETE & RESCHEDULE TASK INDICATED IN HIGH BYTE ;- .MCALL .PARAM .PARAM .PAGE UTILSK: .WORD 0 ;STACK .BLKW ^D14 UTIL: MOVB UTILDA,R0 ;GET LOW BYTE OF PASSED DATA ASL R0 ;DOUBLE IT CMP R0,#MAXFUN ;VALID? BLO OK ;YES UTILX: EMT 60 ;.EXIT OK: JMP @FUNLST(R0) ;GO TO PROPER ROUTINE FUNLST: .WORD FUN0 .WORD FUN1 .WORD FUN2 .WORD FUN3 MAXFUN= .-FUNLST FUN0: .WORD 3 ;TRAP TO ODT EMT 60 ;.EXIT FUN1: MOVB UTILDA+1,R0 ;GET HIGH BYTE OF PASSED DATA MOV @WDTB(R0),UTILDA;TASJA ;IGNORE IF VT05 TKO.KA: INCB TKO.FF(R5) ;SET FF FLAG. TKO.K: MOVB #12,R2 ;GET A LINE FEED INCB TKO.LC(R5) ;COUNT LINE CMPB TKO.LC(R5),#PPSIZE ;FINISHED? BLO TKO.FA ;NO - GO PRINT LF CLR TKO.LC(R5) ;YES - RESET FLAG & COUNT BR TKO.FA ; AND GO PRINT. ; LINE FEED: AUTOPAGE IF NEEDED FOR PRINTER, OR FILL FOR VT05 ; TKO.H: BGE TKO.HP ;NOT VT05 MOV #12,R2 ;R2=LINE FEED BR VT.FIL TKO.HP: CMPB TKO.LC(R5),#PGSIZE-1 ;NEED TO AUTO-FORM FEED? BHIS TKO.KA ;YES INCB TKO.LC(R5) ;COUNOSITION ? BNE 1$ ;NOT YET: MOVE ANOTHER MOVB #'.,-(R0) ;STORE DECIMAL POINT RETURN CKWH: MOV R$LCNT,R0 ;GET LO SERVICE KWH MOV R$HCNT,R1 ;GET HI SERVICE KWH ADD R$LCNT+2,R0 ;ADD LO BLOWER KWH ADC R1 ADD R$HCNT+2,R1 ;ADD HI BLOWER KWH .PUSH R5 ;SAVE R5 .PUSH R2 ;PUT DEST. PNTR ON STACK MOV #^D96,R2 ;0.96 KWH / PULSE CALL MUL2 ;MULT. BY 96. MOV #^D100,R2 ;SET DIVISOR CALL DIV2R ;DIVIDE BY 100. MOV R1,R0 ;LO TO R0 MOV R3,R1 ;HI TO R1 CVS: MOV @SP,R5 ;DEST. PNTR TO R5T.CCM,R1 ;GET STATUS ADDR MOV #10,R3 ;SET MAGIC CONSTANT TST @R1 ;ERROR CAUSE INT'RUPT? BMI DT.TER ;IF SO GO & SEE WHY MOVB R3,@R1 ;OTHERWISE STOP TAPE ... DT.TXT: JMP @14(R0) ;... & TAKE COMPLETION RETURN ; ; ENTER HERE FOR REQUEST TO DOWN DEVICE. THIS CAN ONLY ; HAPPEN WHEN INITIATING IO RUNDOWN. ORIGINAL TRANSFER ; REQUEST CAUSED AN "A002" AND INSTEAD OF OPERATOR ; TYPING "CONTINUE", THE OPERATOR HALTS THE TASK ; DT.CA: BITB #SY.DWN,SY.DFL(R0) ;IS DOWN BIT SET? BEQ DTCX ;BK CALL NUMBER MOV #ARGL1,R5 ;ADDR OF ARG LIST FOR EMT 130 ;CALL OFF ARGL1: BR EX1 .WORD UTILDA EX1: EMT 60 ;.EXIT FUN2: MOV PSW,-(SP) ;PUSH CURRENT STATUS MOV #UTILX,-(SP) ;PUSH PHONY PC MOV @#26,PSW ;SET NEW STATUS JMP @24 ;ENTER POWER FAIL CODE FUN3: MOVB UTILDA+1,R0 ;GET HIGH BYTE OF PASSED DATA MOV @WDTB(R0),UTILDA;TASK CALL NUMBER MOV #ARGL2,R5 ;ADDR OF ARG LIST FOR EMT 127 ;CALL DELETE ARGL2: BR STRT .WORD UTILDA STRT: MOV #ARGL3,R5 ;ADDR OF ARG LIST FOR EMT 124 T LINE ; LF,FF COME HERE. SET ECHO GOING IF SOME TO DO. TKO.FA: NEGB EF(R5) ;IF 0, STAYS 0. IF +1, TURNS TO -1. BGT .-4 ;IF -1, STAYS -1. BR TKO.F ;GO PRINT. ; VT COMES HERE ; TKO.FB: NEGB EF(R5) ;SET ECHO FLAG. BGT .-4 BR JMPJA ;IGNORE VT ; CURSOR ADDRESS: ; VT.CAD: BGE JMPJA ;IGNORE FOR PRINTER BR TKO.F ;GO OUTPUT IT ; 'FILL CHAR.' COMMAND: ; VT.FLC: CLR R2 MOV #177400+NFILL-1,TKO.LC(R5) BR TKO.F ; HOME COMMAND: ; VT.HOM: BGE JMPJA ;IGNORE FOR PRINTER VT.FI ADD #^D8,R5 ;'END' PNTR MOV #^D10,R2 ;SET DIVISOR 1$: CMP R1,R2 ;NEED DOUBLE DIVIDE? BLO 2$ ;NO MOV R0,R3 ;TEMP SAVE LO MOV R1,R0 ;HI BECOMES LO CLR R1 ;HI=0 CALL DIVIDE ;DIVIDE HI PART .PUSH R1 ;TEMP SAVE HI QUOTIENT MOV R0,R1 ;REMAINDER BECOMES HI MOV R3,R0 ;GET LO .POP R3 ;HI QUOTIENT TO R3 CALL DIV1 ;DIVIDE LO PART MOV R3,R1 ;HI QUOTIENT BECOMES HI DIVIDEND BR 1$ 2$: CALL DIV1 ;SINGLE DIVIDE CLR R1 ;HI NOW =0 TST R0 ;GOT ZERO YET? BEQ 5$ ;YES: FINIRANCH IF NOT BICB #SY.LOC+42,SY.DFL(R0) ;CLEAR LOCK AND DOWN DTCX: RTS PC ;EXIT ; ; SEARCH ERROR - DETERMINE CAUSE ; DT.SER: TST @#DT.TST ;IN END ZONE? BMI DT.TA1 ;O.K. MEANS TURN AROUND JSR R5,STRG ;SAVE REGISTERS MOV #SRTI,-(SP) ;SET ADDRESS RETURN BICB #40,@#177776 ;DROP PRIORITY MOV DT,R0 ;GET DDB ADDRESS CLR SY.TO(R0) ;DISABLE TIMEOUT COUNT MOV #DT.TST,R1 ;GET DECTAPE STATUS DT.EXT: BIT #14000,(R1)+ ;OPERATOR RECOVERABLE ERROR? BEQ DT.STE ;NO: UNRECOVERABLE ERROR ; ERRO ;CALL START ARGL3: BR EX2 .WORD UTILDA .WORD NA .WORD MA .WORD IERR EX2: EMT 60 ;.EXIT NA: MA: .WORD 0 IERR: .WORD 0 .PAGE ; REAL TIME HEADER: .WORD 0,0,0 .WORD 0,0,0,0,4,UTILSK,0,UTIL,UTIL,0 UTILDA: .WORD 0,0 .RAD50 /L / .RAD50 /UTI/ UTILHD: .WORD UTILT .END L: MOV #177400+NFILL,TKO.LC(R5) ;SET FLAG & COUNT BR TKO.F ;GO OUTPUT IT ; ERASE TO END OF SCREEN COMMAND: ; VT.EOS: BLT VT.FIL ;FILL FOR VT05 JMPJA: JMP TKO.JA ;IGNORE FOR PRINTER ;OUTPUT NEXT ECHO CHARACTER TKO.JB: DECB EC(R5) ;ANY CHARACTER TO OUTPUT? BPL 1$ ;YES CLR EF(R5) ;CLEAR ECHO FLAG AND COUNT JMP TKO.JC ;GO SEE IF ANY NORMAL OUTPUT TO DO 1$: MOV EPO(R5),R1 ;GET A CHARACTER FROM THE BUFFER MOVB (R1)+,R2 BMI TKO.JD ;BRANCH TO OUTPUT A BACKSLASH CMPB R2,#15 ;IS ITSHED CMP R5,@SP ;ROOM LEFT? BHI 2$ ;YES ADD #^D8,@SP ;'END' PNTR 3$: MOVB #'*,(R5)+ ;STORE '*' CMP R5,@SP ;AT END? BLO 3$ ;NOT YET BR 6$ 4$: MOVB #SPACE,-(R5) ;STORE A SPACE 5$: CMP R5,@SP ;AT BEGINNING? BHI 4$ ;NOT YET ADD #^D8,@SP ;'END' PNTR 6$: .POP R2 ;PUT 'END' IN R2 .POP R5 ;RESTORE R5 RETURN DIV1: CALL DIVIDE ;DIVIDE LO PART ADD #'0,R0 ;MAKE REMAINDER ASCII MOVB R0,-(R5) ;STORE IT MOV R1,R0 ;LO QUOTIENT BECOMES LO DIVIDEND RETURN MUL2: .PUSH R0 ;SAR WAS SELECT ERROR OR ILLEGAL OPERATION: .IF DF,DEC ;FOR DEC VERSION: MOVB #10,@R1 ;STOP TAPE MOVB SY.RTN(R0),SY.SCB+1(R0) ;MOVE TASK # FOR DV.A2 JSR R5,DV.A2 ;SET UP A002 MESSAGE NOP ;EXIT TO DEQUEUER WHETHER... JMP S.CDQ ;...BACKGROUND OR NOT .IFF ;OTHERWISE: BIS #20000,12(R0) ;SET 'OPRTR-RCVRBL' ERROR BIT BR DT.STP ;STOP TAPE & EXIT .ENDC DT.STE: BIS #10000,12(R0) ;SET UNRECOVERABLE ERROR DT.STP: MOVB #10,@R1 ;STOP TAPE IN CASE MOV 2(R1),16(R0) ;STORE UNTRANSFERRED WORD CO .TITLE XFR ; VERSION V005A ; 001 ; ; TRANSFER FUNCTION HANDLER ; ; ; THIS IS AN RSX VERSION WHICH WILL ONLY ; WORK ON FILE STRUCTURED DEVICES. ; ; ;++ ; EDITS: ; ; 20-JUN-74 JER CREATION FROM DEC LISTING ; ; 24-JUN-74 JER MODIFIED TO PASS ADDITIONAL ERROR BIT ; FROM DDB TO XFRBLK: ; BIT13 IN DDB TRANSFER FUNCTIONS WORD IS ; PASSED TO BIT2 IN XFRBLK STATUS BYTE. ; ; 17-JUL-74 JER IMPLEMENT CONDITIONAL . ; IF DEC IS DEFINED, THE ADDITIONAL ERROR ; BIT MENTIONED A CARRIAGE RETURN? BEQ TKO.JE ;YES- JSR PC,K.CWR ;CHECK PTR FOR WRAP AROUND TO MOV R1,EPO(R5) ;AND PUT BACK. BR TKO.JG ;CONTINUE AS NORMAL CHARACTER. ;OUTPUT A "\" FOR RUBOUT ECHO. PUT OUT CURRENT CHARACTER NEXT TIME. TKO.JD: BIC #-177-1,R2 ;SAVE LOW 7 BITS OF CHARACTER. MOVB R2,-(R1) ;PUT BACK INTO ECHO BUFFER. MOVB #'\,R2 ;GET A BACKSLASH. TKO.JF: INCB EC(R5) ;FUDGE COUNT BACK. BR TKO.JG ;NORMAL FROM HERE. ; ; FOUND A CR TO ECHO. CHANGE CHARACTER IN ECHO BUFF TO A LF. TKO.JEVE LO MULTIPLICAND CALL MULT ;MULT. HI PART MOV @SP,R1 ;GET LO MULTIPLICAND MOV R0,@SP ;SAVE PARTIAL PRODUCT CALL MULT ;MULT. LO PART ADD (SP)+,R1 ;ADD IN PARTIAL PRODUCT RETURN DIV2R: MOV R2,R3 ;FORM 1/2 FOR ROUNDING ... CCC ROR R3 ADD R3,R0 ADC R1 CLR R3 ;HI QUOTIENT = 0 CMP R1,R2 ;NEED DOUBLE DIVIDE? BLO 1$ ;NO .PUSH R0 ;SAVE LO-DIVIDEND MOV R1,R0 ;SET NEW LO = HI CLR R1 ;SET NEW HI = 0 CALL DIVIDE ;DIVIDE HI PART MOV R1,R3 ;SAVE HIGH QUOTIENT MOV RUNT BR DT.TXT ;AND TAKE COMPLETION EXIT ; ; BLOCK NOT FOUND IN SEARCH ; DT.BER: JSR R5,STRG ;STORE REGISTERS MOV DT,R0 ;GET DDB ADDRESS CLR SY.TO(R0) ;DISABLE TIMEOUT COUNT BICB #40,177776 ;DROP PRIORITY MOV #SRTI,-(SP) ;SET ADDRESS RETURN MOV #DT.CCM,R1 ;GET CONTROL ADDRESS BR DT.STE ;TRANSFER ERROR: DT.TER: BIT #34000,-(R1) ;TAPE FAILURE/OPERATOR FAULT? BNE DT.EXT ;IF SO GO PROCESS IT BIT #100400,(R1)+ ;END ZONE/N.E.M? BNE DT.STE ;IF SO, TREAT AS UNRECOVERABLE ;RECOVERA ABOVE WILL NOT BE PASSED. ; ;-- ; ; CALLING SEQUENCE IS: ; ; MOV #XFRBLK,-(SP) ; MOV #LNKBLK,-(SP) ; EMT 131 ; ; THE XFR BLOCK IS AS FOLLOWS: ; ; XFRBLK: .WORD BLOCK NUMBER ON DEVICE ; .WORD STARTING CORE ADDRESS ; .WORD WORD COUNT ; .BYTE FUNCTION,STATUS ; .WORD NUMBER OF WORDS NOT TRANSFERRED ; .WORD ADDRESS OF STATUS VARIABLE .PAGE ; STANDARD REGISTER DEFINITIONS ; R0= %0 R1= %1 R2= %2 R3= %3 R4= %4 R5= %5 SP= %6 PC= %7 ; ; GLOBAL DEFINITIONS ; .GLOBL TR.G ;XFR-A: MOVB #12,-(R1) BR TKO.JF ;GO FUDGE COUNT. ; ; OUTPUT CHARACTERS FROM SPECIAL STRING FOR CNTRL-U AND ; CNTRL-C ; ; TKO.JI: INC K.MPTR(R5) ;ADVANCE THE POINTER BR TKO.JG ;GO PROCESS FOR OUTPUT. ; OUTPUT SECOND CHAR OF CNTRL-CHAR. CLEAR CURRENT CHARACTER. ; ; TKO.JJ: CLRB CCTMP(R5) ;CLEAR THE CHARACTER STORAGE. TSTB EF(R5) ;IS ECHO IN PROGRESS? BPL JMPJG ;NO - GO PRINT JUST THE CHARACTER. CMPB R2,#125 ;YES - CHECK FOR CNTRL-U. BEQ TKO.JK CMPB R2,#103 ;MAYBE A CNTRL-C? BNE J0,R1 ;SET HI = REMAINDER .POP R0 ;GET SAVED LO 1$: CALL DIVIDE RETURN S3: MOV #3,R0 ;SET COUNTER SV: MOVB #SPACE,(R2)+ ;STORE SPACE DEC R0 ;DONE? BNE SV ;NO RETURN .PAGE .SBTTL MACROS FOR REPORT SPECIFICATIONS .MACRO GNB X .IF NB,X .WORD X .ENDC .ENDM GNB .MACRO WR A,B,C,D,E GNB A GNB B GNB C GNB D GNB E .ENDM WR .MACRO EX A,B,C,D,E .WORD 0 WR A,B,C,D,E .ENDM EX .PAGE .SBTTL PLANT OPERATING SUMMARY REPORT SPECIFICATIONS R123T: EX PAGE WRBLE ERRORS (TIMING OR PARITY): ASL #0 ;RETRIED 8-9 TIMES ALRDY? DT.RTC=.-2 BCC DT.RXT ;IF NOT TRY AGAIN .... BIS #100000,12(R0) ;OTHERWISE SIGNAL ERROR BR DT.STP ;GO TO COMMON ERROR EXIT DT.RXT: JMP DT.PR1 ;RETRY TRANSFER AFTER ERROR MESSAGE .PAGE ; DECTAPE DDB'S ; UNITD=0 ;UNIT NUMBER DTSPN=50 ;DECTAPE SUSPEND NUMBER ; .REPT DT.DSC .WORD 0 .WORD 0 ;SY.QLK: Q LINK TO ACTIVE DDB'S .WORD 0 .WORD 0 ;SY.DVL: SUSPEND LEVEL CTRS. .WORD 0 .WORD DT ; DRIVER ADDRESS CTIVATE AFTER DDB LOCKED .GLOBL TR.H ;XFR-ACTIVATE AFTER DDB RESERVED .GLOBL TR.I ;XFR-ACTIVATE AFTER DDB LOCKED(THIS TASK) .GLOBL XFR ;XFR FUNCTION HANDLER ; ; GLOBAL REFERENCES ; .GLOBL CL.J ;SECONDARY ENTRY TO CL.SER FOR DISPATCHING .GLOBL CL.SER ;SEARCH FOR NEXT USER OF DEVICE .GLOBL FREE ;ROUTINE TO FREE A DDB .GLOBL OP.GA ;SUSPEND AS OWNER ROUTINE .GLOBL OP.JB ;ACTIVATE OWNER ROUTINE .GLOBL OP.KA ;ACTIVATE NON-OWNER ROUTINE .GLOBL OP.SU ;SUSPEND AS NON-OWNER ROUTINE .GLOBLMPJG ;NO - GO PRINT .IFNZ TK.NOU TST R5 ;MUST ALSO BE CONSOLE. BPL JMPJG ;NOT CONSOLE- .ENDC MOV #KO.MB,K.MPTR(R5) ;SET PTR TO SPECIAL STRING. BR JMPJG ;FOR CNTRL-C ; TKO.JK: MOV #KO.MA,K.MPTR(R5) ;SPECIAL STRING FOR CNTRL-U. JMPJG: JMP TKO.JG TAB.SP: .WORD TKO.JA ;00 .WORD VT.FLC ;01 : 'FILL CHAR.' COMMAND .WORD TKO.JA ;02 .WORD TKO.CC ;03 : CONTROL-C .WORD TKO.JA ;04 .WORD TKO.JA ;05 .WORD TKO.JA ;06 .WORD TKO.F ;07 : BELL .WORD TKO.F ;10 : BACK-SPACE *** M001 WR M002,LPGAS WR M003,NATGAS WR M004,CKWH WR M005,TOT,A109 WR M006,TOT,AS05 WR M007 WR M008 WR M009,AMMT,A026 WR M010,AMMT,AS02 WR M011,AMMT,A110 WR M012,AMMT,AS00 WR M013,AMMT,AS03 WR M014 WR M015 WR M016,AMM,A056 WR M017,AMM,A057 WR M018,AMM,A084 WR M019 WR M016,AMM,A058 WR M017,AMM,A059 WR M020,AMM,A108 WR M021,AMM,AS04 WR M022,AMM,A107 WR M023,AMM,A106 WR M024,AMM,A415 WR M025,AMM,A515 EX PAGE WR M026 WR M027 WR M028 WR M029,MM,A421 .IF EQ,UNITD DTDDB: .ENDC .WORD 0 ; USER CALL ADDRESS .WORD 0 ; USER LINE ADDRESS .WORD 0 ; DEVICE BLOCK NUMBER .WORD 0 ; MEMORY START ADDRESS .WORD 0 ; NEGATIVE WORD COUNT .BYTE 0,UNITD ; TRANSFER FUNCTIONS WORD .WORD 0 ; COMPLETION RETURN ADDRESS .WORD 0 ; NEGATIVE RESIDUE WORD COUNT .WORD 0 .WORD 0 .WORD 0 .WORD 0 .BYTE 0 .BYTE DTSPN ;SY.SPN: SUSPEND # .WORD DTUFD ;RSX UFD POINTER .WORD 0 .WORD 0 .WORD 0 .WORD 0 .BYTE 0 ;SY.RTN: RESERVED T PS ;ADDRESS OF PROCESSOR STATUS REGISTER .GLOBL REACT ;TASK REACTIVATE ROUTINE .GLOBL RESERV ;ROUTINE TO RESERVE A DDB .GLOBL SCHLX ;IOT HANDLER ENTRY TO TURN OFF A TASK (IO RUNDOWN) .GLOBL SRTI ;COMMON SYSTEM EXIT .GLOBL SUTB ;SUSPEND STATUS .GLOBL SYAUA ;SYSTEM/USER ACTIVE FLAG .GLOBL SY.DFL ;DDB-FLAG BYTE .GLOBL SY.DTS ;DISTANCE FROM USER PC TO STACK TOP .GLOBL SY.LOC ;DDB-LOCKED FLAG .GLOBL SY.PLE ;PRIORITY LEVEL 4 .GLOBL SY.RES ;DDB-RESERVED FLAG .GLOBL SY.RTN ;SSB-TASK DDB R .WORD TKO.T ;11 : TAB .WORD TKO.H ;12 : LINE FEED .WORD TKO.FB ;13 : VER. TAB .WORD TKO.KB ;14 : FORM FEED .WORD TKO.D ;15 : CARRIAGE RETURN .WORD VT.CAD ;16 : CURSOR ADDRESS COMMAND .WORD TKO.JA ;17 .WORD TKO.JA ;20 .WORD TKO.JA ;21 .WORD TKO.JA ;22 .WORD TKO.JA ;23 .WORD TKO.JA ;24 .WORD TKO.CC ;25 : CONTROL-U .WORD TKO.JA ;26 .WORD TKO.JA ;27 .WORD TKO.CC ;30 : CONTROL-X .WORD TKO.JA ;31 .WORD TKO.CC ;32 : CONTROL-Z .WORD TKO.JA ;33 .WORD TKO. WR M030,MM,A422 WR M031,MM,A423 WR M032,MM,A424 WR M033,MM,A425 WR M034 WR M029,MM,A521 WR M030,MM,A522 WR M031,MM,A523 WR M032,MM,A524 WR M033,MM,A525 EX EXIT .PAGE .SBTTL DAILY OPERATING REPORT SPECIFICATIONS R4T: EX PAGE WR M001 WR M002,LPGAS WR M003,NATGAS WR M004,CKWH WR M005,TOT,A109 ; WR M035 WR M036,AVER,A026 WR M037,MINST,A026,MMTIM WR M038,MAXST,A026,MMTIM WR M039,TOT,A026 WR M040 WR M036,AVER,AS02 WR M037,MINST,AS02,MMTIM WR M038,MAXST,ASASK # .BYTE SY.DPR ;SY.DFL: DDB FLAGS: PERMANENT DDB .WORD 0 .WORD 0 .BYTE 0 ;SY.TO : TIME-OUT COUNT .BYTE 0 ;SY.INH: TIME OUT MESSAGE INHIBIT COUNT UNITD= UNITD+1 DTSPN= DTSPN+1 .ENDM .END ESERVED FOR (BYTE) .GLOBL SY.TRL ;SUSPEND-XFR FCN, LOCKED FOR ANOTHER TASK .GLOBL SY.TRR ;SUSPEND-XFR FCN, RESERVED .GLOBL SY.TRT ;SUSPEND-XFR FCN, LOCKED FOR THIS TASK .GLOBL SY.TWR ;DDB-THE OWNER IS WAITING .GLOBL SY.WDC ;DDB-WAITING FOR DEVICE COMPLETION FLAG .GLOBL S.CDB ;ROUTINE TO CHECK FOR DRIVER BUSY .GLOBL S.CDQ ;ROUTINE TO DE-QUEUE A DRIVER .GLOBL W.ER ;CHANNEL NOT INITED ERROR .PAGE .SBTTL MAIN ROUTINE ENTRY XFR: MOV @(R1)+,R0 ;GET DDB ADDRESS BNE .+6 JMP W.ER ;ERRORJA ;34 .WORD VT.HOM ;35 : HOME CURSOR COMMAND .WORD TKO.F ;36 : ERASE TO END OF LINE COMMAND .WORD VT.EOS ;37 : ERASE TO END OF SCREEN COMMAND TOFFB: TST R5 ;IS DEVICE KB: ? BPL TOFFP ;NO MOV TKI.TS(R5),R0 ;GET KEYBOARD DDB POINTER CALL TOFF ;TURN OFF TASK .INITED TO KEYBOARD TOFFP: MOV TKO.TS(R5),R0 ;GET PRINTER DDB POINTER TOFF: TST R0 ;ANY DDB POINTER? BEQ TOFF.1 ;ZERO - CAN'T BE INITED. BITB #SY.RES,SY.DFL(R0); ANYONE INITED? BEQ T02,MMTIM WR M039,TOT,AS02 WR M041,PCRS WR M042,TOT,AS00 WR M043,TOT,A110 WR M044,TOT,AS03 WR M006,TOT,AS05 WR M062,SRT ; WR M014 WR M015 WR M016,AMM,A056 WR M017,AMM,A057 WR M018,AMM,A084 WR M019 WR M016,AMM,A058 WR M017,AMM,A059 WR M020,AMM,A108 WR M021,AMM,AS04 WR M022,AMM,A107 WR M023,AMM,A106 EX DAYFIN .PAGE .SBTTL MONTHLY OPERATING REPORT SPECIFICATIONS R5T: EX PAGE WR M001 WR M002,LPGAS WR M003,NATGAS WR M004,CKWH WR M045,TOT,A109 ; WR M03 .TITLE SPART ;++ ; EDITS: ; ; 17-JUL-74 JER IMPLEMENT CONDITIONAL . ; IF DEC IS DEFINED, ORIGINAL DEC VERSION ; IS PRODUCED. ; IF DEC IS UNDEFINED, A USER SUPPLIED ; GLOBAL ROUTINE NAMED WILL ; BE CALLED AT EACH CLOCK TICK. ; THE ROUTINE SHOULD EXIT ; BY < RTS PC>. ; ; 13-MAY-75 JER IMPLEMENT CONDITIONAL . ; IF BRSELF IS DEFINED, THE NULL TASK WILL ; BE A BRANCH SELF INSTRUCTION, ; OTHERWISE THE NULL TASK WILL BE A ; WA: NOT INITED MOVB #4,SY.DTS(R3) ;REMOVE 4 BYTES ON EXIT MOVB SYAUA,R2 ;TASK SLOT # MOV -2(R0),R4 ;DRIVER ADDRESS MOVB 6(R4),PS ;RUN @ DRIVER PRIORITY MOVB SY.DFL(R0),R1 ;GET DDB FLAGS BPL TR.A ;BRANCH IF NOT LOCKED MOV #SY.TRL,R1 ;ASSUME REASON FOR SUSPEND CMPB R2,SY.RTN(R0) ;THIS TASK? BNE TR.SU ;NO- MOVB #SY.TRT,SY.DTS+1(R3) ;YES: SET SUSPEND REASON JMP OP.GA ;GO SUSPEND AS OWNER TR.A: BIT #SY.RES,R1 ;DDB RESERVED? BEQ TR.B ;IF EQ NO: GO RESERVE IT CMPB R2,SY.RTN(R0) ;RESEOFF.1 ;NO-SKIP TASK HALTING. MOVB SY.RTN(R0),R2 ;GET TASK # .PUSH R2 ;SAVE IT ON STACK SWAB R2 ;PUT IN HIGH BYTE CLRB R2 INCB R2 ;OFF REQUEST IN LOW BYTE. MOVB #UTILT,R0 ;TASK INDEX TO R0 JSR R5,HSASI ;ACTIVATE TASK BR TOFF.2 ;ERROR .POP R0 ;PUT TASK # IN R0 CCC ;INDICATE THERE WAS A TASK .INITED TOFF.1: RETURN TOFF.2: JSR PC,PAN$ ;SYSTEM ERROR IN.CX: CALL TOFFB ;TURN OFF ANY .INITED TASKS JSR PC,KB.RES ;RESTORE INPUT POINTERS,FLAGS. MOVB #30,R2 ;PUT CNTRL/X IN R2 5 WR M036,AVER,A026 WR M037,MINST,A026,MMTIMD WR M038,MAXST,A026,MMTIMD WR M039,TOT,A026 ; WR M014 WR M046,AMM,AS02 WR M015 WR M016,AMM,A056 WR M017,AMM,A057 WR M018,AMM,A084 WR M019 WR M016,AMM,A058 WR M017,AMM,A059 WR M020,AMM,A108 WR M021,AMM,AS04 WR M022,AMM,A107 WR M023,AMM,A106 EX MONFIN .PAGE .SBTTL MONTHLY USAGE & COST REPORT SPECIFICATIONS R6T: EX PAGE WR M047 EX CSTPR1 WR M048,TULPR,UCR,TCR WR M049,TUNATR,UCR,TCR WR M050,TUKWHR,UCR,TCR WR MIT INSTRUCTION. ; ;-- R0= %0 R1= %1 R2= %2 R3= %3 R4= %4 R5= %5 SP= %6 PC= %7 ; GLOBAL DEFINITIONS: .GLOBL SPARTA ;NULL TASK ENTRY .GLOBL SPARTH ;SPARTA HEADER .GLOBL TISR ;KW11-L INTERRUPT HANDLER ; GLOBAL REFERENCES: .IF NDF,DEC ;IF NOT DEC VERSION .GLOBL USRTIC ;USER ROUTINE TO BE CALLED EACH TICK .ENDC .GLOBL COUNT ;TICKS COUNT .GLOBL CTICK ;TIME OUT AND CLOCK SCAN FLAGS .GLOBL KICK ;ROUTINE TO BOUNCE A TASK DOWN A LEVEL .GLOBL NEWSA ;NEW PROGRAM ACTIVE FLAG RVED FOR THIS TASK? BEQ TR.C ;YES: KEEP GOING MOV #SY.TRR,R1 ;NO: GET SUSPEND REASON TR.SU: JMP OP.SU ;SUSPEND AS NON-OWNER TR.B: JSR PC,RESERV ;RESERVE THE DDB TR.C: JSR PC,REACT ;REACTIVATE THE TASK IF NECESSARY MOV -(R0),R4 ;GET DRIVER ADDRESS CMP (R0)+,(R4)+ ;ADJUST BOTH ADDRESSES MOV 6(R3),R1 ;GET ADDR OF TRNBLK MOV R0,R3 ;COPY DDB ADDRESS TST (R3)+ ;ADJUST REGISTER MOV R1,(R3)+ ;STORE TRNBLK ADDRESS IN DDB MOV (R1)+,(R3)+ ;STORE DEVICE BLOCK NUMBER IN DDB MOV (R1)+,(R3)+ ; JMP KB.INI ;GO ECHO CNTRL-X IN.CC: BIT #1,@#2 ;IS ^C ENABLED? BEQ LEX.1 ;NO: IGNORE IT TST R5 ;DEVICE KB: ? BLT KB.CC ;YES CALL SWAPK ;SWITCH KB: TO BE THIS DEVICE MOV #-2,R5 ;SET UNIT TO KB: CALL TOFFB ;TURN OFF ANY TASKS MOV TKI.TS(R5),R0 ;GET KB DDB POINTER MOV #'C-100,R2 ;RESTORE ^C IN R2 KB.CC: MOV #-1,K.CCF ;SET COMMAND-MODE SWITCH MOV #-4,R5 ;SWITCH TO PSEUDO-UNIT JSR PC,KB.RES ;RESET POINTERS BR KB.INI ;GO ECHO IN.QMK: TST R5 ;IS DEVICE KB: ? BLT KB.QMK 051,TUCLR,UCR,TCR WR M052 WR M053,TTC WR M054,TRSR WR M055 EX CSTPR2 WR M056,UPER,CPER WR M057,UPER,CPER WR M058,UPER,CPER WR M059,UPER,CPER WR M060 WR M061,TCPER EX EXIT .PAGE .SBTTL DAILY REPORT FINAL .GLOBL CMBH,CMBM,CMBC DAYFIN: CALL LABR ;DO LAB REPORT .INIT #DTLNK ;.INIT TAPE DATASET MOV #CMHED,VL2 ;SET COMMENTS HEADING MOV #CMBM,MEMAD ;SET MEMORY ADDRESS MOV #^D256,WC ;SET WORD COUNT MOV #^D508,CMBH ;SET LINE BUFFER SIZE CLR (PC)+ ;INIT. FLAG COMFL.GLOBL PL6 ;PRIORITY LEVEL 6 .GLOBL PS ;ADDRESS OF PROCESSOR STATUS REGISTER .GLOBL PSTB ;PRIORITY STATUS .GLOBL SRTI ;COMMON SYSTEM EXIT .GLOBL STRG ;COMMON SYSTEM ENTRY SUBROUTINE .GLOBL SYAUA ;SYSTEM, USER ACTIVE FLAG .GLOBL TIC ;TIME IN COUNTER TO NEXT EVENT .GLOBL WTCHD ;WATCH DOG TIMER POINTER .PAGE .SBTTL SPARE TIME TASK SPARTS: .WORD 0 ;SPARE TIME TASK STACK .BLKB ^D30 SPARTA: .IF DF,D$BG1 ;IF DEFINED, USE NULL TIME LOOP 1$: DEC L$P1 ;NULL TIME LOOP COUNTER BGT 1$ ;STORE STARTING ADDRESS IN DDB MOV (R1)+,@R3 ;STORE NUMBER OF WORDS IN DDB BEQ TR.DA ;IF EQ ILLEGAL CALL NEG (R3)+ ;MAKE NEGATIVE WORD COUNT TST @R4 ;FILE STRUCTURED DEVICE? BPL TR.DA ;IF PL ILLEGAL CALL MOV @R1,R5 ;GET TRANSFER FUNCTION BIC #177771,R5 ;CLEAR EXCESS BITS BIC #173400,@R1 ;CLEAR EXCESS BITS BIT R5,@R4 ;TEST FOR LEGAL FUNCTION BEQ TR.DA ;IF EQ ILLEGAL CALL SUB #2,R5 ;MUST BE 2 OR 4 BEQ TR.CA ;IF EQ OKAY SUB #2,R5 ;TRY FOR 4 BNE TR.DA ;IF NE ILLEGAL CALL ;YES CALL SWAPK ;SWITCH KB: TO BE THIS DEVICE KB.QMK: CALL TOFFB ;TURN OFF ANY .INITED TASKS MOVB #KBOPT,R2 ;KBOP TASK INDEX SWAB R2 CLRB R2 BISB #3,R2 ;"RESTART" CODE MOVB #UTILT,R0 ;UTIL TASK INDEX JMP KB.IND ;GO START UTIL .IFNZ TK.NOU ; ; NON-CONSOLE INPUT INTERRUPT ; TK.INA: MOV S.STAT,#0 ;SAVE CURRENT STATUS TK.INB=.-2 JSR R5,STRG ;SAVE REGISTERS MOV TK.INB,R5 ;GET STATUS JSR PC,TT.GUA ;SAVE UNIT # BR TK.INC ;JOIN CONSOLE .ENDC ; ; CONSOLE INPUT INTERRUPT EN: .WORD 0 CALL SETSB ;SET START BLOCK FOR DAY ADD #^D4,XFRBLK ;COMMENTS BLKNUM FOR SHIFT 1 CALL COMSUB ;WRITE COMMENTS IF ANY ADD #^D5,XFRBLK ;BLKNUM FOR SHIFT 2 CALL COMSUB ADD #^D5,XFRBLK ;BLKNUM FOR SHIFT 3 CALL COMSUB .RLSE #DTLNK ;RELEASE TAPE DATASET JMP EXIT .PAGE .SBTTL COMMENT WRITER COMSUB: CLR CMBM ;ZERO DATE WORD CALL XFER ;READ POSSIBLE COMMENTS CMP CMBM,PDATE ;DATES MATCH? BNE 2$ ;NO: NO COMMENTS THIS SHIFT TST CMBC ;CHECK BYTE COUNT BEQ 2$ ;INVALIDLOOP FOR DEBUG FOR ABOUT MOV #^D32,L$P1 ; 250 MICROSECONDS INC C$OUNT ;UPDATE COUNTER BR 1$ ;GO AROUND AGAIN .IFF ;ELSE: NO NULL TIME LOOP .IF NDF,BRSELF ;IF BRSELF NOT DEFINED 1$: WAIT ;USE WAIT BR 1$ .IFF ;ELSE: BR . ;USE BR . .ENDC .ENDC .WORD SPARTA ;IP .WORD SPARTS ;MS .WORD 0 ;TR .WORD SPARTA ;IS .WORD SPARTA ;SC .WORD 0 ;WL .WORD 0 ;NP .WORD SPARTA ;SA SPARTH= .+4 ;NULL TASK HEADER ADDRESS .PAGE .SBTTL CLOCK INTERRUPT PROCESSING TI TR.CA: BIC #174377,@R3 ;CLEAR ALL EXCEPT UNIT NUMBER BIS (R1)+,(R3)+ ;SET TRANSFER FUNCTION ON TOP ; OF UNIT NUMBER MOV #TR.COM,(R3)+ ;SET COMPLETION ADDRESS CLR @R3 ;CLEAR UNTRANSFERRED WORD COUNT CLR (R1)+ ;CLEAR UNTRANSFERRED WORD COUNT IN TRNBLK MOV #2,@(R1)+ ;SET TRANSFER STATUS IN PROGRESS MOV #10,R1 ;TRANSFER FCN ENTRY CODE BISB #SY.WDC+200,SY.DFL(R0) ;LOCK DDB: WAITING FOR COMPLETE JSR PC,S.CDB ;ENTER DRIVER TR.X: JMP SRTI ;EXIT TO SYSTEM .PAGE .SBTTL DRIVER COMPLETTRY ; KB.INA: JSR R5,STRG ;SAVE REGISTERS SUB PC,R5 ;#-2 TO R5 TK.INC: MOVB #200,S.STAT ;DROP PRIORITY MOV #SRTI,-(SP) ;DRIVE EXIT ADDRESS MOV TKI.TS(R5),R0 ;GET DDB POINTER MOV TKI.CS(R5),R2 ;GET ADDRESS OF STATUS REG. MOVB 2(R2),R2 ;GET CHARACTER FROM KEYBOARD BIC #-177-1,R2 ;SAVE LOW 7 BITS + IGNORE NULLS. BEQ LEX.1 ;IGNORE NULLS. MOV #IN.CS,R1 ;SET ADDRESS OF CHECK STRING CMPB R2,(R1)+ ;Q-MARK? BEQ IN.QMK ;YES CMPB R2,(R1)+ ;CONTROL-C? BEQ IN.CC ;YES CMPB R2,(R1)+ ;^X CMP CMBC,#^D508 ;CHECK AGAIN BHI 2$ ;INVALID CLR CMBM ;SET MODE TST COMFL ;HEADING ALREADY WRITTEN? BNE 1$ ;YES INC COMFL ;SET FLAG CALL PAGE ;WRITE HEADING 1$: .WRITE #OLNK,#CMBH ;WRITE COMMENTS .WAIT #OLNK 2$: RETURN .PAGE .SBTTL MONTHLY REPORT FINAL MONFIN: CLR R5 ;INIT. INDEX 1$: TSTB L$DEC(R5) ;'TIME' VALUE ? BMI 2$ ;YES: DON'T DO AVERAGE MOV L$CNT(R5),R0 ;GET NO. OF SAMPLES BEQ 2$ ;NO DATA .PUSH R$LVAL+2(R5) ;PUSH ... .PUSH R$LVAL(R5) ; ... TOTAL .PUSHSR: JSR R5,STRG ;SAVE REGS. MOV #PL6,PS ;SET PROCESSOR STATUS TST @#177546 ;CAUSE CLOCK TO CONTINUE .IF DF,D$BG1 ;IF D$BGN DEFINED, THEN: DEC C$NT ;DECREMENT COUNTER BGT 1$ ;IF GT NOT TIME MOV #^D600,C$NT ;RESTORE COUNTER MOV I$NDX,R0 ;GET TABLE INDEX INC R0 ;INCREMENT INDEX BIC #177740,R0 ;32. IS MAXIMUM MOV R0,I$NDX ;STORE NEW INDEX ASL R0 ;MAKE WORD INDEX MOV C$OUNT,T$AB(R0) ;STORE COUNTER VALUE CLR C$OUNT ;RESET COUNTER 1$: .ENDC TST @SP ;INTERRUPT OCCUR IN SYSTEMION ENTRY TR.COM: MOV R0,@SP ;DISCARD DRIVER EXIT AND ; STORE CURRENT DDB JSR PC,S.CDQ ;DE-Q THE DRIVER MOV (SP)+,R0 ;RESTORE OLD DDB BICB #SY.WDC+200,SY.DFL(R0) ;UNLOCK DDB: DRIVER COMPLETE MOVB SY.RTN(R0),R2 ;GET TASK # CMPB SUTB(R2),#-3 ;.EXIT IN PROGRESS? BNE TR.D ;IF NE NO JMP SCHLX ;YES: GO CONTINUE EXIT TR.DA: BIC #173400,@R1 ;CLEAR ANY STATUS BITS BIS #20000,(R1)+ ;SET CALL ERROR BR TR.DB TR.D: MOV 2(R0),R1 ;GET ADDRESS OF TRNBLK ADD #6,R1 ;POINT TO STATUS WORD ? BEQ IN.CX ;YES CMPB R2,(R1)+ ;^O? BEQ IN.CO ;YES CMPB R2,(R1)+ ;X-ON? BEQ IN.XON ;YES CMPB R2,(R1)+ ;X-OFF? BEQ IN.XOF ;YES CMPB R2,(R1)+ ;FORM FEED? BNE 1$ ;NO INCB TKO.FF(R5) ;SET FORM FEED FLAG BR PRST ;GO START PRINTER 1$: TST R5 ;CONSOLE? BGE LEX.1 ;NO...IGNORE CMPB EC(R5),#EBSZ ;ECHO BUFFER FULL? BGE LEX.1 ;YES...IGNORE CHARACTER TST (PC)+ ;COMMAND MODE? K.CCF: .WORD 0 ;"COMMAND MODE" FLAG BEQ IN.NRM ;NO MOV #-4,R5 ;SWITCH TO PSEUDO-UNIT BR KB.INZ R0 ;PUSH NO. OF SAMPLES JSR R4,THREAD ;ENTER THREADED MODE $IR ;CONVERT TO FLT-PNT $DVR ;FLT-PNT DIVIDE .WORD .+2 ;THREADED EXIT .POP R$LVAL(R5) ;STORE ... .POP R$LVAL+2(R5) ; ... AVERAGE 2$: ADD #4,R5 ;ADVANCE INDEX CMP R5,#LB.LIM ;FINISHED ? BLO 1$ ;NO: DO NEXT ONE CALL LABR ;DO LAB REPORT JMP EXIT .PAGE .SBTTL LAB REPORT WRITER .GLOBL GDATE,GTIME,$IR LABR: MOV #LLD,R2 ;CONVERT CURRENT ... CALL GDATE ; ... DATE MOV #LLT,R2 ;CONVERT CURRENT ... CALL GTIM? BLT TISR1 ;YES TSTB @WTCHD ;WATCHDOG? BEQ TISR1 ;NONE DECB @WTCHD ;DECREMENT WATCHDOG BGT TISR1 ;O.K. INCB NEWSA ;FORCE A RESCHEDULE MOVB SYAUA,R1 ;GET TASK INDEX MOVB PSTB(R1),R0 ;GET CURRENT PRIORITY MOV #TISR1,-(SP) ;SET RETURN ADDRESS MOV R0,-(SP) ;PUSH PRIORITY DEC @SP ;DECREMENT PRIORITY CLR R4 ;NEW SUSPEND STATE IS ZERO CLR R5 ;DO NOT TALLY LEVEL COUNT JMP KICK ;BOUNCE THE TASK DOWN A LEVEL TISR1: MOV #COUNT,R0 ;GET COUNTER POINTER ADD #1,(R0)+ ;COUNTS CON MOV 12(R0),R3 ;GET STATUS WORD FROM DDB BIC #7777,R3 ;CLEAR ALL EXCEPT ERROR BITS .IF NDF,DEC ;IF 'OUR' VERSION: BIT #20000,R3 ;'SPECIAL' ERROR BIT SET? BEQ TR.J ;NO: O.K. ADD #162000,R3 ;CLEAR BIT13 & SET BIT10 TR.J: .ENDC BIS R3,(R1)+ ;LOAD ERRORS INTO STATUS BYTE MOV 16(R0),@R1 ;SET UNTRANSFERRED WORD COUNT BEQ TR.DB ;IF EQ OKAY NEG @R1 ;MAKE POSITIVE WORD COUNT BIS #40000,-2(R1) ;SET E.O.M. TR.DB: MOV #1,@2(R1) ;ASSUME GOOD TRANSFER BIT #173400,-(R1) ;TEST ERROR BITS BEQ IN.NRM: BITB #SY.RES,SY.DFL(R0) ;INITED? BEQ LEX.1 ;NO...EXIT BR KB.INZ IN.CO: COMB COF(R5) ;FLIP CONTROL-O FLAG BR LEX.1 ;EXIT IN.XON: DECB XOF(R5) ;DECR. X-OFF FLAG BEQ PRST ;IT WAS +1...START PRINTER CLRB XOF(R5) ;CLEAR X-OFF FLAG BR LEX.1 ;EXIT PRST: MOV TKO.TS(R5),R0 ;GET PRINTER DDB POINTER JMP PRSTRT ;GO START IT IN.XOF: TSTB XOF(R5) ;TEST X-OFF FLAG BGT LEX.1 ;ALREADY OFF ... IGNORE MOVB #-1,XOF(R5) ;SET X-OFF FLAG LEX.1: RTS PC ;EXIT KB.INZ: JSR PC,KB.CRP ;GETE ; ... TIME MOV #LBHED,VL2 ;SET LAB REPORT HEADING CLR R5 ;INIT. INDEX 1$: TST L$CNT(R5) ;GOT ANY DATA ? BNE 2$ ;YES ADD #4,R5 ;ADVANCE INDEX CMP R5,#LB.LIM ;CHECKED ALL ? BLO 1$ ;NO MOV #NLHED,VL2 ;SET 'NO LAB DATA' HEADING JMP PAGE ;WRITE HEADING & RETURN 2$: CALL WLHED ;PAGE & WRITE LAB HEADING MOV #-1,(PC)+ ;INIT. GCOD GCOD: .WORD -1 CLR R5 ;INIT. INDEX LLOOP: TSTB L$DEC(R5) ;'TIME' VALUE ? BPL 1$ ;NO TST MF ;MONTHLY REPORT ? BGT NXTL ;YES: IGNORE TIME VALUETINUOUSLY FOR TICKS EMT ADC @R0 ;PROPOGATE CARRY BIT #177,-(R0) ;128 TICK MULTIPLE? BNE TISRA ;NO INCB CTICK+1 ;SET TIME OUT FLAG TISRA: DEC TIC ;DECREMENT TIMER BNE TISRB ;O.K. INCB CTICK ;SET FLAG TISRB: .IF DF,DEC ;IF DEC VERSION JMP SRTI ;RETURN TO SYSTEM .IFF ;ELSE IF NOT DEC VERSION MOV #SRTI,-(SP) ;PUSH SYSTEM EXIT ADDRESS JMP USRTIC ;GO TO USER'S "TICK" ROUTINE .ENDC .IF DF,D$BG1 C$OUNT: .WORD 0 ;NULL TIME COUNTER I$NDX: .WORD -1 ;INITIAL TABLE INDEX C$N TR.DC ;IF EQ OKAY MOV #3,@4(R1) ;SET ERROR STATUS TR.DC: BIT #40,@R1 ;DETACH DESIRED? BEQ .+6 ;IF EQ NO JSR PC,FREE ;YES: FREE THE DDB BITB #SY.TWR,SY.DFL(R0) ;OWNER WAITING? BEQ .+6 ;NO JMP CL.J ;YES: GO START HIM BITB #SY.RES,SY.DFL(R0) ;DDB RESERVED? BNE TR.X ;IF NE EXIT JMP CL.SER ;NO: SEARCH FOR SOMEONE ELSE TO! .SBTTL ACTIVATION ROUTINES ; WAS SUSPENDED AS NON-OWNER BECAUSE DDB LOCKED ; FOR ANOTHER TASK ; TR.G: JSR PC,OP.KA ;SET REGS TR.GA: MOVB SY.DFL(R0),R1 POINTERS TSTB K.TRM(R5) ;HAVE A TERMINATOR IN THE BUFFER? BNE KB.EX ;YES-DROP THE CHARACTER CMPB R2,(R1)+ ;CNTRL-U? BEQ KB.INH CMPB R2,(R1)+ ;RUBOUT? BEQ KB.ING MOV #KBSZ-1,-(SP) ;CREATE POINTER TO END OF BUFFER. ADD K.BUF(R5),(SP) CMP (R4),(SP)+ ;ROOM FOR ONE CHARACTER? BHI KB.EX ;NO-DROP CURRENT CHARACTER. MOVB R2,@(R4)+ ;PUT CHARACTER INTO BUFFER INC -(R4) ;UPDATE POINTER. ; ECHO THE CHARACTER KB.INI: TSTB K.ESF(R5) ;ECHO SUPPRESS? BNE KB.INM ;YES- MOVB K.ROM(R5),R1 ;S 1$: MOVB L$GCOD(R5),R3 ;GET GROUP CODE CMP R3,GCOD ;NEW GROUP ? BEQ 2$ ;NO MOV R3,GCOD ;SET NEW GROUP CODE CMP R3,#14 BNE 70$ CALL WLHED ;PAGE & WRITE LAB HEADING 70$: CALL SETP ;SET OUTPUT POINTER MOVB #LF,(R2)+ CALL LS2 MOV L$GRP(R3),R1 ;GET GROUP ID STRING PNTR CALL EXPAND ;MOVE IT INTO LINE CALL LS1 CALL ENDMES ;WRITE GROUP ID LINE 2$: CALL SETP ;SET OUTPUT POINTER MOVB #SPACE,(R2)+ MOVB #SPACE,(R2)+ MOV L$IDP(R5),R1 ;GET ITEM ID STRING PNTR CALL EXPAND ;MT: .WORD 0 ;10 SECOND COUNTER L$P1: .WORD ^D32 ;NULL LOOP COUNTER T$AB: .BLKW ^D32 ;TABLE STORAGE .ENDC .END ;FLAGS TO R1 JMP TR.A ;CONTINUE OPERATION ; WAS SUSPENDED AS NON-OWNER BECAUSE OF RESERVED DDB ; TR.H: JSR PC,OP.KA ;SET REGS BR TR.B ;CONTINUE OPERATION ; WAS SUSPENDED AS OWNER BECAUSE OF LOCKED DDB ; TR.I: JSR PC,OP.JB ;SET REGS BR TR.GA .END ADD RUBOUT MODE INTO CHARACTER FOR ADD R1,R2 ;PROPER ECHO. CLR R3 ;SET RUBOUT MODE PROPERLY ADD R2,R1 ;DEPENDING ON ORIGINAL MODE, TSTB R1 ;AND CURRENT CHARACTER. BPL .+6 MOV #200,R3 MOVB R3,K.ROM(R5) MOV R5,-(SP) ;SAVE CURRENT R5 BPL .+6 ;SKIP IF POSITIVE MOV #-2,R5 ;ELSE, CHANGE -4 TO -2. MOV EPI(R5),R1 ;PUT CHARACTER INTO ECHO BUFFER MOVB R2,(R1)+ ;-ADVANCE POINTER. JSR PC,K.CWR ;CHECK FOR WRAP AROUND. MOV R1,EPI(R5) INCB EC(R5) ;COUNT THE CHARACTER. CMPB EC(R5),#OVE INTO LINE MOV R1,(PC)+ ;SAVE 'UNITS' PNTR LUNI: .WORD 0 ; TAB : 3$: MOVB #SPACE,(R2)+ CMP R2,#LBUF+^D31 BLO 3$ MOV L$SHP(R5),R1 ;GET ITEM ABBREVIATION PNTR CALL EXPAND ;MOVE INTO LINE ; TAB : 4$: MOVB #SPACE,(R2)+ CMP R2,#LBUF+^D43 BLO 4$ TST MF ;MONTHLY ? BEQ 6$ ;NO MOV L$CNT(R5),R0 ;GET NO. OF SAMPLES CALL CVT2 ;CONVERT TO ASCII CMPB -2(R2),#'0 BNE 77$ MOVB #SPACE,-2(R2) 77$: ; TAB : 5$: MOVB #SPACE,(R2)+ CMP R2,#LBUF+^D48 BLO 5$ 6$: MOV R2,(PC)+ ;SAVE PN .TITLE TDPS ;++ ; ; EDITS: ; ; 17-JUL-74 JER ADD CODE TO UPDATE THE SYSTEM DATE WORD ; AT MIDNIGHT. ; ;-- R0= %0 R1= %1 R2= %2 R3= %3 R4= %4 R5= %5 SP= %6 PC= %7 ; GLOBAL DEFINITIONS: .GLOBL CLOCK ;CLOCK SCAN ROUTINE .GLOBL TDS ;TIME DEPENDENT SCHEDULER .GLOBL ROBIN ;ROUND ROBIN SCHEDULER ; GLOBAL REFERENCES: .GLOBL BACKGD ;BACKGROUND ACTIVE FLAG .GLOBL COUNT ;TICKS POINTER .GLOBL CUTSL ;CUT A SLOT .GLOBL CUTSL1 ;CUT A SLOT (ALTERNATE ENTRY TO CUTSL) .GLO .TITLE USRTIC - INPUT AT CLOCK TICK TIME DR1CSR= 167770 ;DR11 CONTROL/STATUS REG. ADDRESS ADCS0= 176770 ;1ST A/D CSR ADDRESS ADCS1= 164000 ;2ND A/D CSR ADDRESS .GLOBL USRTIC .GLOBL DIGBUF,DIGEND,MCTAB .GLOBL AE.LIM,A$CHAN,A$ADV .MCALL .PARAM .PARAM USRTIC: DIGIN: .IF NDF,NODSIM ;! IF SIMULATOR VERSION: BIT #40000,@#2 ;! SIMULATOR MODE? BEQ 60$ ;! NO MOV @#SWR,R4 ;! GET SWITCHES ;! 'BYTE' CODE IN LOW SWR & DATA IN HIGH SWR: SWAB R4 ;! MOV R4,R3 ;! CLRB R3 ;! EBSZ ;ECHO BUFFER FULL? BGE KB.INV ;YES-FORCE ECHO OUT TSTB EF(R5) ;ECHO FLAG SET? BNE .+6 ;YES- INCB EF(R5) ;NO-SET IT TO +1. TSTB TKO.CT(R5) ;XFER INPROGRESS? BLE KB.INJ ;YES-- KB.INV: MOVB #-1,EF(R5) ;NO-START ECHO OUT MOVB #100,@TKO.CS(R5) ;AND START PRINTER. KB.INJ: BIC #-177-1,R2 ;GET ORIGINAL CHARACTER. MOV (SP)+,R5 ;GET ORIGINAL R5 KB.INM: TSTB K.OPF(R5) ;OPEN CALL? BNE KB.INR ;YES- CMPB R2,#15 ;NOW CHECK FOR LINE TERMINATORSTR BVP: .WORD 0 ADD #^D10,BVP ;MAKE PNTR TO 'UNITS' TST L$CNT(R5) ;HAVE ANY DATA ? BEQ 8$ ;NO MOVB L$DEC(R5),R3 ;GET DEC. POS. / TIME FLAG BMI 7$ ;'TIME' VALUE MOV R5,R0 ;MOVE INDEX TO R0 MOV R$LVAL(R0),R4 ;GET FLT-PNT NO. ... MOV R$LVAL+2(R0),R5 .PUSH #^D8 ;PUSH FIELD WIDTH .PUSH R3 ;PUSH DEC. POSITION CALL FLT2AS ;CONVERT TO ASCII MOV R0,R5 ;INDEX BACK TO R5 BR 8$ 7$: MOVB #SPACE,(R2)+ MOVB #SPACE,(R2)+ MOVB #SPACE,(R2)+ MOVB V$LVAL(R5),R0 ;GET HOUR CALL CVT2 BL CYCSEC ;LINE FREQUENCY IN TICKS PER SECOND .GLOBL DATE ;SYSTEM DATE WORD .GLOBL HOUR ;CURRENT TIME .GLOBL HSASI ;HIGH SPEED ACTIVATE SUBROUTINE .GLOBL LEV ;HEAD OF THE LINKED LISTS .GLOBL LTDT ;LAST TIME IN TIMER .GLOBL MIN ;CURRENT TIME .GLOBL N ;SCHEDULING TABLE SIZE .GLOBL MN ;-N .GLOBL NEWSA ;NEW PROGRAM ACTIVE FLAG .GLOBL PRWT ;COUNT OF TASKS WAITING FOR PROCESSOR .GLOBL PSTB ;PRIORITY STATUS .GLOBL PTBK ;BACKWARD POINTER LIST .GLOBL PTFW ;FORWARD POINTER LIST .GLOBL SESWAB R3 ;! ADD #DIGBUF,R3 ;! R3 PNTS TO BYTE IN DIGBUF CMP R3,#DIGEND ;! OUTSIDE BUFFER? BHIS ANAIN ;! YES: INVALID 'BYTE' CODE MOVB R4,@R3 ;! STORE DATA BYTE BR ANAIN ;! 60$: ;! .ENDC ;! MOV (PC)+,R0 ;GET BUFFER POINTER BUFP: .WORD DIGEND ;CURRENT PNTR INTO DIGITAL BUFFER ; NOTE: FIRST READ IS STORED AT DIGEND: ,SINCE IT IS INVALID MOV (PC)+,R1 ;GET PNTR TO NEXT CODE CODP: .WORD MCTAB ;PNTR TO NEXT CODE TO BE USED MOV @#DR1CSR+4,@R0 ;READ CARD, STORE IN BUFFER, COM (R0) BHI KB.EX ;NO- CMPB R2,#12 BLO KB.EX ;NO- INCB K.TRM(R5) ;SET TERMINATOR INDICATOR .IFNZ TK.NOU TST R5 ;CONSOLE? BPL KB.INW ;NO-SKIP CNTRL-C TEST. .ENDC TST K.CCF ;COMMAND MODE? BNE KB.INK ;YES-GO START OPERATOR TASK KB.INW: TST K.BC(R5) ;ELSE-CHECK IF A TRANSFER IS REQUESTED. BLE KB.TFB ;GO DO TRANSFER KB.EX: RTS PC ; KB.INH: MOV K.BUF(R5),(R4) ;CNTRL-U SEEN - RESET BR KB.INI ;INPUT PTR. ; KB.ING: DEC (R4)+ ;RUB OUT SEEN - BACK UP INPUT POINTER MOVB @-(R4),R2 ;;CONVERT TO ASCII MOVB V$LVAL+1(R5),R0 ;GET MINUTE CALL CVT2S ;CONVERT TO ASCII 8$: MOVB #SPACE,(R2)+ CMP R2,BVP BLO 8$ MOV LUNI,R1 ;GET UNITS PNTR CALL EXPAND ;MOVE UNITS STRING INTO LINE 9$: CMPB -(R2),#SPACE ;SUPRESS TRAILING SPACES ... BEQ 9$ INC R2 CALL ENDMES ;WRITE LINE NXTL: ADD #4,R5 ;ADVANCE INDEX CMP R5,#LB.LIM ;FINISHED ? BHIS 10$ ;YES JMP LLOOP ;GO DO NEXT ONE 10$: RETURN WLHED: CALL PAGE ;WRITE HEADING CALL SETP ;SET OUTPUT BUFFER PNTR. MOV #LDS,R1C ;CURRENT TIME .GLOBL SL ;MINUTES AT START(HI BYTE),SECONDS AT LAST UPDATE(LO BYTE) .GLOBL SM ;MAXIMUM LEVEL 1 RUN TIME (SECONDS) .GLOBL SR ;SECONDS SINCE BEGINNING OF THIS RUN .GLOBL SUTB ;SUSPEND STATUS .GLOBL S.RRES ;SYSTEM REGISTER RESTORE ROUTINE .GLOBL S.RSAV ;SYSTEM REGISTER SAVE ROUTINE .GLOBL TACKW ;TACK A SLOT TO WAITING LIST .GLOBL TIC ;TIME IN COUNTER TO NEXT EVENT .GLOBL TIMER ;MAX RUN TIME EXCEEDED .GLOBL TSPW ;DELAYED CONSOLE WAIT FLAG .GLOBL WDTB ;HEADER ADDRESS TABL+ ; AND COMPLEMENT CMP R0,#DIGEND ;LAST WORD JUST STORED? BLO 1$ ;NO MOV #DIGBUF,R0 ;RESET BUFFER POINTER MOV #MCTAB,R1 ; AND CODE POINTER 1$: MOVB (R1)+,@#DR1CSR+2 ;OUTPUT NEXT CARD CODE MOV R1,CODP ;SAVE CODE POINTER MOV R0,BUFP ; AND BUFFER POINTER .PAGE ANAIN: .IF NDF,NOASIM ;! IF SIMULATOR VERSION BIT #20000,@#2 ;! SIMULATOR MODE? BEQ 71$ ;! NO MOV @#SWR,R4 ;! GET SWITCHES ;! POINT NO. IN BITS 15-10, VALUE IN BITS 9-0 MOV R4,R3 ;! SWAB R3 ;! ASR R3 ;! BIC #AND GET CHARACTER FOR ECHO. BEQ KB.INL ;IF NULL, THIS IS BEGINNING OF BUFF - IGNORE R/O. BIS #200,R2 ;ELSE, SET HIGH BIT FOR "\" ECHO. BR KB.INI ; KB.INL: INC (R4) ;RESTORE INPUT PTR. RTS PC ; KB.INK: CLR K.CCF ;EXIT FROM COMMAND MODE. DEC (R4)+ ;BACK UP INPUT PTR CLRB @-(R4) ;TERMINATE COMMAND LINE WITH NULL. JSR PC,KB.RES ;RESET INPUT POINTERS CLR R2 ;NO DATA TO PASS MOVB #OPERT,R0 ;TASK INDEX TO R0 KB.IND: JSR R5,HSASI ;ACTIVATE TASK. RTS PC RTS PC ; DATA FOR OPERATOR ;ASSUME DAILY: SET SUBHEAD PNTR TST MF ;DAILY ? BEQ 1$ ;YES MOV #LMS,R1 ;SET MONTHLY SUBHEAD PNTR 1$: JMP EXPEND ;MOVE, WRITE, & RETURN LS1: MOVB #SPACE,(R2)+ ;STORE A SPACE LS2: MOVB #'-,(R2)+ ;STORE TWO ... MOVB #'-,(R2)+ ; ... HYPHENS MOVB #SPACE,(R2)+ ;STORE A SPACE RETURN .PAGE .SBTTL COST REPORT ROUTINES .GLOBL CD$UC CSTPR1: CLR TCST ;ZERO TOTAL ... CLR TCST+2 ; ... COST CLR (PC)+ ;ZERO INDEX CI1: .WORD 0 RETURN TULPR: .PUSH R5 ;SAVE R5 .PUSH R2 ;SAE .PAGE .SBTTL TIME DEPENDENT SCHEDULING ; CALLING SEQUENCE IS: ; ; JSR PC,TDS TDS: MOVB LEV,R3 ;GET INDEX OF FIRST IN LIST BEQ TDS17 ;IF ZERO WE'RE DONE MOVB PTBK(R3),-(SP) ;GET INDEX OF LAST TO SCAN MOVB PTFW(R3),-(SP) ;GET INDEX OF NEXT TO SCAN MOV LTDT,R4 ;GET LAST TIME IN TIMER MOV #-1,R5 ;BEST DELAY IS LARGEST POSSIBLE TDS2: MOV WDTB(R3),R2 ;GET TIMER VALUE BEQ TDS15 ;IF ZERO TIMER IS TURNED OFF TEMPORARILY SUB R4,R2 ;SUBTRACT OUT INTERVAL BHI TDS13 ;IF HI NOT TIM^C176,R3 ;! R3=POINT INDEX CMP R3,#AE.LIM ;! VALID POINT INDEX? BHIS 70$ ;! NO: IGNORE IT BIC #^C1777,R4 ;! R4=POINT VALUE MOV R4,A$ADV(R3) ;! STORE VALUE IN ARRAY 70$: RTS PC ;! RETURN 71$: .ENDC MOV (PC)+,R1 ;GET LAST POINT INDEX PINDEX: .WORD -1 ;NEGATIVE THE FIRST TIME BMI ZPI ;1ST TIME: DON'T STORE ANYTHING MOV (PC)+,R0 ;GET A/D CSR ADDRESS ADCSR: .WORD ADCS0 TSTB @R0 ;GOT READY FLAG? BPL 1$ ;NO: USE ZERO FOR VALUE MOV 2(R0),A$ADV(R1) ;STORE VALUE BR 2$ 1$: TST 2(R0) START CALL & NON CONSOLE OPERATOR TASK ; OPEN CALL KB.INR: CLRB K.OPF(R5) BR KB.TFI .IFNZ TK.NOU ; ; NON-CONSOLE INPUT TRANSFER ; TK.TFA: CLR TK ;NOT BUSY JSR PC,TT.GU ;GET UNIT # BR TK.TFB ;JOIN CONSOLE .ENDC ; ; CONSOLE INPUT TRANSFER ENTRY ; KB.TFA: MOV #-2,R5 ;UNIT # TK.TFB: MOV R0,TKI.TS(R5) ;SAVE DDB POINTER MOVB 12(R0),R4 ;GET ECHO SUPPRESS BIT BIC #-10-1,R4 MOVB R4,K.ESF(R5) ;PUT INTO FLAG. MOV 10(R0),R4 ;SET BYTE COUNT VE DEST. PNTR. CALL LPGAS ;CONVERT LP GAS TO ASCII BR TUCOM TUNATR: .PUSH R5 ;SAVE R5 .PUSH R2 ;SAVE DEST. PNTR. CALL NATGAS ;CONVERT NATURAL GAS TO ASCII BR TUCOM TUKWHR: .PUSH R5 ;SAVE R5 .PUSH R2 ;SAVE DEST. PNTR. CALL CKWH ;CONVERT KWH TO ASCII BR TUCOM TUCLR: .PUSH R5 ;SAVE R5 .PUSH R2 ;SAVE DEST. PNTR. MOV #A109,R3 ;SET INDEX FOR CHLORINE CALL TOTS ;CONVERT CHLORINE TO ASCII TUCOM: CLRB @R2 ;TERMINATE STRING .POP R1 ;GET SOURCE PNTR CALL AS2FLT ;CONE JSR R5,S.RSAV ;SAVE THE REGISTERS MOVB SUTB(R3),R0 ;GET TASK TO ACTIVATE BNE TDS4 ;IF NE THEN NOT A SYSTEM SUBROUTINE ; ; ACTIVATE A SYSTEM SUBROUTINE ; MOVB PSTB(R3),R4 ;GET EXTENSION INDEX JSR R3,@SUTB(R4) ;EXECUTE SUBROUTINE TDS3: MOV (SP)+,R3 ;RETRIEVE R3 MOVB PSTB(R3),R4 ;GET EXTENSION ADDRESS BACK BR TDS6 ; ; TRY TO ACTIVATE A TASK ; TDS4: CLR R2 ;ASSUME NO DATA MOVB PSTB(R3),R4 ;GET EXTENSION WORD BEQ TDS5 ;IF ZERO GO MAN GO CMP R4,#MN ;TEST FOR WAIT BEQ TDS7 ;I ;ACCESS DATA REG. CLR A$ADV(R1) ;USE ZERO FOR VALUE 2$: TST (R1)+ ;ADVANCE POINT INDEX CMP R1,#AE.LIM ;FINISHED? BLO SNXT ;NO ZPI: CLR R1 ;RESET POINT INDEX SNXT: MOV R1,PINDEX ;SAVE POINT INDEX MOV #ADCS0,R0 ;ASSUME 1ST A/D MOVB A$CHAN(R1),CHAN ;GET CHANNEL CODE NUMBER ASRB CHAN ;FORM CHANNEL & GET ADC BCC 3$ ;R0 IS CORRECT MOV #ADCS1,R0 ;SWITCH TO 2ND A/D ADDRESS 3$: MOV (PC)+,@R0 ;START CONVERSION .BYTE 1 ;'GO' BIT & 10V. RANGE CHAN: .BYTE 0 ;CHANNEL NO. MOV R0,ADCSR ;ASL R4 MOV R4,K.BC(R5) MOV 6(R0),K.DP(R5) ;SET DATA POINTER TSTB K.TRM(R5) ;LINE AVAILABLE FOR TRANSFER? BNE KB.TFB ;YES-GO TO IT. TSTB K.ENFL(R5) ;CHECK FOR END OF DATA. BNE KB.SC ;YES- RTS PC KB.TFB: MOV #K.OUT,R4 ;YES-SET POINTERS MOV #K.BC,R3 MOV #K.DP,R1 ADD R5,R4 ;ADJUST FOR UNIT #. ADD R5,R3 ADD R5,R1 KB.TFH: MOVB @(R4)+,R2 ;GET A CHARACTER INC -(R4) ;ADVANCE POINTER CMPB R2,#15 ;CR? BNE KB.TFC ;NO- DEC (R4)+ ;YES-BACK UP THE POINTER AND MOVB #12,@-(R4) ;CVERT TO FLOATING POINT MOV CI1,R0 ;GET INDEX MOV R4,TU(R0) ;SAVE TOTAL ... MOV R5,TU+2(R0) ; ... USAGE .POP R5 ;RESTORE R5 RETURN UCR: .PUSH R5 ;SAVE R5 MOV CI1,R0 ;GET INDEX TST UC(R0) ;HAVE NON-ZERO UNIT COST ? BNE 1$ ;YES: O.K. MOV CD$UC(R0),UC(R0) ;USE CURRENT COST INSTEAD MOV CD$UC+2(R0),UC+2(R0) 1$: MOV UC(R0),R4 ;GET UNIT ... MOV UC+2(R0),R5 ; ... COST .PUSH #8. ;SET NO. CHAR. IN FIELD .PUSH #4. ;SET NO. DIGITS PAST DP CALL FLT2AS ;CONVERT TO ASCII .POP R5F EQUAL REACTIVATE MOV SUTB(R4),R2 ;DATA TO PASS TO R2 TDS5: JSR R5,HSASI ;TRY TO ACTIVATE TASK BR TDS11 ;WON'T GO - TRY AGAIN LATER TST R4 ;TEST FOR EXTENSION WORD BEQ TDS9 ;IF ZERO ALWAYS CUT SLOT TST WDTB(R4) ;ANY REPEAT CYCLE? BEQ TDS8 ;NO: CUT BOTH SLOTS TST R1 ;IS A REQUEST QUEUED? BEQ TDS6 ;NO CLR WDTB(R3) ;TURN OFF TIMER TEMPORARILY MOVB R3,SUTB(R1) ;SET FLAG IN QUEUED REQUEST SLOT BR TDS10 TDS6: MOV WDTB(R4),WDTB(R3) ;RESET REPEAT CYCLE BR TDS12 TDS7: TSTB TSPW ;SAVE HARDWARE ADDRESS RTS PC ;RETURN .END HANGE IT TO A LF. KB.TFC: MOVB R2,@(R1)+ ;GIVE CHARACTER TO REQUESTOR. INC -(R1) ;ADVANCE POINTER CMP (R4),K.IN(R5) ;ALL CHARS GONE? BHIS KB.TFE ; YES- KB.TFD: INC (R3) ;NO - IS REQUEST DONE? BLT KB.TFH ;NO - GO GET ANOTHER CHARACTER. BR KB.TFI ;YES - TAKE COMPLETION EXIT. KB.TFF: CLRB @(R1)+ ;GIVE A NULL TO REQUESTOR INC -(R1) ;ADVANCE POINTER KB.TFE: TSTB K.ENFL(R5) ;END OF DATA FROM KEYBOARD? BNE KB.SC ;YES-GO TERMINATE NOW. INC (R3) ;RESTORE R5 RETURN TCR: .PUSH R5 ;SAVE R5 .PUSH R2 ;SAVE DEST. PNTR. MOV CI1,R0 ;GET INDEX .PUSH TU+2(R0) ;PUSH ... .PUSH TU(R0) ; ... QUANTITY .PUSH UC+2(R0) ;PUSH ... .PUSH UC(R0) ; ... UNIT COST JSR R4,THREAD ;ENTER THREADED MODE $MLR ;FLOATING POINT MULTIPLY .WORD .+2 ;THREADED EXIT MOV CI1,R0 ;GET INDEX AGAIN MOV 2(SP),UC+2(R0) ;SAVE COST OF ... MOV @SP,UC(R0) ; ... THIS ONE .PUSH TCST+2 ;PUSH TOTAL COST ... .PUSH TCST ; ... SO FAR JSR R4,THREAD ;ENTER BACKGROUND REQUEST FLAG SET? BEQ TDS7A ;NO CMPB R0,BACKGD ;IS THIS A BACKGROUND TASK? BNE TDS7A ;NO MOVB #-4,SUTB(R0) ;SET CONSOLE WAIT STATE CLRB TSPW ;RESET REQUEST FLAG BR TDS9 ;GO RELEASE SLOT TDS7A: CLRB SUTB(R0) ;SET TASK ACTIVE MOVB PSTB(R0),R4 ;TASK PRIORITY TO R4 INCB PRWT-1(R4) ;INCREMENT COUNT AT LEVEL INCB NEWSA ;FORCE SCHEDULING BR TDS9 TDS8: MOV R4,R1 ;CUT EXTENSION SLOT FIRST JSR PC,TACKW TDS9: MOV R3,R1 ;CUT SLOT FROM LIST JSR PC,CUTSL ;CUT SLOT FROM LIST ;PARAMETER FILE FOR RSX11C KBFSZ= 20. TPSZ= 80. TK.NOU= 1. DT.DSC= 2 IO.XTH= 6 NO.FIL= 0 NO.STT= 0 NO.CSI= 0 NO.GET= 0 ;END OF PARAMETERS ;COUNT THE CHARACTER. BLT KB.TFF ;NOT DONE YET - KB.TFG: MOV #1,K.BC(R5) ;DON'T LEAVE A 0 COUNT JSR PC,KB.RES KB.TFI: JMP @14(R0) ;COMPLETION EXIT. .IFNZ TK.NOU ; ;NON CONSOLE INPUT OPEN ; TK.OPA: CLR TK ;NOT BUSY JSR PC,TT.GU ;GET UNIT # BR TK.OPC ;JOIN NORMAL OPEN/CLOSE ; ; NON-CONSOLE INPUT CLOSE ; TK.CLA: CLR TK ;NOT BUSY JSR PC,TT.GU ;GET UNIT # BR TK.OPB ;JOIN CONSOLE .ENDC ; ; CONSOLE INPUT OPEN/CLOSE ; KB.OPA: MOV #-2,R5 ;UNIT # TK.OPB: JSR PC,KB.RES CLRTHREADED MODE $ADR ;FLOATING POINT ADD .WORD .+2 ;THREADED EXIT .POP TCST ;SAVE TOTAL COST ... .POP TCST+2 ; ... SO FAR MOV CI1,R0 ;GET INDEX AGAIN MOV UC(R0),R4 ;GET COST OF ... MOV UC+2(R0),R5 ; ... THIS ONE .POP R2 ;RESTORE DEST. PNTR. .PUSH #8. ;SET NO. CHAR. IN FIELD .PUSH #2. ;SET NO. DIG. PAST DP CALL FLT2AS ;CONVERT TO ASCII .POP R5 ;RESTORE R5 ADD #4,CI1 ;STEP INDEX TO NEXT ONE RETURN TTC: .PUSH R5 ;SAVE R5 MOV TCST,R4 ;GET TOTAL COST ... MOV TCST+ TDS10: JSR R5,S.RRES ;RESTORE THE REGISTERS BR TDS15 TDS11: MOV #1,WDTB(R3) ;SET SHORT TIME FOR LATE TASK TDS12: JSR R5,S.RRES ;RESTORE THE REGISTERS BR TDS14 TDS13: MOV R2,WDTB(R3) ;SET NEW TIME LEFT TDS14: CMP R5,WDTB(R3) ;COMPARE INTERVALS BLOS TDS15 MOV WDTB(R3),R5 ;SET NEW LOW TDS15: CMPB R3,2(SP) ;END OF SCAN? BEQ TDS16 ;YES MOVB (SP)+,R3 ;GET NEXT TO SCAN MOVB PTFW(R3),-(SP) ;GET NEXT TO SCAN BR TDS2 ;GO AROUND AGAIN TDS16: CMP (SP)+,(SP)+ ;CLEAN UP STACK MOV R5,LTDT ;SA; RT-11 FORTRAN SYSTEM SUBROUTINE LIBRARY ; DEC-11-ORLBA-E-LA ; ; ; ; ; ; ; ; ; ; ; COPYRIGHT (C) 1975 BY DIGITAL EQUIPMENT CORPORATION ; MAYNARD, MASSACHUSSETTS ; ; ; ; ; ; ; ; ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ; ON A SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH ; THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS ; SOFTWARE, OR ANY OTHER COPIES THEREOF, MAY NOT BE PRO- ; VIDED OR OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON ; EXCEPT FOR K.TRM(R5) ;NO TERMINATOR & CLEAR RUBOUT MODE. TK.OPC: MOV #1,K.OPF(R5) ;SET OPEN FLAG AND CLEAR ECHO SUPPRESS FLAG. CLRB K.ENFL(R5) ;NO END OF DATA MOV #15,R2 ;GET A CR TO PUT INTO ECHO BUFF. .IFNZ TK.NOU CMPB EC(R5),#EBSZ ;ECHO BUFF FULL? BLT TK.OPD ;NO- JMP KB.INR ;YES-SKIP OUTPUT OF CR,LF .ENDC TK.OPD: JMP KB.INI ;GO ECHO CR,LF ; COME HERE IF END OF DATA SEEN. KB.SC: MOV K.BC(R5),R1 ;GET REMAINING BC CLRB K.ENFL(R5) ;CLEAR END OF DATA FLAG. BR KB.SB .IFNZ TK.NOU ;NON CONSO2,R5 .PUSH #8. ;SET NO. CHAR. IN FIELD .PUSH #2. ;SET NO. DIG. PAST DP CALL FLT2AS ;CONVERT TO ASCII .POP R5 ;RESTORE R5 RETURN TRSR: .PUSH R5 ;SAVE R5 .PUSH R2 ;SAVE DEST. PNTR. MOV #A026,R3 ;GET INDEX FOR RAW SEWAGE CALL TOTS ;CONVERT TO ASCII CLRB @R2 ;TERMINATE STRING .POP R1 ;GET SOURCE PNTR. CALL AS2FLT ;CONVERT TO FLOATING POINT MOV R4,TRS ;SAVE TOTAL RAW SEWAGE FLOW ... MOV R5,TRS+2 .POP R5 ;RESTORE R5 RETURN CSTPR2: CLR CI1 ;ZERO INDEX RETURN VE NEW INTERVAL ADD R5,TIC ;ADD INTERVAL TO TIC BLE TDS ;IF LE GO AGAIN TDS17: RTS PC ;RETURN .PAGE .SBTTL TIME OF DAY SCHEDULER CLOCK: MOV #SEC,R1 ;ADDRESS OF SECONDS IN TIME ARRAY CLCK1: CMPB @R1,#^D59 ;WILL IT CARRY? BLO CLCK2 ;NO CLRB (R1)+ ;RESET THIS ONE & STEP TO NEXT BR CLCK1 ;PROPOGATE CARRY CLCK2: INCB @R1 ;INCREMENT APPROPRIATE TIME VALUE CMPB HOUR,#^D24 ;MIDNIGHT YET? BLO CLCK4 ;NO CLRB HOUR ;RESET HOUR TO ZERO CLR COUNT ;CLEAR TICKS COUNT CLR COUNT+2 USE ON SUCH SYSTEM AND TO ONE WHO AGREES TO ; THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE ; SOFTWARE SHALL AT ALL TIMES REMAIN IN DIGITAL. ; ; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE ; WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ; COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. ; ; DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY ; FOR THE USE OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT ; WHICH IS NOT SUPPLIED BY DIGITAL. ; ; ; ; ; ; ; ; ; LE CANCEL TT.S: JSR PC,TT.GU ;GET UNIT # BR KB.SA .ENDC ;CONSOLE CANCEL KB.S: MOV #-2,R5 ;UNIT # KB.SA: MOV K.BC(R5),R1 ;TRANSFER IN PROGRESS? BGT KBO.SX ;NO - RETURN KB.SB: SUB #6,R1 ;INSURE A NON-ZERO VALUE ASR R1 ;CONVERT REMAINING BC TO WORD COUNT MOV R1,16(R0) ;RETURN RESULT TO CALLER BR KB.TFG ;EXIT. ; PUT POINTERS TO IN AND OUT POINTERS INTO R4 AND R3 KB.CRP: MOV R5,R4 ;CREATE POINTERS TO BUFFER POINTERS MOV R5,R3 ADD #K.IN,R4 ADD #K.OUT,R3 KBO.SX: RTS PC ;SUBROUTUPER: .PUSH R5 ;SAVE R5 .PUSH R2 ;SAVE DEST. PNTR. MOV CI1,R0 ;GET INDEX .PUSH TU+2(R0) ;PUSH USAGE FOR ... .PUSH TU(R0) ; ... THIS ONE CLR DPXX ;SET DP POSITION BR PERCOM CPER: .PUSH R5 ;SAVE R5 .PUSH R2 ;SAVE DEST. PNTR. MOV CI1,R0 ;GET INDEX ADD #4,CI1 ;STEP INDEX TO NEXT ONE .PUSH UC+2(R0) ;PUSH COST FOR ... .PUSH UC(R0) ; ... THIS ONE MOV #2,DPXX ;SET DP POSITION PERCOM: .PUSH TRS+2 ;PUSH TOTAL RAW ... .PUSH TRS ; ... SEWAGE FLOW JSR R4,THREAD ;ENTER THR; UPDATE THE DATE: MOV DATE,R0 ;GET SYSTEM DATE WORD MOV #^D69,R1 ;SET STARTING YEAR 1$: INC R1 ;INC YEAR SUB #^D1000,R0 ;SUB A YEAR FROM DATE BHI 1$ ;DO IT AGAIN ; R0 NOW = < - ^D1000> CMP R0,#^D365-^D1000 ;LAST DAY OF YEAR? BLO 3$ ;NO BIT #3,R1 ;LEAP YEAR? BNE 2$ ;NO - THIS WAS LAST DAY OF NORMAL YEAR CMP R0,#^D366-^D1000 ;LAST DAY OF LEAP YEAR? BLO 3$ ;NO 2$: SUB R0,DATE ;DATE= 'ZERO' DAY OF NEXT YEAR 3$: INC DATE ;BUMP DATE ; END OF DATE UPDATE MOVB L; ; ; ; .TITLE JFLT INTEGER*4 TO FLOATING ; H.J. R0= %0 R1= %1 R2= %2 R3= %3 R4= %4 R5= %5 SP= %6 PC= %7 .GLOBL DJFLT,IDJFLT,IAJFLT,AJFLT,$SETR0 IDJFLT: DJFLT: MOV (PC)+,-(SP) ;SET D ENTRY FLAG IAJFLT: AJFLT: CLR -(SP) ;SET A ENTRY FLAG MOV (R5)+,-(SP) ;SAVE ARG COUNT MOV (R5)+,R4 ;GET ADDR OF I*4 QUANTITY CLR R2 ;INIT POSSIBLE 3RD WORD OF RESULT MOV (R4)+,R1 ;GET LOW PART BNE 1$ ;BRANCH IF NOT 0 MOV @R4,R0 ;IS ENTIRE NUMBER 0 BEQ 7$ ;BRANCH IF YES INE TO GET PTRS TO BUFF PTRS ; AND TO RESET BUFF POINTERS, ; TERMINATOR FLAG AND ECHO SUPPRESS FLAG ; KB.RES: JSR PC,KB.CRP ;GET PTRS TO POINTERS. MOV K.BUF(R5),(R3);RESET BUFF POINTERS. MOV (R3),(R4) CLRB K.TRM(R5) ;NO TERMINATOR CLRB K.ESF(R5) ;NO ECHO SUPPRESS RTS PC ; ; CHECK FOR WRAP AROUND OF ECHO POINTER ; CALL WITH ;R5=UNIT # ; JSR PC,K.CWR ;R1=PTR OF INTEREST ; ;BLOWS R3 ; K.CWR: MOV R1,R3 ;FORM DIFFERENCE BETWEEN CURRENT SUB EBP(R5),R3 ;PTR AND BEGINNING OF BUFF. EADED MODE $DVR ;FLOATING POINT DIVIDE .WORD .+2 ;THREADED EXIT .POP R4 ;GET ... .POP R5 ; ... ANSWER .POP R2 ;GET DEST. PNTR. .PUSH #8. ;SET NO. CHAR. IN FIELD .PUSH DPXX ;SET NO. DIG. PAST DP CALL FLT2AS ;CONVERT TO ASCII .POP R5 ;RESTORE R5 RETURN TCPER: .PUSH R5 ;SAVE R5 .PUSH R2 ;SAVE DEST. PNTR. .PUSH TCST+2 ;PUSH TOTAL COST .PUSH TCST .PUSH TRS+2 ;PUSH TOTAL RAW ... .PUSH TRS ; ... SEWAGE FLOW JSR R4,THREAD ;ENTER THREADED MODE $DVR ;FLOATING POEV+5,R5 ;INDEX OF FIRST ENTRY IN TIME OF DAY LIST BEQ CLCK9 ;IF ZERO NONE CLCK3: MOVB PSTB(R5),R3 ;GET HOURS FOR TASK TO ACTIVATE SUB #^D24,R3 ;NORMALIZE TIME MOVB R3,PSTB(R5) ;STORE NEW HOURS MOVB PTFW(R5),R5 ;GET NEXT IN LIST CMPB R5,LEV+5 ;FIRST? BNE CLCK3 ;NO CLCK4: MOVB LEV+5,R5 ;GET INDEX OF FIRST BEQ CLCK9 ;IF ZERO NONE MOVB PTBK(R5),-(SP) ;GET INDEX OF LAST TO SCAN MOVB PTFW(R5),-(SP) ;GET INDEX OF NEXT TO SCAN CLCK5: CMPB HOUR,PSTB(R5) ;COMPARE HOURS BLO CLCK7 ;NOT TIME1$: MOV @R4,R0 ;GET HIGH PART BPL 2$ ;BRANCH IF POSITIVE NEG R0 ;NEGATE HIGH PART, C=1 NEG R1 ;NEGATE LOW PART SBC R0 2$: MOV #237,R3 ;SET MAXIMUM EXP+1 3$: BIT #177400,R0 ;LOOK FOR A STRING OF 8 0 BITS BNE 5$ ;BRANCH IF NOT FOUND SWAB R0 ;LEFT JUSTIFY THEM SUB #8.,R3 ;PERFORM A SHIFT BY 8 SWAB R1 BISB R1,R0 ;INSERT NEW BITS CLRB R1 ;REMOVE THEM BR 3$ ;TRY AGAIN 4$: DEC R3 ;FIX EXP COUNT ROL R1 ;NORMALIZE R0:R1 ROL R0 5$: BPL 4$ ;LOOP TILL IMPLIED NORM BIT IN SICMP R3,#EBSZ ;GONE TOO FAR? BLO .+4 ;NO - SUB R3,R1 ;YES - BACK UP THE POINTER RTS PC ; ; ROUTINE TO FETCH UNIT #*2 FROM DDB ; ; ALTERNATE ENTRY AT TT.GUA WILL FETCH ; UNIT #*2 FROM R5 ; ; CALL JSR PC,TT.GU ;R0=DDB ADDR. ; ; OR CALL JSR PC,TT.GUA ;R5=UNIT # ; TT.GU: MOVB 13(R0),R5 ;GET UNIT # FROM DDB TT.GUA: BIC #-7-1,R5 ;SAVE LOW 3 BITS ASL R5 ;CONVERT TO UNIT #*2 RTS PC SWAPK: MOV #-2,R4 ;SET R4= KB UNIT (R5= NEW UNIT) CALL SWAP INT DIVIDE .WORD .+2 ;THREADED EXIT .POP R4 ;GET ... .POP R5 ; ... ANSWER .POP R2 ;GET DEST. PNTR. .PUSH #8. ;SET NO. CHAR. IN FIELD .PUSH #2. ;SET NO. DIG. PAST DP CALL FLT2AS ;CONVERT TO ASCII .POP R5 ;RESTORE R5 RETURN TCST: .FLT2 0 TU: .REPT 4 .FLT2 0 .ENDM CDBF: .BLKW 1 ;TAPE DATE UC: .REPT 4 .FLT2 0 .ENDM TRS: .FLT2 0 DPXX: .WORD 0 .PAGE .SBTTL GENERAL ROUTINES XFER: .XFR #DTLNK,#XFRBLK ;REQUEST TRANSFER .WAIT #DTLNK ;WAIT FOR COMPLETION YET BHI CLCK6 ;ACTIVATE NOW CMPB MIN,WDTB+1(R5) ;COMPARE MINUTES BLO CLCK7 ;NOT TIME YET BHI CLCK6 ;ACTIVATE NOW CMPB SEC,WDTB(R5) ;COMPARE SECONDS BLO CLCK7 ;NOT TIME YET CLCK6: MOVB SUTB(R5),R0 ;GET TASK TO ACTIVATE CLR R2 ;NO DATA EVER PASSED JSR R5,HSASI ;TRY TO ACTIVATE TASK BR CLCK7 ;DIDN'T MAKE IT MOV R5,R1 ;INDEX OF SLOT TO CUT MOV #5,R0 ;LEVEL INDEX JSR PC,CUTSL1 ;CUT SLOT AND RELEASE CLCK7: CMPB R5,2(SP) ;LAST? BEQ CLCK8 ;YES MOVB (SP)+,R5 ;GET NEXT TO SCAGN BISB R1,R2 ;PUT IN BITS 25-32 SWAB R2 ;JUSTIFY IT CLRB R1 ;REMOVE THE BITS FROM 2ND WORD BISB R0,R1 ;MOVE THE NEW ONES IN FROM R0 SWAB R1 ;JUSTIFY IT CLRB R0 ;REMOVE THEM FROM HIGH WORD SWAB R0 ;JUSTIFY IT SWAB R3 ;GET EXP INTO HIGH BYTE TST @R4 ;WAS ORIGINAL NUMBER + OR - BPL 6$ ;BRANCH IF POSITIVE, C=0 SEC 6$: ROR R3 ;INSERT WITH EXP ADD R3,R0 ;CREATE RESULT 7$: CLR R3 ;INIT JUST IN CASE D ENTRY DECB (SP)+ ;IS RESULT ARGUMENT WANTED? BNE 8$ ;BRANCH IF YES  ;SWAP THEM BICB #SY.DWN,@S.F(R4) ;MARK NEW KB FIXED MOV T.VCT(R4),R4 ;GET VECTOR ADDRESS MOV #KBO.IN,4(R4) ;SET PRINTER VECTOR BITB #SY.DWN,@S.F(R5) ;IS NEW TTN BROKE? BEQ FIX ;NO...JUST RESTART TASK IF ANY CMP T.VCT(R5),#KBVCT;IS NEW TTN VT05? BNE SWAPA ;NO INC FVFLG ;SET FLAG SO VECTOR WON'T BE CHANGED SWAPA: BISB #SY.DWN,@S.F(R5) ;MARK DEVICE BROKE TST R5 ;IS IT KB: ? BLT FIX ;YES ... FIX VECTOR ; ... AND TURN OFF TASK MOV #2*TK.NOU,R4 ;SET HIGHEST UNIT + 1 1$: SUB  TSTB STAT ;ANY ERRORS? BEQ 1$ ;NO ;!! ERROR STUFF HERE !! 1$: RETURN SETP: .WAIT #OLNK ;WAIT MOV #LBUF,R2 ;SET PNTR TO LINE BUFFER RETURN EXPEND: CALL EXPAND ;MOVE STRING INTO BUFFER ENDMES: MOVB #CR,(R2)+ ;TERMINATE MOVB #LF,(R2)+ ; LINE SUB #LBUF,R2 ;COMPUTE BYTE COUNT MOV R2,LBUFC ;STORE IT IN HEADER .WRITE #OLNK,#LBUFH ;WRITE THE LINE RETURN SETSB: MOV (PC)+,R1 ;GET DATA DATE PDATE: .WORD 0 SUB (PC)+,R1 ;R1=-1 MDATE: .WORD 0 MOV #^D18,R2 ;18. BLOCKN MOVB PTFW(R5),-(SP) ;GET INDEX OF NEXT TO SCAN BR CLCK5 ;GO AROUND AGAIN CLCK8: CMP (SP)+,(SP)+ ;CLEAN UP STACK CLCK9: JMP TDS3 ;RETURN .PAGE .SBTTL ROUND ROBIN SCHEDULER FOR LEVEL 1 ROBIN: MOVB LEV+1,R1 ;INDEX OF FIRST IN LIST BEQ CLCK9 ;IF ZERO NONE MOV R1,R5 ;COPY FIRST INDEX ROBIN2: MOVB PTFW(R5),R5 ;GET NEXT IN LIST CMP R1,R5 ;TEST FOR OLD FIRST BEQ ROBIN3 ;IF EQ END OF SEARCH TSTB PSTB(R5) ;TASK ACTIVE? BLE ROBIN2 ;NO ROBIN3: MOVB R5,LEV+1 ;STORE INDEX OF NEW FIRSTO STORE IT TST (SP)+ ;REMOVE EXTRA WORD RTS PC ;RETURN 8$: MOV @R5,R5 ;GET DESTINATION ADRESS MOV R0,(R5)+ ;STORE HIGH ORDER WORD MOV R1,(R5)+ ;STORE NEXT WORD TST (SP)+ ;2 WORD OR 4 WORD RESULT? BEQ 9$ ;BRANCH IF ONLY 2 WORD RESULT MOV R2,(R5)+ ;STORE NEXT WORD CLR @R5 ;STORE LAST WORD 9$: MOV R4,R1 ;SET POINTER TO I*4 QUANTITY FOR $SETR0 CLR R0 ;SET FOR $SETR0 JMP $SETR0 ;EXIT VIA $SETR0 ROUTINE .END #2,R4 ;BUMP DOWN ONE UNIT CMP R4,R5 ;REACHED BROKE UNIT YET? BLE FIX ;YES ... NO WORKING DEVICE AVAILABLE ... ; ...FIX VECTOR & TURN OFF TASK BITB #SY.DWN,@S.F(R4) ;IS IT WORKING? BNE 1$ ;NO...TRY NEXT ; SWAP BROKE R5 WITH WORKING R4 SWAPF: CALL SWAP ;SWAP DEVICES MOV TKO.CS(R4),R3 ;MAKE SURE MOV #100,(R3)+ ; BOTH PRINTERS CLRB @R3 ; WILL MOV TKO.CS(R5),R3 ; CAUSE MOV #100,(R3)+ ; AN CLRB @R3 ; INTERRUPT .PUSH R5 ;SAVE R5 MOV R4,R5 ;"FIX" THINGS FOR CALL FIXS / DAY CALL MULT INC R0 ;R0=START BLOCK FOR DAY IF ... CMP R0,#^D271 ;BEFORE "GLOBAL" TAPE SPACE? BLO 1$ ;YES...O.K. ADD #^D8,R0 ;ADD "GLOBAL" SPACE SIZE 1$: MOV R0,XFRBLK ;SET BLK. NUM. IN XFRBLK RETURN .PAGE .SBTTL TEXT LINES FOR REPORTS .MACRO L X .BYTE 15,12 .IF GT,X-1 .REPT X-1 .BYTE 12 .ENDM .ENDC .ENDM L .MACRO EM X .IF NB,X .IF GT,X .REPT X .BYTE 12 .ENDM .ENDC .ENDC .BYTE 0 .ENDM EM M001: L 2 Q EM 1 M002: Q < LPT IN LIST TSTB PSTB(R1) ;TASK ACTIVE? BLT CLCK9 ;NO INCB NEWSA ;CAUSE RESCHEDULING MOVB SEC,R0 ;GET CURRENT SECONDS MOV WDTB(R1),R2 ;GET HEADER ADDRESS MOV SM(R2),R3 ;GET MAXIMUM RUN TIME ALLOWED BLE CLCK9 ;IF LE DO NOT ACCUMULATE MOVB SL(R2),R4 ;GET TIME OF LAST UPDATE MOVB R0,SL(R2) ;STORE NEW LAST UPDATE TIME SUB R4,R0 ;CALCULATE TIME SINCE LAST UPDATE BEQ CLCK9 ;IF ZERO NO UPDATE NEEDED BGT ROBIN1 ;IF GT GO ACCUMULATE ADD #^D60,R0 ;ADJUST FOR MINUTE CROSSOVER ROBIN1:  ; R4 DEVICE .POP R5 ;RESTORE R5 FIX: BITB #SY.DWN,@S.F(R5) ;BROKE? BEQ 2$ ;NO...DON'T CHANGE VECTOR TST FVFLG ;INHIBIT VECTOR FIX? BNE 2$ ;YES MOV T.VCT(R5),R4 ;GET VECTOR ADDRESS MOV #TT.DWN,4(R4) ;SET VECTOR TST R5 ;KB: ? BGE 2$ ;NO MOV #KB.DWN,4(R4) ;SET VECTOR CORRECTLY FOR KB 2$: CLR (PC)+ ;RESET 'INHIBIT VECTOR FIX' FLAG FVFLG: .WORD 0 CALL TOFFB ;TURN OFF ANY TASKS BEQ 3$ ;NO TASK ON PRINTER ... DONE BITB #SY.DWN,@S.F(R5) ;BROKE? BEQ 4$ ;NO ... RESTART TASK  GAS ^ GAL.> EM M003: Q < NATURAL GAS ^ MCF> EM M004: Q < ELECTRIC POWER ^ KWH> EM M005: Q < CHLORINE ^ LB> EM 2 M006: Q EM M007: L 3 Q EM M008: Q < MGD MGD MGD MG> EM 1 M009: Q < RAW SEWAGE ^> EM M010: Q < RETURN SLUDGE ^> EM M011: Q < THICKENED SLUDGE ^> EM M012: Q < WASTE SLUDGE ^> EM M013: Q < FADD #SR,R2 ;CALCULATE ADDRESS OF RUN TIME ADD R0,@R2 ;ADD IN NEW ELAPSED TIME CMP @R2,R3 ;COMPARE AGAINST MAX BLO CLCK9 ;IF LO STILL OK MOV @R2,-(SP) ;MOVE TIME TO STACK CLR @R2 ;CLEAR ACCUMULATED TIME MOV #TIMER,-(SP) ;CLASS NUMBER MOV R1,-(SP) ;SET TASK INDEX IOT ;OUTPUT ERROR MESSAGE BR CLCK9 ;RETURN .END RD LSIN ;ROUTINE ADDRESS .BYTE 'G,'L ;'VIEW/CHANGE' GROUP: G-L .WORD VC ;ROUTINE ADDRESS .BYTE '@,'@ ;TEMP. FOR DOS ;^ .WORD DBOOT ;^ .WORD 0 ;END OF LIST ;^ DBOOT: BIT #1,@#2 ;^ O.K. TO BOOT? BEQ IVC ;^ NO BOOT: RESET ;^ MOV #177406,R0;^ MOV #-256.,@R0;^ MOV #5,-(R0);^ 1$: TSTB @R0 ;^ BPL 1$ ;^ TST @R0 ;^ BMI BOOT ;^ JMP @#0 ;^ .PAGE .SBTTL DECTAPE REPORT FUNCTION REP: MOV #DTREPT,R0 ;DTREP TASK INDEX TSTB PSTB(R0) ;IS DTREP TASK ACTIVE? BLT REP.1 ;NO MO  3$: RETURN 4$: CLR R2 ;PASS ZERO DATA ; PRINTER TASK INDEX IS IN R0 FROM TOFFB CALL JMP KB.IND ;GO START TASK AND RETURN ; KB: INTERRUPT ENTRY FOR BROKE DEVICE KB.DWN: JSR R5,STRG ;SAVE REGISTERS SUB PC,R5 ;R5= -2 .IF NE,TK.NOU BR DWN.C ; TT: INTERRUPT ENTRY FOR BROKE DEVICE TT.DWN: MOV @#PSW,(PC)+ ;SAVE STATUS TO GET UNIT 1$: .WORD 0 JSR R5,STRG ;SAVE REGISTERS MOV 1$,R5 ;GET ENTRY STATUS CALL TT.GUA ;FORM UNIT NUMBER DWN.C: .ENDC MOVB #200,@#PSW ;DROP STATUS .PUSH #S INAL EFFLUENT ^> EM M014: L 2 Q < AVERAGE MINIMUM MAXIMUM> EM M015: L 1 Q EM M016: Q < AERATION BASIN NO 1 ^> EM M017: Q < AERATION BASIN NO 2 ^> EM M018: Q < RETURN SLUDGE ^> EM M019: L 1 Q EM M020: Q < FINAL EFFLUENT ^> EM M021: L 1 Q EM M022: Q EM M023: Q EM M024: Q EM M025: Q EM M026: L 2 Q < INCINERATION SYSTEM TEMPERATURE - DEGREES F> EM 1 M027: Q < MINIMUM MAXIMUM> EM M028: L 1 Q EM M029: Q < HEARTH NO 1 ^> EM M030: Q < HEARTH NO 3 ^> EM M031: Q < HEARTH NO 4 ^> EM M032: Q < HEARTH NO 6 ^> EM M033: Q < HEARTH NO 7 ^> EM M034: L 1 Q EM M035: Q EM M036: Q < AVERAGE ^ MUR,MIN,SEC .GLOBL MULTR,DIVIDE,DECDAT,INCDATE .MCALL .PARAM,.EXIT .MCALL .PUSH,.POP,CALL,RETURN .PARAM STKSIZ= ^D24 ;STACK SIZE IN WORDS ENDDB= 400 ;'END DEAD BAND' (400=6.25% OF SPAN) LOSTK: .WORD 0 ;STACK CHECK WORD .BLKW STKSIZ ;STACK SPACE BEG: .PAGE .SBTTL ANALOG INPUT PROCESSING START: CLR R5 ;INIT. ANALOG POINT NUMBER 1$: CMP R5,#AE.LIM ;FINISHED? BHIS SPCL ;YES: GO DO COMPUTED POINTS MOV A$ADV(R5),R1 ;GET ADC VALUE MOV R1,R0 ;MULTIPLY BY 10 ... ASL R1 ASLR1)+,#'S ;'S'? BNE 1$ ;NO: ERROR NEGB REPCOD ;INDICATE SPECIAL REPORT CALL G.NX ;END OF LINE? BEQ 2$ ;YES: O.K. 1$: CALL BADLIN ;WRITE ERROR MESSAGE BR RASK ;TRY AGAIN 2$: CMP R2,#5 ;NEED DATE? BLO 6$ ;YES 3$: CALL REQ,MONPRE ;REQUEST MONTH AND YEAR BNE 4$ ;HE ENTERED IT ... GO CHECK MOV DATE,R0 ;GET CURRENT DATE CALL DECMON ;STEP BACK TO 1ST OF PREVIOUS MONTH MOV R0,SDAT ;STORE REPORT DATE BR LKREP 4$: MOVB #'-,-(R1) ;SET '1-' PREFIX ... MOVB #'1,-(R1) CALL C.DA2BR SWAPF ;GO SWAP AND FIX THINGS SWAP: MOV TKI.CS(R4),R3 ;SWAP KEYBOARD MOV TKI.CS(R5),TKI.CS(R4) ; CONTROL REGISTER MOV R3,TKI.CS(R5) ; ADDRESSES MOV TKO.CS(R4),R3 ;SWAP PRINTER MOV TKO.CS(R5),TKO.CS(R4) ; CONTROL REGISTER MOV R3,TKO.CS(R5) ; ADDRESSES MOV T.VCT(R4),R2 ;GET VECTOR MOV T.VCT(R5),R3 ; POINTERS MOV R2,T.VCT(R5) ;SWAP VECTOR MOV R3,T.VCT(R4) ; POINTERS ; SWAP VECTORS MOV #4,R1 1$: .PUSH @R2 MOV @R3,(R2)+ .POP (R3)+ DEC R1 BNE 1$ ; SWAP SY.DWN BITS IN GD> EM M037: Q < MINIMUM ^ MGD AT ^> EM M038: Q < MAXIMUM ^ MGD AT ^> EM M039: Q < TOTAL ^ MG> EM M040: L 1 Q EM M041: Q < PERCENTAGE OF RAW SEWAGE ^ %> EM 1 M042: Q EM M043: Q EM M044: Q EM M045: Q < CHLORINE ^ POUNDS> EM 2 M046: L 1 Q EM M047: L  R1 ADD R0,R1 ASL R1 SUB #2000,R1 ;SUBTRACT OFFSET BLT 4$ ;TOO LOW CMP R1,#10000 ;CHECK FOR TOO HIGH BGT 5$ ;TOO HIGH .IF DF,NONLIN ;ONLY IF NON-LINEAR SIGNALS IN SYSTEM TSTB A$NL(R5) ;LINEAR? BEQ 2$ ;YES: O.K. ;! INSERT NON-LINEAR STUFF HERE ! .ENDC 2$: CLRB A$SFF(R5) ;RESET SENSOR FAILURE FLAG ADD A$VAL(R5),R1 ;ADD OLD VALUE ASR R1 ;DIVIDE BY 2 MOV R1,A$VAL(R5) ;STORE NEW VALUE 3$: TST (R5)+ ;ADVANCE POINT INDEX BR 1$ ;LOOP UNTIL FINISHED 4$: CMP R1,#-ENDDB ;WITHIN DRB ;CONVERT DATE BCC 5$ ;VALID .WRITE #OPOUT,#IVDAH ;WRITE ERROR MESSAGE BR 3$ ;TRY AGAIN 5$: MOV R0,SDAT ;SAVE REPORT DATE CALL INCMON ;STEP TO NEXT MONTH CMP DATE,R0 ;VALID REQUEST? BHIS LKREP ;YES BR 10$ ;INVALID REPORT REQUEST 6$: CALL REQ,DAPRE ;REQUEST DATE BNE 8$ ;HE ENTERED ONE ... CHECK IT MOV DATE,R0 ;GET CURRENT DATE CMP R2,R5 ;IF SHIFT, IS TODAY'S DONE? BLOS 7$ ;YES CALL DECDAT ;BUMP BACK ONE DAY 7$: MOV R0,SDAT ;SAVE REPORT DATE BR LKREP 8$: CALL C.DDDB FLAGS BYTE MOV S.F(R4),R2 ;GET POINTORS TO MOV S.F(R5),R3 ; FLAG BYTES MOVB #SY.DWN,R1 ;BIT OF INTEREST MOVB @R2,-(SP) ;PUSH 1ST BYTE BICB R1,@R2 ;CLEAR 1ST BIT BITB R1,@R3 ;IS 2ND CLEAR? BEQ 2$ ;YES...O.K. BISB R1,@R2 ;SET 1ST BIT 2$: BICB R1,@R3 ;CLEAR 2ND BITB R1,(SP)+ ;WAS 1ST CLEAR? BEQ 3$ ;YES...O.K. BISB R1,@R3 ;SET 2ND 3$: RETURN ; ; DATA AREAS FOR CONSOLE AND NON-CONSOLE TELEPRINTERS ; ; ; KEYBOARD INTERRUPT VECTOR 2 Q < TOTAL USAGE UNIT COST> Q < TOTAL COST> EM 1 M048: Q EM M049: Q EM M050: Q EM M051: Q EM M052: Q < > Q < ___________> EM M053: Q < $^> EM 3 M054: Q EM 2 M055: Q < USAGE / MG COST / MG> EM 1 M056: Q EM IFT LIMITS? BLT 6$ ;NO: SENSOR FAILURE CLR R1 ;USE ZERO VALUE BR 2$ 5$: CMP R1,#10000+ENDDB ;WITHIN DRIFT LIMITS? BGT 6$ ;NO: SENSOR FAILURE MOV #10000,R1 ;USE MAX. VALUE BR 2$ 6$: MOVB #1,A$SFF(R5) ;SET SENSOR FAILURE FLAG BR 3$ ;LEAVE VALUE AS IS SPCL: CMP R5,#AA.LIM ;FINISHED? BHIS DCHK ;YES CALL @A$FUN(R5) ;CALL FUNCTION FOR COMPUTED POINT MOV R1,A$VAL(R5) ;STORE VALUE TST (R5)+ ;ADVANCE POINT INDEX BR SPCL ;LOOP UNTIL FINISHED .PAGE .SBTTL MAIN PART OF PROGRAM A2B ;CONVERT DATE TO BINARY BCC 9$ ;O.K.: STORE IT .WRITE #OPOUT,#IVDAH ;WRITE INVALID DATE MESSAGE BR 6$ ;ASK AGAIN 9$: MOV R0,SDAT ;SAVE REPORT DATE CMP R0,DATE ;COMPARE WITH PRESENT DATE BHI 10$ ;AFTER: ERROR BLO LKREP ;BEFORE TODAY CMP R2,#3 ;VALID REQUEST? BHIS 10$ ;NO CMP R2,R5 ;VALID REQUEST? BLOS LKREP ;YES 10$: .WRITE #OPOUT,#RREQER ;WRITE 'INVALID REPORT REQUEST' MESSAGE BR RASK ;GO ASK AGAIN LKREP: ; ! WE HAVE VALID REPORT SPEC. HERE ! CALL CHKTAP ;VERIFYPOINTERS ; .MACRO GWRD D0 .WORD TT'D0'VCT .ENDM GWRD .MACRO GTAB .LIST MEB .SEQ= 0 .REPT TK.NOU GWRD \.SEQ .SEQ= .SEQ+1 .ENDM .NLIST MEB .ENDM GTAB ; "SWAPABLE" TABLE .WORD KBVCT ;CONSOLE T.VCT: GTAB ;NON-CONSOLE ; "FIXED" TABLE .WORD KBVCT ;CONSOLE T.NVCT: GTAB ;NON-CONSOLE ; DDB FLAGS BYTE POINTERS .WORD TPDDB+45 ;CONSOLE S.F: .LIST MEB .SEQ= 0 .REPT TK.NOU .WORD TODDB+<70*.SEQ>+45 .SEQ= .SEQ+1 .ENDM .NLIST MEB ; ^O AND X-OFF FLAGS .WORD 0 ;CON M057: Q EM M058: Q EM M059: Q EM M060: Q < > Q <________________> EM M061: Q EM M062: Q EM .EVEN .PAGE .SBTTL LINK BLOCKS & FILE NAME BLOCKS .WORD 0 ;ERROR RETURN - NULL OLNK: .WORD 0 ;LINK BLOCK FOR REPORT WRITER OUTPUT .RAD50 /REP/ ;DATASET NAME .BYTE 1 ;ONE WOR DCHK: CMP DATE,(PC)+ ;TIME FOR DATA DUMP? EDAT: .WORD 0 ;DATE FOR NEXT DUMP BLO NODMP ;NOT TIME FOR DUMP BHI LDMP ;YES, IT'S PAST TIME FOR DUMP CMPB HOUR,(PC)+ ;COMPARE HOUR FOR DUMP EHR: .WORD 0 ;HOUR FOR NEXT DUMP BLO NODMP ;NOT TIME FOR DUMP BHI LDMP ;YES, IT'S PAST TIME FOR DUMP TSTB MIN ;MINUTES ZERO? BNE LDMP ;NO: IT'S PAST TIME FOR DUMP TSTB SEC ;SECONDS ZERO? BNE LDMP ;NO: IT'S PAST TIME FOR DUMP NRMDMP: ; NORMAL DATA DUMP : CALL MAXMIN ;PERFORM MAX/MIN CHECKS  CORRECT TAPE MOV SDAT,DTRDAT ;SAVE REPORT DATE MOVB RUNIT,PUNIT ;SET UNIT NO. TO BE PASSED ; TO DTREP ;!! INSERT DATA SEARCH HERE LATER ! ! ! ! ! ! BR JERTMP ;!! ! ! ! ! ! MOV (PC)+,R2 ;GET REPORT NUMBER RCOD: .WORD 0 .WRITE #OPOUT,#NDATA ;WRITE 'NO DATA' MESSAGE JMP RASK ;GO ASK AGAIN JERTMP: MOV #ARGL1,R5 ;ARG LIST PNTR TO R5 EMT 124 ;'START' SYSTEM CALL ARGL1: BR NXT1 .WORD DTREPH ;ADDRESS OF CALL NUMBER IN ; DTREP TASK HEADER .WORD NA .WORD MA .WORD IERR .W SOLE COF: XOF= .+1 GENTAB 0 ; INTERNAL BYTE COUNT .WORD 1 ;CONSOLE COUNT TKO.CT: GENTAB 1 ; INTERNAL BUFFER POINTER .WORD 0 ;CONSOLE TKO.BF: GENTAB 0 ; TAB COUNTERS AND FLAGS .WORD 0 ;CONSOLE TKO.TB: TKO.TP=.+1 GENTAB 0 ; FF COUNTER AND FLAG .WORD 0 ;CONSOLE TKO.LC: TKO.FF=.+1 GENTAB 0 ; STORE FOR DDB POINTERS .WORD 0 ;CONSOLE TKO.TS: GENTAB 0 ; ; KEYBOARD DATA AREAS ; ; ; STORE FOR DDB POINTERS .WORD 0 TKI.TS: G!D FOLLOWING .BYTE 1 ;UNIT NUMBER .RAD50 /TT / ;DEVICE NAME .WORD 0 ;ERROR RETURN - NULL .BYTE 2 ;OPEN CODE - OPENO .BYTE 0 ;ERROR CODE OFNBLK: ;FILENAME NOT REQUIRED FOR ; NON-FILE STRUCTURED DEVICE .WORD 0 ;ERROR RETURN - NULL DTLNK: .WORD 0 ;DECTAPE LINK BLOCK .RAD50 /DT / ;DATASET NAME .BYTE 1 ;ONE WORD FOLLOWING UNIT: .BYTE 0 ;UNIT NUMBER .RAD50 /DT / ;DEVICE NAME XFRBLK: .WORD 0 ;DEVICE BLOCK NUMBER MEMAD: .WORD VDAT ;MEMORY START ADDRESS WC: .WORD " CALL RSDMP ;RESET & SCHEDULE DUMP CALL OPPC ;PROCESS OPTIMES & PULSE COUNTS CALL ASUM ;PERFORM ANALOG INTEGRATION .EXIT ;THAT'S ALL LDMP: ; LATE DATA DUMP : CALL RSDMP ;RESET & SCHEDULE DUMP CALL RSMM ;SET MAX/MIN THINGS NODMP: ; NO DATA DUMP : CALL OPPC ;PROCESS OPTIMES & PULSE COUNTS MOVB SEC,R0 ;GET SECONDS CALL MOD5 ;MOD BY 5 & TEST BNE EXIT ;SEC NOT MULTIPLE OF 5: EXIT CALL ASUM ;PERFORM ANALOG INTEGRATION TSTB SEC ;SEC = ZERO ? BNE EXIT ;NO: THAT'S ALL FOR N#ORD PPRM1 ;ADDRESS OF PASSED PARAMETER NXT1: RETURN PPRM1: .WORD REPCOD ;ADDRESS OF INFO BLOCK REPCOD: .BYTE 0 ;REPORT NUMBER PUNIT: .BYTE 0 ;DECTAPE UNIT NO. DTRDAT: .WORD 0 ;DATE WORD .WORD 0 ;FLAG: INDICATES OPERATOR-REQUESTED REPORT .PAGE .SBTTL 'INTERNAL' REPORTS FUNCTION LSIN: TST R2 ;CURRENT ALARMS REPORT? BNE LSIN.1 ;NO ; SCAN FOR ANY ALARMS CLR R5 ;INIT. INDEX 1$: CMP R5,#D1.UL ;CHECKED THEM ALL? BHIS 2$ ;YES...NO ALARMS CMPB AG$OV(R5),#ONSTT ;ALARM CONDITION ? $ENTAB 0 ; ECHO FLAG/ECHO COUNT .WORD 0 ;CONSOLE EF: EC=.+1 GENTAB 0 ; ECHO BUFFER INPUT POINTER .WORD EB ;CONSOLE EPI: GENTAB EB,EBSZ ; ECHO BUFFER OUTPUT POINTER .WORD EB ;CONSOLE EPO: GENTAB EB,EBSZ ; TYPE AHEAD BUFFER INPUT POINTERS .WORD KC.BUF ;COMMAND .WORD KI.BUF ;CONSOLE K.IN: GENTAB KI.BUF, ; TYPE AHEAD BUFFER OUTPUT POINTER .WORD KC.BUF ;COMMAND .WORD KI.BUF ;CONSOLE K.OUT: GENTAB KI.BUF, ; TERMINATOR FLAG/RUBOUT MODE .WORD 0 ;COMMAN%GDSIZ ;WORD COUNT .BYTE 4 ;FUNCTION: 2=WRITE, 4=READ STAT: .BYTE 0 ;STATUS BYTE .WORD 0 ;RESIDUE WORD COUNT .WORD STATV ;ADDRESS OF STATUS VARIABLE ; STATV: .WORD 0 ;STATUS VARIABLE .PAGE .SBTTL STRINGS .NLIST BIN PGS: Q < PAGE 0> .BYTE 0 R1H: Q .BYTE 0 R2H: Q .BYTE 0 R3H: Q .BYTE 0 R4H: Q .BYTE 0 R5H: Q ; PTR TO SPECIAL OUTPUT STRING .WORD KO.MA+2 ;CONSOLE K.MPTR: GENTAB ; ECHO BUFFER POINTERS .WORD EB ;CONSOLE EBP: GENTAB EB,EBSZ ; OPEN CLOSE FLAG/ECHO SUPPRESS FLAG .WORD 0 ;ALWAYS 0 .WORD 0 )NTHLY OPERATING REPORT> .BYTE 0 R6H: Q .BYTE 0 LDS: Q < DATA DESCRIPTION> .BYTE TAB,TAB,TAB Q < VALUE UNITS> .BYTE 0 LMS: Q < DATA DESCRIPTION> .BYTE TAB,TAB,TAB Q .BYTE 0 .EVEN .PAGE .SBTTL BUFFERS .MCALL GENMES,ENDMES HDNG: .WORD FLL ;BUFFER SIZE .BYTE 0 ;MODE: FORMATTED ASCII .BYTE 0 ;STATUS BYTE HDNGC: .WORD 0 ;BYTE COUNT (FILLED IN LATER) HDNGB: .BYTE CNTRLO,CR HFF: .BYTE*NEXT DEC O$CNT(R5) ;ON: COUNT IT BNE 2$ ;NO FLIP YET INC O$TIM(R5) ;ACCUMALATE 1 15-MIN. QUANTA MOV #^D15*^D60,O$CNT(R5) ;RESET SECOND COUNTER TO 15 MIN. 2$: TST (R5)+ ;ADVANCE INDEX 3$: CMP R5,#DO.LIM ;FINISHED? BLO 1$ ;NO: DO NEXT POINT ; PULSE COUNT PROCESSING : CLR R5 ;INIT. INDEX BR 9$ 4$: MOVB P$COD(R5),R0 ;GET CODE FOR POINT BITB P$BIT(R5),DIGBUF(R0) ;TEST POINT BEQ 5$ ;POINT IS OFF TSTB P$OV(R5) ;TEST OLD VALUE BNE 6$ ;OLD & NEW BOTH ON ;TRANSITION TO ON IN+PARAMETER MOV #ARGL2,R5 ;ARG LIST PNTR TO R5 EMT 124 ;'START' SYSTEM CALL ARGL2: BR NXT2 .WORD INREPH ;ADDRESS OF CALL NUMBER IN ; INREP TASK HEADER .WORD NA .WORD MA .WORD IERR .WORD PPRM2 ;ADDRESS OF PASSED PARAMETER NXT2: RETURN NA: MA: .WORD 0 IERR: .WORD 0 .PAGE CRTREP: .PUSH CREPD(R2) ;PUT ROUTINE ADDRESS ON STACK MOV HDGL(R2),R1 ;SET SOURCE FOR HEADING MOV #HDNGP,R2 ;SET DESTINATION POINTER CALL EXPAND ;MOVE IN HEADING 1$: MOVB #SPACE,(R2)+ ;'TAB' .... CMP, K.OPF: K.ESF=.+1 GENTAB 0 ; STORE FOR CONTROL CHARACTERS/EOD FLAG .WORD 0 CCTMP: K.ENFL=.+1 GENTAB 0 ; COMMAND BUFFER .WORD 0 ;CMDST MUST START ON EVEN BOUNDRY . CMDST: KC.BUF: .BLKB KBSZ ; NORMAL BUFFER .BYTE 0 KI.BUF: .BLKB KBSZ .REPT TK.NOU .BYTE 0 .BLKB KBSZ ;NON CONSOLE .ENDM ; ECHO BUFFER EB: .BLKB EBSZ ;CONSOLE .REPT TK.NOU .BLKB EBSZ ;NON-CONSOLE .ENDM ; 'OPEN' AND 'CLOSE' STRING S.OPCL: .BYTE 15,14,14 ; CHARACTER C- 0 ;NULL FOR 1ST HEADING, SET TO ; FORM FEED FOR ALL OTHERS .BYTE LF,LF,LF,TAB,TAB,TAB LINE .BYTE LF,TAB,SPACE,SPACE,SPACE LINE .BYTE LF,LF,LF HDNGP: .BLKB ^D84 FLL= .-HDNGB .EVEN LBUFH: .WORD ^D120 .BYTE 0,0 LBUFC: .WORD 0 LBUF: .BLKB ^D120 .EVEN GENMES NULINE .BYTE LF,LF ENDMES NULINE GENMES PMES Q PART: LINE .BYTE LF ENDMES PMES GENMES NDLIN Q LINE ENDMES NDLIN GENMES LBHED .BYTE TAB,TAB,TAB LINE < LABORATORY DATA> .BYTE TAB,TAB Q LLD: Q LLT: LINE .BYTE LF,LF ENDMES LBHED GENMES NLHED LINE LINE ENDMES NLHED GENMES CMHED LINE .BYTE LF ENDMES CMHED GENMES SPHEAD .RE2FINISHED? BLO 4$ ;NO: GO TO NEXT POINT RETURN ;END OF OPTIME & PULSE ; COUNT PROCESSING .PAGE .SBTTL ANALOG INTEGRATION ROUTINE ASUM: INC (PC)+ ;COUNT SUMMATION SCAN NSCANS: .WORD 0 CLR R5 ;INIT. ANALOG POINT NUMBER BR 2$ 1$: ADD A$VAL(R5),C$LTOT(R5) ;INTEGRATE VALUE ADC C$HTOT(R5) ; ...... TST (R5)+ ;STEP TO NEXT 2$: CMP R5,#AA.LIM ;FINISHED? BLO 1$ ;NO: LOOP RETURN .SBTTL SETUP MAX/MIN 'OLD VALUES' ROUTINE RSMM: MOVB HOUR,OTIME ;SET 'OLD TIME' ... 3 @SP,(PC)+ ;UPDATE LINE COUNT LINEC: .WORD 0 BLT NPAGE ;PAGING NEEDED .POP ;CLEAN STACK CLZ ;INDICATE NO PAGING DONE RETURN NPAGE: ADD #LINES,@SP ;FORM CORRECT LINE COUNT .POP LINEC ; AND STORE IT CALL REQ,NPH ;ASK 'NEXT PAGE?' FPAGE: MOV (PC)+,R0 ;PNTR. TO UNITS PAGE NO. DIGIT PNU: .WORD 0 CMPB @R0,#'9 ;CARRY YET? BLO 1$ ;NO MOVB #'0,@R0 ;STORE '0' CMPB -(R0),#SPACE ;1ST TIME? BNE 1$ ;NO MOVB #'0,@R0 ;STORE '0' 1$: INCB @R0 ;BUMP DIGIT .WRITE #OPOUT,#HDNG ;WRI4ACTIVE DDB'S .WORD 0 .WORD 0 ;SY.DVL: SUSPEND LEVEL CTRS. .WORD 0 .WORD .DVR ; DRIVER ADDRESS .IF NB,.LBL .LBL: .ENDC .WORD 0 ; USER CALL ADDRESS .WORD 0 ; USER LINE ADDRESS .WORD 0 ; DEVICE BLOCK NUMBER .WORD 0 ; MEMORY START ADDRESS .WORD 0 ; NEGATIVE WORD COUNT .WORD 0 ; TRANSFER FUNCTIONS WORD .WORD 0 ; COMPLETION RETURN ADDRESS .WORD 0 ; NEGATIVE RESIDUE WORD COUNT .WORD 0 .WORD 0 .WORD 0 .WORD 0 .BYTE 0 .BYTE .SPN ;SY.SPN: SUSPEND # .WORD PT ^D38 .BYTE 40 .ENDM Q < AVRG MIN MNTM MAX MXTM TOTAL> .BYTE CR,LF,LF ENDMES SPHEAD .EVEN .LIST BIN .PAGE .SBTTL REAL TIME HEADER .WORD 0,0,0,0,0 .WORD 0 ;MAX. TIME: UNLIMITED .WORD 0 .BYTE 1 ;PRIORITY .BYTE 0 .WORD LOSTK ;STACK LIMIT .WORD 0 .WORD BEG ;INITIAL STACK SETTING .WORD START ;TRANSFER ADDRESS .WORD 0 PRM: .WORD 0 .WORD 0 .RAD50 /EP / ;TASK... .RAD50 /DTR/ ;...NAME DTREPH: .WORD START ;CALL NUMBER .END 6 MOVB MIN,OTIME+1 ; ... CLR R5 ;INIT. ANALOG POINT NUMBER BR 2$ 1$: MOV A$VAL(R5),C$MM(R5) ;SET 'OLD VALUE' TST (R5)+ ;ADVANCE INDEX 2$: CMP R5,#AA.LIM ;FINISHED? BLO 1$ ;NO: LOOP RETURN .PAGE .SBTTL MAX/MIN ROUTINE MAXMIN: MOVB HOUR,(PC)+ ;SET TIME WORD ... TIME: .WORD 0 MOVB MIN,TIME+1 ; ... CLR R5 ;INIT. ANALOG POINT NUMBER BR 6$ 1$: CMP A$VAL(R5),C$MM(R5) ;NEW GREATER THAN OLD? BHIS 2$ ;YES MOV A$VAL(R5),R0 ;SMALLER ONE TO R0 MOV TIME,R1 ;CORRESPONDING TIME TO7TE HEADING SEZ ;INDICATE PAGING DONE RETURN ; DISPATCH LIST CREPD: .WORD ALRM ;CURRENT ALARMS .WORD PVAR ;PROCESS VARIABLES .WORD ALIM ;ANALOG LIMITS .WORD MAINT ;MAINTENANCE LOG ; HEADING POINTERS: HDGL: .WORD ALRMH .WORD PVARH .WORD ALIMH .WORD MAINTH .PAGE .SBTTL CURRENT ALARMS REPORT ALRM: ASFAIL: CLR R5 ;INIT. INDEX 1$: CMP R5,#A.UL ;FINISHED ALL SENSOR FAILS? BHIS ALIMS ;YES CMPB AG$OV(R5),#ONSTT ;IN ALARM ? BNE 2$ ;NO CALL PCHK2 ;CHECK FOR PAGING 8.BFS ;SY.BFS: BUFFER SIZE .WORD .BFP ;SY.PTB: POINTER TO BUFFER .WORD .BFP ;SY.PTI: INPUT PTR TO BUFFER .WORD .BFP ;SY.PTO: OUTPUT PTR FROM BUFFER .WORD 0 ;SY.PIC: PTR TO CURRENT INPUT CHANGE BLOCK .BYTE 0 ;SY.RTN: RESERVED TASK # .BYTE .DFL ;SY.DFL: DDB FLAGS .WORD 0 ;SY.SCB: STORAGE FOR CURRENT OUTPUT CHANGE .WORD 0 ; BLOCK (2 WORDS) .BYTE 0 ;SY.TO : TIME-OUT COUNT .BYTE 0 ;SY.INH: TIME OUT MESSAGE INHIBIT COUNT .ENDM DDB ; KB (KEYBOARD) DDB KB,1,KBFSZ,KBBUF,0,9 .TITLE GENERAL ROUTINES .SBTTL GENERAL STUFF FOR GEN. ROUTINES .MCALL .PARAM,.D2BIN,.BIN2D,.RADPK,.RADUP .MCALL .PUSH,.POP,CALL,RETURN .PARAM CLCVZ= 247 ;INSTRUCTION ASSIGN: CLEAR C, V, AND Z. .PAGE .SBTTL COMMON ALARM STATUS UPDATE ROUTINES .GLOBL TEST,CTEST,STEST .GLOBL AG$OV,AG$MF,AG$DAT,AG$HR,AG$MIN .GLOBL HOUR,MIN,DATE .GLOBL ONSTT ;+ ; SUBROUTINES: TEST ; CTEST ; STEST ; ; FORM OF CALL: JSR PC,TEST ; ; ACTION: ; ;******* INSERT DESCRIPTION HERE ******* ; ; E: R1 MOV C$MM(R5),R2 ;LARGER ONE TO R2 MOV OTIME,R3 ;CORRESPONDING TIME TO R3 BR 3$ 2$: MOV C$MM(R5),R0 ;SMALLER ONE TO R0 MOV OTIME,R1 ;CORRESPONDING TIME TO R1 MOV A$VAL(R5),R2 ;LARGER ONE TO R2 MOV TIME,R3 ;CORRESPONDING TIME TO R3 3$: CMP R0,C$MAX(R5) ;NEW MAXIMUM? BLO 4$ ;NO MOV R0,C$MAX(R5) ;SET NEW MAXIMUM MOV R1,C$MAXT(R5) ; AND MAX TIME 4$: CMP R2,C$MIN(R5) ;NEW MINIMUM? BHI 5$ ;NO MOV R2,C$MIN(R5) ;SET NEW MINIMUM MOV R3,C$MINT(R5) ; AND MIN TIME 5$: MOV A$VAL(R5); MOV R5,R4 ;ANALOG POINT INDEX CALL WAALIN ;WRITE 1ST LINE OF MESSAGE .WRITE #OPOUT,#SFAH ;WRITE 2ND LINE 2$: TST (R5)+ ;ADVANCE INDEX BR 1$ ;GO CHECK NEXT ONE ALIMS: CMP R5,#A1.UL ;FINISHED ALL LIMIT ALARMS? BHIS D1CHK ;YES CMPB AG$OV(R5),#ONSTT ;IN ALARM ? BNE 1$ ;NO : NO MESSAGE CALL PCHK2 ;CHECK FOR PAGING MOV A1$OPT(R5),R4 ;ANALOG POINT INDEX CALL WAALIN ;WRITE 1ST LINE CALL WALIM2 ;WRITE 2ND LINE 1$: TST (R5)+ ;ADVANCE INDEX BR ALIMS ;GO CHECK NEXT ONE D1CH<KBDDB ; ; KB (TELEPRINTER) DDB KBO,2,TPSZ,TPBUF,SY.DPR,TPDDB ; .IF NE,TK.NOU ;NON CONSOLE DDB'S ; KEYBOARD LOC=20 LOCA=0 TTDDB=.+14 .REPT TK.NOU DDB TT,LOC,KBFSZ,,0 LOC= LOC+1 LOCA= LOCA+KBFSZ .ENDM ; TELEPRINTER LOC=30 LOCA=0 TODDB=.+14 .REPT TK.NOU DDB TKO,LOC,TPSZ,,SY.DPR LOC= LOC+1 LOCA= LOCA+TPSZ .ENDM .ENDC .IF GT,TK.NOU-1 ; VECTOR SET UP FOR UNITS 1-N OF NON-CONSOLE ; TELETYPE ; ; .ASECT ;MACRO DEFINITION: .MACRO GENV=XIT: ; ; FLAGS WILL BE UPDATED AS DESCRIBED ABOVE ; ALL REGISTERS WILL REMAIN UNCHANGED ; ;- OFFS= ^D240 ;OFF-DELAY IN SECONDS ONSTT= OFFS+1 OFFM= /^D60 ;OFF-DELAY IN MINUTES TEST: BNE STEST ;NEW VALUE IS SET CTEST: ;NEW VALUE IS CLEAR TSTB AG$OV(R5) ;TEST OLD VALUE BEQ TRET ;OFF: NO MESSAGE DECB AG$OV(R5) ;DEC. FLAG BEQ TRET ;WAS ON 1 TIME: NO MESSAGE CMPB AG$OV(R5),#1 ;END OF DOWN-COUNT ? BNE TRET ;NO: NO MESSAGE CLRB AG$OV(R5) ;ZERO OLD VALUE MOV DATE>,C$MM(R5) ;STORE NEW 'OLD VALUE' TST (R5)+ ;ADVANCE INDEX 6$: CMP R5,#AA.LIM ;FINISHED? BLO 1$ ;NO: LOOP MOV TIME,(PC)+ ;SET NEW 'OLD TIME' OTIME: .WORD 0 RETURN ;END OF MAX/MIN CHECKS .PAGE .SBTTL RESET DATA & SCHEDULE DUMP ROUTINE RSDMP: ; SET HOUR,MIN TIME WORD IN R1 : MOVB MIN,R1 ;SEC TO R1 SWAB R1 ;PUT SEC IN HIGH BYTE CLRB R1 ;ZERO LOW BYTE BISB HOUR,R1 ;SET HOUR INTO LOW BYTE ; ; MOVE AND RESET ALL ANALOG DATA : CLR R0 ;INITIALIZE INDEX 1$: ; COPY ALL ANALO?K: CMP R5,#D1.UL ;FINISHED ALL DIGITAL ALARMS? BHIS D1FIN ;YES CMPB AG$OV(R5),#ONSTT ;IN ALARM ? BNE 1$ ;NO CALL PCHK1 ;CHECK FOR PAGING CALL SFMES ;SET UP FOR MESSAGE MOV D1$OMS(R5),R1 ;GET DIGITAL STRING PNTR CALL ETWMES ;EXPAND & WRITE MESSAGE 1$: TST (R5)+ ;ADVANCE INDEX BR D1CHK ;GO CHECK NEXT ONE D1FIN: JMP LASTP .PAGE .SBTTL PROCESS VARIABLES REPORT PVAR: CLR R4 ;INIT. INDEX 1$: CMP R4,#AA.LIM ;FINISHED? BHIS LASTP ;YES CALL PCHK1 ;CHECK FOR PAGING CALL CT D0 .= TT'D0'VCT ;TT'D0: VECTOR ADDRESS .WORD TK.INT ;KEYBOARD INTERRUPT ENTRY .WORD 34'D0 ;KEYBOARD INTERRUPT STATUS .WORD TKO.INT ;PRINTER INTERRUPT ENTRY .WORD 34'D0 ;PRINTER INTERRUPT STATUS .ENDM GENVCT .SEQ= 1 .REPT TK.NOU-1 GENVCT \.SEQ .SEQ= .SEQ+1 .ENDM .CSECT .ENDC .END A,AG$DAT(R5) ;STORE DATE MOVB HOUR,AG$HR(R5) ;STORE HOUR .PUSH R0 ;SAVE R0 MOVB MIN,R0 ;GET MINUTE SUB #OFFM,R0 ;SUBTRACT DELAY TIME BGE 1$ ;TIME IS RIGHT ADD #^D60,R0 ;ADJUST MINUTE DECB AG$HR(R5) ;DECREMENT HOUR BGE 1$ ;TIME IS RIGHT MOVB #^D23,AG$HR(R5) ;SET CORRECT HOUR MOVB R0,AG$MIN(R5) ;STORE MINUTE MOV DATE,R0 ;GET DATE CALL DECDAT ;SUBTRACT ONE DAY MOV R0,AG$DAT(R5) ;STORE CORRECT DATE BR 2$ 1$: MOVB R0,AG$MIN(R5) ;STORE CORRECT MINUTE 2$: .POP R0 ;RESTORE R0 BG DATA TO TEMPORARY AREA : MOV C$MAX (R0),T$MAX (R0) ;MOVE MAXIMUM MOV C$MAXT(R0),T$MAXT(R0) ;MOVE MAX. TIME MOV C$MIN (R0),T$MIN (R0) ;MOVE MINIMUM MOV C$MINT(R0),T$MINT(R0) ;MOVE MIN. TIME MOV C$LTOT(R0),T$LTOT(R0) ;MOVE LOW TOTAL MOV C$HTOT(R0),T$HTOT(R0) ;MOVE HIGH TOTAL ; INITIALIZE ALL ANALOG DATA : MOV A$VAL (R0),C$MAX (R0) ;INIT. MAXIMUM MOV R1 ,C$MAXT(R0) ;INIT. MAX. TIME MOV A$VAL (R0),C$MIN (R0) ;INIT. MINIMUM MOV R1 ,C$MINT(R0) ;INIT. MIN. TIME CLR C$LTOT(R0) ;ICWAVAL ;WRITE ANALOG VALUE LINE TST (R4)+ ;ADVANCE INDEX BR 1$ ;GO DO NEXT ONE LASTP: CALL REQ,LPH ;ASK 'FINISHED?' RETURN WAVAL: CALL SETP ;SETUP FOR MESSAGE BR ACOM WAALIN: CALL SFMES ;PUT IN DATE & TIME ACOM: MOV A$ID(R4),R1 ;GET ID MESSAGE POINTER CALL EXPAND ;EXPAND ID MESSAGE 1$: MOVB #SPACE,(R2)+ ;PUT IN A SPACE CMP R2,#OBUF+^D40 ;AT COLUMN 40. YET? BLO 1$ ;NO...ADD MORE SPACES MOV R4,R3 ;GET POINT INDEX CALL CV ;CONVERT VALUE TO ASCII MOVB #SPACE,(R2)+ ;PUT D .TITLE DDUMP - DATA DUMP TO DECTAPE .SBTTL MAIN PART OF PROGRAM .GLOBL DDUMPH .GLOBL DTREPH .GLOBL MULT,FRSTMN .GLOBL CDAT,CCNT .GLOBL TDAT ;"GENERAL DATA" DATE WORD .GLOBL TSHF ;"GENERAL DATA" SHIFT CODE BYTE .GLOBL GDSIZ ;NUM. OF WORDS IN GENERAL DATA AREA .GLOBL LDAT ;1ST WORD IN TAPE-BACKUP ; DATA AREA (TAPE LABEL) .GLOBL TBSIZ ;NUM. OF WORDS IN TAPE-BACKUP AREA .MCALL .PARAM,.EXIT .MCALL .INIT,.XFR,.WAIT,.RLSE .MCALL CALL,RETURN,RETRN5 .PARAM WRITE= 2 ESMF: TSTB AG$MF(R5) ;SHOULD WE REQUEST A MESSAGE ? BNE TRET ;NO INCB AG$MF(R5) ;SET = 1 TO REQUEST MESSAGE TRET: RETURN STEST: ;NEW VALUE IS SET TSTB AG$OV(R5) ;TEST OLD VALUE BEQ 2$ ;1ST TIME ON: NO MESSAGE CMPB AG$OV(R5),#1 ;2ND TIME ON ? BNE 3$ ;NO: NO MESSAGE MOVB #ONSTT,AG$OV(R5) ;SET OFF-TIME COUNTER MOV DATE,AG$DAT(R5) ;STORE DATE MOVB HOUR,AG$HR(R5) ;STORE HOUR MOVB MIN,AG$MIN(R5) ;STORE MINUTE BR SMF ;GO SET MESSAGE FLAG IF ENABLED 2$: INCB AG$OV(R5) ;SET OLD VALFNIT. LOW TOTAL CLR C$HTOT(R0) ;INIT. HIGH TOTAL TST (R0)+ ;ADVANCE INDEX CMP R0,#AA.LIM ;FINISHED ? BLO 1$ ;NO: LOOP ; ; MOVE AND RESET ALL PULSE COUNTS: CLR R0 ;INIT. INDEX 2$: MOV P$CNT(R0),T$CNT(R0) ;MOVE PULSE COUNT CLR P$CNT(R0) ;RESET PULSE COUNT TST (R0)+ ;ADVANCE INDEX CMP R0,#DP.LIM ;FINISHED ? BLO 2$ ;NO: LOOP ; ; MOVE AND RESET NUMBER OF SCANS: MOV NSCANS,TSCANS ;MOVE NO. OF SCANS CLR NSCANS ; & RESET IT ; SET DATE/TIME FOR NEXT DATA DUMP: MOVGIN A SPACE MOV A$UNIT(R4),R1 ;GET 'UNITS' STRING POINTER JMP ETWMES ;EXPAND, END LINE, WRITE IT & RETURN .PAGE .SBTTL ANALOG LIMITS REPORT ALIM: MOV #A1.LL,R5 ;INIT. INDEX 1$: CMP R5,#A1.UL ;FINISHED WITH HIGH/LOW ? BHIS 2$ ;YES: FINISHED CALL PCHK2 ;CHECK FOR PAGING CALL WALIM ;WRITE VALUE & LIMITS TST (R5)+ ;ADVANCE INDEX BR 1$ ;GO DO NEXT ONE 2$: JMP LASTP WALIM: MOV A1$OPT(R5),R4 ;GET ANALOG POINT INDEX CALL WAVAL ;WRITE ANALOG VALUE LINE WALIM2: MOV R4,R3 ;GET POIH ;XFER WRITE FUNCTION CODE READ= 4 ;XFER READ FUNCTION CODE STKSIZ= ^D32 ;STACK SIZE IN WORDS LOSTK: .WORD 0 ;STACK CHECK WORD .BLKW STKSIZ ;STACK SPACE BEG: START: .INIT #LNKBLK ;INIT TAPE DATASET CMPB PRM,#1 ;@ BNE 77$ ;@ MOV #WRITE,FCN1 ;@ CLR LBUF ;@ CALL XFER,XF1 ;@ .EXIT ;@ 77$: MOV #READ,FCN1 ;@ MOV TDAT,R1 ;GET DATA DATE MOVB TSHF,R2 ;GET DATA SHIFT CODE MOV R1,RDATE1 ;STORE DATE AS DTREP PARAMETER MOVB R2,RNUM1 ;STORE SHIFT CODE AS DTREP PARAMETER MOIUE = 1 RETURN 3$: MOVB #ONSTT,AG$OV(R5) ;SET OFF-TIME COUNTER RETURN .PAGE .SBTTL EXPAND ROUTINE .GLOBL EXPAND .GLOBL SSTAB ;+ ; SUBROUTINE: EXPAND ; ; FORM OF CALL: JSR PC,EXPAND ; ; ACTION: ; ; EXPAND IS USED TO EXPAND A 'STRING SPECIFICATION'. ; AT ENTRY, R1 SHOULD POINT TO THE FIRST BYTE OF THE ; SOURCE 'STRING SPECIFICATION', AND R2 SHOULD POINT TO ; THE STRING DESTINATION ADDRESS. ; ; 'STRING SPECIFICATION': ; ; A STRING SPECIFICATION CONSISTS OF A STRING OF BYTJ DATE,R0 ;GET CURRENT DATE MOVB HOUR,R1 ; AND HOUR BIC #^C30,R1 ;NOW = 0,8., OR 16. ADD #^D8,R1 ;R1=HR. FOR NEXT DUMP CMP R1,#^D24 ;MIDNIGHT? BLO 3$ ;NO CALL INCDAT ;INCREMENT DATE CLR R1 ;SET HOUR TO 0 3$: MOV EDAT,R2 ;GET THIS DUMP DATE MOVB EHR,R3 ;GET THIS DUMP HOUR MOV R0,EDAT ;STORE DATE FOR NEXT DUMP MOVB R1,EHR ; AND TIME FOR NEXT DUMP MOV R2,R0 ;THIS DUMP DATE TO R0 BEQ EX ;NO DUMP 1ST TIME RUN ! ! ; STORE DATE AND SHIFT CODE TO BE WRITTEN TO TAPE: ASR R3KNT INDEX MOV #VS2,R2 ;CONVERT LOW MOV A1$OLO(R5),R1 ; LIMIT TO CALL CM ; ASCII MOV #VS3,R2 ;CONVERT HIGH MOV A1$OHI(R5),R1 ; LIMIT TO CALL CM ; ASCII CALL SETP ;SETUP TO WRITE LINE MOV #NAM,R1 ;SET SOURCE POINTER JMP ETWMES ;MOVE STRING IN, WRITE IT, & RETURN .PAGE .SBTTL MAINTENANCE LOG MAINT: .WRITE #OPOUT,#MHED2 ;WRITE 2ND LINE OF HEADING SUB #3,LINEC ;UPDATE LINE COUNT CLR R5 ;INIT. INDEX 1$: CMP R5,#DO.LIM ;FINISHED? BHIS 4$ ;YES CALL PCHK1 ;CHECK FOR PLV R1,R0 ;COPY DATE CALL FRSTMN ;CHANGE TO FIRST OF MONTH CALL XFER,XF1 ;READ DATE OF TAPE CMP R0,(PC)+ ;CORRECT TAPE? LBUF: .WORD 0 ;1 WORD BUFFER BEQ GTAPE ;YES TST LBUF ;NEW TAPE? BEQ GTAPE ;YES...PROCEED ;!! INSERT ALARM MESSAGE STUFF HERE !! .EXIT GTAPE: MOV R0,LDAT ;FIRST DAY OF MONTH CALL XFER,XF2 ;WRITE TAPE I.D. WORD AND ; GLOBAL DATA TO TAPE ; COMPUTE TAPE ADDRESS FOR THIS SHIFT: DEC R2 ;R2 NOW = 0,1, OR 2 MOV R2,R4 ;MULT. BY 5 ... ASL R4 ASL R4 ADD MES, ; TERMINATED BY A NULL OR ZERO BYTE. ; A POSITIVE BYTE DESIGNATES AN ASCII CHARACTER. ; A NEGATIVE BYTE DESIGNATES A SUBSTRING: IT'S VALUE ; IS USED TO LOCATE A SUBSTRING POINTER IN GLOBAL TABLE ; SSTAB, WHERE THE 1ST ENTRY IN THE TABLE CORRESPONDS TO A ; BYTE VALUE OF 200, THE 2ND ENTRY TO A BYTE VALUE OF 201, ; ETC. ; ; EXIT: ; ; R1 POINTS TO ONE BYTE PAST THE NULL TERMINATOR OF ; THE SOURCE STRING. ; R2 POINTS TO ONE BYTE PAST THE LAST BYTE OF THE ; DESTINATION STRING. N ;DIVIDE THIS ASR R3 ; DUMP HOUR ASR R3 ; BY EIGHT BGT 4$ ;NOT MIDNIGHT DUMP CALL DECDAT ;DECREMENT DATE MOV #3,R3 ;SET SHIFT CODE 3 4$: MOV R0,TDAT ;STORE DATA DATE MOVB R3,TSHF ; AND SHIFT CODE ; PROCESS OPERATOR COMMENTS FOR DUMP: CMP CPNTR,#CBUF ;GOT ANY COMMENTS? BEQ 7$ ;NO TST CDAT ;FOR PREVIOUS SHIFT & NOT WRITTEN? BNE 5$ ;YES MOV CPNTR,CCNT ;COMPUTE BYTE COUNT SUB #CBUF,CCNT MOV TDAT,CDAT ;SET DATE BR 6$ 5$: CLR CCNT ;DISCARD THEM CLR CDAT 6$: MOV #OAGING BNE 2$ ;NO PAGING DONE .WRITE #OPOUT,#MHED2 ;WRITE 2ND LINE OF HEADING SUB #3,LINEC ;UPDATE LINE COUNT 2$: CALL SETP ;GET DEST. PNTR CALL MOSUB ;BUILD LINE CALL TWMES ;WRITE LINE TST (R5)+ ;ADVANCE INDEX BR 1$ ;GO DO NEXT ONE 4$: JMP LASTP MOSUB: MOV O$ID(R5),R1 ;DESCRIP. STRING PNTR CALL EXPAND ;MOVE INTO LINE CMP R2,#OBUF+^D54 ;AT COL. 54. YET? BLO 1$ ;NO MOV #OBUF+^D54,R2 ;SET BACK TO COL 54. 1$: MOVB #SPACE,(R2)+ ;PUT IN A SPACE BIT #1,R2 ;ODD? BEQ 1$ ;NPR2,R4 ;R4 = 5 * R2 SUB R0,R1 ;R1=-1 MOV #^D18,R2 ;18. BLOCKS / DAY CALL MULT INC R0 ;R0=START BLOCK FOR DAY IF.... CMP R0,#^D271 ;BEFORE "GLOBAL" TAPE SPACE? BLO 1$ ;YES...O.K. ADD #^D8,R0 ;ADD "GLOBAL" SPACE SIZE 1$: ADD R4,R0 ;ADD SHIFT OFFSET MOV R0,XF3 ;STORE BLOCK NUMBER ; FOR DATA CALL XFER,XF3 ;WRITE DATA TST CCNT ;GOT ANY COMMENTS TO WRITE? BEQ 2$ ;NO MOV XF3,XF4 ;COMPUTE COMMENTS ADD #^D4,XF4 ; BLOCK NUMBER CALL XFER,XF4 ;WRITE COMMENTS Q; R0, R3-R5 ARE UNCHANGED. ; ;- EXPAND: .PUSH R3 ;SAVE R3 ON STACK CLR -(SP) ;SET 'OUTSIDE LEVEL' INDICATOR BR 2$ 1$: MOVB R3,(R2)+ ;MOVE BYTE TO DEST. 2$: MOVB (R1)+,R3 ;GET NEXT BYTE BGT 1$ ;'NORMAL' CHARACTER BLT 3$ ;START OF NEW SUBSTRING ; END OF CURRENT SUBSTRING : .POP R3 ;GET TOP WORD OF STACK BEQ 4$ ;AT 'OUTSIDE LEVEL' MOV R3,R1 ;PNTR INTO PREVIOUS SUBSTRING BR 2$ ;CONTINUE PREVIOUS SUBSTRING 3$: .PUSH R1 ;SAVE CURRENT SOURCE POINTER ASL R3 ;CHANGE TO WORD INDRCBUF,CPNTR ;RESET CPNTR 7$: ; SCHEDULE DATA DUMP TASK: MOV #ARGL,R5 ;SET ARG. LIST PNTR EMT 124 ;START DDUMP TASK ARGL: BR EX .WORD DDUMPH ;ADDRESS OF DDUMP CALL NUMBER .WORD NA .WORD MA .WORD IERR ; EX: RETURN NA: MA: .WORD 0 ;START IMMEDIATELY IERR: .WORD 0 ;RETURNED ERROR INFO .PAGE .SBTTL REAL TIME HEADER .WORD 0,0,0,0,0 .WORD 0 ;MAX. TIME: UNLIMITED .WORD 0 .BYTE 3 ;PRIORITY: 3 .BYTE 0 .WORD LOSTK ;STACK LIMIT .WORD 0 .WORD BEG ;INITIAL STACK SETTINGSO 2$: MOVB #'.,(R2)+ ;PUT A DOT MOVB #SPACE,(R2)+ ; & A SPACE CMP R2,#OBUF+^D57 ;TO COL. 57. YET? BLO 2$ ;NO MOV O$TIM(R5),R1 ;GET OPTIME CALL SCV ;CONVERT IT TO ASCII MOVB #SPACE,(R2)+ ;2 SPACES ... MOVB #SPACE,(R2)+ MOV O$MTIM(R5),R1 ;GET MAINTENANCE INTERVAL CALL SCV ;CONVERT IT TO ASCII RETURN SCV: CLC ;CONVERT ROR R1 ; TO ASR R1 ; HOURS ADC R1 ;ROUND IT CLR R0 ;SET DEC. POSITION INDICATOR MOV #^D5,R3 ;SET FIELD WIDTH CALL SCVRT ;CONVERT TO DECIMAL RTTO TAPE CLR CCNT ;INDICATE THEY'VE BEEN WRITTEN CLR CDAT 2$: .RLSE #LNKBLK ;RELEASE TAPE DATASET MOV #RNUM1,PPRM ;SET PARAMETER TO PASS CALL RSCHED ;SCHEDULE SHIFT REPORT CMPB RNUM1,#3 ;3RD SHIFT? BNE 3$ ;NO MOV RDATE1,RDATE2 ;STORE DATE AS PARAMETER MOV #RNUM2,PPRM ;SET PARAMETER TO PASS CALL RSCHED ;SCHEDULE DAILY REPORT 3$: .EXIT RSCHED: MOV #ARGL,R5 ;SET ARG LIST PTR EMT 124 ;'START' SYSTEM CALL ARGL: BR RET .WORD DTREPH ;ADDRESS OF CALL NUMBER IN ; DTREP TASK UEX MOV SSTAB+400(R3),R1 ;GET NEW SUBSTRING POINTER BR 2$ ;START NEW SUBSTRING 4$: .POP R3 ;RESTORE R3 RETURN ;RETURN .PAGE .SBTTL BINARY TO DECIMAL CONVERSION .GLOBL SCVRT ;+ ; SUBROUTINE: SCVRT ; ; FORM OF CALL: JSR PC,SCVRT ; ; ACTION: ; ; THIS ROUTINE CONVERTS A BINARY VALUE TO A DECIMAL ; ASCII STRING, LEADING ZEROS SUPPRESSED, AND MULTIPLIED ; BY A SPECIFIED POWER OF TEN. ; IF THE CONVERSION CANNOT BE ACCOMPLISHED IN THE ; SPECIFIED SIZE FIELD, THE FIELD WILL BE .WORD START ;TRANSFER ADDRESS .WORD 0,0,0 .RAD50 /NR / ;TASK... .RAD50 /SCA/ ;...NAME SCANRH: .WORD START ;CALL NUMBER .END WETURN .PAGE .SBTTL VIEW/CHANGE FUNCTIONS VC: JMP @VCDL(R2) ;GO TO PROPER ROUTINE VCDL: .WORD LAB ;LAB DATA ROUTINE .WORD GETCOM ;GET SHIFT COMMENT FROM OPERATOR .WORD AMI ;ALARM MESSAGE INHIBIT ROUTINE .WORD AAL ;ANALOG ALARM LIMITS ROUTINE .WORD OPTED ;MAINT. INTERVAL / OPTIME RESET .WORD COSTD ;COST DATA ROUTINE .PAGE .SBTTL ENTER LAB DATA .GLOBL L$DAT,L$VAL,L$SHP,L$DEC .GLOBL LBNUM,LB.LIM,LBSIZ .GLOBL AS2FLT,FLT2AS .GLOBL XHEADER .WORD NA .WORD MA .WORD IERR .WORD PPRM ;ADDRESS OF PARAMETER RET: RETURN NA: MA: .WORD 0 IERR: .WORD 0 PPRM: .WORD 0 ;ADDRESS OF INFO BLOCK RNUM1: .BYTE 0 ;REPORT CODE: SET BY PROGRAM .BYTE 0 ;DT UNIT 0 RDATE1: .WORD 1 ;REPORT DATE .WORD 1 ;FLAG: INDICATES AUTOMATIC REPORT RNUM2: .BYTE 4 ;DAILY REPORT CODE .BYTE 0 ;DT UNIT 0 RDATE2: .WORD 1 ;REPORT DATE .WORD 1 ;FLAG: INDICATES AUTOMATIC REPORT .PAGE .SBTTL GENERAL ROUTINES XFER: MOV (R5)+,R4 ;GET PASSED AY FILLED WITH ASTERISKS. ; ; ENTRY: ; ; R0= POWER OF TEN ; R1= VALUE TO BE CONVERTED ; R2= DESTINATION POINTER ; R3= NO. OF CHAR. POSITIONS IN FIELD ; ; EXIT: ; ; R0, R1, & R3 ARE LOST ; R2 POINTS PAST CONVERTED STRING (R2=R2+R3) ; R4 & R5 ARE UNCHANGED ;- SCVRT: .PUSH R5 ;SAVE R5 .PUSH R4 ;SAVE R4 ADD R2,R3 ;COMPUTE END PNTR. .PUSH R3 ;SAVE IT ON STACK MOV SP,R5 ;R5=END PNTR. .... SUB #^D6,SP ;GET SPACE ON STACK MOV SP,R4 ;R4=START PNTR. CLRB -(R5) ;NULL BYTE TO TERMZ .TITLE PWRUP - POWER UP TASK .SBTTL MAIN PART OF PROGRAM .GLOBL PWRUPH .GLOBL PSTB .GLOBL KBOPT,KBOPH .GLOBL GDATE,GTIME .GLOBL PFLAG,SFLAG,TS,DS .MCALL .PARAM,.EXIT .MCALL CALL .PARAM STKSIZ= ^D24 ;STACK SIZE IN WORDS LOSTK: .WORD 0 ;STACK CHECK WORD .BLKW STKSIZ ;STACK SPACE BEG: START: MOV #TS,R2 ;CONVERT CURRENT CALL GTIME ; TIME MOV #DS,R2 ;CONVERT CURRENT CALL GDATE ; DATE MOV #1,PFLAG ;SET FLAG FOR KBOP TASK MOV #KBOPT,R0 ;KBOP TASK INDEX TST[INCDAT LAB: CALL CLEAR ;CLEAR SCREEN 1$: CALL REQ,DADPR ;REQUEST DATA DATE BNE 3$ 2$: .WRITE #OPOUT,#IVDAH ;ERROR MESSAGE BR 1$ 3$: CALL C.DA2B ;CONVERT DATE BCS 2$ ;INVALID CMP R0,DATE ;LATER THAN TODAY ? BHI 2$ ;YES: INVALID MOV R0,SDAT ;SAVE DATE ; GET DATA FROM TAPE, IF ANY: GLAB: CALL CHKTAP ;VERIFY CORRECT TAPE ADD #^D15,XFRBLK ;COMPUTE LAB DATA BLOCK NO. MOV #LBSIZ,WC ;SET WORD COUNT MOV #L$DAT,MEMAD ;SET BUFFER ADDRESS CALL XFER ;READ LAB DATA CMP L$DAT,SDAT\DDRESS OF ; XFRBLK .XFR #LNKBLK,R4 ;REQUEST TRANSFER .WAIT #LNKBLK ;WAIT FOR COMPLETION TSTB 7(R4) ;ANY ERRORS? BEQ 10$ ;NO ;!! INSERT ADDITIONAL ERROR ACTION HERE !! 10$: RETRN5 .PAGE .SBTTL LINK & XFER BLOCKS .WORD 0 ;ERROR RETURN LNKBLK: .WORD 0 .RAD50 /DT / ;LOGICAL CHANNEL NAME .BYTE 1 ;ONE WORD FOLLOWING .BYTE 0 ;UNIT NUMBER .RAD50 /DT / ;DEVICE NAME XF1: .WORD ^D271 ;"GLOBAL DATA" BLOCK NUMBER .WORD LBUF ;MEMORY START ADDRESS .WORD 1 ;WORD COUNT ]INATE .PUSH R1 ;SAVE VALUE FOR SIGN LATER BPL 1$ ;POSITIVE: O.K. NEG R1 ;MAKE POSITIVE FOR CONVERSION 1$: .BIN2D R4,R1 ;CONVERT TO DECIMAL ASCII MOVB #'0,R1 ;R1=ASCII 0 2$: CMPB (R4)+,R1 ;ZERO? BEQ 2$ ;YES: IGNORE IT DEC R4 ;R4 PNTS TO 1ST NON-ZERO TST R0 ;TEST PWR OF TEN BPL 8$ ;POSITIVE ADD R3,R0 ;DEC. POSITION + 1 3$: CMP R3,R0 ;NEED DECIMAL NOW? BEQ 5$ ;YES CMP R5,R4 ;GOT ANOTHER DIGIT? BLOS 6$ ;NO: MAY NEED ZERO FILL MOVB -(R5),R1 ;GET NEXT DIGIT 4$: CALL M^B PSTB(R0) ;IS IT ACTIVE? BLT L2 ;NO TST SFLAG ;KBOP TASK AT "TOP" ? BEQ EX ;NO MOV #A1,R5 ;DELETE KBOP EMT 127 ; TASK A1: BR L2 .WORD KBOPH L2: MOV #A2,R5 ;RESTART KBOP EMT 124 ; TASK A2: BR EX .WORD KBOPH .WORD NA .WORD MA .WORD IERR EX: .EXIT NA: MA: .WORD 0 IERR: .WORD 0 .PAGE .SBTTL REAL TIME HEADER .WORD 0,0,0,0,0 .WORD 0 ;MAX. TIME: UNLIMITED .WORD 0 .BYTE 3 ;PRIORITY .BYTE 0 .WORD LOSTK ;STACK LIMIT .WORD 0 .WORD BEG ;INITIAL STACK SE_ ;ANY LAB DATA THERE ? BEQ LFRM ;YES: PROCEED WITH EDITTING MOV SDAT,L$DAT ;SET DATE IN BUFFER CLR R5 ;INIT. INDEX 1$: MOV #100000,L$VAL(R5) ;SET ALL DATA EMPTY ... CLR L$VAL+2(R5) ADD #4,R5 ;ADVANCE INDEX CMP R5,#LB.LIM ;FINISHED ? BLO 1$ ;NO: LOOP .PAGE LFRM: ; DISPLAY HEADING : MOV #LBHD,R2 ;SET DEST. PNTR MOV SDAT,R0 ;GET DATE CALL C.B2DA ;CONVERT TO ASCII .WRITE #OPOUT,#LBHED ;WRITE HEADING ; DISPLAY FORM: CLR R0 ;INIT. INDEX 1$: MOV R0,(PC)+ ;SAVE START INDEX F` FCN1: .BYTE READ ;FUNCTION .BYTE 0 ;STATUS BYTE .WORD 0 ;RESIDUE WORD COUNT .WORD STATV ;ADDRESS OF STATUS VARIABLE XF2: .WORD ^D271 ;"GLOBAL DATA" BLOCK NUMBER .WORD LDAT ;MEMORY START ADDRESS .WORD TBSIZ ;WORD COUNT .BYTE WRITE ;FUNCTION .BYTE 0 ;STATUS BYTE .WORD 0 ;RESIDUE WORD COUNT .WORD STATV ;ADDRESS OF STATUS VARIABLE XF3: .WORD 0 ;"GEN. DATA" BLOCK NUMBER .WORD TDAT ;MEMORY START ADDRESS .WORD GDSIZ ;WORD COUNT .BYTE WRITE ;FUNCTION .BYTE 0 ;STATUaOV1 ;MOVE CHAR. IF IT'LL FIT BR 3$ ;LOOP 5$: MOVB #'.,R1 ;GET A DECIMAL POINT BR 4$ ;GO STORE IT 6$: CMP R3,R0 ;ALREADY DONE DECIMAL? BHI 7$ ;NO CMPB @R3,#'. ;NEED ONE MORE ZERO? BNE 12$ ;NO: FINISHED 7$: MOVB #'0,R1 ;ZERO FILL BR 4$ ;LOOP 8$: TST @SP ;IS VALUE ZERO? BEQ 11$ ;YES 9$: DEC R0 ;FINISHED WITH ZEROS? BMI 10$ ;YES CALL MOV1 ;PUT IN A ZERO BR 9$ ;LOOP 10$: CMP R5,R4 ;GOT ANOTHER DIGIT? BLOS 12$ ;NO: FINISHED MOVB -(R5),R1 ;GET NEXT DIGIT 11$: CALLTTING .WORD START ;TRANSFER ADDRESS .WORD 0,0,0 .RAD50 /UP / ;TASK... .RAD50 /PWR/ ;...NAME PWRUPH: .WORD START ;CALL NUMBER .END cOR THIS LINE 2$: .WORD 0 CALL SETP ;START LINE 3$: CALL LIDVF ;CONVERT ONE FIELD ADD #4*^D11,R0 ;BUMP INDEX CMP R0,#LB.LIM ;NEED NEW LINE ? BHIS 4$ ;YES MOVB #SPACE,(R2)+ ;STORE SPACE BR 3$ ;DO NEXT ONE 4$: CMP R2,#OBUF ;AT BEGINNING OF LINE ? BLOS 5$ ;YES CMPB -(R2),#SPACE ;SUPPRESS TRAILING SPACES ... BEQ 4$ INC R2 5$: CALL TWMES ;END LINE AND WRITE IT MOV 2$,R0 ;GET START INDEX FOR LAST LINE ADD #4,R0 ;BUMP INDEX CMP R0,#4*^D11 ;DONE ALL ? BLO 1$ ;NO: DO NEXT LIdS BYTE .WORD 0 ;RESIDUE WORD COUNT .WORD STATV ;ADDRESS OF STATUS VARIABLE XF4: .WORD 0 ;"COMMENTS" BLOCK NUMBER .WORD CDAT ;MEMORY START ADDRESS .WORD ^D256 ;WORD COUNT .BYTE WRITE ;FUNCTION .BYTE 0 ;STATUS BYTE .WORD 0 ;RESIDUE WORD COUNT .WORD STATV ;ADDRESS OF STATUS VARIABLE STATV: .WORD 0 ;STATUS VARIABLE .PAGE .SBTTL REAL TIME HEADER .WORD 0,0,0,0,0 .WORD 0 ;MAX. TIME: UNLIMITED .WORD 0 .BYTE 2 ;PRIORITY .BYTE 0 .WORD LOSTK ;STACK LIMIT .WORD 0e MOV1 ;MOVE IT IF IT'LL FIT BR 10$ ;LOOP 12$: TST @SP ;VALUE NEGATIVE? BPL 13$ ;NO MOVB #'-,R1 ;MINUS SIGN CALL MOV1 ;MOVE IT IN IF IT'LL FIT 13$: MOVB #SPACE,R1 ;SET SPACE CHARACTER SFIL: ADD #^D8,SP ;REMOVE VALUE & SPACE FROM STACK 14$: CMP R3,R2 ;AT BEGINNING YET? BLOS 15$ ;YES: FINISHED MOVB R1,-(R3) ;CHAR. FILL BR 14$ ;LOOP 15$: .POP R2 ;END PNTR TO R2 .POP R4 ;RESTORE R4 .POP R5 ;RESTORE R5 RETURN MOV1: CMP R3,R2 ;ROOM FOR ANOTHER CHARACTER? BLOS 16$ ;NO f .TITLE BEGENT .IDENT /V004A/ ; ; LIST OF TASKS TO ENTER INTO THE SCHEDULING TABLE. ; ; THE TASKS IN THIS LIST ARE THE TASKS LINKED ; DIRECTLY TO THE EXEC AT SYSTEM GENERATION TIME. ; ; FORMAT OF AN ITEM IN THE LIST: ; ; .BYTE SLOT #,PRIORITY ; .WORD REAL TIME HEADER ADDRESS ; ; THE LIST IS TERMINATED BY A WORD 126.(DECIMAL) ; ; NEW ENTRIES IN THE LIST SHOULD BE INSERTED BEFORE ; THE TERMINATOR. THE SLOT NUMBER CHOSEN MUST BE ; AN EVEN NUMBER IN THE RANGE "2 THRU N-4" WHERE "N" ; IS gNE .PAGE LABI: CALL REQ,LM1 ;REQUEST COMMAND BEQ LI1 ;BLANK: START WITH 1ST FIELD BMI 2$ ;DIGIT MOVB (R1)+,R0 ;GET CHAR. CALL G.NX ;END-OF-LINE? BNE 3$ ;NO: ERROR MOV #LCL,R1 ;PNTR TO LAB COMMAND LIST 1$: TSTB @R1 ;END OF LIST? BEQ 3$ ;YES: INVALID COMMAND CMPB (R1)+,R0 ;MATCH? BNE 1$ ;NO, TRY NEXT ONE SUB #LCL+1,R1 ;COMPUTE INDEX ASL R1 ;DOUBLE IT JMP @LDL(R1) ;GO 2$: CALL G.NUM ;CONVERT NUMBER TO BINARY CMP R0,#LBNUM ;TOO BIG? BHI 3$ ;YES: ERROR DEC R0 ; .WORD BEG ;INITIAL STACK SETTING .WORD START ;TRANSFER ADDRESS .WORD 0 PRM: .WORD 0 .WORD 0 .RAD50 /MP / ;TASK... .RAD50 /DDU/ ;...NAME DDUMPH: .WORD START ;CALL NUMBER .END i MOVB R1,-(R3) ;STORE CHARACTER RETURN 16$: .POP ;REMOVE RETURN FROM STACK MOVB #'*,R1 ;SET OVERFLOW CHARACTER MOV ^D8(SP),R3 ;END PNTR TO R3 BR SFIL ;GO FILL WITH '*' & EXIT .PAGE .SBTTL PROCESS VARIABLE CONVERSION TO ASCII .GLOBL CV,CM .GLOBL A$VAL,A$SPAN,A$LOW,A$PWR ;+ ; SUBROUTINES: CV ; CM ; ; FORM OF CALL: JSR PC,CV ; JSR PC,CM ; ; ACTION: ; ; THESE ROUTINES ARE USED TO CONVERT PROCESS VARIABLES ; FROM THEIR INTERNAL REPRESENTATION TO ASCII STRINGS IN ; ENjTHE SIZE OF THE SCHEDULING TABLE. IT MUST NOT ; CONFLICT WITH SLOT NUMBERS CHOSEN FOR OTHER TASKS ; IN THE LIST. IF THE SLOT NUMBER IS 0, THE INITIAL- ; IZATION CODE WILL FIND AN APPROPRIATE SLOT. ; ; THE PRIORITY LEVEL MUST BE IN THE RANGE 1-3. ; ; THE REAL TIME HEADER ADDRESS MUST BE A GLOBAL DEFINITION ; IN THE USER TASK. ; .SBTTL GLOBAL DEFINITIONS .GLOBL ENTERL .SBTTL GLOBAL REFERENCES .GLOBL UTILT ;UTILITY TASK .GLOBL UTILHD .GLOBL ERMST ;ERROR MESSAGE TASK .GLOBL MS.HEDkCHANGE TO ZERO BASE BMI 3$ ;WAS ZERO: ERROR ASL R0 ;MULTIPLY BY ASL R0 ; FOUR CALL G.NX ;END OF LINE? BEQ LINP ;YES: GO TO INPUT MODE 3$: .WRITE #OPOUT,#LM2 ;WRITE ERROR MESSAGE BR LABI ;GO RE-REQUEST COMMAND LINX: MOV LT1,R0 ;GET CURRENT INDEX ADD #4,R0 ;BUMP IT CMP R0,#LB.LIM ;FLIP-OVER? BLO LINP ;NO LI1: CLR R0 ;FLIP BACK TO ZERO LINP: MOV R0,(PC)+ ;STORE NEW INDEX LT1: .WORD 0 CALL LDER ;DELETE ERROR LINE IF ANY 1$: CALL SETP ;START LINE MOV #LAD1,R1 ;PNTR TO l .TITLE SUB - CONDENSE TEXT TO SUBSTRINGS MAXLIN= ^D500 ;MAX. NUM. OF LINES POSSIBLE AVLGTH= ^D32 ;ESTIMATED AVERAGE LENGTH OF LINES .MCALL .PARAM,.PUSH,.POP .MCALL .BIN2D,.BIN2O .MCALL .INIT,.OPEN,.READ,.WRITE,.WAIT,.CLOSE,.RLSE .MCALL .DELET .MCALL .CSI1,.CSI2 .MCALL .EXIT .MCALL CALL,RETURN,Q .PARAM .SBTTL GET VALID COMMAND LINE STKTOP: START: .INIT #IOPL ;INIT CONSOLE INPUT .INIT #OOPL ;INIT CONSOLE OUTPUT .OPEN #IOPL,#IDFN ;OPEN CONSOLE INPUT .OPEN #OOPL,#ODFN mGINEERING UNITS. SIX ASCII CHARACTERS ARE GENERATED. ; ROUTINE CV IS USED TO CONVERT THE CURRENT VALUE OF ; A PROCESS VARIABLE. ; ROUTINE CM IS USED TO CONVERT OTHER DATA RELATED ; TO A PROCESS VARIABLE, SUCH AS ALARM LIMITS, ETC. ; ; ENTRY: ; ; R1= VALUE TO BE CONVERTED (FOR ROUTINE CM ONLY !) ; R2= DESTINATION POINTER ; R3= POINT INDEX OF PROCESS VARIABLE ; ; EXIT: ; ; R0 & R1 ARE LOST ; R2 POINTS PAST CONVERTED STRING (R2=R2+ 6.) ; R3, R4, & R5 ARE UNCHANGED ;- CV: MOV A$VAL(R3)n .GLOBL OPERT ;RSX OPERATOR TASK .GLOBL OPHED .GLOBL GETT ;ON LINE LOADER .GLOBL LODHED .GLOBL REPHED ;REPORT TASK .GLOBL POWFT ;POWER UP TASK SLOT NUMBER .GLOBL PWRUPH ;POWER UP TASK HEADER .GLOBL SCANRH ;CYCLIC INPUT & PROCESSING TASK .GLOBL SCANAH ;CYCLIC ALARM CHECK TASK .GLOBL ALARMH ;ALARM MESSAGE TASK .GLOBL KBOPT ;KB OPERATOR TASK SLOT NUMBER .GLOBL KBOPH ;KB OPERATOR TASK HEADER .GLOBL DTREPT ;DECTAPE REPORT TASK SLOT NUMBER .GLOBL DTREPH ;DECTAPE REPORT TASK HEADER oCURSOR ADDRESS STRING CALL EXPAND ;MOVE TO OUTPUT LINE CALL LIDV ;MAKE ID NUM., ID STRNG, & VALUE MOVB #SPACE,(R2)+ ;INSERT A SPACE MOVB #'=,(R2)+ ;..EQUALS SIGN MOVB #SPACE,(R2)+ ;..SPACE CALL TPRE ;TERMINATE PREFIX CALL REQ,OBUFH ;REQUEST INPUT & READ MOV #INBUF,R1 ;DON'T SUPPRESS LEADING SPACES TSTB @R1 ;EMPTY RESPONSE ? BEQ 6$ ;YES: DON'T CHANGE MOV #100000,R4 ;SET NEW VALUE (R4,R5) ... CLR R5 ; ... TO 'EMPTY' CALL G.NX ;ANY NON-SPACE CHAR. ? BEQ 5$ ;NO: SET VALUE Tp;OPEN CONSOLE OUTPUT RSTRT: MOV #IMES,R0 ;SET INITIAL MESSAGE MSRS: MOV #STKTOP,SP ;RESET SP IF NEEDED .WRITE #OOPL,R0 ;WRITE A MESSAGE RS: .WRITE #OOPL,#HATCH ;REQUEST INPUT .WAIT #OOPL .READ #IOPL,#IOPBH ;READ A LINE .WAIT #IOPL CMPB IOPB,#12 ;BLANK LINE? BLO GOTCOM ;NO CMPB IOPB,#15 ;BLANK LINE? BLOS RS ;YES...IGNORE IT GOTCOM: .CSI1 #CMDBUF ;CALL CSI1 MOV (SP)+,R0 ;GET INFO WORD BEQ CSI1OK ;SYNTAX O.K. INC R0 ;BUMP PNTR MOVB #'?,(R0)+ ;APPEND Q-MARK, MOVB #15,(R0)+ ;q,R1 ;GET POINT VALUE CM: MOV R2,R0 ;TEMP. SAVE R2 MOV A$SPAN(R3),R2 ;GET POINT SPAN CALL MULTR ;MULTIPLY ADD A$LOW(R3),R1 ;ADD LOW VALUE MOV R0,R2 ;DEST. PNTR BACK TO R2 MOVB A$PWR(R3),R0 ;GET DEC. POSITION INDICATOR .PUSH R3 ;SAVE R3 ON STACK MOV #^D6,R3 ;SET FIELD WIDTH CALL SCVRT ;PERFORM CONVERSION .POP R3 ;RESTORE R3 RETURN .PAGE .SBTTL SPECIAL B-TO-D CONVERSIONS .GLOBL CVT2,CVT2S ;+ ; SUBROUTINES: CVT2 ; CVT2S ; ; FORM OF CALL: JSR PC,CVT2 ; JSR PC,CVT2Sr.GLOBL INREPH ;INTERNAL REPORTS TASK HEADER .GLOBL DDUMPH ;DATA DUMP TASK .PAGE ENTERL: .BYTE UTILT,4 ;UTILITY TASK .WORD UTILHD ; .BYTE ERMST,4 ;ERROR MESSAGE TASK .WORD MS.HED ; .BYTE OPERT,4 ;RSX OPERATOR TASK .WORD OPHED ; .BYTE GETT,3 ;ON LINE LOADER .WORD LODHED ; .BYTE POWFT,3 ;POWER UP TASK .WORD PWRUPH ; .BYTE KBOPT,1 ;KB OPERATOR TASK .WORD KBOPH ; .BYTE DTREPT,1 ;DECTAPE REPORT TASK .WORD DTREPH ; .BYTE 0,1 ;INTERNAL REPORTS TASK .WORD INREPsO 'EMPTY' TSTB L$DEC(R0) ;IS THIS A 'TIME' VALUE ? BMI 3$ ;YES CALL AS2FLT ;CONVERT TO FLT-PNT NUMBER BCC 4$ ;HAVE A VALID NUMBER 2$: .WRITE #OPOUT,#LM3 ;WRITE ERROR MESSAGE MOV LT1,R0 ;RESET R0 = INDEX BR 1$ ;GO REQUEST VALUE AGAIN 3$: CALL G.NUM ;GET HOURS BCS 2$ ;NO NUMBER: ERROR CMP R0,#^D24 ;VALID HOURS ? BHIS 2$ ;NO: ERROR MOV R0,R4 ;SAVE HOUR CALL G.NX ;GET NEXT NON-SPACE BEQ 4$ ;END-OF-LINE CMPB (R1)+,#': ;COLON ? BNE 2$ ;NO: ERROR CALL G.NUM ;GET MINUTt C.R., MOVB #12,(R0)+ ; & L.F. SUB #IOPB,R0 ;COMPUTE BYTE COUNT MOV R0,IOPC ;STORE IN HEADER MOV #IOPBH,R0 ;SET MESSAGE ADDRESS BR MSRS ;WRITE MESSAGE & RESTART CSI1OK: MOV #2,CMDBUF ;SET FOR OUTPUT SPECS .CSI2 #CBLK1 ;GET OUTPUT DEVICE TST (SP)+ ;CLEAN STACK .CSI2 #CBLK2 ;GET LOG DATASET IF ANY BIT #1,(SP)+ ;ANY MORE? BNE 2$ ;NO...O.K. 1$: .WRITE #OOPL,#ERM1 ;WRITE ERROR MESSAGE BR RSTRT 2$: TST OLB+6 ;GOT OUTPUT DATASET? BEQ 1$ ;NO TST OFN ;FILE NAME? BNE 1$ ;Yu ; ; ACTION: ; ; BOTH ROUTINES CONVERT A BINARY NUMBER BETWEEN 0 ; AND 99 (DECIMAL) TO A TWO-DIGIT ASCII STRING. ; CVT2S OUTPUTS A COLON FOLLOWED BY THE TWO-DIGIT STRING ; AT ENTRY, THE NUMBER TO BE CONVERTED IS IN R0, AND ; R2 IS THE DESTINATION POINTER FOR THE STRING. ; ; EXIT: ; ; R0= THE ASCII VALUE OF THE SECOND DIGIT OUTPUT ; R2= INITIAL R2 PLUS 2 ; ALL OTHER REGISTERS ARE UNCHANGED ; ;- CVT2S: MOVB #':,(R2)+ ;OUTPUT ':' CVT2: MOVB #'0-1,@R2 ;CONVERT FIRST DIGIT 1$: INCB @R2 H ; .BYTE 0,3 .WORD REPHED ; .BYTE 0,3 .WORD SCANRH ; .BYTE 0,2 .WORD SCANAH ; .BYTE 0,1 .WORD ALARMH ; .BYTE 0,2 .WORD DDUMPH ; .WORD 126. ;LIST TERMINATOR ; .END wES CMP R0,#^D60 ;VALID MINUTES ? BHIS 2$ ;NO: ERROR SWAB R4 ;PUT MINUTES ... BISB R0,R4 ; ... IN PROPER SWAB R4 ; ... PLACE 4$: CALL G.NX ;END-OF-LINE? BNE 2$ ;NO: ERROR 5$: MOV LT1,R0 ;GET INDEX MOV R4,L$VAL(R0) ;STORE NEW ... MOV R5,L$VAL+2(R0) ; ... VALUE ; UPDATE VALUE IN FORM : ASR R0 ;CONVERT INDEX TO ... ASR R0 ; ... ID NO. - 1 CLR R1 ;ZERO HI-DIVIDEND MOV #^D11,R2 ;SET DIVISOR CALL DIVIDE ;DIVIDE ; REMAINDER IS IN R0 : ADD #42,R0 ;FORM CURSOR Y-ADDRESS CxES...NONE ALLOWED CLR CMDBUF ;SET FOR INPUT SPECS .CSI2 #CBLK3 ;CALL CSI2 MOV (SP)+,MF ;SAVE RETURNED WORD TST ILB+6 ;GOT AN INPUT DATASET? BEQ 1$ ;NO...AT LEAST ONE REQUIRED .PAGE .SBTTL READ ALL STRINGS INTO BUFFER P1: MOV #BUF,R0 ;SET PNTR TO BEGINNING OF BUFFER MOV #LLST,R1 ; AND PTR TO LIST OF PTRS BR SNI EOF1: BIT #1,(PC)+ ;ANY MORE INPUT SPECS.? MF: .WORD 1 BNE EP1 ;NO .CSI2 #CBLK3 ;CALL CSI2 MOV (SP)+,MF ;SAVE RETURNED WORD TST ILB+6 ;GOT SOMETHING? BEQ EOy SUB #10.,R0 BHIS 1$ TSTB (R2)+ ;BUMP DEST. POINTER ADD #'9+1,R0 ;FORM SECOND DIGIT MOVB R0,(R2)+ ;OUTPUT IT RETURN ;RETURN .PAGE .SBTTL TIME CONVERSION ROUTINE .GLOBL GTIME .GLOBL HOUR,MIN,SEC ;+ ; SUBROUTINE: GTIME ; ; FORM OF CALL: JSR PC,GTIME ; ; ACTION: ; ; CONVERTS THE CURRENT TIME TO AN 8-BYTE ASCII STRING, ; OF THE FORM HH:MM:SS ; R2 AT ENTRY IS THE DESTINATION POINTER FOR THE STRING. ; ; EXIT: ; ; R2 IS INCREMENTED BY 8 TO POINT TO THE 1ST BYTE ; PA .TITLE FLAGS - SET FLAG WORD 2 .ASECT .= 2 .WORD 0 ;NORMAL EVERYTHING .END {ODE MOVB R0,LUY ;STORE IT IN BUFFER ; QUOTIENT IS IN R1 : MOV #^D18,R2 ;NO. CHAR. / ITEM CALL MULT ;MULTIPLY TO GET X-POSITION ADD #40,R0 ;FORM CURSOR X-ADDRESS CODE MOVB R0,LUX ;STORE IT IN BUFFER MOV #LUV,R2 ;SET DEST. PNTR MOV LT1,R0 ;GET INDEX CALL LIDVF ;MAKE UPDATE STRING .WRITE #OPOUT,#LUP ;WRITE UPDATE ON SCREEN 6$: CALL LDER ;DELETE ERROR LINE IF NECESSARY TST TFLAG ;LINE TERM. WITH C.R.? BNE LINX ;NO: STEP TO NEXT FIELD JMP LABI ;RETURN TO COMMAND MODE LHL|F1 ;NO...TRY AGAIN SNI: TST IFN+4 ;EXTENSION? BEQ 1$ ;NO...O.K. MOV #ERM5,R0 BR MSRS 1$: MOV IEXT,IFN+4 ;SET EXTENSION .INIT #ILB ;INIT INPUT .OPEN #ILB,#IFN ;OPEN IT 2$: CALL RCHEK ;READ LINE & CHEK FOR SUB CALL BEQ EOF1 ;END OF FILE BCC 2$ ;NO SUB CALL ON THIS LINE CMP R1,#LLSTE-^D258 ;TOO MANY LINES? BHIS FULL ;YES MOV R0,(R1)+ ;STORE START PNTR IN LIST 3$: CMP R4,R5 ;ANY MORE ON LINE? BHIS FER1 ;NO...ERROR CMPB @R4,#'> ;TERMINATOR? BEQ 2$ ;YES...FINISHED THIS }ST THE CONVERTED TIME. ; R0-R1, R3-R5 ARE UNCHANGED. ; ;- GTIME: .PUSH R0 ;SAVE R0 ON STACK MOVB HOUR,R0 ;GET HOUR CALL CVT2 ;CONVERT IT MOVB MIN,R0 ;GET MINUTES CALL CVT2S ;OUTPUT ':' AND CONVERT MINUTES MOVB SEC,R0 ;GET SECONDS CALL CVT2S ;OUTPUT ':' AND CONVERT SECONDS .POP R0 ;RESTORE R0 RETURN ;RETURN .PAGE .SBTTL DATE CONVERSIONS .GLOBL C.DA2B .GLOBL S.RSAV,S.RRES ;+ ; SUBROUTINE: C.DA2B ; ; FORM OF CALL: JSR PC,C.DA2B ; ; ACTION: ; ; C.DA2B CONVER; PARAMETER DEFINITIONS FOR CONFIGURATION: AENUM= ^D36 ;NUMBER OF 'EXTERNAL' ANALOG VALUES AINUM= ^D6 ;NUMBER OF INTERNALLY COMPUTED ANALOG VALUES DPNUM= ^D3 ;NUMBER OF DIGITAL PULSE COUNT POINTS DONUM= ^D63 ;NUMBER OF DIGITAL OPERATION TIME POINTS A1NUM= ^D10 ;NUMBER OF LOW/HIGH LIMIT ANALOG ALARMS D1NUM= ^D124 ;NUMBER OF DIGITAL ALARM FUNCTIONS CDNUM= ^D4 ;NUMBER OF COST VALUES REQUIRED P: .WRITE #OPOUT,#LHM ;WRITE INSTRUCTIONS CALL REQ,REDY ;WAIT FOR RESPONSE JMP LFRM ;GO BACK TO BEGINNING LEND: CALL LWR ;WRITE DATA TO TAPE JMP LAB ;GO BACK TO BEGINNING LNXD: CALL LWR ;WRITE DATA TO TAPE MOV SDAT,R0 ;GET DATA DATE CALL INCDAT ;STEP UP ONE DAY MOV R0,SDAT ;SAVE IT CMP R0,DATE ;VALID DATE ? BHI 1$ ;NO JMP GLAB ;GO GET DATA & PROCEED 1$: JMP LAB ;GO BACK TO BEGINNING LWR: MOVB #WRITE,FCN ;SET FUNCTION TO WRITE CALL XFER ;WRITE LAB DATA TO TAPE RELINE CMP R0,#BUFEND ;ANY MORE ROOM? BHIS FULL ;NO MOVB (R4)+,(R0)+ ;STORE CHARACTER BR 3$ ;LOOP FULL: MOV #ERM2,R0 BR IP1E FER1: .WRITE #OOPL,#ERM3 MOV #INBH,R0 IP1E: .CLOSE #ILB .RLSE #ILB JMP MSRS EP1: MOV R0,@R1 ;STORE END PTR IN LIST CLR 2(R1) ;TERMINATE PTR LIST MOV R1,(PC)+ ;STORE PTR TO 1ST SS PTR IN LIST SUBPTR: .WORD 0 ADD #400,R1 ;FORM OFFSET POINTER MOV R1,(PC)+ ;SAVE IT OFFSET: .WORD 0 .PAGE .SBTTL SUBSTRINGIZATION .INIT #MLB .OPEN #MLB,#MFN TS AN ASCII DATE OF THE FORM: ; 18-OCT-73 ; TO A ONE-WORD NUMBER IN STANDARD PDP-11 DATE FORMAT, ; I.E. JULIAN DATE - 70000. ; ; C.DA2B STARTS WITH THE CHARACTER POINTED TO BY R1, ; IGNORES ANY LEADING SPACES, AND LOOKS FOR A ; SYNTACTICALLY CORRECT DATE. ; ; EXIT: ; ; IF A VALID ASCII DATE IS FOUND: ; R0= BINARY DATE WORD ; R1 POINTS TO THE 1ST CHARACTER PAST THE DATE ; R2-R5 ARE UNCHANGED ; 'C' CONDITION CODE IS CLEAR. ; ; IF ASCII DATE IS INVALID: ; R1 IS UNDEFINED  .TITLE FMATH - FLOATING POINT MATH ROUTINES .MCALL .PARAM,.PUSH,.POP,CALL,RETURN .PARAM .GLOBL THREAD ;THREADED MODE ENTRY ROUTINE THREAD: .POP ;DISCARD SAVED R4 JMP @(R4)+ ;THREAD TO NEXT ROUTINE .PAGE .GLOBL $DVR ;THREADED MODE FLOATING DIVIDE $DVR: .PUSH R4 .PUSH R5 CLR R0 CLR R1 .PUSH #0 ASL 12(SP) ROL @SP .PUSH #0 TST 10(SP) BEQ D02 BISB 15(SP),@SP BEQ D01 BISB 14(SP),R0 SWAB R0 SEC ROR R0 BISB 17(SP),R0 BISB 16(SP),R1 SWAB R1 CLR R2 CTURN LIDVF: CALL LIDV ;MAKE ID NO., ID, & VALUE ADD #5,R3 ;R3 NOW PNTS PAST VALUE FIELD 1$: CMP R2,R3 ;AT END YET ? BHIS 2$ ;YES MOVB #SPACE,(R2)+ ;SPACE FILL BR 1$ 2$: RETURN LIDV: MOV R0,R3 ;SAVE INDEX ASR R0 ;CHANGE TO ... ASR R0 ; ... ID NO. - 1 INC R0 ;CHANGE TO ID NO. CALL CVT2 ;CONVERT TO ASCII MOV R3,R0 ;RESTORE INDEX MOVB #':,(R2)+ ;PUT IN A COLON MOV R2,R3 ;COMPUTE BEGINNING OF ... ADD #^D9,R3 ; ... VALUE FIELD MOV L$SHP(R0),R1 ;GET PNTR TO SHORT ID  TST LLB+6 ;CREATING LOG? BEQ X1 ;NO TST LFN ;GOT A NAME? BNE 1$ ;YES MOV DLFN,LFN ;SUPPLY MOV DLFN+2,LFN+2 ; DEFAULT MOV DLFN+4,LFN+4 ; NAME 1$: .INIT #LLB MOV #DELER0,LFN-4 ;SET ERROR ADDRESS .DELET #LLB,#LFN ;DELETE OLD FILE IF NEC. DELER0: CLR LFN-4 ;RESET ERROR ADDRESS .OPEN #LLB,#LFN X1: CLR SSNUM ;ZERO SUBSTRING NUMBER MOV @SUBPTR,R0 ;PTR TO END OF LAST LINE SUB LLST,R0 ;R0= TOTAL ORIGINAL STORAGE ; SPACE REQUIRED FOR TEXT MOV R0,(PC)+ ;SAVE IT ORIGSP: . ; ALL OTHER REGISTERS ARE UNCHANGED ; 'C' CONDITION CODE IS SET. ; ;- C.DA2B: JSR R5,S.RSAV ;SAVE REGISTERS CALL G.NUM ;GET DAY OF MONTH FROM STRING MOV R0,R4 ;SAVE IT IN R4 BEQ 1$ ;ERROR OF IT'S ZERO CMPB (R1)+,#'- ;HYPHEN? BNE 1$ ;NO: ERROR .RADPK R1 ;CONVERT 1ST THREE CHARS. OF ; MONTH TO RAD50 BCC 2$ ;BRANCH IF NO CONVERSION ERROR ADD #4,SP ;REMOVE ARGS. FROM STACK 1$: JSR R5,S.RRES ;RESTORE REGISTERS SEC ;INDICATE ERROR: C=1 RETURN ;RETURN 2$: .POP R5 LR R3 ASL 10(SP) ADC 2(SP) BISB 11(SP),R2 SUB R2,@SP CLR R2 BISB 10(SP),R2 SWAB R2 SEC ROR R2 BISB 13(SP),R2 BISB 12(SP),R3 SWAB R3 CMP R0,R2 BCS D09 BHI D08 CMP R1,R3 BHI D08 BNE D09 CLR 14(SP) INC @SP CLR R5 BR D11 D01: CMP (SP)+,(SP)+ BR D07 D02: .POP MOV #4003,R0 BR D06 D03: .POP D04: MOV #3003,R0 BR D06 D05: MOV #1405,R0 D06: .POP CALL $ERRA D07: CLR 10(SP) CLR 12(SP) BR D12 D08: ROR R0 ROR R1 INC @SP D09: MOV #11,R4 CALL D13 STRING CALL EXPAND ;MOVE STRING MOV L$VAL(R0),R4 ;GET VALUE ... MOV L$VAL+2(R0),R5 BNE 1$ ;VALUE NOT EMPTY CMP R4,#100000 ;VALUE EMPTY ? BEQ 3$ ;YES: RETURN 1$: MOVB #SPACE,(R2)+ ;PUT IN A SPACE CMP R2,R3 ;AT VALUE FIELD YET ? BLO 1$ ;NO: SPACE FILL MOVB L$DEC(R0),R1 ;GET DEC. POS. OR TIME FLAG BMI 2$ ;THIS IS A 'TIME' VALUE .PUSH #5 ;SET FIELD WIDTH .PUSH R1 ;SET NO. DIGITS PAST DEC. POINT CALL FLT2AS ;CONVERT TO ASCII RETURN 2$: MOV R0,R1 ;SAVE INDEX MOVB R4,R0 WORD 0 MOV R0,FSPACE ;INITIALIZE FINAL REQUIREMENT CLR TSAVE ;INITIALIZE TOTAL SAVINGS .BIN2D #OSPC,R0 ;CONVERT TO DECIMAL .BIN2O #OSPCO,R0 ; AND TO OCTAL .WRITE #MLB,#OSPCH ;WRITE INITIAL LINE .WAIT #MLB TST LLB+6 ;CREATING LOG? BEQ MLOOP ;NO .WRITE #LLB,#OSPCH ;WRITE INITIAL LINE .WAIT #LLB MLOOP: CLR FLG1 ;CLEAR FLAG CLR BEST ;CLEAR BEST SAVINGS MOV #LLST,R5 ;SET PTR TO BEGINNING OF PTR LIST MOV #2,TLL ;SET SS LENGTH = 2 BR NXSL ;GO TO IT F1: MOV R3,R4 ;SET NE;SAVE RAD50 MONTH IN R5 .POP R1 ;RESTORE R1 4$: CALL T.LET ;LETTER NEXT? BPL 5$ ;NO INC R1 ;YES: IGNORE IT BR 4$ 5$: CMPB (R1)+,#'- ;HYPHEN? BNE 1$ ;NO: ERROR CALL G.NUM ;GET YEAR FROM STRING BCS 1$ ;ERROR IF NULL MOV R0,R2 ;SAVE YEAR IN R2 MOV R1,2(SP) ;PUT R1 IN SAVED R1 POSITION ON STACK CLR R3 ;INITIALIZE TOTAL MOV #MTAB,R0 ;SET TABLE POINTER BR 7$ ;GO SEARCH FOR MONTH 6$: ADD (R0)+,R3 ;ACCUMULATE MONTH CMP R0,#MTABE ;END OF TABLE? BHIS 1$ ;YES: INVALID MONTH MOVB R5,14(SP) TST R4 BEQ D10 CLR R5 BR D11 D10: MOV #20,R4 CALL D13 D11: .POP R4 ADD #200,R4 BLE D05 CMP #377,R4 BLT D04 MOVB R4,13(SP) ROR (SP)+ ROR 10(SP) ROR R5 ADC R5 ADC 10(SP) MOV R5,12(SP) BCS D03 BVS D03 D12: .POP R5 .POP R4 CMP (SP)+,(SP)+ JMP @(R4)+ D13: ASL R5 ASL R1 ROL R0 BCS D14 CMP R2,R0 BHI D15 BCS D14 CMP R3,R1 BHI D15 BEQ D16 D14: SUB R3,R1 SBC R0 SUB R2,R0 INC R5 D15: DEC R4 BGT D13 RETURN D16: INC R5 BR D18 ;GET HOURS CALL CVT2 ;CONVERT TO ASCII SWAB R4 MOVB R4,R0 ;GET MINUTES CALL CVT2S ;CONVERT MOV R1,R0 ;RESTORE R0 = INDEX 3$: RETURN LDER: .WRITE #OPOUT,#LDEB ;CLEAN BOTTOM OF SCREEN RETURN LCL: .ASCII /NEDH/ .BYTE 0 .EVEN LDL: .WORD LINX,LEND,LNXD,LHLP GENMES LM1 CURSOR 21,0 .BYTE EOS LIN ENDMES LM1 GENMES LM2 CURSOR 20,0 .BYTE EOS LINE ENDMES LM2 GENMES LM3 CURSOR 20,0 .BYTE EOS LXT START POINT F2: CMP R4,R2 ;PAST 'NO-MORE-CHANCE' POINT? BHI NXL ;YES: STEP TO NEXT LINE CMPB (R4)+,R0 ;1ST CHAR. MATCH? BNE F2 ;NO MOV R4,R3 ;SAVE NEXT START POINT MOV (PC)+,R5 ;GET PTR C2TP: .WORD 0 ;PTR TO 2ND CHAR. OF TEST SS 1$: CMPB (R4)+,(R5)+ ;NEXT CHAR. MATCH? BNE F1 ;NO: START AGAIN CMP R5,R1 ;AT END OF TEST SS? BLO 1$ ;NO ; MATCH FOUND INC (PC)+ ;COUNT THE MATCH CNT: .WORD 0 ;NO. OF MATCHES - 1 BR F2 ;GO LOOK SOME MORE NXL: MOV (PC)+,R5 ;GET EOL PTR PTR  7$: CMP (R0)+,R5 ;MONTH MATCH FOUND? BNE 6$ ;NO: CONTINUE SEARCHING ; AND ACCUMULATING BIT #3,R2 ;LEAP YEAR? BNE 9$ ;NO CMP R0,#FEB+2 ;CHECK WHICH MONTH BLO 9$ ;JAN.: NORMAL BHI 8$ ;PAST FEB.: ADD EXTRA DAY DEC R4 ;FOR FEB.: DEC. DAY SO FOLLOWING ; TEST IS CORRECT 8$: INC R3 ;ADD EXTRA DAY 9$: CMP R4,@R0 ;DAY O.K.? BHI 1$ ;TOO HIGH: ERROR ADD R3,R4 ;ADD DAY INTO ACCUMULATED TOTAL SUB #^D70,R2 ;CONVERT YEAR TO PROPER RANGE BHIS 10$ ADD #^D100,R2 ;IF LESS THA D17: ASL R5 D18: DEC R4 BGT D17 INC R4 RTS PC .PAGE .GLOBL $MLR ;THREADED MODE FLOATING MULTIPLY $MLR: .PUSH R4 .PUSH R5 MOV 4(SP),R2 ASL R2 ROL -(SP) .PUSH #0 SWAB R2 MOVB R2,@SP BEQ M04 SEC ROR R2 CLRB R2 BISB 13(SP),R2 CLR R3 BISB 12(SP),R3 SWAB R3 ASL 14(SP) ADC 2(SP) TSTB 15(SP) BEQ M04 ROR 14(SP) CLR R0 CLR R1 MOV 16(SP),R4 BEQ M01 MOV #17,R5 CALL M14 CALL M10 M01: MOV 14(SP),R4 MOV #7,R5 CALL M10 CALL M11 ADD (SP)+,R4 INE ENDMES LM3 GENMES LHM .BYTE HOME,EOS LINE < DEFINITIONS:> LINE <(LF) = LINE FEED> LINE <(CR) = CARRIAGE RETURN> LINE <(XX) = 1 OR 2 DIGIT FIELD NUMBER> Q < VALID RESPONSES TO THE REQUEST> LINE < 'ENTER COMMAND :' ARE:> LINE LINE Q LINE < PROCEED TO NEXT DATE> LINE <(CR) - JUMP TO DATA FIELD 1> LINE <(LF)  TLP: .WORD 0 ;PTR TO EOL PTR IN LIST MOV (R5)+,R4 ;GET START ADDR OF NEXT LINE MOV @R5,R2 ; AND END ADDR OF NEXT LINE BEQ E1 ;FINISHED WITH THIS TEST SS MOV R5,TLP ;SAVE 'NEXT' POINTER SUB (PC)+,R2 ;COMPUTE 'NO-MORE-CHANCE' PTR TLL: .WORD 0 ;LENGTH OF TEST SS BR F2 ;GO START LOOKING AGAIN E1: .PUSH R1 ;SAVE R1 MOV CNT,R1 ;GET NO. OF MATCHES - 1 BEQ E2 ;NO SPACE SAVED (USED ONLY ONCE) MOV TLL,R2 ;GET LENGTH DEC R2 ;R2= LENGTH - 1 CALL MULT ;COMPUTE SPACE SUB #4,R0 N 70. 10$: CMP R2,#^D65 ;VALID YEAR? BHI 1$ ;NO 11$: DEC R2 ;ADD 1000. FOR BMI 12$ ; EACH YEAR ADD #^D1000,R4 ; PAST 1970 BR 11$ 12$: MOV R4,@SP ;PUT CONVERTED DATE IN SAVED ; R0 POSITION ON STACK JSR R5,S.RRES ;RESTORE REGISTERS CCC ;CLEAR CODES TO INDICATE O.K. RETURN ;RETURN .PAGE .GLOBL C.B2DA,GDATE .GLOBL DATE .GLOBL S.RSAV,S.RRES ;+ ; SUBROUTINE: C.B2DA ; ; FORM OF CALL: JSR PC,C.B2DA ; ; ACTION: ; ; C.B2DA CONVERTS A BINARY DATE WORD IN STANDARD PDROL R1 ROL R0 BCS M02 ROL R1 ROL R0 DEC R4 M02: SUB #200,R4 BLE M07 CMP #377,R4 BLT M05 CLRB R1 BISB R0,R1 SWAB R1 CLRB R0 BISB R4,R0 SWAB R0 ROR (SP)+ ROR R0 ROR R1 ADC R1 ADC R0 BCS M06 BVS M06 M03: MOV R0,10(SP) MOV R1,12(SP) .POP R5 .POP R4 CMP (SP)+,(SP)+ JMP @(R4)+ M04: CMP (SP)+,(SP)+ BR M09 M05: .POP M06: MOV #6003,R0 BR M08 M07: MOV #3405,R0 .POP M08: CALL $ERRA M09: CLR R0 CLR R1 BR M03 M10: ASR R4 BCC M12 M11: ADD R3,R1 - JUMP TO DATA FIELD 1> LINE <(XX)(CR) - JUMP TO DATA FIELD (XX)> Q < ADDITIONALLY, (CR) AFTER ENTRY OF A> LINE < NEW VALUE WILL CAUSE RETURN> Q < TO 'ENTER COMMAND :'; (LF) AFTER> LINE < ENTRY OF A NEW VALUE WILL> LINE < SUBSEQUENTLY STEP TO THE NEXT FIELD.> ENDMES LHM GENMES LDEB CURSOR 20,0 .BYTE EOS .BYTE VERTAB ENDMES LDEB GENMES LUP .BYTE CAD LUY: .BYTE 40,1 LUX: .BYTE 40 LUV: .BLKB ^D17 .BYTE CR,LF ENDMES LUP LAD1: CURSOR 21,0 .BYTE 0 .EVEN .PAGE  ; SAVINGS BLOS E2 ;NO SPACE SAVINGS CMP R0,(PC)+ ;BETTER THAN BEFORE? BEST: .WORD 0 ;'BEST' SAVINGS SO FAR BLOS E2 ;NO MOV R0,BEST ;SAVE NEW 'BEST' SAVINGS, MOV CNT,(PC)+ ;SAVE NO. OF USED: .WORD 0 ; OCCURRENCES INC USED MOV TLL,(PC)+ ;SAVE LENGTH BL: .WORD 0 ;LENGTH OF 'BEST' SO FAR MOV C2TP,(PC)+ ;SAVE START PTR + 1 BB: .WORD 0 ;START PTR + 1 FOR 'BEST' SO FAR E2: .POP R1 ;RESTORE R1 CLR CNT ;RESET COUNT MOV (PC)+,R5 ;GET PTR PTR FLP: .WORD 0 ;PTR TO NEXT LINE PTP-11 ; FORMAT (I.E. JULIAN DATE - 70000.) TO AN ASCII STRING OF ; THE FORM: 18-OCT-73 ; AT ENTRY, R0 CONTAINS THE DATE WORD TO BE CONVERTED, ; AND R2 IS THE DESTINATION POINTER FOR THE STRING. ; ; EXIT: ; ; IF THE DATE WORD WAS VALID: ; R2 POINTS TO THE 1ST CHAR. PAST THE CONVERTED DATE ; ALL OTHER REGISTERS ARE UNCHANGED ; 'C' CONDITION CODE IS CLEAR ; ; IF THE DATE WORD WAS INVALID: ; ALL REGISTERS ARE UNCHANGED ; 'C' CONDITION CODE IS SET ; ; SUBROUTINE: GDATE ; ; FOR ADC R0 BCS M13 ADD R2,R0 M12: ROR R0 ROR R1 DEC R5 BGT M10 RTS PC M13: ADD R2,R0 SEC BR M12 M14: ASR R4 BCC M15 ADD R2,R0 M15: ROR R0 ROR R1 DEC R5 BGT M14 RTS PC .PAGE .GLOBL $ADR ;THREADED MODE FLOATING ADDITION .GLOBL $SBR ;THREADED MODE FLOATING SUBTRACT $SBR: ADD #100000,@SP $ADR: .PUSH R4 .PUSH #0 CLR R2 CLR R3 ASL 6(SP) ROL 4(SP) BISB 5(SP),R3 BEQ A13 ROLB @SP ASL 12(SP) ROL 10(SP) BISB 11(SP),R2 BNE A01 RORB @SP ROR 4(SP) ROR .SBTTL INSERT OPERATOR COMMENT FUNCTION .GLOBL CPNTR,CDAT,CCNT,CBUF,CBUFE GETCOM: TST CCNT ;CAN WE INSERT A COMMENT? BEQ 1$ ;MAYBE MOV #NOCOM,R0 ;SET MESSAGE POINTER BR 2$ ;WRITE IT & RESTART 1$: MOV #CBUFE,R0 ;COMPUTE MAXIMUM SUB CPNTR,R0 ; LINE LENGTH CMP R0,#^D2 ;ANY ROOM? BHI 3$ ;YES MOV #NROOM,R0 ;SET MESSAAGE POINTER 2$: .WRITE #OPOUT,R0 ;WRITE MESSAGE JMP WAIT ;GO WAIT & RESTART 3$: MOV R0,COMBH ;SET LENGTH IN BUFFER HEADER R AFTER TEST SS INC R1 ;STEP END OF TEST SS UP ONE MOV C2TP,R4 ;GET 1ST OF NEXT TENTATIVE SS CMP R1,@R5 ;STILL ON THIS LINE? BLOS GOT1 ;YES NXSL: MOV (R5)+,R1 ;GET NEXT LINE PTR BNE OK1 ;NOT AT END YET TST (PC)+ ;1ST TIME AT END? FLG1: .WORD 0 BNE NOMORE ;NO: END OF THIS PASS INC FLG1 ;SET FLAG INC TLL ;INC TEST SS LENGTH MOV #LLST,R5 ;RESET PTRS PTR BR NXSL ;GO LOOK FOR NEW TEST SS OK1: MOV R1,R4 ;DUP. 1ST CHAR. PTR ADD TLL,R1 ;PTR TO END OF TEST SS CMP R1,@R5M OF CALL: JSR PC,GDATE ; ; ACTION: ; ; GDATE OPERATES THE SAME AS C.B2DA, EXCEPT THAT IT USES ; THE CURRENT SYSTEM DATE WORD FOR THE CONVERSION. ; ; EXIT: ; ; SAME AS FOR C.B2DA EXCEPT THAT R0 WILL CONTAIN THE ; CURRENT SYSTEM DATE WORD. ; ;- GDATE: MOV DATE,R0 ;GET SYSTEM DATE C.B2DA: JSR R5,S.RSAV ;SAVE REGISTERS MOV #^D69,R1 ;COMPUTE YEAR AND DAY OF 1$: INC R1 ; YEAR BY DIVIDING SUB #^D1000,R0 ; BY 1000. BHI 1$ BEQ 7$ ;INVALID DATE ERROR ADD #^D1000-^D365,R0 ;R0= DAY  6(SP) MOV 4(SP),10(SP) MOV 6(SP),12(SP) BR A13 A01: ROLB 1(SP) MOVB #1,11(SP) MOVB #1,5(SP) SUB R3,R2 BGT A02 MOV 10(SP),R0 MOV 12(SP),R1 BR A03 A02: ADD R2,R3 MOV 4(SP),R0 MOV 6(SP),R1 MOV 10(SP),4(SP) MOV 12(SP),6(SP) SWAB @SP NEG R2 A03: CMPB 1(SP),@SP BEQ A04 NEG R1 ADC R0 NEG R0 A04: TST R2 BEQ A10 CMP #177747,R2 BLE A05 MOV 4(SP),R0 MOV 6(SP),R1 BR A11 A05: CMP #177770,R2 BLE A09 CLR R4 TST R0 BPL A06 COM R4 A06: CMP #177760,R2 B MOV CPNTR,COMBP ;SET BUFFER POINTER IN BUFFER HEADER 4$: .WRITE #OPOUT,#RQCOM ;GIVE INSTRUCTIONS .WAIT #OPOUT .READ #OPIN,#COMBH ;READ A LINE .WAIT #OPIN BITB #1,COMBS ;VALID LINE? BEQ 5$ ;YES .WRITE #OPOUT,#LNGL ;WRITE MESSAGE BR 4$ ;ASK FOR ANOTHER 5$: CMP COMBC,#2 ;ANYTHING THERE? BHI 6$ ;YES RETURN ;ABORT IF BLANK LINE 6$: .WRITE #OPOUT,#COMBH ;WRITE LINE BACK TO OPERATOR CALL REQY,CRCTM ;ASK IF CORRECT BEQ 7$ ;YES .WRITE #OPOUT,#CMERS ;WRITE 'ERASED' MESSAGE BR 4$  ;LINE LONG ENOUGH? BHI NXSL ;NO: TRY NEXT LINE CLR FLG1 ;CLEAR THE STUPID FLAG MOV R5,FLP ;SAVE NEXT LINE PTR GOT1: MOV @R5,R2 ;SET 'NO-MORE-CHANCE' PTR SUB TLL,R2 MOV R1,R3 ;R3 PNTS TO 1ST CHAR. AFTER ; 1ST OCCURRENCE OF NEW SS MOVB (R4)+,R0 ;1ST CHAR. OF NEW SS MOV R4,C2TP ;2ND CHAR. PTR MOV R5,TLP ;SAVE NEXT PTR CLR CNT ;RESET COUNT BR F1 ;GO LOOK FOR IT NOMORE: MOV BEST,R0 ;GET 'BEST' SAVINGS BNE 1$ JMP DONE 1$: DEC BB ;BB NOW PNTS TO 1ST CHAR. ; OF YEAR-365. BIT #3,R1 ;LEAP YEAR? BNE 2$ ;NO: O.K. DEC R0 ;R0= DAY OF YEAR-366. FOR LEAP YEAR 2$: TST R0 ;ERROR IF GREATER THAN BGT 7$ ; ZERO AT THIS POINT MOV #MTABE,R3 ;SET TABLE POINTER 3$: TST R0 ;DAY GREATER THAN ZERO YET? BGT 5$ ;YES: FINISHED ADD -(R3),R0 ;ADD DAYS IN MONTH CMP -(R3),FEB ;AT FEB. YET? BNE 3$ ;NO: CONTINUE ... BIT #3,R1 ;LEAP YEAR? BNE 4$ ;NO INC R0 ;ADD ONE MORE FOR FEB. 4$: TST R0 ;DAY GREATER THAN ZERO NOW? BGT 5$ ;YES: FINISHED ADD -LT A07 MOV R0,R1 MOV R4,R0 ADD #20,R2 BEQ A10 A07: CMP #177770,R2 BLE A09 ADD #20,R2 A08: ASL R1 ROL R0 ROL R4 DEC R2 BGT A08 MOV R0,R1 MOV R4,R0 BR A10 A09: ASR R0 ROR R1 INC R2 BLT A09 A10: ADD 4(SP),R0 ADD 6(SP),R1 ADC R0 CMPB 1(SP),@SP BNE A15 BIT R0,#1000 BEQ A11 ASR R0 ROR R1 INC R3 A11: SWAB R3 BNE A14 BISB R0,R3 ROR @SP ROR R3 ROR R1 ADC R1 ADC R3 BVS A14 BCS A14 A12: MOV R3,10(SP) MOV R1,12(SP) A13: .POP .POP R4 CMP  7$: ADD COMBC,(PC)+ ;UPDATE BUFFER POSITION POINTER CPNTR: .WORD CBUF ;'CURRENT' BUFFER POINTER RETURN .PAGE .SBTTL ALARM MESSAGE INHIBIT FUNCTION NLIN= 17 ;NUMBER OF LINES / GROUP AMI: MOV #D1.LL,R5 ;INIT. INDEX MOV #NLIN+'A,TCH ;SET '1ST INVALID CHARACTER' NXTPAG: CALL CLEAR ;CLEAR SCREEN MOVB #'A,IDCH1 ;SET UP ID CHARACTER MOV R5,FBASE ;SET BASE FOR THIS GROUP CMP R5,#D1.UL-<2*NLIN> ;AT LEAST ENTRYS LEFT? BLOS SUP ;YES NEG R5 ;COMPUTE ADD #D1.UL,R5 ; DIFFEREN OF SUBSTRING ADD R0,(PC)+ ;ACCUMALATE SAVINGS TSAVE: .WORD 0 SUB R0,(PC)+ ;COMPUTE PRESENT CORE REQUIREMENT FSPACE: .WORD 0 MOV #SLN,R1 .BIN2D R1,BL ;CONVERT LENGTH MOVB #40,(R1)+ MOVB #'L,(R1)+ MOVB #'=,(R1)+ CMPB @R1,#'0 BNE 1$ MOVB #40,@R1 1$: MOV #SUSE,R1 .BIN2D R1,USED ;CONVERT TIMES USED MOVB #'U,(R1)+ MOVB #'=,(R1)+ 2$: CMPB @R1,#'0 BNE 3$ MOVB #40,(R1)+ CMP R1,#SUSE+4 BLO 2$ 3$: .BIN2D #SSSAVE,R0 ;CONVERT INCREMENTAL SAVINGS MOVB #'=,SSSAVE .BIN2D #FSP(R3),R0 ;ADD DAYS IN JANUARY BLE 7$ ;INVALID DATE ERROR TST -(R3) ;BUMP TO RAD50 JAN. 5$: CALL CVT2 ;CONVERT DAY MOVB #'-,(R2)+ ;OUTPUT HYPHEN .RADUP R2,@R3 ;CONVERT MONTH ADD #3,R2 ;BUMP DEST. POINTER MOVB #'-,(R2)+ ;OUTPUT HYPHEN CMP R1,#^D100 ;INSURE YEAR LESS BLO 6$ ; THAN 100. SUB #^D100,R1 6$: MOV R1,R0 ;CONVERT ... CALL CVT2 ; ... YEAR MOV R2,4(SP) ;PUT R2 IN SAVED R2 ; POSITION ON STACK JSR R5,S.RRES ;RESTORE REGISTERS CCC ;CLEAR CODES TO INDICATE O.K.(SP)+,(SP)+ JMP @(R4)+ A14: MOV #1003,R0 CALL $ERRA BR A13 A15: TST R0 BGT A16 BEQ A17 NEG R0 NEG R1 SBC R0 SWAB @SP A16: BIT R0,#400 BNE A18 DEC R3 ASL R1 ROL R0 BR A16 A17: TST R1 BEQ A19 SWAB R1 BISB R1,R0 CLRB R1 SUB #10,R3 BR A16 A18: TST R3 BGT A11 MOV #1005,R0 CALL $ERRA CLR R1 A19: CLR R3 BR A12 .PAGE .GLOBL $IR ;INTEGER TO REAL CONVERSION $IR: .PUSH MOV 2(SP),R1 BGT 1$ BEQ 4$ NEG R1 1$: ROL -(SP) MOV #220,R2 CLRB 4(SP) 2T ASR R5 ; '1ST INVALID CHARACTER' ADD #'A,R5 MOV R5,TCH ;STORE '1ST INVALID CHARACTER' MOV FBASE,R5 ;RESET TO BASE OF GROUP SUP: MOV #PRSTR1,R1 ;SET POINTER TO VARIABLE STRING CALL FS1 ;FILL IN CODE LETTERS CALL SETP ;SETUP FOR OUTPUT 1$: MOV #VSTR,R1 ;SET SOURCE POINTER CALL EXPAND ;MOV STRING INTO BUFFER MOV D1$OMS(R5),R1 ;SET MESSAGE POINTER CALL ETWMES ;MOVE AND WRITE LINE INCB IDCH1 ;BUMP ID CHARACTER TST (R5)+ ;BUMP INDEX CMPB IDCH1,TCH ;LAST IN THIS GROUP? BLO C,FSPACE ;CONVERT PRESENT CORE REQUIREMENTS MOV #CPRCNT,R5 ;SET DEST. PNTR CALL PERCNT ;MOVE IN PERCENTAGE SAVINGS MOV (PC)+,R0 ;GET SS NUMBER SSNUM: .WORD 0 ;CURRENT SUBSTRING NUMBER MOV R0,(PC)+ ;FORM REFERENCE BYTE SREF: .WORD 0 BIS #200,SREF .BIN2O #TMP,R0 ;CONVERT TO OCTAL MOV #TMP+3,R0 ;MOVE INTO OUTPUT LINE MOV #SSN1,R1 MOVB (R0)+,(R1)+ MOVB (R0)+,(R1)+ MOVB (R0)+,(R1)+ MOV BB,R0 ;GET START PTR MOV #SS,R1 ;SET DEST. PTR MOV BL,R3 ;GET LENGTH 1$: MOVB (R0)+,(R1)+ RETURN ;RETURN 7$: JSR R5,S.RRES ;RESTORE REGISTERS SEC ;INDICATE ERROR: C=1 RETURN ;RETURN .PAGE .SBTTL MONTH TABLE FOR DATE CONVERSIONS .MACRO GENMON MONTH,DAYS .RAD50 \MONTH\ .WORD DAYS .ENDM GENMON MTAB: GENMON JAN,<^D31> FEB: GENMON FEB,<^D28> GENMON MAR,<^D31> GENMON APR,<^D30> GENMON MAY,<^D31> GENMON JUN,<^D30> GENMON JUL,<^D31> GENMON AUG,<^D31> GENMON SEP,<^D30> GENMON OCT,<^D31> GENMON NOV,<^D30> GENMON DEC,<^D31> MTABE: .PAGE .GLOBL INCD$: ROL R1 BCS 3$ DEC R2 BR 2$ 3$: MOVB R1,5(SP) CLRB R1 BISB R2,R1 SWAB R1 ROR (SP)+ ROR R1 RORB 3(SP) MOV R1,@SP 4$: JMP @(R4)+ $ERRA: RETURN ;!!!!!!!! .END SUP ;NO...CONTINUE .WRITE #OPOUT,#FMES1 ;WRITE INSTRUCTIONS 2$: CALL REQ,FPRE ;GET INPUT BNE 3$ ;SOMETHING WAS TYPED MOV FBASE,R5 ;GET OLD BASE ADD #2*NLIN,R5 ;BUMP TO NEXT GROUP CMP R5,#D1.UL ;FINISHED YET? BLO NXTPAG ;NO RETURN ;FINISHED 3$: CLRB R3 ;SET FOR ENABLE CMPB (R1)+,#'E ;ENABLE? BEQ 5$ ;YES DECB R3 ;CHANGE NEW BYTE CMPB -1(R1),#'D ;DISABLE? BEQ 5$ ;YES 4$: .WRITE #OPOUT,#FMES2 ;WRITE ERROR MESSAGE BR 2$ ;REQUEST INPUT AGAIN 5$: CALL G.NX ;GET NEXT INPUT ;MOVE SUBSTRING ... DEC R3 BGT 1$ MOV R1,SSE ;SAVE END PTR MOV R1,R5 ;SET END PTR MOV #SS,R1 ; & SRC PTR. CALL SUBF ;CONVERT IT .WRITE #MLB,#OBFH ;WRITE SUBSTRING LINE .WRITE #MLB,#SSL1 ;WRITE INFORMATION LINE .WAIT #MLB TST LLB+6 ;CREATING LOG? BEQ SQUISH ;NO .WRITE #LLB,#OBFH ;WRITE SUBSTRING LINE .WRITE #LLB,#SSL1 ;WRITE INFORMATION LINE .WAIT #LLB SQUISH: MOV BB,R4 ;GET SS PTR MOV R4,R1 ;SET DEST. PTR INC R1 ADD BL,R4 ;R4 PNTS PAST 1ST OCCURRENCE MOV #AT,DECDAT .GLOBL FRSTMN,INCMON,DECMON ;+ ; GENERAL DATE-WORD MANIPULATING ROUTINES: ; ; INCDAT - ADDS ONE TO A DATE WORD ; DECDAT - SUBTRACTS ONE FROM A DATE WORD ; FRSTMN - STEPS A DATE WORD TO THE FIRST ; DAY OF SAME MONTH ; INCMON - STEPS A DATE WORD TO THE FIRST ; DAY OF THE NEXT MONTH ; DECMON - STEPS A DATE WORD TO THE FIRST ; DAY OF THE PREVIOUS MONTH ; ; FORM OF CALL: JSR PC,XXXXXX ; ; ENTRY: ; ; R0 SHOULD CONTAIN THE DATE WORD TO BE ACTED UPON ; ; EXIT: ; ; R0 WILL  .TITLE INREP - INTERNAL REPORTS TASK .GLOBL INREPH ;INREP TASK HEADER .GLOBL CV,CM,SCVRT .GLOBL CVT2,CVT2S .GLOBL C.B2DA,C.DA2B .GLOBL DIVIDE .GLOBL EXPAND .GLOBL GDATE,GTIME .GLOBL G.NX .GLOBL MULT,MULTR .GLOBL SETIME .GLOBL DATE .GLOBL AA.LIM .GLOBL A.UL,A1.LL,A1.UL .GLOBL D1.LL,D1.UL .GLOBL DO.LIM .GLOBL AG$MF,AG$OV,AG$DAT,AG$HR,AG$MIN .GLOBL A$ID,A$UNIT .GLOBL A1$OPT,A1$OLO,A1$OHI .GLOBL D1$OMS .GLOBL O$ID,O$TIM,O$MTIM .GLOBL ONSTT .MCALL .PARAM, CHARACTER CMPB @R1,#'A ;VALID? BLO 4$ ;NO CMPB @R1,TCH ;VALID? BHIS 4$ ;NO MOVB (R1)+,R5 ;GET CHARACTER CALL G.NX ; CHECK FOR END OF LINE BNE 4$ ;NO: ERROR MOV R5,R4 ;STORE ID CHARACTER MOVB R4,IDCH2 ; AND ADD #40-'A,R4 ;COMPUTE CURSOR ADDRESS MOVB R4,YAD1 ; CODE AND STORE IT SUB #'A,R5 ;COMPUTE CORRECT ASL R5 ; INDEX ADD FBASE,R5 TSTB R3 ;DISABLE? BLT 7$ ;YES...STORE IT TSTB AG$MF(R5) ;ALREADY ENABLED? BGE 8$ ;YES...DON'T CHANGE IT 7$: MOVB R3,AG$MF(LLST,R5 ;SET PTRS PTR 1$: CMP (R5)+,R4 ;FOUND CORRECT LINE YET? BLO 1$ ;NO TST -(R5) ;R5 NOW PNTS TO EOL PTR MOV @R5,R2 ;GET EOL PTR SUB BL,R2 ;SET 'NO-MORE-CHANCE' PTR MOV R5,NP ;SAVE NEXT PTR MOVB SS,R0 ;GET 1ST CHAR. OF SS BR STRT1 ;PROCEED TO CONDENSE S1: MOV R3,R4 ;SET START POINT S2: CMP R4,R2 ;PAST 'NO-MORE-CHANCE' POINT? BHI S4 ;YES MOVB @R4,(R1)+ ;MOVE A CHARACTER CMPB (R4)+,R0 ;1ST CHAR. MATCH? BNE S2 ;NO: CONTINUE MOVING MOV R4,R3 ;SAVE NEXT START PTR CONTAIN THE MODIFIED DATE WORD ; ALL OTHER REGISTERS WILL BE UNCHANGED ; ;- INCDAT: .PUSH R2 ;SAVE R2 MOV #SCRTCH,R2 ;SET DEST PTR TO SCRATCH AREA INC R0 ;STEP DATE AHEAD ONE DAY CALL C.B2DA ;CHECK IT BCC 1$ ;O.K. ADD #^D1000-^D365,R0 ;BUMP TO 1-JAN- BIT #1,R0 ;O.K. NOW? BNE 1$ ;YES DEC R0 ;PREVIOUS YEAR WAS LEAP YEAR, ; SO FIX DATE 1$: .POP R2 ;RESTORE R2 RETURN DECDAT: .PUSH R2 ;SAVE R2 MOV #SCRTCH,R2 ;SET DEST PTR TO SCRATCH AREA DEC R0 ;STEP D.EXIT .MCALL .INIT,.OPEN,.WRITE,.WAIT,.CLOSE,.RLSE .MCALL .PUSH,.POP,CALL,RETURN,RETRN5 .MCALL Q,LIN,LINE,GENMES,ENDMES .PARAM STKSIZ= ^D32 ;STACK SIZE IN WORDS SPACE= 40 ;SPACE CNTRLO= 'O-100 ;CONTROL-O (FORCES OUTPUT ON) CR= 15 ;CARRIAGE RETURN LF= 12 ;LINE FEED TAB= 11 ;HORIZONTAL TAB FORM= 14 ;FORM FEED LINES= ^D57 ;NUMBER OF LINES/PAGE USED ON LC30 ; (NOT INCLUDING HEADING) OBSIZ= ^D102 ;GEN. OUTPUT BUFFER SIZE .PAGE .SBTTL MAIN PART OF PROGRAM LOSTK: .WORDR5) ;STORE NEW FLAG 8$: MOV #PRSTR2,R1 ;SET POINTER TO VARIABLE STRING CALL FS1 ;FILL IN CODE LETTERS .WRITE #OPOUT,#FMES3 ;WRITE UPDATE ON SCREEN TSTB R3 ;DID WE ENABLE IT? BLT 2$ ;NO CLRB AG$OV(R5) ;CAUSE MESSAGE IF NOW IN ALARM BR 2$ ;ASK AGAIN FS1: MOVB #SPACE,@R1 ;PUT IN TWO MOVB #SPACE,1(R1) ; SPACES CMPB AG$OV(R5),#ONSTT ;NOW IN ALARM ? BNE 1$ ;NO MOVB #'A,1(R1) ;IN ALARM: PUT IN 'A' 1$: TSTB AG$MF(R5) ;DISABLED? BGE 2$ ;NO MOVB #'D,@R1 ;DISABLD: PUT IN 'D' 2$MOV #SS+1,R5 ;PTR TO 2ND CHAR. OF SS S3: CMPB (R4)+,(R5)+ ;NEXT CHAR. MATCH? BNE S1 ;NO: CONTINUE MOVING & LOOKING CMP R5,(PC)+ ;AT END OF SS YET? SSE: .WORD 0 ;PTR TO END OF SS BLO S3 ;NO: COMPARE NEXT CHAR. STRT1: MOVB SREF,-1(R1) ;STORE SS REF BYTE BR S2 ;CONTINUE MOVING & LOOKING S4: MOV (PC)+,R5 ;GET NEXT PTR NP: .WORD 0 S5: CMP R4,@R5 ;AT END OF LINE YET? BHIS S6 ;YES: GO TO NEXT LINE MOVB (R4)+,(R1)+ ;MOVE ANOTHER CHAR. BR S5 ;LOOP S6: MOV R1,(R5)+ ;STORE NEW LINE PTR ATE BACK ONE DAY CALL C.B2DA ;CHECK IT BCC 1$ ;O.K. SUB #^D1000-^D366,R0 ;WE CROSSED A YEAR ... CALL C.B2DA ; SO FIX IT UP ... BCC 1$ ;O.K. DEC R0 ;NEED ONE MORE BACK 1$: .POP R2 ;RESTORE R2 RETURN FRSTMN: .PUSH R2 ;SAVE R2 .PUSH R1 ; AND R1 SUB #^D10,SP ;RESERVE STACK SPACE MOV SP,R2 ;SET DEST PTR MOV R2,R1 ;AND SRC FOR LATER INC R1 CALL C.B2DA ;CONVERT TO ASCII CLRB (R2)+ ;TERMINATE THE STRING MOVB #'1,@R1 ;CHANGE TO 1ST OF MONTH CALL C.DA2B ;CONVERT T 0 ;STACK CHECK WORD .BLKW STKSIZ ;STACK SPACE BEG: START: MOV PRM,R2 ;GET PASSED PARAMETER BNE 2$ ;NON-ZERO: O.K. MOV PSAV,R2 ;RESTART: GET SAVED PARAMETER BGE GOTP ;O.K. 1$: .EXIT ;INVALID PARAMETER...EXIT 2$: BIT #1,R2 ;IS IT VALID? BEQ 1$ ;NO DEC R2 ;CLEAR BIT 0 BLT 1$ ;INVALID CMP R2,#PRMCHK ;IS IT VALID? BHIS 1$ ;NO MOV R2,(PC)+ ;SAVE IN CASE OF RESTART PSAV: .WORD -1 GOTP: .INIT #LBLK ;.INIT DATASET .OPEN #LBLK,#FNBLK ; AND OPEN .PUSH #FIN ;PUSH RETURN : RETURN FBASE: .WORD 0 TCH: .BYTE 0 .EVEN .PAGE .SBTTL EDIT ANALOG LIMITS FUNCTION AAL: MOV #A1.LL,R5 ;INIT. INDEX CALL CLEAR ;CLEAR SCREEN 1$: CMP R5,#A1.UL ;FINISHED WITH LIMIT ALARMS? BHIS 4$ ;YES: FINISHED CALL WALIM ;WRITE VALUE & LIMITS CALL REQY,CHPRE ;ASK IF CHANGE NEEDED BEQ 2$ ;YES TST (R5)+ ;ADVANCE INDEX BR 1$ ;LOOP 2$: CALL REQ,RLLM ;REQUEST LOW LIMIT BEQ 3$ ;NO INPUT CALL GVN ;GET NUMBER BVS 2$ ;IF INVALID, ASK AGAIN MOV R0,A1$OLO(R5) ;STORE NEWIN LIST MOV @R5,R2 ;GET EOL PNTR BEQ S7 ;FINISHED SUB BL,R2 ;FORM 'NO-MORE-CHANCE' PTR MOV R5,NP ;SAVE NEXT PTR BR S2 ;GO MOVE & LOOK S7: MOV #SS,R0 ;SET SRC PTR FOR SS MOV BL,R2 ;GET LENGTH OF SS 1$: MOVB (R0)+,(R1)+ ;MOVE NEW SS TO END OF TEXT DEC R2 BGT 1$ MOV R1,(R5)+ ;SAVE EOL PTR IN LIST CLR @R5 ;TERMINATE PTR LIST INC SSNUM ;STEP SUBSTRING NUMBER CMP SSNUM,#^D128 ;REACHED MAX. NO. YET? BHIS DONE ;YES: ALL FINISHED JMP MLOOP ;GO DO ANOTHER PASS DONE: MOVO BINARY ADD #^D10,SP ;RESET ORIGINAL SP .POP R1 ;RESTORE R1 .POP R2 ; AND R2 RETURN INCMON: CALL FRSTMN ;GO TO 1ST OF SAME MONTH ADD #^D30,R0 ;STEP TO SOMEWHERE CALL INCDAT ; IN NEXT MONTH CALL FRSTMN ;NOW GET 1ST OF NEXT MONTH RETURN DECMON: CALL FRSTMN ;GO TO 1ST OF SAME MONTH CALL DECDAT ;BACK UP TO PREVIOUS MONTH CALL FRSTMN ;GO TO 1ST OF PREVIOUS MONTH RETURN SCRTCH: .BLKB ^D10 ;SCRATCH CONVERSION AREA .EVEN .PAGE .SBTTL MATH ROUTINES .GLOBL MULTR ADDRESS .PUSH CREPD(R2) ; AND ROUTINE ADDRESS MOV HDGL(R2),R1 ;SET SOURCE FOR HEADING MOV #HDNGP,R2 ;SET DESTINATION POINTER CALL EXPAND ;MOVE IN HEADING 1$: MOVB #SPACE,(R2)+ ;'TAB' .... CMP R2,#HDNGP+^D40 BLO 1$ CALL GDATE ;PUT IN DATE MOVB #',,(R2)+ MOVB #SPACE,(R2)+ CALL GTIME ; AND TIME MOV #PGS,R1 CALL EXPAND ; AND 'PAGE 0' MOV R2,PNU ;SAVE POINTER TO DEC PNU ; PAGE NUMBER MOVB #CR,(R2)+ MOVB #LF,(R2)+ MOVB #LF,(R2)+ SUB #HDNGB,R2 ;COMPUTE BYTE COUNT  LOW LIMIT 3$: CALL REQ,RHLM ;REQUEST HIGH LIMIT BEQ 1$ ;NO INPUT CALL GVN ;GET NUMBER BVS 3$ ;IF INVALID, ASK AGAIN MOV R0,A1$OHI(R5) ;STORE NEW HIGH LIMIT BR 1$ ;GO WRITE VALUES AGAIN 4$: RETURN GVN: CALL G.VNUM ;CONVERT PROCESS VALUE BCS 1$ ;NO NUMBER BVS 1$ ;OVERFLOW CALL G.NX ;END OF LINE? BEQ 2$ ;YES: O.K. 1$: CALL BADLIN ;WRITE ERROR MESSAGE SEV ;INDICATE ERROR 2$: RETURN .PAGE .SBTTL MAINT. INTERVAL / OPTIME RESET ROUTINE NLIN2= ^D12 ;NUMBER OF LINES / ORIGSP,R0 ;GET ORIGINAL SPACE REQ. SUB TSAVE,R0 ;SUB SAVINGS .BIN2D #NSPC,R0 .BIN2O #NSPCO,R0 MOV #TPRCNT,R5 ;SET DEST PTR CALL PERCNT ;CONVERT TO PER CENT .WRITE #MLB,#OSPCH .WRITE #MLB,#NSPCH .CLOSE #MLB .RLSE #MLB TST LLB+6 ;CREATING LOG? BEQ 1$ ;NO .WRITE #LLB,#OSPCH .WRITE #LLB,#NSPCH .CLOSE #LLB .RLSE #LLB 1$: .PAGE .SBTTL CREATE SUBSTRINGED FILES P2: .CSI1 #CMDBUF ;RESET CLR CMDBUF ;SET FOR INPUT SPECS. .INIT #OLB ;INIT OUTPUT DATASET MOV OEXT,OFN+ .GLOBL MULT ;+ ; SUBROUTINE: MULTR ; ; FORM OF CALL: JSR PC,MULT ; ; ACTION: ; ; MULTR MULTIPLIES TWO 16-BIT NUMBERS, AND RETURNS THE ; ROUNDED HIGH-ORDER WORD OF THE 32-BIT PRODUCT. ; ; ENTRY: ; ; R1 IS THE MULTIPLIER ; R2 IS THE MULTIPLICAND ; ; EXIT: ; ; R1= THE ROUNDED HIGH-ORDER WORD OF THE 32-BIT PRODUCT ; R2= THE MULTIPLICAND ( UNCHANGED ) ; ALL OTHER REGISTERS ARE UNCHANGED. ; ;- MULTR: .PUSH R0 ;SAVE R0 .PUSH R3 ; AND R3 CALL MULT ;MULTIPLY ROL R0 ;AND  MOV R2,HDNGC ;STORE IT IN HEADER MOV #LINES,LINEC ;INITIALIZE LINE COUNT BR FPAGE ;WRITE HEADING & GO PCHK3: .PUSH #-3 ;PUSH LINES/GROUP BR PCHK PCHK2: .PUSH #-2 ;PUSH LINES/GROUP PCHK: ADD @SP,(PC)+ ;UPDATE LINE COUNT LINEC: .WORD 0 BLT NPAGE ;PAGING NEEDED .POP ;CLEAN STACK CLZ ;INDICATE NO PAGING DONE RETURN NPAGE: ADD #LINES,@SP ;FORM CORRECT LINE COUNT .POP LINEC ; AND STORE IT FPAGE: MOV (PC)+,R0 ;PNTR. TO UNITS PAGE NO. DIGIT PNU: .WORD 0 CMPB @R0,#'9 ;CARRY Y GROUP OPTED: CLR R5 ;INIT. INDEX MOV #NLIN2+'A,(PC)+ ;SET '1ST INVALID CHARACTER' TCH2: .WORD 0 CALL CLEAR ;CLEAR SCREEN .WRITE #OPOUT,#MHED2 ;WRITE HEADING NPAG: .WRITE #OPOUT,#CLPT ;POSITION & CLEAR MOVB #'A,IDCH3 ;SET UP ID CHARACTER MOV R5,(PC)+ ;SET BASE FOR THIS GROUP FBASE2: .WORD 0 CMP R5,#DO.LIM-<2*NLIN2> ;AT LEAST LEFT? BLOS 1$ ;YES NEG R5 ;COMPUTE ADD #DO.LIM,R5 ; DIFFERENT ASR R5 ; '1ST INVALID CHARACTER' ADD #'A,R5 MOV R5,TCH2 ;STORE IT MO4 ;STORE OUTPUT EXTENSION MOV #LLST,R2 ;PTR LIST PTR BR SNF EOF2: .CLOSE #OLB ;CLOSE OUTPUT FILE GNI2: BIT #1,MF ;GOT ANOTHER INPUT BNE EP2 ;NO SNF: .CSI2 #CBLK3 ;CALL CSI2 MOV (SP)+,MF ;SAVE RETURNED WORD TST ILB+6 ;GOT SOMETHING? BEQ GNI2 ;NO...TRY AGAIN MOV #IFN,R0 ;PTR TO INPUT FNBLOCK MOV #OFN,R1 ;PTR TO OUTPUT FNBLOCK MOV (R0)+,(R1)+ ;MOVE FILE MOV (R0)+,(R1)+ ; NAME MOV IEXT,@R0 ;STORE INPUT EXTENSION MOV #DELER1,OFN-4 ;SET ERROR ADDRESS .DELETE #OLB,#OFN ;DELEADC R1 ;ROUND .POP R3 ;RESTORE R3 .POP R0 ; AND R0 RETURN ;RETURN .PAGE ;+ ; SUBROUTINE: DIVIDE ; ; FORM OF CALL: JSR PC,DIVIDE ; ; ACTION: ; ; DIVIDE DIVIDES AN UNSIGNED 32-BIT DIVIDEND BY AN ; UNSIGNED 16-BIT DIVISOR. ; ; ENTRY: ; ; R0= THE LOW-ORDER WORD OF THE DIVIDEND ; R1= THE HIGH-ORDER WORD OF THE DIVIDEND ; R2= THE DIVISOR ; ; EXIT: ; ; IF THE DIVISOR (R2) IS NOT HIGHER THAN THE HIGH-ORDER ; WORD OF THE DIVIDEND (R1), ALL REGISTERS REMAIN UNCHANGED ; AND TET? BLO 1$ ;NO MOVB #'0,@R0 ;STORE '0' CMPB -(R0),#SPACE ;1ST TIME? BNE 1$ ;NO MOVB #'0,@R0 ;STORE '0' 1$: INCB @R0 ;BUMP DIGIT .WRITE #LBLK,#HDNG ;WRITE HEADING SEZ ;INDICATE PAGING DONE RETURN FIN: .CLOSE #LBLK ;.CLOSE DATASET .RLSE #LBLK ;.RLSE IT MOV #-1,PSAV ;INDICATE FINISHED .EXIT ; DISPATCH LIST CREPD: .WORD ALRM ;CURRENT ALARMS .WORD PVAR ;PROCESS VARIABLES .WORD ALIM ;ANALOG LIMITS .WORD MAINT ;MAINTENANCE LOG PRMCHK= .-CREPD ; HEADING POINTERV FBASE2,R5 ;RESTORE R5 TO BASE 1$: CALL SETP ;SETUP FOR OUTPUT MOV #VSTR2,R1 ;SET SOURCE CALL EXPAND ;MOVE INTO LINE CALL MOSUB ;BUILD LINE CALL TWMES ;WRITE LINE INCB IDCH3 ;BUMP ID CHARACTER TST (R5)+ ;BUMP INDEX CMPB IDCH3,TCH2 ;LAST IN THIS GROUP? BLO 1$ ;NO: CONTINUE .WRITE #OPOUT,#FMES4 ;WRITE INSTRUCTIONS 2$: CALL REQ,FPRE2 ;GET INPUT BNE 3$ ;SOMETHING WAS ENTERED MOV FBASE2,R5 ;GET OLD BASE ADD #2*NLIN2,R5 ;BUMP TO NEXT GROUP CMP R5,#DO.LIM ;FINISHED YET? BLOTE OUTPUT FILE DELER1: CLR OFN-4 ;RESET ERROR ADDRESS .INIT #ILB ;INIT INPUT DATASET .OPEN #ILB,#IFN ;OPEN INPUT .OPEN #OLB,#OFN ;OPEN OUTPUT OLP1: CALL RCHEK ;READ A LINE BEQ EOF2 ;END OF FILE BCS 1$ ;GOT A SUB CALL .WRITE #OLB,#INBH ;OUTPUT LINE .WAIT #OLB BR OLP1 ;GO READ ANOTHER 1$: CMP R2,SUBPTR ;ALREADY FINISHED MESSAGES? BHIS FER2 ;YES...SOMETHING'S WRONG 2$: CMP R5,R3 ;FAR ENOUGH YET? BLOS 3$ ;YES MOVB -(R5),1(R5) ;MOV CHAR. TO RIGHT BR 2$ ;LOOP 3$: MOVB #';,HE V-CONDITION CODE WILL BE SET; OTHERWISE: ; ; R0= 16-BIT REMAINDER ; R1= 16-BIT QUOTIENT ; R2= 16-BIT DIVISOR (UNCHANGED) ; ALL OTHER REGISTERS ARE UNCHANGED ; V-CONDITION CODE IS CLEAR ; ;- .GLOBL DIVIDE DIVIDE: CMP R1,R2 ;DIVISOR TOO SMALL? BHIS 4$ ;YES: ERROR .PUSH R3 ;SAVE R3 MOV #^D16,R3 ;SET COUNTER 1$: ASL R0 ;DOUBLE SHIFT ... ROL R1 BCS 2$ ;NEED TO SUBTRACT CMP R2,R1 ;CAN WE SUBTRACT? BHI 3$ ;NO 2$: SUB R2,R1 ;SUBTRACT DIVISOR INC R0 ;SET BIT IN DIVIDENDS: HDGL: .WORD ALRMH .WORD PVARH .WORD ALIMH .WORD MAINTH .PAGE .SBTTL CURRENT ALARMS REPORT ALRM: ASFAIL: CLR R5 ;INIT. INDEX 1$: CMP R5,#A.UL ;FINISHED ALL SENSOR FAILS? BHIS ALIMS ;YES CMPB AG$OV(R5),#ONSTT ;IN ALARM ? BNE 2$ ;NO CALL PCHK3 ;CHECK FOR PAGING MOV R5,R4 ;ANALOG POINT INDEX CALL WAALIN ;WRITE 1ST LINE .WRITE #LBLK,#SFAH ;WRITE 2ND LINE 2$: TST (R5)+ ;ADVANCE INDEX BR 1$ ;GO CHECK NEXT ONE ALIMS: CMP R5,#A1.UL ;FINISHED ALL LIMIT ALARMS? BHIS  NPAG ;NO RETURN ;FINISHED 3$: CLR R3 ;INIT. FLAG CMPB (R1)+,#'R ;RESET OPTIME? BEQ 5$ ;YES INC R3 ;SET FLAG DEC R1 ;BUMP PNTR BACK CALL G.NUM ;GET NEW MAINTENANCE INTERVAL BCS 4$ ;ERROR BVC 5$ ;NO ERROR 4$: .WRITE #OPOUT,#FMES2 ;WRITE ERROR MESSAGE BR 2$ ;REQUEST INPUT AGAIN 5$: CALL G.NX ;GET NEXT INPUT CHARACTER CMPB @R1,#'A ;VALID? BLO 4$ ;NO CMPB @R1,TCH2 ;VALID? BHIS 4$ ;NO MOVB (R1)+,R5 ;GET CHARACTER CALL G.NX ;CHECK FOR END OF LINE BNE 4$ ;NOT: @R5 ;PUT IN A ; INC INBC ;ADD ONE TO BYTE COUNT .WRITE #OLB,#INBH ;OUTPUT LINE .WAIT #OLB MOV (R2)+,R1 ;PTR TO BEGINNING OF LINE MOV @R2,R5 ;PTR TO END OF LINE CALL SUBF ;CONVERT IT .WRITE #OLB,#OBFH ;WRITE CONVERTED FORM .WAIT #OLB .WRITE #OLB,#NLH ;WRITE .NLIST CALL CNVRT ;OUTPUT Q & S CALLS .WRITE #OLB,#LIH ;WRITE .LIST BR OLP1 ;LOOP FER2: .CLOSE #OLB .RLSE #OLB .RLSE #ILB MOV #ERM6,R0 BR MSB1 EP2: CMP R2,SUBPTR ;USED ALL MESSAGES? BEQ OSUB ;YES...O.K. M 3$: DEC R3 ;FINISHED? BNE 1$ ;NO MOV R0,R3 ;PUT QUOTIENT AND MOV R1,R0 ; REMAINDER IN MOV R3,R1 ; PROPER REGISTERS .POP R3 ;RESTORE R3 RETURN ;RETURN 4$: SEV ;INDICATE ERROR RETURN ;RETURN .PAGE .SBTTL CHARACTER TEST ROUTINES .GLOBL T.LOD,T.DIG,T.LET ;+ ; SUBROUTINES: T.LOD ; T.DIG ; T.LET ; ; FORM OF CALL: JSR PC,T.XXX ; ; ACTION: ; ; THESE ROUTINES ARE USED TO TEST THE CHARACTER POINTED ; TO BY R1. ; T.LOD TESTS FOR A LETTER OR A DIGIT ; T.DIG TED1CHK ;YES CMPB AG$OV(R5),#ONSTT ;IN ALARM ? BNE 1$ ;NO CALL PCHK3 ;CHECK FOR PAGING MOV A1$OPT(R5),R4 ;ANALOG POINT INDEX CALL WAALIN ;WRITE 1ST LINE CALL WALIM2 ;WRITE 2ND LINE 1$: TST (R5)+ ;ADVANCE INDEX BR ALIMS ;GO CHECK NEXT ONE D1CHK: CMP R5,#D1.UL ;FINISHED ALL DIGITAL ALARMS? BHIS D1FIN ;YES CMPB AG$OV(R5),#ONSTT ;IN ALARM ? BNE 1$ ;NO CALL PCHK2 ;CHECK FOR PAGING CALL SFMES ;SET UP FOR MESSAGE MOV D1$OMS(R5),R1 ;GET DIGITAL STRING PNTR CALL EXPEND ;ERROR MOV R5,R4 ;COMPUTE CURSOR ADD #40+3-'A,R4 ; ADDRESS CODE MOVB R4,YAD2 ; AND STORE IT SUB #'A,R5 ;COMPUTE CORRECT ASL R5 ; INDEX ADD FBASE2,R5 TST R3 ;RESET OPTIME? BNE 6$ ;NO CLR O$TIM(R5) ;RESET OPTIME CLR R1 ;NUMBER TO DISPLAY MOVB #40+^D57,XAD2 ;COLUMN ON SCREEN BR 7$ 6$: MOV R0,R1 ;NEW MAINT. INTERVAL ASL R0 ;MULT. BY 4 ... BCS 4$ ;OVRFLW: ERROR ASL R0 BCS 4$ MOV R0,O$MTIM(R5) ;STORE NEW MAINTENANCE INTERVAL MOV #40+^D64,XAD2 ;COLUMN ON SCREEN 7OV #ERM7,R0 MSB1: JMP MSRS .PAGE .SBTTL CREATE SUBSTRING MODULE OSUB: MOV SNAME,OFN ;SET OUTPUT MOV SNAME+2,OFN+2 ; NAME MOV #DELER2,OFN-4 ;SET ERROR ADDRESS .DELETE #OLB,#OFN ;DELETE OLD FILE DELER2: CLR OFN-4 ;RESET ERROR ADDRESS .OPEN #OLB,#OFN ;OPEN SUBSTRING FILE .WRITE #OLB,#PART1 ;OUTPUT 1ST PART OF FILE .WRITE #OLB,#OSPCH .WRITE #OLB,#NSPCH CLR SSNUM ;INIT SUBSTRING NUMBER MOV SUBPTR,R2 ;PTR TO 1ST SUBSTR PTR SBLP: MOV (R2)+,R1 ;GET START PTR BEQ ALDONE ;FINISHESTS FOR A DIGIT ; T.LET TESTS FOR A LETTER ; ; EXIT: ; ; IF THE TEST RESULT IS TRUE, THE N CONDITION CODE WILL ; BE SET ON EXIT, OTHERWISE IT WILL BE CLEAR. ; ALL REGISTERS ARE UNCHANGED. ; ;- T.LOD: CALL T.LET ;LETTER? BMI T.RTN ;YES: RETURN T.DIG: CMPB #'0-1,@R1 ;OUT OF RANGE? BPL T.RTN ;YES: RETURN WITH N=0 CMPB @R1,#'9+1 ;CHECK OTHER LIMIT BR T.RTN ;RETURN T.LET: CMPB #'A-1,@R1 ;OUT OF RANGE? BPL T.RTN ;YES: RETURN WITH N=0 CMPB @R1,#'Z+1 ;CHECK OTHER LIMIT T.RTN: CLCVZEXPAND & WRITE MESSAGE 1$: TST (R5)+ ;ADVANCE INDEX BR D1CHK ;GO CHECK NEXT ONE D1FIN: RETURN .PAGE .SBTTL PROCESS VARIABLES REPORT PVAR: CLR R4 ;INIT. INDEX 1$: CMP R4,#AA.LIM ;FINISHED? BHIS 2$ ;YES CALL PCHK2 ;CHECK FOR PAGING CALL WAVAL ;WRITE ANALOG VALUE LINE TST (R4)+ ;ADVANCE INDEX BR 1$ ;GO DO NEXT ONE 2$: RETURN WAVAL: CALL SETP ;SETUP FOR MESSAGE MOVB #LF,(R2)+ ;PUT IN LINE FEED BR ACOM WAALIN: CALL SFMES ;PUT IN DATE & TIME ACOM: MOV A$ID(R4),R1 ;G$: MOV #VAR1,R2 ;DEST. PNTR CLR R0 ;SET DEC. POSITION INDICATOR MOV #^D5,R3 ;SET FIELD WIDTH CALL SCVRT ;CONVERT TO ASCII .WRITE #OPOUT,#FMES5 ;WRITE UPDATE ON SCREEN BR 2$ ;GO REQUEST INPUT AGAIN .PAGE .SBTTL COST DATA ROUTINE .GLOBL FLT2AS,AS2FLT .GLOBL CD.LIM,CD$NAM,CD$UNI,CD$Q,CD$C,CD$UC .GLOBL THREAD,$DVR COSTD: .WRITE #OPOUT,#CSTHD ;WRITE HEADING CLR R0 ;INIT. INDEX 1$: CALL CDLIN ;WRITE COST DATA LINE TST (R0)+ ;BUMP INDEX CMP R0,#CD.LIM ;FINISHED ? BLO 1$ D MOV @R2,R5 ;GET END PTR BEQ ALDONE ;FINISHED CALL EXPAND ;EXPAND SUBSTRING .WRITE #OLB,#OBFH ;WRITE IT .WAIT #OLB CALL SUBF ;CONVERT IT .WRITE #OLB,#OBFH ;WRITE IT .WRITE #OLB,#NLH ;WRITE .NLIST .WRITE #OLB,#MRKH ;WRITE MARK CALL CALL CNVRT ;OUTPUT Q & S CALLS .WRITE #OLB,#LIH ;WRITE .LIST INC SSNUM ;BUMP SUBSTRING NUMBER BR SBLP ALDONE: .WRITE #OLB,#LASTM .CLOSE #OLB .RLSE #OLB JMP RS .PAGE .SBTTL MISC. ROUTINES RCHEK: .READ #ILB,#INBH ;READ A LINE .WAI ;CLEAR OTHER CONDITION CODES RETURN ;RETURN WITH N=1 IF TRUE, 0 OTHERWISE .PAGE .GLOBL G.NX ;+ ; SUBROUTINE G.NX ; ; FORM OF CALL: JSR PC,G.NX ; ; ACTION: ; ; TESTS THE CHARACTER POINTED TO BY R1. IF THE CHARACTER ; IS A SPACE, BUMPS R1 TO POINT TO THE FIRST NON-SPACE CHARACTER. ; ; EXIT: ; ; ON EXIT, R1 WILL POINT TO THE FIRST NON-SPACE CHARACTER ; FOUND, AND ALL CONDITION CODES WILL BE CLEARED EXCEPT ; ONE, AS FOLLOWS: ; ; CONDITION CHARACTER ; CODE SET ; ; Z ET ID MESSAGE POINTER CALL EXPAND ;EXPAND ID MESSAGE 1$: MOVB #SPACE,(R2)+ ;PUT IN A SPACE CMP R2,#OBUF+^D52 ;AT COLUMN 52. YET? BLO 1$ ;NO...ADD MORE SPACES MOV R4,R3 ;GET POINT INDEX CALL CV ;CONVERT VALUE TO ASCII MOVB #SPACE,(R2)+ ;PUT IN A SPACE MOV A$UNIT(R4),R1 ;GET 'UNITS' STRING POINTER JMP EXPEND ;EXPAND, END LINE, WRITE IT & RETURN .PAGE .SBTTL ANALOG LIMITS REPORT ALIM: MOV #A1.LL,R5 ;INIT. INDEX 1$: CMP R5,#A1.UL ;FINISHED WITH HIGH/LOW? BHIS 2$ ;YES: RETURN ;NO: DO ANOTHER 2$: CALL REQ,CDR ;REQUEST ID BNE 3$ ;NON-BLANK RESPONSE RETURN ;FINISHED 3$: MOVB (R1)+,R0 ;GET CHARACTER CALL G.NX ;EOL ? BEQ 5$ ;YES: O.K. 4$: .WRITE #OPOUT,#CDE1 ;WRITE ERROR MESSAGE BR 2$ ;REQUEST ID AGAIN 5$: SUB #'A,R0 ;CHANGE TO ... ASL R0 ; ... INDEX CMP R0,#CD.LIM ;VALID ? BHIS 4$ ;NO: ENTRY ERROR .WRITE #OPOUT,#CDEE ;ERASE ERROR LINE IF NEEDED ; GET QUANTITY & COST : ; FORM REQUEST LINE FOR QUANTITY : CALL SETP ;SETUP FOR OUTPUT MOV #CDEN1,T #ILB ; AND WAIT TSTB INBS ;CHECK STATUS BNE 6$ ;NOT O.K. MOV #INBB,R4 ;BUF PNTR MOV R4,R5 ADD INBC,R5 ;END PNTR CLRB @R5 ;NULL TERMINATOR 1$: CMP R4,R5 ;AT OR PAST END? BHIS 3$ ;YES CMPB (R4)+,#'S BEQ 4$ 2$: CMPB -1(R4),#'; BNE 1$ 3$: CCC ;NO SB$ CALL RETURN 4$: MOV R4,R3 DEC R3 CMPB (R4)+,#'B BNE 2$ CMPB (R4)+,#'$ BNE 2$ 5$: CMPB (R4)+,#40 BEQ 5$ CMPB -1(R4),#11 BEQ 5$ CMPB -1(R4),#'< BNE 3$ CCC SEC ;SB$ LINE RETURN 6$: .CLOSE #ILB .RLSENULL ( END OF LINE ) ; V LETTER ; N DIGIT ; C OTHER THAN ABOVE ; ; ALL REGISTERS EXCEPT R1 ARE UNCHANGED. ; ;- SPACE= 40 ;ASCII SPACE TAB= 11 ;ASCII TAB G.NX: CMPB (R1)+,#SPACE ;TEST FOR SPACE BEQ G.NX ;IGNORE SPACE CMPB -1(R1),#TAB ;TEST FOR TAB BEQ G.NX ;IGNORE TAB TSTB -(R1) ;RESET POINTER AND TEST BEQ 1$ ;NULL: RET. WITH Z=1 CALL T.DIG ;TEST FOR DIGIT BMI 1$ ;DIGIT: RET. WITH N=1 CALL T.LET ;TEST FOR LETTER BMI 2$ ;LETTER: FIX CC'S SEC ;OTHER: RET. WITH  CALL PCHK3 ;CHECK FOR PAGING CALL WALIM ;WRITE VALUE & LIMITS TST (R5)+ ;ADVANCE INDEX BR 1$ ;GO DO NEXT ONE 2$: RETURN WALIM: MOV A1$OPT(R5),R4 ;GET ANALOG POINT INDEX CALL WAVAL ;WRITE ANALOG VALUE LINE WALIM2: MOV R4,R3 ;SET POINT INDEX MOV #VS2,R2 ;CONVERT LOW MOV A1$OLO(R5),R1 ; LIMIT TO CALL CM ; ASCII MOV #VS3,R2 ;CONVERT HIGH MOV A1$OHI(R5),R1 ; LIMIT TO CALL CM ; ASCII CALL SETP ;SETUP TO WRITE LINE MOV #NAM,R1 ;SET SOURCE POINTER JMP EXPEND ;MOVE R1 CALL EXPAND MOV CD$UNI(R0),R1 ;GET UNITS STRING POINTER CALL EXPAND MOV #CDEN2,R1 CALL EXPAND MOV CD$NAM(R0),R1 ;GET NAME STRING POINTER CALL EXPAND MOV #CDEN3,R1 CALL ETPRE ;MOVE, INSERT VT, & SET B.C. CALL CDGNUM ;REQUEST & GET VALID NUMBER MOV R4,TQ ;SAVE ... MOV R5,TQ+2 ; ... NUMBER ; FORM REQUEST LINE FOR COST : CALL SETP ;SETUP FOR OUTPUT MOV #CDEN4,R1 CALL EXPAND .PUSH #8. ;PUSH FIELD WIDTH .PUSH #0 ;PUSH NO. PLACES PAST DECIMAL CALL FLT2AS ;CONVERT  #ILB CMPB INBS,#100 ;EOF? BNE 7$ ;NO...ERROR CCC SEZ ;END OF FILE RETURN 7$: MOV #ERM4,R0 JMP MSRS .PAGE ;+ ; SUBROUTINE CNVRT ; ; CHANGES A LINE TO Q AND S CALLS, AND OUTPUTS IT ; ; ENTER WITH START PNTR IN R1 AND END PNTR IN R5 ;- CNVRT: .PUSH R1 ;SAVE R1 1$: CMP R1,R5 ;DONE? BHIS 6$ ;YES MOV #OBF,R3 ;SET DEST. PNTR TSTB @R1 ;ASCII? BPL 3$ ;YES MOVB #'S,(R3)+ MOVB #40,(R3)+ MOVB #'<,(R3)+ 2$: MOVB (R1)+,R0 ;GET SS REF BYTE CALL SCV ;CONVERT SS REF TO C=1 1$: RETURN ;RETURN 2$: CCC ;LETTER EXIT: SEV ; RET. WITH V=1 RETURN ;RETURN .PAGE .SBTTL DECIMAL ASCII TO BINARY CONVERSIONS .GLOBL G.NUM .GLOBL G.FNUM ;+ ; SUBROUTINES G.NUM ; G.FNUM ; ; FORM OF CALL: JSR PC,G.NUM ; JSR PC,G.FNUM ; ; ACTION: ; ; G.NUM CONVERTS A POSITIVE INTEGER TO BINARY. ; G.FNUM CONVERTS A SIGNED "REAL" NUMBER TO BINARY. ; ; EACH ROUTINE STARTS AT THE CHARACTER POINTED TO BY R1 ; AND LOOKS FOR A VALID NUMBER. ; FOR ROUTINE G.FNUM, THSTRING IN, WRITE IT, & RETURN .PAGE .SBTTL MAINTENANCE LOG MAINT: .WRITE #LBLK,#MHED2 ;WRITE 2ND LINE OF HEADING SUB #3,LINEC ;UPDATE LINE COUNT CLR R5 ;INIT. INDEX 1$: CMP R5,#DO.LIM ;FINISHED? BHIS 5$ ;YES CALL PCHK2 ;CHECK FOR PAGING BNE 2$ ;NO PAGING DONE .WRITE #LBLK,#MHED2 ;WRITE 2ND LINE OF HEADING SUB #3,LINEC ;UPDATE LINE COUNT 2$: CALL SETP ;GET DEST. PNTR MOVB #LF,(R2)+ ;PUT IN LINE FEED MOV O$ID(R5),R1 ;GET ID STRING PNTR CALL EXPAND ;MOVE I.D. INTO LINE 3$:TO ASCII MOVB #SPACE,(R2)+ ;STORE A SPACE MOV CD$UNI(R0),R1 ;GET UNITS STRING POINTER CALL EXPAND MOV #CDEN2,R1 CALL EXPAND MOV CD$NAM(R0),R1 ;GET NAME STRING POINTER CALL EXPAND MOV #CDEN3,R1 CALL ETPRE ;TERMINATE PREFIX & SET B.C. CALL CDGNUM ;GET VALID NUMBER ASL R0 ;DOUBLE INDEX MOV R4,CD$C(R0) ;STORE ... MOV R5,CD$C+2(R0) ; ... COST MOV TQ,CD$Q(R0) ;STORE ... MOV TQ+2,CD$Q+2(R0) ; ... QUANTITY .PUSH R0 ;SAVE DOUBLED INDEX .PUSH R5 ;PUSH COST ... .PUSH R4 ; ..ASCII CMP R1,R5 ;DONE? BHIS 5$ ;YES TSTB @R1 ;SS REF.? BPL 5$ ;NO MOVB #',,(R3)+ ;PUT IN A COMMA BR 2$ ;CONVERT SS REF 3$: MOVB #'Q,(R3)+ MOVB #40,(R3)+ MOVB #'<,(R3)+ 4$: MOVB (R1)+,(R3)+ ;MOV IN A CHAR. CMP R1,R5 ;DONE? BHIS 5$ ;YES TSTB @R1 ;NEXT BYTE ASCII? BPL 4$ ;YES 5$: MOVB #'>,(R3)+ ;PUT IN TERMINATOR, MOVB #15,(R3)+ ; C.R., MOVB #12,(R3)+ ; & L.F. SUB #OBF,R3 ;COMPUTE BYTE COUNT MOV R3,OBFC ;STORE IT IN HEADER .WRITE #OLB,#OBFH ;WRITE LINE .WAIE RETURNED VALUE IS THE VALUE OF ; THE ASCII NUMBER DIVIDED BY A SPECIFIED POWER OF TEN. R3 AT ; ENTRY SHOULD CONTAIN THE POWER OF TEN. ; EXAMPLE: IF THE ASCII STRING IS "23.46" AND R3= -1, ; THEN THE RETURNED VALUE WILL BE 235 (ROUNDING IS DONE). ; ; EXIT: ; ; IF A NUMBER IS NOT THE FIRST THING ENCOUNTERED IN THE ; STRING: ; R0= 0 ; R1 POINTS TO THE 1ST NON-SPACE ENCOUNTERED ; ALL OTHER REGISTERS UNCHANGED ; C-CONDITION CODE WILL BE SET. ; ; IF OVERFLOW OCCURS DURING CONVERSION: CMP R2,#OBUF+^D56 ;PAST COL. 56. YET? BLOS 4$ ;NO MOV #OBUF+^D56,R2 ;SET TO COL. 56. 4$: MOVB #SPACE,(R2)+ ;PUT IN A SPACE CMP R2,#OBUF+^D57 ;'TAB' TO COL. 57 BLO 4$ MOV O$TIM(R5),R1 ;GET OPERATION TIME CALL SCV ;CONVERT IT TO ASCII MOVB #SPACE,(R2)+ ;2 SPACES ... MOVB #SPACE,(R2)+ MOV O$MTIM(R5),R1 ;GET MAINTENANCE INTERVAL CALL SCV ;CONVERT IT TO ASCII CALL ENDMES ;WRITE LINE TST (R5)+ ;ADVANCE INDEX BR 1$ ;GO DO NEXT ONE 5$: RETURN SCV: CLC ;CONVERT ROR R1 ; . ONTO STACK .PUSH TQ+2 ;PUSH QUANTITY ... .PUSH TQ ; ... ONTO STACK JSR R4,THREAD ;ENTER THREADED MODE $DVR ;DIVIDE TO COMPUTE UNIT COST .WORD .+2 ;EXIT THREADED MODE MOV 4(SP),R0 ;GET SAVED DOUBLED INDEX .POP CD$UC(R0) ;STORE UNIT ... .POP CD$UC+2(R0) ; ... COST .POP ;CLEAN STACK ASR R0 ;RESTORE ORIG. INDEX CALL CDLIN ;UPDATE COST DATA LINE BR 2$ ;GO REQUEST ANOTHER ID CDLIN: .WAIT #OPOUT ;WAIT BEFORE FIDDLING WITH LINE MOV R0,R1 ;COPY INDEX ASR R1 ;COMPUTE ..T #OLB BR 1$ 6$: .POP R1 ;RESTORE R1 .WRITE #OLB,#B0H ;WRITE ' .BYTE 0' RETURN SCV: BIC #^C177,R0 .BIN2O #TMP,R0 MOV #TMP+3,R0 CMPB @R0,#'0 BNE 1$ INC R0 CMPB @R0,#'0 BNE 2$ INC R0 BR 3$ 1$: MOVB (R0)+,(R3)+ 2$: MOVB (R0)+,(R3)+ 3$: MOVB (R0)+,(R3)+ RETURN .PAGE ;+ ; SUBROUTINE SUBF ; ; CONVERTS A STRING TO ITS SUBSTRING REPRESENTATION, ; AND INDICATES MAXIMUM NESTING LEVEL. ; ; ENTER WITH SRC PTR IN R1, SRC END PTR IN R5 ; ; PUTS TEXT LINE IN OBF. ;- SUB ; R0 AND R1 ARE UNDEFINED ; R3 IS UNDEFINED FOR ROUTINE G.FNUM ONLY ; V-CONDITION CODE WILL BE SET. ; ; OTHERWISE: ; R0= THE CONVERTED NUMBER ; R1 POINTS TO THE 1ST CHARACTER PAST THE ASCII NUMBER ; R3= -1 ; ALL CONDITION CODES WILL BE CLEAR. ;- .PAGE G.NUM: CLR R0 ;INITIALIZE R0 CALL G.NX ;GET 1ST NON-SPACE BMI 1$ ;DIGIT...O.K. CCC ;SET C TO SEC ; INDICATE NO NUMBER RETURN 1$: CALL M10DIG ;CONVERT DIGIT BVS 2$ ;BRANCH IF OVERFLOW CALL T.DIG ;NEXT CHAR. A DIGIT? TO ASR R1 ; HOURS ADC R1 ;ROUND IT CLR R0 ;SET DEC. INDICATOR MOV #^D6,R3 ;SET FIELD WIDTH CALL SCVRT ;CONVERT TO DECIMAL RETURN .PAGE .SBTTL GENERAL OUTPUT ROUTINES SETP: .WAIT #LBLK ;WAIT FOR FREE BUFFER MOV #OBUF,R2 ;SET DEST. POINTER RETURN ;RETURN SFMES: CALL SETP ;.WAIT & SET DEST. POINTER MOVB #LF,(R2)+ ;PUT IN LINE FEED MOVB #SPACE,(R2)+ ;TENTATIVE SPACE TSTB AG$MF(R5) ;MESSAGE DISABLED? BGE 1$ ;NO...LEAVE SPACE MOVB #'D,-1(R2) ;CHANGE TO 'D' TO INDIC. ADD #'A,R1 ; ... ID LETTER MOVB R1,CDID ;STORE IT ADD #-'A+2+40,R1 ;COMPUTE LINE ADDRESS CODE MOVB R1,CDL ;STORE IT MOV CD$NAM(R0),R1 ;GET ID STRING POINTER MOV #CDS,R2 ;SET ID STRING DEST. PNTR CALL EXPAND ;MOVE ID STRING INTO LINE 1$: CMP R2,#CDSE ;STILL IN FIELD ? BHIS 2$ ;NO MOVB #SPACE,(R2)+ ;STORE A SPACE BR 1$ ;LOOP 2$: MOV CD$UNI(R0),R1 ;GET UNITS STRING POINTER MOV #CDU1,R2 ;SET DEST. PNTR CALL EXPAND ;MOVE IT INTO LINE 3$: CMP R2,#CDU1E ;STILL IN FIELD ? BF: .PUSH R1 ;SAVE R1 CLR R3 ;CLEAR LEVEL INDICATOR CLR R0 ; AND MAX. LEVEL 1$: CMP R1,R5 BHIS 3$ MOVB (R1)+,R4 BPL 1$ .PUSH R1 .PUSH R5 INC R3 CMP R3,R0 BLOS 2$ MOV R3,R0 2$: ASL R4 ADD OFFSET,R4 MOV (R4)+,R1 MOV @R4,R5 BR 1$ 3$: DEC R3 BMI 4$ .POP R5 .POP R1 BR 1$ 4$: MOV #OBF,R3 ;DEST. PNTR. MOVB #';,(R3)+ MOVB #40,(R3)+ CALL SCV ;PUT IN MAXIMUM LEVEL MOVB #40,(R3)+ MOVB #'<,(R3)+ MOV @SP,R1 ;GET ORIG. R1 5$: CMP R1,R5 BHIS 11$ MOVB (R1)+BMI 1$ ;YES...CONVERT IT 2$: RETURN G.FNUM: CLR -(SP) ;PUSH ZERO AS SIGN INDICATOR CALL G.NX ;GET 1ST NON-SPACE BMI 2$ ;DIGIT CMPB (R1)+,#'- ;MINUS SIGN? BEQ 1$ ;YES CMPB -(R1),#'. ;DECIMAL POINT? BEQ 2$ ;YES .POP R0 ;REMOVE FLAG & SET R0=ZERO SEC ;INDICATE NO NUMBER RETURN 1$: DEC @SP ;SET MINUS FLAG 2$: MOV R1,R0 ;TEMP. SAVE R1 .PUSH R2 ;SAVE R2 3$: CALL T.DIG ;DIGIT NEXT? BPL 4$ ;NO INC R1 ;SKIP IT BR 3$ ;TEST NEXT CHAR. 4$: MOV R1,R2 ;R2=PNTR TO 1ST NATE DISABLED 1$: MOVB #SPACE,(R2)+ ;ADD SPACE MOV AG$DAT(R5),R0 ;GET DATE WORD CALL C.B2DA ;CONVERT DATE BCC 3$ ;DATE WAS VALID 2$: MOVB #'?,(R2)+ ;DATE WAS INVALID... CMP R2,#OBUF+^D9 ; FILL DATE FIELD WITH QMARKS BLO 2$ 3$: MOVB #',,(R2)+ ;PUT IN COMMA MOVB #SPACE,(R2)+ ; AND SPACE MOVB AG$HR(R5),R0 ;GET HOURS CALL CVT2 ;CONVERT IT TO ASCII MOVB AG$MIN(R5),R0 ;GET MINUTES CALL CVT2S ;PUT IN COLON & MINUTES MOVB #SPACE,(R2)+ ;PUT IN TWO MOVB #SPACE,(R2)+ ; SPACES RETURHIS 4$ ;NO MOVB #SPACE,(R2)+ ;FILL WITH SPACES BR 3$ ;LOOP 4$: MOV #CDU1,R1 ;SET SOURCE MOV #CDU2,R2 ;SET DEST. 5$: MOVB (R1)+,(R2)+ ;MOVE A CHARACTER CMP R1,#CDU1E ;FINISHED ? BLO 5$ ;NOT YET ASL R0 ;DOUBLE INDEX MOV CD$Q(R0),R4 ;GET HI WORD OF QUANTITY MOV CD$Q+2(R0),R5 ;GET LO WORD OF QUANTITY MOV #CDQ,R2 ;SET DEST. PNTR .PUSH #8. ;SET NO. OF CHAR. IN FIELD .PUSH #0 ;SET NO. DIGITS PAST DP CALL FLT2AS ;CONVERT TO ASCII MOV CD$C(R0),R4 ;GET HI WORD OF COST MOV CD$C+,R0 BMI 7$ 6$: MOVB R0,(R3)+ BR 5$ 7$: MOVB #'[,(R3)+ 8$: CALL SCV CMP R1,R5 BHIS 10$ MOVB (R1)+,R0 BPL 9$ MOVB #',,(R3)+ BR 8$ 9$: MOVB #'],(R3)+ BR 6$ 10$: MOVB #'],(R3)+ 11$: MOVB #'>,(R3)+ MOVB #15,(R3)+ MOVB #12,(R3)+ SUB #OBF,R3 MOV R3,OBFC .POP R1 ;RESTORE R1 RETURN .PAGE ;+ ; SUBROUTINE EXPAND ; ; CONVERTS A SUBSTRING TO ITS EXPANDED FORM. ; ; ENTER WITH SRC PTR IN R1, SRC END PTR ; IN R5. ; ; FORMS TEXT IN OBF. ;- EXPAND: .PUSH R1 ;SAVE R1 ON-DIGIT SUB R0,R1 ;R1=NO. OF DIGITS TO LEFT OF R2 NEG R3 ;NEGATE POWER OF TEN ADD R1,R3 ;R3=NO. OF DIGITS TO CONVERT MOV R0,R1 ;R1=PNTR TO BEGINNING OF NUMBER CLR R0 ;INITIALIZE R0 5$: DEC R3 ;FINISHED YET? BMI 11$ ;YES 6$: CALL T.DIG ;NEXT CHAR. A DIGIT? BPL 8$ ;NO CALL M10DIG ;CONVERT DIGIT BVC 5$ ;LOOP IF NO OVERFLOW 7$: .POP R2 ;RESTORE R2 .POP ;REMOVE SIGN FLAG CCC SEV ;INDICATE OVERFLOW RETURN 8$: CMP R1,R2 ;AT 1ST NON-DIGIT? BEQ 10$ ;YES 9$: CALL N EXPEND: CALL EXPAND ;EXPAND MESSAGE ENDMES: MOVB #CR,(R2)+ ;PUT IN CR MOVB #LF,(R2)+ ; AND LF SUB #OBUF,R2 ;COMPUTE BYTE COUNT MOV R2,OBUFC ;PUT IT IN HEADER .WRITE #LBLK,#OBUFH ;WRITE LINE RETURN ;RETURN .PAGE .SBTTL LINK BLOCK & FILE NAME BLOCK .WORD 0 ;ERROR RETURN - NULL LBLK: .WORD 0 ;LINK BLOCK FOR REPORT WRITER OUTPUT .RAD50 /REP/ ;DATASET NAME .BYTE 1 ;ONE WORD FOLLOWING .BYTE 1 ;UNIT NUMBER .RAD50 /TT / ;DEVICE NAME .WORD 0 ;ERROR RETURN - NULL .BYT2(R0),R5 ;GET LO WORD OF COST MOV #CDC,R2 ;SET DEST. .PUSH #8. ;SET NO. OF CHAR. IN FIELD .PUSH #2 ;SET NO. DIGITS PAST DP CALL FLT2AS ;CONVERT TO ASCII MOV CD$UC(R0),R4 ;GET HI WORD OF UNIT COST MOV CD$UC+2(R0),R5 ;GET LO WORD OF UNIT COST MOV #CDUC,R2 ;SET DEST. PNTR .PUSH #8. ;SET NO. OF CHAR. IN FIELD .PUSH #4 ;SET NO. DIGITS PAST DP CALL FLT2AS ;CONVERT TO ASCII ASR R0 ;RESTORE INDEX TO ORIG. VALUE .WRITE #OPOUT,#CDLN ;WRITE COST DATA LINE RETURN CDGNUM: CALL REQ, .PUSH ;INDICATE OUTSIDE LEVEL .PUSH R5 ;SAVE R5 MOV #OBF,R3 ;SET DEST. PTR. MOVB #';,(R3)+ MOVB #'S,(R3)+ MOVB #40,(R3)+ MOV SSNUM,R0 CALL SCV MOVB #40,(R3)+ MOVB #'<,(R3)+ 1$: CMP R1,R5 BHIS 3$ MOVB (R1)+,R0 BMI 2$ MOVB R0,(R3)+ BR 1$ 2$: .PUSH R1 .PUSH R5 ASL R0 ADD OFFSET,R0 MOV (R0)+,R1 MOV @R0,R5 BR 1$ 3$: .POP R5 .POP R1 BNE 1$ MOVB #'>,(R3)+ MOVB #15,(R3)+ MOVB #12,(R3)+ SUB #OBF,R3 MOV R3,OBFC .POP R1 ;RESTORE R1 RETURN .PAGE PEM10Z ;USE ZERO FOR NEXT DIGIT BVC 5$ ;LOOP IF NO OVERFLOW BR 7$ ;OVERFLOW 10$: CMPB (R1)+,#'. ;DECIMAL POINT? BEQ 6$ ;YES: CONTINUE DEC R1 ;BUMP PNTR BACK BR 9$ ;USE ZEROS FOR THE REST 11$: CMP R1,R2 ;AT 1ST NON-DIGIT? BNE 12$ ;NO CMPB @R1,#'. ;DECIMAL POINT? BNE 14$ ;NO INC R1 ;SKIP DECIMAL POINT 12$: CALL T.DIG ;NEXT CHAR. A DIGIT? BPL 14$ ;NO CMPB @R1,#'5 ;LESS THAN 5 ? BLO 13$ ;YES INC R0 ;ROUND UP BEQ 7$ ;OVERFLOW 13$: INC R1 ;SKIP DIGIT CALL T.DIG E 2 ;OPEN CODE - OPENO .BYTE 0 ;ERROR CODE FNBLK: ;FILENAME NOT REQUIRED FOR ; NON-FILE STRUCTURED DEVICE .PAGE .SBTTL MESSAGES GENMES SFAH,F .BYTE TAB,TAB LINE < OUT OF RANGE> ENDMES SFAH GENMES MHED2,F Q .BYTE TAB,TAB,TAB,TAB,TAB,TAB LINE .BYTE TAB,TAB,TAB,TAB,TAB,TAB,TAB LINE .BYTE LF ENDMES MHED2 .EVEN .PAGE .SBTTL STRINGS ALRMH: Q .BYTE 0 PVARH: Q .BYTE OBUFH ;REQUEST INPUT CALL AS2FLT ;CONVERT NUMBER TO FLOATING POINT BEQ 1$ ;BLANK LINE : ERROR BCS 1$ ;INVALID NUMBER : ERROR CALL G.NX ;EOL ? BNE 1$ ;NO : ERROR TST R4 ;CHECK VALIDITY BLE 1$ ;NEG. OR 0 : ERROR .WRITE #OPOUT,#CDEE ;ERASE ERROR LINE IF NECESSARY RETURN 1$: .WRITE #OPOUT,#CDE1 ;WRITE ERROR MESSAGE BR CDGNUM ;RE-REQUEST NUMBER TQ: .FLT2 0 .PAGE .SBTTL DATE AND TIME FUNCTION DATIME: MOV #DSTR2,R2 ;SET DEST. PNTR CALL GDATE ;GET ASCII DATE MOV #TSTR2,RCNT: MOV ORIGSP,R2 ;GET ORIGINAL SPACE REQUIREMENT MOV R2,R0 ;CAUSE ASR R0 ; ROUNDING MOV FSPACE,R1 ;GET PRESENT CORE REQUIREMENT CMP R1,R2 ;100% BEQ 2$ ;YES CALL DIVIDE ;COMPUTE FRACTIONAL USAGE MOV #^D10000,R2 ;SET MULTIPLICAND CALL MULT ;COMPUTE HUNDREDTHS OF % ROL R0 ;ROUND IT ADC R1 MOVB #40,(R5)+ .BIN2D R5,R1 ;CONVERT TO DECIMAL MOVB 1(R5),(R5)+ ;MOVE 2 CHAR. MOVB 1(R5),(R5)+ ; TO THE LEFT MOVB #'.,@R5 ;PUT IN DECIMAL CMPB -2(R5),#'0 BNE 1$ MOVB #40,-2( ;NEXT CHAR. A DIGIT? BMI 13$ ;YES: IGNORE IT CMP R1,R2 ;AT 1ST NON-DIGIT? BNE 14$ ;NO CMPB @R1,#'. ;DECIMAL POINT? BEQ 13$ ;YES: SKIP & SKIP MORE DIGITS 14$: TST R0 ;IS R0 POSITIVE? BMI 7$ ;NO: OVERFLOW .POP R2 ;RESTORE R2 TST (SP)+ ;TEST MINUS FLAG BEQ 15$ ;POSITIVE NUMBER NEG R0 ;NEGATE THE RESULT 15$: CCC ;CLEAR CODES RETURN .PAGE ;+ ; SUBSIDIARY ROUTINES USED BY G.NUM AND G.FNUM ;- M10Z: CLR -(SP) ;USE ZERO FOR THIS DIGIT BR M10COM M10DIG: CLR -(SP) 0 ALIMH: Q .BYTE 0 MAINTH: Q .BYTE 0 PGS: Q < PAGE 0> .BYTE 0 NAM: Q < LOW LIMIT: > VS2: Q VS3: Q .BYTE 0 .EVEN .PAGE .SBTTL BUFFERS OBUFH: .WORD OBSIZ ;BUFFER SIZE .BYTE 0 ;MODE: FORMATTED ASCII .BYTE 0 ;STATUS BYTE OBUFC: .WORD 0 ;BYTE COUNT OBUF: .BLKB OBSIZ ;GEN. OUTPUT BUFFER .EVEN HDNG: .WORD FLL+^D84 ;BUFFER SIZE .BYTE 0 ;MODE: FORMATTED ASCII .BYTE 0 ;STATUS BYTE HDNR2 ;DEST. PNTR CALL GTIME ;GET ASCII TIME .WRITE #OPOUT,#DTLIN ;WRITE DATE AND TIME TST TFLAG ;COMMAND TERMINATED WITH ? BEQ 1$ ;YES BIT #1,@#2 ;O.K. TO ALLOW CHANGE? BNE SDATIM ;YES 1$: JMP WAIT ;WAIT & RESTART SDATIM: CALL REQ,DAPRE ;REQUEST DATE CALL C.DA2B ;CONVERT DATE BCC 1$ ;VALID DATE .WRITE #OPOUT,#IVDAH ;WRITE INVALID DATE MESSAGE BR SDATIM ;ASK AGAIN 1$: MOV R0,TIMBLK ;STORE NEW DATE MOV #DSTR,R2 ;SET DEST. PNTR. CALL C.B2DA ;CONVERT DATE TO ASCII CAR5) 1$: RETURN 2$: MOV #HPC,R0 3$: MOVB (R0)+,(R5)+ CMP R0,#HPCE BLO 3$ RETURN HPC: Q <100.00> HPCE: .EVEN .PAGE ;+ ; SUBROUTINE MULT ; ; ENTER WITH MULTIPLIER IN R1, ; MULTIPLICAND IN R2 ; ; EXIT WITH LO-ORDER PRODUCT IN R0, ; HIGH-ORDER PRODUCT IN R1, ; MULTIPLIER (UNCHANGED) IN R2, ; AND R3 = 0; R4 & R5 UNCHANGED. ;- MULT: CLR R0 MOV #-16.,R3 1$: ASL R0 ROL R1 BCC 2$ ADD R2,R0 ADC R1 2$: INC R3 BNE 1$ RETURN .PAGE ;+ ; SUBROUTINE: DIVIDE ; ; FO ;PUT VALUE OF MOVB (R1)+,@SP ; ASCII DIGIT SUB #'0,@SP ; ON STACK M10COM: CMP R0,#14631 ;WILL ANOTHER DIGIT FIT? BHI 1$ ;NO BLO 2$ ;YES CMPB @SP,#5 ;WILL IT FIT? BLOS 2$ ;YES 1$: .POP ;CLEAN STACK SEV ;INDICATE OVERFLOW RETURN 2$: ASL R0 ;MULTIPLY R0 ADD R0,@SP ; BY TEN ASL R0 ; AND ADD ASL R0 ; IN ADD (SP)+,R0 ; DIGIT CCC ;CLEAR CODES RETURN .PAGE .SBTTL PROCESS VARIABLE CONVERSION FROM ASCII .GLOBL G.VNUM .GLOBL A$PWR,A$LOW,A$SPAN ;+ ;GC: .WORD 0 ;BYTE COUNT (FILLED IN LATER) HDNGB: .BYTE CNTRLO .BYTE CR,FORM .BYTE TAB LINE FLL= .-HDNGB HDNGP: .BLKB ^D84 .EVEN .PAGE .SBTTL REAL TIME HEADER .WORD 0,0,0,0,0 .WORD 0 ;MAX. TIME: UNLIMITED .WORD 0 .BYTE 1 ;PRIORITY .BYTE 0 .WORD LOSTK ;STACK LIMIT .WORD 0 .WORD BEG ;INITIAL STACK SETTING .WORD START ;TRANSFER ADDRESS .WORD 0 PRM: .WORD 0 .WORD 0 .RAD50 /EP / ;TASK... .RAD50 /INR/ ;...NAME LL REQY,VEDAT ;REQUEST VERIFICATION BNE SDATIM ;NAK: ASK AGAIN 2$: CALL REQ,TIPRE ;REQUEST TIME MOV #TIMBLK+2,R5 ;SET DEST. PNTR CALL G.NUM ;GET HOURS BCS 5$ ;NO NUMBER ... INVALID TIME CMP R0,#^D24 ;VALID HOURS? BHIS 5$ ;NO ... ERROR 3$: MOVB R0,(R5)+ ;SAVE NUMBER CMP R5,#TIMBLK+5 ;FINISHED YET? BHIS 6$ ;YES CALL G.NX ;GET NEXT NON-SPACE BEQ 4$ ;END-OF-LINE CMPB (R1)+,#': ;COLON? BNE 5$ ;NO ... ERROR 4$: CALL G.NUM ;GET NEXT NUMBER CMP R0,#^D60 ;VALID? BLO 3$ ;YESRM OF CALL: JSR PC,DIVIDE ; ; ACTION: ; ; DIVIDE DIVIDES AN UNSIGNED 32-BIT DIVIDEND BY AN ; UNSIGNED 16-BIT DIVISOR. ; ; ENTRY: ; ; R0= THE LOW-ORDER WORD OF THE DIVIDEND ; R1= THE HIGH-ORDER WORD OF THE DIVIDEND ; R2= THE DIVISOR ; ; EXIT: ; ; IF THE DIVISOR (R2) IS NOT HIGHER THAN THE HIGH-ORDER ; WORD OF THE DIVIDEND (R1), ALL REGISTERS REMAIN UNCHANGED ; AND THE Z-CONDITION CODE WILL BE SET; OTHERWISE: ; ; R0= 16-BIT REMAINDER ; R1= 16-BIT QUOTIENT ; R2= 16-BIT DIVISOR (UNC SUBROUTINE G.VNUM ; ; FORM OF CALL: JSR PC,G.VNUM ; ; ACTION: ; ; ROUTINE G.VNUM IS USED TO CONVERT A SIGNED "REAL" ; NUMBER FROM AN ASCII STRING INTO THE PROCESS VARIABLE ; INTERNAL FORMAT BINARY REPRESENTATION. ; ; ENTRY: ; ; R1= SOURCE POINTER TO ASCII STRING ; R3= POINT INDEX OF PERTINENT PROCESS VARIABLE ; ; EXIT: ; ; IF A NUMBER IS NOT THE FIRST THING ENCOUNTERED IN THE ; STRING: ; R0= 0 ; R1 POINTS TO THE 1ST NON-SPACE ENCOUNTERED ; ALL OTHER REGISTERS UNCHANGED ; C-CONINREPH: .WORD START ;CALL NUMBER .END  5$: .WRITE #OPOUT,#IVTIH ;WRITE INVALID TIME MESSAGE BR 2$ ;ASK AGAIN 6$: MOV #TSTR,R2 ;SET DEST. PNTR. MOV #TIMBLK+2,R5 ;SET SOURCE PNTR. MOVB (R5)+,R0 ;GET HOUR CALL CVT2 ;CONVERT TO ASCII MOVB (R5)+,R0 ;GET MINUTES CALL CVT2S ;CONVERT IT MOVB (R5)+,R0 ;GET SECONDS CALL CVT2S ;CONVERT IT CALL REQY,VETIM ;REQUEST VERIFICATION BNE 2$ ;NAK: ASK AGAIN MOV #TIMBLK,R5 ;SET TIME BLOCK POINTER CALL SETIME ;SET SYSTEM DATE AND TIME RETURN TIMBLK: .BLKW 1 ;NEW DATE .BLKB 1 HANGED) ; ALL OTHER REGISTERS ARE UNCHANGED ; Z-CONDITION CODE IS CLEAR ; ;- .GLOBL DIVIDE DIVIDE: CMP R1,R2 ;DIVISOR TOO SMALL? BHIS 4$ ;YES: ERROR .PUSH R3 ;SAVE R3 MOV #^D16,R3 ;SET COUNTER 1$: ASL R0 ;DOUBLE SHIFT ... ROL R1 BCS 2$ ;NEED TO SUBTRACT CMP R2,R1 ;CAN WE SUBTRACT? BHI 3$ ;NO 2$: SUB R2,R1 ;SUBTRACT DIVISOR INC R0 ;SET BIT IN DIVIDEND 3$: DEC R3 ;FINISHED? BNE 1$ ;NO MOV R0,R3 ;PUT QUOTIENT AND MOV R1,R0 ; REMAINDER IN MOV R3,R1 ; PROPEDITION CODE WILL BE SET ; ; IF A NUMBER IS PRESENT, BUT IT IS NOT WITHIN THE LIMITS ; DEFINED FOR THE PERTINENT PROCESS VARIABLE: ; R0 AND R1 ARE UNDEFINED ; V-CONDITION CODE WILL BE SET ; ; OTHERWISE: ; R0= THE CONVERTED NUMBER ; R1 POINTS TO THE 1ST CHARACTER PAST THE ASCII NUMBER ; ALL OTHER REGISTERS UNCHANGED ; ALL CONDITION CODES WILL BE CLEAR ;- G.VNUM: .PUSH R3 ;SAVE POINT INDEX MOVB A$PWR(R3),R3 ;GET POWER OF TEN CALL G.FNUM ;CONVERT TO BINARY BCC 1$ ;GOT A NUMBER .POP .TITLE SCANA - CYCLIC ALARM CHECK TASK .GLOBL SCANAH .GLOBL TEST,CTEST,STEST .GLOBL DIGBUF .MCALL .PUSH,.POP,CALL .MCALL .PARAM,.EXIT .PARAM STKSIZ= ^D24 ;STACK SIZE IN WORDS LOSTK: .WORD 0 ;STACK CHECK WORD .BLKW STKSIZ ;STACK SPACE BEG: .PAGE .SBTTL ANALOG SENSOR FAILURE CHECKS .GLOBL A$SFF,A.UL START: CLR R5 ;INIT. POINT INDEX 1$: CMP R5,#A.UL ;FINISHED? BHIS ANAALA ;YES TSTB A$SFF(R5) ;TEST SENSOR-FAIL FLAG CALL TEST ;CALL COMMON TEST ROUTINE TST (R5);NEW HOUR .BLKB 1 ;NEW MINUTE .BLKB 1 ;NEW SECOND .EVEN .PAGE .SBTTL GENERAL DECTAPE ROUTINES CHKTAP: CLRB RUNIT ;ASSUME UNIT 0 MOV DATE,R0 ;FORM 1ST OF CALL FRSTMN ; THIS MONTH CMP SDAT,R0 ;SDAT IN THIS MONTH? BHIS 1$ ;YES INCB RUNIT ;NO...CHANGE TO UNIT 1 1$: MOV (PC)+,R0 ;GET TEST DATE SDAT: .WORD 1 CALL FRSTMN ;FORM 1ST OF MONTH MOV R0,(PC)+ ;SAVE FOR TAPE DATE CHECK RMDAT: .WORD 0 MOV #^D271,XFRBLK ;SET LABEL BLOCK NUMBER MOV #TLABEL,MEMAD ; BUFFER ADDRESSR REGISTERS .POP R3 ;RESTORE R3 RETURN ;RETURN 4$: SEV ;INDICATE ERROR RETURN ;RETURN .PAGE .SBTTL BUFFERS AND THINGS .MCALL GENMES,ENDMES,Q,LIN,LINE IEXT: .RAD50 /SUB/ SNAME: .RAD50 /SUBSTR/ OEXT: .RAD50 /MAC/ DLFN: .RAD50 /SUB LOG/ CMDBUF: .BLKW 7 IOPBH: .WORD ^D82 .BYTE 0,0 IOPC: .WORD 0 IOPB: .BLKB ^D82 .EVEN INBH: .WORD ^D100 .BYTE 0 INBS: .BYTE 0 INBC: .WORD 0 INBB: .BLKB ^D100 .BYTE 0 .EVEN OBFH: .WORD ^D100 .WORD 0 OBFC: .WORD 0 OBF: .BLKB R3 ;RESTORE R3 RETURN ;EXIT WITH C-SET 1$: BVC 3$ ;NO OVERFLOW .POP R3 ;RESTORE R3 2$: CCC SEV ;SET V FOR OVERFLOW RETURN 3$: .POP R3 ;RESTORE R3 SUB A$LOW(R3),R0 ;SUBTRACT LOW VALUE BVS 2$ ;OVERFLOW .PUSH R2 ;SAVE R2 .PUSH R1 ;SAVE R1 MOV R0,R1 ;SET HI-DIVIDEND MOV A$SPAN(R3),R2 ;SET DIVISOR MOV R2,R0 ;SET LO-DIVIDEND TO CCC ; ONE-HALF OF DIVISOR ROR R0 ; TO CAUSE ROUNDING CALL DIVIDE BVS 4$ ;OVERFLOW CMP R1,#10000 ;CHECK VALIDITY BHI 4$ ;OVERFLOW ND.E R BEUM NLLCA ;T ARSTD OR.W: PHBO KE AM.N.. ;/ BO/K0 D5RA . ..K.AS;T /P /50AD.R 0 0,0,D OR.W S ESDRADR FENSRA;T RTTA SRDWO . NGTIET SCKTA SALTINI;I EG BRDWO . 0RDWO . ITIM LCKTA;S TKOS LRDWO . 0TEBY . TYRIIOPR ;1 E YT.B 0 D OR.W D TEMILIUN: METI. AX;M MOV #1,WC ; WORD COUNT MOVB #READ,FCN ; & FUNCTION 1$: CALL XFER ;READ FROM TAPE CMP TLABEL,RMDAT ;CORRECT TAPE? BEQ 2$ ;YES MOVB RUNIT,UID3 ;SET UNIT NUMBER BISB #'0,UID3 ;MAKE IT ASCII CALL STDTID,TLABEL,WRNG ;STORE TAPE ID CALL STDTID,RMDAT,RGHT ; AND NEEDED TAPE ID .WRITE #OPOUT,#DTREQ ;WRITE ERROR MESSAGE CALL REQ,REDY ;WAIT TILL READY BR 1$ ;TRY AGAIN 2$: MOV SDAT,R1 ;TEST DATE SUB RMDAT,R1 ;R1=-1 MOV #^D18,R2 ;18. BLOCKS / DAY CALL MULT INC R0 ^D100 GENMES IMES LINE LINE Q < #OUTDEV:,LOG> .BYTE '< LINE Q LINE LINE LINE LINE LINE ENDMES IMES GENMES HATCH LINE LIN <#> ENDMES HATCH GENMES ERM1 LIN MOV R1,R0 ;ANSWER TO R0 .POP R1 ;RESTORE R1 .POP R2 ;RESTORE R2 CCC ;CLEAR ALL CODES RETURN 4$: .POP R1 ;RESTORE R1 .POP R2 ;RESTORE R2 BR 2$ ;TAKE OVERFLOW EXIT .PAGE .SBTTL SET TIME ROUTINE .GLOBL SETIME .GLOBL MULT .GLOBL CYCSEC,SEC,PL7,COUNT,WDTB,MN,TIC,LTDT ;+ ; SUBROUTINE SETIME ; ; FORM OF CALL: MOV #TIMBLK,R5 ;SET PTR TO TIME BLOCK ; JSR PC,SETIME ;SET SYSTEM DATE & TIME ; .... ; .... ; TIMBLK: .WORD NEWDATE ; .BYTE NEWHOUR ; .BYTE NEWMINUTE 0RDWO . ,0,0,0,0 0RDWO . ERADHEE IM TALREL TTSB . GEPA . DCEN .E UFCB= .E UFCB.-, LTF .I ENEV . ERSUS MEND E ,7,7,7 7TEBY . !>!!T AL HLLWIM TEYS!!S SKTAM TEYS SLEDUHESCO TNGTIMPTEATR ROER 1 T NI UON) LEABILVA AIF (THON MSTLAR FOE AP TND0 T NI UONH NTMOS HI TOR FPETAT UNMO : ?CTREOR CISTHS IY:-YMM-MDD OR FISE AP TEDNTOU ENDMES ERM1 GENMES ERM2 LINE LINE ENDMES ERM2 GENMES ERM3 LINE Q .BYTE '> LINE < ) ON FOLLOWING LINE:> LINE ENDMES ERM3 GENMES ERM4 LINE LINE ENDMES ERM4 GENMES ERM5 LINE LINE LINE ENDMES ERM5 GENMES ERM6 LINE LINE ! ! ! T MAOR FCTREORNC IISE AP TEDNTOU M ! ! ! . 0ITUNN OPETAT ENEC RSTMOT UNMO ENDMES ERM6 GENMES ERM7 LINE LINE ENDMES ERM7 GENMES PART1 LINE < .TITLE SUBSTR - SUBSTRING MODULE> LINE LINE < .MACRO Q TEXT> .ASCII ' .ASCII \TEXT\' LINE LINE < .ENDM Q> LINE LINE < .MACRO S SUBS> LINE < .IRP X,> LINE < .BYTE 200!X> LINE < .ENDM> LINE < .ENDM S> LINE LINE < .MACRO MARK> LINE <.TMP= .> LINE < .CSECT SSTABC> LINE < .WORD .TMP> LINE < .CSECT> LINE < .ENDM MARK> LINE LINE < .GLOBL BY 60. & ACCUMULATE MOV #^D3600,R1 ;SET MULTIPLIER CALL MULADD ;MULT. HR. BY 3600. & ACCUMULATE MOV #CYCSEC,R2 ;GET TICKS/SECOND MOV R3,R1 ;MULTIPLY LO-ORDER CALL MULT ; BY TICKS MOV R1,R5 ;SAVE NEW HI IN R5 MOV R4,R1 ;SET TO MULT. BY OLD HI-ORDER MOV R0,R4 ;SAVE NEW LO IN R4 CALL MULT ;MULT. OLD HI BY TICKS ADD R0,R5 ;ADD INTO NEW HI MOV @#PSW,R2 ;SAVE STATUS WORD MOV #PL7,@#PSW ;LOCK OUT INTERRUPTS MOV R5,COUNT+2 ;STORE HI TICKS MOV R4,COUNT ;STORE LO TICKS MOV #WDEDCH;S R5L,SA #OV MC:EDCH S Y LLMAOR NEDCERO;P T1 SMP J TYRIIOPRE ORSTRE ;W PS@#P PO . AGFLL AIRFPW. ITIN ;G LAPFR CL T UNCOE YT BTSENMMCO. ITIN ;T CN CLR C TEDAS NTMEOM CT.NI;I ATCDR CL G LA FE'IM TST'1R EACL ;G LAFFR CL R TERI WGESAES MRMLA A; DCHESCL AL C LEDUHESC ;ADSK,TMHARAL #OV M ORSTTEM ARAL ;C EDCH SLLCA E ULEDCH;SD KATSH,NACA#SV MO R SOESOCPRC LIYC C; DCHESCL AL C LEDUHESC ;ADSK,TRHANSC #OV M 4TYRIIOPRO TSEAI;RW PS@#0,20 #OV M USATSTE AV;S SW#P @SHPU . ONTIMAIRNFCOT GE : MOV R3,R2 ;SET DEST. PNTR CALL EXPAND ;MOVE IN SPACES OR 'BAD DATE' RETRN5 TPS1: .ASCIZ / / ;THREE SPACES TPS2: .ASCIZ / BAD DATE/ .EVEN .PAGE .SBTTL GENERAL OUTPUT ROUTINES SETP: .WAIT #OPOUT ;WAIT FOR FREE BUFFER MOV #OBUF,R2 ;SET DEST. POINTER RETURN ;RETURN SFMES: CALL SETP ;.WAIT & SET DEST. POINTER MOVB #SPACE,(R2)+ ;TENTATIVE SPACE TSTB AG$MF(R5) ;MESSAGE DISABLED? BGE 1$ ;NO...LEAVE SPACE MOVB #'D,-1(R2) ;CHANGE TO 'D' TO INDICATE DISABLED 1$: MOVB #S SSTAB> LINE LINE < .CSECT SSTABC> LINE LINE < .CSECT> LINE < .PAGE> ENDMES PART1 GENMES SSL1 Q SSN1: Q <000:> SLN: .ASCII \00000, \ SUSE: Q <00000, S> SSSAVE: Q <00000, CORE=> FSPC: Q <00000 = > CPRCNT: LINE <000.00 %> LINE ENDMES SSL1 GENMES NLH LINE <.NLIST> ENDMES NLH GENMES LIH LINE <.LIST> ENDMES LIH GENMES MRKH LINE ENDMES MRKH GENMES B0H LINE <.BYTE 0> ENDMES B0H GENMES OSPCH Q <;ORIG. CORE = > OSPCO: Q <000000 = > O TB,R0 MOV MN+4(R0),MN(R0) ;SET CURRENT DELAY = REPEAT DELAY MOV #1,TIC ;RESET TICKS MOV #1,LTDT ; COUNTERS .POP R5 ;PNTR PAST NEW SECOND MOV #SEC,R0 ;SET DESTINATION POINTER MOVB -(R5),(R0)+ ;STORE SECONDS, MOVB -(R5),(R0)+ ; MINUTES, MOVB -(R5),@R0 ; AND HOURS MOV -(R5),DATE ;SET NEW DATE MOV R2,@#PSW ;RESTORE PROCESSOR STATUS RETURN MULADD: MOVB -(R5),R2 ;SET MULTIPLICAND .PUSH R3 ;SAVE R3 CALL MULT ;MULTIPLY .POP R3 ;RESTORE R3 ADD R0,R3 ;ACCUMULATE LO-ORDER ;DYREQ,REL AL C ESAP TNTOU MTOT UCTRNS;IH APMT,#UTPO#OE ITWR .T:MRNO PETAM RO FTADAL BALO GADRE ;R FE XLLCA T UNCOD OR WET;SC ,WIZBS#TV MO T ECRRCOT NO ;T MRET GNE B CTREOR CIFK AS ;RHCOY,EQ RLLCA H NTMOF OAY D; 4 @RE,ACSP #VBMO T OUE ACSP ;)+R4,(CEPA#SB OV M ORRR;E 2$E BN 1 R FOK ECCH ;1 #'4,@RB MP C CEPA STOE NGHA;C+ 4)(RE,ACSP #VBMO R ROER ;$ 2NE B 0OR FCKHE;C '0,#R4 @PBCM : ORRR EH,NTMOF OAY DST 1OT NIF ;$: 3N AIAGY TR ;T MRET GBR E AGSSMEE AP TIDALNV ITERI;WF VT#IT,OUOP #TERI.W: PACE,(R2)+ ;ADD SPACE MOV AG$DAT(R5),R0 ;GET DATE WORD CALL C.B2DA ;CONVERT DATE BCC 3$ ;DATE WAS VALID 2$: MOVB #'?,(R2)+ ;DATE WAS INVALID... CMP R2,#OBUF+^D9 ; FILL DATE FIELD WITH QMARKS BLO 2$ 3$: MOVB #',,(R2)+ ;PUT IN COMMA MOVB #SPACE,(R2)+ ; AND SPACE MOVB AG$HR(R5),R0 ;GET HOURS CALL CVT2 ;CONVERT IT TO ASCII MOVB AG$MIN(R5),R0 ;GET MINUTES CALL CVT2S ;PUT IN COLON & MINUTES MOVB #SPACE,(R2)+ ;PUT IN TWO MOVB #SPACE,(R2)+ ; SPACES RETURN ETPRE: CALL EXPAND SPC: LINE <00000. BYTES> .BYTE 12 ENDMES OSPCH GENMES NSPCH Q <;FINAL CORE = > NSPCO: Q <000000 = > NSPC: LINE <00000. BYTES> .BYTE 12 Q <;FINAL CORE = > TPRCNT: Q <000.00 %> LINE < OF ORIG. CORE> .BYTE 12,12 ENDMES NSPCH GENMES LASTM LINE < .EVEN> LINE < .END> ENDMES LASTM TMP: .BLKB ^D10 .EVEN .PAGE .SBTTL LINK BLOCKS & FILE NAME BLOCKS CBLK1: .WORD CMDBUF .WORD OLB .WORD OFN CBLK2: .WORD CMDBUF .WORD LLB .WORD LFN CBLK3: .WORD CMDBUF .WORD IL ADC R4 ;ADD CARRY ADD R1,R4 ;ACCUMULATE HI-ORDER RETURN .PAGE .END 2$ AR FSO. .K;O 3$C BC I CIASO TRTVEON;C DAB2C.L AL C IT. UP;D R42, ROV M TRPN. STDE ;R21,UV#SV MO E AT DELAB LET;G R0T,DA LOV M ELAB LPETAD EA;R ERXFL AL C ONTINCFU ;CN,FADRE #OV M NTOU CRDWO ;C ,W#1V MO S ESDRADY OREM M; D MAMET,DA#LV MO R BEUM NCKLO BELAB LET;SK BLFR,X71D2#^V MO: 1$ PETAT ENEC RSTMOO ;N RTOM NBR O ;N RTTMGEE BN ? NELIF OND;E R1 @TBTS O ;N RTTMGEE BN ? X N AOT;GX #'+,1)(RB MP C K.O.: NELIK ANBL ;$ 1EQ B SEONSPRET GE ;DYREQ,REL AL C PETAT ENEC RSTMOT ES;MOVE STRING TPRE: MOVB #VERTAB,(R2)+ ;STORE VERTICAL TAB BR TBUF ;GO COMPUTE BYTE COUNT ETMES: CALL EXPAND ;MOVE STRING TMES: MOVB #CR,(R2)+ ;STORE CARRIAGE RETURN ... MOVB #LF,(R2)+ ; ... AND LINE FEED TBUF: SUB #OBUF,R2 ;COMPUTE BYTE COUNT MOV R2,OBUFC ;STORE BYTE COUNT RETURN ETWMES: CALL ETMES BR WBUF TWMES: CALL TMES BR WBUF TWBUF: CALL TBUF WBUF: .WRITE #OPOUT,#OBUFH ;WRITE LINE RETURN .PAGE .SBTTL GENERAL SUBROUTINES ;+ ; SUBROUTINES: RLIN ; REQ ; REQY ; ; FB .WORD IFN .WORD 0 IOPL: .WORD 0 .RAD50 /CMI/ .BYTE 1,0 .RAD50 /KB / .WORD 0 OOPL: .WORD 0 .RAD50 /CMO/ .BYTE 1,0 .RAD50 /KB / .WORD 0 ILB: .WORD 0 .RAD50 /IN / .WORD 1 .RAD50 /SY / .WORD 0 OLB: .WORD 0 .RAD50 /OUT/ .WORD 1 .RAD50 /KB / .WORD 0 MLB: .WORD 0 .RAD50 /MON/ .WORD 1 .RAD50 /KB / .WORD 0 LLB: .WORD 0 .WORD 0 .WORD 1 .WORD 0 .WORD 0 .BYTE 4,0 IDFN: .RAD50 /OPIN / .WORD 0,0 .WORD 0 .BYTE 2,0 ODFN: .RAD50 /OPO+ ;ADVANCE INDEX BR 1$ ;GO DO NEXT ONE .PAGE .SBTTL ANALOG LIMIT ALARM TESTS .GLOBL A$VAL,AG$OV,AG$MF .GLOBL A1.UL,A1$OPT,A1$OLO,A1$OHI LIMDB= ^D41 ;'LIMITS DEAD BAND' (^D41=1% OF SPAN) ANAALA: CMP R5,#A1.UL ;FINISHED? BHIS DIGALA ;YES: GO CHECK DIGITAL ALARMS MOV A1$OPT(R5),R4 ;GET POINT INDEX MOV A$VAL(R4),R4 ;GET CURRENT POINT VALUE MOV A1$OLO(R5),R2 ;GET CURRENT LOW LIMIT MOV A1$OHI(R5),R3 ;GET CURRENT HIGH LIMIT TSTB AG$OV(R5) ;TEST ALARM STATUS BEQ 1$ ;STATUS NORMQURE ;THMR,#UTPO#OE ITWR .T:MRET GE IM T &TEDAM TEYS SET S &ET;G IMATSDL AL C ENRESCR EACL ;R EACLL AL CP:TUTR S 2 51^D.+= FEBU C4 .+= UFCB +2 .T=CN C. = ATCD MHARALH,NACA,SRHANSCL OBGL . IZBS,TATLDL OBGL . DECOP -URTTA SND AERFFBU' TSENMMCO 'TLBT.S E AG.P R TEINPOR FEUF;B UFCBD OR.W: BPOM CT UNCOE YT BALTUAC ;0 D OR.W: BCOM CS TUTA;S 0TEBY .S:MBCO DEMOP UM;D 4TEBY . NTOU CTEBYX MA ;0 D OR.W: BHOM C: NELIT ENMMCOA G INADRER FOR DEEA HERFFBU; ENEV . 84^DB LK.B: GPDN HB NGHD.-= LLORM OF CALL: JSR PC,RLIN ; ; JSR R5,REQ ; .WORD PREAD ; ; JSR R5,REQY ; .WORD PREAD ; ; ACTION: ; ; RLIN READS ONE LINE FORM THE CONSOLE. A ZERO BYTE IS ; PLACED AT THE END OF THE CHARACTER STRING WHICH WAS READ ; (TERMINATOR(S) ARE REMOVED), & TFLAG IS SET TO INDICATE ; HOW THE LINE WAS TERMINATED: ; 0 MEANS TERM. WITH CR, 1 MEANS TERM. WITH LF OR VT. ; ; REQ WRITES THE MESSAGE WHOSE LINE BUFFER POINTER ; FOLLOWS THE CALL, THEN PERFORMS THE SAME AS RLIN. ; ; REQY PERFORMS TUT / .WORD 0,0 .WORD 0 .BYTE 4,0 IFN: .RAD50 /IN / .WORD 0,0 .WORD 0 .BYTE 2,0 OFN: .RAD50 /OUT / .WORD 0,0 .WORD 0 .BYTE 2,0 MFN: .RAD50 /SUB MON/ .WORD 0,0 .WORD 0 .BYTE 2,0 LFN: .RAD50 /SUB LOG/ .WORD 0,0 .PAGE .SBTTL POINTER LIST AND BUFFER LLST: .BLKW MAXLIN+^D128+1 ;MESSAGE AND SS PTR TABLE LLSTE: BUF: .BLKB MAXLIN*AVLGTH+^D100 ;BUFFER SPACE FOR ;MESSAGES AND SUBSTRINGS BUFEND: SS: .BLKB ^D120 ;TEMP. SPACE FOR EACH NEW SAL CMPB AG$OV(R5),#1 ;TRANSITION UP ? BEQ 1$ ;YES ADD #LIMDB,R2 ;ADD DEAD-BAND TO LOW LIMIT SUB #LIMDB,R3 ;SUB DEAD-BAND FROM HIGH LIMIT 1$: CMP R4,R2 ;LOWER THAN LOW LIMIT? BLO 3$ ;YES CMP R4,R3 ;HIGHER THAN HIGH LIMIT? BHI 3$ ;YES CALL CTEST ;GO UPDATE FLAGS 2$: TST (R5)+ ;ADVANCE INDEX BR ANAALA ;GO TO NEXT 3$: CALL STEST ;GO UPDATE STATUS FLAGS BR 2$ ;GO TO NEXT .PAGE .SBTTL DIGITAL ALARM TESTS .GLOBL D1$FTB DIGALA: MOV #D1$FTB-2,R4 ;SET POINTER TO ALARM SPE F> NTLA POLTRON CONTILUPOR TEWAH NAANAV SOFY IT<)Q E IN LCHEAR FON IEDLLFI ;'ZE YT.B: H3DC I( 'TEBY .2:TRVS 0TEBY . NELIH AC EOR FIND LEIL;F> < Q : R1STPR ><)Q E IN LCHEAR FON IEDLLFI ;'ZE YT .WRITE #OPOUT,(R5)+ ;WRITE INPUT-REQUESTING MESSAGE CALL RLIN ;READ A LINE FROM CONSOLE RETRN5 ;RETURN REQY: .WRITE #OPOUT,(R5)+ ;WRITE THE PREFIX MESSAGE CALL RLIN ;READ A LINE FROM CONSOLE CMPB @R1,#'Y ;COMPARE CHAR. WITH 'Y' RETRN5 ;RETURN RLIN: .WAIT #OPOUT ;WAIT FOR OUTPUT TO FINISH .READ #OPIN,#INBUFH ;READ ONE LINE FROM CONSOLE .WAIT #OPIN ;WAIT FOR COMPLETION MOV #INBUF,R1 ;R1=ADDRESS OF 1ST CHAR. IN BUFFER ADD INBUFC,R1 ;R1=ADDR. OF LAST CHAR. +1 DEC R1 ;R1=AD  .TITLE ANADEF - DEFINITIONS AND TABLES ;+ ; WHEN ASSEMBLING THIS MODULE, IT MUST BE PRECEDED ; BY DEFINITIONS OF THE FOLLOWING PARAMETERS: ; ; AENUM= NUMBER OF 'EXTERNAL' ANALOG VALUES ; AINUM= NUMBER OF INTERNALLY COMPUTED ANALOG VALUES ; DPNUM= NUMBER OF DIGITAL PULSE COUNT POINTS ; DONUM= NUMBER OF DIGITAL OPERATION TIME POINTS ; A1NUM= NUMBER OF LOW/HIGH LIMIT ANALOG ALARMS ; D1NUM= NUMBER OF DIGITAL ALARM FUNCTIONS ; CDNUM= NUMBER OF COST VALUES REQUIRED ;- AANUM= AENUM+AINUM A.D LOSTK ;STACK LIMIT .WORD 0 .WORD BEG ;INITIAL STACK SETTING .WORD START ;TRANSFER ADDRESS .WORD 0,0,0 .RAD50 /NA / ;TASK... .RAD50 /SCA/ ;...NAME SCANAH: .WORD START ;CALL NUMBER .END .B: H1DC I( 'TEBY .R:ST V 0 E YT.B > XXXXXX < Q3:VS >T:MILIH IG H X,XXXX : ITIM LOW L < QM:NA 0TEBY . 0> GEPA < Q : GS P 0 E YT.B > OG LCEANENNTAIITIM LRMLA AOGALAN < QH:IMAL 0TEBY . S>LEABRIVAS ESOCPR < QH:ARPV 0TEBY . S>RMLA ANTREUR-YMM-MDD :OR FTADAY ORATORAB A1.LL= A.UL A1.UL= A1.LL+ D1.LL= A1.UL D1.UL= D1.LL+ .MCALL .PARAM .PARAM .MCALL .PUSH,.POP .MCALL CALL,RETURN .MCALL Q,S,BDWRD .MCALL SB$ .GLOBL MULT,DIVIDE .PAGE .SBTTL MACRO DEFINITIONS .MACRO APDEF POINT,LOW,HIGH,PWR,UNIT .GLOBL POINT POINT= PINDEX .IF EQ, .ERROR ;MISSING SB$ CALL AFTER POINT DEFINITION .BYTE 0 ;SUBSTITUTE A NULL STRING .ENDC TMP= . .CSECT ANAC .= A$ID+PINDEX .WORD TMP ;"ID" MESSAGS STLI.N ]>246,[3 < 3 ;> ENYGOXK ACST2 . NOE ACRNFU <7Q 1>,135 < ST ISNL .> ]7115,[3 < 3 ;> 7O. NP.EM TTHARHE1 . NOE ACRNFU <6Q 1>,135 < ST ISNL .> ]6115,[3 < 3 ;> 6O. NP.EM TTHARHE1 . NOE ACRNFU <4Q 1>,135 < ST ISNL .> ]4115,[3 < 3 ;> 4O. NP.EM TTHARHE1 . NOE ACRNFU UUUU /XXXXXXXX < QC:DU C> $ XXXXXXXX < QC:CD $> < QE:U1CD U>UUXXXXXXXX < QQ:CD E:DS C> < QS:CD > - < Q ERTTLED ;I0 4TEBY .D:DI CE ATINRDOO-C;X0 0+ 4TEBY . NDMAOM C.'ARCHL IL'F ; 1TEBY . TENADIORCOY- ;40E YT.B: DL CD CAE YT.B O RLNT CTEBY . LNCDS MEEN G E1CDS MEND E !>Y TREND LIVAIN : D RESIDES GEANCHO NIFE IN LNKLA B'ERS ARE UNCHANGED. ; ;- BADLIN: .WRITE #OPOUT,#ERMES ;WRITE 'ENTRY ERROR' MESSAGE RETURN ;RETURN ;+ ; SUBROUTINE: CLEAR ; ; FORM OF CALL: JSR PC,CLEAR ; ; ACTION: CLEARS THE CRT SCREEN, LEAVING CURSOR HOME. ;- CLEAR: .WRITE #OPOUT,#CLRS ;CLEAR SCREEN RETURN .PAGE .SBTTL LINK BLOCKS & XFER BLOCK .WORD 0 ;ERROR RETURN - NULL OPOUT: .WORD 0 ;LINK BLOCK FOR CONSOLE OUTPUT .RAD50 /OPO/ ;DATASET NAME .BYTE 1 ;ONE WORD FOLLOWING .BYTE 0 ;UNIT NUMBER .RAD50 /KB / ;DEVIC(E POINTER SPAN= HIGH-LOW .IF LE,SPAN .ERROR ;INVALID HIGH./LOW. SPECIFICATION FOR POINT .IFF .IF GE,SPAN-10000 .ERROR ;INVALID HIGH./LOW. SPECIFICATION FOR POINT .ENDC .ENDC .IF NE,LOW ;IF LOW. IS NON-ZERO .= A$LOW+PINDEX .WORD LOW ;LOWEST VALUE .ENDC .= A$SPAN+PINDEX .WORD ^D16*SPAN ;16. TIMES SPAN. .= A$PWR+PINDEX .IF LT,PWR .IF GE,PWR+7 .BYTE PWR ;DEC. POSITION BYTE .IFF .ERROR PWR ;PWR. MUST BE GREATER THAN -7 .ENDC .IFF .IF LE,PWR-7 .BYTE PWR ;DEC. POSITION BY .> <3Q 1>,135 < ST ISNL .> ]3115,[3 < 3 ;> 3O. NP.EM TTHARHE1 . NOE ACRNFU <1Q 1>,135 < ST ISNL .> ]1115,[3 < 3 ;> 1O. NP.EM TTHARHE1 . NOE ACRNFU 245,<3S STLI.N ]>245,[3 < 3 ;> ENYGOXK ACST1 . NOE ACRNFU 142,,6700,154,<5S STLI.N ]>142,,6700,154,[5 < 3 ;> RESUESPR2 . NOS ESPRR TEIL D,GEANCHE BTOT OS COFR TEET LIDR TEEN STCOT NI U < E IN L> STCO TYTIANQU < Q OS,EMEHOE YT.B O RLNT CTEBY . HDST CESNMGE R DPDAS MEND E > :TEDAA AT DERNT : ? ) -6(1T ANPLH ICWH NTLA POLTRON CONTILUPOR TEWA D.GEANCHUNE AVLE+E NAME .WORD 0 ;ERROR RETURN - NULL OPIN: .WORD 0 ;LINK BLOCK FOR CONSOLE INPUT .RAD50 /OPI/ ;DATASET NAME .BYTE 1 ;ONE WORD FOLLOWING .BYTE 0 ;UNIT NUMBER .RAD50 /KB / ;DEVICE NAME .WORD 0 ;ERROR RETURN - NULL DTLNK: .WORD 0 ;LINK BLOCK FOR DECTAPE .RAD50 /DT / ;DATASET NAME .BYTE 1 ;ONE WORD FOLLOWING RUNIT: .BYTE 0 ;UNIT NUMBER .RAD50 /DT / ;DEVICE NAME XFRBLK: .WORD ^D271 ;'GLOBAL' TAPE AREA BLOCK NUMBER MEMAD: .WORD TLABEL ;BUFFER ADDRESS WC: .WORD 1 ;WORD,BYTE .IFF .ERROR PWR ;PWR. MUST BE LESS THAN +7 .ENDC .ENDC .= A$UNIT+PINDEX .WORD UNIT ;PNTR TO 'UNITS' STRING .ENDM APDEF .PAGE .MACRO PDEF POINT,LOW,HIGH,PWR,UNIT,ADC,NL APDEF POINT,LOW,HIGH,PWR,UNIT .IF LT,ADC .ERROR ADC ;INVALID A/D CHANNEL CODE .IFF .IF GT,ADC-63. .ERROR ADC ;INVALID A/D CHANNEL CODE .ENDC .ENDC .IF B,NL .T1= 0 .IFF .T1= 400*NL .ENDC .= A$CHAN+PINDEX .WORD ADC+ADC&76!!.T1 ;A/D & CHANNEL CODE, ; AND NON-LINEAR CODE PINDEX= PEFPD STLI .0 E YT.B 4>,1610,,750,154 < ST ISNL .> 4],1610,,750,154<[3 ; E>URSSRE P 1O. NSSRE PERLTFI ,3,577<1S W>161,10 < S> < Q 1>,737,146 < ST ISNL .> ]G375,7,17W[]E61,101[1] 717,136,[4 < 4 ;> NGRITEWADEO TOWFLE DGLU SEDENCKHI<1S F> < Q> 27 < ST ISNL .> 5][1]F27<[2 ; W>LO FNERILOCH 46<1S U>IDD,ELFIH AC EOR FUEAL VEW NERNTURHO S URHO ALRVTEIN ALOTENPMUIEQ < Q ,FD2HE MESNMGE A ATNDS MEND E !>T OREP REDFICIPE SOR FPETAN OTADAO ! ! E AP TCTREOR CNTOU MSEEAPL ! !EDEDNES IYYM-MMD- OR F/ COUNT FCN: .BYTE READ ;READ FUNCTION STAT: .BYTE 0 ;STATUS .WORD 0 ;RESIDUE WORD COUNT .WORD STATV ;PTR TO STATUS VARIABLE ; STATV: .WORD 0 ;STATUS VARIABLE .PAGE .SBTTL MESSAGES .NLIST BIN GENMES CLRS,F .BYTE CNTRLO .BYTE HOME,EOS .BYTE VERTAB ENDMES CLRS GENMES ERMES,F .BYTE CNTRLO LINE ENDMES ERMES GENMES IMES,F .BYTE CNTRLO LINE .BYTE HOME,EOS ;HOME AND CLEAR TO END OF SCREEN LINE LINE < A - LIST REPORT O0INDEX+2 ;ADVANCE POINT. INDEX .CSECT .ENDM PDEF .MACRO CPDEF POINT,LOW,HIGH,PWR,UNIT,FUNAD APDEF POINT,LOW,HIGH,PWR,UNIT .= A$FUN+PINDEX .WORD FUNAD PINDEX= PINDEX+2 ;ADVANCE POINT. INDEX .CSECT .ENDM CPDEF .PAGE .SBTTL ARRAY ALLOCATION .CSECT ANAC .GLOBL A$ADV ;ADC VALUE ARRAY A$ADV: BDWRD AENUM,<^D102> .GLOBL A$VAL ;CURRENT VALUE ARRAY A$VAL: BDWRD AANUM,0 .GLOBL A$ID ;IDENT. STRING PNTR ARRAY A$ID: .BLKW AANUM .GLOBL A$UNIT ;'UNITS' STRING PNTR ARRAY Q 3>,327 < ST ISNL .> 6]14U[ID]S337,[2 < 2 ;> ALDUSIREE INORHL,440 < ST ISNL .> 2],440<[2 ; N>GEXY OEDLVSOIS DNTUEFLEF TYDIBI < Q> 75 < S> < Q 0><4S STLI.N Y>ITID]B75 [0][4 < 2 ;> TYDIBIUR TNTUEFLEF 620,10 < ST ISNL .> 2],600[1 < 3 ;> 2O. NOWFLT ENLUFF EALINPETA < Q Y>-YMM-MDD FOS IPETAT ENESPR < Q :>0 T NI UOND TEUNMOE AP TNGRO :DYEA RENWHR CSSRE INGA ARY T.. .STUEEQ RRTPORED LIVAIN INGA ARY T.. .EDASERS INTMEOM CCTREORNCAIAGY TR. ..G ON LOO TIST ENMMCOR OU LINE < B - DATE AND TIME> LINE < LIST (/P FOR PRINTER):> LINE < C - CURRENT ALARMS> LINE < D - PROCESS VARIABLES> LINE < E - ANALOG LIMITS> LINE < F - MAINTENANCE LOG> LINE < VIEW/CHANGE:> LINE < G - LAB DATA> LINE < H - INSERT OPERATOR COMMENT> LINE < I - ALARM MESSAGE INHIBIT> LINE < J - ANALOG ALARM LIMITS> LINE < K - MAINT. INTERVAL / RESET OPERATION TIME> LINE < L - COST DATA> LINE ENDMES IMES GENMES DTRB,F .BYTE CNTRLO LINE LINE 610,10<[3 ; 1>. NOW LO FNTUEFLEFL NAFI 621,,776 < ST ISNL .> 2],6716,[7 < 4 ;> 2O. NOWFLE DGLU STEAS,6716,<7S STLI.N ]>611,,776<[4 ; 1>. NOW LO FGEUDSLE STWA 26 < S> 7,14 < ST ISNL .> 6][2]S,347[1 < 3 ;> DSLISOD DEENSPSUE DGLU SRNTURE F L,NG LESNMGE M CTCRS MEND E > : ?CTREOR CNTMEOM CHE TIS T:ENMMCOE IN LNE O AERNT FTHI SISTHS NTMEOM COR FLEABILVA AOMROE OR MNO ERAT LINGA ARYD;TELEMPCOT NOP UM DTADAS OUVIRE : ITIM LGHHIW NE : ITIM LOW L7URRENTLY IN PROGRESS> ENDMES DTRB GENMES FDTER,F .BYTE CNTRLO LINE Q UID1: LINE ENDMES FDTER GENMES DTOFF,F .BYTE CNTRLO LINE Q UID2: LINE ENDMES DTOFF GENMES AMES,F .BYTE CNTRLO LINE .BYTE HOME,EOS LINE LINE <1 - PLANT OPERATING SUMMARY - 00:00- 8:00> LINE <2 - PLANT OPERATING SUMMARY - 8:00-16:00> LINE <3 - PLANT OPERATING SUMMARY8LOBL C$MIN ;CURRENT MINIMUM ARRAY C$MIN: .BLKW AANUM .GLOBL C$MINT ;CURRENT MIN. TIME ARRAY C$MINT: .BLKW AANUM .GLOBL C$LTOT ;CURRENT LO-ORDER TOTAL ARRAY C$LTOT: .BLKW AANUM .GLOBL C$HTOT ;CURRENT HI-ORDER TOTAL ARRAY C$HTOT: .BLKW AANUM .GLOBL C$MM ;TEMP. VALUE FOR MAX/MIN DETERMINATION C$MM: .BLKW AANUM .GLOBL A$FUN ;'COMPUTED POINTS' FUNCTION ADDRESS ARRAY A$FUN= .-AENUM-AENUM BDWRD AINUM,0 PINDEX= 0 .CSECT TMP= .-1 ;TO PREVENT .ERROR ON FIRST APDEF CALL .PAGE .S71 < S> <4Q 7> < ST ISNL .> 1][7]4[7 < 4 ;> OWFLE DGLU S 4O. NERFIRILA<7S 3> < Q> <7S STLI.N ]>713[7]<[4 ; W>LO FGEUDSL3 . NOR IEIFARCL 71 < S> <2Q 7> < ST ISNL .> 1][7]2[7 < 4 ;> OWFLE DGLU S 2O. NERFIRILA<7S 1> < Q> <7S STLI.N ]>711[7]<[4 ; W>LO FGEUDSL1 . NOR IEIFARCL ? GEANCH : 6):5342: 1X.(EE IM TERNT : 4)-7AY MX.(ER EA Y &THON MERNT : 3)-7CT-O18. EX (TEDAR TEEN <:Q 2 OLSC2, 2ORRSCU E IN L LOTRCNE YT.B F 2,REFPS MEEN G REFPS MEND E ABRTVEE YT.B; - 16:00-24:00> LINE <4 - DAILY OPERATING REPORT> LINE <5 - MONTHLY OPERATING REPORT> LINE <6 - MONTHLY USAGE SUMMARY AND COST ESTIMATE> LINE ENDMES AMES GENMES NPH,F .BYTE CNTRLO CURSOR 23,0 .ASCII /PRESS FOR NEXT PAGE: / .BYTE VERTAB ENDMES NPH GENMES LPH,F CURSOR 23,0 .ASCII /PRESS WHEN FINISHED: / .BYTE VERTAB ENDMES LPH GENMES BMES,F .BYTE CNTRLO LINE ENDMES BMES GENMES SFAH,F .BYTE TAB,TAB LINE < OUT OF RANGE> <BTTL ANALOG POINT DEFINITIONS ;+ ; DEFINE ALL 'EXTERNAL' ANALOG POINTS HERE, ; AS IN THE FOLLOWING EXAMPLE: ; ; PDEF POINT,LOW,HIGH,PWR,UNIT,ADC,NL ; SB$ ; ; POINT- GLOBAL NAME OF POINT ; LOW- LOWEST VALUE POINT CAN HAVE ; HIGH- HIGHEST VALUE POINT CAN HAVE ; PWR- POWER OF TEN FACTOR ; UNIT- POINTER TO 'UNITS' STRING ; ADC- A/D CHANNEL NUMBER; 0. THRU 31. ARE 1ST A/D ; 32. THRU 63. ARE 2ND A/D. ; NL- IF BLANK OR ZERO, INDICATES LINEAR FUNCTION ; NON-ZERO IN P T IS.L 0TEBY .> 42 < S> <2Q 0><1S STLI.N ]>422[0][1 < 2 ;> ENYGOXD VEOLSSDI2 . NON SIBAN IOATER<4S 1> < Q> 10 < ST ISNL .> 2][4]110<[2 ; N>GEXY OEDLVSOIS D 1O. NINAS BONTIRAAE 263,<2S 2> < Q> 10 < ST ISNL .> 6],2232[0][1 < 3 ;> DSLISOD DEENSPSU2 . NON SIBAN IOATER,223 < S> <1Q 0><1S STLI.N ]>263,[2]110<[ L EOE YT.B > : < Q OLSC2, 2ORRSCU E IN L LOTRCNE YT.B F E,PR FESNMGE 2 RE PESDMEN > : 6)1- (T?OREP RCHHI):-L(A? ONTINCFUH ICWH : ?METIT ECRRCOE THD :DDDD:IS < Q LOTRCNE YT.B F M,TIVES MEEN G ATED VESDMEN > : ? E AT DCTREOR CHE TXXX-XXX-IS < Q LOTRCNE YT.B F T,DAVES MEEN G INTL DESDMEN > DDD::DDD : METI, X -XXX-XXX < Q2:TR? ENDMES SFAH GENMES FMES1,F .BYTE CNTRLO LINE CURSOR 21,0 LINE SCOL= . LIN SCOL= .-1-SCOL ENDMES FMES1 GENMES FMES2,F .BYTE CNTRLO CURSOR 20,0 LIN ENDMES FMES2 GENMES FMES3,F .BYTE CNTRLO .BYTE CAD YAD1: .BYTE 40 ;Y-COORDINATE: FILLED IN BY PROGRAM .BYTE 1 ;'FILL CHAR.' COMMAND .BYTE 40+0 ;X-COORDINATE .BYTE '( IDCH2: .BYTE SPACE ;FILLED IN BY PROGRAM Q <) DICATES NON-LINEAR FUNCTION ; ;- PDEF A026, 0., 600.,-1,U01,25. ;SB$ ; 2 <[55,136,15]> .NLIST S <55,136,15> .BYTE 0 .LIST PDEF A052,-80., 160.,-1,U02,42. ;SB$ ; 2 <[10]1 [21]> .NLIST S <10> Q <1 > S <21> .BYTE 0 .LIST PDEF A055,-80., 160.,-1,U02,46. ;SB$ ; 2 <[10]2 [21]> .NLIST S <10> Q <2 > S <21> .BYTE 0 .LIST PDEF A056, 0., 500., 1,U03,00. ;SB$ ; 3 <36,24> .BYTE 0 .LIST PDEF A521, 0., 200., 1,U08,27. ;SB$ ; 3 <[36,11]1> .NLIST S <36,11> Q <1> .BYTE 0 .LIST PDEF A522, 0., 200., 1,U08,28. ;SB$ ; 3 <[36,11]3> .NLIST S <36,11> Q <3> .BYTE 0 .LIST PDEF A523, 0., 200., 1,U08,29. ;SB$ ; 3 <[36,11]4> .NLIST S <36,11> Q <4> .BYTE 0 .LIST PDEF A524, 0., 200., 1,U08,30. ;SB$ ; 3 <[3DS >E:AT N!AIAGY TR. ..E IM TIDALNV N!AIAGY TR. ..E AT DIDALNV-DXX-XDD ,DDD::DDD < QS: T> T AEDILFAR WEPO < Q LOTRCNE YT.B S MEPFS MEEN G S5ME FESDMEN B TAER VTEBY . RYSAESEC NIF ;OL ETEBY . GESAES MORRR ETELEDE ;,020R SOUR C D>DDDD < Q1:AR VM RAOGPRY BIND LEIL FE:ATINRDOO-C;X0 4TEBY .2:AD> PRSTR2: Q < > ;FILLED IN BY PROGRAM CURSOR 20,0 ;DELETE ERROR MESSAGE .BYTE EOL ; IF NECESSARY .BYTE VERTAB ENDMES FMES3 GENMES FMES4,F .BYTE CNTRLO LINE CURSOR 21,0 Q LINE SCOL2= . Q LIN SCOL2= .-1-SCOL2 ENDMES FMES4 GENMES FMES5,F .BYTE CNTRLO .BYTE CAD YAD2: .BYTE 40 ;Y-COORDINATE: FILLED IN BY PROGRAM .BYTE 1 ;'FILL CHAR.' COMMAND XCeFJ *O*Kp:*OL+@#@*6x@쨀p@vp@,@Ԫp@*p@(GvhWh *& fEf f& f6x,"+&,*&&) EU% f&& @f&#,*L Zlv\  vpZ 쨀p lpv*r \65    (Ԫp*  \eԪp*   \  %Ԫp Ԫp   6 dJ *O*K$m*OLv@zy}@*쨀p@vp@,@(sh  *fEffE f& $v,$쨀p&$*&, %Df&&&f& zy},*Le XD   vpXr eeʉ%vJ *O*ax*OL