; UPDATE 6/27/72 ; UPDATE CALEND.S44 06.21.72 ; UPDATE 4/13/72 CALENDAR ;UPDATE: 8-FEB-72 ; ******************************************************************** ; * PROGRAM IDENTIFICATION: "CALENDAR" * ; * DATE & TIME-OF-DAY ROUTINE * ; * * ; * PURPOSE: * ; * ; UPDATE 6/22/72 RQUEST.S05 ; UPDATE 5/2/72 RQUEST.S04 ; UPDATE 1/18/72 RQUEST.S03 ; UPDATE 1/12/72 RQUEST.S02 ; UPDATE 11/8/71 RQUEST.S01 .TITLE RQUEST ;*********************************************************************** ;* * ;* PROGRAM IDENTIFICATION. RQUEST, CATALOG NO. ; * ;* REQUEST BUTTON INTERRUPT HANDLER ; UPDATE 1 14 MAR 1972 CLEAN UP ;***********************************************************************RCOM ; R O S C O M *RCOM ; *RCOM ; PROGRAM IDENTIFICATION: ROSCOM - CENTRALIZED ROS COMMAND STRING*RCOM ; PARSING. *RCOM ; *RCOM ; UPDATE 6/28/72 INPUT.S22 ; UPDATE 6/24/72 INPUT.S21 ; UPDATE 6/23/72 INPUT.S20 ; UPDATE 6/22/72 INPUT.S19 ; UPDATE 5/5/72 INPUT.S18 ; UPDATE 5/2/72 INPUT.S17 ; UPDATE 4/21/72 INPUT.S16 ; UPDATE 4/10/72 INPUT.S15 ; UPDATE 3/31/72 INPUT.S14 ; UPDATE 2/16/72 INPUT.S13 ; UPDATE 1/28/72 INPUT.S12 ; UPDATE 1/18/72 --KEEPS 24-HOUR CLOCK AND PERPETUAL CALENDAR UPDATED. * ; * --CALLS THE SCHEDULER ONCE A MINUTE, ON THE MINUTE. * ; * * ; * USAGE: * ; * TRIGGERED BY TIME-OF-DAY CLOCK INTERRUPT. * ; * IF TIME OR DATE IS ALTERED BY OUTSIDE PROGRAM(S), * ; * CPU MUST BE ON LEVEL 7 TO AVOID INTERFERENCE. * ; * ;* * ;* PURPOSE. THIS INTERRUPT HANDLER SERVES THE PURPOSE * ;* OF QUEUEING THE OPERATOR INPUT PROCESSING TASK 'INPUT' * ;* IN THE ROS TASK QUEUE. * ;* * ;* PROGRAM USAGE. THE LINKAGE TO THIS INTERRUPT HANDLER * ;* IS VIA THE PDP-11'S HARDWARE ; PURPOSE: ROSCOM, BY PROVIDING A COMMON, CENTRALIZED HANDLING OF*RCOM ; ALL ROS COMMAND STRING PARSING, GIVES A STANDARD, *RCOM ; CONSISTENT SYNTAX AND NON-REDUNDENCY IN CODE. *RCOM ; *RCOM ; METHOD: THE METHOD USED IS MODULAR. THE USER PERFORMS ALL *RCOM ; REQUIRED I/O. ROSCOM ENTRY POINTS PROVIDE THE *RCOM ; FOLLOWING SERVICES: INPUT.S11 ; UPDATE 12/20/71 INPUT.S10 ; UPDATE 12/15/71 INPUT.S09 ; UPDATE 12/11/71 INPUT.S08 ; UPDATE 12/10/71 INPUT.S07 ; UPDATE 12/2/71 INPUT.S06 ; UPDATE 11/12/71 INPUT.S05 ; UPDATE 11/10/71 INPUT.S04 ; UPDATE 11/8/71 INPUT.S03 ; UPDATE 11/1/71 INPUT.S02 ; UPDATE 10/8/71 INPUT.S01 .TITLE INPUT ;***************************** * WHEN READING TIME OR DATE, SAME PRECAUTION SHOULD * ; * BE TAKEN. * ; * PROGRAMMER: 52 * ; * VERSION:004.003 * ; * DATE: 13-APR-72 * ; * * ; * G U L F E L E C T R O N I C S Y S T E M S /SOFTWARE INTERFACE: * ;* * ;* BR4 * ;* VECTOR = 244 * ;* * ;* PROGRAMMER 54 * ;* DATE * ;* REVISION  *RCOM ; 1) DETERMINE THE NUMBER OF FIELDS IN A STRING. *RCOM ; 2) RETURN THE ADDRESS OF A SPECIFIED FIELD AND *RCOM ; ITS LENTH. *RCOM ; 3) RETURN VALUE OF A SPECIFIED NUMERIC FIELD. *RCOM ; *RCOM ; THESE FUNCTIONS ARE PROVIDED BY THESE ROUTINES: *RCOM ; ****************************************** ;* * ;* PROGRAM IDENTIFICATION. INPUT, CATALOG NO. ; * ;* OPERATOR INPUT PROCESSING. * ;* * ;* PURPOSE. THIS TASK WILL REQUEST AND ACCEPT OPERATOR REQUESTS * ;* FROM THE SYSTEM TTY; AND, IF PRECEDED BY A PROPER AUTHORIZATION* ;* CODE, THE REQU; UPDATE 6/22/72 CVTBIN.S03 ; UPDATE 11/8/71 CVTBIN.S02 ; UPDATE 10/8/71 CVTBIN.S01 .TITLE CVTBIN ;*********************************************************************** ;* * ;* PROGRAM IDENTIFICATION. CVTBIN, CATALOG NO. ; * ;* CONVERT ASCII TTY INPUT STRING TO BINARY INTEGER. * ;*  * ;* * ;*********************************************************************** .DEF RQUEST .REF QUEUE,RESTOR .DEF LOGMAX,PHYDEV,ALTDEV ; .ASECT .=244 .WORD RQUEST ; PC FOR REQUEST INTERRUPT .WORD 200 ; PSR TO LEVEL BR4 ; .CSECT ; ; ; ; RQUEST = . $SAVE ; SAVE ENVIR 1) NPARAM (EMT #29) *RCOM ; 2) SCAN (EMT #27) *RCOM ; 3) NUMFLD (EMT #28) *RCOM ; *RCOM ; USAGE: THE LINKAGE TO EACH ROUTINE IS: *RCOM ; *RCOM ; NPARAM: EST WILL BE PROCESSED. VALID OPERATOR REQUESTS, * ;* FORMAT AND FUNCTION ARE: * ;* * ;* FORMAT PROGRAM(SEGMENT)FUNCTION * ;* ************************************************************* * ;* CCCC INPUT INPUT OF AUTHORIZATION CODE * ;* EN,NNN ENABLE ENABLE SPECIFIED TASK * ;* DS,NNN * ;* PURPOSE. THIS SUBROUTINE WILL SERVE AS A UTILITY FOR * ;* THE OPERATOR INPUT PROCESSORS. IT WILL CONVERT THE * ;* NUMBER OF ASCII BYTES SPECIFIED (MAX. 5 + SIGN) TO A * ;* BINARY INTEGER VIA ASCBIN. * ;* * ;* PROGRAM USAGE. CVTBIN IS CALLED VIA: * ;* ONMENT-GET SYS. STACK MOV #$INPNO,-(SP) ; PUSH .IFNZ DPRTY CLR -(SP) ; ARGUMENTS FOR QUEUE .ENDC .IFNZ ARG TST -(SP) ; ONTO .ENDC CLR -(SP) ; STACK JSR PC,QUEUE ; QUEUE INPUT TST (SP)+ ; DISREGARD ERROR JMP RESTOR ; RESTORE ENVIRONMENT & EXIT ; ; PHYSICAL DEVICE TABLE ; LOGMAX: .W *RCOM ; MOV #STRING,-(SP) ; ADDRESS OF FIRST CHARACTER. *RCOM ; MOV NC,-(SP) ; NUMBER OF CHARACTERS. *RCOM ; EMT 29 ; NPARAM *RCOM ; MOV (SP)+,NUM ; GET NUMBER OF FIELDS. *RCOM ; *RCOM ; SCAN: *RCOM ;  DSABLE DISABLE SPECIFIED TASK * ;* QU,NNN QTASK QUEUE SPECIFIED TASK * ;* XX,NNN TABORT ABORT SPECIFIED TASK * ;* TM,HH:MM TIME SET TIME-OF-DAY * ;* TM TIME TYPE TIME OF DAY * ;* DT,MM/DD/YY DATE SET DATE * ;* DT DATE TYPE DATE * ;* * ;* JSR PC, CVTBIN * ;* WHERE: * ;* R5 = ADDRESS OF FIRST CHARACTER IN * ;* INPUT STRING TO CONVERT. * ;* R4 = NUMBER OF CHARACTERS TO CONVERT. * ;* * ;* UPON RETURN R4 = BINARY IN; UPDATE 6/22/72 IPL2.S27 ; UPDATE 5/17/72 IPL2.S26 ; UPDATE 5/16/72 IPL2.S25 ; UPDATE 5/16/72 IPL2.S24 ; UPDATE 5/5/72 IPL2.S23 ; UPDATE 5/2/72 IPL2.S22 ; UPDATE 4/17/42 IPL2.S21 ; UPDATE 4/14/72 IPL2.S20 ; UPDATE 4/12/72 IPL2.S19 ; UPDATE 4/10/72 IPL2.S18 ; UPDATE 4/5/72 IPL2.S17 ; UPDATE 3/23/72 IPL2.S16 ;  MOV NTH,-(SP) ; # OF REQUIRED FIELD. *RCOM ; MOV #STRING,-(SP) ; ADDRESS OF FIRST CHARACTER. *RCOM ; MOV NC,-(SP) ; NUMBER OF CHARACTERS. *RCOM ; EMT 27 ; SCAN *RCOM ; MOV (SP)+,FIELD ; ADD. OF FIRST CHAR. IN FIELD.*RCOM ; ; IF 0, FIELD IS VOID OR *RCOM ; ; NONEXISTENT.ORD 12. ; LARGEST VALID LOGICAL DEVICE NO. PHYDEV: .WORD 040000 ; TTY 3 AVAL.,ALT. AVIL .WORD 000400 ; DISC 0 AVAIL., NO ALT. .WORD 100000 .WORD 100000 .WORD 040001 ; TTY 1 AVAIL, ALT. AVAIL ; FOR DECTAPES - 1 CONTROLLER .WORD 2000,2001,2002,2003,2004,2005,2006,2007 ; ALTERNATE DEVICE TABLE ; ; ALTDEV: .WORD 4,0,0,0,0 .WORD 0,0,0,0,0,0,0,0 ; FOR DECTAPES - 1 CONTR RE,YYY RESET RESET DEVICE AVAILABLE * ;* EX INPUT TERMINATE INPUT * ;* C/R TERMINATE INPUT * ;* * ;* WHERE: CCCC IS FOUR-DIGIT AUTHORIZATION CODE * ;* NNN IS A 1-3-DIGIT TASK NUMBER * ;* HH IS TWO-DIGIT HOUR * TIME * UPDATE 3/21/72 IPL2.S15 ; UPDATE 3/20/72 IPL2.S14 ; UPDATE 3/17/72 IPL2.S13 ; UPDATE 3/13/72 IPL.S12 ; UPDATE 2/16/72 IPL2.S11 ; UPDATE 1/19/72 IPL2.S10 ; UPDATE 1/12/72 IPL2.S09 ; UPDATE 12/11/71 IPL.S08 ; UPDATE 12/10/71 IPL.S07 ; UPDATE 12/2/71 IPL.S06 ; UPDATE 11/18/71 IPL.S05 ; UPDATE 11/15/71 IPL.S04 ; UPDA *RCOM ; MOV (SP)+,LENTH ; # OF CHARACTERS IN FIELD. *RCOM ; MOV (SP)+,ERROR ; STATUS CODE *RCOM ; ; =0 REQUEST COMPLETED *RCOM ; ; >0 FIELD NONEXISTENT. *RCOM ; ; VALUE IS # OF EXISTING *RCOM ; ; FIELDS. *RCOM ; OLLER ; .END ! ;* MM IS TWO-DIGIT MINUTE * TIME * ;* MM IS TWO-DIGIT MONTH * DATE * ;* DD IS TWO-DIGIT DAY * DATE * ;* YY IS TWO-DIGIT YEAR * DATE * ;* YYY IS A 1-3 DIGIT LOGICAL DEVICE NO. * ;* * ;* END OF MESSAGE WILL BE A CARRIAGE RETURN. "TE 11/12/71 IPL.S03 ; UPDATE 11/11/71 IPL.S02 ; UPDATE 11/10/71 IPL.S01 .TITLE IPL ;*********************************************************************** ;* * ;* INITIAL PROGRAM LOAD WILL INITIALIZE THE ROS SYSTEM AND * ;* THEN EXIT TO DISPATCH. THIS MODULE SHOULD BE EXECUTED * ;* BEFORE ENTERING ROS FOR THE FIRST TIME. * ;* # *RCOM ; NUMFLD: *RCOM ; MOV NTH,-(SP) ; # OF REQUIRED FIELD. *RCOM ; MOV #STRING,-(SP) ; ADDRESS OF FIRST CHARACTER. *RCOM ; MOV NC,-(SP) ; NUMBER OF CHARACTERS. *RCOM ; EMT 28 ; NUMFLD *RCOM ; MOV (SP)+,VALUE ; VALUE OF FIELD, IFTEGER * ;* * ;* HOWEVER IF R5 = 0, AN ERROR OCCURRED DURING THE * ;* CONVERSION. REGISTERS R0-R3 WILL NOT BE DESTROYED * ;* * ;* THE FOLLOWING NO.S WILL ALL BE CONVERTED TO 9. * ;* 00009 R4=5 * ;* 00% * ;* * ;* PROGRAM USAGE. INPUT WILL BE CONSTRUCTED SUCH THAT * ;* IF IN A DISC SYSTEM, IT WILL BE AN OVERLAY * ;* TASK WITH SEGMENTS. INPUT IS PLACED IN THE ROS * ;* SOFTWARE TASK QUEUE WHENEVER A "REQUEST" INTERRUPT * ;* OCCURS. IF WHILE WAITING FOR INPUT, TTY MAX SECONDS * ;* HAVE ELAPSED, INPUT WILL BE ABORTED. IT WILL BE & * ;* PROGRAMMER 51,52,53 AND 54 * ;* DATE 11/9/71 * ;* REVISION ;* REVISION * ;* * ;*********************************************************************** .DEF IPL,SSTACK .DEF DYNSIZ ' NUMERIC. *RCOM ; MOV (SP)+,ERROR ; STATUS CODE *RCOM ; ; =-2 VOID FIELD *RCOM ; ; =-1 NON-NUMERIC FIELD *RCOM ; ; = 0 REQUEST COMPLETED *RCOM ; ; > 0 FIELD NONEXISTENT. *RCOM ; ; VALUE IS # OF EXISTING*RCOM ; (; UPDATE 11/8/71 BINASC.S02 ; UPDATE 10/8/71 BINASC.S01 .TITLE BINASC ;*********************************************************************** ; ; BINASC, CATALOG NUMBER ;BINARY TO ; ASCII CONVERSION SUBROUTINE. ; ; THIS SUBROUTINE CONVERTS A SIGNED 15-BIT BINARY ; INTEGER TO STANDARD 8-BIT U.S. ASCII CODE. THE ; CONVERTED ASCII IS PACKED ONE CHARACTER PER BYTE, ; WHICH IS STORED IN A SIX BYTE ARRAY SPECIFIED BY )NECESSARY * ;* FOR THE OPERATOR TO REQUEST AGAIN. * ;* * ;* PROGRAMMER 54 * ;* DATE * ;* REVISION * ;* * ;************************************************ ; # BYTES IN DYNAMIC POOL .DEF BEGDYN,ENDDYN,DYSINI .REF CLINIT .REF RQUEST,SAVE,DSPTCH,TPRTY,HEADER .REF PFSIPL,PSTIPL .REF TSTAT,SYSINI,DINT .REF EMTINIT .REF PRTINT,KBDINT ;TTYIO PRINTER AND KEYBOARD ;INTERRUPT ROUTINES .REF TTINIT ;TTYIO INITIALIZATION SUBROUTINE .IFG NLP ; ONLY IF HAVE LINE PRINTERS .REF LPINIT + ; FIELDS. *RCOM ; *RCOM ; SUBROUTINES USED: PUSHR, POPR, ASCBIN *RCOM ; *RCOM ; REGISTERS USED: ALL REGISTERS ARE RESTORED. *RCOM ; *RCOM ; SYNTAX: THE SYNTAX OF A ROS COMMAND STRING IS ONE OR MORE , ; THE CALLING PROGRAM. ; CALLING SEQUENCE: ; ; MOV INTEGR,-(SP) ; MOV # STRING,-(SP) ; EMT BINASC ; ; WHERE: INTEGR = SIGNED BINARY INTEGER ; # STRING = ADDRESS OF ASCII BYTE STRING ; ; REGISTERS R0 THRU R5 ARE SAVED IN THE STACK ; AREA (SP) AND RESTORED UPON EXIT. ; ; ; PROGRAMMER 54 ; DATE ; REVISION ; ;**************************************************************-************************ .DEF INPUT,OPCOMR,ER3MSG,DATADR,TTYLST,INPTHD .DEF TTRLST .REF ENABLE,DSABLE,QTASK .REF TABORT,TIME,DATE .REF IOSTAT,TPRTY,HEADER .REF RESET,TSTAT TTYOUT = 13 TTYIN = 14 ASCBIN = 17 EXIT = 4 NOCKPT = 30 QUEUE = 1 ; .CSECT ; NSIZE = 50. ; TASK STACK SIZE ; ; MXCHIN = 24. ; MAXIMUM NO. CHAR. DURING INP. .ENDC .IFG NCR ; ONLY IF HAVE CARD READERS .REF CRINIT .ENDC .IFNZ $DTAPE .REF DTINT .ENDC ; .CSECT .IFZ OVRLAY SSTACK = . ; BEGIN SYSTEM STACK HERE FOR ROS I .ENDC PSR = 177776 ; PROCESSOR STATUS REGISTER EQUATE PSBENB = 165400 ; DEVICE ADDRESS AT WHICH TO ENABLE ; ; MANUAL PUSHBUTTON / *RCOM ; ALPHANUMERIC FIELDS, SEPERATED BY COMMAS AND TERMINATED*RCOM ; BY THE END OF THE STRING. BLANKS ARE NOT COMPRESSED *RCOM ; AND ARE TREATED AS NON-NUMERIC CHARACTERS. *RCOM ; *RCOM ; PROGRAMMER: 53 *RCOM ; VERSION: 1 *RCOM ; DATE: 17 JAN 72 0********* .DEF BINASC .REF PUSHR,POPR ; .CSECT ; ; PLUS=53 MINUS=55 SPACE=40 ZERO=60 ; DIVTAB: .WORD 10000. ;DECIMAL DIVISION TABLE .WORD 1000. .WORD 100. .WORD 10. .WORD 0 ; ; BINASC = . JSR R5,PUSHR ; SAVE REGISTERS MOV 16.(SP),R4 ; R4 = INTEGER MOV 14.(SP),R5 ; R5 = ADDRESS OF STRING MOV #DIVTAB,R01UT .PAGE ; ; THE FOLLOWING LIST IS THE TASK HEADER FOR INPUT ; INPTHD = . .WORD 1. ; THREAD WORD .WORD INPUT ; ENTRY POINT .WORD 0 ; NO INITIALIZATION ENTRY .WORD 0 ; NO MAX. EXECUTION TIME .BYTE NSIZE ; TASK STACK SIZE .BYTE 1 ; PRIORITY 1-HIGHEST .WORD 0 ; CURRENT TIMER VALUE .IFNZ ARG .WORD 02; ; INTERRUPT VECTOR EQUATES ; MPSHBT = 244 ; MANUAL PUSHBUTTON MPSHLV = 200 ; BR4 FOR MANUAL PUSHBUTTON .IFZ $SAVE-3 ; ONLY IF REAL SAVE (BPT TRAP) SAVTRP = 14 ; SAVE TRAP .ENDC .IFZ $SAVE-104400 ; ONLY IF ODT SAVE (TRAP TRAP) SAVTRP = 34 .ENDC SAVLEV = 340 ; SAVE UNDER LOCKOUT .CSECT .CRINT .CSECT .LPINT .CSECT .SYSIN 3 *RCOM ; CATALOGUE NUMBER: *RCOM ; *RCOM ;***********************************************************************RCOM .TITLE ROSCOM RCOM ; RCOM CSAVE = 12. ;OFFSET FOR PUSHR/POPR REG SAVE 4 ;R0=DIVISION TABLE ADDRESS TST R4 ;IS INTEGER NEGATIVE? BMI BTA050 ;YES MOVB #PLUS,(R5)+ ;NO-SET PLUS SIGN AND BUMP BTA010: MOVB #SPACE,R1 ;R1=ZERO SUPPRESS BYTE REGISTER BTA020: CLR R2 ;INITIALIZE SUBTRACTION COUNTER BTA030: SUB (R0),R4 ;SUBTRACT DIVISOR FROM INTEGER BPL BTA060 ADD (R0)+,R4 ;ADD BACK & BUMP DIVISOR POINTER TST R2 BEQ BTA5 ; TRANSMITTED ARGUMENT .ENDC .BYTE 5 ; CENTRAL PROCESSOR STATUS REG.-FILE TYPE .BYTE $INPNO ; TASK NO. .WORD 0 ; SAVED VALUE OF STACK POINTER TSTACK = . .WORD 203 ; FILE ID .WORD 0,0,0,0,0,0,0,0,0,0 ; .WORD 0,0,0,0,0,0,0,0,0,0 ; WORDS FOR TASK STACK .WORD 0,0,0,0,0,0,0,0,0,0 ; .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,6 .CSECT .DYSIN .CSECT .QUEUE .CSECT .EMTIN .CSECT .CLINT .CSECT .TTYIN .CSECT .MAIN. ; START OF CODE. MUST BE AFTER OTHER NAMED ; IPL = . RESET ; SEND INIT PULSE TO ALL DEVICES MOV #340,PSR ; SET CPU LEVEL TO 7 DURING IPL MOV #SSTACK,SP ; SET UP SYSTEM STACK .IFNZ OVRLAY CMP SP,#3000 ; MAKE SURE ROOM IN THIS SYSTEM FOR 7RCOM NC = CSAVE+2 ;OFFSET TO FIRST ARG(# CHARACTERS) RCOM STRING = NC+2 ;OFFSET TO STRING ADDRESS RCOM NTH = STRING+2 ;OFFSET TO FIELD NUMBER RCOM FIELD = CSAVE+2 ;OFFSET TO ADD OF FIELD RCOM NUM = CSAVE+4 ;OFFSET TO NUMBER OF FIELDS RCOM LENTH = CSAVE+4 ;OFFSET TO LENTH OF FIELD RCOM VALUE = CSAVE+4 ;OFFH040 MOV #ZERO,R1 ;STOP ZERO SUPPRESSION BTA040: ADD R1,R2 ;CALCULATE ASCII BYTE MOVB R2,(R5)+ ;SET IN STRING AND BUMP TST (R0) BNE BTA020 ;NOT FINISHED ADD #ZERO,R4 ;MAKE SURE UNITS SIGNIFICANT MOVB R4,(R5) ;PUT IN UNITS POSITION MOV 12.(SP),16.(SP) ; SET UP STACK FOR RETURN JSR R5,POPR ; RESTORE REGISTERS CMP (SP)+,(SP)+ ; STACF0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 .WORD 0,0,0,0,0,0,0,0,0,0 . = TSTACK+NSIZE+NSIZE ; DELETE THOSE NOT NEEDED ; ; THE FOLLOWING IS USED FOR ASCII TO BINARY CONVERSIONS ; ASCII = . .BYTE 0,0,0,0,0,0 ; ASCII STRING STORAGE ; RCFLG: .WORD 0 ; RESET/COMPRESS FLAG ; ; 0=RESET ; ; 1=CMPRS ; .IFNZ $BATCH ; ; BFUP COMMG BGE IPLA10 ; SPECIFIED DYNAMIC CORE POOL SIZE. HALT ; NOT ENOUGH. BAD BAD BAD IPLA10: .ENDC .IFZ $SAVE-104400 MOV 14,-(SP) MOV 16,-(SP) .ENDC JSR PC,PSTIPL ; TRAP INIT. .IFZ $SAVE-104400 MOV (SP)+,16 MOV (SP)+,14 .ENDC JSR PC,PFSIPL ; FOWER FAIL INIT. ; ; SET UP INTERRUPT AND TRAP VECTORS ; MOV #RQUEST,ESET TO VALUE OF NUMERIC FIELD RCOM ERROR = VALUE+2 ;OFFSET TO STATUS CODE RCOM .PAGE RCOM ; THIS SUBROUTINE, 'NPARAM', COUNTS THE NUMBER OF FIELDS IN A ROS RCOM ; COMMAND STRING AND RETURNS THE VALUE TO THE CALLER. ALL USED RCOM ; REGISTERS ARE RESTORED. RCOM ; RCOM """""""""""""""""""""""""""""DD """""""""""""""""""@DDDDDDDDDDDDDDD "@DDDD@DD DDDDDDDD@@DDDDDDDDADDB Ct!3|<=sL"{}r%P6.:`{0D {} :{}g ; {6$Hv@{6L p[qj{6k{QD{6t}C {6""{6}{u~#" |}8\! |Lu~@{}Vpp߸{YRw,4d6'X4d}Zf6+;q Q6,6B~6; {6 $D0WBcc8a ͋,L w:B ` 5 &  E >w   f5eU@  [*   & * G &( 8L'4e Q$ BBB"   U@ U e  "U%Gef. U U Bb 0 * BI .DEF NPARAM ; RCOM .REF PUSHR,POPR ; RCOM ; RCOM ; NPARAM'S STACK LOOKS AS FOLLOWS: RCOM ; RCOM ; RCOM ; STRING ADD. AT CALL JUNICATIONS BLOCK ; BFBLCK = . .WORD 0 ; ERROR WORD .WORD $BCHID ; BATCH FILE ID .WORD 0,0 ; ELEMENT NAME .WORD 1 ; FORCE INIT. .WORD 0,0 ; NOT USED BY BFINIT ; .ENDC .PAGE ; ; THE FOLLOWING CONTROL SECTION CONTAINS THE TABLES AND ; MESSAGES FOR INPUT I/O. THIS WILL BE CORE-RESIDENT IN ; A CORE OR OVERLAY SYSTEM SUCH THAT INPUT MAY BE KMPSHBT ; SET UP HANDLER FOR MANUAL PUSHBUTTON MOV #MPSHLV,MPSHBT+2 MOV #SAVE,SAVTRP ; SET UP SAVE TRAP HANDLER MOV #SAVLEV,SAVTRP+2 .IFGE NTTYS-1 MOV #200,R1 ;INIT INTERRUPT VECTORS FOR MOV #KBDINT,60 ;TTY UNIT 0 MOV R1,62 MOV #PRTINT,64 MOV R1,66 .ENDC .IFGE NTTYS-2 INC R1 ;INIT INTERRUPT VECTORS FOR MOV #KBDK OK NOW RTS PC ; RETURN TO CALLER ; ; BTA050: MOVB #MINUS,(R5)+ ; SET MINUS SIGN AND BUMP NEG R4 ;SET INTEGER POSITIVE BR BTA010 ; BTA060: TSTB (R2)+ ;BUMP SUBTRACTION COUNTER BR BTA030 ; ; .END M RCOM ; # CHARACTERS RCOM ; PC FOR RETURN <=SP RCOM ; R5 AFTER PUSHR RCOM ; R4 RCOM ; R3 RCOM ; R2 RCOM ; N; CHECKPOINTED DURING TTY I/O. ; .CSECT RES ; ; THE FOLLOWING LIST IS THE I/O PARAMETER LIST USED FOR ; TTY I/O ; TTYLST = . .WORD 1 ; THREAD WORD .BYTE SYSTTY ; LOGICAL DEVICE .BYTE 2 ; USE EXIT TYPE #2 -ALL TTY I/O .WORD 0 ; NO I/O COMPLETE ROUTINE .BYTE 0 ; NO ERROR TASK NO. .BYTE 1 ; USE TTY PRIORITY QUEUES INERR: .WOINT,340 ;TTY UNIT 1 MOV R1,342 MOV #PRTINT,344 MOV R1,346 .ENDC .IFG NTTYS-2 XXXXXX ;CREATE ASSY ERROR IF NTTYS .GT. 2 .ENDC .IFNZ NDISCS .IFZ $DDSDC ; ONLY FOR RF-11 DISK MOV #DINT,204 ; SET UP FOR DISC 0 MOV #240,206 ; AT INTERRUPT LEVEL 5 .ENDC .IFNZ $DDSDC ; ONLY FOR DDS DISK MOV #DINP; UPDATE 12/2/71 SAVE.S06 ; UPDATE 11/8/71 SAVE.S05 ; UPDATE 11/5/71 SAVE.S04 ; UPDATE 11/3/71 SAVE.S03 ; UPDATE 10/8/71 SAVE.S02 ; UPDATE 9/15/71 SAVE.S01 .TITLE SAVE ;*********************************************************************** ;* * ;* PROGRAM IDENTIFICATION. SAVE, CATALOG NO. ; * ;* SAVE EQ R1 RCOM ; R0 <=SP RCOM ; RCOM ; # FIELDS READY FOR RETURN RCOM ; PC FOR RETURN <=SP RCOM ; RCOM NPARAM =. ; ENTRY POINT RORD 0 ; FOR SYSTEM USE - SYSTEM .WORD 0 ; FOR SYSTEM USE - SYSTM2 DATADR: .WORD 0 ; WILL CONTAIN ADDRESS OF DATA BUFFER ; ; INPUT TTY INPUT BUFFER ; INBUF = . .WORD MXCHIN ; MAXIMUM INPUT RESPONSE NOCHAR: .WORD 0 ; USED BY TTYIN BUFST = . ; MESSAGE STARTS HERE .BYTE 0,0,0,0,0,0,0,0,0,0 ; ADD .BYTE 0,0,0,0,0,0,0,0,0,0 ; MORE .BYTE ST,530 ; DISC 0 MOV #240,532 ; AT LEVEL 5 .ENDC .ENDC .IFNZ $DTAPE MOV #DTINT,214 ; SET UP VECTOR FOR MOV #300,216 ; THE DECTAPE .ENDC ; ; XFER TO OTHER INITIALIZATION SUBROUTINES ; JSR PC,EMTINIT ; FILL UNDEFINED EMT REFS WITH ERROR RETURN JSR PC,TTINIT ;INITIALIZE TTYIO TABLES JSR PC,CLINIT ;INIT FOR CLOCK ROUTINES TNVIRONMENT FOR INTERRUPT HANDLER. * ;* * ;* PURPOSE. THIS SUBROUTINE WILL SAVE AN ENVIRONMENT * ;* (GENERAL REGISTERS) FOR AN INTERRUPT ROUTINE. IT IS THIS * ;* SUBROUTINE'S RESPONSIBILITY TO DETERMINE IF THE STACK * ;* REGISTER ALREADY CONTAINS THE CURRENT VALUE OF THE SYSTEM STACK* ;* OR WHETHER IT SHOULD BE LOADED WITH IT. * ;* U RCOM JSR R5,PUSHR ; SAVE ALL REGISTERS RCOM MOV NC(SP),R4 ; GET NUMBER OF CHARACTERS IN FIELD. RCOM MOV STRING(SP),R5 ; GET THE ADDRESS OF THE CHAR, STRING. RCOM ADD R5,R4 ; CONVERT R4 TO ADDRESS OF STRING END. RCOM CLR R1 ; CLEAR COMMA COUNTER RCOM NPRA10: JSR PC,GETCOM ; LOOK FOR A COMMA. RCOM INC V 0,0,0,0,0,0,0,0,0,0 ; IF .BYTE 0,0,0,0,0,0,0,0,0,0 ; GREATER .BYTE 0,0,0,0,0,0,0,0,0,0 ; THAN 50 REQUIRED . = BUFST+MXCHIN ; DELETE THOSE NOT NEEDED .EVEN ; ; THE FOLLOWING LIST IS THE I/O LIST FOR THE READY MESSAGE ; PRINTOUT WITH AN EXIT TYPE ONE SO AN EXIT TYPE 2 REQUEST ; CAN BE MADE IMMEDIATELY AFTERWARDS.***UNTIL WE CAN ; COMMAND CHAIN LISTS ON TTY. ; TTRLST = . .WORD 1 W .IFNZ OVRLAY JSR PC,DYSINI ; INIT. DYNAMIC STORAGE ALLOCATOR .ENDC .IFG NLP ; ONLY IF HAVE LP JSR PC,LPINIT .ENDC .IFG NCR ; ONLY IF HAVE CARD READER JSR PC,CRINIT .ENDC .IFNZ NDISCS .REF AUFCN,AULIST,DISCIO,INIDSC .REF CDIFCN,CDILST .REF TASKS,$TKFLS,$TKFLF CLR PSR ; RESET LOCKOUT SO DISC INTERRUPT X * ;* PROGRAM USAGE. THE LINKAGE TO SAVE SHALL BE THRU: * ;* * ;* SAVE * ;* WHICH IS A ROS MNUEMONIC FOR THE UN-NAMED TRAP INSTRUCTION * ;* 000003 BASE 8. UPON RETURN, REGISTER 5 (R5) WILL CONTAIN * ;* THE ADDRESS OF RESTOR SO THAT AN INTERRUPT ROUTINE *Y R1 ; INCREMENT COUNTER. ALWAYS AT LEAST RCOM TST R0 ; 1 FIELD. WAS A COMMA FOUND? RCOM BNE NPRA10 ; YES. LOOK FOR ANOTHER. RCOM MOV R1,NUM(SP) ; STORE # FOUND FOR CALLER. RCOM NPRF10: JSR R5,POPR ; RESTORE REGISTERS. RCOM NPRF20: MOV (SP)+,(SP) ; MOVE RETURN ADDRESS UP FOR RETURN. RCOM RTS PC ; GO BACK TO CALLER. Z ; THREAD WORD .BYTE SYSTTY ; LOGICAL DEVICE .BYTE 1 ; USE EXIT TYPE 1 .WORD 0 ; NO I/O COMPLETE REOUTINE .BYTE 0 ; NO ERROR TASK NUMBER .BYTE 1 ; USE TTY PRIORITY QUEUES .WORD 0 ; SYSTEM .WORD 0 ; SYSTM2 .WORD RDYMSG ; READY MESSAGE '? ' ; ; AUTHORIZATION CODE REQUEST MESSAGE ; ACMSG = . [; ; MAY BE RECEIVED CLRB AUFCN ; SET TO READ ALLOCATION FILE TYPE DIR. MOV #AULIST,-(SP) JSR PC,DISCIO ; READ FILE TYPE DIRECTORY IPLX20: CMP #1.,AULIST ; I/O COMPLETE? BNE IPLX20 ; NO-KEEP CHECKING MOVB #1.,AUFCN ; PUT BACK FCN AS WRITE IN LIST CLRB CDIFCN ; SET TO READ CORE DIRECTORY IMAGE MOV #CDILST,-(SP) JSR PC\ ;* NEED NOT BE 'LOADED' WITH ROS. REGISTER 4 (R4) WILL * ;* CONTAIN THE PS OF THE INTERRUPTED ENVIRONMENT. REGISTER * ;* 3 (R3) WILL CONTAIN THE PC OF THE INTERRUPTED ENVRIONMENT. * ;* * ;* PROGRAMMER 54 * ;* DATE * ;* REVISION ] RCOM .PAGE RCOM ; THIS SUBROUTINE, 'SCAN', RETURNS TO THE CALLER THE THE ADDRESS OF, ANDRCOM ; THE NUMBER OF CHARACTERS IN, A SPECIFIED FIELD. ALL REGISTERS ARE RCOM ; RESTORED. RCOM ; RCOM .DEF SCAN ; RCOM .REF PU^ .WORD 5. .WORD 0 .BYTE 15 .ASCII /AC:/ .BYTE 15 ; CARRIAGE RETURN .EVEN ; ; READY RESPONSE ; RDYMSG = . .WORD 3. .WORD 0 .BYTE 15 .ASCII /? / ; ? SPACE .EVEN ; ; ILLEGAL COMMAND ERROR MESSAGE ; ER1MSG = . .WORD 9. .WORD 0 .ASCII /ILL CMD!/ .BYTE 15 .EVEN ; ; ILLEGAL PARAMETER ERRO_,DISCIO ; READ CORE DIRECTORY IMAGE INTO CORE DIR. IPLX30: CMP #1.,CDILST ; I/O COMPLETE? BNE IPLX30 ; NO-KEEP CHECKING MOVB #1.,CDIFCN ; RESET FCN IN LIST BACK TO WRITE CLRB $TKFLF ; SET UP TO READ TASK TABLE MOV #$TKFLS,-(SP) JSR PC,DISCIO ; READ TASK TABLE IPLX40: CMP #1.,$TKFLS ; I/O COMPLETE? BNE IPLX40 MOVB #3.,$TKFLF ; SET BACK AS WRITE WITH WRITE` * ;* * ;*********************************************************************** .DEF NINT,SAVE,TSKSTK .REF ACTIVE,QSAVEI,RESTOR,MFLAG,STACK .REF SBSYNA ; .ASECT . = 14 ; TRAP VECTOR ADDRESS FOR SAVE .WORD SAVE ; PC .WORD 340 ; PSR- PRIORITY LOCKOUT DURING SAVE ; .CSECT ; NINT: .WORD -1. aSHR,POPR ; RCOM ; RCOM ; SCAN'S STACK LOOKS AS FOLLOWS: RCOM ; RCOM ; FIELD # AT CALL RCOM ; STRING ADD. RCOM ; # CHARACTERS bR MESSAGE ; ER2MSG = . .WORD 9. .WORD 0 .ASCII /ILL PAR!/ .BYTE 15 .EVEN ; ; CANNOT PERFORM FCN BECAUSE TASK Q'ED OR ACTIVE ; ER3MSG = . .WORD 14. .WORD 0 .ASCII /NON-QUIESCENT/ .BYTE 15 .EVEN ; .CSECT .PAGE .IFZ $DEBUG ; ; AUTHORIZATION CODE TABLE ; ; ; AUTHORIZATION CODE ASSIGNMENTS ; AC0000 = 0. AC0001 = 1. ACc CHECK JSR PC,SYSINI ; INIT. CORE TASKS ; ; SET UP INIDSC IN TASK TABLE MOV #$INITD,R0 ; TASK NUMBER MOVB #1,TPRTY(R0) ; RUN AT PRIORITY 1 ASL R0 MOV #INIDSC,HEADER(R0) ; TASK'S HEADER ADDRESS CMP #$INITD,TASKS BLE IPLX60 MOV #$INITD,TASKS IPLX60 = . .ENDC CLR R0 CLR R1 CLR R2 CLR R3 CLR d ; NO. OF INTERRUPTS STACKED ; PSSAVE: .WORD 0 ; USED TO SAVE PS OF INTERRUPT VECTOR PCSAVE: .WORD 0 ; USED TO SAVE PC OF INTERRUPT VECTOR OLDPSR: .WORD 0 ; USED TO SAVE OLD PSR OF ENVIRONMENT OLDPC: .WORD 0 ; USED TO SAVE OLD PC OF ENVIRONMENT TSKSTK: .WORD 0 ; USED TO SAVE VALUE OF TASK'S ; ; STACK IF MFLAG SET ; SAVE = . MOV 6.(SP),OLDPSR ; SAVE PS OF ENV.e RCOM ; PC FOR RETURN <=SP RCOM ; R5 AFTER PUSHR RCOM ; R4 RCOM ; R3 RCOM ; R2 RCOM ; R1 RCOM ; R0 f0002 = 2. AC0003 = 3. AC0004 = 4. AC0005 = 5. AC0006 = 6. AC0007 = 7. AC0008 = 8. AC0009 = 9. AC0010 = 10. AC0011 = 11. AC0012 = 12. AC0013 = 13. AC0014 = 14. AC0015 = 15. AC0016 = 16. AC0017 = 17. AC0018 = 18. AC0019 = 19. AC0020 = 20. ; ; EXPAND IF MORE THAN 20 ASSIGNMENTS ; AUTCOD = . .WORD AC0000 .WORD AC0001 gR4 CLR R5 MOVB #200,PSBENB ; ENABLE MANUAL PUSHBUTTON INTERRUPT JMP DSPTCH ; FINISHED WITH IPL-EXECUTE ROS ; ; ; ; .IFNZ OVRLAY ENDDYN = . - 2 ; TOP ADDRESS OF DYNAMIC CORE POOL ; SSTACK = ENDDYN - $DYNSZ ; TOP STACK ADDRESS FOR ROS II & III ; BEGDYN = SSTACK ; LOWEST ADD. OF DYNAMIC CORE POOL. .ENDC ; ; DYNSIZ: .WORD $DYNSZ ; NUMBER OF BYTES IN CORE POOL h MOV (SP)+,PCSAVE ; SAVE PC AND PS FOR RETURN RTI MOV (SP)+,PSSAVE ; POP OFF STACK MOV (SP),OLDPC ; SAVE PC OF ENVIRONMENT INC NINT ; BUMP NO. INTERRUPTS STACKED BNE SAVE20 ; NOT FIRST ONE-ALREADY ON SYSTEM STACK TST ACTIVE ; INTERRUPT A TASK? BEQ SAVE30 ; NO-SYSTEM QUIESCENT-POINTING TO S.S TST MFLAG ; TASK LOCKOUT SET? BNE SAVEi <=SP RCOM ; RCOM ; ERROR CODE READY FOR RETURN RCOM ; # CHAR. IN FIELD RCOM ; ADD. OF FIELD RCOM ; PC FOR RETURN <=SP RCOM ; j .WORD AC0002 .WORD AC0003 .WORD AC0004 .WORD AC0005 .WORD AC0006 .WORD AC0007 .WORD AC0008 .WORD AC0009 .WORD AC0010 .WORD AC0011 .WORD AC0012 .WORD AC0013 .WORD AC0014 .WORD AC0015 .WORD AC0016 .WORD AC0017 .WORD AC0018 .WORD AC0019 .WORD AC0020 ; .= AUTCOD+ACTSIZ+ACTSIZ ; USE ONLY AMOUNT NEED .END l15 ; YES-DON'T SUSPEND MOV #1.,-(SP) ; SET INVOLUNTARY SUSPENSION JSR PC,QSAVEI ; SAVE TASK'S ENVIRONMENT-SWITCH STACK SAVE10: MOV PSSAVE,-(SP) ; RESTORE PSR FOR SAVE MOV PCSAVE,-(SP) ; RESTORE PC FOR SAVE MOV #RESTOR,R5 ; SEND BACK ADDRESS OF RESTOR MOV OLDPSR,R4 ; OLD PS OF ENVIRONMENT MOV OLDPC,R3 ; OLD PC OF ENVIRONMENT RTI ; RETURN TO INTERRUPm RCOM SCAN =. ; ENTRY POINT RCOM JSR R5,PUSHR ; SAVE ALL REGISTERS RCOM MOV NTH(SP),R3 ; GET NUMBER OF FIELD TO FIND. RCOM MOV NC(SP),R4 ; GET NUMBER OF CHARACTERS IN STRING RCOM MOV STRING(SP),R5 ; GET BEGINNING STRING ADDRESS RCOM ADD R5,R4 ; COMPUTE ENDING ADDRESS OF STRING. RCOM CLR R1 nED .WORD -1. ; END OF TABLE .ENDC .PAGE ; ; OPERATOR COMMAND TABLE - EITHER CONTAINS ADDRESSES OF ; COMMAND PROCESSORS OR SEGMENT NUMBERS DEPENDING ON ; WHETHER OR NOT INPUT IS AN OVERLAY TASK ; OPCOMM = . .ASCII /EN/ .WORD ENABLE ; ADDRESS OF ENABLE .ASCII /DS/ .WORD DSABLE ; ADDRESS OF DSABLE .ASCII /QU/ .WORD QTASK ; ADDRESS OF QTASK o; UPDATE 12/2/71 RESTOR.S04 ; UPDATE 11/8/71 RESTOR.S03 ; UPDATE 10/8/71 RESTOR.S02 ; UPDATE 9/15/71 RESTOR.S01 .TITLE RESTOR ;*********************************************************************** ;* * ;* PROGRAM IDENTIFICATION. RESTOR, CATALOG NO. ; * ;* RESTORE ENVIRONMENT FROM INTERRUPT HANDLER. * ;* pT HANDLER ; ; SWITCH TO SYSTEM STACK ; SAVE15: MOV SP,TSKSTK ; SAVE TASK'S STACK POINTER MOV STACK,SP ; SWITCH TO SYSTEM STACK ; ; ALREADY ON SYSTEM STACK - SAVE REGISTERS ; SAVE20: MOV R5,-(SP) ; SAVE MOV R4,-(SP) ; REGISTERS MOV R3,-(SP) ; ON MOV R2,-(SP) ; SYSTEM MOV R1,-(SP) ; STACK MOV R0,-(SP) BR SAVE10 q ; CLEAR COMMA COUNTER RCOM MOV R5,R2 ; SAVE PREVIOUS FIELD START ADD. IN R2 RCOM SCAN10: INC R1 ; COUNT FIELD CURRENTLY CHECKING. RCOM CMP R1,R3 ; IS THIS THE FIELD WE WANT? RCOM BEQ SCAN20 ; YES. RCOM MOV R5,R2 ; SAVE PREVIOUS FIELD START ADD. IN R2. RCOM JSR PC,GETCOM ; GET START OF NEXT FIELD. r .ASCII /XX/ .WORD TABORT ; ADDRESS OF TABORT .ASCII /TM/ .WORD TIME ; ADDRESS OF TIME .ASCII /DT/ .WORD DATE ; ADDRESS OF DATE .ASCII /RE/ .WORD RESET ; ADDRESS OF RESET .ASCII /TY/ .WORD TYCRLP .ASCII /CR/ .WORD CRTY .ASCII /LP/ .WORD LPTY .ASCII /CM/ .WORD QCMPRS ; QUEUE COMPRS .ASCII /s * ;* PURPOSE. THIS SUBROUTINE WILL SERVE AS AN INTERRUPT * ;* ROUTINE'S EXIT. IT WILL RESTORE THE ENVIRONMENT(GENERAL * ;* REGISTERS) AND RETURN TO IT. IT WILL BE RESPONSIBLE FOR * ;* DETERMINING IF THE ENVIRONMENT IS ANOTHER INTERRUPT ROUTINE * ;* OR A TASK. * ;* * ;* ; SET UP R5 & RETURN ; ; FIRST INTERRUPT-SYSTEM BUSY AND NO TASKS ACTIVE ; ALREADY ON SYSTEM STACK ; SAVE30: MOV PC,SBSYNA ; SET SYSTEM BUSY NOT ACTIVE FLAG ; ; PC NOT EQUAL 0 BR SAVE20 ; NOW SAVE REGISTERS ; ; .END uRCOM TST R0 ; COMMA(FIELD) FOUND? RCOM BNE SCAN10 ; YES. GO SEE IF IS ONE WANTED. RCOM CLR FIELD(SP) ; NO. FIELD REQUESTED NON-EXISTANT. RCOM CLR LENTH(SP) ; CLEAR FIELD, LENTH. SET ERROR TO RCOM MOV R1,ERROR(SP) ; # OF EXISTING FIELDS. RCOM BR SCAN30 ; RETURN TO CALLER. RCOM SCAN20: MOV R2,FIELD(SP) ; FOvAS/ .WORD QRASM ; QUEUE ROS ASSEMBLER .ASCII /LD/ .WORD QROSLD ; QUEUE ROSLOD .ASCII /DI/ .WORD QDINIT ; QUEUE DISC INIT. .ASCII /FL/ .WORD QFLST ; QUEUE FILE LIST .ASCII /TI/ .WORD TSKINI ; TASK INIT. .ASCII /UT/ .WORD QUTIL ; QUEUE UTILITY .ASCII /TC/ .WORD QTC ; QUEUE TASK C??? .IFNZ $w PROGRAM USAGE. THE LINKAGE TO RESTOR SHALL BE: * ;* * ;* JMP RESTOR OR * ;* ALTERNATELY: * ;* JMP (R5) WHERE R5 CONTAINS * ;* THE ADDRESS OF RESTOR (NOTE: THIS IS SET IN SAVE). * ;* *x; UPDATE 11/8/71 MASK.S01 .TITLE MASK ;*********************************************************************** ;* * ;* PROGRAM IDENTIFICATION. MASK, CATALOG NO. ; * ;* MASK SOFTWARE PRIORITY LOCK-OUT ON. * ;* * ;* PURPOSE. THIS SUBROUTINE WILL SET THE TASK HEADER * ;*yUND FIELD AFTER. STORE ADD FOR USERRCOM CLR ERROR(SP) ; CLEAR STATUS CODE. RCOM DEC R5 ; SET R5 TO POINT TO LAST CHARACTER OF RCOM SUB R2,R5 ; STRING, THEN SUB BEGINNING ADD TO GET RCOM MOV R5,LENTH(SP) ; LENTH. RETURN TO USER. RCOM SCAN30: JSR R5,POPR ; RESTORE ALL REGISTERS RCOM RTS PC ; RETURN TO CALLER. RCOM zBATCH .ASCII /BR/ ; BATCH FILE RESET .WORD BFINIT ; BATCH FILE INITIALIZATION .ENDC .ASCII /EX/ .WORD 0 ; EXIT FROM INPUT TASK .WORD 0 ; END OF TABLE ; .PAGE ; ; EQUATES FOR ASCII STRING ; ASCIIS = ASCII ; ASCII SIGN POSITION ASCII1 = ASCII+1. ; 10,000 POSITION ASCII2 = ASCII+2. ; 1,000 POSITION ASCII3 = ASCII+3. ;{ ;* PROGRAMMER 54 * ;* DATE * ;* REVISION * ;* * ;*********************************************************************** .DEF RESTOR .REF NINT,DSPTCH,MFLAG,TSKSTK .REF SBSYNA ; .CSECT ; PLOCK = 340 | ADDRESS OF THE CURRENTLY ACTIVE TASK IN MFLAG SO THAT * ;* QUEUE WILL NOT DISPATCH ANY TASKS. THIS IN EFFECT * ;* RAISES THE CURRENTLY ACTIVE TASK TO THE HIGHEST PRIORITY TASK * ;* (SOFTWARE-WISE) IN THE SYSTEM. CPU LEVEL NOT AFFECTED. * ;* * ;* PROGRAM USAGE. THE LINKAGE TO SUBROUTINE MASK IS: * ;* } .PAGE RCOM ; THIS SUBROUTINE, 'NUMFLD', IS USED TO RETRIEVE AND CONVERT TO BINARY RCOM ; THE SPECIFIED FIELD. ALL REGISTERS ARE RESTORED. RCOM ; RCOM .DEF NUMFLD ; RCOM .REF SCAN,ASCBIN ; RCOM ; ~ 100 POSITION ASCII4 = ASCII+4. ; 10 POSITION ASCII5 = ASCII+5. ; DIGIT POSITION .PAGE ; ; IF AN OVERLAY - INPUT MAY BE CHECKPOINTED ; INPUT = . EMT NOCKPT ; SET INPUT NOT CHECKPOINTABLE .IFZ $DEBUG MOV #ACMSG,DATADR ; AUTHORIZATION CODE REQUEST MOV #TTYLST,-(SP) ; I/O LIST ADDRESS TO STACK EMT TTYOUT ; TYPE "AC:" - EXIT TYPE 2 MOV #100004,INBUF ; IN ; PRIORITY LOCKOUT MASK PSR = 177776 ; PROCESSOR STATUS REGISTER ADDRESS ; RESTOR = . MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT DEC NINT ; DECREMENT NO. INTERRUPTS ACTIVE BMI RESB00 ; RESTORING FROM FIRST INTERRUPT RESA00: MOV (SP)+,R0 ; RESTORE MOV (SP)+,R1 ; GENERAL MOV (SP)+,R2 ; PURPOSE MOV (SP)+,R3 ; REGISTERS M * ;* EMT MASK * ;* * ;* THE FORTRAN EQUIVALENT CALL IS: * ;* * ;* CALL MASK * ;* * ;* REGISTERS WILL NOT BE DESTROYED RCOM ; NUMFLD'S STACK LOOKS THIS WAY: RCOM ; RCOM ; FIELD # AT CALL RCOM ; STRING ADD. RCOM ; # CHARACTERS RCOM ; PC FOR RETURN <=SP RCOM ; PUT FOUR CHARACTER AUTHORIZATION MOV #INBUF,DATADR ; CODE -NO ECHO MOV #TTYLST,-(SP) EMT TTYIN ; GET AUTHORIZATION CODE TST INERR ; ERROR OR TIMEOUT OCCUR? BNE IPTA20 ; YES CMP #4.,NOCHAR ; 4 CHARACTERS INPUT? BNE IPTA20 ; NO-EXIT CLR ASCII ; CLEAR SIGN & 10,000 POSITION MOV BUFST,ASCII2 ; SET UP 1,000 & 100 POSITION MOV OV (SP)+,R4 MOV (SP)+,R5 TST MFLAG ; TASK LOCK-OUT SET BNE RESA20 ; YES RTI ; RETURN FROM INTERRUPT ; ; MFAG SET-SOFTWARE LOCKOUT ON ; RESA20: TST NINT ; RESTORING FROM FIRST INTERRUPT? BGE RESA30 ; NO-RETURN MOV TSKSTK,SP ; YES-RESTORE TASK'S STACK POINTER RESA30: RTI ; RETURN FROM INTERRUPT ; ; FIRST INTERRUPT ; * ;* * ;*********************************************************************** .DEF MFLAG,MASK .REF ACTIVE ; .CSECT ; PLOCK = 340 ; PRIORITY LOCK-OUT MASK FOR PSR PSR = 177776 ; PROCESSOR STATUS REGISTER ADDRESS ; MFLAG: .WORD 0 ; SOFTWARE LOCK-OUT SWITCH ; ; MASK = . MOV ACTIVE,MFLAG ; SET TASK L FIELD # AT CALL RCOM ; STRING ADD. OF SCAN RCOM ; # CHARACTERS RCOM ; PC FOR RETURN <=SP RCOM ; RCOM ; FIELD # ON RETURN RCOM ; STRING ADD. FROM SCAN BUFST+2,ASCII4 ; SET UP 10 & DIGIT POSITION MOV #ASCII,-(SP) ; ASCII STRING ADDRESS EMT ASCBIN ; CONVERT ASCII TO BINARY MOV (SP)+,R1 ; GET CONVERTED A.C. TST (SP)+ ; CONVERSION ERROR OCCUR? BNE IPTA20 ; YES - EXIT MOV #AUTCOD,R0 ; SEARCH AUTCOD TABLE FOR MATCH IPTA10: CMP (R0)+,R1 ; MATCH? BEQ IPTB00 ; YES - CONTINUE TST (R0) RESB00 = . TST SBSYNA ; WAS SYSTEM BUSY AND NO TASK ACTIVE? BNE RESA00 ; YES-DON'T GO TO DISPATCHER TST MFLAG ; TASK LOCKOUT SET? BNE RESA00 ; YES-RESTORE REGISTERS JMP DSPTCH ; GO TO DISPATCHER UNDER LOCKOUT ; .END OCKOUT IN MFLAG RTS PC ; RETURN TO CALLER ; .END RCOM ; # CHARACTERS RCOM ; PC FOR RETURN RCOM ; ERROR FROM SCAN RCOM ; # CHAR. IN FIELD RCOM ; ADD. OF FIELD <=SP RCOM ; RCOM ; 0 ; END OF TABLE? BPL IPTA10 ; NO- KEEP-A- SEARCHIN' .ENDC .IFNZ $DEBUG BR IPTB00 .ENDC IPTA20: EMT EXIT ; EXIT FROM TASK ; ; MESSAGE INTERPRETER ; IPTB00 = . MOV #TTRLST,-(SP) ; TTY I/O LIST FOR READY MSG TO STACK EMT TTYOUT ; TYPE "? " WITH EXIT TYPE 1 MOV #MXCHIN,INBUF ; SET TO INPUT OPERATOR COMMAND MOV #INBUF,DATADR ; SET BUFFER ADDRESS; UPDATE 11/9/71 UNMASK.S03 ; UPDATE 11/8/71 UNMASK.S02 ; UPDATE 10/8/71 UNMASK.S01 .TITLE UNMASK ;*********************************************************************** ;* * ;* PROGRAM IDENTIFICATION. UNMASK, CATALOG NO. ; * ;* MASK SOFTWARE PRIORITY LOCK-OUT OFF. * ;* ; UPDATE 12/20/71 ERRTYP.S07 ; UPDATE 12/7/71 ERRTYP.S06 ; UPDATE 12/2/71 ERRTYP.S05 ; UPDATE 11/8/71 ERRTYP.S04 ; UPDATE 11/1/71 ERRTYP.S03 ; UPDATE 10/8/71 ERRTYP.S02 ; UPDATE 9/15/71 ERRTYP.S01 .TITLE ERRTYP ;*********************************************************************** ;* * ;* PROGRAM IDENTIFICATION FOR ASCBIN CONVERSION RCOM ; STRING ADD. RCOM ; # CHARACTERS RCOM ; PC FOR RETURN RCOM ; ERROR FROM SCAN RCOM ; # CHAR. IN FIELD RCOM ; ADD. OF FIELD IN LIST CLR BUFST+2 ; RESET DELIMITER POSITION MOV #TTYLST,-(SP) ; TTY I/O LIST TO STACK EMT TTYIN ; WAIT FOR COMMAND TST INERR ; TIME-OUT OCCUR BNE IPTA20 ; YES- CANCEL THIS TASK MOV #NOCHAR,R5 ; SIZE OF INPUT MSG ADDRESS MOV (R5)+,R4 ; GET NO. CHARACTERS INPUT BEQ IPTA20 ; CARRIAGE RETURN-EXIT SUB #2.,R4 ; MUST BE AT LE * ;* PURPOSE. THIS ROUTINE WILL RELEASE THE PRIORITY LOCK-OUT * ;* MFLAG, SET BY MASK. THUS THE ROS TASK PRIORITY * ;* STRUCTURE WILL BE BACK IN AFFECT. UNMASK THEN * ;* CALLS THE DISPATCHER TO SEE IF A HIGHER PRIORITY * ;* TASK IS IN THE ROS SYSTEM QUEUES * ;* * ;* PROGRAM USAGE. THE LINKAGE TO ROUTINE UNMA. ERRTYP, CATALOG NO. ; * ;* TYPE ROS ERROR MESSAGES * ;* * ;* PURPOSE. THIS SUBROUTINE WILL TYPE A SYSTEM ERROR MESSAGE * ;* ON THE SYSTEM OUTPUT DEVICE WITH SPECIFIED ARGUMENTS * ;* GIVEN BY THE CALLER. THIS SUBROUTINE PROVIDES THE CON- * ;* SISTENT ERROR MESSAGE FORMAT: * ;* RCOM ; R0 RCOM ; R1 RCOM ; R2 RCOM ; PS RCOM ; ADD. OF STRING (WRD1) STATUS ON RETURN RCOM ; PC FOR RETURN <=SP VALUE ON RETURN RCOM ; NOTAST TWO BMI IPTB20 ; CHARACTERS OR ERROR DEC R4 ; R4= # CHARS. IN PARAMETER MOV #OPCOMM,R3 ; ADDRESS OF OPCOMM TO R3 FOR IPTB10: CMP (R5),(R3)+ ; OPERATOR COMMAND CODE SEARCH BEQ IPTC00 ; FOUND IT TST (R3)+ ; BUMP TO NEXT POSSIBLE COMMAND TST (R3) ; END OF TABLE? BNE IPTB10 ; NO- KEEP LOOKING IPTB20: MOV #ER1MSG,DATADR ; YES- RSK IS: * ;* * ;* EMT UNMASK * ;* * ;* THE FORTRAN EQUIVALENT CALL IS: * ;* * ;* CALL UNMASK * ;* * ;* "ERROR (NUMBER) * ;* ARG1 * ;* ARG2 * ;* ARG3 * ;* ARG4" * ;* * ;* A ROS E: ASCBIN MOVES PC DOWN ONE AND SAVES R0-R5 ON RCOM ; STACK. RCOM ; RCOM ; ERROR CODE FOR RETURN RCOM ; VALUE RCOM ; PC FOR RETURN <=SP RCOM ; EPORT ERROR IPTB21: MOV #TTYLST,-(SP) ; TTY I/O LIST TO STACK EMT TTYOUT ; TYPE "ILL CMD!" BR IPTB00 ; REQUEST AGAIN ; ; TRANSFER TO APPROPRIATE PROCESSOR. ; CALLING SEQUENCE: ; JSR PC, PROCES ; WHERE R5 = ADDRESS OF COMMAND STRING ; DELIMITER POSITION ; R4 = NO. OF CHARACTERS IN PARAMETER ; IF LESS * ;* RETURN IS VIA THE DISPATCHER * ;* * ;* PROGRAMMER 54 * ;* DATE * ;* REVISION * ;* * ;*********************************ERROR LOG SHOULD BE MAINTAINED FOR CLASSIFICATION * ;* LOOK-UP AND MEANING OF ARGUMENTS. IT IS ALSO RECOMMENDED * ;* THAT USER ERROR NUMBERS START AT 500 SUCH THAT ERRORS * ;* 1-499 MAY BE RESERVED FOR ROS. * ;* * ;* PROGRAM USAGE. THE LINKAGE TO ERRTYP IS AS FOLLOWS: * ;* * ;* RCOM NUMFLD =. ; ENTRY POINT RCOM MOV NTH-CSAVE(SP),-(SP) ; PUT FIELD # ON STACK FOR SCAN.RCOM MOV STRING-CSAVE+2(SP),-(SP); PUT STRING ADD ON STACK. RCOM MOV NC-CSAVE+4(SP),-(SP) ; PUT # CHAR ON STACK. RCOM JSR PC,SCAN ; FIND NTH FIELD. RCOM CLR VALUE-CSAVE+6(SP) ; CLEAR VALUE. RCOM TST ERROR-CSTHAN 0-NONE ; IPTC00 = . TST (R3) ; IF ZERO- EX..IT COMMAND BEQ IPTA20 ; YES, GOOD-BY TST (R5)+ ; R5 = ADDRESS OF DELIMITER POSITION JSR PC,@(R3)+ ; PERFORM COMMAND PROCESS - INC. TO SAVE WORD ; ; RETURN FROM OPERATOR COMMAND PROCESSORS HERE ; OPCOMR = . TST R5 ; DID AN ERROR OCCUR BNE IPTB00 ; NO-SEND READY FOR ANOTHER REQUEST MOV ************************************** .DEF UNMASK .REF QSAVE,MFLAG,DSPTCH ; .CSECT PSR = 177776 ; ; UNMASK = . MOV PSR,-(SP) ; PSR TO STACK FOR QSAVE MOV #1.,-(SP) ; SET UP FOR INVOLUNTARY SUSPENSION JSR PC,QSAVE ; OF CURRENT TASK CLR MFLAG ; RESET TASK SOFTWARE PRIORITY LOCK-OUT JMP DSPTCH ; GO TO DISPATCHER TO CLEAN-UP QUEUES ; ; .END MOV MADDR,-(SP) * ;* EMT ERRTYP * ;* * ;* OR THE FORTRAN EQUIVALENT: * ;* * ;* CALL ERRTYP(MADDR) * ;* WHERE MADDR IS THE ADDRESS OF THE ERROR MODULE: *AVE-2(SP) ; REQUEST COMPLETED? RCOM BEQ NUMA10 ; YES RCOM MOV ERROR-CSAVE-2(SP),ERROR-CSAVE+6(SP) ; NO RCOM NUMA05: ADD #6,SP ; SET ERROR, ADJUST SP, AND RETURN RCOM BR NPRF20 ; BUMPS PC UP 1 ON STACK RCOM ; RCOM NUMA10 =. ; HERE IF NO ERROR. #ER2MSG,DATADR ; TYPE "ILL PAR!" BR IPTB21 ; ; ;*********************************************************************** ;* * ;* RESET LOGICAL DEVICE AVAILABLE IN ROS PHYSICAL DEVICE TABLE. * ;* TO BE FUTHER DOCUMENTED AFTER ROS 1 DEMO. * ;* * ;********************************************************************* ;* * ;* WORD 0 = THREAD WORD * ;* WORD 1 = ERROR NUMBER * ;* WORD 2 = ARGUMENT 1 * ;* WORD 3 = ARGUMENT 2 * ;* WORD 4 = ARGUMENT 3 * ;* WORD 5 = ARGUMENT 4 RCOM TST FIELD-CSAVE-2(SP) ; IS THIS A VOID FIELD? RCOM BNE NUMA15 ; NO. RCOM MOV #-2,ERROR-CSAVE+6(SP) ; SET ERROR -2 (VOID FIELD). RCOM BR NUMA05 ; ADJUST SP. RCOM ; RETURN TO CALLER (BUMPS PC ON STACK). RCOM ; RCOM ; HERE IF MUST CONVERT. NOT R** .DEF RESET .REF LOGMAX,PHYDEV,CVTBIN ; ; COMMA = 54 ; ASCII COMMA ; RESET = . JSR PC,RES010 ; GET LOGICAL UNIT CMP R4,LOGMAX ; VALID LOG. DEVICE BGT RESERR ; NO-ERROR ASL R4 ; COMPUTE WORD INDEX BIC #120000,PHYDEV(R4) ; SET DEVICE NOT AVAILABLE ; ; ALTERNATE NOT IN USE RTS PC 09 R4=4 * ;* 009 R4=3 * ;* 09 R4=2 * ;* 9 R4=1 * ;* +00009 R4=6 * ;* * ;*********************************************************************** .DEF CVTBIN AS * ;* * ;* THE ARGUMENTS WILL BE TYPED AS SIGNED ASCII INTEGERS * ;* OF THE FORM +/-XXXXX. IF ANY ERRORS OCCUR, IT * ;* WILL BE IGNORED. * ;* * ;* PROGRAMMER 54 * ;* DATE E-ENTRANT, THEREFORE USE LEVEL 7. RCOM ; RCOM NUMA15 =. ; RCOM NUMSAV: MOV R0,-(SP) ; SAVE NEED GENERAL REGISTERS. RCOM MOV R1,-(SP) ; RCOM MOV R2,-(SP) ; RCOM NSAVE =.-NUMSAV ; COMPUTE NUMBER SAVED REGISTERS IN NUM ; RETURN TO CALLER ; ; RES010: CMPB (R5)+,#COMMA ; DELIMETER A COMMA? BNE RSERR ; NO-ERROR TST R4 ; PARAM. MUST BE 1-3 CHARS. BEQ RSERR CMP R4,#3. BHI RSERR JSR PC,CVTBIN ; CONVERT TO BINARY INTEGER TST R5 BEQ RSERR ; CONVERSION ERROR RTS PC ; ; ERROR OCCURED ; RSERR = . TST (SP)+ ; POP STCBIN = 17 ; .CSECT ; ASCII: .BYTE 0,0,0,0,0,0 ; BYTE CONVERSION STRING ; ; EQUATES FOR ASCII STRING ; ASCIIS = ASCII ; ASCII SIGN POSITION ASCII1 = ASCII+1. ; 10,000 POSITION ASCII2 = ASCII+2. ; 1,000 POSITION ASCII3 = ASCII+3. ; 100 POSITION ASCII4 = ASCII+4. ; 10 POSITION ASCII5 = ASCII+5. ; DIGIT POSITION ASCII6 = ASCII+6. ; ADDRESS OF DIGITS POSITION +1 ; ; * ;* REVISION * ;* * ;*********************************************************************** .DEF ERRTYP,LERTYP .REF PUSHR,POPR,BINASC,TTYOUT ; .CSECT ; ; THE FOLLOWING IS THE FIRST AND LAST DIRECTORY FOR THE ; ERROR TYPE THREAD ; QFIRST: .WORD 0 QLAST: .WORD QFIRST ; IOLUSE: .WORD -1. ; IRCOM MOVB @#PS,-(SP) ; AND PS RCOM MOVB #340,-(SP) ; LOCKOUT ALL INTERRUPTS. RCOM MOV #WRD1,R0 ; CLEAR SIX BYTES FOR ASCBIN RCOM CLR (R0)+ ; RCOM CLR (R0)+ ; RCOM CLR (R0)+ ; LEAVE R0 POINTING AT WRD3, BYT0 RCOM TST (R0)+ ; BUACK RESERR = . CLR R5 ; SET ERROR GUY RTS PC ; RETURN ; ; ;*********************************************************************** ;* * ;* THE FOLLOWING SUBROUTINES ARE USED FOR DEMO ONLY TO: * ;* SWITCH LP TO TTY- LP,TY * ;* SWITCH TTY TO LP- TY,LP * ;* CVTBIN = . MOV R3,-(SP) ; SAVE R3 ON STACK CLR ASCIIS ; INITIALIZE CLR ASCII2 ; SIX BYTE CONVERSION CLR ASCII4 ; STRING ADD R4,R5 ; ADDRESS OF DIGITS POSITION +1 TO CONVERT MOV #ASCII6,R3 ; ADDRESS OF DIGITS POSITION +1 TO JUSTIFY CTBA10: MOVB -(R5),-(R3) ; RIGHT JUSTIFY STRING DEC R4 ; FOR GIVEN NO. OF BYTES BNE /O LIST IN USE SWITCH-NO OF REQUESTS ; ; THE FOLLOWING TABLE IS THE I/O LIST FOR THE ; ERROR MESSAGE TYPE-OUT. ; IOLIST = . .WORD 1 ; THREAD WORD .BYTE SYSTTY ; LOGICAL DEVICE-SYSTEM TTY .BYTE 3 ; EXIT TYPE 3 .WORD TTYNXT ; I/O COMPLETE SUBROUTINE .BYTE 0 ; DON'T QUEUE ERROR TASK .BYTE 1 ; USE PRIORITY TYPE-OUT QUEUE .WORD 0,0 MP TO BYTE 1+1. RCOM MOV FIELD-CSAVE+NSAVE+2(SP),R1 ; GET ADD OF FIRST CHAR.RCOM MOV LENTH-CSAVE+NSAVE+2(SP),R2 ; GET # OF CHAR IN FIELDRCOM ADD R2,R1 ; SET R2 TO CONTAINT THE NUMBER OF RCOM ; CHARACTERS IN THE FIELD. RCOM NUMA20: MOVB -(R1),-(R0) ; MOVE A CHARACTER INTO FIELD RCOM DEC R2 ; COUNT THE CHARACTER RCOM SWITCH CR TO TTY- CR,TY * ;* SWITCH TTY TO CR- TY,CR * ;* * ;* FOR DEMO ONLY * ;* * ;*********************************************************************** ; .REF CRDON,CRDOFF,LPON,LPOFF ; TYCRLP = . CMCTBA10 MOV #ASCII,-(SP) ; CONVERT THIS STRING EMT ASCBIN MOV (SP)+,R4 ; GET CONVERTED INTEGER IN R4 TST (SP)+ ; ERROR OCCUR? BEQ CTBA20 ; NO CLR R5 ; YES -SET ERROR INDICATOR CTBA20: MOV (SP)+,R3 ; RESTORE R3 RTS PC ; RETURN TO CALLER ; .END ; TWO SYSTEM USE WORDS .WORD TYPBUF ; ADDRESS OF OUTPUT BUFFER ; ; THE FOLLOWING IS THE MESSAGE STRING USED BY TTYOUT ; TYPBUF = . .WORD 41. ; NO. OF CHARACTERS TO OUTPUT .WORD 0 ; USED BY TTYOUT .BYTE 15 ; START OFF WITH CR/LF .ASCII /ERROR/ EDIT1: .ASCII / XXXXX/ .BYTE 15 EDIT2: .ASCII /SXXXXX/ ; ARG 1 .BYTE 15 EDIT3: .ASCII /SXXXXX/ ; BNE NUMA20 ; MORE TO GO? IF SO, GOOD DO IT. RCOM MOV R0,-(SP) ; DONE. PUT ADDRESS OF STRING ON STACK RCOM JSR PC,ASCBIN ; GO CONVERT IT. RCOM MOV (SP)+,VALUE-CSAVE+6+NSAVE+4(SP) ; PUT VALUE ON STACK RCOM TST (SP)+ ; COMPLETED? RCOM BEQ NUMA40 ; YES RCOM DEC ERROR-CSAVE+6+NSAVE+2(SP);PB (R5)+,#COMMA ; DELIMETER A COMMA? BNE RESERR ; SET ERROR GUY CMPB (R5),#'L ; FOR LP BEQ TCL010 CMPB (R5),#'C ; FOR CR BNE RESERR ; SET ERROR GUY JSR PC,CRDON ; USE CARD READER RTS PC TCL010: JSR PC,LPON RTS PC ; CRTY = . CMPB (R5)+,#COMMA ; COMMA FOR DELIM? BNE RESERR CMPB (R5),#'T BNE ; UPDATE 6/27/72 EDQT.S17 ; UPDATE 6/22/72 EDQT.S16 ; UPDATE 5/5/72 EDQT.S15 ; UPDATE 5/2/72 EDQT.S14 ; UPDATE 4/21/72 EDQT.S13 ; UPDATE 4/10/72 EDQT.S12 ; UPDATE 4/5/72 EDQT.S11 ; UPDATE 3/31/72 EDQT.S10 ; UPDATE 1/18/72 EDQT.S09 ; UPDATE 12/10/71 EDQT.S08 ; UPDATE 12/7/71 EDQT.S07 ; UPDATE 12/2/71 EDQT.S06 ; ARG 2 .BYTE 15 EDIT4: .ASCII /SXXXXX/ ; ARG 3 .BYTE 15 EDIT5: .ASCII /SXXXXX/ ; ARG 4 .BYTE 15 .EVEN ; ; THE FOLLOWING EDIT TABLE IS USED TO POINT TO 6 BYTE ASCII ; STRINGS IN THE MESSAGE INTO WHICH BINASC WILL PUT THE ; CONVERTED RESULTS. ; EDITBL = . .WORD EDIT1 ; POINTER FOR ERROR NUMBER .WORD EDIT2 ; FPOINTER FOR FIRST ARGUMENT .WORD EDIT3 ; POINTNO. SET ERR TO-1(ALREADY 0). RCOM NUMA40: MOVB (SP)+,@#PS ; ALLOW INTERRUPTS. RCOM MOV (SP)+,R2 ; RESTORE REGISTERS RCOM MOV (SP)+,R1 ; RCOM MOV (SP)+,R0 ; RCOM BR NPRF20 ; GO BACK AFTER BUMPING PC ON STACK. RCOM WRD1: .WORD 0,0,0 ; 6 BYTE AREA FOR ASCBIN RCOM RESERR JSR PC,CRDOFF RTS PC ; LPTY = . CMPB (R5)+,#COMMA ; COMMA FOR DELIM? BNE RESERR CMPB (R5),#'T BNE RESERR JSR PC,LPOFF RTS PC ; ; ; THE FOLLOWING ARE USED TO QUEUE ROS SYSTEM TASKS ; QCMPRS = . ; QUEUE COMPRS JSR PC,RES010 ; GET FILE TYPE MOV #$CPTNO,-(SP) ; COMPRESS TASK NO. TO STACK QCMP20 = . UPDATE 11/15/71 EDQT.S05 ; UPDATE 11/10/71 EDQT.S04 ; UPDATE 11/8/71 EDQT.S03 ; UPDATE 11/1/71 EDQT.S02 ; UPDATE 10/8/71 EDQT.S01 .TITLE ENABLE,DSABLE,QTASK, AND TABORT ;*********************************************************************** ;* * ;* PROGRAM IDENTIFICATION. ENABLE,DSABLE,QTASK AND TABORT, * ;* CATALOG NUMBERS ER FOR SECOND ARGUMENT .WORD EDIT4 ; POINTER FOR THIRD ARGUMENT .WORD EDIT5 ; POINTER FOR FOURTH ARGUMENT .WORD 0 ; END OF TABLE ; ; EXITSW: .WORD 0 ; EXIT SWITCH. 0=SUBROUTINE EXIT ; ; 1=I/O COMPLETE SUB EXIT ; ; EQUATES FOR ERRTYP ; SPACE = 40 ; ASCII SPACE ; ; THE FOLLOWING EQUATES ARE FOR THE ERROR MODULE ; THREAD = 0. .PAGE RCOM ; THIS SUBROUTINE, 'GETCOM', IS USED BY SEVERAL OF THE ROS COMMAND RCOM ; STRING PARSING ROUTINES. ON ENTRY IT EXPECTS THAT R5 CONTAIN THE RCOM ; ADDRESS OF THE NEXT CHARACTER TO BE PROCESSED. R4 CONTAINS THE RCOM ; ADDRESS OF THE END OF THE COMMAND STRING. R0 IS CLEARED. RCOM ; GETCOM BEGINS SCAN WITH THE CHARACTER POINTED TO BY R5 AND CONTINUES RCOM ; SEARCHING UNTIL THE NEXT COMMA IS FOUND. WHEN .IFNZ DPRTY CLR -(SP) ; USE PRIORITY IN TASK TABLE .ENDC .IFNZ ARG ; SHOULD HAVE FOR COMPRS MOV R4,-(SP) ; PASS FILE TYPE AS ARGUMENT .ENDC CLR -(SP) ; IMMEDIATE RETURN REQUESTED EMT QUEUE TST (SP)+ ; POP ERROR WORD BGT RESERR ; ERROR EMT EXIT ; EXIT FROM INPUT ; ; QRASM = . ; QUEUE RESPECTIVELY; PERFORM * ;* TASK ORIENTED OPERATOR COMMUNICATION FUNCTIONS. * ;* * ;* PURPOSE. THIS SUBROUTINE (SEGMENT) INTERPRETS THE * ;* TASK NUMBER, PASSED BY INPUT FROM THE OPERATOR, AND PROCESSES * ;* THAT TASK BASED ON THE OPERATOR INPUT COMMAND. GIVEN A * ;* 1-3 DIGIT ASCII TASK NUMBER, THIS SUBROUTINE (SEGMENT) * ;* CAN: ; THREAD WORD ERRNUM = 2. ; ERROR NUMBER ARGM1 = 4. ; ARGUMENT 1 ARGM2 = 6. ; ARGUMENT 2 ARGM3 = 8. ; ARGUMENT 3 ARGM4 = 10. ; ARGUMENT 4 ; ; PLOCK = 340 ; PRIORITY LOCK-OUT MASK FOR PSR PSR = 177776 ; ADDRESS OF PROCESSOR STATUS REGISTER ; TEMP: .WORD 0 ; TEMPORARY SAVE AREA FOR LERTYP ; ; LERTYP IS CALLED TO TYPE AN ERR THE COMMA IS FOUND, R0 RCOM ; IS INCREMENTED, AND R5 IS BUMPED TO POINT TO THE NEXT CHARACTER(WHICH RCOM ; MAY NOT EXIST). RCOM ; IF A COMMA IS NOT FOUND, THE SEARCH IS HALTED AT THE END OF THE RCOM ; COMMAD STRING. RCOM ; THE STACK IS NOT USED. RCOM ; RCOM GETCOM =. RASM MOV #$RASNO,-(SP) BR QCMP20 ; ; QROSLD = . ; QUEUE ROS LOADER MOV #$RLDNO,-(SP) BR QCMP20 ; ; QUTIL = . MOV #$UTLNO,-(SP) BR QCMP20 ; ; QTC = . MOV #$TKCNO,-(SP) BR QCMP20 ; ; QDINIT = . ; QUEUE DISC INITIALIZER MOV #$INITD,R0 ; GET TASK NUMBER CLRB TSTAT(R0) ; SET TASK QUI * ;* ENABLE THE TASK * ;* DISABLE THE TASK IF NOT ACTIVE OR QUEUED * ;* QUEUE THE TASK * ;* ABORT THE TASK IF SUSPENDED OR QUEUED * ;* * ;* PROGRAM USAGE. THE TASK ORIENTED INPUT PROCESSOR IS * ;* CALLED BY IOR MESSAGE UNDER LOCKOUT. ; MOV PSR,-(SP) ; MOV MADDR,-(SP) ; JSR PC,LERTYP ; ; LOCKOUT WILL BE RELEASED UPON THREADING THE ERROR MODULE ; LERTYP = . MOV 2.(SP),TEMP ; SAVE MODULE ADDRESS UNDER LOCKOUT MOV (SP)+,(SP) ; FOR PROPER RETURN JSR R5,PUSHR ; SAVE ALL REGISTERS MOV 14.(SP),-(SP) ; PUT PSR ON STACK SO ; ENTRY POINT RCOM CLR R0 ; CLEAR FLAG TO COMMA NOT FOUND. RCOM GETC10: CMPB (R5)+,#054 ; IS THIS CHARACTER A COMMA& RCOM BEQ GETC20 ; YES. RCOM CMP R5,R4 ; NO. END OF STRING? RCOM BLO GETC10 ; NO. TRY AGAIN. RCOM BR GETC30 ; YES. RETURN. ESCENT MOV R0,-(SP) TASK NUMBER TO STACK BR QCMP20 ; ; QFLST = . CMPB (R5)+,#COMMA ; DELIM A COMMA BNE QFLST1 ; NO-LIST ALL FILE TYPES .IFNZ $BATCH CMPB (R5),#'B ; BATCH LIST? BEQ QFLST3 ; YES DEC R5 ; BUMP BACK .ENDC JSR PC,RES010 ; GET FILE TYPE TST R4 BEQ RESERR ; TYPE 0 ILLENPUT VIA * ;* * ;* JSR PC, ROUT * ;* * ;* WHERE ROUT = ENABLE * ;* = DSABLE * ;* = QTASK * ;* COMPATIBLE MOV TEMP,R5 ; ADDRESS OF MODULE BR ERRA05 ; DO IT ; ERRTYP = . JSR R5,PUSHR ; SAVE ALL REGISTERS MOV 14.(SP),R5 ; GET MODULE ADDRESS MOV PSR,-(SP) ; SAVE PROCESSOR PRIORITY ON STACK MOV #PLOCK,PSR ; SET PRIORITY LOCKOUT ERRA05: DEC (R5) ; IS MODULE THREADABLE BNE ERRA30 ; NO - BUMP BACK AND RETURN TO CALLER MOV R5,@ RCOM GETC20: INC R0 ; SET FLAG TO FOUND. RCOM RTS PC ; RETURN TO CALLER. RCOM GETC30: RTS PC ; RETURN TO CALLER RCOM .END ; RCOM * ; ******************************************************************** SAVE = $SAVE ;OP-CODE FOR CALL TO [SAVE] SUBROUTINE STRTWD = 4 ;INDEX TO MODULE TIME& DATE WORD DELTA = 6 ;INDEX TO MODULE INCREMENT WORD .DEF CALEND .DEF QSKED,DQSKED,COUNTR .DEF DAYTAB,CLOCK,TICTOC,SECOND,MINUTE,HOUR .DEF JDATE,MDAY,MONTH,YEAR,MXDAYS,JANARY,FEBARY .DEF SWAITB,STBPTR,THDTAB,CURTHD,ABGAL FOR FLMGMT CMP R4,#$FTMAX BGT RESERR ; NOT VALID FOR THIS SYSTEM QFLST2: MOV #$FLTNO,-(SP) ; FILE LIST TASK NO. TO STACK BR QCMP20 ; QUEUE FLIST QFLST1: CLR R4 ; LIST ALL BR QFLST2 .IFNZ $BATCH QFLST3: MOV #-1.,R4 ; LIST BATCH ELEMENTS BR QFLST2 .ENDC ; ; .IFNZ $BATCH ; ; BATCH FILE INITIALIZER ; BFINIT = . MOVQLAST ; THREAD REQUEST MOV R5,QLAST ; VIA QLAST INC IOLUSE ; BUMP NO. OF REQUESTS BEQ ERRB00 ; FIRST ONE - LET'S DO IT ERRA10: MOV (SP)+,PSR ; RESTORE CPU PRIORITY ERRA20: JSR R5,POPR ; RESTORE REGISTERS MOV (SP)+,(SP) ; SET STACK UP FOR VALID RETURN RTS PC ; RETURN TO CALLER ; ; CAN'T THREAD ERROR MODULE ; ERRA30 = . INC (R5) ;; UPDATE TIMERS.S36 06.21.72 ; UPDATE 4/13/72 TIMERS ;UPDATE: 8-FEB-72 ; ******************************************************************** ; * MODULE IDENTIFICATION: T I M E R S * ; ******************************************************************** ; ******************************************************************** ; * Q T I M E * ; * PROGRAM IDENTIFICATION = TABORT * ;* * ;* OR THROUGH A SEGMENT LOAD CALL (OVERLAY SYSTEM) WITH * ;* RETURN POINTS 1,2,3 OR 4 RESPECTIVELY. * ;* * ;* AND R5= ADDRESS OF COMMAND STRING DELIMITER POSITION * ;* R4= NUMBER OF POSITIONS IN PARAMETER NOT INCUDING * ;* #BFBLCK,-(SP) ; COMM. BLOCK ADDRESS EMT 30. ; INITIALIZE DIRECTORY FOR BFUP TST BFBLCK ; ERROR? BNE RESERR ; YES RTS PC ; .ENDC ; ; ; RESET ALL OVERLAY TASK TABLES TO UNUSED CONDITION ; TSKINI = . MOV #OVTMIN,R0 ; SET BYTE BASE INDEX INTO TASK TABLES MOV #OVTMIN+OVTMIN,R1 ; SET WORD INDEX TIA10: MOVB #6,TSTAT(R0) ; DISABLE TASK SET BACK THREAD WORD BR ERRA10 ; RETURN ; ; FIRST REQUEST - START MESSAGE ; ERRB00 = . CLR EXITSW ; CLEAR EXIT SWITCH FOR GOOD RETURN ERRB10: MOV QFIRST,R5 ; GET NEXT REQUEST BEQ ERRB30 ; NO REQUESTS LEFT MOV (R5)+,QFIRST ; PULL THREAD, RELINK, R5=ADDR. ERRNUM BNE ERRB15 MOV #QFIRST,QLAST ; PULLED LAST REQUEST-RESET QLAST ERRB15: MOV (SP)+,PSR ; RESTORE CPUMPLR,SKDBSY .REF PUSHR,POPR,PPTAB,ABORT .REF QUEUE,FIRST,LAST,$PRIOR,RESTOR,$CTASK .REF TSTAT,TSOVLY,DSPTCH .REF ACTIVE .TITLE CALEND .PAGE CALENDAR: ;TIME & DATE ROUTINE ;ENTRY FROM TIME-OF-DAY CLOCK INTERRUPT ;ENTERED ON CPU LEVEL 7 .IFNZ OVRLAY CLRB SVSWCH ;SWITCH CLOSED IF "SAVE" CALLED EARLY .ENDC OVRLA DELIMITER OR EOM. * ;* * ;* UPON RETURN FROM THIS SUBROUTINE, IF R5=0, THEN AN * ;* ERROR OCCURRED AND INPUT WILL TYPE THE APPROPRIATE * ;* ERROR MSG. "ILL PAR!" * ;* * ;* PROGRAMMER 54 CLRB IOSTAT(R0) ; CLEAR THE I/O STATUS CLRB TPRTY(R0) ; CLEAR THE PRIORITY MOV #1,HEADER(R1) ; SET HEADER TO NON-EXISTENT TST (R1)+ ; BUMP TO NEXT WORD INC R0 ; AND TO NEXT BYTE CMP R0,#TASMAX ; DONE? BLE TIA10 ; NO .IFNZ NDISCS .REF $TKFLS,PFRITE MOV #$TKFLS,-(SP) JSR PC,PFRITE .ENDC RTS PC PRIORITY MOV #EDITBL,R4 ; ADDRESS OF MESSAGE EDIT TABLE ERRB20: MOV (R5)+,-(SP) ; INTEGER TO STACK AND BUMP POINTER MOV (R4)+,-(SP) ; EDIT STRING ADDRESS TO STACK JSR PC,BINASC ; CONVERT INTEGER TO ASCII BYTE STRING TST (R4) ; BUMP EDIT POINTER BNE ERRB20 ; NO - AGAIN MOVB #SPACE,EDIT1 ; WIPE OUT SIGN IN ERRNUM; SUB #12.,R5 ; R5 = THREAD WORD ADDRESS Y .IFNZ $ABMPL ;OPTION FOR "ABORT" MULTIPLIER DEC ABMPLR ;COUNT DOWN THE ABORT MULTIPLIER BGT CALA08 ;NOT YET: DON'T RUN ABORT OR TIME-SLICE MOV #$ABMPL,ABMPLR ;RESET THE ABORT MULTIPLIER .ENDC $ABMPL TST ACTIVE ;DON'T DECREMENT TASK TIMEOUT COUNTER BEQ CALA08 ;IF A TASK ISN'T ACTIVE TST COUNTR ;OR IF HIS TIMER COUNTER BEQ CALA08 * ;* DATE * ;* REVISION * ;* * ;*********************************************************************** .DEF ENABLE,DSABLE,QTASK,TABORT .DEF DELTSK .REF CVTBIN,TASKS,TSTAT,ER3MSG .REF DATADR,TTYLST .REF HEADER,$TKFLS,PFRITE .IFNZ OVRLAY .END MOV #1.,(R5) ; SET THREADABLE MOV #IOLIST,-(SP) ; I/O LIST ADDRESS ON STACK FOR TTYOUT JSR PC,TTYOUT ; TYPE ERROR MESSAGE ERRB25: TST EXITSW ; CALLED FROM I/O COMPLETE? BEQ ERRA20 ; NO - RETURN TO CALLER RTS PC ; YES-RETURN TO TTYOUT ; ; I/O COMPLETE SUBROUTINE FROM TTYOUT - EXIT TYPE 3 ; TTYNXT = . INC EXITSW ; SET EXIT SWITCH FROM I/O COMPLETE MOV ;IS ALREADY ZERO DEC COUNTR ;TIC OFF CURRENT TASK TIMER BGT CALA08 ;STILL SOME LIFE LEFT .PAGE .IFNZ $TMSLC ;OPTION FOR TIME SLICING MOV R1,-(SP) ;SAVE USER'S MOV $PRIOR,R1 ;PRIORITY OF TASK INTERRUPTED TSTB PPTAB(R1) ;CHECK FOR TIME-SLICING ON THIS LEVEL BLE CALA06 ;NOT A T/S LEVEL: GO DO ABORT SEQUENCE .IFNZ OVRLAY CMP $CTASK,#OVTMIN .REF IFD,DOD .ENDC TTYOUT = 13 QUEUE = 1 ABORT = 6 ; .CSECT ; ; FCN: .WORD 0 ; TASK FUNCTION SWITCH ; COMMA = 54 ; ASCII COMMA ; MXTSKL = 3. ; MAXIMUM TASK NO. LENGTH ; ; PROCESS TABLE ; PROCSS = . .WORD TOFB00 ; ENABLE THE TASK .WORD TOFC00 ; DISABLE THE TASK .WORD TOFD00 ; QUEUE THE TASK .WORD T; UPDATE 6/22/72 TIME.S03 ; UPDATE 12/7/71 TIME.S02 ; UPDATE 12/2/71 TIME.S01 .TITLE TIME AND DATE ;*********************************************************************** ;* * ;* PROGRAM IDENTIFICATION. TIME AND DATE, CATALOG NUMBERS * ;* ; RESPECTIVELY, SET TIME OF DAY, TYPE TIME OF DAY, * ;* SET DATE AND TYPE DATE. PSR,-(SP) ; SAVE PROCESSOR PRIORITY MOV #PLOCK,PSR ; SET CPU LOCKOUT LEVEL 7 BR ERRB10 ; SEE IF ANY OTHER REQUESTS AND ; ; PROCESS THEM ACCORDINGLY ; ERRB30: MOV #-1.,IOLUSE ; RESET I/O LIST IN USE SWITCH MOV (SP)+,PSR ; RESTORE CPU PRIORITY RTS PC ; RETURN TO TTYOUT .END ;IS TASK TO BE TIME-SLICED AN OVERLAY? BLT CALA02 ;NO: A "CORE" TASK MOV (SP)+,R1 ;RESTORE FOR CALL TO "SAVE" CALA01: SAVE ;SWITCH TO SYSTEM STACK AND SAVE REGS MOV $CTASK,R0 ;WILL USE AS INDEX MOVB #1,TSTAT(R0) ;SET TASK STATUS: "IN USE BY OVLY MTR" MOV R4,PS ;DROP CPU LEVEL BEFORE CALL MOV R4,-(SP) ;SAVE PS OF INTERRUPTED PROGRAM JSR PC,TSOVLY OFE00 ; ABORT THE TASK ; PLOCK = 340 ; CPU PRIORITY LOCKOUT MASK PSR = 177776 ; ; TASK STATUS EQUATES ; QUISNT = 0. ; QUIESCENT OVYACT = 1. ; RPOM WORKING ON TASK QINROS = 2. ; QUEUED IN ROS THREAD TACTVE = 3. ; TASK ACTIVE VOLSUS = 4. ; VOLUNTARILY SUSPENDED INVSUS = 5. ; INVOLUNTARILY SUSPENDED TDSABL = 6. * ;* * ;* PURPOSE. THIS SUBROUTINE WILL TAKE THE OPERATOR INPUT FROM A * ;* 'TM,HH:MM' OR 'DT,MM/DD/YY' COMMAND AND USE IT TO SET THE * ;* ROS SYSTEM TIME-OF-DAY OR DATE, RESPECTIVELY. IF THE COMMAND * ;* TO TYPE THE TIME-OF-DAY 'TM' OR TYPE THE DATE 'DT' IS GIVEN, * ;* IT WILL DO SO. * ;* : "QTIME" * ; * TIMER MODULE QUEUEING SUBROUTINE * ; * * ; * PURPOSE: LOADS TIMER MODULES ONTO "WAIT" STACK FOR "TIMER" * ; * "TMNSRT" IS RESPONSIBLE FOR UNLOADING FROM THE STACK * ; * AND STRINGING ONTO PROPER THREAD * ; * * ; * USAGE: CALLED ;CALL "TIME-SLIC OVERLAY" ROUTINE MOV #340,PS ;RAISE CPU LEVEL AGAIN BEFORE CLOCK MOVB #2,SVSWCH ;CLOSE SWITCH TO AVOID SECOND "SAVE" ;MAKE SYSTEM STACK LPOK 3C2G5AE5+E7XE-4X7T MOV #RESTOR,-(SP) ;...FROM "RESTOR" TO MAKE RTI WORK BR CALA08 ;SKIP ABORT SEQUENCE CALA02: ;(CONTINUE) .ENDC OVRLAY MOV R2,-(SP) ;SAVE USER'S ASL R1 ; DISABLED TABRTD = 7. ; ABORTED .PAGE DELTSK = . MOV #8.,R1 ; FUNCTION SWITCH FOR DELTSK BR TOFA00 ; ENABLE = . CLR R1 ; FUNCTION SWITCH FOR ENABLE BR TOFA00 ; DSABLE = . MOV #2.,R1 ; FUNCTION SWITCH FOR DSABLE BR TOFA00 ; QTASK = . MOV #4.,R1 ; FUNCTION SWITCH FOR QTASK BR TOFA00 ; TAB * ;* PROGRAM USAGE. INPUT CALLS TIME OR DATE VIA * ;* JSR PC,TIME OR * ;* JSR PC,DATE * ;* WHERE: R5 = ADDRESS OF COMMAND STRING DELIMITER POSITION * ;* R4 = NUMBER OF POSITIONS IN PARAMETER NOT INCLUDING * ;* DELIMITER OR EOM. * ;* UPON RETURN FROM THIS SUBROUTINE+ BY ANY ROUTINE WISHING TO ACTIVATE A TIMER * ; * MODULE. CALLING SEQUENCE: * ; * MOV #MODULE,-(SP) ;STACK MODULE'S ADDRESS * ; * MOV TIME,-(SP) ;STACK TIMER-RESET WORD * ; * EMT QTIME ;REQUEST TO QUEUE MODULE * ; * OR * ; * JSR PC,QTIME * ; * ;USED AS A WORD INDEX MOV FIRST(R1),R2 ;ADDRESS OF FIRST TASK BEQ CALA05 ;NO TASKS IN QUEUE: DON'T SLICE MOV R2,@LAST(R1) ;LINK FRONT TASK TO END OF THREAD... MOV R2,LAST(R1) ;...AND UPDATE THE "LAST" POINTER MOV (R2),FIRST(R1) ;THEN MAKE "FIRST" POINT TO WHAT WAS ;THE SECOND TASK IN QUEUE CLR @LAST(R1) ;ZERO THREAD WORD OF NEW LAST TASK CALA05: "R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ; ******************************************************************** ; * * ; * IDENTIFICATION: RAD50P : RADIX-50 PACK SUBROUTINE * ; * * ; * PURPOSE: TO CONVERT A STRING OF SIX ASCIT CHARACTERS * ; * TO TWO PACKED BINARY WORDS IN RAD50 CODE. * ; ; ******************************************************************** ; * * ; * PROGRAM IDENTIFICATION: "SETGET" * ; * SET TIME SET DATE GET TIME GET DATE * ; * * ; * ROUTINES TO SET AND GET CURRENT TIME AND DATE * ; * ORT = . MOV #6.,R1 ; FUNCTION SWITCH FOR TABORT ; TOFA00 = . ; TASK ORIENTED FUNCTION PROCESSOR CMPB (R5)+,#COMMA ; DELIMITER POSITION A COMMA? BNE TOFC05 ; NO-ERROR TST R4 BEQ TOFC05 ; PARAMETER MUST BE 1-3 CHARACTERS CMP R4,#MXTSKL ; MAX. TASK CHAR. LENGTH =3 BHI TOFC05 ; ERROR - TOO MANY POSITIONS JSR PC,CVTBIN ; CONVERT ;EXIT FROM TIME-SLICE MOV (SP)+,R2 ;RESTORE USER'S MOV (SP)+,R1 ;LIKEWISE BR CALA08 ;BYPASS ABORT SEQUENCE CALA06: ;HERE WHEN LEVEL IS NOT A SLICER: DO ABORT==> MOV (SP)+,R1 ;RESTORE USER'S .ENDC $TMSLC ; ABORT SEQUENCE: TASK'S ABORT COUNTER REACHED ZERO (@TIMA40) MOV $CTASK,-(SP) ;STACK CURRENTLY ACTIVE TASK'S NUMBER... JSR PC,ABORT ;...AN; UPDATE 3/MAY/72 EMT.S34 ; UPDATE 4/13/72 EMTRAP ; ******************************************************************** ; * PROGRAM IDENTIFICATION: "EMTRAP" * ; * EMULATOR TRAP SERVICE ROUTINE * ; * * ; * PURPOSE: DECODES ALL EMT CALLS AND TRANSFERS CONTROL TO PROPER* ; * SUBROUTINE, AFTER ALTERING STACK TO LOOK IDENTICAL * ; * USAGE: * ; * USED BY GENERAL ROUTINES TO FETCH CURRENT TIME * ; * AND/OR DATE. USED BY OPERATOR INPUT PROGRAM TO SET * ; * TIME AND/OR DATE FROM TTY KEYBOARD. * ; * * ; * CALLING SEQUENCES: * ; * MOV NEWHR,-(SP) ;PUSH NEW HOUR TO BINARY INTEGER TST R5 ; CONVERSION ERROR OCCUR? BEQ TOFC05 ; YES CMP R4,#$INPNO ; TRYING TO SCREW AROUND WITH INPUT? BEQ TOFC05 ; YES TOFA10: CMP R4,TASKS ; IS TASK VALID? BGT TOFC05 ; NO ASL R4 ; TASK NO. WORD INDEX CMP #1.,HEADER(R4) ; TASK LOADED IN SYSTEM BEQ TOFC05 ; NO-ERROR ASR R4 MOV PD REQUEST ITS ABORTION CLR -(SP) ;NOW ON SYSTEM STACK... MOV #DSPTCH,-(SP) ;...SO SET IT UP TO RETURN PROPERLY CALA08: ;HERE WHEN READY TO RUN THE CLOCK DECB TICTOC ;# OF TICS PER SECOND BEQ CALA10 ;NEW SECOND CALA09: RTI ;USED AS RETURN ALSO FROM[CALA40] .PAGE CALA10: ;ON EACH SECOND COME HERE CLRB SKSWCH ;INIT TO RUN "SKNSRT" AND TO A * ; * "JSR PC,SBRTNE". * ; * * ; * USAGE: ALL EXTERNAL LINKS TO MONITOR SUBROUTINES ARE MADE VIA * ; * CALLS OF THE FORM: "EMT SNUMBER", WHERE "SNUMBER" IS A * ; * PRE-ASSIGNED INDEX TO THE TABLE OF MONITOR SUBROUTINES. ANY * ; * ARGUMENTS REQUIRED BY THE SUBROUTINE MUST BE PUSHED ONTO THE * ; * STACK PRIOR TO THE CALL. UPON ENTRY TO THE * ; * MOV NEWMIN,-(SP) ;PUSH NEW MINUTE * ; * JSR PC,STIME ;CALL "SET TIME" * ; * TST (SP)+ ;POP ERROR WORD * ; * BNE ERROR ;CALL PARAMETERS IN ERROR * ; * ---------------- * ; * MOV NEWMTH,-(SP) ;PUSH NEW MONTH * ; * MOV NEWDAY,-(SP) ;PUSH NEW SR,R2 ; SAVE PRIORITY IN R2 JMP @PROCSS(R1) ; PERFORM PROCESS ; ; ENABLE THE TASK SPECIFIED BY R4 ; TOFB00 = . MOV #PLOCK,PSR ; SET CPU PRIORITY LOCK-OUT CMPB #TDSABL,TSTAT(R4) ; IS TASK DISABLED? BNE TOFB10 ; NO-IGNORE REQUEST CLRB TSTAT(R4) ; YES-ENABLE AND SET QUIESCENT MOV R2,PSR ; RESTORE CPU PRIORITY TOFB10: RTS PC ; RETURN ; ; DISABLNOT "SKED" MOV R0,-(SP) MOV R1,-(SP) MOV #CLOCK,R0 ;POINTER TO TIME & DATE BYTES MOVB #TICRES,(R0)+ ;RESET [TICTOC] INCB (R0) ;NEXT SECOND CMPB (R0),#60. ;NEW MINUTE? BLT CALA40 ;NO: BUT GO TO END TO RUN "SKNSRT" INCB SKSWCH ;SET TO RUN "SKED" AND NOT "SKNSRT" CLRB (R0)+ ;RESET [SECOND] & GO ON TO... INCB (R0) ;...BU SUBROUTINE THE STACK* ; * WILL LOOK THE SAME AS IF A "JSR PC,SBRTNE" HAD BEEN THE CALL. * ; * THIS ALLOWS CALLS OF THE JSR-TYPE TO BE COMPATIBLE WITH THE * ; * EMT-TYPE CALLS. ALTHOUGH PROCESSOR STATUS IS RAISED TO LEVEL * ; * SEVEN DURING THE TRAP ROUTINE, IT IS RETURNED TO ITS STATE * ; * AT THE TIME OF CALL WHEN THE CALLED SUBROUTINE IS ENTERED. * ; * * ; * STACK ON ENTRY: DAY * ; * MOV NEWYR,-(SP) ;PUSH NEW YEAR * ; * JSR PC,SDATE ;CALL "SET DATE" * ; * TST (SP)+ ;POP ERROR WORD * ; * BNE ERROR ;CALL PARAMETERS IN ERROR * ; * ---------------- * ; * JSR PC,GDATE ;CALL "GET DATE" * ; * MOV (SP)+,CURYR ;PE THE TASK SPECIFIED BY R4 ; TOFC00 = . MOV #PLOCK,PSR ; SET CPU PRIORITY LOCK-OUT TSTB TSTAT(R4) ; IS TASK QUIESCENT? BEQ TOFC10 ; YES- OK THEN CMPB TSTAT(R4),#TDSABL ; NON-QUIESCENT BGE TOFC10 ; NO - OK MOV R2,PSR ; ERROR - CAN'T DISABLE - RESTORE CPU TOFC02: MOV #ER3MSG,DATADR ; SET UP TO TYPE TOFC03: MOV #TTYLST,-(SP) ; APPROPRIATE EMT TTYOUTMP [MINUTE] CMPB (R0),#60. ;NEW HOUR? BLT CALA40 ;NO: BUT GO RUN SCHEDULER CLRB (R0)+ ;RESET [MINUTE]... INCB (R0) ;...AND BUMP [HOUR] CMPB (R0),#24. ;NEW DAY? BLT CALA40 ;NO CLRB (R0)+ ;YES: RESET [HOUR]... INC (R0) ;...AND BUMP [JDATE] CMP (R0),(PC)+ ;NEW YEAR? MXDAYS: .WORD 0 ;HOLDS #DAYS IN CU * ; * 2(SP): (PS) AT TIME OF TRAP * ; * (SP): (PC) CALLER RETURN ADDRESS * ; * * ; * STACK ON EXIT: * ; * (SP): (PC) CALLER RETURN ADDRESS * ; * * ; * ERROR RETURNS: IF AN EMTOP CURRENT YEAR (-1900) * ; * MOV (SP)+,CURDAY ;POP CURRENT DATE * ; * MOV (SP)+,CURMTH ;POP CURRENT MONTH * ; * ---------------- * ; * JSR PC,GTIME ;CALL "GET TIME" * ; * MOV (SP)+,CURHR ;POP CURRENT HOUR * ; * MOV (SP)+,CURMIN ;POP CURRENT MINUTE * ; * MOV (SP)+,CURS ; ERROR MESSAGE TOFC05: CLR R5 ; SET ERROR INDICATOR FOR INPUT TOFC08: RTS PC ; RETURN ; TOFC10 = . MOVB #TDSABL,TSTAT(R4) ; DISABLE TASK MOV R2,PSR ; RESTORE CPU PRIORITY RTS PC ; RETURN ; ; QUEUE THE TASK SPECIFIED BY R4 ; TOFD00 = . MOV R4,-(SP) ; TASK NO. TO STACK FOR CALL .IFNZ DPRTY CLR -(SP) ; USE PRRENT YEAR BLE CALA30 ;NO: GO TO NEXT DAY + MAYBE NEW MONTH ;HAPPY NEW YEAR!! MOV #1,R1 MOV R1,(R0)+ ;RESET [JDATE] MOVB R1,(R0)+ ;RESET [MONTH] MOVB R1,(R0)+ ;RESET [MDAY] INCB (R0) ;BUMP TO NEW YEAR MOVB #28.,FEBARY ;RESET FEBRUARY MOV #365.,MXDAYS ;RESET YEAR LENGTH BITB #3,(R0) ;IS THIS A LEAP YEAR CODE IS USED WHICH IS INVALID * ; * ---EITHER OUTSIDE THE LIMITS OF THE EMT TABLE, OR AN INVALID * ; * CODE WITHIN THE TABLE--- A RETURN IS MADE IMMEDIATELY TO THE * ; * CALLER WITH NO ACTION TAKEN. * ; * THE CALLER SHOULD NOTE THAT HE MAY BE INTERRUPTED BETWEEN HIS * ; * EMT CALL AND THE EVENTUAL RETURN, EVEN IN THE CASE OF AN ERROR.* ; * * ; * PROGRAMMER: 52 EC ;POP CURRENT SECOND * ; * * ; * PROGRAMMER: 52 * ; * DATE: 12-DEC-71 * ; * VERSION:001.004 * ; * * ; * G U L F E L E C T R O N I C S Y S T E M S * ; **********************RIORITY IN TASK TABLE .ENDC .IFNZ ARG CLR -(SP) ; NO ARGUMENT .ENDC CLR -(SP) ; IMMEDIATE RETURN REQUESTED EMT QUEUE ; QUEUE THE TASK TST (SP)+ ; ERROR OCCUR BLE TOFC08 ; NO-RETURN BR TOFC02 ; YES - REPORT NON-QUIESCENT MESSAGE ; ; ABORT THE TASK SPECIFIED BY R4 ; TOFE00 = . MOV R4,-(SP) ; TASK NO. TO ST? BNE CALA35 ;NO INC MXDAYS ;YES: BUMP YEAR LENGTH INCB FEBARY ;...AND FEBRUARY BR CALA35 CALA30: ;HERE @ BEGIN OF DAY & NOT NEW YEAR MOV #MONTH,R1 ;INIT POINTER TO DATE BYTE TABLE MOVB (R1)+,R0 ;[MONTH]: USED AS INDEX INCB (R1) ;[MDAY]: NEW DAY CMPB (R1),DAYTAB(R0) ;[MDAY]: END OF MONTH BLE CALA40 ;NO * ; * VERSION:003.003 * ; * DATE: 13-APR-72 * ; * * ; * G U L F E L E C T R O N I C S Y S T E M S * ; * * ; ******************************************************************** .TITLE ********************************************** .TITLE SETGET .DEF STIME,SDATE,GTIME,GDATE .REF MONTH,MDAY,YEAR,JDATE,SECOND,MINUTE,HOUR .REF TICTOC,DAYTAB,PUSHR,POPR,MXDAYS,JANARY,FEBARY .REF THDTAB,CURTHD .PAGE STIME: ;SUBROUTINE TO SET NEW TIME MOV R0,-(SP) ;SAVE USER'S MOV 4(SP),R0 ;PULL NEW MINUTE OFF STACK MOV PS,4(SP) ;REPLACE WITH CURRENT STACK EMT ABORT ; ABORT TASK RTS PC ; RETURN TO INPUT ; .END MOVB #1,(R1) ;RESET DAY TO FIRST OF MONTH INCB -(R1) ;NEXT MONTH: CAN'T BE JANUARY (ABOVE) CALA35: ;HERE TO ADJUST THE THREAD POINTER POINTER AT THE BEGIN ; OF EACH MONTH. "CURTHD" ALWAYS POINTS TO "TH1BGN" DURING ; ODD-NUMBERED MONTHS, AND TO "TH2BGN" DURING EVEN MONTHS. MOV #THDTAB,CURTHD ;INIT THREAD-START TABLE POINTER BITB #1,MONTH ;ODD-NUMBERED MONTH? BNE CALA40 ;YEMTRAP .REF QUEUE,SUSPND,UNSPND,EXIT,FRETSK,ABORT,QTIME,DQTIME .REF QSKED,DQSKED,TTYOUT,TTYIN,BINASC,ASCBIN .REF MASK,UNMASK,ERRTYP,GTIME,GDATE .REF CREAD,LPRNTR,DISCIO,SGLOAD,DECTAP .REF GOBACK,CKPT,NOCKPT,SCAN,NUMFLD,NPARAM .REF BFINIT,BFENTR,BFOPEN,BFCLOS,BFDELT,BFPACK,BFWRIT,BFREAD .REF BFWAIT,R50PAK,R50UNP,DEFINE,DELETE,PRTCT,UNPRCT .REF CORLOD .DEF EMTRAP,EMTABL,MAXEMT,EMTINIT ATUS FOR RTI USE CMP R0,#60. ;SEE IF MINUTE WITHIN RANGE BHIS STIM10 ;NO: EXIT IN ERROR CMP 6(SP),#24. ;SEE IF NEW HOUR WITHIN RANGE BLO STIM20 ;YES: PROCEED STIM10: ;ROUTINE EXIT POINT: FOR GOOD AND BAD MOV (SP)+,R0 ;RESTORE USER'S RTI ;RETURN AND RESTORE OLD CPU STATUS STIM20: ;HERE WHEN PARAMTERS ARE WITHIN RANGE , IF R5 = 0, THEN AN ERROR * ;* OCCURED AND INPUT WILL TYPE THE APPROPRIATE ERROR MESSAGE. * ;* * ;* PROGRAMMER 54 * ;* DATE * ;* REVISION * ;* * ;*******************************ES: LEAVE AS IS ADD #2,CURTHD ;EVEN: ADVANCE TO POINT TO THREAD #2 CALA40: ;HERE ON EVERY MINUTE BOUNDARY TO RUN... ;...THE SCHEDULER. ON THE OTHER 59 SECONDS, RUN "INSERT" ROUTINE. MOV (SP)+,R1 ;RESTORE USER'S FOR "SAVE" MOV (SP)+,R0 ;ALSO INCB SKDBSY ;MARK AND TEST BUSY FLAG BEFORE ENTERING BNE CALA09 ;LOG-JAM: SCHEDULER CURRENTLY RUNNING... ;...DON'T RE-ENTER: IT WILL CLEA.PAGE .IFZ $DEBUG .ASECT .=30 .WORD EMTRAP,340 ;INIT TRAP LOCATION: RUNS AT LEVEL 7. .CSECT .ENDC $DEBUG EMTRAP = . ;ENTRY TO EMT SERVICE ROUTINE ;TIMING: 64 MICROSECONDS TST -(SP) ;PUSH STACK TO MAKE ROOM FOR SBRTNE ADDR MOV R0,-(SP) ;SAVE IT MOV 4(SP),R0 ;CALLER RETURN ADDR MOV 6(SP),4(SP) ;MOVE CALLER'S PS FOR RTI EXIT  MOV #340,PS ;LOCK OUT INTERFERENCE FROM CLOCK MOVB R0,MINUTE ;UPDATE CURRENT MINUTE MOVB 6(SP),HOUR ;UPDATE CURRENT HOUR MOV #1,TICTOC ;RESET [TICS] AND [SECOND] COUNTERS CLR 6(SP) ;CLEAR ERROR CODE BR STIM10 ;GO EXIT .PAGE SDATE: ;SUBROUTINE TO UPDATE CURRENT MONTH,DAY, AND YEAR JSR R5,PUSHR ;SAVE ALL REGISTERS MOV SP,R0 **************************************** .DEF TIME,DATE .REF GTIME,GDATE,SDATE,STIME .REF CVTBIN,DATADR,TTYLST BINASC = 16 TTYOUT = 13 ; .CSECT ; ; COMMA = 54 ; ASCII COMMA TPARLN = 5. ; TIME PARAMETER LENGTH HH:MM DPARLN = 8. ; DATE PARAMETER LENGTH MM/DD/YY ; SAVSTK: .WORD 0 ; LOCATION IN WHICH TO SAVE STACK POINTER ; ASCII: .BYTE 0,0,0,0,0,0 N UP AFTER ITSELF. ; O.K. TO ENTER "SKNSRT" OR ""SKED". .IFNZ OVRLAY SVSWCH: BR .+2 ;OR [.+6] IF "SAVE" ALREADY CALLED (@CALA01) .ENDC OVRLAY SAVE ;SAVE REGS OF INTERRUPTED PGM & RTN HERE .IFNZ OVRLAY BR SKSWCH ;SKIP STACK-POP CMP (SP)+,(SP)+ ;POP "RETURN-TO-RESTOR" WORDS (@CALA02) .ENDC OVRLAY SKSWCH: BR .+2 ;SWITCH NORMALLY OPEN TO FALL THROUGH... BR SKRELY MOV R0,6(SP) ;WILL LEAVE CALLER'S PC ON STACK @ EXIT DEC R0 ;BACK POINTER ONE BYTE MOVB -(R0),R0 ;BACK POINTER TO EMT INSTR&GET EMT CODE ASL R0 ;NEED TO INDEX WORDS IN TABLE CMP R0,#MAXEMT*2 ;SEE IF CODE IS VALID BHI EMTA20 ;INVALID: OUTSIDE TABLE RANGE EMTA10: MOV EMTABL(R0),2(SP) ;LOAD STACK WITH SUBROUTINE ADDR ; IF AN INVALID CODE IS USED, THE TABLE ENTRY WILL PO ;UTILIZE AS SECONDARY STACK POINTER ADD #16,R0 ;POINT TO NEW "YEAR" ON STACK MOV (R0)+,R1 ;REMOVE YEAR MOV (R0)+,R2 ;AND NEW DAY MOV (R0),R3 ;GET MONTH FROM STACK MOV PS,-(R0) ;LOAD CURRENT PSW ON STACK FOR RTI USE MOV -4(R0),-(R0) ;AND MOVE RTN ADDR INTO PROPER PLACE,TOO CMP R3,#12. ;SEE IF MONTH IS WITHIN RANGE BHI SDAT30 ;ERROR: EXIT  ; SIX BYTE ASCII STRING FOR CONVERSION ; ; TIME-OF-DAY TTY MESSAGE ; TIMMSG = . .WORD 10. .WORD 0 .BYTE 15 ; CARRIAGE RETURN HOUR: .ASCII 'HH:' ; HOUR-HOUR MINUTE: .ASCII 'MM:' ; MINUTE-MINUTE SECOND: .ASCII 'SS' ; SECOND-SECOND .BYTE 15 ; CARRIAGE RETURN .EVEN ; ; DATE TTY MESSAGE ; DATMSG = . .WORD 10. .WORD 0  ;...TO SKIP "SKED" AND RUN "SKNSRT" ; ON THE MINUTE IT IS CLOSED TO FORCE RUN OF "SKED" INSTEAD. .PAGE SKED: ;THIS IS THE SCHEDULER ;ENTER HERE EVERY MINUTE ON THE MINUTE FROM "CALENDAR" MOV @CURTHD,R0 ;[TH1BGN] OR [TH2BGN] MOV R0,R1 ;SAVE CURRENT THREAD ADDRESS FOR... ;...POSSIBLE MODULE REMOVAL (BELOW) MOV (R0),R0 ;NEXT MODULE'S ADDRESS BEQ SK INT TO "EMTERR". MOV (SP)+,R0 ;RESTORE USER'S RTI ;POP SUBRTNE ADDRESS AND OLD STATUS ;TO EFFECT TRANSFER, LEAVING RTN TO ;CALLER ON TOP. EMTA20: CLR R0 ;RANGE ERROR: USE ENTRY 0... BR EMTA10 ;...AND FORCE EXIT VIA "EMTERR" .IFNZ $DEBUG EMTERR: HALT ;DURING DEBUG, BAD CALL CAUSES HALT .ENDC $DEBUG  MOVB #28.,FEBARY ;RESET FEBRUARY IN PREP FOR NEW YEAR MOV #365.,MXDAYS ;RESET MAX DAYS COUNT BIT #3,R1 ;IS NEW YEAR A LEAP? BNE SDAT40 ;NO: NO EXTRA DAY INCB FEBARY ;YES: ADD FEB 29 INC MXDAYS ;EXTRA DAY IN LEAP YEAR SDAT40: CMPB R2,DAYTAB(R3) ;CHECK DATE FOR PROPER RANGE THIS MONTH BLO SDAT50 ;O.K.: WITHIN RANGE MOVB DAYTAB(R3),R2 ;ERROR: USE  .BYTE 15 ; CARRIAGE RETURN MONTH: .ASCII 'MM/' ; MONTH-MONTH DAY: .ASCII 'DD/' ; DAY-DAY YEAR: .ASCII 'YY' ; YEAR-YEAR .BYTE 15 ; CARRIAGE RETURN .EVEN ; ; TIME-OF-DAY EDIT TABLE ; TIMEDT = . .WORD HOUR .WORD MINUTE .WORD SECOND ; ; DATE EDIT TABLE ; DATEDT = . .WORD YEAR .WORD DAY .WORD MONTH DEX2 ;END OF THREAD: EXIT MOV R4,PS ;DROP CPU LEVEL TO BE FAIR TO OTHERS MOV STRTWD(R0),-(SP);STACK THIS MODULE'S START WORD FOR... JSR PC,UNPACK ;...CALL TO UNPACK SUBROUTINE, WHICH ; RETURNS WITH TIME & DATE OF MODULE'S START WORD SPREAD ON STACK ; (SP) = DAY OF MONTH 2(SP) = HOUR 4(SP) = MINUTE CMPB (SP),MDAY ;SEE IF MODULE IS FOR TODAY BGT SKDEX1 ;FOR TOMORROW OR BEYOND: EXIT .IFZ $DEBUG EMTERR: RTS PC ;ERROR RETURN USED FOR INVALID CODES .ENDC $DEBUG .PAGE EMTABL = . ;TOP OF EMT LINK TABLE .WORD EMTERR ;#0 ALWAYS AN ERROR .WORD QUEUE ;#1 .WORD SUSPND ;#2 .WORD UNSPND ;#3 .WORD EXIT ;#4 .WORD FRETSK ;#5 .WORD ABORT ;#6 .WORD QTIME ;#7 .WLAST DAY RATHER THAN ERR OUT SDAT50: MOV R3,-(SP) ;SAVE MONTH ON STACK FOR USE BELOW MOV #JANARY,R0 ;PREPARE TO CALC JULIAN DAY CLR R4 ;WILL ACCUM TOTAL DAYS SDAT10: DEC R3 ;COUNT DOWN MONTHS BLE SDAT20 ;DONE: EXIT LOOP MOVB (R0)+,R5 ;CAN'T ADD BYTES ADD R5,R4 ;ACCUM DAYS FROM DAY TABLE BR SDAT10 ;LOOP BACK FOR MORE .PAGE SDAT20: AD ; ; ; THE FOLLOWING SUBROUTINE IS USED BY TIME AND DATE ; TO CONVERT THE 'HH:MM' OR 'HH/DD/YY' STRING TO ; BINARY AND PUT IT ON THE STACK FOR STIME OR SDATE. ; R0 = NUMBER OF TWO CHARACTER FIELDS TO CONVERT ; R5 = FIRST CHARACTER POSITION TO CONVERT ; CVT2CH = . MOV (SP)+,R1 ; SAVE RETURN PC CVT210: MOV #2.,R4 ; CONVERT NEXT TWO CHARACTERS JSR PC,CVTBIN ; TO BINARY TST  BLT SKDB10 ;FOR YESTERDAY OR EARLIER: EXECUTE MODULE CMPB 2(SP),HOUR ;TODAY: THIS HOUR? BGT SKDEX1 ;MODULE IS EARLY: EXIT BLT SKDB10 ;MODULE IS LATE: EXECUTE CMPB 4(SP),MINUTE ;FOR THIS HOUR. THIS MINUTE? BGT SKDEX1 ;TOO SOON SKDB10: MOV #340,PS ;LOCK OUT INTERFERENCE FROM "DQSKED" ADD #6,SP ;POP "START" WORD CMP (R0),#1 ;ALREADY DORD DQTIME ;#10 .WORD QSKED ;#11 .WORD DQSKED ;#12 .WORD TTYOUT ;#13 .WORD TTYIN ;#14 .WORD DECTAP ;#15 .WORD BINASC ;#16 .WORD ASCBIN ;#17 .WORD MASK ;#20 .WORD UNMASK ;#21 .WORD ERRTYP ;#22 .WORD DISCIO ;#23 .WORD CREAD ;#24 .WORD LPRNTR D R2,R4 ;ADD TODAY'S DATE MOV #JDATE,R3 ;WILL USE AS POINTER TO DATE BYTES MOV #340,PS ;LOCK OUT INTERFERENCE FROM CLOCK MOV R4,(R3)+ ;LOAD JULIAN DATE MOV (SP)+,(R3) ;LOAD NEW MONTH MOV #THDTAB,CURTHD ;INIT CURRENT THREAD POINTER BITB #1,(R3)+ ;IS MONTH ODD OR EVEN? BNE SDAT25 ;ODD: LEAVE AT THREAD #1 ADD #2,CURTHD ;EVEN: ADVANCE TO THRE R5 ; ERROR OCCUR DURING CONVERSION? BEQ TDERR ; YES-ERROR MOV R4,-(SP) ; NO-SAVE ON STACK FOR STIME/SDATE ADD #3.,R5 ; BUMP TO NEXT TWO CHARACTER NUMBER DEC R0 ; FINISHED? BNE CVT210 ; NO JMP (R1) ; YES ; ; ERROR RETURN TO INPUT ; TDERR = . CLR R5 ; SET ERROR INDICATOR MOV SAVSTK,SP E-QUEUED? BNE SKDB20 ;STILL O.K. BR SKED ;...AND GO BACK FOR ANOTHER ONE SKRELY: BR SKNSRT ;RELAY POINT FOR SKIP TO 'INSERT' RTNE .PAGE SKDB20: ;O.K. TO WORK ON THIS MODULE MOV (R0),(R1) ;FIRST: REMOVE MODULE BY "BRIDGING" THE ;THREAD OVER ITSELF, CONNECTING PREVIOUS ;MODULE WITH FOLLOWING ONE MOV #1,(R0) ;SET THI ;#25 .WORD GOBACK ;#26 .WORD CKPT ;#27 .WORD NOCKPT ;#30 .WORD GTIME ;#31 .WORD GDATE ;#32 .WORD SCAN ;#33 .WORD NUMFLD ;#34 .WORD NPARAM ;#35 .WORD BFINIT ;#36 .WORD BFENTR ;#37 .WORD BFOPEN ;#40 .WORD BFCLOS ;#41 .WORD BFDELT ;#42 AD #2 SDAT25: MOVB R2,(R3)+ ;LOAD DAY OF MONTH MOVB R1,(R3) ;LOAD CURRENT YEAR CLR 22(SP) ;CLEAR ERROR WORD FOR GOOD RETURN SDAT30: JSR R5,POPR ;RESTORE ALL REGISTERS TST (SP)+ ;POP THIRD ARGUMENT SINCE RTI NEEDS TWO RTI ;STACK SET TO RETURN AND RESTORE .PAGE ; NOTE: SUBROUTINES "GTIME" AND "GDATE" SHARE THE SAME CODE. ; THE CARRY BIT IS USED AS A SWITCH TO DE; RESTORE STACK INCASE ERROR OCCURED ; ; WHILE IN CVT2CH RTS PC ; RETURN ; TIME = . MOV SP,SAVSTK ; SAVE STACK POINTER INCASE ERROR RETURN CMPB (R5)+,#COMMA ; DELIMITER POSITION A COMMA? BNE TIMB00 ; NO- TYPE TIME-OF-DAY CMP R4,#TPARLN ; CORRECT NO. OF CHRACTERS TO SET TIME? BNE TDERR ; NO-ERROR MOV #2.,R0 ; GOS MODULE INACTIVE... MOV R4,PS ;...DROP CPU LEVEL TO INTERRUPTED LEVEL MOV R0,R1 ;...AND SET UP THE SECONDARY MODULE PNTR MOV 2(R1),R2 ;GET OPTION & TASK WORD BPL SKDC10 ;"R" REPEAT FLAG NOT SET MOV DELTA(R1),-(SP) ;GET REPEAT WORD & STACK IT FOR CALL... JSR PC,UNPACK ;...TO SPREAD IT ON STACK JSR PC,ADDNOW ;ADD CURRENT TIME TO STACKED TIME TST (R1)+  .WORD BFPACK ;#43 .WORD BFWRIT ;#44 .WORD BFREAD ;#45 .WORD R50PAK ;#46 .WORD R50UNP ;#47 .WORD BFWAIT ;#50 .WORD DEFINE ;#51 .WORD DELETE ;#52 .WORD PRTCT ;#53 .WORD UNPRCT ;#54 .WORD SGLOAD ;#55 .WORD CORLOD MAXEMT = .-EMTABL/2-1 .PAGE .CSECT .EMTINTERMINE WHETHER TO LOAD TIME ; OR DATE. BY USING THE PSW TO STORE THIS SWTICH, AND BY RUNNING THE ; ROUTINE UNDER LOCKOUT AFTER THE CARRY BIT IS SET/CLEARED, RE-ENTRANCY ; IS MAINTAINED, AND THE POSSIBILITY OF CLOCK ALIASING IS ELIMINATED. GDATE: ;SUBROUTINE TO GET DATE CLC ;MARK TO GET DATE (BELOW) BR GETSB1 ;SHARE ROUTINE GTIME: ;SUBROUTINE TO GET TIME SEC ;MARK TO GET TIME (BELOW) GETSB1 THRU CONVERT LOOP TWICE JSR PC,CVT2CH ; CONVERT TO BINARY AND SET ON STACK JSR PC,STIME ; SET TIME OF DAY IN ROS TIMA10: TST (SP)+ ; ERROR OCCUR? BNE TDERR ; YES-ERROR RTS PC ; NO-RETURN TO INPUT ; ; NO DELIMITER-ASSUME TYPE TIME REQUESTED ; TIMB00 = . MOV #GTIME,R0 ; ADDRESS OF GET TIME SUBROUTINE MOV #TIMEDT,R1 ; ADDRESS OF TIME EDIT TABLE  ;BUMP POINTER TO ALLOW FOR "DELTA" WORD MOV R0,-(SP) JSR PC,QSKED ;RE-QUEUE MODULE IN NEW TIME SLOT TST (SP)+ ;POP RETURN ERROR WORD SKDC10: ;CONTINUE PROCESSING MODULE... ;...WHETHER OR NOT IT WAS REPEATED TSTB R2 ;TASK NUMBER BEQ SKDD10 ;NO QUEUEING WHEN IT IS ZERO MOVB R2,-(SP) ;STACK TASK # IN PREP FOR CALL TO QU ;FORCE INTO IPL GROUP ;[GLOBAL REFERENCES WHICH REMAIN UNDEFINED AT LINK TIME BECAUSE THEY ; WERE NOT INCLUDED IN THE MONITOR BEING GENERATED WILL BE LOADED WITH ; A ZERO BY THE LOADER. THE FOLLOWING SUBROUTINE WILL BE CALLED BY "IPL" ; TO INITIALIZE THESE ENTRIES TO "EMTERR" IN CASE THEY ARE CALLED.] EMTINIT: ;SUBROUTINE TO REPLACE UNDEFINED VECTOR ELEMENTS ;WITH IMMEDIATE RETURNS. ("HALTS" IN DEBUG VERSION.) MOV #EMTABL,R0 EMTI10: TST (R0)+ : ;COMMON ENTRY TO "GET" ROUTINE MOV PS,-(SP) ;SAVE CURRENT PSW MOV #340,PS ;LOCK OUT INTERFERENCE FROM CLOCK SUB #12,SP ;NEED FIVE STACK CELLS MOV R0,(SP)+ ;SAVE USER'S SO WE CAN USE IT MOV R1,(SP)+ ;ALSO TST (SP)+ ;PREPARE FOR MOVING PS AND PC MOV SP,R0 ;USE AS SECOND STACK POINTER CMP (R0)+,(R0)+ ;ZIP UP TO POI  MOV #TIMMSG,R2 ; ADDRESS OF TIME MESSAGE JMP TYPTOD ; TYPE TIME-OF-DAY ; DATE = . MOV SP,SAVSTK ; SAVE STACK POINTER INCASE ERROR RETURN CMPB (R5)+,#COMMA ; DELIMITER POSITION A COMMA? BNE DATB00 ; NO-TYPE DATE CMP R4,#DPARLN ; CORRECT NO. OF CHARACTERS TO SET DATE BNE TDERR ; NO-ERROR MOV #3.,R0 ; GO THRU CONVERT LOOP THREE TIMES!EUE .IFNZ DPRTY ;OPTION FOR DYNAMIC PRIORITIES CLR -(SP) ;USE SYSTEM-ASSIGNED PRIORITIES .ENDC DPRTY CLR -(SP) ;IMMEDIATE RETURN REQUESTED... ;...OR INIT OF [ARG] IF NEEDED ASL R2 ;IS THE "A" (ARGUMENT) FLAG SET? BPL SKDC20 ;NO: LEAVE THE ZERO ON STACK FOR ARG'MNT .IFNZ ARG ;OPTION FOR TRANSMITTING ARGUMENT MOV @6 ;IS THIS VECTOR ELEMENT UNDEFINED? BNE EMTI20 ;NO MOV #EMTERR,-(R0) ;YES - PUT ERROR RETURN IN IT TST (R0)+ ;...AND ADVANCE IT AGAIN EMTI20: CMP R0,#MAXEMT*2+EMTABL ;REACHED END OF VECTOR YET? BLOS EMTI10 ;NOT YET - KEEP GOING MOV #EMTRAP,30 ;INIT EMT VECTOR MOV #340,32 RTS PC ;ALL DONE .END #NT TO WHERE PS WAS STORED MOV #MONTH,R1 ;INIT POINTER TO CLOCK AREA FOR DATE MOV (R0)+,(SP) ;MOVE PS TO NEW PLACE IN PREP FOR RTI BIT #1,(SP) ;WHILE HERE CHECK CARRY SET @ ENTRY BEQ GETSB2 ;WAS DATE: LEAVE AS IS MOV #SECOND,R1 ;WAS TIME: RE-INIT FOR TIME GETSB2: ;R1 NOW POINTING TO PROPER PARAMTER LIST MOV (R0),-(SP) ;ALSO TRANSFER PC CLR (R0) ;ALL UPPER$ JSR PC,CVT2CH ; CONVERT TO BINARY AND SET ON STACK JSR PC,SDATE ; SET DATE IN ROS BR TIMA10 ; CHECK FOR ERROR & RETURN ; ; NO DELIMITER-ASSUME TYPE DATE REQUESTED ; DATB00 = . MOV #GDATE,R0 ; ADDRESS OF GET DATE SUBROUTINE MOV #DATEDT,R1 ; ADDRESS OF DATE EDIT TABLE MOV #DATMSG,R2 ; ADDRESS OF DATE MESSAGE ; ; TYPTOD IS USED BY TIME AND DATE TO TYPE THE TIME%(R1),(SP) ;YES: PUT ACTUAL ARG IN PLACE OF ZERO .ENDC ARG TST (R1)+ ;BUMP POINTER IN ANY CASE IF "A" IS SET SKDC20: .IFNZ ARG ;OPTION FOR TRANSMITTING ARGUMENT CLR -(SP) ;PUSH RETURN CODE .ENDC ARG JSR PC,QUEUE ;NOW CALL "QUEUE" TO RUN REQUESTED TASK TST (SP)+ ;...AND POP ERROR CODE ON RETURN SKDD10: ;QUEUEING OR NO, NOW CHECK FOR FLAG-SET & * * ; * USAGE: CALLING SEQUENCE: * ; * * ; * MOV #ASCBUF,-(SP) ;STACK ADDRESS OF ASCII STRING * ; * MOV #BINBUF,-(SP) ;STACK ADDR OF FIRST BINARY WRD* ; * EMT 38. ;TRAP TO ROUTINE * ; * ' BYTES WILL BE CLEARED... ;...BEFORE DATA LOADED ONTO STACK MOVB (R1)+,(R0) ;LOAD MONTH [OR] SECOND CLR -(R0) ;NEXT STACK CELL MOVB (R1)+,(R0) ;LOAD DAY [OR] MINUTE CLR -(R0) MOVB (R1)+,(R0) ;LOAD YEAR [OR] HOUR CMP -(SP),-(SP) ;MOVE TO POINT AT SAVED REGISTERS MOV (SP)+,R0 ;RESTORE USER'S MOV (SP)+,R1 ;ALSO RTI (-OF-DAY ; OR TO TYPE THE DATE. ; UPON ENTRY: R0 = ADDRESS OF GTIME OR GDATE ; R1 = APPROPRIATE EDIT TABLE ADDRESS ; R2 = ADDRESS OF MESSAGE ; TYPTOD = . MOV #3.,R5 ; GO THRU LOOP THREE TIMES JSR PC,(R0) ; GET TIME OR GET DATE TYPT10: MOV #ASCII,-(SP) ; ADDRESS OF CONVERSION WORK STRING EMT BINASC ; CONVERT NO. ON STACK TO ASCII ) ASL R2 ;IS THE "F" FLAG OPTION SET? BPL SKED ;NO: THIS MODULE DONE: BACK FOR MORE BISB 8.(R1),@6(R1) ;YES: DO [IOR] OF MASK INTO FLAG LOC'N BR SKED ;DONE WITH MODULE: LOOK FOR MORE SKDEX1: ADD #6,SP ;ADJUST SP FROM CALL TO "UNPACK" SKDEX2: ;SCHEDULER EXIT WITH NO STACK POP MOV #340,PS ;PROTECT CHECK OF BUSY FLAG MOVB #-1,SKDBSY ;RESET FLAG * * ; * ON RETURN THE STACK WILL BE CLEARED. THE SET OF CHARACTERS * ; * FOR RAD50 CONSISTS OF THE LETTERS A-Z, THE NUMBERS 0-9,AND * ; * THE TWO SPECIAL CHARACTERS [$] AND [.]. ANY OTHER CHARACTERS * ; * IN THE INPUT STRING WILL BE TREATED AS BLANKS. * ; * DATE: 30-MAR-72 * ; * VERSION:001.002 * ; * ;ZAP! RETURN TO CALLER WITH HIS STATUS ; ...AND THREE PARAMETERS ON STACK. .END V MOV (R1)+,R4 ; ADDR. AT WHICH TO STORE 2 CHAR. ASCII MOVB ASCII+4,(R4)+ ; SET IN APPROPRIATE PLACE MOVB ASCII+5,(R4)+ ; IN MESSAGE DEC R5 ; FINISHED? BNE TYPT10 ; NO DEC R5 ; SET R5 NON-ZERO FOR NO ERROR MOV R2,DATADR ; SET MESSAGE ADDRESS IN I/O LIST MOV #TTYLST,-(SP) ; I/O LIST TO STACK EMT TTYOUT ; OUTPUT TIME OR DATE ME-TO ALLOW NEXT ENTRY JMP RESTOR ;RETURN TO INTERRUPTED PGM ==>[RESTOR] .PAGE SKNSRT: ;ROUTINE TO INSERT SCHEDULER MODULES FROM THE WAITING ;TABLE. ALSO LOOP RE-ENTRY POINT FROM END MOV #340,PS ;LOCK OUT INTERFERENCE FROM "QSKED" SKNA10: ;LOOP RETURN WHEN LOCKOUT IS ALREADY SET MOV @STBPTR,R0 ;GET ADDRESS OF NEXT MODULE BEQ SKDEX2 ;TABLE EMPTY: EXIT VIA "RESTOR" SU. * ; * G U L F E L E C T R O N I C S Y S T E M S * ; * * ; ******************************************************************** .TITLE RAD50 .REF PUSHR,POPR .DEF R50UNP,R50PAK .PAGE RAD50PACK: ;CONVERT 6 ASCII CHARS TO 2 BINARY WORDS R50PAK: ;N=1600A+40B+C JSR R5,PUSHR ;SAVE ALL / TST (SP)+ ;TEST ERROR RETURN CODE * ; * * ; * THE MODULE MUST BE SET UP, PRIOR TO THE CALL, AS DESCRIBED * ; * IN THE ROS USER'S MANUAL. NOTE THAT CALLS FOR MODULES HAVING * ; * THE "S" SUSPEND OPTION SET WILL CAUSE TRANSFER TO THE * ; * DISPATCHER, AND WILL NOT RETURN UNLESS THE CALL IS IN ERROR. * ; * ON THESE CALLS THE MODULE'S TASK NUMBER IS AUTOMATICALLY SET * ; * 0; UPDATE 2 14 MAR 1972 ADD WORD TO I/O LISTS, CLEAN UP ; UPDATE 1 13 MAR 1972 FIX .REFS & .DEFS .TITLE RCMTST RCT ;***********************************************************************RCT ; *RCT ; THIS TASK (#13.) IS USED TO TEST THE FOLLOWING: *RCT ; 1) ROSCOM *RCT ; 1B #2,STBPTR ;NOT EMPTY: POP POINTER BACK ONE CELL MOV #1,(R0) ;SET INACTIVE IN CASE DE-QUEUED BIT #10000,2(R0) ;WAS IT DE-QUEUED WHILE IN TABLE? BNE SKNA10 ;YES: IGNORE AND CONTINUE MOV R4,PS ;RESTORE PREVIOUS CPU LEVEL MOV 4(R0),-(SP) ;STACK MODULE'S DATE WORD FOR... JSR PC,UNPACK ;...CALL TO SPREAD IT ON STACK BIT #4000,2(R0) ;IS THE "C" (CURRENT) BIT ON? 2REGS MOV 16(SP),R0 ;BINARY BUFFER ADDRESS MOV 20(SP),R1 ;ASCII STRING ADDRESS MOV #3*400+3,R2 ;SET MAJOR & MINOR LOOP COUNTS RADP10: CLR R3 ;BINARY SUM RADP20: MOVB (R1)+,R4 ;NEXT ASCII CHAR BIC #-177-1,R4 ;CLEAR POSSIBLE PARITY SUB #100,R4 ;REDUCE ALPHAS TO 1-32 BLE RADP40 ;WAS BELOW [A] CMP R4,#32 ;ABOVE [Z]? BGT RADP90 3 TO THE CURRENTLY ACTIVE TASK'S NUMBER. * ; * IF THE "WAIT" STACK IS FULL, "QTIME" WILL EXIT WITH THE ERROR * ; * CODE WORD ON THE STACK NON-ZERO. THE MODULE WILL NOT BE QUEUED* ; * "QTIME" TAKES ITS ERROR EXIT IF THE REQUESTED MODULE IS ALREADY* ; * IN EITHER A TIMER THREAD OR THE "WAIT" STACK, AND HAS NOT BEEN * ; * FLAGGED FOR DE-QUEUEING. GOOD RETURNS ARE MADE WHEN THE MODULE* ; * IS FOUND INACTIVE OR MARKED FOR DE-QUEUEING IN THE "WAIT" STACK*4 2) BFUP VIA ROSCOM. *RCT ; *RCT ; IT ALSO WILL ALLOW DISK FILES TO BE DUMPED TO THE LINE PRINTER *RCT ; ITS IPL ENTRY 'RCIPL' WILL ALSO PLACE THE BFUP FILE DIRECTORY *RCT ; ENTRY IN SLOT #1 OF THE CORE DIRECTORY, 'FILE'. *RCT ; *RCT ; DATE: 4-MAR-72 5 BEQ SKNA15 ;NO: INTERPRET START WORD NORMALLY BIC #4000,2(R0) ;AVOID USING "C" FLAG ON A RE-QUEUE JSR PC,ADDNOW ;GO ADD "START DELAY" TO CURRENT TIME BR SKNA40 ;BYPASS NORMAL INTERPRET OF "START" SKNA15: CMP 4(SP),#77 ;IF "MIN" IS ALL ONES... BNE SKNA20 MOVB MINUTE,4(SP) ;...THEN USE CURRENT MINUTE SKNA20: CMP 2(SP),#37 ;IF "HOUR" IS ALL ONES... BNE SKNA30 6 ;YES RADP30: ASL R3 ;NOW MULTIPLY BY 40(10) ASL R3 ;*4 ASL R3 ;*8 MOV R3,R5 ASL R3 ;*16 ASL R3 ;*32 ADD R5,R3 ;32+8=40 ADD R4,R3 ;+ CHAR DECB R2 ;DONE 3 CHARS? BGT RADP20 ;NO MOV R3,(R0)+ ;YES: STORE CONVERTED BINARY WORD SWAB R2 7 ; * IN THIS LAST CASE, THE MARK FOR DE-QUEUEING WILL BE REMOVED, * ; * AND THE MODULE WILL REMAIN WHERE IT IS ON THE "WAIT" STACK. * ; * * ; * PROGRAMMER: 52 * ; * VERSION:003.005 * ; * DATE: 13-APR-72 * ; * 8 *RCT ; *RCT ;***********************************************************************RCT .REF FILE,HEADER,TSTAT,TPRTY,TASKS .DEF RCIPL ; R0 = %0 R1 = %1 R2 = %2 R3 = %3 R4 = %4 R5 = %5 SP = %6 PC = %7 CR = 15 LF = 12 BFILE = 200 ; ROS ID FOR9 MOVB HOUR,2(SP) ;...THEN USE CURRENT HOUR ;IF "CURRENT HOUR" WAS SPECIFIED, BUT... ; ...A SPECIFIC MINUTE WAS CALLED (RATHER THAN THE CURRENT MINUTE),... ; ...AND IT IS EARLIER THAN THE CURRENT MINUTE, WE WILL AUTOMATICALLY... ; ...INCREMENT THE HOUR. THIS AVOIDS QUEUEING HIM FOR AN EARLIER TIME ; WHICH WOULD PUT HIM IN THE "FUTURE" QUEUE. WE ASSUME THIS IS WHAT HE ; HAD IN MIND WHEN SETTING UP THE MODULE. HE CAN FORCE HIMSELF INTO THE ; "FUTURE": ;HABE WE DONE 2 WORDS? BNE RADP10 ;ONLY ONE SO FAR: LOW BYTE NOW HAS 3 RADP35: JSR R5,POPR ;DONE: POP SAVED REGS MOV (SP)+,(SP) ;POP INPUT ARGS MOV (SP)+,(SP) RTS PC ;RTN TO CALLER .PAGE RADP40: ADD #100-56,R4 ;WAS BELOW [A]: IS IT BELOW [.]? BLT RADP50 ;YES CMP R4,#71-56 ;IS IT ABOVE [9]? BGT RADP90 ;YES: ERROR ; * ; * G U L F E L E C T R O N I C S Y S T E M S * ; * * ; ******************************************************************** .TITLE TIMERS .DEF QTIME .DEF TIMER .DEF TWAITB,TTBPTR,TFIRST,TLAST,RESTAB,CURTAB,TIMBSY,BASCNT .REF UNSPND,QUEUE .REF $CTASK,$PRIOR,SUSPND .REF PUSHR,POPR,RESTOR .PAGE QTIME: < BFUP FILE RCTPRT = NPRIOR ; PRIORIITY LEVEL FOR THIS TASK. RCTNUM = 13. ; THIS TASK'S NUMBER .PAGE RCIPL: MOV #RCTNUM,R0 ; GET TASK# CMP R0,#TASMAX ; IS # 7 SYS MAX BLE RCI010 ; NO. HALT ; YES. RCI010: CMP R0,TASKS ; DO WE NEED TO UPDATE TASKS? BLE RCI020 ; NO MOV R0,TASKS ; YES RCI020: CLRB TSTAT(R0) ; CLEAR TASK= THREAD BY SPECIFYING A SPECIFIC HOUR RATHER THAN CURRENT. CMPB 4(SP),MINUTE BGE SKNA30 ;MINUTE IS NOW OR LATER: O.K. TO USE INC 2(SP) ;BUMP HOUR: RUN AT REQUESTED MINUTE NEXT HOUR SKNA30: TST (SP) ;IF "DATE" = 0,... BNE SKNA40 MOVB MDAY,(SP) ;...THEN USE TODAY'S DATE .PAGE SKNA40: ;NOW THAT MODULE'S TIME IS READY, BEGIN SEARCH FOR ITS ;PLACE IN ONE OF THE TWO SCHEDULER THR>ADD #34,R4 ;O.K.: SHIFT TO CORRECT BIAS BR RADP30 RADP50: ADD #56-44,R4 ;IS IT A [$]? BNE RADP90 ;NO: ERROR OR SPACE MOV #33,R4 ;CREATE RAD50 [$]. BR RADP30 RADP90: CLR R4 ;EITHER INVALID CHAR OR SPACE = 0. BR RADP30 ;GO PROCESS IT. .PAGE ; ******************************************************************** ; * ? ;ROUTINE TO PUT TIMER MODULE IN "WAIT" STACK MOV PS,-(SP) ;SAVE USER'S PS MOV #340,PS ;RAISE CPU LEVEL TO PROTECT ROUTINE MOV R0,-(SP) ;SAVE USER'S CMP TTBPTR,#TMTBND ;SEE IF STACK IS FULL BHI QTIM50 ;YES: ERROR EXIT MOV 10(SP),R0 ;ADDRESS OF MODULE DEC (R0) ;IS TIMER MODULE INACTIVE? (T/W=0?) BNE QTIM30 ;NO: SEE IF ACTIVE OR IN "WAIT" @'S STATUS MOVB #RCTPRT,TPRTY(R0) ; SET PRIORITY ASL R0 ; MAKE TASK # INTO WORD INDEX MOV #RCHEAD,HEADER(R0); SET HEADERS ADDRESS MOV #1,RCHEAD ; SET THREAD WORD TO 1 FOR USRE. ; MAKE FILE ENTRY FOR BFUP. MOV #FILE,R0 ; GET ADDRESS OF FILE TABLE. MOV #BFILE,(R0)+ ; SET BFUP FILE ID. MOV #100.,(R0)+ ; SET START SECTOR ADDRESS MOV #607,(R0)+ ; SET: NO PROTECAEADS. MOV CURTHD,R1 ;POINTS TO [THDTAB] OR [THDTAB+2] CMPB (SP),MDAY ;MODULE DATE :: TODAY'S DATE BGT SKNA60 ;AFTER TODAY: USE CURRENT THREAD BLT SKNA50 ;BEFORE TODAY: USE "FUTURE" THREAD CMPB 2(SP),HOUR ;MODULE HOUR :: CURRENT HOUR BGT SKNA60 ;LATER TODAY: USE CURRENT THREAD BLT SKNA50 ;WAS EARLIER TODAY: PUT IN "FUTURE" CMPB 4(SP),MINUTE ;MODULE B * ; * IDENTIFICATION: RAD50U: RADIX-50 UNPACK SUBROUTINE * ; * * ; * PURPOSE: TO CONVERT TWO PACKED BINARY WORDS OF RAD50 CODE * ; * TO A STRING OF SIX ASCII CHARACTERS * ; * * ; * USAGE: CALLING SEQUENCE: * ; * CSTATE QTIM20: ;HERE WHEN CLEARED TO STACK UP MODULE ADD #2,TTBPTR ;PUSH "WAIT" STACK POINTER MOV R0,@TTBPTR ;ENTER MODULE ADDRESS INTO "WAIT" STACK MOV #TIMBIT!TODBIT!STLBIT,CLKENB ;START UP FAST CLOCK IF OFF .IFNZ $DEBUG .=.-6 ;WILL GO BACK AND REPLACE WITH NO-OPS .WORD 240,240,240 ;ALLOW SPACE FOR INSERTION OF TURN-ON .ENDC $DEBUG TST 2(R0) ;CDT, DEVICE #1, CORE ; DIRECTORY, FILE TYPE=7. MOV #2500.,(R0)+ ; SET LENGTH OF FILE IN SECTORS. RTS PC ; RETURN TO IPL. .PAGE ; TASK HEADER RCHEAD: .WORD 1 ; THREAD WORD .WORD START ; ENTRY POINT .WORD 0,0 ; NO INIT OR MAX TIME .BYTE 100. ; STACK SIZE .BYTE RCTPRT ; PRIORITY .WORD 0 ; CURRENEMINUTE :: CURRENT MINUTE BGE SKNA60 ;NOW OR WITHIN HOUR: CURRENT THREAD SKNA50: TST (R1)+ ;WE ARE PAST MODULE'S TIME: USE "FUTURE" SKNA60: ;NOW THAT PROPER THREAD BEGIN WORD'S ADDRESS IS IN R1, ;WE CAN BEGIN SEARCH OF THAT THREAD. MOV (R1),R2 ;ADDR OF ONE OF THE THREAD-BEGIN WORDS BR SKNB00 ;ENTER LOOP FOR FIRST TIME SKNB10: ;THIS IS THE LOOP RETURN POINT AS LONG AS SEARCH CONT'S F * ; * MOV #ASCBUF,-(SP) ;ADDRESS OF ASCII STRING * ; * MOV #BINBUF,-(SP) ;ADDRESS OF FIRST BINARY WORD * ; * EMT 39. ;TRAP TO ROUTINE * ; * * ; * NOTE THAT THE SEQUENCE IS THE SAME AS FOR "RAD50P". ONLY THE * ; * EMT CODE IS DIFFERENT. THE SAME RULES APPLY AS FOR "RAD50P". * ; * GHECK OPTION FLAG FOR "SUSPEND" BMI QTIM60 ;"SUSPEND" SELECTED QTIM40: ;THIS IS THE "SUCCESSFUL" EXIT CLR 10(SP) ;PREPARE ERROR RETURN CODE TO SHOW O.K. QTIM45: ;HERE WHEN EXITING TO "SUSPEND". AVOID CLEARING 10(SP) MOV 6(SP),4(R0) ;LOAD NEW TIMER/RESET WORD INTO MODULE ; THIS SERVES AS NORMAL INIT FOR TIMER MODULE, AND ALSO RESETS ; THE "RESET" BYTE IN CASE MODULE IS BEING RE-QUEUED AFTER BEINGHT TIME .IFNZ ARG ; .WORD 0 ; PASSED ARGUMENT .ENDC .BYTE 0,RCTNUM ; CPU LEVEL, TASK NUMBER. .WORD 0 ; STACK POINTER .=.+200. ; STACK AREA. ; TTY I/O LIST KBLIST: .WORD 1 ; THREAD WORD .BYTE 0,2 ; TTY, EXIT TYPE2 .WORD 0,0,0 ; NO ERROR, IO COMPLET - LEVEL #0., SYST .WORD 0 ; SYS WORD KBADD:I ADD #6,SP ;POP STACK POINTER FROM "UNPACK" BELOW SKNB00: ;HERE FOR FIRST-TIME ENTRY MOV R2,R1 ;SAVE OLD T/W ADDRESS MOV (R2),R2 ;GET NEXT MODULE'S (T/W) ADDRESS BEQ SKNB30 ;AT END OF THREAD ;NOT @ END: TEST MODULE FOR TIME MOV 4(R2),-(SP) ;STACK TEST MODULE'S DATE WORD... JSR PC,UNPACK ;...FOR CALL TO SPREAD IT ON STACK CMP 6(SP),(SP) ;NJ * ; ******************************************************************** RAD50UNPACK: ;CONVERT 2 "RAD50" WORDS TO SIX ASCII CHARACTERS R50UNP: JSR R5,PUSHR ;SAVE CALLER'S REGS MOV 16(SP),R0 ;PNTR TO RAD50 WORDS MOV 20(SP),R1 ;PNTR TO BGN OF ASCII STRING MOV #3*400+3,R2 ;INIT MAJOR & MINOR LOOP COUNTS RADU05: MOV (R0)+,R3 ;RAD50 WORD MOV K ; DE-QUEUED, ALL WHILE REMAINING IN "WAIT" STACK. QTIM50: ;HERE WHEN EXIT IS TO LEAVE NON-ZERO ERROR CODE ON STACK DEC (R0) ;SET T/W=-1 TO SHOW IN "WAIT" STATE... ;...OR TO RESTORE MODULE'S T/W IF IT IS FOUND ALREADY ACTIVE... ; ...OR ALREADY IN "WAIT" STATE MOV (SP)+,R0 ;RESTORE USER'S MOV (SP)+,2(SP) ;MOVE OLD [PS] IN PREP FOR RTI RTI ;ZAP! RETURN TO USER OR GO TO SUSPEND L .WORD 0 ; ADDRESS OF BUFFER. ; ; DISK I/O LIST DKLIST: .WORD 1 ; THREAD WORD .BYTE 1,2 ; DEVICE 1, EXIT TYPE 2 .WORD 0 ; NO IOO COMPLETE .BYTE 0,3 ; NO ERR TASK, LEVEL 3 DKERR: .WORD 0 ; STATUS (0 = OK) .WORD 0 ; SYS WORD .WORD DKDAT ; ADDRESS OF DATA BUFFER. DKDAT: .WORD BFILE ; FILE ID. .BYTE 0 MEW MOD'S DATE :: TEST MOD'S DATE BGT SKNB10 ;LATER: KEEP LOOKING BLT SKNB20 ;EARLIER: THREAD NOW CMP 10(SP),2(SP) ;NEW MOD'S HOUR :: TEST MOD'S HOUR BGT SKNB10 ;STILL LATER BLT SKNB20 ;EARLIER CMP 12(SP),4(SP) ;COMPARE MINUTES BGT SKNB10 .PAGE SKNB20: ;HAVE FINALLY FOUND SLOT FOR NEW MODULE. R1 CONTAINS ;ADDR OF PREVIOUS OR "UPSTREAM" MON#COEFF,R4 ;PNTR TO COEFFICIENT TABLE RADU10: CLR R5 ;0 QUOTIENT ;NOW DIVIDE BY COEFFICIENTS RADU20: CMP R3,(R4) ;DONE WITH DIVIDE? BLO RADU30 ;YES SUB (R4),R3 ;NO: SUBTRACT COEFFICIENT... INC R5 ;...AND INCR QUOTIENT BR RADU20 ;THEN LOOP BACK .PAGE ; DIVIDE DONE: QUOTIENT IN R5, REMAINDER IN R3. ; NOW CONVERT FROM RAD50 CHAR O ;ON OLD CPU LEVEL QTIM30: ADD #2,(R0) ;NOT INACTIVE. SEE IF ACTIVE OR "WAIT" BNE QTIM50 ;ACTIVE: TAKE ERROR EXIT CMPB 5(R0),#-1 ;IN "WAIT": IS IT FLAGGED FOR DE-QUEUE? BNE QTIM50 ;NO: ERROR EXIT BR QTIM40 ;YES: LEAVE THERE AND REMOVE D-Q FLAG .PAGE QTIM60: ;HERE WHEN TASK IS TO BE SUSPENDED UNTIL TIMER EXPIRES MOVB $CTASK,2(R0) ;LOAD MODULE TASK # P ; USE SPECIFIED SECTOR DKFUN: .BYTE 0 ; FUNCTION .WORD 0,0,0 ; FOR DISEI0 USE DKADD: .WORD 0 ; RELATIVE SECTOR ADDRESS .WORD 64. ; # WORDS TO TRANSFER. .=.+200 ; DISK 64 WORD BUFFER. MES1: .WORD MES1LN .WORD 0 ; RESERVED .BYTE CR,LF ; .ASCII /SELECT THE DESIRED TEST:0=ROSCOM, 1=BFUP/ .ASCII /: / MES1LN =.-MES1-4 QDULE (MIGHT BE THE ;THREAD START WORD) AND R2 CONTAINS ADDR OF DOWNSTREAM ;MODULE, OR ZERO IF NEW MODULE IS BEING PLACED AT END ;OF THREAD. R0 CONTAINS ADDR OF NEW MODULE. ADD #6,SP ;POP SP FROM 1ST CALL TO "UNPACK" SKNB30: ADD #6,SP ;POP SP FROM 2ND CALL TO "UNPACK" MOV R0,(R1) ;LOAD UPSTREAM THREAD-WORD FOR NEW MOD MOV R2,(R0) ;LOAD NEW T/W FOR DOWNSTREAM MOD BRRTO ASCII CHAR RADU30: TSTB R5 BEQ RADU40 ;"BLANK CMPB R5,#33 BEQ RADU60 ;[$] BGT RADU50 ;[.] TO [9] ADD #40,R5 ;[A] TO [Z] RADU40: ADD #16,R5 RADU50: ADD #11,R5 RADU60: ADD #11,R5 MOVB R5,(R1)+ ;STORE ASCII CHAR TST (R4)+ ;NEXT COEFFICIENT DECB R2 ;DONE 3 CHARS? BGT RADU10 ;NOT YET SWSWITH CURRENT TASK MOV 4(SP),10(SP) ;SET CALLER RTN TO LOOK LIKE "JSR" MOV #SUSPND,4(SP) ;SET STACK SO RTI WILL GO TO "SUSPEND" MOVB #5,QTMCNT ;MUST SHIFT FIVE WORDS ON STACK QTIM70: MOV (SP)+,-4(SP) ;SHIFT THE FIVE WORDS ON STACK DOWN ONE ;WORD. CAN FOOL WITH POINTER SINCE UNDER LOCKOUT DECB QTMCNT ;DONE? BNE QTIM70 ;NOT YET CLR -(SP) ;"BOTTOM" OF STACK WILL BE RT.EVEN MES2: .WORD 1 ; READ IN ANSWER .WORD 0 ; MES2N: .BYTE 0 ; .EVEN MES3: .WORD MES3LN ; ROSCOM TEST .WORD 0 .BYTE CR,LF .ASCII /ROSCOM TEST - ENTER STRING TO BE PARSED/ .ASCII /: / MES3LN =.-MES3-4 .EVEN MES4: .WORD MES4LN,0 ; REQUEST FIELD # AND CONVERSION .BYTE CR,LF .ASCII /ENTRY CONVERSION & FIELD #/ .BYTE CRU SKNSRT ;GO BACK FOR POSSIBLE MORE MODULES. .PAGE UNPACK: ;INTERNAL SUBROUTINE TO SPREAD A SCHEDULER TIME&DATE ;WORD ONTO THE STACK ;UPON ENTRY, ROUTINE ASSUMES PACKED WORD IS ON TOP OF STACK; ; 15 11 10 6 5 1 ; DAY ^ HOUR ^ MINUTE ;UPON EXIT, STACK HAS THREE WORDS ON IT: ; (SP)= DAY 2(SP)= HOUR 4(SP)= MINUTE TST -(SP) ;MUST PUSH STACK TO RE-POSITION (PC) AB R2 ;YES: IS SECOND WORD CONVERTED? BNE RADU05 ;NOT YET BR RADP35 ;ALL DONE: RESTORE SAVE REGS & RETURN ;VIA COMMON RETURN COEFF: ;TABLE OF COEFFICIENTS +1600. ;40**2 +40. ;40**1 +1. ;40**0 .END WETURN ERROR ;CODE WHEN SUSPENDED TASK IS UNSUSPENDED SUB #12,SP ;RE-POSITION POINTER AT "TOP" OF STACK BR QTIM45 ;INSTEAD OF RETURNING TO CALLER .PAGE ; ******************************************************************** ; * * ; * D Q T I M E * ; * PROGRAM IDENTIFICATIONX,LF .ASCII /(X, P, N,12, OR S,49): / MES4LN =.-MES4-4 .EVEN MES5: .WORD MES5LN,0 ; NO EXISTENT FIELD .BYTE CR,LF .ASCII /REQUESTED FIELD IS NON-EXISTANT/ MES5LN =.-MES5-4 .EVEN MES6: .WORD MES6LN,0 ; NON-NUMERIC FIELD .BYTE CR,LF .ASCII /NUMERIC CONVERSION REQUESTED OF NON-NUMERIC FIELD/ MES6LN =.-MES6-4 .EVEN MES7: .WORD MES7LN,0 ; .BYTE CR,LF .ASCIIYMOV 2(SP),-(SP) ;MOVE (PC) TO NEW PLACE ON STACK MOV 6(SP),R3 ;COPY TIME & DATE WORD FOR USE BELOW MOV R3,R5 ;ALSO SAVE IT FOR BELOW BELOW BIC #177700,6(SP) ;LEAVE "MINUTE" ALL BY ITSELF ASL R3 ASL R3 SWAB R3 ;GET "HOUR" INTO LOW BYTE BIC #177740,R3 ;CLEAR ALL OTHER STUFF MOV R3,4(SP) ;PUT "HOUR" IN ITS OWN PLACE ON STACK SWAB R5 SSAGE RTS PC ; RETURN TO INPUT ; .END [: "DQTIME" * ; * TIMER MODULE DE-QUEUEING SUBROUTINE * ; * * ; * PURPOSE: * ; * REMOVES TIMER MODULES FROM TIMER THREADS, IF ACTIVE * ; * AND IF FOUND IN ITS PROPER THREAD. IF ACTIVE BUT NOT * ; * FOUND, ERROR EXIT IS TAKEN. IF STILL IN "WAIT" STACK * ; * IT IS \ /THE NUMERIC VALUE IS: / MES7FD: .WORD 0,0,0 MES7LN =.-MES7-4 .EVEN MES8: .WORD MES8LN,0 ; .BYTE CR,LF .ASCII /THE REQUESTED FIELD IS:/ .BYTE CR,CR,LF MES8LN =.-MES8-4 STRNG2: .=.+72. .EVEN MES9: .WORD 72.,0 ; GET A STRING STRING: .=.+72. MES10: .WORD 6,0 ; ROSCOM TEST WANTED .BYTE CR,LF MES10N: .ASCII /C,NN/ .EVEN MES11: .WORD MES11L,0 ; VOID FIELD ] ASR R5 ASR R5 ASR R5 ;GET [DAY] INTO LOWER BYTE... BIC #177740,R5 ; ...CLEAR GARBAGE... MOV R5,2(SP) ; ...AND PUT IN ITS OWN PLACE RTS PC .PAGE ADDNOW: ;SUBROUTINE TO ADD CURRENT TIME AND DATE TO STACKED. ; NOW THE STACK HAS EITHER A "START" OR "DELTA" WORD SPREAD ON IT ; (SP) = DATE 2(SP) = HOUR 4(SP) = MINUTE MOV SP,R5 ;INIT SECONDAR^; UPDATE 6/21/72 ; UPDATE 4/13/72 CLINIT ; 18-JAN-72 ; 12-DEC-71 ; CLOCK INITIALIZE ROUTINE ; * G U L F E L E C T R O N I C S Y S T E M S * .CSECT .CLINT ;FORCE IT INTO IPL GROUP .TITLE CLINIT .DEF CLINIT .REF HEADER,TSTAT,TPRTY,TASKS .REF TWAITB,TTBPTR,TFIRST,TLAST,RESTAB,CURTAB,TIMBSY,BASCNT .REF THDTAB,CURTHD,SWAITB,STBPTR,COUNTR,SKDBSY,ABMPLR .REF _MARKED FOR REMOVAL WHEN "TMNSRT" IS RUN. * ; * IF MODULE IS ALREADY INACTIVE, NO ACTION TAKEN, AND * ; * GOOD EXIT IS TAKEN. * ; * * ; * USAGE: CALLED BY ANY ROUTINE WISHING TO DE-ACTIVATE A TIMER * ; * MODULE. CALLING SEQUENCE: * ; * * ; * `.BYTE CR,LF .ASCII /REQUESTED FIELD IS VOID/ MES11L =.-MES11-4 .EVEN MES12: .WORD MES12L,0 ; # FIELDS .BYTE CR,LF .ASCII /# FIELDS: / MES12N: .ASCII /XXXXXX/ MES12L =.-MES12-4 .PAGE ; HERE TO DETERMINE WHICH TEST START: MOV #MES1,KBADD JSR PC,TYPEO MOV #MES2,KBADD JSR PC,TYPEI MOVB MES2N,R0 ; GET CHARACTER SUB #60,R0 ; STRIP OFF ASCII aY STACK POINTER MOVB MDAY,R3 ;CANNOT ADD BYTES ADD R3,(R5)+ ;STACKED DAY + DELTA DAY MOVB HOUR,R3 ADD R3,(R5)+ ;STACKED HOUR + DELTA HOUR MOVB MINUTE,R3 ADD R3,(R5) ;STACKED MINUTE + DELTA MINUTE CMP #60.,(R5) ;SEE IF MINUTES OVERFLOWED BGT ADDN10 ;NO: O.K. SUB #60.,(R5) ;YES: STRIP MODULUS... INC -2(R5) ;...AND BUMPb TICTOC,MINUTE,MONTH .REF TIMER,CALENDAR CLINIT: ;INIT SUBROUTINE FOR TIMERS AND SCHEDULER MOV #TWAITB,R0 MOV R0,TTBPTR MOV #$TWATZ+1+$NRES,R1 A.: CLR (R0)+ ;CLEAR BOTH WAIT AND FIRST TABLES DEC R1 BNE A. MOV #TLAST-2,R0 MOV #$NRES-1*2,R1 B.: MOV R0,TLAST(R1) ;INIT ALL "LASTS" WITH ADDR'S OF FIRSTS TST -(R0) DEC R1 DEC c MOV #MODULE,-(SP) ;STACK MODULE'S ADDRESS * ; * EMT DQTIME ;REQUEST TO DE-QUEUE MODULE * ; * OR * ; * JSR PC,DQTIME ;DIRECT CALL WITH PROPER LINK * ; * TST (SP)+ ;POP ERROR RETURN CODE * ; * * ; * NOTE THAT THE THREE ROUTINES: [TIMER], [QTIME], AND * ; * dBLT START CMP R0,#2 BGE START ASL R0 JMP @TAB(R0) TAB: .WORD TEST1 ; ROSCOM TEST .WORD START ; BFUP TEST .PAGE ; HERE TO TEST ROSCOM TEST1: MOV #MES3,KBADD JSR PC,TYPEO MOV #MES9,KBADD ; GET STRING JSR PC,TYPEI TEST1A: MOV #MES4,KBADD ; TYPE OF TEST JSR PC,TYPEO MOV #MES10,KBADD ; GET ANS. JSR PC,Te HOURS ADDN10: CMP #24.,-(R5) ;SEE IF HOURS OVERFLOWED BGT ADDN20 ;NO SUB #24.,(R5) ;YES: STRIP MODULUS... INC (SP) ;...AND BUMP DAYS ADDN20: MOVB MONTH,R3 ;USE CURRENT MONTH AS INDEX MOVB DAYTAB(R3),R3 ;GET # DAYS/MONTH INTO A WORD CMP R3,(SP) ;CHECK IF PAST END OF MONTH BGE ADDN30 ;STILL THIS MONTH SUB R3,(SP) ;GET DAY OF NEXT MONTH f R1 BGE B. MOV #RESTAB+$NRES,R0 MOV #$NRES-1,R1 C.: MOVB -(R0),CURTAB(R1) ;INIT RESOLUTION COUNTERS DEC R1 BGE C. MOVB #-1,TIMBSY MOVB #-1,SKDBSY CLRB BASCNT CLR ABMPLR MOV #THDTAB,CURTHD ;FOR SCHEDULER MOV #SWAITB,STBPTR CLR COUNTR MOV #1,TICTOC CLR MINUTE MOV #401,MONTH MOV #TIMER,TIg [DQTIME] ALLOW AN UNLIMITED NUMBER OF CALLS TO QUEUE * ; * OR DE-QUEUE THE SAME MODULE, REGARDLESS OF ITS STATUS * ; * AT ANY GIVEN TIME. THE STATE UPON THE RETURN FROM A * ; * CALL TO [QTIME] OR [DQTIME], ASSUMING A ZERO ERROR CODE* ; * ASSURES THAT THE MODULE IS IN THE MOST RECENTLY * ; * REQUESTED STATE. THE ONLY EXCEPTION IS WHEN A CALL TO * ; * [DQTIME] HAS BEEN MADE AFTER THE REQUESTED MODULE HAS *hYPEI MOV #MES10N,R0 MOVB (R0),R1 ; GET FIRST CHARACTER CMP #'X,R1 ; RESTART BEQ START CMP #'P,R1 ; 4OW MAY FIELDS BEQ TEST1P ADD MES10+2,R0 ; BUMP R0 TO ADD. OF LAST CHAR.+1 MOVB -(R0),R2 ; GET LAST CHARACTER MOVB (R0),R3 ; GET PENULTIMATE CHARACTER SUB #60,R2 ; COVER LAST - STRIP OFF ASCII CMP R3,#', i ADDN30: ;NOW RESTORE MODULE START WORD & STACK SWAB (SP) ;POSITION "DATE"... ASL (SP) ASL (SP) ASL (SP) ;...FOR PLACE BACK IN "START" WORD SWAB 2(SP) ;POSITION "HOUR" ASR 2(SP) ASR 2(SP) ;...FOR ITS PLACE BIS (SP)+,(SP) ;[OR] DATE & HOUR... BIS (SP)+,(SP) ;...WITH MINUTE... MOV (SP)+,STRTWD(R0);...ANMINT MOV #340,TIMINT+2 MOV #CALENDAR,TODINT MOV #340,TODINT+2 MOV #STLINT+2,STLINT ;CURRENTLY WILL BE AN ERROR CLR STLINT+2 ;CAUSES A "HALT" MOV #TODBIT!STLBIT,CLKENB ; START TIME-OF-DAY CLOCK ; AND STALL ALARM RTS PC .END k ; * TIMED OUT AND BEGUN EXECUTION. STRICTLY SPEAKING, THE * ; * CALL IN THIS CASE CAME AFTER THE MODULE WAS RUN. * ; * * ; * G U L F E L E C T R O N I C S Y S T E M S * ; * * ; ******************************************************************** .DEF DQTIME .PAGE DQTIME: ;SYSTEM l ; IS PEN. # ',' BEQ TEST1B ; YES-ONLY 1 CHAN SUB #60,R3 ; NO. ASSUME #. STRIP OFF ASCII MOV R3,R4 ; MULTIPLY BY 10. ASL R4 ; R4 = 2* R3 ASL R4 ; R4 = 4* R3 ADD R4,R3 ; R3 = 5* R3 ASL R3 ; R3 = 10*R3 ADD R3,R2 ; R2 = FIELD # - R1 = CONVERSION CODE TEST1B: ; WHICH CONVERSION CMP mD RE-STORE INTO START WORD RTS PC .PAGE ; ******************************************************************** ; * PROGRAM IDENTIFICATION: "QSKED" * ; * SYSTEM SUBROUTINE TO QUEUE A SCHEDULER MODULE * ; * * ; * PURPOSE: * ; * PUTS ADDRESS OF CALLER'S MODULE IN INTERNAL STACK. * ; n FOR INVALID CODES .ENDC $DEBUG .PAGE EMTABL = . ;TOP OF EMT LINK TABLE .WORD EMTERR ;#0 ALWAYS AN ERROR .WORD QUEUE ;#1 .WORD SUSPND ;#2 .WORD UNSPND ;#3 .WORD EXIT ;#4 .WORD FRETSK ;#5 .WORD ABORT ;#6 .WORD QTIME ;#7 .WORD DQTIME ;#10 .WORD QSKED ;#11 oSUBROUTINE TO DE-QUEUE A TIMER MODULE MOV (SP),-(SP) ;MOVE RTN ADDR IN PREP FOR "RTI" AT END MOV PS,2(SP) ;PLACE [PS] ALSO FOR "RTI" MOV #340,PS ;RAISE CPU LEVEL: PROTECT AGAINST "TIMER" JSR R5, PUSHR ;SAVE ALL REGISTERS MOV 20(SP),R0 ;GET MODULE'S ADDRESS CMP #1,(R0) ;IS MODULE ALREADY INACTIVE? BEQ DQTM20 ;YES: TAKE GOOD EXIT MOVB #-1,5(R0) ;Fp #'N,R1 ; NUMERIC CONVERSION BEQ TEST1N CMP #'S,R1 ; STRING CONVERSION BNE TEST1A ; HERE FOR STRINGS MOV R2,-(SP) ; FIELD # MOV #STRING,-(SP) ; STRING ADD. MOV STRING-2,-(SP) ; # CHARS EMT 27. ; SCAN MOV (SP)+,R5 ; FIELD BEG. ADD. MOV (SP)+,R4 ; # OF CHARS. MOV (SP)+,R0 ; ERROR STATUS BEQ TEST1Eq * THIS TABLE IS EMPTIED BY THE ROUTINE "SKNSRT" WHICH IS * ; * CALLED BY THE SCHEDULER EACH MINUTE JUST BEFORE IT RUNS* ; * THIS METHOD AVOIDS QUEUEING AND SCHEDULER CONFLICTS WHE* ; * ACCESSING THE TWO SCHEDULER THREADS(THE SCHEDULER DROPS* ; * THE CPU LEVEL SO AS NOT TO LOCK OUT INTERRUPTS UNNECES-* ; * SARILY), REDUCING THE CONFLICT AREA TO JUST THE FIFO * ; * TABLE. THIS CONFLICT IS AVOIDED, THEN, BY RUNNING r .WORD DQSKED ;#12 .WORD TTYOUT ;#13 .WORD TTYIN ;#14 .WORD DECTAP ;#15 .WORD BINASC ;#16 .WORD ASCBIN ;#17 .WORD MASK ;#20 .WORD UNMASK ;#21 .WORD ERRTYP ;#22 .WORD DISCIO ;#23 .WORD CREAD ;#24 .WORD LPRNTR ;#25 .WORD GOBACK ;#26 .WORD sLAG D-Q WITH "RESET" BYTE ALL ONES CMP #-1,(R0) ;IS MODULE STILL IN "WAIT" STACK? BEQ DQTM20 ;YES: NO NEED TO REMOVE FROM THREAD MOVB 3(R0),R1 ;IS IN ACTIVE QUEUE: TAKE IT OUT BIC #177760,R1 ;GET MODULE'S RESOLUTION ASL R1 ;USED AS WORD INDEX BELOW MOV R1,R3 ;SAVE RESOLUTION IN CASE NEEDED BELOW CMPB R1,CURRES ;DID WE INTERRUPT "TIMER"... t ; NO ERROR TEST1D: MOV #MES5,KBADD ; ERROR JSR PC,TYPEO BR TEST1A ; NEXT TEST1E: TST R4 BNE TEST1G TEST1F: MOV #MES11,KBADD ; VOID FIELD JSR PC,TYPEO BR TEST1A ; NEXT TEST1G: MOV #STRNG2,R3 ; PUT STRING INTO OUTPUT BUFFER MOV #MES8,R0 ; GET ADDRESS OF FIRST WORD IN BUFFER MOV R4,(R0) ; SET VAR. SIZE OF MESS. IN BYTE COUNT ADD u * ; * "QSKED" (A SHORT ROUTINE) AND THE FEW WORDS OF CODE * ; * IN "SKNSRT" WHICH ACCESS THE TABLE, UNDER INTERRUPT- * ; * LOCKOUT. * ; * * ; * USAGE: * ; * USERS CAN CALL "QSKED" EITHER VIA JSR (IF LINKED) OR * ; * VIA EMT. IN EITHER CASE THE ADDRESS OF THE MvCKPT ;#27 .WORD NOCKPT ;#30 .WORD GTIME ;#31 .WORD GDATE ;#32 .WORD SCAN ;#33 .WORD NUMFLD ;#34 .WORD NPARAM ;#35 .WORD BFINIT ;#36 .WORD BFENTR ;#37 .WORD BFOPEN ;#40 .WORD BFCLOS ;#41 .WORD BFDELT ;#42 .WORD BFPACK ;#43 .WORD BFWRIT w ;...WHILE IT IS ON THIS RESOLUTION? BNE DQTM05 ;NO: O.K. TO DE-QUEUE INC DQFLAG ;YES: FLAG "TIMER" TO RE-SCAN THREAD... BR DQTM20 ;...AND DO NOT REMOVE FROM THREAD NOW. DQTM05: ADD #TFIRST,R1 ;ADDR OF RESOLUTION'S "FIRST" WORD DQTM10: ;LOOP RETURN POINT FOR THREAD SEARCH MOV R1,R2 ;SAVE UPSTREAM MODULE'S ADDR MOV (R1),R1 ;ADDR OF DOWNSTREAM MODULE x #MES8LN,(R0) ; ADD FIXED SIZE MOV (R0),KBADD ; SET ADDRESS IN TTY I/O LIST TEST1H: MOVB (R5)+,(R3)+ ; TRANSFERR STRING BYTE BY BYTE DEC R4 BNE TEST1H ; MORE TO COME WITH JOHNNY JSR PC,TYPEO BR TEST1A .PAGE ; HERE FOR NUMERIC FIELDS TEST1N: MOV R2,-(SP) ; FIELD # MOV #STRING,-(SP) ; STRING ADD MOV STRING-2, -(SP) ; # CHAR IN STRING EMT 28. yODULE TO BE* ; * THREADED MUST FIRST BE PLACED ON THE STACK.THE STACK * ; * POINTER IS LEFT UNCHANGED ON RETURN. THE STACK LOCATION* ; * ITSELF WILL BE CLEARED IF THE TABLE HAS ROOM FOR * ; * IT AND THE MODULE ITSELF IS INACTIVE (ITS THREAD WORD * ; * MUST BE =1). IN CASE OF ONE OF THE ABOVE ERRORS, THE * ; * STACK LOCATION IS LEFT UNCHANGED (NON-ZERO) FOR TESTING* ; * BY THE CALLER. z;#44 .WORD BFREAD ;#45 .WORD R50PAK ;#46 .WORD R50UNP ;#47 .WORD BFWAIT ;#50 .WORD DEFINE ;#51 .WORD DELETE ;#52 .WORD PRTCT ;#53 .WORD UNPRCT ;#54 .WORD SGLOAD ;#55 MAXEMT = .-EMTABL/2-1 .PAGE .CSECT .EMTIN ;FORCE INTO IPL GROUP ;[GLOBAL REFERENCES WHICH REMAIN UNDEFINED AT LINK TIME { BEQ DQTM30 ;END OF THREAD: SEARCH FAIL ERROR CMP R0,R1 ;IS THIS THE MODULE TO BE DE-QUEUED? BNE DQTM10 ;NO: KEEP LOOKING MOV (R1),(R2) ;FOUND IT! BRIDGE OVER THIS MODULE... BNE DQTM15 ;...AND EXIT IF NOT LAST MODULE MOV R2,TLAST(R3) ;...BUT UPDATE "LAST" ENTRY IF WAS @ END DQTM15: MOV #1,(R1) ;FINALLY, FLAG MODULE INACTIVE DQTM20: CLR 20(SP) ;CLEAR RETURN | ; NUMPAR MOV (SP)+,R5 ; VALUE MOV (SP)+,R4 ; STATUS BGT TEST1D BEQ TEST1O ; OK (=0) INC R4 BLT TEST1F ; VOID (=-2) MOV #MES6,KBADD ; NON-NUMERIC JSR PC,TYPEO JMP TEST1A TEST1O: MOV R5,-(SP) ; RE-CONVERT MOV #MES7FD,-(SP) EMT 16 ; BINASC MOV #MES7,KBADD JSR } * ; * "QSKED" SAVES & RESTORES ALL REGISTERS THAT IT USES. * ; * IT MAY BE CALLED BY ANY TYPE OF USER AT ANY TIME. * ; * * ; * G U L F E L E C T R O N I C S Y S T E M S * ; ******************************************************************** .PAGE QSKED: ;SUBROUTINE TO QUEUE A SCHEDULER MODULE ~BECAUSE THEY ; WERE NOT INCLUDED IN THE MONITOR BEING GENERATED WILL BE LOADED WITH ; A ZERO BY THE LOADER. THE FOLLOWING SUBROUTINE WILL BE CALLED BY "IPL" ; TO INITIALIZE THESE ENTRIES TO "EMTERR" IN CASE THEY ARE CALLED.] EMTINIT: ;SUBROUTINE TO REPLACE UNDEFINED VECTOR ELEMENTS ;WITH IMMEDIATE RETURNS. ("HALTS" IN DEBUG VERSION.) MOV #EMTABL,R0 EMTI10: TST (R0)+ ;IS THIS VECTOR ELEMENT UNDEFINED? BNE EMTI20 ;NO ERROR FLAG FOR GOOD EXIT DQTM30: JSR R5,POPR ;RESTORE SAVED REGISTERS... RTI ;...AND RETURN TO CALLER WITH HIS PS .PAGE ; ******************************************************************** ; * T I M E R * ; * PROGRAM IDENTIFICATION: "TIMER" * ; * HIGH-RESOLUTION CLOCK PULSE SERVICE ROUTINE * ; *  PC,TYPEO JMP TEST1A .PAGE ; HERE FOR # OF FIELDS TEST1P: MOV #STRING,-(SP) ; STRING ADD MOV STRING-2,-(SP) ; # CHAR EMT 29. ; NPARAN MOV #MES12N,-(SP) ; VALUE ON STACK - PUT ADD ON EMT 14. MOV #MES12,KBADD JSR PC,TYPEO BR TEST1A .PAGE TYPEO: MOV #KBLIST,-(SP) ; TTY I/O LIST EMT 11. RTS PC TYPEI: MOV #KBLIST,-(SP)  ;TO WAIT FOR INSERTION INTO ONE OF THE ;TWO SCHEDULER THREADS MOV (SP),-(SP) ;MOVE RETURN ADDRESS UP FOR RTI LATER MOV PS,2(SP) ;...AND SET UP PS FOR RTI, TOO MOV R0,-(SP) ;SAVE USER'S MOV #340,PS ;RAISE CPU LEVEL TO AVOID INTERFERENCE CMP STBPTR,#SKTBND ;IS TABLE FULL? BHIS QSKA40 ;YES: POINTER IS AT BOTTOM, SO ERROR XIT MOV 6(SP),R0 MOV #EMTERR,-(R0) ;YES - PUT ERROR RETURN IN IT TST (R0)+ ;...AND ADVANCE IT AGAIN EMTI20: CMP R0,#MAXEMT*2+EMTABL ;REACHED END OF VECTOR YET? BLOS EMTI10 ;NOT YET - KEEP GOING MOV #EMTRAP,30 ;INIT EMT VECTOR MOV #340,32 RTS PC ;ALL DONE .END  * ; * PURPOSE: --SERVICES ALL TIMER MODULES AT THEIR RESPECTIVE * ; * RESOLUTIONS, PROVIDING THE FEATURES OF TASK * ; * TIME-DELAY, PERIODIC OR ONE-SHOT QUEUEING, * ; * FLAG-SETTING,AND COMPLETION-ROUTINE CALLS. * ; * --KEEPS TRACK OF THE TASK-EXECUTION TIME (ABORT) * ; * COUNTER, AND CALLS FOR TASK ABORT IF TIME * ; * RUNS OUT EMT 12. RTS PC .PAGE .END ;MODULE'S ADDRESS BIC #10000,2(R0) ;CLEAR "D" FLAG IN CASE WAS DE-QUEUED DEC (R0) ;IS MODULE INACTIVE (THREAD WORD = 1)? BEQ QSKA20 ;O.K. ADD #2,(R0) ;SEE IF IN "WAIT" TABLE BEQ QSKA30 ;YES: O.K. TO TAKE GOOD EXIT NOW BR QSKA35 ;IN THREAD: TAKE ERROR EXIT QSKA20: ;MODULE READY FOR INSERTION IN TABLE ADD #2,STBPTR ;PUSH TABLE POINTER0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ; ******************************************************************** ; * * ; * IDENTIFICATION: RAD50P : RADIX-50 PACK SUBROUTINE * ; * * ; * PURPOSE: TO CONVERT A STRING OF SIX ASCIT CHARACTERS * ; * TO TWO PACKED BINARY WORDS IN RAD50 CODE. * ; . * ; * --PROVIDES (OPTIONAL) TIME-SLICE FEATURE BY * ; * PERIODICALLY ROTATING THE TASKS IN A QUEUE. * ; * * ; * USAGE: ACTIVATED BY CLOCK INTERRUPT. ALL PROGRAMS HANDLE * ; * COMMUNICATION VIA "QTIME" AND "DQTIME". "TIMER" * ; * CALLS SYSTEM SUBROUTINES "QUEUE", "SAVE", "UNSPND", * ; * AND ; UPDATE 4/4/72 ASCBIN.S04 ; UPDATE 11/8/71 ASCBIN.S03 ; UPDATE 10/8/71 ASCBIN.S02 ; UPDATE 9/15/71 ASCBIN.S01 .TITLE ASCBIN ;*********************************************************************** ; ; ASCBIN, CATALOG NUMBER ,ASCII ; TO BINARY CONVERSION SUBROUTINE. ; ; THIS SUBROUTINE WILL CONVERT A SIGNED 5 ; INTEGER ASCII DECIMAL STRING STORED IN A ; SIX BYTE ARRAY, SPECIFIED BY THR MOV R0,@STBPTR ;LOAD NEW MODULE INTO TABLE QSKA30: CLR 6(SP) ;NOW READY TO EXIT. CLEAR ERROR FLAG QSKA35: DEC (R0) ;EITHER SETS T/W = -1 TO SHOW IN "WAIT" ;...OR RESTORES T/W TO ORIGINAL, IF NOT THREADED QSKA40: MOV (SP)+,R0 ;RESTORE USER'S RTI ;RESTORE USER'S PS & RETURN .PAGE DQSKED: ;SYSTEM SUBROUTINE TO DE-QUEUE A SCHEDULER MODULE MOV (SP),-(SP) ;RE-OR * * ; * USAGE: CALLING SEQUENCE: * ; * * ; * MOV #ASCBUF,-(SP) ;STACK ADDRESS OF ASCII STRING * ; * MOV #BINBUF,-(SP) ;STACK ADDR OF FIRST BINARY WRD* ; * EMT 38. ;TRAP TO ROUTINE * ; * "ABORT". * ; * * ; * G U L F E L E C T R O N I C S Y S T E M S * ; * * ; ******************************************************************** ; FOLLOWING ARE OFFSET PARAMETERS FOR TIMER MODULE REFERENCES SAVE = $SAVE ;OP-CODE FOR TRAP TO "SAVE" ROUTINE TASKNO = E CALLING ; PROGRAM, TO A SIGNED BINARY INTEGER OF ; 15-BITS AND SIGN(16-BIT COMPUTER WORD). ; A VALIDITY CHECK WILL BE MADE ON EACH ; BYTE TO DETERMINE IF WITHIN THE RANGE ; 0 THRU 9. ; CALLING SEQUENCE: ; ; MOV #STRING,-(SP) ; ; EMT ASCBIN ; MOV (SP)+,INTGR ; TST (SP)+ ; BNE ERROR ; ; ; WHERE: #STRING=ADDRESS OF ASCII BYTE STRING ; DER STACK FOR "RTI" RETURN AT END MOV PS,2(SP) ;STACK NOW READY FOR "RTI" JSR R5,PUSHR ;PUSH ALL REGS ONTO STACK MOV 20(SP),R0 ;MODULE'S ADDRESS MOV #340,PS ;LOCK OUT INTERFERENCE FROM SCHEDULER CMP #1,(R0) ;HAS MODULE BEEN DE-QUEUED ALREADY? BEQ DQSK20 ;YES: INACTIVE,SO IGNORE CMP #-1,(R0) ;IS IT STILL IN "WAIT" TABLE? BEQ DQSK50 ;YES:  * ; * ON RETURN THE STACK WILL BE CLEARED. THE SET OF CHARACTERS * ; * FOR RAD50 CONSISTS OF THE LETTERS A-Z, THE NUMBERS 0-9,AND * ; * THE TWO SPECIAL CHARACTERS [$] AND [.]. ANY OTHER CHARACTERS * ; * IN THE INPUT STRING WILL BE TREATED AS BLANKS. * ; * DATE: 1-MAR-72 * ; * VERSION:001.001 * ; *  2 ;TASK NUMBER BYTE OPTION = 3 ;OPTION FLAGS BYTE TIMBYT = 4 ;MODULE TIMER BYTE RESET = 5 ;TIMER RESET BYTE TIMARG = 6 ;ARGUMENT (FOR QUEUEING) ADDRESS WORD TMFLAG = 6 ;FLAG ADDRESS WORD (DYNAMIC OFFSET) TIMASK = 8. ;FLAG MASK WORD (DYNAMIC OFFSET) JSTARG = 6 ;USER ROUTINE ADDRESS WORD (DYN OFFSET) .PAGE TIMA00: RTI  INTGR=LOCATION TO PUT BINARY INTEGER ; ; ASCII SPACES OR BINARY ZEROS ARE VALID IN LEADING ; NON-SIGNIFICANT POSITIONS. REGISTERS R0 THRU ; R5 ARE SAVED IN THE STACK AREA (SP) AND RE- ; STORED UPON EXIT. ; ; UPON RETURN IF ERROR WORD, PUSHED ON STACK BY ASCBIN, ; NOT = 0, A CONVERSION ERROR OCCURRED. ; ; ; PROGRAMMER 54 ; DATE ; REVISION ; ;*********************************************************************** .DEF AGO SET THE "D" FLAG MOV #2,R5 ;INIT COUNTER TO SEARCH BOTH THREADS MOV #TH1BGN,R1 ;START BY SEARCHING THREAD #1 DQSK10: ;LOOP RETURN POINT FOR THREAD SEARCH MOV R1,R2 ;COPY ADDRESS OF UPSTREAM MODULE MOV (R1),R1 ;GET DOWNSTREAM MODULE'S ADDRESS BEQ DQSK40 ;END OF THREAD CMP R0,R1 ;IS THIS THE MODULE WE ARE LOOKING FOR? BNE DQSK10 ;NO  * ; * G U L F E L E C T R O N I C S Y S T E M S * ; * * ; ******************************************************************** .TITLE RAD50 .REF PUSHR,POPR .DEF R50UNP,R50PAK .PAGE RAD50PACK: ;CONVERT 6 ASCII CHARS TO 2 BINARY WORDS R50PAK: ;N=1600A+40B+C JSR R5,PUSHR ;SAVE ALL  ;RETURN USED IF CLOCK IS RE-ENTERED ;TO PROCESS QUEUE WHILE PREVIOUS REQUEST IN PROGRESS. TIMA70: ;HERE TO RESET RESOLUTION COUNTERS ;WHEN THEY EXPIRE (FROM TIMA20) MOVB RESTAB(R0),CURTAB(R0) ;RESET FROM PERM TABLE INC R0 ;BUMP TO NEXT RESOLUTION... TSTB RESTAB(R0) ;...AND SEE IF THIS IS THE END BNE TIMA20 ;NOT YET: MORE BR SCBIN .REF PUSHR,POPR ; .CSECT ; ; ; SPACE=40 ZERO=60 MINUS=55 NINE=9. ; ; ASCBIN = . TST (SP)- ; PUSH 1 MORE WORD ON STACK JSR R5, PUSHR ; SAVE REGISTERS ON STACK MOV 16.(SP),R1 ; ADDRESS OF STRING TO POSITION POINTER MOV 14.(SP),12.(SP) ; SET STACK UP FOR RETURN AND 2 PARAM. PASS TSTB (R1)+ ;BUMP TO 10,000 POSITION MOV #5,R0 MOV (R1),(R2) ;YES: "BRIDGE" OVER THIS MODULE IN THREAD MOV #1,(R1) ;...AND SET T/W = 1 TO SHOW INACTIVE DQSK20: ;HERE UPON SUCCESSFUL DE-QUEUE CLR 20(SP) ;ERROR RETURN STATUS: O.K. DQSK30: ;HERE FOR GENERAL EXIT FROM ROUTINE JSR R5,POPR ;POP REGS FROM STACK RTI ;RETURN SET ABOVE: RESTORE ORIGINAL CPU STATUS & RETURN DQSK40: ;HERE WHEN END OF THREAD REACHED MOV #TH2BGN,R1 REGS MOV 16(SP),R0 ;BINARY BUFFER ADDRESS MOV 20(SP),R1 ;ASCII STRING ADDRESS MOV #3*400+3,R2 ;SET MAJOR & MINOR LOOP COUNTS RADP10: CLR R3 ;BINARY SUM RADP20: MOVB (R1)+,R4 ;NEXT ASCII CHAR BIC #-177-1,R4 ;CLEAR POSSIBLE PARITY SUB #100,R4 ;REDUCE ALPHAS TO 1-32 BLE RADP40 ;WAS BELOW [A] CMP R4,#32 ;ABOVE [Z]? BGT RADP90  TIMA30 ;END OF COUNTERS: DO ALL THREADS TIMER: ;ENTRY FROM INTERRUPT: CPU LEVEL 7 .IFNZ $TMBAS ;OPTION ALLOWS RESOLUTION FINER THAN RES1 DECB BASCNT ;COUNT DOWN BASIC MULTIPLIER BEQ TIMA10 ;TURNED OVER: ENTER TIMER PROGRAM RTI ;NO NEED TO ENTER TIMA10: ;HERE WHEN BASIC RES'N TURNS OVER MOVB #$TMBAS,BASCNT ;RESET BASE PERIOD MULTIPLIER .ENDC ;SET POSITION INDEX FOR LOOP CLR R5 ; CLEAR BINARY INTEGER ACCUM. ATB010: MOVB (R1)+,R4 ; GET ASCII BYTE AND BUMP BEQ ATB020 ;IF BINARY ZERO-SUPPRESS CMPB #SPACE,R4 ;IF ASCII SPACE-SUPPRESS BNE ATB105 ;SIGNIFICANT-START CALCULATION ATB020: DEC R0 ; FINISHED WITH STRING BNE ATB010 ;NO-TRY AGAIN BR ATB110 ;YES-FINISHED ; ; PERFORM  ;SET UP FOR POSSIBLE SEARCH OF THREAD #2 DEC R5 ;LOOP COUNTER BNE DQSK10 ;STILL MUST DO THREAD #2 BR DQSK30 ;SEARCH FAIL: EXIT WITH NON-ZERO ERROR DQSK50: ;HERE WHEN MODULE STILL IN WAIT" TABLE. MUST SET THE ; "D" DE-QUEUE FLAG IN MODULE TO FORCE IGNORE WHEN ; "SKNSRT" RUNS. IF MODULE IS QUEUED AGAIN BEFORE ; "SKNSRT" RUNS, THIS "D" FLAG WILL BE CLEREAD, AND MODULE ;  ;YES RADP30: ASL R3 ;NOW MULTIPLY BY 40(10) ASL R3 ;*4 ASL R3 ;*8 MOV R3,R5 ASL R3 ;*16 ASL R3 ;*32 ADD R5,R3 ;32+8=40 ADD R4,R3 ;+ CHAR DECB R2 ;DONE 3 CHARS? BGT RADP20 ;NO MOV R3,(R0)+ ;YES: STORE CONVERTED BINARY WORD SWAB R2  $TMBAS INCB TIMBSY ;CHECK FOR PREVIOUS CALL STILL ACTIVE BNE TIMA00 ;YES: LEAVE INDICATOR SET TO SHOW ;PENDING REQUEST TO RUN; AND RETURN. SAVE ;NOT ACTIVE, SO SAFE TO ENTER. CALL TO ;SAVE ENVIRONMENT AND RETURN WITH: ;(R4) = (PS) BEFORE CLOCK INTERRUPT ;(R5) = ADDRESS OF "RESTOR" ROUTINE CONVERSION BY MULTIPLYING AN INITIALLY ; CLEARED ACCUMULATOR BY 10(MULTIPLYING ITS CONTENTS ; BY 5 AND THEN DOUBLING) AND ADDING THE ; ASCII EQUIVALENT BCD VALUE. THIS WILL BE DONE ; FOR EACH SIGNIFICANT POSITION LEFT TO RIGHT. ; EACH DIGIT'S RESULT IS STORED BACK IN THE ; ACCUMULATOR TO USE FOR THE NEXT CALCULATION. ; ATB100: MOVB (R1)+,R4 ;GET NEXT ASCII BYTE AND BUMP ATB105: SUB #ZERO,R4 ;ASCII NUMERIC TO BCD BMI ATB200  WILL BE LEFT IN THE "WAIT" TABLE. BIS #10000,2(R0) ;SET "D" FLAG IN MODULE OPTION BYTE BR DQSK20 ;TAKE GOOD EXIT COUNTR: .WORD 0 ;THIS IS THE ABORT/TIME-SLICE COUNTER!! ABMPLR: .WORD 0 ;MULTIPLIER FOR ABORT AND TIME/SLICE CURTHD: .WORD THDTAB ;POINTER TO CURRENT THREAD BEGIN WORD THDTAB: .WORD TH1BGN ;THREAD BEGIN TABLE .WORD TH2BGN .WORD TH1BGN TH1BGN: .WORD 0  ;HABE WE DONE 2 WORDS? BNE RADP10 ;ONLY ONE SO FAR: LOW BYTE NOW HAS 3 RADP35: JSR R5,POPR ;DONE: POP SAVED REGS MOV (SP)+,(SP) ;POP INPUT ARGS MOV (SP)+,(SP) RTS PC ;RTN TO CALLER .PAGE RADP40: ADD #100-55,R4 ;WAS BELOW [A]: IS IT BELOW [.]? BLE RADP50 ;YES CMP R4,#71-55 ;IS IT ABOVE [9]? BGT RADP90 ;YES: ERROR  .PAGE TMNSRT: ;TIMER INSERT ROUTINE: TRANSFERS TIMER MODULE ADDRESS ; FROM WAIT STACK TO APPROPRIATE QUEUE WHEN CONVENIENT FOR TIMER. ; CPU LEVEL SEVEN: AVOID INTERFERENCE WITH "QTIME". MOV @TTBPTR,R0 ;ADDRESS OF TIMER MODULE FROM TOP OF ;"WAIT" STACK BEQ TIMA15 ;STACK EMPTY SUB #2,TTBPTR ;NOT EMPTY: POP STACK ONE CELL MOV #1,(R0) ;SET T/W INACTIVE IN CASE WAS DE ;ERROR IF LESS THAN ZERO CMPB R4,#NINE BHI ATB200 ;ERROR IF GREATER THAN NINE MOV R5,R3 ; ACCUM. TO SHIFT 2 MOV R3,R2 ;DUPLICATE IN SHIFT 1 ACCUM. ASL R3 ; MULTIPLY ASL R3 ; BY 4 ADD R3,R2 ; SAME AS N*5 ADD R2,R2 ; SAME AS N*10 ADD R4,R2 ;COMBINE WITH BCD VALUE MOV R2,R5 ; SE ;ACTUAL BEGIN OF THREAD #1 TH2BGN: .WORD 0 ;#2 STBPTR: .WORD SWAITB ;SCHEDULER "WAIT" TABLE POINTER SWAITB: .WORD 0 ;TOP OF "WAIT" STACK IS ALWAYS ZERO .=$SWATZ*2+. ;THE SCHEDULER "WAIT" TABLE SKTBND = .-2 ;END OF "WAIT" TABLE DAYTAB = .-1 ;THIS IS THE 12-BYTE TABLE OF DAYS-PER-MONTH JANARY = . FEBARY = .+1 .BYTE 31.,28.,31.,30.,31.,30.,31.,31.,30.,31.,30.,31. .EADD #34,R4 ;O.K.: SHIFT TO CORRECT BIAS BR RADP30 RADP50: ADD #55-44,R4 ;IS IT A [$]? BNE RADP90 ;NO: ERROR OR SPACE ADD #33,R4 ;CREATE RAD50 [$]. BR RADP30 RADP90: CLR R4 ;EITHER INVALID CHAR OR SPACE = 0. BR RADP30 ;GO PROCESS IT. .PAGE ; ******************************************************************** ; * -QUEUED CMPB 5(R0),#-1 ;IS "RESET" ALL ONES? BEQ TMNSRT ;YES: MODULE WAS "DE-QUEUED": IGNORE IT MOVB 3(R0),R1 ;GET OPTION BYTE BIC #177760,R1 ;ISOLATE RESOLUTION CMP R1,#$NRES-1 ;IS RESOLUTION IN RANGE? BGT TMNSRT ;NO: TOO LARGE ASL R1 ;USED AS WORD INDEX BELOW MOV R0,@TLAST(R1) ;PUT NEW MODULE'S ADDR @ END PROPER THD> MOV R0,TLAST(RT IN BINARY INT. ACCUM DEC R0 ;FINISHED WITH STRING? BNE ATB100 ;NO ATB110: CMPB #MINUS,-6(R1) ;YES-STRING SIGN NEGATIVE BNE ATB120 ;NO NEG R5 ; YES-NEGATE BINARY INTEGER ATB120: CLR 16.(SP) ; SET NO ERROR INDICATOR ATB130: MOV R5,14.(SP) ; SET BIN. INT. IN STACK JSR R5,POPR ; RESTORE REGISTERS RTS PC ; RETURN TO CALLER ; ; ERRVEN CLOCK: ;EXTERNAL REFERENCE FOR TIME-OF-DAY CLOCK AND CALENDAR TICTOC: .BYTE 0 ;COUNTS CLOCK BEATS PER SECOND SECOND: .BYTE 0 ;CURRENT TIME MINUTE: .BYTE 0 ;CURRENT TIME HOUR: .BYTE 0 ;CURRENT TIME JDATE: .WORD 1 ;CURRENT JULIAN DATE MONTH: .BYTE 1 ;CURRENT MONTH MDAY: .BYTE 1 ;CURRENT DAY OF MONTH YEAR: .BYTE 71. ;CURRENT YEAR (MINUS 1900) SKDB * ; * IDENTIFICATION: RAD50U: RADIX-50 UNPACK SUBROUTINE * ; * * ; * PURPOSE: TO CONVERT TWO PACKED BINARY WORDS OF RAD50 CODE * ; * TO A STRING OF SIX ASCII CHARACTERS * ; * * ; * USAGE: CALLING SEQUENCE: * ; * 1) ;...AND UPDATE THE "LAST" POINTER ITSELF CLR (R0) ;CLEAR MODULE'S T/W: END OF THREAD BR TMNSRT ;NOW GO BACK AND POP ANY MORE MODULES .PAGE TIMA15: ;RE-ENTER HERE FOR REPEATS (TIMBSY>/=1) MOV R4,PS ;RESTORE PROCESSOR LEVEL TO PREVIOUS CLR R0 ;INIT RESOLUTION INDEX TIMA20: ;RETURN HERE WHEN ADVANCING TO NEXT RESN DECB CURTAB(R0) OR IN STRING ; ATB200 = . MOV R4,16.(SP) ; SET ERROR INDICATOR BR ATB130 ; ; .END SY: .BYTE -1 ;SCHEDULER BUSY FLAG: IDLE=-1; .END IDLE=-1; .END ;COUNT DOWN A RESOLUTION COUNTER BEQ TIMA70 ;EXPIRED: GO RESET IT & BUMP RES'N INDEX TIMA30: ;FALL THROUGH HERE WHEN A RESOLUTION COUNTER IS FOUND ; THAT HAS NOT EXPIRED. SINCE THE RESOLUTIONS ARE COUNTED STARTING ; FROM THE FINEST TOWARDS THE COARSEST, THE RESOLUTION CURRENTLY IN R0 ; IS THE FINEST RESOLUTION THAT HAS NOT EXPIRED. BY DECREMENTING R0, ; THE COARSEST RESOLUTION TO EXPIRE IS FOUND. FALLS THROUGH HERE ALSO ; IF ALL RESOLUTIONS EXPIRE, WHICH WI .REF TIMER,CALENDAR CLINIT: ;INIT SUBROUTINE FOR TIMERS AND SCHEDULER MOV #TWAITB,R0 MOV R0,TTBPTR MOV #$TWATZ+1+$NRES,R1 A.: CLR (R0)+ ;CLEAR BOTH WAIT AND FIRST TABLES DEC R1 BNE A. MOV #TLAST-2,R0 MOV #$NRES-1*2,R1 B.: MOV R0,TLAST(R1) ;INIT ALL "LASTS" WITH ADDR'S OF FIRSTS TST -(R0) DEC R1 DEC R1 BGE B.  * ; ******************************************************************** RAD50UNPACK: ;CONVERT 2 "RAD50" WORDS TO SIX ASCII CHARACTERS R50UNP: JSR R5,PUSHR ;SAVE CALLER'S REGS MOV 16(SP),R0 ;PNTR TO RAD50 WORDS MOV 20(SP),R1 ;PNTR TO BGN OF ASCII STRING MOV #3*400+3,R2 ;INIT MAJOR & MINOR LOOP COUNTS RADU05: MOV (R0)+,R3 ;RAD50 WORD MOV LL HAPPEN FROM TIME TO TIME. ASL R0 ;RESOLUTION*2: USE AS WORD INDEX TIMA35: ;LOOP BACK HERE FOR SUCCESSIVE RESOLUTIONS DEC R0 DEC R0 ;COUNT DOWN RESOLUTION INDEX (TWICE, ; SINCE IT WAS MADE INTO A WORD INDEX ABOVE). ON THE FIRST PASS AFTER ; FINDING THE FIRST RES'N NOT TO EXPIRE, THIS BRINGS COUNTER BACK TO ; (DOUBLE) THE COARSEST RES'N TO EXPIRE. ON SUCCESSIVE PASSES THIS ; MOVES TO NEXT FINER RES'N FOR SERVICINGS #P,@R3 VBMO SPUN P. USHNIFIO TREHE; =. 00SDUN ) =2 (. EDEUQUO TUSATSTT SE; ) R4T(TATS CBIN . T'AS'LW NEO TNTOI PTO' STLA 'TEDAUP; ) R1T(AS,LR2 V MO N HE TK.AS TEW NTOT INPOL AI TLD OKEMA; 1)(RSTLA,@R2 V MO SPUNERAT LEDNET N'DO. EXND IRDWOO NT IKEMA; R1 L AS SPUN Y ITORRI PEDAV S'SSKTAT GE; 1 ,R2)(RORRIHP VBMO EUQUF OND(E O.ER ZTOD OR WADRETHT SEX MOV #RESTAB+$NRES,R0 MOV #$NRES-1,R1 C.: MOVB -(R0),CURTAB(R1) ;INIT RESOLUTION COUNTERS DEC R1 BGE C. MOVB #-1,TIMBSY MOVB #-1,SKDBSY CLRB BASCNT CLR ABMPLR MOV #THDTAB,CURTHD ;FOR SCHEDULER MOV #SWAITB,STBPTR CLR COUNTR MOV #1,TICTOC CLR MINUTE MOV #401,MONTH MOV #TIMER,TIMINT MOV #34#COEFF,R4 ;PNTR TO COEFFICIENT TABLE RADU10: CLR R5 ;0 QUOTIENT ;NOW DIVIDE BY COEFFICIENTS RADU20: CMP R3,(R4) ;DONE WITH DIVIDE? BLO RADU30 ;YES SUB (R4),R3 ;NO: SUBTRACT COEFFICIENT... INC R5 ;...AND INCR QUOTIENT BR RADU20 ;THEN LOOP BACK .PAGE ; DIVIDE DONE: QUOTIENT IN R5, REMAINDER IN R3. ; NOW CONVERT FROM RAD50 CHAR . BLT TIMEXT ;EXIT HERE WHEN ALL RESOLUTIONS HAVE ; BEEN SERVICED, OR IF NO LEVELS ACTUALLY EXPIRED. .PAGE TIMB10: ;NOW WE BEGIN TRAVELING THE THREADS ;ALSO LOOP RE-ENTRY POINT FOR EACH RESOLUTION MOV #TFIRST,R1 ;CALC ADDRESS IN THE QUEUE POINTER TABLE ADD R0,R1 ;...OF POINTER FOR CURRENT RESOLUTION TIMB15: ;LOOP HERE FOR EACH SUCCESSIVE MODULE MOV ; 2)(R C DE SPUN EXND ITEBYA O NT ICKBA4 RGEANCH; R4 R AS . SSREDD AERADHEM RAOGPRT GE; 2 ,R4)(RERADHE V MO SPUN X DEIND OR W ATOIN4 RKEMA; R4 L AS ; =. 00SCUN C ND.E SPUN . USATSTR ROER; 20SEUN BR SPUNUSATSTG INTTSER TEAFN URET RK. OUSATST; 00SDUN Q BE SPUN S TUTA SSTTE; T0,TIMINT+2 MOV #CALENDAR,TODINT MOV #340,TODINT+2 MOV #STLINT+2,STLINT ;CURRENTLY WILL BE AN ERROR CLR STLINT+2 ;CAUSES A "HALT" MOV #TODBIT,CLKENB ;START UP TIME-OF-DAY CLOCK RTS PC .END TO ASCII CHAR RADU30: TSTB R5 BEQ RADU40 ;"BLANK CMPB R5,#33 BEQ RADU60 ;[$] BGT RADU50 ;[.] TO [9] ADD #40,R5 ;[A] TO [Z] RADU40: ADD #16,R5 RADU50: ADD #11,R5 RADU60: ADD #11,R5 MOVB R5,(R1)+ ;STORE ASCII CHAR TST (R4)+ ;NEXT COEFFICIENT DECB R2 ;DONE 3 CHARS? BGT RADU10 ;NOT YET SW #340,PS ;AVOID INTERFERENCE WITH "DQTIME" MOVB R0,CURRES ;INIT "CURRENT RESOLUTION" BEFORE BEGIN TIMB16: ;LOOP RE-ENTRY POINT MOV R1,R2 ;REMEMBER UPSTREAM MODULE ADDRESS... ;...FOR USE IN DE-QUEUEING "ONE-SHOTS" MOV (R1),R1 ;NEXT MODULE'S THREAD WORD ADDRESS BEQ TIMB90 ;END OF THREAD: GO CHECK FOR DE-QUEUE CMPB RESET(R1),#377 ;IF MODULE I R2 T TS SPUN R)TEISEG RPS (R3E ORSTRE; R3+,P)(S VBMO SPUN USATSTR ROERT GE; R2+,P)(S V MO SKTAY LAEROV (. FFTU S'SITO DOMRPT LE; Y OVNS,UPC R JS SPUN ERMBNUK AS TSHPU; P)(S,-R4 V MO SPUN M PO RERFT ATO3 RVESA; P)(S,-R3 VBMO SPUN TSUPRRTEINW LOAL; S #P,@R3 VBMO SPUN PCMP (R3)+,(R3)+ ;BUMP SECONDARY MODULE POINTER FOR FLAGS TIMB60: ASLB R2 ;GET "J" OPTION BIT INTO SIGN BPL TIMB70 ;NOT SELECTED ; SAVE NEEDED REGISTERS ON STACK MOV R0,-(SP) MOV R4,-(SP) MOV R5,-(SP) JSR PC,@JSTARG(R3) ;LINK TO USER RTNE. (R1)= MODULE BEGIN ; POP SAVED REGISTERS FROM STACK MOV (SP)+,R5 MOV (SP)+,R4 MOV (SP)+,R0 TIMB70: MOV AB R2 ;YES: IS SECOND WORD CONVERTED? BNE RADU05 ;NOT YET BR RADP35 ;ALL DONE: RESTORE SAVE REGS & RETURN ;VIA COMMON RETURN COEFF: ;TABLE OF COEFFICIENTS +1600. ;40**2 +40. ;40**1 +1. ;40**0 .END S FLAGGED... BEQ TIMB16 ;...DON'T EXECUTE IT. DECB TIMBYT(R1) ;COUNT DOWN MODULE'S TIMER BNE TIMB16 ;NOT EXPIRED: GET NEXT MODULE ;TIMER EXPIRED! IT IS MODULE'S TIME. ; SINCE COMPLETION ROUTINES RUN UNDER THE "J" OPTION ASSUME R1 POINTS TO ; THE CURRENT MODULE (IT'S THREAD WORD), R1 MUST BE PRESERVED AS SUCH ; UNTIL THE POSSIBLE ROUTINE IS RUN. BUT TWO OTHER POINTERS ARE NEEDED: ; R3 MOVES DOWN THE MODULE . ITO D I. RECO; 00SCUN O BL SPUNK)OR WESDOO WH( ? SKTAE OR CORY LAEROV; INTMOV,#R4 PBCM SPUN 1.S ROR FOK OCBLT EX NEDNET N'DO; AYRLOV FG.I SPUN S ESGRRO PING INEUQUS AUSATSTT SE; 4)(RATST,T#1 VBMO SPUN ; =. 20SAUN SPUN R.ROER. NO; 10SEUN E BN SPUN D?DEENSPSU- 4 S=TUTA SHE TIS; #4),R4T(L R5,R1 ;RESET MODULE POINTER (SEE EXPLN. ABOVE) BR TIMB15 ;LOOP BACK FOR MORE MODULES .PAGE TIMB90: ;HERE AT END OF A RESOLUTION THREAD MOVB (PC),CURRES ;KILL "CURRENT RESOLUTION" @ THREAD END TST DQFLAG ;DID "DQTIME" REQUEST ANY DURING THREAD? BEQ TIMA35 ;NO: NO CHECK NECESSARY. GET NEXT RES'N MOV #TFIRST,R1 ;IS NECESSARY TO RE-TRAVEL THREAD ADD R0,R1 OR(R0) ;ANY REQUEST ERRORS? BEQ PRTA85 ;NO CLRB DAVAIL(R3) ;YES, CONVERT TO CORE Q FOR UNIT/LEVEL BR PRTA47 ;GO EXAMINE Q'S .ENDC ; ; ; PROCESS INTERRUPT FROM ECHO OF INPUT CHAR ; PRTB10 = . INCB TTCURS(R1) ;INCR CURSOR FOR THIS TTY UNIT PRTB20 = . MOV OTIMER(R5),-(SP) ;DEQUEUE ECHO TIMER JSR PC,DQTIME TST (SP)+ BR PRTA85 ; ; ;  TO COMPENSATE FOR OPTIONAL PARAMTERS WHICH ; MAKE THE LIST LONGER, AND R5 IS RESET TO POINT TO THE UPSTREAM MODULE ; IN CASE THE CURRENT MODULE IS A "ONE-SHOT" AND IS REMOVED FROM THE ; THREAD. R1 IS LOADED FROM R5 AT THE END OF THE LOOP TO ALLOW THIS. MOV R1,R3 ;INIT R3 AS DYNAMIC LIST POINTER MOV R1,R5 ;INIT R5 IN PREP FOR R1 RESET BELOW MOVB RESET(R1),TIMBYT(R1) ;RESET TIMER BYTE BNE TIMB20 ;MODULE IS A REPEATATS PBCM SPUN S PTRUERNT ILL AUT OCKLO; S #P,@40#3 VBMO SPUN L.GALEIL S.YE; 30SEUN I BH SPUN ERMBNUK AS TALEG LOP T >K#AS TIS; KSAS,TR4 PBCM SPUN ALEGLL I. =0 #SKTA; 30SEUN Q BE SPUN D ENSPSUUNO TSKTAF OERMBNUT GE; R4),SPK(ASUT SBBI SPUN ADLOE YT BOR FR4R EACL; R4 R CL SPUN H ;PROPER THREAD START WORD MOV R1,R2 ;REMEMBER UPSTREAM WORD TIMB92: MOV (R1),R1 ;NEXT MODULE'S ADDRESS BEQ TIMA35 ;THREAD'S END: CAN NOW EXIT CMP 5(R1),#377 ;WAS THIS MODULE FLAGGED? BNE TIMB92 ;NO: KEEP LOOKING MOV (R1),(R2) ;FOUND ONE! BRIDGE OVER DE-QUEUED MODULE BNE TIMB94 ;NOT FINAL IN THREAD MOV R2,TLAST(R0) ;WAS END MODULE: UPDATE "LAS PROCESS INTERRUPT FROM ECHO OF FORMATTING LF ; PRTB30 = . MOVB #1,CHTYPE(R1) ;SET CHAR TYPE FOR NORMAL ECHO CLRB TTCURS(R1) ;SET CURSOR TO BEGINNING OF LINE BR PRTB20 ;GO DEQUEUE ECHO TIMER ; ; ; PROCESS INTERRUPT FROM ECHO OF FORMATTING CR ; PRTB40 = . MOVB #LF,@TTODBR(R5) ;OUTPUT A FORMATTING LF MOVB #2,CHTYPE(R1) ;SET CHAR TYPE FOR FORMATTING LF BR PRTA85 ;GO RETURN ;TER: LEAVE IN THREAD MOV (R1),(R2) ;"ONE-SHOT": REMOVE FROM THREAD ... BNE TIMB22 ;...BY "BRIDGING". BRANCH IF NOT LAST MOV R2,TLAST(R0) ;BUT UPDATE "LAST" POINTER IF WAS END TIMB22: MOV #1,(R1) ;SET THREAD WORD INACTIVE IN EITHER CASE MOV R2,R5 ;BACK POINTER TO UPSTREAM MODULE TIMB20: MOV R4,PS ;UNLOCK INTERRUPTS: SAFE NOW MOVB OPTION(R3),R2 ;GET OPTION BYTE FOR THIS MODULE ERSTGIRER ROERR EACL; ) SP-( R CL SPUN PS VESA; 3 ,RPS@# VBMO S TUTA SORRR ETOX DEIN; SKTA=U RRUE ERMBNUK AS TTOX DEIN; +2RNRT=U K ASUT SPUN . NTMEGUARN URET RTOX DEIN; +4VESA=U N TRUR SPUN C ND.E SPUN C ND.E SPUN DT" POINTER TIMB94: MOV #1,(R1) ;SET THREAD-WORD INACTIVE DEC DQFLAG ;ANY MORE TO FIND? BGT TIMB92 ;YES: KEEP LOOKING BR TIMA35 ;DONE: EXIT EARLY .PAGE TIMEXT: ;EXIT POINT FOR [TIMER] MOV #TFIRST,R0 ;PREPARE TO SCAN LIST OF "FIRST" WORDS MOV #$NRES,R1 ;LIST SIZE MOV #340,PS ;LOCK OUT PULSE DURING EXIT SEQUENCE TIMEX1: TST (R0)+  ; ; PROCESS INTERRUPT FROM ECHO OF "U" ; PRTB50 = . TSTB TOIFLG(R1) ;DOES TIMEOUT FLAG INDICATE AN BNE PRTB55 ;ABORT OF INPUT REQUEST PROCESSING MOVB #CR,@TTODBR(R5) ;NO, OUTPUT A FORMATTING CR MOVB #3,CHTYPE(R1) ;SET CHAR TYPE FOR FORMATTING CR BR PRTA85 PRTB55 = . CLRB TOIFLG(R1) ;RESET INPUT TIMEOUT FLAG BR PRTC15 ;GO CR, LF, AND DO END PROCESSING ; ;  TSTB TASKNO(R3) ;IS MODULE TASK-RELATED? BEQ TIMB54 ;NO: CHECK FOR OTHER OPTIONS ;YES: SET UP STACK FOR CALL TO EITHER ;[SUSPEND] OR [QUEUE] MOVB TASKNO(R3),-(SP);PUSH TASK # FIRST CLR -(SP) ;IMMEDIATE RETURN REQUEST FOR BOTH, OR ;INIT OF PRIORITY IF NEEDED FOR [QUEUE]. TSTB R2 ;IS "SUSPEND" OPTION SELECTED? E IZ SCKTASA; 2.=1 E AVUS SPUN . EG RLL AVESA; HRUS,PR5 R JS SPUN N IORSVEY LAEROVF ILYON; AYRLOV Z FN.I C ND.E ; . =8 E AVUS ; P)(S,-R4 V MO ; P)(S,-R3 V MO SPUN ; P)(S,-R2 V MO RSTEISEG REDIRQURE VESA; P)(S,-R1 V MO SPUN N IORSVEY LAEROVN-NOF ILY@ ;IF ANY IS NON-ZERO... BNE TIMEX2 ;...DON'T TURN OFF CLOCK DEC R1 ;BE SURE TO DO WHOLE LIST BNE TIMEX1 TST @TTBPTR ;CHECK FOR EMPTY "WAIT" LIST BNE TIMEX2 ;NOT EMPTY: LEAVE CLOCK ON MOV #TODBIT!STLBIT,CLKENB ;NO MODULES ACTIVE: KILL TIMER .IFNZ $DEBUG .=.-6 ;WILL INSERT NO-OPS TO ALLOW SPACE FOR INSERTION... .WORD 240,240,240 ;...OF TURN-OFF  PROCESS INTERRUPT FROM ECHO OF "^" ; PRTB60 = . MOVB #'U,@TTODBR(R5) ;OUTPUT A "U" MOVB #4,CHTYPE(R1) ;SET CHAR TYPE FOR ECHO OF "U" PRTB70 = . INCB TTCURS(R1) ;INCR CURSOR BR PRTA85 ;GO RETURN ; ; ; PROCESS INTERRUPT FOR ECHO OF "^" ; PRTB80 = . MOVB #'^,@TTODBR(R5) ;OUTPUT A 2ND "^" MOVB #5,CHTYPE(R1) ;SET CHAR TYPE FOR ECHO OF 2ND "^" BR PRTB70 ; ; PRO BPL TIMB30 ;NO: GO DO QUEUEING JSR PC,UNSPND ;CALL TO "UN-SUSPEND" BR TIMB50 ;GO POP ERROR WORD & CHECK FLAG OPTION TIMB30: ;HERE TO QUEUE A TASK. TASK # AND RETURN CODE ;(OR INITED PRIORITY) ALREADY PUSHED ONTO STACK. .IFNZ DPRTY ;DYNAMIC PRIORITIES OPTION CLR -(SP) ;USE SYSTEM-ASSIGNED PRIORITY ; (ACTUALLY LEAVES ZERO AS PRIORITY AND PUSHES NEW RETURN CODE OF ZERO, ; PON; AYRLOV FZ.I VESARG Z FN.I D.VESAS ERSTGIREF OERMBNUT ULFADE; =0 E AVUS T INPOY TREN; =. NDSPUN ; R TEINPOK ACST= <= PC ; N TRUR ; K ASUT ; ; S:OWLLFOS AKSOO LCKTA SRYNT EON; ; SPUN C ND.E SPUN ; R OP,PHRUS,PVYSOUN EF.R SPUN <INSTRUCTION .ENDC $DEBUG TIMEX2: DECB TIMBSY ;NESTING "BUSY" COUNTER BLT TIMEX3 ;NORMALLY RESIDES @ ZERO DURING ROUTINE ;EXECUTION. GOES ABOVE IF ADDITIONAL ;OCCASIONS TO ENTER ROUTINE HAVE ;OCCURRED DURING EXECUTION. IN THIS ;CASE ROUTINE IS RE-EXECUTED IMMEDIATELY ;IN AN ATTEMPT TO RECESS INTERRUPT FOR ECHO OF "\" ; PRTB90 = . MOVB SLSHCH(R1),@TTODBR(R5) ;OUTPUT NEW OR DELETED ;CHAR AFTER BACKWARD SLASH MOVB #1,CHTYPE(R1) ;SET CHAR TYPE FOR NORMAL ECHO BR PRTB70 ; ; PROCESS INTERRUPT FOR ECHO OF EOM CHARACTER ; PRTC10 = . .IFZ EOMOPT INCB TTCURS(R1) ;INCR CURSOR BR PRTC55 ;CR, LF NOT OUTPUT AFTER EOM .ENDC PRTC15 = OSSIBLY INITING STACK SPACE FOR PASSED ARGUMENT, IF OPTION IS ON.) .ENDC DPRTY .IFNZ ARG ;SYSTEM OPTION TO PASS ARGUMENT ON QUEUE BIT #100,R2 ;DOES MODULE HAVE AN ARGUMENT TO PASS? BEQ TIMB40 ;NO MOV @TIMARG(R3),(SP);YES: REPLACE THE ZERO WITH ACTUAL ARG TIMB40: CLR -(SP) ;MUST PUSH RETURN CODE SINCE ARGUMENT .ENDC ARG ;USED UP LAST ONE. JSR PC,QUEUE ;CALL QU ; AYRLOV Z FN.I NDSPUN EF.D E AG.P **********************************************************************;* * ; * : ERMBNUE GULOTACA ; * 0 : ONSIVIRE ; * 1 -7EP-S27 : TEDA ; * 538-SYNCHRONIZE JMP TIMA15 TIMEX3: JMP RESTOR ;NORMAL RETURN TO INTERRUPTED PROGRAM .PAGE TTBPTR: .WORD TWAITB ;TIMER TABLE POINTER TO "WAIT" STACK TWAITB: .WORD 0 ;FIRST LOC'N OF "WAIT" TABLE IS ALWAYS 0 .=$TWATZ*2+. ;RESERVE SPACE FOR TABLE TMTBND = .-2 ;ADDRESS OF LAST TALBE LOCATION TFIRST: ;TABLE OF POINTERS TO FIRST MODULE IN  . MOVB #CR,@TTODBR(R5) ;OUTPUT A CR MOVB #11.,CHTYPE(R1) ;SET CHAR TYPE FOR ECHO OF A ;CR FOLLOWING AN EOM BR PRTB70 ; ; INTERRUPT FROM OUTPUT OF LF IN OUTPUT MODE ; PRTC20 = . CLRB CHTYPE(R1) ;SET CHAR TYPE TO OUTPUT MODE JMP PRTA17 ;GO CONTINUE OUTPUT OF MSG ; ; PROCESS INTERRUPT FOR OUTPUT MODE CR ; PRTC30 = . MOVB #LF,@TTODBR(R5) ;OUTPUT A LF EUE TIMB50: ;HERE AFTER [QUEUE] OR [UNSPND] TST (SP)+ ;POP ERROR RETURN CODE TIMB54: ;HERE WHEN NOT TASK-RELATED ASLB R2 ;MOVE "ARG" OPTION INTO SIGN BIT BPL TIMB56 ;"A" NOT SET TST (R3)+ ;PASS POINTER OVER ARG, WHETHER USED OR NOT TIMB56: ASLB R2 ;GET "FLAG" OPTION BIT INTO SIGN BPL TIMB60 ;NO FLAG OPTION BISB TIMASK(R3),@TMFLAG(R3): ERMMRAOGPR ; * ; *. ROZEN-NOS IVESARGR TEMERAPAN GEYS SHE TIFD RETOES R ; * BEL IL WEYTH D.PNNS UBYD SE URE AR41- RRSTEISEG R ; * E.INUTROT UPRRTEINR OETPLOM C ; */O IANR HEIT EISM RAOGPRG INLLCAE THF I=0T US MRNRT U S:TENO ; * ; SPUN * ERMBNUK AS TALEG4;EACH RESOLUTION'S THREAD. CONTAIN ZERO ;WHEN THREAD IS EMPTY. .WORD ,,,,,,,,,,,,,,, ;MAX TABLE SIZE: 16 WORDS .=$NRES*2+TFIRST ;ACTUAL TABLE SIZE = [$NRES] WORDS TLAST: ;TABLE OF POINTERS TO LAST MODULE IN ;EACH RESOLUTION'S THREAD. CONTAIN THE ;ADDRESS OF [TFIRST(R)] WHEN THREAD ;IS EMPTY. .WORD ,,,,,,,,,, CLRB TTCURS(R1) ;RESET CURSOR TO BEGINNING OF LINE MOVB #9.,CHTYPE(R1) ;SET CHAR TYPE FOR OUTPUT MODE LF BR PRTA85 ;GO RETURN ; ; PROCESS INTERRUPT FOR ECHO OF CR FOLLOWING AN EOM ; PRTC40 = . MOVB #LF,@TTODBR(R5) ;OUTPUT A LF MOVB #12.,CHTYPE(R1) ;SET CHAR TYPE FOR ECHO OF LF ;FOLLOWING AN EOM BR PRTA85 ;GO RETURN ; ; PROCESS INTERRUPT FOR ECHO OF L ;"IOR" MASK INTO FLAG LOCATION CMP (R3)+,(R3)+ ;BUMP SECONDARY MODULE POINTER FOR FLAGS TIMB60: ASLB R2 ;GET "J" OPTION BIT INTO SIGN BPL TIMB70 ;NOT SELECTED ; SAVE NEEDED REGISTERS ON STACK MOV R0,-(SP) MOV R4,-(SP) MOV R5,-(SP) JSR PC,@JSTARG(R3) ;LINK TO USER RTNE. (R1)= MODULE BEGIN ; POP SAVED REGISTERS FROM STACK MOV (SP)+,R5 MOV (SP)+,R4LL I=3 ; SPUN *Y)LAEROVG(ON LTOD DEENSPSUD-LEELNCCAK AS T=2 ; SPUN * ) =4OT(NUSATSTK AS TALEGLL I=1 ; * EDORON HSTUEEQ R=0 ; * : USATSTD NEURET RHE TIS RRUE ; * K.AS T ; D*UEUE QTYORRI PSTHEIG HHE TTOL RONTCOS AS P=1 ; * R.0,,,,, ;MAX TABLE SIZE: 16 WORDS .=$NRES*2+TLAST ;ACTUAL TABLE SIZE = [$NRES] WORDS .PAGE RESTAB: ;RESOLUTION COUNTER TABLE: PERMANENT .BYTE RES0,RES1,RES2,RES3,RES4,RES5,RES6,RES7,RES8 .BYTE RES9,RES10,RES11,RES12,RES13,RES14,RES15 .=RESTAB+$NRES ;SET TO ACTUAL TABLE SIZE .BYTE 0 ;END BYTE CURTAB: .BYTE RES0,RES1,RES2,RES3,RES4,RES5,RES6,RES7,RES8 .BYTE RES9,RF FOLLOWING AN EOM ; PRTC50 = . CLRB TTCURS(R1) ;RESET CURSOR TO BEGINNING OF LINE PRTC55 = . MOV ILSTAD(R5),R0 ;GET CURRENT INPUT LIST ADDRESS JMP PRTA40 ;GO DEQUEUE ECHO TIMER ; ; ; PROCESS INTERRUPT FOR ECHO OF RUBOUT FOR TTY TURNON ; PRTC60 = . TSTB TTYON(R1) ;IS TTY UNIT WARMUP COMPLETE BNE PRTC65 ;NO JMP PRTA80 ;YES PRTC65 = . MOVB MOV (SP)+,R0 TIMB70: MOV R5,R1 ;RESET MODULE POINTER (SEE EXPLN. ABOVE) BR TIMB15 ;LOOP BACK FOR MORE MODULES .PAGE TIMB90: ;HERE AT END OF A RESOLUTION THREAD MOVB (PC),CURRES ;KILL "CURRENT RESOLUTION" @ THREAD END TST DQFLAG ;DID "DQTIME" REQUEST ANY DURING THREAD? BEQ TIMA35 ;NO: NO CHECK NECESSARY. GET NEXT RES'N MOV #TFIRST,R1 ;IS NECESSARY TO RE-LEAL CHE TTON URET R=0 ; * D:PNNS UOMFRN URET RHE TLSRONTCON TRUR ; * EDEUQUREE BTOK AS THE TOF# K AS THE TISK ASUT ; * REHE W ; * ; * ) ANTROR(F R)ER,URNRT,USKTA(UNDSPUN LLCA. 2) ; * ; * ,ES10,RES11,RES12,RES13,RES14,RES15 .=CURTAB+$NRES ;SET TO ACTUAL TABLE SIZE QTMCNT: .BYTE 0 ;COUNTER FOR USE IN "QTIME" TIMBSY: .BYTE 0 ;FLAG & NESTING COUNTER FOR [TIMER] BASCNT: .BYTE 0 ;OPTIONAL SUB-RESOLUTION PULSE COUNTER CURRES: .BYTE 0 ;CURRENT RESOLUTION WHEN "TIMER" ACTIVE .EVEN DQFLAG: .WORD 0 ;# OF MODULES REQUESTED TO BE DE-QUEUED ;ON CURRENT RESOLUTION WHILE #RO,@TTODBR(R5) ;OUTPUT ANOTHER RUBOUT DECB TTYON(R1) ;DECR COUNT JMP PRTA85 ;RETURN .PAGE ; ; KBDINT -- TELETYPE KEYBOARD/PT READER INTERRUPT ROUTINE ; ; CONDITIONS UPON ENTRY -- ; ; TTY UNIT NO. IS CONTAINED IN BITS 0-3 OF PS ; AS PROVIDED BY INTERRUPT VECTOR FOR ; INTERRUPTING UNIT ; ; ROUTINE IS ENTERED AT PRIORITY LEVEL OF UNIT VECTOR ; ; KBDINT = . TRAVEL THREAD ADD R0,R1 ;PROPER THREAD START WORD MOV R1,R2 ;REMEMBER UPSTREAM WORD TIMB92: MOV (R1),R1 ;NEXT MODULE'S ADDRESS BEQ TIMA35 ;THREAD'S END: CAN NOW EXIT CMPB 5(R1),#377 ;WAS THIS MODULE FLAGGED+0 BNE TIMB92 ;NO: KEEP LOOKING MOV (R1),(R2) ;FOUND ONE! BRIDGE OVER DE-QUEUED MODULE BNE TIMB94 ;NOT FINAL IN THREAD MOV R2 RRUE+,P)(S V MO ; * NDSPUN T EM ; * ) SP-(N,TRUR V MO ; * ) LYMBSEAS ( ) SP-(K,ASUT V MO. 1) ; * ; * S: INETIOU RISTHO TGEKAIN LHE T E:AGUS ; * ; SPUN *. ( ACTIVE IN "TIMER" .END  SAVE ;CALL SAVE ROUTINE MOVB PS,R1 ;GET UNIT NO FROM BITS 0-3 OF PS BIC #177760,R1 MOV R1,R5 ASL R5 ;UNIT * 2 USED AS INDEX TO WORD TABLES MOV ITIMER(R5),R4 ;GET ADDRESS OF OPERATOR RESPONSE TIMER MOVB #TTITIM,TCNTR(R4) ;PUT COUNT INTO TIMER MOV ILSTAD(R5),R0 ;GET ADDRESS OF LIST CURRENTLY ;BEING PROCESSED MOV DATA(R0),R2 ,TLAST(R0) ;WAS END MODULE: UPDATE "LAST" POINTER TIMB94: MOV #1,(R1) ;SET THREAD-WORD INACTIVE DEC DQFLAG ;ANY MORE TO FIND? BGT TIMB92 ;YES: KEEP LOOKING BR TIMA35 ;DONE: EXIT EARLY .PAGE TIMEXT: ;EXIT POINT FOR [TIMER] MOV #TFIRST,R0 ;PREPARE TO SCAN LIST OF "FIRST" WORDS MOV #$NRES,R1 ;LIST SIZE MOV #340,PS ;LOCK OUT PULSE DUONSIENSPSUS ITT ASKTAE THF OELEV LHE TASE AM SHE T ; SPUN *ISD SE UELEV LTYRIIOPRE TH E.EUQUY ITORRI P AINK AS T ; SPUN *EDNDPEUS SLYRITAUNOL V ACELA PTOD SE UISE INUTROS HI TE:OSRPPU ; * ; * UEUE QTYRIIOPRE ARTWOF S ; * AINK AS TEDNDPEUS S ACELA P -NDSPUN: ONTICAFITIENIDM RAOGPR ; * $ ABRT BR ABRD30 ; GO FINISH UP ABRT ; ; ABRC10 =. ; HERE ONLY IF ABORTING THE ACTIVE TASK ABRT MOV ACTIVE,R1 ; GET TASK'S HEADER ADDRESS TO CLEAR ABRT CLR TSTACK(R1) ; THE TASK STACK POINTER FOR DISPTCH ABRT CLR ACTIVE ; GET RID OF THE ACTIVE TASK ABRT CLR COUNTR ; AND THE TASK'S COUNTER  ;GET DATA BUFFER ADDRESS TST (R2) ;IS ECHO SPECIFIED BY USER BUFFER BPL KBDA10 ;NO MOV OTIMER(R5),-(SP);YES, QUEUE ECHO TIMER MOV #TTOTIM,-(SP) JSR PC,QTIME TST (SP)+ ;POP ERROR CODE OFF STACK KBDA10 = . MOVB @TTIDBR(R5),R4 ;GET CHAR WHICH WAS INPUT BEQ KBDA20 ;PUNCHED TAPE LEADER OR "HERE IS" KEY? BICB #200,R4 ;STRIP OFF CHANNEL 8 OFRING EXIT SEQUENCE TIMEX1: TST (R0)+ ;IF ANY IS NON-ZERO... BNE TIMEX2 ;...DON'T TURN OFF CLOCK DEC R1 ;BE SURE TO DO WHOLE LIST BNE TIMEX1 TST @TTBPTR ;CHECK FOR EMPTY "WAIT" LIST BNE TIMEX2 ;NOT EMPTY: LEAVE CLOCK ON MOV #TODBIT!STLBIT,CLKENB ;NO MODULES ACTIVE: KILL TIMER .IFNZ $DEBUG .=.-6 ;WILL INSERT NO-OPS TO ALLOW SPACE FOR INSERTION... ; * D N P S N U ; **********************************************************************;* E AG.P SKFT C ND.E SKFT UPH ISIN FGO; 00KEFT BR SKFTNGDIEN P/O I -EEFRR FOS TUTA SSKTAT SE; ) R0T(TATS2,#- VBMO SKFT S ESGRRO PINO I/; R5 C DE: M1KEFT SKFT. YSLA OTHWIG LA F ABRT CLR MFLAG ; CLEAR TASK LOCKOUT MOV SP,R1 ; HERE WE MUST TRANSFER , IN ORDER, THE ABRT ADD #ATASK+4,R1 ; CONTENTS OF THE TASK STACK TO THE SYS ABRT MOV STACK,SP ; STACK SO THAT THE RETURN (ABRFIN) WILLABRT MOV -(R1),-(SP) ; WORK. (GLAD WE ONLY DO THIS ONCE!) ABRT MOV -(R1),-(SP) ; FIRST, THE TASK# AND THE PC. ABRT .IFNZ RGSAVE ;  TTY INPUT CHAR CMPB R4,#EOMCH ;NO, IS IT THE EOM CHAR? BEQ KBDB70 ;YES CMPB R4,#CR ;IS IT AN EOM CR? BEQ KBDB50 ;YES CMPB R4,#EOLCH ;IS IT THE END OF LINE CHAR? BEQ KBDA50 ;YES CMPB R4,#MRCH ;NO, IS IT THE MSG RESTART CHAR? BEQ KBDA70 ;YES MOV R2,R3 ;GET POINTER TO CHAR SLOT IN DATA BUFFER ADD #MSGDAT,R3  .WORD 240,240,240 ;...OF TURN-OFF INSTRUCTION .ENDC $DEBUG TIMEX2: DECB TIMBSY ;NESTING "BUSY" COUNTER BLE TIMEX3 ;NORMALLY RESIDES AT ONE DURING ROUTINE ;EXECUTION. GOES ABOVE IF ADDITIONAL ;OCCASIONS TO ENTER ROUTINE HAVE ;OCCURRED DURING EXECUTION. IN THIS ;CASE ROUTINE IS RE-EXECUTED IMMEDIATELY /O IUTBO ARYOR WLYON; AYRLOV Z FN.I SKFT . ERUSO TRNTURE; 00KEFT BR SKFT R BEUM NSKTAL GALEIL; R5 C IN: 10KEFT SKFT S TUTA SSKTAL GALEIL; R5 C IN: 20KEFT SKFT K.AS TVETIAC; R5 C IN: 30KEFT SKFT ; SKFT S ONTIDION CORRR ABRT MOV -(R1),-(SP) ; THEN R0 & R1, IF SAVED. ABRT MOV -(R1),-(SP) ; ABRT .IFG $ABMES ; ABRT MOV -(R1),-(SP) ; NEXT R2 IF USING ABORT MESSAGES. ABRT .ENDC ABRT .IFNZ OVRLAY ; ABRT MOV -(R1),-( ADD CHCNT(R2),R3 CMPB R4,#RO ;IS CHAR A RUBOUT (DELETE A CHAR)? BEQ KBDA80 ;YES TSTB FRSTRO(R1) ;IS IT 1ST CHAR AFTER SOME RUBOUTS? BNE KBDB20 ;YES KBDA13 = . MOV (R2),-(SP) ;STRIP OFF BITS 14,15 OF 1ST WORD OF BIC #140000,(SP) ;BUFFER TO GET NO. OF CHARS TO BE INPUT CMP CHCNT(R2),(SP)+ ;HAVE TOO MANY CHAR BEEN INPUT? BGE KBDB30 ;YES  ;IN AN ATTEMPT TO RE-SYNCHRONIZE JMP TIMA15 TIMEX3: JMP RESTOR ;NORMAL RETURN TO INTERRUPTED PROGRAM .PAGE TTBPTR: .WORD TWAITB ;TIMER TABLE POINTER TO "WAIT" STACK TWAITB: .WORD 0 ;FIRST LOC'N OF "WAIT" TABLE IS ALWAYS 0 .=$TWATZ*2+. ;RESERVE SPACE FOR TABLE TMTBND = .-2 ;ADDRESS OF LAST TALBE LOCATION TFIRST: ;TABLE OF POINTERS TO FIRST MODU EOR FREHE; SKFT ; SKFT RNTURE; PC S RT SKFT C ND.E SKFT . EG RLL ARETOES RYSWAAL; R OP,PR5 R JS SKFT S ERSTGIREL RANEGEE ORSTRE; VESARG Z FN.I SKFT USATSTR ROERT SE; ) SP2(R-ER,FR5 V MO SKFT TSSP) ; NOW R3 - R5 IF OVERLAY VERSION ABRT MOV -(R1),-(SP) ; ABRT MOV -(R1),-(SP) ; ABRT .ENDC ABRT .ENDC ABRT MOV -(R1),-(SP) ; FINNALLY THE PS. THIS INLINE CODE IS,ABRT ; AT MOST, ONLY 4 WORDS LONGER THA INC CHCNT(R2) ;INCREMENT CHAR COUNT MOVB R4,(R3) ;MOVE CHAR TO USER'S BUFFER TST (R2) ;NO, IS ECHO SPECIFIED? BPL KBDA15 ;YES KBDA14 = . BIT #040000,(R2) ;IS INPUT ON PUNCHED TAPE? BNE KBDA20 ;YES MOV #ECHOCH,R4 ;NO, GET NON-PRINTING ECHO CHAR KBDA15 = . MOVB R4,@TTODBR(R5) ;YES, OUTPUT CHAR FOR ECHO KBDA20 = . MOV LE IN ;EACH RESOLUTION'S THREAD. CONTAIN ZERO ;WHEN THREAD IS EMPTY. .WORD ,,,,,,,,,,,,,,, ;MAX TABLE SIZE: 16 WORDS .=$NRES*2+TFIRST ;ACTUAL TABLE SIZE = [$NRES] WORDS TLAST: ;TABLE OF POINTERS TO LAST MODULE IN ;EACH RESOLUTION'S THREAD. CONTAIN THE ;ADDRESS OF [TFIRST(R)] WHEN THREAD UPRRTEINW LOAL; PS@#+,P)(S VBMO SKFT T INPOY TRENR ROER; =. 00KEFT SKFT T.ENSCIEQUO TUSATSTS SKTAT SE; ) R0T(TATS RBCL SKFT P. USHNIFIO TREHE; =. 00KDFT SKFT C ND.E SKFT S PTRUERNT IUT OCKLO; S #P,@40#3 VBMO SKFT ERSTGIRER ROERT SERE; R5 R CL N A ABRT ; LOOP. AT BEST IT IS 2 WORDS LESS. ABRT ; ABRD10 =. ; .IFNZ OVRLAY ; CMPB R0,#OVTMIN ; IS THIS AN OVERLAY TASK? ABRT BLO ABRD30 ; NO. ABRT TSTB IOSTAT(R0) ; ANY I/O IN PROGRESS? ABRT BEQ ABRD15 ; NO. CAN ABORT NOW. ABRT ABRD13: MOVB #-3,TSTAT(R0)  ITIMER(R5),R3 ;GET ADDRESS OF OPERATOR RESPONSE TIMER MOVB #TTITIM,TCNTR(R3) ;SET TIMER BIT #040000,(R2) ;IS INPUT ON PUNCHED TAPE BNE KBDB40 ;YES KBDA30 = . JMP RESTOR ;RETURN ; ; PROCESS END OF LINE CHARACTER ; KBDA50 = . MOVB #CR,R4 ;GET CR FOR OUTPUT MOVB #3,CHTYPE(R1) ;SET CHAR TYPE FOR ECHO OF CR BR KBDA15 ;GO OUTPUT CR ; ; PRO ;IS EMPTY. .WORD ,,,,,,,,,,,,,,, ;MAX TABLE SIZE: 16 WORDS .=$NRES*2+TLAST ;ACTUAL TABLE SIZE = [$NRES] WORDS .PAGE RESTAB: ;RESOLUTION COUNTER TABLE: PERMANENT .BYTE RES0,RES1,RES2,RES3,RES4,RES5,RES6,RES7,RES8 .BYTE RES9,RES10,RES11,RES12,RES13,RES14,RES15 .=RESTAB+$NRES ;SET TO ACTUAL TABLE SIZE .BYTE 0 ;END BYTE CURTAB: .BYTE RES0,RES1,RES2,RES3,RES4,R SKFT R BEUM NSKTAT GE; R0+,P)(S V MO SKFT M PO RLLCA; Y VLQO,DPC R JS SKFT ERMBNUK AS TSHPU; P)(S,-R0 V MO SKFT R TELAR FOK ACSTN OERMBNUK AS TVESA; P)(S,-R0 V MO SKFT TSUPRRTEINW LOAL; S #P,@P)(S VBMO SKFT . UEAL V'SOMRPO TUSATSTT SE; ) R0T(TATS.,#8 VBMO SKFT . -1O TUSATSTT SET BUD EE; SET ABORT REQUESTED STATUS-OVERLAY. ABRT BR ABRD31 ; DON'T CALL RPOM. ABRT ABRD15: MOVB #8.,TSTAT(R0) ; SET STATUS TO 8 FOR RPOM. ABRT MOVB (SP),@#PS ; ALLOW INTERRUPTS ABRT MOV R0,-(SP) ; SAVE TASK NUMBER ABRT MOV R0,-(SP) ; PUSH TASK NUMBER FOR RPOM ABRT JSR PC,DQOVLY ; CALL ON RPOM. ABCESS MESSAGE RESTART CHARACTER ; KBDA70 = . MOVB #'^,@TTODBR(R5) ;OUTPUT A "^" MOVB #5,CHTYPE(R1) ;SET CHAR TYPE FOR ECHO OF "^" CLR CHCNT(R2) ;ZERO CHAR COUNT FOR RESTART OF INPUT BR KBDA30 ;GO RETURN ; ; PROCESS RUBOUT CHARACTER (CHARACTER DELETION) ; KBDA80 = . TST CHCNT(R2) ;IS CHAR COUNT ZERO? BEQ KBDA20 ;YES, IGNORE RUBOUT DEC CHCNT(R2) ;DECRES5,RES6,RES7,RES8 .BYTE RES9,RES10,RES11,RES12,RES13,RES14,RES15 .=CURTAB+$NRES ;SET TO ACTUAL TABLE SIZE QTMCNT: .BYTE 0 ;COUNTER FOR USE IN "QTIME" TIMBSY: .BYTE 0 ;FLAG & NESTING COUNTER FOR [TIMER] BASCNT: .BYTE 0 ;OPTIONAL SUB-RESOLUTION PULSE COUNTER CURRES: .BYTE 0 ;CURRENT RESOLUTION WHEN "TIMER" ACTIVE .EVEN DQFLAG: .WORD 0 ;# OF MODULES REQUESTED TO BE DE-QUEUED FR S.YE; M1KEFT E BN SKFT S?ESGRRO PINO I/Y AN; 0)(RATSTIO TBTS SKFT ; AYRLOV Z FN.I SKFT OMRPL AL CTOY NL OREHE; =. 00KCFT SKFT E OM HGO; 00KDFT BR SKFT D.REEACLE ARR TEINPOK ACSTE THD AN; 1)(RCKTATS R CL SKFT ELEV LPU CNTREUR CR,METIT ENRRCU; ) R1T(USCP RBCL ; RT MOV (SP)+,R0 ; RESTORE R0 (TASK NUMBER) ABRT MOVB #340,@#PS ; LOCK OUT INTERRUPTS ABRT .ENDC ABRT ABRD30: MOVB #7,TSTAT(R0) ; SET ABORTED STATUS. ABRD31: .IFG $ABMES ; ONLY INCLUDED IF MESSAGES WANTED. ABRT AB2MES =$ABMES+$ABMES-2 ; NEED THIS VALUE FOR WORD INDEX VALUE ABRT MOV #AB2MES,R2 ; GET NUMBER OF MESSAGE BUFF CHAR COUNT TST (R2) ;IS ECHO SPECIFIED BMI KBDA15 ;NO DEC R3 ;POINT TO LAST CHAR INPUT TO BUFFER TSTB FRSTRO(R1) ;IS THIS 1ST RUBOUT? BNE KBDB10 ;NO INCB FRSTRO(R1) ;YES, SET 1ST RUBOUT SWITCH MOVB #'\,R4 ;GET A "\" FOR OUTPUT MOVB #7,CHTYPE(R1) ;SET CHAR TYPE FOR ECHO OF "\" MOVB (R3),SLSHCH(R1) ;SAVE 1ST CHAR DELETED B ;ON CURRENT RESOLUTION WHILE ACTIVE IN "TIMER" .END SKFT HE TS,SKTAT ENIDES RRECOR FO; 1)(RERIMCT R CL ; SKFT R TELAR METI CND ASTPU CEDNEY MA; SKFT C ND.E SKFT K OR WDOM PO RET LGO; 00KCFT ISBH SKFT K?AS TAYRLVE OANS HI TIS; INTMOV,#R0 PBCM SKFT . IST IIFE OM HGO; 00KEFT I BM SKFT L AL COMRPDQA R FOK ECERS *2 ABRT ABRM10: MOV ABMTAB(R2),R1 ; SEE IF THIS MODULE IS FREE BY CHECK ABRT CMP (R1),#1 ; OF THREAD WORD. =1 IF FREE. ABRT BEQ ABRM20 ; FREE. GO USE IT. ABRT SUB #2,R2 ; SEE IF ANY MORE BUFFERS ARE LEFT ABRT BGE ABRM10 ; YES. GO CHECK IT. ABRT BR ABRFIN ; NONE LEFT. RETURN WITHOUT MESSAGE. ABRT ABRM20: MOV R0,4(R1)R KBDA15 ;GO OUTPUT "\" KBDB10 = . MOVB (R3),R4 ;GET CHAR BEING DELETED BR KBDA15 ;GO OUTPUT CHAR KBDB20 = . CLRB FRSTRO(R1) INC CHCNT(R2) ;INCR CHAR COUNT MOVB R4,(R3) ;MOVE CHAR TO USER'S BUFFER MOVB R4,SLSHCH(R1) ;SAVE 1ST NON-RUBOUT CHAR MOVB #'\,R4 ;GET A "\" FOR OUTPUT MOVB #7,CHTYPE(R1) ;SET CHAR TYPE FOR ECHO OF "\" ES10,RES11,RES12,RES13,RES14,RES15 .=CURTAB+$NRES ;SET TO ACTUAL TABLE SIZE QTMCNT: .BYTE 0 ;COUNTER FOR USE IN "QTIME" TIMBSY: .BYTE 0 ;FLAG & NESTING COUNTER FOR [TIMER] BASCNT: .BYTE 0 ;OPTIONAL SUB-RESOLUTION PULSE COUNTER CURRES: .BYTE 0 ;CURRENT RESOLUTION WHEN "TIMER" ACTIVE .EVEN DQFLAG: .WORD 0 ;# OF MODULES REQUESTED TO BE DE-QUEUED ;ON CURRENT RESOLUTION WHILECH; R0 T TS SKFT ; AYRLOV Z FN.I SKFTK.AS TEDNDPEUS S AOFE AR CKETAO TREHE; =. 00KBFT SKFT E)BLUAUE(Q 1TOD OR WADRETHT SE; ) R1,(#1 V MO: 40KAFT SKFT Y.ARSSCENEF IT'AS'LT SERED AN; ) R2T(AS,LR4 V MO SKFT RDWOD EAHR TKSAS TUSIOEVPRO NT IRDWO; 40KAFT E BN SKFT D EAHR T'SSKTAS HI TOFS NTTEON CVEMO; ) R4,(1)(R V MO: 30KAFT SKFT ; PUT TASK NUMBER IN FIRST ARGUMENT ABRT MOV R1,-(SP) ; PUT ADDRESS OF BUFFER ON STACK FOR CALABRT JSR PC,LERTYP ; THE PS IS ALL READY ON STACK ABRT BR ABRE10 ; THEREFORE, NEED THIS BRANCH ABRT .ENDC ABRFIN =. ; COMPLETION EXIT ABRT MOVB (SP)+,@#PS ; ALLOW INTERRUPTS ABRT ABRE10: .IFNZ RGSAVE ; ERROR RETURN  BR KBDA15 ;GO OUTPUT "\" ; ; MAXIMUM CHARACTER COUNT EXCEEDED ; KBDB30 = . TSTB MAXCH(R1) ;WAS MAX CHAR PREVIOUSLY EXCEEDED? BNE KBDA20 ;YES INCB MAXCH(R1) ;NO, SET MAX CHAR EXCEEDED FLAG MOV OTIMER(R5),-(SP) ;DEQUEUE ECHO TIMER JSR PC,DQTIME TST (SP)+ BR KBDA20 ;GO SET INPUT TIMER ; ; PUNCHED TAPE INPUT ; KBDB40 = . INCB ACTIVE IN "TIMER" .END D OR WADRETHT SEREO GENTH; 40KAFT BR SKFT STIR FTO; ) R2T(AS,LR2 D AD SKFT T INPOO TSTLAT SERE, SEELG INTHNO; ) R2T(AS,LSTIR#F V MO SKFT . EUQUE THN IISE LS ENGHIYTAN; 40KAFT E BN SKFT IFE SEN HE TT,RSFIT SERE S.YE; 2)(RSTIR,F1)(R V MO SKFT T.NOF ICHANBR E.EUQU; 30KAFT E BN SKFTE THN I 1O. NSKTAR TEAFT GHOU SHE TIS;  .IFZ OVRLAY ; ABRT .IFG $ABMES ; ONLY NEED IF WE HAVE ABORT MESSAGES ABRT MOV (SP)+,R2 ; RESTORE R2 (ONLY WITH ABORT MESSAGES) ABRT .ENDC ABRT MOV (SP)+,R1 ; RESTORE REGISTERS IF NEEDED. MOV (SP)+,R0 ; ABRT .ENDC  @TTICSR(R5) ;READ A FRAME OF PUNCHED TAPE BR KBDA30 ; ; PROCESS END OF MESSAGE (EOM) CHARACTER ; KBDB50 = . MOVB R4,@TTODBR(R5) ;OUTPUT CR FOR ECHO MOVB #11.,CHTYPE(R1) ;SET CHAR TYPE FOR ECHO OF CR KBDB60 = . MOV ITIMER(R5),-(SP) ;DEQUEUE OPERATOR RESPONSE TIMER JSR PC,DQTIME TST (SP)+ BR KBDA30 ;GO RETURN KBDB70 = . .IFZ EOMPRT MOVB  TABLE. MUST SET THE ; "D" DE-QUEUE FLAG IN MODULE TO FORCE IGNORE WHEN ; "SKNSRT" RUNS. IF MODULE IS QUEUED AGAIN BEFORE ; "SKNSRT" RUNS, THIS "D" FLAG WILL BE CLEREAD, AND MODULE ; WILL BE LEFT IN THE "WAIT" TABLE. BIS #10000,2(R0) ;SET "D" FLAG IN MODULE OPTION BYTE BR DQSK20 ;TAKE GOOD EXIT COUNTR: .WORD 0 ;THIS IS THE ABORT/TIME-SLICE COUNTER!! ABMPLR: .WORD 0 2)(RSTIR,FR3 P CM SKFT R ROER. NO; 20KEFT Q BE SKFT ? UEUE QHE TINL ILSTK AS TIS; 1 ,#1)(R P CM SKFT TSUPRRTEINT OUK OC LTOT SERE; S #P,@40#3 VBMO: 20KAFT SKFT . NDOU FOT NSKTA T.EF LNENO; 20KEFT BR SKFT . CKHE CGO, FTLEE OR MIF; 10KAFT E BN SKFT ADRETHE THN ISSREDD AXTNET GE; 3 ,R3)(R V MO SKFT  ABRT .IFNZ OVRLAY ; ONLY IF OVERLAY VERSION. ABRT JSR R5,POPR ; ABRT .ENDC ABRT .ENDC ; FIX UP STACK SO THAT TASK NO. IS GONE MOV (SP)+,(SP) ; THEN WERE READY FOR RTS PC. ABRT RTS PC ; .PAGE #RO,R4 ;USE RUBOUT IF EOM NOT ECHOED .ENDC MOVB R4,@TTODBR(R5) ;OUTPUT EOM CHAR FOR ECHO MOVB #8.,CHTYPE(R1) ;SET CHAR TYPE FOR ECHO OF EOM BR KBDB60 ; .PAGE ; ; REQPP --SUBROUTINE TO PREPROCESS REQUEST LISTS ; ; CALLING SEQUENCE -- ; ; JSR PC,REQPP ; ; CONDITIONS UPON ENTRY-- ; ; REQUEST LIST ADDRESS IS ON STACK ABOVE SAVED REGISTERS ; ; CONDITIONS UPON EXIT ;MULTIPLIER FOR ABORT AND TIME/SLICE CURTHD: .WORD THDTAB ;POINTER TO CURRENT THREAD BEGIN WORD THDTAB: .WORD TH1BGN ;THREAD BEGIN TABLE .WORD TH2BGN .WORD TH1BGN TH1BGN: .WORD 0 ;ACTUAL BEGIN OF THREAD #1 TH2BGN: .WORD 0 ;#2 STBPTR: .WORD SWAITB ;SCHEDULER "WAIT" TABLE POINTER SWAITB: .WORD 0 ;TOP OF "WAIT" STACK IS ALWAYS ZERO .=$SWATZ*2+. ;THE SCHEDULER "WAIT" TABLE 4 RINS ESDRADS HI TVESA; 4 ,RR3 V MO SKFT S.YE; 20KAFT Q BE SKFT ? EKSEE WSKTAE THS HI TIS; 3 ,RR1 P CM: 10KAFT SKFT E EUQUN INDOU FOT NSKTA; 20KEFT Q BE SKFT E EUQUN IRYNT ESTIR FOFS ESDRADT GE; R3),R2T(RSFI V MO SKFT X DEIND OR WTOINT IFSH; R2 L AS: 30KZFT SKFT CHARSEO TELEV LTYRIIOPRT GE; 2 ,R1) ABRT .IFG $ABMES ; ONLY NEED IF WE HAVE ABORT MESSAGES ABRT ; THERE IS A LIMIT TO THE NUMBER OF SYSGENABLE ABORT MESSAGE ABRT ; BUFFERS THAT CAN BE ADDED TO THE SYSTEM WITHOUT ADDIONAL CODE ABRT ; BEING ALSO ADDED. THE CHECK BELOW PREVENTS AN EXCESIVE ABRT ; REQUEST FROM BEING MADE. ADDIONAL BUFFERS REQUIRE THE BUFFER ABRT ; AND AN ENTRY IN THE WORD TABLE ABMTAB. ABRT ;  -- ; ; THREAD WORD OF LIST IS DECREMENTED BY 1, ; EXCEPT WHEN .NE. 1 ON ENTRY ; ; BYTE 0 OF SYSTEM WORD OF LIST CONTAINS CALLING ; TASK NO. WHICH IS ZERO IF SYSTEM WAS CALLER ; ; BYTE 1 OF SYSTEM WORD OF LIST CONTAINS TTY PHYSICAL ; UNIT NO. ; ; IF LIST HAD PARAMETER ERROR, THE ERROR WORD OF ; LIST CONTAINS AN ERROR CODE; OTHERWISE IT CONTAINS ;  SKTBND = .-2 ;END OF "WAIT" TABLE DAYTAB = .-1 ;THIS IS THE 12-BYTE TABLE OF DAYS-PER-MONTH JANARY = . FEBARY = .+1 .BYTE 31.,28.,31.,30.,31.,30.,31.,31.,30.,31.,30.,31. .EVEN CLOCK: ;EXTERNAL REFERENCE FOR TIME-OF-DAY CLOCK AND CALENDAR TICTOC: .BYTE 0 ;COUNTS CLOCK BEATS PER SECOND SECOND: .BYTE 0 ;CURRENT TIME MINUTE: .BYTE 0 ;CURRENT TIME HOUR: .BYTE 0 ;C(RORRIHP VBMO SKFT TSUPRRTEINW LOAL; S #P,@P)(S VBMO SKFT G INCHATSPDIT ENEVPRO TUSATSTT SE; ) R0T(TATS.,#8 VBMO SKFT . SKTAA E EUQUDEO TREHE; =. 00KAFT SKFT L GALEILE ARS UEAL VUSATSTR HEOTL AL; 20KEFT BR SKFT C ND.E SKFT M PO RONL AL CGO; 00KCFT Q BE SKFT Y) ABRT .IFG $ABMES-5 ; THE CURRENT MAXIMUM NUMBER OF ABORT ABRT XXXXXX ; MESSAGES BUFFERS IS 5. ABRT .ENDC ABRT ; ABRT .IFGE $ABMES-1 ; ABRT ABMES1: .WORD 1 ; MESSAGE BUFFER 1. THREAD WORD.  ZERO ; ; RO CONTAINS LIST ADDRESS ; R1 CONTAINS PHYSICAL TTY UNIT NO. ; R2 CONTAINS PRIORITY LEVEL ; R3 CONTAINS (2*UNIT + LEVEL) ; R5 CONTAINS 2*UNIT ; REQPP = . MOV 20(SP),R0 ;GET LIST ADDRESS FROM STACK JSR PC,LOCOUT ;LOCKOUT INTERRUPTS WHILE TESTING ;THREAD WORD DEC (R0) ;IS LIST QUEUEABLE BNE REQA1URRENT TIME JDATE: .WORD 1 ;CURRENT JULIAN DATE MONTH: .BYTE 1 ;CURRENT MONTH MDAY: .BYTE 1 ;CURRENT DAY OF MONTH YEAR: .BYTE 71. ;CURRENT YEAR (MINUS 1900) SKDBSY: .BYTE -1 ;SCHEDULER BUSY FLAG: IDLE=-1; .END NL OOMRPN IEDQU (9?T IIS; 2 ,R#4 B SU SKFT . YSLAEROV; 00KBFT Q BE SKFT VEHAF I 5OR FCKHE CLYON; R2 C DE SKFT ; AYRLOV Z FN.I SKFT S YE; 00KBFT Q BE SKFT ? 4)(=D DEENSPSUK AS TIS; R2 C DE SKFT 3.R ROER S.YE; 30KEABRT .WORD 99. ; ERROR CODE ABRT .WORD 0,0,0,0 ; ARGUMENTS FOR ERRTYPE. ABRT .IFGE $ABMES-2 ; ABRT ABMES2: .WORD 1,99.,0,0,0,0 ; MESSAGE BUFFER 2. ABRT .IFGE $ABMES-3 ; ABRT ABMES3: .WORD 1,99.,0,0,0,0 ; MESSAGE BUFFER 3. ABRT .IFGE $ABMES-4 ; 5 ;NO, THREAD WORD .NE. 1 MOVB (SP)+,PS ;YES, RELEASE LOCKOUT MOVB DEVICE(R0),R1 ;GET LOGICAL DEVICE NO. REQA02 = . BLT REQA25 ;INVALID IF .LT. 0 CMP R1,LOGMAX ;IS IT TOO LARGE? BGT REQA25 ;YES ASL R1 ;MAKE INDEX FOR WORD TABLES BIT PHYDEV(R1),#7400 ;IS DEVICE TYPE VALID? BNE REQA30 ;NO BIT #100000,PHYDEV(R1) ;IS DEVIF I ; ; --T XI EONUPS ONTIDION C ; ; TEBYG LA FERIM TUTTPOUN IEDINTAON CIS. NOT NI U ; ;- -RYNT EONUPS ONTIDION C ;; TOYOTTC, P SR J ;; --E NCUEEQ SNGLIAL C ;; NETIOU RUTEOIM THOECT PUINR OUTTPOUY TT- -TOYOTT ; ;; GEPA . 5 O4OI T R B P)(S,-IMWTTT # OV M ERIM TITWA UEUE;Q) SP-(),R5R(METI W OV M T OUUB RST 1UTTPOU ;5)(RBRODTT,@RO # B OV M E YP TARCHT SE ;FT Q BE SKFT )?=3 (VETIACK AS TIS; R2 C DE SKFT S.YE; 00KAFT Q BE SKFT ? D)UEUE(Q2 S=TUTA SIS; 2 ,R#2 B SU SKFT SKTAE THF OUSATSTE THT GE; R2),R0T(TATS VBMO SKFT S PTRUERNT ILL AUT OCKLO; S #P,@40#3 VBMO SKFT R0T SERE; R0 R AS SKFT  ABRT ABMES4: .WORD 1,99.,0,0,0,0 ; MESSAGE BUFFER 4. ABRT .IFGE $ABMES-5 ; ABRT ABMES5: .WORD 1,99.,0,0,0,0 ; MESSAGE BUFFER 5. ABRT .ENDC ABRT .ENDC ABRT .ENDC ABRT CE AVAILABLE? BNE REQA50 ;NO MOVB PHYDEV(R1),R1 ;GET TTY UNIT NO. FOR INDEXING TABLES MOVB R1,SYSTEM+1(R0) ;SAVE UNIT NO. IN BYTE 1 OF SYSTEM WORD CMPB TYPE(R0),#1 ;IS EXIT TYPE VALID? BLT REQA35 ;NO CMPB TYPE(R0),#3 ;MAYBE BGT REQA35 ;NO MOVB LEVEL(R0),R2 ;GET REQUEST PRIORITY LEVEL FOR ;INDEXING QUEUES AND TABLES BEQ R1)(RPETYCH.,13 # B OV M S ARCHP MUAR WO. NET;G) R1N(YOTTH,UCNW # B OV M . =0 T1OI T5 O4OI T R B ) SP-(M,TITI#T V MO ERIM TSEONSPRER TORAPE OUEUE;QP)(S,-5)(RERIMIT V MO USATSTD ARBOEY KTY TET;S 5)(RSRICTT,@R4 VBMO . = 20IITO T BIE BLNA EERADRET PARLE CO,;N R4 C DE ES;Y 20IITO E BN ? ERADRET PTY TOMFRT PUINS ;I 3)(R0,0040#0 T BI S IT BLEABENR RDT P &NT IRDOAYBKED SSREDD AERADHET GE; 1 ,R0)(RERADHE V MO SKFT EXND IRDWOO NT IKEMA; R0 L AS SKFT S.YE; 10KEFT I BH SKFT R BEUM NALEG LSTGEAR L >K#AS THE TIS; KSAS,TR0 PBCM SKFT C ND.E: 20KZFT SKFT E ON DDYEALR A -KSECCHD UNRO AMPJU; 30KZFT BR SKFT T. IEDNEI S AELEV LTYRIIOPRT GE; 2 ,RR4 ! .ENDC ABRT .ENDC ABRT .IFGE $ABMES-1 ; ABRT ABMTAB: .WORD ABMES1 ; TABLE OF ADDRESS OF ABORT MESS. BUFFERABRT .IFGE $ABMES-2 ; ABRT .WORD ABMES2 ; ABRT .IFGE $ABMES-3 ; "EQA05 ;IT IS A NORMAL REQUEST CMP R2,#1 ;IS IT A PRIORITY REQUEST BNE REQA40 ;NO, INVALID LEVEL REQA05 = . CLRB SYSTEM(R0) ;ZERO TASK NO. IF SYSTEM IS CALLER MOV ACTIVE,R3 ;GET CURRENT ACTIVE TASK HEADER ADDRESS BEQ REQA10 ;WHEN ACTIVE IS ZERO, NO TASK IS ACTIVE CLR R4 BISB TASKNO(R3),R4 ;SAVE ACTIVE TASK NO. IN BYTE 0, MOVB R4,SYSTEM(R0) ;SYSTEM OA;L 4 ,R01#1 V MO EDARLE CSR COF" IT BNEDO "ATTHE URNS;I R4),R5R(DBTI@T VBMO HOECL MAOR NOR FPETYR HA CET;S ) R1E(YPHT,C#1 VBMO CHITSWT OUUB RST 1ARLE;C 1)(RROSTFR RBCL G LA FEDEDCEEXR HA CAX MARLE;C ) R1H(XCMA RBCL ERNTOU CARCHE IZALTINI;I ) R3T(CNCH R CL SSREDD AERFFBUA AT DRSSE UET;G 3 ,R0)(RTADA V MO S ESDRADT IS LUTNP INTREUR CET;G 0 ,R5)(RADSTIL V MO . =0 I1OI TN URET;RVBMO SKFTOMRPM RO FITD EE N IAS. DD AERADHET GE; 1 ,RR3 V MO SKFT . ONY RRCA L.AL COMRPDQA T NO; 20KZFT L BP SKFT ; AYRLOV Z FN.I SKFT . ALEGLL I. =0R BEUM NSKTA; 10KEFT Q BE SKFT C ND.E SKFT N)IG SEDNE- . ER VAYRLVE(O# SKTAT GE; R0),SPK(ASFT V MO SKFT % ABRT .WORD ABMES3 ; ABRT .IFGE $ABMES-4 ; ABRT .WORD ABMES4 ; ABRT .IFGE $ABMES-5 ; ABRT .WORD ABMES5 ; ABRT .ENDC ABRT &WORD OF LIST INCB IOSTAT(R4) ;INCREMENT TASK I/O STATUS IN TASK TABLE REQA10 = . MOV R1,R3 ;MAKE A UNIT/LEVEL INDEX TO TABLES; I.E. ASL R3 ; INDEX = (2 * UNIT NO.) + LEVEL MOV R3,R5 ; R5 = 2*UNIT ADD R2,R3 ; R3 = 2*UNIT + LEVEL CLR ERROR(R0) ;NO LIST ERRORS, SO INIT ERROR WORD TO ;CODE FOR NO ERRORS RTS PC 2)(R P JM . =0 O5OI T CKTA SFF ODECOR ROERP PO ; )+SP ( ST T E IMQTC, P SR J T UPRRTEINR TEINPRY TTE BLNA;E) R5R(CSTO@T0,10 # B IS B . =5 O4OI T) SP-(M,TITO#T V MO ITUNR FOR METIT PUUT OUEUE Q ;P)(S,-5)(RERIMOT V MO G MSF OARCHT 1ST PUUT;O 5)(RBRODTT,@R4 VBMO . = 42IOTO ES;Y) R1E(YPHT,C0.#1 VBMO O ;N 42IOTO E BN R C AITS ;I CR,#R4 PBCM ; AYRLOV Z FN.I SKFT C ND.E SKFT ) ONSIER VLYONE OR(CR BEUM NSKTAT GE; R0),SPK(ASFT SBBI SKFT ADLOE YT BOR FR0R EACL; R0 R CL SKFT ; AYRLOV FZ.I SKFT ERSTGIRER ROERR EACL; R5 R CL SKFT K ACSTF OOP TONS PVESA; P)(S,-PS@# VBMO ) .ENDC ABRT .ENDC ABRT .ENDC ABRT .ENDC ABRT .ENDC ABRT .PAGE FTSK ;************************************************ ;RETURN WITH ; R0 = LIST ADDRESS ; R1 = TTY UNIT NO. ; R2 = PRIORITY LEVEL OF REQUEST ; R3 = UNIT*2 + LEVEL ; R5 = UNIT*2 REQA15 = . INC (R0) ;RESTORE THREAD WORD MOVB (SP)+,PS ;RELEASE LOCKOUT MOV #ERRQL,ERROR(R0) ;SET NOT QUEUEABLE ERROR CODE RTS PC SG MOFR HA CST 1ET;G 4 ,R4)(RATGDMS VBMO ERNTOU CARCHE IZALTINI;I ) R4T(CNCH R CL . =0 O4OI TS ESDRADR FEUF BTADAS ERUST GE ; R4),R0A(AT D OV M . = 30IOTO DCEN . 0 O4OI T R B T IS LSTPAR TEINPOE OV;M R4A,AT#D D AD STLIF ONGNIINEG BTOR TEINPOT GE ; R40, R OV M B LSF OFP RIST ; 0 R EC D R FEUF BRSSE UINS ITADA, NO ; 0 O3OI T EQ B R?FEUF BNGKI SKFT ; SKFT S TUTA SORRR ETOX DEINK ACST; 4 + VESA=F RRFE SKFT S),PPCR TEAF (K#AS TTOX DEINK ACST; 4 + VESA=F K ASFT SKFT S ERSTGIREL RANEGEE TH; C ND.E SKFT VESAO TEDUSS RDWOK ACSTF OERMBNU; 2.=1 E AVFS SKFT S AYLW AEG RLL AVESA; HRUS,PR5 R JS SKFT -************************FTSK ; F R E T S K *FTSK ; *FTSK ; PROGRAM IDENTIFICATION: FRETSK *FTSK ; *FTSK ; PURPOSE: THE FUNCTION OF THIS ROUTINE IS TO PLACE EITHER A *FTSK ; QUEUED OR SUSPENDED TASK IN THE QUIESCENT STATE. *FTSK ; . ;RETURN REQA25 = . MOV #ERRLDN,ERROR(R0) ;SET ERROR CODE FOR INVALID ;LOGICAL DEVICE NUMBER RTS PC ;RETURN REQA30 = . MOV #ERRPDT,ERROR(R0) ;SET ERROR CODE FOR PHYSICAL ;DEVICE TYPE ERROR RTS PC ;RETURN REQA35 = . MOV #ERRET,ERROR(R0) ;SET ERROR CODE FOR INVALID EXIT TYPE RTS PC ;RETURN OR WINT IS LIS ; 0 ,R010000 # IT B F BUSG M G IF . S ESDRADT IS LUTTPOUT ENRRCUT GE ; R0),R5D(TALS O OV M T PUUT OOR FPETYR HA CET;S 1)(RPETYCH RBCL . =0 O2OI TS YE ; 0 I1OI T EQ B ? EDATTINI IBEO TUTNP IIS ; ) R1T(PRTY T B ST T CHITSWT OUMETIT 1SR EACL ; ) R1O(TTRS F B LR C 4)(RTRCN,TIMWTTT # B OV M ERIM TITWAT SERE ; R4),R5R(METI W OV M NO ; 0 T1OI T GT B N? OEDRN ; VESARG Z FN.I SKFT C ND.E: 10KZFT SKFTNTOI PRYNT ETECADIINO TIT BGNSIR EACL; P)(S+3 RBCL SKFT ; AYRLOV Z FN.I SKFT D VESAS ERSTGIREF OERMBNUT ULFADE; =0 E AVFS SKFT T INPOY TREN; =. SKETFR SKFT ; 1 *FTSK ; USAGE: THE LINKAGE FOR THIS ROUTINE IS: *FTSK ; *FTSK ; 1). MOV FTASK,-(SP) (ASSEMBLY) *FTSK ; EMT FRETSK *FTSK ; MOV (SP)+,FERR *FTSK ; 2REQA40 = . MOV #ERRLEV,ERROR(R0) ;SET ERROR CODE FOR INVALID LEVEL RTS PC ;RETURN REQA50 = . BIT #040000,PHYDEV(R1) ;DOES ALTERNATE DEVICE EXIST? BEQ REQA25 ;NO MOV ALTDEV(R1),R1 ;GET ALTERNATE DEVICE NO. BR REQA02 ;GO LOOK AT ALTERNATE DEVICE .PAGE ; ; ; QLIST -- SUBROUTINE TO QUEUE TTY REQUEST LIST TO ; THE APPROPRIATE DEVICE/LEVEL QUEUE TUT NI UIS ; 1)(RONTY T B ST T T NI UOR FNTOU CATPERET SE ;1)(RPTORTTS,RYNT # B OV M K ACSTP POD ANS ESDRADN URET RET;G R2+,P)(S V MO . =T NIOI T; EDORSTRET NOD AND SE URE AR43,,RR2 ; O. NITUN2*S INTAON CR5 ; O. NITUNS INTAON CR1 ; SSREDD ASTLIS INTAON CR0 ; ;- -ITEXN PO UNSIOITNDCO ; ; LYULTFECSPRET PUUT OORT PUINR FO1 R O 0NSAINTCOT PRTY T ;S ESDRADT IS LUTNP SKFT C ND.E SKFT NTOI PRYNT ESKETFRR VE OMPJU; 10KZFT BR SKFT. NTOI PRYNT ETECADIINO TIT BGNSIT SE; ) SP3(,+00#2 SBBI SKFT SKETFRO NT INTOI PRYNT E'SOMRP; =. OMRPDQ SKFT ; SKFT S.TUTA SORRR EALRMNOE THS RNTURE' OMRPDQ '. ITEXN OTSINPOY TREN; SKFT O TWE THE ATTIENERFFDIO TEDUSS I5 *FTSK ; 2). CALL FRETSK(FTASK,FERR) (FORTRAN) *FTSK ; *FTSK ; WHERE *FTSK ; FTASK IS THE NUMBER OF THE TASK TO BE FREED. *FTSK ; FERR IS A STATUS VALUE SET BY FRETSK. THE VALUES *FTSK ; ARE: *FTSK ; 6; ; CALLING SEQUENCE -- ; ; JSR PC,QLIST ; ; CONDITIONS UPON ENTRY -- ; ; R0 CONTAINS ADDRESS OF LIST TO BE QUEUED ; R1 CONTAINS UNIT NO. ; R2 CONTAINS LEVEL ; R4 CONTAINS 0 FOR OUTPUT, 2 FOR INPUT REQUEST LISTS ; ; CONDITIONS UPON EXIT -- ; ; R4 CONTAINS 2*(4*UNIT + LEVEL + X) ; WHERE X = 0 FOR OUTPUT ; 2 FOR INPUT ; INTREUR CNSAINTCOD TALS I ; SSREDD ASTLIT PUUT ONTREUR CNSAINTCOD TALS O ;T NI*U 2NSAINTCO5 R ;. NOT NI UHE TNSAINTCO1 R ;K ACSTN OPCE OVABS IPSD ANT OUD KEOC LRE APSRUERNT I ;; --Y TRENN PO UNSIOITNDCO ; ITINTOC, P SR J ;; --E NCUEEQ SNGLIAL C ;; UTTPOUR OUTNP IZELIIAITINO TNETIOUBRSU- -ITINTO ; ;; GEPA . 4 RINX DEINH IT WRNTURE ; C P TS R ISTH T. IRSEACL' SKETFR '. ERMBNU; SKFT SKTAE THG ININTAON CRDWOK ACSTE THN IIT BGNSIE THS ET SM'POQR'D; SKFT L VELEY ITORRI P =R4 ; SKFT S ESDRADR DEEA H =R3 ; SKFT . EDFIDIMOT NOS IT'TATS '. M)PO RBYT SES UEAL(VY TRENN OEDUS; SKFT RE ARSTEISEG RNGWILOOL FHE TENTH, EDAV SRE ARSTEISEG RLL ARYNT EON; SKFT D.SE UISM POQR DENWHD IEIFOD MOT NRE AERADHEM RAOGPRE TH; SKFT9 -1 = DEQUEUED BUT I/O IN PROGRESS *FTSK ; 0 = TASK SET QUIESCENT. *FTSK ; 1 = ILLEGAL TASK NUMBER. *FTSK ; 2 = ILLEGAL TASK STATUS *FTSK ; 3 = TASK ACTIVE. *FTSK ; *FTSK ; REGISTERS: REGISTERS R0-R5 ARE USED BY FRETSK. THE :QLIST = . JSR PC,GETQX ;GET Q TABLE POINTER TO R4 JSR PC,LOCOUT ;LOCKOUT INTERRUPTS MOV R0,@QLAST(R4) ;QUEUE LIST POINTED TO BY R0 MOV R0,QLAST(R4) MOVB (SP)+,PS ;RELEASE LOCKOUT RTS PC ;RETURN .PAGE ; ; ; DQLIST -- SUBROUTINE TO DEQUEUE THE TTY REQUEST LIST ; CURRENTLY ON TOP OF THE APPROPRIATE ; DEVICE/LEVEL QUEUE ; ; CALLIN R TEISEG RRETOES;R R1+,P)(S V MO R4 L AS R41, R DD A 1 ,RR2 D AD X)+ L VELE+ T NI*U(42* ; R1 L AS EXND ICTRUSTON;C R1 L AS ERSTGIREE AV;S P)(S,-R1 V MO . = QXET G; ESEUQUT PUINR FO2 = ;S UEUE QUTTPOUR FO0 = X E ERWH ;) X +ELEV L +ITUN4**((2S LEAB T QTOX DEINS INTAON CR4 ; ;- -ITEXN PO UNSIOITNDCO D ANS TUTA SSKTAE TH D.LEAL COT NISY VLQO D. ADRETHS ROE THM RO FSKTA; SKFTNGCILI SMETIA E OVEM RTOM PO RBYY NL OEDUSS IM'POQR'DT INPOY TRENE TH; SKFT ; SKFT ; AYRLOV Z FN.I SKFT ; SKFT R TEINPOK ACST= <= PC ; SKFT =WILL BE *FTSK ; RESTORED IF THE SYSGEN PARAMETER 'RGSAVE' IS SET *FTSK ; TO A NON-ZERO VALUE. *FTSK ; *FTSK ; PROGRAMMER: 53 *FTSK ; DATE: 18-NOV-71 *FTSK ; REVISION: 0 *FTSK ; CATALOGUE NUMBER>G SEQUENCE -- ; ; JSR PC,DQLIST ; ; CONDITIONS UPON ENTRY -- ; ; R1 CONTAINS UNIT NO. ; R2 CONTAINS LEVEL ; R4 CONTAINS 0 OR 2 FOR OUTPUT OR INPUT REQUEST LISTS, ; RESPECTIVELY ; ; CONDITIONS UPON EXIT -- ; ; R4 CONTAINS 2*(4*UNIT + LEVEL + X) ; WHERE X = 0 FOR OUTPUT ; = 2 FOR INPUT ; DQLIST = . MOV R0,-(S ; ;Y ELIVCTPEES RUTNP IORT PUUT OOR F 2OR0 S INTAON CR4 ; ELEV LNSAINTCO2 R ;. NOT NI UNSAINTCO1 R ;; --Y TRENN PO UNSIOITNDCO ; ;X TQGEC, P SR J ;; --E NCUEEQ SNGLIAL C ;; ESBLTAT ASQLD ANT RSFI Q ; NGXIDEINR FOR TEINPOT UCTRNSCOO TNETIOUBRSU- -QXET G ;; ;E AG.P RNTURE ; C P TS R ERSTGIREE ORSTRE ; 0 ,R)+SP ( OV M T OUCKLOE ASLERE ; R BEUM NSKTA ; SKFT ; SKFT AY WISTHK OO LCKTA SHE TRYNT EON; SKFT ; SKFT C ND.E SKFT ; OMRPDQ EF.D SKFT ; LYOVDQ EF.R SKFT : *FTSK ; *FTSK ;***********************************************************************FTSK .PAGE FTSK .DEF FRETSK ; FTSK .REF PUSHR,POPR ; FTSK .IFNZ OVRLAY ; P) ;SAVE REGISTER JSR PC,GETQX ;GET Q TABLE POINTER TO R4 JSR PC,LOCOUT ;LOCKOUT INTERRUPTS MOV @QFIRST(R4),R0 ;DEQUEUE LIST POINTED TO BY QFIRST MOV #1,@QFIRST(R4) MOV R0,QFIRST(R4) BNE DQLI10 ;WAS IT THE END OF THE THREAD MOV R4,R0 ;YES ADD #QFIRST,R0 ;GET QFIRST TABLE ADDRESS MOV R0,QLAST(R4) DQLI10 = . MOVB (SP)+,PS